ZGlmZiAtLWdpdCBhLy5naXRpZ25vcmUgYi8uZ2l0aWdub3JlCmluZGV4IGUxZDVjMTcuLjllYjRiNzcgMTAwNjQ0Ci0tLSBhLy5naXRpZ25vcmUKKysrIGIvLmdpdGlnbm9yZQpAQCAtMjAsNiArMjAsNyBAQAogIyBUb3AtbGV2ZWwgZ2VuZXJpYyBmaWxlcwogIwogdGFncworVEFHUwogdm1saW51eCoKIFN5c3RlbS5tYXAKIE1vZHVsZS5zeW12ZXJzCmRpZmYgLS1naXQgYS9DUkVESVRTIGIvQ1JFRElUUwppbmRleCA1MzI5ZWFkLi5jY2Q0ZjlmIDEwMDY0NAotLS0gYS9DUkVESVRTCisrKyBiL0NSRURJVFMKQEAgLTQ1LDcgKzQ1LDcgQEAKIFM6IFN5ZG5leSwgQXVzdHJhbGlhCiAKIE46IFRpZ3JhbiBBLiBBaXZhemlhbgotRTogdGlncmFuQHZlcml0YXMuY29tCitFOiB0aWdyYW5AYWl2YXppYW4uZnNuZXQuY28udWsKIFc6IGh0dHA6Ly93d3cubW9zZXMudWtsaW51eC5uZXQvcGF0Y2hlcwogRDogQkZTIGZpbGVzeXN0ZW0KIEQ6IEludGVsIElBMzIgQ1BVIG1pY3JvY29kZSB1cGRhdGUgc3VwcG9ydApAQCAtMzUxMSwxNCArMzUxMSwxMiBAQAogCiBOOiBEYXZpZCBXZWluZWhhbGwKIEU6IHRhb0BhY2MudW11LnNlCitQOiAxMDI0RC9EQzQ3Q0ExNiA3QUNFIDBGQjAgN0E3NCBGOTk0IDlCMzYgIEUxRDEgRDE0RSA4NTI2IERDNDcgQ0ExNgogVzogaHR0cDovL3d3dy5hY2MudW11LnNlL350YW8vCi1XOiBodHRwOi8vd3d3LmFjYy51bXUuc2Uvfm1jYWxpbnV4LworRDogdjIuMCBrZXJuZWwgbWFpbnRhaW5lcgogRDogRml4ZXMgZm9yIHRoZSBORS8yLWRyaXZlcgogRDogTWlzY2VsbGFuZW91cyBNQ0Etc3VwcG9ydAogRDogQ2xlYW51cCBvZiB0aGUgQ29uZmlnLWZpbGVzCi1TOiBBeHRvcnBzdmFnZW4gNDA6MjAKLVM6IFMtOTAzIDM3ICBVTUVBCi1TOiBTd2VkZW4KIAogTjogTWF0dCBXZWxzaAogRTogbWR3QG1ldGFsYWIudW5jLmVkdQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9BQkkvdGVzdGluZy9zeXNmcy1wb3dlciBiL0RvY3VtZW50YXRpb24vQUJJL3Rlc3Rpbmcvc3lzZnMtcG93ZXIKaW5kZXggZDg4MmY4MC4uZGNmZjRkMCAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9BQkkvdGVzdGluZy9zeXNmcy1wb3dlcgorKysgYi9Eb2N1bWVudGF0aW9uL0FCSS90ZXN0aW5nL3N5c2ZzLXBvd2VyCkBAIC0yMSw3ICsyMSw3IEBACiAJCXRoZXNlIHN0YXRlcy4KIAogV2hhdDoJCS9zeXMvcG93ZXIvZGlzawotRGF0ZToJCUF1Z3VzdCAyMDA2CitEYXRlOgkJU2VwdGVtYmVyIDIwMDYKIENvbnRhY3Q6CVJhZmFlbCBKLiBXeXNvY2tpIDxyandAc2lzay5wbD4KIERlc2NyaXB0aW9uOgogCQlUaGUgL3N5cy9wb3dlci9kaXNrIGZpbGUgY29udHJvbHMgdGhlIG9wZXJhdGluZyBtb2RlIG9mIHRoZQpAQCAtMzksNiArMzksMTkgQEAKIAkJJ3JlYm9vdCcgLSB0aGUgbWVtb3J5IGltYWdlIHdpbGwgYmUgc2F2ZWQgYnkgdGhlIGtlcm5lbCBhbmQKIAkJdGhlIHN5c3RlbSB3aWxsIGJlIHJlYm9vdGVkLgogCisJCUFkZGl0aW9uYWxseSwgL3N5cy9wb3dlci9kaXNrIGNhbiBiZSB1c2VkIHRvIHR1cm4gb24gb25lIG9mIHRoZQorCQl0d28gdGVzdGluZyBtb2RlcyBvZiB0aGUgc3VzcGVuZC10by1kaXNrIG1lY2hhbmlzbTogJ3Rlc3Rwcm9jJworCQlvciAndGVzdCcuICBJZiB0aGUgc3VzcGVuZC10by1kaXNrIG1lY2hhbmlzbSBpcyBpbiB0aGUKKwkJJ3Rlc3Rwcm9jJyBtb2RlLCB3cml0aW5nICdkaXNrJyB0byAvc3lzL3Bvd2VyL3N0YXRlIHdpbGwgY2F1c2UKKwkJdGhlIGtlcm5lbCB0byBkaXNhYmxlIG5vbmJvb3QgQ1BVcyBhbmQgZnJlZXplIHRhc2tzLCB3YWl0IGZvciA1CisJCXNlY29uZHMsIHVuZnJlZXplIHRhc2tzIGFuZCBlbmFibGUgbm9uYm9vdCBDUFVzLiAgSWYgaXQgaXMgaW4KKwkJdGhlICd0ZXN0JyBtb2RlLCB3cml0aW5nICdkaXNrJyB0byAvc3lzL3Bvd2VyL3N0YXRlIHdpbGwgY2F1c2UKKwkJdGhlIGtlcm5lbCB0byBkaXNhYmxlIG5vbmJvb3QgQ1BVcyBhbmQgZnJlZXplIHRhc2tzLCBzaHJpbmsKKwkJbWVtb3J5LCBzdXNwZW5kIGRldmljZXMsIHdhaXQgZm9yIDUgc2Vjb25kcywgcmVzdW1lIGRldmljZXMsCisJCXVuZnJlZXplIHRhc2tzIGFuZCBlbmFibGUgbm9uYm9vdCBDUFVzLiAgVGhlbiwgd2UgYXJlIGFibGUgdG8KKwkJbG9vayBpbiB0aGUgbG9nIG1lc3NhZ2VzIGFuZCB3b3JrIG91dCwgZm9yIGV4YW1wbGUsIHdoaWNoIGNvZGUKKwkJaXMgYmVpbmcgc2xvdyBhbmQgd2hpY2ggZGV2aWNlIGRyaXZlcnMgYXJlIG1pc2JlaGF2aW5nLgorCiAJCVRoZSBzdXNwZW5kLXRvLWRpc2sgbWV0aG9kIG1heSBiZSBjaG9zZW4gYnkgd3JpdGluZyB0byB0aGlzCiAJCWZpbGUgb25lIG9mIHRoZSBhY2NlcHRlZCBzdHJpbmdzOgogCkBAIC00Niw2ICs1OSw4IEBACiAJCSdwbGF0Zm9ybScKIAkJJ3NodXRkb3duJwogCQkncmVib290JworCQkndGVzdHByb2MnCisJCSd0ZXN0JwogCiAJCUl0IHdpbGwgb25seSBjaGFuZ2UgdG8gJ2Zpcm13YXJlJyBvciAncGxhdGZvcm0nIGlmIHRoZSBzeXN0ZW0KIAkJc3VwcG9ydHMgdGhhdC4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vRG9jQm9vay9NYWtlZmlsZSBiL0RvY3VtZW50YXRpb24vRG9jQm9vay9NYWtlZmlsZQppbmRleCA2NmUxY2Y3Li5kYjk0OTlhIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svTWFrZWZpbGUKKysrIGIvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL01ha2VmaWxlCkBAIC05LDcgKzksNyBAQAogRE9DQk9PS1MgOj0gd2FuYm9vay54bWwgejg1MzBib29rLnhtbCBtY2Fib29rLnhtbCB2aWRlb2Jvb2sueG1sIFwKIAkgICAga2VybmVsLWhhY2tpbmcueG1sIGtlcm5lbC1sb2NraW5nLnhtbCBkZXZpY2Vpb2Jvb2sueG1sIFwKIAkgICAgcHJvY2ZzLWd1aWRlLnhtbCB3cml0aW5nX3VzYl9kcml2ZXIueG1sIFwKLQkgICAga2VybmVsLWFwaS54bWwgam91cm5hbC1hcGkueG1sIGxzbS54bWwgdXNiLnhtbCBcCisJICAgIGtlcm5lbC1hcGkueG1sIGZpbGVzeXN0ZW1zLnhtbCBsc20ueG1sIHVzYi54bWwgXAogCSAgICBnYWRnZXQueG1sIGxpYmF0YS54bWwgbXRkbmFuZC54bWwgbGlicnMueG1sIHJhcGlkaW8ueG1sIFwKIAkgICAgZ2VuZXJpY2lycS54bWwKIApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL2pvdXJuYWwtYXBpLnRtcGwgYi9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svZmlsZXN5c3RlbXMudG1wbApzaW1pbGFyaXR5IGluZGV4IDc4JQpyZW5hbWUgZnJvbSBEb2N1bWVudGF0aW9uL0RvY0Jvb2svam91cm5hbC1hcGkudG1wbApyZW5hbWUgdG8gRG9jdW1lbnRhdGlvbi9Eb2NCb29rL2ZpbGVzeXN0ZW1zLnRtcGwKaW5kZXggMjA3N2Y5YS4uMzlmYTJhYiAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL2pvdXJuYWwtYXBpLnRtcGwKKysrIGIvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL2ZpbGVzeXN0ZW1zLnRtcGwKQEAgLTIsOSArMiwxMDYgQEAKIDwhRE9DVFlQRSBib29rIFBVQkxJQyAiLS8vT0FTSVMvL0RURCBEb2NCb29rIFhNTCBWNC4xLjIvL0VOIgogCSJodHRwOi8vd3d3Lm9hc2lzLW9wZW4ub3JnL2RvY2Jvb2sveG1sLzQuMS4yL2RvY2Jvb2t4LmR0ZCIgW10+CiAKLTxib29rIGlkPSJMaW51eEpCREFQSSI+Cis8Ym9vayBpZD0iTGludXgtZmlsZXN5c3RlbXMtQVBJIj4KICA8Ym9va2luZm8+CisgIDx0aXRsZT5MaW51eCBGaWxlc3lzdGVtcyBBUEk8L3RpdGxlPgorCisgIDxsZWdhbG5vdGljZT4KKyAgIDxwYXJhPgorICAgICBUaGlzIGRvY3VtZW50YXRpb24gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUKKyAgICAgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgICAgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgorICAgICB2ZXJzaW9uLgorICAgPC9wYXJhPgorCisgICA8cGFyYT4KKyAgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZQorICAgICB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkCisgICAgIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKyAgICAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICAgPC9wYXJhPgorCisgICA8cGFyYT4KKyAgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAgICAgTUEgMDIxMTEtMTMwNyBVU0EKKyAgIDwvcGFyYT4KKworICAgPHBhcmE+CisgICAgIEZvciBtb3JlIGRldGFpbHMgc2VlIHRoZSBmaWxlIENPUFlJTkcgaW4gdGhlIHNvdXJjZQorICAgICBkaXN0cmlidXRpb24gb2YgTGludXguCisgICA8L3BhcmE+CisgIDwvbGVnYWxub3RpY2U+CisgPC9ib29raW5mbz4KKworPHRvYz48L3RvYz4KKworICA8Y2hhcHRlciBpZD0idmZzIj4KKyAgICAgPHRpdGxlPlRoZSBMaW51eCBWRlM8L3RpdGxlPgorICAgICA8c2VjdDE+PHRpdGxlPlRoZSBGaWxlc3lzdGVtIHR5cGVzPC90aXRsZT4KKyFJaW5jbHVkZS9saW51eC9mcy5oCisgICAgIDwvc2VjdDE+CisgICAgIDxzZWN0MT48dGl0bGU+VGhlIERpcmVjdG9yeSBDYWNoZTwvdGl0bGU+CishRWZzL2RjYWNoZS5jCishSWluY2x1ZGUvbGludXgvZGNhY2hlLmgKKyAgICAgPC9zZWN0MT4KKyAgICAgPHNlY3QxPjx0aXRsZT5Jbm9kZSBIYW5kbGluZzwvdGl0bGU+CishRWZzL2lub2RlLmMKKyFFZnMvYmFkX2lub2RlLmMKKyAgICAgPC9zZWN0MT4KKyAgICAgPHNlY3QxPjx0aXRsZT5SZWdpc3RyYXRpb24gYW5kIFN1cGVyYmxvY2tzPC90aXRsZT4KKyFFZnMvc3VwZXIuYworICAgICA8L3NlY3QxPgorICAgICA8c2VjdDE+PHRpdGxlPkZpbGUgTG9ja3M8L3RpdGxlPgorIUVmcy9sb2Nrcy5jCishSWZzL2xvY2tzLmMKKyAgICAgPC9zZWN0MT4KKyAgICAgPHNlY3QxPjx0aXRsZT5PdGhlciBGdW5jdGlvbnM8L3RpdGxlPgorIUVmcy9tcGFnZS5jCishRWZzL25hbWVpLmMKKyFFZnMvYnVmZmVyLmMKKyFFZnMvYmlvLmMKKyFFZnMvc2VxX2ZpbGUuYworIUVmcy9maWxlc3lzdGVtcy5jCishRWZzL2ZzLXdyaXRlYmFjay5jCishRWZzL2Jsb2NrX2Rldi5jCisgICAgIDwvc2VjdDE+CisgIDwvY2hhcHRlcj4KKworICA8Y2hhcHRlciBpZD0icHJvYyI+CisgICAgIDx0aXRsZT5UaGUgcHJvYyBmaWxlc3lzdGVtPC90aXRsZT4KKworICAgICA8c2VjdDE+PHRpdGxlPnN5c2N0bCBpbnRlcmZhY2U8L3RpdGxlPgorIUVrZXJuZWwvc3lzY3RsLmMKKyAgICAgPC9zZWN0MT4KKworICAgICA8c2VjdDE+PHRpdGxlPnByb2MgZmlsZXN5c3RlbSBpbnRlcmZhY2U8L3RpdGxlPgorIUlmcy9wcm9jL2Jhc2UuYworICAgICA8L3NlY3QxPgorICA8L2NoYXB0ZXI+CisKKyAgPGNoYXB0ZXIgaWQ9InN5c2ZzIj4KKyAgICAgPHRpdGxlPlRoZSBGaWxlc3lzdGVtIGZvciBFeHBvcnRpbmcgS2VybmVsIE9iamVjdHM8L3RpdGxlPgorIUVmcy9zeXNmcy9maWxlLmMKKyFFZnMvc3lzZnMvc3ltbGluay5jCishRWZzL3N5c2ZzL2Jpbi5jCisgIDwvY2hhcHRlcj4KKworICA8Y2hhcHRlciBpZD0iZGVidWdmcyI+CisgICAgIDx0aXRsZT5UaGUgZGVidWdmcyBmaWxlc3lzdGVtPC90aXRsZT4KKworICAgICA8c2VjdDE+PHRpdGxlPmRlYnVnZnMgaW50ZXJmYWNlPC90aXRsZT4KKyFFZnMvZGVidWdmcy9pbm9kZS5jCishRWZzL2RlYnVnZnMvZmlsZS5jCisgICAgIDwvc2VjdDE+CisgIDwvY2hhcHRlcj4KKworICA8Y2hhcHRlciBpZD0iTGludXhKREJBUEkiPgorICA8Y2hhcHRlcmluZm8+CiAgIDx0aXRsZT5UaGUgTGludXggSm91cm5hbGxpbmcgQVBJPC90aXRsZT4KKwogICA8YXV0aG9yZ3JvdXA+CiAgIDxhdXRob3I+CiAgICAgIDxmaXJzdG5hbWU+Um9nZXI8L2ZpcnN0bmFtZT4KQEAgLTE0LDkgKzExMSw5IEBACiAgICAgICA8ZW1haWw+cmdhbW1hbnNAY29tcHV0ZXItc3VyZ2VyeS5jby51azwvZW1haWw+CiAgICAgIDwvYWRkcmVzcz4KICAgICA8L2FmZmlsaWF0aW9uPgotICAgICA8L2F1dGhvcj4gCisgICAgIDwvYXV0aG9yPgogICA8L2F1dGhvcmdyb3VwPgotICAKKwogICA8YXV0aG9yZ3JvdXA+CiAgICA8YXV0aG9yPgogICAgIDxmaXJzdG5hbWU+U3RlcGhlbjwvZmlyc3RuYW1lPgpAQCAtMzMsNTAgKzEzMCwyMSBAQAogICAgPHllYXI+MjAwMjwveWVhcj4KICAgIDxob2xkZXI+Um9nZXIgR2FtbWFuczwvaG9sZGVyPgogICA8L2NvcHlyaWdodD4KKyAgPC9jaGFwdGVyaW5mbz4KIAotPGxlZ2Fsbm90aWNlPgotICAgPHBhcmE+Ci0gICAgIFRoaXMgZG9jdW1lbnRhdGlvbiBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZQotICAgICBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCi0gICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgotICAgICB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyCi0gICAgIHZlcnNpb24uCi0gICA8L3BhcmE+Ci0gICAgICAKLSAgIDxwYXJhPgotICAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlCi0gICAgIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQKLSAgICAgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgotICAgICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gICA8L3BhcmE+Ci0gICAgICAKLSAgIDxwYXJhPgotICAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKLSAgICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQotICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAotICAgICBNQSAwMjExMS0xMzA3IFVTQQotICAgPC9wYXJhPgotICAgICAgCi0gICA8cGFyYT4KLSAgICAgRm9yIG1vcmUgZGV0YWlscyBzZWUgdGhlIGZpbGUgQ09QWUlORyBpbiB0aGUgc291cmNlCi0gICAgIGRpc3RyaWJ1dGlvbiBvZiBMaW51eC4KLSAgIDwvcGFyYT4KLSAgPC9sZWdhbG5vdGljZT4KLSA8L2Jvb2tpbmZvPgorICA8dGl0bGU+VGhlIExpbnV4IEpvdXJuYWxsaW5nIEFQSTwvdGl0bGU+CiAKLTx0b2M+PC90b2M+Ci0KLSAgPGNoYXB0ZXIgaWQ9Ik92ZXJ2aWV3Ij4KKyAgICA8c2VjdDE+CiAgICAgIDx0aXRsZT5PdmVydmlldzwvdGl0bGU+Ci0gIDxzZWN0MT4KKyAgICA8c2VjdDI+CiAgICAgIDx0aXRsZT5EZXRhaWxzPC90aXRsZT4KIDxwYXJhPgotVGhlIGpvdXJuYWxsaW5nIGxheWVyIGlzICBlYXN5IHRvIHVzZS4gWW91IG5lZWQgdG8gCitUaGUgam91cm5hbGxpbmcgbGF5ZXIgaXMgIGVhc3kgdG8gdXNlLiBZb3UgbmVlZCB0bwogZmlyc3Qgb2YgYWxsIGNyZWF0ZSBhIGpvdXJuYWxfdCBkYXRhIHN0cnVjdHVyZS4gVGhlcmUgYXJlCiB0d28gY2FsbHMgdG8gZG8gdGhpcyBkZXBlbmRlbnQgb24gaG93IHlvdSBkZWNpZGUgdG8gYWxsb2NhdGUgdGhlIHBoeXNpY2FsCi1tZWRpYSBvbiB3aGljaCB0aGUgam91cm5hbCByZXNpZGVzLiBUaGUgam91cm5hbF9pbml0X2lub2RlKCkgY2FsbCAKK21lZGlhIG9uIHdoaWNoIHRoZSBqb3VybmFsIHJlc2lkZXMuIFRoZSBqb3VybmFsX2luaXRfaW5vZGUoKSBjYWxsCiBpcyBmb3Igam91cm5hbHMgc3RvcmVkIGluIGZpbGVzeXN0ZW0gaW5vZGVzLCBvciB0aGUgam91cm5hbF9pbml0X2RldigpCi1jYWxsIGNhbiBiZSB1c2UgZm9yIGpvdXJuYWwgc3RvcmVkIG9uIGEgcmF3IGRldmljZSAoaW4gYSBjb250aW51b3VzIHJhbmdlIAorY2FsbCBjYW4gYmUgdXNlIGZvciBqb3VybmFsIHN0b3JlZCBvbiBhIHJhdyBkZXZpY2UgKGluIGEgY29udGludW91cyByYW5nZQogb2YgYmxvY2tzKS4gQSBqb3VybmFsX3QgaXMgYSB0eXBlZGVmIGZvciBhIHN0cnVjdCBwb2ludGVyLCBzbyB3aGVuCiB5b3UgYXJlIGZpbmFsbHkgZmluaXNoZWQgbWFrZSBzdXJlIHlvdSBjYWxsIGpvdXJuYWxfZGVzdHJveSgpIG9uIGl0CiB0byBmcmVlIHVwIGFueSB1c2VkIGtlcm5lbCBtZW1vcnkuCkBAIC05MSwyNyArMTU5LDI2IEBACiA8cGFyYT4KIE1vc3Qgb2YgdGhlIHRpbWUgaG93ZXZlciB5b3VyIGpvdXJuYWwgZmlsZSB3aWxsIGFscmVhZHkgaGF2ZSBiZWVuIGNyZWF0ZWQsIGJ1dAogYmVmb3JlIHlvdSBsb2FkIGl0IHlvdSBtdXN0IGNhbGwgam91cm5hbF93aXBlKCkgdG8gZW1wdHkgdGhlIGpvdXJuYWwgZmlsZS4KLUhhbmcgb24sIHlvdSBzYXkgLCB3aGF0IGlmIHRoZSBmaWxlc3lzdGVtIHdhc24ndCBjbGVhbmx5IHVtb3VudCgpJ2QgLiBXZWxsLCBpdCBpcyB0aGUgCitIYW5nIG9uLCB5b3Ugc2F5ICwgd2hhdCBpZiB0aGUgZmlsZXN5c3RlbSB3YXNuJ3QgY2xlYW5seSB1bW91bnQoKSdkIC4gV2VsbCwgaXQgaXMgdGhlCiBqb2Igb2YgdGhlIGNsaWVudCBmaWxlIHN5c3RlbSB0byBkZXRlY3QgdGhpcyBhbmQgc2tpcCB0aGUgY2FsbCB0byBqb3VybmFsX3dpcGUoKS4KIDwvcGFyYT4KIAogPHBhcmE+CiBJbiBlaXRoZXIgY2FzZSB0aGUgbmV4dCBjYWxsIHNob3VsZCBiZSB0byBqb3VybmFsX2xvYWQoKSB3aGljaCBwcmVwYXJlcyB0aGUKLWpvdXJuYWwgZmlsZSBmb3IgdXNlLiBOb3RlIHRoYXQgam91cm5hbF93aXBlKC4uLDApIGNhbGxzIGpvdXJuYWxfc2tpcF9yZWNvdmVyeSgpIAoram91cm5hbCBmaWxlIGZvciB1c2UuIE5vdGUgdGhhdCBqb3VybmFsX3dpcGUoLi4sMCkgY2FsbHMgam91cm5hbF9za2lwX3JlY292ZXJ5KCkKIGZvciB5b3UgaWYgaXQgZGV0ZWN0cyBhbnkgb3V0c3RhbmRpbmcgdHJhbnNhY3Rpb25zIGluIHRoZSBqb3VybmFsIGFuZCBzaW1pbGFybHkKIGpvdXJuYWxfbG9hZCgpIHdpbGwgY2FsbCBqb3VybmFsX3JlY292ZXIoKSBpZiBuZWNlc3NhcnkuCiBJIHdvdWxkIGFkdmlzZSByZWFkaW5nIGZzL2V4dDMvc3VwZXIuYyBmb3IgZXhhbXBsZXMgb24gdGhpcyBzdGFnZS4KLVtSR0c6IFdoeSBpcyB0aGUgam91cm5hbF93aXBlKCkgY2FsbCBuZWNlc3NhcnkgLSBkb2Vzbid0IHRoaXMgbmVlZGxlc3NseSAKLWNvbXBsaWNhdGUgdGhlIEFQSS4gT3IgaXNuJ3QgYSBnb29kIGlkZWEgZm9yIHRoZSBqb3VybmFsIGxheWVyIHRvIGhpZGUgCitbUkdHOiBXaHkgaXMgdGhlIGpvdXJuYWxfd2lwZSgpIGNhbGwgbmVjZXNzYXJ5IC0gZG9lc24ndCB0aGlzIG5lZWRsZXNzbHkKK2NvbXBsaWNhdGUgdGhlIEFQSS4gT3IgaXNuJ3QgYSBnb29kIGlkZWEgZm9yIHRoZSBqb3VybmFsIGxheWVyIHRvIGhpZGUKIGRpcnR5IG1vdW50cyBmcm9tIHRoZSBjbGllbnQgZnNdCiA8L3BhcmE+CiAKIDxwYXJhPgotTm93IHlvdSBjYW4gZ28gYWhlYWQgYW5kIHN0YXJ0IG1vZGlmeWluZyB0aGUgdW5kZXJseWluZyAKK05vdyB5b3UgY2FuIGdvIGFoZWFkIGFuZCBzdGFydCBtb2RpZnlpbmcgdGhlIHVuZGVybHlpbmcKIGZpbGVzeXN0ZW0uIEFsbW9zdC4KIDwvcGFyYT4KIAotCiA8cGFyYT4KIAogWW91IHN0aWxsIG5lZWQgdG8gYWN0dWFsbHkgam91cm5hbCB5b3VyIGZpbGVzeXN0ZW0gY2hhbmdlcywgdGhpcwpAQCAtMTM4LDEwICsyMDUsMTAgQEAKIG5lZWQgdG8gY2FsbCBqb3VybmFsX2dldF97Y3JlYXRlLHdyaXRlLHVuZG99X2FjY2VzcygpIGFzIGFwcHJvcHJpYXRlLAogdGhpcyBhbGxvd3MgdGhlIGpvdXJuYWxsaW5nIGxheWVyIHRvIGNvcHkgdGhlIHVubW9kaWZpZWQgZGF0YSBpZiBpdAogbmVlZHMgdG8uIEFmdGVyIGFsbCB0aGUgYnVmZmVyIG1heSBiZSBwYXJ0IG9mIGEgcHJldmlvdXNseSB1bmNvbW1pdHRlZAotdHJhbnNhY3Rpb24uIAordHJhbnNhY3Rpb24uCiBBdCB0aGlzIHBvaW50IHlvdSBhcmUgYXQgbGFzdCByZWFkeSB0byBtb2RpZnkgYSBidWZmZXIsIGFuZCBvbmNlCiB5b3UgYXJlIGhhdmUgZG9uZSBzbyB5b3UgbmVlZCB0byBjYWxsIGpvdXJuYWxfZGlydHlfe21ldGEsfWRhdGEoKS4KLU9yIGlmIHlvdSd2ZSBhc2tlZCBmb3IgYWNjZXNzIHRvIGEgYnVmZmVyIHlvdSBub3cga25vdyBpcyBub3cgbG9uZ2VyIAorT3IgaWYgeW91J3ZlIGFza2VkIGZvciBhY2Nlc3MgdG8gYSBidWZmZXIgeW91IG5vdyBrbm93IGlzIG5vdyBsb25nZXIKIHJlcXVpcmVkIHRvIGJlIHB1c2hlZCBiYWNrIG9uIHRoZSBkZXZpY2UgeW91IGNhbiBjYWxsIGpvdXJuYWxfZm9yZ2V0KCkKIGluIG11Y2ggdGhlIHNhbWUgd2F5IGFzIHlvdSBtaWdodCBoYXZlIHVzZWQgYmZvcmdldCgpIGluIHRoZSBwYXN0LgogPC9wYXJhPgpAQCAtMTU2LDcgKzIyMyw2IEBACiB5b3UgY2FuIHRoZW4gY2FsbCBqb3VybmFsX2Rlc3Ryb3koKSB0byBjbGVhbiB1cCB5b3VyIGluLWNvcmUgam91cm5hbCBvYmplY3QuCiA8L3BhcmE+CiAKLQogPHBhcmE+CiBVbmZvcnR1bmF0ZWx5IHRoZXJlIGEgY291cGxlIG9mIHdheXMgdGhlIGpvdXJuYWwgbGF5ZXIgY2FuIGNhdXNlIGEgZGVhZGxvY2suCiBUaGUgZmlyc3QgdGhpbmcgdG8gbm90ZSBpcyB0aGF0IGVhY2ggdGFzayBjYW4gb25seSBoYXZlCkBAIC0xNjQsMTkgKzIzMCwxOSBAQAogY29tbWl0cyB1bnRpbCB0aGUgb3V0ZXJtb3N0IGpvdXJuYWxfc3RvcCgpLiBUaGlzIG1lYW5zCiB5b3UgbXVzdCBjb21wbGV0ZSB0aGUgdHJhbnNhY3Rpb24gYXQgdGhlIGVuZCBvZiBlYWNoIGZpbGUvaW5vZGUvYWRkcmVzcwogZXRjLiBvcGVyYXRpb24geW91IHBlcmZvcm0sIHNvIHRoYXQgdGhlIGpvdXJuYWxsaW5nIHN5c3RlbSBpc24ndCByZS1lbnRlcmVkCi1vbiBhbm90aGVyIGpvdXJuYWwuIFNpbmNlIHRyYW5zYWN0aW9ucyBjYW4ndCBiZSBuZXN0ZWQvYmF0Y2hlZCAKK29uIGFub3RoZXIgam91cm5hbC4gU2luY2UgdHJhbnNhY3Rpb25zIGNhbid0IGJlIG5lc3RlZC9iYXRjaGVkCiBhY3Jvc3MgZGlmZmVyaW5nIGpvdXJuYWxzLCBhbmQgYW5vdGhlciBmaWxlc3lzdGVtIG90aGVyIHRoYW4KIHlvdXJzIChzYXkgZXh0MykgbWF5IGJlIG1vZGlmaWVkIGluIGEgbGF0ZXIgc3lzY2FsbC4KIDwvcGFyYT4KIAogPHBhcmE+Ci1UaGUgc2Vjb25kIGNhc2UgdG8gYmVhciBpbiBtaW5kIGlzIHRoYXQgam91cm5hbF9zdGFydCgpIGNhbiAKLWJsb2NrIGlmIHRoZXJlIGlzbid0IGVub3VnaCBzcGFjZSBpbiB0aGUgam91cm5hbCBmb3IgeW91ciB0cmFuc2FjdGlvbiAKK1RoZSBzZWNvbmQgY2FzZSB0byBiZWFyIGluIG1pbmQgaXMgdGhhdCBqb3VybmFsX3N0YXJ0KCkgY2FuCitibG9jayBpZiB0aGVyZSBpc24ndCBlbm91Z2ggc3BhY2UgaW4gdGhlIGpvdXJuYWwgZm9yIHlvdXIgdHJhbnNhY3Rpb24KIChiYXNlZCBvbiB0aGUgcGFzc2VkIG5ibG9ja3MgcGFyYW0pIC0gd2hlbiBpdCBibG9ja3MgaXQgbWVyZWx5KCEpIG5lZWRzIHRvCi13YWl0IGZvciB0cmFuc2FjdGlvbnMgdG8gY29tcGxldGUgYW5kIGJlIGNvbW1pdHRlZCBmcm9tIG90aGVyIHRhc2tzLCAKLXNvIGVzc2VudGlhbGx5IHdlIGFyZSB3YWl0aW5nIGZvciBqb3VybmFsX3N0b3AoKS4gU28gdG8gYXZvaWQgCit3YWl0IGZvciB0cmFuc2FjdGlvbnMgdG8gY29tcGxldGUgYW5kIGJlIGNvbW1pdHRlZCBmcm9tIG90aGVyIHRhc2tzLAorc28gZXNzZW50aWFsbHkgd2UgYXJlIHdhaXRpbmcgZm9yIGpvdXJuYWxfc3RvcCgpLiBTbyB0byBhdm9pZAogZGVhZGxvY2tzIHlvdSBtdXN0IHRyZWF0IGpvdXJuYWxfc3RhcnQvc3RvcCgpIGFzIGlmIHRoZXkKLXdlcmUgc2VtYXBob3JlcyBhbmQgaW5jbHVkZSB0aGVtIGluIHlvdXIgc2VtYXBob3JlIG9yZGVyaW5nIHJ1bGVzIHRvIHByZXZlbnQgCit3ZXJlIHNlbWFwaG9yZXMgYW5kIGluY2x1ZGUgdGhlbSBpbiB5b3VyIHNlbWFwaG9yZSBvcmRlcmluZyBydWxlcyB0byBwcmV2ZW50CiBkZWFkbG9ja3MuIE5vdGUgdGhhdCBqb3VybmFsX2V4dGVuZCgpIGhhcyBzaW1pbGFyIGJsb2NraW5nIGJlaGF2aW91ciB0bwogam91cm5hbF9zdGFydCgpIHNvIHlvdSBjYW4gZGVhZGxvY2sgaGVyZSBqdXN0IGFzIGVhc2lseSBhcyBvbiBqb3VybmFsX3N0YXJ0KCkuCiA8L3BhcmE+CkBAIC0xODQsNyArMjUwLDcgQEAKIDxwYXJhPgogVHJ5IHRvIHJlc2VydmUgdGhlIHJpZ2h0IG51bWJlciBvZiBibG9ja3MgdGhlIGZpcnN0IHRpbWUuIDstKS4gVGhpcyB3aWxsCiBiZSB0aGUgbWF4aW11bSBudW1iZXIgb2YgYmxvY2tzIHlvdSBhcmUgZ29pbmcgdG8gdG91Y2ggaW4gdGhpcyB0cmFuc2FjdGlvbi4KLUkgYWR2aXNlIGhhdmluZyBhIGxvb2sgYXQgYXQgbGVhc3QgZXh0M19qYmQuaCB0byBzZWUgdGhlIGJhc2lzIG9uIHdoaWNoIAorSSBhZHZpc2UgaGF2aW5nIGEgbG9vayBhdCBhdCBsZWFzdCBleHQzX2piZC5oIHRvIHNlZSB0aGUgYmFzaXMgb24gd2hpY2gKIGV4dDMgdXNlcyB0byBtYWtlIHRoZXNlIGRlY2lzaW9ucy4KIDwvcGFyYT4KIApAQCAtMTkzLDEzICsyNTksMTMgQEAKIHdoeT8gQmVjYXVzZSwgaWYgeW91IHVuZG8gYSBkZWxldGUsIHlvdSBuZWVkIHRvIGVuc3VyZSB5b3UgaGF2ZW4ndCByZXVzZWQgYW55CiBvZiB0aGUgZnJlZWQgYmxvY2tzIGluIGEgbGF0ZXIgdHJhbnNhY3Rpb24uIE9uZSBzaW1wbGUgd2F5IG9mIGRvaW5nIHRoaXMKIGlzIG1ha2Ugc3VyZSBhbnkgYmxvY2tzIHlvdSBhbGxvY2F0ZSBvbmx5IGhhdmUgY2hlY2twb2ludGVkIHRyYW5zYWN0aW9ucwotbGlzdGVkIGFnYWluc3QgdGhlbS4gRXh0MyBkb2VzIHRoaXMgaW4gZXh0M190ZXN0X2FsbG9jYXRhYmxlKCkuIAorbGlzdGVkIGFnYWluc3QgdGhlbS4gRXh0MyBkb2VzIHRoaXMgaW4gZXh0M190ZXN0X2FsbG9jYXRhYmxlKCkuCiA8L3BhcmE+CiAKIDxwYXJhPgogTG9jayBpcyBhbHNvIHByb3ZpZGluZyB0aHJvdWdoIGpvdXJuYWxfe3VuLH1sb2NrX3VwZGF0ZXMoKSwKIGV4dDMgdXNlcyB0aGlzIHdoZW4gaXQgd2FudHMgYSB3aW5kb3cgd2l0aCBhIGNsZWFuIGFuZCBzdGFibGUgZnMgZm9yIGEgbW9tZW50LgotZWcuIAorZWcuCiA8L3BhcmE+CiAKIDxwcm9ncmFtbGlzdGluZz4KQEAgLTIzMCwxOSArMjk2LDE5IEBACiAJCXN0cnVjdCBqb3VybmFsX2NhbGxiYWNrIGZvcl9qYmQ7CiAJCS8vIFN0dWZmIGZvciBteWZzIGFsbG9jYXRlZCB0b2dldGhlci4KIAkJbXlmc19pbm9kZSogICAgaV9jb21taXRlZDsKLQkKKwogCX0KIDwvcHJvZ3JhbWxpc3Rpbmc+CiAKIDxwYXJhPgotdGhpcyB3b3VsZCBiZSB1c2VmdWwgaWYgeW91IG5lZWRlZCB0byBrbm93IHdoZW4gZGF0YSB3YXMgY29tbWl0dGVkIHRvIGEgCit0aGlzIHdvdWxkIGJlIHVzZWZ1bCBpZiB5b3UgbmVlZGVkIHRvIGtub3cgd2hlbiBkYXRhIHdhcyBjb21taXR0ZWQgdG8gYQogcGFydGljdWxhciBpbm9kZS4KIDwvcGFyYT4KIAotPC9zZWN0MT4KKyAgICA8L3NlY3QyPgogCi08c2VjdDE+Ci08dGl0bGU+U3VtbWFyeTwvdGl0bGU+CisgICAgPHNlY3QyPgorICAgICA8dGl0bGU+U3VtbWFyeTwvdGl0bGU+CiA8cGFyYT4KIFVzaW5nIHRoZSBqb3VybmFsIGlzIGEgbWF0dGVyIG9mIHdyYXBwaW5nIHRoZSBkaWZmZXJlbnQgY29udGV4dCBjaGFuZ2VzLAogYmVpbmcgZWFjaCBtb3VudCwgZWFjaCBtb2RpZmljYXRpb24gKHRyYW5zYWN0aW9uKSBhbmQgZWFjaCBjaGFuZ2VkIGJ1ZmZlcgpAQCAtMjYwLDE1ICszMjYsMTUgQEAKICAgaWYgKGNsZWFuKSBqb3VybmFsX3dpcGUoKTsKICAgam91cm5hbF9sb2FkKCk7CiAKLSAgIGZvcmVhY2godHJhbnNhY3Rpb24pIHsgLyp0cmFuc2FjdGlvbnMgbXVzdCBiZSAKKyAgIGZvcmVhY2godHJhbnNhY3Rpb24pIHsgLyp0cmFuc2FjdGlvbnMgbXVzdCBiZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBsZXRlZCBiZWZvcmUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhIHN5c2NhbGwgcmV0dXJucyB0byAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhIHN5c2NhbGwgcmV0dXJucyB0bwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZXJzcGFjZSovCiAKICAgICAgICAgICBoYW5kbGVfdCAqIHhjdD1qb3VybmFsX3N0YXJ0KG15X2pucmwpOwogICAgICAgICAgIGZvcmVhY2goYmgpIHsKICAgICAgICAgICAgICAgICBqb3VybmFsX2dldF97Y3JlYXRlLHdyaXRlLHVuZG99X2FjY2Vzcyh4YWN0LGJoKTsKLSAgICAgICAgICAgICAgICBpZiAoIG15ZnNfbW9kaWZ5KGJoKSApIHsgLyogcmV0dXJucyB0cnVlIAorICAgICAgICAgICAgICAgIGlmICggbXlmc19tb2RpZnkoYmgpICkgeyAvKiByZXR1cm5zIHRydWUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiBtYWtlcyBjaGFuZ2VzICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBqb3VybmFsX2RpcnR5X3ttZXRhLH1kYXRhKHhhY3QsYmgpOwogICAgICAgICAgICAgICAgIH0gZWxzZSB7CkBAIC0yNzksNTUgKzM0NSw1NyBAQAogICAgfQogICAgam91cm5hbF9kZXN0cm95KG15X2pybmwpOwogPC9wcm9ncmFtbGlzdGluZz4KLTwvc2VjdDE+CisgICAgPC9zZWN0Mj4KIAotPC9jaGFwdGVyPgorICAgIDwvc2VjdDE+CiAKLSAgPGNoYXB0ZXIgaWQ9ImFkdCI+CisgICAgPHNlY3QxPgogICAgICA8dGl0bGU+RGF0YSBUeXBlczwvdGl0bGU+Ci0gICAgIDxwYXJhPgkKKyAgICAgPHBhcmE+CiAJVGhlIGpvdXJuYWxsaW5nIGxheWVyIHVzZXMgdHlwZWRlZnMgdG8gJ2hpZGUnIHRoZSBjb25jcmV0ZSBkZWZpbml0aW9ucwogCW9mIHRoZSBzdHJ1Y3R1cmVzIHVzZWQuIEFzIGEgY2xpZW50IG9mIHRoZSBKQkQgbGF5ZXIgeW91IGNhbgogCWp1c3QgcmVseSBvbiB0aGUgdXNpbmcgdGhlIHBvaW50ZXIgYXMgYSBtYWdpYyBjb29raWUgIG9mIHNvbWUgc29ydC4KLQkKLQlPYnZpb3VzbHkgdGhlIGhpZGluZyBpcyBub3QgZW5mb3JjZWQgYXMgdGhpcyBpcyAnQycuCi0JPC9wYXJhPgotCTxzZWN0MT48dGl0bGU+U3RydWN0dXJlczwvdGl0bGU+Ci0hSWluY2x1ZGUvbGludXgvamJkLmgKLQk8L3NlY3QxPgotPC9jaGFwdGVyPgogCi0gIDxjaGFwdGVyIGlkPSJjYWxscyI+CisJT2J2aW91c2x5IHRoZSBoaWRpbmcgaXMgbm90IGVuZm9yY2VkIGFzIHRoaXMgaXMgJ0MnLgorICAgICA8L3BhcmE+CisJPHNlY3QyPjx0aXRsZT5TdHJ1Y3R1cmVzPC90aXRsZT4KKyFJaW5jbHVkZS9saW51eC9qYmQuaAorCTwvc2VjdDI+CisgICAgPC9zZWN0MT4KKworICAgIDxzZWN0MT4KICAgICAgPHRpdGxlPkZ1bmN0aW9uczwvdGl0bGU+Ci0gICAgIDxwYXJhPgkKKyAgICAgPHBhcmE+CiAJVGhlIGZ1bmN0aW9ucyBoZXJlIGFyZSBzcGxpdCBpbnRvIHR3byBncm91cHMgdGhvc2UgdGhhdAogCWFmZmVjdCBhIGpvdXJuYWwgYXMgYSB3aG9sZSwgYW5kIHRob3NlIHdoaWNoIGFyZSB1c2VkIHRvCiAJbWFuYWdlIHRyYW5zYWN0aW9ucwotPC9wYXJhPgotCTxzZWN0MT48dGl0bGU+Sm91cm5hbCBMZXZlbDwvdGl0bGU+CisgICAgIDwvcGFyYT4KKwk8c2VjdDI+PHRpdGxlPkpvdXJuYWwgTGV2ZWw8L3RpdGxlPgogIUVmcy9qYmQvam91cm5hbC5jCiAhSWZzL2piZC9yZWNvdmVyeS5jCi0JPC9zZWN0MT4KLQk8c2VjdDE+PHRpdGxlPlRyYW5zYXNjdGlvbiBMZXZlbDwvdGl0bGU+Ci0hRWZzL2piZC90cmFuc2FjdGlvbi5jCQotCTwvc2VjdDE+Ci08L2NoYXB0ZXI+Ci08Y2hhcHRlcj4KKwk8L3NlY3QyPgorCTxzZWN0Mj48dGl0bGU+VHJhbnNhc2N0aW9uIExldmVsPC90aXRsZT4KKyFFZnMvamJkL3RyYW5zYWN0aW9uLmMKKwk8L3NlY3QyPgorICAgIDwvc2VjdDE+CisgICAgPHNlY3QxPgogICAgICA8dGl0bGU+U2VlIGFsc288L3RpdGxlPgogCTxwYXJhPgotCTxjaXRhdGlvbj4KKwkgIDxjaXRhdGlvbj4KIAkgICA8dWxpbmsgdXJsPSJmdHA6Ly9mdHAudWsubGludXgub3JnL3B1Yi9saW51eC9zY3QvZnMvamZzL2pvdXJuYWwtZGVzaWduLnBzLmd6Ij4KLQkgICAJSm91cm5hbGluZyB0aGUgTGludXggZXh0MmZzIEZpbGVzeXN0ZW0sTGludXhFeHBvIDk4LCBTdGVwaGVuIFR3ZWVkaWUKKwkgICAJSm91cm5hbGluZyB0aGUgTGludXggZXh0MmZzIEZpbGVzeXN0ZW0sIExpbnV4RXhwbyA5OCwgU3RlcGhlbiBUd2VlZGllCiAJICAgPC91bGluaz4KLQkgICA8L2NpdGF0aW9uPgotCSAgIDwvcGFyYT4KLQkgICA8cGFyYT4KKwkgIDwvY2l0YXRpb24+CisJPC9wYXJhPgorCTxwYXJhPgogCSAgIDxjaXRhdGlvbj4KIAkgICA8dWxpbmsgdXJsPSJodHRwOi8vb2xzdHJhbnMuc291cmNlZm9yZ2UubmV0L3JlbGVhc2UvT0xTMjAwMC1leHQzL09MUzIwMDAtZXh0My5odG1sIj4KLQkgICAJRXh0MyBKb3VybmFsbGluZyBGaWxlU3lzdGVtICwgT0xTIDIwMDAsIERyLiBTdGVwaGVuIFR3ZWVkaWUKKwkgICAJRXh0MyBKb3VybmFsbGluZyBGaWxlU3lzdGVtLCBPTFMgMjAwMCwgRHIuIFN0ZXBoZW4gVHdlZWRpZQogCSAgIDwvdWxpbms+CiAJICAgPC9jaXRhdGlvbj4KLQkgICA8L3BhcmE+Ci08L2NoYXB0ZXI+CisJPC9wYXJhPgorICAgIDwvc2VjdDE+CisKKyAgPC9jaGFwdGVyPgogCiA8L2Jvb2s+CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL0RvY0Jvb2sva2VybmVsLWFwaS50bXBsIGIvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL2tlcm5lbC1hcGkudG1wbAppbmRleCAyYjVhYzYwLi5hMTY2Njc1IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL0RvY0Jvb2sva2VybmVsLWFwaS50bXBsCisrKyBiL0RvY3VtZW50YXRpb24vRG9jQm9vay9rZXJuZWwtYXBpLnRtcGwKQEAgLTE4Miw2NiArMTgyLDYgQEAKICAgICAgPC9zZWN0MT4KICAgPC9jaGFwdGVyPgogCi0gIDxjaGFwdGVyIGlkPSJ2ZnMiPgotICAgICA8dGl0bGU+VGhlIExpbnV4IFZGUzwvdGl0bGU+Ci0gICAgIDxzZWN0MT48dGl0bGU+VGhlIEZpbGVzeXN0ZW0gdHlwZXM8L3RpdGxlPgotIUlpbmNsdWRlL2xpbnV4L2ZzLmgKLSAgICAgPC9zZWN0MT4KLSAgICAgPHNlY3QxPjx0aXRsZT5UaGUgRGlyZWN0b3J5IENhY2hlPC90aXRsZT4KLSFFZnMvZGNhY2hlLmMKLSFJaW5jbHVkZS9saW51eC9kY2FjaGUuaAotICAgICA8L3NlY3QxPgotICAgICA8c2VjdDE+PHRpdGxlPklub2RlIEhhbmRsaW5nPC90aXRsZT4KLSFFZnMvaW5vZGUuYwotIUVmcy9iYWRfaW5vZGUuYwotICAgICA8L3NlY3QxPgotICAgICA8c2VjdDE+PHRpdGxlPlJlZ2lzdHJhdGlvbiBhbmQgU3VwZXJibG9ja3M8L3RpdGxlPgotIUVmcy9zdXBlci5jCi0gICAgIDwvc2VjdDE+Ci0gICAgIDxzZWN0MT48dGl0bGU+RmlsZSBMb2NrczwvdGl0bGU+Ci0hRWZzL2xvY2tzLmMKLSFJZnMvbG9ja3MuYwotICAgICA8L3NlY3QxPgotICAgICA8c2VjdDE+PHRpdGxlPk90aGVyIEZ1bmN0aW9uczwvdGl0bGU+Ci0hRWZzL21wYWdlLmMKLSFFZnMvbmFtZWkuYwotIUVmcy9idWZmZXIuYwotIUVmcy9iaW8uYwotIUVmcy9zZXFfZmlsZS5jCi0hRWZzL2ZpbGVzeXN0ZW1zLmMKLSFFZnMvZnMtd3JpdGViYWNrLmMKLSFFZnMvYmxvY2tfZGV2LmMKLSAgICAgPC9zZWN0MT4KLSAgPC9jaGFwdGVyPgotCi0gIDxjaGFwdGVyIGlkPSJwcm9jIj4KLSAgICAgPHRpdGxlPlRoZSBwcm9jIGZpbGVzeXN0ZW08L3RpdGxlPgotIAotICAgICA8c2VjdDE+PHRpdGxlPnN5c2N0bCBpbnRlcmZhY2U8L3RpdGxlPgotIUVrZXJuZWwvc3lzY3RsLmMKLSAgICAgPC9zZWN0MT4KLQotICAgICA8c2VjdDE+PHRpdGxlPnByb2MgZmlsZXN5c3RlbSBpbnRlcmZhY2U8L3RpdGxlPgotIUlmcy9wcm9jL2Jhc2UuYwotICAgICA8L3NlY3QxPgotICA8L2NoYXB0ZXI+Ci0KLSAgPGNoYXB0ZXIgaWQ9InN5c2ZzIj4KLSAgICAgPHRpdGxlPlRoZSBGaWxlc3lzdGVtIGZvciBFeHBvcnRpbmcgS2VybmVsIE9iamVjdHM8L3RpdGxlPgotIUVmcy9zeXNmcy9maWxlLmMKLSFFZnMvc3lzZnMvc3ltbGluay5jCi0hRWZzL3N5c2ZzL2Jpbi5jCi0gIDwvY2hhcHRlcj4KLQotICA8Y2hhcHRlciBpZD0iZGVidWdmcyI+Ci0gICAgIDx0aXRsZT5UaGUgZGVidWdmcyBmaWxlc3lzdGVtPC90aXRsZT4KLSAKLSAgICAgPHNlY3QxPjx0aXRsZT5kZWJ1Z2ZzIGludGVyZmFjZTwvdGl0bGU+Ci0hRWZzL2RlYnVnZnMvaW5vZGUuYwotIUVmcy9kZWJ1Z2ZzL2ZpbGUuYwotICAgICA8L3NlY3QxPgotICA8L2NoYXB0ZXI+Ci0KICAgPGNoYXB0ZXIgaWQ9InJlbGF5ZnMiPgogICAgICA8dGl0bGU+cmVsYXkgaW50ZXJmYWNlIHN1cHBvcnQ8L3RpdGxlPgogCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL0hPV1RPIGIvRG9jdW1lbnRhdGlvbi9IT1dUTwppbmRleCBkNmYzZGQxLi44ZDUxYzE0IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL0hPV1RPCisrKyBiL0RvY3VtZW50YXRpb24vSE9XVE8KQEAgLTM5NSw2ICszOTUsMjYgQEAKIAogCiAKK01hbmFnaW5nIGJ1ZyByZXBvcnRzCistLS0tLS0tLS0tLS0tLS0tLS0tLQorCitPbmUgb2YgdGhlIGJlc3Qgd2F5cyB0byBwdXQgaW50byBwcmFjdGljZSB5b3VyIGhhY2tpbmcgc2tpbGxzIGlzIGJ5IGZpeGluZworYnVncyByZXBvcnRlZCBieSBvdGhlciBwZW9wbGUuIE5vdCBvbmx5IHlvdSB3aWxsIGhlbHAgdG8gbWFrZSB0aGUga2VybmVsCittb3JlIHN0YWJsZSwgeW91J2xsIGxlYXJuIHRvIGZpeCByZWFsIHdvcmxkIHByb2JsZW1zIGFuZCB5b3Ugd2lsbCBpbXByb3ZlCit5b3VyIHNraWxscywgYW5kIG90aGVyIGRldmVsb3BlcnMgd2lsbCBiZSBhd2FyZSBvZiB5b3VyIHByZXNlbmNlLiBGaXhpbmcKK2J1Z3MgaXMgb25lIG9mIHRoZSBiZXN0IHdheXMgdG8gZ2V0IG1lcml0cyBhbW9uZyBvdGhlciBkZXZlbG9wZXJzLCBiZWNhdXNlCitub3QgbWFueSBwZW9wbGUgbGlrZSB3YXN0aW5nIHRpbWUgZml4aW5nIG90aGVyIHBlb3BsZSdzIGJ1Z3MuCisKK1RvIHdvcmsgaW4gdGhlIGFscmVhZHkgcmVwb3J0ZWQgYnVnIHJlcG9ydHMsIGdvIHRvIGh0dHA6Ly9idWd6aWxsYS5rZXJuZWwub3JnLgorSWYgeW91IHdhbnQgdG8gYmUgYWR2aXNlZCBvZiB0aGUgZnV0dXJlIGJ1ZyByZXBvcnRzLCB5b3UgY2FuIHN1YnNjcmliZSB0byB0aGUKK2J1Z21lLW5ldyBtYWlsaW5nIGxpc3QgKG9ubHkgbmV3IGJ1ZyByZXBvcnRzIGFyZSBtYWlsZWQgaGVyZSkgb3IgdG8gdGhlCitidWdtZS1qYW5pdG9yIG1haWxpbmcgbGlzdCAoZXZlcnkgY2hhbmdlIGluIHRoZSBidWd6aWxsYSBpcyBtYWlsZWQgaGVyZSkKKworCWh0dHA6Ly9saXN0cy5vc2RsLm9yZy9tYWlsbWFuL2xpc3RpbmZvL2J1Z21lLW5ldworCWh0dHA6Ly9saXN0cy5vc2RsLm9yZy9tYWlsbWFuL2xpc3RpbmZvL2J1Z21lLWphbml0b3JzCisKKworCiBNYWlsaW5nIGxpc3RzCiAtLS0tLS0tLS0tLS0tCiAKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vTVNJLUhPV1RPLnR4dCBiL0RvY3VtZW50YXRpb24vTVNJLUhPV1RPLnR4dAppbmRleCBjNzAzMDZhLi41YzM0OTEwIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL01TSS1IT1dUTy50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9NU0ktSE9XVE8udHh0CkBAIC00NzAsNyArNDcwLDY4IEBACiBFUlI6ICAgICAgICAgIDAKIE1JUzogICAgICAgICAgMAogCi02LiBGQVEKKzYuIE1TSSBxdWlya3MKKworU2V2ZXJhbCBQQ0kgY2hpcHNldHMgb3IgZGV2aWNlcyBhcmUga25vd24gdG8gbm90IHN1cHBvcnQgTVNJLgorVGhlIFBDSSBzdGFjayBwcm92aWRlcyAzIHBvc3NpYmxlIGxldmVscyBvZiBNU0kgZGlzYWJsaW5nOgorKiBvbiBhIHNpbmdsZSBkZXZpY2UKKyogb24gYWxsIGRldmljZXMgYmVoaW5kIGEgc3BlY2lmaWMgYnJpZGdlCisqIGdsb2JhbGx5CisKKzYuMS4gRGlzYWJsaW5nIE1TSSBvbiBhIHNpbmdsZSBkZXZpY2UKKworVW5kZXIgc29tZSBjaXJjdW1zdGFuY2VzLCBpdCBtaWdodCBiZSByZXF1aXJlZCB0byBkaXNhYmxlIE1TSSBvbiBhCitzaW5nbGUgZGV2aWNlLCBJdCBtYXkgYmUgYWNoaXZlZCBieSBlaXRoZXIgbm90IGNhbGxpbmcgcGNpX2VuYWJsZV9tc2koKQorb3IgYWxsLCBvciBzZXR0aW5nIHRoZSBwY2lfZGV2LT5ub19tc2kgZmxhZyBiZWZvcmUgKG1vc3Qgb2YgdGhlIHRpbWUKK2luIGEgcXVpcmspLgorCis2LjIuIERpc2FibGluZyBNU0kgYmVsb3cgYSBicmlkZ2UKKworVGhlIHZhc3QgbWFqb3JpdHkgb2YgTVNJIHF1aXJrcyBhcmUgcmVxdWlyZWQgYnkgUENJIGJyaWRnZXMgbm90CitiZWluZyBhYmxlIHRvIHJvdXRlIE1TSSBiZXR3ZWVuIGJ1c3Nlcy4gSW4gdGhpcyBjYXNlLCBNU0kgaGF2ZSB0byBiZQorZGlzYWJsZWQgb24gYWxsIGRldmljZXMgYmVoaW5kIHRoaXMgYnJpZGdlLiBJdCBpcyBhY2hpZXZlcyBieSBzZXR0aW5nCit0aGUgUENJX0JVU19GTEFHU19OT19NU0kgZmxhZyBpbiB0aGUgcGNpX2J1cy0+YnVzX2ZsYWdzIG9mIHRoZSBicmlkZ2UKK3N1Ym9yZGluYXRlIGJ1cy4gVGhlcmUgaXMgbm8gbmVlZCB0byBzZXQgdGhlIHNhbWUgZmxhZyBvbiBicmlkZ2VzIHRoYXQKK2FyZSBiZWxvdyB0aGUgYnJva2VuIGJyaWdkZS4gV2hlbiBwY2lfZW5hYmxlX21zaSgpIGlzIGNhbGxlZCB0byBlbmFibGUKK01TSSBvbiBhIGRldmljZSwgcGNpX21zaV9zdXBwb3J0ZWQoKSB0YWtlcyBjYXJlIG9mIGNoZWNraW5nIHRoZSBOT19NU0kKK2ZsYWcgaW4gYWxsIHBhcmVudCBidXNzZXMgb2YgdGhlIGRldmljZS4KKworU29tZSBicmlkZ2VzIGFjdHVhbGx5IHN1cHBvcnQgZHluYW1pYyBNU0kgc3VwcG9ydCBlbmFibGluZy9kaXNhYmxpbmcKK2J5IGNoYW5naW5nIHNvbWUgYml0cyBpbiB0aGVpciBQQ0kgY29uZmlndXJhdGlvbiBzcGFjZSAoZXNwZWNpYWxseQordGhlIEh5cGVydHJhbnNwb3J0IGNoaXBzZXRzIHN1Y2ggYXMgdGhlIG5WaWRpYSBuRm9yY2UgYW5kIFNlcnZlcndvcmtzCitIVDIwMDApLiBJdCBtYXkgdGhlbiBiZSByZXF1aXJlZCB0byB1cGRhdGUgdGhlIE5PX01TSSBmbGFnIG9uIHRoZQorY29ycmVzcG9uZGluZyBkZXZpY2VzIGluIHRoZSBzeXNmcyBoaWVyYXJjaHkuIFRvIGVuYWJsZSBNU0kgc3VwcG9ydAorb24gZGV2aWNlICIwMDAwOjAwOjBlIiwgZG86CisKKwllY2hvIDEgPiAvc3lzL2J1cy9wY2kvZGV2aWNlcy8wMDAwOjAwOjBlL21zaV9idXMKKworVG8gZGlzYWJsZSBNU0kgc3VwcG9ydCwgZWNobyAwIGluc3RlYWQgb2YgMS4gTm90ZSB0aGF0IGl0IHNob3VsZCBiZQordXNlZCB3aXRoIGNhdXRpb24gc2luY2UgY2hhbmdpbmcgdGhpcyB2YWx1ZSBtaWdodCBicmVhayBpbnRlcnJ1cHRzLgorCis2LjMuIERpc2FibGluZyBNU0kgZ2xvYmFsbHkKKworU29tZSBleHRyZW1lIGNhc2VzIG1heSByZXF1aXJlIHRvIGRpc2FibGUgTVNJIGdsb2JhbGx5IG9uIHRoZSBzeXN0ZW0uCitGb3Igbm93LCB0aGUgb25seSBrbm93biBjYXNlIGlzIGEgU2VydmVyd29ya3MgUENJLVggY2hpcHNldHMgKE1TSSBhcmUKK25vdCBzdXBwb3J0ZWQgb24gc2V2ZXJhbCBidXNzZXMgdGhhdCBhcmUgbm90IGFsbCBjb25uZWN0ZWQgdG8gdGhlCitjaGlwc2V0IGluIHRoZSBMaW51eCBQQ0kgaGllcmFyY2h5KS4gSW4gdGhlIHZhc3QgbWFqb3JpdHkgb2Ygb3RoZXIKK2Nhc2VzLCBkaXNhYmxpbmcgb25seSBiZWhpbmQgYSBzcGVjaWZpYyBicmlkZ2UgaXMgZW5vdWdoLgorCitGb3IgZGVidWdnaW5nIHB1cnBvc2UsIHRoZSB1c2VyIG1heSBhbHNvIHBhc3MgcGNpPW5vbXNpIG9uIHRoZSBrZXJuZWwKK2NvbW1hbmQtbGluZSB0byBleHBsaWNpdGx5IGRpc2FibGUgTVNJIGdsb2JhbGx5LiBCdXQsIG9uY2UgdGhlIGFwcHJvLQorcHJpYXRlIHF1aXJrcyBhcmUgYWRkZWQgdG8gdGhlIGtlcm5lbCwgdGhpcyBvcHRpb24gc2hvdWxkIG5vdCBiZQorcmVxdWlyZWQgYW55bW9yZS4KKworNi40LiBGaW5kaW5nIHdoeSBNU0kgY2Fubm90IGJlIGVuYWJsZWQgb24gYSBkZXZpY2UKKworQXNzdW1pbmcgdGhhdCBNU0kgYXJlIG5vdCBlbmFibGVkIG9uIGEgZGV2aWNlLCB5b3Ugc2hvdWxkIGxvb2sgYXQKK2RtZXNnIHRvIGZpbmQgbWVzc2FnZXMgdGhhdCBxdWlya3MgbWF5IG91dHB1dCB3aGVuIGRpc2FibGluZyBNU0kKK29uIHNvbWUgZGV2aWNlcywgc29tZSBicmlkZ2VzIG9yIGV2ZW4gZ2xvYmFsbHkuCitUaGVuLCBsc3BjaSAtdCBnaXZlcyB0aGUgbGlzdCBvZiBicmlkZ2VzIGFib3ZlIGEgZGV2aWNlLiBSZWFkaW5nCisvc3lzL2J1cy9wY2kvZGV2aWNlcy8wMDAwOjAwOjBlL21zaV9idXMgd2lsbCB0ZWxsIHlvdSB3aGV0aGVyIE1TSQorYXJlIGVuYWJsZWQgKDEpIG9yIGRpc2FibGVkICgwKS4gSW4gMCBpcyBmb3VuZCBpbiBhIHNpbmdsZSBicmlkZ2UKK21zaV9idXMgZmlsZSBhYm92ZSB0aGUgZGV2aWNlLCBNU0kgY2Fubm90IGJlIGVuYWJsZWQuCisKKzcuIEZBUQogCiBRMS4gQXJlIHRoZXJlIGFueSBsaW1pdGF0aW9ucyBvbiB1c2luZyB0aGUgTVNJPwogCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2FjY291bnRpbmcvZ2V0ZGVsYXlzLmMgYi9Eb2N1bWVudGF0aW9uL2FjY291bnRpbmcvZ2V0ZGVsYXlzLmMKaW5kZXggYjExNzkyYS4uYmYyYjBlMiAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9hY2NvdW50aW5nL2dldGRlbGF5cy5jCisrKyBiL0RvY3VtZW50YXRpb24vYWNjb3VudGluZy9nZXRkZWxheXMuYwpAQCAtNDksNyArNDksNyBAQAogCX0KIAogLyogTWF4aW11bSBzaXplIG9mIHJlc3BvbnNlIHJlcXVlc3RlZCBvciBtZXNzYWdlIHNlbnQgKi8KLSNkZWZpbmUgTUFYX01TR19TSVpFCTI1NgorI2RlZmluZSBNQVhfTVNHX1NJWkUJMTAyNAogLyogTWF4aW11bSBudW1iZXIgb2YgY3B1cyBleHBlY3RlZCB0byBiZSBzcGVjaWZpZWQgaW4gYSBjcHVtYXNrICovCiAjZGVmaW5lIE1BWF9DUFVTCTMyCiAvKiBNYXhpbXVtIGxlbmd0aCBvZiBwYXRobmFtZSB0byBsb2cgZmlsZSAqLwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9jcHUtaG90cGx1Zy50eHQgYi9Eb2N1bWVudGF0aW9uL2NwdS1ob3RwbHVnLnR4dAppbmRleCBiYzEwN2NiLi40ODY4YzM0IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2NwdS1ob3RwbHVnLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2NwdS1ob3RwbHVnLnR4dApAQCAtNDYsNyArNDYsNyBAQAogICAgICAgICAgICAgIG1heGNwdXM9MiB3aWxsIG9ubHkgYm9vdCAyLiBZb3UgY2FuIGNob29zZSB0byBicmluZyB0aGUKICAgICAgICAgICAgICBvdGhlciBjcHVzIGxhdGVyIG9ubGluZSwgcmVhZCBGQVEncyBmb3IgbW9yZSBpbmZvLgogCi1hZGRpdGlvbmFsX2NwdXMqPW4JVXNlIHRoaXMgdG8gbGltaXQgaG90cGx1Z2dhYmxlIGNwdXMuIFRoaXMgb3B0aW9uIHNldHMKK2FkZGl0aW9uYWxfY3B1cz1uICgqKQlVc2UgdGhpcyB0byBsaW1pdCBob3RwbHVnZ2FibGUgY3B1cy4gVGhpcyBvcHRpb24gc2V0cwogICAJCQljcHVfcG9zc2libGVfbWFwID0gY3B1X3ByZXNlbnRfbWFwICsgYWRkaXRpb25hbF9jcHVzCiAKICgqKSBPcHRpb24gdmFsaWQgb25seSBmb3IgZm9sbG93aW5nIGFyY2hpdGVjdHVyZXMKQEAgLTEwMSwxNSArMTAxLDE1IEBACiAKIE5ldmVyIHVzZSBhbnl0aGluZyBvdGhlciB0aGFuIGNwdW1hc2tfdCB0byByZXByZXNlbnQgYml0bWFwIG9mIENQVXMuCiAKLSNpbmNsdWRlIDxsaW51eC9jcHVtYXNrLmg+CisJI2luY2x1ZGUgPGxpbnV4L2NwdW1hc2suaD4KIAotZm9yX2VhY2hfcG9zc2libGVfY3B1ICAgICAtIEl0ZXJhdGUgb3ZlciBjcHVfcG9zc2libGVfbWFwCi1mb3JfZWFjaF9vbmxpbmVfY3B1ICAgICAgIC0gSXRlcmF0ZSBvdmVyIGNwdV9vbmxpbmVfbWFwCi1mb3JfZWFjaF9wcmVzZW50X2NwdSAgICAgIC0gSXRlcmF0ZSBvdmVyIGNwdV9wcmVzZW50X21hcAotZm9yX2VhY2hfY3B1X21hc2soeCxtYXNrKSAtIEl0ZXJhdGUgb3ZlciBzb21lIHJhbmRvbSBjb2xsZWN0aW9uIG9mIGNwdSBtYXNrLgorCWZvcl9lYWNoX3Bvc3NpYmxlX2NwdSAgICAgLSBJdGVyYXRlIG92ZXIgY3B1X3Bvc3NpYmxlX21hcAorCWZvcl9lYWNoX29ubGluZV9jcHUgICAgICAgLSBJdGVyYXRlIG92ZXIgY3B1X29ubGluZV9tYXAKKwlmb3JfZWFjaF9wcmVzZW50X2NwdSAgICAgIC0gSXRlcmF0ZSBvdmVyIGNwdV9wcmVzZW50X21hcAorCWZvcl9lYWNoX2NwdV9tYXNrKHgsbWFzaykgLSBJdGVyYXRlIG92ZXIgc29tZSByYW5kb20gY29sbGVjdGlvbiBvZiBjcHUgbWFzay4KIAotI2luY2x1ZGUgPGxpbnV4L2NwdS5oPgotbG9ja19jcHVfaG90cGx1ZygpIGFuZCB1bmxvY2tfY3B1X2hvdHBsdWcoKToKKwkjaW5jbHVkZSA8bGludXgvY3B1Lmg+CisJbG9ja19jcHVfaG90cGx1ZygpIGFuZCB1bmxvY2tfY3B1X2hvdHBsdWcoKToKIAogVGhlIGFib3ZlIGNhbGxzIGFyZSB1c2VkIHRvIGluaGliaXQgY3B1IGhvdHBsdWcgb3BlcmF0aW9ucy4gV2hpbGUgaG9sZGluZyB0aGUKIGNwdWNvbnRyb2wgbXV0ZXgsIGNwdV9vbmxpbmVfbWFwIHdpbGwgbm90IGNoYW5nZS4gSWYgeW91IG1lcmVseSBuZWVkIHRvIGF2b2lkCkBAIC0xMjAsNyArMTIwLDcgQEAKIAogQ1BVIEhvdHBsdWcgLSBGcmVxdWVudGx5IEFza2VkIFF1ZXN0aW9ucy4KIAotUTogSG93IHRvIGkgZW5hYmxlIG15IGtlcm5lbCB0byBzdXBwb3J0IENQVSBob3RwbHVnPworUTogSG93IHRvIGVuYWJsZSBteSBrZXJuZWwgdG8gc3VwcG9ydCBDUFUgaG90cGx1Zz8KIEE6IFdoZW4gZG9pbmcgbWFrZSBkZWZjb25maWcsIEVuYWJsZSBDUFUgaG90cGx1ZyBzdXBwb3J0CiAKICAgICJQcm9jZXNzb3IgdHlwZSBhbmQgRmVhdHVyZXMiIC0+IFN1cHBvcnQgZm9yIEhvdHBsdWdnYWJsZSBDUFVzCkBAIC0xNDEsMzkgKzE0MSwzOSBAQAogQ2hlY2sgaWYgc3lzZnMgaXMgbW91bnRlZCwgdXNpbmcgdGhlICJtb3VudCIgY29tbWFuZC4gWW91IHNob3VsZCBub3RpY2UKIGFuIGVudHJ5IGFzIHNob3duIGJlbG93IGluIHRoZSBvdXRwdXQuCiAKLS4uLi4KLW5vbmUgb24gL3N5cyB0eXBlIHN5c2ZzIChydykKLS4uLi4KKwkuLi4uCisJbm9uZSBvbiAvc3lzIHR5cGUgc3lzZnMgKHJ3KQorCS4uLi4KIAotaWYgdGhpcyBpcyBub3QgbW91bnRlZCwgZG8gdGhlIGZvbGxvd2luZy4KK0lmIHRoaXMgaXMgbm90IG1vdW50ZWQsIGRvIHRoZSBmb2xsb3dpbmcuCiAKLSNta2RpciAvc3lzZnMKLSNtb3VudCAtdCBzeXNmcyBzeXMgL3N5cworCSAjbWtkaXIgL3N5c2ZzCisJI21vdW50IC10IHN5c2ZzIHN5cyAvc3lzCiAKLW5vdyB5b3Ugc2hvdWxkIHNlZSBlbnRyaWVzIGZvciBhbGwgcHJlc2VudCBjcHUsIHRoZSBmb2xsb3dpbmcgaXMgYW4gZXhhbXBsZQorTm93IHlvdSBzaG91bGQgc2VlIGVudHJpZXMgZm9yIGFsbCBwcmVzZW50IGNwdSwgdGhlIGZvbGxvd2luZyBpcyBhbiBleGFtcGxlCiBpbiBhIDgtd2F5IHN5c3RlbS4KIAotI3B3ZAotIy9zeXMvZGV2aWNlcy9zeXN0ZW0vY3B1Ci0jbHMgLWwKLXRvdGFsIDAKLWRyd3hyLXhyLXggIDEwIHJvb3Qgcm9vdCAwIFNlcCAxOSAwNzo0NCAuCi1kcnd4ci14ci14ICAxMyByb290IHJvb3QgMCBTZXAgMTkgMDc6NDUgLi4KLWRyd3hyLXhyLXggICAzIHJvb3Qgcm9vdCAwIFNlcCAxOSAwNzo0NCBjcHUwCi1kcnd4ci14ci14ICAgMyByb290IHJvb3QgMCBTZXAgMTkgMDc6NDQgY3B1MQotZHJ3eHIteHIteCAgIDMgcm9vdCByb290IDAgU2VwIDE5IDA3OjQ0IGNwdTIKLWRyd3hyLXhyLXggICAzIHJvb3Qgcm9vdCAwIFNlcCAxOSAwNzo0NCBjcHUzCi1kcnd4ci14ci14ICAgMyByb290IHJvb3QgMCBTZXAgMTkgMDc6NDQgY3B1NAotZHJ3eHIteHIteCAgIDMgcm9vdCByb290IDAgU2VwIDE5IDA3OjQ0IGNwdTUKLWRyd3hyLXhyLXggICAzIHJvb3Qgcm9vdCAwIFNlcCAxOSAwNzo0NCBjcHU2Ci1kcnd4ci14ci14ICAgMyByb290IHJvb3QgMCBTZXAgMTkgMDc6NDggY3B1NworCSNwd2QKKwkjL3N5cy9kZXZpY2VzL3N5c3RlbS9jcHUKKwkjbHMgLWwKKwl0b3RhbCAwCisJZHJ3eHIteHIteCAgMTAgcm9vdCByb290IDAgU2VwIDE5IDA3OjQ0IC4KKwlkcnd4ci14ci14ICAxMyByb290IHJvb3QgMCBTZXAgMTkgMDc6NDUgLi4KKwlkcnd4ci14ci14ICAgMyByb290IHJvb3QgMCBTZXAgMTkgMDc6NDQgY3B1MAorCWRyd3hyLXhyLXggICAzIHJvb3Qgcm9vdCAwIFNlcCAxOSAwNzo0NCBjcHUxCisJZHJ3eHIteHIteCAgIDMgcm9vdCByb290IDAgU2VwIDE5IDA3OjQ0IGNwdTIKKwlkcnd4ci14ci14ICAgMyByb290IHJvb3QgMCBTZXAgMTkgMDc6NDQgY3B1MworCWRyd3hyLXhyLXggICAzIHJvb3Qgcm9vdCAwIFNlcCAxOSAwNzo0NCBjcHU0CisJZHJ3eHIteHIteCAgIDMgcm9vdCByb290IDAgU2VwIDE5IDA3OjQ0IGNwdTUKKwlkcnd4ci14ci14ICAgMyByb290IHJvb3QgMCBTZXAgMTkgMDc6NDQgY3B1NgorCWRyd3hyLXhyLXggICAzIHJvb3Qgcm9vdCAwIFNlcCAxOSAwNzo0OCBjcHU3CiAKIFVuZGVyIGVhY2ggZGlyZWN0b3J5IHlvdSB3b3VsZCBmaW5kIGFuICJvbmxpbmUiIGZpbGUgd2hpY2ggaXMgdGhlIGNvbnRyb2wKIGZpbGUgdG8gbG9naWNhbGx5IG9ubGluZS9vZmZsaW5lIGEgcHJvY2Vzc29yLgogCiBROiBEb2VzIGhvdC1hZGQvaG90LXJlbW92ZSByZWZlciB0byBwaHlzaWNhbCBhZGQvcmVtb3ZlIG9mIGNwdXM/CiBBOiBUaGUgdXNhZ2Ugb2YgaG90LWFkZC9yZW1vdmUgbWF5IG5vdCBiZSB2ZXJ5IGNvbnNpc3RlbnRseSB1c2VkIGluIHRoZSBjb2RlLgotQ09ORklHX0NQVV9IT1RQTFVHIGVuYWJsZXMgbG9naWNhbCBvbmxpbmUvb2ZmbGluZSBjYXBhYmlsaXR5IGluIHRoZSBrZXJuZWwuCitDT05GSUdfSE9UUExVR19DUFUgZW5hYmxlcyBsb2dpY2FsIG9ubGluZS9vZmZsaW5lIGNhcGFiaWxpdHkgaW4gdGhlIGtlcm5lbC4KIFRvIHN1cHBvcnQgcGh5c2ljYWwgYWRkaXRpb24vcmVtb3ZhbCwgb25lIHdvdWxkIG5lZWQgc29tZSBCSU9TIGhvb2tzIGFuZAogdGhlIHBsYXRmb3JtIHNob3VsZCBoYXZlIHNvbWV0aGluZyBsaWtlIGFuIGF0dGVudGlvbiBidXR0b24gaW4gUENJIGhvdHBsdWcuCiBDT05GSUdfQUNQSV9IT1RQTFVHX0NQVSBlbmFibGVzIEFDUEkgc3VwcG9ydCBmb3IgcGh5c2ljYWwgYWRkL3JlbW92ZSBvZiBDUFVzLgpAQCAtMTgxLDE3ICsxODEsMTcgQEAKIFE6IEhvdyBkbyBpIGxvZ2ljYWxseSBvZmZsaW5lIGEgQ1BVPwogQTogRG8gdGhlIGZvbGxvd2luZy4KIAotI2VjaG8gMCA+IC9zeXMvZGV2aWNlcy9zeXN0ZW0vY3B1L2NwdVgvb25saW5lCisJI2VjaG8gMCA+IC9zeXMvZGV2aWNlcy9zeXN0ZW0vY3B1L2NwdVgvb25saW5lCiAKLW9uY2UgdGhlIGxvZ2ljYWwgb2ZmbGluZSBpcyBzdWNjZXNzZnVsLCBjaGVjaworT25jZSB0aGUgbG9naWNhbCBvZmZsaW5lIGlzIHN1Y2Nlc3NmdWwsIGNoZWNrCiAKLSNjYXQgL3Byb2MvaW50ZXJydXB0cworCSNjYXQgL3Byb2MvaW50ZXJydXB0cwogCi15b3Ugc2hvdWxkIG5vdyBub3Qgc2VlIHRoZSBDUFUgdGhhdCB5b3UgcmVtb3ZlZC4gQWxzbyBvbmxpbmUgZmlsZSB3aWxsIHJlcG9ydAorWW91IHNob3VsZCBub3cgbm90IHNlZSB0aGUgQ1BVIHRoYXQgeW91IHJlbW92ZWQuIEFsc28gb25saW5lIGZpbGUgd2lsbCByZXBvcnQKIHRoZSBzdGF0ZSBhcyAwIHdoZW4gYSBjcHUgaWYgb2ZmbGluZSBhbmQgMSB3aGVuIGl0cyBvbmxpbmUuCiAKLSNUbyBkaXNwbGF5IHRoZSBjdXJyZW50IGNwdSBzdGF0ZS4KLSNjYXQgL3N5cy9kZXZpY2VzL3N5c3RlbS9jcHUvY3B1WC9vbmxpbmUKKwkjVG8gZGlzcGxheSB0aGUgY3VycmVudCBjcHUgc3RhdGUuCisJI2NhdCAvc3lzL2RldmljZXMvc3lzdGVtL2NwdS9jcHVYL29ubGluZQogCiBROiBXaHkgY2FudCBpIHJlbW92ZSBDUFUwIG9uIHNvbWUgc3lzdGVtcz8KIEE6IFNvbWUgYXJjaGl0ZWN0dXJlcyBtYXkgaGF2ZSBzb21lIHNwZWNpYWwgZGVwZW5kZW5jeSBvbiBhIGNlcnRhaW4gQ1BVLgpAQCAtMjM0LDggKzIzNCw4IEBACiAgICBkZXBhcnR1cmUsIGhvdyB0byBpIGFycmFuZ2UgZm9yIHByb3BlciBub3RpZmljYXRpb24/CiBBOiBUaGlzIGlzIHdoYXQgeW91IHdvdWxkIG5lZWQgaW4geW91ciBrZXJuZWwgY29kZSB0byByZWNlaXZlIG5vdGlmaWNhdGlvbnMuCiAKLSAgICAjaW5jbHVkZSA8bGludXgvY3B1Lmg+Ci0gICAgc3RhdGljIGludCBfX2NwdWluaXQgZm9vYmFyX2NwdV9jYWxsYmFjayhzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKm5mYiwKKwkjaW5jbHVkZSA8bGludXgvY3B1Lmg+CisJc3RhdGljIGludCBfX2NwdWluaXQgZm9vYmFyX2NwdV9jYWxsYmFjayhzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKm5mYiwKIAkJCQkJICAgIHVuc2lnbmVkIGxvbmcgYWN0aW9uLCB2b2lkICpoY3B1KQogCXsKIAkJdW5zaWduZWQgaW50IGNwdSA9ICh1bnNpZ25lZCBsb25nKWhjcHU7CkBAIC0yNzksMTAgKzI3OSwxMCBAQAogQTogWWVzLCBDUFUgbm90aWZpZXJzIGFyZSBjYWxsZWQgb25seSB3aGVuIG5ldyBDUFVzIGFyZSBvbi1saW5lZCBvciBvZmZsaW5lZC4KICAgIElmIHlvdSBuZWVkIHRvIHBlcmZvcm0gc29tZSBhY3Rpb24gZm9yIGVhY2ggY3B1IGFscmVhZHkgaW4gdGhlIHN5c3RlbSwgdGhlbgogCi0gIGZvcl9lYWNoX29ubGluZV9jcHUoaSkgeworCWZvcl9lYWNoX29ubGluZV9jcHUoaSkgewogCQlmb29iYXJfY3B1X2NhbGxiYWNrKCZmb29iYXJfY3B1X25vdGlmaWVyLCBDUFVfVVBfUFJFUEFSRSwgaSk7Ci0JCWZvb2Jhcl9jcHVfY2FsbGJhY2soJmZvb2Jhci1jcHVfbm90aWZpZXIsIENQVV9PTkxJTkUsIGkpOwotICB9CisJCWZvb2Jhcl9jcHVfY2FsbGJhY2soJmZvb2Jhcl9jcHVfbm90aWZpZXIsIENQVV9PTkxJTkUsIGkpOworCX0KIAogUTogSWYgaSB3b3VsZCBsaWtlIHRvIGRldmVsb3AgY3B1IGhvdHBsdWcgc3VwcG9ydCBmb3IgYSBuZXcgYXJjaGl0ZWN0dXJlLAogICAgd2hhdCBkbyBpIG5lZWQgYXQgYSBtaW5pbXVtPwpAQCAtMzA3LDM4ICszMDcsMzggQEAKICAgIHdvcmsgc3BlY2lmaWMgdG8gdGhpcyBjcHUgaXMgaW4gcHJvZ3Jlc3MuCiBBOiBGaXJzdCBzd2l0Y2ggdGhlIGN1cnJlbnQgdGhyZWFkIGNvbnRleHQgdG8gcHJlZmVycmVkIGNwdQogCi0gICBpbnQgbXlfZnVuY19vbl9jcHUoaW50IGNwdSkKLSAgIHsKLSAgICAgICBjcHVtYXNrX3Qgc2F2ZWRfbWFzaywgbmV3X21hc2sgPSBDUFVfTUFTS19OT05FOwotICAgICAgIGludCBjdXJyX2NwdSwgZXJyID0gMDsKKwlpbnQgbXlfZnVuY19vbl9jcHUoaW50IGNwdSkKKwl7CisJCWNwdW1hc2tfdCBzYXZlZF9tYXNrLCBuZXdfbWFzayA9IENQVV9NQVNLX05PTkU7CisJCWludCBjdXJyX2NwdSwgZXJyID0gMDsKIAotICAgICAgIHNhdmVkX21hc2sgPSBjdXJyZW50LT5jcHVzX2FsbG93ZWQ7Ci0gICAgICAgY3B1X3NldChjcHUsIG5ld19tYXNrKTsKLSAgICAgICBlcnIgPSBzZXRfY3B1c19hbGxvd2VkKGN1cnJlbnQsIG5ld19tYXNrKTsKKwkJc2F2ZWRfbWFzayA9IGN1cnJlbnQtPmNwdXNfYWxsb3dlZDsKKwkJY3B1X3NldChjcHUsIG5ld19tYXNrKTsKKwkJZXJyID0gc2V0X2NwdXNfYWxsb3dlZChjdXJyZW50LCBuZXdfbWFzayk7CiAKLSAgICAgICBpZiAoZXJyKQotICAgICAgICAgICByZXR1cm4gZXJyOworCQlpZiAoZXJyKQorCQkJcmV0dXJuIGVycjsKIAotICAgICAgIC8qCi0gICAgICAgICogSWYgd2UgZ290IHNjaGVkdWxlZCBvdXQganVzdCBhZnRlciB0aGUgcmV0dXJuIGZyb20KLSAgICAgICAgKiBzZXRfY3B1c19hbGxvd2VkKCkgYmVmb3JlIHJ1bm5pbmcgdGhlIHdvcmssIHRoaXMgZW5zdXJlcwotICAgICAgICAqIHdlIHN0YXkgbG9ja2VkLgotICAgICAgICAqLwotICAgICAgIGN1cnJfY3B1ID0gZ2V0X2NwdSgpOworCQkvKgorCQkgKiBJZiB3ZSBnb3Qgc2NoZWR1bGVkIG91dCBqdXN0IGFmdGVyIHRoZSByZXR1cm4gZnJvbQorCQkgKiBzZXRfY3B1c19hbGxvd2VkKCkgYmVmb3JlIHJ1bm5pbmcgdGhlIHdvcmssIHRoaXMgZW5zdXJlcworCQkgKiB3ZSBzdGF5IGxvY2tlZC4KKwkJICovCisJCWN1cnJfY3B1ID0gZ2V0X2NwdSgpOwogCi0gICAgICAgaWYgKGN1cnJfY3B1ICE9IGNwdSkgewotCSAgIGVyciA9IC1FQUdBSU47Ci0gICAgICAgICAgIGdvdG8gcmV0OwotICAgICAgIH0gZWxzZSB7Ci0gICAgICAgCSAgIC8qCi0JICAgICogRG8gd29yayA6IEJ1dCBjYW50IHNsZWVwLCBzaW5jZSBnZXRfY3B1KCkgZGlzYWJsZXMgcHJlZW1wdAotCSAgICAqLwotICAgICAgIH0KLSAgICByZXQ6Ci0gICAgCXB1dF9jcHUoKTsKLQlzZXRfY3B1c19hbGxvd2VkKGN1cnJlbnQsIHNhdmVkX21hc2spOwotCXJldHVybiBlcnI7Ci0gICAgfQorCQlpZiAoY3Vycl9jcHUgIT0gY3B1KSB7CisJCQllcnIgPSAtRUFHQUlOOworCQkJZ290byByZXQ7CisJCX0gZWxzZSB7CisJCQkvKgorCQkJICogRG8gd29yayA6IEJ1dCBjYW50IHNsZWVwLCBzaW5jZSBnZXRfY3B1KCkgZGlzYWJsZXMgcHJlZW1wdAorCQkJICovCisJCX0KKwkJcmV0OgorCQkJcHV0X2NwdSgpOworCQkJc2V0X2NwdXNfYWxsb3dlZChjdXJyZW50LCBzYXZlZF9tYXNrKTsKKwkJCXJldHVybiBlcnI7CisJCX0KIAogCiBROiBIb3cgZG8gd2UgZGV0ZXJtaW5lIGhvdyBtYW55IENQVXMgYXJlIGF2YWlsYWJsZSBmb3IgaG90cGx1Zy4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZmVhdHVyZS1yZW1vdmFsLXNjaGVkdWxlLnR4dCBiL0RvY3VtZW50YXRpb24vZmVhdHVyZS1yZW1vdmFsLXNjaGVkdWxlLnR4dAppbmRleCAyNGYzYzYzLi5kNTJjNGFhIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2ZlYXR1cmUtcmVtb3ZhbC1zY2hlZHVsZS50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9mZWF0dXJlLXJlbW92YWwtc2NoZWR1bGUudHh0CkBAIC01MywxOCArNTMsNiBAQAogCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAotV2hhdDoJc3lzX3N5c2N0bAotV2hlbjoJSmFudWFyeSAyMDA3Ci1XaHk6CVRoZSBzYW1lIGluZm9ybWF0aW9uIGlzIGF2YWlsYWJsZSB0aHJvdWdoIC9wcm9jL3N5cyBhbmQgdGhhdCBpcyB0aGUKLQlpbnRlcmZhY2UgdXNlciBzcGFjZSBwcmVmZXJzIHRvIHVzZS4gQW5kIHRoZXJlIGRvIG5vdCBhcHBlYXIgdG8gYmUKLQlhbnkgZXhpc3RpbmcgdXNlciBpbiB1c2VyIHNwYWNlIG9mIHN5c19zeXNjdGwuICBUaGUgYWRkaXRpb25hbAotCW1haW50ZW5hbmNlIG92ZXJoZWFkIG9mIGtlZXBpbmcgYSBzZXQgb2YgYmluYXJ5IG5hbWVzIGdldHMKLQlpbiB0aGUgd2F5IG9mIGRvaW5nIGEgZ29vZCBqb2Igb2YgbWFpbnRhaW5pbmcgdGhpcyBpbnRlcmZhY2UuCi0KLVdobzoJRXJpYyBCaWVkZXJtYW4gPGViaWVkZXJtQHhtaXNzaW9uLmNvbT4KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KIFdoYXQ6CVBDTUNJQSBjb250cm9sIGlvY3RsIChuZWVkZWQgZm9yIHBjbWNpYS1jcyBbY2FyZG1nciwgY2FyZGN0bF0pCiBXaGVuOglOb3ZlbWJlciAyMDA1CiBGaWxlczoJZHJpdmVycy9wY21jaWEvOiBwY21jaWFfaW9jdGwuYwpAQCAtMjU1LDcgKzI0Myw3IEBACiAKIAogV2hhdDoJUEhZU0RFVlBBVEgsIFBIWVNERVZCVVMsIFBIWVNERVZEUklWRVIgaW4gdGhlIHVldmVudCBlbnZpcm9ubWVudAotV2hlbjoJT2t0b2JlciAyMDA4CitXaGVuOglPY3RvYmVyIDIwMDgKIFdoeToJVGhlIHN0YWNraW5nIG9mIGNsYXNzIGRldmljZXMgbWFrZXMgdGhlc2UgdmFsdWVzIG1pc2xlYWRpbmcgYW5kCiAJaW5jb25zaXN0ZW50LgogCUNsYXNzIGRldmljZXMgc2hvdWxkIG5vdCBjYXJyeSBhbnkgb2YgdGhlc2UgcHJvcGVydGllcywgYW5kIGJ1cwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9maWxlc3lzdGVtcy8wMC1JTkRFWCBiL0RvY3VtZW50YXRpb24vZmlsZXN5c3RlbXMvMDAtSU5ERVgKaW5kZXggM2MzODRjMC4uNGRjMjhjYyAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9maWxlc3lzdGVtcy8wMC1JTkRFWAorKysgYi9Eb2N1bWVudGF0aW9uL2ZpbGVzeXN0ZW1zLzAwLUlOREVYCkBAIC0zNCw2ICszNCw4IEBACiAJLSBpbmZvLCBtb3VudCBvcHRpb25zIGFuZCBzcGVjaWZpY2F0aW9ucyBmb3IgdGhlIEV4dDIgZmlsZXN5c3RlbS4KIGV4dDMudHh0CiAJLSBpbmZvLCBtb3VudCBvcHRpb25zIGFuZCBzcGVjaWZpY2F0aW9ucyBmb3IgdGhlIEV4dDMgZmlsZXN5c3RlbS4KK2V4dDQudHh0CisJLSBpbmZvLCBtb3VudCBvcHRpb25zIGFuZCBzcGVjaWZpY2F0aW9ucyBmb3IgdGhlIEV4dDQgZmlsZXN5c3RlbS4KIGZpbGVzLnR4dAogCS0gaW5mbyBvbiBmaWxlIG1hbmFnZW1lbnQgaW4gdGhlIExpbnV4IGtlcm5lbC4KIGZ1c2UudHh0CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2ZpbGVzeXN0ZW1zL2V4dDQudHh0IGIvRG9jdW1lbnRhdGlvbi9maWxlc3lzdGVtcy9leHQ0LnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YTRhZGNhCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9maWxlc3lzdGVtcy9leHQ0LnR4dApAQCAtMCwwICsxLDIzNiBAQAorCitFeHQ0IEZpbGVzeXN0ZW0KKz09PT09PT09PT09PT09PQorCitUaGlzIGlzIGEgZGV2ZWxvcG1lbnQgdmVyc2lvbiBvZiB0aGUgZXh0NCBmaWxlc3lzdGVtLCBhbiBhZHZhbmNlZCBsZXZlbAorb2YgdGhlIGV4dDMgZmlsZXN5c3RlbSB3aGljaCBpbmNvcnBvcmF0ZXMgc2NhbGFiaWxpdHkgYW5kIHJlbGlhYmlsaXR5CitlbmhhbmNlbWVudHMgZm9yIHN1cHBvcnRpbmcgbGFyZ2UgZmlsZXN5c3RlbXMgKDY0IGJpdCkgaW4ga2VlcGluZyB3aXRoCitpbmNyZWFzaW5nIGRpc2sgY2FwYWNpdGllcyBhbmQgc3RhdGUtb2YtdGhlLWFydCBmZWF0dXJlIHJlcXVpcmVtZW50cy4KKworTWFpbGluZyBsaXN0OiBsaW51eC1leHQ0QHZnZXIua2VybmVsLm9yZworCisKKzEuIFF1aWNrIHVzYWdlIGluc3RydWN0aW9uczoKKz09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgIC0gR3JhYiB1cGRhdGVkIGUyZnNwcm9ncyBmcm9tCisgICAgZnRwOi8vZnRwLmtlcm5lbC5vcmcvcHViL2xpbnV4L2tlcm5lbC9wZW9wbGUvdHl0c28vZTJmc3Byb2dzLWludGVyaW0vCisgICAgVGhpcyBpcyBhIHBhdGNoc2V0IG9uIHRvcCBvZiBlMmZzcHJvZ3MtMS4zOSwgd2hpY2ggY2FuIGJlIGZvdW5kIGF0CisgICAgZnRwOi8vZnRwLmtlcm5lbC5vcmcvcHViL2xpbnV4L2tlcm5lbC9wZW9wbGUvdHl0c28vZTJmc3Byb2dzLworCisgIC0gSXQncyBzdGlsbCBta2UyZnMgLWogL2Rldi9oZGExCisKKyAgLSBtb3VudCAvZGV2L2hkYTEgL3doZXJldmVyIC10IGV4dDRkZXYKKworICAtIFRvIGVuYWJsZSBleHRlbnRzLAorCisJbW91bnQgL2Rldi9oZGExIC93aGVyZXZlciAtdCBleHQ0ZGV2IC1vIGV4dGVudHMKKworICAtIFRoZSBmaWxlc3lzdGVtIGlzIGNvbXBhdGlibGUgd2l0aCB0aGUgZXh0MyBkcml2ZXIgdW50aWwgeW91IGFkZCBhIGZpbGUKKyAgICB3aGljaCBoYXMgZXh0ZW50cyAoaWU6IGBtb3VudCAtbyBleHRlbnRzJywgdGhlbiBjcmVhdGUgYSBmaWxlKS4KKworICAgIE5PVEU6IFRoZSAiZXh0ZW50cyIgbW91bnQgZmxhZyBpcyB0ZW1wb3JhcnkuICBJdCB3aWxsIHNvb24gZ28gYXdheSBhbmQKKyAgICBleHRlbnRzIHdpbGwgYmUgZW5hYmxlZCBieSB0aGUgIi1vIGV4dGVudHMiIGZsYWcgdG8gbWtlMmZzIG9yIHR1bmUyZnMKKworICAtIFdoZW4gY29tcGFyaW5nIHBlcmZvcm1hbmNlIHdpdGggb3RoZXIgZmlsZXN5c3RlbXMsIHJlbWVtYmVyIHRoYXQKKyAgICBleHQzLzQgYnkgZGVmYXVsdCBvZmZlcnMgaGlnaGVyIGRhdGEgaW50ZWdyaXR5IGd1YXJhbnRlZXMgdGhhbiBtb3N0LiAgU28KKyAgICB3aGVuIGNvbXBhcmluZyB3aXRoIGEgbWV0YWRhdGEtb25seSBqb3VybmFsbGluZyBmaWxlc3lzdGVtLCB1c2UgYG1vdW50IC1vCisgICAgZGF0YT13cml0ZWJhY2snLiAgQW5kIHlvdSBtaWdodCBhcyB3ZWxsIHVzZSBgbW91bnQgLW8gbm9iaCcgdG9vIGFsb25nCisgICAgd2l0aCBpdC4gIE1ha2luZyB0aGUgam91cm5hbCBsYXJnZXIgdGhhbiB0aGUgbWtlMmZzIGRlZmF1bHQgb2Z0ZW4gaGVscHMKKyAgICBwZXJmb3JtYW5jZSB3aXRoIG1ldGFkYXRhLWludGVuc2l2ZSB3b3JrbG9hZHMuCisKKzIuIEZlYXR1cmVzCis9PT09PT09PT09PQorCisyLjEgQ3VycmVudGx5IGF2YWlsYWJsZQorCisqIGFiaWxpdHkgdG8gdXNlIGZpbGVzeXN0ZW1zID4gMTZUQgorKiBleHRlbnQgZm9ybWF0IHJlZHVjZXMgbWV0YWRhdGEgb3ZlcmhlYWQgKFJBTSwgSU8gZm9yIGFjY2VzcywgdHJhbnNhY3Rpb25zKQorKiBleHRlbnQgZm9ybWF0IG1vcmUgcm9idXN0IGluIGZhY2Ugb2Ygb24tZGlzayBjb3JydXB0aW9uIGR1ZSB0byBtYWdpY3MsCisqIGludGVybmFsIHJlZHVuYW5jeSBpbiB0cmVlCisKKzIuMSBQcmV2aW91c2x5IGF2YWlsYWJsZSwgc29vbiB0byBiZSBlbmFibGVkIGJ5IGRlZmF1bHQgYnkgIm1rZWZzLmV4dDQiOgorCisqIGRpcl9pbmRleCBhbmQgcmVzaXplIGlub2RlIHdpbGwgYmUgb24gYnkgZGVmYXVsdAorKiBsYXJnZSBpbm9kZXMgd2lsbCBiZSB1c2VkIGJ5IGRlZmF1bHQgZm9yIGZhc3QgRUFzLCBuc2VjIHRpbWVzdGFtcHMsIGV0YworCisyLjIgQ2FuZGlkYXRlIGZlYXR1cmVzIGZvciBmdXR1cmUgaW5jbHVzaW9uCisKK1RoZXJlIGFyZSBzZXZlcmFsIHVuZGVyIGRpc2N1c3Npb24sIHdoZXRoZXIgdGhleSBhbGwgbWFrZSBpdCBpbiBpcworcGFydGx5IGEgZnVuY3Rpb24gb2YgaG93IG11Y2ggdGltZSBldmVyeW9uZSBoYXMgdG8gd29yayBvbiB0aGVtOgorCisqIGltcHJvdmVkIGZpbGUgYWxsb2NhdGlvbiAobXVsdGktYmxvY2sgYWxsb2MsIGRlbGF5ZWQgYWxsb2M7IGJhc2ljYWxseSBkb25lKQorKiBmaXggMzIwMDAgc3ViZGlyZWN0b3J5IGxpbWl0IChwYXRjaCBleGlzdHMsIG5lZWRzIHNvbWUgZTJmc2NrIHdvcmspCisqIG5zZWMgdGltZXN0YW1wcyBmb3IgbXRpbWUsIGF0aW1lLCBjdGltZSwgY3JlYXRlIHRpbWUgKHBhdGNoIGV4aXN0cywKKyAgbmVlZHMgc29tZSBlMmZzY2sgd29yaykKKyogaW5vZGUgdmVyc2lvbiBmaWVsZCBvbiBkaXNrIChORlN2NCwgTHVzdHJlOyBwcm90b3R5cGUgZXhpc3RzKQorKiByZWR1Y2VkIG1rZTJmcy9lMmZzY2sgdGltZSB2aWEgdW5pbml0aWFsaXplZCBncm91cHMgKHByb3RvdHlwZSBleGlzdHMpCisqIGpvdXJuYWwgY2hlY2tzdW1taW5nIGZvciByb2J1c3RuZXNzLCBwZXJmb3JtYW5jZSAocHJvdG90eXBlIGV4aXN0cykKKyogcGVyc2lzdGVudCBmaWxlIHByZWFsbG9jYXRpb24gKGUuZyBmb3Igc3RyZWFtaW5nIG1lZGlhLCBkYXRhYmFzZXMpCisKK0ZlYXR1cmVzIGxpa2UgbWV0YWRhdGEgY2hlY2tzdW1taW5nIGhhdmUgYmVlbiBkaXNjdXNzZWQgYW5kIHBsYW5uZWQgZm9yCithIGJpdCBidXQgbm8gcGF0Y2hlcyBleGlzdCB5ZXQgc28gSSdtIG5vdCBzdXJlIHRoZXkncmUgaW4gdGhlIG5lYXItdGVybQorcm9hZG1hcC4KKworVGhlIGJpZyBwZXJmb3JtYW5jZSB3aW4gd2lsbCBjb21lIHdpdGggbWJhbGxvYyBhbmQgZGVsYWxsb2MuICBDRlMgaGFzCitiZWVuIHVzaW5nIG1iYWxsb2MgZm9yIGEgZmV3IHllYXJzIGFscmVhZHkgd2l0aCBMdXN0cmUsIGFuZCBJQk0gKyBCdWxsCitkaWQgYSBsb3Qgb2YgYmVuY2htYXJraW5nIG9uIGl0LiAgVGhlIHJlYXNvbiBpdCBpc24ndCBpbiB0aGUgZmlyc3Qgc2V0IG9mCitwYXRjaGVzIGlzIHBhcnRseSBhIG1hbmFnZWFiaWxpdHkgaXNzdWUsIGFuZCBwYXJ0bHkgYmVjYXVzZSBpdCBkb2Vzbid0CitkaXJlY3RseSBhZmZlY3QgdGhlIG9uLWRpc2sgZm9ybWF0IChvdXRzaWRlIG9mIG11Y2ggYmV0dGVyIGFsbG9jYXRpb24pCitzbyBpdCBpc24ndCBjcml0aWNhbCB0byBnZXQgaW50byB0aGUgZmlyc3Qgcm91bmQgb2YgY2hhbmdlcy4gIEkgYmVsaWV2ZQorQWxleCBpcyB3b3JraW5nIG9uIGEgbmV3IHNldCBvZiBwYXRjaGVzIHJpZ2h0IG5vdy4KKworMy4gT3B0aW9ucworPT09PT09PT09PQorCitXaGVuIG1vdW50aW5nIGFuIGV4dDQgZmlsZXN5c3RlbSwgdGhlIGZvbGxvd2luZyBvcHRpb24gYXJlIGFjY2VwdGVkOgorKCopID09IGRlZmF1bHQKKworZXh0ZW50cwkJCWV4dDQgd2lsbCB1c2UgZXh0ZW50cyB0byBhZGRyZXNzIGZpbGUgZGF0YS4gIFRoZQorCQkJZmlsZSBzeXN0ZW0gd2lsbCBubyBsb25nZXIgYmUgbW91bnRhYmxlIGJ5IGV4dDMuCisKK2pvdXJuYWw9dXBkYXRlCQlVcGRhdGUgdGhlIGV4dDQgZmlsZSBzeXN0ZW0ncyBqb3VybmFsIHRvIHRoZSBjdXJyZW50CisJCQlmb3JtYXQuCisKK2pvdXJuYWw9aW51bQkJV2hlbiBhIGpvdXJuYWwgYWxyZWFkeSBleGlzdHMsIHRoaXMgb3B0aW9uIGlzIGlnbm9yZWQuCisJCQlPdGhlcndpc2UsIGl0IHNwZWNpZmllcyB0aGUgbnVtYmVyIG9mIHRoZSBpbm9kZSB3aGljaAorCQkJd2lsbCByZXByZXNlbnQgdGhlIGV4dDQgZmlsZSBzeXN0ZW0ncyBqb3VybmFsIGZpbGUuCisKK2pvdXJuYWxfZGV2PWRldm51bQlXaGVuIHRoZSBleHRlcm5hbCBqb3VybmFsIGRldmljZSdzIG1ham9yL21pbm9yIG51bWJlcnMKKwkJCWhhdmUgY2hhbmdlZCwgdGhpcyBvcHRpb24gYWxsb3dzIHRoZSB1c2VyIHRvIHNwZWNpZnkKKwkJCXRoZSBuZXcgam91cm5hbCBsb2NhdGlvbi4gIFRoZSBqb3VybmFsIGRldmljZSBpcworCQkJaWRlbnRpZmllZCB0aHJvdWdoIGl0cyBuZXcgbWFqb3IvbWlub3IgbnVtYmVycyBlbmNvZGVkCisJCQlpbiBkZXZudW0uCisKK25vbG9hZAkJCURvbid0IGxvYWQgdGhlIGpvdXJuYWwgb24gbW91bnRpbmcuCisKK2RhdGE9am91cm5hbAkJQWxsIGRhdGEgYXJlIGNvbW1pdHRlZCBpbnRvIHRoZSBqb3VybmFsIHByaW9yIHRvIGJlaW5nCisJCQl3cml0dGVuIGludG8gdGhlIG1haW4gZmlsZSBzeXN0ZW0uCisKK2RhdGE9b3JkZXJlZAkoKikJQWxsIGRhdGEgYXJlIGZvcmNlZCBkaXJlY3RseSBvdXQgdG8gdGhlIG1haW4gZmlsZQorCQkJc3lzdGVtIHByaW9yIHRvIGl0cyBtZXRhZGF0YSBiZWluZyBjb21taXR0ZWQgdG8gdGhlCisJCQlqb3VybmFsLgorCitkYXRhPXdyaXRlYmFjawkJRGF0YSBvcmRlcmluZyBpcyBub3QgcHJlc2VydmVkLCBkYXRhIG1heSBiZSB3cml0dGVuCisJCQlpbnRvIHRoZSBtYWluIGZpbGUgc3lzdGVtIGFmdGVyIGl0cyBtZXRhZGF0YSBoYXMgYmVlbgorCQkJY29tbWl0dGVkIHRvIHRoZSBqb3VybmFsLgorCitjb21taXQ9bnJzZWMJKCopCUV4dDQgY2FuIGJlIHRvbGQgdG8gc3luYyBhbGwgaXRzIGRhdGEgYW5kIG1ldGFkYXRhCisJCQlldmVyeSAnbnJzZWMnIHNlY29uZHMuIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDUgc2Vjb25kcy4KKwkJCVRoaXMgbWVhbnMgdGhhdCBpZiB5b3UgbG9zZSB5b3VyIHBvd2VyLCB5b3Ugd2lsbCBsb3NlCisJCQlhcyBtdWNoIGFzIHRoZSBsYXRlc3QgNSBzZWNvbmRzIG9mIHdvcmsgKHlvdXIKKwkJCWZpbGVzeXN0ZW0gd2lsbCBub3QgYmUgZGFtYWdlZCB0aG91Z2gsIHRoYW5rcyB0byB0aGUKKwkJCWpvdXJuYWxpbmcpLiAgVGhpcyBkZWZhdWx0IHZhbHVlIChvciBhbnkgbG93IHZhbHVlKQorCQkJd2lsbCBodXJ0IHBlcmZvcm1hbmNlLCBidXQgaXQncyBnb29kIGZvciBkYXRhLXNhZmV0eS4KKwkJCVNldHRpbmcgaXQgdG8gMCB3aWxsIGhhdmUgdGhlIHNhbWUgZWZmZWN0IGFzIGxlYXZpbmcKKwkJCWl0IGF0IHRoZSBkZWZhdWx0ICg1IHNlY29uZHMpLgorCQkJU2V0dGluZyBpdCB0byB2ZXJ5IGxhcmdlIHZhbHVlcyB3aWxsIGltcHJvdmUKKwkJCXBlcmZvcm1hbmNlLgorCitiYXJyaWVyPTEJCVRoaXMgZW5hYmxlcy9kaXNhYmxlcyBiYXJyaWVycy4gIGJhcnJpZXI9MCBkaXNhYmxlcworCQkJaXQsIGJhcnJpZXI9MSBlbmFibGVzIGl0LgorCitvcmxvdgkJKCopCVRoaXMgZW5hYmxlcyB0aGUgbmV3IE9ybG92IGJsb2NrIGFsbG9jYXRvci4gSXQgaXMKKwkJCWVuYWJsZWQgYnkgZGVmYXVsdC4KKworb2xkYWxsb2MJCVRoaXMgZGlzYWJsZXMgdGhlIE9ybG92IGJsb2NrIGFsbG9jYXRvciBhbmQgZW5hYmxlcworCQkJdGhlIG9sZCBibG9jayBhbGxvY2F0b3IuICBPcmxvdiBzaG91bGQgaGF2ZSBiZXR0ZXIKKwkJCXBlcmZvcm1hbmNlIC0gd2UnZCBsaWtlIHRvIGdldCBzb21lIGZlZWRiYWNrIGlmIGl0J3MKKwkJCXRoZSBjb250cmFyeSBmb3IgeW91LgorCit1c2VyX3hhdHRyCQlFbmFibGVzIEV4dGVuZGVkIFVzZXIgQXR0cmlidXRlcy4gIEFkZGl0aW9uYWxseSwgeW91CisJCQluZWVkIHRvIGhhdmUgZXh0ZW5kZWQgYXR0cmlidXRlIHN1cHBvcnQgZW5hYmxlZCBpbiB0aGUKKwkJCWtlcm5lbCBjb25maWd1cmF0aW9uIChDT05GSUdfRVhUNF9GU19YQVRUUikuICBTZWUgdGhlCisJCQlhdHRyKDUpIG1hbnVhbCBwYWdlIGFuZCBodHRwOi8vYWNsLmJlc3RiaXRzLmF0LyB0bworCQkJbGVhcm4gbW9yZSBhYm91dCBleHRlbmRlZCBhdHRyaWJ1dGVzLgorCitub3VzZXJfeGF0dHIJCURpc2FibGVzIEV4dGVuZGVkIFVzZXIgQXR0cmlidXRlcy4KKworYWNsCQkJRW5hYmxlcyBQT1NJWCBBY2Nlc3MgQ29udHJvbCBMaXN0cyBzdXBwb3J0LgorCQkJQWRkaXRpb25hbGx5LCB5b3UgbmVlZCB0byBoYXZlIEFDTCBzdXBwb3J0IGVuYWJsZWQgaW4KKwkJCXRoZSBrZXJuZWwgY29uZmlndXJhdGlvbiAoQ09ORklHX0VYVDRfRlNfUE9TSVhfQUNMKS4KKwkJCVNlZSB0aGUgYWNsKDUpIG1hbnVhbCBwYWdlIGFuZCBodHRwOi8vYWNsLmJlc3RiaXRzLmF0LworCQkJZm9yIG1vcmUgaW5mb3JtYXRpb24uCisKK25vYWNsCQkJVGhpcyBvcHRpb24gZGlzYWJsZXMgUE9TSVggQWNjZXNzIENvbnRyb2wgTGlzdAorCQkJc3VwcG9ydC4KKworcmVzZXJ2YXRpb24KKworbm9yZXNlcnZhdGlvbgorCitic2RkZgkJKCopCU1ha2UgJ2RmJyBhY3QgbGlrZSBCU0QuCittaW5peGRmCQkJTWFrZSAnZGYnIGFjdCBsaWtlIE1pbml4LgorCitjaGVjaz1ub25lCQlEb24ndCBkbyBleHRyYSBjaGVja2luZyBvZiBiaXRtYXBzIG9uIG1vdW50Lgorbm9jaGVjaworCitkZWJ1ZwkJCUV4dHJhIGRlYnVnZ2luZyBpbmZvcm1hdGlvbiBpcyBzZW50IHRvIHN5c2xvZy4KKworZXJyb3JzPXJlbW91bnQtcm8oKikJUmVtb3VudCB0aGUgZmlsZXN5c3RlbSByZWFkLW9ubHkgb24gYW4gZXJyb3IuCitlcnJvcnM9Y29udGludWUJCUtlZXAgZ29pbmcgb24gYSBmaWxlc3lzdGVtIGVycm9yLgorZXJyb3JzPXBhbmljCQlQYW5pYyBhbmQgaGFsdCB0aGUgbWFjaGluZSBpZiBhbiBlcnJvciBvY2N1cnMuCisKK2dycGlkCQkJR2l2ZSBvYmplY3RzIHRoZSBzYW1lIGdyb3VwIElEIGFzIHRoZWlyIGNyZWF0b3IuCitic2Rncm91cHMKKworbm9ncnBpZAkJKCopCU5ldyBvYmplY3RzIGhhdmUgdGhlIGdyb3VwIElEIG9mIHRoZWlyIGNyZWF0b3IuCitzeXN2Z3JvdXBzCisKK3Jlc2dpZD1uCQlUaGUgZ3JvdXAgSUQgd2hpY2ggbWF5IHVzZSB0aGUgcmVzZXJ2ZWQgYmxvY2tzLgorCityZXN1aWQ9bgkJVGhlIHVzZXIgSUQgd2hpY2ggbWF5IHVzZSB0aGUgcmVzZXJ2ZWQgYmxvY2tzLgorCitzYj1uCQkJVXNlIGFsdGVybmF0ZSBzdXBlcmJsb2NrIGF0IHRoaXMgbG9jYXRpb24uCisKK3F1b3RhCitub3F1b3RhCitncnBxdW90YQordXNycXVvdGEKKworYmgJCSgqKQlleHQ0IGFzc29jaWF0ZXMgYnVmZmVyIGhlYWRzIHRvIGRhdGEgcGFnZXMgdG8KK25vYmgJCQkoYSkgY2FjaGUgZGlzayBibG9jayBtYXBwaW5nIGluZm9ybWF0aW9uCisJCQkoYikgbGluayBwYWdlcyBpbnRvIHRyYW5zYWN0aW9uIHRvIHByb3ZpZGUKKwkJCSAgICBvcmRlcmluZyBndWFyYW50ZWVzLgorCQkJImJoIiBvcHRpb24gZm9yY2VzIHVzZSBvZiBidWZmZXIgaGVhZHMuCisJCQkibm9iaCIgb3B0aW9uIHRyaWVzIHRvIGF2b2lkIGFzc29jaWF0aW5nIGJ1ZmZlcgorCQkJaGVhZHMgKHN1cHBvcnRlZCBvbmx5IGZvciAid3JpdGViYWNrIiBtb2RlKS4KKworCitEYXRhIE1vZGUKKy0tLS0tLS0tLQorVGhlcmUgYXJlIDMgZGlmZmVyZW50IGRhdGEgbW9kZXM6CisKKyogd3JpdGViYWNrIG1vZGUKK0luIGRhdGE9d3JpdGViYWNrIG1vZGUsIGV4dDQgZG9lcyBub3Qgam91cm5hbCBkYXRhIGF0IGFsbC4gIFRoaXMgbW9kZSBwcm92aWRlcworYSBzaW1pbGFyIGxldmVsIG9mIGpvdXJuYWxpbmcgYXMgdGhhdCBvZiBYRlMsIEpGUywgYW5kIFJlaXNlckZTIGluIGl0cyBkZWZhdWx0Cittb2RlIC0gbWV0YWRhdGEgam91cm5hbGluZy4gIEEgY3Jhc2grcmVjb3ZlcnkgY2FuIGNhdXNlIGluY29ycmVjdCBkYXRhIHRvCithcHBlYXIgaW4gZmlsZXMgd2hpY2ggd2VyZSB3cml0dGVuIHNob3J0bHkgYmVmb3JlIHRoZSBjcmFzaC4gIFRoaXMgbW9kZSB3aWxsCit0eXBpY2FsbHkgcHJvdmlkZSB0aGUgYmVzdCBleHQ0IHBlcmZvcm1hbmNlLgorCisqIG9yZGVyZWQgbW9kZQorSW4gZGF0YT1vcmRlcmVkIG1vZGUsIGV4dDQgb25seSBvZmZpY2lhbGx5IGpvdXJuYWxzIG1ldGFkYXRhLCBidXQgaXQgbG9naWNhbGx5Citncm91cHMgbWV0YWRhdGEgYW5kIGRhdGEgYmxvY2tzIGludG8gYSBzaW5nbGUgdW5pdCBjYWxsZWQgYSB0cmFuc2FjdGlvbi4gIFdoZW4KK2l0J3MgdGltZSB0byB3cml0ZSB0aGUgbmV3IG1ldGFkYXRhIG91dCB0byBkaXNrLCB0aGUgYXNzb2NpYXRlZCBkYXRhIGJsb2NrcworYXJlIHdyaXR0ZW4gZmlyc3QuICBJbiBnZW5lcmFsLCB0aGlzIG1vZGUgcGVyZm9ybXMgc2xpZ2h0bHkgc2xvd2VyIHRoYW4KK3dyaXRlYmFjayBidXQgc2lnbmlmaWNhbnRseSBmYXN0ZXIgdGhhbiBqb3VybmFsIG1vZGUuCisKKyogam91cm5hbCBtb2RlCitkYXRhPWpvdXJuYWwgbW9kZSBwcm92aWRlcyBmdWxsIGRhdGEgYW5kIG1ldGFkYXRhIGpvdXJuYWxpbmcuICBBbGwgbmV3IGRhdGEgaXMKK3dyaXR0ZW4gdG8gdGhlIGpvdXJuYWwgZmlyc3QsIGFuZCB0aGVuIHRvIGl0cyBmaW5hbCBsb2NhdGlvbi4KK0luIHRoZSBldmVudCBvZiBhIGNyYXNoLCB0aGUgam91cm5hbCBjYW4gYmUgcmVwbGF5ZWQsIGJyaW5naW5nIGJvdGggZGF0YSBhbmQKK21ldGFkYXRhIGludG8gYSBjb25zaXN0ZW50IHN0YXRlLiAgVGhpcyBtb2RlIGlzIHRoZSBzbG93ZXN0IGV4Y2VwdCB3aGVuIGRhdGEKK25lZWRzIHRvIGJlIHJlYWQgZnJvbSBhbmQgd3JpdHRlbiB0byBkaXNrIGF0IHRoZSBzYW1lIHRpbWUgd2hlcmUgaXQKK291dHBlcmZvcm1zIGFsbCBvdGhlcnMgbW9kZXMuCisKK1JlZmVyZW5jZXMKKz09PT09PT09PT0KKwora2VybmVsIHNvdXJjZToJPGZpbGU6ZnMvZXh0NC8+CisJCTxmaWxlOmZzL2piZDIvPgorCitwcm9ncmFtczoJaHR0cDovL2UyZnNwcm9ncy5zb3VyY2Vmb3JnZS5uZXQvCisJCWh0dHA6Ly9leHQycmVzaXplLnNvdXJjZWZvcmdlLm5ldAorCit1c2VmdWwgbGlua3M6CWh0dHA6Ly9mZWRvcmFwcm9qZWN0Lm9yZy93aWtpL2V4dDMtZGV2ZWwKKwkJaHR0cDovL3d3dy5idWxsb3BlbnNvdXJjZS5vcmcvZXh0NC8KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZmlsZXN5c3RlbXMvdWRmLnR4dCBiL0RvY3VtZW50YXRpb24vZmlsZXN5c3RlbXMvdWRmLnR4dAppbmRleCA1MTFiNDIzLi5mZGU4MjlhIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2ZpbGVzeXN0ZW1zL3VkZi50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9maWxlc3lzdGVtcy91ZGYudHh0CkBAIC03LDggKzcsMTcgQEAKIHBsZWFzZSByZXBvcnQgdGhlbSB0byBsaW51eF91ZGZAaHBlc2pyby5mYy5ocC5jb20sIHdoaWNoIGlzIHRoZQogZGV2ZWxvcGVyJ3MgbGlzdC4KIAotV3JpdGUgc3VwcG9ydCByZXF1aXJlcyBhIGJsb2NrIGRyaXZlciB3aGljaCBzdXBwb3J0cyB3cml0aW5nLiBUaGUgY3VycmVudAotc2NzaSBhbmQgaWRlIGNkcm9tIGRyaXZlcnMgZG8gbm90IHN1cHBvcnQgd3JpdGluZy4KK1dyaXRlIHN1cHBvcnQgcmVxdWlyZXMgYSBibG9jayBkcml2ZXIgd2hpY2ggc3VwcG9ydHMgd3JpdGluZy4gIEN1cnJlbnRseQorZHZkK3J3IGRyaXZlcyBhbmQgbWVkaWEgc3VwcG9ydCB0cnVlIHJhbmRvbSBzZWN0b3Igd3JpdGVzLCBhbmQgc28gYSB1ZGYKK2ZpbGVzeXN0ZW0gb24gc3VjaCBkZXZpY2VzIGNhbiBiZSBkaXJlY3RseSBtb3VudGVkIHJlYWQvd3JpdGUuICBDRC1SVworbWVkaWEgaG93ZXZlciwgZG9lcyBub3Qgc3VwcG9ydCB0aGlzLiAgSW5zdGVhZCB0aGUgbWVkaWEgY2FuIGJlIGZvcm1hdHRlZAorZm9yIHBhY2tldCBtb2RlIHVzaW5nIHRoZSB1dGlsaXR5IGNkcnd0b29sLCB0aGVuIHRoZSBwa3RjZHZkIGRyaXZlciBjYW4KK2JlIGJvdW5kIHRvIHRoZSB1bmRlcmx5aW5nIGNkIGRldmljZSB0byBwcm92aWRlIHRoZSByZXF1aXJlZCBidWZmZXJpbmcKK2FuZCByZWFkLW1vZGlmeS13cml0ZSBjeWNsZXMgdG8gYWxsb3cgdGhlIGZpbGVzeXN0ZW0gcmFuZG9tIHNlY3RvciB3cml0ZXMKK3doaWxlIHByb3ZpZGluZyB0aGUgaGFyZHdhcmUgd2l0aCBvbmx5IGZ1bGwgcGFja2V0IHdyaXRlcy4gIFdoaWxlIG5vdAorcmVxdWlyZWQgZm9yIGR2ZCtydyBtZWRpYSwgdXNlIG9mIHRoZSBwa3RjZHZkIGRyaXZlciBvZnRlbiBlbmhhbmNlcworcGVyZm9ybWFuY2UgZHVlIHRvIHZlcnkgcG9vciByZWFkLW1vZGlmeS13cml0ZSBzdXBwb3J0IHN1cHBsaWVkIGludGVybmFsbHkKK2J5IGRyaXZlIGZpcm13YXJlLgogCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiBUaGUgZm9sbG93aW5nIG1vdW50IG9wdGlvbnMgYXJlIHN1cHBvcnRlZDoKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vaHdtb24vYWRtOTI0MCBiL0RvY3VtZW50YXRpb24vaHdtb24vYWRtOTI0MAppbmRleCAzNWY2MThmLi4yYzZmMWZlIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2h3bW9uL2FkbTkyNDAKKysrIGIvRG9jdW1lbnRhdGlvbi9od21vbi9hZG05MjQwCkBAIC0yNCw3ICsyNCw3IEBACiAgICAgRnJvZG8gTG9vaWphYXJkIDxmcm9kb2xAZGRzLm5sPiwKICAgICBQaGlsaXAgRWRlbGJyb2NrIDxwaGlsQG5ldHJvZWRnZS5jb20+LAogICAgIE1pY2hpZWwgUm9vayA8bWljaGllbEBncmVuZGVscHJvamVjdC5ubD4sCi0gICAgR3JhbnQgQ29hZHkgPGdjb2FkeUBnbWFpbC5jb20+IHdpdGggZ3VpZGFuY2UKKyAgICBHcmFudCBDb2FkeSA8Z2NvYWR5LmxrQGdtYWlsLmNvbT4gd2l0aCBndWlkYW5jZQogICAgICAgICBmcm9tIEplYW4gRGVsdmFyZSA8a2hhbGlAbGludXgtZnIub3JnPgogCiBJbnRlcmZhY2UKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vaHdtb24vZjcxODA1ZiBiL0RvY3VtZW50YXRpb24vaHdtb24vZjcxODA1ZgppbmRleCAyOGM1YjdkLi4yY2E2OWRmIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2h3bW9uL2Y3MTgwNWYKKysrIGIvRG9jdW1lbnRhdGlvbi9od21vbi9mNzE4MDVmCkBAIC0xNyw3ICsxNyw3IEBACiBwcm92aWRpbmcgYWRkaXRpb25hbCBkb2N1bWVudGF0aW9uLgogCiBUaGFua3MgdG8gQ2hyaXMgTGluIGZyb20gSmV0d2F5IGZvciBwcm92aWRpbmcgd2lyaW5nIHNjaGVtYXRpY3MgYW5kCi1hbndzZXJpbmcgdGVjaG5pY2FsIHF1ZXN0aW9ucy4KK2Fuc3dlcmluZyB0ZWNobmljYWwgcXVlc3Rpb25zLgogCiAKIERlc2NyaXB0aW9uCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2h3bW9uL2s4dGVtcCBiL0RvY3VtZW50YXRpb24vaHdtb24vazh0ZW1wCmluZGV4IGJhYjQ0NWEuLjMwZDEyM2IgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vaHdtb24vazh0ZW1wCisrKyBiL0RvY3VtZW50YXRpb24vaHdtb24vazh0ZW1wCkBAIC0yLDcgKzIsNyBAQAogPT09PT09PT09PT09PT09PT09PT0KIAogU3VwcG9ydGVkIGNoaXBzOgotICAqIEFNRCBLOCBDUFUKKyAgKiBBTUQgQXRobG9uNjQvRlggb3IgT3B0ZXJvbiBDUFVzCiAgICAgUHJlZml4OiAnazh0ZW1wJwogICAgIEFkZHJlc3NlcyBzY2FubmVkOiBQQ0kgc3BhY2UKICAgICBEYXRhc2hlZXQ6IGh0dHA6Ly93d3cuYW1kLmNvbS91cy1lbi9hc3NldHMvY29udGVudF90eXBlL3doaXRlX3BhcGVyc19hbmRfdGVjaF9kb2NzLzMyNTU5LnBkZgpAQCAtMTMsMTAgKzEzLDEzIEBACiBEZXNjcmlwdGlvbgogLS0tLS0tLS0tLS0KIAotVGhpcyBkcml2ZXIgcGVybWl0cyByZWFkaW5nIHRlbXBlcmF0dXJlIHNlbnNvcihzKSBlbWJlZGRlZCBpbnNpZGUgQU1EIEs4IENQVXMuCi1PZmZpY2lhbCBkb2N1bWVudGF0aW9uIHNheXMgdGhhdCBpdCB3b3JrcyBmcm9tIHJldmlzaW9uIEYgb2YgSzggY29yZSwgYnV0Ci1pbiBmYWN0IGl0IHNlZW1zIHRvIGJlIGltcGxlbWVudGVkIGZvciBhbGwgcmV2aXNpb25zIG9mIEs4IGV4Y2VwdCB0aGUgZmlyc3QKLXR3byByZXZpc2lvbnMgKFNILUIwIGFuZCBTSC1CMykuCitUaGlzIGRyaXZlciBwZXJtaXRzIHJlYWRpbmcgdGVtcGVyYXR1cmUgc2Vuc29yKHMpIGVtYmVkZGVkIGluc2lkZSBBTUQgSzgKK2ZhbWlseSBDUFVzIChBdGhsb242NC9GWCwgT3B0ZXJvbikuIE9mZmljaWFsIGRvY3VtZW50YXRpb24gc2F5cyB0aGF0IGl0IHdvcmtzCitmcm9tIHJldmlzaW9uIEYgb2YgSzggY29yZSwgYnV0IGluIGZhY3QgaXQgc2VlbXMgdG8gYmUgaW1wbGVtZW50ZWQgZm9yIGFsbAorcmV2aXNpb25zIG9mIEs4IGV4Y2VwdCB0aGUgZmlyc3QgdHdvIHJldmlzaW9ucyAoU0gtQjAgYW5kIFNILUIzKS4KKworUGxlYXNlIG5vdGUgdGhhdCB5b3Ugd2lsbCBuZWVkIGF0IGxlYXN0IGxtLXNlbnNvcnMgMi4xMC4xIGZvciBwcm9wZXIgdXNlcnNwYWNlCitzdXBwb3J0LgogCiBUaGVyZSBjYW4gYmUgdXAgdG8gZm91ciB0ZW1wZXJhdHVyZSBzZW5zb3JzIGluc2lkZSBzaW5nbGUgQ1BVLiBUaGUgZHJpdmVyCiB3aWxsIGF1dG8tZGV0ZWN0IHRoZSBzZW5zb3JzIGFuZCB3aWxsIGRpc3BsYXkgb25seSB0ZW1wZXJhdHVyZXMgZnJvbQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9od21vbi9zbXNjNDdtMSBiL0RvY3VtZW50YXRpb24vaHdtb24vc21zYzQ3bTEKaW5kZXggYzE1YmJlNi4uMDRhMTExMiAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9od21vbi9zbXNjNDdtMQorKysgYi9Eb2N1bWVudGF0aW9uL2h3bW9uL3Ntc2M0N20xCkBAIC0yLDEyICsyLDE0IEBACiA9PT09PT09PT09PT09PT09PT09PT09CiAKIFN1cHBvcnRlZCBjaGlwczoKLSAgKiBTTVNDIExQQzQ3QjI3eCwgTFBDNDdNMTB4LCBMUEM0N00xM3gsIExQQzQ3TTE0eCwgTFBDNDdNMTV4IGFuZCBMUEM0N00xOTIKKyAgKiBTTVNDIExQQzQ3QjI3eCwgTFBDNDdNMTEyLCBMUEM0N00xMHgsIExQQzQ3TTEzeCwgTFBDNDdNMTR4LAorICAgIExQQzQ3TTE1eCBhbmQgTFBDNDdNMTkyCiAgICAgQWRkcmVzc2VzIHNjYW5uZWQ6IG5vbmUsIGFkZHJlc3MgcmVhZCBmcm9tIFN1cGVyIEkvTyBjb25maWcgc3BhY2UKICAgICBQcmVmaXg6ICdzbXNjNDdtMScKICAgICBEYXRhc2hlZXRzOgogICAgICAgICBodHRwOi8vd3d3LnNtc2MuY29tL21haW4vZGF0YXNoZWV0cy80N2IyN3gucGRmCiAgICAgICAgIGh0dHA6Ly93d3cuc21zYy5jb20vbWFpbi9kYXRhc2hlZXRzLzQ3bTEweC5wZGYKKyAgICAgICAgaHR0cDovL3d3dy5zbXNjLmNvbS9tYWluL2RhdGFzaGVldHMvNDdtMTEyLnBkZgogICAgICAgICBodHRwOi8vd3d3LnNtc2MuY29tL21haW4vdG9vbHMvZGlzY29udGludWVkLzQ3bTEzeC5wZGYKICAgICAgICAgaHR0cDovL3d3dy5zbXNjLmNvbS9tYWluL2RhdGFzaGVldHMvNDdtMTR4LnBkZgogICAgICAgICBodHRwOi8vd3d3LnNtc2MuY29tL21haW4vdG9vbHMvZGlzY29udGludWVkLzQ3bTE1eC5wZGYKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vaHdtb24vdzgzNjI3ZWhmIGIvRG9jdW1lbnRhdGlvbi9od21vbi93ODM2MjdlaGYKaW5kZXggZmFlM2I3OC4uY2FhNjEwYSAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9od21vbi93ODM2MjdlaGYKKysrIGIvRG9jdW1lbnRhdGlvbi9od21vbi93ODM2MjdlaGYKQEAgLTI2LDcgKzI2LDcgQEAKIFRlbXBlcmF0dXJlcyBhcmUgbWVhc3VyZWQgaW4gZGVncmVlcyBDZWxzaXVzIGFuZCBtZWFzdXJlbWVudCByZXNvbHV0aW9uIGlzIDEKIGRlZ0MgZm9yIHRlbXAxIGFuZCAwLjUgZGVnQyBmb3IgdGVtcDIgYW5kIHRlbXAzLiBBbiBhbGFybSBpcyB0cmlnZ2VyZWQgd2hlbgogdGhlIHRlbXBlcmF0dXJlIGdldHMgaGlnaGVyIHRoYW4gaGlnaCBsaW1pdDsgaXQgc3RheXMgb24gdW50aWwgdGhlIHRlbXBlcmF0dXJlCi1mYWxscyBiZWxvdyB0aGUgSHlzdGVyZXNpcyB2YWx1ZS4KK2ZhbGxzIGJlbG93IHRoZSBoeXN0ZXJlc2lzIHZhbHVlLgogCiBGYW4gcm90YXRpb24gc3BlZWRzIGFyZSByZXBvcnRlZCBpbiBSUE0gKHJvdGF0aW9ucyBwZXIgbWludXRlKS4gQW4gYWxhcm0gaXMKIHRyaWdnZXJlZCBpZiB0aGUgcm90YXRpb24gc3BlZWQgaGFzIGRyb3BwZWQgYmVsb3cgYSBwcm9ncmFtbWFibGUgbGltaXQuIEZhbgpAQCAtNjcsOSArNjcsOSBAQAogCiBJZiB0aGUgdGVtcGVyYXR1cmUgaXMgaW4gdGhlIHJhbmdlIGRlZmluZWQgYnk6CiAKLXB3bVsxLTRdX3RhcmdldCAgICAtIHNldCB0YXJnZXQgdGVtcGVyYXR1cmUsIHVuaXQgbWlsbGlkZWdyZWUgQ2VsY2l1cworcHdtWzEtNF1fdGFyZ2V0ICAgIC0gc2V0IHRhcmdldCB0ZW1wZXJhdHVyZSwgdW5pdCBtaWxsaWRlZ3JlZSBDZWxzaXVzCiAJCSAgICAgKHJhbmdlIDAgLSAxMjcwMDApCi1wd21bMS00XV90b2xlcmFuY2UgLSB0b2xlcmFuY2UsIHVuaXQgbWlsbGlkZWdyZWUgQ2VsY2l1cyAocmFuZ2UgMCAtIDE1MDAwKQorcHdtWzEtNF1fdG9sZXJhbmNlIC0gdG9sZXJhbmNlLCB1bml0IG1pbGxpZGVncmVlIENlbHNpdXMgKHJhbmdlIDAgLSAxNTAwMCkKIAogdGhlcmUgYXJlIG5vIGNoYW5nZXMgdG8gZmFuIHNwZWVkLiBPbmNlIHRoZSB0ZW1wZXJhdHVyZSBsZWF2ZXMgdGhlIGludGVydmFsLAogZmFuIHNwZWVkIGluY3JlYXNlcyAodGVtcCBpcyBoaWdoZXIpIG9yIGRlY3JlYXNlcyBpZiBsb3dlciB0aGFuIGRlc2lyZWQuCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2libS1hY3BpLnR4dCBiL0RvY3VtZW50YXRpb24vaWJtLWFjcGkudHh0CmluZGV4IDcxYWE0MDMuLmU1MDU5NWIgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vaWJtLWFjcGkudHh0CisrKyBiL0RvY3VtZW50YXRpb24vaWJtLWFjcGkudHh0CkBAIC0zMCw5ICszMCwxMCBAQAogCS0gQUNQSSBzb3VuZHMKIAktIHRlbXBlcmF0dXJlIHNlbnNvcnMKIAktIEV4cGVyaW1lbnRhbDogZW1iZWRkZWQgY29udHJvbGxlciByZWdpc3RlciBkdW1wCi0JLSBFeHBlcmltZW50YWw6IExDRCBicmlnaHRuZXNzIGNvbnRyb2wKLQktIEV4cGVyaW1lbnRhbDogdm9sdW1lIGNvbnRyb2wKKwktIExDRCBicmlnaHRuZXNzIGNvbnRyb2wKKwktIFZvbHVtZSBjb250cm9sCiAJLSBFeHBlcmltZW50YWw6IGZhbiBzcGVlZCwgZmFuIGVuYWJsZS9kaXNhYmxlCisJLSBFeHBlcmltZW50YWw6IFdBTiBlbmFibGUgYW5kIGRpc2FibGUKIAogQSBjb21wYXRpYmlsaXR5IHRhYmxlIGJ5IG1vZGVsIGFuZCBmZWF0dXJlIGlzIG1haW50YWluZWQgb24gdGhlIHdlYgogc2l0ZSwgaHR0cDovL2libS1hY3BpLnNmLm5ldC8uIEkgYXBwcmVjaWF0ZSBhbnkgc3VjY2VzcyBvciBmYWlsdXJlCkBAIC01Miw0MCArNTMsNyBAQAogCiBJZiB5b3UgYXJlIGNvbXBpbGluZyB0aGlzIGRyaXZlciBhcyBpbmNsdWRlZCBpbiB0aGUgTGludXgga2VybmVsCiBzb3VyY2VzLCBzaW1wbHkgZW5hYmxlIHRoZSBDT05GSUdfQUNQSV9JQk0gb3B0aW9uIChQb3dlciBNYW5hZ2VtZW50IC8KLUFDUEkgLyBJQk0gVGhpbmtQYWQgTGFwdG9wIEV4dHJhcykuIFRoZSByZXN0IG9mIHRoaXMgc2VjdGlvbiBkZXNjcmliZXMKLWhvdyB0byBpbnN0YWxsIHRoaXMgZHJpdmVyIHdoZW4gZG93bmxvYWRlZCBmcm9tIHRoZSB3ZWIgc2l0ZS4KLQotRmlyc3QsIHlvdSBuZWVkIHRvIGdldCBhIGtlcm5lbCB3aXRoIEFDUEkgc3VwcG9ydCB1cCBhbmQgcnVubmluZy4KLVBsZWFzZSByZWZlciB0byBodHRwOi8vYWNwaS5zb3VyY2Vmb3JnZS5uZXQvIGZvciBoZWxwIHdpdGggdGhpcwotc3RlcC4gSG93IHN1Y2Nlc3NmdWwgeW91IHdpbGwgYmUgZGVwZW5kcyBhIGxvdCBvbiB5b3UgVGhpbmtQYWQgbW9kZWwsCi10aGUga2VybmVsIHlvdSBhcmUgdXNpbmcgYW5kIGFueSBhZGRpdGlvbmFsIHBhdGNoZXMgYXBwbGllZC4gVGhlCi1rZXJuZWwgcHJvdmlkZWQgd2l0aCB5b3VyIGRpc3RyaWJ1dGlvbiBtYXkgbm90IGJlIGdvb2QgZW5vdWdoLiBJCi1uZWVkZWQgdG8gY29tcGlsZSBhIDIuNi43IGtlcm5lbCB3aXRoIHRoZSAyMDA0MDcxNSBBQ1BJIHBhdGNoIHRvIGdldAotQUNQSSB3b3JraW5nIHJlbGlhYmx5IG9uIG15IFRoaW5rUGFkIFg0MC4gT2xkIFRoaW5rUGFkIG1vZGVscyBtYXkgbm90Ci1iZSBzdXBwb3J0ZWQgYXQgYWxsLgotCi1Bc3N1bWluZyB5b3UgaGF2ZSB0aGUgYmFzaWMgQUNQSSBzdXBwb3J0IHdvcmtpbmcgKGUuZy4geW91IGNhbiBzZWUgdGhlCi0vcHJvYy9hY3BpIGRpcmVjdG9yeSksIGZvbGxvdyB0aGUgZm9sbG93aW5nIHN0ZXBzIHRvIGluc3RhbGwgdGhpcwotZHJpdmVyOgotCi0JLSB1bnBhY2sgdGhlIGFyY2hpdmU6Ci0KLQkJdGFyIHh6dmYgaWJtLWFjcGkteC55LnRhci5nejsgY2QgaWJtLWFjcGkteC55Ci0KLQktIGNvbXBpbGUgdGhlIGRyaXZlcjoKLQotCQltYWtlCi0KLQktIGluc3RhbGwgdGhlIG1vZHVsZSBpbiB5b3VyIGtlcm5lbCBtb2R1bGVzIGRpcmVjdG9yeToKLQotCQltYWtlIGluc3RhbGwKLQotCS0gbG9hZCB0aGUgbW9kdWxlOgotCi0JCW1vZHByb2JlIGlibV9hY3BpCi0KLUFmdGVyIGxvYWRpbmcgdGhlIG1vZHVsZSwgY2hlY2sgdGhlICJkbWVzZyIgb3V0cHV0IGZvciBhbnkgZXJyb3IgbWVzc2FnZXMuCi0KK0FDUEkgLyBJQk0gVGhpbmtQYWQgTGFwdG9wIEV4dHJhcykuCiAKIEZlYXR1cmVzCiAtLS0tLS0tLQpAQCAtNTIzLDEzICs0OTEsOCBAQAogd2l0aCB0aGlzLCBkbyBzZW5kIG1lIHlvdXIgcmVzdWx0cyAoaW5jbHVkaW5nIHNvbWUgY29tcGxldGUgZHVtcHMgd2l0aAogYSBkZXNjcmlwdGlvbiBvZiB0aGUgY29uZGl0aW9ucyB3aGVuIHRoZXkgd2VyZSB0YWtlbi4pCiAKLUVYUEVSSU1FTlRBTDogTENEIGJyaWdodG5lc3MgY29udHJvbCAtLSAvcHJvYy9hY3BpL2libS9icmlnaHRuZXNzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1UaGlzIGZlYXR1cmUgaXMgbWFya2VkIEVYUEVSSU1FTlRBTCBiZWNhdXNlIHRoZSBpbXBsZW1lbnRhdGlvbgotZGlyZWN0bHkgYWNjZXNzZXMgaGFyZHdhcmUgcmVnaXN0ZXJzIGFuZCBtYXkgbm90IHdvcmsgYXMgZXhwZWN0ZWQuIFVTRQotV0lUSCBDQVVUSU9OISBUbyB1c2UgdGhpcyBmZWF0dXJlLCB5b3UgbmVlZCB0byBzdXBwbHkgdGhlCi1leHBlcmltZW50YWw9MSBwYXJhbWV0ZXIgd2hlbiBsb2FkaW5nIHRoZSBtb2R1bGUuCitMQ0QgYnJpZ2h0bmVzcyBjb250cm9sIC0tIC9wcm9jL2FjcGkvaWJtL2JyaWdodG5lc3MKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCiBUaGlzIGZlYXR1cmUgYWxsb3dzIHNvZnR3YXJlIGNvbnRyb2wgb2YgdGhlIExDRCBicmlnaHRuZXNzIG9uIFRoaW5rUGFkCiBtb2RlbHMgd2hpY2ggZG9uJ3QgaGF2ZSBhIGhhcmR3YXJlIGJyaWdodG5lc3Mgc2xpZGVyLiBUaGUgYXZhaWxhYmxlCkBAIC01NDIsMTMgKzUwNSw4IEBACiBUaGUgPGxldmVsPiBudW1iZXIgcmFuZ2UgaXMgMCB0byA3LCBhbHRob3VnaCBub3QgYWxsIG9mIHRoZW0gbWF5IGJlCiBkaXN0aW5jdC4gVGhlIGN1cnJlbnQgYnJpZ2h0bmVzcyBsZXZlbCBpcyBzaG93biBpbiB0aGUgZmlsZS4KIAotRVhQRVJJTUVOVEFMOiBWb2x1bWUgY29udHJvbCAtLSAvcHJvYy9hY3BpL2libS92b2x1bWUKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLVRoaXMgZmVhdHVyZSBpcyBtYXJrZWQgRVhQRVJJTUVOVEFMIGJlY2F1c2UgdGhlIGltcGxlbWVudGF0aW9uCi1kaXJlY3RseSBhY2Nlc3NlcyBoYXJkd2FyZSByZWdpc3RlcnMgYW5kIG1heSBub3Qgd29yayBhcyBleHBlY3RlZC4gVVNFCi1XSVRIIENBVVRJT04hIFRvIHVzZSB0aGlzIGZlYXR1cmUsIHlvdSBuZWVkIHRvIHN1cHBseSB0aGUKLWV4cGVyaW1lbnRhbD0xIHBhcmFtZXRlciB3aGVuIGxvYWRpbmcgdGhlIG1vZHVsZS4KK1ZvbHVtZSBjb250cm9sIC0tIC9wcm9jL2FjcGkvaWJtL3ZvbHVtZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKIFRoaXMgZmVhdHVyZSBhbGxvd3Mgdm9sdW1lIGNvbnRyb2wgb24gVGhpbmtQYWQgbW9kZWxzIHdoaWNoIGRvbid0IGhhdmUKIGEgaGFyZHdhcmUgdm9sdW1lIGtub2IuIFRoZSBhdmFpbGFibGUgY29tbWFuZHMgYXJlOgpAQCAtNjExLDYgKzU2OSwyMyBAQAogCiAJZWNobyAnbGV2ZWwgPGxldmVsPicgPiAvcHJvYy9hY3BpL2libS90aGVybWFsCiAKK0VYUEVSSU1FTlRBTDogV0FOIC0tIC9wcm9jL2FjcGkvaWJtL3dhbgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1RoaXMgZmVhdHVyZSBpcyBtYXJrZWQgRVhQRVJJTUVOVEFMIGJlY2F1c2UgdGhlIGltcGxlbWVudGF0aW9uCitkaXJlY3RseSBhY2Nlc3NlcyBoYXJkd2FyZSByZWdpc3RlcnMgYW5kIG1heSBub3Qgd29yayBhcyBleHBlY3RlZC4gVVNFCitXSVRIIENBVVRJT04hIFRvIHVzZSB0aGlzIGZlYXR1cmUsIHlvdSBuZWVkIHRvIHN1cHBseSB0aGUKK2V4cGVyaW1lbnRhbD0xIHBhcmFtZXRlciB3aGVuIGxvYWRpbmcgdGhlIG1vZHVsZS4KKworVGhpcyBmZWF0dXJlIHNob3dzIHRoZSBwcmVzZW5jZSBhbmQgY3VycmVudCBzdGF0ZSBvZiBhIFdBTiAoU2llcnJhCitXaXJlbGVzcyBFVi1ETykgZGV2aWNlLiBJZiBXQU4gaXMgaW5zdGFsbGVkLCB0aGUgZm9sbG93aW5nIGNvbW1hbmRzIGNhbgorYmUgdXNlZDoKKworCWVjaG8gZW5hYmxlID4gL3Byb2MvYWNwaS9pYm0vd2FuCisJZWNobyBkaXNhYmxlID4gL3Byb2MvYWNwaS9pYm0vd2FuCisKK0l0IHdhcyB0ZXN0ZWQgb24gYSBMZW5vdm8gVGhpbmtwYWQgWDYwLiBJdCBzaG91bGQgcHJvYmFibHkgd29yayBvbiBvdGhlcgorVGhpbmtwYWQgbW9kZWxzIHdoaWNoIGNvbWUgd2l0aCB0aGlzIG1vZHVsZSBpbnN0YWxsZWQuCiAKIE11bHRpcGxlIENvbW1hbmRzLCBNb2R1bGUgUGFyYW1ldGVycwogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2lucHV0L3hwYWQudHh0IGIvRG9jdW1lbnRhdGlvbi9pbnB1dC94cGFkLnR4dAppbmRleCBiOTExMWE3Li41NDI3YmRmIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2lucHV0L3hwYWQudHh0CisrKyBiL0RvY3VtZW50YXRpb24vaW5wdXQveHBhZC50eHQKQEAgLTMsMjAgKzMsMzcgQEAKIFRoaXMgaXMgdGhlIHZlcnkgZmlyc3QgcmVsZWFzZSBvZiBhIGRyaXZlciBmb3IgWC1Cb3ggZ2FtZXBhZHMuCiBCYXNpY2FsbHksIHRoaXMgd2FzIGhhY2tlZCBhd2F5IGluIGp1c3QgYSBmZXcgaG91cnMsIHNvIGRvbid0IGV4cGVjdAogbWlyYWNsZXMuCisKIEluIHBhcnRpY3VsYXIsIHRoZXJlIGlzIGN1cnJlbnRseSBOTyBzdXBwb3J0IGZvciB0aGUgcnVtYmxlIHBhY2suCiBZb3Ugd29uJ3QgZmluZCBtYW55IGZmLWF3YXJlIGxpbnV4IGFwcGxpY2F0aW9ucyBhbnl3YXkuCiAKIAotMC4gU3RhdHVzCi0tLS0tLS0tLS0KKzAuIE5vdGVzCistLS0tLS0tLQogCi1Gb3Igbm93LCB0aGlzIGRyaXZlciBoYXMgb25seSBiZWVuIHRlc3RlZCBvbiBqdXN0IG9uZSBMaW51eC1Cb3guCi1UaGlzIG9uZSBpcyBydW5uaW5nIGEgMi40LjE4IGtlcm5lbCB3aXRoIHVzYi11aGNpIG9uIGFuIGFtZCBhdGhsb24gNjAwLgorRHJpdmVyIHVwZGF0ZWQgZm9yIGtlcm5lbCAyLjYuMTcuMTEuIChCYXNlZCBvbiBhIHBhdGNoIGZvciAyLjYuMTEuNC4pCiAKLVRoZSBqc3Rlc3QtcHJvZ3JhbSBmcm9tIGpveXN0aWNrLTEuMi4xNSAoanN0ZXN0LXZlcnNpb24gMi4xLjApIHJlcG9ydHMKLTggYXhlcyBhbmQgMTAgYnV0dG9ucy4KK1RoZSBudW1iZXIgb2YgYnV0dG9ucy9heGVzIHJlcG9ydGVkIHZhcmllcyBiYXNlZCBvbiAzIHRoaW5nczoKKy0gaWYgeW91IGFyZSB1c2luZyBhIGtub3duIGNvbnRyb2xsZXIKKy0gaWYgeW91IGFyZSB1c2luZyBhIGtub3duIGRhbmNlIHBhZAorLSBpZiB1c2luZyBhbiB1bmtub3duIGRldmljZSAob25lIG5vdCBsaXN0ZWQgYmVsb3cpLCB3aGF0IHlvdSBzZXQgaW4gdGhlCisgIG1vZHVsZSBjb25maWd1cmF0aW9uIGZvciAiTWFwIEQtUEFEIHRvIGJ1dHRvbnMgcmF0aGVyIHRoYW4gYXhlcyBmb3IgdW5rbm93bgorICBwYWRzIiAobW9kdWxlIG9wdGlvbiBkcGFkX3RvX2J1dHRvbnMpCiAKLUFsbHMgOCBheGVzIHdvcmssIHRob3VnaCB0aGV5IGFsbCBoYXZlIHRoZSBzYW1lIHJhbmdlICgtMzI3NjguLjMyNzY3KQorSWYgeW91IHNldCBkcGFkX3RvX2J1dHRvbnMgdG8gMCBhbmQgeW91IGFyZSB1c2luZyBhbiB1bmtub3duIGRldmljZSAob25lCitub3QgbGlzdGVkIGJlbG93KSwgdGhlIGRyaXZlciB3aWxsIG1hcCB0aGUgZGlyZWN0aW9uYWwgcGFkIHRvIGF4ZXMgKFgvWSksCitpZiB5b3Ugc2FpZCBOIGl0IHdpbGwgbWFwIHRoZSBkLXBhZCB0byBidXR0b25zLCB3aGljaCBpcyBuZWVkZWQgZm9yIGRhbmNlCitzdHlsZSBnYW1lcyB0byBmdW5jdGlvbiBjb3JyZWN0bHkuICBUaGUgZGVmYXVsdCBpcyBZLgorCitkcGFkX3RvX2J1dHRvbnMgaGFzIG5vIGVmZmVjdCBmb3Iga25vd24gcGFkcy4KKworMC4xIE5vcm1hbCBDb250cm9sbGVycworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorV2l0aCBhIG5vcm1hbCBjb250cm9sbGVyLCB0aGUgZGlyZWN0aW9uYWwgcGFkIGlzIG1hcHBlZCB0byBpdHMgb3duIFgvWSBheGVzLgorVGhlIGpzdGVzdC1wcm9ncmFtIGZyb20gam95c3RpY2stMS4yLjE1IChqc3Rlc3QtdmVyc2lvbiAyLjEuMCkgd2lsbCByZXBvcnQgOAorYXhlcyBhbmQgMTAgYnV0dG9ucy4KKworQWxsIDggYXhlcyB3b3JrLCB0aG91Z2ggdGhleSBhbGwgaGF2ZSB0aGUgc2FtZSByYW5nZSAoLTMyNzY4Li4zMjc2NykKIGFuZCB0aGUgemVyby1zZXR0aW5nIGlzIG5vdCBjb3JyZWN0IGZvciB0aGUgdHJpZ2dlcnMgKEkgZG9uJ3Qga25vdyBpZiB0aGF0CiBpcyBzb21lIGxpbWl0YXRpb24gb2YganN0ZXN0LCBzaW5jZSB0aGUgaW5wdXQgZGV2aWNlIHNldHVwIHNob3VsZCBiZSBmaW5lLiBJCiBkaWRuJ3QgaGF2ZSBhIGxvb2sgYXQganN0ZXN0IGl0c2VsZiB5ZXQpLgpAQCAtMzAsMTYgKzQ3LDUwIEBACiBwbGF5IGZpcnN0IHBlcnNvbiBzaG9vdGVycyB3aXRoIGEgcGFkLiBZb3VyIG1pbGVhZ2UgbWF5IHZhcnkuCiAKIAorMC4yIFhib3ggRGFuY2UgUGFkcworLS0tLS0tLS0tLS0tLS0tLS0tLQorV2hlbiB1c2luZyBhIGtub3duIGRhbmNlIHBhZCwganN0ZXN0IHdpbGwgcmVwb3J0IDYgYXhlcyBhbmQgMTQgYnV0dG9ucy4KKworRm9yIGRhbmNlIHN0eWxlIHBhZHMgKGxpa2UgdGhlIHJlZG9jdGFuZSBwYWQpIHNldmVyYWwgY2hhbmdlcworaGF2ZSBiZWVuIG1hZGUuICBUaGUgb2xkIGRyaXZlciB3b3VsZCBtYXAgdGhlIGQtcGFkIHRvIGF4ZXMsIHJlc3VsdGluZworaW4gdGhlIGRyaXZlciBiZWluZyB1bmFibGUgdG8gcmVwb3J0IHdoZW4gdGhlIHVzZXIgd2FzIHByZXNzaW5nIGJvdGgKK2xlZnQrcmlnaHQgb3IgdXArZG93biwgbWFraW5nIEREUiBzdHlsZSBnYW1lcyB1bnBsYXlhYmxlLgorCitLbm93biBkYW5jZSBwYWRzIGF1dG9tYXRpY2FsbHkgbWFwIHRoZSBkLXBhZCB0byBidXR0b25zIGFuZCB3aWxsIHdvcmsKK2NvcnJlY3RseSBvdXQgb2YgdGhlIGJveC4KKworSWYgeW91ciBkYW5jZSBwYWQgaXMgcmVjb2duaXplZCBieSB0aGUgZHJpdmVyIGJ1dCBpcyB1c2luZyBheGVzIGluc3RlYWQKK29mIGJ1dHRvbnMsIHNlZSBzZWN0aW9uIDAuMyAtIFVua25vd24gQ29udHJvbGxlcnMKKworSSd2ZSB0ZXN0ZWQgdGhpcyB3aXRoIFN0ZXBtYW5pYSwgYW5kIGl0IHdvcmtzIHF1aXRlIHdlbGwuCisKKworMC4zIFVua293biBDb250cm9sbGVycworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorSWYgeW91IGhhdmUgYW4gdW5rb3duIHhib3ggY29udHJvbGxlciwgaXQgc2hvdWxkIHdvcmsganVzdCBmaW5lIHdpdGgKK3RoZSBkZWZhdWx0IHNldHRpbmdzLgorCitIT1dFVkVSIGlmIHlvdSBoYXZlIGFuIHVua25vd24gZGFuY2UgcGFkIG5vdCBsaXN0ZWQgYmVsb3csIGl0IHdpbGwgbm90Cit3b3JrIFVOTEVTUyB5b3Ugc2V0ICJkcGFkX3RvX2J1dHRvbnMiIHRvIDEgaW4gdGhlIG1vZHVsZSBjb25maWd1cmF0aW9uLgorCitQTEVBU0UgaWYgeW91IGhhdmUgYW4gdW5rb3duIGNvbnRyb2xsZXIsIGVtYWlsIERvbSA8YmluYXJ5MTIzMEB5YWhvby5jb20+IHdpdGgKK2EgZHVtcCBmcm9tIC9wcm9jL2J1cy91c2IgYW5kIGEgZGVzY3JpcHRpb24gb2YgdGhlIHBhZCAobWFudWZhY3R1cmVyLCBjb3VudHJ5LAord2hldGhlciBpdCBpcyBhIGRhbmNlIHBhZCBvciBub3JtYWwgY29udHJvbGxlcikgc28gdGhhdCB3ZSBjYW4gYWRkIHlvdXIgcGFkCit0byB0aGUgbGlzdCBvZiBzdXBwb3J0ZWQgZGV2aWNlcywgZW5zdXJpbmcgdGhhdCBpdCB3aWxsIHdvcmsgb3V0IG9mIHRoZQorYm94IGluIHRoZSBmdXR1cmUuCisKKwogMS4gVVNCIGFkYXB0ZXIKIC0tLS0tLS0tLS0tLS0tCiAKIEJlZm9yZSB5b3UgY2FuIGFjdHVhbGx5IHVzZSB0aGUgZHJpdmVyLCB5b3UgbmVlZCB0byBnZXQgeW91cnNlbGYgYW4KLWFkYXB0ZXIgY2FibGUgdG8gY29ubmVjdCB0aGUgWC1Cb3ggY29udHJvbGxlciB0byB5b3VyIExpbnV4LUJveC4KK2FkYXB0ZXIgY2FibGUgdG8gY29ubmVjdCB0aGUgWC1Cb3ggY29udHJvbGxlciB0byB5b3VyIExpbnV4LUJveC4gWW91CitjYW4gYnV5IHRoZXNlIG9ubGluZSBmYWlybHkgY2hlYXAsIG9yIGJ1aWxkIHlvdXIgb3duLgogCi1TdWNoIGEgY2FibGUgaXMgcHJldHR5IGVhc3kgdG8gYnVpbGQuIFRoZSBDb250cm9sbGVyIGl0c2VsZiBpcyBhIFVTQiBjb21wb3VuZAotZGV2aWNlIChhIGh1YiB3aXRoIHRocmVlIHBvcnRzIGZvciB0d28gZXhwYW5zaW9uIHNsb3RzIGFuZCB0aGUgY29udHJvbGxlcgotZGV2aWNlKSB3aXRoIHRoZSBvbmx5IGRpZmZlcmVuY2UgaW4gYSBub25zdGFuZGFyZCBjb25uZWN0b3IgKDUgcGlucyB2cy4gNCBvbgotc3RhbmRhcmQgVVNCIGNvbm5lY3RvcikuCitTdWNoIGEgY2FibGUgaXMgcHJldHR5IGVhc3kgdG8gYnVpbGQuIFRoZSBDb250cm9sbGVyIGl0c2VsZiBpcyBhIFVTQgorY29tcG91bmQgZGV2aWNlIChhIGh1YiB3aXRoIHRocmVlIHBvcnRzIGZvciB0d28gZXhwYW5zaW9uIHNsb3RzIGFuZAordGhlIGNvbnRyb2xsZXIgZGV2aWNlKSB3aXRoIHRoZSBvbmx5IGRpZmZlcmVuY2UgaW4gYSBub25zdGFuZGFyZCBjb25uZWN0b3IKKyg1IHBpbnMgdnMuIDQgb24gc3RhbmRhcmQgVVNCIGNvbm5lY3RvcikuCiAKIFlvdSBqdXN0IG5lZWQgdG8gc29sZGVyIGEgVVNCIGNvbm5lY3RvciBvbnRvIHRoZSBjYWJsZSBhbmQga2VlcCB0aGUKIHllbGxvdyB3aXJlIHVuY29ubmVjdGVkLiBUaGUgb3RoZXIgcGlucyBoYXZlIHRoZSBzYW1lIG9yZGVyIG9uIGJvdGgKQEAgLTUxLDM2ICsxMDIsMzYgQEAKIHlvdSBjYW4gc3RpbGwgdXNlIHRoZSBjb250cm9sbGVyIHdpdGggeW91ciBYLUJveCwgaWYgeW91IGhhdmUgb25lIDspCiAKIAotMi4gZHJpdmVyIGluc3RhbGxhdGlvbgorMi4gRHJpdmVyIEluc3RhbGxhdGlvbgogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCiBPbmNlIHlvdSBoYXZlIHRoZSBhZGFwdGVyIGNhYmxlIGFuZCB0aGUgY29udHJvbGxlciBpcyBjb25uZWN0ZWQsIHlvdSBuZWVkCiB0byBsb2FkIHlvdXIgVVNCIHN1YnN5c3RlbSBhbmQgc2hvdWxkIGNhdCAvcHJvYy9idXMvdXNiL2RldmljZXMuCiBUaGVyZSBzaG91bGQgYmUgYW4gZW50cnkgbGlrZSB0aGUgb25lIGF0IHRoZSBlbmQgWzRdLgogCi1DdXJyZW50bHkgKGFzIG9mIHZlcnNpb24gMC4wLjQpLCB0aGUgZm9sbG93aW5nIHRocmVlIGRldmljZXMgYXJlIGluY2x1ZGVkOgorQ3VycmVudGx5IChhcyBvZiB2ZXJzaW9uIDAuMC42KSwgdGhlIGZvbGxvd2luZyBkZXZpY2VzIGFyZSBpbmNsdWRlZDoKICBvcmlnaW5hbCBNaWNyb3NvZnQgWEJPWCBjb250cm9sbGVyIChVUyksIHZlbmRvcj0weDA0NWUsIHByb2R1Y3Q9MHgwMjAyCisgc21hbGxlciAgTWljcm9zb2Z0IFhCT1ggY29udHJvbGxlciAoVVMpLCB2ZW5kb3I9MHgwNDVlLCBwcm9kdWN0PTB4MDI4OQogIG9yaWdpbmFsIE1pY3Jvc29mdCBYQk9YIGNvbnRyb2xsZXIgKEphcGFuKSwgdmVuZG9yPTB4MDQ1ZSwgcHJvZHVjdD0weDAyODUKICBJbnRlckFjdCBQb3dlclBhZCBQcm8gKEdlcm1hbnkpLCB2ZW5kb3I9MHgwNWZkLCBwcm9kdWN0PTB4MTA3YQorIFJlZE9jdGFuZSBYYm94IERhbmNlIFBhZCAoVVMpLCB2ZW5kb3I9MHgwYzEyLCBwcm9kdWN0PTB4ODgwOQogCi1JZiB5b3UgaGF2ZSBhbm90aGVyIGNvbnRyb2xsZXIgdGhhdCBpcyBub3QgbGlzdGVkIGFib3ZlIGFuZCBpcyBub3QgcmVjb2duaXplZAotYnkgdGhlIGRyaXZlciwgcGxlYXNlIGRyb3AgbWUgYSBsaW5lIHdpdGggdGhlIGFwcHJvcHJpYXRlIGluZm8gKHRoYXQgaXMsIGluY2x1ZGUKLXRoZSBuYW1lLCB2ZW5kb3IgYW5kIHByb2R1Y3QgSUQsIGFzIHdlbGwgYXMgdGhlIGNvdW50cnkgd2hlcmUgeW91IGJvdWdodCBpdDsKLXNlbmRpbmcgdGhlIHdob2xlIGR1bXAgb3V0IG9mIC9wcm9jL2J1cy91c2IvZGV2aWNlcyBhbG9uZyB3b3VsZCBiZSBldmVuIGJldHRlcikuCitUaGUgZHJpdmVyIHNob3VsZCB3b3JrIHdpdGggeGJveCBwYWRzIG5vdCBsaXN0ZWQgYWJvdmUgYXMgd2VsbCwgaG93ZXZlcgoreW91IHdpbGwgbmVlZCB0byBkbyBzb21ldGhpbmcgZXh0cmEgZm9yIGRhbmNlIHBhZHMgdG8gd29yay4KIAotSW4gdGhlb3J5LCB0aGUgZHJpdmVyIHNob3VsZCB3b3JrIHdpdGggb3RoZXIgY29udHJvbGxlcnMgdGhhbiBtaW5lCi0oSW50ZXJBY3QgUG93ZXJQYWQgcHJvLCBib3VnaHQgaW4gR2VybWFueSkganVzdCBmaW5lLCBidXQgSSBjYW5ub3QgdGVzdCB0aGlzCi1mb3IgSSBvbmx5IGhhdmUgdGhpcyBvbmUgY29udHJvbGxlci4KK0lmIHlvdSBoYXZlIGEgY29udHJvbGxlciBub3QgbGlzdGVkIGFib3ZlLCBzZWUgMC4zIC0gVW5rbm93biBDb250cm9sbGVycwogCiBJZiB5b3UgY29tcGlsZWQgYW5kIGluc3RhbGxlZCB0aGUgZHJpdmVyLCB0ZXN0IHRoZSBmdW5jdGlvbmFsaXR5OgogPiBtb2Rwcm9iZSB4cGFkCiA+IG1vZHByb2JlIGpveWRldgogPiBqc3Rlc3QgL2Rldi9qczAKIAotVGhlcmUgc2hvdWxkIGJlIGEgc2luZ2xlIGxpbmUgc2hvd2luZyAxOCBpbnB1dHMgKDggYXhlcywgMTAgYnV0dG9ucyksIGFuZAotaXQncyB2YWx1ZXMgc2hvdWxkIGNoYW5nZSBpZiB5b3UgbW92ZSB0aGUgc3RpY2tzIGFuZCBwdXNoIHRoZSBidXR0b25zLgorSWYgeW91J3JlIHVzaW5nIGEgbm9ybWFsIGNvbnRyb2xsZXIsIHRoZXJlIHNob3VsZCBiZSBhIHNpbmdsZSBsaW5lIHNob3dpbmcKKzE4IGlucHV0cyAoOCBheGVzLCAxMCBidXR0b25zKSwgYW5kIGl0cyB2YWx1ZXMgc2hvdWxkIGNoYW5nZSBpZiB5b3UgbW92ZQordGhlIHN0aWNrcyBhbmQgcHVzaCB0aGUgYnV0dG9ucy4gIElmIHlvdSdyZSB1c2luZyBhIGRhbmNlIHBhZCwgaXQgc2hvdWxkCitzaG93IDIwIGlucHV0cyAoNiBheGVzLCAxNCBidXR0b25zKS4KIAotSXQgd29ya3M/IFZvaWxhLCB5b3VyIGRvbmUgOykKK0l0IHdvcmtzPyBWb2lsYSwgeW91J3JlIGRvbmUgOykKIAogCiAzLiBUaGFua3MKQEAgLTExMSw2ICsxNjIsMjIgQEAKIEU6ICBBZD04MShJKSBBdHI9MDMoSW50LikgTXhQUz0gIDMyIEl2bD0gMTBtcwogRTogIEFkPTAyKE8pIEF0cj0wMyhJbnQuKSBNeFBTPSAgMzIgSXZsPSAxMG1zCiAKKzUuIC9wcm9jL2J1cy91c2IvZGV2aWNlcyAtIGR1bXAgZnJvbSBSZWRvY3RhbmUgWGJveCBEYW5jZSBQYWQgKFVTKToKKworVDogIEJ1cz0wMSBMZXY9MDIgUHJudD0wOSBQb3J0PTAwIENudD0wMSBEZXYjPSAxMCBTcGQ9MTIgIE14Q2g9IDAKK0Q6ICBWZXI9IDEuMTAgQ2xzPTAwKD5pZmMgKSBTdWI9MDAgUHJvdD0wMCBNeFBTPSA4ICNDZmdzPSAgMQorUDogIFZlbmRvcj0wYzEyIFByb2RJRD04ODA5IFJldj0gMC4wMQorUzogIFByb2R1Y3Q9WEJPWCBERFIKK0M6KiAjSWZzPSAxIENmZyM9IDEgQXRyPTgwIE14UHdyPTEwMG1BCitJOiAgSWYjPSAwIEFsdD0gMCAjRVBzPSAyIENscz01OCh1bmsuICkgU3ViPTQyIFByb3Q9MDAgRHJpdmVyPXhwYWQKK0U6ICBBZD04MihJKSBBdHI9MDMoSW50LikgTXhQUz0gIDMyIEl2bD00bXMKK0U6ICBBZD0wMihPKSBBdHI9MDMoSW50LikgTXhQUz0gIDMyIEl2bD00bXMKKwogLS0gCiBNYXJrbyBGcmllZGVtYW5uIDxtZnJAYm14LWNoZW1uaXR6LmRlPgogMjAwMi0wNy0xNgorIC0gb3JpZ2luYWwgZG9jCisKK0RvbWluaWMgQ2VycXVldHRpIDxiaW5hcnkxMjMwQHlhaG9vLmNvbT4KKzIwMDUtMDMtMTkKKyAtIGFkZGVkIHN0dWZmIGZvciBkYW5jZSBwYWRzLCBuZXcgZC1wYWQtPmF4ZXMgbWFwcGluZ3MKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24va2VybmVsLWRvYy1uYW5vLUhPV1RPLnR4dCBiL0RvY3VtZW50YXRpb24va2VybmVsLWRvYy1uYW5vLUhPV1RPLnR4dAppbmRleCBjNjUyMzNkLi4yODRlN2UxIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2tlcm5lbC1kb2MtbmFuby1IT1dUTy50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9rZXJuZWwtZG9jLW5hbm8tSE9XVE8udHh0CkBAIC0xNyw3ICsxNyw3IEBACiAgIHNwZWNpYWwgcGxhY2UtaG9sZGVycyBmb3Igd2hlcmUgdGhlIGV4dHJhY3RlZCBkb2N1bWVudGF0aW9uIHNob3VsZAogICBnby4KIAotLSBzY3JpcHRzL2RvY3Byb2MuYworLSBzY3JpcHRzL2Jhc2ljL2RvY3Byb2MuYwogCiAgIFRoaXMgaXMgYSBwcm9ncmFtIGZvciBjb252ZXJ0aW5nIFNHTUwgdGVtcGxhdGUgZmlsZXMgaW50byBTR01MCiAgIGZpbGVzLiBXaGVuIGEgZmlsZSBpcyByZWZlcmVuY2VkIGl0IGlzIHNlYXJjaGVkIGZvciBzeW1ib2xzCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2tlcm5lbC1wYXJhbWV0ZXJzLnR4dCBiL0RvY3VtZW50YXRpb24va2VybmVsLXBhcmFtZXRlcnMudHh0CmluZGV4IDVhOTJhYzAuLjk5MTNmMDYgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24va2VybmVsLXBhcmFtZXRlcnMudHh0CisrKyBiL0RvY3VtZW50YXRpb24va2VybmVsLXBhcmFtZXRlcnMudHh0CkBAIC0xNjQsNiArMTY0LDEwIEBACiAJYWNwaV9za2lwX3RpbWVyX292ZXJyaWRlIFtIVyxBQ1BJXQogCQkJUmVjb2duaXplIGFuZCBpZ25vcmUgSVJRMC9waW4yIEludGVycnVwdCBPdmVycmlkZS4KIAkJCUZvciBicm9rZW4gbkZvcmNlMiBCSU9TIHJlc3VsdGluZyBpbiBYVC1QSUMgdGltZXIuCisJYWNwaV91c2VfdGltZXJfb3ZlcnJpZGUgW0hXLEFDUEl9CisJCQlVc2UgdGltZXIgb3ZlcnJpZGUuIEZvciBzb21lIGJyb2tlbiBOdmlkaWEgTkY1IGJvYXJkcworCQkJdGhhdCByZXF1aXJlIGEgdGltZXIgb3ZlcnJpZGUsIGJ1dCBkb24ndCBoYXZlCisJCQlIUEVUCiAKIAlhY3BpX2RiZ19sYXllcj0JW0hXLEFDUEldCiAJCQlGb3JtYXQ6IDxpbnQ+CkBAIC0xMjMxLDYgKzEyMzUsMTEgQEAKIAkJCQltYWNoaW5lIGNoZWNrIHdoZW4gc29tZSBkZXZpY2VzJyBjb25maWcgc3BhY2UKIAkJCQlpcyByZWFkLiBCdXQgdmFyaW91cyB3b3JrYXJvdW5kcyBhcmUgZGlzYWJsZWQKIAkJCQlhbmQgc29tZSBJT01NVSBkcml2ZXJzIHdpbGwgbm90IHdvcmsuCisJCWJmc29ydAkJU29ydCBQQ0kgZGV2aWNlcyBpbnRvIGJyZWFkdGgtZmlyc3Qgb3JkZXIuCisJCQkJVGhpcyBzb3J0aW5nIGlzIGRvbmUgdG8gZ2V0IGEgZGV2aWNlCisJCQkJb3JkZXIgY29tcGF0aWJsZSB3aXRoIG9sZGVyICg8PSAyLjQpIGtlcm5lbHMuCisJCW5vYmZzb3J0CURvbid0IHNvcnQgUENJIGRldmljZXMgaW50byBicmVhZHRoLWZpcnN0IG9yZGVyLgorCiAJcGNtdj0JCVtIVyxQQ01DSUFdIEJhZGdlUEFEIDQKIAogCXBkLgkJW1BBUklERV0KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24va3Byb2Jlcy50eHQgYi9Eb2N1bWVudGF0aW9uL2twcm9iZXMudHh0CmluZGV4IGJhMjYyMDEuLmQ3MWZhZmYgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24va3Byb2Jlcy50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9rcHJvYmVzLnR4dApAQCAtNDQyLDkgKzQ0MiwxMCBAQAogCWtwLmZhdWx0X2hhbmRsZXIgPSBoYW5kbGVyX2ZhdWx0OwogCWtwLnN5bWJvbF9uYW1lID0gImRvX2ZvcmsiOwogCi0JaWYgKChyZXQgPSByZWdpc3Rlcl9rcHJvYmUoJmtwKSA8IDApKSB7CisJcmV0ID0gcmVnaXN0ZXJfa3Byb2JlKCZrcCk7CisJaWYgKHJldCA8IDApIHsKIAkJcHJpbnRrKCJyZWdpc3Rlcl9rcHJvYmUgZmFpbGVkLCByZXR1cm5lZCAlZFxuIiwgcmV0KTsKLQkJcmV0dXJuIC0xOworCQlyZXR1cm4gcmV0OwogCX0KIAlwcmludGsoImtwcm9iZSByZWdpc3RlcmVkXG4iKTsKIAlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vbG9ja2RlcC1kZXNpZ24udHh0IGIvRG9jdW1lbnRhdGlvbi9sb2NrZGVwLWRlc2lnbi50eHQKaW5kZXggZGFiMTIzZC4uNDg4NzczMCAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9sb2NrZGVwLWRlc2lnbi50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9sb2NrZGVwLWRlc2lnbi50eHQKQEAgLTUwLDEwICs1MCwxMCBAQAogc29mdGlycS1yZWFkIHJlc3BlY3RpdmVseSwgYW5kIHRoZSBjaGFyYWN0ZXIgZGlzcGxheWVkIGluIGVhY2gKIGluZGljYXRlczoKIAotICAgJy4nCSBhY3F1aXJlZCB3aGlsZSBpcnFzIGVuYWJsZWQKKyAgICcuJyAgYWNxdWlyZWQgd2hpbGUgaXJxcyBkaXNhYmxlZAogICAgJysnICBhY3F1aXJlZCBpbiBpcnEgY29udGV4dAotICAgJy0nICBhY3F1aXJlZCBpbiBwcm9jZXNzIGNvbnRleHQgd2l0aCBpcnFzIGRpc2FibGVkCi0gICAnPycgIHJlYWQtYWNxdWlyZWQgYm90aCB3aXRoIGlycXMgZW5hYmxlZCBhbmQgaW4gaXJxIGNvbnRleHQKKyAgICctJyAgYWNxdWlyZWQgd2l0aCBpcnFzIGVuYWJsZWQKKyAgICc/JyByZWFkIGFjcXVpcmVkIGluIGlycSBjb250ZXh0IHdpdGggaXJxcyBlbmFibGVkLgogCiBVbnVzZWQgbXV0ZXhlcyBjYW5ub3QgYmUgcGFydCBvZiB0aGUgY2F1c2Ugb2YgYW4gZXJyb3IuCiAKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vbWVtb3J5LWJhcnJpZXJzLnR4dCBiL0RvY3VtZW50YXRpb24vbWVtb3J5LWJhcnJpZXJzLnR4dAppbmRleCA5OTQzNTViLi43NzUxNzA0IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL21lbW9yeS1iYXJyaWVycy50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9tZW1vcnktYmFycmllcnMudHh0CkBAIC0xMDE2LDcgKzEwMTYsNyBAQAogCiAgKCopIHNldF9tYih2YXIsIHZhbHVlKQogCi0gICAgIFRoaXMgYXNzaWducyB0aGUgdmFsdWUgdG8gdGhlIHZhcmlhYmxlIGFuZCB0aGVuIGluc2VydHMgYXQgbGVhc3QgYSB3cml0ZQorICAgICBUaGlzIGFzc2lnbnMgdGhlIHZhbHVlIHRvIHRoZSB2YXJpYWJsZSBhbmQgdGhlbiBpbnNlcnRzIGEgZnVsbCBtZW1vcnkKICAgICAgYmFycmllciBhZnRlciBpdCwgZGVwZW5kaW5nIG9uIHRoZSBmdW5jdGlvbi4gIEl0IGlzbid0IGd1YXJhbnRlZWQgdG8KICAgICAgaW5zZXJ0IGFueXRoaW5nIG1vcmUgdGhhbiBhIGNvbXBpbGVyIGJhcnJpZXIgaW4gYSBVUCBjb21waWxhdGlvbi4KIApAQCAtMTg5OCw3ICsxODk4LDcgQEAKIAlzbXBfd21iKCk7CiAJPEE6bW9kaWZ5IHY9Mj4JPEM6YnVzeT4KIAkJCTxDOnF1ZXVlIHY9Mj4KLQlwID0gJmI7CQlxID0gcDsKKwlwID0gJnY7CQlxID0gcDsKIAkJCTxEOnJlcXVlc3QgcD4KIAk8Qjptb2RpZnkgcD0mdj4JPEQ6Y29tbWl0IHA9JnY+CiAJCSAgCTxEOnJlYWQgcD4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vbWlwcy90aW1lLlJFQURNRSBiL0RvY3VtZW50YXRpb24vbWlwcy90aW1lLlJFQURNRQppbmRleCA2OWRkYzVjLi5hNGNlNjAzIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL21pcHMvdGltZS5SRUFETUUKKysrIGIvRG9jdW1lbnRhdGlvbi9taXBzL3RpbWUuUkVBRE1FCkBAIC0zOCwxOSArMzgsMTQgQEAKIAogICBhKSBJbXBsZW1lbnRzIGZ1bmN0aW9ucyByZXF1aXJlZCBieSBMaW51eCBjb21tb24gY29kZToKIAl0aW1lX2luaXQKLQlkb19nZXR0aW1lb2ZkYXkKLQlkb19zZXR0aW1lb2ZkYXkKIAogICBiKSBwcm92aWRlcyBhbiBhYnN0cmFjdGlvbiBvZiBSVEMgYW5kIG51bGwgUlRDIGltcGxlbWVudGF0aW9uIGFzIGRlZmF1bHQuCiAJZXh0ZXJuIHVuc2lnbmVkIGxvbmcgKCpydGNfZ2V0X3RpbWUpKHZvaWQpOwogCWV4dGVybiBpbnQgKCpydGNfc2V0X3RpbWUpKHVuc2lnbmVkIGxvbmcpOwogCi0gIGMpIGEgc2V0IG9mIGdldHRpbWVvZmZzZXQgZnVuY3Rpb25zIGZvciBkaWZmZXJlbnQgQ1BVcyBhbmQgZGlmZmVyZW50Ci0gICAgIG5lZWRzLgotCi0gIGQpIGhpZ2gtbGV2ZWwgYW5kIGxvdy1sZXZlbCB0aW1lciBpbnRlcnJ1cHQgcm91dGluZXMgd2hlcmUgdGhlIHRpbWVyIAotICAgICBpbnRlcnJ1cHQgc291cmNlICBtYXkgb3IgbWF5IG5vdCBiZSB0aGUgQ1BVIHRpbWVyLiAgVGhlIGhpZ2gtbGV2ZWwgCi0gICAgIHJvdXRpbmUgaXMgZGlzcGF0Y2hlZCB0aHJvdWdoIGRvX0lSUSgpIHdoaWxlIHRoZSBsb3ctbGV2ZWwgaXMgCisgIGMpIGhpZ2gtbGV2ZWwgYW5kIGxvdy1sZXZlbCB0aW1lciBpbnRlcnJ1cHQgcm91dGluZXMgd2hlcmUgdGhlIHRpbWVyCisgICAgIGludGVycnVwdCBzb3VyY2UgIG1heSBvciBtYXkgbm90IGJlIHRoZSBDUFUgdGltZXIuICBUaGUgaGlnaC1sZXZlbAorICAgICByb3V0aW5lIGlzIGRpc3BhdGNoZWQgdGhyb3VnaCBkb19JUlEoKSB3aGlsZSB0aGUgbG93LWxldmVsIGlzCiAgICAgIGRpc3BhdGNoZWQgaW4gYXNzZW1hYmx5IGNvZGUgKHVzdWFsbHkgaW50LWhhbmRsZXIuUykKIAogCkBAIC02Myw3ICs1OCw3IEBACiAgIGEpIGJvYXJkX3RpbWVfaW5pdCAtIGEgZnVuY3Rpb24gcG9pbnRlci4gIEludm9rZWQgYXQgdGhlIGJlZ2lubmlnIG9mCiAgICAgIHRpbWVfaW5pdCgpLiAgSXQgaXMgb3B0aW9uYWwuCiAJMS4gKG9wdGlvbmFsKSBzZXQgdXAgUlRDIHJvdXRpbmVzCi0JMi4gKG9wdGlvbmFsKSBjYWxpYnJhdGUgYW5kIHNldCB0aGUgbWlwc19jb3VudGVyX2ZyZXF1ZW5jeQorCTIuIChvcHRpb25hbCkgY2FsaWJyYXRlIGFuZCBzZXQgdGhlIG1pcHNfaHB0X2ZyZXF1ZW5jeQogCiAgIGIpIHBsYXRfdGltZXJfc2V0dXAgLSBhIGZ1bmN0aW9uIHBvaW50ZXIuICBJbnZva2VkIGF0IHRoZSBlbmQgb2YgdGltZV9pbml0KCkKIAkxLiAob3B0aW9uYWwpIG92ZXItcmlkZSBhbnkgZGVjaXNpb25zIG1hZGUgaW4gdGltZV9pbml0KCkKQEAgLTcyLDkgKzY3LDggQEAKIAogICBjKSAob3B0aW9uYWwpIGJvYXJkLXNwZWNpZmljIFJUQyByb3V0aW5lcy4KIAotICBkKSAob3B0aW9uYWwpIG1pcHNfY291bnRlcl9mcmVxdWVuY3kgLSBJdCBtdXN0IGJlIGRlZmluaWVkIGlmIHRoZSBib2FyZAotICAgICBpcyB1c2luZyBDUFUgY291bnRlciBmb3IgdGltZXIgaW50ZXJydXB0IG9yIGl0IGlzIHVzaW5nIGZpeGVkIHJhdGUKLSAgICAgZ2V0dGltZW9mZnNldCgpLgorICBkKSAob3B0aW9uYWwpIG1pcHNfaHB0X2ZyZXF1ZW5jeSAtIEl0IG11c3QgYmUgZGVmaW5pZWQgaWYgdGhlIGJvYXJkCisgICAgIGlzIHVzaW5nIENQVSBjb3VudGVyIGZvciB0aW1lciBpbnRlcnJ1cHQuCiAKIAogUE9SVElORyBHVUlERQpAQCAtODksMjIgKzgzLDEyIEBACiAgICAgIElmIHRoZSBhbnN3ZXIgaXMgbm8sIHlvdSBuZWVkIGEgdGltZXIgdG8gcHJvdmlkZSB0aGUgdGltZXIgaW50ZXJydXB0CiAgICAgIGF0IDEwMCBIWiBzcGVlZC4KIAotICAgICBZb3UgY2Fubm90IHVzZSB0aGUgZmFzdCBnZXR0aW1lb2Zmc2V0IGZ1bmN0aW9ucywgaS5lLiwKLQotCXVuc2lnbmVkIGxvbmcgZml4ZWRfcmF0ZV9nZXR0aW1lb2Zmc2V0KHZvaWQpOwotCXVuc2lnbmVkIGxvbmcgY2FsaWJyYXRlX2RpdjMyX2dldHRpbWVvZmZzZXQodm9pZCk7Ci0JdW5zaWduZWQgbG9uZyBjYWxpYnJhdGVfZGl2NjRfZ2V0dGltZW9mZnNldCh2b2lkKTsKLQotICAgIFlvdSBjYW4gdXNlIG51bGxfZ2V0dGltZW9mZnNldCgpIHdpbGwgZ2l2ZXMgdGhlIHNhbWUgdGltZSByZXNvbHV0aW9uIGFzCi0gICAgamlmZnkuICBPciB5b3UgY2FuIGltcGxlbWVudCB5b3VyIG93biBnZXR0aW1lb2Zmc2V0IChwcm9iYWJseSBiYXNlZCBvbiAKLSAgICBzb21lIGFkIGhvYyBoYXJkd2FyZSBvbiB5b3VyIG1hY2hpbmUuKQotCiAgIGMpIFRoZSBmb2xsb3dpbmcgc3ViIHN0ZXBzIGFzc3VtZSB5b3VyIENQVSBoYXMgY291bnRlciByZWdpc3Rlci4KICAgICAgRG8geW91IHBsYW4gdG8gdXNlIHRoZSBDUFUgY291bnRlciByZWdpc3RlciBhcyB0aGUgdGltZXIgaW50ZXJydXB0CiAgICAgIG9yIHVzZSBhbiBleG50ZXJuYWwgdGltZXI/CiAKICAgICAgSW4gb3JkZXIgdG8gdXNlIENQVSBjb3VudGVyIHJlZ2lzdGVyIGFzIHRoZSB0aW1lciBpbnRlcnJ1cHQgc291cmNlLCB5b3UKLSAgICAgbXVzdCBrbm93IHRoZSBjb3VudGVyIHNwZWVkIChtaXBzX2NvdW50ZXJfZnJlcXVlbmN5KS4gIEl0IGlzIHVzdWFsbHkgdGhlCisgICAgIG11c3Qga25vdyB0aGUgY291bnRlciBzcGVlZCAobWlwc19ocHRfZnJlcXVlbmN5KS4gIEl0IGlzIHVzdWFsbHkgdGhlCiAgICAgIHNhbWUgYXMgdGhlIENQVSBzcGVlZCBvciBhbiBpbnRlZ3JhbCBkaXZpc29yIG9mIGl0LgogCiAgIGQpIGRlY2lkZSBvbiB3aGV0aGVyIHlvdSB3YW50IHRvIHVzZSBoaWdoLWxldmVsIG9yIGxvdy1sZXZlbCB0aW1lcgpAQCAtMTIxLDEwICsxMDUsMTAgQEAKICAgaWYgbmVlZGVkLgogCiAgIGJvYXJkX3RpbWVfaW5pdCgpIC0KLSAgCWEpIChvcHRpb25hbCkgc2V0IHVwIFJUQyByb3V0aW5lcywgCi0gICAgICAgIGIpIChvcHRpb25hbCkgY2FsaWJyYXRlIGFuZCBzZXQgdGhlIG1pcHNfY291bnRlcl9mcmVxdWVuY3kKLSAJICAgIChvbmx5IG5lZWRlZCBpZiB5b3UgaW50ZW5kZWQgdG8gdXNlIGZpeGVkX3JhdGVfZ2V0dGltZW9mZnNldAotIAkgICAgIG9yIHVzZSBjcHUgY291bnRlciBhcyB0aW1lciBpbnRlcnJ1cHQgc291cmNlKQorICAJYSkgKG9wdGlvbmFsKSBzZXQgdXAgUlRDIHJvdXRpbmVzLAorICAgICAgICBiKSAob3B0aW9uYWwpIGNhbGlicmF0ZSBhbmQgc2V0IHRoZSBtaXBzX2hwdF9mcmVxdWVuY3kKKyAJICAgIChvbmx5IG5lZWRlZCBpZiB5b3UgaW50ZW5kZWQgdG8gdXNlIGNwdSBjb3VudGVyIGFzIHRpbWVyIGludGVycnVwdAorIAkgICAgIHNvdXJjZSkKIAogICBwbGF0X3RpbWVyX3NldHVwKCkgLQogIAlhKSAob3B0aW9uYWwpIG92ZXItd3JpdGUgYW55IGNob2ljZXMgbWFkZSBhYm92ZSBieSB0aW1lX2luaXQoKS4KQEAgLTE1NCw4ICsxMzgsOCBAQAogRm9yIGV4YW1wbGUsIHlvdSBtYXkgZGVmaW5lIHlvdXIgb3duIHRpbWVyIGludGVycnVwdCByb3V0aW5lLCB3aGljaCBkb2VzCiBzb21lIG9mIGl0cyBvd24gcHJvY2Vzc2luZyBhbmQgdGhlbiBjYWxscyB0aW1lcl9pbnRlcnJ1cHQoKS4KIAotWW91IGNhbiBhbHNvIG92ZXItcmlkZSBhbnkgb2YgdGhlIGJ1aWx0LWluIGZ1bmN0aW9ucyAoZ2V0dGltZW9mZnNldCwKLVJUQyByb3V0aW5lcyBhbmQvb3IgdGltZXIgaW50ZXJydXB0IHJvdXRpbmUpLgorWW91IGNhbiBhbHNvIG92ZXItcmlkZSBhbnkgb2YgdGhlIGJ1aWx0LWluIGZ1bmN0aW9ucyAoUlRDIHJvdXRpbmVzCithbmQvb3IgdGltZXIgaW50ZXJydXB0IHJvdXRpbmUpLgogCiAKIFBPUlRJTkcgTk9URVMgRk9SIFNNUApAQCAtMTg3LDEwICsxNzEsMyBAQAogCiAJWW91IGNhbiBhbHNvIGRvIHRoZSBsb3ctbGV2ZWwgdmVyc2lvbiBvZiB0aG9zZSBpbnRlcnJ1cHQgcm91dGluZXMsCiAJZm9sbG93aW5nIHNpbWlsYXIgZGlzcGF0Y2hpbmcgcm91dGVzIGRlc2NyaWJlZCBhYm92ZS4KLQotTm90ZSBhYm91dCBkb19nZXR0aW1lb2Zmc2V0KCk6Ci0KLSAgSXQgaXMgdmVyeSBsaWtlbHkgdGhlIENQVSBjb3VudGVyIHJlZ2lzdGVycyBhcmUgbm90IHN5bmMnZWQgdXAgaW4gYSBTTVAgYm94LgotICBUaGVyZWZvcmUgeW91IGNhbm5vdCByZWFsbHkgdXNlIHRoZSBtYW55IG9mIHRoZSBleGlzdGluZyByb3V0aW5lcyB0aGF0Ci0gIGFyZSBiYXNlZCBvbiBDUFUgY291bnRlci4gIFlvdSBzaG91bGQgd2lydGUgeW91ciBvd24gZ2V0dGltZW9mZnNldCByb3VpbnRlCi0gIGlmIHlvdSB3YW50IGludHJhLWppZmZ5IHJlc29sdXRpb24uCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL3Bvd2VyL2ludGVyZmFjZS50eHQgYi9Eb2N1bWVudGF0aW9uL3Bvd2VyL2ludGVyZmFjZS50eHQKaW5kZXggYTY2YmVjMi4uNzQzMTFkNyAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9wb3dlci9pbnRlcmZhY2UudHh0CisrKyBiL0RvY3VtZW50YXRpb24vcG93ZXIvaW50ZXJmYWNlLnR4dApAQCAtMzAsNiArMzAsMTcgQEAKIHRoYXQgaXMga25vd24gYSBwcmlvcmkuIEJ1dCwgdGhlIHVzZXIgbWF5IGNob29zZSAnc2h1dGRvd24nIG9yCiAncmVib290JyBhcyBhbHRlcm5hdGl2ZXMuIAogCitBZGRpdGlvbmFsbHksIC9zeXMvcG93ZXIvZGlzayBjYW4gYmUgdXNlZCB0byB0dXJuIG9uIG9uZSBvZiB0aGUgdHdvIHRlc3RpbmcKK21vZGVzIG9mIHRoZSBzdXNwZW5kLXRvLWRpc2sgbWVjaGFuaXNtOiAndGVzdHByb2MnIG9yICd0ZXN0Jy4gIElmIHRoZQorc3VzcGVuZC10by1kaXNrIG1lY2hhbmlzbSBpcyBpbiB0aGUgJ3Rlc3Rwcm9jJyBtb2RlLCB3cml0aW5nICdkaXNrJyB0bworL3N5cy9wb3dlci9zdGF0ZSB3aWxsIGNhdXNlIHRoZSBrZXJuZWwgdG8gZGlzYWJsZSBub25ib290IENQVXMgYW5kIGZyZWV6ZQordGFza3MsIHdhaXQgZm9yIDUgc2Vjb25kcywgdW5mcmVlemUgdGFza3MgYW5kIGVuYWJsZSBub25ib290IENQVXMuICBJZiBpdCBpcworaW4gdGhlICd0ZXN0JyBtb2RlLCB3cml0aW5nICdkaXNrJyB0byAvc3lzL3Bvd2VyL3N0YXRlIHdpbGwgY2F1c2UgdGhlIGtlcm5lbAordG8gZGlzYWJsZSBub25ib290IENQVXMgYW5kIGZyZWV6ZSB0YXNrcywgc2hyaW5rIG1lbW9yeSwgc3VzcGVuZCBkZXZpY2VzLCB3YWl0Citmb3IgNSBzZWNvbmRzLCByZXN1bWUgZGV2aWNlcywgdW5mcmVlemUgdGFza3MgYW5kIGVuYWJsZSBub25ib290IENQVXMuICBUaGVuLAord2UgYXJlIGFibGUgdG8gbG9vayBpbiB0aGUgbG9nIG1lc3NhZ2VzIGFuZCB3b3JrIG91dCwgZm9yIGV4YW1wbGUsIHdoaWNoIGNvZGUKK2lzIGJlaW5nIHNsb3cgYW5kIHdoaWNoIGRldmljZSBkcml2ZXJzIGFyZSBtaXNiZWhhdmluZy4KKwogUmVhZGluZyBmcm9tIHRoaXMgZmlsZSB3aWxsIGRpc3BsYXkgd2hhdCB0aGUgbW9kZSBpcyBjdXJyZW50bHkgc2V0CiB0by4gV3JpdGluZyB0byB0aGlzIGZpbGUgd2lsbCBhY2NlcHQgb25lIG9mCiAKQEAgLTM3LDYgKzQ4LDggQEAKICAgICAgICAncGxhdGZvcm0nCiAgICAgICAgJ3NodXRkb3duJwogICAgICAgICdyZWJvb3QnCisgICAgICAgJ3Rlc3Rwcm9jJworICAgICAgICd0ZXN0JwogCiBJdCB3aWxsIG9ubHkgY2hhbmdlIHRvICdmaXJtd2FyZScgb3IgJ3BsYXRmb3JtJyBpZiB0aGUgc3lzdGVtIHN1cHBvcnRzCiBpdC4gCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL3MzOTAvQ29tbW9uSU8gYi9Eb2N1bWVudGF0aW9uL3MzOTAvQ29tbW9uSU8KaW5kZXggNTlkMTE2Ni4uZDY4NGE2YSAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9zMzkwL0NvbW1vbklPCisrKyBiL0RvY3VtZW50YXRpb24vczM5MC9Db21tb25JTwpAQCAtNjYsNyArNjYsNyBAQAogCiAgIFdoZW4gYSBkZXZpY2UgaXMgdW4taWdub3JlZCwgZGV2aWNlIHJlY29nbml0aW9uIGFuZCBzZW5zaW5nIGlzIHBlcmZvcm1lZCBhbmQgCiAgIHRoZSBkZXZpY2UgZHJpdmVyIHdpbGwgYmUgbm90aWZpZWQgaWYgcG9zc2libGUsIHNvIHRoZSBkZXZpY2Ugd2lsbCBiZWNvbWUKLSAgYXZhaWxhYmxlIHRvIHRoZSBzeXN0ZW0uCisgIGF2YWlsYWJsZSB0byB0aGUgc3lzdGVtLiBOb3RlIHRoYXQgdW4taWdub3JpbmcgaXMgcGVyZm9ybWVkIGFzeW5jaHJvbm91c2x5LgogCiAgIFlvdSBjYW4gYWxzbyBhZGQgcmFuZ2VzIG9mIGRldmljZXMgdG8gYmUgaWdub3JlZCBieSBwaXBpbmcgdG8gCiAgIC9wcm9jL2Npb19pZ25vcmU7ICJhZGQgPGRldmljZSByYW5nZT4sIDxkZXZpY2UgcmFuZ2U+LCAuLi4iIHdpbGwgaWdub3JlIHRoZQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9zMzkwL2Nkcy50eHQgYi9Eb2N1bWVudGF0aW9uL3MzOTAvY2RzLnR4dAppbmRleCBkODBlNTczLi4zMmE5NmNjIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL3MzOTAvY2RzLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL3MzOTAvY2RzLnR4dApAQCAtMTc0LDE0ICsxNzQsMTAgQEAKIAogVGhpcyByb3V0aW5lIHJldHVybnMgdGhlIGNoYXJhY3RlcmlzdGljcyBmb3IgdGhlIGRldmljZSBzcGVjaWZpZWQuCiAKLVRoZSBmdW5jdGlvbiBpcyBtZWFudCB0byBiZSBjYWxsZWQgd2l0aCBhbiBpcnEgaGFuZGxlciBpbiBwbGFjZTsgdGhhdCBpcywKK1RoZSBmdW5jdGlvbiBpcyBtZWFudCB0byBiZSBjYWxsZWQgd2l0aCB0aGUgZGV2aWNlIGFscmVhZHkgZW5hYmxlZDsgdGhhdCBpcywKIGF0IGVhcmxpZXN0IGR1cmluZyBzZXRfb25saW5lKCkgcHJvY2Vzc2luZy4KIAotV2hpbGUgdGhlIHJlcXVlc3QgaXMgcHJvY2Vzc2VkIHN5bmNocm9ub3VzbHksIHRoZSBkZXZpY2UgaW50ZXJydXB0Ci1oYW5kbGVyIGlzIGNhbGxlZCBmb3IgZmluYWwgZW5kaW5nIHN0YXR1cy4gSW4gY2FzZSBvZiBlcnJvciBzaXR1YXRpb25zIHRoZQotaW50ZXJydXB0IGhhbmRsZXIgbWF5IHJlY292ZXIgYXBwcm9wcmlhdGVseS4gVGhlIGRldmljZSBpcnEgaGFuZGxlciBjYW4KLXJlY29nbml6ZSB0aGUgY29ycmVzcG9uZGluZyBpbnRlcnJ1cHRzIGJ5IHRoZSBpbnRlcnJ1cHRpb24gcGFyYW1ldGVyIGJlCi0weDAwNTI0NDQzLiBUaGUgY2N3X2RldmljZSBtdXN0IG5vdCBiZSBsb2NrZWQgcHJpb3IgdG8gY2FsbGluZyByZWFkX2Rldl9jaGFycygpLgorVGhlIGNjd19kZXZpY2UgbXVzdCBub3QgYmUgbG9ja2VkIHByaW9yIHRvIGNhbGxpbmcgcmVhZF9kZXZfY2hhcnMoKS4KIAogVGhlIGZ1bmN0aW9uIG1heSBiZSBjYWxsZWQgZW5hYmxlZCBvciBkaXNhYmxlZC4KIApAQCAtNDEwLDI2ICs0MDYsNyBAQAogCiBVc2FnZSBOb3RlcyA6CiAKLVByaW9yIHRvIGNhbGwgY2N3X2RldmljZV9zdGFydCgpIHRoZSBkZXZpY2UgZHJpdmVyIG11c3QgYXNzdXJlIGRpc2FibGVkIHN0YXRlLAotaS5lLiB0aGUgSS9PIG1hc2sgdmFsdWUgaW4gdGhlIFBTVyBtdXN0IGJlIGRpc2FibGVkLiBUaGlzIGNhbiBiZSBhY2NvbXBsaXNoZWQKLWJ5IGNhbGxpbmcgbG9jYWxfc2F2ZV9mbGFncyggZmxhZ3MpLiBUaGUgY3VycmVudCBQU1cgZmxhZ3MgYXJlIHByZXNlcnZlZCBhbmQKLWNhbiBiZSByZXN0b3JlZCBieSBsb2NhbF9pcnFfcmVzdG9yZSggZmxhZ3MpIGF0IGEgbGF0ZXIgdGltZS4KLQotSWYgdGhlIGRldmljZSBkcml2ZXIgdmlvbGF0ZXMgdGhpcyBydWxlIHdoaWxlIHJ1bm5pbmcgaW4gYSB1bmktcHJvY2Vzc29yCi1lbnZpcm9ubWVudCBhbiBpbnRlcnJ1cHQgbWlnaHQgYmUgcHJlc2VudGVkIHByaW9yIHRvIHRoZSBjY3dfZGV2aWNlX3N0YXJ0KCkKLXJvdXRpbmUgcmV0dXJuaW5nIHRvIHRoZSBkZXZpY2UgZHJpdmVyIG1haW4gcGF0aC4gSW4gdGhpcyBjYXNlIHdlIHdpbGwgZW5kIGluIGEKLWRlYWRsb2NrIHNpdHVhdGlvbiBhcyB0aGUgaW50ZXJydXB0IGhhbmRsZXIgd2lsbCB0cnkgdG8gb2J0YWluIHRoZSBpcnEKLWxvY2sgdGhlIGRldmljZSBkcml2ZXIgc3RpbGwgb3ducyAoc2VlIGJlbG93KSAhCi0KLVRoZSBkcml2ZXIgbXVzdCBhc3N1cmUgdG8gaG9sZCB0aGUgZGV2aWNlIHNwZWNpZmljIGxvY2suIFRoaXMgY2FuIGJlCi1hY2NvbXBsaXNoZWQgYnkKLQotKGkpICBzcGluX2xvY2soZ2V0X2Njd2Rldl9sb2NrKGNkZXYpKSwgb3IKLShpaSkgc3Bpbl9sb2NrX2lycXNhdmUoZ2V0X2Njd2Rldl9sb2NrKGNkZXYpLCBmbGFncykKLQotT3B0aW9uIChpKSBzaG91bGQgYmUgdXNlZCBpZiB0aGUgY2FsbGluZyByb3V0aW5lIGlzIHJ1bm5pbmcgZGlzYWJsZWQgZm9yCi1JL08gaW50ZXJydXB0cyAoc2VlIGFib3ZlKSBhbHJlYWR5LiBPcHRpb24gKGlpKSBvYnRhaW5zIHRoZSBkZXZpY2UgZ2F0ZSB1bmQKLXB1dHMgdGhlIENQVSBpbnRvIEkvTyBkaXNhYmxlZCBzdGF0ZSBieSBwcmVzZXJ2aW5nIHRoZSBjdXJyZW50IFBTVyBmbGFncy4KK2Njd19kZXZpY2Vfc3RhcnQoKSBtdXN0IGJlIGNhbGxlZCBkaXNhYmxlZCBhbmQgd2l0aCB0aGUgY2N3IGRldmljZSBsb2NrIGhlbGQuCiAKIFRoZSBkZXZpY2UgZHJpdmVyIGlzIGFsbG93ZWQgdG8gaXNzdWUgdGhlIG5leHQgY2N3X2RldmljZV9zdGFydCgpIGNhbGwgZnJvbQogd2l0aGluIGl0cyBpbnRlcnJ1cHQgaGFuZGxlciBhbHJlYWR5LiBJdCBpcyBub3QgcmVxdWlyZWQgdG8gc2NoZWR1bGUgYQpAQCAtNDg4LDcgKzQ2NSw3IEBACiAKIGNkZXYgLSBjY3dfZGV2aWNlIHRoZSByZXN1bWUgb3BlcmF0aW9uIGlzIHJlcXVlc3RlZCBmb3IKIAotVGhlIHJlc3VtZV9JTygpIGZ1bmN0aW9uIHJldHVybnM6CitUaGUgY2N3X2RldmljZV9yZXN1bWUoKSBmdW5jdGlvbiByZXR1cm5zOgogCiAgICAgICAgIDAgIC0gc3VzcGVuZGVkIGNoYW5uZWwgcHJvZ3JhbSBpcyByZXN1bWVkCiAtRUJVU1kgICAgIC0gc3RhdHVzIHBlbmRpbmcKQEAgLTUwNyw2ICs0ODQsOCBAQAogYSBoYWx0IHN1YmNoYW5uZWwgKEhTQ0gpIEkvTyBjb21tYW5kLiBGb3IgdGhvc2UgcHVycG9zZXMgdGhlIGNjd19kZXZpY2VfaGFsdCgpCiBjb21tYW5kIGlzIHByb3ZpZGVkLgogCitjY3dfZGV2aWNlX2hhbHQoKSBtdXN0IGJlIGNhbGxlZCBkaXNhYmxlZCBhbmQgd2l0aCB0aGUgY2N3IGRldmljZSBsb2NrIGhlbGQuCisKIGludCBjY3dfZGV2aWNlX2hhbHQoc3RydWN0IGNjd19kZXZpY2UgKmNkZXYsCiAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgaW50cGFybSk7CiAKQEAgLTUxNyw3ICs0OTYsNyBAQAogCiBUaGUgY2N3X2RldmljZV9oYWx0KCkgZnVuY3Rpb24gcmV0dXJucyA6CiAKLSAgICAgIDAgLSBzdWNjZXNzZnVsIGNvbXBsZXRpb24gb3IgcmVxdWVzdCBzdWNjZXNzZnVsbHkgaW5pdGlhdGVkCisgICAgICAwIC0gcmVxdWVzdCBzdWNjZXNzZnVsbHkgaW5pdGlhdGVkCiAtRUJVU1kgIC0gdGhlIGRldmljZSBpcyBjdXJyZW50bHkgYnVzeSwgb3Igc3RhdHVzIHBlbmRpbmcuCiAtRU5PREVWIC0gY2RldiBpbnZhbGlkLgogLUVJTlZBTCAtIFRoZSBkZXZpY2UgaXMgbm90IG9wZXJhdGlvbmFsIG9yIHRoZSBjY3cgZGV2aWNlIGlzIG5vdCBvbmxpbmUuCkBAIC01MzMsNiArNTEyLDIzIEBACiByZWFkIHRvIGEgbmV0d29yayBkZXZpY2UgKHdpdGggb3Igd2l0aG91dCBQQ0kgZmxhZykgYSBjY3dfZGV2aWNlX2hhbHQoKQogaXMgcmVxdWlyZWQgdG8gZW5kIHRoZSBwZW5kaW5nIG9wZXJhdGlvbi4KIAorY2N3X2RldmljZV9jbGVhcigpIC0gVGVybWluYWdlIEkvTyBSZXF1ZXN0IFByb2Nlc3NpbmcKKworSW4gb3JkZXIgdG8gdGVybWluYXRlIGFsbCBJL08gcHJvY2Vzc2luZyBhdCB0aGUgc3ViY2hhbm5lbCwgdGhlIGNsZWFyIHN1YmNoYW5uZWwKKyhDU0NIKSBjb21tYW5kIGlzIHVzZWQuIEl0IGNhbiBiZSBpc3N1ZWQgdmlhIGNjd19kZXZpY2VfY2xlYXIoKS4KKworY2N3X2RldmljZV9jbGVhcigpIG11c3QgYmUgY2FsbGVkIGRpc2FibGVkIGFuZCB3aXRoIHRoZSBjY3cgZGV2aWNlIGxvY2sgaGVsZC4KKworaW50IGNjd19kZXZpY2VfY2xlYXIoc3RydWN0IGNjd19kZXZpY2UgKmNkZXYsIHVuc2lnbmVkIGxvbmcgaW50cGFybSk7CisKK2NkZXY6CSBjY3dfZGV2aWNlIHRoZSBjbGVhciBvcGVyYXRpb24gaXMgcmVxdWVzdGVkIGZvcgoraW50cGFybTogaW50ZXJydXB0aW9uIHBhcmFtZXRlciAoc2VlIGNjd19kZXZpY2VfaGFsdCgpKQorCitUaGUgY2N3X2RldmljZV9jbGVhcigpIGZ1bmN0aW9uIHJldHVybnM6CisKKyAgICAgIDAgLSByZXF1ZXN0IHN1Y2Nlc3NmdWxseSBpbml0aWF0ZWQKKy1FTk9ERVYgLSBjZGV2IGludmFsaWQKKy1FSU5WQUwgLSBUaGUgZGV2aWNlIGlzIG5vdCBvcGVyYXRpb25hbCBvciB0aGUgY2N3IGRldmljZSBpcyBub3Qgb25saW5lLgogCiBNaXNjZWxsYW5lb3VzIFN1cHBvcnQgUm91dGluZXMKIApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9zMzkwL2RyaXZlci1tb2RlbC50eHQgYi9Eb2N1bWVudGF0aW9uL3MzOTAvZHJpdmVyLW1vZGVsLnR4dAppbmRleCA2MmMwODIzLi43N2JmNDUwIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL3MzOTAvZHJpdmVyLW1vZGVsLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL3MzOTAvZHJpdmVyLW1vZGVsLnR4dApAQCAtMjM5LDYgKzIzOSw5IEBACiAKIHR5cGUgLSBUaGUgcGh5c2ljYWwgdHlwZSBvZiB0aGUgY2hhbm5lbCBwYXRoLgogCitzaGFyZWQgLSBXaGV0aGVyIHRoZSBjaGFubmVsIHBhdGggaXMgc2hhcmVkLgorCitjbWcgLSBUaGUgY2hhbm5lbCBtZWFzdXJlbWVudCBncm91cC4KIAogMy4gU3lzdGVtIGRldmljZXMKIC0tLS0tLS0tLS0tLS0tLS0tCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL3NvdW5kL2Fsc2EvQUxTQS1Db25maWd1cmF0aW9uLnR4dCBiL0RvY3VtZW50YXRpb24vc291bmQvYWxzYS9BTFNBLUNvbmZpZ3VyYXRpb24udHh0CmluZGV4IDEzODY3M2EuLjM0NzJkOWMgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vc291bmQvYWxzYS9BTFNBLUNvbmZpZ3VyYXRpb24udHh0CisrKyBiL0RvY3VtZW50YXRpb24vc291bmQvYWxzYS9BTFNBLUNvbmZpZ3VyYXRpb24udHh0CkBAIC03NTMsNyArNzUzLDcgQEAKICAgICBwb3NpdGlvbl9maXggLSBGaXggRE1BIHBvaW50ZXIgKDAgPSBhdXRvLCAxID0gbm9uZSwgMiA9IFBPU0JVRiwgMyA9IEZJRk8gc2l6ZSkKICAgICBzaW5nbGVfY21kICAtIFVzZSBzaW5nbGUgaW1tZWRpYXRlIGNvbW1hbmRzIHRvIGNvbW11bmljYXRlIHdpdGgKIAkJY29kZWNzIChmb3IgZGVidWdnaW5nIG9ubHkpCi0gICAgZGlzYWJsZV9tc2kgLSBEaXNhYmxlIE1lc3NhZ2UgU2lnbmFsZWQgSW50ZXJydXB0IChNU0kpCisgICAgZW5hYmxlX21zaQktIEVuYWJsZSBNZXNzYWdlIFNpZ25hbGVkIEludGVycnVwdCAoTVNJKSAoZGVmYXVsdCA9IG9mZikKIAogICAgIFRoaXMgbW9kdWxlIHN1cHBvcnRzIG9uZSBjYXJkIGFuZCBhdXRvcHJvYmUuCiAKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vc3lzY3RsL2tlcm5lbC50eHQgYi9Eb2N1bWVudGF0aW9uL3N5c2N0bC9rZXJuZWwudHh0CmluZGV4IDg5YmY4YzIuLjBiYzdmMWUgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vc3lzY3RsL2tlcm5lbC50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9zeXNjdGwva2VybmVsLnR4dApAQCAtODYsNyArODYsNyBAQAogY29yZV9wYXR0ZXJuOgogCiBjb3JlX3BhdHRlcm4gaXMgdXNlZCB0byBzcGVjaWZ5IGEgY29yZSBkdW1wZmlsZSBwYXR0ZXJuIG5hbWUuCi0uIG1heCBsZW5ndGggNjQgY2hhcmFjdGVyczsgZGVmYXVsdCB2YWx1ZSBpcyAiY29yZSIKKy4gbWF4IGxlbmd0aCAxMjggY2hhcmFjdGVyczsgZGVmYXVsdCB2YWx1ZSBpcyAiY29yZSIKIC4gY29yZV9wYXR0ZXJuIGlzIHVzZWQgYXMgYSBwYXR0ZXJuIHRlbXBsYXRlIGZvciB0aGUgb3V0cHV0IGZpbGVuYW1lOwogICBjZXJ0YWluIHN0cmluZyBwYXR0ZXJucyAoYmVnaW5uaW5nIHdpdGggJyUnKSBhcmUgc3Vic3RpdHV0ZWQgd2l0aAogICB0aGVpciBhY3R1YWwgdmFsdWVzLgpAQCAtMTA1LDYgKzEwNSw5IEBACiAJJWgJaG9zdG5hbWUKIAklZQlleGVjdXRhYmxlIGZpbGVuYW1lCiAJJTxPVEhFUj4gYm90aCBhcmUgZHJvcHBlZAorLiBJZiB0aGUgZmlyc3QgY2hhcmFjdGVyIG9mIHRoZSBwYXR0ZXJuIGlzIGEgJ3wnLCB0aGUga2VybmVsIHdpbGwgdHJlYXQKKyAgdGhlIHJlc3Qgb2YgdGhlIHBhdHRlcm4gYXMgYSBjb21tYW5kIHRvIHJ1bi4gIFRoZSBjb3JlIGR1bXAgd2lsbCBiZQorICB3cml0dGVuIHRvIHRoZSBzdGFuZGFyZCBpbnB1dCBvZiB0aGF0IHByb2dyYW0gaW5zdGVhZCBvZiB0byBhIGZpbGUuCiAKID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vdXNiL3VzYi1zZXJpYWwudHh0IGIvRG9jdW1lbnRhdGlvbi91c2IvdXNiLXNlcmlhbC50eHQKaW5kZXggOGRjMmJhYy4uNTA0MzZlMSAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi91c2IvdXNiLXNlcmlhbC50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi91c2IvdXNiLXNlcmlhbC50eHQKQEAgLTQyOCwxMiArNDI4LDYgQEAKICAgU2VlIGh0dHA6Ly93d3cudXVoYXVzLmRlL2xpbnV4L3BhbG1jb25uZWN0Lmh0bWwgZm9yIHVwLXRvLWRhdGUKICAgaW5mb3JtYXRpb24gb24gdGhpcyBkcml2ZXIuCiAKLUFJUmNhYmxlIFVTQiBEb25nbGUgQmx1ZXRvb3RoIGRyaXZlcgotICBJZiB0aGVyZSBpcyB0aGUgY2RjX2FjbSBkcml2ZXIgbG9hZGVkIGluIHRoZSBzeXN0ZW0sIHlvdSB3aWxsIGZpbmQgdGhhdCB0aGUKLSAgY2RjX2FjbSBjbGFpbXMgdGhlIGRldmljZSBiZWZvcmUgQUlSY2FibGUgY2FuLiBUaGlzIGlzIHNpbXBseSBjb3JyZWN0ZWQKLSAgYnkgdW5sb2FkaW5nIGJvdGggbW9kdWxlcyBhbmQgdGhlbiBsb2FkaW5nIHRoZSBhaXJjYWJsZSBtb2R1bGUgYmVmb3JlCi0gIGNkY19hY20gbW9kdWxlCi0KIEdlbmVyaWMgU2VyaWFsIGRyaXZlcgogCiAgIElmIHlvdXIgZGV2aWNlIGlzIG5vdCBvbmUgb2YgdGhlIGFib3ZlIGxpc3RlZCBkZXZpY2VzLCBjb21wYXRpYmxlIHdpdGgKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vdmlkZW80bGludXgvQ0FSRExJU1QuY3g4OCBiL0RvY3VtZW50YXRpb24vdmlkZW80bGludXgvQ0FSRExJU1QuY3g4OAppbmRleCAxMjZlNTlkOS4uODc1NWIzZSAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi92aWRlbzRsaW51eC9DQVJETElTVC5jeDg4CisrKyBiL0RvY3VtZW50YXRpb24vdmlkZW80bGludXgvQ0FSRExJU1QuY3g4OApAQCAtNTEsNyArNTEsNyBAQAogIDUwIC0+IE5QRyBUZWNoIFJlYWwgVFYgRk0gVG9wIDEwICAgICAgICAgICAgICAgICAgICAgICAgICBbMTRmMTowODQyXQogIDUxIC0+IFdpbkZhc3QgRFRWMjAwMCBIICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbMTA3ZDo2NjVlXQogIDUyIC0+IEdlbmlhdGVjaCBEVkItUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbMTRmMTowMDg0XQotIDUzIC0+IEhhdXBwYXVnZSBXaW5UVi1IVlIzMDAwIFRyaU1vZGUgQW5hbG9nL0RWQi1TL0RWQi1UICBbMDA3MDoxNDA0XQorIDUzIC0+IEhhdXBwYXVnZSBXaW5UVi1IVlIzMDAwIFRyaU1vZGUgQW5hbG9nL0RWQi1TL0RWQi1UICBbMDA3MDoxNDA0LDAwNzA6MTQwMCwwMDcwOjE0MDEsMDA3MDoxNDAyXQogIDU0IC0+IE5vcndvb2QgTWljcm8gVFYgVHVuZXIKICA1NSAtPiBTaGVuemhlbiBUdW5nc3RlbiBBZ2VzIFRlY2ggVEUtRFRWLTI1MCAvIFN3YW5uIE9FTSAgW2MxODA6Yzk4MF0KICA1NiAtPiBIYXVwcGF1Z2UgV2luVFYtSFZSMTMwMCBEVkItVC9IeWJyaWQgTVBFRyBFbmNvZGVyICAgWzAwNzA6OTYwMCwwMDcwOjk2MDEsMDA3MDo5NjAyXQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi93YXRjaGRvZy9zcmMvd2F0Y2hkb2ctc2ltcGxlLmMgYi9Eb2N1bWVudGF0aW9uL3dhdGNoZG9nL3NyYy93YXRjaGRvZy1zaW1wbGUuYwppbmRleCA4NWNmMTdjLi40NzgwMWJjIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL3dhdGNoZG9nL3NyYy93YXRjaGRvZy1zaW1wbGUuYworKysgYi9Eb2N1bWVudGF0aW9uL3dhdGNoZG9nL3NyYy93YXRjaGRvZy1zaW1wbGUuYwpAQCAtMSw0ICsxLDYgQEAKKyNpbmNsdWRlIDxzdGRpby5oPgogI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgogI2luY2x1ZGUgPGZjbnRsLmg+CiAKIGludCBtYWluKGludCBhcmdjLCBjb25zdCBjaGFyICphcmd2W10pIHsKZGlmZiAtLWdpdCBhL01BSU5UQUlORVJTIGIvTUFJTlRBSU5FUlMKaW5kZXggOTMxZTZlNC4uYTU1MDhmOSAxMDA2NDQKLS0tIGEvTUFJTlRBSU5FUlMKKysrIGIvTUFJTlRBSU5FUlMKQEAgLTQ5Myw3ICs0OTMsNyBAQAogCiBCRlMgRklMRSBTWVNURU0KIFA6CVRpZ3JhbiBBLiBBaXZhemlhbgotTToJdGlncmFuQHZlcml0YXMuY29tCitNOgl0aWdyYW5AYWl2YXppYW4uZnNuZXQuY28udWsKIEw6CWxpbnV4LWtlcm5lbEB2Z2VyLmtlcm5lbC5vcmcKIFM6CU1haW50YWluZWQKIApAQCAtOTA1LDcgKzkwNSw4IEBACiBNOgl0ZWlnbGFuZEByZWRoYXQuY29tCiBMOgljbHVzdGVyLWRldmVsQHJlZGhhdC5jb20KIFc6CWh0dHA6Ly9zb3VyY2VzLnJlZGhhdC5jb20vY2x1c3Rlci8KLVQ6CWdpdCBrZXJuZWwub3JnOi9wdWIvc2NtL2xpbnV4L2tlcm5lbC9naXQvc3RldmUvZ2ZzLTIuNi5naXQKK1Q6CWdpdCBrZXJuZWwub3JnOi9wdWIvc2NtL2xpbnV4L2tlcm5lbC9naXQvc3RldmUvZ2ZzMi0yLjYtZml4ZXMuZ2l0CitUOglnaXQga2VybmVsLm9yZzovcHViL3NjbS9saW51eC9rZXJuZWwvZ2l0L3N0ZXZlL2dmczItMi42LW5tdy5naXQKIFM6CVN1cHBvcnRlZAogCiBEQVZJQ09NIEZBU1QgRVRIRVJORVQgKERNRkUpIE5FVFdPUksgRFJJVkVSCkBAIC0xMTg4LDcgKzExODksOCBAQAogTToJc3doaXRlaG9AcmVkaGF0LmNvbQogTDoJY2x1c3Rlci1kZXZlbEByZWRoYXQuY29tCiBXOglodHRwOi8vc291cmNlcy5yZWRoYXQuY29tL2NsdXN0ZXIvCi1UOglnaXQga2VybmVsLm9yZzovcHViL3NjbS9saW51eC9rZXJuZWwvZ2l0L3N0ZXZlL2dmcy0yLjYuZ2l0CitUOglnaXQga2VybmVsLm9yZzovcHViL3NjbS9saW51eC9rZXJuZWwvZ2l0L3N0ZXZlL2dmczItMi42LWZpeGVzLmdpdAorVDoJZ2l0IGtlcm5lbC5vcmc6L3B1Yi9zY20vbGludXgva2VybmVsL2dpdC9zdGV2ZS9nZnMyLTIuNi1ubXcuZ2l0CiBTOglTdXBwb3J0ZWQKIAogR0lHQVNFVCBJU0ROIERSSVZFUlMKQEAgLTE1MTEsNyArMTUxMyw3IEBACiAKIElOVEVMIElBMzIgTUlDUk9DT0RFIFVQREFURSBTVVBQT1JUCiBQOglUaWdyYW4gQWl2YXppYW4KLU06CXRpZ3JhbkB2ZXJpdGFzLmNvbQorTToJdGlncmFuQGFpdmF6aWFuLmZzbmV0LmNvLnVrCiBTOglNYWludGFpbmVkCiAKIElOVEVMIElYUDRYWCBSQU5ET00gTlVNQkVSIEdFTkVSQVRPUiBTVVBQT1JUCkBAIC0xNjY2LDYgKzE2NjgsMTIgQEAKIEw6CWV4dDItZGV2ZWxAbGlzdHMuc291cmNlZm9yZ2UubmV0CiBTOglNYWludGFpbmVkCiAKK0s4VEVNUCBIQVJEV0FSRSBNT05JVE9SSU5HIERSSVZFUgorUDoJUnVkb2xmIE1hcmVrCitNOglyLm1hcmVrQGFzc2VtYmxlci5jegorTDoJbG0tc2Vuc29yc0BsbS1zZW5zb3JzLm9yZworUzoJTWFpbnRhaW5lZAorCiBLQ09ORklHCiBQOglSb21hbiBaaXBwZWwKIE06CXppcHBlbEBsaW51eC1tNjhrLm9yZwpAQCAtMTk5Niw2ICsyMDA0LDEzIEBACiBMOglsaW51eC1rZXJuZWxAdmdlci5rZXJuZWwub3JnCiBTOglNYWludGFpbmVkCiAKK01TSSBMQVBUT1AgU1VQUE9SVAorUDoJTGVubmFydCBQb2V0dGVyaW5nCitNOgltenhyZWFyeUAwcG9pbnRlci5kZQorTDoJaHR0cHM6Ly90YW5nby4wcG9pbnRlci5kZS9tYWlsbWFuL2xpc3RpbmZvL3MyNzAtbGludXgKK1c6CWh0dHA6Ly8wcG9pbnRlci5kZS9sZW5uYXJ0L3RjaGliby5odG1sCitTOglNYWludGFpbmVkCisKIE1UUlIgQU5EIFNJTUlMQVIgU1VQUE9SVCBbaTM4Nl0KIFA6CVJpY2hhcmQgR29vY2gKIE06CXJnb29jaEBhdG5mLmNzaXJvLmF1CkBAIC0yMDAzLDggKzIwMTgsMTEgQEAKIFc6CWh0dHA6Ly93d3cuYXRuZi5jc2lyby5hdS9+cmdvb2NoL2xpbnV4L2tlcm5lbC1wYXRjaGVzLmh0bWwKIFM6CU1haW50YWluZWQKIAotTVVMVElNRURJQSBDQVJEIChNTUMpIFNVQlNZU1RFTQotUzoJT3JwaGFuCitNVUxUSU1FRElBIENBUkQgKE1NQykgQU5EIFNFQ1VSRSBESUdJVEFMIChTRCkgU1VCU1lTVEVNCitQOglQaWVycmUgT3NzbWFuCitNOglkcnpldXMtbW1jQGRyemV1cy5jeAorTDoJbGludXgta2VybmVsQHZnZXIua2VybmVsLm9yZworUzoJTWFpbnRhaW5lZAogCiBNVUxUSVNPVU5EIFNPVU5EIERSSVZFUgogUDoJQW5kcmV3IFZlbGlhdGgKQEAgLTIwNDAsMTEgKzIwNTgsMTMgQEAKIFA6CUphbWVzIE1vcnJpcwogUDoJSGFyYWxkIFdlbHRlCiBQOglKb3pzZWYgS2FkbGVjc2lrCi1NOgljb3JldGVhbUBuZXRmaWx0ZXIub3JnCitQOglQYXRyaWNrIE1jSGFyZHkKK006CWthYmVyQHRyYXNoLm5ldAorTDoJbmV0ZmlsdGVyLWRldmVsQGxpc3RzLm5ldGZpbHRlci5vcmcKK0w6CW5ldGZpbHRlckBsaXN0cy5uZXRmaWx0ZXIub3JnCitMOgljb3JldGVhbUBuZXRmaWx0ZXIub3JnCiBXOglodHRwOi8vd3d3Lm5ldGZpbHRlci5vcmcvCiBXOglodHRwOi8vd3d3LmlwdGFibGVzLm9yZy8KLUw6CW5ldGZpbHRlckBsaXN0cy5uZXRmaWx0ZXIub3JnCi1MOgluZXRmaWx0ZXItZGV2ZWxAbGlzdHMubmV0ZmlsdGVyLm9yZwogUzoJU3VwcG9ydGVkCiAKIE5FVExBQkVMCkBAIC0yMjk1LDggKzIzMTUsOCBAQAogUzoJU3VwcG9ydGVkCiAKIFBDSSBIT1RQTFVHIENPUkUKLVA6CUdyZWcgS3JvYWgtSGFydG1hbgotTToJZ3JlZ2toQHN1c2UuZGUKK1A6IAlLcmlzdGVuIENhcmxzb24gQWNjYXJkaQorTToJa3Jpc3Rlbi5jLmFjY2FyZGlAaW50ZWwuY29tCiBTOglTdXBwb3J0ZWQKIAogUENJIEhPVFBMVUcgQ09NUEFRIERSSVZFUgpAQCAtMzA1Miw2ICszMDcyLDEzIEBACiBXOglodHRwOi8vd3d3LmxpbnV4LXByb2plY3RzLm9yZwogUzoJTWFpbnRhaW5lZAogCitVU0IgR0FER0VUL1BFUklQSEVSQUwgU1VCU1lTVEVNCitQOglEYXZpZCBCcm93bmVsbAorTToJZGJyb3duZWxsQHVzZXJzLnNvdXJjZWZvcmdlLm5ldAorTDoJbGludXgtdXNiLWRldmVsQGxpc3RzLnNvdXJjZWZvcmdlLm5ldAorVzoJaHR0cDovL3d3dy5saW51eC11c2Iub3JnL2dhZGdldAorUzoJTWFpbnRhaW5lZAorCiBVU0IgSElEL0hJREJQIERSSVZFUlMKIFA6CVZvanRlY2ggUGF2bGlrCiBNOgl2b2p0ZWNoQHN1c2UuY3oKQEAgLTMyMzUsMTAgKzMyNjIsMTEgQEAKIEw6CWxpbnV4LXVzYi1kZXZlbEBsaXN0cy5zb3VyY2Vmb3JnZS5uZXQKIFM6CU1haW50YWluZWQKIAotVVNCICJVU0JORVQiIERSSVZFUgorVVNCICJVU0JORVQiIERSSVZFUiBGUkFNRVdPUksKIFA6CURhdmlkIEJyb3duZWxsCiBNOglkYnJvd25lbGxAdXNlcnMuc291cmNlZm9yZ2UubmV0CiBMOglsaW51eC11c2ItZGV2ZWxAbGlzdHMuc291cmNlZm9yZ2UubmV0CitXOglodHRwOi8vd3d3LmxpbnV4LXVzYi5vcmcvdXNibmV0CiBTOglNYWludGFpbmVkCiAKIFVTQiBXOTk2Wzg3XUNGIERSSVZFUgpkaWZmIC0tZ2l0IGEvTWFrZWZpbGUgYi9NYWtlZmlsZQppbmRleCAyNzRiNzgwLi45NThmYWQ2IDEwMDY0NAotLS0gYS9NYWtlZmlsZQorKysgYi9NYWtlZmlsZQpAQCAtMSw3ICsxLDcgQEAKIFZFUlNJT04gPSAyCiBQQVRDSExFVkVMID0gNgogU1VCTEVWRUwgPSAxOQotRVhUUkFWRVJTSU9OID0tcmMxCitFWFRSQVZFUlNJT04gPS1yYzYKIE5BTUU9QXZhc3QhIEEgYmlsZ2UgcmF0IQogCiAjICpET0NVTUVOVEFUSU9OKgpAQCAtNDk5LDYgKzQ5OSw3IEBACiAKIGlmZGVmIENPTkZJR19VTldJTkRfSU5GTwogQ0ZMQUdTCQkrPSAtZmFzeW5jaHJvbm91cy11bndpbmQtdGFibGVzCitMREZMQUdTX3ZtbGludXgJKz0gLS1laC1mcmFtZS1oZHIKIGVuZGlmCiAKIGlmZGVmIENPTkZJR19ERUJVR19JTkZPCkBAIC03NDEsNiArNzQyLDkgQEAKIAogIyB2bWxpbnV4IGltYWdlIC0gaW5jbHVkaW5nIHVwZGF0ZWQga2VybmVsIHN5bWJvbHMKIHZtbGludXg6ICQodm1saW51eC1sZHMpICQodm1saW51eC1pbml0KSAkKHZtbGludXgtbWFpbikgJChrYWxsc3ltcy5vKSBGT1JDRQoraWZkZWYgQ09ORklHX0hFQURFUlNfQ0hFQ0sKKwkkKFEpJChNQUtFKSAtZiAkKHNyY3RyZWUpL01ha2VmaWxlIGhlYWRlcnNfY2hlY2sKK2VuZGlmCiAJJChjYWxsIGlmX2NoYW5nZWRfcnVsZSx2bWxpbnV4X18pCiAJJChRKSQoTUFLRSkgLWYgJChzcmN0cmVlKS9zY3JpcHRzL01ha2VmaWxlLm1vZHBvc3QgJEAKIAkkKFEpcm0gLWYgLm9sZF92ZXJzaW9uCkBAIC05MzIsNyArOTM2LDcgQEAKIAogUEhPTlkgKz0gaGVhZGVyc19pbnN0YWxsCiBoZWFkZXJzX2luc3RhbGw6IGluY2x1ZGUvbGludXgvdmVyc2lvbi5oIHNjcmlwdHNfYmFzaWMgRk9SQ0UKLQlAaWYgWyAhIC1yIGluY2x1ZGUvYXNtLSQoQVJDSCkvS2J1aWxkIF07IHRoZW4gXAorCUBpZiBbICEgLXIgJChzcmN0cmVlKS9pbmNsdWRlL2FzbS0kKEFSQ0gpL0tidWlsZCBdOyB0aGVuIFwKIAkgIGVjaG8gJyoqKiBFcnJvcjogSGVhZGVycyBub3QgZXhwb3J0YWJsZSBmb3IgdGhpcyBhcmNoaXRlY3R1cmUgKCQoQVJDSCkpJzsgXAogCSAgZXhpdCAxIDsgZmkKIAkkKFEpJChNQUtFKSAkKGJ1aWxkKT1zY3JpcHRzIHNjcmlwdHMvdW5pZmRlZgpAQCAtMTMxNiw3ICsxMzIwLDggQEAKIAkgICAgJChhbGwtc291cmNlcykgfCB4YXJncyAkMSAtYSBcCiAJCS1JIF9faW5pdGRhdGEsX19leGl0ZGF0YSxfX2FjcXVpcmVzLF9fcmVsZWFzZXMgXAogCQktSSBFWFBPUlRfU1lNQk9MLEVYUE9SVF9TWU1CT0xfR1BMIFwKLQkJLS1leHRyYT0rZiAtLWMta2luZHM9K3B4OyBcCisJCS0tZXh0cmE9K2YgLS1jLWtpbmRzPStweCBcCisJCS0tcmVnZXgtYXNtPScvRU5UUllcKChbXildKilcKS4qL1wxLyc7IFwKIAkgICAgJChhbGwta2NvbmZpZ3MpIHwgeGFyZ3MgJDEgLWEgXAogCQktLWxhbmdkZWY9a2NvbmZpZyBcCiAJCS0tbGFuZ3VhZ2UtZm9yY2U9a2NvbmZpZyBcCmRpZmYgLS1naXQgYS9hcmNoL2FscGhhL2tlcm5lbC9hbHBoYV9rc3ltcy5jIGIvYXJjaC9hbHBoYS9rZXJuZWwvYWxwaGFfa3N5bXMuYwppbmRleCA4YjAyNDIwLi5lOTc2MmEzIDEwMDY0NAotLS0gYS9hcmNoL2FscGhhL2tlcm5lbC9hbHBoYV9rc3ltcy5jCisrKyBiL2FyY2gvYWxwaGEva2VybmVsL2FscGhhX2tzeW1zLmMKQEAgLTYsNDAgKzYsMTMgQEAKICAqLwogCiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+Ci0jaW5jbHVkZSA8bGludXgvdXNlci5oPgotI2luY2x1ZGUgPGxpbnV4L2VsZmNvcmUuaD4KLSNpbmNsdWRlIDxsaW51eC9zb2NrZXQuaD4KLSNpbmNsdWRlIDxsaW51eC9zeXNjYWxscy5oPgotI2luY2x1ZGUgPGxpbnV4L2luLmg+Ci0jaW5jbHVkZSA8bGludXgvaW42Lmg+Ci0jaW5jbHVkZSA8bGludXgvcGNpLmg+Ci0jaW5jbHVkZSA8bGludXgvc2NyZWVuX2luZm8uaD4KLSNpbmNsdWRlIDxsaW51eC90dHkuaD4KLSNpbmNsdWRlIDxsaW51eC9tbS5oPgotI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+Ci0jaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KLQotI2luY2x1ZGUgPGFzbS9pby5oPgogI2luY2x1ZGUgPGFzbS9jb25zb2xlLmg+Ci0jaW5jbHVkZSA8YXNtL2h3cnBiLmg+CiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KLSNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLmg+CiAjaW5jbHVkZSA8YXNtL2NoZWNrc3VtLmg+Ci0jaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAjaW5jbHVkZSA8YXNtL2ZwdS5oPgotI2luY2x1ZGUgPGFzbS9pcnEuaD4KICNpbmNsdWRlIDxhc20vbWFjaHZlYy5oPgotI2luY2x1ZGUgPGFzbS9wZ2FsbG9jLmg+Ci0jaW5jbHVkZSA8YXNtL3NlbWFwaG9yZS5oPgotI2luY2x1ZGUgPGFzbS90bGJmbHVzaC5oPgotI2luY2x1ZGUgPGFzbS9jYWNoZWZsdXNoLmg+Ci0jaW5jbHVkZSA8YXNtL3ZnYS5oPgogCi0jaW5jbHVkZSA8YXNtL3VuaXN0ZC5oPgotCi1leHRlcm4gc3RydWN0IGh3cnBiX3N0cnVjdCAqaHdycGI7Ci1leHRlcm4gc3BpbmxvY2tfdCBydGNfbG9jazsKKyNpbmNsdWRlIDxsaW51eC9zeXNjYWxscy5oPgogCiAvKiB0aGVzZSBhcmUgQyBydW50aW1lIGZ1bmN0aW9ucyB3aXRoIHNwZWNpYWwgY2FsbGluZyBjb252ZW50aW9uczogKi8KIGV4dGVybiB2b2lkIF9fZGl2bCAodm9pZCk7CkBAIC01MiwxNCArMjUsOSBAQAogZXh0ZXJuIHZvaWQgX19yZW1xdSAodm9pZCk7CiAKIEVYUE9SVF9TWU1CT0woYWxwaGFfbXYpOwotRVhQT1JUX1NZTUJPTChzY3JlZW5faW5mbyk7Ci1FWFBPUlRfU1lNQk9MKHBlcmZfaXJxKTsKIEVYUE9SVF9TWU1CT0woY2FsbGJhY2tfZ2V0ZW52KTsKIEVYUE9SVF9TWU1CT0woY2FsbGJhY2tfc2V0ZW52KTsKIEVYUE9SVF9TWU1CT0woY2FsbGJhY2tfc2F2ZV9lbnYpOwotI2lmZGVmIENPTkZJR19BTFBIQV9HRU5FUklDCi1FWFBPUlRfU1lNQk9MKGFscGhhX3VzaW5nX3NybSk7Ci0jZW5kaWYgLyogQ09ORklHX0FMUEhBX0dFTkVSSUMgKi8KIAogLyogcGxhdGZvcm0gZGVwZW5kZW50IHN1cHBvcnQgKi8KIEVYUE9SVF9TWU1CT0woc3RyY2F0KTsKQEAgLTc3LDQ3ICs0NSwxNCBAQAogRVhQT1JUX1NZTUJPTChjb3B5X3BhZ2UpOwogRVhQT1JUX1NZTUJPTChjbGVhcl9wYWdlKTsKIAotRVhQT1JUX1NZTUJPTChfX2RpcmVjdF9tYXBfYmFzZSk7Ci1FWFBPUlRfU1lNQk9MKF9fZGlyZWN0X21hcF9zaXplKTsKLQotI2lmZGVmIENPTkZJR19QQ0kKLUVYUE9SVF9TWU1CT0wocGNpX2FsbG9jX2NvbnNpc3RlbnQpOwotRVhQT1JUX1NZTUJPTChwY2lfZnJlZV9jb25zaXN0ZW50KTsKLUVYUE9SVF9TWU1CT0wocGNpX21hcF9zaW5nbGUpOwotRVhQT1JUX1NZTUJPTChwY2lfbWFwX3BhZ2UpOwotRVhQT1JUX1NZTUJPTChwY2lfdW5tYXBfc2luZ2xlKTsKLUVYUE9SVF9TWU1CT0wocGNpX3VubWFwX3BhZ2UpOwotRVhQT1JUX1NZTUJPTChwY2lfbWFwX3NnKTsKLUVYUE9SVF9TWU1CT0wocGNpX3VubWFwX3NnKTsKLUVYUE9SVF9TWU1CT0wocGNpX2RtYV9zdXBwb3J0ZWQpOwotRVhQT1JUX1NZTUJPTChwY2lfZGFjX2RtYV9zdXBwb3J0ZWQpOwotRVhQT1JUX1NZTUJPTChwY2lfZGFjX3BhZ2VfdG9fZG1hKTsKLUVYUE9SVF9TWU1CT0wocGNpX2RhY19kbWFfdG9fcGFnZSk7Ci1FWFBPUlRfU1lNQk9MKHBjaV9kYWNfZG1hX3RvX29mZnNldCk7Ci1FWFBPUlRfU1lNQk9MKGFscGhhX2dlbmRldl90b19wY2kpOwotI2VuZGlmCi1FWFBPUlRfU1lNQk9MKGRtYV9zZXRfbWFzayk7Ci0KLUVYUE9SVF9TWU1CT0woZHVtcF90aHJlYWQpOwotRVhQT1JUX1NZTUJPTChkdW1wX2VsZl90aHJlYWQpOwotRVhQT1JUX1NZTUJPTChkdW1wX2VsZl90YXNrKTsKLUVYUE9SVF9TWU1CT0woZHVtcF9lbGZfdGFza19mcCk7Ci1FWFBPUlRfU1lNQk9MKGh3cnBiKTsKLUVYUE9SVF9TWU1CT0woc3RhcnRfdGhyZWFkKTsKIEVYUE9SVF9TWU1CT0woYWxwaGFfcmVhZF9mcF9yZWcpOwogRVhQT1JUX1NZTUJPTChhbHBoYV9yZWFkX2ZwX3JlZ19zKTsKIEVYUE9SVF9TWU1CT0woYWxwaGFfd3JpdGVfZnBfcmVnKTsKIEVYUE9SVF9TWU1CT0woYWxwaGFfd3JpdGVfZnBfcmVnX3MpOwogCi0vKiBJbi1rZXJuZWwgc3lzdGVtIGNhbGxzLiAgKi8KKy8qIGVudHJ5LlMgKi8KIEVYUE9SVF9TWU1CT0woa2VybmVsX3RocmVhZCk7Ci1FWFBPUlRfU1lNQk9MKHN5c19kdXApOwotRVhQT1JUX1NZTUJPTChzeXNfZXhpdCk7Ci1FWFBPUlRfU1lNQk9MKHN5c193cml0ZSk7Ci1FWFBPUlRfU1lNQk9MKHN5c19sc2Vlayk7CiBFWFBPUlRfU1lNQk9MKGtlcm5lbF9leGVjdmUpOwotRVhQT1JUX1NZTUJPTChzeXNfc2V0c2lkKTsKLUVYUE9SVF9TWU1CT0woc3lzX3dhaXQ0KTsKIAogLyogTmV0d29ya2luZyBoZWxwZXIgcm91dGluZXMuICovCiBFWFBPUlRfU1lNQk9MKGNzdW1fdGNwdWRwX21hZ2ljKTsKQEAgLTEzNCwxMCArNjksNiBAQAogRVhQT1JUX1NZTUJPTChhbHBoYV9mcF9lbXVsKTsKICNlbmRpZgogCi0jaWZkZWYgQ09ORklHX0FMUEhBX0JST0tFTl9JUlFfTUFTSwotRVhQT1JUX1NZTUJPTChfX21pbl9pcGwpOwotI2VuZGlmCi0KIC8qCiAgKiBUaGUgZm9sbG93aW5nIGFyZSBzcGVjaWFsbHkgY2FsbGVkIGZyb20gdGhlIHVhY2Nlc3MgYXNzZW1ibHkgc3R1YnMuCiAgKi8KQEAgLTE2MCwyNyArOTEsMTAgQEAKICAqLwogCiAjaWZkZWYgQ09ORklHX1NNUAotRVhQT1JUX1NZTUJPTChmbHVzaF90bGJfbW0pOwotRVhQT1JUX1NZTUJPTChmbHVzaF90bGJfcmFuZ2UpOwotRVhQT1JUX1NZTUJPTChmbHVzaF90bGJfcGFnZSk7Ci1FWFBPUlRfU1lNQk9MKHNtcF9pbWIpOwotRVhQT1JUX1NZTUJPTChjcHVfZGF0YSk7Ci1FWFBPUlRfU1lNQk9MKHNtcF9udW1fY3B1cyk7Ci1FWFBPUlRfU1lNQk9MKHNtcF9jYWxsX2Z1bmN0aW9uKTsKLUVYUE9SVF9TWU1CT0woc21wX2NhbGxfZnVuY3Rpb25fb25fY3B1KTsKIEVYUE9SVF9TWU1CT0woX2F0b21pY19kZWNfYW5kX2xvY2spOwogI2VuZGlmIC8qIENPTkZJR19TTVAgKi8KIAogLyoKLSAqIE5VTUEgc3BlY2lmaWMgc3ltYm9scwotICovCi0jaWZkZWYgQ09ORklHX0RJU0NPTlRJR01FTQotRVhQT1JUX1NZTUJPTChub2RlX2RhdGEpOwotI2VuZGlmIC8qIENPTkZJR19ESVNDT05USUdNRU0gKi8KLQotRVhQT1JUX1NZTUJPTChydGNfbG9jayk7Ci0KLS8qCiAgKiBUaGUgZm9sbG93aW5nIGFyZSBzcGVjaWFsIGJlY2F1c2UgdGhleSdyZSBub3QgY2FsbGVkCiAgKiBleHBsaWNpdGx5ICh0aGUgQyBjb21waWxlciBvciBhc3NlbWJsZXIgZ2VuZXJhdGVzIHRoZW0gaW4KICAqIHJlc3BvbnNlIHRvIGRpdmlzaW9uIG9wZXJhdGlvbnMpLiAgRm9ydHVuYXRlbHksIHRoZWlyCkBAIC0yMDAsOCArMTE0LDMgQEAKIEVYUE9SVF9TWU1CT0wobWVtY3B5KTsKIEVYUE9SVF9TWU1CT0wobWVtc2V0KTsKIEVYUE9SVF9TWU1CT0wobWVtY2hyKTsKLQotI2lmZGVmIENPTkZJR19BTFBIQV9JUk9OR0FURQotRVhQT1JUX1NZTUJPTChpcm9uZ2F0ZV9pb3JlbWFwKTsKLUVYUE9SVF9TWU1CT0woaXJvbmdhdGVfaW91bm1hcCk7Ci0jZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvYWxwaGEva2VybmVsL2NvcmVfaXJvbmdhdGUuYyBiL2FyY2gvYWxwaGEva2VybmVsL2NvcmVfaXJvbmdhdGUuYwppbmRleCAxMzhkNDk3Li5lNGEwYmNmIDEwMDY0NAotLS0gYS9hcmNoL2FscGhhL2tlcm5lbC9jb3JlX2lyb25nYXRlLmMKKysrIGIvYXJjaC9hbHBoYS9rZXJuZWwvY29yZV9pcm9uZ2F0ZS5jCkBAIC00MDQsNiArNDA0LDcgQEAKICNlbmRpZgogCXJldHVybiAodm9pZCBfX2lvbWVtICopdmFkZHI7CiB9CitFWFBPUlRfU1lNQk9MKGlyb25nYXRlX2lvcmVtYXApOwogCiB2b2lkCiBpcm9uZ2F0ZV9pb3VubWFwKHZvbGF0aWxlIHZvaWQgX19pb21lbSAqeGFkZHIpCkBAIC00MTQsMyArNDE1LDQgQEAKIAlpZiAoYWRkcikKIAkJcmV0dXJuIHZmcmVlKCh2b2lkICopKFBBR0VfTUFTSyAmIGFkZHIpKTsgCiB9CitFWFBPUlRfU1lNQk9MKGlyb25nYXRlX2lvdW5tYXApOwpkaWZmIC0tZ2l0IGEvYXJjaC9hbHBoYS9rZXJuZWwvaXJxX2FscGhhLmMgYi9hcmNoL2FscGhhL2tlcm5lbC9pcnFfYWxwaGEuYwppbmRleCA2ZGQxMjZiLi5lMTZhZWI2IDEwMDY0NAotLS0gYS9hcmNoL2FscGhhL2tlcm5lbC9pcnFfYWxwaGEuYworKysgYi9hcmNoL2FscGhhL2tlcm5lbC9pcnFfYWxwaGEuYwpAQCAtNiw2ICs2LDcgQEAKICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogI2luY2x1ZGUgPGxpbnV4L2lycS5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbF9zdGF0Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAKICNpbmNsdWRlIDxhc20vbWFjaHZlYy5oPgogI2luY2x1ZGUgPGFzbS9kbWEuaD4KQEAgLTE2LDYgKzE3LDcgQEAKIC8qIEhhY2sgbWluaW11bSBJUEwgZHVyaW5nIGludGVycnVwdCBwcm9jZXNzaW5nIGZvciBicm9rZW4gaGFyZHdhcmUuICAqLwogI2lmZGVmIENPTkZJR19BTFBIQV9CUk9LRU5fSVJRX01BU0sKIGludCBfX21pbl9pcGw7CitFWFBPUlRfU1lNQk9MKF9fbWluX2lwbCk7CiAjZW5kaWYKIAogLyoKQEAgLTMwLDYgKzMyLDcgQEAKIH0KIAogdm9pZCAoKnBlcmZfaXJxKSh1bnNpZ25lZCBsb25nLCBzdHJ1Y3QgcHRfcmVncyAqKSA9IGR1bW15X3BlcmY7CitFWFBPUlRfU1lNQk9MKHBlcmZfaXJxKTsKIAogLyoKICAqIFRoZSBtYWluIGludGVycnVwdCBlbnRyeSBwb2ludC4KZGlmZiAtLWdpdCBhL2FyY2gvYWxwaGEva2VybmVsL3BjaS1ub29wLmMgYi9hcmNoL2FscGhhL2tlcm5lbC9wY2ktbm9vcC5jCmluZGV4IGZmZjVjZjkuLjE3NGI3MjkgMTAwNjQ0Ci0tLSBhL2FyY2gvYWxwaGEva2VybmVsL3BjaS1ub29wLmMKKysrIGIvYXJjaC9hbHBoYS9rZXJuZWwvcGNpLW5vb3AuYwpAQCAtMjAxLDYgKzIwMSw3IEBACiAKIAlyZXR1cm4gMDsKIH0KK0VYUE9SVF9TWU1CT0woZG1hX3NldF9tYXNrKTsKIAogdm9pZCBfX2lvbWVtICpwY2lfaW9tYXAoc3RydWN0IHBjaV9kZXYgKmRldiwgaW50IGJhciwgdW5zaWduZWQgbG9uZyBtYXhsZW4pCiB7CmRpZmYgLS1naXQgYS9hcmNoL2FscGhhL2tlcm5lbC9wY2lfaW9tbXUuYyBiL2FyY2gvYWxwaGEva2VybmVsL3BjaV9pb21tdS5jCmluZGV4IGM0NjhlMzEyLi42ZTdkMWZlIDEwMDY0NAotLS0gYS9hcmNoL2FscGhhL2tlcm5lbC9wY2lfaW9tbXUuYworKysgYi9hcmNoL2FscGhhL2tlcm5lbC9wY2lfaW9tbXUuYwpAQCAtMzAwLDYgKzMwMCw3IEBACiAJZGFjX2FsbG93ZWQgPSBwZGV2ID8gcGNpX2RhY19kbWFfc3VwcG9ydGVkKHBkZXYsIHBkZXYtPmRtYV9tYXNrKSA6IDA7IAogCXJldHVybiBwY2lfbWFwX3NpbmdsZV8xKHBkZXYsIGNwdV9hZGRyLCBzaXplLCBkYWNfYWxsb3dlZCk7CiB9CitFWFBPUlRfU1lNQk9MKHBjaV9tYXBfc2luZ2xlKTsKIAogZG1hX2FkZHJfdAogcGNpX21hcF9wYWdlKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBzdHJ1Y3QgcGFnZSAqcGFnZSwgdW5zaWduZWQgbG9uZyBvZmZzZXQsCkBAIC0zMTQsNiArMzE1LDcgQEAKIAlyZXR1cm4gcGNpX21hcF9zaW5nbGVfMShwZGV2LCAoY2hhciAqKXBhZ2VfYWRkcmVzcyhwYWdlKSArIG9mZnNldCwgCiAJCQkJc2l6ZSwgZGFjX2FsbG93ZWQpOwogfQorRVhQT1JUX1NZTUJPTChwY2lfbWFwX3BhZ2UpOwogCiAvKiBVbm1hcCBhIHNpbmdsZSBzdHJlYW1pbmcgbW9kZSBETUEgdHJhbnNsYXRpb24uICBUaGUgRE1BX0FERFIgYW5kCiAgICBTSVpFIG11c3QgbWF0Y2ggd2hhdCB3YXMgcHJvdmlkZWQgZm9yIGluIGEgcHJldmlvdXMgcGNpX21hcF9zaW5nbGUKQEAgLTM3OSw2ICszODEsNyBAQAogCURCR0EyKCJwY2lfdW5tYXBfc2luZ2xlOiBzZyBbJWx4LCVseF0gbnAgJWxkIGZyb20gJXBcbiIsCiAJICAgICAgZG1hX2FkZHIsIHNpemUsIG5wYWdlcywgX19idWlsdGluX3JldHVybl9hZGRyZXNzKDApKTsKIH0KK0VYUE9SVF9TWU1CT0wocGNpX3VubWFwX3NpbmdsZSk7CiAKIHZvaWQKIHBjaV91bm1hcF9wYWdlKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBkbWFfYWRkcl90IGRtYV9hZGRyLApAQCAtMzg2LDYgKzM4OSw3IEBACiB7CiAJcGNpX3VubWFwX3NpbmdsZShwZGV2LCBkbWFfYWRkciwgc2l6ZSwgZGlyZWN0aW9uKTsKIH0KK0VYUE9SVF9TWU1CT0wocGNpX3VubWFwX3BhZ2UpOwogCiAvKiBBbGxvY2F0ZSBhbmQgbWFwIGtlcm5lbCBidWZmZXIgdXNpbmcgY29uc2lzdGVudCBtb2RlIERNQSBmb3IgUENJCiAgICBkZXZpY2UuICBSZXR1cm5zIG5vbi1OVUxMIGNwdS12aWV3IHBvaW50ZXIgdG8gdGhlIGJ1ZmZlciBpZgpAQCAtNDI3LDYgKzQzMSw3IEBACiAKIAlyZXR1cm4gY3B1X2FkZHI7CiB9CitFWFBPUlRfU1lNQk9MKHBjaV9hbGxvY19jb25zaXN0ZW50KTsKIAogLyogRnJlZSBhbmQgdW5tYXAgYSBjb25zaXN0ZW50IERNQSBidWZmZXIuICBDUFVfQUREUiBhbmQgRE1BX0FERFIgbXVzdAogICAgYmUgdmFsdWVzIHRoYXQgd2VyZSByZXR1cm5lZCBmcm9tIHBjaV9hbGxvY19jb25zaXN0ZW50LiAgU0laRSBtdXN0CkBAIC00NDQsNyArNDQ5LDcgQEAKIAlEQkdBMigicGNpX2ZyZWVfY29uc2lzdGVudDogWyV4LCVseF0gZnJvbSAlcFxuIiwKIAkgICAgICBkbWFfYWRkciwgc2l6ZSwgX19idWlsdGluX3JldHVybl9hZGRyZXNzKDApKTsKIH0KLQorRVhQT1JUX1NZTUJPTChwY2lfZnJlZV9jb25zaXN0ZW50KTsKIAogLyogQ2xhc3NpZnkgdGhlIGVsZW1lbnRzIG9mIHRoZSBzY2F0dGVybGlzdC4gIFdyaXRlIGRtYV9hZGRyZXNzCiAgICBvZiBlYWNoIGVsZW1lbnQgd2l0aDoKQEAgLTY3Miw2ICs2NzcsNyBAQAogCQlwY2lfdW5tYXBfc2cocGRldiwgc3RhcnQsIG91dCAtIHN0YXJ0LCBkaXJlY3Rpb24pOwogCXJldHVybiAwOwogfQorRVhQT1JUX1NZTUJPTChwY2lfbWFwX3NnKTsKIAogLyogVW5tYXAgYSBzZXQgb2Ygc3RyZWFtaW5nIG1vZGUgRE1BIHRyYW5zbGF0aW9ucy4gIEFnYWluLCBjcHUgcmVhZAogICAgcnVsZXMgY29uY2VybmluZyBjYWxscyBoZXJlIGFyZSB0aGUgc2FtZSBhcyBmb3IgcGNpX3VubWFwX3NpbmdsZSgpCkBAIC03NTIsNiArNzU4LDcgQEAKIAogCURCR0EoInBjaV91bm1hcF9zZzogJWxkIGVudHJpZXNcbiIsIG5lbnRzIC0gKGVuZCAtIHNnKSk7CiB9CitFWFBPUlRfU1lNQk9MKHBjaV91bm1hcF9zZyk7CiAKIAogLyogUmV0dXJuIHdoZXRoZXIgdGhlIGdpdmVuIFBDSSBkZXZpY2UgRE1BIGFkZHJlc3MgbWFzayBjYW4gYmUKQEAgLTc4Niw2ICs3OTMsNyBAQAogCiAJcmV0dXJuIDA7CiB9CitFWFBPUlRfU1lNQk9MKHBjaV9kbWFfc3VwcG9ydGVkKTsKIAogDAogLyoKQEAgLTkwOCw2ICs5MTYsNyBAQAogCiAJcmV0dXJuIG9rOwogfQorRVhQT1JUX1NZTUJPTChwY2lfZGFjX2RtYV9zdXBwb3J0ZWQpOwogCiBkbWE2NF9hZGRyX3QKIHBjaV9kYWNfcGFnZV90b19kbWEoc3RydWN0IHBjaV9kZXYgKnBkZXYsIHN0cnVjdCBwYWdlICpwYWdlLApAQCAtOTE3LDYgKzkyNiw3IEBACiAJCSsgX19wYShwYWdlX2FkZHJlc3MocGFnZSkpIAogCQkrIChkbWE2NF9hZGRyX3QpIG9mZnNldCk7CiB9CitFWFBPUlRfU1lNQk9MKHBjaV9kYWNfcGFnZV90b19kbWEpOwogCiBzdHJ1Y3QgcGFnZSAqCiBwY2lfZGFjX2RtYV90b19wYWdlKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBkbWE2NF9hZGRyX3QgZG1hX2FkZHIpCkBAIC05MjQsMTMgKzkzNCwxNCBAQAogCXVuc2lnbmVkIGxvbmcgcGFkZHIgPSAoZG1hX2FkZHIgJiBQQUdFX01BU0spIC0gYWxwaGFfbXYucGNpX2RhY19vZmZzZXQ7CiAJcmV0dXJuIHZpcnRfdG9fcGFnZShfX3ZhKHBhZGRyKSk7CiB9CitFWFBPUlRfU1lNQk9MKHBjaV9kYWNfZG1hX3RvX3BhZ2UpOwogCiB1bnNpZ25lZCBsb25nCiBwY2lfZGFjX2RtYV90b19vZmZzZXQoc3RydWN0IHBjaV9kZXYgKnBkZXYsIGRtYTY0X2FkZHJfdCBkbWFfYWRkcikKIHsKIAlyZXR1cm4gKGRtYV9hZGRyICYgflBBR0VfTUFTSyk7CiB9Ci0KK0VYUE9SVF9TWU1CT0wocGNpX2RhY19kbWFfdG9fb2Zmc2V0KTsKIAogLyogSGVscGVyIGZvciBnZW5lcmljIERNQS1tYXBwaW5nIGZ1bmN0aW9ucy4gKi8KIApAQCAtOTU3LDYgKzk2OCw3IEBACiAJLyogVGhpcyBhc3N1bWVzIElTQSBidXMgbWFzdGVyIHdpdGggZG1hX21hc2sgMHhmZmZmZmYuICovCiAJcmV0dXJuIE5VTEw7CiB9CitFWFBPUlRfU1lNQk9MKGFscGhhX2dlbmRldl90b19wY2kpOwogCiBpbnQKIGRtYV9zZXRfbWFzayhzdHJ1Y3QgZGV2aWNlICpkZXYsIHU2NCBtYXNrKQpAQCAtOTY5LDMgKzk4MSw0IEBACiAKIAlyZXR1cm4gMDsKIH0KK0VYUE9SVF9TWU1CT0woZG1hX3NldF9tYXNrKTsKZGlmZiAtLWdpdCBhL2FyY2gvYWxwaGEva2VybmVsL3Byb2Nlc3MuYyBiL2FyY2gvYWxwaGEva2VybmVsL3Byb2Nlc3MuYwppbmRleCBiM2E4YTI5Li4zMzcwZTZmIDEwMDY0NAotLS0gYS9hcmNoL2FscGhhL2tlcm5lbC9wcm9jZXNzLmMKKysrIGIvYXJjaC9hbHBoYS9rZXJuZWwvcHJvY2Vzcy5jCkBAIC0yMDUsNiArMjA1LDcgQEAKIAlyZWdzLT5wcyA9IDg7CiAJd3J1c3Aoc3ApOwogfQorRVhQT1JUX1NZTUJPTChzdGFydF90aHJlYWQpOwogCiAvKgogICogRnJlZSBjdXJyZW50IHRocmVhZCBkYXRhIHN0cnVjdHVyZXMgZXRjLi4KQEAgLTM3Niw2ICszNzcsNyBAQAogCWR1bXAtPnJlZ3NbRUZfQTJdICA9IHB0LT5yMTg7CiAJbWVtY3B5KChjaGFyICopZHVtcC0+cmVncyArIEVGX1NJWkUsIHN3LT5mcCwgMzIgKiA4KTsKIH0KK0VYUE9SVF9TWU1CT0woZHVtcF90aHJlYWQpOwogCiAvKgogICogRmlsbCBpbiB0aGUgdXNlciBzdHJ1Y3R1cmUgZm9yIGEgRUxGIGNvcmUgZHVtcC4KQEAgLTQyNCw2ICs0MjYsNyBAQAogCSAgIHVzZWZ1bCB2YWx1ZSBvZiB0aGUgdGhyZWFkJ3MgVU5JUVVFIGZpZWxkLiAgKi8KIAlkZXN0WzMyXSA9IHRpLT5wY2IudW5pcXVlOwogfQorRVhQT1JUX1NZTUJPTChkdW1wX2VsZl90aHJlYWQpOwogCiBpbnQKIGR1bXBfZWxmX3Rhc2soZWxmX2dyZWdfdCAqZGVzdCwgc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrKQpAQCAtNDMxLDYgKzQzNCw3IEBACiAJZHVtcF9lbGZfdGhyZWFkKGRlc3QsIHRhc2tfcHRfcmVncyh0YXNrKSwgdGFza190aHJlYWRfaW5mbyh0YXNrKSk7CiAJcmV0dXJuIDE7CiB9CitFWFBPUlRfU1lNQk9MKGR1bXBfZWxmX3Rhc2spOwogCiBpbnQKIGR1bXBfZWxmX3Rhc2tfZnAoZWxmX2ZwcmVnX3QgKmRlc3QsIHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaykKQEAgLTQzOSw2ICs0NDMsNyBAQAogCW1lbWNweShkZXN0LCBzdy0+ZnAsIDMyICogOCk7CiAJcmV0dXJuIDE7CiB9CitFWFBPUlRfU1lNQk9MKGR1bXBfZWxmX3Rhc2tfZnApOwogCiAvKgogICogc3lzX2V4ZWN2ZSgpIGV4ZWN1dGVzIGEgbmV3IHByb2dyYW0uCmRpZmYgLS1naXQgYS9hcmNoL2FscGhhL2tlcm5lbC9zZXR1cC5jIGIvYXJjaC9hbHBoYS9rZXJuZWwvc2V0dXAuYwppbmRleCBhOTRlNmQ5Li4xYWVhN2M3IDEwMDY0NAotLS0gYS9hcmNoL2FscGhhL2tlcm5lbC9zZXR1cC5jCisrKyBiL2FyY2gvYWxwaGEva2VybmVsL3NldHVwLmMKQEAgLTY2LDYgKzY2LDcgQEAKIAogCiBzdHJ1Y3QgaHdycGJfc3RydWN0ICpod3JwYjsKK0VYUE9SVF9TWU1CT0woaHdycGIpOwogdW5zaWduZWQgbG9uZyBzcm1faGFlOwogCiBpbnQgYWxwaGFfbDFpX2NhY2hlc2hhcGU7CkBAIC0xMTEsNiArMTEyLDcgQEAKICNpZmRlZiBDT05GSUdfQUxQSEFfR0VORVJJQwogc3RydWN0IGFscGhhX21hY2hpbmVfdmVjdG9yIGFscGhhX212OwogaW50IGFscGhhX3VzaW5nX3NybTsKK0VYUE9SVF9TWU1CT0woYWxwaGFfdXNpbmdfc3JtKTsKICNlbmRpZgogCiBzdGF0aWMgc3RydWN0IGFscGhhX21hY2hpbmVfdmVjdG9yICpnZXRfc3lzdmVjKHVuc2lnbmVkIGxvbmcsIHVuc2lnbmVkIGxvbmcsCkBAIC0xMzcsNiArMTM5LDggQEAKIAkub3JpZ192aWRlb19wb2ludHMgPSAxNgogfTsKIAorRVhQT1JUX1NZTUJPTChzY3JlZW5faW5mbyk7CisKIC8qCiAgKiBUaGUgZGlyZWN0IG1hcCBJL08gd2luZG93LCBpZiBhbnkuICBUaGlzIHNob3VsZCBiZSB0aGUgc2FtZQogICogZm9yIGFsbCBidXNzZXMsIHNpbmNlIGl0J3MgdXNlZCBieSB2aXJ0X3RvX2J1cy4KQEAgLTE0NCw2ICsxNDgsOCBAQAogCiB1bnNpZ25lZCBsb25nIF9fZGlyZWN0X21hcF9iYXNlOwogdW5zaWduZWQgbG9uZyBfX2RpcmVjdF9tYXBfc2l6ZTsKK0VYUE9SVF9TWU1CT0woX19kaXJlY3RfbWFwX2Jhc2UpOworRVhQT1JUX1NZTUJPTChfX2RpcmVjdF9tYXBfc2l6ZSk7CiAKIC8qCiAgKiBEZWNsYXJlIGFsbCBvZiB0aGUgbWFjaGluZSB2ZWN0b3JzLgpkaWZmIC0tZ2l0IGEvYXJjaC9hbHBoYS9rZXJuZWwvc21wLmMgYi9hcmNoL2FscGhhL2tlcm5lbC9zbXAuYwppbmRleCA1OTY3ODBlLi5kMWVjNGY1IDEwMDY0NAotLS0gYS9hcmNoL2FscGhhL2tlcm5lbC9zbXAuYworKysgYi9hcmNoL2FscGhhL2tlcm5lbC9zbXAuYwpAQCAtNTIsNiArNTIsNyBAQAogCiAvKiBBIGNvbGxlY3Rpb24gb2YgcGVyLXByb2Nlc3NvciBkYXRhLiAgKi8KIHN0cnVjdCBjcHVpbmZvX2FscGhhIGNwdV9kYXRhW05SX0NQVVNdOworRVhQT1JUX1NZTUJPTChjcHVfZGF0YSk7CiAKIC8qIEEgY29sbGVjdGlvbiBvZiBzaW5nbGUgYml0IGlwaSBtZXNzYWdlcy4gICovCiBzdGF0aWMgc3RydWN0IHsKQEAgLTc0LDYgKzc1LDcgQEAKIAogaW50IHNtcF9udW1fcHJvYmVkOwkJLyogSW50ZXJuYWwgcHJvY2Vzc29yIGNvdW50ICovCiBpbnQgc21wX251bV9jcHVzID0gMTsJCS8qIE51bWJlciB0aGF0IGNhbWUgb25saW5lLiAgKi8KK0VYUE9SVF9TWU1CT0woc21wX251bV9jcHVzKTsKIAogZXh0ZXJuIHZvaWQgY2FsaWJyYXRlX2RlbGF5KHZvaWQpOwogCkBAIC03OTAsNiArNzkyLDcgQEAKIAogCXJldHVybiAwOwogfQorRVhQT1JUX1NZTUJPTChzbXBfY2FsbF9mdW5jdGlvbl9vbl9jcHUpOwogCiBpbnQKIHNtcF9jYWxsX2Z1bmN0aW9uICh2b2lkICgqZnVuYykgKHZvaWQgKmluZm8pLCB2b2lkICppbmZvLCBpbnQgcmV0cnksIGludCB3YWl0KQpAQCAtNzk3LDYgKzgwMCw3IEBACiAJcmV0dXJuIHNtcF9jYWxsX2Z1bmN0aW9uX29uX2NwdSAoZnVuYywgaW5mbywgcmV0cnksIHdhaXQsCiAJCQkJCSBjcHVfb25saW5lX21hcCk7CiB9CitFWFBPUlRfU1lNQk9MKHNtcF9jYWxsX2Z1bmN0aW9uKTsKIAogc3RhdGljIHZvaWQKIGlwaV9pbWIodm9pZCAqaWdub3JlZCkKQEAgLTgxMSw2ICs4MTUsNyBAQAogCWlmIChvbl9lYWNoX2NwdShpcGlfaW1iLCBOVUxMLCAxLCAxKSkKIAkJcHJpbnRrKEtFUk5fQ1JJVCAic21wX2ltYjogdGltZWQgb3V0XG4iKTsKIH0KK0VYUE9SVF9TWU1CT0woc21wX2ltYik7CiAKIHN0YXRpYyB2b2lkCiBpcGlfZmx1c2hfdGxiX2FsbCh2b2lkICppZ25vcmVkKQpAQCAtODY2LDYgKzg3MSw3IEBACiAKIAlwcmVlbXB0X2VuYWJsZSgpOwogfQorRVhQT1JUX1NZTUJPTChmbHVzaF90bGJfbW0pOwogCiBzdHJ1Y3QgZmx1c2hfdGxiX3BhZ2Vfc3RydWN0IHsKIAlzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYTsKQEAgLTkxOCw2ICs5MjQsNyBAQAogCiAJcHJlZW1wdF9lbmFibGUoKTsKIH0KK0VYUE9SVF9TWU1CT0woZmx1c2hfdGxiX3BhZ2UpOwogCiB2b2lkCiBmbHVzaF90bGJfcmFuZ2Uoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHVuc2lnbmVkIGxvbmcgc3RhcnQsIHVuc2lnbmVkIGxvbmcgZW5kKQpAQCAtOTI1LDYgKzkzMiw3IEBACiAJLyogT24gdGhlIEFscGhhIHdlIGFsd2F5cyBmbHVzaCB0aGUgd2hvbGUgdXNlciB0bGIuICAqLwogCWZsdXNoX3RsYl9tbSh2bWEtPnZtX21tKTsKIH0KK0VYUE9SVF9TWU1CT0woZmx1c2hfdGxiX3JhbmdlKTsKIAogc3RhdGljIHZvaWQKIGlwaV9mbHVzaF9pY2FjaGVfcGFnZSh2b2lkICp4KQpkaWZmIC0tZ2l0IGEvYXJjaC9hbHBoYS9rZXJuZWwvc3JtX2Vudi5jIGIvYXJjaC9hbHBoYS9rZXJuZWwvc3JtX2Vudi5jCmluZGV4IDk5MGFjNjEuLmY3ZGQwODEgMTAwNjQ0Ci0tLSBhL2FyY2gvYWxwaGEva2VybmVsL3NybV9lbnYuYworKysgYi9hcmNoL2FscGhhL2tlcm5lbC9zcm1fZW52LmMKQEAgLTIsNyArMiw3IEBACiAgKiBzcm1fZW52LmMgLSBBY2Nlc3MgdG8gU1JNIGVudmlyb25tZW50CiAgKiAgICAgICAgICAgICB2YXJpYWJsZXMgdGhyb3VnaCBsaW51eCcgcHJvY2ZzCiAgKgotICogQ29weXJpZ2h0IChDKSAyMDAxLTIwMDIgSmFuLUJlbmVkaWN0IEdsYXcgPGpiZ2xhd0BsdWctb3dsLmRlPgorICogKEMpIDIwMDEsMjAwMiwyMDA2IGJ5IEphbi1CZW5lZGljdCBHbGF3IDxqYmdsYXdAbHVnLW93bC5kZT4KICAqCiAgKiBUaGlzIGRyaXZlciBpcyBhdCBhbGwgYSBtb2RpZmllZCB2ZXJzaW9uIG9mIEVyaWsgTW91dydzCiAgKiBEb2N1bWVudGF0aW9uL0RvY0Jvb2svcHJvY2ZzX2V4YW1wbGUuYywgc286IHRoYW5rCkBAIC0yMSw3ICsyMSw3IEBACiAgKiB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCiAgKiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZQogICogZGV0YWlscy4KLSAqIAorICoKICAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwogICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUKICAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLApAQCAtMjksMzMgKzI5LDYgQEAKICAqCiAgKi8KIAotLyoKLSAqIENoYW5nZWxvZwotICogfn5+fn5+fn5+Ci0gKgotICogVGh1LCAyMiBBdWcgMjAwMiAxNToxMDo0MyArMDIwMAotICogCS0gVXBkYXRlIENvbmZpZy5oZWxwIGVudHJ5LiBJIGdvdCBhIG51bWJlciBvZiBlbWFpbHMgYXNraW5nCi0gKiAJICBtZSB0byB0ZWxsIHRoZWlyIHNlbmRlcnMgaWYgdGhleSBjb3VsZCBtYWtlIHVzZSBvZiB0aGlzCi0gKiAJICBwaWVjZSBvZiBjb2RlLi4uIFNvOiAiU1JNIGlzIHNvbWV0aGluZyBsaWtlIEJJT1MgZm9yIHlvdXIKLSAqIAkgIEFscGhhIgotICogCS0gVXBkYXRlIGNvZGUgZm9ybWF0dGluZyBhIGJpdCB0byBiZXR0ZXIgY29uZm9ybSBDb2RpbmdTdHlsZQotICogCSAgcnVsZXMuCi0gKiAJLSBTbyB0aGlzIGlzIHYwLjAuNSwgd2l0aCBubyBjaGFuZ2VzIChleGNlcHQgZm9ybWF0dGluZykKLSAqIAkKLSAqIFdlZCwgMjIgTWF5IDIwMDIgMDA6MTE6MjEgKzAyMDAKLSAqIAktIEZpeCB0eXBvIG9uIGNvbW1lbnQgKFNSQyAtPiBTUk0pCi0gKiAJLSBDYWxsIHRoaXMgIlZlcnNpb24gMC4wLjQiCi0gKgotICogVHVlLCAgOSBBcHIgMjAwMiAxODo0NDo0MCArMDIwMAotICogCS0gSW1wbGVtZW50IGFjY2VzcyBieSB2YXJpYWJsZSBuYW1lIGFuZCBhZGRpdGlvbmFsbHkKLSAqIAkgIGJ5IG51bWJlci4gVGhpcyBpcyBkb25lIGJ5IGNyZWF0aW5nIHR3byBzdWJkaXJlY3RvcmllcwotICogCSAgd2hlcmUgb25lIGhvbGRzIGFsbCBuYW1lcyAobGlrZSB0aGUgb2xkIGRpcmVjdG9yeQotICogCSAgZGlkKSBhbmQgdGhlIG90aGVyIGhvbGRpbmcgMjU2IGZpbGVzIG5hbWVkIGxpa2UgIjAiLAotICogCSAgIjEiIGFuZCBzbyBvbi4KLSAqIAktIENhbGwgdGhpcyAiVmVyc2lvbiAwLjAuMyIKLSAqCi0gKi8KLQogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KQEAgLTY3LDcgKzQwLDcgQEAKICNkZWZpbmUgQkFTRV9ESVIJInNybV9lbnZpcm9ubWVudCIJLyogU3ViZGlyIGluIC9wcm9jLwkJKi8KICNkZWZpbmUgTkFNRURfRElSCSJuYW1lZF92YXJpYWJsZXMiCS8qIFN1YmRpciBmb3Iga25vd24gdmFyaWFibGVzCSovCiAjZGVmaW5lIE5VTUJFUkVEX0RJUgkibnVtYmVyZWRfdmFyaWFibGVzIgkvKiBTdWJkaXIgZm9yIGFsbCB2YXJpYWJsZXMJKi8KLSNkZWZpbmUgVkVSU0lPTgkJIjAuMC41IgkJCS8qIE1vZHVsZSB2ZXJzaW9uCQkqLworI2RlZmluZSBWRVJTSU9OCQkiMC4wLjYiCQkJLyogTW9kdWxlIHZlcnNpb24JCSovCiAjZGVmaW5lIE5BTUUJCSJzcm1fZW52IgkJLyogTW9kdWxlIG5hbWUJCQkqLwogCiBNT0RVTEVfQVVUSE9SKCJKYW4tQmVuZWRpY3QgR2xhdyA8amJnbGF3QGx1Zy1vd2wuZGU+Iik7CkBAIC0xMDYsNyArNzksNiBAQAogc3RhdGljIHNybV9lbnZfdAlzcm1fbnVtYmVyZWRfZW50cmllc1syNTZdOwogCiAKLQogc3RhdGljIGludAogc3JtX2Vudl9yZWFkKGNoYXIgKnBhZ2UsIGNoYXIgKipzdGFydCwgb2ZmX3Qgb2ZmLCBpbnQgY291bnQsIGludCAqZW9mLAogCQl2b2lkICpkYXRhKQpAQCAtMTE1LDIxICs4NywyMyBAQAogCXVuc2lnbmVkIGxvbmcJcmV0OwogCXNybV9lbnZfdAkqZW50cnk7CiAKLQlpZihvZmYgIT0gMCkKLQkJcmV0dXJuIC1FRkFVTFQ7CisJaWYgKG9mZiAhPSAwKSB7CisJCSplb2YgPSAxOworCQlyZXR1cm4gMDsKKwl9CiAKIAllbnRyeQk9IChzcm1fZW52X3QgKikgZGF0YTsKIAlyZXQJPSBjYWxsYmFja19nZXRlbnYoZW50cnktPmlkLCBwYWdlLCBjb3VudCk7CiAKLQlpZigocmV0ID4+IDYxKSA9PSAwKQorCWlmICgocmV0ID4+IDYxKSA9PSAwKSB7CiAJCW5ieXRlcyA9IChpbnQpIHJldDsKLQllbHNlCisJCSplb2YgPSAxOworCX0gZWxzZQogCQluYnl0ZXMgPSAtRUZBVUxUOwogCiAJcmV0dXJuIG5ieXRlczsKIH0KIAotCiBzdGF0aWMgaW50CiBzcm1fZW52X3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqYnVmZmVyLCB1bnNpZ25lZCBsb25nIGNvdW50LAogCQl2b2lkICpkYXRhKQpAQCAtMTU1LDcgKzEyOSw3IEBACiAKIAlyZXQxID0gY2FsbGJhY2tfc2V0ZW52KGVudHJ5LT5pZCwgYnVmLCBjb3VudCk7CiAJaWYgKChyZXQxID4+IDYxKSA9PSAwKSB7Ci0JCWRvIAorCQlkbwogCQkJcmV0MiA9IGNhbGxiYWNrX3NhdmVfZW52KCk7CiAJCXdoaWxlKChyZXQyID4+IDYxKSA9PSAxKTsKIAkJcmVzID0gKGludCkgcmV0MTsKQEAgLTE3MiwxNCArMTQ2LDE0IEBACiAJc3JtX2Vudl90CSplbnRyeTsKIAl1bnNpZ25lZCBsb25nCXZhcl9udW07CiAKLQlpZihiYXNlX2RpcikgeworCWlmIChiYXNlX2RpcikgewogCQkvKgogCQkgKiBSZW1vdmUgbmFtZWQgZW50cmllcwogCQkgKi8KLQkJaWYobmFtZWRfZGlyKSB7CisJCWlmIChuYW1lZF9kaXIpIHsKIAkJCWVudHJ5ID0gc3JtX25hbWVkX2VudHJpZXM7Ci0JCQl3aGlsZShlbnRyeS0+bmFtZSAhPSBOVUxMICYmIGVudHJ5LT5pZCAhPSAwKSB7Ci0JCQkJaWYoZW50cnktPnByb2NfZW50cnkpIHsKKwkJCXdoaWxlIChlbnRyeS0+bmFtZSAhPSBOVUxMICYmIGVudHJ5LT5pZCAhPSAwKSB7CisJCQkJaWYgKGVudHJ5LT5wcm9jX2VudHJ5KSB7CiAJCQkJCXJlbW92ZV9wcm9jX2VudHJ5KGVudHJ5LT5uYW1lLAogCQkJCQkJCW5hbWVkX2Rpcik7CiAJCQkJCWVudHJ5LT5wcm9jX2VudHJ5ID0gTlVMTDsKQEAgLTE5MiwxMSArMTY2LDExIEBACiAJCS8qCiAJCSAqIFJlbW92ZSBudW1iZXJlZCBlbnRyaWVzCiAJCSAqLwotCQlpZihudW1iZXJlZF9kaXIpIHsKLQkJCWZvcih2YXJfbnVtID0gMDsgdmFyX251bSA8PSAyNTU7IHZhcl9udW0rKykgeworCQlpZiAobnVtYmVyZWRfZGlyKSB7CisJCQlmb3IgKHZhcl9udW0gPSAwOyB2YXJfbnVtIDw9IDI1NTsgdmFyX251bSsrKSB7CiAJCQkJZW50cnkgPQkmc3JtX251bWJlcmVkX2VudHJpZXNbdmFyX251bV07CiAKLQkJCQlpZihlbnRyeS0+cHJvY19lbnRyeSkgeworCQkJCWlmIChlbnRyeS0+cHJvY19lbnRyeSkgewogCQkJCQlyZW1vdmVfcHJvY19lbnRyeShlbnRyeS0+bmFtZSwKIAkJCQkJCQludW1iZXJlZF9kaXIpOwogCQkJCQllbnRyeS0+cHJvY19lbnRyeQk9IE5VTEw7CkBAIC0yMTIsNyArMTg2LDYgQEAKIAlyZXR1cm47CiB9CiAKLQogc3RhdGljIGludCBfX2luaXQKIHNybV9lbnZfaW5pdCh2b2lkKQogewpAQCAtMjIyLDcgKzE5NSw3IEBACiAJLyoKIAkgKiBDaGVjayBzeXN0ZW0KIAkgKi8KLQlpZighYWxwaGFfdXNpbmdfc3JtKSB7CisJaWYgKCFhbHBoYV91c2luZ19zcm0pIHsKIAkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IFRoaXMgQWxwaGEgc3lzdGVtIGRvZXNuJ3QgIgogCQkJCSJrbm93IGFib3V0IFNSTSAob3IgeW91J3ZlIGJvb3RlZCAiCiAJCQkJIlNSTS0+TUlMTy0+TGludXgsIHdoaWNoIGdldHMgIgpAQCAtMjMzLDE0ICsyMDYsMTQgQEAKIAkvKgogCSAqIEluaXQgbnVtYmVycwogCSAqLwotCWZvcih2YXJfbnVtID0gMDsgdmFyX251bSA8PSAyNTU7IHZhcl9udW0rKykKKwlmb3IgKHZhcl9udW0gPSAwOyB2YXJfbnVtIDw9IDI1NTsgdmFyX251bSsrKQogCQlzcHJpbnRmKG51bWJlclt2YXJfbnVtXSwgIiVsZCIsIHZhcl9udW0pOwogCiAJLyoKIAkgKiBDcmVhdGUgYmFzZSBkaXJlY3RvcnkKIAkgKi8KIAliYXNlX2RpciA9IHByb2NfbWtkaXIoQkFTRV9ESVIsIE5VTEwpOwotCWlmKGJhc2VfZGlyID09IE5VTEwpIHsKKwlpZiAoIWJhc2VfZGlyKSB7CiAJCXByaW50ayhLRVJOX0VSUiAiQ291bGRuJ3QgY3JlYXRlIGJhc2UgZGlyIC9wcm9jLyVzXG4iLAogCQkJCUJBU0VfRElSKTsKIAkJZ290byBjbGVhbnVwOwpAQCAtMjUxLDcgKzIyNCw3IEBACiAJICogQ3JlYXRlIHBlci1uYW1lIHN1YmRpcmVjdG9yeQogCSAqLwogCW5hbWVkX2RpciA9IHByb2NfbWtkaXIoTkFNRURfRElSLCBiYXNlX2Rpcik7Ci0JaWYobmFtZWRfZGlyID09IE5VTEwpIHsKKwlpZiAoIW5hbWVkX2RpcikgewogCQlwcmludGsoS0VSTl9FUlIgIkNvdWxkbid0IGNyZWF0ZSBkaXIgL3Byb2MvJXMvJXNcbiIsCiAJCQkJQkFTRV9ESVIsIE5BTUVEX0RJUik7CiAJCWdvdG8gY2xlYW51cDsKQEAgLTI2Miw3ICsyMzUsNyBAQAogCSAqIENyZWF0ZSBwZXItbnVtYmVyIHN1YmRpcmVjdG9yeQogCSAqLwogCW51bWJlcmVkX2RpciA9IHByb2NfbWtkaXIoTlVNQkVSRURfRElSLCBiYXNlX2Rpcik7Ci0JaWYobnVtYmVyZWRfZGlyID09IE5VTEwpIHsKKwlpZiAoIW51bWJlcmVkX2RpcikgewogCQlwcmludGsoS0VSTl9FUlIgIkNvdWxkbid0IGNyZWF0ZSBkaXIgL3Byb2MvJXMvJXNcbiIsCiAJCQkJQkFTRV9ESVIsIE5VTUJFUkVEX0RJUik7CiAJCWdvdG8gY2xlYW51cDsKQEAgLTI3NCwxMCArMjQ3LDEwIEBACiAJICogQ3JlYXRlIGFsbCBuYW1lZCBub2RlcwogCSAqLwogCWVudHJ5ID0gc3JtX25hbWVkX2VudHJpZXM7Ci0Jd2hpbGUoZW50cnktPm5hbWUgIT0gTlVMTCAmJiBlbnRyeS0+aWQgIT0gMCkgeworCXdoaWxlIChlbnRyeS0+bmFtZSAmJiBlbnRyeS0+aWQpIHsKIAkJZW50cnktPnByb2NfZW50cnkgPSBjcmVhdGVfcHJvY19lbnRyeShlbnRyeS0+bmFtZSwKIAkJCQkwNjQ0LCBuYW1lZF9kaXIpOwotCQlpZihlbnRyeS0+cHJvY19lbnRyeSA9PSBOVUxMKQorCQlpZiAoIWVudHJ5LT5wcm9jX2VudHJ5KQogCQkJZ290byBjbGVhbnVwOwogCiAJCWVudHJ5LT5wcm9jX2VudHJ5LT5kYXRhCQk9ICh2b2lkICopIGVudHJ5OwpAQCAtMjkxLDEzICsyNjQsMTMgQEAKIAkvKgogCSAqIENyZWF0ZSBhbGwgbnVtYmVyZWQgbm9kZXMKIAkgKi8KLQlmb3IodmFyX251bSA9IDA7IHZhcl9udW0gPD0gMjU1OyB2YXJfbnVtKyspIHsKKwlmb3IgKHZhcl9udW0gPSAwOyB2YXJfbnVtIDw9IDI1NTsgdmFyX251bSsrKSB7CiAJCWVudHJ5ID0gJnNybV9udW1iZXJlZF9lbnRyaWVzW3Zhcl9udW1dOwogCQllbnRyeS0+bmFtZSA9IG51bWJlclt2YXJfbnVtXTsKIAogCQllbnRyeS0+cHJvY19lbnRyeSA9IGNyZWF0ZV9wcm9jX2VudHJ5KGVudHJ5LT5uYW1lLAogCQkJCTA2NDQsIG51bWJlcmVkX2Rpcik7Ci0JCWlmKGVudHJ5LT5wcm9jX2VudHJ5ID09IE5VTEwpCisJCWlmICghZW50cnktPnByb2NfZW50cnkpCiAJCQlnb3RvIGNsZWFudXA7CiAKIAkJZW50cnktPmlkCQkJPSB2YXJfbnVtOwpAQCAtMzE4LDcgKzI5MSw2IEBACiAJcmV0dXJuIC1FTk9NRU07CiB9CiAKLQogc3RhdGljIHZvaWQgX19leGl0CiBzcm1fZW52X2V4aXQodm9pZCkKIHsKQEAgLTMyOCw3ICszMDAsNSBAQAogCXJldHVybjsKIH0KIAotCiBtb2R1bGVfaW5pdChzcm1fZW52X2luaXQpOwogbW9kdWxlX2V4aXQoc3JtX2Vudl9leGl0KTsKLQpkaWZmIC0tZ2l0IGEvYXJjaC9hbHBoYS9rZXJuZWwvdGltZS5jIGIvYXJjaC9hbHBoYS9rZXJuZWwvdGltZS5jCmluZGV4IGNmMDY2NjUuLmQ3MDUzZWIgMTAwNjQ0Ci0tLSBhL2FyY2gvYWxwaGEva2VybmVsL3RpbWUuYworKysgYi9hcmNoL2FscGhhL2tlcm5lbC90aW1lLmMKQEAgLTU3LDYgKzU3LDcgQEAKIHN0YXRpYyBpbnQgc2V0X3J0Y19tbXNzKHVuc2lnbmVkIGxvbmcpOwogCiBERUZJTkVfU1BJTkxPQ0socnRjX2xvY2spOworRVhQT1JUX1NZTUJPTChydGNfbG9jayk7CiAKICNkZWZpbmUgVElDS19TSVpFICh0aWNrX25zZWMgLyAxMDAwKQogCmRpZmYgLS1naXQgYS9hcmNoL2FscGhhL2tlcm5lbC92bWxpbnV4Lmxkcy5TIGIvYXJjaC9hbHBoYS9rZXJuZWwvdm1saW51eC5sZHMuUwppbmRleCA3MTQ3MGU5Li43NmJmMDcxIDEwMDY0NAotLS0gYS9hcmNoL2FscGhhL2tlcm5lbC92bWxpbnV4Lmxkcy5TCisrKyBiL2FyY2gvYWxwaGEva2VybmVsL3ZtbGludXgubGRzLlMKQEAgLTQ4LDEzICs0OCw3IEBACiAgIC4gPSBBTElHTig4KTsKICAgX19pbml0Y2FsbF9zdGFydCA9IC47CiAgIC5pbml0Y2FsbC5pbml0IDogewotCSooLmluaXRjYWxsMS5pbml0KSAKLQkqKC5pbml0Y2FsbDIuaW5pdCkgCi0JKiguaW5pdGNhbGwzLmluaXQpIAotCSooLmluaXRjYWxsNC5pbml0KSAKLQkqKC5pbml0Y2FsbDUuaW5pdCkgCi0JKiguaW5pdGNhbGw2LmluaXQpIAotCSooLmluaXRjYWxsNy5pbml0KQorCUlOSVRDQUxMUwogICB9CiAgIF9faW5pdGNhbGxfZW5kID0gLjsKIApkaWZmIC0tZ2l0IGEvYXJjaC9hbHBoYS9tbS9udW1hLmMgYi9hcmNoL2FscGhhL21tL251bWEuYwppbmRleCBiODI2ZjU4Li5lM2UzODA2IDEwMDY0NAotLS0gYS9hcmNoL2FscGhhL21tL251bWEuYworKysgYi9hcmNoL2FscGhhL21tL251bWEuYwpAQCAtMTMsMTIgKzEzLDE0IEBACiAjaW5jbHVkZSA8bGludXgvc3dhcC5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXRyZC5oPgogI2luY2x1ZGUgPGxpbnV4L3Bmbi5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogCiAjaW5jbHVkZSA8YXNtL2h3cnBiLmg+CiAjaW5jbHVkZSA8YXNtL3BnYWxsb2MuaD4KIAogcGdfZGF0YV90IG5vZGVfZGF0YVtNQVhfTlVNTk9ERVNdOwogYm9vdG1lbV9kYXRhX3Qgbm9kZV9iZGF0YVtNQVhfTlVNTk9ERVNdOworRVhQT1JUX1NZTUJPTChub2RlX2RhdGEpOwogCiAjdW5kZWYgREVCVUdfRElTQ09OVElHCiAjaWZkZWYgREVCVUdfRElTQ09OVElHCmRpZmYgLS1naXQgYS9hcmNoL2FybS9NYWtlZmlsZSBiL2FyY2gvYXJtL01ha2VmaWxlCmluZGV4IDJhMGIyYzguLjZmNGY4YmYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL01ha2VmaWxlCisrKyBiL2FyY2gvYXJtL01ha2VmaWxlCkBAIC0xNzQsMTEgKzE3NCwxMyBAQAogCiAjIERlZmF1bHQgdGFyZ2V0IHdoZW4gZXhlY3V0aW5nIHBsYWluIG1ha2UKIGlmZXEgKCQoQ09ORklHX1hJUF9LRVJORUwpLHkpCi1hbGw6IHhpcEltYWdlCitLQlVJTERfSU1BR0UgOj0geGlwSW1hZ2UKIGVsc2UKLWFsbDogekltYWdlCitLQlVJTERfSU1BR0UgOj0gekltYWdlCiBlbmRpZgogCithbGw6CSQoS0JVSUxEX0lNQUdFKQorCiBib290IDo9IGFyY2gvYXJtL2Jvb3QKIAogIwlVcGRhdGUgbWFjaGluZSBhcmNoIGFuZCBwcm9jIHN5bWxpbmtzIGlmIHNvbWV0aGluZyB3aGljaCBhZmZlY3RzCmRpZmYgLS1naXQgYS9hcmNoL2FybS9jb21tb24vZG1hYm91bmNlLmMgYi9hcmNoL2FybS9jb21tb24vZG1hYm91bmNlLmMKaW5kZXggMDI4YmRjOS4uMmU2MzViOCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vY29tbW9uL2RtYWJvdW5jZS5jCisrKyBiL2FyY2gvYXJtL2NvbW1vbi9kbWFib3VuY2UuYwpAQCAtNjYyLDcgKzY2Miw4IEBACiBFWFBPUlRfU1lNQk9MKGRtYV91bm1hcF9zaW5nbGUpOwogRVhQT1JUX1NZTUJPTChkbWFfbWFwX3NnKTsKIEVYUE9SVF9TWU1CT0woZG1hX3VubWFwX3NnKTsKLUVYUE9SVF9TWU1CT0woZG1hX3N5bmNfc2luZ2xlKTsKK0VYUE9SVF9TWU1CT0woZG1hX3N5bmNfc2luZ2xlX2Zvcl9jcHUpOworRVhQT1JUX1NZTUJPTChkbWFfc3luY19zaW5nbGVfZm9yX2RldmljZSk7CiBFWFBPUlRfU1lNQk9MKGRtYV9zeW5jX3NnKTsKIEVYUE9SVF9TWU1CT0woZG1hYm91bmNlX3JlZ2lzdGVyX2Rldik7CiBFWFBPUlRfU1lNQk9MKGRtYWJvdW5jZV91bnJlZ2lzdGVyX2Rldik7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9jb25maWdzL2F0OTFybTkyMDBka19kZWZjb25maWcgYi9hcmNoL2FybS9jb25maWdzL2F0OTFybTkyMDBka19kZWZjb25maWcKaW5kZXggYzgyZTQ2Ni4uYjQzMDQxNCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vY29uZmlncy9hdDkxcm05MjAwZGtfZGVmY29uZmlnCisrKyBiL2FyY2gvYXJtL2NvbmZpZ3MvYXQ5MXJtOTIwMGRrX2RlZmNvbmZpZwpAQCAtNTc3LDcgKzU3Nyw3IEBACiAjIFdhdGNoZG9nIERldmljZSBEcml2ZXJzCiAjCiAjIENPTkZJR19TT0ZUX1dBVENIRE9HIGlzIG5vdCBzZXQKLUNPTkZJR19BVDkxX1dBVENIRE9HPXkKK0NPTkZJR19BVDkxUk05MjAwX1dBVENIRE9HPXkKIAogIwogIyBVU0ItYmFzZWQgV2F0Y2hkb2cgQ2FyZHMKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2NvbmZpZ3MvYXQ5MXJtOTIwMGVrX2RlZmNvbmZpZyBiL2FyY2gvYXJtL2NvbmZpZ3MvYXQ5MXJtOTIwMGVrX2RlZmNvbmZpZwppbmRleCBiOTgzZmM1Li5kOTZmYzgzIDEwMDY0NAotLS0gYS9hcmNoL2FybS9jb25maWdzL2F0OTFybTkyMDBla19kZWZjb25maWcKKysrIGIvYXJjaC9hcm0vY29uZmlncy9hdDkxcm05MjAwZWtfZGVmY29uZmlnCkBAIC01NTgsNyArNTU4LDcgQEAKICMgV2F0Y2hkb2cgRGV2aWNlIERyaXZlcnMKICMKICMgQ09ORklHX1NPRlRfV0FUQ0hET0cgaXMgbm90IHNldAotQ09ORklHX0FUOTFfV0FUQ0hET0c9eQorQ09ORklHX0FUOTFSTTkyMDBfV0FUQ0hET0c9eQogCiAjCiAjIFVTQi1iYXNlZCBXYXRjaGRvZyBDYXJkcwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vY29uZmlncy9hdGViOTIwMF9kZWZjb25maWcgYi9hcmNoL2FybS9jb25maWdzL2F0ZWI5MjAwX2RlZmNvbmZpZwppbmRleCAxNWU2YjBiLi4zZGU1YzY0IDEwMDY0NAotLS0gYS9hcmNoL2FybS9jb25maWdzL2F0ZWI5MjAwX2RlZmNvbmZpZworKysgYi9hcmNoL2FybS9jb25maWdzL2F0ZWI5MjAwX2RlZmNvbmZpZwpAQCAtMjE3LDcgKzIxNyw3IEBACiAjIFBvd2VyIG1hbmFnZW1lbnQgb3B0aW9ucwogIwogQ09ORklHX1BNPXkKLUNPTkZJR19QTV9MRUdBQ1k9eQorIyBDT05GSUdfUE1fTEVHQUNZIGlzIG5vdCBzZXQKICMgQ09ORklHX1BNX0RFQlVHIGlzIG5vdCBzZXQKICMgQ09ORklHX0FQTSBpcyBub3Qgc2V0CiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2NvbmZpZ3MvYmFzdF9kZWZjb25maWcgYi9hcmNoL2FybS9jb25maWdzL2Jhc3RfZGVmY29uZmlnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YTg1NjRmLi4wMDAwMDAwCi0tLSBhL2FyY2gvYXJtL2NvbmZpZ3MvYmFzdF9kZWZjb25maWcKKysrIC9kZXYvbnVsbApAQCAtMSw5NDcgKzAsMCBAQAotIwotIyBBdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBtYWtlIGNvbmZpZzogZG9uJ3QgZWRpdAotIyBMaW51eCBrZXJuZWwgdmVyc2lvbjogMi42LjEyLXJjMS1iazIKLSMgU3VuIE1hciAyNyAwMjoyNDoxNiAyMDA1Ci0jCi1DT05GSUdfQVJNPXkKLUNPTkZJR19NTVU9eQotQ09ORklHX1VJRDE2PXkKLUNPTkZJR19SV1NFTV9HRU5FUklDX1NQSU5MT0NLPXkKLUNPTkZJR19HRU5FUklDX0NBTElCUkFURV9ERUxBWT15Ci1DT05GSUdfR0VORVJJQ19JT01BUD15Ci0KLSMKLSMgQ29kZSBtYXR1cml0eSBsZXZlbCBvcHRpb25zCi0jCi1DT05GSUdfRVhQRVJJTUVOVEFMPXkKLUNPTkZJR19DTEVBTl9DT01QSUxFPXkKLUNPTkZJR19CUk9LRU5fT05fU01QPXkKLQotIwotIyBHZW5lcmFsIHNldHVwCi0jCi1DT05GSUdfTE9DQUxWRVJTSU9OPSIiCi1DT05GSUdfU1dBUD15Ci1DT05GSUdfU1lTVklQQz15Ci0jIENPTkZJR19QT1NJWF9NUVVFVUUgaXMgbm90IHNldAotIyBDT05GSUdfQlNEX1BST0NFU1NfQUNDVCBpcyBub3Qgc2V0Ci1DT05GSUdfU1lTQ1RMPXkKLSMgQ09ORklHX0FVRElUIGlzIG5vdCBzZXQKLSMgQ09ORklHX0hPVFBMVUcgaXMgbm90IHNldAotQ09ORklHX0tPQkpFQ1RfVUVWRU5UPXkKLSMgQ09ORklHX0lLQ09ORklHIGlzIG5vdCBzZXQKLSMgQ09ORklHX0VNQkVEREVEIGlzIG5vdCBzZXQKLUNPTkZJR19LQUxMU1lNUz15Ci0jIENPTkZJR19LQUxMU1lNU19BTEwgaXMgbm90IHNldAotIyBDT05GSUdfS0FMTFNZTVNfRVhUUkFfUEFTUyBpcyBub3Qgc2V0Ci1DT05GSUdfQkFTRV9GVUxMPXkKLUNPTkZJR19GVVRFWD15Ci1DT05GSUdfRVBPTEw9eQotQ09ORklHX0NDX09QVElNSVpFX0ZPUl9TSVpFPXkKLUNPTkZJR19TSE1FTT15Ci1DT05GSUdfQ0NfQUxJR05fRlVOQ1RJT05TPTAKLUNPTkZJR19DQ19BTElHTl9MQUJFTFM9MAotQ09ORklHX0NDX0FMSUdOX0xPT1BTPTAKLUNPTkZJR19DQ19BTElHTl9KVU1QUz0wCi0jIENPTkZJR19USU5ZX1NITUVNIGlzIG5vdCBzZXQKLUNPTkZJR19CQVNFX1NNQUxMPTAKLQotIwotIyBMb2FkYWJsZSBtb2R1bGUgc3VwcG9ydAotIwotQ09ORklHX01PRFVMRVM9eQotIyBDT05GSUdfTU9EVUxFX1VOTE9BRCBpcyBub3Qgc2V0Ci1DT05GSUdfT0JTT0xFVEVfTU9EUEFSTT15Ci0jIENPTkZJR19NT0RWRVJTSU9OUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19NT0RVTEVfU1JDVkVSU0lPTl9BTEwgaXMgbm90IHNldAotQ09ORklHX0tNT0Q9eQotCi0jCi0jIFN5c3RlbSBUeXBlCi0jCi0jIENPTkZJR19BUkNIX0NMUFM3NTAwIGlzIG5vdCBzZXQKLSMgQ09ORklHX0FSQ0hfQ0xQUzcxMVggaXMgbm90IHNldAotIyBDT05GSUdfQVJDSF9DTzI4NSBpcyBub3Qgc2V0Ci0jIENPTkZJR19BUkNIX0VCU0ExMTAgaXMgbm90IHNldAotIyBDT05GSUdfQVJDSF9GT09UQlJJREdFIGlzIG5vdCBzZXQKLSMgQ09ORklHX0FSQ0hfSU5URUdSQVRPUiBpcyBub3Qgc2V0Ci0jIENPTkZJR19BUkNIX0lPUDNYWCBpcyBub3Qgc2V0Ci0jIENPTkZJR19BUkNIX0lYUDRYWCBpcyBub3Qgc2V0Ci0jIENPTkZJR19BUkNIX0lYUDIwMDAgaXMgbm90IHNldAotIyBDT05GSUdfQVJDSF9MNzIwMCBpcyBub3Qgc2V0Ci0jIENPTkZJR19BUkNIX1BYQSBpcyBub3Qgc2V0Ci0jIENPTkZJR19BUkNIX1JQQyBpcyBub3Qgc2V0Ci0jIENPTkZJR19BUkNIX1NBMTEwMCBpcyBub3Qgc2V0Ci1DT05GSUdfQVJDSF9TM0MyNDEwPXkKLSMgQ09ORklHX0FSQ0hfU0hBUksgaXMgbm90IHNldAotIyBDT05GSUdfQVJDSF9MSDdBNDBYIGlzIG5vdCBzZXQKLSMgQ09ORklHX0FSQ0hfT01BUCBpcyBub3Qgc2V0Ci0jIENPTkZJR19BUkNIX1ZFUlNBVElMRSBpcyBub3Qgc2V0Ci0jIENPTkZJR19BUkNIX0lNWCBpcyBub3Qgc2V0Ci0jIENPTkZJR19BUkNIX0g3MjBYIGlzIG5vdCBzZXQKLQotIwotIyBTM0MyNFhYIEltcGxlbWVudGF0aW9ucwotIwotQ09ORklHX0FSQ0hfQkFTVD15Ci0jIENPTkZJR19BUkNIX0gxOTQwIGlzIG5vdCBzZXQKLSMgQ09ORklHX01BQ0hfTjMwIGlzIG5vdCBzZXQKLSMgQ09ORklHX0FSQ0hfU01ESzI0MTAgaXMgbm90IHNldAotIyBDT05GSUdfQVJDSF9TM0MyNDQwIGlzIG5vdCBzZXQKLUNPTkZJR19NQUNIX1ZSMTAwMD15Ci0jIENPTkZJR19NQUNIX1JYMzcxNSBpcyBub3Qgc2V0Ci0jIENPTkZJR19NQUNIX09UT00gaXMgbm90IHNldAotIyBDT05GSUdfTUFDSF9ORVhDT0RFUl8yNDQwIGlzIG5vdCBzZXQKLUNPTkZJR19DUFVfUzNDMjQxMD15Ci0KLSMKLSMgUzNDMjQxMCBCb290Ci0jCi0jIENPTkZJR19TM0MyNDEwX0JPT1RfV0FUQ0hET0cgaXMgbm90IHNldAotCi0jCi0jIFMzQzI0MTAgU2V0dXAKLSMKLUNPTkZJR19TM0MyNDEwX0RNQT15Ci0jIENPTkZJR19TM0MyNDEwX0RNQV9ERUJVRyBpcyBub3Qgc2V0Ci0jIENPTkZJR19TM0MyNDEwX1BNX0RFQlVHIGlzIG5vdCBzZXQKLSMgQ09ORklHX1MzQzI0MTBfUE1fQ0hFQ0sgaXMgbm90IHNldAotQ09ORklHX1MzQzI0MTBfTE9XTEVWRUxfVUFSVF9QT1JUPTAKLQotIwotIyBQcm9jZXNzb3IgVHlwZQotIwotQ09ORklHX0NQVV8zMj15Ci1DT05GSUdfQ1BVX0FSTTkyMFQ9eQotQ09ORklHX0NQVV8zMnY0PXkKLUNPTkZJR19DUFVfQUJSVF9FVjRUPXkKLUNPTkZJR19DUFVfQ0FDSEVfVjRXVD15Ci1DT05GSUdfQ1BVX0NBQ0hFX1ZJVlQ9eQotQ09ORklHX0NQVV9DT1BZX1Y0V0I9eQotQ09ORklHX0NQVV9UTEJfVjRXQkk9eQotCi0jCi0jIFByb2Nlc3NvciBGZWF0dXJlcwotIwotIyBDT05GSUdfQVJNX1RIVU1CIGlzIG5vdCBzZXQKLSMgQ09ORklHX0NQVV9JQ0FDSEVfRElTQUJMRSBpcyBub3Qgc2V0Ci0jIENPTkZJR19DUFVfRENBQ0hFX0RJU0FCTEUgaXMgbm90IHNldAotIyBDT05GSUdfQ1BVX0RDQUNIRV9XUklURVRIUk9VR0ggaXMgbm90IHNldAotCi0jCi0jIEJ1cyBzdXBwb3J0Ci0jCi0KLSMKLSMgUENDQVJEIChQQ01DSUEvQ2FyZEJ1cykgc3VwcG9ydAotIwotIyBDT05GSUdfUENDQVJEIGlzIG5vdCBzZXQKLQotIwotIyBLZXJuZWwgRmVhdHVyZXMKLSMKLSMgQ09ORklHX1BSRUVNUFQgaXMgbm90IHNldAotQ09ORklHX0FMSUdOTUVOVF9UUkFQPXkKLQotIwotIyBCb290IG9wdGlvbnMKLSMKLUNPTkZJR19aQk9PVF9ST01fVEVYVD0weDAKLUNPTkZJR19aQk9PVF9ST01fQlNTPTB4MAotQ09ORklHX0NNRExJTkU9InJvb3Q9L2Rldi9oZGExIHJvIGluaXQ9L2Jpbi9iYXNoIGNvbnNvbGU9dHR5U0FDMCIKLSMgQ09ORklHX1hJUF9LRVJORUwgaXMgbm90IHNldAotCi0jCi0jIEZsb2F0aW5nIHBvaW50IGVtdWxhdGlvbgotIwotCi0jCi0jIEF0IGxlYXN0IG9uZSBlbXVsYXRpb24gbXVzdCBiZSBzZWxlY3RlZAotIwotQ09ORklHX0ZQRV9OV0ZQRT15Ci0jIENPTkZJR19GUEVfTldGUEVfWFAgaXMgbm90IHNldAotIyBDT05GSUdfRlBFX0ZBU1RGUEUgaXMgbm90IHNldAotCi0jCi0jIFVzZXJzcGFjZSBiaW5hcnkgZm9ybWF0cwotIwotQ09ORklHX0JJTkZNVF9FTEY9eQotQ09ORklHX0JJTkZNVF9BT1VUPXkKLSMgQ09ORklHX0JJTkZNVF9NSVNDIGlzIG5vdCBzZXQKLSMgQ09ORklHX0FSVEhVUiBpcyBub3Qgc2V0Ci0KLSMKLSMgUG93ZXIgbWFuYWdlbWVudCBvcHRpb25zCi0jCi1DT05GSUdfUE09eQotQ09ORklHX0FQTT15Ci0KLSMKLSMgRGV2aWNlIERyaXZlcnMKLSMKLQotIwotIyBHZW5lcmljIERyaXZlciBPcHRpb25zCi0jCi1DT05GSUdfU1RBTkRBTE9ORT15Ci1DT05GSUdfUFJFVkVOVF9GSVJNV0FSRV9CVUlMRD15Ci0jIENPTkZJR19GV19MT0FERVIgaXMgbm90IHNldAotIyBDT05GSUdfREVCVUdfRFJJVkVSIGlzIG5vdCBzZXQKLQotIwotIyBNZW1vcnkgVGVjaG5vbG9neSBEZXZpY2VzIChNVEQpCi0jCi1DT05GSUdfTVREPXkKLSMgQ09ORklHX01URF9ERUJVRyBpcyBub3Qgc2V0Ci0jIENPTkZJR19NVERfQ09OQ0FUIGlzIG5vdCBzZXQKLUNPTkZJR19NVERfUEFSVElUSU9OUz15Ci1DT05GSUdfTVREX1JFREJPT1RfUEFSVFM9eQotQ09ORklHX01URF9SRURCT09UX0RJUkVDVE9SWV9CTE9DSz0tMQotQ09ORklHX01URF9SRURCT09UX1BBUlRTX1VOQUxMT0NBVEVEPXkKLSMgQ09ORklHX01URF9SRURCT09UX1BBUlRTX1JFQURPTkxZIGlzIG5vdCBzZXQKLUNPTkZJR19NVERfQ01ETElORV9QQVJUUz15Ci0jIENPTkZJR19NVERfQUZTX1BBUlRTIGlzIG5vdCBzZXQKLQotIwotIyBVc2VyIE1vZHVsZXMgQW5kIFRyYW5zbGF0aW9uIExheWVycwotIwotQ09ORklHX01URF9DSEFSPXkKLUNPTkZJR19NVERfQkxPQ0s9eQotIyBDT05GSUdfRlRMIGlzIG5vdCBzZXQKLSMgQ09ORklHX05GVEwgaXMgbm90IHNldAotIyBDT05GSUdfSU5GVEwgaXMgbm90IHNldAotCi0jCi0jIFJBTS9ST00vRmxhc2ggY2hpcCBkcml2ZXJzCi0jCi1DT05GSUdfTVREX0NGST15Ci1DT05GSUdfTVREX0pFREVDUFJPQkU9eQotQ09ORklHX01URF9HRU5fUFJPQkU9eQotIyBDT05GSUdfTVREX0NGSV9BRFZfT1BUSU9OUyBpcyBub3Qgc2V0Ci1DT05GSUdfTVREX01BUF9CQU5LX1dJRFRIXzE9eQotQ09ORklHX01URF9NQVBfQkFOS19XSURUSF8yPXkKLUNPTkZJR19NVERfTUFQX0JBTktfV0lEVEhfND15Ci0jIENPTkZJR19NVERfTUFQX0JBTktfV0lEVEhfOCBpcyBub3Qgc2V0Ci1DT05GSUdfTVREX01BUF9CQU5LX1dJRFRIXzE2PXkKLSMgQ09ORklHX01URF9NQVBfQkFOS19XSURUSF8zMiBpcyBub3Qgc2V0Ci1DT05GSUdfTVREX0NGSV9JMT15Ci1DT05GSUdfTVREX0NGSV9JMj15Ci0jIENPTkZJR19NVERfQ0ZJX0k0IGlzIG5vdCBzZXQKLSMgQ09ORklHX01URF9DRklfSTggaXMgbm90IHNldAotQ09ORklHX01URF9DRklfSU5URUxFWFQ9eQotIyBDT05GSUdfTVREX0NGSV9BTURTVEQgaXMgbm90IHNldAotIyBDT05GSUdfTVREX0NGSV9TVEFBIGlzIG5vdCBzZXQKLUNPTkZJR19NVERfQ0ZJX1VUSUw9eQotIyBDT05GSUdfTVREX1JBTSBpcyBub3Qgc2V0Ci0jIENPTkZJR19NVERfUk9NIGlzIG5vdCBzZXQKLSMgQ09ORklHX01URF9BQlNFTlQgaXMgbm90IHNldAotIyBDT05GSUdfTVREX09CU09MRVRFX0NISVBTIGlzIG5vdCBzZXQKLSMgQ09ORklHX01URF9YSVAgaXMgbm90IHNldAotCi0jCi0jIE1hcHBpbmcgZHJpdmVycyBmb3IgY2hpcCBhY2Nlc3MKLSMKLSMgQ09ORklHX01URF9DT01QTEVYX01BUFBJTkdTIGlzIG5vdCBzZXQKLSMgQ09ORklHX01URF9QSFlTTUFQIGlzIG5vdCBzZXQKLSMgQ09ORklHX01URF9BUk1fSU5URUdSQVRPUiBpcyBub3Qgc2V0Ci0jIENPTkZJR19NVERfRURCNzMxMiBpcyBub3Qgc2V0Ci0jIENPTkZJR19NVERfSU1QQTcgaXMgbm90IHNldAotQ09ORklHX01URF9CQVNUPXkKLUNPTkZJR19NVERfQkFTVF9NQVhTSVpFPTQKLQotIwotIyBTZWxmLWNvbnRhaW5lZCBNVEQgZGV2aWNlIGRyaXZlcnMKLSMKLSMgQ09ORklHX01URF9TTFJBTSBpcyBub3Qgc2V0Ci0jIENPTkZJR19NVERfUEhSQU0gaXMgbm90IHNldAotIyBDT05GSUdfTVREX01URFJBTSBpcyBub3Qgc2V0Ci0jIENPTkZJR19NVERfQkxLTVREIGlzIG5vdCBzZXQKLSMgQ09ORklHX01URF9CTE9DSzJNVEQgaXMgbm90IHNldAotCi0jCi0jIERpc2stT24tQ2hpcCBEZXZpY2UgRHJpdmVycwotIwotIyBDT05GSUdfTVREX0RPQzIwMDAgaXMgbm90IHNldAotIyBDT05GSUdfTVREX0RPQzIwMDEgaXMgbm90IHNldAotIyBDT05GSUdfTVREX0RPQzIwMDFQTFVTIGlzIG5vdCBzZXQKLQotIwotIyBOQU5EIEZsYXNoIERldmljZSBEcml2ZXJzCi0jCi1DT05GSUdfTVREX05BTkQ9eQotIyBDT05GSUdfTVREX05BTkRfVkVSSUZZX1dSSVRFIGlzIG5vdCBzZXQKLUNPTkZJR19NVERfTkFORF9JRFM9eQotQ09ORklHX01URF9OQU5EX1MzQzI0MTA9eQotIyBDT05GSUdfTVREX05BTkRfUzNDMjQxMF9ERUJVRyBpcyBub3Qgc2V0Ci0jIENPTkZJR19NVERfTkFORF9TM0MyNDEwX0hXRUNDIGlzIG5vdCBzZXQKLSMgQ09ORklHX01URF9OQU5EX0RJU0tPTkNISVAgaXMgbm90IHNldAotIyBDT05GSUdfTVREX05BTkRfTkFORFNJTSBpcyBub3Qgc2V0Ci0KLSMKLSMgUGFyYWxsZWwgcG9ydCBzdXBwb3J0Ci0jCi1DT05GSUdfUEFSUE9SVD15Ci0jIENPTkZJR19QQVJQT1JUX1BDIGlzIG5vdCBzZXQKLSMgQ09ORklHX1BBUlBPUlRfQVJDIGlzIG5vdCBzZXQKLSMgQ09ORklHX1BBUlBPUlRfR1NDIGlzIG5vdCBzZXQKLUNPTkZJR19QQVJQT1JUXzEyODQ9eQotCi0jCi0jIFBsdWcgYW5kIFBsYXkgc3VwcG9ydAotIwotCi0jCi0jIEJsb2NrIGRldmljZXMKLSMKLSMgQ09ORklHX0JMS19ERVZfRkQgaXMgbm90IHNldAotIyBDT05GSUdfUEFSSURFIGlzIG5vdCBzZXQKLSMgQ09ORklHX0JMS19ERVZfQ09XX0NPTU1PTiBpcyBub3Qgc2V0Ci1DT05GSUdfQkxLX0RFVl9MT09QPXkKLSMgQ09ORklHX0JMS19ERVZfQ1JZUFRPTE9PUCBpcyBub3Qgc2V0Ci1DT05GSUdfQkxLX0RFVl9OQkQ9bQotQ09ORklHX0JMS19ERVZfUkFNPXkKLUNPTkZJR19CTEtfREVWX1JBTV9DT1VOVD0xNgotQ09ORklHX0JMS19ERVZfUkFNX1NJWkU9NDA5NgotQ09ORklHX0JMS19ERVZfSU5JVFJEPXkKLUNPTkZJR19JTklUUkFNRlNfU09VUkNFPSIiCi0jIENPTkZJR19DRFJPTV9QS1RDRFZEIGlzIG5vdCBzZXQKLQotIwotIyBJTyBTY2hlZHVsZXJzCi0jCi1DT05GSUdfSU9TQ0hFRF9OT09QPXkKLUNPTkZJR19JT1NDSEVEX0FTPXkKLUNPTkZJR19JT1NDSEVEX0RFQURMSU5FPXkKLUNPTkZJR19JT1NDSEVEX0NGUT15Ci0jIENPTkZJR19BVEFfT1ZFUl9FVEggaXMgbm90IHNldAotCi0jCi0jIEFUQS9BVEFQSS9NRk0vUkxMIHN1cHBvcnQKLSMKLUNPTkZJR19JREU9eQotQ09ORklHX0JMS19ERVZfSURFPXkKLQotIwotIyBQbGVhc2Ugc2VlIERvY3VtZW50YXRpb24vaWRlLnR4dCBmb3IgaGVscC9pbmZvIG9uIElERSBkcml2ZXMKLSMKLSMgQ09ORklHX0JMS19ERVZfSURFX1NBVEEgaXMgbm90IHNldAotQ09ORklHX0JMS19ERVZfSURFRElTSz15Ci0jIENPTkZJR19JREVESVNLX01VTFRJX01PREUgaXMgbm90IHNldAotQ09ORklHX0JMS19ERVZfSURFQ0Q9eQotQ09ORklHX0JMS19ERVZfSURFVEFQRT1tCi1DT05GSUdfQkxLX0RFVl9JREVGTE9QUFk9bQotIyBDT05GSUdfSURFX1RBU0tfSU9DVEwgaXMgbm90IHNldAotCi0jCi0jIElERSBjaGlwc2V0IHN1cHBvcnQvYnVnZml4ZXMKLSMKLUNPTkZJR19JREVfR0VORVJJQz15Ci0jIENPTkZJR19JREVfQVJNIGlzIG5vdCBzZXQKLUNPTkZJR19CTEtfREVWX0lERV9CQVNUPXkKLSMgQ09ORklHX0JMS19ERVZfSURFRE1BIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lERURNQV9BVVRPIGlzIG5vdCBzZXQKLSMgQ09ORklHX0JMS19ERVZfSEQgaXMgbm90IHNldAotCi0jCi0jIFNDU0kgZGV2aWNlIHN1cHBvcnQKLSMKLSMgQ09ORklHX1NDU0kgaXMgbm90IHNldAotCi0jCi0jIE11bHRpLWRldmljZSBzdXBwb3J0IChSQUlEIGFuZCBMVk0pCi0jCi0jIENPTkZJR19NRCBpcyBub3Qgc2V0Ci0KLSMKLSMgRnVzaW9uIE1QVCBkZXZpY2Ugc3VwcG9ydAotIwotCi0jCi0jIElFRUUgMTM5NCAoRmlyZVdpcmUpIHN1cHBvcnQKLSMKLQotIwotIyBJMk8gZGV2aWNlIHN1cHBvcnQKLSMKLQotIwotIyBOZXR3b3JraW5nIHN1cHBvcnQKLSMKLUNPTkZJR19ORVQ9eQotCi0jCi0jIE5ldHdvcmtpbmcgb3B0aW9ucwotIwotIyBDT05GSUdfUEFDS0VUIGlzIG5vdCBzZXQKLSMgQ09ORklHX05FVExJTktfREVWIGlzIG5vdCBzZXQKLUNPTkZJR19VTklYPXkKLSMgQ09ORklHX05FVF9LRVkgaXMgbm90IHNldAotQ09ORklHX0lORVQ9eQotIyBDT05GSUdfSVBfTVVMVElDQVNUIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lQX0FEVkFOQ0VEX1JPVVRFUiBpcyBub3Qgc2V0Ci1DT05GSUdfSVBfUE5QPXkKLSMgQ09ORklHX0lQX1BOUF9ESENQIGlzIG5vdCBzZXQKLUNPTkZJR19JUF9QTlBfQk9PVFA9eQotIyBDT05GSUdfSVBfUE5QX1JBUlAgaXMgbm90IHNldAotIyBDT05GSUdfTkVUX0lQSVAgaXMgbm90IHNldAotIyBDT05GSUdfTkVUX0lQR1JFIGlzIG5vdCBzZXQKLSMgQ09ORklHX0FSUEQgaXMgbm90IHNldAotIyBDT05GSUdfU1lOX0NPT0tJRVMgaXMgbm90IHNldAotIyBDT05GSUdfSU5FVF9BSCBpcyBub3Qgc2V0Ci0jIENPTkZJR19JTkVUX0VTUCBpcyBub3Qgc2V0Ci0jIENPTkZJR19JTkVUX0lQQ09NUCBpcyBub3Qgc2V0Ci0jIENPTkZJR19JTkVUX1RVTk5FTCBpcyBub3Qgc2V0Ci1DT05GSUdfSVBfVENQRElBRz15Ci0jIENPTkZJR19JUF9UQ1BESUFHX0lQVjYgaXMgbm90IHNldAotIyBDT05GSUdfSVBWNiBpcyBub3Qgc2V0Ci0jIENPTkZJR19ORVRGSUxURVIgaXMgbm90IHNldAotCi0jCi0jIFNDVFAgQ29uZmlndXJhdGlvbiAoRVhQRVJJTUVOVEFMKQotIwotIyBDT05GSUdfSVBfU0NUUCBpcyBub3Qgc2V0Ci0jIENPTkZJR19BVE0gaXMgbm90IHNldAotIyBDT05GSUdfQlJJREdFIGlzIG5vdCBzZXQKLSMgQ09ORklHX1ZMQU5fODAyMVEgaXMgbm90IHNldAotIyBDT05GSUdfREVDTkVUIGlzIG5vdCBzZXQKLSMgQ09ORklHX0xMQzIgaXMgbm90IHNldAotIyBDT05GSUdfSVBYIGlzIG5vdCBzZXQKLSMgQ09ORklHX0FUQUxLIGlzIG5vdCBzZXQKLSMgQ09ORklHX1gyNSBpcyBub3Qgc2V0Ci0jIENPTkZJR19MQVBCIGlzIG5vdCBzZXQKLSMgQ09ORklHX05FVF9ESVZFUlQgaXMgbm90IHNldAotIyBDT05GSUdfRUNPTkVUIGlzIG5vdCBzZXQKLSMgQ09ORklHX1dBTl9ST1VURVIgaXMgbm90IHNldAotCi0jCi0jIFFvUyBhbmQvb3IgZmFpciBxdWV1ZWluZwotIwotIyBDT05GSUdfTkVUX1NDSEVEIGlzIG5vdCBzZXQKLSMgQ09ORklHX05FVF9DTFNfUk9VVEUgaXMgbm90IHNldAotCi0jCi0jIE5ldHdvcmsgdGVzdGluZwotIwotIyBDT05GSUdfTkVUX1BLVEdFTiBpcyBub3Qgc2V0Ci0jIENPTkZJR19ORVRQT0xMIGlzIG5vdCBzZXQKLSMgQ09ORklHX05FVF9QT0xMX0NPTlRST0xMRVIgaXMgbm90IHNldAotIyBDT05GSUdfSEFNUkFESU8gaXMgbm90IHNldAotIyBDT05GSUdfSVJEQSBpcyBub3Qgc2V0Ci0jIENPTkZJR19CVCBpcyBub3Qgc2V0Ci1DT05GSUdfTkVUREVWSUNFUz15Ci0jIENPTkZJR19EVU1NWSBpcyBub3Qgc2V0Ci0jIENPTkZJR19CT05ESU5HIGlzIG5vdCBzZXQKLSMgQ09ORklHX0VRVUFMSVpFUiBpcyBub3Qgc2V0Ci0jIENPTkZJR19UVU4gaXMgbm90IHNldAotCi0jCi0jIEV0aGVybmV0ICgxMCBvciAxMDBNYml0KQotIwotQ09ORklHX05FVF9FVEhFUk5FVD15Ci0jIENPTkZJR19NSUkgaXMgbm90IHNldAotIyBDT05GSUdfU01DOTFYIGlzIG5vdCBzZXQKLQotIwotIyBFdGhlcm5ldCAoMTAwMCBNYml0KQotIwotCi0jCi0jIEV0aGVybmV0ICgxMDAwMCBNYml0KQotIwotCi0jCi0jIFRva2VuIFJpbmcgZGV2aWNlcwotIwotCi0jCi0jIFdpcmVsZXNzIExBTiAobm9uLWhhbXJhZGlvKQotIwotIyBDT05GSUdfTkVUX1JBRElPIGlzIG5vdCBzZXQKLQotIwotIyBXYW4gaW50ZXJmYWNlcwotIwotIyBDT05GSUdfV0FOIGlzIG5vdCBzZXQKLSMgQ09ORklHX1BMSVAgaXMgbm90IHNldAotIyBDT05GSUdfUFBQIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NMSVAgaXMgbm90IHNldAotIyBDT05GSUdfU0hBUEVSIGlzIG5vdCBzZXQKLSMgQ09ORklHX05FVENPTlNPTEUgaXMgbm90IHNldAotCi0jCi0jIElTRE4gc3Vic3lzdGVtCi0jCi0jIENPTkZJR19JU0ROIGlzIG5vdCBzZXQKLQotIwotIyBJbnB1dCBkZXZpY2Ugc3VwcG9ydAotIwotQ09ORklHX0lOUFVUPXkKLQotIwotIyBVc2VybGFuZCBpbnRlcmZhY2VzCi0jCi1DT05GSUdfSU5QVVRfTU9VU0VERVY9eQotQ09ORklHX0lOUFVUX01PVVNFREVWX1BTQVVYPXkKLUNPTkZJR19JTlBVVF9NT1VTRURFVl9TQ1JFRU5fWD0xMDI0Ci1DT05GSUdfSU5QVVRfTU9VU0VERVZfU0NSRUVOX1k9NzY4Ci0jIENPTkZJR19JTlBVVF9KT1lERVYgaXMgbm90IHNldAotIyBDT05GSUdfSU5QVVRfVFNERVYgaXMgbm90IHNldAotIyBDT05GSUdfSU5QVVRfRVZERVYgaXMgbm90IHNldAotIyBDT05GSUdfSU5QVVRfRVZCVUcgaXMgbm90IHNldAotCi0jCi0jIElucHV0IERldmljZSBEcml2ZXJzCi0jCi1DT05GSUdfSU5QVVRfS0VZQk9BUkQ9eQotQ09ORklHX0tFWUJPQVJEX0FUS0JEPXkKLSMgQ09ORklHX0tFWUJPQVJEX1NVTktCRCBpcyBub3Qgc2V0Ci0jIENPTkZJR19LRVlCT0FSRF9MS0tCRCBpcyBub3Qgc2V0Ci0jIENPTkZJR19LRVlCT0FSRF9YVEtCRCBpcyBub3Qgc2V0Ci0jIENPTkZJR19LRVlCT0FSRF9ORVdUT04gaXMgbm90IHNldAotQ09ORklHX0lOUFVUX01PVVNFPXkKLUNPTkZJR19NT1VTRV9QUzI9eQotIyBDT05GSUdfTU9VU0VfU0VSSUFMIGlzIG5vdCBzZXQKLSMgQ09ORklHX01PVVNFX1ZTWFhYQUEgaXMgbm90IHNldAotIyBDT05GSUdfSU5QVVRfSk9ZU1RJQ0sgaXMgbm90IHNldAotIyBDT05GSUdfSU5QVVRfVE9VQ0hTQ1JFRU4gaXMgbm90IHNldAotIyBDT05GSUdfSU5QVVRfTUlTQyBpcyBub3Qgc2V0Ci0KLSMKLSMgSGFyZHdhcmUgSS9PIHBvcnRzCi0jCi1DT05GSUdfU0VSSU89eQotQ09ORklHX1NFUklPX1NFUlBPUlQ9eQotIyBDT05GSUdfU0VSSU9fUEFSS0JEIGlzIG5vdCBzZXQKLUNPTkZJR19TRVJJT19MSUJQUzI9eQotIyBDT05GSUdfU0VSSU9fUkFXIGlzIG5vdCBzZXQKLSMgQ09ORklHX0dBTUVQT1JUIGlzIG5vdCBzZXQKLUNPTkZJR19TT1VORF9HQU1FUE9SVD15Ci0KLSMKLSMgQ2hhcmFjdGVyIGRldmljZXMKLSMKLUNPTkZJR19WVD15Ci1DT05GSUdfVlRfQ09OU09MRT15Ci1DT05GSUdfSFdfQ09OU09MRT15Ci1DT05GSUdfU0VSSUFMX05PTlNUQU5EQVJEPXkKLSMgQ09ORklHX0NPTVBVVE9ORSBpcyBub3Qgc2V0Ci0jIENPTkZJR19ST0NLRVRQT1JUIGlzIG5vdCBzZXQKLSMgQ09ORklHX0NZQ0xBREVTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0RJR0lFUENBIGlzIG5vdCBzZXQKLSMgQ09ORklHX01PWEFfSU5URUxMSU8gaXMgbm90IHNldAotIyBDT05GSUdfTU9YQV9TTUFSVElPIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lTSSBpcyBub3Qgc2V0Ci0jIENPTkZJR19TWU5DTElOS01QIGlzIG5vdCBzZXQKLSMgQ09ORklHX05fSERMQyBpcyBub3Qgc2V0Ci0jIENPTkZJR19SSVNDT004IGlzIG5vdCBzZXQKLSMgQ09ORklHX1NQRUNJQUxJWCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TWCBpcyBub3Qgc2V0Ci0jIENPTkZJR19SSU8gaXMgbm90IHNldAotIyBDT05GSUdfU1RBTERSViBpcyBub3Qgc2V0Ci0KLSMKLSMgU2VyaWFsIGRyaXZlcnMKLSMKLUNPTkZJR19TRVJJQUxfODI1MD15Ci1DT05GSUdfU0VSSUFMXzgyNTBfQ09OU09MRT15Ci1DT05GSUdfU0VSSUFMXzgyNTBfTlJfVUFSVFM9OAotQ09ORklHX1NFUklBTF84MjUwX0VYVEVOREVEPXkKLUNPTkZJR19TRVJJQUxfODI1MF9NQU5ZX1BPUlRTPXkKLUNPTkZJR19TRVJJQUxfODI1MF9TSEFSRV9JUlE9eQotIyBDT05GSUdfU0VSSUFMXzgyNTBfREVURUNUX0lSUSBpcyBub3Qgc2V0Ci0jIENPTkZJR19TRVJJQUxfODI1MF9NVUxUSVBPUlQgaXMgbm90IHNldAotIyBDT05GSUdfU0VSSUFMXzgyNTBfUlNBIGlzIG5vdCBzZXQKLQotIwotIyBOb24tODI1MCBzZXJpYWwgcG9ydCBzdXBwb3J0Ci0jCi1DT05GSUdfU0VSSUFMX1MzQzI0MTA9eQotQ09ORklHX1NFUklBTF9TM0MyNDEwX0NPTlNPTEU9eQotQ09ORklHX1NFUklBTF9DT1JFPXkKLUNPTkZJR19TRVJJQUxfQ09SRV9DT05TT0xFPXkKLUNPTkZJR19VTklYOThfUFRZUz15Ci1DT05GSUdfTEVHQUNZX1BUWVM9eQotQ09ORklHX0xFR0FDWV9QVFlfQ09VTlQ9MjU2Ci1DT05GSUdfUFJJTlRFUj15Ci0jIENPTkZJR19MUF9DT05TT0xFIGlzIG5vdCBzZXQKLUNPTkZJR19QUERFVj15Ci0jIENPTkZJR19USVBBUiBpcyBub3Qgc2V0Ci0KLSMKLSMgSVBNSQotIwotIyBDT05GSUdfSVBNSV9IQU5ETEVSIGlzIG5vdCBzZXQKLQotIwotIyBXYXRjaGRvZyBDYXJkcwotIwotQ09ORklHX1dBVENIRE9HPXkKLSMgQ09ORklHX1dBVENIRE9HX05PV0FZT1VUIGlzIG5vdCBzZXQKLQotIwotIyBXYXRjaGRvZyBEZXZpY2UgRHJpdmVycwotIwotIyBDT05GSUdfU09GVF9XQVRDSERPRyBpcyBub3Qgc2V0Ci1DT05GSUdfUzNDMjQxMF9XQVRDSERPRz15Ci0jIENPTkZJR19OVlJBTSBpcyBub3Qgc2V0Ci0jIENPTkZJR19SVEMgaXMgbm90IHNldAotQ09ORklHX1MzQzI0MTBfUlRDPXkKLSMgQ09ORklHX0RUTEsgaXMgbm90IHNldAotIyBDT05GSUdfUjM5NjQgaXMgbm90IHNldAotCi0jCi0jIEZ0YXBlLCB0aGUgZmxvcHB5IHRhcGUgZGV2aWNlIGRyaXZlcgotIwotIyBDT05GSUdfRFJNIGlzIG5vdCBzZXQKLSMgQ09ORklHX1JBV19EUklWRVIgaXMgbm90IHNldAotCi0jCi0jIFRQTSBkZXZpY2VzCi0jCi0jIENPTkZJR19UQ0dfVFBNIGlzIG5vdCBzZXQKLQotIwotIyBJMkMgc3VwcG9ydAotIwotQ09ORklHX0kyQz15Ci1DT05GSUdfSTJDX0NIQVJERVY9bQotCi0jCi0jIEkyQyBBbGdvcml0aG1zCi0jCi1DT05GSUdfSTJDX0FMR09CSVQ9bQotIyBDT05GSUdfSTJDX0FMR09QQ0YgaXMgbm90IHNldAotIyBDT05GSUdfSTJDX0FMR09QQ0EgaXMgbm90IHNldAotCi0jCi0jIEkyQyBIYXJkd2FyZSBCdXMgc3VwcG9ydAotIwotIyBDT05GSUdfSTJDX0lTQSBpcyBub3Qgc2V0Ci0jIENPTkZJR19JMkNfUEFSUE9SVCBpcyBub3Qgc2V0Ci0jIENPTkZJR19JMkNfUEFSUE9SVF9MSUdIVCBpcyBub3Qgc2V0Ci1DT05GSUdfSTJDX1MzQzI0MTA9eQotIyBDT05GSUdfSTJDX1NUVUIgaXMgbm90IHNldAotIyBDT05GSUdfSTJDX1BDQV9JU0EgaXMgbm90IHNldAotCi0jCi0jIEhhcmR3YXJlIFNlbnNvcnMgQ2hpcCBzdXBwb3J0Ci0jCi1DT05GSUdfSTJDX1NFTlNPUj1tCi0jIENPTkZJR19TRU5TT1JTX0FETTEwMjEgaXMgbm90IHNldAotIyBDT05GSUdfU0VOU09SU19BRE0xMDI1IGlzIG5vdCBzZXQKLSMgQ09ORklHX1NFTlNPUlNfQURNMTAyNiBpcyBub3Qgc2V0Ci0jIENPTkZJR19TRU5TT1JTX0FETTEwMzEgaXMgbm90IHNldAotIyBDT05GSUdfU0VOU09SU19BU0IxMDAgaXMgbm90IHNldAotIyBDT05GSUdfU0VOU09SU19EUzE2MjEgaXMgbm90IHNldAotIyBDT05GSUdfU0VOU09SU19GU0NIRVIgaXMgbm90IHNldAotIyBDT05GSUdfU0VOU09SU19GU0NQT1MgaXMgbm90IHNldAotIyBDT05GSUdfU0VOU09SU19HTDUxOFNNIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NFTlNPUlNfR0w1MjBTTSBpcyBub3Qgc2V0Ci0jIENPTkZJR19TRU5TT1JTX0lUODcgaXMgbm90IHNldAotIyBDT05GSUdfU0VOU09SU19MTTYzIGlzIG5vdCBzZXQKLUNPTkZJR19TRU5TT1JTX0xNNzU9bQotIyBDT05GSUdfU0VOU09SU19MTTc3IGlzIG5vdCBzZXQKLUNPTkZJR19TRU5TT1JTX0xNNzg9bQotIyBDT05GSUdfU0VOU09SU19MTTgwIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NFTlNPUlNfTE04MyBpcyBub3Qgc2V0Ci1DT05GSUdfU0VOU09SU19MTTg1PW0KLSMgQ09ORklHX1NFTlNPUlNfTE04NyBpcyBub3Qgc2V0Ci0jIENPTkZJR19TRU5TT1JTX0xNOTAgaXMgbm90IHNldAotIyBDT05GSUdfU0VOU09SU19NQVgxNjE5IGlzIG5vdCBzZXQKLSMgQ09ORklHX1NFTlNPUlNfUEM4NzM2MCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TRU5TT1JTX1NNU0M0N0IzOTcgaXMgbm90IHNldAotIyBDT05GSUdfU0VOU09SU19TTVNDNDdNMSBpcyBub3Qgc2V0Ci0jIENPTkZJR19TRU5TT1JTX1c4Mzc4MUQgaXMgbm90IHNldAotIyBDT05GSUdfU0VOU09SU19XODNMNzg1VFMgaXMgbm90IHNldAotIyBDT05GSUdfU0VOU09SU19XODM2MjdIRiBpcyBub3Qgc2V0Ci0KLSMKLSMgT3RoZXIgSTJDIENoaXAgc3VwcG9ydAotIwotQ09ORklHX1NFTlNPUlNfRUVQUk9NPW0KLSMgQ09ORklHX1NFTlNPUlNfUENGODU3NCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TRU5TT1JTX1BDRjg1OTEgaXMgbm90IHNldAotIyBDT05GSUdfU0VOU09SU19SVEM4NTY0IGlzIG5vdCBzZXQKLSMgQ09ORklHX0kyQ19ERUJVR19DT1JFIGlzIG5vdCBzZXQKLSMgQ09ORklHX0kyQ19ERUJVR19BTEdPIGlzIG5vdCBzZXQKLSMgQ09ORklHX0kyQ19ERUJVR19CVVMgaXMgbm90IHNldAotIyBDT05GSUdfSTJDX0RFQlVHX0NISVAgaXMgbm90IHNldAotCi0jCi0jIE1pc2MgZGV2aWNlcwotIwotCi0jCi0jIE11bHRpbWVkaWEgZGV2aWNlcwotIwotIyBDT05GSUdfVklERU9fREVWIGlzIG5vdCBzZXQKLQotIwotIyBEaWdpdGFsIFZpZGVvIEJyb2FkY2FzdGluZyBEZXZpY2VzCi0jCi0jIENPTkZJR19EVkIgaXMgbm90IHNldAotCi0jCi0jIEdyYXBoaWNzIHN1cHBvcnQKLSMKLUNPTkZJR19GQj15Ci0jIENPTkZJR19GQl9DRkJfRklMTFJFQ1QgaXMgbm90IHNldAotIyBDT05GSUdfRkJfQ0ZCX0NPUFlBUkVBIGlzIG5vdCBzZXQKLSMgQ09ORklHX0ZCX0NGQl9JTUFHRUJMSVQgaXMgbm90IHNldAotIyBDT05GSUdfRkJfU09GVF9DVVJTT1IgaXMgbm90IHNldAotQ09ORklHX0ZCX01PREVfSEVMUEVSUz15Ci0jIENPTkZJR19GQl9USUxFQkxJVFRJTkcgaXMgbm90IHNldAotIyBDT05GSUdfRkJfVklSVFVBTCBpcyBub3Qgc2V0Ci0KLSMKLSMgQ29uc29sZSBkaXNwbGF5IGRyaXZlciBzdXBwb3J0Ci0jCi0jIENPTkZJR19WR0FfQ09OU09MRSBpcyBub3Qgc2V0Ci1DT05GSUdfRFVNTVlfQ09OU09MRT15Ci0jIENPTkZJR19GUkFNRUJVRkZFUl9DT05TT0xFIGlzIG5vdCBzZXQKLQotIwotIyBMb2dvIGNvbmZpZ3VyYXRpb24KLSMKLSMgQ09ORklHX0xPR08gaXMgbm90IHNldAotIyBDT05GSUdfQkFDS0xJR0hUX0xDRF9TVVBQT1JUIGlzIG5vdCBzZXQKLQotIwotIyBTb3VuZAotIwotIyBDT05GSUdfU09VTkQgaXMgbm90IHNldAotCi0jCi0jIFVTQiBzdXBwb3J0Ci0jCi1DT05GSUdfVVNCX0FSQ0hfSEFTX0hDRD15Ci0jIENPTkZJR19VU0JfQVJDSF9IQVNfT0hDSSBpcyBub3Qgc2V0Ci0jIENPTkZJR19VU0IgaXMgbm90IHNldAotCi0jCi0jIFVTQiBHYWRnZXQgU3VwcG9ydAotIwotIyBDT05GSUdfVVNCX0dBREdFVCBpcyBub3Qgc2V0Ci0KLSMKLSMgTU1DL1NEIENhcmQgc3VwcG9ydAotIwotIyBDT05GSUdfTU1DIGlzIG5vdCBzZXQKLQotIwotIyBGaWxlIHN5c3RlbXMKLSMKLUNPTkZJR19FWFQyX0ZTPXkKLSMgQ09ORklHX0VYVDJfRlNfWEFUVFIgaXMgbm90IHNldAotQ09ORklHX0VYVDNfRlM9eQotQ09ORklHX0VYVDNfRlNfWEFUVFI9eQotIyBDT05GSUdfRVhUM19GU19QT1NJWF9BQ0wgaXMgbm90IHNldAotIyBDT05GSUdfRVhUM19GU19TRUNVUklUWSBpcyBub3Qgc2V0Ci1DT05GSUdfSkJEPXkKLSMgQ09ORklHX0pCRF9ERUJVRyBpcyBub3Qgc2V0Ci1DT05GSUdfRlNfTUJDQUNIRT15Ci0jIENPTkZJR19SRUlTRVJGU19GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19KRlNfRlMgaXMgbm90IHNldAotCi0jCi0jIFhGUyBzdXBwb3J0Ci0jCi0jIENPTkZJR19YRlNfRlMgaXMgbm90IHNldAotIyBDT05GSUdfTUlOSVhfRlMgaXMgbm90IHNldAotQ09ORklHX1JPTUZTX0ZTPXkKLSMgQ09ORklHX1FVT1RBIGlzIG5vdCBzZXQKLUNPTkZJR19ETk9USUZZPXkKLSMgQ09ORklHX0FVVE9GU19GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19BVVRPRlM0X0ZTIGlzIG5vdCBzZXQKLQotIwotIyBDRC1ST00vRFZEIEZpbGVzeXN0ZW1zCi0jCi0jIENPTkZJR19JU085NjYwX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX1VERl9GUyBpcyBub3Qgc2V0Ci0KLSMKLSMgRE9TL0ZBVC9OVCBGaWxlc3lzdGVtcwotIwotQ09ORklHX0ZBVF9GUz15Ci1DT05GSUdfTVNET1NfRlM9eQotQ09ORklHX1ZGQVRfRlM9eQotQ09ORklHX0ZBVF9ERUZBVUxUX0NPREVQQUdFPTQzNwotQ09ORklHX0ZBVF9ERUZBVUxUX0lPQ0hBUlNFVD0iaXNvODg1OS0xIgotIyBDT05GSUdfTlRGU19GUyBpcyBub3Qgc2V0Ci0KLSMKLSMgUHNldWRvIGZpbGVzeXN0ZW1zCi0jCi1DT05GSUdfUFJPQ19GUz15Ci1DT05GSUdfU1lTRlM9eQotIyBDT05GSUdfREVWRlNfRlMgaXMgbm90IHNldAotIyBDT05GSUdfREVWUFRTX0ZTX1hBVFRSIGlzIG5vdCBzZXQKLSMgQ09ORklHX1RNUEZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0hVR0VUTEJfUEFHRSBpcyBub3Qgc2V0Ci1DT05GSUdfUkFNRlM9eQotCi0jCi0jIE1pc2NlbGxhbmVvdXMgZmlsZXN5c3RlbXMKLSMKLSMgQ09ORklHX0FERlNfRlMgaXMgbm90IHNldAotIyBDT05GSUdfQUZGU19GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19IRlNfRlMgaXMgbm90IHNldAotIyBDT05GSUdfSEZTUExVU19GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19CRUZTX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0JGU19GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19FRlNfRlMgaXMgbm90IHNldAotQ09ORklHX0pGRlNfRlM9eQotQ09ORklHX0pGRlNfRlNfVkVSQk9TRT0wCi0jIENPTkZJR19KRkZTX1BST0NfRlMgaXMgbm90IHNldAotQ09ORklHX0pGRlMyX0ZTPXkKLUNPTkZJR19KRkZTMl9GU19ERUJVRz0wCi0jIENPTkZJR19KRkZTMl9GU19OQU5EIGlzIG5vdCBzZXQKLSMgQ09ORklHX0pGRlMyX0ZTX05PUl9FQ0MgaXMgbm90IHNldAotIyBDT05GSUdfSkZGUzJfQ09NUFJFU1NJT05fT1BUSU9OUyBpcyBub3Qgc2V0Ci1DT05GSUdfSkZGUzJfWkxJQj15Ci1DT05GSUdfSkZGUzJfUlRJTUU9eQotIyBDT05GSUdfSkZGUzJfUlVCSU4gaXMgbm90IHNldAotIyBDT05GSUdfQ1JBTUZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX1ZYRlNfRlMgaXMgbm90IHNldAotIyBDT05GSUdfSFBGU19GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19RTlg0RlNfRlMgaXMgbm90IHNldAotIyBDT05GSUdfU1lTVl9GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19VRlNfRlMgaXMgbm90IHNldAotCi0jCi0jIE5ldHdvcmsgRmlsZSBTeXN0ZW1zCi0jCi1DT05GSUdfTkZTX0ZTPXkKLSMgQ09ORklHX05GU19WMyBpcyBub3Qgc2V0Ci0jIENPTkZJR19ORlNfVjQgaXMgbm90IHNldAotIyBDT05GSUdfTkZTX0RJUkVDVElPIGlzIG5vdCBzZXQKLSMgQ09ORklHX05GU0QgaXMgbm90IHNldAotQ09ORklHX1JPT1RfTkZTPXkKLUNPTkZJR19MT0NLRD15Ci1DT05GSUdfU1VOUlBDPXkKLSMgQ09ORklHX1JQQ1NFQ19HU1NfS1JCNSBpcyBub3Qgc2V0Ci0jIENPTkZJR19SUENTRUNfR1NTX1NQS00zIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NNQl9GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19DSUZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX05DUF9GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19DT0RBX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0FGU19GUyBpcyBub3Qgc2V0Ci0KLSMKLSMgUGFydGl0aW9uIFR5cGVzCi0jCi1DT05GSUdfUEFSVElUSU9OX0FEVkFOQ0VEPXkKLSMgQ09ORklHX0FDT1JOX1BBUlRJVElPTiBpcyBub3Qgc2V0Ci0jIENPTkZJR19PU0ZfUEFSVElUSU9OIGlzIG5vdCBzZXQKLSMgQ09ORklHX0FNSUdBX1BBUlRJVElPTiBpcyBub3Qgc2V0Ci0jIENPTkZJR19BVEFSSV9QQVJUSVRJT04gaXMgbm90IHNldAotIyBDT05GSUdfTUFDX1BBUlRJVElPTiBpcyBub3Qgc2V0Ci1DT05GSUdfTVNET1NfUEFSVElUSU9OPXkKLUNPTkZJR19CU0RfRElTS0xBQkVMPXkKLSMgQ09ORklHX01JTklYX1NVQlBBUlRJVElPTiBpcyBub3Qgc2V0Ci1DT05GSUdfU09MQVJJU19YODZfUEFSVElUSU9OPXkKLSMgQ09ORklHX1VOSVhXQVJFX0RJU0tMQUJFTCBpcyBub3Qgc2V0Ci0jIENPTkZJR19MRE1fUEFSVElUSU9OIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NHSV9QQVJUSVRJT04gaXMgbm90IHNldAotIyBDT05GSUdfVUxUUklYX1BBUlRJVElPTiBpcyBub3Qgc2V0Ci0jIENPTkZJR19TVU5fUEFSVElUSU9OIGlzIG5vdCBzZXQKLSMgQ09ORklHX0VGSV9QQVJUSVRJT04gaXMgbm90IHNldAotCi0jCi0jIE5hdGl2ZSBMYW5ndWFnZSBTdXBwb3J0Ci0jCi1DT05GSUdfTkxTPXkKLUNPTkZJR19OTFNfREVGQVVMVD0iaXNvODg1OS0xIgotIyBDT05GSUdfTkxTX0NPREVQQUdFXzQzNyBpcyBub3Qgc2V0Ci0jIENPTkZJR19OTFNfQ09ERVBBR0VfNzM3IGlzIG5vdCBzZXQKLSMgQ09ORklHX05MU19DT0RFUEFHRV83NzUgaXMgbm90IHNldAotIyBDT05GSUdfTkxTX0NPREVQQUdFXzg1MCBpcyBub3Qgc2V0Ci0jIENPTkZJR19OTFNfQ09ERVBBR0VfODUyIGlzIG5vdCBzZXQKLSMgQ09ORklHX05MU19DT0RFUEFHRV84NTUgaXMgbm90IHNldAotIyBDT05GSUdfTkxTX0NPREVQQUdFXzg1NyBpcyBub3Qgc2V0Ci0jIENPTkZJR19OTFNfQ09ERVBBR0VfODYwIGlzIG5vdCBzZXQKLSMgQ09ORklHX05MU19DT0RFUEFHRV84NjEgaXMgbm90IHNldAotIyBDT05GSUdfTkxTX0NPREVQQUdFXzg2MiBpcyBub3Qgc2V0Ci0jIENPTkZJR19OTFNfQ09ERVBBR0VfODYzIGlzIG5vdCBzZXQKLSMgQ09ORklHX05MU19DT0RFUEFHRV84NjQgaXMgbm90IHNldAotIyBDT05GSUdfTkxTX0NPREVQQUdFXzg2NSBpcyBub3Qgc2V0Ci0jIENPTkZJR19OTFNfQ09ERVBBR0VfODY2IGlzIG5vdCBzZXQKLSMgQ09ORklHX05MU19DT0RFUEFHRV84NjkgaXMgbm90IHNldAotIyBDT05GSUdfTkxTX0NPREVQQUdFXzkzNiBpcyBub3Qgc2V0Ci0jIENPTkZJR19OTFNfQ09ERVBBR0VfOTUwIGlzIG5vdCBzZXQKLSMgQ09ORklHX05MU19DT0RFUEFHRV85MzIgaXMgbm90IHNldAotIyBDT05GSUdfTkxTX0NPREVQQUdFXzk0OSBpcyBub3Qgc2V0Ci0jIENPTkZJR19OTFNfQ09ERVBBR0VfODc0IGlzIG5vdCBzZXQKLSMgQ09ORklHX05MU19JU084ODU5XzggaXMgbm90IHNldAotIyBDT05GSUdfTkxTX0NPREVQQUdFXzEyNTAgaXMgbm90IHNldAotIyBDT05GSUdfTkxTX0NPREVQQUdFXzEyNTEgaXMgbm90IHNldAotIyBDT05GSUdfTkxTX0FTQ0lJIGlzIG5vdCBzZXQKLSMgQ09ORklHX05MU19JU084ODU5XzEgaXMgbm90IHNldAotIyBDT05GSUdfTkxTX0lTTzg4NTlfMiBpcyBub3Qgc2V0Ci0jIENPTkZJR19OTFNfSVNPODg1OV8zIGlzIG5vdCBzZXQKLSMgQ09ORklHX05MU19JU084ODU5XzQgaXMgbm90IHNldAotIyBDT05GSUdfTkxTX0lTTzg4NTlfNSBpcyBub3Qgc2V0Ci0jIENPTkZJR19OTFNfSVNPODg1OV82IGlzIG5vdCBzZXQKLSMgQ09ORklHX05MU19JU084ODU5XzcgaXMgbm90IHNldAotIyBDT05GSUdfTkxTX0lTTzg4NTlfOSBpcyBub3Qgc2V0Ci0jIENPTkZJR19OTFNfSVNPODg1OV8xMyBpcyBub3Qgc2V0Ci0jIENPTkZJR19OTFNfSVNPODg1OV8xNCBpcyBub3Qgc2V0Ci0jIENPTkZJR19OTFNfSVNPODg1OV8xNSBpcyBub3Qgc2V0Ci0jIENPTkZJR19OTFNfS09JOF9SIGlzIG5vdCBzZXQKLSMgQ09ORklHX05MU19LT0k4X1UgaXMgbm90IHNldAotIyBDT05GSUdfTkxTX1VURjggaXMgbm90IHNldAotCi0jCi0jIFByb2ZpbGluZyBzdXBwb3J0Ci0jCi0jIENPTkZJR19QUk9GSUxJTkcgaXMgbm90IHNldAotCi0jCi0jIEtlcm5lbCBoYWNraW5nCi0jCi0jIENPTkZJR19QUklOVEtfVElNRSBpcyBub3Qgc2V0Ci1DT05GSUdfREVCVUdfS0VSTkVMPXkKLSMgQ09ORklHX01BR0lDX1NZU1JRIGlzIG5vdCBzZXQKLUNPTkZJR19MT0dfQlVGX1NISUZUPTE2Ci0jIENPTkZJR19TQ0hFRFNUQVRTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0RFQlVHX1NMQUIgaXMgbm90IHNldAotIyBDT05GSUdfREVCVUdfU1BJTkxPQ0sgaXMgbm90IHNldAotIyBDT05GSUdfREVCVUdfU1BJTkxPQ0tfU0xFRVAgaXMgbm90IHNldAotIyBDT05GSUdfREVCVUdfS09CSkVDVCBpcyBub3Qgc2V0Ci1DT05GSUdfREVCVUdfQlVHVkVSQk9TRT15Ci1DT05GSUdfREVCVUdfSU5GTz15Ci0jIENPTkZJR19ERUJVR19GUyBpcyBub3Qgc2V0Ci1DT05GSUdfRlJBTUVfUE9JTlRFUj15Ci1DT05GSUdfREVCVUdfVVNFUj15Ci0jIENPTkZJR19ERUJVR19XQUlUUSBpcyBub3Qgc2V0Ci0jIENPTkZJR19ERUJVR19FUlJPUlMgaXMgbm90IHNldAotQ09ORklHX0RFQlVHX0xMPXkKLSMgQ09ORklHX0RFQlVHX0lDRURDQyBpcyBub3Qgc2V0Ci1DT05GSUdfREVCVUdfUzNDMjQxMF9QT1JUPXkKLUNPTkZJR19ERUJVR19TM0MyNDEwX1VBUlQ9MAotCi0jCi0jIFNlY3VyaXR5IG9wdGlvbnMKLSMKLSMgQ09ORklHX0tFWVMgaXMgbm90IHNldAotIyBDT05GSUdfU0VDVVJJVFkgaXMgbm90IHNldAotCi0jCi0jIENyeXB0b2dyYXBoaWMgb3B0aW9ucwotIwotIyBDT05GSUdfQ1JZUFRPIGlzIG5vdCBzZXQKLQotIwotIyBIYXJkd2FyZSBjcnlwdG8gZGV2aWNlcwotIwotCi0jCi0jIExpYnJhcnkgcm91dGluZXMKLSMKLSMgQ09ORklHX0NSQ19DQ0lUVCBpcyBub3Qgc2V0Ci1DT05GSUdfQ1JDMzI9eQotIyBDT05GSUdfTElCQ1JDMzJDIGlzIG5vdCBzZXQKLUNPTkZJR19aTElCX0lORkxBVEU9eQotQ09ORklHX1pMSUJfREVGTEFURT15CmRpZmYgLS1naXQgYS9hcmNoL2FybS9jb25maWdzL2NvbGxpZV9kZWZjb25maWcgYi9hcmNoL2FybS9jb25maWdzL2NvbGxpZV9kZWZjb25maWcKaW5kZXggMDc0YzQ3YS4uYTM3NTg5MSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vY29uZmlncy9jb2xsaWVfZGVmY29uZmlnCisrKyBiL2FyY2gvYXJtL2NvbmZpZ3MvY29sbGllX2RlZmNvbmZpZwpAQCAtMjE5LDcgKzIxOSw3IEBACiAjIFBvd2VyIG1hbmFnZW1lbnQgb3B0aW9ucwogIwogQ09ORklHX1BNPXkKLUNPTkZJR19QTV9MRUdBQ1k9eQorIyBDT05GSUdfUE1fTEVHQUNZIGlzIG5vdCBzZXQKICMgQ09ORklHX1BNX0RFQlVHIGlzIG5vdCBzZXQKIENPTkZJR19BUE09eQogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9jb25maWdzL2NzYjMzN19kZWZjb25maWcgYi9hcmNoL2FybS9jb25maWdzL2NzYjMzN19kZWZjb25maWcKaW5kZXggYTJkNmZkMy4uMjBlNjgyNSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vY29uZmlncy9jc2IzMzdfZGVmY29uZmlnCisrKyBiL2FyY2gvYXJtL2NvbmZpZ3MvY3NiMzM3X2RlZmNvbmZpZwpAQCAtNjE1LDcgKzYxNSw3IEBACiAjIFdhdGNoZG9nIERldmljZSBEcml2ZXJzCiAjCiAjIENPTkZJR19TT0ZUX1dBVENIRE9HIGlzIG5vdCBzZXQKLUNPTkZJR19BVDkxX1dBVENIRE9HPXkKK0NPTkZJR19BVDkxUk05MjAwX1dBVENIRE9HPXkKIAogIwogIyBVU0ItYmFzZWQgV2F0Y2hkb2cgQ2FyZHMKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2NvbmZpZ3MvY3NiNjM3X2RlZmNvbmZpZyBiL2FyY2gvYXJtL2NvbmZpZ3MvY3NiNjM3X2RlZmNvbmZpZwppbmRleCAyYTFhYzZjLi5kZjg1OTVhIDEwMDY0NAotLS0gYS9hcmNoL2FybS9jb25maWdzL2NzYjYzN19kZWZjb25maWcKKysrIGIvYXJjaC9hcm0vY29uZmlncy9jc2I2MzdfZGVmY29uZmlnCkBAIC02MTUsNyArNjE1LDcgQEAKICMgV2F0Y2hkb2cgRGV2aWNlIERyaXZlcnMKICMKICMgQ09ORklHX1NPRlRfV0FUQ0hET0cgaXMgbm90IHNldAotQ09ORklHX0FUOTFfV0FUQ0hET0c9eQorQ09ORklHX0FUOTFSTTkyMDBfV0FUQ0hET0c9eQogCiAjCiAjIFVTQi1iYXNlZCBXYXRjaGRvZyBDYXJkcwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vY29uZmlncy9peHA0eHhfZGVmY29uZmlnIGIvYXJjaC9hcm0vY29uZmlncy9peHA0eHhfZGVmY29uZmlnCmluZGV4IDQ5NzViOTEuLmZhYzdjM2IgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2NvbmZpZ3MvaXhwNHh4X2RlZmNvbmZpZworKysgYi9hcmNoL2FybS9jb25maWdzL2l4cDR4eF9kZWZjb25maWcKQEAgLTIwNiwxMCArMjA2LDggQEAKICMKICMgUG93ZXIgbWFuYWdlbWVudCBvcHRpb25zCiAjCi1DT05GSUdfUE09eQotQ09ORklHX1BNX0xFR0FDWT15Ci0jIENPTkZJR19QTV9ERUJVRyBpcyBub3Qgc2V0Ci1DT05GSUdfQVBNPXkKKyMgQ09ORklHX1BNIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FQTSBpcyBub3Qgc2V0CiAKICMKICMgTmV0d29ya2luZwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vY29uZmlncy9rYWZhX2RlZmNvbmZpZyBiL2FyY2gvYXJtL2NvbmZpZ3Mva2FmYV9kZWZjb25maWcKaW5kZXggNTRmY2Q3NS4uYTRjZGFmYyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vY29uZmlncy9rYWZhX2RlZmNvbmZpZworKysgYi9hcmNoL2FybS9jb25maWdzL2thZmFfZGVmY29uZmlnCkBAIC01NjAsNyArNTYwLDcgQEAKICMgV2F0Y2hkb2cgRGV2aWNlIERyaXZlcnMKICMKICMgQ09ORklHX1NPRlRfV0FUQ0hET0cgaXMgbm90IHNldAotQ09ORklHX0FUOTFfV0FUQ0hET0c9eQorQ09ORklHX0FUOTFSTTkyMDBfV0FUQ0hET0c9eQogIyBDT05GSUdfTlZSQU0gaXMgbm90IHNldAogIyBDT05GSUdfRFRMSyBpcyBub3Qgc2V0CiAjIENPTkZJR19SMzk2NCBpcyBub3Qgc2V0CmRpZmYgLS1naXQgYS9hcmNoL2FybS9jb25maWdzL29tYXBfaDJfMTYxMF9kZWZjb25maWcgYi9hcmNoL2FybS9jb25maWdzL29tYXBfaDJfMTYxMF9kZWZjb25maWcKaW5kZXggMDVhZGIwYi4uYjBlZmQ0YyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vY29uZmlncy9vbWFwX2gyXzE2MTBfZGVmY29uZmlnCisrKyBiL2FyY2gvYXJtL2NvbmZpZ3Mvb21hcF9oMl8xNjEwX2RlZmNvbmZpZwpAQCAtMjU3LDcgKzI1Nyw3IEBACiAjIFBvd2VyIG1hbmFnZW1lbnQgb3B0aW9ucwogIwogQ09ORklHX1BNPXkKLUNPTkZJR19QTV9MRUdBQ1k9eQorIyBDT05GSUdfUE1fTEVHQUNZIGlzIG5vdCBzZXQKICMgQ09ORklHX1BNX0RFQlVHIGlzIG5vdCBzZXQKICMgQ09ORklHX0FQTSBpcyBub3Qgc2V0CiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2NvbmZpZ3Mvb25lYXJtX2RlZmNvbmZpZyBiL2FyY2gvYXJtL2NvbmZpZ3Mvb25lYXJtX2RlZmNvbmZpZwppbmRleCBjYjFkOTRmLi45YjlmMjE1IDEwMDY0NAotLS0gYS9hcmNoL2FybS9jb25maWdzL29uZWFybV9kZWZjb25maWcKKysrIGIvYXJjaC9hcm0vY29uZmlncy9vbmVhcm1fZGVmY29uZmlnCkBAIC02MDcsNyArNjA3LDcgQEAKICMgV2F0Y2hkb2cgRGV2aWNlIERyaXZlcnMKICMKICMgQ09ORklHX1NPRlRfV0FUQ0hET0cgaXMgbm90IHNldAotQ09ORklHX0FUOTFfV0FUQ0hET0c9eQorQ09ORklHX0FUOTFSTTkyMDBfV0FUQ0hET0c9eQogCiAjCiAjIFVTQi1iYXNlZCBXYXRjaGRvZyBDYXJkcwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vY29uZmlncy9yZWFsdmlldy1zbXBfZGVmY29uZmlnIGIvYXJjaC9hcm0vY29uZmlncy9yZWFsdmlldy1zbXBfZGVmY29uZmlnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZmZDkwNWYKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9jb25maWdzL3JlYWx2aWV3LXNtcF9kZWZjb25maWcKQEAgLTAsMCArMSw5OTQgQEAKKyMKKyMgQXV0b21hdGljYWxseSBnZW5lcmF0ZWQgbWFrZSBjb25maWc6IGRvbid0IGVkaXQKKyMgTGludXgga2VybmVsIHZlcnNpb246IDIuNi4xOS1yYzMKKyMgV2VkIE9jdCAyNSAxNDoxMjowMCAyMDA2CisjCitDT05GSUdfQVJNPXkKKyMgQ09ORklHX0dFTkVSSUNfVElNRSBpcyBub3Qgc2V0CitDT05GSUdfTU1VPXkKK0NPTkZJR19HRU5FUklDX0hBUkRJUlFTPXkKK0NPTkZJR19UUkFDRV9JUlFGTEFHU19TVVBQT1JUPXkKK0NPTkZJR19IQVJESVJRU19TV19SRVNFTkQ9eQorQ09ORklHX0dFTkVSSUNfSVJRX1BST0JFPXkKK0NPTkZJR19SV1NFTV9HRU5FUklDX1NQSU5MT0NLPXkKK0NPTkZJR19HRU5FUklDX0hXRUlHSFQ9eQorQ09ORklHX0dFTkVSSUNfQ0FMSUJSQVRFX0RFTEFZPXkKK0NPTkZJR19WRUNUT1JTX0JBU0U9MHhmZmZmMDAwMAorQ09ORklHX0RFRkNPTkZJR19MSVNUPSIvbGliL21vZHVsZXMvJFVOQU1FX1JFTEVBU0UvLmNvbmZpZyIKKworIworIyBDb2RlIG1hdHVyaXR5IGxldmVsIG9wdGlvbnMKKyMKK0NPTkZJR19FWFBFUklNRU5UQUw9eQorQ09ORklHX0xPQ0tfS0VSTkVMPXkKK0NPTkZJR19JTklUX0VOVl9BUkdfTElNSVQ9MzIKKworIworIyBHZW5lcmFsIHNldHVwCisjCitDT05GSUdfTE9DQUxWRVJTSU9OPSIiCitDT05GSUdfTE9DQUxWRVJTSU9OX0FVVE89eQorIyBDT05GSUdfU1dBUCBpcyBub3Qgc2V0CitDT05GSUdfU1lTVklQQz15CisjIENPTkZJR19JUENfTlMgaXMgbm90IHNldAorIyBDT05GSUdfUE9TSVhfTVFVRVVFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JTRF9QUk9DRVNTX0FDQ1QgaXMgbm90IHNldAorIyBDT05GSUdfVEFTS1NUQVRTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VUU19OUyBpcyBub3Qgc2V0CisjIENPTkZJR19BVURJVCBpcyBub3Qgc2V0CisjIENPTkZJR19JS0NPTkZJRyBpcyBub3Qgc2V0CisjIENPTkZJR19DUFVTRVRTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JFTEFZIGlzIG5vdCBzZXQKK0NPTkZJR19JTklUUkFNRlNfU09VUkNFPSIiCitDT05GSUdfQ0NfT1BUSU1JWkVfRk9SX1NJWkU9eQorQ09ORklHX1NZU0NUTD15CisjIENPTkZJR19FTUJFRERFRCBpcyBub3Qgc2V0CitDT05GSUdfVUlEMTY9eQorIyBDT05GSUdfU1lTQ1RMX1NZU0NBTEwgaXMgbm90IHNldAorQ09ORklHX0tBTExTWU1TPXkKK0NPTkZJR19LQUxMU1lNU19BTEw9eQorIyBDT05GSUdfS0FMTFNZTVNfRVhUUkFfUEFTUyBpcyBub3Qgc2V0CitDT05GSUdfSE9UUExVRz15CitDT05GSUdfUFJJTlRLPXkKK0NPTkZJR19CVUc9eQorQ09ORklHX0VMRl9DT1JFPXkKK0NPTkZJR19CQVNFX0ZVTEw9eQorQ09ORklHX0ZVVEVYPXkKK0NPTkZJR19FUE9MTD15CitDT05GSUdfU0hNRU09eQorQ09ORklHX1NMQUI9eQorQ09ORklHX1ZNX0VWRU5UX0NPVU5URVJTPXkKK0NPTkZJR19SVF9NVVRFWEVTPXkKKyMgQ09ORklHX1RJTllfU0hNRU0gaXMgbm90IHNldAorQ09ORklHX0JBU0VfU01BTEw9MAorIyBDT05GSUdfU0xPQiBpcyBub3Qgc2V0CisKKyMKKyMgTG9hZGFibGUgbW9kdWxlIHN1cHBvcnQKKyMKK0NPTkZJR19NT0RVTEVTPXkKK0NPTkZJR19NT0RVTEVfVU5MT0FEPXkKKyMgQ09ORklHX01PRFVMRV9GT1JDRV9VTkxPQUQgaXMgbm90IHNldAorIyBDT05GSUdfTU9EVkVSU0lPTlMgaXMgbm90IHNldAorIyBDT05GSUdfTU9EVUxFX1NSQ1ZFUlNJT05fQUxMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0tNT0QgaXMgbm90IHNldAorQ09ORklHX1NUT1BfTUFDSElORT15CisKKyMKKyMgQmxvY2sgbGF5ZXIKKyMKK0NPTkZJR19CTE9DSz15CisjIENPTkZJR19CTEtfREVWX0lPX1RSQUNFIGlzIG5vdCBzZXQKKworIworIyBJTyBTY2hlZHVsZXJzCisjCitDT05GSUdfSU9TQ0hFRF9OT09QPXkKKyMgQ09ORklHX0lPU0NIRURfQVMgaXMgbm90IHNldAorQ09ORklHX0lPU0NIRURfREVBRExJTkU9eQorIyBDT05GSUdfSU9TQ0hFRF9DRlEgaXMgbm90IHNldAorIyBDT05GSUdfREVGQVVMVF9BUyBpcyBub3Qgc2V0CitDT05GSUdfREVGQVVMVF9ERUFETElORT15CisjIENPTkZJR19ERUZBVUxUX0NGUSBpcyBub3Qgc2V0CisjIENPTkZJR19ERUZBVUxUX05PT1AgaXMgbm90IHNldAorQ09ORklHX0RFRkFVTFRfSU9TQ0hFRD0iZGVhZGxpbmUiCisKKyMKKyMgU3lzdGVtIFR5cGUKKyMKKyMgQ09ORklHX0FSQ0hfQUFFQzIwMDAgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9JTlRFR1JBVE9SIGlzIG5vdCBzZXQKK0NPTkZJR19BUkNIX1JFQUxWSUVXPXkKKyMgQ09ORklHX0FSQ0hfVkVSU0FUSUxFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfQVQ5MSBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0NMUFM3NTAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfQ0xQUzcxMVggaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9DTzI4NSBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0VCU0ExMTAgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9FUDkzWFggaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9GT09UQlJJREdFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfTkVUWCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0g3MjBYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfSU1YIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfSU9QMzJYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfSU9QMzNYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfSVhQNFhYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfSVhQMjAwMCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0lYUDIzWFggaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9MNzIwMCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX1BOWDQwMDggaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9QWEEgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9SUEMgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9TQTExMDAgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9TM0MyNDEwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfU0hBUksgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9MSDdBNDBYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfT01BUCBpcyBub3Qgc2V0CisKKyMKKyMgUmVhbFZpZXcgcGxhdGZvcm0gdHlwZQorIworQ09ORklHX01BQ0hfUkVBTFZJRVdfRUI9eQorQ09ORklHX1JFQUxWSUVXX01QQ09SRT15CisKKyMKKyMgUHJvY2Vzc29yIFR5cGUKKyMKK0NPTkZJR19DUFVfMzI9eQorIyBDT05GSUdfQ1BVX0FSTTkyNlQgaXMgbm90IHNldAorQ09ORklHX0NQVV9WNj15CitDT05GSUdfQ1BVXzMydjZLPXkKK0NPTkZJR19DUFVfMzJ2Nj15CitDT05GSUdfQ1BVX0FCUlRfRVY2PXkKK0NPTkZJR19DUFVfQ0FDSEVfVjY9eQorQ09ORklHX0NQVV9DQUNIRV9WSVBUPXkKK0NPTkZJR19DUFVfQ09QWV9WNj15CitDT05GSUdfQ1BVX1RMQl9WNj15CitDT05GSUdfQ1BVX0NQMTU9eQorQ09ORklHX0NQVV9DUDE1X01NVT15CisKKyMKKyMgUHJvY2Vzc29yIEZlYXR1cmVzCisjCitDT05GSUdfQVJNX1RIVU1CPXkKKyMgQ09ORklHX0NQVV9JQ0FDSEVfRElTQUJMRSBpcyBub3Qgc2V0CisjIENPTkZJR19DUFVfRENBQ0hFX0RJU0FCTEUgaXMgbm90IHNldAorIyBDT05GSUdfQ1BVX0RDQUNIRV9XUklURVRIUk9VR0ggaXMgbm90IHNldAorIyBDT05GSUdfQ1BVX0JQUkVESUNUX0RJU0FCTEUgaXMgbm90IHNldAorQ09ORklHX0hBU19UTFNfUkVHPXkKK0NPTkZJR19BUk1fR0lDPXkKK0NPTkZJR19JQ1NUMzA3PXkKKworIworIyBCdXMgc3VwcG9ydAorIworQ09ORklHX0FSTV9BTUJBPXkKKworIworIyBQQ0NBUkQgKFBDTUNJQS9DYXJkQnVzKSBzdXBwb3J0CisjCisjIENPTkZJR19QQ0NBUkQgaXMgbm90IHNldAorCisjCisjIEtlcm5lbCBGZWF0dXJlcworIworQ09ORklHX1NNUD15CitDT05GSUdfTlJfQ1BVUz00CitDT05GSUdfSE9UUExVR19DUFU9eQorQ09ORklHX0xPQ0FMX1RJTUVSUz15CisjIENPTkZJR19QUkVFTVBUIGlzIG5vdCBzZXQKKyMgQ09ORklHX05PX0lETEVfSFogaXMgbm90IHNldAorQ09ORklHX0haPTEwMAorIyBDT05GSUdfQUVBQkkgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9ESVNDT05USUdNRU1fRU5BQkxFIGlzIG5vdCBzZXQKK0NPTkZJR19TRUxFQ1RfTUVNT1JZX01PREVMPXkKK0NPTkZJR19GTEFUTUVNX01BTlVBTD15CisjIENPTkZJR19ESVNDT05USUdNRU1fTUFOVUFMIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NQQVJTRU1FTV9NQU5VQUwgaXMgbm90IHNldAorQ09ORklHX0ZMQVRNRU09eQorQ09ORklHX0ZMQVRfTk9ERV9NRU1fTUFQPXkKKyMgQ09ORklHX1NQQVJTRU1FTV9TVEFUSUMgaXMgbm90IHNldAorQ09ORklHX1NQTElUX1BUTE9DS19DUFVTPTQKKyMgQ09ORklHX1JFU09VUkNFU182NEJJVCBpcyBub3Qgc2V0CitDT05GSUdfQUxJR05NRU5UX1RSQVA9eQorCisjCisjIEJvb3Qgb3B0aW9ucworIworQ09ORklHX1pCT09UX1JPTV9URVhUPTB4MAorQ09ORklHX1pCT09UX1JPTV9CU1M9MHgwCitDT05GSUdfQ01ETElORT0icm9vdD0vZGV2L25mcyBuZnNyb290PTEwLjEuNjkuMzovd29yay9uZnNyb290IGlwPWRoY3AgY29uc29sZT10dHlBTUEwIG1lbT0xMjhNIgorIyBDT05GSUdfWElQX0tFUk5FTCBpcyBub3Qgc2V0CisKKyMKKyMgRmxvYXRpbmcgcG9pbnQgZW11bGF0aW9uCisjCisKKyMKKyMgQXQgbGVhc3Qgb25lIGVtdWxhdGlvbiBtdXN0IGJlIHNlbGVjdGVkCisjCitDT05GSUdfRlBFX05XRlBFPXkKKyMgQ09ORklHX0ZQRV9OV0ZQRV9YUCBpcyBub3Qgc2V0CisjIENPTkZJR19GUEVfRkFTVEZQRSBpcyBub3Qgc2V0CitDT05GSUdfVkZQPXkKKworIworIyBVc2Vyc3BhY2UgYmluYXJ5IGZvcm1hdHMKKyMKK0NPTkZJR19CSU5GTVRfRUxGPXkKKyMgQ09ORklHX0JJTkZNVF9BT1VUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JJTkZNVF9NSVNDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSVEhVUiBpcyBub3Qgc2V0CisKKyMKKyMgUG93ZXIgbWFuYWdlbWVudCBvcHRpb25zCisjCisjIENPTkZJR19QTSBpcyBub3Qgc2V0CisjIENPTkZJR19BUE0gaXMgbm90IHNldAorCisjCisjIE5ldHdvcmtpbmcKKyMKK0NPTkZJR19ORVQ9eQorCisjCisjIE5ldHdvcmtpbmcgb3B0aW9ucworIworIyBDT05GSUdfTkVUREVCVUcgaXMgbm90IHNldAorQ09ORklHX1BBQ0tFVD15CisjIENPTkZJR19QQUNLRVRfTU1BUCBpcyBub3Qgc2V0CitDT05GSUdfVU5JWD15CisjIENPTkZJR19ORVRfS0VZIGlzIG5vdCBzZXQKK0NPTkZJR19JTkVUPXkKKyMgQ09ORklHX0lQX01VTFRJQ0FTVCBpcyBub3Qgc2V0CisjIENPTkZJR19JUF9BRFZBTkNFRF9ST1VURVIgaXMgbm90IHNldAorQ09ORklHX0lQX0ZJQl9IQVNIPXkKK0NPTkZJR19JUF9QTlA9eQorQ09ORklHX0lQX1BOUF9ESENQPXkKK0NPTkZJR19JUF9QTlBfQk9PVFA9eQorIyBDT05GSUdfSVBfUE5QX1JBUlAgaXMgbm90IHNldAorIyBDT05GSUdfTkVUX0lQSVAgaXMgbm90IHNldAorIyBDT05GSUdfTkVUX0lQR1JFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSUEQgaXMgbm90IHNldAorIyBDT05GSUdfU1lOX0NPT0tJRVMgaXMgbm90IHNldAorIyBDT05GSUdfSU5FVF9BSCBpcyBub3Qgc2V0CisjIENPTkZJR19JTkVUX0VTUCBpcyBub3Qgc2V0CisjIENPTkZJR19JTkVUX0lQQ09NUCBpcyBub3Qgc2V0CisjIENPTkZJR19JTkVUX1hGUk1fVFVOTkVMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lORVRfVFVOTkVMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lORVRfWEZSTV9NT0RFX1RSQU5TUE9SVCBpcyBub3Qgc2V0CisjIENPTkZJR19JTkVUX1hGUk1fTU9ERV9UVU5ORUwgaXMgbm90IHNldAorIyBDT05GSUdfSU5FVF9YRlJNX01PREVfQkVFVCBpcyBub3Qgc2V0CitDT05GSUdfSU5FVF9ESUFHPXkKK0NPTkZJR19JTkVUX1RDUF9ESUFHPXkKKyMgQ09ORklHX1RDUF9DT05HX0FEVkFOQ0VEIGlzIG5vdCBzZXQKK0NPTkZJR19UQ1BfQ09OR19DVUJJQz15CitDT05GSUdfREVGQVVMVF9UQ1BfQ09ORz0iY3ViaWMiCisjIENPTkZJR19JUFY2IGlzIG5vdCBzZXQKKyMgQ09ORklHX0lORVQ2X1hGUk1fVFVOTkVMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lORVQ2X1RVTk5FTCBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRXT1JLX1NFQ01BUksgaXMgbm90IHNldAorIyBDT05GSUdfTkVURklMVEVSIGlzIG5vdCBzZXQKKworIworIyBEQ0NQIENvbmZpZ3VyYXRpb24gKEVYUEVSSU1FTlRBTCkKKyMKKyMgQ09ORklHX0lQX0RDQ1AgaXMgbm90IHNldAorCisjCisjIFNDVFAgQ29uZmlndXJhdGlvbiAoRVhQRVJJTUVOVEFMKQorIworIyBDT05GSUdfSVBfU0NUUCBpcyBub3Qgc2V0CisKKyMKKyMgVElQQyBDb25maWd1cmF0aW9uIChFWFBFUklNRU5UQUwpCisjCisjIENPTkZJR19USVBDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FUTSBpcyBub3Qgc2V0CisjIENPTkZJR19CUklER0UgaXMgbm90IHNldAorIyBDT05GSUdfVkxBTl84MDIxUSBpcyBub3Qgc2V0CisjIENPTkZJR19ERUNORVQgaXMgbm90IHNldAorIyBDT05GSUdfTExDMiBpcyBub3Qgc2V0CisjIENPTkZJR19JUFggaXMgbm90IHNldAorIyBDT05GSUdfQVRBTEsgaXMgbm90IHNldAorIyBDT05GSUdfWDI1IGlzIG5vdCBzZXQKKyMgQ09ORklHX0xBUEIgaXMgbm90IHNldAorIyBDT05GSUdfRUNPTkVUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1dBTl9ST1VURVIgaXMgbm90IHNldAorCisjCisjIFFvUyBhbmQvb3IgZmFpciBxdWV1ZWluZworIworIyBDT05GSUdfTkVUX1NDSEVEIGlzIG5vdCBzZXQKKworIworIyBOZXR3b3JrIHRlc3RpbmcKKyMKKyMgQ09ORklHX05FVF9QS1RHRU4gaXMgbm90IHNldAorIyBDT05GSUdfSEFNUkFESU8gaXMgbm90IHNldAorIyBDT05GSUdfSVJEQSBpcyBub3Qgc2V0CisjIENPTkZJR19CVCBpcyBub3Qgc2V0CisjIENPTkZJR19JRUVFODAyMTEgaXMgbm90IHNldAorCisjCisjIERldmljZSBEcml2ZXJzCisjCisKKyMKKyMgR2VuZXJpYyBEcml2ZXIgT3B0aW9ucworIworQ09ORklHX1NUQU5EQUxPTkU9eQorQ09ORklHX1BSRVZFTlRfRklSTVdBUkVfQlVJTEQ9eQorIyBDT05GSUdfRldfTE9BREVSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX0RSSVZFUiBpcyBub3Qgc2V0CisjIENPTkZJR19TWVNfSFlQRVJWSVNPUiBpcyBub3Qgc2V0CisKKyMKKyMgQ29ubmVjdG9yIC0gdW5pZmllZCB1c2Vyc3BhY2UgPC0+IGtlcm5lbHNwYWNlIGxpbmtlcgorIworIyBDT05GSUdfQ09OTkVDVE9SIGlzIG5vdCBzZXQKKworIworIyBNZW1vcnkgVGVjaG5vbG9neSBEZXZpY2VzIChNVEQpCisjCitDT05GSUdfTVREPXkKKyMgQ09ORklHX01URF9ERUJVRyBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfQ09OQ0FUIGlzIG5vdCBzZXQKK0NPTkZJR19NVERfUEFSVElUSU9OUz15CisjIENPTkZJR19NVERfUkVEQk9PVF9QQVJUUyBpcyBub3Qgc2V0CitDT05GSUdfTVREX0NNRExJTkVfUEFSVFM9eQorIyBDT05GSUdfTVREX0FGU19QQVJUUyBpcyBub3Qgc2V0CisKKyMKKyMgVXNlciBNb2R1bGVzIEFuZCBUcmFuc2xhdGlvbiBMYXllcnMKKyMKK0NPTkZJR19NVERfQ0hBUj15CitDT05GSUdfTVREX0JMT0NLPXkKKyMgQ09ORklHX0ZUTCBpcyBub3Qgc2V0CisjIENPTkZJR19ORlRMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lORlRMIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JGRF9GVEwgaXMgbm90IHNldAorIyBDT05GSUdfU1NGREMgaXMgbm90IHNldAorCisjCisjIFJBTS9ST00vRmxhc2ggY2hpcCBkcml2ZXJzCisjCitDT05GSUdfTVREX0NGST15CisjIENPTkZJR19NVERfSkVERUNQUk9CRSBpcyBub3Qgc2V0CitDT05GSUdfTVREX0dFTl9QUk9CRT15CisjIENPTkZJR19NVERfQ0ZJX0FEVl9PUFRJT05TIGlzIG5vdCBzZXQKK0NPTkZJR19NVERfTUFQX0JBTktfV0lEVEhfMT15CitDT05GSUdfTVREX01BUF9CQU5LX1dJRFRIXzI9eQorQ09ORklHX01URF9NQVBfQkFOS19XSURUSF80PXkKKyMgQ09ORklHX01URF9NQVBfQkFOS19XSURUSF84IGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9NQVBfQkFOS19XSURUSF8xNiBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfTUFQX0JBTktfV0lEVEhfMzIgaXMgbm90IHNldAorQ09ORklHX01URF9DRklfSTE9eQorQ09ORklHX01URF9DRklfSTI9eQorIyBDT05GSUdfTVREX0NGSV9JNCBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfQ0ZJX0k4IGlzIG5vdCBzZXQKK0NPTkZJR19NVERfQ0ZJX0lOVEVMRVhUPXkKK0NPTkZJR19NVERfQ0ZJX0FNRFNURD15CisjIENPTkZJR19NVERfQ0ZJX1NUQUEgaXMgbm90IHNldAorQ09ORklHX01URF9DRklfVVRJTD15CisjIENPTkZJR19NVERfUkFNIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9ST00gaXMgbm90IHNldAorIyBDT05GSUdfTVREX0FCU0VOVCBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfT0JTT0xFVEVfQ0hJUFMgaXMgbm90IHNldAorCisjCisjIE1hcHBpbmcgZHJpdmVycyBmb3IgY2hpcCBhY2Nlc3MKKyMKKyMgQ09ORklHX01URF9DT01QTEVYX01BUFBJTkdTIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9QSFlTTUFQIGlzIG5vdCBzZXQKK0NPTkZJR19NVERfQVJNX0lOVEVHUkFUT1I9eQorIyBDT05GSUdfTVREX1BMQVRSQU0gaXMgbm90IHNldAorCisjCisjIFNlbGYtY29udGFpbmVkIE1URCBkZXZpY2UgZHJpdmVycworIworIyBDT05GSUdfTVREX1NMUkFNIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9QSFJBTSBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfTVREUkFNIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9CTE9DSzJNVEQgaXMgbm90IHNldAorCisjCisjIERpc2stT24tQ2hpcCBEZXZpY2UgRHJpdmVycworIworIyBDT05GSUdfTVREX0RPQzIwMDAgaXMgbm90IHNldAorIyBDT05GSUdfTVREX0RPQzIwMDEgaXMgbm90IHNldAorIyBDT05GSUdfTVREX0RPQzIwMDFQTFVTIGlzIG5vdCBzZXQKKworIworIyBOQU5EIEZsYXNoIERldmljZSBEcml2ZXJzCisjCisjIENPTkZJR19NVERfTkFORCBpcyBub3Qgc2V0CisKKyMKKyMgT25lTkFORCBGbGFzaCBEZXZpY2UgRHJpdmVycworIworIyBDT05GSUdfTVREX09ORU5BTkQgaXMgbm90IHNldAorCisjCisjIFBhcmFsbGVsIHBvcnQgc3VwcG9ydAorIworIyBDT05GSUdfUEFSUE9SVCBpcyBub3Qgc2V0CisKKyMKKyMgUGx1ZyBhbmQgUGxheSBzdXBwb3J0CisjCisKKyMKKyMgQmxvY2sgZGV2aWNlcworIworIyBDT05GSUdfQkxLX0RFVl9DT1dfQ09NTU9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfTE9PUCBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX05CRCBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX1JBTSBpcyBub3Qgc2V0CitDT05GSUdfQkxLX0RFVl9JTklUUkQ9eQorIyBDT05GSUdfQ0RST01fUEtUQ0RWRCBpcyBub3Qgc2V0CisjIENPTkZJR19BVEFfT1ZFUl9FVEggaXMgbm90IHNldAorCisjCisjIFNDU0kgZGV2aWNlIHN1cHBvcnQKKyMKKyMgQ09ORklHX1JBSURfQVRUUlMgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSSBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX05FVExJTksgaXMgbm90IHNldAorCisjCisjIE11bHRpLWRldmljZSBzdXBwb3J0IChSQUlEIGFuZCBMVk0pCisjCisjIENPTkZJR19NRCBpcyBub3Qgc2V0CisKKyMKKyMgRnVzaW9uIE1QVCBkZXZpY2Ugc3VwcG9ydAorIworIyBDT05GSUdfRlVTSU9OIGlzIG5vdCBzZXQKKworIworIyBJRUVFIDEzOTQgKEZpcmVXaXJlKSBzdXBwb3J0CisjCisKKyMKKyMgSTJPIGRldmljZSBzdXBwb3J0CisjCisKKyMKKyMgTmV0d29yayBkZXZpY2Ugc3VwcG9ydAorIworQ09ORklHX05FVERFVklDRVM9eQorIyBDT05GSUdfRFVNTVkgaXMgbm90IHNldAorIyBDT05GSUdfQk9ORElORyBpcyBub3Qgc2V0CisjIENPTkZJR19FUVVBTElaRVIgaXMgbm90IHNldAorIyBDT05GSUdfVFVOIGlzIG5vdCBzZXQKKworIworIyBQSFkgZGV2aWNlIHN1cHBvcnQKKyMKKyMgQ09ORklHX1BIWUxJQiBpcyBub3Qgc2V0CisKKyMKKyMgRXRoZXJuZXQgKDEwIG9yIDEwME1iaXQpCisjCitDT05GSUdfTkVUX0VUSEVSTkVUPXkKK0NPTkZJR19NSUk9eQorQ09ORklHX1NNQzkxWD15CisjIENPTkZJR19ETTkwMDAgaXMgbm90IHNldAorCisjCisjIEV0aGVybmV0ICgxMDAwIE1iaXQpCisjCisKKyMKKyMgRXRoZXJuZXQgKDEwMDAwIE1iaXQpCisjCisKKyMKKyMgVG9rZW4gUmluZyBkZXZpY2VzCisjCisKKyMKKyMgV2lyZWxlc3MgTEFOIChub24taGFtcmFkaW8pCisjCisjIENPTkZJR19ORVRfUkFESU8gaXMgbm90IHNldAorCisjCisjIFdhbiBpbnRlcmZhY2VzCisjCisjIENPTkZJR19XQU4gaXMgbm90IHNldAorIyBDT05GSUdfUFBQIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NMSVAgaXMgbm90IHNldAorIyBDT05GSUdfU0hBUEVSIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVENPTlNPTEUgaXMgbm90IHNldAorIyBDT05GSUdfTkVUUE9MTCBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfUE9MTF9DT05UUk9MTEVSIGlzIG5vdCBzZXQKKworIworIyBJU0ROIHN1YnN5c3RlbQorIworIyBDT05GSUdfSVNETiBpcyBub3Qgc2V0CisKKyMKKyMgSW5wdXQgZGV2aWNlIHN1cHBvcnQKKyMKK0NPTkZJR19JTlBVVD15CisjIENPTkZJR19JTlBVVF9GRl9NRU1MRVNTIGlzIG5vdCBzZXQKKworIworIyBVc2VybGFuZCBpbnRlcmZhY2VzCisjCitDT05GSUdfSU5QVVRfTU9VU0VERVY9eQorQ09ORklHX0lOUFVUX01PVVNFREVWX1BTQVVYPXkKK0NPTkZJR19JTlBVVF9NT1VTRURFVl9TQ1JFRU5fWD0xMDI0CitDT05GSUdfSU5QVVRfTU9VU0VERVZfU0NSRUVOX1k9NzY4CisjIENPTkZJR19JTlBVVF9KT1lERVYgaXMgbm90IHNldAorIyBDT05GSUdfSU5QVVRfVFNERVYgaXMgbm90IHNldAorIyBDT05GSUdfSU5QVVRfRVZERVYgaXMgbm90IHNldAorIyBDT05GSUdfSU5QVVRfRVZCVUcgaXMgbm90IHNldAorCisjCisjIElucHV0IERldmljZSBEcml2ZXJzCisjCitDT05GSUdfSU5QVVRfS0VZQk9BUkQ9eQorQ09ORklHX0tFWUJPQVJEX0FUS0JEPXkKKyMgQ09ORklHX0tFWUJPQVJEX1NVTktCRCBpcyBub3Qgc2V0CisjIENPTkZJR19LRVlCT0FSRF9MS0tCRCBpcyBub3Qgc2V0CisjIENPTkZJR19LRVlCT0FSRF9YVEtCRCBpcyBub3Qgc2V0CisjIENPTkZJR19LRVlCT0FSRF9ORVdUT04gaXMgbm90IHNldAorIyBDT05GSUdfS0VZQk9BUkRfU1RPV0FXQVkgaXMgbm90IHNldAorQ09ORklHX0lOUFVUX01PVVNFPXkKK0NPTkZJR19NT1VTRV9QUzI9eQorIyBDT05GSUdfTU9VU0VfU0VSSUFMIGlzIG5vdCBzZXQKKyMgQ09ORklHX01PVVNFX1ZTWFhYQUEgaXMgbm90IHNldAorIyBDT05GSUdfSU5QVVRfSk9ZU1RJQ0sgaXMgbm90IHNldAorIyBDT05GSUdfSU5QVVRfVE9VQ0hTQ1JFRU4gaXMgbm90IHNldAorIyBDT05GSUdfSU5QVVRfTUlTQyBpcyBub3Qgc2V0CisKKyMKKyMgSGFyZHdhcmUgSS9PIHBvcnRzCisjCitDT05GSUdfU0VSSU89eQorIyBDT05GSUdfU0VSSU9fU0VSUE9SVCBpcyBub3Qgc2V0CitDT05GSUdfU0VSSU9fQU1CQUtNST15CitDT05GSUdfU0VSSU9fTElCUFMyPXkKKyMgQ09ORklHX1NFUklPX1JBVyBpcyBub3Qgc2V0CisjIENPTkZJR19HQU1FUE9SVCBpcyBub3Qgc2V0CisKKyMKKyMgQ2hhcmFjdGVyIGRldmljZXMKKyMKK0NPTkZJR19WVD15CitDT05GSUdfVlRfQ09OU09MRT15CitDT05GSUdfSFdfQ09OU09MRT15CisjIENPTkZJR19WVF9IV19DT05TT0xFX0JJTkRJTkcgaXMgbm90IHNldAorIyBDT05GSUdfU0VSSUFMX05PTlNUQU5EQVJEIGlzIG5vdCBzZXQKKworIworIyBTZXJpYWwgZHJpdmVycworIworIyBDT05GSUdfU0VSSUFMXzgyNTAgaXMgbm90IHNldAorCisjCisjIE5vbi04MjUwIHNlcmlhbCBwb3J0IHN1cHBvcnQKKyMKKyMgQ09ORklHX1NFUklBTF9BTUJBX1BMMDEwIGlzIG5vdCBzZXQKK0NPTkZJR19TRVJJQUxfQU1CQV9QTDAxMT15CitDT05GSUdfU0VSSUFMX0FNQkFfUEwwMTFfQ09OU09MRT15CitDT05GSUdfU0VSSUFMX0NPUkU9eQorQ09ORklHX1NFUklBTF9DT1JFX0NPTlNPTEU9eQorQ09ORklHX1VOSVg5OF9QVFlTPXkKK0NPTkZJR19MRUdBQ1lfUFRZUz15CitDT05GSUdfTEVHQUNZX1BUWV9DT1VOVD0xNgorCisjCisjIElQTUkKKyMKKyMgQ09ORklHX0lQTUlfSEFORExFUiBpcyBub3Qgc2V0CisKKyMKKyMgV2F0Y2hkb2cgQ2FyZHMKKyMKKyMgQ09ORklHX1dBVENIRE9HIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hXX1JBTkRPTSBpcyBub3Qgc2V0CisjIENPTkZJR19OVlJBTSBpcyBub3Qgc2V0CisjIENPTkZJR19EVExLIGlzIG5vdCBzZXQKKyMgQ09ORklHX1IzOTY0IGlzIG5vdCBzZXQKKworIworIyBGdGFwZSwgdGhlIGZsb3BweSB0YXBlIGRldmljZSBkcml2ZXIKKyMKKyMgQ09ORklHX1JBV19EUklWRVIgaXMgbm90IHNldAorCisjCisjIFRQTSBkZXZpY2VzCisjCisjIENPTkZJR19UQ0dfVFBNIGlzIG5vdCBzZXQKKworIworIyBJMkMgc3VwcG9ydAorIworIyBDT05GSUdfSTJDIGlzIG5vdCBzZXQKKworIworIyBTUEkgc3VwcG9ydAorIworIyBDT05GSUdfU1BJIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NQSV9NQVNURVIgaXMgbm90IHNldAorCisjCisjIERhbGxhcydzIDEtd2lyZSBidXMKKyMKKyMgQ09ORklHX1cxIGlzIG5vdCBzZXQKKworIworIyBIYXJkd2FyZSBNb25pdG9yaW5nIHN1cHBvcnQKKyMKKyMgQ09ORklHX0hXTU9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hXTU9OX1ZJRCBpcyBub3Qgc2V0CisKKyMKKyMgTWlzYyBkZXZpY2VzCisjCisjIENPTkZJR19TR0lfSU9DNCBpcyBub3Qgc2V0CisjIENPTkZJR19USUZNX0NPUkUgaXMgbm90IHNldAorCisjCisjIExFRCBkZXZpY2VzCisjCisjIENPTkZJR19ORVdfTEVEUyBpcyBub3Qgc2V0CisKKyMKKyMgTEVEIGRyaXZlcnMKKyMKKworIworIyBMRUQgVHJpZ2dlcnMKKyMKKworIworIyBNdWx0aW1lZGlhIGRldmljZXMKKyMKKyMgQ09ORklHX1ZJREVPX0RFViBpcyBub3Qgc2V0CisKKyMKKyMgRGlnaXRhbCBWaWRlbyBCcm9hZGNhc3RpbmcgRGV2aWNlcworIworIyBDT05GSUdfRFZCIGlzIG5vdCBzZXQKKworIworIyBHcmFwaGljcyBzdXBwb3J0CisjCisjIENPTkZJR19GSVJNV0FSRV9FRElEIGlzIG5vdCBzZXQKK0NPTkZJR19GQj15CitDT05GSUdfRkJfQ0ZCX0ZJTExSRUNUPXkKK0NPTkZJR19GQl9DRkJfQ09QWUFSRUE9eQorQ09ORklHX0ZCX0NGQl9JTUFHRUJMSVQ9eQorIyBDT05GSUdfRkJfTUFDTU9ERVMgaXMgbm90IHNldAorIyBDT05GSUdfRkJfQkFDS0xJR0hUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZCX01PREVfSEVMUEVSUyBpcyBub3Qgc2V0CisjIENPTkZJR19GQl9USUxFQkxJVFRJTkcgaXMgbm90IHNldAorQ09ORklHX0ZCX0FSTUNMQ0Q9eQorIyBDT05GSUdfRkJfUzFEMTNYWFggaXMgbm90IHNldAorIyBDT05GSUdfRkJfVklSVFVBTCBpcyBub3Qgc2V0CisKKyMKKyMgQ29uc29sZSBkaXNwbGF5IGRyaXZlciBzdXBwb3J0CisjCisjIENPTkZJR19WR0FfQ09OU09MRSBpcyBub3Qgc2V0CitDT05GSUdfRFVNTVlfQ09OU09MRT15CitDT05GSUdfRlJBTUVCVUZGRVJfQ09OU09MRT15CisjIENPTkZJR19GUkFNRUJVRkZFUl9DT05TT0xFX1JPVEFUSU9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZPTlRTIGlzIG5vdCBzZXQKK0NPTkZJR19GT05UXzh4OD15CitDT05GSUdfRk9OVF84eDE2PXkKKworIworIyBMb2dvIGNvbmZpZ3VyYXRpb24KKyMKK0NPTkZJR19MT0dPPXkKKyMgQ09ORklHX0xPR09fTElOVVhfTU9OTyBpcyBub3Qgc2V0CisjIENPTkZJR19MT0dPX0xJTlVYX1ZHQTE2IGlzIG5vdCBzZXQKK0NPTkZJR19MT0dPX0xJTlVYX0NMVVQyMjQ9eQorIyBDT05GSUdfQkFDS0xJR0hUX0xDRF9TVVBQT1JUIGlzIG5vdCBzZXQKKworIworIyBTb3VuZAorIworQ09ORklHX1NPVU5EPXkKKworIworIyBBZHZhbmNlZCBMaW51eCBTb3VuZCBBcmNoaXRlY3R1cmUKKyMKK0NPTkZJR19TTkQ9eQorQ09ORklHX1NORF9USU1FUj15CitDT05GSUdfU05EX1BDTT15CisjIENPTkZJR19TTkRfU0VRVUVOQ0VSIGlzIG5vdCBzZXQKK0NPTkZJR19TTkRfT1NTRU1VTD15CitDT05GSUdfU05EX01JWEVSX09TUz15CitDT05GSUdfU05EX1BDTV9PU1M9eQorQ09ORklHX1NORF9QQ01fT1NTX1BMVUdJTlM9eQorIyBDT05GSUdfU05EX0RZTkFNSUNfTUlOT1JTIGlzIG5vdCBzZXQKK0NPTkZJR19TTkRfU1VQUE9SVF9PTERfQVBJPXkKK0NPTkZJR19TTkRfVkVSQk9TRV9QUk9DRlM9eQorIyBDT05GSUdfU05EX1ZFUkJPU0VfUFJJTlRLIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NORF9ERUJVRyBpcyBub3Qgc2V0CisKKyMKKyMgR2VuZXJpYyBkZXZpY2VzCisjCitDT05GSUdfU05EX0FDOTdfQ09ERUM9bQorQ09ORklHX1NORF9BQzk3X0JVUz1tCisjIENPTkZJR19TTkRfRFVNTVkgaXMgbm90IHNldAorIyBDT05GSUdfU05EX01UUEFWIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NORF9TRVJJQUxfVTE2NTUwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NORF9NUFU0MDEgaXMgbm90IHNldAorCisjCisjIEFMU0EgQVJNIGRldmljZXMKKyMKK0NPTkZJR19TTkRfQVJNQUFDST1tCisKKyMKKyMgT3BlbiBTb3VuZCBTeXN0ZW0KKyMKKyMgQ09ORklHX1NPVU5EX1BSSU1FIGlzIG5vdCBzZXQKKworIworIyBVU0Igc3VwcG9ydAorIworQ09ORklHX1VTQl9BUkNIX0hBU19IQ0Q9eQorIyBDT05GSUdfVVNCX0FSQ0hfSEFTX09IQ0kgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0FSQ0hfSEFTX0VIQ0kgaXMgbm90IHNldAorIyBDT05GSUdfVVNCIGlzIG5vdCBzZXQKKworIworIyBOT1RFOiBVU0JfU1RPUkFHRSBlbmFibGVzIFNDU0ksIGFuZCAnU0NTSSBkaXNrIHN1cHBvcnQnCisjCisKKyMKKyMgVVNCIEdhZGdldCBTdXBwb3J0CisjCisjIENPTkZJR19VU0JfR0FER0VUIGlzIG5vdCBzZXQKKworIworIyBNTUMvU0QgQ2FyZCBzdXBwb3J0CisjCitDT05GSUdfTU1DPXkKKyMgQ09ORklHX01NQ19ERUJVRyBpcyBub3Qgc2V0CitDT05GSUdfTU1DX0JMT0NLPXkKK0NPTkZJR19NTUNfQVJNTU1DST15CisjIENPTkZJR19NTUNfVElGTV9TRCBpcyBub3Qgc2V0CisKKyMKKyMgUmVhbCBUaW1lIENsb2NrCisjCitDT05GSUdfUlRDX0xJQj15CitDT05GSUdfUlRDX0NMQVNTPXkKK0NPTkZJR19SVENfSENUT1NZUz15CitDT05GSUdfUlRDX0hDVE9TWVNfREVWSUNFPSJydGMwIgorIyBDT05GSUdfUlRDX0RFQlVHIGlzIG5vdCBzZXQKKworIworIyBSVEMgaW50ZXJmYWNlcworIworQ09ORklHX1JUQ19JTlRGX1NZU0ZTPXkKK0NPTkZJR19SVENfSU5URl9QUk9DPXkKK0NPTkZJR19SVENfSU5URl9ERVY9eQorQ09ORklHX1JUQ19JTlRGX0RFVl9VSUVfRU1VTD15CisKKyMKKyMgUlRDIGRyaXZlcnMKKyMKKyMgQ09ORklHX1JUQ19EUlZfRFMxNTUzIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQ19EUlZfRFMxNzQyIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQ19EUlZfTTQ4VDg2IGlzIG5vdCBzZXQKK0NPTkZJR19SVENfRFJWX1BMMDMxPXkKKyMgQ09ORklHX1JUQ19EUlZfVEVTVCBpcyBub3Qgc2V0CisjIENPTkZJR19SVENfRFJWX1YzMDIwIGlzIG5vdCBzZXQKKworIworIyBGaWxlIHN5c3RlbXMKKyMKK0NPTkZJR19FWFQyX0ZTPXkKKyMgQ09ORklHX0VYVDJfRlNfWEFUVFIgaXMgbm90IHNldAorIyBDT05GSUdfRVhUMl9GU19YSVAgaXMgbm90IHNldAorIyBDT05GSUdfRVhUM19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19FWFQ0REVWX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JFSVNFUkZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0pGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19GU19QT1NJWF9BQ0wgaXMgbm90IHNldAorIyBDT05GSUdfWEZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0dGUzJfRlMgaXMgbm90IHNldAorIyBDT05GSUdfT0NGUzJfRlMgaXMgbm90IHNldAorIyBDT05GSUdfTUlOSVhfRlMgaXMgbm90IHNldAorIyBDT05GSUdfUk9NRlNfRlMgaXMgbm90IHNldAorQ09ORklHX0lOT1RJRlk9eQorIyBDT05GSUdfSU5PVElGWV9VU0VSIGlzIG5vdCBzZXQKKyMgQ09ORklHX1FVT1RBIGlzIG5vdCBzZXQKK0NPTkZJR19ETk9USUZZPXkKKyMgQ09ORklHX0FVVE9GU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19BVVRPRlM0X0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZVU0VfRlMgaXMgbm90IHNldAorCisjCisjIENELVJPTS9EVkQgRmlsZXN5c3RlbXMKKyMKKyMgQ09ORklHX0lTTzk2NjBfRlMgaXMgbm90IHNldAorIyBDT05GSUdfVURGX0ZTIGlzIG5vdCBzZXQKKworIworIyBET1MvRkFUL05UIEZpbGVzeXN0ZW1zCisjCitDT05GSUdfRkFUX0ZTPXkKKyMgQ09ORklHX01TRE9TX0ZTIGlzIG5vdCBzZXQKK0NPTkZJR19WRkFUX0ZTPXkKK0NPTkZJR19GQVRfREVGQVVMVF9DT0RFUEFHRT00MzcKK0NPTkZJR19GQVRfREVGQVVMVF9JT0NIQVJTRVQ9Imlzbzg4NTktMSIKKyMgQ09ORklHX05URlNfRlMgaXMgbm90IHNldAorCisjCisjIFBzZXVkbyBmaWxlc3lzdGVtcworIworQ09ORklHX1BST0NfRlM9eQorQ09ORklHX1BST0NfU1lTQ1RMPXkKK0NPTkZJR19TWVNGUz15CitDT05GSUdfVE1QRlM9eQorIyBDT05GSUdfVE1QRlNfUE9TSVhfQUNMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hVR0VUTEJfUEFHRSBpcyBub3Qgc2V0CitDT05GSUdfUkFNRlM9eQorIyBDT05GSUdfQ09ORklHRlNfRlMgaXMgbm90IHNldAorCisjCisjIE1pc2NlbGxhbmVvdXMgZmlsZXN5c3RlbXMKKyMKKyMgQ09ORklHX0FERlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQUZGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19IRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfSEZTUExVU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19CRUZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19FRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfSkZGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19KRkZTMl9GUyBpcyBub3Qgc2V0CitDT05GSUdfQ1JBTUZTPXkKKyMgQ09ORklHX1ZYRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfSFBGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19RTlg0RlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfU1lTVl9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19VRlNfRlMgaXMgbm90IHNldAorCisjCisjIE5ldHdvcmsgRmlsZSBTeXN0ZW1zCisjCitDT05GSUdfTkZTX0ZTPXkKK0NPTkZJR19ORlNfVjM9eQorIyBDT05GSUdfTkZTX1YzX0FDTCBpcyBub3Qgc2V0CisjIENPTkZJR19ORlNfVjQgaXMgbm90IHNldAorIyBDT05GSUdfTkZTX0RJUkVDVElPIGlzIG5vdCBzZXQKKyMgQ09ORklHX05GU0QgaXMgbm90IHNldAorQ09ORklHX1JPT1RfTkZTPXkKK0NPTkZJR19MT0NLRD15CitDT05GSUdfTE9DS0RfVjQ9eQorQ09ORklHX05GU19DT01NT049eQorQ09ORklHX1NVTlJQQz15CisjIENPTkZJR19SUENTRUNfR1NTX0tSQjUgaXMgbm90IHNldAorIyBDT05GSUdfUlBDU0VDX0dTU19TUEtNMyBpcyBub3Qgc2V0CisjIENPTkZJR19TTUJfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQ0lGUyBpcyBub3Qgc2V0CisjIENPTkZJR19OQ1BfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQ09EQV9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19BRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfOVBfRlMgaXMgbm90IHNldAorCisjCisjIFBhcnRpdGlvbiBUeXBlcworIworIyBDT05GSUdfUEFSVElUSU9OX0FEVkFOQ0VEIGlzIG5vdCBzZXQKK0NPTkZJR19NU0RPU19QQVJUSVRJT049eQorCisjCisjIE5hdGl2ZSBMYW5ndWFnZSBTdXBwb3J0CisjCitDT05GSUdfTkxTPXkKK0NPTkZJR19OTFNfREVGQVVMVD0iaXNvODg1OS0xIgorQ09ORklHX05MU19DT0RFUEFHRV80Mzc9eQorIyBDT05GSUdfTkxTX0NPREVQQUdFXzczNyBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfNzc1IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV84NTAgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzg1MiBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfODU1IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV84NTcgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzg2MCBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfODYxIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV84NjIgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzg2MyBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfODY0IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV84NjUgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzg2NiBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfODY5IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV85MzYgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzk1MCBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfOTMyIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV85NDkgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzg3NCBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfSVNPODg1OV84IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV8xMjUwIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV8xMjUxIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19BU0NJSSBpcyBub3Qgc2V0CitDT05GSUdfTkxTX0lTTzg4NTlfMT15CisjIENPTkZJR19OTFNfSVNPODg1OV8yIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19JU084ODU5XzMgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0lTTzg4NTlfNCBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfSVNPODg1OV81IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19JU084ODU5XzYgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0lTTzg4NTlfNyBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfSVNPODg1OV85IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19JU084ODU5XzEzIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19JU084ODU5XzE0IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19JU084ODU5XzE1IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19LT0k4X1IgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0tPSThfVSBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfVVRGOCBpcyBub3Qgc2V0CisKKyMKKyMgUHJvZmlsaW5nIHN1cHBvcnQKKyMKKyMgQ09ORklHX1BST0ZJTElORyBpcyBub3Qgc2V0CisKKyMKKyMgS2VybmVsIGhhY2tpbmcKKyMKKyMgQ09ORklHX1BSSU5US19USU1FIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VOQUJMRV9NVVNUX0NIRUNLIGlzIG5vdCBzZXQKK0NPTkZJR19NQUdJQ19TWVNSUT15CisjIENPTkZJR19VTlVTRURfU1lNQk9MUyBpcyBub3Qgc2V0CitDT05GSUdfREVCVUdfS0VSTkVMPXkKK0NPTkZJR19MT0dfQlVGX1NISUZUPTE0CitDT05GSUdfREVURUNUX1NPRlRMT0NLVVA9eQorIyBDT05GSUdfU0NIRURTVEFUUyBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19TTEFCIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX1JUX01VVEVYRVMgaXMgbm90IHNldAorIyBDT05GSUdfUlRfTVVURVhfVEVTVEVSIGlzIG5vdCBzZXQKK0NPTkZJR19ERUJVR19TUElOTE9DSz15CitDT05GSUdfREVCVUdfTVVURVhFUz15CitDT05GSUdfREVCVUdfUldTRU1TPXkKKyMgQ09ORklHX0RFQlVHX1NQSU5MT0NLX1NMRUVQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX0xPQ0tJTkdfQVBJX1NFTEZURVNUUyBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19LT0JKRUNUIGlzIG5vdCBzZXQKK0NPTkZJR19ERUJVR19CVUdWRVJCT1NFPXkKKyMgQ09ORklHX0RFQlVHX0lORk8gaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfRlMgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfVk0gaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfTElTVCBpcyBub3Qgc2V0CitDT05GSUdfRlJBTUVfUE9JTlRFUj15CisjIENPTkZJR19VTldJTkRfSU5GTyBpcyBub3Qgc2V0CitDT05GSUdfRk9SQ0VEX0lOTElOSU5HPXkKKyMgQ09ORklHX0hFQURFUlNfQ0hFQ0sgaXMgbm90IHNldAorIyBDT05GSUdfUkNVX1RPUlRVUkVfVEVTVCBpcyBub3Qgc2V0CitDT05GSUdfREVCVUdfVVNFUj15CisjIENPTkZJR19ERUJVR19XQUlUUSBpcyBub3Qgc2V0CitDT05GSUdfREVCVUdfRVJST1JTPXkKK0NPTkZJR19ERUJVR19MTD15CisjIENPTkZJR19ERUJVR19JQ0VEQ0MgaXMgbm90IHNldAorCisjCisjIFNlY3VyaXR5IG9wdGlvbnMKKyMKKyMgQ09ORklHX0tFWVMgaXMgbm90IHNldAorIyBDT05GSUdfU0VDVVJJVFkgaXMgbm90IHNldAorCisjCisjIENyeXB0b2dyYXBoaWMgb3B0aW9ucworIworIyBDT05GSUdfQ1JZUFRPIGlzIG5vdCBzZXQKKworIworIyBMaWJyYXJ5IHJvdXRpbmVzCisjCisjIENPTkZJR19DUkNfQ0NJVFQgaXMgbm90IHNldAorIyBDT05GSUdfQ1JDMTYgaXMgbm90IHNldAorQ09ORklHX0NSQzMyPXkKKyMgQ09ORklHX0xJQkNSQzMyQyBpcyBub3Qgc2V0CitDT05GSUdfWkxJQl9JTkZMQVRFPXkKK0NPTkZJR19QTElTVD15CmRpZmYgLS1naXQgYS9hcmNoL2FybS9jb25maWdzL3MzYzI0MTBfZGVmY29uZmlnIGIvYXJjaC9hcm0vY29uZmlncy9zM2MyNDEwX2RlZmNvbmZpZwppbmRleCBhODMyMjI2Li5jMDE1MjM5MyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vY29uZmlncy9zM2MyNDEwX2RlZmNvbmZpZworKysgYi9hcmNoL2FybS9jb25maWdzL3MzYzI0MTBfZGVmY29uZmlnCkBAIC0xLDkgKzEsMTAgQEAKICMKICMgQXV0b21hdGljYWxseSBnZW5lcmF0ZWQgbWFrZSBjb25maWc6IGRvbid0IGVkaXQKLSMgTGludXgga2VybmVsIHZlcnNpb246IDIuNi4xOAotIyBXZWQgU2VwIDIwIDIwOjI3OjMxIDIwMDYKKyMgTGludXgga2VybmVsIHZlcnNpb246IDIuNi4xOS1yYzQKKyMgRnJpIE5vdiAgMyAxNzo0MTozMSAyMDA2CiAjCiBDT05GSUdfQVJNPXkKKyMgQ09ORklHX0dFTkVSSUNfVElNRSBpcyBub3Qgc2V0CiBDT05GSUdfTU1VPXkKIENPTkZJR19HRU5FUklDX0hBUkRJUlFTPXkKIENPTkZJR19UUkFDRV9JUlFGTEFHU19TVVBQT1JUPXkKQEAgLTI5LDE3ICszMCwyMCBAQAogQ09ORklHX0xPQ0FMVkVSU0lPTl9BVVRPPXkKIENPTkZJR19TV0FQPXkKIENPTkZJR19TWVNWSVBDPXkKKyMgQ09ORklHX0lQQ19OUyBpcyBub3Qgc2V0CiAjIENPTkZJR19QT1NJWF9NUVVFVUUgaXMgbm90IHNldAogIyBDT05GSUdfQlNEX1BST0NFU1NfQUNDVCBpcyBub3Qgc2V0CiAjIENPTkZJR19UQVNLU1RBVFMgaXMgbm90IHNldAorIyBDT05GSUdfVVRTX05TIGlzIG5vdCBzZXQKICMgQ09ORklHX0FVRElUIGlzIG5vdCBzZXQKICMgQ09ORklHX0lLQ09ORklHIGlzIG5vdCBzZXQKICMgQ09ORklHX1JFTEFZIGlzIG5vdCBzZXQKIENPTkZJR19JTklUUkFNRlNfU09VUkNFPSIiCiBDT05GSUdfQ0NfT1BUSU1JWkVfRk9SX1NJWkU9eQorQ09ORklHX1NZU0NUTD15CiAjIENPTkZJR19FTUJFRERFRCBpcyBub3Qgc2V0CiBDT05GSUdfVUlEMTY9eQotQ09ORklHX1NZU0NUTD15CisjIENPTkZJR19TWVNDVExfU1lTQ0FMTCBpcyBub3Qgc2V0CiBDT05GSUdfS0FMTFNZTVM9eQogIyBDT05GSUdfS0FMTFNZTVNfQUxMIGlzIG5vdCBzZXQKICMgQ09ORklHX0tBTExTWU1TX0VYVFJBX1BBU1MgaXMgbm90IHNldApAQCAtNjIsNyArNjYsOCBAQAogIyBMb2FkYWJsZSBtb2R1bGUgc3VwcG9ydAogIwogQ09ORklHX01PRFVMRVM9eQotIyBDT05GSUdfTU9EVUxFX1VOTE9BRCBpcyBub3Qgc2V0CitDT05GSUdfTU9EVUxFX1VOTE9BRD15CisjIENPTkZJR19NT0RVTEVfRk9SQ0VfVU5MT0FEIGlzIG5vdCBzZXQKICMgQ09ORklHX01PRFZFUlNJT05TIGlzIG5vdCBzZXQKICMgQ09ORklHX01PRFVMRV9TUkNWRVJTSU9OX0FMTCBpcyBub3Qgc2V0CiBDT05GSUdfS01PRD15CkBAIC03MCw2ICs3NSw3IEBACiAjCiAjIEJsb2NrIGxheWVyCiAjCitDT05GSUdfQkxPQ0s9eQogIyBDT05GSUdfQkxLX0RFVl9JT19UUkFDRSBpcyBub3Qgc2V0CiAKICMKQEAgLTEyMCw2ICsxMjYsNyBAQAogIwogIyBTM0MyNFhYIEltcGxlbWVudGF0aW9ucwogIworIyBDT05GSUdfTUFDSF9BTUxfTTU5MDAgaXMgbm90IHNldAogQ09ORklHX01BQ0hfQU5VQklTPXkKIENPTkZJR19NQUNIX09TSVJJUz15CiBDT05GSUdfQVJDSF9CQVNUPXkKQEAgLTE3OCw2ICsxODUsOCBAQAogQ09ORklHX0NQVV9DQUNIRV9WSVZUPXkKIENPTkZJR19DUFVfQ09QWV9WNFdCPXkKIENPTkZJR19DUFVfVExCX1Y0V0JJPXkKK0NPTkZJR19DUFVfQ1AxNT15CitDT05GSUdfQ1BVX0NQMTVfTU1VPXkKIAogIwogIyBQcm9jZXNzb3IgRmVhdHVyZXMKQEAgLTI0OSw4ICsyNTgsOSBAQAogIyBQb3dlciBtYW5hZ2VtZW50IG9wdGlvbnMKICMKIENPTkZJR19QTT15Ci1DT05GSUdfUE1fTEVHQUNZPXkKKyMgQ09ORklHX1BNX0xFR0FDWSBpcyBub3Qgc2V0CiAjIENPTkZJR19QTV9ERUJVRyBpcyBub3Qgc2V0CisjIENPTkZJR19QTV9TWVNGU19ERVBSRUNBVEVEIGlzIG5vdCBzZXQKIENPTkZJR19BUE09eQogCiAjCkBAIC0yNjYsNiArMjc2LDcgQEAKIENPTkZJR19VTklYPXkKIENPTkZJR19YRlJNPXkKICMgQ09ORklHX1hGUk1fVVNFUiBpcyBub3Qgc2V0CisjIENPTkZJR19YRlJNX1NVQl9QT0xJQ1kgaXMgbm90IHNldAogIyBDT05GSUdfTkVUX0tFWSBpcyBub3Qgc2V0CiBDT05GSUdfSU5FVD15CiAjIENPTkZJR19JUF9NVUxUSUNBU1QgaXMgbm90IHNldApAQCAtMjg2LDEwICsyOTcsMTIgQEAKICMgQ09ORklHX0lORVRfVFVOTkVMIGlzIG5vdCBzZXQKIENPTkZJR19JTkVUX1hGUk1fTU9ERV9UUkFOU1BPUlQ9eQogQ09ORklHX0lORVRfWEZSTV9NT0RFX1RVTk5FTD15CitDT05GSUdfSU5FVF9YRlJNX01PREVfQkVFVD15CiBDT05GSUdfSU5FVF9ESUFHPXkKIENPTkZJR19JTkVUX1RDUF9ESUFHPXkKICMgQ09ORklHX1RDUF9DT05HX0FEVkFOQ0VEIGlzIG5vdCBzZXQKLUNPTkZJR19UQ1BfQ09OR19CSUM9eQorQ09ORklHX1RDUF9DT05HX0NVQklDPXkKK0NPTkZJR19ERUZBVUxUX1RDUF9DT05HPSJjdWJpYyIKICMgQ09ORklHX0lQVjYgaXMgbm90IHNldAogIyBDT05GSUdfSU5FVDZfWEZSTV9UVU5ORUwgaXMgbm90IHNldAogIyBDT05GSUdfSU5FVDZfVFVOTkVMIGlzIG5vdCBzZXQKQEAgLTM3Nyw2ICszOTAsNyBAQAogIyBDT05GSUdfTkZUTCBpcyBub3Qgc2V0CiAjIENPTkZJR19JTkZUTCBpcyBub3Qgc2V0CiAjIENPTkZJR19SRkRfRlRMIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NTRkRDIGlzIG5vdCBzZXQKIAogIwogIyBSQU0vUk9NL0ZsYXNoIGNoaXAgZHJpdmVycwpAQCAtNDE4LDYgKzQzMiw4IEBACiAjCiAjIFNlbGYtY29udGFpbmVkIE1URCBkZXZpY2UgZHJpdmVycwogIworIyBDT05GSUdfTVREX0RBVEFGTEFTSCBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfTTI1UDgwIGlzIG5vdCBzZXQKICMgQ09ORklHX01URF9TTFJBTSBpcyBub3Qgc2V0CiAjIENPTkZJR19NVERfUEhSQU0gaXMgbm90IHNldAogIyBDT05GSUdfTVREX01URFJBTSBpcyBub3Qgc2V0CkBAIC01MTIsNiArNTI4LDcgQEAKICMKICMgQ09ORklHX1JBSURfQVRUUlMgaXMgbm90IHNldAogIyBDT05GSUdfU0NTSSBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX05FVExJTksgaXMgbm90IHNldAogCiAjCiAjIE11bHRpLWRldmljZSBzdXBwb3J0IChSQUlEIGFuZCBMVk0pCkBAIC02MDYsNiArNjIzLDcgQEAKICMgSW5wdXQgZGV2aWNlIHN1cHBvcnQKICMKIENPTkZJR19JTlBVVD15CisjIENPTkZJR19JTlBVVF9GRl9NRU1MRVNTIGlzIG5vdCBzZXQKIAogIwogIyBVc2VybGFuZCBpbnRlcmZhY2VzCkBAIC02MjgsNiArNjQ2LDcgQEAKICMgQ09ORklHX0tFWUJPQVJEX0xLS0JEIGlzIG5vdCBzZXQKICMgQ09ORklHX0tFWUJPQVJEX1hUS0JEIGlzIG5vdCBzZXQKICMgQ09ORklHX0tFWUJPQVJEX05FV1RPTiBpcyBub3Qgc2V0CisjIENPTkZJR19LRVlCT0FSRF9TVE9XQVdBWSBpcyBub3Qgc2V0CiBDT05GSUdfSU5QVVRfTU9VU0U9eQogQ09ORklHX01PVVNFX1BTMj15CiAjIENPTkZJR19NT1VTRV9TRVJJQUwgaXMgbm90IHNldApAQCAtNzM0LDcgKzc1Myw2IEBACiAjIENPTkZJR19VU0JQQ1dBVENIRE9HIGlzIG5vdCBzZXQKIENPTkZJR19IV19SQU5ET009eQogIyBDT05GSUdfTlZSQU0gaXMgbm90IHNldAotQ09ORklHX1MzQzI0MTBfUlRDPXkKICMgQ09ORklHX0RUTEsgaXMgbm90IHNldAogIyBDT05GSUdfUjM5NjQgaXMgbm90IHNldAogCkBAIC03NDcsNyArNzY1LDYgQEAKICMgVFBNIGRldmljZXMKICMKICMgQ09ORklHX1RDR19UUE0gaXMgbm90IHNldAotIyBDT05GSUdfVEVMQ0xPQ0sgaXMgbm90IHNldAogCiAjCiAjIEkyQyBzdXBwb3J0CkBAIC03OTIsMTIgKzgwOSwyNiBAQAogIwogIyBTUEkgc3VwcG9ydAogIwotIyBDT05GSUdfU1BJIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NQSV9NQVNURVIgaXMgbm90IHNldAorQ09ORklHX1NQST15CisjIENPTkZJR19TUElfREVCVUcgaXMgbm90IHNldAorQ09ORklHX1NQSV9NQVNURVI9eQorCisjCisjIFNQSSBNYXN0ZXIgQ29udHJvbGxlciBEcml2ZXJzCisjCitDT05GSUdfU1BJX0JJVEJBTkc9bQorIyBDT05GSUdfU1BJX0JVVFRFUkZMWSBpcyBub3Qgc2V0CitDT05GSUdfU1BJX1MzQzI0WFhfR1BJTz1tCitDT05GSUdfU1BJX1MzQzI0WFg9bQorCisjCisjIFNQSSBQcm90b2NvbCBNYXN0ZXJzCisjCiAKICMKICMgRGFsbGFzJ3MgMS13aXJlIGJ1cwogIworIyBDT05GSUdfVzEgaXMgbm90IHNldAogCiAjCiAjIEhhcmR3YXJlIE1vbml0b3Jpbmcgc3VwcG9ydApAQCAtODIwLDYgKzg1MSw3IEBACiAjIENPTkZJR19TRU5TT1JTX0dMNTIwU00gaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19JVDg3IGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfTE02MyBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0xNNzAgaXMgbm90IHNldAogQ09ORklHX1NFTlNPUlNfTE03NT1tCiAjIENPTkZJR19TRU5TT1JTX0xNNzcgaXMgbm90IHNldAogQ09ORklHX1NFTlNPUlNfTE03OD1tCkBAIC04MzQsNiArODY2LDcgQEAKICMgQ09ORklHX1NFTlNPUlNfU01TQzQ3TTEgaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19TTVNDNDdNMTkyIGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfU01TQzQ3QjM5NyBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX1ZUMTIxMSBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX1c4Mzc4MUQgaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19XODM3OTFEIGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfVzgzNzkyRCBpcyBub3Qgc2V0CkBAIC04NDUsMjUgKzg3OCwzMSBAQAogIwogIyBNaXNjIGRldmljZXMKICMKKyMgQ09ORklHX1RJRk1fQ09SRSBpcyBub3Qgc2V0CiAKICMKICMgTEVEIGRldmljZXMKICMKLSMgQ09ORklHX05FV19MRURTIGlzIG5vdCBzZXQKK0NPTkZJR19ORVdfTEVEUz15CitDT05GSUdfTEVEU19DTEFTUz1tCiAKICMKICMgTEVEIGRyaXZlcnMKICMKK0NPTkZJR19MRURTX1MzQzI0WFg9bQogCiAjCiAjIExFRCBUcmlnZ2VycwogIworQ09ORklHX0xFRFNfVFJJR0dFUlM9eQorQ09ORklHX0xFRFNfVFJJR0dFUl9USU1FUj1tCisjIENPTkZJR19MRURTX1RSSUdHRVJfSURFX0RJU0sgaXMgbm90IHNldAorQ09ORklHX0xFRFNfVFJJR0dFUl9IRUFSVEJFQVQ9bQogCiAjCiAjIE11bHRpbWVkaWEgZGV2aWNlcwogIwogIyBDT05GSUdfVklERU9fREVWIGlzIG5vdCBzZXQKLUNPTkZJR19WSURFT19WNEwyPXkKIAogIwogIyBEaWdpdGFsIFZpZGVvIEJyb2FkY2FzdGluZyBEZXZpY2VzCkBAIC04NzYsNiArOTE1LDcgQEAKICMKIENPTkZJR19GSVJNV0FSRV9FRElEPXkKIENPTkZJR19GQj15CisjIENPTkZJR19GQl9EREMgaXMgbm90IHNldAogQ09ORklHX0ZCX0NGQl9GSUxMUkVDVD15CiBDT05GSUdfRkJfQ0ZCX0NPUFlBUkVBPXkKIENPTkZJR19GQl9DRkJfSU1BR0VCTElUPXkKQEAgLTk1MSw3ICs5OTEsNiBAQAogIwogIyBtYXkgYWxzbyBiZSBuZWVkZWQ7IHNlZSBVU0JfU1RPUkFHRSBIZWxwIGZvciBtb3JlIGluZm9ybWF0aW9uCiAjCi0jIENPTkZJR19VU0JfU1RPUkFHRSBpcyBub3Qgc2V0CiAjIENPTkZJR19VU0JfTElCVVNVQUwgaXMgbm90IHNldAogCiAjCkBAIC0xMDA3LDYgKzEwNDYsNyBAQAogIwogIyBDT05GSUdfVVNCX0VNSTYyIGlzIG5vdCBzZXQKICMgQ09ORklHX1VTQl9FTUkyNiBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfQURVVFVYIGlzIG5vdCBzZXQKICMgQ09ORklHX1VTQl9BVUVSU1dBTEQgaXMgbm90IHNldAogIyBDT05GSUdfVVNCX1JJTzUwMCBpcyBub3Qgc2V0CiAjIENPTkZJR19VU0JfTEVHT1RPV0VSIGlzIG5vdCBzZXQKQEAgLTEwMTQsMTEgKzEwNTQsMTIgQEAKICMgQ09ORklHX1VTQl9MRUQgaXMgbm90IHNldAogIyBDT05GSUdfVVNCX0NZUFJFU1NfQ1k3QzYzIGlzIG5vdCBzZXQKICMgQ09ORklHX1VTQl9DWVRIRVJNIGlzIG5vdCBzZXQKLSMgQ09ORklHX1VTQl9QSElER0VUS0lUIGlzIG5vdCBzZXQKLSMgQ09ORklHX1VTQl9QSElER0VUU0VSVk8gaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1BISURHRVQgaXMgbm90IHNldAogIyBDT05GSUdfVVNCX0lETU9VU0UgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0ZURElfRUxBTiBpcyBub3Qgc2V0CiAjIENPTkZJR19VU0JfQVBQTEVESVNQTEFZIGlzIG5vdCBzZXQKICMgQ09ORklHX1VTQl9MRCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfVFJBTkNFVklCUkFUT1IgaXMgbm90IHNldAogIyBDT05GSUdfVVNCX1RFU1QgaXMgbm90IHNldAogCiAjCkBAIC0xMDM5LDcgKzEwODAsMzcgQEAKICMgUmVhbCBUaW1lIENsb2NrCiAjCiBDT05GSUdfUlRDX0xJQj15Ci0jIENPTkZJR19SVENfQ0xBU1MgaXMgbm90IHNldAorQ09ORklHX1JUQ19DTEFTUz15CitDT05GSUdfUlRDX0hDVE9TWVM9eQorQ09ORklHX1JUQ19IQ1RPU1lTX0RFVklDRT0icnRjMCIKKyMgQ09ORklHX1JUQ19ERUJVRyBpcyBub3Qgc2V0CisKKyMKKyMgUlRDIGludGVyZmFjZXMKKyMKK0NPTkZJR19SVENfSU5URl9TWVNGUz15CitDT05GSUdfUlRDX0lOVEZfUFJPQz15CitDT05GSUdfUlRDX0lOVEZfREVWPXkKKyMgQ09ORklHX1JUQ19JTlRGX0RFVl9VSUVfRU1VTCBpcyBub3Qgc2V0CisKKyMKKyMgUlRDIGRyaXZlcnMKKyMKKyMgQ09ORklHX1JUQ19EUlZfWDEyMDUgaXMgbm90IHNldAorIyBDT05GSUdfUlRDX0RSVl9EUzEzMDcgaXMgbm90IHNldAorIyBDT05GSUdfUlRDX0RSVl9EUzE1NTMgaXMgbm90IHNldAorIyBDT05GSUdfUlRDX0RSVl9JU0wxMjA4IGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQ19EUlZfRFMxNjcyIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQ19EUlZfRFMxNzQyIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQ19EUlZfUENGODU2MyBpcyBub3Qgc2V0CisjIENPTkZJR19SVENfRFJWX1BDRjg1ODMgaXMgbm90IHNldAorIyBDT05GSUdfUlRDX0RSVl9SUzVDMzQ4IGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQ19EUlZfUlM1QzM3MiBpcyBub3Qgc2V0CitDT05GSUdfUlRDX0RSVl9TM0M9eQorIyBDT05GSUdfUlRDX0RSVl9NNDhUODYgaXMgbm90IHNldAorIyBDT05GSUdfUlRDX0RSVl9URVNUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQ19EUlZfTUFYNjkwMiBpcyBub3Qgc2V0CisjIENPTkZJR19SVENfRFJWX1YzMDIwIGlzIG5vdCBzZXQKIAogIwogIyBGaWxlIHN5c3RlbXMKQEAgLTEwNTEsNiArMTEyMiw3IEBACiBDT05GSUdfRVhUM19GU19YQVRUUj15CiAjIENPTkZJR19FWFQzX0ZTX1BPU0lYX0FDTCBpcyBub3Qgc2V0CiAjIENPTkZJR19FWFQzX0ZTX1NFQ1VSSVRZIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VYVDRERVZfRlMgaXMgbm90IHNldAogQ09ORklHX0pCRD15CiAjIENPTkZJR19KQkRfREVCVUcgaXMgbm90IHNldAogQ09ORklHX0ZTX01CQ0FDSEU9eQpAQCAtMTA1OCw2ICsxMTMwLDcgQEAKICMgQ09ORklHX0pGU19GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19GU19QT1NJWF9BQ0wgaXMgbm90IHNldAogIyBDT05GSUdfWEZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0dGUzJfRlMgaXMgbm90IHNldAogIyBDT05GSUdfT0NGUzJfRlMgaXMgbm90IHNldAogIyBDT05GSUdfTUlOSVhfRlMgaXMgbm90IHNldAogQ09ORklHX1JPTUZTX0ZTPXkKQEAgLTEwODksNiArMTE2Miw3IEBACiAjIFBzZXVkbyBmaWxlc3lzdGVtcwogIwogQ09ORklHX1BST0NfRlM9eQorQ09ORklHX1BST0NfU1lTQ1RMPXkKIENPTkZJR19TWVNGUz15CiAjIENPTkZJR19UTVBGUyBpcyBub3Qgc2V0CiAjIENPTkZJR19IVUdFVExCX1BBR0UgaXMgbm90IHNldApAQCAtMTIxOSw2ICsxMjkzLDcgQEAKICMgS2VybmVsIGhhY2tpbmcKICMKICMgQ09ORklHX1BSSU5US19USU1FIGlzIG5vdCBzZXQKK0NPTkZJR19FTkFCTEVfTVVTVF9DSEVDSz15CiBDT05GSUdfTUFHSUNfU1lTUlE9eQogIyBDT05GSUdfVU5VU0VEX1NZTUJPTFMgaXMgbm90IHNldAogQ09ORklHX0RFQlVHX0tFUk5FTD15CkBAIC0xMjM4LDkgKzEzMTMsMTAgQEAKIENPTkZJR19ERUJVR19JTkZPPXkKICMgQ09ORklHX0RFQlVHX0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX0RFQlVHX1ZNIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX0xJU1QgaXMgbm90IHNldAogQ09ORklHX0ZSQU1FX1BPSU5URVI9eQotIyBDT05GSUdfVU5XSU5EX0lORk8gaXMgbm90IHNldAogQ09ORklHX0ZPUkNFRF9JTkxJTklORz15CisjIENPTkZJR19IRUFERVJTX0NIRUNLIGlzIG5vdCBzZXQKICMgQ09ORklHX1JDVV9UT1JUVVJFX1RFU1QgaXMgbm90IHNldAogQ09ORklHX0RFQlVHX1VTRVI9eQogIyBDT05GSUdfREVCVUdfV0FJVFEgaXMgbm90IHNldApAQCAtMTI2MiwxMCArMTMzOCw2IEBACiAjIENPTkZJR19DUllQVE8gaXMgbm90IHNldAogCiAjCi0jIEhhcmR3YXJlIGNyeXB0byBkZXZpY2VzCi0jCi0KLSMKICMgTGlicmFyeSByb3V0aW5lcwogIwogIyBDT05GSUdfQ1JDX0NDSVRUIGlzIG5vdCBzZXQKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2NvbmZpZ3Mvc21kazI0MTBfZGVmY29uZmlnIGIvYXJjaC9hcm0vY29uZmlncy9zbWRrMjQxMF9kZWZjb25maWcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRkMTIzZDMuLjAwMDAwMDAKLS0tIGEvYXJjaC9hcm0vY29uZmlncy9zbWRrMjQxMF9kZWZjb25maWcKKysrIC9kZXYvbnVsbApAQCAtMSw3MzUgKzAsMCBAQAotIwotIyBBdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBtYWtlIGNvbmZpZzogZG9uJ3QgZWRpdAotIyBMaW51eCBrZXJuZWwgdmVyc2lvbjogMi42LjEyLXJjMS1iazIKLSMgU3VuIE1hciAyNyAyMjo0Mjo0MCAyMDA1Ci0jCi1DT05GSUdfQVJNPXkKLUNPTkZJR19NTVU9eQotQ09ORklHX1VJRDE2PXkKLUNPTkZJR19SV1NFTV9HRU5FUklDX1NQSU5MT0NLPXkKLUNPTkZJR19HRU5FUklDX0NBTElCUkFURV9ERUxBWT15Ci1DT05GSUdfR0VORVJJQ19JT01BUD15Ci0KLSMKLSMgQ29kZSBtYXR1cml0eSBsZXZlbCBvcHRpb25zCi0jCi1DT05GSUdfRVhQRVJJTUVOVEFMPXkKLUNPTkZJR19DTEVBTl9DT01QSUxFPXkKLUNPTkZJR19CUk9LRU5fT05fU01QPXkKLQotIwotIyBHZW5lcmFsIHNldHVwCi0jCi1DT05GSUdfTE9DQUxWRVJTSU9OPSIiCi1DT05GSUdfU1dBUD15Ci1DT05GSUdfU1lTVklQQz15Ci0jIENPTkZJR19QT1NJWF9NUVVFVUUgaXMgbm90IHNldAotIyBDT05GSUdfQlNEX1BST0NFU1NfQUNDVCBpcyBub3Qgc2V0Ci1DT05GSUdfU1lTQ1RMPXkKLSMgQ09ORklHX0FVRElUIGlzIG5vdCBzZXQKLSMgQ09ORklHX0hPVFBMVUcgaXMgbm90IHNldAotQ09ORklHX0tPQkpFQ1RfVUVWRU5UPXkKLSMgQ09ORklHX0lLQ09ORklHIGlzIG5vdCBzZXQKLSMgQ09ORklHX0VNQkVEREVEIGlzIG5vdCBzZXQKLUNPTkZJR19LQUxMU1lNUz15Ci0jIENPTkZJR19LQUxMU1lNU19BTEwgaXMgbm90IHNldAotIyBDT05GSUdfS0FMTFNZTVNfRVhUUkFfUEFTUyBpcyBub3Qgc2V0Ci1DT05GSUdfQkFTRV9GVUxMPXkKLUNPTkZJR19GVVRFWD15Ci1DT05GSUdfRVBPTEw9eQotQ09ORklHX0NDX09QVElNSVpFX0ZPUl9TSVpFPXkKLUNPTkZJR19TSE1FTT15Ci1DT05GSUdfQ0NfQUxJR05fRlVOQ1RJT05TPTAKLUNPTkZJR19DQ19BTElHTl9MQUJFTFM9MAotQ09ORklHX0NDX0FMSUdOX0xPT1BTPTAKLUNPTkZJR19DQ19BTElHTl9KVU1QUz0wCi0jIENPTkZJR19USU5ZX1NITUVNIGlzIG5vdCBzZXQKLUNPTkZJR19CQVNFX1NNQUxMPTAKLQotIwotIyBMb2FkYWJsZSBtb2R1bGUgc3VwcG9ydAotIwotIyBDT05GSUdfTU9EVUxFUyBpcyBub3Qgc2V0Ci0KLSMKLSMgU3lzdGVtIFR5cGUKLSMKLSMgQ09ORklHX0FSQ0hfQ0xQUzc1MDAgaXMgbm90IHNldAotIyBDT05GSUdfQVJDSF9DTFBTNzExWCBpcyBub3Qgc2V0Ci0jIENPTkZJR19BUkNIX0NPMjg1IGlzIG5vdCBzZXQKLSMgQ09ORklHX0FSQ0hfRUJTQTExMCBpcyBub3Qgc2V0Ci0jIENPTkZJR19BUkNIX0ZPT1RCUklER0UgaXMgbm90IHNldAotIyBDT05GSUdfQVJDSF9JTlRFR1JBVE9SIGlzIG5vdCBzZXQKLSMgQ09ORklHX0FSQ0hfSU9QM1hYIGlzIG5vdCBzZXQKLSMgQ09ORklHX0FSQ0hfSVhQNFhYIGlzIG5vdCBzZXQKLSMgQ09ORklHX0FSQ0hfSVhQMjAwMCBpcyBub3Qgc2V0Ci0jIENPTkZJR19BUkNIX0w3MjAwIGlzIG5vdCBzZXQKLSMgQ09ORklHX0FSQ0hfUFhBIGlzIG5vdCBzZXQKLSMgQ09ORklHX0FSQ0hfUlBDIGlzIG5vdCBzZXQKLSMgQ09ORklHX0FSQ0hfU0ExMTAwIGlzIG5vdCBzZXQKLUNPTkZJR19BUkNIX1MzQzI0MTA9eQotIyBDT05GSUdfQVJDSF9TSEFSSyBpcyBub3Qgc2V0Ci0jIENPTkZJR19BUkNIX0xIN0E0MFggaXMgbm90IHNldAotIyBDT05GSUdfQVJDSF9PTUFQIGlzIG5vdCBzZXQKLSMgQ09ORklHX0FSQ0hfVkVSU0FUSUxFIGlzIG5vdCBzZXQKLSMgQ09ORklHX0FSQ0hfSU1YIGlzIG5vdCBzZXQKLSMgQ09ORklHX0FSQ0hfSDcyMFggaXMgbm90IHNldAotCi0jCi0jIFMzQzI0WFggSW1wbGVtZW50YXRpb25zCi0jCi0jIENPTkZJR19BUkNIX0JBU1QgaXMgbm90IHNldAotIyBDT05GSUdfQVJDSF9IMTk0MCBpcyBub3Qgc2V0Ci0jIENPTkZJR19NQUNIX04zMCBpcyBub3Qgc2V0Ci1DT05GSUdfQVJDSF9TTURLMjQxMD15Ci0jIENPTkZJR19BUkNIX1MzQzI0NDAgaXMgbm90IHNldAotIyBDT05GSUdfTUFDSF9WUjEwMDAgaXMgbm90IHNldAotIyBDT05GSUdfTUFDSF9SWDM3MTUgaXMgbm90IHNldAotIyBDT05GSUdfTUFDSF9PVE9NIGlzIG5vdCBzZXQKLSMgQ09ORklHX01BQ0hfTkVYQ09ERVJfMjQ0MCBpcyBub3Qgc2V0Ci1DT05GSUdfQ1BVX1MzQzI0MTA9eQotCi0jCi0jIFMzQzI0MTAgQm9vdAotIwotCi0jCi0jIFMzQzI0MTAgU2V0dXAKLSMKLSMgQ09ORklHX1MzQzI0MTBfRE1BIGlzIG5vdCBzZXQKLUNPTkZJR19TM0MyNDEwX0xPV0xFVkVMX1VBUlRfUE9SVD0wCi0KLSMKLSMgUHJvY2Vzc29yIFR5cGUKLSMKLUNPTkZJR19DUFVfMzI9eQotQ09ORklHX0NQVV9BUk05MjBUPXkKLUNPTkZJR19DUFVfMzJ2ND15Ci1DT05GSUdfQ1BVX0FCUlRfRVY0VD15Ci1DT05GSUdfQ1BVX0NBQ0hFX1Y0V1Q9eQotQ09ORklHX0NQVV9DQUNIRV9WSVZUPXkKLUNPTkZJR19DUFVfQ09QWV9WNFdCPXkKLUNPTkZJR19DUFVfVExCX1Y0V0JJPXkKLQotIwotIyBQcm9jZXNzb3IgRmVhdHVyZXMKLSMKLUNPTkZJR19BUk1fVEhVTUI9eQotIyBDT05GSUdfQ1BVX0lDQUNIRV9ESVNBQkxFIGlzIG5vdCBzZXQKLSMgQ09ORklHX0NQVV9EQ0FDSEVfRElTQUJMRSBpcyBub3Qgc2V0Ci0jIENPTkZJR19DUFVfRENBQ0hFX1dSSVRFVEhST1VHSCBpcyBub3Qgc2V0Ci0KLSMKLSMgQnVzIHN1cHBvcnQKLSMKLQotIwotIyBQQ0NBUkQgKFBDTUNJQS9DYXJkQnVzKSBzdXBwb3J0Ci0jCi0jIENPTkZJR19QQ0NBUkQgaXMgbm90IHNldAotCi0jCi0jIEtlcm5lbCBGZWF0dXJlcwotIwotIyBDT05GSUdfUFJFRU1QVCBpcyBub3Qgc2V0Ci1DT05GSUdfQUxJR05NRU5UX1RSQVA9eQotCi0jCi0jIEJvb3Qgb3B0aW9ucwotIwotQ09ORklHX1pCT09UX1JPTV9URVhUPTB4MAotQ09ORklHX1pCT09UX1JPTV9CU1M9MHgwCi1DT05GSUdfQ01ETElORT0icm9vdD0xZjA0IG1lbT0zMk0iCi0jIENPTkZJR19YSVBfS0VSTkVMIGlzIG5vdCBzZXQKLQotIwotIyBGbG9hdGluZyBwb2ludCBlbXVsYXRpb24KLSMKLQotIwotIyBBdCBsZWFzdCBvbmUgZW11bGF0aW9uIG11c3QgYmUgc2VsZWN0ZWQKLSMKLSMgQ09ORklHX0ZQRV9OV0ZQRSBpcyBub3Qgc2V0Ci0jIENPTkZJR19GUEVfRkFTVEZQRSBpcyBub3Qgc2V0Ci0KLSMKLSMgVXNlcnNwYWNlIGJpbmFyeSBmb3JtYXRzCi0jCi1DT05GSUdfQklORk1UX0VMRj15Ci1DT05GSUdfQklORk1UX0FPVVQ9eQotIyBDT05GSUdfQklORk1UX01JU0MgaXMgbm90IHNldAotIyBDT05GSUdfQVJUSFVSIGlzIG5vdCBzZXQKLQotIwotIyBQb3dlciBtYW5hZ2VtZW50IG9wdGlvbnMKLSMKLSMgQ09ORklHX1BNIGlzIG5vdCBzZXQKLQotIwotIyBEZXZpY2UgRHJpdmVycwotIwotCi0jCi0jIEdlbmVyaWMgRHJpdmVyIE9wdGlvbnMKLSMKLUNPTkZJR19TVEFOREFMT05FPXkKLUNPTkZJR19QUkVWRU5UX0ZJUk1XQVJFX0JVSUxEPXkKLSMgQ09ORklHX0ZXX0xPQURFUiBpcyBub3Qgc2V0Ci0jIENPTkZJR19ERUJVR19EUklWRVIgaXMgbm90IHNldAotCi0jCi0jIE1lbW9yeSBUZWNobm9sb2d5IERldmljZXMgKE1URCkKLSMKLUNPTkZJR19NVEQ9eQotIyBDT05GSUdfTVREX0RFQlVHIGlzIG5vdCBzZXQKLSMgQ09ORklHX01URF9DT05DQVQgaXMgbm90IHNldAotIyBDT05GSUdfTVREX1BBUlRJVElPTlMgaXMgbm90IHNldAotCi0jCi0jIFVzZXIgTW9kdWxlcyBBbmQgVHJhbnNsYXRpb24gTGF5ZXJzCi0jCi1DT05GSUdfTVREX0NIQVI9eQotQ09ORklHX01URF9CTE9DSz15Ci0jIENPTkZJR19GVEwgaXMgbm90IHNldAotIyBDT05GSUdfTkZUTCBpcyBub3Qgc2V0Ci0jIENPTkZJR19JTkZUTCBpcyBub3Qgc2V0Ci0KLSMKLSMgUkFNL1JPTS9GbGFzaCBjaGlwIGRyaXZlcnMKLSMKLUNPTkZJR19NVERfQ0ZJPXkKLSMgQ09ORklHX01URF9KRURFQ1BST0JFIGlzIG5vdCBzZXQKLUNPTkZJR19NVERfR0VOX1BST0JFPXkKLSMgQ09ORklHX01URF9DRklfQURWX09QVElPTlMgaXMgbm90IHNldAotQ09ORklHX01URF9NQVBfQkFOS19XSURUSF8xPXkKLUNPTkZJR19NVERfTUFQX0JBTktfV0lEVEhfMj15Ci1DT05GSUdfTVREX01BUF9CQU5LX1dJRFRIXzQ9eQotIyBDT05GSUdfTVREX01BUF9CQU5LX1dJRFRIXzggaXMgbm90IHNldAotIyBDT05GSUdfTVREX01BUF9CQU5LX1dJRFRIXzE2IGlzIG5vdCBzZXQKLSMgQ09ORklHX01URF9NQVBfQkFOS19XSURUSF8zMiBpcyBub3Qgc2V0Ci1DT05GSUdfTVREX0NGSV9JMT15Ci1DT05GSUdfTVREX0NGSV9JMj15Ci0jIENPTkZJR19NVERfQ0ZJX0k0IGlzIG5vdCBzZXQKLSMgQ09ORklHX01URF9DRklfSTggaXMgbm90IHNldAotQ09ORklHX01URF9DRklfSU5URUxFWFQ9eQotIyBDT05GSUdfTVREX0NGSV9BTURTVEQgaXMgbm90IHNldAotIyBDT05GSUdfTVREX0NGSV9TVEFBIGlzIG5vdCBzZXQKLUNPTkZJR19NVERfQ0ZJX1VUSUw9eQotIyBDT05GSUdfTVREX1JBTSBpcyBub3Qgc2V0Ci0jIENPTkZJR19NVERfUk9NIGlzIG5vdCBzZXQKLSMgQ09ORklHX01URF9BQlNFTlQgaXMgbm90IHNldAotIyBDT05GSUdfTVREX1hJUCBpcyBub3Qgc2V0Ci0KLSMKLSMgTWFwcGluZyBkcml2ZXJzIGZvciBjaGlwIGFjY2VzcwotIwotIyBDT05GSUdfTVREX0NPTVBMRVhfTUFQUElOR1MgaXMgbm90IHNldAotIyBDT05GSUdfTVREX1BIWVNNQVAgaXMgbm90IHNldAotIyBDT05GSUdfTVREX0FSTV9JTlRFR1JBVE9SIGlzIG5vdCBzZXQKLSMgQ09ORklHX01URF9FREI3MzEyIGlzIG5vdCBzZXQKLQotIwotIyBTZWxmLWNvbnRhaW5lZCBNVEQgZGV2aWNlIGRyaXZlcnMKLSMKLSMgQ09ORklHX01URF9TTFJBTSBpcyBub3Qgc2V0Ci0jIENPTkZJR19NVERfUEhSQU0gaXMgbm90IHNldAotIyBDT05GSUdfTVREX01URFJBTSBpcyBub3Qgc2V0Ci0jIENPTkZJR19NVERfQkxLTVREIGlzIG5vdCBzZXQKLSMgQ09ORklHX01URF9CTE9DSzJNVEQgaXMgbm90IHNldAotCi0jCi0jIERpc2stT24tQ2hpcCBEZXZpY2UgRHJpdmVycwotIwotIyBDT05GSUdfTVREX0RPQzIwMDAgaXMgbm90IHNldAotIyBDT05GSUdfTVREX0RPQzIwMDEgaXMgbm90IHNldAotIyBDT05GSUdfTVREX0RPQzIwMDFQTFVTIGlzIG5vdCBzZXQKLQotIwotIyBOQU5EIEZsYXNoIERldmljZSBEcml2ZXJzCi0jCi0jIENPTkZJR19NVERfTkFORCBpcyBub3Qgc2V0Ci0KLSMKLSMgUGFyYWxsZWwgcG9ydCBzdXBwb3J0Ci0jCi0jIENPTkZJR19QQVJQT1JUIGlzIG5vdCBzZXQKLQotIwotIyBQbHVnIGFuZCBQbGF5IHN1cHBvcnQKLSMKLQotIwotIyBCbG9jayBkZXZpY2VzCi0jCi0jIENPTkZJR19CTEtfREVWX0ZEIGlzIG5vdCBzZXQKLSMgQ09ORklHX0JMS19ERVZfQ09XX0NPTU1PTiBpcyBub3Qgc2V0Ci0jIENPTkZJR19CTEtfREVWX0xPT1AgaXMgbm90IHNldAotIyBDT05GSUdfQkxLX0RFVl9OQkQgaXMgbm90IHNldAotQ09ORklHX0JMS19ERVZfUkFNPXkKLUNPTkZJR19CTEtfREVWX1JBTV9DT1VOVD0xNgotQ09ORklHX0JMS19ERVZfUkFNX1NJWkU9NDA5NgotIyBDT05GSUdfQkxLX0RFVl9JTklUUkQgaXMgbm90IHNldAotQ09ORklHX0lOSVRSQU1GU19TT1VSQ0U9IiIKLSMgQ09ORklHX0NEUk9NX1BLVENEVkQgaXMgbm90IHNldAotCi0jCi0jIElPIFNjaGVkdWxlcnMKLSMKLUNPTkZJR19JT1NDSEVEX05PT1A9eQotQ09ORklHX0lPU0NIRURfQVM9eQotQ09ORklHX0lPU0NIRURfREVBRExJTkU9eQotQ09ORklHX0lPU0NIRURfQ0ZRPXkKLSMgQ09ORklHX0FUQV9PVkVSX0VUSCBpcyBub3Qgc2V0Ci0KLSMKLSMgQVRBL0FUQVBJL01GTS9STEwgc3VwcG9ydAotIwotIyBDT05GSUdfSURFIGlzIG5vdCBzZXQKLQotIwotIyBTQ1NJIGRldmljZSBzdXBwb3J0Ci0jCi0jIENPTkZJR19TQ1NJIGlzIG5vdCBzZXQKLQotIwotIyBNdWx0aS1kZXZpY2Ugc3VwcG9ydCAoUkFJRCBhbmQgTFZNKQotIwotIyBDT05GSUdfTUQgaXMgbm90IHNldAotCi0jCi0jIEZ1c2lvbiBNUFQgZGV2aWNlIHN1cHBvcnQKLSMKLQotIwotIyBJRUVFIDEzOTQgKEZpcmVXaXJlKSBzdXBwb3J0Ci0jCi0KLSMKLSMgSTJPIGRldmljZSBzdXBwb3J0Ci0jCi0KLSMKLSMgTmV0d29ya2luZyBzdXBwb3J0Ci0jCi1DT05GSUdfTkVUPXkKLQotIwotIyBOZXR3b3JraW5nIG9wdGlvbnMKLSMKLSMgQ09ORklHX1BBQ0tFVCBpcyBub3Qgc2V0Ci0jIENPTkZJR19ORVRMSU5LX0RFViBpcyBub3Qgc2V0Ci1DT05GSUdfVU5JWD15Ci0jIENPTkZJR19ORVRfS0VZIGlzIG5vdCBzZXQKLUNPTkZJR19JTkVUPXkKLSMgQ09ORklHX0lQX01VTFRJQ0FTVCBpcyBub3Qgc2V0Ci0jIENPTkZJR19JUF9BRFZBTkNFRF9ST1VURVIgaXMgbm90IHNldAotQ09ORklHX0lQX1BOUD15Ci0jIENPTkZJR19JUF9QTlBfREhDUCBpcyBub3Qgc2V0Ci1DT05GSUdfSVBfUE5QX0JPT1RQPXkKLSMgQ09ORklHX0lQX1BOUF9SQVJQIGlzIG5vdCBzZXQKLSMgQ09ORklHX05FVF9JUElQIGlzIG5vdCBzZXQKLSMgQ09ORklHX05FVF9JUEdSRSBpcyBub3Qgc2V0Ci0jIENPTkZJR19BUlBEIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NZTl9DT09LSUVTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lORVRfQUggaXMgbm90IHNldAotIyBDT05GSUdfSU5FVF9FU1AgaXMgbm90IHNldAotIyBDT05GSUdfSU5FVF9JUENPTVAgaXMgbm90IHNldAotIyBDT05GSUdfSU5FVF9UVU5ORUwgaXMgbm90IHNldAotIyBDT05GSUdfSVBfVENQRElBRyBpcyBub3Qgc2V0Ci0jIENPTkZJR19JUF9UQ1BESUFHX0lQVjYgaXMgbm90IHNldAotIyBDT05GSUdfSVBWNiBpcyBub3Qgc2V0Ci0jIENPTkZJR19ORVRGSUxURVIgaXMgbm90IHNldAotCi0jCi0jIFNDVFAgQ29uZmlndXJhdGlvbiAoRVhQRVJJTUVOVEFMKQotIwotIyBDT05GSUdfSVBfU0NUUCBpcyBub3Qgc2V0Ci0jIENPTkZJR19BVE0gaXMgbm90IHNldAotIyBDT05GSUdfQlJJREdFIGlzIG5vdCBzZXQKLSMgQ09ORklHX1ZMQU5fODAyMVEgaXMgbm90IHNldAotIyBDT05GSUdfREVDTkVUIGlzIG5vdCBzZXQKLSMgQ09ORklHX0xMQzIgaXMgbm90IHNldAotIyBDT05GSUdfSVBYIGlzIG5vdCBzZXQKLSMgQ09ORklHX0FUQUxLIGlzIG5vdCBzZXQKLSMgQ09ORklHX1gyNSBpcyBub3Qgc2V0Ci0jIENPTkZJR19MQVBCIGlzIG5vdCBzZXQKLSMgQ09ORklHX05FVF9ESVZFUlQgaXMgbm90IHNldAotIyBDT05GSUdfRUNPTkVUIGlzIG5vdCBzZXQKLSMgQ09ORklHX1dBTl9ST1VURVIgaXMgbm90IHNldAotCi0jCi0jIFFvUyBhbmQvb3IgZmFpciBxdWV1ZWluZwotIwotIyBDT05GSUdfTkVUX1NDSEVEIGlzIG5vdCBzZXQKLSMgQ09ORklHX05FVF9DTFNfUk9VVEUgaXMgbm90IHNldAotCi0jCi0jIE5ldHdvcmsgdGVzdGluZwotIwotIyBDT05GSUdfTkVUX1BLVEdFTiBpcyBub3Qgc2V0Ci0jIENPTkZJR19ORVRQT0xMIGlzIG5vdCBzZXQKLSMgQ09ORklHX05FVF9QT0xMX0NPTlRST0xMRVIgaXMgbm90IHNldAotIyBDT05GSUdfSEFNUkFESU8gaXMgbm90IHNldAotIyBDT05GSUdfSVJEQSBpcyBub3Qgc2V0Ci0jIENPTkZJR19CVCBpcyBub3Qgc2V0Ci1DT05GSUdfTkVUREVWSUNFUz15Ci0jIENPTkZJR19EVU1NWSBpcyBub3Qgc2V0Ci0jIENPTkZJR19CT05ESU5HIGlzIG5vdCBzZXQKLSMgQ09ORklHX0VRVUFMSVpFUiBpcyBub3Qgc2V0Ci0jIENPTkZJR19UVU4gaXMgbm90IHNldAotCi0jCi0jIEV0aGVybmV0ICgxMCBvciAxMDBNYml0KQotIwotQ09ORklHX05FVF9FVEhFUk5FVD15Ci0jIENPTkZJR19NSUkgaXMgbm90IHNldAotIyBDT05GSUdfU01DOTFYIGlzIG5vdCBzZXQKLQotIwotIyBFdGhlcm5ldCAoMTAwMCBNYml0KQotIwotCi0jCi0jIEV0aGVybmV0ICgxMDAwMCBNYml0KQotIwotCi0jCi0jIFRva2VuIFJpbmcgZGV2aWNlcwotIwotCi0jCi0jIFdpcmVsZXNzIExBTiAobm9uLWhhbXJhZGlvKQotIwotIyBDT05GSUdfTkVUX1JBRElPIGlzIG5vdCBzZXQKLQotIwotIyBXYW4gaW50ZXJmYWNlcwotIwotIyBDT05GSUdfV0FOIGlzIG5vdCBzZXQKLSMgQ09ORklHX1BQUCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TTElQIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NIQVBFUiBpcyBub3Qgc2V0Ci0jIENPTkZJR19ORVRDT05TT0xFIGlzIG5vdCBzZXQKLQotIwotIyBJU0ROIHN1YnN5c3RlbQotIwotIyBDT05GSUdfSVNETiBpcyBub3Qgc2V0Ci0KLSMKLSMgSW5wdXQgZGV2aWNlIHN1cHBvcnQKLSMKLUNPTkZJR19JTlBVVD15Ci0KLSMKLSMgVXNlcmxhbmQgaW50ZXJmYWNlcwotIwotQ09ORklHX0lOUFVUX01PVVNFREVWPXkKLUNPTkZJR19JTlBVVF9NT1VTRURFVl9QU0FVWD15Ci1DT05GSUdfSU5QVVRfTU9VU0VERVZfU0NSRUVOX1g9MTAyNAotQ09ORklHX0lOUFVUX01PVVNFREVWX1NDUkVFTl9ZPTc2OAotIyBDT05GSUdfSU5QVVRfSk9ZREVWIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lOUFVUX1RTREVWIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lOUFVUX0VWREVWIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lOUFVUX0VWQlVHIGlzIG5vdCBzZXQKLQotIwotIyBJbnB1dCBEZXZpY2UgRHJpdmVycwotIwotQ09ORklHX0lOUFVUX0tFWUJPQVJEPXkKLUNPTkZJR19LRVlCT0FSRF9BVEtCRD15Ci0jIENPTkZJR19LRVlCT0FSRF9TVU5LQkQgaXMgbm90IHNldAotIyBDT05GSUdfS0VZQk9BUkRfTEtLQkQgaXMgbm90IHNldAotIyBDT05GSUdfS0VZQk9BUkRfWFRLQkQgaXMgbm90IHNldAotIyBDT05GSUdfS0VZQk9BUkRfTkVXVE9OIGlzIG5vdCBzZXQKLUNPTkZJR19JTlBVVF9NT1VTRT15Ci1DT05GSUdfTU9VU0VfUFMyPXkKLSMgQ09ORklHX01PVVNFX1NFUklBTCBpcyBub3Qgc2V0Ci0jIENPTkZJR19NT1VTRV9WU1hYWEFBIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lOUFVUX0pPWVNUSUNLIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lOUFVUX1RPVUNIU0NSRUVOIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lOUFVUX01JU0MgaXMgbm90IHNldAotCi0jCi0jIEhhcmR3YXJlIEkvTyBwb3J0cwotIwotQ09ORklHX1NFUklPPXkKLUNPTkZJR19TRVJJT19TRVJQT1JUPXkKLUNPTkZJR19TRVJJT19MSUJQUzI9eQotIyBDT05GSUdfU0VSSU9fUkFXIGlzIG5vdCBzZXQKLSMgQ09ORklHX0dBTUVQT1JUIGlzIG5vdCBzZXQKLUNPTkZJR19TT1VORF9HQU1FUE9SVD15Ci0KLSMKLSMgQ2hhcmFjdGVyIGRldmljZXMKLSMKLUNPTkZJR19WVD15Ci1DT05GSUdfVlRfQ09OU09MRT15Ci1DT05GSUdfSFdfQ09OU09MRT15Ci0jIENPTkZJR19TRVJJQUxfTk9OU1RBTkRBUkQgaXMgbm90IHNldAotCi0jCi0jIFNlcmlhbCBkcml2ZXJzCi0jCi0jIENPTkZJR19TRVJJQUxfODI1MCBpcyBub3Qgc2V0Ci0KLSMKLSMgTm9uLTgyNTAgc2VyaWFsIHBvcnQgc3VwcG9ydAotIwotQ09ORklHX1NFUklBTF9TM0MyNDEwPXkKLUNPTkZJR19TRVJJQUxfUzNDMjQxMF9DT05TT0xFPXkKLUNPTkZJR19TRVJJQUxfQ09SRT15Ci1DT05GSUdfU0VSSUFMX0NPUkVfQ09OU09MRT15Ci1DT05GSUdfVU5JWDk4X1BUWVM9eQotQ09ORklHX0xFR0FDWV9QVFlTPXkKLUNPTkZJR19MRUdBQ1lfUFRZX0NPVU5UPTI1NgotCi0jCi0jIElQTUkKLSMKLSMgQ09ORklHX0lQTUlfSEFORExFUiBpcyBub3Qgc2V0Ci0KLSMKLSMgV2F0Y2hkb2cgQ2FyZHMKLSMKLSMgQ09ORklHX1dBVENIRE9HIGlzIG5vdCBzZXQKLSMgQ09ORklHX05WUkFNIGlzIG5vdCBzZXQKLSMgQ09ORklHX1JUQyBpcyBub3Qgc2V0Ci0jIENPTkZJR19TM0MyNDEwX1JUQyBpcyBub3Qgc2V0Ci0jIENPTkZJR19EVExLIGlzIG5vdCBzZXQKLSMgQ09ORklHX1IzOTY0IGlzIG5vdCBzZXQKLQotIwotIyBGdGFwZSwgdGhlIGZsb3BweSB0YXBlIGRldmljZSBkcml2ZXIKLSMKLSMgQ09ORklHX0RSTSBpcyBub3Qgc2V0Ci0jIENPTkZJR19SQVdfRFJJVkVSIGlzIG5vdCBzZXQKLQotIwotIyBUUE0gZGV2aWNlcwotIwotIyBDT05GSUdfVENHX1RQTSBpcyBub3Qgc2V0Ci0KLSMKLSMgSTJDIHN1cHBvcnQKLSMKLSMgQ09ORklHX0kyQyBpcyBub3Qgc2V0Ci0KLSMKLSMgTWlzYyBkZXZpY2VzCi0jCi0KLSMKLSMgTXVsdGltZWRpYSBkZXZpY2VzCi0jCi0jIENPTkZJR19WSURFT19ERVYgaXMgbm90IHNldAotCi0jCi0jIERpZ2l0YWwgVmlkZW8gQnJvYWRjYXN0aW5nIERldmljZXMKLSMKLSMgQ09ORklHX0RWQiBpcyBub3Qgc2V0Ci0KLSMKLSMgR3JhcGhpY3Mgc3VwcG9ydAotIwotQ09ORklHX0ZCPXkKLUNPTkZJR19GQl9DRkJfRklMTFJFQ1Q9eQotQ09ORklHX0ZCX0NGQl9DT1BZQVJFQT15Ci1DT05GSUdfRkJfQ0ZCX0lNQUdFQkxJVD15Ci1DT05GSUdfRkJfU09GVF9DVVJTT1I9eQotIyBDT05GSUdfRkJfTU9ERV9IRUxQRVJTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0ZCX1RJTEVCTElUVElORyBpcyBub3Qgc2V0Ci1DT05GSUdfRkJfVklSVFVBTD15Ci0KLSMKLSMgQ29uc29sZSBkaXNwbGF5IGRyaXZlciBzdXBwb3J0Ci0jCi0jIENPTkZJR19WR0FfQ09OU09MRSBpcyBub3Qgc2V0Ci1DT05GSUdfRFVNTVlfQ09OU09MRT15Ci1DT05GSUdfRlJBTUVCVUZGRVJfQ09OU09MRT15Ci0jIENPTkZJR19GT05UUyBpcyBub3Qgc2V0Ci1DT05GSUdfRk9OVF84eDg9eQotQ09ORklHX0ZPTlRfOHgxNj15Ci0KLSMKLSMgTG9nbyBjb25maWd1cmF0aW9uCi0jCi0jIENPTkZJR19MT0dPIGlzIG5vdCBzZXQKLSMgQ09ORklHX0JBQ0tMSUdIVF9MQ0RfU1VQUE9SVCBpcyBub3Qgc2V0Ci0KLSMKLSMgU291bmQKLSMKLSMgQ09ORklHX1NPVU5EIGlzIG5vdCBzZXQKLQotIwotIyBVU0Igc3VwcG9ydAotIwotQ09ORklHX1VTQl9BUkNIX0hBU19IQ0Q9eQotIyBDT05GSUdfVVNCX0FSQ0hfSEFTX09IQ0kgaXMgbm90IHNldAotIyBDT05GSUdfVVNCIGlzIG5vdCBzZXQKLQotIwotIyBVU0IgR2FkZ2V0IFN1cHBvcnQKLSMKLSMgQ09ORklHX1VTQl9HQURHRVQgaXMgbm90IHNldAotCi0jCi0jIE1NQy9TRCBDYXJkIHN1cHBvcnQKLSMKLSMgQ09ORklHX01NQyBpcyBub3Qgc2V0Ci0KLSMKLSMgRmlsZSBzeXN0ZW1zCi0jCi1DT05GSUdfRVhUMl9GUz15Ci0jIENPTkZJR19FWFQyX0ZTX1hBVFRSIGlzIG5vdCBzZXQKLSMgQ09ORklHX0VYVDNfRlMgaXMgbm90IHNldAotIyBDT05GSUdfSkJEIGlzIG5vdCBzZXQKLSMgQ09ORklHX1JFSVNFUkZTX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0pGU19GUyBpcyBub3Qgc2V0Ci0KLSMKLSMgWEZTIHN1cHBvcnQKLSMKLSMgQ09ORklHX1hGU19GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19NSU5JWF9GUyBpcyBub3Qgc2V0Ci1DT05GSUdfUk9NRlNfRlM9eQotIyBDT05GSUdfUVVPVEEgaXMgbm90IHNldAotQ09ORklHX0ROT1RJRlk9eQotIyBDT05GSUdfQVVUT0ZTX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0FVVE9GUzRfRlMgaXMgbm90IHNldAotCi0jCi0jIENELVJPTS9EVkQgRmlsZXN5c3RlbXMKLSMKLSMgQ09ORklHX0lTTzk2NjBfRlMgaXMgbm90IHNldAotIyBDT05GSUdfVURGX0ZTIGlzIG5vdCBzZXQKLQotIwotIyBET1MvRkFUL05UIEZpbGVzeXN0ZW1zCi0jCi0jIENPTkZJR19NU0RPU19GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19WRkFUX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX05URlNfRlMgaXMgbm90IHNldAotCi0jCi0jIFBzZXVkbyBmaWxlc3lzdGVtcwotIwotQ09ORklHX1BST0NfRlM9eQotQ09ORklHX1NZU0ZTPXkKLSMgQ09ORklHX0RFVkZTX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0RFVlBUU19GU19YQVRUUiBpcyBub3Qgc2V0Ci0jIENPTkZJR19UTVBGUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19IVUdFVExCX1BBR0UgaXMgbm90IHNldAotQ09ORklHX1JBTUZTPXkKLQotIwotIyBNaXNjZWxsYW5lb3VzIGZpbGVzeXN0ZW1zCi0jCi0jIENPTkZJR19BREZTX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0FGRlNfRlMgaXMgbm90IHNldAotIyBDT05GSUdfSEZTX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0hGU1BMVVNfRlMgaXMgbm90IHNldAotIyBDT05GSUdfQkVGU19GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19CRlNfRlMgaXMgbm90IHNldAotIyBDT05GSUdfRUZTX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0pGRlNfRlMgaXMgbm90IHNldAotIyBDT05GSUdfSkZGUzJfRlMgaXMgbm90IHNldAotIyBDT05GSUdfQ1JBTUZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX1ZYRlNfRlMgaXMgbm90IHNldAotIyBDT05GSUdfSFBGU19GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19RTlg0RlNfRlMgaXMgbm90IHNldAotIyBDT05GSUdfU1lTVl9GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19VRlNfRlMgaXMgbm90IHNldAotCi0jCi0jIE5ldHdvcmsgRmlsZSBTeXN0ZW1zCi0jCi1DT05GSUdfTkZTX0ZTPXkKLSMgQ09ORklHX05GU19WMyBpcyBub3Qgc2V0Ci0jIENPTkZJR19ORlNfVjQgaXMgbm90IHNldAotIyBDT05GSUdfTkZTX0RJUkVDVElPIGlzIG5vdCBzZXQKLSMgQ09ORklHX05GU0QgaXMgbm90IHNldAotQ09ORklHX1JPT1RfTkZTPXkKLUNPTkZJR19MT0NLRD15Ci1DT05GSUdfU1VOUlBDPXkKLSMgQ09ORklHX1JQQ1NFQ19HU1NfS1JCNSBpcyBub3Qgc2V0Ci0jIENPTkZJR19SUENTRUNfR1NTX1NQS00zIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NNQl9GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19DSUZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX05DUF9GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19DT0RBX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0FGU19GUyBpcyBub3Qgc2V0Ci0KLSMKLSMgUGFydGl0aW9uIFR5cGVzCi0jCi1DT05GSUdfUEFSVElUSU9OX0FEVkFOQ0VEPXkKLSMgQ09ORklHX0FDT1JOX1BBUlRJVElPTiBpcyBub3Qgc2V0Ci0jIENPTkZJR19PU0ZfUEFSVElUSU9OIGlzIG5vdCBzZXQKLSMgQ09ORklHX0FNSUdBX1BBUlRJVElPTiBpcyBub3Qgc2V0Ci0jIENPTkZJR19BVEFSSV9QQVJUSVRJT04gaXMgbm90IHNldAotIyBDT05GSUdfTUFDX1BBUlRJVElPTiBpcyBub3Qgc2V0Ci0jIENPTkZJR19NU0RPU19QQVJUSVRJT04gaXMgbm90IHNldAotIyBDT05GSUdfTERNX1BBUlRJVElPTiBpcyBub3Qgc2V0Ci0jIENPTkZJR19TR0lfUEFSVElUSU9OIGlzIG5vdCBzZXQKLSMgQ09ORklHX1VMVFJJWF9QQVJUSVRJT04gaXMgbm90IHNldAotIyBDT05GSUdfU1VOX1BBUlRJVElPTiBpcyBub3Qgc2V0Ci0jIENPTkZJR19FRklfUEFSVElUSU9OIGlzIG5vdCBzZXQKLQotIwotIyBOYXRpdmUgTGFuZ3VhZ2UgU3VwcG9ydAotIwotIyBDT05GSUdfTkxTIGlzIG5vdCBzZXQKLQotIwotIyBQcm9maWxpbmcgc3VwcG9ydAotIwotIyBDT05GSUdfUFJPRklMSU5HIGlzIG5vdCBzZXQKLQotIwotIyBLZXJuZWwgaGFja2luZwotIwotIyBDT05GSUdfUFJJTlRLX1RJTUUgaXMgbm90IHNldAotQ09ORklHX0RFQlVHX0tFUk5FTD15Ci0jIENPTkZJR19NQUdJQ19TWVNSUSBpcyBub3Qgc2V0Ci1DT05GSUdfTE9HX0JVRl9TSElGVD0xNAotIyBDT05GSUdfU0NIRURTVEFUUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19ERUJVR19TTEFCIGlzIG5vdCBzZXQKLSMgQ09ORklHX0RFQlVHX1NQSU5MT0NLIGlzIG5vdCBzZXQKLSMgQ09ORklHX0RFQlVHX1NQSU5MT0NLX1NMRUVQIGlzIG5vdCBzZXQKLSMgQ09ORklHX0RFQlVHX0tPQkpFQ1QgaXMgbm90IHNldAotQ09ORklHX0RFQlVHX0JVR1ZFUkJPU0U9eQotIyBDT05GSUdfREVCVUdfSU5GTyBpcyBub3Qgc2V0Ci0jIENPTkZJR19ERUJVR19GUyBpcyBub3Qgc2V0Ci1DT05GSUdfRlJBTUVfUE9JTlRFUj15Ci1DT05GSUdfREVCVUdfVVNFUj15Ci0jIENPTkZJR19ERUJVR19XQUlUUSBpcyBub3Qgc2V0Ci0jIENPTkZJR19ERUJVR19FUlJPUlMgaXMgbm90IHNldAotQ09ORklHX0RFQlVHX0xMPXkKLSMgQ09ORklHX0RFQlVHX0lDRURDQyBpcyBub3Qgc2V0Ci1DT05GSUdfREVCVUdfUzNDMjQxMF9QT1JUPXkKLUNPTkZJR19ERUJVR19TM0MyNDEwX1VBUlQ9MAotCi0jCi0jIFNlY3VyaXR5IG9wdGlvbnMKLSMKLSMgQ09ORklHX0tFWVMgaXMgbm90IHNldAotIyBDT05GSUdfU0VDVVJJVFkgaXMgbm90IHNldAotCi0jCi0jIENyeXB0b2dyYXBoaWMgb3B0aW9ucwotIwotIyBDT05GSUdfQ1JZUFRPIGlzIG5vdCBzZXQKLQotIwotIyBIYXJkd2FyZSBjcnlwdG8gZGV2aWNlcwotIwotCi0jCi0jIExpYnJhcnkgcm91dGluZXMKLSMKLSMgQ09ORklHX0NSQ19DQ0lUVCBpcyBub3Qgc2V0Ci1DT05GSUdfQ1JDMzI9eQotQ09ORklHX0xJQkNSQzMyQz15CmRpZmYgLS1naXQgYS9hcmNoL2FybS9jb25maWdzL3ZlcnNhdGlsZV9kZWZjb25maWcgYi9hcmNoL2FybS9jb25maWdzL3ZlcnNhdGlsZV9kZWZjb25maWcKaW5kZXggOTZiN2E3Ny4uZjdiZjZlZiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vY29uZmlncy92ZXJzYXRpbGVfZGVmY29uZmlnCisrKyBiL2FyY2gvYXJtL2NvbmZpZ3MvdmVyc2F0aWxlX2RlZmNvbmZpZwpAQCAtMjAwLDcgKzIwMCw3IEBACiAjIFBvd2VyIG1hbmFnZW1lbnQgb3B0aW9ucwogIwogQ09ORklHX1BNPXkKLUNPTkZJR19QTV9MRUdBQ1k9eQorIyBDT05GSUdfUE1fTEVHQUNZIGlzIG5vdCBzZXQKICMgQ09ORklHX1BNX0RFQlVHIGlzIG5vdCBzZXQKICMgQ09ORklHX0FQTSBpcyBub3Qgc2V0CiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2tlcm5lbC9hcm1rc3ltcy5jIGIvYXJjaC9hcm0va2VybmVsL2FybWtzeW1zLmMKaW5kZXggZGE2OWU2Ni4uNDc3OWY0NyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0va2VybmVsL2FybWtzeW1zLmMKKysrIGIvYXJjaC9hcm0va2VybmVsL2FybWtzeW1zLmMKQEAgLTE3OCw5ICsxNzgsMyBAQAogRVhQT1JUX1NZTUJPTChfZmluZF9maXJzdF9iaXRfYmUpOwogRVhQT1JUX1NZTUJPTChfZmluZF9uZXh0X2JpdF9iZSk7CiAjZW5kaWYKLQotCS8qIHN5c2NhbGxzICovCi1FWFBPUlRfU1lNQk9MKHN5c193cml0ZSk7Ci1FWFBPUlRfU1lNQk9MKHN5c19sc2Vlayk7Ci1FWFBPUlRfU1lNQk9MKHN5c19leGl0KTsKLUVYUE9SVF9TWU1CT0woc3lzX3dhaXQ0KTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2tlcm5lbC9zZXR1cC5jIGIvYXJjaC9hcm0va2VybmVsL3NldHVwLmMKaW5kZXggNmJiZDkzZC4uMjllZmM5ZiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0va2VybmVsL3NldHVwLmMKKysrIGIvYXJjaC9hcm0va2VybmVsL3NldHVwLmMKQEAgLTM1Nyw2ICszNTcsOSBAQAogI2lmbmRlZiBDT05GSUdfVkZQCiAJZWxmX2h3Y2FwICY9IH5IV0NBUF9WRlA7CiAjZW5kaWYKKyNpZm5kZWYgQ09ORklHX0lXTU1YVAorCWVsZl9od2NhcCAmPSB+SFdDQVBfSVdNTVhUOworI2VuZGlmCiAKIAljcHVfcHJvY19pbml0KCk7CiB9CkBAIC04NTQsNiArODU3LDcgQEAKIAkidmZwIiwKIAkiZWRzcCIsCiAJImphdmEiLAorCSJpd21teHQiLAogCU5VTEwKIH07CiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2tlcm5lbC9zbXAuYyBiL2FyY2gvYXJtL2tlcm5lbC9zbXAuYwppbmRleCA0MjEzMjlmLi5hMDdkMjAyIDEwMDY0NAotLS0gYS9hcmNoL2FybS9rZXJuZWwvc21wLmMKKysrIGIvYXJjaC9hcm0va2VybmVsL3NtcC5jCkBAIC03LDYgKzcsNyBAQAogICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKICAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgogICovCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KQEAgLTE5LDYgKzIwLDcgQEAKICNpbmNsdWRlIDxsaW51eC9jcHUuaD4KICNpbmNsdWRlIDxsaW51eC9zbXAuaD4KICNpbmNsdWRlIDxsaW51eC9zZXFfZmlsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2lycS5oPgogCiAjaW5jbHVkZSA8YXNtL2F0b21pYy5oPgogI2luY2x1ZGUgPGFzbS9jYWNoZWZsdXNoLmg+CkBAIC00NzQsMjUgKzQ3NiwyNiBAQAogCXNlcV9wdXRjKHAsICdcbicpOwogfQogCi1zdGF0aWMgdm9pZCBpcGlfdGltZXIoc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCitzdGF0aWMgdm9pZCBpcGlfdGltZXIodm9pZCkKIHsKLQlpbnQgdXNlciA9IHVzZXJfbW9kZShyZWdzKTsKLQogCWlycV9lbnRlcigpOwotCXByb2ZpbGVfdGljayhDUFVfUFJPRklMSU5HLCByZWdzKTsKLQl1cGRhdGVfcHJvY2Vzc190aW1lcyh1c2VyKTsKKwlwcm9maWxlX3RpY2soQ1BVX1BST0ZJTElORyk7CisJdXBkYXRlX3Byb2Nlc3NfdGltZXModXNlcl9tb2RlKGdldF9pcnFfcmVncygpKSk7CiAJaXJxX2V4aXQoKTsKIH0KIAogI2lmZGVmIENPTkZJR19MT0NBTF9USU1FUlMKIGFzbWxpbmthZ2Ugdm9pZCBkb19sb2NhbF90aW1lcihzdHJ1Y3QgcHRfcmVncyAqcmVncykKIHsKKwlzdHJ1Y3QgcHRfcmVncyAqb2xkX3JlZ3MgPSBzZXRfaXJxX3JlZ3MocmVncyk7CiAJaW50IGNwdSA9IHNtcF9wcm9jZXNzb3JfaWQoKTsKIAogCWlmIChsb2NhbF90aW1lcl9hY2soKSkgewogCQlpcnFfc3RhdFtjcHVdLmxvY2FsX3RpbWVyX2lycXMrKzsKLQkJaXBpX3RpbWVyKHJlZ3MpOworCQlpcGlfdGltZXIoKTsKIAl9CisKKwlzZXRfaXJxX3JlZ3Mob2xkX3JlZ3MpOwogfQogI2VuZGlmCiAKQEAgLTU1MSw2ICs1NTQsNyBAQAogewogCXVuc2lnbmVkIGludCBjcHUgPSBzbXBfcHJvY2Vzc29yX2lkKCk7CiAJc3RydWN0IGlwaV9kYXRhICppcGkgPSAmcGVyX2NwdShpcGlfZGF0YSwgY3B1KTsKKwlzdHJ1Y3QgcHRfcmVncyAqb2xkX3JlZ3MgPSBzZXRfaXJxX3JlZ3MocmVncyk7CiAKIAlpcGktPmlwaV9jb3VudCsrOwogCkBAIC01NzQsNyArNTc4LDcgQEAKIAogCQkJc3dpdGNoIChuZXh0bXNnKSB7CiAJCQljYXNlIElQSV9USU1FUjoKLQkJCQlpcGlfdGltZXIocmVncyk7CisJCQkJaXBpX3RpbWVyKCk7CiAJCQkJYnJlYWs7CiAKIAkJCWNhc2UgSVBJX1JFU0NIRURVTEU6CkBAIC01OTksNiArNjAzLDggQEAKIAkJCX0KIAkJfSB3aGlsZSAobXNncyk7CiAJfQorCisJc2V0X2lycV9yZWdzKG9sZF9yZWdzKTsKIH0KIAogdm9pZCBzbXBfc2VuZF9yZXNjaGVkdWxlKGludCBjcHUpCmRpZmYgLS1naXQgYS9hcmNoL2FybS9rZXJuZWwvdGltZS5jIGIvYXJjaC9hcm0va2VybmVsL3RpbWUuYwppbmRleCBjMDNjYWI1Li42ZmY1ZTNmIDEwMDY0NAotLS0gYS9hcmNoL2FybS9rZXJuZWwvdGltZS5jCisrKyBiL2FyY2gvYXJtL2tlcm5lbC90aW1lLmMKQEAgLTIyMCwxMCArMjIwLDEwIEBACiAjaWZkZWYgQ09ORklHX0xFRFNfVElNRVIKIHN0YXRpYyBpbmxpbmUgdm9pZCBkb19sZWRzKHZvaWQpCiB7Ci0Jc3RhdGljIHVuc2lnbmVkIGludCBjb3VudCA9IDUwOworCXN0YXRpYyB1bnNpZ25lZCBpbnQgY291bnQgPSBIWi8yOwogCiAJaWYgKC0tY291bnQgPT0gMCkgewotCQljb3VudCA9IDUwOworCQljb3VudCA9IEhaLzI7CiAJCWxlZHNfZXZlbnQobGVkX3RpbWVyKTsKIAl9CiB9CkBAIC0zMjcsMTMgKzMyNywxMiBAQAogICovCiB2b2lkIHRpbWVyX3RpY2sodm9pZCkKIHsKLQlzdHJ1Y3QgcHRfcmVncyAqcmVncyA9IGdldF9pcnFfcmVncygpOwogCXByb2ZpbGVfdGljayhDUFVfUFJPRklMSU5HKTsKIAlkb19sZWRzKCk7CiAJZG9fc2V0X3J0YygpOwogCWRvX3RpbWVyKDEpOwogI2lmbmRlZiBDT05GSUdfU01QCi0JdXBkYXRlX3Byb2Nlc3NfdGltZXModXNlcl9tb2RlKHJlZ3MpKTsKKwl1cGRhdGVfcHJvY2Vzc190aW1lcyh1c2VyX21vZGUoZ2V0X2lycV9yZWdzKCkpKTsKICNlbmRpZgogfQogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9rZXJuZWwvdm1saW51eC5sZHMuUyBiL2FyY2gvYXJtL2tlcm5lbC92bWxpbnV4Lmxkcy5TCmluZGV4IDNjYTU3NGUuLmE4ZmE3NWUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2tlcm5lbC92bWxpbnV4Lmxkcy5TCisrKyBiL2FyY2gvYXJtL2tlcm5lbC92bWxpbnV4Lmxkcy5TCkBAIC00NSwxMyArNDUsNyBAQAogCQkJKiguZWFybHlfcGFyYW0uaW5pdCkKIAkJX19lYXJseV9lbmQgPSAuOwogCQlfX2luaXRjYWxsX3N0YXJ0ID0gLjsKLQkJCSooLmluaXRjYWxsMS5pbml0KQotCQkJKiguaW5pdGNhbGwyLmluaXQpCi0JCQkqKC5pbml0Y2FsbDMuaW5pdCkKLQkJCSooLmluaXRjYWxsNC5pbml0KQotCQkJKiguaW5pdGNhbGw1LmluaXQpCi0JCQkqKC5pbml0Y2FsbDYuaW5pdCkKLQkJCSooLmluaXRjYWxsNy5pbml0KQorCQkJSU5JVENBTExTCiAJCV9faW5pdGNhbGxfZW5kID0gLjsKIAkJX19jb25faW5pdGNhbGxfc3RhcnQgPSAuOwogCQkJKiguY29uX2luaXRjYWxsLmluaXQpCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWZvb3RicmlkZ2UvZGMyMTI4NS5jIGIvYXJjaC9hcm0vbWFjaC1mb290YnJpZGdlL2RjMjEyODUuYwppbmRleCBmYTVkNDk3Li4xNDYzMzMwIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWZvb3RicmlkZ2UvZGMyMTI4NS5jCisrKyBiL2FyY2gvYXJtL21hY2gtZm9vdGJyaWRnZS9kYzIxMjg1LmMKQEAgLTE2LDYgKzE2LDcgQEAKICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L2lycS5oPgogCiAjaW5jbHVkZSA8YXNtL2lvLmg+CiAjaW5jbHVkZSA8YXNtL2lycS5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1pb3AzMngvbjIxMDAuYyBiL2FyY2gvYXJtL21hY2gtaW9wMzJ4L24yMTAwLmMKaW5kZXggYTJjOTRhNC4uMjQ5OWE3NyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1pb3AzMngvbjIxMDAuYworKysgYi9hcmNoL2FybS9tYWNoLWlvcDMyeC9uMjEwMC5jCkBAIC04NSw3ICs4NSw3IEBACiAJCWlycSA9IElSUV9JT1AzMlhfWElOVDA7CiAJfSBlbHNlIGlmIChQQ0lfU0xPVChkZXYtPmRldmZuKSA9PSAyKSB7CiAJCS8qIFJUTDgxMTBTQiAjMiAqLwotCQlpcnEgPSBJUlFfSU9QMzJYX1hJTlQxOworCQlpcnEgPSBJUlFfSU9QMzJYX1hJTlQzOwogCX0gZWxzZSBpZiAoUENJX1NMT1QoZGV2LT5kZXZmbikgPT0gMykgewogCQkvKiBTaWwzNTEyICovCiAJCWlycSA9IElSUV9JT1AzMlhfWElOVDI7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWl4cDIwMDAvaXhkcDI0MDAuYyBiL2FyY2gvYXJtL21hY2gtaXhwMjAwMC9peGRwMjQwMC5jCmluZGV4IGE2ZjE0ODAuLjBmZGQwM2EgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtaXhwMjAwMC9peGRwMjQwMC5jCisrKyBiL2FyY2gvYXJtL21hY2gtaXhwMjAwMC9peGRwMjQwMC5jCkBAIC0xMzMsMTEgKzEzMywxMyBAQAogCXN0cnVjdCBwY2lfZGV2ICpkZXY7CiAKIAlpZiAoaXhkcDJ4MDBfbWFzdGVyX25wdSgpKSB7Ci0JCWRldiA9IHBjaV9maW5kX3Nsb3QoMSwgSVhEUDI0MDBfU0xBVkVfRU5FVF9ERVZGTik7CisJCWRldiA9IHBjaV9nZXRfYnVzX2FuZF9zbG90KDEsIElYRFAyNDAwX1NMQVZFX0VORVRfREVWRk4pOwogCQlwY2lfcmVtb3ZlX2J1c19kZXZpY2UoZGV2KTsKKwkJcGNpX2Rldl9wdXQoZGV2KTsKIAl9IGVsc2UgewotCQlkZXYgPSBwY2lfZmluZF9zbG90KDEsIElYRFAyNDAwX01BU1RFUl9FTkVUX0RFVkZOKTsKKwkJZGV2ID0gcGNpX2dldF9idXNfYW5kX3Nsb3QoMSwgSVhEUDI0MDBfTUFTVEVSX0VORVRfREVWRk4pOwogCQlwY2lfcmVtb3ZlX2J1c19kZXZpY2UoZGV2KTsKKwkJcGNpX2Rldl9wdXQoZGV2KTsKIAogCQlpeGRwMngwMF9zbGF2ZV9wY2lfcG9zdGluaXQoKTsKIAl9CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWl4cDIwMDAvaXhkcDI4MDAuYyBiL2FyY2gvYXJtL21hY2gtaXhwMjAwMC9peGRwMjgwMC5jCmluZGV4IDkxZDM2ZDkuLjcwZDI0N2YgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtaXhwMjAwMC9peGRwMjgwMC5jCisrKyBiL2FyY2gvYXJtL21hY2gtaXhwMjAwMC9peGRwMjgwMC5jCkBAIC0yNjEsMTQgKzI2MSwxNiBAQAogCiAJCXBjaV9jb21tb25faW5pdCgmaXhkcDI4MDBfcGNpKTsKIAkJaWYgKGl4ZHAyeDAwX21hc3Rlcl9ucHUoKSkgewotCQkJZGV2ID0gcGNpX2ZpbmRfc2xvdCgxLCBJWERQMjgwMF9TTEFWRV9FTkVUX0RFVkZOKTsKKwkJCWRldiA9IHBjaV9nZXRfYnVzX2FuZF9zbG90KDEsIElYRFAyODAwX1NMQVZFX0VORVRfREVWRk4pOwogCQkJcGNpX3JlbW92ZV9idXNfZGV2aWNlKGRldik7CisJCQlwY2lfZGV2X3B1dChkZXYpOwogCiAJCQlpeGRwMjgwMF9tYXN0ZXJfZW5hYmxlX3NsYXZlKCk7CiAJCQlpeGRwMjgwMF9tYXN0ZXJfd2FpdF9mb3Jfc2xhdmVfYnVzX3NjYW4oKTsKIAkJfSBlbHNlIHsKLQkJCWRldiA9IHBjaV9maW5kX3Nsb3QoMSwgSVhEUDI4MDBfTUFTVEVSX0VORVRfREVWRk4pOworCQkJZGV2ID0gcGNpX2dldF9idXNfYW5kX3Nsb3QoMSwgSVhEUDI4MDBfTUFTVEVSX0VORVRfREVWRk4pOwogCQkJcGNpX3JlbW92ZV9idXNfZGV2aWNlKGRldik7CisJCQlwY2lfZGV2X3B1dChkZXYpOwogCQl9CiAJfQogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWl4cDIwMDAvaXhkcDJ4MDAuYyBiL2FyY2gvYXJtL21hY2gtaXhwMjAwMC9peGRwMngwMC5jCmluZGV4IGFmNDhjYjUuLmFhMjY1NTAgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtaXhwMjAwMC9peGRwMngwMC5jCisrKyBiL2FyY2gvYXJtL21hY2gtaXhwMjAwMC9peGRwMngwMC5jCkBAIC0yNDEsMTEgKzI0MSwxNCBAQAogCS8qCiAJICogUmVtb3ZlIFBNQyBkZXZpY2UgaXMgdGhlcmUgaXMgb25lCiAJICovCi0JaWYoKGRldiA9IHBjaV9maW5kX3Nsb3QoMSwgSVhEUDJYMDBfUE1DX0RFVkZOKSkpCisJaWYoKGRldiA9IHBjaV9nZXRfYnVzX2FuZF9zbG90KDEsIElYRFAyWDAwX1BNQ19ERVZGTikpKSB7CiAJCXBjaV9yZW1vdmVfYnVzX2RldmljZShkZXYpOworCQlwY2lfZGV2X3B1dChkZXYpOworCX0KIAotCWRldiA9IHBjaV9maW5kX3Nsb3QoMCwgSVhEUDJYMDBfMjE1NTVfREVWRk4pOworCWRldiA9IHBjaV9nZXRfYnVzX2FuZF9zbG90KDAsIElYRFAyWDAwXzIxNTU1X0RFVkZOKTsKIAlwY2lfcmVtb3ZlX2J1c19kZXZpY2UoZGV2KTsKKwlwY2lfZGV2X3B1dChkZXYpOwogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtaXhwNHh4L2NvbW1vbi5jIGIvYXJjaC9hcm0vbWFjaC1peHA0eHgvY29tbW9uLmMKaW5kZXggYzc1MTNmNi4uZmJlMjg4YSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1peHA0eHgvY29tbW9uLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1peHA0eHgvY29tbW9uLmMKQEAgLTg2LDcgKzg2LDggQEAKIAlJWFA0WFhfSVJRX0xFVkVMLCBJWFA0WFhfSVJRX0VER0UKIH07CiAKLXN0YXRpYyB2b2lkIGl4cDR4eF9jb25maWdfaXJxKHVuc2lnbmVkIGlycSwgZW51bSBpeHA0eHhfaXJxX3R5cGUgdHlwZSk7CisvKiBFYWNoIGJpdCByZXByZXNlbnRzIGFuIElSUTogMTogZWRnZS10cmlnZ2VyZWQsIDA6IGxldmVsIHRyaWdnZXJlZCAqLworc3RhdGljIHVuc2lnbmVkIGxvbmcgbG9uZyBpeHA0eHhfaXJxX2VkZ2UgPSAwOwogCiAvKgogICogSVJRIC0+IEdQSU8gbWFwcGluZyB0YWJsZQpAQCAtMTM1LDcgKzEzNiwxMSBAQAogCWRlZmF1bHQ6CiAJCXJldHVybiAtRUlOVkFMOwogCX0KLQlpeHA0eHhfY29uZmlnX2lycShpcnEsIGlycV90eXBlKTsKKworCWlmIChpcnFfdHlwZSA9PSBJWFA0WFhfSVJRX0VER0UpCisJCWl4cDR4eF9pcnFfZWRnZSB8PSAoMSA8PCBpcnEpOworCWVsc2UKKwkJaXhwNHh4X2lycV9lZGdlICY9IH4oMSA8PCBpcnEpOwogCiAJaWYgKGxpbmUgPj0gOCkgewkvKiBwaW5zIDgtMTUgKi8KIAkJbGluZSAtPSA4OwpAQCAtMTY3LDE0ICsxNzIsNiBAQAogCQkqSVhQNFhYX0lDTVIgJj0gfigxIDw8IGlycSk7CiB9CiAKLXN0YXRpYyB2b2lkIGl4cDR4eF9pcnFfdW5tYXNrKHVuc2lnbmVkIGludCBpcnEpCi17Ci0JaWYgKGNwdV9pc19peHA0NngoKSAmJiBpcnEgPj0gMzIpCi0JCSpJWFA0WFhfSUNNUjIgfD0gKDEgPDwgKGlycSAtIDMyKSk7Ci0JZWxzZQotCQkqSVhQNFhYX0lDTVIgfD0gKDEgPDwgaXJxKTsKLX0KLQogc3RhdGljIHZvaWQgaXhwNHh4X2lycV9hY2sodW5zaWduZWQgaW50IGlycSkKIHsKIAlpbnQgbGluZSA9IChpcnEgPCAzMikgPyBpcnEyZ3Bpb1tpcnFdIDogLTE7CkBAIC0xODcsNDEgKzE4NCwyNSBAQAogICogTGV2ZWwgdHJpZ2dlcmVkIGludGVycnVwdHMgb24gR1BJTyBsaW5lcyBjYW4gb25seSBiZSBjbGVhcmVkIHdoZW4gdGhlCiAgKiBpbnRlcnJ1cHQgY29uZGl0aW9uIGRpc2FwcGVhcnMuCiAgKi8KLXN0YXRpYyB2b2lkIGl4cDR4eF9pcnFfbGV2ZWxfdW5tYXNrKHVuc2lnbmVkIGludCBpcnEpCitzdGF0aWMgdm9pZCBpeHA0eHhfaXJxX3VubWFzayh1bnNpZ25lZCBpbnQgaXJxKQogewotCWl4cDR4eF9pcnFfYWNrKGlycSk7Ci0JaXhwNHh4X2lycV91bm1hc2soaXJxKTsKKwlpZiAoIShpeHA0eHhfaXJxX2VkZ2UgJiAoMSA8PCBpcnEpKSkKKwkJaXhwNHh4X2lycV9hY2soaXJxKTsKKworCWlmIChjcHVfaXNfaXhwNDZ4KCkgJiYgaXJxID49IDMyKQorCQkqSVhQNFhYX0lDTVIyIHw9ICgxIDw8IChpcnEgLSAzMikpOworCWVsc2UKKwkJKklYUDRYWF9JQ01SIHw9ICgxIDw8IGlycSk7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgaXJxY2hpcCBpeHA0eHhfaXJxX2xldmVsX2NoaXAgPSB7Ci0JLmFjawkJPSBpeHA0eHhfaXJxX21hc2ssCi0JLm1hc2sJCT0gaXhwNHh4X2lycV9tYXNrLAotCS51bm1hc2sJCT0gaXhwNHh4X2lycV9sZXZlbF91bm1hc2ssCi0JLnNldF90eXBlCT0gaXhwNHh4X3NldF9pcnFfdHlwZSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgaXJxY2hpcCBpeHA0eHhfaXJxX2VkZ2VfY2hpcCA9IHsKK3N0YXRpYyBzdHJ1Y3QgaXJxY2hpcCBpeHA0eHhfaXJxX2NoaXAgPSB7CisJLm5hbWUJCT0gIklYUDR4eCIsCiAJLmFjawkJPSBpeHA0eHhfaXJxX2FjaywKIAkubWFzawkJPSBpeHA0eHhfaXJxX21hc2ssCiAJLnVubWFzawkJPSBpeHA0eHhfaXJxX3VubWFzaywKIAkuc2V0X3R5cGUJPSBpeHA0eHhfc2V0X2lycV90eXBlLAogfTsKIAotc3RhdGljIHZvaWQgaXhwNHh4X2NvbmZpZ19pcnEodW5zaWduZWQgaXJxLCBlbnVtIGl4cDR4eF9pcnFfdHlwZSB0eXBlKQotewotCXN3aXRjaCAodHlwZSkgewotCWNhc2UgSVhQNFhYX0lSUV9MRVZFTDoKLQkJc2V0X2lycV9jaGlwKGlycSwgJml4cDR4eF9pcnFfbGV2ZWxfY2hpcCk7Ci0JCXNldF9pcnFfaGFuZGxlcihpcnEsIGRvX2xldmVsX0lSUSk7Ci0JCWJyZWFrOwotCWNhc2UgSVhQNFhYX0lSUV9FREdFOgotCQlzZXRfaXJxX2NoaXAoaXJxLCAmaXhwNHh4X2lycV9lZGdlX2NoaXApOwotCQlzZXRfaXJxX2hhbmRsZXIoaXJxLCBkb19lZGdlX0lSUSk7Ci0JCWJyZWFrOwotCX0KLQlzZXRfaXJxX2ZsYWdzKGlycSwgSVJRRl9WQUxJRCk7Ci19Ci0KIHZvaWQgX19pbml0IGl4cDR4eF9pbml0X2lycSh2b2lkKQogewogCWludCBpID0gMDsKQEAgLTI0MSw4ICsyMjIsMTEgQEAKIAl9CiAKICAgICAgICAgLyogRGVmYXVsdCB0byBhbGwgbGV2ZWwgdHJpZ2dlcmVkICovCi0JZm9yKGkgPSAwOyBpIDwgTlJfSVJRUzsgaSsrKQotCQlpeHA0eHhfY29uZmlnX2lycShpLCBJWFA0WFhfSVJRX0xFVkVMKTsKKwlmb3IoaSA9IDA7IGkgPCBOUl9JUlFTOyBpKyspIHsKKwkJc2V0X2lycV9jaGlwKGksICZpeHA0eHhfaXJxX2NoaXApOworCQlzZXRfaXJxX2hhbmRsZXIoaSwgZG9fbGV2ZWxfSVJRKTsKKwkJc2V0X2lycV9mbGFncyhpLCBJUlFGX1ZBTElEKTsKKwl9CiB9CiAKIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1saDdhNDB4L0tjb25maWcgYi9hcmNoL2FybS9tYWNoLWxoN2E0MHgvS2NvbmZpZwppbmRleCA1NThhMzRmLi4xNDdiMDE5IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWxoN2E0MHgvS2NvbmZpZworKysgYi9hcmNoL2FybS9tYWNoLWxoN2E0MHgvS2NvbmZpZwpAQCAtMTQsNyArMTQsNyBAQAogCWJvb2wgIkxQRDdBNDAwIENhcmQgRW5naW5lIgogCXNlbGVjdCBBUkNIX0xIN0E0MDAKICMJc2VsZWN0IElERV9QT0xMCi0Jc2VsZWN0IEhBU19UT1VDSFNDUkVFTl9BRFM3ODQzX0xINworIwlzZWxlY3QgSEFTX1RPVUNIU0NSRUVOX0FEUzc4NDNfTEg3CiAJaGVscAogCSAgU2F5IFkgaGVyZSBpZiB5b3UgYXJlIHVzaW5nIExvZ2ljIFByb2R1Y3QgRGV2ZWxvcG1lbnQncwogCSAgTFBEN0E0MDAgQ2FyZEVuZ2luZS4gIEZvciB0aGUgdGltZSBiZWluZywgdGhlIExQRDdBNDAwIGFuZApAQCAtMjQsNyArMjQsNyBAQAogCWJvb2wgIkxQRDdBNDA0IENhcmQgRW5naW5lIgogCXNlbGVjdCBBUkNIX0xIN0E0MDQKICMJc2VsZWN0IElERV9QT0xMCi0Jc2VsZWN0IEhBU19UT1VDSFNDUkVFTl9BRENfTEg3CisjCXNlbGVjdCBIQVNfVE9VQ0hTQ1JFRU5fQURDX0xINwogCWhlbHAKIAkgIFNheSBZIGhlcmUgaWYgeW91IGFyZSB1c2luZyBMb2dpYyBQcm9kdWN0IERldmVsb3BtZW50J3MKIAkgIExQRDdBNDA0IENhcmRFbmdpbmUuIEZvciB0aGUgdGltZSBiZWluZywgdGhlIExQRDdBNDAwIGFuZApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1saDdhNDB4L2NvbW1vbi5oIGIvYXJjaC9hcm0vbWFjaC1saDdhNDB4L2NvbW1vbi5oCmluZGV4IDE4ZThiYjQuLjBjYTIwYzYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtbGg3YTQweC9jb21tb24uaAorKysgYi9hcmNoL2FybS9tYWNoLWxoN2E0MHgvY29tbW9uLmgKQEAgLTE1LDQgKzE1LDQgQEAKIGV4dGVybiB2b2lkIGxoN2E0MHhfY2xjZF9pbml0ICh2b2lkKTsKIGV4dGVybiB2b2lkIGxoN2E0MHhfaW5pdF9ib2FyZF9pcnEgKHZvaWQpOwogCi0jZGVmaW5lIElSUV9ESVNQQVRDSChpcnEpIGRlc2NfaGFuZGxlX2lycSgoaXJxKSwoaXJxX2Rlc2MgKyBpcnEpLCByZWdzKQorI2RlZmluZSBJUlFfRElTUEFUQ0goaXJxKSBkZXNjX2hhbmRsZV9pcnEoKGlycSksKGlycV9kZXNjICsgaXJxKSkKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtcG54NDAwOC9jb3JlLmMgYi9hcmNoL2FybS9tYWNoLXBueDQwMDgvY29yZS5jCmluZGV4IDNkNzNjMWUuLjQyOWM3OTYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtcG54NDAwOC9jb3JlLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1wbng0MDA4L2NvcmUuYwpAQCAtMTMzLDEwICsxMzMsNzkgQEAKIAl9LAogfTsKIAorc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgbmFuZF9mbGFzaF9kZXZpY2UgPSB7CisJLm5hbWUgPSAicG54NDAwOC1mbGFzaCIsCisJLmlkID0gLTEsCisJLmRldiA9IHsKKwkJLmNvaGVyZW50X2RtYV9tYXNrID0gMHhGRkZGRkZGRiwKKwl9LAorfTsKKworLyogVGhlIGRtYW1hc2sgbXVzdCBiZSBzZXQgZm9yIE9IQ0kgdG8gd29yayAqLworc3RhdGljIHU2NCBvaGNpX2RtYW1hc2sgPSB+KHUzMikgMDsKKworc3RhdGljIHN0cnVjdCByZXNvdXJjZSBvaGNpX3Jlc291cmNlc1tdID0geworCXsKKwkJLnN0YXJ0ID0gSU9fQUREUkVTUyhQTlg0MDA4X1VTQl9DT05GSUdfQkFTRSksCisJCS5lbmQgPSBJT19BRERSRVNTKFBOWDQwMDhfVVNCX0NPTkZJR19CQVNFICsgMHgxMDApLAorCQkuZmxhZ3MgPSBJT1JFU09VUkNFX01FTSwKKwl9LCB7CisJCS5zdGFydCA9IFVTQl9IT1NUX0lOVCwKKwkJLmZsYWdzID0gSU9SRVNPVVJDRV9JUlEsCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIG9oY2lfZGV2aWNlID0geworCS5uYW1lID0gInBueDQwMDgtdXNiLW9oY2kiLAorCS5pZCA9IC0xLAorCS5kZXYgPSB7CisJCS5kbWFfbWFzayA9ICZvaGNpX2RtYW1hc2ssCisJCS5jb2hlcmVudF9kbWFfbWFzayA9IDB4ZmZmZmZmZmYsCisJCX0sCisJLm51bV9yZXNvdXJjZXMgPSBBUlJBWV9TSVpFKG9oY2lfcmVzb3VyY2VzKSwKKwkucmVzb3VyY2UgPSBvaGNpX3Jlc291cmNlcywKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHNkdW1fZGV2aWNlID0geworCS5uYW1lID0gInBueDQwMDgtc2R1bSIsCisJLmlkID0gMCwKKwkuZGV2ID0geworCQkuY29oZXJlbnRfZG1hX21hc2sgPSAweGZmZmZmZmZmLAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSByZ2JmYl9kZXZpY2UgPSB7CisJLm5hbWUgPSAicG54NDAwOC1yZ2JmYiIsCisJLmlkID0gMCwKKwkuZGV2ID0geworCQkuY29oZXJlbnRfZG1hX21hc2sgPSAweGZmZmZmZmZmLAorCX0KK307CisKK3N0cnVjdCByZXNvdXJjZSB3YXRjaGRvZ19yZXNvdXJjZXNbXSA9IHsKKwl7CisJCS5zdGFydCA9IFBOWDQwMDhfV0RPR19CQVNFLAorCQkuZW5kID0gUE5YNDAwOF9XRE9HX0JBU0UgKyBTWl80SyAtIDEsCisJCS5mbGFncyA9IElPUkVTT1VSQ0VfTUVNLAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSB3YXRjaGRvZ19kZXZpY2UgPSB7CisJLm5hbWUgPSAicG54NDAwOC13YXRjaGRvZyIsCisJLmlkID0gLTEsCisJLm51bV9yZXNvdXJjZXMgPSBBUlJBWV9TSVpFKHdhdGNoZG9nX3Jlc291cmNlcyksCisJLnJlc291cmNlID0gd2F0Y2hkb2dfcmVzb3VyY2VzLAorfTsKKwogc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmRldmljZXNbXSBfX2luaXRkYXRhID0gewogCSZzcGlwbnhfMSwKIAkmc3BpcG54XzIsCiAJJnNlcmlhbF9kZXZpY2UsCisJJm9oY2lfZGV2aWNlLAorCSZuYW5kX2ZsYXNoX2RldmljZSwKKwkmc2R1bV9kZXZpY2UsCisJJnJnYmZiX2RldmljZSwKKwkmd2F0Y2hkb2dfZGV2aWNlLAogfTsKIAogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXB4YS9sdWJib2NrLmMgYi9hcmNoL2FybS9tYWNoLXB4YS9sdWJib2NrLmMKaW5kZXggZWU4MGQ2Mi4uMTQyYzMzYyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1weGEvbHViYm9jay5jCisrKyBiL2FyY2gvYXJtL21hY2gtcHhhL2x1YmJvY2suYwpAQCAtMzk3LDcgKzM5Nyw3IEBACiAJaWYgKExVQl9JUlFfU0VUX0NMUiAmICgxIDw8IDApKQogCQltb2RfdGltZXIoJm1tY190aW1lciwgamlmZmllcyArIE1NQ19QT0xMX1JBVEUpOwogCWVsc2UgewotCQkodm9pZCkgbW1jX2RldGVjdF9pbnQoTFVCQk9DS19TRF9JUlEsICh2b2lkICopZGF0YSwgTlVMTCk7CisJCSh2b2lkKSBtbWNfZGV0ZWN0X2ludChMVUJCT0NLX1NEX0lSUSwgKHZvaWQgKilkYXRhKTsKIAkJZW5hYmxlX2lycShMVUJCT0NLX1NEX0lSUSk7CiAJfQogfQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL2dwaW8uYyBiL2FyY2gvYXJtL21hY2gtczNjMjQxMC9ncGlvLmMKaW5kZXggZGI2MzkzYy4uYmEzNDY1NCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL2dwaW8uYworKysgYi9hcmNoL2FybS9tYWNoLXMzYzI0MTAvZ3Bpby5jCkBAIC0zLDcgKzMsNyBAQAogICogQ29weXJpZ2h0IChjKSAyMDA0LTIwMDUgU2ltdGVjIEVsZWN0cm9uaWNzCiAgKglCZW4gRG9va3MgPGJlbkBzaW10ZWMuY28udWs+CiAgKgotICogUzNDMjQxMCBHUElPIHN1cHBvcnQKKyAqIFMzQzI0WFggR1BJTyBzdXBwb3J0CiAgKgogICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKICAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CkBAIC0xNjMsMyArMTYzLDIyIEBACiB9CiAKIEVYUE9SVF9TWU1CT0woczNjMjQxMF9tb2RpZnlfbWlzY2NyKTsKKworaW50IHMzYzI0MTBfZ3Bpb19nZXRpcnEodW5zaWduZWQgaW50IHBpbikKK3sKKwlpZiAocGluIDwgUzNDMjQxMF9HUEYwIHx8IHBpbiA+IFMzQzI0MTBfR1BHMTUpCisJCXJldHVybiAtMTsJLyogbm90IHZhbGlkIGludGVycnVwdHMgKi8KKworCWlmIChwaW4gPCBTM0MyNDEwX0dQRzAgJiYgcGluID4gUzNDMjQxMF9HUEY3KQorCQlyZXR1cm4gLTE7CS8qIG5vdCB2YWxpZCBwaW4gKi8KKworCWlmIChwaW4gPCBTM0MyNDEwX0dQRjQpCisJCXJldHVybiAocGluIC0gUzNDMjQxMF9HUEYwKSArIElSUV9FSU5UMDsKKworCWlmIChwaW4gPCBTM0MyNDEwX0dQRzApCisJCXJldHVybiAocGluIC0gUzNDMjQxMF9HUEY0KSArIElSUV9FSU5UNDsKKworCXJldHVybiAocGluIC0gUzNDMjQxMF9HUEcwKSArIElSUV9FSU5UODsKK30KKworRVhQT1JUX1NZTUJPTChzM2MyNDEwX2dwaW9fZ2V0aXJxKTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtczNjMjQxMC9zM2MyNDEwLWdwaW8uYyBiL2FyY2gvYXJtL21hY2gtczNjMjQxMC9zM2MyNDEwLWdwaW8uYwppbmRleCBhMjA5OGY2Li5lYzNhMjc2IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXMzYzI0MTAvczNjMjQxMC1ncGlvLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL3MzYzI0MTAtZ3Bpby5jCkBAIC02OSwyMiArNjksMyBAQAogfQogCiBFWFBPUlRfU1lNQk9MKHMzYzI0MTBfZ3Bpb19pcnFmaWx0ZXIpOwotCi1pbnQgczNjMjQxMF9ncGlvX2dldGlycSh1bnNpZ25lZCBpbnQgcGluKQotewotCWlmIChwaW4gPCBTM0MyNDEwX0dQRjAgfHwgcGluID4gUzNDMjQxMF9HUEcxNSkKLQkJcmV0dXJuIC0xOwkvKiBub3QgdmFsaWQgaW50ZXJydXB0cyAqLwotCi0JaWYgKHBpbiA8IFMzQzI0MTBfR1BHMCAmJiBwaW4gPiBTM0MyNDEwX0dQRjcpCi0JCXJldHVybiAtMTsJLyogbm90IHZhbGlkIHBpbiAqLwotCi0JaWYgKHBpbiA8IFMzQzI0MTBfR1BGNCkKLQkJcmV0dXJuIChwaW4gLSBTM0MyNDEwX0dQRjApICsgSVJRX0VJTlQwOwotCi0JaWYgKHBpbiA8IFMzQzI0MTBfR1BHMCkKLQkJcmV0dXJuIChwaW4gLSBTM0MyNDEwX0dQRjQpICsgSVJRX0VJTlQ0OwotCi0JcmV0dXJuIChwaW4gLSBTM0MyNDEwX0dQRzApICsgSVJRX0VJTlQ4OwotfQotCi1FWFBPUlRfU1lNQk9MKHMzYzI0MTBfZ3Bpb19nZXRpcnEpOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zYTExMDAvY3B1LXNhMTExMC5jIGIvYXJjaC9hcm0vbWFjaC1zYTExMDAvY3B1LXNhMTExMC5jCmluZGV4IDYzOTU5NzcuLjc4ZjRjMTMgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtc2ExMTAwL2NwdS1zYTExMTAuYworKysgYi9hcmNoL2FybS9tYWNoLXNhMTEwMC9jcHUtc2ExMTEwLmMKQEAgLTgyLDYgKzgyLDE0IEBACiAJCS50d3IJCT0gOSwKIAkJLnJlZnJlc2gJPSA2NDAwMCwKIAkJLmNhc19sYXRlbmN5CT0gMywKKwl9LCB7ICAgIC8qIFNhbXN1bmcgSzRTMjgxNjMyQi0xSCAqLworCSAgICAgICAgLm5hbWUgICAgICAgICAgID0gIks0UzI4MTYzMkItMUgiLAorCQkucm93cyAgICAgICAgICAgPSAxMiwKKwkJLnRjayAgICAgICAgICAgID0gMTAsCisJCS50cnAgICAgICAgICAgICA9IDIwLAorCQkudHdyICAgICAgICAgICAgPSAxMCwKKwkJLnJlZnJlc2ggICAgICAgID0gNjQwMDAsCisJCS5jYXNfbGF0ZW5jeSAgICA9IDMsCiAJfSwgewkvKiBTYW1zdW5nIEtNNDE2UzQwMzBDVCAqLwogCQkubmFtZQkJPSAiS000MTZTNDAzMENUIiwKIAkJLnJvd3MJCT0gMTMsCkBAIC0zNjYsNiArMzc0LDggQEAKIAogCQlpZiAobWFjaGluZV9pc19oMzEwMCgpKQogCQkJbmFtZSA9ICJLTTQxNlM0MDMwQ1QiOworCQlpZiAobWFjaGluZV9pc19qb3JuYWRhNzIwKCkpCisJCSAgICAgICAgbmFtZSA9ICJLNFMyODE2MzJCLTFIIjsKIAl9CiAKIAlzZHJhbSA9IHNhMTExMF9maW5kX3NkcmFtKG5hbWUpOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC12ZXJzYXRpbGUvY29yZS5jIGIvYXJjaC9hcm0vbWFjaC12ZXJzYXRpbGUvY29yZS5jCmluZGV4IDJhYTE1MGIuLjNiODU3NjEgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtdmVyc2F0aWxlL2NvcmUuYworKysgYi9hcmNoL2FybS9tYWNoLXZlcnNhdGlsZS9jb3JlLmMKQEAgLTE4OCwxMiArMTg4LDEyIEBACiAJCS5sZW5ndGgJCT0gU1pfNEssCiAJCS50eXBlCQk9IE1UX0RFVklDRQogCX0sIHsKLQkJLnZpcnR1YWwJPSAgVkVSU0FUSUxFX1BDSV9WSVJUX0JBU0UsCisJCS52aXJ0dWFsCT0gICh1bnNpZ25lZCBsb25nKVZFUlNBVElMRV9QQ0lfVklSVF9CQVNFLAogCQkucGZuCQk9IF9fcGh5c190b19wZm4oVkVSU0FUSUxFX1BDSV9CQVNFKSwKIAkJLmxlbmd0aAkJPSBWRVJTQVRJTEVfUENJX0JBU0VfU0laRSwKIAkJLnR5cGUJCT0gTVRfREVWSUNFCiAJfSwgewotCQkudmlydHVhbAk9ICBWRVJTQVRJTEVfUENJX0NGR19WSVJUX0JBU0UsCisJCS52aXJ0dWFsCT0gICh1bnNpZ25lZCBsb25nKVZFUlNBVElMRV9QQ0lfQ0ZHX1ZJUlRfQkFTRSwKIAkJLnBmbgkJPSBfX3BoeXNfdG9fcGZuKFZFUlNBVElMRV9QQ0lfQ0ZHX0JBU0UpLAogCQkubGVuZ3RoCQk9IFZFUlNBVElMRV9QQ0lfQ0ZHX0JBU0VfU0laRSwKIAkJLnR5cGUJCT0gTVRfREVWSUNFCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXZlcnNhdGlsZS9wY2kuYyBiL2FyY2gvYXJtL21hY2gtdmVyc2F0aWxlL3BjaS5jCmluZGV4IDEzYmJkMDguLjVjZDBiNWQgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtdmVyc2F0aWxlL3BjaS5jCisrKyBiL2FyY2gvYXJtL21hY2gtdmVyc2F0aWxlL3BjaS5jCkBAIC00MCwxNCArNDAsMTUgQEAKICAqIENmZyAgIDQyMDAwMDAwIC0gNDJGRkZGRkYJICBQQ0kgY29uZmlnCiAgKgogICovCi0jZGVmaW5lIFNZU19QQ0lDVEwJCQlJT19BRERSRVNTKFZFUlNBVElMRV9TWVNfUENJQ1RMKQotI2RlZmluZSBQQ0lfSU1BUDAJCQlJT19BRERSRVNTKFZFUlNBVElMRV9QQ0lfQ09SRV9CQVNFKzB4MCkKLSNkZWZpbmUgUENJX0lNQVAxCQkJSU9fQUREUkVTUyhWRVJTQVRJTEVfUENJX0NPUkVfQkFTRSsweDQpCi0jZGVmaW5lIFBDSV9JTUFQMgkJCUlPX0FERFJFU1MoVkVSU0FUSUxFX1BDSV9DT1JFX0JBU0UrMHg4KQotI2RlZmluZSBQQ0lfU01BUDAJCQlJT19BRERSRVNTKFZFUlNBVElMRV9QQ0lfQ09SRV9CQVNFKzB4MTApCi0jZGVmaW5lIFBDSV9TTUFQMQkJCUlPX0FERFJFU1MoVkVSU0FUSUxFX1BDSV9DT1JFX0JBU0UrMHgxNCkKLSNkZWZpbmUgUENJX1NNQVAyCQkJSU9fQUREUkVTUyhWRVJTQVRJTEVfUENJX0NPUkVfQkFTRSsweDE4KQotI2RlZmluZSBQQ0lfU0VMRklECQkJSU9fQUREUkVTUyhWRVJTQVRJTEVfUENJX0NPUkVfQkFTRSsweGMpCisjZGVmaW5lIF9fSU9fQUREUkVTUyhuKSAoKHZvaWQgX19pb21lbSAqKSh1bnNpZ25lZCBsb25nKUlPX0FERFJFU1MobikpCisjZGVmaW5lIFNZU19QQ0lDVEwJCV9fSU9fQUREUkVTUyhWRVJTQVRJTEVfU1lTX1BDSUNUTCkKKyNkZWZpbmUgUENJX0lNQVAwCQlfX0lPX0FERFJFU1MoVkVSU0FUSUxFX1BDSV9DT1JFX0JBU0UrMHgwKQorI2RlZmluZSBQQ0lfSU1BUDEJCV9fSU9fQUREUkVTUyhWRVJTQVRJTEVfUENJX0NPUkVfQkFTRSsweDQpCisjZGVmaW5lIFBDSV9JTUFQMgkJX19JT19BRERSRVNTKFZFUlNBVElMRV9QQ0lfQ09SRV9CQVNFKzB4OCkKKyNkZWZpbmUgUENJX1NNQVAwCQlfX0lPX0FERFJFU1MoVkVSU0FUSUxFX1BDSV9DT1JFX0JBU0UrMHgxMCkKKyNkZWZpbmUgUENJX1NNQVAxCQlfX0lPX0FERFJFU1MoVkVSU0FUSUxFX1BDSV9DT1JFX0JBU0UrMHgxNCkKKyNkZWZpbmUgUENJX1NNQVAyCQlfX0lPX0FERFJFU1MoVkVSU0FUSUxFX1BDSV9DT1JFX0JBU0UrMHgxOCkKKyNkZWZpbmUgUENJX1NFTEZJRAkJX19JT19BRERSRVNTKFZFUlNBVElMRV9QQ0lfQ09SRV9CQVNFKzB4YykKIAogI2RlZmluZSBERVZJQ0VfSURfT0ZGU0VUCQkweDAwCiAjZGVmaW5lIENTUl9PRkZTRVQJCQkweDA0CkBAIC03Niw3ICs3Nyw3IEBACiBfX3NldHVwKCJwY2lfc2xvdF9pZ25vcmU9IiwgdmVyc2F0aWxlX3BjaV9zbG90X2lnbm9yZSk7CiAKIAotc3RhdGljIHVuc2lnbmVkIGxvbmcgX19wY2lfYWRkcihzdHJ1Y3QgcGNpX2J1cyAqYnVzLAorc3RhdGljIHZvaWQgX19pb21lbSAqX19wY2lfYWRkcihzdHJ1Y3QgcGNpX2J1cyAqYnVzLAogCQkJCXVuc2lnbmVkIGludCBkZXZmbiwgaW50IG9mZnNldCkKIHsKIAl1bnNpZ25lZCBpbnQgYnVzbnIgPSBidXMtPm51bWJlcjsKQEAgLTkxLDE0ICs5MiwxNCBAQAogCWlmIChkZXZmbiA+IDI1NSkKIAkJQlVHKCk7CiAKLQlyZXR1cm4gKFZFUlNBVElMRV9QQ0lfQ0ZHX1ZJUlRfQkFTRSB8IChidXNuciA8PCAxNikgfAorCXJldHVybiBWRVJTQVRJTEVfUENJX0NGR19WSVJUX0JBU0UgKyAoKGJ1c25yIDw8IDE2KSB8CiAJCShQQ0lfU0xPVChkZXZmbikgPDwgMTEpIHwgKFBDSV9GVU5DKGRldmZuKSA8PCA4KSB8IG9mZnNldCk7CiB9CiAKIHN0YXRpYyBpbnQgdmVyc2F0aWxlX3JlYWRfY29uZmlnKHN0cnVjdCBwY2lfYnVzICpidXMsIHVuc2lnbmVkIGludCBkZXZmbiwgaW50IHdoZXJlLAogCQkJCSBpbnQgc2l6ZSwgdTMyICp2YWwpCiB7Ci0JdW5zaWduZWQgbG9uZyBhZGRyID0gX19wY2lfYWRkcihidXMsIGRldmZuLCB3aGVyZSk7CisJdm9pZCBfX2lvbWVtICphZGRyID0gX19wY2lfYWRkcihidXMsIGRldmZuLCB3aGVyZSAmIH4zKTsKIAl1MzIgdjsKIAlpbnQgc2xvdCA9IFBDSV9TTE9UKGRldmZuKTsKIApAQCAtMTIxLDEzICsxMjIsMTIgQEAKIAkJCWJyZWFrOwogCiAJCWNhc2UgMjoKLQkJCXYgPSBfX3Jhd19yZWFkbChhZGRyICYgfjMpOwotCQkJaWYgKGFkZHIgJiAyKSB2ID4+PSAxNjsKKwkJCXYgPSBfX3Jhd19yZWFkbChhZGRyKTsKKwkJCWlmICh3aGVyZSAmIDIpIHYgPj49IDE2OwogIAkJCXYgJj0gMHhmZmZmOwogCQkJYnJlYWs7CiAKIAkJZGVmYXVsdDoKLQkJCWFkZHIgJj0gfjM7CiAJCQl2ID0gX19yYXdfcmVhZGwoYWRkcik7CiAJCQlicmVhazsKIAkJfQpAQCAtMTQwLDcgKzE0MCw3IEBACiBzdGF0aWMgaW50IHZlcnNhdGlsZV93cml0ZV9jb25maWcoc3RydWN0IHBjaV9idXMgKmJ1cywgdW5zaWduZWQgaW50IGRldmZuLCBpbnQgd2hlcmUsCiAJCQkJICBpbnQgc2l6ZSwgdTMyIHZhbCkKIHsKLQl1bnNpZ25lZCBsb25nIGFkZHIgPSBfX3BjaV9hZGRyKGJ1cywgZGV2Zm4sIHdoZXJlKTsKKwl2b2lkIF9faW9tZW0gKmFkZHIgPSBfX3BjaV9hZGRyKGJ1cywgZGV2Zm4sIHdoZXJlKTsKIAlpbnQgc2xvdCA9IFBDSV9TTE9UKGRldmZuKTsKIAogCWlmIChwY2lfc2xvdF9pZ25vcmUgJiAoMSA8PCBzbG90KSkgewpAQCAtMjc5LDcgKzI3OSw3IEBACiAJcHJpbnRrKCJQQ0kgY29yZSBmb3VuZCAoc2xvdCAlZClcbiIsbXlzbG90KTsKIAogCV9fcmF3X3dyaXRlbChteXNsb3QsIFBDSV9TRUxGSUQpOwotCWxvY2FsX3BjaV9jZmdfYmFzZSA9ICh2b2lkICopIFZFUlNBVElMRV9QQ0lfQ0ZHX1ZJUlRfQkFTRSArIChteXNsb3QgPDwgMTEpOworCWxvY2FsX3BjaV9jZmdfYmFzZSA9IFZFUlNBVElMRV9QQ0lfQ0ZHX1ZJUlRfQkFTRSArIChteXNsb3QgPDwgMTEpOwogCiAJdmFsID0gX19yYXdfcmVhZGwobG9jYWxfcGNpX2NmZ19iYXNlICsgQ1NSX09GRlNFVCk7CiAJdmFsIHw9IFBDSV9DT01NQU5EX01FTU9SWSB8IFBDSV9DT01NQU5EX01BU1RFUiB8IFBDSV9DT01NQU5EX0lOVkFMSURBVEU7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tbS9pbml0LmMgYi9hcmNoL2FybS9tbS9pbml0LmMKaW5kZXggMjIyMTdmZS4uYjU4MTRiNCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbW0vaW5pdC5jCisrKyBiL2FyY2gvYXJtL21tL2luaXQuYwpAQCAtMzIsNDAgKzMyLDUxIEBACiBleHRlcm4gdW5zaWduZWQgbG9uZyBwaHlzX2luaXRyZF9zaXplOwogCiAvKgotICogVGhlIHNvbGUgdXNlIG9mIHRoaXMgaXMgdG8gcGFzcyBtZW1vcnkgY29uZmlndXJhdGlvbgotICogZGF0YSBmcm9tIHBhZ2luZ19pbml0IHRvIG1lbV9pbml0LgorICogVGhpcyBpcyB1c2VkIHRvIHBhc3MgbWVtb3J5IGNvbmZpZ3VyYXRpb24gZGF0YSBmcm9tIHBhZ2luZ19pbml0CisgKiB0byBtZW1faW5pdCwgYW5kIGJ5IHNob3dfbWVtKCkgdG8gc2tpcCBob2xlcyBpbiB0aGUgbWVtb3J5IG1hcC4KICAqLwotc3RhdGljIHN0cnVjdCBtZW1pbmZvIG1lbWluZm8gX19pbml0ZGF0YSA9IHsgMCwgfTsKK3N0YXRpYyBzdHJ1Y3QgbWVtaW5mbyBtZW1pbmZvID0geyAwLCB9OworCisjZGVmaW5lIGZvcl9lYWNoX25vZGViYW5rKGl0ZXIsbWksbm8pCQkJXAorCWZvciAoaXRlciA9IDA7IGl0ZXIgPCBtaS0+bnJfYmFua3M7IGl0ZXIrKykJXAorCQlpZiAobWktPmJhbmtbaXRlcl0ubm9kZSA9PSBubykKIAogdm9pZCBzaG93X21lbSh2b2lkKQogewogCWludCBmcmVlID0gMCwgdG90YWwgPSAwLCByZXNlcnZlZCA9IDA7Ci0JaW50IHNoYXJlZCA9IDAsIGNhY2hlZCA9IDAsIHNsYWIgPSAwLCBub2RlOworCWludCBzaGFyZWQgPSAwLCBjYWNoZWQgPSAwLCBzbGFiID0gMCwgbm9kZSwgaTsKKwlzdHJ1Y3QgbWVtaW5mbyAqIG1pID0gJm1lbWluZm87CiAKIAlwcmludGsoIk1lbS1pbmZvOlxuIik7CiAJc2hvd19mcmVlX2FyZWFzKCk7CiAJcHJpbnRrKCJGcmVlIHN3YXA6ICAgICAgICU2bGRrQlxuIiwgbnJfc3dhcF9wYWdlczw8KFBBR0VfU0hJRlQtMTApKTsKIAogCWZvcl9lYWNoX29ubGluZV9ub2RlKG5vZGUpIHsKLQkJc3RydWN0IHBhZ2UgKnBhZ2UsICplbmQ7CisJCWZvcl9lYWNoX25vZGViYW5rIChpLG1pLG5vZGUpIHsKKwkJCXVuc2lnbmVkIGludCBwZm4xLCBwZm4yOworCQkJc3RydWN0IHBhZ2UgKnBhZ2UsICplbmQ7CiAKLQkJcGFnZSA9IE5PREVfTUVNX01BUChub2RlKTsKLQkJZW5kICA9IHBhZ2UgKyBOT0RFX0RBVEEobm9kZSktPm5vZGVfc3Bhbm5lZF9wYWdlczsKKwkJCXBmbjEgPSBtaS0+YmFua1tpXS5zdGFydCA+PiBQQUdFX1NISUZUOworCQkJcGZuMiA9IChtaS0+YmFua1tpXS5zaXplICsgbWktPmJhbmtbaV0uc3RhcnQpID4+IFBBR0VfU0hJRlQ7CiAKLQkJZG8gewotCQkJdG90YWwrKzsKLQkJCWlmIChQYWdlUmVzZXJ2ZWQocGFnZSkpCi0JCQkJcmVzZXJ2ZWQrKzsKLQkJCWVsc2UgaWYgKFBhZ2VTd2FwQ2FjaGUocGFnZSkpCi0JCQkJY2FjaGVkKys7Ci0JCQllbHNlIGlmIChQYWdlU2xhYihwYWdlKSkKLQkJCQlzbGFiKys7Ci0JCQllbHNlIGlmICghcGFnZV9jb3VudChwYWdlKSkKLQkJCQlmcmVlKys7Ci0JCQllbHNlCi0JCQkJc2hhcmVkICs9IHBhZ2VfY291bnQocGFnZSkgLSAxOwotCQkJcGFnZSsrOwotCQl9IHdoaWxlIChwYWdlIDwgZW5kKTsKKwkJCXBhZ2UgPSBOT0RFX01FTV9NQVAobm9kZSkgKyBwZm4xOworCQkJZW5kICA9IE5PREVfTUVNX01BUChub2RlKSArIHBmbjI7CisKKwkJCWRvIHsKKwkJCQl0b3RhbCsrOworCQkJCWlmIChQYWdlUmVzZXJ2ZWQocGFnZSkpCisJCQkJCXJlc2VydmVkKys7CisJCQkJZWxzZSBpZiAoUGFnZVN3YXBDYWNoZShwYWdlKSkKKwkJCQkJY2FjaGVkKys7CisJCQkJZWxzZSBpZiAoUGFnZVNsYWIocGFnZSkpCisJCQkJCXNsYWIrKzsKKwkJCQllbHNlIGlmICghcGFnZV9jb3VudChwYWdlKSkKKwkJCQkJZnJlZSsrOworCQkJCWVsc2UKKwkJCQkJc2hhcmVkICs9IHBhZ2VfY291bnQocGFnZSkgLSAxOworCQkJCXBhZ2UrKzsKKwkJCX0gd2hpbGUgKHBhZ2UgPCBlbmQpOworCQl9CiAJfQogCiAJcHJpbnRrKCIlZCBwYWdlcyBvZiBSQU1cbiIsIHRvdGFsKTsKQEAgLTc2LDEwICs4Nyw2IEBACiAJcHJpbnRrKCIlZCBwYWdlcyBzd2FwIGNhY2hlZFxuIiwgY2FjaGVkKTsKIH0KIAotI2RlZmluZSBmb3JfZWFjaF9ub2RlYmFuayhpdGVyLG1pLG5vKQkJCVwKLQlmb3IgKGl0ZXIgPSAwOyBpdGVyIDwgbWktPm5yX2JhbmtzOyBpdGVyKyspCVwKLQkJaWYgKG1pLT5iYW5rW2l0ZXJdLm5vZGUgPT0gbm8pCi0KIC8qCiAgKiBGSVhNRTogV2UgcmVhbGx5IHdhbnQgdG8gYXZvaWQgYWxsb2NhdGluZyB0aGUgYm9vdG1hcCBiaXRtYXAKICAqIG92ZXIgdGhlIHRvcCBvZiB0aGUgaW5pdHJkLiAgSG9wZWZ1bGx5LCB0aGlzIGlzIGxvY2F0ZWQgdG93YXJkcwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbW0vcHJvYy14c2NhbGUuUyBiL2FyY2gvYXJtL21tL3Byb2MteHNjYWxlLlMKaW5kZXggZThiMzc3ZC4uMjc0OWMxZiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbW0vcHJvYy14c2NhbGUuUworKysgYi9hcmNoL2FybS9tbS9wcm9jLXhzY2FsZS5TCkBAIC05MDksNyArOTA5LDcgQEAKIAliCV9feHNjYWxlX3NldHVwCiAJLmxvbmcJY3B1X2FyY2hfbmFtZQogCS5sb25nCWNwdV9lbGZfbmFtZQotCS5sb25nCUhXQ0FQX1NXUHxIV0NBUF9IQUxGfEhXQ0FQX1RIVU1CfEhXQ0FQX0ZBU1RfTVVMVHxIV0NBUF9FRFNQCisJLmxvbmcJSFdDQVBfU1dQfEhXQ0FQX0hBTEZ8SFdDQVBfVEhVTUJ8SFdDQVBfRkFTVF9NVUxUfEhXQ0FQX0VEU1B8SFdDQVBfSVdNTVhUCiAJLmxvbmcJY3B1X3B4YTI3MF9uYW1lCiAJLmxvbmcJeHNjYWxlX3Byb2Nlc3Nvcl9mdW5jdGlvbnMKIAkubG9uZwl2NHdiaV90bGJfZm5zCmRpZmYgLS1naXQgYS9hcmNoL2FybS9vcHJvZmlsZS9vcF9jb3VudGVyLmggYi9hcmNoL2FybS9vcHJvZmlsZS9vcF9jb3VudGVyLmgKaW5kZXggOGM1MzUxZC4uY2E5NDJhNiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vb3Byb2ZpbGUvb3BfY291bnRlci5oCisrKyBiL2FyY2gvYXJtL29wcm9maWxlL29wX2NvdW50ZXIuaApAQCAtMTAsOCArMTAsNiBAQAogI2lmbmRlZiBPUF9DT1VOVEVSX0gKICNkZWZpbmUgT1BfQ09VTlRFUl9ICiAKLSNkZWZpbmUgT1BfTUFYX0NPVU5URVIgNQotCiAvKiBQZXIgcGVyZm9ybWFuY2UgbW9uaXRvciBjb25maWd1cmF0aW9uIGFzIHNldCB2aWEKICAqIG9wcm9maWxlZnMuCiAgKi8KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL29wcm9maWxlL29wX21vZGVsX3hzY2FsZS5jIGIvYXJjaC9hcm0vb3Byb2ZpbGUvb3BfbW9kZWxfeHNjYWxlLmMKaW5kZXggNzg5OWQzYy4uN2MzMjg5YyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vb3Byb2ZpbGUvb3BfbW9kZWxfeHNjYWxlLmMKKysrIGIvYXJjaC9hcm0vb3Byb2ZpbGUvb3BfbW9kZWxfeHNjYWxlLmMKQEAgLTIwLDcgKzIwLDggQEAKICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogI2luY2x1ZGUgPGxpbnV4L29wcm9maWxlLmg+CiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+Ci0jaW5jbHVkZSA8YXNtL2lycS5oPgorI2luY2x1ZGUgPGxpbnV4L2lycS5oPgorCiAjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgogCiAjaW5jbHVkZSAib3BfY291bnRlci5oIgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vdG9vbHMvbWFjaC10eXBlcyBiL2FyY2gvYXJtL3Rvb2xzL21hY2gtdHlwZXMKaW5kZXggYjAyYWYxZC4uNTc5YzY5YSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vdG9vbHMvbWFjaC10eXBlcworKysgYi9hcmNoL2FybS90b29scy9tYWNoLXR5cGVzCkBAIC00LDcgKzQsNyBAQAogIwogIyBVcCB0byBkYXRlIHZlcnNpb25zIG9mIHRoaXMgZmlsZSBjYW4gYmUgb2J0YWluZWQgZnJvbToKICMKLSMgICBodHRwOi8vd3d3LmFybS5saW51eC5vcmcudWsvZGV2ZWxvcGVyL21hY2hpbmVzLz9hY3Rpb249ZG93bmxvYWQKKyMgICBodHRwOi8vd3d3LmFybS5saW51eC5vcmcudWsvZGV2ZWxvcGVyL21hY2hpbmVzL2Rvd25sb2FkLnBocAogIwogIyBQbGVhc2UgZG8gbm90IHNlbmQgcGF0Y2hlcyB0byB0aGlzIGZpbGU7IGl0IGlzIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIQogIyBUbyBhZGQgYW4gZW50cnkgaW50byB0aGlzIGRhdGFiYXNlLCBwbGVhc2Ugc2VlIERvY3VtZW50YXRpb24vYXJtL1JFQURNRSwKQEAgLTEyLDcgKzEyLDcgQEAKICMKICMgICBodHRwOi8vd3d3LmFybS5saW51eC5vcmcudWsvZGV2ZWxvcGVyL21hY2hpbmVzLz9hY3Rpb249bmV3CiAjCi0jIExhc3QgdXBkYXRlOiBTYXQgU2VwIDIzIDEzOjIwOjQzIDIwMDYKKyMgTGFzdCB1cGRhdGU6IE1vbiBPY3QgMTYgMjE6MTM6MzYgMjAwNgogIwogIyBtYWNoaW5lX2lzX3h4eAlDT05GSUdfeHh4eAkJTUFDSF9UWVBFX3h4eAkJbnVtYmVyCiAjCkBAIC0xMTU3LDMgKzExNTcsMTcgQEAKIG90aTQxMTAJCQlNQUNIX09USTQxMTAJCU9USTQxMTAJCQkxMTQ0CiBobWVfcHhhCQkJTUFDSF9ITUVfUFhBCQlITUVfUFhBCQkJMTE0NQogZGVpc3RlcmRjYQkJTUFDSF9ERUlTVEVSRENBCQlERUlTVEVSRENBCQkxMTQ2CitjZXNfc3NlbTIJCU1BQ0hfQ0VTX1NTRU0yCQlDRVNfU1NFTTIJCTExNDcKK2Nlc19tdHIJCQlNQUNIX0NFU19NVFIJCUNFU19NVFIJCQkxMTQ4Cit0ZHNfYXZuZ19zYmMJCU1BQ0hfVERTX0FWTkdfU0JDCVREU19BVk5HX1NCQwkJMTE0OQorZXZlcmVzdAkJCU1BQ0hfRVZFUkVTVAkJRVZFUkVTVAkJCTExNTAKK3BueDQwMTAJCQlNQUNIX1BOWDQwMTAJCVBOWDQwMTAJCQkxMTUxCitveG5hcwkJCU1BQ0hfT1hOQVMJCU9YTkFTCQkJMTE1MgorZmlvcmkJCQlNQUNIX0ZJT1JJCQlGSU9SSQkJCTExNTMKK21sMTIwMAkJCU1BQ0hfTUwxMjAwCQlNTDEyMDAJCQkxMTU0CitjYWN0dXMJCQlNQUNIX0NBQ1RVUwkJQ0FDVFVTCQkJMTE1NQorbmIyeHh4CQkJTUFDSF9OQjJYWFgJCU5CMlhYWAkJCTExNTYKK2h3NjkwMAkJCU1BQ0hfSFc2OTAwCQlIVzY5MDAJCQkxMTU3CitjZGNzX3F1b2xsCQlNQUNIX0NEQ1NfUVVPTEwJCUNEQ1NfUVVPTEwJCTExNTgKK3F1aWNrc2lsdmVyCQlNQUNIX1FVSUNLU0lMVkVSCVFVSUNLU0lMVkVSCQkxMTU5Cit1cGxhdDkyNgkJTUFDSF9VUExBVDkyNgkJVVBMQVQ5MjYJCTExNjAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3ZmcC92ZnBkb3VibGUuYyBiL2FyY2gvYXJtL3ZmcC92ZnBkb3VibGUuYwppbmRleCA0ZmMwNWVlLi5lNDRiOWVkIDEwMDY0NAotLS0gYS9hcmNoL2FybS92ZnAvdmZwZG91YmxlLmMKKysrIGIvYXJjaC9hcm0vdmZwL3ZmcGRvdWJsZS5jCkBAIC01Niw3ICs1Niw3IEBACiB7CiAJaW50IGJpdHMgPSAzMSAtIGZscyh2ZC0+c2lnbmlmaWNhbmQgPj4gMzIpOwogCWlmIChiaXRzID09IDMxKQotCQliaXRzID0gNjIgLSBmbHModmQtPnNpZ25pZmljYW5kKTsKKwkJYml0cyA9IDYzIC0gZmxzKHZkLT5zaWduaWZpY2FuZCk7CiAKIAl2ZnBfZG91YmxlX2R1bXAoIm5vcm1hbGlzZV9kZW5vcm1hbDogaW4iLCB2ZCk7CiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3ZmcC92ZnBtb2R1bGUuYyBiL2FyY2gvYXJtL3ZmcC92ZnBtb2R1bGUuYwppbmRleCBkZWRiYjQ0Li5mMDhlYWZiIDEwMDY0NAotLS0gYS9hcmNoL2FybS92ZnAvdmZwbW9kdWxlLmMKKysrIGIvYXJjaC9hcm0vdmZwL3ZmcG1vZHVsZS5jCkBAIC05MCw3ICs5MCw3IEBACiAKIAlpbmZvLnNpX3NpZ25vID0gU0lHRlBFOwogCWluZm8uc2lfY29kZSA9IHNpY29kZTsKLQlpbmZvLnNpX2FkZHIgPSAodm9pZCAqKShpbnN0cnVjdGlvbl9wb2ludGVyKHJlZ3MpIC0gNCk7CisJaW5mby5zaV9hZGRyID0gKHZvaWQgX191c2VyICopKGluc3RydWN0aW9uX3BvaW50ZXIocmVncykgLSA0KTsKIAogCS8qCiAJICogVGhpcyBpcyB0aGUgc2FtZSBhcyBOV0ZQRSwgYmVjYXVzZSBpdCdzIG5vdCBjbGVhciB3aGF0CkBAIC0xNDgsNiArMTQ4LDcgQEAKIAkvKgogCSAqIFRoZXNlIGFyZSBhcnJhbmdlZCBpbiBwcmlvcml0eSBvcmRlciwgbGVhc3QgdG8gaGlnaGVzdC4KIAkgKi8KKwlSQUlTRShGUFNDUl9EWkMsIEZQU0NSX0RaRSwgRlBFX0ZMVERJVik7CiAJUkFJU0UoRlBTQ1JfSVhDLCBGUFNDUl9JWEUsIEZQRV9GTFRSRVMpOwogCVJBSVNFKEZQU0NSX1VGQywgRlBTQ1JfVUZFLCBGUEVfRkxUVU5EKTsKIAlSQUlTRShGUFNDUl9PRkMsIEZQU0NSX09GRSwgRlBFX0ZMVE9WRik7CmRpZmYgLS1naXQgYS9hcmNoL2FybTI2L2tlcm5lbC9hcm1rc3ltcy5jIGIvYXJjaC9hcm0yNi9rZXJuZWwvYXJta3N5bXMuYwppbmRleCAwNzkwN2I2Li45MzI5M2QwIDEwMDY0NAotLS0gYS9hcmNoL2FybTI2L2tlcm5lbC9hcm1rc3ltcy5jCisrKyBiL2FyY2gvYXJtMjYva2VybmVsL2FybWtzeW1zLmMKQEAgLTIwMiwxNCArMjAyLDYgQEAKIEVYUE9SVF9TWU1CT0woZWxmX3BsYXRmb3JtKTsKIEVYUE9SVF9TWU1CT0woZWxmX2h3Y2FwKTsKIAotCS8qIHN5c2NhbGxzICovCi1FWFBPUlRfU1lNQk9MKHN5c193cml0ZSk7Ci1FWFBPUlRfU1lNQk9MKHN5c19yZWFkKTsKLUVYUE9SVF9TWU1CT0woc3lzX2xzZWVrKTsKLUVYUE9SVF9TWU1CT0woc3lzX29wZW4pOwotRVhQT1JUX1NZTUJPTChzeXNfZXhpdCk7Ci1FWFBPUlRfU1lNQk9MKHN5c193YWl0NCk7Ci0KICNpZmRlZiBDT05GSUdfUFJFRU1QVAogRVhQT1JUX1NZTUJPTChrZXJuZWxfZmxhZyk7CiAjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvYXZyMzIvTWFrZWZpbGUgYi9hcmNoL2F2cjMyL01ha2VmaWxlCmluZGV4IGNlZmM5NWEuLjdiODQyZTkgMTAwNjQ0Ci0tLSBhL2FyY2gvYXZyMzIvTWFrZWZpbGUKKysrIGIvYXJjaC9hdnIzMi9NYWtlZmlsZQpAQCAtNyw3ICs3LDcgQEAKIAogIyBEZWZhdWx0IHRhcmdldCB3aGVuIGV4ZWN1dGluZyBwbGFpbiBtYWtlCiAuUEhPTlk6IGFsbAotYWxsOiB1SW1hZ2Ugdm1saW51eC5lbGYgbGludXgubHN0CithbGw6IHVJbWFnZSB2bWxpbnV4LmVsZgogCiBLQlVJTERfREVGQ09ORklHCTo9IGF0c3RrMTAwMl9kZWZjb25maWcKIApAQCAtMjEsOSArMjEsNyBAQAogQ0ZMQUdTCQkrPSAkKGNwdWZsYWdzLXkpCiBBRkxBR1MJCSs9ICQoY3B1ZmxhZ3MteSkKIAotQ0hFQ0tGTEFHUwkrPSAtRF9fYXZyMzJfXwotCi1MSUJHQ0MJCTo9ICQoc2hlbGwgJChDQykgJChDRkxBR1MpIC1wcmludC1saWJnY2MtZmlsZS1uYW1lKQorQ0hFQ0tGTEFHUwkrPSAtRF9fYXZyMzJfXyAtRF9fQklHX0VORElBTgogCiBoZWFkLSQoQ09ORklHX0xPQURFUl9VX0JPT1QpCQkrPSBhcmNoL2F2cjMyL2Jvb3QvdS1ib290L2hlYWQubwogaGVhZC15CQkJCQkrPSBhcmNoL2F2cjMyL2tlcm5lbC9oZWFkLm8KQEAgLTMyLDcgKzMwLDcgQEAKIGNvcmUtJChDT05GSUdfTE9BREVSX1VfQk9PVCkJCSs9IGFyY2gvYXZyMzIvYm9vdC91LWJvb3QvCiBjb3JlLXkJCQkJCSs9IGFyY2gvYXZyMzIva2VybmVsLwogY29yZS15CQkJCQkrPSBhcmNoL2F2cjMyL21tLwotbGlicy15CQkJCQkrPSBhcmNoL2F2cjMyL2xpYi8gIyQoTElCR0NDKQorbGlicy15CQkJCQkrPSBhcmNoL2F2cjMyL2xpYi8KIAogYXJjaGluY2Rpci0kKENPTkZJR19QTEFURk9STV9BVDMyQVApCTo9IGFyY2gtYXQzMmFwCiAKQEAgLTQ4LDYgKzQ2LDggQEAKIAogYXJjaHByZXBhcmU6IGluY2x1ZGUvYXNtLWF2cjMyLy5hcmNoCiAKK0NMRUFOX0ZJTEVTICs9IGluY2x1ZGUvYXNtLWF2cjMyLy5hcmNoIGluY2x1ZGUvYXNtLWF2cjMyL2FyY2gKKwogQk9PVF9UQVJHRVRTIDo9IHZtbGludXguZWxmIHZtbGludXguYmluIHVJbWFnZSB1SW1hZ2Uuc3JlYwogCiAuUEhPTlk6ICQoQk9PVF9UQVJHRVRTKSBpbnN0YWxsCkBAIC03MSwxNCArNzEsMTkgQEAKIGluc3RhbGw6IHZtbGludXgKIAkkKFEpJChNQUtFKSAkKGJ1aWxkKT0kKGJvb3QpIEJPT1RJTUFHRT0kKEtCVUlMRF9JTUFHRSkgJEAKIAotbGludXguczogdm1saW51eAordm1saW51eC5zOiB2bWxpbnV4CiAJJChjYWxsIGlmX2NoYW5nZWQsZGlzYXNtKQogCi1saW51eC5sc3Q6IHZtbGludXgKK3ZtbGludXgubHN0OiB2bWxpbnV4CiAJJChjYWxsIGlmX2NoYW5nZWQsbGlzdGluZykKIAorQ0xFQU5fRklMRVMgKz0gdm1saW51eC5zIHZtbGludXgubHN0CisKK2FyY2hjbGVhbjoKKwkkKFEpJChNQUtFKSAkKGNsZWFuKT0kKGJvb3QpCisKIGRlZmluZSBhcmNoaGVscAogICBAZWNobyAnKiB2bWxpbnV4LmVsZgkJLSBFTEYgaW1hZ2Ugd2l0aCBsb2FkIGFkZHJlc3MgMCcKICAgQGVjaG8gJyAgdm1saW51eC5jc28JCS0gUGF0aEZpbmRlciBDU08gaW1hZ2UnCi0gIEBlY2hvICcgIHVJbWFnZQkJLSBDcmVhdGUgYSBib290YWJsZSBpbWFnZSBmb3IgVS1Cb290JworICBAZWNobyAnKiB1SW1hZ2UJCS0gQ3JlYXRlIGEgYm9vdGFibGUgaW1hZ2UgZm9yIFUtQm9vdCcKIGVuZGVmCmRpZmYgLS1naXQgYS9hcmNoL2F2cjMyL2JvYXJkcy9hdHN0azEwMDAvc2V0dXAuYyBiL2FyY2gvYXZyMzIvYm9hcmRzL2F0c3RrMTAwMC9zZXR1cC5jCmluZGV4IDE5MWFiODUuLjI3MmMwMTEgMTAwNjQ0Ci0tLSBhL2FyY2gvYXZyMzIvYm9hcmRzL2F0c3RrMTAwMC9zZXR1cC5jCisrKyBiL2FyY2gvYXZyMzIvYm9hcmRzL2F0c3RrMTAwMC9zZXR1cC5jCkBAIC0yMSwxNSArMjEsNiBAQAogCiBzdHJ1Y3QgbGNkY19wbGF0Zm9ybV9kYXRhIF9faW5pdGRhdGEgYXRzdGsxMDAwX2ZiMF9kYXRhOwogCi1hc21saW5rYWdlIHZvaWQgX19pbml0IGJvYXJkX2Vhcmx5X2luaXQodm9pZCkKLXsKLQlleHRlcm4gdm9pZCBzZHJhbV9pbml0KHZvaWQpOwotCi0jaWZkZWYgQ09ORklHX0xPQURFUl9TVEFOREFMT05FCi0Jc2RyYW1faW5pdCgpOwotI2VuZGlmCi19Ci0KIHZvaWQgX19pbml0IGJvYXJkX3NldHVwX2ZibWVtKHVuc2lnbmVkIGxvbmcgZmJtZW1fc3RhcnQsCiAJCQkgICAgICB1bnNpZ25lZCBsb25nIGZibWVtX3NpemUpCiB7CmRpZmYgLS1naXQgYS9hcmNoL2F2cjMyL2Jvb3QvaW1hZ2VzL01ha2VmaWxlIGIvYXJjaC9hdnIzMi9ib290L2ltYWdlcy9NYWtlZmlsZQppbmRleCBjY2Q3NGVlZS4uMjE5NzIwYSAxMDA2NDQKLS0tIGEvYXJjaC9hdnIzMi9ib290L2ltYWdlcy9NYWtlZmlsZQorKysgYi9hcmNoL2F2cjMyL2Jvb3QvaW1hZ2VzL01ha2VmaWxlCkBAIC0zNywxNCArMzcsMTIgQEAKIAkJCSAgICAtLWNoYW5nZS1zZWN0aW9uLWxtYSAuZGF0YS0weDgwMDAwMDAwIFwKIAkJCSAgICAtLWNoYW5nZS1zZWN0aW9uLWxtYSAuaW5pdC0weDgwMDAwMDAwIFwKIAkJCSAgICAtLWNoYW5nZS1zZWN0aW9uLWxtYSAuYnNzLTB4ODAwMDAwMDAgXAotCQkJICAgIC0tY2hhbmdlLXNlY3Rpb24tbG1hIC5pbml0cmQtMHg4MDAwMDAwMCBcCiAJCQkgICAgLS1jaGFuZ2Utc2VjdGlvbi1sbWEgX19wYXJhbS0weDgwMDAwMDAwIFwKIAkJCSAgICAtLWNoYW5nZS1zZWN0aW9uLWxtYSBfX2tzeW10YWItMHg4MDAwMDAwMCBcCiAJCQkgICAgLS1jaGFuZ2Utc2VjdGlvbi1sbWEgX19rc3ltdGFiX2dwbC0weDgwMDAwMDAwIFwKIAkJCSAgICAtLWNoYW5nZS1zZWN0aW9uLWxtYSBfX2tjcmN0YWItMHg4MDAwMDAwMCBcCiAJCQkgICAgLS1jaGFuZ2Utc2VjdGlvbi1sbWEgX19rY3JjdGFiX2dwbC0weDgwMDAwMDAwIFwKIAkJCSAgICAtLWNoYW5nZS1zZWN0aW9uLWxtYSBfX2tzeW10YWJfc3RyaW5ncy0weDgwMDAwMDAwIFwKLQkJCSAgICAtLWNoYW5nZS1zZWN0aW9uLWxtYSAuZ290LTB4ODAwMDAwMDAgXAogCQkJICAgIC0tc2V0LXN0YXJ0IDB4YTAwMDAwMDAKICQob2JqKS92bWxpbnV4LmVsZjogdm1saW51eCBGT1JDRQogCSQoY2FsbCBpZl9jaGFuZ2VkLG9iamNvcHkpCkBAIC01OSw0ICs1Nyw0IEBACiAJc2ggJChzcmN0cmVlKS9pbnN0YWxsLWtlcm5lbC5zaCAkPAogCiAjIEdlbmVyYXRlZCBmaWxlcyB0byBiZSByZW1vdmVkIHVwb24gbWFrZSBjbGVhbgotY2xlYW4tZmlsZXMJOj0gdm1saW51eCogdUltYWdlIHVJbWFnZS5zcmVjCitjbGVhbi1maWxlcwk6PSB2bWxpbnV4LmVsZiB2bWxpbnV4LmJpbiB2bWxpbnV4Lmd6IHVJbWFnZSB1SW1hZ2Uuc3JlYwpkaWZmIC0tZ2l0IGEvYXJjaC9hdnIzMi9jb25maWdzL2F0c3RrMTAwMl9kZWZjb25maWcgYi9hcmNoL2F2cjMyL2NvbmZpZ3MvYXRzdGsxMDAyX2RlZmNvbmZpZwppbmRleCA2YzJjNWUwLi5hZTkyYTE0IDEwMDY0NAotLS0gYS9hcmNoL2F2cjMyL2NvbmZpZ3MvYXRzdGsxMDAyX2RlZmNvbmZpZworKysgYi9hcmNoL2F2cjMyL2NvbmZpZ3MvYXRzdGsxMDAyX2RlZmNvbmZpZwpAQCAtMSwxMyArMSwxNCBAQAogIwogIyBBdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBtYWtlIGNvbmZpZzogZG9uJ3QgZWRpdAotIyBMaW51eCBrZXJuZWwgdmVyc2lvbjogMi42LjE4LXJjMQotIyBUdWUgSnVsIDExIDEyOjQxOjM2IDIwMDYKKyMgTGludXgga2VybmVsIHZlcnNpb246IDIuNi4xOS1yYzIKKyMgRnJpIE9jdCAyMCAxMTo1MjozNyAyMDA2CiAjCiBDT05GSUdfQVZSMzI9eQogQ09ORklHX0dFTkVSSUNfSEFSRElSUVM9eQogQ09ORklHX0hBUkRJUlFTX1NXX1JFU0VORD15CiBDT05GSUdfR0VORVJJQ19JUlFfUFJPQkU9eQogQ09ORklHX1JXU0VNX0dFTkVSSUNfU1BJTkxPQ0s9eQorQ09ORklHX0dFTkVSSUNfVElNRT15CiBDT05GSUdfR0VORVJJQ19IV0VJR0hUPXkKIENPTkZJR19HRU5FUklDX0NBTElCUkFURV9ERUxBWT15CiBDT05GSUdfREVGQ09ORklHX0xJU1Q9Ii9saWIvbW9kdWxlcy8kVU5BTUVfUkVMRUFTRS8uY29uZmlnIgpAQCAtMjUsMTYgKzI2LDIzIEBACiBDT05GSUdfTE9DQUxWRVJTSU9OPSIiCiAjIENPTkZJR19MT0NBTFZFUlNJT05fQVVUTyBpcyBub3Qgc2V0CiBDT05GSUdfU1dBUD15Ci0jIENPTkZJR19TWVNWSVBDIGlzIG5vdCBzZXQKLSMgQ09ORklHX1BPU0lYX01RVUVVRSBpcyBub3Qgc2V0Ci0jIENPTkZJR19CU0RfUFJPQ0VTU19BQ0NUIGlzIG5vdCBzZXQKLUNPTkZJR19TWVNDVEw9eQotIyBDT05GSUdfQVVESVQgaXMgbm90IHNldAorQ09ORklHX1NZU1ZJUEM9eQorIyBDT05GSUdfSVBDX05TIGlzIG5vdCBzZXQKK0NPTkZJR19QT1NJWF9NUVVFVUU9eQorQ09ORklHX0JTRF9QUk9DRVNTX0FDQ1Q9eQorQ09ORklHX0JTRF9QUk9DRVNTX0FDQ1RfVjM9eQorQ09ORklHX1RBU0tTVEFUUz15CitDT05GSUdfVEFTS19ERUxBWV9BQ0NUPXkKKyMgQ09ORklHX1VUU19OUyBpcyBub3Qgc2V0CitDT05GSUdfQVVESVQ9eQogIyBDT05GSUdfSUtDT05GSUcgaXMgbm90IHNldAotIyBDT05GSUdfUkVMQVkgaXMgbm90IHNldAorQ09ORklHX1JFTEFZPXkKIENPTkZJR19JTklUUkFNRlNfU09VUkNFPSIiCiBDT05GSUdfQ0NfT1BUSU1JWkVfRk9SX1NJWkU9eQorIyBDT05GSUdfVEFTS19YQUNDVCBpcyBub3Qgc2V0CitDT05GSUdfU1lTQ1RMPXkKIENPTkZJR19FTUJFRERFRD15CisjIENPTkZJR19TWVNDVExfU1lTQ0FMTCBpcyBub3Qgc2V0CiBDT05GSUdfS0FMTFNZTVM9eQogIyBDT05GSUdfS0FMTFNZTVNfQUxMIGlzIG5vdCBzZXQKICMgQ09ORklHX0tBTExTWU1TX0VYVFJBX1BBU1MgaXMgbm90IHNldApAQCAtNDMsMTQgKzUxLDE1IEBACiBDT05GSUdfQlVHPXkKIENPTkZJR19FTEZfQ09SRT15CiAjIENPTkZJR19CQVNFX0ZVTEwgaXMgbm90IHNldAotIyBDT05GSUdfRlVURVggaXMgbm90IHNldAotIyBDT05GSUdfRVBPTEwgaXMgbm90IHNldAorQ09ORklHX0ZVVEVYPXkKK0NPTkZJR19FUE9MTD15CiBDT05GSUdfU0hNRU09eQotIyBDT05GSUdfU0xBQiBpcyBub3Qgc2V0Ci0jIENPTkZJR19WTV9FVkVOVF9DT1VOVEVSUyBpcyBub3Qgc2V0CitDT05GSUdfU0xBQj15CitDT05GSUdfVk1fRVZFTlRfQ09VTlRFUlM9eQorQ09ORklHX1JUX01VVEVYRVM9eQogIyBDT05GSUdfVElOWV9TSE1FTSBpcyBub3Qgc2V0CiBDT05GSUdfQkFTRV9TTUFMTD0xCi1DT05GSUdfU0xPQj15CisjIENPTkZJR19TTE9CIGlzIG5vdCBzZXQKIAogIwogIyBMb2FkYWJsZSBtb2R1bGUgc3VwcG9ydApAQCAtNjUsNiArNzQsNyBAQAogIwogIyBCbG9jayBsYXllcgogIworQ09ORklHX0JMT0NLPXkKICMgQ09ORklHX0JMS19ERVZfSU9fVFJBQ0UgaXMgbm90IHNldAogCiAjCkBAIC0xNjYsMTAgKzE3NiwxMiBAQAogIyBDT05GSUdfSU5FVF9UVU5ORUwgaXMgbm90IHNldAogIyBDT05GSUdfSU5FVF9YRlJNX01PREVfVFJBTlNQT1JUIGlzIG5vdCBzZXQKICMgQ09ORklHX0lORVRfWEZSTV9NT0RFX1RVTk5FTCBpcyBub3Qgc2V0CisjIENPTkZJR19JTkVUX1hGUk1fTU9ERV9CRUVUIGlzIG5vdCBzZXQKIENPTkZJR19JTkVUX0RJQUc9eQogQ09ORklHX0lORVRfVENQX0RJQUc9eQogIyBDT05GSUdfVENQX0NPTkdfQURWQU5DRUQgaXMgbm90IHNldAotQ09ORklHX1RDUF9DT05HX0JJQz15CitDT05GSUdfVENQX0NPTkdfQ1VCSUM9eQorQ09ORklHX0RFRkFVTFRfVENQX0NPTkc9ImN1YmljIgogIyBDT05GSUdfSVBWNiBpcyBub3Qgc2V0CiAjIENPTkZJR19JTkVUNl9YRlJNX1RVTk5FTCBpcyBub3Qgc2V0CiAjIENPTkZJR19JTkVUNl9UVU5ORUwgaXMgbm90IHNldApAQCAtMTk5LDcgKzIxMSw2IEBACiAjIENPTkZJR19BVEFMSyBpcyBub3Qgc2V0CiAjIENPTkZJR19YMjUgaXMgbm90IHNldAogIyBDT05GSUdfTEFQQiBpcyBub3Qgc2V0Ci0jIENPTkZJR19ORVRfRElWRVJUIGlzIG5vdCBzZXQKICMgQ09ORklHX0VDT05FVCBpcyBub3Qgc2V0CiAjIENPTkZJR19XQU5fUk9VVEVSIGlzIG5vdCBzZXQKIApAQCAtMjEyLDcgKzIyMyw2IEBACiAjIE5ldHdvcmsgdGVzdGluZwogIwogIyBDT05GSUdfTkVUX1BLVEdFTiBpcyBub3Qgc2V0Ci0jIENPTkZJR19ORVRfVENQUFJPQkUgaXMgbm90IHNldAogIyBDT05GSUdfSEFNUkFESU8gaXMgbm90IHNldAogIyBDT05GSUdfSVJEQSBpcyBub3Qgc2V0CiAjIENPTkZJR19CVCBpcyBub3Qgc2V0CkBAIC0yMzksNyArMjQ5LDg0IEBACiAjCiAjIE1lbW9yeSBUZWNobm9sb2d5IERldmljZXMgKE1URCkKICMKLSMgQ09ORklHX01URCBpcyBub3Qgc2V0CitDT05GSUdfTVREPXkKKyMgQ09ORklHX01URF9ERUJVRyBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfQ09OQ0FUIGlzIG5vdCBzZXQKK0NPTkZJR19NVERfUEFSVElUSU9OUz15CisjIENPTkZJR19NVERfUkVEQk9PVF9QQVJUUyBpcyBub3Qgc2V0CitDT05GSUdfTVREX0NNRExJTkVfUEFSVFM9eQorCisjCisjIFVzZXIgTW9kdWxlcyBBbmQgVHJhbnNsYXRpb24gTGF5ZXJzCisjCitDT05GSUdfTVREX0NIQVI9eQorQ09ORklHX01URF9CTE9DSz15CisjIENPTkZJR19GVEwgaXMgbm90IHNldAorIyBDT05GSUdfTkZUTCBpcyBub3Qgc2V0CisjIENPTkZJR19JTkZUTCBpcyBub3Qgc2V0CisjIENPTkZJR19SRkRfRlRMIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NTRkRDIGlzIG5vdCBzZXQKKworIworIyBSQU0vUk9NL0ZsYXNoIGNoaXAgZHJpdmVycworIworQ09ORklHX01URF9DRkk9eQorIyBDT05GSUdfTVREX0pFREVDUFJPQkUgaXMgbm90IHNldAorQ09ORklHX01URF9HRU5fUFJPQkU9eQorIyBDT05GSUdfTVREX0NGSV9BRFZfT1BUSU9OUyBpcyBub3Qgc2V0CitDT05GSUdfTVREX01BUF9CQU5LX1dJRFRIXzE9eQorQ09ORklHX01URF9NQVBfQkFOS19XSURUSF8yPXkKK0NPTkZJR19NVERfTUFQX0JBTktfV0lEVEhfND15CisjIENPTkZJR19NVERfTUFQX0JBTktfV0lEVEhfOCBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfTUFQX0JBTktfV0lEVEhfMTYgaXMgbm90IHNldAorIyBDT05GSUdfTVREX01BUF9CQU5LX1dJRFRIXzMyIGlzIG5vdCBzZXQKK0NPTkZJR19NVERfQ0ZJX0kxPXkKK0NPTkZJR19NVERfQ0ZJX0kyPXkKKyMgQ09ORklHX01URF9DRklfSTQgaXMgbm90IHNldAorIyBDT05GSUdfTVREX0NGSV9JOCBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfQ0ZJX0lOVEVMRVhUIGlzIG5vdCBzZXQKK0NPTkZJR19NVERfQ0ZJX0FNRFNURD15CisjIENPTkZJR19NVERfQ0ZJX1NUQUEgaXMgbm90IHNldAorQ09ORklHX01URF9DRklfVVRJTD15CisjIENPTkZJR19NVERfUkFNIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9ST00gaXMgbm90IHNldAorIyBDT05GSUdfTVREX0FCU0VOVCBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfT0JTT0xFVEVfQ0hJUFMgaXMgbm90IHNldAorCisjCisjIE1hcHBpbmcgZHJpdmVycyBmb3IgY2hpcCBhY2Nlc3MKKyMKKyMgQ09ORklHX01URF9DT01QTEVYX01BUFBJTkdTIGlzIG5vdCBzZXQKK0NPTkZJR19NVERfUEhZU01BUD15CitDT05GSUdfTVREX1BIWVNNQVBfU1RBUlQ9MHg4MDAwMDAwCitDT05GSUdfTVREX1BIWVNNQVBfTEVOPTB4MAorQ09ORklHX01URF9QSFlTTUFQX0JBTktXSURUSD0yCisjIENPTkZJR19NVERfUExBVFJBTSBpcyBub3Qgc2V0CisKKyMKKyMgU2VsZi1jb250YWluZWQgTVREIGRldmljZSBkcml2ZXJzCisjCisjIENPTkZJR19NVERfU0xSQU0gaXMgbm90IHNldAorIyBDT05GSUdfTVREX1BIUkFNIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9NVERSQU0gaXMgbm90IHNldAorIyBDT05GSUdfTVREX0JMT0NLMk1URCBpcyBub3Qgc2V0CisKKyMKKyMgRGlzay1Pbi1DaGlwIERldmljZSBEcml2ZXJzCisjCisjIENPTkZJR19NVERfRE9DMjAwMCBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfRE9DMjAwMSBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfRE9DMjAwMVBMVVMgaXMgbm90IHNldAorCisjCisjIE5BTkQgRmxhc2ggRGV2aWNlIERyaXZlcnMKKyMKKyMgQ09ORklHX01URF9OQU5EIGlzIG5vdCBzZXQKKworIworIyBPbmVOQU5EIEZsYXNoIERldmljZSBEcml2ZXJzCisjCisjIENPTkZJR19NVERfT05FTkFORCBpcyBub3Qgc2V0CiAKICMKICMgUGFyYWxsZWwgcG9ydCBzdXBwb3J0CkBAIC0yNjAsMTEgKzM0NywxOCBAQAogQ09ORklHX0JMS19ERVZfUkFNPW0KIENPTkZJR19CTEtfREVWX1JBTV9DT1VOVD0xNgogQ09ORklHX0JMS19ERVZfUkFNX1NJWkU9NDA5NgorQ09ORklHX0JMS19ERVZfUkFNX0JMT0NLU0laRT0xMDI0CiBDT05GSUdfQkxLX0RFVl9JTklUUkQ9eQogIyBDT05GSUdfQ0RST01fUEtUQ0RWRCBpcyBub3Qgc2V0CiAjIENPTkZJR19BVEFfT1ZFUl9FVEggaXMgbm90IHNldAogCiAjCisjIE1pc2MgZGV2aWNlcworIworIyBDT05GSUdfU0dJX0lPQzQgaXMgbm90IHNldAorIyBDT05GSUdfVElGTV9DT1JFIGlzIG5vdCBzZXQKKworIwogIyBBVEEvQVRBUEkvTUZNL1JMTCBzdXBwb3J0CiAjCiAjIENPTkZJR19JREUgaXMgbm90IHNldApAQCAtMjc0LDYgKzM2OCwxMiBAQAogIwogIyBDT05GSUdfUkFJRF9BVFRSUyBpcyBub3Qgc2V0CiAjIENPTkZJR19TQ1NJIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfTkVUTElOSyBpcyBub3Qgc2V0CisKKyMKKyMgU2VyaWFsIEFUQSAocHJvZCkgYW5kIFBhcmFsbGVsIEFUQSAoZXhwZXJpbWVudGFsKSBkcml2ZXJzCisjCisjIENPTkZJR19BVEEgaXMgbm90IHNldAogCiAjCiAjIE11bHRpLWRldmljZSBzdXBwb3J0IChSQUlEIGFuZCBMVk0pCkBAIC0zMDUsMTQgKzQwNSwxMSBAQAogIwogIyBQSFkgZGV2aWNlIHN1cHBvcnQKICMKLSMgQ09ORklHX1BIWUxJQiBpcyBub3Qgc2V0CiAKICMKICMgRXRoZXJuZXQgKDEwIG9yIDEwME1iaXQpCiAjCi1DT05GSUdfTkVUX0VUSEVSTkVUPXkKLUNPTkZJR19NSUk9eQotQ09ORklHX01BQ0I9eQorIyBDT05GSUdfTkVUX0VUSEVSTkVUIGlzIG5vdCBzZXQKIAogIwogIyBFdGhlcm5ldCAoMTAwMCBNYml0KQpAQCAtMzQxLDEwICs0MzgsMTEgQEAKIENPTkZJR19QUFBfQVNZTkM9bQogIyBDT05GSUdfUFBQX1NZTkNfVFRZIGlzIG5vdCBzZXQKIENPTkZJR19QUFBfREVGTEFURT1tCi0jIENPTkZJR19QUFBfQlNEQ09NUCBpcyBub3Qgc2V0CitDT05GSUdfUFBQX0JTRENPTVA9bQogIyBDT05GSUdfUFBQX01QUEUgaXMgbm90IHNldAogIyBDT05GSUdfUFBQT0UgaXMgbm90IHNldAogIyBDT05GSUdfU0xJUCBpcyBub3Qgc2V0CitDT05GSUdfU0xIQz1tCiAjIENPTkZJR19TSEFQRVIgaXMgbm90IHNldAogIyBDT05GSUdfTkVUQ09OU09MRSBpcyBub3Qgc2V0CiAjIENPTkZJR19ORVRQT0xMIGlzIG5vdCBzZXQKQEAgLTQxNyw3ICs1MTUsNiBAQAogIyBUUE0gZGV2aWNlcwogIwogIyBDT05GSUdfVENHX1RQTSBpcyBub3Qgc2V0Ci0jIENPTkZJR19URUxDTE9DSyBpcyBub3Qgc2V0CiAKICMKICMgSTJDIHN1cHBvcnQKQEAgLTQyNywyMyArNTI0LDEzIEBACiAjCiAjIFNQSSBzdXBwb3J0CiAjCi1DT05GSUdfU1BJPXkKLSMgQ09ORklHX1NQSV9ERUJVRyBpcyBub3Qgc2V0Ci1DT05GSUdfU1BJX01BU1RFUj15Ci0KLSMKLSMgU1BJIE1hc3RlciBDb250cm9sbGVyIERyaXZlcnMKLSMKLUNPTkZJR19TUElfQVRNRUw9bQotIyBDT05GSUdfU1BJX0JJVEJBTkcgaXMgbm90IHNldAotCi0jCi0jIFNQSSBQcm90b2NvbCBNYXN0ZXJzCi0jCisjIENPTkZJR19TUEkgaXMgbm90IHNldAorIyBDT05GSUdfU1BJX01BU1RFUiBpcyBub3Qgc2V0CiAKICMKICMgRGFsbGFzJ3MgMS13aXJlIGJ1cwogIworIyBDT05GSUdfVzEgaXMgbm90IHNldAogCiAjCiAjIEhhcmR3YXJlIE1vbml0b3Jpbmcgc3VwcG9ydApAQCAtNDUyLDE0ICs1MzksOSBAQAogIyBDT05GSUdfSFdNT05fVklEIGlzIG5vdCBzZXQKIAogIwotIyBNaXNjIGRldmljZXMKLSMKLQotIwogIyBNdWx0aW1lZGlhIGRldmljZXMKICMKICMgQ09ORklHX1ZJREVPX0RFViBpcyBub3Qgc2V0Ci1DT05GSUdfVklERU9fVjRMMj15CiAKICMKICMgRGlnaXRhbCBWaWRlbyBCcm9hZGNhc3RpbmcgRGV2aWNlcwpAQCAtNDcwLDI4ICs1NTIsOCBAQAogIyBHcmFwaGljcyBzdXBwb3J0CiAjCiAjIENPTkZJR19GSVJNV0FSRV9FRElEIGlzIG5vdCBzZXQKLUNPTkZJR19GQj1tCi1DT05GSUdfRkJfQ0ZCX0ZJTExSRUNUPW0KLUNPTkZJR19GQl9DRkJfQ09QWUFSRUE9bQotQ09ORklHX0ZCX0NGQl9JTUFHRUJMSVQ9bQotIyBDT05GSUdfRkJfTUFDTU9ERVMgaXMgbm90IHNldAotIyBDT05GSUdfRkJfQkFDS0xJR0hUIGlzIG5vdCBzZXQKLSMgQ09ORklHX0ZCX01PREVfSEVMUEVSUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19GQl9USUxFQkxJVFRJTkcgaXMgbm90IHNldAotQ09ORklHX0ZCX1NJRFNBPW0KLUNPTkZJR19GQl9TSURTQV9ERUZBVUxUX0JQUD0yNAotIyBDT05GSUdfRkJfUzFEMTNYWFggaXMgbm90IHNldAotIyBDT05GSUdfRkJfVklSVFVBTCBpcyBub3Qgc2V0Ci0KLSMKLSMgTG9nbyBjb25maWd1cmF0aW9uCi0jCi0jIENPTkZJR19MT0dPIGlzIG5vdCBzZXQKLUNPTkZJR19CQUNLTElHSFRfTENEX1NVUFBPUlQ9eQotIyBDT05GSUdfQkFDS0xJR0hUX0NMQVNTX0RFVklDRSBpcyBub3Qgc2V0Ci1DT05GSUdfTENEX0NMQVNTX0RFVklDRT1tCi1DT05GSUdfTENEX0RFVklDRT15Ci1DT05GSUdfTENEX0xUVjM1MFFWPW0KKyMgQ09ORklHX0ZCIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JBQ0tMSUdIVF9MQ0RfU1VQUE9SVCBpcyBub3Qgc2V0CiAKICMKICMgU291bmQKQEAgLTU2MSwxOCArNjIzLDIxIEBACiAjCiAjIEZpbGUgc3lzdGVtcwogIwotQ09ORklHX0VYVDJfRlM9eQorQ09ORklHX0VYVDJfRlM9bQogIyBDT05GSUdfRVhUMl9GU19YQVRUUiBpcyBub3Qgc2V0CiAjIENPTkZJR19FWFQyX0ZTX1hJUCBpcyBub3Qgc2V0CiAjIENPTkZJR19FWFQzX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VYVDRERVZfRlMgaXMgbm90IHNldAogIyBDT05GSUdfUkVJU0VSRlNfRlMgaXMgbm90IHNldAogIyBDT05GSUdfSkZTX0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX0ZTX1BPU0lYX0FDTCBpcyBub3Qgc2V0CiAjIENPTkZJR19YRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfR0ZTMl9GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19PQ0ZTMl9GUyBpcyBub3Qgc2V0CiBDT05GSUdfTUlOSVhfRlM9bQotQ09ORklHX1JPTUZTX0ZTPW0KLSMgQ09ORklHX0lOT1RJRlkgaXMgbm90IHNldAorIyBDT05GSUdfUk9NRlNfRlMgaXMgbm90IHNldAorQ09ORklHX0lOT1RJRlk9eQorQ09ORklHX0lOT1RJRllfVVNFUj15CiAjIENPTkZJR19RVU9UQSBpcyBub3Qgc2V0CiAjIENPTkZJR19ETk9USUZZIGlzIG5vdCBzZXQKICMgQ09ORklHX0FVVE9GU19GUyBpcyBub3Qgc2V0CkBAIC02MDAsOCArNjY1LDEwIEBACiAjCiBDT05GSUdfUFJPQ19GUz15CiBDT05GSUdfUFJPQ19LQ09SRT15CitDT05GSUdfUFJPQ19TWVNDVEw9eQogQ09ORklHX1NZU0ZTPXkKIENPTkZJR19UTVBGUz15CisjIENPTkZJR19UTVBGU19QT1NJWF9BQ0wgaXMgbm90IHNldAogIyBDT05GSUdfSFVHRVRMQl9QQUdFIGlzIG5vdCBzZXQKIENPTkZJR19SQU1GUz15CiBDT05GSUdfQ09ORklHRlNfRlM9bQpAQCAtNjE2LDYgKzY4MywxNiBAQAogIyBDT05GSUdfQkVGU19GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19CRlNfRlMgaXMgbm90IHNldAogIyBDT05GSUdfRUZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0pGRlNfRlMgaXMgbm90IHNldAorQ09ORklHX0pGRlMyX0ZTPXkKK0NPTkZJR19KRkZTMl9GU19ERUJVRz0wCitDT05GSUdfSkZGUzJfRlNfV1JJVEVCVUZGRVI9eQorIyBDT05GSUdfSkZGUzJfU1VNTUFSWSBpcyBub3Qgc2V0CisjIENPTkZJR19KRkZTMl9GU19YQVRUUiBpcyBub3Qgc2V0CisjIENPTkZJR19KRkZTMl9DT01QUkVTU0lPTl9PUFRJT05TIGlzIG5vdCBzZXQKK0NPTkZJR19KRkZTMl9aTElCPXkKK0NPTkZJR19KRkZTMl9SVElNRT15CisjIENPTkZJR19KRkZTMl9SVUJJTiBpcyBub3Qgc2V0CiAjIENPTkZJR19DUkFNRlMgaXMgbm90IHNldAogIyBDT05GSUdfVlhGU19GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19IUEZTX0ZTIGlzIG5vdCBzZXQKQEAgLTYyNiwyNiArNzAzLDEwIEBACiAjCiAjIE5ldHdvcmsgRmlsZSBTeXN0ZW1zCiAjCi1DT05GSUdfTkZTX0ZTPXkKLUNPTkZJR19ORlNfVjM9eQotIyBDT05GSUdfTkZTX1YzX0FDTCBpcyBub3Qgc2V0Ci0jIENPTkZJR19ORlNfVjQgaXMgbm90IHNldAotIyBDT05GSUdfTkZTX0RJUkVDVElPIGlzIG5vdCBzZXQKKyMgQ09ORklHX05GU19GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19ORlNEIGlzIG5vdCBzZXQKLUNPTkZJR19ST09UX05GUz15Ci1DT05GSUdfTE9DS0Q9eQotQ09ORklHX0xPQ0tEX1Y0PXkKLUNPTkZJR19ORlNfQ09NTU9OPXkKLUNPTkZJR19TVU5SUEM9eQotIyBDT05GSUdfUlBDU0VDX0dTU19LUkI1IGlzIG5vdCBzZXQKLSMgQ09ORklHX1JQQ1NFQ19HU1NfU1BLTTMgaXMgbm90IHNldAogIyBDT05GSUdfU01CX0ZTIGlzIG5vdCBzZXQKLUNPTkZJR19DSUZTPW0KLSMgQ09ORklHX0NJRlNfU1RBVFMgaXMgbm90IHNldAotIyBDT05GSUdfQ0lGU19XRUFLX1BXX0hBU0ggaXMgbm90IHNldAotIyBDT05GSUdfQ0lGU19YQVRUUiBpcyBub3Qgc2V0Ci0jIENPTkZJR19DSUZTX0RFQlVHMiBpcyBub3Qgc2V0Ci0jIENPTkZJR19DSUZTX0VYUEVSSU1FTlRBTCBpcyBub3Qgc2V0CisjIENPTkZJR19DSUZTIGlzIG5vdCBzZXQKICMgQ09ORklHX05DUF9GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19DT0RBX0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX0FGU19GUyBpcyBub3Qgc2V0CkBAIC02NjUsNyArNzI2LDcgQEAKIENPTkZJR19OTFNfQ09ERVBBR0VfNDM3PW0KICMgQ09ORklHX05MU19DT0RFUEFHRV83MzcgaXMgbm90IHNldAogIyBDT05GSUdfTkxTX0NPREVQQUdFXzc3NSBpcyBub3Qgc2V0Ci1DT05GSUdfTkxTX0NPREVQQUdFXzg1MD1tCisjIENPTkZJR19OTFNfQ09ERVBBR0VfODUwIGlzIG5vdCBzZXQKICMgQ09ORklHX05MU19DT0RFUEFHRV84NTIgaXMgbm90IHNldAogIyBDT05GSUdfTkxTX0NPREVQQUdFXzg1NSBpcyBub3Qgc2V0CiAjIENPTkZJR19OTFNfQ09ERVBBR0VfODU3IGlzIG5vdCBzZXQKQEAgLTcwNSwxMyArNzY2LDE3IEBACiAjIEtlcm5lbCBoYWNraW5nCiAjCiBDT05GSUdfVFJBQ0VfSVJRRkxBR1NfU1VQUE9SVD15Ci1DT05GSUdfUFJJTlRLX1RJTUU9eQorIyBDT05GSUdfUFJJTlRLX1RJTUUgaXMgbm90IHNldAorQ09ORklHX0VOQUJMRV9NVVNUX0NIRUNLPXkKIENPTkZJR19NQUdJQ19TWVNSUT15CiAjIENPTkZJR19VTlVTRURfU1lNQk9MUyBpcyBub3Qgc2V0CiBDT05GSUdfREVCVUdfS0VSTkVMPXkKIENPTkZJR19MT0dfQlVGX1NISUZUPTE0CiBDT05GSUdfREVURUNUX1NPRlRMT0NLVVA9eQogIyBDT05GSUdfU0NIRURTVEFUUyBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19TTEFCIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX1JUX01VVEVYRVMgaXMgbm90IHNldAorIyBDT05GSUdfUlRfTVVURVhfVEVTVEVSIGlzIG5vdCBzZXQKICMgQ09ORklHX0RFQlVHX1NQSU5MT0NLIGlzIG5vdCBzZXQKICMgQ09ORklHX0RFQlVHX01VVEVYRVMgaXMgbm90IHNldAogIyBDT05GSUdfREVCVUdfUldTRU1TIGlzIG5vdCBzZXQKQEAgLTcyMiwxMSArNzg3LDEzIEBACiAjIENPTkZJR19ERUJVR19JTkZPIGlzIG5vdCBzZXQKIENPTkZJR19ERUJVR19GUz15CiAjIENPTkZJR19ERUJVR19WTSBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19MSVNUIGlzIG5vdCBzZXQKIENPTkZJR19GUkFNRV9QT0lOVEVSPXkKICMgQ09ORklHX1VOV0lORF9JTkZPIGlzIG5vdCBzZXQKIENPTkZJR19GT1JDRURfSU5MSU5JTkc9eQorIyBDT05GSUdfSEVBREVSU19DSEVDSyBpcyBub3Qgc2V0CiAjIENPTkZJR19SQ1VfVE9SVFVSRV9URVNUIGlzIG5vdCBzZXQKLUNPTkZJR19LUFJPQkVTPXkKKyMgQ09ORklHX0tQUk9CRVMgaXMgbm90IHNldAogCiAjCiAjIFNlY3VyaXR5IG9wdGlvbnMKQEAgLTc0MCwxNSArODA3LDEzIEBACiAjIENPTkZJR19DUllQVE8gaXMgbm90IHNldAogCiAjCi0jIEhhcmR3YXJlIGNyeXB0byBkZXZpY2VzCi0jCi0KLSMKICMgTGlicmFyeSByb3V0aW5lcwogIwogQ09ORklHX0NSQ19DQ0lUVD1tCiAjIENPTkZJR19DUkMxNiBpcyBub3Qgc2V0Ci1DT05GSUdfQ1JDMzI9bQorQ09ORklHX0NSQzMyPXkKICMgQ09ORklHX0xJQkNSQzMyQyBpcyBub3Qgc2V0Ci1DT05GSUdfWkxJQl9JTkZMQVRFPW0KLUNPTkZJR19aTElCX0RFRkxBVEU9bQorQ09ORklHX0FVRElUX0dFTkVSSUM9eQorQ09ORklHX1pMSUJfSU5GTEFURT15CitDT05GSUdfWkxJQl9ERUZMQVRFPXkKK0NPTkZJR19QTElTVD15CmRpZmYgLS1naXQgYS9hcmNoL2F2cjMyL2tlcm5lbC9hdnIzMl9rc3ltcy5jIGIvYXJjaC9hdnIzMi9rZXJuZWwvYXZyMzJfa3N5bXMuYwppbmRleCAwNGY3NjdhLi4zNzJlM2Y4IDEwMDY0NAotLS0gYS9hcmNoL2F2cjMyL2tlcm5lbC9hdnIzMl9rc3ltcy5jCisrKyBiL2FyY2gvYXZyMzIva2VybmVsL2F2cjMyX2tzeW1zLmMKQEAgLTcsNiArNyw3IEBACiAgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcwogICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCiAgKi8KKyNpbmNsdWRlIDxsaW51eC9pby5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogCiAjaW5jbHVkZSA8YXNtL2NoZWNrc3VtLmg+CkBAIC01MywzICs1NCwxMSBAQAogRVhQT1JUX1NZTUJPTChmaW5kX2ZpcnN0X2JpdCk7CiBFWFBPUlRfU1lNQk9MKGZpbmRfbmV4dF9iaXQpOwogRVhQT1JUX1NZTUJPTChnZW5lcmljX2ZpbmRfbmV4dF96ZXJvX2xlX2JpdCk7CisKKy8qIEkvTyBwcmltaXRpdmVzIChsaWIvaW8tKi5TKSAqLworRVhQT1JUX1NZTUJPTChfX3Jhd19yZWFkc2IpOworRVhQT1JUX1NZTUJPTChfX3Jhd19yZWFkc3cpOworRVhQT1JUX1NZTUJPTChfX3Jhd19yZWFkc2wpOworRVhQT1JUX1NZTUJPTChfX3Jhd193cml0ZXNiKTsKK0VYUE9SVF9TWU1CT0woX19yYXdfd3JpdGVzdyk7CitFWFBPUlRfU1lNQk9MKF9fcmF3X3dyaXRlc2wpOwpkaWZmIC0tZ2l0IGEvYXJjaC9hdnIzMi9rZXJuZWwvaGVhZC5TIGIvYXJjaC9hdnIzMi9rZXJuZWwvaGVhZC5TCmluZGV4IDc3M2I3YWQuLjYxNjNiZDAgMTAwNjQ0Ci0tLSBhL2FyY2gvYXZyMzIva2VybmVsL2hlYWQuUworKysgYi9hcmNoL2F2cjMyL2tlcm5lbC9oZWFkLlMKQEAgLTMwLDkgKzMwLDYgQEAKIAltb3YJcjcsIDAKICNlbmRpZgogCi0JLyogU2V0IHVwIHRoZSBQSU8sIFNEUkFNIGNvbnRyb2xsZXIsIGVhcmx5IHByaW50aywgZXRjLiAqLwotCXJjYWxsCWJvYXJkX2Vhcmx5X2luaXQKLQogCS8qIFN0YXJ0IHRoZSBzaG93ICovCiAJbGRkcGMgICBwYywga2VybmVsX3N0YXJ0X2FkZHIKIApkaWZmIC0tZ2l0IGEvYXJjaC9hdnIzMi9rZXJuZWwva3Byb2Jlcy5jIGIvYXJjaC9hdnIzMi9rZXJuZWwva3Byb2Jlcy5jCmluZGV4IDZjYWY5ZTguLmNhNDFmYzEgMTAwNjQ0Ci0tLSBhL2FyY2gvYXZyMzIva2VybmVsL2twcm9iZXMuYworKysgYi9hcmNoL2F2cjMyL2tlcm5lbC9rcHJvYmVzLmMKQEAgLTEwOSw3ICsxMDksNyBAQAogCXZvaWQgKmFkZHIgPSAodm9pZCAqKXJlZ3MtPnBjOwogCWludCByZXQgPSAwOwogCi0JcHJfZGVidWcoImtwcm9iZV9oYW5kbGVyOiBrcHJvYmVfcnVubmluZz0lZFxuIiwKKwlwcl9kZWJ1Zygia3Byb2JlX2hhbmRsZXI6IGtwcm9iZV9ydW5uaW5nPSVwXG4iLAogCQkga3Byb2JlX3J1bm5pbmcoKSk7CiAKIAkvKgpkaWZmIC0tZ2l0IGEvYXJjaC9hdnIzMi9rZXJuZWwvbW9kdWxlLmMgYi9hcmNoL2F2cjMyL2tlcm5lbC9tb2R1bGUuYwppbmRleCBkZmMzMmYyLi5iNTk5ZWFlIDEwMDY0NAotLS0gYS9hcmNoL2F2cjMyL2tlcm5lbC9tb2R1bGUuYworKysgYi9hcmNoL2F2cjMyL2tlcm5lbC9tb2R1bGUuYwpAQCAtMjYzLDcgKzI2Myw3IEBACiAJCQkgKiB2YWx1ZSBvZiBQQy4gIEp1c3Qgc3VidHJhY3QgdGhlIHZhbHVlIG9mCiAJCQkgKiBHT1QsIGFuZCB3ZSdyZSBkb25lLgogCQkJICovCi0JCQlwcl9kZWJ1ZygiR09UUEM6IFBDPTB4JWx4LCBnb3Rfb2Zmc2V0PTB4JWx4LCBjb3JlPTB4JXBcbiIsCisJCQlwcl9kZWJ1ZygiR09UUEM6IFBDPTB4JXgsIGdvdF9vZmZzZXQ9MHglbHgsIGNvcmU9MHglcFxuIiwKIAkJCQkgcmVsb2NhdGlvbiwgbW9kdWxlLT5hcmNoLmdvdF9vZmZzZXQsCiAJCQkJIG1vZHVsZS0+bW9kdWxlX2NvcmUpOwogCQkJcmVsb2NhdGlvbiAtPSAoKHVuc2lnbmVkIGxvbmcpbW9kdWxlLT5tb2R1bGVfY29yZQpAQCAtMjgyLDcgKzI4Miw3IEBACiAJCQkgICAgJiYgKHJlbG9jYXRpb24gJiAweGZmZmYwMDAwKSAhPSAweGZmZmYwMDAwKQogCQkJCXJldHVybiByZWxvY19vdmVyZmxvdyhtb2R1bGUsICJSX0FWUjMyX0dPVDE2UyIsCiAJCQkJCQkgICAgICByZWxvY2F0aW9uKTsKLQkJCXByX2RlYnVnKCJHT1QgcmVsb2MgQCAweCVseCAtPiAlbHVcbiIsCisJCQlwcl9kZWJ1ZygiR09UIHJlbG9jIEAgMHgleCAtPiAldVxuIiwKIAkJCQkgcmVsLT5yX29mZnNldCwgcmVsb2NhdGlvbik7CiAJCQl2YWx1ZSA9ICpsb2NhdGlvbjsKIAkJCXZhbHVlID0gKCh2YWx1ZSAmIDB4ZmZmZjAwMDApCmRpZmYgLS1naXQgYS9hcmNoL2F2cjMyL2tlcm5lbC9wdHJhY2UuYyBiL2FyY2gvYXZyMzIva2VybmVsL3B0cmFjZS5jCmluZGV4IDNjODllNTkuLmYyZTgxY2QgMTAwNjQ0Ci0tLSBhL2FyY2gvYXZyMzIva2VybmVsL3B0cmFjZS5jCisrKyBiL2FyY2gvYXZyMzIva2VybmVsL3B0cmFjZS5jCkBAIC0xNTcsNyArMTU3LDcgQEAKIAl1bnNpZ25lZCBsb25nIHRtcDsKIAlpbnQgcmV0OwogCi0JcHJfZGVidWcoImFyY2hfcHRyYWNlKCVsZCwgJWxkLCAlI2x4LCAlI2x4KVxuIiwKKwlwcl9kZWJ1ZygiYXJjaF9wdHJhY2UoJWxkLCAlZCwgJSNseCwgJSNseClcbiIsCiAJCSByZXF1ZXN0LCBjaGlsZC0+cGlkLCBhZGRyLCBkYXRhKTsKIAogCXByX2RlYnVnKCJwdHJhY2U6IEVuYWJsaW5nIG1vbml0b3IgbW9kZS4uLlxuIik7CmRpZmYgLS1naXQgYS9hcmNoL2F2cjMyL2tlcm5lbC9zeXNjYWxsLXN0dWJzLlMgYi9hcmNoL2F2cjMyL2tlcm5lbC9zeXNjYWxsLXN0dWJzLlMKaW5kZXggNzU4OWE5Yi4uODkwMjg2YSAxMDA2NDQKLS0tIGEvYXJjaC9hdnIzMi9rZXJuZWwvc3lzY2FsbC1zdHVicy5TCisrKyBiL2FyY2gvYXZyMzIva2VybmVsL3N5c2NhbGwtc3R1YnMuUwpAQCAtMTAwLDMgKzEwMCwxMiBAQAogCXJjYWxsCXN5c19zcGxpY2UKIAlzdWIJc3AsIC00CiAJcG9wbQlwYworCisJLmdsb2JhbAlfX3N5c19lcG9sbF9wd2FpdAorCS50eXBlCV9fc3lzX2Vwb2xsX3B3YWl0LEBmdW5jdGlvbgorX19zeXNfZXBvbGxfcHdhaXQ6CisJcHVzaG0JbHIKKwlzdC53CS0tc3AsIEFSRzYKKwlyY2FsbAlzeXNfZXBvbGxfcHdhaXQKKwlzdWIJc3AsIC00CisJcG9wbQlwYwpkaWZmIC0tZ2l0IGEvYXJjaC9hdnIzMi9rZXJuZWwvc3lzY2FsbF90YWJsZS5TIGIvYXJjaC9hdnIzMi9rZXJuZWwvc3lzY2FsbF90YWJsZS5TCmluZGV4IDYzYjIwNjkuLmRiOGY4YjUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXZyMzIva2VybmVsL3N5c2NhbGxfdGFibGUuUworKysgYi9hcmNoL2F2cjMyL2tlcm5lbC9zeXNjYWxsX3RhYmxlLlMKQEAgLTI4Niw0ICsyODYsNSBAQAogCS5sb25nCXN5c19zeW5jX2ZpbGVfcmFuZ2UKIAkubG9uZwlzeXNfdGVlCiAJLmxvbmcJc3lzX3Ztc3BsaWNlCisJLmxvbmcJX19zeXNfZXBvbGxfcHdhaXQJLyogMjY1ICovCiAJLmxvbmcJc3lzX25pX3N5c2NhbGwJCS8qIHI4IGlzIHNhdHVyYXRlZCBhdCBucl9zeXNjYWxscyAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9hdnIzMi9rZXJuZWwvdGltZS5jIGIvYXJjaC9hdnIzMi9rZXJuZWwvdGltZS5jCmluZGV4IDNlNTZiOWYuLjVhMjQ3YmEgMTAwNjQ0Ci0tLSBhL2FyY2gvYXZyMzIva2VybmVsL3RpbWUuYworKysgYi9hcmNoL2F2cjMyL2tlcm5lbC90aW1lLmMKQEAgLTEyNCwxNSArMTI0LDE1IEBACiAgKgogICogSW4gVVAgbW9kZSwgaXQgaXMgaW52b2tlZCBmcm9tIHRoZSAoZ2xvYmFsKSB0aW1lcl9pbnRlcnJ1cHQuCiAgKi8KLXN0YXRpYyB2b2lkIGxvY2FsX3RpbWVyX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQorc3RhdGljIHZvaWQgbG9jYWxfdGltZXJfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCkKIHsKIAlpZiAoY3VycmVudC0+cGlkKQotCQlwcm9maWxlX3RpY2soQ1BVX1BST0ZJTElORywgcmVncyk7Ci0JdXBkYXRlX3Byb2Nlc3NfdGltZXModXNlcl9tb2RlKHJlZ3MpKTsKKwkJcHJvZmlsZV90aWNrKENQVV9QUk9GSUxJTkcpOworCXVwZGF0ZV9wcm9jZXNzX3RpbWVzKHVzZXJfbW9kZShnZXRfaXJxX3JlZ3MoKSkpOwogfQogCiBzdGF0aWMgaXJxcmV0dXJuX3QKLXRpbWVyX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQordGltZXJfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCkKIHsKIAl1bnNpZ25lZCBpbnQgY291bnQ7CiAKQEAgLTE1Nyw3ICsxNTcsNyBAQAogCSAqCiAJICogU01QIGlzIG5vdCBzdXBwb3J0ZWQgeWV0LgogCSAqLwotCWxvY2FsX3RpbWVyX2ludGVycnVwdChpcnEsIGRldl9pZCwgcmVncyk7CisJbG9jYWxfdGltZXJfaW50ZXJydXB0KGlycSwgZGV2X2lkKTsKIAogCXJldHVybiBJUlFfSEFORExFRDsKIH0KZGlmZiAtLWdpdCBhL2FyY2gvYXZyMzIva2VybmVsL3ZtbGludXgubGRzLmMgYi9hcmNoL2F2cjMyL2tlcm5lbC92bWxpbnV4Lmxkcy5jCmluZGV4IGNkZDYyN2MuLjVjNDQyNGUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXZyMzIva2VybmVsL3ZtbGludXgubGRzLmMKKysrIGIvYXJjaC9hdnIzMi9rZXJuZWwvdm1saW51eC5sZHMuYwpAQCAtMzgsMTMgKzM4LDcgQEAKIAkJX19zZXR1cF9lbmQgPSAuOwogCQkuID0gQUxJR04oNCk7CiAJCV9faW5pdGNhbGxfc3RhcnQgPSAuOwotCQkJKiguaW5pdGNhbGwxLmluaXQpCi0JCQkqKC5pbml0Y2FsbDIuaW5pdCkKLQkJCSooLmluaXRjYWxsMy5pbml0KQotCQkJKiguaW5pdGNhbGw0LmluaXQpCi0JCQkqKC5pbml0Y2FsbDUuaW5pdCkKLQkJCSooLmluaXRjYWxsNi5pbml0KQotCQkJKiguaW5pdGNhbGw3LmluaXQpCisJCQlJTklUQ0FMTFMKIAkJX19pbml0Y2FsbF9lbmQgPSAuOwogCQlfX2Nvbl9pbml0Y2FsbF9zdGFydCA9IC47CiAJCQkqKC5jb25faW5pdGNhbGwuaW5pdCkKZGlmZiAtLWdpdCBhL2FyY2gvYXZyMzIvbGliL01ha2VmaWxlIGIvYXJjaC9hdnIzMi9saWIvTWFrZWZpbGUKaW5kZXggMDlhYzQzZS4uMDg0ZDk1YiAxMDA2NDQKLS0tIGEvYXJjaC9hdnIzMi9saWIvTWFrZWZpbGUKKysrIGIvYXJjaC9hdnIzMi9saWIvTWFrZWZpbGUKQEAgLTcsNCArNyw1IEBACiBsaWIteQkrPSBkZWxheS5vIG1lbXNldC5vIG1lbWNweS5vIGZpbmRiaXQubwogbGliLXkJKz0gY3N1bV9wYXJ0aWFsLm8gY3N1bV9wYXJ0aWFsX2NvcHlfZ2VuZXJpYy5vCiBsaWIteQkrPSBpby1yZWFkc3cubyBpby1yZWFkc2wubyBpby13cml0ZXN3Lm8gaW8td3JpdGVzbC5vCitsaWIteQkrPSBpby1yZWFkc2IubyBpby13cml0ZXNiLm8KIGxpYi15CSs9IF9fYXZyMzJfbHNsNjQubyBfX2F2cjMyX2xzcjY0Lm8gX19hdnIzMl9hc3I2NC5vCmRpZmYgLS1naXQgYS9hcmNoL2F2cjMyL2xpYi9maW5kYml0LlMgYi9hcmNoL2F2cjMyL2xpYi9maW5kYml0LlMKaW5kZXggMmI0ODU2Zi4uYzZiOTFkZSAxMDA2NDQKLS0tIGEvYXJjaC9hdnIzMi9saWIvZmluZGJpdC5TCisrKyBiL2FyY2gvYXZyMzIvbGliL2ZpbmRiaXQuUwpAQCAtMTM2LDYgKzEzNiw3IEBACiAJLyogb2Zmc2V0IGlzIG5vdCB3b3JkLWFsaWduZWQuIEhhbmRsZSB0aGUgZmlyc3QgKDMyIC0gcjEwKSBiaXRzICovCiAJbGRzd3AudwlyOCwgcjEyWzBdCiAJc3ViCXIxMiwgLTQKKwljb20JcjgKIAlsc3IJcjgsIHI4LCByMTAKIAlicm5lCS5MX2ZvdW5kCiAKQEAgLTE0Niw3ICsxNDcsNyBAQAogCiAJLyogTWFpbiBsb29wLiBvZmZzZXQgbXVzdCBiZSB3b3JkLWFsaWduZWQgKi8KIDE6CWxkc3dwLncJcjgsIHIxMlswXQotCWNwLncJcjgsIDAKKwljb20JcjgKIAlicm5lCS5MX2ZvdW5kCiAJc3ViCXIxMiwgLTQKIAlzdWIJcjksIDMyCmRpZmYgLS1naXQgYS9hcmNoL2F2cjMyL2xpYi9pby1yZWFkc2IuUyBiL2FyY2gvYXZyMzIvbGliL2lvLXJlYWRzYi5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJiZTVkYTcKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2F2cjMyL2xpYi9pby1yZWFkc2IuUwpAQCAtMCwwICsxLDQ5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMDYgQXRtZWwgQ29ycG9yYXRpb24KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisKKwkudGV4dAorLkxub3Rfd29yZF9hbGlnbmVkOgorMToJbGQudWIJcjgsIHIxMlswXQorCXN1YglyMTAsIDEKKwlzdC5iCXIxMSsrLCByOAorCXJldGVxCXIxMgorCXRzdAlyMTEsIHI5CisJYnJuZQkxYgorCisJLyogZmFsbCB0aHJvdWdoICovCisKKwkuZ2xvYmFsCV9fcmF3X3JlYWRzYgorCS50eXBlCV9fcmF3X3JlYWRzYixAZnVuY3Rpb24KK19fcmF3X3JlYWRzYjoKKwljcC53CXIxMCwgMAorCW1vdglyOSwgMworCXJldGVxCXIxMgorCisJdHN0CXIxMSwgcjkKKwlicm5lCS5Mbm90X3dvcmRfYWxpZ25lZAorCisJc3ViCXIxMCwgNAorCWJybHQJMmYKKworMToJbGRpbnMuYglyODp0LCByMTJbMF0KKwlsZGlucy5iCXI4OnUsIHIxMlswXQorCWxkaW5zLmIJcjg6bCwgcjEyWzBdCisJbGRpbnMuYiByODpiLCByMTJbMF0KKwlzdC53CXIxMSsrLCByOAorCXN1YglyMTAsIDQKKwlicmdlCTFiCisKKzI6CXN1YglyMTAsIC00CisJcmV0ZXEJcjEyCisKKzM6CWxkLnVoCXI4LCByMTJbMF0KKwlzdWIJcjEwLCAxCisJc3QuYglyMTErKywgcjgKKwlicm5lCTNiCisKKwlyZXRhbAlyMTIKZGlmZiAtLWdpdCBhL2FyY2gvYXZyMzIvbGliL2lvLXdyaXRlc2IuUyBiL2FyY2gvYXZyMzIvbGliL2lvLXdyaXRlc2IuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNGViYWFjCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hdnIzMi9saWIvaW8td3JpdGVzYi5TCkBAIC0wLDAgKzEsNTIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAwNiBBdG1lbCBDb3Jwb3JhdGlvbgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKi8KKworCS50ZXh0CisuTG5vdF93b3JkX2FsaWduZWQ6CisxOglsZC51YglyOCwgcjExKysKKwlzdWIJcjEwLCAxCisJc3QuYglyMTJbMF0sIHI4CisJcmV0ZXEJcjEyCisJdHN0CXIxMSwgcjkKKwlicm5lCTFiCisKKwkvKiBmYWxsIHRocm91Z2ggKi8KKworCS5nbG9iYWwJX19yYXdfd3JpdGVzYgorCS50eXBlCV9fcmF3X3dyaXRlc2IsQGZ1bmN0aW9uCitfX3Jhd193cml0ZXNiOgorCWNwLncJcjEwLCAwCisJbW92CXI5LCAzCisJcmV0ZXEJcjEyCisKKwl0c3QJcjExLCByOQorCWJybmUJLkxub3Rfd29yZF9hbGlnbmVkCisKKwlzdWIJcjEwLCA0CisJYnJsdAkyZgorCisxOglsZC53CXI4LCByMTErKworCWJmZXh0dQlyOSwgcjgsIDI0LCA4CisJc3QuYglyMTJbMF0sIHI5CisJYmZleHR1CXI5LCByOCwgMTYsIDgKKwlzdC5iCXIxMlswXSwgcjkKKwliZmV4dHUJcjksIHI4LCA4LCA4CisJc3QuYglyMTJbMF0sIHI5CisJc3QuYglyMTJbMF0sIHI4CisJc3ViCXIxMCwgNAorCWJyZ2UJMWIKKworMjoJc3ViCXIxMCwgLTQKKwlyZXRlcQlyMTIKKworMzoJbGQudWIJcjgsIHIxMSsrCisJc3ViCXIxMCwgMQorCXN0LmIJcjEyWzBdLCByOAorCWJybmUJM2IKKworCXJldGFsCXIxMgpkaWZmIC0tZ2l0IGEvYXJjaC9hdnIzMi9tYWNoLWF0MzJhcC9leHRpbnQuYyBiL2FyY2gvYXZyMzIvbWFjaC1hdDMyYXAvZXh0aW50LmMKaW5kZXggN2RhOWM1Zi4uNGRmZjFmOSAxMDA2NDQKLS0tIGEvYXJjaC9hdnIzMi9tYWNoLWF0MzJhcC9leHRpbnQuYworKysgYi9hcmNoL2F2cjMyL21hY2gtYXQzMmFwL2V4dGludC5jCkBAIC0xMDIsOCArMTAyLDcgQEAKIAkuc2V0X3R5cGUJPSBlaW1fc2V0X2lycV90eXBlLAogfTsKIAotc3RhdGljIHZvaWQgZGVtdXhfZWltX2lycSh1bnNpZ25lZCBpbnQgaXJxLCBzdHJ1Y3QgaXJxX2Rlc2MgKmRlc2MsCi0JCQkgIHN0cnVjdCBwdF9yZWdzICpyZWdzKQorc3RhdGljIHZvaWQgZGVtdXhfZWltX2lycSh1bnNpZ25lZCBpbnQgaXJxLCBzdHJ1Y3QgaXJxX2Rlc2MgKmRlc2MpCiB7CiAJc3RydWN0IGF0MzJfc20gKnNtID0gZGVzYy0+aGFuZGxlcl9kYXRhOwogCXN0cnVjdCBpcnFfZGVzYyAqZXh0X2Rlc2M7CkBAIC0xMjEsNyArMTIwLDcgQEAKIAogCQlleHRfaXJxID0gaSArIHNtLT5laW1fZmlyc3RfaXJxOwogCQlleHRfZGVzYyA9IGlycV9kZXNjICsgZXh0X2lycTsKLQkJZXh0X2Rlc2MtPmhhbmRsZV9pcnEoZXh0X2lycSwgZXh0X2Rlc2MsIHJlZ3MpOworCQlleHRfZGVzYy0+aGFuZGxlX2lycShleHRfaXJxLCBleHRfZGVzYyk7CiAJfQogCiAJc3Bpbl91bmxvY2soJnNtLT5sb2NrKTsKZGlmZiAtLWdpdCBhL2FyY2gvYXZyMzIvbWFjaC1hdDMyYXAvaHNtYy5oIGIvYXJjaC9hdnIzMi9tYWNoLWF0MzJhcC9oc21jLmgKaW5kZXggNTY4MTI3Ni4uZDFkNDhlMiAxMDA2NDQKLS0tIGEvYXJjaC9hdnIzMi9tYWNoLWF0MzJhcC9oc21jLmgKKysrIGIvYXJjaC9hdnIzMi9tYWNoLWF0MzJhcC9oc21jLmgKQEAgLTEyMCw4ICsxMjAsOCBAQAogCiAvKiBSZWdpc3RlciBhY2Nlc3MgbWFjcm9zICovCiAjZGVmaW5lIGhzbWNfcmVhZGwocG9ydCxyZWcpCQkJCQkJXAotCXJlYWRsKChwb3J0KS0+cmVncyArIEhTTUNfIyNyZWcpCisJX19yYXdfcmVhZGwoKHBvcnQpLT5yZWdzICsgSFNNQ18jI3JlZykKICNkZWZpbmUgaHNtY193cml0ZWwocG9ydCxyZWcsdmFsdWUpCQkJCQlcCi0Jd3JpdGVsKCh2YWx1ZSksIChwb3J0KS0+cmVncyArIEhTTUNfIyNyZWcpCisJX19yYXdfd3JpdGVsKCh2YWx1ZSksIChwb3J0KS0+cmVncyArIEhTTUNfIyNyZWcpCiAKICNlbmRpZiAvKiBfX0FTTV9BVlIzMl9IU01DX0hfXyAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9hdnIzMi9tYWNoLWF0MzJhcC9pbnRjLmMgYi9hcmNoL2F2cjMyL21hY2gtYXQzMmFwL2ludGMuYwppbmRleCA3NGY4YzlmLi5lYjg3YTE4IDEwMDY0NAotLS0gYS9hcmNoL2F2cjMyL21hY2gtYXQzMmFwL2ludGMuYworKysgYi9hcmNoL2F2cjMyL21hY2gtYXQzMmFwL2ludGMuYwpAQCAtNTIsMTYgKzUyLDE5IEBACiBhc21saW5rYWdlIHZvaWQgZG9fSVJRKGludCBsZXZlbCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCiB7CiAJc3RydWN0IGlycV9kZXNjICpkZXNjOworCXN0cnVjdCBwdF9yZWdzICpvbGRfcmVnczsKIAl1bnNpZ25lZCBpbnQgaXJxOwogCXVuc2lnbmVkIGxvbmcgc3RhdHVzX3JlZzsKIAogCWxvY2FsX2lycV9kaXNhYmxlKCk7CiAKKwlvbGRfcmVncyA9IHNldF9pcnFfcmVncyhyZWdzKTsKKwogCWlycV9lbnRlcigpOwogCiAJaXJxID0gaW50Y19yZWFkbCgmaW50YzAsIElOVENBVVNFMCAtIDQgKiBsZXZlbCk7CiAJZGVzYyA9IGlycV9kZXNjICsgaXJxOwotCWRlc2MtPmhhbmRsZV9pcnEoaXJxLCBkZXNjLCByZWdzKTsKKwlkZXNjLT5oYW5kbGVfaXJxKGlycSwgZGVzYyk7CiAKIAkvKgogCSAqIENsZWFyIGFsbCBpbnRlcnJ1cHQgbGV2ZWwgbWFza3Mgc28gdGhhdCB3ZSBtYXkgaGFuZGxlCkBAIC03NSw2ICs3OCw4IEBACiAJc3lzcmVnX3dyaXRlKFNSLCBzdGF0dXNfcmVnKTsKIAogCWlycV9leGl0KCk7CisKKwlzZXRfaXJxX3JlZ3Mob2xkX3JlZ3MpOwogfQogCiB2b2lkIF9faW5pdCBpbml0X0lSUSh2b2lkKQpkaWZmIC0tZ2l0IGEvYXJjaC9hdnIzMi9tYWNoLWF0MzJhcC9pbnRjLmggYi9hcmNoL2F2cjMyL21hY2gtYXQzMmFwL2ludGMuaAppbmRleCBkMjg5Y2EyLi40ZDM2NjRlIDEwMDY0NAotLS0gYS9hcmNoL2F2cjMyL21hY2gtYXQzMmFwL2ludGMuaAorKysgYi9hcmNoL2F2cjMyL21hY2gtYXQzMmFwL2ludGMuaApAQCAtMzIxLDcgKzMyMSw5IEBACiAjZGVmaW5lIElOVENfTUtCRihuYW1lLCB2YWx1ZSkgICAgICAgKCgodmFsdWUpICYgKCgxIDw8IElOVENfIyNuYW1lIyNfU0laRSkgLSAxKSkgPDwgSU5UQ18jI25hbWUjI19PRkZTRVQpCiAjZGVmaW5lIElOVENfR0VUQkYobmFtZSwgdmFsdWUpICAgICAgKCgodmFsdWUpID4+IElOVENfIyNuYW1lIyNfT0ZGU0VUKSAmICgoMSA8PCBJTlRDXyMjbmFtZSMjX1NJWkUpIC0gMSkpCiAKLSNkZWZpbmUgaW50Y19yZWFkbChwb3J0LHJlZykgICAgICAgICByZWFkbCgocG9ydCktPnJlZ3MgKyBJTlRDXyMjcmVnKQotI2RlZmluZSBpbnRjX3dyaXRlbChwb3J0LHJlZyx2YWx1ZSkgIHdyaXRlbCgodmFsdWUpLCAocG9ydCktPnJlZ3MgKyBJTlRDXyMjcmVnKQorI2RlZmluZSBpbnRjX3JlYWRsKHBvcnQscmVnKQkJCQkJXAorCV9fcmF3X3JlYWRsKChwb3J0KS0+cmVncyArIElOVENfIyNyZWcpCisjZGVmaW5lIGludGNfd3JpdGVsKHBvcnQscmVnLHZhbHVlKQkJCQlcCisJX19yYXdfd3JpdGVsKCh2YWx1ZSksIChwb3J0KS0+cmVncyArIElOVENfIyNyZWcpCiAKICNlbmRpZiAvKiBfX0FTTV9BVlIzMl9QRVJJSFBfSU5UQ19IX18gKi8KZGlmZiAtLWdpdCBhL2FyY2gvYXZyMzIvbWFjaC1hdDMyYXAvcGlvLmggYi9hcmNoL2F2cjMyL21hY2gtYXQzMmFwL3Bpby5oCmluZGV4IGNmZWExMjMuLjUwZmEzYWMgMTAwNjQ0Ci0tLSBhL2FyY2gvYXZyMzIvbWFjaC1hdDMyYXAvcGlvLmgKKysrIGIvYXJjaC9hdnIzMi9tYWNoLWF0MzJhcC9waW8uaApAQCAtMTcwLDggKzE3MCwxMCBAQAogI2RlZmluZSBQSU9fQkZJTlMobmFtZSx2YWx1ZSxvbGQpICAgICAgICAgICAgICAoKChvbGQpICYgfigoKDEgPDwgUElPXyMjbmFtZSMjX1NJWkUpIC0gMSkgPDwgUElPXyMjbmFtZSMjX09GRlNFVCkpIHwgUElPX0JGKG5hbWUsdmFsdWUpKQogCiAvKiBSZWdpc3RlciBhY2Nlc3MgbWFjcm9zICovCi0jZGVmaW5lIHBpb19yZWFkbChwb3J0LHJlZykgICAgICAgICAgICAgICAgICAgIHJlYWRsKChwb3J0KS0+cmVncyArIFBJT18jI3JlZykKLSNkZWZpbmUgcGlvX3dyaXRlbChwb3J0LHJlZyx2YWx1ZSkgICAgICAgICAgICAgd3JpdGVsKCh2YWx1ZSksIChwb3J0KS0+cmVncyArIFBJT18jI3JlZykKKyNkZWZpbmUgcGlvX3JlYWRsKHBvcnQscmVnKQkJCQkJXAorCV9fcmF3X3JlYWRsKChwb3J0KS0+cmVncyArIFBJT18jI3JlZykKKyNkZWZpbmUgcGlvX3dyaXRlbChwb3J0LHJlZyx2YWx1ZSkJCQkJXAorCV9fcmF3X3dyaXRlbCgodmFsdWUpLCAocG9ydCktPnJlZ3MgKyBQSU9fIyNyZWcpCiAKIHZvaWQgYXQzMl9pbml0X3BpbyhzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KTsKIApkaWZmIC0tZ2l0IGEvYXJjaC9hdnIzMi9tYWNoLWF0MzJhcC9zbS5oIGIvYXJjaC9hdnIzMi9tYWNoLWF0MzJhcC9zbS5oCmluZGV4IDI3NTY1ODIuLmNhZDAyYjUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXZyMzIvbWFjaC1hdDMyYXAvc20uaAorKysgYi9hcmNoL2F2cjMyL21hY2gtYXQzMmFwL3NtLmgKQEAgLTIzNCw3ICsyMzQsOSBAQAogI2RlZmluZSBTTV9CRklOUyhuYW1lLHZhbHVlLG9sZCkgICAgICAgICAgICAgICAgKCgob2xkKSAmIH4oKCgxIDw8IFNNXyMjbmFtZSMjX1NJWkUpIC0gMSkgPDwgU01fIyNuYW1lIyNfT0ZGU0VUKSkgfCBTTV9CRihuYW1lLHZhbHVlKSkKIAogLyogUmVnaXN0ZXIgYWNjZXNzIG1hY3JvcyAqLwotI2RlZmluZSBzbV9yZWFkbChwb3J0LHJlZykgICAgICAgICAgICAgICAgICAgICAgcmVhZGwoKHBvcnQpLT5yZWdzICsgU01fIyNyZWcpCi0jZGVmaW5lIHNtX3dyaXRlbChwb3J0LHJlZyx2YWx1ZSkgICAgICAgICAgICAgICB3cml0ZWwoKHZhbHVlKSwgKHBvcnQpLT5yZWdzICsgU01fIyNyZWcpCisjZGVmaW5lIHNtX3JlYWRsKHBvcnQscmVnKQkJCQkJXAorCV9fcmF3X3JlYWRsKChwb3J0KS0+cmVncyArIFNNXyMjcmVnKQorI2RlZmluZSBzbV93cml0ZWwocG9ydCxyZWcsdmFsdWUpCQkJCVwKKwlfX3Jhd193cml0ZWwoKHZhbHVlKSwgKHBvcnQpLT5yZWdzICsgU01fIyNyZWcpCiAKICNlbmRpZiAvKiBfX0FTTV9BVlIzMl9TTV9IX18gKi8KZGlmZiAtLWdpdCBhL2FyY2gvYXZyMzIvbW0vaW5pdC5jIGIvYXJjaC9hdnIzMi9tbS9pbml0LmMKaW5kZXggM2U2YzQxMC4uNzBkYTY4OSAxMDA2NDQKLS0tIGEvYXJjaC9hdnIzMi9tbS9pbml0LmMKKysrIGIvYXJjaC9hdnIzMi9tbS9pbml0LmMKQEAgLTIwNiw3ICsyMDYsNyBAQAogCiAJaWYgKG1lbV9yYW1kaXNrKSB7CiAjaWZkZWYgQ09ORklHX0JMS19ERVZfSU5JVFJECi0JCWluaXRyZF9zdGFydCA9IF9fdmEobWVtX3JhbWRpc2stPmFkZHIpOworCQlpbml0cmRfc3RhcnQgPSAodW5zaWduZWQgbG9uZylfX3ZhKG1lbV9yYW1kaXNrLT5hZGRyKTsKIAkJaW5pdHJkX2VuZCA9IGluaXRyZF9zdGFydCArIG1lbV9yYW1kaXNrLT5zaXplOwogCiAJCXByaW50X21lbW9yeV9tYXAoIlJBTURJU0sgaW1hZ2VzIiwgbWVtX3JhbWRpc2spOwpkaWZmIC0tZ2l0IGEvYXJjaC9hdnIzMi9tbS9pb3JlbWFwLmMgYi9hcmNoL2F2cjMyL21tL2lvcmVtYXAuYwppbmRleCA4Y2ZlYzY1Li4zNDM3YzgyIDEwMDY0NAotLS0gYS9hcmNoL2F2cjMyL21tL2lvcmVtYXAuYworKysgYi9hcmNoL2F2cjMyL21tL2lvcmVtYXAuYwpAQCAtNzcsNiArNzcsOCBAQAogCiAJaWYgKCh1bnNpZ25lZCBsb25nKWFkZHIgPj0gUDRTRUcpCiAJCXJldHVybjsKKwlpZiAoUFhTRUcoYWRkcikgPT0gUDJTRUcpCisJCXJldHVybjsKIAogCXAgPSByZW1vdmVfdm1fYXJlYSgodm9pZCAqKShQQUdFX01BU0sgJiAodW5zaWduZWQgbG9uZyBfX2ZvcmNlKWFkZHIpKTsKIAlpZiAodW5saWtlbHkoIXApKSB7CmRpZmYgLS1naXQgYS9hcmNoL2NyaXMvYXJjaC12MzIvZHJpdmVycy9jcnlwdG9jb3AuYyBiL2FyY2gvY3Jpcy9hcmNoLXYzMi9kcml2ZXJzL2NyeXB0b2NvcC5jCmluZGV4IGJhMDk2ZWIuLjI0NDk2MzcgMTAwNjQ0Ci0tLSBhL2FyY2gvY3Jpcy9hcmNoLXYzMi9kcml2ZXJzL2NyeXB0b2NvcC5jCisrKyBiL2FyY2gvY3Jpcy9hcmNoLXYzMi9kcml2ZXJzL2NyeXB0b2NvcC5jCkBAIC0yMDUxLDcgKzIwNTEsNiBAQAogCXNwaW5fbG9ja19pcnFzYXZlKCZjcnlwdG9jb3BfcHJvY2Vzc19sb2NrLCBwcm9jZXNzX2ZsYWdzKTsKIAogCS8qIEVtcHR5IHRoZSBqb2IgcXVldWUuICovCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmNyeXB0b2NvcF9wcm9jZXNzX2xvY2ssIHByb2Nlc3NfZmxhZ3MpOwogCWZvciAoaSA9IDA7IGkgPCBjcnlwdG9jb3BfcHJpb19ub19wcmlvczsgaSsrKXsKIAkJaWYgKCFsaXN0X2VtcHR5KCYoY3J5cHRvY29wX2pvYl9xdWV1ZXNbaV0uam9icykpKXsKIAkJCWxpc3RfZm9yX2VhY2hfc2FmZShub2RlLCB0bXAsICYoY3J5cHRvY29wX2pvYl9xdWV1ZXNbaV0uam9icykpIHsKZGlmZiAtLWdpdCBhL2FyY2gvZnJ2L2tlcm5lbC92bWxpbnV4Lmxkcy5TIGIvYXJjaC9mcnYva2VybmVsL3ZtbGludXgubGRzLlMKaW5kZXggZjQ3NDUzNC4uOWMxZmIxMiAxMDA2NDQKLS0tIGEvYXJjaC9mcnYva2VybmVsL3ZtbGludXgubGRzLlMKKysrIGIvYXJjaC9mcnYva2VybmVsL3ZtbGludXgubGRzLlMKQEAgLTQ0LDEzICs0NCw3IEBACiAKICAgX19pbml0Y2FsbF9zdGFydCA9IC47CiAgIC5pbml0Y2FsbC5pbml0IDogewotCSooLmluaXRjYWxsMS5pbml0KQotCSooLmluaXRjYWxsMi5pbml0KQotCSooLmluaXRjYWxsMy5pbml0KQotCSooLmluaXRjYWxsNC5pbml0KQotCSooLmluaXRjYWxsNS5pbml0KQotCSooLmluaXRjYWxsNi5pbml0KQotCSooLmluaXRjYWxsNy5pbml0KQorCUlOSVRDQUxMUwogICB9CiAgIF9faW5pdGNhbGxfZW5kID0gLjsKICAgX19jb25faW5pdGNhbGxfc3RhcnQgPSAuOwpkaWZmIC0tZ2l0IGEvYXJjaC9oODMwMC9rZXJuZWwvdm1saW51eC5sZHMuUyBiL2FyY2gvaDgzMDAva2VybmVsL3ZtbGludXgubGRzLlMKaW5kZXggNjQwNmMzOC4uNzU2MzI1ZCAxMDA2NDQKLS0tIGEvYXJjaC9oODMwMC9rZXJuZWwvdm1saW51eC5sZHMuUworKysgYi9hcmNoL2g4MzAwL2tlcm5lbC92bWxpbnV4Lmxkcy5TCkBAIC0xMTgsMTMgKzExOCw3IEBACiAJLiA9IEFMSUdOKDB4NCkgOwogCV9fX3NldHVwX2VuZCA9IC47CiAJX19faW5pdGNhbGxfc3RhcnQgPSAuOwotCQkqKC5pbml0Y2FsbDEuaW5pdCkKLQkJKiguaW5pdGNhbGwyLmluaXQpCi0JCSooLmluaXRjYWxsMy5pbml0KQotCQkqKC5pbml0Y2FsbDQuaW5pdCkKLQkJKiguaW5pdGNhbGw1LmluaXQpCi0JCSooLmluaXRjYWxsNi5pbml0KQotCQkqKC5pbml0Y2FsbDcuaW5pdCkKKwkJSU5JVENBTExTCiAJX19faW5pdGNhbGxfZW5kID0gLjsKIAlfX19jb25faW5pdGNhbGxfc3RhcnQgPSAuOwogCQkqKC5jb25faW5pdGNhbGwuaW5pdCkKZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9LY29uZmlnLmNwdSBiL2FyY2gvaTM4Ni9LY29uZmlnLmNwdQppbmRleCAyMWM5YTRlLi5mYzRmMmFiIDEwMDY0NAotLS0gYS9hcmNoL2kzODYvS2NvbmZpZy5jcHUKKysrIGIvYXJjaC9pMzg2L0tjb25maWcuY3B1CkBAIC03LDYgKzcsNyBAQAogCiBjb25maWcgTTM4NgogCWJvb2wgIjM4NiIKKwlkZXBlbmRzIG9uICFVTUwKIAktLS1oZWxwLS0tCiAJICBUaGlzIGlzIHRoZSBwcm9jZXNzb3IgdHlwZSBvZiB5b3VyIENQVS4gVGhpcyBpbmZvcm1hdGlvbiBpcyB1c2VkIGZvcgogCSAgb3B0aW1pemluZyBwdXJwb3Nlcy4gSW4gb3JkZXIgdG8gY29tcGlsZSBhIGtlcm5lbCB0aGF0IGNhbiBydW4gb24KQEAgLTMwMSw3ICszMDIsNyBAQAogCiBjb25maWcgWDg2X1VTRV8zRE5PVwogCWJvb2wKLQlkZXBlbmRzIG9uIE1DWVJJWElJSSB8fCBNSzcgfHwgTUdFT0RFX0xYCisJZGVwZW5kcyBvbiAoTUNZUklYSUlJIHx8IE1LNyB8fCBNR0VPREVfTFgpICYmICFVTUwKIAlkZWZhdWx0IHkKIAogY29uZmlnIFg4Nl9PT1NUT1JFCmRpZmYgLS1naXQgYS9hcmNoL2kzODYvTWFrZWZpbGUgYi9hcmNoL2kzODYvTWFrZWZpbGUKaW5kZXggN2NjMGIxOC4uMDY3NzkwOCAxMDA2NDQKLS0tIGEvYXJjaC9pMzg2L01ha2VmaWxlCisrKyBiL2FyY2gvaTM4Ni9NYWtlZmlsZQpAQCAtNDIsNiArNDIsMTAgQEAKICMgdGVtcG9yYXJ5IHVudGlsIHN0cmluZy5oIGlzIGZpeGVkCiBjZmxhZ3MteSArPSAtZmZyZWVzdGFuZGluZwogCisjIHRoaXMgd29ya3MgYXJvdW5kIHNvbWUgaXNzdWVzIHdpdGggZ2VuZXJhdGluZyB1bndpbmQgdGFibGVzIGluIG9sZGVyIGdjY3MKKyMgbmV3ZXIgZ2NjcyBkbyBpdCBieSBkZWZhdWx0CitjZmxhZ3MteSArPSAtbWFjY3VtdWxhdGUtb3V0Z29pbmctYXJncworCiAjIERpc2FibGUgdW5pdC1hdC1hLXRpbWUgbW9kZSBvbiBwcmUtZ2NjLTQuMCBjb21waWxlcnMsIGl0IG1ha2VzIGdjYyB1c2UKICMgYSBsb3QgbW9yZSBzdGFjayBkdWUgdG8gdGhlIGxhY2sgb2Ygc2hhcmluZyBvZiBzdGFja2xvdHM6CiBDRkxBR1MJCQkJKz0gJChzaGVsbCBpZiBbICQoY2FsbCBjYy12ZXJzaW9uKSAtbHQgMDQwMCBdIDsgdGhlbiBlY2hvICQoY2FsbCBjYy1vcHRpb24sLWZuby11bml0LWF0LWEtdGltZSk7IGZpIDspCkBAIC01MSw4ICs1NSw4IEBACiBBRkxBR1MgKz0gJChjYWxsIGFzLWluc3RyLC5jZmlfc3RhcnRwcm9jXG4uY2ZpX2VuZHByb2MsLURDT05GSUdfQVNfQ0ZJPTEsKQogCiAjIGlzIC5jZmlfc2lnbmFsX2ZyYW1lIHN1cHBvcnRlZCB0b28/Ci1jZmxhZ3MteSArPSAkKGNhbGwgYXMtaW5zdHIsLmNmaV9zdGFydHByb2Ncbi5jZmlfZW5kcHJvYywtRENPTkZJR19BU19DRkk9MSwpCi1BRkxBR1MgKz0gJChjYWxsIGFzLWluc3RyLC5jZmlfc3RhcnRwcm9jXG4uY2ZpX2VuZHByb2MsLURDT05GSUdfQVNfQ0ZJPTEsKQorY2ZsYWdzLXkgKz0gJChjYWxsIGFzLWluc3RyLC5jZmlfc3RhcnRwcm9jXG4uY2ZpX3NpZ25hbF9mcmFtZVxuLmNmaV9lbmRwcm9jLC1EQ09ORklHX0FTX0NGSV9TSUdOQUxfRlJBTUU9MSwpCitBRkxBR1MgKz0gJChjYWxsIGFzLWluc3RyLC5jZmlfc3RhcnRwcm9jXG4uY2ZpX3NpZ25hbF9mcmFtZVxuLmNmaV9lbmRwcm9jLC1EQ09ORklHX0FTX0NGSV9TSUdOQUxfRlJBTUU9MSwpCiAKIENGTEFHUyArPSAkKGNmbGFncy15KQogCmRpZmYgLS1naXQgYS9hcmNoL2kzODYvZGVmY29uZmlnIGIvYXJjaC9pMzg2L2RlZmNvbmZpZwppbmRleCA2MGMwYzAyLi45N2FhY2Q2IDEwMDY0NAotLS0gYS9hcmNoL2kzODYvZGVmY29uZmlnCisrKyBiL2FyY2gvaTM4Ni9kZWZjb25maWcKQEAgLTEsNyArMSw3IEBACiAjCiAjIEF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIG1ha2UgY29uZmlnOiBkb24ndCBlZGl0Ci0jIExpbnV4IGtlcm5lbCB2ZXJzaW9uOiAyLjYuMTktcmMxCi0jIFRodSBPY3QgIDUgMTM6MDQ6NTMgMjAwNgorIyBMaW51eCBrZXJuZWwgdmVyc2lvbjogMi42LjE5LXJjMi1naXQ0CisjIFNhdCBPY3QgMjEgMDM6Mzg6NTYgMjAwNgogIwogQ09ORklHX1g4Nl8zMj15CiBDT05GSUdfR0VORVJJQ19USU1FPXkKQEAgLTM4MCw4ICszODAsOCBAQAogQ09ORklHX0lORVQ2X1hGUk1fTU9ERV9UVU5ORUw9eQogIyBDT05GSUdfSU5FVDZfWEZSTV9NT0RFX0JFRVQgaXMgbm90IHNldAogIyBDT05GSUdfSU5FVDZfWEZSTV9NT0RFX1JPVVRFT1BUSU1JWkFUSU9OIGlzIG5vdCBzZXQKK0NPTkZJR19JUFY2X1NJVD15CiAjIENPTkZJR19JUFY2X1RVTk5FTCBpcyBub3Qgc2V0Ci0jIENPTkZJR19JUFY2X1NVQlRSRUVTIGlzIG5vdCBzZXQKICMgQ09ORklHX0lQVjZfTVVMVElQTEVfVEFCTEVTIGlzIG5vdCBzZXQKICMgQ09ORklHX05FVFdPUktfU0VDTUFSSyBpcyBub3Qgc2V0CiAjIENPTkZJR19ORVRGSUxURVIgaXMgbm90IHNldApAQCAtNDgzLDYgKzQ4MywxMyBAQAogIyBDT05GSUdfQVRBX09WRVJfRVRIIGlzIG5vdCBzZXQKIAogIworIyBNaXNjIGRldmljZXMKKyMKKyMgQ09ORklHX0lCTV9BU00gaXMgbm90IHNldAorIyBDT05GSUdfU0dJX0lPQzQgaXMgbm90IHNldAorIyBDT05GSUdfVElGTV9DT1JFIGlzIG5vdCBzZXQKKworIwogIyBBVEEvQVRBUEkvTUZNL1JMTCBzdXBwb3J0CiAjCiBDT05GSUdfSURFPXkKQEAgLTEwMjQsNiArMTAzMSw3IEBACiAjCiAjIERhbGxhcydzIDEtd2lyZSBidXMKICMKKyMgQ09ORklHX1cxIGlzIG5vdCBzZXQKIAogIwogIyBIYXJkd2FyZSBNb25pdG9yaW5nIHN1cHBvcnQKQEAgLTEwMzIsMTIgKzEwNDAsNiBAQAogIyBDT05GSUdfSFdNT05fVklEIGlzIG5vdCBzZXQKIAogIwotIyBNaXNjIGRldmljZXMKLSMKLSMgQ09ORklHX0lCTV9BU00gaXMgbm90IHNldAotIyBDT05GSUdfVElGTV9DT1JFIGlzIG5vdCBzZXQKLQotIwogIyBNdWx0aW1lZGlhIGRldmljZXMKICMKICMgQ09ORklHX1ZJREVPX0RFViBpcyBub3Qgc2V0CkBAIC0xMTY5LDcgKzExNzEsNiBAQAogIyBDT05GSUdfVVNCX0FUSV9SRU1PVEUyIGlzIG5vdCBzZXQKICMgQ09ORklHX1VTQl9LRVlTUEFOX1JFTU9URSBpcyBub3Qgc2V0CiAjIENPTkZJR19VU0JfQVBQTEVUT1VDSCBpcyBub3Qgc2V0Ci0jIENPTkZJR19VU0JfVFJBTkNFVklCUkFUT1IgaXMgbm90IHNldAogCiAjCiAjIFVTQiBJbWFnaW5nIGRldmljZXMKQEAgLTEyMTUsNiArMTIxNiw3IEBACiAjIENPTkZJR19VU0JfQVBQTEVESVNQTEFZIGlzIG5vdCBzZXQKICMgQ09ORklHX1VTQl9TSVNVU0JWR0EgaXMgbm90IHNldAogIyBDT05GSUdfVVNCX0xEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9UUkFOQ0VWSUJSQVRPUiBpcyBub3Qgc2V0CiAjIENPTkZJR19VU0JfVEVTVCBpcyBub3Qgc2V0CiAKICMKQEAgLTEyODQsNiArMTI4Niw3IEBACiBDT05GSUdfRVhUM19GU19YQVRUUj15CiBDT05GSUdfRVhUM19GU19QT1NJWF9BQ0w9eQogIyBDT05GSUdfRVhUM19GU19TRUNVUklUWSBpcyBub3Qgc2V0CisjIENPTkZJR19FWFQ0REVWX0ZTIGlzIG5vdCBzZXQKIENPTkZJR19KQkQ9eQogIyBDT05GSUdfSkJEX0RFQlVHIGlzIG5vdCBzZXQKIENPTkZJR19GU19NQkNBQ0hFPXkKQEAgLTEzMDcsNiArMTMxMCw3IEBACiAjIENPTkZJR19BVVRPRlNfRlMgaXMgbm90IHNldAogQ09ORklHX0FVVE9GUzRfRlM9eQogIyBDT05GSUdfRlVTRV9GUyBpcyBub3Qgc2V0CitDT05GSUdfR0VORVJJQ19BQ0w9eQogCiAjCiAjIENELVJPTS9EVkQgRmlsZXN5c3RlbXMKQEAgLTEzODQsNyArMTM4OCw2IEBACiAjIENPTkZJR19DT0RBX0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX0FGU19GUyBpcyBub3Qgc2V0CiAjIENPTkZJR185UF9GUyBpcyBub3Qgc2V0Ci1DT05GSUdfR0VORVJJQ19BQ0w9eQogCiAjCiAjIFBhcnRpdGlvbiBUeXBlcwpAQCAtMTQzNywxMCArMTQ0MCw2IEBACiBDT05GSUdfTkxTX1VURjg9eQogCiAjCi0jIERpc3RyaWJ1dGVkIExvY2sgTWFuYWdlcgotIwotCi0jCiAjIEluc3RydW1lbnRhdGlvbiBTdXBwb3J0CiAjCiBDT05GSUdfUFJPRklMSU5HPXkKQEAgLTE0ODAsNiArMTQ3OSw3IEBACiBDT05GSUdfVU5XSU5EX0lORk89eQogQ09ORklHX1NUQUNLX1VOV0lORD15CiAjIENPTkZJR19GT1JDRURfSU5MSU5JTkcgaXMgbm90IHNldAorIyBDT05GSUdfSEVBREVSU19DSEVDSyBpcyBub3Qgc2V0CiAjIENPTkZJR19SQ1VfVE9SVFVSRV9URVNUIGlzIG5vdCBzZXQKICMgQ09ORklHX0xLRFRNIGlzIG5vdCBzZXQKIENPTkZJR19FQVJMWV9QUklOVEs9eQpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L2tlcm5lbC9hY3BpL2Jvb3QuYyBiL2FyY2gvaTM4Ni9rZXJuZWwvYWNwaS9ib290LmMKaW5kZXggOTJmNzljZC4uZDEyZmI5NyAxMDA2NDQKLS0tIGEvYXJjaC9pMzg2L2tlcm5lbC9hY3BpL2Jvb3QuYworKysgYi9hcmNoL2kzODYva2VybmVsL2FjcGkvYm9vdC5jCkBAIC03MCw3ICs3MCw3IEBACiAKICNkZWZpbmUgUFJFRklYCQkJIkFDUEk6ICIKIAotaW50IGFjcGlfbm9pcnEgX19pbml0ZGF0YTsJLyogc2tpcCBBQ1BJIElSUSBpbml0aWFsaXphdGlvbiAqLworaW50IGFjcGlfbm9pcnE7CQkJCS8qIHNraXAgQUNQSSBJUlEgaW5pdGlhbGl6YXRpb24gKi8KIGludCBhY3BpX3BjaV9kaXNhYmxlZCBfX2luaXRkYXRhOwkvKiBza2lwIEFDUEkgUENJIHNjYW4gYW5kIElSUSBpbml0aWFsaXphdGlvbiAqLwogaW50IGFjcGlfaHQgX19pbml0ZGF0YSA9IDE7CS8qIGVuYWJsZSBIVCAqLwogCkBAIC04Miw2ICs4Miw3IEBACiBhY3BpX2ludGVycnVwdF9mbGFncyBhY3BpX3NjaV9mbGFncyBfX2luaXRkYXRhOwogaW50IGFjcGlfc2NpX292ZXJyaWRlX2dzaSBfX2luaXRkYXRhOwogaW50IGFjcGlfc2tpcF90aW1lcl9vdmVycmlkZSBfX2luaXRkYXRhOworaW50IGFjcGlfdXNlX3RpbWVyX292ZXJyaWRlIF9faW5pdGRhdGE7CiAKICNpZmRlZiBDT05GSUdfWDg2X0xPQ0FMX0FQSUMKIHN0YXRpYyB1NjQgYWNwaV9sYXBpY19hZGRyIF9faW5pdGRhdGEgPSBBUElDX0RFRkFVTFRfUEhZU19CQVNFOwpAQCAtMzMyLDcgKzMzMyw3IEBACiAvKgogICogUGFyc2UgSW50ZXJydXB0IFNvdXJjZSBPdmVycmlkZSBmb3IgdGhlIEFDUEkgU0NJCiAgKi8KLXN0YXRpYyB2b2lkIGFjcGlfc2NpX2lvYXBpY19zZXR1cCh1MzIgZ3NpLCB1MTYgcG9sYXJpdHksIHUxNiB0cmlnZ2VyKQorc3RhdGljIHZvaWQgYWNwaV9zY2lfaW9hcGljX3NldHVwKHUzMiBidXNfaXJxLCB1MzIgZ3NpLCB1MTYgcG9sYXJpdHksIHUxNiB0cmlnZ2VyKQogewogCWlmICh0cmlnZ2VyID09IDApCS8qIGNvbXBhdGlibGUgU0NJIHRyaWdnZXIgaXMgbGV2ZWwgKi8KIAkJdHJpZ2dlciA9IDM7CkBAIC0zNTIsMTMgKzM1MywxMyBAQAogCSAqIElmIEdTSSBpcyA8IDE2LCB0aGlzIHdpbGwgdXBkYXRlIGl0cyBmbGFncywKIAkgKiBlbHNlIGl0IHdpbGwgY3JlYXRlIGEgbmV3IG1wX2lycXNbXSBlbnRyeS4KIAkgKi8KLQltcF9vdmVycmlkZV9sZWdhY3lfaXJxKGdzaSwgcG9sYXJpdHksIHRyaWdnZXIsIGdzaSk7CisJbXBfb3ZlcnJpZGVfbGVnYWN5X2lycShidXNfaXJxLCBwb2xhcml0eSwgdHJpZ2dlciwgZ3NpKTsKIAogCS8qCiAJICogc3Rhc2ggb3Zlci1yaWRlIHRvIGluZGljYXRlIHdlJ3ZlIGJlZW4gaGVyZQogCSAqIGFuZCBmb3IgbGF0ZXIgdXBkYXRlIG9mIGFjcGlfZmFkdAogCSAqLwotCWFjcGlfc2NpX292ZXJyaWRlX2dzaSA9IGdzaTsKKwlhY3BpX3NjaV9vdmVycmlkZV9nc2kgPSBidXNfaXJxOwogCXJldHVybjsKIH0KIApAQCAtMzc2LDcgKzM3Nyw3IEBACiAJYWNwaV90YWJsZV9wcmludF9tYWR0X2VudHJ5KGhlYWRlcik7CiAKIAlpZiAoaW50c3JjLT5idXNfaXJxID09IGFjcGlfZmFkdC5zY2lfaW50KSB7Ci0JCWFjcGlfc2NpX2lvYXBpY19zZXR1cChpbnRzcmMtPmdsb2JhbF9pcnEsCisJCWFjcGlfc2NpX2lvYXBpY19zZXR1cChpbnRzcmMtPmJ1c19pcnEsIGludHNyYy0+Z2xvYmFsX2lycSwKIAkJCQkgICAgICBpbnRzcmMtPmZsYWdzLnBvbGFyaXR5LAogCQkJCSAgICAgIGludHNyYy0+ZmxhZ3MudHJpZ2dlcik7CiAJCXJldHVybiAwOwpAQCAtODc5LDcgKzg4MCw3IEBACiAJICogcHJldGVuZCB3ZSBnb3Qgb25lIHNvIHdlIGNhbiBzZXQgdGhlIFNDSSBmbGFncy4KIAkgKi8KIAlpZiAoIWFjcGlfc2NpX292ZXJyaWRlX2dzaSkKLQkJYWNwaV9zY2lfaW9hcGljX3NldHVwKGFjcGlfZmFkdC5zY2lfaW50LCAwLCAwKTsKKwkJYWNwaV9zY2lfaW9hcGljX3NldHVwKGFjcGlfZmFkdC5zY2lfaW50LCBhY3BpX2ZhZHQuc2NpX2ludCwgMCwgMCk7CiAKIAkvKiBGaWxsIGluIGlkZW50aXR5IGxlZ2FjeSBtYXBpbmdzIHdoZXJlIG5vIG92ZXJyaWRlICovCiAJbXBfY29uZmlnX2FjcGlfbGVnYWN5X2lycXMoKTsKQEAgLTEzMDAsNiArMTMwMSwxMyBAQAogCXJldHVybiAwOwogfQogZWFybHlfcGFyYW0oImFjcGlfc2tpcF90aW1lcl9vdmVycmlkZSIsIHBhcnNlX2FjcGlfc2tpcF90aW1lcl9vdmVycmlkZSk7CisKK3N0YXRpYyBpbnQgX19pbml0IHBhcnNlX2FjcGlfdXNlX3RpbWVyX292ZXJyaWRlKGNoYXIgKmFyZykKK3sKKwlhY3BpX3VzZV90aW1lcl9vdmVycmlkZSA9IDE7CisJcmV0dXJuIDA7Cit9CitlYXJseV9wYXJhbSgiYWNwaV91c2VfdGltZXJfb3ZlcnJpZGUiLCBwYXJzZV9hY3BpX3VzZV90aW1lcl9vdmVycmlkZSk7CiAjZW5kaWYgLyogQ09ORklHX1g4Nl9JT19BUElDICovCiAKIHN0YXRpYyBpbnQgX19pbml0IHNldHVwX2FjcGlfc2NpKGNoYXIgKnMpCmRpZmYgLS1naXQgYS9hcmNoL2kzODYva2VybmVsL2FjcGkvY3N0YXRlLmMgYi9hcmNoL2kzODYva2VybmVsL2FjcGkvY3N0YXRlLmMKaW5kZXggMjVkYjQ5ZS4uMjA1NjNlNSAxMDA2NDQKLS0tIGEvYXJjaC9pMzg2L2tlcm5lbC9hY3BpL2NzdGF0ZS5jCisrKyBiL2FyY2gvaTM4Ni9rZXJuZWwvYWNwaS9jc3RhdGUuYwpAQCAtMTAsNiArMTAsNyBAQAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9hY3BpLmg+CisjaW5jbHVkZSA8bGludXgvY3B1Lmg+CiAKICNpbmNsdWRlIDxhY3BpL3Byb2Nlc3Nvci5oPgogI2luY2x1ZGUgPGFzbS9hY3BpLmg+CkBAIC00MSw1ICs0MiwxMjQgQEAKIAkJZmxhZ3MtPmJtX2NoZWNrID0gMTsKIAl9CiB9Ci0KIEVYUE9SVF9TWU1CT0woYWNwaV9wcm9jZXNzb3JfcG93ZXJfaW5pdF9ibV9jaGVjayk7CisKKy8qIFRoZSBjb2RlIGJlbG93IGhhbmRsZXMgY3N0YXRlIGVudHJ5IHdpdGggbW9uaXRvci1td2FpdCBwYWlyIG9uIEludGVsKi8KKworc3RydWN0IGNzdGF0ZV9lbnRyeV9zIHsKKwlzdHJ1Y3QgeworCQl1bnNpZ25lZCBpbnQgZWF4OworCQl1bnNpZ25lZCBpbnQgZWN4OworCX0gc3RhdGVzW0FDUElfUFJPQ0VTU09SX01BWF9QT1dFUl07Cit9Oworc3RhdGljIHN0cnVjdCBjc3RhdGVfZW50cnlfcyAqY3B1X2NzdGF0ZV9lbnRyeTsJLyogcGVyIENQVSBwdHIgKi8KKworc3RhdGljIHNob3J0IG13YWl0X3N1cHBvcnRlZFtBQ1BJX1BST0NFU1NPUl9NQVhfUE9XRVJdOworCisjZGVmaW5lIE1XQUlUX1NVQlNUQVRFX01BU0sJKDB4ZikKKyNkZWZpbmUgTVdBSVRfU1VCU1RBVEVfU0laRQkoNCkKKworI2RlZmluZSBDUFVJRF9NV0FJVF9MRUFGICg1KQorI2RlZmluZSBDUFVJRDVfRUNYX0VYVEVOU0lPTlNfU1VQUE9SVEVEICgweDEpCisjZGVmaW5lIENQVUlENV9FQ1hfSU5URVJSVVBUX0JSRUFLCSgweDIpCisKKyNkZWZpbmUgTVdBSVRfRUNYX0lOVEVSUlVQVF9CUkVBSwkoMHgxKQorCisjZGVmaW5lIE5BVElWRV9DU1RBVEVfQkVZT05EX0hBTFQJKDIpCisKK2ludCBhY3BpX3Byb2Nlc3Nvcl9mZmhfY3N0YXRlX3Byb2JlKHVuc2lnbmVkIGludCBjcHUsCisJCXN0cnVjdCBhY3BpX3Byb2Nlc3Nvcl9jeCAqY3gsIHN0cnVjdCBhY3BpX3Bvd2VyX3JlZ2lzdGVyICpyZWcpCit7CisJc3RydWN0IGNzdGF0ZV9lbnRyeV9zICpwZXJjcHVfZW50cnk7CisJc3RydWN0IGNwdWluZm9feDg2ICpjID0gY3B1X2RhdGEgKyBjcHU7CisKKwljcHVtYXNrX3Qgc2F2ZWRfbWFzazsKKwlpbnQgcmV0dmFsOworCXVuc2lnbmVkIGludCBlYXgsIGVieCwgZWN4LCBlZHg7CisJdW5zaWduZWQgaW50IGVkeF9wYXJ0OworCXVuc2lnbmVkIGludCBjc3RhdGVfdHlwZTsgLyogQy1zdGF0ZSB0eXBlIGFuZCBub3QgQUNQSSBDLXN0YXRlIHR5cGUgKi8KKwl1bnNpZ25lZCBpbnQgbnVtX2NzdGF0ZV9zdWJ0eXBlOworCisJaWYgKCFjcHVfY3N0YXRlX2VudHJ5IHx8IGMtPmNwdWlkX2xldmVsIDwgQ1BVSURfTVdBSVRfTEVBRiApCisJCXJldHVybiAtMTsKKworCWlmIChyZWctPmJpdF9vZmZzZXQgIT0gTkFUSVZFX0NTVEFURV9CRVlPTkRfSEFMVCkKKwkJcmV0dXJuIC0xOworCisJcGVyY3B1X2VudHJ5ID0gcGVyX2NwdV9wdHIoY3B1X2NzdGF0ZV9lbnRyeSwgY3B1KTsKKwlwZXJjcHVfZW50cnktPnN0YXRlc1tjeC0+aW5kZXhdLmVheCA9IDA7CisJcGVyY3B1X2VudHJ5LT5zdGF0ZXNbY3gtPmluZGV4XS5lY3ggPSAwOworCisJLyogTWFrZSBzdXJlIHdlIGFyZSBydW5uaW5nIG9uIHJpZ2h0IENQVSAqLworCXNhdmVkX21hc2sgPSBjdXJyZW50LT5jcHVzX2FsbG93ZWQ7CisJcmV0dmFsID0gc2V0X2NwdXNfYWxsb3dlZChjdXJyZW50LCBjcHVtYXNrX29mX2NwdShjcHUpKTsKKwlpZiAocmV0dmFsKQorCQlyZXR1cm4gLTE7CisKKwljcHVpZChDUFVJRF9NV0FJVF9MRUFGLCAmZWF4LCAmZWJ4LCAmZWN4LCAmZWR4KTsKKworCS8qIENoZWNrIHdoZXRoZXIgdGhpcyBwYXJ0aWN1bGFyIGN4X3R5cGUgKGluIENTVCkgaXMgc3VwcG9ydGVkIG9yIG5vdCAqLworCWNzdGF0ZV90eXBlID0gKGN4LT5hZGRyZXNzID4+IE1XQUlUX1NVQlNUQVRFX1NJWkUpICsgMTsKKwllZHhfcGFydCA9IGVkeCA+PiAoY3N0YXRlX3R5cGUgKiBNV0FJVF9TVUJTVEFURV9TSVpFKTsKKwludW1fY3N0YXRlX3N1YnR5cGUgPSBlZHhfcGFydCAmIE1XQUlUX1NVQlNUQVRFX01BU0s7CisKKwlyZXR2YWwgPSAwOworCWlmIChudW1fY3N0YXRlX3N1YnR5cGUgPCAoY3gtPmFkZHJlc3MgJiBNV0FJVF9TVUJTVEFURV9NQVNLKSkgeworCQlyZXR2YWwgPSAtMTsKKwkJZ290byBvdXQ7CisJfQorCisJLyogbXdhaXQgZWN4IGV4dGVuc2lvbnMgSU5URVJSVVBUX0JSRUFLIHNob3VsZCBiZSBzdXBwb3J0ZWQgZm9yIEMyL0MzICovCisJaWYgKCEoZWN4ICYgQ1BVSUQ1X0VDWF9FWFRFTlNJT05TX1NVUFBPUlRFRCkgfHwKKwkgICAgIShlY3ggJiBDUFVJRDVfRUNYX0lOVEVSUlVQVF9CUkVBSykpIHsKKwkJcmV0dmFsID0gLTE7CisJCWdvdG8gb3V0OworCX0KKwlwZXJjcHVfZW50cnktPnN0YXRlc1tjeC0+aW5kZXhdLmVjeCA9IE1XQUlUX0VDWF9JTlRFUlJVUFRfQlJFQUs7CisKKwkvKiBVc2UgdGhlIGhpbnQgaW4gQ1NUICovCisJcGVyY3B1X2VudHJ5LT5zdGF0ZXNbY3gtPmluZGV4XS5lYXggPSBjeC0+YWRkcmVzczsKKworCWlmICghbXdhaXRfc3VwcG9ydGVkW2NzdGF0ZV90eXBlXSkgeworCQltd2FpdF9zdXBwb3J0ZWRbY3N0YXRlX3R5cGVdID0gMTsKKwkJcHJpbnRrKEtFUk5fREVCVUcgIk1vbml0b3ItTXdhaXQgd2lsbCBiZSB1c2VkIHRvIGVudGVyIEMtJWQgIgorCQkgICAgICAgInN0YXRlXG4iLCBjeC0+dHlwZSk7CisJfQorCitvdXQ6CisJc2V0X2NwdXNfYWxsb3dlZChjdXJyZW50LCBzYXZlZF9tYXNrKTsKKwlyZXR1cm4gcmV0dmFsOworfQorRVhQT1JUX1NZTUJPTF9HUEwoYWNwaV9wcm9jZXNzb3JfZmZoX2NzdGF0ZV9wcm9iZSk7CisKK3ZvaWQgYWNwaV9wcm9jZXNzb3JfZmZoX2NzdGF0ZV9lbnRlcihzdHJ1Y3QgYWNwaV9wcm9jZXNzb3JfY3ggKmN4KQoreworCXVuc2lnbmVkIGludCBjcHUgPSBzbXBfcHJvY2Vzc29yX2lkKCk7CisJc3RydWN0IGNzdGF0ZV9lbnRyeV9zICpwZXJjcHVfZW50cnk7CisKKwlwZXJjcHVfZW50cnkgPSBwZXJfY3B1X3B0cihjcHVfY3N0YXRlX2VudHJ5LCBjcHUpOworCW13YWl0X2lkbGVfd2l0aF9oaW50cyhwZXJjcHVfZW50cnktPnN0YXRlc1tjeC0+aW5kZXhdLmVheCwKKwkgICAgICAgICAgICAgICAgICAgICAgcGVyY3B1X2VudHJ5LT5zdGF0ZXNbY3gtPmluZGV4XS5lY3gpOworfQorRVhQT1JUX1NZTUJPTF9HUEwoYWNwaV9wcm9jZXNzb3JfZmZoX2NzdGF0ZV9lbnRlcik7CisKK3N0YXRpYyBpbnQgX19pbml0IGZmaF9jc3RhdGVfaW5pdCh2b2lkKQoreworCXN0cnVjdCBjcHVpbmZvX3g4NiAqYyA9ICZib290X2NwdV9kYXRhOworCWlmIChjLT54ODZfdmVuZG9yICE9IFg4Nl9WRU5ET1JfSU5URUwpCisJCXJldHVybiAtMTsKKworCWNwdV9jc3RhdGVfZW50cnkgPSBhbGxvY19wZXJjcHUoc3RydWN0IGNzdGF0ZV9lbnRyeV9zKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGZmaF9jc3RhdGVfZXhpdCh2b2lkKQoreworCWlmIChjcHVfY3N0YXRlX2VudHJ5KSB7CisJCWZyZWVfcGVyY3B1KGNwdV9jc3RhdGVfZW50cnkpOworCQljcHVfY3N0YXRlX2VudHJ5ID0gTlVMTDsKKwl9Cit9CisKK2FyY2hfaW5pdGNhbGwoZmZoX2NzdGF0ZV9pbml0KTsKK19fZXhpdGNhbGwoZmZoX2NzdGF0ZV9leGl0KTsKZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9rZXJuZWwvYWNwaS9lYXJseXF1aXJrLmMgYi9hcmNoL2kzODYva2VybmVsL2FjcGkvZWFybHlxdWlyay5jCmluZGV4IGZlNzk5YjEuLmM5ODQxNjkgMTAwNjQ0Ci0tLSBhL2FyY2gvaTM4Ni9rZXJuZWwvYWNwaS9lYXJseXF1aXJrLmMKKysrIGIvYXJjaC9pMzg2L2tlcm5lbC9hY3BpL2Vhcmx5cXVpcmsuYwpAQCAtMjcsMTEgKzI3LDE3IEBACiAjaWZkZWYgQ09ORklHX0FDUEkKIAkvKiBBY2NvcmRpbmcgdG8gTnZpZGlhIGFsbCB0aW1lciBvdmVycmlkZXMgYXJlIGJvZ3VzIHVubGVzcyBIUEVUCiAJICAgaXMgZW5hYmxlZC4gKi8KLQlpZiAodmVuZG9yID09IFBDSV9WRU5ET1JfSURfTlZJRElBKSB7CisJaWYgKCFhY3BpX3VzZV90aW1lcl9vdmVycmlkZSAmJiB2ZW5kb3IgPT0gUENJX1ZFTkRPUl9JRF9OVklESUEpIHsKIAkJbnZpZGlhX2hwZXRfZGV0ZWN0ZWQgPSAwOwogCQlhY3BpX3RhYmxlX3BhcnNlKEFDUElfSFBFVCwgbnZpZGlhX2hwZXRfY2hlY2spOwogCQlpZiAobnZpZGlhX2hwZXRfZGV0ZWN0ZWQgPT0gMCkgewogCQkJYWNwaV9za2lwX3RpbWVyX292ZXJyaWRlID0gMTsKKwkJCSAgcHJpbnRrKEtFUk5fSU5GTyAiTnZpZGlhIGJvYXJkICIKKyAgICAgICAgICAgICAgICAgICAgICAgImRldGVjdGVkLiBJZ25vcmluZyBBQ1BJICIKKyAgICAgICAgICAgICAgICAgICAgICAgInRpbWVyIG92ZXJyaWRlLlxuIik7CisgICAgICAgICAgICAgICAgcHJpbnRrKEtFUk5fSU5GTyAiSWYgeW91IGdvdCB0aW1lciB0cm91YmxlICIKKwkJCSAJICJ0cnkgYWNwaV91c2VfdGltZXJfb3ZlcnJpZGVcbiIpOworCiAJCX0KIAl9CiAjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9rZXJuZWwvYWx0ZXJuYXRpdmUuYyBiL2FyY2gvaTM4Ni9rZXJuZWwvYWx0ZXJuYXRpdmUuYwppbmRleCAyOGFiODA2Li41ODNjMjM4IDEwMDY0NAotLS0gYS9hcmNoL2kzODYva2VybmVsL2FsdGVybmF0aXZlLmMKKysrIGIvYXJjaC9pMzg2L2tlcm5lbC9hbHRlcm5hdGl2ZS5jCkBAIC0zNDQsNiArMzQ0LDcgQEAKIAogdm9pZCBfX2luaXQgYWx0ZXJuYXRpdmVfaW5zdHJ1Y3Rpb25zKHZvaWQpCiB7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKIAlpZiAobm9fcmVwbGFjZW1lbnQpIHsKIAkJcHJpbnRrKEtFUk5fSU5GTyAiKFNNUC0pYWx0ZXJuYXRpdmVzIHR1cm5lZCBvZmZcbiIpOwogCQlmcmVlX2luaXRfcGFnZXMoIlNNUCBhbHRlcm5hdGl2ZXMiLApAQCAtMzUxLDYgKzM1Miw4IEBACiAJCQkJKHVuc2lnbmVkIGxvbmcpX19zbXBfYWx0X2VuZCk7CiAJCXJldHVybjsKIAl9CisKKwlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CiAJYXBwbHlfYWx0ZXJuYXRpdmVzKF9fYWx0X2luc3RydWN0aW9ucywgX19hbHRfaW5zdHJ1Y3Rpb25zX2VuZCk7CiAKIAkvKiBzd2l0Y2ggdG8gcGF0Y2gtb25jZS1hdC1ib290dGltZS1vbmx5IG1vZGUgYW5kIGZyZWUgdGhlCkBAIC0zODYsNCArMzg5LDUgQEAKIAkJYWx0ZXJuYXRpdmVzX3NtcF9zd2l0Y2goMCk7CiAJfQogI2VuZGlmCisJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L2tlcm5lbC9hcG0uYyBiL2FyY2gvaTM4Ni9rZXJuZWwvYXBtLmMKaW5kZXggYjQyZjJkOS4uYTYwMzU4ZiAxMDA2NDQKLS0tIGEvYXJjaC9pMzg2L2tlcm5lbC9hcG0uYworKysgYi9hcmNoL2kzODYva2VybmVsL2FwbS5jCkBAIC0xOTgsNyArMTk4LDcgQEAKICAqICAgKEFQTSkgQklPUyBJbnRlcmZhY2UgU3BlY2lmaWNhdGlvbiwgUmV2aXNpb24gMS4yLCBGZWJydWFyeSAxOTk2LgogICoKICAqIFtUaGlzIGRvY3VtZW50IGlzIGF2YWlsYWJsZSBmcm9tIE1pY3Jvc29mdCBhdDoKLSAqICAgIGh0dHA6Ly93d3cubWljcm9zb2Z0LmNvbS9od2Rldi9idXNiaW9zL2FtcF8xMi5odG1dCisgKiAgICBodHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20vd2hkYy9hcmNoaXZlL2FtcF8xMi5tc3B4XQogICovCiAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KQEAgLTU0MCwxMiArNTQwLDMxIEBACiAgKiBBbHNvLCB3ZSBLTk9XIHRoYXQgZm9yIHRoZSBub24gZXJyb3IgY2FzZSBvZiBhcG1fYmlvc19jYWxsLCB0aGVyZQogICogaXMgbm8gdXNlZnVsIGRhdGEgcmV0dXJuZWQgaW4gdGhlIGxvdyBvcmRlciA4IGJpdHMgb2YgZWF4LgogICovCi0jZGVmaW5lIEFQTV9ET19DTEkJXAotCWlmIChhcG1faW5mby5hbGxvd19pbnRzKSBcCi0JCWxvY2FsX2lycV9lbmFibGUoKTsgXAotCWVsc2UgXAorCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgX19hcG1faXJxX3NhdmUodm9pZCkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWxvY2FsX3NhdmVfZmxhZ3MoZmxhZ3MpOworCWlmIChhcG1faW5mby5hbGxvd19pbnRzKSB7CisJCWlmIChpcnFzX2Rpc2FibGVkX2ZsYWdzKGZsYWdzKSkKKwkJCWxvY2FsX2lycV9lbmFibGUoKTsKKwl9IGVsc2UKIAkJbG9jYWxfaXJxX2Rpc2FibGUoKTsKIAorCXJldHVybiBmbGFnczsKK30KKworI2RlZmluZSBhcG1faXJxX3NhdmUoZmxhZ3MpIFwKKwlkbyB7IGZsYWdzID0gX19hcG1faXJxX3NhdmUoKTsgfSB3aGlsZSAoMCkKKworc3RhdGljIGlubGluZSB2b2lkIGFwbV9pcnFfcmVzdG9yZSh1bnNpZ25lZCBsb25nIGZsYWdzKQoreworCWlmIChpcnFzX2Rpc2FibGVkX2ZsYWdzKGZsYWdzKSkKKwkJbG9jYWxfaXJxX2Rpc2FibGUoKTsKKwllbHNlIGlmIChpcnFzX2Rpc2FibGVkKCkpCisJCWxvY2FsX2lycV9lbmFibGUoKTsKK30KKwogI2lmZGVmIEFQTV9aRVJPX1NFR1MKICMJZGVmaW5lIEFQTV9ERUNMX1NFR1MgXAogCQl1bnNpZ25lZCBpbnQgc2F2ZWRfZnM7IHVuc2lnbmVkIGludCBzYXZlZF9nczsKQEAgLTU5NiwxMiArNjE1LDExIEBACiAJc2F2ZV9kZXNjXzQwID0gZ2R0WzB4NDAgLyA4XTsKIAlnZHRbMHg0MCAvIDhdID0gYmFkX2Jpb3NfZGVzYzsKIAotCWxvY2FsX3NhdmVfZmxhZ3MoZmxhZ3MpOwotCUFQTV9ET19DTEk7CisJYXBtX2lycV9zYXZlKGZsYWdzKTsKIAlBUE1fRE9fU0FWRV9TRUdTOwogCWFwbV9iaW9zX2NhbGxfYXNtKGZ1bmMsIGVieF9pbiwgZWN4X2luLCBlYXgsIGVieCwgZWN4LCBlZHgsIGVzaSk7CiAJQVBNX0RPX1JFU1RPUkVfU0VHUzsKLQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CisJYXBtX2lycV9yZXN0b3JlKGZsYWdzKTsKIAlnZHRbMHg0MCAvIDhdID0gc2F2ZV9kZXNjXzQwOwogCXB1dF9jcHUoKTsKIAlhcG1fcmVzdG9yZV9jcHVzKGNwdXMpOwpAQCAtNjQwLDEyICs2NTgsMTEgQEAKIAlzYXZlX2Rlc2NfNDAgPSBnZHRbMHg0MCAvIDhdOwogCWdkdFsweDQwIC8gOF0gPSBiYWRfYmlvc19kZXNjOwogCi0JbG9jYWxfc2F2ZV9mbGFncyhmbGFncyk7Ci0JQVBNX0RPX0NMSTsKKwlhcG1faXJxX3NhdmUoZmxhZ3MpOwogCUFQTV9ET19TQVZFX1NFR1M7CiAJZXJyb3IgPSBhcG1fYmlvc19jYWxsX3NpbXBsZV9hc20oZnVuYywgZWJ4X2luLCBlY3hfaW4sIGVheCk7CiAJQVBNX0RPX1JFU1RPUkVfU0VHUzsKLQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CisJYXBtX2lycV9yZXN0b3JlKGZsYWdzKTsKIAlnZHRbMHg0MCAvIDhdID0gc2F2ZV9kZXNjXzQwOwogCXB1dF9jcHUoKTsKIAlhcG1fcmVzdG9yZV9jcHVzKGNwdXMpOwpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L2tlcm5lbC9jcHUvbWNoZWNrL3RoZXJtX3Rocm90LmMgYi9hcmNoL2kzODYva2VybmVsL2NwdS9tY2hlY2svdGhlcm1fdGhyb3QuYwppbmRleCA0ZjQzMDQ3Li4yZDg3MDNiIDEwMDY0NAotLS0gYS9hcmNoL2kzODYva2VybmVsL2NwdS9tY2hlY2svdGhlcm1fdGhyb3QuYworKysgYi9hcmNoL2kzODYva2VybmVsL2NwdS9tY2hlY2svdGhlcm1fdGhyb3QuYwpAQCAtMTEwLDE3ICsxMTAsMTUgQEAKIAogI2lmZGVmIENPTkZJR19TWVNGUwogLyogQWRkL1JlbW92ZSB0aGVybWFsX3Rocm90dGxlIGludGVyZmFjZSBmb3IgQ1BVIGRldmljZSAqLwotc3RhdGljIF9fY3B1aW5pdCBpbnQgdGhlcm1hbF90aHJvdHRsZV9hZGRfZGV2KHN0cnVjdCBzeXNfZGV2aWNlICogc3lzX2RldikKK3N0YXRpYyBfX2NwdWluaXQgaW50IHRoZXJtYWxfdGhyb3R0bGVfYWRkX2RldihzdHJ1Y3Qgc3lzX2RldmljZSAqc3lzX2RldikKIHsKLQlzeXNmc19jcmVhdGVfZ3JvdXAoJnN5c19kZXYtPmtvYmosICZ0aGVybWFsX3Rocm90dGxlX2F0dHJfZ3JvdXApOwotCXJldHVybiAwOworCXJldHVybiBzeXNmc19jcmVhdGVfZ3JvdXAoJnN5c19kZXYtPmtvYmosICZ0aGVybWFsX3Rocm90dGxlX2F0dHJfZ3JvdXApOwogfQogCiAjaWZkZWYgQ09ORklHX0hPVFBMVUdfQ1BVCi1zdGF0aWMgX19jcHVpbml0IGludCB0aGVybWFsX3Rocm90dGxlX3JlbW92ZV9kZXYoc3RydWN0IHN5c19kZXZpY2UgKiBzeXNfZGV2KQorc3RhdGljIF9fY3B1aW5pdCB2b2lkIHRoZXJtYWxfdGhyb3R0bGVfcmVtb3ZlX2RldihzdHJ1Y3Qgc3lzX2RldmljZSAqc3lzX2RldikKIHsKLQlzeXNmc19yZW1vdmVfZ3JvdXAoJnN5c19kZXYtPmtvYmosICZ0aGVybWFsX3Rocm90dGxlX2F0dHJfZ3JvdXApOwotCXJldHVybiAwOworCXJldHVybiBzeXNmc19yZW1vdmVfZ3JvdXAoJnN5c19kZXYtPmtvYmosICZ0aGVybWFsX3Rocm90dGxlX2F0dHJfZ3JvdXApOwogfQogCiAvKiBNdXRleCBwcm90ZWN0aW5nIGRldmljZSBjcmVhdGlvbiBhZ2FpbnN0IENQVSBob3RwbHVnICovCkBAIC0xMzMsMTIgKzEzMSwxNCBAQAogewogCXVuc2lnbmVkIGludCBjcHUgPSAodW5zaWduZWQgbG9uZyloY3B1OwogCXN0cnVjdCBzeXNfZGV2aWNlICpzeXNfZGV2OworCWludCBlcnI7CiAKIAlzeXNfZGV2ID0gZ2V0X2NwdV9zeXNkZXYoY3B1KTsKIAltdXRleF9sb2NrKCZ0aGVybV9jcHVfbG9jayk7CiAJc3dpdGNoIChhY3Rpb24pIHsKIAljYXNlIENQVV9PTkxJTkU6Ci0JCXRoZXJtYWxfdGhyb3R0bGVfYWRkX2RldihzeXNfZGV2KTsKKwkJZXJyID0gdGhlcm1hbF90aHJvdHRsZV9hZGRfZGV2KHN5c19kZXYpOworCQlXQVJOX09OKGVycik7CiAJCWJyZWFrOwogCWNhc2UgQ1BVX0RFQUQ6CiAJCXRoZXJtYWxfdGhyb3R0bGVfcmVtb3ZlX2RldihzeXNfZGV2KTsKQEAgLTE1Nyw2ICsxNTcsNyBAQAogc3RhdGljIF9faW5pdCBpbnQgdGhlcm1hbF90aHJvdHRsZV9pbml0X2RldmljZSh2b2lkKQogewogCXVuc2lnbmVkIGludCBjcHUgPSAwOworCWludCBlcnI7CiAKIAlpZiAoIWF0b21pY19yZWFkKCZ0aGVybV90aHJvdF9lbikpCiAJCXJldHVybiAwOwpAQCAtMTY3LDggKzE2OCwxMCBAQAogCW11dGV4X2xvY2soJnRoZXJtX2NwdV9sb2NrKTsKICNlbmRpZgogCS8qIGNvbm5lY3QgbGl2ZSBDUFVzIHRvIHN5c2ZzICovCi0JZm9yX2VhY2hfb25saW5lX2NwdShjcHUpCi0JCXRoZXJtYWxfdGhyb3R0bGVfYWRkX2RldihnZXRfY3B1X3N5c2RldihjcHUpKTsKKwlmb3JfZWFjaF9vbmxpbmVfY3B1KGNwdSkgeworCQllcnIgPSB0aGVybWFsX3Rocm90dGxlX2FkZF9kZXYoZ2V0X2NwdV9zeXNkZXYoY3B1KSk7CisJCVdBUk5fT04oZXJyKTsKKwl9CiAjaWZkZWYgQ09ORklHX0hPVFBMVUdfQ1BVCiAJbXV0ZXhfdW5sb2NrKCZ0aGVybV9jcHVfbG9jayk7CiAjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9rZXJuZWwvaGVhZC5TIGIvYXJjaC9pMzg2L2tlcm5lbC9oZWFkLlMKaW5kZXggYmU5ZDg4My4uY2EzMWYxOCAxMDA2NDQKLS0tIGEvYXJjaC9pMzg2L2tlcm5lbC9oZWFkLlMKKysrIGIvYXJjaC9pMzg2L2tlcm5lbC9oZWFkLlMKQEAgLTMxNyw3ICszMTcsNyBAQAogCW1vdmwgJWVheCwlZ3MKIAlsbGR0ICVheAogCWNsZAkJCSMgZ2NjMiB3YW50cyB0aGUgZGlyZWN0aW9uIGZsYWcgY2xlYXJlZCBhdCBhbGwgdGltZXMKLQlwdXNobCAlZWF4CQkjIGZha2UgcmV0dXJuIGFkZHJlc3MKKwlwdXNobCAkMAkJIyBmYWtlIHJldHVybiBhZGRyZXNzIGZvciB1bndpbmRlcgogI2lmZGVmIENPTkZJR19TTVAKIAltb3ZiIHJlYWR5LCAlY2wKIAltb3ZiICQxLCByZWFkeQpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L2tlcm5lbC9pODI1My5jIGIvYXJjaC9pMzg2L2tlcm5lbC9pODI1My5jCmluZGV4IDQ3N2IyNGQuLjlhMDA2MGIgMTAwNjQ0Ci0tLSBhL2FyY2gvaTM4Ni9rZXJuZWwvaTgyNTMuYworKysgYi9hcmNoL2kzODYva2VybmVsL2k4MjUzLmMKQEAgLTEwOSw3ICsxMDksNyBAQAogCiBzdGF0aWMgaW50IF9faW5pdCBpbml0X3BpdF9jbG9ja3NvdXJjZSh2b2lkKQogewotCWlmIChudW1fcG9zc2libGVfY3B1cygpID4gNCkgLyogUElUIGRvZXMgbm90IHNjYWxlISAqLworCWlmIChudW1fcG9zc2libGVfY3B1cygpID4gMSkgLyogUElUIGRvZXMgbm90IHNjYWxlISAqLwogCQlyZXR1cm4gMDsKIAogCWNsb2Nrc291cmNlX3BpdC5tdWx0ID0gY2xvY2tzb3VyY2VfaHoybXVsdChDTE9DS19USUNLX1JBVEUsIDIwKTsKZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9rZXJuZWwvaTgyNTkuYyBiL2FyY2gvaTM4Ni9rZXJuZWwvaTgyNTkuYwppbmRleCBkNTNlYWZiLi42Mjk5NmNkIDEwMDY0NAotLS0gYS9hcmNoL2kzODYva2VybmVsL2k4MjU5LmMKKysrIGIvYXJjaC9pMzg2L2tlcm5lbC9pODI1OS5jCkBAIC0xMTMsNyArMTEzLDggQEAKIHsKIAlkaXNhYmxlX2lycV9ub3N5bmMoaXJxKTsKIAlpb19hcGljX2lycXMgJj0gfigxPDxpcnEpOwotCXNldF9pcnFfY2hpcF9hbmRfaGFuZGxlcihpcnEsICZpODI1OUFfY2hpcCwgaGFuZGxlX2xldmVsX2lycSk7CisJc2V0X2lycV9jaGlwX2FuZF9oYW5kbGVyX25hbWUoaXJxLCAmaTgyNTlBX2NoaXAsIGhhbmRsZV9sZXZlbF9pcnEsCisJCQkJICAgICAgIlhUIik7CiAJZW5hYmxlX2lycShpcnEpOwogfQogCkBAIC0zNjksOCArMzcwLDggQEAKIAkJCS8qCiAJCQkgKiAxNiBvbGQtc3R5bGUgSU5UQS1jeWNsZSBpbnRlcnJ1cHRzOgogCQkJICovCi0JCQlzZXRfaXJxX2NoaXBfYW5kX2hhbmRsZXIoaSwgJmk4MjU5QV9jaGlwLAotCQkJCQkJIGhhbmRsZV9sZXZlbF9pcnEpOworCQkJc2V0X2lycV9jaGlwX2FuZF9oYW5kbGVyX25hbWUoaSwgJmk4MjU5QV9jaGlwLAorCQkJCQkJICAgICAgaGFuZGxlX2xldmVsX2lycSwgIlhUIik7CiAJCX0gZWxzZSB7CiAJCQkvKgogCQkJICogJ2hpZ2gnIFBDSSBJUlFzIGZpbGxlZCBpbiBvbiBkZW1hbmQKZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9rZXJuZWwvaW9fYXBpYy5jIGIvYXJjaC9pMzg2L2tlcm5lbC9pb19hcGljLmMKaW5kZXggY2QwODJjMy4uM2I3YTYzZSAxMDA2NDQKLS0tIGEvYXJjaC9pMzg2L2tlcm5lbC9pb19hcGljLmMKKysrIGIvYXJjaC9pMzg2L2tlcm5lbC9pb19hcGljLmMKQEAgLTkxLDYgKzkxLDQ2IEBACiAJaW50IGFwaWMsIHBpbiwgbmV4dDsKIH0gaXJxXzJfcGluW1BJTl9NQVBfU0laRV07CiAKK3N0cnVjdCBpb19hcGljIHsKKwl1bnNpZ25lZCBpbnQgaW5kZXg7CisJdW5zaWduZWQgaW50IHVudXNlZFszXTsKKwl1bnNpZ25lZCBpbnQgZGF0YTsKK307CisKK3N0YXRpYyBfX2F0dHJpYnV0ZV9jb25zdF9fIHN0cnVjdCBpb19hcGljIF9faW9tZW0gKmlvX2FwaWNfYmFzZShpbnQgaWR4KQoreworCXJldHVybiAodm9pZCBfX2lvbWVtICopIF9fZml4X3RvX3ZpcnQoRklYX0lPX0FQSUNfQkFTRV8wICsgaWR4KQorCQkrIChtcF9pb2FwaWNzW2lkeF0ubXBjX2FwaWNhZGRyICYgflBBR0VfTUFTSyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IGlvX2FwaWNfcmVhZCh1bnNpZ25lZCBpbnQgYXBpYywgdW5zaWduZWQgaW50IHJlZykKK3sKKwlzdHJ1Y3QgaW9fYXBpYyBfX2lvbWVtICppb19hcGljID0gaW9fYXBpY19iYXNlKGFwaWMpOworCXdyaXRlbChyZWcsICZpb19hcGljLT5pbmRleCk7CisJcmV0dXJuIHJlYWRsKCZpb19hcGljLT5kYXRhKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGlvX2FwaWNfd3JpdGUodW5zaWduZWQgaW50IGFwaWMsIHVuc2lnbmVkIGludCByZWcsIHVuc2lnbmVkIGludCB2YWx1ZSkKK3sKKwlzdHJ1Y3QgaW9fYXBpYyBfX2lvbWVtICppb19hcGljID0gaW9fYXBpY19iYXNlKGFwaWMpOworCXdyaXRlbChyZWcsICZpb19hcGljLT5pbmRleCk7CisJd3JpdGVsKHZhbHVlLCAmaW9fYXBpYy0+ZGF0YSk7Cit9CisKKy8qCisgKiBSZS13cml0ZSBhIHZhbHVlOiB0byBiZSB1c2VkIGZvciByZWFkLW1vZGlmeS13cml0ZQorICogY3ljbGVzIHdoZXJlIHRoZSByZWFkIGFscmVhZHkgc2V0IHVwIHRoZSBpbmRleCByZWdpc3Rlci4KKyAqCisgKiBPbGRlciBTaVMgQVBJQyByZXF1aXJlcyB3ZSByZXdyaXRlIHRoZSBpbmRleCByZWdpc3RlcgorICovCitzdGF0aWMgaW5saW5lIHZvaWQgaW9fYXBpY19tb2RpZnkodW5zaWduZWQgaW50IGFwaWMsIHVuc2lnbmVkIGludCByZWcsIHVuc2lnbmVkIGludCB2YWx1ZSkKK3sKKwl2b2xhdGlsZSBzdHJ1Y3QgaW9fYXBpYyAqaW9fYXBpYyA9IGlvX2FwaWNfYmFzZShhcGljKTsKKwlpZiAoc2lzX2FwaWNfYnVnKQorCQl3cml0ZWwocmVnLCAmaW9fYXBpYy0+aW5kZXgpOworCXdyaXRlbCh2YWx1ZSwgJmlvX2FwaWMtPmRhdGEpOworfQorCiB1bmlvbiBlbnRyeV91bmlvbiB7CiAJc3RydWN0IHsgdTMyIHcxLCB3MjsgfTsKIAlzdHJ1Y3QgSU9fQVBJQ19yb3V0ZV9lbnRyeSBlbnRyeTsKQEAgLTEwNywxMiArMTQ3LDM0IEBACiAJcmV0dXJuIGV1LmVudHJ5OwogfQogCisvKgorICogV2hlbiB3ZSB3cml0ZSBhIG5ldyBJTyBBUElDIHJvdXRpbmcgZW50cnksIHdlIG5lZWQgdG8gd3JpdGUgdGhlIGhpZ2gKKyAqIHdvcmQgZmlyc3QhIElmIHRoZSBtYXNrIGJpdCBpbiB0aGUgbG93IHdvcmQgaXMgY2xlYXIsIHdlIHdpbGwgZW5hYmxlCisgKiB0aGUgaW50ZXJydXB0LCBhbmQgd2UgbmVlZCB0byBtYWtlIHN1cmUgdGhlIGVudHJ5IGlzIGZ1bGx5IHBvcHVsYXRlZAorICogYmVmb3JlIHRoYXQgaGFwcGVucy4KKyAqLwogc3RhdGljIHZvaWQgaW9hcGljX3dyaXRlX2VudHJ5KGludCBhcGljLCBpbnQgcGluLCBzdHJ1Y3QgSU9fQVBJQ19yb3V0ZV9lbnRyeSBlKQogewogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJdW5pb24gZW50cnlfdW5pb24gZXU7CiAJZXUuZW50cnkgPSBlOwogCXNwaW5fbG9ja19pcnFzYXZlKCZpb2FwaWNfbG9jaywgZmxhZ3MpOworCWlvX2FwaWNfd3JpdGUoYXBpYywgMHgxMSArIDIqcGluLCBldS53Mik7CisJaW9fYXBpY193cml0ZShhcGljLCAweDEwICsgMipwaW4sIGV1LncxKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpb2FwaWNfbG9jaywgZmxhZ3MpOworfQorCisvKgorICogV2hlbiB3ZSBtYXNrIGFuIElPIEFQSUMgcm91dGluZyBlbnRyeSwgd2UgbmVlZCB0byB3cml0ZSB0aGUgbG93CisgKiB3b3JkIGZpcnN0LCBpbiBvcmRlciB0byBzZXQgdGhlIG1hc2sgYml0IGJlZm9yZSB3ZSBjaGFuZ2UgdGhlCisgKiBoaWdoIGJpdHMhCisgKi8KK3N0YXRpYyB2b2lkIGlvYXBpY19tYXNrX2VudHJ5KGludCBhcGljLCBpbnQgcGluKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdW5pb24gZW50cnlfdW5pb24gZXUgPSB7IC5lbnRyeS5tYXNrID0gMSB9OworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmlvYXBpY19sb2NrLCBmbGFncyk7CiAJaW9fYXBpY193cml0ZShhcGljLCAweDEwICsgMipwaW4sIGV1LncxKTsKIAlpb19hcGljX3dyaXRlKGFwaWMsIDB4MTEgKyAyKnBpbiwgZXUudzIpOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlvYXBpY19sb2NrLCBmbGFncyk7CkBAIC0yMzQsOSArMjk2LDcgQEAKIAkvKgogCSAqIERpc2FibGUgaXQgaW4gdGhlIElPLUFQSUMgaXJxLXJvdXRpbmcgdGFibGU6CiAJICovCi0JbWVtc2V0KCZlbnRyeSwgMCwgc2l6ZW9mKGVudHJ5KSk7Ci0JZW50cnkubWFzayA9IDE7Ci0JaW9hcGljX3dyaXRlX2VudHJ5KGFwaWMsIHBpbiwgZW50cnkpOworCWlvYXBpY19tYXNrX2VudHJ5KGFwaWMsIHBpbik7CiB9CiAKIHN0YXRpYyB2b2lkIGNsZWFyX0lPX0FQSUMgKHZvaWQpCkBAIC0xMjI1LDExICsxMjg1LDEzIEBACiB7CiAJaWYgKCh0cmlnZ2VyID09IElPQVBJQ19BVVRPICYmIElPX0FQSUNfaXJxX3RyaWdnZXIoaXJxKSkgfHwKIAkJCXRyaWdnZXIgPT0gSU9BUElDX0xFVkVMKQotCQlzZXRfaXJxX2NoaXBfYW5kX2hhbmRsZXIoaXJxLCAmaW9hcGljX2NoaXAsCi0JCQkJCSBoYW5kbGVfZmFzdGVvaV9pcnEpOwotCWVsc2UKLQkJc2V0X2lycV9jaGlwX2FuZF9oYW5kbGVyKGlycSwgJmlvYXBpY19jaGlwLAotCQkJCQkgaGFuZGxlX2VkZ2VfaXJxKTsKKwkJc2V0X2lycV9jaGlwX2FuZF9oYW5kbGVyX25hbWUoaXJxLCAmaW9hcGljX2NoaXAsCisJCQkJCSBoYW5kbGVfZmFzdGVvaV9pcnEsICJmYXN0ZW9pIik7CisJZWxzZSB7CisJCWlycV9kZXNjW2lycV0uc3RhdHVzIHw9IElSUV9ERUxBWUVEX0RJU0FCTEU7CisJCXNldF9pcnFfY2hpcF9hbmRfaGFuZGxlcl9uYW1lKGlycSwgJmlvYXBpY19jaGlwLAorCQkJCQkgaGFuZGxlX2VkZ2VfaXJxLCAiZWRnZSIpOworCX0KIAlzZXRfaW50cl9nYXRlKHZlY3RvciwgaW50ZXJydXB0W2lycV0pOwogfQogCkBAIC0yMjM1LDcgKzIyOTcsOCBAQAogCXByaW50ayhLRVJOX0lORk8gIi4uLnRyeWluZyB0byBzZXQgdXAgdGltZXIgYXMgVmlydHVhbCBXaXJlIElSUS4uLiIpOwogCiAJZGlzYWJsZV84MjU5QV9pcnEoMCk7Ci0Jc2V0X2lycV9jaGlwX2FuZF9oYW5kbGVyKDAsICZsYXBpY19jaGlwLCBoYW5kbGVfZmFzdGVvaV9pcnEpOworCXNldF9pcnFfY2hpcF9hbmRfaGFuZGxlcl9uYW1lKDAsICZsYXBpY19jaGlwLCBoYW5kbGVfZmFzdGVvaV9pcnEsCisJCQkJICAgICAgImZhc3RlaW8iKTsKIAlhcGljX3dyaXRlX2Fyb3VuZChBUElDX0xWVDAsIEFQSUNfRE1fRklYRUQgfCB2ZWN0b3IpOwkvKiBGaXhlZCBtb2RlICovCiAJZW5hYmxlXzgyNTlBX2lycSgwKTsKIApAQCAtMjU0MSw3ICsyNjA0LDggQEAKIAogCXdyaXRlX21zaV9tc2coaXJxLCAmbXNnKTsKIAotCXNldF9pcnFfY2hpcF9hbmRfaGFuZGxlcihpcnEsICZtc2lfY2hpcCwgaGFuZGxlX2VkZ2VfaXJxKTsKKwlzZXRfaXJxX2NoaXBfYW5kX2hhbmRsZXJfbmFtZShpcnEsICZtc2lfY2hpcCwgaGFuZGxlX2VkZ2VfaXJxLAorCQkJCSAgICAgICJlZGdlIik7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTI1NjIsMTggKzI2MjYsMTYgQEAKIAogc3RhdGljIHZvaWQgdGFyZ2V0X2h0X2lycSh1bnNpZ25lZCBpbnQgaXJxLCB1bnNpZ25lZCBpbnQgZGVzdCkKIHsKLQl1MzIgbG93LCBoaWdoOwotCWxvdyAgPSByZWFkX2h0X2lycV9sb3coaXJxKTsKLQloaWdoID0gcmVhZF9odF9pcnFfaGlnaChpcnEpOworCXN0cnVjdCBodF9pcnFfbXNnIG1zZzsKKwlmZXRjaF9odF9pcnFfbXNnKGlycSwgJm1zZyk7CiAKLQlsb3cgICY9IH4oSFRfSVJRX0xPV19ERVNUX0lEX01BU0spOwotCWhpZ2ggJj0gfihIVF9JUlFfSElHSF9ERVNUX0lEX01BU0spOworCW1zZy5hZGRyZXNzX2xvICY9IH4oSFRfSVJRX0xPV19ERVNUX0lEX01BU0spOworCW1zZy5hZGRyZXNzX2hpICY9IH4oSFRfSVJRX0hJR0hfREVTVF9JRF9NQVNLKTsKIAotCWxvdyAgfD0gSFRfSVJRX0xPV19ERVNUX0lEKGRlc3QpOwotCWhpZ2ggfD0gSFRfSVJRX0hJR0hfREVTVF9JRChkZXN0KTsKKwltc2cuYWRkcmVzc19sbyB8PSBIVF9JUlFfTE9XX0RFU1RfSUQoZGVzdCk7CisJbXNnLmFkZHJlc3NfaGkgfD0gSFRfSVJRX0hJR0hfREVTVF9JRChkZXN0KTsKIAotCXdyaXRlX2h0X2lycV9sb3coaXJxLCBsb3cpOwotCXdyaXRlX2h0X2lycV9oaWdoKGlycSwgaGlnaCk7CisJd3JpdGVfaHRfaXJxX21zZyhpcnEsICZtc2cpOwogfQogCiBzdGF0aWMgdm9pZCBzZXRfaHRfaXJxX2FmZmluaXR5KHVuc2lnbmVkIGludCBpcnEsIGNwdW1hc2tfdCBtYXNrKQpAQCAtMjU5NCw3ICsyNjU2LDcgQEAKIH0KICNlbmRpZgogCi1zdGF0aWMgc3RydWN0IGh3X2ludGVycnVwdF90eXBlIGh0X2lycV9jaGlwID0geworc3RhdGljIHN0cnVjdCBpcnFfY2hpcCBodF9pcnFfY2hpcCA9IHsKIAkubmFtZQkJPSAiUENJLUhUIiwKIAkubWFzawkJPSBtYXNrX2h0X2lycSwKIAkudW5tYXNrCQk9IHVubWFza19odF9pcnEsCkBAIC0yNjExLDcgKzI2NzMsNyBAQAogCiAJdmVjdG9yID0gYXNzaWduX2lycV92ZWN0b3IoaXJxKTsKIAlpZiAodmVjdG9yID49IDApIHsKLQkJdTMyIGxvdywgaGlnaDsKKwkJc3RydWN0IGh0X2lycV9tc2cgbXNnOwogCQl1bnNpZ25lZCBkZXN0OwogCQljcHVtYXNrX3QgdG1wOwogCkBAIC0yNjE5LDkgKzI2ODEsMTAgQEAKIAkJY3B1X3NldCh2ZWN0b3IgPj4gOCwgdG1wKTsKIAkJZGVzdCA9IGNwdV9tYXNrX3RvX2FwaWNpZCh0bXApOwogCi0JCWhpZ2ggPSAJSFRfSVJRX0hJR0hfREVTVF9JRChkZXN0KTsKKwkJbXNnLmFkZHJlc3NfaGkgPSBIVF9JUlFfSElHSF9ERVNUX0lEKGRlc3QpOwogCi0JCWxvdyA9CUhUX0lSUV9MT1dfQkFTRSB8CisJCW1zZy5hZGRyZXNzX2xvID0KKwkJCUhUX0lSUV9MT1dfQkFTRSB8CiAJCQlIVF9JUlFfTE9XX0RFU1RfSUQoZGVzdCkgfAogCQkJSFRfSVJRX0xPV19WRUNUT1IodmVjdG9yKSB8CiAJCQkoKElOVF9ERVNUX01PREUgPT0gMCkgPwpAQCAtMjYzMywxMCArMjY5NiwxMCBAQAogCQkJCUhUX0lSUV9MT1dfTVRfQVJCSVRSQVRFRCkgfAogCQkJSFRfSVJRX0xPV19JUlFfTUFTS0VEOwogCi0JCXdyaXRlX2h0X2lycV9sb3coaXJxLCBsb3cpOwotCQl3cml0ZV9odF9pcnFfaGlnaChpcnEsIGhpZ2gpOworCQl3cml0ZV9odF9pcnFfbXNnKGlycSwgJm1zZyk7CiAKLQkJc2V0X2lycV9jaGlwX2FuZF9oYW5kbGVyKGlycSwgJmh0X2lycV9jaGlwLCBoYW5kbGVfZWRnZV9pcnEpOworCQlzZXRfaXJxX2NoaXBfYW5kX2hhbmRsZXJfbmFtZShpcnEsICZodF9pcnFfY2hpcCwKKwkJCQkJICAgICAgaGFuZGxlX2VkZ2VfaXJxLCAiZWRnZSIpOwogCX0KIAlyZXR1cm4gdmVjdG9yOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L2tlcm5lbC9pcnEuYyBiL2FyY2gvaTM4Ni9rZXJuZWwvaXJxLmMKaW5kZXggOGNmYzdkYi4uMzIwMWQ0MiAxMDA2NDQKLS0tIGEvYXJjaC9pMzg2L2tlcm5lbC9pcnEuYworKysgYi9hcmNoL2kzODYva2VybmVsL2lycS5jCkBAIC0yNTgsNyArMjU4LDcgQEAKIAkJCXNlcV9wcmludGYocCwgIiUxMHUgIiwga3N0YXRfY3B1KGopLmlycXNbaV0pOwogI2VuZGlmCiAJCXNlcV9wcmludGYocCwgIiAlOHMiLCBpcnFfZGVzY1tpXS5jaGlwLT5uYW1lKTsKLQkJc2VxX3ByaW50ZihwLCAiLSVzIiwgaGFuZGxlX2lycV9uYW1lKGlycV9kZXNjW2ldLmhhbmRsZV9pcnEpKTsKKwkJc2VxX3ByaW50ZihwLCAiLSUtOHMiLCBpcnFfZGVzY1tpXS5uYW1lKTsKIAkJc2VxX3ByaW50ZihwLCAiICAlcyIsIGFjdGlvbi0+bmFtZSk7CiAKIAkJZm9yIChhY3Rpb249YWN0aW9uLT5uZXh0OyBhY3Rpb247IGFjdGlvbiA9IGFjdGlvbi0+bmV4dCkKZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9rZXJuZWwva3Byb2Jlcy5jIGIvYXJjaC9pMzg2L2tlcm5lbC9rcHJvYmVzLmMKaW5kZXggZDk4ZTQ0Yi4uZmM3OWUxZSAxMDA2NDQKLS0tIGEvYXJjaC9pMzg2L2tlcm5lbC9rcHJvYmVzLmMKKysrIGIvYXJjaC9pMzg2L2tlcm5lbC9rcHJvYmVzLmMKQEAgLTM2MSw4ICszNjEsMTEgQEAKIAlhc20gdm9sYXRpbGUgKCAiLmdsb2JhbCBrcmV0cHJvYmVfdHJhbXBvbGluZVxuIgogCQkJImtyZXRwcm9iZV90cmFtcG9saW5lOiBcbiIKIAkJCSIJcHVzaGZcbiIKLQkJCS8qIHNraXAgY3MsIGVpcCwgb3JpZ19lYXgsIGVzLCBkcyAqLwotCQkJIglzdWJsICQyMCwgJWVzcFxuIgorCQkJLyogc2tpcCBjcywgZWlwLCBvcmlnX2VheCAqLworCQkJIglzdWJsICQxMiwgJWVzcFxuIgorCQkJIglwdXNobCAlZ3NcbiIKKwkJCSIJcHVzaGwgJWRzXG4iCisJCQkiCXB1c2hsICVlc1xuIgogCQkJIglwdXNobCAlZWF4XG4iCiAJCQkiCXB1c2hsICVlYnBcbiIKIAkJCSIJcHVzaGwgJWVkaVxuIgpAQCAtMzczLDEwICszNzYsMTAgQEAKIAkJCSIJbW92bCAlZXNwLCAlZWF4XG4iCiAJCQkiCWNhbGwgdHJhbXBvbGluZV9oYW5kbGVyXG4iCiAJCQkvKiBtb3ZlIGVmbGFncyB0byBjcyAqLwotCQkJIgltb3ZsIDQ4KCVlc3ApLCAlZWR4XG4iCi0JCQkiCW1vdmwgJWVkeCwgNDQoJWVzcClcbiIKKwkJCSIJbW92bCA1MiglZXNwKSwgJWVkeFxuIgorCQkJIgltb3ZsICVlZHgsIDQ4KCVlc3ApXG4iCiAJCQkvKiBzYXZlIHRydWUgcmV0dXJuIGFkZHJlc3Mgb24gZWZsYWdzICovCi0JCQkiCW1vdmwgJWVheCwgNDgoJWVzcClcbiIKKwkJCSIJbW92bCAlZWF4LCA1MiglZXNwKVxuIgogCQkJIglwb3BsICVlYnhcbiIKIAkJCSIJcG9wbCAlZWN4XG4iCiAJCQkiCXBvcGwgJWVkeFxuIgpAQCAtMzg0LDggKzM4Nyw4IEBACiAJCQkiCXBvcGwgJWVkaVxuIgogCQkJIglwb3BsICVlYnBcbiIKIAkJCSIJcG9wbCAlZWF4XG4iCi0JCQkvKiBza2lwIGVpcCwgb3JpZ19lYXgsIGVzLCBkcyAqLwotCQkJIglhZGRsICQxNiwgJWVzcFxuIgorCQkJLyogc2tpcCBlaXAsIG9yaWdfZWF4LCBlcywgZHMsIGdzICovCisJCQkiCWFkZGwgJDIwLCAlZXNwXG4iCiAJCQkiCXBvcGZcbiIKIAkJCSIJcmV0XG4iKTsKIH0KQEAgLTQwNCw2ICs0MDcsMTAgQEAKIAlJTklUX0hMSVNUX0hFQUQoJmVtcHR5X3JwKTsKIAlzcGluX2xvY2tfaXJxc2F2ZSgma3JldHByb2JlX2xvY2ssIGZsYWdzKTsKIAloZWFkID0ga3JldHByb2JlX2luc3RfdGFibGVfaGVhZChjdXJyZW50KTsKKwkvKiBmaXh1cCByZWdpc3RlcnMgKi8KKwlyZWdzLT54Y3MgPSBfX0tFUk5FTF9DUzsKKwlyZWdzLT5laXAgPSB0cmFtcG9saW5lX2FkZHJlc3M7CisJcmVncy0+b3JpZ19lYXggPSAweGZmZmZmZmZmOwogCiAJLyoKIAkgKiBJdCBpcyBwb3NzaWJsZSB0byBoYXZlIG11bHRpcGxlIGluc3RhbmNlcyBhc3NvY2lhdGVkIHdpdGggYSBnaXZlbgpAQCAtNDI1LDYgKzQzMiw3IEBACiAKIAkJaWYgKHJpLT5ycCAmJiByaS0+cnAtPmhhbmRsZXIpewogCQkJX19nZXRfY3B1X3ZhcihjdXJyZW50X2twcm9iZSkgPSAmcmktPnJwLT5rcDsKKwkJCWdldF9rcHJvYmVfY3RsYmxrKCktPmtwcm9iZV9zdGF0dXMgPSBLUFJPQkVfSElUX0FDVElWRTsKIAkJCXJpLT5ycC0+aGFuZGxlcihyaSwgcmVncyk7CiAJCQlfX2dldF9jcHVfdmFyKGN1cnJlbnRfa3Byb2JlKSA9IE5VTEw7CiAJCX0KZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9rZXJuZWwvbWljcm9jb2RlLmMgYi9hcmNoL2kzODYva2VybmVsL21pY3JvY29kZS5jCmluZGV4IDliOTQ3OTcuLjIzZjU5ODQgMTAwNjQ0Ci0tLSBhL2FyY2gvaTM4Ni9rZXJuZWwvbWljcm9jb2RlLmMKKysrIGIvYXJjaC9pMzg2L2tlcm5lbC9taWNyb2NvZGUuYwpAQCAtNTc3LDcgKzU3Nyw3IEBACiAJc2V0X2NwdXNfYWxsb3dlZChjdXJyZW50LCBjcHVtYXNrX29mX2NwdShjcHUpKTsKIAltdXRleF9sb2NrKCZtaWNyb2NvZGVfbXV0ZXgpOwogCWNvbGxlY3RfY3B1X2luZm8oY3B1KTsKLQlpZiAodWNpLT52YWxpZCkKKwlpZiAodWNpLT52YWxpZCAmJiBzeXN0ZW1fc3RhdGUgPT0gU1lTVEVNX1JVTk5JTkcpCiAJCWNwdV9yZXF1ZXN0X21pY3JvY29kZShjcHUpOwogCW11dGV4X3VubG9jaygmbWljcm9jb2RlX211dGV4KTsKIAlzZXRfY3B1c19hbGxvd2VkKGN1cnJlbnQsIG9sZCk7CkBAIC02NTYsMTQgKzY1NiwxOCBAQAogCiBzdGF0aWMgaW50IG1jX3N5c2Rldl9hZGQoc3RydWN0IHN5c19kZXZpY2UgKnN5c19kZXYpCiB7Ci0JaW50IGNwdSA9IHN5c19kZXYtPmlkOworCWludCBlcnIsIGNwdSA9IHN5c19kZXYtPmlkOwogCXN0cnVjdCB1Y29kZV9jcHVfaW5mbyAqdWNpID0gdWNvZGVfY3B1X2luZm8gKyBjcHU7CiAKIAlpZiAoIWNwdV9vbmxpbmUoY3B1KSkKIAkJcmV0dXJuIDA7CisKIAlwcl9kZWJ1ZygiTWljcm9jb2RlOkNQVSAlZCBhZGRlZFxuIiwgY3B1KTsKIAltZW1zZXQodWNpLCAwLCBzaXplb2YoKnVjaSkpOwotCXN5c2ZzX2NyZWF0ZV9ncm91cCgmc3lzX2Rldi0+a29iaiwgJm1jX2F0dHJfZ3JvdXApOworCisJZXJyID0gc3lzZnNfY3JlYXRlX2dyb3VwKCZzeXNfZGV2LT5rb2JqLCAmbWNfYXR0cl9ncm91cCk7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKIAogCW1pY3JvY29kZV9pbml0X2NwdShjcHUpOwogCXJldHVybiAwOwpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L2tlcm5lbC9ubWkuYyBiL2FyY2gvaTM4Ni9rZXJuZWwvbm1pLmMKaW5kZXggM2U4ZTNhZC4uZWFhZmUyMyAxMDA2NDQKLS0tIGEvYXJjaC9pMzg2L2tlcm5lbC9ubWkuYworKysgYi9hcmNoL2kzODYva2VybmVsL25taS5jCkBAIC0yMTksMTEgKzIxOSwxMSBAQAogCWludCBjcHU7CiAKIAkvKiBFbmFibGUgTk1JIHdhdGNoZG9nIGZvciBuZXdlciBzeXN0ZW1zLgotICAgICAgICAgICBBY3R1YWxseSBpdCBzaG91bGQgYmUgc2FmZSBmb3IgbW9zdCBzeXN0ZW1zIGJlZm9yZSAyMDA0IHRvbyBleGNlcHQKLQkgICBmb3Igc29tZSBJQk0gc3lzdGVtcyB0aGF0IGNvcnJ1cHQgcmVnaXN0ZXJzIHdoZW4gTk1JIGhhcHBlbnMKLQkgICBkdXJpbmcgU01NLiBVbmZvcnR1bmF0ZWx5IHdlIGRvbid0IGhhdmUgbW9yZSBleGFjdCBpbmZvcm1hdGlvbgotIAkgICBvbiB0aGVzZSBhbmQgdXNlIHRoaXMgY29hcnNlIGNoZWNrLiAqLwotCWlmIChubWlfd2F0Y2hkb2cgPT0gTk1JX0RFRkFVTFQgJiYgZG1pX2dldF95ZWFyKERNSV9CSU9TX0RBVEUpID49IDIwMDQpCisJICAgUHJvYmFibHkgc2FmZSBvbiBtb3N0IG9sZGVyIHN5c3RlbXMgdG9vLCBidXQgbGV0J3MgYmUgY2FyZWZ1bC4KKwkgICBJQk0gVGhpbmtQYWRzIHVzZSBJTlQxMCBpbnNpZGUgU01NIGFuZCB0aGF0IGFsbG93cyBlYXJseSBOTUkgaW5zaWRlIFNNTQorCSAgIHdoaWNoIGhhbmdzIHRoZSBzeXN0ZW0uIERpc2FibGUgd2F0Y2hkb2cgZm9yIGFsbCB0aGlua3BhZHMgKi8KKwlpZiAobm1pX3dhdGNoZG9nID09IE5NSV9ERUZBVUxUICYmIGRtaV9nZXRfeWVhcihETUlfQklPU19EQVRFKSA+PSAyMDA0ICYmCisJCSFkbWlfbmFtZV9pbl92ZW5kb3JzKCJUaGlua1BhZCIpKQogCQlubWlfd2F0Y2hkb2cgPSBOTUlfTE9DQUxfQVBJQzsKIAogCWlmICgobm1pX3dhdGNoZG9nID09IE5NSV9OT05FKSB8fCAobm1pX3dhdGNoZG9nID09IE5NSV9ERUZBVUxUKSkKZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9rZXJuZWwvcHJvY2Vzcy5jIGIvYXJjaC9pMzg2L2tlcm5lbC9wcm9jZXNzLmMKaW5kZXggYjBhMDc4MC4uZGQ1M2M1OCAxMDA2NDQKLS0tIGEvYXJjaC9pMzg2L2tlcm5lbC9wcm9jZXNzLmMKKysrIGIvYXJjaC9pMzg2L2tlcm5lbC9wcm9jZXNzLmMKQEAgLTIwNSw3ICsyMDUsNyBAQAogdm9pZCBjcHVfaWRsZV93YWl0KHZvaWQpCiB7CiAJdW5zaWduZWQgaW50IGNwdSwgdGhpc19jcHUgPSBnZXRfY3B1KCk7Ci0JY3B1bWFza190IG1hcDsKKwljcHVtYXNrX3QgbWFwLCB0bXAgPSBjdXJyZW50LT5jcHVzX2FsbG93ZWQ7CiAKIAlzZXRfY3B1c19hbGxvd2VkKGN1cnJlbnQsIGNwdW1hc2tfb2ZfY3B1KHRoaXNfY3B1KSk7CiAJcHV0X2NwdSgpOwpAQCAtMjI3LDYgKzIyNyw4IEBACiAJCX0KIAkJY3B1c19hbmQobWFwLCBtYXAsIGNwdV9vbmxpbmVfbWFwKTsKIAl9IHdoaWxlICghY3B1c19lbXB0eShtYXApKTsKKworCXNldF9jcHVzX2FsbG93ZWQoY3VycmVudCwgdG1wKTsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKGNwdV9pZGxlX3dhaXQpOwogCkBAIC0yMzYsMTggKzIzOCwyNiBAQAogICogV2UgZXhlY3V0ZSBNT05JVE9SIGFnYWluc3QgbmVlZF9yZXNjaGVkIGFuZCBlbnRlciBvcHRpbWl6ZWQgd2FpdCBzdGF0ZQogICogdGhyb3VnaCBNV0FJVC4gV2hlbmV2ZXIgc29tZW9uZSBjaGFuZ2VzIG5lZWRfcmVzY2hlZCwgd2Ugd291bGQgYmUgd29rZW4KICAqIHVwIGZyb20gTVdBSVQgKHdpdGhvdXQgYW4gSVBJKS4KKyAqCisgKiBOZXcgd2l0aCBDb3JlIER1byBwcm9jZXNzb3JzLCBNV0FJVCBjYW4gdGFrZSBzb21lIGhpbnRzIGJhc2VkIG9uIENQVQorICogY2FwYWJpbGl0eS4KICAqLwordm9pZCBtd2FpdF9pZGxlX3dpdGhfaGludHModW5zaWduZWQgbG9uZyBlYXgsIHVuc2lnbmVkIGxvbmcgZWN4KQoreworCWlmICghbmVlZF9yZXNjaGVkKCkpIHsKKwkJX19tb25pdG9yKCh2b2lkICopJmN1cnJlbnRfdGhyZWFkX2luZm8oKS0+ZmxhZ3MsIDAsIDApOworCQlzbXBfbWIoKTsKKwkJaWYgKCFuZWVkX3Jlc2NoZWQoKSkKKwkJCV9fbXdhaXQoZWF4LCBlY3gpOworCX0KK30KKworLyogRGVmYXVsdCBNT05JVE9SL01XQUlUIHdpdGggbm8gaGludHMsIHVzZWQgZm9yIGRlZmF1bHQgQzEgc3RhdGUgKi8KIHN0YXRpYyB2b2lkIG13YWl0X2lkbGUodm9pZCkKIHsKIAlsb2NhbF9pcnFfZW5hYmxlKCk7Ci0KLQl3aGlsZSAoIW5lZWRfcmVzY2hlZCgpKSB7Ci0JCV9fbW9uaXRvcigodm9pZCAqKSZjdXJyZW50X3RocmVhZF9pbmZvKCktPmZsYWdzLCAwLCAwKTsKLQkJc21wX21iKCk7Ci0JCWlmIChuZWVkX3Jlc2NoZWQoKSkKLQkJCWJyZWFrOwotCQlfX213YWl0KDAsIDApOwotCX0KKwl3aGlsZSAoIW5lZWRfcmVzY2hlZCgpKQorCQltd2FpdF9pZGxlX3dpdGhfaGludHMoMCwgMCk7CiB9CiAKIHZvaWQgX19kZXZpbml0IHNlbGVjdF9pZGxlX3JvdXRpbmUoY29uc3Qgc3RydWN0IGNwdWluZm9feDg2ICpjKQpAQCAtMzI4LDcgKzMzOCw2IEBACiBpbnQga2VybmVsX3RocmVhZChpbnQgKCpmbikodm9pZCAqKSwgdm9pZCAqIGFyZywgdW5zaWduZWQgbG9uZyBmbGFncykKIHsKIAlzdHJ1Y3QgcHRfcmVncyByZWdzOwotCWludCBlcnI7CiAKIAltZW1zZXQoJnJlZ3MsIDAsIHNpemVvZihyZWdzKSk7CiAKQEAgLTM0MywxMCArMzUyLDcgQEAKIAlyZWdzLmVmbGFncyA9IFg4Nl9FRkxBR1NfSUYgfCBYODZfRUZMQUdTX1NGIHwgWDg2X0VGTEFHU19QRiB8IDB4MjsKIAogCS8qIE9rLCBjcmVhdGUgdGhlIG5ldyBwcm9jZXNzLi4gKi8KLQllcnIgPSBkb19mb3JrKGZsYWdzIHwgQ0xPTkVfVk0gfCBDTE9ORV9VTlRSQUNFRCwgMCwgJnJlZ3MsIDAsIE5VTEwsIE5VTEwpOwotCWlmIChlcnIgPT0gMCkgLyogdGVybWluYXRlIGtlcm5lbCBzdGFjayAqLwotCQl0YXNrX3B0X3JlZ3MoY3VycmVudCktPmVpcCA9IDA7Ci0JcmV0dXJuIGVycjsKKwlyZXR1cm4gZG9fZm9yayhmbGFncyB8IENMT05FX1ZNIHwgQ0xPTkVfVU5UUkFDRUQsIDAsICZyZWdzLCAwLCBOVUxMLCBOVUxMKTsKIH0KIEVYUE9SVF9TWU1CT0woa2VybmVsX3RocmVhZCk7CiAKZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9rZXJuZWwvc2V0dXAuYyBiL2FyY2gvaTM4Ni9rZXJuZWwvc2V0dXAuYwppbmRleCAwMDBjZjAzLi4xNDEwNDFkIDEwMDY0NAotLS0gYS9hcmNoL2kzODYva2VybmVsL3NldHVwLmMKKysrIGIvYXJjaC9pMzg2L2tlcm5lbC9zZXR1cC5jCkBAIC04NDYsNyArODQ2LDcgQEAKIHN0YXRpYyBpbnQgX19pbml0CiBlZmlfbWVtb3J5X3ByZXNlbnRfd3JhcHBlcih1bnNpZ25lZCBsb25nIHN0YXJ0LCB1bnNpZ25lZCBsb25nIGVuZCwgdm9pZCAqYXJnKQogewotCW1lbW9yeV9wcmVzZW50KDAsIHN0YXJ0LCBlbmQpOworCW1lbW9yeV9wcmVzZW50KDAsIFBGTl9VUChzdGFydCksIFBGTl9ET1dOKGVuZCkpOwogCXJldHVybiAwOwogfQogCkBAIC0xMDgzLDE2ICsxMDgzLDE1IEBACiAKIHZvaWQgX19pbml0IHpvbmVfc2l6ZXNfaW5pdCh2b2lkKQogeworCXVuc2lnbmVkIGxvbmcgbWF4X3pvbmVfcGZuc1tNQVhfTlJfWk9ORVNdOworCW1lbXNldChtYXhfem9uZV9wZm5zLCAwLCBzaXplb2YobWF4X3pvbmVfcGZucykpOworCW1heF96b25lX3BmbnNbWk9ORV9ETUFdID0KKwkJdmlydF90b19waHlzKChjaGFyICopTUFYX0RNQV9BRERSRVNTKSA+PiBQQUdFX1NISUZUOworCW1heF96b25lX3BmbnNbWk9ORV9OT1JNQUxdID0gbWF4X2xvd19wZm47CiAjaWZkZWYgQ09ORklHX0hJR0hNRU0KLQl1bnNpZ25lZCBsb25nIG1heF96b25lX3BmbnNbTUFYX05SX1pPTkVTXSA9IHsKLQkJCXZpcnRfdG9fcGh5cygoY2hhciAqKU1BWF9ETUFfQUREUkVTUykgPj4gUEFHRV9TSElGVCwKLQkJCW1heF9sb3dfcGZuLAotCQkJaGlnaGVuZF9wZm59OworCW1heF96b25lX3BmbnNbWk9ORV9ISUdITUVNXSA9IGhpZ2hlbmRfcGZuOwogCWFkZF9hY3RpdmVfcmFuZ2UoMCwgMCwgaGlnaGVuZF9wZm4pOwogI2Vsc2UKLQl1bnNpZ25lZCBsb25nIG1heF96b25lX3BmbnNbTUFYX05SX1pPTkVTXSA9IHsKLQkJCXZpcnRfdG9fcGh5cygoY2hhciAqKU1BWF9ETUFfQUREUkVTUykgPj4gUEFHRV9TSElGVCwKLQkJCW1heF9sb3dfcGZufTsKIAlhZGRfYWN0aXZlX3JhbmdlKDAsIDAsIG1heF9sb3dfcGZuKTsKICNlbmRpZgogCmRpZmYgLS1naXQgYS9hcmNoL2kzODYva2VybmVsL3N5c2NhbGxfdGFibGUuUyBiL2FyY2gvaTM4Ni9rZXJuZWwvc3lzY2FsbF90YWJsZS5TCmluZGV4IDdlNjM5ZjcuLjI2OTdlOTIgMTAwNjQ0Ci0tLSBhL2FyY2gvaTM4Ni9rZXJuZWwvc3lzY2FsbF90YWJsZS5TCisrKyBiL2FyY2gvaTM4Ni9rZXJuZWwvc3lzY2FsbF90YWJsZS5TCkBAIC0zMTgsMyArMzE4LDQgQEAKIAkubG9uZyBzeXNfdm1zcGxpY2UKIAkubG9uZyBzeXNfbW92ZV9wYWdlcwogCS5sb25nIHN5c19nZXRjcHUKKwkubG9uZyBzeXNfZXBvbGxfcHdhaXQKZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9rZXJuZWwvdHJhcHMuYyBiL2FyY2gvaTM4Ni9rZXJuZWwvdHJhcHMuYwppbmRleCAwMDQ4OWI3Li5mZTljNWU4IDEwMDY0NAotLS0gYS9hcmNoL2kzODYva2VybmVsL3RyYXBzLmMKKysrIGIvYXJjaC9pMzg2L2tlcm5lbC90cmFwcy5jCkBAIC0xMjksMTUgKzEyOSwxOSBAQAogCiAjaWZkZWYJQ09ORklHX0ZSQU1FX1BPSU5URVIKIAl3aGlsZSAodmFsaWRfc3RhY2tfcHRyKHRpbmZvLCAodm9pZCAqKWVicCkpIHsKKwkJdW5zaWduZWQgbG9uZyBuZXdfZWJwOwogCQlhZGRyID0gKih1bnNpZ25lZCBsb25nICopKGVicCArIDQpOwogCQlvcHMtPmFkZHJlc3MoZGF0YSwgYWRkcik7CiAJCS8qCiAJCSAqIGJyZWFrIG91dCBvZiByZWN1cnNpdmUgZW50cmllcyAoc3VjaCBhcwotCQkgKiBlbmRfb2Zfc3RhY2tfc3RvcF91bndpbmRfZnVuY3Rpb24pOgorCQkgKiBlbmRfb2Zfc3RhY2tfc3RvcF91bndpbmRfZnVuY3Rpb24pLiBBbHNvLAorCQkgKiB3ZSBjYW4gbmV2ZXIgYWxsb3cgYSBmcmFtZSBwb2ludGVyIHRvCisJCSAqIG1vdmUgZG93bndhcmRzIQogCSAJICovCi0JCWlmIChlYnAgPT0gKih1bnNpZ25lZCBsb25nICopZWJwKQorCSAJbmV3X2VicCA9ICoodW5zaWduZWQgbG9uZyAqKWVicDsKKwkJaWYgKG5ld19lYnAgPD0gZWJwKQogCQkJYnJlYWs7Ci0JCWVicCA9ICoodW5zaWduZWQgbG9uZyAqKWVicDsKKwkJZWJwID0gbmV3X2VicDsKIAl9CiAjZWxzZQogCXdoaWxlICh2YWxpZF9zdGFja19wdHIodGluZm8sIHN0YWNrKSkgewpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L2tlcm5lbC90c2MuYyBiL2FyY2gvaTM4Ni9rZXJuZWwvdHNjLmMKaW5kZXggYjhmYTBhOC4uZmJjOTU4MiAxMDA2NDQKLS0tIGEvYXJjaC9pMzg2L2tlcm5lbC90c2MuYworKysgYi9hcmNoL2kzODYva2VybmVsL3RzYy5jCkBAIC0zNDksOCArMzQ5LDggQEAKIAlpbnQgY2hhbmdlID0gMDsKIAogCS8qIGNoZWNrIHRvIHNlZSBpZiB3ZSBzaG91bGQgc3dpdGNoIHRvIHRoZSBzYWZlIGNsb2Nrc291cmNlOiAqLwotCWlmIChjbG9ja3NvdXJjZV90c2MucmF0aW5nICE9IDUwICYmIGNoZWNrX3RzY191bnN0YWJsZSgpKSB7Ci0JCWNsb2Nrc291cmNlX3RzYy5yYXRpbmcgPSA1MDsKKwlpZiAoY2xvY2tzb3VyY2VfdHNjLnJhdGluZyAhPSAwICYmIGNoZWNrX3RzY191bnN0YWJsZSgpKSB7CisJCWNsb2Nrc291cmNlX3RzYy5yYXRpbmcgPSAwOwogCQljbG9ja3NvdXJjZV9yZXNlbGVjdCgpOwogCQljaGFuZ2UgPSAxOwogCX0KQEAgLTQ2MSw3ICs0NjEsNyBAQAogCQkJCQkJCWNsb2Nrc291cmNlX3RzYy5zaGlmdCk7CiAJCS8qIGxvd2VyIHRoZSByYXRpbmcgaWYgd2UgYWxyZWFkeSBrbm93IGl0cyB1bnN0YWJsZTogKi8KIAkJaWYgKGNoZWNrX3RzY191bnN0YWJsZSgpKQotCQkJY2xvY2tzb3VyY2VfdHNjLnJhdGluZyA9IDUwOworCQkJY2xvY2tzb3VyY2VfdHNjLnJhdGluZyA9IDA7CiAKIAkJaW5pdF90aW1lcigmdmVyaWZ5X3RzY19mcmVxX3RpbWVyKTsKIAkJdmVyaWZ5X3RzY19mcmVxX3RpbWVyLmZ1bmN0aW9uID0gdmVyaWZ5X3RzY19mcmVxOwpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L2tlcm5lbC92bWxpbnV4Lmxkcy5TIGIvYXJjaC9pMzg2L2tlcm5lbC92bWxpbnV4Lmxkcy5TCmluZGV4IDFlN2FjMWMuLmM2Zjg0YTAgMTAwNjQ0Ci0tLSBhL2FyY2gvaTM4Ni9rZXJuZWwvdm1saW51eC5sZHMuUworKysgYi9hcmNoL2kzODYva2VybmVsL3ZtbGludXgubGRzLlMKQEAgLTUxLDYgKzUxLDcgQEAKICAgX190cmFjZWRhdGFfZW5kID0gLjsKIAogICAvKiB3cml0ZWFibGUgKi8KKyAgLiA9IEFMSUdOKDQwOTYpOwogICAuZGF0YSA6IEFUKEFERFIoLmRhdGEpIC0gTE9BRF9PRkZTRVQpIHsJLyogRGF0YSAqLwogCSooLmRhdGEpCiAJQ09OU1RSVUNUT1JTCkBAIC0xMjYsMTMgKzEyNyw3IEBACiAgIF9fc2V0dXBfZW5kID0gLjsKICAgX19pbml0Y2FsbF9zdGFydCA9IC47CiAgIC5pbml0Y2FsbC5pbml0IDogQVQoQUREUiguaW5pdGNhbGwuaW5pdCkgLSBMT0FEX09GRlNFVCkgewotCSooLmluaXRjYWxsMS5pbml0KSAKLQkqKC5pbml0Y2FsbDIuaW5pdCkgCi0JKiguaW5pdGNhbGwzLmluaXQpIAotCSooLmluaXRjYWxsNC5pbml0KSAKLQkqKC5pbml0Y2FsbDUuaW5pdCkgCi0JKiguaW5pdGNhbGw2LmluaXQpIAotCSooLmluaXRjYWxsNy5pbml0KQorCUlOSVRDQUxMUwogICB9CiAgIF9faW5pdGNhbGxfZW5kID0gLjsKICAgX19jb25faW5pdGNhbGxfc3RhcnQgPSAuOwpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L2xpYi91c2VyY29weS5jIGIvYXJjaC9pMzg2L2xpYi91c2VyY29weS5jCmluZGV4IDA4NTAyZmMuLmQyMmNmYzkgMTAwNjQ0Ci0tLSBhL2FyY2gvaTM4Ni9saWIvdXNlcmNvcHkuYworKysgYi9hcmNoL2kzODYvbGliL3VzZXJjb3B5LmMKQEAgLTksNiArOSw3IEBACiAjaW5jbHVkZSA8bGludXgvaGlnaG1lbS5oPgogI2luY2x1ZGUgPGxpbnV4L2Jsa2Rldi5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2JhY2tpbmctZGV2Lmg+CiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KICNpbmNsdWRlIDxhc20vbW14Lmg+CiAKQEAgLTE3OSw3ICsxODAsNyBAQAogRVhQT1JUX1NZTUJPTChfX2NsZWFyX3VzZXIpOwogCiAvKioKLSAqIHN0cmxlbl91c2VyOiAtIEdldCB0aGUgc2l6ZSBvZiBhIHN0cmluZyBpbiB1c2VyIHNwYWNlLgorICogc3Rybmxlbl91c2VyOiAtIEdldCB0aGUgc2l6ZSBvZiBhIHN0cmluZyBpbiB1c2VyIHNwYWNlLgogICogQHM6IFRoZSBzdHJpbmcgdG8gbWVhc3VyZS4KICAqIEBuOiBUaGUgbWF4aW11bSB2YWxpZCBsZW5ndGgKICAqCkBAIC03NDEsNyArNzQyLDcgQEAKIAogCQkJaWYgKHJldHZhbCA9PSAtRU5PTUVNICYmIGlzX2luaXQoY3VycmVudCkpIHsKIAkJCQl1cF9yZWFkKCZjdXJyZW50LT5tbS0+bW1hcF9zZW0pOwotCQkJCWJsa19jb25nZXN0aW9uX3dhaXQoV1JJVEUsIEhaLzUwKTsKKwkJCQljb25nZXN0aW9uX3dhaXQoV1JJVEUsIEhaLzUwKTsKIAkJCQlnb3RvIHN1cnZpdmU7CiAJCQl9CiAKZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9tYWNoLXZpc3dzL3Zpc3dzX2FwaWMuYyBiL2FyY2gvaTM4Ni9tYWNoLXZpc3dzL3Zpc3dzX2FwaWMuYwppbmRleCAwNzA5N2VkLi4zOGMyYjEzIDEwMDY0NAotLS0gYS9hcmNoL2kzODYvbWFjaC12aXN3cy92aXN3c19hcGljLmMKKysrIGIvYXJjaC9pMzg2L21hY2gtdmlzd3Mvdmlzd3NfYXBpYy5jCkBAIC0xMjIsNyArMTIyLDcgQEAKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjb2JhbHRfbG9jaywgZmxhZ3MpOwogfQogCi1zdGF0aWMgc3RydWN0IGh3X2ludGVycnVwdF90eXBlIGNvYmFsdF9pcnFfdHlwZSA9IHsKK3N0YXRpYyBzdHJ1Y3QgaXJxX2NoaXAgY29iYWx0X2lycV90eXBlID0gewogCS50eXBlbmFtZSA9CSJDb2JhbHQtQVBJQyIsCiAJLnN0YXJ0dXAgPQlzdGFydHVwX2NvYmFsdF9pcnEsCiAJLnNodXRkb3duID0JZGlzYWJsZV9jb2JhbHRfaXJxLApAQCAtMTU5LDcgKzE1OSw3IEBACiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY29iYWx0X2xvY2ssIGZsYWdzKTsKIH0KIAotc3RhdGljIHN0cnVjdCBod19pbnRlcnJ1cHRfdHlwZSBwaWl4NF9tYXN0ZXJfaXJxX3R5cGUgPSB7CitzdGF0aWMgc3RydWN0IGlycV9jaGlwIHBpaXg0X21hc3Rlcl9pcnFfdHlwZSA9IHsKIAkudHlwZW5hbWUgPQkiUElJWDQtbWFzdGVyIiwKIAkuc3RhcnR1cCA9CXN0YXJ0dXBfcGlpeDRfbWFzdGVyX2lycSwKIAkuYWNrID0JCWFja19jb2JhbHRfaXJxLApAQCAtMTY3LDkgKzE2Nyw4IEBACiB9OwogCiAKLXN0YXRpYyBzdHJ1Y3QgaHdfaW50ZXJydXB0X3R5cGUgcGlpeDRfdmlydHVhbF9pcnFfdHlwZSA9IHsKK3N0YXRpYyBzdHJ1Y3QgaXJxX2NoaXAgcGlpeDRfdmlydHVhbF9pcnFfdHlwZSA9IHsKIAkudHlwZW5hbWUgPQkiUElJWDQtdmlydHVhbCIsCi0JLnN0YXJ0dXAgPQlzdGFydHVwXzgyNTlBX2lycSwKIAkuc2h1dGRvd24gPQlkaXNhYmxlXzgyNTlBX2lycSwKIAkuZW5hYmxlID0JZW5hYmxlXzgyNTlBX2lycSwKIAkuZGlzYWJsZSA9CWRpc2FibGVfODI1OUFfaXJxLApkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L21hY2gtdm95YWdlci92b3lhZ2VyX2Jhc2ljLmMgYi9hcmNoL2kzODYvbWFjaC12b3lhZ2VyL3ZveWFnZXJfYmFzaWMuYwppbmRleCBjNjM5ZDMwLi44ZmU3ZTQ1IDEwMDY0NAotLS0gYS9hcmNoL2kzODYvbWFjaC12b3lhZ2VyL3ZveWFnZXJfYmFzaWMuYworKysgYi9hcmNoL2kzODYvbWFjaC12b3lhZ2VyL3ZveWFnZXJfYmFzaWMuYwpAQCAtNDQsNyArNDQsNyBAQAogCiAjaWZkZWYgQ09ORklHX1NNUAogc3RhdGljIHZvaWQKLXZveWFnZXJfZHVtcChpbnQgZHVtbXkxLCBzdHJ1Y3QgcHRfcmVncyAqZHVtbXkyLCBzdHJ1Y3QgdHR5X3N0cnVjdCAqZHVtbXkzKQordm95YWdlcl9kdW1wKGludCBkdW1teTEsIHN0cnVjdCB0dHlfc3RydWN0ICpkdW1teTMpCiB7CiAJLyogZ2V0IGhlcmUgdmlhIGEgc3lzcnEgKi8KIAl2b3lhZ2VyX3NtcF9kdW1wKCk7CkBAIC0xNjYsNyArMTY2LDcgQEAKICAqIG9mZiB0aGUgdGltZXIgdGljayB0byB0aGUgU01QIGNvZGUsIHNpbmNlIHRoZSBWSUMgZG9lc24ndCBoYXZlIGFuCiAgKiBpbnRlcm5hbCB0aW1lciAoVGhlIFFJQyBkb2VzLCBidXQgdGhhdCdzIGFub3RoZXIgc3RvcnkpLiAqLwogdm9pZAotdm95YWdlcl90aW1lcl9pbnRlcnJ1cHQoc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit2b3lhZ2VyX3RpbWVyX2ludGVycnVwdCh2b2lkKQogewogCWlmKChqaWZmaWVzICYgMHgzZmYpID09IDApIHsKIApAQCAtMjAyLDcgKzIwMiw3IEBACiAJCX0KIAl9CiAjaWZkZWYgQ09ORklHX1NNUAotCXNtcF92aWNfdGltZXJfaW50ZXJydXB0KHJlZ3MpOworCXNtcF92aWNfdGltZXJfaW50ZXJydXB0KCk7CiAjZW5kaWYKIH0KIApkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L21hY2gtdm95YWdlci92b3lhZ2VyX3NtcC5jIGIvYXJjaC9pMzg2L21hY2gtdm95YWdlci92b3lhZ2VyX3NtcC5jCmluZGV4IGQ0MjQyMmYuLmYzZmVhMmEgMTAwNjQ0Ci0tLSBhL2FyY2gvaTM4Ni9tYWNoLXZveWFnZXIvdm95YWdlcl9zbXAuYworKysgYi9hcmNoL2kzODYvbWFjaC12b3lhZ2VyL3ZveWFnZXJfc21wLmMKQEAgLTg1LDggKzg1LDggQEAKIHN0YXRpYyB2b2lkIGFja19zcGVjaWFsX1FJQ19DUEkoX191OCBjcGkpOwogc3RhdGljIHZvaWQgYWNrX1ZJQ19DUEkoX191OCBjcGkpOwogc3RhdGljIHZvaWQgc2VuZF9DUElfYWxsYnV0c2VsZihfX3U4IGNwaSk7Ci1zdGF0aWMgdm9pZCBlbmFibGVfdmljX2lycSh1bnNpZ25lZCBpbnQgaXJxKTsKLXN0YXRpYyB2b2lkIGRpc2FibGVfdmljX2lycSh1bnNpZ25lZCBpbnQgaXJxKTsKK3N0YXRpYyB2b2lkIG1hc2tfdmljX2lycSh1bnNpZ25lZCBpbnQgaXJxKTsKK3N0YXRpYyB2b2lkIHVubWFza192aWNfaXJxKHVuc2lnbmVkIGludCBpcnEpOwogc3RhdGljIHVuc2lnbmVkIGludCBzdGFydHVwX3ZpY19pcnEodW5zaWduZWQgaW50IGlycSk7CiBzdGF0aWMgdm9pZCBlbmFibGVfbG9jYWxfdmljX2lycSh1bnNpZ25lZCBpbnQgaXJxKTsKIHN0YXRpYyB2b2lkIGRpc2FibGVfbG9jYWxfdmljX2lycSh1bnNpZ25lZCBpbnQgaXJxKTsKQEAgLTIwNSwxNSArMjA1LDEyIEBACiAvKiBUaGUgVklDIElSUSBkZXNjcmlwdG9ycyAtLSB0aGVzZSBsb29rIGFsbW9zdCBpZGVudGljYWwgdG8gdGhlCiAgKiA4MjU5IElSUXMgZXhjZXB0IHRoYXQgbWFza3MgYW5kIHRoaW5ncyBtdXN0IGJlIGtlcHQgcGVyIHByb2Nlc3NvcgogICovCi1zdGF0aWMgc3RydWN0IGh3X2ludGVycnVwdF90eXBlIHZpY19pcnFfdHlwZSA9IHsKLQkudHlwZW5hbWUgPSAiVklDLWxldmVsIiwKLQkuc3RhcnR1cCA9IHN0YXJ0dXBfdmljX2lycSwKLQkuc2h1dGRvd24gPSBkaXNhYmxlX3ZpY19pcnEsCi0JLmVuYWJsZSA9IGVuYWJsZV92aWNfaXJxLAotCS5kaXNhYmxlID0gZGlzYWJsZV92aWNfaXJxLAotCS5hY2sgPSBiZWZvcmVfaGFuZGxlX3ZpY19pcnEsCi0JLmVuZCA9IGFmdGVyX2hhbmRsZV92aWNfaXJxLAotCS5zZXRfYWZmaW5pdHkgPSBzZXRfdmljX2lycV9hZmZpbml0eSwKK3N0YXRpYyBzdHJ1Y3QgaXJxX2NoaXAgdmljX2NoaXAgPSB7CisJLm5hbWUJCT0gIlZJQyIsCisJLnN0YXJ0dXAJPSBzdGFydHVwX3ZpY19pcnEsCisJLm1hc2sJCT0gbWFza192aWNfaXJxLAorCS51bm1hc2sJCT0gdW5tYXNrX3ZpY19pcnEsCisJLnNldF9hZmZpbml0eQk9IHNldF92aWNfaXJxX2FmZmluaXR5LAogfTsKIAogLyogdXNlZCB0byBjb3VudCB1cCBhcyBDUFVzIGFyZSBicm91Z2h0IG9uIGxpbmUgKHN0YXJ0cyBhdCAwKSAqLwpAQCAtMTE0NCw5ICsxMTQxLDkgQEAKIGZhc3RjYWxsIHZvaWQKIHNtcF9xaWNfdGltZXJfaW50ZXJydXB0KHN0cnVjdCBwdF9yZWdzICpyZWdzKQogewotCWFja19RSUNfQ1BJKFFJQ19USU1FUl9DUEkpOwogCXN0cnVjdCBwdF9yZWdzICpvbGRfcmVncyA9IHNldF9pcnFfcmVncyhyZWdzKTsKLQl3cmFwcGVyX3NtcF9sb2NhbF90aW1lcl9pbnRlcnJ1cHQodm9pZCk7CisJYWNrX1FJQ19DUEkoUUlDX1RJTUVSX0NQSSk7CisJd3JhcHBlcl9zbXBfbG9jYWxfdGltZXJfaW50ZXJydXB0KCk7CiAJc2V0X2lycV9yZWdzKG9sZF9yZWdzKTsKIH0KIApAQCAtMTI3MCwxMiArMTI2NywxMCBAQAogLyogdGhpcyBmdW5jdGlvbiBpcyB0cmlnZ2VyZWQgaW4gdGltZS5jIHdoZW4gYSBjbG9jayB0aWNrIGZpcmVzCiAgKiB3ZSBuZWVkIHRvIHJlLWJyb2FkY2FzdCB0aGUgdGljayB0byBhbGwgQ1BVcyAqLwogdm9pZAotc21wX3ZpY190aW1lcl9pbnRlcnJ1cHQoc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCitzbXBfdmljX3RpbWVyX2ludGVycnVwdCh2b2lkKQogewotCXN0cnVjdCBwdF9yZWdzICpvbGRfcmVncyA9IHNldF9pcnFfcmVncyhyZWdzKTsKIAlzZW5kX0NQSV9hbGxidXRzZWxmKFZJQ19USU1FUl9DUEkpOwogCXNtcF9sb2NhbF90aW1lcl9pbnRlcnJ1cHQoKTsKLQlzZXRfaXJxX3JlZ3Mob2xkX3JlZ3MpOwogfQogCiAvKiBsb2NhbCAocGVyIENQVSkgdGltZXIgaW50ZXJydXB0LiAgSXQgZG9lcyBib3RoIHByb2ZpbGluZyBhbmQKQEAgLTEzMTAsNyArMTMwNSw3IEBACiAJCQkJCQlwZXJfY3B1KHByb2ZfY291bnRlciwgY3B1KTsKIAkJfQogCi0JCXVwZGF0ZV9wcm9jZXNzX3RpbWVzKHVzZXJfbW9kZV92bShpcnFfcmVncykpOworCQl1cGRhdGVfcHJvY2Vzc190aW1lcyh1c2VyX21vZGVfdm0oZ2V0X2lycV9yZWdzKCkpKTsKIAl9CiAKIAlpZiggKCgxPDxjcHUpICYgdm95YWdlcl9leHRlbmRlZF92aWNfcHJvY2Vzc29ycykgPT0gMCkKQEAgLTEzOTcsNiArMTM5MiwxNyBAQAogCXJldHVybiAwOwogfQogCisvKiBUaGlzIGlzIGEgYml0IG9mIGEgbWVzcywgYnV0IGZvcmNlZCBvbiB1cyBieSB0aGUgZ2VuaXJxIGNoYW5nZXMKKyAqIHRoZXJlJ3Mgbm8gZ2VuaXJxIGhhbmRsZXIgdGhhdCByZWFsbHkgZG9lcyB3aGF0IHZveWFnZXIgd2FudHMKKyAqIHNvIGhhY2sgaXQgdXAgd2l0aCB0aGUgc2ltcGxlIElSUSBoYW5kbGVyICovCitzdGF0aWMgdm9pZCBmYXN0Y2FsbAoraGFuZGxlX3ZpY19pcnEodW5zaWduZWQgaW50IGlycSwgc3RydWN0IGlycV9kZXNjICpkZXNjKQoreworCWJlZm9yZV9oYW5kbGVfdmljX2lycShpcnEpOworCWhhbmRsZV9zaW1wbGVfaXJxKGlycSwgZGVzYyk7CisJYWZ0ZXJfaGFuZGxlX3ZpY19pcnEoaXJxKTsKK30KKwogCiAvKiAgVGhlIENQSXMgYXJlIGhhbmRsZWQgaW4gdGhlIHBlciBjcHUgODI1OXMsIHNvIHRoZXkgbXVzdCBiZQogICogIGVuYWJsZWQgdG8gYmUgcmVjZWl2ZWQ6IEZJWDogZW5hYmxpbmcgdGhlIENQSXMgaW4gdGhlIGVhcmx5CkBAIC0xNDMzLDcgKzE0MzksNyBAQAogCSAqIFRoaXMgaXMgZm9yIGxhdGVyOiBmaXJzdCAxNiBjb3JyZXNwb25kIHRvIFBDIElSUXM7IG5leHQgMTYKIAkgKiBhcmUgUHJpbWFyeSBNQyBJUlFzIGFuZCBmaW5hbCAxNiBhcmUgU2Vjb25kYXJ5IE1DIElSUXMgKi8KIAlmb3IoaSA9IDA7IGkgPCA0ODsgaSsrKQotCQlpcnFfZGVzY1tpXS5jaGlwID0gJnZpY19pcnFfdHlwZTsKKwkJc2V0X2lycV9jaGlwX2FuZF9oYW5kbGVyKGksICZ2aWNfY2hpcCwgaGFuZGxlX3ZpY19pcnEpOwogfQogCiAvKiBzZW5kIGEgQ1BJIGF0IGxldmVsIGNwaSB0byBhIHNldCBvZiBjcHVzIGluIGNwdXNldCAoc2V0IDEgYml0IHBlcgpAQCAtMTUzMSw3ICsxNTM3LDcgQEAKIHN0YXRpYyB1bnNpZ25lZCBpbnQKIHN0YXJ0dXBfdmljX2lycSh1bnNpZ25lZCBpbnQgaXJxKQogewotCWVuYWJsZV92aWNfaXJxKGlycSk7CisJdW5tYXNrX3ZpY19pcnEoaXJxKTsKIAogCXJldHVybiAwOwogfQpAQCAtMTU1OCw3ICsxNTY0LDcgQEAKICAqICAgIGFkanVzdCB0aGVpciBtYXNrcyBhY2NvcmRpbmdseS4gICovCiAKIHN0YXRpYyB2b2lkCi1lbmFibGVfdmljX2lycSh1bnNpZ25lZCBpbnQgaXJxKQordW5tYXNrX3ZpY19pcnEodW5zaWduZWQgaW50IGlycSkKIHsKIAkvKiBsaW51eCBkb2Vzbid0IHRvIHByb2Nlc3Nvci1pcnEgYWZmaW5pdHksIHNvIGVuYWJsZSBvbgogCSAqIGFsbCBDUFVzIHdlIGtub3cgYWJvdXQgKi8KQEAgLTE1NjcsNyArMTU3Myw3IEBACiAJX191MzIgcHJvY2Vzc29yTGlzdCA9IDA7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAotCVZERUJVRygoIlZPWUFHRVI6IGVuYWJsZV92aWNfaXJxKCVkKSBDUFUlZCBhZmZpbml0eSAweCVseFxuIiwKKwlWREVCVUcoKCJWT1lBR0VSOiB1bm1hc2tfdmljX2lycSglZCkgQ1BVJWQgYWZmaW5pdHkgMHglbHhcbiIsCiAJCWlycSwgY3B1LCBjcHVfaXJxX2FmZmluaXR5W2NwdV0pKTsKIAlzcGluX2xvY2tfaXJxc2F2ZSgmdmljX2lycV9sb2NrLCBmbGFncyk7CiAJZm9yX2VhY2hfb25saW5lX2NwdShyZWFsX2NwdSkgewpAQCAtMTU5MSw3ICsxNTk3LDcgQEAKIH0KIAogc3RhdGljIHZvaWQKLWRpc2FibGVfdmljX2lycSh1bnNpZ25lZCBpbnQgaXJxKQorbWFza192aWNfaXJxKHVuc2lnbmVkIGludCBpcnEpCiB7CiAJLyogbGF6eSBkaXNhYmxlLCBkbyBub3RoaW5nICovCiB9CkBAIC0xODE5LDcgKzE4MjUsNyBAQAogCSAqIGRpc2FibGVkIGFnYWluIGFzIGl0IGNvbWVzIGluICh2b3lhZ2VyIGxhenkgZGlzYWJsZSkuICBJZgogCSAqIHRoZSBhZmZpbml0eSBtYXAgaXMgdGlnaHRlbmVkIHRvIGRpc2FibGUgdGhlIGludGVycnVwdCBvbiBhCiAJICogY3B1LCBpdCB3aWxsIGJlIHB1c2hlZCBvZmYgd2hlbiBpdCBjb21lcyBpbiAqLwotCWVuYWJsZV92aWNfaXJxKGlycSk7CisJdW5tYXNrX3ZpY19pcnEoaXJxKTsKIH0KIAogc3RhdGljIHZvaWQKZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9tbS9kaXNjb250aWcuYyBiL2FyY2gvaTM4Ni9tbS9kaXNjb250aWcuYwppbmRleCA0NTU1OTdkLi5kZGJkYjAzIDEwMDY0NAotLS0gYS9hcmNoL2kzODYvbW0vZGlzY29udGlnLmMKKysrIGIvYXJjaC9pMzg2L21tL2Rpc2NvbnRpZy5jCkBAIC0zNTYsMTEgKzM1NiwxMiBAQAogdm9pZCBfX2luaXQgem9uZV9zaXplc19pbml0KHZvaWQpCiB7CiAJaW50IG5pZDsKLQl1bnNpZ25lZCBsb25nIG1heF96b25lX3BmbnNbTUFYX05SX1pPTkVTXSA9IHsKLQkJdmlydF90b19waHlzKChjaGFyICopTUFYX0RNQV9BRERSRVNTKSA+PiBQQUdFX1NISUZULAotCQltYXhfbG93X3BmbiwKLQkJaGlnaGVuZF9wZm4KLQl9OworCXVuc2lnbmVkIGxvbmcgbWF4X3pvbmVfcGZuc1tNQVhfTlJfWk9ORVNdOworCW1lbXNldChtYXhfem9uZV9wZm5zLCAwLCBzaXplb2YobWF4X3pvbmVfcGZucykpOworCW1heF96b25lX3BmbnNbWk9ORV9ETUFdID0KKwkJdmlydF90b19waHlzKChjaGFyICopTUFYX0RNQV9BRERSRVNTKSA+PiBQQUdFX1NISUZUOworCW1heF96b25lX3BmbnNbWk9ORV9OT1JNQUxdID0gbWF4X2xvd19wZm47CisJbWF4X3pvbmVfcGZuc1taT05FX0hJR0hNRU1dID0gaGlnaGVuZF9wZm47CiAKIAkvKiBJZiBTUkFUIGhhcyBub3QgcmVnaXN0ZXJlZCBtZW1vcnksIHJlZ2lzdGVyIGl0IG5vdyAqLwogCWlmIChmaW5kX21heF9wZm5fd2l0aF9hY3RpdmVfcmVnaW9ucygpID09IDApIHsKZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9wY2kvY29tbW9uLmMgYi9hcmNoL2kzODYvcGNpL2NvbW1vbi5jCmluZGV4IDY4YmNlMTk0Li5jZGZjZjk3IDEwMDY0NAotLS0gYS9hcmNoL2kzODYvcGNpL2NvbW1vbi5jCisrKyBiL2FyY2gvaTM4Ni9wY2kvY29tbW9uLmMKQEAgLTIwLDYgKzIwLDcgQEAKIHVuc2lnbmVkIGludCBwY2lfcHJvYmUgPSBQQ0lfUFJPQkVfQklPUyB8IFBDSV9QUk9CRV9DT05GMSB8IFBDSV9QUk9CRV9DT05GMiB8CiAJCQkJUENJX1BST0JFX01NQ09ORjsKIAoraW50IHBjaV9iZl9zb3J0OwogaW50IHBjaV9yb3V0ZWlycTsKIGludCBwY2liaW9zX2xhc3RfYnVzID0gLTE7CiB1bnNpZ25lZCBsb25nIHBpcnFfdGFibGVfYWRkcjsKQEAgLTExOCw2ICsxMTksMjAgQEAKIH0KIAogLyoKKyAqIE9ubHkgdXNlIERNSSBpbmZvcm1hdGlvbiB0byBzZXQgdGhpcyBpZiBub3RoaW5nIHdhcyBwYXNzZWQKKyAqIG9uIHRoZSBrZXJuZWwgY29tbWFuZCBsaW5lICh3aGljaCB3YXMgcGFyc2VkIGVhcmxpZXIpLgorICovCisKK3N0YXRpYyBpbnQgX19kZXZpbml0IHNldF9iZl9zb3J0KHN0cnVjdCBkbWlfc3lzdGVtX2lkICpkKQoreworCWlmIChwY2lfYmZfc29ydCA9PSBwY2lfYmZfc29ydF9kZWZhdWx0KSB7CisJCXBjaV9iZl9zb3J0ID0gcGNpX2RtaV9iZjsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiUENJOiAlcyBkZXRlY3RlZCwgZW5hYmxpbmcgcGNpPWJmc29ydC5cbiIsIGQtPmlkZW50KTsKKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qCiAgKiBFbmFibGUgcmVudW1iZXJpbmcgb2YgUENJIGJ1cyMgcmFuZ2VzIHRvIHJlYWNoIGFsbCBQQ0kgYnVzc2VzIChDYXJkYnVzKQogICovCiAjaWZkZWYgX19pMzg2X18KQEAgLTEzMCwxMSArMTQ1LDExIEBACiB9CiAjZW5kaWYKIAorc3RhdGljIHN0cnVjdCBkbWlfc3lzdGVtX2lkIF9fZGV2aW5pdGRhdGEgcGNpcHJvYmVfZG1pX3RhYmxlW10gPSB7CisjaWZkZWYgX19pMzg2X18KIC8qCiAgKiBMYXB0b3BzIHdoaWNoIG5lZWQgcGNpPWFzc2lnbi1idXNzZXMgdG8gc2VlIENhcmRidXMgY2FyZHMKICAqLwotc3RhdGljIHN0cnVjdCBkbWlfc3lzdGVtX2lkIF9fZGV2aW5pdGRhdGEgcGNpcHJvYmVfZG1pX3RhYmxlW10gPSB7Ci0jaWZkZWYgX19pMzg2X18KIAl7CiAJCS5jYWxsYmFjayA9IGFzc2lnbl9hbGxfYnVzc2VzLAogCQkuaWRlbnQgPSAiU2Ftc3VuZyBYMjAgTGFwdG9wIiwKQEAgLTE0NCw2ICsxNTksMzggQEAKIAkJfSwKIAl9LAogI2VuZGlmCQkvKiBfX2kzODZfXyAqLworCXsKKwkJLmNhbGxiYWNrID0gc2V0X2JmX3NvcnQsCisJCS5pZGVudCA9ICJEZWxsIFBvd2VyRWRnZSAxOTUwIiwKKwkJLm1hdGNoZXMgPSB7CisJCQlETUlfTUFUQ0goRE1JX1NZU19WRU5ET1IsICJEZWxsIiksCisJCQlETUlfTUFUQ0goRE1JX1BST0RVQ1RfTkFNRSwgIlBvd2VyRWRnZSAxOTUwIiksCisJCX0sCisJfSwKKwl7CisJCS5jYWxsYmFjayA9IHNldF9iZl9zb3J0LAorCQkuaWRlbnQgPSAiRGVsbCBQb3dlckVkZ2UgMTk1NSIsCisJCS5tYXRjaGVzID0geworCQkJRE1JX01BVENIKERNSV9TWVNfVkVORE9SLCAiRGVsbCIpLAorCQkJRE1JX01BVENIKERNSV9QUk9EVUNUX05BTUUsICJQb3dlckVkZ2UgMTk1NSIpLAorCQl9LAorCX0sCisJeworCQkuY2FsbGJhY2sgPSBzZXRfYmZfc29ydCwKKwkJLmlkZW50ID0gIkRlbGwgUG93ZXJFZGdlIDI5MDAiLAorCQkubWF0Y2hlcyA9IHsKKwkJCURNSV9NQVRDSChETUlfU1lTX1ZFTkRPUiwgIkRlbGwiKSwKKwkJCURNSV9NQVRDSChETUlfUFJPRFVDVF9OQU1FLCAiUG93ZXJFZGdlIDI5MDAiKSwKKwkJfSwKKwl9LAorCXsKKwkJLmNhbGxiYWNrID0gc2V0X2JmX3NvcnQsCisJCS5pZGVudCA9ICJEZWxsIFBvd2VyRWRnZSAyOTUwIiwKKwkJLm1hdGNoZXMgPSB7CisJCQlETUlfTUFUQ0goRE1JX1NZU19WRU5ET1IsICJEZWxsIiksCisJCQlETUlfTUFUQ0goRE1JX1BST0RVQ1RfTkFNRSwgIlBvd2VyRWRnZSAyOTUwIiksCisJCX0sCisJfSwKIAl7fQogfTsKIApAQCAtMTg5LDYgKzIzNiw4IEBACiAKIAlwY2liaW9zX3Jlc291cmNlX3N1cnZleSgpOwogCisJaWYgKHBjaV9iZl9zb3J0ID49IHBjaV9mb3JjZV9iZikKKwkJcGNpX3NvcnRfYnJlYWR0aGZpcnN0KCk7CiAjaWZkZWYgQ09ORklHX1BDSV9CSU9TCiAJaWYgKChwY2lfcHJvYmUgJiBQQ0lfQklPU19TT1JUKSAmJiAhKHBjaV9wcm9iZSAmIFBDSV9OT19TT1JUKSkKIAkJcGNpYmlvc19zb3J0KCk7CkBAIC0yMDMsNiArMjUyLDEyIEBACiAJaWYgKCFzdHJjbXAoc3RyLCAib2ZmIikpIHsKIAkJcGNpX3Byb2JlID0gMDsKIAkJcmV0dXJuIE5VTEw7CisJfSBlbHNlIGlmICghc3RyY21wKHN0ciwgImJmc29ydCIpKSB7CisJCXBjaV9iZl9zb3J0ID0gcGNpX2ZvcmNlX2JmOworCQlyZXR1cm4gTlVMTDsKKwl9IGVsc2UgaWYgKCFzdHJjbXAoc3RyLCAibm9iZnNvcnQiKSkgeworCQlwY2lfYmZfc29ydCA9IHBjaV9mb3JjZV9ub2JmOworCQlyZXR1cm4gTlVMTDsKIAl9CiAjaWZkZWYgQ09ORklHX1BDSV9CSU9TCiAJZWxzZSBpZiAoIXN0cmNtcChzdHIsICJiaW9zIikpIHsKQEAgLTI4OCw3ICszNDMsNiBAQAogCiB2b2lkIHBjaWJpb3NfZGlzYWJsZV9kZXZpY2UgKHN0cnVjdCBwY2lfZGV2ICpkZXYpCiB7Ci0JcGNpYmlvc19kaXNhYmxlX3Jlc291cmNlcyhkZXYpOwogCWlmIChwY2liaW9zX2Rpc2FibGVfaXJxKQogCQlwY2liaW9zX2Rpc2FibGVfaXJxKGRldik7CiB9CmRpZmYgLS1naXQgYS9hcmNoL2kzODYvcGNpL2ZpeHVwLmMgYi9hcmNoL2kzODYvcGNpL2ZpeHVwLmMKaW5kZXggYjYwZDdlOC4uYzE5NDlmZiAxMDA2NDQKLS0tIGEvYXJjaC9pMzg2L3BjaS9maXh1cC5jCisrKyBiL2FyY2gvaTM4Ni9wY2kvZml4dXAuYwpAQCAtMzQ4LDggKzM0OCw4IEBACiAgKiBGcm9tIGluZm9ybWF0aW9uIHByb3ZpZGVkIGJ5ICJKb24gU21pcmwiIDxqb25zbWlybEBnbWFpbC5jb20+CiAgKgogICogVGhlIHN0YW5kYXJkIGJvb3QgUk9NIHNlcXVlbmNlIGZvciBhbiB4ODYgbWFjaGluZSB1c2VzIHRoZSBCSU9TCi0gKiB0byBzZWxlY3QgYW4gaW5pdGlhbCB2aWRlbyBjYXJkIGZvciBib290IGRpc3BsYXkuIFRoaXMgYm9vdCB2aWRlbyAKLSAqIGNhcmQgd2lsbCBoYXZlIGl0J3MgQklPUyBjb3BpZWQgdG8gQzAwMDAgaW4gc3lzdGVtIFJBTS4gCisgKiB0byBzZWxlY3QgYW4gaW5pdGlhbCB2aWRlbyBjYXJkIGZvciBib290IGRpc3BsYXkuIFRoaXMgYm9vdCB2aWRlbworICogY2FyZCB3aWxsIGhhdmUgaXQncyBCSU9TIGNvcGllZCB0byBDMDAwMCBpbiBzeXN0ZW0gUkFNLgogICogSU9SRVNPVVJDRV9ST01fU0hBRE9XIGlzIHVzZWQgdG8gYXNzb2NpYXRlIHRoZSBib290IHZpZGVvCiAgKiBjYXJkIHdpdGggdGhpcyBjb3B5LiBPbiBsYXB0b3BzIHRoaXMgY29weSBoYXMgdG8gYmUgdXNlZCBzaW5jZQogICogdGhlIG1haW4gUk9NIG1heSBiZSBjb21wcmVzc2VkIG9yIGNvbWJpbmVkIHdpdGggYW5vdGhlciBpbWFnZS4KQEAgLTM3MSw3ICszNzEsMTcgQEAKIAlidXMgPSBwZGV2LT5idXM7CiAJd2hpbGUgKGJ1cykgewogCQlicmlkZ2UgPSBidXMtPnNlbGY7Ci0JCWlmIChicmlkZ2UpIHsKKworCQkvKgorCQkgKiBGcm9tIGluZm9ybWF0aW9uIHByb3ZpZGVkIGJ5CisJCSAqICJEYXZpZCBNaWxsZXIiIDxkYXZlbUBkYXZlbWxvZnQubmV0PgorCQkgKiBUaGUgYnJpZGdlIGNvbnRyb2wgcmVnaXN0ZXIgaXMgdmFsaWQgZm9yIFBDSSBoZWFkZXIKKwkJICogdHlwZSBCUklER0UsIG9yIENBUkRCVVMuIEhvc3QgdG8gUENJIGNvbnRyb2xsZXJzIHVzZQorCQkgKiBQQ0kgaGVhZGVyIHR5cGUgTk9STUFMLgorCQkgKi8KKwkJaWYgKGJyaWRnZQorCQkgICAgJiYoKGJyaWRnZS0+aGRyX3R5cGUgPT0gUENJX0hFQURFUl9UWVBFX0JSSURHRSkKKwkJICAgICAgIHx8KGJyaWRnZS0+aGRyX3R5cGUgPT0gUENJX0hFQURFUl9UWVBFX0NBUkRCVVMpKSkgewogCQkJcGNpX3JlYWRfY29uZmlnX3dvcmQoYnJpZGdlLCBQQ0lfQlJJREdFX0NPTlRST0wsCiAJCQkJCQkmY29uZmlnKTsKIAkJCWlmICghKGNvbmZpZyAmIFBDSV9CUklER0VfQ1RMX1ZHQSkpCmRpZmYgLS1naXQgYS9hcmNoL2kzODYvcGNpL2kzODYuYyBiL2FyY2gvaTM4Ni9wY2kvaTM4Ni5jCmluZGV4IDEwMTU0YTIuLjk4NTgwMjkgMTAwNjQ0Ci0tLSBhL2FyY2gvaTM4Ni9wY2kvaTM4Ni5jCisrKyBiL2FyY2gvaTM4Ni9wY2kvaTM4Ni5jCkBAIC0yNDIsMTUgKzI0Miw2IEBACiAJcmV0dXJuIDA7CiB9CiAKLXZvaWQgcGNpYmlvc19kaXNhYmxlX3Jlc291cmNlcyhzdHJ1Y3QgcGNpX2RldiAqZGV2KQotewotCXUxNiBjbWQ7Ci0KLQlwY2lfcmVhZF9jb25maWdfd29yZChkZXYsIFBDSV9DT01NQU5ELCAmY21kKTsKLQljbWQgJj0gfihQQ0lfQ09NTUFORF9JTyB8IFBDSV9DT01NQU5EX01FTU9SWSk7Ci0JcGNpX3dyaXRlX2NvbmZpZ193b3JkKGRldiwgUENJX0NPTU1BTkQsIGNtZCk7Ci19Ci0KIC8qCiAgKiAgSWYgd2Ugc2V0IHVwIGEgZGV2aWNlIGZvciBidXMgbWFzdGVyaW5nLCB3ZSBuZWVkIHRvIGNoZWNrIHRoZSBsYXRlbmN5CiAgKiAgdGltZXIgYXMgY2VydGFpbiBjcmFwcHkgQklPU2VzIGZvcmdldCB0byBzZXQgaXQgcHJvcGVybHkuCmRpZmYgLS1naXQgYS9hcmNoL2kzODYvcGNpL2lycS5jIGIvYXJjaC9pMzg2L3BjaS9pcnEuYwppbmRleCBkYmM0YWFlLi42OTE2Mzk5IDEwMDY0NAotLS0gYS9hcmNoL2kzODYvcGNpL2lycS5jCisrKyBiL2FyY2gvaTM4Ni9wY2kvaXJxLmMKQEAgLTI1NSwxMyArMjU1LDEzIEBACiAgKi8KIHN0YXRpYyBpbnQgcGlycV92aWE1ODZfZ2V0KHN0cnVjdCBwY2lfZGV2ICpyb3V0ZXIsIHN0cnVjdCBwY2lfZGV2ICpkZXYsIGludCBwaXJxKQogewotCXN0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgcGlycW1hcFs0XSA9IHsgMywgMiwgNSwgMSB9OworCXN0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgcGlycW1hcFs1XSA9IHsgMywgMiwgNSwgMSwgMSB9OwogCXJldHVybiByZWFkX2NvbmZpZ19ueWJibGUocm91dGVyLCAweDU1LCBwaXJxbWFwW3BpcnEtMV0pOwogfQogCiBzdGF0aWMgaW50IHBpcnFfdmlhNTg2X3NldChzdHJ1Y3QgcGNpX2RldiAqcm91dGVyLCBzdHJ1Y3QgcGNpX2RldiAqZGV2LCBpbnQgcGlycSwgaW50IGlycSkKIHsKLQlzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHBpcnFtYXBbNF0gPSB7IDMsIDIsIDUsIDEgfTsKKwlzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHBpcnFtYXBbNV0gPSB7IDMsIDIsIDUsIDEsIDEgfTsKIAl3cml0ZV9jb25maWdfbnliYmxlKHJvdXRlciwgMHg1NSwgcGlycW1hcFtwaXJxLTFdLCBpcnEpOwogCXJldHVybiAxOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L3BjaS9tbWNvbmZpZy5jIGIvYXJjaC9pMzg2L3BjaS9tbWNvbmZpZy5jCmluZGV4IGQwYzNkYTMuLmM2YjZkOWIgMTAwNjQ0Ci0tLSBhL2FyY2gvaTM4Ni9wY2kvbW1jb25maWcuYworKysgYi9hcmNoL2kzODYvcGNpL21tY29uZmlnLmMKQEAgLTE1NCwzOCArMTU0LDYgQEAKIAkud3JpdGUgPQlwY2lfbW1jZmdfd3JpdGUsCiB9OwogCi0KLXN0YXRpYyBfX2luaXQgdm9pZCBwY2lfbW1jZmdfaW5zZXJ0X3Jlc291cmNlcyh2b2lkKQotewotI2RlZmluZSBQQ0lfTU1DRkdfUkVTT1VSQ0VfTkFNRV9MRU4gMTkKLQlpbnQgaTsKLQlzdHJ1Y3QgcmVzb3VyY2UgKnJlczsKLQljaGFyICpuYW1lczsKLQl1bnNpZ25lZCBudW1fYnVzZXM7Ci0KLQlyZXMgPSBrY2FsbG9jKFBDSV9NTUNGR19SRVNPVVJDRV9OQU1FX0xFTiArIHNpemVvZigqcmVzKSwKLQkJCXBjaV9tbWNmZ19jb25maWdfbnVtLCBHRlBfS0VSTkVMKTsKLQotCWlmICghcmVzKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiUENJOiBVbmFibGUgdG8gYWxsb2NhdGUgTU1DT05GSUcgcmVzb3VyY2VzXG4iKTsKLQkJcmV0dXJuOwotCX0KLQotCW5hbWVzID0gKHZvaWQgKikmcmVzW3BjaV9tbWNmZ19jb25maWdfbnVtXTsKLQlmb3IgKGkgPSAwOyBpIDwgcGNpX21tY2ZnX2NvbmZpZ19udW07IGkrKywgcmVzKyspIHsKLQkJbnVtX2J1c2VzID0gcGNpX21tY2ZnX2NvbmZpZ1tpXS5lbmRfYnVzX251bWJlciAtCi0JCSAgICBwY2lfbW1jZmdfY29uZmlnW2ldLnN0YXJ0X2J1c19udW1iZXIgKyAxOwotCQlyZXMtPm5hbWUgPSBuYW1lczsKLQkJc25wcmludGYobmFtZXMsIFBDSV9NTUNGR19SRVNPVVJDRV9OQU1FX0xFTiwgIlBDSSBNTUNPTkZJRyAldSIsCi0JCQlwY2lfbW1jZmdfY29uZmlnW2ldLnBjaV9zZWdtZW50X2dyb3VwX251bWJlcik7Ci0JCXJlcy0+c3RhcnQgPSBwY2lfbW1jZmdfY29uZmlnW2ldLmJhc2VfYWRkcmVzczsKLQkJcmVzLT5lbmQgPSByZXMtPnN0YXJ0ICsgKG51bV9idXNlcyA8PCAyMCkgLSAxOwotCQlyZXMtPmZsYWdzID0gSU9SRVNPVVJDRV9NRU0gfCBJT1JFU09VUkNFX0JVU1k7Ci0JCWluc2VydF9yZXNvdXJjZSgmaW9tZW1fcmVzb3VyY2UsIHJlcyk7Ci0JCW5hbWVzICs9IFBDSV9NTUNGR19SRVNPVVJDRV9OQU1FX0xFTjsKLQl9Ci19Ci0KIC8qIEs4IHN5c3RlbXMgaGF2ZSBzb21lIGRldmljZXMgKHR5cGljYWxseSBpbiB0aGUgYnVpbHRpbiBub3J0aGJyaWRnZSkKICAgIHRoYXQgYXJlIG9ubHkgYWNjZXNzaWJsZSB1c2luZyB0eXBlMQogICAgTm9ybWFsbHkgdGhpcyBjYW4gYmUgZXhwcmVzc2VkIGluIHRoZSBNQ0ZHIGJ5IG5vdCBsaXN0aW5nIHRoZW0KQEAgLTIyMiw4ICsxOTAsNiBAQAogCX0KIH0KIAotCi0KIHZvaWQgX19pbml0IHBjaV9tbWNmZ19pbml0KGludCB0eXBlKQogewogCWlmICgocGNpX3Byb2JlICYgUENJX1BST0JFX01NQ09ORikgPT0gMCkKQEAgLTI1MSw1ICsyMTcsNCBAQAogCXBjaV9wcm9iZSA9IChwY2lfcHJvYmUgJiB+UENJX1BST0JFX01BU0spIHwgUENJX1BST0JFX01NQ09ORjsKIAogCXVucmVhY2hhYmxlX2RldmljZXMoKTsKLQlwY2lfbW1jZmdfaW5zZXJ0X3Jlc291cmNlcygpOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L3BjaS9wY2kuaCBiL2FyY2gvaTM4Ni9wY2kvcGNpLmgKaW5kZXggMTgxNGY3NC4uYTBhMjUxOCAxMDA2NDQKLS0tIGEvYXJjaC9pMzg2L3BjaS9wY2kuaAorKysgYi9hcmNoL2kzODYvcGNpL3BjaS5oCkBAIC0zMCwxMyArMzAsMTkgQEAKIGV4dGVybiB1bnNpZ25lZCBpbnQgcGNpX3Byb2JlOwogZXh0ZXJuIHVuc2lnbmVkIGxvbmcgcGlycV90YWJsZV9hZGRyOwogCitlbnVtIHBjaV9iZl9zb3J0X3N0YXRlIHsKKwlwY2lfYmZfc29ydF9kZWZhdWx0LAorCXBjaV9mb3JjZV9ub2JmLAorCXBjaV9mb3JjZV9iZiwKKwlwY2lfZG1pX2JmLAorfTsKKwogLyogcGNpLWkzODYuYyAqLwogCiBleHRlcm4gdW5zaWduZWQgaW50IHBjaWJpb3NfbWF4X2xhdGVuY3k7CiAKIHZvaWQgcGNpYmlvc19yZXNvdXJjZV9zdXJ2ZXkodm9pZCk7CiBpbnQgcGNpYmlvc19lbmFibGVfcmVzb3VyY2VzKHN0cnVjdCBwY2lfZGV2ICosIGludCk7Ci12b2lkIHBjaWJpb3NfZGlzYWJsZV9yZXNvdXJjZXMoc3RydWN0IHBjaV9kZXYgKik7CiAKIC8qIHBjaS1wYy5jICovCiAKZGlmZiAtLWdpdCBhL2FyY2gvaWE2NC9LY29uZmlnIGIvYXJjaC9pYTY0L0tjb25maWcKaW5kZXggNzBmN2ViOS4uNjgzYjEyYyAxMDA2NDQKLS0tIGEvYXJjaC9pYTY0L0tjb25maWcKKysrIGIvYXJjaC9pYTY0L0tjb25maWcKQEAgLTM0MSw2ICszNDEsNyBAQAogCWJvb2wgIk5VTUEgc3VwcG9ydCIKIAlkZXBlbmRzIG9uICFJQTY0X0hQX1NJTSAmJiAhRkxBVE1FTQogCWRlZmF1bHQgeSBpZiBJQTY0X1NHSV9TTjIKKwlzZWxlY3QgQUNQSV9OVU1BIGlmIEFDUEkKIAloZWxwCiAJICBTYXkgWSB0byBjb21waWxlIHRoZSBrZXJuZWwgdG8gc3VwcG9ydCBOVU1BIChOb24tVW5pZm9ybSBNZW1vcnkKIAkgIEFjY2VzcykuICBUaGlzIG9wdGlvbiBpcyBmb3IgY29uZmlndXJpbmcgaGlnaC1lbmQgbXVsdGlwcm9jZXNzb3IKQEAgLTQ4Myw2ICs0ODQsMTUgQEAKIAogc291cmNlICJkcml2ZXJzL0tjb25maWciCiAKK2NvbmZpZyBNU1BFQworCXRyaXN0YXRlICJNZW1vcnkgc3BlY2lhbCBvcGVyYXRpb25zIGRyaXZlciIKKwlkZXBlbmRzIG9uIElBNjQKKwlzZWxlY3QgSUE2NF9VTkNBQ0hFRF9BTExPQ0FUT1IKKwloZWxwCisJICBJZiB5b3UgaGF2ZSBhbiBpYTY0IGFuZCB5b3Ugd2FudCB0byBlbmFibGUgbWVtb3J5IHNwZWNpYWwKKwkgIG9wZXJhdGlvbnMgc3VwcG9ydCAoZm9ybWVybHkga25vd24gYXMgZmV0Y2hvcCksIHNheSBZIGhlcmUsCisJICBvdGhlcndpc2Ugc2F5IE4uCisKIHNvdXJjZSAiZnMvS2NvbmZpZyIKIAogc291cmNlICJsaWIvS2NvbmZpZyIKZGlmZiAtLWdpdCBhL2FyY2gvaWE2NC9jb25maWdzL3NuMl9kZWZjb25maWcgYi9hcmNoL2lhNjQvY29uZmlncy9zbjJfZGVmY29uZmlnCmluZGV4IDBmMTRhODIuLjY0ZTk1MWQgMTAwNjQ0Ci0tLSBhL2FyY2gvaWE2NC9jb25maWdzL3NuMl9kZWZjb25maWcKKysrIGIvYXJjaC9pYTY0L2NvbmZpZ3Mvc24yX2RlZmNvbmZpZwpAQCAtMSw4ICsxLDkgQEAKICMKICMgQXV0b21hdGljYWxseSBnZW5lcmF0ZWQgbWFrZSBjb25maWc6IGRvbid0IGVkaXQKLSMgTGludXgga2VybmVsIHZlcnNpb246IDIuNi4xNy1yYzMKLSMgVGh1IEFwciAyNyAxMTo0ODoyMyAyMDA2CisjIExpbnV4IGtlcm5lbCB2ZXJzaW9uOiAyLjYuMTktcmMxCisjIE1vbiBPY3QgIDkgMTA6NTM6NTkgMjAwNgogIworQ09ORklHX0RFRkNPTkZJR19MSVNUPSIvbGliL21vZHVsZXMvJFVOQU1FX1JFTEVBU0UvLmNvbmZpZyIKIAogIwogIyBDb2RlIG1hdHVyaXR5IGxldmVsIG9wdGlvbnMKQEAgLTE4LDE2ICsxOSwyMiBAQAogIyBDT05GSUdfTE9DQUxWRVJTSU9OX0FVVE8gaXMgbm90IHNldAogQ09ORklHX1NXQVA9eQogQ09ORklHX1NZU1ZJUEM9eQorIyBDT05GSUdfSVBDX05TIGlzIG5vdCBzZXQKIENPTkZJR19QT1NJWF9NUVVFVUU9eQogIyBDT05GSUdfQlNEX1BST0NFU1NfQUNDVCBpcyBub3Qgc2V0Ci1DT05GSUdfU1lTQ1RMPXkKK0NPTkZJR19UQVNLU1RBVFM9eQorIyBDT05GSUdfVEFTS19ERUxBWV9BQ0NUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VUU19OUyBpcyBub3Qgc2V0CiAjIENPTkZJR19BVURJVCBpcyBub3Qgc2V0CiAjIENPTkZJR19JS0NPTkZJRyBpcyBub3Qgc2V0CiBDT05GSUdfQ1BVU0VUUz15CiBDT05GSUdfUkVMQVk9eQogQ09ORklHX0lOSVRSQU1GU19TT1VSQ0U9IiIKIENPTkZJR19DQ19PUFRJTUlaRV9GT1JfU0laRT15CitDT05GSUdfVEFTS19YQUNDVD15CitDT05GSUdfU1lTQ1RMPXkKICMgQ09ORklHX0VNQkVEREVEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NZU0NUTF9TWVNDQUxMIGlzIG5vdCBzZXQKIENPTkZJR19LQUxMU1lNUz15CiBDT05GSUdfS0FMTFNZTVNfQUxMPXkKICMgQ09ORklHX0tBTExTWU1TX0VYVFJBX1BBU1MgaXMgbm90IHNldApAQCAtNDAsNiArNDcsOCBAQAogQ09ORklHX0VQT0xMPXkKIENPTkZJR19TSE1FTT15CiBDT05GSUdfU0xBQj15CitDT05GSUdfVk1fRVZFTlRfQ09VTlRFUlM9eQorQ09ORklHX1JUX01VVEVYRVM9eQogIyBDT05GSUdfVElOWV9TSE1FTSBpcyBub3Qgc2V0CiBDT05GSUdfQkFTRV9TTUFMTD0wCiAjIENPTkZJR19TTE9CIGlzIG5vdCBzZXQKQEAgLTU4LDYgKzY3LDcgQEAKICMKICMgQmxvY2sgbGF5ZXIKICMKK0NPTkZJR19CTE9DSz15CiAjIENPTkZJR19CTEtfREVWX0lPX1RSQUNFIGlzIG5vdCBzZXQKIAogIwpAQCAtODksNyArOTksNyBAQAogQ09ORklHX0dFTkVSSUNfSU9NQVA9eQogQ09ORklHX1NDSEVEX05PX05PX09NSVRfRlJBTUVfUE9JTlRFUj15CiBDT05GSUdfSUE2NF9VTkNBQ0hFRF9BTExPQ0FUT1I9eQotQ09ORklHX0RNQV9JU19ETUEzMj15CitDT05GSUdfQVVESVRfQVJDSD15CiAjIENPTkZJR19JQTY0X0dFTkVSSUMgaXMgbm90IHNldAogIyBDT05GSUdfSUE2NF9ESUcgaXMgbm90IHNldAogIyBDT05GSUdfSUE2NF9IUF9aWDEgaXMgbm90IHNldApAQCAtMTE2LDYgKzEyNiw3IEBACiBDT05GSUdfU01QPXkKIENPTkZJR19OUl9DUFVTPTEwMjQKICMgQ09ORklHX0hPVFBMVUdfQ1BVIGlzIG5vdCBzZXQKK0NPTkZJR19BUkNIX0VOQUJMRV9NRU1PUllfSE9UUExVRz15CiBDT05GSUdfU0NIRURfU01UPXkKIENPTkZJR19QUkVFTVBUPXkKIENPTkZJR19TRUxFQ1RfTUVNT1JZX01PREVMPXkKQEAgLTEyOCw2ICsxMzksNyBAQAogIyBDT05GSUdfU1BBUlNFTUVNX1NUQVRJQyBpcyBub3Qgc2V0CiBDT05GSUdfU1BMSVRfUFRMT0NLX0NQVVM9NAogQ09ORklHX01JR1JBVElPTj15CitDT05GSUdfUkVTT1VSQ0VTXzY0QklUPXkKIENPTkZJR19BUkNIX1NFTEVDVF9NRU1PUllfTU9ERUw9eQogQ09ORklHX0FSQ0hfRElTQ09OVElHTUVNX0VOQUJMRT15CiBDT05GSUdfQVJDSF9GTEFUTUVNX0VOQUJMRT15CkBAIC0xMzUsMTUgKzE0NywyNCBAQAogQ09ORklHX0FSQ0hfRElTQ09OVElHTUVNX0RFRkFVTFQ9eQogQ09ORklHX05VTUE9eQogQ09ORklHX05PREVTX1NISUZUPTEwCitDT05GSUdfQVJDSF9QT1BVTEFURVNfTk9ERV9NQVA9eQogQ09ORklHX1ZJUlRVQUxfTUVNX01BUD15CiBDT05GSUdfSE9MRVNfSU5fWk9ORT15CiBDT05GSUdfSEFWRV9BUkNIX0VBUkxZX1BGTl9UT19OSUQ9eQorQ09ORklHX0hBVkVfQVJDSF9OT0RFREFUQV9FWFRFTlNJT049eQogQ09ORklHX0lBMzJfU1VQUE9SVD15CiBDT05GSUdfQ09NUEFUPXkKIENPTkZJR19JQTY0X01DQV9SRUNPVkVSWT15CiBDT05GSUdfUEVSRk1PTj15CiBDT05GSUdfSUE2NF9QQUxJTkZPPXkKIENPTkZJR19TR0lfU049eQorIyBDT05GSUdfSUE2NF9FU0kgaXMgbm90IHNldAorCisjCisjIFNOIERldmljZXMKKyMKK0NPTkZJR19TR0lfSU9DND15CitDT05GSUdfU0dJX0lPQzM9eQogCiAjCiAjIEZpcm13YXJlIERyaXZlcnMKQEAgLTE1OSw2ICsxODAsNyBAQAogQ09ORklHX1BNPXkKICMgQ09ORklHX1BNX0xFR0FDWSBpcyBub3Qgc2V0CiAjIENPTkZJR19QTV9ERUJVRyBpcyBub3Qgc2V0CisjIENPTkZJR19QTV9TWVNGU19ERVBSRUNBVEVEIGlzIG5vdCBzZXQKIAogIwogIyBBQ1BJIChBZHZhbmNlZCBDb25maWd1cmF0aW9uIGFuZCBQb3dlciBJbnRlcmZhY2UpIFN1cHBvcnQKQEAgLTE2Niw2ICsxODgsNyBAQAogQ09ORklHX0FDUEk9eQogIyBDT05GSUdfQUNQSV9CVVRUT04gaXMgbm90IHNldAogIyBDT05GSUdfQUNQSV9GQU4gaXMgbm90IHNldAorIyBDT05GSUdfQUNQSV9ET0NLIGlzIG5vdCBzZXQKICMgQ09ORklHX0FDUElfUFJPQ0VTU09SIGlzIG5vdCBzZXQKIENPTkZJR19BQ1BJX05VTUE9eQogQ09ORklHX0FDUElfQkxBQ0tMSVNUX1lFQVI9MApAQCAtMTg1LDcgKzIwOCwxMiBAQAogIwogQ09ORklHX1BDST15CiBDT05GSUdfUENJX0RPTUFJTlM9eQorQ09ORklHX1BDSUVQT1JUQlVTPXkKK0NPTkZJR19IT1RQTFVHX1BDSV9QQ0lFPXkKKyMgQ09ORklHX0hPVFBMVUdfUENJX1BDSUVfUE9MTF9FVkVOVF9NT0RFIGlzIG5vdCBzZXQKK0NPTkZJR19QQ0lFQUVSPXkKICMgQ09ORklHX1BDSV9NU0kgaXMgbm90IHNldAorIyBDT05GSUdfUENJX01VTFRJVEhSRUFEX1BST0JFIGlzIG5vdCBzZXQKICMgQ09ORklHX1BDSV9ERUJVRyBpcyBub3Qgc2V0CiAKICMKQEAgLTIxNSw2ICsyNDMsOSBAQAogQ09ORklHX1BBQ0tFVD15CiBDT05GSUdfUEFDS0VUX01NQVA9eQogQ09ORklHX1VOSVg9eQorQ09ORklHX1hGUk09eQorIyBDT05GSUdfWEZSTV9VU0VSIGlzIG5vdCBzZXQKKyMgQ09ORklHX1hGUk1fU1VCX1BPTElDWSBpcyBub3Qgc2V0CiAjIENPTkZJR19ORVRfS0VZIGlzIG5vdCBzZXQKIENPTkZJR19JTkVUPXkKIENPTkZJR19JUF9NVUxUSUNBU1Q9eQpAQCAtMjMxLDE5ICsyNjIsMzEgQEAKICMgQ09ORklHX0lORVRfSVBDT01QIGlzIG5vdCBzZXQKICMgQ09ORklHX0lORVRfWEZSTV9UVU5ORUwgaXMgbm90IHNldAogIyBDT05GSUdfSU5FVF9UVU5ORUwgaXMgbm90IHNldAorQ09ORklHX0lORVRfWEZSTV9NT0RFX1RSQU5TUE9SVD15CitDT05GSUdfSU5FVF9YRlJNX01PREVfVFVOTkVMPXkKK0NPTkZJR19JTkVUX1hGUk1fTU9ERV9CRUVUPXkKIENPTkZJR19JTkVUX0RJQUc9bQogQ09ORklHX0lORVRfVENQX0RJQUc9bQogIyBDT05GSUdfVENQX0NPTkdfQURWQU5DRUQgaXMgbm90IHNldAotQ09ORklHX1RDUF9DT05HX0JJQz15CitDT05GSUdfVENQX0NPTkdfQ1VCSUM9eQorQ09ORklHX0RFRkFVTFRfVENQX0NPTkc9ImN1YmljIgogQ09ORklHX0lQVjY9bQogIyBDT05GSUdfSVBWNl9QUklWQUNZIGlzIG5vdCBzZXQKICMgQ09ORklHX0lQVjZfUk9VVEVSX1BSRUYgaXMgbm90IHNldAogIyBDT05GSUdfSU5FVDZfQUggaXMgbm90IHNldAogIyBDT05GSUdfSU5FVDZfRVNQIGlzIG5vdCBzZXQKICMgQ09ORklHX0lORVQ2X0lQQ09NUCBpcyBub3Qgc2V0CisjIENPTkZJR19JUFY2X01JUDYgaXMgbm90IHNldAogIyBDT05GSUdfSU5FVDZfWEZSTV9UVU5ORUwgaXMgbm90IHNldAogIyBDT05GSUdfSU5FVDZfVFVOTkVMIGlzIG5vdCBzZXQKK0NPTkZJR19JTkVUNl9YRlJNX01PREVfVFJBTlNQT1JUPW0KK0NPTkZJR19JTkVUNl9YRlJNX01PREVfVFVOTkVMPW0KK0NPTkZJR19JTkVUNl9YRlJNX01PREVfQkVFVD1tCisjIENPTkZJR19JTkVUNl9YRlJNX01PREVfUk9VVEVPUFRJTUlaQVRJT04gaXMgbm90IHNldAogIyBDT05GSUdfSVBWNl9UVU5ORUwgaXMgbm90IHNldAorIyBDT05GSUdfSVBWNl9TVUJUUkVFUyBpcyBub3Qgc2V0CisjIENPTkZJR19JUFY2X01VTFRJUExFX1RBQkxFUyBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRXT1JLX1NFQ01BUksgaXMgbm90IHNldAogIyBDT05GSUdfTkVURklMVEVSIGlzIG5vdCBzZXQKIAogIwpAQCAtMjY5LDcgKzMxMiw2IEBACiAjIENPTkZJR19BVEFMSyBpcyBub3Qgc2V0CiAjIENPTkZJR19YMjUgaXMgbm90IHNldAogIyBDT05GSUdfTEFQQiBpcyBub3Qgc2V0Ci0jIENPTkZJR19ORVRfRElWRVJUIGlzIG5vdCBzZXQKICMgQ09ORklHX0VDT05FVCBpcyBub3Qgc2V0CiAjIENPTkZJR19XQU5fUk9VVEVSIGlzIG5vdCBzZXQKIApAQCAtMjk4LDYgKzM0MCw3IEBACiBDT05GSUdfUFJFVkVOVF9GSVJNV0FSRV9CVUlMRD15CiBDT05GSUdfRldfTE9BREVSPXkKICMgQ09ORklHX0RFQlVHX0RSSVZFUiBpcyBub3Qgc2V0CisjIENPTkZJR19TWVNfSFlQRVJWSVNPUiBpcyBub3Qgc2V0CiAKICMKICMgQ29ubmVjdG9yIC0gdW5pZmllZCB1c2Vyc3BhY2UgPC0+IGtlcm5lbHNwYWNlIGxpbmtlcgpAQCAtMzM1LDYgKzM3OCw3IEBACiBDT05GSUdfQkxLX0RFVl9SQU09eQogQ09ORklHX0JMS19ERVZfUkFNX0NPVU5UPTE2CiBDT05GSUdfQkxLX0RFVl9SQU1fU0laRT00MDk2CitDT05GSUdfQkxLX0RFVl9SQU1fQkxPQ0tTSVpFPTEwMjQKIENPTkZJR19CTEtfREVWX0lOSVRSRD15CiAjIENPTkZJR19DRFJPTV9QS1RDRFZEIGlzIG5vdCBzZXQKIENPTkZJR19BVEFfT1ZFUl9FVEg9bQpAQCAtMzgxLDYgKzQyNSw3IEBACiAjIENPTkZJR19CTEtfREVWX0NTNTUzMCBpcyBub3Qgc2V0CiAjIENPTkZJR19CTEtfREVWX0hQVDM0WCBpcyBub3Qgc2V0CiAjIENPTkZJR19CTEtfREVWX0hQVDM2NiBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX0pNSUNST04gaXMgbm90IHNldAogIyBDT05GSUdfQkxLX0RFVl9TQzEyMDAgaXMgbm90IHNldAogIyBDT05GSUdfQkxLX0RFVl9QSUlYIGlzIG5vdCBzZXQKICMgQ09ORklHX0JMS19ERVZfSVQ4MjFYIGlzIG5vdCBzZXQKQEAgLTQwNCw2ICs0NDksNyBAQAogIwogIyBDT05GSUdfUkFJRF9BVFRSUyBpcyBub3Qgc2V0CiBDT05GSUdfU0NTST15CitDT05GSUdfU0NTSV9ORVRMSU5LPXkKIENPTkZJR19TQ1NJX1BST0NfRlM9eQogCiAjCkBAIC00MjUsMTIgKzQ3MSwxNCBAQAogIyBDT05GSUdfU0NTSV9MT0dHSU5HIGlzIG5vdCBzZXQKIAogIwotIyBTQ1NJIFRyYW5zcG9ydCBBdHRyaWJ1dGVzCisjIFNDU0kgVHJhbnNwb3J0cwogIwogQ09ORklHX1NDU0lfU1BJX0FUVFJTPXkKIENPTkZJR19TQ1NJX0ZDX0FUVFJTPXkKIENPTkZJR19TQ1NJX0lTQ1NJX0FUVFJTPW0KIENPTkZJR19TQ1NJX1NBU19BVFRSUz15CitDT05GSUdfU0NTSV9TQVNfTElCU0FTPXkKKyMgQ09ORklHX1NDU0lfU0FTX0xJQlNBU19ERUJVRyBpcyBub3Qgc2V0CiAKICMKICMgU0NTSSBsb3ctbGV2ZWwgZHJpdmVycwpAQCAtNDQzLDQ2ICs0OTEsODIgQEAKICMgQ09ORklHX1NDU0lfQUlDN1hYWCBpcyBub3Qgc2V0CiAjIENPTkZJR19TQ1NJX0FJQzdYWFhfT0xEIGlzIG5vdCBzZXQKICMgQ09ORklHX1NDU0lfQUlDNzlYWCBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0FJQzk0WFggaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9BUkNNU1IgaXMgbm90IHNldAogIyBDT05GSUdfTUVHQVJBSURfTkVXR0VOIGlzIG5vdCBzZXQKICMgQ09ORklHX01FR0FSQUlEX0xFR0FDWSBpcyBub3Qgc2V0CiAjIENPTkZJR19NRUdBUkFJRF9TQVMgaXMgbm90IHNldAotQ09ORklHX1NDU0lfU0FUQT15Ci0jIENPTkZJR19TQ1NJX1NBVEFfQUhDSSBpcyBub3Qgc2V0Ci0jIENPTkZJR19TQ1NJX1NBVEFfU1ZXIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NDU0lfQVRBX1BJSVggaXMgbm90IHNldAotIyBDT05GSUdfU0NTSV9TQVRBX01WIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NDU0lfU0FUQV9OViBpcyBub3Qgc2V0Ci0jIENPTkZJR19TQ1NJX1BEQ19BRE1BIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NDU0lfU0FUQV9RU1RPUiBpcyBub3Qgc2V0Ci0jIENPTkZJR19TQ1NJX1NBVEFfUFJPTUlTRSBpcyBub3Qgc2V0Ci0jIENPTkZJR19TQ1NJX1NBVEFfU1g0IGlzIG5vdCBzZXQKLSMgQ09ORklHX1NDU0lfU0FUQV9TSUwgaXMgbm90IHNldAotIyBDT05GSUdfU0NTSV9TQVRBX1NJTDI0IGlzIG5vdCBzZXQKLSMgQ09ORklHX1NDU0lfU0FUQV9TSVMgaXMgbm90IHNldAotIyBDT05GSUdfU0NTSV9TQVRBX1VMSSBpcyBub3Qgc2V0Ci0jIENPTkZJR19TQ1NJX1NBVEFfVklBIGlzIG5vdCBzZXQKLUNPTkZJR19TQ1NJX1NBVEFfVklURVNTRT15CisjIENPTkZJR19TQ1NJX0hQVElPUCBpcyBub3Qgc2V0CiAjIENPTkZJR19TQ1NJX0RNWDMxOTFEIGlzIG5vdCBzZXQKICMgQ09ORklHX1NDU0lfRlVUVVJFX0RPTUFJTiBpcyBub3Qgc2V0CiAjIENPTkZJR19TQ1NJX0lQUyBpcyBub3Qgc2V0CiAjIENPTkZJR19TQ1NJX0lOSVRJTyBpcyBub3Qgc2V0CiAjIENPTkZJR19TQ1NJX0lOSUExMDAgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9TVEVYIGlzIG5vdCBzZXQKICMgQ09ORklHX1NDU0lfU1lNNTNDOFhYXzIgaXMgbm90IHNldAogIyBDT05GSUdfU0NTSV9JUFIgaXMgbm90IHNldAogQ09ORklHX1NDU0lfUUxPR0lDXzEyODA9eQogQ09ORklHX1NDU0lfUUxBX0ZDPXkKLUNPTkZJR19TQ1NJX1FMQTJYWFhfRU1CRURERURfRklSTVdBUkU9eQotIyBDT05GSUdfU0NTSV9RTEEyMVhYIGlzIG5vdCBzZXQKLUNPTkZJR19TQ1NJX1FMQTIyWFg9eQotQ09ORklHX1NDU0lfUUxBMjMwMD15Ci1DT05GSUdfU0NTSV9RTEEyMzIyPXkKLSMgQ09ORklHX1NDU0lfUUxBMjRYWCBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX1FMQV9JU0NTSSBpcyBub3Qgc2V0CiAjIENPTkZJR19TQ1NJX0xQRkMgaXMgbm90IHNldAogIyBDT05GSUdfU0NTSV9EQzM5NXggaXMgbm90IHNldAogIyBDT05GSUdfU0NTSV9EQzM5MFQgaXMgbm90IHNldAogIyBDT05GSUdfU0NTSV9ERUJVRyBpcyBub3Qgc2V0CiAKICMKKyMgU2VyaWFsIEFUQSAocHJvZCkgYW5kIFBhcmFsbGVsIEFUQSAoZXhwZXJpbWVudGFsKSBkcml2ZXJzCisjCitDT05GSUdfQVRBPXkKKyMgQ09ORklHX1NBVEFfQUhDSSBpcyBub3Qgc2V0CisjIENPTkZJR19TQVRBX1NWVyBpcyBub3Qgc2V0CisjIENPTkZJR19BVEFfUElJWCBpcyBub3Qgc2V0CisjIENPTkZJR19TQVRBX01WIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NBVEFfTlYgaXMgbm90IHNldAorIyBDT05GSUdfUERDX0FETUEgaXMgbm90IHNldAorIyBDT05GSUdfU0FUQV9RU1RPUiBpcyBub3Qgc2V0CisjIENPTkZJR19TQVRBX1BST01JU0UgaXMgbm90IHNldAorIyBDT05GSUdfU0FUQV9TWDQgaXMgbm90IHNldAorIyBDT05GSUdfU0FUQV9TSUwgaXMgbm90IHNldAorIyBDT05GSUdfU0FUQV9TSUwyNCBpcyBub3Qgc2V0CisjIENPTkZJR19TQVRBX1NJUyBpcyBub3Qgc2V0CisjIENPTkZJR19TQVRBX1VMSSBpcyBub3Qgc2V0CisjIENPTkZJR19TQVRBX1ZJQSBpcyBub3Qgc2V0CitDT05GSUdfU0FUQV9WSVRFU1NFPXkKKyMgQ09ORklHX1BBVEFfQUxJIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBVEFfQU1EIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBVEFfQVJUT1AgaXMgbm90IHNldAorIyBDT05GSUdfUEFUQV9BVElJWFAgaXMgbm90IHNldAorIyBDT05GSUdfUEFUQV9DTUQ2NFggaXMgbm90IHNldAorIyBDT05GSUdfUEFUQV9DUzU1MjAgaXMgbm90IHNldAorIyBDT05GSUdfUEFUQV9DUzU1MzAgaXMgbm90IHNldAorIyBDT05GSUdfUEFUQV9DWVBSRVNTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBVEFfRUZBUiBpcyBub3Qgc2V0CisjIENPTkZJR19BVEFfR0VORVJJQyBpcyBub3Qgc2V0CisjIENPTkZJR19QQVRBX0hQVDM2NiBpcyBub3Qgc2V0CisjIENPTkZJR19QQVRBX0hQVDM3WCBpcyBub3Qgc2V0CisjIENPTkZJR19QQVRBX0hQVDNYMk4gaXMgbm90IHNldAorIyBDT05GSUdfUEFUQV9IUFQzWDMgaXMgbm90IHNldAorIyBDT05GSUdfUEFUQV9JVDgyMVggaXMgbm90IHNldAorIyBDT05GSUdfUEFUQV9KTUlDUk9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBVEFfVFJJRkxFWCBpcyBub3Qgc2V0CisjIENPTkZJR19QQVRBX01QSUlYIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBVEFfT0xEUElJWCBpcyBub3Qgc2V0CisjIENPTkZJR19QQVRBX05FVENFTEwgaXMgbm90IHNldAorIyBDT05GSUdfUEFUQV9OUzg3NDEwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBVEFfT1BUSSBpcyBub3Qgc2V0CisjIENPTkZJR19QQVRBX09QVElETUEgaXMgbm90IHNldAorIyBDT05GSUdfUEFUQV9QRENfT0xEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBVEFfUkFESVNZUyBpcyBub3Qgc2V0CisjIENPTkZJR19QQVRBX1JaMTAwMCBpcyBub3Qgc2V0CisjIENPTkZJR19QQVRBX1NDMTIwMCBpcyBub3Qgc2V0CisjIENPTkZJR19QQVRBX1NFUlZFUldPUktTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBVEFfUERDMjAyN1ggaXMgbm90IHNldAorIyBDT05GSUdfUEFUQV9TSUw2ODAgaXMgbm90IHNldAorIyBDT05GSUdfUEFUQV9TSVMgaXMgbm90IHNldAorIyBDT05GSUdfUEFUQV9WSUEgaXMgbm90IHNldAorIyBDT05GSUdfUEFUQV9XSU5CT05EIGlzIG5vdCBzZXQKKworIwogIyBNdWx0aS1kZXZpY2Ugc3VwcG9ydCAoUkFJRCBhbmQgTFZNKQogIwogQ09ORklHX01EPXkKQEAgLTQ5MSwxMiArNTc1LDEyIEBACiBDT05GSUdfTURfUkFJRDA9eQogQ09ORklHX01EX1JBSUQxPXkKICMgQ09ORklHX01EX1JBSUQxMCBpcyBub3Qgc2V0Ci1DT05GSUdfTURfUkFJRDU9eQorQ09ORklHX01EX1JBSUQ0NTY9eQogIyBDT05GSUdfTURfUkFJRDVfUkVTSEFQRSBpcyBub3Qgc2V0Ci0jIENPTkZJR19NRF9SQUlENiBpcyBub3Qgc2V0CiBDT05GSUdfTURfTVVMVElQQVRIPXkKICMgQ09ORklHX01EX0ZBVUxUWSBpcyBub3Qgc2V0CiBDT05GSUdfQkxLX0RFVl9ETT15CisjIENPTkZJR19ETV9ERUJVRyBpcyBub3Qgc2V0CiBDT05GSUdfRE1fQ1JZUFQ9bQogQ09ORklHX0RNX1NOQVBTSE9UPW0KIENPTkZJR19ETV9NSVJST1I9bQpAQCAtNTYzLDYgKzY0Nyw3IEBACiAjIENPTkZJR19TSzk4TElOIGlzIG5vdCBzZXQKIENPTkZJR19USUdPTjM9eQogIyBDT05GSUdfQk5YMiBpcyBub3Qgc2V0CisjIENPTkZJR19RTEEzWFhYIGlzIG5vdCBzZXQKIAogIwogIyBFdGhlcm5ldCAoMTAwMDAgTWJpdCkKQEAgLTU3MSw2ICs2NTYsNyBAQAogIyBDT05GSUdfSVhHQiBpcyBub3Qgc2V0CiBDT05GSUdfUzJJTz1tCiAjIENPTkZJR19TMklPX05BUEkgaXMgbm90IHNldAorIyBDT05GSUdfTVlSSTEwR0UgaXMgbm90IHNldAogCiAjCiAjIFRva2VuIFJpbmcgZGV2aWNlcwpAQCAtNjEyLDYgKzY5OCw3IEBACiAjIElucHV0IGRldmljZSBzdXBwb3J0CiAjCiBDT05GSUdfSU5QVVQ9eQorIyBDT05GSUdfSU5QVVRfRkZfTUVNTEVTUyBpcyBub3Qgc2V0CiAKICMKICMgVXNlcmxhbmQgaW50ZXJmYWNlcwpAQCAtNjQ2LDYgKzczMyw3IEBACiBDT05GSUdfVlQ9eQogQ09ORklHX1ZUX0NPTlNPTEU9eQogQ09ORklHX0hXX0NPTlNPTEU9eQorIyBDT05GSUdfVlRfSFdfQ09OU09MRV9CSU5ESU5HIGlzIG5vdCBzZXQKIENPTkZJR19TRVJJQUxfTk9OU1RBTkRBUkQ9eQogIyBDT05GSUdfQ09NUFVUT05FIGlzIG5vdCBzZXQKICMgQ09ORklHX1JPQ0tFVFBPUlQgaXMgbm90IHNldApAQCAtNjU5LDEwICs3NDcsMTIgQEAKICMgQ09ORklHX05fSERMQyBpcyBub3Qgc2V0CiAjIENPTkZJR19TUEVDSUFMSVggaXMgbm90IHNldAogIyBDT05GSUdfU1ggaXMgbm90IHNldAorIyBDT05GSUdfUklPIGlzIG5vdCBzZXQKICMgQ09ORklHX1NUQUxEUlYgaXMgbm90IHNldAogQ09ORklHX1NHSV9TTlNDPXkKIENPTkZJR19TR0lfVElPQ1g9eQogQ09ORklHX1NHSV9NQkNTPW0KK0NPTkZJR19NU1BFQz15CiAKICMKICMgU2VyaWFsIGRyaXZlcnMKQEAgLTcwMSw2ICs3OTEsNyBAQAogIyBGdGFwZSwgdGhlIGZsb3BweSB0YXBlIGRldmljZSBkcml2ZXIKICMKIENPTkZJR19BR1A9eQorIyBDT05GSUdfQUdQX1NJUyBpcyBub3Qgc2V0CiAjIENPTkZJR19BR1BfVklBIGlzIG5vdCBzZXQKIENPTkZJR19BR1BfU0dJX1RJT0NBPXkKICMgQ09ORklHX0RSTSBpcyBub3Qgc2V0CkBAIC03MzAsNyArODIxLDYgQEAKICMKICMgRGFsbGFzJ3MgMS13aXJlIGJ1cwogIwotIyBDT05GSUdfVzEgaXMgbm90IHNldAogCiAjCiAjIEhhcmR3YXJlIE1vbml0b3Jpbmcgc3VwcG9ydApAQCAtNzQxLDYgKzgzMSw3IEBACiAjCiAjIE1pc2MgZGV2aWNlcwogIworIyBDT05GSUdfVElGTV9DT1JFIGlzIG5vdCBzZXQKIAogIwogIyBNdWx0aW1lZGlhIGRldmljZXMKQEAgLTc1Niw2ICs4NDcsNyBAQAogIwogIyBHcmFwaGljcyBzdXBwb3J0CiAjCitDT05GSUdfRklSTVdBUkVfRURJRD15CiAjIENPTkZJR19GQiBpcyBub3Qgc2V0CiAKICMKQEAgLTc2NCw2ICs4NTYsNyBAQAogQ09ORklHX1ZHQV9DT05TT0xFPXkKICMgQ09ORklHX1ZHQUNPTl9TT0ZUX1NDUk9MTEJBQ0sgaXMgbm90IHNldAogQ09ORklHX0RVTU1ZX0NPTlNPTEU9eQorIyBDT05GSUdfQkFDS0xJR0hUX0xDRF9TVVBQT1JUIGlzIG5vdCBzZXQKIAogIwogIyBTb3VuZApAQCAtNzk0LDYgKzg4Nyw3IEBACiBDT05GSUdfVVNCX0VIQ0lfSENEPW0KICMgQ09ORklHX1VTQl9FSENJX1NQTElUX0lTTyBpcyBub3Qgc2V0CiAjIENPTkZJR19VU0JfRUhDSV9ST09UX0hVQl9UVCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfRUhDSV9UVF9ORVdTQ0hFRCBpcyBub3Qgc2V0CiAjIENPTkZJR19VU0JfSVNQMTE2WF9IQ0QgaXMgbm90IHNldAogQ09ORklHX1VTQl9PSENJX0hDRD1tCiAjIENPTkZJR19VU0JfT0hDSV9CSUdfRU5ESUFOIGlzIG5vdCBzZXQKQEAgLTg0Myw2ICs5MzcsNyBAQAogIyBDT05GSUdfVVNCX0FUSV9SRU1PVEUyIGlzIG5vdCBzZXQKICMgQ09ORklHX1VTQl9LRVlTUEFOX1JFTU9URSBpcyBub3Qgc2V0CiAjIENPTkZJR19VU0JfQVBQTEVUT1VDSCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfVFJBTkNFVklCUkFUT1IgaXMgbm90IHNldAogCiAjCiAjIFVTQiBJbWFnaW5nIGRldmljZXMKQEAgLTg3NCwxNSArOTY5LDE4IEBACiAjCiAjIENPTkZJR19VU0JfRU1JNjIgaXMgbm90IHNldAogIyBDT05GSUdfVVNCX0VNSTI2IGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9BRFVUVVggaXMgbm90IHNldAogIyBDT05GSUdfVVNCX0FVRVJTV0FMRCBpcyBub3Qgc2V0CiAjIENPTkZJR19VU0JfUklPNTAwIGlzIG5vdCBzZXQKICMgQ09ORklHX1VTQl9MRUdPVE9XRVIgaXMgbm90IHNldAogIyBDT05GSUdfVVNCX0xDRCBpcyBub3Qgc2V0CiAjIENPTkZJR19VU0JfTEVEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9DWVBSRVNTX0NZN0M2MyBpcyBub3Qgc2V0CiAjIENPTkZJR19VU0JfQ1lUSEVSTSBpcyBub3Qgc2V0Ci0jIENPTkZJR19VU0JfUEhJREdFVEtJVCBpcyBub3Qgc2V0Ci0jIENPTkZJR19VU0JfUEhJREdFVFNFUlZPIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9QSElER0VUIGlzIG5vdCBzZXQKICMgQ09ORklHX1VTQl9JRE1PVVNFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9GVERJX0VMQU4gaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0FQUExFRElTUExBWSBpcyBub3Qgc2V0CiAjIENPTkZJR19VU0JfU0lTVVNCVkdBIGlzIG5vdCBzZXQKICMgQ09ORklHX1VTQl9MRCBpcyBub3Qgc2V0CiAKQEAgLTkxOSwxOCArMTAxNywxNSBAQAogQ09ORklHX0lORklOSUJBTkQ9bQogIyBDT05GSUdfSU5GSU5JQkFORF9VU0VSX01BRCBpcyBub3Qgc2V0CiBDT05GSUdfSU5GSU5JQkFORF9VU0VSX0FDQ0VTUz1tCitDT05GSUdfSU5GSU5JQkFORF9BRERSX1RSQU5TPXkKIENPTkZJR19JTkZJTklCQU5EX01USENBPW0KIENPTkZJR19JTkZJTklCQU5EX01USENBX0RFQlVHPXkKKyMgQ09ORklHX0lORklOSUJBTkRfQU1TTzExMDAgaXMgbm90IHNldAogQ09ORklHX0lORklOSUJBTkRfSVBPSUI9bQogQ09ORklHX0lORklOSUJBTkRfSVBPSUJfREVCVUc9eQogIyBDT05GSUdfSU5GSU5JQkFORF9JUE9JQl9ERUJVR19EQVRBIGlzIG5vdCBzZXQKIENPTkZJR19JTkZJTklCQU5EX1NSUD1tCi0KLSMKLSMgU04gRGV2aWNlcwotIwotQ09ORklHX1NHSV9JT0M0PXkKLUNPTkZJR19TR0lfSU9DMz15CisjIENPTkZJR19JTkZJTklCQU5EX0lTRVIgaXMgbm90IHNldAogCiAjCiAjIEVEQUMgLSBlcnJvciBkZXRlY3Rpb24gYW5kIHJlcG9ydGluZyAoUkFTKSAoRVhQRVJJTUVOVEFMKQpAQCAtOTQyLDYgKzEwMzcsMTkgQEAKICMgQ09ORklHX1JUQ19DTEFTUyBpcyBub3Qgc2V0CiAKICMKKyMgRE1BIEVuZ2luZSBzdXBwb3J0CisjCisjIENPTkZJR19ETUFfRU5HSU5FIGlzIG5vdCBzZXQKKworIworIyBETUEgQ2xpZW50cworIworCisjCisjIERNQSBEZXZpY2VzCisjCisKKyMKICMgRmlsZSBzeXN0ZW1zCiAjCiBDT05GSUdfRVhUMl9GUz15CkBAIC05NjUsMTUgKzEwNzMsMTYgQEAKICMgQ09ORklHX0pGU19GUyBpcyBub3Qgc2V0CiBDT05GSUdfRlNfUE9TSVhfQUNMPXkKIENPTkZJR19YRlNfRlM9eQotQ09ORklHX1hGU19FWFBPUlQ9eQogQ09ORklHX1hGU19RVU9UQT15CiAjIENPTkZJR19YRlNfU0VDVVJJVFkgaXMgbm90IHNldAogQ09ORklHX1hGU19QT1NJWF9BQ0w9eQogQ09ORklHX1hGU19SVD15CisjIENPTkZJR19HRlMyX0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX09DRlMyX0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX01JTklYX0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX1JPTUZTX0ZTIGlzIG5vdCBzZXQKIENPTkZJR19JTk9USUZZPXkKK0NPTkZJR19JTk9USUZZX1VTRVI9eQogQ09ORklHX1FVT1RBPXkKICMgQ09ORklHX1FGTVRfVjEgaXMgbm90IHNldAogIyBDT05GSUdfUUZNVF9WMiBpcyBub3Qgc2V0CkBAIC0xMDA3LDggKzExMTYsMTAgQEAKICMKIENPTkZJR19QUk9DX0ZTPXkKIENPTkZJR19QUk9DX0tDT1JFPXkKK0NPTkZJR19QUk9DX1NZU0NUTD15CiBDT05GSUdfU1lTRlM9eQogQ09ORklHX1RNUEZTPXkKKyMgQ09ORklHX1RNUEZTX1BPU0lYX0FDTCBpcyBub3Qgc2V0CiBDT05GSUdfSFVHRVRMQkZTPXkKIENPTkZJR19IVUdFVExCX1BBR0U9eQogQ09ORklHX1JBTUZTPXkKQEAgLTEwNDYsNyArMTE1Nyw3IEBACiBDT05GSUdfTkZTRF9UQ1A9eQogQ09ORklHX0xPQ0tEPW0KIENPTkZJR19MT0NLRF9WND15Ci1DT05GSUdfRVhQT1JURlM9eQorQ09ORklHX0VYUE9SVEZTPW0KIENPTkZJR19ORlNfQ09NTU9OPXkKIENPTkZJR19TVU5SUEM9bQogQ09ORklHX1NVTlJQQ19HU1M9bQpAQCAtMTA1Niw3ICsxMTY3LDkgQEAKICMgQ09ORklHX1NNQl9OTFNfREVGQVVMVCBpcyBub3Qgc2V0CiBDT05GSUdfQ0lGUz1tCiAjIENPTkZJR19DSUZTX1NUQVRTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NJRlNfV0VBS19QV19IQVNIIGlzIG5vdCBzZXQKICMgQ09ORklHX0NJRlNfWEFUVFIgaXMgbm90IHNldAorIyBDT05GSUdfQ0lGU19ERUJVRzIgaXMgbm90IHNldAogIyBDT05GSUdfQ0lGU19FWFBFUklNRU5UQUwgaXMgbm90IHNldAogIyBDT05GSUdfTkNQX0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX0NPREFfRlMgaXMgbm90IHNldApAQCAtMTEyOSw2ICsxMjQyLDEwIEBACiBDT05GSUdfTkxTX1VURjg9eQogCiAjCisjIERpc3RyaWJ1dGVkIExvY2sgTWFuYWdlcgorIworCisjCiAjIExpYnJhcnkgcm91dGluZXMKICMKICMgQ09ORklHX0NSQ19DQ0lUVCBpcyBub3Qgc2V0CkBAIC0xMTM4LDkgKzEyNTUsMTEgQEAKIENPTkZJR19aTElCX0lORkxBVEU9bQogQ09ORklHX1pMSUJfREVGTEFURT1tCiBDT05GSUdfR0VORVJJQ19BTExPQ0FUT1I9eQorQ09ORklHX1BMSVNUPXkKIENPTkZJR19HRU5FUklDX0hBUkRJUlFTPXkKIENPTkZJR19HRU5FUklDX0lSUV9QUk9CRT15CiBDT05GSUdfR0VORVJJQ19QRU5ESU5HX0lSUT15CitDT05GSUdfSVJRX1BFUl9DUFU9eQogCiAjCiAjIEluc3RydW1lbnRhdGlvbiBTdXBwb3J0CkBAIC0xMTUyLDIwICsxMjcxLDI2IEBACiAjIEtlcm5lbCBoYWNraW5nCiAjCiAjIENPTkZJR19QUklOVEtfVElNRSBpcyBub3Qgc2V0CitDT05GSUdfRU5BQkxFX01VU1RfQ0hFQ0s9eQogQ09ORklHX01BR0lDX1NZU1JRPXkKKyMgQ09ORklHX1VOVVNFRF9TWU1CT0xTIGlzIG5vdCBzZXQKIENPTkZJR19ERUJVR19LRVJORUw9eQogQ09ORklHX0xPR19CVUZfU0hJRlQ9MjAKIENPTkZJR19ERVRFQ1RfU09GVExPQ0tVUD15CiAjIENPTkZJR19TQ0hFRFNUQVRTIGlzIG5vdCBzZXQKICMgQ09ORklHX0RFQlVHX1NMQUIgaXMgbm90IHNldAotQ09ORklHX0RFQlVHX1BSRUVNUFQ9eQotIyBDT05GSUdfREVCVUdfTVVURVhFUyBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19SVF9NVVRFWEVTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUX01VVEVYX1RFU1RFUiBpcyBub3Qgc2V0CiAjIENPTkZJR19ERUJVR19TUElOTE9DSyBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19NVVRFWEVTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX1JXU0VNUyBpcyBub3Qgc2V0CiAjIENPTkZJR19ERUJVR19TUElOTE9DS19TTEVFUCBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19MT0NLSU5HX0FQSV9TRUxGVEVTVFMgaXMgbm90IHNldAogIyBDT05GSUdfREVCVUdfS09CSkVDVCBpcyBub3Qgc2V0CiBDT05GSUdfREVCVUdfSU5GTz15CiAjIENPTkZJR19ERUJVR19GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19ERUJVR19WTSBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19MSVNUIGlzIG5vdCBzZXQKIENPTkZJR19GT1JDRURfSU5MSU5JTkc9eQogIyBDT05GSUdfUkNVX1RPUlRVUkVfVEVTVCBpcyBub3Qgc2V0CiBDT05GSUdfSUE2NF9HUkFOVUxFXzE2TUI9eQpAQCAtMTE4Niw2ICsxMzExLDEwIEBACiAjIENyeXB0b2dyYXBoaWMgb3B0aW9ucwogIwogQ09ORklHX0NSWVBUTz15CitDT05GSUdfQ1JZUFRPX0FMR0FQST15CitDT05GSUdfQ1JZUFRPX0JMS0NJUEhFUj1tCitDT05GSUdfQ1JZUFRPX0hBU0g9eQorQ09ORklHX0NSWVBUT19NQU5BR0VSPW0KIENPTkZJR19DUllQVE9fSE1BQz15CiAjIENPTkZJR19DUllQVE9fTlVMTCBpcyBub3Qgc2V0CiAjIENPTkZJR19DUllQVE9fTUQ0IGlzIG5vdCBzZXQKQEAgLTExOTUsNiArMTMyNCw4IEBACiAjIENPTkZJR19DUllQVE9fU0hBNTEyIGlzIG5vdCBzZXQKICMgQ09ORklHX0NSWVBUT19XUDUxMiBpcyBub3Qgc2V0CiAjIENPTkZJR19DUllQVE9fVEdSMTkyIGlzIG5vdCBzZXQKK0NPTkZJR19DUllQVE9fRUNCPW0KK0NPTkZJR19DUllQVE9fQ0JDPW0KIENPTkZJR19DUllQVE9fREVTPW0KICMgQ09ORklHX0NSWVBUT19CTE9XRklTSCBpcyBub3Qgc2V0CiAjIENPTkZJR19DUllQVE9fVFdPRklTSCBpcyBub3Qgc2V0CmRpZmYgLS1naXQgYS9hcmNoL2lhNjQvaHAvc2ltL0tjb25maWcgYi9hcmNoL2lhNjQvaHAvc2ltL0tjb25maWcKaW5kZXggMThjY2IxMi4uZjkyMzA2YiAxMDA2NDQKLS0tIGEvYXJjaC9pYTY0L2hwL3NpbS9LY29uZmlnCisrKyBiL2FyY2gvaWE2NC9ocC9zaW0vS2NvbmZpZwpAQCAtMTMsOCArMTMsOCBAQAogCWRlcGVuZHMgb24gSFBfU0lNU0VSSUFMCiAKIGNvbmZpZyBIUF9TSU1TQ1NJCi0JdHJpc3RhdGUgIlNpbXVsYXRlZCBTQ1NJIGRpc2siCi0JZGVwZW5kcyBvbiBTQ1NJCisJYm9vbCAiU2ltdWxhdGVkIFNDU0kgZGlzayIKKwlkZXBlbmRzIG9uIFNDU0k9eQogCiBlbmRtZW51CiAKZGlmZiAtLWdpdCBhL2FyY2gvaWE2NC9ocC9zaW0vaHBzaW1faXJxLmMgYi9hcmNoL2lhNjQvaHAvc2ltL2hwc2ltX2lycS5jCmluZGV4IDgxNDU1NDcuLmMyZjU4ZmYgMTAwNjQ0Ci0tLSBhL2FyY2gvaWE2NC9ocC9zaW0vaHBzaW1faXJxLmMKKysrIGIvYXJjaC9pYTY0L2hwL3NpbS9ocHNpbV9pcnEuYwpAQCAtMjcsNyArMjcsNyBAQAogfQogCiBzdGF0aWMgc3RydWN0IGh3X2ludGVycnVwdF90eXBlIGlycV90eXBlX2hwX3NpbSA9IHsKLQkudHlwZW5hbWUgPQkiaHBzaW0iLAorCS5uYW1lID0JCSJocHNpbSIsCiAJLnN0YXJ0dXAgPQlocHNpbV9pcnFfc3RhcnR1cCwKIAkuc2h1dGRvd24gPQlocHNpbV9pcnFfbm9vcCwKIAkuZW5hYmxlID0JaHBzaW1faXJxX25vb3AsCmRpZmYgLS1naXQgYS9hcmNoL2lhNjQva2VybmVsL2FjcGkuYyBiL2FyY2gvaWE2NC9rZXJuZWwvYWNwaS5jCmluZGV4IDMyYzNhYmVkLi43M2VmNGE4NSAxMDA2NDQKLS0tIGEvYXJjaC9pYTY0L2tlcm5lbC9hY3BpLmMKKysrIGIvYXJjaC9pYTY0L2tlcm5lbC9hY3BpLmMKQEAgLTY0LDkgKzY0LDYgQEAKIHZvaWQgKCpwbV9wb3dlcl9vZmYpICh2b2lkKTsKIEVYUE9SVF9TWU1CT0wocG1fcG93ZXJfb2ZmKTsKIAotdW5zaWduZWQgY2hhciBhY3BpX2tiZF9jb250cm9sbGVyX3ByZXNlbnQgPSAxOwotdW5zaWduZWQgY2hhciBhY3BpX2xlZ2FjeV9kZXZpY2VzOwotCiB1bnNpZ25lZCBpbnQgYWNwaV9jcGVpX292ZXJyaWRlOwogdW5zaWduZWQgaW50IGFjcGlfY3BlaV9waHlzX2NwdWlkOwogCkBAIC02MjgsMTIgKzYyNSw2IEBACiAKIAlmYWR0ID0gKHN0cnVjdCBmYWR0X2Rlc2NyaXB0b3IgKilmYWR0X2hlYWRlcjsKIAotCWlmICghKGZhZHQtPmlhcGNfYm9vdF9hcmNoICYgQkFGXzgwNDJfS0VZQk9BUkRfQ09OVFJPTExFUikpCi0JCWFjcGlfa2JkX2NvbnRyb2xsZXJfcHJlc2VudCA9IDA7Ci0KLQlpZiAoZmFkdC0+aWFwY19ib290X2FyY2ggJiBCQUZfTEVHQUNZX0RFVklDRVMpCi0JCWFjcGlfbGVnYWN5X2RldmljZXMgPSAxOwotCiAJYWNwaV9yZWdpc3Rlcl9nc2koZmFkdC0+c2NpX2ludCwgQUNQSV9MRVZFTF9TRU5TSVRJVkUsIEFDUElfQUNUSVZFX0xPVyk7CiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9hcmNoL2lhNjQva2VybmVsL2lvc2FwaWMuYyBiL2FyY2gvaWE2NC9rZXJuZWwvaW9zYXBpYy5jCmluZGV4IDliZjE1ZmUuLjYwZDY0OTUgMTAwNjQ0Ci0tLSBhL2FyY2gvaWE2NC9rZXJuZWwvaW9zYXBpYy5jCisrKyBiL2FyY2gvaWE2NC9rZXJuZWwvaW9zYXBpYy5jCkBAIC00MjYsNyArNDI2LDcgQEAKICNkZWZpbmUgaW9zYXBpY19hY2tfbGV2ZWxfaXJxCQlub3AKIAogc3RydWN0IGh3X2ludGVycnVwdF90eXBlIGlycV90eXBlX2lvc2FwaWNfbGV2ZWwgPSB7Ci0JLnR5cGVuYW1lID0JIklPLVNBUElDLWxldmVsIiwKKwkubmFtZSA9CQkiSU8tU0FQSUMtbGV2ZWwiLAogCS5zdGFydHVwID0JaW9zYXBpY19zdGFydHVwX2xldmVsX2lycSwKIAkuc2h1dGRvd24gPQlpb3NhcGljX3NodXRkb3duX2xldmVsX2lycSwKIAkuZW5hYmxlID0JaW9zYXBpY19lbmFibGVfbGV2ZWxfaXJxLApAQCAtNDczLDcgKzQ3Myw3IEBACiAjZGVmaW5lIGlvc2FwaWNfZW5kX2VkZ2VfaXJxCQlub3AKIAogc3RydWN0IGh3X2ludGVycnVwdF90eXBlIGlycV90eXBlX2lvc2FwaWNfZWRnZSA9IHsKLQkudHlwZW5hbWUgPQkiSU8tU0FQSUMtZWRnZSIsCisJLm5hbWUgPQkJIklPLVNBUElDLWVkZ2UiLAogCS5zdGFydHVwID0JaW9zYXBpY19zdGFydHVwX2VkZ2VfaXJxLAogCS5zaHV0ZG93biA9CWlvc2FwaWNfZGlzYWJsZV9lZGdlX2lycSwKIAkuZW5hYmxlID0JaW9zYXBpY19lbmFibGVfZWRnZV9pcnEsCkBAIC02NjQsNyArNjY0LDcgQEAKIAkJCXByaW50ayhLRVJOX1dBUk5JTkcKIAkJCSAgICAgICAiJXM6IGNoYW5naW5nIHZlY3RvciAlZCBmcm9tICVzIHRvICVzXG4iLAogCQkJICAgICAgIF9fRlVOQ1RJT05fXywgdmVjdG9yLAotCQkJICAgICAgIGlkZXNjLT5jaGlwLT50eXBlbmFtZSwgaXJxX3R5cGUtPnR5cGVuYW1lKTsKKwkJCSAgICAgICBpZGVzYy0+Y2hpcC0+bmFtZSwgaXJxX3R5cGUtPm5hbWUpOwogCQlpZGVzYy0+Y2hpcCA9IGlycV90eXBlOwogCX0KIAlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL2FyY2gvaWE2NC9rZXJuZWwvaXJxLmMgYi9hcmNoL2lhNjQva2VybmVsL2lycS5jCmluZGV4IGYwN2MwODYuLjU0ZDU1ZTQgMTAwNjQ0Ci0tLSBhL2FyY2gvaWE2NC9rZXJuZWwvaXJxLmMKKysrIGIvYXJjaC9pYTY0L2tlcm5lbC9pcnEuYwpAQCAtNzYsNyArNzYsNyBAQAogCQkJc2VxX3ByaW50ZihwLCAiJTEwdSAiLCBrc3RhdF9jcHUoaikuaXJxc1tpXSk7CiAJCX0KICNlbmRpZgotCQlzZXFfcHJpbnRmKHAsICIgJTE0cyIsIGlycV9kZXNjW2ldLmNoaXAtPnR5cGVuYW1lKTsKKwkJc2VxX3ByaW50ZihwLCAiICUxNHMiLCBpcnFfZGVzY1tpXS5jaGlwLT5uYW1lKTsKIAkJc2VxX3ByaW50ZihwLCAiICAlcyIsIGFjdGlvbi0+bmFtZSk7CiAKIAkJZm9yIChhY3Rpb249YWN0aW9uLT5uZXh0OyBhY3Rpb247IGFjdGlvbiA9IGFjdGlvbi0+bmV4dCkKQEAgLTE5Nyw3ICsxOTcsNyBAQAogCQkJc3RydWN0IHB0X3JlZ3MgKm9sZF9yZWdzID0gc2V0X2lycV9yZWdzKE5VTEwpOwogCiAJCQl2ZWN0b3JzX2luX21pZ3JhdGlvbltpcnFdPTA7Ci0JCQlfX2RvX0lSUShpcnEpOworCQkJZ2VuZXJpY19oYW5kbGVfaXJxKGlycSk7CiAJCQlzZXRfaXJxX3JlZ3Mob2xkX3JlZ3MpOwogCQl9CiAJfQpkaWZmIC0tZ2l0IGEvYXJjaC9pYTY0L2tlcm5lbC9pcnFfaWE2NC5jIGIvYXJjaC9pYTY0L2tlcm5lbC9pcnFfaWE2NC5jCmluZGV4IDY4MzM5ZGQwLi5iYTNiYThiIDEwMDY0NAotLS0gYS9hcmNoL2lhNjQva2VybmVsL2lycV9pYTY0LmMKKysrIGIvYXJjaC9pYTY0L2tlcm5lbC9pcnFfaWE2NC5jCkBAIC0xODAsMTEgKzE4MCwxMyBAQAogCXNhdmVkX3RwciA9IGlhNjRfZ2V0cmVnKF9JQTY0X1JFR19DUl9UUFIpOwogCWlhNjRfc3Jsel9kKCk7CiAJd2hpbGUgKHZlY3RvciAhPSBJQTY0X1NQVVJJT1VTX0lOVF9WRUNUT1IpIHsKLQkJaWYgKCFJU19SRVNDSEVEVUxFKHZlY3RvcikpIHsKKwkJaWYgKHVubGlrZWx5KElTX1JFU0NIRURVTEUodmVjdG9yKSkpCisJCQkga3N0YXRfdGhpc19jcHUuaXJxc1t2ZWN0b3JdKys7CisJCWVsc2UgewogCQkJaWE2NF9zZXRyZWcoX0lBNjRfUkVHX0NSX1RQUiwgdmVjdG9yKTsKIAkJCWlhNjRfc3Jsel9kKCk7CiAKLQkJCV9fZG9fSVJRKGxvY2FsX3ZlY3Rvcl90b19pcnEodmVjdG9yKSk7CisJCQlnZW5lcmljX2hhbmRsZV9pcnEobG9jYWxfdmVjdG9yX3RvX2lycSh2ZWN0b3IpKTsKIAogCQkJLyoKIAkJCSAqIERpc2FibGUgaW50ZXJydXB0cyBhbmQgc2VuZCBFT0k6CkBAIC0yMjUsNyArMjI3LDkgQEAKIAkgICogUGVyZm9ybSBub3JtYWwgaW50ZXJydXB0IHN0eWxlIHByb2Nlc3NpbmcKIAkgICovCiAJd2hpbGUgKHZlY3RvciAhPSBJQTY0X1NQVVJJT1VTX0lOVF9WRUNUT1IpIHsKLQkJaWYgKCFJU19SRVNDSEVEVUxFKHZlY3RvcikpIHsKKwkJaWYgKHVubGlrZWx5KElTX1JFU0NIRURVTEUodmVjdG9yKSkpCisJCQkga3N0YXRfdGhpc19jcHUuaXJxc1t2ZWN0b3JdKys7CisJCWVsc2UgewogCQkJc3RydWN0IHB0X3JlZ3MgKm9sZF9yZWdzID0gc2V0X2lycV9yZWdzKE5VTEwpOwogCiAJCQlpYTY0X3NldHJlZyhfSUE2NF9SRUdfQ1JfVFBSLCB2ZWN0b3IpOwpAQCAtMjM4LDcgKzI0Miw3IEBACiAJCQkgKiBQcm9iYWJseSBjb3VsZCBzaGFyZWQgY29kZS4KIAkJCSAqLwogCQkJdmVjdG9yc19pbl9taWdyYXRpb25bbG9jYWxfdmVjdG9yX3RvX2lycSh2ZWN0b3IpXT0wOwotCQkJX19kb19JUlEobG9jYWxfdmVjdG9yX3RvX2lycSh2ZWN0b3IpKTsKKwkJCWdlbmVyaWNfaGFuZGxlX2lycShsb2NhbF92ZWN0b3JfdG9faXJxKHZlY3RvcikpOwogCQkJc2V0X2lycV9yZWdzKG9sZF9yZWdzKTsKIAogCQkJLyoKQEAgLTI1OCwxMSArMjYyLDIyIEBACiAjaWZkZWYgQ09ORklHX1NNUAogZXh0ZXJuIGlycXJldHVybl90IGhhbmRsZV9JUEkgKGludCBpcnEsIHZvaWQgKmRldl9pZCk7CiAKK3N0YXRpYyBpcnFyZXR1cm5fdCBkdW1teV9oYW5kbGVyIChpbnQgaXJxLCB2b2lkICpkZXZfaWQpCit7CisJQlVHKCk7Cit9CisKIHN0YXRpYyBzdHJ1Y3QgaXJxYWN0aW9uIGlwaV9pcnFhY3Rpb24gPSB7CiAJLmhhbmRsZXIgPQloYW5kbGVfSVBJLAogCS5mbGFncyA9CUlSUUZfRElTQUJMRUQsCiAJLm5hbWUgPQkJIklQSSIKIH07CisKK3N0YXRpYyBzdHJ1Y3QgaXJxYWN0aW9uIHJlc2NoZWRfaXJxYWN0aW9uID0geworCS5oYW5kbGVyID0JZHVtbXlfaGFuZGxlciwKKwkuZmxhZ3MgPQlTQV9JTlRFUlJVUFQsCisJLm5hbWUgPQkJInJlc2NoZWQiCit9OwogI2VuZGlmCiAKIHZvaWQKQEAgLTI4Nyw2ICszMDIsNyBAQAogCXJlZ2lzdGVyX3BlcmNwdV9pcnEoSUE2NF9TUFVSSU9VU19JTlRfVkVDVE9SLCBOVUxMKTsKICNpZmRlZiBDT05GSUdfU01QCiAJcmVnaXN0ZXJfcGVyY3B1X2lycShJQTY0X0lQSV9WRUNUT1IsICZpcGlfaXJxYWN0aW9uKTsKKwlyZWdpc3Rlcl9wZXJjcHVfaXJxKElBNjRfSVBJX1JFU0NIRURVTEUsICZyZXNjaGVkX2lycWFjdGlvbik7CiAjZW5kaWYKICNpZmRlZiBDT05GSUdfUEVSRk1PTgogCXBmbV9pbml0X3BlcmNwdSgpOwpkaWZmIC0tZ2l0IGEvYXJjaC9pYTY0L2tlcm5lbC9pcnFfbHNhcGljLmMgYi9hcmNoL2lhNjQva2VybmVsL2lycV9sc2FwaWMuYwppbmRleCAxYWI1OGIwLi5jMmYwN2JlIDEwMDY0NAotLS0gYS9hcmNoL2lhNjQva2VybmVsL2lycV9sc2FwaWMuYworKysgYi9hcmNoL2lhNjQva2VybmVsL2lycV9sc2FwaWMuYwpAQCAtMzQsNyArMzQsNyBAQAogfQogCiBzdHJ1Y3QgaHdfaW50ZXJydXB0X3R5cGUgaXJxX3R5cGVfaWE2NF9sc2FwaWMgPSB7Ci0JLnR5cGVuYW1lID0JIkxTQVBJQyIsCisJLm5hbWUgPQkJIkxTQVBJQyIsCiAJLnN0YXJ0dXAgPQlsc2FwaWNfbm9vcF9zdGFydHVwLAogCS5zaHV0ZG93biA9CWxzYXBpY19ub29wLAogCS5lbmFibGUgPQlsc2FwaWNfbm9vcCwKZGlmZiAtLWdpdCBhL2FyY2gvaWE2NC9rZXJuZWwvbWNhX2Rydi5jIGIvYXJjaC9pYTY0L2tlcm5lbC9tY2FfZHJ2LmMKaW5kZXggYTQ1MDA5ZC4uYWZjMTQwMyAxMDA2NDQKLS0tIGEvYXJjaC9pYTY0L2tlcm5lbC9tY2FfZHJ2LmMKKysrIGIvYXJjaC9pYTY0L2tlcm5lbC9tY2FfZHJ2LmMKQEAgLTQzNSw2ICs0MzUsNTAgQEAKIH0KIAogLyoqCisgKiBnZXRfdGFyZ2V0X2lkZW50aWZpZXIgLSBHZXQgdGhlIHZhbGlkIENhY2hlIG9yIEJ1cyBjaGVjayB0YXJnZXQgaWRlbnRpZmllci4KKyAqIEBwZWlkeDoJcG9pbnRlciBvZiBpbmRleCBvZiBwcm9jZXNzb3IgZXJyb3Igc2VjdGlvbgorICoKKyAqIFJldHVybiB2YWx1ZToKKyAqCXRhcmdldCBhZGRyZXNzIG9uIFN1Y2Nlc3MgLyAwIG9uIEZhaWx1ZQorICovCitzdGF0aWMgdTY0CitnZXRfdGFyZ2V0X2lkZW50aWZpZXIocGVpZHhfdGFibGVfdCAqcGVpZHgpCit7CisJdTY0IHRhcmdldF9hZGRyZXNzID0gMDsKKwlzYWxfbG9nX21vZF9lcnJvcl9pbmZvX3QgKnNtZWk7CisJcGFsX2NhY2hlX2NoZWNrX2luZm9fdCAqcGNjaTsKKwlpbnQgaSwgbGV2ZWwgPSA5OworCisJLyoKKwkgKiBMb29rIHRocm91Z2ggdGhlIGNhY2hlIGNoZWNrcyBmb3IgYSB2YWxpZCB0YXJnZXQgaWRlbnRpZmllcgorCSAqIElmIG1vcmUgdGhhbiBvbmUgdmFsaWQgdGFyZ2V0IGlkZW50aWZpZXIsIHJldHVybiB0aGUgb25lCisJICogd2l0aCB0aGUgbG93ZXN0IGNhY2hlIGxldmVsLgorCSAqLworCWZvciAoaSA9IDA7IGkgPCBwZWlkeF9jYWNoZV9jaGVja19udW0ocGVpZHgpOyBpKyspIHsKKwkJc21laSA9IChzYWxfbG9nX21vZF9lcnJvcl9pbmZvX3QgKilwZWlkeF9jYWNoZV9jaGVjayhwZWlkeCwgaSk7CisJCWlmIChzbWVpLT52YWxpZC50YXJnZXRfaWRlbnRpZmllciAmJiBzbWVpLT50YXJnZXRfaWRlbnRpZmllcikgeworCQkJcGNjaSA9IChwYWxfY2FjaGVfY2hlY2tfaW5mb190ICopJihzbWVpLT5jaGVja19pbmZvKTsKKwkJCWlmICghdGFyZ2V0X2FkZHJlc3MgfHwgKHBjY2ktPmxldmVsIDwgbGV2ZWwpKSB7CisJCQkJdGFyZ2V0X2FkZHJlc3MgPSBzbWVpLT50YXJnZXRfaWRlbnRpZmllcjsKKwkJCQlsZXZlbCA9IHBjY2ktPmxldmVsOworCQkJCWNvbnRpbnVlOworCQkJfQorCQl9CisJfQorCWlmICh0YXJnZXRfYWRkcmVzcykKKwkJcmV0dXJuIHRhcmdldF9hZGRyZXNzOworCisJLyoKKwkgKiBMb29rIGF0IHRoZSBidXMgY2hlY2sgZm9yIGEgdmFsaWQgdGFyZ2V0IGlkZW50aWZpZXIKKwkgKi8KKwlzbWVpID0gcGVpZHhfYnVzX2NoZWNrKHBlaWR4LCAwKTsKKwlpZiAoc21laSAmJiBzbWVpLT52YWxpZC50YXJnZXRfaWRlbnRpZmllcikKKwkJcmV0dXJuIHNtZWktPnRhcmdldF9pZGVudGlmaWVyOworCisJcmV0dXJuIDA7Cit9CisKKy8qKgogICogcmVjb3Zlcl9mcm9tX3JlYWRfZXJyb3IgLSBUcnkgdG8gcmVjb3ZlciB0aGUgZXJyb3JzIHdoaWNoIHR5cGUgYXJlICJyZWFkInMuCiAgKiBAc2xpZHg6CXBvaW50ZXIgb2YgaW5kZXggb2YgU0FMIGVycm9yIHJlY29yZAogICogQHBlaWR4Oglwb2ludGVyIG9mIGluZGV4IG9mIHByb2Nlc3NvciBlcnJvciBzZWN0aW9uCkBAIC00NTAsMTMgKzQ5NCwxNCBAQAogCQkJcGVpZHhfdGFibGVfdCAqcGVpZHgsIHBhbF9idXNfY2hlY2tfaW5mb190ICpwYmNpLAogCQkJc3RydWN0IGlhNjRfc2FsX29zX3N0YXRlICpzb3MpCiB7Ci0Jc2FsX2xvZ19tb2RfZXJyb3JfaW5mb190ICpzbWVpOworCXU2NCB0YXJnZXRfaWRlbnRpZmllcjsKIAlwYWxfbWluX3N0YXRlX2FyZWFfdCAqcG1zYTsKIAlzdHJ1Y3QgaWE2NF9wc3IgKnBzcjEsICpwc3IyOwogCWlhNjRfZnB0cl90ICptY2FfaGRscl9iaCA9IChpYTY0X2ZwdHJfdCopbWNhX2hhbmRsZXJfYmhob29rOwogCiAJLyogSXMgdGFyZ2V0IGFkZHJlc3MgdmFsaWQ/ICovCi0JaWYgKCFwYmNpLT50dikKKwl0YXJnZXRfaWRlbnRpZmllciA9IGdldF90YXJnZXRfaWRlbnRpZmllcihwZWlkeCk7CisJaWYgKCF0YXJnZXRfaWRlbnRpZmllcikKIAkJcmV0dXJuIGZhdGFsX21jYSgidGFyZ2V0IGFkZHJlc3Mgbm90IHZhbGlkIik7CiAKIAkvKgpAQCAtNDg3LDMyICs1MzIsMjggQEAKIAlwbXNhID0gc29zLT5wYWxfbWluX3N0YXRlOwogCWlmIChwc3IxLT5jcGwgIT0gMCB8fAogCSAgICgocHNyMi0+Y3BsICE9IDApICYmIG1jYV9yZWNvdmVyX3JhbmdlKHBtc2EtPnBtc2FfaWlwKSkpIHsKLQkJc21laSA9IHBlaWR4X2J1c19jaGVjayhwZWlkeCwgMCk7Ci0JCWlmIChzbWVpLT52YWxpZC50YXJnZXRfaWRlbnRpZmllcikgewotCQkJLyoKLQkJCSAqICBzZXR1cCBmb3IgcmVzdW1lIHRvIGJvdHRvbSBoYWxmIG9mIE1DQSwKLQkJCSAqICJtY2FfaGFuZGxlcl9iaGhvb2siCi0JCQkgKi8KLQkJCS8qIHBhc3MgdG8gYmhob29rIGFzIGFyZ3VtZW50IChncjgsIC4uLikgKi8KLQkJCXBtc2EtPnBtc2FfZ3JbOC0xXSA9IHNtZWktPnRhcmdldF9pZGVudGlmaWVyOwotCQkJcG1zYS0+cG1zYV9ncls5LTFdID0gcG1zYS0+cG1zYV9paXA7Ci0JCQlwbXNhLT5wbXNhX2dyWzEwLTFdID0gcG1zYS0+cG1zYV9pcHNyOwotCQkJLyogc2V0IGludGVycnVwdGVkIHJldHVybiBhZGRyZXNzIChidXQgbm8gdXNlKSAqLwotCQkJcG1zYS0+cG1zYV9icjAgPSBwbXNhLT5wbXNhX2lpcDsKLQkJCS8qIGNoYW5nZSByZXN1bWUgYWRkcmVzcyB0byBib3R0b20gaGFsZiAqLwotCQkJcG1zYS0+cG1zYV9paXAgPSBtY2FfaGRscl9iaC0+ZnA7Ci0JCQlwbXNhLT5wbXNhX2dyWzEtMV0gPSBtY2FfaGRscl9iaC0+Z3A7Ci0JCQkvKiBzZXQgY3BsIHdpdGgga2VybmVsIG1vZGUgKi8KLQkJCXBzcjIgPSAoc3RydWN0IGlhNjRfcHNyICopJnBtc2EtPnBtc2FfaXBzcjsKLQkJCXBzcjItPmNwbCA9IDA7Ci0JCQlwc3IyLT5yaSAgPSAwOwotCQkJcHNyMi0+Ym4gID0gMTsKLQkJCXBzcjItPmkgID0gMDsKKwkJLyoKKwkJICogIHNldHVwIGZvciByZXN1bWUgdG8gYm90dG9tIGhhbGYgb2YgTUNBLAorCQkgKiAibWNhX2hhbmRsZXJfYmhob29rIgorCQkgKi8KKwkJLyogcGFzcyB0byBiaGhvb2sgYXMgYXJndW1lbnQgKGdyOCwgLi4uKSAqLworCQlwbXNhLT5wbXNhX2dyWzgtMV0gPSB0YXJnZXRfaWRlbnRpZmllcjsKKwkJcG1zYS0+cG1zYV9ncls5LTFdID0gcG1zYS0+cG1zYV9paXA7CisJCXBtc2EtPnBtc2FfZ3JbMTAtMV0gPSBwbXNhLT5wbXNhX2lwc3I7CisJCS8qIHNldCBpbnRlcnJ1cHRlZCByZXR1cm4gYWRkcmVzcyAoYnV0IG5vIHVzZSkgKi8KKwkJcG1zYS0+cG1zYV9icjAgPSBwbXNhLT5wbXNhX2lpcDsKKwkJLyogY2hhbmdlIHJlc3VtZSBhZGRyZXNzIHRvIGJvdHRvbSBoYWxmICovCisJCXBtc2EtPnBtc2FfaWlwID0gbWNhX2hkbHJfYmgtPmZwOworCQlwbXNhLT5wbXNhX2dyWzEtMV0gPSBtY2FfaGRscl9iaC0+Z3A7CisJCS8qIHNldCBjcGwgd2l0aCBrZXJuZWwgbW9kZSAqLworCQlwc3IyID0gKHN0cnVjdCBpYTY0X3BzciAqKSZwbXNhLT5wbXNhX2lwc3I7CisJCXBzcjItPmNwbCA9IDA7CisJCXBzcjItPnJpICA9IDA7CisJCXBzcjItPmJuICA9IDE7CisJCXBzcjItPmkgID0gMDsKIAotCQkJcmV0dXJuIG1jYV9yZWNvdmVyZWQoInVzZXIgbWVtb3J5IGNvcnJ1cHRpb24uICIKKwkJcmV0dXJuIG1jYV9yZWNvdmVyZWQoInVzZXIgbWVtb3J5IGNvcnJ1cHRpb24uICIKIAkJCQkia2lsbCBhZmZlY3RlZCBwcm9jZXNzIC0gcmVjb3ZlcmVkLiIpOwotCQl9Ci0KIAl9CiAKIAlyZXR1cm4gZmF0YWxfbWNhKCJrZXJuZWwgY29udGV4dCBub3QgcmVjb3ZlcmVkLCBpaXAgMHglbHhcbiIsCmRpZmYgLS1naXQgYS9hcmNoL2lhNjQva2VybmVsL3BhbC5TIGIvYXJjaC9pYTY0L2tlcm5lbC9wYWwuUwppbmRleCBlYmFmMWU2Li4wYjUzMzQ0IDEwMDY0NAotLS0gYS9hcmNoL2lhNjQva2VybmVsL3BhbC5TCisrKyBiL2FyY2gvaWE2NC9rZXJuZWwvcGFsLlMKQEAgLTIxLDExICsyMSwxMiBAQAogCS50ZXh0CiAKIC8qCi0gKiBTZXQgdGhlIFBBTCBlbnRyeSBwb2ludCBhZGRyZXNzLiAgVGhpcyBjb3VsZCBiZSB3cml0dGVuIGluIEMgY29kZSwgYnV0IHdlIGRvIGl0IGhlcmUKLSAqIHRvIGtlZXAgaXQgYWxsIGluIG9uZSBtb2R1bGUgKGJlc2lkZXMsIGl0J3Mgc28gdHJpdmlhbCB0aGF0IGl0J3MKKyAqIFNldCB0aGUgUEFMIGVudHJ5IHBvaW50IGFkZHJlc3MuICBUaGlzIGNvdWxkIGJlIHdyaXR0ZW4gaW4gQyBjb2RlLCBidXQgd2UKKyAqIGRvIGl0IGhlcmUgdG8ga2VlcCBpdCBhbGwgaW4gb25lIG1vZHVsZSAoYmVzaWRlcywgaXQncyBzbyB0cml2aWFsIHRoYXQgaXQncwogICogbm90IGEgYmlnIGRlYWwpLgogICoKLSAqIGluMAkJQWRkcmVzcyBvZiB0aGUgUEFMIGVudHJ5IHBvaW50ICh0ZXh0IGFkZHJlc3MsIE5PVCBhIGZ1bmN0aW9uIGRlc2NyaXB0b3IpLgorICogaW4wCQlBZGRyZXNzIG9mIHRoZSBQQUwgZW50cnkgcG9pbnQgKHRleHQgYWRkcmVzcywgTk9UIGEgZnVuY3Rpb24KKyAqCQlkZXNjcmlwdG9yKS4KICAqLwogR0xPQkFMX0VOVFJZKGlhNjRfcGFsX2hhbmRsZXJfaW5pdCkKIAlhbGxvYyByMz1hci5wZnMsMSwwLDAsMApAQCAtMzYsOSArMzcsOSBAQAogRU5EKGlhNjRfcGFsX2hhbmRsZXJfaW5pdCkKIAogLyoKLSAqIERlZmF1bHQgUEFMIGNhbGwgaGFuZGxlci4gIFRoaXMgbmVlZHMgdG8gYmUgY29kZWQgaW4gYXNzZW1ibHkgYmVjYXVzZSBpdCB1c2VzCi0gKiB0aGUgc3RhdGljIGNhbGxpbmcgY29udmVudGlvbiwgaS5lLiwgdGhlIFJTRSBtYXkgbm90IGJlIHVzZWQgYW5kIGNhbGxzIGFyZQotICogZG9uZSB2aWEgImJyLmNvbmQiIChub3QgImJyLmNhbGwiKS4KKyAqIERlZmF1bHQgUEFMIGNhbGwgaGFuZGxlci4gIFRoaXMgbmVlZHMgdG8gYmUgY29kZWQgaW4gYXNzZW1ibHkgYmVjYXVzZSBpdAorICogdXNlcyB0aGUgc3RhdGljIGNhbGxpbmcgY29udmVudGlvbiwgaS5lLiwgdGhlIFJTRSBtYXkgbm90IGJlIHVzZWQgYW5kCisgKiBjYWxscyBhcmUgZG9uZSB2aWEgImJyLmNvbmQiIChub3QgImJyLmNhbGwiKS4KICAqLwogR0xPQkFMX0VOVFJZKGlhNjRfcGFsX2RlZmF1bHRfaGFuZGxlcikKIAltb3Ygcjg9LTEKQEAgLTUwLDEyICs1MSwxMCBAQAogICoKICAqIGluMCAgICAgICAgIEluZGV4IG9mIFBBTCBzZXJ2aWNlCiAgKiBpbjEgLSBpbjMgICBSZW1haW5pbmcgUEFMIGFyZ3VtZW50cwotICogaW40CSAgICAgICAxID09PiBjbGVhciBwc3IuaWMsICAwID09PiBkb24ndCBjbGVhciBwc3IuaWMKLSAqCiAgKi8KIEdMT0JBTF9FTlRSWShpYTY0X3BhbF9jYWxsX3N0YXRpYykKLQkucHJvbG9ndWUgQVNNX1VOV19QUkxHX1JQfEFTTV9VTldfUFJMR19QRlMsIEFTTV9VTldfUFJMR19HUlNBVkUoNSkKLQlhbGxvYyBsb2MxID0gYXIucGZzLDUsNSwwLDAKKwkucHJvbG9ndWUgQVNNX1VOV19QUkxHX1JQfEFTTV9VTldfUFJMR19QRlMsIEFTTV9VTldfUFJMR19HUlNBVkUoNCkKKwlhbGxvYyBsb2MxID0gYXIucGZzLDQsNSwwLDAKIAltb3ZsIGxvYzIgPSBwYWxfZW50cnlfcG9pbnQKIDE6CXsKIAkgIG1vdiByMjggPSBpbjAKQEAgLTY0LDcgKzYzLDYgQEAKIAl9CiAJOzsKIAlsZDggbG9jMiA9IFtsb2MyXQkJLy8gbG9jMiA8LSBlbnRyeSBwb2ludAotCXRiaXQubnogcDYscDcgPSBpbjQsIDAKIAlhZGRzIHI4ID0gMWYtMWIscjgKIAltb3YgbG9jND1hci5yc2MJCQkvLyBzYXZlIFJTRSBjb25maWd1cmF0aW9uCiAJOzsKQEAgLTc0LDEzICs3MiwxMSBAQAogCS5ib2R5CiAJbW92IHIzMCA9IGluMgogCi0ocDYpCXJzbSBwc3IuaSB8IHBzci5pYwogCW1vdiByMzEgPSBpbjMKIAltb3YgYjcgPSBsb2MyCiAKLShwNykJcnNtIHBzci5pCisJcnNtIHBzci5pCiAJOzsKLShwNikJc3Jsei5pCiAJbW92IHJwID0gcjgKIAlici5jb25kLnNwdGsubWFueSBiNwogMToJbW92IHBzci5sID0gbG9jMwpAQCAtOTYsOCArOTIsOCBAQAogICogTWFrZSBhIFBBTCBjYWxsIHVzaW5nIHRoZSBzdGFja2VkIHJlZ2lzdGVycyBjYWxsaW5nIGNvbnZlbnRpb24uCiAgKgogICogSW5wdXRzOgotICogCWluMCAgICAgICAgIEluZGV4IG9mIFBBTCBzZXJ2aWNlCi0gKiAJaW4yIC0gaW4zICAgUmVtYW5pbmcgUEFMIGFyZ3VtZW50cworICoJaW4wICAgICAgICAgSW5kZXggb2YgUEFMIHNlcnZpY2UKKyAqCWluMiAtIGluMyAgIFJlbWFpbmluZyBQQUwgYXJndW1lbnRzCiAgKi8KIEdMT0JBTF9FTlRSWShpYTY0X3BhbF9jYWxsX3N0YWNrZWQpCiAJLnByb2xvZ3VlIEFTTV9VTldfUFJMR19SUHxBU01fVU5XX1BSTEdfUEZTLCBBU01fVU5XX1BSTEdfR1JTQVZFKDQpCkBAIC0xMzEsMTggKzEyNywxOCBAQAogICogTWFrZSBhIHBoeXNpY2FsIG1vZGUgUEFMIGNhbGwgdXNpbmcgdGhlIHN0YXRpYyByZWdpc3RlcnMgY2FsbGluZyBjb252ZW50aW9uLgogICoKICAqIElucHV0czoKLSAqIAlpbjAgICAgICAgICBJbmRleCBvZiBQQUwgc2VydmljZQotICogCWluMiAtIGluMyAgIFJlbWFuaW5nIFBBTCBhcmd1bWVudHMKKyAqCWluMCAgICAgICAgIEluZGV4IG9mIFBBTCBzZXJ2aWNlCisgKglpbjIgLSBpbjMgICBSZW1haW5pbmcgUEFMIGFyZ3VtZW50cwogICoKICAqIFBTUl9MUCwgUFNSX1RCLCBQU1JfSUQsIFBTUl9EQSBhcmUgbmV2ZXIgc2V0IGJ5IHRoZSBrZXJuZWwuCiAgKiBTbyB3ZSBkb24ndCBuZWVkIHRvIGNsZWFyIHRoZW0uCiAgKi8KLSNkZWZpbmUgUEFMX1BTUl9CSVRTX1RPX0NMRUFSCQkJCQkJCVwKLQkoSUE2NF9QU1JfSSB8IElBNjRfUFNSX0lUIHwgSUE2NF9QU1JfRFQgIHwgSUE2NF9QU1JfREIgfCBJQTY0X1BTUl9SVCB8CVwKLQkgSUE2NF9QU1JfREQgfCBJQTY0X1BTUl9TUyB8IElBNjRfUFNSX1JJIHwgSUE2NF9QU1JfRUQgfAkJXAorI2RlZmluZSBQQUxfUFNSX0JJVFNfVE9fQ0xFQVIJCQkJCQkgICAgICBcCisJKElBNjRfUFNSX0kgfCBJQTY0X1BTUl9JVCB8IElBNjRfUFNSX0RUICB8IElBNjRfUFNSX0RCIHwgSUE2NF9QU1JfUlQgfFwKKwkgSUE2NF9QU1JfREQgfCBJQTY0X1BTUl9TUyB8IElBNjRfUFNSX1JJIHwgSUE2NF9QU1JfRUQgfAkgICAgICBcCiAJIElBNjRfUFNSX0RGTCB8IElBNjRfUFNSX0RGSCkKIAotI2RlZmluZSBQQUxfUFNSX0JJVFNfVE9fU0VUCQkJCQkJCVwKKyNkZWZpbmUgUEFMX1BTUl9CSVRTX1RPX1NFVAkJCQkJCSAgICAgIFwKIAkoSUE2NF9QU1JfQk4pCiAKIApAQCAtMTc4LDcgKzE3NCw3IEBACiAJOzsKIAlhbmRjbSByMTY9bG9jMyxyMTYJCS8vIHJlbW92ZXMgYml0cyB0byBjbGVhciBmcm9tIHBzcgogCWJyLmNhbGwuc3B0ay5tYW55IHJwPWlhNjRfc3dpdGNoX21vZGVfcGh5cwotLnJldDE6CW1vdiBycCA9IHI4CQkJLy8gaW5zdGFsbCByZXR1cm4gYWRkcmVzcyAocGh5c2ljYWwpCisJbW92IHJwID0gcjgJCQkvLyBpbnN0YWxsIHJldHVybiBhZGRyZXNzIChwaHlzaWNhbCkKIAltb3YgbG9jNSA9IHIxOQogCW1vdiBsb2M2ID0gcjIwCiAJYnIuY29uZC5zcHRrLm1hbnkgYjcKQEAgLTE4OCw3ICsxODQsNiBAQAogCW1vdiByMTk9bG9jNQogCW1vdiByMjA9bG9jNgogCWJyLmNhbGwuc3B0ay5tYW55IHJwPWlhNjRfc3dpdGNoX21vZGVfdmlydCAvLyByZXR1cm4gdG8gdmlydHVhbCBtb2RlCi0ucmV0MjoKIAltb3YgcHNyLmwgPSBsb2MzCQkvLyByZXN0b3JlIGluaXQgUFNSCiAKIAltb3YgYXIucGZzID0gbG9jMQpAQCAtMjAzLDggKzE5OCw4IEBACiAgKiBNYWtlIGEgUEFMIGNhbGwgdXNpbmcgdGhlIHN0YWNrZWQgcmVnaXN0ZXJzIGluIHBoeXNpY2FsIG1vZGUuCiAgKgogICogSW5wdXRzOgotICogCWluMCAgICAgICAgIEluZGV4IG9mIFBBTCBzZXJ2aWNlCi0gKiAJaW4yIC0gaW4zICAgUmVtYW5pbmcgUEFMIGFyZ3VtZW50cworICoJaW4wICAgICAgICAgSW5kZXggb2YgUEFMIHNlcnZpY2UKKyAqCWluMiAtIGluMyAgIFJlbWFpbmluZyBQQUwgYXJndW1lbnRzCiAgKi8KIEdMT0JBTF9FTlRSWShpYTY0X3BhbF9jYWxsX3BoeXNfc3RhY2tlZCkKIAkucHJvbG9ndWUgQVNNX1VOV19QUkxHX1JQfEFTTV9VTldfUFJMR19QRlMsIEFTTV9VTldfUFJMR19HUlNBVkUoNSkKQEAgLTIxMiw3ICsyMDcsNyBAQAogCW1vdmwJbG9jMiA9IHBhbF9lbnRyeV9wb2ludAogMToJewogCSAgbW92IHIyOCAgPSBpbjAJCS8vIGNvcHkgcHJvY2VkdXJlIGluZGV4Ci0JICBtb3YgbG9jMCA9IHJwCQkvLyBzYXZlIHJwCisJICBtb3YgbG9jMCA9IHJwCQkJLy8gc2F2ZSBycAogCX0KIAkuYm9keQogCTs7CkBAIC0yNDUsNyArMjQwLDcgQEAKIAltb3YgcjE2PWxvYzMJCQkvLyByMTY9IG9yaWdpbmFsIHBzcgogCW1vdiByMTk9bG9jNQogCW1vdiByMjA9bG9jNgotCWJyLmNhbGwuc3B0ay5tYW55IHJwPWlhNjRfc3dpdGNoX21vZGVfdmlydAkvLyByZXR1cm4gdG8gdmlydHVhbCBtb2RlCisJYnIuY2FsbC5zcHRrLm1hbnkgcnA9aWE2NF9zd2l0Y2hfbW9kZV92aXJ0IC8vIHJldHVybiB0byB2aXJ0dWFsIG1vZGUKIAogCW1vdiBwc3IubCAgPSBsb2MzCQkvLyByZXN0b3JlIGluaXQgUFNSCiAJbW92IGFyLnBmcyA9IGxvYzEKQEAgLTI1NywxMCArMjUyLDExIEBACiBFTkQoaWE2NF9wYWxfY2FsbF9waHlzX3N0YWNrZWQpCiAKIC8qCi0gKiBTYXZlIHNjcmF0Y2ggZnAgc2NyYXRjaCByZWdzIHdoaWNoIGFyZW4ndCBzYXZlZCBpbiBwdF9yZWdzIGFscmVhZHkgKGZwMTAtZnAxNSkuCisgKiBTYXZlIHNjcmF0Y2ggZnAgc2NyYXRjaCByZWdzIHdoaWNoIGFyZW4ndCBzYXZlZCBpbiBwdF9yZWdzIGFscmVhZHkKKyAqIChmcDEwLWZwMTUpLgogICoKLSAqIE5PVEU6IFdlIG5lZWQgdG8gZG8gdGhpcyBzaW5jZSBmaXJtd2FyZSAoU0FMIGFuZCBQQUwpIG1heSB1c2UgYW55IG9mIHRoZSBzY3JhdGNoCi0gKiByZWdzIGZwLWxvdyBwYXJ0aXRpb24uCisgKiBOT1RFOiBXZSBuZWVkIHRvIGRvIHRoaXMgc2luY2UgZmlybXdhcmUgKFNBTCBhbmQgUEFMKSBtYXkgdXNlIGFueSBvZiB0aGUKKyAqIHNjcmF0Y2ggcmVncyBmcC1sb3cgcGFydGl0aW9uLgogICoKICAqIElucHV0czoKICAqICAgICAgaW4wCUFkZHJlc3Mgb2Ygc3RhY2sgc3RvcmFnZSBmb3IgZnAgcmVncwpkaWZmIC0tZ2l0IGEvYXJjaC9pYTY0L2tlcm5lbC9wZXJmbW9uLmMgYi9hcmNoL2lhNjQva2VybmVsL3BlcmZtb24uYwppbmRleCAyODEwMDRmLi4zYWFlZGUwIDEwMDY0NAotLS0gYS9hcmNoL2lhNjQva2VybmVsL3BlcmZtb24uYworKysgYi9hcmNoL2lhNjQva2VybmVsL3BlcmZtb24uYwpAQCAtNTU1OCwxMiArNTU1OCwxMyBAQAogfQogCiBzdGF0aWMgaXJxcmV0dXJuX3QKLXBmbV9pbnRlcnJ1cHRfaGFuZGxlcihpbnQgaXJxLCB2b2lkICphcmcsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQorcGZtX2ludGVycnVwdF9oYW5kbGVyKGludCBpcnEsIHZvaWQgKmFyZykKIHsKIAl1bnNpZ25lZCBsb25nIHN0YXJ0X2N5Y2xlcywgdG90YWxfY3ljbGVzOwogCXVuc2lnbmVkIGxvbmcgbWluLCBtYXg7CiAJaW50IHRoaXNfY3B1OwogCWludCByZXQ7CisJc3RydWN0IHB0X3JlZ3MgKnJlZ3MgPSBnZXRfaXJxX3JlZ3MoKTsKIAogCXRoaXNfY3B1ID0gZ2V0X2NwdSgpOwogCWlmIChsaWtlbHkoIXBmbV9hbHRfaW50cl9oYW5kbGVyKSkgewpkaWZmIC0tZ2l0IGEvYXJjaC9pYTY0L2tlcm5lbC9zYWwuYyBiL2FyY2gvaWE2NC9rZXJuZWwvc2FsLmMKaW5kZXggNjQyZmRjNy4uMjBiYWQ3OCAxMDA2NDQKLS0tIGEvYXJjaC9pYTY0L2tlcm5lbC9zYWwuYworKysgYi9hcmNoL2lhNjQva2VybmVsL3NhbC5jCkBAIC0yMjMsMTIgKzIyMywxMyBAQAogICovCiBzdGF0aWMgaW50IHNhbF9jYWNoZV9mbHVzaF9kcm9wc19pbnRlcnJ1cHRzOwogCi1zdGF0aWMgdm9pZCBfX2luaXQKK3ZvaWQgX19pbml0CiBjaGVja19zYWxfY2FjaGVfZmx1c2ggKHZvaWQpCiB7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAlpbnQgY3B1OwotCXU2NCB2ZWN0b3I7CisJdTY0IHZlY3RvciwgY2FjaGVfdHlwZSA9IDM7CisJc3RydWN0IGlhNjRfc2FsX3JldHZhbCBpc3J2OwogCiAJY3B1ID0gZ2V0X2NwdSgpOwogCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKQEAgLTI0Myw3ICsyNDQsMTAgQEAKIAl3aGlsZSAoIWlhNjRfZ2V0X2lycihJQTY0X1RJTUVSX1ZFQ1RPUikpCiAJCWNwdV9yZWxheCgpOwogCi0JaWE2NF9zYWxfY2FjaGVfZmx1c2goMyk7CisJU0FMX0NBTEwoaXNydiwgU0FMX0NBQ0hFX0ZMVVNILCBjYWNoZV90eXBlLCAwLCAwLCAwLCAwLCAwLCAwKTsKKworCWlmIChpc3J2LnN0YXR1cykKKwkJcHJpbnRrKEtFUk5fRVJSICJTQUxfQ0FMX0ZMVVNIIGZhaWxlZCB3aXRoICVsZFxuIiwgaXNydi5zdGF0dXMpOwogCiAJaWYgKGlhNjRfZ2V0X2lycihJQTY0X1RJTUVSX1ZFQ1RPUikpIHsKIAkJdmVjdG9yID0gaWE2NF9nZXRfaXZyKCk7CkBAIC0zMzEsNyArMzM1LDYgQEAKIAkJcCArPSBTQUxfREVTQ19TSVpFKCpwKTsKIAl9CiAKLQljaGVja19zYWxfY2FjaGVfZmx1c2goKTsKIH0KIAogaW50CmRpZmYgLS1naXQgYS9hcmNoL2lhNjQva2VybmVsL3NldHVwLmMgYi9hcmNoL2lhNjQva2VybmVsL3NldHVwLmMKaW5kZXggYzRjYWE4MC4uZDEwNDA0YSAxMDA2NDQKLS0tIGEvYXJjaC9pYTY0L2tlcm5lbC9zZXR1cC5jCisrKyBiL2FyY2gvaWE2NC9rZXJuZWwvc2V0dXAuYwpAQCAtNDU3LDYgKzQ1Nyw4IEBACiAJY3B1X2luaXQoKTsJLyogaW5pdGlhbGl6ZSB0aGUgYm9vdHN0cmFwIENQVSAqLwogCW1tdV9jb250ZXh0X2luaXQoKTsJLyogaW5pdGlhbGl6ZSBjb250ZXh0X2lkIGJpdG1hcCAqLwogCisJY2hlY2tfc2FsX2NhY2hlX2ZsdXNoKCk7CisKICNpZmRlZiBDT05GSUdfQUNQSQogCWFjcGlfYm9vdF9pbml0KCk7CiAjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvaWE2NC9rZXJuZWwvc21wLmMgYi9hcmNoL2lhNjQva2VybmVsL3NtcC5jCmluZGV4IDY1N2FjOTkuLjZhYjk1Y2VhIDEwMDY0NAotLS0gYS9hcmNoL2lhNjQva2VybmVsL3NtcC5jCisrKyBiL2FyY2gvaWE2NC9rZXJuZWwvc21wLmMKQEAgLTEwOCw3ICsxMDgsNyBAQAogfQogCiBpcnFyZXR1cm5fdAotaGFuZGxlX0lQSSAoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK2hhbmRsZV9JUEkgKGludCBpcnEsIHZvaWQgKmRldl9pZCkKIHsKIAlpbnQgdGhpc19jcHUgPSBnZXRfY3B1KCk7CiAJdW5zaWduZWQgbG9uZyAqcGVuZGluZ19pcGlzID0gJl9faWE2NF9wZXJfY3B1X3ZhcihpcGlfb3BlcmF0aW9uKTsKQEAgLTMyOCwxMCArMzI4LDE0IEBACiBzbXBfY2FsbF9mdW5jdGlvbiAodm9pZCAoKmZ1bmMpICh2b2lkICppbmZvKSwgdm9pZCAqaW5mbywgaW50IG5vbmF0b21pYywgaW50IHdhaXQpCiB7CiAJc3RydWN0IGNhbGxfZGF0YV9zdHJ1Y3QgZGF0YTsKLQlpbnQgY3B1cyA9IG51bV9vbmxpbmVfY3B1cygpLTE7CisJaW50IGNwdXM7CiAKLQlpZiAoIWNwdXMpCisJc3Bpbl9sb2NrKCZjYWxsX2xvY2spOworCWNwdXMgPSBudW1fb25saW5lX2NwdXMoKSAtIDE7CisJaWYgKCFjcHVzKSB7CisJCXNwaW5fdW5sb2NrKCZjYWxsX2xvY2spOwogCQlyZXR1cm4gMDsKKwl9CiAKIAkvKiBDYW4gZGVhZGxvY2sgd2hlbiBjYWxsZWQgd2l0aCBpbnRlcnJ1cHRzIGRpc2FibGVkICovCiAJV0FSTl9PTihpcnFzX2Rpc2FibGVkKCkpOwpAQCAtMzQzLDggKzM0Nyw2IEBACiAJaWYgKHdhaXQpCiAJCWF0b21pY19zZXQoJmRhdGEuZmluaXNoZWQsIDApOwogCi0Jc3Bpbl9sb2NrKCZjYWxsX2xvY2spOwotCiAJY2FsbF9kYXRhID0gJmRhdGE7CiAJbWIoKTsJLyogZW5zdXJlIHN0b3JlIHRvIGNhbGxfZGF0YSBwcmVjZWRlcyBzZXR0aW5nIG9mIElQSV9DQUxMX0ZVTkMgKi8KIAlzZW5kX0lQSV9hbGxidXRzZWxmKElQSV9DQUxMX0ZVTkMpOwpkaWZmIC0tZ2l0IGEvYXJjaC9pYTY0L2tlcm5lbC90aW1lLmMgYi9hcmNoL2lhNjQva2VybmVsL3RpbWUuYwppbmRleCA0MTE2OWE5Li4zOWUwY2QzIDEwMDY0NAotLS0gYS9hcmNoL2lhNjQva2VybmVsL3RpbWUuYworKysgYi9hcmNoL2lhNjQva2VybmVsL3RpbWUuYwpAQCAtODQsNiArODQsMTIgQEAKIAogCQlpZiAodGltZV9hZnRlcihuZXdfaXRtLCBpYTY0X2dldF9pdGMoKSkpCiAJCQlicmVhazsKKworCQkvKgorCQkgKiBBbGxvdyBJUElzIHRvIGludGVycnVwdCB0aGUgdGltZXIgbG9vcC4KKwkJICovCisJCWxvY2FsX2lycV9lbmFibGUoKTsKKwkJbG9jYWxfaXJxX2Rpc2FibGUoKTsKIAl9CiAKIAlkbyB7CmRpZmYgLS1naXQgYS9hcmNoL2lhNjQva2VybmVsL3ZtbGludXgubGRzLlMgYi9hcmNoL2lhNjQva2VybmVsL3ZtbGludXgubGRzLlMKaW5kZXggYjNiMmUzOC4uZDYwODNhMCAxMDA2NDQKLS0tIGEvYXJjaC9pYTY0L2tlcm5lbC92bWxpbnV4Lmxkcy5TCisrKyBiL2FyY2gvaWE2NC9rZXJuZWwvdm1saW51eC5sZHMuUwpAQCAtMTI4LDEzICsxMjgsNyBAQAogICAuaW5pdGNhbGwuaW5pdCA6IEFUKEFERFIoLmluaXRjYWxsLmluaXQpIC0gTE9BRF9PRkZTRVQpCiAJewogCSAgX19pbml0Y2FsbF9zdGFydCA9IC47Ci0JICAqKC5pbml0Y2FsbDEuaW5pdCkKLQkgICooLmluaXRjYWxsMi5pbml0KQotCSAgKiguaW5pdGNhbGwzLmluaXQpCi0JICAqKC5pbml0Y2FsbDQuaW5pdCkKLQkgICooLmluaXRjYWxsNS5pbml0KQotCSAgKiguaW5pdGNhbGw2LmluaXQpCi0JICAqKC5pbml0Y2FsbDcuaW5pdCkKKwlJTklUQ0FMTFMKIAkgIF9faW5pdGNhbGxfZW5kID0gLjsKIAl9CiAKZGlmZiAtLWdpdCBhL2FyY2gvaWE2NC9tbS9jb250aWcuYyBiL2FyY2gvaWE2NC9tbS9jb250aWcuYwppbmRleCBkYWY5NzdmLi44MmRlYWEzIDEwMDY0NAotLS0gYS9hcmNoL2lhNjQvbW0vY29udGlnLmMKKysrIGIvYXJjaC9pYTY0L21tL2NvbnRpZy5jCkBAIC0yMzMsNiArMjMzLDcgQEAKIAllZmlfbWVtbWFwX3dhbGsoY291bnRfcGFnZXMsICZudW1fcGh5c3BhZ2VzKTsKIAogCW1heF9kbWEgPSB2aXJ0X3RvX3BoeXMoKHZvaWQgKikgTUFYX0RNQV9BRERSRVNTKSA+PiBQQUdFX1NISUZUOworCW1lbXNldChtYXhfem9uZV9wZm5zLCAwLCBzaXplb2YobWF4X3pvbmVfcGZucykpOwogCW1heF96b25lX3BmbnNbWk9ORV9ETUFdID0gbWF4X2RtYTsKIAltYXhfem9uZV9wZm5zW1pPTkVfTk9STUFMXSA9IG1heF9sb3dfcGZuOwogCmRpZmYgLS1naXQgYS9hcmNoL2lhNjQvbW0vZGlzY29udGlnLmMgYi9hcmNoL2lhNjQvbW0vZGlzY29udGlnLmMKaW5kZXggZDQ5N2I2Yi4uOTY3MjJjYiAxMDA2NDQKLS0tIGEvYXJjaC9pYTY0L21tL2Rpc2NvbnRpZy5jCisrKyBiL2FyY2gvaWE2NC9tbS9kaXNjb250aWcuYwpAQCAtNzA5LDYgKzcwOSw3IEBACiAJCQltYXhfcGZuID0gbWVtX2RhdGFbbm9kZV0ubWF4X3BmbjsKIAl9CiAKKwltZW1zZXQobWF4X3pvbmVfcGZucywgMCwgc2l6ZW9mKG1heF96b25lX3BmbnMpKTsKIAltYXhfem9uZV9wZm5zW1pPTkVfRE1BXSA9IG1heF9kbWE7CiAJbWF4X3pvbmVfcGZuc1taT05FX05PUk1BTF0gPSBtYXhfcGZuOwogCWZyZWVfYXJlYV9pbml0X25vZGVzKG1heF96b25lX3BmbnMpOwpkaWZmIC0tZ2l0IGEvYXJjaC9pYTY0L21tL2h1Z2V0bGJwYWdlLmMgYi9hcmNoL2lhNjQvbW0vaHVnZXRsYnBhZ2UuYwppbmRleCBlZWU1YzFjZi4uZjNhOTU4NSAxMDA2NDQKLS0tIGEvYXJjaC9pYTY0L21tL2h1Z2V0bGJwYWdlLmMKKysrIGIvYXJjaC9pYTY0L21tL2h1Z2V0bGJwYWdlLmMKQEAgLTcwLDggKzcwLDEwIEBACiAgKiBEb24ndCBhY3R1YWxseSBuZWVkIHRvIGRvIGFueSBwcmVwYXJhdGlvbiwgYnV0IG5lZWQgdG8gbWFrZSBzdXJlCiAgKiB0aGUgYWRkcmVzcyBpcyBpbiB0aGUgcmlnaHQgcmVnaW9uLgogICovCi1pbnQgcHJlcGFyZV9odWdlcGFnZV9yYW5nZSh1bnNpZ25lZCBsb25nIGFkZHIsIHVuc2lnbmVkIGxvbmcgbGVuKQoraW50IHByZXBhcmVfaHVnZXBhZ2VfcmFuZ2UodW5zaWduZWQgbG9uZyBhZGRyLCB1bnNpZ25lZCBsb25nIGxlbiwgcGdvZmZfdCBwZ29mZikKIHsKKwlpZiAocGdvZmYgJiAofkhQQUdFX01BU0sgPj4gUEFHRV9TSElGVCkpCisJCXJldHVybiAtRUlOVkFMOwogCWlmIChsZW4gJiB+SFBBR0VfTUFTSykKIAkJcmV0dXJuIC1FSU5WQUw7CiAJaWYgKGFkZHIgJiB+SFBBR0VfTUFTSykKZGlmZiAtLWdpdCBhL2FyY2gvaWE2NC9wY2kvTWFrZWZpbGUgYi9hcmNoL2lhNjQvcGNpL01ha2VmaWxlCmluZGV4IGU2Njg4OWUuLmZiMTRkYzUgMTAwNjQ0Ci0tLSBhL2FyY2gvaWE2NC9wY2kvTWFrZWZpbGUKKysrIGIvYXJjaC9pYTY0L3BjaS9NYWtlZmlsZQpAQCAtMSw0ICsxLDQgQEAKICMKICMgTWFrZWZpbGUgZm9yIHRoZSBpYTY0LXNwZWNpZmljIHBhcnRzIG9mIHRoZSBwY2kgYnVzCiAjCi1vYmoteQkJOj0gcGNpLm8KK29iai15CQk6PSBwY2kubyBmaXh1cC5vCmRpZmYgLS1naXQgYS9hcmNoL2lhNjQvcGNpL2ZpeHVwLmMgYi9hcmNoL2lhNjQvcGNpL2ZpeHVwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjQ1ZGMxZgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvaWE2NC9wY2kvZml4dXAuYwpAQCAtMCwwICsxLDY5IEBACisvKgorICogRXhjZXB0aW9ucyBmb3Igc3BlY2lmaWMgZGV2aWNlcy4gVXN1YWxseSB3b3JrLWFyb3VuZHMgZm9yIGZhdGFsIGRlc2lnbiBmbGF3cy4KKyAqIERlcml2ZWQgZnJvbSBmaXh1cC5jIG9mIGkzODYgdHJlZS4KKyAqLworCisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorCisjaW5jbHVkZSA8YXNtL21hY2h2ZWMuaD4KKworLyoKKyAqIEZpeHVwIHRvIG1hcmsgYm9vdCBCSU9TIHZpZGVvIHNlbGVjdGVkIGJ5IEJJT1MgYmVmb3JlIGl0IGNoYW5nZXMKKyAqCisgKiBGcm9tIGluZm9ybWF0aW9uIHByb3ZpZGVkIGJ5ICJKb24gU21pcmwiIDxqb25zbWlybEBnbWFpbC5jb20+CisgKgorICogVGhlIHN0YW5kYXJkIGJvb3QgUk9NIHNlcXVlbmNlIGZvciBhbiB4ODYgbWFjaGluZSB1c2VzIHRoZSBCSU9TCisgKiB0byBzZWxlY3QgYW4gaW5pdGlhbCB2aWRlbyBjYXJkIGZvciBib290IGRpc3BsYXkuIFRoaXMgYm9vdCB2aWRlbworICogY2FyZCB3aWxsIGhhdmUgaXQncyBCSU9TIGNvcGllZCB0byBDMDAwMCBpbiBzeXN0ZW0gUkFNLgorICogSU9SRVNPVVJDRV9ST01fU0hBRE9XIGlzIHVzZWQgdG8gYXNzb2NpYXRlIHRoZSBib290IHZpZGVvCisgKiBjYXJkIHdpdGggdGhpcyBjb3B5LiBPbiBsYXB0b3BzIHRoaXMgY29weSBoYXMgdG8gYmUgdXNlZCBzaW5jZQorICogdGhlIG1haW4gUk9NIG1heSBiZSBjb21wcmVzc2VkIG9yIGNvbWJpbmVkIHdpdGggYW5vdGhlciBpbWFnZS4KKyAqIFNlZSBwY2lfbWFwX3JvbSgpIGZvciB1c2Ugb2YgdGhpcyBmbGFnLiBJT1JFU09VUkNFX1JPTV9TSEFET1cKKyAqIGlzIG1hcmtlZCBoZXJlIHNpbmNlIHRoZSBib290IHZpZGVvIGRldmljZSB3aWxsIGJlIHRoZSBvbmx5IGVuYWJsZWQKKyAqIHZpZGVvIGRldmljZSBhdCB0aGlzIHBvaW50LgorICovCisKK3N0YXRpYyB2b2lkIF9fZGV2aW5pdCBwY2lfZml4dXBfdmlkZW8oc3RydWN0IHBjaV9kZXYgKnBkZXYpCit7CisJc3RydWN0IHBjaV9kZXYgKmJyaWRnZTsKKwlzdHJ1Y3QgcGNpX2J1cyAqYnVzOworCXUxNiBjb25maWc7CisKKwlpZiAoKHN0cmNtcChwbGF0Zm9ybV9uYW1lLCAiZGlnIikgIT0gMCkKKwkgICAgJiYgKHN0cmNtcChwbGF0Zm9ybV9uYW1lLCAiaHB6eDEiKSAgIT0gMCkpCisJCXJldHVybjsKKwkvKiBNYXliZSwgdGhpcyBtYWNoaW5lIHN1cHBvcnRzIGxlZ2FjeSBtZW1vcnkgbWFwLiAqLworCisJaWYgKChwZGV2LT5jbGFzcyA+PiA4KSAhPSBQQ0lfQ0xBU1NfRElTUExBWV9WR0EpCisJCXJldHVybjsKKworCS8qIElzIFZHQSByb3V0ZWQgdG8gdXM/ICovCisJYnVzID0gcGRldi0+YnVzOworCXdoaWxlIChidXMpIHsKKwkJYnJpZGdlID0gYnVzLT5zZWxmOworCisJCS8qCisJCSAqIEZyb20gaW5mb3JtYXRpb24gcHJvdmlkZWQgYnkKKwkJICogIkRhdmlkIE1pbGxlciIgPGRhdmVtQGRhdmVtbG9mdC5uZXQ+CisJCSAqIFRoZSBicmlkZ2UgY29udHJvbCByZWdpc3RlciBpcyB2YWxpZCBmb3IgUENJIGhlYWRlcgorCQkgKiB0eXBlIEJSSURHRSwgb3IgQ0FSREJVUy4gSG9zdCB0byBQQ0kgY29udHJvbGxlcnMgdXNlCisJCSAqIFBDSSBoZWFkZXIgdHlwZSBOT1JNQUwuCisJCSAqLworCQlpZiAoYnJpZGdlCisJCSAgICAmJigoYnJpZGdlLT5oZHJfdHlwZSA9PSBQQ0lfSEVBREVSX1RZUEVfQlJJREdFKQorCQkgICAgICAgfHwoYnJpZGdlLT5oZHJfdHlwZSA9PSBQQ0lfSEVBREVSX1RZUEVfQ0FSREJVUykpKSB7CisJCQlwY2lfcmVhZF9jb25maWdfd29yZChicmlkZ2UsIFBDSV9CUklER0VfQ09OVFJPTCwKKwkJCQkJCSZjb25maWcpOworCQkJaWYgKCEoY29uZmlnICYgUENJX0JSSURHRV9DVExfVkdBKSkKKwkJCQlyZXR1cm47CisJCX0KKwkJYnVzID0gYnVzLT5wYXJlbnQ7CisJfQorCXBjaV9yZWFkX2NvbmZpZ193b3JkKHBkZXYsIFBDSV9DT01NQU5ELCAmY29uZmlnKTsKKwlpZiAoY29uZmlnICYgKFBDSV9DT01NQU5EX0lPIHwgUENJX0NPTU1BTkRfTUVNT1JZKSkgeworCQlwZGV2LT5yZXNvdXJjZVtQQ0lfUk9NX1JFU09VUkNFXS5mbGFncyB8PSBJT1JFU09VUkNFX1JPTV9TSEFET1c7CisJCXByaW50ayhLRVJOX0RFQlVHICJCb290IHZpZGVvIGRldmljZSBpcyAlc1xuIiwgcGNpX25hbWUocGRldikpOworCX0KK30KK0RFQ0xBUkVfUENJX0ZJWFVQX0hFQURFUihQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCBwY2lfZml4dXBfdmlkZW8pOwpkaWZmIC0tZ2l0IGEvYXJjaC9pYTY0L3NuL2tlcm5lbC9idGUuYyBiL2FyY2gvaWE2NC9zbi9rZXJuZWwvYnRlLmMKaW5kZXggN2Y3M2FkNC4uZmYxYzU1NiAxMDA2NDQKLS0tIGEvYXJjaC9pYTY0L3NuL2tlcm5lbC9idGUuYworKysgYi9hcmNoL2lhNjQvc24va2VybmVsL2J0ZS5jCkBAIC0zODEsMTQgKzM4MSwxMyBAQAogCQkgKiBiY29weSB0byB0aGUgZGVzdGluYXRpb24uCiAJCSAqLwogCi0JCS8qIEFkZCB0aGUgbGVhZGVyIGZyb20gc291cmNlICovCi0JCWhlYWRCdGVMZW4gPSBsZW4gKyAoc3JjICYgTDFfQ0FDSEVfTUFTSyk7Ci0JCS8qIEFkZCB0aGUgdHJhaWxpbmcgYnl0ZXMgZnJvbSBmb290ZXIuICovCi0JCWhlYWRCdGVMZW4gKz0gTDFfQ0FDSEVfQllURVMgLSAoaGVhZEJ0ZUxlbiAmIEwxX0NBQ0hFX01BU0spOwotCQloZWFkQnRlU291cmNlID0gc3JjICYgfkwxX0NBQ0hFX01BU0s7CiAJCWhlYWRCY29weVNyY09mZnNldCA9IHNyYyAmIEwxX0NBQ0hFX01BU0s7CiAJCWhlYWRCY29weURlc3QgPSBkZXN0OwogCQloZWFkQmNvcHlMZW4gPSBsZW47CisKKwkJaGVhZEJ0ZVNvdXJjZSA9IHNyYyAtIGhlYWRCY29weVNyY09mZnNldDsKKwkJLyogQWRkIHRoZSBsZWFkaW5nIGFuZCB0cmFpbGluZyBieXRlcyBmcm9tIHNvdXJjZSAqLworCQloZWFkQnRlTGVuID0gTDFfQ0FDSEVfQUxJR04obGVuICsgaGVhZEJjb3B5U3JjT2Zmc2V0KTsKIAl9CiAKIAlpZiAoaGVhZEJjb3B5TGVuID4gMCkgewpkaWZmIC0tZ2l0IGEvYXJjaC9pYTY0L3NuL2tlcm5lbC9pcnEuYyBiL2FyY2gvaWE2NC9zbi9rZXJuZWwvaXJxLmMKaW5kZXggN2JiNmFkMS4uMGI0OTQ1OSAxMDA2NDQKLS0tIGEvYXJjaC9pYTY0L3NuL2tlcm5lbC9pcnEuYworKysgYi9hcmNoL2lhNjQvc24va2VybmVsL2lycS5jCkBAIC0yMDEsNyArMjAxLDcgQEAKIH0KIAogc3RydWN0IGh3X2ludGVycnVwdF90eXBlIGlycV90eXBlX3NuID0gewotCS50eXBlbmFtZQk9ICJTTiBodWIiLAorCS5uYW1lCQk9ICJTTiBodWIiLAogCS5zdGFydHVwCT0gc25fc3RhcnR1cF9pcnEsCiAJLnNodXRkb3duCT0gc25fc2h1dGRvd25faXJxLAogCS5lbmFibGUJCT0gc25fZW5hYmxlX2lycSwKZGlmZiAtLWdpdCBhL2FyY2gvaWE2NC9zbi9rZXJuZWwvc2V0dXAuYyBiL2FyY2gvaWE2NC9zbi9rZXJuZWwvc2V0dXAuYwppbmRleCA1ZjJkY2JhNy4uN2EyZDgyNCAxMDA2NDQKLS0tIGEvYXJjaC9pYTY0L3NuL2tlcm5lbC9zZXR1cC5jCisrKyBiL2FyY2gvaWE2NC9zbi9rZXJuZWwvc2V0dXAuYwpAQCAtNjUsNyArNjUsNiBAQAogZXh0ZXJuIHVuc2lnbmVkIGxvbmcgbGFzdF90aW1lX29mZnNldDsKIGV4dGVybiB2b2lkICgqaWE2NF9tYXJrX2lkbGUpIChpbnQpOwogZXh0ZXJuIHZvaWQgc25pZGxlKGludCk7Ci1leHRlcm4gdW5zaWduZWQgY2hhciBhY3BpX2tiZF9jb250cm9sbGVyX3ByZXNlbnQ7CiBleHRlcm4gdW5zaWduZWQgbG9uZyBsb25nICgqaWE2NF9wcmludGtfY2xvY2spKHZvaWQpOwogCiB1bnNpZ25lZCBsb25nIHNuX3J0Y19jeWNsZXNfcGVyX3NlY29uZDsKQEAgLTQ1MiwxNyArNDUxLDYgQEAKIAogCWlhNjRfcHJpbnRrX2Nsb2NrID0gaWE2NF9zbjJfcHJpbnRrX2Nsb2NrOwogCi0JLyoKLQkgKiBPbGQgUFJPTXMgZG8gbm90IHByb3ZpZGUgYW4gQUNQSSBGQURULiBEaXNhYmxlIGxlZ2FjeSBrZXlib2FyZAotCSAqIHN1cHBvcnQgaGVyZSBzbyB3ZSBkb24ndCBoYXZlIHRvIGxpc3RlbiB0byBmYWlsZWQga2V5Ym9hcmQgcHJvYmUKLQkgKiBtZXNzYWdlcy4KLQkgKi8KLQlpZiAoaXNfc2h1YjEoKSAmJiB2ZXJzaW9uIDw9IDB4MDIwOSAmJiBhY3BpX2tiZF9jb250cm9sbGVyX3ByZXNlbnQpIHsKLQkJcHJpbnRrKEtFUk5fSU5GTyAiRGlzYWJsaW5nIGxlZ2FjeSBrZXlib2FyZCBzdXBwb3J0IGFzIHByb20gIgotCQkgICAgICAgImlzIHRvbyBvbGQgYW5kIGRvZXNuJ3QgcHJvdmlkZSBGQURUXG4iKTsKLQkJYWNwaV9rYmRfY29udHJvbGxlcl9wcmVzZW50ID0gMDsKLQl9Ci0KIAlwcmludGsoIlNHSSBTQUwgdmVyc2lvbiAleC4lMDJ4XG4iLCB2ZXJzaW9uID4+IDgsIHZlcnNpb24gJiAweDAwRkYpOwogCiAJLyoKZGlmZiAtLWdpdCBhL2FyY2gvbTMyci9rZXJuZWwvc2V0dXAuYyBiL2FyY2gvbTMyci9rZXJuZWwvc2V0dXAuYwppbmRleCAzZjM1YWIzLi4wZTc3NzhiIDEwMDY0NAotLS0gYS9hcmNoL20zMnIva2VybmVsL3NldHVwLmMKKysrIGIvYXJjaC9tMzJyL2tlcm5lbC9zZXR1cC5jCkBAIC0zNjksMTAgKzM2OSwxMCBAQAogfQogCiBzdHJ1Y3Qgc2VxX29wZXJhdGlvbnMgY3B1aW5mb19vcCA9IHsKLQlzdGFydDoJY19zdGFydCwKLQluZXh0OgljX25leHQsCi0Jc3RvcDoJY19zdG9wLAotCXNob3c6CXNob3dfY3B1aW5mbywKKwkuc3RhcnQgPSBjX3N0YXJ0LAorCS5uZXh0ID0gY19uZXh0LAorCS5zdG9wID0gY19zdG9wLAorCS5zaG93ID0gc2hvd19jcHVpbmZvLAogfTsKICNlbmRpZgkvKiBDT05GSUdfUFJPQ19GUyAqLwogCmRpZmYgLS1naXQgYS9hcmNoL20zMnIva2VybmVsL3NldHVwX21hcHBpLmMgYi9hcmNoL20zMnIva2VybmVsL3NldHVwX21hcHBpLmMKaW5kZXggNjdkYmJkYy4uNmIyZDc3ZCAxMDA2NDQKLS0tIGEvYXJjaC9tMzJyL2tlcm5lbC9zZXR1cF9tYXBwaS5jCisrKyBiL2FyY2gvbTMyci9rZXJuZWwvc2V0dXBfbWFwcGkuYwpAQCAtODYsNyArODYsNyBAQAogCS8qIElOVDAgOiBMQU4gY29udHJvbGxlciAoUlRMODAxOUFTKSAqLwogCWlycV9kZXNjW00zMlJfSVJRX0lOVDBdLnN0YXR1cyA9IElSUV9ESVNBQkxFRDsKIAlpcnFfZGVzY1tNMzJSX0lSUV9JTlQwXS5jaGlwID0gJm1hcHBpX2lycV90eXBlOwotCWlycV9kZXNjW00zMlJfSVJRX0lOVDBdLmFjdGlvbiA9IDA7CisJaXJxX2Rlc2NbTTMyUl9JUlFfSU5UMF0uYWN0aW9uID0gTlVMTDsKIAlpcnFfZGVzY1tNMzJSX0lSUV9JTlQwXS5kZXB0aCA9IDE7CiAJaWN1X2RhdGFbTTMyUl9JUlFfSU5UMF0uaWN1Y3IgPSBNMzJSX0lDVUNSX0lFTnxNMzJSX0lDVUNSX0lTTU9EMTA7CiAJZGlzYWJsZV9tYXBwaV9pcnEoTTMyUl9JUlFfSU5UMCk7CkBAIC05NSw3ICs5NSw3IEBACiAJLyogTUZUMiA6IHN5c3RlbSB0aW1lciAqLwogCWlycV9kZXNjW00zMlJfSVJRX01GVDJdLnN0YXR1cyA9IElSUV9ESVNBQkxFRDsKIAlpcnFfZGVzY1tNMzJSX0lSUV9NRlQyXS5jaGlwID0gJm1hcHBpX2lycV90eXBlOwotCWlycV9kZXNjW00zMlJfSVJRX01GVDJdLmFjdGlvbiA9IDA7CisJaXJxX2Rlc2NbTTMyUl9JUlFfTUZUMl0uYWN0aW9uID0gTlVMTDsKIAlpcnFfZGVzY1tNMzJSX0lSUV9NRlQyXS5kZXB0aCA9IDE7CiAJaWN1X2RhdGFbTTMyUl9JUlFfTUZUMl0uaWN1Y3IgPSBNMzJSX0lDVUNSX0lFTjsKIAlkaXNhYmxlX21hcHBpX2lycShNMzJSX0lSUV9NRlQyKTsKQEAgLTEwNCw3ICsxMDQsNyBAQAogCS8qIFNJTzBfUiA6IHVhcnQgcmVjZWl2ZSBkYXRhICovCiAJaXJxX2Rlc2NbTTMyUl9JUlFfU0lPMF9SXS5zdGF0dXMgPSBJUlFfRElTQUJMRUQ7CiAJaXJxX2Rlc2NbTTMyUl9JUlFfU0lPMF9SXS5jaGlwID0gJm1hcHBpX2lycV90eXBlOwotCWlycV9kZXNjW00zMlJfSVJRX1NJTzBfUl0uYWN0aW9uID0gMDsKKwlpcnFfZGVzY1tNMzJSX0lSUV9TSU8wX1JdLmFjdGlvbiA9IE5VTEw7CiAJaXJxX2Rlc2NbTTMyUl9JUlFfU0lPMF9SXS5kZXB0aCA9IDE7CiAJaWN1X2RhdGFbTTMyUl9JUlFfU0lPMF9SXS5pY3VjciA9IDA7CiAJZGlzYWJsZV9tYXBwaV9pcnEoTTMyUl9JUlFfU0lPMF9SKTsKQEAgLTExMiw3ICsxMTIsNyBAQAogCS8qIFNJTzBfUyA6IHVhcnQgc2VuZCBkYXRhICovCiAJaXJxX2Rlc2NbTTMyUl9JUlFfU0lPMF9TXS5zdGF0dXMgPSBJUlFfRElTQUJMRUQ7CiAJaXJxX2Rlc2NbTTMyUl9JUlFfU0lPMF9TXS5jaGlwID0gJm1hcHBpX2lycV90eXBlOwotCWlycV9kZXNjW00zMlJfSVJRX1NJTzBfU10uYWN0aW9uID0gMDsKKwlpcnFfZGVzY1tNMzJSX0lSUV9TSU8wX1NdLmFjdGlvbiA9IE5VTEw7CiAJaXJxX2Rlc2NbTTMyUl9JUlFfU0lPMF9TXS5kZXB0aCA9IDE7CiAJaWN1X2RhdGFbTTMyUl9JUlFfU0lPMF9TXS5pY3VjciA9IDA7CiAJZGlzYWJsZV9tYXBwaV9pcnEoTTMyUl9JUlFfU0lPMF9TKTsKQEAgLTEyMCw3ICsxMjAsNyBAQAogCS8qIFNJTzFfUiA6IHVhcnQgcmVjZWl2ZSBkYXRhICovCiAJaXJxX2Rlc2NbTTMyUl9JUlFfU0lPMV9SXS5zdGF0dXMgPSBJUlFfRElTQUJMRUQ7CiAJaXJxX2Rlc2NbTTMyUl9JUlFfU0lPMV9SXS5jaGlwID0gJm1hcHBpX2lycV90eXBlOwotCWlycV9kZXNjW00zMlJfSVJRX1NJTzFfUl0uYWN0aW9uID0gMDsKKwlpcnFfZGVzY1tNMzJSX0lSUV9TSU8xX1JdLmFjdGlvbiA9IE5VTEw7CiAJaXJxX2Rlc2NbTTMyUl9JUlFfU0lPMV9SXS5kZXB0aCA9IDE7CiAJaWN1X2RhdGFbTTMyUl9JUlFfU0lPMV9SXS5pY3VjciA9IDA7CiAJZGlzYWJsZV9tYXBwaV9pcnEoTTMyUl9JUlFfU0lPMV9SKTsKQEAgLTEyOCw3ICsxMjgsNyBAQAogCS8qIFNJTzFfUyA6IHVhcnQgc2VuZCBkYXRhICovCiAJaXJxX2Rlc2NbTTMyUl9JUlFfU0lPMV9TXS5zdGF0dXMgPSBJUlFfRElTQUJMRUQ7CiAJaXJxX2Rlc2NbTTMyUl9JUlFfU0lPMV9TXS5jaGlwID0gJm1hcHBpX2lycV90eXBlOwotCWlycV9kZXNjW00zMlJfSVJRX1NJTzFfU10uYWN0aW9uID0gMDsKKwlpcnFfZGVzY1tNMzJSX0lSUV9TSU8xX1NdLmFjdGlvbiA9IE5VTEw7CiAJaXJxX2Rlc2NbTTMyUl9JUlFfU0lPMV9TXS5kZXB0aCA9IDE7CiAJaWN1X2RhdGFbTTMyUl9JUlFfU0lPMV9TXS5pY3VjciA9IDA7CiAJZGlzYWJsZV9tYXBwaV9pcnEoTTMyUl9JUlFfU0lPMV9TKTsKQEAgLTEzOCw3ICsxMzgsNyBAQAogCS8qIElOVDEgOiBwY2NhcmQwIGludGVycnVwdCAqLwogCWlycV9kZXNjW00zMlJfSVJRX0lOVDFdLnN0YXR1cyA9IElSUV9ESVNBQkxFRDsKIAlpcnFfZGVzY1tNMzJSX0lSUV9JTlQxXS5jaGlwID0gJm1hcHBpX2lycV90eXBlOwotCWlycV9kZXNjW00zMlJfSVJRX0lOVDFdLmFjdGlvbiA9IDA7CisJaXJxX2Rlc2NbTTMyUl9JUlFfSU5UMV0uYWN0aW9uID0gTlVMTDsKIAlpcnFfZGVzY1tNMzJSX0lSUV9JTlQxXS5kZXB0aCA9IDE7CiAJaWN1X2RhdGFbTTMyUl9JUlFfSU5UMV0uaWN1Y3IgPSBNMzJSX0lDVUNSX0lFTiB8IE0zMlJfSUNVQ1JfSVNNT0QwMDsKIAlkaXNhYmxlX21hcHBpX2lycShNMzJSX0lSUV9JTlQxKTsKQEAgLTE0Niw3ICsxNDYsNyBAQAogCS8qIElOVDIgOiBwY2NhcmQxIGludGVycnVwdCAqLwogCWlycV9kZXNjW00zMlJfSVJRX0lOVDJdLnN0YXR1cyA9IElSUV9ESVNBQkxFRDsKIAlpcnFfZGVzY1tNMzJSX0lSUV9JTlQyXS5jaGlwID0gJm1hcHBpX2lycV90eXBlOwotCWlycV9kZXNjW00zMlJfSVJRX0lOVDJdLmFjdGlvbiA9IDA7CisJaXJxX2Rlc2NbTTMyUl9JUlFfSU5UMl0uYWN0aW9uID0gTlVMTDsKIAlpcnFfZGVzY1tNMzJSX0lSUV9JTlQyXS5kZXB0aCA9IDE7CiAJaWN1X2RhdGFbTTMyUl9JUlFfSU5UMl0uaWN1Y3IgPSBNMzJSX0lDVUNSX0lFTiB8IE0zMlJfSUNVQ1JfSVNNT0QwMDsKIAlkaXNhYmxlX21hcHBpX2lycShNMzJSX0lSUV9JTlQyKTsKZGlmZiAtLWdpdCBhL2FyY2gvbTMyci9rZXJuZWwvc2lnbmFsLmMgYi9hcmNoL20zMnIva2VybmVsL3NpZ25hbC5jCmluZGV4IGE5MTc0ZWYuLmI2MGNlYTQgMTAwNjQ0Ci0tLSBhL2FyY2gvbTMyci9rZXJuZWwvc2lnbmFsLmMKKysrIGIvYXJjaC9tMzJyL2tlcm5lbC9zaWduYWwuYwpAQCAtMzMsNyArMzMsNyBAQAogaW50IGRvX3NpZ25hbChzdHJ1Y3QgcHRfcmVncyAqLCBzaWdzZXRfdCAqKTsKIAogYXNtbGlua2FnZSBpbnQKLXN5c19ydF9zaWdzdXNwZW5kKHNpZ3NldF90ICp1bmV3c2V0LCBzaXplX3Qgc2lnc2V0c2l6ZSwKK3N5c19ydF9zaWdzdXNwZW5kKHNpZ3NldF90IF9fdXNlciAqdW5ld3NldCwgc2l6ZV90IHNpZ3NldHNpemUsCiAJCSAgdW5zaWduZWQgbG9uZyByMiwgdW5zaWduZWQgbG9uZyByMywgdW5zaWduZWQgbG9uZyByNCwKIAkJICB1bnNpZ25lZCBsb25nIHI1LCB1bnNpZ25lZCBsb25nIHI2LCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKIHsKQEAgLTc4LDggKzc4LDggQEAKIHN0cnVjdCBydF9zaWdmcmFtZQogewogCWludCBzaWc7Ci0Jc3RydWN0IHNpZ2luZm8gKnBpbmZvOwotCXZvaWQgKnB1YzsKKwlzdHJ1Y3Qgc2lnaW5mbyBfX3VzZXIgKnBpbmZvOworCXZvaWQgX191c2VyICpwdWM7CiAJc3RydWN0IHNpZ2luZm8gaW5mbzsKIAlzdHJ1Y3QgdWNvbnRleHQgdWM7CiAvLwlzdHJ1Y3QgX2Zwc3RhdGUgZnBzdGF0ZTsKZGlmZiAtLWdpdCBhL2FyY2gvbTMyci9rZXJuZWwvc21wLmMgYi9hcmNoL20zMnIva2VybmVsL3NtcC5jCmluZGV4IDcyMmUyMWYuLjM2MDEyOTEgMTAwNjQ0Ci0tLSBhL2FyY2gvbTMyci9rZXJuZWwvc21wLmMKKysrIGIvYXJjaC9tMzJyL2tlcm5lbC9zbXAuYwpAQCAtMjMxLDcgKzIzMSw3IEBACiAJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOwogCV9fZmx1c2hfdGxiX2FsbCgpOwogCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKLQlzbXBfY2FsbF9mdW5jdGlvbihmbHVzaF90bGJfYWxsX2lwaSwgMCwgMSwgMSk7CisJc21wX2NhbGxfZnVuY3Rpb24oZmx1c2hfdGxiX2FsbF9pcGksIE5VTEwsIDEsIDEpOwogCXByZWVtcHRfZW5hYmxlKCk7CiB9CiAKZGlmZiAtLWdpdCBhL2FyY2gvbTMyci9rZXJuZWwvc3lzX20zMnIuYyBiL2FyY2gvbTMyci9rZXJuZWwvc3lzX20zMnIuYwppbmRleCBiNTY3MzUxLi5iNGU3YmNiIDEwMDY0NAotLS0gYS9hcmNoL20zMnIva2VybmVsL3N5c19tMzJyLmMKKysrIGIvYXJjaC9tMzJyL2tlcm5lbC9zeXNfbTMyci5jCkBAIC0zMSw3ICszMSw3IEBACiAvKgogICogc3lzX3RhcygpIC0gdGVzdC1hbmQtc2V0CiAgKi8KLWFzbWxpbmthZ2UgaW50IHN5c190YXMoaW50ICphZGRyKQorYXNtbGlua2FnZSBpbnQgc3lzX3RhcyhpbnQgX191c2VyICphZGRyKQogewogCWludCBvbGR2YWw7CiAKQEAgLTkwLDcgKzkwLDcgQEAKIAogCWVycm9yID0gZG9fcGlwZShmZCk7CiAJaWYgKCFlcnJvcikgewotCQlpZiAoY29weV90b191c2VyKCh2b2lkICopcjAsICh2b2lkICopZmQsIDIqc2l6ZW9mKGludCkpKQorCQlpZiAoY29weV90b191c2VyKCh2b2lkIF9fdXNlciAqKXIwLCBmZCwgMipzaXplb2YoaW50KSkpCiAJCQllcnJvciA9IC1FRkFVTFQ7CiAJfQogCXJldHVybiBlcnJvcjsKQEAgLTIwMSw3ICsyMDEsNyBAQAogCX0KIH0KIAotYXNtbGlua2FnZSBpbnQgc3lzX3VuYW1lKHN0cnVjdCBvbGRfdXRzbmFtZSAqIG5hbWUpCithc21saW5rYWdlIGludCBzeXNfdW5hbWUoc3RydWN0IG9sZF91dHNuYW1lIF9fdXNlciAqIG5hbWUpCiB7CiAJaW50IGVycjsKIAlpZiAoIW5hbWUpCmRpZmYgLS1naXQgYS9hcmNoL20zMnIva2VybmVsL3RyYXBzLmMgYi9hcmNoL20zMnIva2VybmVsL3RyYXBzLmMKaW5kZXggYzFkYWYyYy4uOTdlMGIxYyAxMDA2NDQKLS0tIGEvYXJjaC9tMzJyL2tlcm5lbC90cmFwcy5jCisrKyBiL2FyY2gvbTMyci9rZXJuZWwvdHJhcHMuYwpAQCAtMjY4LDcgKzI2OCw3IEBACiAjZGVmaW5lIERPX0VSUk9SKHRyYXBuciwgc2lnbnIsIHN0ciwgbmFtZSkgXAogYXNtbGlua2FnZSB2b2lkIGRvXyMjbmFtZShzdHJ1Y3QgcHRfcmVncyAqIHJlZ3MsIGxvbmcgZXJyb3JfY29kZSkgXAogeyBcCi0JZG9fdHJhcCh0cmFwbnIsIHNpZ25yLCAwLCByZWdzLCBlcnJvcl9jb2RlLCBOVUxMKTsgXAorCWRvX3RyYXAodHJhcG5yLCBzaWduciwgTlVMTCwgcmVncywgZXJyb3JfY29kZSwgTlVMTCk7IFwKIH0KIAogI2RlZmluZSBET19FUlJPUl9JTkZPKHRyYXBuciwgc2lnbnIsIHN0ciwgbmFtZSwgc2ljb2RlLCBzaWFkZHIpIFwKZGlmZiAtLWdpdCBhL2FyY2gvbTMyci9rZXJuZWwvdm1saW51eC5sZHMuUyBiL2FyY2gvbTMyci9rZXJuZWwvdm1saW51eC5sZHMuUwppbmRleCAxM2M3YmI2Li4zNThiOWNlIDEwMDY0NAotLS0gYS9hcmNoL20zMnIva2VybmVsL3ZtbGludXgubGRzLlMKKysrIGIvYXJjaC9tMzJyL2tlcm5lbC92bWxpbnV4Lmxkcy5TCkBAIC04MywxMyArODMsNyBAQAogICBfX3NldHVwX2VuZCA9IC47CiAgIF9faW5pdGNhbGxfc3RhcnQgPSAuOwogICAuaW5pdGNhbGwuaW5pdCA6IHsKLQkqKC5pbml0Y2FsbDEuaW5pdCkKLQkqKC5pbml0Y2FsbDIuaW5pdCkKLQkqKC5pbml0Y2FsbDMuaW5pdCkKLQkqKC5pbml0Y2FsbDQuaW5pdCkKLQkqKC5pbml0Y2FsbDUuaW5pdCkKLQkqKC5pbml0Y2FsbDYuaW5pdCkKLQkqKC5pbml0Y2FsbDcuaW5pdCkKKwlJTklUQ0FMTFMKICAgfQogICBfX2luaXRjYWxsX2VuZCA9IC47CiAgIF9fY29uX2luaXRjYWxsX3N0YXJ0ID0gLjsKZGlmZiAtLWdpdCBhL2FyY2gvbTY4ay9rZXJuZWwvbTY4a19rc3ltcy5jIGIvYXJjaC9tNjhrL2tlcm5lbC9tNjhrX2tzeW1zLmMKaW5kZXggZjk2MzZlOC4uNmZjNjljNyAxMDA2NDQKLS0tIGEvYXJjaC9tNjhrL2tlcm5lbC9tNjhrX2tzeW1zLmMKKysrIGIvYXJjaC9tNjhrL2tlcm5lbC9tNjhrX2tzeW1zLmMKQEAgLTEsNjEgKzEsMTAgQEAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9saW5rYWdlLmg+Ci0jaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KLSNpbmNsdWRlIDxsaW51eC9tbS5oPgotI2luY2x1ZGUgPGxpbnV4L3VzZXIuaD4KLSNpbmNsdWRlIDxsaW51eC9lbGZjb3JlLmg+Ci0jaW5jbHVkZSA8bGludXgvaW42Lmg+Ci0jaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+Ci0KLSNpbmNsdWRlIDxhc20vc2V0dXAuaD4KLSNpbmNsdWRlIDxhc20vbWFjaGRlcC5oPgotI2luY2x1ZGUgPGFzbS9wZ2FsbG9jLmg+Ci0jaW5jbHVkZSA8YXNtL2lycS5oPgotI2luY2x1ZGUgPGFzbS9pby5oPgogI2luY2x1ZGUgPGFzbS9zZW1hcGhvcmUuaD4KLSNpbmNsdWRlIDxhc20vY2hlY2tzdW0uaD4KIAogYXNtbGlua2FnZSBsb25nIGxvbmcgX19hc2hsZGkzIChsb25nIGxvbmcsIGludCk7CiBhc21saW5rYWdlIGxvbmcgbG9uZyBfX2FzaHJkaTMgKGxvbmcgbG9uZywgaW50KTsKIGFzbWxpbmthZ2UgbG9uZyBsb25nIF9fbHNocmRpMyAobG9uZyBsb25nLCBpbnQpOwogYXNtbGlua2FnZSBsb25nIGxvbmcgX19tdWxkaTMgKGxvbmcgbG9uZywgbG9uZyBsb25nKTsKLWV4dGVybiBjaGFyIG02OGtfZGVidWdfZGV2aWNlW107Ci0KLS8qIHBsYXRmb3JtIGRlcGVuZGVudCBzdXBwb3J0ICovCi0KLUVYUE9SVF9TWU1CT0wobTY4a19tYWNodHlwZSk7Ci1FWFBPUlRfU1lNQk9MKG02OGtfY3B1dHlwZSk7Ci1FWFBPUlRfU1lNQk9MKG02OGtfaXMwNDBvcjA2MCk7Ci1FWFBPUlRfU1lNQk9MKG02OGtfcmVhbG51bV9tZW1vcnkpOwotRVhQT1JUX1NZTUJPTChtNjhrX21lbW9yeSk7Ci0jaWZuZGVmIENPTkZJR19TVU4zCi1FWFBPUlRfU1lNQk9MKGNhY2hlX3B1c2gpOwotRVhQT1JUX1NZTUJPTChjYWNoZV9jbGVhcik7Ci0jaWZuZGVmIENPTkZJR19TSU5HTEVfTUVNT1JZX0NIVU5LCi1FWFBPUlRfU1lNQk9MKG1tX3Z0b3ApOwotRVhQT1JUX1NZTUJPTChtbV9wdG92KTsKLUVYUE9SVF9TWU1CT0wobW1fZW5kX29mX2NodW5rKTsKLSNlbHNlCi1FWFBPUlRfU1lNQk9MKG02OGtfbWVtb2Zmc2V0KTsKLSNlbmRpZiAvKiAhQ09ORklHX1NJTkdMRV9NRU1PUllfQ0hVTksgKi8KLUVYUE9SVF9TWU1CT0woX19pb3JlbWFwKTsKLUVYUE9SVF9TWU1CT0woaW91bm1hcCk7Ci1FWFBPUlRfU1lNQk9MKGtlcm5lbF9zZXRfY2FjaGVtb2RlKTsKLSNlbmRpZiAvKiAhQ09ORklHX1NVTjMgKi8KLUVYUE9SVF9TWU1CT0wobTY4a19kZWJ1Z19kZXZpY2UpOwotRVhQT1JUX1NZTUJPTChtYWNoX2h3Y2xrKTsKLUVYUE9SVF9TWU1CT0wobWFjaF9nZXRfc3MpOwotRVhQT1JUX1NZTUJPTChtYWNoX2dldF9ydGNfcGxsKTsKLUVYUE9SVF9TWU1CT0wobWFjaF9zZXRfcnRjX3BsbCk7Ci0jaWZkZWYgQ09ORklHX0lOUFVUX002OEtfQkVFUF9NT0RVTEUKLUVYUE9SVF9TWU1CT0wobWFjaF9iZWVwKTsKLSNlbmRpZgotRVhQT1JUX1NZTUJPTChkdW1wX2ZwdSk7Ci1FWFBPUlRfU1lNQk9MKGR1bXBfdGhyZWFkKTsKLUVYUE9SVF9TWU1CT0woa2VybmVsX3RocmVhZCk7Ci0jaWZkZWYgQ09ORklHX1ZNRQotRVhQT1JUX1NZTUJPTCh2bWVfYnJkdHlwZSk7Ci0jZW5kaWYKIAogLyogVGhlIGZvbGxvd2luZyBhcmUgc3BlY2lhbCBiZWNhdXNlIHRoZXkncmUgbm90IGNhbGxlZAogICAgZXhwbGljaXRseSAodGhlIEMgY29tcGlsZXIgZ2VuZXJhdGVzIHRoZW0pLiAgRm9ydHVuYXRlbHksCmRpZmYgLS1naXQgYS9hcmNoL202OGsva2VybmVsL3Byb2Nlc3MuYyBiL2FyY2gvbTY4ay9rZXJuZWwvcHJvY2Vzcy5jCmluZGV4IDQ1YTQ2NjQuLjk5ZmMxMjIgMTAwNjQ0Ci0tLSBhL2FyY2gvbTY4ay9rZXJuZWwvcHJvY2Vzcy5jCisrKyBiL2FyY2gvbTY4ay9rZXJuZWwvcHJvY2Vzcy5jCkBAIC0xODcsNiArMTg3LDcgQEAKIAlzZXRfZnMgKGZzKTsKIAlyZXR1cm4gcGlkOwogfQorRVhQT1JUX1NZTUJPTChrZXJuZWxfdGhyZWFkKTsKIAogdm9pZCBmbHVzaF90aHJlYWQodm9pZCkKIHsKQEAgLTIyMSwxMyArMjIyLDEzIEBACiB7CiAJdW5zaWduZWQgbG9uZyBjbG9uZV9mbGFnczsKIAl1bnNpZ25lZCBsb25nIG5ld3NwOwotCWludCAqcGFyZW50X3RpZHB0ciwgKmNoaWxkX3RpZHB0cjsKKwlpbnQgX191c2VyICpwYXJlbnRfdGlkcHRyLCAqY2hpbGRfdGlkcHRyOwogCiAJLyogc3lzY2FsbDIgcHV0cyBjbG9uZV9mbGFncyBpbiBkMSBhbmQgdXNwIGluIGQyICovCiAJY2xvbmVfZmxhZ3MgPSByZWdzLT5kMTsKIAluZXdzcCA9IHJlZ3MtPmQyOwotCXBhcmVudF90aWRwdHIgPSAoaW50ICopcmVncy0+ZDM7Ci0JY2hpbGRfdGlkcHRyID0gKGludCAqKXJlZ3MtPmQ0OworCXBhcmVudF90aWRwdHIgPSAoaW50IF9fdXNlciAqKXJlZ3MtPmQzOworCWNoaWxkX3RpZHB0ciA9IChpbnQgX191c2VyICopcmVncy0+ZDQ7CiAJaWYgKCFuZXdzcCkKIAkJbmV3c3AgPSByZHVzcCgpOwogCXJldHVybiBkb19mb3JrKGNsb25lX2ZsYWdzLCBuZXdzcCwgcmVncywgMCwKQEAgLTMxMSw2ICszMTIsNyBAQAogCQk6ICJtZW1vcnkiKTsKIAlyZXR1cm4gMTsKIH0KK0VYUE9SVF9TWU1CT0woZHVtcF9mcHUpOwogCiAvKgogICogZmlsbCBpbiB0aGUgdXNlciBzdHJ1Y3R1cmUgZm9yIGEgY29yZSBkdW1wLi4KQEAgLTM1NywxMSArMzU5LDEyIEBACiAJLyogZHVtcCBmbG9hdGluZyBwb2ludCBzdHVmZiAqLwogCWR1bXAtPnVfZnB2YWxpZCA9IGR1bXBfZnB1IChyZWdzLCAmZHVtcC0+bTY4a2ZwKTsKIH0KK0VYUE9SVF9TWU1CT0woZHVtcF90aHJlYWQpOwogCiAvKgogICogc3lzX2V4ZWN2ZSgpIGV4ZWN1dGVzIGEgbmV3IHByb2dyYW0uCiAgKi8KLWFzbWxpbmthZ2UgaW50IHN5c19leGVjdmUoY2hhciAqbmFtZSwgY2hhciAqKmFyZ3YsIGNoYXIgKiplbnZwKQorYXNtbGlua2FnZSBpbnQgc3lzX2V4ZWN2ZShjaGFyIF9fdXNlciAqbmFtZSwgY2hhciBfX3VzZXIgKiBfX3VzZXIgKmFyZ3YsIGNoYXIgX191c2VyICogX191c2VyICplbnZwKQogewogCWludCBlcnJvcjsKIAljaGFyICogZmlsZW5hbWU7CmRpZmYgLS1naXQgYS9hcmNoL202OGsva2VybmVsL3NldHVwLmMgYi9hcmNoL202OGsva2VybmVsL3NldHVwLmMKaW5kZXggNDJkNWI4NS4uOWFmM2VlMCAxMDA2NDQKLS0tIGEvYXJjaC9tNjhrL2tlcm5lbC9zZXR1cC5jCisrKyBiL2FyY2gvbTY4ay9rZXJuZWwvc2V0dXAuYwpAQCAtNDIsMjcgKzQyLDM3IEBACiAKIHVuc2lnbmVkIGxvbmcgbTY4a19tYWNodHlwZTsKIHVuc2lnbmVkIGxvbmcgbTY4a19jcHV0eXBlOworRVhQT1JUX1NZTUJPTChtNjhrX21hY2h0eXBlKTsKK0VYUE9SVF9TWU1CT0wobTY4a19jcHV0eXBlKTsKIHVuc2lnbmVkIGxvbmcgbTY4a19mcHV0eXBlOwogdW5zaWduZWQgbG9uZyBtNjhrX21tdXR5cGU7CiAjaWZkZWYgQ09ORklHX1ZNRQogdW5zaWduZWQgbG9uZyB2bWVfYnJkdHlwZTsKK0VYUE9SVF9TWU1CT0wodm1lX2JyZHR5cGUpOwogI2VuZGlmCiAKIGludCBtNjhrX2lzMDQwb3IwNjA7CitFWFBPUlRfU1lNQk9MKG02OGtfaXMwNDBvcjA2MCk7CiAKIGV4dGVybiBpbnQgZW5kOwogZXh0ZXJuIHVuc2lnbmVkIGxvbmcgYXZhaWxtZW07CiAKIGludCBtNjhrX251bV9tZW1vcnk7CiBpbnQgbTY4a19yZWFsbnVtX21lbW9yeTsKK0VYUE9SVF9TWU1CT0wobTY4a19yZWFsbnVtX21lbW9yeSk7CisjaWZkZWYgQ09ORklHX1NJTkdMRV9NRU1PUllfQ0hVTksKIHVuc2lnbmVkIGxvbmcgbTY4a19tZW1vZmZzZXQ7CitFWFBPUlRfU1lNQk9MKG02OGtfbWVtb2Zmc2V0KTsKKyNlbmRpZgogc3RydWN0IG1lbV9pbmZvIG02OGtfbWVtb3J5W05VTV9NRU1JTkZPXTsKK0VYUE9SVF9TWU1CT0wobTY4a19tZW1vcnkpOwogCiBzdGF0aWMgc3RydWN0IG1lbV9pbmZvIG02OGtfcmFtZGlzazsKIAogc3RhdGljIGNoYXIgbTY4a19jb21tYW5kX2xpbmVbQ0xfU0laRV07CiAKIGNoYXIgbTY4a19kZWJ1Z19kZXZpY2VbNl0gPSAiIjsKK0VYUE9SVF9TWU1CT0wobTY4a19kZWJ1Z19kZXZpY2UpOwogCiB2b2lkICgqbWFjaF9zY2hlZF9pbml0KSAoaXJxX2hhbmRsZXJfdCBoYW5kbGVyKSBfX2luaXRkYXRhID0gTlVMTDsKIC8qIG1hY2hpbmUgZGVwZW5kZW50IGlycSBmdW5jdGlvbnMgKi8KQEAgLTcyLDEwICs4MiwxNCBAQAogLyogbWFjaGluZSBkZXBlbmRlbnQgdGltZXIgZnVuY3Rpb25zICovCiB1bnNpZ25lZCBsb25nICgqbWFjaF9nZXR0aW1lb2Zmc2V0KSAodm9pZCk7CiBpbnQgKCptYWNoX2h3Y2xrKSAoaW50LCBzdHJ1Y3QgcnRjX3RpbWUqKTsKK0VYUE9SVF9TWU1CT0wobWFjaF9od2Nsayk7CiBpbnQgKCptYWNoX3NldF9jbG9ja19tbXNzKSAodW5zaWduZWQgbG9uZyk7CiB1bnNpZ25lZCBpbnQgKCptYWNoX2dldF9zcykodm9pZCk7CiBpbnQgKCptYWNoX2dldF9ydGNfcGxsKShzdHJ1Y3QgcnRjX3BsbF9pbmZvICopOwogaW50ICgqbWFjaF9zZXRfcnRjX3BsbCkoc3RydWN0IHJ0Y19wbGxfaW5mbyAqKTsKK0VYUE9SVF9TWU1CT0wobWFjaF9nZXRfc3MpOworRVhQT1JUX1NZTUJPTChtYWNoX2dldF9ydGNfcGxsKTsKK0VYUE9SVF9TWU1CT0wobWFjaF9zZXRfcnRjX3BsbCk7CiB2b2lkICgqbWFjaF9yZXNldCkoIHZvaWQgKTsKIHZvaWQgKCptYWNoX2hhbHQpKCB2b2lkICk7CiB2b2lkICgqbWFjaF9wb3dlcl9vZmYpKCB2b2lkICk7CkBAIC04OSw2ICsxMDMsNyBAQAogI2VuZGlmCiAjaWYgZGVmaW5lZChDT05GSUdfSU5QVVRfTTY4S19CRUVQKSB8fCBkZWZpbmVkKENPTkZJR19JTlBVVF9NNjhLX0JFRVBfTU9EVUxFKQogdm9pZCAoKm1hY2hfYmVlcCkodW5zaWduZWQgaW50LCB1bnNpZ25lZCBpbnQpOworRVhQT1JUX1NZTUJPTChtYWNoX2JlZXApOwogI2VuZGlmCiAjaWYgZGVmaW5lZChDT05GSUdfSVNBKSAmJiBkZWZpbmVkKE1VTFRJX0lTQSkKIGludCBpc2FfdHlwZTsKZGlmZiAtLWdpdCBhL2FyY2gvbTY4ay9rZXJuZWwvdHJhcHMuYyBiL2FyY2gvbTY4ay9rZXJuZWwvdHJhcHMuYwppbmRleCA0NTY5NDA2Li43NTlmYTI0NCAxMDA2NDQKLS0tIGEvYXJjaC9tNjhrL2tlcm5lbC90cmFwcy5jCisrKyBiL2FyY2gvbTY4ay9rZXJuZWwvdHJhcHMuYwpAQCAtMzI2LDEzICszMjYsMTMgQEAKIAogCXN3aXRjaCAod2JzICYgV0JTSVpfMDQwKSB7CiAJY2FzZSBCQV9TSVpFX0JZVEU6Ci0JCXJlcyA9IHB1dF91c2VyKHdiZCAmIDB4ZmYsIChjaGFyICopd2JhKTsKKwkJcmVzID0gcHV0X3VzZXIod2JkICYgMHhmZiwgKGNoYXIgX191c2VyICopd2JhKTsKIAkJYnJlYWs7CiAJY2FzZSBCQV9TSVpFX1dPUkQ6Ci0JCXJlcyA9IHB1dF91c2VyKHdiZCAmIDB4ZmZmZiwgKHNob3J0ICopd2JhKTsKKwkJcmVzID0gcHV0X3VzZXIod2JkICYgMHhmZmZmLCAoc2hvcnQgX191c2VyICopd2JhKTsKIAkJYnJlYWs7CiAJY2FzZSBCQV9TSVpFX0xPTkc6Ci0JCXJlcyA9IHB1dF91c2VyKHdiZCwgKGludCAqKXdiYSk7CisJCXJlcyA9IHB1dF91c2VyKHdiZCwgKGludCBfX3VzZXIgKil3YmEpOwogCQlicmVhazsKIAl9CiAKZGlmZiAtLWdpdCBhL2FyY2gvbTY4ay9rZXJuZWwvdm1saW51eC1zdGQubGRzIGIvYXJjaC9tNjhrL2tlcm5lbC92bWxpbnV4LXN0ZC5sZHMKaW5kZXggNjlkMWQzZC4uZDI3OTQ0NSAxMDA2NDQKLS0tIGEvYXJjaC9tNjhrL2tlcm5lbC92bWxpbnV4LXN0ZC5sZHMKKysrIGIvYXJjaC9tNjhrL2tlcm5lbC92bWxpbnV4LXN0ZC5sZHMKQEAgLTU0LDEzICs1NCw3IEBACiAgIF9fc2V0dXBfZW5kID0gLjsKICAgX19pbml0Y2FsbF9zdGFydCA9IC47CiAgIC5pbml0Y2FsbC5pbml0IDogewotCSooLmluaXRjYWxsMS5pbml0KQotCSooLmluaXRjYWxsMi5pbml0KQotCSooLmluaXRjYWxsMy5pbml0KQotCSooLmluaXRjYWxsNC5pbml0KQotCSooLmluaXRjYWxsNS5pbml0KQotCSooLmluaXRjYWxsNi5pbml0KQotCSooLmluaXRjYWxsNy5pbml0KQorCUlOSVRDQUxMUwogICB9CiAgIF9faW5pdGNhbGxfZW5kID0gLjsKICAgX19jb25faW5pdGNhbGxfc3RhcnQgPSAuOwpkaWZmIC0tZ2l0IGEvYXJjaC9tNjhrL2tlcm5lbC92bWxpbnV4LXN1bjMubGRzIGIvYXJjaC9tNjhrL2tlcm5lbC92bWxpbnV4LXN1bjMubGRzCmluZGV4IDY1Y2MzOWMuLjI1NTBiNGEgMTAwNjQ0Ci0tLSBhL2FyY2gvbTY4ay9rZXJuZWwvdm1saW51eC1zdW4zLmxkcworKysgYi9hcmNoL202OGsva2VybmVsL3ZtbGludXgtc3VuMy5sZHMKQEAgLTQ4LDEzICs0OCw3IEBACiAJX19zZXR1cF9lbmQgPSAuOwogCV9faW5pdGNhbGxfc3RhcnQgPSAuOwogCS5pbml0Y2FsbC5pbml0IDogewotCQkqKC5pbml0Y2FsbDEuaW5pdCkKLQkJKiguaW5pdGNhbGwyLmluaXQpCi0JCSooLmluaXRjYWxsMy5pbml0KQotCQkqKC5pbml0Y2FsbDQuaW5pdCkKLQkJKiguaW5pdGNhbGw1LmluaXQpCi0JCSooLmluaXRjYWxsNi5pbml0KQotCQkqKC5pbml0Y2FsbDcuaW5pdCkKKwkJSU5JVENBTExTCiAJfQogCV9faW5pdGNhbGxfZW5kID0gLjsKIAlfX2Nvbl9pbml0Y2FsbF9zdGFydCA9IC47CmRpZmYgLS1naXQgYS9hcmNoL202OGsvbW0va21hcC5jIGIvYXJjaC9tNjhrL21tL2ttYXAuYwppbmRleCBmNDZmMDQ5Li5iNTRlZjE3IDEwMDY0NAotLS0gYS9hcmNoL202OGsvbW0va21hcC5jCisrKyBiL2FyY2gvbTY4ay9tbS9rbWFwLmMKQEAgLTcsNiArNyw3IEBACiAgKgkgICAgIHVzZWQgYnkgb3RoZXIgYXJjaGl0ZWN0dXJlcwkJL1JvbWFuIFppcHBlbAogICovCiAKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9tbS5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgpAQCAtMjE5LDYgKzIyMCw3IEBACiAKIAlyZXR1cm4gKHZvaWQgX19pb21lbSAqKXJldGFkZHI7CiB9CitFWFBPUlRfU1lNQk9MKF9faW9yZW1hcCk7CiAKIC8qCiAgKiBVbm1hcCBhIGlvcmVtYXAoKWVkIHJlZ2lvbiBhZ2FpbgpAQCAtMjM0LDYgKzIzNiw3IEBACiAJZnJlZV9pb19hcmVhKChfX2ZvcmNlIHZvaWQgKilhZGRyKTsKICNlbmRpZgogfQorRVhQT1JUX1NZTUJPTChpb3VubWFwKTsKIAogLyoKICAqIF9faW91bm1hcCB1bm1hcHMgbmVhcmx5IGV2ZXJ5dGhpbmcsIHNvIGJlIGNhcmVmdWwKQEAgLTM2MCwzICszNjMsNCBAQAogCiAJZmx1c2hfdGxiX2FsbCgpOwogfQorRVhQT1JUX1NZTUJPTChrZXJuZWxfc2V0X2NhY2hlbW9kZSk7CmRpZmYgLS1naXQgYS9hcmNoL202OGsvbW0vbWVtb3J5LmMgYi9hcmNoL202OGsvbW0vbWVtb3J5LmMKaW5kZXggYTBjMDk1ZS4uMGY4ODgxMiAxMDA2NDQKLS0tIGEvYXJjaC9tNjhrL21tL21lbW9yeS5jCisrKyBiL2FyY2gvbTY4ay9tbS9tZW1vcnkuYwpAQCAtNCw2ICs0LDcgQEAKICAqICBDb3B5cmlnaHQgKEMpIDE5OTUgIEhhbWlzaCBNYWNkb25hbGQKICAqLwogCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvbW0uaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KQEAgLTE1Nyw5ICsxNTgsOCBAQAogCiAJcmV0dXJuIC0xOwogfQotI2VuZGlmCitFWFBPUlRfU1lNQk9MKG1tX3Z0b3ApOwogCi0jaWZuZGVmIENPTkZJR19TSU5HTEVfTUVNT1JZX0NIVU5LCiB1bnNpZ25lZCBsb25nIG1tX3B0b3YgKHVuc2lnbmVkIGxvbmcgcGFkZHIpCiB7CiAJaW50IGkgPSAwOwpAQCAtMTg1LDYgKzE4NSw3IEBACiAjZW5kaWYKIAlyZXR1cm4gLTE7CiB9CitFWFBPUlRfU1lNQk9MKG1tX3B0b3YpOwogI2VuZGlmCiAKIC8qIGludmFsaWRhdGUgcGFnZSBpbiBib3RoIGNhY2hlcyAqLwpAQCAtMjk4LDYgKzI5OSw3IEBACiAJbWFjaF9sMl9mbHVzaCgwKTsKICNlbmRpZgogfQorRVhQT1JUX1NZTUJPTChjYWNoZV9jbGVhcik7CS8qIHByb2JhYmx5IGNhbiBiZSB1bmV4cG9ydGVkICovCiAKIAogLyoKQEAgLTM1MCw2ICszNTIsNyBAQAogCW1hY2hfbDJfZmx1c2goMSk7CiAjZW5kaWYKIH0KK0VYUE9SVF9TWU1CT0woY2FjaGVfcHVzaCk7CS8qIHByb2JhYmx5IGNhbiBiZSB1bmV4cG9ydGVkICovCiAKICNpZm5kZWYgQ09ORklHX1NJTkdMRV9NRU1PUllfQ0hVTksKIGludCBtbV9lbmRfb2ZfY2h1bmsgKHVuc2lnbmVkIGxvbmcgYWRkciwgaW50IGxlbikKQEAgLTM2MSw0ICszNjQsNSBAQAogCQkJcmV0dXJuIDE7CiAJcmV0dXJuIDA7CiB9CitFWFBPUlRfU1lNQk9MKG1tX2VuZF9vZl9jaHVuayk7CiAjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvbTY4ay9tbS9zdW4za21hcC5jIGIvYXJjaC9tNjhrL21tL3N1bjNrbWFwLmMKaW5kZXggN2YwZDg2Zi4uMWFmMjRjYiAxMDA2NDQKLS0tIGEvYXJjaC9tNjhrL21tL3N1bjNrbWFwLmMKKysrIGIvYXJjaC9tNjhrL21tL3N1bjNrbWFwLmMKQEAgLTgsNiArOCw3IEBACiAgKiBmb3IgbW9yZSBkZXRhaWxzLgogICovCiAKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L21tLmg+CkBAIC01OSw3ICs2MCw3IEBACiAJfQogfQogCi12b2lkICpzdW4zX2lvcmVtYXAodW5zaWduZWQgbG9uZyBwaHlzLCB1bnNpZ25lZCBsb25nIHNpemUsCit2b2lkIF9faW9tZW0gKnN1bjNfaW9yZW1hcCh1bnNpZ25lZCBsb25nIHBoeXMsIHVuc2lnbmVkIGxvbmcgc2l6ZSwKIAkJICAgdW5zaWduZWQgbG9uZyB0eXBlKQogewogCXN0cnVjdCB2bV9zdHJ1Y3QgKmFyZWE7CkBAIC0xMDEsMjIgKzEwMiwyNCBAQAogCQl2aXJ0ICs9IHNlZ19wYWdlcyAqIFBBR0VfU0laRTsKIAl9CiAKLQlyZXR1cm4gKHZvaWQgKilyZXQ7CisJcmV0dXJuICh2b2lkIF9faW9tZW0gKilyZXQ7CiAKIH0KIAogCi12b2lkICpfX2lvcmVtYXAodW5zaWduZWQgbG9uZyBwaHlzLCB1bnNpZ25lZCBsb25nIHNpemUsIGludCBjYWNoZSkKK3ZvaWQgX19pb21lbSAqX19pb3JlbWFwKHVuc2lnbmVkIGxvbmcgcGh5cywgdW5zaWduZWQgbG9uZyBzaXplLCBpbnQgY2FjaGUpCiB7CiAKIAlyZXR1cm4gc3VuM19pb3JlbWFwKHBoeXMsIHNpemUsIFNVTjNfUEFHRV9UWVBFX0lPKTsKIAogfQorRVhQT1JUX1NZTUJPTChfX2lvcmVtYXApOwogCi12b2lkIGlvdW5tYXAodm9pZCAqYWRkcikKK3ZvaWQgaW91bm1hcCh2b2lkIF9faW9tZW0gKmFkZHIpCiB7CiAJdmZyZWUoKHZvaWQgKikoUEFHRV9NQVNLICYgKHVuc2lnbmVkIGxvbmcpYWRkcikpOwogfQorRVhQT1JUX1NZTUJPTChpb3VubWFwKTsKIAogLyogc3VuM19tYXBfdGVzdChhZGRyLCB2YWwpIC0tIFJlYWRzIGEgYnl0ZSBmcm9tIGFkZHIsIHN0b3JpbmcgdG8gdmFsLAogICogdHJhcHBpbmcgdGhlIHBvdGVudGlhbCByZWFkIGZhdWx0LiAgUmV0dXJucyAwIGlmIHRoZSBhY2Nlc3MgZmF1bHRlZCwKZGlmZiAtLWdpdCBhL2FyY2gvbTY4ay9zdW4zL01ha2VmaWxlIGIvYXJjaC9tNjhrL3N1bjMvTWFrZWZpbGUKaW5kZXggNGQ0ZjA2OS4uYmUxYTg0NyAxMDA2NDQKLS0tIGEvYXJjaC9tNjhrL3N1bjMvTWFrZWZpbGUKKysrIGIvYXJjaC9tNjhrL3N1bjMvTWFrZWZpbGUKQEAgLTIsNiArMiw2IEBACiAjIE1ha2VmaWxlIGZvciBMaW51eCBhcmNoL202OGsvc3VuMyBzb3VyY2UgZGlyZWN0b3J5CiAjCiAKLW9iai15CTo9IHN1bjNfa3N5bXMubyBzdW4zaW50cy5vIHN1bjNkdm1hLm8gc2J1cy5vIGlkcHJvbS5vCitvYmoteQk6PSBzdW4zaW50cy5vIHN1bjNkdm1hLm8gc2J1cy5vIGlkcHJvbS5vCiAKIG9iai0kKENPTkZJR19TVU4zKSArPSBjb25maWcubyBtbXVfZW11Lm8gbGVkcy5vIGR2bWEubyBpbnRlcnNpbC5vCmRpZmYgLS1naXQgYS9hcmNoL202OGsvc3VuMy9pZHByb20uYyBiL2FyY2gvbTY4ay9zdW4zL2lkcHJvbS5jCmluZGV4IDAyYzFmZWU2Li5kY2E2YWI2IDEwMDY0NAotLS0gYS9hcmNoL202OGsvc3VuMy9pZHByb20uYworKysgYi9hcmNoL202OGsvc3VuMy9pZHByb20uYwpAQCAtNiw2ICs2LDcgQEAKICAqIFN1bjMvM3ggbW9kZWxzIGFkZGVkIGJ5IERhdmlkIE1vbnJvIChkYXZpZG1AcHNyZy5jcy51c3lkLmVkdS5hdSkKICAqLwogCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CkBAIC0xNiw2ICsxNyw4IEBACiAjaW5jbHVkZSA8YXNtL21hY2hpbmVzLmg+ICAvKiBGdW4gd2l0aCBTdW4gcmVsZWFzZWQgYXJjaGl0ZWN0dXJlcy4gKi8KIAogc3RydWN0IGlkcHJvbSAqaWRwcm9tOworRVhQT1JUX1NZTUJPTChpZHByb20pOworCiBzdGF0aWMgc3RydWN0IGlkcHJvbSBpZHByb21fYnVmZmVyOwogCiAvKiBIZXJlIGlzIHRoZSBtYXN0ZXIgdGFibGUgb2YgU3VuIG1hY2hpbmVzIHdoaWNoIHVzZSBzb21lIGltcGxlbWVudGF0aW9uCmRpZmYgLS1naXQgYS9hcmNoL202OGsvc3VuMy9zdW4zX2tzeW1zLmMgYi9hcmNoL202OGsvc3VuMy9zdW4zX2tzeW1zLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQzZTVhOWEuLjAwMDAwMDAKLS0tIGEvYXJjaC9tNjhrL3N1bjMvc3VuM19rc3ltcy5jCisrKyAvZGV2L251bGwKQEAgLTEsMTMgKzAsMCBAQAotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+Ci0jaW5jbHVkZSA8YXNtL2R2bWEuaD4KLSNpbmNsdWRlIDxhc20vaWRwcm9tLmg+Ci0KLS8qCi0gKiBBZGQgdGhpbmdzIGhlcmUgd2hlbiB5b3UgZmluZCB0aGUgbmVlZCBmb3IgaXQuCi0gKi8KLUVYUE9SVF9TWU1CT0woZHZtYV9tYXBfYWxpZ24pOwotRVhQT1JUX1NZTUJPTChkdm1hX3VubWFwKTsKLUVYUE9SVF9TWU1CT0woZHZtYV9tYWxsb2NfYWxpZ24pOwotRVhQT1JUX1NZTUJPTChkdm1hX2ZyZWUpOwotRVhQT1JUX1NZTUJPTChpZHByb20pOwpkaWZmIC0tZ2l0IGEvYXJjaC9tNjhrL3N1bjMvc3VuM2R2bWEuYyBiL2FyY2gvbTY4ay9zdW4zL3N1bjNkdm1hLmMKaW5kZXggYTJiYzJkYS4uODcwOTY3NyAxMDA2NDQKLS0tIGEvYXJjaC9tNjhrL3N1bjMvc3VuM2R2bWEuYworKysgYi9hcmNoL202OGsvc3VuMy9zdW4zZHZtYS5jCkBAIC02LDYgKzYsNyBAQAogICogQ29udGFpbnMgY29tbW9uIHJvdXRpbmVzIGZvciBzdW4zL3N1bjN4IERWTUEgbWFuYWdlbWVudC4KICAqLwogCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvbW0uaD4KICNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CkBAIC0zMTIsNiArMzEzLDcgQEAKIAlCVUcoKTsKIAlyZXR1cm4gMDsKIH0KK0VYUE9SVF9TWU1CT0woZHZtYV9tYXBfYWxpZ24pOwogCiB2b2lkIGR2bWFfdW5tYXAodm9pZCAqYmFkZHIpCiB7CkBAIC0zMjcsNyArMzI5LDcgQEAKIAlyZXR1cm47CiAKIH0KLQorRVhQT1JUX1NZTUJPTChkdm1hX3VubWFwKTsKIAogdm9pZCAqZHZtYV9tYWxsb2NfYWxpZ24odW5zaWduZWQgbG9uZyBsZW4sIHVuc2lnbmVkIGxvbmcgYWxpZ24pCiB7CkBAIC0zNjcsNiArMzY5LDcgQEAKIAlyZXR1cm4gKHZvaWQgKil2YWRkcjsKIAogfQorRVhQT1JUX1NZTUJPTChkdm1hX21hbGxvY19hbGlnbik7CiAKIHZvaWQgZHZtYV9mcmVlKHZvaWQgKnZhZGRyKQogewpAQCAtMzc0LDMgKzM3Nyw0IEBACiAJcmV0dXJuOwogCiB9CitFWFBPUlRfU1lNQk9MKGR2bWFfZnJlZSk7CmRpZmYgLS1naXQgYS9hcmNoL202OGtub21tdS9rZXJuZWwvc2V0dXAuYyBiL2FyY2gvbTY4a25vbW11L2tlcm5lbC9zZXR1cC5jCmluZGV4IGJkZTk4MTEuLjdiMjE5NTkgMTAwNjQ0Ci0tLSBhL2FyY2gvbTY4a25vbW11L2tlcm5lbC9zZXR1cC5jCisrKyBiL2FyY2gvbTY4a25vbW11L2tlcm5lbC9zZXR1cC5jCkBAIC02Miw3ICs2Miw3IEBACiB2b2lkICgqbWFjaF9rYmRfbGVkcykgKHVuc2lnbmVkIGludCk7CiAvKiBtYWNoaW5lIGRlcGVuZGVudCBpcnEgZnVuY3Rpb25zICovCiB2b2lkICgqbWFjaF9pbml0X0lSUSkgKHZvaWQpOwotaXJxcmV0dXJuX3QgKCooKm1hY2hfZGVmYXVsdF9oYW5kbGVyKVtdKSAoaW50LCB2b2lkICosIHN0cnVjdCBwdF9yZWdzICopOworaXJxX2hhbmRsZXJfdCBtYWNoX2RlZmF1bHRfaGFuZGxlcjsKIGludCAoKm1hY2hfZ2V0X2lycV9saXN0KSAoc3RydWN0IHNlcV9maWxlICosIHZvaWQgKik7CiB2b2lkICgqbWFjaF9wcm9jZXNzX2ludCkgKGludCBpcnEsIHN0cnVjdCBwdF9yZWdzICpmcCk7CiB2b2lkICgqbWFjaF90cmFwX2luaXQpICh2b2lkKTsKZGlmZiAtLWdpdCBhL2FyY2gvbTY4a25vbW11L2tlcm5lbC9zeXNjYWxsdGFibGUuUyBiL2FyY2gvbTY4a25vbW11L2tlcm5lbC9zeXNjYWxsdGFibGUuUwppbmRleCA2MTdlNDNlLi40NjAzZjRmIDEwMDY0NAotLS0gYS9hcmNoL202OGtub21tdS9rZXJuZWwvc3lzY2FsbHRhYmxlLlMKKysrIGIvYXJjaC9tNjhrbm9tbXUva2VybmVsL3N5c2NhbGx0YWJsZS5TCkBAIC0yOTYsMTAgKzI5NiwzOSBAQAogCS5sb25nIHN5c19tcV9ub3RpZnkJLyogMjc1ICovCiAJLmxvbmcgc3lzX21xX2dldHNldGF0dHIKIAkubG9uZyBzeXNfd2FpdGlkCi0JLmxvbmcgc3lzX25pX3N5c2NhbGwJLyogc3lzX3NldGFsdHJvb3QgKi8KLQkubG9uZyBzeXNfbmlfc3lzY2FsbAkvKiBzeXNfYWRkX2tleSAqLwotCS5sb25nIHN5c19uaV9zeXNjYWxsCS8qIDI4MCAqLyAvKiBzeXNfcmVxdWVzdF9rZXkgKi8KLQkubG9uZyBzeXNfbmlfc3lzY2FsbAkvKiBzeXNfa2V5Y3RsICovCisJLmxvbmcgc3lzX25pX3N5c2NhbGwJLyogZm9yIHN5c192c2VydmVyICovCisJLmxvbmcgc3lzX2FkZF9rZXkKKwkubG9uZyBzeXNfcmVxdWVzdF9rZXkJLyogMjgwICovCisJLmxvbmcgc3lzX2tleWN0bAorCS5sb25nIHN5c19pb3ByaW9fc2V0CisJLmxvbmcgc3lzX2lvcHJpb19nZXQKKwkubG9uZyBzeXNfaW5vdGlmeV9pbml0CisJLmxvbmcgc3lzX2lub3RpZnlfYWRkX3dhdGNoCS8qIDI4NSAqLworCS5sb25nIHN5c19pbm90aWZ5X3JtX3dhdGNoCisJLmxvbmcgc3lzX21pZ3JhdGVfcGFnZXMKKwkubG9uZyBzeXNfb3BlbmF0CisJLmxvbmcgc3lzX21rZGlyYXQKKwkubG9uZyBzeXNfbWtub2RhdAkJLyogMjkwICovCisJLmxvbmcgc3lzX2ZjaG93bmF0CisJLmxvbmcgc3lzX2Z1dGltZXNhdAorCS5sb25nIHN5c19mc3RhdGF0NjQKKwkubG9uZyBzeXNfdW5saW5rYXQKKwkubG9uZyBzeXNfcmVuYW1lYXQJCS8qIDI5NSAqLworCS5sb25nIHN5c19saW5rYXQKKwkubG9uZyBzeXNfc3ltbGlua2F0CisJLmxvbmcgc3lzX3JlYWRsaW5rYXQKKwkubG9uZyBzeXNfZmNobW9kYXQKKwkubG9uZyBzeXNfZmFjY2Vzc2F0CQkvKiAzMDAgKi8KKwkubG9uZyBzeXNfbmlfc3lzY2FsbAkJLyogUmVzZXJ2ZWQgZm9yIHBzZWxlY3Q2ICovCisJLmxvbmcgc3lzX25pX3N5c2NhbGwJCS8qIFJlc2VydmVkIGZvciBwcG9sbCAqLworCS5sb25nIHN5c191bnNoYXJlCisJLmxvbmcgc3lzX3NldF9yb2J1c3RfbGlzdAorCS5sb25nIHN5c19nZXRfcm9idXN0X2xpc3QJLyogMzA1ICovCisJLmxvbmcgc3lzX3NwbGljZQorCS5sb25nIHN5c19zeW5jX2ZpbGVfcmFuZ2UKKwkubG9uZyBzeXNfdGVlCisJLmxvbmcgc3lzX3Ztc3BsaWNlCisJLmxvbmcgc3lzX21vdmVfcGFnZXMJCS8qIDMxMCAqLwogCiAJLnJlcHQgTlJfc3lzY2FsbHMtKC4tc3lzX2NhbGxfdGFibGUpLzQKIAkJLmxvbmcgc3lzX25pX3N5c2NhbGwKZGlmZiAtLWdpdCBhL2FyY2gvbTY4a25vbW11L2tlcm5lbC90aW1lLmMgYi9hcmNoL202OGtub21tdS9rZXJuZWwvdGltZS5jCmluZGV4IGM1NjY3YmQuLjkyMjYyNjQgMTAwNjQ0Ci0tLSBhL2FyY2gvbTY4a25vbW11L2tlcm5lbC90aW1lLmMKKysrIGIvYXJjaC9tNjhrbm9tbXUva2VybmVsL3RpbWUuYwpAQCAtNTQsNyArNTQsNyBAQAogCXVwZGF0ZV9wcm9jZXNzX3RpbWVzKHVzZXJfbW9kZShyZWdzKSk7CiAjZW5kaWYKIAlpZiAoY3VycmVudC0+cGlkKQotCQlwcm9maWxlX3RpY2soQ1BVX1BST0ZJTElORywgcmVncyk7CisJCXByb2ZpbGVfdGljayhDUFVfUFJPRklMSU5HKTsKIAogCS8qCiAJICogSWYgd2UgaGF2ZSBhbiBleHRlcm5hbGx5IHN5bmNocm9uaXplZCBMaW51eCBjbG9jaywgdGhlbiB1cGRhdGUKZGlmZiAtLWdpdCBhL2FyY2gvbTY4a25vbW11L2tlcm5lbC92bWxpbnV4Lmxkcy5TIGIvYXJjaC9tNjhrbm9tbXUva2VybmVsL3ZtbGludXgubGRzLlMKaW5kZXggY2NkMmNlYi4uNThhZmE4YiAxMDA2NDQKLS0tIGEvYXJjaC9tNjhrbm9tbXUva2VybmVsL3ZtbGludXgubGRzLlMKKysrIGIvYXJjaC9tNjhrbm9tbXUva2VybmVsL3ZtbGludXgubGRzLlMKQEAgLTE0MCwxMyArMTQwLDcgQEAKIAkJKiguaW5pdC5zZXR1cCkKIAkJX19zZXR1cF9lbmQgPSAuOwogCQlfX2luaXRjYWxsX3N0YXJ0ID0gLjsKLQkJKiguaW5pdGNhbGwxLmluaXQpCi0JCSooLmluaXRjYWxsMi5pbml0KQotCQkqKC5pbml0Y2FsbDMuaW5pdCkKLQkJKiguaW5pdGNhbGw0LmluaXQpCi0JCSooLmluaXRjYWxsNS5pbml0KQotCQkqKC5pbml0Y2FsbDYuaW5pdCkKLQkJKiguaW5pdGNhbGw3LmluaXQpCisJCUlOSVRDQUxMUwogCQlfX2luaXRjYWxsX2VuZCA9IC47CiAJCV9fY29uX2luaXRjYWxsX3N0YXJ0ID0gLjsKIAkJKiguY29uX2luaXRjYWxsLmluaXQpCmRpZmYgLS1naXQgYS9hcmNoL202OGtub21tdS9wbGF0Zm9ybS81MzA3L2ludHMuYyBiL2FyY2gvbTY4a25vbW11L3BsYXRmb3JtLzUzMDcvaW50cy5jCmluZGV4IGI0YjU1MDkuLmE1NzIzOWUgMTAwNjQ0Ci0tLSBhL2FyY2gvbTY4a25vbW11L3BsYXRmb3JtLzUzMDcvaW50cy5jCisrKyBiL2FyY2gvbTY4a25vbW11L3BsYXRmb3JtLzUzMDcvaW50cy5jCkBAIC0zMyw3ICszMyw3IEBACiAvKgogICoJVGhpcyB0YWJsZSBzdG9yZXMgdGhlIGFkZHJlc3MgaW5mbyBmb3IgZWFjaCB2ZWN0b3IgaGFuZGxlci4KICAqLwotaXJxX2hhbmRsZXJfdCBpcnFfbGlzdFtTWVNfSVJRU107CitzdHJ1Y3QgaXJxX2VudHJ5IGlycV9saXN0W1NZU19JUlFTXTsKIAogI2RlZmluZSBOVU1fSVJRX05PREVTIDE2CiBzdGF0aWMgaXJxX25vZGVfdCBub2Rlc1tOVU1fSVJRX05PREVTXTsKQEAgLTQ0LDcgKzQ0LDcgQEAKIHVuc2lnbmVkIGludCBsb2NhbF9iaF9jb3VudFtOUl9DUFVTXTsKIHVuc2lnbmVkIGludCBsb2NhbF9pcnFfY291bnRbTlJfQ1BVU107CiAKLXN0YXRpYyBpcnFyZXR1cm5fdCBkZWZhdWx0X2lycV9oYW5kbGVyKGludCBpcnEsIHZvaWQgKnB0ciwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCitzdGF0aWMgaXJxcmV0dXJuX3QgZGVmYXVsdF9pcnFfaGFuZGxlcihpbnQgaXJxLCB2b2lkICpwdHIpCiB7CiAjaWYgMQogCXByaW50ayhLRVJOX0lORk8gIiVzKCVkKTogZGVmYXVsdCBpcnEgaGFuZGxlciB2ZWM9JWQgWzB4JXhdXG4iLApAQCAtNzAsNyArNzAsNyBAQAogCiAJZm9yIChpID0gMDsgaSA8IFNZU19JUlFTOyBpKyspIHsKIAkJaWYgKG1hY2hfZGVmYXVsdF9oYW5kbGVyKQotCQkJaXJxX2xpc3RbaV0uaGFuZGxlciA9ICgqbWFjaF9kZWZhdWx0X2hhbmRsZXIpW2ldOworCQkJaXJxX2xpc3RbaV0uaGFuZGxlciA9IG1hY2hfZGVmYXVsdF9oYW5kbGVyOwogCQllbHNlCiAJCQlpcnFfbGlzdFtpXS5oYW5kbGVyID0gZGVmYXVsdF9pcnFfaGFuZGxlcjsKIAkJaXJxX2xpc3RbaV0uZmxhZ3MgICA9IElSUV9GTEdfU1REOwpAQCAtMTAwLDcgKzEwMCw3IEBACiAKIGludCByZXF1ZXN0X2lycSgKIAl1bnNpZ25lZCBpbnQgaXJxLAotCWlycXJldHVybl90ICgqaGFuZGxlcikoaW50LCB2b2lkICosIHN0cnVjdCBwdF9yZWdzICopLAorCWlycV9oYW5kbGVyX3QgaGFuZGxlciwKIAl1bnNpZ25lZCBsb25nIGZsYWdzLAogCWNvbnN0IGNoYXIgKmRldm5hbWUsCiAJdm9pZCAqZGV2X2lkKQpAQCAtMTU3LDcgKzE1Nyw3IEBACiAJfQogCiAJaWYgKG1hY2hfZGVmYXVsdF9oYW5kbGVyKQotCQlpcnFfbGlzdFtpcnFdLmhhbmRsZXIgPSAoKm1hY2hfZGVmYXVsdF9oYW5kbGVyKVtpcnFdOworCQlpcnFfbGlzdFtpcnFdLmhhbmRsZXIgPSBtYWNoX2RlZmF1bHRfaGFuZGxlcjsKIAllbHNlCiAJCWlycV9saXN0W2lycV0uaGFuZGxlciA9IGRlZmF1bHRfaXJxX2hhbmRsZXI7CiAJaXJxX2xpc3RbaXJxXS5mbGFncyAgID0gSVJRX0ZMR19TVEQ7CkBAIC0xNjgsOCArMTY4LDcgQEAKIEVYUE9SVF9TWU1CT0woZnJlZV9pcnEpOwogCiAKLWludCBzeXNfcmVxdWVzdF9pcnEodW5zaWduZWQgaW50IGlycSwgCi0gICAgICAgICAgICAgICAgICAgIGlycXJldHVybl90ICgqaGFuZGxlcikoaW50LCB2b2lkICosIHN0cnVjdCBwdF9yZWdzICopLCAKK2ludCBzeXNfcmVxdWVzdF9pcnEodW5zaWduZWQgaW50IGlycSwgaXJxX2hhbmRsZXJfdCBoYW5kbGVyLCAKICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyBmbGFncywgY29uc3QgY2hhciAqZGV2bmFtZSwgdm9pZCAqZGV2X2lkKQogewogCWlmIChpcnEgPiBJUlE3KSB7CkBAIC0yMTEsNyArMjEwLDcgQEAKIAkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IFJlbW92aW5nIHByb2JhYmx5IHdyb25nIElSUSAlZCBmcm9tICVzXG4iLAogCQkgICAgICAgX19GVU5DVElPTl9fLCBpcnEsIGlycV9saXN0W2lycV0uZGV2bmFtZSk7CiAKLQlpcnFfbGlzdFtpcnFdLmhhbmRsZXIgPSAoKm1hY2hfZGVmYXVsdF9oYW5kbGVyKVtpcnFdOworCWlycV9saXN0W2lycV0uaGFuZGxlciA9IG1hY2hfZGVmYXVsdF9oYW5kbGVyOwogCWlycV9saXN0W2lycV0uZmxhZ3MgICA9IDA7CiAJaXJxX2xpc3RbaXJxXS5kZXZfaWQgID0gTlVMTDsKIAlpcnFfbGlzdFtpcnFdLmRldm5hbWUgPSBOVUxMOwpAQCAtMjQxLDcgKzI0MCw3IEBACiAJaWYgKHZlYyA+PSBWRUNfSU5UMSAmJiB2ZWMgPD0gVkVDX0lOVDcpIHsKIAkJdmVjIC09IFZFQ19TUFVSOwogCQlrc3RhdF9jcHUoMCkuaXJxc1t2ZWNdKys7Ci0JCWlycV9saXN0W3ZlY10uaGFuZGxlcih2ZWMsIGlycV9saXN0W3ZlY10uZGV2X2lkLCBmcCk7CisJCWlycV9saXN0W3ZlY10uaGFuZGxlcih2ZWMsIGlycV9saXN0W3ZlY10uZGV2X2lkKTsKIAl9IGVsc2UgewogCQlpZiAobWFjaF9wcm9jZXNzX2ludCkKIAkJCW1hY2hfcHJvY2Vzc19pbnQodmVjLCBmcCk7CmRpZmYgLS1naXQgYS9hcmNoL21pcHMvS2NvbmZpZyBiL2FyY2gvbWlwcy9LY29uZmlnCmluZGV4IDE0YWY2Y2MuLjE0NDMwMjQgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9LY29uZmlnCisrKyBiL2FyY2gvbWlwcy9LY29uZmlnCkBAIC00MjUsOSArNDI1LDggQEAKIAlzZWxlY3QgU1dBUF9JT19TUEFDRQogCXNlbGVjdCBTWVNfSEFTX0NQVV9STTcwMDAKIAlzZWxlY3QgU1lTX1NVUFBPUlRTXzMyQklUX0tFUk5FTAotCXNlbGVjdCBTWVNfU1VQUE9SVFNfNjRCSVRfS0VSTkVMCisJc2VsZWN0IFNZU19TVVBQT1JUU182NEJJVF9LRVJORUwgaWYgQlJPS0VOCiAJc2VsZWN0IFNZU19TVVBQT1JUU19CSUdfRU5ESUFOCi0Jc2VsZWN0IEFSQ0hfU1BBUlNFTUVNX0VOQUJMRQogCWhlbHAKIAkgIFRoZSBPY2Vsb3QgaXMgYSBNSVBTLWJhc2VkIFNpbmdsZSBCb2FyZCBDb21wdXRlciAoU0JDKSBtYWRlIGJ5CiAJICBNb21lbnR1bSBDb21wdXRlciA8aHR0cDovL3d3dy5tb21lbmNvLmNvbS8+LgpAQCAtNTYwLDYgKzU1OSw3IEBACiAJc2VsZWN0IFNZU19TVVBQT1JUU182NEJJVF9LRVJORUwKIAlzZWxlY3QgU1lTX1NVUFBPUlRTX0JJR19FTkRJQU4KIAlzZWxlY3QgU1lTX1NVUFBPUlRTX05VTUEKKwlzZWxlY3QgU1lTX1NVUFBPUlRTX1NNUAogCWhlbHAKIAkgIFRoaXMgYXJlIHRoZSBTR0kgT3JpZ2luIDIwMCwgT3JpZ2luIDIwMDAgYW5kIE9ueXggMiBHcmFwaGljcwogCSAgd29ya3N0YXRpb25zLiAgVG8gY29tcGlsZSBhIExpbnV4IGtlcm5lbCB0aGF0IHJ1bnMgb24gdGhlc2UsIHNheSBZCkBAIC0xNjMzLDkgKzE2MzMsNiBAQAogCiBjb25maWcgQVJDSF9TUEFSU0VNRU1fRU5BQkxFCiAJYm9vbAotCi1jb25maWcgQVJDSF9TUEFSU0VNRU1fRU5BQkxFCi0JYm9vbAogCXNlbGVjdCBTUEFSU0VNRU1fU1RBVElDCiAKIGNvbmZpZyBOVU1BCkBAIC0xNjkwLDYgKzE2ODcsNyBAQAogCWRlcGVuZHMgb24gU01QCiAJZGVmYXVsdCAiNjQiIGlmIFNHSV9JUDI3CiAJZGVmYXVsdCAiMiIKKwlkZWZhdWx0ICI4IiBpZiBNSVBTX01UX1NNVEMKIAloZWxwCiAJICBUaGlzIGFsbG93cyB5b3UgdG8gc3BlY2lmeSB0aGUgbWF4aW11bSBudW1iZXIgb2YgQ1BVcyB3aGljaCB0aGlzCiAJICBrZXJuZWwgd2lsbCBzdXBwb3J0LiAgVGhlIG1heGltdW0gc3VwcG9ydGVkIHZhbHVlIGlzIDMyIGZvciAzMi1iaXQKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9NYWtlZmlsZSBiL2FyY2gvbWlwcy9NYWtlZmlsZQppbmRleCAyMTI0MzUwLi5kNTgwZDQ2IDEwMDY0NAotLS0gYS9hcmNoL21pcHMvTWFrZWZpbGUKKysrIGIvYXJjaC9taXBzL01ha2VmaWxlCkBAIC02Myw3ICs2Myw5IEBACiBpZmRlZiBDT05GSUdfQlVJTERfRUxGNjQKIGNmbGFncy15CQkrPSAkKGNhbGwgY2Mtb3B0aW9uLC1tbm8tZXhwbGljaXQtcmVsb2NzKQogZWxzZQotY2ZsYWdzLXkJCSs9ICQoY2FsbCBjYy1vcHRpb24sLW1zeW0zMikKKyMgLW1zeW0zMiBjYW4gbm90IGJlIHVzZWQgZm9yIG1vZHVsZXMgc2luY2UgdGhleSBhcmUgbG9hZGVkIGludG8gWEtTRUcKK0NGTEFHU19NT0RVTEUJCSs9ICQoY2FsbCBjYy1vcHRpb24sLW1uby1leHBsaWNpdC1yZWxvY3MpCitDRkxBR1NfS0VSTkVMCQkrPSAkKGNhbGwgY2Mtb3B0aW9uLC1tc3ltMzIpCiBlbmRpZgogZW5kaWYKIApAQCAtOTEsOCArOTMsMTcgQEAKICMgY2FyZWZ1bGx5IGF2b2lkIHRvIGFkZCBpdCByZWR1bmRhbnRseSBiZWNhdXNlIGdjYyAzLjMvMy40IGNvbXBsYWlucwogIyB3aGVuIGZlZCB0aGUgdG9vbGNoYWluIGRlZmF1bHQhCiAjCi1jZmxhZ3MtJChDT05GSUdfQ1BVX0JJR19FTkRJQU4pCQkrPSAkKHNoZWxsICQoQ0MpIC1kdW1wbWFjaGluZSB8Z3JlcCAtcSAnbWlwcy4qZWwtLionICYmIGVjaG8gLUVCIC1EX19NSVBTRUJfXykKLWNmbGFncy0kKENPTkZJR19DUFVfTElUVExFX0VORElBTikJKz0gJChzaGVsbCAkKENDKSAtZHVtcG1hY2hpbmUgfGdyZXAgLXEgJ21pcHMuKmVsLS4qJyB8fCBlY2hvIC1FTCAtRF9fTUlQU0VMX18pCisjIENlcnRhaW4gZ2NjIHZlcnNpb25zIHVwdG8gZ2NjIDQuMS4xIChwcm9iYWJseSA0LjItc3VidmVyc2lvbiBhcyBvZgorIyAyMDA2LTEwLTEwIGRvbid0IHByb3Blcmx5IGNoYW5nZSB0aGUgdGhlIHByZWRlZmluZWQgc3ltYm9scyBpZiAtRUIgLyAtRUwKKyMgYXJlIHVzZWQsIHNvIHdlIGtsdWRnZSB0aGF0IGhlcmUuICBBIGJ1ZyBoYXMgYmVlbiBmaWxlZCBhdAorIyBodHRwOi8vZ2NjLmdudS5vcmcvYnVnemlsbGEvc2hvd19idWcuY2dpP2lkPTI5NDEzLgorIwordW5kZWYtYWxsICs9IC1VTUlQU0VCIC1VX01JUFNFQiAtVV9fTUlQU0VCIC1VX19NSVBTRUJfXwordW5kZWYtYWxsICs9IC1VTUlQU0VMIC1VX01JUFNFTCAtVV9fTUlQU0VMIC1VX19NSVBTRUxfXworcHJlZGVmLWJlICs9IC1ETUlQU0VCIC1EX01JUFNFQiAtRF9fTUlQU0VCIC1EX19NSVBTRUJfXworcHJlZGVmLWxlICs9IC1ETUlQU0VMIC1EX01JUFNFTCAtRF9fTUlQU0VMIC1EX19NSVBTRUxfXworY2ZsYWdzLSQoQ09ORklHX0NQVV9CSUdfRU5ESUFOKQkJKz0gJChzaGVsbCAkKENDKSAtZHVtcG1hY2hpbmUgfGdyZXAgLXEgJ21pcHMuKmVsLS4qJyAmJiBlY2hvIC1FQiAkKHVuZGVmLWFsbCkgJChwcmVkZWYtYmUpKQorY2ZsYWdzLSQoQ09ORklHX0NQVV9MSVRUTEVfRU5ESUFOKQkrPSAkKHNoZWxsICQoQ0MpIC1kdW1wbWFjaGluZSB8Z3JlcCAtcSAnbWlwcy4qZWwtLionIHx8IGVjaG8gLUVMICQodW5kZWYtYWxsKSAkKHByZWRlZi1sZSkpCiAKIGNmbGFncy0kKENPTkZJR19TQjFYWFhfQ09SRUxJUykJKz0gJChjYWxsIGNjLW9wdGlvbiwtbW5vLXNjaGVkLXByb2xvZykgXAogCQkJCSAgIC1mbm8tb21pdC1mcmFtZS1wb2ludGVyCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvYXUxMDAwL2NvbW1vbi9kYmRtYS5jIGIvYXJjaC9taXBzL2F1MTAwMC9jb21tb24vZGJkbWEuYwppbmRleCBjNGZhZThmLi42MjZkZTQ0IDEwMDY0NAotLS0gYS9hcmNoL21pcHMvYXUxMDAwL2NvbW1vbi9kYmRtYS5jCisrKyBiL2FyY2gvbWlwcy9hdTEwMDAvY29tbW9uL2RiZG1hLmMKQEAgLTg0OSw3ICs4NDksNyBAQAogRVhQT1JUX1NZTUJPTChhdTF4eHhfZGJkbWFfY2hhbl9mcmVlKTsKIAogc3RhdGljIGlycXJldHVybl90Ci1kYmRtYV9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK2RiZG1hX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQpCiB7CiAJdTMyIGludHN0YXQ7CiAJdTMyIGNoYW5faW5kZXg7CmRpZmYgLS1naXQgYS9hcmNoL21pcHMvYXUxMDAwL2NvbW1vbi9wcm9tLmMgYi9hcmNoL21pcHMvYXUxMDAwL2NvbW1vbi9wcm9tLmMKaW5kZXggYjRiMDEwYS4uNmZjZTYwYSAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2F1MTAwMC9jb21tb24vcHJvbS5jCisrKyBiL2FyY2gvbWlwcy9hdTEwMDAvY29tbW9uL3Byb20uYwpAQCAtNDcsNyArNDcsNyBAQAogZXh0ZXJuIGNoYXIgKipwcm9tX2FyZ3YsICoqcHJvbV9lbnZwOwogCiAKLWNoYXIgKiBwcm9tX2dldGNtZGxpbmUodm9pZCkKK2NoYXIgKiBfX2luaXRfb3JfbW9kdWxlIHByb21fZ2V0Y21kbGluZSh2b2lkKQogewogCXJldHVybiAmKGFyY3NfY21kbGluZVswXSk7CiB9CmRpZmYgLS1naXQgYS9hcmNoL21pcHMvYXUxMDAwL2NvbW1vbi9zZXR1cC5jIGIvYXJjaC9taXBzL2F1MTAwMC9jb21tb24vc2V0dXAuYwppbmRleCAzNzdhZTBkLi45MTkxNzJkYiAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2F1MTAwMC9jb21tb24vc2V0dXAuYworKysgYi9hcmNoL21pcHMvYXUxMDAwL2NvbW1vbi9zZXR1cC5jCkBAIC00Myw3ICs0Myw3IEBACiAjaW5jbHVkZSA8YXNtL21hY2gtYXUxeDAwL2F1MTAwMC5oPgogI2luY2x1ZGUgPGFzbS90aW1lLmg+CiAKLWV4dGVybiBjaGFyICogX19pbml0IHByb21fZ2V0Y21kbGluZSh2b2lkKTsKK2V4dGVybiBjaGFyICogcHJvbV9nZXRjbWRsaW5lKHZvaWQpOwogZXh0ZXJuIHZvaWQgX19pbml0IGJvYXJkX3NldHVwKHZvaWQpOwogZXh0ZXJuIHZvaWQgYXUxMDAwX3Jlc3RhcnQoY2hhciAqKTsKIGV4dGVybiB2b2lkIGF1MTAwMF9oYWx0KHZvaWQpOwpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2F1MTAwMC9jb21tb24vdGltZS5jIGIvYXJjaC9taXBzL2F1MTAwMC9jb21tb24vdGltZS5jCmluZGV4IDk0ZjA5MTkuLmZhMWM2MmYgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9hdTEwMDAvY29tbW9uL3RpbWUuYworKysgYi9hcmNoL21pcHMvYXUxMDAwL2NvbW1vbi90aW1lLmMKQEAgLTUzLDkgKzUzLDYgQEAKIGludAlub19hdTF4eHhfMzJraHo7CiBleHRlcm4gaW50IGFsbG93X2F1MWtfd2FpdDsgLyogZGVmYXVsdCBvZmYgZm9yIENQMCBDb3VudGVyICovCiAKLS8qIEN5Y2xlIGNvdW50ZXIgdmFsdWUgYXQgdGhlIHByZXZpb3VzIHRpbWVyIGludGVycnVwdC4uICovCi1zdGF0aWMgdW5zaWduZWQgaW50IHRpbWVyaGkgPSAwLCB0aW1lcmxvID0gMDsKLQogI2lmZGVmIENPTkZJR19QTQogI2lmIEhaIDwgMTAwIHx8IEhaID4gMTAwMAogI2Vycm9yICJ1bnN1cHBvcnRlZCBIWiB2YWx1ZSEgTXVzdCBiZSBpbiBbMTAwLDEwMDBdIgpAQCAtODIsNyArNzksNiBAQAogdm9pZCBtaXBzX3RpbWVyX2ludGVycnVwdCh2b2lkKQogewogCWludCBpcnEgPSA2MzsKLQl1bnNpZ25lZCBsb25nIGNvdW50OwogCiAJaXJxX2VudGVyKCk7CiAJa3N0YXRfdGhpc19jcHUuaXJxc1tpcnFdKys7CkBAIC05MSwxMCArODcsNiBAQAogCQlnb3RvIG51bGw7CiAKIAlkbyB7Ci0JCWNvdW50ID0gcmVhZF9jMF9jb3VudCgpOwotCQl0aW1lcmhpICs9IChjb3VudCA8IHRpbWVybG8pOyAgIC8qIFdyYXAgYXJvdW5kICovCi0JCXRpbWVybG8gPSBjb3VudDsKLQogCQlrc3RhdF90aGlzX2NwdS5pcnFzW2lycV0rKzsKIAkJZG9fdGltZXIoMSk7CiAjaWZuZGVmIENPTkZJR19TTVAKQEAgLTIzMSw3ICsyMjMsNiBAQAogICovCiB1bnNpZ25lZCBsb25nIGNhbF9yNGtvZmYodm9pZCkKIHsKLQl1bnNpZ25lZCBsb25nIGNvdW50OwogCXVuc2lnbmVkIGxvbmcgY3B1X3NwZWVkOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJdW5zaWduZWQgbG9uZyBjb3VudGVyOwpAQCAtMjU4LDcgKzI0OSw3IEBACiAKICNpZiBkZWZpbmVkKENPTkZJR19BVTEwMDBfVVNFMzJLKQogCQl7Ci0JCQl1bnNpZ25lZCBsb25nIHN0YXJ0LCBlbmQ7CisJCQl1bnNpZ25lZCBsb25nIHN0YXJ0LCBlbmQsIGNvdW50OwogCiAJCQlzdGFydCA9IGF1X3JlYWRsKFNZU19SVENSRUFEKTsKIAkJCXN0YXJ0ICs9IDI7CkBAIC0yODIsNyArMjczLDYgQEAKICNlbHNlCiAJCWNwdV9zcGVlZCA9IChhdV9yZWFkbChTWVNfQ1BVUExMKSAmIDB4MDAwMDAwM2YpICoKIAkJCUFVMTAwMF9TUkNfQ0xLOwotCQljb3VudCA9IGNwdV9zcGVlZCAvIDI7CiAjZW5kaWYKIAl9CiAJZWxzZSB7CkBAIC0yOTEsOTggKzI4MSwxNSBAQAogCQkgKiBOT1RFOiBzb21lIG9sZCBzaWxpY29uIGRvZXNuJ3QgYWxsb3cgcmVhZGluZyB0aGUgUExMLgogCQkgKi8KIAkJY3B1X3NwZWVkID0gKGF1X3JlYWRsKFNZU19DUFVQTEwpICYgMHgwMDAwMDAzZikgKiBBVTEwMDBfU1JDX0NMSzsKLQkJY291bnQgPSBjcHVfc3BlZWQgLyAyOwogCQlub19hdTF4eHhfMzJraHogPSAxOwogCX0KLQltaXBzX2hwdF9mcmVxdWVuY3kgPSBjb3VudDsKKwltaXBzX2hwdF9mcmVxdWVuY3kgPSBjcHVfc3BlZWQ7CiAJLy8gRXF1YXRpb246IEJhdWRyYXRlID0gQ1BVIC8gKFNEICogMiAqIENMS0RJViAqIDE2KQogCXNldF9hdTF4MDBfdWFydF9iYXVkX2Jhc2UoY3B1X3NwZWVkIC8gKDIgKiAoKGludCkoYXVfcmVhZGwoU1lTX1BPV0VSQ1RSTCkmMHgwMykgKyAyKSAqIDE2KSk7CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdGltZV9sb2NrLCBmbGFncyk7CiAJcmV0dXJuIChjcHVfc3BlZWQgLyBIWik7CiB9CiAKLS8qIFRoaXMgaXMgZm9yIG1hY2hpbmVzIHdoaWNoIGdlbmVyYXRlIHRoZSBleGFjdCBjbG9jay4gKi8KLSNkZWZpbmUgVVNFQ1NfUEVSX0pJRkZZICgxMDAwMDAwL0haKQotI2RlZmluZSBVU0VDU19QRVJfSklGRllfRlJBQyAoMHgxMDAwMDAwMDBMTCoxMDAwMDAwL0haJjB4ZmZmZmZmZmYpCi0KLXN0YXRpYyB1bnNpZ25lZCBsb25nCi1kaXY2NF8zMih1bnNpZ25lZCBsb25nIHYxLCB1bnNpZ25lZCBsb25nIHYyLCB1bnNpZ25lZCBsb25nIHYzKQotewotCXVuc2lnbmVkIGxvbmcgcjA7Ci0JZG9fZGl2NjRfMzIocjAsIHYxLCB2MiwgdjMpOwotCXJldHVybiByMDsKLX0KLQotc3RhdGljIHVuc2lnbmVkIGxvbmcgZG9fZmFzdF9jcDBfZ2V0dGltZW9mZnNldCh2b2lkKQotewotCXUzMiBjb3VudDsKLQl1bnNpZ25lZCBsb25nIHJlcywgdG1wOwotCXVuc2lnbmVkIGxvbmcgcjA7Ci0KLQkvKiBMYXN0IGppZmZ5IHdoZW4gZG9fZmFzdF9nZXR0aW1lb2Zmc2V0KCkgd2FzIGNhbGxlZC4gKi8KLQlzdGF0aWMgdW5zaWduZWQgbG9uZyBsYXN0X2ppZmZpZXM9MDsKLQl1bnNpZ25lZCBsb25nIHF1b3RpZW50OwotCi0JLyoKLQkgKiBDYWNoZWQgIjEvKGNsb2NrcyBwZXIgdXNlYykqMl4zMiIgdmFsdWUuCi0JICogSXQgaGFzIHRvIGJlIHJlY2FsY3VsYXRlZCBvbmNlIGVhY2ggamlmZnkuCi0JICovCi0Jc3RhdGljIHVuc2lnbmVkIGxvbmcgY2FjaGVkX3F1b3RpZW50PTA7Ci0KLQl0bXAgPSBqaWZmaWVzOwotCi0JcXVvdGllbnQgPSBjYWNoZWRfcXVvdGllbnQ7Ci0KLQlpZiAodG1wICYmIGxhc3RfamlmZmllcyAhPSB0bXApIHsKLQkJbGFzdF9qaWZmaWVzID0gdG1wOwotCQlpZiAobGFzdF9qaWZmaWVzICE9IDApIHsKLQkJCXIwID0gZGl2NjRfMzIodGltZXJoaSwgdGltZXJsbywgdG1wKTsKLQkJCXF1b3RpZW50ID0gZGl2NjRfMzIoVVNFQ1NfUEVSX0pJRkZZLCBVU0VDU19QRVJfSklGRllfRlJBQywgcjApOwotCQkJY2FjaGVkX3F1b3RpZW50ID0gcXVvdGllbnQ7Ci0JCX0KLQl9Ci0KLQkvKiBHZXQgbGFzdCB0aW1lciB0aWNrIGluIGFic29sdXRlIGtlcm5lbCB0aW1lICovCi0JY291bnQgPSByZWFkX2MwX2NvdW50KCk7Ci0KLQkvKiAuLiByZWxhdGl2ZSB0byBwcmV2aW91cyBqaWZmeSAoMzIgYml0cyBpcyBlbm91Z2gpICovCi0JY291bnQgLT0gdGltZXJsbzsKLQotCV9fYXNtX18oIm11bHR1XHQlMSwlMlxuXHQiCi0JCSJtZmhpXHQlMCIKLQkJOiAiPXIiIChyZXMpCi0JCTogInIiIChjb3VudCksICJyIiAocXVvdGllbnQpCi0JCTogImhpIiwgImxvIiwgR0NDX1JFR19BQ0NVTSk7Ci0KLQkvKgotCSAqIER1ZSB0byBwb3NzaWJsZSBqaWZmaWVzIGluY29uc2lzdGVuY2llcywgd2UgbmVlZCB0byBjaGVjawotCSAqIHRoZSByZXN1bHQgc28gdGhhdCB3ZSdsbCBnZXQgYSB0aW1lciB0aGF0IGlzIG1vbm90b25pYy4KLQkgKi8KLQlpZiAocmVzID49IFVTRUNTX1BFUl9KSUZGWSkKLQkJcmVzID0gVVNFQ1NfUEVSX0pJRkZZLTE7Ci0KLQlyZXR1cm4gcmVzOwotfQotCi0jaWZkZWYgQ09ORklHX1BNCi1zdGF0aWMgdW5zaWduZWQgbG9uZyBkb19mYXN0X3BtX2dldHRpbWVvZmZzZXQodm9pZCkKLXsKLQl1bnNpZ25lZCBsb25nIHBjMDsKLQl1bnNpZ25lZCBsb25nIG9mZnNldDsKLQotCXBjMCA9IGF1X3JlYWRsKFNZU19UT1lSRUFEKTsKLQlhdV9zeW5jKCk7Ci0Jb2Zmc2V0ID0gcGMwIC0gbGFzdF9wYzA7Ci0JaWYgKG9mZnNldCA+IDIqTUFUQ0gyMF9JTkMpIHsKLQkJcHJpbnRrKCJodWdlIG9mZnNldCAleCwgbGFzdF9wYzAgJXggbGFzdF9tYXRjaDIwICV4IHBjMCAleFxuIiwKLQkJCQkodW5zaWduZWQpb2Zmc2V0LCAodW5zaWduZWQpbGFzdF9wYzAsCi0JCQkJKHVuc2lnbmVkKWxhc3RfbWF0Y2gyMCwgKHVuc2lnbmVkKXBjMCk7Ci0JfQotCW9mZnNldCA9ICh1bnNpZ25lZCBsb25nKSgob2Zmc2V0ICogMzA1KSAvIDEwKTsKLQlyZXR1cm4gb2Zmc2V0OwotfQotI2VuZGlmCi0KIHZvaWQgX19pbml0IHBsYXRfdGltZXJfc2V0dXAoc3RydWN0IGlycWFjdGlvbiAqaXJxKQogewogCXVuc2lnbmVkIGludCBlc3RfZnJlcTsKQEAgLTQyMCw3ICszMjcsNiBAQAogCQl1bnNpZ25lZCBpbnQgYzBfc3RhdHVzOwogCiAJCXByaW50aygiV0FSTklORzogbm8gMzJLSHogY2xvY2sgZm91bmQuXG4iKTsKLQkJZG9fZ2V0dGltZW9mZnNldCA9IGRvX2Zhc3RfY3AwX2dldHRpbWVvZmZzZXQ7CiAKIAkJLyogRW5zdXJlIHdlIGdldCBDUE9fQ09VTlRFUiBpbnRlcnJ1cHRzLgogCQkqLwpAQCAtNDQ1LDE5ICszNTEsMTEgQEAKIAkJd2hpbGUgKGF1X3JlYWRsKFNZU19DT1VOVEVSX0NOVFJMKSAmIFNZU19DTlRSTF9NMjApOwogCQlzdGFydHVwX21hdGNoMjBfaW50ZXJydXB0KGNvdW50ZXIwX2lycSk7CiAKLQkJZG9fZ2V0dGltZW9mZnNldCA9IGRvX2Zhc3RfcG1fZ2V0dGltZW9mZnNldDsKLQogCQkvKiBXZSBjYW4gdXNlIHRoZSByZWFsICd3YWl0JyBpbnN0cnVjdGlvbi4KIAkJKi8KIAkJYWxsb3dfYXUxa193YWl0ID0gMTsKIAl9CiAKLSNlbHNlCi0JLyogV2UgaGF2ZSB0byBkbyB0aGlzIGhlcmUgaW5zdGVhZCBvZiBpbiB0aW1lcl9pbml0IGJlY2F1c2UKLQkgKiB0aGUgZ2VuZXJpYyBjb2RlIGluIGFyY2gvbWlwcy9rZXJuZWwvdGltZS5jIHdpbGwgd3JpdGUKLQkgKiBvdmVyIG91ciBmdW5jdGlvbiBwb2ludGVyLgotCSAqLwotCWRvX2dldHRpbWVvZmZzZXQgPSBkb19mYXN0X2NwMF9nZXR0aW1lb2Zmc2V0OwogI2VuZGlmCiB9CiAKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9jb25maWdzL2JpZ3N1cl9kZWZjb25maWcgYi9hcmNoL21pcHMvY29uZmlncy9iaWdzdXJfZGVmY29uZmlnCmluZGV4IGM2YTAxNTkuLmJhM2JmNzMgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9jb25maWdzL2JpZ3N1cl9kZWZjb25maWcKKysrIGIvYXJjaC9taXBzL2NvbmZpZ3MvYmlnc3VyX2RlZmNvbmZpZwpAQCAtMSw3ICsxLDcgQEAKICMKICMgQXV0b21hdGljYWxseSBnZW5lcmF0ZWQgbWFrZSBjb25maWc6IGRvbid0IGVkaXQKLSMgTGludXgga2VybmVsIHZlcnNpb246IDIuNi4xOC1yYzEKLSMgVGh1IEp1bCAgNiAxMDowMjo1OCAyMDA2CisjIExpbnV4IGtlcm5lbCB2ZXJzaW9uOiAyLjYuMTktcmMxCisjIFdlZCBPY3QgMTEgMDE6NDE6NDEgMjAwNgogIwogQ09ORklHX01JUFM9eQogCkBAIC0yNSw4ICsyNSw2IEBACiAjIENPTkZJR19NSVBTX0NPQkFMVCBpcyBub3Qgc2V0CiAjIENPTkZJR19NQUNIX0RFQ1NUQVRJT04gaXMgbm90IHNldAogIyBDT05GSUdfTUlQU19FVjY0MTIwIGlzIG5vdCBzZXQKLSMgQ09ORklHX01JUFNfSVZSIGlzIG5vdCBzZXQKLSMgQ09ORklHX01JUFNfSVRFODE3MiBpcyBub3Qgc2V0CiAjIENPTkZJR19NQUNIX0pBWlogaXMgbm90IHNldAogIyBDT05GSUdfTEFTQVQgaXMgbm90IHNldAogIyBDT05GSUdfTUlQU19BVExBUyBpcyBub3Qgc2V0CkBAIC04Myw2ICs4MSw3IEBACiBDT05GSUdfR0VORVJJQ19GSU5EX05FWFRfQklUPXkKIENPTkZJR19HRU5FUklDX0hXRUlHSFQ9eQogQ09ORklHX0dFTkVSSUNfQ0FMSUJSQVRFX0RFTEFZPXkKK0NPTkZJR19HRU5FUklDX1RJTUU9eQogQ09ORklHX1NDSEVEX05PX05PX09NSVRfRlJBTUVfUE9JTlRFUj15CiBDT05GSUdfRE1BX0NPSEVSRU5UPXkKIENPTkZJR19DUFVfQklHX0VORElBTj15CkBAIC0xMzIsOCArMTMxLDggQEAKICMgQ09ORklHX1BBR0VfU0laRV82NEtCIGlzIG5vdCBzZXQKICMgQ09ORklHX1NJQllURV9ETUFfUEFHRU9QUyBpcyBub3Qgc2V0CiBDT05GSUdfTUlQU19NVF9ESVNBQkxFRD15Ci0jIENPTkZJR19NSVBTX01UX1NNVEMgaXMgbm90IHNldAogIyBDT05GSUdfTUlQU19NVF9TTVAgaXMgbm90IHNldAorIyBDT05GSUdfTUlQU19NVF9TTVRDIGlzIG5vdCBzZXQKICMgQ09ORklHX01JUFNfVlBFX0xPQURFUiBpcyBub3Qgc2V0CiBDT05GSUdfQ1BVX0hBU19MTFNDPXkKIENPTkZJR19DUFVfSEFTX1NZTkM9eQpAQCAtMTg1LDkgKzE4NCwxMSBAQAogQ09ORklHX0xPQ0FMVkVSU0lPTl9BVVRPPXkKIENPTkZJR19TV0FQPXkKIENPTkZJR19TWVNWSVBDPXkKKyMgQ09ORklHX0lQQ19OUyBpcyBub3Qgc2V0CiAjIENPTkZJR19QT1NJWF9NUVVFVUUgaXMgbm90IHNldAogIyBDT05GSUdfQlNEX1BST0NFU1NfQUNDVCBpcyBub3Qgc2V0Ci1DT05GSUdfU1lTQ1RMPXkKKyMgQ09ORklHX1RBU0tTVEFUUyBpcyBub3Qgc2V0CisjIENPTkZJR19VVFNfTlMgaXMgbm90IHNldAogIyBDT05GSUdfQVVESVQgaXMgbm90IHNldAogQ09ORklHX0lLQ09ORklHPXkKIENPTkZJR19JS0NPTkZJR19QUk9DPXkKQEAgLTE5NSw3ICsxOTYsOSBAQAogIyBDT05GSUdfUkVMQVkgaXMgbm90IHNldAogQ09ORklHX0lOSVRSQU1GU19TT1VSQ0U9IiIKICMgQ09ORklHX0NDX09QVElNSVpFX0ZPUl9TSVpFIGlzIG5vdCBzZXQKK0NPTkZJR19TWVNDVEw9eQogQ09ORklHX0VNQkVEREVEPXkKKyMgQ09ORklHX1NZU0NUTF9TWVNDQUxMIGlzIG5vdCBzZXQKIENPTkZJR19LQUxMU1lNUz15CiAjIENPTkZJR19LQUxMU1lNU19BTEwgaXMgbm90IHNldAogIyBDT05GSUdfS0FMTFNZTVNfRVhUUkFfUEFTUyBpcyBub3Qgc2V0CkBAIC0yMDQsMTIgKzIwNywxMiBAQAogQ09ORklHX0JVRz15CiBDT05GSUdfRUxGX0NPUkU9eQogQ09ORklHX0JBU0VfRlVMTD15Ci1DT05GSUdfUlRfTVVURVhFUz15CiBDT05GSUdfRlVURVg9eQogQ09ORklHX0VQT0xMPXkKIENPTkZJR19TSE1FTT15CiBDT05GSUdfU0xBQj15CiBDT05GSUdfVk1fRVZFTlRfQ09VTlRFUlM9eQorQ09ORklHX1JUX01VVEVYRVM9eQogIyBDT05GSUdfVElOWV9TSE1FTSBpcyBub3Qgc2V0CiBDT05GSUdfQkFTRV9TTUFMTD0wCiAjIENPTkZJR19TTE9CIGlzIG5vdCBzZXQKQEAgLTIyOCw2ICsyMzEsNyBAQAogIwogIyBCbG9jayBsYXllcgogIworQ09ORklHX0JMT0NLPXkKICMgQ09ORklHX0JMS19ERVZfSU9fVFJBQ0UgaXMgbm90IHNldAogCiAjCkBAIC0yNDksMTggKzI1MywxNyBAQAogQ09ORklHX0hXX0hBU19QQ0k9eQogQ09ORklHX1BDST15CiBDT05GSUdfUENJX0RPTUFJTlM9eQorIyBDT05GSUdfUENJX01VTFRJVEhSRUFEX1BST0JFIGlzIG5vdCBzZXQKIENPTkZJR19QQ0lfREVCVUc9eQogQ09ORklHX01NVT15CiAKICMKICMgUENDQVJEIChQQ01DSUEvQ2FyZEJ1cykgc3VwcG9ydAogIwotIyBDT05GSUdfUENDQVJEIGlzIG5vdCBzZXQKIAogIwogIyBQQ0kgSG90cGx1ZyBTdXBwb3J0CiAjCi0jIENPTkZJR19IT1RQTFVHX1BDSSBpcyBub3Qgc2V0CiAKICMKICMgRXhlY3V0YWJsZSBmaWxlIGZvcm1hdHMKQEAgLTI3MSw3ICsyNzQsNyBAQAogQ09ORklHX01JUFMzMl9DT01QQVQ9eQogQ09ORklHX0NPTVBBVD15CiBDT05GSUdfTUlQUzMyX08zMj15Ci0jIENPTkZJR19NSVBTMzJfTjMyIGlzIG5vdCBzZXQKK0NPTkZJR19NSVBTMzJfTjMyPXkKIENPTkZJR19CSU5GTVRfRUxGMzI9eQogCiAjCkBAIC0yODgsNiArMjkxLDcgQEAKIENPTkZJR19VTklYPXkKIENPTkZJR19YRlJNPXkKIENPTkZJR19YRlJNX1VTRVI9bQorIyBDT05GSUdfWEZSTV9TVUJfUE9MSUNZIGlzIG5vdCBzZXQKIENPTkZJR19ORVRfS0VZPXkKIENPTkZJR19JTkVUPXkKICMgQ09ORklHX0lQX01VTFRJQ0FTVCBpcyBub3Qgc2V0CkBAIC0zMDgsMTAgKzMxMiwxMiBAQAogIyBDT05GSUdfSU5FVF9UVU5ORUwgaXMgbm90IHNldAogQ09ORklHX0lORVRfWEZSTV9NT0RFX1RSQU5TUE9SVD1tCiBDT05GSUdfSU5FVF9YRlJNX01PREVfVFVOTkVMPW0KK0NPTkZJR19JTkVUX1hGUk1fTU9ERV9CRUVUPXkKIENPTkZJR19JTkVUX0RJQUc9eQogQ09ORklHX0lORVRfVENQX0RJQUc9eQogIyBDT05GSUdfVENQX0NPTkdfQURWQU5DRUQgaXMgbm90IHNldAotQ09ORklHX1RDUF9DT05HX0JJQz15CitDT05GSUdfVENQX0NPTkdfQ1VCSUM9eQorQ09ORklHX0RFRkFVTFRfVENQX0NPTkc9ImN1YmljIgogIyBDT05GSUdfSVBWNiBpcyBub3Qgc2V0CiAjIENPTkZJR19JTkVUNl9YRlJNX1RVTk5FTCBpcyBub3Qgc2V0CiAjIENPTkZJR19JTkVUNl9UVU5ORUwgaXMgbm90IHNldApAQCAtMzQxLDcgKzM0Nyw2IEBACiAjIENPTkZJR19BVEFMSyBpcyBub3Qgc2V0CiAjIENPTkZJR19YMjUgaXMgbm90IHNldAogIyBDT05GSUdfTEFQQiBpcyBub3Qgc2V0Ci0jIENPTkZJR19ORVRfRElWRVJUIGlzIG5vdCBzZXQKICMgQ09ORklHX0VDT05FVCBpcyBub3Qgc2V0CiAjIENPTkZJR19XQU5fUk9VVEVSIGlzIG5vdCBzZXQKIApAQCAtMzY4LDcgKzM3Myw2IEBACiAjCiBDT05GSUdfU1RBTkRBTE9ORT15CiBDT05GSUdfUFJFVkVOVF9GSVJNV0FSRV9CVUlMRD15Ci0jIENPTkZJR19GV19MT0FERVIgaXMgbm90IHNldAogIyBDT05GSUdfREVCVUdfRFJJVkVSIGlzIG5vdCBzZXQKICMgQ09ORklHX1NZU19IWVBFUlZJU09SIGlzIG5vdCBzZXQKIApAQCAtNDA0LDcgKzQwOCw3IEBACiBDT05GSUdfQkxLX0RFVl9OQkQ9bQogIyBDT05GSUdfQkxLX0RFVl9TWDggaXMgbm90IHNldAogIyBDT05GSUdfQkxLX0RFVl9SQU0gaXMgbm90IHNldAotIyBDT05GSUdfQkxLX0RFVl9JTklUUkQgaXMgbm90IHNldAorQ09ORklHX0JMS19ERVZfSU5JVFJEPXkKICMgQ09ORklHX0NEUk9NX1BLVENEVkQgaXMgbm90IHNldAogIyBDT05GSUdfQVRBX09WRVJfRVRIIGlzIG5vdCBzZXQKIApAQCAtNDEyLDYgKzQxNiw3IEBACiAjIEFUQS9BVEFQSS9NRk0vUkxMIHN1cHBvcnQKICMKIENPTkZJR19JREU9eQorQ09ORklHX0lERV9NQVhfSFdJRlM9NAogQ09ORklHX0JMS19ERVZfSURFPXkKIAogIwpAQCAtNDI5LDEwICs0MzQsNDAgQEAKICMgSURFIGNoaXBzZXQgc3VwcG9ydC9idWdmaXhlcwogIwogQ09ORklHX0lERV9HRU5FUklDPXkKLSMgQ09ORklHX0JMS19ERVZfSURFUENJIGlzIG5vdCBzZXQKK0NPTkZJR19CTEtfREVWX0lERVBDST15CisjIENPTkZJR19JREVQQ0lfU0hBUkVfSVJRIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfT0ZGQk9BUkQgaXMgbm90IHNldAorQ09ORklHX0JMS19ERVZfR0VORVJJQz15CisjIENPTkZJR19CTEtfREVWX09QVEk2MjEgaXMgbm90IHNldAorQ09ORklHX0JMS19ERVZfSURFRE1BX1BDST15CisjIENPTkZJR19CTEtfREVWX0lERURNQV9GT1JDRUQgaXMgbm90IHNldAorIyBDT05GSUdfSURFRE1BX1BDSV9BVVRPIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfQUVDNjJYWCBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX0FMSTE1WDMgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9BTUQ3NFhYIGlzIG5vdCBzZXQKK0NPTkZJR19CTEtfREVWX0NNRDY0WD15CisjIENPTkZJR19CTEtfREVWX1RSSUZMRVggaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9DWTgyQzY5MyBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX0NTNTUyMCBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX0NTNTUzMCBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX0hQVDM0WCBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX0hQVDM2NiBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX0pNSUNST04gaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9TQzEyMDAgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9QSUlYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfSVQ4MjFYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfTlM4NzQxNSBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX1BEQzIwMlhYX09MRCBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX1BEQzIwMlhYX05FVyBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX1NWV0tTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfU0lJTUFHRSBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX1NMQzkwRTY2IGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfVFJNMjkwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfVklBODJDWFhYIGlzIG5vdCBzZXQKICMgQ09ORklHX0JMS19ERVZfSURFX1NXQVJNIGlzIG5vdCBzZXQKICMgQ09ORklHX0lERV9BUk0gaXMgbm90IHNldAotIyBDT05GSUdfQkxLX0RFVl9JREVETUEgaXMgbm90IHNldAorQ09ORklHX0JMS19ERVZfSURFRE1BPXkKKyMgQ09ORklHX0lERURNQV9JVkIgaXMgbm90IHNldAogIyBDT05GSUdfSURFRE1BX0FVVE8gaXMgbm90IHNldAogIyBDT05GSUdfQkxLX0RFVl9IRCBpcyBub3Qgc2V0CiAKQEAgLTQ0MSw2ICs0NzYsMTIgQEAKICMKICMgQ09ORklHX1JBSURfQVRUUlMgaXMgbm90IHNldAogIyBDT05GSUdfU0NTSSBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX05FVExJTksgaXMgbm90IHNldAorCisjCisjIFNlcmlhbCBBVEEgKHByb2QpIGFuZCBQYXJhbGxlbCBBVEEgKGV4cGVyaW1lbnRhbCkgZHJpdmVycworIworIyBDT05GSUdfQVRBIGlzIG5vdCBzZXQKIAogIwogIyBNdWx0aS1kZXZpY2Ugc3VwcG9ydCAoUkFJRCBhbmQgTFZNKQpAQCAtNTE2LDYgKzU1Nyw3IEBACiAjIENPTkZJR19TSzk4TElOIGlzIG5vdCBzZXQKICMgQ09ORklHX1RJR09OMyBpcyBub3Qgc2V0CiAjIENPTkZJR19CTlgyIGlzIG5vdCBzZXQKKyMgQ09ORklHX1FMQTNYWFggaXMgbm90IHNldAogCiAjCiAjIEV0aGVybmV0ICgxMDAwMCBNYml0KQpAQCAtNjUwLDcgKzY5Miw2IEBACiAjIENPTkZJR19JMkNfQUxHT0JJVCBpcyBub3Qgc2V0CiAjIENPTkZJR19JMkNfQUxHT1BDRiBpcyBub3Qgc2V0CiAjIENPTkZJR19JMkNfQUxHT1BDQSBpcyBub3Qgc2V0Ci1DT05GSUdfSTJDX0FMR09fU0lCWVRFPXkKIAogIwogIyBJMkMgSGFyZHdhcmUgQnVzIHN1cHBvcnQKQEAgLTcxMiwxMiArNzUzLDEyIEBACiAjCiAjIE1pc2MgZGV2aWNlcwogIworIyBDT05GSUdfVElGTV9DT1JFIGlzIG5vdCBzZXQKIAogIwogIyBNdWx0aW1lZGlhIGRldmljZXMKICMKICMgQ09ORklHX1ZJREVPX0RFViBpcyBub3Qgc2V0Ci1DT05GSUdfVklERU9fVjRMMj15CiAKICMKICMgRGlnaXRhbCBWaWRlbyBCcm9hZGNhc3RpbmcgRGV2aWNlcwpAQCAtNzI5LDYgKzc3MCw3IEBACiAjCiAjIENPTkZJR19GSVJNV0FSRV9FRElEIGlzIG5vdCBzZXQKICMgQ09ORklHX0ZCIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JBQ0tMSUdIVF9MQ0RfU1VQUE9SVCBpcyBub3Qgc2V0CiAKICMKICMgU291bmQKQEAgLTgxMSw2ICs4NTMsNyBAQAogIyBDT05GSUdfSkZTX0ZTIGlzIG5vdCBzZXQKIENPTkZJR19GU19QT1NJWF9BQ0w9eQogIyBDT05GSUdfWEZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0dGUzJfRlMgaXMgbm90IHNldAogIyBDT05GSUdfT0NGUzJfRlMgaXMgbm90IHNldAogIyBDT05GSUdfTUlOSVhfRlMgaXMgbm90IHNldAogIyBDT05GSUdfUk9NRlNfRlMgaXMgbm90IHNldApAQCAtODQwLDggKzg4MywxMCBAQAogIwogQ09ORklHX1BST0NfRlM9eQogQ09ORklHX1BST0NfS0NPUkU9eQorQ09ORklHX1BST0NfU1lTQ1RMPXkKIENPTkZJR19TWVNGUz15Ci0jIENPTkZJR19UTVBGUyBpcyBub3Qgc2V0CitDT05GSUdfVE1QRlM9eQorIyBDT05GSUdfVE1QRlNfUE9TSVhfQUNMIGlzIG5vdCBzZXQKICMgQ09ORklHX0hVR0VUTEJfUEFHRSBpcyBub3Qgc2V0CiBDT05GSUdfUkFNRlM9eQogIyBDT05GSUdfQ09ORklHRlNfRlMgaXMgbm90IHNldApAQCAtODUxLDYgKzg5Niw3IEBACiAjCiAjIENPTkZJR19BREZTX0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX0FGRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfRUNSWVBUX0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX0hGU19GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19IRlNQTFVTX0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX0JFRlNfRlMgaXMgbm90IHNldApAQCAtODgxLDcgKzkyNyw2IEBACiAjIENPTkZJR19SUENTRUNfR1NTX1NQS00zIGlzIG5vdCBzZXQKICMgQ09ORklHX1NNQl9GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19DSUZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0NJRlNfREVCVUcyIGlzIG5vdCBzZXQKICMgQ09ORklHX05DUF9GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19DT0RBX0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX0FGU19GUyBpcyBub3Qgc2V0CkBAIC04OTksNiArOTQ0LDEwIEBACiAjIENPTkZJR19OTFMgaXMgbm90IHNldAogCiAjCisjIERpc3RyaWJ1dGVkIExvY2sgTWFuYWdlcgorIworCisjCiAjIFByb2ZpbGluZyBzdXBwb3J0CiAjCiAjIENPTkZJR19QUk9GSUxJTkcgaXMgbm90IHNldApAQCAtOTA3LDcgKzk1Niw4IEBACiAjIEtlcm5lbCBoYWNraW5nCiAjCiBDT05GSUdfVFJBQ0VfSVJRRkxBR1NfU1VQUE9SVD15Ci1DT05GSUdfUFJJTlRLX1RJTUU9eQorIyBDT05GSUdfUFJJTlRLX1RJTUUgaXMgbm90IHNldAorQ09ORklHX0VOQUJMRV9NVVNUX0NIRUNLPXkKIENPTkZJR19NQUdJQ19TWVNSUT15CiAjIENPTkZJR19VTlVTRURfU1lNQk9MUyBpcyBub3Qgc2V0CiBDT05GSUdfREVCVUdfS0VSTkVMPXkKQEAgLTkyMCwxMiArOTcwLDE1IEBACiAjIENPTkZJR19ERUJVR19TUElOTE9DSyBpcyBub3Qgc2V0CiBDT05GSUdfREVCVUdfTVVURVhFUz15CiAjIENPTkZJR19ERUJVR19SV1NFTVMgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfTE9DS19BTExPQyBpcyBub3Qgc2V0CisjIENPTkZJR19QUk9WRV9MT0NLSU5HIGlzIG5vdCBzZXQKICMgQ09ORklHX0RFQlVHX1NQSU5MT0NLX1NMRUVQIGlzIG5vdCBzZXQKICMgQ09ORklHX0RFQlVHX0xPQ0tJTkdfQVBJX1NFTEZURVNUUyBpcyBub3Qgc2V0CiAjIENPTkZJR19ERUJVR19LT0JKRUNUIGlzIG5vdCBzZXQKICMgQ09ORklHX0RFQlVHX0lORk8gaXMgbm90IHNldAogIyBDT05GSUdfREVCVUdfRlMgaXMgbm90IHNldAogIyBDT05GSUdfREVCVUdfVk0gaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfTElTVCBpcyBub3Qgc2V0CiBDT05GSUdfRk9SQ0VEX0lOTElOSU5HPXkKICMgQ09ORklHX1JDVV9UT1JUVVJFX1RFU1QgaXMgbm90IHNldAogQ09ORklHX0NST1NTQ09NUElMRT15CkBAIC05NDYsNiArOTk5LDEwIEBACiAjIENyeXB0b2dyYXBoaWMgb3B0aW9ucwogIwogQ09ORklHX0NSWVBUTz15CitDT05GSUdfQ1JZUFRPX0FMR0FQST15CitDT05GSUdfQ1JZUFRPX0JMS0NJUEhFUj1tCitDT05GSUdfQ1JZUFRPX0hBU0g9eQorQ09ORklHX0NSWVBUT19NQU5BR0VSPW0KIENPTkZJR19DUllQVE9fSE1BQz15CiBDT05GSUdfQ1JZUFRPX05VTEw9eQogQ09ORklHX0NSWVBUT19NRDQ9eQpAQCAtOTU1LDkgKzEwMTIsMTIgQEAKIENPTkZJR19DUllQVE9fU0hBNTEyPXkKIENPTkZJR19DUllQVE9fV1A1MTI9bQogQ09ORklHX0NSWVBUT19UR1IxOTI9bQorQ09ORklHX0NSWVBUT19FQ0I9bQorQ09ORklHX0NSWVBUT19DQkM9bQogQ09ORklHX0NSWVBUT19ERVM9eQogQ09ORklHX0NSWVBUT19CTE9XRklTSD15CiBDT05GSUdfQ1JZUFRPX1RXT0ZJU0g9eQorQ09ORklHX0NSWVBUT19UV09GSVNIX0NPTU1PTj15CiBDT05GSUdfQ1JZUFRPX1NFUlBFTlQ9eQogQ09ORklHX0NSWVBUT19BRVM9bQogIyBDT05GSUdfQ1JZUFRPX0NBU1Q1IGlzIG5vdCBzZXQKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9jb25maWdzL3BueDg1NTAtamJzX2RlZmNvbmZpZyBiL2FyY2gvbWlwcy9jb25maWdzL3BueDg1NTAtamJzX2RlZmNvbmZpZwppbmRleCAyNmIwYjk4Li4yODBhODAwIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvY29uZmlncy9wbng4NTUwLWpic19kZWZjb25maWcKKysrIGIvYXJjaC9taXBzL2NvbmZpZ3MvcG54ODU1MC1qYnNfZGVmY29uZmlnCkBAIC0xLDcgKzEsNyBAQAogIwogIyBBdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBtYWtlIGNvbmZpZzogZG9uJ3QgZWRpdAotIyBMaW51eCBrZXJuZWwgdmVyc2lvbjogMi42LjE4LXJjMQotIyBUaHUgSnVsICA2IDEwOjA0OjE4IDIwMDYKKyMgTGludXgga2VybmVsIHZlcnNpb246IDIuNi4xOS1yYzIKKyMgU2F0IE9jdCAxNCAyMzowMToxNiAyMDA2CiAjCiBDT05GSUdfTUlQUz15CiAKQEAgLTI1LDggKzI1LDYgQEAKICMgQ09ORklHX01JUFNfQ09CQUxUIGlzIG5vdCBzZXQKICMgQ09ORklHX01BQ0hfREVDU1RBVElPTiBpcyBub3Qgc2V0CiAjIENPTkZJR19NSVBTX0VWNjQxMjAgaXMgbm90IHNldAotIyBDT05GSUdfTUlQU19JVlIgaXMgbm90IHNldAotIyBDT05GSUdfTUlQU19JVEU4MTcyIGlzIG5vdCBzZXQKICMgQ09ORklHX01BQ0hfSkFaWiBpcyBub3Qgc2V0CiAjIENPTkZJR19MQVNBVCBpcyBub3Qgc2V0CiAjIENPTkZJR19NSVBTX0FUTEFTIGlzIG5vdCBzZXQKQEAgLTQxLDEzICszOSwxMyBAQAogIyBDT05GSUdfTU9NRU5DT19PQ0VMT1RfRyBpcyBub3Qgc2V0CiAjIENPTkZJR19NSVBTX1hYUzE1MDAgaXMgbm90IHNldAogIyBDT05GSUdfUE5YODU1MF9WMlBDSSBpcyBub3Qgc2V0Ci0jIENPTkZJR19QTlg4NTUwX0pCUyBpcyBub3Qgc2V0CitDT05GSUdfUE5YODU1MF9KQlM9eQogIyBDT05GSUdfRERCNTQ3NyBpcyBub3Qgc2V0CiAjIENPTkZJR19NQUNIX1ZSNDFYWCBpcyBub3Qgc2V0CiAjIENPTkZJR19QTUNfWU9TRU1JVEUgaXMgbm90IHNldAogIyBDT05GSUdfUUVNVSBpcyBub3Qgc2V0CiAjIENPTkZJR19NQVJLRUlOUyBpcyBub3Qgc2V0Ci1DT05GSUdfU0dJX0lQMjI9eQorIyBDT05GSUdfU0dJX0lQMjIgaXMgbm90IHNldAogIyBDT05GSUdfU0dJX0lQMjcgaXMgbm90IHNldAogIyBDT05GSUdfU0dJX0lQMzIgaXMgbm90IHNldAogIyBDT05GSUdfU0lCWVRFX0JJR1NVUiBpcyBub3Qgc2V0CkBAIC02NywyNSArNjUsMjEgQEAKIENPTkZJR19HRU5FUklDX0ZJTkRfTkVYVF9CSVQ9eQogQ09ORklHX0dFTkVSSUNfSFdFSUdIVD15CiBDT05GSUdfR0VORVJJQ19DQUxJQlJBVEVfREVMQVk9eQorQ09ORklHX0dFTkVSSUNfVElNRT15CiBDT05GSUdfU0NIRURfTk9fTk9fT01JVF9GUkFNRV9QT0lOVEVSPXkKLUNPTkZJR19BUkM9eQogQ09ORklHX0RNQV9OT05DT0hFUkVOVD15CiBDT05GSUdfRE1BX05FRURfUENJX01BUF9TVEFURT15Ci1DT05GSUdfQ1BVX0JJR19FTkRJQU49eQotIyBDT05GSUdfQ1BVX0xJVFRMRV9FTkRJQU4gaXMgbm90IHNldAotQ09ORklHX1NZU19TVVBQT1JUU19CSUdfRU5ESUFOPXkKLUNPTkZJR19JUlFfQ1BVPXkKLUNPTkZJR19TV0FQX0lPX1NQQUNFPXkKLUNPTkZJR19BUkMzMj15Ci1DT05GSUdfQk9PVF9FTEYzMj15CisjIENPTkZJR19DUFVfQklHX0VORElBTiBpcyBub3Qgc2V0CitDT05GSUdfQ1BVX0xJVFRMRV9FTkRJQU49eQorQ09ORklHX1NZU19TVVBQT1JUU19MSVRUTEVfRU5ESUFOPXkKK0NPTkZJR19QTlg4NTUwPXkKK0NPTkZJR19TT0NfUE5YODU1MD15CiBDT05GSUdfTUlQU19MMV9DQUNIRV9TSElGVD01Ci0jIENPTkZJR19BUkNfQ09OU09MRSBpcyBub3Qgc2V0Ci1DT05GSUdfQVJDX1BST01MSUI9eQogCiAjCiAjIENQVSBzZWxlY3Rpb24KICMKLSMgQ09ORklHX0NQVV9NSVBTMzJfUjEgaXMgbm90IHNldAorQ09ORklHX0NQVV9NSVBTMzJfUjE9eQogIyBDT05GSUdfQ1BVX01JUFMzMl9SMiBpcyBub3Qgc2V0CiAjIENPTkZJR19DUFVfTUlQUzY0X1IxIGlzIG5vdCBzZXQKICMgQ09ORklHX0NQVV9NSVBTNjRfUjIgaXMgbm90IHNldApAQCAtOTMsNyArODcsNyBAQAogIyBDT05GSUdfQ1BVX1RYMzlYWCBpcyBub3Qgc2V0CiAjIENPTkZJR19DUFVfVlI0MVhYIGlzIG5vdCBzZXQKICMgQ09ORklHX0NQVV9SNDMwMCBpcyBub3Qgc2V0Ci1DT05GSUdfQ1BVX1I0WDAwPXkKKyMgQ09ORklHX0NQVV9SNFgwMCBpcyBub3Qgc2V0CiAjIENPTkZJR19DUFVfVFg0OVhYIGlzIG5vdCBzZXQKICMgQ09ORklHX0NQVV9SNTAwMCBpcyBub3Qgc2V0CiAjIENPTkZJR19DUFVfUjU0MzIgaXMgbm90IHNldApAQCAtMTA0LDEyICs5OCwxMSBAQAogIyBDT05GSUdfQ1BVX1JNNzAwMCBpcyBub3Qgc2V0CiAjIENPTkZJR19DUFVfUk05MDAwIGlzIG5vdCBzZXQKICMgQ09ORklHX0NQVV9TQjEgaXMgbm90IHNldAotQ09ORklHX1NZU19IQVNfQ1BVX1I0WDAwPXkKLUNPTkZJR19TWVNfSEFTX0NQVV9SNTAwMD15CitDT05GSUdfU1lTX0hBU19DUFVfTUlQUzMyX1IxPXkKK0NPTkZJR19DUFVfTUlQUzMyPXkKK0NPTkZJR19DUFVfTUlQU1IxPXkKIENPTkZJR19TWVNfU1VQUE9SVFNfMzJCSVRfS0VSTkVMPXkKLUNPTkZJR19TWVNfU1VQUE9SVFNfNjRCSVRfS0VSTkVMPXkKIENPTkZJR19DUFVfU1VQUE9SVFNfMzJCSVRfS0VSTkVMPXkKLUNPTkZJR19DUFVfU1VQUE9SVFNfNjRCSVRfS0VSTkVMPXkKIAogIwogIyBLZXJuZWwgdHlwZQpAQCAtMTIwLDE3ICsxMTMsMTcgQEAKICMgQ09ORklHX1BBR0VfU0laRV84S0IgaXMgbm90IHNldAogIyBDT05GSUdfUEFHRV9TSVpFXzE2S0IgaXMgbm90IHNldAogIyBDT05GSUdfUEFHRV9TSVpFXzY0S0IgaXMgbm90IHNldAotQ09ORklHX0JPQVJEX1NDQUNIRT15Ci1DT05GSUdfSVAyMl9DUFVfU0NBQ0hFPXkKK0NPTkZJR19DUFVfSEFTX1BSRUZFVENIPXkKIENPTkZJR19NSVBTX01UX0RJU0FCTEVEPXkKLSMgQ09ORklHX01JUFNfTVRfU01UQyBpcyBub3Qgc2V0CiAjIENPTkZJR19NSVBTX01UX1NNUCBpcyBub3Qgc2V0CisjIENPTkZJR19NSVBTX01UX1NNVEMgaXMgbm90IHNldAogIyBDT05GSUdfTUlQU19WUEVfTE9BREVSIGlzIG5vdCBzZXQKICMgQ09ORklHXzY0QklUX1BIWVNfQUREUiBpcyBub3Qgc2V0CiBDT05GSUdfQ1BVX0hBU19MTFNDPXkKIENPTkZJR19DUFVfSEFTX1NZTkM9eQogQ09ORklHX0dFTkVSSUNfSEFSRElSUVM9eQogQ09ORklHX0dFTkVSSUNfSVJRX1BST0JFPXkKK0NPTkZJR19DUFVfU1VQUE9SVFNfSElHSE1FTT15CiBDT05GSUdfQVJDSF9GTEFUTUVNX0VOQUJMRT15CiBDT05GSUdfU0VMRUNUX01FTU9SWV9NT0RFTD15CiBDT05GSUdfRkxBVE1FTV9NQU5VQUw9eQpAQCAtMTQ0LDEyICsxMzcsMTIgQEAKICMgQ09ORklHX0haXzQ4IGlzIG5vdCBzZXQKICMgQ09ORklHX0haXzEwMCBpcyBub3Qgc2V0CiAjIENPTkZJR19IWl8xMjggaXMgbm90IHNldAotIyBDT05GSUdfSFpfMjUwIGlzIG5vdCBzZXQKK0NPTkZJR19IWl8yNTA9eQogIyBDT05GSUdfSFpfMjU2IGlzIG5vdCBzZXQKLUNPTkZJR19IWl8xMDAwPXkKKyMgQ09ORklHX0haXzEwMDAgaXMgbm90IHNldAogIyBDT05GSUdfSFpfMTAyNCBpcyBub3Qgc2V0CiBDT05GSUdfU1lTX1NVUFBPUlRTX0FSQklUX0haPXkKLUNPTkZJR19IWj0xMDAwCitDT05GSUdfSFo9MjUwCiBDT05GSUdfUFJFRU1QVF9OT05FPXkKICMgQ09ORklHX1BSRUVNUFRfVk9MVU5UQVJZIGlzIG5vdCBzZXQKICMgQ09ORklHX1BSRUVNUFQgaXMgbm90IHNldApAQCAtMTcxLDE2ICsxNjQsMjAgQEAKIENPTkZJR19MT0NBTFZFUlNJT05fQVVUTz15CiBDT05GSUdfU1dBUD15CiBDT05GSUdfU1lTVklQQz15CisjIENPTkZJR19JUENfTlMgaXMgbm90IHNldAogIyBDT05GSUdfUE9TSVhfTVFVRVVFIGlzIG5vdCBzZXQKICMgQ09ORklHX0JTRF9QUk9DRVNTX0FDQ1QgaXMgbm90IHNldAotQ09ORklHX1NZU0NUTD15CisjIENPTkZJR19UQVNLU1RBVFMgaXMgbm90IHNldAorIyBDT05GSUdfVVRTX05TIGlzIG5vdCBzZXQKICMgQ09ORklHX0FVRElUIGlzIG5vdCBzZXQKIENPTkZJR19JS0NPTkZJRz15CiBDT05GSUdfSUtDT05GSUdfUFJPQz15CiAjIENPTkZJR19SRUxBWSBpcyBub3Qgc2V0CiBDT05GSUdfSU5JVFJBTUZTX1NPVVJDRT0iIgogIyBDT05GSUdfQ0NfT1BUSU1JWkVfRk9SX1NJWkUgaXMgbm90IHNldAorQ09ORklHX1NZU0NUTD15CiBDT05GSUdfRU1CRURERUQ9eQorIyBDT05GSUdfU1lTQ1RMX1NZU0NBTEwgaXMgbm90IHNldAogQ09ORklHX0tBTExTWU1TPXkKICMgQ09ORklHX0tBTExTWU1TX0FMTCBpcyBub3Qgc2V0CiAjIENPTkZJR19LQUxMU1lNU19FWFRSQV9QQVNTIGlzIG5vdCBzZXQKQEAgLTE4OSwxMiArMTg2LDEyIEBACiBDT05GSUdfQlVHPXkKIENPTkZJR19FTEZfQ09SRT15CiBDT05GSUdfQkFTRV9GVUxMPXkKLUNPTkZJR19SVF9NVVRFWEVTPXkKIENPTkZJR19GVVRFWD15CiBDT05GSUdfRVBPTEw9eQogQ09ORklHX1NITUVNPXkKIENPTkZJR19TTEFCPXkKIENPTkZJR19WTV9FVkVOVF9DT1VOVEVSUz15CitDT05GSUdfUlRfTVVURVhFUz15CiAjIENPTkZJR19USU5ZX1NITUVNIGlzIG5vdCBzZXQKIENPTkZJR19CQVNFX1NNQUxMPTAKICMgQ09ORklHX1NMT0IgaXMgbm90IHNldApAQCAtMjExLDYgKzIwOCw3IEBACiAjCiAjIEJsb2NrIGxheWVyCiAjCitDT05GSUdfQkxPQ0s9eQogIyBDT05GSUdfTEJEIGlzIG5vdCBzZXQKICMgQ09ORklHX0JMS19ERVZfSU9fVFJBQ0UgaXMgbm90IHNldAogIyBDT05GSUdfTFNGIGlzIG5vdCBzZXQKQEAgLTIzMSw4ICsyMjksMTAgQEAKICMKICMgQnVzIG9wdGlvbnMgKFBDSSwgUENNQ0lBLCBFSVNBLCBJU0EsIFRDKQogIwotQ09ORklHX0hXX0hBU19FSVNBPXkKLSMgQ09ORklHX0VJU0EgaXMgbm90IHNldAorQ09ORklHX0hXX0hBU19QQ0k9eQorQ09ORklHX1BDST15CisjIENPTkZJR19QQ0lfTVVMVElUSFJFQURfUFJPQkUgaXMgbm90IHNldAorIyBDT05GSUdfUENJX0RFQlVHIGlzIG5vdCBzZXQKIENPTkZJR19NTVU9eQogCiAjCkBAIC0yNDMsNiArMjQzLDcgQEAKICMKICMgUENJIEhvdHBsdWcgU3VwcG9ydAogIworIyBDT05GSUdfSE9UUExVR19QQ0kgaXMgbm90IHNldAogCiAjCiAjIEV4ZWN1dGFibGUgZmlsZSBmb3JtYXRzCkBAIC0yNjUsNiArMjY2LDcgQEAKIENPTkZJR19VTklYPXkKIENPTkZJR19YRlJNPXkKICMgQ09ORklHX1hGUk1fVVNFUiBpcyBub3Qgc2V0CisjIENPTkZJR19YRlJNX1NVQl9QT0xJQ1kgaXMgbm90IHNldAogIyBDT05GSUdfTkVUX0tFWSBpcyBub3Qgc2V0CiBDT05GSUdfSU5FVD15CiAjIENPTkZJR19JUF9NVUxUSUNBU1QgaXMgbm90IHNldApAQCAtMjgzLDE2ICsyODUsMTggQEAKICMgQ09ORklHX0lORVRfSVBDT01QIGlzIG5vdCBzZXQKICMgQ09ORklHX0lORVRfWEZSTV9UVU5ORUwgaXMgbm90IHNldAogIyBDT05GSUdfSU5FVF9UVU5ORUwgaXMgbm90IHNldAotQ09ORklHX0lORVRfWEZSTV9NT0RFX1RSQU5TUE9SVD1tCi1DT05GSUdfSU5FVF9YRlJNX01PREVfVFVOTkVMPW0KK0NPTkZJR19JTkVUX1hGUk1fTU9ERV9UUkFOU1BPUlQ9eQorQ09ORklHX0lORVRfWEZSTV9NT0RFX1RVTk5FTD15CitDT05GSUdfSU5FVF9YRlJNX01PREVfQkVFVD15CiBDT05GSUdfSU5FVF9ESUFHPXkKIENPTkZJR19JTkVUX1RDUF9ESUFHPXkKICMgQ09ORklHX1RDUF9DT05HX0FEVkFOQ0VEIGlzIG5vdCBzZXQKLUNPTkZJR19UQ1BfQ09OR19CSUM9eQorQ09ORklHX1RDUF9DT05HX0NVQklDPXkKK0NPTkZJR19ERUZBVUxUX1RDUF9DT05HPSJjdWJpYyIKICMgQ09ORklHX0lQVjYgaXMgbm90IHNldAogIyBDT05GSUdfSU5FVDZfWEZSTV9UVU5ORUwgaXMgbm90IHNldAogIyBDT05GSUdfSU5FVDZfVFVOTkVMIGlzIG5vdCBzZXQKLUNPTkZJR19ORVRXT1JLX1NFQ01BUks9eQorIyBDT05GSUdfTkVUV09SS19TRUNNQVJLIGlzIG5vdCBzZXQKICMgQ09ORklHX05FVEZJTFRFUiBpcyBub3Qgc2V0CiAKICMKQEAgLTMxOCw3ICszMjIsNiBAQAogIyBDT05GSUdfQVRBTEsgaXMgbm90IHNldAogIyBDT05GSUdfWDI1IGlzIG5vdCBzZXQKICMgQ09ORklHX0xBUEIgaXMgbm90IHNldAotIyBDT05GSUdfTkVUX0RJVkVSVCBpcyBub3Qgc2V0CiAjIENPTkZJR19FQ09ORVQgaXMgbm90IHNldAogIyBDT05GSUdfV0FOX1JPVVRFUiBpcyBub3Qgc2V0CiAKQEAgLTM3MSwxMyArMzc0LDIwIEBACiAjCiAjIEJsb2NrIGRldmljZXMKICMKKyMgQ09ORklHX0JMS19DUFFfREEgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0NQUV9DSVNTX0RBIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfREFDOTYwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfVU1FTSBpcyBub3Qgc2V0CiAjIENPTkZJR19CTEtfREVWX0NPV19DT01NT04gaXMgbm90IHNldAogQ09ORklHX0JMS19ERVZfTE9PUD15CiAjIENPTkZJR19CTEtfREVWX0NSWVBUT0xPT1AgaXMgbm90IHNldAogIyBDT05GSUdfQkxLX0RFVl9OQkQgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9TWDggaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9VQiBpcyBub3Qgc2V0CiBDT05GSUdfQkxLX0RFVl9SQU09eQogQ09ORklHX0JMS19ERVZfUkFNX0NPVU5UPTE2CiBDT05GSUdfQkxLX0RFVl9SQU1fU0laRT04MTkyCitDT05GSUdfQkxLX0RFVl9SQU1fQkxPQ0tTSVpFPTEwMjQKIENPTkZJR19CTEtfREVWX0lOSVRSRD15CiAjIENPTkZJR19DRFJPTV9QS1RDRFZEIGlzIG5vdCBzZXQKICMgQ09ORklHX0FUQV9PVkVSX0VUSCBpcyBub3Qgc2V0CkBAIC0zODYsNiArMzk2LDcgQEAKICMgQVRBL0FUQVBJL01GTS9STEwgc3VwcG9ydAogIwogQ09ORklHX0lERT15CitDT05GSUdfSURFX01BWF9IV0lGUz00CiBDT05GSUdfQkxLX0RFVl9JREU9eQogCiAjCkBAIC00MDQsOCArNDE1LDM5IEBACiAjIElERSBjaGlwc2V0IHN1cHBvcnQvYnVnZml4ZXMKICMKIENPTkZJR19JREVfR0VORVJJQz15CitDT05GSUdfQkxLX0RFVl9JREVQQ0k9eQorQ09ORklHX0lERVBDSV9TSEFSRV9JUlE9eQorQ09ORklHX0JMS19ERVZfT0ZGQk9BUkQ9eQorQ09ORklHX0JMS19ERVZfR0VORVJJQz15CisjIENPTkZJR19CTEtfREVWX09QVEk2MjEgaXMgbm90IHNldAorQ09ORklHX0JMS19ERVZfSURFRE1BX1BDST15CisjIENPTkZJR19CTEtfREVWX0lERURNQV9GT1JDRUQgaXMgbm90IHNldAorIyBDT05GSUdfSURFRE1BX1BDSV9BVVRPIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfQUVDNjJYWCBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX0FMSTE1WDMgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9BTUQ3NFhYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfQ01ENjRYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfVFJJRkxFWCBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX0NZODJDNjkzIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfQ1M1NTIwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfQ1M1NTMwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfSFBUMzRYIGlzIG5vdCBzZXQKK0NPTkZJR19CTEtfREVWX0hQVDM2Nj15CisjIENPTkZJR19CTEtfREVWX0pNSUNST04gaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9TQzEyMDAgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9QSUlYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfSVQ4MjFYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfTlM4NzQxNSBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX1BEQzIwMlhYX09MRCBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX1BEQzIwMlhYX05FVyBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX1NWV0tTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfU0lJTUFHRSBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX1NMQzkwRTY2IGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfVFJNMjkwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfVklBODJDWFhYIGlzIG5vdCBzZXQKICMgQ09ORklHX0lERV9BUk0gaXMgbm90IHNldAotIyBDT05GSUdfQkxLX0RFVl9JREVETUEgaXMgbm90IHNldAorQ09ORklHX0JMS19ERVZfSURFRE1BPXkKKyMgQ09ORklHX0lERURNQV9JVkIgaXMgbm90IHNldAogIyBDT05GSUdfSURFRE1BX0FVVE8gaXMgbm90IHNldAogIyBDT05GSUdfQkxLX0RFVl9IRCBpcyBub3Qgc2V0CiAKQEAgLTQxNCw2ICs0NTYsNyBAQAogIwogIyBDT05GSUdfUkFJRF9BVFRSUyBpcyBub3Qgc2V0CiBDT05GSUdfU0NTST15CitDT05GSUdfU0NTSV9ORVRMSU5LPXkKIENPTkZJR19TQ1NJX1BST0NfRlM9eQogCiAjCkBAIC00MzQsMjIgKzQ3Nyw1NCBAQAogIyBDT05GSUdfU0NTSV9MT0dHSU5HIGlzIG5vdCBzZXQKIAogIwotIyBTQ1NJIFRyYW5zcG9ydCBBdHRyaWJ1dGVzCisjIFNDU0kgVHJhbnNwb3J0cwogIwogIyBDT05GSUdfU0NTSV9TUElfQVRUUlMgaXMgbm90IHNldAogQ09ORklHX1NDU0lfRkNfQVRUUlM9eQogQ09ORklHX1NDU0lfSVNDU0lfQVRUUlM9bQogIyBDT05GSUdfU0NTSV9TQVNfQVRUUlMgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9TQVNfTElCU0FTIGlzIG5vdCBzZXQKIAogIwogIyBTQ1NJIGxvdy1sZXZlbCBkcml2ZXJzCiAjCiBDT05GSUdfSVNDU0lfVENQPW0KLSMgQ09ORklHX1NHSVdEOTNfU0NTSSBpcyBub3Qgc2V0Ci0jIENPTkZJR19TQ1NJX1NBVEEgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl8zV19YWFhYX1JBSUQgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV8zV185WFhYIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfQUNBUkQgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9BQUNSQUlEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfQUlDN1hYWCBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0FJQzdYWFhfT0xEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfQUlDNzlYWCBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0FJQzk0WFggaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9EUFRfSTJPIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfQVJDTVNSIGlzIG5vdCBzZXQKKyMgQ09ORklHX01FR0FSQUlEX05FV0dFTiBpcyBub3Qgc2V0CisjIENPTkZJR19NRUdBUkFJRF9MRUdBQ1kgaXMgbm90IHNldAorIyBDT05GSUdfTUVHQVJBSURfU0FTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfSFBUSU9QIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfRE1YMzE5MUQgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9GVVRVUkVfRE9NQUlOIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfSVBTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfSU5JVElPIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfSU5JQTEwMCBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX1NURVggaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9TWU01M0M4WFhfMiBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX1FMT0dJQ18xMjgwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfUUxBX0ZDIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfUUxBX0lTQ1NJIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfTFBGQyBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0RDMzk1eCBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0RDMzkwVCBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX05TUDMyIGlzIG5vdCBzZXQKICMgQ09ORklHX1NDU0lfREVCVUcgaXMgbm90IHNldAogCiAjCisjIFNlcmlhbCBBVEEgKHByb2QpIGFuZCBQYXJhbGxlbCBBVEEgKGV4cGVyaW1lbnRhbCkgZHJpdmVycworIworIyBDT05GSUdfQVRBIGlzIG5vdCBzZXQKKworIwogIyBNdWx0aS1kZXZpY2Ugc3VwcG9ydCAoUkFJRCBhbmQgTFZNKQogIwogIyBDT05GSUdfTUQgaXMgbm90IHNldApAQCAtNDU4LDE0ICs1MzMsMTkgQEAKICMgRnVzaW9uIE1QVCBkZXZpY2Ugc3VwcG9ydAogIwogIyBDT05GSUdfRlVTSU9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZVU0lPTl9TUEkgaXMgbm90IHNldAorIyBDT05GSUdfRlVTSU9OX0ZDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZVU0lPTl9TQVMgaXMgbm90IHNldAogCiAjCiAjIElFRUUgMTM5NCAoRmlyZVdpcmUpIHN1cHBvcnQKICMKKyMgQ09ORklHX0lFRUUxMzk0IGlzIG5vdCBzZXQKIAogIwogIyBJMk8gZGV2aWNlIHN1cHBvcnQKICMKKyMgQ09ORklHX0kyTyBpcyBub3Qgc2V0CiAKICMKICMgTmV0d29yayBkZXZpY2Ugc3VwcG9ydApAQCAtNDc3LDYgKzU1NywxMSBAQAogIyBDT05GSUdfVFVOIGlzIG5vdCBzZXQKIAogIworIyBBUkNuZXQgZGV2aWNlcworIworIyBDT05GSUdfQVJDTkVUIGlzIG5vdCBzZXQKKworIwogIyBQSFkgZGV2aWNlIHN1cHBvcnQKICMKICMgQ09ORklHX1BIWUxJQiBpcyBub3Qgc2V0CkBAIC00ODYsMjAgKzU3MSw3MyBAQAogIwogQ09ORklHX05FVF9FVEhFUk5FVD15CiBDT05GSUdfTUlJPXkKKyMgQ09ORklHX0hBUFBZTUVBTCBpcyBub3Qgc2V0CisjIENPTkZJR19TVU5HRU0gaXMgbm90IHNldAorIyBDT05GSUdfQ0FTU0lOSSBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfVkVORE9SXzNDT00gaXMgbm90IHNldAogIyBDT05GSUdfRE05MDAwIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NHSVNFRVEgaXMgbm90IHNldAorCisjCisjIFR1bGlwIGZhbWlseSBuZXR3b3JrIGRldmljZSBzdXBwb3J0CisjCisjIENPTkZJR19ORVRfVFVMSVAgaXMgbm90IHNldAorIyBDT05GSUdfSFAxMDAgaXMgbm90IHNldAorQ09ORklHX05FVF9QQ0k9eQorIyBDT05GSUdfUENORVQzMiBpcyBub3Qgc2V0CisjIENPTkZJR19BTUQ4MTExX0VUSCBpcyBub3Qgc2V0CisjIENPTkZJR19BREFQVEVDX1NUQVJGSVJFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0I0NCBpcyBub3Qgc2V0CisjIENPTkZJR19GT1JDRURFVEggaXMgbm90IHNldAorIyBDT05GSUdfREdSUyBpcyBub3Qgc2V0CisjIENPTkZJR19FRVBSTzEwMCBpcyBub3Qgc2V0CisjIENPTkZJR19FMTAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQUxOWCBpcyBub3Qgc2V0CisjIENPTkZJR19OQVRTRU1JIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FMktfUENJIGlzIG5vdCBzZXQKKyMgQ09ORklHXzgxMzlDUCBpcyBub3Qgc2V0CitDT05GSUdfODEzOVRPTz15CisjIENPTkZJR184MTM5VE9PX1BJTyBpcyBub3Qgc2V0CitDT05GSUdfODEzOVRPT19UVU5FX1RXSVNURVI9eQorQ09ORklHXzgxMzlUT09fODEyOT15CisjIENPTkZJR184MTM5X09MRF9SWF9SRVNFVCBpcyBub3Qgc2V0CisjIENPTkZJR19TSVM5MDAgaXMgbm90IHNldAorIyBDT05GSUdfRVBJQzEwMCBpcyBub3Qgc2V0CisjIENPTkZJR19TVU5EQU5DRSBpcyBub3Qgc2V0CisjIENPTkZJR19UTEFOIGlzIG5vdCBzZXQKKyMgQ09ORklHX1ZJQV9SSElORSBpcyBub3Qgc2V0CisjIENPTkZJR19MQU5fU0FBOTczMCBpcyBub3Qgc2V0CiAKICMKICMgRXRoZXJuZXQgKDEwMDAgTWJpdCkKICMKKyMgQ09ORklHX0FDRU5JQyBpcyBub3Qgc2V0CisjIENPTkZJR19ETDJLIGlzIG5vdCBzZXQKKyMgQ09ORklHX0UxMDAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX05TODM4MjAgaXMgbm90IHNldAorIyBDT05GSUdfSEFNQUNISSBpcyBub3Qgc2V0CisjIENPTkZJR19ZRUxMT1dGSU4gaXMgbm90IHNldAorIyBDT05GSUdfUjgxNjkgaXMgbm90IHNldAorIyBDT05GSUdfU0lTMTkwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NLR0UgaXMgbm90IHNldAorIyBDT05GSUdfU0tZMiBpcyBub3Qgc2V0CisjIENPTkZJR19TSzk4TElOIGlzIG5vdCBzZXQKKyMgQ09ORklHX1ZJQV9WRUxPQ0lUWSBpcyBub3Qgc2V0CisjIENPTkZJR19USUdPTjMgaXMgbm90IHNldAorIyBDT05GSUdfQk5YMiBpcyBub3Qgc2V0CisjIENPTkZJR19RTEEzWFhYIGlzIG5vdCBzZXQKIAogIwogIyBFdGhlcm5ldCAoMTAwMDAgTWJpdCkKICMKKyMgQ09ORklHX0NIRUxTSU9fVDEgaXMgbm90IHNldAorIyBDT05GSUdfSVhHQiBpcyBub3Qgc2V0CisjIENPTkZJR19TMklPIGlzIG5vdCBzZXQKKyMgQ09ORklHX01ZUkkxMEdFIGlzIG5vdCBzZXQKIAogIwogIyBUb2tlbiBSaW5nIGRldmljZXMKICMKKyMgQ09ORklHX1RSIGlzIG5vdCBzZXQKIAogIwogIyBXaXJlbGVzcyBMQU4gKG5vbi1oYW1yYWRpbykKQEAgLTUxMCw4ICs2NDgsMTEgQEAKICMgV2FuIGludGVyZmFjZXMKICMKICMgQ09ORklHX1dBTiBpcyBub3Qgc2V0CisjIENPTkZJR19GRERJIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hJUFBJIGlzIG5vdCBzZXQKICMgQ09ORklHX1BQUCBpcyBub3Qgc2V0CiAjIENPTkZJR19TTElQIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9GQyBpcyBub3Qgc2V0CiAjIENPTkZJR19TSEFQRVIgaXMgbm90IHNldAogIyBDT05GSUdfTkVUQ09OU09MRSBpcyBub3Qgc2V0CiAjIENPTkZJR19ORVRQT0xMIGlzIG5vdCBzZXQKQEAgLTUzMSw2ICs2NzIsNyBAQAogIyBJbnB1dCBkZXZpY2Ugc3VwcG9ydAogIwogQ09ORklHX0lOUFVUPXkKKyMgQ09ORklHX0lOUFVUX0ZGX01FTUxFU1MgaXMgbm90IHNldAogCiAjCiAjIFVzZXJsYW5kIGludGVyZmFjZXMKQEAgLTU1Niw2ICs2OTgsNyBAQAogQ09ORklHX1NFUklPPXkKICMgQ09ORklHX1NFUklPX0k4MDQyIGlzIG5vdCBzZXQKICMgQ09ORklHX1NFUklPX1NFUlBPUlQgaXMgbm90IHNldAorIyBDT05GSUdfU0VSSU9fUENJUFMyIGlzIG5vdCBzZXQKIENPTkZJR19TRVJJT19MSUJQUzI9eQogIyBDT05GSUdfU0VSSU9fUkFXIGlzIG5vdCBzZXQKICMgQ09ORklHX0dBTUVQT1JUIGlzIG5vdCBzZXQKQEAgLTU2Niw3ICs3MDksNyBAQAogQ09ORklHX1ZUPXkKIENPTkZJR19WVF9DT05TT0xFPXkKIENPTkZJR19IV19DT05TT0xFPXkKLUNPTkZJR19WVF9IV19DT05TT0xFX0JJTkRJTkc9eQorIyBDT05GSUdfVlRfSFdfQ09OU09MRV9CSU5ESU5HIGlzIG5vdCBzZXQKICMgQ09ORklHX1NFUklBTF9OT05TVEFOREFSRCBpcyBub3Qgc2V0CiAKICMKQEAgLTU3Nyw3ICs3MjAsOCBAQAogIwogIyBOb24tODI1MCBzZXJpYWwgcG9ydCBzdXBwb3J0CiAjCi0jIENPTkZJR19TRVJJQUxfSVAyMl9aSUxPRyBpcyBub3Qgc2V0CisjIENPTkZJR19TRVJJQUxfSVAzMTA2IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFUklBTF9KU00gaXMgbm90IHNldAogQ09ORklHX1VOSVg5OF9QVFlTPXkKIENPTkZJR19MRUdBQ1lfUFRZUz15CiBDT05GSUdfTEVHQUNZX1BUWV9DT1VOVD0yNTYKQEAgLTU5MSwxNiArNzM1LDE3IEBACiAjIFdhdGNoZG9nIENhcmRzCiAjCiAjIENPTkZJR19XQVRDSERPRyBpcyBub3Qgc2V0Ci0jIENPTkZJR19IV19SQU5ET00gaXMgbm90IHNldAorQ09ORklHX0hXX1JBTkRPTT15CiAjIENPTkZJR19SVEMgaXMgbm90IHNldAotIyBDT05GSUdfU0dJX0RTMTI4NiBpcyBub3Qgc2V0CiAjIENPTkZJR19HRU5fUlRDIGlzIG5vdCBzZXQKICMgQ09ORklHX0RUTEsgaXMgbm90IHNldAogIyBDT05GSUdfUjM5NjQgaXMgbm90IHNldAorIyBDT05GSUdfQVBQTElDT00gaXMgbm90IHNldAogCiAjCiAjIEZ0YXBlLCB0aGUgZmxvcHB5IHRhcGUgZGV2aWNlIGRyaXZlcgogIworIyBDT05GSUdfRFJNIGlzIG5vdCBzZXQKICMgQ09ORklHX1JBV19EUklWRVIgaXMgbm90IHNldAogCiAjCkBAIC02MzEsMzUgKzc3NiwzNyBAQAogIyBDT05GSUdfSFdNT05fVklEIGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfQUJJVFVHVVJVIGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfRjcxODA1RiBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX1ZUMTIxMSBpcyBub3Qgc2V0CiAjIENPTkZJR19IV01PTl9ERUJVR19DSElQIGlzIG5vdCBzZXQKIAogIwogIyBNaXNjIGRldmljZXMKICMKKyMgQ09ORklHX1RJRk1fQ09SRSBpcyBub3Qgc2V0CiAKICMKICMgTXVsdGltZWRpYSBkZXZpY2VzCiAjCiAjIENPTkZJR19WSURFT19ERVYgaXMgbm90IHNldAotQ09ORklHX1ZJREVPX1Y0TDI9eQogCiAjCiAjIERpZ2l0YWwgVmlkZW8gQnJvYWRjYXN0aW5nIERldmljZXMKICMKICMgQ09ORklHX0RWQiBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfREFCVVNCIGlzIG5vdCBzZXQKIAogIwogIyBHcmFwaGljcyBzdXBwb3J0CiAjCi0jIENPTkZJR19GSVJNV0FSRV9FRElEIGlzIG5vdCBzZXQKK0NPTkZJR19GSVJNV0FSRV9FRElEPXkKICMgQ09ORklHX0ZCIGlzIG5vdCBzZXQKIAogIwogIyBDb25zb2xlIGRpc3BsYXkgZHJpdmVyIHN1cHBvcnQKICMKICMgQ09ORklHX1ZHQV9DT05TT0xFIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NHSV9ORVdQT1JUX0NPTlNPTEUgaXMgbm90IHNldAogQ09ORklHX0RVTU1ZX0NPTlNPTEU9eQorIyBDT05GSUdfQkFDS0xJR0hUX0xDRF9TVVBQT1JUIGlzIG5vdCBzZXQKIAogIwogIyBTb3VuZApAQCAtNjY5LDE1ICs4MTYsMTMxIEBACiAjCiAjIFVTQiBzdXBwb3J0CiAjCi0jIENPTkZJR19VU0JfQVJDSF9IQVNfSENEIGlzIG5vdCBzZXQKLSMgQ09ORklHX1VTQl9BUkNIX0hBU19PSENJIGlzIG5vdCBzZXQKLSMgQ09ORklHX1VTQl9BUkNIX0hBU19FSENJIGlzIG5vdCBzZXQKK0NPTkZJR19VU0JfQVJDSF9IQVNfSENEPXkKK0NPTkZJR19VU0JfQVJDSF9IQVNfT0hDST15CitDT05GSUdfVVNCX0FSQ0hfSEFTX0VIQ0k9eQorQ09ORklHX1VTQj15CisjIENPTkZJR19VU0JfREVCVUcgaXMgbm90IHNldAorCisjCisjIE1pc2NlbGxhbmVvdXMgVVNCIG9wdGlvbnMKKyMKKyMgQ09ORklHX1VTQl9ERVZJQ0VGUyBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfQkFORFdJRFRIIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9EWU5BTUlDX01JTk9SUyBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfT1RHIGlzIG5vdCBzZXQKKworIworIyBVU0IgSG9zdCBDb250cm9sbGVyIERyaXZlcnMKKyMKKyMgQ09ORklHX1VTQl9FSENJX0hDRCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfSVNQMTE2WF9IQ0QgaXMgbm90IHNldAorQ09ORklHX1VTQl9PSENJX0hDRD15CisjIENPTkZJR19VU0JfT0hDSV9CSUdfRU5ESUFOIGlzIG5vdCBzZXQKK0NPTkZJR19VU0JfT0hDSV9MSVRUTEVfRU5ESUFOPXkKKyMgQ09ORklHX1VTQl9VSENJX0hDRCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfU0w4MTFfSENEIGlzIG5vdCBzZXQKKworIworIyBVU0IgRGV2aWNlIENsYXNzIGRyaXZlcnMKKyMKKyMgQ09ORklHX1VTQl9BQ00gaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1BSSU5URVIgaXMgbm90IHNldAogCiAjCiAjIE5PVEU6IFVTQl9TVE9SQUdFIGVuYWJsZXMgU0NTSSwgYW5kICdTQ1NJIGRpc2sgc3VwcG9ydCcKICMKIAogIworIyBtYXkgYWxzbyBiZSBuZWVkZWQ7IHNlZSBVU0JfU1RPUkFHRSBIZWxwIGZvciBtb3JlIGluZm9ybWF0aW9uCisjCitDT05GSUdfVVNCX1NUT1JBR0U9eQorIyBDT05GSUdfVVNCX1NUT1JBR0VfREVCVUcgaXMgbm90IHNldAorQ09ORklHX1VTQl9TVE9SQUdFX0RBVEFGQUI9eQorQ09ORklHX1VTQl9TVE9SQUdFX0ZSRUVDT009eQorQ09ORklHX1VTQl9TVE9SQUdFX0lTRDIwMD15CitDT05GSUdfVVNCX1NUT1JBR0VfRFBDTT15CitDT05GSUdfVVNCX1NUT1JBR0VfVVNCQVQ9eQorQ09ORklHX1VTQl9TVE9SQUdFX1NERFIwOT15CitDT05GSUdfVVNCX1NUT1JBR0VfU0REUjU1PXkKK0NPTkZJR19VU0JfU1RPUkFHRV9KVU1QU0hPVD15CisjIENPTkZJR19VU0JfU1RPUkFHRV9BTEFVREEgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1NUT1JBR0VfS0FSTUEgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0xJQlVTVUFMIGlzIG5vdCBzZXQKKworIworIyBVU0IgSW5wdXQgRGV2aWNlcworIworIyBDT05GSUdfVVNCX0hJRCBpcyBub3Qgc2V0CisKKyMKKyMgVVNCIEhJRCBCb290IFByb3RvY29sIGRyaXZlcnMKKyMKKyMgQ09ORklHX1VTQl9LQkQgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX01PVVNFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9BSVBURUsgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1dBQ09NIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9BQ0VDQUQgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0tCVEFCIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9QT1dFUk1BVEUgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1RPVUNIU0NSRUVOIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9ZRUFMSU5LIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9YUEFEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9BVElfUkVNT1RFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9BVElfUkVNT1RFMiBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfS0VZU1BBTl9SRU1PVEUgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0FQUExFVE9VQ0ggaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1RSQU5DRVZJQlJBVE9SIGlzIG5vdCBzZXQKKworIworIyBVU0IgSW1hZ2luZyBkZXZpY2VzCisjCisjIENPTkZJR19VU0JfTURDODAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9NSUNST1RFSyBpcyBub3Qgc2V0CisKKyMKKyMgVVNCIE5ldHdvcmsgQWRhcHRlcnMKKyMKKyMgQ09ORklHX1VTQl9DQVRDIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9LQVdFVEggaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1BFR0FTVVMgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1JUTDgxNTAgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1VTQk5FVCBpcyBub3Qgc2V0CitDT05GSUdfVVNCX01PTj15CisKKyMKKyMgVVNCIHBvcnQgZHJpdmVycworIworCisjCisjIFVTQiBTZXJpYWwgQ29udmVydGVyIHN1cHBvcnQKKyMKKyMgQ09ORklHX1VTQl9TRVJJQUwgaXMgbm90IHNldAorCisjCisjIFVTQiBNaXNjZWxsYW5lb3VzIGRyaXZlcnMKKyMKKyMgQ09ORklHX1VTQl9FTUk2MiBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfRU1JMjYgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0FEVVRVWCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfQVVFUlNXQUxEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9SSU81MDAgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0xFR09UT1dFUiBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfTENEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9MRUQgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0NZUFJFU1NfQ1k3QzYzIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9DWVRIRVJNIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9QSElER0VUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9JRE1PVVNFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9GVERJX0VMQU4gaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0FQUExFRElTUExBWSBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfTEQgaXMgbm90IHNldAorCisjCisjIFVTQiBEU0wgbW9kZW0gc3VwcG9ydAorIworCisjCiAjIFVTQiBHYWRnZXQgU3VwcG9ydAogIwogIyBDT05GSUdfVVNCX0dBREdFVCBpcyBub3Qgc2V0CkBAIC03MDMsNiArOTY2LDcgQEAKICMKICMgSW5maW5pQmFuZCBzdXBwb3J0CiAjCisjIENPTkZJR19JTkZJTklCQU5EIGlzIG5vdCBzZXQKIAogIwogIyBFREFDIC0gZXJyb3IgZGV0ZWN0aW9uIGFuZCByZXBvcnRpbmcgKFJBUykgKEVYUEVSSU1FTlRBTCkKQEAgLTczMywxMCArOTk3LDEyIEBACiAjIENPTkZJR19FWFQyX0ZTX1hBVFRSIGlzIG5vdCBzZXQKICMgQ09ORklHX0VYVDJfRlNfWElQIGlzIG5vdCBzZXQKICMgQ09ORklHX0VYVDNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfRVhUNERFVl9GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19SRUlTRVJGU19GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19KRlNfRlMgaXMgbm90IHNldAogIyBDT05GSUdfRlNfUE9TSVhfQUNMIGlzIG5vdCBzZXQKICMgQ09ORklHX1hGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19HRlMyX0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX09DRlMyX0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX01JTklYX0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX1JPTUZTX0ZTIGlzIG5vdCBzZXQKQEAgLTc2OSw4ICsxMDM1LDEwIEBACiAjCiBDT05GSUdfUFJPQ19GUz15CiAjIENPTkZJR19QUk9DX0tDT1JFIGlzIG5vdCBzZXQKK0NPTkZJR19QUk9DX1NZU0NUTD15CiBDT05GSUdfU1lTRlM9eQogQ09ORklHX1RNUEZTPXkKKyMgQ09ORklHX1RNUEZTX1BPU0lYX0FDTCBpcyBub3Qgc2V0CiAjIENPTkZJR19IVUdFVExCX1BBR0UgaXMgbm90IHNldAogQ09ORklHX1JBTUZTPXkKICMgQ09ORklHX0NPTkZJR0ZTX0ZTIGlzIG5vdCBzZXQKQEAgLTgxMyw3ICsxMDgxLDYgQEAKICMgQ09ORklHX1JQQ1NFQ19HU1NfU1BLTTMgaXMgbm90IHNldAogIyBDT05GSUdfU01CX0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX0NJRlMgaXMgbm90IHNldAotIyBDT05GSUdfQ0lGU19ERUJVRzIgaXMgbm90IHNldAogIyBDT05GSUdfTkNQX0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX0NPREFfRlMgaXMgbm90IHNldAogIyBDT05GSUdfQUZTX0ZTIGlzIG5vdCBzZXQKQEAgLTgyNCw3ICsxMDkxLDYgQEAKICMKICMgQ09ORklHX1BBUlRJVElPTl9BRFZBTkNFRCBpcyBub3Qgc2V0CiBDT05GSUdfTVNET1NfUEFSVElUSU9OPXkKLUNPTkZJR19TR0lfUEFSVElUSU9OPXkKIAogIwogIyBOYXRpdmUgTGFuZ3VhZ2UgU3VwcG9ydApAQCAtODgwLDYgKzExNDYsNyBAQAogIwogQ09ORklHX1RSQUNFX0lSUUZMQUdTX1NVUFBPUlQ9eQogIyBDT05GSUdfUFJJTlRLX1RJTUUgaXMgbm90IHNldAorQ09ORklHX0VOQUJMRV9NVVNUX0NIRUNLPXkKIENPTkZJR19NQUdJQ19TWVNSUT15CiAjIENPTkZJR19VTlVTRURfU1lNQk9MUyBpcyBub3Qgc2V0CiBDT05GSUdfREVCVUdfS0VSTkVMPXkKQEAgLTg5MywxMyArMTE2MCwxNyBAQAogIyBDT05GSUdfREVCVUdfU1BJTkxPQ0sgaXMgbm90IHNldAogQ09ORklHX0RFQlVHX01VVEVYRVM9eQogIyBDT05GSUdfREVCVUdfUldTRU1TIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX0xPQ0tfQUxMT0MgaXMgbm90IHNldAorIyBDT05GSUdfUFJPVkVfTE9DS0lORyBpcyBub3Qgc2V0CiAjIENPTkZJR19ERUJVR19TUElOTE9DS19TTEVFUCBpcyBub3Qgc2V0CiAjIENPTkZJR19ERUJVR19MT0NLSU5HX0FQSV9TRUxGVEVTVFMgaXMgbm90IHNldAogIyBDT05GSUdfREVCVUdfS09CSkVDVCBpcyBub3Qgc2V0CiAjIENPTkZJR19ERUJVR19JTkZPIGlzIG5vdCBzZXQKICMgQ09ORklHX0RFQlVHX0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX0RFQlVHX1ZNIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX0xJU1QgaXMgbm90IHNldAogQ09ORklHX0ZPUkNFRF9JTkxJTklORz15CisjIENPTkZJR19IRUFERVJTX0NIRUNLIGlzIG5vdCBzZXQKICMgQ09ORklHX1JDVV9UT1JUVVJFX1RFU1QgaXMgbm90IHNldAogQ09ORklHX0NST1NTQ09NUElMRT15CiBDT05GSUdfQ01ETElORT0iY29uc29sZT10dHlTMSwzODQwMG44IGtnZGI9dHR5UzAgcm9vdD0vZGV2L25mcyBpcD1ib290cCIKQEAgLTkxOCw2ICsxMTg5LDkgQEAKICMgQ3J5cHRvZ3JhcGhpYyBvcHRpb25zCiAjCiBDT05GSUdfQ1JZUFRPPXkKK0NPTkZJR19DUllQVE9fQUxHQVBJPW0KK0NPTkZJR19DUllQVE9fQkxLQ0lQSEVSPW0KK0NPTkZJR19DUllQVE9fTUFOQUdFUj1tCiAjIENPTkZJR19DUllQVE9fSE1BQyBpcyBub3Qgc2V0CiAjIENPTkZJR19DUllQVE9fTlVMTCBpcyBub3Qgc2V0CiAjIENPTkZJR19DUllQVE9fTUQ0IGlzIG5vdCBzZXQKQEAgLTkyNyw2ICsxMjAxLDggQEAKICMgQ09ORklHX0NSWVBUT19TSEE1MTIgaXMgbm90IHNldAogIyBDT05GSUdfQ1JZUFRPX1dQNTEyIGlzIG5vdCBzZXQKICMgQ09ORklHX0NSWVBUT19UR1IxOTIgaXMgbm90IHNldAorQ09ORklHX0NSWVBUT19FQ0I9bQorQ09ORklHX0NSWVBUT19DQkM9bQogIyBDT05GSUdfQ1JZUFRPX0RFUyBpcyBub3Qgc2V0CiAjIENPTkZJR19DUllQVE9fQkxPV0ZJU0ggaXMgbm90IHNldAogIyBDT05GSUdfQ1JZUFRPX1RXT0ZJU0ggaXMgbm90IHNldApkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2NvbmZpZ3MvcG54ODU1MC12MnBjaV9kZWZjb25maWcgYi9hcmNoL21pcHMvY29uZmlncy9wbng4NTUwLXYycGNpX2RlZmNvbmZpZwppbmRleCBlOTMyNjZiLi42NGI5ZmJmIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvY29uZmlncy9wbng4NTUwLXYycGNpX2RlZmNvbmZpZworKysgYi9hcmNoL21pcHMvY29uZmlncy9wbng4NTUwLXYycGNpX2RlZmNvbmZpZwpAQCAtMSw3ICsxLDcgQEAKICMKICMgQXV0b21hdGljYWxseSBnZW5lcmF0ZWQgbWFrZSBjb25maWc6IGRvbid0IGVkaXQKLSMgTGludXgga2VybmVsIHZlcnNpb246IDIuNi4xOC1yYzEKLSMgVGh1IEp1bCAgNiAxMDowNDoxOCAyMDA2CisjIExpbnV4IGtlcm5lbCB2ZXJzaW9uOiAyLjYuMTktcmMyCisjIFNhdCBPY3QgMTQgMjM6MTI6MTUgMjAwNgogIwogQ09ORklHX01JUFM9eQogCkBAIC0yNSw4ICsyNSw2IEBACiAjIENPTkZJR19NSVBTX0NPQkFMVCBpcyBub3Qgc2V0CiAjIENPTkZJR19NQUNIX0RFQ1NUQVRJT04gaXMgbm90IHNldAogIyBDT05GSUdfTUlQU19FVjY0MTIwIGlzIG5vdCBzZXQKLSMgQ09ORklHX01JUFNfSVZSIGlzIG5vdCBzZXQKLSMgQ09ORklHX01JUFNfSVRFODE3MiBpcyBub3Qgc2V0CiAjIENPTkZJR19NQUNIX0pBWlogaXMgbm90IHNldAogIyBDT05GSUdfTEFTQVQgaXMgbm90IHNldAogIyBDT05GSUdfTUlQU19BVExBUyBpcyBub3Qgc2V0CkBAIC00MCwxNCArMzgsMTQgQEAKICMgQ09ORklHX01PTUVOQ09fT0NFTE9UX0MgaXMgbm90IHNldAogIyBDT05GSUdfTU9NRU5DT19PQ0VMT1RfRyBpcyBub3Qgc2V0CiAjIENPTkZJR19NSVBTX1hYUzE1MDAgaXMgbm90IHNldAotIyBDT05GSUdfUE5YODU1MF9WMlBDSSBpcyBub3Qgc2V0CitDT05GSUdfUE5YODU1MF9WMlBDST15CiAjIENPTkZJR19QTlg4NTUwX0pCUyBpcyBub3Qgc2V0CiAjIENPTkZJR19EREI1NDc3IGlzIG5vdCBzZXQKICMgQ09ORklHX01BQ0hfVlI0MVhYIGlzIG5vdCBzZXQKICMgQ09ORklHX1BNQ19ZT1NFTUlURSBpcyBub3Qgc2V0CiAjIENPTkZJR19RRU1VIGlzIG5vdCBzZXQKICMgQ09ORklHX01BUktFSU5TIGlzIG5vdCBzZXQKLUNPTkZJR19TR0lfSVAyMj15CisjIENPTkZJR19TR0lfSVAyMiBpcyBub3Qgc2V0CiAjIENPTkZJR19TR0lfSVAyNyBpcyBub3Qgc2V0CiAjIENPTkZJR19TR0lfSVAzMiBpcyBub3Qgc2V0CiAjIENPTkZJR19TSUJZVEVfQklHU1VSIGlzIG5vdCBzZXQKQEAgLTY3LDI1ICs2NSwyMSBAQAogQ09ORklHX0dFTkVSSUNfRklORF9ORVhUX0JJVD15CiBDT05GSUdfR0VORVJJQ19IV0VJR0hUPXkKIENPTkZJR19HRU5FUklDX0NBTElCUkFURV9ERUxBWT15CitDT05GSUdfR0VORVJJQ19USU1FPXkKIENPTkZJR19TQ0hFRF9OT19OT19PTUlUX0ZSQU1FX1BPSU5URVI9eQotQ09ORklHX0FSQz15CiBDT05GSUdfRE1BX05PTkNPSEVSRU5UPXkKIENPTkZJR19ETUFfTkVFRF9QQ0lfTUFQX1NUQVRFPXkKLUNPTkZJR19DUFVfQklHX0VORElBTj15Ci0jIENPTkZJR19DUFVfTElUVExFX0VORElBTiBpcyBub3Qgc2V0Ci1DT05GSUdfU1lTX1NVUFBPUlRTX0JJR19FTkRJQU49eQotQ09ORklHX0lSUV9DUFU9eQotQ09ORklHX1NXQVBfSU9fU1BBQ0U9eQotQ09ORklHX0FSQzMyPXkKLUNPTkZJR19CT09UX0VMRjMyPXkKKyMgQ09ORklHX0NQVV9CSUdfRU5ESUFOIGlzIG5vdCBzZXQKK0NPTkZJR19DUFVfTElUVExFX0VORElBTj15CitDT05GSUdfU1lTX1NVUFBPUlRTX0xJVFRMRV9FTkRJQU49eQorQ09ORklHX1BOWDg1NTA9eQorQ09ORklHX1NPQ19QTlg4NTUwPXkKIENPTkZJR19NSVBTX0wxX0NBQ0hFX1NISUZUPTUKLSMgQ09ORklHX0FSQ19DT05TT0xFIGlzIG5vdCBzZXQKLUNPTkZJR19BUkNfUFJPTUxJQj15CiAKICMKICMgQ1BVIHNlbGVjdGlvbgogIwotIyBDT05GSUdfQ1BVX01JUFMzMl9SMSBpcyBub3Qgc2V0CitDT05GSUdfQ1BVX01JUFMzMl9SMT15CiAjIENPTkZJR19DUFVfTUlQUzMyX1IyIGlzIG5vdCBzZXQKICMgQ09ORklHX0NQVV9NSVBTNjRfUjEgaXMgbm90IHNldAogIyBDT05GSUdfQ1BVX01JUFM2NF9SMiBpcyBub3Qgc2V0CkBAIC05Myw3ICs4Nyw3IEBACiAjIENPTkZJR19DUFVfVFgzOVhYIGlzIG5vdCBzZXQKICMgQ09ORklHX0NQVV9WUjQxWFggaXMgbm90IHNldAogIyBDT05GSUdfQ1BVX1I0MzAwIGlzIG5vdCBzZXQKLUNPTkZJR19DUFVfUjRYMDA9eQorIyBDT05GSUdfQ1BVX1I0WDAwIGlzIG5vdCBzZXQKICMgQ09ORklHX0NQVV9UWDQ5WFggaXMgbm90IHNldAogIyBDT05GSUdfQ1BVX1I1MDAwIGlzIG5vdCBzZXQKICMgQ09ORklHX0NQVV9SNTQzMiBpcyBub3Qgc2V0CkBAIC0xMDQsMTIgKzk4LDExIEBACiAjIENPTkZJR19DUFVfUk03MDAwIGlzIG5vdCBzZXQKICMgQ09ORklHX0NQVV9STTkwMDAgaXMgbm90IHNldAogIyBDT05GSUdfQ1BVX1NCMSBpcyBub3Qgc2V0Ci1DT05GSUdfU1lTX0hBU19DUFVfUjRYMDA9eQotQ09ORklHX1NZU19IQVNfQ1BVX1I1MDAwPXkKK0NPTkZJR19TWVNfSEFTX0NQVV9NSVBTMzJfUjE9eQorQ09ORklHX0NQVV9NSVBTMzI9eQorQ09ORklHX0NQVV9NSVBTUjE9eQogQ09ORklHX1NZU19TVVBQT1JUU18zMkJJVF9LRVJORUw9eQotQ09ORklHX1NZU19TVVBQT1JUU182NEJJVF9LRVJORUw9eQogQ09ORklHX0NQVV9TVVBQT1JUU18zMkJJVF9LRVJORUw9eQotQ09ORklHX0NQVV9TVVBQT1JUU182NEJJVF9LRVJORUw9eQogCiAjCiAjIEtlcm5lbCB0eXBlCkBAIC0xMjAsMTcgKzExMywxNyBAQAogIyBDT05GSUdfUEFHRV9TSVpFXzhLQiBpcyBub3Qgc2V0CiAjIENPTkZJR19QQUdFX1NJWkVfMTZLQiBpcyBub3Qgc2V0CiAjIENPTkZJR19QQUdFX1NJWkVfNjRLQiBpcyBub3Qgc2V0Ci1DT05GSUdfQk9BUkRfU0NBQ0hFPXkKLUNPTkZJR19JUDIyX0NQVV9TQ0FDSEU9eQorQ09ORklHX0NQVV9IQVNfUFJFRkVUQ0g9eQogQ09ORklHX01JUFNfTVRfRElTQUJMRUQ9eQotIyBDT05GSUdfTUlQU19NVF9TTVRDIGlzIG5vdCBzZXQKICMgQ09ORklHX01JUFNfTVRfU01QIGlzIG5vdCBzZXQKKyMgQ09ORklHX01JUFNfTVRfU01UQyBpcyBub3Qgc2V0CiAjIENPTkZJR19NSVBTX1ZQRV9MT0FERVIgaXMgbm90IHNldAogIyBDT05GSUdfNjRCSVRfUEhZU19BRERSIGlzIG5vdCBzZXQKIENPTkZJR19DUFVfSEFTX0xMU0M9eQogQ09ORklHX0NQVV9IQVNfU1lOQz15CiBDT05GSUdfR0VORVJJQ19IQVJESVJRUz15CiBDT05GSUdfR0VORVJJQ19JUlFfUFJPQkU9eQorQ09ORklHX0NQVV9TVVBQT1JUU19ISUdITUVNPXkKIENPTkZJR19BUkNIX0ZMQVRNRU1fRU5BQkxFPXkKIENPTkZJR19TRUxFQ1RfTUVNT1JZX01PREVMPXkKIENPTkZJR19GTEFUTUVNX01BTlVBTD15CkBAIC0xNDQsMTIgKzEzNywxMiBAQAogIyBDT05GSUdfSFpfNDggaXMgbm90IHNldAogIyBDT05GSUdfSFpfMTAwIGlzIG5vdCBzZXQKICMgQ09ORklHX0haXzEyOCBpcyBub3Qgc2V0Ci0jIENPTkZJR19IWl8yNTAgaXMgbm90IHNldAorQ09ORklHX0haXzI1MD15CiAjIENPTkZJR19IWl8yNTYgaXMgbm90IHNldAotQ09ORklHX0haXzEwMDA9eQorIyBDT05GSUdfSFpfMTAwMCBpcyBub3Qgc2V0CiAjIENPTkZJR19IWl8xMDI0IGlzIG5vdCBzZXQKIENPTkZJR19TWVNfU1VQUE9SVFNfQVJCSVRfSFo9eQotQ09ORklHX0haPTEwMDAKK0NPTkZJR19IWj0yNTAKIENPTkZJR19QUkVFTVBUX05PTkU9eQogIyBDT05GSUdfUFJFRU1QVF9WT0xVTlRBUlkgaXMgbm90IHNldAogIyBDT05GSUdfUFJFRU1QVCBpcyBub3Qgc2V0CkBAIC0xNzEsMTYgKzE2NCwyMCBAQAogQ09ORklHX0xPQ0FMVkVSU0lPTl9BVVRPPXkKIENPTkZJR19TV0FQPXkKIENPTkZJR19TWVNWSVBDPXkKKyMgQ09ORklHX0lQQ19OUyBpcyBub3Qgc2V0CiAjIENPTkZJR19QT1NJWF9NUVVFVUUgaXMgbm90IHNldAogIyBDT05GSUdfQlNEX1BST0NFU1NfQUNDVCBpcyBub3Qgc2V0Ci1DT05GSUdfU1lTQ1RMPXkKKyMgQ09ORklHX1RBU0tTVEFUUyBpcyBub3Qgc2V0CisjIENPTkZJR19VVFNfTlMgaXMgbm90IHNldAogIyBDT05GSUdfQVVESVQgaXMgbm90IHNldAogQ09ORklHX0lLQ09ORklHPXkKIENPTkZJR19JS0NPTkZJR19QUk9DPXkKICMgQ09ORklHX1JFTEFZIGlzIG5vdCBzZXQKIENPTkZJR19JTklUUkFNRlNfU09VUkNFPSIiCiAjIENPTkZJR19DQ19PUFRJTUlaRV9GT1JfU0laRSBpcyBub3Qgc2V0CitDT05GSUdfU1lTQ1RMPXkKIENPTkZJR19FTUJFRERFRD15CisjIENPTkZJR19TWVNDVExfU1lTQ0FMTCBpcyBub3Qgc2V0CiBDT05GSUdfS0FMTFNZTVM9eQogIyBDT05GSUdfS0FMTFNZTVNfRVhUUkFfUEFTUyBpcyBub3Qgc2V0CiBDT05GSUdfSE9UUExVRz15CkBAIC0xODgsMTIgKzE4NSwxMiBAQAogQ09ORklHX0JVRz15CiBDT05GSUdfRUxGX0NPUkU9eQogQ09ORklHX0JBU0VfRlVMTD15Ci1DT05GSUdfUlRfTVVURVhFUz15CiBDT05GSUdfRlVURVg9eQogQ09ORklHX0VQT0xMPXkKIENPTkZJR19TSE1FTT15CiBDT05GSUdfU0xBQj15CiBDT05GSUdfVk1fRVZFTlRfQ09VTlRFUlM9eQorQ09ORklHX1JUX01VVEVYRVM9eQogIyBDT05GSUdfVElOWV9TSE1FTSBpcyBub3Qgc2V0CiBDT05GSUdfQkFTRV9TTUFMTD0wCiAjIENPTkZJR19TTE9CIGlzIG5vdCBzZXQKQEAgLTIxMCw2ICsyMDcsNyBAQAogIwogIyBCbG9jayBsYXllcgogIworQ09ORklHX0JMT0NLPXkKICMgQ09ORklHX0xCRCBpcyBub3Qgc2V0CiAjIENPTkZJR19CTEtfREVWX0lPX1RSQUNFIGlzIG5vdCBzZXQKICMgQ09ORklHX0xTRiBpcyBub3Qgc2V0CkBAIC0yMzAsOCArMjI4LDkgQEAKICMKICMgQnVzIG9wdGlvbnMgKFBDSSwgUENNQ0lBLCBFSVNBLCBJU0EsIFRDKQogIwotQ09ORklHX0hXX0hBU19FSVNBPXkKLSMgQ09ORklHX0VJU0EgaXMgbm90IHNldAorQ09ORklHX0hXX0hBU19QQ0k9eQorQ09ORklHX1BDST15CisjIENPTkZJR19QQ0lfTVVMVElUSFJFQURfUFJPQkUgaXMgbm90IHNldAogQ09ORklHX01NVT15CiAKICMKQEAgLTI0Miw2ICsyNDEsNyBAQAogIwogIyBQQ0kgSG90cGx1ZyBTdXBwb3J0CiAjCisjIENPTkZJR19IT1RQTFVHX1BDSSBpcyBub3Qgc2V0CiAKICMKICMgRXhlY3V0YWJsZSBmaWxlIGZvcm1hdHMKQEAgLTI2NCw2ICsyNjQsNyBAQAogQ09ORklHX1VOSVg9eQogQ09ORklHX1hGUk09eQogIyBDT05GSUdfWEZSTV9VU0VSIGlzIG5vdCBzZXQKKyMgQ09ORklHX1hGUk1fU1VCX1BPTElDWSBpcyBub3Qgc2V0CiAjIENPTkZJR19ORVRfS0VZIGlzIG5vdCBzZXQKIENPTkZJR19JTkVUPXkKICMgQ09ORklHX0lQX01VTFRJQ0FTVCBpcyBub3Qgc2V0CkBAIC0yODIsMTIgKzI4MywxNCBAQAogIyBDT05GSUdfSU5FVF9JUENPTVAgaXMgbm90IHNldAogIyBDT05GSUdfSU5FVF9YRlJNX1RVTk5FTCBpcyBub3Qgc2V0CiAjIENPTkZJR19JTkVUX1RVTk5FTCBpcyBub3Qgc2V0Ci1DT05GSUdfSU5FVF9YRlJNX01PREVfVFJBTlNQT1JUPW0KLUNPTkZJR19JTkVUX1hGUk1fTU9ERV9UVU5ORUw9bQorQ09ORklHX0lORVRfWEZSTV9NT0RFX1RSQU5TUE9SVD15CitDT05GSUdfSU5FVF9YRlJNX01PREVfVFVOTkVMPXkKK0NPTkZJR19JTkVUX1hGUk1fTU9ERV9CRUVUPXkKIENPTkZJR19JTkVUX0RJQUc9eQogQ09ORklHX0lORVRfVENQX0RJQUc9eQogIyBDT05GSUdfVENQX0NPTkdfQURWQU5DRUQgaXMgbm90IHNldAotQ09ORklHX1RDUF9DT05HX0JJQz15CitDT05GSUdfVENQX0NPTkdfQ1VCSUM9eQorQ09ORklHX0RFRkFVTFRfVENQX0NPTkc9ImN1YmljIgogCiAjCiAjIElQOiBWaXJ0dWFsIFNlcnZlciBDb25maWd1cmF0aW9uCkBAIC0zMDAsMTIgKzMwMywxOCBAQAogIyBDT05GSUdfSU5FVDZfQUggaXMgbm90IHNldAogIyBDT05GSUdfSU5FVDZfRVNQIGlzIG5vdCBzZXQKICMgQ09ORklHX0lORVQ2X0lQQ09NUCBpcyBub3Qgc2V0CisjIENPTkZJR19JUFY2X01JUDYgaXMgbm90IHNldAogIyBDT05GSUdfSU5FVDZfWEZSTV9UVU5ORUwgaXMgbm90IHNldAogIyBDT05GSUdfSU5FVDZfVFVOTkVMIGlzIG5vdCBzZXQKIENPTkZJR19JTkVUNl9YRlJNX01PREVfVFJBTlNQT1JUPW0KIENPTkZJR19JTkVUNl9YRlJNX01PREVfVFVOTkVMPW0KK0NPTkZJR19JTkVUNl9YRlJNX01PREVfQkVFVD1tCisjIENPTkZJR19JTkVUNl9YRlJNX01PREVfUk9VVEVPUFRJTUlaQVRJT04gaXMgbm90IHNldAorQ09ORklHX0lQVjZfU0lUPW0KICMgQ09ORklHX0lQVjZfVFVOTkVMIGlzIG5vdCBzZXQKLUNPTkZJR19ORVRXT1JLX1NFQ01BUks9eQorIyBDT05GSUdfSVBWNl9TVUJUUkVFUyBpcyBub3Qgc2V0CisjIENPTkZJR19JUFY2X01VTFRJUExFX1RBQkxFUyBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRXT1JLX1NFQ01BUksgaXMgbm90IHNldAogQ09ORklHX05FVEZJTFRFUj15CiAjIENPTkZJR19ORVRGSUxURVJfREVCVUcgaXMgbm90IHNldAogCkBAIC0zMTgsOSArMzI3LDkgQEAKIENPTkZJR19ORVRGSUxURVJfWFRfVEFSR0VUX0NMQVNTSUZZPW0KIENPTkZJR19ORVRGSUxURVJfWFRfVEFSR0VUX01BUks9bQogQ09ORklHX05FVEZJTFRFUl9YVF9UQVJHRVRfTkZRVUVVRT1tCi1DT05GSUdfTkVURklMVEVSX1hUX1RBUkdFVF9TRUNNQVJLPW0KIENPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfQ09NTUVOVD1tCiBDT05GSUdfTkVURklMVEVSX1hUX01BVENIX0RDQ1A9bQorIyBDT05GSUdfTkVURklMVEVSX1hUX01BVENIX0RTQ1AgaXMgbm90IHNldAogQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9FU1A9bQogQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9MRU5HVEg9bQogQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9MSU1JVD1tCkBAIC0zMjksMTAgKzMzOCwxMCBAQAogIyBDT05GSUdfTkVURklMVEVSX1hUX01BVENIX1BPTElDWSBpcyBub3Qgc2V0CiBDT05GSUdfTkVURklMVEVSX1hUX01BVENIX01VTFRJUE9SVD1tCiBDT05GSUdfTkVURklMVEVSX1hUX01BVENIX1BLVFRZUEU9bQotQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9RVU9UQT1tCisjIENPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfUVVPVEEgaXMgbm90IHNldAogQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9SRUFMTT1tCiBDT05GSUdfTkVURklMVEVSX1hUX01BVENIX1NDVFA9bQotQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9TVEFUSVNUSUM9bQorIyBDT05GSUdfTkVURklMVEVSX1hUX01BVENIX1NUQVRJU1RJQyBpcyBub3Qgc2V0CiBDT05GSUdfTkVURklMVEVSX1hUX01BVENIX1NUUklORz1tCiBDT05GSUdfTkVURklMVEVSX1hUX01BVENIX1RDUE1TUz1tCiAKQEAgLTM3Myw3ICszODIsNiBAQAogIyBDT05GSUdfQVRBTEsgaXMgbm90IHNldAogIyBDT05GSUdfWDI1IGlzIG5vdCBzZXQKICMgQ09ORklHX0xBUEIgaXMgbm90IHNldAotIyBDT05GSUdfTkVUX0RJVkVSVCBpcyBub3Qgc2V0CiAjIENPTkZJR19FQ09ORVQgaXMgbm90IHNldAogIyBDT05GSUdfV0FOX1JPVVRFUiBpcyBub3Qgc2V0CiAKQEAgLTQyNiwxMyArNDM0LDIwIEBACiAjCiAjIEJsb2NrIGRldmljZXMKICMKKyMgQ09ORklHX0JMS19DUFFfREEgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0NQUV9DSVNTX0RBIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfREFDOTYwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfVU1FTSBpcyBub3Qgc2V0CiAjIENPTkZJR19CTEtfREVWX0NPV19DT01NT04gaXMgbm90IHNldAogQ09ORklHX0JMS19ERVZfTE9PUD15CiAjIENPTkZJR19CTEtfREVWX0NSWVBUT0xPT1AgaXMgbm90IHNldAogIyBDT05GSUdfQkxLX0RFVl9OQkQgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9TWDggaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9VQiBpcyBub3Qgc2V0CiBDT05GSUdfQkxLX0RFVl9SQU09eQogQ09ORklHX0JMS19ERVZfUkFNX0NPVU5UPTE2CiBDT05GSUdfQkxLX0RFVl9SQU1fU0laRT04MTkyCitDT05GSUdfQkxLX0RFVl9SQU1fQkxPQ0tTSVpFPTEwMjQKIENPTkZJR19CTEtfREVWX0lOSVRSRD15CiAjIENPTkZJR19DRFJPTV9QS1RDRFZEIGlzIG5vdCBzZXQKICMgQ09ORklHX0FUQV9PVkVSX0VUSCBpcyBub3Qgc2V0CkBAIC00NDEsNiArNDU2LDcgQEAKICMgQVRBL0FUQVBJL01GTS9STEwgc3VwcG9ydAogIwogQ09ORklHX0lERT15CitDT05GSUdfSURFX01BWF9IV0lGUz00CiBDT05GSUdfQkxLX0RFVl9JREU9eQogCiAjCkBAIC00NTksOSArNDc1LDQxIEBACiAjIElERSBjaGlwc2V0IHN1cHBvcnQvYnVnZml4ZXMKICMKIENPTkZJR19JREVfR0VORVJJQz15CitDT05GSUdfQkxLX0RFVl9JREVQQ0k9eQorQ09ORklHX0lERVBDSV9TSEFSRV9JUlE9eQorIyBDT05GSUdfQkxLX0RFVl9PRkZCT0FSRCBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX0dFTkVSSUMgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9PUFRJNjIxIGlzIG5vdCBzZXQKK0NPTkZJR19CTEtfREVWX0lERURNQV9QQ0k9eQorIyBDT05GSUdfQkxLX0RFVl9JREVETUFfRk9SQ0VEIGlzIG5vdCBzZXQKK0NPTkZJR19JREVETUFfUENJX0FVVE89eQorIyBDT05GSUdfSURFRE1BX09OTFlESVNLIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfQUVDNjJYWCBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX0FMSTE1WDMgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9BTUQ3NFhYIGlzIG5vdCBzZXQKK0NPTkZJR19CTEtfREVWX0NNRDY0WD15CisjIENPTkZJR19CTEtfREVWX1RSSUZMRVggaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9DWTgyQzY5MyBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX0NTNTUyMCBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX0NTNTUzMCBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX0hQVDM0WCBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX0hQVDM2NiBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX0pNSUNST04gaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9TQzEyMDAgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9QSUlYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfSVQ4MjFYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfTlM4NzQxNSBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX1BEQzIwMlhYX09MRCBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX1BEQzIwMlhYX05FVyBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX1NWV0tTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfU0lJTUFHRSBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX1NMQzkwRTY2IGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfVFJNMjkwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfVklBODJDWFhYIGlzIG5vdCBzZXQKICMgQ09ORklHX0lERV9BUk0gaXMgbm90IHNldAotIyBDT05GSUdfQkxLX0RFVl9JREVETUEgaXMgbm90IHNldAotIyBDT05GSUdfSURFRE1BX0FVVE8gaXMgbm90IHNldAorQ09ORklHX0JMS19ERVZfSURFRE1BPXkKKyMgQ09ORklHX0lERURNQV9JVkIgaXMgbm90IHNldAorQ09ORklHX0lERURNQV9BVVRPPXkKICMgQ09ORklHX0JMS19ERVZfSEQgaXMgbm90IHNldAogCiAjCkBAIC00NjksNiArNTE3LDcgQEAKICMKICMgQ09ORklHX1JBSURfQVRUUlMgaXMgbm90IHNldAogQ09ORklHX1NDU0k9eQorQ09ORklHX1NDU0lfTkVUTElOSz15CiBDT05GSUdfU0NTSV9QUk9DX0ZTPXkKIAogIwpAQCAtNDg5LDIyICs1MzgsNTkgQEAKICMgQ09ORklHX1NDU0lfTE9HR0lORyBpcyBub3Qgc2V0CiAKICMKLSMgU0NTSSBUcmFuc3BvcnQgQXR0cmlidXRlcworIyBTQ1NJIFRyYW5zcG9ydHMKICMKIENPTkZJR19TQ1NJX1NQSV9BVFRSUz1tCiBDT05GSUdfU0NTSV9GQ19BVFRSUz15CiBDT05GSUdfU0NTSV9JU0NTSV9BVFRSUz1tCiAjIENPTkZJR19TQ1NJX1NBU19BVFRSUyBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX1NBU19MSUJTQVMgaXMgbm90IHNldAogCiAjCiAjIFNDU0kgbG93LWxldmVsIGRyaXZlcnMKICMKIENPTkZJR19JU0NTSV9UQ1A9bQotIyBDT05GSUdfU0dJV0Q5M19TQ1NJIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NDU0lfU0FUQSBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWXzNXX1hYWFhfUkFJRCBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJXzNXXzlYWFggaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9BQ0FSRCBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0FBQ1JBSUQgaXMgbm90IHNldAorQ09ORklHX1NDU0lfQUlDN1hYWD1tCitDT05GSUdfQUlDN1hYWF9DTURTX1BFUl9ERVZJQ0U9MzIKK0NPTkZJR19BSUM3WFhYX1JFU0VUX0RFTEFZX01TPTE1MDAwCisjIENPTkZJR19BSUM3WFhYX0RFQlVHX0VOQUJMRSBpcyBub3Qgc2V0CitDT05GSUdfQUlDN1hYWF9ERUJVR19NQVNLPTAKKyMgQ09ORklHX0FJQzdYWFhfUkVHX1BSRVRUWV9QUklOVCBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0FJQzdYWFhfT0xEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfQUlDNzlYWCBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0FJQzk0WFggaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9EUFRfSTJPIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfQVJDTVNSIGlzIG5vdCBzZXQKKyMgQ09ORklHX01FR0FSQUlEX05FV0dFTiBpcyBub3Qgc2V0CisjIENPTkZJR19NRUdBUkFJRF9MRUdBQ1kgaXMgbm90IHNldAorIyBDT05GSUdfTUVHQVJBSURfU0FTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfSFBUSU9QIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfRE1YMzE5MUQgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9GVVRVUkVfRE9NQUlOIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfSVBTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfSU5JVElPIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfSU5JQTEwMCBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX1NURVggaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9TWU01M0M4WFhfMiBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX1FMT0dJQ18xMjgwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfUUxBX0ZDIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfUUxBX0lTQ1NJIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfTFBGQyBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0RDMzk1eCBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0RDMzkwVCBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX05TUDMyIGlzIG5vdCBzZXQKICMgQ09ORklHX1NDU0lfREVCVUcgaXMgbm90IHNldAogCiAjCisjIFNlcmlhbCBBVEEgKHByb2QpIGFuZCBQYXJhbGxlbCBBVEEgKGV4cGVyaW1lbnRhbCkgZHJpdmVycworIworIyBDT05GSUdfQVRBIGlzIG5vdCBzZXQKKworIwogIyBNdWx0aS1kZXZpY2Ugc3VwcG9ydCAoUkFJRCBhbmQgTFZNKQogIwogIyBDT05GSUdfTUQgaXMgbm90IHNldApAQCAtNTEzLDE0ICs1OTksMTkgQEAKICMgRnVzaW9uIE1QVCBkZXZpY2Ugc3VwcG9ydAogIwogIyBDT05GSUdfRlVTSU9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZVU0lPTl9TUEkgaXMgbm90IHNldAorIyBDT05GSUdfRlVTSU9OX0ZDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZVU0lPTl9TQVMgaXMgbm90IHNldAogCiAjCiAjIElFRUUgMTM5NCAoRmlyZVdpcmUpIHN1cHBvcnQKICMKKyMgQ09ORklHX0lFRUUxMzk0IGlzIG5vdCBzZXQKIAogIwogIyBJMk8gZGV2aWNlIHN1cHBvcnQKICMKKyMgQ09ORklHX0kyTyBpcyBub3Qgc2V0CiAKICMKICMgTmV0d29yayBkZXZpY2Ugc3VwcG9ydApAQCAtNTMyLDYgKzYyMywxMSBAQAogQ09ORklHX1RVTj1tCiAKICMKKyMgQVJDbmV0IGRldmljZXMKKyMKKyMgQ09ORklHX0FSQ05FVCBpcyBub3Qgc2V0CisKKyMKICMgUEhZIGRldmljZSBzdXBwb3J0CiAjCiAjIENPTkZJR19QSFlMSUIgaXMgbm90IHNldApAQCAtNTQxLDIwICs2MzcsNzMgQEAKICMKIENPTkZJR19ORVRfRVRIRVJORVQ9eQogQ09ORklHX01JST15CisjIENPTkZJR19IQVBQWU1FQUwgaXMgbm90IHNldAorIyBDT05GSUdfU1VOR0VNIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NBU1NJTkkgaXMgbm90IHNldAorIyBDT05GSUdfTkVUX1ZFTkRPUl8zQ09NIGlzIG5vdCBzZXQKICMgQ09ORklHX0RNOTAwMCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TR0lTRUVRIGlzIG5vdCBzZXQKKworIworIyBUdWxpcCBmYW1pbHkgbmV0d29yayBkZXZpY2Ugc3VwcG9ydAorIworIyBDT05GSUdfTkVUX1RVTElQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hQMTAwIGlzIG5vdCBzZXQKK0NPTkZJR19ORVRfUENJPXkKKyMgQ09ORklHX1BDTkVUMzIgaXMgbm90IHNldAorIyBDT05GSUdfQU1EODExMV9FVEggaXMgbm90IHNldAorIyBDT05GSUdfQURBUFRFQ19TVEFSRklSRSBpcyBub3Qgc2V0CisjIENPTkZJR19CNDQgaXMgbm90IHNldAorIyBDT05GSUdfRk9SQ0VERVRIIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RHUlMgaXMgbm90IHNldAorIyBDT05GSUdfRUVQUk8xMDAgaXMgbm90IHNldAorIyBDT05GSUdfRTEwMCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFMTlggaXMgbm90IHNldAorQ09ORklHX05BVFNFTUk9eQorIyBDT05GSUdfTkUyS19QQ0kgaXMgbm90IHNldAorIyBDT05GSUdfODEzOUNQIGlzIG5vdCBzZXQKK0NPTkZJR184MTM5VE9PPXkKKyMgQ09ORklHXzgxMzlUT09fUElPIGlzIG5vdCBzZXQKKyMgQ09ORklHXzgxMzlUT09fVFVORV9UV0lTVEVSIGlzIG5vdCBzZXQKKyMgQ09ORklHXzgxMzlUT09fODEyOSBpcyBub3Qgc2V0CisjIENPTkZJR184MTM5X09MRF9SWF9SRVNFVCBpcyBub3Qgc2V0CisjIENPTkZJR19TSVM5MDAgaXMgbm90IHNldAorIyBDT05GSUdfRVBJQzEwMCBpcyBub3Qgc2V0CisjIENPTkZJR19TVU5EQU5DRSBpcyBub3Qgc2V0CisjIENPTkZJR19UTEFOIGlzIG5vdCBzZXQKKyMgQ09ORklHX1ZJQV9SSElORSBpcyBub3Qgc2V0CisjIENPTkZJR19MQU5fU0FBOTczMCBpcyBub3Qgc2V0CiAKICMKICMgRXRoZXJuZXQgKDEwMDAgTWJpdCkKICMKKyMgQ09ORklHX0FDRU5JQyBpcyBub3Qgc2V0CisjIENPTkZJR19ETDJLIGlzIG5vdCBzZXQKKyMgQ09ORklHX0UxMDAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX05TODM4MjAgaXMgbm90IHNldAorIyBDT05GSUdfSEFNQUNISSBpcyBub3Qgc2V0CisjIENPTkZJR19ZRUxMT1dGSU4gaXMgbm90IHNldAorIyBDT05GSUdfUjgxNjkgaXMgbm90IHNldAorIyBDT05GSUdfU0lTMTkwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NLR0UgaXMgbm90IHNldAorIyBDT05GSUdfU0tZMiBpcyBub3Qgc2V0CisjIENPTkZJR19TSzk4TElOIGlzIG5vdCBzZXQKKyMgQ09ORklHX1ZJQV9WRUxPQ0lUWSBpcyBub3Qgc2V0CisjIENPTkZJR19USUdPTjMgaXMgbm90IHNldAorIyBDT05GSUdfQk5YMiBpcyBub3Qgc2V0CisjIENPTkZJR19RTEEzWFhYIGlzIG5vdCBzZXQKIAogIwogIyBFdGhlcm5ldCAoMTAwMDAgTWJpdCkKICMKKyMgQ09ORklHX0NIRUxTSU9fVDEgaXMgbm90IHNldAorIyBDT05GSUdfSVhHQiBpcyBub3Qgc2V0CisjIENPTkZJR19TMklPIGlzIG5vdCBzZXQKKyMgQ09ORklHX01ZUkkxMEdFIGlzIG5vdCBzZXQKIAogIwogIyBUb2tlbiBSaW5nIGRldmljZXMKICMKKyMgQ09ORklHX1RSIGlzIG5vdCBzZXQKIAogIwogIyBXaXJlbGVzcyBMQU4gKG5vbi1oYW1yYWRpbykKQEAgLTU2NSw2ICs3MTQsOCBAQAogIyBXYW4gaW50ZXJmYWNlcwogIwogIyBDT05GSUdfV0FOIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZEREkgaXMgbm90IHNldAorIyBDT05GSUdfSElQUEkgaXMgbm90IHNldAogQ09ORklHX1BQUD1tCiAjIENPTkZJR19QUFBfTVVMVElMSU5LIGlzIG5vdCBzZXQKICMgQ09ORklHX1BQUF9GSUxURVIgaXMgbm90IHNldApAQCAtNTc1LDYgKzcyNiw4IEBACiBDT05GSUdfUFBQX01QUEU9bQogIyBDT05GSUdfUFBQT0UgaXMgbm90IHNldAogIyBDT05GSUdfU0xJUCBpcyBub3Qgc2V0CitDT05GSUdfU0xIQz1tCisjIENPTkZJR19ORVRfRkMgaXMgbm90IHNldAogIyBDT05GSUdfU0hBUEVSIGlzIG5vdCBzZXQKICMgQ09ORklHX05FVENPTlNPTEUgaXMgbm90IHNldAogIyBDT05GSUdfTkVUUE9MTCBpcyBub3Qgc2V0CkBAIC01OTQsNiArNzQ3LDcgQEAKICMgSW5wdXQgZGV2aWNlIHN1cHBvcnQKICMKIENPTkZJR19JTlBVVD15CisjIENPTkZJR19JTlBVVF9GRl9NRU1MRVNTIGlzIG5vdCBzZXQKIAogIwogIyBVc2VybGFuZCBpbnRlcmZhY2VzCkBAIC02MTYsNiArNzcwLDcgQEAKICMgQ09ORklHX0tFWUJPQVJEX0xLS0JEIGlzIG5vdCBzZXQKICMgQ09ORklHX0tFWUJPQVJEX1hUS0JEIGlzIG5vdCBzZXQKICMgQ09ORklHX0tFWUJPQVJEX05FV1RPTiBpcyBub3Qgc2V0CisjIENPTkZJR19LRVlCT0FSRF9TVE9XQVdBWSBpcyBub3Qgc2V0CiBDT05GSUdfSU5QVVRfTU9VU0U9eQogQ09ORklHX01PVVNFX1BTMj15CiAjIENPTkZJR19NT1VTRV9TRVJJQUwgaXMgbm90IHNldApAQCAtNjMwLDYgKzc4NSw3IEBACiBDT05GSUdfU0VSSU89eQogQ09ORklHX1NFUklPX0k4MDQyPXkKIENPTkZJR19TRVJJT19TRVJQT1JUPXkKKyMgQ09ORklHX1NFUklPX1BDSVBTMiBpcyBub3Qgc2V0CiBDT05GSUdfU0VSSU9fTElCUFMyPXkKICMgQ09ORklHX1NFUklPX1JBVyBpcyBub3Qgc2V0CiAjIENPTkZJR19HQU1FUE9SVCBpcyBub3Qgc2V0CkBAIC02NDAsNyArNzk2LDcgQEAKIENPTkZJR19WVD15CiAjIENPTkZJR19WVF9DT05TT0xFIGlzIG5vdCBzZXQKIENPTkZJR19IV19DT05TT0xFPXkKLUNPTkZJR19WVF9IV19DT05TT0xFX0JJTkRJTkc9eQorIyBDT05GSUdfVlRfSFdfQ09OU09MRV9CSU5ESU5HIGlzIG5vdCBzZXQKIENPTkZJR19TRVJJQUxfTk9OU1RBTkRBUkQ9eQogIyBDT05GSUdfQ09NUFVUT05FIGlzIG5vdCBzZXQKICMgQ09ORklHX1JPQ0tFVFBPUlQgaXMgbm90IHNldApAQCAtNjUwLDYgKzgwNiw3IEBACiAjIENPTkZJR19NT1hBX1NNQVJUSU8gaXMgbm90IHNldAogIyBDT05GSUdfSVNJIGlzIG5vdCBzZXQKICMgQ09ORklHX1NZTkNMSU5LTVAgaXMgbm90IHNldAorIyBDT05GSUdfU1lOQ0xJTktfR1QgaXMgbm90IHNldAogIyBDT05GSUdfTl9IRExDIGlzIG5vdCBzZXQKICMgQ09ORklHX1JJU0NPTTggaXMgbm90IHNldAogIyBDT05GSUdfU1BFQ0lBTElYIGlzIG5vdCBzZXQKQEAgLTY2NSw3ICs4MjIsOCBAQAogIwogIyBOb24tODI1MCBzZXJpYWwgcG9ydCBzdXBwb3J0CiAjCi0jIENPTkZJR19TRVJJQUxfSVAyMl9aSUxPRyBpcyBub3Qgc2V0CisjIENPTkZJR19TRVJJQUxfSVAzMTA2IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFUklBTF9KU00gaXMgbm90IHNldAogQ09ORklHX1VOSVg5OF9QVFlTPXkKIENPTkZJR19MRUdBQ1lfUFRZUz15CiBDT05GSUdfTEVHQUNZX1BUWV9DT1VOVD0yNTYKQEAgLTY3OSwxNiArODM3LDE3IEBACiAjIFdhdGNoZG9nIENhcmRzCiAjCiAjIENPTkZJR19XQVRDSERPRyBpcyBub3Qgc2V0Ci0jIENPTkZJR19IV19SQU5ET00gaXMgbm90IHNldAorQ09ORklHX0hXX1JBTkRPTT15CiAjIENPTkZJR19SVEMgaXMgbm90IHNldAotIyBDT05GSUdfU0dJX0RTMTI4NiBpcyBub3Qgc2V0CiAjIENPTkZJR19HRU5fUlRDIGlzIG5vdCBzZXQKICMgQ09ORklHX0RUTEsgaXMgbm90IHNldAogIyBDT05GSUdfUjM5NjQgaXMgbm90IHNldAorIyBDT05GSUdfQVBQTElDT00gaXMgbm90IHNldAogCiAjCiAjIEZ0YXBlLCB0aGUgZmxvcHB5IHRhcGUgZGV2aWNlIGRyaXZlcgogIworIyBDT05GSUdfRFJNIGlzIG5vdCBzZXQKICMgQ09ORklHX1JBV19EUklWRVIgaXMgbm90IHNldAogCiAjCkBAIC03MDksMTQgKzg2OCwzMCBAQAogQ09ORklHX0kyQ19BTEdPQklUPW0KICMgQ09ORklHX0kyQ19BTEdPUENGIGlzIG5vdCBzZXQKICMgQ09ORklHX0kyQ19BTEdPUENBIGlzIG5vdCBzZXQKLSMgQ09ORklHX0kyQ19BTEdPX1NHSSBpcyBub3Qgc2V0CiAKICMKICMgSTJDIEhhcmR3YXJlIEJ1cyBzdXBwb3J0CiAjCisjIENPTkZJR19JMkNfQUxJMTUzNSBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfQUxJMTU2MyBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfQUxJMTVYMyBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfQU1ENzU2IGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19BTUQ4MTExIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19JODAxIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19JODEwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19QSUlYNCBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfTkZPUkNFMiBpcyBub3Qgc2V0CiAjIENPTkZJR19JMkNfT0NPUkVTIGlzIG5vdCBzZXQKICMgQ09ORklHX0kyQ19QQVJQT1JUX0xJR0hUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19QUk9TQVZBR0UgaXMgbm90IHNldAorIyBDT05GSUdfSTJDX1NBVkFHRTQgaXMgbm90IHNldAorIyBDT05GSUdfSTJDX1NJUzU1OTUgaXMgbm90IHNldAorIyBDT05GSUdfSTJDX1NJUzYzMCBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfU0lTOTZYIGlzIG5vdCBzZXQKICMgQ09ORklHX0kyQ19TVFVCIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19WSUEgaXMgbm90IHNldAorIyBDT05GSUdfSTJDX1ZJQVBSTyBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfVk9PRE9PMyBpcyBub3Qgc2V0CiAjIENPTkZJR19JMkNfUENBX0lTQSBpcyBub3Qgc2V0CiAKICMKQEAgLTc3Niw5ICs5NTEsMTMgQEAKICMgQ09ORklHX1NFTlNPUlNfTE05MiBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX01BWDE2MTkgaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19QQzg3MzYwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfU0lTNTU5NSBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX1NNU0M0N00xIGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfU01TQzQ3TTE5MiBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX1NNU0M0N0IzOTcgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19WSUE2ODZBIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfVlQxMjExIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfVlQ4MjMxIGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfVzgzNzgxRCBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX1c4Mzc5MUQgaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19XODM3OTJEIGlzIG5vdCBzZXQKQEAgLTc5MCwyMyArOTY5LDI1IEBACiAjCiAjIE1pc2MgZGV2aWNlcwogIworIyBDT05GSUdfVElGTV9DT1JFIGlzIG5vdCBzZXQKIAogIwogIyBNdWx0aW1lZGlhIGRldmljZXMKICMKICMgQ09ORklHX1ZJREVPX0RFViBpcyBub3Qgc2V0Ci1DT05GSUdfVklERU9fVjRMMj15CiAKICMKICMgRGlnaXRhbCBWaWRlbyBCcm9hZGNhc3RpbmcgRGV2aWNlcwogIwogIyBDT05GSUdfRFZCIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9EQUJVU0IgaXMgbm90IHNldAogCiAjCiAjIEdyYXBoaWNzIHN1cHBvcnQKICMKLSMgQ09ORklHX0ZJUk1XQVJFX0VESUQgaXMgbm90IHNldAorQ09ORklHX0ZJUk1XQVJFX0VESUQ9eQogQ09ORklHX0ZCPXkKKyMgQ09ORklHX0ZCX0REQyBpcyBub3Qgc2V0CiAjIENPTkZJR19GQl9DRkJfRklMTFJFQ1QgaXMgbm90IHNldAogIyBDT05GSUdfRkJfQ0ZCX0NPUFlBUkVBIGlzIG5vdCBzZXQKICMgQ09ORklHX0ZCX0NGQl9JTUFHRUJMSVQgaXMgbm90IHNldApAQCAtODE0LDE0ICs5OTUsMzIgQEAKICMgQ09ORklHX0ZCX0JBQ0tMSUdIVCBpcyBub3Qgc2V0CiAjIENPTkZJR19GQl9NT0RFX0hFTFBFUlMgaXMgbm90IHNldAogIyBDT05GSUdfRkJfVElMRUJMSVRUSU5HIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZCX0NJUlJVUyBpcyBub3Qgc2V0CisjIENPTkZJR19GQl9QTTIgaXMgbm90IHNldAorIyBDT05GSUdfRkJfQ1lCRVIyMDAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZCX0FTSUxJQU5UIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZCX0lNU1RUIGlzIG5vdCBzZXQKICMgQ09ORklHX0ZCX1MxRDEzWFhYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZCX05WSURJQSBpcyBub3Qgc2V0CisjIENPTkZJR19GQl9SSVZBIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZCX01BVFJPWCBpcyBub3Qgc2V0CisjIENPTkZJR19GQl9SQURFT04gaXMgbm90IHNldAorIyBDT05GSUdfRkJfQVRZMTI4IGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZCX0FUWSBpcyBub3Qgc2V0CisjIENPTkZJR19GQl9TQVZBR0UgaXMgbm90IHNldAorIyBDT05GSUdfRkJfU0lTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZCX05FT01BR0lDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZCX0tZUk8gaXMgbm90IHNldAorIyBDT05GSUdfRkJfM0RGWCBpcyBub3Qgc2V0CisjIENPTkZJR19GQl9WT09ET08xIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZCX1NNSVZHWCBpcyBub3Qgc2V0CisjIENPTkZJR19GQl9UUklERU5UIGlzIG5vdCBzZXQKICMgQ09ORklHX0ZCX1ZJUlRVQUwgaXMgbm90IHNldAogCiAjCiAjIENvbnNvbGUgZGlzcGxheSBkcml2ZXIgc3VwcG9ydAogIwogIyBDT05GSUdfVkdBX0NPTlNPTEUgaXMgbm90IHNldAotIyBDT05GSUdfU0dJX05FV1BPUlRfQ09OU09MRSBpcyBub3Qgc2V0CiBDT05GSUdfRFVNTVlfQ09OU09MRT15CiAjIENPTkZJR19GUkFNRUJVRkZFUl9DT05TT0xFIGlzIG5vdCBzZXQKIApAQCAtODM5LDE1ICsxMDM4LDEyOSBAQAogIwogIyBVU0Igc3VwcG9ydAogIwotIyBDT05GSUdfVVNCX0FSQ0hfSEFTX0hDRCBpcyBub3Qgc2V0Ci0jIENPTkZJR19VU0JfQVJDSF9IQVNfT0hDSSBpcyBub3Qgc2V0Ci0jIENPTkZJR19VU0JfQVJDSF9IQVNfRUhDSSBpcyBub3Qgc2V0CitDT05GSUdfVVNCX0FSQ0hfSEFTX0hDRD15CitDT05GSUdfVVNCX0FSQ0hfSEFTX09IQ0k9eQorQ09ORklHX1VTQl9BUkNIX0hBU19FSENJPXkKK0NPTkZJR19VU0I9eQorIyBDT05GSUdfVVNCX0RFQlVHIGlzIG5vdCBzZXQKKworIworIyBNaXNjZWxsYW5lb3VzIFVTQiBvcHRpb25zCisjCitDT05GSUdfVVNCX0RFVklDRUZTPXkKKyMgQ09ORklHX1VTQl9CQU5EV0lEVEggaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0RZTkFNSUNfTUlOT1JTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9PVEcgaXMgbm90IHNldAorCisjCisjIFVTQiBIb3N0IENvbnRyb2xsZXIgRHJpdmVycworIworIyBDT05GSUdfVVNCX0VIQ0lfSENEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9JU1AxMTZYX0hDRCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfT0hDSV9IQ0QgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1VIQ0lfSENEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9TTDgxMV9IQ0QgaXMgbm90IHNldAorCisjCisjIFVTQiBEZXZpY2UgQ2xhc3MgZHJpdmVycworIworIyBDT05GSUdfVVNCX0FDTSBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfUFJJTlRFUiBpcyBub3Qgc2V0CiAKICMKICMgTk9URTogVVNCX1NUT1JBR0UgZW5hYmxlcyBTQ1NJLCBhbmQgJ1NDU0kgZGlzayBzdXBwb3J0JwogIwogCiAjCisjIG1heSBhbHNvIGJlIG5lZWRlZDsgc2VlIFVTQl9TVE9SQUdFIEhlbHAgZm9yIG1vcmUgaW5mb3JtYXRpb24KKyMKK0NPTkZJR19VU0JfU1RPUkFHRT15CisjIENPTkZJR19VU0JfU1RPUkFHRV9ERUJVRyBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfU1RPUkFHRV9EQVRBRkFCIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9TVE9SQUdFX0ZSRUVDT00gaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1NUT1JBR0VfSVNEMjAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9TVE9SQUdFX0RQQ00gaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1NUT1JBR0VfVVNCQVQgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1NUT1JBR0VfU0REUjA5IGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9TVE9SQUdFX1NERFI1NSBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfU1RPUkFHRV9KVU1QU0hPVCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfU1RPUkFHRV9BTEFVREEgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1NUT1JBR0VfT05FVE9VQ0ggaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1NUT1JBR0VfS0FSTUEgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0xJQlVTVUFMIGlzIG5vdCBzZXQKKworIworIyBVU0IgSW5wdXQgRGV2aWNlcworIworQ09ORklHX1VTQl9ISUQ9eQorQ09ORklHX1VTQl9ISURJTlBVVD15CisjIENPTkZJR19VU0JfSElESU5QVVRfUE9XRVJCT09LIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hJRF9GRiBpcyBub3Qgc2V0CitDT05GSUdfVVNCX0hJRERFVj15CisjIENPTkZJR19VU0JfQUlQVEVLIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9XQUNPTSBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfQUNFQ0FEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9LQlRBQiBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfUE9XRVJNQVRFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9UT1VDSFNDUkVFTiBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfWUVBTElOSyBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfWFBBRCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfQVRJX1JFTU9URSBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfQVRJX1JFTU9URTIgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0tFWVNQQU5fUkVNT1RFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9BUFBMRVRPVUNIIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9UUkFOQ0VWSUJSQVRPUiBpcyBub3Qgc2V0CisKKyMKKyMgVVNCIEltYWdpbmcgZGV2aWNlcworIworIyBDT05GSUdfVVNCX01EQzgwMCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfTUlDUk9URUsgaXMgbm90IHNldAorCisjCisjIFVTQiBOZXR3b3JrIEFkYXB0ZXJzCisjCisjIENPTkZJR19VU0JfQ0FUQyBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfS0FXRVRIIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9QRUdBU1VTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9SVEw4MTUwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9VU0JORVQgaXMgbm90IHNldAorQ09ORklHX1VTQl9NT049eQorCisjCisjIFVTQiBwb3J0IGRyaXZlcnMKKyMKKworIworIyBVU0IgU2VyaWFsIENvbnZlcnRlciBzdXBwb3J0CisjCisjIENPTkZJR19VU0JfU0VSSUFMIGlzIG5vdCBzZXQKKworIworIyBVU0IgTWlzY2VsbGFuZW91cyBkcml2ZXJzCisjCisjIENPTkZJR19VU0JfRU1JNjIgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0VNSTI2IGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9BRFVUVVggaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0FVRVJTV0FMRCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfUklPNTAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9MRUdPVE9XRVIgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0xDRCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfTEVEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9DWVBSRVNTX0NZN0M2MyBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfQ1lUSEVSTSBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfUEhJREdFVCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfSURNT1VTRSBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfRlRESV9FTEFOIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9BUFBMRURJU1BMQVkgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0xEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9URVNUIGlzIG5vdCBzZXQKKworIworIyBVU0IgRFNMIG1vZGVtIHN1cHBvcnQKKyMKKworIwogIyBVU0IgR2FkZ2V0IFN1cHBvcnQKICMKICMgQ09ORklHX1VTQl9HQURHRVQgaXMgbm90IHNldApAQCAtODczLDYgKzExODYsNyBAQAogIwogIyBJbmZpbmlCYW5kIHN1cHBvcnQKICMKKyMgQ09ORklHX0lORklOSUJBTkQgaXMgbm90IHNldAogCiAjCiAjIEVEQUMgLSBlcnJvciBkZXRlY3Rpb24gYW5kIHJlcG9ydGluZyAoUkFTKSAoRVhQRVJJTUVOVEFMKQpAQCAtOTA2LDYgKzEyMjAsNyBAQAogQ09ORklHX0VYVDNfRlNfWEFUVFI9eQogIyBDT05GSUdfRVhUM19GU19QT1NJWF9BQ0wgaXMgbm90IHNldAogIyBDT05GSUdfRVhUM19GU19TRUNVUklUWSBpcyBub3Qgc2V0CisjIENPTkZJR19FWFQ0REVWX0ZTIGlzIG5vdCBzZXQKIENPTkZJR19KQkQ9eQogIyBDT05GSUdfSkJEX0RFQlVHIGlzIG5vdCBzZXQKIENPTkZJR19GU19NQkNBQ0hFPXkKQEAgLTkxNyw2ICsxMjMyLDcgQEAKICMgQ09ORklHX1hGU19TRUNVUklUWSBpcyBub3Qgc2V0CiAjIENPTkZJR19YRlNfUE9TSVhfQUNMIGlzIG5vdCBzZXQKICMgQ09ORklHX1hGU19SVCBpcyBub3Qgc2V0CisjIENPTkZJR19HRlMyX0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX09DRlMyX0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX01JTklYX0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX1JPTUZTX0ZTIGlzIG5vdCBzZXQKQEAgLTk0OSw4ICsxMjY1LDEwIEBACiAjCiBDT05GSUdfUFJPQ19GUz15CiAjIENPTkZJR19QUk9DX0tDT1JFIGlzIG5vdCBzZXQKK0NPTkZJR19QUk9DX1NZU0NUTD15CiBDT05GSUdfU1lTRlM9eQogQ09ORklHX1RNUEZTPXkKKyMgQ09ORklHX1RNUEZTX1BPU0lYX0FDTCBpcyBub3Qgc2V0CiAjIENPTkZJR19IVUdFVExCX1BBR0UgaXMgbm90IHNldAogQ09ORklHX1JBTUZTPXkKICMgQ09ORklHX0NPTkZJR0ZTX0ZTIGlzIG5vdCBzZXQKQEAgLTk5NCw3ICsxMzEyLDYgQEAKIENPTkZJR19TTUJfRlM9bQogIyBDT05GSUdfU01CX05MU19ERUZBVUxUIGlzIG5vdCBzZXQKICMgQ09ORklHX0NJRlMgaXMgbm90IHNldAotIyBDT05GSUdfQ0lGU19ERUJVRzIgaXMgbm90IHNldAogIyBDT05GSUdfTkNQX0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX0NPREFfRlMgaXMgbm90IHNldAogIyBDT05GSUdfQUZTX0ZTIGlzIG5vdCBzZXQKQEAgLTEwMDUsNyArMTMyMiw2IEBACiAjCiAjIENPTkZJR19QQVJUSVRJT05fQURWQU5DRUQgaXMgbm90IHNldAogQ09ORklHX01TRE9TX1BBUlRJVElPTj15Ci1DT05GSUdfU0dJX1BBUlRJVElPTj15CiAKICMKICMgTmF0aXZlIExhbmd1YWdlIFN1cHBvcnQKQEAgLTEwNjEsMTEgKzEzNzcsMTMgQEAKICMKIENPTkZJR19UUkFDRV9JUlFGTEFHU19TVVBQT1JUPXkKICMgQ09ORklHX1BSSU5US19USU1FIGlzIG5vdCBzZXQKK0NPTkZJR19FTkFCTEVfTVVTVF9DSEVDSz15CiAjIENPTkZJR19NQUdJQ19TWVNSUSBpcyBub3Qgc2V0CiAjIENPTkZJR19VTlVTRURfU1lNQk9MUyBpcyBub3Qgc2V0CiAjIENPTkZJR19ERUJVR19LRVJORUwgaXMgbm90IHNldAogQ09ORklHX0xPR19CVUZfU0hJRlQ9MTQKICMgQ09ORklHX0RFQlVHX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hFQURFUlNfQ0hFQ0sgaXMgbm90IHNldAogQ09ORklHX0NST1NTQ09NUElMRT15CiBDT05GSUdfQ01ETElORT0iIgogCkBAIC0xMDc5LDYgKzEzOTcsOSBAQAogIyBDcnlwdG9ncmFwaGljIG9wdGlvbnMKICMKIENPTkZJR19DUllQVE89eQorQ09ORklHX0NSWVBUT19BTEdBUEk9bQorQ09ORklHX0NSWVBUT19CTEtDSVBIRVI9bQorQ09ORklHX0NSWVBUT19NQU5BR0VSPW0KICMgQ09ORklHX0NSWVBUT19ITUFDIGlzIG5vdCBzZXQKICMgQ09ORklHX0NSWVBUT19OVUxMIGlzIG5vdCBzZXQKICMgQ09ORklHX0NSWVBUT19NRDQgaXMgbm90IHNldApAQCAtMTA4OCw2ICsxNDA5LDggQEAKICMgQ09ORklHX0NSWVBUT19TSEE1MTIgaXMgbm90IHNldAogIyBDT05GSUdfQ1JZUFRPX1dQNTEyIGlzIG5vdCBzZXQKICMgQ09ORklHX0NSWVBUT19UR1IxOTIgaXMgbm90IHNldAorQ09ORklHX0NSWVBUT19FQ0I9bQorQ09ORklHX0NSWVBUT19DQkM9bQogIyBDT05GSUdfQ1JZUFRPX0RFUyBpcyBub3Qgc2V0CiAjIENPTkZJR19DUllQVE9fQkxPV0ZJU0ggaXMgbm90IHNldAogIyBDT05GSUdfQ1JZUFRPX1RXT0ZJU0ggaXMgbm90IHNldApkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2NvbmZpZ3MvdGIwMjg3X2RlZmNvbmZpZyBiL2FyY2gvbWlwcy9jb25maWdzL3RiMDI4N19kZWZjb25maWcKaW5kZXggYWQ3MjcxYi4uZjdlODE5NCAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2NvbmZpZ3MvdGIwMjg3X2RlZmNvbmZpZworKysgYi9hcmNoL21pcHMvY29uZmlncy90YjAyODdfZGVmY29uZmlnCkBAIC0xLDcgKzEsNyBAQAogIwogIyBBdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBtYWtlIGNvbmZpZzogZG9uJ3QgZWRpdAotIyBMaW51eCBrZXJuZWwgdmVyc2lvbjogMi42LjE4LXJjMQotIyBUaHUgSnVsICA2IDEwOjA0OjIxIDIwMDYKKyMgTGludXgga2VybmVsIHZlcnNpb246IDIuNi4xOS1yYzIKKyMgV2VkIE9jdCAxOCAxMjo1NzoxMSAyMDA2CiAjCiBDT05GSUdfTUlQUz15CiAKQEAgLTI1LDggKzI1LDYgQEAKICMgQ09ORklHX01JUFNfQ09CQUxUIGlzIG5vdCBzZXQKICMgQ09ORklHX01BQ0hfREVDU1RBVElPTiBpcyBub3Qgc2V0CiAjIENPTkZJR19NSVBTX0VWNjQxMjAgaXMgbm90IHNldAotIyBDT05GSUdfTUlQU19JVlIgaXMgbm90IHNldAotIyBDT05GSUdfTUlQU19JVEU4MTcyIGlzIG5vdCBzZXQKICMgQ09ORklHX01BQ0hfSkFaWiBpcyBub3Qgc2V0CiAjIENPTkZJR19MQVNBVCBpcyBub3Qgc2V0CiAjIENPTkZJR19NSVBTX0FUTEFTIGlzIG5vdCBzZXQKQEAgLTcyLDExICs3MCwxMSBAQAogIyBDT05GSUdfVklDVE9SX01QQzMwWCBpcyBub3Qgc2V0CiAjIENPTkZJR19aQU9fQ0FQQ0VMTEEgaXMgbm90IHNldAogQ09ORklHX1BDSV9WUjQxWFg9eQotIyBDT05GSUdfVlJDNDE3MyBpcyBub3Qgc2V0CiBDT05GSUdfUldTRU1fR0VORVJJQ19TUElOTE9DSz15CiBDT05GSUdfR0VORVJJQ19GSU5EX05FWFRfQklUPXkKIENPTkZJR19HRU5FUklDX0hXRUlHSFQ9eQogQ09ORklHX0dFTkVSSUNfQ0FMSUJSQVRFX0RFTEFZPXkKK0NPTkZJR19HRU5FUklDX1RJTUU9eQogQ09ORklHX1NDSEVEX05PX05PX09NSVRfRlJBTUVfUE9JTlRFUj15CiBDT05GSUdfRE1BX05PTkNPSEVSRU5UPXkKIENPTkZJR19ETUFfTkVFRF9QQ0lfTUFQX1NUQVRFPXkKQEAgLTEyMyw4ICsxMjEsOCBAQAogIyBDT05GSUdfUEFHRV9TSVpFXzE2S0IgaXMgbm90IHNldAogIyBDT05GSUdfUEFHRV9TSVpFXzY0S0IgaXMgbm90IHNldAogQ09ORklHX01JUFNfTVRfRElTQUJMRUQ9eQotIyBDT05GSUdfTUlQU19NVF9TTVRDIGlzIG5vdCBzZXQKICMgQ09ORklHX01JUFNfTVRfU01QIGlzIG5vdCBzZXQKKyMgQ09ORklHX01JUFNfTVRfU01UQyBpcyBub3Qgc2V0CiAjIENPTkZJR19NSVBTX1ZQRV9MT0FERVIgaXMgbm90IHNldAogQ09ORklHX0NQVV9IQVNfU1lOQz15CiBDT05GSUdfR0VORVJJQ19IQVJESVJRUz15CkBAIC0xNjksMTUgKzE2NywxOSBAQAogQ09ORklHX0xPQ0FMVkVSU0lPTl9BVVRPPXkKIENPTkZJR19TV0FQPXkKIENPTkZJR19TWVNWSVBDPXkKKyMgQ09ORklHX0lQQ19OUyBpcyBub3Qgc2V0CiAjIENPTkZJR19QT1NJWF9NUVVFVUUgaXMgbm90IHNldAogIyBDT05GSUdfQlNEX1BST0NFU1NfQUNDVCBpcyBub3Qgc2V0Ci1DT05GSUdfU1lTQ1RMPXkKKyMgQ09ORklHX1RBU0tTVEFUUyBpcyBub3Qgc2V0CisjIENPTkZJR19VVFNfTlMgaXMgbm90IHNldAogIyBDT05GSUdfQVVESVQgaXMgbm90IHNldAogIyBDT05GSUdfSUtDT05GSUcgaXMgbm90IHNldAogIyBDT05GSUdfUkVMQVkgaXMgbm90IHNldAogQ09ORklHX0lOSVRSQU1GU19TT1VSQ0U9IiIKICMgQ09ORklHX0NDX09QVElNSVpFX0ZPUl9TSVpFIGlzIG5vdCBzZXQKK0NPTkZJR19TWVNDVEw9eQogQ09ORklHX0VNQkVEREVEPXkKKyMgQ09ORklHX1NZU0NUTF9TWVNDQUxMIGlzIG5vdCBzZXQKIENPTkZJR19LQUxMU1lNUz15CiAjIENPTkZJR19LQUxMU1lNU19FWFRSQV9QQVNTIGlzIG5vdCBzZXQKICMgQ09ORklHX0hPVFBMVUcgaXMgbm90IHNldApAQCAtMTg1LDEyICsxODcsMTIgQEAKIENPTkZJR19CVUc9eQogQ09ORklHX0VMRl9DT1JFPXkKIENPTkZJR19CQVNFX0ZVTEw9eQotQ09ORklHX1JUX01VVEVYRVM9eQogQ09ORklHX0ZVVEVYPXkKIENPTkZJR19FUE9MTD15CiBDT05GSUdfU0hNRU09eQogQ09ORklHX1NMQUI9eQogQ09ORklHX1ZNX0VWRU5UX0NPVU5URVJTPXkKK0NPTkZJR19SVF9NVVRFWEVTPXkKICMgQ09ORklHX1RJTllfU0hNRU0gaXMgbm90IHNldAogQ09ORklHX0JBU0VfU01BTEw9MAogIyBDT05GSUdfU0xPQiBpcyBub3Qgc2V0CkBAIC0yMDgsNiArMjEwLDcgQEAKICMKICMgQmxvY2sgbGF5ZXIKICMKK0NPTkZJR19CTE9DSz15CiAjIENPTkZJR19MQkQgaXMgbm90IHNldAogIyBDT05GSUdfQkxLX0RFVl9JT19UUkFDRSBpcyBub3Qgc2V0CiAjIENPTkZJR19MU0YgaXMgbm90IHNldApAQCAtMjMwLDE3ICsyMzMsMTYgQEAKICMKIENPTkZJR19IV19IQVNfUENJPXkKIENPTkZJR19QQ0k9eQorIyBDT05GSUdfUENJX01VTFRJVEhSRUFEX1BST0JFIGlzIG5vdCBzZXQKIENPTkZJR19NTVU9eQogCiAjCiAjIFBDQ0FSRCAoUENNQ0lBL0NhcmRCdXMpIHN1cHBvcnQKICMKLSMgQ09ORklHX1BDQ0FSRCBpcyBub3Qgc2V0CiAKICMKICMgUENJIEhvdHBsdWcgU3VwcG9ydAogIwotIyBDT05GSUdfSE9UUExVR19QQ0kgaXMgbm90IHNldAogCiAjCiAjIEV4ZWN1dGFibGUgZmlsZSBmb3JtYXRzCkBAIC0yNjMsNiArMjY1LDcgQEAKIENPTkZJR19VTklYPXkKIENPTkZJR19YRlJNPXkKICMgQ09ORklHX1hGUk1fVVNFUiBpcyBub3Qgc2V0CisjIENPTkZJR19YRlJNX1NVQl9QT0xJQ1kgaXMgbm90IHNldAogIyBDT05GSUdfTkVUX0tFWSBpcyBub3Qgc2V0CiBDT05GSUdfSU5FVD15CiBDT05GSUdfSVBfTVVMVElDQVNUPXkKQEAgLTI5MSwxMyArMjk0LDEwIEBACiBDT05GSUdfSU5FVF9UVU5ORUw9bQogQ09ORklHX0lORVRfWEZSTV9NT0RFX1RSQU5TUE9SVD1tCiBDT05GSUdfSU5FVF9YRlJNX01PREVfVFVOTkVMPW0KK0NPTkZJR19JTkVUX1hGUk1fTU9ERV9CRUVUPXkKIENPTkZJR19JTkVUX0RJQUc9eQogQ09ORklHX0lORVRfVENQX0RJQUc9eQogQ09ORklHX1RDUF9DT05HX0FEVkFOQ0VEPXkKLQotIwotIyBUQ1AgY29uZ2VzdGlvbiBjb250cm9sCi0jCiBDT05GSUdfVENQX0NPTkdfQklDPXkKIENPTkZJR19UQ1BfQ09OR19DVUJJQz1tCiBDT05GSUdfVENQX0NPTkdfV0VTVFdPT0Q9bQpAQCAtMzA4LDcgKzMwOCwxMyBAQAogIyBDT05GSUdfVENQX0NPTkdfU0NBTEFCTEUgaXMgbm90IHNldAogIyBDT05GSUdfVENQX0NPTkdfTFAgaXMgbm90IHNldAogIyBDT05GSUdfVENQX0NPTkdfVkVOTyBpcyBub3Qgc2V0Ci0jIENPTkZJR19UQ1BfQ09OR19DT01QT1VORCBpcyBub3Qgc2V0CitDT05GSUdfREVGQVVMVF9CSUM9eQorIyBDT05GSUdfREVGQVVMVF9DVUJJQyBpcyBub3Qgc2V0CisjIENPTkZJR19ERUZBVUxUX0hUQ1AgaXMgbm90IHNldAorIyBDT05GSUdfREVGQVVMVF9WRUdBUyBpcyBub3Qgc2V0CisjIENPTkZJR19ERUZBVUxUX1dFU1RXT09EIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFRkFVTFRfUkVOTyBpcyBub3Qgc2V0CitDT05GSUdfREVGQVVMVF9UQ1BfQ09ORz0iYmljIgogIyBDT05GSUdfSVBWNiBpcyBub3Qgc2V0CiAjIENPTkZJR19JTkVUNl9YRlJNX1RVTk5FTCBpcyBub3Qgc2V0CiAjIENPTkZJR19JTkVUNl9UVU5ORUwgaXMgbm90IHNldApAQCAtMzM4LDcgKzM0NCw2IEBACiAjIENPTkZJR19BVEFMSyBpcyBub3Qgc2V0CiAjIENPTkZJR19YMjUgaXMgbm90IHNldAogIyBDT05GSUdfTEFQQiBpcyBub3Qgc2V0Ci0jIENPTkZJR19ORVRfRElWRVJUIGlzIG5vdCBzZXQKICMgQ09ORklHX0VDT05FVCBpcyBub3Qgc2V0CiAjIENPTkZJR19XQU5fUk9VVEVSIGlzIG5vdCBzZXQKIApAQCAtMzU1LDYgKzM2MCw3IEBACiAjIENPTkZJR19JUkRBIGlzIG5vdCBzZXQKICMgQ09ORklHX0JUIGlzIG5vdCBzZXQKICMgQ09ORklHX0lFRUU4MDIxMSBpcyBub3Qgc2V0CitDT05GSUdfRklCX1JVTEVTPXkKIAogIwogIyBEZXZpY2UgRHJpdmVycwpAQCAtMzY1LDcgKzM3MSw2IEBACiAjCiBDT05GSUdfU1RBTkRBTE9ORT15CiBDT05GSUdfUFJFVkVOVF9GSVJNV0FSRV9CVUlMRD15Ci0jIENPTkZJR19GV19MT0FERVIgaXMgbm90IHNldAogIyBDT05GSUdfU1lTX0hZUEVSVklTT1IgaXMgbm90IHNldAogCiAjCkBAIC00MDMsNiArNDA4LDcgQEAKIENPTkZJR19CTEtfREVWX1JBTT15CiBDT05GSUdfQkxLX0RFVl9SQU1fQ09VTlQ9MTYKIENPTkZJR19CTEtfREVWX1JBTV9TSVpFPTQwOTYKK0NPTkZJR19CTEtfREVWX1JBTV9CTE9DS1NJWkU9MTAyNAogIyBDT05GSUdfQkxLX0RFVl9JTklUUkQgaXMgbm90IHNldAogIyBDT05GSUdfQ0RST01fUEtUQ0RWRCBpcyBub3Qgc2V0CiAjIENPTkZJR19BVEFfT1ZFUl9FVEggaXMgbm90IHNldApAQCAtNDEwLDY1ICs0MTYsMTQgQEAKICMKICMgQVRBL0FUQVBJL01GTS9STEwgc3VwcG9ydAogIwotQ09ORklHX0lERT15Ci1DT05GSUdfQkxLX0RFVl9JREU9eQotCi0jCi0jIFBsZWFzZSBzZWUgRG9jdW1lbnRhdGlvbi9pZGUudHh0IGZvciBoZWxwL2luZm8gb24gSURFIGRyaXZlcwotIwotIyBDT05GSUdfQkxLX0RFVl9JREVfU0FUQSBpcyBub3Qgc2V0Ci1DT05GSUdfQkxLX0RFVl9JREVESVNLPXkKLSMgQ09ORklHX0lERURJU0tfTVVMVElfTU9ERSBpcyBub3Qgc2V0Ci0jIENPTkZJR19CTEtfREVWX0lERUNEIGlzIG5vdCBzZXQKLSMgQ09ORklHX0JMS19ERVZfSURFVEFQRSBpcyBub3Qgc2V0Ci0jIENPTkZJR19CTEtfREVWX0lERUZMT1BQWSBpcyBub3Qgc2V0Ci0jIENPTkZJR19CTEtfREVWX0lERVNDU0kgaXMgbm90IHNldAotIyBDT05GSUdfSURFX1RBU0tfSU9DVEwgaXMgbm90IHNldAotCi0jCi0jIElERSBjaGlwc2V0IHN1cHBvcnQvYnVnZml4ZXMKLSMKLUNPTkZJR19JREVfR0VORVJJQz15Ci1DT05GSUdfQkxLX0RFVl9JREVQQ0k9eQotIyBDT05GSUdfSURFUENJX1NIQVJFX0lSUSBpcyBub3Qgc2V0Ci0jIENPTkZJR19CTEtfREVWX09GRkJPQVJEIGlzIG5vdCBzZXQKLSMgQ09ORklHX0JMS19ERVZfR0VORVJJQyBpcyBub3Qgc2V0Ci0jIENPTkZJR19CTEtfREVWX09QVEk2MjEgaXMgbm90IHNldAotQ09ORklHX0JMS19ERVZfSURFRE1BX1BDST15Ci0jIENPTkZJR19CTEtfREVWX0lERURNQV9GT1JDRUQgaXMgbm90IHNldAotIyBDT05GSUdfSURFRE1BX1BDSV9BVVRPIGlzIG5vdCBzZXQKLSMgQ09ORklHX0JMS19ERVZfQUVDNjJYWCBpcyBub3Qgc2V0Ci0jIENPTkZJR19CTEtfREVWX0FMSTE1WDMgaXMgbm90IHNldAotIyBDT05GSUdfQkxLX0RFVl9BTUQ3NFhYIGlzIG5vdCBzZXQKLSMgQ09ORklHX0JMS19ERVZfQ01ENjRYIGlzIG5vdCBzZXQKLSMgQ09ORklHX0JMS19ERVZfVFJJRkxFWCBpcyBub3Qgc2V0Ci0jIENPTkZJR19CTEtfREVWX0NZODJDNjkzIGlzIG5vdCBzZXQKLSMgQ09ORklHX0JMS19ERVZfQ1M1NTIwIGlzIG5vdCBzZXQKLSMgQ09ORklHX0JMS19ERVZfQ1M1NTMwIGlzIG5vdCBzZXQKLSMgQ09ORklHX0JMS19ERVZfSFBUMzRYIGlzIG5vdCBzZXQKLSMgQ09ORklHX0JMS19ERVZfSFBUMzY2IGlzIG5vdCBzZXQKLSMgQ09ORklHX0JMS19ERVZfU0MxMjAwIGlzIG5vdCBzZXQKLSMgQ09ORklHX0JMS19ERVZfUElJWCBpcyBub3Qgc2V0Ci0jIENPTkZJR19CTEtfREVWX0lUODIxWCBpcyBub3Qgc2V0Ci0jIENPTkZJR19CTEtfREVWX05TODc0MTUgaXMgbm90IHNldAotIyBDT05GSUdfQkxLX0RFVl9QREMyMDJYWF9PTEQgaXMgbm90IHNldAotIyBDT05GSUdfQkxLX0RFVl9QREMyMDJYWF9ORVcgaXMgbm90IHNldAotIyBDT05GSUdfQkxLX0RFVl9TVldLUyBpcyBub3Qgc2V0Ci1DT05GSUdfQkxLX0RFVl9TSUlNQUdFPXkKLSMgQ09ORklHX0JMS19ERVZfU0xDOTBFNjYgaXMgbm90IHNldAotIyBDT05GSUdfQkxLX0RFVl9UUk0yOTAgaXMgbm90IHNldAotIyBDT05GSUdfQkxLX0RFVl9WSUE4MkNYWFggaXMgbm90IHNldAotIyBDT05GSUdfSURFX0FSTSBpcyBub3Qgc2V0Ci1DT05GSUdfQkxLX0RFVl9JREVETUE9eQotIyBDT05GSUdfSURFRE1BX0lWQiBpcyBub3Qgc2V0Ci0jIENPTkZJR19JREVETUFfQVVUTyBpcyBub3Qgc2V0Ci0jIENPTkZJR19CTEtfREVWX0hEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lERSBpcyBub3Qgc2V0CiAKICMKICMgU0NTSSBkZXZpY2Ugc3VwcG9ydAogIwogIyBDT05GSUdfUkFJRF9BVFRSUyBpcyBub3Qgc2V0CiBDT05GSUdfU0NTST15CisjIENPTkZJR19TQ1NJX05FVExJTksgaXMgbm90IHNldAogQ09ORklHX1NDU0lfUFJPQ19GUz15CiAKICMKQEAgLTQ4OSwxMiArNDQ0LDEzIEBACiAjIENPTkZJR19TQ1NJX0xPR0dJTkcgaXMgbm90IHNldAogCiAjCi0jIFNDU0kgVHJhbnNwb3J0IEF0dHJpYnV0ZXMKKyMgU0NTSSBUcmFuc3BvcnRzCiAjCiAjIENPTkZJR19TQ1NJX1NQSV9BVFRSUyBpcyBub3Qgc2V0CiAjIENPTkZJR19TQ1NJX0ZDX0FUVFJTIGlzIG5vdCBzZXQKICMgQ09ORklHX1NDU0lfSVNDU0lfQVRUUlMgaXMgbm90IHNldAogIyBDT05GSUdfU0NTSV9TQVNfQVRUUlMgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9TQVNfTElCU0FTIGlzIG5vdCBzZXQKIAogIwogIyBTQ1NJIGxvdy1sZXZlbCBkcml2ZXJzCkBAIC01MDcsMjEgKzQ2MywyNCBAQAogIyBDT05GSUdfU0NTSV9BSUM3WFhYIGlzIG5vdCBzZXQKICMgQ09ORklHX1NDU0lfQUlDN1hYWF9PTEQgaXMgbm90IHNldAogIyBDT05GSUdfU0NTSV9BSUM3OVhYIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfQUlDOTRYWCBpcyBub3Qgc2V0CiAjIENPTkZJR19TQ1NJX0RQVF9JMk8gaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9BUkNNU1IgaXMgbm90IHNldAogIyBDT05GSUdfTUVHQVJBSURfTkVXR0VOIGlzIG5vdCBzZXQKICMgQ09ORklHX01FR0FSQUlEX0xFR0FDWSBpcyBub3Qgc2V0CiAjIENPTkZJR19NRUdBUkFJRF9TQVMgaXMgbm90IHNldAotIyBDT05GSUdfU0NTSV9TQVRBIGlzIG5vdCBzZXQKICMgQ09ORklHX1NDU0lfSFBUSU9QIGlzIG5vdCBzZXQKICMgQ09ORklHX1NDU0lfRE1YMzE5MUQgaXMgbm90IHNldAogIyBDT05GSUdfU0NTSV9GVVRVUkVfRE9NQUlOIGlzIG5vdCBzZXQKICMgQ09ORklHX1NDU0lfSVBTIGlzIG5vdCBzZXQKICMgQ09ORklHX1NDU0lfSU5JVElPIGlzIG5vdCBzZXQKICMgQ09ORklHX1NDU0lfSU5JQTEwMCBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX1NURVggaXMgbm90IHNldAogIyBDT05GSUdfU0NTSV9TWU01M0M4WFhfMiBpcyBub3Qgc2V0CiAjIENPTkZJR19TQ1NJX0lQUiBpcyBub3Qgc2V0CiAjIENPTkZJR19TQ1NJX1FMT0dJQ18xMjgwIGlzIG5vdCBzZXQKICMgQ09ORklHX1NDU0lfUUxBX0ZDIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfUUxBX0lTQ1NJIGlzIG5vdCBzZXQKICMgQ09ORklHX1NDU0lfTFBGQyBpcyBub3Qgc2V0CiAjIENPTkZJR19TQ1NJX0RDMzk1eCBpcyBub3Qgc2V0CiAjIENPTkZJR19TQ1NJX0RDMzkwVCBpcyBub3Qgc2V0CkBAIC01MjksNiArNDg4LDU5IEBACiAjIENPTkZJR19TQ1NJX0RFQlVHIGlzIG5vdCBzZXQKIAogIworIyBTZXJpYWwgQVRBIChwcm9kKSBhbmQgUGFyYWxsZWwgQVRBIChleHBlcmltZW50YWwpIGRyaXZlcnMKKyMKK0NPTkZJR19BVEE9eQorIyBDT05GSUdfU0FUQV9BSENJIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NBVEFfU1ZXIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FUQV9QSUlYIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NBVEFfTVYgaXMgbm90IHNldAorIyBDT05GSUdfU0FUQV9OViBpcyBub3Qgc2V0CisjIENPTkZJR19QRENfQURNQSBpcyBub3Qgc2V0CisjIENPTkZJR19TQVRBX1FTVE9SIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NBVEFfUFJPTUlTRSBpcyBub3Qgc2V0CisjIENPTkZJR19TQVRBX1NYNCBpcyBub3Qgc2V0CisjIENPTkZJR19TQVRBX1NJTCBpcyBub3Qgc2V0CisjIENPTkZJR19TQVRBX1NJTDI0IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NBVEFfU0lTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NBVEFfVUxJIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NBVEFfVklBIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NBVEFfVklURVNTRSBpcyBub3Qgc2V0CisjIENPTkZJR19QQVRBX0FMSSBpcyBub3Qgc2V0CisjIENPTkZJR19QQVRBX0FNRCBpcyBub3Qgc2V0CisjIENPTkZJR19QQVRBX0FSVE9QIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBVEFfQVRJSVhQIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBVEFfQ01ENjRYIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBVEFfQ1M1NTIwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBVEFfQ1M1NTMwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBVEFfQ1lQUkVTUyBpcyBub3Qgc2V0CisjIENPTkZJR19QQVRBX0VGQVIgaXMgbm90IHNldAorIyBDT05GSUdfQVRBX0dFTkVSSUMgaXMgbm90IHNldAorIyBDT05GSUdfUEFUQV9IUFQzNjYgaXMgbm90IHNldAorIyBDT05GSUdfUEFUQV9IUFQzN1ggaXMgbm90IHNldAorIyBDT05GSUdfUEFUQV9IUFQzWDJOIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBVEFfSFBUM1gzIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBVEFfSVQ4MjFYIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBVEFfSk1JQ1JPTiBpcyBub3Qgc2V0CisjIENPTkZJR19QQVRBX1RSSUZMRVggaXMgbm90IHNldAorIyBDT05GSUdfUEFUQV9NUElJWCBpcyBub3Qgc2V0CisjIENPTkZJR19QQVRBX09MRFBJSVggaXMgbm90IHNldAorIyBDT05GSUdfUEFUQV9ORVRDRUxMIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBVEFfTlM4NzQxMCBpcyBub3Qgc2V0CisjIENPTkZJR19QQVRBX09QVEkgaXMgbm90IHNldAorIyBDT05GSUdfUEFUQV9PUFRJRE1BIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBVEFfUERDX09MRCBpcyBub3Qgc2V0CisjIENPTkZJR19QQVRBX1JBRElTWVMgaXMgbm90IHNldAorIyBDT05GSUdfUEFUQV9SWjEwMDAgaXMgbm90IHNldAorIyBDT05GSUdfUEFUQV9TQzEyMDAgaXMgbm90IHNldAorIyBDT05GSUdfUEFUQV9TRVJWRVJXT1JLUyBpcyBub3Qgc2V0CisjIENPTkZJR19QQVRBX1BEQzIwMjdYIGlzIG5vdCBzZXQKK0NPTkZJR19QQVRBX1NJTDY4MD15CisjIENPTkZJR19QQVRBX1NJUyBpcyBub3Qgc2V0CisjIENPTkZJR19QQVRBX1ZJQSBpcyBub3Qgc2V0CisjIENPTkZJR19QQVRBX1dJTkJPTkQgaXMgbm90IHNldAorCisjCiAjIE11bHRpLWRldmljZSBzdXBwb3J0IChSQUlEIGFuZCBMVk0pCiAjCiAjIENPTkZJR19NRCBpcyBub3Qgc2V0CkBAIC02MzIsNiArNjQ0LDcgQEAKICMgQ09ORklHX1NLOThMSU4gaXMgbm90IHNldAogIyBDT05GSUdfVElHT04zIGlzIG5vdCBzZXQKICMgQ09ORklHX0JOWDIgaXMgbm90IHNldAorIyBDT05GSUdfUUxBM1hYWCBpcyBub3Qgc2V0CiAKICMKICMgRXRoZXJuZXQgKDEwMDAwIE1iaXQpCkBAIC02NzksNiArNjkyLDcgQEAKICMgSW5wdXQgZGV2aWNlIHN1cHBvcnQKICMKIENPTkZJR19JTlBVVD15CisjIENPTkZJR19JTlBVVF9GRl9NRU1MRVNTIGlzIG5vdCBzZXQKIAogIwogIyBVc2VybGFuZCBpbnRlcmZhY2VzCkBAIC03NTgsNyArNzcyLDYgQEAKICMgVFBNIGRldmljZXMKICMKICMgQ09ORklHX1RDR19UUE0gaXMgbm90IHNldAotIyBDT05GSUdfVEVMQ0xPQ0sgaXMgbm90IHNldAogCiAjCiAjIEkyQyBzdXBwb3J0CkBAIC03ODQsMTIgKzc5NywxMiBAQAogIwogIyBNaXNjIGRldmljZXMKICMKKyMgQ09ORklHX1RJRk1fQ09SRSBpcyBub3Qgc2V0CiAKICMKICMgTXVsdGltZWRpYSBkZXZpY2VzCiAjCiAjIENPTkZJR19WSURFT19ERVYgaXMgbm90IHNldAotQ09ORklHX1ZJREVPX1Y0TDI9eQogCiAjCiAjIERpZ2l0YWwgVmlkZW8gQnJvYWRjYXN0aW5nIERldmljZXMKQEAgLTg5NywxMyArOTEwLDEzIEBACiAjIENPTkZJR19VU0JfU1RPUkFHRV9ERUJVRyBpcyBub3Qgc2V0CiAjIENPTkZJR19VU0JfU1RPUkFHRV9EQVRBRkFCIGlzIG5vdCBzZXQKICMgQ09ORklHX1VTQl9TVE9SQUdFX0ZSRUVDT00gaXMgbm90IHNldAotIyBDT05GSUdfVVNCX1NUT1JBR0VfSVNEMjAwIGlzIG5vdCBzZXQKICMgQ09ORklHX1VTQl9TVE9SQUdFX0RQQ00gaXMgbm90IHNldAogIyBDT05GSUdfVVNCX1NUT1JBR0VfVVNCQVQgaXMgbm90IHNldAogIyBDT05GSUdfVVNCX1NUT1JBR0VfU0REUjA5IGlzIG5vdCBzZXQKICMgQ09ORklHX1VTQl9TVE9SQUdFX1NERFI1NSBpcyBub3Qgc2V0CiAjIENPTkZJR19VU0JfU1RPUkFHRV9KVU1QU0hPVCBpcyBub3Qgc2V0CiAjIENPTkZJR19VU0JfU1RPUkFHRV9BTEFVREEgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1NUT1JBR0VfS0FSTUEgaXMgbm90IHNldAogIyBDT05GSUdfVVNCX0xJQlVTVUFMIGlzIG5vdCBzZXQKIAogIwpAQCAtOTMyLDYgKzk0NSw3IEBACiAjIENPTkZJR19VU0JfQVRJX1JFTU9URTIgaXMgbm90IHNldAogIyBDT05GSUdfVVNCX0tFWVNQQU5fUkVNT1RFIGlzIG5vdCBzZXQKICMgQ09ORklHX1VTQl9BUFBMRVRPVUNIIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9UUkFOQ0VWSUJSQVRPUiBpcyBub3Qgc2V0CiAKICMKICMgVVNCIEltYWdpbmcgZGV2aWNlcwpAQCAtOTYzLDE2ICs5NzcsMTcgQEAKICMKICMgQ09ORklHX1VTQl9FTUk2MiBpcyBub3Qgc2V0CiAjIENPTkZJR19VU0JfRU1JMjYgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0FEVVRVWCBpcyBub3Qgc2V0CiAjIENPTkZJR19VU0JfQVVFUlNXQUxEIGlzIG5vdCBzZXQKICMgQ09ORklHX1VTQl9SSU81MDAgaXMgbm90IHNldAogIyBDT05GSUdfVVNCX0xFR09UT1dFUiBpcyBub3Qgc2V0CiAjIENPTkZJR19VU0JfTENEIGlzIG5vdCBzZXQKICMgQ09ORklHX1VTQl9MRUQgaXMgbm90IHNldAotIyBDT05GSUdfVVNCX0NZN0M2MyBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfQ1lQUkVTU19DWTdDNjMgaXMgbm90IHNldAogIyBDT05GSUdfVVNCX0NZVEhFUk0gaXMgbm90IHNldAotIyBDT05GSUdfVVNCX1BISURHRVRLSVQgaXMgbm90IHNldAotIyBDT05GSUdfVVNCX1BISURHRVRTRVJWTyBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfUEhJREdFVCBpcyBub3Qgc2V0CiAjIENPTkZJR19VU0JfSURNT1VTRSBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfRlRESV9FTEFOIGlzIG5vdCBzZXQKICMgQ09ORklHX1VTQl9BUFBMRURJU1BMQVkgaXMgbm90IHNldAogIyBDT05GSUdfVVNCX1NJU1VTQlZHQSBpcyBub3Qgc2V0CiAjIENPTkZJR19VU0JfTEQgaXMgbm90IHNldApAQCAtMTA0MSw2ICsxMDU2LDcgQEAKIENPTkZJR19FWFQzX0ZTX1hBVFRSPXkKICMgQ09ORklHX0VYVDNfRlNfUE9TSVhfQUNMIGlzIG5vdCBzZXQKICMgQ09ORklHX0VYVDNfRlNfU0VDVVJJVFkgaXMgbm90IHNldAorIyBDT05GSUdfRVhUNERFVl9GUyBpcyBub3Qgc2V0CiBDT05GSUdfSkJEPXkKICMgQ09ORklHX0pCRF9ERUJVRyBpcyBub3Qgc2V0CiBDT05GSUdfRlNfTUJDQUNIRT15CkBAIC0xMDUyLDYgKzEwNjgsNyBAQAogIyBDT05GSUdfWEZTX1NFQ1VSSVRZIGlzIG5vdCBzZXQKIENPTkZJR19YRlNfUE9TSVhfQUNMPXkKICMgQ09ORklHX1hGU19SVCBpcyBub3Qgc2V0CisjIENPTkZJR19HRlMyX0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX09DRlMyX0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX01JTklYX0ZTIGlzIG5vdCBzZXQKIENPTkZJR19ST01GU19GUz1tCkBAIC0xMDgyLDggKzEwOTksMTAgQEAKICMKIENPTkZJR19QUk9DX0ZTPXkKIENPTkZJR19QUk9DX0tDT1JFPXkKK0NPTkZJR19QUk9DX1NZU0NUTD15CiBDT05GSUdfU1lTRlM9eQogQ09ORklHX1RNUEZTPXkKKyMgQ09ORklHX1RNUEZTX1BPU0lYX0FDTCBpcyBub3Qgc2V0CiAjIENPTkZJR19IVUdFVExCX1BBR0UgaXMgbm90IHNldAogQ09ORklHX1JBTUZTPXkKICMgQ09ORklHX0NPTkZJR0ZTX0ZTIGlzIG5vdCBzZXQKQEAgLTExMjMsNyArMTE0Miw2IEBACiAjIENPTkZJR19SUENTRUNfR1NTX1NQS00zIGlzIG5vdCBzZXQKICMgQ09ORklHX1NNQl9GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19DSUZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0NJRlNfREVCVUcyIGlzIG5vdCBzZXQKICMgQ09ORklHX05DUF9GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19DT0RBX0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX0FGU19GUyBpcyBub3Qgc2V0CkBAIC0xMTUwLDExICsxMTY4LDEzIEBACiAjCiBDT05GSUdfVFJBQ0VfSVJRRkxBR1NfU1VQUE9SVD15CiAjIENPTkZJR19QUklOVEtfVElNRSBpcyBub3Qgc2V0CitDT05GSUdfRU5BQkxFX01VU1RfQ0hFQ0s9eQogIyBDT05GSUdfTUFHSUNfU1lTUlEgaXMgbm90IHNldAogIyBDT05GSUdfVU5VU0VEX1NZTUJPTFMgaXMgbm90IHNldAogIyBDT05GSUdfREVCVUdfS0VSTkVMIGlzIG5vdCBzZXQKIENPTkZJR19MT0dfQlVGX1NISUZUPTE0CiAjIENPTkZJR19ERUJVR19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19IRUFERVJTX0NIRUNLIGlzIG5vdCBzZXQKIENPTkZJR19DUk9TU0NPTVBJTEU9eQogQ09ORklHX0NNRExJTkU9Im1lbT02NE0gY29uc29sZT10dHlWUjAsMTE1MjAwIGlwPWFueSByb290PS9kZXYvbmZzIgogCkBAIC0xMTcwLDEwICsxMTkwLDYgQEAKICMgQ09ORklHX0NSWVBUTyBpcyBub3Qgc2V0CiAKICMKLSMgSGFyZHdhcmUgY3J5cHRvIGRldmljZXMKLSMKLQotIwogIyBMaWJyYXJ5IHJvdXRpbmVzCiAjCiAjIENPTkZJR19DUkNfQ0NJVFQgaXMgbm90IHNldApkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2RlYy90aW1lLmMgYi9hcmNoL21pcHMvZGVjL3RpbWUuYwppbmRleCA0Y2YwYzA2Li42OWU0MjRlIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvZGVjL3RpbWUuYworKysgYi9hcmNoL21pcHMvZGVjL3RpbWUuYwpAQCAtMTYwLDExICsxNjAsNiBAQAogCXJldHVybiBpb2FzaWNfcmVhZChJT19SRUdfRkNUUik7CiB9CiAKLXN0YXRpYyB2b2lkIGRlY19pb2FzaWNfaHB0X2luaXQodW5zaWduZWQgaW50IGNvdW50KQotewotCWlvYXNpY193cml0ZShJT19SRUdfRkNUUiwgaW9hc2ljX3JlYWQoSU9fUkVHX0ZDVFIpIC0gY291bnQpOwotfQotCiAKIHZvaWQgX19pbml0IGRlY190aW1lX2luaXQodm9pZCkKIHsKQEAgLTE3NCwxMSArMTY5LDkgQEAKIAltaXBzX3RpbWVyX3N0YXRlID0gZGVjX3RpbWVyX3N0YXRlOwogCW1pcHNfdGltZXJfYWNrID0gZGVjX3RpbWVyX2FjazsKIAotCWlmICghY3B1X2hhc19jb3VudGVyICYmIElPQVNJQykgeworCWlmICghY3B1X2hhc19jb3VudGVyICYmIElPQVNJQykKIAkJLyogRm9yIHByZS1SNGsgc3lzdGVtcyB3ZSB1c2UgdGhlIEkvTyBBU0lDJ3MgY291bnRlci4gICovCiAJCW1pcHNfaHB0X3JlYWQgPSBkZWNfaW9hc2ljX2hwdF9yZWFkOwotCQltaXBzX2hwdF9pbml0ID0gZGVjX2lvYXNpY19ocHRfaW5pdDsKLQl9CiAKIAkvKiBTZXQgdXAgdGhlIHJhdGUgb2YgcGVyaW9kaWMgRFMxMjg3IGludGVycnVwdHMuICAqLwogCUNNT1NfV1JJVEUoUlRDX1JFRl9DTENLXzMyS0haIHwgKDE2IC0gX19mZnMoSFopKSwgUlRDX1JFR19BKTsKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9lbW1hMnJoL2NvbW1vbi9pcnFfZW1tYTJyaC5jIGIvYXJjaC9taXBzL2VtbWEycmgvY29tbW9uL2lycV9lbW1hMnJoLmMKaW5kZXggN2M5MzA4Ni4uMTk3ZWQ0YyAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2VtbWEycmgvY29tbW9uL2lycV9lbW1hMnJoLmMKKysrIGIvYXJjaC9taXBzL2VtbWEycmgvY29tbW9uL2lycV9lbW1hMnJoLmMKQEAgLTk3LDcgKzk3LDcgQEAKIAkJaXJxX2Rlc2NbaV0uc3RhdHVzID0gSVJRX0RJU0FCTEVEOwogCQlpcnFfZGVzY1tpXS5hY3Rpb24gPSBOVUxMOwogCQlpcnFfZGVzY1tpXS5kZXB0aCA9IDE7Ci0JCWlycV9kZXNjW2ldLmhhbmRsZXIgPSAmZW1tYTJyaF9pcnFfY29udHJvbGxlcjsKKwkJaXJxX2Rlc2NbaV0uY2hpcCA9ICZlbW1hMnJoX2lycV9jb250cm9sbGVyOwogCX0KIAogCWVtbWEycmhfaXJxX2Jhc2UgPSBpcnFfYmFzZTsKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9lbW1hMnJoL21hcmtlaW5zL2lycV9tYXJrZWlucy5jIGIvYXJjaC9taXBzL2VtbWEycmgvbWFya2VpbnMvaXJxX21hcmtlaW5zLmMKaW5kZXggZjIzYWU5Zi4uMGIzNmViMCAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2VtbWEycmgvbWFya2VpbnMvaXJxX21hcmtlaW5zLmMKKysrIGIvYXJjaC9taXBzL2VtbWEycmgvbWFya2VpbnMvaXJxX21hcmtlaW5zLmMKQEAgLTg2LDcgKzg2LDcgQEAKIAkJaXJxX2Rlc2NbaV0uc3RhdHVzID0gSVJRX0RJU0FCTEVEOwogCQlpcnFfZGVzY1tpXS5hY3Rpb24gPSBOVUxMOwogCQlpcnFfZGVzY1tpXS5kZXB0aCA9IDI7Ci0JCWlycV9kZXNjW2ldLmhhbmRsZXIgPSAmZW1tYTJyaF9zd19pcnFfY29udHJvbGxlcjsKKwkJaXJxX2Rlc2NbaV0uY2hpcCA9ICZlbW1hMnJoX3N3X2lycV9jb250cm9sbGVyOwogCX0KIAogCWVtbWEycmhfc3dfaXJxX2Jhc2UgPSBpcnFfYmFzZTsKQEAgLTE2Niw3ICsxNjYsNyBAQAogCQlpcnFfZGVzY1tpXS5zdGF0dXMgPSBJUlFfRElTQUJMRUQ7CiAJCWlycV9kZXNjW2ldLmFjdGlvbiA9IE5VTEw7CiAJCWlycV9kZXNjW2ldLmRlcHRoID0gMjsKLQkJaXJxX2Rlc2NbaV0uaGFuZGxlciA9ICZlbW1hMnJoX2dwaW9faXJxX2NvbnRyb2xsZXI7CisJCWlycV9kZXNjW2ldLmNoaXAgPSAmZW1tYTJyaF9ncGlvX2lycV9jb250cm9sbGVyOwogCX0KIAogCWVtbWEycmhfZ3Bpb19pcnFfYmFzZSA9IGlycV9iYXNlOwpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2VtbWEycmgvbWFya2VpbnMvcGxhdGZvcm0uYyBiL2FyY2gvbWlwcy9lbW1hMnJoL21hcmtlaW5zL3BsYXRmb3JtLmMKaW5kZXggMTVjYzYxZC4uMTE1Njc3MCAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2VtbWEycmgvbWFya2VpbnMvcGxhdGZvcm0uYworKysgYi9hcmNoL21pcHMvZW1tYTJyaC9tYXJrZWlucy9wbGF0Zm9ybS5jCkBAIC00NCwxOCArNDQsNDUgQEAKICNkZWZpbmUgSTJDX0VNTUEyUkggImVtbWEycmgtaWljIiAvKiBtdXN0IGJlIGluIHN5bmMgd2l0aCBJSUMgZHJpdmVyICovCiAKIHN0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgaTJjX2VtbWFfcmVzb3VyY2VzXzBbXSA9IHsKLQl7IE5VTEwsIEVNTUEyUkhfSVJRX1BJSUMwLCBFTU1BMlJIX0lSUV9QSUlDMCwgSU9SRVNPVVJDRV9JUlEgfSwKLQl7IE5VTEwsIEtTRUcxQUREUihFTU1BMlJIX1BJSUMwX0JBU0UpLCBLU0VHMUFERFIoRU1NQTJSSF9QSUlDMF9CQVNFICsgMHgxMDAwKSwgMCB9LAorCXsKKwkJLm5hbWUJPSBOVUxMLAorCQkuc3RhcnQJPSBFTU1BMlJIX0lSUV9QSUlDMCwKKwkJLmVuZAk9IEVNTUEyUkhfSVJRX1BJSUMwLAorCQkuZmxhZ3MJPSBJT1JFU09VUkNFX0lSUQorCX0sIHsKKwkJLm5hbWUJPSBOVUxMLAorCQkuc3RhcnQJPSBFTU1BMlJIX1BJSUMwX0JBU0UsCisJCS5lbmQJPSBFTU1BMlJIX1BJSUMwX0JBU0UgKyAweDEwMDAsCisJCS5mbGFncwk9IDAKKwl9LAogfTsKIAogc3RydWN0IHJlc291cmNlIGkyY19lbW1hX3Jlc291cmNlc18xW10gPSB7Ci0JeyBOVUxMLCBFTU1BMlJIX0lSUV9QSUlDMSwgRU1NQTJSSF9JUlFfUElJQzEsIElPUkVTT1VSQ0VfSVJRIH0sCi0JeyBOVUxMLCBLU0VHMUFERFIoRU1NQTJSSF9QSUlDMV9CQVNFKSwgS1NFRzFBRERSKEVNTUEyUkhfUElJQzFfQkFTRSArIDB4MTAwMCksIDAgfSwKKwl7CisJCS5uYW1lCT0gTlVMTCwKKwkJLnN0YXJ0CT0gRU1NQTJSSF9JUlFfUElJQzEsCisJCS5lbmQJPSBFTU1BMlJIX0lSUV9QSUlDMSwKKwkJLmZsYWdzCT0gSU9SRVNPVVJDRV9JUlEKKwl9LCB7CisJCS5uYW1lCT0gTlVMTCwKKwkJLnN0YXJ0CT0gRU1NQTJSSF9QSUlDMV9CQVNFLAorCQkuZW5kCT0gRU1NQTJSSF9QSUlDMV9CQVNFICsgMHgxMDAwLAorCQkuZmxhZ3MJPSAwCisJfSwKIH07CiAKIHN0cnVjdCByZXNvdXJjZSBpMmNfZW1tYV9yZXNvdXJjZXNfMltdID0gewotCXsgTlVMTCwgRU1NQTJSSF9JUlFfUElJQzIsIEVNTUEyUkhfSVJRX1BJSUMyLCBJT1JFU09VUkNFX0lSUSB9LAotCXsgTlVMTCwgS1NFRzFBRERSKEVNTUEyUkhfUElJQzJfQkFTRSksIEtTRUcxQUREUihFTU1BMlJIX1BJSUMyX0JBU0UgKyAweDEwMDApLCAwIH0sCisJeworCQkubmFtZQk9IE5VTEwsCisJCS5zdGFydAk9IEVNTUEyUkhfSVJRX1BJSUMyLAorCQkuZW5kCT0gRU1NQTJSSF9JUlFfUElJQzIsCisJCS5mbGFncwk9IElPUkVTT1VSQ0VfSVJRCisJfSwgeworCQkubmFtZQk9IE5VTEwsCisJCS5zdGFydAk9IEVNTUEyUkhfUElJQzJfQkFTRSwKKwkJLmVuZAk9IEVNTUEyUkhfUElJQzJfQkFTRSArIDB4MTAwMCwKKwkJLmZsYWdzCT0gMAorCX0sCiB9OwogCiBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGkyY19lbW1hX2RldmljZXNbXSA9IHsKQEAgLTgzLDMyICsxMTAsMjkgQEAKICNkZWZpbmUgRU1NQTJSSF9TRVJJQUxfRkxBR1MgVVBGX0JPT1RfQVVUT0NPTkYgfCBVUEZfU0tJUF9URVNUCiAKIHN0YXRpYyBzdHJ1Y3QgIHBsYXRfc2VyaWFsODI1MF9wb3J0IHBsYXRmb3JtX3NlcmlhbF9wb3J0c1tdID0gewotICAgICAgIFswXSA9IHsKLSAgICAgICAgIC5tZW1iYXNlID0gKHZvaWQgX19pb21lbSopS1NFRzFBRERSKEVNTUEyUkhfUEZVUjBfQkFTRSArIDMpLAotICAgICAgICAgLmlycSA9IEVNTUEyUkhfSVJRX1BGVVIwLAotICAgICAgICAgLnVhcnRjbGsgPSBFTU1BMlJIX1NFUklBTF9DTE9DSywKLSAgICAgICAgIC5yZWdzaGlmdCA9IDQsCi0gICAgICAgICAuaW90eXBlID0gVVBJT19NRU0sCi0gICAgICAgICAuZmxhZ3MgPSBFTU1BMlJIX1NFUklBTF9GTEFHUywKLSAgICAgICB9LAotICAgICAgIFsxXSA9IHsKLSAgICAgICAgIC5tZW1iYXNlID0gKHZvaWQgX19pb21lbSopS1NFRzFBRERSKEVNTUEyUkhfUEZVUjFfQkFTRSArIDMpLAotICAgICAgICAgLmlycSA9IEVNTUEyUkhfSVJRX1BGVVIxLAotICAgICAgICAgLnVhcnRjbGsgPSBFTU1BMlJIX1NFUklBTF9DTE9DSywKLSAgICAgICAgIC5yZWdzaGlmdCA9IDQsCi0gICAgICAgICAuaW90eXBlID0gVVBJT19NRU0sCi0gICAgICAgICAuZmxhZ3MgPSBFTU1BMlJIX1NFUklBTF9GTEFHUywKLSAgICAgICB9LAotICAgICAgIFsyXSA9IHsKLSAgICAgICAgIC5tZW1iYXNlID0gKHZvaWQgX19pb21lbSopS1NFRzFBRERSKEVNTUEyUkhfUEZVUjJfQkFTRSArIDMpLAotICAgICAgICAgLmlycSA9IEVNTUEyUkhfSVJRX1BGVVIyLAotICAgICAgICAgLnVhcnRjbGsgPSBFTU1BMlJIX1NFUklBTF9DTE9DSywKLSAgICAgICAgIC5yZWdzaGlmdCA9IDQsCi0gICAgICAgICAuaW90eXBlID0gVVBJT19NRU0sCi0gICAgICAgICAuZmxhZ3MgPSBFTU1BMlJIX1NFUklBTF9GTEFHUywKLSAgICAgICB9LAotICAgICAgIFszXSA9IHsKLQkgLmZsYWdzID0gMCwKKwlbMF0gPSB7CisJCS5tZW1iYXNlPSAodm9pZCBfX2lvbWVtKilLU0VHMUFERFIoRU1NQTJSSF9QRlVSMF9CQVNFICsgMyksCisJCS5pcnEgPSBFTU1BMlJIX0lSUV9QRlVSMCwKKwkJLnVhcnRjbGsgPSBFTU1BMlJIX1NFUklBTF9DTE9DSywKKwkJLnJlZ3NoaWZ0ID0gNCwKKwkJLmlvdHlwZSA9IFVQSU9fTUVNLAorCQkuZmxhZ3MgPSBFTU1BMlJIX1NFUklBTF9GTEFHUywKKyAgICAgICB9LCBbMV0gPSB7CisJCS5tZW1iYXNlID0gKHZvaWQgX19pb21lbSopS1NFRzFBRERSKEVNTUEyUkhfUEZVUjFfQkFTRSArIDMpLAorCQkuaXJxID0gRU1NQTJSSF9JUlFfUEZVUjEsCisJCS51YXJ0Y2xrID0gRU1NQTJSSF9TRVJJQUxfQ0xPQ0ssCisJCS5yZWdzaGlmdCA9IDQsCisJCS5pb3R5cGUgPSBVUElPX01FTSwKKwkJLmZsYWdzID0gRU1NQTJSSF9TRVJJQUxfRkxBR1MsCisgICAgICAgfSwgWzJdID0geworCQkubWVtYmFzZSA9ICh2b2lkIF9faW9tZW0qKUtTRUcxQUREUihFTU1BMlJIX1BGVVIyX0JBU0UgKyAzKSwKKwkJLmlycSA9IEVNTUEyUkhfSVJRX1BGVVIyLAorCQkudWFydGNsayA9IEVNTUEyUkhfU0VSSUFMX0NMT0NLLAorCQkucmVnc2hpZnQgPSA0LAorCQkuaW90eXBlID0gVVBJT19NRU0sCisJCS5mbGFncyA9IEVNTUEyUkhfU0VSSUFMX0ZMQUdTLAorICAgICAgIH0sIFszXSA9IHsKKwkJLmZsYWdzID0gMCwKICAgICAgICB9LAogfTsKIApkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2d0NjQxMjAvY29tbW9uL3RpbWUuYyBiL2FyY2gvbWlwcy9ndDY0MTIwL2NvbW1vbi90aW1lLmMKaW5kZXggYzgzYWU2YS4uYzQ3ZWViNyAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2d0NjQxMjAvY29tbW9uL3RpbWUuYworKysgYi9hcmNoL21pcHMvZ3Q2NDEyMC9jb21tb24vdGltZS5jCkBAIC02NCwxNCArNjQsMTQgQEAKICAqIGFzICppcnEgKD1pcnEwIGluIC4uL2tlcm5lbC90aW1lLmMpLiAgV2Ugd2lsbCBkbyBvdXIgb3duIHRpbWVyIGludGVycnVwdAogICogaGFuZGxpbmcuCiAgKi8KLXZvaWQgZ3Q2NDEyMF90aW1lX2luaXQodm9pZCkKK3ZvaWQgX19pbml0IHBsYXRfdGltZXJfc2V0dXAoc3RydWN0IGlycWFjdGlvbiAqaXJxKQogewogCXN0YXRpYyBzdHJ1Y3QgaXJxYWN0aW9uIHRpbWVyOwogCiAJLyogRGlzYWJsZSB0aW1lciBmaXJzdCAqLwogCUdUX1dSSVRFKEdUX1RDX0NPTlRST0xfT0ZTLCAwKTsKIAkvKiBMb2FkIHRpbWVyIHZhbHVlIGZvciAxMDAgSHogKi8KLQlHVF9XUklURShHVF9UQzNfT0ZTLCBTeXNfY2xvY2sgLyAxMDApOworCUdUX1dSSVRFKEdUX1RDM19PRlMsIFN5c19jbG9jayAvIEhaKTsKIAogCS8qCiAJICogQ3JlYXRlIHRoZSBJUlEgc3RydWN0dXJlIGVudHJ5IGZvciB0aGUgdGltZXIuICBTaW5jZSB3ZSdyZSB0b28gZWFybHkKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9ndDY0MTIwL2V2NjQxMjAvc2V0dXAuYyBiL2FyY2gvbWlwcy9ndDY0MTIwL2V2NjQxMjAvc2V0dXAuYwppbmRleCA5MWMyZDNmLi45OWM4ZDQyIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvZ3Q2NDEyMC9ldjY0MTIwL3NldHVwLmMKKysrIGIvYXJjaC9taXBzL2d0NjQxMjAvZXY2NDEyMC9zZXR1cC5jCkBAIC02OCw3ICs2OCw2IEBACiAgKiBJbml0aWFsaXplcyBiYXNpYyByb3V0aW5lcyBhbmQgc3RydWN0dXJlcyBwb2ludGVycywgbWVtb3J5IHNpemUgKGFzCiAgKiBnaXZlbiBieSB0aGUgYmlvcyBhbmQgc2F2ZXMgdGhlIGNvbW1hbmQgbGluZS4KICAqLwotZXh0ZXJuIHZvaWQgZ3Q2NDEyMF90aW1lX2luaXQodm9pZCk7CiAKIHZvaWQgX19pbml0IHBsYXRfbWVtX3NldHVwKHZvaWQpCiB7CkBAIC03Niw3ICs3NSw2IEBACiAJX21hY2hpbmVfaGFsdCA9IGdhbGlsZW9fbWFjaGluZV9oYWx0OwogCXBtX3Bvd2VyX29mZiA9IGdhbGlsZW9fbWFjaGluZV9wb3dlcl9vZmY7CiAKLQlib2FyZF90aW1lX2luaXQgPSBndDY0MTIwX3RpbWVfaW5pdDsKIAlzZXRfaW9fcG9ydF9iYXNlKEtTRUcxKTsKIH0KIApkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2d0NjQxMjAvbW9tZW5jb19vY2Vsb3Qvc2V0dXAuYyBiL2FyY2gvbWlwcy9ndDY0MTIwL21vbWVuY29fb2NlbG90L3NldHVwLmMKaW5kZXggMGU1YmJlZS4uOTRmOTRlYiAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2d0NjQxMjAvbW9tZW5jb19vY2Vsb3Qvc2V0dXAuYworKysgYi9hcmNoL21pcHMvZ3Q2NDEyMC9tb21lbmNvX29jZWxvdC9zZXR1cC5jCkBAIC03MCw3ICs3MCw2IEBACiBleHRlcm4gdm9pZCBtb21lbmNvX29jZWxvdF9oYWx0KHZvaWQpOwogZXh0ZXJuIHZvaWQgbW9tZW5jb19vY2Vsb3RfcG93ZXJfb2ZmKHZvaWQpOwogCi1leHRlcm4gdm9pZCBndDY0MTIwX3RpbWVfaW5pdCh2b2lkKTsKIGV4dGVybiB2b2lkIG1vbWVuY29fb2NlbG90X2lycV9zZXR1cCh2b2lkKTsKIAogc3RhdGljIGNoYXIgcmVzZXRfcmVhc29uOwpAQCAtMTU2LDggKzE1NSw2IEBACiAJdm9pZCAoKmwzZnVuYykodW5zaWduZWQgbG9uZyk9S1NFRzFBRERSKCZzZXR1cF9sM2NhY2hlKTsKIAl1bnNpZ25lZCBpbnQgdG1wd29yZDsKIAotCWJvYXJkX3RpbWVfaW5pdCA9IGd0NjQxMjBfdGltZV9pbml0OwotCiAJX21hY2hpbmVfcmVzdGFydCA9IG1vbWVuY29fb2NlbG90X3Jlc3RhcnQ7CiAJX21hY2hpbmVfaGFsdCA9IG1vbWVuY29fb2NlbG90X2hhbHQ7CiAJcG1fcG93ZXJfb2ZmID0gbW9tZW5jb19vY2Vsb3RfcG93ZXJfb2ZmOwpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2phenovc2V0dXAuYyBiL2FyY2gvbWlwcy9qYXp6L3NldHVwLmMKaW5kZXggNmRjNDEzNS4uZDg0OGYxYSAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2phenovc2V0dXAuYworKysgYi9hcmNoL21pcHMvamF6ei9zZXR1cC5jCkBAIC0zNyw3ICszNyw3IEBACiBleHRlcm4gdm9pZCBqYXp6X21hY2hpbmVfaGFsdCh2b2lkKTsKIGV4dGVybiB2b2lkIGphenpfbWFjaGluZV9wb3dlcl9vZmYodm9pZCk7CiAKLXZvaWQgX19pbml0IHBsYXRfdGltZV9pbml0KHN0cnVjdCBpcnFhY3Rpb24gKmlycSkKK3ZvaWQgX19pbml0IHBsYXRfdGltZXJfc2V0dXAoc3RydWN0IGlycWFjdGlvbiAqaXJxKQogewogCS8qIHNldCB0aGUgY2xvY2sgdG8gMTAwIEh6ICovCiAJcjQwMzBfd3JpdGVfcmVnMzIoSkFaWl9USU1FUl9JTlRFUlZBTCwgOSk7CmRpZmYgLS1naXQgYS9hcmNoL21pcHMvam1yMzkyNy9yYmhtYTMxMDAvaXJxLmMgYi9hcmNoL21pcHMvam1yMzkyNy9yYmhtYTMxMDAvaXJxLmMKaW5kZXggMzlhMDI0My4uZGU0YTIzOCAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2ptcjM5MjcvcmJobWEzMTAwL2lycS5jCisrKyBiL2FyY2gvbWlwcy9qbXIzOTI3L3JiaG1hMzEwMC9pcnEuYwpAQCAtMjg4LDYgKzI4OCw4IEBACiAKIHN0YXRpYyB2b2lkIGptcjM5Mjdfc3B1cmlvdXModm9pZCkKIHsKKwlzdHJ1Y3QgcHRfcmVncyAqIHJlZ3MgPSBnZXRfaXJxX3JlZ3MoKTsKKwogI2lmZGVmIENPTkZJR19UWF9CUkFOQ0hfTElLRUxZX0JVR19XT1JLQVJPVU5ECiAJdHhfYnJhbmNoX2xpa2VseV9idWdfZml4dXAoKTsKICNlbmRpZgpAQCAtMjk3LDYgKzI5OSw3IEBACiAKIGFzbWxpbmthZ2Ugdm9pZCBwbGF0X2lycV9kaXNwYXRjaCh2b2lkKQogeworCXN0cnVjdCBwdF9yZWdzICogcmVncyA9IGdldF9pcnFfcmVncygpOwogCWludCBpcnE7CiAKICNpZmRlZiBDT05GSUdfVFhfQlJBTkNIX0xJS0VMWV9CVUdfV09SS0FST1VORApkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2ptcjM5MjcvcmJobWEzMTAwL3NldHVwLmMgYi9hcmNoL21pcHMvam1yMzkyNy9yYmhtYTMxMDAvc2V0dXAuYwppbmRleCAwMjU0MzQwLi4xNmU1ZGZlIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvam1yMzkyNy9yYmhtYTMxMDAvc2V0dXAuYworKysgYi9hcmNoL21pcHMvam1yMzkyNy9yYmhtYTMxMDAvc2V0dXAuYwpAQCAtMTcwLDEyICsxNzAsMjAgQEAKIAl3aGlsZSAoMSk7CiB9CiAKK3N0YXRpYyB1bnNpZ25lZCBpbnQgam1yMzkyN19ocHRfcmVhZCh2b2lkKQoreworCS8qIFdlIGFzc3VtZSB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB4dGltZV9sb2NrIGhlbGQuICovCisJcmV0dXJuIGppZmZpZXMgKiAoSk1SMzkyN19USU1FUl9DTEsgLyBIWikgKyBqbXIzOTI3X3RtcnB0ci0+dHJyOworfQorCiAjZGVmaW5lIFVTRV9SVENfRFMxNzQyCiAjaWZkZWYgVVNFX1JUQ19EUzE3NDIKIGV4dGVybiB2b2lkIHJ0Y19kczE3NDJfaW5pdCh1bnNpZ25lZCBsb25nIGJhc2UpOwogI2VuZGlmCiBzdGF0aWMgdm9pZCBfX2luaXQgam1yMzkyN190aW1lX2luaXQodm9pZCkKIHsKKwltaXBzX2hwdF9yZWFkID0gam1yMzkyN19ocHRfcmVhZDsKKwltaXBzX2hwdF9mcmVxdWVuY3kgPSBKTVIzOTI3X1RJTUVSX0NMSzsKICNpZmRlZiBVU0VfUlRDX0RTMTc0MgogCWlmIChqbXIzOTI3X2hhdmVfbnZyYW0oKSkgewogCSAgICAgICAgcnRjX2RzMTc0Ml9pbml0KEpNUjM5MjdfSU9DX05WUkFNQl9BRERSKTsKQEAgLTE4MywxMiArMTkxLDggQEAKICNlbmRpZgogfQogCi11bnNpZ25lZCBsb25nIGptcjM5MjdfZG9fZ2V0dGltZW9mZnNldCh2b2lkKTsKLQogdm9pZCBfX2luaXQgcGxhdF90aW1lcl9zZXR1cChzdHJ1Y3QgaXJxYWN0aW9uICppcnEpCiB7Ci0JZG9fZ2V0dGltZW9mZnNldCA9IGptcjM5MjdfZG9fZ2V0dGltZW9mZnNldDsKLQogCWptcjM5MjdfdG1ycHRyLT5jcHJhID0gSk1SMzkyN19USU1FUl9DTEsgLyBIWjsKIAlqbXIzOTI3X3RtcnB0ci0+aXRtciA9IFRYeDkyN19UTVRJVE1SX1RJSUUgfCBUWHg5MjdfVE1USVRNUl9UWkNFOwogCWptcjM5MjdfdG1ycHRyLT5jY2RyID0gSk1SMzkyN19USU1FUl9DQ0Q7CkBAIC0yMDAsMzQgKzIwNCw2IEBACiAKICNkZWZpbmUgVVNFQ1NfUEVSX0pJRkZZICgxMDAwMDAwL0haKQogCi11bnNpZ25lZCBsb25nIGptcjM5MjdfZG9fZ2V0dGltZW9mZnNldCh2b2lkKQotewotICAgICAgIHVuc2lnbmVkIGxvbmcgY291bnQ7Ci0gICAgICAgdW5zaWduZWQgbG9uZyByZXMgPSAwOwotCi0gICAgICAgLyogTVVTVCByZWFkIFRSUiBiZWZvcmUgVElTUi4gKi8KLSAgICAgICBjb3VudCA9IGptcjM5MjdfdG1ycHRyLT50cnI7Ci0KLSAgICAgICBpZiAoam1yMzkyN190bXJwdHItPnRpc3IgJiBUWHg5MjdfVE1USVNSX1RJSVMpIHsKLSAgICAgICAgICAgICAgIC8qIHRpbWVyIGludGVycnVwdCBpcyBwZW5kaW5nLiAgdXNlIE1heCB2YWx1ZS4gKi8KLSAgICAgICAgICAgICAgIHJlcyA9IFVTRUNTX1BFUl9KSUZGWSAtIDE7Ci0gICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgIC8qIGNvbnZlcnQgdG8gdXNlYyAqLwotICAgICAgICAgICAgICAgLyogcmVzID0gY291bnQgLyAoSk1SMzkyN19USU1FUl9DTEsgLyAxMDAwMDAwKTsgKi8KLSAgICAgICAgICAgICAgIHJlcyA9IChjb3VudCA8PCA3KSAvICgoSk1SMzkyN19USU1FUl9DTEsgPDwgNykgLyAxMDAwMDAwKTsKLQotICAgICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAgICAqIER1ZSB0byBwb3NzaWJsZSBqaWZmaWVzIGluY29uc2lzdGVuY2llcywgd2UgbmVlZCB0byBjaGVjawotICAgICAgICAgICAgICAgICogdGhlIHJlc3VsdCBzbyB0aGF0IHdlJ2xsIGdldCBhIHRpbWVyIHRoYXQgaXMgbW9ub3RvbmljLgotICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICBpZiAocmVzID49IFVTRUNTX1BFUl9KSUZGWSkKLSAgICAgICAgICAgICAgICAgICAgICAgcmVzID0gVVNFQ1NfUEVSX0pJRkZZLTE7Ci0gICAgICAgfQotCi0gICAgICAgcmV0dXJuIHJlczsKLX0KLQotCiAvLyN1bmRlZiBET19XUklURV9USFJPVUdICiAjZGVmaW5lIERPX1dSSVRFX1RIUk9VR0gKICNkZWZpbmUgRE9fRU5BQkxFX0NBQ0hFCmRpZmYgLS1naXQgYS9hcmNoL21pcHMva2VybmVsL2FzbS1vZmZzZXRzLmMgYi9hcmNoL21pcHMva2VybmVsL2FzbS1vZmZzZXRzLmMKaW5kZXggZTljZTViMy4uZmY4OGIwNiAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2tlcm5lbC9hc20tb2Zmc2V0cy5jCisrKyBiL2FyY2gvbWlwcy9rZXJuZWwvYXNtLW9mZnNldHMuYwpAQCAtMjIsNyArMjIsNyBAQAogI2RlZmluZSBvZmZzZXQoc3RyaW5nLCBwdHIsIG1lbWJlcikgXAogCV9fYXNtX18oIlxuQEBAIiBzdHJpbmcgIiUwIiA6IDogImkiIChfb2Zmc2V0KHB0ciwgbWVtYmVyKSkpCiAjZGVmaW5lIGNvbnN0YW50KHN0cmluZywgbWVtYmVyKSBcCi0JX19hc21fXygiXG5AQEAiIHN0cmluZyAiJXgwIiA6IDogInJpIiAobWVtYmVyKSkKKwlfX2FzbV9fKCJcbkBAQCIgc3RyaW5nICIlWDAiIDogOiAicmkiIChtZW1iZXIpKQogI2RlZmluZSBzaXplKHN0cmluZywgc2l6ZSkgXAogCV9fYXNtX18oIlxuQEBAIiBzdHJpbmcgIiUwIiA6IDogImkiIChzaXplb2Yoc2l6ZSkpKQogI2RlZmluZSBsaW5lZmVlZCB0ZXh0KCIiKQpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2tlcm5lbC9lbnRyeS5TIGIvYXJjaC9taXBzL2tlcm5lbC9lbnRyeS5TCmluZGV4IDQxN2MwOGEuLmYxMGI2YTEgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9rZXJuZWwvZW50cnkuUworKysgYi9hcmNoL21pcHMva2VybmVsL2VudHJ5LlMKQEAgLTgzLDcgKzgzLDEwIEBACiBGRVhQT1JUKHJlc3RvcmVfYWxsKQkJCSMgcmVzdG9yZSBmdWxsIGZyYW1lCiAjaWZkZWYgQ09ORklHX01JUFNfTVRfU01UQwogLyogRGV0ZWN0IGFuZCBleGVjdXRlIGRlZmVycmVkIElQSSAiaW50ZXJydXB0cyIgKi8KKwlMT05HX0wJczAsIFRJX1JFR1MoJDI4KQorCUxPTkdfUwlzcCwgVElfUkVHUygkMjgpCiAJamFsCWRlZmVycmVkX3NtdGNfaXBpCisJTE9OR19TCXMwLCBUSV9SRUdTKCQyOCkKIC8qIFJlLWFybSBhbnkgdGVtcG9yYXJpbHkgbWFza2VkIGludGVycnVwdHMgbm90IGV4cGxpY2l0bHkgImFja2VkIiAqLwogCW1mYzAJdjAsIENQMF9UQ1NUQVRVUwogCW9yaQl2MSwgdjAsIFRDU1RBVFVTX0lYTVQKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9rZXJuZWwvaGVhZC5TIGIvYXJjaC9taXBzL2tlcm5lbC9oZWFkLlMKaW5kZXggOGM2ZGIwZi4uZGRjMWI3MSAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2tlcm5lbC9oZWFkLlMKKysrIGIvYXJjaC9taXBzL2tlcm5lbC9oZWFkLlMKQEAgLTE4OSw3ICsxODksOCBAQAogCiAJTVRDMAkJemVybywgQ1AwX0NPTlRFWFQJIyBjbGVhciBjb250ZXh0IHJlZ2lzdGVyCiAJUFRSX0xBCQkkMjgsIGluaXRfdGhyZWFkX3VuaW9uCi0JUFRSX0FERElVCXNwLCAkMjgsIF9USFJFQURfU0laRSAtIDMyCisJUFRSX0xJCQlzcCwgX1RIUkVBRF9TSVpFIC0gMzIKKwlQVFJfQUREVQlzcCwgJDI4CiAJc2V0X3NhdmVkX3NwCXNwLCB0MCwgdDEKIAlQVFJfU1VCVQlzcCwgNCAqIFNaUkVHCQkjIGluaXQgc3RhY2sgcG9pbnRlcgogCmRpZmYgLS1naXQgYS9hcmNoL21pcHMva2VybmVsL2lycS5jIGIvYXJjaC9taXBzL2tlcm5lbC9pcnEuYwppbmRleCBkZDI0NDM0Li45YjBlNDlkIDEwMDY0NAotLS0gYS9hcmNoL21pcHMva2VybmVsL2lycS5jCisrKyBiL2FyY2gvbWlwcy9rZXJuZWwvaXJxLmMKQEAgLTI2LDYgKzI2LDQ4IEBACiAjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CiAKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGlycV9tYXBbTlJfSVJRUyAvIEJJVFNfUEVSX0xPTkddOworCitpbnQgX19kZXZpbml0IGFsbG9jYXRlX2lycW5vKHZvaWQpCit7CisJaW50IGlycTsKKworYWdhaW46CisJaXJxID0gZmluZF9maXJzdF96ZXJvX2JpdChpcnFfbWFwLCBOUl9JUlFTKTsKKworCWlmIChpcnEgPj0gTlJfSVJRUykKKwkJcmV0dXJuIC1FTk9TUEM7CisKKwlpZiAodGVzdF9hbmRfc2V0X2JpdChpcnEsIGlycV9tYXApKQorCQlnb3RvIGFnYWluOworCisJcmV0dXJuIGlycTsKK30KKworRVhQT1JUX1NZTUJPTF9HUEwoYWxsb2NhdGVfaXJxbm8pOworCisvKgorICogQWxsb2NhdGUgdGhlIDE2IGxlZ2FjeSBpbnRlcnJ1cHRzIGZvciBpODI1OSBkZXZpY2VzLiAgVGhpcyBoYXBwZW5zIGVhcmx5CisgKiBpbiB0aGUga2VybmVsIGluaXRpYWxpemF0aW9uIHNvIHRyZWF0aW5nIGFsbG9jYXRpb24gZmFpbHVyZSBhcyBCVUcoKSBpcworICogb2suCisgKi8KK3ZvaWQgX19pbml0IGFsbG9jX2xlZ2FjeV9pcnFubyh2b2lkKQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8PSAxNjsgaSsrKQorCQlCVUdfT04odGVzdF9hbmRfc2V0X2JpdChpLCBpcnFfbWFwKSk7Cit9CisKK3ZvaWQgX19kZXZpbml0IGZyZWVfaXJxbm8odW5zaWduZWQgaW50IGlycSkKK3sKKwlzbXBfbWJfX2JlZm9yZV9jbGVhcl9iaXQoKTsKKwljbGVhcl9iaXQoaXJxLCBpcnFfbWFwKTsKKwlzbXBfbWJfX2FmdGVyX2NsZWFyX2JpdCgpOworfQorCitFWFBPUlRfU1lNQk9MX0dQTChmcmVlX2lycW5vKTsKKwogLyoKICAqICd3aGF0IHNob3VsZCB3ZSBkbyBpZiB3ZSBnZXQgYSBodyBpcnEgZXZlbnQgb24gYW4gaWxsZWdhbCB2ZWN0b3InLgogICogZWFjaCBhcmNoaXRlY3R1cmUgaGFzIHRvIGFuc3dlciB0aGlzIHRoZW1zZWx2ZXMuCmRpZmYgLS1naXQgYS9hcmNoL21pcHMva2VybmVsL2xpbnV4MzIuYyBiL2FyY2gvbWlwcy9rZXJuZWwvbGludXgzMi5jCmluZGV4IDUzZjQxNzEuLjdhM2ViYmUgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9rZXJuZWwvbGludXgzMi5jCisrKyBiL2FyY2gvbWlwcy9rZXJuZWwvbGludXgzMi5jCkBAIC0xMDU1LDcgKzEwNTUsOSBAQAogYXNtbGlua2FnZSBpbnQgc3lzMzJfcGVyc29uYWxpdHkodW5zaWduZWQgbG9uZyBwZXJzb25hbGl0eSkKIHsKIAlpbnQgcmV0OwotCWlmIChjdXJyZW50LT5wZXJzb25hbGl0eSA9PSBQRVJfTElOVVgzMiAmJiBwZXJzb25hbGl0eSA9PSBQRVJfTElOVVgpCisJcGVyc29uYWxpdHkgJj0gMHhmZmZmZmZmZjsKKwlpZiAocGVyc29uYWxpdHkoY3VycmVudC0+cGVyc29uYWxpdHkpID09IFBFUl9MSU5VWDMyICYmCisJICAgIHBlcnNvbmFsaXR5ID09IFBFUl9MSU5VWCkKIAkJcGVyc29uYWxpdHkgPSBQRVJfTElOVVgzMjsKIAlyZXQgPSBzeXNfcGVyc29uYWxpdHkocGVyc29uYWxpdHkpOwogCWlmIChyZXQgPT0gUEVSX0xJTlVYMzIpCmRpZmYgLS1naXQgYS9hcmNoL21pcHMva2VybmVsL3Byb2Nlc3MuYyBiL2FyY2gvbWlwcy9rZXJuZWwvcHJvY2Vzcy5jCmluZGV4IDlmMzA3ZWIuLmVjODIwOWYgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9rZXJuZWwvcHJvY2Vzcy5jCisrKyBiL2FyY2gvbWlwcy9rZXJuZWwvcHJvY2Vzcy5jCkBAIC0zNTgsMTAgKzM1OCw4IEBACiAJdW5zaWduZWQgbG9uZyBzaXplID0gMDsKICNpZmRlZiBDT05GSUdfS0FMTFNZTVMKIAl1bnNpZ25lZCBsb25nIG9mczsKLQljaGFyICptb2RuYW1lOwotCWNoYXIgbmFtZWJ1ZltLU1lNX05BTUVfTEVOICsgMV07CiAKLQlrYWxsc3ltc19sb29rdXAoKHVuc2lnbmVkIGxvbmcpc2NoZWR1bGUsICZzaXplLCAmb2ZzLCAmbW9kbmFtZSwgbmFtZWJ1Zik7CisJa2FsbHN5bXNfbG9va3VwX3NpemVfb2Zmc2V0KCh1bnNpZ25lZCBsb25nKXNjaGVkdWxlLCAmc2l6ZSwgJm9mcyk7CiAjZW5kaWYKIAlzY2hlZHVsZV9tZmkuZnVuYyA9IHNjaGVkdWxlOwogCXNjaGVkdWxlX21maS5mdW5jX3NpemUgPSBzaXplOwpAQCAtNDAzLDggKzQwMSw2IEBACiB7CiAJdW5zaWduZWQgbG9uZyBzdGFja19wYWdlOwogCXN0cnVjdCBtaXBzX2ZyYW1lX2luZm8gaW5mbzsKLQljaGFyICptb2RuYW1lOwotCWNoYXIgbmFtZWJ1ZltLU1lNX05BTUVfTEVOICsgMV07CiAJdW5zaWduZWQgbG9uZyBzaXplLCBvZnM7CiAJaW50IGxlYWY7CiAJZXh0ZXJuIHZvaWQgcmV0X2Zyb21faXJxKHZvaWQpOwpAQCAtNDMzLDcgKzQyOSw3IEBACiAJCX0KIAkJcmV0dXJuIDA7CiAJfQotCWlmICgha2FsbHN5bXNfbG9va3VwKHBjLCAmc2l6ZSwgJm9mcywgJm1vZG5hbWUsIG5hbWVidWYpKQorCWlmICgha2FsbHN5bXNfbG9va3VwX3NpemVfb2Zmc2V0KHBjLCAmc2l6ZSwgJm9mcykpCiAJCXJldHVybiAwOwogCS8qCiAJICogUmV0dXJuIHJhIGlmIGFuIGV4Y2VwdGlvbiBvY2N1cmVkIGF0IHRoZSBmaXJzdCBpbnN0cnVjdGlvbgpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2tlcm5lbC9yNGtfc3dpdGNoLlMgYi9hcmNoL21pcHMva2VybmVsL3I0a19zd2l0Y2guUwppbmRleCBkNWM4YjgyLi5jYzU2NmNmIDEwMDY0NAotLS0gYS9hcmNoL21pcHMva2VybmVsL3I0a19zd2l0Y2guUworKysgYi9hcmNoL21pcHMva2VybmVsL3I0a19zd2l0Y2guUwpAQCAtODUsNyArODUsMTIgQEAKIAltb3ZlCSQyOCwgYTIKIAljcHVfcmVzdG9yZV9ub25zY3JhdGNoIGExCiAKKyNpZiAoX1RIUkVBRF9TSVpFIC0gMzIpIDwgMHgxMDAwMAogCVBUUl9BRERJVQl0MCwgJDI4LCBfVEhSRUFEX1NJWkUgLSAzMgorI2Vsc2UKKwlQVFJfTEkJCXQwLCBfVEhSRUFEX1NJWkUgLSAzMgorCVBUUl9BRERVCXQwLCAkMjgKKyNlbmRpZgogCXNldF9zYXZlZF9zcAl0MCwgdDEsIHQyCiAjaWZkZWYgQ09ORklHX01JUFNfTVRfU01UQwogCS8qIFJlYWQtbW9kaWZ5LXdyaXRlcyBvZiBTdGF0dXMgbXVzdCBiZSBhdG9taWMgb24gYSBWUEUgKi8KZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9rZXJuZWwvc2NhbGwzMi1vMzIuUyBiL2FyY2gvbWlwcy9rZXJuZWwvc2NhbGwzMi1vMzIuUwppbmRleCA2MTM2MmU2Li5hOTVmMzdkIDEwMDY0NAotLS0gYS9hcmNoL21pcHMva2VybmVsL3NjYWxsMzItbzMyLlMKKysrIGIvYXJjaC9taXBzL2tlcm5lbC9zY2FsbDMyLW8zMi5TCkBAIC02NTIsNyArNjUyLDEwIEBACiAJc3lzCXN5c192bXNwbGljZQkJNAogCXN5cwlzeXNfbW92ZV9wYWdlcwkJNgogCXN5cwlzeXNfc2V0X3JvYnVzdF9saXN0CTIKLQlzeXMJc3lzX2dldF9yb2J1c3RfbGlzdAkzCisJc3lzCXN5c19nZXRfcm9idXN0X2xpc3QJMwkvKiA0MzEwICovCisJc3lzCXN5c19uaV9zeXNjYWxsCQkwCisJc3lzCXN5c19nZXRjcHUJCTMKKwlzeXMJc3lzX2Vwb2xsX3B3YWl0CQk2CiAJLmVuZG0KIAogCS8qIFdlIHByZS1jb21wdXRlIHRoZSBudW1iZXIgb2YgX2luc3RydWN0aW9uXyBieXRlcyBuZWVkZWQgdG8KZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9rZXJuZWwvc2NhbGw2NC02NC5TIGIvYXJjaC9taXBzL2tlcm5lbC9zY2FsbDY0LTY0LlMKaW5kZXggNmM3YjVlZC4uOGZiMGY2MCAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2tlcm5lbC9zY2FsbDY0LTY0LlMKKysrIGIvYXJjaC9taXBzL2tlcm5lbC9zY2FsbDY0LTY0LlMKQEAgLTQ2OCwzICs0NjgsNiBAQAogCVBUUglzeXNfbW92ZV9wYWdlcwogCVBUUglzeXNfc2V0X3JvYnVzdF9saXN0CiAJUFRSCXN5c19nZXRfcm9idXN0X2xpc3QKKwlQVFIJc3lzX25pX3N5c2NhbGwJCQkvKiA1MjcwICovCisJUFRSCXN5c19nZXRjcHUKKwlQVFIJc3lzX2Vwb2xsX3B3YWl0CmRpZmYgLS1naXQgYS9hcmNoL21pcHMva2VybmVsL3NjYWxsNjQtbjMyLlMgYi9hcmNoL21pcHMva2VybmVsL3NjYWxsNjQtbjMyLlMKaW5kZXggNmQ5ZjE4Ny4uMGRhNWNhMiAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2tlcm5lbC9zY2FsbDY0LW4zMi5TCisrKyBiL2FyY2gvbWlwcy9rZXJuZWwvc2NhbGw2NC1uMzIuUwpAQCAtMjgwLDcgKzI4MCw3IEBACiAJUFRSCXN5c19zeW5jCiAJUFRSCXN5c19hY2N0CiAJUFRSCXN5czMyX3NldHRpbWVvZmRheQotCVBUUglzeXNfbW91bnQJCQkvKiA2MTYwICovCisJUFRSCWNvbXBhdF9zeXNfbW91bnQJCS8qIDYxNjAgKi8KIAlQVFIJc3lzX3Vtb3VudAogCVBUUglzeXNfc3dhcG9uCiAJUFRSCXN5c19zd2Fwb2ZmCkBAIC0zOTQsMyArMzk0LDYgQEAKIAlQVFIJc3lzX21vdmVfcGFnZXMKIAlQVFIJY29tcGF0X3N5c19zZXRfcm9idXN0X2xpc3QKIAlQVFIJY29tcGF0X3N5c19nZXRfcm9idXN0X2xpc3QKKwlQVFIJc3lzX25pX3N5c2NhbGwKKwlQVFIJc3lzX2dldGNwdQorCVBUUglzeXNfZXBvbGxfcHdhaXQKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9rZXJuZWwvc2NhbGw2NC1vMzIuUyBiL2FyY2gvbWlwcy9rZXJuZWwvc2NhbGw2NC1vMzIuUwppbmRleCAyZTZkMDY3Li5iOWQwMGNhIDEwMDY0NAotLS0gYS9hcmNoL21pcHMva2VybmVsL3NjYWxsNjQtbzMyLlMKKysrIGIvYXJjaC9taXBzL2tlcm5lbC9zY2FsbDY0LW8zMi5TCkBAIC0yMjYsNyArMjI2LDcgQEAKIAlQVFIJc3lzX25pX3N5c2NhbGwJCQkvKiB3YXMgc3lzX3N0YXQgKi8KIAlQVFIJc3lzX2xzZWVrCiAJUFRSCXN5c19nZXRwaWQJCQkvKiA0MDIwICovCi0JUFRSCXN5c19tb3VudAorCVBUUgljb21wYXRfc3lzX21vdW50CiAJUFRSCXN5c19vbGR1bW91bnQKIAlQVFIJc3lzX3NldHVpZAogCVBUUglzeXNfZ2V0dWlkCkBAIC01MTYsNCArNTE2LDcgQEAKIAlQVFIJY29tcGF0X3N5c19tb3ZlX3BhZ2VzCiAJUFRSCWNvbXBhdF9zeXNfc2V0X3JvYnVzdF9saXN0CiAJUFRSCWNvbXBhdF9zeXNfZ2V0X3JvYnVzdF9saXN0CS8qIDQzMTAgKi8KKwlQVFIJc3lzX25pX3N5c2NhbGwKKwlQVFIJc3lzX2dldGNwdQorCVBUUglzeXNfZXBvbGxfcHdhaXQKIAkuc2l6ZQlzeXNfY2FsbF90YWJsZSwuLXN5c19jYWxsX3RhYmxlCmRpZmYgLS1naXQgYS9hcmNoL21pcHMva2VybmVsL3NldHVwLmMgYi9hcmNoL21pcHMva2VybmVsL3NldHVwLmMKaW5kZXggZmRiYjUwOC4uOGY2ZTg5NiAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2tlcm5lbC9zZXR1cC5jCisrKyBiL2FyY2gvbWlwcy9rZXJuZWwvc2V0dXAuYwpAQCAtMjIzLDcgKzIyMywxMSBAQAogCiAjZWxzZSAgLyogIUNPTkZJR19CTEtfREVWX0lOSVRSRCAqLwogCi0jZGVmaW5lIGluaXRfaW5pdHJkKCkJCTAKK3N0YXRpYyB1bnNpZ25lZCBsb25nIF9faW5pdCBpbml0X2luaXRyZCh2b2lkKQoreworCXJldHVybiAwOworfQorCiAjZGVmaW5lIGZpbmFsaXplX2luaXRyZCgpCWRvIHt9IHdoaWxlICgwKQogCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9rZXJuZWwvc21wLW10LmMgYi9hcmNoL21pcHMva2VybmVsL3NtcC1tdC5jCmluZGV4IDNiNWYzYjYuLjJhYzE5YTZjIDEwMDY0NAotLS0gYS9hcmNoL21pcHMva2VybmVsL3NtcC1tdC5jCisrKyBiL2FyY2gvbWlwcy9rZXJuZWwvc21wLW10LmMKQEAgLTE0MCwxNSArMTQwLDkwIEBACiAJLm5hbWUJCT0gIklQSV9jYWxsIgogfTsKIAorc3RhdGljIHZvaWQgX19pbml0IHNtcF9jb3B5X3ZwZV9jb25maWcodm9pZCkKK3sKKwl3cml0ZV92cGVfYzBfc3RhdHVzKAorCQkocmVhZF9jMF9zdGF0dXMoKSAmIH4oU1QwX0lNIHwgU1QwX0lFIHwgU1QwX0tTVSkpIHwgU1QwX0NVMCk7CisKKwkvKiBzZXQgY29uZmlnIHRvIGJlIHRoZSBzYW1lIGFzIHZwZTAsIHBhcnRpY3VsYXJseSBrc2VnMCBjb2hlcmVuY3kgYWxnICovCisJd3JpdGVfdnBlX2MwX2NvbmZpZyggcmVhZF9jMF9jb25maWcoKSk7CisKKwkvKiBtYWtlIHN1cmUgdGhlcmUgYXJlIG5vIHNvZnR3YXJlIGludGVycnVwdHMgcGVuZGluZyAqLworCXdyaXRlX3ZwZV9jMF9jYXVzZSgwKTsKKworCS8qIFByb3BhZ2F0ZSBDb25maWc3ICovCisJd3JpdGVfdnBlX2MwX2NvbmZpZzcocmVhZF9jMF9jb25maWc3KCkpOworCisJd3JpdGVfdnBlX2MwX2NvdW50KHJlYWRfYzBfY291bnQoKSk7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgX19pbml0IHNtcF92cGVfaW5pdCh1bnNpZ25lZCBpbnQgdGMsIHVuc2lnbmVkIGludCBtdnBjb25mMCwKKwl1bnNpZ25lZCBpbnQgbmNwdSkKK3sKKwlpZiAodGMgPiAoKG12cGNvbmYwICYgTVZQQ09ORjBfUFZQRSkgPj4gTVZQQ09ORjBfUFZQRV9TSElGVCkpCisJCXJldHVybiBuY3B1OworCisJLyogRGVhY3RpdmF0ZSBhbGwgYnV0IFZQRSAwICovCisJaWYgKHRjICE9IDApIHsKKwkJdW5zaWduZWQgbG9uZyB0bXAgPSByZWFkX3ZwZV9jMF92cGVjb25mMCgpOworCisJCXRtcCAmPSB+VlBFQ09ORjBfVlBBOworCisJCS8qIG1hc3RlciBWUEUgKi8KKwkJdG1wIHw9IFZQRUNPTkYwX01WUDsKKwkJd3JpdGVfdnBlX2MwX3ZwZWNvbmYwKHRtcCk7CisKKwkJLyogUmVjb3JkIHRoaXMgYXMgYXZhaWxhYmxlIENQVSAqLworCQljcHVfc2V0KHRjLCBwaHlzX2NwdV9wcmVzZW50X21hcCk7CisJCV9fY3B1X251bWJlcl9tYXBbdGNdCT0gKytuY3B1OworCQlfX2NwdV9sb2dpY2FsX21hcFtuY3B1XQk9IHRjOworCX0KKworCS8qIERpc2FibGUgbXVsdGktdGhyZWFkaW5nIHdpdGggVEMncyAqLworCXdyaXRlX3ZwZV9jMF92cGVjb250cm9sKHJlYWRfdnBlX2MwX3ZwZWNvbnRyb2woKSAmIH5WUEVDT05UUk9MX1RFKTsKKworCWlmICh0YyAhPSAwKQorCQlzbXBfY29weV92cGVfY29uZmlnKCk7CisKKwlyZXR1cm4gbmNwdTsKK30KKworc3RhdGljIHZvaWQgX19pbml0IHNtcF90Y19pbml0KHVuc2lnbmVkIGludCB0YywgdW5zaWduZWQgaW50IG12cGNvbmYwKQoreworCXVuc2lnbmVkIGxvbmcgdG1wOworCisJaWYgKCF0YykKKwkJcmV0dXJuOworCisJLyogYmluZCBhIFRDIHRvIGVhY2ggVlBFLCBNYXkgYXMgd2VsbCBwdXQgYWxsIGV4Y2VzcyBUQydzCisJICAgb24gdGhlIGxhc3QgVlBFICovCisJaWYgKHRjID49ICgoKG12cGNvbmYwICYgTVZQQ09ORjBfUFZQRSkgPj4gTVZQQ09ORjBfUFZQRV9TSElGVCkrMSkpCisJCXdyaXRlX3RjX2MwX3RjYmluZChyZWFkX3RjX2MwX3RjYmluZCgpIHwgKChtdnBjb25mMCAmIE1WUENPTkYwX1BWUEUpID4+IE1WUENPTkYwX1BWUEVfU0hJRlQpKTsKKwllbHNlIHsKKwkJd3JpdGVfdGNfYzBfdGNiaW5kKHJlYWRfdGNfYzBfdGNiaW5kKCkgfCB0Yyk7CisKKwkJLyogYW5kIHNldCBYVEMgKi8KKwkJd3JpdGVfdnBlX2MwX3ZwZWNvbmYwKHJlYWRfdnBlX2MwX3ZwZWNvbmYwKCkgfCAodGMgPDwgVlBFQ09ORjBfWFRDX1NISUZUKSk7CisJfQorCisJdG1wID0gcmVhZF90Y19jMF90Y3N0YXR1cygpOworCisJLyogbWFyayBub3QgYWxsb2NhdGVkIGFuZCBub3QgZHluYW1pY2FsbHkgYWxsb2NhdGFibGUgKi8KKwl0bXAgJj0gfihUQ1NUQVRVU19BIHwgVENTVEFUVVNfREEpOworCXRtcCB8PSBUQ1NUQVRVU19JWE1UOwkJLyogaW50ZXJydXB0IGV4ZW1wdCAqLworCXdyaXRlX3RjX2MwX3Rjc3RhdHVzKHRtcCk7CisKKwl3cml0ZV90Y19jMF90Y2hhbHQoVENIQUxUX0gpOworfQorCiAvKgogICogQ29tbW9uIHNldHVwIGJlZm9yZSBhbnkgc2Vjb25kYXJpZXMgYXJlIHN0YXJ0ZWQKICAqIE1ha2Ugc3VyZSBhbGwgQ1BVJ3MgYXJlIGluIGEgc2Vuc2libGUgc3RhdGUgYmVmb3JlIHdlIGJvb3QgYW55IG9mIHRoZQogICogc2Vjb25kYXJ5cwogICovCi12b2lkIHBsYXRfc21wX3NldHVwKHZvaWQpCit2b2lkIF9faW5pdCBwbGF0X3NtcF9zZXR1cCh2b2lkKQogewotCXVuc2lnbmVkIGxvbmcgdmFsOwotCWludCBpLCBudW07CisJdW5zaWduZWQgaW50IG12cGNvbmYwLCBudGMsIHRjLCBuY3B1ID0gMDsKIAogI2lmZGVmIENPTkZJR19NSVBTX01UX0ZQQUZGCiAJLyogSWYgd2UgaGF2ZSBhbiBGUFUsIGVucm9sbCBvdXJzZWx2ZXMgaW4gdGhlIEZQVS1mdWxsIG1hc2sgKi8KQEAgLTE2Nyw3NSArMjQyLDE2IEBACiAJLyogUHV0IE1WUEUncyBpbnRvICdjb25maWd1cmF0aW9uIHN0YXRlJyAqLwogCXNldF9jMF9tdnBjb250cm9sKE1WUENPTlRST0xfVlBDKTsKIAotCXZhbCA9IHJlYWRfYzBfbXZwY29uZjAoKTsKKwltdnBjb25mMCA9IHJlYWRfYzBfbXZwY29uZjAoKTsKKwludGMgPSAobXZwY29uZjAgJiBNVlBDT05GMF9QVEMpID4+IE1WUENPTkYwX1BUQ19TSElGVDsKIAogCS8qIHdlJ2xsIGFsd2F5cyBoYXZlIG1vcmUgVEMncyB0aGFuIFZQRSdzLCBzbyBsb29wIHNldHRpbmcgZXZlcnl0aGluZwogCSAgIHRvIGEgc2Vuc2libGUgc3RhdGUgKi8KLQlmb3IgKGkgPSAwLCBudW0gPSAwOyBpIDw9ICgodmFsICYgTVZQQ09ORjBfUFRDKSA+PiBNVlBDT05GMF9QVENfU0hJRlQpOyBpKyspIHsKLQkJc2V0dGMoaSk7CisJZm9yICh0YyA9IDA7IHRjIDw9IG50YzsgdGMrKykgeworCQlzZXR0Yyh0Yyk7CiAKLQkJLyogVlBFJ3MgKi8KLQkJaWYgKGkgPD0gKCh2YWwgJiBNVlBDT05GMF9QVlBFKSA+PiBNVlBDT05GMF9QVlBFX1NISUZUKSkgewotCi0JCQkvKiBkZWFjdGl2YXRlIGFsbCBidXQgdnBlMCAqLwotCQkJaWYgKGkgIT0gMCkgewotCQkJCXVuc2lnbmVkIGxvbmcgdG1wID0gcmVhZF92cGVfYzBfdnBlY29uZjAoKTsKLQotCQkJCXRtcCAmPSB+VlBFQ09ORjBfVlBBOwotCi0JCQkJLyogbWFzdGVyIFZQRSAqLwotCQkJCXRtcCB8PSBWUEVDT05GMF9NVlA7Ci0JCQkJd3JpdGVfdnBlX2MwX3ZwZWNvbmYwKHRtcCk7Ci0KLQkJCQkvKiBSZWNvcmQgdGhpcyBhcyBhdmFpbGFibGUgQ1BVICovCi0JCQkJY3B1X3NldChpLCBwaHlzX2NwdV9wcmVzZW50X21hcCk7Ci0JCQkJX19jcHVfbnVtYmVyX21hcFtpXQk9ICsrbnVtOwotCQkJCV9fY3B1X2xvZ2ljYWxfbWFwW251bV0JPSBpOwotCQkJfQotCi0JCQkvKiBkaXNhYmxlIG11bHRpLXRocmVhZGluZyB3aXRoIFRDJ3MgKi8KLQkJCXdyaXRlX3ZwZV9jMF92cGVjb250cm9sKHJlYWRfdnBlX2MwX3ZwZWNvbnRyb2woKSAmIH5WUEVDT05UUk9MX1RFKTsKLQotCQkJaWYgKGkgIT0gMCkgewotCQkJCXdyaXRlX3ZwZV9jMF9zdGF0dXMoKHJlYWRfYzBfc3RhdHVzKCkgJiB+KFNUMF9JTSB8IFNUMF9JRSB8IFNUMF9LU1UpKSB8IFNUMF9DVTApOwotCi0JCQkJLyogc2V0IGNvbmZpZyB0byBiZSB0aGUgc2FtZSBhcyB2cGUwLCBwYXJ0aWN1bGFybHkga3NlZzAgY29oZXJlbmN5IGFsZyAqLwotCQkJCXdyaXRlX3ZwZV9jMF9jb25maWcoIHJlYWRfYzBfY29uZmlnKCkpOwotCi0JCQkJLyogbWFrZSBzdXJlIHRoZXJlIGFyZSBubyBzb2Z0d2FyZSBpbnRlcnJ1cHRzIHBlbmRpbmcgKi8KLQkJCQl3cml0ZV92cGVfYzBfY2F1c2UoMCk7Ci0KLQkJCQkvKiBQcm9wYWdhdGUgQ29uZmlnNyAqLwotCQkJCXdyaXRlX3ZwZV9jMF9jb25maWc3KHJlYWRfYzBfY29uZmlnNygpKTsKLQkJCX0KLQotCQl9Ci0KLQkJLyogVEMncyAqLwotCi0JCWlmIChpICE9IDApIHsKLQkJCXVuc2lnbmVkIGxvbmcgdG1wOwotCi0JCQkvKiBiaW5kIGEgVEMgdG8gZWFjaCBWUEUsIE1heSBhcyB3ZWxsIHB1dCBhbGwgZXhjZXNzIFRDJ3MKLQkJCSAgIG9uIHRoZSBsYXN0IFZQRSAqLwotCQkJaWYgKCBpID49ICgoKHZhbCAmIE1WUENPTkYwX1BWUEUpID4+IE1WUENPTkYwX1BWUEVfU0hJRlQpKzEpICkKLQkJCQl3cml0ZV90Y19jMF90Y2JpbmQocmVhZF90Y19jMF90Y2JpbmQoKSB8ICgodmFsICYgTVZQQ09ORjBfUFZQRSkgPj4gTVZQQ09ORjBfUFZQRV9TSElGVCkgKTsKLQkJCWVsc2UgewotCQkJCXdyaXRlX3RjX2MwX3RjYmluZCggcmVhZF90Y19jMF90Y2JpbmQoKSB8IGkpOwotCi0JCQkJLyogYW5kIHNldCBYVEMgKi8KLQkJCQl3cml0ZV92cGVfYzBfdnBlY29uZjAoIHJlYWRfdnBlX2MwX3ZwZWNvbmYwKCkgfCAoaSA8PCBWUEVDT05GMF9YVENfU0hJRlQpKTsKLQkJCX0KLQotCQkJdG1wID0gcmVhZF90Y19jMF90Y3N0YXR1cygpOwotCi0JCQkvKiBtYXJrIG5vdCBhbGxvY2F0ZWQgYW5kIG5vdCBkeW5hbWljYWxseSBhbGxvY2F0YWJsZSAqLwotCQkJdG1wICY9IH4oVENTVEFUVVNfQSB8IFRDU1RBVFVTX0RBKTsKLQkJCXRtcCB8PSBUQ1NUQVRVU19JWE1UOwkJLyogaW50ZXJydXB0IGV4ZW1wdCAqLwotCQkJd3JpdGVfdGNfYzBfdGNzdGF0dXModG1wKTsKLQotCQkJd3JpdGVfdGNfYzBfdGNoYWx0KFRDSEFMVF9IKTsKLQkJfQorCQlzbXBfdGNfaW5pdCh0YywgbXZwY29uZjApOworCQluY3B1ID0gc21wX3ZwZV9pbml0KHRjLCBtdnBjb25mMCwgbmNwdSk7CiAJfQogCiAJLyogUmVsZWFzZSBjb25maWcgc3RhdGUgKi8KQEAgLTI0Myw3ICsyNTksNyBAQAogCiAJLyogV2UnbGwgd2FpdCB1bnRpbCBzdGFydGluZyB0aGUgc2Vjb25kYXJpZXMgYmVmb3JlIHN0YXJ0aW5nIE1WUEUgKi8KIAotCXByaW50ayhLRVJOX0lORk8gIkRldGVjdGVkICVpIGF2YWlsYWJsZSBzZWNvbmRhcnkgQ1BVKHMpXG4iLCBudW0pOworCXByaW50ayhLRVJOX0lORk8gIkRldGVjdGVkICVpIGF2YWlsYWJsZSBzZWNvbmRhcnkgQ1BVKHMpXG4iLCBuY3B1KTsKIH0KIAogdm9pZCBfX2luaXQgcGxhdF9wcmVwYXJlX2NwdXModW5zaWduZWQgaW50IG1heF9jcHVzKQpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2tlcm5lbC9zbXAuYyBiL2FyY2gvbWlwcy9rZXJuZWwvc21wLmMKaW5kZXggMWFmMzYxMi4uZGI4MDk1NyAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2tlcm5lbC9zbXAuYworKysgYi9hcmNoL21pcHMva2VybmVsL3NtcC5jCkBAIC0zMTAsNyArMzEwLDcgQEAKIAogdm9pZCBmbHVzaF90bGJfYWxsKHZvaWQpCiB7Ci0Jb25fZWFjaF9jcHUoZmx1c2hfdGxiX2FsbF9pcGksIDAsIDEsIDEpOworCW9uX2VhY2hfY3B1KGZsdXNoX3RsYl9hbGxfaXBpLCBOVUxMLCAxLCAxKTsKIH0KIAogc3RhdGljIHZvaWQgZmx1c2hfdGxiX21tX2lwaSh2b2lkICptbSkKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9rZXJuZWwvc210Yy1hc20uUyBiL2FyY2gvbWlwcy9rZXJuZWwvc210Yy1hc20uUwppbmRleCAxY2I5NDQxLi45MjEyMDdjIDEwMDY0NAotLS0gYS9hcmNoL21pcHMva2VybmVsL3NtdGMtYXNtLlMKKysrIGIvYXJjaC9taXBzL2tlcm5lbC9zbXRjLWFzbS5TCkBAIC0xMDEsNyArMTAxLDkgQEAKIAlsdwl0MCxQVF9QQURTTE9UNShzcCkKIAkvKiBBcmd1bWVudCBmcm9tIHNlbmRlciBwYXNzZWQgaW4gc3RhY2sgcGFkIHNsb3QgNCAqLwogCWx3CWEwLFBUX1BBRFNMT1Q0KHNwKQotCVBUUl9MQQlyYSwgX3JldF9mcm9tX2lycQorCUxPTkdfTAlzMCwgVElfUkVHUygkMjgpCisJTE9OR19TCXNwLCBUSV9SRUdTKCQyOCkKKwlQVFJfTEEJcmEsIHJldF9mcm9tX2lycQogCWpyCXQwCiAKIC8qCkBAIC0xMTksNyArMTIxLDEwIEBACiAJc3VidQl0MSxzcCxQVF9TSVpFCiAJc3cJcmEsUFRfRVBDKHQxKQogCXN3CWEwLFBUX1BBRFNMT1Q0KHQxKQorCUxPTkdfTAlzMCwgVElfUkVHUygkMjgpCisJTE9OR19TCXNwLCBUSV9SRUdTKCQyOCkKIAlsYQl0MixpcGlfZGVjb2RlCisJTE9OR19TCXMwLCBUSV9SRUdTKCQyOCkKIAlzdwl0MixQVF9QQURTTE9UNSh0MSkKIAkvKiBTYXZlIHByZS1kaXNhYmxlIHZhbHVlIG9mIFRDU3RhdHVzICovCiAJc3cJdDAsUFRfVENTVEFUVVModDEpCmRpZmYgLS1naXQgYS9hcmNoL21pcHMva2VybmVsL3NtdGMuYyBiL2FyY2gvbWlwcy9rZXJuZWwvc210Yy5jCmluZGV4IGNjMWY3NDcuLjNiNzhjYWYgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9rZXJuZWwvc210Yy5jCisrKyBiL2FyY2gvbWlwcy9rZXJuZWwvc210Yy5jCkBAIC00NzYsNiArNDc2LDcgQEAKIAkJCXdyaXRlX3ZwZV9jMF9jb21wYXJlKDApOwogCQkJLyogUHJvcGFnYXRlIENvbmZpZzcgKi8KIAkJCXdyaXRlX3ZwZV9jMF9jb25maWc3KHJlYWRfYzBfY29uZmlnNygpKTsKKwkJCXdyaXRlX3ZwZV9jMF9jb3VudChyZWFkX2MwX2NvdW50KCkpOwogCQl9CiAJCS8qIGVuYWJsZSBtdWx0aS10aHJlYWRpbmcgd2l0aGluIFZQRSAqLwogCQl3cml0ZV92cGVfYzBfdnBlY29udHJvbChyZWFkX3ZwZV9jMF92cGVjb250cm9sKCkgfCBWUEVDT05UUk9MX1RFKTsKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9rZXJuZWwvc3RhY2t0cmFjZS5jIGIvYXJjaC9taXBzL2tlcm5lbC9zdGFja3RyYWNlLmMKaW5kZXggNGFhYmU1Mi4uYTU4NmFiYSAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2tlcm5lbC9zdGFja3RyYWNlLmMKKysrIGIvYXJjaC9taXBzL2tlcm5lbC9zdGFja3RyYWNlLmMKQEAgLTU3LDcgKzU3LDcgQEAKIAkJcGMgPSB1bndpbmRfc3RhY2sodGFzaywgJnNwLCBwYywgJnJhKTsKIAl9IHdoaWxlIChwYyk7CiAjZWxzZQotCXNhdmVfcmF3X2NvbnRleHRfc3RhY2soc3ApOworCXNhdmVfcmF3X2NvbnRleHRfc3RhY2sodHJhY2UsIHNwKTsKICNlbmRpZgogfQogCmRpZmYgLS1naXQgYS9hcmNoL21pcHMva2VybmVsL3RpbWUuYyBiL2FyY2gvbWlwcy9rZXJuZWwvdGltZS5jCmluZGV4IGRlYmU4NmMuLmU1MzVmODYgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9rZXJuZWwvdGltZS5jCisrKyBiL2FyY2gvbWlwcy9rZXJuZWwvdGltZS5jCkBAIC0xMSw2ICsxMSw3IEBACiAgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247ICBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSAgTGljZW5zZSwgb3IgKGF0IHlvdXIKICAqIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAgKi8KKyNpbmNsdWRlIDxsaW51eC9jbG9ja3NvdXJjZS5oPgogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgpAQCAtNjcsMTUgKzY4LDkgQEAKIGludCAoKnJ0Y19taXBzX3NldF9tbXNzKSh1bnNpZ25lZCBsb25nKTsKIAogCi0vKiB1c2VjcyBwZXIgY291bnRlciBjeWNsZSwgc2hpZnRlZCB0byBsZWZ0IGJ5IDMyIGJpdHMgKi8KLXN0YXRpYyB1bnNpZ25lZCBpbnQgc2xsMzJfdXNlY3NfcGVyX2N5Y2xlOwotCiAvKiBob3cgbWFueSBjb3VudGVyIGN5Y2xlcyBpbiBhIGppZmZ5ICovCiBzdGF0aWMgdW5zaWduZWQgbG9uZyBjeWNsZXNfcGVyX2ppZmZ5IF9fcmVhZF9tb3N0bHk7CiAKLS8qIEN5Y2xlIGNvdW50ZXIgdmFsdWUgYXQgdGhlIHByZXZpb3VzIHRpbWVyIGludGVycnVwdC4uICovCi1zdGF0aWMgdW5zaWduZWQgaW50IHRpbWVyaGksIHRpbWVybG87Ci0KIC8qIGV4cGlyZWxvIGlzIHRoZSBjb3VudCB2YWx1ZSBmb3IgbmV4dCBDUFUgdGltZXIgaW50ZXJydXB0ICovCiBzdGF0aWMgdW5zaWduZWQgaW50IGV4cGlyZWxvOwogCkBAIC05Myw3ICs4OCw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyB2b2lkIG51bGxfaHB0X2luaXQodW5zaWduZWQgaW50IGNvdW50KQorc3RhdGljIHZvaWQgX19pbml0IG51bGxfaHB0X2luaXQodm9pZCkKIHsKIAkvKiBub3RoaW5nICovCiB9CkBAIC0xMjgsMTg2ICsxMjMsMTggQEAKIAlyZXR1cm4gcmVhZF9jMF9jb3VudCgpOwogfQogCi0vKiBGb3IgdXNlIHNvbGVseSBhcyBhIGhpZ2ggcHJlY2lzaW9uIHRpbWVyLiAgKi8KLXN0YXRpYyB2b2lkIGMwX2hwdF9pbml0KHVuc2lnbmVkIGludCBjb3VudCkKLXsKLQl3cml0ZV9jMF9jb3VudChyZWFkX2MwX2NvdW50KCkgLSBjb3VudCk7Ci19Ci0KIC8qIEZvciB1c2UgYm90aCBhcyBhIGhpZ2ggcHJlY2lzaW9uIHRpbWVyIGFuZCBhbiBpbnRlcnJ1cHQgc291cmNlLiAgKi8KLXN0YXRpYyB2b2lkIGMwX2hwdF90aW1lcl9pbml0KHVuc2lnbmVkIGludCBjb3VudCkKK3N0YXRpYyB2b2lkIF9faW5pdCBjMF9ocHRfdGltZXJfaW5pdCh2b2lkKQogewotCWNvdW50ID0gcmVhZF9jMF9jb3VudCgpIC0gY291bnQ7Ci0JZXhwaXJlbG8gPSAoY291bnQgLyBjeWNsZXNfcGVyX2ppZmZ5ICsgMSkgKiBjeWNsZXNfcGVyX2ppZmZ5OwotCXdyaXRlX2MwX2NvdW50KGV4cGlyZWxvIC0gY3ljbGVzX3Blcl9qaWZmeSk7CisJZXhwaXJlbG8gPSByZWFkX2MwX2NvdW50KCkgKyBjeWNsZXNfcGVyX2ppZmZ5OwogCXdyaXRlX2MwX2NvbXBhcmUoZXhwaXJlbG8pOwotCXdyaXRlX2MwX2NvdW50KGNvdW50KTsKIH0KIAogaW50ICgqbWlwc190aW1lcl9zdGF0ZSkodm9pZCk7CiB2b2lkICgqbWlwc190aW1lcl9hY2spKHZvaWQpOwogdW5zaWduZWQgaW50ICgqbWlwc19ocHRfcmVhZCkodm9pZCk7Ci12b2lkICgqbWlwc19ocHRfaW5pdCkodW5zaWduZWQgaW50KTsKLQotLyoKLSAqIEdldHRpbWVvZmZzZXQgcm91dGluZXMuICBUaGVzZSByb3V0aW5lcyByZXR1cm5zIHRoZSB0aW1lIGR1cmF0aW9uCi0gKiBzaW5jZSBsYXN0IHRpbWVyIGludGVycnVwdCBpbiB1c2Vjcy4KLSAqCi0gKiBJZiB0aGUgZXhhY3QgQ1BVIGNvdW50ZXIgZnJlcXVlbmN5IGlzIGtub3duLCB1c2UgZml4ZWRfcmF0ZV9nZXR0aW1lb2Zmc2V0LgotICogT3RoZXJ3aXNlIHVzZSBjYWxpYnJhdGVfZ2V0dGltZW9mZnNldCgpCi0gKgotICogSWYgdGhlIENQVSBkb2VzIG5vdCBoYXZlIHRoZSBjb3VudGVyIHJlZ2lzdGVyLCB5b3UgY2FuIGVpdGhlciBzdXBwbHkKLSAqIHlvdXIgb3duIGdldHRpbWVvZmZzZXQoKSByb3V0aW5lLCBvciB1c2UgbnVsbF9nZXR0aW1lb2Zmc2V0KCksIHdoaWNoCi0gKiBnaXZlcyB0aGUgc2FtZSByZXNvbHV0aW9uIGFzIEhaLgotICovCi0KLXN0YXRpYyB1bnNpZ25lZCBsb25nIG51bGxfZ2V0dGltZW9mZnNldCh2b2lkKQotewotCXJldHVybiAwOwotfQotCi0KLS8qIFRoZSBmdW5jdGlvbiBwb2ludGVyIHRvIG9uZSBvZiB0aGUgZ2V0dGltZW9mZnNldCBmdW5jcy4gICovCi11bnNpZ25lZCBsb25nICgqZG9fZ2V0dGltZW9mZnNldCkodm9pZCkgPSBudWxsX2dldHRpbWVvZmZzZXQ7Ci0KLQotc3RhdGljIHVuc2lnbmVkIGxvbmcgZml4ZWRfcmF0ZV9nZXR0aW1lb2Zmc2V0KHZvaWQpCi17Ci0JdTMyIGNvdW50OwotCXVuc2lnbmVkIGxvbmcgcmVzOwotCi0JLyogR2V0IGxhc3QgdGltZXIgdGljayBpbiBhYnNvbHV0ZSBrZXJuZWwgdGltZSAqLwotCWNvdW50ID0gbWlwc19ocHRfcmVhZCgpOwotCi0JLyogLi4gcmVsYXRpdmUgdG8gcHJldmlvdXMgamlmZnkgKDMyIGJpdHMgaXMgZW5vdWdoKSAqLwotCWNvdW50IC09IHRpbWVybG87Ci0KLQlfX2FzbV9fKCJtdWx0dQklMSwlMiIKLQkJOiAiPWgiIChyZXMpCi0JCTogInIiIChjb3VudCksICJyIiAoc2xsMzJfdXNlY3NfcGVyX2N5Y2xlKQotCQk6ICJsbyIsIEdDQ19SRUdfQUNDVU0pOwotCi0JLyoKLQkgKiBEdWUgdG8gcG9zc2libGUgamlmZmllcyBpbmNvbnNpc3RlbmNpZXMsIHdlIG5lZWQgdG8gY2hlY2sKLQkgKiB0aGUgcmVzdWx0IHNvIHRoYXQgd2UnbGwgZ2V0IGEgdGltZXIgdGhhdCBpcyBtb25vdG9uaWMuCi0JICovCi0JaWYgKHJlcyA+PSBVU0VDU19QRVJfSklGRlkpCi0JCXJlcyA9IFVTRUNTX1BFUl9KSUZGWSAtIDE7Ci0KLQlyZXR1cm4gcmVzOwotfQotCi0KLS8qCi0gKiBDYWNoZWQgIjEvKGNsb2NrcyBwZXIgdXNlYykgKiAyXjMyIiB2YWx1ZS4KLSAqIEl0IGhhcyB0byBiZSByZWNhbGN1bGF0ZWQgb25jZSBlYWNoIGppZmZ5LgotICovCi1zdGF0aWMgdW5zaWduZWQgbG9uZyBjYWNoZWRfcXVvdGllbnQ7Ci0KLS8qIExhc3QgamlmZnkgd2hlbiBjYWxpYnJhdGVfZGl2WFhfZ2V0dGltZW9mZnNldCgpIHdhcyBjYWxsZWQuICovCi1zdGF0aWMgdW5zaWduZWQgbG9uZyBsYXN0X2ppZmZpZXM7Ci0KLS8qCi0gKiBUaGlzIGlzIG1vdmVkIGZyb20gZGVjL3RpbWUuYzpkb19pb2FzaWNfZ2V0dGltZW9mZnNldCgpIGJ5IE1hY2llai4KLSAqLwotc3RhdGljIHVuc2lnbmVkIGxvbmcgY2FsaWJyYXRlX2RpdjMyX2dldHRpbWVvZmZzZXQodm9pZCkKLXsKLQl1MzIgY291bnQ7Ci0JdW5zaWduZWQgbG9uZyByZXMsIHRtcDsKLQl1bnNpZ25lZCBsb25nIHF1b3RpZW50OwotCi0JdG1wID0gamlmZmllczsKLQotCXF1b3RpZW50ID0gY2FjaGVkX3F1b3RpZW50OwotCi0JaWYgKGxhc3RfamlmZmllcyAhPSB0bXApIHsKLQkJbGFzdF9qaWZmaWVzID0gdG1wOwotCQlpZiAobGFzdF9qaWZmaWVzICE9IDApIHsKLQkJCXVuc2lnbmVkIGxvbmcgcjA7Ci0JCQlkb19kaXY2NF8zMihyMCwgdGltZXJoaSwgdGltZXJsbywgdG1wKTsKLQkJCWRvX2RpdjY0XzMyKHF1b3RpZW50LCBVU0VDU19QRVJfSklGRlksCi0JCQkJICAgIFVTRUNTX1BFUl9KSUZGWV9GUkFDLCByMCk7Ci0JCQljYWNoZWRfcXVvdGllbnQgPSBxdW90aWVudDsKLQkJfQotCX0KLQotCS8qIEdldCBsYXN0IHRpbWVyIHRpY2sgaW4gYWJzb2x1dGUga2VybmVsIHRpbWUgKi8KLQljb3VudCA9IG1pcHNfaHB0X3JlYWQoKTsKLQotCS8qIC4uIHJlbGF0aXZlIHRvIHByZXZpb3VzIGppZmZ5ICgzMiBiaXRzIGlzIGVub3VnaCkgKi8KLQljb3VudCAtPSB0aW1lcmxvOwotCi0JX19hc21fXygibXVsdHUgICUxLCUyIgotCQk6ICI9aCIgKHJlcykKLQkJOiAiciIgKGNvdW50KSwgInIiIChxdW90aWVudCkKLQkJOiAibG8iLCBHQ0NfUkVHX0FDQ1VNKTsKLQotCS8qCi0JICogRHVlIHRvIHBvc3NpYmxlIGppZmZpZXMgaW5jb25zaXN0ZW5jaWVzLCB3ZSBuZWVkIHRvIGNoZWNrCi0JICogdGhlIHJlc3VsdCBzbyB0aGF0IHdlJ2xsIGdldCBhIHRpbWVyIHRoYXQgaXMgbW9ub3RvbmljLgotCSAqLwotCWlmIChyZXMgPj0gVVNFQ1NfUEVSX0pJRkZZKQotCQlyZXMgPSBVU0VDU19QRVJfSklGRlkgLSAxOwotCi0JcmV0dXJuIHJlczsKLX0KLQotc3RhdGljIHVuc2lnbmVkIGxvbmcgY2FsaWJyYXRlX2RpdjY0X2dldHRpbWVvZmZzZXQodm9pZCkKLXsKLQl1MzIgY291bnQ7Ci0JdW5zaWduZWQgbG9uZyByZXMsIHRtcDsKLQl1bnNpZ25lZCBsb25nIHF1b3RpZW50OwotCi0JdG1wID0gamlmZmllczsKLQotCXF1b3RpZW50ID0gY2FjaGVkX3F1b3RpZW50OwotCi0JaWYgKGxhc3RfamlmZmllcyAhPSB0bXApIHsKLQkJbGFzdF9qaWZmaWVzID0gdG1wOwotCQlpZiAobGFzdF9qaWZmaWVzKSB7Ci0JCQl1bnNpZ25lZCBsb25nIHIwOwotCQkJX19hc21fXygiLnNldAlwdXNoXG5cdCIKLQkJCQkiLnNldAltaXBzM1xuXHQiCi0JCQkJImx3dQklMCwlM1xuXHQiCi0JCQkJImRzbGwzMgklMSwlMiwwXG5cdCIKLQkJCQkib3IJJTEsJTEsJTBcblx0IgotCQkJCSJkZGl2dQkkMCwlMSwlNFxuXHQiCi0JCQkJIm1mbG8JJTFcblx0IgotCQkJCSJkc2xsMzIJJTAsJTUsMFxuXHQiCi0JCQkJIm9yCSUwLCUwLCU2XG5cdCIKLQkJCQkiZGRpdnUJJDAsJTAsJTFcblx0IgotCQkJCSJtZmxvCSUwXG5cdCIKLQkJCQkiLnNldAlwb3AiCi0JCQkJOiAiPSZyIiAocXVvdGllbnQpLCAiPSZyIiAocjApCi0JCQkJOiAiciIgKHRpbWVyaGkpLCAibSIgKHRpbWVybG8pLAotCQkJCSAgInIiICh0bXApLCAiciIgKFVTRUNTX1BFUl9KSUZGWSksCi0JCQkJICAiciIgKFVTRUNTX1BFUl9KSUZGWV9GUkFDKQotCQkJCTogImhpIiwgImxvIiwgR0NDX1JFR19BQ0NVTSk7Ci0JCQljYWNoZWRfcXVvdGllbnQgPSBxdW90aWVudDsKLQkJfQotCX0KLQotCS8qIEdldCBsYXN0IHRpbWVyIHRpY2sgaW4gYWJzb2x1dGUga2VybmVsIHRpbWUgKi8KLQljb3VudCA9IG1pcHNfaHB0X3JlYWQoKTsKLQotCS8qIC4uIHJlbGF0aXZlIHRvIHByZXZpb3VzIGppZmZ5ICgzMiBiaXRzIGlzIGVub3VnaCkgKi8KLQljb3VudCAtPSB0aW1lcmxvOwotCi0JX19hc21fXygibXVsdHUJJTEsJTIiCi0JCTogIj1oIiAocmVzKQotCQk6ICJyIiAoY291bnQpLCAiciIgKHF1b3RpZW50KQotCQk6ICJsbyIsIEdDQ19SRUdfQUNDVU0pOwotCi0JLyoKLQkgKiBEdWUgdG8gcG9zc2libGUgamlmZmllcyBpbmNvbnNpc3RlbmNpZXMsIHdlIG5lZWQgdG8gY2hlY2sKLQkgKiB0aGUgcmVzdWx0IHNvIHRoYXQgd2UnbGwgZ2V0IGEgdGltZXIgdGhhdCBpcyBtb25vdG9uaWMuCi0JICovCi0JaWYgKHJlcyA+PSBVU0VDU19QRVJfSklGRlkpCi0JCXJlcyA9IFVTRUNTX1BFUl9KSUZGWSAtIDE7Ci0KLQlyZXR1cm4gcmVzOwotfQotCit2b2lkICgqbWlwc19ocHRfaW5pdCkodm9pZCkgX19pbml0ZGF0YSA9IG51bGxfaHB0X2luaXQ7Cit1bnNpZ25lZCBpbnQgbWlwc19ocHRfbWFzayA9IDB4ZmZmZmZmZmY7CiAKIC8qIGxhc3QgdGltZSB3aGVuIHh0aW1lIGFuZCBydGMgYXJlIHN5bmMnZWQgdXAgKi8KIHN0YXRpYyBsb25nIGxhc3RfcnRjX3VwZGF0ZTsKQEAgLTMzNCwxOCArMTYxLDEwIEBACiAgKi8KIGlycXJldHVybl90IHRpbWVyX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQpCiB7Ci0JdW5zaWduZWQgbG9uZyBqOwotCXVuc2lnbmVkIGludCBjb3VudDsKLQogCXdyaXRlX3NlcWxvY2soJnh0aW1lX2xvY2spOwogCi0JY291bnQgPSBtaXBzX2hwdF9yZWFkKCk7CiAJbWlwc190aW1lcl9hY2soKTsKIAotCS8qIFVwZGF0ZSB0aW1lcmhpL3RpbWVybG8gZm9yIGludHJhLWppZmZ5IGNhbGlicmF0aW9uLiAqLwotCXRpbWVyaGkgKz0gY291bnQgPCB0aW1lcmxvOwkJCS8qIFdyYXAgYXJvdW5kICovCi0JdGltZXJsbyA9IGNvdW50OwotCiAJLyoKIAkgKiBjYWxsIHRoZSBnZW5lcmljIHRpbWVyIGludGVycnVwdCBoYW5kbGluZwogCSAqLwpAQCAtMzY4LDQ3ICsxODcsNiBAQAogCQl9CiAJfQogCi0JLyoKLQkgKiBJZiBqaWZmaWVzIGhhcyBvdmVyZmxvd24gaW4gdGhpcyB0aW1lcl9pbnRlcnJ1cHQsIHdlIG11c3QKLQkgKiB1cGRhdGUgdGhlIHRpbWVyW2hpXS9bbG9dIHRvIG1ha2UgZmFzdCBnZXR0aW1lb2Zmc2V0IGZ1bmNzCi0JICogcXVvdGllbnQgY2FsYyBzdGlsbCB2YWxpZC4gLWFyY2EKLQkgKgotCSAqIFRoZSBmaXJzdCB0aW1lciBpbnRlcnJ1cHQgY29tZXMgbGF0ZSBhcyBpbnRlcnJ1cHRzIGFyZQotCSAqIGVuYWJsZWQgbG9uZyBhZnRlciB0aW1lcnMgYXJlIGluaXRpYWxpemVkLiAgVGhlcmVmb3JlIHRoZQotCSAqIGhpZ2ggcHJlY2lzaW9uIHRpbWVyIGlzIGZhc3QsIGxlYWRpbmcgdG8gd3JvbmcgZ2V0dGltZW9mZnNldCgpCi0JICogY2FsY3VsYXRpb25zLiAgV2UgZGVhbCB3aXRoIGl0IGJ5IHNldHRpbmcgaXQgYmFzZWQgb24gdGhlCi0JICogbnVtYmVyIG9mIGl0cyB0aWNrcyBiZXR3ZWVuIHRoZSBzZWNvbmQgYW5kIHRoZSB0aGlyZCBpbnRlcnJ1cHQuCi0JICogVGhhdCBpcyBzdGlsbCBzb21ld2hhdCBpbXByZWNpc2UsIGJ1dCBpdCdzIGEgZ29vZCBlc3RpbWF0ZS4KLQkgKiAtLW1hY3JvCi0JICovCi0JaiA9IGppZmZpZXM7Ci0JaWYgKGogPCA0KSB7Ci0JCXN0YXRpYyB1bnNpZ25lZCBpbnQgcHJldl9jb3VudDsKLQkJc3RhdGljIGludCBocHRfaW5pdGlhbGl6ZWQ7Ci0KLQkJc3dpdGNoIChqKSB7Ci0JCWNhc2UgMDoKLQkJCXRpbWVyaGkgPSB0aW1lcmxvID0gMDsKLQkJCW1pcHNfaHB0X2luaXQoY291bnQpOwotCQkJYnJlYWs7Ci0JCWNhc2UgMjoKLQkJCXByZXZfY291bnQgPSBjb3VudDsKLQkJCWJyZWFrOwotCQljYXNlIDM6Ci0JCQlpZiAoIWhwdF9pbml0aWFsaXplZCkgewotCQkJCXVuc2lnbmVkIGludCBjMyA9IDMgKiAoY291bnQgLSBwcmV2X2NvdW50KTsKLQotCQkJCXRpbWVyaGkgPSAwOwotCQkJCXRpbWVybG8gPSBjMzsKLQkJCQltaXBzX2hwdF9pbml0KGNvdW50IC0gYzMpOwotCQkJCWhwdF9pbml0aWFsaXplZCA9IDE7Ci0JCQl9Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCWJyZWFrOwotCQl9Ci0JfQotCiAJd3JpdGVfc2VxdW5sb2NrKCZ4dGltZV9sb2NrKTsKIAogCS8qCkBAIC00NzYsMTIgKzI1NCwxMSBAQAogICogMSkgYm9hcmRfdGltZV9pbml0KCkgLQogICogCWEpIChvcHRpb25hbCkgc2V0IHVwIFJUQyByb3V0aW5lcywKICAqICAgICAgYikgKG9wdGlvbmFsKSBjYWxpYnJhdGUgYW5kIHNldCB0aGUgbWlwc19ocHRfZnJlcXVlbmN5Ci0gKgkgICAgKG9ubHkgbmVlZGVkIGlmIHlvdSBpbnRlbmRlZCB0byB1c2UgZml4ZWRfcmF0ZV9nZXR0aW1lb2Zmc2V0Ci0gKgkgICAgIG9yIHVzZSBjcHUgY291bnRlciBhcyB0aW1lciBpbnRlcnJ1cHQgc291cmNlKQorICoJICAgIChvbmx5IG5lZWRlZCBpZiB5b3UgaW50ZW5kZWQgdG8gdXNlIGNwdSBjb3VudGVyIGFzIHRpbWVyIGludGVycnVwdAorICoJICAgICBzb3VyY2UpCiAgKiAyKSBzZXR1cCB4dGltZSBiYXNlZCBvbiBydGNfbWlwc19nZXRfdGltZSgpLgotICogMykgY2hvb3NlIGEgYXBwcm9wcmlhdGUgZ2V0dGltZW9mZnNldCByb3V0aW5lLgotICogNCkgY2FsY3VsYXRlIGEgY291cGxlIG9mIGNhY2hlZCB2YXJpYWJsZXMgZm9yIGxhdGVyIHVzYWdlCi0gKiA1KSBwbGF0X3RpbWVyX3NldHVwKCkgLQorICogMykgY2FsY3VsYXRlIGEgY291cGxlIG9mIGNhY2hlZCB2YXJpYWJsZXMgZm9yIGxhdGVyIHVzYWdlCisgKiA0KSBwbGF0X3RpbWVyX3NldHVwKCkgLQogICoJYSkgKG9wdGlvbmFsKSBvdmVyLXdyaXRlIGFueSBjaG9pY2VzIG1hZGUgYWJvdmUgYnkgdGltZV9pbml0KCkuCiAgKgliKSBtYWNoaW5lIHNwZWNpZmljIGNvZGUgc2hvdWxkIHNldHVwIHRoZSB0aW1lciBpcnFhY3Rpb24uCiAgKgljKSBlbmFibGUgdGhlIHRpbWVyIGludGVycnVwdApAQCAtNTMzLDEzICszMTAsNDggQEAKIAl9IHdoaWxlICgtLWkpOwogCWhwdF9lbmQgPSBtaXBzX2hwdF9yZWFkKCk7CiAKLQlocHRfY291bnQgPSBocHRfZW5kIC0gaHB0X3N0YXJ0OworCWhwdF9jb3VudCA9IChocHRfZW5kIC0gaHB0X3N0YXJ0KSAmIG1pcHNfaHB0X21hc2s7CiAJaHogPSBIWjsKIAlmcmVxdWVuY3kgPSAodTY0KWhwdF9jb3VudCAqICh1NjQpaHo7CiAKIAlyZXR1cm4gZnJlcXVlbmN5ID4+IGxvZ18yX2xvb3BzOwogfQogCitzdGF0aWMgY3ljbGVfdCByZWFkX21pcHNfaHB0KHZvaWQpCit7CisJcmV0dXJuIChjeWNsZV90KW1pcHNfaHB0X3JlYWQoKTsKK30KKworc3RhdGljIHN0cnVjdCBjbG9ja3NvdXJjZSBjbG9ja3NvdXJjZV9taXBzID0geworCS5uYW1lCQk9ICJNSVBTIiwKKwkucmVhZAkJPSByZWFkX21pcHNfaHB0LAorCS5pc19jb250aW51b3VzCT0gMSwKK307CisKK3N0YXRpYyB2b2lkIF9faW5pdCBpbml0X21pcHNfY2xvY2tzb3VyY2Uodm9pZCkKK3sKKwl1NjQgdGVtcDsKKwl1MzIgc2hpZnQ7CisKKwlpZiAoIW1pcHNfaHB0X2ZyZXF1ZW5jeSB8fCBtaXBzX2hwdF9yZWFkID09IG51bGxfaHB0X3JlYWQpCisJCXJldHVybjsKKworCS8qIENhbGNsYXRlIGEgc29tZXdoYXQgcmVhc29uYWJsZSByYXRpbmcgdmFsdWUgKi8KKwljbG9ja3NvdXJjZV9taXBzLnJhdGluZyA9IDIwMCArIG1pcHNfaHB0X2ZyZXF1ZW5jeSAvIDEwMDAwMDAwOworCS8qIEZpbmQgYSBzaGlmdCB2YWx1ZSAqLworCWZvciAoc2hpZnQgPSAzMjsgc2hpZnQgPiAwOyBzaGlmdC0tKSB7CisJCXRlbXAgPSAodTY0KSBOU0VDX1BFUl9TRUMgPDwgc2hpZnQ7CisJCWRvX2Rpdih0ZW1wLCBtaXBzX2hwdF9mcmVxdWVuY3kpOworCQlpZiAoKHRlbXAgPj4gMzIpID09IDApCisJCQlicmVhazsKKwl9CisJY2xvY2tzb3VyY2VfbWlwcy5zaGlmdCA9IHNoaWZ0OworCWNsb2Nrc291cmNlX21pcHMubXVsdCA9ICh1MzIpdGVtcDsKKwljbG9ja3NvdXJjZV9taXBzLm1hc2sgPSBtaXBzX2hwdF9tYXNrOworCisJY2xvY2tzb3VyY2VfcmVnaXN0ZXIoJmNsb2Nrc291cmNlX21pcHMpOworfQorCiB2b2lkIF9faW5pdCB0aW1lX2luaXQodm9pZCkKIHsKIAlpZiAoYm9hcmRfdGltZV9pbml0KQpAQCAtNTU1LDQxICszNjcsMjEgQEAKIAkgICAgICAgICAgICAgICAgICAgICAgICAteHRpbWUudHZfc2VjLCAteHRpbWUudHZfbnNlYyk7CiAKIAkvKiBDaG9vc2UgYXBwcm9wcmlhdGUgaGlnaCBwcmVjaXNpb24gdGltZXIgcm91dGluZXMuICAqLwotCWlmICghY3B1X2hhc19jb3VudGVyICYmICFtaXBzX2hwdF9yZWFkKSB7CisJaWYgKCFjcHVfaGFzX2NvdW50ZXIgJiYgIW1pcHNfaHB0X3JlYWQpCiAJCS8qIE5vIGhpZ2ggcHJlY2lzaW9uIHRpbWVyIC0tIHNvcnJ5LiAgKi8KIAkJbWlwc19ocHRfcmVhZCA9IG51bGxfaHB0X3JlYWQ7Ci0JCW1pcHNfaHB0X2luaXQgPSBudWxsX2hwdF9pbml0OwotCX0gZWxzZSBpZiAoIW1pcHNfaHB0X2ZyZXF1ZW5jeSAmJiAhbWlwc190aW1lcl9zdGF0ZSkgeworCWVsc2UgaWYgKCFtaXBzX2hwdF9mcmVxdWVuY3kgJiYgIW1pcHNfdGltZXJfc3RhdGUpIHsKIAkJLyogQSBoaWdoIHByZWNpc2lvbiB0aW1lciBvZiB1bmtub3duIGZyZXF1ZW5jeS4gICovCi0JCWlmICghbWlwc19ocHRfcmVhZCkgeworCQlpZiAoIW1pcHNfaHB0X3JlYWQpCiAJCQkvKiBObyBleHRlcm5hbCBoaWdoIHByZWNpc2lvbiB0aW1lciAtLSB1c2UgUjRrLiAgKi8KIAkJCW1pcHNfaHB0X3JlYWQgPSBjMF9ocHRfcmVhZDsKLQkJCW1pcHNfaHB0X2luaXQgPSBjMF9ocHRfaW5pdDsKLQkJfQotCi0JCWlmIChjcHVfaGFzX21pcHMzMnIxIHx8IGNwdV9oYXNfbWlwczMycjIgfHwKLQkJICAgIChjdXJyZW50X2NwdV9kYXRhLmlzYV9sZXZlbCA9PSBNSVBTX0NQVV9JU0FfSSkgfHwKLQkJICAgIChjdXJyZW50X2NwdV9kYXRhLmlzYV9sZXZlbCA9PSBNSVBTX0NQVV9JU0FfSUkpKQotCQkJLyoKLQkJCSAqIFdlIG5lZWQgdG8gY2FsaWJyYXRlIHRoZSBjb3VudGVyIGJ1dCB3ZSBkb24ndCBoYXZlCi0JCQkgKiA2NC1iaXQgZGl2aXNpb24uCi0JCQkgKi8KLQkJCWRvX2dldHRpbWVvZmZzZXQgPSBjYWxpYnJhdGVfZGl2MzJfZ2V0dGltZW9mZnNldDsKLQkJZWxzZQotCQkJLyoKLQkJCSAqIFdlIG5lZWQgdG8gY2FsaWJyYXRlIHRoZSBjb3VudGVyIGJ1dCB3ZSAqZG8qIGhhdmUKLQkJCSAqIDY0LWJpdCBkaXZpc2lvbi4KLQkJCSAqLwotCQkJZG9fZ2V0dGltZW9mZnNldCA9IGNhbGlicmF0ZV9kaXY2NF9nZXR0aW1lb2Zmc2V0OwogCX0gZWxzZSB7CiAJCS8qIFdlIGtub3cgY291bnRlciBmcmVxdWVuY3kuICBPciB3ZSBjYW4gZ2V0IGl0LiAgKi8KIAkJaWYgKCFtaXBzX2hwdF9yZWFkKSB7CiAJCQkvKiBObyBleHRlcm5hbCBoaWdoIHByZWNpc2lvbiB0aW1lciAtLSB1c2UgUjRrLiAgKi8KIAkJCW1pcHNfaHB0X3JlYWQgPSBjMF9ocHRfcmVhZDsKIAotCQkJaWYgKG1pcHNfdGltZXJfc3RhdGUpCi0JCQkJbWlwc19ocHRfaW5pdCA9IGMwX2hwdF9pbml0OwotCQkJZWxzZSB7CisJCQlpZiAoIW1pcHNfdGltZXJfc3RhdGUpIHsKIAkJCQkvKiBObyBleHRlcm5hbCB0aW1lciBpbnRlcnJ1cHQgLS0gdXNlIFI0ay4gICovCiAJCQkJbWlwc19ocHRfaW5pdCA9IGMwX2hwdF90aW1lcl9pbml0OwogCQkJCW1pcHNfdGltZXJfYWNrID0gYzBfdGltZXJfYWNrOwpAQCAtNTk4LDE2ICszOTAsOSBAQAogCQlpZiAoIW1pcHNfaHB0X2ZyZXF1ZW5jeSkKIAkJCW1pcHNfaHB0X2ZyZXF1ZW5jeSA9IGNhbGlicmF0ZV9ocHQoKTsKIAotCQlkb19nZXR0aW1lb2Zmc2V0ID0gZml4ZWRfcmF0ZV9nZXR0aW1lb2Zmc2V0OwotCiAJCS8qIENhbGN1bGF0ZSBjYWNoZSBwYXJhbWV0ZXJzLiAgKi8KIAkJY3ljbGVzX3Blcl9qaWZmeSA9IChtaXBzX2hwdF9mcmVxdWVuY3kgKyBIWiAvIDIpIC8gSFo7CiAKLQkJLyogc2xsMzJfdXNlY3NfcGVyX2N5Y2xlID0gMTBeNiAqIDJeMzIgLyBtaXBzX2NvdW50ZXJfZnJlcSAgKi8KLQkJZG9fZGl2NjRfMzIoc2xsMzJfdXNlY3NfcGVyX2N5Y2xlLAotCQkJICAgIDEwMDAwMDAsIG1pcHNfaHB0X2ZyZXF1ZW5jeSAvIDIsCi0JCQkgICAgbWlwc19ocHRfZnJlcXVlbmN5KTsKLQogCQkvKiBSZXBvcnQgdGhlIGhpZ2ggcHJlY2lzaW9uIHRpbWVyIHJhdGUgZm9yIGEgcmVmZXJlbmNlLiAgKi8KIAkJcHJpbnRrKCJVc2luZyAldS4lMDN1IE1IeiBoaWdoIHByZWNpc2lvbiB0aW1lci5cbiIsCiAJCSAgICAgICAoKG1pcHNfaHB0X2ZyZXF1ZW5jeSArIDUwMCkgLyAxMDAwKSAvIDEwMDAsCkBAIC02MTksNyArNDA0LDcgQEAKIAkJbWlwc190aW1lcl9hY2sgPSBudWxsX3RpbWVyX2FjazsKIAogCS8qIFRoaXMgc2V0cyB1cCB0aGUgaGlnaCBwcmVjaXNpb24gdGltZXIgZm9yIHRoZSBmaXJzdCBpbnRlcnJ1cHQuICAqLwotCW1pcHNfaHB0X2luaXQobWlwc19ocHRfcmVhZCgpKTsKKwltaXBzX2hwdF9pbml0KCk7CiAKIAkvKgogCSAqIENhbGwgYm9hcmQgc3BlY2lmaWMgdGltZXIgaW50ZXJydXB0IHNldHVwLgpAQCAtNjMzLDYgKzQxOCw4IEBACiAJICogaXMgbm90IGludm9rZWQgYWNjaWRlbnRhbGx5LgogCSAqLwogCXBsYXRfdGltZXJfc2V0dXAoJnRpbWVyX2lycWFjdGlvbik7CisKKwlpbml0X21pcHNfY2xvY2tzb3VyY2UoKTsKIH0KIAogI2RlZmluZSBGRUJSVUFSWQkJMgpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2tlcm5lbC90cmFwcy5jIGIvYXJjaC9taXBzL2tlcm5lbC90cmFwcy5jCmluZGV4IGNjZTgzMTMuLjlmZGExYjggMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9rZXJuZWwvdHJhcHMuYworKysgYi9hcmNoL21pcHMva2VybmVsL3RyYXBzLmMKQEAgLTExMTEsNyArMTExMSw3IEBACiBzdGF0aWMgdm9pZCBtaXBzX3Nyc19pbml0KHZvaWQpCiB7CiAJc2hhZG93X3JlZ2lzdGVycy5zcl9zdXBwb3J0ZWQgPSAoKHJlYWRfYzBfc3JzY3RsKCkgPj4gMjYpICYgMHgwZikgKyAxOwotCXByaW50ayhLRVJOX0lORk8gIiVkIE1JUFNSMiByZWdpc3RlciBzZXRzIGF2YWlsYWJsZVxuIiwKKwlwcmludGsoS0VSTl9JTkZPICIlbGQgTUlQU1IyIHJlZ2lzdGVyIHNldHMgYXZhaWxhYmxlXG4iLAogCSAgICAgICBzaGFkb3dfcmVnaXN0ZXJzLnNyX3N1cHBvcnRlZCk7CiAJc2hhZG93X3JlZ2lzdGVycy5zcl9hbGxvY2F0ZWQgPSAxOwkvKiBTZXQgMCB1c2VkIGJ5IGtlcm5lbCAqLwogfQpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2tlcm5lbC92bWxpbnV4Lmxkcy5TIGIvYXJjaC9taXBzL2tlcm5lbC92bWxpbnV4Lmxkcy5TCmluZGV4IDBiYjljZDguLjc5ZjAzMTcgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9rZXJuZWwvdm1saW51eC5sZHMuUworKysgYi9hcmNoL21pcHMva2VybmVsL3ZtbGludXgubGRzLlMKQEAgLTUwLDYgKzUwLDE2IEBACiAgIC8qIHdyaXRlYWJsZSAqLwogICAuZGF0YSA6IHsJCQkvKiBEYXRhICovCiAgICAgLiA9IC4gKyBEQVRBT0ZGU0VUOwkJLyogZm9yIENPTkZJR19NQVBQRURfS0VSTkVMICovCisgICAgLyoKKyAgICAgKiBUaGlzIEFMSUdOIGlzIG5lZWRlZCBhcyBhIHdvcmthcm91bmQgZm9yIGEgYnVnIGEgZ2NjIGJ1ZyB1cHRvIDQuMSB3aGljaAorICAgICAqIGxpbWl0cyB0aGUgbWF4aW11bSBhbGlnbm1lbnQgdG8gYXQgbW9zdCAzMmtCIGFuZCByZXN1bHRzIGluIHRoZSBmb2xsb3dpbmcKKyAgICAgKiB3YXJuaW5nOgorICAgICAqCisgICAgICogIENDICAgICAgYXJjaC9taXBzL2tlcm5lbC9pbml0X3Rhc2subworICAgICAqIGFyY2gvbWlwcy9rZXJuZWwvaW5pdF90YXNrLmM6MzA6IHdhcm5pbmc6IGFsaWdubWVudCBvZiDigJhpbml0X3RocmVhZF91bmlvbuKAmQorICAgICAqIGlzIGdyZWF0ZXIgdGhhbiBtYXhpbXVtIG9iamVjdCBmaWxlIGFsaWdubWVudC4gIFVzaW5nIDMyNzY4CisgICAgICovCisgICAgLiA9IEFMSUdOKF9QQUdFX1NJWkUpOwogICAgICooLmRhdGEuaW5pdF90YXNrKQogCiAgICAgKiguZGF0YSkKQEAgLTkxLDEzICsxMDEsNyBAQAogCiAgIF9faW5pdGNhbGxfc3RhcnQgPSAuOwogICAuaW5pdGNhbGwuaW5pdCA6IHsKLQkqKC5pbml0Y2FsbDEuaW5pdCkKLQkqKC5pbml0Y2FsbDIuaW5pdCkKLQkqKC5pbml0Y2FsbDMuaW5pdCkKLQkqKC5pbml0Y2FsbDQuaW5pdCkKLQkqKC5pbml0Y2FsbDUuaW5pdCkKLQkqKC5pbml0Y2FsbDYuaW5pdCkKLQkqKC5pbml0Y2FsbDcuaW5pdCkKKwlJTklUQ0FMTFMKICAgfQogICBfX2luaXRjYWxsX2VuZCA9IC47CiAKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9saWItNjQvZHVtcF90bGIuYyBiL2FyY2gvbWlwcy9saWItNjQvZHVtcF90bGIuYwppbmRleCBiZTgyNjFiLi41OTRkZjFhIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvbGliLTY0L2R1bXBfdGxiLmMKKysrIGIvYXJjaC9taXBzL2xpYi02NC9kdW1wX3RsYi5jCkBAIC0xNDksNyArMTQ5LDcgQEAKIAlwcmludGsoIkFkZHIgICAgICAgICAgICAgICAgID09ICUwOGx4XG4iLCBhZGRyKTsKIAlwcmludGsoInRhc2tzLT5tbS5wZ2QgICAgICAgID09ICUwOGx4XG4iLCAodW5zaWduZWQgbG9uZykgdC0+bW0tPnBnZCk7CiAKLQlwYWdlX2RpciA9IHBnZF9vZmZzZXQodC0+bW0sIDApOworCXBhZ2VfZGlyID0gcGdkX29mZnNldCh0LT5tbSwgMFVMKTsKIAlwcmludGsoInBhZ2VfZGlyID09ICUwMTZseFxuIiwgKHVuc2lnbmVkIGxvbmcpIHBhZ2VfZGlyKTsKIAogCXBnZCA9IHBnZF9vZmZzZXQodC0+bW0sIGFkZHIpOwpAQCAtMTg0LDEzICsxODQsMTMgQEAKIAlkdW1wX2xpc3RfcHJvY2VzcyhjdXJyZW50LCBhZGRyZXNzKTsKIH0KIAotdW5zaWduZWQgaW50IHZ0b3Aodm9pZCAqYWRkcmVzcykKK3Vuc2lnbmVkIGxvbmcgdnRvcCh2b2lkICphZGRyZXNzKQogewogCXBnZF90CSpwZ2Q7CiAJcHVkX3QJKnB1ZDsKIAlwbWRfdAkqcG1kOwogCXB0ZV90CSpwdGU7Ci0JdW5zaWduZWQgaW50IGFkZHIsIHBhZGRyOworCXVuc2lnbmVkIGxvbmcgYWRkciwgcGFkZHI7CiAKIAlhZGRyID0gKHVuc2lnbmVkIGxvbmcpIGFkZHJlc3M7CiAJcGdkID0gcGdkX29mZnNldChjdXJyZW50LT5tbSwgYWRkcik7CmRpZmYgLS1naXQgYS9hcmNoL21pcHMvbWlwcy1ib2FyZHMvZ2VuZXJpYy9tZW1vcnkuYyBiL2FyY2gvbWlwcy9taXBzLWJvYXJkcy9nZW5lcmljL21lbW9yeS5jCmluZGV4IGJlODBjNWQuLmVlZWQ5NDQgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9taXBzLWJvYXJkcy9nZW5lcmljL21lbW9yeS5jCisrKyBiL2FyY2gvbWlwcy9taXBzLWJvYXJkcy9nZW5lcmljL21lbW9yeS5jCkBAIC0xNzYsNyArMTc2LDcgQEAKIAkJaWYgKGJvb3RfbWVtX21hcC5tYXBbaV0udHlwZSAhPSBCT09UX01FTV9ST01fREFUQSkKIAkJCWNvbnRpbnVlOwogCi0JCWFkZHIgPSBib290X21lbV9tYXAubWFwW2ldLmFkZHI7CisJCWFkZHIgPSBQQUdFX0FMSUdOKGJvb3RfbWVtX21hcC5tYXBbaV0uYWRkcik7CiAJCXdoaWxlIChhZGRyIDwgYm9vdF9tZW1fbWFwLm1hcFtpXS5hZGRyCiAJCQkgICAgICArIGJvb3RfbWVtX21hcC5tYXBbaV0uc2l6ZSkgewogCQkJQ2xlYXJQYWdlUmVzZXJ2ZWQodmlydF90b19wYWdlKF9fdmEoYWRkcikpKTsKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9taXBzLWJvYXJkcy9nZW5lcmljL3BjaS5jIGIvYXJjaC9taXBzL21pcHMtYm9hcmRzL2dlbmVyaWMvcGNpLmMKaW5kZXggOTMzN2Y2Yy4uMzE5MmExNCAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL21pcHMtYm9hcmRzL2dlbmVyaWMvcGNpLmMKKysrIGIvYXJjaC9taXBzL21pcHMtYm9hcmRzL2dlbmVyaWMvcGNpLmMKQEAgLTkwLDcgKzkwLDcgQEAKIHZvaWQgX19pbml0IG1pcHNfcGNpYmlvc19pbml0KHZvaWQpCiB7CiAJc3RydWN0IHBjaV9jb250cm9sbGVyICpjb250cm9sbGVyOwotCXVuc2lnbmVkIGxvbmcgc3RhcnQsIGVuZCwgbWFwLCBzdGFydDEsIGVuZDEsIG1hcDEsIG1hcDIsIG1hcDMsIG1hc2s7CisJcmVzb3VyY2Vfc2l6ZV90IHN0YXJ0LCBlbmQsIG1hcCwgc3RhcnQxLCBlbmQxLCBtYXAxLCBtYXAyLCBtYXAzLCBtYXNrOwogCiAJc3dpdGNoIChtaXBzX3JldmlzaW9uX2NvcmlkKSB7CiAJY2FzZSBNSVBTX1JFVklTSU9OX0NPUklEX1FFRF9STTUyNjE6CmRpZmYgLS1naXQgYS9hcmNoL21pcHMvbWlwcy1ib2FyZHMvZ2VuZXJpYy90aW1lLmMgYi9hcmNoL21pcHMvbWlwcy1ib2FyZHMvZ2VuZXJpYy90aW1lLmMKaW5kZXggNmY4YTlmZS4uZDgxN2M2MCAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL21pcHMtYm9hcmRzL2dlbmVyaWMvdGltZS5jCisrKyBiL2FyY2gvbWlwcy9taXBzLWJvYXJkcy9nZW5lcmljL3RpbWUuYwpAQCAtMTg3LDcgKzE4Nyw3IEBACiB9CiAKIC8qCi0gKiBFc3RpbWF0ZSBDUFUgZnJlcXVlbmN5LiAgU2V0cyBtaXBzX2NvdW50ZXJfZnJlcXVlbmN5IGFzIGEgc2lkZS1lZmZlY3QKKyAqIEVzdGltYXRlIENQVSBmcmVxdWVuY3kuICBTZXRzIG1pcHNfaHB0X2ZyZXF1ZW5jeSBhcyBhIHNpZGUtZWZmZWN0CiAgKi8KIHN0YXRpYyB1bnNpZ25lZCBpbnQgX19pbml0IGVzdGltYXRlX2NwdV9mcmVxdWVuY3kodm9pZCkKIHsKQEAgLTIwOCw3ICsyMDgsOCBAQAogCQljb3VudCA9IDYwMDAwMDA7CiAjZW5kaWYKICNpZiBkZWZpbmVkKENPTkZJR19NSVBTX0FUTEFTKSB8fCBkZWZpbmVkKENPTkZJR19NSVBTX01BTFRBKQotCXVuc2lnbmVkIGludCBmbGFnczsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXVuc2lnbmVkIGludCBzdGFydDsKIAogCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKIApAQCAtMjE3LDEzICsyMTgsMTMgQEAKIAl3aGlsZSAoIShDTU9TX1JFQUQoUlRDX1JFR19BKSAmIFJUQ19VSVApKTsKIAogCS8qIFN0YXJ0IHI0ayBjb3VudGVyLiAqLwotCXdyaXRlX2MwX2NvdW50KDApOworCXN0YXJ0ID0gcmVhZF9jMF9jb3VudCgpOwogCiAJLyogUmVhZCBjb3VudGVyIGV4YWN0bHkgb24gZmFsbGluZyBlZGdlIG9mIHVwZGF0ZSBmbGFnICovCiAJd2hpbGUgKENNT1NfUkVBRChSVENfUkVHX0EpICYgUlRDX1VJUCk7CiAJd2hpbGUgKCEoQ01PU19SRUFEKFJUQ19SRUdfQSkgJiBSVENfVUlQKSk7CiAKLQljb3VudCA9IHJlYWRfYzBfY291bnQoKTsKKwljb3VudCA9IHJlYWRfYzBfY291bnQoKSAtIHN0YXJ0OwogCiAJLyogcmVzdG9yZSBpbnRlcnJ1cHRzICovCiAJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL21pcHMtYm9hcmRzL21hbHRhL21hbHRhX2ludC5jIGIvYXJjaC9taXBzL21pcHMtYm9hcmRzL21hbHRhL21hbHRhX2ludC5jCmluZGV4IDYyNDRkMGUuLjkwYWQ1YmYgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9taXBzLWJvYXJkcy9tYWx0YS9tYWx0YV9pbnQuYworKysgYi9hcmNoL21pcHMvbWlwcy1ib2FyZHMvbWFsdGEvbWFsdGFfaW50LmMKQEAgLTMyLDYgKzMyLDcgQEAKICNpbmNsdWRlIDxhc20vaTgyNTkuaD4KICNpbmNsdWRlIDxhc20vaXJxX2NwdS5oPgogI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9pcnFfcmVncy5oPgogI2luY2x1ZGUgPGFzbS9taXBzLWJvYXJkcy9tYWx0YS5oPgogI2luY2x1ZGUgPGFzbS9taXBzLWJvYXJkcy9tYWx0YWludC5oPgogI2luY2x1ZGUgPGFzbS9taXBzLWJvYXJkcy9waWl4NC5oPgpAQCAtMTMxLDcgKzEzMiw3IEBACiAJdW5zaWduZWQgaW50IGludGVkZ2UsIGludHN0ZWVyLCBwY2ljbWQsIHBjaWJhZGFkZHI7CiAgICAgICAgIHVuc2lnbmVkIGludCBwY2ltc3RhdCwgaW50aXNyLCBpbnRlbiwgaW50cG9sOwogCXVuc2lnbmVkIGludCBpbnRyY2F1c2UsZGF0YWxvLGRhdGFoaTsKLQlzdHJ1Y3QgcHRfcmVncyAqcmVnczsKKwlzdHJ1Y3QgcHRfcmVncyAqcmVncyA9IGdldF9pcnFfcmVncygpOwogCiAgICAgICAgIHByaW50aygiQ29yZUhJIGludGVycnVwdCwgc2hvdWxkbid0IGhhcHBlbiwgc28gd2UgZGllIGhlcmUhISFcbiIpOwogICAgICAgICBwcmludGsoImVwYyAgIDogJTA4bHhcblN0YXR1czogJTA4bHhcbiIKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9taXBzLWJvYXJkcy9zaW0vc2ltX3RpbWUuYyBiL2FyY2gvbWlwcy9taXBzLWJvYXJkcy9zaW0vc2ltX3RpbWUuYwppbmRleCBjNTY2YjliLi4yNGE0ZWQwIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvbWlwcy1ib2FyZHMvc2ltL3NpbV90aW1lLmMKKysrIGIvYXJjaC9taXBzL21pcHMtYm9hcmRzL3NpbS9zaW1fdGltZS5jCkBAIC0xMDIsNyArMTAyLDcgQEAKIAogCiAvKgotICogRXN0aW1hdGUgQ1BVIGZyZXF1ZW5jeS4gIFNldHMgbWlwc19jb3VudGVyX2ZyZXF1ZW5jeSBhcyBhIHNpZGUtZWZmZWN0CisgKiBFc3RpbWF0ZSBDUFUgZnJlcXVlbmN5LiAgU2V0cyBtaXBzX2hwdF9mcmVxdWVuY3kgYXMgYSBzaWRlLWVmZmVjdAogICovCiBzdGF0aWMgdW5zaWduZWQgaW50IF9faW5pdCBlc3RpbWF0ZV9jcHVfZnJlcXVlbmN5KHZvaWQpCiB7CmRpZmYgLS1naXQgYS9hcmNoL21pcHMvbW0vYy1zYjEuYyBiL2FyY2gvbWlwcy9tbS9jLXNiMS5jCmluZGV4IDU1Mzc1NTguLmQwZGRiNGEgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9tbS9jLXNiMS5jCisrKyBiL2FyY2gvbWlwcy9tbS9jLXNiMS5jCkBAIC00OSw2ICs0OSwxNSBAQAogc3RhdGljIHVuc2lnbmVkIGludCBpY2FjaGVfcmFuZ2VfY3V0b2ZmOwogc3RhdGljIHVuc2lnbmVkIGludCBkY2FjaGVfcmFuZ2VfY3V0b2ZmOwogCitzdGF0aWMgaW5saW5lIHZvaWQgc2IxX29uX2VhY2hfY3B1KHZvaWQgKCpmdW5jKSAodm9pZCAqaW5mbyksIHZvaWQgKmluZm8sCisJCQkJICAgaW50IHJldHJ5LCBpbnQgd2FpdCkKK3sKKwlwcmVlbXB0X2Rpc2FibGUoKTsKKwlzbXBfY2FsbF9mdW5jdGlvbihmdW5jLCBpbmZvLCByZXRyeSwgd2FpdCk7CisJZnVuYyhpbmZvKTsKKwlwcmVlbXB0X2VuYWJsZSgpOworfQorCiAvKgogICogVGhlIGRjYWNoZSBpcyBmdWxseSBjb2hlcmVudCB0byB0aGUgc3lzdGVtLCB3aXRoIG9uZQogICogYmlnIGNhdmVhdDogIHRoZSBpbnN0cnVjdGlvbiBzdHJlYW0uICBJbiBvdGhlciB3b3JkcywKQEAgLTIyNiw3ICsyMzUsNyBAQAogCWFyZ3Mudm1hID0gdm1hOwogCWFyZ3MuYWRkciA9IGFkZHI7CiAJYXJncy5wZm4gPSBwZm47Ci0Jb25fZWFjaF9jcHUoc2IxX2ZsdXNoX2NhY2hlX3BhZ2VfaXBpLCAodm9pZCAqKSAmYXJncywgMSwgMSk7CisJc2IxX29uX2VhY2hfY3B1KHNiMV9mbHVzaF9jYWNoZV9wYWdlX2lwaSwgKHZvaWQgKikgJmFyZ3MsIDEsIDEpOwogfQogI2Vsc2UKIHZvaWQgc2IxX2ZsdXNoX2NhY2hlX3BhZ2Uoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHVuc2lnbmVkIGxvbmcgYWRkciwgdW5zaWduZWQgbG9uZyBwZm4pCkBAIC0yNDksNyArMjU4LDcgQEAKIAogc3RhdGljIHZvaWQgc2IxX19fZmx1c2hfY2FjaGVfYWxsKHZvaWQpCiB7Ci0Jb25fZWFjaF9jcHUoc2IxX19fZmx1c2hfY2FjaGVfYWxsX2lwaSwgMCwgMSwgMSk7CisJc2IxX29uX2VhY2hfY3B1KHNiMV9fX2ZsdXNoX2NhY2hlX2FsbF9pcGksIDAsIDEsIDEpOwogfQogI2Vsc2UKIHZvaWQgc2IxX19fZmx1c2hfY2FjaGVfYWxsKHZvaWQpCkBAIC0yOTksNyArMzA4LDcgQEAKIAogCWFyZ3Muc3RhcnQgPSBzdGFydDsKIAlhcmdzLmVuZCA9IGVuZDsKLQlvbl9lYWNoX2NwdShzYjFfZmx1c2hfaWNhY2hlX3JhbmdlX2lwaSwgJmFyZ3MsIDEsIDEpOworCXNiMV9vbl9lYWNoX2NwdShzYjFfZmx1c2hfaWNhY2hlX3JhbmdlX2lwaSwgJmFyZ3MsIDEsIDEpOwogfQogI2Vsc2UKIHZvaWQgc2IxX2ZsdXNoX2ljYWNoZV9yYW5nZSh1bnNpZ25lZCBsb25nIHN0YXJ0LCB1bnNpZ25lZCBsb25nIGVuZCkKQEAgLTMyNiw3ICszMzUsNyBAQAogCiBzdGF0aWMgdm9pZCBzYjFfZmx1c2hfY2FjaGVfc2lndHJhbXAodW5zaWduZWQgbG9uZyBhZGRyKQogewotCW9uX2VhY2hfY3B1KHNiMV9mbHVzaF9jYWNoZV9zaWd0cmFtcF9pcGksICh2b2lkICopIGFkZHIsIDEsIDEpOworCXNiMV9vbl9lYWNoX2NwdShzYjFfZmx1c2hfY2FjaGVfc2lndHJhbXBfaXBpLCAodm9pZCAqKSBhZGRyLCAxLCAxKTsKIH0KICNlbHNlCiB2b2lkIHNiMV9mbHVzaF9jYWNoZV9zaWd0cmFtcCh1bnNpZ25lZCBsb25nIGFkZHIpCkBAIC00NDQsNyArNDUzLDYgQEAKIHZvaWQgc2IxX2NhY2hlX2luaXQodm9pZCkKIHsKIAlleHRlcm4gY2hhciBleGNlcHRfdmVjMl9zYjE7Ci0JZXh0ZXJuIGNoYXIgaGFuZGxlX3ZlYzJfc2IxOwogCiAJLyogU3BlY2lhbCBjYWNoZSBlcnJvciBoYW5kbGVyIGZvciBTQjEgKi8KIAlzZXRfdW5jYWNoZWRfaGFuZGxlciAoMHgxMDAsICZleGNlcHRfdmVjMl9zYjEsIDB4ODApOwpAQCAtNDk3LDUgKzUwNSw1IEBACiAJOgogCTogIm1lbW9yeSIpOwogCi0JZmx1c2hfY2FjaGVfYWxsKCk7CisJbG9jYWxfc2IxX19fZmx1c2hfY2FjaGVfYWxsKCk7CiB9CmRpZmYgLS1naXQgYS9hcmNoL21pcHMvbW0vaW5pdC5jIGIvYXJjaC9taXBzL21tL2luaXQuYwppbmRleCA4OGI3MmM5Li4yZGU0ZDNjIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvbW0vaW5pdC5jCisrKyBiL2FyY2gvbWlwcy9tbS9pbml0LmMKQEAgLTMwLDExICszMCwzNCBAQAogI2luY2x1ZGUgPGFzbS9jYWNoZWN0bC5oPgogI2luY2x1ZGUgPGFzbS9jcHUuaD4KICNpbmNsdWRlIDxhc20vZG1hLmg+CisjaW5jbHVkZSA8YXNtL2ttYXBfdHlwZXMuaD4KICNpbmNsdWRlIDxhc20vbW11X2NvbnRleHQuaD4KICNpbmNsdWRlIDxhc20vc2VjdGlvbnMuaD4KICNpbmNsdWRlIDxhc20vcGd0YWJsZS5oPgogI2luY2x1ZGUgPGFzbS9wZ2FsbG9jLmg+CiAjaW5jbHVkZSA8YXNtL3RsYi5oPgorI2luY2x1ZGUgPGFzbS9maXhtYXAuaD4KKworLyogQXRvbWljaXR5IGFuZCBpbnRlcnJ1cHRhYmlsaXR5ICovCisjaWZkZWYgQ09ORklHX01JUFNfTVRfU01UQworCisjaW5jbHVkZSA8YXNtL21pcHNtdHJlZ3MuaD4KKworI2RlZmluZSBFTlRFUl9DUklUSUNBTChmbGFncykgXAorCXsgXAorCXVuc2lnbmVkIGludCBtdnBmbGFnczsgXAorCWxvY2FsX2lycV9zYXZlKGZsYWdzKTtcCisJbXZwZmxhZ3MgPSBkdnBlKCkKKyNkZWZpbmUgRVhJVF9DUklUSUNBTChmbGFncykgXAorCWV2cGUobXZwZmxhZ3MpOyBcCisJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOyBcCisJfQorI2Vsc2UKKworI2RlZmluZSBFTlRFUl9DUklUSUNBTChmbGFncykgbG9jYWxfaXJxX3NhdmUoZmxhZ3MpCisjZGVmaW5lIEVYSVRfQ1JJVElDQUwoZmxhZ3MpIGxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKQorCisjZW5kaWYgLyogQ09ORklHX01JUFNfTVRfU01UQyAqLwogCiBERUZJTkVfUEVSX0NQVShzdHJ1Y3QgbW11X2dhdGhlciwgbW11X2dhdGhlcnMpOwogCkBAIC04MCwxMyArMTAzLDE0MiBAQAogCXJldHVybiAxVUwgPDwgb3JkZXI7CiB9CiAKLSNpZmRlZiBDT05GSUdfSElHSE1FTQotcHRlX3QgKmttYXBfcHRlOwotcGdwcm90X3Qga21hcF9wcm90OworLyoKKyAqIFRoZXNlIGFyZSBhbG1vc3QgbGlrZSBrbWFwX2F0b21pYyAvIGt1bm1hcF9hdG1pYyBleGNlcHQgdGhleSB0YWtlIGFuCisgKiBhZGRpdGlvbmFsIGFkZHJlc3MgYXJndW1lbnQgYXMgdGhlIGhpbnQuCisgKi8KIAogI2RlZmluZSBrbWFwX2dldF9maXhtYXBfcHRlKHZhZGRyKQkJCQkJXAogCXB0ZV9vZmZzZXRfa2VybmVsKHBtZF9vZmZzZXQocHVkX29mZnNldChwZ2Rfb2Zmc2V0X2sodmFkZHIpLCAodmFkZHIpKSwgKHZhZGRyKSksICh2YWRkcikpCiAKKyNpZmRlZiBDT05GSUdfTUlQU19NVF9TTVRDCitzdGF0aWMgcHRlX3QgKmttYXBfY29oZXJlbnRfcHRlOworc3RhdGljIHZvaWQgX19pbml0IGttYXBfY29oZXJlbnRfaW5pdCh2b2lkKQoreworCXVuc2lnbmVkIGxvbmcgdmFkZHI7CisKKwkvKiBjYWNoZSB0aGUgZmlyc3QgY29oZXJlbnQga21hcCBwdGUgKi8KKwl2YWRkciA9IF9fZml4X3RvX3ZpcnQoRklYX0NNQVBfQkVHSU4pOworCWttYXBfY29oZXJlbnRfcHRlID0ga21hcF9nZXRfZml4bWFwX3B0ZSh2YWRkcik7Cit9CisjZWxzZQorc3RhdGljIGlubGluZSB2b2lkIGttYXBfY29oZXJlbnRfaW5pdCh2b2lkKSB7fQorI2VuZGlmCisKK3N0YXRpYyBpbmxpbmUgdm9pZCAqa21hcF9jb2hlcmVudChzdHJ1Y3QgcGFnZSAqcGFnZSwgdW5zaWduZWQgbG9uZyBhZGRyKQoreworCWVudW0gZml4ZWRfYWRkcmVzc2VzIGlkeDsKKwl1bnNpZ25lZCBsb25nIHZhZGRyLCBmbGFncywgZW50cnlsbzsKKwl1bnNpZ25lZCBsb25nIG9sZF9jdHg7CisJcHRlX3QgcHRlOworCWludCB0bGJpZHg7CisKKwlpbmNfcHJlZW1wdF9jb3VudCgpOworCWlkeCA9IChhZGRyID4+IFBBR0VfU0hJRlQpICYgKEZJWF9OX0NPTE9VUlMgLSAxKTsKKyNpZmRlZiBDT05GSUdfTUlQU19NVF9TTVRDCisJaWR4ICs9IEZJWF9OX0NPTE9VUlMgKiBzbXBfcHJvY2Vzc29yX2lkKCk7CisjZW5kaWYKKwl2YWRkciA9IF9fZml4X3RvX3ZpcnQoRklYX0NNQVBfRU5EIC0gaWR4KTsKKwlwdGUgPSBta19wdGUocGFnZSwgUEFHRV9LRVJORUwpOworI2lmIGRlZmluZWQoQ09ORklHXzY0QklUX1BIWVNfQUREUikgJiYgZGVmaW5lZChDT05GSUdfQ1BVX01JUFMzMl9SMSkKKwllbnRyeWxvID0gcHRlLnB0ZV9oaWdoOworI2Vsc2UKKwllbnRyeWxvID0gcHRlX3ZhbChwdGUpID4+IDY7CisjZW5kaWYKKworCUVOVEVSX0NSSVRJQ0FMKGZsYWdzKTsKKwlvbGRfY3R4ID0gcmVhZF9jMF9lbnRyeWhpKCk7CisJd3JpdGVfYzBfZW50cnloaSh2YWRkciAmIChQQUdFX01BU0sgPDwgMSkpOworCXdyaXRlX2MwX2VudHJ5bG8wKGVudHJ5bG8pOworCXdyaXRlX2MwX2VudHJ5bG8xKGVudHJ5bG8pOworI2lmZGVmIENPTkZJR19NSVBTX01UX1NNVEMKKwlzZXRfcHRlKGttYXBfY29oZXJlbnRfcHRlIC0gKEZJWF9DTUFQX0VORCAtIGlkeCksIHB0ZSk7CisJLyogcHJlbG9hZCBUTEIgaW5zdGVhZCBvZiBsb2NhbF9mbHVzaF90bGJfb25lKCkgKi8KKwltdGMwX3RsYndfaGF6YXJkKCk7CisJdGxiX3Byb2JlKCk7CisJdGxiX3Byb2JlX2hhemFyZCgpOworCXRsYmlkeCA9IHJlYWRfYzBfaW5kZXgoKTsKKwltdGMwX3RsYndfaGF6YXJkKCk7CisJaWYgKHRsYmlkeCA8IDApCisJCXRsYl93cml0ZV9yYW5kb20oKTsKKwllbHNlCisJCXRsYl93cml0ZV9pbmRleGVkKCk7CisjZWxzZQorCXRsYmlkeCA9IHJlYWRfYzBfd2lyZWQoKTsKKwl3cml0ZV9jMF93aXJlZCh0bGJpZHggKyAxKTsKKwl3cml0ZV9jMF9pbmRleCh0bGJpZHgpOworCW10YzBfdGxid19oYXphcmQoKTsKKwl0bGJfd3JpdGVfaW5kZXhlZCgpOworI2VuZGlmCisJdGxid191c2VfaGF6YXJkKCk7CisJd3JpdGVfYzBfZW50cnloaShvbGRfY3R4KTsKKwlFWElUX0NSSVRJQ0FMKGZsYWdzKTsKKworCXJldHVybiAodm9pZCopIHZhZGRyOworfQorCisjZGVmaW5lIFVOSVFVRV9FTlRSWUhJKGlkeCkgKENLU0VHMCArICgoaWR4KSA8PCAoUEFHRV9TSElGVCArIDEpKSkKKworc3RhdGljIGlubGluZSB2b2lkIGt1bm1hcF9jb2hlcmVudChzdHJ1Y3QgcGFnZSAqcGFnZSkKK3sKKyNpZm5kZWYgQ09ORklHX01JUFNfTVRfU01UQworCXVuc2lnbmVkIGludCB3aXJlZDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzLCBvbGRfY3R4OworCisJRU5URVJfQ1JJVElDQUwoZmxhZ3MpOworCW9sZF9jdHggPSByZWFkX2MwX2VudHJ5aGkoKTsKKwl3aXJlZCA9IHJlYWRfYzBfd2lyZWQoKSAtIDE7CisJd3JpdGVfYzBfd2lyZWQod2lyZWQpOworCXdyaXRlX2MwX2luZGV4KHdpcmVkKTsKKwl3cml0ZV9jMF9lbnRyeWhpKFVOSVFVRV9FTlRSWUhJKHdpcmVkKSk7CisJd3JpdGVfYzBfZW50cnlsbzAoMCk7CisJd3JpdGVfYzBfZW50cnlsbzEoMCk7CisJbXRjMF90bGJ3X2hhemFyZCgpOworCXRsYl93cml0ZV9pbmRleGVkKCk7CisJdGxid191c2VfaGF6YXJkKCk7CisJd3JpdGVfYzBfZW50cnloaShvbGRfY3R4KTsKKwlFWElUX0NSSVRJQ0FMKGZsYWdzKTsKKyNlbmRpZgorCWRlY19wcmVlbXB0X2NvdW50KCk7CisJcHJlZW1wdF9jaGVja19yZXNjaGVkKCk7Cit9CisKK3ZvaWQgY29weV90b191c2VyX3BhZ2Uoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsCisJc3RydWN0IHBhZ2UgKnBhZ2UsIHVuc2lnbmVkIGxvbmcgdmFkZHIsIHZvaWQgKmRzdCwgY29uc3Qgdm9pZCAqc3JjLAorCXVuc2lnbmVkIGxvbmcgbGVuKQoreworCWlmIChjcHVfaGFzX2RjX2FsaWFzZXMpIHsKKwkJdm9pZCAqdnRvID0ga21hcF9jb2hlcmVudChwYWdlLCB2YWRkcikgKyAodmFkZHIgJiB+UEFHRV9NQVNLKTsKKwkJbWVtY3B5KHZ0bywgc3JjLCBsZW4pOworCQlrdW5tYXBfY29oZXJlbnQocGFnZSk7CisJfSBlbHNlCisJCW1lbWNweShkc3QsIHNyYywgbGVuKTsKKwlpZiAoKHZtYS0+dm1fZmxhZ3MgJiBWTV9FWEVDKSAmJiAhY3B1X2hhc19pY19maWxsc19mX2RjKQorCQlmbHVzaF9jYWNoZV9wYWdlKHZtYSwgdmFkZHIsIHBhZ2VfdG9fcGZuKHBhZ2UpKTsKK30KKworRVhQT1JUX1NZTUJPTChjb3B5X3RvX3VzZXJfcGFnZSk7CisKK3ZvaWQgY29weV9mcm9tX3VzZXJfcGFnZShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwKKwlzdHJ1Y3QgcGFnZSAqcGFnZSwgdW5zaWduZWQgbG9uZyB2YWRkciwgdm9pZCAqZHN0LCBjb25zdCB2b2lkICpzcmMsCisJdW5zaWduZWQgbG9uZyBsZW4pCit7CisJaWYgKGNwdV9oYXNfZGNfYWxpYXNlcykgeworCQl2b2lkICp2ZnJvbSA9CisJCQlrbWFwX2NvaGVyZW50KHBhZ2UsIHZhZGRyKSArICh2YWRkciAmIH5QQUdFX01BU0spOworCQltZW1jcHkoZHN0LCB2ZnJvbSwgbGVuKTsKKwkJa3VubWFwX2NvaGVyZW50KHBhZ2UpOworCX0gZWxzZQorCQltZW1jcHkoZHN0LCBzcmMsIGxlbik7Cit9CisKK0VYUE9SVF9TWU1CT0woY29weV9mcm9tX3VzZXJfcGFnZSk7CisKKworI2lmZGVmIENPTkZJR19ISUdITUVNCitwdGVfdCAqa21hcF9wdGU7CitwZ3Byb3RfdCBrbWFwX3Byb3Q7CisKIHN0YXRpYyB2b2lkIF9faW5pdCBrbWFwX2luaXQodm9pZCkKIHsKIAl1bnNpZ25lZCBsb25nIGttYXBfdnN0YXJ0OwpAQCAtOTcsMTEgKzI0OSwxMiBAQAogCiAJa21hcF9wcm90ID0gUEFHRV9LRVJORUw7CiB9CisjZW5kaWYgLyogQ09ORklHX0hJR0hNRU0gKi8KIAotI2lmZGVmIENPTkZJR18zMkJJVAogdm9pZCBfX2luaXQgZml4cmFuZ2VfaW5pdCh1bnNpZ25lZCBsb25nIHN0YXJ0LCB1bnNpZ25lZCBsb25nIGVuZCwKIAlwZ2RfdCAqcGdkX2Jhc2UpCiB7CisjaWYgZGVmaW5lZChDT05GSUdfSElHSE1FTSkgfHwgZGVmaW5lZChDT05GSUdfTUlQU19NVF9TTVRDKQogCXBnZF90ICpwZ2Q7CiAJcHVkX3QgKnB1ZDsKIAlwbWRfdCAqcG1kOwpAQCAtMTIyLDcgKzI3NSw3IEBACiAJCQlmb3IgKDsgKGsgPCBQVFJTX1BFUl9QTUQpICYmICh2YWRkciAhPSBlbmQpOyBwbWQrKywgaysrKSB7CiAJCQkJaWYgKHBtZF9ub25lKCpwbWQpKSB7CiAJCQkJCXB0ZSA9IChwdGVfdCAqKSBhbGxvY19ib290bWVtX2xvd19wYWdlcyhQQUdFX1NJWkUpOwotCQkJCQlzZXRfcG1kKHBtZCwgX19wbWQocHRlKSk7CisJCQkJCXNldF9wbWQocG1kLCBfX3BtZCgodW5zaWduZWQgbG9uZylwdGUpKTsKIAkJCQkJaWYgKHB0ZSAhPSBwdGVfb2Zmc2V0X2tlcm5lbChwbWQsIDApKQogCQkJCQkJQlVHKCk7CiAJCQkJfQpAQCAtMTMyLDkgKzI4NSw4IEBACiAJCX0KIAkJaiA9IDA7CiAJfQorI2VuZGlmCiB9Ci0jZW5kaWYgLyogQ09ORklHXzMyQklUICovCi0jZW5kaWYgLyogQ09ORklHX0hJR0hNRU0gKi8KIAogI2lmbmRlZiBDT05GSUdfTkVFRF9NVUxUSVBMRV9OT0RFUwogZXh0ZXJuIHZvaWQgcGFnZXRhYmxlX2luaXQodm9pZCk7CkBAIC0xNzUsNiArMzI3LDcgQEAKICNpZmRlZiBDT05GSUdfSElHSE1FTQogCWttYXBfaW5pdCgpOwogI2VuZGlmCisJa21hcF9jb2hlcmVudF9pbml0KCk7CiAKIAltYXhfZG1hID0gdmlydF90b19waHlzKChjaGFyICopTUFYX0RNQV9BRERSRVNTKSA+PiBQQUdFX1NISUZUOwogCWxvdyA9IG1heF9sb3dfcGZuOwpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL21tL2lvcmVtYXAuYyBiL2FyY2gvbWlwcy9tbS9pb3JlbWFwLmMKaW5kZXggMzEwMWQxZC4uY2VhN2QwZSAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL21tL2lvcmVtYXAuYworKysgYi9hcmNoL21pcHMvbW0vaW9yZW1hcC5jCkBAIC0xNzYsNyArMTc2LDcgQEAKIAogI2RlZmluZSBJU19LU0VHMShhZGRyKSAoKCh1bnNpZ25lZCBsb25nKShhZGRyKSAmIH4weDFmZmZmZmZmVUwpID09IENLU0VHMSkKIAotdm9pZCBfX2lvdW5tYXAodm9sYXRpbGUgdm9pZCBfX2lvbWVtICphZGRyKQordm9pZCBfX2lvdW5tYXAoY29uc3Qgdm9sYXRpbGUgdm9pZCBfX2lvbWVtICphZGRyKQogewogCXN0cnVjdCB2bV9zdHJ1Y3QgKnA7CiAKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9tbS9wZy1yNGsuYyBiL2FyY2gvbWlwcy9tbS9wZy1yNGsuYwppbmRleCBiN2M3NDkyLi5kNDFmYzU4IDEwMDY0NAotLS0gYS9hcmNoL21pcHMvbW0vcGctcjRrLmMKKysrIGIvYXJjaC9taXBzL21tL3BnLXI0ay5jCkBAIC0yNzAsNiArMjcwLDIwIEBACiAJZW1pdF9pbnN0cnVjdGlvbihtaSk7CiB9CiAKK3N0YXRpYyBpbmxpbmUgdm9pZCBidWlsZF9hZGRpdV9hMih1bnNpZ25lZCBsb25nIG9mZnNldCkKK3sKKwl1bmlvbiBtaXBzX2luc3RydWN0aW9uIG1pOworCisJQlVHX09OKG9mZnNldCA+IDB4N2ZmZik7CisKKwltaS5pX2Zvcm1hdC5vcGNvZGUgICAgID0gY3B1X2hhc182NGJpdF9ncF9yZWdzID8gZGFkZGl1X29wIDogYWRkaXVfb3A7CisJbWkuaV9mb3JtYXQucnMgICAgICAgICA9IDY7CQkvKiAkYTIgKi8KKwltaS5pX2Zvcm1hdC5ydCAgICAgICAgID0gNjsJCS8qICRhMiAqLworCW1pLmlfZm9ybWF0LnNpbW1lZGlhdGUgPSBvZmZzZXQ7CisKKwllbWl0X2luc3RydWN0aW9uKG1pKTsKK30KKwogc3RhdGljIGlubGluZSB2b2lkIGJ1aWxkX2FkZGl1X2ExKHVuc2lnbmVkIGxvbmcgb2Zmc2V0KQogewogCXVuaW9uIG1pcHNfaW5zdHJ1Y3Rpb24gbWk7CkBAIC0zMzMsNiArMzQ3LDcgQEAKIHZvaWQgX19pbml0IGJ1aWxkX2NsZWFyX3BhZ2Uodm9pZCkKIHsKIAl1bnNpZ25lZCBpbnQgbG9vcF9zdGFydDsKKwl1bnNpZ25lZCBsb25nIG9mZjsKIAogCWVwYyA9ICh1bnNpZ25lZCBpbnQgKikgJmNsZWFyX3BhZ2VfYXJyYXk7CiAJaW5zdHJ1Y3Rpb25fcGVuZGluZyA9IDA7CkBAIC0zNjksNyArMzg0LDEyIEBACiAJCX0KIAl9CiAKLQlidWlsZF9hZGRpdV9hMl9hMChQQUdFX1NJWkUgLSAoY3B1X2hhc19wcmVmZXRjaCA/IHByZWZfb2Zmc2V0X2NsZWFyIDogMCkpOworICAgICAgICBvZmYgPSBQQUdFX1NJWkUgLSAoY3B1X2hhc19wcmVmZXRjaCA/IHByZWZfb2Zmc2V0X2NsZWFyIDogMCk7CisJaWYgKG9mZiA+IDB4N2ZmZikgeworCQlidWlsZF9hZGRpdV9hMl9hMChvZmYgPj4gMSk7CisJCWJ1aWxkX2FkZGl1X2EyKG9mZiA+PiAxKTsKKwl9IGVsc2UKKwkJYnVpbGRfYWRkaXVfYTJfYTAob2ZmKTsKIAogCWlmIChSNDYwMF9WMl9ISVRfQ0FDSEVPUF9XQVIgJiYgY3B1X2lzX3I0NjAwX3YyX3goKSkKIAkJYnVpbGRfaW5zbl93b3JkKDB4M2MwMWEwMDApOwkvKiBsdWkgICAgICRhdCwgMHhhMDAwICAqLwpAQCAtNDIwLDEyICs0NDAsMTggQEAKIHZvaWQgX19pbml0IGJ1aWxkX2NvcHlfcGFnZSh2b2lkKQogewogCXVuc2lnbmVkIGludCBsb29wX3N0YXJ0OworCXVuc2lnbmVkIGxvbmcgb2ZmOwogCiAJZXBjID0gKHVuc2lnbmVkIGludCAqKSAmY29weV9wYWdlX2FycmF5OwogCXN0b3JlX29mZnNldCA9IGxvYWRfb2Zmc2V0ID0gMDsKIAlpbnN0cnVjdGlvbl9wZW5kaW5nID0gMDsKIAotCWJ1aWxkX2FkZGl1X2EyX2EwKFBBR0VfU0laRSAtIChjcHVfaGFzX3ByZWZldGNoID8gcHJlZl9vZmZzZXRfY29weSA6IDApKTsKKwlvZmYgPSBQQUdFX1NJWkUgLSAoY3B1X2hhc19wcmVmZXRjaCA/IHByZWZfb2Zmc2V0X2NvcHkgOiAwKTsKKwlpZiAob2ZmID4gMHg3ZmZmKSB7CisJCWJ1aWxkX2FkZGl1X2EyX2EwKG9mZiA+PiAxKTsKKwkJYnVpbGRfYWRkaXVfYTIob2ZmID4+IDEpOworCX0gZWxzZQorCQlidWlsZF9hZGRpdV9hMl9hMChvZmYpOwogCiAJaWYgKFI0NjAwX1YyX0hJVF9DQUNIRU9QX1dBUiAmJiBjcHVfaXNfcjQ2MDBfdjJfeCgpKQogCQlidWlsZF9pbnNuX3dvcmQoMHgzYzAxYTAwMCk7CS8qIGx1aSAgICAgJGF0LCAweGEwMDAgICovCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvbW0vcGd0YWJsZS0zMi5jIGIvYXJjaC9taXBzL21tL3BndGFibGUtMzIuYwppbmRleCA0YmRhYTA1Li40YTYxZTYyIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvbW0vcGd0YWJsZS0zMi5jCisrKyBiL2FyY2gvbWlwcy9tbS9wZ3RhYmxlLTMyLmMKQEAgLTMxLDkgKzMxLDEwIEBACiAKIHZvaWQgX19pbml0IHBhZ2V0YWJsZV9pbml0KHZvaWQpCiB7Ci0jaWZkZWYgQ09ORklHX0hJR0hNRU0KIAl1bnNpZ25lZCBsb25nIHZhZGRyOwotCXBnZF90ICpwZ2QsICpwZ2RfYmFzZTsKKwlwZ2RfdCAqcGdkX2Jhc2U7CisjaWZkZWYgQ09ORklHX0hJR0hNRU0KKwlwZ2RfdCAqcGdkOwogCXB1ZF90ICpwdWQ7CiAJcG1kX3QgKnBtZDsKIAlwdGVfdCAqcHRlOwpAQCAtNDQsNyArNDUsNiBAQAogCXBnZF9pbml0KCh1bnNpZ25lZCBsb25nKXN3YXBwZXJfcGdfZGlyCiAJCSArIHNpemVvZihwZ2RfdCkgKiBVU0VSX1BUUlNfUEVSX1BHRCk7CiAKLSNpZmRlZiBDT05GSUdfSElHSE1FTQogCXBnZF9iYXNlID0gc3dhcHBlcl9wZ19kaXI7CiAKIAkvKgpAQCAtNTMsNiArNTMsNyBAQAogCXZhZGRyID0gX19maXhfdG9fdmlydChfX2VuZF9vZl9maXhlZF9hZGRyZXNzZXMgLSAxKSAmIFBNRF9NQVNLOwogCWZpeHJhbmdlX2luaXQodmFkZHIsIDAsIHBnZF9iYXNlKTsKIAorI2lmZGVmIENPTkZJR19ISUdITUVNCiAJLyoKIAkgKiBQZXJtYW5lbnQga21hcHM6CiAJICovCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvbW0vcGd0YWJsZS02NC5jIGIvYXJjaC9taXBzL21tL3BndGFibGUtNjQuYwppbmRleCA0NGI1ZTk3Zi4uOGQ2MDBkMyAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL21tL3BndGFibGUtNjQuYworKysgYi9hcmNoL21pcHMvbW0vcGd0YWJsZS02NC5jCkBAIC04LDYgKzgsNyBAQAogICovCiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8YXNtL2ZpeG1hcC5oPgogI2luY2x1ZGUgPGFzbS9wZ3RhYmxlLmg+CiAKIHZvaWQgcGdkX2luaXQodW5zaWduZWQgbG9uZyBwYWdlKQpAQCAtNTIsNyArNTMsMTcgQEAKIAogdm9pZCBfX2luaXQgcGFnZXRhYmxlX2luaXQodm9pZCkKIHsKKwl1bnNpZ25lZCBsb25nIHZhZGRyOworCXBnZF90ICpwZ2RfYmFzZTsKKwogCS8qIEluaXRpYWxpemUgdGhlIGVudGlyZSBwZ2QuICAqLwogCXBnZF9pbml0KCh1bnNpZ25lZCBsb25nKXN3YXBwZXJfcGdfZGlyKTsKIAlwbWRfaW5pdCgodW5zaWduZWQgbG9uZylpbnZhbGlkX3BtZF90YWJsZSwgKHVuc2lnbmVkIGxvbmcpaW52YWxpZF9wdGVfdGFibGUpOworCisJcGdkX2Jhc2UgPSBzd2FwcGVyX3BnX2RpcjsKKwkvKgorCSAqIEZpeGVkIG1hcHBpbmdzOgorCSAqLworCXZhZGRyID0gX19maXhfdG9fdmlydChfX2VuZF9vZl9maXhlZF9hZGRyZXNzZXMgLSAxKSAmIFBNRF9NQVNLOworCWZpeHJhbmdlX2luaXQodmFkZHIsIDAsIHBnZF9iYXNlKTsKIH0KZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9tbS90bGJleC5jIGIvYXJjaC9taXBzL21tL3RsYmV4LmMKaW5kZXggNmY4YjI1Yy4uZmVjMzE4YSAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL21tL3RsYmV4LmMKKysrIGIvYXJjaC9taXBzL21tL3RsYmV4LmMKQEAgLTEwMiw3ICsxMDIsNyBAQAogCWluc25fYWRkdSwgaW5zbl9hZGRpdSwgaW5zbl9hbmQsIGluc25fYW5kaSwgaW5zbl9iZXEsCiAJaW5zbl9iZXFsLCBpbnNuX2JnZXosIGluc25fYmdlemwsIGluc25fYmx0eiwgaW5zbl9ibHR6bCwKIAlpbnNuX2JuZSwgaW5zbl9kYWRkdSwgaW5zbl9kYWRkaXUsIGluc25fZG1mYzAsIGluc25fZG10YzAsCi0JaW5zbl9kc2xsLCBpbnNuX2RzbGwzMiwgaW5zbl9kc3JhLCBpbnNuX2RzcmwsCisJaW5zbl9kc2xsLCBpbnNuX2RzbGwzMiwgaW5zbl9kc3JhLCBpbnNuX2RzcmwsIGluc25fZHNybDMyLAogCWluc25fZHN1YnUsIGluc25fZXJldCwgaW5zbl9qLCBpbnNuX2phbCwgaW5zbl9qciwgaW5zbl9sZCwKIAlpbnNuX2xsLCBpbnNuX2xsZCwgaW5zbl9sdWksIGluc25fbHcsIGluc25fbWZjMCwgaW5zbl9tdGMwLAogCWluc25fb3JpLCBpbnNuX3JmZSwgaW5zbl9zYywgaW5zbl9zY2QsIGluc25fc2QsIGluc25fc2xsLApAQCAtMTQ1LDYgKzE0NSw3IEBACiAJeyBpbnNuX2RzbGwzMiwgTShzcGVjX29wLDAsMCwwLDAsZHNsbDMyX29wKSwgUlQgfCBSRCB8IFJFIH0sCiAJeyBpbnNuX2RzcmEsIE0oc3BlY19vcCwwLDAsMCwwLGRzcmFfb3ApLCBSVCB8IFJEIHwgUkUgfSwKIAl7IGluc25fZHNybCwgTShzcGVjX29wLDAsMCwwLDAsZHNybF9vcCksIFJUIHwgUkQgfCBSRSB9LAorCXsgaW5zbl9kc3JsMzIsIE0oc3BlY19vcCwwLDAsMCwwLGRzcmwzMl9vcCksIFJUIHwgUkQgfCBSRSB9LAogCXsgaW5zbl9kc3VidSwgTShzcGVjX29wLDAsMCwwLDAsZHN1YnVfb3ApLCBSUyB8IFJUIHwgUkQgfSwKIAl7IGluc25fZXJldCwgTShjb3AwX29wLGNvcF9vcCwwLDAsMCxlcmV0X29wKSwgMCB9LAogCXsgaW5zbl9qLCBNKGpfb3AsMCwwLDAsMCwwKSwgSklNTSB9LApAQCAtMzg1LDYgKzM4Niw3IEBACiBJX3UydTF1MyhfZHNsbDMyKTsKIElfdTJ1MXUzKF9kc3JhKTsKIElfdTJ1MXUzKF9kc3JsKTsKK0lfdTJ1MXUzKF9kc3JsMzIpOwogSV91M3UxdTIoX2RzdWJ1KTsKIElfMChfZXJldCk7CiBJX3UxKF9qKTsKQEAgLTk5Niw3ICs5OTgsMTIgQEAKICNlbmRpZgogCiAJbF92bWFsbG9jX2RvbmUobCwgKnApOwotCWlfZHNybChwLCB0bXAsIHRtcCwgUEdESVJfU0hJRlQtMyk7IC8qIGdldCBwZ2Qgb2Zmc2V0IGluIGJ5dGVzICovCisKKwlpZiAoUEdESVJfU0hJRlQgLSAzIDwgMzIpCQkvKiBnZXQgcGdkIG9mZnNldCBpbiBieXRlcyAqLworCQlpX2RzcmwocCwgdG1wLCB0bXAsIFBHRElSX1NISUZULTMpOworCWVsc2UKKwkJaV9kc3JsMzIocCwgdG1wLCB0bXAsIFBHRElSX1NISUZUIC0gMyAtIDMyKTsKKwogCWlfYW5kaShwLCB0bXAsIHRtcCwgKFBUUlNfUEVSX1BHRCAtIDEpPDwzKTsKIAlpX2RhZGR1KHAsIHB0ciwgcHRyLCB0bXApOyAvKiBhZGQgaW4gcGdkIG9mZnNldCAqLwogCWlfZG1mYzAocCwgdG1wLCBDMF9CQURWQUREUik7IC8qIGdldCBmYXVsdGluZyBhZGRyZXNzICovCkBAIC0xMDczLDcgKzEwODAsNyBAQAogCiBzdGF0aWMgX19pbml0IHZvaWQgYnVpbGRfYWRqdXN0X2NvbnRleHQodTMyICoqcCwgdW5zaWduZWQgaW50IGN0eCkKIHsKLQl1bnNpZ25lZCBpbnQgc2hpZnQgPSA0IC0gKFBURV9UX0xPRzIgKyAxKTsKKwl1bnNpZ25lZCBpbnQgc2hpZnQgPSA0IC0gKFBURV9UX0xPRzIgKyAxKSArIFBBR0VfU0hJRlQgLSAxMjsKIAl1bnNpZ25lZCBpbnQgbWFzayA9IChQVFJTX1BFUl9QVEUgLyAyIC0gMSkgPDwgKFBURV9UX0xPRzIgKyAxKTsKIAogCXN3aXRjaCAoY3VycmVudF9jcHVfZGF0YS5jcHV0eXBlKSB7CmRpZmYgLS1naXQgYS9hcmNoL21pcHMvbW9tZW50dW0vb2NlbG90XzMvTWFrZWZpbGUgYi9hcmNoL21pcHMvbW9tZW50dW0vb2NlbG90XzMvTWFrZWZpbGUKaW5kZXggOGJjZWE2NGQuLmQ1YTA5MGEgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9tb21lbnR1bS9vY2Vsb3RfMy9NYWtlZmlsZQorKysgYi9hcmNoL21pcHMvbW9tZW50dW0vb2NlbG90XzMvTWFrZWZpbGUKQEAgLTUsNCArNSw0IEBACiAjIHJlbW92ZXMgYW55IG9sZCBkZXBlbmRlbmNpZXMuIERPTidUIHB1dCB5b3VyIG93biBkZXBlbmRlbmNpZXMgaGVyZQogIyB1bmxlc3MgaXQncyBzb21ldGhpbmcgc3BlY2lhbCAoaWUgbm90IGEgLmMgZmlsZSkuCiAjCi1vYmoteQkgKz0gaXJxLm8gcHJvbS5vIHJlc2V0Lm8gc2V0dXAubworb2JqLXkJICs9IGlycS5vIHBsYXRmb3JtLm8gcHJvbS5vIHJlc2V0Lm8gc2V0dXAubwpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL21vbWVudHVtL29jZWxvdF8zL29jZWxvdF8zX2ZwZ2EuaCBiL2FyY2gvbWlwcy9tb21lbnR1bS9vY2Vsb3RfMy9vY2Vsb3RfM19mcGdhLmgKaW5kZXggMjI3ZTQyOS4uNTcxMGE5MCAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL21vbWVudHVtL29jZWxvdF8zL29jZWxvdF8zX2ZwZ2EuaAorKysgYi9hcmNoL21pcHMvbW9tZW50dW0vb2NlbG90XzMvb2NlbG90XzNfZnBnYS5oCkBAIC01MSw3ICs1MSw5IEBACiAKIGV4dGVybiB1bnNpZ25lZCBsb25nIG9jZWxvdF9mcGdhX2Jhc2U7CiAKLSNkZWZpbmUgT0NFTE9UX0ZQR0FfV1JJVEUoeCwgeSkgd3JpdGViKHgsIG9jZWxvdF9mcGdhX2Jhc2UgKyBPQ0VMT1RfM19SRUdfIyN5KQotI2RlZmluZSBPQ0VMT1RfRlBHQV9SRUFEKHgpIHJlYWRiKG9jZWxvdF9mcGdhX2Jhc2UgKyBPQ0VMT1RfM19SRUdfIyN4KQorI2RlZmluZSBfX0ZQR0FfUkVHX1RPX0FERFIocmVnKQkJCQkJCVwKKwkoKHZvaWQgKikgb2NlbG90X2ZwZ2FfYmFzZSArIE9DRUxPVF8zX1JFR18jI3JlZykKKyNkZWZpbmUgT0NFTE9UX0ZQR0FfV1JJVEUoeCwgcmVnKSB3cml0ZWIoeCwgX19GUEdBX1JFR19UT19BRERSKHJlZykpCisjZGVmaW5lIE9DRUxPVF9GUEdBX1JFQUQocmVnKSByZWFkYihfX0ZQR0FfUkVHX1RPX0FERFIocmVnKSkKIAogI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvbW9tZW50dW0vb2NlbG90XzMvcGxhdGZvcm0uYyBiL2FyY2gvbWlwcy9tb21lbnR1bS9vY2Vsb3RfMy9wbGF0Zm9ybS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVlZmU1ODQKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL21pcHMvbW9tZW50dW0vb2NlbG90XzMvcGxhdGZvcm0uYwpAQCAtMCwwICsxLDIzNSBAQAorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvaWZfZXRoZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9tdjY0M3h4Lmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisKKyNpbmNsdWRlICJvY2Vsb3RfM19mcGdhLmgiCisKKyNpZiBkZWZpbmVkKENPTkZJR19NVjY0M1hYX0VUSCkgfHwgZGVmaW5lZChDT05GSUdfTVY2NDNYWF9FVEhfTU9EVUxFKQorCitzdGF0aWMgc3RydWN0IHJlc291cmNlIG12NjQzeHhfZXRoX3NoYXJlZF9yZXNvdXJjZXNbXSA9IHsKKwlbMF0gPSB7CisJCS5uYW1lICAgPSAiZXRoZXJuZXQgc2hhcmVkIGJhc2UiLAorCQkuc3RhcnQgID0gMHhmMTAwMDAwMCArIE1WNjQzWFhfRVRIX1NIQVJFRF9SRUdTLAorCQkuZW5kICAgID0gMHhmMTAwMDAwMCArIE1WNjQzWFhfRVRIX1NIQVJFRF9SRUdTICsKKwkJICAgICAgICAgICAgICAgICAgICAgICBNVjY0M1hYX0VUSF9TSEFSRURfUkVHU19TSVpFIC0gMSwKKwkJLmZsYWdzICA9IElPUkVTT1VSQ0VfTUVNLAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBtdjY0M3h4X2V0aF9zaGFyZWRfZGV2aWNlID0geworCS5uYW1lCQk9IE1WNjQzWFhfRVRIX1NIQVJFRF9OQU1FLAorCS5pZAkJPSAwLAorCS5udW1fcmVzb3VyY2VzCT0gQVJSQVlfU0laRShtdjY0M3h4X2V0aF9zaGFyZWRfcmVzb3VyY2VzKSwKKwkucmVzb3VyY2UJPSBtdjY0M3h4X2V0aF9zaGFyZWRfcmVzb3VyY2VzLAorfTsKKworI2RlZmluZSBNVl9TUkFNX0JBU0UJCQkweGZlMDAwMDAwVUwKKyNkZWZpbmUgTVZfU1JBTV9TSVpFCQkJKDI1NiAqIDEwMjQpCisKKyNkZWZpbmUgTVZfU1JBTV9SWFJJTkdfU0laRQkJKE1WX1NSQU1fU0laRSAvIDQpCisjZGVmaW5lIE1WX1NSQU1fVFhSSU5HX1NJWkUJCShNVl9TUkFNX1NJWkUgLyA0KQorCisjZGVmaW5lIE1WX1NSQU1fQkFTRV9FVEgwCQlNVl9TUkFNX0JBU0UKKyNkZWZpbmUgTVZfU1JBTV9CQVNFX0VUSDEJCShNVl9TUkFNX0JBU0UgKyAoTVZfU1JBTV9TSVpFIC8gMikpCisKKyNkZWZpbmUgTVY2NHg2MF9JUlFfRVRIXzAgNDgKKyNkZWZpbmUgTVY2NHg2MF9JUlFfRVRIXzEgNDkKKyNkZWZpbmUgTVY2NHg2MF9JUlFfRVRIXzIgNTAKKworI2lmZGVmIENPTkZJR19NVjY0M1hYX0VUSF8wCisKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgbXY2NHg2MF9ldGgwX3Jlc291cmNlc1tdID0geworCVswXSA9IHsKKwkJLm5hbWUJPSAiZXRoMCBpcnEiLAorCQkuc3RhcnQJPSBNVjY0eDYwX0lSUV9FVEhfMCwKKwkJLmVuZAk9IE1WNjR4NjBfSVJRX0VUSF8wLAorCQkuZmxhZ3MJPSBJT1JFU09VUkNFX0lSUSwKKwl9LAorfTsKKworc3RhdGljIGNoYXIgZXRoMF9tYWNfYWRkcltFVEhfQUxFTl07CisKK3N0YXRpYyBzdHJ1Y3QgbXY2NDN4eF9ldGhfcGxhdGZvcm1fZGF0YSBldGgwX3BkID0geworCS5tYWNfYWRkcgk9IGV0aDBfbWFjX2FkZHIsCisKKwkudHhfc3JhbV9hZGRyCT0gTVZfU1JBTV9CQVNFX0VUSDAsCisJLnR4X3NyYW1fc2l6ZQk9IE1WX1NSQU1fVFhSSU5HX1NJWkUsCisJLnR4X3F1ZXVlX3NpemUJPSBNVl9TUkFNX1RYUklOR19TSVpFIC8gMTYsCisKKwkucnhfc3JhbV9hZGRyCT0gTVZfU1JBTV9CQVNFX0VUSDAgKyBNVl9TUkFNX1RYUklOR19TSVpFLAorCS5yeF9zcmFtX3NpemUJPSBNVl9TUkFNX1JYUklOR19TSVpFLAorCS5yeF9xdWV1ZV9zaXplCT0gTVZfU1JBTV9SWFJJTkdfU0laRSAvIDE2LAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgZXRoMF9kZXZpY2UgPSB7CisJLm5hbWUJCT0gTVY2NDNYWF9FVEhfTkFNRSwKKwkuaWQJCT0gMCwKKwkubnVtX3Jlc291cmNlcwk9IEFSUkFZX1NJWkUobXY2NHg2MF9ldGgwX3Jlc291cmNlcyksCisJLnJlc291cmNlCT0gbXY2NHg2MF9ldGgwX3Jlc291cmNlcywKKwkuZGV2ID0geworCQkucGxhdGZvcm1fZGF0YSA9ICZldGgwX3BkLAorCX0sCit9OworI2VuZGlmIC8qIENPTkZJR19NVjY0M1hYX0VUSF8wICovCisKKyNpZmRlZiBDT05GSUdfTVY2NDNYWF9FVEhfMQorCitzdGF0aWMgc3RydWN0IHJlc291cmNlIG12NjR4NjBfZXRoMV9yZXNvdXJjZXNbXSA9IHsKKwlbMF0gPSB7CisJCS5uYW1lCT0gImV0aDEgaXJxIiwKKwkJLnN0YXJ0CT0gTVY2NHg2MF9JUlFfRVRIXzEsCisJCS5lbmQJPSBNVjY0eDYwX0lSUV9FVEhfMSwKKwkJLmZsYWdzCT0gSU9SRVNPVVJDRV9JUlEsCisJfSwKK307CisKK3N0YXRpYyBjaGFyIGV0aDFfbWFjX2FkZHJbRVRIX0FMRU5dOworCitzdGF0aWMgc3RydWN0IG12NjQzeHhfZXRoX3BsYXRmb3JtX2RhdGEgZXRoMV9wZCA9IHsKKwkubWFjX2FkZHIJPSBldGgxX21hY19hZGRyLAorCisJLnR4X3NyYW1fYWRkcgk9IE1WX1NSQU1fQkFTRV9FVEgxLAorCS50eF9zcmFtX3NpemUJPSBNVl9TUkFNX1RYUklOR19TSVpFLAorCS50eF9xdWV1ZV9zaXplCT0gTVZfU1JBTV9UWFJJTkdfU0laRSAvIDE2LAorCisJLnJ4X3NyYW1fYWRkcgk9IE1WX1NSQU1fQkFTRV9FVEgxICsgTVZfU1JBTV9UWFJJTkdfU0laRSwKKwkucnhfc3JhbV9zaXplCT0gTVZfU1JBTV9SWFJJTkdfU0laRSwKKwkucnhfcXVldWVfc2l6ZQk9IE1WX1NSQU1fUlhSSU5HX1NJWkUgLyAxNiwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGV0aDFfZGV2aWNlID0geworCS5uYW1lCQk9IE1WNjQzWFhfRVRIX05BTUUsCisJLmlkCQk9IDEsCisJLm51bV9yZXNvdXJjZXMJPSBBUlJBWV9TSVpFKG12NjR4NjBfZXRoMV9yZXNvdXJjZXMpLAorCS5yZXNvdXJjZQk9IG12NjR4NjBfZXRoMV9yZXNvdXJjZXMsCisJLmRldiA9IHsKKwkJLnBsYXRmb3JtX2RhdGEgPSAmZXRoMV9wZCwKKwl9LAorfTsKKyNlbmRpZiAvKiBDT05GSUdfTVY2NDNYWF9FVEhfMSAqLworCisjaWZkZWYgQ09ORklHX01WNjQzWFhfRVRIXzIKKworc3RhdGljIHN0cnVjdCByZXNvdXJjZSBtdjY0eDYwX2V0aDJfcmVzb3VyY2VzW10gPSB7CisJWzBdID0geworCQkubmFtZQk9ICJldGgyIGlycSIsCisJCS5zdGFydAk9IE1WNjR4NjBfSVJRX0VUSF8yLAorCQkuZW5kCT0gTVY2NHg2MF9JUlFfRVRIXzIsCisJCS5mbGFncwk9IElPUkVTT1VSQ0VfSVJRLAorCX0sCit9OworCitzdGF0aWMgY2hhciBldGgyX21hY19hZGRyW0VUSF9BTEVOXTsKKworc3RhdGljIHN0cnVjdCBtdjY0M3h4X2V0aF9wbGF0Zm9ybV9kYXRhIGV0aDJfcGQgPSB7CisJLm1hY19hZGRyCT0gZXRoMl9tYWNfYWRkciwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGV0aDJfZGV2aWNlID0geworCS5uYW1lCQk9IE1WNjQzWFhfRVRIX05BTUUsCisJLmlkCQk9IDEsCisJLm51bV9yZXNvdXJjZXMJPSBBUlJBWV9TSVpFKG12NjR4NjBfZXRoMl9yZXNvdXJjZXMpLAorCS5yZXNvdXJjZQk9IG12NjR4NjBfZXRoMl9yZXNvdXJjZXMsCisJLmRldiA9IHsKKwkJLnBsYXRmb3JtX2RhdGEgPSAmZXRoMl9wZCwKKwl9LAorfTsKKyNlbmRpZiAvKiBDT05GSUdfTVY2NDNYWF9FVEhfMiAqLworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSAqbXY2NDN4eF9ldGhfcGRfZGV2c1tdIF9faW5pdGRhdGEgPSB7CisJJm12NjQzeHhfZXRoX3NoYXJlZF9kZXZpY2UsCisjaWZkZWYgQ09ORklHX01WNjQzWFhfRVRIXzAKKwkmZXRoMF9kZXZpY2UsCisjZW5kaWYKKyNpZmRlZiBDT05GSUdfTVY2NDNYWF9FVEhfMQorCSZldGgxX2RldmljZSwKKyNlbmRpZgorI2lmZGVmIENPTkZJR19NVjY0M1hYX0VUSF8yCisJJmV0aDJfZGV2aWNlLAorI2VuZGlmCit9OworCitzdGF0aWMgdTggX19pbml0IGV4Y2hhbmdlX2JpdCh1OCB2YWwsIHU4IGNzKQoreworCS8qIHBsYWNlIHRoZSBkYXRhICovCisJT0NFTE9UX0ZQR0FfV1JJVEUoKHZhbCA8PCAyKSB8IGNzLCBFRVBST01fTU9ERSk7CisJdWRlbGF5KDEpOworCisJLyogdHVybiB0aGUgY2xvY2sgb24gKi8KKwlPQ0VMT1RfRlBHQV9XUklURSgodmFsIDw8IDIpIHwgY3MgfCAweDIsIEVFUFJPTV9NT0RFKTsKKwl1ZGVsYXkoMSk7CisKKwkvKiB0dXJuIHRoZSBjbG9jayBvZmYgYW5kIHJlYWQtc3Ryb2JlICovCisJT0NFTE9UX0ZQR0FfV1JJVEUoKHZhbCA8PCAyKSB8IGNzIHwgMHgxMCwgRUVQUk9NX01PREUpOworCisJLyogcmV0dXJuIHRoZSBkYXRhICovCisJcmV0dXJuIChPQ0VMT1RfRlBHQV9SRUFEKEVFUFJPTV9NT0RFKSA+PiAzKSAmIDB4MTsKK30KKworc3RhdGljIHZvaWQgX19pbml0IGdldF9tYWMoY2hhciBkZXN0WzZdKQoreworCXU4IHJlYWRfb3Bjb2RlWzEyXSA9IHsxLCAxLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwfTsKKwlpbnQgaSxqOworCisJZm9yIChpID0gMDsgaSA8IDEyOyBpKyspCisJCWV4Y2hhbmdlX2JpdChyZWFkX29wY29kZVtpXSwgMSk7CisKKwlmb3IgKGogPSAwOyBqIDwgNjsgaisrKSB7CisJCWRlc3Rbal0gPSAwOworCQlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKSB7CisJCQlkZXN0W2pdIDw8PSAxOworCQkJZGVzdFtqXSB8PSBleGNoYW5nZV9iaXQoMCwgMSk7CisJCX0KKwl9CisKKwkvKiB0dXJuIG9mZiBDUyAqLworCWV4Y2hhbmdlX2JpdCgwLDApOworfQorCisvKgorICogQ29weSBhbmQgaW5jcmVtZW50IGV0aGVybmV0IE1BQyBhZGRyZXNzIGJ5IGEgc21hbGwgdmFsdWUuCisgKgorICogVGhpcyBpcyB1c2VmdWwgZm9yIHN5c3RlbXMgd2hlcmUgdGhlIG9ubHkgb25lIE1BQyBhZGRyZXNzIGlzIHN0b3JlZCBpbgorICogbm9uLXZvbGF0aWxlIG1lbW9yeSBmb3IgbXVsdGlwbGUgcG9ydHMuCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBldGhfbWFjX2FkZCh1bnNpZ25lZCBjaGFyICpkc3QsIHVuc2lnbmVkIGNoYXIgKnNyYywKKwl1bnNpZ25lZCBpbnQgYWRkKQoreworCWludCBpOworCisJQlVHX09OKGFkZCA+PSAyNTYpOworCisJZm9yIChpID0gRVRIX0FMRU47IGkgPj0gMDsgaS0tKSB7CisJCWRzdFtpXSA9IHNyY1tpXSArIGFkZDsKKwkJYWRkID0gZHN0W2ldIDwgc3JjW2ldOwkJLyogY29tcHV0ZSBjYXJyeSAqLworCX0KKworCVdBUk5fT04oYWRkKTsKK30KKworc3RhdGljIGludCBfX2luaXQgbXY2NDN4eF9ldGhfYWRkX3Bkcyh2b2lkKQoreworCXVuc2lnbmVkIGNoYXIgbWFjW0VUSF9BTEVOXTsKKwlpbnQgcmV0OworCisJZ2V0X21hYyhtYWMpOworI2lmZGVmIENPTkZJR19NVjY0M1hYX0VUSF8wCisJZXRoX21hY19hZGQoZXRoMV9tYWNfYWRkciwgbWFjLCAwKTsKKyNlbmRpZgorI2lmZGVmIENPTkZJR19NVjY0M1hYX0VUSF8xCisJZXRoX21hY19hZGQoZXRoMV9tYWNfYWRkciwgbWFjLCAxKTsKKyNlbmRpZgorI2lmZGVmIENPTkZJR19NVjY0M1hYX0VUSF8yCisJZXRoX21hY19hZGQoZXRoMl9tYWNfYWRkciwgbWFjLCAyKTsKKyNlbmRpZgorCXJldCA9IHBsYXRmb3JtX2FkZF9kZXZpY2VzKG12NjQzeHhfZXRoX3BkX2RldnMsCisJCQlBUlJBWV9TSVpFKG12NjQzeHhfZXRoX3BkX2RldnMpKTsKKworCXJldHVybiByZXQ7Cit9CisKK2RldmljZV9pbml0Y2FsbChtdjY0M3h4X2V0aF9hZGRfcGRzKTsKKworI2VuZGlmIC8qIGRlZmluZWQoQ09ORklHX01WNjQzWFhfRVRIKSB8fCBkZWZpbmVkKENPTkZJR19NVjY0M1hYX0VUSF9NT0RVTEUpICovCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvbW9tZW50dW0vb2NlbG90XzMvcHJvbS5jIGIvYXJjaC9taXBzL21vbWVudHVtL29jZWxvdF8zL3Byb20uYwppbmRleCAyOTZkOTQ1Li42Y2U5YjdmIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvbW9tZW50dW0vb2NlbG90XzMvcHJvbS5jCisrKyBiL2FyY2gvbWlwcy9tb21lbnR1bS9vY2Vsb3RfMy9wcm9tLmMKQEAgLTM0LDY0ICszNCwxMSBAQAogZXh0ZXJuIHVuc2lnbmVkIGxvbmcgbWFydmVsbF9iYXNlOwogZXh0ZXJuIHVuc2lnbmVkIGxvbmcgY3B1X2Nsb2NrOwogCi0jaWZkZWYgQ09ORklHX01WNjQzWFhfRVRICi1leHRlcm4gdW5zaWduZWQgY2hhciBwcm9tX21hY19hZGRyX2Jhc2VbNl07Ci0jZW5kaWYKLQogY29uc3QgY2hhciAqZ2V0X3N5c3RlbV90eXBlKHZvaWQpCiB7CiAJcmV0dXJuICJNb21lbnR1bSBPY2Vsb3QtMyI7CiB9CiAKLSNpZmRlZiBDT05GSUdfTVY2NDNYWF9FVEgKLXZvaWQgYnVybl9jbG9ja3Modm9pZCkKLXsKLQlpbnQgaTsKLQotCS8qIHRoaXMgbG9vcCBzaG91bGQgYnVybiBhdCBsZWFzdCAxdXMgLS0gdGhpcyBzaG91bGQgYmUgcGxlbnR5ICovCi0JZm9yIChpID0gMDsgaSA8IDB4MTAwMDA7IGkrKykKLQkJOwotfQotCi11OCBleGNoYW5nZV9iaXQodTggdmFsLCB1OCBjcykKLXsKLQkvKiBwbGFjZSB0aGUgZGF0YSAqLwotCU9DRUxPVF9GUEdBX1dSSVRFKCh2YWwgPDwgMikgfCBjcywgRUVQUk9NX01PREUpOwotCWJ1cm5fY2xvY2tzKCk7Ci0KLQkvKiB0dXJuIHRoZSBjbG9jayBvbiAqLwotCU9DRUxPVF9GUEdBX1dSSVRFKCh2YWwgPDwgMikgfCBjcyB8IDB4MiwgRUVQUk9NX01PREUpOwotCWJ1cm5fY2xvY2tzKCk7Ci0KLQkvKiB0dXJuIHRoZSBjbG9jayBvZmYgYW5kIHJlYWQtc3Ryb2JlICovCi0JT0NFTE9UX0ZQR0FfV1JJVEUoKHZhbCA8PCAyKSB8IGNzIHwgMHgxMCwgRUVQUk9NX01PREUpOwotCi0JLyogcmV0dXJuIHRoZSBkYXRhICovCi0JcmV0dXJuICgoT0NFTE9UX0ZQR0FfUkVBRChFRVBST01fTU9ERSkgPj4gMykgJiAweDEpOwotfQotCi12b2lkIGdldF9tYWMoY2hhciBkZXN0WzZdKQotewotCXU4IHJlYWRfb3Bjb2RlWzEyXSA9IHsxLCAxLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwfTsKLQlpbnQgaSxqOwotCi0JZm9yIChpID0gMDsgaSA8IDEyOyBpKyspCi0JCWV4Y2hhbmdlX2JpdChyZWFkX29wY29kZVtpXSwgMSk7Ci0KLQlmb3IgKGogPSAwOyBqIDwgNjsgaisrKSB7Ci0JCWRlc3Rbal0gPSAwOwotCQlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKSB7Ci0JCQlkZXN0W2pdIDw8PSAxOwotCQkJZGVzdFtqXSB8PSBleGNoYW5nZV9iaXQoMCwgMSk7Ci0JCX0KLQl9Ci0KLQkvKiB0dXJuIG9mZiBDUyAqLwotCWV4Y2hhbmdlX2JpdCgwLDApOwotfQotI2VuZGlmCi0KLQogI2lmZGVmIENPTkZJR182NEJJVAogCiB1bnNpZ25lZCBsb25nIHNpZ25leHQodW5zaWduZWQgbG9uZyBhZGRyKQpAQCAtMjI4LDExICsxNzUsNiBAQAogCW1pcHNfbWFjaGdyb3VwID0gTUFDSF9HUk9VUF9NT01FTkNPOwogCW1pcHNfbWFjaHR5cGUgPSBNQUNIX01PTUVOQ09fT0NFTE9UXzM7CiAKLSNpZmRlZiBDT05GSUdfTVY2NDNYWF9FVEgKLQkvKiBnZXQgdGhlIGJhc2UgTUFDIGFkZHJlc3MgZm9yIG9uLWJvYXJkIGV0aGVybmV0IHBvcnRzICovCi0JZ2V0X21hYyhwcm9tX21hY19hZGRyX2Jhc2UpOwotI2VuZGlmCi0KICNpZm5kZWYgQ09ORklHXzY0QklUCiAJZGVidWdfdmVjdG9ycy0+cHJpbnRmKCJCb290aW5nIExpbnV4IGtlcm5lbC4uLlxuIik7CiAjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9tb21lbnR1bS9vY2Vsb3RfMy9zZXR1cC5jIGIvYXJjaC9taXBzL21vbWVudHVtL29jZWxvdF8zL3NldHVwLmMKaW5kZXggN2Q3NGY4Yy4uZmYwODI5ZiAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL21vbWVudHVtL29jZWxvdF8zL3NldHVwLmMKKysrIGIvYXJjaC9taXBzL21vbWVudHVtL29jZWxvdF8zL3NldHVwLmMKQEAgLTQsNyArNCw3IEBACiAgKiBCUklFRiBNT0RVTEUgREVTQ1JJUFRJT04KICAqIE1vbWVudHVtIENvbXB1dGVyIE9jZWxvdC0zIGJvYXJkIGRlcGVuZGVudCBib290IHJvdXRpbmVzCiAgKgotICogQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk3LCAwMSwgMDUgIFJhbGYgQmFlY2hsZQorICogQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk3LCAwMSwgMDUgLSAwNiAgUmFsZiBCYWVjaGxlCiAgKiBDb3B5cmlnaHQgKEMpIDIwMDAgUmlkZ2VSdW4sIEluYy4KICAqIENvcHlyaWdodCAoQykgMjAwMSBSZWQgSGF0LCBJbmMuCiAgKiBDb3B5cmlnaHQgKEMpIDIwMDIgTW9tZW50dW0gQ29tcHV0ZXIKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9tb21lbnR1bS9vY2Vsb3RfYy9NYWtlZmlsZSBiL2FyY2gvbWlwcy9tb21lbnR1bS9vY2Vsb3RfYy9NYWtlZmlsZQppbmRleCA5NDgwMmI0Li5kNjkxNjFhIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvbW9tZW50dW0vb2NlbG90X2MvTWFrZWZpbGUKKysrIGIvYXJjaC9taXBzL21vbWVudHVtL29jZWxvdF9jL01ha2VmaWxlCkBAIC0yLDcgKzIsNyBAQAogIyBNYWtlZmlsZSBmb3IgTW9tZW50dW0gQ29tcHV0ZXIncyBPY2Vsb3QtQyBhbmQgLUNTIGJvYXJkcy4KICMKIAotb2JqLXkJIAkJKz0gY3BjaS1pcnEubyBpcnEubyBwcm9tLm8gcmVzZXQubyBcCitvYmoteQkgCQkrPSBjcGNpLWlycS5vIGlycS5vIHBsYXRmb3JtLm8gcHJvbS5vIHJlc2V0Lm8gXAogCQkJICAgc2V0dXAubyB1YXJ0LWlycS5vCiAKIG9iai0kKENPTkZJR19LR0RCKQkrPSBkYmdfaW8ubwpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL21vbWVudHVtL29jZWxvdF9jL29jZWxvdF9jX2ZwZ2EuaCBiL2FyY2gvbWlwcy9tb21lbnR1bS9vY2Vsb3RfYy9vY2Vsb3RfY19mcGdhLmgKaW5kZXggNzIyOGNkMS4uZjBmNTU4MSAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL21vbWVudHVtL29jZWxvdF9jL29jZWxvdF9jX2ZwZ2EuaAorKysgYi9hcmNoL21pcHMvbW9tZW50dW0vb2NlbG90X2Mvb2NlbG90X2NfZnBnYS5oCkBAIC01Myw3ICs1Myw5IEBACiAjZGVmaW5lIE9DRUxPVF9DX1JFR19JTlRTRVQJCTB4ZQogI2RlZmluZSBPQ0VMT1RfQ19SRUdfSU5UQ0xSCQkweGYKIAotI2RlZmluZSBPQ0VMT1RfRlBHQV9XUklURSh4LCB5KSB3cml0ZWIoeCwgT0NFTE9UX0NfQ1MwX0FERFIgKyBPQ0VMT1RfQ19SRUdfIyN5KQotI2RlZmluZSBPQ0VMT1RfRlBHQV9SRUFEKHgpIHJlYWRiKE9DRUxPVF9DX0NTMF9BRERSICsgT0NFTE9UX0NfUkVHXyMjeCkKKyNkZWZpbmUgX19GUEdBX1JFR19UT19BRERSKHJlZykJCQkJCQlcCisJKCh2b2lkICopIE9DRUxPVF9DX0NTMF9BRERSICsgT0NFTE9UX0NfUkVHXyMjcmVnKQorI2RlZmluZSBPQ0VMT1RfRlBHQV9XUklURSh4LCByZWcpIHdyaXRlYih4LCBfX0ZQR0FfUkVHX1RPX0FERFIocmVnKSkKKyNkZWZpbmUgT0NFTE9UX0ZQR0FfUkVBRChyZWcpIHJlYWRiKF9fRlBHQV9SRUdfVE9fQUREUihyZWcpKQogCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9tb21lbnR1bS9vY2Vsb3RfYy9wbGF0Zm9ybS5jIGIvYXJjaC9taXBzL21vbWVudHVtL29jZWxvdF9jL3BsYXRmb3JtLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmM0OTViMgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvbWlwcy9tb21lbnR1bS9vY2Vsb3RfYy9wbGF0Zm9ybS5jCkBAIC0wLDAgKzEsMjAxIEBACisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9pZl9ldGhlci5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L212NjQzeHguaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKworI2luY2x1ZGUgIm9jZWxvdF9jX2ZwZ2EuaCIKKworI2lmIGRlZmluZWQoQ09ORklHX01WNjQzWFhfRVRIKSB8fCBkZWZpbmVkKENPTkZJR19NVjY0M1hYX0VUSF9NT0RVTEUpCisKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgbXY2NDN4eF9ldGhfc2hhcmVkX3Jlc291cmNlc1tdID0geworCVswXSA9IHsKKwkJLm5hbWUgICA9ICJldGhlcm5ldCBzaGFyZWQgYmFzZSIsCisJCS5zdGFydCAgPSAweGYxMDAwMDAwICsgTVY2NDNYWF9FVEhfU0hBUkVEX1JFR1MsCisJCS5lbmQgICAgPSAweGYxMDAwMDAwICsgTVY2NDNYWF9FVEhfU0hBUkVEX1JFR1MgKworCQkgICAgICAgICAgICAgICAgICAgICAgIE1WNjQzWFhfRVRIX1NIQVJFRF9SRUdTX1NJWkUgLSAxLAorCQkuZmxhZ3MgID0gSU9SRVNPVVJDRV9NRU0sCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIG12NjQzeHhfZXRoX3NoYXJlZF9kZXZpY2UgPSB7CisJLm5hbWUJCT0gTVY2NDNYWF9FVEhfU0hBUkVEX05BTUUsCisJLmlkCQk9IDAsCisJLm51bV9yZXNvdXJjZXMJPSBBUlJBWV9TSVpFKG12NjQzeHhfZXRoX3NoYXJlZF9yZXNvdXJjZXMpLAorCS5yZXNvdXJjZQk9IG12NjQzeHhfZXRoX3NoYXJlZF9yZXNvdXJjZXMsCit9OworCisjZGVmaW5lIE1WX1NSQU1fQkFTRQkJCTB4ZmUwMDAwMDBVTAorI2RlZmluZSBNVl9TUkFNX1NJWkUJCQkoMjU2ICogMTAyNCkKKworI2RlZmluZSBNVl9TUkFNX1JYUklOR19TSVpFCQkoTVZfU1JBTV9TSVpFIC8gNCkKKyNkZWZpbmUgTVZfU1JBTV9UWFJJTkdfU0laRQkJKE1WX1NSQU1fU0laRSAvIDQpCisKKyNkZWZpbmUgTVZfU1JBTV9CQVNFX0VUSDAJCU1WX1NSQU1fQkFTRQorI2RlZmluZSBNVl9TUkFNX0JBU0VfRVRIMQkJKE1WX1NSQU1fQkFTRSArIChNVl9TUkFNX1NJWkUgLyAyKSkKKworI2RlZmluZSBNVjY0eDYwX0lSUV9FVEhfMCA0OAorI2RlZmluZSBNVjY0eDYwX0lSUV9FVEhfMSA0OQorCisjaWZkZWYgQ09ORklHX01WNjQzWFhfRVRIXzAKKworc3RhdGljIHN0cnVjdCByZXNvdXJjZSBtdjY0eDYwX2V0aDBfcmVzb3VyY2VzW10gPSB7CisJWzBdID0geworCQkubmFtZQk9ICJldGgwIGlycSIsCisJCS5zdGFydAk9IE1WNjR4NjBfSVJRX0VUSF8wLAorCQkuZW5kCT0gTVY2NHg2MF9JUlFfRVRIXzAsCisJCS5mbGFncwk9IElPUkVTT1VSQ0VfSVJRLAorCX0sCit9OworCitzdGF0aWMgY2hhciBldGgwX21hY19hZGRyW0VUSF9BTEVOXTsKKworc3RhdGljIHN0cnVjdCBtdjY0M3h4X2V0aF9wbGF0Zm9ybV9kYXRhIGV0aDBfcGQgPSB7CisJLm1hY19hZGRyCT0gZXRoMF9tYWNfYWRkciwKKworCS50eF9zcmFtX2FkZHIJPSBNVl9TUkFNX0JBU0VfRVRIMCwKKwkudHhfc3JhbV9zaXplCT0gTVZfU1JBTV9UWFJJTkdfU0laRSwKKwkudHhfcXVldWVfc2l6ZQk9IE1WX1NSQU1fVFhSSU5HX1NJWkUgLyAxNiwKKworCS5yeF9zcmFtX2FkZHIJPSBNVl9TUkFNX0JBU0VfRVRIMCArIE1WX1NSQU1fVFhSSU5HX1NJWkUsCisJLnJ4X3NyYW1fc2l6ZQk9IE1WX1NSQU1fUlhSSU5HX1NJWkUsCisJLnJ4X3F1ZXVlX3NpemUJPSBNVl9TUkFNX1JYUklOR19TSVpFIC8gMTYsCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBldGgwX2RldmljZSA9IHsKKwkubmFtZQkJPSBNVjY0M1hYX0VUSF9OQU1FLAorCS5pZAkJPSAwLAorCS5udW1fcmVzb3VyY2VzCT0gQVJSQVlfU0laRShtdjY0eDYwX2V0aDBfcmVzb3VyY2VzKSwKKwkucmVzb3VyY2UJPSBtdjY0eDYwX2V0aDBfcmVzb3VyY2VzLAorCS5kZXYgPSB7CisJCS5wbGF0Zm9ybV9kYXRhID0gJmV0aDBfcGQsCisJfSwKK307CisjZW5kaWYgLyogQ09ORklHX01WNjQzWFhfRVRIXzAgKi8KKworI2lmZGVmIENPTkZJR19NVjY0M1hYX0VUSF8xCisKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgbXY2NHg2MF9ldGgxX3Jlc291cmNlc1tdID0geworCVswXSA9IHsKKwkJLm5hbWUJPSAiZXRoMSBpcnEiLAorCQkuc3RhcnQJPSBNVjY0eDYwX0lSUV9FVEhfMSwKKwkJLmVuZAk9IE1WNjR4NjBfSVJRX0VUSF8xLAorCQkuZmxhZ3MJPSBJT1JFU09VUkNFX0lSUSwKKwl9LAorfTsKKworc3RhdGljIGNoYXIgZXRoMV9tYWNfYWRkcltFVEhfQUxFTl07CisKK3N0YXRpYyBzdHJ1Y3QgbXY2NDN4eF9ldGhfcGxhdGZvcm1fZGF0YSBldGgxX3BkID0geworCS5tYWNfYWRkcgk9IGV0aDFfbWFjX2FkZHIsCisKKwkudHhfc3JhbV9hZGRyCT0gTVZfU1JBTV9CQVNFX0VUSDEsCisJLnR4X3NyYW1fc2l6ZQk9IE1WX1NSQU1fVFhSSU5HX1NJWkUsCisJLnR4X3F1ZXVlX3NpemUJPSBNVl9TUkFNX1RYUklOR19TSVpFIC8gMTYsCisKKwkucnhfc3JhbV9hZGRyCT0gTVZfU1JBTV9CQVNFX0VUSDEgKyBNVl9TUkFNX1RYUklOR19TSVpFLAorCS5yeF9zcmFtX3NpemUJPSBNVl9TUkFNX1JYUklOR19TSVpFLAorCS5yeF9xdWV1ZV9zaXplCT0gTVZfU1JBTV9SWFJJTkdfU0laRSAvIDE2LAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgZXRoMV9kZXZpY2UgPSB7CisJLm5hbWUJCT0gTVY2NDNYWF9FVEhfTkFNRSwKKwkuaWQJCT0gMSwKKwkubnVtX3Jlc291cmNlcwk9IEFSUkFZX1NJWkUobXY2NHg2MF9ldGgxX3Jlc291cmNlcyksCisJLnJlc291cmNlCT0gbXY2NHg2MF9ldGgxX3Jlc291cmNlcywKKwkuZGV2ID0geworCQkucGxhdGZvcm1fZGF0YSA9ICZldGgxX3BkLAorCX0sCit9OworI2VuZGlmIC8qIENPTkZJR19NVjY0M1hYX0VUSF8xICovCisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICptdjY0M3h4X2V0aF9wZF9kZXZzW10gX19pbml0ZGF0YSA9IHsKKwkmbXY2NDN4eF9ldGhfc2hhcmVkX2RldmljZSwKKyNpZmRlZiBDT05GSUdfTVY2NDNYWF9FVEhfMAorCSZldGgwX2RldmljZSwKKyNlbmRpZgorI2lmZGVmIENPTkZJR19NVjY0M1hYX0VUSF8xCisJJmV0aDFfZGV2aWNlLAorI2VuZGlmCisJLyogVGhlIHRoaXJkIHBvcnQgaXMgbm90IHdpcmVkIHVwIG9uIHRoZSBPY2Vsb3QgQyAqLworfTsKKworc3RhdGljIHU4IF9faW5pdCBleGNoYW5nZV9iaXQodTggdmFsLCB1OCBjcykKK3sKKwkvKiBwbGFjZSB0aGUgZGF0YSAqLworCU9DRUxPVF9GUEdBX1dSSVRFKCh2YWwgPDwgMikgfCBjcywgRUVQUk9NX01PREUpOworCXVkZWxheSgxKTsKKworCS8qIHR1cm4gdGhlIGNsb2NrIG9uICovCisJT0NFTE9UX0ZQR0FfV1JJVEUoKHZhbCA8PCAyKSB8IGNzIHwgMHgyLCBFRVBST01fTU9ERSk7CisJdWRlbGF5KDEpOworCisJLyogdHVybiB0aGUgY2xvY2sgb2ZmIGFuZCByZWFkLXN0cm9iZSAqLworCU9DRUxPVF9GUEdBX1dSSVRFKCh2YWwgPDwgMikgfCBjcyB8IDB4MTAsIEVFUFJPTV9NT0RFKTsKKworCS8qIHJldHVybiB0aGUgZGF0YSAqLworCXJldHVybiAoT0NFTE9UX0ZQR0FfUkVBRChFRVBST01fTU9ERSkgPj4gMykgJiAweDE7Cit9CisKK3N0YXRpYyB2b2lkIF9faW5pdCBnZXRfbWFjKGNoYXIgZGVzdFs2XSkKK3sKKwl1OCByZWFkX29wY29kZVsxMl0gPSB7MSwgMSwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMH07CisJaW50IGksajsKKworCWZvciAoaSA9IDA7IGkgPCAxMjsgaSsrKQorCQlleGNoYW5nZV9iaXQocmVhZF9vcGNvZGVbaV0sIDEpOworCisJZm9yIChqID0gMDsgaiA8IDY7IGorKykgeworCQlkZXN0W2pdID0gMDsKKwkJZm9yIChpID0gMDsgaSA8IDg7IGkrKykgeworCQkJZGVzdFtqXSA8PD0gMTsKKwkJCWRlc3Rbal0gfD0gZXhjaGFuZ2VfYml0KDAsIDEpOworCQl9CisJfQorCisJLyogdHVybiBvZmYgQ1MgKi8KKwlleGNoYW5nZV9iaXQoMCwwKTsKK30KKworLyoKKyAqIENvcHkgYW5kIGluY3JlbWVudCBldGhlcm5ldCBNQUMgYWRkcmVzcyBieSBhIHNtYWxsIHZhbHVlLgorICoKKyAqIFRoaXMgaXMgdXNlZnVsIGZvciBzeXN0ZW1zIHdoZXJlIHRoZSBvbmx5IG9uZSBNQUMgYWRkcmVzcyBpcyBzdG9yZWQgaW4KKyAqIG5vbi12b2xhdGlsZSBtZW1vcnkgZm9yIG11bHRpcGxlIHBvcnRzLgorICovCitzdGF0aWMgaW5saW5lIHZvaWQgZXRoX21hY19hZGQodW5zaWduZWQgY2hhciAqZHN0LCB1bnNpZ25lZCBjaGFyICpzcmMsCisJdW5zaWduZWQgaW50IGFkZCkKK3sKKwlpbnQgaTsKKworCUJVR19PTihhZGQgPj0gMjU2KTsKKworCWZvciAoaSA9IEVUSF9BTEVOOyBpID49IDA7IGktLSkgeworCQlkc3RbaV0gPSBzcmNbaV0gKyBhZGQ7CisJCWFkZCA9IGRzdFtpXSA8IHNyY1tpXTsJCS8qIGNvbXB1dGUgY2FycnkgKi8KKwl9CisKKwlXQVJOX09OKGFkZCk7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IG12NjQzeHhfZXRoX2FkZF9wZHModm9pZCkKK3sKKwl1bnNpZ25lZCBjaGFyIG1hY1tFVEhfQUxFTl07CisJaW50IHJldDsKKworCWdldF9tYWMobWFjKTsKKyNpZmRlZiBDT05GSUdfTVY2NDNYWF9FVEhfMAorCWV0aF9tYWNfYWRkKGV0aDFfbWFjX2FkZHIsIG1hYywgMCk7CisjZW5kaWYKKyNpZmRlZiBDT05GSUdfTVY2NDNYWF9FVEhfMQorCWV0aF9tYWNfYWRkKGV0aDFfbWFjX2FkZHIsIG1hYywgMSk7CisjZW5kaWYKKwlyZXQgPSBwbGF0Zm9ybV9hZGRfZGV2aWNlcyhtdjY0M3h4X2V0aF9wZF9kZXZzLAorCQkJQVJSQVlfU0laRShtdjY0M3h4X2V0aF9wZF9kZXZzKSk7CisKKwlyZXR1cm4gcmV0OworfQorCitkZXZpY2VfaW5pdGNhbGwobXY2NDN4eF9ldGhfYWRkX3Bkcyk7CisKKyNlbmRpZiAvKiBkZWZpbmVkKENPTkZJR19NVjY0M1hYX0VUSCkgfHwgZGVmaW5lZChDT05GSUdfTVY2NDNYWF9FVEhfTU9EVUxFKSAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL21vbWVudHVtL29jZWxvdF9jL3Byb20uYyBiL2FyY2gvbWlwcy9tb21lbnR1bS9vY2Vsb3RfYy9wcm9tLmMKaW5kZXggNGM1MGExNC4uZDBiNzdlMSAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL21vbWVudHVtL29jZWxvdF9jL3Byb20uYworKysgYi9hcmNoL21pcHMvbW9tZW50dW0vb2NlbG90X2MvcHJvbS5jCkBAIC0yOSwxMSArMjksNyBAQAogc3RydWN0IGNhbGx2ZWN0b3JzKiBkZWJ1Z192ZWN0b3JzOwogCiBleHRlcm4gdW5zaWduZWQgbG9uZyBtYXJ2ZWxsX2Jhc2U7Ci1leHRlcm4gdW5zaWduZWQgbG9uZyBjcHVfY2xvY2s7Ci0KLSNpZmRlZiBDT05GSUdfTVY2NDNYWF9FVEgKLWV4dGVybiB1bnNpZ25lZCBjaGFyIHByb21fbWFjX2FkZHJfYmFzZVs2XTsKLSNlbmRpZgorZXh0ZXJuIHVuc2lnbmVkIGludCBjcHVfY2xvY2s7CiAKIGNvbnN0IGNoYXIgKmdldF9zeXN0ZW1fdHlwZSh2b2lkKQogewpAQCAtNDQsNTUgKzQwLDYgQEAKICNlbmRpZgogfQogCi0jaWZkZWYgQ09ORklHX01WNjQzWFhfRVRICi1zdGF0aWMgdm9pZCBidXJuX2Nsb2Nrcyh2b2lkKQotewotCWludCBpOwotCi0JLyogdGhpcyBsb29wIHNob3VsZCBidXJuIGF0IGxlYXN0IDF1cyAtLSB0aGlzIHNob3VsZCBiZSBwbGVudHkgKi8KLQlmb3IgKGkgPSAwOyBpIDwgMHgxMDAwMDsgaSsrKQotCQk7Ci19Ci0KLXN0YXRpYyB1OCBleGNoYW5nZV9iaXQodTggdmFsLCB1OCBjcykKLXsKLQkvKiBwbGFjZSB0aGUgZGF0YSAqLwotCU9DRUxPVF9GUEdBX1dSSVRFKCh2YWwgPDwgMikgfCBjcywgRUVQUk9NX01PREUpOwotCWJ1cm5fY2xvY2tzKCk7Ci0KLQkvKiB0dXJuIHRoZSBjbG9jayBvbiAqLwotCU9DRUxPVF9GUEdBX1dSSVRFKCh2YWwgPDwgMikgfCBjcyB8IDB4MiwgRUVQUk9NX01PREUpOwotCWJ1cm5fY2xvY2tzKCk7Ci0KLQkvKiB0dXJuIHRoZSBjbG9jayBvZmYgYW5kIHJlYWQtc3Ryb2JlICovCi0JT0NFTE9UX0ZQR0FfV1JJVEUoKHZhbCA8PCAyKSB8IGNzIHwgMHgxMCwgRUVQUk9NX01PREUpOwotCi0JLyogcmV0dXJuIHRoZSBkYXRhICovCi0JcmV0dXJuICgoT0NFTE9UX0ZQR0FfUkVBRChFRVBST01fTU9ERSkgPj4gMykgJiAweDEpOwotfQotCi12b2lkIGdldF9tYWMoY2hhciBkZXN0WzZdKQotewotCXU4IHJlYWRfb3Bjb2RlWzEyXSA9IHsxLCAxLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwfTsKLQlpbnQgaSxqOwotCi0JZm9yIChpID0gMDsgaSA8IDEyOyBpKyspCi0JCWV4Y2hhbmdlX2JpdChyZWFkX29wY29kZVtpXSwgMSk7Ci0KLQlmb3IgKGogPSAwOyBqIDwgNjsgaisrKSB7Ci0JCWRlc3Rbal0gPSAwOwotCQlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKSB7Ci0JCQlkZXN0W2pdIDw8PSAxOwotCQkJZGVzdFtqXSB8PSBleGNoYW5nZV9iaXQoMCwgMSk7Ci0JCX0KLQl9Ci0KLQkvKiB0dXJuIG9mZiBDUyAqLwotCWV4Y2hhbmdlX2JpdCgwLDApOwotfQotI2VuZGlmCi0KLQogI2lmZGVmIENPTkZJR182NEJJVAogCiB1bnNpZ25lZCBsb25nIHNpZ25leHQodW5zaWduZWQgbG9uZyBhZGRyKQpAQCAtMjI2LDExICsxNzMsNiBAQAogCW1pcHNfbWFjaGdyb3VwID0gTUFDSF9HUk9VUF9NT01FTkNPOwogCW1pcHNfbWFjaHR5cGUgPSBNQUNIX01PTUVOQ09fT0NFTE9UX0M7CiAKLSNpZmRlZiBDT05GSUdfTVY2NDNYWF9FVEgKLQkvKiBnZXQgdGhlIGJhc2UgTUFDIGFkZHJlc3MgZm9yIG9uLWJvYXJkIGV0aGVybmV0IHBvcnRzICovCi0JZ2V0X21hYyhwcm9tX21hY19hZGRyX2Jhc2UpOwotI2VuZGlmCi0KICNpZm5kZWYgQ09ORklHXzY0QklUCiAJZGVidWdfdmVjdG9ycy0+cHJpbnRmKCJCb290aW5nIExpbnV4IGtlcm5lbC4uLlxuIik7CiAjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9tb21lbnR1bS9vY2Vsb3RfYy9zZXR1cC5jIGIvYXJjaC9taXBzL21vbWVudHVtL29jZWxvdF9jL3NldHVwLmMKaW5kZXggOWMwYzQ2Mi4uMGI2YjIzMyAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL21vbWVudHVtL29jZWxvdF9jL3NldHVwLmMKKysrIGIvYXJjaC9taXBzL21vbWVudHVtL29jZWxvdF9jL3NldHVwLmMKQEAgLTY5LDggKzY5LDcgQEAKICNpbmNsdWRlICJvY2Vsb3RfY19mcGdhLmgiCiAKIHVuc2lnbmVkIGxvbmcgbWFydmVsbF9iYXNlOwotZXh0ZXJuIHVuc2lnbmVkIGxvbmcgbXY2NDM0MF9zcmFtX2Jhc2U7Ci11bnNpZ25lZCBsb25nIGNwdV9jbG9jazsKK3Vuc2lnbmVkIGludCBjcHVfY2xvY2s7CiAKIC8qIFRoZXNlIGZ1bmN0aW9ucyBhcmUgdXNlZCBmb3IgcmVib290aW5nIG9yIGhhbHRpbmcgdGhlIG1hY2hpbmUqLwogZXh0ZXJuIHZvaWQgbW9tZW5jb19vY2Vsb3RfcmVzdGFydChjaGFyICpjb21tYW5kKTsKQEAgLTExOSw3ICsxMTgsNiBAQAogCWFkZF93aXJlZF9lbnRyeShFTlRSWUxPKDB4ZmUwMDAwMDApLCBFTlRSWUxPKDB4ZmYwMDAwMDApLCAweGZmZmZmZmZmZmUwMDAwMDAsIFBNXzE2TSk7CiAKIAltYXJ2ZWxsX2Jhc2UgPSAweGZmZmZmZmZmZjQwMDAwMDA7Ci0JbXY2NDM0MF9zcmFtX2Jhc2UgPSAweGZmZmZmZmZmZmUwMDAwMDA7CiAjZWxzZQogCS8qIG1hcnZlbGwgYW5kIGV4dHJhIHNwYWNlICovCiAJYWRkX3dpcmVkX2VudHJ5KEVOVFJZTE8oMHhmNDAwMDAwMCksIEVOVFJZTE8oMHhmNDAxMDAwMCksIDB4ZjQwMDAwMDAsIFBNXzY0Syk7CkBAIC0xMjksNyArMTI3LDYgQEAKIAlhZGRfd2lyZWRfZW50cnkoRU5UUllMTygweGZlMDAwMDAwKSwgRU5UUllMTygweGZmMDAwMDAwKSwgMHhmZTAwMDAwMCwgUE1fMTZNKTsKIAogCW1hcnZlbGxfYmFzZSA9IDB4ZjQwMDAwMDA7Ci0JbXY2NDM0MF9zcmFtX2Jhc2UgPSAweGZlMDAwMDAwOwogI2VuZGlmCiB9CiAKQEAgLTM0NiwyMiArMzQzLDIwIEBACiAJfQogfQogCi0jaWZuZGVmIENPTkZJR182NEJJVAotLyogVGhpcyBuZWVkcyB0byBiZSBvbmUgb2YgdGhlIGZpcnN0IGluaXRjYWxscywgYmVjYXVzZSBubyBJL08gcG9ydCBhY2Nlc3MKLSAgIGNhbiB3b3JrIGJlZm9yZSB0aGlzICovCisvKgorICogVGhpcyBuZWVkcyB0byBiZSBvbmUgb2YgdGhlIGZpcnN0IGluaXRjYWxscywgYmVjYXVzZSBubyBJL08gcG9ydCBhY2Nlc3MKKyAqIGNhbiB3b3JrIGJlZm9yZSB0aGlzCisgKi8KIHN0YXRpYyBpbnQgaW9fYmFzZV9pb3JlbWFwKHZvaWQpCiB7Ci0JLyogd2UncmUgbWFwcGluZyBQQ0kgYWNjZXNzZXMgZnJvbSAweGMwMDAwMDAwIHRvIDB4ZjAwMDAwMDAgKi8KLQl2b2lkICppb19yZW1hcF9yYW5nZSA9IGlvcmVtYXAoMHhjMDAwMDAwMCwgMHgzMDAwMDAwMCk7CisJdm9pZCBfX2lvbWVtICogaW9fcmVtYXBfcmFuZ2UgPSBpb3JlbWFwKDB4YzAwMDAwMDBVTCwgMHgxMDAwMCk7CiAKLQlpZiAoIWlvX3JlbWFwX3JhbmdlKSB7CisJaWYgKCFpb19yZW1hcF9yYW5nZSkKIAkJcGFuaWMoIkNvdWxkIG5vdCBpb3JlbWFwIEkvTyBwb3J0IHJhbmdlIik7Ci0JfQotCXByaW50aygiaW9fcmVtYXBfcmFuZ2Ugc2V0IGF0IDB4JTA4eFxuIiwgKHVpbnQzMl90KWlvX3JlbWFwX3JhbmdlKTsKLQlzZXRfaW9fcG9ydF9iYXNlKGlvX3JlbWFwX3JhbmdlIC0gMHhjMDAwMDAwMCk7CisKKwlzZXRfaW9fcG9ydF9iYXNlKCh1bnNpZ25lZCBsb25nKSBpb19yZW1hcF9yYW5nZSk7CiAKIAlyZXR1cm4gMDsKIH0KIAogbW9kdWxlX2luaXQoaW9fYmFzZV9pb3JlbWFwKTsKLSNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL21vbWVudHVtL29jZWxvdF9nL2d0LWlycS5jIGIvYXJjaC9taXBzL21vbWVudHVtL29jZWxvdF9nL2d0LWlycS5jCmluZGV4IDdiNWNjNjYuLmU1NTc2YmQgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9tb21lbnR1bS9vY2Vsb3RfZy9ndC1pcnEuYworKysgYi9hcmNoL21pcHMvbW9tZW50dW0vb2NlbG90X2cvZ3QtaXJxLmMKQEAgLTI3LDcgKzI3LDcgQEAKICAqIGJlIGhhbmRsZWQgYW5kIGFjaydlZCBkaWZmZXJlbnRseSB0aGFuIG90aGVyIE1JUFMgaW50ZXJydXB0cy4KICAqLwogCi0jaWYgQ1VSUkVOVExZX1VOVVNFRAorI2lmIDAKIAogc3RydWN0IHRxX3N0cnVjdCBpcnFfaGFuZGxlcnNbTUFYX0NBVVNFX1JFR1NdW01BWF9DQVVTRV9SRUdfV0lEVEhdOwogdm9pZCBob29rX2lycV9oYW5kbGVyKGludCBpbnRfY2F1c2UsIGludCBiaXRfbnVtLCB2b2lkICppc3JfcHRyKTsKQEAgLTk1LDcgKzk1LDcgQEAKIAkJcmV0dXJuIDA7CiAJcmV0dXJuIDE7CiB9Ci0jZW5kaWYJCQkJLyogIFVOVVNFRCAgKi8KKyNlbmRpZiAvKiAwICovCiAKIC8qCiAgKiBJbnRlcnJ1cHQgaGFuZGxlciBmb3IgaW50ZXJydXB0cyBjb21pbmcgZnJvbSB0aGUgR2FsaWxlbyBjaGlwIHZpYSBQMF9JTlQjLgpAQCAtMTk2LDcgKzE5Niw3IEBACiAKIHZvaWQgZ3Q2NDI0MF9pcnFfaW5pdCh2b2lkKQogewotI2lmIENVUlJFTlRMWV9VTlVTRUQKKyNpZiAwCiAJaW50IGksIGo7CiAKIAkvKiBSZXNldCBpcnEgaGFuZGxlcnMgcG9pbnRlcnMgdG8gTlVMTCAqLwpAQCAtMjA4LDUgKzIwOCw1IEBACiAJCQlpcnFfaGFuZGxlcnNbaV1bal0uZGF0YSA9IE5VTEw7CiAJCX0KIAl9Ci0jZW5kaWYKKyNlbmRpZiAvKiAwICovCiB9CmRpZmYgLS1naXQgYS9hcmNoL21pcHMvbW9tZW50dW0vb2NlbG90X2cvb2NlbG90X3BsZC5oIGIvYXJjaC9taXBzL21vbWVudHVtL29jZWxvdF9nL29jZWxvdF9wbGQuaAppbmRleCBmY2I4Mjc1Li45NWUwNTM0IDEwMDY0NAotLS0gYS9hcmNoL21pcHMvbW9tZW50dW0vb2NlbG90X2cvb2NlbG90X3BsZC5oCisrKyBiL2FyY2gvbWlwcy9tb21lbnR1bS9vY2Vsb3RfZy9vY2Vsb3RfcGxkLmgKQEAgLTIzLDggKzIzLDggQEAKICNkZWZpbmUgT0NFTE9UX1JFR19JTlRTRVQgKDEyKQogI2RlZmluZSBPQ0VMT1RfUkVHX0lOVENMUiAoMTMpCiAKLSNkZWZpbmUgT0NFTE9UX1BMRF9XUklURSh4LCB5KSB3cml0ZWIoeCwgT0NFTE9UX0NTMF9BRERSICsgT0NFTE9UX1JFR18jI3kpCi0jZGVmaW5lIE9DRUxPVF9QTERfUkVBRCh4KSByZWFkYihPQ0VMT1RfQ1MwX0FERFIgKyBPQ0VMT1RfUkVHXyMjeCkKLQorI2RlZmluZSBfX1BMRF9SRUdfVE9fQUREUihyZWcpICgodm9pZCAqKSBPQ0VMT1RfQ1MwX0FERFIgKyBPQ0VMT1RfUkVHXyMjcmVnKQorI2RlZmluZSBPQ0VMT1RfUExEX1dSSVRFKHgsIHJlZykgd3JpdGViKHgsIF9fUExEX1JFR19UT19BRERSKHJlZykpCisjZGVmaW5lIE9DRUxPVF9QTERfUkVBRChyZWcpIHJlYWRiKF9fUExEX1JFR19UT19BRERSKHJlZykpCiAKICNlbmRpZiAvKiBfX01PTUVOQ09fT0NFTE9UX1BMRF9IX18gKi8KZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9tb21lbnR1bS9vY2Vsb3RfZy9zZXR1cC5jIGIvYXJjaC9taXBzL21vbWVudHVtL29jZWxvdF9nL3NldHVwLmMKaW5kZXggNTZlYzQ3MC4uZDI4OGY3YiAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL21vbWVudHVtL29jZWxvdF9nL3NldHVwLmMKKysrIGIvYXJjaC9taXBzL21vbWVudHVtL29jZWxvdF9nL3NldHVwLmMKQEAgLTU3LDYgKzU3LDcgQEAKICNpbmNsdWRlIDxhc20vZ3Q2NDI0MC5oPgogI2luY2x1ZGUgPGFzbS9pcnEuaD4KICNpbmNsdWRlIDxhc20vcGNpLmg+CisjaW5jbHVkZSA8YXNtL3BndGFibGUuaD4KICNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLmg+CiAjaW5jbHVkZSA8YXNtL3JlYm9vdC5oPgogI2luY2x1ZGUgPGxpbnV4L2Jvb3RtZW0uaD4KQEAgLTE2MCw2ICsxNjEsMTAgQEAKIAlwcmludGsoIkRvbmVcbiIpOwogfQogCit2b2lkIF9faW5pdCBwbGF0X3RpbWVyX3NldHVwKHN0cnVjdCBpcnFhY3Rpb24gKmlycSkKK3sKK30KKwogdm9pZCBfX2luaXQgcGxhdF9tZW1fc2V0dXAodm9pZCkKIHsKIAl2b2lkICgqbDNmdW5jKSh1bnNpZ25lZCBsb25nKSA9ICh2b2lkICopIEtTRUcxQUREUihzZXR1cF9sM2NhY2hlKTsKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9vcHJvZmlsZS9vcF9pbXBsLmggYi9hcmNoL21pcHMvb3Byb2ZpbGUvb3BfaW1wbC5oCmluZGV4IDM1NGU1NDQuLmZhNmI0YWEgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9vcHJvZmlsZS9vcF9pbXBsLmgKKysrIGIvYXJjaC9taXBzL29wcm9maWxlL29wX2ltcGwuaApAQCAtMTAsOCArMTAsNiBAQAogI2lmbmRlZiBPUF9JTVBMX0gKICNkZWZpbmUgT1BfSU1QTF9IIDEKIAotc3RydWN0IHB0X3JlZ3M7Ci0KIGV4dGVybiBpbnQgbnVsbF9wZXJmX2lycSh2b2lkKTsKIGV4dGVybiBpbnQgKCpwZXJmX2lycSkodm9pZCk7CiAKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9vcHJvZmlsZS9vcF9tb2RlbF9taXBzeHguYyBiL2FyY2gvbWlwcy9vcHJvZmlsZS9vcF9tb2RlbF9taXBzeHguYwppbmRleCBkZDBhZWM5Li4xZmIyNDBjIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvb3Byb2ZpbGUvb3BfbW9kZWxfbWlwc3h4LmMKKysrIGIvYXJjaC9taXBzL29wcm9maWxlL29wX21vZGVsX21pcHN4eC5jCkBAIC0zMSwxNiArMzEsMTggQEAKICNkZWZpbmUgTV9DT1VOVEVSX09WRVJGTE9XCQkoMVVMICAgICAgPDwgMzEpCiAKICNpZmRlZiBDT05GSUdfTUlQU19NVF9TTVAKLSNkZWZpbmUgV0hBVAkoTV9UQ19FTl9WUEUgfCBNX1BFUkZDVExfVlBFSUQoc21wX3Byb2Nlc3Nvcl9pZCgpKSkKKyNkZWZpbmUgV0hBVAkJKE1fVENfRU5fVlBFIHwgTV9QRVJGQ1RMX1ZQRUlEKHNtcF9wcm9jZXNzb3JfaWQoKSkpCisjZGVmaW5lIHZwZV9pZCgpCXNtcF9wcm9jZXNzb3JfaWQoKQogI2Vsc2UKLSNkZWZpbmUgV0hBVAkwCisjZGVmaW5lIFdIQVQJCTAKKyNkZWZpbmUgdnBlX2lkKCkJc21wX3Byb2Nlc3Nvcl9pZCgpCiAjZW5kaWYKIAogI2RlZmluZSBfX2RlZmluZV9wZXJmX2FjY2Vzc29ycyhyLCBuLCBucCkJCQkJXAogCQkJCQkJCQkJXAogc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgcl9jMF8gIyMgciAjIyBuKHZvaWQpCQkJXAogewkJCQkJCQkJCVwKLQl1bnNpZ25lZCBpbnQgY3B1ID0gc21wX3Byb2Nlc3Nvcl9pZCgpOwkJCQlcCisJdW5zaWduZWQgaW50IGNwdSA9IHZwZV9pZCgpOwkJCQkJXAogCQkJCQkJCQkJXAogCXN3aXRjaCAoY3B1KSB7CQkJCQkJCVwKIAljYXNlIDA6CQkJCQkJCQlcCkBAIC01NSw3ICs1Nyw3IEBACiAJCQkJCQkJCQlcCiBzdGF0aWMgaW5saW5lIHZvaWQgd19jMF8gIyMgciAjIyBuKHVuc2lnbmVkIGludCB2YWx1ZSkJCQlcCiB7CQkJCQkJCQkJXAotCXVuc2lnbmVkIGludCBjcHUgPSBzbXBfcHJvY2Vzc29yX2lkKCk7CQkJCVwKKwl1bnNpZ25lZCBpbnQgY3B1ID0gdnBlX2lkKCk7CQkJCQlcCiAJCQkJCQkJCQlcCiAJc3dpdGNoIChjcHUpIHsJCQkJCQkJXAogCWNhc2UgMDoJCQkJCQkJCVwKQEAgLTIxOCw3ICsyMjAsNyBAQAogewogCWludCBjb3VudGVycyA9IF9fbl9jb3VudGVycygpOwogCi0jaWZuZGVmIENPTkZJR19TTVAKKyNpZmRlZiBDT05GSUdfTUlQU19NVF9TTVAKIAlpZiAoY3VycmVudF9jcHVfZGF0YS5jcHV0eXBlID09IENQVV8zNEspCiAJCXJldHVybiBjb3VudGVycyA+PiAxOwogI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvb3Byb2ZpbGUvb3BfbW9kZWxfcm05MDAwLmMgYi9hcmNoL21pcHMvb3Byb2ZpbGUvb3BfbW9kZWxfcm05MDAwLmMKaW5kZXggYjcwNjNmZS4uN2RjOWJmNiAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL29wcm9maWxlL29wX21vZGVsX3JtOTAwMC5jCisrKyBiL2FyY2gvbWlwcy9vcHJvZmlsZS9vcF9tb2RlbF9ybTkwMDAuYwpAQCAtODAsOCArODAsNyBAQAogCXdyaXRlX2MwX3BlcmZjb250cm9sKDApOwogfQogCi1zdGF0aWMgaXJxcmV0dXJuX3Qgcm05MDAwX3BlcmZjb3VudF9oYW5kbGVyKGludCBpcnEsIHZvaWQgKiBkZXZfaWQsCi0Jc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCitzdGF0aWMgaXJxcmV0dXJuX3Qgcm05MDAwX3BlcmZjb3VudF9oYW5kbGVyKGludCBpcnEsIHZvaWQgKiBkZXZfaWQpCiB7CiAJdW5zaWduZWQgaW50IGNvbnRyb2wgPSByZWFkX2MwX3BlcmZjb250cm9sKCk7CiAJdWludDMyX3QgY291bnRlcjEsIGNvdW50ZXIyOwpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL3BjaS9NYWtlZmlsZSBiL2FyY2gvbWlwcy9wY2kvTWFrZWZpbGUKaW5kZXggM2NmMGRkNC4uNzBjYjU1YiAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL3BjaS9NYWtlZmlsZQorKysgYi9hcmNoL21pcHMvcGNpL01ha2VmaWxlCkBAIC0yNiw3ICsyNiw3IEBACiBvYmotJChDT05GSUdfTEFTQVQpCQkrPSBwY2ktbGFzYXQubwogb2JqLSQoQ09ORklHX01JUFNfQVRMQVMpCSs9IGZpeHVwLWF0bGFzLm8KIG9iai0kKENPTkZJR19NSVBTX0NPQkFMVCkJKz0gZml4dXAtY29iYWx0Lm8KLW9iai0kKENPTkZJR19NSVBTX0VWNjQxMjApCSs9IGZpeHVwLWV2NjQxMjAubworb2JqLSQoQ09ORklHX01JUFNfRVY2NDEyMCkJKz0gcGNpLWV2NjQxMjAubwogb2JqLSQoQ09ORklHX1NPQ19BVTE1MDApCSs9IGZpeHVwLWF1MTAwMC5vIG9wcy1hdTEwMDAubwogb2JqLSQoQ09ORklHX1NPQ19BVTE1NTApCSs9IGZpeHVwLWF1MTAwMC5vIG9wcy1hdTEwMDAubwogb2JqLSQoQ09ORklHX1NPQ19QTlg4NTUwKQkrPSBmaXh1cC1wbng4NTUwLm8gb3BzLXBueDg1NTAubwpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL3BjaS9maXh1cC1ldjY0MTIwLmMgYi9hcmNoL21pcHMvcGNpL2ZpeHVwLWV2NjQxMjAuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGRiYjkwZC4uMDAwMDAwMAotLS0gYS9hcmNoL21pcHMvcGNpL2ZpeHVwLWV2NjQxMjAuYworKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLSNpbmNsdWRlIDxsaW51eC9wY2kuaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0KLWludCBwY2lfcmFuZ2VfY2sodW5zaWduZWQgY2hhciBidXMsIHVuc2lnbmVkIGNoYXIgZGV2KQotewotCWlmICgoKGJ1cyA9PSAwKSB8fCAoYnVzID09IDEpKSAmJiAoZGV2ID49IDYpICYmIChkZXYgPD0gOCkpCi0JCXJldHVybiAwOwotCi0JcmV0dXJuIC0xOwotfQotCi0vKgotICogQWZ0ZXIgZGV0ZWN0aW5nIGFsbCBhZ2VudHMgb3ZlciB0aGUgUENJICwgdGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQKLSAqIGluIG9yZGVyIHRvIGdpdmUgYW4gaW50ZXJydXB0IG51bWJlciBmb3IgZWFjaCBQQ0kgZGV2aWNlIHN0YXJ0aW5nCi0gKiBmcm9tIElSUSAyMC4gSXQgZG9lcyBhbHNvIGVuYWJsZXMgbWFzdGVyIGZvciBlYWNoIGRldmljZS4KLSAqLwotdm9pZCBfX2RldmluaXQgcGNpYmlvc19maXh1cF9idXMoc3RydWN0IHBjaV9idXMgKmJ1cykKLXsKLQl1bnNpZ25lZCBpbnQgaXJxID0gMjA7Ci0Jc3RydWN0IHBjaV9idXMgKmN1cnJlbnRfYnVzID0gYnVzOwotCXN0cnVjdCBwY2lfZGV2ICpkZXY7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqZGV2aWNlc19saW5rOwotCi0JbGlzdF9mb3JfZWFjaChkZXZpY2VzX2xpbmssICYoY3VycmVudF9idXMtPmRldmljZXMpKSB7Ci0JCWRldiA9IHBjaV9kZXZfYihkZXZpY2VzX2xpbmspOwotCQlpZiAoZGV2ICE9IE5VTEwpIHsKLQkJCWRldi0+aXJxID0gaXJxKys7Ci0KLQkJCS8qIEFzc2lnbiBhbiBpbnRlcnJ1cHQgbnVtYmVyIGZvciB0aGUgZGV2aWNlICovCi0JCQlwY2lfd3JpdGVfY29uZmlnX2J5dGUoZGV2LCBQQ0lfSU5URVJSVVBUX0xJTkUsIGlycSk7Ci0JCQlwY2liaW9zX3NldF9tYXN0ZXIoZGV2KTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9wY2kvcGNpLWV2NjQxMjAuYyBiL2FyY2gvbWlwcy9wY2kvcGNpLWV2NjQxMjAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45Y2Q4NTllCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9taXBzL3BjaS9wY2ktZXY2NDEyMC5jCkBAIC0wLDAgKzEsMjEgQEAKKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKworaW50IF9faW5pdCBwY2liaW9zX21hcF9pcnEoc3RydWN0IHBjaV9kZXYgKmRldiwgdTggc2xvdCwgdTggcGluKQoreworCWludCBpcnE7CisKKwlpZiAoIXBpbikKKwkJcmV0dXJuIDA7CisKKwlpcnEgPSBhbGxvY2F0ZV9pcnFubygpOworCWlmIChpcnEgPCAwKQorCQlyZXR1cm4gMDsKKworCXJldHVybiBpcnE7Cit9CisKKy8qIERvIHBsYXRmb3JtIHNwZWNpZmljIGRldmljZSBpbml0aWFsaXphdGlvbiBhdCBwY2lfZW5hYmxlX2RldmljZSgpIHRpbWUgKi8KK2ludCBwY2liaW9zX3BsYXRfZGV2X2luaXQoc3RydWN0IHBjaV9kZXYgKmRldikKK3sKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9waGlsaXBzL3BueDg1NTAvY29tbW9uL3RpbWUuYyBiL2FyY2gvbWlwcy9waGlsaXBzL3BueDg1NTAvY29tbW9uL3RpbWUuYwppbmRleCAwYWY2NTViLi42NWM0NDBlIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvcGhpbGlwcy9wbng4NTUwL2NvbW1vbi90aW1lLmMKKysrIGIvYXJjaC9taXBzL3BoaWxpcHMvcG54ODU1MC9jb21tb24vdGltZS5jCkBAIC00MSw4ICs0MSw4IEBACiAgKiAxKSBib2FyZF90aW1lX2luaXQoKSAtCiAgKiAJYSkgKG9wdGlvbmFsKSBzZXQgdXAgUlRDIHJvdXRpbmVzLAogICogICAgICBiKSAob3B0aW9uYWwpIGNhbGlicmF0ZSBhbmQgc2V0IHRoZSBtaXBzX2hwdF9mcmVxdWVuY3kKLSAqCSAgICAob25seSBuZWVkZWQgaWYgeW91IGludGVuZGVkIHRvIHVzZSBmaXhlZF9yYXRlX2dldHRpbWVvZmZzZXQKLSAqCSAgICAgb3IgdXNlIGNwdSBjb3VudGVyIGFzIHRpbWVyIGludGVycnVwdCBzb3VyY2UpCisgKgkgICAgKG9ubHkgbmVlZGVkIGlmIHlvdSBpbnRlbmRlZCB0byB1c2UgY3B1IGNvdW50ZXIgYXMgdGltZXIgaW50ZXJydXB0CisgKgkgICAgIHNvdXJjZSkKICAqLwogCiB2b2lkIHBueDg1NTBfdGltZV9pbml0KHZvaWQpCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvcG1jLXNpZXJyYS95b3NlbWl0ZS9pMmMteW9zZW1pdGUuYyBiL2FyY2gvbWlwcy9wbWMtc2llcnJhL3lvc2VtaXRlL2kyYy15b3NlbWl0ZS5jCmluZGV4IDQxNmRhMjIuLjg1YjE0YzcgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9wbWMtc2llcnJhL3lvc2VtaXRlL2kyYy15b3NlbWl0ZS5jCisrKyBiL2FyY2gvbWlwcy9wbWMtc2llcnJhL3lvc2VtaXRlL2kyYy15b3NlbWl0ZS5jCkBAIC03NCw3ICs3NCw3IEBACiBpbnQgdGl0YW5faTJjX3hmZXIodW5zaWduZWQgaW50IHNsYXZlX2FkZHIsIHRpdGFuX2kyY19jb21tYW5kICogY21kLAogCQkgICBpbnQgc2l6ZSwgdW5zaWduZWQgaW50ICphZGRyKQogewotCWludCBsb29wID0gMCwgYnl0ZXMsIGk7CisJaW50IGxvb3AsIGJ5dGVzID0gMCwgaTsKIAl1bnNpZ25lZCBpbnQgKndyaXRlX2RhdGEsIGRhdGEsICpyZWFkX2RhdGE7CiAJdW5zaWduZWQgbG9uZyByZWdfdmFsLCB2YWw7CiAKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9wbWMtc2llcnJhL3lvc2VtaXRlL3NtcC5jIGIvYXJjaC9taXBzL3BtYy1zaWVycmEveW9zZW1pdGUvc21wLmMKaW5kZXggNjVmYTNhMi4uM2NjMDQzNiAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL3BtYy1zaWVycmEveW9zZW1pdGUvc21wLmMKKysrIGIvYXJjaC9taXBzL3BtYy1zaWVycmEveW9zZW1pdGUvc21wLmMKQEAgLTMsOSArMyw3IEBACiAKICNpbmNsdWRlIDxhc20vcG1vbi5oPgogI2luY2x1ZGUgPGFzbS90aXRhbl9kZXAuaD4KLQotZXh0ZXJuIHVuc2lnbmVkIGludCAoKm1pcHNfaHB0X3JlYWQpKHZvaWQpOwotZXh0ZXJuIHZvaWQgKCptaXBzX2hwdF9pbml0KSh1bnNpZ25lZCBpbnQpOworI2luY2x1ZGUgPGFzbS90aW1lLmg+CiAKICNkZWZpbmUgTEFVTkNIU1RBQ0tfU0laRSAyNTYKIApAQCAtMTAxLDcgKzk5LDcgQEAKICAqLwogdm9pZCBwcm9tX2luaXRfc2Vjb25kYXJ5KHZvaWQpCiB7Ci0JbWlwc19ocHRfaW5pdChtaXBzX2hwdF9yZWFkKCkpOworCW1pcHNfaHB0X2luaXQoKTsKIAogCXNldF9jMF9zdGF0dXMoU1QwX0NPIHwgU1QwX0lFIHwgU1QwX0lNKTsKIH0KZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9zZ2ktaXAyNy9pcDI3LWlycS5jIGIvYXJjaC9taXBzL3NnaS1pcDI3L2lwMjctaXJxLmMKaW5kZXggZjAxYmExZi4uMjcwZWNkMyAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL3NnaS1pcDI3L2lwMjctaXJxLmMKKysrIGIvYXJjaC9taXBzL3NnaS1pcDI3L2lwMjctaXJxLmMKQEAgLTM1NCwyOSArMzU0LDYgQEAKIAkuZW5kCQk9IGVuZF9icmlkZ2VfaXJxLAogfTsKIAotc3RhdGljIHVuc2lnbmVkIGxvbmcgaXJxX21hcFtOUl9JUlFTIC8gQklUU19QRVJfTE9OR107Ci0KLWludCBhbGxvY2F0ZV9pcnFubyh2b2lkKQotewotCWludCBpcnE7Ci0KLWFnYWluOgotCWlycSA9IGZpbmRfZmlyc3RfemVyb19iaXQoaXJxX21hcCwgTlJfSVJRUyk7Ci0KLQlpZiAoaXJxID49IE5SX0lSUVMpCi0JCXJldHVybiAtRU5PU1BDOwotCi0JaWYgKHRlc3RfYW5kX3NldF9iaXQoaXJxLCBpcnFfbWFwKSkKLQkJZ290byBhZ2FpbjsKLQotCXJldHVybiBpcnE7Ci19Ci0KLXZvaWQgZnJlZV9pcnFubyh1bnNpZ25lZCBpbnQgaXJxKQotewotCWNsZWFyX2JpdChpcnEsIGlycV9tYXApOwotfQotCiB2b2lkIF9fZGV2aW5pdCByZWdpc3Rlcl9icmlkZ2VfaXJxKHVuc2lnbmVkIGludCBpcnEpCiB7CiAJaXJxX2Rlc2NbaXJxXS5zdGF0dXMJPSBJUlFfRElTQUJMRUQ7CmRpZmYgLS1naXQgYS9hcmNoL21pcHMvc2dpLWlwMjcvaXAyNy1rbG51bWEuYyBiL2FyY2gvbWlwcy9zZ2ktaXAyNy9pcDI3LWtsbnVtYS5jCmluZGV4IGQ3NzdiN2QuLmY5ZjQwNGEgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9zZ2ktaXAyNy9pcDI3LWtsbnVtYS5jCisrKyBiL2FyY2gvbWlwcy9zZ2ktaXAyNy9pcDI3LWtsbnVtYS5jCkBAIC0yNiw3ICsyNiw3IEBACiAgKiBrZXJuZWwuICBGb3IgZXhhbXBsZSwgd2Ugc2hvdWxkIG5ldmVyIHB1dCBhIGNvcHkgb24gYSBoZWFkbGVzcyBub2RlLAogICogYW5kIHdlIHNob3VsZCByZXNwZWN0IHRoZSB0b3BvbG9neSBvZiB0aGUgbWFjaGluZS4KICAqLwotdm9pZCBfX2luaXQgc2V0dXBfcmVwbGljYXRpb25fbWFzaygpCit2b2lkIF9faW5pdCBzZXR1cF9yZXBsaWNhdGlvbl9tYXNrKHZvaWQpCiB7CiAJY25vZGVpZF90CWNub2RlOwogCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvc2dpLWlwMjcvaXAyNy10aW1lci5jIGIvYXJjaC9taXBzL3NnaS1pcDI3L2lwMjctdGltZXIuYwppbmRleCA0ZTg3MGZjLi41ZTgyYTI2IDEwMDY0NAotLS0gYS9hcmNoL21pcHMvc2dpLWlwMjcvaXAyNy10aW1lci5jCisrKyBiL2FyY2gvbWlwcy9zZ2ktaXAyNy9pcDI3LXRpbWVyLmMKQEAgLTEzNCwxMyArMTM0LDYgQEAKIAlpcnFfZXhpdCgpOwogfQogCi11bnNpZ25lZCBsb25nIGlwMjdfZG9fZ2V0dGltZW9mZnNldCh2b2lkKQotewotCXVuc2lnbmVkIGxvbmcgY3RfY3VyMTsKLQljdF9jdXIxID0gUkVNT1RFX0hVQl9MKGNwdXRvbmFzaWQoMCksIFBJX1JUX0NPVU5UKSArIENZQ0xFU19QRVJfSklGRlk7Ci0JcmV0dXJuIChjdF9jdXIxIC0gY3RfY3VyWzBdKSAqIE5TRUNfUEVSX0NZQ0xFIC8gMTAwMDsKLX0KLQogLyogSW5jbHVkZXMgZm9yIGlvYzNfaW5pdCgpLiAgKi8KICNpbmNsdWRlIDxhc20vc24vdHlwZXMuaD4KICNpbmNsdWRlIDxhc20vc24vc24wL2FkZHJzLmg+CkBAIC0yMjEsOCArMjE0LDYgQEAKIAkubmFtZQkJPSAidGltZXIiCiB9OwogCi1leHRlcm4gaW50IGFsbG9jYXRlX2lycW5vKHZvaWQpOwotCiB2b2lkIF9faW5pdCBwbGF0X3RpbWVyX3NldHVwKHN0cnVjdCBpcnFhY3Rpb24gKmlycSkKIHsKIAlpbnQgaXJxbm8gID0gYWxsb2NhdGVfaXJxbm8oKTsKQEAgLTI0OCwxMiArMjM5LDE3IEBACiAJc2V0dXBfaXJxKGlycW5vLCAmcnRfaXJxYWN0aW9uKTsKIH0KIAorc3RhdGljIHVuc2lnbmVkIGludCBpcDI3X2hwdF9yZWFkKHZvaWQpCit7CisJcmV0dXJuIFJFTU9URV9IVUJfTChjcHV0b25hc2lkKDApLCBQSV9SVF9DT1VOVCk7Cit9CisKIHZvaWQgX19pbml0IGlwMjdfdGltZV9pbml0KHZvaWQpCiB7CisJbWlwc19ocHRfcmVhZCA9IGlwMjdfaHB0X3JlYWQ7CisJbWlwc19ocHRfZnJlcXVlbmN5ID0gQ1lDTEVTX1BFUl9TRUM7CiAJeHRpbWUudHZfc2VjID0gZ2V0X200OHQzNV90aW1lKCk7CiAJeHRpbWUudHZfbnNlYyA9IDA7Ci0KLQlkb19nZXR0aW1lb2Zmc2V0ID0gaXAyN19kb19nZXR0aW1lb2Zmc2V0OwogfQogCiB2b2lkIF9faW5pdCBjcHVfdGltZV9pbml0KHZvaWQpCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvc2dpLWlwMzIvaXAzMi1yZXNldC5jIGIvYXJjaC9taXBzL3NnaS1pcDMyL2lwMzItcmVzZXQuYwppbmRleCBmZDA5MzJiLi5kYjgwODQ0IDEwMDY0NAotLS0gYS9hcmNoL21pcHMvc2dpLWlwMzIvaXAzMi1yZXNldC5jCisrKyBiL2FyY2gvbWlwcy9zZ2ktaXAzMi9pcDMyLXJlc2V0LmMKQEAgLTEzNSw3ICsxMzUsNyBAQAogCWFkZF90aW1lcigmcG93ZXJfdGltZXIpOwogfQogCi1zdGF0aWMgaXJxcmV0dXJuX3QgaXAzMl9ydGNfaW50KGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCitzdGF0aWMgaXJxcmV0dXJuX3QgaXAzMl9ydGNfaW50KGludCBpcnEsIHZvaWQgKmRldl9pZCkKIHsKIAl2b2xhdGlsZSB1bnNpZ25lZCBjaGFyIHJlZ19jOwogCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvc2lieXRlL2JjbTE0ODAvc21wLmMgYi9hcmNoL21pcHMvc2lieXRlL2JjbTE0ODAvc21wLmMKaW5kZXggNmVhYzM2ZC4uYmYzMjgyNyAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL3NpYnl0ZS9iY20xNDgwL3NtcC5jCisrKyBiL2FyY2gvbWlwcy9zaWJ5dGUvYmNtMTQ4MC9zbXAuYwpAQCAtMzQsMjEgKzM0LDIxIEBACiAgKiBpbmRlcGVuZGVudCBvZiBib2FyZC9maXJtd2FyZQogICovCiAKLXN0YXRpYyB2b2lkICptYWlsYm94XzBfc2V0X3JlZ3NbXSA9IHsKK3N0YXRpYyB2b2xhdGlsZSB2b2lkICptYWlsYm94XzBfc2V0X3JlZ3NbXSA9IHsKIAlJT0FERFIoQV9CQ00xNDgwX0lNUl9DUFUwX0JBU0UgKyBSX0JDTTE0ODBfSU1SX01BSUxCT1hfMF9TRVRfQ1BVKSwKIAlJT0FERFIoQV9CQ00xNDgwX0lNUl9DUFUxX0JBU0UgKyBSX0JDTTE0ODBfSU1SX01BSUxCT1hfMF9TRVRfQ1BVKSwKIAlJT0FERFIoQV9CQ00xNDgwX0lNUl9DUFUyX0JBU0UgKyBSX0JDTTE0ODBfSU1SX01BSUxCT1hfMF9TRVRfQ1BVKSwKIAlJT0FERFIoQV9CQ00xNDgwX0lNUl9DUFUzX0JBU0UgKyBSX0JDTTE0ODBfSU1SX01BSUxCT1hfMF9TRVRfQ1BVKSwKIH07CiAKLXN0YXRpYyB2b2lkICptYWlsYm94XzBfY2xlYXJfcmVnc1tdID0geworc3RhdGljIHZvbGF0aWxlIHZvaWQgKm1haWxib3hfMF9jbGVhcl9yZWdzW10gPSB7CiAJSU9BRERSKEFfQkNNMTQ4MF9JTVJfQ1BVMF9CQVNFICsgUl9CQ00xNDgwX0lNUl9NQUlMQk9YXzBfQ0xSX0NQVSksCiAJSU9BRERSKEFfQkNNMTQ4MF9JTVJfQ1BVMV9CQVNFICsgUl9CQ00xNDgwX0lNUl9NQUlMQk9YXzBfQ0xSX0NQVSksCiAJSU9BRERSKEFfQkNNMTQ4MF9JTVJfQ1BVMl9CQVNFICsgUl9CQ00xNDgwX0lNUl9NQUlMQk9YXzBfQ0xSX0NQVSksCiAJSU9BRERSKEFfQkNNMTQ4MF9JTVJfQ1BVM19CQVNFICsgUl9CQ00xNDgwX0lNUl9NQUlMQk9YXzBfQ0xSX0NQVSksCiB9OwogCi1zdGF0aWMgdm9pZCAqbWFpbGJveF8wX3JlZ3NbXSA9IHsKK3N0YXRpYyB2b2xhdGlsZSB2b2lkICptYWlsYm94XzBfcmVnc1tdID0gewogCUlPQUREUihBX0JDTTE0ODBfSU1SX0NQVTBfQkFTRSArIFJfQkNNMTQ4MF9JTVJfTUFJTEJPWF8wX0NQVSksCiAJSU9BRERSKEFfQkNNMTQ4MF9JTVJfQ1BVMV9CQVNFICsgUl9CQ00xNDgwX0lNUl9NQUlMQk9YXzBfQ1BVKSwKIAlJT0FERFIoQV9CQ00xNDgwX0lNUl9DUFUyX0JBU0UgKyBSX0JDTTE0ODBfSU1SX01BSUxCT1hfMF9DUFUpLApkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL3NpYnl0ZS9iY20xNDgwL3RpbWUuYyBiL2FyY2gvbWlwcy9zaWJ5dGUvYmNtMTQ4MC90aW1lLmMKaW5kZXggYmYxMmFmNC4uZTEzNmJkZSAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL3NpYnl0ZS9iY20xNDgwL3RpbWUuYworKysgYi9hcmNoL21pcHMvc2lieXRlL2JjbTE0ODAvdGltZS5jCkBAIC00Nyw2ICs0NywxMiBAQAogI2RlZmluZSBJTVJfSVAzX1ZBTAlLX0JDTTE0ODBfSU5UX01BUF9JMQogI2RlZmluZSBJTVJfSVA0X1ZBTAlLX0JDTTE0ODBfSU5UX01BUF9JMgogCisjaWZkZWYgQ09ORklHX1NJTVVMQVRJT04KKyNkZWZpbmUgQkNNMTQ4MF9IUFRfVkFMVUUJNTAwMDAKKyNlbHNlCisjZGVmaW5lIEJDTTE0ODBfSFBUX1ZBTFVFCTEwMDAwMDAKKyNlbmRpZgorCiBleHRlcm4gaW50IGJjbTE0ODBfc3RlYWxfaXJxKGludCBpcnEpOwogCiB2b2lkIGJjbTE0ODBfdGltZV9pbml0KHZvaWQpCkBAIC01OSwxMSArNjUsNiBAQAogCQlCVUcoKTsKIAl9CiAKLQlpZiAoIWNwdSkgewotCQkvKiBVc2Ugb3VyIG93biBnZXR0aW1lb2Zmc2V0KCkgcm91dGluZSAqLwotCQlkb19nZXR0aW1lb2Zmc2V0ID0gYmNtMTQ4MF9nZXR0aW1lb2Zmc2V0OwotCX0KLQogCWJjbTE0ODBfbWFza19pcnEoY3B1LCBpcnEpOwogCiAJLyogTWFwIHRoZSB0aW1lciBpbnRlcnJ1cHQgdG8gaXBbNF0gb2YgdGhpcyBjcHUgKi8KQEAgLTc0LDExICs3NSw3IEBACiAJLyogRGlzYWJsZSB0aGUgdGltZXIgYW5kIHNldCB1cCB0aGUgY291bnQgKi8KIAlfX3Jhd193cml0ZXEoMCwgSU9BRERSKEFfU0NEX1RJTUVSX1JFR0lTVEVSKGNwdSwgUl9TQ0RfVElNRVJfQ0ZHKSkpOwogCV9fcmF3X3dyaXRlcSgKLSNpZm5kZWYgQ09ORklHX1NJTVVMQVRJT04KLQkJMTAwMDAwMC9IWgotI2Vsc2UKLQkJNTAwMDAvSFoKLSNlbmRpZgorCQlCQ00xNDgwX0hQVF9WQUxVRS9IWgogCQksIElPQUREUihBX1NDRF9USU1FUl9SRUdJU1RFUihjcHUsIFJfU0NEX1RJTUVSX0lOSVQpKSk7CiAKIAkvKiBTZXQgdGhlIHRpbWVyIHJ1bm5pbmcgKi8KQEAgLTEyMiwxNiArMTE5LDE2IEBACiAJfQogfQogCi0vKgotICogV2UgdXNlIG91ciBvd24gZG9fZ2V0dGltZW9mZnNldCgpIGluc3RlYWQgb2YgdGhlIGdlbmVyaWMgb25lLAotICogYmVjYXVzZSB0aGUgZ2VuZXJpYyBvbmUgZG9lcyBub3Qgd29yayBmb3IgU01QIGNhc2UuCi0gKiBJbiBhZGRpdGlvbiwgc2luY2Ugd2UgdXNlIGdlbmVyYWwgdGltZXIgMCBmb3Igc3lzdGVtIHRpbWUsCi0gKiB3ZSBjYW4gZ2V0IGFjY3VyYXRlIGludHJhLWppZmZ5IG9mZnNldCB3aXRob3V0IGNhbGlicmF0aW9uLgotICovCi11bnNpZ25lZCBsb25nIGJjbTE0ODBfZ2V0dGltZW9mZnNldCh2b2lkKQorc3RhdGljIHVuc2lnbmVkIGludCBiY20xNDgwX2hwdF9yZWFkKHZvaWQpCiB7CisJLyogV2UgYXNzdW1lIHRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHh0aW1lX2xvY2sgaGVsZC4gKi8KIAl1bnNpZ25lZCBsb25nIGNvdW50ID0KIAkJX19yYXdfcmVhZHEoSU9BRERSKEFfU0NEX1RJTUVSX1JFR0lTVEVSKDAsIFJfU0NEX1RJTUVSX0NOVCkpKTsKKwlyZXR1cm4gKGppZmZpZXMgKyAxKSAqIChCQ00xNDgwX0hQVF9WQUxVRSAvIEhaKSAtIGNvdW50OworfQogCi0JcmV0dXJuIDEwMDAwMDAvSFogLSBjb3VudDsKK3ZvaWQgX19pbml0IGJjbTE0ODBfaHB0X3NldHVwKHZvaWQpCit7CisJbWlwc19ocHRfcmVhZCA9IGJjbTE0ODBfaHB0X3JlYWQ7CisJbWlwc19ocHRfZnJlcXVlbmN5ID0gQkNNMTQ4MF9IUFRfVkFMVUU7CiB9CmRpZmYgLS1naXQgYS9hcmNoL21pcHMvc2lieXRlL3NiMTI1MC9iY20xMjUwX3RicHJvZi5jIGIvYXJjaC9taXBzL3NpYnl0ZS9zYjEyNTAvYmNtMTI1MF90YnByb2YuYwppbmRleCA5OTJlMGQ4Li5kMWE5MDZlIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvc2lieXRlL3NiMTI1MC9iY20xMjUwX3RicHJvZi5jCisrKyBiL2FyY2gvbWlwcy9zaWJ5dGUvc2IxMjUwL2JjbTEyNTBfdGJwcm9mLmMKQEAgLTg4LDcgKzg4LDcgQEAKIAlzYnAudGJfYXJtZWQgPSAxOwogfQogCi1zdGF0aWMgaXJxcmV0dXJuX3Qgc2Jwcm9mX3RiX2ludHIoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3N0YXRpYyBpcnFyZXR1cm5fdCBzYnByb2ZfdGJfaW50cihpbnQgaXJxLCB2b2lkICpkZXZfaWQpCiB7CiAJaW50IGk7CiAJREJHKHByaW50ayhERVZOQU1FICI6IHRiX2ludHJcbiIpKTsKQEAgLTEzOCw3ICsxMzgsNyBAQAogCXJldHVybiBJUlFfSEFORExFRDsKIH0KIAotc3RhdGljIGlycXJldHVybl90IHNicHJvZl9wY19pbnRyKGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCitzdGF0aWMgaXJxcmV0dXJuX3Qgc2Jwcm9mX3BjX2ludHIoaW50IGlycSwgdm9pZCAqZGV2X2lkKQogewogCXByaW50ayhERVZOQU1FICI6IHVuZXhwZWN0ZWQgcGNfaW50ciIpOwogCXJldHVybiBJUlFfTk9ORTsKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9zaWJ5dGUvc2IxMjUwL2J1c193YXRjaGVyLmMgYi9hcmNoL21pcHMvc2lieXRlL3NiMTI1MC9idXNfd2F0Y2hlci5jCmluZGV4IGJiOTA2NDkuLjQ1Mjc0YmQgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9zaWJ5dGUvc2IxMjUwL2J1c193YXRjaGVyLmMKKysrIGIvYXJjaC9taXBzL3NpYnl0ZS9zYjEyNTAvYnVzX3dhdGNoZXIuYwpAQCAtMTcxLDcgKzE3MSw3IEBACiAgKiBub3RlczogcG9zc2libGUgcmUtZW50cnkgZHVlIHRvIG11bHRpcGxlIHNvdXJjZXMKICAqICAgICAgICBzaG91bGQgY2hlY2svaW5kaWNhdGUgc2F0dXJhdGlvbgogICovCi1zdGF0aWMgaXJxcmV0dXJuX3Qgc2lieXRlX2J3X2ludChpbnQgaXJxLCB2b2lkICpkYXRhLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3N0YXRpYyBpcnFyZXR1cm5fdCBzaWJ5dGVfYndfaW50KGludCBpcnEsIHZvaWQgKmRhdGEpCiB7CiAJc3RydWN0IGJ3X3N0YXRzX3N0cnVjdCAqc3RhdHMgPSBkYXRhOwogCXVuc2lnbmVkIGxvbmcgY250cjsKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9zaWJ5dGUvc2IxMjUwL3RpbWUuYyBiL2FyY2gvbWlwcy9zaWJ5dGUvc2IxMjUwL3RpbWUuYwppbmRleCAwY2NmMTc5Li5iY2I3NGYyIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvc2lieXRlL3NiMTI1MC90aW1lLmMKKysrIGIvYXJjaC9taXBzL3NpYnl0ZS9zYjEyNTAvdGltZS5jCkBAIC00NywxNSArNDcsMTEgQEAKIAogI2RlZmluZSBTQjEyNTBfSFBUX05VTQkJMwogI2RlZmluZSBTQjEyNTBfSFBUX1ZBTFVFCU1fU0NEX1RJTUVSX0NOVCAvKiBtYXggdmFsdWUgKi8KLSNkZWZpbmUgU0IxMjUwX0hQVF9TSElGVAkoKHNpemVvZih1bnNpZ25lZCBpbnQpKjgpLVZfU0NEX1RJTUVSX1dJRFRIKQogCiAKIGV4dGVybiBpbnQgc2IxMjUwX3N0ZWFsX2lycShpbnQgaXJxKTsKIAogc3RhdGljIHVuc2lnbmVkIGludCBzYjEyNTBfaHB0X3JlYWQodm9pZCk7Ci1zdGF0aWMgdm9pZCBzYjEyNTBfaHB0X2luaXQodW5zaWduZWQgaW50KTsKLQotc3RhdGljIHVuc2lnbmVkIGludCBocHRfb2Zmc2V0OwogCiB2b2lkIF9faW5pdCBzYjEyNTBfaHB0X3NldHVwKHZvaWQpCiB7CkBAIC02OSwxMyArNjUsOSBAQAogCQlfX3Jhd193cml0ZXEoTV9TQ0RfVElNRVJfRU5BQkxFIHwgTV9TQ0RfVElNRVJfTU9ERV9DT05USU5VT1VTLAogCQkJICAgICBJT0FERFIoQV9TQ0RfVElNRVJfUkVHSVNURVIoU0IxMjUwX0hQVF9OVU0sIFJfU0NEX1RJTUVSX0NGRykpKTsKIAotCQkvKgotCQkgKiB3ZSBuZWVkIHRvIGZpbGwgMzIgYml0cywgc28ganVzdCB1c2UgdGhlIHVwcGVyIDIzIGJpdHMgYW5kIHByZXRlbmQKLQkJICogdGhlIHRpbWVyIGlzIGdvaW5nIDUxMk1oeiBpbnN0ZWFkIG9mIDFNaHoKLQkJICovCi0JCW1pcHNfaHB0X2ZyZXF1ZW5jeSA9IFZfU0NEX1RJTUVSX0ZSRVEgPDwgU0IxMjUwX0hQVF9TSElGVDsKLQkJbWlwc19ocHRfaW5pdCA9IHNiMTI1MF9ocHRfaW5pdDsKKwkJbWlwc19ocHRfZnJlcXVlbmN5ID0gVl9TQ0RfVElNRVJfRlJFUTsKIAkJbWlwc19ocHRfcmVhZCA9IHNiMTI1MF9ocHRfcmVhZDsKKwkJbWlwc19ocHRfbWFzayA9IE1fU0NEX1RJTUVSX0lOSVQ7CiAJfQogfQogCkBAIC0xNDksMTEgKzE0MSw3IEBACiAKIC8qCiAgKiBUaGUgSFBUIGlzIGZyZWUgcnVubmluZyBmcm9tIFNCMTI1MF9IUFRfVkFMVUUgZG93biB0byAwIHRoZW4gc3RhcnRzIG92ZXIKLSAqIGFnYWluLiBUaGVyZSdzIG5vIGVhc3kgd2F5IHRvIHNldCB0byBhIHNwZWNpZmljIHZhbHVlIHNvIHN0b3JlIGluaXQgdmFsdWUKLSAqIGluIGhwdF9vZmZzZXQgYW5kIHN1YnRyYWN0IGVhY2ggdGltZS4KLSAqCi0gKiBOb3RlOiBUaW1lciBpc24ndCBmdWxsIDMyYml0cyBzbyBzaGlmdCBpdCBpbnRvIHRoZSB1cHBlciBwYXJ0IG1ha2luZwotICogICAgICAgaXQgYXBwZWFyIHRvIHJ1biBhdCBhIGhpZ2hlciBmcmVxdWVuY3kuCisgKiBhZ2Fpbi4KICAqLwogc3RhdGljIHVuc2lnbmVkIGludCBzYjEyNTBfaHB0X3JlYWQodm9pZCkKIHsKQEAgLTE2MSwxMyArMTQ5LDUgQEAKIAogCWNvdW50ID0gR19TQ0RfVElNRVJfQ05UKF9fcmF3X3JlYWRxKElPQUREUihBX1NDRF9USU1FUl9SRUdJU1RFUihTQjEyNTBfSFBUX05VTSwgUl9TQ0RfVElNRVJfQ05UKSkpKTsKIAotCWNvdW50ID0gKFNCMTI1MF9IUFRfVkFMVUUgLSBjb3VudCkgPDwgU0IxMjUwX0hQVF9TSElGVDsKLQotCXJldHVybiBjb3VudCAtIGhwdF9vZmZzZXQ7Ci19Ci0KLXN0YXRpYyB2b2lkIHNiMTI1MF9ocHRfaW5pdCh1bnNpZ25lZCBpbnQgY291bnQpCi17Ci0JaHB0X29mZnNldCA9IGNvdW50OwotCXJldHVybjsKKwlyZXR1cm4gU0IxMjUwX0hQVF9WQUxVRSAtIGNvdW50OwogfQpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL3R4NDkyNy9jb21tb24vc21zY19mZGMzN204MXguYyBiL2FyY2gvbWlwcy90eDQ5MjcvY29tbW9uL3Ntc2NfZmRjMzdtODF4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzNmNTE3YgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvbWlwcy90eDQ5MjcvY29tbW9uL3Ntc2NfZmRjMzdtODF4LmMKQEAgLTAsMCArMSwxNzIgQEAKKy8qCisgKiBJbnRlcmZhY2UgZm9yIHNtc2MgZmRjNDhtODF4IFN1cGVyIElPIGNoaXAKKyAqCisgKiBBdXRob3I6IE1vbnRhVmlzdGEgU29mdHdhcmUsIEluYy4gc291cmNlQG12aXN0YS5jb20KKyAqCisgKiAyMDAxLTIwMDMgKGMpIE1vbnRhVmlzdGEgU29mdHdhcmUsIEluYy4gVGhpcyBmaWxlIGlzIGxpY2Vuc2VkIHVuZGVyCisgKiB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMi4gVGhpcyBwcm9ncmFtCisgKiBpcyBsaWNlbnNlZCAiYXMgaXMiIHdpdGhvdXQgYW55IHdhcnJhbnR5IG9mIGFueSBraW5kLCB3aGV0aGVyIGV4cHJlc3MKKyAqIG9yIGltcGxpZWQuCisgKgorICogQ29weXJpZ2h0IDIwMDQgKGMpIE1vbnRhVmlzdGEgU29mdHdhcmUsIEluYy4KKyAqLworI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS90eDQ5Mjcvc21zY19mZGMzN204MXguaD4KKworI2RlZmluZSBERUJVRworCisvKiBDb21tb24gUmVnaXN0ZXJzICovCisjZGVmaW5lIFNNU0NfRkRDMzdNODFYX0NPTkZJR19JTkRFWCAgMHgwMAorI2RlZmluZSBTTVNDX0ZEQzM3TTgxWF9DT05GSUdfREFUQSAgIDB4MDEKKyNkZWZpbmUgU01TQ19GREMzN004MVhfQ09ORiAgICAgICAgICAweDAyCisjZGVmaW5lIFNNU0NfRkRDMzdNODFYX0lOREVYICAgICAgICAgMHgwMworI2RlZmluZSBTTVNDX0ZEQzM3TTgxWF9ETlVNICAgICAgICAgIDB4MDcKKyNkZWZpbmUgU01TQ19GREMzN004MVhfRElEICAgICAgICAgICAweDIwCisjZGVmaW5lIFNNU0NfRkRDMzdNODFYX0RSRVYgICAgICAgICAgMHgyMQorI2RlZmluZSBTTVNDX0ZEQzM3TTgxWF9QQ05UICAgICAgICAgIDB4MjIKKyNkZWZpbmUgU01TQ19GREMzN004MVhfUE1HVCAgICAgICAgICAweDIzCisjZGVmaW5lIFNNU0NfRkRDMzdNODFYX09TQyAgICAgICAgICAgMHgyNAorI2RlZmluZSBTTVNDX0ZEQzM3TTgxWF9DT05GUEEwICAgICAgIDB4MjYKKyNkZWZpbmUgU01TQ19GREMzN004MVhfQ09ORlBBMSAgICAgICAweDI3CisjZGVmaW5lIFNNU0NfRkRDMzdNODFYX1RFU1Q0ICAgICAgICAgMHgyQgorI2RlZmluZSBTTVNDX0ZEQzM3TTgxWF9URVNUNSAgICAgICAgIDB4MkMKKyNkZWZpbmUgU01TQ19GREMzN004MVhfVEVTVDEgICAgICAgICAweDJECisjZGVmaW5lIFNNU0NfRkRDMzdNODFYX1RFU1QyICAgICAgICAgMHgyRQorI2RlZmluZSBTTVNDX0ZEQzM3TTgxWF9URVNUMyAgICAgICAgIDB4MkYKKworLyogTG9naWNhbCBkZXZpY2UgbnVtYmVycyAqLworI2RlZmluZSBTTVNDX0ZEQzM3TTgxWF9GREQgICAgICAgICAgIDB4MDAKKyNkZWZpbmUgU01TQ19GREMzN004MVhfU0VSSUFMMSAgICAgICAweDA0CisjZGVmaW5lIFNNU0NfRkRDMzdNODFYX1NFUklBTDIgICAgICAgMHgwNQorI2RlZmluZSBTTVNDX0ZEQzM3TTgxWF9LQkQgICAgICAgICAgIDB4MDcKKworLyogTG9naWNhbCBkZXZpY2UgQ29uZmlnIFJlZ2lzdGVycyAqLworI2RlZmluZSBTTVNDX0ZEQzM3TTgxWF9BQ1RJVkUgICAgICAgIDB4MzAKKyNkZWZpbmUgU01TQ19GREMzN004MVhfQkFTRUFERFIwICAgICAweDYwCisjZGVmaW5lIFNNU0NfRkRDMzdNODFYX0JBU0VBRERSMSAgICAgMHg2MQorI2RlZmluZSBTTVNDX0ZEQzM3TTgxWF9JTlQgICAgICAgICAgIDB4NzAKKyNkZWZpbmUgU01TQ19GREMzN004MVhfSU5UMiAgICAgICAgICAweDcyCisjZGVmaW5lIFNNU0NfRkRDMzdNODFYX01PREUgICAgICAgICAgMHhGMAorCisvKiBDaGlwIENvbmZpZyBWYWx1ZXMgKi8KKyNkZWZpbmUgU01TQ19GREMzN004MVhfQ09ORklHX0VOVEVSICAweDU1CisjZGVmaW5lIFNNU0NfRkRDMzdNODFYX0NPTkZJR19FWElUICAgMHhhYQorI2RlZmluZSBTTVNDX0ZEQzM3TTgxWF9DSElQX0lEICAgICAgIDB4NGQKKworc3RhdGljIHVuc2lnbmVkIGxvbmcgZ19zbXNjX2ZkYzM3bTgxeF9iYXNlID0gMDsKKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBjaGFyIHNtc2NfZmRjMzdtODF4X3JkKHVuc2lnbmVkIGNoYXIgaW5kZXgpCit7CisJb3V0YihpbmRleCwgZ19zbXNjX2ZkYzM3bTgxeF9iYXNlICsgU01TQ19GREMzN004MVhfQ09ORklHX0lOREVYKTsKKworCXJldHVybiBpbmIoZ19zbXNjX2ZkYzM3bTgxeF9iYXNlICsgU01TQ19GREMzN004MVhfQ09ORklHX0RBVEEpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgc21zY19kYzM3bTgxeF93cih1bnNpZ25lZCBjaGFyIGluZGV4LCB1bnNpZ25lZCBjaGFyIGRhdGEpCit7CisJb3V0YihpbmRleCwgZ19zbXNjX2ZkYzM3bTgxeF9iYXNlICsgU01TQ19GREMzN004MVhfQ09ORklHX0lOREVYKTsKKwlvdXRiKGRhdGEsIGdfc21zY19mZGMzN204MXhfYmFzZSArIFNNU0NfRkRDMzdNODFYX0NPTkZJR19EQVRBKTsKK30KKwordm9pZCBzbXNjX2ZkYzM3bTgxeF9jb25maWdfYmVnKHZvaWQpCit7CisJaWYgKGdfc21zY19mZGMzN204MXhfYmFzZSkgeworCQlvdXRiKFNNU0NfRkRDMzdNODFYX0NPTkZJR19FTlRFUiwKKwkJICAgICBnX3Ntc2NfZmRjMzdtODF4X2Jhc2UgKyBTTVNDX0ZEQzM3TTgxWF9DT05GSUdfSU5ERVgpOworCX0KK30KKwordm9pZCBzbXNjX2ZkYzM3bTgxeF9jb25maWdfZW5kKHZvaWQpCit7CisJaWYgKGdfc21zY19mZGMzN204MXhfYmFzZSkKKwkJb3V0YihTTVNDX0ZEQzM3TTgxWF9DT05GSUdfRVhJVCwKKwkJICAgICBnX3Ntc2NfZmRjMzdtODF4X2Jhc2UgKyBTTVNDX0ZEQzM3TTgxWF9DT05GSUdfSU5ERVgpOworfQorCit1OCBzbXNjX2ZkYzM3bTgxeF9jb25maWdfZ2V0KHU4IHJlZykKK3sKKwl1OCB2YWwgPSAwOworCisJaWYgKGdfc21zY19mZGMzN204MXhfYmFzZSkKKwkJdmFsID0gc21zY19mZGMzN204MXhfcmQocmVnKTsKKworCXJldHVybiB2YWw7Cit9CisKK3ZvaWQgc21zY19mZGMzN204MXhfY29uZmlnX3NldCh1OCByZWcsIHU4IHZhbCkKK3sKKwlpZiAoZ19zbXNjX2ZkYzM3bTgxeF9iYXNlKQorCQlzbXNjX2RjMzdtODF4X3dyKHJlZywgdmFsKTsKK30KKwordW5zaWduZWQgbG9uZyBfX2luaXQgc21zY19mZGMzN204MXhfaW5pdCh1bnNpZ25lZCBsb25nIHBvcnQpCit7CisJY29uc3QgaW50IGZpZWxkID0gc2l6ZW9mKHVuc2lnbmVkIGxvbmcpICogMjsKKwl1OCBjaGlwX2lkOworCisJaWYgKGdfc21zY19mZGMzN204MXhfYmFzZSkKKwkJcHJpbnRrKCJzbXNjX2ZkYzM3bTgxeF9pbml0KCkgc3RlcHBpbmcgb24gb2xkIGJhc2U9MHglMCpseFxuIiwKKwkJICAgICAgIGZpZWxkLCBnX3Ntc2NfZmRjMzdtODF4X2Jhc2UpOworCisJZ19zbXNjX2ZkYzM3bTgxeF9iYXNlID0gcG9ydDsKKworCXNtc2NfZmRjMzdtODF4X2NvbmZpZ19iZWcoKTsKKworCWNoaXBfaWQgPSBzbXNjX2ZkYzM3bTgxeF9yZChTTVNDX0ZEQzM3TTgxWF9ESUQpOworCWlmIChjaGlwX2lkID09IFNNU0NfRkRDMzdNODFYX0NISVBfSUQpCisJCXNtc2NfZmRjMzdtODF4X2NvbmZpZ19lbmQoKTsKKwllbHNlIHsKKwkJcHJpbnRrKCJzbXNjX2ZkYzM3bTgxeF9pbml0KCkgdW5rbm93IGNoaXAgaWQgMHglMDJ4XG4iLAorCQkgICAgICAgY2hpcF9pZCk7CisJCWdfc21zY19mZGMzN204MXhfYmFzZSA9IDA7CisJfQorCisJcmV0dXJuIGdfc21zY19mZGMzN204MXhfYmFzZTsKK30KKworI2lmZGVmIERFQlVHCit2b2lkIHNtc2NfZmRjMzdtODF4X2NvbmZpZ19kdW1wX29uZShjaGFyICprZXksIHU4IGRldiwgdTggcmVnKQoreworCXByaW50aygiJXM6IGRldj0weCUwMnggcmVnPTB4JTAyeCB2YWw9MHglMDJ4XG4iLCBrZXksIGRldiwgcmVnLAorCSAgICAgICBzbXNjX2ZkYzM3bTgxeF9yZChyZWcpKTsKK30KKwordm9pZCBzbXNjX2ZkYzM3bTgxeF9jb25maWdfZHVtcCh2b2lkKQoreworCXU4IG9yaWc7CisJY2hhciAqZm5hbWUgPSAic21zY19mZGMzN204MXhfY29uZmlnX2R1bXAoKSI7CisKKwlzbXNjX2ZkYzM3bTgxeF9jb25maWdfYmVnKCk7CisKKwlvcmlnID0gc21zY19mZGMzN204MXhfcmQoU01TQ19GREMzN004MVhfRE5VTSk7CisKKwlwcmludGsoIiVzOiBjb21tb25cbiIsIGZuYW1lKTsKKwlzbXNjX2ZkYzM3bTgxeF9jb25maWdfZHVtcF9vbmUoZm5hbWUsIFNNU0NfRkRDMzdNODFYX05PTkUsCisJCQkJICAgICAgIFNNU0NfRkRDMzdNODFYX0ROVU0pOworCXNtc2NfZmRjMzdtODF4X2NvbmZpZ19kdW1wX29uZShmbmFtZSwgU01TQ19GREMzN004MVhfTk9ORSwKKwkJCQkgICAgICAgU01TQ19GREMzN004MVhfRElEKTsKKwlzbXNjX2ZkYzM3bTgxeF9jb25maWdfZHVtcF9vbmUoZm5hbWUsIFNNU0NfRkRDMzdNODFYX05PTkUsCisJCQkJICAgICAgIFNNU0NfRkRDMzdNODFYX0RSRVYpOworCXNtc2NfZmRjMzdtODF4X2NvbmZpZ19kdW1wX29uZShmbmFtZSwgU01TQ19GREMzN004MVhfTk9ORSwKKwkJCQkgICAgICAgU01TQ19GREMzN004MVhfUENOVCk7CisJc21zY19mZGMzN204MXhfY29uZmlnX2R1bXBfb25lKGZuYW1lLCBTTVNDX0ZEQzM3TTgxWF9OT05FLAorCQkJCSAgICAgICBTTVNDX0ZEQzM3TTgxWF9QTUdUKTsKKworCXByaW50aygiJXM6IGtleWJvYXJkXG4iLCBmbmFtZSk7CisJc21zY19kYzM3bTgxeF93cihTTVNDX0ZEQzM3TTgxWF9ETlVNLCBTTVNDX0ZEQzM3TTgxWF9LQkQpOworCXNtc2NfZmRjMzdtODF4X2NvbmZpZ19kdW1wX29uZShmbmFtZSwgU01TQ19GREMzN004MVhfS0JELAorCQkJCSAgICAgICBTTVNDX0ZEQzM3TTgxWF9BQ1RJVkUpOworCXNtc2NfZmRjMzdtODF4X2NvbmZpZ19kdW1wX29uZShmbmFtZSwgU01TQ19GREMzN004MVhfS0JELAorCQkJCSAgICAgICBTTVNDX0ZEQzM3TTgxWF9JTlQpOworCXNtc2NfZmRjMzdtODF4X2NvbmZpZ19kdW1wX29uZShmbmFtZSwgU01TQ19GREMzN004MVhfS0JELAorCQkJCSAgICAgICBTTVNDX0ZEQzM3TTgxWF9JTlQyKTsKKwlzbXNjX2ZkYzM3bTgxeF9jb25maWdfZHVtcF9vbmUoZm5hbWUsIFNNU0NfRkRDMzdNODFYX0tCRCwKKwkJCQkgICAgICAgU01TQ19GREMzN004MVhfTERDUl9GMCk7CisKKwlzbXNjX2RjMzdtODF4X3dyKFNNU0NfRkRDMzdNODFYX0ROVU0sIG9yaWcpOworCisJc21zY19mZGMzN204MXhfY29uZmlnX2VuZCgpOworfQorI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvdHg0OTI3L2NvbW1vbi90eDQ5Mjdfc2V0dXAuYyBiL2FyY2gvbWlwcy90eDQ5MjcvY29tbW9uL3R4NDkyN19zZXR1cC5jCmluZGV4IDQ2NThiMmEuLjk0MWM0NDEgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy90eDQ5MjcvY29tbW9uL3R4NDkyN19zZXR1cC5jCisrKyBiL2FyY2gvbWlwcy90eDQ5MjcvY29tbW9uL3R4NDkyN19zZXR1cC5jCkBAIC0xMTIsOCArMTEyLDYgQEAKIAlyZXR1cm47CiB9CiAKLWluZGVudDogU3RhbmRhcmQgaW5wdXQ6MjU6IEVycm9yOlVuZXhwZWN0ZWQgZW5kIG9mIGZpbGUKLQogdm9pZAogZHVtcF9jcDAoY2hhciAqa2V5KQogewpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL3R4NDkzOC90b3NoaWJhX3JidHg0OTM4L3NwaV90eHg5LmMgYi9hcmNoL21pcHMvdHg0OTM4L3Rvc2hpYmFfcmJ0eDQ5Mzgvc3BpX3R4eDkuYwppbmRleCBiOTI2ZTZhLi4wOGIyMGNkIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvdHg0OTM4L3Rvc2hpYmFfcmJ0eDQ5Mzgvc3BpX3R4eDkuYworKysgYi9hcmNoL21pcHMvdHg0OTM4L3Rvc2hpYmFfcmJ0eDQ5Mzgvc3BpX3R4eDkuYwpAQCAtMzYsMTQgKzM2LDE4IEBACiAKIHN0YXRpYyBERUNMQVJFX1dBSVRfUVVFVUVfSEVBRCh0eHg5X3NwaV93YWl0KTsKIAotc3RhdGljIHZvaWQgdHh4OV9zcGlfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCkKK3N0YXRpYyBpcnFyZXR1cm5fdCB0eHg5X3NwaV9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkKQogewogCS8qIGRpc2FibGUgcnggaW50ciAqLwogCXR4NDkzOF9zcGlwdHItPmNyMCAmPSB+VFh4OV9TUENSMF9SQlNJRTsKIAl3YWtlX3VwKCZ0eHg5X3NwaV93YWl0KTsKKworCXJldHVybiBJUlFfSEFORExFRDsKIH0KKwogc3RhdGljIHN0cnVjdCBpcnFhY3Rpb24gdHh4OV9zcGlfYWN0aW9uID0gewotCXR4eDlfc3BpX2ludGVycnVwdCwgMCwgMCwgInNwaSIsIE5VTEwsIE5VTEwsCisJLmhhbmRsZXIJPSB0eHg5X3NwaV9pbnRlcnJ1cHQsCisJLm5hbWUJCT0gInNwaSIsCiB9OwogCiB2b2lkIF9faW5pdCB0eHg5X3NwaV9pcnFpbml0KGludCBpcmNfaXJxKQpkaWZmIC0tZ2l0IGEvYXJjaC9wYXJpc2Mva2VybmVsL3BhcmlzY19rc3ltcy5jIGIvYXJjaC9wYXJpc2Mva2VybmVsL3BhcmlzY19rc3ltcy5jCmluZGV4IDZkNTc1NTMuLjhmNmEwYjMgMTAwNjQ0Ci0tLSBhL2FyY2gvcGFyaXNjL2tlcm5lbC9wYXJpc2Nfa3N5bXMuYworKysgYi9hcmNoL3BhcmlzYy9rZXJuZWwvcGFyaXNjX2tzeW1zLmMKQEAgLTY5LDEwICs2OSw2IEBACiBFWFBPUlRfU1lNQk9MKG1lbWNweV9mcm9taW8pOwogRVhQT1JUX1NZTUJPTChtZW1zZXRfaW8pOwogCi0jaW5jbHVkZSA8YXNtL3VuaXN0ZC5oPgotRVhQT1JUX1NZTUJPTChzeXNfbHNlZWspOwotRVhQT1JUX1NZTUJPTChzeXNfd3JpdGUpOwotCiAjaW5jbHVkZSA8YXNtL3NlbWFwaG9yZS5oPgogRVhQT1JUX1NZTUJPTChfX3VwKTsKIEVYUE9SVF9TWU1CT0woX19kb3duX2ludGVycnVwdGlibGUpOwpkaWZmIC0tZ2l0IGEvYXJjaC9wYXJpc2Mva2VybmVsL3ZtbGludXgubGRzLlMgYi9hcmNoL3BhcmlzYy9rZXJuZWwvdm1saW51eC5sZHMuUwppbmRleCBiMzY3N2ZjLi43Yjk0M2I0IDEwMDY0NAotLS0gYS9hcmNoL3BhcmlzYy9rZXJuZWwvdm1saW51eC5sZHMuUworKysgYi9hcmNoL3BhcmlzYy9rZXJuZWwvdm1saW51eC5sZHMuUwpAQCAtMTUzLDEzICsxNTMsNyBAQAogICBfX3NldHVwX2VuZCA9IC47CiAgIF9faW5pdGNhbGxfc3RhcnQgPSAuOwogICAuaW5pdGNhbGwuaW5pdCA6IHsKLQkqKC5pbml0Y2FsbDEuaW5pdCkgCi0JKiguaW5pdGNhbGwyLmluaXQpIAotCSooLmluaXRjYWxsMy5pbml0KSAKLQkqKC5pbml0Y2FsbDQuaW5pdCkgCi0JKiguaW5pdGNhbGw1LmluaXQpIAotCSooLmluaXRjYWxsNi5pbml0KSAKLQkqKC5pbml0Y2FsbDcuaW5pdCkKKwlJTklUQ0FMTFMKICAgfQogICBfX2luaXRjYWxsX2VuZCA9IC47CiAgIF9fY29uX2luaXRjYWxsX3N0YXJ0ID0gLjsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9LY29uZmlnIGIvYXJjaC9wb3dlcnBjL0tjb25maWcKaW5kZXggOGI2OTEwNC4uMDY3M2RiZSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL0tjb25maWcKKysrIGIvYXJjaC9wb3dlcnBjL0tjb25maWcKQEAgLTc0MCw3ICs3NDAsNyBAQAogCiBjb25maWcgQVJDSF9TUEFSU0VNRU1fREVGQVVMVAogCWRlZl9ib29sIHkKLQlkZXBlbmRzIG9uIFNNUCAmJiBQUENfUFNFUklFUworCWRlcGVuZHMgb24gKFNNUCAmJiBQUENfUFNFUklFUykgfHwgUFBDX0NFTEwKIAogY29uZmlnIEFSQ0hfUE9QVUxBVEVTX05PREVfTUFQCiAJZGVmX2Jvb2wgeQpAQCAtNzUxLDYgKzc1MSwxNSBAQAogCWRlZl9ib29sIHkKIAlkZXBlbmRzIG9uIE1FTU9SWV9IT1RQTFVHCiAKKyMgU29tZSBOVU1BIG5vZGVzIGhhdmUgbWVtb3J5IHJhbmdlcyB0aGF0IHNwYW4KKyMgb3RoZXIgbm9kZXMuICBFdmVuIHRob3VnaCBhIHBmbiBpcyB2YWxpZCBhbmQKKyMgYmV0d2VlbiBhIG5vZGUncyBzdGFydCBhbmQgZW5kIHBmbnMsIGl0IG1heSBub3QKKyMgcmVzaWRlIG9uIHRoYXQgbm9kZS4gIFNlZSBtZW1tYXBfaW5pdF96b25lKCkKKyMgZm9yIGRldGFpbHMuCitjb25maWcgTk9ERVNfU1BBTl9PVEhFUl9OT0RFUworCWRlZl9ib29sIHkKKwlkZXBlbmRzIG9uIE5FRURfTVVMVElQTEVfTk9ERVMKKwogY29uZmlnIFBQQ182NEtfUEFHRVMKIAlib29sICI2NGsgcGFnZSBzaXplIgogCWRlcGVuZHMgb24gUFBDNjQKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9ib290L01ha2VmaWxlIGIvYXJjaC9wb3dlcnBjL2Jvb3QvTWFrZWZpbGUKaW5kZXggMzdkZGZjYS4uNGIyYmU2MSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2Jvb3QvTWFrZWZpbGUKKysrIGIvYXJjaC9wb3dlcnBjL2Jvb3QvTWFrZWZpbGUKQEAgLTExNSw3ICsxMTUsNyBAQAogcXVpZXRfY21kX3dyYXAJPSBXUkFQICAgICRACiAgICAgICBjbWRfd3JhcAk9JChDT05GSUdfU0hFTEwpICQod3JhcHBlcikgLWMgLW8gJEAgLXAgJDIgJChDUk9TU1dSQVApIHZtbGludXgKIHF1aWV0X2NtZF93cmFwX2luaXRyZCA9IFdSQVAgICAgJEAKLSAgICAgIGNtZF93cmFwX2luaXRyZCA9JCh3cmFwcGVyKSAtYyAtbyAkQCAtcCAkMiAkKENST1NTV1JBUCkgXAorICAgICAgY21kX3dyYXBfaW5pdHJkID0kKENPTkZJR19TSEVMTCkgJCh3cmFwcGVyKSAtYyAtbyAkQCAtcCAkMiAkKENST1NTV1JBUCkgXAogCQkJCS1pICQob2JqKS9yYW1kaXNrLmltYWdlLmd6IHZtbGludXgKIAogJChvYmopL3pJbWFnZS5jaHJwOiB2bWxpbnV4ICQod3JhcHBlcmJpdHMpCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvYm9vdC93cmFwcGVyIGIvYXJjaC9wb3dlcnBjL2Jvb3Qvd3JhcHBlcgppbmRleCBlYWI3MzE4Li5iNWZiMWZlIDEwMDc1NQotLS0gYS9hcmNoL3Bvd2VycGMvYm9vdC93cmFwcGVyCisrKyBiL2FyY2gvcG93ZXJwYy9ib290L3dyYXBwZXIKQEAgLTE3OSwxMSArMTc5LDExIEBACiBmaQogCiBpZiBbIC1uICIkaW5pdHJkIiBdOyB0aGVuCi0gICAgYWRkc2VjICR0bXAgIiRpbml0cmQiIGluaXRyZAorICAgIGFkZHNlYyAkdG1wICIkaW5pdHJkIiAkaXNlY3Rpb24KIGZpCiAKIGlmIFsgLW4gIiRkdGIiIF07IHRoZW4KLSAgICBhZGRzZWMgJHRtcCAiJGR0YiIgZHRiCisgICAgYWRkc2VjICR0bXAgIiRkdGIiIC5rZXJuZWw6ZHRiCiBmaQogCiBpZiBbICIkcGxhdGZvcm0iICE9ICJtaWJvb3QiIF07IHRoZW4KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9ib290L3pJbWFnZS5sZHMuUyBiL2FyY2gvcG93ZXJwYy9ib290L3pJbWFnZS5sZHMuUwppbmRleCA0YjZiYjNmLi40YmUzYzY0IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvYm9vdC96SW1hZ2UubGRzLlMKKysrIGIvYXJjaC9wb3dlcnBjL2Jvb3QvekltYWdlLmxkcy5TCkBAIC0yMSw2ICsyMSwxMSBAQAogICAgIF9fZ290Ml9lbmQgPSAuOwogICB9CiAKKyAgLiA9IEFMSUdOKDgpOworICBfZHRiX3N0YXJ0ID0gLjsKKyAgLmtlcm5lbDpkdGIgOiB7ICooLmtlcm5lbDpkdGIpIH0KKyAgX2R0Yl9lbmQgPSAuOworCiAgIC4gPSBBTElHTig0MDk2KTsKICAgX3ZtbGludXhfc3RhcnQgPSAgLjsKICAgLmtlcm5lbDp2bWxpbnV4LnN0cmlwIDogeyAqKC5rZXJuZWw6dm1saW51eC5zdHJpcCkgfQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2NvbmZpZ3MvY2VsbF9kZWZjb25maWcgYi9hcmNoL3Bvd2VycGMvY29uZmlncy9jZWxsX2RlZmNvbmZpZwppbmRleCA4OTJkNWRkLi4wYWJhMDZkIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvY29uZmlncy9jZWxsX2RlZmNvbmZpZworKysgYi9hcmNoL3Bvd2VycGMvY29uZmlncy9jZWxsX2RlZmNvbmZpZwpAQCAtMjU0LDYgKzI1NCw3IEBACiBDT05GSUdfSU5FVF9UVU5ORUw9eQogQ09ORklHX0lORVRfWEZSTV9NT0RFX1RSQU5TUE9SVD15CiBDT05GSUdfSU5FVF9YRlJNX01PREVfVFVOTkVMPXkKKyMgQ09ORklHX0lORVRfWEZSTV9NT0RFX0JFRVQgaXMgbm90IHNldAogQ09ORklHX0lORVRfRElBRz15CiBDT05GSUdfSU5FVF9UQ1BfRElBRz15CiAjIENPTkZJR19UQ1BfQ09OR19BRFZBTkNFRCBpcyBub3Qgc2V0CkBAIC0yNzUsNyArMjc2LDkgQEAKIENPTkZJR19JTkVUNl9UVU5ORUw9bQogQ09ORklHX0lORVQ2X1hGUk1fTU9ERV9UUkFOU1BPUlQ9eQogQ09ORklHX0lORVQ2X1hGUk1fTU9ERV9UVU5ORUw9eQorIyBDT05GSUdfSU5FVDZfWEZSTV9NT0RFX0JFRVQgaXMgbm90IHNldAogIyBDT05GSUdfSU5FVDZfWEZSTV9NT0RFX1JPVVRFT1BUSU1JWkFUSU9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQVjZfU0lUIGlzIG5vdCBzZXQKIENPTkZJR19JUFY2X1RVTk5FTD1tCiAjIENPTkZJR19JUFY2X1NVQlRSRUVTIGlzIG5vdCBzZXQKICMgQ09ORklHX0lQVjZfTVVMVElQTEVfVEFCTEVTIGlzIG5vdCBzZXQKQEAgLTQwNiw2ICs0MDksMTIgQEAKICMgQ09ORklHX0FUQV9PVkVSX0VUSCBpcyBub3Qgc2V0CiAKICMKKyMgTWlzYyBkZXZpY2VzCisjCisjIENPTkZJR19TR0lfSU9DNCBpcyBub3Qgc2V0CisjIENPTkZJR19USUZNX0NPUkUgaXMgbm90IHNldAorCisjCiAjIEFUQS9BVEFQSS9NRk0vUkxMIHN1cHBvcnQKICMKIENPTkZJR19JREU9eQpAQCAtNzM4LDcgKzc0Nyw2IEBACiAjIFRQTSBkZXZpY2VzCiAjCiAjIENPTkZJR19UQ0dfVFBNIGlzIG5vdCBzZXQKLSMgQ09ORklHX1RFTENMT0NLIGlzIG5vdCBzZXQKIAogIwogIyBJMkMgc3VwcG9ydApAQCAtODAyLDYgKzgxMCw3IEBACiAjCiAjIERhbGxhcydzIDEtd2lyZSBidXMKICMKKyMgQ09ORklHX1cxIGlzIG5vdCBzZXQKIAogIwogIyBIYXJkd2FyZSBNb25pdG9yaW5nIHN1cHBvcnQKQEAgLTgxMCwxNCArODE5LDkgQEAKICMgQ09ORklHX0hXTU9OX1ZJRCBpcyBub3Qgc2V0CiAKICMKLSMgTWlzYyBkZXZpY2VzCi0jCi0KLSMKICMgTXVsdGltZWRpYSBkZXZpY2VzCiAjCiAjIENPTkZJR19WSURFT19ERVYgaXMgbm90IHNldAotQ09ORklHX1ZJREVPX1Y0TDI9eQogCiAjCiAjIERpZ2l0YWwgVmlkZW8gQnJvYWRjYXN0aW5nIERldmljZXMKQEAgLTkyMyw2ICs5MjcsNyBAQAogQ09ORklHX0VYVDNfRlNfWEFUVFI9eQogIyBDT05GSUdfRVhUM19GU19QT1NJWF9BQ0wgaXMgbm90IHNldAogIyBDT05GSUdfRVhUM19GU19TRUNVUklUWSBpcyBub3Qgc2V0CisjIENPTkZJR19FWFQ0REVWX0ZTIGlzIG5vdCBzZXQKIENPTkZJR19KQkQ9eQogIyBDT05GSUdfSkJEX0RFQlVHIGlzIG5vdCBzZXQKIENPTkZJR19GU19NQkNBQ0hFPXkKQEAgLTkzMCw2ICs5MzUsNyBAQAogIyBDT05GSUdfSkZTX0ZTIGlzIG5vdCBzZXQKIENPTkZJR19GU19QT1NJWF9BQ0w9eQogIyBDT05GSUdfWEZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0dGUzJfRlMgaXMgbm90IHNldAogIyBDT05GSUdfT0NGUzJfRlMgaXMgbm90IHNldAogIyBDT05GSUdfTUlOSVhfRlMgaXMgbm90IHNldAogIyBDT05GSUdfUk9NRlNfRlMgaXMgbm90IHNldApAQCAtMTEyOSw2ICsxMTM1LDcgQEAKICMgQ09ORklHX0RFQlVHX1ZNIGlzIG5vdCBzZXQKICMgQ09ORklHX0RFQlVHX0xJU1QgaXMgbm90IHNldAogIyBDT05GSUdfRk9SQ0VEX0lOTElOSU5HIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hFQURFUlNfQ0hFQ0sgaXMgbm90IHNldAogIyBDT05GSUdfUkNVX1RPUlRVUkVfVEVTVCBpcyBub3Qgc2V0CiAjIENPTkZJR19ERUJVR19TVEFDS09WRVJGTE9XIGlzIG5vdCBzZXQKICMgQ09ORklHX0RFQlVHX1NUQUNLX1VTQUdFIGlzIG5vdCBzZXQKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9jb25maWdzL21wYzgzNHhfaXR4X2RlZmNvbmZpZyBiL2FyY2gvcG93ZXJwYy9jb25maWdzL21wYzgzNHhfaXR4X2RlZmNvbmZpZwppbmRleCBjZDM1MzVlLi4wNTYxYjczIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvY29uZmlncy9tcGM4MzR4X2l0eF9kZWZjb25maWcKKysrIGIvYXJjaC9wb3dlcnBjL2NvbmZpZ3MvbXBjODM0eF9pdHhfZGVmY29uZmlnCkBAIC0xMjQ4LDcgKzEyNDgsNyBAQAogIyBDT05GSUdfQU1JR0FfUEFSVElUSU9OIGlzIG5vdCBzZXQKICMgQ09ORklHX0FUQVJJX1BBUlRJVElPTiBpcyBub3Qgc2V0CiAjIENPTkZJR19NQUNfUEFSVElUSU9OIGlzIG5vdCBzZXQKLSMgQ09ORklHX01TRE9TX1BBUlRJVElPTiBpcyBub3Qgc2V0CitDT05GSUdfTVNET1NfUEFSVElUSU9OPXkKICMgQ09ORklHX0xETV9QQVJUSVRJT04gaXMgbm90IHNldAogIyBDT05GSUdfU0dJX1BBUlRJVElPTiBpcyBub3Qgc2V0CiAjIENPTkZJR19VTFRSSVhfUEFSVElUSU9OIGlzIG5vdCBzZXQKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9jb25maWdzL3BzZXJpZXNfZGVmY29uZmlnIGIvYXJjaC9wb3dlcnBjL2NvbmZpZ3MvcHNlcmllc19kZWZjb25maWcKaW5kZXggOTgyODY2My4uZDI4MzNjMSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2NvbmZpZ3MvcHNlcmllc19kZWZjb25maWcKKysrIGIvYXJjaC9wb3dlcnBjL2NvbmZpZ3MvcHNlcmllc19kZWZjb25maWcKQEAgLTE4NCw2ICsxODQsNyBAQAogQ09ORklHX01JR1JBVElPTj15CiBDT05GSUdfUkVTT1VSQ0VTXzY0QklUPXkKIENPTkZJR19IQVZFX0FSQ0hfRUFSTFlfUEZOX1RPX05JRD15CitDT05GSUdfTk9ERVNfU1BBTl9PVEhFUl9OT0RFUz15CiAjIENPTkZJR19QUENfNjRLX1BBR0VTIGlzIG5vdCBzZXQKIENPTkZJR19TQ0hFRF9TTVQ9eQogQ09ORklHX1BST0NfREVWSUNFVFJFRT15CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL01ha2VmaWxlIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9NYWtlZmlsZQppbmRleCA4YjEzM2FmLi43YWYyM2M0IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva2VybmVsL01ha2VmaWxlCisrKyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvTWFrZWZpbGUKQEAgLTM4LDcgKzM4LDYgQEAKIG9iai0kKENPTkZJR19UQVUpCQkrPSB0YXVfNnh4Lm8KIG9iajMyLSQoQ09ORklHX1NPRlRXQVJFX1NVU1BFTkQpICs9IHN3c3VzcF8zMi5vCiBvYmozMi0kKENPTkZJR19NT0RVTEVTKQkJKz0gbW9kdWxlXzMyLm8KLW9iai0kKENPTkZJR19FNTAwKQkJKz0gcGVyZm1vbl9mc2xfYm9va2UubwogCiBpZmVxICgkKENPTkZJR19QUENfTUVSR0UpLHkpCiAKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvYnRleHQuYyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvYnRleHQuYwppbmRleCA5OTVmY2VmLi45M2YyMWFhIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva2VybmVsL2J0ZXh0LmMKKysrIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9idGV4dC5jCkBAIC0xODIsNyArMTgyLDcgQEAKIAlwcm9wID0gZ2V0X3Byb3BlcnR5KG5wLCAibGludXgsYm9vdHgtbGluZWJ5dGVzIiwgTlVMTCk7CiAJaWYgKHByb3AgPT0gTlVMTCkKIAkJcHJvcCA9IGdldF9wcm9wZXJ0eShucCwgImxpbmVieXRlcyIsIE5VTEwpOwotCWlmIChwcm9wKQorCWlmIChwcm9wICYmICpwcm9wICE9IDB4ZmZmZmZmZmZ1KQogCQlwaXRjaCA9ICpwcm9wOwogCWlmIChwaXRjaCA9PSAxKQogCQlwaXRjaCA9IDB4MTAwMDsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvY3B1dGFibGUuYyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvY3B1dGFibGUuYwppbmRleCA0N2E2MTNjLi5iZmQ0OTllIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva2VybmVsL2NwdXRhYmxlLmMKKysrIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9jcHV0YWJsZS5jCkBAIC0xOCw2ICsxOCw3IEBACiAKICNpbmNsdWRlIDxhc20vb3Byb2ZpbGVfaW1wbC5oPgogI2luY2x1ZGUgPGFzbS9jcHV0YWJsZS5oPgorI2luY2x1ZGUgPGFzbS9wcm9tLmg+CQkvKiBmb3IgUFRSUkVMT0Mgb24gQVJDSD1wcGMgKi8KIAogc3RydWN0IGNwdV9zcGVjKiBjdXJfY3B1X3NwZWMgPSBOVUxMOwogRVhQT1JUX1NZTUJPTChjdXJfY3B1X3NwZWMpOwpAQCAtNzMsNyArNzQsNyBAQAogI2RlZmluZSBQUENfRkVBVFVSRV9TUEVfQ09NUAkwCiAjZW5kaWYKIAotc3RydWN0IGNwdV9zcGVjCWNwdV9zcGVjc1tdID0geworc3RhdGljIHN0cnVjdCBjcHVfc3BlYyBjcHVfc3BlY3NbXSA9IHsKICNpZmRlZiBDT05GSUdfUFBDNjQKIAl7CS8qIFBvd2VyMyAqLwogCQkucHZyX21hc2sJCT0gMHhmZmZmMDAwMCwKQEAgLTIyNyw2ICsyMjgsMjEgQEAKIAkJLm9wcm9maWxlX3R5cGUJCT0gUFBDX09QUk9GSUxFX1BPV0VSNCwKIAkJLnBsYXRmb3JtCQk9ICJwcGM5NzAiLAogCX0sCisJewkvKiBQUEM5NzBHWCAqLworCQkucHZyX21hc2sJCT0gMHhmZmZmMDAwMCwKKwkJLnB2cl92YWx1ZQkJPSAweDAwNDUwMDAwLAorCQkuY3B1X25hbWUJCT0gIlBQQzk3MEdYIiwKKwkJLmNwdV9mZWF0dXJlcwkJPSBDUFVfRlRSU19QUEM5NzAsCisJCS5jcHVfdXNlcl9mZWF0dXJlcwk9IENPTU1PTl9VU0VSX1BPV0VSNCB8CisJCQlQUENfRkVBVFVSRV9IQVNfQUxUSVZFQ19DT01QLAorCQkuaWNhY2hlX2JzaXplCQk9IDEyOCwKKwkJLmRjYWNoZV9ic2l6ZQkJPSAxMjgsCisJCS5udW1fcG1jcwkJPSA4LAorCQkuY3B1X3NldHVwCQk9IF9fc2V0dXBfY3B1X3BwYzk3MCwKKwkJLm9wcm9maWxlX2NwdV90eXBlCT0gInBwYzY0Lzk3MCIsCisJCS5vcHJvZmlsZV90eXBlCQk9IFBQQ19PUFJPRklMRV9QT1dFUjQsCisJCS5wbGF0Zm9ybQkJPSAicHBjOTcwIiwKKwl9LAogCXsJLyogUG93ZXI1IEdSICovCiAJCS5wdnJfbWFzawkJPSAweGZmZmYwMDAwLAogCQkucHZyX3ZhbHVlCQk9IDB4MDAzYTAwMDAsCkBAIC0yNjgsNyArMjg0LDcgQEAKIAkJLmNwdV91c2VyX2ZlYXR1cmVzCT0gQ09NTU9OX1VTRVJfUE9XRVI2LAogCQkuaWNhY2hlX2JzaXplCQk9IDEyOCwKIAkJLmRjYWNoZV9ic2l6ZQkJPSAxMjgsCi0JCS5udW1fcG1jcwkJPSA4LAorCQkubnVtX3BtY3MJCT0gNiwKIAkJLm9wcm9maWxlX2NwdV90eXBlCT0gInBwYzY0L3Bvd2VyNiIsCiAJCS5vcHJvZmlsZV90eXBlCQk9IFBQQ19PUFJPRklMRV9QT1dFUjQsCiAgCQkub3Byb2ZpbGVfbW1jcmFfc2lodgk9IFBPV0VSNl9NTUNSQV9TSUhWLApAQCAtMTE1MiwzICsxMTY4LDcxIEBACiAjZW5kaWYgLyogIUNMQVNTSUNfUFBDICovCiAjZW5kaWYgLyogQ09ORklHX1BQQzMyICovCiB9OworCitzdHJ1Y3QgY3B1X3NwZWMgKmlkZW50aWZ5X2NwdSh1bnNpZ25lZCBsb25nIG9mZnNldCkKK3sKKwlzdHJ1Y3QgY3B1X3NwZWMgKnMgPSBjcHVfc3BlY3M7CisJc3RydWN0IGNwdV9zcGVjICoqY3VyID0gJmN1cl9jcHVfc3BlYzsKKwl1bnNpZ25lZCBpbnQgcHZyID0gbWZzcHIoU1BSTl9QVlIpOworCWludCBpOworCisJcyA9IFBUUlJFTE9DKHMpOworCWN1ciA9IFBUUlJFTE9DKGN1cik7CisKKwlpZiAoKmN1ciAhPSBOVUxMKQorCQlyZXR1cm4gUFRSUkVMT0MoKmN1cik7CisKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShjcHVfc3BlY3MpOyBpKysscysrKQorCQlpZiAoKHB2ciAmIHMtPnB2cl9tYXNrKSA9PSBzLT5wdnJfdmFsdWUpIHsKKwkJCSpjdXIgPSBjcHVfc3BlY3MgKyBpOworI2lmZGVmIENPTkZJR19QUEM2NAorCQkJLyogcHBjNjQgZXhwZWN0cyBpZGVudGlmeV9jcHUgdG8gYWxzbyBjYWxsIHNldHVwX2NwdQorCQkJICogZm9yIHRoYXQgcHJvY2Vzc29yLiBJIHdpbGwgY29uc29saWRhdGUgdGhhdCBhdCBhCisJCQkgKiBsYXRlciB0aW1lLCBmb3Igbm93LCBqdXN0IHVzZSBvdXIgZnJpZW5kICNpZmRlZi4KKwkJCSAqIHdlIGFsc28gZG9uJ3QgbmVlZCB0byBQVFJSRUxPQyB0aGUgZnVuY3Rpb24gcG9pbnRlcgorCQkJICogb24gcHBjNjQgYXMgd2UgYXJlIHJ1bm5pbmcgYXQgMCBpbiByZWFsIG1vZGUuCisJCQkgKi8KKwkJCWlmIChzLT5jcHVfc2V0dXApIHsKKwkJCQlzLT5jcHVfc2V0dXAob2Zmc2V0LCBzKTsKKwkJCX0KKyNlbmRpZiAvKiBDT05GSUdfUFBDNjQgKi8KKwkJCXJldHVybiBzOworCQl9CisJQlVHKCk7CisJcmV0dXJuIE5VTEw7Cit9CisKK3ZvaWQgZG9fZmVhdHVyZV9maXh1cHModW5zaWduZWQgbG9uZyB2YWx1ZSwgdm9pZCAqZml4dXBfc3RhcnQsIHZvaWQgKmZpeHVwX2VuZCkKK3sKKwlzdHJ1Y3QgZml4dXBfZW50cnkgeworCQl1bnNpZ25lZCBsb25nCW1hc2s7CisJCXVuc2lnbmVkIGxvbmcJdmFsdWU7CisJCWxvbmcJCXN0YXJ0X29mZjsKKwkJbG9uZwkJZW5kX29mZjsKKwl9ICpmY3VyLCAqZmVuZDsKKworCWZjdXIgPSBmaXh1cF9zdGFydDsKKwlmZW5kID0gZml4dXBfZW5kOworCisJZm9yICg7IGZjdXIgPCBmZW5kOyBmY3VyKyspIHsKKwkJdW5zaWduZWQgaW50ICpwc3RhcnQsICpwZW5kLCAqcDsKKworCQlpZiAoKHZhbHVlICYgZmN1ci0+bWFzaykgPT0gZmN1ci0+dmFsdWUpCisJCQljb250aW51ZTsKKworCQkvKiBUaGVzZSBQVFJSRUxPQ3Mgd2lsbCBkaXNhcHBlYXIgb25jZSB0aGUgbmV3IHNjaGVtZSBmb3IKKwkJICogbW9kdWxlcyBhbmQgdmRzbyBpcyBpbXBsZW1lbnRlZAorCQkgKi8KKwkJcHN0YXJ0ID0gKCh1bnNpZ25lZCBpbnQgKilmY3VyKSArIChmY3VyLT5zdGFydF9vZmYgLyA0KTsKKwkJcGVuZCA9ICgodW5zaWduZWQgaW50ICopZmN1cikgKyAoZmN1ci0+ZW5kX29mZiAvIDQpOworCisJCWZvciAocCA9IHBzdGFydDsgcCA8IHBlbmQ7IHArKykgeworCQkJKnAgPSAweDYwMDAwMDAwdTsKKwkJCWFzbSB2b2xhdGlsZSAoImRjYnN0IDAsICUwIiA6IDogInIiIChwKSk7CisJCX0KKwkJYXNtIHZvbGF0aWxlICgic3luYyIgOiA6IDogIm1lbW9yeSIpOworCQlmb3IgKHAgPSBwc3RhcnQ7IHAgPCBwZW5kOyBwKyspCisJCQlhc20gdm9sYXRpbGUgKCJpY2JpIDAsJTAiIDogOiAiciIgKHApKTsKKwkJYXNtIHZvbGF0aWxlICgic3luYzsgaXN5bmMiIDogOiA6ICJtZW1vcnkiKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL2hlYWRfNjQuUyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvaGVhZF82NC5TCmluZGV4IDY0NWM3ZjEuLmU3MjA3MjkgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvaGVhZF82NC5TCisrKyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvaGVhZF82NC5TCkBAIC00ODcsNyArNDg3LDcgQEAKIAlybHdpbWkJcjEzLHIxMiwxNiwweDIwCiAJbWZjcglyMTIKIAljbXB3aQlyMTMsMHgyYwotCWJlcQkuZG9fc3RhYl9ib2x0ZWRfcFNlcmllcworCWJlcQlkb19zdGFiX2JvbHRlZF9wU2VyaWVzCiAJbXRjcmYJMHg4MCxyMTIKIAltZnNwcglyMTIsU1BSTl9TUFJHMgogRU5EX0ZUUl9TRUNUSU9OX0lGQ0xSKENQVV9GVFJfU0xCKQpAQCAtNjAwLDcgKzYwMCw3IEBACiAJU1REX0VYQ0VQVElPTl9QU0VSSUVTKC4sIHBlcmZvcm1hbmNlX21vbml0b3IpCiAKIAkuYWxpZ24JNwotX0dMT0JBTChkb19zdGFiX2JvbHRlZF9wU2VyaWVzKQorZG9fc3RhYl9ib2x0ZWRfcFNlcmllczoKIAltdGNyZgkweDgwLHIxMgogCW1mc3ByCXIxMixTUFJOX1NQUkcyCiAJRVhDRVBUSU9OX1BST0xPR19QU0VSSUVTKFBBQ0FfRVhTTEIsIC5kb19zdGFiX2JvbHRlZCkKQEAgLTEwNDYsNyArMTA0Niw3IEBACiAJbGkJcjUsMAogCXN0ZAlyNCxfREFSKHIxKQogCXN0ZAlyNSxfRFNJU1IocjEpCi0JYgkuaGFuZGxlX3BhZ2VfZmF1bHQKKwliCWhhbmRsZV9wYWdlX2ZhdWx0CiAKIHVucmVjb3ZfdXNlcl9zbGI6CiAJRVhDRVBUSU9OX1BST0xPR19DT01NT04oMHg0MjAwLCBQQUNBX0VYR0VOKQpAQCAtMTE3NCwxMiArMTE3NCwxMyBAQAogCS5nbG9ibCBmcF91bmF2YWlsYWJsZV9jb21tb24KIGZwX3VuYXZhaWxhYmxlX2NvbW1vbjoKIAlFWENFUFRJT05fUFJPTE9HX0NPTU1PTigweDgwMCwgUEFDQV9FWEdFTikKLQlibmUJLmxvYWRfdXBfZnB1CQkvKiBpZiBmcm9tIHVzZXIsIGp1c3QgbG9hZCBpdCB1cCAqLworCWJuZQkxZgkJCS8qIGlmIGZyb20gdXNlciwganVzdCBsb2FkIGl0IHVwICovCiAJYmwJLnNhdmVfbnZncHJzCiAJYWRkaQlyMyxyMSxTVEFDS19GUkFNRV9PVkVSSEVBRAogCUVOQUJMRV9JTlRTCiAJYmwJLmtlcm5lbF9mcF91bmF2YWlsYWJsZV9leGNlcHRpb24KIAlCVUdfT1BDT0RFCisxOgliCS5sb2FkX3VwX2ZwdQogCiAJLmFsaWduCTcKIAkuZ2xvYmwgYWx0aXZlY191bmF2YWlsYWJsZV9jb21tb24KQEAgLTEyNzksMTAgKzEyODAsMTAgQEAKIAlzdGQJcjQsX0RTSVNSKHIxKQogCiAJYW5kaXMuCXIwLHI0LDB4YTQ1MAkJLyogd2VpcmQgZXJyb3I/ICovCi0JYm5lLQkuaGFuZGxlX3BhZ2VfZmF1bHQJLyogaWYgbm90LCB0cnkgdG8gaW5zZXJ0IGEgSFBURSAqLworCWJuZS0JaGFuZGxlX3BhZ2VfZmF1bHQJLyogaWYgbm90LCB0cnkgdG8gaW5zZXJ0IGEgSFBURSAqLwogQkVHSU5fRlRSX1NFQ1RJT04KIAlhbmRpcy4JcjAscjQsMHgwMDIwCQkvKiBJcyBpdCBhIHNlZ21lbnQgdGFibGUgZmF1bHQ/ICovCi0JYm5lLQkuZG9fc3RlX2FsbG9jCQkvKiBJZiBzbyBoYW5kbGUgaXQgKi8KKwlibmUtCWRvX3N0ZV9hbGxvYwkJLyogSWYgc28gaGFuZGxlIGl0ICovCiBFTkRfRlRSX1NFQ1RJT05fSUZDTFIoQ1BVX0ZUUl9TTEIpCiAKIAkvKgpAQCAtMTMyNCw3ICsxMzI1LDcgQEAKIAkgKiBiZWNhdXNlIHJldF9mcm9tX2V4Y2VwdF9saXRlIHdpbGwgY2hlY2sgZm9yIGFuZCBoYW5kbGUgcGVuZGluZwogCSAqIGludGVycnVwdHMgaWYgbmVjZXNzYXJ5LgogCSAqLwotCWJlcQkucmV0X2Zyb21fZXhjZXB0X2xpdGUKKwliZXEJMTNmCiAJLyogRm9yIGEgaGFzaCBmYWlsdXJlLCB3ZSBkb24ndCBib3RoZXIgcmUtZW5hYmxpbmcgaW50ZXJydXB0cyAqLwogCWJsZS0JMTJmCiAKQEAgLTEzNDYsMTQgKzEzNDcsMTQgQEAKIEVORF9GV19GVFJfU0VDVElPTl9JRkNMUihGV19GRUFUVVJFX0lTRVJJRVMpCiAKIC8qIEhlcmUgd2UgaGF2ZSBhIHBhZ2UgZmF1bHQgdGhhdCBoYXNoX3BhZ2UgY2FuJ3QgaGFuZGxlLiAqLwotX0dMT0JBTChoYW5kbGVfcGFnZV9mYXVsdCkKK2hhbmRsZV9wYWdlX2ZhdWx0OgogCUVOQUJMRV9JTlRTCiAxMToJbGQJcjQsX0RBUihyMSkKIAlsZAlyNSxfRFNJU1IocjEpCiAJYWRkaQlyMyxyMSxTVEFDS19GUkFNRV9PVkVSSEVBRAogCWJsCS5kb19wYWdlX2ZhdWx0CiAJY21wZGkJcjMsMAotCWJlcSsJLnJldF9mcm9tX2V4Y2VwdF9saXRlCisJYmVxKwkxM2YKIAlibAkuc2F2ZV9udmdwcnMKIAltcglyNSxyMwogCWFkZGkJcjMscjEsU1RBQ0tfRlJBTUVfT1ZFUkhFQUQKQEAgLTEzNzAsMTIgKzEzNzEsMTQgQEAKIAlibAkubG93X2hhc2hfZmF1bHQKIAliCS5yZXRfZnJvbV9leGNlcHQKIAorMTM6CWIJLnJldF9mcm9tX2V4Y2VwdF9saXRlCisKIAkvKiBoZXJlIHdlIGhhdmUgYSBzZWdtZW50IG1pc3MgKi8KLV9HTE9CQUwoZG9fc3RlX2FsbG9jKQorZG9fc3RlX2FsbG9jOgogCWJsCS5zdGVfYWxsb2NhdGUJCS8qIHRyeSB0byBpbnNlcnQgc3RhYiBlbnRyeSAqLwogCWNtcGRpCXIzLDAKLQliZXErCWZhc3RfZXhjZXB0aW9uX3JldHVybgotCWIJLmhhbmRsZV9wYWdlX2ZhdWx0CisJYm5lLQloYW5kbGVfcGFnZV9mYXVsdAorCWIJZmFzdF9leGNlcHRpb25fcmV0dXJuCiAKIC8qCiAgKiByMTMgcG9pbnRzIHRvIHRoZSBQQUNBLCByOSBjb250YWlucyB0aGUgc2F2ZWQgQ1IsCkBAIC0xNTgwLDExICsxNTgzLDYgQEAKIAlsaQlyMCwwCiAJc3RkdQlyMCwtU1RBQ0tfRlJBTUVfT1ZFUkhFQUQocjEpCiAKLQlMT0FEX1JFR19JTU1FRElBVEUocjMsY3B1X3NwZWNzKQotCUxPQURfUkVHX0lNTUVESUFURShyNCxjdXJfY3B1X3NwZWMpCi0JbGkJcjUsMAotCWJsCS5pZGVudGlmeV9jcHUKLQogCUxPQURfUkVHX0lNTUVESUFURShyMixfX3RvY19zdGFydCkKIAlhZGRpCXIyLHIyLDB4NDAwMAogCWFkZGkJcjIscjIsMHg0MDAwCkBAIC0xNjQ2LDYgKzE2NDQsOCBAQAogCWNtcHdpCXIwLDB4M2MJCS8qIDk3MEZYICovCiAJYmVxCTFmCiAJY21wd2kJcjAsMHg0NAkJLyogOTcwTVAgKi8KKwliZXEJMWYKKwljbXB3aQlyMCwweDQ1CQkvKiA5NzBHWCAqLwogCWJuZQkyZgogMToJYmwJLl9fY3B1X3ByZWluaXRfcHBjOTcwCiAyOgpAQCAtMTk2NCwxMyArMTk2NCw2IEBACiAJYWRkaQlyMixyMiwweDQwMDAKIAlhZGQJcjIscjIscjI2CiAKLQlMT0FEX1JFR19JTU1FRElBVEUocjMsIGNwdV9zcGVjcykKLQlhZGQJcjMscjMscjI2Ci0JTE9BRF9SRUdfSU1NRURJQVRFKHI0LGN1cl9jcHVfc3BlYykKLQlhZGQJcjQscjQscjI2Ci0JbXIJcjUscjI2Ci0JYmwJLmlkZW50aWZ5X2NwdQotCiAJLyogRG8gdmVyeSBlYXJseSBrZXJuZWwgaW5pdGlhbGl6YXRpb25zLCBpbmNsdWRpbmcgaW5pdGlhbCBoYXNoIHRhYmxlLAogCSAqIHN0YWIgYW5kIHNsYiBzZXR1cCBiZWZvcmUgd2UgdHVybiBvbiByZWxvY2F0aW9uLgkqLwogCkBAIC0yMDAwLDEzICsxOTkzLDYgQEAKIAlsaQlyMCwwCiAJc3RkdQlyMCwtU1RBQ0tfRlJBTUVfT1ZFUkhFQUQocjEpCiAKLQkvKiBBcHBseSB0aGUgQ1BVcy1zcGVjaWZpYyBmaXh1cHMgKG5vcCBvdXQgc2VjdGlvbnMgbm90IHJlbGV2YW50Ci0JICogdG8gdGhpcyBDUFUKLQkgKi8KLQlsaQlyMywwCi0JYmwJLmRvX2NwdV9mdHJfZml4dXBzCi0JYmwJLmRvX2Z3X2Z0cl9maXh1cHMKLQogCS8qIHB0ciB0byBjdXJyZW50ICovCiAJTE9BRF9SRUdfSU1NRURJQVRFKHI0LCBpbml0X3Rhc2spCiAJc3RkCXI0LFBBQ0FDVVJSRU5UKHIxMykKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvaW9tbXUuYyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvaW9tbXUuYwppbmRleCBmODhhMmE2Li5iYTZiNzI1IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva2VybmVsL2lvbW11LmMKKysrIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9pb21tdS5jCkBAIC00Nyw2ICs0NywxNyBAQAogc3RhdGljIGludCBub3ZtZXJnZSA9IDE7CiAjZW5kaWYKIAorc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIGlvbW11X251bV9wYWdlcyh1bnNpZ25lZCBsb25nIHZhZGRyLAorCQkJCQkgICAgdW5zaWduZWQgbG9uZyBzbGVuKQoreworCXVuc2lnbmVkIGxvbmcgbnBhZ2VzOworCisJbnBhZ2VzID0gSU9NTVVfUEFHRV9BTElHTih2YWRkciArIHNsZW4pIC0gKHZhZGRyICYgSU9NTVVfUEFHRV9NQVNLKTsKKwlucGFnZXMgPj49IElPTU1VX1BBR0VfU0hJRlQ7CisKKwlyZXR1cm4gbnBhZ2VzOworfQorCiBzdGF0aWMgaW50IF9faW5pdCBzZXR1cF9pb21tdShjaGFyICpzdHIpCiB7CiAJaWYgKCFzdHJjbXAoc3RyLCAibm92bWVyZ2UiKSkKQEAgLTE3OCwxMCArMTg5LDEwIEBACiAJfQogCiAJZW50cnkgKz0gdGJsLT5pdF9vZmZzZXQ7CS8qIE9mZnNldCBpbnRvIHJlYWwgVENFIHRhYmxlICovCi0JcmV0ID0gZW50cnkgPDwgUEFHRV9TSElGVDsJLyogU2V0IHRoZSByZXR1cm4gZG1hIGFkZHJlc3MgKi8KKwlyZXQgPSBlbnRyeSA8PCBJT01NVV9QQUdFX1NISUZUOwkvKiBTZXQgdGhlIHJldHVybiBkbWEgYWRkcmVzcyAqLwogCiAJLyogUHV0IHRoZSBUQ0VzIGluIHRoZSBIVyB0YWJsZSAqLwotCXBwY19tZC50Y2VfYnVpbGQodGJsLCBlbnRyeSwgbnBhZ2VzLCAodW5zaWduZWQgbG9uZylwYWdlICYgUEFHRV9NQVNLLAorCXBwY19tZC50Y2VfYnVpbGQodGJsLCBlbnRyeSwgbnBhZ2VzLCAodW5zaWduZWQgbG9uZylwYWdlICYgSU9NTVVfUEFHRV9NQVNLLAogCQkJIGRpcmVjdGlvbik7CiAKIApAQCAtMjAzLDcgKzIxNCw3IEBACiAJdW5zaWduZWQgbG9uZyBlbnRyeSwgZnJlZV9lbnRyeTsKIAl1bnNpZ25lZCBsb25nIGk7CiAKLQllbnRyeSA9IGRtYV9hZGRyID4+IFBBR0VfU0hJRlQ7CisJZW50cnkgPSBkbWFfYWRkciA+PiBJT01NVV9QQUdFX1NISUZUOwogCWZyZWVfZW50cnkgPSBlbnRyeSAtIHRibC0+aXRfb2Zmc2V0OwogCiAJaWYgKCgoZnJlZV9lbnRyeSArIG5wYWdlcykgPiB0YmwtPml0X3NpemUpIHx8CkBAIC0yNzAsNyArMjgxLDcgQEAKIAkvKiBJbml0IGZpcnN0IHNlZ21lbnQgbGVuZ3RoIGZvciBiYWNrb3V0IGF0IGZhaWx1cmUgKi8KIAlvdXRzLT5kbWFfbGVuZ3RoID0gMDsKIAotCURCRygibWFwcGluZyAlZCBlbGVtZW50czpcbiIsIG5lbGVtcyk7CisJREJHKCJzZyBtYXBwaW5nICVkIGVsZW1lbnRzOlxuIiwgbmVsZW1zKTsKIAogCXNwaW5fbG9ja19pcnFzYXZlKCYodGJsLT5pdF9sb2NrKSwgZmxhZ3MpOwogCkBAIC0yODUsOSArMjk2LDggQEAKIAkJfQogCQkvKiBBbGxvY2F0ZSBpb21tdSBlbnRyaWVzIGZvciB0aGF0IHNlZ21lbnQgKi8KIAkJdmFkZHIgPSAodW5zaWduZWQgbG9uZylwYWdlX2FkZHJlc3Mocy0+cGFnZSkgKyBzLT5vZmZzZXQ7Ci0JCW5wYWdlcyA9IFBBR0VfQUxJR04odmFkZHIgKyBzbGVuKSAtICh2YWRkciAmIFBBR0VfTUFTSyk7Ci0JCW5wYWdlcyA+Pj0gUEFHRV9TSElGVDsKLQkJZW50cnkgPSBpb21tdV9yYW5nZV9hbGxvYyh0YmwsIG5wYWdlcywgJmhhbmRsZSwgbWFzayA+PiBQQUdFX1NISUZULCAwKTsKKwkJbnBhZ2VzID0gaW9tbXVfbnVtX3BhZ2VzKHZhZGRyLCBzbGVuKTsKKwkJZW50cnkgPSBpb21tdV9yYW5nZV9hbGxvYyh0YmwsIG5wYWdlcywgJmhhbmRsZSwgbWFzayA+PiBJT01NVV9QQUdFX1NISUZULCAwKTsKIAogCQlEQkcoIiAgLSB2YWRkcjogJWx4LCBzaXplOiAlbHhcbiIsIHZhZGRyLCBzbGVuKTsKIApAQCAtMzAxLDE0ICszMTEsMTQgQEAKIAogCQkvKiBDb252ZXJ0IGVudHJ5IHRvIGEgZG1hX2FkZHJfdCAqLwogCQllbnRyeSArPSB0YmwtPml0X29mZnNldDsKLQkJZG1hX2FkZHIgPSBlbnRyeSA8PCBQQUdFX1NISUZUOwotCQlkbWFfYWRkciB8PSBzLT5vZmZzZXQ7CisJCWRtYV9hZGRyID0gZW50cnkgPDwgSU9NTVVfUEFHRV9TSElGVDsKKwkJZG1hX2FkZHIgfD0gKHMtPm9mZnNldCAmIH5JT01NVV9QQUdFX01BU0spOwogCi0JCURCRygiICAtICVseCBwYWdlcywgZW50cnk6ICVseCwgZG1hX2FkZHI6ICVseFxuIiwKKwkJREJHKCIgIC0gJWx1IHBhZ2VzLCBlbnRyeTogJWx4LCBkbWFfYWRkcjogJWx4XG4iLAogCQkJICAgIG5wYWdlcywgZW50cnksIGRtYV9hZGRyKTsKIAogCQkvKiBJbnNlcnQgaW50byBIVyB0YWJsZSAqLwotCQlwcGNfbWQudGNlX2J1aWxkKHRibCwgZW50cnksIG5wYWdlcywgdmFkZHIgJiBQQUdFX01BU0ssIGRpcmVjdGlvbik7CisJCXBwY19tZC50Y2VfYnVpbGQodGJsLCBlbnRyeSwgbnBhZ2VzLCB2YWRkciAmIElPTU1VX1BBR0VfTUFTSywgZGlyZWN0aW9uKTsKIAogCQkvKiBJZiB3ZSBhcmUgaW4gYW4gb3BlbiBzZWdtZW50LCB0cnkgbWVyZ2luZyAqLwogCQlpZiAoc2Vnc3RhcnQgIT0gcykgewpAQCAtMzIzLDcgKzMzMyw3IEBACiAJCQkJREJHKCIgICAgY2FuJ3QgbWVyZ2UsIG5ldyBzZWdtZW50LlxuIik7CiAJCQl9IGVsc2UgewogCQkJCW91dHMtPmRtYV9sZW5ndGggKz0gcy0+bGVuZ3RoOwotCQkJCURCRygiICAgIG1lcmdlZCwgbmV3IGxlbjogJWx4XG4iLCBvdXRzLT5kbWFfbGVuZ3RoKTsKKwkJCQlEQkcoIiAgICBtZXJnZWQsIG5ldyBsZW46ICV1eFxuIiwgb3V0cy0+ZG1hX2xlbmd0aCk7CiAJCQl9CiAJCX0KIApAQCAtMzY3LDkgKzM3Nyw4IEBACiAJCWlmIChzLT5kbWFfbGVuZ3RoICE9IDApIHsKIAkJCXVuc2lnbmVkIGxvbmcgdmFkZHIsIG5wYWdlczsKIAotCQkJdmFkZHIgPSBzLT5kbWFfYWRkcmVzcyAmIFBBR0VfTUFTSzsKLQkJCW5wYWdlcyA9IChQQUdFX0FMSUdOKHMtPmRtYV9hZGRyZXNzICsgcy0+ZG1hX2xlbmd0aCkgLSB2YWRkcikKLQkJCQk+PiBQQUdFX1NISUZUOworCQkJdmFkZHIgPSBzLT5kbWFfYWRkcmVzcyAmIElPTU1VX1BBR0VfTUFTSzsKKwkJCW5wYWdlcyA9IGlvbW11X251bV9wYWdlcyhzLT5kbWFfYWRkcmVzcywgcy0+ZG1hX2xlbmd0aCk7CiAJCQlfX2lvbW11X2ZyZWUodGJsLCB2YWRkciwgbnBhZ2VzKTsKIAkJCXMtPmRtYV9hZGRyZXNzID0gRE1BX0VSUk9SX0NPREU7CiAJCQlzLT5kbWFfbGVuZ3RoID0gMDsKQEAgLTM5OCw4ICs0MDcsNyBAQAogCiAJCWlmIChzZ2xpc3QtPmRtYV9sZW5ndGggPT0gMCkKIAkJCWJyZWFrOwotCQlucGFnZXMgPSAoUEFHRV9BTElHTihkbWFfaGFuZGxlICsgc2dsaXN0LT5kbWFfbGVuZ3RoKQotCQkJICAtIChkbWFfaGFuZGxlICYgUEFHRV9NQVNLKSkgPj4gUEFHRV9TSElGVDsKKwkJbnBhZ2VzID0gaW9tbXVfbnVtX3BhZ2VzKGRtYV9oYW5kbGUsc2dsaXN0LT5kbWFfbGVuZ3RoKTsKIAkJX19pb21tdV9mcmVlKHRibCwgZG1hX2hhbmRsZSwgbnBhZ2VzKTsKIAkJc2dsaXN0Kys7CiAJfQpAQCAtNTMyLDEyICs1NDAsMTEgQEAKIAlCVUdfT04oZGlyZWN0aW9uID09IERNQV9OT05FKTsKIAogCXVhZGRyID0gKHVuc2lnbmVkIGxvbmcpdmFkZHI7Ci0JbnBhZ2VzID0gUEFHRV9BTElHTih1YWRkciArIHNpemUpIC0gKHVhZGRyICYgUEFHRV9NQVNLKTsKLQlucGFnZXMgPj49IFBBR0VfU0hJRlQ7CisJbnBhZ2VzID0gaW9tbXVfbnVtX3BhZ2VzKHVhZGRyLCBzaXplKTsKIAogCWlmICh0YmwpIHsKIAkJZG1hX2hhbmRsZSA9IGlvbW11X2FsbG9jKHRibCwgdmFkZHIsIG5wYWdlcywgZGlyZWN0aW9uLAotCQkJCQkgbWFzayA+PiBQQUdFX1NISUZULCAwKTsKKwkJCQkJIG1hc2sgPj4gSU9NTVVfUEFHRV9TSElGVCwgMCk7CiAJCWlmIChkbWFfaGFuZGxlID09IERNQV9FUlJPUl9DT0RFKSB7CiAJCQlpZiAocHJpbnRrX3JhdGVsaW1pdCgpKSAgewogCQkJCXByaW50ayhLRVJOX0lORk8gImlvbW11X2FsbG9jIGZhaWxlZCwgIgpAQCAtNTQ1LDcgKzU1Miw3IEBACiAJCQkJCQl0YmwsIHZhZGRyLCBucGFnZXMpOwogCQkJfQogCQl9IGVsc2UKLQkJCWRtYV9oYW5kbGUgfD0gKHVhZGRyICYgflBBR0VfTUFTSyk7CisJCQlkbWFfaGFuZGxlIHw9ICh1YWRkciAmIH5JT01NVV9QQUdFX01BU0spOwogCX0KIAogCXJldHVybiBkbWFfaGFuZGxlOwpAQCAtNTU0LDExICs1NjEsMTQgQEAKIHZvaWQgaW9tbXVfdW5tYXBfc2luZ2xlKHN0cnVjdCBpb21tdV90YWJsZSAqdGJsLCBkbWFfYWRkcl90IGRtYV9oYW5kbGUsCiAJCXNpemVfdCBzaXplLCBlbnVtIGRtYV9kYXRhX2RpcmVjdGlvbiBkaXJlY3Rpb24pCiB7CisJdW5zaWduZWQgaW50IG5wYWdlczsKKwogCUJVR19PTihkaXJlY3Rpb24gPT0gRE1BX05PTkUpOwogCi0JaWYgKHRibCkKLQkJaW9tbXVfZnJlZSh0YmwsIGRtYV9oYW5kbGUsIChQQUdFX0FMSUdOKGRtYV9oYW5kbGUgKyBzaXplKSAtCi0JCQkJCShkbWFfaGFuZGxlICYgUEFHRV9NQVNLKSkgPj4gUEFHRV9TSElGVCk7CisJaWYgKHRibCkgeworCQlucGFnZXMgPSBpb21tdV9udW1fcGFnZXMoZG1hX2hhbmRsZSwgc2l6ZSk7CisJCWlvbW11X2ZyZWUodGJsLCBkbWFfaGFuZGxlLCBucGFnZXMpOworCX0KIH0KIAogLyogQWxsb2NhdGVzIGEgY29udGlndW91cyByZWFsIGJ1ZmZlciBhbmQgY3JlYXRlcyBtYXBwaW5ncyBvdmVyIGl0LgpAQCAtNTcwLDExICs1ODAsMTEgQEAKIHsKIAl2b2lkICpyZXQgPSBOVUxMOwogCWRtYV9hZGRyX3QgbWFwcGluZzsKLQl1bnNpZ25lZCBpbnQgbnBhZ2VzLCBvcmRlcjsKKwl1bnNpZ25lZCBpbnQgb3JkZXI7CisJdW5zaWduZWQgaW50IG5pb19wYWdlcywgaW9fb3JkZXI7CiAJc3RydWN0IHBhZ2UgKnBhZ2U7CiAKIAlzaXplID0gUEFHRV9BTElHTihzaXplKTsKLQlucGFnZXMgPSBzaXplID4+IFBBR0VfU0hJRlQ7CiAJb3JkZXIgPSBnZXRfb3JkZXIoc2l6ZSk7CiAKICAJLyoKQEAgLTU5OCw4ICs2MDgsMTAgQEAKIAltZW1zZXQocmV0LCAwLCBzaXplKTsKIAogCS8qIFNldCB1cCB0Y2VzIHRvIGNvdmVyIHRoZSBhbGxvY2F0ZWQgcmFuZ2UgKi8KLQltYXBwaW5nID0gaW9tbXVfYWxsb2ModGJsLCByZXQsIG5wYWdlcywgRE1BX0JJRElSRUNUSU9OQUwsCi0JCQkgICAgICBtYXNrID4+IFBBR0VfU0hJRlQsIG9yZGVyKTsKKwluaW9fcGFnZXMgPSBzaXplID4+IElPTU1VX1BBR0VfU0hJRlQ7CisJaW9fb3JkZXIgPSBnZXRfaW9tbXVfb3JkZXIoc2l6ZSk7CisJbWFwcGluZyA9IGlvbW11X2FsbG9jKHRibCwgcmV0LCBuaW9fcGFnZXMsIERNQV9CSURJUkVDVElPTkFMLAorCQkJICAgICAgbWFzayA+PiBJT01NVV9QQUdFX1NISUZULCBpb19vcmRlcik7CiAJaWYgKG1hcHBpbmcgPT0gRE1BX0VSUk9SX0NPREUpIHsKIAkJZnJlZV9wYWdlcygodW5zaWduZWQgbG9uZylyZXQsIG9yZGVyKTsKIAkJcmV0dXJuIE5VTEw7CkBAIC02MTEsMTIgKzYyMywxMyBAQAogdm9pZCBpb21tdV9mcmVlX2NvaGVyZW50KHN0cnVjdCBpb21tdV90YWJsZSAqdGJsLCBzaXplX3Qgc2l6ZSwKIAkJCSB2b2lkICp2YWRkciwgZG1hX2FkZHJfdCBkbWFfaGFuZGxlKQogewotCXVuc2lnbmVkIGludCBucGFnZXM7Ci0KIAlpZiAodGJsKSB7CisJCXVuc2lnbmVkIGludCBuaW9fcGFnZXM7CisKIAkJc2l6ZSA9IFBBR0VfQUxJR04oc2l6ZSk7Ci0JCW5wYWdlcyA9IHNpemUgPj4gUEFHRV9TSElGVDsKLQkJaW9tbXVfZnJlZSh0YmwsIGRtYV9oYW5kbGUsIG5wYWdlcyk7CisJCW5pb19wYWdlcyA9IHNpemUgPj4gSU9NTVVfUEFHRV9TSElGVDsKKwkJaW9tbXVfZnJlZSh0YmwsIGRtYV9oYW5kbGUsIG5pb19wYWdlcyk7CisJCXNpemUgPSBQQUdFX0FMSUdOKHNpemUpOwogCQlmcmVlX3BhZ2VzKCh1bnNpZ25lZCBsb25nKXZhZGRyLCBnZXRfb3JkZXIoc2l6ZSkpOwogCX0KIH0KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvbWlzY18zMi5TIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9taXNjXzMyLlMKaW5kZXggODhmZDczZi4uNDEyYmVhMyAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9taXNjXzMyLlMKKysrIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9taXNjXzMyLlMKQEAgLTEwMiw4MCArMTAyLDYgQEAKIAlibHIKIAogLyoKLSAqIGlkZW50aWZ5X2NwdSwKLSAqIGNhbGxlZCB3aXRoIHIzID0gZGF0YSBvZmZzZXQgYW5kIHI0ID0gQ1BVIG51bWJlcgotICogZG9lc24ndCBjaGFuZ2UgcjMKLSAqLwotX0dMT0JBTChpZGVudGlmeV9jcHUpCi0JYWRkaXMJcjgscjMsY3B1X3NwZWNzQGhhCi0JYWRkaQlyOCxyOCxjcHVfc3BlY3NAbAotCW1mcHZyCXI3Ci0xOgotCWx3eglyNSxDUFVfU1BFQ19QVlJfTUFTSyhyOCkKLQlhbmQJcjUscjUscjcKLQlsd3oJcjYsQ1BVX1NQRUNfUFZSX1ZBTFVFKHI4KQotCWNtcGx3CTAscjYscjUKLQliZXEJMWYKLQlhZGRpCXI4LHI4LENQVV9TUEVDX0VOVFJZX1NJWkUKLQliCTFiCi0xOgotCWFkZGlzCXI2LHIzLGN1cl9jcHVfc3BlY0BoYQotCWFkZGkJcjYscjYsY3VyX2NwdV9zcGVjQGwKLQlzdWIJcjgscjgscjMKLQlzdHcJcjgsMChyNikKLQlibHIKLQotLyoKLSAqIGRvX2NwdV9mdHJfZml4dXBzIC0gZ29lcyB0aHJvdWdoIHRoZSBsaXN0IG9mIENQVSBmZWF0dXJlIGZpeHVwcwotICogYW5kIHdyaXRlcyBub3AncyBvdmVyIHNlY3Rpb25zIG9mIGNvZGUgdGhhdCBkb24ndCBhcHBseSBmb3IgdGhpcyBjcHUuCi0gKiByMyA9IGRhdGEgb2Zmc2V0IChub3QgY2hhbmdlZCkKLSAqLwotX0dMT0JBTChkb19jcHVfZnRyX2ZpeHVwcykKLQkvKiBHZXQgQ1BVIDAgZmVhdHVyZXMgKi8KLQlhZGRpcwlyNixyMyxjdXJfY3B1X3NwZWNAaGEKLQlhZGRpCXI2LHI2LGN1cl9jcHVfc3BlY0BsCi0JbHd6CXI0LDAocjYpCi0JYWRkCXI0LHI0LHIzCi0JbHd6CXI0LENQVV9TUEVDX0ZFQVRVUkVTKHI0KQotCi0JLyogR2V0IHRoZSBmaXh1cCB0YWJsZSAqLwotCWFkZGlzCXI2LHIzLF9fc3RhcnRfX19mdHJfZml4dXBAaGEKLQlhZGRpCXI2LHI2LF9fc3RhcnRfX19mdHJfZml4dXBAbAotCWFkZGlzCXI3LHIzLF9fc3RvcF9fX2Z0cl9maXh1cEBoYQotCWFkZGkJcjcscjcsX19zdG9wX19fZnRyX2ZpeHVwQGwKLQotCS8qIERvIHRoZSBmaXh1cCAqLwotMToJY21wbHcJMCxyNixyNwotCWJnZWxyCi0JYWRkaQlyNixyNiwxNgotCWx3eglyOCwtMTYocjYpCS8qIG1hc2sgKi8KLQlhbmQJcjgscjgscjQKLQlsd3oJcjksLTEyKHI2KQkvKiB2YWx1ZSAqLwotCWNtcGx3CTAscjgscjkKLQliZXEJMWIKLQlsd3oJcjgsLTgocjYpCS8qIHNlY3Rpb24gYmVnaW4gKi8KLQlsd3oJcjksLTQocjYpCS8qIHNlY3Rpb24gZW5kICovCi0Jc3ViZi4JcjkscjgscjkKLQliZXEJMWIKLQkvKiB3cml0ZSBub3BzIG92ZXIgdGhlIHNlY3Rpb24gb2YgY29kZSAqLwotCS8qIHRvZG86IGlmIGxhcmdlIHNlY3Rpb24sIGFkZCBhIGJyYW5jaCBhdCB0aGUgc3RhcnQgb2YgaXQgKi8KLQlzcndpCXI5LHI5LDIKLQltdGN0cglyOQotCWFkZAlyOCxyOCxyMwotCWxpcwlyMCwweDYwMDAwMDAwQGgJLyogbm9wICovCi0zOglzdHcJcjAsMChyOCkKLQlhbmRpLglyMTAscjQsQ1BVX0ZUUl9TUExJVF9JRF9DQUNIRUBsCi0JYmVxCTJmCi0JZGNic3QJMCxyOAkJLyogc3Vib3B0aW1hbCwgYnV0IHNpbXBsZXIgKi8KLQlzeW5jCi0JaWNiaQkwLHI4Ci0yOglhZGRpCXI4LHI4LDQKLQliZG56CTNiCi0Jc3luYwkJCS8qIGFkZGl0aW9uYWwgc3luYyBuZWVkZWQgb24gZzQgKi8KLQlpc3luYwotCWIJMWIKLQotLyoKICAqIGNhbGxfc2V0dXBfY3B1IC0gY2FsbCB0aGUgc2V0dXBfY3B1IGZ1bmN0aW9uIGZvciB0aGlzIGNwdQogICogcjMgPSBkYXRhIG9mZnNldCwgcjI0ID0gY3B1IG51bWJlcgogICoKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvbWlzY182NC5TIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9taXNjXzY0LlMKaW5kZXggYzcwZTIwNy4uMjFmZDJjNiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9taXNjXzY0LlMKKysrIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9taXNjXzY0LlMKQEAgLTI0NiwxMzAgKzI0Niw2IEBACiAJaXN5bmMKIAlibHIKIAotLyoKLSAqIGlkZW50aWZ5X2NwdSBhbmQgY2FsbHMgc2V0dXBfY3B1Ci0gKiBJbjoJcjMgPSBiYXNlIG9mIHRoZSBjcHVfc3BlY3MgYXJyYXkKLSAqCXI0ID0gYWRkcmVzcyBvZiBjdXJfY3B1X3NwZWMKLSAqCXI1ID0gcmVsb2NhdGlvbiBvZmZzZXQKLSAqLwotX0dMT0JBTChpZGVudGlmeV9jcHUpCi0JbWZwdnIJcjcKLTE6Ci0JbHd6CXI4LENQVV9TUEVDX1BWUl9NQVNLKHIzKQotCWFuZAlyOCxyOCxyNwotCWx3eglyOSxDUFVfU1BFQ19QVlJfVkFMVUUocjMpCi0JY21wbHcJMCxyOSxyOAotCWJlcQkxZgotCWFkZGkJcjMscjMsQ1BVX1NQRUNfRU5UUllfU0laRQotCWIJMWIKLTE6Ci0Jc3ViCXIwLHIzLHI1Ci0Jc3RkCXIwLDAocjQpCi0JbGQJcjQsQ1BVX1NQRUNfU0VUVVAocjMpCi0JY21wZGkJMCxyNCwwCi0JYWRkCXI0LHI0LHI1Ci0JYmVxbHIKLQlsZAlyNCwwKHI0KQotCWFkZAlyNCxyNCxyNQotCW10Y3RyCXI0Ci0JLyogQ2FsbGluZyBjb252ZW50aW9uIGZvciBjcHUgc2V0dXAgaXMgcjM9b2Zmc2V0LCByND1jdXJfY3B1X3NwZWMgKi8KLQltcglyNCxyMwotCW1yCXIzLHI1Ci0JYmN0cgotCi0vKgotICogZG9fY3B1X2Z0cl9maXh1cHMgLSBnb2VzIHRocm91Z2ggdGhlIGxpc3Qgb2YgQ1BVIGZlYXR1cmUgZml4dXBzCi0gKiBhbmQgd3JpdGVzIG5vcCdzIG92ZXIgc2VjdGlvbnMgb2YgY29kZSB0aGF0IGRvbid0IGFwcGx5IGZvciB0aGlzIGNwdS4KLSAqIHIzID0gZGF0YSBvZmZzZXQgKG5vdCBjaGFuZ2VkKQotICovCi1fR0xPQkFMKGRvX2NwdV9mdHJfZml4dXBzKQotCS8qIEdldCBDUFUgMCBmZWF0dXJlcyAqLwotCUxPQURfUkVHX0lNTUVESUFURShyNixjdXJfY3B1X3NwZWMpCi0Jc3ViCXI2LHI2LHIzCi0JbGQJcjQsMChyNikKLQlzdWIJcjQscjQscjMKLQlsZAlyNCxDUFVfU1BFQ19GRUFUVVJFUyhyNCkKLQkvKiBHZXQgdGhlIGZpeHVwIHRhYmxlICovCi0JTE9BRF9SRUdfSU1NRURJQVRFKHI2LF9fc3RhcnRfX19mdHJfZml4dXApCi0Jc3ViCXI2LHI2LHIzCi0JTE9BRF9SRUdfSU1NRURJQVRFKHI3LF9fc3RvcF9fX2Z0cl9maXh1cCkKLQlzdWIJcjcscjcscjMKLQkvKiBEbyB0aGUgZml4dXAgKi8KLTE6CWNtcGxkCXI2LHI3Ci0JYmdlbHIKLQlhZGRpCXI2LHI2LDMyCi0JbGQJcjgsLTMyKHI2KQkvKiBtYXNrICovCi0JYW5kCXI4LHI4LHI0Ci0JbGQJcjksLTI0KHI2KQkvKiB2YWx1ZSAqLwotCWNtcGxkCXI4LHI5Ci0JYmVxCTFiCi0JbGQJcjgsLTE2KHI2KQkvKiBzZWN0aW9uIGJlZ2luICovCi0JbGQJcjksLTgocjYpCS8qIHNlY3Rpb24gZW5kICovCi0Jc3ViZi4JcjkscjgscjkKLQliZXEJMWIKLQkvKiB3cml0ZSBub3BzIG92ZXIgdGhlIHNlY3Rpb24gb2YgY29kZSAqLwotCS8qIHRvZG86IGlmIGxhcmdlIHNlY3Rpb24sIGFkZCBhIGJyYW5jaCBhdCB0aGUgc3RhcnQgb2YgaXQgKi8KLQlzcndpCXI5LHI5LDIKLQltdGN0cglyOQotCXN1YglyOCxyOCxyMwotCWxpcwlyMCwweDYwMDAwMDAwQGgJLyogbm9wICovCi0zOglzdHcJcjAsMChyOCkKLQlhbmRpLglyMTAscjQsQ1BVX0ZUUl9TUExJVF9JRF9DQUNIRUBsCi0JYmVxCTJmCi0JZGNic3QJMCxyOAkJLyogc3Vib3B0aW1hbCwgYnV0IHNpbXBsZXIgKi8KLQlzeW5jCi0JaWNiaQkwLHI4Ci0yOglhZGRpCXI4LHI4LDQKLQliZG56CTNiCi0Jc3luYwkJCS8qIGFkZGl0aW9uYWwgc3luYyBuZWVkZWQgb24gZzQgKi8KLQlpc3luYwotCWIJMWIKLQotLyoKLSAqIGRvX2Z3X2Z0cl9maXh1cHMgLSBnb2VzIHRocm91Z2ggdGhlIGxpc3Qgb2YgZmlybXdhcmUgZmVhdHVyZSBmaXh1cHMKLSAqIGFuZCB3cml0ZXMgbm9wJ3Mgb3ZlciBzZWN0aW9ucyBvZiBjb2RlIHRoYXQgZG9uJ3QgYXBwbHkgZm9yIHRoaXMgZmlybXdhcmUuCi0gKiByMyA9IGRhdGEgb2Zmc2V0IChub3QgY2hhbmdlZCkKLSAqLwotX0dMT0JBTChkb19md19mdHJfZml4dXBzKQotCS8qIEdldCBmaXJtd2FyZSBmZWF0dXJlcyAqLwotCUxPQURfUkVHX0lNTUVESUFURShyNixwb3dlcnBjX2Zpcm13YXJlX2ZlYXR1cmVzKQotCXN1YglyNixyNixyMwotCWxkCXI0LDAocjYpCi0JLyogR2V0IHRoZSBmaXh1cCB0YWJsZSAqLwotCUxPQURfUkVHX0lNTUVESUFURShyNixfX3N0YXJ0X19fZndfZnRyX2ZpeHVwKQotCXN1YglyNixyNixyMwotCUxPQURfUkVHX0lNTUVESUFURShyNyxfX3N0b3BfX19md19mdHJfZml4dXApCi0Jc3ViCXI3LHI3LHIzCi0JLyogRG8gdGhlIGZpeHVwICovCi0xOgljbXBsZAlyNixyNwotCWJnZWxyCi0JYWRkaQlyNixyNiwzMgotCWxkCXI4LC0zMihyNikJLyogbWFzayAqLwotCWFuZAlyOCxyOCxyNAotCWxkCXI5LC0yNChyNikJLyogdmFsdWUgKi8KLQljbXBsZAlyOCxyOQotCWJlcQkxYgotCWxkCXI4LC0xNihyNikJLyogc2VjdGlvbiBiZWdpbiAqLwotCWxkCXI5LC04KHI2KQkvKiBzZWN0aW9uIGVuZCAqLwotCXN1YmYuCXI5LHI4LHI5Ci0JYmVxCTFiCi0JLyogd3JpdGUgbm9wcyBvdmVyIHRoZSBzZWN0aW9uIG9mIGNvZGUgKi8KLQkvKiB0b2RvOiBpZiBsYXJnZSBzZWN0aW9uLCBhZGQgYSBicmFuY2ggYXQgdGhlIHN0YXJ0IG9mIGl0ICovCi0Jc3J3aQlyOSxyOSwyCi0JbXRjdHIJcjkKLQlzdWIJcjgscjgscjMKLQlsaXMJcjAsMHg2MDAwMDAwMEBoCS8qIG5vcCAqLwotMzoJc3R3CXIwLDAocjgpCi1CRUdJTl9GVFJfU0VDVElPTgotCWRjYnN0CTAscjgJCS8qIHN1Ym9wdGltYWwsIGJ1dCBzaW1wbGVyICovCi0Jc3luYwotCWljYmkJMCxyOAotRU5EX0ZUUl9TRUNUSU9OX0lGU0VUKENQVV9GVFJfU1BMSVRfSURfQ0FDSEUpCi0JYWRkaQlyOCxyOCw0Ci0JYmRuegkzYgotCXN5bmMJCQkvKiBhZGRpdGlvbmFsIHN5bmMgbmVlZGVkIG9uIGc0ICovCi0JaXN5bmMKLQliCTFiCiAKICNpZiBkZWZpbmVkKENPTkZJR19QUENfUE1BQykgfHwgZGVmaW5lZChDT05GSUdfUFBDX01BUExFKQogLyoKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvbW9kdWxlXzMyLmMgYi9hcmNoL3Bvd2VycGMva2VybmVsL21vZHVsZV8zMi5jCmluZGV4IDkyZjRlNWYuLmUyYzNjNmEgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvbW9kdWxlXzMyLmMKKysrIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9tb2R1bGVfMzIuYwpAQCAtMjQsNiArMjQsOCBAQAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L2NhY2hlLmg+CiAKKyNpbmNsdWRlICJzZXR1cC5oIgorCiAjaWYgMAogI2RlZmluZSBERUJVR1AgcHJpbnRrCiAjZWxzZQpAQCAtMjY5LDMzICsyNzEsNTAgQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIGNvbnN0IEVsZl9TaGRyICpmaW5kX3NlY3Rpb24oY29uc3QgRWxmX0VoZHIgKmhkciwKKwkJCQkgICAgY29uc3QgRWxmX1NoZHIgKnNlY2hkcnMsCisJCQkJICAgIGNvbnN0IGNoYXIgKm5hbWUpCit7CisJY2hhciAqc2Vjc3RyaW5nczsKKwl1bnNpZ25lZCBpbnQgaTsKKworCXNlY3N0cmluZ3MgPSAoY2hhciAqKWhkciArIHNlY2hkcnNbaGRyLT5lX3Noc3RybmR4XS5zaF9vZmZzZXQ7CisJZm9yIChpID0gMTsgaSA8IGhkci0+ZV9zaG51bTsgaSsrKQorCQlpZiAoc3RyY21wKHNlY3N0cmluZ3Mrc2VjaGRyc1tpXS5zaF9uYW1lLCBuYW1lKSA9PSAwKQorCQkJcmV0dXJuICZzZWNoZHJzW2ldOworCXJldHVybiBOVUxMOworfQorCiBpbnQgbW9kdWxlX2ZpbmFsaXplKGNvbnN0IEVsZl9FaGRyICpoZHIsCiAJCSAgICBjb25zdCBFbGZfU2hkciAqc2VjaGRycywKIAkJICAgIHN0cnVjdCBtb2R1bGUgKm1lKQogewotCWNoYXIgKnNlY3N0cmluZ3M7Ci0JdW5zaWduZWQgaW50IGk7CisJY29uc3QgRWxmX1NoZHIgKnNlY3Q7CiAKIAltZS0+YXJjaC5idWdfdGFibGUgPSBOVUxMOwogCW1lLT5hcmNoLm51bV9idWdzID0gMDsKIAogCS8qIEZpbmQgdGhlIF9fYnVnX3RhYmxlIHNlY3Rpb24sIGlmIHByZXNlbnQgKi8KLQlzZWNzdHJpbmdzID0gKGNoYXIgKiloZHIgKyBzZWNoZHJzW2hkci0+ZV9zaHN0cm5keF0uc2hfb2Zmc2V0OwotCWZvciAoaSA9IDE7IGkgPCBoZHItPmVfc2hudW07IGkrKykgewotCQlpZiAoc3RyY21wKHNlY3N0cmluZ3Mrc2VjaGRyc1tpXS5zaF9uYW1lLCAiX19idWdfdGFibGUiKSkKLQkJCWNvbnRpbnVlOwotCQltZS0+YXJjaC5idWdfdGFibGUgPSAodm9pZCAqKSBzZWNoZHJzW2ldLnNoX2FkZHI7Ci0JCW1lLT5hcmNoLm51bV9idWdzID0gc2VjaGRyc1tpXS5zaF9zaXplIC8gc2l6ZW9mKHN0cnVjdCBidWdfZW50cnkpOwotCQlicmVhazsKKwlzZWN0ID0gZmluZF9zZWN0aW9uKGhkciwgc2VjaGRycywgIl9fYnVnX3RhYmxlIik7CisJaWYgKHNlY3QgIT0gTlVMTCkgeworCQltZS0+YXJjaC5idWdfdGFibGUgPSAodm9pZCAqKSBzZWN0LT5zaF9hZGRyOworCQltZS0+YXJjaC5udW1fYnVncyA9IHNlY3QtPnNoX3NpemUgLyBzaXplb2Yoc3RydWN0IGJ1Z19lbnRyeSk7CiAJfQogCi0JLyoKKyAJLyoKIAkgKiBTdHJpY3RseSBzcGVha2luZyB0aGlzIHNob3VsZCBoYXZlIGEgc3BpbmxvY2sgdG8gcHJvdGVjdCBhZ2FpbnN0CiAJICogdHJhdmVyc2FscywgYnV0IHNpbmNlIHdlIG9ubHkgdHJhdmVyc2Ugb24gQlVHKClzLCBhIHNwaW5sb2NrCiAJICogY291bGQgcG90ZW50aWFsbHkgbGVhZCB0byBkZWFkbG9jayBhbmQgdGh1cyBiZSBjb3VudGVyLXByb2R1Y3RpdmUuCiAJICovCiAJbGlzdF9hZGQoJm1lLT5hcmNoLmJ1Z19saXN0LCAmbW9kdWxlX2J1Z19saXN0KTsKIAorCS8qIEFwcGx5IGZlYXR1cmUgZml4dXBzICovCisJc2VjdCA9IGZpbmRfc2VjdGlvbihoZHIsIHNlY2hkcnMsICJfX2Z0cl9maXh1cCIpOworCWlmIChzZWN0ICE9IE5VTEwpCisJCWRvX2ZlYXR1cmVfZml4dXBzKGN1cl9jcHVfc3BlYy0+Y3B1X2ZlYXR1cmVzLAorCQkJCSAgKHZvaWQgKilzZWN0LT5zaF9hZGRyLAorCQkJCSAgKHZvaWQgKilzZWN0LT5zaF9hZGRyICsgc2VjdC0+c2hfc2l6ZSk7CisKIAlyZXR1cm4gMDsKIH0KIApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9tb2R1bGVfNjQuYyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvbW9kdWxlXzY0LmMKaW5kZXggYmEzNDAwMS4uOGRkMWYwYSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9tb2R1bGVfNjQuYworKysgYi9hcmNoL3Bvd2VycGMva2VybmVsL21vZHVsZV82NC5jCkBAIC0yMiw2ICsyMiw5IEBACiAjaW5jbHVkZSA8bGludXgvdm1hbGxvYy5oPgogI2luY2x1ZGUgPGFzbS9tb2R1bGUuaD4KICNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGFzbS9maXJtd2FyZS5oPgorCisjaW5jbHVkZSAic2V0dXAuaCIKIAogLyogRklYTUU6IFdlIGRvbid0IGRvIC5pbml0IHNlcGFyYXRlbHkuICBUbyBkbyB0aGlzLCB3ZSdkIG5lZWQgdG8gaGF2ZQogICAgYSBzZXBhcmF0ZSByMiB2YWx1ZSBpbiB0aGUgaW5pdCBhbmQgY29yZSBzZWN0aW9uLCBhbmQgc3R1YiBiZXR3ZWVuCkBAIC00MDAsNiArNDAzLDExIEBACiAJCQkJfCAodmFsdWUgJiAweDAzZmZmZmZjKTsKIAkJCWJyZWFrOwogCisJCWNhc2UgUl9QUEM2NF9SRUw2NDoKKwkJCS8qIDY0IGJpdHMgcmVsYXRpdmUgKHVzZWQgYnkgZmVhdHVyZXMgZml4dXBzKSAqLworCQkJKmxvY2F0aW9uID0gdmFsdWUgLSAodW5zaWduZWQgbG9uZylsb2NhdGlvbjsKKwkJCWJyZWFrOworCiAJCWRlZmF1bHQ6CiAJCQlwcmludGsoIiVzOiBVbmtub3duIEFERCByZWxvY2F0aW9uOiAlbHVcbiIsCiAJCQkgICAgICAgbWUtPm5hbWUsCkBAIC00MTMsMjMgKzQyMSwzMyBAQAogCiBMSVNUX0hFQUQobW9kdWxlX2J1Z19saXN0KTsKIAotaW50IG1vZHVsZV9maW5hbGl6ZShjb25zdCBFbGZfRWhkciAqaGRyLAotCQljb25zdCBFbGZfU2hkciAqc2VjaGRycywgc3RydWN0IG1vZHVsZSAqbWUpCitzdGF0aWMgY29uc3QgRWxmX1NoZHIgKmZpbmRfc2VjdGlvbihjb25zdCBFbGZfRWhkciAqaGRyLAorCQkJCSAgICBjb25zdCBFbGZfU2hkciAqc2VjaGRycywKKwkJCQkgICAgY29uc3QgY2hhciAqbmFtZSkKIHsKIAljaGFyICpzZWNzdHJpbmdzOwogCXVuc2lnbmVkIGludCBpOwogCisJc2Vjc3RyaW5ncyA9IChjaGFyICopaGRyICsgc2VjaGRyc1toZHItPmVfc2hzdHJuZHhdLnNoX29mZnNldDsKKwlmb3IgKGkgPSAxOyBpIDwgaGRyLT5lX3NobnVtOyBpKyspCisJCWlmIChzdHJjbXAoc2Vjc3RyaW5ncytzZWNoZHJzW2ldLnNoX25hbWUsIG5hbWUpID09IDApCisJCQlyZXR1cm4gJnNlY2hkcnNbaV07CisJcmV0dXJuIE5VTEw7Cit9CisKK2ludCBtb2R1bGVfZmluYWxpemUoY29uc3QgRWxmX0VoZHIgKmhkciwKKwkJY29uc3QgRWxmX1NoZHIgKnNlY2hkcnMsIHN0cnVjdCBtb2R1bGUgKm1lKQoreworCWNvbnN0IEVsZl9TaGRyICpzZWN0OworCiAJbWUtPmFyY2guYnVnX3RhYmxlID0gTlVMTDsKIAltZS0+YXJjaC5udW1fYnVncyA9IDA7CiAKIAkvKiBGaW5kIHRoZSBfX2J1Z190YWJsZSBzZWN0aW9uLCBpZiBwcmVzZW50ICovCi0Jc2Vjc3RyaW5ncyA9IChjaGFyICopaGRyICsgc2VjaGRyc1toZHItPmVfc2hzdHJuZHhdLnNoX29mZnNldDsKLQlmb3IgKGkgPSAxOyBpIDwgaGRyLT5lX3NobnVtOyBpKyspIHsKLQkJaWYgKHN0cmNtcChzZWNzdHJpbmdzK3NlY2hkcnNbaV0uc2hfbmFtZSwgIl9fYnVnX3RhYmxlIikpCi0JCQljb250aW51ZTsKLQkJbWUtPmFyY2guYnVnX3RhYmxlID0gKHZvaWQgKikgc2VjaGRyc1tpXS5zaF9hZGRyOwotCQltZS0+YXJjaC5udW1fYnVncyA9IHNlY2hkcnNbaV0uc2hfc2l6ZSAvIHNpemVvZihzdHJ1Y3QgYnVnX2VudHJ5KTsKLQkJYnJlYWs7CisJc2VjdCA9IGZpbmRfc2VjdGlvbihoZHIsIHNlY2hkcnMsICJfX2J1Z190YWJsZSIpOworCWlmIChzZWN0ICE9IE5VTEwpIHsKKwkJbWUtPmFyY2guYnVnX3RhYmxlID0gKHZvaWQgKikgc2VjdC0+c2hfYWRkcjsKKwkJbWUtPmFyY2gubnVtX2J1Z3MgPSBzZWN0LT5zaF9zaXplIC8gc2l6ZW9mKHN0cnVjdCBidWdfZW50cnkpOwogCX0KIAogCS8qCkBAIC00MzksNiArNDU3LDE5IEBACiAJICovCiAJbGlzdF9hZGQoJm1lLT5hcmNoLmJ1Z19saXN0LCAmbW9kdWxlX2J1Z19saXN0KTsKIAorCS8qIEFwcGx5IGZlYXR1cmUgZml4dXBzICovCisJc2VjdCA9IGZpbmRfc2VjdGlvbihoZHIsIHNlY2hkcnMsICJfX2Z0cl9maXh1cCIpOworCWlmIChzZWN0ICE9IE5VTEwpCisJCWRvX2ZlYXR1cmVfZml4dXBzKGN1cl9jcHVfc3BlYy0+Y3B1X2ZlYXR1cmVzLAorCQkJCSAgKHZvaWQgKilzZWN0LT5zaF9hZGRyLAorCQkJCSAgKHZvaWQgKilzZWN0LT5zaF9hZGRyICsgc2VjdC0+c2hfc2l6ZSk7CisKKwlzZWN0ID0gZmluZF9zZWN0aW9uKGhkciwgc2VjaGRycywgIl9fZndfZnRyX2ZpeHVwIik7CisJaWYgKHNlY3QgIT0gTlVMTCkKKwkJZG9fZmVhdHVyZV9maXh1cHMocG93ZXJwY19maXJtd2FyZV9mZWF0dXJlcywKKwkJCQkgICh2b2lkICopc2VjdC0+c2hfYWRkciwKKwkJCQkgICh2b2lkICopc2VjdC0+c2hfYWRkciArIHNlY3QtPnNoX3NpemUpOworCiAJcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvcGNpXzMyLmMgYi9hcmNoL3Bvd2VycGMva2VybmVsL3BjaV8zMi5jCmluZGV4IDliNDlmODYuLjBkOWZmNzIgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvcGNpXzMyLmMKKysrIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9wY2lfMzIuYwpAQCAtNDQxLDE0ICs0NDEsMTQgQEAKIAkJZW5kID0gcmVzLT5lbmQgLSBvZmY7CiAJCWlvX2Jhc2VfbG8gPSAoc3RhcnQgPj4gOCkgJiBQQ0lfSU9fUkFOR0VfTUFTSzsKIAkJaW9fbGltaXRfbG8gPSAoZW5kID4+IDgpICYgUENJX0lPX1JBTkdFX01BU0s7Ci0JCWlmIChlbmQgPiAweGZmZmYpIHsKLQkJCXBjaV93cml0ZV9jb25maWdfd29yZChkZXYsIFBDSV9JT19CQVNFX1VQUEVSMTYsCi0JCQkJCSAgICAgIHN0YXJ0ID4+IDE2KTsKLQkJCXBjaV93cml0ZV9jb25maWdfd29yZChkZXYsIFBDSV9JT19MSU1JVF9VUFBFUjE2LAotCQkJCQkgICAgICBlbmQgPj4gMTYpOworCQlpZiAoZW5kID4gMHhmZmZmKQogCQkJaW9fYmFzZV9sbyB8PSBQQ0lfSU9fUkFOR0VfVFlQRV8zMjsKLQkJfSBlbHNlCisJCWVsc2UKIAkJCWlvX2Jhc2VfbG8gfD0gUENJX0lPX1JBTkdFX1RZUEVfMTY7CisJCXBjaV93cml0ZV9jb25maWdfd29yZChkZXYsIFBDSV9JT19CQVNFX1VQUEVSMTYsCisJCQkJc3RhcnQgPj4gMTYpOworCQlwY2lfd3JpdGVfY29uZmlnX3dvcmQoZGV2LCBQQ0lfSU9fTElNSVRfVVBQRVIxNiwKKwkJCQllbmQgPj4gMTYpOwogCQlwY2lfd3JpdGVfY29uZmlnX2J5dGUoZGV2LCBQQ0lfSU9fQkFTRSwgaW9fYmFzZV9sbyk7CiAJCXBjaV93cml0ZV9jb25maWdfYnl0ZShkZXYsIFBDSV9JT19MSU1JVCwgaW9fbGltaXRfbG8pOwogCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL3BjaV82NC5jIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9wY2lfNjQuYwppbmRleCA3OGQzYzBmLi45YmFlOGE1IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva2VybmVsL3BjaV82NC5jCisrKyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvcGNpXzY0LmMKQEAgLTE5OSw4ICsxOTksMTQgQEAKIAlwY2lfc2V0dXBfcGNpX2NvbnRyb2xsZXIocGhiKTsKIAlwaGItPmFyY2hfZGF0YSA9IGRldjsKIAlwaGItPmlzX2R5bmFtaWMgPSBtZW1faW5pdF9kb25lOwotCWlmIChkZXYpCi0JCVBIQl9TRVRfTk9ERShwaGIsIG9mX25vZGVfdG9fbmlkKGRldikpOworCWlmIChkZXYpIHsKKwkJaW50IG5pZCA9IG9mX25vZGVfdG9fbmlkKGRldik7CisKKwkJaWYgKG5pZCA8IDAgfHwgIW5vZGVfb25saW5lKG5pZCkpCisJCQluaWQgPSAtMTsKKworCQlQSEJfU0VUX05PREUocGhiLCBuaWQpOworCX0KIAlyZXR1cm4gcGhiOwogfQogCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL3BlcmZtb25fZnNsX2Jvb2tlLmMgYi9hcmNoL3Bvd2VycGMva2VybmVsL3BlcmZtb25fZnNsX2Jvb2tlLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUwZGNmMmIuLjAwMDAwMDAKLS0tIGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9wZXJmbW9uX2ZzbF9ib29rZS5jCisrKyAvZGV2L251bGwKQEAgLTEsMjIxICswLDAgQEAKLS8qIGFyY2gvcG93ZXJwYy9rZXJuZWwvcGVyZm1vbl9mc2xfYm9va2UuYwotICogRnJlZXNjYWxlIEJvb2stRSBQZXJmb3JtYW5jZSBNb25pdG9yIGNvZGUKLSAqCi0gKiBBdXRob3I6IEFuZHkgRmxlbWluZwotICogQ29weXJpZ2h0IChjKSAyMDA0IEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yLCBJbmMKLSAqCi0gKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICogIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiAgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCi0gKiAgMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqLwotCi0jaW5jbHVkZSA8bGludXgvZXJybm8uaD4KLSNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgotI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L21tLmg+Ci0jaW5jbHVkZSA8bGludXgvc3RkZGVmLmg+Ci0jaW5jbHVkZSA8bGludXgvdW5pc3RkLmg+Ci0jaW5jbHVkZSA8bGludXgvcHRyYWNlLmg+Ci0jaW5jbHVkZSA8bGludXgvc2xhYi5oPgotI2luY2x1ZGUgPGxpbnV4L3VzZXIuaD4KLSNpbmNsdWRlIDxsaW51eC9hLm91dC5oPgotI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9wcmN0bC5oPgotCi0jaW5jbHVkZSA8YXNtL3BndGFibGUuaD4KLSNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgotI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KLSNpbmNsdWRlIDxhc20vaW8uaD4KLSNpbmNsdWRlIDxhc20vcmVnLmg+Ci0jaW5jbHVkZSA8YXNtL3htb24uaD4KLSNpbmNsdWRlIDxhc20vcG1jLmg+Ci0KLXN0YXRpYyBpbmxpbmUgdTMyIGdldF9wbWxjYShpbnQgY3RyKTsKLXN0YXRpYyBpbmxpbmUgdm9pZCBzZXRfcG1sY2EoaW50IGN0ciwgdTMyIHBtbGNhKTsKLQotc3RhdGljIGlubGluZSB1MzIgZ2V0X3BtbGNhKGludCBjdHIpCi17Ci0JdTMyIHBtbGNhOwotCi0Jc3dpdGNoIChjdHIpIHsKLQkJY2FzZSAwOgotCQkJcG1sY2EgPSBtZnBtcihQTVJOX1BNTENBMCk7Ci0JCQlicmVhazsKLQkJY2FzZSAxOgotCQkJcG1sY2EgPSBtZnBtcihQTVJOX1BNTENBMSk7Ci0JCQlicmVhazsKLQkJY2FzZSAyOgotCQkJcG1sY2EgPSBtZnBtcihQTVJOX1BNTENBMik7Ci0JCQlicmVhazsKLQkJY2FzZSAzOgotCQkJcG1sY2EgPSBtZnBtcihQTVJOX1BNTENBMyk7Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCXBhbmljKCJCYWQgY3RyIG51bWJlclxuIik7Ci0JfQotCi0JcmV0dXJuIHBtbGNhOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgc2V0X3BtbGNhKGludCBjdHIsIHUzMiBwbWxjYSkKLXsKLQlzd2l0Y2ggKGN0cikgewotCQljYXNlIDA6Ci0JCQltdHBtcihQTVJOX1BNTENBMCwgcG1sY2EpOwotCQkJYnJlYWs7Ci0JCWNhc2UgMToKLQkJCW10cG1yKFBNUk5fUE1MQ0ExLCBwbWxjYSk7Ci0JCQlicmVhazsKLQkJY2FzZSAyOgotCQkJbXRwbXIoUE1STl9QTUxDQTIsIHBtbGNhKTsKLQkJCWJyZWFrOwotCQljYXNlIDM6Ci0JCQltdHBtcihQTVJOX1BNTENBMywgcG1sY2EpOwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQlwYW5pYygiQmFkIGN0ciBudW1iZXJcbiIpOwotCX0KLX0KLQotdm9pZCBpbml0X3BtY19zdG9wKGludCBjdHIpCi17Ci0JdTMyIHBtbGNhID0gKFBNTENBX0ZDIHwgUE1MQ0FfRkNTIHwgUE1MQ0FfRkNVIHwKLQkJCVBNTENBX0ZDTTEgfCBQTUxDQV9GQ00wKTsKLQl1MzIgcG1sY2IgPSAwOwotCi0Jc3dpdGNoIChjdHIpIHsKLQkJY2FzZSAwOgotCQkJbXRwbXIoUE1STl9QTUxDQTAsIHBtbGNhKTsKLQkJCW10cG1yKFBNUk5fUE1MQ0IwLCBwbWxjYik7Ci0JCQlicmVhazsKLQkJY2FzZSAxOgotCQkJbXRwbXIoUE1STl9QTUxDQTEsIHBtbGNhKTsKLQkJCW10cG1yKFBNUk5fUE1MQ0IxLCBwbWxjYik7Ci0JCQlicmVhazsKLQkJY2FzZSAyOgotCQkJbXRwbXIoUE1STl9QTUxDQTIsIHBtbGNhKTsKLQkJCW10cG1yKFBNUk5fUE1MQ0IyLCBwbWxjYik7Ci0JCQlicmVhazsKLQkJY2FzZSAzOgotCQkJbXRwbXIoUE1STl9QTUxDQTMsIHBtbGNhKTsKLQkJCW10cG1yKFBNUk5fUE1MQ0IzLCBwbWxjYik7Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCXBhbmljKCJCYWQgY3RyIG51bWJlciFcbiIpOwotCX0KLX0KLQotdm9pZCBzZXRfcG1jX2V2ZW50KGludCBjdHIsIGludCBldmVudCkKLXsKLQl1MzIgcG1sY2E7Ci0KLQlwbWxjYSA9IGdldF9wbWxjYShjdHIpOwotCi0JcG1sY2EgPSAocG1sY2EgJiB+UE1MQ0FfRVZFTlRfTUFTSykgfAotCQkoKGV2ZW50IDw8IFBNTENBX0VWRU5UX1NISUZUKSAmCi0JCSBQTUxDQV9FVkVOVF9NQVNLKTsKLQotCXNldF9wbWxjYShjdHIsIHBtbGNhKTsKLX0KLQotdm9pZCBzZXRfcG1jX3VzZXJfa2VybmVsKGludCBjdHIsIGludCB1c2VyLCBpbnQga2VybmVsKQotewotCXUzMiBwbWxjYTsKLQotCXBtbGNhID0gZ2V0X3BtbGNhKGN0cik7Ci0KLQlpZih1c2VyKQotCQlwbWxjYSAmPSB+UE1MQ0FfRkNVOwotCWVsc2UKLQkJcG1sY2EgfD0gUE1MQ0FfRkNVOwotCi0JaWYoa2VybmVsKQotCQlwbWxjYSAmPSB+UE1MQ0FfRkNTOwotCWVsc2UKLQkJcG1sY2EgfD0gUE1MQ0FfRkNTOwotCi0Jc2V0X3BtbGNhKGN0ciwgcG1sY2EpOwotfQotCi12b2lkIHNldF9wbWNfbWFya2VkKGludCBjdHIsIGludCBtYXJrMCwgaW50IG1hcmsxKQotewotCXUzMiBwbWxjYSA9IGdldF9wbWxjYShjdHIpOwotCi0JaWYobWFyazApCi0JCXBtbGNhICY9IH5QTUxDQV9GQ00wOwotCWVsc2UKLQkJcG1sY2EgfD0gUE1MQ0FfRkNNMDsKLQotCWlmKG1hcmsxKQotCQlwbWxjYSAmPSB+UE1MQ0FfRkNNMTsKLQllbHNlCi0JCXBtbGNhIHw9IFBNTENBX0ZDTTE7Ci0KLQlzZXRfcG1sY2EoY3RyLCBwbWxjYSk7Ci19Ci0KLXZvaWQgcG1jX3N0YXJ0X2N0cihpbnQgY3RyLCBpbnQgZW5hYmxlKQotewotCXUzMiBwbWxjYSA9IGdldF9wbWxjYShjdHIpOwotCi0JcG1sY2EgJj0gflBNTENBX0ZDOwotCi0JaWYgKGVuYWJsZSkKLQkJcG1sY2EgfD0gUE1MQ0FfQ0U7Ci0JZWxzZQotCQlwbWxjYSAmPSB+UE1MQ0FfQ0U7Ci0KLQlzZXRfcG1sY2EoY3RyLCBwbWxjYSk7Ci19Ci0KLXZvaWQgcG1jX3N0YXJ0X2N0cnMoaW50IGVuYWJsZSkKLXsKLQl1MzIgcG1nYzAgPSBtZnBtcihQTVJOX1BNR0MwKTsKLQotCXBtZ2MwICY9IH5QTUdDMF9GQUM7Ci0JcG1nYzAgfD0gUE1HQzBfRkNFQ0U7Ci0KLQlpZiAoZW5hYmxlKQotCQlwbWdjMCB8PSBQTUdDMF9QTUlFOwotCWVsc2UKLQkJcG1nYzAgJj0gflBNR0MwX1BNSUU7Ci0KLQltdHBtcihQTVJOX1BNR0MwLCBwbWdjMCk7Ci19Ci0KLXZvaWQgcG1jX3N0b3BfY3Rycyh2b2lkKQotewotCXUzMiBwbWdjMCA9IG1mcG1yKFBNUk5fUE1HQzApOwotCi0JcG1nYzAgfD0gUE1HQzBfRkFDOwotCi0JcG1nYzAgJj0gfihQTUdDMF9QTUlFIHwgUE1HQzBfRkNFQ0UpOwotCi0JbXRwbXIoUE1STl9QTUdDMCwgcG1nYzApOwotfQotCi12b2lkIGR1bXBfcG1jcyh2b2lkKQotewotCXByaW50aygicG1nYzA6ICV4XG4iLCBtZnBtcihQTVJOX1BNR0MwKSk7Ci0JcHJpbnRrKCJwbWNcdFx0cG1sY2FcdFx0cG1sY2JcbiIpOwotCXByaW50aygiJTh4XHQlOHhcdCU4eFxuIiwgbWZwbXIoUE1STl9QTUMwKSwKLQkJCW1mcG1yKFBNUk5fUE1MQ0EwKSwgbWZwbXIoUE1STl9QTUxDQjApKTsKLQlwcmludGsoIiU4eFx0JTh4XHQlOHhcbiIsIG1mcG1yKFBNUk5fUE1DMSksCi0JCQltZnBtcihQTVJOX1BNTENBMSksIG1mcG1yKFBNUk5fUE1MQ0IxKSk7Ci0JcHJpbnRrKCIlOHhcdCU4eFx0JTh4XG4iLCBtZnBtcihQTVJOX1BNQzIpLAotCQkJbWZwbXIoUE1STl9QTUxDQTIpLCBtZnBtcihQTVJOX1BNTENCMikpOwotCXByaW50aygiJTh4XHQlOHhcdCU4eFxuIiwgbWZwbXIoUE1STl9QTUMzKSwKLQkJCW1mcG1yKFBNUk5fUE1MQ0EzKSwgbWZwbXIoUE1STl9QTUxDQjMpKTsKLX0KLQotRVhQT1JUX1NZTUJPTChpbml0X3BtY19zdG9wKTsKLUVYUE9SVF9TWU1CT0woc2V0X3BtY19ldmVudCk7Ci1FWFBPUlRfU1lNQk9MKHNldF9wbWNfdXNlcl9rZXJuZWwpOwotRVhQT1JUX1NZTUJPTChzZXRfcG1jX21hcmtlZCk7Ci1FWFBPUlRfU1lNQk9MKHBtY19zdGFydF9jdHIpOwotRVhQT1JUX1NZTUJPTChwbWNfc3RhcnRfY3Rycyk7Ci1FWFBPUlRfU1lNQk9MKHBtY19zdG9wX2N0cnMpOwotRVhQT1JUX1NZTUJPTChkdW1wX3BtY3MpOwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9wbWMuYyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvcG1jLmMKaW5kZXggYTBhMmVmYS4uM2Q4ZjZmNCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9wbWMuYworKysgYi9hcmNoL3Bvd2VycGMva2VybmVsL3BtYy5jCkBAIC03MSw3ICs3MSw3IEBACiAJfQogCiAJcG1jX293bmVyX2NhbGxlciA9IF9fYnVpbHRpbl9yZXR1cm5fYWRkcmVzcygwKTsKLQlwZXJmX2lycSA9IG5ld19wZXJmX2lycSA/IDogZHVtbXlfcGVyZjsKKwlwZXJmX2lycSA9IG5ld19wZXJmX2lycSA/IG5ld19wZXJmX2lycSA6IGR1bW15X3BlcmY7CiAKICBvdXQ6CiAJc3Bpbl91bmxvY2soJnBtY19vd25lcl9sb2NrKTsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvcHJvY2Vzcy5jIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9wcm9jZXNzLmMKaW5kZXggN2IyZjY0NS4uZjNkNGRkNSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9wcm9jZXNzLmMKKysrIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9wcm9jZXNzLmMKQEAgLTM0MSwxMyArMzQxLDYgQEAKIAogc3RhdGljIGludCBpbnN0cnVjdGlvbnNfdG9fcHJpbnQgPSAxNjsKIAotI2lmZGVmIENPTkZJR19QUEM2NAotI2RlZmluZSBCQURfUEMocGMpCSgoUkVHSU9OX0lEKHBjKSAhPSBLRVJORUxfUkVHSU9OX0lEKSAmJiBcCi0JCSAgICAgICAgIChSRUdJT05fSUQocGMpICE9IFZNQUxMT0NfUkVHSU9OX0lEKSkKLSNlbHNlCi0jZGVmaW5lIEJBRF9QQyhwYykJKChwYykgPCBLRVJORUxCQVNFKQotI2VuZGlmCi0KIHN0YXRpYyB2b2lkIHNob3dfaW5zdHJ1Y3Rpb25zKHN0cnVjdCBwdF9yZWdzICpyZWdzKQogewogCWludCBpOwpAQCAtMzY2LDcgKzM1OSw4IEBACiAJCSAqIGJhZCBhZGRyZXNzIGJlY2F1c2UgdGhlIHBjICpzaG91bGQqIG9ubHkgYmUgYQogCQkgKiBrZXJuZWwgYWRkcmVzcy4KIAkJICovCi0JCWlmIChCQURfUEMocGMpIHx8IF9fZ2V0X3VzZXIoaW5zdHIsICh1bnNpZ25lZCBpbnQgX191c2VyICopcGMpKSB7CisJCWlmICghX19rZXJuZWxfdGV4dF9hZGRyZXNzKHBjKSB8fAorCQkgICAgIF9fZ2V0X3VzZXIoaW5zdHIsICh1bnNpZ25lZCBpbnQgX191c2VyICopcGMpKSB7CiAJCQlwcmludGsoIlhYWFhYWFhYICIpOwogCQl9IGVsc2UgewogCQkJaWYgKHJlZ3MtPm5pcCA9PSBwYykKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvcHJvbS5jIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9wcm9tLmMKaW5kZXggODY1Yjk2NC4uYmRiNDEyZCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9wcm9tLmMKKysrIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9wcm9tLmMKQEAgLTEwMTQsNyArMTAxNCw3IEBACiAvKiogQ2hlY2tzIGlmIHRoZSBnaXZlbiAiY29tcGF0IiBzdHJpbmcgbWF0Y2hlcyBvbmUgb2YgdGhlIHN0cmluZ3MgaW4KICAqIHRoZSBkZXZpY2UncyAiY29tcGF0aWJsZSIgcHJvcGVydHkKICAqLwotaW50IGRldmljZV9pc19jb21wYXRpYmxlKHN0cnVjdCBkZXZpY2Vfbm9kZSAqZGV2aWNlLCBjb25zdCBjaGFyICpjb21wYXQpCitpbnQgZGV2aWNlX2lzX2NvbXBhdGlibGUoY29uc3Qgc3RydWN0IGRldmljZV9ub2RlICpkZXZpY2UsIGNvbnN0IGNoYXIgKmNvbXBhdCkKIHsKIAljb25zdCBjaGFyKiBjcDsKIAlpbnQgY3BsZW4sIGw7CkBAIC0xNDkxLDcgKzE0OTEsOCBAQAogX19pbml0Y2FsbChwcm9tX3JlY29uZmlnX3NldHVwKTsKICNlbmRpZgogCi1zdHJ1Y3QgcHJvcGVydHkgKm9mX2ZpbmRfcHJvcGVydHkoc3RydWN0IGRldmljZV9ub2RlICpucCwgY29uc3QgY2hhciAqbmFtZSwKK3N0cnVjdCBwcm9wZXJ0eSAqb2ZfZmluZF9wcm9wZXJ0eShjb25zdCBzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wLAorCQkJCSAgY29uc3QgY2hhciAqbmFtZSwKIAkJCQkgIGludCAqbGVucCkKIHsKIAlzdHJ1Y3QgcHJvcGVydHkgKnBwOwpAQCAtMTUxMiw3ICsxNTEzLDggQEAKICAqIEZpbmQgYSBwcm9wZXJ0eSB3aXRoIGEgZ2l2ZW4gbmFtZSBmb3IgYSBnaXZlbiBub2RlCiAgKiBhbmQgcmV0dXJuIHRoZSB2YWx1ZS4KICAqLwotY29uc3Qgdm9pZCAqZ2V0X3Byb3BlcnR5KHN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAsIGNvbnN0IGNoYXIgKm5hbWUsIGludCAqbGVucCkKK2NvbnN0IHZvaWQgKmdldF9wcm9wZXJ0eShjb25zdCBzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wLCBjb25zdCBjaGFyICpuYW1lLAorCQkJIGludCAqbGVucCkKIHsKIAlzdHJ1Y3QgcHJvcGVydHkgKnBwID0gb2ZfZmluZF9wcm9wZXJ0eShucCxuYW1lLGxlbnApOwogCXJldHVybiBwcCA/IHBwLT52YWx1ZSA6IE5VTEw7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL3J0YXNfZmxhc2guYyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvcnRhc19mbGFzaC5jCmluZGV4IDE0NDJiNjMuLjZmNmZjOTcgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvcnRhc19mbGFzaC5jCisrKyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvcnRhc19mbGFzaC5jCkBAIC03Miw2ICs3MiwxMCBAQAogI2RlZmluZSBWQUxJREFURV9CVUZfU0laRSA0MDk2ICAgIAogI2RlZmluZSBSVEFTX01TR19NQVhMRU4gICA2NAogCisvKiBRdWlyayAtIFJUQVMgcmVxdWlyZXMgNGsgbGlzdCBsZW5ndGggYW5kIGJsb2NrIHNpemUgKi8KKyNkZWZpbmUgUlRBU19CTEtMSVNUX0xFTkdUSCA0MDk2CisjZGVmaW5lIFJUQVNfQkxLX1NJWkUgNDA5NgorCiBzdHJ1Y3QgZmxhc2hfYmxvY2sgewogCWNoYXIgKmRhdGE7CiAJdW5zaWduZWQgbG9uZyBsZW5ndGg7CkBAIC04Myw3ICs4Nyw3IEBACiAgKiBpbnRvIGEgdmVyc2lvbi9sZW5ndGggYW5kIHRyYW5zbGF0ZSB0aGUgcG9pbnRlcnMKICAqIHRvIGFic29sdXRlLgogICovCi0jZGVmaW5lIEZMQVNIX0JMT0NLU19QRVJfTk9ERSAoKFBBR0VfU0laRSAtIDE2KSAvIHNpemVvZihzdHJ1Y3QgZmxhc2hfYmxvY2spKQorI2RlZmluZSBGTEFTSF9CTE9DS1NfUEVSX05PREUgKChSVEFTX0JMS0xJU1RfTEVOR1RIIC0gMTYpIC8gc2l6ZW9mKHN0cnVjdCBmbGFzaF9ibG9jaykpCiBzdHJ1Y3QgZmxhc2hfYmxvY2tfbGlzdCB7CiAJdW5zaWduZWQgbG9uZyBudW1fYmxvY2tzOwogCXN0cnVjdCBmbGFzaF9ibG9ja19saXN0ICpuZXh0OwpAQCAtOTYsNiArMTAwLDkgQEAKIAogc3RhdGljIHN0cnVjdCBmbGFzaF9ibG9ja19saXN0X2hlYWRlciBydGFzX2Zpcm13YXJlX2ZsYXNoX2xpc3QgPSB7MCwgTlVMTH07CiAKKy8qIFVzZSBzbGFiIGNhY2hlIHRvIGd1YXJhbnRlZSA0ayBhbGlnbm1lbnQgKi8KK3N0YXRpYyBrbWVtX2NhY2hlX3QgKmZsYXNoX2Jsb2NrX2NhY2hlID0gTlVMTDsKKwogI2RlZmluZSBGTEFTSF9CTE9DS19MSVNUX1ZFUlNJT04gKDFVTCkKIAogLyogTG9jYWwgY29weSBvZiB0aGUgZmxhc2ggYmxvY2sgbGlzdC4KQEAgLTE1Myw3ICsxNjAsNyBAQAogCQkJCXJldHVybiBGTEFTSF9JTUdfTlVMTF9EQVRBOwogCQkJfQogCQkJYmxvY2tfc2l6ZSA9IGYtPmJsb2Nrc1tpXS5sZW5ndGg7Ci0JCQlpZiAoYmxvY2tfc2l6ZSA8PSAwIHx8IGJsb2NrX3NpemUgPiBQQUdFX1NJWkUpIHsKKwkJCWlmIChibG9ja19zaXplIDw9IDAgfHwgYmxvY2tfc2l6ZSA+IFJUQVNfQkxLX1NJWkUpIHsKIAkJCQlyZXR1cm4gRkxBU0hfSU1HX0JBRF9MRU47CiAJCQl9CiAJCQlpbWFnZV9zaXplICs9IGJsb2NrX3NpemU7CkBAIC0xNzcsOSArMTg0LDkgQEAKIAogCXdoaWxlIChmKSB7CiAJCWZvciAoaSA9IDA7IGkgPCBmLT5udW1fYmxvY2tzOyBpKyspCi0JCQlmcmVlX3BhZ2UoKHVuc2lnbmVkIGxvbmcpKGYtPmJsb2Nrc1tpXS5kYXRhKSk7CisJCQlrbWVtX2NhY2hlX2ZyZWUoZmxhc2hfYmxvY2tfY2FjaGUsIGYtPmJsb2Nrc1tpXS5kYXRhKTsKIAkJbmV4dCA9IGYtPm5leHQ7Ci0JCWZyZWVfcGFnZSgodW5zaWduZWQgbG9uZylmKTsKKwkJa21lbV9jYWNoZV9mcmVlKGZsYXNoX2Jsb2NrX2NhY2hlLCBmKTsKIAkJZiA9IG5leHQ7CiAJfQogfQpAQCAtMjc4LDYgKzI4NSwxMiBAQAogCXJldHVybiBtc2dsZW47CiB9CiAKKy8qIGNvbnN0cnVjdG9yIGZvciBmbGFzaF9ibG9ja19jYWNoZSAqLwordm9pZCBydGFzX2Jsb2NrX2N0b3Iodm9pZCAqcHRyLCBrbWVtX2NhY2hlX3QgKmNhY2hlLCB1bnNpZ25lZCBsb25nIGZsYWdzKQoreworCW1lbXNldChwdHIsIDAsIFJUQVNfQkxLX1NJWkUpOworfQorCiAvKiBXZSBjb3VsZCBiZSBtdWNoIG1vcmUgZWZmaWNpZW50IGhlcmUuICBCdXQgdG8ga2VlcCB0aGlzIGZ1bmN0aW9uCiAgKiBzaW1wbGUgd2UgYWxsb2NhdGUgYSBwYWdlIHRvIHRoZSBibG9jayBsaXN0IG5vIG1hdHRlciBob3cgc21hbGwgdGhlCiAgKiBjb3VudCBpcy4gIElmIHRoZSBzeXN0ZW0gaXMgbG93IG9uIG1lbW9yeSBpdCB3aWxsIGJlIGp1c3QgYXMgd2VsbApAQCAtMzAyLDcgKzMxNSw3IEBACiAJICogcHJvYyBmaWxlCiAJICovCiAJaWYgKHVmLT5mbGlzdCA9PSBOVUxMKSB7Ci0JCXVmLT5mbGlzdCA9IChzdHJ1Y3QgZmxhc2hfYmxvY2tfbGlzdCAqKSBnZXRfemVyb2VkX3BhZ2UoR0ZQX0tFUk5FTCk7CisJCXVmLT5mbGlzdCA9IGttZW1fY2FjaGVfYWxsb2MoZmxhc2hfYmxvY2tfY2FjaGUsIEdGUF9LRVJORUwpOwogCQlpZiAoIXVmLT5mbGlzdCkKIAkJCXJldHVybiAtRU5PTUVNOwogCX0KQEAgLTMxMywyMSArMzI2LDIxIEBACiAJbmV4dF9mcmVlID0gZmwtPm51bV9ibG9ja3M7CiAJaWYgKG5leHRfZnJlZSA9PSBGTEFTSF9CTE9DS1NfUEVSX05PREUpIHsKIAkJLyogTmVlZCB0byBhbGxvY2F0ZSBhbm90aGVyIGJsb2NrX2xpc3QgKi8KLQkJZmwtPm5leHQgPSAoc3RydWN0IGZsYXNoX2Jsb2NrX2xpc3QgKilnZXRfemVyb2VkX3BhZ2UoR0ZQX0tFUk5FTCk7CisJCWZsLT5uZXh0ID0ga21lbV9jYWNoZV9hbGxvYyhmbGFzaF9ibG9ja19jYWNoZSwgR0ZQX0tFUk5FTCk7CiAJCWlmICghZmwtPm5leHQpCiAJCQlyZXR1cm4gLUVOT01FTTsKIAkJZmwgPSBmbC0+bmV4dDsKIAkJbmV4dF9mcmVlID0gMDsKIAl9CiAKLQlpZiAoY291bnQgPiBQQUdFX1NJWkUpCi0JCWNvdW50ID0gUEFHRV9TSVpFOwotCXAgPSAoY2hhciAqKWdldF96ZXJvZWRfcGFnZShHRlBfS0VSTkVMKTsKKwlpZiAoY291bnQgPiBSVEFTX0JMS19TSVpFKQorCQljb3VudCA9IFJUQVNfQkxLX1NJWkU7CisJcCA9IGttZW1fY2FjaGVfYWxsb2MoZmxhc2hfYmxvY2tfY2FjaGUsIEdGUF9LRVJORUwpOwogCWlmICghcCkKIAkJcmV0dXJuIC1FTk9NRU07CiAJCiAJaWYoY29weV9mcm9tX3VzZXIocCwgYnVmZmVyLCBjb3VudCkpIHsKLQkJZnJlZV9wYWdlKCh1bnNpZ25lZCBsb25nKXApOworCQlrbWVtX2NhY2hlX2ZyZWUoZmxhc2hfYmxvY2tfY2FjaGUsIHApOwogCQlyZXR1cm4gLUVGQVVMVDsKIAl9CiAJZmwtPmJsb2Nrc1tuZXh0X2ZyZWVdLmRhdGEgPSBwOwpAQCAtNzkxLDYgKzgwNCwxNiBAQAogCQlnb3RvIGNsZWFudXA7CiAKIAlydGFzX2ZsYXNoX3Rlcm1faG9vayA9IHJ0YXNfZmxhc2hfZmlybXdhcmU7CisKKwlmbGFzaF9ibG9ja19jYWNoZSA9IGttZW1fY2FjaGVfY3JlYXRlKCJydGFzX2ZsYXNoX2NhY2hlIiwKKwkJCQlSVEFTX0JMS19TSVpFLCBSVEFTX0JMS19TSVpFLCAwLAorCQkJCXJ0YXNfYmxvY2tfY3RvciwgTlVMTCk7CisJaWYgKCFmbGFzaF9ibG9ja19jYWNoZSkgeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiBmYWlsZWQgdG8gY3JlYXRlIGJsb2NrIGNhY2hlXG4iLAorCQkJCV9fRlVOQ1RJT05fXyk7CisJCXJjID0gLUVOT01FTTsKKwkJZ290byBjbGVhbnVwOworCX0KIAlyZXR1cm4gMDsKIAogY2xlYW51cDoKQEAgLTgwNSw2ICs4MjgsMTAgQEAKIHZvaWQgX19leGl0IHJ0YXNfZmxhc2hfY2xlYW51cCh2b2lkKQogewogCXJ0YXNfZmxhc2hfdGVybV9ob29rID0gTlVMTDsKKworCWlmIChmbGFzaF9ibG9ja19jYWNoZSkKKwkJa21lbV9jYWNoZV9kZXN0cm95KGZsYXNoX2Jsb2NrX2NhY2hlKTsKKwogCXJlbW92ZV9mbGFzaF9wZGUoZmlybXdhcmVfZmxhc2hfcGRlKTsKIAlyZW1vdmVfZmxhc2hfcGRlKGZpcm13YXJlX3VwZGF0ZV9wZGUpOwogCXJlbW92ZV9mbGFzaF9wZGUodmFsaWRhdGVfcGRlKTsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvc2V0dXBfMzIuYyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvc2V0dXBfMzIuYwppbmRleCAxOTFkMGFiLi5hNGMyOTY0IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva2VybmVsL3NldHVwXzMyLmMKKysrIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9zZXR1cF8zMi5jCkBAIC05MSw2ICs5MSw3IEBACiB1bnNpZ25lZCBsb25nIF9faW5pdCBlYXJseV9pbml0KHVuc2lnbmVkIGxvbmcgZHRfcHRyKQogewogCXVuc2lnbmVkIGxvbmcgb2Zmc2V0ID0gcmVsb2Nfb2Zmc2V0KCk7CisJc3RydWN0IGNwdV9zcGVjICpzcGVjOwogCiAJLyogRmlyc3QgemVybyB0aGUgQlNTIC0tIHVzZSBtZW1zZXRfaW8sIHNvbWUgcGxhdGZvcm1zIGRvbid0IGhhdmUKIAkgKiBjYWNoZXMgb24geWV0ICovCkBAIC0xMDAsOCArMTAxLDExIEBACiAJICogSWRlbnRpZnkgdGhlIENQVSB0eXBlIGFuZCBmaXggdXAgY29kZSBzZWN0aW9ucwogCSAqIHRoYXQgZGVwZW5kIG9uIHdoaWNoIGNwdSB3ZSBoYXZlLgogCSAqLwotCWlkZW50aWZ5X2NwdShvZmZzZXQsIDApOwotCWRvX2NwdV9mdHJfZml4dXBzKG9mZnNldCk7CisJc3BlYyA9IGlkZW50aWZ5X2NwdShvZmZzZXQpOworCisJZG9fZmVhdHVyZV9maXh1cHMoc3BlYy0+Y3B1X2ZlYXR1cmVzLAorCQkJICBQVFJSRUxPQygmX19zdGFydF9fX2Z0cl9maXh1cCksCisJCQkgIFBUUlJFTE9DKCZfX3N0b3BfX19mdHJfZml4dXApKTsKIAogCXJldHVybiBLRVJORUxCQVNFICsgb2Zmc2V0OwogfQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9zZXR1cF82NC5jIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9zZXR1cF82NC5jCmluZGV4IDRiMmUzMmUuLjE2Mjc4OTYgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvc2V0dXBfNjQuYworKysgYi9hcmNoL3Bvd2VycGMva2VybmVsL3NldHVwXzY0LmMKQEAgLTE3MCw2ICsxNzAsOSBAQAogCiB2b2lkIF9faW5pdCBlYXJseV9zZXR1cCh1bnNpZ25lZCBsb25nIGR0X3B0cikKIHsKKwkvKiBJZGVudGlmeSBDUFUgdHlwZSAqLworCWlkZW50aWZ5X2NwdSgwKTsKKwogCS8qIEFzc3VtZSB3ZSdyZSBvbiBjcHUgMCBmb3Igbm93LiBEb24ndCB3cml0ZSB0byB0aGUgcGFjYSB5ZXQhICovCiAJc2V0dXBfcGFjYSgwKTsKIApAQCAtMzQ4LDYgKzM1MSwxNCBAQAogewogCURCRygiIC0+IHNldHVwX3N5c3RlbSgpXG4iKTsKIAorCS8qIEFwcGx5IHRoZSBDUFVzLXNwZWNpZmljIGFuZCBmaXJtd2FyZSBzcGVjaWZpYyBmaXh1cHMgdG8ga2VybmVsCisJICogdGV4dCAobm9wIG91dCBzZWN0aW9ucyBub3QgcmVsZXZhbnQgdG8gdGhpcyBDUFUgb3IgdGhpcyBmaXJtd2FyZSkKKwkgKi8KKwlkb19mZWF0dXJlX2ZpeHVwcyhjdXJfY3B1X3NwZWMtPmNwdV9mZWF0dXJlcywKKwkJCSAgJl9fc3RhcnRfX19mdHJfZml4dXAsICZfX3N0b3BfX19mdHJfZml4dXApOworCWRvX2ZlYXR1cmVfZml4dXBzKHBvd2VycGNfZmlybXdhcmVfZmVhdHVyZXMsCisJCQkgICZfX3N0YXJ0X19fZndfZnRyX2ZpeHVwLCAmX19zdG9wX19fZndfZnRyX2ZpeHVwKTsKKwogCS8qCiAJICogVW5mbGF0dGVuIHRoZSBkZXZpY2UtdHJlZSBwYXNzZWQgYnkgcHJvbV9pbml0IG9yIGtleGVjCiAJICovCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL3RpbWUuYyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvdGltZS5jCmluZGV4IDViNTliYzEuLjQ2YTI0ZGUgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvdGltZS5jCisrKyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvdGltZS5jCkBAIC0yMjAsMTEgKzIyMCw4IEBACiAgKi8KIHN0cnVjdCBjcHVfcHVycl9kYXRhIHsKIAlpbnQJaW5pdGlhbGl6ZWQ7CQkJLyogdGhyZWFkIGlzIHJ1bm5pbmcgKi8KLQl1NjQJdGIwOwkJCS8qIHRpbWViYXNlIGF0IG9yaWdpbiB0aW1lICovCi0JdTY0CXB1cnIwOwkJCS8qIFBVUlIgYXQgb3JpZ2luIHRpbWUgKi8KIAl1NjQJdGI7CQkJLyogbGFzdCBUQiB2YWx1ZSByZWFkICovCiAJdTY0CXB1cnI7CQkJLyogbGFzdCBQVVJSIHZhbHVlIHJlYWQgKi8KLQl1NjQJc3RvbGVuOwkJCS8qIHN0b2xlbiB0aW1lIHNvIGZhciAqLwogCXNwaW5sb2NrX3QgbG9jazsKIH07CiAKQEAgLTIzNCwxMCArMjMxLDggQEAKIHsKIAlzdHJ1Y3QgY3B1X3B1cnJfZGF0YSAqcCA9ICZfX2dldF9jcHVfdmFyKGNwdV9wdXJyX2RhdGEpOwogCi0JcC0+dGIwID0gbWZ0YigpOwotCXAtPnB1cnIwID0gbWZzcHIoU1BSTl9QVVJSKTsKLQlwLT50YiA9IHAtPnRiMDsKLQlwLT5wdXJyID0gMDsKKwlwLT50YiA9IG1mdGIoKTsKKwlwLT5wdXJyID0gbWZzcHIoU1BSTl9QVVJSKTsKIAl3bWIoKTsKIAlwLT5pbml0aWFsaXplZCA9IDE7CiB9CkBAIC0yNTgsMzcgKzI1MywyNCBAQAogCiB2b2lkIGNhbGN1bGF0ZV9zdGVhbF90aW1lKHZvaWQpCiB7Ci0JdTY0IHRiLCBwdXJyLCB0MDsKKwl1NjQgdGIsIHB1cnI7CiAJczY0IHN0b2xlbjsKLQlzdHJ1Y3QgY3B1X3B1cnJfZGF0YSAqcDAsICpwbWUsICpwaGltOwotCWludCBjcHU7CisJc3RydWN0IGNwdV9wdXJyX2RhdGEgKnBtZTsKIAogCWlmICghY3B1X2hhc19mZWF0dXJlKENQVV9GVFJfUFVSUikpCiAJCXJldHVybjsKLQljcHUgPSBzbXBfcHJvY2Vzc29yX2lkKCk7Ci0JcG1lID0gJnBlcl9jcHUoY3B1X3B1cnJfZGF0YSwgY3B1KTsKKwlwbWUgPSAmcGVyX2NwdShjcHVfcHVycl9kYXRhLCBzbXBfcHJvY2Vzc29yX2lkKCkpOwogCWlmICghcG1lLT5pbml0aWFsaXplZCkKIAkJcmV0dXJuOwkJLyogdGhpcyBjYW4gaGFwcGVuIGluIGVhcmx5IGJvb3QgKi8KLQlwMCA9ICZwZXJfY3B1KGNwdV9wdXJyX2RhdGEsIGNwdSAmIH4xKTsKLQlwaGltID0gJnBlcl9jcHUoY3B1X3B1cnJfZGF0YSwgY3B1IF4gMSk7Ci0Jc3Bpbl9sb2NrKCZwMC0+bG9jayk7CisJc3Bpbl9sb2NrKCZwbWUtPmxvY2spOwogCXRiID0gbWZ0YigpOwotCXB1cnIgPSBtZnNwcihTUFJOX1BVUlIpIC0gcG1lLT5wdXJyMDsKLQlpZiAoIXBoaW0tPmluaXRpYWxpemVkIHx8ICFjcHVfb25saW5lKGNwdSBeIDEpKSB7Ci0JCXN0b2xlbiA9ICh0YiAtIHBtZS0+dGIpIC0gKHB1cnIgLSBwbWUtPnB1cnIpOwotCX0gZWxzZSB7Ci0JCXQwID0gcG1lLT50YjA7Ci0JCWlmIChwaGltLT50YjAgPCB0MCkKLQkJCXQwID0gcGhpbS0+dGIwOwotCQlzdG9sZW4gPSBwaGltLT50YiAtIHQwIC0gcGhpbS0+cHVyciAtIHB1cnIgLSBwMC0+c3RvbGVuOwotCX0KLQlpZiAoc3RvbGVuID4gMCkgeworCXB1cnIgPSBtZnNwcihTUFJOX1BVUlIpOworCXN0b2xlbiA9ICh0YiAtIHBtZS0+dGIpIC0gKHB1cnIgLSBwbWUtPnB1cnIpOworCWlmIChzdG9sZW4gPiAwKQogCQlhY2NvdW50X3N0ZWFsX3RpbWUoY3VycmVudCwgc3RvbGVuKTsKLQkJcDAtPnN0b2xlbiArPSBzdG9sZW47Ci0JfQogCXBtZS0+dGIgPSB0YjsKIAlwbWUtPnB1cnIgPSBwdXJyOwotCXNwaW5fdW5sb2NrKCZwMC0+bG9jayk7CisJc3Bpbl91bmxvY2soJnBtZS0+bG9jayk7CiB9CiAKIC8qCkBAIC0yOTcsMzAgKzI3OSwxNyBAQAogICovCiBzdGF0aWMgdm9pZCBzbmFwc2hvdF9wdXJyKHZvaWQpCiB7Ci0JaW50IGNwdTsKLQl1NjQgcHVycjsKLQlzdHJ1Y3QgY3B1X3B1cnJfZGF0YSAqcDAsICpwbWUsICpwaGltOworCXN0cnVjdCBjcHVfcHVycl9kYXRhICpwbWU7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAogCWlmICghY3B1X2hhc19mZWF0dXJlKENQVV9GVFJfUFVSUikpCiAJCXJldHVybjsKLQljcHUgPSBzbXBfcHJvY2Vzc29yX2lkKCk7Ci0JcG1lID0gJnBlcl9jcHUoY3B1X3B1cnJfZGF0YSwgY3B1KTsKLQlwMCA9ICZwZXJfY3B1KGNwdV9wdXJyX2RhdGEsIGNwdSAmIH4xKTsKLQlwaGltID0gJnBlcl9jcHUoY3B1X3B1cnJfZGF0YSwgY3B1IF4gMSk7Ci0Jc3Bpbl9sb2NrX2lycXNhdmUoJnAwLT5sb2NrLCBmbGFncyk7Ci0JcG1lLT50YiA9IHBtZS0+dGIwID0gbWZ0YigpOwotCXB1cnIgPSBtZnNwcihTUFJOX1BVUlIpOwotCWlmICghcGhpbS0+aW5pdGlhbGl6ZWQpIHsKLQkJcG1lLT5wdXJyID0gMDsKLQkJcG1lLT5wdXJyMCA9IHB1cnI7Ci0JfSBlbHNlIHsKLQkJLyogc2V0IHAtPnB1cnIgYW5kIHAtPnB1cnIwIGZvciBubyBjaGFuZ2UgaW4gcDAtPnN0b2xlbiAqLwotCQlwbWUtPnB1cnIgPSBwaGltLT50YiAtIHBoaW0tPnRiMCAtIHBoaW0tPnB1cnIgLSBwMC0+c3RvbGVuOwotCQlwbWUtPnB1cnIwID0gcHVyciAtIHBtZS0+cHVycjsKLQl9CisJcG1lID0gJnBlcl9jcHUoY3B1X3B1cnJfZGF0YSwgc21wX3Byb2Nlc3Nvcl9pZCgpKTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcG1lLT5sb2NrLCBmbGFncyk7CisJcG1lLT50YiA9IG1mdGIoKTsKKwlwbWUtPnB1cnIgPSBtZnNwcihTUFJOX1BVUlIpOwogCXBtZS0+aW5pdGlhbGl6ZWQgPSAxOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnAwLT5sb2NrLCBmbGFncyk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcG1lLT5sb2NrLCBmbGFncyk7CiB9CiAKICNlbmRpZiAvKiBDT05GSUdfUFBDX1NQTFBBUiAqLwpAQCAtMTA0NSw0OCArMTAxNCw2IEBACiAJc2V0X2RlYyh0Yl90aWNrc19wZXJfamlmZnkpOwogfQogCi0jaWZkZWYgQ09ORklHX1JUQ19DTEFTUwotc3RhdGljIGludCBzZXRfcnRjX2NsYXNzX3RpbWUoc3RydWN0IHJ0Y190aW1lICp0bSkKLXsKLQlpbnQgZXJyOwotCXN0cnVjdCBjbGFzc19kZXZpY2UgKmNsYXNzX2RldiA9Ci0JCXJ0Y19jbGFzc19vcGVuKENPTkZJR19SVENfSENUT1NZU19ERVZJQ0UpOwotCi0JaWYgKGNsYXNzX2RldiA9PSBOVUxMKQotCQlyZXR1cm4gLUVOT0RFVjsKLQotCWVyciA9IHJ0Y19zZXRfdGltZShjbGFzc19kZXYsIHRtKTsKLQotCXJ0Y19jbGFzc19jbG9zZShjbGFzc19kZXYpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB2b2lkIGdldF9ydGNfY2xhc3NfdGltZShzdHJ1Y3QgcnRjX3RpbWUgKnRtKQotewotCWludCBlcnI7Ci0Jc3RydWN0IGNsYXNzX2RldmljZSAqY2xhc3NfZGV2ID0KLQkJcnRjX2NsYXNzX29wZW4oQ09ORklHX1JUQ19IQ1RPU1lTX0RFVklDRSk7Ci0KLQlpZiAoY2xhc3NfZGV2ID09IE5VTEwpCi0JCXJldHVybjsKLQotCWVyciA9IHJ0Y19yZWFkX3RpbWUoY2xhc3NfZGV2LCB0bSk7Ci0KLQlydGNfY2xhc3NfY2xvc2UoY2xhc3NfZGV2KTsKLQotCXJldHVybjsKLX0KLQotaW50IF9faW5pdCBydGNfY2xhc3NfaG9va3VwKHZvaWQpCi17Ci0JcHBjX21kLmdldF9ydGNfdGltZSA9IGdldF9ydGNfY2xhc3NfdGltZTsKLQlwcGNfbWQuc2V0X3J0Y190aW1lID0gc2V0X3J0Y19jbGFzc190aW1lOwotCi0JcmV0dXJuIDA7Ci19Ci0jZW5kaWYgLyogQ09ORklHX1JUQ19DTEFTUyAqLwotCiAKICNkZWZpbmUgRkVCUlVBUlkJMgogI2RlZmluZQlTVEFSVE9GVElNRQkxOTcwCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL3RyYXBzLmMgYi9hcmNoL3Bvd2VycGMva2VybmVsL3RyYXBzLmMKaW5kZXggZDlmMTBmMmYuLmM2NmI0NzcgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvdHJhcHMuYworKysgYi9hcmNoL3Bvd2VycGMva2VybmVsL3RyYXBzLmMKQEAgLTg0Myw3ICs4NDMsNyBAQAogCiB2b2lkIGFsaWdubWVudF9leGNlcHRpb24oc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCiB7Ci0JaW50IGZpeGVkID0gMDsKKwlpbnQgc2lnLCBjb2RlLCBmaXhlZCA9IDA7CiAKIAkvKiB3ZSBkb24ndCBpbXBsZW1lbnQgbG9nZ2luZyBvZiBhbGlnbm1lbnQgZXhjZXB0aW9ucyAqLwogCWlmICghKGN1cnJlbnQtPnRocmVhZC5hbGlnbl9jdGwgJiBQUl9VTkFMSUdOX1NJR0JVUykpCkBAIC04NTcsMTQgKzg1NywxNiBAQAogCiAJLyogT3BlcmFuZCBhZGRyZXNzIHdhcyBiYWQgKi8KIAlpZiAoZml4ZWQgPT0gLUVGQVVMVCkgewotCQlpZiAodXNlcl9tb2RlKHJlZ3MpKQotCQkJX2V4Y2VwdGlvbihTSUdTRUdWLCByZWdzLCBTRUdWX0FDQ0VSUiwgcmVncy0+ZGFyKTsKLQkJZWxzZQotCQkJLyogU2VhcmNoIGV4Y2VwdGlvbiB0YWJsZSAqLwotCQkJYmFkX3BhZ2VfZmF1bHQocmVncywgcmVncy0+ZGFyLCBTSUdTRUdWKTsKLQkJcmV0dXJuOworCQlzaWcgPSBTSUdTRUdWOworCQljb2RlID0gU0VHVl9BQ0NFUlI7CisJfSBlbHNlIHsKKwkJc2lnID0gU0lHQlVTOworCQljb2RlID0gQlVTX0FEUkFMTjsKIAl9Ci0JX2V4Y2VwdGlvbihTSUdCVVMsIHJlZ3MsIEJVU19BRFJBTE4sIHJlZ3MtPmRhcik7CisJaWYgKHVzZXJfbW9kZShyZWdzKSkKKwkJX2V4Y2VwdGlvbihzaWcsIHJlZ3MsIGNvZGUsIHJlZ3MtPmRhcik7CisJZWxzZQorCQliYWRfcGFnZV9mYXVsdChyZWdzLCByZWdzLT5kYXIsIHNpZyk7CiB9CiAKIHZvaWQgU3RhY2tPdmVyZmxvdyhzdHJ1Y3QgcHRfcmVncyAqcmVncykKQEAgLTkwMCwxNCArOTAyLDEzIEBACiAKIHZvaWQgYWx0aXZlY191bmF2YWlsYWJsZV9leGNlcHRpb24oc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCiB7Ci0jaWYgIWRlZmluZWQoQ09ORklHX0FMVElWRUMpCiAJaWYgKHVzZXJfbW9kZShyZWdzKSkgewogCQkvKiBBIHVzZXIgcHJvZ3JhbSBoYXMgZXhlY3V0ZWQgYW4gYWx0aXZlYyBpbnN0cnVjdGlvbiwKIAkJICAgYnV0IHRoaXMga2VybmVsIGRvZXNuJ3Qgc3VwcG9ydCBhbHRpdmVjLiAqLwogCQlfZXhjZXB0aW9uKFNJR0lMTCwgcmVncywgSUxMX0lMTE9QQywgcmVncy0+bmlwKTsKIAkJcmV0dXJuOwogCX0KLSNlbmRpZgorCiAJcHJpbnRrKEtFUk5fRU1FUkcgIlVucmVjb3ZlcmFibGUgVk1YL0FsdGl2ZWMgVW5hdmFpbGFibGUgRXhjZXB0aW9uICIKIAkJCSIlbHggYXQgJWx4XG4iLCByZWdzLT50cmFwLCByZWdzLT5uaXApOwogCWRpZSgiVW5yZWNvdmVyYWJsZSBWTVgvQWx0aXZlYyBVbmF2YWlsYWJsZSBFeGNlcHRpb24iLCByZWdzLCBTSUdBQlJUKTsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvdmRzby5jIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC92ZHNvLmMKaW5kZXggMWE3ZTE5Yy4uYzkxM2FkNSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2tlcm5lbC92ZHNvLmMKKysrIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC92ZHNvLmMKQEAgLTM2LDYgKzM2LDggQEAKICNpbmNsdWRlIDxhc20vdmRzby5oPgogI2luY2x1ZGUgPGFzbS92ZHNvX2RhdGFwYWdlLmg+CiAKKyNpbmNsdWRlICJzZXR1cC5oIgorCiAjdW5kZWYgREVCVUcKIAogI2lmZGVmIERFQlVHCkBAIC01ODYsNiArNTg4LDQzIEBACiAJcmV0dXJuIDA7CiB9CiAKKworc3RhdGljIF9faW5pdCBpbnQgdmRzb19maXh1cF9mZWF0dXJlcyhzdHJ1Y3QgbGliMzJfZWxmaW5mbyAqdjMyLAorCQkJCSAgICAgIHN0cnVjdCBsaWI2NF9lbGZpbmZvICp2NjQpCit7CisJdm9pZCAqc3RhcnQzMjsKKwl1bnNpZ25lZCBsb25nIHNpemUzMjsKKworI2lmZGVmIENPTkZJR19QUEM2NAorCXZvaWQgKnN0YXJ0NjQ7CisJdW5zaWduZWQgbG9uZyBzaXplNjQ7CisKKwlzdGFydDY0ID0gZmluZF9zZWN0aW9uNjQodjY0LT5oZHIsICJfX2Z0cl9maXh1cCIsICZzaXplNjQpOworCWlmIChzdGFydDY0KQorCQlkb19mZWF0dXJlX2ZpeHVwcyhjdXJfY3B1X3NwZWMtPmNwdV9mZWF0dXJlcywKKwkJCQkgIHN0YXJ0NjQsIHN0YXJ0NjQgKyBzaXplNjQpOworCisJc3RhcnQ2NCA9IGZpbmRfc2VjdGlvbjY0KHY2NC0+aGRyLCAiX19md19mdHJfZml4dXAiLCAmc2l6ZTY0KTsKKwlpZiAoc3RhcnQ2NCkKKwkJZG9fZmVhdHVyZV9maXh1cHMocG93ZXJwY19maXJtd2FyZV9mZWF0dXJlcywKKwkJCQkgIHN0YXJ0NjQsIHN0YXJ0NjQgKyBzaXplNjQpOworI2VuZGlmIC8qIENPTkZJR19QUEM2NCAqLworCisJc3RhcnQzMiA9IGZpbmRfc2VjdGlvbjMyKHYzMi0+aGRyLCAiX19mdHJfZml4dXAiLCAmc2l6ZTMyKTsKKwlpZiAoc3RhcnQzMikKKwkJZG9fZmVhdHVyZV9maXh1cHMoY3VyX2NwdV9zcGVjLT5jcHVfZmVhdHVyZXMsCisJCQkJICBzdGFydDMyLCBzdGFydDMyICsgc2l6ZTMyKTsKKworI2lmZGVmIENPTkZJR19QUEM2NAorCXN0YXJ0MzIgPSBmaW5kX3NlY3Rpb24zMih2MzItPmhkciwgIl9fZndfZnRyX2ZpeHVwIiwgJnNpemUzMik7CisJaWYgKHN0YXJ0MzIpCisJCWRvX2ZlYXR1cmVfZml4dXBzKHBvd2VycGNfZmlybXdhcmVfZmVhdHVyZXMsCisJCQkJICBzdGFydDMyLCBzdGFydDMyICsgc2l6ZTMyKTsKKyNlbmRpZiAvKiBDT05GSUdfUFBDNjQgKi8KKworCXJldHVybiAwOworfQorCiBzdGF0aWMgX19pbml0IGludCB2ZHNvX2ZpeHVwX2FsdF9mdW5jcyhzdHJ1Y3QgbGliMzJfZWxmaW5mbyAqdjMyLAogCQkJCSAgICAgICBzdHJ1Y3QgbGliNjRfZWxmaW5mbyAqdjY0KQogewpAQCAtNjM0LDYgKzY3Myw5IEBACiAJaWYgKHZkc29fZml4dXBfZGF0YXBhZ2UoJnYzMiwgJnY2NCkpCiAJCXJldHVybiAtMTsKIAorCWlmICh2ZHNvX2ZpeHVwX2ZlYXR1cmVzKCZ2MzIsICZ2NjQpKQorCQlyZXR1cm4gLTE7CisKIAlpZiAodmRzb19maXh1cF9hbHRfZnVuY3MoJnYzMiwgJnY2NCkpCiAJCXJldHVybiAtMTsKIApAQCAtNzE0LDYgKzc1Niw3IEBACiAJICogU2V0dXAgdGhlIHN5c2NhbGwgbWFwIGluIHRoZSB2RE9TCiAJICovCiAJdmRzb19zZXR1cF9zeXNjYWxsX21hcCgpOworCiAJLyoKIAkgKiBJbml0aWFsaXplIHRoZSB2RFNPIGltYWdlcyBpbiBtZW1vcnksIHRoYXQgaXMgZG8gbmVjZXNzYXJ5CiAJICogZml4dXBzIG9mIHZEU08gc3ltYm9scywgbG9jYXRlIHRyYW1wb2xpbmVzLCBldGMuLi4KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvdmRzbzMyL3Zkc28zMi5sZHMuUyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvdmRzbzMyL3Zkc28zMi5sZHMuUwppbmRleCA2MTg3YWYyLi4yNmUxMzhjIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva2VybmVsL3Zkc28zMi92ZHNvMzIubGRzLlMKKysrIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC92ZHNvMzIvdmRzbzMyLmxkcy5TCkBAIC0zMiw2ICszMiwxOCBAQAogICBQUk9WSURFIChfZXRleHQgPSAuKTsKICAgUFJPVklERSAoZXRleHQgPSAuKTsKIAorICAuID0gQUxJR04oOCk7CisgIF9fZnRyX2ZpeHVwIDogeworICAgICooX19mdHJfZml4dXApCisgIH0KKworI2lmZGVmIENPTkZJR19QUEM2NAorICAuID0gQUxJR04oOCk7CisgIF9fZndfZnRyX2ZpeHVwIDogeworICAgICooX19md19mdHJfZml4dXApCisgIH0KKyNlbmRpZgorCiAgIC8qIE90aGVyIHN0dWZmIGlzIGFwcGVuZGVkIHRvIHRoZSB0ZXh0IHNlZ21lbnQ6ICovCiAgIC5yb2RhdGEJCTogeyAqKC5yb2RhdGEgLnJvZGF0YS4qIC5nbnUubGlua29uY2Uuci4qKSB9CiAgIC5yb2RhdGExCQk6IHsgKigucm9kYXRhMSkgfQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2tlcm5lbC92ZHNvNjQvZ2V0dGltZW9mZGF5LlMgYi9hcmNoL3Bvd2VycGMva2VybmVsL3Zkc282NC9nZXR0aW1lb2ZkYXkuUwppbmRleCA1NmU3NmZmLi40MGZmZDliIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva2VybmVsL3Zkc282NC9nZXR0aW1lb2ZkYXkuUworKysgYi9hcmNoL3Bvd2VycGMva2VybmVsL3Zkc282NC9nZXR0aW1lb2ZkYXkuUwpAQCAtMjI5LDggKzIyOSwxMCBAQAogCXhvcglyMCxyOCxyOAkJLyogY3JlYXRlIGRlcGVuZGVuY3kgKi8KIAlhZGQJcjMscjMscjAKIAotCS8qIEdldCBUQiAmIG9mZnNldCBpdCAqLwotCW1mdGIJcjcKKwkvKiBHZXQgVEIgJiBvZmZzZXQgaXQuIFdlIHVzZSB0aGUgTUZUQiBtYWNybyB3aGljaCB3aWxsIGdlbmVyYXRlCisJICogd29ya2Fyb3VuZCBjb2RlIGZvciBDZWxsLgorCSAqLworCU1GVEIocjcpCiAJbGQJcjksQ0ZHX1RCX09SSUdfU1RBTVAocjMpCiAJc3ViZglyNyxyOSxyNwogCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL3Zkc282NC92ZHNvNjQubGRzLlMgYi9hcmNoL3Bvd2VycGMva2VybmVsL3Zkc282NC92ZHNvNjQubGRzLlMKaW5kZXggNGEyYjZkYy4uMmQ3MGYzNSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2tlcm5lbC92ZHNvNjQvdmRzbzY0Lmxkcy5TCisrKyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvdmRzbzY0L3Zkc282NC5sZHMuUwpAQCAtMzEsNiArMzEsMTYgQEAKICAgUFJPVklERSAoX2V0ZXh0ID0gLik7CiAgIFBST1ZJREUgKGV0ZXh0ID0gLik7CiAKKyAgLiA9IEFMSUdOKDgpOworICBfX2Z0cl9maXh1cCA6IHsKKyAgICAqKF9fZnRyX2ZpeHVwKQorICB9CisKKyAgLiA9IEFMSUdOKDgpOworICBfX2Z3X2Z0cl9maXh1cCA6IHsKKyAgICAqKF9fZndfZnRyX2ZpeHVwKQorICB9CisKICAgLyogT3RoZXIgc3R1ZmYgaXMgYXBwZW5kZWQgdG8gdGhlIHRleHQgc2VnbWVudDogKi8KICAgLnJvZGF0YSAgICAgICAgIDogeyAqKC5yb2RhdGEgLnJvZGF0YS4qIC5nbnUubGlua29uY2Uuci4qKSB9CiAgIC5yb2RhdGExICAgICAgICA6IHsgKigucm9kYXRhMSkgfQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2tlcm5lbC92aW8uYyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvdmlvLmMKaW5kZXggY2I4N2U3MS4uZWQwMDc4NyAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2tlcm5lbC92aW8uYworKysgYi9hcmNoL3Bvd2VycGMva2VybmVsL3Zpby5jCkBAIC05Miw5ICs5Miw5IEBACiAJCQkJJnRibC0+aXRfaW5kZXgsICZvZmZzZXQsICZzaXplKTsKIAogCQkvKiBUQ0UgdGFibGUgc2l6ZSAtIG1lYXN1cmVkIGluIHRjZSBlbnRyaWVzICovCi0JCXRibC0+aXRfc2l6ZSA9IHNpemUgPj4gUEFHRV9TSElGVDsKKwkJdGJsLT5pdF9zaXplID0gc2l6ZSA+PiBJT01NVV9QQUdFX1NISUZUOwogCQkvKiBvZmZzZXQgZm9yIFZJTyBzaG91bGQgYWx3YXlzIGJlIDAgKi8KLQkJdGJsLT5pdF9vZmZzZXQgPSBvZmZzZXQgPj4gUEFHRV9TSElGVDsKKwkJdGJsLT5pdF9vZmZzZXQgPSBvZmZzZXQgPj4gSU9NTVVfUEFHRV9TSElGVDsKIAkJdGJsLT5pdF9idXNubyA9IDA7CiAJCXRibC0+aXRfdHlwZSA9IFRDRV9WQjsKIApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2tlcm5lbC92bWxpbnV4Lmxkcy5TIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC92bWxpbnV4Lmxkcy5TCmluZGV4IGNiMGU4ZDQuLmU4MzQyZDggMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvdm1saW51eC5sZHMuUworKysgYi9hcmNoL3Bvd2VycGMva2VybmVsL3ZtbGludXgubGRzLlMKQEAgLTEwOCwxMyArMTA4LDcgQEAKIAogCS5pbml0Y2FsbC5pbml0IDogewogCQlfX2luaXRjYWxsX3N0YXJ0ID0gLjsKLQkJKiguaW5pdGNhbGwxLmluaXQpCi0JCSooLmluaXRjYWxsMi5pbml0KQotCQkqKC5pbml0Y2FsbDMuaW5pdCkKLQkJKiguaW5pdGNhbGw0LmluaXQpCi0JCSooLmluaXRjYWxsNS5pbml0KQotCQkqKC5pbml0Y2FsbDYuaW5pdCkKLQkJKiguaW5pdGNhbGw3LmluaXQpCisJCUlOSVRDQUxMUwogCQlfX2luaXRjYWxsX2VuZCA9IC47CiAJCX0KIApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2xpYi9zc3RlcC5jIGIvYXJjaC9wb3dlcnBjL2xpYi9zc3RlcC5jCmluZGV4IDk1OTBiYTcuLjdlOGRlZDAgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9saWIvc3N0ZXAuYworKysgYi9hcmNoL3Bvd2VycGMvbGliL3NzdGVwLmMKQEAgLTksNiArOSw3IEBACiAgKiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogICovCiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgva3Byb2Jlcy5oPgogI2luY2x1ZGUgPGxpbnV4L3B0cmFjZS5oPgogI2luY2x1ZGUgPGFzbS9zc3RlcC5oPgogI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3IuaD4KQEAgLTI1LDcgKzI2LDcgQEAKIC8qCiAgKiBEZXRlcm1pbmUgd2hldGhlciBhIGNvbmRpdGlvbmFsIGJyYW5jaCBpbnN0cnVjdGlvbiB3b3VsZCBicmFuY2guCiAgKi8KLXN0YXRpYyBpbnQgYnJhbmNoX3Rha2VuKHVuc2lnbmVkIGludCBpbnN0ciwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCitzdGF0aWMgaW50IF9fa3Byb2JlcyBicmFuY2hfdGFrZW4odW5zaWduZWQgaW50IGluc3RyLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKIHsKIAl1bnNpZ25lZCBpbnQgYm8gPSAoaW5zdHIgPj4gMjEpICYgMHgxZjsKIAl1bnNpZ25lZCBpbnQgYmk7CkBAIC01MSw3ICs1Miw3IEBACiAgKiBvciAtMSBpZiB0aGUgaW5zdHJ1Y3Rpb24gaXMgb25lIHRoYXQgc2hvdWxkIG5vdCBiZSBzdGVwcGVkLAogICogc3VjaCBhcyBhbiByZmlkLCBvciBhIG10bXNyZCB0aGF0IHdvdWxkIGNsZWFyIE1TUl9SSS4KICAqLwotaW50IGVtdWxhdGVfc3RlcChzdHJ1Y3QgcHRfcmVncyAqcmVncywgdW5zaWduZWQgaW50IGluc3RyKQoraW50IF9fa3Byb2JlcyBlbXVsYXRlX3N0ZXAoc3RydWN0IHB0X3JlZ3MgKnJlZ3MsIHVuc2lnbmVkIGludCBpbnN0cikKIHsKIAl1bnNpZ25lZCBpbnQgb3Bjb2RlLCByZDsKIAl1bnNpZ25lZCBsb25nIGludCBpbW07CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvbW0vaHVnZXRsYnBhZ2UuYyBiL2FyY2gvcG93ZXJwYy9tbS9odWdldGxicGFnZS5jCmluZGV4IDU2MTVhY2MuLjUwNmQ4OTcgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9tbS9odWdldGxicGFnZS5jCisrKyBiL2FyY2gvcG93ZXJwYy9tbS9odWdldGxicGFnZS5jCkBAIC00ODAsOSArNDgwLDYgQEAKIAogCW1tLT5jb250ZXh0LmhpZ2hfaHRsYl9hcmVhcyB8PSBuZXdhcmVhczsKIAotCS8qIHVwZGF0ZSB0aGUgcGFjYSBjb3B5IG9mIHRoZSBjb250ZXh0IHN0cnVjdCAqLwotCWdldF9wYWNhKCktPmNvbnRleHQgPSBtbS0+Y29udGV4dDsKLQogCS8qIHRoZSBjb250ZXh0IGNoYW5nZSBtdXN0IG1ha2UgaXQgdG8gbWVtb3J5IGJlZm9yZSB0aGUgZmx1c2gsCiAJICogc28gdGhhdCBmdXJ0aGVyIFNMQiBtaXNzZXMgZG8gdGhlIHJpZ2h0IHRoaW5nLiAqLwogCW1iKCk7CkBAIC00OTQsMTEgKzQ5MSwxNSBAQAogCXJldHVybiAwOwogfQogCi1pbnQgcHJlcGFyZV9odWdlcGFnZV9yYW5nZSh1bnNpZ25lZCBsb25nIGFkZHIsIHVuc2lnbmVkIGxvbmcgbGVuKQoraW50IHByZXBhcmVfaHVnZXBhZ2VfcmFuZ2UodW5zaWduZWQgbG9uZyBhZGRyLCB1bnNpZ25lZCBsb25nIGxlbiwgcGdvZmZfdCBwZ29mZikKIHsKIAlpbnQgZXJyID0gMDsKIAotCWlmICggKGFkZHIrbGVuKSA8IGFkZHIgKQorCWlmIChwZ29mZiAmICh+SFBBR0VfTUFTSyA+PiBQQUdFX1NISUZUKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKGxlbiAmIH5IUEFHRV9NQVNLKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAoYWRkciAmIH5IUEFHRV9NQVNLKQogCQlyZXR1cm4gLUVJTlZBTDsKIAogCWlmIChhZGRyIDwgMHgxMDAwMDAwMDBVTCkKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9tbS9tZW0uYyBiL2FyY2gvcG93ZXJwYy9tbS9tZW0uYwppbmRleCAxNmZlMDI3Li5kMWMwNzU4IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvbW0vbWVtLmMKKysrIGIvYXJjaC9wb3dlcnBjL21tL21lbS5jCkBAIC0zMDcsMTEgKzMwNywxMiBAQAogCSAgICAgICB0b3Bfb2ZfcmFtLCB0b3RhbF9yYW0pOwogCXByaW50ayhLRVJOX0RFQlVHICJNZW1vcnkgaG9sZSBzaXplOiAlbGRNQlxuIiwKIAkgICAgICAgKHRvcF9vZl9yYW0gLSB0b3RhbF9yYW0pID4+IDIwKTsKKwltZW1zZXQobWF4X3pvbmVfcGZucywgMCwgc2l6ZW9mKG1heF96b25lX3BmbnMpKTsKICNpZmRlZiBDT05GSUdfSElHSE1FTQotCW1heF96b25lX3BmbnNbMF0gPSB0b3RhbF9sb3dtZW0gPj4gUEFHRV9TSElGVDsKLQltYXhfem9uZV9wZm5zWzFdID0gdG9wX29mX3JhbSA+PiBQQUdFX1NISUZUOworCW1heF96b25lX3BmbnNbWk9ORV9ETUFdID0gdG90YWxfbG93bWVtID4+IFBBR0VfU0hJRlQ7CisJbWF4X3pvbmVfcGZuc1taT05FX0hJR0hNRU1dID0gdG9wX29mX3JhbSA+PiBQQUdFX1NISUZUOwogI2Vsc2UKLQltYXhfem9uZV9wZm5zWzBdID0gdG9wX29mX3JhbSA+PiBQQUdFX1NISUZUOworCW1heF96b25lX3BmbnNbWk9ORV9ETUFdID0gdG9wX29mX3JhbSA+PiBQQUdFX1NISUZUOwogI2VuZGlmCiAJZnJlZV9hcmVhX2luaXRfbm9kZXMobWF4X3pvbmVfcGZucyk7CiB9CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvbW0vbnVtYS5jIGIvYXJjaC9wb3dlcnBjL21tL251bWEuYwppbmRleCA0M2MyNzIwLi45ZGEwMWRjIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvbW0vbnVtYS5jCisrKyBiL2FyY2gvcG93ZXJwYy9tbS9udW1hLmMKQEAgLTYxNyw5ICs2MTcsOSBAQAogCiB2b2lkIF9faW5pdCBwYWdpbmdfaW5pdCh2b2lkKQogewotCXVuc2lnbmVkIGxvbmcgbWF4X3pvbmVfcGZuc1tNQVhfTlJfWk9ORVNdID0gewotCQkJCWxtYl9lbmRfb2ZfRFJBTSgpID4+IFBBR0VfU0hJRlQKLQl9OworCXVuc2lnbmVkIGxvbmcgbWF4X3pvbmVfcGZuc1tNQVhfTlJfWk9ORVNdOworCW1lbXNldChtYXhfem9uZV9wZm5zLCAwLCBzaXplb2YobWF4X3pvbmVfcGZucykpOworCW1heF96b25lX3BmbnNbWk9ORV9ETUFdID0gbG1iX2VuZF9vZl9EUkFNKCkgPj4gUEFHRV9TSElGVDsKIAlmcmVlX2FyZWFfaW5pdF9ub2RlcyhtYXhfem9uZV9wZm5zKTsKIH0KIApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL29wcm9maWxlL01ha2VmaWxlIGIvYXJjaC9wb3dlcnBjL29wcm9maWxlL01ha2VmaWxlCmluZGV4IDMxNDVkNjEuLjBiNWRmOWMgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9vcHJvZmlsZS9NYWtlZmlsZQorKysgYi9hcmNoL3Bvd2VycGMvb3Byb2ZpbGUvTWFrZWZpbGUKQEAgLTEzLDQgKzEzLDQgQEAKIG9wcm9maWxlLXkgOj0gJChEUklWRVJfT0JKUykgY29tbW9uLm8gYmFja3RyYWNlLm8KIG9wcm9maWxlLSQoQ09ORklHX1BQQzY0KSArPSBvcF9tb2RlbF9yczY0Lm8gb3BfbW9kZWxfcG93ZXI0Lm8KIG9wcm9maWxlLSQoQ09ORklHX0ZTTF9CT09LRSkgKz0gb3BfbW9kZWxfZnNsX2Jvb2tlLm8KLW9wcm9maWxlLSQoQ09ORklHX1BQQzMyKSArPSBvcF9tb2RlbF83NDUwLm8KK29wcm9maWxlLSQoQ09ORklHXzZ4eCkgKz0gb3BfbW9kZWxfNzQ1MC5vCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvb3Byb2ZpbGUvY29tbW9uLmMgYi9hcmNoL3Bvd2VycGMvb3Byb2ZpbGUvY29tbW9uLmMKaW5kZXggZmQwYmJiZS4uNjNiYmVmMyAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL29wcm9maWxlL2NvbW1vbi5jCisrKyBiL2FyY2gvcG93ZXJwYy9vcHJvZmlsZS9jb21tb24uYwpAQCAtMzQsNiArMzQsMTEgQEAKIAltb2RlbC0+aGFuZGxlX2ludGVycnVwdChyZWdzLCBjdHIpOwogfQogCitzdGF0aWMgdm9pZCBvcF9wb3dlcnBjX2NwdV9zZXR1cCh2b2lkICpkdW1teSkKK3sKKwltb2RlbC0+Y3B1X3NldHVwKGN0cik7Cit9CisKIHN0YXRpYyBpbnQgb3BfcG93ZXJwY19zZXR1cCh2b2lkKQogewogCWludCBlcnI7CkBAIC00Nyw3ICs1Miw3IEBACiAJbW9kZWwtPnJlZ19zZXR1cChjdHIsICZzeXMsIG1vZGVsLT5udW1fY291bnRlcnMpOwogCiAJLyogQ29uZmlndXJlIHRoZSByZWdpc3RlcnMgb24gYWxsIGNwdXMuICAqLwotCW9uX2VhY2hfY3B1KG1vZGVsLT5jcHVfc2V0dXAsIE5VTEwsIDAsIDEpOworCW9uX2VhY2hfY3B1KG9wX3Bvd2VycGNfY3B1X3NldHVwLCBOVUxMLCAwLCAxKTsKIAogCXJldHVybiAwOwogfQpAQCAtMTQyLDcgKzE0Nyw4IEBACiAJCWNhc2UgUFBDX09QUk9GSUxFX1BPV0VSNDoKIAkJCW1vZGVsID0gJm9wX21vZGVsX3Bvd2VyNDsKIAkJCWJyZWFrOwotI2Vsc2UKKyNlbmRpZgorI2lmZGVmIENPTkZJR182eHgKIAkJY2FzZSBQUENfT1BST0ZJTEVfRzQ6CiAJCQltb2RlbCA9ICZvcF9tb2RlbF83NDUwOwogCQkJYnJlYWs7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvb3Byb2ZpbGUvb3BfbW9kZWxfNzQ1MC5jIGIvYXJjaC9wb3dlcnBjL29wcm9maWxlL29wX21vZGVsXzc0NTAuYwppbmRleCBkOGVlM2FlLi5mNDgxYzBlIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvb3Byb2ZpbGUvb3BfbW9kZWxfNzQ1MC5jCisrKyBiL2FyY2gvcG93ZXJwYy9vcHJvZmlsZS9vcF9tb2RlbF83NDUwLmMKQEAgLTgxLDcgKzgxLDcgQEAKIAogLyogQ29uZmlndXJlcyB0aGUgY291bnRlcnMgb24gdGhpcyBDUFUgYmFzZWQgb24gdGhlIGdsb2JhbAogICogc2V0dGluZ3MgKi8KLXN0YXRpYyB2b2lkIGZzbDc0NTBfY3B1X3NldHVwKHZvaWQgKnVudXNlZCkKK3N0YXRpYyB2b2lkIGZzbDc0NTBfY3B1X3NldHVwKHN0cnVjdCBvcF9jb3VudGVyX2NvbmZpZyAqY3RyKQogewogCS8qIGZyZWV6ZSBhbGwgY291bnRlcnMgKi8KIAlwbWNfc3RvcF9jdHJzKCk7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvb3Byb2ZpbGUvb3BfbW9kZWxfZnNsX2Jvb2tlLmMgYi9hcmNoL3Bvd2VycGMvb3Byb2ZpbGUvb3BfbW9kZWxfZnNsX2Jvb2tlLmMKaW5kZXggZTI5ZGVkZS4uMGIzYzMxZiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL29wcm9maWxlL29wX21vZGVsX2ZzbF9ib29rZS5jCisrKyBiL2FyY2gvcG93ZXJwYy9vcHJvZmlsZS9vcF9tb2RlbF9mc2xfYm9va2UuYwpAQCAtMzIsNDIgKzMyLDE1MiBAQAogc3RhdGljIGludCBudW1fY291bnRlcnM7CiBzdGF0aWMgaW50IG9wcm9maWxlX3J1bm5pbmc7CiAKLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IGN0cl9yZWFkKHVuc2lnbmVkIGludCBpKQorc3RhdGljIHZvaWQgaW5pdF9wbWNfc3RvcChpbnQgY3RyKQogewotCXN3aXRjaChpKSB7CisJdTMyIHBtbGNhID0gKFBNTENBX0ZDIHwgUE1MQ0FfRkNTIHwgUE1MQ0FfRkNVIHwKKwkJCVBNTENBX0ZDTTEgfCBQTUxDQV9GQ00wKTsKKwl1MzIgcG1sY2IgPSAwOworCisJc3dpdGNoIChjdHIpIHsKIAkJY2FzZSAwOgotCQkJcmV0dXJuIG1mcG1yKFBNUk5fUE1DMCk7CisJCQltdHBtcihQTVJOX1BNTENBMCwgcG1sY2EpOworCQkJbXRwbXIoUE1STl9QTUxDQjAsIHBtbGNiKTsKKwkJCWJyZWFrOwogCQljYXNlIDE6Ci0JCQlyZXR1cm4gbWZwbXIoUE1STl9QTUMxKTsKKwkJCW10cG1yKFBNUk5fUE1MQ0ExLCBwbWxjYSk7CisJCQltdHBtcihQTVJOX1BNTENCMSwgcG1sY2IpOworCQkJYnJlYWs7CiAJCWNhc2UgMjoKLQkJCXJldHVybiBtZnBtcihQTVJOX1BNQzIpOworCQkJbXRwbXIoUE1STl9QTUxDQTIsIHBtbGNhKTsKKwkJCW10cG1yKFBNUk5fUE1MQ0IyLCBwbWxjYik7CisJCQlicmVhazsKIAkJY2FzZSAzOgotCQkJcmV0dXJuIG1mcG1yKFBNUk5fUE1DMyk7CisJCQltdHBtcihQTVJOX1BNTENBMywgcG1sY2EpOworCQkJbXRwbXIoUE1STl9QTUxDQjMsIHBtbGNiKTsKKwkJCWJyZWFrOwogCQlkZWZhdWx0OgotCQkJcmV0dXJuIDA7CisJCQlwYW5pYygiQmFkIGN0ciBudW1iZXIhXG4iKTsKIAl9CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBjdHJfd3JpdGUodW5zaWduZWQgaW50IGksIHVuc2lnbmVkIGludCB2YWwpCitzdGF0aWMgdm9pZCBzZXRfcG1jX2V2ZW50KGludCBjdHIsIGludCBldmVudCkKIHsKLQlzd2l0Y2goaSkgewotCQljYXNlIDA6Ci0JCQltdHBtcihQTVJOX1BNQzAsIHZhbCk7Ci0JCQlicmVhazsKLQkJY2FzZSAxOgotCQkJbXRwbXIoUE1STl9QTUMxLCB2YWwpOwotCQkJYnJlYWs7Ci0JCWNhc2UgMjoKLQkJCW10cG1yKFBNUk5fUE1DMiwgdmFsKTsKLQkJCWJyZWFrOwotCQljYXNlIDM6Ci0JCQltdHBtcihQTVJOX1BNQzMsIHZhbCk7Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCWJyZWFrOwotCX0KKwl1MzIgcG1sY2E7CisKKwlwbWxjYSA9IGdldF9wbWxjYShjdHIpOworCisJcG1sY2EgPSAocG1sY2EgJiB+UE1MQ0FfRVZFTlRfTUFTSykgfAorCQkoKGV2ZW50IDw8IFBNTENBX0VWRU5UX1NISUZUKSAmCisJCSBQTUxDQV9FVkVOVF9NQVNLKTsKKworCXNldF9wbWxjYShjdHIsIHBtbGNhKTsKIH0KIAorc3RhdGljIHZvaWQgc2V0X3BtY191c2VyX2tlcm5lbChpbnQgY3RyLCBpbnQgdXNlciwgaW50IGtlcm5lbCkKK3sKKwl1MzIgcG1sY2E7CisKKwlwbWxjYSA9IGdldF9wbWxjYShjdHIpOworCisJaWYodXNlcikKKwkJcG1sY2EgJj0gflBNTENBX0ZDVTsKKwllbHNlCisJCXBtbGNhIHw9IFBNTENBX0ZDVTsKKworCWlmKGtlcm5lbCkKKwkJcG1sY2EgJj0gflBNTENBX0ZDUzsKKwllbHNlCisJCXBtbGNhIHw9IFBNTENBX0ZDUzsKKworCXNldF9wbWxjYShjdHIsIHBtbGNhKTsKK30KKworc3RhdGljIHZvaWQgc2V0X3BtY19tYXJrZWQoaW50IGN0ciwgaW50IG1hcmswLCBpbnQgbWFyazEpCit7CisJdTMyIHBtbGNhID0gZ2V0X3BtbGNhKGN0cik7CisKKwlpZihtYXJrMCkKKwkJcG1sY2EgJj0gflBNTENBX0ZDTTA7CisJZWxzZQorCQlwbWxjYSB8PSBQTUxDQV9GQ00wOworCisJaWYobWFyazEpCisJCXBtbGNhICY9IH5QTUxDQV9GQ00xOworCWVsc2UKKwkJcG1sY2EgfD0gUE1MQ0FfRkNNMTsKKworCXNldF9wbWxjYShjdHIsIHBtbGNhKTsKK30KKworc3RhdGljIHZvaWQgcG1jX3N0YXJ0X2N0cihpbnQgY3RyLCBpbnQgZW5hYmxlKQoreworCXUzMiBwbWxjYSA9IGdldF9wbWxjYShjdHIpOworCisJcG1sY2EgJj0gflBNTENBX0ZDOworCisJaWYgKGVuYWJsZSkKKwkJcG1sY2EgfD0gUE1MQ0FfQ0U7CisJZWxzZQorCQlwbWxjYSAmPSB+UE1MQ0FfQ0U7CisKKwlzZXRfcG1sY2EoY3RyLCBwbWxjYSk7Cit9CisKK3N0YXRpYyB2b2lkIHBtY19zdGFydF9jdHJzKGludCBlbmFibGUpCit7CisJdTMyIHBtZ2MwID0gbWZwbXIoUE1STl9QTUdDMCk7CisKKwlwbWdjMCAmPSB+UE1HQzBfRkFDOworCXBtZ2MwIHw9IFBNR0MwX0ZDRUNFOworCisJaWYgKGVuYWJsZSkKKwkJcG1nYzAgfD0gUE1HQzBfUE1JRTsKKwllbHNlCisJCXBtZ2MwICY9IH5QTUdDMF9QTUlFOworCisJbXRwbXIoUE1STl9QTUdDMCwgcG1nYzApOworfQorCitzdGF0aWMgdm9pZCBwbWNfc3RvcF9jdHJzKHZvaWQpCit7CisJdTMyIHBtZ2MwID0gbWZwbXIoUE1STl9QTUdDMCk7CisKKwlwbWdjMCB8PSBQTUdDMF9GQUM7CisKKwlwbWdjMCAmPSB+KFBNR0MwX1BNSUUgfCBQTUdDMF9GQ0VDRSk7CisKKwltdHBtcihQTVJOX1BNR0MwLCBwbWdjMCk7Cit9CisKK3N0YXRpYyB2b2lkIGR1bXBfcG1jcyh2b2lkKQoreworCXByaW50aygicG1nYzA6ICV4XG4iLCBtZnBtcihQTVJOX1BNR0MwKSk7CisJcHJpbnRrKCJwbWNcdFx0cG1sY2FcdFx0cG1sY2JcbiIpOworCXByaW50aygiJTh4XHQlOHhcdCU4eFxuIiwgbWZwbXIoUE1STl9QTUMwKSwKKwkJCW1mcG1yKFBNUk5fUE1MQ0EwKSwgbWZwbXIoUE1STl9QTUxDQjApKTsKKwlwcmludGsoIiU4eFx0JTh4XHQlOHhcbiIsIG1mcG1yKFBNUk5fUE1DMSksCisJCQltZnBtcihQTVJOX1BNTENBMSksIG1mcG1yKFBNUk5fUE1MQ0IxKSk7CisJcHJpbnRrKCIlOHhcdCU4eFx0JTh4XG4iLCBtZnBtcihQTVJOX1BNQzIpLAorCQkJbWZwbXIoUE1STl9QTUxDQTIpLCBtZnBtcihQTVJOX1BNTENCMikpOworCXByaW50aygiJTh4XHQlOHhcdCU4eFxuIiwgbWZwbXIoUE1STl9QTUMzKSwKKwkJCW1mcG1yKFBNUk5fUE1MQ0EzKSwgbWZwbXIoUE1STl9QTUxDQjMpKTsKK30KKworc3RhdGljIHZvaWQgZnNsX2Jvb2tlX2NwdV9zZXR1cChzdHJ1Y3Qgb3BfY291bnRlcl9jb25maWcgKmN0cikKK3sKKwlpbnQgaTsKKworCS8qIGZyZWV6ZSBhbGwgY291bnRlcnMgKi8KKwlwbWNfc3RvcF9jdHJzKCk7CisKKwlmb3IgKGkgPSAwO2kgPCBudW1fY291bnRlcnM7aSsrKSB7CisJCWluaXRfcG1jX3N0b3AoaSk7CisKKwkJc2V0X3BtY19ldmVudChpLCBjdHJbaV0uZXZlbnQpOworCisJCXNldF9wbWNfdXNlcl9rZXJuZWwoaSwgY3RyW2ldLnVzZXIsIGN0cltpXS5rZXJuZWwpOworCX0KK30KIAogc3RhdGljIHZvaWQgZnNsX2Jvb2tlX3JlZ19zZXR1cChzdHJ1Y3Qgb3BfY291bnRlcl9jb25maWcgKmN0ciwKIAkJCSAgICAgc3RydWN0IG9wX3N5c3RlbV9jb25maWcgKnN5cywKQEAgLTc3LDIzICsxODcsMTQgQEAKIAogCW51bV9jb3VudGVycyA9IG51bV9jdHJzOwogCi0JLyogZnJlZXplIGFsbCBjb3VudGVycyAqLwotCXBtY19zdG9wX2N0cnMoKTsKLQogCS8qIE91ciBjb3VudGVycyBjb3VudCB1cCwgYW5kICJjb3VudCIgcmVmZXJzIHRvCiAJICogaG93IG11Y2ggYmVmb3JlIHRoZSBuZXh0IGludGVycnVwdCwgYW5kIHdlIGludGVycnVwdAogCSAqIG9uIG92ZXJmbG93LiAgU28gd2UgY2FsY3VsYXRlIHRoZSBzdGFydGluZyB2YWx1ZQogCSAqIHdoaWNoIHdpbGwgZ2l2ZSB1cyAiY291bnQiIHVudGlsIG92ZXJmbG93LgogCSAqIFRoZW4gd2Ugc2V0IHRoZSBldmVudHMgb24gdGhlIGVuYWJsZWQgY291bnRlcnMgKi8KLQlmb3IgKGkgPSAwOyBpIDwgbnVtX2NvdW50ZXJzOyArK2kpIHsKKwlmb3IgKGkgPSAwOyBpIDwgbnVtX2NvdW50ZXJzOyArK2kpCiAJCXJlc2V0X3ZhbHVlW2ldID0gMHg4MDAwMDAwMFVMIC0gY3RyW2ldLmNvdW50OwogCi0JCWluaXRfcG1jX3N0b3AoaSk7Ci0KLQkJc2V0X3BtY19ldmVudChpLCBjdHJbaV0uZXZlbnQpOwotCi0JCXNldF9wbWNfdXNlcl9rZXJuZWwoaSwgY3RyW2ldLnVzZXIsIGN0cltpXS5rZXJuZWwpOwotCX0KIH0KIAogc3RhdGljIHZvaWQgZnNsX2Jvb2tlX3N0YXJ0KHN0cnVjdCBvcF9jb3VudGVyX2NvbmZpZyAqY3RyKQpAQCAtMTA1LDggKzIwNiw4IEBACiAJZm9yIChpID0gMDsgaSA8IG51bV9jb3VudGVyczsgKytpKSB7CiAJCWlmIChjdHJbaV0uZW5hYmxlZCkgewogCQkJY3RyX3dyaXRlKGksIHJlc2V0X3ZhbHVlW2ldKTsKLQkJCS8qIFNldCBFYWNoIGVuYWJsZWQgY291bnRlcmQgdG8gb25seQotCQkJICogY291bnQgd2hlbiB0aGUgTWFyayBiaXQgaXMgbm90IHNldCAqLworCQkJLyogU2V0IGVhY2ggZW5hYmxlZCBjb3VudGVyIHRvIG9ubHkKKwkJCSAqIGNvdW50IHdoZW4gdGhlIE1hcmsgYml0IGlzICpub3QqIHNldCAqLwogCQkJc2V0X3BtY19tYXJrZWQoaSwgMSwgMCk7CiAJCQlwbWNfc3RhcnRfY3RyKGksIDEpOwogCQl9IGVsc2UgewpAQCAtMTc3LDYgKzI3OCw3IEBACiAKIHN0cnVjdCBvcF9wb3dlcnBjX21vZGVsIG9wX21vZGVsX2ZzbF9ib29rZSA9IHsKIAkucmVnX3NldHVwCQk9IGZzbF9ib29rZV9yZWdfc2V0dXAsCisJLmNwdV9zZXR1cAkJPSBmc2xfYm9va2VfY3B1X3NldHVwLAogCS5zdGFydAkJCT0gZnNsX2Jvb2tlX3N0YXJ0LAogCS5zdG9wCQkJPSBmc2xfYm9va2Vfc3RvcCwKIAkuaGFuZGxlX2ludGVycnVwdAk9IGZzbF9ib29rZV9oYW5kbGVfaW50ZXJydXB0LApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL29wcm9maWxlL29wX21vZGVsX3Bvd2VyNC5jIGIvYXJjaC9wb3dlcnBjL29wcm9maWxlL29wX21vZGVsX3Bvd2VyNC5jCmluZGV4IDUwNmY2YjcuLjM1NjcwOWQgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9vcHJvZmlsZS9vcF9tb2RlbF9wb3dlcjQuYworKysgYi9hcmNoL3Bvd2VycGMvb3Byb2ZpbGUvb3BfbW9kZWxfcG93ZXI0LmMKQEAgLTc2LDEzICs3NiwxMyBAQAogewogCWlmIChfX2lzX3Byb2Nlc3NvcihQVl9QT1dFUjQpIHx8IF9faXNfcHJvY2Vzc29yKFBWX1BPV0VSNHApIHx8CiAJICAgIF9faXNfcHJvY2Vzc29yKFBWXzk3MCkgfHwgX19pc19wcm9jZXNzb3IoUFZfOTcwRlgpIHx8Ci0JICAgIF9faXNfcHJvY2Vzc29yKFBWXzk3ME1QKSkKKwkgICAgX19pc19wcm9jZXNzb3IoUFZfOTcwTVApIHx8IF9faXNfcHJvY2Vzc29yKFBWXzk3MEdYKSkKIAkJcmV0dXJuIDE7CiAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHZvaWQgcG93ZXI0X2NwdV9zZXR1cCh2b2lkICp1bnVzZWQpCitzdGF0aWMgdm9pZCBwb3dlcjRfY3B1X3NldHVwKHN0cnVjdCBvcF9jb3VudGVyX2NvbmZpZyAqY3RyKQogewogCXVuc2lnbmVkIGludCBtbWNyMCA9IG1tY3IwX3ZhbDsKIAl1bnNpZ25lZCBsb25nIG1tY3JhID0gbW1jcmFfdmFsOwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL29wcm9maWxlL29wX21vZGVsX3JzNjQuYyBiL2FyY2gvcG93ZXJwYy9vcHJvZmlsZS9vcF9tb2RlbF9yczY0LmMKaW5kZXggMDQyZjhmNC4uMTljNWVlMCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL29wcm9maWxlL29wX21vZGVsX3JzNjQuYworKysgYi9hcmNoL3Bvd2VycGMvb3Byb2ZpbGUvb3BfbW9kZWxfcnM2NC5jCkBAIC0xMDIsNyArMTAyLDcgQEAKIAkvKiBYWFggc2V0dXAgdXNlciBhbmQga2VybmVsIHByb2ZpbGluZyAqLwogfQogCi1zdGF0aWMgdm9pZCByczY0X2NwdV9zZXR1cCh2b2lkICp1bnVzZWQpCitzdGF0aWMgdm9pZCByczY0X2NwdV9zZXR1cChzdHJ1Y3Qgb3BfY291bnRlcl9jb25maWcgKmN0cikKIHsKIAl1bnNpZ25lZCBpbnQgbW1jcjA7CiAKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODN4eC9LY29uZmlnIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84M3h4L0tjb25maWcKaW5kZXggMDk3NWU5NC4uN2VkYjZiNCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84M3h4L0tjb25maWcKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84M3h4L0tjb25maWcKQEAgLTMyLDYgKzMyLDEzIEBACiAJICBCZSBhd2FyZSB0aGF0IFBDSSBpbml0aWFsaXphdGlvbiBpcyB0aGUgYm9vdGxvYWRlcidzCiAJICByZXNwb25zaWJsaWx0eS4KIAorY29uZmlnIE1QQzgzNjBFX1BCCisJYm9vbCAiRnJlZXNjYWxlIE1QQzgzNjBFIFBCIgorCXNlbGVjdCBERUZBVUxUX1VJTUFHRQorCXNlbGVjdCBRVUlDQ19FTkdJTkUKKwloZWxwCisJICBUaGlzIG9wdGlvbiBlbmFibGVzIHN1cHBvcnQgZm9yIHRoZSBNUEM4MzZ4IEVNRFMgUHJvY2Vzc29yIEJvYXJkLgorCiBlbmRjaG9pY2UKIAogY29uZmlnIFBQQ19NUEM4MzJ4CkBAIC00Niw0ICs1MywxMCBAQAogCXNlbGVjdCBQUENfSU5ESVJFQ1RfUENJCiAJZGVmYXVsdCB5IGlmIE1QQzgzNHhfU1lTIHx8IE1QQzgzNHhfSVRYCiAKK2NvbmZpZyBQUENfTVBDODM2eAorCWJvb2wKKwlzZWxlY3QgUFBDX1VEQkdfMTY1NTAKKwlzZWxlY3QgUFBDX0lORElSRUNUX1BDSQorCWRlZmF1bHQgeSBpZiBNUEM4MzYwRV9QQgorCiBlbmRtZW51CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzgzeHgvTWFrZWZpbGUgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzgzeHgvTWFrZWZpbGUKaW5kZXggOTM4N2ExMS4uZjFhYTdlMiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84M3h4L01ha2VmaWxlCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODN4eC9NYWtlZmlsZQpAQCAtNSwzICs1LDUgQEAKIG9iai0kKENPTkZJR19QQ0kpCQkrPSBwY2kubwogb2JqLSQoQ09ORklHX01QQzgzNHhfU1lTKQkrPSBtcGM4MzR4X3N5cy5vCiBvYmotJChDT05GSUdfTVBDODM0eF9JVFgpCSs9IG1wYzgzNHhfaXR4Lm8KK29iai0kKENPTkZJR19NUEM4MzYwRV9QQikJKz0gbXBjODM2MGVfcGIubworb2JqLSQoQ09ORklHX01QQzgzMnhfTURTKQkrPSBtcGM4MzJ4X21kcy5vCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzgzeHgvbXBjODMyeF9tZHMuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODN4eC9tcGM4MzJ4X21kcy5jCmluZGV4IDU0ZGVhOWQ0Li5hNDNhYzcxIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzgzeHgvbXBjODMyeF9tZHMuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzgzeHgvbXBjODMyeF9tZHMuYwpAQCAtMjQsNiArMjQsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3Jvb3RfZGV2Lmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdHJkLmg+CiAKKyNpbmNsdWRlIDxhc20vb2ZfZGV2aWNlLmg+CiAjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgogI2luY2x1ZGUgPGFzbS9hdG9taWMuaD4KICNpbmNsdWRlIDxhc20vdGltZS5oPgpAQCAtMTM2LDYgKzEzNywyNCBAQAogI2VuZGlmCiB9CiAKK3N0YXRpYyBpbnQgX19pbml0IG1wYzgzMnhfZGVjbGFyZV9vZl9wbGF0Zm9ybV9kZXZpY2VzKHZvaWQpCit7CisJc3RydWN0IGRldmljZV9ub2RlICpucDsKKworCWZvciAobnAgPSBOVUxMOyAobnAgPSBvZl9maW5kX2NvbXBhdGlibGVfbm9kZShucCwgIm5ldHdvcmsiLAorCQkJCQkidWNjX2dldGgiKSkgIT0gTlVMTDspIHsKKwkJaW50IHVjY19udW07CisJCWNoYXIgYnVzX2lkW0JVU19JRF9TSVpFXTsKKworCQl1Y2NfbnVtID0gKigodWludCAqKSBnZXRfcHJvcGVydHkobnAsICJkZXZpY2UtaWQiLCBOVUxMKSkgLSAxOworCQlzbnByaW50ZihidXNfaWQsIEJVU19JRF9TSVpFLCAidWNjX2dldGguJXUiLCB1Y2NfbnVtKTsKKwkJb2ZfcGxhdGZvcm1fZGV2aWNlX2NyZWF0ZShucCwgYnVzX2lkLCBOVUxMKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KK2RldmljZV9pbml0Y2FsbChtcGM4MzJ4X2RlY2xhcmVfb2ZfcGxhdGZvcm1fZGV2aWNlcyk7CisKIHZvaWQgX19pbml0IG1wYzgzMnhfc3lzX2luaXRfSVJRKHZvaWQpCiB7CiAKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODN4eC9tcGM4MzR4X2l0eC5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84M3h4L21wYzgzNHhfaXR4LmMKaW5kZXggNTQ0NmJhYi4uZTJiY2FhZiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84M3h4L21wYzgzNHhfaXR4LmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84M3h4L21wYzgzNHhfaXR4LmMKQEAgLTEwOCwxMCArMTA4LDYgQEAKIAlyZXR1cm4gMTsKIH0KIAotI2lmZGVmIENPTkZJR19SVENfQ0xBU1MKLWxhdGVfaW5pdGNhbGwocnRjX2NsYXNzX2hvb2t1cCk7Ci0jZW5kaWYKLQogZGVmaW5lX21hY2hpbmUobXBjODM0eF9pdHgpIHsKIAkubmFtZQkJCT0gIk1QQzgzNHggSVRYIiwKIAkucHJvYmUJCQk9IG1wYzgzNHhfaXR4X3Byb2JlLApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84M3h4L21wYzgzNjBlX3BiLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzgzeHgvbXBjODM2MGVfcGIuYwppbmRleCBjMDE5MTkwLi4xYTUyM2M4IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzgzeHgvbXBjODM2MGVfcGIuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzgzeHgvbXBjODM2MGVfcGIuYwpAQCAtMzAsNiArMzAsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3Jvb3RfZGV2Lmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdHJkLmg+CiAKKyNpbmNsdWRlIDxhc20vb2ZfZGV2aWNlLmg+CiAjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgogI2luY2x1ZGUgPGFzbS9hdG9taWMuaD4KICNpbmNsdWRlIDxhc20vdGltZS5oPgpAQCAtMTQxLDYgKzE0MiwyNCBAQAogI2VuZGlmCiB9CiAKK3N0YXRpYyBpbnQgX19pbml0IG1wYzgzNjBfZGVjbGFyZV9vZl9wbGF0Zm9ybV9kZXZpY2VzKHZvaWQpCit7CisJc3RydWN0IGRldmljZV9ub2RlICpucDsKKworCWZvciAobnAgPSBOVUxMOyAobnAgPSBvZl9maW5kX2NvbXBhdGlibGVfbm9kZShucCwgIm5ldHdvcmsiLAorCQkJCQkidWNjX2dldGgiKSkgIT0gTlVMTDspIHsKKwkJaW50IHVjY19udW07CisJCWNoYXIgYnVzX2lkW0JVU19JRF9TSVpFXTsKKworCQl1Y2NfbnVtID0gKigodWludCAqKSBnZXRfcHJvcGVydHkobnAsICJkZXZpY2UtaWQiLCBOVUxMKSkgLSAxOworCQlzbnByaW50ZihidXNfaWQsIEJVU19JRF9TSVpFLCAidWNjX2dldGguJXUiLCB1Y2NfbnVtKTsKKwkJb2ZfcGxhdGZvcm1fZGV2aWNlX2NyZWF0ZShucCwgYnVzX2lkLCBOVUxMKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KK2RldmljZV9pbml0Y2FsbChtcGM4MzYwX2RlY2xhcmVfb2ZfcGxhdGZvcm1fZGV2aWNlcyk7CisKIHZvaWQgX19pbml0IG1wYzgzNjBfc3lzX2luaXRfSVJRKHZvaWQpCiB7CiAKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9zcHVfYmFzZS5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL3NwdV9iYXNlLmMKaW5kZXggY2NmZDBjNC4uN2FhODA5ZCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL3NwdV9iYXNlLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL3NwdV9iYXNlLmMKQEAgLTY1NSwxNCArNjU1LDE5IEBACiAKIAlmb3IgKGk9MDsgaSA8IDM7IGkrKykgewogCQlyZXQgPSBvZl9pcnFfbWFwX29uZShucCwgaSwgJm9pcnEpOwotCQlpZiAocmV0KQorCQlpZiAocmV0KSB7CisJCQlwcl9kZWJ1Zygic3B1X25ldzogZmFpbGVkIHRvIGdldCBpcnEgJWRcbiIsIGkpOwogCQkJZ290byBlcnI7Ci0KKwkJfQogCQlyZXQgPSAtRUlOVkFMOworCQlwcl9kZWJ1ZygiICBpcnEgJWQgbm8gMHgleCBvbiAlc1xuIiwgaSwgb2lycS5zcGVjaWZpZXJbMF0sCisJCQkgb2lycS5jb250cm9sbGVyLT5mdWxsX25hbWUpOwogCQlzcHUtPmlycXNbaV0gPSBpcnFfY3JlYXRlX29mX21hcHBpbmcob2lycS5jb250cm9sbGVyLAogCQkJCQlvaXJxLnNwZWNpZmllciwgb2lycS5zaXplKTsKLQkJaWYgKHNwdS0+aXJxc1tpXSA9PSBOT19JUlEpCisJCWlmIChzcHUtPmlycXNbaV0gPT0gTk9fSVJRKSB7CisJCQlwcl9kZWJ1Zygic3B1X25ldzogZmFpbGVkIHRvIG1hcCBpdCAhXG4iKTsKIAkJCWdvdG8gZXJyOworCQl9CiAJfQogCXJldHVybiAwOwogCkBAIC02ODEsNyArNjg2LDcgQEAKIAlzdHJ1Y3QgcmVzb3VyY2UgcmVzb3VyY2UgPSB7IH07CiAJaW50IHJldDsKIAotCXJldCA9IG9mX2FkZHJlc3NfdG9fcmVzb3VyY2Uobm9kZSwgMCwgJnJlc291cmNlKTsKKwlyZXQgPSBvZl9hZGRyZXNzX3RvX3Jlc291cmNlKG5vZGUsIG5yLCAmcmVzb3VyY2UpOwogCWlmIChyZXQpCiAJCWdvdG8gb3V0OwogCkBAIC03MDQsMjIgKzcwOSw0MiBAQAogCiAJcmV0ID0gc3B1X21hcF9yZXNvdXJjZShub2RlLCAwLCAodm9pZCBfX2lvbWVtKiopJnNwdS0+bG9jYWxfc3RvcmUsCiAJCQkJCSZzcHUtPmxvY2FsX3N0b3JlX3BoeXMpOwotCWlmIChyZXQpCisJaWYgKHJldCkgeworCQlwcl9kZWJ1Zygic3B1X25ldzogZmFpbGVkIHRvIG1hcCAlcyByZXNvdXJjZSAwXG4iLAorCQkJIG5vZGUtPmZ1bGxfbmFtZSk7CiAJCWdvdG8gb3V0OworCX0KIAlyZXQgPSBzcHVfbWFwX3Jlc291cmNlKG5vZGUsIDEsICh2b2lkIF9faW9tZW0qKikmc3B1LT5wcm9ibGVtLAogCQkJCQkmc3B1LT5wcm9ibGVtX3BoeXMpOwotCWlmIChyZXQpCisJaWYgKHJldCkgeworCQlwcl9kZWJ1Zygic3B1X25ldzogZmFpbGVkIHRvIG1hcCAlcyByZXNvdXJjZSAxXG4iLAorCQkJIG5vZGUtPmZ1bGxfbmFtZSk7CiAJCWdvdG8gb3V0X3VubWFwOworCX0KIAlyZXQgPSBzcHVfbWFwX3Jlc291cmNlKG5vZGUsIDIsICh2b2lkIF9faW9tZW0qKikmc3B1LT5wcml2MiwKIAkJCQkJTlVMTCk7Ci0JaWYgKHJldCkKKwlpZiAocmV0KSB7CisJCXByX2RlYnVnKCJzcHVfbmV3OiBmYWlsZWQgdG8gbWFwICVzIHJlc291cmNlIDJcbiIsCisJCQkgbm9kZS0+ZnVsbF9uYW1lKTsKIAkJZ290byBvdXRfdW5tYXA7CisJfQogCiAJaWYgKCFmaXJtd2FyZV9oYXNfZmVhdHVyZShGV19GRUFUVVJFX0xQQVIpKQogCQlyZXQgPSBzcHVfbWFwX3Jlc291cmNlKG5vZGUsIDMsICh2b2lkIF9faW9tZW0qKikmc3B1LT5wcml2MSwKIAkJCQkJTlVMTCk7Ci0JaWYgKHJldCkKKwlpZiAocmV0KSB7CisJCXByX2RlYnVnKCJzcHVfbmV3OiBmYWlsZWQgdG8gbWFwICVzIHJlc291cmNlIDNcbiIsCisJCQkgbm9kZS0+ZnVsbF9uYW1lKTsKIAkJZ290byBvdXRfdW5tYXA7CisJfQorCXByX2RlYnVnKCJzcHVfbmV3OiAlcyBtYXBzOlxuIiwgbm9kZS0+ZnVsbF9uYW1lKTsKKwlwcl9kZWJ1ZygiICBsb2NhbCBzdG9yZSAgIDogMHglMDE2bHggLT4gMHglcFxuIiwKKwkJIHNwdS0+bG9jYWxfc3RvcmVfcGh5cywgc3B1LT5sb2NhbF9zdG9yZSk7CisJcHJfZGVidWcoIiAgcHJvYmxlbSBzdGF0ZSA6IDB4JTAxNmx4IC0+IDB4JXBcbiIsCisJCSBzcHUtPnByb2JsZW1fcGh5cywgc3B1LT5wcm9ibGVtKTsKKwlwcl9kZWJ1ZygiICBwcml2MiAgICAgICAgIDogICAgICAgICAgICAgICAgICAgICAgIDB4JXBcbiIsIHNwdS0+cHJpdjIpOworCXByX2RlYnVnKCIgIHByaXYxICAgICAgICAgOiAgICAgICAgICAgICAgICAgICAgICAgMHglcFxuIiwgc3B1LT5wcml2MSk7CisKIAlyZXR1cm4gMDsKIAogb3V0X3VubWFwOgpAQCAtNzgxLDYgKzgwNiwxNyBAQAogCWlmICghc3B1KQogCQlnb3RvIG91dDsKIAorCXNwdS0+bm9kZSA9IGZpbmRfc3B1X25vZGVfaWQoc3BlKTsKKwlpZiAoc3B1LT5ub2RlID49IE1BWF9OVU1OT0RFUykgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJTUEUgJXMgb24gbm9kZSAlZCBpZ25vcmVkLCIKKwkJICAgICAgICIgbm9kZSBudW1iZXIgdG9vIGJpZ1xuIiwgc3BlLT5mdWxsX25hbWUsIHNwdS0+bm9kZSk7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIkNoZWNrIGlmIENPTkZJR19OVU1BIGlzIGVuYWJsZWQuXG4iKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCXNwdS0+bmlkID0gb2Zfbm9kZV90b19uaWQoc3BlKTsKKwlpZiAoc3B1LT5uaWQgPT0gLTEpCisJCXNwdS0+bmlkID0gMDsKKwogCXJldCA9IHNwdV9tYXBfZGV2aWNlKHNwdSwgc3BlKTsKIAkvKiB0cnkgb2xkIG1ldGhvZCAqLwogCWlmIChyZXQpCkBAIC03ODgsMTAgKzgyNCw2IEBACiAJaWYgKHJldCkKIAkJZ290byBvdXRfZnJlZTsKIAotCXNwdS0+bm9kZSA9IGZpbmRfc3B1X25vZGVfaWQoc3BlKTsKLQlzcHUtPm5pZCA9IG9mX25vZGVfdG9fbmlkKHNwZSk7Ci0JaWYgKHNwdS0+bmlkID09IC0xKQotCQlzcHUtPm5pZCA9IDA7CiAJcmV0ID0gc3B1X21hcF9pbnRlcnJ1cHRzKHNwdSwgc3BlKTsKIAlpZiAocmV0KQogCQlyZXQgPSBzcHVfbWFwX2ludGVycnVwdHNfb2xkKHNwdSwgc3BlKTsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9zcHVmcy9maWxlLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvc3B1ZnMvZmlsZS5jCmluZGV4IGUwZDczMDAuLjUzM2UyNzIgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9zcHVmcy9maWxlLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL3NwdWZzL2ZpbGUuYwpAQCAtMjQ2LDYgKzI0Niw3IEBACiAKIHN0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHNwdWZzX2NudGxfZm9wcyA9IHsKIAkub3BlbiA9IHNwdWZzX2NudGxfb3BlbiwKKwkucmVsZWFzZSA9IHNpbXBsZV9hdHRyX2Nsb3NlLAogCS5yZWFkID0gc2ltcGxlX2F0dHJfcmVhZCwKIAkud3JpdGUgPSBzaW1wbGVfYXR0cl93cml0ZSwKIAkubW1hcCA9IHNwdWZzX2NudGxfbW1hcCwKQEAgLTM4NCw3ICszODUsNyBAQAogCXVkYXRhID0gKHZvaWQgX191c2VyICopYnVmOwogCiAJc3B1X2FjcXVpcmUoY3R4KTsKLQlmb3IgKGNvdW50ID0gMDsgY291bnQgPD0gbGVuOyBjb3VudCArPSA0LCB1ZGF0YSsrKSB7CisJZm9yIChjb3VudCA9IDA7IChjb3VudCArIDQpIDw9IGxlbjsgY291bnQgKz0gNCwgdWRhdGErKykgewogCQlpbnQgcmV0OwogCQlyZXQgPSBjdHgtPm9wcy0+bWJveF9yZWFkKGN0eCwgJm1ib3hfZGF0YSk7CiAJCWlmIChyZXQgPT0gMCkKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9zcHVmcy9od19vcHMuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9zcHVmcy9od19vcHMuYwppbmRleCBlZmM0NTJlLi5kODA1ZmZlIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvc3B1ZnMvaHdfb3BzLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL3NwdWZzL2h3X29wcy5jCkBAIC0xNDcsNyArMTQ3LDcgQEAKIAogc3RhdGljIHUzMiBzcHVfaHdfc2lnbmFsMl9yZWFkKHN0cnVjdCBzcHVfY29udGV4dCAqY3R4KQogewotCXJldHVybiBpbl9iZTMyKCZjdHgtPnNwdS0+cHJvYmxlbS0+c2lnbmFsX25vdGlmeTEpOworCXJldHVybiBpbl9iZTMyKCZjdHgtPnNwdS0+cHJvYmxlbS0+c2lnbmFsX25vdGlmeTIpOwogfQogCiBzdGF0aWMgdm9pZCBzcHVfaHdfc2lnbmFsMl93cml0ZShzdHJ1Y3Qgc3B1X2NvbnRleHQgKmN0eCwgdTMyIGRhdGEpCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NocnAvc2V0dXAuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2hycC9zZXR1cC5jCmluZGV4IGNhZTNkMTMuLjQ5YjhkYWIgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2hycC9zZXR1cC5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2hycC9zZXR1cC5jCkBAIC00NzcsOCArNDc3LDEwIEBACiAJCSAgICAgICAiIGFkZHJlc3MsIHBvbGxpbmdcbiIpOwogCiAJaTgyNTlfaW5pdChwaWMsIGNocnBfaW50X2Fjayk7Ci0JaWYgKHBwY19tZC5nZXRfaXJxID09IE5VTEwpCisJaWYgKHBwY19tZC5nZXRfaXJxID09IE5VTEwpIHsKIAkJcHBjX21kLmdldF9pcnEgPSBpODI1OV9pcnE7CisJCWlycV9zZXRfZGVmYXVsdF9ob3N0KGk4MjU5X2dldF9ob3N0KCkpOworCX0KIAlpZiAoY2hycF9tcGljICE9IE5VTEwpIHsKIAkJY2FzY2FkZV9pcnEgPSBpcnFfb2ZfcGFyc2VfYW5kX21hcChwaWMsIDApOwogCQlpZiAoY2FzY2FkZV9pcnEgPT0gTk9fSVJRKQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9pc2VyaWVzL2lvbW11LmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2lzZXJpZXMvaW9tbXUuYwppbmRleCBmNGNiYmNmLi4yMTg4MTdkIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2lzZXJpZXMvaW9tbXUuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2lzZXJpZXMvaW9tbXUuYwpAQCAtNDMsOSArNDMsNiBAQAogCXU2NCByYzsKIAl1NjQgdGNlLCBycG47CiAKLQlpbmRleCA8PD0gVENFX1BBR0VfRkFDVE9SOwotCW5wYWdlcyA8PD0gVENFX1BBR0VfRkFDVE9SOwotCiAJd2hpbGUgKG5wYWdlcy0tKSB7CiAJCXJwbiA9IHZpcnRfdG9fYWJzKHVhZGRyKSA+PiBUQ0VfU0hJRlQ7CiAJCXRjZSA9IChycG4gJiBUQ0VfUlBOX01BU0spIDw8IFRDRV9SUE5fU0hJRlQ7CkBAIC03NSw5ICs3Miw2IEBACiB7CiAJdTY0IHJjOwogCi0JbnBhZ2VzIDw8PSBUQ0VfUEFHRV9GQUNUT1I7Ci0JaW5kZXggPDw9IFRDRV9QQUdFX0ZBQ1RPUjsKLQogCXdoaWxlIChucGFnZXMtLSkgewogCQlyYyA9IEh2Q2FsbFhtX3NldFRjZSgodTY0KXRibC0+aXRfaW5kZXgsICh1NjQpaW5kZXgsIDApOwogCQlpZiAocmMpCkBAIC0xMzYsMTAgKzEzMCw5IEBACiAJCXBhbmljKCJQQ0lfRE1BOiBwYXJtcy0+c2l6ZSBpcyB6ZXJvLCBwYXJtcyBpcyAweCVwIiwgcGFybXMpOwogCiAJLyogaXRjX3NpemUgaXMgaW4gcGFnZXMgd29ydGggb2YgdGFibGUsIGl0X3NpemUgaXMgaW4gIyBvZiBlbnRyaWVzICovCi0JdGJsLT5pdF9zaXplID0gKChwYXJtcy0+aXRjX3NpemUgKiBUQ0VfUEFHRV9TSVpFKSAvCi0JCQlUQ0VfRU5UUllfU0laRSkgPj4gVENFX1BBR0VfRkFDVE9SOworCXRibC0+aXRfc2l6ZSA9IChwYXJtcy0+aXRjX3NpemUgKiBUQ0VfUEFHRV9TSVpFKSAvIFRDRV9FTlRSWV9TSVpFOwogCXRibC0+aXRfYnVzbm8gPSBwYXJtcy0+aXRjX2J1c25vOwotCXRibC0+aXRfb2Zmc2V0ID0gcGFybXMtPml0Y19vZmZzZXQgPj4gVENFX1BBR0VfRkFDVE9SOworCXRibC0+aXRfb2Zmc2V0ID0gcGFybXMtPml0Y19vZmZzZXQ7CiAJdGJsLT5pdF9pbmRleCA9IHBhcm1zLT5pdGNfaW5kZXg7CiAJdGJsLT5pdF9ibG9ja3NpemUgPSAxOwogCXRibC0+aXRfdHlwZSA9IHZpcnRidXMgPyBUQ0VfVkIgOiBUQ0VfUENJOwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9pc2VyaWVzL3NldHVwLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2lzZXJpZXMvc2V0dXAuYwppbmRleCBhMGZmN2JhLi42ZjczNDY5IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2lzZXJpZXMvc2V0dXAuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2lzZXJpZXMvc2V0dXAuYwpAQCAtNjk0LDYgKzY5NCwxMSBAQAogewogCXVuc2lnbmVkIGxvbmcgcGh5c19tZW1fc2l6ZTsKIAorCS8qIElkZW50aWZ5IENQVSB0eXBlLiBUaGlzIGlzIGRvbmUgYWdhaW4gYnkgdGhlIGNvbW1vbiBjb2RlIGxhdGVyCisJICogb24gYnV0IGNhbGxpbmcgdGhpcyBmdW5jdGlvbiBtdWx0aXBsZSB0aW1lcyBpcyBmaW5lLgorCSAqLworCWlkZW50aWZ5X2NwdSgwKTsKKwogCXBvd2VycGNfZmlybXdhcmVfZmVhdHVyZXMgfD0gRldfRkVBVFVSRV9JU0VSSUVTOwogCXBvd2VycGNfZmlybXdhcmVfZmVhdHVyZXMgfD0gRldfRkVBVFVSRV9MUEFSOwogCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3Bvd2VybWFjL3NsZWVwLlMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3Bvd2VybWFjL3NsZWVwLlMKaW5kZXggMTE3NGNhMS4uYWRlZTI4ZCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wb3dlcm1hYy9zbGVlcC5TCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcG93ZXJtYWMvc2xlZXAuUwpAQCAtNDUsNyArNDUsOCBAQAogCS5zZWN0aW9uIC50ZXh0CiAJLmFsaWduCTUKIAotI2lmIGRlZmluZWQoQ09ORklHX1BNKSB8fCBkZWZpbmVkKENPTkZJR19DUFVfRlJFUV9QTUFDKQorI2lmIGRlZmluZWQoQ09ORklHX1BNKSB8fCBkZWZpbmVkKENPTkZJR19DUFVfRlJFUV9QTUFDKSB8fCBcCisgICAgKGRlZmluZWQoQ09ORklHX0hPVFBMVUdfQ1BVKSAmJiBkZWZpbmVkKENPTkZJR19QUEMzMikpCiAKIC8qIFRoaXMgZ2V0cyBjYWxsZWQgYnkgdmlhLXBtdS5jIGxhdGUgZHVyaW5nIHRoZSBzbGVlcCBwcm9jZXNzLgogICogVGhlIFBNVSB3YXMgYWxyZWFkeSBzZW5kIHRoZSBzbGVlcCBjb21tYW5kIGFuZCB3aWxsIHNodXQgdXMgZG93bgpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wc2VyaWVzL2lvbW11LmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvaW9tbXUuYwppbmRleCBkMjRiYTU0Li41NTZjMjc5IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvaW9tbXUuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvaW9tbXUuYwpAQCAtNTcsOSArNTcsNiBAQAogCXU2NCAqdGNlcDsKIAl1NjQgcnBuOwogCi0JaW5kZXggPDw9IFRDRV9QQUdFX0ZBQ1RPUjsKLQlucGFnZXMgPDw9IFRDRV9QQUdFX0ZBQ1RPUjsKLQogCXByb3RvX3RjZSA9IFRDRV9QQ0lfUkVBRDsgLy8gUmVhZCBhbGxvd2VkCiAKIAlpZiAoZGlyZWN0aW9uICE9IERNQV9UT19ERVZJQ0UpCkBAIC04Miw5ICs3OSw2IEBACiB7CiAJdTY0ICp0Y2VwOwogCi0JbnBhZ2VzIDw8PSBUQ0VfUEFHRV9GQUNUT1I7Ci0JaW5kZXggPDw9IFRDRV9QQUdFX0ZBQ1RPUjsKLQogCXRjZXAgPSAoKHU2NCAqKXRibC0+aXRfYmFzZSkgKyBpbmRleDsKIAogCXdoaWxlIChucGFnZXMtLSkKQEAgLTk1LDcgKzg5LDYgQEAKIHsKIAl1NjQgKnRjZXA7CiAKLQlpbmRleCA8PD0gVENFX1BBR0VfRkFDVE9SOwogCXRjZXAgPSAoKHU2NCAqKXRibC0+aXRfYmFzZSkgKyBpbmRleDsKIAogCXJldHVybiAqdGNlcDsKQEAgLTEwOSw5ICsxMDIsNiBAQAogCXU2NCBwcm90b190Y2UsIHRjZTsKIAl1NjQgcnBuOwogCi0JdGNlbnVtIDw8PSBUQ0VfUEFHRV9GQUNUT1I7Ci0JbnBhZ2VzIDw8PSBUQ0VfUEFHRV9GQUNUT1I7Ci0KIAlycG4gPSAodmlydF90b19hYnModWFkZHIpKSA+PiBUQ0VfU0hJRlQ7CiAJcHJvdG9fdGNlID0gVENFX1BDSV9SRUFEOwogCWlmIChkaXJlY3Rpb24gIT0gRE1BX1RPX0RFVklDRSkKQEAgLTE0Niw3ICsxMzYsNyBAQAogCXU2NCBycG47CiAJbG9uZyBsLCBsaW1pdDsKIAotCWlmIChUQ0VfUEFHRV9GQUNUT1IgPT0gMCAmJiBucGFnZXMgPT0gMSkKKwlpZiAobnBhZ2VzID09IDEpCiAJCXJldHVybiB0Y2VfYnVpbGRfcFNlcmllc0xQKHRibCwgdGNlbnVtLCBucGFnZXMsIHVhZGRyLAogCQkJCQkgICBkaXJlY3Rpb24pOwogCkBAIC0xNjQsOSArMTU0LDYgQEAKIAkJX19nZXRfY3B1X3Zhcih0Y2VfcGFnZSkgPSB0Y2VwOwogCX0KIAotCXRjZW51bSA8PD0gVENFX1BBR0VfRkFDVE9SOwotCW5wYWdlcyA8PD0gVENFX1BBR0VfRkFDVE9SOwotCiAJcnBuID0gKHZpcnRfdG9fYWJzKHVhZGRyKSkgPj4gVENFX1NISUZUOwogCXByb3RvX3RjZSA9IFRDRV9QQ0lfUkVBRDsKIAlpZiAoZGlyZWN0aW9uICE9IERNQV9UT19ERVZJQ0UpCkBAIC0yMDcsOSArMTk0LDYgQEAKIHsKIAl1NjQgcmM7CiAKLQl0Y2VudW0gPDw9IFRDRV9QQUdFX0ZBQ1RPUjsKLQlucGFnZXMgPDw9IFRDRV9QQUdFX0ZBQ1RPUjsKLQogCXdoaWxlIChucGFnZXMtLSkgewogCQlyYyA9IHBscGFyX3RjZV9wdXQoKHU2NCl0YmwtPml0X2luZGV4LCAodTY0KXRjZW51bSA8PCAxMiwgMCk7CiAKQEAgLTIyOSw5ICsyMTMsNiBAQAogewogCXU2NCByYzsKIAotCXRjZW51bSA8PD0gVENFX1BBR0VfRkFDVE9SOwotCW5wYWdlcyA8PD0gVENFX1BBR0VfRkFDVE9SOwotCiAJcmMgPSBwbHBhcl90Y2Vfc3R1ZmYoKHU2NCl0YmwtPml0X2luZGV4LCAodTY0KXRjZW51bSA8PCAxMiwgMCwgbnBhZ2VzKTsKIAogCWlmIChyYyAmJiBwcmludGtfcmF0ZWxpbWl0KCkpIHsKQEAgLTI0OCw3ICsyMjksNiBAQAogCXU2NCByYzsKIAl1bnNpZ25lZCBsb25nIHRjZV9yZXQ7CiAKLQl0Y2VudW0gPDw9IFRDRV9QQUdFX0ZBQ1RPUjsKIAlyYyA9IHBscGFyX3RjZV9nZXQoKHU2NCl0YmwtPml0X2luZGV4LCAodTY0KXRjZW51bSA8PCAxMiwgJnRjZV9yZXQpOwogCiAJaWYgKHJjICYmIHByaW50a19yYXRlbGltaXQoKSkgewpAQCAtMjg5LDcgKzI2OSw3IEBACiAJdGJsLT5pdF9idXNubyA9IHBoYi0+YnVzLT5udW1iZXI7CiAKIAkvKiBVbml0cyBvZiB0Y2UgZW50cmllcyAqLwotCXRibC0+aXRfb2Zmc2V0ID0gcGhiLT5kbWFfd2luZG93X2Jhc2VfY3VyID4+IFBBR0VfU0hJRlQ7CisJdGJsLT5pdF9vZmZzZXQgPSBwaGItPmRtYV93aW5kb3dfYmFzZV9jdXIgPj4gSU9NTVVfUEFHRV9TSElGVDsKIAogCS8qIFRlc3QgaWYgd2UgYXJlIGdvaW5nIG92ZXIgMkdCIG9mIERNQSBzcGFjZSAqLwogCWlmIChwaGItPmRtYV93aW5kb3dfYmFzZV9jdXIgKyBwaGItPmRtYV93aW5kb3dfc2l6ZSA+IDB4ODAwMDAwMDB1bCkgewpAQCAtMzAwLDcgKzI4MCw3IEBACiAJcGhiLT5kbWFfd2luZG93X2Jhc2VfY3VyICs9IHBoYi0+ZG1hX3dpbmRvd19zaXplOwogCiAJLyogU2V0IHRoZSB0Y2UgdGFibGUgc2l6ZSAtIG1lYXN1cmVkIGluIGVudHJpZXMgKi8KLQl0YmwtPml0X3NpemUgPSBwaGItPmRtYV93aW5kb3dfc2l6ZSA+PiBQQUdFX1NISUZUOworCXRibC0+aXRfc2l6ZSA9IHBoYi0+ZG1hX3dpbmRvd19zaXplID4+IElPTU1VX1BBR0VfU0hJRlQ7CiAKIAl0YmwtPml0X2luZGV4ID0gMDsKIAl0YmwtPml0X2Jsb2Nrc2l6ZSA9IDE2OwpAQCAtMzI1LDggKzMwNSw4IEBACiAJdGJsLT5pdF9iYXNlICAgPSAwOwogCXRibC0+aXRfYmxvY2tzaXplICA9IDE2OwogCXRibC0+aXRfdHlwZSA9IFRDRV9QQ0k7Ci0JdGJsLT5pdF9vZmZzZXQgPSBvZmZzZXQgPj4gUEFHRV9TSElGVDsKLQl0YmwtPml0X3NpemUgPSBzaXplID4+IFBBR0VfU0hJRlQ7CisJdGJsLT5pdF9vZmZzZXQgPSBvZmZzZXQgPj4gSU9NTVVfUEFHRV9TSElGVDsKKwl0YmwtPml0X3NpemUgPSBzaXplID4+IElPTU1VX1BBR0VfU0hJRlQ7CiB9CiAKIHN0YXRpYyB2b2lkIGlvbW11X2J1c19zZXR1cF9wU2VyaWVzKHN0cnVjdCBwY2lfYnVzICpidXMpCkBAIC01MjIsOCArNTAyLDYgQEAKIAljb25zdCB2b2lkICpkbWFfd2luZG93ID0gTlVMTDsKIAlzdHJ1Y3QgcGNpX2RuICpwY2k7CiAKLQlEQkcoImlvbW11X2Rldl9zZXR1cF9wU2VyaWVzTFAsIGRldiAlcCAoJXMpXG4iLCBkZXYsIHBjaV9uYW1lKGRldikpOwotCiAJLyogZGV2IHNldHVwIGZvciBMUEFSIGlzIGEgbGl0dGxlIHRyaWNreSwgc2luY2UgdGhlIGRldmljZSB0cmVlIG1pZ2h0CiAJICogY29udGFpbiB0aGUgZG1hLXdpbmRvdyBwcm9wZXJ0aWVzIHBlci1kZXZpY2UgYW5kIG5vdCBuZWNjZXNhcmlseQogCSAqIGZvciB0aGUgYnVzLiBTbyB3ZSBuZWVkIHRvIHNlYXJjaCB1cHdhcmRzIGluIHRoZSB0cmVlIHVudGlsIHdlCkBAIC01MzIsNiArNTEwLDkgQEAKIAkgKi8KIAlkbiA9IHBjaV9kZXZpY2VfdG9fT0Zfbm9kZShkZXYpOwogCisJREJHKCJpb21tdV9kZXZfc2V0dXBfcFNlcmllc0xQLCBkZXYgJXAgKCVzKSAlc1xuIiwKKwkgICAgIGRldiwgcGNpX25hbWUoZGV2KSwgZG4tPmZ1bGxfbmFtZSk7CisKIAlmb3IgKHBkbiA9IGRuOyBwZG4gJiYgUENJX0ROKHBkbikgJiYgIVBDSV9ETihwZG4pLT5pb21tdV90YWJsZTsKIAkgICAgIHBkbiA9IHBkbi0+cGFyZW50KSB7CiAJCWRtYV93aW5kb3cgPSBnZXRfcHJvcGVydHkocGRuLCAiaWJtLGRtYS13aW5kb3ciLCBOVUxMKTsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9zeXNkZXYvZGFydC5oIGIvYXJjaC9wb3dlcnBjL3N5c2Rldi9kYXJ0LmgKaW5kZXggMWM4ODE3Yy4uZmYyMDJlZCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3N5c2Rldi9kYXJ0LmgKKysrIGIvYXJjaC9wb3dlcnBjL3N5c2Rldi9kYXJ0LmgKQEAgLTcyLDcgKzcyLDYgQEAKIAogI2RlZmluZSBEQVJUX1BBR0VfU0hJRlQJCTEyCiAjZGVmaW5lIERBUlRfUEFHRV9TSVpFCQkoMSA8PCBEQVJUX1BBR0VfU0hJRlQpCi0jZGVmaW5lIERBUlRfUEFHRV9GQUNUT1IJKFBBR0VfU0hJRlQgLSBEQVJUX1BBR0VfU0hJRlQpCiAKIAogI2VuZGlmIC8qIF9QT1dFUlBDX1NZU0RFVl9EQVJUX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9zeXNkZXYvZGFydF9pb21tdS5jIGIvYXJjaC9wb3dlcnBjL3N5c2Rldi9kYXJ0X2lvbW11LmMKaW5kZXggMDNiNDQ3Ny4uNTcyYjc4NCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3N5c2Rldi9kYXJ0X2lvbW11LmMKKysrIGIvYXJjaC9wb3dlcnBjL3N5c2Rldi9kYXJ0X2lvbW11LmMKQEAgLTE1Niw5ICsxNTYsNiBAQAogCiAJREJHKCJkYXJ0OiBidWlsZCBhdDogJWx4LCAlbHgsIGFkZHI6ICV4XG4iLCBpbmRleCwgbnBhZ2VzLCB1YWRkcik7CiAKLQlpbmRleCA8PD0gREFSVF9QQUdFX0ZBQ1RPUjsKLQlucGFnZXMgPDw9IERBUlRfUEFHRV9GQUNUT1I7Ci0KIAlkcCA9ICgodW5zaWduZWQgaW50Kil0YmwtPml0X2Jhc2UpICsgaW5kZXg7CiAKIAkvKiBPbiBVMywgYWxsIG1lbW9yeSBpcyBjb250aWdvdXMsIHNvIHdlIGNhbiBtb3ZlIHRoaXMKQEAgLTE5OSw5ICsxOTYsNiBAQAogCiAJREJHKCJkYXJ0OiBmcmVlIGF0OiAlbHgsICVseFxuIiwgaW5kZXgsIG5wYWdlcyk7CiAKLQlpbmRleCA8PD0gREFSVF9QQUdFX0ZBQ1RPUjsKLQlucGFnZXMgPDw9IERBUlRfUEFHRV9GQUNUT1I7Ci0KIAlkcCAgPSAoKHVuc2lnbmVkIGludCAqKXRibC0+aXRfYmFzZSkgKyBpbmRleDsKIAogCXdoaWxlIChucGFnZXMtLSkKQEAgLTI4MSw3ICsyNzUsNyBAQAogCWlvbW11X3RhYmxlX2RhcnQuaXRfYnVzbm8gPSAwOwogCWlvbW11X3RhYmxlX2RhcnQuaXRfb2Zmc2V0ID0gMDsKIAkvKiBpdF9zaXplIGlzIGluIG51bWJlciBvZiBlbnRyaWVzICovCi0JaW9tbXVfdGFibGVfZGFydC5pdF9zaXplID0gKGRhcnRfdGFibGVzaXplIC8gc2l6ZW9mKHUzMikpID4+IERBUlRfUEFHRV9GQUNUT1I7CisJaW9tbXVfdGFibGVfZGFydC5pdF9zaXplID0gZGFydF90YWJsZXNpemUgLyBzaXplb2YodTMyKTsKIAogCS8qIEluaXRpYWxpemUgdGhlIGNvbW1vbiBJT01NVSBjb2RlICovCiAJaW9tbXVfdGFibGVfZGFydC5pdF9iYXNlID0gKHVuc2lnbmVkIGxvbmcpZGFydF92YmFzZTsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9zeXNkZXYvaTgyNTkuYyBiL2FyY2gvcG93ZXJwYy9zeXNkZXYvaTgyNTkuYwppbmRleCAwNDUwMjY1Li5hZDg3YWRjOSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3N5c2Rldi9pODI1OS5jCisrKyBiL2FyY2gvcG93ZXJwYy9zeXNkZXYvaTgyNTkuYwpAQCAtMjI0LDYgKzIyNCwxMSBAQAogCS54bGF0ZSA9IGk4MjU5X2hvc3RfeGxhdGUsCiB9OwogCitzdHJ1Y3QgaXJxX2hvc3QgKmk4MjU5X2dldF9ob3N0KHZvaWQpCit7CisJcmV0dXJuIGk4MjU5X2hvc3Q7Cit9CisKIC8qKgogICogaTgyNTlfaW5pdCAtIEluaXRpYWxpemUgdGhlIGxlZ2FjeSBjb250cm9sbGVyCiAgKiBAbm9kZTogZGV2aWNlIG5vZGUgb2YgdGhlIGxlZ2FjeSBQSUMgKGNhbiBiZSBOVUxMLCBidXQgdGhlbiwgaXQgd2lsbCBtYXRjaApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3N5c2Rldi9pcGljLmMgYi9hcmNoL3Bvd2VycGMvc3lzZGV2L2lwaWMuYwppbmRleCBiYzRkNGE3Li43NDZmNzhjIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvc3lzZGV2L2lwaWMuYworKysgYi9hcmNoL3Bvd2VycGMvc3lzZGV2L2lwaWMuYwpAQCAtNDczLDkgKzQ3Myw5IEBACiAJZGVzYy0+c3RhdHVzIHw9IGZsb3dfdHlwZSAmIElSUV9UWVBFX1NFTlNFX01BU0s7CiAJaWYgKGZsb3dfdHlwZSAmIElSUV9UWVBFX0xFVkVMX0xPVykgIHsKIAkJZGVzYy0+c3RhdHVzIHw9IElSUV9MRVZFTDsKLQkJc2V0X2lycV9oYW5kbGVyKHZpcnEsIGhhbmRsZV9sZXZlbF9pcnEpOworCQlkZXNjLT5oYW5kbGVfaXJxID0gaGFuZGxlX2xldmVsX2lycTsKIAl9IGVsc2UgewotCQlzZXRfaXJxX2hhbmRsZXIodmlycSwgaGFuZGxlX2VkZ2VfaXJxKTsKKwkJZGVzYy0+aGFuZGxlX2lycSA9IGhhbmRsZV9lZGdlX2lycTsKIAl9CiAKIAkvKiBvbmx5IEVYVCBJUlEgc2Vuc2VzIGFyZSBwcm9ncmFtbWFibGUgb24gaXBpYwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3N5c2Rldi9xZV9saWIvcWUuYyBiL2FyY2gvcG93ZXJwYy9zeXNkZXYvcWVfbGliL3FlLmMKaW5kZXggMmJhZTYzMi4uZTQyMjMyMiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3N5c2Rldi9xZV9saWIvcWUuYworKysgYi9hcmNoL3Bvd2VycGMvc3lzZGV2L3FlX2xpYi9xZS5jCkBAIC0xMjIsOCArMTIyLDcgQEAKIAkJCQltY25fc2hpZnQgPSBRRV9DUl9NQ05fTk9STUFMX1NISUZUOwogCQl9CiAKLQkJb3V0X2JlMzIoJnFlX2ltbXItPmNwLmNlY2RyLAotCQkJIGltbXJiYXJfdmlydF90b19waHlzKCh2b2lkICopY21kX2lucHV0KSk7CisJCW91dF9iZTMyKCZxZV9pbW1yLT5jcC5jZWNkciwgY21kX2lucHV0KTsKIAkJb3V0X2JlMzIoJnFlX2ltbXItPmNwLmNlY3IsCiAJCQkgKGNtZCB8IFFFX0NSX0ZMRyB8ICgodTMyKSBkZXZpY2UgPDwgZGV2X3NoaWZ0KSB8ICh1MzIpCiAJCQkgIG1jbl9wcm90b2NvbCA8PCBtY25fc2hpZnQpKTsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9zeXNkZXYvcWVfbGliL3VjYy5jIGIvYXJjaC9wb3dlcnBjL3N5c2Rldi9xZV9saWIvdWNjLmMKaW5kZXggOTE2YzllNS4uYWMxMmE0NCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3N5c2Rldi9xZV9saWIvdWNjLmMKKysrIGIvYXJjaC9wb3dlcnBjL3N5c2Rldi9xZV9saWIvdWNjLmMKQEAgLTIwNyw2ICsyMDcsNyBAQAogCQljYXNlIFFFX0NMSzE4Oglzb3VyY2UgPSA4OyBicmVhazsKIAkJY2FzZSBRRV9DTEs3Oglzb3VyY2UgPSA5OyBicmVhazsKIAkJY2FzZSBRRV9DTEs4Oglzb3VyY2UgPSAxMDsgYnJlYWs7CisJCWNhc2UgUUVfQ0xLMTY6CXNvdXJjZSA9IDExOyBicmVhazsKIAkJZGVmYXVsdDoJc291cmNlID0gLTE7IGJyZWFrOwogCQl9CiAJCWJyZWFrOwpAQCAtMjIyLDYgKzIyMyw3IEBACiAJCWNhc2UgUUVfQ0xLMjI6CXNvdXJjZSA9IDg7IGJyZWFrOwogCQljYXNlIFFFX0NMSzc6CXNvdXJjZSA9IDk7IGJyZWFrOwogCQljYXNlIFFFX0NMSzg6CXNvdXJjZSA9IDEwOyBicmVhazsKKwkJY2FzZSBRRV9DTEsxNjoJc291cmNlID0gMTE7IGJyZWFrOwogCQlkZWZhdWx0OiAJc291cmNlID0gLTE7IGJyZWFrOwogCQl9CiAJCWJyZWFrOwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3N5c2Rldi9xZV9saWIvdWNjX2Zhc3QuYyBiL2FyY2gvcG93ZXJwYy9zeXNkZXYvcWVfbGliL3VjY19mYXN0LmMKaW5kZXggYzJiZTczNC4uNzVmYTMxMCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3N5c2Rldi9xZV9saWIvdWNjX2Zhc3QuYworKysgYi9hcmNoL3Bvd2VycGMvc3lzZGV2L3FlX2xpYi91Y2NfZmFzdC5jCkBAIC0xNjMsNyArMTYzLDcgQEAKIAogCS8qIGNoZWNrIGlmIHRoZSBVQ0MgcG9ydCBudW1iZXIgaXMgaW4gcmFuZ2UuICovCiAJaWYgKCh1Zl9pbmZvLT51Y2NfbnVtIDwgMCkgfHwgKHVmX2luZm8tPnVjY19udW0gPiBVQ0NfTUFYX05VTSAtIDEpKSB7Ci0JCXVjY2ZfZXJyKCJ1Y2NfZmFzdF9pbml0OiBJbGxhZ2FsIFVDQyBudW1iZXIhIik7CisJCXVjY2ZfZXJyKCJ1Y2NfZmFzdF9pbml0OiBJbGxlZ2FsIFVDQyBudW1iZXIhIik7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3N5c2Rldi9xZV9saWIvdWNjX3Nsb3cuYyBiL2FyY2gvcG93ZXJwYy9zeXNkZXYvcWVfbGliL3VjY19zbG93LmMKaW5kZXggMWZiODhlZi4uYTQ5ZGE2YiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3N5c2Rldi9xZV9saWIvdWNjX3Nsb3cuYworKysgYi9hcmNoL3Bvd2VycGMvc3lzZGV2L3FlX2xpYi91Y2Nfc2xvdy5jCkBAIC0xNTIsNyArMTUyLDcgQEAKIAogCS8qIGNoZWNrIGlmIHRoZSBVQ0MgcG9ydCBudW1iZXIgaXMgaW4gcmFuZ2UuICovCiAJaWYgKCh1c19pbmZvLT51Y2NfbnVtIDwgMCkgfHwgKHVzX2luZm8tPnVjY19udW0gPiBVQ0NfTUFYX05VTSAtIDEpKSB7Ci0JCXVjY3NfZXJyKCJ1Y2Nfc2xvd19pbml0OiBJbGxhZ2FsIFVDQyBudW1iZXIhIik7CisJCXVjY3NfZXJyKCJ1Y2Nfc2xvd19pbml0OiBJbGxlZ2FsIFVDQyBudW1iZXIhIik7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3N5c2Rldi90c2kxMDhfZGV2LmMgYi9hcmNoL3Bvd2VycGMvc3lzZGV2L3RzaTEwOF9kZXYuYwppbmRleCAxMWRlMDkwLi45N2YzN2VmIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvc3lzZGV2L3RzaTEwOF9kZXYuYworKysgYi9hcmNoL3Bvd2VycGMvc3lzZGV2L3RzaTEwOF9kZXYuYwpAQCAtNDgsNyArNDgsNyBAQAogCXRzaSA9IG9mX2ZpbmRfbm9kZV9ieV90eXBlKE5VTEwsICJ0c2ktYnJpZGdlIik7CiAJaWYgKHRzaSkgewogCQl1bnNpZ25lZCBpbnQgc2l6ZTsKLQkJdm9pZCAqcHJvcCA9IGdldF9wcm9wZXJ0eSh0c2ksICJyZWciLCAmc2l6ZSk7CisJCWNvbnN0IHZvaWQgKnByb3AgPSBnZXRfcHJvcGVydHkodHNpLCAicmVnIiwgJnNpemUpOwogCQl0c2kxMDhfY3NyX2Jhc2UgPSBvZl90cmFuc2xhdGVfYWRkcmVzcyh0c2ksIHByb3ApOwogCQlvZl9ub2RlX3B1dCh0c2kpOwogCX07CkBAIC03OSw3ICs3OSw3IEBACiAJCWh3X2luZm8gdHNpX2V0aF9kYXRhOwogCQl1bnNpZ25lZCBpbnQgKmlkOwogCQl1bnNpZ25lZCBpbnQgKnBoeV9pZDsKLQkJdm9pZCAqbWFjX2FkZHI7CisJCWNvbnN0IHZvaWQgKm1hY19hZGRyOwogCQlwaGFuZGxlICpwaDsKIAogCQltZW1zZXQociwgMCwgc2l6ZW9mKHIpKTsKZGlmZiAtLWdpdCBhL2FyY2gvcHBjL2Jvb3Qvc2ltcGxlL3JlbG9jYXRlLlMgYi9hcmNoL3BwYy9ib290L3NpbXBsZS9yZWxvY2F0ZS5TCmluZGV4IDBjMDIxNTUuLjFiYmJjZDIgMTAwNjQ0Ci0tLSBhL2FyY2gvcHBjL2Jvb3Qvc2ltcGxlL3JlbG9jYXRlLlMKKysrIGIvYXJjaC9wcGMvYm9vdC9zaW1wbGUvcmVsb2NhdGUuUwpAQCAtMTU0LDggKzE1NCw4IEBACiAKIHN0YXJ0X2xkcjoKIC8qIENsZWFyIGFsbCBvZiBCU1MgYW5kIHNldCB1cCBzdGFjayBmb3IgQyBjYWxscyAqLwotCWxpcwlyMyxlZGF0YUBoCi0Jb3JpCXIzLHIzLGVkYXRhQGwKKwlsaXMJcjMsX19ic3Nfc3RhcnRAaAorCW9yaQlyMyxyMyxfX2Jzc19zdGFydEBsCiAJbGlzCXI0LGVuZEBoCiAJb3JpCXI0LHI0LGVuZEBsCiAJc3ViaQlyMyxyMyw0CkBAIC0xNjMsNyArMTYzLDcgQEAKIAlsaQlyMCwwCiA1MDoJc3R3dQlyMCw0KHIzKQogCWNtcHcJY3IwLHIzLHI0Ci0JYm5lCTUwYgorCWJsdAk1MGIKIDkwOgltcglyOSxyMQkJLyogU2F2ZSBvbGQgc3RhY2sgcG9pbnRlciAoaW4gY2FzZSBpdCBtYXR0ZXJzKSAqLwogCWxpcwlyMSwuc3RhY2tAaAogCW9yaQlyMSxyMSwuc3RhY2tAbApkaWZmIC0tZ2l0IGEvYXJjaC9wcGMva2VybmVsL21pc2MuUyBiL2FyY2gvcHBjL2tlcm5lbC9taXNjLlMKaW5kZXggNWY2Njg0MC4uZDMxOWY5YiAxMDA2NDQKLS0tIGEvYXJjaC9wcGMva2VybmVsL21pc2MuUworKysgYi9hcmNoL3BwYy9rZXJuZWwvbWlzYy5TCkBAIC0xMTAsODAgKzExMCw2IEBACiAJYmxyCiAKIC8qCi0gKiBpZGVudGlmeV9jcHUsCi0gKiBjYWxsZWQgd2l0aCByMyA9IGRhdGEgb2Zmc2V0IGFuZCByNCA9IENQVSBudW1iZXIKLSAqIGRvZXNuJ3QgY2hhbmdlIHIzCi0gKi8KLV9HTE9CQUwoaWRlbnRpZnlfY3B1KQotCWFkZGlzCXI4LHIzLGNwdV9zcGVjc0BoYQotCWFkZGkJcjgscjgsY3B1X3NwZWNzQGwKLQltZnB2cglyNwotMToKLQlsd3oJcjUsQ1BVX1NQRUNfUFZSX01BU0socjgpCi0JYW5kCXI1LHI1LHI3Ci0JbHd6CXI2LENQVV9TUEVDX1BWUl9WQUxVRShyOCkKLQljbXBsdwkwLHI2LHI1Ci0JYmVxCTFmCi0JYWRkaQlyOCxyOCxDUFVfU1BFQ19FTlRSWV9TSVpFCi0JYgkxYgotMToKLQlhZGRpcwlyNixyMyxjdXJfY3B1X3NwZWNAaGEKLQlhZGRpCXI2LHI2LGN1cl9jcHVfc3BlY0BsCi0Jc3ViCXI4LHI4LHIzCi0Jc3R3CXI4LDAocjYpCi0JYmxyCi0KLS8qCi0gKiBkb19jcHVfZnRyX2ZpeHVwcyAtIGdvZXMgdGhyb3VnaCB0aGUgbGlzdCBvZiBDUFUgZmVhdHVyZSBmaXh1cHMKLSAqIGFuZCB3cml0ZXMgbm9wJ3Mgb3ZlciBzZWN0aW9ucyBvZiBjb2RlIHRoYXQgZG9uJ3QgYXBwbHkgZm9yIHRoaXMgY3B1LgotICogcjMgPSBkYXRhIG9mZnNldCAobm90IGNoYW5nZWQpCi0gKi8KLV9HTE9CQUwoZG9fY3B1X2Z0cl9maXh1cHMpCi0JLyogR2V0IENQVSAwIGZlYXR1cmVzICovCi0JYWRkaXMJcjYscjMsY3VyX2NwdV9zcGVjQGhhCi0JYWRkaQlyNixyNixjdXJfY3B1X3NwZWNAbAotCWx3eglyNCwwKHI2KQotCWFkZAlyNCxyNCxyMwotCWx3eglyNCxDUFVfU1BFQ19GRUFUVVJFUyhyNCkKLQotCS8qIEdldCB0aGUgZml4dXAgdGFibGUgKi8KLQlhZGRpcwlyNixyMyxfX3N0YXJ0X19fZnRyX2ZpeHVwQGhhCi0JYWRkaQlyNixyNixfX3N0YXJ0X19fZnRyX2ZpeHVwQGwKLQlhZGRpcwlyNyxyMyxfX3N0b3BfX19mdHJfZml4dXBAaGEKLQlhZGRpCXI3LHI3LF9fc3RvcF9fX2Z0cl9maXh1cEBsCi0KLQkvKiBEbyB0aGUgZml4dXAgKi8KLTE6CWNtcGx3CTAscjYscjcKLQliZ2VscgotCWFkZGkJcjYscjYsMTYKLQlsd3oJcjgsLTE2KHI2KQkvKiBtYXNrICovCi0JYW5kCXI4LHI4LHI0Ci0JbHd6CXI5LC0xMihyNikJLyogdmFsdWUgKi8KLQljbXBsdwkwLHI4LHI5Ci0JYmVxCTFiCi0JbHd6CXI4LC04KHI2KQkvKiBzZWN0aW9uIGJlZ2luICovCi0JbHd6CXI5LC00KHI2KQkvKiBzZWN0aW9uIGVuZCAqLwotCXN1YmYuCXI5LHI4LHI5Ci0JYmVxCTFiCi0JLyogd3JpdGUgbm9wcyBvdmVyIHRoZSBzZWN0aW9uIG9mIGNvZGUgKi8KLQkvKiB0b2RvOiBpZiBsYXJnZSBzZWN0aW9uLCBhZGQgYSBicmFuY2ggYXQgdGhlIHN0YXJ0IG9mIGl0ICovCi0Jc3J3aQlyOSxyOSwyCi0JbXRjdHIJcjkKLQlhZGQJcjgscjgscjMKLQlsaXMJcjAsMHg2MDAwMDAwMEBoCS8qIG5vcCAqLwotMzoJc3R3CXIwLDAocjgpCi0JYW5kaS4JcjEwLHI0LENQVV9GVFJfU1BMSVRfSURfQ0FDSEVAbAotCWJlcQkyZgotCWRjYnN0CTAscjgJCS8qIHN1Ym9wdGltYWwsIGJ1dCBzaW1wbGVyICovCi0Jc3luYwotCWljYmkJMCxyOAotMjoJYWRkaQlyOCxyOCw0Ci0JYmRuegkzYgotCXN5bmMJCQkvKiBhZGRpdGlvbmFsIHN5bmMgbmVlZGVkIG9uIGc0ICovCi0JaXN5bmMKLQliCTFiCi0KLS8qCiAgKiBjYWxsX3NldHVwX2NwdSAtIGNhbGwgdGhlIHNldHVwX2NwdSBmdW5jdGlvbiBmb3IgdGhpcyBjcHUKICAqIHIzID0gZGF0YSBvZmZzZXQsIHIyNCA9IGNwdSBudW1iZXIKICAqCmRpZmYgLS1naXQgYS9hcmNoL3BwYy9rZXJuZWwvc2V0dXAuYyBiL2FyY2gvcHBjL2tlcm5lbC9zZXR1cC5jCmluZGV4IDc1ZmUxMzguLjI3ZmFlY2EgMTAwNjQ0Ci0tLSBhL2FyY2gvcHBjL2tlcm5lbC9zZXR1cC5jCisrKyBiL2FyY2gvcHBjL2tlcm5lbC9zZXR1cC5jCkBAIC0zOCw2ICszOCw3IEBACiAjaW5jbHVkZSA8YXNtL252cmFtLmg+CiAjaW5jbHVkZSA8YXNtL3htb24uaD4KICNpbmNsdWRlIDxhc20vb2NwLmg+CisjaW5jbHVkZSA8YXNtL3Byb20uaD4KIAogI2RlZmluZSBVU0VTX1BQQ19TWVMgKGRlZmluZWQoQ09ORklHXzg1eHgpIHx8IGRlZmluZWQoQ09ORklHXzgzeHgpIHx8IFwKIAkJICAgICAgZGVmaW5lZChDT05GSUdfTVBDMTBYX0JSSURHRSkgfHwgZGVmaW5lZChDT05GSUdfODI2MCkgfHwgXApAQCAtNTMsOCArNTQsNiBAQAogCiBleHRlcm4gdm9pZCBwbGF0Zm9ybV9pbml0KHVuc2lnbmVkIGxvbmcgcjMsIHVuc2lnbmVkIGxvbmcgcjQsCiAJCXVuc2lnbmVkIGxvbmcgcjUsIHVuc2lnbmVkIGxvbmcgcjYsIHVuc2lnbmVkIGxvbmcgcjcpOwotZXh0ZXJuIHZvaWQgaWRlbnRpZnlfY3B1KHVuc2lnbmVkIGxvbmcgb2Zmc2V0LCB1bnNpZ25lZCBsb25nIGNwdSk7Ci1leHRlcm4gdm9pZCBkb19jcHVfZnRyX2ZpeHVwcyh1bnNpZ25lZCBsb25nIG9mZnNldCk7CiBleHRlcm4gdm9pZCByZWxvY19nb3QyKHVuc2lnbmVkIGxvbmcgb2Zmc2V0KTsKIAogZXh0ZXJuIHZvaWQgcHBjNnh4X2lkbGUodm9pZCk7CkBAIC0zMDEsNiArMzAwLDcgQEAKIHsKICAJdW5zaWduZWQgbG9uZyBwaHlzOwogCXVuc2lnbmVkIGxvbmcgb2Zmc2V0ID0gcmVsb2Nfb2Zmc2V0KCk7CisJc3RydWN0IGNwdV9zcGVjICpzcGVjOwogCiAgCS8qIERlZmF1bHQgKi8KICAJcGh5cyA9IG9mZnNldCArIEtFUk5FTEJBU0U7CkBAIC0zMTMsOCArMzEzLDEwIEBACiAJICogSWRlbnRpZnkgdGhlIENQVSB0eXBlIGFuZCBmaXggdXAgY29kZSBzZWN0aW9ucwogCSAqIHRoYXQgZGVwZW5kIG9uIHdoaWNoIGNwdSB3ZSBoYXZlLgogCSAqLwotCWlkZW50aWZ5X2NwdShvZmZzZXQsIDApOwotCWRvX2NwdV9mdHJfZml4dXBzKG9mZnNldCk7CisJc3BlYyA9IGlkZW50aWZ5X2NwdShvZmZzZXQpOworCWRvX2ZlYXR1cmVfZml4dXBzKHNwZWMtPmNwdV9mZWF0dXJlcywKKwkJCSAgUFRSUkVMT0MoJl9fc3RhcnRfX19mdHJfZml4dXApLAorCQkJICBQVFJSRUxPQygmX19zdG9wX19fZnRyX2ZpeHVwKSk7CiAKIAlyZXR1cm4gcGh5czsKIH0KZGlmZiAtLWdpdCBhL2FyY2gvcHBjL2tlcm5lbC90aW1lLmMgYi9hcmNoL3BwYy9rZXJuZWwvdGltZS5jCmluZGV4IGQ0YjJjZjcuLjE4ZWU4NTEgMTAwNjQ0Ci0tLSBhL2FyY2gvcHBjL2tlcm5lbC90aW1lLmMKKysrIGIvYXJjaC9wcGMva2VybmVsL3RpbWUuYwpAQCAtNjIsNiArNjIsNyBAQAogI2luY2x1ZGUgPGFzbS9jYWNoZS5oPgogI2luY2x1ZGUgPGFzbS84eHhfaW1tYXAuaD4KICNpbmNsdWRlIDxhc20vbWFjaGRlcC5oPgorI2luY2x1ZGUgPGFzbS9pcnFfcmVncy5oPgogCiAjaW5jbHVkZSA8YXNtL3RpbWUuaD4KIApAQCAtMTI5LDYgKzEzMCw3IEBACiAgKi8KIHZvaWQgdGltZXJfaW50ZXJydXB0KHN0cnVjdCBwdF9yZWdzICogcmVncykKIHsKKwlzdHJ1Y3QgcHRfcmVncyAqb2xkX3JlZ3M7CiAJaW50IG5leHRfZGVjOwogCXVuc2lnbmVkIGxvbmcgY3B1ID0gc21wX3Byb2Nlc3Nvcl9pZCgpOwogCXVuc2lnbmVkIGppZmZ5X3N0YW1wID0gbGFzdF9qaWZmeV9zdGFtcChjcHUpOwpAQCAtMTM3LDYgKzEzOSw3IEBACiAJaWYgKGF0b21pY19yZWFkKCZwcGNfbl9sb3N0X2ludGVycnVwdHMpICE9IDApCiAJCWRvX0lSUShyZWdzKTsKIAorCW9sZF9yZWdzID0gc2V0X2lycV9yZWdzKHJlZ3MpOwogCWlycV9lbnRlcigpOwogCiAJd2hpbGUgKChuZXh0X2RlYyA9IHRiX3RpY2tzX3Blcl9qaWZmeSAtIHRiX2RlbHRhKCZqaWZmeV9zdGFtcCkpIDw9IDApIHsKQEAgLTE4OCw2ICsxOTEsNyBAQAogCQlwcGNfbWQuaGVhcnRiZWF0KCk7CiAKIAlpcnFfZXhpdCgpOworCXNldF9pcnFfcmVncyhvbGRfcmVncyk7CiB9CiAKIC8qCmRpZmYgLS1naXQgYS9hcmNoL3BwYy9rZXJuZWwvdHJhcHMuYyBiL2FyY2gvcHBjL2tlcm5lbC90cmFwcy5jCmluZGV4IGFhZmM4ZTguLjk2NjFhOTEgMTAwNjQ0Ci0tLSBhL2FyY2gvcHBjL2tlcm5lbC90cmFwcy5jCisrKyBiL2FyY2gvcHBjL2tlcm5lbC90cmFwcy5jCkBAIC03MDgsNyArNzA4LDcgQEAKIAogdm9pZCBhbGlnbm1lbnRfZXhjZXB0aW9uKHN0cnVjdCBwdF9yZWdzICpyZWdzKQogewotCWludCBmaXhlZDsKKwlpbnQgc2lnLCBjb2RlLCBmaXhlZCA9IDA7CiAKIAlmaXhlZCA9IGZpeF9hbGlnbm1lbnQocmVncyk7CiAJaWYgKGZpeGVkID09IDEpIHsKQEAgLTcxNywxNCArNzE3LDE2IEBACiAJCXJldHVybjsKIAl9CiAJaWYgKGZpeGVkID09IC1FRkFVTFQpIHsKLQkJLyogZml4ZWQgPT0gLUVGQVVMVCBtZWFucyB0aGUgb3BlcmFuZCBhZGRyZXNzIHdhcyBiYWQgKi8KLQkJaWYgKHVzZXJfbW9kZShyZWdzKSkKLQkJCV9leGNlcHRpb24oU0lHU0VHViwgcmVncywgU0VHVl9BQ0NFUlIsIHJlZ3MtPmRhcik7Ci0JCWVsc2UKLQkJCWJhZF9wYWdlX2ZhdWx0KHJlZ3MsIHJlZ3MtPmRhciwgU0lHU0VHVik7Ci0JCXJldHVybjsKKwkJc2lnID0gU0lHU0VHVjsKKwkJY29kZSA9IFNFR1ZfQUNDRVJSOworCX0gZWxzZSB7CisJCXNpZyA9IFNJR0JVUzsKKwkJY29kZSA9IEJVU19BRFJBTE47CiAJfQotCV9leGNlcHRpb24oU0lHQlVTLCByZWdzLCBCVVNfQURSQUxOLCByZWdzLT5kYXIpOworCWlmICh1c2VyX21vZGUocmVncykpCisJCV9leGNlcHRpb24oc2lnLCByZWdzLCBjb2RlLCByZWdzLT5kYXIpOworCWVsc2UKKwkJYmFkX3BhZ2VfZmF1bHQocmVncywgcmVncy0+ZGFyLCBzaWcpOwogfQogCiB2b2lkIFN0YWNrT3ZlcmZsb3coc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCmRpZmYgLS1naXQgYS9hcmNoL3BwYy9rZXJuZWwvdm1saW51eC5sZHMuUyBiL2FyY2gvcHBjL2tlcm5lbC92bWxpbnV4Lmxkcy5TCmluZGV4IDA5NWZkMzMuLjE2ZTg2NjEgMTAwNjQ0Ci0tLSBhL2FyY2gvcHBjL2tlcm5lbC92bWxpbnV4Lmxkcy5TCisrKyBiL2FyY2gvcHBjL2tlcm5lbC92bWxpbnV4Lmxkcy5TCkBAIC0xMTUsMTMgKzExNSw3IEBACiAgIF9fc2V0dXBfZW5kID0gLjsKICAgX19pbml0Y2FsbF9zdGFydCA9IC47CiAgIC5pbml0Y2FsbC5pbml0IDogewotCSooLmluaXRjYWxsMS5pbml0KQotCSooLmluaXRjYWxsMi5pbml0KQotCSooLmluaXRjYWxsMy5pbml0KQotCSooLmluaXRjYWxsNC5pbml0KQotCSooLmluaXRjYWxsNS5pbml0KQotCSooLmluaXRjYWxsNi5pbml0KQotCSooLmluaXRjYWxsNy5pbml0KQorCUlOSVRDQUxMUwogICB9CiAgIF9faW5pdGNhbGxfZW5kID0gLjsKIApkaWZmIC0tZ2l0IGEvYXJjaC9wcGMvbW0vaW5pdC5jIGIvYXJjaC9wcGMvbW0vaW5pdC5jCmluZGV4IDQxMDIwMDAuLmMzNzRlNTMgMTAwNjQ0Ci0tLSBhL2FyY2gvcHBjL21tL2luaXQuYworKysgYi9hcmNoL3BwYy9tbS9pbml0LmMKQEAgLTM3NCwxMSArMzc0LDEyIEBACiAJZW5kX3BmbiA9IHN0YXJ0X3BmbiArICh0b3RhbF9tZW1vcnkgPj4gUEFHRV9TSElGVCk7CiAJYWRkX2FjdGl2ZV9yYW5nZSgwLCBzdGFydF9wZm4sIGVuZF9wZm4pOwogCisJbWVtc2V0KG1heF96b25lX3BmbnMsIDAsIHNpemVvZihtYXhfem9uZV9wZm5zKSk7CiAjaWZkZWYgQ09ORklHX0hJR0hNRU0KLQltYXhfem9uZV9wZm5zWzBdID0gdG90YWxfbG93bWVtID4+IFBBR0VfU0hJRlQ7Ci0JbWF4X3pvbmVfcGZuc1sxXSA9IHRvdGFsX21lbW9yeSA+PiBQQUdFX1NISUZUOworCW1heF96b25lX3BmbnNbWk9ORV9ETUFdID0gdG90YWxfbG93bWVtID4+IFBBR0VfU0hJRlQ7CisJbWF4X3pvbmVfcGZuc1taT05FX0hJR0hNRU1dID0gdG90YWxfbWVtb3J5ID4+IFBBR0VfU0hJRlQ7CiAjZWxzZQotCW1heF96b25lX3BmbnNbMF0gPSB0b3RhbF9tZW1vcnkgPj4gUEFHRV9TSElGVDsKKwltYXhfem9uZV9wZm5zW1pPTkVfRE1BXSA9IHRvdGFsX21lbW9yeSA+PiBQQUdFX1NISUZUOwogI2VuZGlmIC8qIENPTkZJR19ISUdITUVNICovCiAJZnJlZV9hcmVhX2luaXRfbm9kZXMobWF4X3pvbmVfcGZucyk7CiB9CmRpZmYgLS1naXQgYS9hcmNoL3BwYy9wbGF0Zm9ybXMvbXBjODI3MmFkc19zZXR1cC5jIGIvYXJjaC9wcGMvcGxhdGZvcm1zL21wYzgyNzJhZHNfc2V0dXAuYwppbmRleCBkN2IzYTZhLi4xZjllYTM2OCAxMDA2NDQKLS0tIGEvYXJjaC9wcGMvcGxhdGZvcm1zL21wYzgyNzJhZHNfc2V0dXAuYworKysgYi9hcmNoL3BwYy9wbGF0Zm9ybXMvbXBjODI3MmFkc19zZXR1cC5jCkBAIC0xOTYsNyArMTk2LDcgQEAKIAliZF90KiBiaSA9ICh2b2lkKilfX3JlczsKIAlpbnQgZnNfbm8gPSBmc2lkX2ZjYzErcGRldi0+aWQtMTsKIAotCWlmKGZzX25vID4gQVJSQVlfU0laRShtcGM4Mnh4X2VuZXRfcGRhdGEpKSB7CisJaWYoZnNfbm8gPj0gQVJSQVlfU0laRShtcGM4Mnh4X2VuZXRfcGRhdGEpKSB7CiAJCXJldHVybjsKIAl9CiAKQEAgLTIyMiw3ICsyMjIsNyBAQAogCWludCBpZCA9IGZzX3VhcnRfaWRfc2NjMmZzaWQoaWR4KTsKIAogCS8qIG5vIG5lZWQgdG8gYWx0ZXIgYW55dGhpbmcgaWYgY29uc29sZSAqLwotCWlmICgoaWQgPD0gbnVtKSAmJiAoIXBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhKSkgeworCWlmICgoaWQgPCBudW0pICYmICghcGRldi0+ZGV2LnBsYXRmb3JtX2RhdGEpKSB7CiAJCXBpbmZvID0gJm1wYzgyNzJfdWFydF9wZGF0YVtpZF07CiAJCXBpbmZvLT51YXJ0X2NsayA9IGJkLT5iaV9pbnRmcmVxOwogCQlwZGV2LT5kZXYucGxhdGZvcm1fZGF0YSA9IHBpbmZvOwpkaWZmIC0tZ2l0IGEvYXJjaC9wcGMvcGxhdGZvcm1zL21wYzg2NmFkc19zZXR1cC5jIGIvYXJjaC9wcGMvcGxhdGZvcm1zL21wYzg2NmFkc19zZXR1cC5jCmluZGV4IDVmMTMwZGMuLmU5NWQyYzEgMTAwNjQ0Ci0tLSBhL2FyY2gvcHBjL3BsYXRmb3Jtcy9tcGM4NjZhZHNfc2V0dXAuYworKysgYi9hcmNoL3BwYy9wbGF0Zm9ybXMvbXBjODY2YWRzX3NldHVwLmMKQEAgLTI1OSw3ICsyNTksNyBAQAogCS8qIEdldCBwb2ludGVyIHRvIENvbW11bmljYXRpb24gUHJvY2Vzc29yICovCiAJY3AgPSBjcG1wOwogCi0JaWYoZnNfbm8gPiBBUlJBWV9TSVpFKG1wYzh4eF9lbmV0X3BkYXRhKSkgeworCWlmKGZzX25vID49IEFSUkFZX1NJWkUobXBjOHh4X2VuZXRfcGRhdGEpKSB7CiAJCXByaW50ayhLRVJOX0VSUiJObyBuZXR3b3JrLXN1aXRhYmxlICMlZCBkZXZpY2Ugb24gYnVzIiwgZnNfbm8pOwogCQlyZXR1cm47CiAJfQpAQCAtMzA1LDcgKzMwNSw3IEBACiAJaW50IGlkID0gZnNfdWFydF9pZF9zbWMyZnNpZChpZHgpOwogCiAJLyogbm8gbmVlZCB0byBhbHRlciBhbnl0aGluZyBpZiBjb25zb2xlICovCi0JaWYgKChpZCA8PSBudW0pICYmICghcGRldi0+ZGV2LnBsYXRmb3JtX2RhdGEpKSB7CisJaWYgKChpZCA8IG51bSkgJiYgKCFwZGV2LT5kZXYucGxhdGZvcm1fZGF0YSkpIHsKIAkJcGluZm8gPSAmbXBjODY2X3VhcnRfcGRhdGFbaWRdOwogCQlwaW5mby0+dWFydF9jbGsgPSBiZC0+YmlfaW50ZnJlcTsKIAkJcGRldi0+ZGV2LnBsYXRmb3JtX2RhdGEgPSBwaW5mbzsKZGlmZiAtLWdpdCBhL2FyY2gvcHBjL3BsYXRmb3Jtcy9tcGM4ODVhZHNfc2V0dXAuYyBiL2FyY2gvcHBjL3BsYXRmb3Jtcy9tcGM4ODVhZHNfc2V0dXAuYwppbmRleCAwMjI5MzE0Li5mODE2MWYzIDEwMDY0NAotLS0gYS9hcmNoL3BwYy9wbGF0Zm9ybXMvbXBjODg1YWRzX3NldHVwLmMKKysrIGIvYXJjaC9wcGMvcGxhdGZvcm1zL21wYzg4NWFkc19zZXR1cC5jCkBAIC0yNjMsNyArMjYzLDcgQEAKIAljaGFyICplOwogCWludCBpOwogCi0JaWYoZnNfbm8gPiBBUlJBWV9TSVpFKG1wYzh4eF9lbmV0X3BkYXRhKSkgeworCWlmKGZzX25vID49IEFSUkFZX1NJWkUobXBjOHh4X2VuZXRfcGRhdGEpKSB7CiAJCXByaW50ayhLRVJOX0VSUiJObyBuZXR3b3JrLXN1aXRhYmxlICMlZCBkZXZpY2Ugb24gYnVzIiwgZnNfbm8pOwogCQlyZXR1cm47CiAJfQpAQCAtMzcxLDcgKzM3MSw3IEBACiAJaW50IGlkID0gZnNfdWFydF9pZF9zbWMyZnNpZChpZHgpOwogCiAJLyogbm8gbmVlZCB0byBhbHRlciBhbnl0aGluZyBpZiBjb25zb2xlICovCi0JaWYgKChpZCA8PSBudW0pICYmICghcGRldi0+ZGV2LnBsYXRmb3JtX2RhdGEpKSB7CisJaWYgKChpZCA8IG51bSkgJiYgKCFwZGV2LT5kZXYucGxhdGZvcm1fZGF0YSkpIHsKIAkJcGluZm8gPSAmbXBjODg1X3VhcnRfcGRhdGFbaWRdOwogCQlwaW5mby0+dWFydF9jbGsgPSBiZC0+YmlfaW50ZnJlcTsKIAkJcGRldi0+ZGV2LnBsYXRmb3JtX2RhdGEgPSBwaW5mbzsKZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9LY29uZmlnIGIvYXJjaC9zMzkwL0tjb25maWcKaW5kZXggNjA4MTkzYy4uMjQ1YjgxYiAxMDA2NDQKLS0tIGEvYXJjaC9zMzkwL0tjb25maWcKKysrIGIvYXJjaC9zMzkwL0tjb25maWcKQEAgLTIzNiw5ICsyMzYsNiBAQAogCSAgVGhpcyBhbGxvd3MgeW91IHRvIHNwZWNpZnkgdGhlIG1heGltdW0gZnJhbWUgc2l6ZSBhIGZ1bmN0aW9uIG1heQogCSAgaGF2ZSB3aXRob3V0IHRoZSBjb21waWxlciBjb21wbGFpbmluZyBhYm91dCBpdC4KIAotY29uZmlnIEFSQ0hfUE9QVUxBVEVTX05PREVfTUFQCi0JZGVmX2Jvb2wgeQotCiBzb3VyY2UgIm1tL0tjb25maWciCiAKIGNvbW1lbnQgIkkvTyBzdWJzeXN0ZW0gY29uZmlndXJhdGlvbiIKZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9hcHBsZGF0YS9hcHBsZGF0YV9iYXNlLmMgYi9hcmNoL3MzOTAvYXBwbGRhdGEvYXBwbGRhdGFfYmFzZS5jCmluZGV4IDJiMWU2YzkuLmFmMWU4ZmMgMTAwNjQ0Ci0tLSBhL2FyY2gvczM5MC9hcHBsZGF0YS9hcHBsZGF0YV9iYXNlLmMKKysrIGIvYXJjaC9zMzkwL2FwcGxkYXRhL2FwcGxkYXRhX2Jhc2UuYwpAQCAtMTA5LDcgKzEwOSw3IEBACiAgKgogICogc2NoZWR1bGUgd29yayBhbmQgcmVzY2hlZHVsZSB0aW1lcgogICovCi1zdGF0aWMgdm9pZCBhcHBsZGF0YV90aW1lcl9mdW5jdGlvbih1bnNpZ25lZCBsb25nIGRhdGEsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQorc3RhdGljIHZvaWQgYXBwbGRhdGFfdGltZXJfZnVuY3Rpb24odW5zaWduZWQgbG9uZyBkYXRhKQogewogCVBfREVCVUcoIiAgIC09IFRpbWVyID0tXG4iKTsKIAlQX0RFQlVHKCJDUFU6ICVpLCBleHBpcmVfY291bnQ6ICVpXG4iLCBzbXBfcHJvY2Vzc29yX2lkKCksCkBAIC0zMTAsNiArMzEwLDcgQEAKIAlpZiAoY29weV9mcm9tX3VzZXIoYnVmLCBidWZmZXIsIGxlbiA+IHNpemVvZihidWYpID8gc2l6ZW9mKGJ1ZikgOiBsZW4pKSB7CiAJCXJldHVybiAtRUZBVUxUOwogCX0KKwlpbnRlcnZhbCA9IDA7CiAJc3NjYW5mKGJ1ZiwgIiVpIiwgJmludGVydmFsKTsKIAlpZiAoaW50ZXJ2YWwgPD0gMCkgewogCQlQX0VSUk9SKCJUaW1lciBDUFUgaW50ZXJ2YWwgaGFzIHRvIGJlID4gMCFcbiIpOwpkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL2RlZmNvbmZpZyBiL2FyY2gvczM5MC9kZWZjb25maWcKaW5kZXggYTMyNTczOS4uN2NkNTFlNyAxMDA2NDQKLS0tIGEvYXJjaC9zMzkwL2RlZmNvbmZpZworKysgYi9hcmNoL3MzOTAvZGVmY29uZmlnCkBAIC0xLDcgKzEsNyBAQAogIwogIyBBdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBtYWtlIGNvbmZpZzogZG9uJ3QgZWRpdAotIyBMaW51eCBrZXJuZWwgdmVyc2lvbjogMi42LjE4Ci0jIFdlZCBPY3QgIDQgMTk6NDU6NDYgMjAwNgorIyBMaW51eCBrZXJuZWwgdmVyc2lvbjogMi42LjE5LXJjMgorIyBXZWQgT2N0IDE4IDE3OjExOjEwIDIwMDYKICMKIENPTkZJR19NTVU9eQogQ09ORklHX0xPQ0tERVBfU1VQUE9SVD15CkBAIC0xMTksNyArMTE5LDYgQEAKIENPTkZJR19DSEVDS19TVEFDSz15CiBDT05GSUdfU1RBQ0tfR1VBUkQ9MjU2CiAjIENPTkZJR19XQVJOX1NUQUNLIGlzIG5vdCBzZXQKLUNPTkZJR19BUkNIX1BPUFVMQVRFU19OT0RFX01BUD15CiBDT05GSUdfU0VMRUNUX01FTU9SWV9NT0RFTD15CiBDT05GSUdfRkxBVE1FTV9NQU5VQUw9eQogIyBDT05GSUdfRElTQ09OVElHTUVNX01BTlVBTCBpcyBub3Qgc2V0CkBAIC0yMTEsNiArMjEwLDcgQEAKIENPTkZJR19JTkVUNl9YRlJNX01PREVfVFVOTkVMPXkKIENPTkZJR19JTkVUNl9YRlJNX01PREVfQkVFVD15CiAjIENPTkZJR19JTkVUNl9YRlJNX01PREVfUk9VVEVPUFRJTUlaQVRJT04gaXMgbm90IHNldAorQ09ORklHX0lQVjZfU0lUPXkKICMgQ09ORklHX0lQVjZfVFVOTkVMIGlzIG5vdCBzZXQKICMgQ09ORklHX0lQVjZfU1VCVFJFRVMgaXMgbm90IHNldAogIyBDT05GSUdfSVBWNl9NVUxUSVBMRV9UQUJMRVMgaXMgbm90IHNldApAQCAtNTI4LDYgKzUyOCw3IEBACiBDT05GSUdfRVhUM19GU19YQVRUUj15CiAjIENPTkZJR19FWFQzX0ZTX1BPU0lYX0FDTCBpcyBub3Qgc2V0CiAjIENPTkZJR19FWFQzX0ZTX1NFQ1VSSVRZIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VYVDRERVZfRlMgaXMgbm90IHNldAogQ09ORklHX0pCRD15CiAjIENPTkZJR19KQkRfREVCVUcgaXMgbm90IHNldAogQ09ORklHX0ZTX01CQ0FDSEU9eQpAQCAtNjQ2LDEwICs2NDcsNiBAQAogIyBDT05GSUdfTkxTIGlzIG5vdCBzZXQKIAogIwotIyBEaXN0cmlidXRlZCBMb2NrIE1hbmFnZXIKLSMKLQotIwogIyBJbnN0cnVtZW50YXRpb24gU3VwcG9ydAogIwogCkBAIC02NjksNyArNjY2LDYgQEAKICMgQ09ORklHX1VOVVNFRF9TWU1CT0xTIGlzIG5vdCBzZXQKIENPTkZJR19ERUJVR19LRVJORUw9eQogQ09ORklHX0xPR19CVUZfU0hJRlQ9MTcKLSMgQ09ORklHX0RFVEVDVF9TT0ZUTE9DS1VQIGlzIG5vdCBzZXQKICMgQ09ORklHX1NDSEVEU1RBVFMgaXMgbm90IHNldAogIyBDT05GSUdfREVCVUdfU0xBQiBpcyBub3Qgc2V0CiBDT05GSUdfREVCVUdfUFJFRU1QVD15CkBAIC02OTAsNiArNjg2LDcgQEAKICMgQ09ORklHX0ZSQU1FX1BPSU5URVIgaXMgbm90IHNldAogIyBDT05GSUdfVU5XSU5EX0lORk8gaXMgbm90IHNldAogQ09ORklHX0ZPUkNFRF9JTkxJTklORz15CitDT05GSUdfSEVBREVSU19DSEVDSz15CiAjIENPTkZJR19SQ1VfVE9SVFVSRV9URVNUIGlzIG5vdCBzZXQKICMgQ09ORklHX0xLRFRNIGlzIG5vdCBzZXQKIApkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL2tlcm5lbC9jb21wYXRfbGludXguYyBiL2FyY2gvczM5MC9rZXJuZWwvY29tcGF0X2xpbnV4LmMKaW5kZXggZTE1ZTE0OC4uNWIzM2Y4MiAxMDA2NDQKLS0tIGEvYXJjaC9zMzkwL2tlcm5lbC9jb21wYXRfbGludXguYworKysgYi9hcmNoL3MzOTAva2VybmVsL2NvbXBhdF9saW51eC5jCkBAIC0yOTUsNiArMjk1LDcgQEAKICAqCiAgKiBUaGlzIGlzIHJlYWxseSBob3JyaWJseSB1Z2x5LgogICovCisjaWZkZWYgQ09ORklHX1NZU1ZJUEMKIGFzbWxpbmthZ2UgbG9uZyBzeXMzMl9pcGModTMyIGNhbGwsIGludCBmaXJzdCwgaW50IHNlY29uZCwgaW50IHRoaXJkLCB1MzIgcHRyKQogewogCWlmIChjYWxsID4+IDE2KQkJLyogaGFjayBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eSAqLwpAQCAtMzM4LDYgKzMzOSw3IEBACiAKIAlyZXR1cm4gLUVOT1NZUzsKIH0KKyNlbmRpZgogCiBhc21saW5rYWdlIGxvbmcgc3lzMzJfdHJ1bmNhdGU2NChjb25zdCBjaGFyIF9fdXNlciAqIHBhdGgsIHVuc2lnbmVkIGxvbmcgaGlnaCwgdW5zaWduZWQgbG9uZyBsb3cpCiB7CkBAIC03NTUsNyArNzU3LDkgQEAKIAkJCSAgICBwdXRfdXNlcihvbGRsZW4sICh1MzIgX191c2VyICopY29tcGF0X3B0cih0bXAub2xkbGVucCkpKQogCQkJCWVycm9yID0gLUVGQVVMVDsKIAkJfQotCQljb3B5X3RvX3VzZXIoYXJncy0+X191bnVzZWQsIHRtcC5fX3VudXNlZCwgc2l6ZW9mKHRtcC5fX3VudXNlZCkpOworCQlpZiAoY29weV90b191c2VyKGFyZ3MtPl9fdW51c2VkLCB0bXAuX191bnVzZWQsCisJCQkJIHNpemVvZih0bXAuX191bnVzZWQpKSkKKwkJCWVycm9yID0gLUVGQVVMVDsKIAl9CiAJcmV0dXJuIGVycm9yOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL2tlcm5lbC9jb21wYXRfc2lnbmFsLmMgYi9hcmNoL3MzOTAva2VybmVsL2NvbXBhdF9zaWduYWwuYwppbmRleCBkNDliODc2Li44NjE4ODhhIDEwMDY0NAotLS0gYS9hcmNoL3MzOTAva2VybmVsL2NvbXBhdF9zaWduYWwuYworKysgYi9hcmNoL3MzOTAva2VybmVsL2NvbXBhdF9zaWduYWwuYwpAQCAtMTY5LDEyICsxNjksMTIgQEAKIAkJY29tcGF0X29sZF9zaWdzZXRfdCBtYXNrOwogCQlpZiAoIWFjY2Vzc19vayhWRVJJRllfUkVBRCwgYWN0LCBzaXplb2YoKmFjdCkpIHx8CiAJCSAgICBfX2dldF91c2VyKHNhX2hhbmRsZXIsICZhY3QtPnNhX2hhbmRsZXIpIHx8Ci0JCSAgICBfX2dldF91c2VyKHNhX3Jlc3RvcmVyLCAmYWN0LT5zYV9yZXN0b3JlcikpCisJCSAgICBfX2dldF91c2VyKHNhX3Jlc3RvcmVyLCAmYWN0LT5zYV9yZXN0b3JlcikgfHwKKwkJICAgIF9fZ2V0X3VzZXIobmV3X2thLnNhLnNhX2ZsYWdzLCAmYWN0LT5zYV9mbGFncykgfHwKKwkJICAgIF9fZ2V0X3VzZXIobWFzaywgJmFjdC0+c2FfbWFzaykpCiAJCQlyZXR1cm4gLUVGQVVMVDsKIAkJbmV3X2thLnNhLnNhX2hhbmRsZXIgPSAoX19zaWdoYW5kbGVyX3QpIHNhX2hhbmRsZXI7CiAJCW5ld19rYS5zYS5zYV9yZXN0b3JlciA9ICh2b2lkICgqKSh2b2lkKSkgc2FfcmVzdG9yZXI7Ci0JCV9fZ2V0X3VzZXIobmV3X2thLnNhLnNhX2ZsYWdzLCAmYWN0LT5zYV9mbGFncyk7Ci0JCV9fZ2V0X3VzZXIobWFzaywgJmFjdC0+c2FfbWFzayk7CiAJCXNpZ2luaXRzZXQoJm5ld19rYS5zYS5zYV9tYXNrLCBtYXNrKTsKICAgICAgICAgfQogCkBAIC0xODUsMTAgKzE4NSwxMCBAQAogCQlzYV9yZXN0b3JlciA9ICh1bnNpZ25lZCBsb25nKSBvbGRfa2Euc2Euc2FfcmVzdG9yZXI7CiAJCWlmICghYWNjZXNzX29rKFZFUklGWV9XUklURSwgb2FjdCwgc2l6ZW9mKCpvYWN0KSkgfHwKIAkJICAgIF9fcHV0X3VzZXIoc2FfaGFuZGxlciwgJm9hY3QtPnNhX2hhbmRsZXIpIHx8Ci0JCSAgICBfX3B1dF91c2VyKHNhX3Jlc3RvcmVyLCAmb2FjdC0+c2FfcmVzdG9yZXIpKQorCQkgICAgX19wdXRfdXNlcihzYV9yZXN0b3JlciwgJm9hY3QtPnNhX3Jlc3RvcmVyKSB8fAorCQkgICAgX19wdXRfdXNlcihvbGRfa2Euc2Euc2FfZmxhZ3MsICZvYWN0LT5zYV9mbGFncykgfHwKKwkJICAgIF9fcHV0X3VzZXIob2xkX2thLnNhLnNhX21hc2suc2lnWzBdLCAmb2FjdC0+c2FfbWFzaykpCiAJCQlyZXR1cm4gLUVGQVVMVDsKLQkJX19wdXRfdXNlcihvbGRfa2Euc2Euc2FfZmxhZ3MsICZvYWN0LT5zYV9mbGFncyk7Ci0JCV9fcHV0X3VzZXIob2xkX2thLnNhLnNhX21hc2suc2lnWzBdLCAmb2FjdC0+c2FfbWFzayk7CiAgICAgICAgIH0KIAogCXJldHVybiByZXQ7CmRpZmYgLS1naXQgYS9hcmNoL3MzOTAva2VybmVsL2NvbXBhdF93cmFwcGVyLlMgYi9hcmNoL3MzOTAva2VybmVsL2NvbXBhdF93cmFwcGVyLlMKaW5kZXggY2IwZWZhZS4uNzFlNTRlZiAxMDA2NDQKLS0tIGEvYXJjaC9zMzkwL2tlcm5lbC9jb21wYXRfd3JhcHBlci5TCisrKyBiL2FyY2gvczM5MC9rZXJuZWwvY29tcGF0X3dyYXBwZXIuUwpAQCAtMTY2NCw0ICsxNjY0LDQgQEAKIAlsbGd0cgklcjIsJXIyCQkJIyB1bnNpZ25lZCAqCiAJbGxndHIJJXIzLCVyMwkJCSMgdW5zaWduZWQgKgogCWxsZ3RyCSVyNCwlcjQJCQkjIHN0cnVjdCBnZXRjcHVfY2FjaGUgKgotCWpnCXN5c190ZWUKKwlqZwlzeXNfZ2V0Y3B1CmRpZmYgLS1naXQgYS9hcmNoL3MzOTAva2VybmVsL3MzOTBfZXh0LmMgYi9hcmNoL3MzOTAva2VybmVsL3MzOTBfZXh0LmMKaW5kZXggYzQ5YWI4Yy4uNGZhZjk2ZiAxMDA2NDQKLS0tIGEvYXJjaC9zMzkwL2tlcm5lbC9zMzkwX2V4dC5jCisrKyBiL2FyY2gvczM5MC9rZXJuZWwvczM5MF9leHQuYwpAQCAtMTE3LDggKzExNyw4IEBACiAgICAgICAgIGludCBpbmRleDsKIAlzdHJ1Y3QgcHRfcmVncyAqb2xkX3JlZ3M7CiAKLQlpcnFfZW50ZXIoKTsKIAlvbGRfcmVncyA9IHNldF9pcnFfcmVncyhyZWdzKTsKKwlpcnFfZW50ZXIoKTsKIAlhc20gdm9sYXRpbGUgKCJtYyAwLDAiKTsKIAlpZiAoUzM5MF9sb3djb3JlLmludF9jbG9jayA+PSBTMzkwX2xvd2NvcmUuamlmZnlfdGltZXIpCiAJCS8qKgpAQCAtMTM0LDggKzEzNCw4IEBACiAJCQkJcC0+aGFuZGxlcihjb2RlKTsKIAkJfQogCX0KLQlzZXRfaXJxX3JlZ3Mob2xkX3JlZ3MpOwogCWlycV9leGl0KCk7CisJc2V0X2lycV9yZWdzKG9sZF9yZWdzKTsKIH0KIAogRVhQT1JUX1NZTUJPTChyZWdpc3Rlcl9leHRlcm5hbF9pbnRlcnJ1cHQpOwpkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL2tlcm5lbC9zMzkwX2tzeW1zLmMgYi9hcmNoL3MzOTAva2VybmVsL3MzOTBfa3N5bXMuYwppbmRleCA5ZjE5ZTgzLi45MGI1ZWY1IDEwMDY0NAotLS0gYS9hcmNoL3MzOTAva2VybmVsL3MzOTBfa3N5bXMuYworKysgYi9hcmNoL3MzOTAva2VybmVsL3MzOTBfa3N5bXMuYwpAQCAtNTEsNCArNTEsMyBAQAogRVhQT1JUX1NZTUJPTChjb25zb2xlX21vZGUpOwogRVhQT1JUX1NZTUJPTChjb25zb2xlX2Rldm5vKTsKIEVYUE9SVF9TWU1CT0woY29uc29sZV9pcnEpOwotRVhQT1JUX1NZTUJPTChzeXNfd2FpdDQpOwpkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL2tlcm5lbC9zZXR1cC5jIGIvYXJjaC9zMzkwL2tlcm5lbC9zZXR1cC5jCmluZGV4IDQ5ZjJiNjguLjJhYTEzZTggMTAwNjQ0Ci0tLSBhL2FyY2gvczM5MC9rZXJuZWwvc2V0dXAuYworKysgYi9hcmNoL3MzOTAva2VybmVsL3NldHVwLmMKQEAgLTcwLDYgKzcwLDcgQEAKICNkZWZpbmUgQ0hVTktfUkVBRF9XUklURSAwCiAjZGVmaW5lIENIVU5LX1JFQURfT05MWSAxCiB2b2xhdGlsZSBpbnQgX19jcHVfbG9naWNhbF9tYXBbTlJfQ1BVU107IC8qIGxvZ2ljYWwgY3B1IHRvIGNwdSBhZGRyZXNzICovCit1bnNpZ25lZCBsb25nIF9faW5pdGRhdGEgemhvbGVzX3NpemVbTUFYX05SX1pPTkVTXTsKIHN0YXRpYyB1bnNpZ25lZCBsb25nIF9faW5pdGRhdGEgbWVtb3J5X2VuZDsKIAogLyoKQEAgLTM1Nyw2ICszNTgsMjEgQEAKICAqLwogdm9pZCAoKnBtX3Bvd2VyX29mZikodm9pZCkgPSBtYWNoaW5lX3Bvd2VyX29mZjsKIAorc3RhdGljIHZvaWQgX19pbml0CithZGRfbWVtb3J5X2hvbGUodW5zaWduZWQgbG9uZyBzdGFydCwgdW5zaWduZWQgbG9uZyBlbmQpCit7CisJdW5zaWduZWQgbG9uZyBkbWFfcGZuID0gTUFYX0RNQV9BRERSRVNTID4+IFBBR0VfU0hJRlQ7CisKKwlpZiAoZW5kIDw9IGRtYV9wZm4pCisJCXpob2xlc19zaXplW1pPTkVfRE1BXSArPSBlbmQgLSBzdGFydCArIDE7CisJZWxzZSBpZiAoc3RhcnQgPiBkbWFfcGZuKQorCQl6aG9sZXNfc2l6ZVtaT05FX05PUk1BTF0gKz0gZW5kIC0gc3RhcnQgKyAxOworCWVsc2UgeworCQl6aG9sZXNfc2l6ZVtaT05FX0RNQV0gKz0gZG1hX3BmbiAtIHN0YXJ0ICsgMTsKKwkJemhvbGVzX3NpemVbWk9ORV9OT1JNQUxdICs9IGVuZCAtIGRtYV9wZm47CisJfQorfQorCiBzdGF0aWMgaW50IF9faW5pdCBlYXJseV9wYXJzZV9tZW0oY2hhciAqcCkKIHsKIAltZW1vcnlfZW5kID0gbWVtcGFyc2UocCwgJnApOwpAQCAtNDM0LDcgKzQ1MCw3IEBACiAJCWxjLT5leHRlbmRlZF9zYXZlX2FyZWFfYWRkciA9IChfX3UzMikKIAkJCV9fYWxsb2NfYm9vdG1lbShQQUdFX1NJWkUsIFBBR0VfU0laRSwgMCk7CiAJCS8qIGVuYWJsZSBleHRlbmRlZCBzYXZlIGFyZWEgKi8KLQkJY3RsX3NldF9iaXQoMTQsIDI5KTsKKwkJX19jdGxfc2V0X2JpdCgxNCwgMjkpOwogCX0KICNlbmRpZgogCXNldF9wcmVmaXgoKHUzMikodW5zaWduZWQgbG9uZykgbGMpOwpAQCAtNDc4LDYgKzQ5NCw3IEBACiB7CiAgICAgICAgIHVuc2lnbmVkIGxvbmcgYm9vdG1hcF9zaXplOwogCXVuc2lnbmVkIGxvbmcgc3RhcnRfcGZuLCBlbmRfcGZuLCBpbml0X3BmbjsKKwl1bnNpZ25lZCBsb25nIGxhc3RfcndfZW5kOwogCWludCBpOwogCiAJLyoKQEAgLTUzMywyNyArNTUwLDM5IEBACiAJLyoKIAkgKiBSZWdpc3RlciBSQU0gYXJlYXMgd2l0aCB0aGUgYm9vdG1lbSBhbGxvY2F0b3IuCiAJICovCisJbGFzdF9yd19lbmQgPSBzdGFydF9wZm47CiAKIAlmb3IgKGkgPSAwOyBpIDwgTUVNT1JZX0NIVU5LUyAmJiBtZW1vcnlfY2h1bmtbaV0uc2l6ZSA+IDA7IGkrKykgewotCQl1bnNpZ25lZCBsb25nIHN0YXJ0X2NodW5rLCBlbmRfY2h1bmssIHBmbjsKKwkJdW5zaWduZWQgbG9uZyBzdGFydF9jaHVuaywgZW5kX2NodW5rOwogCiAJCWlmIChtZW1vcnlfY2h1bmtbaV0udHlwZSAhPSBDSFVOS19SRUFEX1dSSVRFKQogCQkJY29udGludWU7Ci0JCXN0YXJ0X2NodW5rID0gUEZOX0RPV04obWVtb3J5X2NodW5rW2ldLmFkZHIpOwotCQllbmRfY2h1bmsgPSBzdGFydF9jaHVuayArIFBGTl9ET1dOKG1lbW9yeV9jaHVua1tpXS5zaXplKSAtIDE7Ci0JCWVuZF9jaHVuayA9IG1pbihlbmRfY2h1bmssIGVuZF9wZm4pOwotCQlpZiAoc3RhcnRfY2h1bmsgPj0gZW5kX2NodW5rKQotCQkJY29udGludWU7Ci0JCWFkZF9hY3RpdmVfcmFuZ2UoMCwgc3RhcnRfY2h1bmssIGVuZF9jaHVuayk7Ci0JCXBmbiA9IG1heChzdGFydF9jaHVuaywgc3RhcnRfcGZuKTsKLQkJZm9yICg7IHBmbiA8PSBlbmRfY2h1bms7IHBmbisrKQotCQkJcGFnZV9zZXRfc3RvcmFnZV9rZXkoUEZOX1BIWVMocGZuKSwgUEFHRV9ERUZBVUxUX0tFWSk7CisJCXN0YXJ0X2NodW5rID0gKG1lbW9yeV9jaHVua1tpXS5hZGRyICsgUEFHRV9TSVpFIC0gMSk7CisJCXN0YXJ0X2NodW5rID4+PSBQQUdFX1NISUZUOworCQllbmRfY2h1bmsgPSAobWVtb3J5X2NodW5rW2ldLmFkZHIgKyBtZW1vcnlfY2h1bmtbaV0uc2l6ZSk7CisJCWVuZF9jaHVuayA+Pj0gUEFHRV9TSElGVDsKKwkJaWYgKHN0YXJ0X2NodW5rIDwgc3RhcnRfcGZuKQorCQkJc3RhcnRfY2h1bmsgPSBzdGFydF9wZm47CisJCWlmIChlbmRfY2h1bmsgPiBlbmRfcGZuKQorCQkJZW5kX2NodW5rID0gZW5kX3BmbjsKKwkJaWYgKHN0YXJ0X2NodW5rIDwgZW5kX2NodW5rKSB7CisJCQkvKiBJbml0aWFsaXplIHN0b3JhZ2Uga2V5IGZvciBSQU0gcGFnZXMgKi8KKwkJCWZvciAoaW5pdF9wZm4gPSBzdGFydF9jaHVuayA7IGluaXRfcGZuIDwgZW5kX2NodW5rOworCQkJICAgICBpbml0X3BmbisrKQorCQkJCXBhZ2Vfc2V0X3N0b3JhZ2Vfa2V5KGluaXRfcGZuIDw8IFBBR0VfU0hJRlQsCisJCQkJCQkgICAgIFBBR0VfREVGQVVMVF9LRVkpOworCQkJZnJlZV9ib290bWVtKHN0YXJ0X2NodW5rIDw8IFBBR0VfU0hJRlQsCisJCQkJICAgICAoZW5kX2NodW5rIC0gc3RhcnRfY2h1bmspIDw8IFBBR0VfU0hJRlQpOworCQkJaWYgKGxhc3RfcndfZW5kIDwgc3RhcnRfY2h1bmspCisJCQkJYWRkX21lbW9yeV9ob2xlKGxhc3RfcndfZW5kLCBzdGFydF9jaHVuayAtIDEpOworCQkJbGFzdF9yd19lbmQgPSBlbmRfY2h1bms7CisJCX0KIAl9CiAKIAlwc3dfc2V0X2tleShQQUdFX0RFRkFVTFRfS0VZKTsKIAotCWZyZWVfYm9vdG1lbV93aXRoX2FjdGl2ZV9yZWdpb25zKDAsIG1heF9wZm4pOwotCXJlc2VydmVfYm9vdG1lbSgwLCBQRk5fUEhZUyhzdGFydF9wZm4pKTsKKwlpZiAobGFzdF9yd19lbmQgPCBlbmRfcGZuIC0gMSkKKwkJYWRkX21lbW9yeV9ob2xlKGxhc3RfcndfZW5kLCBlbmRfcGZuIC0gMSk7CiAKIAkvKgogCSAqIFJlc2VydmUgdGhlIGJvb3RtZW0gYml0bWFwIGl0c2VsZiBhcyB3ZWxsLiBXZSBkbyB0aGlzIGluIHR3bwpkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL2tlcm5lbC9zaWduYWwuYyBiL2FyY2gvczM5MC9rZXJuZWwvc2lnbmFsLmMKaW5kZXggNDM5MmE3Ny4uNGM4YTc5NSAxMDA2NDQKLS0tIGEvYXJjaC9zMzkwL2tlcm5lbC9zaWduYWwuYworKysgYi9hcmNoL3MzOTAva2VybmVsL3NpZ25hbC5jCkBAIC04MCwxMCArODAsMTAgQEAKIAkJb2xkX3NpZ3NldF90IG1hc2s7CiAJCWlmICghYWNjZXNzX29rKFZFUklGWV9SRUFELCBhY3QsIHNpemVvZigqYWN0KSkgfHwKIAkJICAgIF9fZ2V0X3VzZXIobmV3X2thLnNhLnNhX2hhbmRsZXIsICZhY3QtPnNhX2hhbmRsZXIpIHx8Ci0JCSAgICBfX2dldF91c2VyKG5ld19rYS5zYS5zYV9yZXN0b3JlciwgJmFjdC0+c2FfcmVzdG9yZXIpKQorCQkgICAgX19nZXRfdXNlcihuZXdfa2Euc2Euc2FfcmVzdG9yZXIsICZhY3QtPnNhX3Jlc3RvcmVyKSB8fAorCQkgICAgX19nZXRfdXNlcihuZXdfa2Euc2Euc2FfZmxhZ3MsICZhY3QtPnNhX2ZsYWdzKSB8fAorCQkgICAgX19nZXRfdXNlcihtYXNrLCAmYWN0LT5zYV9tYXNrKSkKIAkJCXJldHVybiAtRUZBVUxUOwotCQlfX2dldF91c2VyKG5ld19rYS5zYS5zYV9mbGFncywgJmFjdC0+c2FfZmxhZ3MpOwotCQlfX2dldF91c2VyKG1hc2ssICZhY3QtPnNhX21hc2spOwogCQlzaWdpbml0c2V0KCZuZXdfa2Euc2Euc2FfbWFzaywgbWFzayk7CiAJfQogCkBAIC05MiwxMCArOTIsMTAgQEAKIAlpZiAoIXJldCAmJiBvYWN0KSB7CiAJCWlmICghYWNjZXNzX29rKFZFUklGWV9XUklURSwgb2FjdCwgc2l6ZW9mKCpvYWN0KSkgfHwKIAkJICAgIF9fcHV0X3VzZXIob2xkX2thLnNhLnNhX2hhbmRsZXIsICZvYWN0LT5zYV9oYW5kbGVyKSB8fAotCQkgICAgX19wdXRfdXNlcihvbGRfa2Euc2Euc2FfcmVzdG9yZXIsICZvYWN0LT5zYV9yZXN0b3JlcikpCisJCSAgICBfX3B1dF91c2VyKG9sZF9rYS5zYS5zYV9yZXN0b3JlciwgJm9hY3QtPnNhX3Jlc3RvcmVyKSB8fAorCQkgICAgX19wdXRfdXNlcihvbGRfa2Euc2Euc2FfZmxhZ3MsICZvYWN0LT5zYV9mbGFncykgfHwKKwkJICAgIF9fcHV0X3VzZXIob2xkX2thLnNhLnNhX21hc2suc2lnWzBdLCAmb2FjdC0+c2FfbWFzaykpCiAJCQlyZXR1cm4gLUVGQVVMVDsKLQkJX19wdXRfdXNlcihvbGRfa2Euc2Euc2FfZmxhZ3MsICZvYWN0LT5zYV9mbGFncyk7Ci0JCV9fcHV0X3VzZXIob2xkX2thLnNhLnNhX21hc2suc2lnWzBdLCAmb2FjdC0+c2FfbWFzayk7CiAJfQogCiAJcmV0dXJuIHJldDsKZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9rZXJuZWwvc3RhY2t0cmFjZS5jIGIvYXJjaC9zMzkwL2tlcm5lbC9zdGFja3RyYWNlLmMKaW5kZXggZDk0MjhhMC4uMGQxNGE0NyAxMDA2NDQKLS0tIGEvYXJjaC9zMzkwL2tlcm5lbC9zdGFja3RyYWNlLmMKKysrIGIvYXJjaC9zMzkwL2tlcm5lbC9zdGFja3RyYWNlLmMKQEAgLTYyLDI3ICs2MiwyNiBAQAogdm9pZCBzYXZlX3N0YWNrX3RyYWNlKHN0cnVjdCBzdGFja190cmFjZSAqdHJhY2UsIHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaykKIHsKIAlyZWdpc3RlciB1bnNpZ25lZCBsb25nIHNwIGFzbSAoIjE1Iik7Ci0JdW5zaWduZWQgbG9uZyBvcmlnX3NwOworCXVuc2lnbmVkIGxvbmcgb3JpZ19zcCwgbmV3X3NwOwogCi0Jc3AgJj0gUFNXX0FERFJfSU5TTjsKLQlvcmlnX3NwID0gc3A7CisJb3JpZ19zcCA9IHNwICYgUFNXX0FERFJfSU5TTjsKIAotCXNwID0gc2F2ZV9jb250ZXh0X3N0YWNrKHRyYWNlLCAmdHJhY2UtPnNraXAsIHNwLAorCW5ld19zcCA9IHNhdmVfY29udGV4dF9zdGFjayh0cmFjZSwgJnRyYWNlLT5za2lwLCBvcmlnX3NwLAogCQkJCVMzOTBfbG93Y29yZS5wYW5pY19zdGFjayAtIFBBR0VfU0laRSwKIAkJCQlTMzkwX2xvd2NvcmUucGFuaWNfc3RhY2spOwotCWlmICgoc3AgIT0gb3JpZ19zcCkgJiYgIXRyYWNlLT5hbGxfY29udGV4dHMpCisJaWYgKChuZXdfc3AgIT0gb3JpZ19zcCkgJiYgIXRyYWNlLT5hbGxfY29udGV4dHMpCiAJCXJldHVybjsKLQlzcCA9IHNhdmVfY29udGV4dF9zdGFjayh0cmFjZSwgJnRyYWNlLT5za2lwLCBzcCwKKwluZXdfc3AgPSBzYXZlX2NvbnRleHRfc3RhY2sodHJhY2UsICZ0cmFjZS0+c2tpcCwgbmV3X3NwLAogCQkJCVMzOTBfbG93Y29yZS5hc3luY19zdGFjayAtIEFTWU5DX1NJWkUsCiAJCQkJUzM5MF9sb3djb3JlLmFzeW5jX3N0YWNrKTsKLQlpZiAoKHNwICE9IG9yaWdfc3ApICYmICF0cmFjZS0+YWxsX2NvbnRleHRzKQorCWlmICgobmV3X3NwICE9IG9yaWdfc3ApICYmICF0cmFjZS0+YWxsX2NvbnRleHRzKQogCQlyZXR1cm47CiAJaWYgKHRhc2spCi0JCXNhdmVfY29udGV4dF9zdGFjayh0cmFjZSwgJnRyYWNlLT5za2lwLCBzcCwKKwkJc2F2ZV9jb250ZXh0X3N0YWNrKHRyYWNlLCAmdHJhY2UtPnNraXAsIG5ld19zcCwKIAkJCQkgICAodW5zaWduZWQgbG9uZykgdGFza19zdGFja19wYWdlKHRhc2spLAogCQkJCSAgICh1bnNpZ25lZCBsb25nKSB0YXNrX3N0YWNrX3BhZ2UodGFzaykgKyBUSFJFQURfU0laRSk7CiAJZWxzZQotCQlzYXZlX2NvbnRleHRfc3RhY2sodHJhY2UsICZ0cmFjZS0+c2tpcCwgc3AsCisJCXNhdmVfY29udGV4dF9zdGFjayh0cmFjZSwgJnRyYWNlLT5za2lwLCBuZXdfc3AsCiAJCQkJICAgUzM5MF9sb3djb3JlLnRocmVhZF9pbmZvLAogCQkJCSAgIFMzOTBfbG93Y29yZS50aHJlYWRfaW5mbyArIFRIUkVBRF9TSVpFKTsKIAlyZXR1cm47CmRpZmYgLS1naXQgYS9hcmNoL3MzOTAva2VybmVsL3N5c2NhbGxzLlMgYi9hcmNoL3MzOTAva2VybmVsL3N5c2NhbGxzLlMKaW5kZXggZTU5YmFlYy4uYTRjZWFlMyAxMDA2NDQKLS0tIGEvYXJjaC9zMzkwL2tlcm5lbC9zeXNjYWxscy5TCisrKyBiL2FyY2gvczM5MC9rZXJuZWwvc3lzY2FsbHMuUwpAQCAtMzIwLDMgKzMyMCw0IEBACiBTWVNDQUxMKHN5c192bXNwbGljZSxzeXNfdm1zcGxpY2UsY29tcGF0X3N5c192bXNwbGljZV93cmFwcGVyKQogTklfU1lTQ0FMTAkJCQkJCQkvKiAzMTAgc3lzX21vdmVfcGFnZXMgKi8KIFNZU0NBTEwoc3lzX2dldGNwdSxzeXNfZ2V0Y3B1LHN5c19nZXRjcHVfd3JhcHBlcikKK1NZU0NBTEwoc3lzX2Vwb2xsX3B3YWl0LHN5c19lcG9sbF9wd2FpdCxzeXNfbmlfc3lzY2FsbCkKZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9rZXJuZWwvdHJhcHMuYyBiL2FyY2gvczM5MC9rZXJuZWwvdHJhcHMuYwppbmRleCA2NjM3NWE1Li45MmVjZmZiIDEwMDY0NAotLS0gYS9hcmNoL3MzOTAva2VybmVsL3RyYXBzLmMKKysrIGIvYXJjaC9zMzkwL2tlcm5lbC90cmFwcy5jCkBAIC00NjIsNyArNDYyLDggQEAKIAkJbG9jYWxfaXJxX2VuYWJsZSgpOwogCiAJaWYgKHJlZ3MtPnBzdy5tYXNrICYgUFNXX01BU0tfUFNUQVRFKSB7Ci0JCWdldF91c2VyKCooKF9fdTE2ICopIG9wY29kZSksIChfX3UxNiBfX3VzZXIgKikgbG9jYXRpb24pOworCQlpZiAoZ2V0X3VzZXIoKigoX191MTYgKikgb3Bjb2RlKSwgKF9fdTE2IF9fdXNlciAqKSBsb2NhdGlvbikpCisJCQlyZXR1cm47CiAJCWlmICgqKChfX3UxNiAqKSBvcGNvZGUpID09IFMzOTBfQlJFQUtQT0lOVF9VMTYpIHsKIAkJCWlmIChjdXJyZW50LT5wdHJhY2UgJiBQVF9QVFJBQ0VEKQogCQkJCWZvcmNlX3NpZyhTSUdUUkFQLCBjdXJyZW50KTsKQEAgLTQ3MCwyMCArNDcxLDI1IEBACiAJCQkJc2lnbmFsID0gU0lHSUxMOwogI2lmZGVmIENPTkZJR19NQVRIRU1VCiAJCX0gZWxzZSBpZiAob3Bjb2RlWzBdID09IDB4YjMpIHsKLQkJCWdldF91c2VyKCooKF9fdTE2ICopIChvcGNvZGUrMikpLCBsb2NhdGlvbisxKTsKKwkJCWlmIChnZXRfdXNlcigqKChfX3UxNiAqKSAob3Bjb2RlKzIpKSwgbG9jYXRpb24rMSkpCisJCQkJcmV0dXJuOwogCQkJc2lnbmFsID0gbWF0aF9lbXVfYjMob3Bjb2RlLCByZWdzKTsKICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG9wY29kZVswXSA9PSAweGVkKSB7Ci0JCQlnZXRfdXNlcigqKChfX3UzMiAqKSAob3Bjb2RlKzIpKSwKLQkJCQkgKF9fdTMyIF9fdXNlciAqKShsb2NhdGlvbisxKSk7CisJCQlpZiAoZ2V0X3VzZXIoKigoX191MzIgKikgKG9wY29kZSsyKSksCisJCQkJICAgICAoX191MzIgX191c2VyICopKGxvY2F0aW9uKzEpKSkKKwkJCQlyZXR1cm47CiAJCQlzaWduYWwgPSBtYXRoX2VtdV9lZChvcGNvZGUsIHJlZ3MpOwogCQl9IGVsc2UgaWYgKCooKF9fdTE2ICopIG9wY29kZSkgPT0gMHhiMjk5KSB7Ci0JCQlnZXRfdXNlcigqKChfX3UxNiAqKSAob3Bjb2RlKzIpKSwgbG9jYXRpb24rMSk7CisJCQlpZiAoZ2V0X3VzZXIoKigoX191MTYgKikgKG9wY29kZSsyKSksIGxvY2F0aW9uKzEpKQorCQkJCXJldHVybjsKIAkJCXNpZ25hbCA9IG1hdGhfZW11X3Nybm0ob3Bjb2RlLCByZWdzKTsKIAkJfSBlbHNlIGlmICgqKChfX3UxNiAqKSBvcGNvZGUpID09IDB4YjI5YykgewotCQkJZ2V0X3VzZXIoKigoX191MTYgKikgKG9wY29kZSsyKSksIGxvY2F0aW9uKzEpOworCQkJaWYgKGdldF91c2VyKCooKF9fdTE2ICopIChvcGNvZGUrMikpLCBsb2NhdGlvbisxKSkKKwkJCQlyZXR1cm47CiAJCQlzaWduYWwgPSBtYXRoX2VtdV9zdGZwYyhvcGNvZGUsIHJlZ3MpOwogCQl9IGVsc2UgaWYgKCooKF9fdTE2ICopIG9wY29kZSkgPT0gMHhiMjlkKSB7Ci0JCQlnZXRfdXNlcigqKChfX3UxNiAqKSAob3Bjb2RlKzIpKSwgbG9jYXRpb24rMSk7CisJCQlpZiAoZ2V0X3VzZXIoKigoX191MTYgKikgKG9wY29kZSsyKSksIGxvY2F0aW9uKzEpKQorCQkJCXJldHVybjsKIAkJCXNpZ25hbCA9IG1hdGhfZW11X2xmcGMob3Bjb2RlLCByZWdzKTsKICNlbmRpZgogCQl9IGVsc2UKZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9rZXJuZWwvdm1saW51eC5sZHMuUyBiL2FyY2gvczM5MC9rZXJuZWwvdm1saW51eC5sZHMuUwppbmRleCBhZjllNjlhMC4uZmUwZjJlOSAxMDA2NDQKLS0tIGEvYXJjaC9zMzkwL2tlcm5lbC92bWxpbnV4Lmxkcy5TCisrKyBiL2FyY2gvczM5MC9rZXJuZWwvdm1saW51eC5sZHMuUwpAQCAtODMsMTMgKzgzLDcgQEAKICAgX19zZXR1cF9lbmQgPSAuOwogICBfX2luaXRjYWxsX3N0YXJ0ID0gLjsKICAgLmluaXRjYWxsLmluaXQgOiB7Ci0JKiguaW5pdGNhbGwxLmluaXQpIAotCSooLmluaXRjYWxsMi5pbml0KSAKLQkqKC5pbml0Y2FsbDMuaW5pdCkgCi0JKiguaW5pdGNhbGw0LmluaXQpIAotCSooLmluaXRjYWxsNS5pbml0KSAKLQkqKC5pbml0Y2FsbDYuaW5pdCkgCi0JKiguaW5pdGNhbGw3LmluaXQpCisJSU5JVENBTExTCiAgIH0KICAgX19pbml0Y2FsbF9lbmQgPSAuOwogICBfX2Nvbl9pbml0Y2FsbF9zdGFydCA9IC47CmRpZmYgLS1naXQgYS9hcmNoL3MzOTAva2VybmVsL3Z0aW1lLmMgYi9hcmNoL3MzOTAva2VybmVsL3Z0aW1lLmMKaW5kZXggMWQ3ZDM5My4uMjFiYWFmNSAxMDA2NDQKLS0tIGEvYXJjaC9zMzkwL2tlcm5lbC92dGltZS5jCisrKyBiL2FyY2gvczM5MC9rZXJuZWwvdnRpbWUuYwpAQCAtMjA5LDExICsyMDksMTEgQEAKICAqIERvIHRoZSBjYWxsYmFjayBmdW5jdGlvbnMgb2YgZXhwaXJlZCB2dGltZXIgZXZlbnRzLgogICogQ2FsbGVkIGZyb20gd2l0aGluIHRoZSBpbnRlcnJ1cHQgaGFuZGxlci4KICAqLwotc3RhdGljIHZvaWQgZG9fY2FsbGJhY2tzKHN0cnVjdCBsaXN0X2hlYWQgKmNiX2xpc3QsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQorc3RhdGljIHZvaWQgZG9fY2FsbGJhY2tzKHN0cnVjdCBsaXN0X2hlYWQgKmNiX2xpc3QpCiB7CiAJc3RydWN0IHZ0aW1lcl9xdWV1ZSAqdnRfbGlzdDsKIAlzdHJ1Y3QgdnRpbWVyX2xpc3QgKmV2ZW50LCAqdG1wOwotCXZvaWQgKCpmbikodW5zaWduZWQgbG9uZywgc3RydWN0IHB0X3JlZ3MqKTsKKwl2b2lkICgqZm4pKHVuc2lnbmVkIGxvbmcpOwogCXVuc2lnbmVkIGxvbmcgZGF0YTsKIAogCWlmIChsaXN0X2VtcHR5KGNiX2xpc3QpKQpAQCAtMjI0LDcgKzIyNCw3IEBACiAJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGV2ZW50LCB0bXAsIGNiX2xpc3QsIGVudHJ5KSB7CiAJCWZuID0gZXZlbnQtPmZ1bmN0aW9uOwogCQlkYXRhID0gZXZlbnQtPmRhdGE7Ci0JCWZuKGRhdGEsIHJlZ3MpOworCQlmbihkYXRhKTsKIAogCQlpZiAoIWV2ZW50LT5pbnRlcnZhbCkKIAkJCS8qIGRlbGV0ZSBvbmUgc2hvdCB0aW1lciAqLwpAQCAtMjc1LDcgKzI3NSw3IEBACiAJCWxpc3RfbW92ZV90YWlsKCZldmVudC0+ZW50cnksICZjYl9saXN0KTsKIAl9CiAJc3Bpbl91bmxvY2soJnZ0X2xpc3QtPmxvY2spOwotCWRvX2NhbGxiYWNrcygmY2JfbGlzdCwgZ2V0X2lycV9yZWdzKCkpOworCWRvX2NhbGxiYWNrcygmY2JfbGlzdCk7CiAKIAkvKiBuZXh0IGV2ZW50IGlzIGZpcnN0IGluIGxpc3QgKi8KIAlzcGluX2xvY2soJnZ0X2xpc3QtPmxvY2spOwpkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL21tL2luaXQuYyBiL2FyY2gvczM5MC9tbS9pbml0LmMKaW5kZXggZDk5ODkxNy4uZTE4ODFjMyAxMDA2NDQKLS0tIGEvYXJjaC9zMzkwL21tL2luaXQuYworKysgYi9hcmNoL3MzOTAvbW0vaW5pdC5jCkBAIC04NCw2ICs4NCw3IEBACiAgICAgICAgIHByaW50aygiJWQgcGFnZXMgc3dhcCBjYWNoZWRcbiIsY2FjaGVkKTsKIH0KIAorZXh0ZXJuIHVuc2lnbmVkIGxvbmcgX19pbml0ZGF0YSB6aG9sZXNfc2l6ZVtdOwogLyoKICAqIHBhZ2luZ19pbml0KCkgc2V0cyB1cCB0aGUgcGFnZSB0YWJsZXMKICAqLwpAQCAtMTAwLDE1ICsxMDEsMTYgQEAKICAgICAgICAgdW5zaWduZWQgbG9uZyBwZ2Rpcl9rID0gKF9fcGEoc3dhcHBlcl9wZ19kaXIpICYgUEFHRV9NQVNLKSB8IF9LRVJOU0VHX1RBQkxFOwogICAgICAgICBzdGF0aWMgY29uc3QgaW50IHNzbV9tYXNrID0gMHgwNDAwMDAwMEw7CiAJdW5zaWduZWQgbG9uZyByb19zdGFydF9wZm4sIHJvX2VuZF9wZm47Ci0JdW5zaWduZWQgbG9uZyBtYXhfem9uZV9wZm5zW01BWF9OUl9aT05FU107CisJdW5zaWduZWQgbG9uZyB6b25lc19zaXplW01BWF9OUl9aT05FU107CiAKIAlyb19zdGFydF9wZm4gPSBQRk5fRE9XTigodW5zaWduZWQgbG9uZykmX19zdGFydF9yb2RhdGEpOwogCXJvX2VuZF9wZm4gPSBQRk5fVVAoKHVuc2lnbmVkIGxvbmcpJl9fZW5kX3JvZGF0YSk7CiAKLQltZW1zZXQobWF4X3pvbmVfcGZucywgMCwgc2l6ZW9mKG1heF96b25lX3BmbnMpKTsKLQltYXhfem9uZV9wZm5zW1pPTkVfRE1BXSA9IG1heF9sb3dfcGZuOwotCW1heF96b25lX3BmbnNbWk9ORV9OT1JNQUxdID0gbWF4X2xvd19wZm47Ci0JZnJlZV9hcmVhX2luaXRfbm9kZXMobWF4X3pvbmVfcGZucyk7CisJbWVtc2V0KHpvbmVzX3NpemUsIDAsIHNpemVvZih6b25lc19zaXplKSk7CisJem9uZXNfc2l6ZVtaT05FX0RNQV0gPSBtYXhfbG93X3BmbjsKKwlmcmVlX2FyZWFfaW5pdF9ub2RlKDAsICZjb250aWdfcGFnZV9kYXRhLCB6b25lc19zaXplLAorCQkJICAgIF9fcGEoUEFHRV9PRkZTRVQpID4+IFBBR0VfU0hJRlQsCisJCQkgICAgemhvbGVzX3NpemUpOwogCiAJLyogdW5tYXAgd2hvbGUgdmlydHVhbCBhZGRyZXNzIHNwYWNlICovCiAJCkBAIC0xNjgsMTYgKzE3MCwyNiBAQAogICAgICAgICB1bnNpZ25lZCBsb25nIHBnZGlyX2sgPSAoX19wYShzd2FwcGVyX3BnX2RpcikgJiBQQUdFX01BU0spIHwKICAgICAgICAgICBfS0VSTl9SRUdJT05fVEFCTEU7CiAJc3RhdGljIGNvbnN0IGludCBzc21fbWFzayA9IDB4MDQwMDAwMDBMOworCXVuc2lnbmVkIGxvbmcgem9uZXNfc2l6ZVtNQVhfTlJfWk9ORVNdOworCXVuc2lnbmVkIGxvbmcgZG1hX3BmbiwgaGlnaF9wZm47CiAJdW5zaWduZWQgbG9uZyByb19zdGFydF9wZm4sIHJvX2VuZF9wZm47Ci0JdW5zaWduZWQgbG9uZyBtYXhfem9uZV9wZm5zW01BWF9OUl9aT05FU107CiAKKwltZW1zZXQoem9uZXNfc2l6ZSwgMCwgc2l6ZW9mKHpvbmVzX3NpemUpKTsKKwlkbWFfcGZuID0gTUFYX0RNQV9BRERSRVNTID4+IFBBR0VfU0hJRlQ7CisJaGlnaF9wZm4gPSBtYXhfbG93X3BmbjsKIAlyb19zdGFydF9wZm4gPSBQRk5fRE9XTigodW5zaWduZWQgbG9uZykmX19zdGFydF9yb2RhdGEpOwogCXJvX2VuZF9wZm4gPSBQRk5fVVAoKHVuc2lnbmVkIGxvbmcpJl9fZW5kX3JvZGF0YSk7CiAKLQltZW1zZXQobWF4X3pvbmVfcGZucywgMCwgc2l6ZW9mKG1heF96b25lX3BmbnMpKTsKLQltYXhfem9uZV9wZm5zW1pPTkVfRE1BXSA9IFBGTl9ET1dOKE1BWF9ETUFfQUREUkVTUyk7Ci0JbWF4X3pvbmVfcGZuc1taT05FX05PUk1BTF0gPSBtYXhfbG93X3BmbjsKLQlmcmVlX2FyZWFfaW5pdF9ub2RlcyhtYXhfem9uZV9wZm5zKTsKKwlpZiAoZG1hX3BmbiA+IGhpZ2hfcGZuKQorCQl6b25lc19zaXplW1pPTkVfRE1BXSA9IGhpZ2hfcGZuOworCWVsc2UgeworCQl6b25lc19zaXplW1pPTkVfRE1BXSA9IGRtYV9wZm47CisJCXpvbmVzX3NpemVbWk9ORV9OT1JNQUxdID0gaGlnaF9wZm4gLSBkbWFfcGZuOworCX0KKworCS8qIEluaXRpYWxpemUgbWVtX21hcFtdLiAgKi8KKwlmcmVlX2FyZWFfaW5pdF9ub2RlKDAsICZjb250aWdfcGFnZV9kYXRhLCB6b25lc19zaXplLAorCQkJICAgIF9fcGEoUEFHRV9PRkZTRVQpID4+IFBBR0VfU0hJRlQsIHpob2xlc19zaXplKTsKIAogCS8qCiAJICogbWFwIHdob2xlIHBoeXNpY2FsIG1lbW9yeSB0byB2aXJ0dWFsIG1lbW9yeSAoaWRlbnRpdHkgbWFwcGluZykgCmRpZmYgLS1naXQgYS9hcmNoL3NoL0tjb25maWcgYi9hcmNoL3NoL0tjb25maWcKaW5kZXggZjZhMGM0NC4uNmE0NjFkNCAxMDA2NDQKLS0tIGEvYXJjaC9zaC9LY29uZmlnCisrKyBiL2FyY2gvc2gvS2NvbmZpZwpAQCAtNDUsNiArNDUsOSBAQAogY29uZmlnIEdFTkVSSUNfSU9NQVAKIAlib29sCiAKK2NvbmZpZyBHRU5FUklDX1RJTUUKKwlkZWZfYm9vbCBuCisKIGNvbmZpZyBBUkNIX01BWV9IQVZFX1BDX0ZEQwogCWJvb2wKIApAQCAtMzU3LDYgKzM2MCw3IEBACiBlbmRtZW51CiAKIG1lbnUgIlRpbWVyIHN1cHBvcnQiCitkZXBlbmRzIG9uICFHRU5FUklDX1RJTUUKIAogY29uZmlnIFNIX1RNVQogCWJvb2wgIlRNVSB0aW1lciBzdXBwb3J0IgpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9ib2FyZHMvaHA2eHgvaHA2eHhfYXBtLmMgYi9hcmNoL3NoL2JvYXJkcy9ocDZ4eC9ocDZ4eF9hcG0uYwppbmRleCA3NWY5MWFhLi5kMTQ2Y2RhIDEwMDY0NAotLS0gYS9hcmNoL3NoL2JvYXJkcy9ocDZ4eC9ocDZ4eF9hcG0uYworKysgYi9hcmNoL3NoL2JvYXJkcy9ocDZ4eC9ocDZ4eF9hcG0uYwpAQCAtMTQsNyArMTQsNyBAQAogI2luY2x1ZGUgPGFzbS9pby5oPgogI2luY2x1ZGUgPGFzbS9hcG0uaD4KICNpbmNsdWRlIDxhc20vYWRjLmg+Ci0jaW5jbHVkZSA8YXNtL2hwNnh4L2hwNnh4Lmg+CisjaW5jbHVkZSA8YXNtL2hwNnh4Lmg+CiAKICNkZWZpbmUgU0g3NzA5X1BHRFIJCQkweGE0MDAwMTJjCiAKQEAgLTgzLDcgKzgzLDcgQEAKIAlyZXR1cm4gcCAtIGJ1ZjsKIH0KIAotc3RhdGljIGlycXJldHVybl90IGhwNngwX2FwbV9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2LCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3N0YXRpYyBpcnFyZXR1cm5fdCBocDZ4MF9hcG1faW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldikKIHsKIAlpZiAoIWFwbV9zdXNwZW5kZWQpCiAJCWFwbV9xdWV1ZV9ldmVudChBUE1fVVNFUl9TVVNQRU5EKTsKQEAgLTk2LDcgKzk2LDcgQEAKIAlpbnQgcmV0OwogCiAJcmV0ID0gcmVxdWVzdF9pcnEoSFA2ODBfQlROX0lSUSwgaHA2eDBfYXBtX2ludGVycnVwdCwKLQkJCSAgU0FfSU5URVJSVVBULCBNT0ROQU1FLCAwKTsKKwkJCSAgSVJRRl9ESVNBQkxFRCwgTU9ETkFNRSwgMCk7CiAJaWYgKHVubGlrZWx5KHJldCA8IDApKSB7CiAJCXByaW50ayhLRVJOX0VSUiBNT0ROQU1FICI6IElSUSAlZCByZXF1ZXN0IGZhaWxlZFxuIiwKIAkJICAgICAgIEhQNjgwX0JUTl9JUlEpOwpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9ib2FyZHMvaHA2eHgvcG0uYyBiL2FyY2gvc2gvYm9hcmRzL2hwNnh4L3BtLmMKaW5kZXggODNkMzI3Mi4uZDE5NDc3MyAxMDA2NDQKLS0tIGEvYXJjaC9zaC9ib2FyZHMvaHA2eHgvcG0uYworKysgYi9hcmNoL3NoL2JvYXJkcy9ocDZ4eC9wbS5jCkBAIC0xMiw3ICsxMiw3IEBACiAjaW5jbHVkZSA8bGludXgvdGltZS5oPgogI2luY2x1ZGUgPGFzbS9pby5oPgogI2luY2x1ZGUgPGFzbS9oZDY0NDYxLmg+Ci0jaW5jbHVkZSA8YXNtL2hwNnh4L2hwNnh4Lmg+CisjaW5jbHVkZSA8YXNtL2hwNnh4Lmg+CiAjaW5jbHVkZSA8YXNtL2NwdS9kYWMuaD4KICNpbmNsdWRlIDxhc20vcG0uaD4KIApkaWZmIC0tZ2l0IGEvYXJjaC9zaC9ib2FyZHMvaHA2eHgvc2V0dXAuYyBiL2FyY2gvc2gvYm9hcmRzL2hwNnh4L3NldHVwLmMKaW5kZXggMmQzYTViNC4uYjVhOTY2NCAxMDA2NDQKLS0tIGEvYXJjaC9zaC9ib2FyZHMvaHA2eHgvc2V0dXAuYworKysgYi9hcmNoL3NoL2JvYXJkcy9ocDZ4eC9zZXR1cC5jCkBAIC0xMyw3ICsxMyw3IEBACiAjaW5jbHVkZSA8YXNtL2hkNjQ0NjEuaD4KICNpbmNsdWRlIDxhc20vaW8uaD4KICNpbmNsdWRlIDxhc20vaXJxLmg+Ci0jaW5jbHVkZSA8YXNtL2hwNnh4L2hwNnh4Lmg+CisjaW5jbHVkZSA8YXNtL2hwNnh4Lmg+CiAjaW5jbHVkZSA8YXNtL2NwdS9kYWMuaD4KIAogI2RlZmluZQlTQ1BDUgkweGE0MDAwMTE2CmRpZmYgLS1naXQgYS9hcmNoL3NoL2JvYXJkcy9sYW5kaXNrL2xhbmRpc2tfcHdiLmMgYi9hcmNoL3NoL2JvYXJkcy9sYW5kaXNrL2xhbmRpc2tfcHdiLmMKaW5kZXggMGI3YmVlMS4uZTYyNTI0OSAxMDA2NDQKLS0tIGEvYXJjaC9zaC9ib2FyZHMvbGFuZGlzay9sYW5kaXNrX3B3Yi5jCisrKyBiL2FyY2gvc2gvYm9hcmRzL2xhbmRpc2svbGFuZGlza19wd2IuYwpAQCAtMTM1LDcgKzEzNSw3IEBACiAJcmV0dXJuIGNvdW50OwogfQogCi1zdGF0aWMgaXJxcmV0dXJuX3Qgc3dfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCitzdGF0aWMgaXJxcmV0dXJuX3Qgc3dfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCkKIHsKIAlsYW5kaXNrX2J0biA9ICgweDBmZiAmICh+Y3RybF9pbmIoUEFfU1RBVFVTKSkpOwogCWRpc2FibGVfaXJxKElSUV9CVVRUT04pOwpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9ib2FyZHMvbXBjMTIxMS9zZXR1cC5jIGIvYXJjaC9zaC9ib2FyZHMvbXBjMTIxMS9zZXR1cC5jCmluZGV4IDAxYzEwZmEuLjdjM2QxZDMgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gvYm9hcmRzL21wYzEyMTEvc2V0dXAuYworKysgYi9hcmNoL3NoL2JvYXJkcy9tcGMxMjExL3NldHVwLmMKQEAgLTY5LDcgKzY5LDYgQEAKIAogc3RhdGljIHVuc2lnbmVkIGNoYXIgbV9pcnFfbWFzayA9IDB4ZmI7CiBzdGF0aWMgdW5zaWduZWQgY2hhciBzX2lycV9tYXNrID0gMHhmZjsKLXZvbGF0aWxlIHVuc2lnbmVkIGxvbmcgaXJxX2Vycl9jb3VudDsKIAogc3RhdGljIHZvaWQgZGlzYWJsZV9tcGMxMjExX2lycSh1bnNpZ25lZCBpbnQgaXJxKQogewpAQCAtMTE4LDcgKzExNyw3IEBACiAJaWYoaXJxIDwgOCkgewogCQlpZihtX2lycV9tYXNrICYgKDE8PGlycSkpewogCQkgIGlmKCFtcGMxMjExX2lycV9yZWFsKGlycSkpewotCQkgICAgaXJxX2Vycl9jb3VudCsrOworCQkgICAgYXRvbWljX2luYygmaXJxX2Vycl9jb3VudCkKIAkJICAgIHByaW50aygic3B1cmlvdXMgODI1OUEgaW50ZXJydXB0OiBJUlEgJXhcbiIsaXJxKTsKIAkJICAgfQogCQl9IGVsc2UgewpAQCAtMTMxLDcgKzEzMCw3IEBACiAJfSBlbHNlIHsKIAkJaWYoc19pcnFfbWFzayAmICgxPDwoaXJxIC0gOCkpKXsKIAkJICBpZighbXBjMTIxMV9pcnFfcmVhbChpcnEpKXsKLQkJICAgIGlycV9lcnJfY291bnQrKzsKKwkJICAgIGF0b21pY19pbmMoJmlycV9lcnJfY291bnQpOwogCQkgICAgcHJpbnRrKCJzcHVyaW91cyA4MjU5QSBpbnRlcnJ1cHQ6IElSUSAleFxuIixpcnEpOwogCQkgIH0KIAkJfSBlbHNlIHsKZGlmZiAtLWdpdCBhL2FyY2gvc2gvYm9hcmRzL3JlbmVzYXMvaHM3NzUxcnZvaXAvaW8uYyBiL2FyY2gvc2gvYm9hcmRzL3JlbmVzYXMvaHM3NzUxcnZvaXAvaW8uYwppbmRleCA1MWYzZjY1Li5iYjlhYTBkIDEwMDY0NAotLS0gYS9hcmNoL3NoL2JvYXJkcy9yZW5lc2FzL2hzNzc1MXJ2b2lwL2lvLmMKKysrIGIvYXJjaC9zaC9ib2FyZHMvcmVuZXNhcy9oczc3NTFydm9pcC9pby5jCkBAIC0xNSw3ICsxNSw3IEBACiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvcGNpLmg+CiAjaW5jbHVkZSA8YXNtL2lvLmg+Ci0jaW5jbHVkZSA8YXNtL2hzNzc1MXJ2b2lwL2hzNzc1MXJ2b2lwLmg+CisjaW5jbHVkZSA8YXNtL2hzNzc1MXJ2b2lwLmg+CiAjaW5jbHVkZSA8YXNtL2FkZHJzcGFjZS5oPgogCiBleHRlcm4gdm9pZCAqYXJlYTZfaW84X2Jhc2U7CS8qIEFyZWEgNiA4Yml0IEkvTyBCYXNlIGFkZHJlc3MgKi8KZGlmZiAtLWdpdCBhL2FyY2gvc2gvYm9hcmRzL3JlbmVzYXMvaHM3NzUxcnZvaXAvaXJxLmMgYi9hcmNoL3NoL2JvYXJkcy9yZW5lc2FzL2hzNzc1MXJ2b2lwL2lycS5jCmluZGV4IGM2MTdiMTguLjk0M2Y5M2EgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gvYm9hcmRzL3JlbmVzYXMvaHM3NzUxcnZvaXAvaXJxLmMKKysrIGIvYXJjaC9zaC9ib2FyZHMvcmVuZXNhcy9oczc3NTFydm9pcC9pcnEuYwpAQCAtMTQsNyArMTQsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2lycS5oPgogI2luY2x1ZGUgPGFzbS9pby5oPgogI2luY2x1ZGUgPGFzbS9pcnEuaD4KLSNpbmNsdWRlIDxhc20vaHM3NzUxcnZvaXAvaHM3NzUxcnZvaXAuaD4KKyNpbmNsdWRlIDxhc20vaHM3NzUxcnZvaXAuaD4KIAogc3RhdGljIGludCBtYXNrX3Bvc1tdID0gezgsIDksIDEwLCAxMSwgMTIsIDEzLCAwLCAxLCAyLCAzLCA0LCA1LCA2LCA3fTsKIApkaWZmIC0tZ2l0IGEvYXJjaC9zaC9ib2FyZHMvcmVuZXNhcy9oczc3NTFydm9pcC9zZXR1cC5jIGIvYXJjaC9zaC9ib2FyZHMvcmVuZXNhcy9oczc3NTFydm9pcC9zZXR1cC5jCmluZGV4IDA0MTRjMTUuLmY3ZDBlMzAgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gvYm9hcmRzL3JlbmVzYXMvaHM3NzUxcnZvaXAvc2V0dXAuYworKysgYi9hcmNoL3NoL2JvYXJkcy9yZW5lc2FzL2hzNzc1MXJ2b2lwL3NldHVwLmMKQEAgLTEwLDIyICsxMCwyMSBAQAogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9pcnEuaD4KICNpbmNsdWRlIDxsaW51eC9tbS5oPgotI2luY2x1ZGUgPGxpbnV4L3ZtYWxsb2MuaD4KLSNpbmNsdWRlIDxsaW51eC9oZHJlZy5oPgotI2luY2x1ZGUgPGxpbnV4L2lkZS5oPgogI2luY2x1ZGUgPGxpbnV4L3BtLmg+CisjaW5jbHVkZSA8YXNtL2hzNzc1MXJ2b2lwLmg+CiAjaW5jbHVkZSA8YXNtL2lvLmg+Ci0jaW5jbHVkZSA8YXNtL2hzNzc1MXJ2b2lwL2hzNzc1MXJ2b2lwLmg+CiAjaW5jbHVkZSA8YXNtL21hY2h2ZWMuaD4KLSNpbmNsdWRlIDxhc20vcnRjLmg+Ci0jaW5jbHVkZSA8YXNtL2lycS5oPgorCitzdGF0aWMgc3RydWN0IGlwcl9kYXRhIGhzNzc1MDFydm9pcF9pcHJfbWFwW10gPSB7CisjaWYgZGVmaW5lZChDT05GSUdfSFM3NzUxUlZPSVBfQ09ERUMpCisJeyBETVRFMF9JUlEsIERNQV9JUFJfQUREUiwgRE1BX0lQUl9QT1MsIERNQV9QUklPUklUWSB9LAorCXsgRE1URTFfSVJRLCBETUFfSVBSX0FERFIsIERNQV9JUFJfUE9TLCBETUFfUFJJT1JJVFkgfSwKKyNlbmRpZgorfTsKIAogc3RhdGljIHZvaWQgX19pbml0IGhzNzc1MXJ2b2lwX2luaXRfaXJxKHZvaWQpCiB7Ci0jaWYgZGVmaW5lZChDT05GSUdfSFM3NzUxUlZPSVBfQ09ERUMpCi0JbWFrZV9pcHJfaXJxKERNVEUwX0lSUSwgRE1BX0lQUl9BRERSLCBETUFfSVBSX1BPUywgRE1BX1BSSU9SSVRZKTsKLQltYWtlX2lwcl9pcnEoRE1URTFfSVJRLCBETUFfSVBSX0FERFIsIERNQV9JUFJfUE9TLCBETUFfUFJJT1JJVFkpOwotI2VuZGlmCisJbWFrZV9pcHJfaXJxKGhzNzc1MDFydm9pcF9pcHJfbWFwLCBBUlJBWV9TSVpFKGhzNzc1MDFydm9pcF9pcHJfbWFwKSk7CiAKIAlpbml0X2hzNzc1MXJ2b2lwX0lSUSgpOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9ib2FyZHMvcmVuZXNhcy9yNzc4MHJwL2lvLmMgYi9hcmNoL3NoL2JvYXJkcy9yZW5lc2FzL3I3NzgwcnAvaW8uYwppbmRleCBkYjkyZDZlLi4zMTFjY2NjIDEwMDY0NAotLS0gYS9hcmNoL3NoL2JvYXJkcy9yZW5lc2FzL3I3NzgwcnAvaW8uYworKysgYi9hcmNoL3NoL2JvYXJkcy9yZW5lc2FzL3I3NzgwcnAvaW8uYwpAQCAtMTEsNyArMTEsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+Ci0jaW5jbHVkZSA8YXNtL3I3NzgwcnAvcjc3ODBycC5oPgorI2luY2x1ZGUgPGFzbS9yNzc4MHJwLmg+CiAjaW5jbHVkZSA8YXNtL2FkZHJzcGFjZS5oPgogI2luY2x1ZGUgPGFzbS9pby5oPgogCmRpZmYgLS1naXQgYS9hcmNoL3NoL2JvYXJkcy9yZW5lc2FzL3I3NzgwcnAvaXJxLmMgYi9hcmNoL3NoL2JvYXJkcy9yZW5lc2FzL3I3NzgwcnAvaXJxLmMKaW5kZXggMmQ5NjBlOS4uYWExNWVjNSAxMDA2NDQKLS0tIGEvYXJjaC9zaC9ib2FyZHMvcmVuZXNhcy9yNzc4MHJwL2lycS5jCisrKyBiL2FyY2gvc2gvYm9hcmRzL3JlbmVzYXMvcjc3ODBycC9pcnEuYwpAQCAtMSwxOCArMSwxNyBAQAogLyoKLSAqIGxpbnV4L2FyY2gvc2gvYm9hcmRzL3JlbmVzYXMvcjc3ODBycC9pcnEuYwotICoKLSAqIENvcHlyaWdodCAoQykgMjAwMCAgS2F6dW1vdG8gS29qaW1hCi0gKgogICogUmVuZXNhcyBTb2x1dGlvbnMgSGlnaGxhbmRlciBSNzc4MFJQLTEgU3VwcG9ydC4KICAqCi0gKiBNb2RpZmllZCBmb3IgUjc3ODBSUC0xIGJ5Ci0gKiBBdG9tIENyZWF0ZSBFbmdpbmVlcmluZyBDby4sIEx0ZC4gMjAwMi4KKyAqIENvcHlyaWdodCAoQykgMjAwMiAgQXRvbSBDcmVhdGUgRW5naW5lZXJpbmcgQ28uLCBMdGQuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDYgIFBhdWwgTXVuZHQKKyAqCisgKiBUaGlzIGZpbGUgaXMgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZS4gIFNlZSB0aGUgZmlsZSAiQ09QWUlORyIgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoaXMgYXJjaGl2ZQorICogZm9yIG1vcmUgZGV0YWlscy4KICAqLwogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9pcnEuaD4KLSNpbmNsdWRlIDxhc20vaW8uaD4KLSNpbmNsdWRlIDxhc20vaXJxLmg+Ci0jaW5jbHVkZSA8YXNtL3I3NzgwcnAvcjc3ODBycC5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisjaW5jbHVkZSA8YXNtL3I3NzgwcnAuaD4KIAogI2lmZGVmIENPTkZJR19TSF9SNzc4ME1QCiBzdGF0aWMgaW50IG1hc2tfcG9zW10gPSB7MTIsIDExLCA5LCAxNCwgMTUsIDgsIDEzLCA2LCA1LCA0LCAzLCAyLCAwLCAwLCAxLCAwfTsKQEAgLTIwLDcxICsxOSwyNiBAQAogc3RhdGljIGludCBtYXNrX3Bvc1tdID0gezE1LCAxNCwgMTMsIDEyLCAxMSwgMTAsIDksIDgsIDcsIDUsIDYsIDQsIDAsIDEsIDIsIDB9OwogI2VuZGlmCiAKLXN0YXRpYyB2b2lkIGVuYWJsZV9yNzc4MHJwX2lycSh1bnNpZ25lZCBpbnQgaXJxKTsKLXN0YXRpYyB2b2lkIGRpc2FibGVfcjc3ODBycF9pcnEodW5zaWduZWQgaW50IGlycSk7Ci0KLS8qIHNodXRkb3duIGlzIHNhbWUgYXMgImRpc2FibGUiICovCi0jZGVmaW5lIHNodXRkb3duX3I3NzgwcnBfaXJxIGRpc2FibGVfcjc3ODBycF9pcnEKLQotc3RhdGljIHZvaWQgYWNrX3I3NzgwcnBfaXJxKHVuc2lnbmVkIGludCBpcnEpOwotc3RhdGljIHZvaWQgZW5kX3I3NzgwcnBfaXJxKHVuc2lnbmVkIGludCBpcnEpOwotCi1zdGF0aWMgdW5zaWduZWQgaW50IHN0YXJ0dXBfcjc3ODBycF9pcnEodW5zaWduZWQgaW50IGlycSkKK3N0YXRpYyB2b2lkIGVuYWJsZV9yNzc4MHJwX2lycSh1bnNpZ25lZCBpbnQgaXJxKQogewotCWVuYWJsZV9yNzc4MHJwX2lycShpcnEpOwotCXJldHVybiAwOyAvKiBuZXZlciBhbnl0aGluZyBwZW5kaW5nICovCisJLyogU2V0IHByaW9yaXR5IGluIElQUiBiYWNrIHRvIG9yaWdpbmFsIHZhbHVlICovCisJY3RybF9vdXR3KGN0cmxfaW53KElSTENOVFIxKSB8ICgxIDw8IG1hc2tfcG9zW2lycV0pLCBJUkxDTlRSMSk7CiB9CiAKIHN0YXRpYyB2b2lkIGRpc2FibGVfcjc3ODBycF9pcnEodW5zaWduZWQgaW50IGlycSkKIHsKLQl1bnNpZ25lZCBzaG9ydCB2YWw7Ci0JdW5zaWduZWQgc2hvcnQgbWFzayA9IDB4ZmZmZiBeICgweDAwMDEgPDwgbWFza19wb3NbaXJxXSk7Ci0KIAkvKiBTZXQgdGhlIHByaW9yaXR5IGluIElQUiB0byAwICovCi0JdmFsID0gY3RybF9pbncoSVJMQ05UUjEpOwotCXZhbCAmPSBtYXNrOwotCWN0cmxfb3V0dyh2YWwsIElSTENOVFIxKTsKKwljdHJsX291dHcoY3RybF9pbncoSVJMQ05UUjEpICYgKDB4ZmZmZiBeICgxIDw8IG1hc2tfcG9zW2lycV0pKSwKKwkJICBJUkxDTlRSMSk7CiB9CiAKLXN0YXRpYyB2b2lkIGVuYWJsZV9yNzc4MHJwX2lycSh1bnNpZ25lZCBpbnQgaXJxKQotewotCXVuc2lnbmVkIHNob3J0IHZhbDsKLQl1bnNpZ25lZCBzaG9ydCB2YWx1ZSA9ICgweDAwMDEgPDwgbWFza19wb3NbaXJxXSk7Ci0KLQkvKiBTZXQgcHJpb3JpdHkgaW4gSVBSIGJhY2sgdG8gb3JpZ2luYWwgdmFsdWUgKi8KLQl2YWwgPSBjdHJsX2ludyhJUkxDTlRSMSk7Ci0JdmFsIHw9IHZhbHVlOwotCWN0cmxfb3V0dyh2YWwsIElSTENOVFIxKTsKLX0KLQotc3RhdGljIHZvaWQgYWNrX3I3NzgwcnBfaXJxKHVuc2lnbmVkIGludCBpcnEpCi17Ci0JZGlzYWJsZV9yNzc4MHJwX2lycShpcnEpOwotfQotCi1zdGF0aWMgdm9pZCBlbmRfcjc3ODBycF9pcnEodW5zaWduZWQgaW50IGlycSkKLXsKLQlpZiAoIShpcnFfZGVzY1tpcnFdLnN0YXR1cyAmIChJUlFfRElTQUJMRUR8SVJRX0lOUFJPR1JFU1MpKSkKLQkJZW5hYmxlX3I3NzgwcnBfaXJxKGlycSk7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgaHdfaW50ZXJydXB0X3R5cGUgcjc3ODBycF9pcnFfdHlwZSA9IHsKLQkudHlwZW5hbWUgPSAiUjc3ODBSUC1JUlEiLAotCS5zdGFydHVwID0gc3RhcnR1cF9yNzc4MHJwX2lycSwKLQkuc2h1dGRvd24gPSBzaHV0ZG93bl9yNzc4MHJwX2lycSwKLQkuZW5hYmxlID0gZW5hYmxlX3I3NzgwcnBfaXJxLAotCS5kaXNhYmxlID0gZGlzYWJsZV9yNzc4MHJwX2lycSwKLQkuYWNrID0gYWNrX3I3NzgwcnBfaXJxLAotCS5lbmQgPSBlbmRfcjc3ODBycF9pcnEsCitzdGF0aWMgc3RydWN0IGlycV9jaGlwIHI3NzgwcnBfaXJxX2NoaXAgX19yZWFkX21vc3RseSA9IHsKKwkubmFtZQkJPSAiUjc3ODBSUCIsCisJLm1hc2sJCT0gZGlzYWJsZV9yNzc4MHJwX2lycSwKKwkudW5tYXNrCQk9IGVuYWJsZV9yNzc4MHJwX2lycSwKKwkubWFza19hY2sJPSBkaXNhYmxlX3I3NzgwcnBfaXJxLAogfTsKIAotc3RhdGljIHZvaWQgbWFrZV9yNzc4MHJwX2lycSh1bnNpZ25lZCBpbnQgaXJxKQotewotCWRpc2FibGVfaXJxX25vc3luYyhpcnEpOwotCWlycV9kZXNjW2lycV0uY2hpcCA9ICZyNzc4MHJwX2lycV90eXBlOwotCWRpc2FibGVfcjc3ODBycF9pcnEoaXJxKTsKLX0KLQogLyoKICAqIEluaXRpYWxpemUgSVJRIHNldHRpbmcKICAqLwpAQCAtOTIsMjQgKzQ2LDEwIEBACiB7CiAJaW50IGk7CiAKLQkvKiBJUkwwPVBDSSBTbG90ICNBCi0JICogSVJMMT1QQ0kgU2xvdCAjQgotCSAqIElSTDI9UENJIFNsb3QgI0MKLQkgKiBJUkwzPVBDSSBTbG90ICNECi0JICogSVJMND1DRiBDYXJkCi0JICogSVJMNT1DRiBDYXJkIEluc2VydAotCSAqIElSTDY9TTY2NTk2Ci0JICogSVJMNz1TRCBDYXJkCi0JICogSVJMOD1Ub3VjaCBQYW5lbAotCSAqIElSTDk9U0NJCi0JICogSVJMMTA9U2VyaWFsCi0JICogSVJMMTE9RXh0ZW50aW9uICNBCi0JICogSVJMMTE9RXh0ZW50aW9uICNCCi0JICogSVJMMTI9RGVidWcgTEFOCi0JICogSVJMMTM9UHVzaCBTd2l0Y2gKLQkgKiBJUkwxND1aaWdnQmVlIElPCi0JICovCi0KLQlmb3IgKGk9MDsgaTwxNTsgaSsrKQotCQltYWtlX3I3NzgwcnBfaXJxKGkpOworCWZvciAoaSA9IDA7IGkgPCAxNTsgaSsrKSB7CisJCWRpc2FibGVfaXJxX25vc3luYyhpKTsKKwkJc2V0X2lycV9jaGlwX2FuZF9oYW5kbGVyX25hbWUoaSwgJnI3NzgwcnBfaXJxX2NoaXAsCisJCQkJCSAgICAgIGhhbmRsZV9sZXZlbF9pcnEsICJsZXZlbCIpOworCQllbmFibGVfcjc3ODBycF9pcnEoaSk7CisJfQogfQpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9ib2FyZHMvcmVuZXNhcy9yNzc4MHJwL3NldHVwLmMgYi9hcmNoL3NoL2JvYXJkcy9yZW5lc2FzL3I3NzgwcnAvc2V0dXAuYwppbmRleCBiOTQxYWEwLi5jMzMxY2FlIDEwMDY0NAotLS0gYS9hcmNoL3NoL2JvYXJkcy9yZW5lc2FzL3I3NzgwcnAvc2V0dXAuYworKysgYi9hcmNoL3NoL2JvYXJkcy9yZW5lc2FzL3I3NzgwcnAvc2V0dXAuYwpAQCAtMTMsNyArMTMsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KICNpbmNsdWRlIDxhc20vbWFjaHZlYy5oPgotI2luY2x1ZGUgPGFzbS9yNzc4MHJwL3I3NzgwcnAuaD4KKyNpbmNsdWRlIDxhc20vcjc3ODBycC5oPgogI2luY2x1ZGUgPGFzbS9jbG9jay5oPgogI2luY2x1ZGUgPGFzbS9pby5oPgogCmRpZmYgLS1naXQgYS9hcmNoL3NoL2JvYXJkcy9yZW5lc2FzL3J0czc3NTFyMmQvaW8uYyBiL2FyY2gvc2gvYm9hcmRzL3JlbmVzYXMvcnRzNzc1MXIyZC9pby5jCmluZGV4IDEzNWFhMGIuLmYyNTA3YTggMTAwNjQ0Ci0tLSBhL2FyY2gvc2gvYm9hcmRzL3JlbmVzYXMvcnRzNzc1MXIyZC9pby5jCisrKyBiL2FyY2gvc2gvYm9hcmRzL3JlbmVzYXMvcnRzNzc1MXIyZC9pby5jCkBAIC0xMSw4ICsxMSw4IEBACiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KLSNpbmNsdWRlIDxhc20vcnRzNzc1MXIyZC9ydHM3NzUxcjJkLmg+Ci0jaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KKyNpbmNsdWRlIDxhc20vcnRzNzc1MXIyZC5oPgogI2luY2x1ZGUgPGFzbS9hZGRyc3BhY2UuaD4KIAogLyoKZGlmZiAtLWdpdCBhL2FyY2gvc2gvYm9hcmRzL3JlbmVzYXMvcnRzNzc1MXIyZC9pcnEuYyBiL2FyY2gvc2gvYm9hcmRzL3JlbmVzYXMvcnRzNzc1MXIyZC9pcnEuYwppbmRleCBjOTE1ZTdhLi5jYjBlYjIwIDEwMDY0NAotLS0gYS9hcmNoL3NoL2JvYXJkcy9yZW5lc2FzL3J0czc3NTFyMmQvaXJxLmMKKysrIGIvYXJjaC9zaC9ib2FyZHMvcmVuZXNhcy9ydHM3NzUxcjJkL2lycS5jCkBAIC04LDEyICs4LDEwIEBACiAgKiBNb2RpZmllZCBmb3IgUlRTNzc1MVIyRCBieQogICogQXRvbSBDcmVhdGUgRW5naW5lZXJpbmcgQ28uLCBMdGQuIDIwMDIuCiAgKi8KLQogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9pcnEuaD4KLSNpbmNsdWRlIDxhc20vaW8uaD4KLSNpbmNsdWRlIDxhc20vaXJxLmg+Ci0jaW5jbHVkZSA8YXNtL3J0czc3NTFyMmQvcnRzNzc1MXIyZC5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisjaW5jbHVkZSA8YXNtL3J0czc3NTFyMmQuaD4KIAogI2lmIGRlZmluZWQoQ09ORklHX1JUUzc3NTFSMkRfUkVWMTEpCiBzdGF0aWMgaW50IG1hc2tfcG9zW10gPSB7MTEsIDksIDgsIDEyLCAxMCwgNiwgNSwgNCwgNywgMTQsIDEzLCAwLCAwLCAwLCAwfTsKZGlmZiAtLWdpdCBhL2FyY2gvc2gvYm9hcmRzL3JlbmVzYXMvcnRzNzc1MXIyZC9sZWQuYyBiL2FyY2gvc2gvYm9hcmRzL3JlbmVzYXMvcnRzNzc1MXIyZC9sZWQuYwppbmRleCBhN2NlNjZjLi41MDlmNTQ4IDEwMDY0NAotLS0gYS9hcmNoL3NoL2JvYXJkcy9yZW5lc2FzL3J0czc3NTFyMmQvbGVkLmMKKysrIGIvYXJjaC9zaC9ib2FyZHMvcmVuZXNhcy9ydHM3NzUxcjJkL2xlZC5jCkBAIC04LDEzICs4LDkgQEAKICAqCiAgKiBUaGlzIGZpbGUgY29udGFpbnMgUmVuZXNhcyBUZWNobm9sb2d5IFNhbGVzIFJUUzc3NTFSMkQgc3BlY2lmaWMgTEVEIGNvZGUuCiAgKi8KLQotI2luY2x1ZGUgPGFzbS9pby5oPgotI2luY2x1ZGUgPGFzbS9ydHM3NzUxcjJkL3J0czc3NTFyMmQuaD4KLQotI2lmZGVmIENPTkZJR19IRUFSVEJFQVQKLQorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxhc20vcnRzNzc1MXIyZC5oPgogCiAvKiBDeWNsZSB0aGUgTEVEJ3MgaW4gdGhlIGNsYXNpYyBLbmlnaHRyaWdlci9TdW4gcGF0dGVybiAqLwogdm9pZCBoZWFydGJlYXRfcnRzNzc1MXIyZCh2b2lkKQpAQCAtNDYsMTAgKzQyLDMgQEAKIAllbHNlCiAJCWJpdC0tOwogfQotI2VuZGlmIC8qIENPTkZJR19IRUFSVEJFQVQgKi8KLQotdm9pZCBydHM3NzUxcjJkX2xlZCh1bnNpZ25lZCBzaG9ydCB2YWx1ZSkKLXsKLQljdHJsX291dHcodmFsdWUsIFBBX09VVFBPUlQpOwotfQotCmRpZmYgLS1naXQgYS9hcmNoL3NoL2JvYXJkcy9yZW5lc2FzL3J0czc3NTFyMmQvc2V0dXAuYyBiL2FyY2gvc2gvYm9hcmRzL3JlbmVzYXMvcnRzNzc1MXIyZC9zZXR1cC5jCmluZGV4IDIwNTk3YTYuLjVjMDQyZDMgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gvYm9hcmRzL3JlbmVzYXMvcnRzNzc1MXIyZC9zZXR1cC5jCisrKyBiL2FyY2gvc2gvYm9hcmRzL3JlbmVzYXMvcnRzNzc1MXIyZC9zZXR1cC5jCkBAIC0xMiw5ICsxMiw5IEBACiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvc2VyaWFsXzgyNTAuaD4KICNpbmNsdWRlIDxsaW51eC9wbS5oPgotI2luY2x1ZGUgPGFzbS9pby5oPgogI2luY2x1ZGUgPGFzbS9tYWNodmVjLmg+CiAjaW5jbHVkZSA8YXNtL21hY2gvcnRzNzc1MXIyZC5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgogI2luY2x1ZGUgPGFzbS92b3lhZ2VyZ3guaD4KIAogZXh0ZXJuIHZvaWQgaGVhcnRiZWF0X3J0czc3NTFyMmQodm9pZCk7CmRpZmYgLS1naXQgYS9hcmNoL3NoL2JvYXJkcy9yZW5lc2FzL3NoNzcxMHZvaXBndy9zZXR1cC5jIGIvYXJjaC9zaC9ib2FyZHMvcmVuZXNhcy9zaDc3MTB2b2lwZ3cvc2V0dXAuYwppbmRleCBlNTdlN2FmLi4xODA4MTBiIDEwMDY0NAotLS0gYS9hcmNoL3NoL2JvYXJkcy9yZW5lc2FzL3NoNzcxMHZvaXBndy9zZXR1cC5jCisrKyBiL2FyY2gvc2gvYm9hcmRzL3JlbmVzYXMvc2g3NzEwdm9pcGd3L3NldHVwLmMKQEAgLTEzLDYgKzEzLDUxIEBACiAjaW5jbHVkZSA8YXNtL2lvLmg+CiAjaW5jbHVkZSA8YXNtL2lycS5oPgogCitzdGF0aWMgc3RydWN0IGlwcl9kYXRhIHNoNzcxMHZvaXBnd19pcHJfbWFwW10gPSB7CisJeyBUSU1FUjJfSVJRLCBUSU1FUjJfSVBSX0FERFIsIFRJTUVSMl9JUFJfUE9TLCBUSU1FUjJfUFJJT1JJVFkgfSwKKwl7IFdEVF9JUlEsIFdEVF9JUFJfQUREUiwgV0RUX0lQUl9QT1MsIFdEVF9QUklPUklUWSB9LAorCisJLyogU0NJRjAgKi8KKwl7IFNDSUYwX0VSSV9JUlEsIFNDSUYwX0lQUl9BRERSLCBTQ0lGMF9JUFJfUE9TLCBTQ0lGMF9QUklPUklUWSB9LAorCXsgU0NJRjBfUlhJX0lSUSwgU0NJRjBfSVBSX0FERFIsIFNDSUYwX0lQUl9QT1MsIFNDSUYwX1BSSU9SSVRZIH0sCisJeyBTQ0lGMF9CUklfSVJRLCBTQ0lGMF9JUFJfQUREUiwgU0NJRjBfSVBSX1BPUywgU0NJRjBfUFJJT1JJVFkgfSwKKwl7IFNDSUYwX1RYSV9JUlEsIFNDSUYwX0lQUl9BRERSLCBTQ0lGMF9JUFJfUE9TLCBTQ0lGMF9QUklPUklUWSB9LAorCisJLyogRE1BQy0xICovCisJeyBETVRFMF9JUlEsIERNQV9JUFJfQUREUiwgRE1BX0lQUl9QT1MsIERNQV9QUklPUklUWSB9LAorCXsgRE1URTFfSVJRLCBETUFfSVBSX0FERFIsIERNQV9JUFJfUE9TLCBETUFfUFJJT1JJVFkgfSwKKwl7IERNVEUyX0lSUSwgRE1BX0lQUl9BRERSLCBETUFfSVBSX1BPUywgRE1BX1BSSU9SSVRZIH0sCisJeyBETVRFM19JUlEsIERNQV9JUFJfQUREUiwgRE1BX0lQUl9QT1MsIERNQV9QUklPUklUWSB9LAorCisJLyogRE1BQy0yICovCisJeyBETVRFNF9JUlEsIERNQTJfSVBSX0FERFIsIERNQTJfSVBSX1BPUywgRE1BMl9QUklPUklUWSB9LAorCXsgRE1URTRfSVJRLCBETUEyX0lQUl9BRERSLCBETUEyX0lQUl9QT1MsIERNQTJfUFJJT1JJVFkgfSwKKworCS8qIElQU0VDICovCisJeyBJUFNFQ19JUlEsIElQU0VDX0lQUl9BRERSLCBJUFNFQ19JUFJfUE9TLCBJUFNFQ19QUklPUklUWSB9LAorCisJLyogRURNQUMgKi8KKwl7IEVETUFDMF9JUlEsIEVETUFDMF9JUFJfQUREUiwgRURNQUMwX0lQUl9QT1MsIEVETUFDMF9QUklPUklUWSB9LAorCXsgRURNQUMxX0lSUSwgRURNQUMxX0lQUl9BRERSLCBFRE1BQzFfSVBSX1BPUywgRURNQUMxX1BSSU9SSVRZIH0sCisJeyBFRE1BQzJfSVJRLCBFRE1BQzJfSVBSX0FERFIsIEVETUFDMl9JUFJfUE9TLCBFRE1BQzJfUFJJT1JJVFkgfSwKKworCS8qIFNJT0YwICovCisJeyBTSU9GMF9FUklfSVJRLCBTSU9GMF9JUFJfQUREUiwgU0lPRjBfSVBSX1BPUywgU0lPRjBfUFJJT1JJVFkgfSwKKwl7IFNJT0YwX1RYSV9JUlEsIFNJT0YwX0lQUl9BRERSLCBTSU9GMF9JUFJfUE9TLCBTSU9GMF9QUklPUklUWSB9LAorCXsgU0lPRjBfUlhJX0lSUSwgU0lPRjBfSVBSX0FERFIsIFNJT0YwX0lQUl9QT1MsIFNJT0YwX1BSSU9SSVRZIH0sCisJeyBTSU9GMF9DQ0lfSVJRLCBTSU9GMF9JUFJfQUREUiwgU0lPRjBfSVBSX1BPUywgU0lPRjBfUFJJT1JJVFkgfSwKKworCS8qIFNJT0YxICovCisJeyBTSU9GMV9FUklfSVJRLCBTSU9GMV9JUFJfQUREUiwgU0lPRjFfSVBSX1BPUywgU0lPRjFfUFJJT1JJVFkgfSwKKwl7IFNJT0YxX1RYSV9JUlEsIFNJT0YxX0lQUl9BRERSLCBTSU9GMV9JUFJfUE9TLCBTSU9GMV9QUklPUklUWSB9LAorCXsgU0lPRjFfUlhJX0lSUSwgU0lPRjFfSVBSX0FERFIsIFNJT0YxX0lQUl9QT1MsIFNJT0YxX1BSSU9SSVRZIH0sCisJeyBTSU9GMV9DQ0lfSVJRLCBTSU9GMV9JUFJfQUREUiwgU0lPRjFfSVBSX1BPUywgU0lPRjFfUFJJT1JJVFkgfSwKKworCS8qIFNMSUMgSVJRJ3MgKi8KKwl7IElSUTFfSVJRLCBJUlExX0lQUl9BRERSLCBJUlExX0lQUl9QT1MsIElSUTFfUFJJT1JJVFkgfSwKKwl7IElSUTJfSVJRLCBJUlEyX0lQUl9BRERSLCBJUlEyX0lQUl9QT1MsIElSUTJfUFJJT1JJVFkgfSwKK307CisKIC8qCiAgKiBJbml0aWFsaXplIElSUSBzZXR0aW5nCiAgKi8KQEAgLTM3LDY1ICs4Miw3IEBACiAJICovCiAJY3RybF9vdXR3KDB4MmFhLCBJTlRDX0lDUjEpOwogCi0JLyogTm93IG1ha2UgSVBSIGludGVycnVwdHMgKi8KLQltYWtlX2lwcl9pcnEoVElNRVIyX0lSUSwgVElNRVIyX0lQUl9BRERSLAotCQkJVElNRVIyX0lQUl9QT1MsIFRJTUVSMl9QUklPUklUWSk7Ci0JbWFrZV9pcHJfaXJxKFdEVF9JUlEsIFdEVF9JUFJfQUREUiwgV0RUX0lQUl9QT1MsIFdEVF9QUklPUklUWSk7Ci0KLQkvKiBTQ0lGMCAqLwotCW1ha2VfaXByX2lycShTQ0lGMF9FUklfSVJRLCBTQ0lGMF9JUFJfQUREUiwgU0NJRjBfSVBSX1BPUywKLQkJCVNDSUYwX1BSSU9SSVRZKTsKLQltYWtlX2lwcl9pcnEoU0NJRjBfUlhJX0lSUSwgU0NJRjBfSVBSX0FERFIsIFNDSUYwX0lQUl9QT1MsCi0JCQlTQ0lGMF9QUklPUklUWSk7Ci0JbWFrZV9pcHJfaXJxKFNDSUYwX0JSSV9JUlEsIFNDSUYwX0lQUl9BRERSLCBTQ0lGMF9JUFJfUE9TLAotCQkJU0NJRjBfUFJJT1JJVFkpOwotCW1ha2VfaXByX2lycShTQ0lGMF9UWElfSVJRLCBTQ0lGMF9JUFJfQUREUiwgU0NJRjBfSVBSX1BPUywKLQkJCVNDSUYwX1BSSU9SSVRZKTsKLQotCS8qIERNQUMtMSAqLwotCW1ha2VfaXByX2lycShETVRFMF9JUlEsIERNQV9JUFJfQUREUiwgRE1BX0lQUl9QT1MsIERNQV9QUklPUklUWSk7Ci0JbWFrZV9pcHJfaXJxKERNVEUxX0lSUSwgRE1BX0lQUl9BRERSLCBETUFfSVBSX1BPUywgRE1BX1BSSU9SSVRZKTsKLQltYWtlX2lwcl9pcnEoRE1URTJfSVJRLCBETUFfSVBSX0FERFIsIERNQV9JUFJfUE9TLCBETUFfUFJJT1JJVFkpOwotCW1ha2VfaXByX2lycShETVRFM19JUlEsIERNQV9JUFJfQUREUiwgRE1BX0lQUl9QT1MsIERNQV9QUklPUklUWSk7Ci0KLQkvKiBETUFDLTIgKi8KLQltYWtlX2lwcl9pcnEoRE1URTRfSVJRLCBETUEyX0lQUl9BRERSLCBETUEyX0lQUl9QT1MsIERNQTJfUFJJT1JJVFkpOwotCW1ha2VfaXByX2lycShETVRFNF9JUlEsIERNQTJfSVBSX0FERFIsIERNQTJfSVBSX1BPUywgRE1BMl9QUklPUklUWSk7Ci0KLQkvKiBJUFNFQyAqLwotCW1ha2VfaXByX2lycShJUFNFQ19JUlEsIElQU0VDX0lQUl9BRERSLCBJUFNFQ19JUFJfUE9TLCBJUFNFQ19QUklPUklUWSk7Ci0KLQkvKiBFRE1BQyAqLwotCW1ha2VfaXByX2lycShFRE1BQzBfSVJRLCBFRE1BQzBfSVBSX0FERFIsIEVETUFDMF9JUFJfUE9TLAotCQkJRURNQUMwX1BSSU9SSVRZKTsKLQltYWtlX2lwcl9pcnEoRURNQUMxX0lSUSwgRURNQUMxX0lQUl9BRERSLCBFRE1BQzFfSVBSX1BPUywKLQkJCUVETUFDMV9QUklPUklUWSk7Ci0JbWFrZV9pcHJfaXJxKEVETUFDMl9JUlEsIEVETUFDMl9JUFJfQUREUiwgRURNQUMyX0lQUl9QT1MsCi0JCQlFRE1BQzJfUFJJT1JJVFkpOwotCi0JLyogU0lPRjAgKi8KLQltYWtlX2lwcl9pcnEoU0lPRjBfRVJJX0lSUSwgU0lPRjBfSVBSX0FERFIsIFNJT0YwX0lQUl9QT1MsCi0JCQlTSU9GMF9QUklPUklUWSk7Ci0JbWFrZV9pcHJfaXJxKFNJT0YwX1RYSV9JUlEsIFNJT0YwX0lQUl9BRERSLCBTSU9GMF9JUFJfUE9TLAotCQkJU0lPRjBfUFJJT1JJVFkpOwotCW1ha2VfaXByX2lycShTSU9GMF9SWElfSVJRLCBTSU9GMF9JUFJfQUREUiwgU0lPRjBfSVBSX1BPUywKLQkJCVNJT0YwX1BSSU9SSVRZKTsKLQltYWtlX2lwcl9pcnEoU0lPRjBfQ0NJX0lSUSwgU0lPRjBfSVBSX0FERFIsIFNJT0YwX0lQUl9QT1MsCi0JCQlTSU9GMF9QUklPUklUWSk7Ci0KLQkvKiBTSU9GMSAqLwotCW1ha2VfaXByX2lycShTSU9GMV9FUklfSVJRLCBTSU9GMV9JUFJfQUREUiwgU0lPRjFfSVBSX1BPUywKLQkJCVNJT0YxX1BSSU9SSVRZKTsKLQltYWtlX2lwcl9pcnEoU0lPRjFfVFhJX0lSUSwgU0lPRjFfSVBSX0FERFIsIFNJT0YxX0lQUl9QT1MsCi0JCQlTSU9GMV9QUklPUklUWSk7Ci0JbWFrZV9pcHJfaXJxKFNJT0YxX1JYSV9JUlEsIFNJT0YxX0lQUl9BRERSLCBTSU9GMV9JUFJfUE9TLAotCQkJU0lPRjFfUFJJT1JJVFkpOwotCW1ha2VfaXByX2lycShTSU9GMV9DQ0lfSVJRLCBTSU9GMV9JUFJfQUREUiwgU0lPRjFfSVBSX1BPUywKLQkJCVNJT0YxX1BSSU9SSVRZKTsKLQotCS8qIFNMSUMgSVJRJ3MgKi8KLQltYWtlX2lwcl9pcnEoSVJRMV9JUlEsIElSUTFfSVBSX0FERFIsIElSUTFfSVBSX1BPUywgSVJRMV9QUklPUklUWSk7Ci0JbWFrZV9pcHJfaXJxKElSUTJfSVJRLCBJUlEyX0lQUl9BRERSLCBJUlEyX0lQUl9QT1MsIElSUTJfUFJJT1JJVFkpOworCW1ha2VfaXByX2lycShzaDc3MTB2b2lwZ3dfaXByX21hcCwgQVJSQVlfU0laRShzaDc3MTB2b2lwZ3dfaXByX21hcCkpOwogfQogCiAvKgpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9ib2FyZHMvc2UvNzMwMC9pcnEuYyBiL2FyY2gvc2gvYm9hcmRzL3NlLzczMDAvaXJxLmMKaW5kZXggYWQxMDM0Zi4uMTI3OWQ3NyAxMDA2NDQKLS0tIGEvYXJjaC9zaC9ib2FyZHMvc2UvNzMwMC9pcnEuYworKysgYi9hcmNoL3NoL2JvYXJkcy9zZS83MzAwL2lycS5jCkBAIC0xMyw2ICsxMywxNyBAQAogI2luY2x1ZGUgPGFzbS9pby5oPgogI2luY2x1ZGUgPGFzbS9zZTczMDAuaD4KIAorc3RhdGljIHN0cnVjdCBpcHJfZGF0YSBzZTczMDBfaXByX21hcFtdID0geworCS8qIFBDX0lSUVswLTNdIC0+IElSUTAgKDMyKSAqLworCXsgSVJRMF9JUlEsIElSUTBfSVBSX0FERFIsIElSUTBfSVBSX1BPUywgMHgwZiAtIElSUTBfSVJRIH0sCisJLyogQV9JUlFbMC0zXSAtPiBJUlExICgzMykgKi8KKwl7IElSUTFfSVJRLCBJUlExX0lQUl9BRERSLCBJUlExX0lQUl9QT1MsIDB4MGYgLSBJUlExX0lSUSB9LAorCXsgU0lPRjBfSVJRLCBTSU9GMF9JUFJfQUREUiwgU0lPRjBfSVBSX1BPUywgU0lPRjBfUFJJT1JJVFkgfSwKKwl7IERNVEUyX0lSUSwgRE1BMV9JUFJfQUREUiwgRE1BMV9JUFJfUE9TLCBETUExX1BSSU9SSVRZIH0sCisJeyBETVRFM19JUlEsIERNQTFfSVBSX0FERFIsIERNQTFfSVBSX1BPUywgRE1BMV9QUklPUklUWSB9LAorCXsgVklPX0lSUSwgVklPX0lQUl9BRERSLCBWSU9fSVBSX1BPUywgVklPX1BSSU9SSVRZIH0sCit9OworCiAvKgogICogSW5pdGlhbGl6ZSBJUlEgc2V0dGluZwogICovCkBAIC0yMywxNCArMzQsNyBAQAogCWN0cmxfb3V0dygweGEwMDAsIElOVENfSUNSMSk7CSAgICAgICAgLyogSVJRIG1vZGU7IElSUTAsMSBlbmFibGUuICAgICovCiAJY3RybF9vdXR3KDB4MDAwMCwgUE9SVF9QRkNSKTsJICAgICAgICAvKiB1c2UgRiBmb3IgSVJRWzM6MF0gYW5kIFNJVS4gKi8KIAotCS8qIFBDX0lSUVswLTNdIC0+IElSUTAgKDMyKSAqLwotCW1ha2VfaXByX2lycShJUlEwX0lSUSwgSVJRMF9JUFJfQUREUiwgSVJRMF9JUFJfUE9TLCAweDBmIC0gSVJRMF9JUlEpOwotCS8qIEFfSVJRWzAtM10gLT4gSVJRMSAoMzMpICovCi0JbWFrZV9pcHJfaXJxKElSUTFfSVJRLCBJUlExX0lQUl9BRERSLCBJUlExX0lQUl9QT1MsIDB4MGYgLSBJUlExX0lSUSk7Ci0JbWFrZV9pcHJfaXJxKFNJT0YwX0lSUSwgU0lPRjBfSVBSX0FERFIsIFNJT0YwX0lQUl9QT1MsIFNJT0YwX1BSSU9SSVRZKTsKLQltYWtlX2lwcl9pcnEoRE1URTJfSVJRLCBETUExX0lQUl9BRERSLCBETUExX0lQUl9QT1MsIERNQTFfUFJJT1JJVFkpOwotCW1ha2VfaXByX2lycShETVRFM19JUlEsIERNQTFfSVBSX0FERFIsIERNQTFfSVBSX1BPUywgRE1BMV9QUklPUklUWSk7Ci0JbWFrZV9pcHJfaXJxKFZJT19JUlEsIFZJT19JUFJfQUREUiwgVklPX0lQUl9QT1MsIFZJT19QUklPUklUWSk7CisJbWFrZV9pcHJfaXJxKHNlNzMwMF9pcHJfbWFwLCBBUlJBWV9TSVpFKHNlNzMwMF9pcHJfbWFwKSk7CiAKIAljdHJsX291dHcoMHgyMDAwLCBQQV9NUlNIUEMgKyAweDBjKTsJLyogbXJzaHBjIGlycSBlbmFibGUgKi8KIH0KZGlmZiAtLWdpdCBhL2FyY2gvc2gvYm9hcmRzL3NlLzczMTgwL2lycS5jIGIvYXJjaC9zaC9ib2FyZHMvc2UvNzMxODAvaXJxLmMKaW5kZXggMmM2MmI4ZS4uZTcyMDBjNSAxMDA2NDQKLS0tIGEvYXJjaC9zaC9ib2FyZHMvc2UvNzMxODAvaXJxLmMKKysrIGIvYXJjaC9zaC9ib2FyZHMvc2UvNzMxODAvaXJxLmMKQEAgLTg3LDEzICs4NywzOCBAQAogCXJldHVybiBpcnE7CiB9CiAKK3N0YXRpYyBzdHJ1Y3QgaXByX2RhdGEgc2U3MzE4MF9zaW9mMF9pcHJfbWFwW10gPSB7CisJeyBTSU9GMF9JUlEsIFNJT0YwX0lQUl9BRERSLCBTSU9GMF9JUFJfUE9TLCBTSU9GMF9QUklPUklUWSB9LAorfTsKK3N0YXRpYyBzdHJ1Y3QgaXByX2RhdGEgc2U3MzE4MF92cHVfaXByX21hcFtdID0geworCXsgVlBVX0lSUSwgVlBVX0lQUl9BRERSLCBWUFVfSVBSX1BPUywgOCB9LAorfTsKK3N0YXRpYyBzdHJ1Y3QgaXByX2RhdGEgc2U3MzE4MF9vdGhlcl9pcHJfbWFwW10gPSB7CisJeyBETVRFMl9JUlEsIERNQTFfSVBSX0FERFIsIERNQTFfSVBSX1BPUywgRE1BMV9QUklPUklUWSB9LAorCXsgRE1URTNfSVJRLCBETUExX0lQUl9BRERSLCBETUExX0lQUl9QT1MsIERNQTFfUFJJT1JJVFkgfSwKKwl7IERNVEU0X0lSUSwgRE1BMl9JUFJfQUREUiwgRE1BMl9JUFJfUE9TLCBETUEyX1BSSU9SSVRZIH0sCisJeyBJSUMwX0FMSV9JUlEsIElJQzBfSVBSX0FERFIsIElJQzBfSVBSX1BPUywgSUlDMF9QUklPUklUWSB9LAorCXsgSUlDMF9UQUNLSV9JUlEsIElJQzBfSVBSX0FERFIsIElJQzBfSVBSX1BPUywgSUlDMF9QUklPUklUWSB9LAorCXsgSUlDMF9XQUlUSV9JUlEsIElJQzBfSVBSX0FERFIsIElJQzBfSVBSX1BPUywgSUlDMF9QUklPUklUWSB9LAorCXsgSUlDMF9EVEVJX0lSUSwgSUlDMF9JUFJfQUREUiwgSUlDMF9JUFJfUE9TLCBJSUMwX1BSSU9SSVRZIH0sCisJeyBTSU9GMF9JUlEsIFNJT0YwX0lQUl9BRERSLCBTSU9GMF9JUFJfUE9TLCBTSU9GMF9QUklPUklUWSB9LAorCXsgU0lVX0lSUSwgU0lVX0lQUl9BRERSLCBTSVVfSVBSX1BPUywgU0lVX1BSSU9SSVRZIH0sCisKKwkvKiBWSU8gaW50ZXJydXB0ICovCisJeyBDRVVfSVJRLCBWSU9fSVBSX0FERFIsIFZJT19JUFJfUE9TLCBWSU9fUFJJT1JJVFkgfSwKKwl7IEJFVV9JUlEsIFZJT19JUFJfQUREUiwgVklPX0lQUl9QT1MsIFZJT19QUklPUklUWSB9LAorCXsgVkVVX0lSUSwgVklPX0lQUl9BRERSLCBWSU9fSVBSX1BPUywgVklPX1BSSU9SSVRZIH0sCisKKwl7IExDRENfSVJRLCBMQ0RDX0lQUl9BRERSLCBMQ0RDX0lQUl9QT1MsIExDRENfUFJJT1JJVFkgfSwKK307CisKIC8qCiAgKiBJbml0aWFsaXplIElSUSBzZXR0aW5nCiAgKi8KIHZvaWQgX19pbml0CiBpbml0XzczMTgwc2VfSVJRKHZvaWQpCiB7Ci0JbWFrZV9pcHJfaXJxKFNJT0YwX0lSUSwgU0lPRjBfSVBSX0FERFIsIFNJT0YwX0lQUl9QT1MsIFNJT0YwX1BSSU9SSVRZKTsKKwltYWtlX2lwcl9pcnEoc2U3MzE4MF9zaW9mMF9pcHJfbWFwLCBBUlJBWV9TSVpFKHNlNzMxODBfc2lvZjBfaXByX21hcCkpOwogCiAJY3RybF9vdXR3KDB4MjAwMCwgMHhiMDNmZmZlYyk7CS8qIG1yc2hwYyBpcnEgZW5hYmxlICovCiAJY3RybF9vdXR3KDB4MjAwMCwgMHhiMDdmZmZlYyk7CS8qIG1yc2hwYyBpcnEgZW5hYmxlICovCkBAIC0xMDEsMjcgKzEyNiwxMSBAQAogCWN0cmxfb3V0dygyIDw8ICgoNyAtIDUpICogMiksIElOVENfSUNSMSk7CS8qIGxvdy1sZXZlbCBpcnEgKi8KIAltYWtlX2ludHJlcV9pcnEoMTApOwogCi0JbWFrZV9pcHJfaXJxKFZQVV9JUlEsIFZQVV9JUFJfQUREUiwgVlBVX0lQUl9QT1MsIDgpOworCW1ha2VfaXByX2lycShzZTczMTgwX3ZwdV9pcHJfbWFwLCBBUlJBWV9TSVpFKHNlNzMxODBfdnB1X2lwcl9tYXApKTsKIAogCWN0cmxfb3V0YigweDBmLCBJTlRDX0lNQ1I1KTsJLyogZW5hYmxlIFNDSUYgSVJRICovCiAKLQltYWtlX2lwcl9pcnEoRE1URTJfSVJRLCBETUExX0lQUl9BRERSLCBETUExX0lQUl9QT1MsIERNQTFfUFJJT1JJVFkpOwotCW1ha2VfaXByX2lycShETVRFM19JUlEsIERNQTFfSVBSX0FERFIsIERNQTFfSVBSX1BPUywgRE1BMV9QUklPUklUWSk7Ci0JbWFrZV9pcHJfaXJxKERNVEU0X0lSUSwgRE1BMl9JUFJfQUREUiwgRE1BMl9JUFJfUE9TLCBETUEyX1BSSU9SSVRZKTsKLQltYWtlX2lwcl9pcnEoSUlDMF9BTElfSVJRLCBJSUMwX0lQUl9BRERSLCBJSUMwX0lQUl9QT1MsIElJQzBfUFJJT1JJVFkpOwotCW1ha2VfaXByX2lycShJSUMwX1RBQ0tJX0lSUSwgSUlDMF9JUFJfQUREUiwgSUlDMF9JUFJfUE9TLAotCQkgICAgIElJQzBfUFJJT1JJVFkpOwotCW1ha2VfaXByX2lycShJSUMwX1dBSVRJX0lSUSwgSUlDMF9JUFJfQUREUiwgSUlDMF9JUFJfUE9TLAotCQkgICAgIElJQzBfUFJJT1JJVFkpOwotCW1ha2VfaXByX2lycShJSUMwX0RURUlfSVJRLCBJSUMwX0lQUl9BRERSLCBJSUMwX0lQUl9QT1MsIElJQzBfUFJJT1JJVFkpOwotCW1ha2VfaXByX2lycShTSU9GMF9JUlEsIFNJT0YwX0lQUl9BRERSLCBTSU9GMF9JUFJfUE9TLCBTSU9GMF9QUklPUklUWSk7Ci0JbWFrZV9pcHJfaXJxKFNJVV9JUlEsIFNJVV9JUFJfQUREUiwgU0lVX0lQUl9QT1MsIFNJVV9QUklPUklUWSk7CisJbWFrZV9pcHJfaXJxKHNlNzMxODBfb3RoZXJfaXByX21hcCwgQVJSQVlfU0laRShzZTczMTgwX290aGVyX2lwcl9tYXApKTsKIAotCS8qIFZJTyBpbnRlcnJ1cHQgKi8KLQltYWtlX2lwcl9pcnEoQ0VVX0lSUSwgVklPX0lQUl9BRERSLCBWSU9fSVBSX1BPUywgVklPX1BSSU9SSVRZKTsKLQltYWtlX2lwcl9pcnEoQkVVX0lSUSwgVklPX0lQUl9BRERSLCBWSU9fSVBSX1BPUywgVklPX1BSSU9SSVRZKTsKLQltYWtlX2lwcl9pcnEoVkVVX0lSUSwgVklPX0lQUl9BRERSLCBWSU9fSVBSX1BPUywgVklPX1BSSU9SSVRZKTsKLQotCW1ha2VfaXByX2lycShMQ0RDX0lSUSwgTENEQ19JUFJfQUREUiwgTENEQ19JUFJfUE9TLCBMQ0RDX1BSSU9SSVRZKTsKIAljdHJsX291dHcoMHgyMDAwLCBQQV9NUlNIUEMgKyAweDBjKTsJLyogbXJzaHBjIGlycSBlbmFibGUgKi8KIH0KZGlmZiAtLWdpdCBhL2FyY2gvc2gvYm9hcmRzL3NlLzczNDMvaXJxLmMgYi9hcmNoL3NoL2JvYXJkcy9zZS83MzQzL2lycS5jCmluZGV4IDI4OGI2MmYuLjM2MDE1M2UgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gvYm9hcmRzL3NlLzczNDMvaXJxLmMKKysrIGIvYXJjaC9zaC9ib2FyZHMvc2UvNzM0My9pcnEuYwpAQCAtMTAyLDYgKzEwMiw1MSBAQAogc3RhdGljIHN0cnVjdCBpcnFhY3Rpb24gaXJxNSA9IHsgbm9fYWN0aW9uLCAwLCBDUFVfTUFTS19OT05FLCAiSVJRNS1jYXNjYWRlIiwKIAkJCQlOVUxMLCBOVUxMfTsKIAorc3RhdGljIHN0cnVjdCBpcHJfZGF0YSBzZTczNDNfaXJxNV9pcHJfbWFwW10gPSB7CisJeyBJUlE1X0lSUSwgSVJRNV9JUFJfQUREUisyLCBJUlE1X0lQUl9QT1MsIElSUTVfUFJJT1JJVFkgfSwKK307CitzdGF0aWMgc3RydWN0IGlwcl9kYXRhIHNlNzM0M19zaW9mMF92cHVfaXByX21hcFtdID0geworCXsgU0lPRjBfSVJRLCBTSU9GMF9JUFJfQUREUiwgU0lPRjBfSVBSX1BPUywgU0lPRjBfUFJJT1JJVFkgfSwKKwl7IFZQVV9JUlEsIFZQVV9JUFJfQUREUiwgVlBVX0lQUl9QT1MsIDggfSwKK307CitzdGF0aWMgc3RydWN0IGlwcl9kYXRhIHNlNzM0M19vdGhlcl9pcHJfbWFwW10gPSB7CisJeyBETVRFMF9JUlEsIERNQTFfSVBSX0FERFIsIERNQTFfSVBSX1BPUywgRE1BMV9QUklPUklUWSB9LAorCXsgRE1URTFfSVJRLCBETUExX0lQUl9BRERSLCBETUExX0lQUl9QT1MsIERNQTFfUFJJT1JJVFkgfSwKKwl7IERNVEUyX0lSUSwgRE1BMV9JUFJfQUREUiwgRE1BMV9JUFJfUE9TLCBETUExX1BSSU9SSVRZIH0sCisJeyBETVRFM19JUlEsIERNQTFfSVBSX0FERFIsIERNQTFfSVBSX1BPUywgRE1BMV9QUklPUklUWSB9LAorCXsgRE1URTRfSVJRLCBETUEyX0lQUl9BRERSLCBETUEyX0lQUl9QT1MsIERNQTJfUFJJT1JJVFkgfSwKKwl7IERNVEU1X0lSUSwgRE1BMl9JUFJfQUREUiwgRE1BMl9JUFJfUE9TLCBETUEyX1BSSU9SSVRZIH0sCisKKwkvKiBJMkMgYmxvY2sgKi8KKwl7IElJQzBfQUxJX0lSUSwgSUlDMF9JUFJfQUREUiwgSUlDMF9JUFJfUE9TLCBJSUMwX1BSSU9SSVRZIH0sCisJeyBJSUMwX1RBQ0tJX0lSUSwgSUlDMF9JUFJfQUREUiwgSUlDMF9JUFJfUE9TLCBJSUMwX1BSSU9SSVRZIH0sCisJeyBJSUMwX1dBSVRJX0lSUSwgSUlDMF9JUFJfQUREUiwgSUlDMF9JUFJfUE9TLCBJSUMwX1BSSU9SSVRZIH0sCisJeyBJSUMwX0RURUlfSVJRLCBJSUMwX0lQUl9BRERSLCBJSUMwX0lQUl9QT1MsIElJQzBfUFJJT1JJVFkgfSwKKworCXsgSUlDMV9BTElfSVJRLCBJSUMxX0lQUl9BRERSLCBJSUMxX0lQUl9QT1MsIElJQzFfUFJJT1JJVFkgfSwKKwl7IElJQzFfVEFDS0lfSVJRLCBJSUMxX0lQUl9BRERSLCBJSUMxX0lQUl9QT1MsIElJQzFfUFJJT1JJVFkgfSwKKwl7IElJQzFfV0FJVElfSVJRLCBJSUMxX0lQUl9BRERSLCBJSUMxX0lQUl9QT1MsIElJQzFfUFJJT1JJVFkgfSwKKwl7IElJQzFfRFRFSV9JUlEsIElJQzFfSVBSX0FERFIsIElJQzFfSVBSX1BPUywgSUlDMV9QUklPUklUWSB9LAorCisJLyogU0lPRiAqLworCXsgU0lPRjBfSVJRLCBTSU9GMF9JUFJfQUREUiwgU0lPRjBfSVBSX1BPUywgU0lPRjBfUFJJT1JJVFkgfSwKKworCS8qIFNJVSAqLworCXsgU0lVX0lSUSwgU0lVX0lQUl9BRERSLCBTSVVfSVBSX1BPUywgU0lVX1BSSU9SSVRZIH0sCisKKwkvKiBWSU8gaW50ZXJydXB0ICovCisJeyBDRVVfSVJRLCBWSU9fSVBSX0FERFIsIFZJT19JUFJfUE9TLCBWSU9fUFJJT1JJVFkgfSwKKwl7IEJFVV9JUlEsIFZJT19JUFJfQUREUiwgVklPX0lQUl9QT1MsIFZJT19QUklPUklUWSB9LAorCXsgVkVVX0lSUSwgVklPX0lQUl9BRERSLCBWSU9fSVBSX1BPUywgVklPX1BSSU9SSVRZIH0sCisKKwkvKk1GSSBpbnRlcnJ1cHQqLworCisJeyBNRklfSVJRLCBNRklfSVBSX0FERFIsIE1GSV9JUFJfUE9TLCBNRklfUFJJT1JJVFkgfSwKKworCS8qIExDRCBjb250cm9sbGVyICovCisJeyBMQ0RDX0lSUSwgTENEQ19JUFJfQUREUiwgTENEQ19JUFJfUE9TLCBMQ0RDX1BSSU9SSVRZIH0sCit9OworCiAvKgogICogSW5pdGlhbGl6ZSBJUlEgc2V0dGluZwogICovCkBAIC0xMzgsNTQgKzE4MywxNyBAQAogCS8qIFNldHVwIGFsbCBleHRlcm5hbCBpbnRlcnJ1cHRzIHRvIGJlIGFjdGl2ZSBsb3cgKi8KIAljdHJsX291dHcoMHhhYWFhLCBJTlRDX0lDUjEpOwogCi0JbWFrZV9pcHJfaXJxKElSUTVfSVJRLCBJUlE1X0lQUl9BRERSKzIsIElSUTVfSVBSX1BPUywgSVJRNV9QUklPUklUWSk7CisJbWFrZV9pcHJfaXJxKHNlNzM0M19pcnE1X2lwcl9tYXAsIEFSUkFZX1NJWkUoc2U3MzQzX2lycTVfaXByX21hcCkpOworCiAJc2V0dXBfaXJxKElSUTVfSVJRLCAmaXJxNSk7CiAJLyogU2V0IHBvcnQgY29udHJvbCB0byB1c2UgSVJRNSAqLwogCSoodTE2ICopMHhBNDA1MDEwOCAmPSB+MHhjOwogCi0JbWFrZV9pcHJfaXJxKFNJT0YwX0lSUSwgU0lPRjBfSVBSX0FERFIsIFNJT0YwX0lQUl9QT1MsIFNJT0YwX1BSSU9SSVRZKTsKLQltYWtlX2lwcl9pcnEoVlBVX0lSUSwgVlBVX0lQUl9BRERSLCBWUFVfSVBSX1BPUywgOCk7CisJbWFrZV9pcHJfaXJxKHNlNzM0M19zaW9mMF92cHVfaXByX21hcCwgQVJSQVlfU0laRShzZTczNDNfc2lvZjBfdnB1X2lwcl9tYXApKTsKIAogCWN0cmxfb3V0YigweDBmLCBJTlRDX0lNQ1I1KTsJLyogZW5hYmxlIFNDSUYgSVJRICovCiAKLQltYWtlX2lwcl9pcnEoRE1URTBfSVJRLCBETUExX0lQUl9BRERSLCBETUExX0lQUl9QT1MsIERNQTFfUFJJT1JJVFkpOwotCW1ha2VfaXByX2lycShETVRFMV9JUlEsIERNQTFfSVBSX0FERFIsIERNQTFfSVBSX1BPUywgRE1BMV9QUklPUklUWSk7Ci0JbWFrZV9pcHJfaXJxKERNVEUyX0lSUSwgRE1BMV9JUFJfQUREUiwgRE1BMV9JUFJfUE9TLCBETUExX1BSSU9SSVRZKTsKLQltYWtlX2lwcl9pcnEoRE1URTNfSVJRLCBETUExX0lQUl9BRERSLCBETUExX0lQUl9QT1MsIERNQTFfUFJJT1JJVFkpOwotCW1ha2VfaXByX2lycShETVRFNF9JUlEsIERNQTJfSVBSX0FERFIsIERNQTJfSVBSX1BPUywgRE1BMl9QUklPUklUWSk7Ci0JbWFrZV9pcHJfaXJxKERNVEU1X0lSUSwgRE1BMl9JUFJfQUREUiwgRE1BMl9JUFJfUE9TLCBETUEyX1BSSU9SSVRZKTsKKwltYWtlX2lwcl9pcnEoc2U3MzQzX290aGVyX2lwcl9tYXAsIEFSUkFZX1NJWkUoc2U3MzQzX290aGVyX2lwcl9tYXApKTsKIAotCS8qIEkyQyBibG9jayAqLwotCW1ha2VfaXByX2lycShJSUMwX0FMSV9JUlEsIElJQzBfSVBSX0FERFIsIElJQzBfSVBSX1BPUywgSUlDMF9QUklPUklUWSk7Ci0JbWFrZV9pcHJfaXJxKElJQzBfVEFDS0lfSVJRLCBJSUMwX0lQUl9BRERSLCBJSUMwX0lQUl9QT1MsCi0JCSAgICAgSUlDMF9QUklPUklUWSk7Ci0JbWFrZV9pcHJfaXJxKElJQzBfV0FJVElfSVJRLCBJSUMwX0lQUl9BRERSLCBJSUMwX0lQUl9QT1MsCi0JCSAgICAgSUlDMF9QUklPUklUWSk7Ci0JbWFrZV9pcHJfaXJxKElJQzBfRFRFSV9JUlEsIElJQzBfSVBSX0FERFIsIElJQzBfSVBSX1BPUywgSUlDMF9QUklPUklUWSk7Ci0KLQltYWtlX2lwcl9pcnEoSUlDMV9BTElfSVJRLCBJSUMxX0lQUl9BRERSLCBJSUMxX0lQUl9QT1MsIElJQzFfUFJJT1JJVFkpOwotCW1ha2VfaXByX2lycShJSUMxX1RBQ0tJX0lSUSwgSUlDMV9JUFJfQUREUiwgSUlDMV9JUFJfUE9TLAotCQkgICAgIElJQzFfUFJJT1JJVFkpOwotCW1ha2VfaXByX2lycShJSUMxX1dBSVRJX0lSUSwgSUlDMV9JUFJfQUREUiwgSUlDMV9JUFJfUE9TLAotCQkgICAgIElJQzFfUFJJT1JJVFkpOwotCW1ha2VfaXByX2lycShJSUMxX0RURUlfSVJRLCBJSUMxX0lQUl9BRERSLCBJSUMxX0lQUl9QT1MsIElJQzFfUFJJT1JJVFkpOwotCi0JLyogU0lPRiAqLwotCW1ha2VfaXByX2lycShTSU9GMF9JUlEsIFNJT0YwX0lQUl9BRERSLCBTSU9GMF9JUFJfUE9TLCBTSU9GMF9QUklPUklUWSk7Ci0KLQkvKiBTSVUgKi8KLQltYWtlX2lwcl9pcnEoU0lVX0lSUSwgU0lVX0lQUl9BRERSLCBTSVVfSVBSX1BPUywgU0lVX1BSSU9SSVRZKTsKLQotCS8qIFZJTyBpbnRlcnJ1cHQgKi8KLQltYWtlX2lwcl9pcnEoQ0VVX0lSUSwgVklPX0lQUl9BRERSLCBWSU9fSVBSX1BPUywgVklPX1BSSU9SSVRZKTsKLQltYWtlX2lwcl9pcnEoQkVVX0lSUSwgVklPX0lQUl9BRERSLCBWSU9fSVBSX1BPUywgVklPX1BSSU9SSVRZKTsKLQltYWtlX2lwcl9pcnEoVkVVX0lSUSwgVklPX0lQUl9BRERSLCBWSU9fSVBSX1BPUywgVklPX1BSSU9SSVRZKTsKLQotCS8qTUZJIGludGVycnVwdCovCi0KLQltYWtlX2lwcl9pcnEoTUZJX0lSUSwgTUZJX0lQUl9BRERSLCBNRklfSVBSX1BPUywgTUZJX1BSSU9SSVRZKTsKLQotCS8qIExDRCBjb250cm9sbGVyICovCi0JbWFrZV9pcHJfaXJxKExDRENfSVJRLCBMQ0RDX0lQUl9BRERSLCBMQ0RDX0lQUl9QT1MsIExDRENfUFJJT1JJVFkpOwogCWN0cmxfb3V0dygweDIwMDAsIFBBX01SU0hQQyArIDB4MGMpOwkvKiBtcnNocGMgaXJxIGVuYWJsZSAqLwogfQpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9ib2FyZHMvc2UvNzcweC9pcnEuYyBiL2FyY2gvc2gvYm9hcmRzL3NlLzc3MHgvaXJxLmMKaW5kZXggY2ZmNjcwMC4uZmNkN2NkNyAxMDA2NDQKLS0tIGEvYXJjaC9zaC9ib2FyZHMvc2UvNzcweC9pcnEuYworKysgYi9hcmNoL3NoL2JvYXJkcy9zZS83NzB4L2lycS5jCkBAIC0xMyw2ICsxMyw0OCBAQAogI2luY2x1ZGUgPGFzbS9pby5oPgogI2luY2x1ZGUgPGFzbS9zZS5oPgogCitzdGF0aWMgc3RydWN0IGlwcl9kYXRhIHNlNzcweF9pcHJfbWFwW10gPSB7CisjaWYgZGVmaW5lZChDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzA1KQorCS8qIFRoaXMgaXMgZGVmYXVsdCB2YWx1ZSAqLworCXsgMHhmLTB4MiwgQkNSX0lMQ1JBLCAyLCAweDIgfSwKKwl7IDB4Zi0weGEsIEJDUl9JTENSQSwgMSwgMHhhIH0sCisJeyAweGYtMHg1LCBCQ1JfSUxDUkIsIDAsIDB4NSB9LAorCXsgMHhmLTB4OCwgQkNSX0lMQ1JDLCAxLCAweDggfSwKKwl7IDB4Zi0weGMsIEJDUl9JTENSQywgMCwgMHhjIH0sCisJeyAweGYtMHhlLCBCQ1JfSUxDUkQsIDMsIDB4ZSB9LAorCXsgMHhmLTB4MywgQkNSX0lMQ1JELCAxLCAweDMgfSwgLyogTEFOICovCisJeyAweGYtMHhkLCBCQ1JfSUxDUkUsIDIsIDB4ZCB9LAorCXsgMHhmLTB4OSwgQkNSX0lMQ1JFLCAxLCAweDkgfSwKKwl7IDB4Zi0weDEsIEJDUl9JTENSRSwgMCwgMHgxIH0sCisJeyAweGYtMHhmLCBCQ1JfSUxDUkYsIDMsIDB4ZiB9LAorCXsgMHhmLTB4YiwgQkNSX0lMQ1JGLCAxLCAweGIgfSwKKwl7IDB4Zi0weDcsIEJDUl9JTENSRywgMywgMHg3IH0sCisJeyAweGYtMHg2LCBCQ1JfSUxDUkcsIDIsIDB4NiB9LAorCXsgMHhmLTB4NCwgQkNSX0lMQ1JHLCAxLCAweDQgfSwKKyNlbHNlCisJeyAxNCwgQkNSX0lMQ1JBLCAyLCAweDBmLTE0IH0sCisJeyAxMiwgQkNSX0lMQ1JBLCAxLCAweDBmLTEyIH0sCisJeyAgOCwgQkNSX0lMQ1JCLCAxLCAweDBmLSA4IH0sCisJeyAgNiwgQkNSX0lMQ1JDLCAzLCAweDBmLSA2IH0sCisJeyAgNSwgQkNSX0lMQ1JDLCAyLCAweDBmLSA1IH0sCisJeyAgNCwgQkNSX0lMQ1JDLCAxLCAweDBmLSA0IH0sCisJeyAgMywgQkNSX0lMQ1JDLCAwLCAweDBmLSAzIH0sCisJeyAgMSwgQkNSX0lMQ1JELCAzLCAweDBmLSAxIH0sCisKKwl7IDEwLCBCQ1JfSUxDUkQsIDEsIDB4MGYtMTAgfSwgLyogTEFOICovCisKKwl7ICAwLCBCQ1JfSUxDUkUsIDMsIDB4MGYtIDAgfSwgLyogUENJUlEzICovCisJeyAxMSwgQkNSX0lMQ1JFLCAyLCAweDBmLTExIH0sIC8qIFBDSVJRMiAqLworCXsgIDksIEJDUl9JTENSRSwgMSwgMHgwZi0gOSB9LCAvKiBQQ0lSUTEgKi8KKwl7ICA3LCBCQ1JfSUxDUkUsIDAsIDB4MGYtIDcgfSwgLyogUENJUlEwICovCisKKwkvKiAjMiwgIzEzIGFyZSBhbGxvY2F0ZWQgZm9yIFNMT1QgSVJRICMxIGFuZCAjMiAoZm9yIG5vdykgKi8KKwkvKiBOT1RFOiAjMiBhbmQgIzEzIGFyZSBub3QgdXNlZCBvbiBQQyAqLworCXsgMTMsIEJDUl9JTENSRywgMSwgMHgwZi0xMyB9LCAvKiBTTE9USVJRMiAqLworCXsgIDIsIEJDUl9JTENSRywgMCwgMHgwZi0gMiB9LCAvKiBTTE9USVJRMSAqLworI2VuZGlmCit9OworCiAvKgogICogSW5pdGlhbGl6ZSBJUlEgc2V0dGluZwogICovCkBAIC0zOCw0MiArODAsNiBAQAogCWN0cmxfb3V0dygwLCBCQ1JfSUxDUkUpOwogCWN0cmxfb3V0dygwLCBCQ1JfSUxDUkYpOwogCWN0cmxfb3V0dygwLCBCQ1JfSUxDUkcpOwotCS8qIFRoaXMgaXMgZGVmYXVsdCB2YWx1ZSAqLwotCW1ha2VfaXByX2lycSgweGYtMHgyLCBCQ1JfSUxDUkEsIDIsIDB4Mik7Ci0JbWFrZV9pcHJfaXJxKDB4Zi0weGEsIEJDUl9JTENSQSwgMSwgMHhhKTsKLQltYWtlX2lwcl9pcnEoMHhmLTB4NSwgQkNSX0lMQ1JCLCAwLCAweDUpOwotCW1ha2VfaXByX2lycSgweGYtMHg4LCBCQ1JfSUxDUkMsIDEsIDB4OCk7Ci0JbWFrZV9pcHJfaXJxKDB4Zi0weGMsIEJDUl9JTENSQywgMCwgMHhjKTsKLQltYWtlX2lwcl9pcnEoMHhmLTB4ZSwgQkNSX0lMQ1JELCAzLCAweGUpOwotCW1ha2VfaXByX2lycSgweGYtMHgzLCBCQ1JfSUxDUkQsIDEsIDB4Myk7IC8qIExBTiAqLwotCW1ha2VfaXByX2lycSgweGYtMHhkLCBCQ1JfSUxDUkUsIDIsIDB4ZCk7Ci0JbWFrZV9pcHJfaXJxKDB4Zi0weDksIEJDUl9JTENSRSwgMSwgMHg5KTsKLQltYWtlX2lwcl9pcnEoMHhmLTB4MSwgQkNSX0lMQ1JFLCAwLCAweDEpOwotCW1ha2VfaXByX2lycSgweGYtMHhmLCBCQ1JfSUxDUkYsIDMsIDB4Zik7Ci0JbWFrZV9pcHJfaXJxKDB4Zi0weGIsIEJDUl9JTENSRiwgMSwgMHhiKTsKLQltYWtlX2lwcl9pcnEoMHhmLTB4NywgQkNSX0lMQ1JHLCAzLCAweDcpOwotCW1ha2VfaXByX2lycSgweGYtMHg2LCBCQ1JfSUxDUkcsIDIsIDB4Nik7Ci0JbWFrZV9pcHJfaXJxKDB4Zi0weDQsIEJDUl9JTENSRywgMSwgMHg0KTsKLSNlbHNlCi0gICAgICAgIG1ha2VfaXByX2lycSgxNCwgQkNSX0lMQ1JBLCAyLCAweDBmLTE0KTsKLSAgICAgICAgbWFrZV9pcHJfaXJxKDEyLCBCQ1JfSUxDUkEsIDEsIDB4MGYtMTIpOwotICAgICAgICBtYWtlX2lwcl9pcnEoIDgsIEJDUl9JTENSQiwgMSwgMHgwZi0gOCk7Ci0gICAgICAgIG1ha2VfaXByX2lycSggNiwgQkNSX0lMQ1JDLCAzLCAweDBmLSA2KTsKLSAgICAgICAgbWFrZV9pcHJfaXJxKCA1LCBCQ1JfSUxDUkMsIDIsIDB4MGYtIDUpOwotICAgICAgICBtYWtlX2lwcl9pcnEoIDQsIEJDUl9JTENSQywgMSwgMHgwZi0gNCk7Ci0gICAgICAgIG1ha2VfaXByX2lycSggMywgQkNSX0lMQ1JDLCAwLCAweDBmLSAzKTsKLSAgICAgICAgbWFrZV9pcHJfaXJxKCAxLCBCQ1JfSUxDUkQsIDMsIDB4MGYtIDEpOwotCi0gICAgICAgIG1ha2VfaXByX2lycSgxMCwgQkNSX0lMQ1JELCAxLCAweDBmLTEwKTsgLyogTEFOICovCi0KLSAgICAgICAgbWFrZV9pcHJfaXJxKCAwLCBCQ1JfSUxDUkUsIDMsIDB4MGYtIDApOyAvKiBQQ0lSUTMgKi8KLSAgICAgICAgbWFrZV9pcHJfaXJxKDExLCBCQ1JfSUxDUkUsIDIsIDB4MGYtMTEpOyAvKiBQQ0lSUTIgKi8KLSAgICAgICAgbWFrZV9pcHJfaXJxKCA5LCBCQ1JfSUxDUkUsIDEsIDB4MGYtIDkpOyAvKiBQQ0lSUTEgKi8KLSAgICAgICAgbWFrZV9pcHJfaXJxKCA3LCBCQ1JfSUxDUkUsIDAsIDB4MGYtIDcpOyAvKiBQQ0lSUTAgKi8KLQotICAgICAgICAvKiAjMiwgIzEzIGFyZSBhbGxvY2F0ZWQgZm9yIFNMT1QgSVJRICMxIGFuZCAjMiAoZm9yIG5vdykgKi8KLSAgICAgICAgLyogTk9URTogIzIgYW5kICMxMyBhcmUgbm90IHVzZWQgb24gUEMgKi8KLSAgICAgICAgbWFrZV9pcHJfaXJxKDEzLCBCQ1JfSUxDUkcsIDEsIDB4MGYtMTMpOyAvKiBTTE9USVJRMiAqLwotICAgICAgICBtYWtlX2lwcl9pcnEoIDIsIEJDUl9JTENSRywgMCwgMHgwZi0gMik7IC8qIFNMT1RJUlExICovCiAjZW5kaWYKKwltYWtlX2lwcl9pcnEoc2U3NzB4X2lwcl9tYXAsIEFSUkFZX1NJWkUoc2U3NzB4X2lwcl9tYXApKTsKIH0KZGlmZiAtLWdpdCBhL2FyY2gvc2gvYm9hcmRzL3NlLzc3NTEvaXJxLmMgYi9hcmNoL3NoL2JvYXJkcy9zZS83NzUxL2lycS5jCmluZGV4IGM2MDdiMGEuLmU0YzYzYTQgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gvYm9hcmRzL3NlLzc3NTEvaXJxLmMKKysrIGIvYXJjaC9zaC9ib2FyZHMvc2UvNzc1MS9pcnEuYwpAQCAtMTQsNTMgKzE0LDUwIEBACiAjaW5jbHVkZSA8YXNtL2lycS5oPgogI2luY2x1ZGUgPGFzbS9zZTc3NTEuaD4KIAorc3RhdGljIHN0cnVjdCBpcHJfZGF0YSBzZTc3NTFfaXByX21hcFtdID0geworICAvKiBMZWF2ZSBvbGQgU29sdXRpb24gRW5naW5lIGNvZGUgaW4gZm9yIHJlZmVyZW5jZS4gKi8KKyNpZiBkZWZpbmVkKENPTkZJR19TSF9TT0xVVElPTl9FTkdJTkUpCisJLyoKKwkgKiBTdXBlciBJL08gKEp1c3QgbWltaWMgUEMpOgorCSAqICAxOiBrZXlib2FyZAorCSAqICAzOiBzZXJpYWwgMAorCSAqICA0OiBzZXJpYWwgMQorCSAqICA1OiBwcmludGVyCisJICogIDY6IGZsb3BweQorCSAqICA4OiBydGMKKwkgKiAxMjogbW91c2UKKwkgKiAxNDogaWRlMAorCSAqLworCXsgMTQsIEJDUl9JTENSQSwgMiwgMHgwZi0xNCB9LAorCXsgMTIsIEJDUl9JTENSQSwgMSwgMHgwZi0xMiB9LAorCXsgIDgsIEJDUl9JTENSQiwgMSwgMHgwZi0gOCB9LAorCXsgIDYsIEJDUl9JTENSQywgMywgMHgwZi0gNiB9LAorCXsgIDUsIEJDUl9JTENSQywgMiwgMHgwZi0gNSB9LAorCXsgIDQsIEJDUl9JTENSQywgMSwgMHgwZi0gNCB9LAorCXsgIDMsIEJDUl9JTENSQywgMCwgMHgwZi0gMyB9LAorCXsgIDEsIEJDUl9JTENSRCwgMywgMHgwZi0gMSB9LAorCisJeyAxMCwgQkNSX0lMQ1JELCAxLCAweDBmLTEwIH0sIC8qIExBTiAqLworCisJeyAgMCwgQkNSX0lMQ1JFLCAzLCAweDBmLSAwIH0sIC8qIFBDSVJRMyAqLworCXsgMTEsIEJDUl9JTENSRSwgMiwgMHgwZi0xMSB9LCAvKiBQQ0lSUTIgKi8KKwl7ICA5LCBCQ1JfSUxDUkUsIDEsIDB4MGYtIDkgfSwgLyogUENJUlExICovCisJeyAgNywgQkNSX0lMQ1JFLCAwLCAweDBmLSA3IH0sIC8qIFBDSVJRMCAqLworCisJLyogIzIsICMxMyBhcmUgYWxsb2NhdGVkIGZvciBTTE9UIElSUSAjMSBhbmQgIzIgKGZvciBub3cpICovCisJLyogTk9URTogIzIgYW5kICMxMyBhcmUgbm90IHVzZWQgb24gUEMgKi8KKwl7IDEzLCBCQ1JfSUxDUkcsIDEsIDB4MGYtMTMgfSwgLyogU0xPVElSUTIgKi8KKwl7ICAyLCBCQ1JfSUxDUkcsIDAsIDB4MGYtIDIgfSwgLyogU0xPVElSUTEgKi8KKyNlbGlmIGRlZmluZWQoQ09ORklHX1NIXzc3NTFfU09MVVRJT05fRU5HSU5FKQorCXsgMTMsIEJDUl9JTENSRCwgMywgMiB9LAorCS8qIEFkZCBhZGRpdGlvbmFsIGVudHJpZXMgaGVyZSBhcyBkcml2ZXJzIGFyZSBhZGRlZCBhbmQgdGVzdGVkLiAqLworI2VuZGlmCit9OworCiAvKgogICogSW5pdGlhbGl6ZSBJUlEgc2V0dGluZwogICovCiB2b2lkIF9faW5pdCBpbml0Xzc3NTFzZV9JUlEodm9pZCkKIHsKLQotICAvKiBMZWF2ZSBvbGQgU29sdXRpb24gRW5naW5lIGNvZGUgaW4gZm9yIHJlZmVyZW5jZS4gKi8KLSNpZiBkZWZpbmVkKENPTkZJR19TSF9TT0xVVElPTl9FTkdJTkUpCi0gICAgICAgIC8qCi0gICAgICAgICAqIFN1cGVyIEkvTyAoSnVzdCBtaW1pYyBQQyk6Ci0gICAgICAgICAqICAxOiBrZXlib2FyZAotICAgICAgICAgKiAgMzogc2VyaWFsIDAKLSAgICAgICAgICogIDQ6IHNlcmlhbCAxCi0gICAgICAgICAqICA1OiBwcmludGVyCi0gICAgICAgICAqICA2OiBmbG9wcHkKLSAgICAgICAgICogIDg6IHJ0YwotICAgICAgICAgKiAxMjogbW91c2UKLSAgICAgICAgICogMTQ6IGlkZTAKLSAgICAgICAgICovCi0gICAgICAgIG1ha2VfaXByX2lycSgxNCwgQkNSX0lMQ1JBLCAyLCAweDBmLTE0KTsKLSAgICAgICAgbWFrZV9pcHJfaXJxKDEyLCBCQ1JfSUxDUkEsIDEsIDB4MGYtMTIpOwotICAgICAgICBtYWtlX2lwcl9pcnEoIDgsIEJDUl9JTENSQiwgMSwgMHgwZi0gOCk7Ci0gICAgICAgIG1ha2VfaXByX2lycSggNiwgQkNSX0lMQ1JDLCAzLCAweDBmLSA2KTsKLSAgICAgICAgbWFrZV9pcHJfaXJxKCA1LCBCQ1JfSUxDUkMsIDIsIDB4MGYtIDUpOwotICAgICAgICBtYWtlX2lwcl9pcnEoIDQsIEJDUl9JTENSQywgMSwgMHgwZi0gNCk7Ci0gICAgICAgIG1ha2VfaXByX2lycSggMywgQkNSX0lMQ1JDLCAwLCAweDBmLSAzKTsKLSAgICAgICAgbWFrZV9pcHJfaXJxKCAxLCBCQ1JfSUxDUkQsIDMsIDB4MGYtIDEpOwotCi0gICAgICAgIG1ha2VfaXByX2lycSgxMCwgQkNSX0lMQ1JELCAxLCAweDBmLTEwKTsgLyogTEFOICovCi0KLSAgICAgICAgbWFrZV9pcHJfaXJxKCAwLCBCQ1JfSUxDUkUsIDMsIDB4MGYtIDApOyAvKiBQQ0lSUTMgKi8KLSAgICAgICAgbWFrZV9pcHJfaXJxKDExLCBCQ1JfSUxDUkUsIDIsIDB4MGYtMTEpOyAvKiBQQ0lSUTIgKi8KLSAgICAgICAgbWFrZV9pcHJfaXJxKCA5LCBCQ1JfSUxDUkUsIDEsIDB4MGYtIDkpOyAvKiBQQ0lSUTEgKi8KLSAgICAgICAgbWFrZV9pcHJfaXJxKCA3LCBCQ1JfSUxDUkUsIDAsIDB4MGYtIDcpOyAvKiBQQ0lSUTAgKi8KLQotICAgICAgICAvKiAjMiwgIzEzIGFyZSBhbGxvY2F0ZWQgZm9yIFNMT1QgSVJRICMxIGFuZCAjMiAoZm9yIG5vdykgKi8KLSAgICAgICAgLyogTk9URTogIzIgYW5kICMxMyBhcmUgbm90IHVzZWQgb24gUEMgKi8KLSAgICAgICAgbWFrZV9pcHJfaXJxKDEzLCBCQ1JfSUxDUkcsIDEsIDB4MGYtMTMpOyAvKiBTTE9USVJRMiAqLwotICAgICAgICBtYWtlX2lwcl9pcnEoIDIsIEJDUl9JTENSRywgMCwgMHgwZi0gMik7IC8qIFNMT1RJUlExICovCi0KLSNlbGlmIGRlZmluZWQoQ09ORklHX1NIXzc3NTFfU09MVVRJT05fRU5HSU5FKQotCi0gICAgICAgIG1ha2VfaXByX2lycSgxMywgQkNSX0lMQ1JELCAzLCAyKTsKLQotICAgICAgICAvKiBBZGQgYWRkaXRpb25hbCBjYWxscyB0byBtYWtlX2lwcl9pcnEoKSBhcyBkcml2ZXJzIGFyZSBhZGRlZAotICAgICAgICAgKiBhbmQgdGVzdGVkLgotICAgICAgICAgKi8KLSNlbmRpZgotCisJbWFrZV9pcHJfaXJxKHNlNzc1MV9pcHJfbWFwLCBBUlJBWV9TSVpFKHNlNzc1MV9pcHJfbWFwKSk7CiB9CmRpZmYgLS1naXQgYS9hcmNoL3NoL2JvYXJkcy9zaDAzL3NldHVwLmMgYi9hcmNoL3NoL2JvYXJkcy9zaDAzL3NldHVwLmMKaW5kZXggMTM3ZTJiYS4uNWFkMWUxOSAxMDA2NDQKLS0tIGEvYXJjaC9zaC9ib2FyZHMvc2gwMy9zZXR1cC5jCisrKyBiL2FyY2gvc2gvYm9hcmRzL3NoMDMvc2V0dXAuYwpAQCAtMTQsMTQgKzE0LDE3IEBACiAjaW5jbHVkZSA8YXNtL3NoMDMvc2gwMy5oPgogI2luY2x1ZGUgPGFzbS9hZGRyc3BhY2UuaD4KIAorc3RhdGljIHN0cnVjdCBpcHJfZGF0YSBzaDAzX2lwcl9tYXBbXSA9IHsKKwl7IElSTDBfSVJRLCBJUkwwX0lQUl9BRERSLCBJUkwwX0lQUl9QT1MsIElSTDBfUFJJT1JJVFkgfSwKKwl7IElSTDFfSVJRLCBJUkwxX0lQUl9BRERSLCBJUkwxX0lQUl9QT1MsIElSTDFfUFJJT1JJVFkgfSwKKwl7IElSTDJfSVJRLCBJUkwyX0lQUl9BRERSLCBJUkwyX0lQUl9QT1MsIElSTDJfUFJJT1JJVFkgfSwKKwl7IElSTDNfSVJRLCBJUkwzX0lQUl9BRERSLCBJUkwzX0lQUl9QT1MsIElSTDNfUFJJT1JJVFkgfSwKK307CisKIHN0YXRpYyB2b2lkIF9faW5pdCBpbml0X3NoMDNfSVJRKHZvaWQpCiB7CiAJY3RybF9vdXR3KGN0cmxfaW53KElOVENfSUNSKSB8IElOVENfSUNSX0lSTE0sIElOVENfSUNSKTsKLQotCW1ha2VfaXByX2lycShJUkwwX0lSUSwgSVJMMF9JUFJfQUREUiwgSVJMMF9JUFJfUE9TLCBJUkwwX1BSSU9SSVRZKTsKLQltYWtlX2lwcl9pcnEoSVJMMV9JUlEsIElSTDFfSVBSX0FERFIsIElSTDFfSVBSX1BPUywgSVJMMV9QUklPUklUWSk7Ci0JbWFrZV9pcHJfaXJxKElSTDJfSVJRLCBJUkwyX0lQUl9BRERSLCBJUkwyX0lQUl9QT1MsIElSTDJfUFJJT1JJVFkpOwotCW1ha2VfaXByX2lycShJUkwzX0lSUSwgSVJMM19JUFJfQUREUiwgSVJMM19JUFJfUE9TLCBJUkwzX1BSSU9SSVRZKTsKKwltYWtlX2lwcl9pcnEoc2gwM19pcHJfbWFwLCBBUlJBWV9TSVpFKHNoMDNfaXByX21hcCkpOwogfQogCiBleHRlcm4gdm9pZCAqY2ZfaW9fYmFzZTsKZGlmZiAtLWdpdCBhL2FyY2gvc2gvYm9hcmRzL3NobWluL3NldHVwLmMgYi9hcmNoL3NoL2JvYXJkcy9zaG1pbi9zZXR1cC5jCmluZGV4IDJmMGMxOTcuLmEzMWExZDEgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gvYm9hcmRzL3NobWluL3NldHVwLmMKKysrIGIvYXJjaC9zaC9ib2FyZHMvc2htaW4vc2V0dXAuYwpAQCAtNyw3ICs3LDcgQEAKICAqLwogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxhc20vbWFjaHZlYy5oPgotI2luY2x1ZGUgPGFzbS9zaG1pbi9zaG1pbi5oPgorI2luY2x1ZGUgPGFzbS9zaG1pbi5oPgogI2luY2x1ZGUgPGFzbS9jbG9jay5oPgogI2luY2x1ZGUgPGFzbS9pcnEuaD4KICNpbmNsdWRlIDxhc20vaW8uaD4KZGlmZiAtLWdpdCBhL2FyY2gvc2gvYm9hcmRzL3NuYXBnZWFyL3NldHVwLmMgYi9hcmNoL3NoL2JvYXJkcy9zbmFwZ2Vhci9zZXR1cC5jCmluZGV4IGY1ZTk4YzUuLjY1MGZiMzYgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gvYm9hcmRzL3NuYXBnZWFyL3NldHVwLmMKKysrIGIvYXJjaC9zaC9ib2FyZHMvc25hcGdlYXIvc2V0dXAuYwpAQCAtMzMsNyArMzMsNyBAQAogICogRXJhc2VDb25maWcgaGFuZGxpbmcgZnVuY3Rpb25zCiAgKi8KIAotc3RhdGljIGlycXJldHVybl90IGVyYXNlY29uZmlnX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQorc3RhdGljIGlycXJldHVybl90IGVyYXNlY29uZmlnX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQpCiB7CiAJdm9sYXRpbGUgY2hhciBkdW1teSBfX2F0dHJpYnV0ZV9fKCh1bnVzZWQpKSA9ICogKHZvbGF0aWxlIGNoYXIgKikgMHhiODAwMDAwMDsKIApAQCAtNjgsNiArNjgsMTMgQEAKICAqIElSTDMgPSBjcnlwdG8KICAqLwogCitzdGF0aWMgc3RydWN0IGlwcl9kYXRhIHNuYXBnZWFyX2lwcl9tYXBbXSA9IHsKKwltYWtlX2lwcl9pcnEoSVJMMF9JUlEsIElSTDBfSVBSX0FERFIsIElSTDBfSVBSX1BPUywgSVJMMF9QUklPUklUWSk7CisJbWFrZV9pcHJfaXJxKElSTDFfSVJRLCBJUkwxX0lQUl9BRERSLCBJUkwxX0lQUl9QT1MsIElSTDFfUFJJT1JJVFkpOworCW1ha2VfaXByX2lycShJUkwyX0lSUSwgSVJMMl9JUFJfQUREUiwgSVJMMl9JUFJfUE9TLCBJUkwyX1BSSU9SSVRZKTsKKwltYWtlX2lwcl9pcnEoSVJMM19JUlEsIElSTDNfSVBSX0FERFIsIElSTDNfSVBSX1BPUywgSVJMM19QUklPUklUWSk7Cit9OworCiBzdGF0aWMgdm9pZCBfX2luaXQgaW5pdF9zbmFwZ2Vhcl9JUlEodm9pZCkKIHsKIAkvKiBlbmFibGUgaW5kaXZpZHVhbCBpbnRlcnJ1cHQgbW9kZSBmb3IgZXh0ZXJuYWxzICovCkBAIC03NSwxMCArODIsNyBAQAogCiAJcHJpbnRrKCJTZXR1cCBTbmFwR2VhciBJUlEvSVBSIC4uLlxuIik7CiAKLQltYWtlX2lwcl9pcnEoSVJMMF9JUlEsIElSTDBfSVBSX0FERFIsIElSTDBfSVBSX1BPUywgSVJMMF9QUklPUklUWSk7Ci0JbWFrZV9pcHJfaXJxKElSTDFfSVJRLCBJUkwxX0lQUl9BRERSLCBJUkwxX0lQUl9QT1MsIElSTDFfUFJJT1JJVFkpOwotCW1ha2VfaXByX2lycShJUkwyX0lSUSwgSVJMMl9JUFJfQUREUiwgSVJMMl9JUFJfUE9TLCBJUkwyX1BSSU9SSVRZKTsKLQltYWtlX2lwcl9pcnEoSVJMM19JUlEsIElSTDNfSVBSX0FERFIsIElSTDNfSVBSX1BPUywgSVJMM19QUklPUklUWSk7CisJbWFrZV9pcHJfaXJxKHNuYXBnZWFyX2lwcl9tYXAsIEFSUkFZX1NJWkUoc25hcGdlYXJfaXByX21hcCkpOwogfQogCiAvKgpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9ib2FyZHMvdGl0YW4vc2V0dXAuYyBiL2FyY2gvc2gvYm9hcmRzL3RpdGFuL3NldHVwLmMKaW5kZXggNTJiNjZkOC4uYTYwNDZkOSAxMDA2NDQKLS0tIGEvYXJjaC9zaC9ib2FyZHMvdGl0YW4vc2V0dXAuYworKysgYi9hcmNoL3NoL2JvYXJkcy90aXRhbi9zZXR1cC5jCkBAIC05LDE1ICs5LDE5IEBACiAKIGV4dGVybiB2b2lkIF9faW5pdCBwY2liaW9zX2luaXRfcGxhdGZvcm0odm9pZCk7CiAKK3N0YXRpYyBzdHJ1Y3QgaXByX2RhdGEgdGl0YW5faXByX21hcFtdID0geworCXsgVElUQU5fSVJRX1dBTiwJSVJMMF9JUFJfQUREUiwJSVJMMF9JUFJfUE9TLAlJUkwwX1BSSU9SSVRZIH0sCisJeyBUSVRBTl9JUlFfTEFOLAlJUkwxX0lQUl9BRERSLAlJUkwxX0lQUl9QT1MsCUlSTDFfUFJJT1JJVFkgfSwKKwl7IFRJVEFOX0lSUV9NUENJQSwJSVJMMl9JUFJfQUREUiwJSVJMMl9JUFJfUE9TLAlJUkwyX1BSSU9SSVRZIH0sCisJeyBUSVRBTl9JUlFfVVNCLAlJUkwzX0lQUl9BRERSLAlJUkwzX0lQUl9QT1MsCUlSTDNfUFJJT1JJVFkgfSwKK307CisKIHN0YXRpYyB2b2lkIF9faW5pdCBpbml0X3RpdGFuX2lycSh2b2lkKQogewogCS8qIGVuYWJsZSBpbmRpdmlkdWFsIGludGVycnVwdCBtb2RlIGZvciBleHRlcm5hbHMgKi8KIAljdHJsX291dHcoY3RybF9pbncoSU5UQ19JQ1IpIHwgSU5UQ19JQ1JfSVJMTSwgSU5UQ19JQ1IpOwogCi0JbWFrZV9pcHJfaXJxKCBUSVRBTl9JUlFfV0FOLCAgIElSTDBfSVBSX0FERFIsIElSTDBfSVBSX1BPUywgSVJMMF9QUklPUklUWSk7IC8qIFBDSVJRMCAqLwotCW1ha2VfaXByX2lycSggVElUQU5fSVJRX0xBTiwgICBJUkwxX0lQUl9BRERSLCBJUkwxX0lQUl9QT1MsIElSTDFfUFJJT1JJVFkpOyAvKiBQQ0lSUTEgKi8KLQltYWtlX2lwcl9pcnEoIFRJVEFOX0lSUV9NUENJQSwgSVJMMl9JUFJfQUREUiwgSVJMMl9JUFJfUE9TLCBJUkwyX1BSSU9SSVRZKTsgLyogUENJUlEyICovCi0JbWFrZV9pcHJfaXJxKCBUSVRBTl9JUlFfVVNCLCAgIElSTDNfSVBSX0FERFIsIElSTDNfSVBSX1BPUywgSVJMM19QUklPUklUWSk7IC8qIFBDSVJRMyAqLworCW1ha2VfaXByX2lycSh0aXRhbl9pcHJfbWFwLCBBUlJBWV9TSVpFKHRpdGFuX2lwcl9tYXApKTsKIH0KIAogc3RydWN0IHNoX21hY2hpbmVfdmVjdG9yIG12X3RpdGFuIF9faW5pdG12ID0gewpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9jY2hpcHMvaGQ2NDQ2eC9oZDY0NDYxL3NldHVwLmMgYi9hcmNoL3NoL2NjaGlwcy9oZDY0NDZ4L2hkNjQ0NjEvc2V0dXAuYwppbmRleCAzOGYxZTgxLi40ZDQ5YjVjIDEwMDY0NAotLS0gYS9hcmNoL3NoL2NjaGlwcy9oZDY0NDZ4L2hkNjQ0NjEvc2V0dXAuYworKysgYi9hcmNoL3NoL2NjaGlwcy9oZDY0NDZ4L2hkNjQ0NjEvc2V0dXAuYwpAQCAtNzEsNyArNzEsNyBAQAogCS5lbmQJCT0gZW5kX2hkNjQ0NjFfaXJxLAogfTsKIAotc3RhdGljIGlycXJldHVybl90IGhkNjQ0NjFfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCitzdGF0aWMgaXJxcmV0dXJuX3QgaGQ2NDQ2MV9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkKQogewogCXByaW50ayhLRVJOX0lORk8KIAkgICAgICAgIkhENjQ0NjE6IHNwdXJpb3VzIGludGVycnVwdCwgbmlycjogMHgleCBuaW1yOiAweCV4XG4iLApkaWZmIC0tZ2l0IGEvYXJjaC9zaC9jY2hpcHMvaGQ2NDQ2eC9oZDY0NDY1L2dwaW8uYyBiL2FyY2gvc2gvY2NoaXBzL2hkNjQ0NngvaGQ2NDQ2NS9ncGlvLmMKaW5kZXggNzIzMjBkMC4uNDM0MzE4NSAxMDA2NDQKLS0tIGEvYXJjaC9zaC9jY2hpcHMvaGQ2NDQ2eC9oZDY0NDY1L2dwaW8uYworKysgYi9hcmNoL3NoL2NjaGlwcy9oZDY0NDZ4L2hkNjQ0NjUvZ3Bpby5jCkBAIC04NSw3ICs4NSw3IEBACiAgICAgdm9pZCAqZGV2OwogfSBoYW5kbGVyc1tHUElPX05QT1JUUyAqIDhdOwogCi1zdGF0aWMgaXJxcmV0dXJuX3QgaGQ2NDQ2NV9ncGlvX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXYsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQorc3RhdGljIGlycXJldHVybl90IGhkNjQ0NjVfZ3Bpb19pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2KQogewogICAgIAl1bnNpZ25lZCBzaG9ydCBwb3J0LCBwaW4sIGlzciwgbWFzaywgcG9ydHBpbjsKIAkKZGlmZiAtLWdpdCBhL2FyY2gvc2gvY2NoaXBzL2hkNjQ0NngvaGQ2NDQ2NS9zZXR1cC5jIGIvYXJjaC9zaC9jY2hpcHMvaGQ2NDQ2eC9oZDY0NDY1L3NldHVwLmMKaW5kZXggMzA1NzNkMy4uZDEyNmUxZiAxMDA2NDQKLS0tIGEvYXJjaC9zaC9jY2hpcHMvaGQ2NDQ2eC9oZDY0NDY1L3NldHVwLmMKKysrIGIvYXJjaC9zaC9jY2hpcHMvaGQ2NDQ2eC9oZDY0NDY1L3NldHVwLmMKQEAgLTg0LDcgKzg0LDcgQEAKIH07CiAKIAotc3RhdGljIGlycXJldHVybl90IGhkNjQ0NjVfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCitzdGF0aWMgaXJxcmV0dXJuX3QgaGQ2NDQ2NV9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkKQogewogCXByaW50ayhLRVJOX0lORk8KIAkgICAgICAgIkhENjQ0NjU6IHNwdXJpb3VzIGludGVycnVwdCwgbmlycjogMHgleCBuaW1yOiAweCV4XG4iLApkaWZmIC0tZ2l0IGEvYXJjaC9zaC9jY2hpcHMvdm95YWdlcmd4L2lycS5jIGIvYXJjaC9zaC9jY2hpcHMvdm95YWdlcmd4L2lycS5jCmluZGV4IDM5MmM4YjEuLmY3ZWE3MDAgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gvY2NoaXBzL3ZveWFnZXJneC9pcnEuYworKysgYi9hcmNoL3NoL2NjaGlwcy92b3lhZ2VyZ3gvaXJxLmMKQEAgLTE3LDI5ICsxNywxOCBAQAogCiAgICAgQ29weXJpZ2h0IDIwMDMgKGMpIExpbmVvIHVTb2x1dGlvbnMsSW5jLgogKi8KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0KLSN1bmRlZiBERUJVRwotCi0jaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC9wYXJhbS5oPgotI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9pcnEuaD4KLQotI2luY2x1ZGUgPGFzbS9pby5oPgotI2luY2x1ZGUgPGFzbS9pcnEuaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgogI2luY2x1ZGUgPGFzbS92b3lhZ2VyZ3guaD4KKyNpbmNsdWRlIDxhc20vcnRzNzc1MXIyZC5oPgogCiBzdGF0aWMgdm9pZCBkaXNhYmxlX3ZveWFnZXJneF9pcnEodW5zaWduZWQgaW50IGlycSkKIHsKIAl1bnNpZ25lZCBsb25nIHZhbDsKIAl1bnNpZ25lZCBsb25nIG1hc2sgPSAxIDw8IChpcnEgLSBWT1lBR0VSX0lSUV9CQVNFKTsKIAotICAgIAlwcl9kZWJ1ZygiZGlzYWJsZV92b3lhZ2VyZ3hfaXJxKCVkKTogbWFzaz0leFxuIiwgaXJxLCBtYXNrKTsKKyAgICAJcHJfZGVidWcoImRpc2FibGVfdm95YWdlcmd4X2lycSglZCk6IG1hc2s9JWx4XG4iLCBpcnEsIG1hc2spOwogICAgICAgICB2YWwgPSBpbmwoVk9ZQUdFUl9JTlRfTUFTSyk7CiAgICAgICAgIHZhbCAmPSB+bWFzazsKICAgICAgICAgb3V0bCh2YWwsIFZPWUFHRVJfSU5UX01BU0spOwpAQCAtNTAsNyArMzksNyBAQAogICAgICAgICB1bnNpZ25lZCBsb25nIHZhbDsKICAgICAgICAgdW5zaWduZWQgbG9uZyBtYXNrID0gMSA8PCAoaXJxIC0gVk9ZQUdFUl9JUlFfQkFTRSk7CiAKLSAgICAgICAgcHJfZGVidWcoImRpc2FibGVfdm95YWdlcmd4X2lycSglZCk6IG1hc2s9JXhcbiIsIGlycSwgbWFzayk7CisgICAgICAgIHByX2RlYnVnKCJkaXNhYmxlX3ZveWFnZXJneF9pcnEoJWQpOiBtYXNrPSVseFxuIiwgaXJxLCBtYXNrKTsKICAgICAgICAgdmFsID0gaW5sKFZPWUFHRVJfSU5UX01BU0spOwogICAgICAgICB2YWwgfD0gbWFzazsKICAgICAgICAgb3V0bCh2YWwsIFZPWUFHRVJfSU5UX01BU0spOwpAQCAtODgsOCArNzcsNyBAQAogCS5lbmQgPSBlbmRfdm95YWdlcmd4X2lycSwKIH07CiAKLXN0YXRpYyBpcnFyZXR1cm5fdCB2b3lhZ2VyZ3hfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCwKLQkJCQkgICAgICBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3N0YXRpYyBpcnFyZXR1cm5fdCB2b3lhZ2VyZ3hfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCkKIHsKIAlwcmludGsoS0VSTl9JTkZPCiAJICAgICAgICJWb3lhZ2VyR1g6IHNwdXJpb3VzIGludGVycnVwdCwgc3RhdHVzOiAweCV4XG4iLApAQCAtMTM4LDcgKzEyNiw3IEBACiAJCX0gZWxzZSB7CiAJCQlwcmludGsoIlVuZXhwZWN0ZWQgSVJRIGlycSA9ICVkIHN0YXR1cyA9IDB4JTA4bHhcbiIsIGlycSwgdmFsKTsKIAkJfQotCQlwcl9kZWJ1Zygidm95YWdlcmd4X2lycV9kZW11eCAlZCBcbiIsIGkpOworCQlwcl9kZWJ1Zygidm95YWdlcmd4X2lycV9kZW11eCAlbGRcbiIsIGkpOwogI2Vsc2UKIAkJZm9yIChiaXQgPSAxLCBpID0gMCA7IGkgPCBWT1lBR0VSX0lSUV9OVU0gOyBiaXQgPDw9IDEsIGkrKykKIAkJCWlmICh2YWwgJiBiaXQpCkBAIC0xODYsNCArMTc0LDMgQEAKIAogCXNldHVwX2lycShJUlFfVk9ZQUdFUiwgJmlycTApOwogfQotCmRpZmYgLS1naXQgYS9hcmNoL3NoL2NvbmZpZ3Mvcjc3ODBycF9kZWZjb25maWcgYi9hcmNoL3NoL2NvbmZpZ3Mvcjc3ODBycF9kZWZjb25maWcKaW5kZXggMjQ3MDM2NC4uMzRlMjA0NiAxMDA2NDQKLS0tIGEvYXJjaC9zaC9jb25maWdzL3I3NzgwcnBfZGVmY29uZmlnCisrKyBiL2FyY2gvc2gvY29uZmlncy9yNzc4MHJwX2RlZmNvbmZpZwpAQCAtMSw3ICsxLDcgQEAKICMKICMgQXV0b21hdGljYWxseSBnZW5lcmF0ZWQgbWFrZSBjb25maWc6IGRvbid0IGVkaXQKLSMgTGludXgga2VybmVsIHZlcnNpb246IDIuNi4xOAotIyBUdWUgT2N0ICAzIDExOjMyOjQ3IDIwMDYKKyMgTGludXgga2VybmVsIHZlcnNpb246IDIuNi4xOS1yYzMKKyMgVHVlIE9jdCAzMSAxMjozMjowNiAyMDA2CiAjCiBDT05GSUdfU1VQRVJIPXkKIENPTkZJR19SV1NFTV9HRU5FUklDX1NQSU5MT0NLPXkKQEAgLTEwLDYgKzEwLDcgQEAKIENPTkZJR19HRU5FUklDX0hBUkRJUlFTPXkKIENPTkZJR19HRU5FUklDX0lSUV9QUk9CRT15CiBDT05GSUdfR0VORVJJQ19DQUxJQlJBVEVfREVMQVk9eQorIyBDT05GSUdfR0VORVJJQ19USU1FIGlzIG5vdCBzZXQKIENPTkZJR19ERUZDT05GSUdfTElTVD0iL2xpYi9tb2R1bGVzLyRVTkFNRV9SRUxFQVNFLy5jb25maWciCiAKICMKQEAgLTE3OCw3ICsxNzksNyBAQAogQ09ORklHX1BBR0VfT0ZGU0VUPTB4ODAwMDAwMDAKIENPTkZJR19NRU1PUllfU1RBUlQ9MHgwODAwMDAwMAogQ09ORklHX01FTU9SWV9TSVpFPTB4MDgwMDAwMDAKLUNPTkZJR18zMkJJVD15CisjIENPTkZJR18zMkJJVCBpcyBub3Qgc2V0CiBDT05GSUdfVlNZU0NBTEw9eQogQ09ORklHX0hVR0VUTEJfUEFHRV9TSVpFXzY0Sz15CiAjIENPTkZJR19IVUdFVExCX1BBR0VfU0laRV8xTUIgaXMgbm90IHNldApAQCAtMjI5LDkgKzIzMCw3IEBACiAjCiAjIERNQSBzdXBwb3J0CiAjCi1DT05GSUdfU0hfRE1BPXkKLUNPTkZJR19OUl9PTkNISVBfRE1BX0NIQU5ORUxTPTYKLSMgQ09ORklHX05SX0RNQV9DSEFOTkVMU19CT09MIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NIX0RNQSBpcyBub3Qgc2V0CiAKICMKICMgQ29tcGFuaW9uIENoaXBzCkBAIC0yNTksNyArMjU4LDcgQEAKIENPTkZJR19CT09UX0xJTktfT0ZGU0VUPTB4MDA4MDAwMDAKICMgQ09ORklHX1VCQ19XQUtFVVAgaXMgbm90IHNldAogQ09ORklHX0NNRExJTkVfQk9PTD15Ci1DT05GSUdfQ01ETElORT0ibWVtPTEyOE0gY29uc29sZT10dHlTQzAsMTE1MjAwIHJvb3Q9L2Rldi9oZGExIgorQ09ORklHX0NNRExJTkU9Im1lbT0xMjhNIGNvbnNvbGU9dHR5U0MwLDExNTIwMCByb290PS9kZXYvc2RhMSIKIAogIwogIyBCdXMgb3B0aW9ucwpAQCAtMzM2LDYgKzMzNSw3IEBACiAjIENPTkZJR19JTkVUX1RVTk5FTCBpcyBub3Qgc2V0CiBDT05GSUdfSU5FVF9YRlJNX01PREVfVFJBTlNQT1JUPXkKIENPTkZJR19JTkVUX1hGUk1fTU9ERV9UVU5ORUw9eQorQ09ORklHX0lORVRfWEZSTV9NT0RFX0JFRVQ9eQogQ09ORklHX0lORVRfRElBRz15CiBDT05GSUdfSU5FVF9UQ1BfRElBRz15CiAjIENPTkZJR19UQ1BfQ09OR19BRFZBTkNFRCBpcyBub3Qgc2V0CkBAIC00NDEsNzYgKzQ0MSwyOCBAQAogIyBDT05GSUdfQVRBX09WRVJfRVRIIGlzIG5vdCBzZXQKIAogIworIyBNaXNjIGRldmljZXMKKyMKKyMgQ09ORklHX1NHSV9JT0M0IGlzIG5vdCBzZXQKKyMgQ09ORklHX1RJRk1fQ09SRSBpcyBub3Qgc2V0CisKKyMKICMgQVRBL0FUQVBJL01GTS9STEwgc3VwcG9ydAogIwotQ09ORklHX0lERT1tCi1DT05GSUdfSURFX01BWF9IV0lGUz00Ci1DT05GSUdfQkxLX0RFVl9JREU9bQotCi0jCi0jIFBsZWFzZSBzZWUgRG9jdW1lbnRhdGlvbi9pZGUudHh0IGZvciBoZWxwL2luZm8gb24gSURFIGRyaXZlcwotIwotQ09ORklHX0JMS19ERVZfSURFX1NBVEE9eQotQ09ORklHX0JMS19ERVZfSURFRElTSz1tCi1DT05GSUdfSURFRElTS19NVUxUSV9NT0RFPXkKLSMgQ09ORklHX0JMS19ERVZfSURFQ0QgaXMgbm90IHNldAotIyBDT05GSUdfQkxLX0RFVl9JREVUQVBFIGlzIG5vdCBzZXQKLSMgQ09ORklHX0JMS19ERVZfSURFRkxPUFBZIGlzIG5vdCBzZXQKLUNPTkZJR19CTEtfREVWX0lERVNDU0k9bQotIyBDT05GSUdfSURFX1RBU0tfSU9DVEwgaXMgbm90IHNldAotCi0jCi0jIElERSBjaGlwc2V0IHN1cHBvcnQvYnVnZml4ZXMKLSMKLUNPTkZJR19JREVfR0VORVJJQz1tCi1DT05GSUdfQkxLX0RFVl9JREVQQ0k9eQotQ09ORklHX0lERVBDSV9TSEFSRV9JUlE9eQotIyBDT05GSUdfQkxLX0RFVl9PRkZCT0FSRCBpcyBub3Qgc2V0Ci1DT05GSUdfQkxLX0RFVl9HRU5FUklDPW0KLSMgQ09ORklHX0JMS19ERVZfT1BUSTYyMSBpcyBub3Qgc2V0Ci1DT05GSUdfQkxLX0RFVl9JREVETUFfUENJPXkKLSMgQ09ORklHX0JMS19ERVZfSURFRE1BX0ZPUkNFRCBpcyBub3Qgc2V0Ci1DT05GSUdfSURFRE1BX1BDSV9BVVRPPXkKLSMgQ09ORklHX0lERURNQV9PTkxZRElTSyBpcyBub3Qgc2V0Ci1DT05GSUdfQkxLX0RFVl9BRUM2MlhYPW0KLSMgQ09ORklHX0JMS19ERVZfQUxJMTVYMyBpcyBub3Qgc2V0Ci0jIENPTkZJR19CTEtfREVWX0FNRDc0WFggaXMgbm90IHNldAotIyBDT05GSUdfQkxLX0RFVl9DTUQ2NFggaXMgbm90IHNldAotIyBDT05GSUdfQkxLX0RFVl9UUklGTEVYIGlzIG5vdCBzZXQKLSMgQ09ORklHX0JMS19ERVZfQ1k4MkM2OTMgaXMgbm90IHNldAotIyBDT05GSUdfQkxLX0RFVl9DUzU1MjAgaXMgbm90IHNldAotIyBDT05GSUdfQkxLX0RFVl9DUzU1MzAgaXMgbm90IHNldAotIyBDT05GSUdfQkxLX0RFVl9IUFQzNFggaXMgbm90IHNldAotIyBDT05GSUdfQkxLX0RFVl9IUFQzNjYgaXMgbm90IHNldAotIyBDT05GSUdfQkxLX0RFVl9TQzEyMDAgaXMgbm90IHNldAotIyBDT05GSUdfQkxLX0RFVl9QSUlYIGlzIG5vdCBzZXQKLSMgQ09ORklHX0JMS19ERVZfSVQ4MjFYIGlzIG5vdCBzZXQKLSMgQ09ORklHX0JMS19ERVZfTlM4NzQxNSBpcyBub3Qgc2V0Ci0jIENPTkZJR19CTEtfREVWX1BEQzIwMlhYX09MRCBpcyBub3Qgc2V0Ci1DT05GSUdfQkxLX0RFVl9QREMyMDJYWF9ORVc9bQotIyBDT05GSUdfQkxLX0RFVl9TVldLUyBpcyBub3Qgc2V0Ci1DT05GSUdfQkxLX0RFVl9TSUlNQUdFPW0KLSMgQ09ORklHX0JMS19ERVZfU0xDOTBFNjYgaXMgbm90IHNldAotIyBDT05GSUdfQkxLX0RFVl9UUk0yOTAgaXMgbm90IHNldAotIyBDT05GSUdfQkxLX0RFVl9WSUE4MkNYWFggaXMgbm90IHNldAotIyBDT05GSUdfSURFX0FSTSBpcyBub3Qgc2V0Ci1DT05GSUdfQkxLX0RFVl9JREVETUE9eQotIyBDT05GSUdfSURFRE1BX0lWQiBpcyBub3Qgc2V0Ci1DT05GSUdfSURFRE1BX0FVVE89eQotIyBDT05GSUdfQkxLX0RFVl9IRCBpcyBub3Qgc2V0CisjIENPTkZJR19JREUgaXMgbm90IHNldAogCiAjCiAjIFNDU0kgZGV2aWNlIHN1cHBvcnQKICMKICMgQ09ORklHX1JBSURfQVRUUlMgaXMgbm90IHNldAotQ09ORklHX1NDU0k9bQorQ09ORklHX1NDU0k9eQogIyBDT05GSUdfU0NTSV9ORVRMSU5LIGlzIG5vdCBzZXQKIENPTkZJR19TQ1NJX1BST0NfRlM9eQogCiAjCiAjIFNDU0kgc3VwcG9ydCB0eXBlIChkaXNrLCB0YXBlLCBDRC1ST00pCiAjCi1DT05GSUdfQkxLX0RFVl9TRD1tCitDT05GSUdfQkxLX0RFVl9TRD15CiAjIENPTkZJR19DSFJfREVWX1NUIGlzIG5vdCBzZXQKICMgQ09ORklHX0NIUl9ERVZfT1NTVCBpcyBub3Qgc2V0CiAjIENPTkZJR19CTEtfREVWX1NSIGlzIG5vdCBzZXQKQEAgLTU2MSw2ICs1MTMsNyBAQAogIyBDT05GSUdfU0NTSV9JUFIgaXMgbm90IHNldAogIyBDT05GSUdfU0NTSV9RTE9HSUNfMTI4MCBpcyBub3Qgc2V0CiAjIENPTkZJR19TQ1NJX1FMQV9GQyBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX1FMQV9JU0NTSSBpcyBub3Qgc2V0CiAjIENPTkZJR19TQ1NJX0xQRkMgaXMgbm90IHNldAogIyBDT05GSUdfU0NTSV9EQzM5NXggaXMgbm90IHNldAogIyBDT05GSUdfU0NTSV9EQzM5MFQgaXMgbm90IHNldApAQCAtNTcwLDcgKzUyMyw1NSBAQAogIwogIyBTZXJpYWwgQVRBIChwcm9kKSBhbmQgUGFyYWxsZWwgQVRBIChleHBlcmltZW50YWwpIGRyaXZlcnMKICMKLSMgQ09ORklHX0FUQSBpcyBub3Qgc2V0CitDT05GSUdfQVRBPXkKKyMgQ09ORklHX1NBVEFfQUhDSSBpcyBub3Qgc2V0CisjIENPTkZJR19TQVRBX1NWVyBpcyBub3Qgc2V0CisjIENPTkZJR19BVEFfUElJWCBpcyBub3Qgc2V0CisjIENPTkZJR19TQVRBX01WIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NBVEFfTlYgaXMgbm90IHNldAorIyBDT05GSUdfUERDX0FETUEgaXMgbm90IHNldAorIyBDT05GSUdfU0FUQV9RU1RPUiBpcyBub3Qgc2V0CisjIENPTkZJR19TQVRBX1BST01JU0UgaXMgbm90IHNldAorIyBDT05GSUdfU0FUQV9TWDQgaXMgbm90IHNldAorQ09ORklHX1NBVEFfU0lMPXkKKyMgQ09ORklHX1NBVEFfU0lMMjQgaXMgbm90IHNldAorIyBDT05GSUdfU0FUQV9TSVMgaXMgbm90IHNldAorIyBDT05GSUdfU0FUQV9VTEkgaXMgbm90IHNldAorIyBDT05GSUdfU0FUQV9WSUEgaXMgbm90IHNldAorIyBDT05GSUdfU0FUQV9WSVRFU1NFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBVEFfQUxJIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBVEFfQU1EIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBVEFfQVJUT1AgaXMgbm90IHNldAorIyBDT05GSUdfUEFUQV9BVElJWFAgaXMgbm90IHNldAorIyBDT05GSUdfUEFUQV9DTUQ2NFggaXMgbm90IHNldAorIyBDT05GSUdfUEFUQV9DUzU1MjAgaXMgbm90IHNldAorIyBDT05GSUdfUEFUQV9DUzU1MzAgaXMgbm90IHNldAorIyBDT05GSUdfUEFUQV9DWVBSRVNTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBVEFfRUZBUiBpcyBub3Qgc2V0CisjIENPTkZJR19BVEFfR0VORVJJQyBpcyBub3Qgc2V0CisjIENPTkZJR19QQVRBX0hQVDM2NiBpcyBub3Qgc2V0CisjIENPTkZJR19QQVRBX0hQVDM3WCBpcyBub3Qgc2V0CisjIENPTkZJR19QQVRBX0hQVDNYMk4gaXMgbm90IHNldAorIyBDT05GSUdfUEFUQV9IUFQzWDMgaXMgbm90IHNldAorIyBDT05GSUdfUEFUQV9JVDgyMVggaXMgbm90IHNldAorIyBDT05GSUdfUEFUQV9KTUlDUk9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBVEFfVFJJRkxFWCBpcyBub3Qgc2V0CisjIENPTkZJR19QQVRBX01QSUlYIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBVEFfT0xEUElJWCBpcyBub3Qgc2V0CisjIENPTkZJR19QQVRBX05FVENFTEwgaXMgbm90IHNldAorIyBDT05GSUdfUEFUQV9OUzg3NDEwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBVEFfT1BUSSBpcyBub3Qgc2V0CisjIENPTkZJR19QQVRBX09QVElETUEgaXMgbm90IHNldAorIyBDT05GSUdfUEFUQV9QRENfT0xEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBVEFfUkFESVNZUyBpcyBub3Qgc2V0CisjIENPTkZJR19QQVRBX1JaMTAwMCBpcyBub3Qgc2V0CisjIENPTkZJR19QQVRBX1NDMTIwMCBpcyBub3Qgc2V0CisjIENPTkZJR19QQVRBX1NFUlZFUldPUktTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBVEFfUERDMjAyN1ggaXMgbm90IHNldAorIyBDT05GSUdfUEFUQV9TSUw2ODAgaXMgbm90IHNldAorIyBDT05GSUdfUEFUQV9TSVMgaXMgbm90IHNldAorIyBDT05GSUdfUEFUQV9WSUEgaXMgbm90IHNldAorIyBDT05GSUdfUEFUQV9XSU5CT05EIGlzIG5vdCBzZXQKIAogIwogIyBNdWx0aS1kZXZpY2Ugc3VwcG9ydCAoUkFJRCBhbmQgTFZNKQpAQCAtODQwLDcgKzg0MSw2IEBACiAjIFRQTSBkZXZpY2VzCiAjCiAjIENPTkZJR19UQ0dfVFBNIGlzIG5vdCBzZXQKLSMgQ09ORklHX1RFTENMT0NLIGlzIG5vdCBzZXQKIAogIwogIyBJMkMgc3VwcG9ydApAQCAtODU2LDYgKzg1Niw3IEBACiAjCiAjIERhbGxhcydzIDEtd2lyZSBidXMKICMKKyMgQ09ORklHX1cxIGlzIG5vdCBzZXQKIAogIwogIyBIYXJkd2FyZSBNb25pdG9yaW5nIHN1cHBvcnQKQEAgLTg2OCwxNCArODY5LDkgQEAKICMgQ09ORklHX0hXTU9OX0RFQlVHX0NISVAgaXMgbm90IHNldAogCiAjCi0jIE1pc2MgZGV2aWNlcwotIwotCi0jCiAjIE11bHRpbWVkaWEgZGV2aWNlcwogIwogIyBDT05GSUdfVklERU9fREVWIGlzIG5vdCBzZXQKLUNPTkZJR19WSURFT19WNEwyPXkKIAogIwogIyBEaWdpdGFsIFZpZGVvIEJyb2FkY2FzdGluZyBEZXZpY2VzCkBAIC05NTksNyArOTU1LDI5IEBACiAjCiAjIFJlYWwgVGltZSBDbG9jawogIwotIyBDT05GSUdfUlRDX0NMQVNTIGlzIG5vdCBzZXQKK0NPTkZJR19SVENfTElCPXkKK0NPTkZJR19SVENfQ0xBU1M9eQorQ09ORklHX1JUQ19IQ1RPU1lTPXkKK0NPTkZJR19SVENfSENUT1NZU19ERVZJQ0U9InJ0YzAiCisjIENPTkZJR19SVENfREVCVUcgaXMgbm90IHNldAorCisjCisjIFJUQyBpbnRlcmZhY2VzCisjCitDT05GSUdfUlRDX0lOVEZfU1lTRlM9eQorQ09ORklHX1JUQ19JTlRGX1BST0M9eQorQ09ORklHX1JUQ19JTlRGX0RFVj15CisjIENPTkZJR19SVENfSU5URl9ERVZfVUlFX0VNVUwgaXMgbm90IHNldAorCisjCisjIFJUQyBkcml2ZXJzCisjCisjIENPTkZJR19SVENfRFJWX0RTMTU1MyBpcyBub3Qgc2V0CisjIENPTkZJR19SVENfRFJWX0RTMTc0MiBpcyBub3Qgc2V0CisjIENPTkZJR19SVENfRFJWX000OFQ4NiBpcyBub3Qgc2V0CitDT05GSUdfUlRDX0RSVl9TSD15CisjIENPTkZJR19SVENfRFJWX1RFU1QgaXMgbm90IHNldAorIyBDT05GSUdfUlRDX0RSVl9WMzAyMCBpcyBub3Qgc2V0CiAKICMKICMgRE1BIEVuZ2luZSBzdXBwb3J0CkBAIC05ODQsNiArMTAwMiw3IEBACiBDT05GSUdfRVhUM19GU19YQVRUUj15CiAjIENPTkZJR19FWFQzX0ZTX1BPU0lYX0FDTCBpcyBub3Qgc2V0CiAjIENPTkZJR19FWFQzX0ZTX1NFQ1VSSVRZIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VYVDRERVZfRlMgaXMgbm90IHNldAogQ09ORklHX0pCRD15CiAjIENPTkZJR19KQkRfREVCVUcgaXMgbm90IHNldAogQ09ORklHX0ZTX01CQ0FDSEU9eQpAQCAtOTkxLDYgKzEwMTAsNyBAQAogIyBDT05GSUdfSkZTX0ZTIGlzIG5vdCBzZXQKIENPTkZJR19GU19QT1NJWF9BQ0w9eQogIyBDT05GSUdfWEZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0dGUzJfRlMgaXMgbm90IHNldAogIyBDT05GSUdfT0NGUzJfRlMgaXMgbm90IHNldAogQ09ORklHX01JTklYX0ZTPXkKICMgQ09ORklHX1JPTUZTX0ZTIGlzIG5vdCBzZXQKQEAgLTEwMjcsNyArMTA0Nyw4IEBACiBDT05GSUdfUFJPQ19LQ09SRT15CiBDT05GSUdfUFJPQ19TWVNDVEw9eQogQ09ORklHX1NZU0ZTPXkKLSMgQ09ORklHX1RNUEZTIGlzIG5vdCBzZXQKK0NPTkZJR19UTVBGUz15CisjIENPTkZJR19UTVBGU19QT1NJWF9BQ0wgaXMgbm90IHNldAogQ09ORklHX0hVR0VUTEJGUz15CiBDT05GSUdfSFVHRVRMQl9QQUdFPXkKIENPTkZJR19SQU1GUz15CkBAIC0xMTU5LDYgKzExODAsNyBAQAogIyBDT05GSUdfREVCVUdfTElTVCBpcyBub3Qgc2V0CiBDT05GSUdfRlJBTUVfUE9JTlRFUj15CiBDT05GSUdfRk9SQ0VEX0lOTElOSU5HPXkKKyMgQ09ORklHX0hFQURFUlNfQ0hFQ0sgaXMgbm90IHNldAogIyBDT05GSUdfUkNVX1RPUlRVUkVfVEVTVCBpcyBub3Qgc2V0CiAjIENPTkZJR19TSF9TVEFOREFSRF9CSU9TIGlzIG5vdCBzZXQKICMgQ09ORklHX0VBUkxZX1NDSUZfQ09OU09MRSBpcyBub3Qgc2V0CkBAIC0xMTc4LDkgKzEyMDAsOSBAQAogIwogQ09ORklHX0NSWVBUTz15CiBDT05GSUdfQ1JZUFRPX0FMR0FQST15Ci1DT05GSUdfQ1JZUFRPX0JMS0NJUEhFUj1tCitDT05GSUdfQ1JZUFRPX0JMS0NJUEhFUj15CiBDT05GSUdfQ1JZUFRPX0hBU0g9eQotQ09ORklHX0NSWVBUT19NQU5BR0VSPW0KK0NPTkZJR19DUllQVE9fTUFOQUdFUj15CiBDT05GSUdfQ1JZUFRPX0hNQUM9eQogIyBDT05GSUdfQ1JZUFRPX05VTEwgaXMgbm90IHNldAogIyBDT05GSUdfQ1JZUFRPX01ENCBpcyBub3Qgc2V0CkBAIC0xMTkxLDcgKzEyMTMsNyBAQAogIyBDT05GSUdfQ1JZUFRPX1dQNTEyIGlzIG5vdCBzZXQKICMgQ09ORklHX0NSWVBUT19UR1IxOTIgaXMgbm90IHNldAogQ09ORklHX0NSWVBUT19FQ0I9bQotQ09ORklHX0NSWVBUT19DQkM9bQorQ09ORklHX0NSWVBUT19DQkM9eQogQ09ORklHX0NSWVBUT19ERVM9eQogIyBDT05GSUdfQ1JZUFRPX0JMT1dGSVNIIGlzIG5vdCBzZXQKICMgQ09ORklHX0NSWVBUT19UV09GSVNIIGlzIG5vdCBzZXQKZGlmZiAtLWdpdCBhL2FyY2gvc2gvY29uZmlncy90aXRhbl9kZWZjb25maWcgYi9hcmNoL3NoL2NvbmZpZ3MvdGl0YW5fZGVmY29uZmlnCmluZGV4IDVlODE3NTQuLjQxMDQ5Y2YgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gvY29uZmlncy90aXRhbl9kZWZjb25maWcKKysrIGIvYXJjaC9zaC9jb25maWdzL3RpdGFuX2RlZmNvbmZpZwpAQCAtMSw3ICsxLDcgQEAKICMKICMgQXV0b21hdGljYWxseSBnZW5lcmF0ZWQgbWFrZSBjb25maWc6IGRvbid0IGVkaXQKLSMgTGludXgga2VybmVsIHZlcnNpb246IDIuNi4xOAotIyBUdWUgT2N0ICAzIDEyOjU5OjE0IDIwMDYKKyMgTGludXgga2VybmVsIHZlcnNpb246IDIuNi4xOS1yYzMKKyMgTW9uIE9jdCAzMCAxODowNDo0OSAyMDA2CiAjCiBDT05GSUdfU1VQRVJIPXkKIENPTkZJR19SV1NFTV9HRU5FUklDX1NQSU5MT0NLPXkKQEAgLTEwLDYgKzEwLDcgQEAKIENPTkZJR19HRU5FUklDX0hBUkRJUlFTPXkKIENPTkZJR19HRU5FUklDX0lSUV9QUk9CRT15CiBDT05GSUdfR0VORVJJQ19DQUxJQlJBVEVfREVMQVk9eQorIyBDT05GSUdfR0VORVJJQ19USU1FIGlzIG5vdCBzZXQKIENPTkZJR19ERUZDT05GSUdfTElTVD0iL2xpYi9tb2R1bGVzLyRVTkFNRV9SRUxFQVNFLy5jb25maWciCiAKICMKQEAgLTIzLDcgKzI0LDcgQEAKICMgR2VuZXJhbCBzZXR1cAogIwogQ09ORklHX0xPQ0FMVkVSU0lPTj0iIgotQ09ORklHX0xPQ0FMVkVSU0lPTl9BVVRPPXkKKyMgQ09ORklHX0xPQ0FMVkVSU0lPTl9BVVRPIGlzIG5vdCBzZXQKIENPTkZJR19TV0FQPXkKIENPTkZJR19TWVNWSVBDPXkKICMgQ09ORklHX0lQQ19OUyBpcyBub3Qgc2V0CkBAIC0yMzYsOCArMjM3LDggQEAKIENPTkZJR19IWj0yNTAKICMgQ09ORklHX0tFWEVDIGlzIG5vdCBzZXQKICMgQ09ORklHX1NNUCBpcyBub3Qgc2V0Ci1DT05GSUdfUFJFRU1QVF9OT05FPXkKLSMgQ09ORklHX1BSRUVNUFRfVk9MVU5UQVJZIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BSRUVNUFRfTk9ORSBpcyBub3Qgc2V0CitDT05GSUdfUFJFRU1QVF9WT0xVTlRBUlk9eQogIyBDT05GSUdfUFJFRU1QVCBpcyBub3Qgc2V0CiAKICMKQEAgLTI0Nyw3ICsyNDgsNyBAQAogQ09ORklHX0JPT1RfTElOS19PRkZTRVQ9MHgwMDllMDAwMAogIyBDT05GSUdfVUJDX1dBS0VVUCBpcyBub3Qgc2V0CiBDT05GSUdfQ01ETElORV9CT09MPXkKLUNPTkZJR19DTURMSU5FPSJjb25zb2xlPXR0eVNDMSwzODQwME44MSByb290PS9kZXYvbmZzIGlwPTo6Ojo6ZXRoMTphdXRvY29uZiIKK0NPTkZJR19DTURMSU5FPSJjb25zb2xlPXR0eVNDMSwzODQwME44MSByb290PS9kZXYvbmZzIGlwPTo6Ojo6ZXRoMTphdXRvY29uZiBydyIKIAogIwogIyBCdXMgb3B0aW9ucwpAQCAtMzM0LDYgKzMzNSw3IEBACiBDT05GSUdfSU5FVF9UVU5ORUw9eQogQ09ORklHX0lORVRfWEZSTV9NT0RFX1RSQU5TUE9SVD15CiBDT05GSUdfSU5FVF9YRlJNX01PREVfVFVOTkVMPXkKK0NPTkZJR19JTkVUX1hGUk1fTU9ERV9CRUVUPXkKIENPTkZJR19JTkVUX0RJQUc9bQogQ09ORklHX0lORVRfVENQX0RJQUc9bQogIyBDT05GSUdfVENQX0NPTkdfQURWQU5DRUQgaXMgbm90IHNldApAQCAtMzU1LDkgKzM1NywxMCBAQAogQ09ORklHX0lORVQ2X1RVTk5FTD15CiBDT05GSUdfSU5FVDZfWEZSTV9NT0RFX1RSQU5TUE9SVD15CiBDT05GSUdfSU5FVDZfWEZSTV9NT0RFX1RVTk5FTD15CitDT05GSUdfSU5FVDZfWEZSTV9NT0RFX0JFRVQ9eQogIyBDT05GSUdfSU5FVDZfWEZSTV9NT0RFX1JPVVRFT1BUSU1JWkFUSU9OIGlzIG5vdCBzZXQKK0NPTkZJR19JUFY2X1NJVD1tCiBDT05GSUdfSVBWNl9UVU5ORUw9eQotIyBDT05GSUdfSVBWNl9TVUJUUkVFUyBpcyBub3Qgc2V0CiAjIENPTkZJR19JUFY2X01VTFRJUExFX1RBQkxFUyBpcyBub3Qgc2V0CiAjIENPTkZJR19ORVRXT1JLX1NFQ01BUksgaXMgbm90IHNldAogQ09ORklHX05FVEZJTFRFUj15CkBAIC03MTQsNiArNzE3LDEyIEBACiBDT05GSUdfQVRBX09WRVJfRVRIPW0KIAogIworIyBNaXNjIGRldmljZXMKKyMKKyMgQ09ORklHX1NHSV9JT0M0IGlzIG5vdCBzZXQKKyMgQ09ORklHX1RJRk1fQ09SRSBpcyBub3Qgc2V0CisKKyMKICMgQVRBL0FUQVBJL01GTS9STEwgc3VwcG9ydAogIwogIyBDT05GSUdfSURFIGlzIG5vdCBzZXQKQEAgLTc3OCw5ICs3ODcsOSBAQAogIyBDT05GSUdfU0NTSV9JTklBMTAwIGlzIG5vdCBzZXQKICMgQ09ORklHX1NDU0lfU1RFWCBpcyBub3Qgc2V0CiAjIENPTkZJR19TQ1NJX1NZTTUzQzhYWF8yIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NDU0lfSVBSIGlzIG5vdCBzZXQKICMgQ09ORklHX1NDU0lfUUxPR0lDXzEyODAgaXMgbm90IHNldAogIyBDT05GSUdfU0NTSV9RTEFfRkMgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9RTEFfSVNDU0kgaXMgbm90IHNldAogIyBDT05GSUdfU0NTSV9MUEZDIGlzIG5vdCBzZXQKICMgQ09ORklHX1NDU0lfREMzOTV4IGlzIG5vdCBzZXQKICMgQ09ORklHX1NDU0lfREMzOTBUIGlzIG5vdCBzZXQKQEAgLTEwOTUsNyArMTEwNCw2IEBACiAjIFRQTSBkZXZpY2VzCiAjCiAjIENPTkZJR19UQ0dfVFBNIGlzIG5vdCBzZXQKLSMgQ09ORklHX1RFTENMT0NLIGlzIG5vdCBzZXQKIAogIwogIyBJMkMgc3VwcG9ydApAQCAtMTEyNCwxNCArMTEzMiw5IEBACiAjIENPTkZJR19IV01PTl9ERUJVR19DSElQIGlzIG5vdCBzZXQKIAogIwotIyBNaXNjIGRldmljZXMKLSMKLQotIwogIyBNdWx0aW1lZGlhIGRldmljZXMKICMKICMgQ09ORklHX1ZJREVPX0RFViBpcyBub3Qgc2V0Ci1DT05GSUdfVklERU9fVjRMMj15CiAKICMKICMgRGlnaXRhbCBWaWRlbyBCcm9hZGNhc3RpbmcgRGV2aWNlcwpAQCAtMTE3Nyw5ICsxMTgwLDkgQEAKICMgVVNCIEhvc3QgQ29udHJvbGxlciBEcml2ZXJzCiAjCiBDT05GSUdfVVNCX0VIQ0lfSENEPXkKLSMgQ09ORklHX1VTQl9FSENJX1NQTElUX0lTTyBpcyBub3Qgc2V0Ci0jIENPTkZJR19VU0JfRUhDSV9ST09UX0hVQl9UVCBpcyBub3Qgc2V0Ci0jIENPTkZJR19VU0JfRUhDSV9UVF9ORVdTQ0hFRCBpcyBub3Qgc2V0CitDT05GSUdfVVNCX0VIQ0lfU1BMSVRfSVNPPXkKK0NPTkZJR19VU0JfRUhDSV9ST09UX0hVQl9UVD15CitDT05GSUdfVVNCX0VIQ0lfVFRfTkVXU0NIRUQ9eQogIyBDT05GSUdfVVNCX0lTUDExNlhfSENEIGlzIG5vdCBzZXQKIENPTkZJR19VU0JfT0hDSV9IQ0Q9eQogIyBDT05GSUdfVVNCX09IQ0lfQklHX0VORElBTiBpcyBub3Qgc2V0CkBAIC0xMjM1LDcgKzEyMzgsNiBAQAogIyBDT05GSUdfVVNCX0FUSV9SRU1PVEUyIGlzIG5vdCBzZXQKICMgQ09ORklHX1VTQl9LRVlTUEFOX1JFTU9URSBpcyBub3Qgc2V0CiAjIENPTkZJR19VU0JfQVBQTEVUT1VDSCBpcyBub3Qgc2V0Ci0jIENPTkZJR19VU0JfVFJBTkNFVklCUkFUT1IgaXMgbm90IHNldAogCiAjCiAjIFVTQiBJbWFnaW5nIGRldmljZXMKQEAgLTEyNDYsMTEgKzEyNDgsMjAgQEAKICMKICMgVVNCIE5ldHdvcmsgQWRhcHRlcnMKICMKLSMgQ09ORklHX1VTQl9DQVRDIGlzIG5vdCBzZXQKLSMgQ09ORklHX1VTQl9LQVdFVEggaXMgbm90IHNldAotIyBDT05GSUdfVVNCX1BFR0FTVVMgaXMgbm90IHNldAotIyBDT05GSUdfVVNCX1JUTDgxNTAgaXMgbm90IHNldAotIyBDT05GSUdfVVNCX1VTQk5FVCBpcyBub3Qgc2V0CitDT05GSUdfVVNCX0NBVEM9bQorQ09ORklHX1VTQl9LQVdFVEg9bQorQ09ORklHX1VTQl9QRUdBU1VTPW0KK0NPTkZJR19VU0JfUlRMODE1MD1tCitDT05GSUdfVVNCX1VTQk5FVD1tCitDT05GSUdfVVNCX05FVF9BWDg4MTdYPW0KK0NPTkZJR19VU0JfTkVUX0NEQ0VUSEVSPW0KKyMgQ09ORklHX1VTQl9ORVRfR0w2MjBBIGlzIG5vdCBzZXQKK0NPTkZJR19VU0JfTkVUX05FVDEwODA9bQorQ09ORklHX1VTQl9ORVRfUExVU0I9bQorIyBDT05GSUdfVVNCX05FVF9NQ1M3ODMwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9ORVRfUk5ESVNfSE9TVCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfTkVUX0NEQ19TVUJTRVQgaXMgbm90IHNldAorQ09ORklHX1VTQl9ORVRfWkFVUlVTPW0KIENPTkZJR19VU0JfTU9OPXkKIAogIwpAQCAtMTI4NSw2ICsxMjk2LDcgQEAKICMgQ09ORklHX1VTQl9TRVJJQUxfS0xTSSBpcyBub3Qgc2V0CiAjIENPTkZJR19VU0JfU0VSSUFMX0tPQklMX1NDVCBpcyBub3Qgc2V0CiAjIENPTkZJR19VU0JfU0VSSUFMX01DVF9VMjMyIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9TRVJJQUxfTU9TNzcyMCBpcyBub3Qgc2V0CiAjIENPTkZJR19VU0JfU0VSSUFMX01PUzc4NDAgaXMgbm90IHNldAogIyBDT05GSUdfVVNCX1NFUklBTF9OQVZNQU4gaXMgbm90IHNldAogQ09ORklHX1VTQl9TRVJJQUxfUEwyMzAzPW0KQEAgLTEzMTYsNiArMTMyOCw3IEBACiAjIENPTkZJR19VU0JfQVBQTEVESVNQTEFZIGlzIG5vdCBzZXQKICMgQ09ORklHX1VTQl9TSVNVU0JWR0EgaXMgbm90IHNldAogIyBDT05GSUdfVVNCX0xEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9UUkFOQ0VWSUJSQVRPUiBpcyBub3Qgc2V0CiAjIENPTkZJR19VU0JfVEVTVCBpcyBub3Qgc2V0CiAKICMKQEAgLTEzNTcsNyArMTM3MCwyNiBAQAogIwogIyBSZWFsIFRpbWUgQ2xvY2sKICMKLSMgQ09ORklHX1JUQ19DTEFTUyBpcyBub3Qgc2V0CitDT05GSUdfUlRDX0xJQj1tCitDT05GSUdfUlRDX0NMQVNTPW0KKworIworIyBSVEMgaW50ZXJmYWNlcworIworQ09ORklHX1JUQ19JTlRGX1NZU0ZTPW0KK0NPTkZJR19SVENfSU5URl9QUk9DPW0KK0NPTkZJR19SVENfSU5URl9ERVY9bQorIyBDT05GSUdfUlRDX0lOVEZfREVWX1VJRV9FTVVMIGlzIG5vdCBzZXQKKworIworIyBSVEMgZHJpdmVycworIworIyBDT05GSUdfUlRDX0RSVl9EUzE1NTMgaXMgbm90IHNldAorIyBDT05GSUdfUlRDX0RSVl9EUzE3NDIgaXMgbm90IHNldAorIyBDT05GSUdfUlRDX0RSVl9NNDhUODYgaXMgbm90IHNldAorQ09ORklHX1JUQ19EUlZfU0g9bQorIyBDT05GSUdfUlRDX0RSVl9URVNUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQ19EUlZfVjMwMjAgaXMgbm90IHNldAogCiAjCiAjIERNQSBFbmdpbmUgc3VwcG9ydApAQCAtMTM4MCw4ICsxNDEyLDEyIEBACiAjIENPTkZJR19FWFQyX0ZTX1hJUCBpcyBub3Qgc2V0CiBDT05GSUdfRVhUM19GUz15CiAjIENPTkZJR19FWFQzX0ZTX1hBVFRSIGlzIG5vdCBzZXQKK0NPTkZJR19FWFQ0REVWX0ZTPW0KKyMgQ09ORklHX0VYVDRERVZfRlNfWEFUVFIgaXMgbm90IHNldAogQ09ORklHX0pCRD15CiAjIENPTkZJR19KQkRfREVCVUcgaXMgbm90IHNldAorQ09ORklHX0pCRDI9bQorIyBDT05GSUdfSkJEMl9ERUJVRyBpcyBub3Qgc2V0CiBDT05GSUdfUkVJU0VSRlNfRlM9bQogIyBDT05GSUdfUkVJU0VSRlNfQ0hFQ0sgaXMgbm90IHNldAogIyBDT05GSUdfUkVJU0VSRlNfUFJPQ19JTkZPIGlzIG5vdCBzZXQKQEAgLTEzOTMsOSArMTQyOSwxMCBAQAogIyBDT05GSUdfWEZTX1NFQ1VSSVRZIGlzIG5vdCBzZXQKICMgQ09ORklHX1hGU19QT1NJWF9BQ0wgaXMgbm90IHNldAogIyBDT05GSUdfWEZTX1JUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0dGUzJfRlMgaXMgbm90IHNldAogIyBDT05GSUdfT0NGUzJfRlMgaXMgbm90IHNldAogIyBDT05GSUdfTUlOSVhfRlMgaXMgbm90IHNldAotIyBDT05GSUdfUk9NRlNfRlMgaXMgbm90IHNldAorQ09ORklHX1JPTUZTX0ZTPXkKIENPTkZJR19JTk9USUZZPXkKIENPTkZJR19JTk9USUZZX1VTRVI9eQogIyBDT05GSUdfUVVPVEEgaXMgbm90IHNldApAQCAtMTQ4MCw3ICsxNTE3LDEyIEBACiAjIENPTkZJR19SUENTRUNfR1NTX1NQS00zIGlzIG5vdCBzZXQKIENPTkZJR19TTUJfRlM9bQogIyBDT05GSUdfU01CX05MU19ERUZBVUxUIGlzIG5vdCBzZXQKLSMgQ09ORklHX0NJRlMgaXMgbm90IHNldAorQ09ORklHX0NJRlM9bQorIyBDT05GSUdfQ0lGU19TVEFUUyBpcyBub3Qgc2V0CitDT05GSUdfQ0lGU19XRUFLX1BXX0hBU0g9eQorIyBDT05GSUdfQ0lGU19YQVRUUiBpcyBub3Qgc2V0CisjIENPTkZJR19DSUZTX0RFQlVHMiBpcyBub3Qgc2V0CisjIENPTkZJR19DSUZTX0VYUEVSSU1FTlRBTCBpcyBub3Qgc2V0CiAjIENPTkZJR19OQ1BfRlMgaXMgbm90IHNldAogIyBDT05GSUdfQ09EQV9GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19BRlNfRlMgaXMgbm90IHNldApAQCAtMTU4Myw5ICsxNjI1LDEwIEBACiAjIENPTkZJR19ERUJVR19MSVNUIGlzIG5vdCBzZXQKICMgQ09ORklHX0ZSQU1FX1BPSU5URVIgaXMgbm90IHNldAogIyBDT05GSUdfRk9SQ0VEX0lOTElOSU5HIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hFQURFUlNfQ0hFQ0sgaXMgbm90IHNldAogIyBDT05GSUdfUkNVX1RPUlRVUkVfVEVTVCBpcyBub3Qgc2V0CiAjIENPTkZJR19TSF9TVEFOREFSRF9CSU9TIGlzIG5vdCBzZXQKLUNPTkZJR19FQVJMWV9TQ0lGX0NPTlNPTEU9eQorIyBDT05GSUdfRUFSTFlfU0NJRl9DT05TT0xFIGlzIG5vdCBzZXQKICMgQ09ORklHX0VBUkxZX1BSSU5USyBpcyBub3Qgc2V0CiAjIENPTkZJR19ERUJVR19TVEFDS09WRVJGTE9XIGlzIG5vdCBzZXQKICMgQ09ORklHX0RFQlVHX1NUQUNLX1VTQUdFIGlzIG5vdCBzZXQKQEAgLTE2MDUsNyArMTY0OCw3IEBACiBDT05GSUdfQ1JZUFRPX0FMR0FQST15CiBDT05GSUdfQ1JZUFRPX0JMS0NJUEhFUj15CiBDT05GSUdfQ1JZUFRPX0hBU0g9eQotQ09ORklHX0NSWVBUT19NQU5BR0VSPW0KK0NPTkZJR19DUllQVE9fTUFOQUdFUj15CiBDT05GSUdfQ1JZUFRPX0hNQUM9eQogQ09ORklHX0NSWVBUT19OVUxMPW0KIENPTkZJR19DUllQVE9fTUQ0PW0KQEAgLTE2MTUsNyArMTY1OCw3IEBACiBDT05GSUdfQ1JZUFRPX1NIQTUxMj1tCiBDT05GSUdfQ1JZUFRPX1dQNTEyPW0KIENPTkZJR19DUllQVE9fVEdSMTkyPW0KLUNPTkZJR19DUllQVE9fRUNCPW0KK0NPTkZJR19DUllQVE9fRUNCPXkKIENPTkZJR19DUllQVE9fQ0JDPXkKIENPTkZJR19DUllQVE9fREVTPXkKIENPTkZJR19DUllQVE9fQkxPV0ZJU0g9bQpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9kcml2ZXJzL2RtYS9kbWEtZzIuYyBiL2FyY2gvc2gvZHJpdmVycy9kbWEvZG1hLWcyLmMKaW5kZXggOWNiMDcwOS4uMGNhZjExYiAxMDA2NDQKLS0tIGEvYXJjaC9zaC9kcml2ZXJzL2RtYS9kbWEtZzIuYworKysgYi9hcmNoL3NoL2RyaXZlcnMvZG1hL2RtYS1nMi5jCkBAIC01MSw3ICs1MSw3IEBACiAJKChnMl9kbWEtPmNoYW5uZWxbaV0uc2l6ZSAtIFwKIAkgIGcyX2RtYS0+c3RhdHVzW2ldLnNpemUpICYgMHgwZmZmZmZmZikKIAotc3RhdGljIGlycXJldHVybl90IGcyX2RtYV9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3N0YXRpYyBpcnFyZXR1cm5fdCBnMl9kbWFfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCkKIHsKIAlpbnQgaTsKIApkaWZmIC0tZ2l0IGEvYXJjaC9zaC9kcml2ZXJzL2RtYS9kbWEtcHZyMi5jIGIvYXJjaC9zaC9kcml2ZXJzL2RtYS9kbWEtcHZyMi5jCmluZGV4IGMxYjZiYzIuLjgzOGZhZDUgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gvZHJpdmVycy9kbWEvZG1hLXB2cjIuYworKysgYi9hcmNoL3NoL2RyaXZlcnMvZG1hL2RtYS1wdnIyLmMKQEAgLTIxLDcgKzIxLDcgQEAKIHN0YXRpYyB1bnNpZ25lZCBpbnQgeGZlcl9jb21wbGV0ZTsKIHN0YXRpYyBpbnQgY291bnQ7CiAKLXN0YXRpYyBpcnFyZXR1cm5fdCBwdnIyX2RtYV9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3N0YXRpYyBpcnFyZXR1cm5fdCBwdnIyX2RtYV9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkKQogewogCWlmIChnZXRfZG1hX3Jlc2lkdWUoUFZSMl9DQVNDQURFX0NIQU4pKSB7CiAJCXByaW50ayhLRVJOX1dBUk5JTkcgIkRNQTogU0ggRE1BQyBkaWQgbm90IGNvbXBsZXRlIHRyYW5zZmVyICIKZGlmZiAtLWdpdCBhL2FyY2gvc2gvZHJpdmVycy9kbWEvZG1hLXNoLmMgYi9hcmNoL3NoL2RyaXZlcnMvZG1hL2RtYS1zaC5jCmluZGV4IGNiYmU4YmMuLjY2MDc4NjAgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gvZHJpdmVycy9kbWEvZG1hLXNoLmMKKysrIGIvYXJjaC9zaC9kcml2ZXJzL2RtYS9kbWEtc2guYwpAQCAtMTksMjMgKzE5LDM0IEBACiAjaW5jbHVkZSA8YXNtL2lvLmg+CiAjaW5jbHVkZSAiZG1hLXNoLmgiCiAKLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IGdldF9kbXRlX2lycSh1bnNpZ25lZCBpbnQgY2hhbikKLXsKLQl1bnNpZ25lZCBpbnQgaXJxID0gMDsKIAorCisjaWZkZWYgQ09ORklHX0NQVV9TSDQKK3N0YXRpYyBzdHJ1Y3QgaXByX2RhdGEgZG1hZV9pcHJfbWFwW10gPSB7CisJeyBETUFFX0lSUSwgRE1BX0lQUl9BRERSLCBETUFfSVBSX1BPUywgRE1BX1BSSU9SSVRZIH0sCit9OworI2VuZGlmCitzdGF0aWMgc3RydWN0IGlwcl9kYXRhIGRtdGVfaXByX21hcFtdID0gewogCS8qCiAJICogTm9ybWFsbHkgd2UgY291bGQganVzdCBkbyBETVRFMF9JUlEgKyBjaGFuIG91dHJpZ2h0LCB0aG91Z2ggaW4gdGhlCiAJICogY2FzZSBvZiB0aGUgNzc1MVIsIHRoZSBETVRFIElSUXMgZm9yIGNoYW5uZWxzID4gNCBzdGFydCByaWdodCBhYm92ZQogCSAqIHRoZSBTQ0lGCiAJICovCi0JaWYgKGNoYW4gPCA0KSB7Ci0JCWlycSA9IERNVEUwX0lSUSArIGNoYW47Ci0JfSBlbHNlIHsKLSNpZmRlZiBETVRFNF9JUlEKLQkJaXJxID0gRE1URTRfSVJRICsgY2hhbiAtIDQ7Ci0jZW5kaWYKLQl9CisJeyBETVRFMF9JUlEgKyAwLCBETUFfSVBSX0FERFIsIERNQV9JUFJfUE9TLCBETUFfUFJJT1JJVFkgfSwKKwl7IERNVEUwX0lSUSArIDEsIERNQV9JUFJfQUREUiwgRE1BX0lQUl9QT1MsIERNQV9QUklPUklUWSB9LAorCXsgRE1URTBfSVJRICsgMiwgRE1BX0lQUl9BRERSLCBETUFfSVBSX1BPUywgRE1BX1BSSU9SSVRZIH0sCisJeyBETVRFMF9JUlEgKyAzLCBETUFfSVBSX0FERFIsIERNQV9JUFJfUE9TLCBETUFfUFJJT1JJVFkgfSwKKwl7IERNVEU0X0lSUSArIDAsIERNQV9JUFJfQUREUiwgRE1BX0lQUl9QT1MsIERNQV9QUklPUklUWSB9LAorCXsgRE1URTRfSVJRICsgMSwgRE1BX0lQUl9BRERSLCBETUFfSVBSX1BPUywgRE1BX1BSSU9SSVRZIH0sCisJeyBETVRFNF9JUlEgKyAyLCBETUFfSVBSX0FERFIsIERNQV9JUFJfUE9TLCBETUFfUFJJT1JJVFkgfSwKKwl7IERNVEU0X0lSUSArIDMsIERNQV9JUFJfQUREUiwgRE1BX0lQUl9QT1MsIERNQV9QUklPUklUWSB9LAorfTsKIAorc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgZ2V0X2RtdGVfaXJxKHVuc2lnbmVkIGludCBjaGFuKQoreworCXVuc2lnbmVkIGludCBpcnEgPSAwOworCWlmIChjaGFuIDwgQVJSQVlfU0laRShkbXRlX2lwcl9tYXApKQorCQlpcnEgPSBkbXRlX2lwcl9tYXBbY2hhbl0uaXJxOwogCXJldHVybiBpcnE7CiB9CiAKQEAgLTYwLDkgKzcxLDkgQEAKICAqIEJlc2lkZXMgdGhhdCBpdCBuZWVkcyB0byB3YWtlbiBhbnkgd2FpdGluZyBwcm9jZXNzLCB3aGljaCBzaG91bGQgaGFuZGxlCiAgKiBzZXR0aW5nIHVwIHRoZSBuZXh0IHRyYW5zZmVyLgogICovCi1zdGF0aWMgaXJxcmV0dXJuX3QgZG1hX3RlaShpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQorc3RhdGljIGlycXJldHVybl90IGRtYV90ZWkoaW50IGlycSwgdm9pZCAqZGV2X2lkKQogewotCXN0cnVjdCBkbWFfY2hhbm5lbCAqY2hhbiA9IChzdHJ1Y3QgZG1hX2NoYW5uZWwgKilkZXZfaWQ7CisJc3RydWN0IGRtYV9jaGFubmVsICpjaGFuID0gZGV2X2lkOwogCXUzMiBjaGNyOwogCiAJY2hjciA9IGN0cmxfaW5sKENIQ1JbY2hhbi0+Y2hhbl0pOwpAQCAtMjI4LDcgKzIzOSw3IEBACiB9CiAKICNpZiBkZWZpbmVkKENPTkZJR19DUFVfU0g0KQotc3RhdGljIGlycXJldHVybl90IGRtYV9lcnIoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3N0YXRpYyBpcnFyZXR1cm5fdCBkbWFfZXJyKGludCBpcnEsIHZvaWQgKmR1bW15KQogewogCWRtYW9yX3Jlc2V0KCk7CiAJZGlzYWJsZV9pcnEoaXJxKTsKQEAgLTI1OCwxNyArMjY5LDE2IEBACiAJaW50IGk7CiAKICNpZmRlZiBDT05GSUdfQ1BVX1NINAotCW1ha2VfaXByX2lycShETUFFX0lSUSwgRE1BX0lQUl9BRERSLCBETUFfSVBSX1BPUywgRE1BX1BSSU9SSVRZKTsKKwltYWtlX2lwcl9pcnEoZG1hZV9pcHJfbWFwLCBBUlJBWV9TSVpFKGRtYWVfaXByX21hcCkpOwogCWkgPSByZXF1ZXN0X2lycShETUFFX0lSUSwgZG1hX2VyciwgSVJRRl9ESVNBQkxFRCwgIkRNQUMgQWRkcmVzcyBFcnJvciIsIDApOwogCWlmICh1bmxpa2VseShpIDwgMCkpCiAJCXJldHVybiBpOwogI2VuZGlmCiAKLQlmb3IgKGkgPSAwOyBpIDwgaW5mby0+bnJfY2hhbm5lbHM7IGkrKykgewotCQlpbnQgaXJxID0gZ2V0X2RtdGVfaXJxKGkpOwotCi0JCW1ha2VfaXByX2lycShpcnEsIERNQV9JUFJfQUREUiwgRE1BX0lQUl9QT1MsIERNQV9QUklPUklUWSk7Ci0JfQorCWkgPSBpbmZvLT5ucl9jaGFubmVsczsKKwlpZiAoaSA+IEFSUkFZX1NJWkUoZG10ZV9pcHJfbWFwKSkKKwkJaSA9IEFSUkFZX1NJWkUoZG10ZV9pcHJfbWFwKTsKKwltYWtlX2lwcl9pcnEoZG10ZV9pcHJfbWFwLCBpKTsKIAogCS8qCiAJICogSW5pdGlhbGl6ZSBETUFPUiwgYW5kIGNsZWFuIHVwIGFueSBlcnJvciBmbGFncyB0aGF0IG1heSBoYXZlCmRpZmYgLS1naXQgYS9hcmNoL3NoL2RyaXZlcnMvcGNpL29wcy1yNzc4MHJwLmMgYi9hcmNoL3NoL2RyaXZlcnMvcGNpL29wcy1yNzc4MHJwLmMKaW5kZXggNmUzYmE5YzYuLmVlZWExNTcgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gvZHJpdmVycy9wY2kvb3BzLXI3NzgwcnAuYworKysgYi9hcmNoL3NoL2RyaXZlcnMvcGNpL29wcy1yNzc4MHJwLmMKQEAgLTEzLDcgKzEzLDcgQEAKICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KLSNpbmNsdWRlIDxhc20vcjc3ODBycC9yNzc4MHJwLmg+CisjaW5jbHVkZSA8YXNtL3I3NzgwcnAuaD4KICNpbmNsdWRlIDxhc20vaW8uaD4KICNpbmNsdWRlICJwY2ktc2g0LmgiCiAKZGlmZiAtLWdpdCBhL2FyY2gvc2gvZHJpdmVycy9wY2kvb3BzLXJ0czc3NTFyMmQuYyBiL2FyY2gvc2gvZHJpdmVycy9wY2kvb3BzLXJ0czc3NTFyMmQuYwppbmRleCBiNjg4MjRjLi40YTUxOGQ5IDEwMDY0NAotLS0gYS9hcmNoL3NoL2RyaXZlcnMvcGNpL29wcy1ydHM3NzUxcjJkLmMKKysrIGIvYXJjaC9zaC9kcml2ZXJzL3BjaS9vcHMtcnRzNzc1MXIyZC5jCkBAIC0xMCwyOCArMTAsMjQgQEAKICAqCiAgKiBQQ0kgaW5pdGlhbGl6YXRpb24gZm9yIHRoZSBSZW5lc2FzIFNINzc1MVIgUlRTNzc1MVIyRCBib2FyZAogICovCi0KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGFzbS9ydHM3NzUxcjJkL3J0czc3NTFyMmQuaD4KLSNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgorI2luY2x1ZGUgPGFzbS9ydHM3NzUxcjJkLmg+CiAjaW5jbHVkZSAicGNpLXNoNC5oIgogCitzdGF0aWMgdTggcnRzNzc1MXIyZF9pcnFfdGFiW10gX19pbml0ZGF0YSA9IHsKKwlJUlFfUENJU0xPVDEsCisJSVJRX1BDSVNMT1QyLAorCUlSUV9QQ01DSUEsCisJSVJRX1BDSUVUSCwKK307CisKIGludCBfX2luaXQgcGNpYmlvc19tYXBfcGxhdGZvcm1faXJxKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCB1OCBzbG90LCB1OCBwaW4pCiB7Ci0gICAgICAgIHN3aXRjaCAoc2xvdCkgewotCWNhc2UgMDogcmV0dXJuIElSUV9QQ0lTTE9UMTsJLyogUENJIEV4dGVuZCBzbG90ICMxICovCi0JY2FzZSAxOiByZXR1cm4gSVJRX1BDSVNMT1QyOwkvKiBQQ0kgRXh0ZW5kIHNsb3QgIzIgKi8KLQljYXNlIDI6IHJldHVybiBJUlFfUENNQ0lBOwkvKiBQQ0kgQ2FyZGJ1cyBCcmlkZ2UgKi8KLQljYXNlIDM6IHJldHVybiBJUlFfUENJRVRIOwkvKiBSZWFsdGVrIEV0aGVybmV0IGNvbnRyb2xsZXIgKi8KLQlkZWZhdWx0OgotCQlwcmludGsoIlBDSTogQmFkIElSUSBtYXBwaW5nIHJlcXVlc3QgZm9yIHNsb3QgJWRcbiIsIHNsb3QpOwotCQlyZXR1cm4gLTE7Ci0JfQorCXJldHVybiBydHM3NzUxcjJkX2lycV90YWJbc2xvdF07CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgcmVzb3VyY2Ugc2g3NzUxX2lvX3Jlc291cmNlID0gewpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9kcml2ZXJzL3BjaS9wY2ktc2g3NzUxLmMgYi9hcmNoL3NoL2RyaXZlcnMvcGNpL3BjaS1zaDc3NTEuYwppbmRleCBkYmU4Mzc4Li44NWUxZWUyIDEwMDY0NAotLS0gYS9hcmNoL3NoL2RyaXZlcnMvcGNpL3BjaS1zaDc3NTEuYworKysgYi9hcmNoL3NoL2RyaXZlcnMvcGNpL3BjaS1zaDc3NTEuYwpAQCAtMTU1LDcgKzE1NSw3IEBACiAJICovCiAJcHJfZGVidWcoIlBDSTogTWFwcGluZyBJTyBhZGRyZXNzIDB4JXggLSAweCV4IHRvIGJhc2UgMHgleFxuIiwKIAkJIFBDSUJJT1NfTUlOX0lPLCAoNjQgPDwgMTApLAotCQkgU0g0X1BDSV9JT19CQVNFICsgUENJQklPU19NSU5fSU8pOworCQkgU0g3NzUxX1BDSV9JT19CQVNFICsgUENJQklPU19NSU5fSU8pOwogCiAJLyoKIAkgKiBYWFg6IEZvciBub3csIGxlYXZlIHRoaXMgYm9hcmQtc3BlY2lmaWMuIEluIHRoZSBldmVudCB3ZSBoYXZlIG90aGVyCkBAIC0xNjMsNyArMTYzLDcgQEAKIAkgKi8KICNpZmRlZiBDT05GSUdfU0hfQklHU1VSCiAJYmlnc3VyX3BvcnRfbWFwKFBDSUJJT1NfTUlOX0lPLCAoNjQgPDwgMTApLAotCQkJU0g0X1BDSV9JT19CQVNFICsgUENJQklPU19NSU5fSU8sIDApOworCQkJU0g3NzUxX1BDSV9JT19CQVNFICsgUENJQklPU19NSU5fSU8sIDApOwogI2VuZGlmCiAKIAkvKiBNYWtlIHN1cmUgdGhlIE1TQidzIG9mIElPIHdpbmRvdyBhcmUgc2V0IHRvIGFjY2VzcyBQQ0kgc3BhY2UKZGlmZiAtLWdpdCBhL2FyY2gvc2gvZHJpdmVycy9wY2kvcGNpLXN0NDAuYyBiL2FyY2gvc2gvZHJpdmVycy9wY2kvcGNpLXN0NDAuYwppbmRleCA0YWI1ZWE2Li5lZmVjYjNkIDEwMDY0NAotLS0gYS9hcmNoL3NoL2RyaXZlcnMvcGNpL3BjaS1zdDQwLmMKKysrIGIvYXJjaC9zaC9kcml2ZXJzL3BjaS9wY2ktc3Q0MC5jCkBAIC0xNjEsNyArMTYxLDcgQEAKIAkiTWVtb3J5IFdyaXRlLWFuZC1JbnZhbGlkYXRlIgogfTsKIAotc3RhdGljIGlycXJldHVybl90IHN0NDBfcGNpX2lycShpbnQgaXJxLCB2b2lkICpkZXZfaW5zdGFuY2UsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQorc3RhdGljIGlycXJldHVybl90IHN0NDBfcGNpX2lycShpbnQgaXJxLCB2b2lkICpkZXZfaW5zdGFuY2UpCiB7CiAJdW5zaWduZWQgcGNpX2ludCwgcGNpX2FpciwgcGNpX2NpciwgcGNpX2FpbnQ7CiAJc3RhdGljIGludCBjb3VudD0wOwpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9rZXJuZWwvY3B1L2lycS9pbnRjMi5jIGIvYXJjaC9zaC9rZXJuZWwvY3B1L2lycS9pbnRjMi5jCmluZGV4IGUzMGU0YjcuLjc0Y2E1NzYgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gva2VybmVsL2NwdS9pcnEvaW50YzIuYworKysgYi9hcmNoL3NoL2tlcm5lbC9jcHUvaXJxL2ludGMyLmMKQEAgLTEwLDkzICsxMCwzMSBAQAogICogVGhlc2UgYXJlIHRoZSAibmV3IEhpdGFjaGkgc3R5bGUiIGludGVycnVwdHMsIGFzIHByZXNlbnQgb24gdGhlCiAgKiBIaXRhY2hpIDc3NTEsIHRoZSBTVE0gU1Q0MCBTVEIxLCBTSDc3NjAsIGFuZCBTSDc3ODAuCiAgKi8KLQogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9pcnEuaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgogI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KLSNpbmNsdWRlIDxhc20vaW8uaD4KLSNpbmNsdWRlIDxhc20vbWFjaHZlYy5oPgotCi1zdHJ1Y3QgaW50YzJfZGF0YSB7Ci0JdW5zaWduZWQgY2hhciBtc2tfb2Zmc2V0OwotCXVuc2lnbmVkIGNoYXIgbXNrX3NoaWZ0OwotCi0JaW50ICgqY2xlYXJfaXJxKSAoaW50KTsKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgaW50YzJfZGF0YSBpbnRjMl9kYXRhW05SX0lOVEMyX0lSUVNdOwotCi1zdGF0aWMgdm9pZCBlbmFibGVfaW50YzJfaXJxKHVuc2lnbmVkIGludCBpcnEpOwotc3RhdGljIHZvaWQgZGlzYWJsZV9pbnRjMl9pcnEodW5zaWduZWQgaW50IGlycSk7Ci0KLS8qIHNodXRkb3duIGlzIHNhbWUgYXMgImRpc2FibGUiICovCi0jZGVmaW5lIHNodXRkb3duX2ludGMyX2lycSBkaXNhYmxlX2ludGMyX2lycQotCi1zdGF0aWMgdm9pZCBtYXNrX2FuZF9hY2tfaW50YzIodW5zaWduZWQgaW50KTsKLXN0YXRpYyB2b2lkIGVuZF9pbnRjMl9pcnEodW5zaWduZWQgaW50IGlycSk7Ci0KLXN0YXRpYyB1bnNpZ25lZCBpbnQgc3RhcnR1cF9pbnRjMl9pcnEodW5zaWduZWQgaW50IGlycSkKLXsKLQllbmFibGVfaW50YzJfaXJxKGlycSk7Ci0JcmV0dXJuIDA7IC8qIG5ldmVyIGFueXRoaW5nIHBlbmRpbmcgKi8KLX0KLQotc3RhdGljIHN0cnVjdCBod19pbnRlcnJ1cHRfdHlwZSBpbnRjMl9pcnFfdHlwZSA9IHsKLQkudHlwZW5hbWUJPSAiSU5UQzItSVJRIiwKLQkuc3RhcnR1cAk9IHN0YXJ0dXBfaW50YzJfaXJxLAotCS5zaHV0ZG93bgk9IHNodXRkb3duX2ludGMyX2lycSwKLQkuZW5hYmxlCQk9IGVuYWJsZV9pbnRjMl9pcnEsCi0JLmRpc2FibGUJPSBkaXNhYmxlX2ludGMyX2lycSwKLQkuYWNrCQk9IG1hc2tfYW5kX2Fja19pbnRjMiwKLQkuZW5kCQk9IGVuZF9pbnRjMl9pcnEKLX07CiAKIHN0YXRpYyB2b2lkIGRpc2FibGVfaW50YzJfaXJxKHVuc2lnbmVkIGludCBpcnEpCiB7Ci0JaW50IGlycV9vZmZzZXQgPSBpcnEgLSBJTlRDMl9GSVJTVF9JUlE7Ci0JaW50IG1za19zaGlmdCwgbXNrX29mZnNldDsKLQotCS8qIFNhbml0eSBjaGVjayAqLwotCWlmICh1bmxpa2VseShpcnFfb2Zmc2V0IDwgMCB8fCBpcnFfb2Zmc2V0ID49IE5SX0lOVEMyX0lSUVMpKQotCQlyZXR1cm47Ci0KLQltc2tfc2hpZnQgPSBpbnRjMl9kYXRhW2lycV9vZmZzZXRdLm1za19zaGlmdDsKLQltc2tfb2Zmc2V0ID0gaW50YzJfZGF0YVtpcnFfb2Zmc2V0XS5tc2tfb2Zmc2V0OwotCi0JY3RybF9vdXRsKDEgPDwgbXNrX3NoaWZ0LAotCQkgIElOVEMyX0JBU0UgKyBJTlRDMl9JTlRNU0tfT0ZGU0VUICsgbXNrX29mZnNldCk7CisJc3RydWN0IGludGMyX2RhdGEgKnAgPSBnZXRfaXJxX2NoaXBfZGF0YShpcnEpOworCWN0cmxfb3V0bCgxIDw8IHAtPm1za19zaGlmdCwKKwkJICBJTlRDMl9CQVNFICsgSU5UQzJfSU5UTVNLX09GRlNFVCArIHAtPm1za19vZmZzZXQpOwogfQogCiBzdGF0aWMgdm9pZCBlbmFibGVfaW50YzJfaXJxKHVuc2lnbmVkIGludCBpcnEpCiB7Ci0JaW50IGlycV9vZmZzZXQgPSBpcnEgLSBJTlRDMl9GSVJTVF9JUlE7Ci0JaW50IG1za19zaGlmdCwgbXNrX29mZnNldDsKLQotCS8qIFNhbml0eSBjaGVjayAqLwotCWlmICh1bmxpa2VseShpcnFfb2Zmc2V0IDwgMCB8fCBpcnFfb2Zmc2V0ID49IE5SX0lOVEMyX0lSUVMpKQotCQlyZXR1cm47Ci0KLQltc2tfc2hpZnQgPSBpbnRjMl9kYXRhW2lycV9vZmZzZXRdLm1za19zaGlmdDsKLQltc2tfb2Zmc2V0ID0gaW50YzJfZGF0YVtpcnFfb2Zmc2V0XS5tc2tfb2Zmc2V0OwotCi0JY3RybF9vdXRsKDEgPDwgbXNrX3NoaWZ0LAotCQkgIElOVEMyX0JBU0UgKyBJTlRDMl9JTlRNU0tDTFJfT0ZGU0VUICsgbXNrX29mZnNldCk7CisJc3RydWN0IGludGMyX2RhdGEgKnAgPSBnZXRfaXJxX2NoaXBfZGF0YShpcnEpOworCWN0cmxfb3V0bCgxIDw8IHAtPm1za19zaGlmdCwKKwkJICBJTlRDMl9CQVNFICsgSU5UQzJfSU5UTVNLQ0xSX09GRlNFVCArIHAtPm1za19vZmZzZXQpOwogfQogCi1zdGF0aWMgdm9pZCBtYXNrX2FuZF9hY2tfaW50YzIodW5zaWduZWQgaW50IGlycSkKLXsKLQlkaXNhYmxlX2ludGMyX2lycShpcnEpOwotfQotCi1zdGF0aWMgdm9pZCBlbmRfaW50YzJfaXJxKHVuc2lnbmVkIGludCBpcnEpCi17Ci0JaWYgKCEoaXJxX2Rlc2NbaXJxXS5zdGF0dXMgJiAoSVJRX0RJU0FCTEVEfElSUV9JTlBST0dSRVNTKSkpCi0JCWVuYWJsZV9pbnRjMl9pcnEoaXJxKTsKLQotCWlmICh1bmxpa2VseShpbnRjMl9kYXRhW2lycSAtIElOVEMyX0ZJUlNUX0lSUV0uY2xlYXJfaXJxKSkKLQkJaW50YzJfZGF0YVtpcnEgLSBJTlRDMl9GSVJTVF9JUlFdLmNsZWFyX2lycShpcnEpOwotfQorc3RhdGljIHN0cnVjdCBpcnFfY2hpcCBpbnRjMl9pcnFfY2hpcCA9IHsKKwkubmFtZQkJPSAiSU5UQzIiLAorCS5tYXNrCQk9IGRpc2FibGVfaW50YzJfaXJxLAorCS51bm1hc2sJCT0gZW5hYmxlX2ludGMyX2lycSwKKwkubWFza19hY2sJPSBkaXNhYmxlX2ludGMyX2lycSwKK307CiAKIC8qCiAgKiBTZXR1cCBhbiBJTlRDMiBzdHlsZSBpbnRlcnJ1cHQuCkBAIC0xMDYsMTc5ICs0NCwzNiBAQAogICogICAgUElPMSB3aGljaCBpcyBJTlRQUkkwMFsxOSwxNl0gYW5kIElOVE1TSzAwWzEzXQogICogd291bGQgYmU6ICAgICAgICAgICAgICAgXiAgICAgXiAgICAgICAgICAgICBeICBeCiAgKiAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICB8ICAgICAgICAgICAgIHwgIHwKLSAqICAgIG1ha2VfaW50YzJfaXJxKDg0LCAgIDAsICAgMTYsICAgICAgICAgICAgMCwgMTMpOworICogICAgIHsgODQsCQkgICAwLCAgIDE2LCAgICAgICAgICAgIDAsIDEzIH0sCisgKgorICogaW4gdGhlIGludGMyX2RhdGEgdGFibGUuCiAgKi8KLXZvaWQgbWFrZV9pbnRjMl9pcnEodW5zaWduZWQgaW50IGlycSwKLQkJICAgIHVuc2lnbmVkIGludCBpcHJfb2Zmc2V0LCB1bnNpZ25lZCBpbnQgaXByX3NoaWZ0LAotCQkgICAgdW5zaWduZWQgaW50IG1za19vZmZzZXQsIHVuc2lnbmVkIGludCBtc2tfc2hpZnQsCi0JCSAgICB1bnNpZ25lZCBpbnQgcHJpb3JpdHkpCi17Ci0JaW50IGlycV9vZmZzZXQgPSBpcnEgLSBJTlRDMl9GSVJTVF9JUlE7Ci0JdW5zaWduZWQgaW50IGZsYWdzOwotCXVuc2lnbmVkIGxvbmcgaXByOwotCi0JaWYgKHVubGlrZWx5KGlycV9vZmZzZXQgPCAwIHx8IGlycV9vZmZzZXQgPj0gTlJfSU5UQzJfSVJRUykpCi0JCXJldHVybjsKLQotCWRpc2FibGVfaXJxX25vc3luYyhpcnEpOwotCi0JLyogRmlsbCB0aGUgZGF0YSB3ZSBuZWVkICovCi0JaW50YzJfZGF0YVtpcnFfb2Zmc2V0XS5tc2tfb2Zmc2V0ID0gbXNrX29mZnNldDsKLQlpbnRjMl9kYXRhW2lycV9vZmZzZXRdLm1za19zaGlmdCAgPSBtc2tfc2hpZnQ7Ci0JaW50YzJfZGF0YVtpcnFfb2Zmc2V0XS5jbGVhcl9pcnEgPSBOVUxMOwotCi0JLyogU2V0IHRoZSBwcmlvcml0eSBsZXZlbCAqLwotCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKLQotCWlwciA9IGN0cmxfaW5sKElOVEMyX0JBU0UgKyBJTlRDMl9JTlRQUklfT0ZGU0VUICsgaXByX29mZnNldCk7Ci0JaXByICY9IH4oMHhmIDw8IGlwcl9zaGlmdCk7Ci0JaXByIHw9IHByaW9yaXR5IDw8IGlwcl9zaGlmdDsKLQljdHJsX291dGwoaXByLCBJTlRDMl9CQVNFICsgSU5UQzJfSU5UUFJJX09GRlNFVCArIGlwcl9vZmZzZXQpOwotCi0JbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwotCi0JaXJxX2Rlc2NbaXJxXS5jaGlwID0gJmludGMyX2lycV90eXBlOwotCi0JZGlzYWJsZV9pbnRjMl9pcnEoaXJxKTsKLX0KLQotc3RhdGljIHN0cnVjdCBpbnRjMl9pbml0IHsKLQl1bnNpZ25lZCBzaG9ydCBpcnE7Ci0JdW5zaWduZWQgY2hhciBpcHJfb2Zmc2V0LCBpcHJfc2hpZnQ7Ci0JdW5zaWduZWQgY2hhciBtc2tfb2Zmc2V0LCBtc2tfc2hpZnQ7Ci0JdW5zaWduZWQgY2hhciBwcmlvcml0eTsKLX0gaW50YzJfaW5pdF9kYXRhW10gIF9faW5pdGRhdGEgPSB7Ci0jaWYgZGVmaW5lZChDT05GSUdfQ1BVX1NVQlRZUEVfU1Q0MCkKLQl7NjQsICAwLCAgMCwgMCwgIDAsIDEzfSwJLyogUENJIHNlcnIgKi8KLQl7NjUsICAwLCAgNCwgMCwgIDEsIDEzfSwJLyogUENJIGVyciAqLwotCXs2NiwgIDAsICA0LCAwLCAgMiwgMTN9LAkvKiBQQ0kgYWQgKi8KLQl7NjcsICAwLCAgNCwgMCwgIDMsIDEzfSwJLyogUENJIHB3ZCBkb3duICovCi0JezcyLCAgMCwgIDgsIDAsICA1LCAxM30sCS8qIERNQUMgSU5UMCAqLwotCXs3MywgIDAsICA4LCAwLCAgNiwgMTN9LAkvKiBETUFDIElOVDEgKi8KLQl7NzQsICAwLCAgOCwgMCwgIDcsIDEzfSwJLyogRE1BQyBJTlQyICovCi0Jezc1LCAgMCwgIDgsIDAsICA4LCAxM30sCS8qIERNQUMgSU5UMyAqLwotCXs3NiwgIDAsICA4LCAwLCAgOSwgMTN9LAkvKiBETUFDIElOVDQgKi8KLQl7NzgsICAwLCAgOCwgMCwgMTEsIDEzfSwJLyogRE1BQyBFUlIgKi8KLQl7ODAsICAwLCAxMiwgMCwgMTIsIDEzfSwJLyogUElPMCAqLwotCXs4NCwgIDAsIDE2LCAwLCAxMywgMTN9LAkvKiBQSU8xICovCi0Jezg4LCAgMCwgMjAsIDAsIDE0LCAxM30sCS8qIFBJTzIgKi8KLQl7MTEyLCA0LCAgMCwgNCwgIDAsIDEzfSwJLyogTWFpbGJveCAqLwotICNpZmRlZiBDT05GSUdfQ1BVX1NVQlRZUEVfU1Q0MEdYMQotCXsxMTYsIDQsICA0LCA0LCAgNCwgMTN9LAkvKiBTU0MwICovCi0JezEyMCwgNCwgIDgsIDQsICA4LCAxM30sCS8qIElSIEJsYXN0ZXIgKi8KLQl7MTI0LCA0LCAxMiwgNCwgMTIsIDEzfSwJLyogVVNCIGhvc3QgKi8KLQl7MTI4LCA0LCAxNiwgNCwgMTYsIDEzfSwJLyogVmlkZW8gcHJvY2Vzc29yIEJMSVRURVIgKi8KLQl7MTMyLCA0LCAyMCwgNCwgMjAsIDEzfSwJLyogVUFSVDAgKi8KLQl7MTM0LCA0LCAyMCwgNCwgMjIsIDEzfSwJLyogVUFSVDIgKi8KLQl7MTM2LCA0LCAyNCwgNCwgMjQsIDEzfSwJLyogSU9fUElPMCAqLwotCXsxNDAsIDQsIDI4LCA0LCAyOCwgMTN9LAkvKiBFTVBJICovCi0JezE0NCwgOCwgIDAsIDgsICAwLCAxM30sCS8qIE1BRkUgKi8KLQl7MTQ4LCA4LCAgNCwgOCwgIDQsIDEzfSwJLyogUFdNICovCi0JezE1MiwgOCwgIDgsIDgsICA4LCAxM30sCS8qIFNTQzEgKi8KLQl7MTU2LCA4LCAxMiwgOCwgMTIsIDEzfSwJLyogSU9fUElPMSAqLwotCXsxNjAsIDgsIDE2LCA4LCAxNiwgMTN9LAkvKiBVU0IgdGFyZ2V0ICovCi0JezE2NCwgOCwgMjAsIDgsIDIwLCAxM30sCS8qIFVBUlQxICovCi0JezE2OCwgOCwgMjQsIDgsIDI0LCAxM30sCS8qIFRlbGV0ZXh0ICovCi0JezE3MiwgOCwgMjgsIDgsIDI4LCAxM30sCS8qIFZpZGVvU3luYyBWVEcgKi8KLQl7MTczLCA4LCAyOCwgOCwgMjksIDEzfSwJLyogVmlkZW9TeW5jIERWUDAgKi8KLQl7MTc0LCA4LCAyOCwgOCwgMzAsIDEzfSwJLyogVmlkZW9TeW5jIERWUDEgKi8KLSNlbmRpZgotI2VsaWYgZGVmaW5lZChDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzYwKQotLyoKLSAqIFNINzc2MCBJTlRDMi1TdHlsZSBpbnRlcnJ1cHRzLCB2ZWN0b3JzIElSUTQ4LTExMSBJTlRFVlQgMHg4MDAtMHhGRTAKLSAqLwotCS8qIElOVFBSSU8wIHwgSU5UTVNLMCAqLwotCXs0OCwgIDAsIDI4LCAwLCAzMSwgIDN9LAkvKiBJUlEgNCAqLwotCXs0OSwgIDAsIDI0LCAwLCAzMCwgIDN9LAkvKiBJUlEgMyAqLwotCXs1MCwgIDAsIDIwLCAwLCAyOSwgIDN9LAkvKiBJUlEgMiAqLwotCXs1MSwgIDAsIDE2LCAwLCAyOCwgIDN9LAkvKiBJUlEgMSAqLwotCS8qIDUyLTU1IChJTlRFVlQgMHg4ODAtMHg4RTApIHVudXNlZC9yZXNlcnZlZCAqLwotCS8qIElOVFBSSU80IHwgSU5UTVNLMCAqLwotCXs1NiwgIDQsIDI4LCAwLCAyNSwgIDN9LAkvKiBIQ0FOMl9DSEFOMCAqLwotCXs1NywgIDQsIDI0LCAwLCAyNCwgIDN9LAkvKiBIQ0FOMl9DSEFOMSAqLwotCXs1OCwgIDQsIDIwLCAwLCAyMywgIDN9LAkvKiBJMlNfQ0hBTjAgICAqLwotCXs1OSwgIDQsIDE2LCAwLCAyMiwgIDN9LAkvKiBJMlNfQ0hBTjEgICAqLwotCXs2MCwgIDQsIDEyLCAwLCAyMSwgIDN9LAkvKiBBQzk3X0NIQU4wICAqLwotCXs2MSwgIDQsICA4LCAwLCAyMCwgIDN9LAkvKiBBQzk3X0NIQU4xICAqLwotCXs2MiwgIDQsICA0LCAwLCAxOSwgIDN9LAkvKiBJMkNfQ0hBTjAgICAqLwotCXs2MywgIDQsICAwLCAwLCAxOCwgIDN9LAkvKiBJMkNfQ0hBTjEgICAqLwotCS8qIElOVFBSSU84IHwgSU5UTVNLMCAqLwotCXs1MiwgIDgsIDE2LCAwLCAxMSwgIDN9LAkvKiBTQ0lGMF9FUklfSVJRICovCi0JezUzLCAgOCwgMTYsIDAsIDEwLCAgM30sCS8qIFNDSUYwX1JYSV9JUlEgKi8KLQl7NTQsICA4LCAxNiwgMCwgIDksICAzfSwJLyogU0NJRjBfQlJJX0lSUSAqLwotCXs1NSwgIDgsIDE2LCAwLCAgOCwgIDN9LAkvKiBTQ0lGMF9UWElfSVJRICovCi0JezY0LCAgOCwgMjgsIDAsIDE3LCAgM30sCS8qIFVTQkhJX0lSUSAqLwotCXs2NSwgIDgsIDI0LCAwLCAxNiwgIDN9LAkvKiBMQ0RDICAgICAgKi8KLQkvKiA2NiwgNjcgdW51c2VkICovCi0JezY4LCAgOCwgMjAsIDAsIDE0LCAxM30sCS8qIERNQUJSR0kwX0lSUSAqLwotCXs2OSwgIDgsIDIwLCAwLCAxMywgMTN9LAkvKiBETUFCUkdJMV9JUlEgKi8KLQl7NzAsICA4LCAyMCwgMCwgMTIsIDEzfSwJLyogRE1BQlJHSTJfSVJRICovCi0JLyogNzEgdW51c2VkICovCi0JezcyLCAgOCwgMTIsIDAsICA3LCAgM30sCS8qIFNDSUYxX0VSSV9JUlEgKi8KLQl7NzMsICA4LCAxMiwgMCwgIDYsICAzfSwJLyogU0NJRjFfUlhJX0lSUSAqLwotCXs3NCwgIDgsIDEyLCAwLCAgNSwgIDN9LAkvKiBTQ0lGMV9CUklfSVJRICovCi0Jezc1LCAgOCwgMTIsIDAsICA0LCAgM30sCS8qIFNDSUYxX1RYSV9JUlEgKi8KLQl7NzYsICA4LCAgOCwgMCwgIDMsICAzfSwJLyogU0NJRjJfRVJJX0lSUSAqLwotCXs3NywgIDgsICA4LCAwLCAgMiwgIDN9LAkvKiBTQ0lGMl9SWElfSVJRICovCi0Jezc4LCAgOCwgIDgsIDAsICAxLCAgM30sCS8qIFNDSUYyX0JSSV9JUlEgKi8KLQl7NzksICA4LCAgOCwgMCwgIDAsICAzfSwJLyogU0NJRjJfVFhJX0lSUSAqLwotCS8qICAgICAgICAgIHwgSU5UTVNLNCAqLwotCXs4MCwgIDgsICA0LCA0LCAyMywgIDN9LAkvKiBTSU1fRVJJICovCi0JezgxLCAgOCwgIDQsIDQsIDIyLCAgM30sCS8qIFNJTV9SWEkgKi8KLQl7ODIsICA4LCAgNCwgNCwgMjEsICAzfSwJLyogU0lNX1RYSSAqLwotCXs4MywgIDgsICA0LCA0LCAyMCwgIDN9LAkvKiBTSU1fVEVJICovCi0Jezg0LCAgOCwgIDAsIDQsIDE5LCAgM30sCS8qIEhTUElJICovCi0JLyogSU5UUFJJT0MgfCBJTlRNU0s0ICovCi0JLyogODUtODcgdW51c2VkL3Jlc2VydmVkICovCi0Jezg4LCAxMiwgMjAsIDQsIDE4LCAgM30sCS8qIE1NQ0kwICovCi0Jezg5LCAxMiwgMjAsIDQsIDE3LCAgM30sCS8qIE1NQ0kxICovCi0JezkwLCAxMiwgMjAsIDQsIDE2LCAgM30sCS8qIE1NQ0kyICovCi0JezkxLCAxMiwgMjAsIDQsIDE1LCAgM30sCS8qIE1NQ0kzICovCi0JezkyLCAxMiwgMTIsIDQsICA2LCAgM30sCS8qIE1GSSAodW5zdXJlLCBidWc/IGluIG15IDc3NjAgbWFudWFsKi8KLQkvKiA5My0xMDcgcmVzZXJ2ZWQvdW5kb2N1bWVudGVkICovCi0JezEwOCwxMiwgIDQsIDQsICAxLCAgM30sCS8qIEFEQyAgKi8KLQl7MTA5LDEyLCAgMCwgNCwgIDAsICAzfSwJLyogQ01USSAqLwotCS8qIDExMC0xMTEgcmVzZXJ2ZWQvdW51c2VkICovCi0jZWxpZiBkZWZpbmVkKENPTkZJR19DUFVfU1VCVFlQRV9TSDc3ODApCi0JeyBUSU1FUl9JUlEsIDAsIDI0LCAwLCBJTlRDX1RNVTBfTVNLLCAyfSwKLQl7IDIxLCAxLCAwLCAwLCBJTlRDX1JUQ19NU0ssIFRJTUVSX1BSSU9SSVRZIH0sCi0JeyAyMiwgMSwgMSwgMCwgSU5UQ19SVENfTVNLLCBUSU1FUl9QUklPUklUWSB9LAotCXsgMjMsIDEsIDIsIDAsIElOVENfUlRDX01TSywgVElNRVJfUFJJT1JJVFkgfSwKLQl7IFNDSUYwX0VSSV9JUlEsIDgsIDI0LCAwLCBJTlRDX1NDSUYwX01TSywgU0NJRjBfUFJJT1JJVFkgfSwKLQl7IFNDSUYwX1JYSV9JUlEsIDgsIDI0LCAwLCBJTlRDX1NDSUYwX01TSywgU0NJRjBfUFJJT1JJVFkgfSwKLQl7IFNDSUYwX0JSSV9JUlEsIDgsIDI0LCAwLCBJTlRDX1NDSUYwX01TSywgU0NJRjBfUFJJT1JJVFkgfSwKLQl7IFNDSUYwX1RYSV9JUlEsIDgsIDI0LCAwLCBJTlRDX1NDSUYwX01TSywgU0NJRjBfUFJJT1JJVFkgfSwKLQotCXsgU0NJRjFfRVJJX0lSUSwgOCwgMTYsIDAsIElOVENfU0NJRjFfTVNLLCBTQ0lGMV9QUklPUklUWSB9LAotCXsgU0NJRjFfUlhJX0lSUSwgOCwgMTYsIDAsIElOVENfU0NJRjFfTVNLLCBTQ0lGMV9QUklPUklUWSB9LAotCXsgU0NJRjFfQlJJX0lSUSwgOCwgMTYsIDAsIElOVENfU0NJRjFfTVNLLCBTQ0lGMV9QUklPUklUWSB9LAotCXsgU0NJRjFfVFhJX0lSUSwgOCwgMTYsIDAsIElOVENfU0NJRjFfTVNLLCBTQ0lGMV9QUklPUklUWSB9LAotCi0JeyBQQ0lDMF9JUlEsIDB4MTAsICA4LCAwLCBJTlRDX1BDSUMwX01TSywgUENJQzBfUFJJT1JJVFkgfSwKLQl7IFBDSUMxX0lSUSwgMHgxMCwgIDAsIDAsIElOVENfUENJQzFfTVNLLCBQQ0lDMV9QUklPUklUWSB9LAotCXsgUENJQzJfSVJRLCAweDE0LCAyNCwgMCwgSU5UQ19QQ0lDMl9NU0ssIFBDSUMyX1BSSU9SSVRZIH0sCi0JeyBQQ0lDM19JUlEsIDB4MTQsIDE2LCAwLCBJTlRDX1BDSUMzX01TSywgUENJQzNfUFJJT1JJVFkgfSwKLQl7IFBDSUM0X0lSUSwgMHgxNCwgIDgsIDAsIElOVENfUENJQzRfTVNLLCBQQ0lDNF9QUklPUklUWSB9LAotI2VuZGlmCi19OwotCi12b2lkIF9faW5pdCBpbml0X0lSUV9pbnRjMih2b2lkKQordm9pZCBtYWtlX2ludGMyX2lycShzdHJ1Y3QgaW50YzJfZGF0YSAqdGFibGUsIHVuc2lnbmVkIGludCBucl9pcnFzKQogewogCWludCBpOwogCi0JZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoaW50YzJfaW5pdF9kYXRhKTsgaSsrKSB7Ci0JCXN0cnVjdCBpbnRjMl9pbml0ICpwID0gaW50YzJfaW5pdF9kYXRhICsgaTsKLQkJbWFrZV9pbnRjMl9pcnEocC0+aXJxLCBwLT5pcHJfb2Zmc2V0LCBwLT5pcHJfc2hpZnQsCi0JCQkgICAgICAgcC0+IG1za19vZmZzZXQsIHAtPm1za19zaGlmdCwgcC0+cHJpb3JpdHkpOworCWZvciAoaSA9IDA7IGkgPCBucl9pcnFzOyBpKyspIHsKKwkJdW5zaWduZWQgbG9uZyBpcHIsIGZsYWdzOworCQlzdHJ1Y3QgaW50YzJfZGF0YSAqcCA9IHRhYmxlICsgaTsKKworCQlkaXNhYmxlX2lycV9ub3N5bmMocC0+aXJxKTsKKworCQkvKiBTZXQgdGhlIHByaW9yaXR5IGxldmVsICovCisJCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKworCQlpcHIgPSBjdHJsX2lubChJTlRDMl9CQVNFICsgSU5UQzJfSU5UUFJJX09GRlNFVCArCisJCQkgICAgICAgcC0+aXByX29mZnNldCk7CisJCWlwciAmPSB+KDB4ZiA8PCBwLT5pcHJfc2hpZnQpOworCQlpcHIgfD0gcC0+cHJpb3JpdHkgPDwgcC0+aXByX3NoaWZ0OworCQljdHJsX291dGwoaXByLCBJTlRDMl9CQVNFICsgSU5UQzJfSU5UUFJJX09GRlNFVCArCisJCQkgIHAtPmlwcl9vZmZzZXQpOworCisJCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKworCQlzZXRfaXJxX2NoaXBfYW5kX2hhbmRsZXJfbmFtZShwLT5pcnEsICZpbnRjMl9pcnFfY2hpcCwKKwkJCQkJICAgICAgaGFuZGxlX2xldmVsX2lycSwgImxldmVsIik7CisJCXNldF9pcnFfY2hpcF9kYXRhKHAtPmlycSwgcCk7CisKKwkJZW5hYmxlX2ludGMyX2lycShwLT5pcnEpOwogCX0KIH0KLQotLyogQWRkcyBhIHRlcm1pbmF0aW9uIGNhbGxiYWNrIHRvIHRoZSBpbnRlcnJ1cHQgKi8KLXZvaWQgaW50YzJfYWRkX2NsZWFyX2lycShpbnQgaXJxLCBpbnQgKCpmbikoaW50KSkKLXsKLQlpZiAodW5saWtlbHkoaXJxIDwgSU5UQzJfRklSU1RfSVJRKSkKLQkJcmV0dXJuOwotCi0JaW50YzJfZGF0YVtpcnEgLSBJTlRDMl9GSVJTVF9JUlFdLmNsZWFyX2lycSA9IGZuOwotfQotCmRpZmYgLS1naXQgYS9hcmNoL3NoL2tlcm5lbC9jcHUvaXJxL2lwci5jIGIvYXJjaC9zaC9rZXJuZWwvY3B1L2lycS9pcHIuYwppbmRleCBmNzg1ODIyLi5hMDA4OTU2IDEwMDY0NAotLS0gYS9hcmNoL3NoL2tlcm5lbC9jcHUvaXJxL2lwci5jCisrKyBiL2FyY2gvc2gva2VybmVsL2NwdS9pcnEvaXByLmMKQEAgLTEsMTEgKzEsMTAgQEAKIC8qCi0gKiBhcmNoL3NoL2tlcm5lbC9jcHUvaXJxL2lwci5jCisgKiBJbnRlcnJ1cHQgaGFuZGxpbmcgZm9yIElQUi1iYXNlZCBJUlEuCiAgKgogICogQ29weXJpZ2h0IChDKSAxOTk5ICBOaWliZSBZdXRha2EgJiBUYWtlc2hpIFlhZWdhc2hpCiAgKiBDb3B5cmlnaHQgKEMpIDIwMDAgIEthenVtb3RvIEtvamltYQotICogQ29weXJpZ2h0IChDKSAyMDAzIFRha2FzaGkgS3VzdWRhIDxrdXN1ZGEtdGFrYXNoaUBoaXRhY2hpLXVsLmNvLmpwPgotICoKLSAqIEludGVycnVwdCBoYW5kbGluZyBmb3IgSVBSLWJhc2VkIElSUS4KKyAqIENvcHlyaWdodCAoQykgMjAwMyAgVGFrYXNoaSBLdXN1ZGEgPGt1c3VkYS10YWthc2hpQGhpdGFjaGktdWwuY28uanA+CisgKiBDb3B5cmlnaHQgKEMpIDIwMDYgIFBhdWwgTXVuZHQKICAqCiAgKiBTdXBwb3J0ZWQgc3lzdGVtOgogICoJT24tY2hpcCBzdXBwb3J0aW5nIG1vZHVsZXMgKFRNVSwgUlRDLCBldGMuKS4KQEAgLTEzLDE1MSArMTIsOTIgQEAKICAqCUhpdGFjaGkgU29sdXRpb25FbmdpbmUgZXh0ZXJuYWwgSS9POgogICoJCU1TNzcwOVNFMDEsIE1TNzcwOUFTRTAxLCBhbmQgTVM3NzUwU0UwMQogICoKKyAqIFRoaXMgZmlsZSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlLiAgU2VlIHRoZSBmaWxlICJDT1BZSU5HIiBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhpcyBhcmNoaXZlCisgKiBmb3IgbW9yZSBkZXRhaWxzLgogICovCi0KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvaXJxLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0KICNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CiAjaW5jbHVkZSA8YXNtL2lvLmg+CiAjaW5jbHVkZSA8YXNtL21hY2h2ZWMuaD4KIAotc3RydWN0IGlwcl9kYXRhIHsKLQl1bnNpZ25lZCBpbnQgYWRkcjsJLyogQWRkcmVzcyBvZiBJbnRlcnJ1cHQgUHJpb3JpdHkgUmVnaXN0ZXIgKi8KLQlpbnQgc2hpZnQ7CQkvKiBTaGlmdHMgb2YgdGhlIDE2LWJpdCBkYXRhICovCi0JaW50IHByaW9yaXR5OwkJLyogVGhlIHByaW9yaXR5ICovCi19Owotc3RhdGljIHN0cnVjdCBpcHJfZGF0YSBpcHJfZGF0YVtOUl9JUlFTXTsKLQotc3RhdGljIHZvaWQgZW5hYmxlX2lwcl9pcnEodW5zaWduZWQgaW50IGlycSk7Ci1zdGF0aWMgdm9pZCBkaXNhYmxlX2lwcl9pcnEodW5zaWduZWQgaW50IGlycSk7Ci0KLS8qIHNodXRkb3duIGlzIHNhbWUgYXMgImRpc2FibGUiICovCi0jZGVmaW5lIHNodXRkb3duX2lwcl9pcnEgZGlzYWJsZV9pcHJfaXJxCi0KLXN0YXRpYyB2b2lkIG1hc2tfYW5kX2Fja19pcHIodW5zaWduZWQgaW50KTsKLXN0YXRpYyB2b2lkIGVuZF9pcHJfaXJxKHVuc2lnbmVkIGludCBpcnEpOwotCi1zdGF0aWMgdW5zaWduZWQgaW50IHN0YXJ0dXBfaXByX2lycSh1bnNpZ25lZCBpbnQgaXJxKQotewotCWVuYWJsZV9pcHJfaXJxKGlycSk7Ci0JcmV0dXJuIDA7IC8qIG5ldmVyIGFueXRoaW5nIHBlbmRpbmcgKi8KLX0KLQotc3RhdGljIHN0cnVjdCBod19pbnRlcnJ1cHRfdHlwZSBpcHJfaXJxX3R5cGUgPSB7Ci0JLnR5cGVuYW1lID0gIklQUi1JUlEiLAotCS5zdGFydHVwID0gc3RhcnR1cF9pcHJfaXJxLAotCS5zaHV0ZG93biA9IHNodXRkb3duX2lwcl9pcnEsCi0JLmVuYWJsZSA9IGVuYWJsZV9pcHJfaXJxLAotCS5kaXNhYmxlID0gZGlzYWJsZV9pcHJfaXJxLAotCS5hY2sgPSBtYXNrX2FuZF9hY2tfaXByLAotCS5lbmQgPSBlbmRfaXByX2lycQotfTsKIAogc3RhdGljIHZvaWQgZGlzYWJsZV9pcHJfaXJxKHVuc2lnbmVkIGludCBpcnEpCiB7Ci0JdW5zaWduZWQgbG9uZyB2YWw7Ci0JdW5zaWduZWQgaW50IGFkZHIgPSBpcHJfZGF0YVtpcnFdLmFkZHI7Ci0JdW5zaWduZWQgc2hvcnQgbWFzayA9IDB4ZmZmZiBeICgweDBmIDw8IGlwcl9kYXRhW2lycV0uc2hpZnQpOwotCisJc3RydWN0IGlwcl9kYXRhICpwID0gZ2V0X2lycV9jaGlwX2RhdGEoaXJxKTsKKwlpbnQgc2hpZnQgPSBwLT5zaGlmdCo0OwogCS8qIFNldCB0aGUgcHJpb3JpdHkgaW4gSVBSIHRvIDAgKi8KLQl2YWwgPSBjdHJsX2ludyhhZGRyKTsKLQl2YWwgJj0gbWFzazsKLQljdHJsX291dHcodmFsLCBhZGRyKTsKKwljdHJsX291dHcoY3RybF9pbncocC0+YWRkcikgJiAoMHhmZmZmIF4gKDB4ZiA8PCBzaGlmdCkpLCBwLT5hZGRyKTsKIH0KIAogc3RhdGljIHZvaWQgZW5hYmxlX2lwcl9pcnEodW5zaWduZWQgaW50IGlycSkKIHsKLQl1bnNpZ25lZCBsb25nIHZhbDsKLQl1bnNpZ25lZCBpbnQgYWRkciA9IGlwcl9kYXRhW2lycV0uYWRkcjsKLQlpbnQgcHJpb3JpdHkgPSBpcHJfZGF0YVtpcnFdLnByaW9yaXR5OwotCXVuc2lnbmVkIHNob3J0IHZhbHVlID0gKHByaW9yaXR5IDw8IGlwcl9kYXRhW2lycV0uc2hpZnQpOwotCisJc3RydWN0IGlwcl9kYXRhICpwID0gZ2V0X2lycV9jaGlwX2RhdGEoaXJxKTsKKwlpbnQgc2hpZnQgPSBwLT5zaGlmdCo0OwogCS8qIFNldCBwcmlvcml0eSBpbiBJUFIgYmFjayB0byBvcmlnaW5hbCB2YWx1ZSAqLwotCXZhbCA9IGN0cmxfaW53KGFkZHIpOwotCXZhbCB8PSB2YWx1ZTsKLQljdHJsX291dHcodmFsLCBhZGRyKTsKKwljdHJsX291dHcoY3RybF9pbncocC0+YWRkcikgfCAocC0+cHJpb3JpdHkgPDwgc2hpZnQpLCBwLT5hZGRyKTsKIH0KIAotc3RhdGljIHZvaWQgbWFza19hbmRfYWNrX2lwcih1bnNpZ25lZCBpbnQgaXJxKQotewotCWRpc2FibGVfaXByX2lycShpcnEpOworc3RhdGljIHN0cnVjdCBpcnFfY2hpcCBpcHJfaXJxX2NoaXAgPSB7CisJLm5hbWUJCT0gIklQUiIsCisJLm1hc2sJCT0gZGlzYWJsZV9pcHJfaXJxLAorCS51bm1hc2sJCT0gZW5hYmxlX2lwcl9pcnEsCisJLm1hc2tfYWNrCT0gZGlzYWJsZV9pcHJfaXJxLAorfTsKIAotI2lmIGRlZmluZWQoQ09ORklHX0NQVV9TVUJUWVBFX1NINzcwNykgfHwgZGVmaW5lZChDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzA5KSB8fCBcCi0gICAgZGVmaW5lZChDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzA2KSB8fCBcCi0gICAgZGVmaW5lZChDT05GSUdfQ1BVX1NVQlRZUEVfU0g3MzAwKSB8fCBkZWZpbmVkKENPTkZJR19DUFVfU1VCVFlQRV9TSDc3MDUpCi0JLyogVGhpcyBpcyBuZWVkZWQgd2hlbiB3ZSB1c2UgZWRnZSB0cmlnZ2VyZWQgc2V0dGluZyAqLwotCS8qIFhYWDogSXMgaXQgcmVhbGx5IG5lZWRlZD8gKi8KLQlpZiAoSVJRMF9JUlEgPD0gaXJxICYmIGlycSA8PSBJUlE1X0lSUSkgewotCQkvKiBDbGVhciBleHRlcm5hbCBpbnRlcnJ1cHQgcmVxdWVzdCAqLwotCQlpbnQgYSA9IGN0cmxfaW5iKElOVENfSVJSMCk7Ci0JCWEgJj0gfigxIDw8IChpcnEgLSBJUlEwX0lSUSkpOwotCQljdHJsX291dGIoYSwgSU5UQ19JUlIwKTsKLQl9Ci0jZW5kaWYKLX0KLQotc3RhdGljIHZvaWQgZW5kX2lwcl9pcnEodW5zaWduZWQgaW50IGlycSkKK3ZvaWQgbWFrZV9pcHJfaXJxKHN0cnVjdCBpcHJfZGF0YSAqdGFibGUsIHVuc2lnbmVkIGludCBucl9pcnFzKQogewotCWlmICghKGlycV9kZXNjW2lycV0uc3RhdHVzICYgKElSUV9ESVNBQkxFRHxJUlFfSU5QUk9HUkVTUykpKQorCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IG5yX2lycXM7IGkrKykgeworCQl1bnNpZ25lZCBpbnQgaXJxID0gdGFibGVbaV0uaXJxOworCQlkaXNhYmxlX2lycV9ub3N5bmMoaXJxKTsKKwkJc2V0X2lycV9jaGlwX2FuZF9oYW5kbGVyX25hbWUoaXJxLCAmaXByX2lycV9jaGlwLAorCQkJCSAgICAgIGhhbmRsZV9sZXZlbF9pcnEsICJsZXZlbCIpOworCQlzZXRfaXJxX2NoaXBfZGF0YShpcnEsICZ0YWJsZVtpXSk7CiAJCWVuYWJsZV9pcHJfaXJxKGlycSk7CisJfQogfQorRVhQT1JUX1NZTUJPTChtYWtlX2lwcl9pcnEpOwogCi12b2lkIG1ha2VfaXByX2lycSh1bnNpZ25lZCBpbnQgaXJxLCB1bnNpZ25lZCBpbnQgYWRkciwgaW50IHBvcywgaW50IHByaW9yaXR5KQotewotCWRpc2FibGVfaXJxX25vc3luYyhpcnEpOwotCWlwcl9kYXRhW2lycV0uYWRkciA9IGFkZHI7Ci0JaXByX2RhdGFbaXJxXS5zaGlmdCA9IHBvcyo0OyAvKiBQT1NpdGlvbiAoMC0zKSB4IDQgbWVhbnMgc2hpZnQgKi8KLQlpcHJfZGF0YVtpcnFdLnByaW9yaXR5ID0gcHJpb3JpdHk7Ci0KLQlpcnFfZGVzY1tpcnFdLmNoaXAgPSAmaXByX2lycV90eXBlOwotCWRpc2FibGVfaXByX2lycShpcnEpOwotfQotCi12b2lkIF9faW5pdCBpbml0X0lSUSh2b2lkKQoteworc3RhdGljIHN0cnVjdCBpcHJfZGF0YSBzeXNfaXByX21hcFtdID0gewogI2lmbmRlZiBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzgwCi0JbWFrZV9pcHJfaXJxKFRJTUVSX0lSUSwgVElNRVJfSVBSX0FERFIsIFRJTUVSX0lQUl9QT1MsIFRJTUVSX1BSSU9SSVRZKTsKLQltYWtlX2lwcl9pcnEoVElNRVIxX0lSUSwgVElNRVIxX0lQUl9BRERSLCBUSU1FUjFfSVBSX1BPUywgVElNRVIxX1BSSU9SSVRZKTsKKwl7IFRJTUVSX0lSUSwgVElNRVJfSVBSX0FERFIsIFRJTUVSX0lQUl9QT1MsIFRJTUVSX1BSSU9SSVRZIH0sCisJeyBUSU1FUjFfSVJRLCBUSU1FUjFfSVBSX0FERFIsIFRJTUVSMV9JUFJfUE9TLCBUSU1FUjFfUFJJT1JJVFkgfSwKICNpZmRlZiBSVENfSVJRCi0JbWFrZV9pcHJfaXJxKFJUQ19JUlEsIFJUQ19JUFJfQUREUiwgUlRDX0lQUl9QT1MsIFJUQ19QUklPUklUWSk7CisJeyBSVENfSVJRLCBSVENfSVBSX0FERFIsIFJUQ19JUFJfUE9TLCBSVENfUFJJT1JJVFkgfSwKICNlbmRpZgotCiAjaWZkZWYgU0NJX0VSSV9JUlEKLQltYWtlX2lwcl9pcnEoU0NJX0VSSV9JUlEsIFNDSV9JUFJfQUREUiwgU0NJX0lQUl9QT1MsIFNDSV9QUklPUklUWSk7Ci0JbWFrZV9pcHJfaXJxKFNDSV9SWElfSVJRLCBTQ0lfSVBSX0FERFIsIFNDSV9JUFJfUE9TLCBTQ0lfUFJJT1JJVFkpOwotCW1ha2VfaXByX2lycShTQ0lfVFhJX0lSUSwgU0NJX0lQUl9BRERSLCBTQ0lfSVBSX1BPUywgU0NJX1BSSU9SSVRZKTsKKwl7IFNDSV9FUklfSVJRLCBTQ0lfSVBSX0FERFIsIFNDSV9JUFJfUE9TLCBTQ0lfUFJJT1JJVFkgfSwKKwl7IFNDSV9SWElfSVJRLCBTQ0lfSVBSX0FERFIsIFNDSV9JUFJfUE9TLCBTQ0lfUFJJT1JJVFkgfSwKKwl7IFNDSV9UWElfSVJRLCBTQ0lfSVBSX0FERFIsIFNDSV9JUFJfUE9TLCBTQ0lfUFJJT1JJVFkgfSwKICNlbmRpZgotCiAjaWZkZWYgU0NJRjFfRVJJX0lSUQotCW1ha2VfaXByX2lycShTQ0lGMV9FUklfSVJRLCBTQ0lGMV9JUFJfQUREUiwgU0NJRjFfSVBSX1BPUywgU0NJRjFfUFJJT1JJVFkpOwotCW1ha2VfaXByX2lycShTQ0lGMV9SWElfSVJRLCBTQ0lGMV9JUFJfQUREUiwgU0NJRjFfSVBSX1BPUywgU0NJRjFfUFJJT1JJVFkpOwotCW1ha2VfaXByX2lycShTQ0lGMV9CUklfSVJRLCBTQ0lGMV9JUFJfQUREUiwgU0NJRjFfSVBSX1BPUywgU0NJRjFfUFJJT1JJVFkpOwotCW1ha2VfaXByX2lycShTQ0lGMV9UWElfSVJRLCBTQ0lGMV9JUFJfQUREUiwgU0NJRjFfSVBSX1BPUywgU0NJRjFfUFJJT1JJVFkpOworCXsgU0NJRjFfRVJJX0lSUSwgU0NJRjFfSVBSX0FERFIsIFNDSUYxX0lQUl9QT1MsIFNDSUYxX1BSSU9SSVRZIH0sCisJeyBTQ0lGMV9SWElfSVJRLCBTQ0lGMV9JUFJfQUREUiwgU0NJRjFfSVBSX1BPUywgU0NJRjFfUFJJT1JJVFkgfSwKKwl7IFNDSUYxX0JSSV9JUlEsIFNDSUYxX0lQUl9BRERSLCBTQ0lGMV9JUFJfUE9TLCBTQ0lGMV9QUklPUklUWSB9LAorCXsgU0NJRjFfVFhJX0lSUSwgU0NJRjFfSVBSX0FERFIsIFNDSUYxX0lQUl9QT1MsIFNDSUYxX1BSSU9SSVRZIH0sCiAjZW5kaWYKLQogI2lmIGRlZmluZWQoQ09ORklHX0NQVV9TVUJUWVBFX1NINzMwMCkKLQltYWtlX2lwcl9pcnEoU0NJRjBfSVJRLCBTQ0lGMF9JUFJfQUREUiwgU0NJRjBfSVBSX1BPUywgU0NJRjBfUFJJT1JJVFkpOwotCW1ha2VfaXByX2lycShETVRFMl9JUlEsIERNQTFfSVBSX0FERFIsIERNQTFfSVBSX1BPUywgRE1BMV9QUklPUklUWSk7Ci0JbWFrZV9pcHJfaXJxKERNVEUzX0lSUSwgRE1BMV9JUFJfQUREUiwgRE1BMV9JUFJfUE9TLCBETUExX1BSSU9SSVRZKTsKLQltYWtlX2lwcl9pcnEoVklPX0lSUSwgVklPX0lQUl9BRERSLCBWSU9fSVBSX1BPUywgVklPX1BSSU9SSVRZKTsKKwl7IFNDSUYwX0lSUSwgU0NJRjBfSVBSX0FERFIsIFNDSUYwX0lQUl9QT1MsIFNDSUYwX1BSSU9SSVRZIH0sCisJeyBETVRFMl9JUlEsIERNQTFfSVBSX0FERFIsIERNQTFfSVBSX1BPUywgRE1BMV9QUklPUklUWSB9LAorCXsgRE1URTNfSVJRLCBETUExX0lQUl9BRERSLCBETUExX0lQUl9QT1MsIERNQTFfUFJJT1JJVFkgfSwKKwl7IFZJT19JUlEsIFZJT19JUFJfQUREUiwgVklPX0lQUl9QT1MsIFZJT19QUklPUklUWSB9LAogI2VuZGlmCi0KICNpZmRlZiBTQ0lGX0VSSV9JUlEKLQltYWtlX2lwcl9pcnEoU0NJRl9FUklfSVJRLCBTQ0lGX0lQUl9BRERSLCBTQ0lGX0lQUl9QT1MsIFNDSUZfUFJJT1JJVFkpOwotCW1ha2VfaXByX2lycShTQ0lGX1JYSV9JUlEsIFNDSUZfSVBSX0FERFIsIFNDSUZfSVBSX1BPUywgU0NJRl9QUklPUklUWSk7Ci0JbWFrZV9pcHJfaXJxKFNDSUZfQlJJX0lSUSwgU0NJRl9JUFJfQUREUiwgU0NJRl9JUFJfUE9TLCBTQ0lGX1BSSU9SSVRZKTsKLQltYWtlX2lwcl9pcnEoU0NJRl9UWElfSVJRLCBTQ0lGX0lQUl9BRERSLCBTQ0lGX0lQUl9QT1MsIFNDSUZfUFJJT1JJVFkpOworCXsgU0NJRl9FUklfSVJRLCBTQ0lGX0lQUl9BRERSLCBTQ0lGX0lQUl9QT1MsIFNDSUZfUFJJT1JJVFkgfSwKKwl7IFNDSUZfUlhJX0lSUSwgU0NJRl9JUFJfQUREUiwgU0NJRl9JUFJfUE9TLCBTQ0lGX1BSSU9SSVRZIH0sCisJeyBTQ0lGX0JSSV9JUlEsIFNDSUZfSVBSX0FERFIsIFNDSUZfSVBSX1BPUywgU0NJRl9QUklPUklUWSB9LAorCXsgU0NJRl9UWElfSVJRLCBTQ0lGX0lQUl9BRERSLCBTQ0lGX0lQUl9QT1MsIFNDSUZfUFJJT1JJVFkgfSwKICNlbmRpZgotCiAjaWZkZWYgSVJEQV9FUklfSVJRCi0JbWFrZV9pcHJfaXJxKElSREFfRVJJX0lSUSwgSVJEQV9JUFJfQUREUiwgSVJEQV9JUFJfUE9TLCBJUkRBX1BSSU9SSVRZKTsKLQltYWtlX2lwcl9pcnEoSVJEQV9SWElfSVJRLCBJUkRBX0lQUl9BRERSLCBJUkRBX0lQUl9QT1MsIElSREFfUFJJT1JJVFkpOwotCW1ha2VfaXByX2lycShJUkRBX0JSSV9JUlEsIElSREFfSVBSX0FERFIsIElSREFfSVBSX1BPUywgSVJEQV9QUklPUklUWSk7Ci0JbWFrZV9pcHJfaXJxKElSREFfVFhJX0lSUSwgSVJEQV9JUFJfQUREUiwgSVJEQV9JUFJfUE9TLCBJUkRBX1BSSU9SSVRZKTsKKwl7IElSREFfRVJJX0lSUSwgSVJEQV9JUFJfQUREUiwgSVJEQV9JUFJfUE9TLCBJUkRBX1BSSU9SSVRZIH0sCisJeyBJUkRBX1JYSV9JUlEsIElSREFfSVBSX0FERFIsIElSREFfSVBSX1BPUywgSVJEQV9QUklPUklUWSB9LAorCXsgSVJEQV9CUklfSVJRLCBJUkRBX0lQUl9BRERSLCBJUkRBX0lQUl9QT1MsIElSREFfUFJJT1JJVFkgfSwKKwl7IElSREFfVFhJX0lSUSwgSVJEQV9JUFJfQUREUiwgSVJEQV9JUFJfUE9TLCBJUkRBX1BSSU9SSVRZIH0sCiAjZW5kaWYKLQogI2lmIGRlZmluZWQoQ09ORklHX0NQVV9TVUJUWVBFX1NINzcwNykgfHwgZGVmaW5lZChDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzA5KSB8fCBcCiAgICAgZGVmaW5lZChDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzA2KSB8fCBcCiAgICAgZGVmaW5lZChDT05GSUdfQ1BVX1NVQlRZUEVfU0g3MzAwKSB8fCBkZWZpbmVkKENPTkZJR19DUFVfU1VCVFlQRV9TSDc3MDUpCkBAIC0xNzEsMTQgKzExMSwxOSBAQAogCSAqIFlvdSBzaG91bGQgc2V0IGNvcnJlc3BvbmRpbmcgYml0cyBvZiBQRkMgdG8gIjAwIgogCSAqIHRvIGVuYWJsZSB0aGVzZSBpbnRlcnJ1cHRzLgogCSAqLwotCW1ha2VfaXByX2lycShJUlEwX0lSUSwgSVJRMF9JUFJfQUREUiwgSVJRMF9JUFJfUE9TLCBJUlEwX1BSSU9SSVRZKTsKLQltYWtlX2lwcl9pcnEoSVJRMV9JUlEsIElSUTFfSVBSX0FERFIsIElSUTFfSVBSX1BPUywgSVJRMV9QUklPUklUWSk7Ci0JbWFrZV9pcHJfaXJxKElSUTJfSVJRLCBJUlEyX0lQUl9BRERSLCBJUlEyX0lQUl9QT1MsIElSUTJfUFJJT1JJVFkpOwotCW1ha2VfaXByX2lycShJUlEzX0lSUSwgSVJRM19JUFJfQUREUiwgSVJRM19JUFJfUE9TLCBJUlEzX1BSSU9SSVRZKTsKLQltYWtlX2lwcl9pcnEoSVJRNF9JUlEsIElSUTRfSVBSX0FERFIsIElSUTRfSVBSX1BPUywgSVJRNF9QUklPUklUWSk7Ci0JbWFrZV9pcHJfaXJxKElSUTVfSVJRLCBJUlE1X0lQUl9BRERSLCBJUlE1X0lQUl9QT1MsIElSUTVfUFJJT1JJVFkpOworCXsgSVJRMF9JUlEsIElSUTBfSVBSX0FERFIsIElSUTBfSVBSX1BPUywgSVJRMF9QUklPUklUWSB9LAorCXsgSVJRMV9JUlEsIElSUTFfSVBSX0FERFIsIElSUTFfSVBSX1BPUywgSVJRMV9QUklPUklUWSB9LAorCXsgSVJRMl9JUlEsIElSUTJfSVBSX0FERFIsIElSUTJfSVBSX1BPUywgSVJRMl9QUklPUklUWSB9LAorCXsgSVJRM19JUlEsIElSUTNfSVBSX0FERFIsIElSUTNfSVBSX1BPUywgSVJRM19QUklPUklUWSB9LAorCXsgSVJRNF9JUlEsIElSUTRfSVBSX0FERFIsIElSUTRfSVBSX1BPUywgSVJRNF9QUklPUklUWSB9LAorCXsgSVJRNV9JUlEsIElSUTVfSVBSX0FERFIsIElSUTVfSVBSX1BPUywgSVJRNV9QUklPUklUWSB9LAogI2VuZGlmCiAjZW5kaWYKK307CisKK3ZvaWQgX19pbml0IGluaXRfSVJRKHZvaWQpCit7CisJbWFrZV9pcHJfaXJxKHN5c19pcHJfbWFwLCBBUlJBWV9TSVpFKHN5c19pcHJfbWFwKSk7CiAKICNpZmRlZiBDT05GSUdfQ1BVX0hBU19QSU5UX0lSUQogCWluaXRfSVJRX3BpbnQoKTsKQEAgLTIwMCw1ICsxNDUsMyBAQAogCXJldHVybiBpcnE7CiB9CiAjZW5kaWYKLQotRVhQT1JUX1NZTUJPTChtYWtlX2lwcl9pcnEpOwpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9rZXJuZWwvY3B1L2lycS9waW50LmMgYi9hcmNoL3NoL2tlcm5lbC9jcHUvaXJxL3BpbnQuYwppbmRleCAxN2Y0N2IzLi5mNjAwMDc3IDEwMDY0NAotLS0gYS9hcmNoL3NoL2tlcm5lbC9jcHUvaXJxL3BpbnQuYworKysgYi9hcmNoL3NoL2tlcm5lbC9jcHUvaXJxL3BpbnQuYwpAQCAtODQsMTIgKzg0LDE2IEBACiAJZGlzYWJsZV9waW50X2lycShpcnEpOwogfQogCitzdGF0aWMgc3RydWN0IGlwcl9kYXRhIHBpbnRfaXByX21hcFtdID0geworCXsgUElOVDBfSVJRLCBQSU5UMF9JUFJfQUREUiwgUElOVDBfSVBSX1BPUywgUElOVDBfUFJJT1JJVFkgfSwKKwl7IFBJTlQ4X0lSUSwgUElOVDhfSVBSX0FERFIsIFBJTlQ4X0lQUl9QT1MsIFBJTlQ4X1BSSU9SSVRZIH0sCit9OworCiB2b2lkIF9faW5pdCBpbml0X0lSUV9waW50KHZvaWQpCiB7CiAJaW50IGk7CiAKLQltYWtlX2lwcl9pcnEoUElOVDBfSVJRLCBQSU5UMF9JUFJfQUREUiwgUElOVDBfSVBSX1BPUywgUElOVDBfUFJJT1JJVFkpOwotCW1ha2VfaXByX2lycShQSU5UOF9JUlEsIFBJTlQ4X0lQUl9BRERSLCBQSU5UOF9JUFJfUE9TLCBQSU5UOF9QUklPUklUWSk7CisJbWFrZV9pcHJfaXJxKHBpbnRfaXByX21hcCwgQVJSQVlfU0laRShwaW50X2lwcl9tYXApKTsKIAogCWVuYWJsZV9pcnEoUElOVDBfSVJRKTsKIAllbmFibGVfaXJxKFBJTlQ4X0lSUSk7CmRpZmYgLS1naXQgYS9hcmNoL3NoL2tlcm5lbC9jcHUvc2gzL2V4LlMgYi9hcmNoL3NoL2tlcm5lbC9jcHUvc2gzL2V4LlMKaW5kZXggNDRkYWY0NC4uYmEzMDgyZCAxMDA2NDQKLS0tIGEvYXJjaC9zaC9rZXJuZWwvY3B1L3NoMy9leC5TCisrKyBiL2FyY2gvc2gva2VybmVsL2NwdS9zaDMvZXguUwpAQCAtNCw3ICs0LDcgQEAKICAqICBUaGUgU0gtMyBleGNlcHRpb24gdmVjdG9yIHRhYmxlLgogCiAgKiAgQ29weXJpZ2h0IChDKSAxOTk5LCAyMDAwLCAyMDAyICBOaWliZSBZdXRha2EKLSAqICBDb3B5cmlnaHQgKEMpIDIwMDMgIFBhdWwgTXVuZHQKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDMgLSAyMDA2ICBQYXVsIE11bmR0CiAgKgogICogVGhpcyBmaWxlIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKICAqIExpY2Vuc2UuICBTZWUgdGhlIGZpbGUgIkNPUFlJTkciIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGlzIGFyY2hpdmUKQEAgLTQ5LDE5OCArNDksMTAgQEAKICNlbmRpZgogRU5UUlkodXNlcl9icmVha19wb2ludF90cmFwKQogCS5sb25nCWJyZWFrX3BvaW50X3RyYXAJLyogMUUwICovCi1FTlRSWShpbnRlcnJ1cHRfdGFibGUpCi0JISBleHRlcm5hbCBoYXJkd2FyZQotCS5sb25nCWRvX0lSUQkhIDAwMDAJCS8qIDIwMCAqLwotCS5sb25nCWRvX0lSUQkhIDAwMDEKLQkubG9uZwlkb19JUlEJISAwMDEwCi0JLmxvbmcJZG9fSVJRCSEgMDAxMQotCS5sb25nCWRvX0lSUQkhIDAxMDAKLQkubG9uZwlkb19JUlEJISAwMTAxCi0JLmxvbmcJZG9fSVJRCSEgMDExMAotCS5sb25nCWRvX0lSUQkhIDAxMTEKLQkubG9uZwlkb19JUlEJISAxMDAwCQkvKiAzMDAgKi8KLQkubG9uZwlkb19JUlEJISAxMDAxCi0JLmxvbmcJZG9fSVJRCSEgMTAxMAotCS5sb25nCWRvX0lSUQkhIDEwMTEKLQkubG9uZwlkb19JUlEJISAxMTAwCi0JLmxvbmcJZG9fSVJRCSEgMTEwMQotCS5sb25nCWRvX0lSUQkhIDExMTAKLQkubG9uZwlleGNlcHRpb25fZXJyb3IJCQotCSEgSW50ZXJuYWwgaGFyZHdhcmUKLQkubG9uZwlkb19JUlEJISBUTVUwIHR1bmkwCS8qIDQwMCAqLwotCS5sb25nCWRvX0lSUQkhIFRNVTEgdHVuaTEKLQkubG9uZwlkb19JUlEJISBUTVUyIHR1bmkyCi0JLmxvbmcJZG9fSVJRCSEgICAgICB0aWNwaTIKLQkubG9uZwlkb19JUlEJISBSVEMgIGF0aQotCS5sb25nCWRvX0lSUQkhICAgICAgcHJpCi0JLmxvbmcJZG9fSVJRCSEgICAgICBjdWkKLQkubG9uZwlkb19JUlEJISBTQ0kgIGVyaQotCS5sb25nCWRvX0lSUQkhICAgICAgcnhpCS8qIDUwMCAqLwotCS5sb25nCWRvX0lSUQkhICAgICAgdHhpCi0JLmxvbmcJZG9fSVJRCSEgICAgICB0ZWkKLQkubG9uZwlkb19JUlEJISBXRFQgIGl0aQkvKiA1NjAgKi8KLQkubG9uZwlkb19JUlEJISBSRUYgIHJjbWkKLQkubG9uZwlkb19JUlEJISAgICAgIHJvdmkKLQkubG9uZwlkb19JUlEJCQkKLQkubG9uZwlkb19JUlEJCQkvKiA1RTAgKi8KLSNpZiAgZGVmaW5lZChDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzA3KSB8fCBcCi0gICAgIGRlZmluZWQoQ09ORklHX0NQVV9TVUJUWVBFX1NINzcwOSkgfHwgXAotICAgICBkZWZpbmVkKENPTkZJR19DUFVfU1VCVFlQRV9TSDc3MDYpIHx8IFwKLSAgICAgZGVmaW5lZChDT05GSUdfQ1BVX1NVQlRZUEVfU0g3MzAwKSB8fCBcCi0gICAgIGRlZmluZWQoQ09ORklHX0NQVV9TVUJUWVBFX1NINzcwNSkgfHwgXAotICAgICBkZWZpbmVkKENPTkZJR19DUFVfU1VCVFlQRV9TSDc3MTApCi0JLmxvbmcJZG9fSVJRCSEgMzIgSVJRICBpcnEwCS8qIDYwMCAqLwotCS5sb25nCWRvX0lSUQkhIDMzICAgICAgaXJxMQotCS5sb25nCWRvX0lSUQkhIDM0ICAgICAgaXJxMgotCS5sb25nCWRvX0lSUQkhIDM1ICAgICAgaXJxMwotCS5sb25nCWRvX0lSUQkhIDM2ICAgICAgaXJxNAotCS5sb25nCWRvX0lSUQkhIDM3ICAgICAgaXJxNQotCS5sb25nCWRvX0lSUQkhIDM4Ci0JLmxvbmcJZG9fSVJRCSEgMzkKLQkubG9uZwlkb19JUlEJISA0MCBQSU5UIHBpbnQwLTcJLyogNzAwICovCi0JLmxvbmcJZG9fSVJRCSEgNDEgICAgICBwaW50OC0xNQotCS5sb25nCWRvX0lSUQkhIDQyCi0JLmxvbmcJZG9fSVJRCSEgNDMKLQkubG9uZwlkb19JUlEJISA0NAotCS5sb25nCWRvX0lSUQkhIDQ1CQotCS5sb25nCWRvX0lSUQkhIDQ2Ci0JLmxvbmcJZG9fSVJRCSEgNDcKLQkubG9uZwlkb19JUlEJISA0OCBETUFDIGRlaTAJLyogODAwICovCi0JLmxvbmcJZG9fSVJRCSEgNDkgICAgICBkZWkxCi0JLmxvbmcJZG9fSVJRCSEgNTAgICAgICBkZWkyCi0JLmxvbmcJZG9fSVJRCSEgNTEgICAgICBkZWkzCi0JLmxvbmcJZG9fSVJRCSEgNTIgSXJEQSBlcmkxCi0JLmxvbmcJZG9fSVJRCSEgNTMgICAgICByeGkxCi0JLmxvbmcJZG9fSVJRCSEgNTQgICAgICBicmkxCi0JLmxvbmcJZG9fSVJRCSEgNTUgICAgICB0eGkxCi0JLmxvbmcJZG9fSVJRCSEgNTYgU0NJRiBlcmkyCi0JLmxvbmcJZG9fSVJRCSEgNTcgICAgICByeGkyCi0JLmxvbmcJZG9fSVJRCSEgNTggICAgICBicmkyCi0JLmxvbmcJZG9fSVJRCSEgNTkgICAgICB0eGkyCi0JLmxvbmcJZG9fSVJRCSEgNjAgQURDICBhZGkJLyogOTgwICovCi0jaWYgZGVmaW5lZChDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzA1KQotCS5sb25nCWV4Y2VwdGlvbl9ub25lCSEgNjEJLyogOUEwICovCi0JLmxvbmcJZXhjZXB0aW9uX25vbmUJISA2MgotCS5sb25nCWV4Y2VwdGlvbl9ub25lCSEgNjMKLQkubG9uZwlleGNlcHRpb25fbm9uZQkhIDY0CS8qIEEwMCAqLwotCS5sb25nCWRvX0lSUQkhIDY1IFVTQiAgdXNpMAotCS5sb25nCWRvX0lSUQkhIDY2ICAgICAgdXNpMQotCS5sb25nCWV4Y2VwdGlvbl9ub25lCSEgNjcKLQkubG9uZwlleGNlcHRpb25fbm9uZQkhIDY4Ci0JLmxvbmcJZXhjZXB0aW9uX25vbmUJISA2OQotCS5sb25nCWV4Y2VwdGlvbl9ub25lCSEgNzAKLQkubG9uZwlleGNlcHRpb25fbm9uZQkhIDcxCi0JLmxvbmcJZXhjZXB0aW9uX25vbmUJISA3MgkvKiBCMDAgKi8KLQkubG9uZwlleGNlcHRpb25fbm9uZQkhIDczCi0JLmxvbmcJZXhjZXB0aW9uX25vbmUJISA3NAotCS5sb25nCWV4Y2VwdGlvbl9ub25lCSEgNzUKLQkubG9uZwlleGNlcHRpb25fbm9uZQkhIDc2Ci0JLmxvbmcJZXhjZXB0aW9uX25vbmUJISA3NwotCS5sb25nCWV4Y2VwdGlvbl9ub25lCSEgNzgKLQkubG9uZwlleGNlcHRpb25fbm9uZQkhIDc5Ci0JLmxvbmcJZG9fSVJRCSEgODAgVFBVMCB0cGkwCS8qIEMwMCAqLwotCS5sb25nCWRvX0lSUQkhIDgxIFRQVTEgdHBpMQotCS5sb25nCWV4Y2VwdGlvbl9ub25lCSEgODIKLQkubG9uZwlleGNlcHRpb25fbm9uZQkhIDgzCi0JLmxvbmcJZG9fSVJRCSEgODQgVFBVMiB0cGkyCi0JLmxvbmcJZG9fSVJRCSEgODUgVFBVMyB0cGkzCS8qIENBMCAqLwotI2VuZGlmCi0jaWYgZGVmaW5lZChDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzA3KSB8fCBkZWZpbmVkKENPTkZJR19DUFVfU1VCVFlQRV9TSDczMDApCi0JLmxvbmcgICBkb19JUlEJISA2MSBMQ0RDIGxjZGkJLyogOUEwICovCi0JLmxvbmcgICBkb19JUlEJISA2MiBQQ0MgIHBjYzBpCi0JLmxvbmcgICBkb19JUlEJISA2MyAgICAgIHBjYzFpCS8qIDlFMCAqLwotI2VuZGlmCi0jaWYgZGVmaW5lZChDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzEwKQotCS5sb25nICAgZXhjZXB0aW9uX25vbmUJISA2MSAJLyogOUEwICovCi0JLmxvbmcgICBleGNlcHRpb25fbm9uZQkhIDYyCi0JLmxvbmcgICBleGNlcHRpb25fbm9uZQkhIDYzCi0JLmxvbmcgICBleGNlcHRpb25fbm9uZQkhIDY0CS8qIEEwMCAqLwotCS5sb25nICAgZXhjZXB0aW9uX25vbmUJISA2NQotCS5sb25nICAgZXhjZXB0aW9uX25vbmUJISA2NgotCS5sb25nICAgZXhjZXB0aW9uX25vbmUJISA2NwotCS5sb25nICAgZXhjZXB0aW9uX25vbmUJISA2OAotCS5sb25nICAgZXhjZXB0aW9uX25vbmUJISA2OQotCS5sb25nICAgZXhjZXB0aW9uX25vbmUJISA3MAotCS5sb25nICAgZXhjZXB0aW9uX25vbmUJISA3MQotCS5sb25nICAgZXhjZXB0aW9uX25vbmUJISA3MgkvKiBCMDAgKi8KLQkubG9uZyAgIGV4Y2VwdGlvbl9ub25lCSEgNzMKLQkubG9uZyAgIGV4Y2VwdGlvbl9ub25lCSEgNzQKLQkubG9uZyAgIGV4Y2VwdGlvbl9ub25lCSEgNzUKLQkubG9uZyAgIGRvX0lSUQkhIDc2IERNQUMyIGRlaTQJLyogQjgwICovCi0JLmxvbmcgICBkb19JUlEJISA3NyBETUFDMiBkZWk1Ci0JLmxvbmcgICBleGNlcHRpb25fbm9uZQkhIDc4Ci0JLmxvbmcgICBkb19JUlEJISA3OSBJUFNFQyBpcHNlY2kgLyogQkUwICovCi0JLmxvbmcgICBkb19JUlEJISA4MCBFRE1BQyBlaW50MCAvKiBDMDAgKi8KLQkubG9uZyAgIGRvX0lSUQkhIDgxIEVETUFDIGVpbnQxCi0JLmxvbmcgICBkb19JUlEJISA4MiBFRE1BQyBlaW50MgotCS5sb25nICAgZXhjZXB0aW9uX25vbmUJISA4MwkvKiBDNjAgKi8KLQkubG9uZyAgIGV4Y2VwdGlvbl9ub25lCSEgODQKLQkubG9uZyAgIGV4Y2VwdGlvbl9ub25lCSEgODUKLQkubG9uZyAgIGV4Y2VwdGlvbl9ub25lCSEgODYKLQkubG9uZyAgIGV4Y2VwdGlvbl9ub25lCSEgODcKLQkubG9uZyAgIGV4Y2VwdGlvbl9ub25lCSEgODgJLyogRDAwICovCi0JLmxvbmcgICBleGNlcHRpb25fbm9uZQkhIDg5Ci0JLmxvbmcgICBleGNlcHRpb25fbm9uZQkhIDkwCi0JLmxvbmcgICBleGNlcHRpb25fbm9uZQkhIDkxCi0JLmxvbmcgICBleGNlcHRpb25fbm9uZQkhIDkyCi0JLmxvbmcgICBleGNlcHRpb25fbm9uZQkhIDkzCi0JLmxvbmcgICBleGNlcHRpb25fbm9uZQkhIDk0Ci0JLmxvbmcgICBleGNlcHRpb25fbm9uZQkhIDk1Ci0JLmxvbmcgICBkb19JUlEJISA5NiBTSU9GIGVyaTAJLyogRTAwICovCi0JLmxvbmcgICBkb19JUlEJISA5NyAgICAgIHR4aTAKLQkubG9uZyAgIGRvX0lSUQkhIDk4ICAgICAgcnhpMAotCS5sb25nICAgZG9fSVJRCSEgOTkgICAgICBjY2kwCi0JLmxvbmcgICBkb19JUlEJISAxMDAgICAgIGVyaTEJLyogRTgwICovCi0JLmxvbmcgICBkb19JUlEJISAxMDEgICAgIHR4aTEKLQkubG9uZyAgIGRvX0lSUQkhIDEwMiAgICAgcnhpMgotCS5sb25nICAgZG9fSVJRCSEgMTAzICAgICBjY2kzCi0jZW5kaWYKLSNpZiBkZWZpbmVkKENPTkZJR19DUFVfU1VCVFlQRV9TSDczMDApCi0JLmxvbmcgICBkb19JUlEJISA2NAotCS5sb25nICAgZG9fSVJRCSEgNjUKLQkubG9uZyAgIGRvX0lSUQkhIDY2Ci0JLmxvbmcgICBkb19JUlEJISA2NwotCS5sb25nICAgZG9fSVJRCSEgNjgKLQkubG9uZyAgIGRvX0lSUQkhIDY5Ci0JLmxvbmcgICBkb19JUlEJISA3MAotCS5sb25nICAgZG9fSVJRCSEgNzEKLQkubG9uZyAgIGRvX0lSUQkhIDcyCi0JLmxvbmcgICBkb19JUlEJISA3MwotCS5sb25nICAgZG9fSVJRCSEgNzQKLQkubG9uZyAgIGRvX0lSUQkhIDc1Ci0JLmxvbmcgICBkb19JUlEJISA3NgotCS5sb25nICAgZG9fSVJRCSEgNzcKLQkubG9uZyAgIGRvX0lSUQkhIDc4Ci0JLmxvbmcgICBkb19JUlEJISA3OQotCS5sb25nICAgZG9fSVJRCSEgODAgU0NJRjAoU0g3MzAwKQotCS5sb25nICAgZG9fSVJRCSEgODEKLQkubG9uZyAgIGRvX0lSUQkhIDgyCi0JLmxvbmcgICBkb19JUlEJISA4MwotCS5sb25nICAgZG9fSVJRCSEgODQKLQkubG9uZyAgIGRvX0lSUQkhIDg1Ci0JLmxvbmcgICBkb19JUlEJISA4NgotCS5sb25nICAgZG9fSVJRCSEgODcKLQkubG9uZyAgIGRvX0lSUQkhIDg4Ci0JLmxvbmcgICBkb19JUlEJISA4OQotCS5sb25nICAgZG9fSVJRCSEgOTAKLQkubG9uZyAgIGRvX0lSUQkhIDkxCi0JLmxvbmcgICBkb19JUlEJISA5MgotCS5sb25nICAgZG9fSVJRCSEgOTMKLQkubG9uZyAgIGRvX0lSUQkhIDk0Ci0JLmxvbmcgICBkb19JUlEJISA5NQotCS5sb25nICAgZG9fSVJRCSEgOTYKLQkubG9uZyAgIGRvX0lSUQkhIDk3Ci0JLmxvbmcgICBkb19JUlEJISA5OAotCS5sb25nICAgZG9fSVJRCSEgOTkKLQkubG9uZyAgIGRvX0lSUQkhIDEwMAotCS5sb25nICAgZG9fSVJRCSEgMTAxCi0JLmxvbmcgICBkb19JUlEJISAxMDIKLQkubG9uZyAgIGRvX0lSUQkhIDEwMwotCS5sb25nICAgZG9fSVJRCSEgMTA0Ci0JLmxvbmcgICBkb19JUlEJISAxMDUKLQkubG9uZyAgIGRvX0lSUQkhIDEwNgotCS5sb25nICAgZG9fSVJRCSEgMTA3Ci0JLmxvbmcgICBkb19JUlEJISAxMDgKLSNlbmRpZgotI2VuZGlmCisKKwkvKgorCSAqIFBhZCB0aGUgcmVtYWluZGVyIG9mIHRoZSB0YWJsZSBvdXQsIGV4Y2VwdGlvbnMgcmVzaWRpbmcgaW4gZmFyCisJICogYXdheSBvZmZzZXRzIGNhbiBiZSBtYW51YWxseSBpbnNlcnRlZCBpbiB0byB0aGVpciBhcHByb3ByaWF0ZQorCSAqIGxvY2F0aW9uIHZpYSBzZXRfZXhjZXB0aW9uX3RhYmxlX3tldnQsdmVjfSgpLgorCSAqLworCS5iYWxpZ24gNDA5NiwwLDQwOTYKZGlmZiAtLWdpdCBhL2FyY2gvc2gva2VybmVsL2NwdS9zaDQvZXguUyBiL2FyY2gvc2gva2VybmVsL2NwdS9zaDQvZXguUwppbmRleCA3MTQ2ODkzLi5hYzhhYjU3IDEwMDY0NAotLS0gYS9hcmNoL3NoL2tlcm5lbC9jcHUvc2g0L2V4LlMKKysrIGIvYXJjaC9zaC9rZXJuZWwvY3B1L3NoNC9leC5TCkBAIC00LDcgKzQsNyBAQAogICogIFRoZSBTSC00IGV4Y2VwdGlvbiB2ZWN0b3IgdGFibGUuCiAKICAqICBDb3B5cmlnaHQgKEMpIDE5OTksIDIwMDAsIDIwMDIgIE5paWJlIFl1dGFrYQotICogIENvcHlyaWdodCAoQykgMjAwMyAgUGF1bCBNdW5kdAorICogIENvcHlyaWdodCAoQykgMjAwMyAtIDIwMDYgIFBhdWwgTXVuZHQKICAqCiAgKiBUaGlzIGZpbGUgaXMgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwogICogTGljZW5zZS4gIFNlZSB0aGUgZmlsZSAiQ09QWUlORyIgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoaXMgYXJjaGl2ZQpAQCAtNTMsNTAzICs1MywxMCBAQAogI2VuZGlmCiBFTlRSWSh1c2VyX2JyZWFrX3BvaW50X3RyYXApCiAJLmxvbmcJYnJlYWtfcG9pbnRfdHJhcAkvKiAxRTAgKi8KLUVOVFJZKGludGVycnVwdF90YWJsZSkKLQkhIGV4dGVybmFsIGhhcmR3YXJlCi0JLmxvbmcJZG9fSVJRCSEgMDAwMAkJLyogMjAwICovCi0JLmxvbmcJZG9fSVJRCSEgMDAwMQotCS5sb25nCWRvX0lSUQkhIDAwMTAKLQkubG9uZwlkb19JUlEJISAwMDExCi0JLmxvbmcJZG9fSVJRCSEgMDEwMAotCS5sb25nCWRvX0lSUQkhIDAxMDEKLQkubG9uZwlkb19JUlEJISAwMTEwCi0JLmxvbmcJZG9fSVJRCSEgMDExMQotCS5sb25nCWRvX0lSUQkhIDEwMDAJCS8qIDMwMCAqLwotCS5sb25nCWRvX0lSUQkhIDEwMDEKLQkubG9uZwlkb19JUlEJISAxMDEwCi0JLmxvbmcJZG9fSVJRCSEgMTAxMQotCS5sb25nCWRvX0lSUQkhIDExMDAKLQkubG9uZwlkb19JUlEJISAxMTAxCi0JLmxvbmcJZG9fSVJRCSEgMTExMAotCS5sb25nCWV4Y2VwdGlvbl9lcnJvcgkJCi0JISBJbnRlcm5hbCBoYXJkd2FyZQotI2lmbmRlZiBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzgwCi0JLmxvbmcJZG9fSVJRCSEgVE1VMCB0dW5pMAkvKiA0MDAgKi8KLQkubG9uZwlkb19JUlEJISBUTVUxIHR1bmkxCi0JLmxvbmcJZG9fSVJRCSEgVE1VMiB0dW5pMgotCS5sb25nCWRvX0lSUQkhICAgICAgdGljcGkyCi0jaWYgIGRlZmluZWQoQ09ORklHX0NQVV9TVUJUWVBFX1NINzc2MCkKLQkubG9uZwlleGNlcHRpb25fZXJyb3IKLQkubG9uZwlleGNlcHRpb25fZXJyb3IKLQkubG9uZwlleGNlcHRpb25fZXJyb3IKLQkubG9uZwlleGNlcHRpb25fZXJyb3IKLQkubG9uZwlleGNlcHRpb25fZXJyb3IJCQkvKiA1MDAgKi8KLQkubG9uZwlleGNlcHRpb25fZXJyb3IKLQkubG9uZwlleGNlcHRpb25fZXJyb3IKLSNlbHNlCi0JLmxvbmcJZG9fSVJRCSEgUlRDICBhdGkKLQkubG9uZwlkb19JUlEJISAgICAgIHByaQotCS5sb25nCWRvX0lSUQkhICAgICAgY3VpCi0JLmxvbmcJZG9fSVJRCSEgU0NJICBlcmkKLQkubG9uZwlkb19JUlEJISAgICAgIHJ4aQkvKiA1MDAgKi8KLQkubG9uZwlkb19JUlEJISAgICAgIHR4aQotCS5sb25nCWRvX0lSUQkhICAgICAgdGVpCi0jZW5kaWYKLQkubG9uZwlkb19JUlEJISBXRFQgIGl0aQkvKiA1NjAgKi8KLQkubG9uZwlkb19JUlEJISBSRUYgIHJjbWkKLQkubG9uZwlkb19JUlEJISAgICAgIHJvdmkKLQkubG9uZwlkb19JUlEJCQkKLQkubG9uZwlkb19JUlEJCQkvKiA1RTAgKi8KLQkubG9uZwlkb19JUlEJISAzMiBIaXRhY2hpIFVESQkvKiA2MDAgKi8KLQkubG9uZwlkb19JUlEJISAzMyBHUElPCi0JLmxvbmcJZG9fSVJRCSEgMzQgRE1BQyBkbXRlMAotCS5sb25nCWRvX0lSUQkhIDM1ICAgICAgZG10ZTEKLQkubG9uZwlkb19JUlEJISAzNiAgICAgIGRtdGUyCi0JLmxvbmcJZG9fSVJRCSEgMzcgICAgICBkbXRlMwotCS5sb25nCWRvX0lSUQkhIDM4ICAgICAgZG1hZQotCS5sb25nCWV4Y2VwdGlvbl9lcnJvcgkJCSEgMzkJLyogNkUwICovCi0jaWYgZGVmaW5lZChDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzYwKQotCS5sb25nCWV4Y2VwdGlvbl9lcnJvcgkJCQkvKiA3MDAgKi8KLQkubG9uZwlleGNlcHRpb25fZXJyb3IKLQkubG9uZwlleGNlcHRpb25fZXJyb3IKLQkubG9uZwlleGNlcHRpb25fZXJyb3IJCQkJLyogNzYwICovCi0jZWxzZQotCS5sb25nCWRvX0lSUQkhIDQwIFNDSUYgZXJpCQkvKiA3MDAgKi8KLQkubG9uZwlkb19JUlEJISA0MSAgICAgIHJ4aQotCS5sb25nCWRvX0lSUQkhIDQyICAgICAgYnJpCi0JLmxvbmcJZG9fSVJRCSEgNDMgICAgICB0eGkKLSNlbmRpZgotI2lmIENPTkZJR19OUl9PTkNISVBfRE1BX0NIQU5ORUxTID09IDgKLQkubG9uZwlkb19JUlEJISA0NCBETUFDIGRtdGU0CQkvKiA3ODAgKi8KLQkubG9uZwlkb19JUlEJISA0NSAgICAgIGRtdGU1Ci0JLmxvbmcJZG9fSVJRCSEgNDYgICAgICBkbXRlNgotCS5sb25nCWRvX0lSUQkhIDQ3ICAgICAgZG10ZTcJCS8qIDdFMCAqLwotI2VsaWYgZGVmaW5lZChDT05GSUdfQ1BVX1NVQlRZUEVfU0g3MzQzKQotCS5sb25nCWRvX0lSUQkhIDQ0IElJQzEgYWxpCQkvKiA3ODAgKi8KLQkubG9uZwlkb19JUlEJISA0NSAgICAgIHRhY2tpCi0JLmxvbmcJZG9fSVJRCSEgNDYgICAgICB3YWl0aQotCS5sb25nCWRvX0lSUQkhIDQ3ICAgICAgZHRlaQkJLyogN0UwICovCi0JLmxvbmcJZG9fSVJRCSEgNDggRE1BQyBkZWkwCQkvKiA4MDAgKi8KLQkubG9uZwlkb19JUlEJISA0OSAgICAgIGRlaTEJCS8qIDgyMCAqLwotI2Vsc2UKLQkubG9uZwlleGNlcHRpb25fZXJyb3IJCQkhIDQ0CS8qIDc4MCAqLwotCS5sb25nCWV4Y2VwdGlvbl9lcnJvcgkJCSEgNDUKLQkubG9uZwlleGNlcHRpb25fZXJyb3IJCQkhIDQ2Ci0JLmxvbmcJZXhjZXB0aW9uX2Vycm9yCQkJISA0NwotI2VuZGlmCi0jaWYgZGVmaW5lZChDT05GSUdfU0hfRlBVKQotCS5sb25nCWRvX2ZwdV9zdGF0ZV9yZXN0b3JlCSEgNDgJLyogODAwICovCi0JLmxvbmcJZG9fZnB1X3N0YXRlX3Jlc3RvcmUJISA0OQkvKiA4MjAgKi8KLSNlbGlmICFkZWZpbmVkKENPTkZJR19DUFVfU1VCVFlQRV9TSDczNDMpICYmIFwKLSAgICAgICFkZWZpbmVkKENPTkZJR19DUFVfU1VCVFlQRV9TSDczMTgwKQotCS5sb25nCWV4Y2VwdGlvbl9lcnJvcgotCS5sb25nCWV4Y2VwdGlvbl9lcnJvcgotI2VuZGlmCi0jaWYgZGVmaW5lZChDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzUxKQotCS5sb25nCWV4Y2VwdGlvbl9lcnJvcgkJCS8qIDg0MCAqLwotCS5sb25nCWV4Y2VwdGlvbl9lcnJvcgotCS5sb25nCWV4Y2VwdGlvbl9lcnJvcgotCS5sb25nCWV4Y2VwdGlvbl9lcnJvcgotCS5sb25nCWV4Y2VwdGlvbl9lcnJvcgotCS5sb25nCWV4Y2VwdGlvbl9lcnJvcgotCS5sb25nCWV4Y2VwdGlvbl9lcnJvcgkJCS8qIDkwMCAqLwotCS5sb25nCWV4Y2VwdGlvbl9lcnJvcgotCS5sb25nCWV4Y2VwdGlvbl9lcnJvcgotCS5sb25nCWV4Y2VwdGlvbl9lcnJvcgotCS5sb25nCWV4Y2VwdGlvbl9lcnJvcgotCS5sb25nCWV4Y2VwdGlvbl9lcnJvcgotCS5sb25nCWV4Y2VwdGlvbl9lcnJvcgotCS5sb25nCWV4Y2VwdGlvbl9lcnJvcgotCS5sb25nCWRvX0lSUQkhIFBDSSBzZXJyCS8qIEEwMCAqLwotCS5sb25nCWRvX0lSUQkhICAgICBkbWEzCi0JLmxvbmcJZG9fSVJRCSEgICAgIGRtYTIKLQkubG9uZwlkb19JUlEJISAgICAgZG1hMQotCS5sb25nCWRvX0lSUQkhICAgICBkbWEwCi0JLmxvbmcJZG9fSVJRCSEgICAgIHB3b24KLQkubG9uZwlkb19JUlEJISAgICAgcHdkd24KLQkubG9uZwlkb19JUlEJISAgICAgZXJyCi0JLmxvbmcJZG9fSVJRCSEgVE1VMyB0dW5pMwkvKiBCMDAgKi8KLQkubG9uZwlleGNlcHRpb25fZXJyb3IKLQkubG9uZwlleGNlcHRpb25fZXJyb3IKLQkubG9uZwlleGNlcHRpb25fZXJyb3IKLQkubG9uZwlkb19JUlEJISBUTVU0IHR1bmk0CS8qIEI4MCAqLwotI2VsaWYgZGVmaW5lZChDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzYwKQotCS5sb25nCWRvX0lSUQkhIElSUQlpcnE2CS8qIDg0MCAqLwotCS5sb25nCWRvX0lSUQkhCWlycTcKLQkubG9uZwlkb19JUlEJISBTQ0lGCWVyaTAKLQkubG9uZwlkb19JUlEJIQlyeGkwCi0JLmxvbmcJZG9fSVJRCSEJYnJpMAotCS5sb25nCWRvX0lSUQkhCXR4aTAKLQkubG9uZwlkb19JUlEJISBIQ0FOMgljYW5pMAkvKiA5MDAgKi8KLQkubG9uZwlkb19JUlEJIQljYW5pMQotCS5sb25nCWRvX0lSUQkhIFNTSQlzc2lpMAotCS5sb25nCWRvX0lSUQkhCXNzaWkxCi0JLmxvbmcJZG9fSVJRCSEgSEFDCWhhY2kwCi0JLmxvbmcJZG9fSVJRCSEJaGFjaTEKLQkubG9uZwlkb19JUlEJISBJSUMJaWljaTAKLQkubG9uZwlkb19JUlEJIQlpaWNpMQotCS5sb25nCWRvX0lSUQkhIFVTQgl1c2JpCS8qIEEwMCAqLwotCS5sb25nCWRvX0lSUQkhIExDREMJdmludAotCS5sb25nCWV4Y2VwdGlvbl9lcnJvcgotCS5sb25nCWV4Y2VwdGlvbl9lcnJvcgotCS5sb25nCWRvX0lSUQkhIERNQUJSRyBkbWFicmdpMAotCS5sb25nCWRvX0lSUQkhICAgICAgICBkbWFicmdpMQotCS5sb25nCWRvX0lSUQkhICAgICAgICBkbWFicmdpMgotCS5sb25nCWV4Y2VwdGlvbl9lcnJvcgotCS5sb25nCWRvX0lSUQkhIFNDSUYJZXJpMQkvKiBCMDAgKi8KLQkubG9uZwlkb19JUlEJIQlyeGkxCi0JLmxvbmcJZG9fSVJRCSEJYnJpMQotCS5sb25nCWRvX0lSUQkhCXR4aTEKLQkubG9uZwlkb19JUlEJIQllcmkyCi0JLmxvbmcJZG9fSVJRCSEJcnhpMgotCS5sb25nCWRvX0lSUQkhCWJyaTIKLQkubG9uZwlkb19JUlEgICEJdHhpMgotCS5sb25nCWRvX0lSUQkhIFNJTQlzaW1lcmkJLyogQzAwICovCi0JLmxvbmcJZG9fSVJRCSEJc2ltcnhpCi0JLmxvbmcJZG9fSVJRCSEJc2ltdHhpCi0JLmxvbmcJZG9fSVJRCSEJc2ltdGVpCi0JLmxvbmcJZG9fSVJRCSEgSFNQSQlzcGlpCi0JLmxvbmcJZXhjZXB0aW9uX2Vycm9yCi0JLmxvbmcJZXhjZXB0aW9uX2Vycm9yCi0JLmxvbmcJZXhjZXB0aW9uX2Vycm9yCi0JLmxvbmcJZG9fSVJRCSEgTU1DSUYJbW1jaTAJLyogRDAwICovCi0JLmxvbmcJZG9fSVJRCSEJbW1jaTEKLQkubG9uZwlkb19JUlEJIQltbWNpMgotCS5sb25nCWRvX0lSUQkhCW1tY2kzCi0JLmxvbmcJZXhjZXB0aW9uX2Vycm9yCi0JLmxvbmcJZXhjZXB0aW9uX2Vycm9yCi0JLmxvbmcJZXhjZXB0aW9uX2Vycm9yCi0JLmxvbmcJZXhjZXB0aW9uX2Vycm9yCi0JLmxvbmcJZXhjZXB0aW9uX2Vycm9yCQkJLyogRTAwICovCi0JLmxvbmcJZXhjZXB0aW9uX2Vycm9yCi0JLmxvbmcJZXhjZXB0aW9uX2Vycm9yCi0JLmxvbmcJZXhjZXB0aW9uX2Vycm9yCi0JLmxvbmcJZG9fSVJRCSEgTUZJCW1maWkKLQkubG9uZwlleGNlcHRpb25fZXJyb3IKLQkubG9uZwlleGNlcHRpb25fZXJyb3IKLQkubG9uZwlleGNlcHRpb25fZXJyb3IKLQkubG9uZwlleGNlcHRpb25fZXJyb3IJCQkvKiBGMDAgKi8KLQkubG9uZwlleGNlcHRpb25fZXJyb3IKLQkubG9uZwlleGNlcHRpb25fZXJyb3IKLQkubG9uZwlleGNlcHRpb25fZXJyb3IKLQkubG9uZwlkb19JUlEJISBBREMJYWRpCi0JLmxvbmcJZG9fSVJRCSEgQ01UCWNtdGkJLyogRkEwICovCi0jZWxpZiBkZWZpbmVkKENPTkZJR19DUFVfU1VCVFlQRV9TSDczMTgwKSB8fCBkZWZpbmVkKENPTkZJR19DUFVfU1VCVFlQRV9TSDczNDMpCi0JLmxvbmcJZG9fSVJRCSEgIDUwIDB4ODQwCi0JLmxvbmcJZG9fSVJRCSEgIDUxIDB4ODYwCi0JLmxvbmcJZG9fSVJRCSEgIDUyIDB4ODgwCi0JLmxvbmcJZG9fSVJRCSEgIDUzIDB4OGEwCi0JLmxvbmcJZG9fSVJRCSEgIDU0IDB4OGMwCi0JLmxvbmcJZG9fSVJRCSEgIDU1IDB4OGUwCi0JLmxvbmcJZG9fSVJRCSEgIDU2IDB4OTAwCi0JLmxvbmcJZG9fSVJRCSEgIDU3IDB4OTIwCi0JLmxvbmcJZG9fSVJRCSEgIDU4IDB4OTQwCi0JLmxvbmcJZG9fSVJRCSEgIDU5IDB4OTYwCi0JLmxvbmcJZG9fSVJRCSEgIDYwIDB4OTgwCi0JLmxvbmcJZG9fSVJRCSEgIDYxIDB4OWEwCi0JLmxvbmcJZG9fSVJRCSEgIDYyIDB4OWMwCi0JLmxvbmcJZG9fSVJRCSEgIDYzIDB4OWUwCi0JLmxvbmcJZG9fSVJRCSEgIDY0IDB4YTAwCi0JLmxvbmcJZG9fSVJRCSEgIDY1IDB4YTIwCi0JLmxvbmcJZG9fSVJRCSEgIDY2IDB4YTQwCi0JLmxvbmcJZG9fSVJRCSEgIDY3IDB4YTYwCi0JLmxvbmcJZG9fSVJRCSEgIDY4IDB4YTgwCi0JLmxvbmcJZG9fSVJRCSEgIDY5IDB4YWEwCi0JLmxvbmcJZG9fSVJRCSEgIDcwIDB4YWMwCi0JLmxvbmcJZG9fSVJRCSEgIDcxIDB4YWUwCi0JLmxvbmcJZG9fSVJRCSEgIDcyIDB4YjAwCi0JLmxvbmcJZG9fSVJRCSEgIDczIDB4YjIwCi0JLmxvbmcJZG9fSVJRCSEgIDc0IDB4YjQwCi0JLmxvbmcJZG9fSVJRCSEgIDc1IDB4YjYwCi0JLmxvbmcJZG9fSVJRCSEgIDc2IDB4YjgwCi0JLmxvbmcJZG9fSVJRCSEgIDc3IDB4YmEwCi0JLmxvbmcJZG9fSVJRCSEgIDc4IDB4YmMwCi0JLmxvbmcJZG9fSVJRCSEgIDc5IDB4YmUwCi0JLmxvbmcJZG9fSVJRCSEgIDgwIDB4YzAwCi0JLmxvbmcJZG9fSVJRCSEgIDgxIDB4YzIwCi0JLmxvbmcJZG9fSVJRCSEgIDgyIDB4YzQwCi0JLmxvbmcJZG9fSVJRCSEgIDgzIDB4YzYwCi0JLmxvbmcJZG9fSVJRCSEgIDg0IDB4YzgwCi0JLmxvbmcJZG9fSVJRCSEgIDg1IDB4Y2EwCi0JLmxvbmcJZG9fSVJRCSEgIDg2IDB4Y2MwCi0JLmxvbmcJZG9fSVJRCSEgIDg3IDB4Y2UwCi0JLmxvbmcJZG9fSVJRCSEgIDg4IDB4ZDAwCi0JLmxvbmcJZG9fSVJRCSEgIDg5IDB4ZDIwCi0JLmxvbmcJZG9fSVJRCSEgIDkwIDB4ZDQwCi0JLmxvbmcJZG9fSVJRCSEgIDkxIDB4ZDYwCi0JLmxvbmcJZG9fSVJRCSEgIDkyIDB4ZDgwCi0JLmxvbmcJZG9fSVJRCSEgIDkzIDB4ZGEwCi0JLmxvbmcJZG9fSVJRCSEgIDk0IDB4ZGMwCi0JLmxvbmcJZG9fSVJRCSEgIDk1IDB4ZGUwCi0JLmxvbmcJZG9fSVJRCSEgIDk2IDB4ZTAwCi0JLmxvbmcJZG9fSVJRCSEgIDk3IDB4ZTIwCi0JLmxvbmcJZG9fSVJRCSEgIDk4IDB4ZTQwCi0JLmxvbmcJZG9fSVJRCSEgIDk5IDB4ZTYwCi0JLmxvbmcJZG9fSVJRCSEgMTAwIDB4ZTgwCi0JLmxvbmcJZG9fSVJRCSEgMTAxIDB4ZWEwCi0JLmxvbmcJZG9fSVJRCSEgMTAyIDB4ZWMwCi0JLmxvbmcJZG9fSVJRCSEgMTAzIDB4ZWUwCi0JLmxvbmcJZG9fSVJRCSEgMTA0IDB4ZjAwCi0JLmxvbmcJZG9fSVJRCSEgMTA1IDB4ZjIwCi0JLmxvbmcJZG9fSVJRCSEgMTA2IDB4ZjQwCi0JLmxvbmcJZG9fSVJRCSEgMTA3IDB4ZjYwCi0JLmxvbmcJZG9fSVJRCSEgMTA4IDB4ZjgwCi0jZWxpZiBkZWZpbmVkKENPTkZJR19DUFVfU1VCVFlQRV9TVDQwU1RCMSkKLQkubG9uZwlleGNlcHRpb25fZXJyb3IJCQkhICA1MCAweDg0MAotCS5sb25nCWV4Y2VwdGlvbl9lcnJvcgkJCSEgIDUxIDB4ODYwCi0JLmxvbmcJZXhjZXB0aW9uX2Vycm9yCQkJISAgNTIgMHg4ODAKLQkubG9uZwlleGNlcHRpb25fZXJyb3IJCQkhICA1MyAweDhhMAotCS5sb25nCWV4Y2VwdGlvbl9lcnJvcgkJCSEgIDU0IDB4OGMwCi0JLmxvbmcJZXhjZXB0aW9uX2Vycm9yCQkJISAgNTUgMHg4ZTAKLQkubG9uZwlleGNlcHRpb25fZXJyb3IJCQkhICA1NiAweDkwMAotCS5sb25nCWV4Y2VwdGlvbl9lcnJvcgkJCSEgIDU3IDB4OTIwCi0JLmxvbmcJZXhjZXB0aW9uX2Vycm9yCQkJISAgNTggMHg5NDAKLQkubG9uZwlleGNlcHRpb25fZXJyb3IJCQkhICA1OSAweDk2MAotCS5sb25nCWV4Y2VwdGlvbl9lcnJvcgkJCSEgIDYwIDB4OTgwCi0JLmxvbmcJZXhjZXB0aW9uX2Vycm9yCQkJISAgNjEgMHg5YTAKLQkubG9uZwlleGNlcHRpb25fZXJyb3IJCQkhICA2MiAweDljMAotCS5sb25nCWV4Y2VwdGlvbl9lcnJvcgkJCSEgIDYzIDB4OWUwCi0JLmxvbmcJZG9fSVJRCSEgIDY0IDB4YTAwIFBDSSBzZXJyCi0JLmxvbmcJZG9fSVJRCSEgIDY1IDB4YTIwICAgICBlcnIKLQkubG9uZwlkb19JUlEJISAgNjYgMHhhNDAgICAgIGFkCi0JLmxvbmcJZG9fSVJRCSEgIDY3IDB4YTYwICAgICBwd3JfZHduCi0JLmxvbmcJZXhjZXB0aW9uX2Vycm9yCQkJISAgNjggMHhhODAKLQkubG9uZwlleGNlcHRpb25fZXJyb3IJCQkhICA2OSAweGFhMAotCS5sb25nCWV4Y2VwdGlvbl9lcnJvcgkJCSEgIDcwIDB4YWMwCi0JLmxvbmcJZXhjZXB0aW9uX2Vycm9yCQkJISAgNzEgMHhhZTAKLQkubG9uZwlkb19JUlEJISAgNzIgMHhiMDAgRE1BIElOVDAKLQkubG9uZwlkb19JUlEJISAgNzMgMHhiMjAgICAgIElOVDEKLQkubG9uZwlkb19JUlEJISAgNzQgMHhiNDAgICAgIElOVDIKLQkubG9uZwlkb19JUlEJISAgNzUgMHhiNjAgICAgIElOVDMKLQkubG9uZwlkb19JUlEJISAgNzYgMHhiODAgICAgIElOVDQKLQkubG9uZwlleGNlcHRpb25fZXJyb3IJCQkhICA3NyAweGJhMAotCS5sb25nCWRvX0lSUQkhICA3OCAweGJjMCBETUEgRVJSCi0JLmxvbmcJZXhjZXB0aW9uX2Vycm9yCQkJISAgNzkgMHhiZTAKLQkubG9uZwlkb19JUlEJISAgODAgMHhjMDAgUElPMAotCS5sb25nCWRvX0lSUQkhICA4MSAweGMyMCBQSU8xCi0JLmxvbmcJZG9fSVJRCSEgIDgyIDB4YzQwIFBJTzIKLQkubG9uZwlleGNlcHRpb25fZXJyb3IJCQkhICA4MyAweGM2MAotCS5sb25nCWV4Y2VwdGlvbl9lcnJvcgkJCSEgIDg0IDB4YzgwCi0JLmxvbmcJZXhjZXB0aW9uX2Vycm9yCQkJISAgODUgMHhjYTAKLQkubG9uZwlleGNlcHRpb25fZXJyb3IJCQkhICA4NiAweGNjMAotCS5sb25nCWV4Y2VwdGlvbl9lcnJvcgkJCSEgIDg3IDB4Y2UwCi0JLmxvbmcJZXhjZXB0aW9uX2Vycm9yCQkJISAgODggMHhkMDAKLQkubG9uZwlleGNlcHRpb25fZXJyb3IJCQkhICA4OSAweGQyMAotCS5sb25nCWV4Y2VwdGlvbl9lcnJvcgkJCSEgIDkwIDB4ZDQwCi0JLmxvbmcJZXhjZXB0aW9uX2Vycm9yCQkJISAgOTEgMHhkNjAKLQkubG9uZwlleGNlcHRpb25fZXJyb3IJCQkhICA5MiAweGQ4MAotCS5sb25nCWV4Y2VwdGlvbl9lcnJvcgkJCSEgIDkzIDB4ZGEwCi0JLmxvbmcJZXhjZXB0aW9uX2Vycm9yCQkJISAgOTQgMHhkYzAKLQkubG9uZwlleGNlcHRpb25fZXJyb3IJCQkhICA5NSAweGRlMAotCS5sb25nCWV4Y2VwdGlvbl9lcnJvcgkJCSEgIDk2IDB4ZTAwCi0JLmxvbmcJZXhjZXB0aW9uX2Vycm9yCQkJISAgOTcgMHhlMjAKLQkubG9uZwlleGNlcHRpb25fZXJyb3IJCQkhICA5OCAweGU0MAotCS5sb25nCWV4Y2VwdGlvbl9lcnJvcgkJCSEgIDk5IDB4ZTYwCi0JLmxvbmcJZXhjZXB0aW9uX2Vycm9yCQkJISAxMDAgMHhlODAKLQkubG9uZwlleGNlcHRpb25fZXJyb3IJCQkhIDEwMSAweGVhMAotCS5sb25nCWV4Y2VwdGlvbl9lcnJvcgkJCSEgMTAyIDB4ZWMwCi0JLmxvbmcJZXhjZXB0aW9uX2Vycm9yCQkJISAxMDMgMHhlZTAKLQkubG9uZwlleGNlcHRpb25fZXJyb3IJCQkhIDEwNCAweGYwMAotCS5sb25nCWV4Y2VwdGlvbl9lcnJvcgkJCSEgMTA1IDB4ZjIwCi0JLmxvbmcJZXhjZXB0aW9uX2Vycm9yCQkJISAxMDYgMHhmNDAKLQkubG9uZwlleGNlcHRpb25fZXJyb3IJCQkhIDEwNyAweGY2MAotCS5sb25nCWV4Y2VwdGlvbl9lcnJvcgkJCSEgMTA4IDB4ZjgwCi0JLmxvbmcJZXhjZXB0aW9uX2Vycm9yCQkJISAxMDkgMHhmYTAKLQkubG9uZwlleGNlcHRpb25fZXJyb3IJCQkhIDExMCAweGZjMAotCS5sb25nCWV4Y2VwdGlvbl9lcnJvcgkJCSEgMTExIDB4ZmUwCi0JLmxvbmcJZG9fSVJRCSEgMTEyIDB4MTAwMCBNYWlsYm94Ci0JLmxvbmcJZXhjZXB0aW9uX2Vycm9yCQkJISAxMTMgMHgxMDIwCi0JLmxvbmcJZXhjZXB0aW9uX2Vycm9yCQkJISAxMTQgMHgxMDQwCi0JLmxvbmcJZXhjZXB0aW9uX2Vycm9yCQkJISAxMTUgMHgxMDYwCi0JLmxvbmcJZXhjZXB0aW9uX2Vycm9yCQkJISAxMTYgMHgxMDgwCi0JLmxvbmcJZXhjZXB0aW9uX2Vycm9yCQkJISAxMTcgMHgxMGEwCi0JLmxvbmcJZXhjZXB0aW9uX2Vycm9yCQkJISAxMTggMHgxMGMwCi0JLmxvbmcJZXhjZXB0aW9uX2Vycm9yCQkJISAxMTkgMHgxMGUwCi0JLmxvbmcJZXhjZXB0aW9uX2Vycm9yCQkJISAxMjAgMHgxMTAwCi0JLmxvbmcJZXhjZXB0aW9uX2Vycm9yCQkJISAxMjEgMHgxMTIwCi0JLmxvbmcJZXhjZXB0aW9uX2Vycm9yCQkJISAxMjIgMHgxMTQwCi0JLmxvbmcJZXhjZXB0aW9uX2Vycm9yCQkJISAxMjMgMHgxMTYwCi0JLmxvbmcJZXhjZXB0aW9uX2Vycm9yCQkJISAxMjQgMHgxMTgwCi0JLmxvbmcJZXhjZXB0aW9uX2Vycm9yCQkJISAxMjUgMHgxMWEwCi0JLmxvbmcJZXhjZXB0aW9uX2Vycm9yCQkJISAxMjYgMHgxMWMwCi0JLmxvbmcJZXhjZXB0aW9uX2Vycm9yCQkJISAxMjcgMHgxMWUwCi0JLmxvbmcJZXhjZXB0aW9uX2Vycm9yCQkJISAxMjggMHgxMjAwCi0JLmxvbmcJZXhjZXB0aW9uX2Vycm9yCQkJISAxMjkgMHgxMjIwCi0JLmxvbmcJZXhjZXB0aW9uX2Vycm9yCQkJISAxMzAgMHgxMjQwCi0JLmxvbmcJZXhjZXB0aW9uX2Vycm9yCQkJISAxMzEgMHgxMjYwCi0JLmxvbmcJZXhjZXB0aW9uX2Vycm9yCQkJISAxMzIgMHgxMjgwCi0JLmxvbmcJZXhjZXB0aW9uX2Vycm9yCQkJISAxMzMgMHgxMmEwCi0JLmxvbmcJZXhjZXB0aW9uX2Vycm9yCQkJISAxMzQgMHgxMmMwCi0JLmxvbmcJZXhjZXB0aW9uX2Vycm9yCQkJISAxMzUgMHgxMmUwCi0JLmxvbmcJZXhjZXB0aW9uX2Vycm9yCQkJISAxMzYgMHgxMzAwCi0JLmxvbmcJZXhjZXB0aW9uX2Vycm9yCQkJISAxMzcgMHgxMzIwCi0JLmxvbmcJZXhjZXB0aW9uX2Vycm9yCQkJISAxMzggMHgxMzQwCi0JLmxvbmcJZXhjZXB0aW9uX2Vycm9yCQkJISAxMzkgMHgxMzYwCi0JLmxvbmcJZG9fSVJRCSEgMTQwIDB4MTM4MCBFTVBJIElOVl9BRERSCi0JLmxvbmcJZXhjZXB0aW9uX2Vycm9yCQkJISAxNDEgMHgxM2EwCi0JLmxvbmcJZXhjZXB0aW9uX2Vycm9yCQkJISAxNDIgMHgxM2MwCi0JLmxvbmcJZXhjZXB0aW9uX2Vycm9yCQkJISAxNDMgMHgxM2UwCi0jZWxpZiBkZWZpbmVkKENPTkZJR19DUFVfU1VCVFlQRV9TSDc3NzApCi0JLmxvbmcJZG9fSVJRCSEgIDUwIDB4ODQwCi0JLmxvbmcJZG9fSVJRCSEgIDUxIDB4ODYwCi0JLmxvbmcJZG9fSVJRCSEgIDUyIDB4ODgwCi0JLmxvbmcJZG9fSVJRCSEgIDUzIDB4OGEwCi0JLmxvbmcJZG9fSVJRCSEgIDU0IDB4OGMwCi0JLmxvbmcJZG9fSVJRCSEgIDU1IDB4OGUwCi0JLmxvbmcJZG9fSVJRCSEgIDU2IDB4OTAwCi0JLmxvbmcJZG9fSVJRCSEgIDU3IDB4OTIwCi0JLmxvbmcJZG9fSVJRCSEgIDU4IDB4OTQwCi0JLmxvbmcJZG9fSVJRCSEgIDU5IDB4OTYwCi0JLmxvbmcJZG9fSVJRCSEgIDYwIDB4OTgwCi0JLmxvbmcJZG9fSVJRCSEgIDYxIDB4OWEwCi0JLmxvbmcJZG9fSVJRCSEgIDYyIDB4OWMwCi0JLmxvbmcJZG9fSVJRCSEgIDYzIDB4OWUwCi0JLmxvbmcJZG9fSVJRCSEgIDY0IDB4YTAwCi0JLmxvbmcJZG9fSVJRCSEgIDY1IDB4YTIwCi0JLmxvbmcJZG9fSVJRCSEgIDY2IDB4YTRkCi0JLmxvbmcJZG9fSVJRCSEgIDY3IDB4YTYwCi0JLmxvbmcJZG9fSVJRCSEgIDY4IDB4YTgwCi0JLmxvbmcJZG9fSVJRCSEgIDY5IDB4YWEwCi0JLmxvbmcJZG9fSVJRCSEgIDcwIDB4YWMwCi0JLmxvbmcJZG9fSVJRCSEgIDcxIDB4YWUwCi0JLmxvbmcJZG9fSVJRCSEgIDcyIDB4YjAwCi0JLmxvbmcJZG9fSVJRCSEgIDczIDB4YjIwCi0JLmxvbmcJZG9fSVJRCSEgIDc0IDB4YjQwCi0JLmxvbmcJZG9fSVJRCSEgIDc1IDB4YjYwCi0JLmxvbmcJZG9fSVJRCSEgIDc2IDB4YjgwCi0JLmxvbmcJZG9fSVJRCSEgIDc3IDB4YmEwCi0JLmxvbmcJZG9fSVJRCSEgIDc4IDB4YmMwCi0JLmxvbmcJZG9fSVJRCSEgIDc5IDB4YmUwCi0JLmxvbmcJZG9fSVJRCSEgIDgwIDB4YzAwCi0JLmxvbmcJZG9fSVJRCSEgIDgxIDB4YzIwCi0JLmxvbmcJZG9fSVJRCSEgIDgyIDB4YzQwCi0JLmxvbmcJZG9fSVJRCSEgIDgzIDB4YzYwCi0JLmxvbmcJZG9fSVJRCSEgIDg0IDB4YzgwCi0JLmxvbmcJZG9fSVJRCSEgIDg1IDB4Y2EwCi0JLmxvbmcJZG9fSVJRCSEgIDg2IDB4Y2MwCi0JLmxvbmcJZG9fSVJRCSEgIDg3IDB4Y2UwCi0JLmxvbmcJZG9fSVJRCSEgIDg4IDB4ZDAwCi0JLmxvbmcJZG9fSVJRCSEgIDg5IDB4ZDIwCi0JLmxvbmcJZG9fSVJRCSEgIDkwIDB4ZDQwCi0JLmxvbmcJZG9fSVJRCSEgIDkxIDB4ZDYwCi0JLmxvbmcJZG9fSVJRCSEgIDkyIDB4ZDgwCi0JLmxvbmcJZG9fSVJRCSEgIDkzIDB4ZGEwCi0JLmxvbmcJZG9fSVJRCSEgIDk0IDB4ZGMwCi0JLmxvbmcJZG9fSVJRCSEgIDk1IDB4ZGUwCi0JLmxvbmcJZG9fSVJRCSEgIDk2IDB4ZTAwCi0JLmxvbmcJZG9fSVJRCSEgIDk3IDB4ZTIwCi0JLmxvbmcJZG9fSVJRCSEgIDk4IDB4ZTQwCi0JLmxvbmcJZG9fSVJRCSEgIDk5IDB4ZTYwCi0JLmxvbmcJZG9fSVJRCSEgMTAwIDB4ZTgwCi0JLmxvbmcJZG9fSVJRCSEgMTAxIDB4ZWEwCi0JLmxvbmcJZG9fSVJRCSEgMTAyIDB4ZWMwCi0JLmxvbmcJZG9fSVJRCSEgMTAzIDB4ZWUwCi0JLmxvbmcJZG9fSVJRCSEgMTA0IDB4ZjAwCi0JLmxvbmcJZG9fSVJRCSEgMTA1IDB4ZjIwCi0JLmxvbmcJZG9fSVJRCSEgMTA2IDB4ZjQwCi0JLmxvbmcJZG9fSVJRCSEgMTA3IDB4ZjYwCi0JLmxvbmcJZG9fSVJRCSEgMTA4IDB4ZjgwCi0jZW5kaWYKLSNlbHNlCi0JLmxvbmcJZXhjZXB0aW9uX2Vycm9yCQkvKiA0MDAgKi8KLQkubG9uZwlleGNlcHRpb25fZXJyb3IKLQkubG9uZwlleGNlcHRpb25fZXJyb3IKLQkubG9uZwlleGNlcHRpb25fZXJyb3IKLQkubG9uZwlkb19JUlEJISBSVEMJYXRpCi0JLmxvbmcJZG9fSVJRCSEJcHJpCi0JLmxvbmcJZG9fSVJRCSEJY3VpCi0JLmxvbmcJZXhjZXB0aW9uX2Vycm9yCi0JLmxvbmcJZXhjZXB0aW9uX2Vycm9yCQkvKiA1MDAgKi8KLQkubG9uZwlleGNlcHRpb25fZXJyb3IKLQkubG9uZwlleGNlcHRpb25fZXJyb3IKLQkubG9uZwlkb19JUlEJISBXRFQJaXRpCS8qIDU2MCAqLwotCS5sb25nCWRvX0lSUQkhIFRNVS1jaDAKLQkubG9uZwlkb19JUlEJISBUTVUtY2gxCi0JLmxvbmcJZG9fSVJRCSEgVE1VLWNoMgotCS5sb25nCWRvX0lSUQkhIHRpY3BpMgkvKiA1RTAgKi8KLQkubG9uZwlkb19JUlEJISAzMiBIaXRhY2hpIFVESQkvKiA2MDAgKi8KLQkubG9uZwlleGNlcHRpb25fZXJyb3IKLQkubG9uZwlkb19JUlEJISAzNCBETUFDIGRtdGUwCi0JLmxvbmcJZG9fSVJRCSEgMzUJICBkbXRlMQotCS5sb25nCWRvX0lSUQkhIDM2CSAgZG10ZTIKLQkubG9uZwlkb19JUlEJISAzNwkgIGRtdGUzCi0JLmxvbmcJZG9fSVJRCSEgMzgJICBkbWFlCi0JLmxvbmcJZXhjZXB0aW9uX2Vycm9yCQkJISAzOQkvKiA2RTAgKi8KLQkubG9uZwlkb19JUlEJISA0MCBTQ0lGLWNoMCBlcmkJCS8qIDcwMCAqLwotCS5sb25nCWRvX0lSUQkhIDQxCSAgICAgIHJ4aQotCS5sb25nCWRvX0lSUQkhIDQyCSAgICAgIGJyaQotCS5sb25nCWRvX0lSUQkhIDQzCSAgICAgIHR4aQotCS5sb25nCWRvX0lSUQkhIDQ0IERNQUMgZG10ZTQJCS8qIDc4MCAqLwotCS5sb25nCWRvX0lSUQkhIDQ1CSAgZG10ZTUKLQkubG9uZwlkb19JUlEJISA0NgkgIGRtdGU2Ci0JLmxvbmcJZG9fSVJRCSEgNDcJICBkbXRlNwkJLyogN0UwICovCi0jaWYgZGVmaW5lZChDT05GSUdfU0hfRlBVKQotCS5sb25nCWRvX2ZwdV9zdGF0ZV9yZXN0b3JlCSEgNDgJLyogODAwICovCi0JLmxvbmcJZG9fZnB1X3N0YXRlX3Jlc3RvcmUJISA0OQkvKiA4MjAgKi8KLSNlbHNlCi0JLmxvbmcJZXhjZXB0aW9uX2Vycm9yCi0JLmxvbmcJZXhjZXB0aW9uX2Vycm9yCi0jZW5kaWYKLQkubG9uZwlleGNlcHRpb25fZXJyb3IJCQkvKiA4NDAgKi8KLQkubG9uZwlleGNlcHRpb25fZXJyb3IKLQkubG9uZwlleGNlcHRpb25fZXJyb3IKLQkubG9uZwlleGNlcHRpb25fZXJyb3IKLQkubG9uZwlleGNlcHRpb25fZXJyb3IKLQkubG9uZwlleGNlcHRpb25fZXJyb3IKLQkubG9uZwlkb19JUlEJISA1NiBDTVQJLyogOTAwICovCi0JLmxvbmcJZXhjZXB0aW9uX2Vycm9yCi0JLmxvbmcJZXhjZXB0aW9uX2Vycm9yCi0JLmxvbmcJZXhjZXB0aW9uX2Vycm9yCi0JLmxvbmcJZG9fSVJRCSEgNjAgSEFDCi0JLmxvbmcJZXhjZXB0aW9uX2Vycm9yCi0JLmxvbmcJZXhjZXB0aW9uX2Vycm9yCi0JLmxvbmcJZXhjZXB0aW9uX2Vycm9yCi0JLmxvbmcJZG9fSVJRCSEgUENJIHNlcnIJLyogQTAwICovCi0JLmxvbmcJZG9fSVJRCSEgICAgIElOVEEKLQkubG9uZwlkb19JUlEJISAgICAgSU5UQgotCS5sb25nCWRvX0lSUQkhICAgICBJTlRDCi0JLmxvbmcJZG9fSVJRCSEgICAgIElOVEQKLQkubG9uZwlkb19JUlEJISAgICAgZXJyCi0JLmxvbmcJZG9fSVJRCSEgICAgIHB3ZDMKLQkubG9uZwlkb19JUlEJISAgICAgcHdkMgotCS5sb25nCWRvX0lSUQkhICAgICBwd2QxCS8qIEIwMCAqLwotCS5sb25nCWRvX0lSUQkhICAgICBwd2QwCi0JLmxvbmcJZXhjZXB0aW9uX2Vycm9yCi0JLmxvbmcJZXhjZXB0aW9uX2Vycm9yCi0JLmxvbmcJZG9fSVJRCSEgU0NJRi1jaDEgZXJpCS8qIEI4MCAqLwotCS5sb25nCWRvX0lSUQkhCSAgIHJ4aQotCS5sb25nCWRvX0lSUQkhCSAgIGJyaQotCS5sb25nCWRvX0lSUQkhCSAgIHR4aQotCS5sb25nCWRvX0lSUQkhIFNJT0YJCS8qIEMwMCAqLwotCS5sb25nCWV4Y2VwdGlvbl9lcnJvcgotCS5sb25nCWV4Y2VwdGlvbl9lcnJvcgotCS5sb25nCWV4Y2VwdGlvbl9lcnJvcgotCS5sb25nCWRvX0lSUQkhIEhTUEkJCS8qIEM4MCAqLwotCS5sb25nCWV4Y2VwdGlvbl9lcnJvcgotCS5sb25nCWV4Y2VwdGlvbl9lcnJvcgotCS5sb25nCWV4Y2VwdGlvbl9lcnJvcgotCS5sb25nCWRvX0lSUQkhIE1NQ0lGCWZhdGF0CS8qIEQwMCAqLwotCS5sb25nCWRvX0lSUQkhCXRyYW4KLQkubG9uZwlkb19JUlEJIQllcnIKLQkubG9uZwlkb19JUlEJIQlmcmR5Ci0JLmxvbmcJZG9fSVJRCSEgRE1BQyBkbWludDgJLyogRDgwICovCi0JLmxvbmcJZG9fSVJRCSEgICAgICBkbWludDkKLQkubG9uZwlkb19JUlEJISAgICAgIGRtaW50MTAKLQkubG9uZwlkb19JUlEJISAgICAgIGRtaW50MTEKLQkubG9uZwlkb19JUlEJISBUTVUtY2gzCS8qIEUwMCAqLwotCS5sb25nCWRvX0lSUQkhIFRNVS1jaDQKLQkubG9uZwlkb19JUlEJISBUTVUtY2g1Ci0JLmxvbmcJZXhjZXB0aW9uX2Vycm9yCi0JLmxvbmcJZG9fSVJRCSEgU1NJCi0JLmxvbmcJZXhjZXB0aW9uX2Vycm9yCi0JLmxvbmcJZXhjZXB0aW9uX2Vycm9yCi0JLmxvbmcJZXhjZXB0aW9uX2Vycm9yCi0JLmxvbmcJZG9fSVJRCSEgRkxDVEwJZmxzdGUJLyogRjAwICovCi0JLmxvbmcJZG9fSVJRCSEJZmx0ZW5kCi0JLmxvbmcJZG9fSVJRCSEJZmx0cnEwCi0JLmxvbmcJZG9fSVJRCSEJZmx0cnExCi0JLmxvbmcJZG9fSVJRCSEgR1BJTyBncGlvaTAJLyogRjgwICovCi0JLmxvbmcJZG9fSVJRCSEgICAgICBncGlvaTEKLQkubG9uZwlkb19JUlEJISAgICAgIGdwaW9pMgotCS5sb25nCWRvX0lSUQkhICAgICAgZ3Bpb2kzCi0jZW5kaWYKIAorCS8qCisJICogUGFkIHRoZSByZW1haW5kZXIgb2YgdGhlIHRhYmxlIG91dCwgZXhjZXB0aW9ucyByZXNpZGluZyBpbiBmYXIKKwkgKiBhd2F5IG9mZnNldHMgY2FuIGJlIG1hbnVhbGx5IGluc2VydGVkIGluIHRvIHRoZWlyIGFwcHJvcHJpYXRlCisJICogbG9jYXRpb24gdmlhIHNldF9leGNlcHRpb25fdGFibGVfe2V2dCx2ZWN9KCkuCisJICovCisJLmJhbGlnbgk0MDk2LDAsNDA5NgpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9rZXJuZWwvY3B1L3NoNC9zZXR1cC1zaDc3NjAuYyBiL2FyY2gvc2gva2VybmVsL2NwdS9zaDQvc2V0dXAtc2g3NzYwLmMKaW5kZXggOTdmMWM5YS4uMDdlNTM3NyAxMDA2NDQKLS0tIGEvYXJjaC9zaC9rZXJuZWwvY3B1L3NoNC9zZXR1cC1zaDc3NjAuYworKysgYi9hcmNoL3NoL2tlcm5lbC9jcHUvc2g0L3NldHVwLXNoNzc2MC5jCkBAIC01MSwzICs1MSw2NiBAQAogCQkJCSAgICBBUlJBWV9TSVpFKHNoNzc2MF9kZXZpY2VzKSk7CiB9CiBfX2luaXRjYWxsKHNoNzc2MF9kZXZpY2VzX3NldHVwKTsKKworLyoKKyAqIFNINzc2MCBJTlRDMi1TdHlsZSBpbnRlcnJ1cHRzLCB2ZWN0b3JzIElSUTQ4LTExMSBJTlRFVlQgMHg4MDAtMHhGRTAKKyAqLworc3RhdGljIHN0cnVjdCBpbnRjMl9kYXRhIGludGMyX2lycV90YWJsZVtdID0geworCS8qIElOVFBSSU8wIHwgSU5UTVNLMCAqLworCXs0OCwgIDAsIDI4LCAwLCAzMSwgIDN9LAkvKiBJUlEgNCAqLworCXs0OSwgIDAsIDI0LCAwLCAzMCwgIDN9LAkvKiBJUlEgMyAqLworCXs1MCwgIDAsIDIwLCAwLCAyOSwgIDN9LAkvKiBJUlEgMiAqLworCXs1MSwgIDAsIDE2LCAwLCAyOCwgIDN9LAkvKiBJUlEgMSAqLworCS8qIDUyLTU1IChJTlRFVlQgMHg4ODAtMHg4RTApIHVudXNlZC9yZXNlcnZlZCAqLworCS8qIElOVFBSSU80IHwgSU5UTVNLMCAqLworCXs1NiwgIDQsIDI4LCAwLCAyNSwgIDN9LAkvKiBIQ0FOMl9DSEFOMCAqLworCXs1NywgIDQsIDI0LCAwLCAyNCwgIDN9LAkvKiBIQ0FOMl9DSEFOMSAqLworCXs1OCwgIDQsIDIwLCAwLCAyMywgIDN9LAkvKiBJMlNfQ0hBTjAgICAqLworCXs1OSwgIDQsIDE2LCAwLCAyMiwgIDN9LAkvKiBJMlNfQ0hBTjEgICAqLworCXs2MCwgIDQsIDEyLCAwLCAyMSwgIDN9LAkvKiBBQzk3X0NIQU4wICAqLworCXs2MSwgIDQsICA4LCAwLCAyMCwgIDN9LAkvKiBBQzk3X0NIQU4xICAqLworCXs2MiwgIDQsICA0LCAwLCAxOSwgIDN9LAkvKiBJMkNfQ0hBTjAgICAqLworCXs2MywgIDQsICAwLCAwLCAxOCwgIDN9LAkvKiBJMkNfQ0hBTjEgICAqLworCS8qIElOVFBSSU84IHwgSU5UTVNLMCAqLworCXs1MiwgIDgsIDE2LCAwLCAxMSwgIDN9LAkvKiBTQ0lGMF9FUklfSVJRICovCisJezUzLCAgOCwgMTYsIDAsIDEwLCAgM30sCS8qIFNDSUYwX1JYSV9JUlEgKi8KKwl7NTQsICA4LCAxNiwgMCwgIDksICAzfSwJLyogU0NJRjBfQlJJX0lSUSAqLworCXs1NSwgIDgsIDE2LCAwLCAgOCwgIDN9LAkvKiBTQ0lGMF9UWElfSVJRICovCisJezY0LCAgOCwgMjgsIDAsIDE3LCAgM30sCS8qIFVTQkhJX0lSUSAqLworCXs2NSwgIDgsIDI0LCAwLCAxNiwgIDN9LAkvKiBMQ0RDICAgICAgKi8KKwkvKiA2NiwgNjcgdW51c2VkICovCisJezY4LCAgOCwgMjAsIDAsIDE0LCAxM30sCS8qIERNQUJSR0kwX0lSUSAqLworCXs2OSwgIDgsIDIwLCAwLCAxMywgMTN9LAkvKiBETUFCUkdJMV9JUlEgKi8KKwl7NzAsICA4LCAyMCwgMCwgMTIsIDEzfSwJLyogRE1BQlJHSTJfSVJRICovCisJLyogNzEgdW51c2VkICovCisJezcyLCAgOCwgMTIsIDAsICA3LCAgM30sCS8qIFNDSUYxX0VSSV9JUlEgKi8KKwl7NzMsICA4LCAxMiwgMCwgIDYsICAzfSwJLyogU0NJRjFfUlhJX0lSUSAqLworCXs3NCwgIDgsIDEyLCAwLCAgNSwgIDN9LAkvKiBTQ0lGMV9CUklfSVJRICovCisJezc1LCAgOCwgMTIsIDAsICA0LCAgM30sCS8qIFNDSUYxX1RYSV9JUlEgKi8KKwl7NzYsICA4LCAgOCwgMCwgIDMsICAzfSwJLyogU0NJRjJfRVJJX0lSUSAqLworCXs3NywgIDgsICA4LCAwLCAgMiwgIDN9LAkvKiBTQ0lGMl9SWElfSVJRICovCisJezc4LCAgOCwgIDgsIDAsICAxLCAgM30sCS8qIFNDSUYyX0JSSV9JUlEgKi8KKwl7NzksICA4LCAgOCwgMCwgIDAsICAzfSwJLyogU0NJRjJfVFhJX0lSUSAqLworCS8qICAgICAgICAgIHwgSU5UTVNLNCAqLworCXs4MCwgIDgsICA0LCA0LCAyMywgIDN9LAkvKiBTSU1fRVJJICovCisJezgxLCAgOCwgIDQsIDQsIDIyLCAgM30sCS8qIFNJTV9SWEkgKi8KKwl7ODIsICA4LCAgNCwgNCwgMjEsICAzfSwJLyogU0lNX1RYSSAqLworCXs4MywgIDgsICA0LCA0LCAyMCwgIDN9LAkvKiBTSU1fVEVJICovCisJezg0LCAgOCwgIDAsIDQsIDE5LCAgM30sCS8qIEhTUElJICovCisJLyogSU5UUFJJT0MgfCBJTlRNU0s0ICovCisJLyogODUtODcgdW51c2VkL3Jlc2VydmVkICovCisJezg4LCAxMiwgMjAsIDQsIDE4LCAgM30sCS8qIE1NQ0kwICovCisJezg5LCAxMiwgMjAsIDQsIDE3LCAgM30sCS8qIE1NQ0kxICovCisJezkwLCAxMiwgMjAsIDQsIDE2LCAgM30sCS8qIE1NQ0kyICovCisJezkxLCAxMiwgMjAsIDQsIDE1LCAgM30sCS8qIE1NQ0kzICovCisJezkyLCAxMiwgMTIsIDQsICA2LCAgM30sCS8qIE1GSSAodW5zdXJlLCBidWc/IGluIG15IDc3NjAgbWFudWFsKi8KKwkvKiA5My0xMDcgcmVzZXJ2ZWQvdW5kb2N1bWVudGVkICovCisJezEwOCwxMiwgIDQsIDQsICAxLCAgM30sCS8qIEFEQyAgKi8KKwl7MTA5LDEyLCAgMCwgNCwgIDAsICAzfSwJLyogQ01USSAqLworCS8qIDExMC0xMTEgcmVzZXJ2ZWQvdW51c2VkICovCit9OworCit2b2lkIF9faW5pdCBpbml0X0lSUV9pbnRjMih2b2lkKQoreworCW1ha2VfaW50YzJfaXJxKGludGMyX2lycV90YWJsZSwgQVJSQVlfU0laRShpbnRjMl9pcnFfdGFibGUpKTsKK30KZGlmZiAtLWdpdCBhL2FyY2gvc2gva2VybmVsL2NwdS9zaDQvc2V0dXAtc2g3NzgwLmMgYi9hcmNoL3NoL2tlcm5lbC9jcHUvc2g0L3NldHVwLXNoNzc4MC5jCmluZGV4IDcyNDkzZjIuLjgxNGRkYjIgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gva2VybmVsL2NwdS9zaDQvc2V0dXAtc2g3NzgwLmMKKysrIGIvYXJjaC9zaC9rZXJuZWwvY3B1L3NoNC9zZXR1cC1zaDc3ODAuYwpAQCAtNzcsMyArNzcsMzAgQEAKIAkJCQkgICAgQVJSQVlfU0laRShzaDc3ODBfZGV2aWNlcykpOwogfQogX19pbml0Y2FsbChzaDc3ODBfZGV2aWNlc19zZXR1cCk7CisKK3N0YXRpYyBzdHJ1Y3QgaW50YzJfZGF0YSBpbnRjMl9pcnFfdGFibGVbXSA9IHsKKwl7IFRJTUVSX0lSUSwgMCwgMjQsIDAsIElOVENfVE1VMF9NU0ssIDIgfSwKKwl7IDIxLCAxLCAwLCAwLCBJTlRDX1JUQ19NU0ssIFRJTUVSX1BSSU9SSVRZIH0sCisJeyAyMiwgMSwgMSwgMCwgSU5UQ19SVENfTVNLLCBUSU1FUl9QUklPUklUWSB9LAorCXsgMjMsIDEsIDIsIDAsIElOVENfUlRDX01TSywgVElNRVJfUFJJT1JJVFkgfSwKKwl7IFNDSUYwX0VSSV9JUlEsIDgsIDI0LCAwLCBJTlRDX1NDSUYwX01TSywgU0NJRjBfUFJJT1JJVFkgfSwKKwl7IFNDSUYwX1JYSV9JUlEsIDgsIDI0LCAwLCBJTlRDX1NDSUYwX01TSywgU0NJRjBfUFJJT1JJVFkgfSwKKwl7IFNDSUYwX0JSSV9JUlEsIDgsIDI0LCAwLCBJTlRDX1NDSUYwX01TSywgU0NJRjBfUFJJT1JJVFkgfSwKKwl7IFNDSUYwX1RYSV9JUlEsIDgsIDI0LCAwLCBJTlRDX1NDSUYwX01TSywgU0NJRjBfUFJJT1JJVFkgfSwKKworCXsgU0NJRjFfRVJJX0lSUSwgOCwgMTYsIDAsIElOVENfU0NJRjFfTVNLLCBTQ0lGMV9QUklPUklUWSB9LAorCXsgU0NJRjFfUlhJX0lSUSwgOCwgMTYsIDAsIElOVENfU0NJRjFfTVNLLCBTQ0lGMV9QUklPUklUWSB9LAorCXsgU0NJRjFfQlJJX0lSUSwgOCwgMTYsIDAsIElOVENfU0NJRjFfTVNLLCBTQ0lGMV9QUklPUklUWSB9LAorCXsgU0NJRjFfVFhJX0lSUSwgOCwgMTYsIDAsIElOVENfU0NJRjFfTVNLLCBTQ0lGMV9QUklPUklUWSB9LAorCisJeyBQQ0lDMF9JUlEsIDB4MTAsICA4LCAwLCBJTlRDX1BDSUMwX01TSywgUENJQzBfUFJJT1JJVFkgfSwKKwl7IFBDSUMxX0lSUSwgMHgxMCwgIDAsIDAsIElOVENfUENJQzFfTVNLLCBQQ0lDMV9QUklPUklUWSB9LAorCXsgUENJQzJfSVJRLCAweDE0LCAyNCwgMCwgSU5UQ19QQ0lDMl9NU0ssIFBDSUMyX1BSSU9SSVRZIH0sCisJeyBQQ0lDM19JUlEsIDB4MTQsIDE2LCAwLCBJTlRDX1BDSUMzX01TSywgUENJQzNfUFJJT1JJVFkgfSwKKwl7IFBDSUM0X0lSUSwgMHgxNCwgIDgsIDAsIElOVENfUENJQzRfTVNLLCBQQ0lDNF9QUklPUklUWSB9LAorfTsKKwordm9pZCBfX2luaXQgaW5pdF9JUlFfaW50YzIodm9pZCkKK3sKKwltYWtlX2ludGMyX2lycShpbnRjMl9pcnFfdGFibGUsIEFSUkFZX1NJWkUoaW50YzJfaXJxX3RhYmxlKSk7Cit9CmRpZmYgLS1naXQgYS9hcmNoL3NoL2tlcm5lbC9lbnRyeS5TIGIvYXJjaC9zaC9rZXJuZWwvZW50cnkuUwppbmRleCA5N2M1NzFmLi4zOWFhZWZiIDEwMDY0NAotLS0gYS9hcmNoL3NoL2tlcm5lbC9lbnRyeS5TCisrKyBiL2FyY2gvc2gva2VybmVsL2VudHJ5LlMKQEAgLTEsOSArMSw4IEBACi0vKiAkSWQ6IGVudHJ5LlMsdiAxLjM3IDIwMDQvMDYvMTEgMTM6MDI6NDYgZG95dSBFeHAgJAotICoKKy8qCiAgKiAgbGludXgvYXJjaC9zaC9lbnRyeS5TCiAgKgogICogIENvcHlyaWdodCAoQykgMTk5OSwgMjAwMCwgMjAwMiAgTmlpYmUgWXV0YWthCi0gKiAgQ29weXJpZ2h0IChDKSAyMDAzICBQYXVsIE11bmR0CisgKiAgQ29weXJpZ2h0IChDKSAyMDAzIC0gMjAwNiAgUGF1bCBNdW5kdAogICoKICAqIFRoaXMgZmlsZSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCiAgKiBMaWNlbnNlLiAgU2VlIHRoZSBmaWxlICJDT1BZSU5HIiBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhpcyBhcmNoaXZlCkBAIC03OCw3ICs3Nyw2IEBACiAjZGVmaW5lIGszCXIzCiAjZGVmaW5lIGs0CXI0CiAKLSNkZWZpbmUga19leF9jb2RlCXIyX2JhbmsJLyogcjJfYmFuazEgKi8KICNkZWZpbmUgZ19pbWFzawkJcjYJLyogcjZfYmFuazEgKi8KICNkZWZpbmUga19nX2ltYXNrCXI2X2JhbmsJLyogcjZfYmFuazEgKi8KICNkZWZpbmUgY3VycmVudAkJcjcJLyogcjdfYmFuazEgKi8KQEAgLTY5MSw3ICs2ODksNyBAQAogMDoKICNlbmRpZiAvKiBkZWZpbmVkKENPTkZJR19LR0RCX05NSSkgKi8KIAlicmEJaGFuZGxlX2V4Y2VwdGlvbgotCSBtb3YubAlAazIsIGsyCisJIG1vdgkjLTEsIGsyCQkhIGludGVycnVwdCBleGNlcHRpb24gbWFya2VyCiAKIAkuYWxpZ24JMgogMToJLmxvbmcJRVhQRVZUCkBAIC03MTcsOCArNzE1LDcgQEAKIAlhZGQJY3VycmVudCwgazEKIAltb3YJazEsIHIxNQkJISBjaGFuZ2UgdG8ga2VybmVsIHN0YWNrCiAJIQotMTogIAltb3YJIy0xLCBrNAotCW1vdi5sCTJmLCBrMQorMToJbW92LmwJMmYsIGsxCiAJIQogI2lmZGVmIENPTkZJR19TSF9EU1AKIAltb3YubAlyMiwgQC1yMTUJCSEgU2F2ZSByMiwgd2UgbmVlZCBhbm90aGVyIHJlZwpAQCAtNzYzLDYgKzc2MCw4IEBACiAjZW5kaWYKIAkhIFNhdmUgdGhlIHVzZXIgcmVnaXN0ZXJzIG9uIHRoZSBzdGFjay4KIAltb3YubAlrMiwgQC1yMTUJISBFWFBFVlQKKworIAltb3YJIy0xLCBrNAogCW1vdi5sCWs0LCBALXIxNQkhIHNldCBUUkEgKGRlZmF1bHQ6IC0xKQogCSEKIAlzdHMubAltYWNsLCBALXIxNQpAQCAtNzk3LDggKzc5NiwyMSBAQAogCW1vdi5sCXIyLCBALXIxNQogCW1vdi5sCXIxLCBALXIxNQogCW1vdi5sCXIwLCBALXIxNQotCSEgVGhlbiwgZGlzcGF0Y2ggdG8gdGhlIGhhbmRsZXIsIGFjY29yZGluZyB0byB0aGUgZXhjZXB0aW9uIGNvZGUuCi0Jc3RjCWtfZXhfY29kZSwgcjgKKworCS8qCisJICogVGhpcyBnZXRzIGEgYml0IHRyaWNreS4uIGluIHRoZSBJTlRFVlQgY2FzZSB3ZSBkb24ndCB3YW50IHRvIHVzZQorCSAqIHRoZSBWQlIgb2Zmc2V0IGFzIGEgZGVzdGluYXRpb24gaW4gdGhlIGp1bXAgY2FsbCB0YWJsZSwgc2luY2UgYWxsCisJICogb2YgdGhlIGRlc3RpbmF0aW9ucyBhcmUgdGhlIHNhbWUuIEluIHRoaXMgY2FzZSwgKGludGVycnVwdCkgc2V0cworCSAqIGEgbWFya2VyIGluIHIyIChub3cgcjJfYmFuayBzaW5jZSBTUi5SQiBjaGFuZ2VkKSwgd2hpY2ggd2UgY2hlY2sKKwkgKiB0byBkZXRlcm1pbmUgdGhlIGV4Y2VwdGlvbiB0eXBlLiBGb3IgYWxsIG90aGVyIGV4Y2VwdGlvbnMsIHdlCisJICogZm9yY2libHkgcmVhZCBFWFBFVlQgZnJvbSBtZW1vcnkgYW5kIGZpeCB1cCB0aGUganVtcCBhZGRyZXNzLCBpbgorCSAqIHRoZSBpbnRlcnJ1cHQgZXhjZXB0aW9uIGNhc2Ugd2UganVtcCB0byBkb19JUlEoKSBhbmQgZGVmZXIgdGhlCisJICogSU5URVZUIHJlYWQgdW50aWwgdGhlcmUuIEFzIGEgYm9udXMsIHdlIGNhbiBhbHNvIGNsZWFuIHVwIHRoZSBTUi5SQgorCSAqIGNoZWNrcyB0aGF0IGRvX0lSUSgpIHdhcyBkb2luZy4uCisJICovCisJc3RjCXIyX2JhbmssIHI4CisJY21wL3B6CXI4CisJYmYJaW50ZXJydXB0X2V4Y2VwdGlvbgogCXNobHIyCXI4CiAJc2hscglyOAogCW1vdi5sCTRmLCByOQpAQCAtODA2LDYgKzgxOCw4IEBACiAJbW92LmwJQHI5LCByOQogCWptcAlAcjkKIAkgbm9wCisJcnRzCisJIG5vcAogCiAJLmFsaWduCTIKIDE6CS5sb25nCTB4MDAwMDEwMDAJISBEU1A9MQpAQCAtODEzLDggKzgyNywxNyBAQAogMzoJLmxvbmcJMHhjZmZmZmZmZgkhIFJCPTAsIEJMPTAKIDQ6CS5sb25nCWV4Y2VwdGlvbl9oYW5kbGluZ190YWJsZQogCitpbnRlcnJ1cHRfZXhjZXB0aW9uOgorCW1vdi5sCTFmLCByOQorCWptcAlAcjkKKwkgbm9wCisJcnRzCisJIG5vcAorCisJLmFsaWduIDIKKzE6CS5sb25nCWRvX0lSUQorCiAJLmFsaWduCTIKIEVOVFJZKGV4Y2VwdGlvbl9ub25lKQogCXJ0cwogCSBub3AKLQpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9rZXJuZWwvaXJxLmMgYi9hcmNoL3NoL2tlcm5lbC9pcnEuYwppbmRleCBjN2ViZDZhLi45NDQxMjhjIDEwMDY0NAotLS0gYS9hcmNoL3NoL2tlcm5lbC9pcnEuYworKysgYi9hcmNoL3NoL2tlcm5lbC9pcnEuYwpAQCAtMTEsMTIgKzExLDE1IEBACiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsX3N0YXQuaD4KICNpbmNsdWRlIDxsaW51eC9zZXFfZmlsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CiAjaW5jbHVkZSA8YXNtL2lycS5oPgogI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3IuaD4KICNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgogI2luY2x1ZGUgPGFzbS90aHJlYWRfaW5mby5oPgogI2luY2x1ZGUgPGFzbS9jcHUvbW11X2NvbnRleHQuaD4KIAorYXRvbWljX3QgaXJxX2Vycl9jb3VudDsKKwogLyoKICAqICd3aGF0IHNob3VsZCB3ZSBkbyBpZiB3ZSBnZXQgYSBodyBpcnEgZXZlbnQgb24gYW4gaWxsZWdhbCB2ZWN0b3InLgogICogZWFjaCBhcmNoaXRlY3R1cmUgaGFzIHRvIGFuc3dlciB0aGlzIHRoZW1zZWx2ZXMsIGl0IGRvZXNuJ3QgZGVzZXJ2ZQpAQCAtMjQsNiArMjcsNyBAQAogICovCiB2b2lkIGFja19iYWRfaXJxKHVuc2lnbmVkIGludCBpcnEpCiB7CisJYXRvbWljX2luYygmaXJxX2Vycl9jb3VudCk7CiAJcHJpbnRrKCJ1bmV4cGVjdGVkIElSUSB0cmFwIGF0IHZlY3RvciAlMDJ4XG4iLCBpcnEpOwogfQogCkBAIC00Nyw4ICs1MSwxMCBAQAogCQlpZiAoIWFjdGlvbikKIAkJCWdvdG8gdW5sb2NrOwogCQlzZXFfcHJpbnRmKHAsICIlM2Q6ICIsaSk7Ci0JCXNlcV9wcmludGYocCwgIiUxMHUgIiwga3N0YXRfaXJxcyhpKSk7Ci0JCXNlcV9wcmludGYocCwgIiAlMTRzIiwgaXJxX2Rlc2NbaV0uY2hpcC0+dHlwZW5hbWUpOworCQlmb3JfZWFjaF9vbmxpbmVfY3B1KGopCisJCQlzZXFfcHJpbnRmKHAsICIlMTB1ICIsIGtzdGF0X2NwdShqKS5pcnFzW2ldKTsKKwkJc2VxX3ByaW50ZihwLCAiICUxNHMiLCBpcnFfZGVzY1tpXS5jaGlwLT5uYW1lKTsKKwkJc2VxX3ByaW50ZihwLCAiLSUtOHMiLCBpcnFfZGVzY1tpXS5uYW1lKTsKIAkJc2VxX3ByaW50ZihwLCAiICAlcyIsIGFjdGlvbi0+bmFtZSk7CiAKIAkJZm9yIChhY3Rpb249YWN0aW9uLT5uZXh0OyBhY3Rpb247IGFjdGlvbiA9IGFjdGlvbi0+bmV4dCkKQEAgLTU2LDcgKzYyLDkgQEAKIAkJc2VxX3B1dGMocCwgJ1xuJyk7CiB1bmxvY2s6CiAJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlycV9kZXNjW2ldLmxvY2ssIGZsYWdzKTsKLQl9CisJfSBlbHNlIGlmIChpID09IE5SX0lSUVMpCisJCXNlcV9wcmludGYocCwgIkVycjogJTEwdVxuIiwgYXRvbWljX3JlYWQoJmlycV9lcnJfY291bnQpKTsKKwogCXJldHVybiAwOwogfQogI2VuZGlmCkBAIC03OCw3ICs4Niw4IEBACiAJCSAgICAgIHVuc2lnbmVkIGxvbmcgcjYsIHVuc2lnbmVkIGxvbmcgcjcsCiAJCSAgICAgIHN0cnVjdCBwdF9yZWdzIHJlZ3MpCiB7Ci0JaW50IGlycSA9IHI0OworCXN0cnVjdCBwdF9yZWdzICpvbGRfcmVncyA9IHNldF9pcnFfcmVncygmcmVncyk7CisJaW50IGlycTsKICNpZmRlZiBDT05GSUdfNEtTVEFDS1MKIAl1bmlvbiBpcnFfY3R4ICpjdXJjdHgsICppcnFjdHg7CiAjZW5kaWYKQEAgLTEwMiwyMCArMTExLDkgQEAKICNlbmRpZgogCiAjaWZkZWYgQ09ORklHX0NQVV9IQVNfSU5URVZUCi0JX19hc21fXyBfX3ZvbGF0aWxlX18gKAotI2lmZGVmIENPTkZJR19DUFVfSEFTX1NSX1JCCi0JCSJzdGMJcjJfYmFuaywgJTBcblx0IgorCWlycSA9IChjdHJsX2lubChJTlRFVlQpID4+IDUpIC0gMTY7CiAjZWxzZQotCQkibW92LmwJQCUxLCAlMFxuXHQiCi0jZW5kaWYKLQkJInNobHIyCSUwXG5cdCIKLQkJInNobHIyCSUwXG5cdCIKLQkJInNobHIJJTBcblx0IgotCQkiYWRkCSMtMTYsICUwXG5cdCIKLQkJOiAiPXoiIChpcnEpLCAiPXIiIChyNCkKLQkJOiAiMSIgKElOVEVWVCkKLQkJOiAibWVtb3J5IgotCSk7CisJaXJxID0gcjQ7CiAjZW5kaWYKIAogCWlycSA9IGlycV9kZW11eChpcnEpOwpAQCAtMTM5LDI1ICsxMzcsMjUgQEAKIAogCQlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoCiAJCQkibW92CSUwLCByNAkJXG4iCi0JCQkibW92CSUxLCByNQkJXG4iCiAJCQkibW92CXIxNSwgcjkJCVxuIgotCQkJImpzcglAJTIJCVxuIgorCQkJImpzcglAJTEJCVxuIgogCQkJLyogc3dpdGggdG8gdGhlIGlycSBzdGFjayAqLwotCQkJIiBtb3YJJTMsIHIxNQkJXG4iCisJCQkiIG1vdgklMiwgcjE1CQlcbiIKIAkJCS8qIHJlc3RvcmUgdGhlIHN0YWNrIChyaW5nIHplcm8pICovCiAJCQkibW92CXI5LCByMTUJCVxuIgogCQkJOiAvKiBubyBvdXRwdXRzICovCi0JCQk6ICJyIiAoaXJxKSwgInIiICgmcmVncyksICJyIiAoX19kb19JUlEpLCAiciIgKGlzcCkKKwkJCTogInIiIChpcnEpLCAiciIgKGdlbmVyaWNfaGFuZGxlX2lycSksICJyIiAoaXNwKQogCQkJLyogWFhYOiBBIHNvbWV3aGF0IGV4Y2Vzc2l2ZSBjbG9iYmVyIGxpc3Q/IC1QRk0gKi8KIAkJCTogIm1lbW9yeSIsICJyMCIsICJyMSIsICJyMiIsICJyMyIsICJyNCIsCiAJCQkgICJyNSIsICJyNiIsICJyNyIsICJyOCIsICJ0IiwgInByIgogCQkpOwogCX0gZWxzZQogI2VuZGlmCi0JCV9fZG9fSVJRKGlycSwgJnJlZ3MpOworCQlnZW5lcmljX2hhbmRsZV9pcnEoaXJxKTsKIAogCWlycV9leGl0KCk7CiAKKwlzZXRfaXJxX3JlZ3Mob2xkX3JlZ3MpOwogCXJldHVybiAxOwogfQogCmRpZmYgLS1naXQgYS9hcmNoL3NoL2tlcm5lbC9wcm9jZXNzLmMgYi9hcmNoL3NoL2tlcm5lbC9wcm9jZXNzLmMKaW5kZXggMGIxZDVkZC4uYTUyYjEzYSAxMDA2NDQKLS0tIGEvYXJjaC9zaC9rZXJuZWwvcHJvY2Vzcy5jCisrKyBiL2FyY2gvc2gva2VybmVsL3Byb2Nlc3MuYwpAQCAtNSw2ICs1LDcgQEAKICAqICBDb3B5cmlnaHQgKEMpIDE5OTUgIExpbnVzIFRvcnZhbGRzCiAgKgogICogIFN1cGVySCB2ZXJzaW9uOiAgQ29weXJpZ2h0IChDKSAxOTk5LCAyMDAwICBOaWliZSBZdXRha2EgJiBLYXogS29qaW1hCisgKgkJICAgICBDb3B5cmlnaHQgKEMpIDIwMDYgTGluZW8gU29sdXRpb25zIEluYy4gc3VwcG9ydCBTSDRBIFVCQwogICovCiAKIC8qCkBAIC0xMDQsNyArMTA1LDcgQEAKIHsKIAlwcmludGsoIlxuIik7CiAJcHJpbnRrKCJQaWQgOiAlZCwgQ29tbTogJTIwc1xuIiwgY3VycmVudC0+cGlkLCBjdXJyZW50LT5jb21tKTsKLQlwcmludF9zeW1ib2woIlBDIGlzIGF0ICVzXG4iLCByZWdzLT5wYyk7CisJcHJpbnRfc3ltYm9sKCJQQyBpcyBhdCAlc1xuIiwgaW5zdHJ1Y3Rpb25fcG9pbnRlcihyZWdzKSk7CiAJcHJpbnRrKCJQQyAgOiAlMDhseCBTUCAgOiAlMDhseCBTUiAgOiAlMDhseCAiLAogCSAgICAgICByZWdzLT5wYywgcmVncy0+cmVnc1sxNV0sIHJlZ3MtPnNyKTsKICNpZmRlZiBDT05GSUdfTU1VCkBAIC0xMjksMTUgKzEzMCw3IEBACiAJcHJpbnRrKCJNQUNIOiAlMDhseCBNQUNMOiAlMDhseCBHQlIgOiAlMDhseCBQUiAgOiAlMDhseFxuIiwKIAkgICAgICAgcmVncy0+bWFjaCwgcmVncy0+bWFjbCwgcmVncy0+Z2JyLCByZWdzLT5wcik7CiAKLQkvKgotCSAqIElmIHdlJ3JlIGluIGtlcm5lbCBtb2RlLCBkdW1wIHRoZSBzdGFjayB0b28uLgotCSAqLwotCWlmICghdXNlcl9tb2RlKHJlZ3MpKSB7Ci0JCWV4dGVybiB2b2lkIHNob3dfdGFzayh1bnNpZ25lZCBsb25nICpzcCk7Ci0JCXVuc2lnbmVkIGxvbmcgc3AgPSByZWdzLT5yZWdzWzE1XTsKLQotCQlzaG93X3Rhc2soKHVuc2lnbmVkIGxvbmcgKilzcCk7Ci0JfQorCXNob3dfdHJhY2UoTlVMTCwgKHVuc2lnbmVkIGxvbmcgKilyZWdzLT5yZWdzWzE1XSwgcmVncyk7CiB9CiAKIC8qCkBAIC0yOTAsNiArMjgzLDI0IEBACiBzdGF0aWMgdm9pZAogdWJjX3NldF90cmFjaW5nKGludCBhc2lkLCB1bnNpZ25lZCBsb25nIHBjKQogeworI2lmIGRlZmluZWQoQ09ORklHX0NQVV9TSDRBKQorCXVuc2lnbmVkIGxvbmcgdmFsOworCisJdmFsID0gKFVCQ19DQlJfSURfSU5TVCB8IFVCQ19DQlJfUldfUkVBRCB8IFVCQ19DQlJfQ0UpOworCXZhbCB8PSAoVUJDX0NCUl9BSUUgfCBVQkNfQ0JSX0FJVl9TRVQoYXNpZCkpOworCisJY3RybF9vdXRsKHZhbCwgVUJDX0NCUjApOworCWN0cmxfb3V0bChwYywgIFVCQ19DQVIwKTsKKwljdHJsX291dGwoMHgwLCBVQkNfQ0FNUjApOworCWN0cmxfb3V0bCgweDAsIFVCQ19DQkNSKTsKKworCXZhbCA9IChVQkNfQ1JSX1JFUyB8IFVCQ19DUlJfUENCIHwgVUJDX0NSUl9CSUUpOworCWN0cmxfb3V0bCh2YWwsIFVCQ19DUlIwKTsKKworCS8qIFJlYWQgVUJDIHJlZ2lzdGVyIHRoYXQgd2Ugd3JpdGVkIGxhc3QuIEZvciBjaGVra2luZyBVQkMgUmVnaXN0ZXIgY2hhbmdlZCAqLworCXZhbCA9IGN0cmxfaW5sKFVCQ19DUlIwKTsKKworI2Vsc2UJLyogQ09ORklHX0NQVV9TSDRBICovCiAJY3RybF9vdXRsKHBjLCBVQkNfQkFSQSk7CiAKICNpZmRlZiBDT05GSUdfTU1VCkBAIC0zMDcsNiArMzE4LDcgQEAKIAkJY3RybF9vdXR3KEJCUl9JTlNUIHwgQkJSX1JFQUQsIFVCQ19CQlJBKTsKIAkJY3RybF9vdXR3KEJSQ1JfUENCQSwgVUJDX0JSQ1IpOwogCX0KKyNlbmRpZgkvKiBDT05GSUdfQ1BVX1NINEEgKi8KIH0KIAogLyoKQEAgLTM1OSw4ICszNzEsMTMgQEAKICNlbmRpZgogCQl1YmNfc2V0X3RyYWNpbmcoYXNpZCwgbmV4dC0+dGhyZWFkLnViY19wYyk7CiAJfSBlbHNlIHsKKyNpZiBkZWZpbmVkKENPTkZJR19DUFVfU0g0QSkKKwkJY3RybF9vdXRsKFVCQ19DQlJfSU5JVCwgVUJDX0NCUjApOworCQljdHJsX291dGwoVUJDX0NSUl9JTklULCBVQkNfQ1JSMCk7CisjZWxzZQogCQljdHJsX291dHcoMCwgVUJDX0JCUkEpOwogCQljdHJsX291dHcoMCwgVUJDX0JCUkIpOworI2VuZGlmCiAJfQogCiAJcmV0dXJuIHByZXY7CkBAIC00NjAsOCArNDc3LDEzIEBACiAJCQkJIHN0cnVjdCBwdF9yZWdzIHJlZ3MpCiB7CiAJLyogQ2xlYXIgdHJhY2luZy4gICovCisjaWYgZGVmaW5lZChDT05GSUdfQ1BVX1NINEEpCisJY3RybF9vdXRsKFVCQ19DQlJfSU5JVCwgVUJDX0NCUjApOworCWN0cmxfb3V0bChVQkNfQ1JSX0lOSVQsIFVCQ19DUlIwKTsKKyNlbHNlCiAJY3RybF9vdXR3KDAsIFVCQ19CQlJBKTsKIAljdHJsX291dHcoMCwgVUJDX0JCUkIpOworI2VuZGlmCiAJY3VycmVudC0+dGhyZWFkLnViY19wYyA9IDA7CiAJdWJjX3VzZXJjbnQgLT0gMTsKIApkaWZmIC0tZ2l0IGEvYXJjaC9zaC9rZXJuZWwvc3lzY2FsbHMuUyBiL2FyY2gvc2gva2VybmVsL3N5c2NhbGxzLlMKaW5kZXggNzY4MzM0ZS4uY2E4MTk3NiAxMDA2NDQKLS0tIGEvYXJjaC9zaC9rZXJuZWwvc3lzY2FsbHMuUworKysgYi9hcmNoL3NoL2tlcm5lbC9zeXNjYWxscy5TCkBAIC0zNTEsMyArMzUxLDYgQEAKIAkubG9uZyBzeXNfc3luY19maWxlX3JhbmdlCiAJLmxvbmcgc3lzX3RlZQkJCS8qIDMxNSAqLwogCS5sb25nIHN5c192bXNwbGljZQorCS5sb25nIHN5c19tb3ZlX3BhZ2VzCisJLmxvbmcgc3lzX2dldGNwdQorCS5sb25nIHN5c19lcG9sbF9wd2FpdApkaWZmIC0tZ2l0IGEvYXJjaC9zaC9rZXJuZWwvdGltZS5jIGIvYXJjaC9zaC9rZXJuZWwvdGltZS5jCmluZGV4IDQ1MGM2OGYuLjU3ZTcwOGQgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gva2VybmVsL3RpbWUuYworKysgYi9hcmNoL3NoL2tlcm5lbC90aW1lLmMKQEAgLTQ3LDYgKzQ3LDcgQEAKIAlyZXR1cm4gKHVuc2lnbmVkIGxvbmcgbG9uZylqaWZmaWVzICogKDEwMDAwMDAwMDAgLyBIWik7CiB9CiAKKyNpZm5kZWYgQ09ORklHX0dFTkVSSUNfVElNRQogdm9pZCBkb19nZXR0aW1lb2ZkYXkoc3RydWN0IHRpbWV2YWwgKnR2KQogewogCXVuc2lnbmVkIGxvbmcgc2VxOwpAQCAtOTksNiArMTAwLDcgQEAKIAlyZXR1cm4gMDsKIH0KIEVYUE9SVF9TWU1CT0woZG9fc2V0dGltZW9mZGF5KTsKKyNlbmRpZiAvKiAhQ09ORklHX0dFTkVSSUNfVElNRSAqLwogCiAvKiBsYXN0IHRpbWUgdGhlIFJUQyBjbG9jayBnb3QgdXBkYXRlZCAqLwogc3RhdGljIGxvbmcgbGFzdF9ydGNfdXBkYXRlOwpAQCAtMTA3LDEzICsxMDksMTQgQEAKICAqIGhhbmRsZV90aW1lcl90aWNrKCkgbmVlZHMgdG8ga2VlcCB1cCB0aGUgcmVhbC10aW1lIGNsb2NrLAogICogYXMgd2VsbCBhcyBjYWxsIHRoZSAiZG9fdGltZXIoKSIgcm91dGluZSBldmVyeSBjbG9ja3RpY2sKICAqLwotdm9pZCBoYW5kbGVfdGltZXJfdGljayhzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3ZvaWQgaGFuZGxlX3RpbWVyX3RpY2sodm9pZCkKIHsKIAlkb190aW1lcigxKTsKICNpZm5kZWYgQ09ORklHX1NNUAotCXVwZGF0ZV9wcm9jZXNzX3RpbWVzKHVzZXJfbW9kZShyZWdzKSk7CisJdXBkYXRlX3Byb2Nlc3NfdGltZXModXNlcl9tb2RlKGdldF9pcnFfcmVncygpKSk7CiAjZW5kaWYKLQlwcm9maWxlX3RpY2soQ1BVX1BST0ZJTElORywgcmVncyk7CisJaWYgKGN1cnJlbnQtPnBpZCkKKwkJcHJvZmlsZV90aWNrKENQVV9QUk9GSUxJTkcpOwogCiAjaWZkZWYgQ09ORklHX0hFQVJUQkVBVAogCWlmIChzaF9tdi5tdl9oZWFydGJlYXQgIT0gTlVMTCkKZGlmZiAtLWdpdCBhL2FyY2gvc2gva2VybmVsL3RpbWVycy90aW1lci10bXUuYyBiL2FyY2gvc2gva2VybmVsL3RpbWVycy90aW1lci10bXUuYwppbmRleCAyMDU4MTZmLi4yNDkyNzAxIDEwMDY0NAotLS0gYS9hcmNoL3NoL2tlcm5lbC90aW1lcnMvdGltZXItdG11LmMKKysrIGIvYXJjaC9zaC9rZXJuZWwvdGltZXJzL3RpbWVyLXRtdS5jCkBAIC04MCw4ICs4MCw3IEBACiAJcmV0dXJuIGNvdW50OwogfQogCi1zdGF0aWMgaXJxcmV0dXJuX3QgdG11X3RpbWVyX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQsCi0JCQkJICAgICAgIHN0cnVjdCBwdF9yZWdzICpyZWdzKQorc3RhdGljIGlycXJldHVybl90IHRtdV90aW1lcl9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZHVtbXkpCiB7CiAJdW5zaWduZWQgbG9uZyB0aW1lcl9zdGF0dXM7CiAKQEAgLTk4LDcgKzk3LDcgQEAKIAkgKiBsb2NhbGx5IGRpc2FibGVkLiAtYXJjYQogCSAqLwogCXdyaXRlX3NlcWxvY2soJnh0aW1lX2xvY2spOwotCWhhbmRsZV90aW1lcl90aWNrKHJlZ3MpOworCWhhbmRsZV90aW1lcl90aWNrKCk7CiAJd3JpdGVfc2VxdW5sb2NrKCZ4dGltZV9sb2NrKTsKIAogCXJldHVybiBJUlFfSEFORExFRDsKQEAgLTExMSw2MCArMTEwLDYgQEAKIAkubWFzawkJPSBDUFVfTUFTS19OT05FLAogfTsKIAotLyoKLSAqIEhhaCEgIFdlJ2xsIHNlZSBpZiB0aGlzIHdvcmtzIChzd2l0Y2hpbmcgZnJvbSB1c2VjcyB0byBuc2VjcykuCi0gKi8KLXN0YXRpYyB1bnNpZ25lZCBsb25nIHRtdV90aW1lcl9nZXRfZnJlcXVlbmN5KHZvaWQpCi17Ci0JdTMyIGZyZXE7Ci0Jc3RydWN0IHRpbWVzcGVjIHRzMSwgdHMyOwotCXVuc2lnbmVkIGxvbmcgZGlmZl9uc2VjOwotCXVuc2lnbmVkIGxvbmcgZmFjdG9yOwotCi0JLyogU2V0dXAgdGhlIHRpbWVyOiAgV2UgZG9uJ3Qgd2FudCB0byBnZW5lcmF0ZSBpbnRlcnJ1cHRzLCBqdXN0Ci0JICogaGF2ZSBpdCBjb3VudCBkb3duIGF0IGl0cyBuYXR1cmFsIHJhdGUuCi0JICovCi0JY3RybF9vdXRiKDAsIFRNVV9UU1RSKTsKLSNpZiAhZGVmaW5lZChDT05GSUdfQ1BVX1NVQlRZUEVfU0g3MzAwKSAmJiAhZGVmaW5lZChDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzYwKQotCWN0cmxfb3V0YihUTVVfVE9DUl9JTklULCBUTVVfVE9DUik7Ci0jZW5kaWYKLQljdHJsX291dHcoVE1VMF9UQ1JfQ0FMSUIsIFRNVTBfVENSKTsKLQljdHJsX291dGwoMHhmZmZmZmZmZiwgVE1VMF9UQ09SKTsKLQljdHJsX291dGwoMHhmZmZmZmZmZiwgVE1VMF9UQ05UKTsKLQotCXJ0Y19zaF9nZXRfdGltZSgmdHMyKTsKLQotCWRvIHsKLQkJcnRjX3NoX2dldF90aW1lKCZ0czEpOwotCX0gd2hpbGUgKHRzMS50dl9uc2VjID09IHRzMi50dl9uc2VjICYmIHRzMS50dl9zZWMgPT0gdHMyLnR2X3NlYyk7Ci0KLQkvKiBhY3R1YWxseSBzdGFydCB0aGUgdGltZXIgKi8KLQljdHJsX291dGIoVE1VX1RTVFJfSU5JVCwgVE1VX1RTVFIpOwotCi0JZG8gewotCQlydGNfc2hfZ2V0X3RpbWUoJnRzMik7Ci0JfSB3aGlsZSAodHMxLnR2X25zZWMgPT0gdHMyLnR2X25zZWMgJiYgdHMxLnR2X3NlYyA9PSB0czIudHZfc2VjKTsKLQotCWZyZXEgPSAweGZmZmZmZmZmIC0gY3RybF9pbmwoVE1VMF9UQ05UKTsKLQlpZiAodHMyLnR2X25zZWMgPCB0czEudHZfbnNlYykgewotCQl0czIudHZfbnNlYyArPSAxMDAwMDAwMDAwOwotCQl0czIudHZfc2VjLS07Ci0JfQotCi0JZGlmZl9uc2VjID0gKHRzMi50dl9zZWMgLSB0czEudHZfc2VjKSAqIDEwMDAwMDAwMDAgKyAodHMyLnR2X25zZWMgLSB0czEudHZfbnNlYyk7Ci0KLQkvKiB0aGlzIHNob3VsZCB3b3JrIHdlbGwgaWYgdGhlIFJUQyBoYXMgYSBwcmVjaXNpb24gb2YgbiBIeiwgd2hlcmUKLQkgKiBuIGlzIGFuIGludGVnZXIuICBJIGRvbid0IHRoaW5rIHdlIGhhdmUgdG8gd29ycnkgYWJvdXQgdGhlIG90aGVyCi0JICogY2FzZXMuICovCi0JZmFjdG9yID0gKDEwMDAwMDAwMDAgKyBkaWZmX25zZWMvMikgLyBkaWZmX25zZWM7Ci0KLQlpZiAoZmFjdG9yICogZGlmZl9uc2VjID4gMTEwMDAwMDAwMCB8fAotCSAgICBmYWN0b3IgKiBkaWZmX25zZWMgPCAgOTAwMDAwMDAwKQotCQlwYW5pYygid2VpcmQgUlRDIChkaWZmX25zZWMgJWxkKSIsIGRpZmZfbnNlYyk7Ci0KLQlyZXR1cm4gZnJlcSAqIGZhY3RvcjsKLX0KLQogc3RhdGljIHZvaWQgdG11X2Nsa19pbml0KHN0cnVjdCBjbGsgKmNsaykKIHsKIAl1OCBkaXZpc29yID0gVE1VMF9UQ1JfSU5JVCAmIDB4NzsKQEAgLTIzMiwxMiArMTc3LDEyIEBACiAJLmluaXQJCT0gdG11X3RpbWVyX2luaXQsCiAJLnN0YXJ0CQk9IHRtdV90aW1lcl9zdGFydCwKIAkuc3RvcAkJPSB0bXVfdGltZXJfc3RvcCwKLQkuZ2V0X2ZyZXF1ZW5jeQk9IHRtdV90aW1lcl9nZXRfZnJlcXVlbmN5LAorI2lmbmRlZiBDT05GSUdfR0VORVJJQ19USU1FCiAJLmdldF9vZmZzZXQJPSB0bXVfdGltZXJfZ2V0X29mZnNldCwKKyNlbmRpZgogfTsKIAogc3RydWN0IHN5c190aW1lciB0bXVfdGltZXIgPSB7CiAJLm5hbWUJPSAidG11IiwKIAkub3BzCT0gJnRtdV90aW1lcl9vcHMsCiB9OwotCmRpZmYgLS1naXQgYS9hcmNoL3NoL2tlcm5lbC90cmFwcy5jIGIvYXJjaC9zaC9rZXJuZWwvdHJhcHMuYwppbmRleCBjMmM1OTdlLi41M2RmYTU1IDEwMDY0NAotLS0gYS9hcmNoL3NoL2tlcm5lbC90cmFwcy5jCisrKyBiL2FyY2gvc2gva2VybmVsL3RyYXBzLmMKQEAgLTEsMzggKzEsMjUgQEAKLS8qICRJZDogdHJhcHMuYyx2IDEuMTcgMjAwNC8wNS8wMiAwMTo0NjozMCBzdWdpb2thIEV4cCAkCi0gKgotICogIGxpbnV4L2FyY2gvc2gvdHJhcHMuYworLyoKKyAqICd0cmFwcy5jJyBoYW5kbGVzIGhhcmR3YXJlIHRyYXBzIGFuZCBmYXVsdHMgYWZ0ZXIgd2UgaGF2ZSBzYXZlZCBzb21lCisgKiBzdGF0ZSBpbiAnZW50cnkuUycuCiAgKgogICogIFN1cGVySCB2ZXJzaW9uOiBDb3B5cmlnaHQgKEMpIDE5OTkgTmlpYmUgWXV0YWthCiAgKiAgICAgICAgICAgICAgICAgIENvcHlyaWdodCAoQykgMjAwMCBQaGlsaXBwIFJ1bXBmCiAgKiAgICAgICAgICAgICAgICAgIENvcHlyaWdodCAoQykgMjAwMCBEYXZpZCBIb3dlbGxzCi0gKiAgICAgICAgICAgICAgICAgIENvcHlyaWdodCAoQykgMjAwMiwgMjAwMyBQYXVsIE11bmR0CisgKiAgICAgICAgICAgICAgICAgIENvcHlyaWdodCAoQykgMjAwMiAtIDIwMDYgUGF1bCBNdW5kdAorICoKKyAqIFRoaXMgZmlsZSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlLiAgU2VlIHRoZSBmaWxlICJDT1BZSU5HIiBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhpcyBhcmNoaXZlCisgKiBmb3IgbW9yZSBkZXRhaWxzLgogICovCi0KLS8qCi0gKiAnVHJhcHMuYycgaGFuZGxlcyBoYXJkd2FyZSB0cmFwcyBhbmQgZmF1bHRzIGFmdGVyIHdlIGhhdmUgc2F2ZWQgc29tZQotICogc3RhdGUgaW4gJ2VudHJ5LlMnLgotICovCi0jaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KLSNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgogI2luY2x1ZGUgPGxpbnV4L3B0cmFjZS5oPgotI2luY2x1ZGUgPGxpbnV4L3RpbWVyLmg+Ci0jaW5jbHVkZSA8bGludXgvbW0uaD4KLSNpbmNsdWRlIDxsaW51eC9zbXAuaD4KLSNpbmNsdWRlIDxsaW51eC9zbXBfbG9jay5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgva2FsbHN5bXMuaD4KLQorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CiAjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+Ci0jaW5jbHVkZSA8YXNtL2lvLmg+Ci0jaW5jbHVkZSA8YXNtL2F0b21pYy5oPgotI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3IuaD4KLSNpbmNsdWRlIDxhc20vc2VjdGlvbnMuaD4KIAogI2lmZGVmIENPTkZJR19TSF9LR0RCCiAjaW5jbHVkZSA8YXNtL2tnZGIuaD4KQEAgLTUzLDEzICs0MCwzMiBAQAogI2RlZmluZSBUUkFQX0lMTEVHQUxfU0xPVF9JTlNUCTEzCiAjZW5kaWYKIAotLyoKLSAqIFRoZXNlIGNvbnN0YW50cyBhcmUgZm9yIHNlYXJjaGluZyBmb3IgcG9zc2libGUgbW9kdWxlIHRleHQKLSAqIHNlZ21lbnRzLiAgVk1BTExPQ19PRkZTRVQgY29tZXMgZnJvbSBtbS92bWFsbG9jLmM7IE1PRFVMRV9SQU5HRSBpcwotICogYSBndWVzcyBvZiBob3cgbXVjaCBzcGFjZSBpcyBsaWtlbHkgdG8gYmUgdm1hbGxvY2VkLgotICovCi0jZGVmaW5lIFZNQUxMT0NfT0ZGU0VUICg4KjEwMjQqMTAyNCkKLSNkZWZpbmUgTU9EVUxFX1JBTkdFICg4KjEwMjQqMTAyNCkKK3N0YXRpYyB2b2lkIGR1bXBfbWVtKGNvbnN0IGNoYXIgKnN0ciwgdW5zaWduZWQgbG9uZyBib3R0b20sIHVuc2lnbmVkIGxvbmcgdG9wKQoreworCXVuc2lnbmVkIGxvbmcgcDsKKwlpbnQgaTsKKworCXByaW50aygiJXMoMHglMDhseCB0byAweCUwOGx4KVxuIiwgc3RyLCBib3R0b20sIHRvcCk7CisKKwlmb3IgKHAgPSBib3R0b20gJiB+MzE7IHAgPCB0b3A7ICkgeworCQlwcmludGsoIiUwNGx4OiAiLCBwICYgMHhmZmZmKTsKKworCQlmb3IgKGkgPSAwOyBpIDwgODsgaSsrLCBwICs9IDQpIHsKKwkJCXVuc2lnbmVkIGludCB2YWw7CisKKwkJCWlmIChwIDwgYm90dG9tIHx8IHAgPj0gdG9wKQorCQkJCXByaW50aygiICAgICAgICAgIik7CisJCQllbHNlIHsKKwkJCQlpZiAoX19nZXRfdXNlcih2YWwsICh1bnNpZ25lZCBpbnQgX191c2VyICopcCkpIHsKKwkJCQkJcHJpbnRrKCJcbiIpOworCQkJCQlyZXR1cm47CisJCQkJfQorCQkJCXByaW50aygiJTA4eCAiLCB2YWwpOworCQkJfQorCQl9CisJCXByaW50aygiXG4iKTsKKwl9Cit9CiAKIERFRklORV9TUElOTE9DSyhkaWVfbG9jayk7CiAKQEAgLTY5LDE0ICs3NSwyOCBAQAogCiAJY29uc29sZV92ZXJib3NlKCk7CiAJc3Bpbl9sb2NrX2lycSgmZGllX2xvY2spOworCWJ1c3Rfc3BpbmxvY2tzKDEpOworCiAJcHJpbnRrKCIlczogJTA0bHggWyMlZF1cbiIsIHN0ciwgZXJyICYgMHhmZmZmLCArK2RpZV9jb3VudGVyKTsKKwogCUNIS19SRU1PVEVfREVCVUcocmVncyk7CisJcHJpbnRfbW9kdWxlcygpOwogCXNob3dfcmVncyhyZWdzKTsKKworCXByaW50aygiUHJvY2VzczogJXMgKHBpZDogJWQsIHN0YWNrIGxpbWl0ID0gJXApXG4iLAorCSAgICAgICBjdXJyZW50LT5jb21tLCBjdXJyZW50LT5waWQsIHRhc2tfc3RhY2tfcGFnZShjdXJyZW50KSArIDEpOworCisJaWYgKCF1c2VyX21vZGUocmVncykgfHwgaW5faW50ZXJydXB0KCkpCisJCWR1bXBfbWVtKCJTdGFjazogIiwgcmVncy0+cmVnc1sxNV0sIFRIUkVBRF9TSVpFICsKKwkJIAkgKHVuc2lnbmVkIGxvbmcpdGFza19zdGFja19wYWdlKGN1cnJlbnQpKTsKKworCWJ1c3Rfc3BpbmxvY2tzKDApOwogCXNwaW5fdW5sb2NrX2lycSgmZGllX2xvY2spOwogCWRvX2V4aXQoU0lHU0VHVik7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBkaWVfaWZfa2VybmVsKGNvbnN0IGNoYXIgKiBzdHIsIHN0cnVjdCBwdF9yZWdzICogcmVncywgbG9uZyBlcnIpCitzdGF0aWMgaW5saW5lIHZvaWQgZGllX2lmX2tlcm5lbChjb25zdCBjaGFyICpzdHIsIHN0cnVjdCBwdF9yZWdzICpyZWdzLAorCQkJCSBsb25nIGVycikKIHsKIAlpZiAoIXVzZXJfbW9kZShyZWdzKSkKIAkJZGllKHN0ciwgcmVncywgZXJyKTsKQEAgLTkzLDggKzExMyw3IEBACiAgKi8KIHN0YXRpYyBpbnQgZGllX2lmX25vX2ZpeHVwKGNvbnN0IGNoYXIgKiBzdHIsIHN0cnVjdCBwdF9yZWdzICogcmVncywgbG9uZyBlcnIpCiB7Ci0JaWYgKCF1c2VyX21vZGUocmVncykpCi0JeworCWlmICghdXNlcl9tb2RlKHJlZ3MpKSB7CiAJCWNvbnN0IHN0cnVjdCBleGNlcHRpb25fdGFibGVfZW50cnkgKmZpeHVwOwogCQlmaXh1cCA9IHNlYXJjaF9leGNlcHRpb25fdGFibGVzKHJlZ3MtPnBjKTsKIAkJaWYgKGZpeHVwKSB7CkBAIC01NTAsNyArNTY5LDEwIEBACiAjZGVmaW5lIGlzX2RzcF9pbnN0KHJlZ3MpCSgwKQogI2VuZGlmIC8qIENPTkZJR19TSF9EU1AgKi8KIAotZXh0ZXJuIGludCBkb19mcHVfaW5zdCh1bnNpZ25lZCBzaG9ydCwgc3RydWN0IHB0X3JlZ3MqKTsKKy8qIGFyY2gvc2gva2VybmVsL2NwdS9zaDQvZnB1LmMgKi8KK2V4dGVybiBpbnQgZG9fZnB1X2luc3QodW5zaWduZWQgc2hvcnQsIHN0cnVjdCBwdF9yZWdzICopOworZXh0ZXJuIGFzbWxpbmthZ2Ugdm9pZCBkb19mcHVfc3RhdGVfcmVzdG9yZSh1bnNpZ25lZCBsb25nIHI0LCB1bnNpZ25lZCBsb25nIHI1LAorCQl1bnNpZ25lZCBsb25nIHI2LCB1bnNpZ25lZCBsb25nIHI3LCBzdHJ1Y3QgcHRfcmVncyByZWdzKTsKIAogYXNtbGlua2FnZSB2b2lkIGRvX3Jlc2VydmVkX2luc3QodW5zaWduZWQgbG9uZyByNCwgdW5zaWduZWQgbG9uZyByNSwKIAkJCQl1bnNpZ25lZCBsb25nIHI2LCB1bnNpZ25lZCBsb25nIHI3LApAQCAtNzA5LDE0ICs3MzEsMjAgQEAKIAkJICAgICA6ICJtZW1vcnkiKTsKIH0KIAotdm9pZCBfX2luaXQgdHJhcF9pbml0KHZvaWQpCit2b2lkICpzZXRfZXhjZXB0aW9uX3RhYmxlX3ZlYyh1bnNpZ25lZCBpbnQgdmVjLCB2b2lkICpoYW5kbGVyKQogewogCWV4dGVybiB2b2lkICpleGNlcHRpb25faGFuZGxpbmdfdGFibGVbXTsKKwl2b2lkICpvbGRfaGFuZGxlcjsKKwkKKwlvbGRfaGFuZGxlciA9IGV4Y2VwdGlvbl9oYW5kbGluZ190YWJsZVt2ZWNdOworCWV4Y2VwdGlvbl9oYW5kbGluZ190YWJsZVt2ZWNdID0gaGFuZGxlcjsKKwlyZXR1cm4gb2xkX2hhbmRsZXI7Cit9CiAKLQlleGNlcHRpb25faGFuZGxpbmdfdGFibGVbVFJBUF9SRVNFUlZFRF9JTlNUXQotCQk9ICh2b2lkICopZG9fcmVzZXJ2ZWRfaW5zdDsKLQlleGNlcHRpb25faGFuZGxpbmdfdGFibGVbVFJBUF9JTExFR0FMX1NMT1RfSU5TVF0KLQkJPSAodm9pZCAqKWRvX2lsbGVnYWxfc2xvdF9pbnN0Owordm9pZCBfX2luaXQgdHJhcF9pbml0KHZvaWQpCit7CisJc2V0X2V4Y2VwdGlvbl90YWJsZV92ZWMoVFJBUF9SRVNFUlZFRF9JTlNULCBkb19yZXNlcnZlZF9pbnN0KTsKKwlzZXRfZXhjZXB0aW9uX3RhYmxlX3ZlYyhUUkFQX0lMTEVHQUxfU0xPVF9JTlNULCBkb19pbGxlZ2FsX3Nsb3RfaW5zdCk7CiAKICNpZiBkZWZpbmVkKENPTkZJR19DUFVfU0g0KSAmJiAhZGVmaW5lZChDT05GSUdfU0hfRlBVKSB8fCBcCiAgICAgZGVmaW5lZChDT05GSUdfU0hfRlBVX0VNVSkKQEAgLTcyNSwyMSArNzUzLDQyIEBACiAJICogcmVzZXJ2ZWQuIFRoZXknbGwgYmUgaGFuZGxlZCBpbiB0aGUgbWF0aC1lbXUgY2FzZSwgb3IgZmF1bHRlZCBvbgogCSAqIG90aGVyd2lzZS4KIAkgKi8KLQkvKiBlbnRyeSA2NCBjb3JyZXNwb25kcyB0byBFWFBFVlQ9MHg4MDAgKi8KLQlleGNlcHRpb25faGFuZGxpbmdfdGFibGVbNjRdID0gKHZvaWQgKilkb19yZXNlcnZlZF9pbnN0OwotCWV4Y2VwdGlvbl9oYW5kbGluZ190YWJsZVs2NV0gPSAodm9pZCAqKWRvX2lsbGVnYWxfc2xvdF9pbnN0OworCXNldF9leGNlcHRpb25fdGFibGVfZXZ0KDB4ODAwLCBkb19yZXNlcnZlZF9pbnN0KTsKKwlzZXRfZXhjZXB0aW9uX3RhYmxlX2V2dCgweDgyMCwgZG9faWxsZWdhbF9zbG90X2luc3QpOworI2VsaWYgZGVmaW5lZChDT05GSUdfU0hfRlBVKQorCXNldF9leGNlcHRpb25fdGFibGVfZXZ0KDB4ODAwLCBkb19mcHVfc3RhdGVfcmVzdG9yZSk7CisJc2V0X2V4Y2VwdGlvbl90YWJsZV9ldnQoMHg4MjAsIGRvX2ZwdV9zdGF0ZV9yZXN0b3JlKTsKICNlbmRpZgogCQkKIAkvKiBTZXR1cCBWQlIgZm9yIGJvb3QgY3B1ICovCiAJcGVyX2NwdV90cmFwX2luaXQoKTsKIH0KIAordm9pZCBzaG93X3RyYWNlKHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrLCB1bnNpZ25lZCBsb25nICpzcCwKKwkJc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJdW5zaWduZWQgbG9uZyBhZGRyOworCisJaWYgKHJlZ3MgJiYgdXNlcl9tb2RlKHJlZ3MpKQorCQlyZXR1cm47CisKKwlwcmludGsoIlxuQ2FsbCB0cmFjZTogIik7CisjaWZkZWYgQ09ORklHX0tBTExTWU1TCisJcHJpbnRrKCJcbiIpOworI2VuZGlmCisKKwl3aGlsZSAoIWtzdGFja19lbmQoc3ApKSB7CisJCWFkZHIgPSAqc3ArKzsKKwkJaWYgKGtlcm5lbF90ZXh0X2FkZHJlc3MoYWRkcikpCisJCQlwcmludF9pcF9zeW0oYWRkcik7CisJfQorCisJcHJpbnRrKCJcbiIpOworfQorCiB2b2lkIHNob3dfc3RhY2soc3RydWN0IHRhc2tfc3RydWN0ICp0c2ssIHVuc2lnbmVkIGxvbmcgKnNwKQogewotCXVuc2lnbmVkIGxvbmcgKnN0YWNrLCBhZGRyOwotCXVuc2lnbmVkIGxvbmcgbW9kdWxlX3N0YXJ0ID0gVk1BTExPQ19TVEFSVDsKLQl1bnNpZ25lZCBsb25nIG1vZHVsZV9lbmQgPSBWTUFMTE9DX0VORDsKLQlpbnQgaSA9IDE7CisJdW5zaWduZWQgbG9uZyBzdGFjazsKIAogCWlmICghdHNrKQogCQl0c2sgPSBjdXJyZW50OwpAQCAtNzQ4LDM4ICs3OTcsMTAgQEAKIAllbHNlCiAJCXNwID0gKHVuc2lnbmVkIGxvbmcgKil0c2stPnRocmVhZC5zcDsKIAotCXN0YWNrID0gc3A7Ci0KLQlwcmludGsoIlxuQ2FsbCB0cmFjZTogIik7Ci0jaWZkZWYgQ09ORklHX0tBTExTWU1TCi0JcHJpbnRrKCJcbiIpOwotI2VuZGlmCi0KLQl3aGlsZSAoIWtzdGFja19lbmQoc3RhY2spKSB7Ci0JCWFkZHIgPSAqc3RhY2srKzsKLQkJaWYgKCgoYWRkciA+PSAodW5zaWduZWQgbG9uZylfdGV4dCkgJiYKLQkJICAgICAoYWRkciA8PSAodW5zaWduZWQgbG9uZylfZXRleHQpKSB8fAotCQkgICAgKChhZGRyID49IG1vZHVsZV9zdGFydCkgJiYgKGFkZHIgPD0gbW9kdWxlX2VuZCkpKSB7Ci0JCQkvKgotCQkJICogRm9yIDgwLWNvbHVtbnMgZGlzcGxheSwgNiBlbnRyeSBpcyBtYXhpbXVtLgotCQkJICogTk9URTogJ1s8OGMwMGFiY2Q+XSAnIGNvbnN1bWVzIDEzIGNvbHVtbnMgLgotCQkJICovCi0jaWZuZGVmIENPTkZJR19LQUxMU1lNUwotCQkJaWYgKGkgJiYgKChpICUgNikgPT0gMCkpCi0JCQkJcHJpbnRrKCJcbiAgICAgICAiKTsKLSNlbmRpZgotCQkJcHJpbnRrKCJbPCUwOGx4Pl0gIiwgYWRkcik7Ci0JCQlwcmludF9zeW1ib2woIiVzXG4iLCBhZGRyKTsKLQkJCWkrKzsKLQkJfQotCX0KLQotCXByaW50aygiXG4iKTsKLX0KLQotdm9pZCBzaG93X3Rhc2sodW5zaWduZWQgbG9uZyAqc3ApCi17Ci0Jc2hvd19zdGFjayhOVUxMLCBzcCk7CisJc3RhY2sgPSAodW5zaWduZWQgbG9uZylzcDsKKwlkdW1wX21lbSgiU3RhY2s6ICIsIHN0YWNrLCBUSFJFQURfU0laRSArCisJCSAodW5zaWduZWQgbG9uZyl0YXNrX3N0YWNrX3BhZ2UodHNrKSk7CisJc2hvd190cmFjZSh0c2ssIHNwLCBOVUxMKTsKIH0KIAogdm9pZCBkdW1wX3N0YWNrKHZvaWQpCmRpZmYgLS1naXQgYS9hcmNoL3NoL2tlcm5lbC92bWxpbnV4Lmxkcy5TIGIvYXJjaC9zaC9rZXJuZWwvdm1saW51eC5sZHMuUwppbmRleCA1ZWI5MzA5Li43N2I0MDI2IDEwMDY0NAotLS0gYS9hcmNoL3NoL2tlcm5lbC92bWxpbnV4Lmxkcy5TCisrKyBiL2FyY2gvc2gva2VybmVsL3ZtbGludXgubGRzLlMKQEAgLTc2LDEzICs3Niw3IEBACiAgIF9fc2V0dXBfZW5kID0gLjsKICAgX19pbml0Y2FsbF9zdGFydCA9IC47CiAgIC5pbml0Y2FsbC5pbml0IDogewotCSooLmluaXRjYWxsMS5pbml0KSAKLQkqKC5pbml0Y2FsbDIuaW5pdCkgCi0JKiguaW5pdGNhbGwzLmluaXQpIAotCSooLmluaXRjYWxsNC5pbml0KSAKLQkqKC5pbml0Y2FsbDUuaW5pdCkgCi0JKiguaW5pdGNhbGw2LmluaXQpIAotCSooLmluaXRjYWxsNy5pbml0KQorCUlOSVRDQUxMUwogICB9CiAgIF9faW5pdGNhbGxfZW5kID0gLjsKICAgX19jb25faW5pdGNhbGxfc3RhcnQgPSAuOwpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9tbS9jb25zaXN0ZW50LmMgYi9hcmNoL3NoL21tL2NvbnNpc3RlbnQuYwppbmRleCBjODFlNmI2Li4zOGM4MmQ4IDEwMDY0NAotLS0gYS9hcmNoL3NoL21tL2NvbnNpc3RlbnQuYworKysgYi9hcmNoL3NoL21tL2NvbnNpc3RlbnQuYwpAQCAtMjgsNiArMjgsNyBAQAogCXNwbGl0X3BhZ2UocGFnZSwgb3JkZXIpOwogCiAJcmV0ID0gcGFnZV9hZGRyZXNzKHBhZ2UpOworCW1lbXNldChyZXQsIDAsIHNpemUpOwogCSpoYW5kbGUgPSB2aXJ0X3RvX3BoeXMocmV0KTsKIAogCS8qCmRpZmYgLS1naXQgYS9hcmNoL3NoNjQva2VybmVsL3ZtbGludXgubGRzLlMgYi9hcmNoL3NoNjQva2VybmVsL3ZtbGludXgubGRzLlMKaW5kZXggYThmY2MzYS4uOTVjNGQ3NSAxMDA2NDQKLS0tIGEvYXJjaC9zaDY0L2tlcm5lbC92bWxpbnV4Lmxkcy5TCisrKyBiL2FyY2gvc2g2NC9rZXJuZWwvdm1saW51eC5sZHMuUwpAQCAtMTA4LDEzICsxMDgsNyBAQAogICBfX3NldHVwX2VuZCA9IC47CiAgIF9faW5pdGNhbGxfc3RhcnQgPSAuOwogICAuaW5pdGNhbGwuaW5pdCA6IENfUEhZUyguaW5pdGNhbGwuaW5pdCkgewotICAJKiguaW5pdGNhbGwxLmluaXQpCi0gIAkqKC5pbml0Y2FsbDIuaW5pdCkKLSAgCSooLmluaXRjYWxsMy5pbml0KQotICAJKiguaW5pdGNhbGw0LmluaXQpCi0gIAkqKC5pbml0Y2FsbDUuaW5pdCkKLSAgCSooLmluaXRjYWxsNi5pbml0KQotICAJKiguaW5pdGNhbGw3LmluaXQpCisJSU5JVENBTExTCiAgIH0KICAgX19pbml0Y2FsbF9lbmQgPSAuOwogICBfX2Nvbl9pbml0Y2FsbF9zdGFydCA9IC47CmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjL0tjb25maWcgYi9hcmNoL3NwYXJjL0tjb25maWcKaW5kZXggOTQzMWU5Ni4uMmY5NjYxMCAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYy9LY29uZmlnCisrKyBiL2FyY2gvc3BhcmMvS2NvbmZpZwpAQCAtMjg5LDYgKzI4OSwxMyBAQAogCiBzb3VyY2UgImZzL0tjb25maWciCiAKK21lbnUgIkluc3RydW1lbnRhdGlvbiBTdXBwb3J0IgorCWRlcGVuZHMgb24gRVhQRVJJTUVOVEFMCisKK3NvdXJjZSAiYXJjaC9zcGFyYy9vcHJvZmlsZS9LY29uZmlnIgorCitlbmRtZW51CisKIHNvdXJjZSAiYXJjaC9zcGFyYy9LY29uZmlnLmRlYnVnIgogCiBzb3VyY2UgInNlY3VyaXR5L0tjb25maWciCmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjL01ha2VmaWxlIGIvYXJjaC9zcGFyYy9NYWtlZmlsZQppbmRleCA0Y2RiYjJkLi5mMzNjMzgxIDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjL01ha2VmaWxlCisrKyBiL2FyY2gvc3BhcmMvTWFrZWZpbGUKQEAgLTMwLDYgKzMwLDggQEAKIGNvcmUteSArPSBhcmNoL3NwYXJjL2tlcm5lbC8gYXJjaC9zcGFyYy9tbS8gYXJjaC9zcGFyYy9tYXRoLWVtdS8KIGxpYnMteSArPSBhcmNoL3NwYXJjL3Byb20vIGFyY2gvc3BhcmMvbGliLwogCitkcml2ZXJzLSQoQ09ORklHX09QUk9GSUxFKQkrPSBhcmNoL3NwYXJjL29wcm9maWxlLworCiAjIEV4cG9ydCB3aGF0IGlzIG5lZWRlZCBieSBhcmNoL3NwYXJjL2Jvb3QvTWFrZWZpbGUKICMgUmVuYW1pbmcgaXMgZG9uZSB0byBhdm9pZCBjb25mdXNpbmcgcGF0dGVybiBtYXRjaGluZyBydWxlcyBpbiAyLjUuNDUgKG11bHR5LSkKIElOSVRfWQkJOj0gJChwYXRzdWJzdCAlLywgJS9idWlsdC1pbi5vLCAkKGluaXQteSkpCmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjL2tlcm5lbC9lYnVzLmMgYi9hcmNoL3NwYXJjL2tlcm5lbC9lYnVzLmMKaW5kZXggNzVhYzI0ZC4uYmE1OGMzYSAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYy9rZXJuZWwvZWJ1cy5jCisrKyBiL2FyY2gvc3BhcmMva2VybmVsL2VidXMuYwpAQCAtMjM3LDEyICsyMzcsMTIgQEAKIAlkZXYtPm9mZGV2Lm5vZGUgPSBkcDsKIAlkZXYtPm9mZGV2LmRldi5wYXJlbnQgPSAmZGV2LT5idXMtPm9mZGV2LmRldjsKIAlkZXYtPm9mZGV2LmRldi5idXMgPSAmZWJ1c19idXNfdHlwZTsKLQlzdHJjcHkoZGV2LT5vZmRldi5kZXYuYnVzX2lkLCBkcC0+cGF0aF9jb21wb25lbnRfbmFtZSk7CisJc3ByaW50ZihkZXYtPm9mZGV2LmRldi5idXNfaWQsICJlYnVzWyUwOHhdIiwgZHAtPm5vZGUpOwogCiAJLyogUmVnaXN0ZXIgd2l0aCBjb3JlICovCiAJaWYgKG9mX2RldmljZV9yZWdpc3RlcigmZGV2LT5vZmRldikgIT0gMCkKIAkJcHJpbnRrKEtFUk5fREVCVUcgImVidXM6IGRldmljZSByZWdpc3RyYXRpb24gZXJyb3IgZm9yICVzIVxuIiwKLQkJICAgICAgIGRldi0+b2ZkZXYuZGV2LmJ1c19pZCk7CisJCSAgICAgICBkcC0+cGF0aF9jb21wb25lbnRfbmFtZSk7CiAKIAlpZiAoKGRwID0gZHAtPmNoaWxkKSAhPSBOVUxMKSB7CiAJCWRldi0+Y2hpbGRyZW4gPSAoc3RydWN0IGxpbnV4X2VidXNfY2hpbGQgKikKQEAgLTMzMiwxMiArMzMyLDEyIEBACiAJCWVidXMtPm9mZGV2Lm5vZGUgPSBkcDsKIAkJZWJ1cy0+b2ZkZXYuZGV2LnBhcmVudCA9ICZwZGV2LT5kZXY7CiAJCWVidXMtPm9mZGV2LmRldi5idXMgPSAmZWJ1c19idXNfdHlwZTsKLQkJc3RyY3B5KGVidXMtPm9mZGV2LmRldi5idXNfaWQsIGRwLT5wYXRoX2NvbXBvbmVudF9uYW1lKTsKKwkJc3ByaW50ZihlYnVzLT5vZmRldi5kZXYuYnVzX2lkLCAiZWJ1cyVkIiwgbnVtX2VidXMpOwogCiAJCS8qIFJlZ2lzdGVyIHdpdGggY29yZSAqLwogCQlpZiAob2ZfZGV2aWNlX3JlZ2lzdGVyKCZlYnVzLT5vZmRldikgIT0gMCkKIAkJCXByaW50ayhLRVJOX0RFQlVHICJlYnVzOiBkZXZpY2UgcmVnaXN0cmF0aW9uIGVycm9yIGZvciAlcyFcbiIsCi0JCQkgICAgICAgZWJ1cy0+b2ZkZXYuZGV2LmJ1c19pZCk7CisJCQkgICAgICAgZHAtPnBhdGhfY29tcG9uZW50X25hbWUpOwogCiAKIAkJbmQgPSBkcC0+Y2hpbGQ7CmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjL2tlcm5lbC9lbnRyeS5TIGIvYXJjaC9zcGFyYy9rZXJuZWwvZW50cnkuUwppbmRleCBhNGVkZmY0Li44MzFmNTQwIDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjL2tlcm5lbC9lbnRyeS5TCisrKyBiL2FyY2gvc3BhcmMva2VybmVsL2VudHJ5LlMKQEAgLTMyLDEzICszMiwxMiBAQAogI2luY2x1ZGUgPGFzbS9teGNjLmg+CiAjaW5jbHVkZSA8YXNtL3RocmVhZF9pbmZvLmg+CiAjaW5jbHVkZSA8YXNtL3BhcmFtLmg+CisjaW5jbHVkZSA8YXNtL3VuaXN0ZC5oPgogCiAjaW5jbHVkZSA8YXNtL2FzbW1hY3JvLmg+CiAKICNkZWZpbmUgY3VycHRyICAgICAgZzYKIAotI2RlZmluZSBOUl9TWVNDQUxMUyAzMDAgICAgICAvKiBFYWNoIE9TIGlzIGRpZmZlcmVudC4uLiAqLwotCiAvKiBUaGVzZSBhcmUganVzdCBoYW5keS4gKi8KICNkZWZpbmUgX1NWCXNhdmUJJXNwLCAtU1RBQ0tGUkFNRV9TWiwgJXNwCiAjZGVmaW5lIF9SUyAgICAgcmVzdG9yZSAKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmMva2VybmVsL2lycS5jIGIvYXJjaC9zcGFyYy9rZXJuZWwvaXJxLmMKaW5kZXggYjNiNjY4MC4uYzhjYjIxMSAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYy9rZXJuZWwvaXJxLmMKKysrIGIvYXJjaC9zcGFyYy9rZXJuZWwvaXJxLmMKQEAgLTM1MSw3ICszNTEsNyBAQAogfQogCiAjaWZkZWYgQ09ORklHX0JMS19ERVZfRkQKLWV4dGVybiB2b2lkIGZsb3BweV9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkKQorZXh0ZXJuIHZvaWQgZmxvcHB5X2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQpOwogCiB2b2lkIHNwYXJjX2Zsb3BweV9pcnEoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKIHsKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmMva2VybmVsL29mX2RldmljZS5jIGIvYXJjaC9zcGFyYy9rZXJuZWwvb2ZfZGV2aWNlLmMKaW5kZXggNzRiZWYyYS4uNDYyMDBjNCAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYy9rZXJuZWwvb2ZfZGV2aWNlLmMKKysrIGIvYXJjaC9zcGFyYy9rZXJuZWwvb2ZfZGV2aWNlLmMKQEAgLTY1MSw3ICs2NTEsNyBAQAogCWlmICghcGFyZW50KQogCQlzdHJjcHkob3AtPmRldi5idXNfaWQsICJyb290Iik7CiAJZWxzZQotCQlzdHJjcHkob3AtPmRldi5idXNfaWQsIGRwLT5wYXRoX2NvbXBvbmVudF9uYW1lKTsKKwkJc3ByaW50ZihvcC0+ZGV2LmJ1c19pZCwgIiUwOHgiLCBkcC0+bm9kZSk7CiAKIAlpZiAob2ZfZGV2aWNlX3JlZ2lzdGVyKG9wKSkgewogCQlwcmludGsoIiVzOiBDb3VsZCBub3QgcmVnaXN0ZXIgb2YgZGV2aWNlLlxuIiwKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmMva2VybmVsL3BjaWMuYyBiL2FyY2gvc3BhcmMva2VybmVsL3BjaWMuYwppbmRleCBiNGU1MGFlMy4uMjA3ZjFiNiAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYy9rZXJuZWwvcGNpYy5jCisrKyBiL2FyY2gvc3BhcmMva2VybmVsL3BjaWMuYwpAQCAtMzQsNiArMzQsNyBAQAogI2luY2x1ZGUgPGFzbS9wY2ljLmg+CiAjaW5jbHVkZSA8YXNtL3RpbWVyLmg+CiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxhc20vaXJxX3JlZ3MuaD4KIAogCiB1bnNpZ25lZCBpbnQgcGNpY19waW5fdG9faXJxKHVuc2lnbmVkIGludCBwaW4sIGNoYXIgKm5hbWUpOwpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYy9rZXJuZWwvc2V0dXAuYyBiL2FyY2gvc3BhcmMva2VybmVsL3NldHVwLmMKaW5kZXggMDI1MWNhYi4uMzgzNTI2YSAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYy9rZXJuZWwvc2V0dXAuYworKysgYi9hcmNoL3NwYXJjL2tlcm5lbC9zZXR1cC5jCkBAIC0xMDMsNyArMTAzLDYgQEAKIAogdW5zaWduZWQgaW50IGJvb3RfZmxhZ3MgX19pbml0ZGF0YSA9IDA7CiAjZGVmaW5lIEJPT1RNRV9ERUJVRyAgMHgxCi0jZGVmaW5lIEJPT1RNRV9TSU5HTEUgMHgyCiAKIC8qIEV4cG9ydGVkIGZvciBtbS9pbml0LmM6cGFnaW5nX2luaXQuICovCiB1bnNpZ25lZCBsb25nIGNtZGxpbmVfbWVtb3J5X3NpemUgX19pbml0ZGF0YSA9IDA7CkBAIC0xMjEsMTYgKzEyMCw2IEBACiAJLmluZGV4ID0JLTEsCiB9OwogCi1pbnQgb2JwX3N5c3RlbV9pbnRyKHZvaWQpCi17Ci0JaWYgKGJvb3RfZmxhZ3MgJiBCT09UTUVfREVCVUcpIHsKLQkJcHJpbnRrKCJPQlA6IHN5c3RlbSBpbnRlcnJ1cHRlZFxuIik7Ci0JCXByb21faGFsdCgpOwotCQlyZXR1cm4gMTsKLQl9Ci0JcmV0dXJuIDA7Ci19Ci0KIC8qIAogICogUHJvY2VzcyBrZXJuZWwgY29tbWFuZCBsaW5lIHN3aXRjaGVzIHRoYXQgYXJlIHNwZWNpZmljIHRvIHRoZQogICogU1BBUkMgb3IgdGhhdCByZXF1aXJlIHNwZWNpYWwgbG93LWxldmVsIHByb2Nlc3NpbmcuCkBAIC0xNDIsNyArMTMxLDYgQEAKIAkJYm9vdF9mbGFncyB8PSBCT09UTUVfREVCVUc7CiAJCWJyZWFrOwogCWNhc2UgJ3MnOgotCQlib290X2ZsYWdzIHw9IEJPT1RNRV9TSU5HTEU7CiAJCWJyZWFrOwogCWNhc2UgJ2gnOgogCQlwcm9tX3ByaW50ZigiYm9vdF9mbGFnc19pbml0OiBIYWx0IVxuIik7CmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjL2tlcm5lbC9zeXN0YmxzLlMgYi9hcmNoL3NwYXJjL2tlcm5lbC9zeXN0YmxzLlMKaW5kZXggMTBkZjM4ZS4uZWE3NWNhNSAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYy9rZXJuZWwvc3lzdGJscy5TCisrKyBiL2FyY2gvc3BhcmMva2VybmVsL3N5c3RibHMuUwpAQCAtNzgsNyArNzgsNyBAQAogLyoyODUqLwkubG9uZyBzeXNfbWtkaXJhdCwgc3lzX21rbm9kYXQsIHN5c19mY2hvd25hdCwgc3lzX2Z1dGltZXNhdCwgc3lzX2ZzdGF0YXQ2NAogLyoyOTAqLwkubG9uZyBzeXNfdW5saW5rYXQsIHN5c19yZW5hbWVhdCwgc3lzX2xpbmthdCwgc3lzX3N5bWxpbmthdCwgc3lzX3JlYWRsaW5rYXQKIC8qMjk1Ki8JLmxvbmcgc3lzX2ZjaG1vZGF0LCBzeXNfZmFjY2Vzc2F0LCBzeXNfcHNlbGVjdDYsIHN5c19wcG9sbCwgc3lzX3Vuc2hhcmUKLS8qMzAwKi8JLmxvbmcgc3lzX3NldF9yb2J1c3RfbGlzdCwgc3lzX2dldF9yb2J1c3RfbGlzdAorLyozMDAqLwkubG9uZyBzeXNfc2V0X3JvYnVzdF9saXN0LCBzeXNfZ2V0X3JvYnVzdF9saXN0LCBzeXNfbWlncmF0ZV9wYWdlcwogCiAjaWZkZWYgQ09ORklHX1NVTk9TX0VNVUwKIAkvKiBOb3cgdGhlIFN1bk9TIHN5c2NhbGwgdGFibGUuICovCkBAIC0xOTAsNiArMTkwLDcgQEAKIC8qMjkwKi8JLmxvbmcgc3Vub3Nfbm9zeXMsIHN1bm9zX25vc3lzLCBzdW5vc19ub3N5cwogCS5sb25nIHN1bm9zX25vc3lzLCBzdW5vc19ub3N5cywgc3Vub3Nfbm9zeXMKIAkubG9uZyBzdW5vc19ub3N5cywgc3Vub3Nfbm9zeXMsIHN1bm9zX25vc3lzCi0JLmxvbmcgc3Vub3Nfbm9zeXMsIHN1bm9zX25vc3lzLCBzdW5vc19ub3N5cworCS5sb25nIHN1bm9zX25vc3lzCisvKjMwMCovCS5sb25nIHN1bm9zX25vc3lzLCBzdW5vc19ub3N5cywgc3Vub3Nfbm9zeXMKIAogI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjL2tlcm5lbC90aW1lLmMgYi9hcmNoL3NwYXJjL2tlcm5lbC90aW1lLmMKaW5kZXggN2RjZDFhMS4uNmM3YWE1MSAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYy9rZXJuZWwvdGltZS5jCisrKyBiL2FyY2gvc3BhcmMva2VybmVsL3RpbWUuYwpAQCAtOTUsNiArOTUsOCBAQAogCXJldHVybiBwYzsKIH0KIAorRVhQT1JUX1NZTUJPTChwcm9maWxlX3BjKTsKKwogX192b2xhdGlsZV9fIHVuc2lnbmVkIGludCAqbWFzdGVyX2wxMF9jb3VudGVyOwogX192b2xhdGlsZV9fIHVuc2lnbmVkIGludCAqbWFzdGVyX2wxMF9saW1pdDsKIApkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYy9rZXJuZWwvdm1saW51eC5sZHMuUyBiL2FyY2gvc3BhcmMva2VybmVsL3ZtbGludXgubGRzLlMKaW5kZXggMzQ2YzE5YS4uNWNjNWZmNyAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYy9rZXJuZWwvdm1saW51eC5sZHMuUworKysgYi9hcmNoL3NwYXJjL2tlcm5lbC92bWxpbnV4Lmxkcy5TCkBAIC0zNiwxMSArMzYsMTEgQEAKIAogICAuID0gQUxJR04oNDA5Nik7CiAgIF9faW5pdF9iZWdpbiA9IC47CisgIF9zaW5pdHRleHQgPSAuOwogICAuaW5pdC50ZXh0IDogeyAKLQlfc2luaXR0ZXh0ID0gLjsKIAkqKC5pbml0LnRleHQpCi0JX2Vpbml0dGV4dCA9IC47CiAgIH0KKyAgX2Vpbml0dGV4dCA9IC47CiAgIF9faW5pdF90ZXh0X2VuZCA9IC47CiAgIC5pbml0LmRhdGEgOiB7ICooLmluaXQuZGF0YSkgfQogICAuID0gQUxJR04oMTYpOwpAQCAtNDksMTMgKzQ5LDcgQEAKICAgX19zZXR1cF9lbmQgPSAuOwogICBfX2luaXRjYWxsX3N0YXJ0ID0gLjsKICAgLmluaXRjYWxsLmluaXQgOiB7Ci0JKiguaW5pdGNhbGwxLmluaXQpIAotCSooLmluaXRjYWxsMi5pbml0KSAKLQkqKC5pbml0Y2FsbDMuaW5pdCkgCi0JKiguaW5pdGNhbGw0LmluaXQpIAotCSooLmluaXRjYWxsNS5pbml0KSAKLQkqKC5pbml0Y2FsbDYuaW5pdCkgCi0JKiguaW5pdGNhbGw3LmluaXQpCisJSU5JVENBTExTCiAgIH0KICAgX19pbml0Y2FsbF9lbmQgPSAuOwogICBfX2Nvbl9pbml0Y2FsbF9zdGFydCA9IC47CmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjL21tL3NybW11LmMgYi9hcmNoL3NwYXJjL21tL3NybW11LmMKaW5kZXggYjI3YTUwNi4uMGRmNzEyMSAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYy9tbS9zcm1tdS5jCisrKyBiL2FyY2gvc3BhcmMvbW0vc3JtbXUuYwpAQCAtNDAyLDcgKzQwMiw3IEBACiAJc3JtbXVfbm9jYWNoZV9lbmQgPSBTUk1NVV9OT0NBQ0hFX1ZBRERSICsgc3JtbXVfbm9jYWNoZV9zaXplOwogfQogCi12b2lkIHNybW11X25vY2FjaGVfaW5pdCh2b2lkKQordm9pZCBfX2luaXQgc3JtbXVfbm9jYWNoZV9pbml0KHZvaWQpCiB7CiAJdW5zaWduZWQgaW50IGJpdG1hcF9iaXRzOwogCXBnZF90ICpwZ2Q7CmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjL29wcm9maWxlL0tjb25maWcgYi9hcmNoL3NwYXJjL29wcm9maWxlL0tjb25maWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDhhODQwOAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvc3BhcmMvb3Byb2ZpbGUvS2NvbmZpZwpAQCAtMCwwICsxLDE3IEBACitjb25maWcgUFJPRklMSU5HCisJYm9vbCAiUHJvZmlsaW5nIHN1cHBvcnQgKEVYUEVSSU1FTlRBTCkiCisJaGVscAorCSAgU2F5IFkgaGVyZSB0byBlbmFibGUgdGhlIGV4dGVuZGVkIHByb2ZpbGluZyBzdXBwb3J0IG1lY2hhbmlzbXMgdXNlZAorCSAgYnkgcHJvZmlsZXJzIHN1Y2ggYXMgT1Byb2ZpbGUuCisJICAKKworY29uZmlnIE9QUk9GSUxFCisJdHJpc3RhdGUgIk9Qcm9maWxlIHN5c3RlbSBwcm9maWxpbmcgKEVYUEVSSU1FTlRBTCkiCisJZGVwZW5kcyBvbiBQUk9GSUxJTkcKKwloZWxwCisJICBPUHJvZmlsZSBpcyBhIHByb2ZpbGluZyBzeXN0ZW0gY2FwYWJsZSBvZiBwcm9maWxpbmcgdGhlCisJICB3aG9sZSBzeXN0ZW0sIGluY2x1ZGUgdGhlIGtlcm5lbCwga2VybmVsIG1vZHVsZXMsIGxpYnJhcmllcywKKwkgIGFuZCBhcHBsaWNhdGlvbnMuCisKKwkgIElmIHVuc3VyZSwgc2F5IE4uCisKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmMvb3Byb2ZpbGUvTWFrZWZpbGUgYi9hcmNoL3NwYXJjL29wcm9maWxlL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU5ZmVjYTEKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3NwYXJjL29wcm9maWxlL01ha2VmaWxlCkBAIC0wLDAgKzEsOSBAQAorb2JqLSQoQ09ORklHX09QUk9GSUxFKSArPSBvcHJvZmlsZS5vCisKK0RSSVZFUl9PQkpTID0gJChhZGRwcmVmaXggLi4vLi4vLi4vZHJpdmVycy9vcHJvZmlsZS8sIFwKKwkJb3Byb2YubyBjcHVfYnVmZmVyLm8gYnVmZmVyX3N5bmMubyBcCisJCWV2ZW50X2J1ZmZlci5vIG9wcm9maWxlX2ZpbGVzLm8gXAorCQlvcHJvZmlsZWZzLm8gb3Byb2ZpbGVfc3RhdHMubyBcCisJCXRpbWVyX2ludC5vICkKKworb3Byb2ZpbGUteQkJCQk6PSAkKERSSVZFUl9PQkpTKSBpbml0Lm8KZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmMvb3Byb2ZpbGUvaW5pdC5jIGIvYXJjaC9zcGFyYy9vcHJvZmlsZS9pbml0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWFiODE1YgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvc3BhcmMvb3Byb2ZpbGUvaW5pdC5jCkBAIC0wLDAgKzEsMjMgQEAKKy8qKgorICogQGZpbGUgaW5pdC5jCisgKgorICogQHJlbWFyayBDb3B5cmlnaHQgMjAwMiBPUHJvZmlsZSBhdXRob3JzCisgKiBAcmVtYXJrIFJlYWQgdGhlIGZpbGUgQ09QWUlORworICoKKyAqIEBhdXRob3IgSm9obiBMZXZvbiA8bGV2b25AbW92ZW1lbnRhcmlhbi5vcmc+CisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L29wcm9maWxlLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisgCitpbnQgX19pbml0IG9wcm9maWxlX2FyY2hfaW5pdChzdHJ1Y3Qgb3Byb2ZpbGVfb3BlcmF0aW9ucyAqIG9wcykKK3sKKwlyZXR1cm4gLUVOT0RFVjsKK30KKworCit2b2lkIG9wcm9maWxlX2FyY2hfZXhpdCh2b2lkKQoreworfQpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYzY0L2RlZmNvbmZpZyBiL2FyY2gvc3BhcmM2NC9kZWZjb25maWcKaW5kZXggZGNhZTU1OS4uMmY0NjEyZiAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYzY0L2RlZmNvbmZpZworKysgYi9hcmNoL3NwYXJjNjQvZGVmY29uZmlnCkBAIC0xLDcgKzEsNyBAQAogIwogIyBBdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBtYWtlIGNvbmZpZzogZG9uJ3QgZWRpdAotIyBMaW51eCBrZXJuZWwgdmVyc2lvbjogMi42LjE5LXJjMQotIyBUaHUgT2N0ICA1IDAyOjA4OjQxIDIwMDYKKyMgTGludXgga2VybmVsIHZlcnNpb246IDIuNi4xOS1yYzIKKyMgVHVlIE9jdCAxNyAxOToyOToyMCAyMDA2CiAjCiBDT05GSUdfU1BBUkM9eQogQ09ORklHX1NQQVJDNjQ9eQpAQCAtMjE3LDYgKzIxNyw3IEBACiBDT05GSUdfSU5FVDZfWEZSTV9NT0RFX1RVTk5FTD1tCiBDT05GSUdfSU5FVDZfWEZSTV9NT0RFX0JFRVQ9bQogIyBDT05GSUdfSU5FVDZfWEZSTV9NT0RFX1JPVVRFT1BUSU1JWkFUSU9OIGlzIG5vdCBzZXQKK0NPTkZJR19JUFY2X1NJVD1tCiBDT05GSUdfSVBWNl9UVU5ORUw9bQogIyBDT05GSUdfSVBWNl9TVUJUUkVFUyBpcyBub3Qgc2V0CiAjIENPTkZJR19JUFY2X01VTFRJUExFX1RBQkxFUyBpcyBub3Qgc2V0CkBAIC0zMzQsNiArMzM1LDEyIEBACiBDT05GSUdfQVRBX09WRVJfRVRIPW0KIAogIworIyBNaXNjIGRldmljZXMKKyMKKyMgQ09ORklHX1NHSV9JT0M0IGlzIG5vdCBzZXQKKyMgQ09ORklHX1RJRk1fQ09SRSBpcyBub3Qgc2V0CisKKyMKICMgQVRBL0FUQVBJL01GTS9STEwgc3VwcG9ydAogIwogQ09ORklHX0lERT15CkBAIC03MjgsNyArNzM1LDYgQEAKICMgVFBNIGRldmljZXMKICMKICMgQ09ORklHX1RDR19UUE0gaXMgbm90IHNldAotIyBDT05GSUdfVEVMQ0xPQ0sgaXMgbm90IHNldAogCiAjCiAjIEkyQyBzdXBwb3J0CkBAIC04NDIsMTEgKzg0OCw2IEBACiAjIENPTkZJR19IV01PTl9ERUJVR19DSElQIGlzIG5vdCBzZXQKIAogIwotIyBNaXNjIGRldmljZXMKLSMKLSMgQ09ORklHX1RJRk1fQ09SRSBpcyBub3Qgc2V0Ci0KLSMKICMgTXVsdGltZWRpYSBkZXZpY2VzCiAjCiAjIENPTkZJR19WSURFT19ERVYgaXMgbm90IHNldApAQCAtMTEwNCw3ICsxMTA1LDYgQEAKICMgQ09ORklHX1VTQl9BVElfUkVNT1RFMiBpcyBub3Qgc2V0CiAjIENPTkZJR19VU0JfS0VZU1BBTl9SRU1PVEUgaXMgbm90IHNldAogIyBDT05GSUdfVVNCX0FQUExFVE9VQ0ggaXMgbm90IHNldAotIyBDT05GSUdfVVNCX1RSQU5DRVZJQlJBVE9SIGlzIG5vdCBzZXQKIAogIwogIyBVU0IgSW1hZ2luZyBkZXZpY2VzCkBAIC0xMTUwLDYgKzExNTAsNyBAQAogIyBDT05GSUdfVVNCX0FQUExFRElTUExBWSBpcyBub3Qgc2V0CiAjIENPTkZJR19VU0JfU0lTVVNCVkdBIGlzIG5vdCBzZXQKICMgQ09ORklHX1VTQl9MRCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfVFJBTkNFVklCUkFUT1IgaXMgbm90IHNldAogIyBDT05GSUdfVVNCX1RFU1QgaXMgbm90IHNldAogCiAjCkBAIC0xMjM0LDYgKzEyMzUsNyBAQAogQ09ORklHX0VYVDNfRlNfWEFUVFI9eQogQ09ORklHX0VYVDNfRlNfUE9TSVhfQUNMPXkKIENPTkZJR19FWFQzX0ZTX1NFQ1VSSVRZPXkKKyMgQ09ORklHX0VYVDRERVZfRlMgaXMgbm90IHNldAogQ09ORklHX0pCRD15CiAjIENPTkZJR19KQkRfREVCVUcgaXMgbm90IHNldAogQ09ORklHX0ZTX01CQ0FDSEU9eQpAQCAtMTM2MiwxMCArMTM2NCw2IEBACiAjIENPTkZJR19OTFNfVVRGOCBpcyBub3Qgc2V0CiAKICMKLSMgRGlzdHJpYnV0ZWQgTG9jayBNYW5hZ2VyCi0jCi0KLSMKICMgSW5zdHJ1bWVudGF0aW9uIFN1cHBvcnQKICMKIENPTkZJR19QUk9GSUxJTkc9eQpAQCAtMTM5OSw2ICsxMzk3LDcgQEAKICMgQ09ORklHX0RFQlVHX0xJU1QgaXMgbm90IHNldAogIyBDT05GSUdfVU5XSU5EX0lORk8gaXMgbm90IHNldAogQ09ORklHX0ZPUkNFRF9JTkxJTklORz15CisjIENPTkZJR19IRUFERVJTX0NIRUNLIGlzIG5vdCBzZXQKICMgQ09ORklHX1JDVV9UT1JUVVJFX1RFU1QgaXMgbm90IHNldAogIyBDT05GSUdfTEtEVE0gaXMgbm90IHNldAogIyBDT05GSUdfREVCVUdfU1RBQ0tfVVNBR0UgaXMgbm90IHNldApkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYzY0L2tlcm5lbC9jZW50cmFsLmMgYi9hcmNoL3NwYXJjNjQva2VybmVsL2NlbnRyYWwuYwppbmRleCBiNjYzMzZkLi5lNzI0YzU0IDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjNjQva2VybmVsL2NlbnRyYWwuYworKysgYi9hcmNoL3NwYXJjNjQva2VybmVsL2NlbnRyYWwuYwpAQCAtMTI2LDYgKzEyNiwxMCBAQAogCQlpbnQgYm9hcmQ7CiAJCXUzMiB0bXA7CiAKKwkJaWYgKGRwLT5wYXJlbnQgJiYKKwkJICAgIGRwLT5wYXJlbnQtPnBhcmVudCAhPSBOVUxMKQorCQkJY29udGludWU7CisKIAkJZmhjID0gKHN0cnVjdCBsaW51eF9maGMgKikKIAkJCWNlbnRyYWxfYWxsb2NfYm9vdG1lbShzaXplb2Yoc3RydWN0IGxpbnV4X2ZoYykpOwogCQlpZiAoZmhjID09IE5VTEwpCmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjNjQva2VybmVsL2VidXMuYyBiL2FyY2gvc3BhcmM2NC9rZXJuZWwvZWJ1cy5jCmluZGV4IDJkZjI1YzIuLjM1YmY4OTUgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmM2NC9rZXJuZWwvZWJ1cy5jCisrKyBiL2FyY2gvc3BhcmM2NC9rZXJuZWwvZWJ1cy5jCkBAIC0zODksMTIgKzM4OSwxMiBAQAogCWRldi0+b2ZkZXYubm9kZSA9IGRwOwogCWRldi0+b2ZkZXYuZGV2LnBhcmVudCA9ICZkZXYtPmJ1cy0+b2ZkZXYuZGV2OwogCWRldi0+b2ZkZXYuZGV2LmJ1cyA9ICZlYnVzX2J1c190eXBlOwotCXN0cmNweShkZXYtPm9mZGV2LmRldi5idXNfaWQsIGRwLT5wYXRoX2NvbXBvbmVudF9uYW1lKTsKKwlzcHJpbnRmKGRldi0+b2ZkZXYuZGV2LmJ1c19pZCwgImVidXNbJTA4eF0iLCBkcC0+bm9kZSk7CiAKIAkvKiBSZWdpc3RlciB3aXRoIGNvcmUgKi8KIAlpZiAob2ZfZGV2aWNlX3JlZ2lzdGVyKCZkZXYtPm9mZGV2KSAhPSAwKQogCQlwcmludGsoS0VSTl9ERUJVRyAiZWJ1czogZGV2aWNlIHJlZ2lzdHJhdGlvbiBlcnJvciBmb3IgJXMhXG4iLAotCQkgICAgICAgZGV2LT5vZmRldi5kZXYuYnVzX2lkKTsKKwkJICAgICAgIGRwLT5wYXRoX2NvbXBvbmVudF9uYW1lKTsKIAogCWRwID0gZHAtPmNoaWxkOwogCWlmIChkcCkgewpAQCAtNDk0LDEyICs0OTQsMTIgQEAKIAkJZWJ1cy0+b2ZkZXYubm9kZSA9IGRwOwogCQllYnVzLT5vZmRldi5kZXYucGFyZW50ID0gJnBkZXYtPmRldjsKIAkJZWJ1cy0+b2ZkZXYuZGV2LmJ1cyA9ICZlYnVzX2J1c190eXBlOwotCQlzdHJjcHkoZWJ1cy0+b2ZkZXYuZGV2LmJ1c19pZCwgZHAtPnBhdGhfY29tcG9uZW50X25hbWUpOworCQlzcHJpbnRmKGVidXMtPm9mZGV2LmRldi5idXNfaWQsICJlYnVzJWQiLCBudW1fZWJ1cyk7CiAKIAkJLyogUmVnaXN0ZXIgd2l0aCBjb3JlICovCiAJCWlmIChvZl9kZXZpY2VfcmVnaXN0ZXIoJmVidXMtPm9mZGV2KSAhPSAwKQogCQkJcHJpbnRrKEtFUk5fREVCVUcgImVidXM6IGRldmljZSByZWdpc3RyYXRpb24gZXJyb3IgZm9yICVzIVxuIiwKLQkJCSAgICAgICBlYnVzLT5vZmRldi5kZXYuYnVzX2lkKTsKKwkJCSAgICAgICBkcC0+cGF0aF9jb21wb25lbnRfbmFtZSk7CiAKIAogCQljaGlsZCA9IGRwLT5jaGlsZDsKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmM2NC9rZXJuZWwvZW50cnkuUyBiL2FyY2gvc3BhcmM2NC9rZXJuZWwvZW50cnkuUwppbmRleCAwYWFhMzVmLi42ZjI4YmVjIDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjNjQva2VybmVsL2VudHJ5LlMKKysrIGIvYXJjaC9zcGFyYzY0L2tlcm5lbC9lbnRyeS5TCkBAIC0yMiwxMSArMjIsMTAgQEAKICNpbmNsdWRlIDxhc20vYXV4aW8uaD4KICNpbmNsdWRlIDxhc20vc2ZhZnNyLmg+CiAjaW5jbHVkZSA8YXNtL3BpbC5oPgorI2luY2x1ZGUgPGFzbS91bmlzdGQuaD4KIAogI2RlZmluZSBjdXJwdHIgICAgICBnNgogCi0jZGVmaW5lIE5SX1NZU0NBTExTIDMwMCAgICAgIC8qIEVhY2ggT1MgaXMgZGlmZmVyZW50Li4uICovCi0KIAkudGV4dAogCS5hbGlnbgkJMzIKIApkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYzY0L2tlcm5lbC9pc2EuYyBiL2FyY2gvc3BhcmM2NC9rZXJuZWwvaXNhLmMKaW5kZXggMGYzYWVjNy4uZjAyOGU2OCAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYzY0L2tlcm5lbC9pc2EuYworKysgYi9hcmNoL3NwYXJjNjQva2VybmVsL2lzYS5jCkBAIC0xMTUsMTIgKzExNSwxMiBAQAogCQlpc2FfZGV2LT5vZmRldi5ub2RlID0gZHA7CiAJCWlzYV9kZXYtPm9mZGV2LmRldi5wYXJlbnQgPSAmaXNhX2JyLT5vZmRldi5kZXY7CiAJCWlzYV9kZXYtPm9mZGV2LmRldi5idXMgPSAmaXNhX2J1c190eXBlOwotCQlzdHJjcHkoaXNhX2Rldi0+b2ZkZXYuZGV2LmJ1c19pZCwgZHAtPnBhdGhfY29tcG9uZW50X25hbWUpOworCQlzcHJpbnRmKGlzYV9kZXYtPm9mZGV2LmRldi5idXNfaWQsICJpc2FbJTA4eF0iLCBkcC0+bm9kZSk7CiAKIAkJLyogUmVnaXN0ZXIgd2l0aCBjb3JlICovCiAJCWlmIChvZl9kZXZpY2VfcmVnaXN0ZXIoJmlzYV9kZXYtPm9mZGV2KSAhPSAwKSB7CiAJCQlwcmludGsoS0VSTl9ERUJVRyAiaXNhOiBkZXZpY2UgcmVnaXN0cmF0aW9uIGVycm9yIGZvciAlcyFcbiIsCi0JCQkgICAgICAgaXNhX2Rldi0+b2ZkZXYuZGV2LmJ1c19pZCk7CisJCQkgICAgICAgZHAtPnBhdGhfY29tcG9uZW50X25hbWUpOwogCQkJa2ZyZWUoaXNhX2Rldik7CiAJCQlnb3RvIG5leHRfc2libGluZzsKIAkJfQpAQCAtMTkxLDEyICsxOTEsMTIgQEAKIAkJaXNhX2JyLT5vZmRldi5ub2RlID0gZHA7CiAJCWlzYV9ici0+b2ZkZXYuZGV2LnBhcmVudCA9ICZwZGV2LT5kZXY7CiAJCWlzYV9ici0+b2ZkZXYuZGV2LmJ1cyA9ICZpc2FfYnVzX3R5cGU7Ci0JCXN0cmNweShpc2FfYnItPm9mZGV2LmRldi5idXNfaWQsIGRwLT5wYXRoX2NvbXBvbmVudF9uYW1lKTsKKwkJc3ByaW50Zihpc2FfYnItPm9mZGV2LmRldi5idXNfaWQsICJpc2ElZCIsIGluZGV4KTsKIAogCQkvKiBSZWdpc3RlciB3aXRoIGNvcmUgKi8KIAkJaWYgKG9mX2RldmljZV9yZWdpc3RlcigmaXNhX2JyLT5vZmRldikgIT0gMCkgewogCQkJcHJpbnRrKEtFUk5fREVCVUcgImlzYTogZGV2aWNlIHJlZ2lzdHJhdGlvbiBlcnJvciBmb3IgJXMhXG4iLAotCQkJICAgICAgIGlzYV9ici0+b2ZkZXYuZGV2LmJ1c19pZCk7CisJCQkgICAgICAgZHAtPnBhdGhfY29tcG9uZW50X25hbWUpOwogCQkJa2ZyZWUoaXNhX2JyKTsKIAkJCXJldHVybjsKIAkJfQpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYzY0L2tlcm5lbC9vZl9kZXZpY2UuYyBiL2FyY2gvc3BhcmM2NC9rZXJuZWwvb2ZfZGV2aWNlLmMKaW5kZXggZDgyMmM3Yy4uOGNjMTRmYyAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYzY0L2tlcm5lbC9vZl9kZXZpY2UuYworKysgYi9hcmNoL3NwYXJjNjQva2VybmVsL29mX2RldmljZS5jCkBAIC0xMzEsOCArMTMxLDEzIEBACiB2b2lkIF9faW9tZW0gKm9mX2lvcmVtYXAoc3RydWN0IHJlc291cmNlICpyZXMsIHVuc2lnbmVkIGxvbmcgb2Zmc2V0LCB1bnNpZ25lZCBsb25nIHNpemUsIGNoYXIgKm5hbWUpCiB7CiAJdW5zaWduZWQgbG9uZyByZXQgPSByZXMtPnN0YXJ0ICsgb2Zmc2V0OworCXN0cnVjdCByZXNvdXJjZSAqcjsKIAotCWlmICghcmVxdWVzdF9yZWdpb24ocmV0LCBzaXplLCBuYW1lKSkKKwlpZiAocmVzLT5mbGFncyAmIElPUkVTT1VSQ0VfTUVNKQorCQlyID0gcmVxdWVzdF9tZW1fcmVnaW9uKHJldCwgc2l6ZSwgbmFtZSk7CisJZWxzZQorCQlyID0gcmVxdWVzdF9yZWdpb24ocmV0LCBzaXplLCBuYW1lKTsKKwlpZiAoIXIpCiAJCXJldCA9IDA7CiAKIAlyZXR1cm4gKHZvaWQgX19pb21lbSAqKSByZXQ7CkBAIC0zOTcsMTYgKzQwMiwyMiBAQAogCQkqc2l6ZWMgPSAxOwogfQogCi1zdGF0aWMgaW50IG9mX2J1c19zYnVzX21hcCh1MzIgKmFkZHIsIGNvbnN0IHUzMiAqcmFuZ2UsIGludCBuYSwgaW50IG5zLCBpbnQgcG5hKQorLyoKKyAqIEZIQy9DZW50cmFsIGJ1cyBzcGVjaWZpYyB0cmFuc2xhdG9yLgorICoKKyAqIFRoaXMgaXMganVzdCBuZWVkZWQgdG8gaGFyZC1jb2RlIHRoZSBhZGRyZXNzIGFuZCBzaXplIGNlbGwKKyAqIGNvdW50cy4gICdmaGMnIGFuZCAnY2VudHJhbCcgbm9kZXMgbGFjayB0aGUgI2FkZHJlc3MtY2VsbHMgYW5kCisgKiAjc2l6ZS1jZWxscyBwcm9wZXJ0aWVzLCBhbmQgaWYgeW91IHdhbGsgdG8gdGhlIHJvb3Qgb24gc3VjaAorICogRW50ZXJwcmlzZSBib3hlcyBhbGwgeW91J2xsIGdldCBpcyBhICNzaXplLWNlbGxzIG9mIDIgd2hpY2ggaXMKKyAqIG5vdCB3aGF0IHdlIHdhbnQgdG8gdXNlLgorICovCitzdGF0aWMgaW50IG9mX2J1c19maGNfbWF0Y2goc3RydWN0IGRldmljZV9ub2RlICpucCkKIHsKLQlyZXR1cm4gb2ZfYnVzX2RlZmF1bHRfbWFwKGFkZHIsIHJhbmdlLCBuYSwgbnMsIHBuYSk7CisJcmV0dXJuICFzdHJjbXAobnAtPm5hbWUsICJmaGMiKSB8fAorCQkhc3RyY21wKG5wLT5uYW1lLCAiY2VudHJhbCIpOwogfQogCi1zdGF0aWMgdW5zaWduZWQgaW50IG9mX2J1c19zYnVzX2dldF9mbGFncyh1MzIgKmFkZHIpCi17Ci0JcmV0dXJuIElPUkVTT1VSQ0VfTUVNOwotfQotCisjZGVmaW5lIG9mX2J1c19maGNfY291bnRfY2VsbHMgb2ZfYnVzX3NidXNfY291bnRfY2VsbHMKIAogLyoKICAqIEFycmF5IG9mIGJ1cyBzcGVjaWZpYyB0cmFuc2xhdG9ycwpAQCAtNDI4LDggKzQzOSwxNyBAQAogCQkuYWRkcl9wcm9wX25hbWUgPSAicmVnIiwKIAkJLm1hdGNoID0gb2ZfYnVzX3NidXNfbWF0Y2gsCiAJCS5jb3VudF9jZWxscyA9IG9mX2J1c19zYnVzX2NvdW50X2NlbGxzLAotCQkubWFwID0gb2ZfYnVzX3NidXNfbWFwLAotCQkuZ2V0X2ZsYWdzID0gb2ZfYnVzX3NidXNfZ2V0X2ZsYWdzLAorCQkubWFwID0gb2ZfYnVzX2RlZmF1bHRfbWFwLAorCQkuZ2V0X2ZsYWdzID0gb2ZfYnVzX2RlZmF1bHRfZ2V0X2ZsYWdzLAorCX0sCisJLyogRkhDICovCisJeworCQkubmFtZSA9ICJmaGMiLAorCQkuYWRkcl9wcm9wX25hbWUgPSAicmVnIiwKKwkJLm1hdGNoID0gb2ZfYnVzX2ZoY19tYXRjaCwKKwkJLmNvdW50X2NlbGxzID0gb2ZfYnVzX2ZoY19jb3VudF9jZWxscywKKwkJLm1hcCA9IG9mX2J1c19kZWZhdWx0X21hcCwKKwkJLmdldF9mbGFncyA9IG9mX2J1c19kZWZhdWx0X2dldF9mbGFncywKIAl9LAogCS8qIERlZmF1bHQgKi8KIAl7CkBAIC04NDEsNyArODYxLDcgQEAKIAlpZiAoIXBhcmVudCkKIAkJc3RyY3B5KG9wLT5kZXYuYnVzX2lkLCAicm9vdCIpOwogCWVsc2UKLQkJc3ByaW50ZihvcC0+ZGV2LmJ1c19pZCwgIiVzQCUwOHgiLCBkcC0+bmFtZSwgZHAtPm5vZGUpOworCQlzcHJpbnRmKG9wLT5kZXYuYnVzX2lkLCAiJTA4eCIsIGRwLT5ub2RlKTsKIAogCWlmIChvZl9kZXZpY2VfcmVnaXN0ZXIob3ApKSB7CiAJCXByaW50aygiJXM6IENvdWxkIG5vdCByZWdpc3RlciBvZiBkZXZpY2UuXG4iLApkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYzY0L2tlcm5lbC9wY2lfY29tbW9uLmMgYi9hcmNoL3NwYXJjNjQva2VybmVsL3BjaV9jb21tb24uYwppbmRleCA3YTU5Y2M3Li44MjdhZTMwIDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjNjQva2VybmVsL3BjaV9jb21tb24uYworKysgYi9hcmNoL3NwYXJjNjQva2VybmVsL3BjaV9jb21tb24uYwpAQCAtMzMwLDE5ICszMzAsNiBAQAogCXJldHVybiByZXM7CiB9CiAKLXN0YXRpYyBpbnQgX19pbml0IHBkZXZfcmVzb3VyY2VfY29sbGlzaW9uc19leHBlY3RlZChzdHJ1Y3QgcGNpX2RldiAqcGRldikKLXsKLQlpZiAocGRldi0+dmVuZG9yICE9IFBDSV9WRU5ET1JfSURfU1VOKQotCQlyZXR1cm4gMDsKLQotCWlmIChwZGV2LT5kZXZpY2UgPT0gUENJX0RFVklDRV9JRF9TVU5fUklPX0VCVVMgfHwKLQkgICAgcGRldi0+ZGV2aWNlID09IFBDSV9ERVZJQ0VfSURfU1VOX1JJT18xMzk0IHx8Ci0JICAgIHBkZXYtPmRldmljZSA9PSBQQ0lfREVWSUNFX0lEX1NVTl9SSU9fVVNCKQotCQlyZXR1cm4gMTsKLQotCXJldHVybiAwOwotfQotCiBzdGF0aWMgdm9pZCBfX2luaXQgcGRldl9yZWNvcmRfYXNzaWdubWVudHMoc3RydWN0IHBjaV9wYm1faW5mbyAqcGJtLAogCQkJCQkgICBzdHJ1Y3QgcGNpX2RldiAqcGRldikKIHsKQEAgLTQwMCwxOSArMzg3LDIzIEBACiAJCXBibS0+cGFyZW50LT5yZXNvdXJjZV9hZGp1c3QocGRldiwgcmVzLCByb290KTsKIAogCQlpZiAocmVxdWVzdF9yZXNvdXJjZShyb290LCByZXMpIDwgMCkgeworCQkJaW50IHJudW07CisKIAkJCS8qIE9LLCB0aGVyZSBpcyBzb21lIGNvbmZsaWN0LiAgQnV0IHRoaXMgaXMgZmluZQogCQkJICogc2luY2Ugd2UnbGwgcmVhc3NpZ24gaXQgaW4gdGhlIGZpeHVwIHBhc3MuCiAJCQkgKgotCQkJICogV2Ugbm90aWZ5IHRoZSB1c2VyIHRoYXQgT0JQIG1hZGUgYW4gZXJyb3IgaWYgaXQKLQkJCSAqIGlzIGEgY2FzZSB3ZSBkb24ndCBleHBlY3QuCisJCQkgKiBEbyBub3QgcHJpbnQgdGhlIHdhcm5pbmcgZm9yIFJPTSByZXNvdXJjZXMKKwkJCSAqIGFzIHN1Y2ggYSBjb25mbGljdCBpcyBxdWl0ZSBjb21tb24gYW5kCisJCQkgKiBoYXJtbGVzcyBhcyB0aGUgUk9NIGJhciBpcyBkaXNhYmxlZC4KIAkJCSAqLwotCQkJaWYgKCFwZGV2X3Jlc291cmNlX2NvbGxpc2lvbnNfZXhwZWN0ZWQocGRldikpIHsKLQkJCQlwcmludGsoS0VSTl9FUlIgIlBDSTogQWRkcmVzcyBzcGFjZSBjb2xsaXNpb24gb24gcmVnaW9uICVsZCAiCisJCQlybnVtID0gKHJlcyAtICZwZGV2LT5yZXNvdXJjZVswXSk7CisJCQlpZiAocm51bSAhPSBQQ0lfUk9NX1JFU09VUkNFKQorCQkJCXByaW50ayhLRVJOX0VSUiAiUENJOiBSZXNvdXJjZSBjb2xsaXNpb24sICIKKwkJCQkgICAgICAgInJlZ2lvbiAlZCAiCiAJCQkJICAgICAgICJbJTAxNmx4OiUwMTZseF0gb2YgZGV2aWNlICVzXG4iLAotCQkJCSAgICAgICAocmVzIC0gJnBkZXYtPnJlc291cmNlWzBdKSwKKwkJCQkgICAgICAgcm51bSwKIAkJCQkgICAgICAgcmVzLT5zdGFydCwgcmVzLT5lbmQsCiAJCQkJICAgICAgIHBjaV9uYW1lKHBkZXYpKTsKLQkJCX0KIAkJfQogCX0KIH0KZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmM2NC9rZXJuZWwvcGNpX2lvbW11LmMgYi9hcmNoL3NwYXJjNjQva2VybmVsL3BjaV9pb21tdS5jCmluZGV4IDgyZTU0NTUuLjJlN2YxNDIgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmM2NC9rZXJuZWwvcGNpX2lvbW11LmMKKysrIGIvYXJjaC9zcGFyYzY0L2tlcm5lbC9wY2lfaW9tbXUuYwpAQCAtMjgxLDcgKzI4MSw3IEBACiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmaW9tbXUtPmxvY2ssIGZsYWdzKTsKIAotCWZyZWVfbnBhZ2VzKGlvbW11LCBkdm1hLCBucGFnZXMpOworCWZyZWVfbnBhZ2VzKGlvbW11LCBkdm1hIC0gaW9tbXUtPnBhZ2VfdGFibGVfbWFwX2Jhc2UsIG5wYWdlcyk7CiAKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpb21tdS0+bG9jaywgZmxhZ3MpOwogCmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjNjQva2VybmVsL3BjaV9zYWJyZS5jIGIvYXJjaC9zcGFyYzY0L2tlcm5lbC9wY2lfc2FicmUuYwppbmRleCA2ZWM1Njk4Li45NGJiNjgxIDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjNjQva2VybmVsL3BjaV9zYWJyZS5jCisrKyBiL2FyY2gvc3BhcmM2NC9rZXJuZWwvcGNpX3NhYnJlLmMKQEAgLTExOTYsNyArMTE5Niw3IEBACiAJCQkJCSAgICAmcGJtLT5tZW1fc3BhY2UpOwogfQogCi1zdGF0aWMgdm9pZCBzYWJyZV9wYm1faW5pdChzdHJ1Y3QgcGNpX2NvbnRyb2xsZXJfaW5mbyAqcCwgc3RydWN0IGRldmljZV9ub2RlICpkcCwgdTMyIGRtYV9iZWdpbikKK3N0YXRpYyB2b2lkIHNhYnJlX3BibV9pbml0KHN0cnVjdCBwY2lfY29udHJvbGxlcl9pbmZvICpwLCBzdHJ1Y3QgZGV2aWNlX25vZGUgKmRwLCB1MzIgZG1hX3N0YXJ0LCB1MzIgZG1hX2VuZCkKIHsKIAlzdHJ1Y3QgcGNpX3BibV9pbmZvICpwYm07CiAJc3RydWN0IGRldmljZV9ub2RlICpub2RlOwpAQCAtMTI2MSw2ICsxMjYxLDggQEAKIAkJbm9kZSA9IG5vZGUtPnNpYmxpbmc7CiAJfQogCWlmIChzaW1iYXNfZm91bmQgPT0gMCkgeworCQlzdHJ1Y3QgcmVzb3VyY2UgKnJwOworCiAJCS8qIE5vIEFQQnMgdW5kZXJuZWF0aCwgcHJvYmFibHkgdGhpcyBpcyBhIGh1bW1pbmdiaXJkCiAJCSAqIHN5c3RlbS4KIAkJICovCkBAIC0xMzAyLDggKzEzMDQsMTAgQEAKIAkJcGJtLT5pb19zcGFjZS5lbmQgICA9IHBibS0+aW9fc3BhY2Uuc3RhcnQgKyAoMVVMIDw8IDI0KSAtIDFVTDsKIAkJcGJtLT5pb19zcGFjZS5mbGFncyA9IElPUkVTT1VSQ0VfSU87CiAKLQkJcGJtLT5tZW1fc3BhY2Uuc3RhcnQgPSBwLT5wYm1fQS5jb250cm9sbGVyX3JlZ3MgKyBTQUJSRV9NRU1TUEFDRTsKLQkJcGJtLT5tZW1fc3BhY2UuZW5kICAgPSBwYm0tPm1lbV9zcGFjZS5zdGFydCArICh1bnNpZ25lZCBsb25nKWRtYV9iZWdpbiAtIDFVTDsKKwkJcGJtLT5tZW1fc3BhY2Uuc3RhcnQgPQorCQkJKHAtPnBibV9BLmNvbnRyb2xsZXJfcmVncyArIFNBQlJFX01FTVNQQUNFKTsKKwkJcGJtLT5tZW1fc3BhY2UuZW5kID0KKwkJCShwYm0tPm1lbV9zcGFjZS5zdGFydCArICgoMVVMIDw8IDMyVUwpIC0gMVVMKSk7CiAJCXBibS0+bWVtX3NwYWNlLmZsYWdzID0gSU9SRVNPVVJDRV9NRU07CiAKIAkJaWYgKHJlcXVlc3RfcmVzb3VyY2UoJmlvcG9ydF9yZXNvdXJjZSwgJnBibS0+aW9fc3BhY2UpIDwgMCkgewpAQCAtMTMxNSw2ICsxMzE5LDE3IEBACiAJCQlwcm9tX2hhbHQoKTsKIAkJfQogCisJCXJwID0ga21hbGxvYyhzaXplb2YoKnJwKSwgR0ZQX0tFUk5FTCk7CisJCWlmICghcnApIHsKKwkJCXByb21fcHJpbnRmKCJDYW5ub3QgYWxsb2NhdGUgSU9NTVUgcmVzb3VyY2UuXG4iKTsKKwkJCXByb21faGFsdCgpOworCQl9CisJCXJwLT5uYW1lID0gIklPTU1VIjsKKwkJcnAtPnN0YXJ0ID0gcGJtLT5tZW1fc3BhY2Uuc3RhcnQgKyAodW5zaWduZWQgbG9uZykgZG1hX3N0YXJ0OworCQlycC0+ZW5kID0gcGJtLT5tZW1fc3BhY2Uuc3RhcnQgKyAodW5zaWduZWQgbG9uZykgZG1hX2VuZCAtIDFVTDsKKwkJcnAtPmZsYWdzID0gSU9SRVNPVVJDRV9CVVNZOworCQlyZXF1ZXN0X3Jlc291cmNlKCZwYm0tPm1lbV9zcGFjZSwgcnApOworCiAJCXBjaV9yZWdpc3Rlcl9sZWdhY3lfcmVnaW9ucygmcGJtLT5pb19zcGFjZSwKIAkJCQkJICAgICZwYm0tPm1lbV9zcGFjZSk7CiAJfQpAQCAtMTQ1MCw1ICsxNDY1LDUgQEAKIAkvKgogCSAqIExvb2sgZm9yIEFQQiB1bmRlcm5lYXRoLgogCSAqLwotCXNhYnJlX3BibV9pbml0KHAsIGRwLCB2ZG1hWzBdKTsKKwlzYWJyZV9wYm1faW5pdChwLCBkcCwgdmRtYVswXSwgdmRtYVswXSArIHZkbWFbMV0pOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYzY0L2tlcm5lbC9wcm9tLmMgYi9hcmNoL3NwYXJjNjQva2VybmVsL3Byb20uYwppbmRleCBlMjFjZDZhLi4wOTE3YzI0IDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjNjQva2VybmVsL3Byb20uYworKysgYi9hcmNoL3NwYXJjNjQva2VybmVsL3Byb20uYwpAQCAtNzkzLDcgKzc5Myw3IEBACiAJcmV0dXJuIHZpcnRfaXJxOwogfQogCi1zdGF0aWMgdm9pZCBzY2hpem9faXJxX3RyYW5zX2luaXQoc3RydWN0IGRldmljZV9ub2RlICpkcCkKK3N0YXRpYyB2b2lkIF9fc2NoaXpvX2lycV90cmFuc19pbml0KHN0cnVjdCBkZXZpY2Vfbm9kZSAqZHAsIGludCBpc190b21hdGlsbG8pCiB7CiAJc3RydWN0IGxpbnV4X3Byb202NF9yZWdpc3RlcnMgKnJlZ3M7CiAJc3RydWN0IHNjaGl6b19pcnFfZGF0YSAqaXJxX2RhdGE7CkBAIC04MDcsMTEgKzgwNywyNCBAQAogCWRwLT5pcnFfdHJhbnMtPmRhdGEgPSBpcnFfZGF0YTsKIAogCWlycV9kYXRhLT5wYm1fcmVncyA9IHJlZ3NbMF0ucGh5c19hZGRyOwotCWlycV9kYXRhLT5zeW5jX3JlZyA9IHJlZ3NbM10ucGh5c19hZGRyICsgMHgxYTE4VUw7CisJaWYgKGlzX3RvbWF0aWxsbykKKwkJaXJxX2RhdGEtPnN5bmNfcmVnID0gcmVnc1szXS5waHlzX2FkZHIgKyAweDFhMThVTDsKKwllbHNlCisJCWlycV9kYXRhLT5zeW5jX3JlZyA9IDBVTDsKIAlpcnFfZGF0YS0+cG9ydGlkID0gb2ZfZ2V0aW50cHJvcF9kZWZhdWx0KGRwLCAicG9ydGlkIiwgMCk7CiAJaXJxX2RhdGEtPmNoaXBfdmVyc2lvbiA9IG9mX2dldGludHByb3BfZGVmYXVsdChkcCwgInZlcnNpb24jIiwgMCk7CiB9CiAKK3N0YXRpYyB2b2lkIHNjaGl6b19pcnFfdHJhbnNfaW5pdChzdHJ1Y3QgZGV2aWNlX25vZGUgKmRwKQoreworCV9fc2NoaXpvX2lycV90cmFuc19pbml0KGRwLCAwKTsKK30KKworc3RhdGljIHZvaWQgdG9tYXRpbGxvX2lycV90cmFuc19pbml0KHN0cnVjdCBkZXZpY2Vfbm9kZSAqZHApCit7CisJX19zY2hpem9faXJxX3RyYW5zX2luaXQoZHAsIDEpOworfQorCiBzdGF0aWMgdW5zaWduZWQgaW50IHBjaV9zdW40dl9pcnFfYnVpbGQoc3RydWN0IGRldmljZV9ub2RlICpkcCwKIAkJCQkJdW5zaWduZWQgaW50IGRldmlubywKIAkJCQkJdm9pZCAqX2RhdGEpCkBAIC0xMDUwLDggKzEwNjMsOCBAQAogCXsgInBjaTEwOGUsODAwMSIsIHNjaGl6b19pcnFfdHJhbnNfaW5pdCB9LAogCXsgIlNVTlcsc2NoaXpvKyIsIHNjaGl6b19pcnFfdHJhbnNfaW5pdCB9LAogCXsgInBjaTEwOGUsODAwMiIsIHNjaGl6b19pcnFfdHJhbnNfaW5pdCB9LAotCXsgIlNVTlcsdG9tYXRpbGxvIiwgc2NoaXpvX2lycV90cmFuc19pbml0IH0sCi0JeyAicGNpMTA4ZSxhODAxIiwgc2NoaXpvX2lycV90cmFuc19pbml0IH0sCisJeyAiU1VOVyx0b21hdGlsbG8iLCB0b21hdGlsbG9faXJxX3RyYW5zX2luaXQgfSwKKwl7ICJwY2kxMDhlLGE4MDEiLCB0b21hdGlsbG9faXJxX3RyYW5zX2luaXQgfSwKIAl7ICJTVU5XLHN1bjR2LXBjaSIsIHBjaV9zdW40dl9pcnFfdHJhbnNfaW5pdCB9LAogfTsKICNlbmRpZgpAQCAtMTA3OSwyMyArMTA5MiwyMiBAQAogCiBzdGF0aWMgdm9pZCBpcnFfdHJhbnNfaW5pdChzdHJ1Y3QgZGV2aWNlX25vZGUgKmRwKQogewotCWNvbnN0IGNoYXIgKm1vZGVsOwogI2lmZGVmIENPTkZJR19QQ0kKKwljb25zdCBjaGFyICptb2RlbDsKIAlpbnQgaTsKICNlbmRpZgogCisjaWZkZWYgQ09ORklHX1BDSQogCW1vZGVsID0gb2ZfZ2V0X3Byb3BlcnR5KGRwLCAibW9kZWwiLCBOVUxMKTsKIAlpZiAoIW1vZGVsKQogCQltb2RlbCA9IG9mX2dldF9wcm9wZXJ0eShkcCwgImNvbXBhdGlibGUiLCBOVUxMKTsKLQlpZiAoIW1vZGVsKQotCQlyZXR1cm47CisJaWYgKG1vZGVsKSB7CisJCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHBjaV9pcnFfdHJhbnNfdGFibGUpOyBpKyspIHsKKwkJCXN0cnVjdCBpcnFfdHJhbnMgKnQgPSAmcGNpX2lycV90cmFuc190YWJsZVtpXTsKIAotI2lmZGVmIENPTkZJR19QQ0kKLQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShwY2lfaXJxX3RyYW5zX3RhYmxlKTsgaSsrKSB7Ci0JCXN0cnVjdCBpcnFfdHJhbnMgKnQgPSAmcGNpX2lycV90cmFuc190YWJsZVtpXTsKLQotCQlpZiAoIXN0cmNtcChtb2RlbCwgdC0+bmFtZSkpCi0JCQlyZXR1cm4gdC0+aW5pdChkcCk7CisJCQlpZiAoIXN0cmNtcChtb2RlbCwgdC0+bmFtZSkpCisJCQkJcmV0dXJuIHQtPmluaXQoZHApOworCQl9CiAJfQogI2VuZGlmCiAjaWZkZWYgQ09ORklHX1NCVVMKQEAgLTExMDMsOCArMTExNSw5IEBACiAJICAgICFzdHJjbXAoZHAtPm5hbWUsICJzYmkiKSkKIAkJcmV0dXJuIHNidXNfaXJxX3RyYW5zX2luaXQoZHApOwogI2VuZGlmCi0JaWYgKCFzdHJjbXAoZHAtPm5hbWUsICJjZW50cmFsIikpCi0JCXJldHVybiBjZW50cmFsX2lycV90cmFuc19pbml0KGRwLT5jaGlsZCk7CisJaWYgKCFzdHJjbXAoZHAtPm5hbWUsICJmaGMiKSAmJgorCSAgICAhc3RyY21wKGRwLT5wYXJlbnQtPm5hbWUsICJjZW50cmFsIikpCisJCXJldHVybiBjZW50cmFsX2lycV90cmFuc19pbml0KGRwKTsKIAlpZiAoIXN0cmNtcChkcC0+bmFtZSwgInZpcnR1YWwtZGV2aWNlcyIpKQogCQlyZXR1cm4gc3VuNHZfdmRldl9pcnFfdHJhbnNfaW5pdChkcCk7CiB9CkBAIC0xNTE2LDcgKzE1MjksNyBAQAogCXJldHVybiBidWY7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgZGV2aWNlX25vZGUgKiBfX2luaXQgY3JlYXRlX25vZGUocGhhbmRsZSBub2RlKQorc3RhdGljIHN0cnVjdCBkZXZpY2Vfbm9kZSAqIF9faW5pdCBjcmVhdGVfbm9kZShwaGFuZGxlIG5vZGUsIHN0cnVjdCBkZXZpY2Vfbm9kZSAqcGFyZW50KQogewogCXN0cnVjdCBkZXZpY2Vfbm9kZSAqZHA7CiAKQEAgLTE1MjUsNiArMTUzOCw3IEBACiAKIAlkcCA9IHByb21fZWFybHlfYWxsb2Moc2l6ZW9mKCpkcCkpOwogCWRwLT51bmlxdWVfaWQgPSB1bmlxdWVfaWQrKzsKKwlkcC0+cGFyZW50ID0gcGFyZW50OwogCiAJa3JlZl9pbml0KCZkcC0+a3JlZik7CiAKQEAgLTE1NDMsMTIgKzE1NTcsMTEgQEAKIHsKIAlzdHJ1Y3QgZGV2aWNlX25vZGUgKmRwOwogCi0JZHAgPSBjcmVhdGVfbm9kZShub2RlKTsKKwlkcCA9IGNyZWF0ZV9ub2RlKG5vZGUsIHBhcmVudCk7CiAJaWYgKGRwKSB7CiAJCSooKm5leHRwKSA9IGRwOwogCQkqbmV4dHAgPSAmZHAtPmFsbG5leHQ7CiAKLQkJZHAtPnBhcmVudCA9IHBhcmVudDsKIAkJZHAtPnBhdGhfY29tcG9uZW50X25hbWUgPSBidWlsZF9wYXRoX2NvbXBvbmVudChkcCk7CiAJCWRwLT5mdWxsX25hbWUgPSBidWlsZF9mdWxsX25hbWUoZHApOwogCkBAIC0xNTY0LDcgKzE1NzcsNyBAQAogewogCXN0cnVjdCBkZXZpY2Vfbm9kZSAqKm5leHRwOwogCi0JYWxsbm9kZXMgPSBjcmVhdGVfbm9kZShwcm9tX3Jvb3Rfbm9kZSk7CisJYWxsbm9kZXMgPSBjcmVhdGVfbm9kZShwcm9tX3Jvb3Rfbm9kZSwgTlVMTCk7CiAJYWxsbm9kZXMtPnBhdGhfY29tcG9uZW50X25hbWUgPSAiIjsKIAlhbGxub2Rlcy0+ZnVsbF9uYW1lID0gIi8iOwogCmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjNjQva2VybmVsL3NldHVwLmMgYi9hcmNoL3NwYXJjNjQva2VybmVsL3NldHVwLmMKaW5kZXggOTU4Mjg3NC4uYmYwMzNiMyAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYzY0L2tlcm5lbC9zZXR1cC5jCisrKyBiL2FyY2gvc3BhcmM2NC9rZXJuZWwvc2V0dXAuYwpAQCAtNzQsNyArNzQsNiBAQAogCiB1bnNpZ25lZCBpbnQgYm9vdF9mbGFncyA9IDA7CiAjZGVmaW5lIEJPT1RNRV9ERUJVRyAgMHgxCi0jZGVmaW5lIEJPT1RNRV9TSU5HTEUgMHgyCiAKIC8qIEV4cG9ydGVkIGZvciBtbS9pbml0LmM6cGFnaW5nX2luaXQuICovCiB1bnNpZ25lZCBsb25nIGNtZGxpbmVfbWVtb3J5X3NpemUgPSAwOwpAQCAtOTEsMTYgKzkwLDYgQEAKIHsKIH0KIAotaW50IG9icF9zeXN0ZW1faW50cih2b2lkKQotewotCWlmIChib290X2ZsYWdzICYgQk9PVE1FX0RFQlVHKSB7Ci0JCXByaW50aygiT0JQOiBzeXN0ZW0gaW50ZXJydXB0ZWRcbiIpOwotCQlwcm9tX2hhbHQoKTsKLQkJcmV0dXJuIDE7Ci0JfQotCXJldHVybiAwOwotfQotCiAvKiAKICAqIFByb2Nlc3Mga2VybmVsIGNvbW1hbmQgbGluZSBzd2l0Y2hlcyB0aGF0IGFyZSBzcGVjaWZpYyB0byB0aGUKICAqIFNQQVJDIG9yIHRoYXQgcmVxdWlyZSBzcGVjaWFsIGxvdy1sZXZlbCBwcm9jZXNzaW5nLgpAQCAtMTEyLDcgKzEwMSw2IEBACiAJCWJvb3RfZmxhZ3MgfD0gQk9PVE1FX0RFQlVHOwogCQlicmVhazsKIAljYXNlICdzJzoKLQkJYm9vdF9mbGFncyB8PSBCT09UTUVfU0lOR0xFOwogCQlicmVhazsKIAljYXNlICdoJzoKIAkJcHJvbV9wcmludGYoImJvb3RfZmxhZ3NfaW5pdDogSGFsdCFcbiIpOwpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYzY0L2tlcm5lbC9zeXN0YmxzLlMgYi9hcmNoL3NwYXJjNjQva2VybmVsL3N5c3RibHMuUwppbmRleCA0MTlhNjNmLi45YTgwMjY3IDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjNjQva2VybmVsL3N5c3RibHMuUworKysgYi9hcmNoL3NwYXJjNjQva2VybmVsL3N5c3RibHMuUwpAQCAtNzksNyArNzksNyBAQAogCS53b3JkIHN5c19ta2RpcmF0LCBzeXNfbWtub2RhdCwgc3lzX2ZjaG93bmF0LCBjb21wYXRfc3lzX2Z1dGltZXNhdCwgY29tcGF0X3N5c19mc3RhdGF0NjQKIC8qMjkwKi8JLndvcmQgc3lzX3VubGlua2F0LCBzeXNfcmVuYW1lYXQsIHN5c19saW5rYXQsIHN5c19zeW1saW5rYXQsIHN5c19yZWFkbGlua2F0CiAJLndvcmQgc3lzX2ZjaG1vZGF0LCBzeXNfZmFjY2Vzc2F0LCBjb21wYXRfc3lzX3BzZWxlY3Q2LCBjb21wYXRfc3lzX3Bwb2xsLCBzeXNfdW5zaGFyZQotLyozMDAqLwkud29yZCBjb21wYXRfc3lzX3NldF9yb2J1c3RfbGlzdCwgY29tcGF0X3N5c19nZXRfcm9idXN0X2xpc3QKKy8qMzAwKi8JLndvcmQgY29tcGF0X3N5c19zZXRfcm9idXN0X2xpc3QsIGNvbXBhdF9zeXNfZ2V0X3JvYnVzdF9saXN0LCBjb21wYXRfc3lzX21pZ3JhdGVfcGFnZXMKIAogI2VuZGlmIC8qIENPTkZJR19DT01QQVQgKi8KIApAQCAtMTQ5LDcgKzE0OSw3IEBACiAJLndvcmQgc3lzX21rZGlyYXQsIHN5c19ta25vZGF0LCBzeXNfZmNob3duYXQsIHN5c19mdXRpbWVzYXQsIHN5c19mc3RhdGF0NjQKIC8qMjkwKi8JLndvcmQgc3lzX3VubGlua2F0LCBzeXNfcmVuYW1lYXQsIHN5c19saW5rYXQsIHN5c19zeW1saW5rYXQsIHN5c19yZWFkbGlua2F0CiAJLndvcmQgc3lzX2ZjaG1vZGF0LCBzeXNfZmFjY2Vzc2F0LCBzeXNfcHNlbGVjdDYsIHN5c19wcG9sbCwgc3lzX3Vuc2hhcmUKLS8qMzAwKi8JLndvcmQgc3lzX3NldF9yb2J1c3RfbGlzdCwgc3lzX2dldF9yb2J1c3RfbGlzdAorLyozMDAqLwkud29yZCBzeXNfc2V0X3JvYnVzdF9saXN0LCBzeXNfZ2V0X3JvYnVzdF9saXN0LCBzeXNfbWlncmF0ZV9wYWdlcwogCiAjaWYgZGVmaW5lZChDT05GSUdfU1VOT1NfRU1VTCkgfHwgZGVmaW5lZChDT05GSUdfU09MQVJJU19FTVVMKSB8fCBcCiAgICAgZGVmaW5lZChDT05GSUdfU09MQVJJU19FTVVMX01PRFVMRSkKQEAgLTI2Miw1ICsyNjIsNyBAQAogLyoyOTAqLwkud29yZCBzdW5vc19ub3N5cywgc3Vub3Nfbm9zeXMsIHN1bm9zX25vc3lzCiAJLndvcmQgc3Vub3Nfbm9zeXMsIHN1bm9zX25vc3lzLCBzdW5vc19ub3N5cwogCS53b3JkIHN1bm9zX25vc3lzLCBzdW5vc19ub3N5cywgc3Vub3Nfbm9zeXMKLQkud29yZCBzdW5vc19ub3N5cywgc3Vub3Nfbm9zeXMsIHN1bm9zX25vc3lzCisJLndvcmQgc3Vub3Nfbm9zeXMKKy8qMzAwKi8JLndvcmQgc3Vub3Nfbm9zeXMsIHN1bm9zX25vc3lzLCBzdW5vc19ub3N5cworCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmM2NC9rZXJuZWwvdHJhcHMuYyBiL2FyY2gvc3BhcmM2NC9rZXJuZWwvdHJhcHMuYwppbmRleCA2ODQyMGUyLi5mZTE3OTZjIDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjNjQva2VybmVsL3RyYXBzLmMKKysrIGIvYXJjaC9zcGFyYzY0L2tlcm5lbC90cmFwcy5jCkBAIC04Nyw2ICs4Nyw3IEBACiAJCSAgICAgICBpICsgMSwKIAkJICAgICAgIHAtPnRyYXBzdGFja1tpXS50c3RhdGUsIHAtPnRyYXBzdGFja1tpXS50cGMsCiAJCSAgICAgICBwLT50cmFwc3RhY2tbaV0udG5wYywgcC0+dHJhcHN0YWNrW2ldLnR0KTsKKwkJcHJpbnRfc3ltYm9sKCJUUkFQTE9HOiBUUEM8JXM+XG4iLCBwLT50cmFwc3RhY2tbaV0udHBjKTsKIAl9CiB9CiAKQEAgLTExMzQsNiArMTEzNSw5IEBACiAJcHJpbnRrKCIlcyIgIkVSUk9SKCVkKTogVFBDWyVseF0gVE5QQ1slbHhdIE83WyVseF0gVFNUQVRFWyVseF1cbiIsCiAJICAgICAgIChyZWNvdmVyYWJsZSA/IEtFUk5fV0FSTklORyA6IEtFUk5fQ1JJVCksIHNtcF9wcm9jZXNzb3JfaWQoKSwKIAkgICAgICAgcmVncy0+dHBjLCByZWdzLT50bnBjLCByZWdzLT51X3JlZ3NbVVJFR19JN10sIHJlZ3MtPnRzdGF0ZSk7CisJcHJpbnRrKCIlcyIgIkVSUk9SKCVkKTogIiwKKwkgICAgICAgKHJlY292ZXJhYmxlID8gS0VSTl9XQVJOSU5HIDogS0VSTl9DUklUKSwgc21wX3Byb2Nlc3Nvcl9pZCgpKTsKKwlwcmludF9zeW1ib2woIlRQQzwlcz5cbiIsIHJlZ3MtPnRwYyk7CiAJcHJpbnRrKCIlcyIgIkVSUk9SKCVkKTogTV9TWU5EKCVseCksICBFX1NZTkQoJWx4KSVzJXNcbiIsCiAJICAgICAgIChyZWNvdmVyYWJsZSA/IEtFUk5fV0FSTklORyA6IEtFUk5fQ1JJVCksIHNtcF9wcm9jZXNzb3JfaWQoKSwKIAkgICAgICAgKGFmc3IgJiBDSEFGU1JfTV9TWU5EUk9NRSkgPj4gQ0hBRlNSX01fU1lORFJPTUVfU0hJRlQsCkBAIC0xNzQxLDYgKzE3NDUsNyBAQAogCQkgICAgICAgc21wX3Byb2Nlc3Nvcl9pZCgpLAogCQkgICAgICAgKHR5cGUgJiAweDEpID8gJ0knIDogJ0QnLAogCQkgICAgICAgcmVncy0+dHBjKTsKKwkJcHJpbnRfc3ltYm9sKEtFUk5fRU1FUkcgIlRQQzwlcz5cbiIsIHJlZ3MtPnRwYyk7CiAJCXBhbmljKCJJcnJlY292ZXJhYmxlIENoZWV0YWgrIHBhcml0eSBlcnJvci4iKTsKIAl9CiAKQEAgLTE3NDgsNiArMTc1Myw3IEBACiAJICAgICAgIHNtcF9wcm9jZXNzb3JfaWQoKSwKIAkgICAgICAgKHR5cGUgJiAweDEpID8gJ0knIDogJ0QnLAogCSAgICAgICByZWdzLT50cGMpOworCXByaW50X3N5bWJvbChLRVJOX1dBUk5JTkcgIlRQQzwlcz5cbiIsIHJlZ3MtPnRwYyk7CiB9CiAKIHN0cnVjdCBzdW40dl9lcnJvcl9lbnRyeSB7CkBAIC0xOTQ2LDYgKzE5NTIsNyBAQAogCiAJcHJpbnRrKEtFUk5fRU1FUkcgIlNVTjRWLUlUTEI6IEVycm9yIGF0IFRQQ1slbHhdLCB0bCAlZFxuIiwKIAkgICAgICAgcmVncy0+dHBjLCB0bCk7CisJcHJpbnRfc3ltYm9sKEtFUk5fRU1FUkcgIlNVTjRWLUlUTEI6IFRQQzwlcz5cbiIsIHJlZ3MtPnRwYyk7CiAJcHJpbnRrKEtFUk5fRU1FUkcgIlNVTjRWLUlUTEI6IHZhZGRyWyVseF0gY3R4WyVseF0gIgogCSAgICAgICAicHRlWyVseF0gZXJyb3JbJWx4XVxuIiwKIAkgICAgICAgc3VuNHZfZXJyX2l0bGJfdmFkZHIsIHN1bjR2X2Vycl9pdGxiX2N0eCwKQEAgLTE5NjYsNiArMTk3Myw3IEBACiAKIAlwcmludGsoS0VSTl9FTUVSRyAiU1VONFYtRFRMQjogRXJyb3IgYXQgVFBDWyVseF0sIHRsICVkXG4iLAogCSAgICAgICByZWdzLT50cGMsIHRsKTsKKwlwcmludF9zeW1ib2woS0VSTl9FTUVSRyAiU1VONFYtRFRMQjogVFBDPCVzPlxuIiwgcmVncy0+dHBjKTsKIAlwcmludGsoS0VSTl9FTUVSRyAiU1VONFYtRFRMQjogdmFkZHJbJWx4XSBjdHhbJWx4XSAiCiAJICAgICAgICJwdGVbJWx4XSBlcnJvclslbHhdXG4iLAogCSAgICAgICBzdW40dl9lcnJfZHRsYl92YWRkciwgc3VuNHZfZXJyX2R0bGJfY3R4LApkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYzY0L2tlcm5lbC92bWxpbnV4Lmxkcy5TIGIvYXJjaC9zcGFyYzY0L2tlcm5lbC92bWxpbnV4Lmxkcy5TCmluZGV4IGIwOTczNzkuLmJkOWRlOGMgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmM2NC9rZXJuZWwvdm1saW51eC5sZHMuUworKysgYi9hcmNoL3NwYXJjNjQva2VybmVsL3ZtbGludXgubGRzLlMKQEAgLTU3LDEzICs1Nyw3IEBACiAgIF9fc2V0dXBfZW5kID0gLjsKICAgX19pbml0Y2FsbF9zdGFydCA9IC47CiAgIC5pbml0Y2FsbC5pbml0IDogewotCSooLmluaXRjYWxsMS5pbml0KSAKLQkqKC5pbml0Y2FsbDIuaW5pdCkgCi0JKiguaW5pdGNhbGwzLmluaXQpIAotCSooLmluaXRjYWxsNC5pbml0KSAKLQkqKC5pbml0Y2FsbDUuaW5pdCkgCi0JKiguaW5pdGNhbGw2LmluaXQpIAotCSooLmluaXRjYWxsNy5pbml0KQorCUlOSVRDQUxMUwogICB9CiAgIF9faW5pdGNhbGxfZW5kID0gLjsKICAgX19jb25faW5pdGNhbGxfc3RhcnQgPSAuOwpkaWZmIC0tZ2l0IGEvYXJjaC91bS9LY29uZmlnIGIvYXJjaC91bS9LY29uZmlnCmluZGV4IGQ3NTMwNzUuLjVhYzFmMjkgMTAwNjQ0Ci0tLSBhL2FyY2gvdW0vS2NvbmZpZworKysgYi9hcmNoL3VtL0tjb25maWcKQEAgLTEsMyArMSw4IEBACitjb25maWcgREVGQ09ORklHX0xJU1QKKwlzdHJpbmcKKwlvcHRpb24gZGVmY29uZmlnX2xpc3QKKwlkZWZhdWx0ICJhcmNoLyRBUkNIL2RlZmNvbmZpZyIKKwogIyBVTUwgdXNlcyB0aGUgZ2VuZXJpYyBJUlEgc3Vnc3lzdGVtCiBjb25maWcgR0VORVJJQ19IQVJESVJRUwogCWJvb2wKQEAgLTI1LDYgKzMwLDE5IEBACiBjb25maWcgUENNQ0lBCiAJYm9vbAogCisjIFlldCB0byBkbyEKK2NvbmZpZyBUUkFDRV9JUlFGTEFHU19TVVBQT1JUCisJYm9vbAorCWRlZmF1bHQgbgorCitjb25maWcgTE9DS0RFUF9TVVBQT1JUCisJYm9vbAorCWRlZmF1bHQgeQorCitjb25maWcgU1RBQ0tUUkFDRV9TVVBQT1JUCisJYm9vbAorCWRlZmF1bHQgeQorCiBjb25maWcgR0VORVJJQ19DQUxJQlJBVEVfREVMQVkKIAlib29sCiAJZGVmYXVsdCB5CkBAIC0zNywxMyArNTUsMTYgQEAKIG1lbnUgIlVNTC1zcGVjaWZpYyBvcHRpb25zIgogCiBjb25maWcgTU9ERV9UVAotCWJvb2wgIlRyYWNpbmcgdGhyZWFkIHN1cHBvcnQiCisJYm9vbCAiVHJhY2luZyB0aHJlYWQgc3VwcG9ydCAoREVQUkVDQVRFRCkiCiAJZGVmYXVsdCBuCisJZGVwZW5kcyBvbiBCUk9LRU4KIAloZWxwCiAJVGhpcyBvcHRpb24gY29udHJvbHMgd2hldGhlciB0cmFjaW5nIHRocmVhZCBzdXBwb3J0IGlzIGNvbXBpbGVkCi0JaW50byBVTUwuICBUaGlzIG9wdGlvbiBpcyBsYXJnZWx5IG9ic29sZXRlLCBnaXZlbiB0aGF0IHNrYXMwIHByb3ZpZGVzCisJaW50byBVTUwuIFRoaXMgb3B0aW9uIGlzIGxhcmdlbHkgb2Jzb2xldGUsIGdpdmVuIHRoYXQgc2thczAgcHJvdmlkZXMKIAlza2FzIHNlY3VyaXR5IGFuZCBwZXJmb3JtYW5jZSB3aXRob3V0IG5lZWRpbmcgdG8gcGF0Y2ggdGhlIGhvc3QuCi0JSXQgaXMgc2FmZSB0byBzYXkgJ04nIGhlcmUuCisJSXQgaXMgc2FmZSB0byBzYXkgJ04nIGhlcmU7IHNheWluZyAnWScgbWF5IGNhdXNlIGFkZGl0aW9uYWwgcHJvYmxlbXMKKwl3aXRoIHRoZSByZXN1bHRpbmcgYmluYXJ5IGV2ZW4gaWYgeW91IHJ1biBVTUwgaW4gU0tBUyBtb2RlLCBhbmQgcnVubmluZworCWluIFRUIG1vZGUgaXMgc3Ryb25nbHkgKk5PVCBSRUNPTU1FTkRFRCouCiAKIGNvbmZpZyBTVEFUSUNfTElOSwogCWJvb2wgIkZvcmNlIGEgc3RhdGljIGxpbmsiCkBAIC01Niw2ICs3Nyw5IEBACiAJZm9yIHVzZSBpbiBhIGNocm9vdCBqYWlsLiAgU28sIGlmIHlvdSBpbnRlbmQgdG8gcnVuIFVNTCBpbnNpZGUgYQogCWNocm9vdCwgYW5kIHlvdSBkaXNhYmxlIENPTkZJR19NT0RFX1RULCB5b3UgcHJvYmFibHkgd2FudCB0byBzYXkgWQogCWhlcmUuCisJQWRkaXRpb25hbGx5LCB0aGlzIG9wdGlvbiBlbmFibGVzIHVzaW5nIGhpZ2hlciBtZW1vcnkgc3BhY2VzICh1cCB0bworCTIuNzVHKSBmb3IgVU1MIC0gZGlzYWJsaW5nIENPTkZJR19NT0RFX1RUIGFuZCBlbmFibGluZyB0aGlzIG9wdGlvbiBsZWFkcworCXRvIGJlc3QgcmVzdWx0cyBmb3IgdGhpcy4KIAogY29uZmlnIEtFUk5FTF9IQUxGX0dJR1MKIAlpbnQgIktlcm5lbCBhZGRyZXNzIHNwYWNlIHNpemUgKGluIC41RyB1bml0cykiCkBAIC03MiwxMCArOTYsMTMgQEAKIAlkZWZhdWx0IHkKIAloZWxwCiAJVGhpcyBvcHRpb24gY29udHJvbHMgd2hldGhlciBza2FzIChzZXBhcmF0ZSBrZXJuZWwgYWRkcmVzcyBzcGFjZSkKLQlzdXBwb3J0IGlzIGNvbXBpbGVkIGluLiAgSWYgeW91IGhhdmUgYXBwbGllZCB0aGUgc2thcyBwYXRjaCB0byB0aGUKLQlob3N0LCB0aGVuIHlvdSBjZXJ0YWlubHkgd2FudCB0byBzYXkgWSBoZXJlIChhbmQgY29uc2lkZXIgc2F5aW5nIE4KLQl0byBDT05GSUdfTU9ERV9UVCkuICBPdGhlcndpc2UsIGl0IGlzIHNhZmUgdG8gc2F5IFkuICBEaXNhYmxpbmcgdGhpcwotCW9wdGlvbiB3aWxsIHNocmluayB0aGUgVU1MIGJpbmFyeSBzbGlnaHRseS4KKwlzdXBwb3J0IGlzIGNvbXBpbGVkIGluLgorCVVubGVzcyB5b3UgaGF2ZSBzcGVjaWZpYyBuZWVkcyB0byB1c2UgVFQgbW9kZSAod2hpY2ggYXBwbGllcyBhbG1vc3Qgb25seQorCXRvIGRldmVsb3BlcnMpLCB5b3Ugc2hvdWxkIHNheSBZIGhlcmUuCisJU0tBUyBtb2RlIHdpbGwgbWFrZSB1c2Ugb2YgdGhlIFNLQVMzIHBhdGNoIGlmIGl0IGlzIGFwcGxpZWQgb24gdGhlIGhvc3QKKwkoYW5kIHlvdXIgVU1MIHdpbGwgcnVuIGluIFNLQVMzIG1vZGUpLCBidXQgaWYgbm8gU0tBUyBwYXRjaCBpcyBhcHBsaWVkCisJb24gdGhlIGhvc3QgaXQgd2lsbCBydW4gaW4gU0tBUzAgbW9kZSwgd2hpY2ggaXMgYW55d2F5IGZhc3RlciB0aGFuIFRUCisJbW9kZS4KIAogc291cmNlICJhcmNoL3VtL0tjb25maWcuYXJjaCIKIHNvdXJjZSAibW0vS2NvbmZpZyIKZGlmZiAtLWdpdCBhL2FyY2gvdW0vS2NvbmZpZy5jaGFyIGIvYXJjaC91bS9LY29uZmlnLmNoYXIKaW5kZXggNjJkODdiNy4uZTAzZTQwYyAxMDA2NDQKLS0tIGEvYXJjaC91bS9LY29uZmlnLmNoYXIKKysrIGIvYXJjaC91bS9LY29uZmlnLmNoYXIKQEAgLTE5MCw2ICsxOTAsMTEgQEAKIAl0cmlzdGF0ZQogCWRlZmF1bHQgVU1MX1NPVU5ECiAKKyNJdCBpcyBzZWxlY3RlZCBlbHNld2hlcmUsIHNvIGtjb25maWcgd291bGQgd2FybiB3aXRob3V0IHRoaXMuCitjb25maWcgSFdfUkFORE9NCisJdHJpc3RhdGUKKwlkZWZhdWx0IG4KKwogY29uZmlnIFVNTF9SQU5ET00KIAl0cmlzdGF0ZSAiSGFyZHdhcmUgcmFuZG9tIG51bWJlciBnZW5lcmF0b3IiCiAJaGVscApkaWZmIC0tZ2l0IGEvYXJjaC91bS9LY29uZmlnLmkzODYgYi9hcmNoL3VtL0tjb25maWcuaTM4NgppbmRleCBmNmViNzJkLi5mMTkxYTU1IDEwMDY0NAotLS0gYS9hcmNoL3VtL0tjb25maWcuaTM4NgorKysgYi9hcmNoL3VtL0tjb25maWcuaTM4NgpAQCAtMTYsMjMgKzE2LDQyIEBACiAJYm9vbAogCWRlZmF1bHQgeQogCi1jb25maWcgSE9TVF8yR18yRwotCWJvb2wgIjJHLzJHIGhvc3QgYWRkcmVzcyBzcGFjZSBzcGxpdCIKLQlkZWZhdWx0IG4KLQloZWxwCi0JVGhpcyBpcyBuZWVkZWQgd2hlbiB0aGUgaG9zdCBvbiB3aGljaCB5b3UgcnVuIGhhcyBhIDJHLzJHIG1lbW9yeQotCXNwbGl0LCBpbnN0ZWFkIG9mIHRoZSBjdXN0b21hcnkgM0cvMUcuCitjaG9pY2UKKwlwcm9tcHQgIkhvc3QgbWVtb3J5IHNwbGl0IgorCWRlZmF1bHQgSE9TVF9WTVNQTElUXzNHCisJLS0taGVscC0tLQorCSAgIFRoaXMgaXMgbmVlZGVkIHdoZW4gdGhlIGhvc3Qga2VybmVsIG9uIHdoaWNoIHlvdSBydW4gaGFzIGEgbm9uLWRlZmF1bHQKKwkgICAobGlrZSAyRy8yRykgbWVtb3J5IHNwbGl0LCBpbnN0ZWFkIG9mIHRoZSBjdXN0b21hcnkgM0cvMUcuIElmIHlvdSBkaWQKKwkgICBub3QgcmVjb21waWxlIHlvdXIgb3duIGtlcm5lbCBidXQgdXNlIHRoZSBkZWZhdWx0IGRpc3RybydzIG9uZSwgeW91IGNhbgorCSAgIHNhZmVseSBhY2NlcHQgdGhlICJEZWZhdWx0IHNwbGl0IiBvcHRpb24uCiAKLQlOb3RlIHRoYXQgdG8gZW5hYmxlIHN1Y2ggYSBob3N0Ci0JY29uZmlndXJhdGlvbiwgd2hpY2ggbWFrZXMgc2Vuc2Ugb25seSBpbiBzb21lIGNhc2VzLCB5b3UgbmVlZCBzcGVjaWFsCi0JaG9zdCBwYXRjaGVzLgorCSAgIEl0IGNhbiBiZSBlbmFibGVkIG9uIHJlY2VudCAoPj0yLjYuMTYtcmMyKSB2YW5pbGxhIGtlcm5lbHMgdmlhCisJICAgQ09ORklHX1ZNX1NQTElUXyosIG9yIG9uIHByZXZpb3VzIGtlcm5lbHMgd2l0aCBzcGVjaWFsIHBhdGNoZXMgKC1jaworCSAgIHBhdGNoc2V0IGJ5IENvbiBLb2xpdmFzLCBvciBvdGhlciBvbmVzKSAtIG9wdGlvbiBuYW1lcyBtYXRjaCBjbG9zZWx5IHRoZQorCSAgIGhvc3QgQ09ORklHX1ZNX1NQTElUXyogb25lcy4KIAotCVNvLCBpZiB5b3UgZG8gbm90IGtub3cgd2hhdCB0byBkbyBoZXJlLCBzYXkgJ04nLgorCSAgIEEgbG93ZXIgc2V0dGluZyAod2hlcmUgMUcvM0cgaXMgbG93ZXN0IGFuZCAzRy8xRyBpcyBoaWdoZXIpIHdpbGwKKwkgICB0b2xlcmF0ZSBldmVuIG1vcmUgIm5vcm1hbCIgaG9zdCBrZXJuZWxzLCBidXQgYW4gaGlnaGVyIHNldHRpbmcgd2lsbCBiZQorCSAgIHN0cmljdGVyLgorCisJICAgU28sIGlmIHlvdSBkbyBub3Qga25vdyB3aGF0IHRvIGRvIGhlcmUsIHNheSAnRGVmYXVsdCBzcGxpdCcuCisKKwljb25maWcgSE9TVF9WTVNQTElUXzNHCisJCWJvb2wgIkRlZmF1bHQgc3BsaXQgKDNHLzFHIHVzZXIva2VybmVsIGhvc3Qgc3BsaXQpIgorCWNvbmZpZyBIT1NUX1ZNU1BMSVRfM0dfT1BUCisJCWJvb2wgIjNHLzFHIHVzZXIva2VybmVsIGhvc3Qgc3BsaXQgKGZvciBmdWxsIDFHIGxvdyBtZW1vcnkpIgorCWNvbmZpZyBIT1NUX1ZNU1BMSVRfMkcKKwkJYm9vbCAiMkcvMkcgdXNlci9rZXJuZWwgaG9zdCBzcGxpdCIKKwljb25maWcgSE9TVF9WTVNQTElUXzFHCisJCWJvb2wgIjFHLzNHIHVzZXIva2VybmVsIGhvc3Qgc3BsaXQiCitlbmRjaG9pY2UKIAogY29uZmlnIFRPUF9BRERSCi0gCWhleAotIAlkZWZhdWx0IDB4YzAwMDAwMDAgaWYgIUhPU1RfMkdfMkcKLSAJZGVmYXVsdCAweDgwMDAwMDAwIGlmIEhPU1RfMkdfMkcKKwloZXgKKwlkZWZhdWx0IDB4QjAwMDAwMDAgaWYgSE9TVF9WTVNQTElUXzNHX09QVAorCWRlZmF1bHQgMHg3ODAwMDAwMCBpZiBIT1NUX1ZNU1BMSVRfMkcKKwlkZWZhdWx0IDB4NDAwMDAwMDAgaWYgSE9TVF9WTVNQTElUXzFHCisJZGVmYXVsdCAweEMwMDAwMDAwCiAKIGNvbmZpZyAzX0xFVkVMX1BHVEFCTEVTCiAJYm9vbCAiVGhyZWUtbGV2ZWwgcGFnZXRhYmxlcyAoRVhQRVJJTUVOVEFMKSIKZGlmZiAtLWdpdCBhL2FyY2gvdW0vTWFrZWZpbGUgYi9hcmNoL3VtL01ha2VmaWxlCmluZGV4IGM4MDE2YTkuLjVkNWVkNzIgMTAwNjQ0Ci0tLSBhL2FyY2gvdW0vTWFrZWZpbGUKKysrIGIvYXJjaC91bS9NYWtlZmlsZQpAQCAtNjQsOSArNjQsMTQgQEAKIAogQUZMQUdTICs9ICQoQVJDSF9JTkNMVURFKQogCi1VU0VSX0NGTEFHUyA6PSAkKHBhdHN1YnN0IC1JJSwsJChDRkxBR1MpKQotVVNFUl9DRkxBR1MgOj0gJChwYXRzdWJzdCAtRF9fS0VSTkVMX18sLCQoVVNFUl9DRkxBR1MpKSAkKEFSQ0hfSU5DTFVERSkgXAotCSQoTU9ERV9JTkNMVURFKSAtRF9GSUxFX09GRlNFVF9CSVRTPTY0CitVU0VSX0NGTEFHUyA9ICQocGF0c3Vic3QgJChLRVJORUxfREVGSU5FUyksLCQocGF0c3Vic3QgLURfX0tFUk5FTF9fLCxcCisJJChwYXRzdWJzdCAtSSUsLCQoQ0ZMQUdTKSkpKSAkKEFSQ0hfSU5DTFVERSkgJChNT0RFX0lOQ0xVREUpIFwKKwktRF9GSUxFX09GRlNFVF9CSVRTPTY0CisKK2luY2x1ZGUgJChzcmN0cmVlKS8kKEFSQ0hfRElSKS9NYWtlZmlsZS0kKFNVQkFSQ0gpCisKKyNUaGlzIHdpbGwgYWRqdXN0ICpGTEFHUyBhY2NvcmRpbmdseSB0byB0aGUgcGxhdGZvcm0uCitpbmNsdWRlICQoc3JjdHJlZSkvJChBUkNIX0RJUikvTWFrZWZpbGUtb3MtJChPUykKIAogIyAtRGVycm5vPWtlcm5lbF9lcnJubyAtIFRoaXMgdHVybnMgYWxsIGtlcm5lbCByZWZlcmVuY2VzIHRvIGVycm5vIGludG8KICMga2VybmVsX2Vycm5vIHRvIHNlcGFyYXRlIHRoZW0gZnJvbSB0aGUgbGliYyBlcnJuby4gIFRoaXMgYWxsb3dzIC1mbm8tY29tbW9uCkBAIC03NCwxNSArNzksMTEgQEAKICMgZXJybm9zLgogIyBUaGVzZSBhcHBseSB0byBrZXJuZWxzcGFjZSBvbmx5LgogCi1DRkxBR1MgKz0gLURlcnJubz1rZXJuZWxfZXJybm8gLURzaWdwcm9jbWFzaz1rZXJuZWxfc2lncHJvY21hc2sgXAotCS1EbWt0aW1lPWtlcm5lbF9ta3RpbWUKK0tFUk5FTF9ERUZJTkVTID0gLURlcnJubz1rZXJuZWxfZXJybm8gLURzaWdwcm9jbWFzaz1rZXJuZWxfc2lncHJvY21hc2sgXAorCS1EbWt0aW1lPWtlcm5lbF9ta3RpbWUgJChBUkNIX0tFUk5FTF9ERUZJTkVTKQorQ0ZMQUdTICs9ICQoS0VSTkVMX0RFRklORVMpCiBDRkxBR1MgKz0gJChjYWxsIGNjLW9wdGlvbiwtZm5vLXVuaXQtYXQtYS10aW1lLCkKIAotaW5jbHVkZSAkKHNyY3RyZWUpLyQoQVJDSF9ESVIpL01ha2VmaWxlLSQoU1VCQVJDSCkKLQotI1RoaXMgd2lsbCBhZGp1c3QgKkZMQUdTIGFjY29yZGluZ2x5IHRvIHRoZSBwbGF0Zm9ybS4KLWluY2x1ZGUgJChzcmN0cmVlKS8kKEFSQ0hfRElSKS9NYWtlZmlsZS1vcy0kKE9TKQotCiAjIFRoZXNlIGFyZSBuZWVkZWQgZm9yIGNsZWFuIGFuZCBtcnByb3Blciwgc2luY2UgaW4gdGhhdCBjYXNlIC5jb25maWcgaXMgbm90CiAjIGluY2x1ZGVkOyB0aGUgdmFsdWVzIGhlcmUgYXJlIG1lYW5pbmdsZXNzCiAKZGlmZiAtLWdpdCBhL2FyY2gvdW0vTWFrZWZpbGUtaTM4NiBiL2FyY2gvdW0vTWFrZWZpbGUtaTM4NgppbmRleCBiNjVjYTExLi5jOWYxYzViIDEwMDY0NAotLS0gYS9hcmNoL3VtL01ha2VmaWxlLWkzODYKKysrIGIvYXJjaC91bS9NYWtlZmlsZS1pMzg2CkBAIC0xNiw3ICsxNiw2IEBACiBpZmVxICgiJChvcmlnaW4gU1VCQVJDSCkiLCAiY29tbWFuZCBsaW5lIikKIGlmbmVxICgiJChzaGVsbCB1bmFtZSAtbSB8IHNlZCAtZSBzL2kuODYvaTM4Ni8pIiwgIiQoU1VCQVJDSCkiKQogQ0ZMQUdTCQkJKz0gJChjYWxsIGNjLW9wdGlvbiwtbTMyKQotVVNFUl9DRkxBR1MJCSs9ICQoY2FsbCBjYy1vcHRpb24sLW0zMikKIEFGTEFHUwkJCSs9ICQoY2FsbCBjYy1vcHRpb24sLW0zMikKIExJTksteQkJCSs9ICQoY2FsbCBjYy1vcHRpb24sLW0zMikKIFVNTF9PQkpDT1BZRkxBR1MJKz0gLUYgJChFTEZfRk9STUFUKQpAQCAtMjUsNyArMjQsNyBAQAogZW5kaWYKIGVuZGlmCiAKLUNGTEFHUyArPSAtVV9fJChTVUJBUkNIKV9fIC1VJChTVUJBUkNIKQorQVJDSF9LRVJORUxfREVGSU5FUyArPSAtVV9fJChTVUJBUkNIKV9fIC1VJChTVUJBUkNIKQogCiAjIEZpcnN0IG9mIGFsbCwgdHVuZSBDRkxBR1MgZm9yIHRoZSBzcGVjaWZpYyBDUFUuIFRoaXMgYWN0dWFsbHkgc2V0cyBjZmxhZ3MteS4KIGluY2x1ZGUgJChzcmN0cmVlKS9hcmNoL2kzODYvTWFrZWZpbGUuY3B1CkBAIC0zOCw0ICszNywzIEBACiBjZmxhZ3MteSArPSAtZmZyZWVzdGFuZGluZwogCiBDRkxBR1MgKz0gJChjZmxhZ3MteSkKLVVTRVJfQ0ZMQUdTICs9ICQoY2ZsYWdzLXkpCmRpZmYgLS1naXQgYS9hcmNoL3VtL01ha2VmaWxlLXg4Nl82NCBiL2FyY2gvdW0vTWFrZWZpbGUteDg2XzY0CmluZGV4IDExMTU0YjYuLjY5ZWNlYTYgMTAwNjQ0Ci0tLSBhL2FyY2gvdW0vTWFrZWZpbGUteDg2XzY0CisrKyBiL2FyY2gvdW0vTWFrZWZpbGUteDg2XzY0CkBAIC0xLDE1ICsxLDE1IEBACiAjIENvcHlyaWdodCAyMDAzIC0gMjAwNCBQYXRoc2NhbGUsIEluYwogIyBSZWxlYXNlZCB1bmRlciB0aGUgR1BMCiAKLWNvcmUteSArPSBhcmNoL3VtL3N5cy14ODZfNjQvCitjb3JlLXkgKz0gYXJjaC91bS9zeXMteDg2XzY0LyBhcmNoL3g4Nl82NC9jcnlwdG8vCiBTVEFSVCA6PSAweDYwMDAwMDAwCiAKLV9leHRyYV9mbGFnc18gPSAtZm5vLWJ1aWx0aW4gLW02NCAtbWNtb2RlbD1rZXJuZWwKK19leHRyYV9mbGFnc18gPSAtZm5vLWJ1aWx0aW4gLW02NAogCiAjV2UgI3VuZGVmIF9feDg2XzY0X18gZm9yIGtlcm5lbHNwYWNlLCBub3QgZm9yIHVzZXJzcGFjZSB3aGVyZQogI2l0J3MgbmVlZGVkIGZvciBoZWFkZXJzIHRvIHdvcmshCi1DRkxBR1MgKz0gLVVfXyQoU1VCQVJDSClfXyAkKF9leHRyYV9mbGFnc18pCi1VU0VSX0NGTEFHUyArPSAkKF9leHRyYV9mbGFnc18pCitBUkNIX0tFUk5FTF9ERUZJTkVTID0gLVVfXyQoU1VCQVJDSClfXworQ0ZMQUdTICs9ICQoX2V4dHJhX2ZsYWdzXykKIAogQ0hFQ0tGTEFHUyAgKz0gLW02NAogQUZMQUdTICs9IC1tNjQKZGlmZiAtLWdpdCBhL2FyY2gvdW0vZHJpdmVycy9jb3dfc3lzLmggYi9hcmNoL3VtL2RyaXZlcnMvY293X3N5cy5oCmluZGV4IDdhNWI0YWYuLmM2YTMwODQgMTAwNjQ0Ci0tLSBhL2FyY2gvdW0vZHJpdmVycy9jb3dfc3lzLmgKKysrIGIvYXJjaC91bS9kcml2ZXJzL2Nvd19zeXMuaApAQCAtNSw2ICs1LDcgQEAKICNpbmNsdWRlICJ1c2VyX3V0aWwuaCIKICNpbmNsdWRlICJvcy5oIgogI2luY2x1ZGUgInVzZXIuaCIKKyNpbmNsdWRlICJ1bV9tYWxsb2MuaCIKIAogc3RhdGljIGlubGluZSB2b2lkICpjb3dfbWFsbG9jKGludCBzaXplKQogewpkaWZmIC0tZ2l0IGEvYXJjaC91bS9kcml2ZXJzL2RhZW1vbl91c2VyLmMgYi9hcmNoL3VtL2RyaXZlcnMvZGFlbW9uX3VzZXIuYwppbmRleCA3Nzk1NGVhLi4zMTBhZjBmIDEwMDY0NAotLS0gYS9hcmNoL3VtL2RyaXZlcnMvZGFlbW9uX3VzZXIuYworKysgYi9hcmNoL3VtL2RyaXZlcnMvZGFlbW9uX3VzZXIuYwpAQCAtMTcsNiArMTcsNyBAQAogI2luY2x1ZGUgInVzZXJfdXRpbC5oIgogI2luY2x1ZGUgInVzZXIuaCIKICNpbmNsdWRlICJvcy5oIgorI2luY2x1ZGUgInVtX21hbGxvYy5oIgogCiAjZGVmaW5lIE1BWF9QQUNLRVQgKEVUSF9NQVhfUEFDS0VUICsgRVRIX0hFQURFUl9PVEhFUikKIApkaWZmIC0tZ2l0IGEvYXJjaC91bS9kcml2ZXJzL2ZkLmMgYi9hcmNoL3VtL2RyaXZlcnMvZmQuYwppbmRleCAxMDhiN2RhLi4yMThhYTBlIDEwMDY0NAotLS0gYS9hcmNoL3VtL2RyaXZlcnMvZmQuYworKysgYi9hcmNoL3VtL2RyaXZlcnMvZmQuYwpAQCAtMTIsNiArMTIsNyBAQAogI2luY2x1ZGUgInVzZXJfdXRpbC5oIgogI2luY2x1ZGUgImNoYW5fdXNlci5oIgogI2luY2x1ZGUgIm9zLmgiCisjaW5jbHVkZSAidW1fbWFsbG9jLmgiCiAKIHN0cnVjdCBmZF9jaGFuIHsKIAlpbnQgZmQ7CmRpZmYgLS1naXQgYS9hcmNoL3VtL2RyaXZlcnMvbWNhc3RfdXNlci5jIGIvYXJjaC91bS9kcml2ZXJzL21jYXN0X3VzZXIuYwppbmRleCA0ZDJiZDM5Li44MTM4ZjVlIDEwMDY0NAotLS0gYS9hcmNoL3VtL2RyaXZlcnMvbWNhc3RfdXNlci5jCisrKyBiL2FyY2gvdW0vZHJpdmVycy9tY2FzdF91c2VyLmMKQEAgLTIzLDYgKzIzLDcgQEAKICNpbmNsdWRlICJ1c2VyX3V0aWwuaCIKICNpbmNsdWRlICJ1c2VyLmgiCiAjaW5jbHVkZSAib3MuaCIKKyNpbmNsdWRlICJ1bV9tYWxsb2MuaCIKIAogI2RlZmluZSBNQVhfUEFDS0VUIChFVEhfTUFYX1BBQ0tFVCArIEVUSF9IRUFERVJfT1RIRVIpCiAKZGlmZiAtLWdpdCBhL2FyY2gvdW0vZHJpdmVycy9tY29uc29sZV9rZXJuLmMgYi9hcmNoL3VtL2RyaXZlcnMvbWNvbnNvbGVfa2Vybi5jCmluZGV4IGQwOGJkMDMuLjdiMTcyMTYgMTAwNjQ0Ci0tLSBhL2FyY2gvdW0vZHJpdmVycy9tY29uc29sZV9rZXJuLmMKKysrIGIvYXJjaC91bS9kcml2ZXJzL21jb25zb2xlX2tlcm4uYwpAQCAtNzksNyArNzksNyBAQAogCS8qIGxvbmcgdG8gYXZvaWQgc2l6ZSBtaXNtYXRjaCB3YXJuaW5ncyBmcm9tIGdjYyAqLwogCWxvbmcgZmQ7CiAJc3RydWN0IG1jb25zb2xlX2VudHJ5ICpuZXc7Ci0Jc3RydWN0IG1jX3JlcXVlc3QgcmVxOworCXN0YXRpYyBzdHJ1Y3QgbWNfcmVxdWVzdCByZXE7CS8qIHRoYXQncyBPSyAqLwogCiAJZmQgPSAobG9uZykgZGV2X2lkOwogCXdoaWxlIChtY29uc29sZV9nZXRfcmVxdWVzdChmZCwgJnJlcSkpewpAQCAtOTEsNiArOTEsNyBAQAogCQkJCW1jb25zb2xlX3JlcGx5KCZyZXEsICJPdXQgb2YgbWVtb3J5IiwgMSwgMCk7CiAJCQllbHNlIHsKIAkJCQluZXctPnJlcXVlc3QgPSByZXE7CisJCQkJbmV3LT5yZXF1ZXN0LnJlZ3MgPSBnZXRfaXJxX3JlZ3MoKS0+cmVnczsKIAkJCQlsaXN0X2FkZCgmbmV3LT5saXN0LCAmbWNfcmVxdWVzdHMpOwogCQkJfQogCQl9CkBAIC0zMTQsOSArMzE1LDIxIEBACiB7CiAJZGVhY3RpdmF0ZV9mZChyZXEtPm9yaWdpbmF0aW5nX2ZkLCBNQ09OU09MRV9JUlEpOwogCW9zX3NldF9mZF9ibG9jayhyZXEtPm9yaWdpbmF0aW5nX2ZkLCAxKTsKLQltY29uc29sZV9yZXBseShyZXEsICIiLCAwLCAwKTsKLQl3aGlsZShtY29uc29sZV9nZXRfcmVxdWVzdChyZXEtPm9yaWdpbmF0aW5nX2ZkLCByZXEpKXsKLQkJaWYocmVxLT5jbWQtPmhhbmRsZXIgPT0gbWNvbnNvbGVfZ28pIGJyZWFrOworCW1jb25zb2xlX3JlcGx5KHJlcSwgInN0b3BwZWQiLCAwLCAwKTsKKwl3aGlsZSAobWNvbnNvbGVfZ2V0X3JlcXVlc3QocmVxLT5vcmlnaW5hdGluZ19mZCwgcmVxKSkgeworCQlpZiAocmVxLT5jbWQtPmhhbmRsZXIgPT0gbWNvbnNvbGVfZ28pCisJCQlicmVhazsKKwkJaWYgKHJlcS0+Y21kLT5oYW5kbGVyID09IG1jb25zb2xlX3N0b3ApIHsKKwkJCW1jb25zb2xlX3JlcGx5KHJlcSwgIkFscmVhZHkgc3RvcHBlZCIsIDEsIDApOworCQkJY29udGludWU7CisJCX0KKwkJaWYgKHJlcS0+Y21kLT5oYW5kbGVyID09IG1jb25zb2xlX3N5c3JxKSB7CisJCQlzdHJ1Y3QgcHRfcmVncyAqb2xkX3JlZ3M7CisJCQlvbGRfcmVncyA9IHNldF9pcnFfcmVncygoc3RydWN0IHB0X3JlZ3MgKikmcmVxLT5yZWdzKTsKKwkJCW1jb25zb2xlX3N5c3JxKHJlcSk7CisJCQlzZXRfaXJxX3JlZ3Mob2xkX3JlZ3MpOworCQkJY29udGludWU7CisJCX0KIAkJKCpyZXEtPmNtZC0+aGFuZGxlcikocmVxKTsKIAl9CiAJb3Nfc2V0X2ZkX2Jsb2NrKHJlcS0+b3JpZ2luYXRpbmdfZmQsIDApOwpAQCAtNjczLDkgKzY4Niw3IEBACiBzdGF0aWMgdm9pZCBzeXNycV9wcm9jKHZvaWQgKmFyZykKIHsKIAljaGFyICpvcCA9IGFyZzsKLQlzdHJ1Y3QgcHRfcmVncyAqb2xkX3JlZ3MgPSBzZXRfaXJxX3JlZ3MoJmN1cnJlbnQtPnRocmVhZC5yZWdzKTsKIAloYW5kbGVfc3lzcnEoKm9wLCBOVUxMKTsKLQlzZXRfaXJxX3JlZ3Mob2xkX3JlZ3MpOwogfQogCiB2b2lkIG1jb25zb2xlX3N5c3JxKHN0cnVjdCBtY19yZXF1ZXN0ICpyZXEpCmRpZmYgLS1naXQgYS9hcmNoL3VtL2RyaXZlcnMvbWNvbnNvbGVfdXNlci5jIGIvYXJjaC91bS9kcml2ZXJzL21jb25zb2xlX3VzZXIuYwppbmRleCAxNzA2OGViLi43NWFlZjZmIDEwMDY0NAotLS0gYS9hcmNoL3VtL2RyaXZlcnMvbWNvbnNvbGVfdXNlci5jCisrKyBiL2FyY2gvdW0vZHJpdmVycy9tY29uc29sZV91c2VyLmMKQEAgLTE0LDYgKzE0LDcgQEAKICNpbmNsdWRlIDxzeXMvdW4uaD4KICNpbmNsdWRlIDx1bmlzdGQuaD4KICNpbmNsdWRlICJ1c2VyLmgiCisjaW5jbHVkZSAic3lzZGVwL3B0cmFjZS5oIgogI2luY2x1ZGUgIm1jb25zb2xlLmgiCiAjaW5jbHVkZSAidW1pZC5oIgogI2luY2x1ZGUgInVzZXJfdXRpbC5oIgpkaWZmIC0tZ2l0IGEvYXJjaC91bS9kcml2ZXJzL21tYXBwZXJfa2Vybi5jIGIvYXJjaC91bS9kcml2ZXJzL21tYXBwZXJfa2Vybi5jCmluZGV4IDlhM2I1ZGEuLmRmMzUxNmUgMTAwNjQ0Ci0tLSBhL2FyY2gvdW0vZHJpdmVycy9tbWFwcGVyX2tlcm4uYworKysgYi9hcmNoL3VtL2RyaXZlcnMvbW1hcHBlcl9rZXJuLmMKQEAgLTk1LDcgKzk1LDggQEAKIAkucmVsZWFzZQk9IG1tYXBwZXJfcmVsZWFzZSwKIH07CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3QgbWlzY2RldmljZSBtbWFwcGVyX2RldiA9IHsKKy8qIE5vIGxvY2tpbmcgbmVlZGVkIC0gb25seSB1c2VkIChhbmQgbW9kaWZpZWQpIGJ5IGJlbG93IGluaXRjYWxsIGFuZCBleGl0Y2FsbC4gKi8KK3N0YXRpYyBzdHJ1Y3QgbWlzY2RldmljZSBtbWFwcGVyX2RldiA9IHsKIAkubWlub3IJCT0gTUlTQ19EWU5BTUlDX01JTk9SLAogCS5uYW1lCQk9ICJtbWFwcGVyIiwKIAkuZm9wcwkJPSAmbW1hcHBlcl9mb3BzCmRpZmYgLS1naXQgYS9hcmNoL3VtL2RyaXZlcnMvbmV0X3VzZXIuYyBiL2FyY2gvdW0vZHJpdmVycy9uZXRfdXNlci5jCmluZGV4IGYzYTNmOGEuLjBmZmQ3YWMgMTAwNjQ0Ci0tLSBhL2FyY2gvdW0vZHJpdmVycy9uZXRfdXNlci5jCisrKyBiL2FyY2gvdW0vZHJpdmVycy9uZXRfdXNlci5jCkBAIC0xOCw2ICsxOCw3IEBACiAjaW5jbHVkZSAia2Vybl91dGlsLmgiCiAjaW5jbHVkZSAibmV0X3VzZXIuaCIKICNpbmNsdWRlICJvcy5oIgorI2luY2x1ZGUgInVtX21hbGxvYy5oIgogCiBpbnQgdGFwX29wZW5fY29tbW9uKHZvaWQgKmRldiwgY2hhciAqZ2F0ZV9hZGRyKQogewpkaWZmIC0tZ2l0IGEvYXJjaC91bS9kcml2ZXJzL3BjYXBfdXNlci5jIGIvYXJjaC91bS9kcml2ZXJzL3BjYXBfdXNlci5jCmluZGV4IDJlZjY0MWQuLjExOTIxYTcgMTAwNjQ0Ci0tLSBhL2FyY2gvdW0vZHJpdmVycy9wY2FwX3VzZXIuYworKysgYi9hcmNoL3VtL2RyaXZlcnMvcGNhcF91c2VyLmMKQEAgLTEyLDYgKzEyLDcgQEAKICNpbmNsdWRlICJuZXRfdXNlci5oIgogI2luY2x1ZGUgInBjYXBfdXNlci5oIgogI2luY2x1ZGUgInVzZXIuaCIKKyNpbmNsdWRlICJ1bV9tYWxsb2MuaCIKIAogI2RlZmluZSBNQVhfUEFDS0VUIChFVEhfTUFYX1BBQ0tFVCArIEVUSF9IRUFERVJfT1RIRVIpCiAKZGlmZiAtLWdpdCBhL2FyY2gvdW0vZHJpdmVycy9wb3J0X3VzZXIuYyBiL2FyY2gvdW0vZHJpdmVycy9wb3J0X3VzZXIuYwppbmRleCBmMmU4ZmM0Li5iYzZhZmFmIDEwMDY0NAotLS0gYS9hcmNoL3VtL2RyaXZlcnMvcG9ydF91c2VyLmMKKysrIGIvYXJjaC91bS9kcml2ZXJzL3BvcnRfdXNlci5jCkBAIC0xOSw2ICsxOSw3IEBACiAjaW5jbHVkZSAiY2hhbl91c2VyLmgiCiAjaW5jbHVkZSAicG9ydC5oIgogI2luY2x1ZGUgIm9zLmgiCisjaW5jbHVkZSAidW1fbWFsbG9jLmgiCiAKIHN0cnVjdCBwb3J0X2NoYW4gewogCWludCByYXc7CmRpZmYgLS1naXQgYS9hcmNoL3VtL2RyaXZlcnMvcHR5LmMgYi9hcmNoL3VtL2RyaXZlcnMvcHR5LmMKaW5kZXggYWJlYzYyMC4uODI5YTVlYyAxMDA2NDQKLS0tIGEvYXJjaC91bS9kcml2ZXJzL3B0eS5jCisrKyBiL2FyY2gvdW0vZHJpdmVycy9wdHkuYwpAQCAtMTMsNiArMTMsNyBAQAogI2luY2x1ZGUgInVzZXJfdXRpbC5oIgogI2luY2x1ZGUgImtlcm5fdXRpbC5oIgogI2luY2x1ZGUgIm9zLmgiCisjaW5jbHVkZSAidW1fbWFsbG9jLmgiCiAKIHN0cnVjdCBwdHlfY2hhbiB7CiAJdm9pZCAoKmFubm91bmNlKShjaGFyICpkZXZfbmFtZSwgaW50IGRldik7CmRpZmYgLS1naXQgYS9hcmNoL3VtL2RyaXZlcnMvc2xpcF91c2VyLmMgYi9hcmNoL3VtL2RyaXZlcnMvc2xpcF91c2VyLmMKaW5kZXggODQ2MDI4NS4uN2VkZGFjYyAxMDA2NDQKLS0tIGEvYXJjaC91bS9kcml2ZXJzL3NsaXBfdXNlci5jCisrKyBiL2FyY2gvdW0vZHJpdmVycy9zbGlwX3VzZXIuYwpAQCAtMTUsNiArMTUsNyBAQAogI2luY2x1ZGUgInNsaXAuaCIKICNpbmNsdWRlICJzbGlwX2NvbW1vbi5oIgogI2luY2x1ZGUgIm9zLmgiCisjaW5jbHVkZSAidW1fbWFsbG9jLmgiCiAKIHZvaWQgc2xpcF91c2VyX2luaXQodm9pZCAqZGF0YSwgdm9pZCAqZGV2KQogewpkaWZmIC0tZ2l0IGEvYXJjaC91bS9kcml2ZXJzL3R0eS5jIGIvYXJjaC91bS9kcml2ZXJzL3R0eS5jCmluZGV4IDExZGUzYWMuLmQ5NWQ2NDMgMTAwNjQ0Ci0tLSBhL2FyY2gvdW0vZHJpdmVycy90dHkuYworKysgYi9hcmNoL3VtL2RyaXZlcnMvdHR5LmMKQEAgLTExLDYgKzExLDcgQEAKICNpbmNsdWRlICJ1c2VyX3V0aWwuaCIKICNpbmNsdWRlICJ1c2VyLmgiCiAjaW5jbHVkZSAib3MuaCIKKyNpbmNsdWRlICJ1bV9tYWxsb2MuaCIKIAogc3RydWN0IHR0eV9jaGFuIHsKIAljaGFyICpkZXY7CmRpZmYgLS1naXQgYS9hcmNoL3VtL2RyaXZlcnMvdWJkX2tlcm4uYyBiL2FyY2gvdW0vZHJpdmVycy91YmRfa2Vybi5jCmluZGV4IGJjNDU4ZjUuLjQ5YzA0N2IgMTAwNjQ0Ci0tLSBhL2FyY2gvdW0vZHJpdmVycy91YmRfa2Vybi5jCisrKyBiL2FyY2gvdW0vZHJpdmVycy91YmRfa2Vybi5jCkBAIC0xMDYsMTAgKzEwNiwxNSBAQAogCiAjZGVmaW5lIERSSVZFUl9OQU1FICJ1bWwtYmxrZGV2IgogCisvKiBDYW4gYmUgdGFrZW4gaW4gaW50ZXJydXB0IGNvbnRleHQsIGFuZCBpcyBwYXNzZWQgdG8gdGhlIGJsb2NrIGxheWVyIHRvIGxvY2sKKyAqIHRoZSByZXF1ZXN0IHF1ZXVlLiBLZXJuZWwgc2lkZSBjb2RlIGtub3dzIHRoYXQuICovCiBzdGF0aWMgREVGSU5FX1NQSU5MT0NLKHViZF9pb19sb2NrKTsKLXN0YXRpYyBERUZJTkVfU1BJTkxPQ0sodWJkX2xvY2spOwogCi1zdGF0aWMgdm9pZCAoKmRvX3ViZCkodm9pZCk7CitzdGF0aWMgREVGSU5FX01VVEVYKHViZF9sb2NrKTsKKworLyogWFhYIC0gdGhpcyBtYWRlIHNlbnNlIGluIDIuNCBkYXlzLCBub3cgaXQncyBvbmx5IHVzZWQgYXMgYSBib29sZWFuLCBhbmQKKyAqIHByb2JhYmx5IGl0IGRvZXNuJ3QgbWFrZSBzZW5zZSBldmVuIGZvciB0aGF0LiAqLworc3RhdGljIGludCBkb191YmQ7CiAKIHN0YXRpYyBpbnQgdWJkX29wZW4oc3RydWN0IGlub2RlICogaW5vZGUsIHN0cnVjdCBmaWxlICogZmlscCk7CiBzdGF0aWMgaW50IHViZF9yZWxlYXNlKHN0cnVjdCBpbm9kZSAqIGlub2RlLCBzdHJ1Y3QgZmlsZSAqIGZpbGUpOwpAQCAtMTE3LDcgKzEyMiw3IEBACiAJCSAgICAgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpOwogc3RhdGljIGludCB1YmRfZ2V0Z2VvKHN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXYsIHN0cnVjdCBoZF9nZW9tZXRyeSAqZ2VvKTsKIAotI2RlZmluZSBNQVhfREVWICg4KQorI2RlZmluZSBNQVhfREVWICgxNikKIAogc3RhdGljIHN0cnVjdCBibG9ja19kZXZpY2Vfb3BlcmF0aW9ucyB1YmRfYmxvcHMgPSB7CiAgICAgICAgIC5vd25lcgkJPSBUSElTX01PRFVMRSwKQEAgLTE1MCw4ICsxNTUsOSBAQAogc3RhdGljIHN0cnVjdCBvcGVuZmxhZ3MgZ2xvYmFsX29wZW5mbGFncyA9IE9QRU5fRkxBR1M7CiAKIHN0cnVjdCBjb3cgewotCS8qIFRoaXMgaXMgdGhlIGJhY2tpbmcgZmlsZSwgYWN0dWFsbHkgKi8KKwkvKiBiYWNraW5nIGZpbGUgbmFtZSAqLwogCWNoYXIgKmZpbGU7CisJLyogYmFja2luZyBmaWxlIGZkICovCiAJaW50IGZkOwogCXVuc2lnbmVkIGxvbmcgKmJpdG1hcDsKIAl1bnNpZ25lZCBsb25nIGJpdG1hcF9sZW47CkBAIC0xNjAsMTQgKzE2NiwxNiBAQAogfTsKIAogc3RydWN0IHViZCB7CisJLyogbmFtZSAoYW5kIGZkLCBiZWxvdykgb2YgdGhlIGZpbGUgb3BlbmVkIGZvciB3cml0aW5nLCBlaXRoZXIgdGhlCisJICogYmFja2luZyBvciB0aGUgY293IGZpbGUuICovCiAJY2hhciAqZmlsZTsKIAlpbnQgY291bnQ7CiAJaW50IGZkOwogCV9fdTY0IHNpemU7CiAJc3RydWN0IG9wZW5mbGFncyBib290X29wZW5mbGFnczsKIAlzdHJ1Y3Qgb3BlbmZsYWdzIG9wZW5mbGFnczsKLQlpbnQgc2hhcmVkOwotCWludCBub19jb3c7CisJdW5zaWduZWQgc2hhcmVkOjE7CisJdW5zaWduZWQgbm9fY293OjE7CiAJc3RydWN0IGNvdyBjb3c7CiAJc3RydWN0IHBsYXRmb3JtX2RldmljZSBwZGV2OwogfTsKQEAgLTE5MiwxOCArMjAwLDcgQEAKICAgICAgICAgLmNvdyA9CQkJREVGQVVMVF9DT1csIFwKIH0KIAotc3RydWN0IHViZCB1YmRfZGV2W01BWF9ERVZdID0geyBbIDAgLi4uIE1BWF9ERVYgLSAxIF0gPSBERUZBVUxUX1VCRCB9OwotCi1zdGF0aWMgaW50IHViZDBfaW5pdCh2b2lkKQotewotCXN0cnVjdCB1YmQgKmRldiA9ICZ1YmRfZGV2WzBdOwotCi0JaWYoZGV2LT5maWxlID09IE5VTEwpCi0JCWRldi0+ZmlsZSA9ICJyb290X2ZzIjsKLQlyZXR1cm4oMCk7Ci19Ci0KLV9faW5pdGNhbGwodWJkMF9pbml0KTsKK3N0cnVjdCB1YmQgdWJkX2RldnNbTUFYX0RFVl0gPSB7IFsgMCAuLi4gTUFYX0RFViAtIDEgXSA9IERFRkFVTFRfVUJEIH07CiAKIC8qIE9ubHkgY2hhbmdlZCBieSBmYWtlX2lkZV9zZXR1cCB3aGljaCBpcyBhIHNldHVwICovCiBzdGF0aWMgaW50IGZha2VfaWRlID0gMDsKQEAgLTI3Nyw3ICsyNzQsNyBAQAogCQkJcmV0dXJuKC0xKTsKIAkJKnB0ciA9IGVuZDsKIAl9Ci0JZWxzZSBpZiAoKCdhJyA8PSAqc3RyKSAmJiAoKnN0ciA8PSAnaCcpKSB7CisJZWxzZSBpZiAoKCdhJyA8PSAqc3RyKSAmJiAoKnN0ciA8PSAneicpKSB7CiAJCW4gPSAqc3RyIC0gJ2EnOwogCQlzdHIrKzsKIAkJKnB0ciA9IHN0cjsKQEAgLTI4NSw5ICsyODIsMTMgQEAKIAlyZXR1cm4obik7CiB9CiAKKy8qIElmICppbmRleF9vdXQgPT0gLTEgYXQgZXhpdCwgdGhlIHBhc3NlZCBvcHRpb24gd2FzIGEgZ2VuZXJhbCBvbmU7CisgKiBvdGhlcndpc2UsIHRoZSBzdHIgcG9pbnRlciBpcyB1c2VkIChhbmQgb3duZWQpIGluc2lkZSB1YmRfZGV2cyBhcnJheSwgc28gaXQKKyAqIHNob3VsZCBub3QgYmUgZnJlZWQgb24gZXhpdC4KKyAqLwogc3RhdGljIGludCB1YmRfc2V0dXBfY29tbW9uKGNoYXIgKnN0ciwgaW50ICppbmRleF9vdXQpCiB7Ci0Jc3RydWN0IHViZCAqZGV2OworCXN0cnVjdCB1YmQgKnViZF9kZXY7CiAJc3RydWN0IG9wZW5mbGFncyBmbGFncyA9IGdsb2JhbF9vcGVuZmxhZ3M7CiAJY2hhciAqYmFja2luZ19maWxlOwogCWludCBuLCBlcnIsIGk7CkBAIC0zMTEsNyArMzEyLDcgQEAKIAkJfQogCiAJCWVyciA9IDE7Ci0gCQlzcGluX2xvY2soJnViZF9sb2NrKTsKKyAJCW11dGV4X2xvY2soJnViZF9sb2NrKTsKICAJCWlmKGZha2VfbWFqb3IgIT0gTUFKT1JfTlIpewogIAkJCXByaW50ayhLRVJOX0VSUiAiQ2FuJ3QgYXNzaWduIGEgZmFrZSBtYWpvciB0d2ljZVxuIik7CiAgCQkJZ290byBvdXQxOwpAQCAtMzIzLDcgKzMyNCw3IEBACiAJCSAgICAgICBtYWpvcik7CiAgCQllcnIgPSAwOwogIAlvdXQxOgotIAkJc3Bpbl91bmxvY2soJnViZF9sb2NrKTsKKyAJCW11dGV4X3VubG9jaygmdWJkX2xvY2spOwogCQlyZXR1cm4oZXJyKTsKIAl9CiAKQEAgLTM0MCwxMCArMzQxLDEwIEBACiAJfQogCiAJZXJyID0gMTsKLQlzcGluX2xvY2soJnViZF9sb2NrKTsKKwltdXRleF9sb2NrKCZ1YmRfbG9jayk7CiAKLQlkZXYgPSAmdWJkX2RldltuXTsKLQlpZihkZXYtPmZpbGUgIT0gTlVMTCl7CisJdWJkX2RldiA9ICZ1YmRfZGV2c1tuXTsKKwlpZih1YmRfZGV2LT5maWxlICE9IE5VTEwpewogCQlwcmludGsoS0VSTl9FUlIgInViZF9zZXR1cCA6IGRldmljZSBhbHJlYWR5IGNvbmZpZ3VyZWRcbiIpOwogCQlnb3RvIG91dDsKIAl9CkBAIC0zNjAsMTAgKzM2MSwxMCBAQAogCQkJZmxhZ3MucyA9IDE7CiAJCQlicmVhazsKIAkJY2FzZSAnZCc6Ci0JCQlkZXYtPm5vX2NvdyA9IDE7CisJCQl1YmRfZGV2LT5ub19jb3cgPSAxOwogCQkJYnJlYWs7CiAJCWNhc2UgJ2MnOgotCQkJZGV2LT5zaGFyZWQgPSAxOworCQkJdWJkX2Rldi0+c2hhcmVkID0gMTsKIAkJCWJyZWFrOwogCQljYXNlICc9JzoKIAkJCXN0cisrOwpAQCAtMzkwLDcgKzM5MSw3IEBACiAJfQogCiAJaWYoYmFja2luZ19maWxlKXsKLQkJaWYoZGV2LT5ub19jb3cpCisJCWlmKHViZF9kZXYtPm5vX2NvdykKIAkJCXByaW50ayhLRVJOX0VSUiAiQ2FuJ3Qgc3BlY2lmeSBib3RoICdkJyBhbmQgYSAiCiAJCQkgICAgICAgImNvdyBmaWxlXG4iKTsKIAkJZWxzZSB7CkBAIC0zOTgsMTEgKzM5OSwxMSBAQAogCQkJYmFja2luZ19maWxlKys7CiAJCX0KIAl9Ci0JZGV2LT5maWxlID0gc3RyOwotCWRldi0+Y293LmZpbGUgPSBiYWNraW5nX2ZpbGU7Ci0JZGV2LT5ib290X29wZW5mbGFncyA9IGZsYWdzOworCXViZF9kZXYtPmZpbGUgPSBzdHI7CisJdWJkX2Rldi0+Y293LmZpbGUgPSBiYWNraW5nX2ZpbGU7CisJdWJkX2Rldi0+Ym9vdF9vcGVuZmxhZ3MgPSBmbGFnczsKIG91dDoKLQlzcGluX3VubG9jaygmdWJkX2xvY2spOworCW11dGV4X3VubG9jaygmdWJkX2xvY2spOwogCXJldHVybihlcnIpOwogfQogCkBAIC00NzIsOCArNDczLDkgQEAKIAogLyogQ2hhbmdlZCBieSB1YmRfaGFuZGxlciwgd2hpY2ggaXMgc2VyaWFsaXplZCBiZWNhdXNlIGludGVycnVwdHMgb25seQogICogaGFwcGVuIG9uIENQVSAwLgorICogWFhYOiBjdXJyZW50bHkgdW51c2VkLgogICovCi1pbnQgaW50cl9jb3VudCA9IDA7CitzdGF0aWMgaW50IGludHJfY291bnQgPSAwOwogCiAvKiBjYWxsIHViZF9maW5pc2ggaWYgeW91IG5lZWQgdG8gc2VyaWFsaXplICovCiBzdGF0aWMgdm9pZCBfX3ViZF9maW5pc2goc3RydWN0IHJlcXVlc3QgKnJlcSwgaW50IGVycm9yKQpAQCAtNDkzLDYgKzQ5NSw4IEBACiAJZW5kX3JlcXVlc3QocmVxLCAxKTsKIH0KIAorLyogQ2FsbGFibGUgb25seSBmcm9tIGludGVycnVwdCBjb250ZXh0IC0gb3RoZXJ3aXNlIHlvdSBuZWVkIHRvIGRvCisgKiBzcGluX2xvY2tfaXJxKCkvc3Bpbl9sb2NrX2lycXNhdmUoKSAqLwogc3RhdGljIGlubGluZSB2b2lkIHViZF9maW5pc2goc3RydWN0IHJlcXVlc3QgKnJlcSwgaW50IGVycm9yKQogewogIAlzcGluX2xvY2soJnViZF9pb19sb2NrKTsKQEAgLTUwMCwxNCArNTA0LDE1IEBACiAJc3Bpbl91bmxvY2soJnViZF9pb19sb2NrKTsKIH0KIAotLyogQ2FsbGVkIHdpdGhvdXQgdWJkX2lvX2xvY2sgaGVsZCAqLworLyogWFhYIC0gbW92ZSB0aGlzIGluc2lkZSB1YmRfaW50ci4gKi8KKy8qIENhbGxlZCB3aXRob3V0IHViZF9pb19sb2NrIGhlbGQsIGFuZCBvbmx5IGluIGludGVycnVwdCBjb250ZXh0LiAqLwogc3RhdGljIHZvaWQgdWJkX2hhbmRsZXIodm9pZCkKIHsKIAlzdHJ1Y3QgaW9fdGhyZWFkX3JlcSByZXE7CiAJc3RydWN0IHJlcXVlc3QgKnJxID0gZWx2X25leHRfcmVxdWVzdCh1YmRfcXVldWUpOwogCWludCBuOwogCi0JZG9fdWJkID0gTlVMTDsKKwlkb191YmQgPSAwOwogCWludHJfY291bnQrKzsKIAluID0gb3NfcmVhZF9maWxlKHRocmVhZF9mZCwgJnJlcSwgc2l6ZW9mKHJlcSkpOwogCWlmKG4gIT0gc2l6ZW9mKHJlcSkpewpAQCAtNTIxLDcgKzUyNiw5IEBACiAKIAl1YmRfZmluaXNoKHJxLCByZXEuZXJyb3IpOwogCXJlYWN0aXZhdGVfZmQodGhyZWFkX2ZkLCBVQkRfSVJRKTsJCisJc3Bpbl9sb2NrKCZ1YmRfaW9fbG9jayk7CiAJZG9fdWJkX3JlcXVlc3QodWJkX3F1ZXVlKTsKKwlzcGluX3VubG9jaygmdWJkX2lvX2xvY2spOwogfQogCiBzdGF0aWMgaXJxcmV0dXJuX3QgdWJkX2ludHIoaW50IGlycSwgdm9pZCAqZGV2KQpAQCAtNTQxLDg3ICs1NDgsOTAgQEAKIAogX191bWxfZXhpdGNhbGwoa2lsbF9pb190aHJlYWQpOwogCi1zdGF0aWMgaW50IHViZF9maWxlX3NpemUoc3RydWN0IHViZCAqZGV2LCBfX3U2NCAqc2l6ZV9vdXQpCitzdGF0aWMgaW5saW5lIGludCB1YmRfZmlsZV9zaXplKHN0cnVjdCB1YmQgKnViZF9kZXYsIF9fdTY0ICpzaXplX291dCkKIHsKIAljaGFyICpmaWxlOwogCi0JZmlsZSA9IGRldi0+Y293LmZpbGUgPyBkZXYtPmNvdy5maWxlIDogZGV2LT5maWxlOworCWZpbGUgPSB1YmRfZGV2LT5jb3cuZmlsZSA/IHViZF9kZXYtPmNvdy5maWxlIDogdWJkX2Rldi0+ZmlsZTsKIAlyZXR1cm4ob3NfZmlsZV9zaXplKGZpbGUsIHNpemVfb3V0KSk7CiB9CiAKLXN0YXRpYyB2b2lkIHViZF9jbG9zZShzdHJ1Y3QgdWJkICpkZXYpCitzdGF0aWMgdm9pZCB1YmRfY2xvc2VfZGV2KHN0cnVjdCB1YmQgKnViZF9kZXYpCiB7Ci0Jb3NfY2xvc2VfZmlsZShkZXYtPmZkKTsKLQlpZihkZXYtPmNvdy5maWxlID09IE5VTEwpCisJb3NfY2xvc2VfZmlsZSh1YmRfZGV2LT5mZCk7CisJaWYodWJkX2Rldi0+Y293LmZpbGUgPT0gTlVMTCkKIAkJcmV0dXJuOwogCi0Jb3NfY2xvc2VfZmlsZShkZXYtPmNvdy5mZCk7Ci0JdmZyZWUoZGV2LT5jb3cuYml0bWFwKTsKLQlkZXYtPmNvdy5iaXRtYXAgPSBOVUxMOworCW9zX2Nsb3NlX2ZpbGUodWJkX2Rldi0+Y293LmZkKTsKKwl2ZnJlZSh1YmRfZGV2LT5jb3cuYml0bWFwKTsKKwl1YmRfZGV2LT5jb3cuYml0bWFwID0gTlVMTDsKIH0KIAotc3RhdGljIGludCB1YmRfb3Blbl9kZXYoc3RydWN0IHViZCAqZGV2KQorc3RhdGljIGludCB1YmRfb3Blbl9kZXYoc3RydWN0IHViZCAqdWJkX2RldikKIHsKIAlzdHJ1Y3Qgb3BlbmZsYWdzIGZsYWdzOwogCWNoYXIgKipiYWNrX3B0cjsKIAlpbnQgZXJyLCBjcmVhdGVfY293LCAqY3JlYXRlX3B0cjsKKwlpbnQgZmQ7CiAKLQlkZXYtPm9wZW5mbGFncyA9IGRldi0+Ym9vdF9vcGVuZmxhZ3M7CisJdWJkX2Rldi0+b3BlbmZsYWdzID0gdWJkX2Rldi0+Ym9vdF9vcGVuZmxhZ3M7CiAJY3JlYXRlX2NvdyA9IDA7Ci0JY3JlYXRlX3B0ciA9IChkZXYtPmNvdy5maWxlICE9IE5VTEwpID8gJmNyZWF0ZV9jb3cgOiBOVUxMOwotCWJhY2tfcHRyID0gZGV2LT5ub19jb3cgPyBOVUxMIDogJmRldi0+Y293LmZpbGU7Ci0JZGV2LT5mZCA9IG9wZW5fdWJkX2ZpbGUoZGV2LT5maWxlLCAmZGV2LT5vcGVuZmxhZ3MsIGRldi0+c2hhcmVkLAotCQkJCWJhY2tfcHRyLCAmZGV2LT5jb3cuYml0bWFwX29mZnNldCwKLQkJCQkmZGV2LT5jb3cuYml0bWFwX2xlbiwgJmRldi0+Y293LmRhdGFfb2Zmc2V0LAorCWNyZWF0ZV9wdHIgPSAodWJkX2Rldi0+Y293LmZpbGUgIT0gTlVMTCkgPyAmY3JlYXRlX2NvdyA6IE5VTEw7CisJYmFja19wdHIgPSB1YmRfZGV2LT5ub19jb3cgPyBOVUxMIDogJnViZF9kZXYtPmNvdy5maWxlOworCisJZmQgPSBvcGVuX3ViZF9maWxlKHViZF9kZXYtPmZpbGUsICZ1YmRfZGV2LT5vcGVuZmxhZ3MsIHViZF9kZXYtPnNoYXJlZCwKKwkJCQliYWNrX3B0ciwgJnViZF9kZXYtPmNvdy5iaXRtYXBfb2Zmc2V0LAorCQkJCSZ1YmRfZGV2LT5jb3cuYml0bWFwX2xlbiwgJnViZF9kZXYtPmNvdy5kYXRhX29mZnNldCwKIAkJCQljcmVhdGVfcHRyKTsKIAotCWlmKChkZXYtPmZkID09IC1FTk9FTlQpICYmIGNyZWF0ZV9jb3cpewotCQlkZXYtPmZkID0gY3JlYXRlX2Nvd19maWxlKGRldi0+ZmlsZSwgZGV2LT5jb3cuZmlsZSwKLQkJCQkJICBkZXYtPm9wZW5mbGFncywgMSA8PCA5LCBQQUdFX1NJWkUsCi0JCQkJCSAgJmRldi0+Y293LmJpdG1hcF9vZmZzZXQsCi0JCQkJCSAgJmRldi0+Y293LmJpdG1hcF9sZW4sCi0JCQkJCSAgJmRldi0+Y293LmRhdGFfb2Zmc2V0KTsKLQkJaWYoZGV2LT5mZCA+PSAwKXsKKwlpZigoZmQgPT0gLUVOT0VOVCkgJiYgY3JlYXRlX2Nvdyl7CisJCWZkID0gY3JlYXRlX2Nvd19maWxlKHViZF9kZXYtPmZpbGUsIHViZF9kZXYtPmNvdy5maWxlLAorCQkJCQkgIHViZF9kZXYtPm9wZW5mbGFncywgMSA8PCA5LCBQQUdFX1NJWkUsCisJCQkJCSAgJnViZF9kZXYtPmNvdy5iaXRtYXBfb2Zmc2V0LAorCQkJCQkgICZ1YmRfZGV2LT5jb3cuYml0bWFwX2xlbiwKKwkJCQkJICAmdWJkX2Rldi0+Y293LmRhdGFfb2Zmc2V0KTsKKwkJaWYoZmQgPj0gMCl7CiAJCQlwcmludGsoS0VSTl9JTkZPICJDcmVhdGluZyBcIiVzXCIgYXMgQ09XIGZpbGUgZm9yICIKLQkJCSAgICAgICAiXCIlc1wiXG4iLCBkZXYtPmZpbGUsIGRldi0+Y293LmZpbGUpOworCQkJICAgICAgICJcIiVzXCJcbiIsIHViZF9kZXYtPmZpbGUsIHViZF9kZXYtPmNvdy5maWxlKTsKIAkJfQogCX0KIAotCWlmKGRldi0+ZmQgPCAwKXsKLQkJcHJpbnRrKCJGYWlsZWQgdG8gb3BlbiAnJXMnLCBlcnJubyA9ICVkXG4iLCBkZXYtPmZpbGUsCi0JCSAgICAgICAtZGV2LT5mZCk7Ci0JCXJldHVybihkZXYtPmZkKTsKKwlpZihmZCA8IDApeworCQlwcmludGsoIkZhaWxlZCB0byBvcGVuICclcycsIGVycm5vID0gJWRcbiIsIHViZF9kZXYtPmZpbGUsCisJCSAgICAgICAtZmQpOworCQlyZXR1cm4gZmQ7CiAJfQorCXViZF9kZXYtPmZkID0gZmQ7CiAKLQlpZihkZXYtPmNvdy5maWxlICE9IE5VTEwpeworCWlmKHViZF9kZXYtPmNvdy5maWxlICE9IE5VTEwpewogCQllcnIgPSAtRU5PTUVNOwotCQlkZXYtPmNvdy5iaXRtYXAgPSAodm9pZCAqKSB2bWFsbG9jKGRldi0+Y293LmJpdG1hcF9sZW4pOwotCQlpZihkZXYtPmNvdy5iaXRtYXAgPT0gTlVMTCl7CisJCXViZF9kZXYtPmNvdy5iaXRtYXAgPSAodm9pZCAqKSB2bWFsbG9jKHViZF9kZXYtPmNvdy5iaXRtYXBfbGVuKTsKKwkJaWYodWJkX2Rldi0+Y293LmJpdG1hcCA9PSBOVUxMKXsKIAkJCXByaW50ayhLRVJOX0VSUiAiRmFpbGVkIHRvIHZtYWxsb2MgQ09XIGJpdG1hcFxuIik7CiAJCQlnb3RvIGVycm9yOwogCQl9CiAJCWZsdXNoX3RsYl9rZXJuZWxfdm0oKTsKIAotCQllcnIgPSByZWFkX2Nvd19iaXRtYXAoZGV2LT5mZCwgZGV2LT5jb3cuYml0bWFwLAotCQkJCSAgICAgIGRldi0+Y293LmJpdG1hcF9vZmZzZXQsCi0JCQkJICAgICAgZGV2LT5jb3cuYml0bWFwX2xlbik7CisJCWVyciA9IHJlYWRfY293X2JpdG1hcCh1YmRfZGV2LT5mZCwgdWJkX2Rldi0+Y293LmJpdG1hcCwKKwkJCQkgICAgICB1YmRfZGV2LT5jb3cuYml0bWFwX29mZnNldCwKKwkJCQkgICAgICB1YmRfZGV2LT5jb3cuYml0bWFwX2xlbik7CiAJCWlmKGVyciA8IDApCiAJCQlnb3RvIGVycm9yOwogCi0JCWZsYWdzID0gZGV2LT5vcGVuZmxhZ3M7CisJCWZsYWdzID0gdWJkX2Rldi0+b3BlbmZsYWdzOwogCQlmbGFncy53ID0gMDsKLQkJZXJyID0gb3Blbl91YmRfZmlsZShkZXYtPmNvdy5maWxlLCAmZmxhZ3MsIGRldi0+c2hhcmVkLCBOVUxMLAorCQllcnIgPSBvcGVuX3ViZF9maWxlKHViZF9kZXYtPmNvdy5maWxlLCAmZmxhZ3MsIHViZF9kZXYtPnNoYXJlZCwgTlVMTCwKIAkJCQkgICAgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCk7CiAJCWlmKGVyciA8IDApIGdvdG8gZXJyb3I7Ci0JCWRldi0+Y293LmZkID0gZXJyOworCQl1YmRfZGV2LT5jb3cuZmQgPSBlcnI7CiAJfQogCXJldHVybigwKTsKICBlcnJvcjoKLQlvc19jbG9zZV9maWxlKGRldi0+ZmQpOworCW9zX2Nsb3NlX2ZpbGUodWJkX2Rldi0+ZmQpOwogCXJldHVybihlcnIpOwogfQogCi1zdGF0aWMgaW50IHViZF9uZXdfZGlzayhpbnQgbWFqb3IsIHU2NCBzaXplLCBpbnQgdW5pdCwKK3N0YXRpYyBpbnQgdWJkX2Rpc2tfcmVnaXN0ZXIoaW50IG1ham9yLCB1NjQgc2l6ZSwgaW50IHVuaXQsCiAJCQlzdHJ1Y3QgZ2VuZGlzayAqKmRpc2tfb3V0KQogCQkJCiB7CkBAIC02NDIsMTMgKzY1MiwxMyBAQAogCiAJLyogc3lzZnMgcmVnaXN0ZXIgKG5vdCBmb3IgaWRlIGZha2UgZGV2aWNlcykgKi8KIAlpZiAobWFqb3IgPT0gTUFKT1JfTlIpIHsKLQkJdWJkX2Rldlt1bml0XS5wZGV2LmlkICAgPSB1bml0OwotCQl1YmRfZGV2W3VuaXRdLnBkZXYubmFtZSA9IERSSVZFUl9OQU1FOwotCQlwbGF0Zm9ybV9kZXZpY2VfcmVnaXN0ZXIoJnViZF9kZXZbdW5pdF0ucGRldik7Ci0JCWRpc2stPmRyaXZlcmZzX2RldiA9ICZ1YmRfZGV2W3VuaXRdLnBkZXYuZGV2OworCQl1YmRfZGV2c1t1bml0XS5wZGV2LmlkICAgPSB1bml0OworCQl1YmRfZGV2c1t1bml0XS5wZGV2Lm5hbWUgPSBEUklWRVJfTkFNRTsKKwkJcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyKCZ1YmRfZGV2c1t1bml0XS5wZGV2KTsKKwkJZGlzay0+ZHJpdmVyZnNfZGV2ID0gJnViZF9kZXZzW3VuaXRdLnBkZXYuZGV2OwogCX0KIAotCWRpc2stPnByaXZhdGVfZGF0YSA9ICZ1YmRfZGV2W3VuaXRdOworCWRpc2stPnByaXZhdGVfZGF0YSA9ICZ1YmRfZGV2c1t1bml0XTsKIAlkaXNrLT5xdWV1ZSA9IHViZF9xdWV1ZTsKIAlhZGRfZGlzayhkaXNrKTsKIApAQCAtNjYwLDI1ICs2NzAsMjUgQEAKIAogc3RhdGljIGludCB1YmRfYWRkKGludCBuKQogewotCXN0cnVjdCB1YmQgKmRldiA9ICZ1YmRfZGV2W25dOworCXN0cnVjdCB1YmQgKnViZF9kZXYgPSAmdWJkX2RldnNbbl07CiAJaW50IGVycjsKIAogCWVyciA9IC1FTk9ERVY7Ci0JaWYoZGV2LT5maWxlID09IE5VTEwpCisJaWYodWJkX2Rldi0+ZmlsZSA9PSBOVUxMKQogCQlnb3RvIG91dDsKIAotCWVyciA9IHViZF9maWxlX3NpemUoZGV2LCAmZGV2LT5zaXplKTsKKwllcnIgPSB1YmRfZmlsZV9zaXplKHViZF9kZXYsICZ1YmRfZGV2LT5zaXplKTsKIAlpZihlcnIgPCAwKQogCQlnb3RvIG91dDsKIAotCWRldi0+c2l6ZSA9IFJPVU5EX0JMT0NLKGRldi0+c2l6ZSk7CisJdWJkX2Rldi0+c2l6ZSA9IFJPVU5EX0JMT0NLKHViZF9kZXYtPnNpemUpOwogCi0JZXJyID0gdWJkX25ld19kaXNrKE1BSk9SX05SLCBkZXYtPnNpemUsIG4sICZ1YmRfZ2VuZGlza1tuXSk7CisJZXJyID0gdWJkX2Rpc2tfcmVnaXN0ZXIoTUFKT1JfTlIsIHViZF9kZXYtPnNpemUsIG4sICZ1YmRfZ2VuZGlza1tuXSk7CiAJaWYoZXJyKQogCQlnb3RvIG91dDsKIAogCWlmKGZha2VfbWFqb3IgIT0gTUFKT1JfTlIpCi0JCXViZF9uZXdfZGlzayhmYWtlX21ham9yLCBkZXYtPnNpemUsIG4sCisJCXViZF9kaXNrX3JlZ2lzdGVyKGZha2VfbWFqb3IsIHViZF9kZXYtPnNpemUsIG4sCiAJCQkgICAgICZmYWtlX2dlbmRpc2tbbl0pOwogCiAJLyogcGVyaGFwcyB0aGlzIHNob3VsZCBhbHNvIGJlIHVuZGVyIHRoZSAiaWYgKGZha2VfbWFqb3IpIiBhYm92ZSAqLwpAQCAtNjkzLDMyICs3MDMsNDEgQEAKIAogc3RhdGljIGludCB1YmRfY29uZmlnKGNoYXIgKnN0cikKIHsKLQlpbnQgbiwgZXJyOworCWludCBuLCByZXQ7CiAKIAlzdHIgPSBrc3RyZHVwKHN0ciwgR0ZQX0tFUk5FTCk7Ci0JaWYoc3RyID09IE5VTEwpeworCWlmIChzdHIgPT0gTlVMTCkgewogCQlwcmludGsoS0VSTl9FUlIgInViZF9jb25maWcgZmFpbGVkIHRvIHN0cmR1cCBzdHJpbmdcbiIpOwotCQlyZXR1cm4oMSk7CisJCXJldCA9IDE7CisJCWdvdG8gb3V0OwogCX0KLQllcnIgPSB1YmRfc2V0dXBfY29tbW9uKHN0ciwgJm4pOwotCWlmKGVycil7Ci0JCWtmcmVlKHN0cik7Ci0JCXJldHVybigtMSk7CisJcmV0ID0gdWJkX3NldHVwX2NvbW1vbihzdHIsICZuKTsKKwlpZiAocmV0KSB7CisJCXJldCA9IC0xOworCQlnb3RvIGVycl9mcmVlOwogCX0KLQlpZihuID09IC0xKSByZXR1cm4oMCk7CisJaWYgKG4gPT0gLTEpIHsKKwkJcmV0ID0gMDsKKwkJZ290byBlcnJfZnJlZTsKKwl9CiAKLSAJc3Bpbl9sb2NrKCZ1YmRfbG9jayk7Ci0JZXJyID0gdWJkX2FkZChuKTsKLQlpZihlcnIpCi0JCXViZF9kZXZbbl0uZmlsZSA9IE5VTEw7Ci0gCXNwaW5fdW5sb2NrKCZ1YmRfbG9jayk7CisgCW11dGV4X2xvY2soJnViZF9sb2NrKTsKKwlyZXQgPSB1YmRfYWRkKG4pOworCWlmIChyZXQpCisJCXViZF9kZXZzW25dLmZpbGUgPSBOVUxMOworIAltdXRleF91bmxvY2soJnViZF9sb2NrKTsKIAotCXJldHVybihlcnIpOworb3V0OgorIAlyZXR1cm4gcmV0OworCitlcnJfZnJlZToKKwlrZnJlZShzdHIpOworCWdvdG8gb3V0OwogfQogCiBzdGF0aWMgaW50IHViZF9nZXRfY29uZmlnKGNoYXIgKm5hbWUsIGNoYXIgKnN0ciwgaW50IHNpemUsIGNoYXIgKiplcnJvcl9vdXQpCiB7Ci0Jc3RydWN0IHViZCAqZGV2OworCXN0cnVjdCB1YmQgKnViZF9kZXY7CiAJaW50IG4sIGxlbiA9IDA7CiAKIAluID0gcGFyc2VfdW5pdCgmbmFtZSk7CkBAIC03MjcsMjQgKzc0NiwyNCBAQAogCQlyZXR1cm4oLTEpOwogCX0KIAotCWRldiA9ICZ1YmRfZGV2W25dOwotCXNwaW5fbG9jaygmdWJkX2xvY2spOworCXViZF9kZXYgPSAmdWJkX2RldnNbbl07CisJbXV0ZXhfbG9jaygmdWJkX2xvY2spOwogCi0JaWYoZGV2LT5maWxlID09IE5VTEwpeworCWlmKHViZF9kZXYtPmZpbGUgPT0gTlVMTCl7CiAJCUNPTkZJR19DSFVOSyhzdHIsIHNpemUsIGxlbiwgIiIsIDEpOwogCQlnb3RvIG91dDsKIAl9CiAKLQlDT05GSUdfQ0hVTksoc3RyLCBzaXplLCBsZW4sIGRldi0+ZmlsZSwgMCk7CisJQ09ORklHX0NIVU5LKHN0ciwgc2l6ZSwgbGVuLCB1YmRfZGV2LT5maWxlLCAwKTsKIAotCWlmKGRldi0+Y293LmZpbGUgIT0gTlVMTCl7CisJaWYodWJkX2Rldi0+Y293LmZpbGUgIT0gTlVMTCl7CiAJCUNPTkZJR19DSFVOSyhzdHIsIHNpemUsIGxlbiwgIiwiLCAwKTsKLQkJQ09ORklHX0NIVU5LKHN0ciwgc2l6ZSwgbGVuLCBkZXYtPmNvdy5maWxlLCAxKTsKKwkJQ09ORklHX0NIVU5LKHN0ciwgc2l6ZSwgbGVuLCB1YmRfZGV2LT5jb3cuZmlsZSwgMSk7CiAJfQogCWVsc2UgQ09ORklHX0NIVU5LKHN0ciwgc2l6ZSwgbGVuLCAiIiwgMSk7CiAKICBvdXQ6Ci0Jc3Bpbl91bmxvY2soJnViZF9sb2NrKTsKKwltdXRleF91bmxvY2soJnViZF9sb2NrKTsKIAlyZXR1cm4obGVuKTsKIH0KIApAQCAtNzYwLDIyICs3NzksMjIgQEAKIAogc3RhdGljIGludCB1YmRfcmVtb3ZlKGludCBuKQogewotCXN0cnVjdCB1YmQgKmRldjsKKwlzdHJ1Y3QgdWJkICp1YmRfZGV2OwogCWludCBlcnIgPSAtRU5PREVWOwogCi0Jc3Bpbl9sb2NrKCZ1YmRfbG9jayk7CisJbXV0ZXhfbG9jaygmdWJkX2xvY2spOwogCiAJaWYodWJkX2dlbmRpc2tbbl0gPT0gTlVMTCkKIAkJZ290byBvdXQ7CiAKLQlkZXYgPSAmdWJkX2RldltuXTsKKwl1YmRfZGV2ID0gJnViZF9kZXZzW25dOwogCi0JaWYoZGV2LT5maWxlID09IE5VTEwpCisJaWYodWJkX2Rldi0+ZmlsZSA9PSBOVUxMKQogCQlnb3RvIG91dDsKIAogCS8qIHlvdSBjYW5ub3QgcmVtb3ZlIGEgb3BlbiBkaXNrICovCiAJZXJyID0gLUVCVVNZOwotCWlmKGRldi0+Y291bnQgPiAwKQorCWlmKHViZF9kZXYtPmNvdW50ID4gMCkKIAkJZ290byBvdXQ7CiAKIAlkZWxfZ2VuZGlzayh1YmRfZ2VuZGlza1tuXSk7CkBAIC03ODgsMTQgKzgwNywxNSBAQAogCQlmYWtlX2dlbmRpc2tbbl0gPSBOVUxMOwogCX0KIAotCXBsYXRmb3JtX2RldmljZV91bnJlZ2lzdGVyKCZkZXYtPnBkZXYpOwotCSpkZXYgPSAoKHN0cnVjdCB1YmQpIERFRkFVTFRfVUJEKTsKKwlwbGF0Zm9ybV9kZXZpY2VfdW5yZWdpc3RlcigmdWJkX2Rldi0+cGRldik7CisJKnViZF9kZXYgPSAoKHN0cnVjdCB1YmQpIERFRkFVTFRfVUJEKTsKIAllcnIgPSAwOwogb3V0OgotCXNwaW5fdW5sb2NrKCZ1YmRfbG9jayk7CisJbXV0ZXhfdW5sb2NrKCZ1YmRfbG9jayk7CiAJcmV0dXJuIGVycjsKIH0KIAorLyogQWxsIHRoZXNlIGFyZSBjYWxsZWQgYnkgbWNvbnNvbGUgaW4gcHJvY2VzcyBjb250ZXh0IGFuZCB3aXRob3V0IHViZC1zcGVjaWZpYyBsb2Nrcy4gKi8KIHN0YXRpYyBzdHJ1Y3QgbWNfZGV2aWNlIHViZF9tYyA9IHsKIAkubmFtZQkJPSAidWJkIiwKIAkuY29uZmlnCQk9IHViZF9jb25maWcsCkBAIC04MDQsNyArODI0LDcgQEAKIAkucmVtb3ZlCQk9IHViZF9yZW1vdmUsCiB9OwogCi1zdGF0aWMgaW50IHViZF9tY19pbml0KHZvaWQpCitzdGF0aWMgaW50IF9faW5pdCB1YmRfbWNfaW5pdCh2b2lkKQogewogCW1jb25zb2xlX3JlZ2lzdGVyX2RldigmdWJkX21jKTsKIAlyZXR1cm4gMDsKQEAgLTgxMiwxMyArODMyLDI0IEBACiAKIF9faW5pdGNhbGwodWJkX21jX2luaXQpOwogCitzdGF0aWMgaW50IF9faW5pdCB1YmQwX2luaXQodm9pZCkKK3sKKwlzdHJ1Y3QgdWJkICp1YmRfZGV2ID0gJnViZF9kZXZzWzBdOworCisJaWYodWJkX2Rldi0+ZmlsZSA9PSBOVUxMKQorCQl1YmRfZGV2LT5maWxlID0gInJvb3RfZnMiOworCXJldHVybigwKTsKK30KKworX19pbml0Y2FsbCh1YmQwX2luaXQpOworCiBzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciB1YmRfZHJpdmVyID0gewogCS5kcml2ZXIgPSB7CiAJCS5uYW1lICA9IERSSVZFUl9OQU1FLAogCX0sCiB9OwogCi1pbnQgdWJkX2luaXQodm9pZCkKK3N0YXRpYyBpbnQgX19pbml0IHViZF9pbml0KHZvaWQpCiB7CiAgICAgICAgIGludCBpOwogCkBAIC04NDYsNyArODc3LDcgQEAKIAogbGF0ZV9pbml0Y2FsbCh1YmRfaW5pdCk7CiAKLWludCB1YmRfZHJpdmVyX2luaXQodm9pZCl7CitzdGF0aWMgaW50IF9faW5pdCB1YmRfZHJpdmVyX2luaXQodm9pZCl7CiAJdW5zaWduZWQgbG9uZyBzdGFjazsKIAlpbnQgZXJyOwogCkBAIC04NjcsNyArODk4LDcgQEAKIAkJcmV0dXJuKDApOwogCX0KIAllcnIgPSB1bV9yZXF1ZXN0X2lycShVQkRfSVJRLCB0aHJlYWRfZmQsIElSUV9SRUFELCB1YmRfaW50ciwKLQkJCSAgICAgSVJRRl9ESVNBQkxFRCwgInViZCIsIHViZF9kZXYpOworCQkJICAgICBJUlFGX0RJU0FCTEVELCAidWJkIiwgdWJkX2RldnMpOwogCWlmKGVyciAhPSAwKQogCQlwcmludGsoS0VSTl9FUlIgInVtX3JlcXVlc3RfaXJxIGZhaWxlZCAtIGVycm5vID0gJWRcbiIsIC1lcnIpOwogCXJldHVybiAwOwpAQCAtODc4LDI0ICs5MDksMjQgQEAKIHN0YXRpYyBpbnQgdWJkX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHApCiB7CiAJc3RydWN0IGdlbmRpc2sgKmRpc2sgPSBpbm9kZS0+aV9iZGV2LT5iZF9kaXNrOwotCXN0cnVjdCB1YmQgKmRldiA9IGRpc2stPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgdWJkICp1YmRfZGV2ID0gZGlzay0+cHJpdmF0ZV9kYXRhOwogCWludCBlcnIgPSAwOwogCi0JaWYoZGV2LT5jb3VudCA9PSAwKXsKLQkJZXJyID0gdWJkX29wZW5fZGV2KGRldik7CisJaWYodWJkX2Rldi0+Y291bnQgPT0gMCl7CisJCWVyciA9IHViZF9vcGVuX2Rldih1YmRfZGV2KTsKIAkJaWYoZXJyKXsKIAkJCXByaW50ayhLRVJOX0VSUiAiJXM6IENhbid0IG9wZW4gXCIlc1wiOiBlcnJubyA9ICVkXG4iLAotCQkJICAgICAgIGRpc2stPmRpc2tfbmFtZSwgZGV2LT5maWxlLCAtZXJyKTsKKwkJCSAgICAgICBkaXNrLT5kaXNrX25hbWUsIHViZF9kZXYtPmZpbGUsIC1lcnIpOwogCQkJZ290byBvdXQ7CiAJCX0KIAl9Ci0JZGV2LT5jb3VudCsrOwotCXNldF9kaXNrX3JvKGRpc2ssICFkZXYtPm9wZW5mbGFncy53KTsKKwl1YmRfZGV2LT5jb3VudCsrOworCXNldF9kaXNrX3JvKGRpc2ssICF1YmRfZGV2LT5vcGVuZmxhZ3Mudyk7CiAKIAkvKiBUaGlzIHNob3VsZCBubyBtb3JlIGJlIG5lZWRlZC4gQW5kIGl0IGRpZG4ndCB3b3JrIGFueXdheSB0byBleGNsdWRlCiAJICogcmVhZC13cml0ZSByZW1vdW50aW5nIG9mIGZpbGVzeXN0ZW1zLiovCi0JLyppZigoZmlscC0+Zl9tb2RlICYgRk1PREVfV1JJVEUpICYmICFkZXYtPm9wZW5mbGFncy53KXsKLQkgICAgICAgIGlmKC0tZGV2LT5jb3VudCA9PSAwKSB1YmRfY2xvc2UoZGV2KTsKKwkvKmlmKChmaWxwLT5mX21vZGUgJiBGTU9ERV9XUklURSkgJiYgIXViZF9kZXYtPm9wZW5mbGFncy53KXsKKwkgICAgICAgIGlmKC0tdWJkX2Rldi0+Y291bnQgPT0gMCkgdWJkX2Nsb3NlX2Rldih1YmRfZGV2KTsKIAkgICAgICAgIGVyciA9IC1FUk9GUzsKIAl9Ki8KICBvdXQ6CkBAIC05MDUsMTAgKzkzNiwxMCBAQAogc3RhdGljIGludCB1YmRfcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKiBpbm9kZSwgc3RydWN0IGZpbGUgKiBmaWxlKQogewogCXN0cnVjdCBnZW5kaXNrICpkaXNrID0gaW5vZGUtPmlfYmRldi0+YmRfZGlzazsKLQlzdHJ1Y3QgdWJkICpkZXYgPSBkaXNrLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IHViZCAqdWJkX2RldiA9IGRpc2stPnByaXZhdGVfZGF0YTsKIAotCWlmKC0tZGV2LT5jb3VudCA9PSAwKQotCQl1YmRfY2xvc2UoZGV2KTsKKwlpZigtLXViZF9kZXYtPmNvdW50ID09IDApCisJCXViZF9jbG9zZV9kZXYodWJkX2Rldik7CiAJcmV0dXJuKDApOwogfQogCkBAIC05NzYsMTIgKzEwMDcsMTIgQEAKIHN0YXRpYyBpbnQgcHJlcGFyZV9yZXF1ZXN0KHN0cnVjdCByZXF1ZXN0ICpyZXEsIHN0cnVjdCBpb190aHJlYWRfcmVxICppb19yZXEpCiB7CiAJc3RydWN0IGdlbmRpc2sgKmRpc2sgPSByZXEtPnJxX2Rpc2s7Ci0Jc3RydWN0IHViZCAqZGV2ID0gZGlzay0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCB1YmQgKnViZF9kZXYgPSBkaXNrLT5wcml2YXRlX2RhdGE7CiAJX191NjQgb2Zmc2V0OwogCWludCBsZW47CiAKIAkvKiBUaGlzIHNob3VsZCBiZSBpbXBvc3NpYmxlIG5vdyAqLwotCWlmKChycV9kYXRhX2RpcihyZXEpID09IFdSSVRFKSAmJiAhZGV2LT5vcGVuZmxhZ3Mudyl7CisJaWYoKHJxX2RhdGFfZGlyKHJlcSkgPT0gV1JJVEUpICYmICF1YmRfZGV2LT5vcGVuZmxhZ3Mudyl7CiAJCXByaW50aygiV3JpdGUgYXR0ZW1wdGVkIG9uIHJlYWRvbmx5IHViZCBkZXZpY2UgJXNcbiIsCiAJCSAgICAgICBkaXNrLT5kaXNrX25hbWUpOwogCQllbmRfcmVxdWVzdChyZXEsIDApOwpAQCAtOTkxLDggKzEwMjIsOCBAQAogCW9mZnNldCA9ICgoX191NjQpIHJlcS0+c2VjdG9yKSA8PCA5OwogCWxlbiA9IHJlcS0+Y3VycmVudF9ucl9zZWN0b3JzIDw8IDk7CiAKLQlpb19yZXEtPmZkc1swXSA9IChkZXYtPmNvdy5maWxlICE9IE5VTEwpID8gZGV2LT5jb3cuZmQgOiBkZXYtPmZkOwotCWlvX3JlcS0+ZmRzWzFdID0gZGV2LT5mZDsKKwlpb19yZXEtPmZkc1swXSA9ICh1YmRfZGV2LT5jb3cuZmlsZSAhPSBOVUxMKSA/IHViZF9kZXYtPmNvdy5mZCA6IHViZF9kZXYtPmZkOworCWlvX3JlcS0+ZmRzWzFdID0gdWJkX2Rldi0+ZmQ7CiAJaW9fcmVxLT5jb3dfb2Zmc2V0ID0gLTE7CiAJaW9fcmVxLT5vZmZzZXQgPSBvZmZzZXQ7CiAJaW9fcmVxLT5sZW5ndGggPSBsZW47CkBAIC0xMDAxLDEzICsxMDMyLDEzIEBACiAKIAlpb19yZXEtPm9wID0gKHJxX2RhdGFfZGlyKHJlcSkgPT0gUkVBRCkgPyBVQkRfUkVBRCA6IFVCRF9XUklURTsKIAlpb19yZXEtPm9mZnNldHNbMF0gPSAwOwotCWlvX3JlcS0+b2Zmc2V0c1sxXSA9IGRldi0+Y293LmRhdGFfb2Zmc2V0OworCWlvX3JlcS0+b2Zmc2V0c1sxXSA9IHViZF9kZXYtPmNvdy5kYXRhX29mZnNldDsKIAlpb19yZXEtPmJ1ZmZlciA9IHJlcS0+YnVmZmVyOwogCWlvX3JlcS0+c2VjdG9yc2l6ZSA9IDEgPDwgOTsKIAotCWlmKGRldi0+Y293LmZpbGUgIT0gTlVMTCkKLQkJY293aWZ5X3JlcShpb19yZXEsIGRldi0+Y293LmJpdG1hcCwgZGV2LT5jb3cuYml0bWFwX29mZnNldCwKLQkJCSAgIGRldi0+Y293LmJpdG1hcF9sZW4pOworCWlmKHViZF9kZXYtPmNvdy5maWxlICE9IE5VTEwpCisJCWNvd2lmeV9yZXEoaW9fcmVxLCB1YmRfZGV2LT5jb3cuYml0bWFwLCB1YmRfZGV2LT5jb3cuYml0bWFwX29mZnNldCwKKwkJCSAgIHViZF9kZXYtPmNvdy5iaXRtYXBfbGVuKTsKIAogCXJldHVybigwKTsKIH0KQEAgLTEwMzMsNyArMTA2NCw3IEBACiAJCQlyZXR1cm47CiAJCWVyciA9IHByZXBhcmVfcmVxdWVzdChyZXEsICZpb19yZXEpOwogCQlpZighZXJyKXsKLQkJCWRvX3ViZCA9IHViZF9oYW5kbGVyOworCQkJZG9fdWJkID0gMTsKIAkJCW4gPSBvc193cml0ZV9maWxlKHRocmVhZF9mZCwgKGNoYXIgKikgJmlvX3JlcSwKIAkJCQkJIHNpemVvZihpb19yZXEpKTsKIAkJCWlmKG4gIT0gc2l6ZW9mKGlvX3JlcSkpCkBAIC0xMDQ1LDE4ICsxMDc2LDE4IEBACiAKIHN0YXRpYyBpbnQgdWJkX2dldGdlbyhzdHJ1Y3QgYmxvY2tfZGV2aWNlICpiZGV2LCBzdHJ1Y3QgaGRfZ2VvbWV0cnkgKmdlbykKIHsKLQlzdHJ1Y3QgdWJkICpkZXYgPSBiZGV2LT5iZF9kaXNrLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IHViZCAqdWJkX2RldiA9IGJkZXYtPmJkX2Rpc2stPnByaXZhdGVfZGF0YTsKIAogCWdlby0+aGVhZHMgPSAxMjg7CiAJZ2VvLT5zZWN0b3JzID0gMzI7Ci0JZ2VvLT5jeWxpbmRlcnMgPSBkZXYtPnNpemUgLyAoMTI4ICogMzIgKiA1MTIpOworCWdlby0+Y3lsaW5kZXJzID0gdWJkX2Rldi0+c2l6ZSAvICgxMjggKiAzMiAqIDUxMik7CiAJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQgdWJkX2lvY3RsKHN0cnVjdCBpbm9kZSAqIGlub2RlLCBzdHJ1Y3QgZmlsZSAqIGZpbGUsCiAJCSAgICAgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCiB7Ci0Jc3RydWN0IHViZCAqZGV2ID0gaW5vZGUtPmlfYmRldi0+YmRfZGlzay0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCB1YmQgKnViZF9kZXYgPSBpbm9kZS0+aV9iZGV2LT5iZF9kaXNrLT5wcml2YXRlX2RhdGE7CiAJc3RydWN0IGhkX2RyaXZlaWQgdWJkX2lkID0gewogCQkuY3lscwkJPSAwLAogCQkuaGVhZHMJCT0gMTI4LApAQCAtMTA2Niw3ICsxMDk3LDcgQEAKIAlzd2l0Y2ggKGNtZCkgewogCQlzdHJ1Y3QgY2Ryb21fdm9sY3RybCB2b2x1bWU7CiAJY2FzZSBIRElPX0dFVF9JREVOVElUWToKLQkJdWJkX2lkLmN5bHMgPSBkZXYtPnNpemUgLyAoMTI4ICogMzIgKiA1MTIpOworCQl1YmRfaWQuY3lscyA9IHViZF9kZXYtPnNpemUgLyAoMTI4ICogMzIgKiA1MTIpOwogCQlpZihjb3B5X3RvX3VzZXIoKGNoYXIgX191c2VyICopIGFyZywgKGNoYXIgKikgJnViZF9pZCwKIAkJCQkgc2l6ZW9mKHViZF9pZCkpKQogCQkJcmV0dXJuKC1FRkFVTFQpOwpAQCAtMTM1Myw4ICsxMzg0LDggQEAKICAqLwogaW50IGtlcm5lbF9mZCA9IC0xOwogCi0vKiBPbmx5IGNoYW5nZWQgYnkgdGhlIGlvIHRocmVhZCAqLwotaW50IGlvX2NvdW50ID0gMDsKKy8qIE9ubHkgY2hhbmdlZCBieSB0aGUgaW8gdGhyZWFkLiBYWFg6IGN1cnJlbnRseSB1bnVzZWQuICovCitzdGF0aWMgaW50IGlvX2NvdW50ID0gMDsKIAogaW50IGlvX3RocmVhZCh2b2lkICphcmcpCiB7CmRpZmYgLS1naXQgYS9hcmNoL3VtL2RyaXZlcnMveHRlcm0uYyBiL2FyY2gvdW0vZHJpdmVycy94dGVybS5jCmluZGV4IDM4NmY4YjkuLjg1MDIyMWQgMTAwNjQ0Ci0tLSBhL2FyY2gvdW0vZHJpdmVycy94dGVybS5jCisrKyBiL2FyY2gvdW0vZHJpdmVycy94dGVybS5jCkBAIC0xMzYsOCArMTM2LDYgQEAKIAkJcmV0dXJuKHBpZCk7CiAJfQogCi0JaWYoZGF0YS0+c3RhY2sgPT0gMCkgZnJlZV9zdGFjayhzdGFjaywgMCk7Ci0KIAlpZiAoZGF0YS0+ZGlyZWN0X3JjdikgewogCQluZXcgPSBvc19yY3ZfZmQoZmQsICZkYXRhLT5oZWxwZXJfcGlkKTsKIAl9IGVsc2UgewpkaWZmIC0tZ2l0IGEvYXJjaC91bS9pbmNsdWRlL2NvbW1vbi1vZmZzZXRzLmggYi9hcmNoL3VtL2luY2x1ZGUvY29tbW9uLW9mZnNldHMuaAppbmRleCAzNTYzOTBkLi40NjExNzVmIDEwMDY0NAotLS0gYS9hcmNoL3VtL2luY2x1ZGUvY29tbW9uLW9mZnNldHMuaAorKysgYi9hcmNoL3VtL2luY2x1ZGUvY29tbW9uLW9mZnNldHMuaApAQCAtMSw5ICsxLDE2IEBACiAvKiBmb3IgdXNlIGJ5IHN5cy0kU1VCQVJDSC9rZXJuZWwtb2Zmc2V0cy5jICovCiAKK0RFRklORShLRVJORUxfTUFEVl9SRU1PVkUsIE1BRFZfUkVNT1ZFKTsKKyNpZmRlZiBDT05GSUdfTU9ERV9UVAorT0ZGU0VUKEhPU1RfVEFTS19FWFRFUk5fUElELCB0YXNrX3N0cnVjdCwgdGhyZWFkLm1vZGUudHQuZXh0ZXJuX3BpZCk7CisjZW5kaWYKKwogT0ZGU0VUKEhPU1RfVEFTS19SRUdTLCB0YXNrX3N0cnVjdCwgdGhyZWFkLnJlZ3MpOwogT0ZGU0VUKEhPU1RfVEFTS19QSUQsIHRhc2tfc3RydWN0LCBwaWQpOworCiBERUZJTkUoVU1fS0VSTl9QQUdFX1NJWkUsIFBBR0VfU0laRSk7CiBERUZJTkUoVU1fTlNFQ19QRVJfU0VDLCBOU0VDX1BFUl9TRUMpOworCiBERUZJTkVfU1RSKFVNX0tFUk5fRU1FUkcsIEtFUk5fRU1FUkcpOwogREVGSU5FX1NUUihVTV9LRVJOX0FMRVJULCBLRVJOX0FMRVJUKTsKIERFRklORV9TVFIoVU1fS0VSTl9DUklULCBLRVJOX0NSSVQpOwpAQCAtMTIsNiArMTksMTAgQEAKIERFRklORV9TVFIoVU1fS0VSTl9OT1RJQ0UsIEtFUk5fTk9USUNFKTsKIERFRklORV9TVFIoVU1fS0VSTl9JTkZPLCBLRVJOX0lORk8pOwogREVGSU5FX1NUUihVTV9LRVJOX0RFQlVHLCBLRVJOX0RFQlVHKTsKKwogREVGSU5FKFVNX0VMRl9DTEFTUywgRUxGX0NMQVNTKTsKIERFRklORShVTV9FTEZDTEFTUzMyLCBFTEZDTEFTUzMyKTsKIERFRklORShVTV9FTEZDTEFTUzY0LCBFTEZDTEFTUzY0KTsKKworLyogRm9yIGNyeXB0byBhc3NlbWJsZXIgY29kZS4gKi8KK0RFRklORShjcnlwdG9fdGZtX2N0eF9vZmZzZXQsIG9mZnNldG9mKHN0cnVjdCBjcnlwdG9fdGZtLCBfX2NydF9jdHgpKTsKZGlmZiAtLWdpdCBhL2FyY2gvdW0vaW5jbHVkZS9rZXJuX3V0aWwuaCBiL2FyY2gvdW0vaW5jbHVkZS9rZXJuX3V0aWwuaAppbmRleCA1OWNmYTllLi5jZWM5ZmNjIDEwMDY0NAotLS0gYS9hcmNoL3VtL2luY2x1ZGUva2Vybl91dGlsLmgKKysrIGIvYXJjaC91bS9pbmNsdWRlL2tlcm5fdXRpbC5oCkBAIC02LDcgKzYsNiBAQAogI2lmbmRlZiBfX0tFUk5fVVRJTF9IX18KICNkZWZpbmUgX19LRVJOX1VUSUxfSF9fCiAKLSNpbmNsdWRlICJsaW51eC90aHJlYWRzLmgiCiAjaW5jbHVkZSAic3lzZGVwL3B0cmFjZS5oIgogI2luY2x1ZGUgInN5c2RlcC9mYXVsdGluZm8uaCIKIApkaWZmIC0tZ2l0IGEvYXJjaC91bS9pbmNsdWRlL2xvbmdqbXAuaCBiL2FyY2gvdW0vaW5jbHVkZS9sb25nam1wLmgKaW5kZXggZTkzYzZkMy4uZTg2MGJjNTg0IDEwMDY0NAotLS0gYS9hcmNoL3VtL2luY2x1ZGUvbG9uZ2ptcC5oCisrKyBiL2FyY2gvdW0vaW5jbHVkZS9sb25nam1wLmgKQEAgLTEyLDcgKzEyLDggQEAKIH0gd2hpbGUoMCkKIAogI2RlZmluZSBVTUxfU0VUSk1QKGJ1ZikgKHsgXAotCWludCBuLCBlbmFibGU7CSAgIFwKKwlpbnQgbjsJICAgXAorCXZvbGF0aWxlIGludCBlbmFibGU7CVwKIAllbmFibGUgPSBnZXRfc2lnbmFscygpOyBcCiAJbiA9IHNldGptcCgqYnVmKTsgXAogCWlmKG4gIT0gMCkgXApkaWZmIC0tZ2l0IGEvYXJjaC91bS9pbmNsdWRlL21jb25zb2xlLmggYi9hcmNoL3VtL2luY2x1ZGUvbWNvbnNvbGUuaAppbmRleCA1OGY2N2QzLi4yNjY2ODE1IDEwMDY0NAotLS0gYS9hcmNoL3VtL2luY2x1ZGUvbWNvbnNvbGUuaAorKysgYi9hcmNoL3VtL2luY2x1ZGUvbWNvbnNvbGUuaApAQCAtNjEsNiArNjEsNyBAQAogCiAJc3RydWN0IG1jb25zb2xlX3JlcXVlc3QgcmVxdWVzdDsKIAlzdHJ1Y3QgbWNvbnNvbGVfY29tbWFuZCAqY21kOworCXVuaW9uIHVtbF9wdF9yZWdzIHJlZ3M7CiB9OwogCiBleHRlcm4gY2hhciBtY29uc29sZV9zb2NrZXRfbmFtZVtdOwpkaWZmIC0tZ2l0IGEvYXJjaC91bS9pbmNsdWRlL21jb25zb2xlX2tlcm4uaCBiL2FyY2gvdW0vaW5jbHVkZS9tY29uc29sZV9rZXJuLmgKaW5kZXggZDBiNjkwMS4uMWVhNmQ5MjggMTAwNjQ0Ci0tLSBhL2FyY2gvdW0vaW5jbHVkZS9tY29uc29sZV9rZXJuLmgKKysrIGIvYXJjaC91bS9pbmNsdWRlL21jb25zb2xlX2tlcm4uaApAQCAtMTQsNiArMTQsNyBAQAogCXN0cnVjdCBtY19yZXF1ZXN0IHJlcXVlc3Q7CiB9OwogCisvKiBBbGwgdGhlc2UgbWV0aG9kcyBhcmUgY2FsbGVkIGluIHByb2Nlc3MgY29udGV4dC4gKi8KIHN0cnVjdCBtY19kZXZpY2UgewogCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKIAljaGFyICpuYW1lOwpkaWZmIC0tZ2l0IGEvYXJjaC91bS9pbmNsdWRlL29zLmggYi9hcmNoL3VtL2luY2x1ZGUvb3MuaAppbmRleCAxMjBjYTIxLi42NTE2ZjZkIDEwMDY0NAotLS0gYS9hcmNoL3VtL2luY2x1ZGUvb3MuaAorKysgYi9hcmNoL3VtL2luY2x1ZGUvb3MuaApAQCAtMjAxLDYgKzIwMSw3IEBACiAKICNpZmRlZiBVTUxfQ09ORklHX01PREVfVFQKIGV4dGVybiB2b2lkIGluaXRfbmV3X3RocmVhZF9zdGFjayh2b2lkICpzaWdfc3RhY2ssIHZvaWQgKCp1c3IxX2hhbmRsZXIpKGludCkpOworZXh0ZXJuIHZvaWQgc3RvcCh2b2lkKTsKICNlbmRpZgogZXh0ZXJuIHZvaWQgaW5pdF9uZXdfdGhyZWFkX3NpZ25hbHModm9pZCk7CiBleHRlcm4gaW50IHJ1bl9rZXJuZWxfdGhyZWFkKGludCAoKmZuKSh2b2lkICopLCB2b2lkICphcmcsIHZvaWQgKipqbXBfcHRyKTsKZGlmZiAtLWdpdCBhL2FyY2gvdW0vaW5jbHVkZS9zeXNkZXAtaTM4Ni9iYXJyaWVyLmggYi9hcmNoL3VtL2luY2x1ZGUvc3lzZGVwLWkzODYvYmFycmllci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI1OGQ1MmMKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3VtL2luY2x1ZGUvc3lzZGVwLWkzODYvYmFycmllci5oCkBAIC0wLDAgKzEsOSBAQAorI2lmbmRlZiBfX1NZU0RFUF9JMzg2X0JBUlJJRVJfSAorI2RlZmluZSBfX1NZU0RFUF9JMzg2X0JBUlJJRVJfSAorCisvKiBDb3BpZWQgZnJvbSBpbmNsdWRlL2FzbS1pMzg2IGZvciB1c2UgYnkgdXNlcnNwYWNlLiAgaTM4NiBoYXMgdGhlIG9wdGlvbgorICogb2YgdXNpbmcgbWZlbmNlLCBidXQgSSdtIGp1c3QgdXNpbmcgdGhpcywgd2hpY2ggd29ya3MgZXZlcnl3aGVyZSwgZm9yIG5vdy4KKyAqLworI2RlZmluZSBtYigpIGFzbSB2b2xhdGlsZSgibG9jazsgYWRkbCAkMCwwKCVlc3ApIikKKworI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL3VtL2luY2x1ZGUvc3lzZGVwLWkzODYva2VybmVsLW9mZnNldHMuaCBiL2FyY2gvdW0vaW5jbHVkZS9zeXNkZXAtaTM4Ni9rZXJuZWwtb2Zmc2V0cy5oCmluZGV4IDJjMTNkZTMuLjk3ZWM5ZDggMTAwNjQ0Ci0tLSBhL2FyY2gvdW0vaW5jbHVkZS9zeXNkZXAtaTM4Ni9rZXJuZWwtb2Zmc2V0cy5oCisrKyBiL2FyY2gvdW0vaW5jbHVkZS9zeXNkZXAtaTM4Ni9rZXJuZWwtb2Zmc2V0cy5oCkBAIC0xLDYgKzEsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3N0ZGRlZi5oPgogI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CiAjaW5jbHVkZSA8bGludXgvZWxmLmg+CisjaW5jbHVkZSA8bGludXgvY3J5cHRvLmg+CiAjaW5jbHVkZSA8YXNtL21tYW4uaD4KIAogI2RlZmluZSBERUZJTkUoc3ltLCB2YWwpIFwKQEAgLTE3LDkgKzE4LDUgQEAKIHZvaWQgZm9vKHZvaWQpCiB7CiAJT0ZGU0VUKEhPU1RfVEFTS19ERUJVR1JFR1MsIHRhc2tfc3RydWN0LCB0aHJlYWQuYXJjaC5kZWJ1Z3JlZ3MpOwotCURFRklORShLRVJORUxfTUFEVl9SRU1PVkUsIE1BRFZfUkVNT1ZFKTsKLSNpZmRlZiBDT05GSUdfTU9ERV9UVAotCU9GRlNFVChIT1NUX1RBU0tfRVhURVJOX1BJRCwgdGFza19zdHJ1Y3QsIHRocmVhZC5tb2RlLnR0LmV4dGVybl9waWQpOwotI2VuZGlmCiAjaW5jbHVkZSA8Y29tbW9uLW9mZnNldHMuaD4KIH0KZGlmZiAtLWdpdCBhL2FyY2gvdW0vaW5jbHVkZS9zeXNkZXAteDg2XzY0L2JhcnJpZXIuaCBiL2FyY2gvdW0vaW5jbHVkZS9zeXNkZXAteDg2XzY0L2JhcnJpZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YjYxMGJlCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC91bS9pbmNsdWRlL3N5c2RlcC14ODZfNjQvYmFycmllci5oCkBAIC0wLDAgKzEsNyBAQAorI2lmbmRlZiBfX1NZU0RFUF9YODZfNjRfQkFSUklFUl9ICisjZGVmaW5lIF9fU1lTREVQX1g4Nl82NF9CQVJSSUVSX0gKKworLyogQ29waWVkIGZyb20gaW5jbHVkZS9hc20teDg2XzY0IGZvciB1c2UgYnkgdXNlcnNwYWNlLiAqLworI2RlZmluZSBtYigpIAlhc20gdm9sYXRpbGUoIm1mZW5jZSI6OjoibWVtb3J5IikKKworI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL3VtL2luY2x1ZGUvc3lzZGVwLXg4Nl82NC9rZXJuZWwtb2Zmc2V0cy5oIGIvYXJjaC91bS9pbmNsdWRlL3N5c2RlcC14ODZfNjQva2VybmVsLW9mZnNldHMuaAppbmRleCA5MWQxMjlmLi5hMzA3MjM3IDEwMDY0NAotLS0gYS9hcmNoL3VtL2luY2x1ZGUvc3lzZGVwLXg4Nl82NC9rZXJuZWwtb2Zmc2V0cy5oCisrKyBiL2FyY2gvdW0vaW5jbHVkZS9zeXNkZXAteDg2XzY0L2tlcm5lbC1vZmZzZXRzLmgKQEAgLTIsNiArMiw3IEBACiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KICNpbmNsdWRlIDxsaW51eC90aW1lLmg+CiAjaW5jbHVkZSA8bGludXgvZWxmLmg+CisjaW5jbHVkZSA8bGludXgvY3J5cHRvLmg+CiAjaW5jbHVkZSA8YXNtL3BhZ2UuaD4KICNpbmNsdWRlIDxhc20vbW1hbi5oPgogCkBAIC0xOCw5ICsxOSw1IEBACiAKIHZvaWQgZm9vKHZvaWQpCiB7Ci0JREVGSU5FKEtFUk5FTF9NQURWX1JFTU9WRSwgTUFEVl9SRU1PVkUpOwotI2lmZGVmIENPTkZJR19NT0RFX1RUCi0JT0ZGU0VUKEhPU1RfVEFTS19FWFRFUk5fUElELCB0YXNrX3N0cnVjdCwgdGhyZWFkLm1vZGUudHQuZXh0ZXJuX3BpZCk7Ci0jZW5kaWYKICNpbmNsdWRlIDxjb21tb24tb2Zmc2V0cy5oPgogfQpkaWZmIC0tZ2l0IGEvYXJjaC91bS9pbmNsdWRlL3VtX21hbGxvYy5oIGIvYXJjaC91bS9pbmNsdWRlL3VtX21hbGxvYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAzNjNhOWIKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3VtL2luY2x1ZGUvdW1fbWFsbG9jLmgKQEAgLTAsMCArMSwxNyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNSBQYW9sbyAnQmxhaXNvcmJsYWRlJyBHaWFycnVzc28gPGJsYWlzb3JibGFkZUB5YWhvby5pdD4KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEwKKyAqLworCisjaWZuZGVmIF9fVU1fTUFMTE9DX0hfXworI2RlZmluZSBfX1VNX01BTExPQ19IX18KKworZXh0ZXJuIHZvaWQgKnVtX2ttYWxsb2MoaW50IHNpemUpOworZXh0ZXJuIHZvaWQgKnVtX2ttYWxsb2NfYXRvbWljKGludCBzaXplKTsKK2V4dGVybiB2b2lkIGtmcmVlKGNvbnN0IHZvaWQgKnB0cik7CisKK2V4dGVybiB2b2lkICp1bV92bWFsbG9jKGludCBzaXplKTsKK2V4dGVybiB2b2lkICp1bV92bWFsbG9jX2F0b21pYyhpbnQgc2l6ZSk7CitleHRlcm4gdm9pZCB2ZnJlZSh2b2lkICpwdHIpOworCisjZW5kaWYgLyogX19VTV9NQUxMT0NfSF9fICovCmRpZmYgLS1naXQgYS9hcmNoL3VtL2luY2x1ZGUvdXNlci5oIGIvYXJjaC91bS9pbmNsdWRlL3VzZXIuaAppbmRleCAzOWY4Yzg4Li5hY2FkY2UzIDEwMDY0NAotLS0gYS9hcmNoL3VtL2luY2x1ZGUvdXNlci5oCisrKyBiL2FyY2gvdW0vaW5jbHVkZS91c2VyLmgKQEAgLTExLDE3ICsxMSwxMSBAQAogZXh0ZXJuIGludCBwcmludGsoY29uc3QgY2hhciAqZm10LCAuLi4pCiAJX19hdHRyaWJ1dGVfXyAoKGZvcm1hdCAocHJpbnRmLCAxLCAyKSkpOwogZXh0ZXJuIHZvaWQgc2NoZWR1bGUodm9pZCk7Ci1leHRlcm4gdm9pZCAqdW1fa21hbGxvYyhpbnQgc2l6ZSk7Ci1leHRlcm4gdm9pZCAqdW1fa21hbGxvY19hdG9taWMoaW50IHNpemUpOwotZXh0ZXJuIHZvaWQga2ZyZWUodm9pZCAqcHRyKTsKIGV4dGVybiBpbnQgaW5fYXRvbihjaGFyICpzdHIpOwogZXh0ZXJuIGludCBvcGVuX2dkYl9jaGFuKHZvaWQpOwogLyogVGhlc2UgdXNlIHNpemVfdCwgaG93ZXZlciB1bnNpZ25lZCBsb25nIGlzIGNvcnJlY3Qgb24gYm90aCBpMzg2IGFuZCB4ODZfNjQuICovCiBleHRlcm4gdW5zaWduZWQgbG9uZyBzdHJsY3B5KGNoYXIgKiwgY29uc3QgY2hhciAqLCB1bnNpZ25lZCBsb25nKTsKIGV4dGVybiB1bnNpZ25lZCBsb25nIHN0cmxjYXQoY2hhciAqLCBjb25zdCBjaGFyICosIHVuc2lnbmVkIGxvbmcpOwotZXh0ZXJuIHZvaWQgKnVtX3ZtYWxsb2MoaW50IHNpemUpOwotZXh0ZXJuIHZvaWQgKnVtX3ZtYWxsb2NfYXRvbWljKGludCBzaXplKTsKLWV4dGVybiB2b2lkIHZmcmVlKHZvaWQgKnB0cik7CiAKICNlbmRpZgogCmRpZmYgLS1naXQgYS9hcmNoL3VtL2luY2x1ZGUvdXNlcl91dGlsLmggYi9hcmNoL3VtL2luY2x1ZGUvdXNlcl91dGlsLmgKaW5kZXggODAyZDc4NC4uMDY2MjVmZSAxMDA2NDQKLS0tIGEvYXJjaC91bS9pbmNsdWRlL3VzZXJfdXRpbC5oCisrKyBiL2FyY2gvdW0vaW5jbHVkZS91c2VyX3V0aWwuaApAQCAtNTIsNyArNTIsNiBAQAogZXh0ZXJuIHZvaWQgc2V0X2NtZGxpbmUoY2hhciAqY21kKTsKIGV4dGVybiB2b2lkIGlucHV0X2NiKHZvaWQgKCpwcm9jKSh2b2lkICopLCB2b2lkICphcmcsIGludCBhcmdfbGVuKTsKIGV4dGVybiBpbnQgZ2V0X3B0eSh2b2lkKTsKLWV4dGVybiB2b2lkICp1bV9rbWFsbG9jKGludCBzaXplKTsKIGV4dGVybiBpbnQgc3dpdGNoZXJvbyhpbnQgZmQsIGludCBwcm90LCB2b2lkICpmcm9tLCB2b2lkICp0bywgaW50IHNpemUpOwogZXh0ZXJuIHZvaWQgZG9fZXhlYyhpbnQgb2xkX3BpZCwgaW50IG5ld19waWQpOwogZXh0ZXJuIHZvaWQgdHJhY2VyX3BhbmljKGNoYXIgKm1zZywgLi4uKQpkaWZmIC0tZ2l0IGEvYXJjaC91bS9rZXJuZWwvZHluLmxkcy5TIGIvYXJjaC91bS9rZXJuZWwvZHluLmxkcy5TCmluZGV4IDY4ZWQyNGQuLmUzNmY5MmIgMTAwNjQ0Ci0tLSBhL2FyY2gvdW0va2VybmVsL2R5bi5sZHMuUworKysgYi9hcmNoL3VtL2tlcm5lbC9keW4ubGRzLlMKQEAgLTE0LDYgKzE0LDcgQEAKICAgICogaXMgcmVtYXBwZWQuKi8KICAgX19iaW5hcnlfc3RhcnQgPSAuOwogICAuID0gQUxJR04oNDA5Nik7CQkvKiBJbml0IGNvZGUgYW5kIGRhdGEgKi8KKyAgX3RleHQgPSAuOwogICBfc3RleHQgPSAuOwogICBfX2luaXRfYmVnaW4gPSAuOwogICAuaW5pdC50ZXh0IDogewpkaWZmIC0tZ2l0IGEvYXJjaC91bS9rZXJuZWwvaXJxLmMgYi9hcmNoL3VtL2tlcm5lbC9pcnEuYwppbmRleCBlZjI1OTU2Li41YzFlNjExIDEwMDY0NAotLS0gYS9hcmNoL3VtL2tlcm5lbC9pcnEuYworKysgYi9hcmNoL3VtL2tlcm5lbC9pcnEuYwpAQCAtMzEsNiArMzEsNyBAQAogI2luY2x1ZGUgImlycV9rZXJuLmgiCiAjaW5jbHVkZSAib3MuaCIKICNpbmNsdWRlICJzaWdpby5oIgorI2luY2x1ZGUgInVtX21hbGxvYy5oIgogI2luY2x1ZGUgIm1pc2NfY29uc3RhbnRzLmgiCiAKIC8qCmRpZmYgLS1naXQgYS9hcmNoL3VtL2tlcm5lbC9wcm9jZXNzLmMgYi9hcmNoL3VtL2tlcm5lbC9wcm9jZXNzLmMKaW5kZXggZmU2YzY0YS4uMzQ4YjI3MiAxMDA2NDQKLS0tIGEvYXJjaC91bS9rZXJuZWwvcHJvY2Vzcy5jCisrKyBiL2FyY2gvdW0va2VybmVsL3Byb2Nlc3MuYwpAQCAtNDYsNiArNDYsNyBAQAogI2luY2x1ZGUgIm1vZGUuaCIKICNpbmNsdWRlICJtb2RlX2tlcm4uaCIKICNpbmNsdWRlICJjaG9vc2UtbW9kZS5oIgorI2luY2x1ZGUgInVtX21hbGxvYy5oIgogCiAvKiBUaGlzIGlzIGEgcGVyLWNwdSBhcnJheS4gIEEgcHJvY2Vzc29yIG9ubHkgbW9kaWZpZXMgaXRzIGVudHJ5IGFuZCBpdCBvbmx5CiAgKiBjYXJlcyBhYm91dCBpdHMgZW50cnksIHNvIGl0J3MgT0sgaWYgYW5vdGhlciBwcm9jZXNzb3IgaXMgbW9kaWZ5aW5nIGl0cwpkaWZmIC0tZ2l0IGEvYXJjaC91bS9rZXJuZWwvc2thcy9tbXUuYyBiL2FyY2gvdW0va2VybmVsL3NrYXMvbW11LmMKaW5kZXggYzE3ZWRkYy4uMmM2ZDA5MCAxMDA2NDQKLS0tIGEvYXJjaC91bS9rZXJuZWwvc2thcy9tbXUuYworKysgYi9hcmNoL3VtL2tlcm5lbC9za2FzL21tdS5jCkBAIC02MCwxMCArNjAsNyBAQAogI2VuZGlmCiAKIAkqcHRlID0gbWtfcHRlKHZpcnRfdG9fcGFnZShrZXJuZWwpLCBfX3BncHJvdChfUEFHRV9QUkVTRU5UKSk7Ci0JLyogVGhpcyBpcyB3cm9uZyBmb3IgdGhlIGNvZGUgcGFnZSwgYnV0IGl0IGRvZXNuJ3QgbWF0dGVyIHNpbmNlIHRoZQotCSAqIHN0dWIgaXMgbWFwcGVkIGJ5IGhhbmQgd2l0aCB0aGUgY29ycmVjdCBwZXJtaXNzaW9ucy4KLQkgKi8KLQkqcHRlID0gcHRlX21rd3JpdGUoKnB0ZSk7CisJKnB0ZSA9IHB0ZV9ta3JlYWQoKnB0ZSk7CiAJcmV0dXJuKDApOwogCiAgb3V0X3BtZDoKZGlmZiAtLWdpdCBhL2FyY2gvdW0va2VybmVsL3R0L3RyYWNlci5jIGIvYXJjaC91bS9rZXJuZWwvdHQvdHJhY2VyLmMKaW5kZXggOTg4MjM0Mi4uYjkxOTUzNSAxMDA2NDQKLS0tIGEvYXJjaC91bS9rZXJuZWwvdHQvdHJhY2VyLmMKKysrIGIvYXJjaC91bS9rZXJuZWwvdHQvdHJhY2VyLmMKQEAgLTE3Niw3ICsxNzYsNiBAQAogaW50IHNpZ25hbF9pbmRleFszMl07CiBpbnQgbnNpZ25hbHMgPSAwOwogaW50IGRlYnVnX3RyYWNlID0gMDsKLWV4dGVybiBpbnQgaW9fbnNpZ25hbHMsIGlvX2NvdW50LCBpbnRyX2NvdW50OwogCiBleHRlcm4gdm9pZCBzaWduYWxfdXNyMShpbnQgc2lnKTsKIApkaWZmIC0tZ2l0IGEvYXJjaC91bS9rZXJuZWwvdHQvdWFjY2Vzc191c2VyLmMgYi9hcmNoL3VtL2tlcm5lbC90dC91YWNjZXNzX3VzZXIuYwppbmRleCA2YzkyYmJjLi5lZDFhYmNmIDEwMDY0NAotLS0gYS9hcmNoL3VtL2tlcm5lbC90dC91YWNjZXNzX3VzZXIuYworKysgYi9hcmNoL3VtL2tlcm5lbC90dC91YWNjZXNzX3VzZXIuYwpAQCAtNCwxMyArNCwxMyBAQAogICogTGljZW5zZWQgdW5kZXIgdGhlIEdQTAogICovCiAKLSNpbmNsdWRlIDxzZXRqbXAuaD4KICNpbmNsdWRlIDxzdHJpbmcuaD4KICNpbmNsdWRlICJ1c2VyX3V0aWwuaCIKICNpbmNsdWRlICJ1bWxfdWFjY2Vzcy5oIgogI2luY2x1ZGUgInRhc2suaCIKICNpbmNsdWRlICJrZXJuX3V0aWwuaCIKICNpbmNsdWRlICJvcy5oIgorI2luY2x1ZGUgImxvbmdqbXAuaCIKIAogaW50IF9fZG9fY29weV9mcm9tX3VzZXIodm9pZCAqdG8sIGNvbnN0IHZvaWQgKmZyb20sIGludCBuLAogCQkJdm9pZCAqKmZhdWx0X2FkZHIsIHZvaWQgKipmYXVsdF9jYXRjaGVyKQpAQCAtODAsMTAgKzgwLDEwIEBACiAJc3RydWN0IHR0X3JlZ3Mgc2F2ZSA9IFRBU0tfUkVHUyhnZXRfY3VycmVudCgpKS0+dHQ7CiAJaW50IHJldDsKIAl1bnNpZ25lZCBsb25nICpmYWRkcnAgPSAodW5zaWduZWQgbG9uZyAqKWZhdWx0X2FkZHI7Ci0Jc2lnam1wX2J1ZiBqYnVmOworCWptcF9idWYgamJ1ZjsKIAogCSpmYXVsdF9jYXRjaGVyID0gJmpidWY7Ci0JaWYoc2lnc2V0am1wKGpidWYsIDEpID09IDApCisJaWYoVU1MX1NFVEpNUCgmamJ1ZikgPT0gMCkKIAkJcmV0ID0gc3RybGVuKHN0cikgKyAxOwogCWVsc2UgcmV0ID0gKmZhZGRycCAtICh1bnNpZ25lZCBsb25nKSBzdHI7CiAKZGlmZiAtLWdpdCBhL2FyY2gvdW0va2VybmVsL3VtbC5sZHMuUyBiL2FyY2gvdW0va2VybmVsL3VtbC5sZHMuUwppbmRleCA4ZWNhNDdhLi5mNjMwMTI3IDEwMDY0NAotLS0gYS9hcmNoL3VtL2tlcm5lbC91bWwubGRzLlMKKysrIGIvYXJjaC91bS9rZXJuZWwvdW1sLmxkcy5TCkBAIC0yNSw2ICsyNSw3IEBACiAgIC4gPSBBTElHTig0MDk2KTsJCS8qIEluaXQgY29kZSBhbmQgZGF0YSAqLwogI2VuZGlmCiAKKyAgX3RleHQgPSAuOwogICBfc3RleHQgPSAuOwogICBfX2luaXRfYmVnaW4gPSAuOwogICAuaW5pdC50ZXh0IDogewpkaWZmIC0tZ2l0IGEvYXJjaC91bS9vcy1MaW51eC9kcml2ZXJzL2V0aGVydGFwX3VzZXIuYyBiL2FyY2gvdW0vb3MtTGludXgvZHJpdmVycy9ldGhlcnRhcF91c2VyLmMKaW5kZXggZjU1OWJkZjcuLjg2Mzk4MWIgMTAwNjQ0Ci0tLSBhL2FyY2gvdW0vb3MtTGludXgvZHJpdmVycy9ldGhlcnRhcF91c2VyLmMKKysrIGIvYXJjaC91bS9vcy1MaW51eC9kcml2ZXJzL2V0aGVydGFwX3VzZXIuYwpAQCAtMjAsNiArMjAsNyBAQAogI2luY2x1ZGUgIm5ldF91c2VyLmgiCiAjaW5jbHVkZSAiZXRhcC5oIgogI2luY2x1ZGUgIm9zLmgiCisjaW5jbHVkZSAidW1fbWFsbG9jLmgiCiAKICNkZWZpbmUgTUFYX1BBQ0tFVCBFVEhfTUFYX1BBQ0tFVAogCmRpZmYgLS1naXQgYS9hcmNoL3VtL29zLUxpbnV4L2hlbHBlci5jIGIvYXJjaC91bS9vcy1MaW51eC9oZWxwZXIuYwppbmRleCBjZDE1YjlkLi5kMTMyOTljIDEwMDY0NAotLS0gYS9hcmNoL3VtL29zLUxpbnV4L2hlbHBlci5jCisrKyBiL2FyY2gvdW0vb3MtTGludXgvaGVscGVyLmMKQEAgLTM1LDIyICszNSwyMyBAQAogCWNoYXIgKiphcmd2ID0gZGF0YS0+YXJndjsKIAlpbnQgZXJydmFsOwogCi0JaWYoaGVscGVyX3BhdXNlKXsKKwlpZiAoaGVscGVyX3BhdXNlKXsKIAkJc2lnbmFsKFNJR0hVUCwgaGVscGVyX2h1cCk7CiAJCXBhdXNlKCk7CiAJfQotCWlmKGRhdGEtPnByZV9leGVjICE9IE5VTEwpCisJaWYgKGRhdGEtPnByZV9leGVjICE9IE5VTEwpCiAJCSgqZGF0YS0+cHJlX2V4ZWMpKGRhdGEtPnByZV9kYXRhKTsKIAlleGVjdnAoYXJndlswXSwgYXJndik7CiAJZXJydmFsID0gLWVycm5vOwogCXByaW50aygiaGVscGVyX2NoaWxkIC0gZXhlY3ZlIG9mICclcycgZmFpbGVkIC0gZXJybm8gPSAlZFxuIiwgYXJndlswXSwgZXJybm8pOwogCW9zX3dyaXRlX2ZpbGUoZGF0YS0+ZmQsICZlcnJ2YWwsIHNpemVvZihlcnJ2YWwpKTsKIAlraWxsKG9zX2dldHBpZCgpLCBTSUdLSUxMKTsKLQlyZXR1cm4oMCk7CisJcmV0dXJuIDA7CiB9CiAKIC8qIFJldHVybnMgZWl0aGVyIHRoZSBwaWQgb2YgdGhlIGNoaWxkIHByb2Nlc3Mgd2UgcnVuIG9yIC1FKiBvbiBmYWlsdXJlLgotICogWFhYIFRoZSBhbGxvY19zdGFjayBoZXJlIGJyZWFrcyBpZiB0aGlzIGlzIGNhbGxlZCBpbiB0aGUgdHJhY2luZyB0aHJlYWQgKi8KKyAqIFhYWCBUaGUgYWxsb2Nfc3RhY2sgaGVyZSBicmVha3MgaWYgdGhpcyBpcyBjYWxsZWQgaW4gdGhlIHRyYWNpbmcgdGhyZWFkLCBzbworICogd2UgbmVlZCB0byByZWNlaXZlIGEgcHJlYWxsb2NhdGVkIHN0YWNrIChhIGxvY2FsIGJ1ZmZlciBpcyBvaykuICovCiBpbnQgcnVuX2hlbHBlcih2b2lkICgqcHJlX2V4ZWMpKHZvaWQgKiksIHZvaWQgKnByZV9kYXRhLCBjaGFyICoqYXJndiwKIAkgICAgICAgdW5zaWduZWQgbG9uZyAqc3RhY2tfb3V0KQogewpAQCAtNTgsMjAgKzU5LDIxIEBACiAJdW5zaWduZWQgbG9uZyBzdGFjaywgc3A7CiAJaW50IHBpZCwgZmRzWzJdLCByZXQsIG47CiAKLQlpZigoc3RhY2tfb3V0ICE9IE5VTEwpICYmICgqc3RhY2tfb3V0ICE9IDApKQorCWlmICgoc3RhY2tfb3V0ICE9IE5VTEwpICYmICgqc3RhY2tfb3V0ICE9IDApKQogCQlzdGFjayA9ICpzdGFja19vdXQ7Ci0JZWxzZSBzdGFjayA9IGFsbG9jX3N0YWNrKDAsIF9fY2FudF9zbGVlcCgpKTsKLQlpZihzdGFjayA9PSAwKQorCWVsc2UKKwkJc3RhY2sgPSBhbGxvY19zdGFjaygwLCBfX2NhbnRfc2xlZXAoKSk7CisJaWYgKHN0YWNrID09IDApCiAJCXJldHVybiAtRU5PTUVNOwogCiAJcmV0ID0gb3NfcGlwZShmZHMsIDEsIDApOwotCWlmKHJldCA8IDApeworCWlmIChyZXQgPCAwKSB7CiAJCXByaW50aygicnVuX2hlbHBlciA6IHBpcGUgZmFpbGVkLCByZXQgPSAlZFxuIiwgLXJldCk7CiAJCWdvdG8gb3V0X2ZyZWU7CiAJfQogCiAJcmV0ID0gb3Nfc2V0X2V4ZWNfY2xvc2UoZmRzWzFdLCAxKTsKLQlpZihyZXQgPCAwKXsKKwlpZiAocmV0IDwgMCkgewogCQlwcmludGsoInJ1bl9oZWxwZXIgOiBzZXR0aW5nIEZEX0NMT0VYRUMgZmFpbGVkLCByZXQgPSAlZFxuIiwKIAkJICAgICAgIC1yZXQpOwogCQlnb3RvIG91dF9jbG9zZTsKQEAgLTgzLDcgKzg1LDcgQEAKIAlkYXRhLmFyZ3YgPSBhcmd2OwogCWRhdGEuZmQgPSBmZHNbMV07CiAJcGlkID0gY2xvbmUoaGVscGVyX2NoaWxkLCAodm9pZCAqKSBzcCwgQ0xPTkVfVk0gfCBTSUdDSExELCAmZGF0YSk7Ci0JaWYocGlkIDwgMCl7CisJaWYgKHBpZCA8IDApIHsKIAkJcmV0ID0gLWVycm5vOwogCQlwcmludGsoInJ1bl9oZWxwZXIgOiBjbG9uZSBmYWlsZWQsIGVycm5vID0gJWRcbiIsIGVycm5vKTsKIAkJZ290byBvdXRfY2xvc2U7CkBAIC05NSwxMCArOTcsMTAgQEAKIAkvKiBSZWFkIHRoZSBlcnJubyB2YWx1ZSBmcm9tIHRoZSBjaGlsZCwgaWYgdGhlIGV4ZWMgZmFpbGVkLCBvciBnZXQgMCBpZgogCSAqIHRoZSBleGVjIHN1Y2NlZWRlZCBiZWNhdXNlIHRoZSBwaXBlIGZkIHdhcyBzZXQgYXMgY2xvc2Utb24tZXhlYy4gKi8KIAluID0gb3NfcmVhZF9maWxlKGZkc1swXSwgJnJldCwgc2l6ZW9mKHJldCkpOwotCWlmKG4gPT0gMCkKKwlpZiAobiA9PSAwKSB7CiAJCXJldCA9IHBpZDsKLQllbHNlIHsKLQkJaWYobiA8IDApeworCX0gZWxzZSB7CisJCWlmIChuIDwgMCkgewogCQkJcHJpbnRrKCJydW5faGVscGVyIDogcmVhZCBvbiBwaXBlIGZhaWxlZCwgcmV0ID0gJWRcbiIsCiAJCQkgICAgICAgLW4pOwogCQkJcmV0ID0gbjsKQEAgLTExMiwxMCArMTE0LDkgQEAKIAkJY2xvc2UoZmRzWzFdKTsKIAljbG9zZShmZHNbMF0pOwogb3V0X2ZyZWU6Ci0JaWYoc3RhY2tfb3V0ID09IE5VTEwpCisJaWYgKChzdGFja19vdXQgPT0gTlVMTCkgfHwgKCpzdGFja19vdXQgPT0gMCkpCiAJCWZyZWVfc3RhY2soc3RhY2ssIDApOwotCWVsc2UgKnN0YWNrX291dCA9IHN0YWNrOwotCXJldHVybihyZXQpOworCXJldHVybiByZXQ7CiB9CiAKIGludCBydW5faGVscGVyX3RocmVhZChpbnQgKCpwcm9jKSh2b2lkICopLCB2b2lkICphcmcsIHVuc2lnbmVkIGludCBmbGFncywKQEAgLTEyNSwzMSArMTI2LDMyIEBACiAJaW50IHBpZCwgc3RhdHVzLCBlcnI7CiAKIAlzdGFjayA9IGFsbG9jX3N0YWNrKHN0YWNrX29yZGVyLCBfX2NhbnRfc2xlZXAoKSk7Ci0JaWYoc3RhY2sgPT0gMCkgcmV0dXJuKC1FTk9NRU0pOworCWlmIChzdGFjayA9PSAwKQorCQlyZXR1cm4gLUVOT01FTTsKIAogCXNwID0gc3RhY2sgKyAocGFnZV9zaXplKCkgPDwgc3RhY2tfb3JkZXIpIC0gc2l6ZW9mKHZvaWQgKik7CiAJcGlkID0gY2xvbmUocHJvYywgKHZvaWQgKikgc3AsIGZsYWdzIHwgU0lHQ0hMRCwgYXJnKTsKLQlpZihwaWQgPCAwKXsKKwlpZiAocGlkIDwgMCkgewogCQllcnIgPSAtZXJybm87CiAJCXByaW50aygicnVuX2hlbHBlcl90aHJlYWQgOiBjbG9uZSBmYWlsZWQsIGVycm5vID0gJWRcbiIsCiAJCSAgICAgICBlcnJubyk7CiAJCXJldHVybiBlcnI7CiAJfQotCWlmKHN0YWNrX291dCA9PSBOVUxMKXsKKwlpZiAoc3RhY2tfb3V0ID09IE5VTEwpIHsKIAkJQ0FUQ0hfRUlOVFIocGlkID0gd2FpdHBpZChwaWQsICZzdGF0dXMsIDApKTsKLQkJaWYocGlkIDwgMCl7CisJCWlmIChwaWQgPCAwKSB7CiAJCQllcnIgPSAtZXJybm87CiAJCQlwcmludGsoInJ1bl9oZWxwZXJfdGhyZWFkIC0gd2FpdCBmYWlsZWQsIGVycm5vID0gJWRcbiIsCiAJCQkgICAgICAgZXJybm8pOwogCQkJcGlkID0gZXJyOwogCQl9Ci0JCWlmKCFXSUZFWElURUQoc3RhdHVzKSB8fCAoV0VYSVRTVEFUVVMoc3RhdHVzKSAhPSAwKSkKKwkJaWYgKCFXSUZFWElURUQoc3RhdHVzKSB8fCAoV0VYSVRTVEFUVVMoc3RhdHVzKSAhPSAwKSkKIAkJCXByaW50aygicnVuX2hlbHBlcl90aHJlYWQgLSB0aHJlYWQgcmV0dXJuZWQgc3RhdHVzICIKIAkJCSAgICAgICAiMHgleFxuIiwgc3RhdHVzKTsKIAkJZnJlZV9zdGFjayhzdGFjaywgc3RhY2tfb3JkZXIpOwotCX0KLQllbHNlICpzdGFja19vdXQgPSBzdGFjazsKLQlyZXR1cm4ocGlkKTsKKwl9IGVsc2UKKwkJKnN0YWNrX291dCA9IHN0YWNrOworCXJldHVybiBwaWQ7CiB9CiAKIGludCBoZWxwZXJfd2FpdChpbnQgcGlkKQpAQCAtMTU3LDkgKzE1OSw5IEBACiAJaW50IHJldDsKIAogCUNBVENIX0VJTlRSKHJldCA9IHdhaXRwaWQocGlkLCBOVUxMLCBXTk9IQU5HKSk7Ci0JaWYocmV0IDwgMCl7CisJaWYgKHJldCA8IDApIHsKIAkJcmV0ID0gLWVycm5vOwogCQlwcmludGsoImhlbHBlcl93YWl0IDogd2FpdHBpZCBmYWlsZWQsIGVycm5vID0gJWRcbiIsIGVycm5vKTsKIAl9Ci0JcmV0dXJuKHJldCk7CisJcmV0dXJuIHJldDsKIH0KZGlmZiAtLWdpdCBhL2FyY2gvdW0vb3MtTGludXgvaXJxLmMgYi9hcmNoL3VtL29zLUxpbnV4L2lycS5jCmluZGV4IGE5NzIwNmQuLmQ0NmI4MTggMTAwNjQ0Ci0tLSBhL2FyY2gvdW0vb3MtTGludXgvaXJxLmMKKysrIGIvYXJjaC91bS9vcy1MaW51eC9pcnEuYwpAQCAtMTgsNiArMTgsNyBAQAogI2luY2x1ZGUgInNpZ2lvLmgiCiAjaW5jbHVkZSAiaXJxX3VzZXIuaCIKICNpbmNsdWRlICJvcy5oIgorI2luY2x1ZGUgInVtX21hbGxvYy5oIgogCiBzdGF0aWMgc3RydWN0IHBvbGxmZCAqcG9sbGZkcyA9IE5VTEw7CiBzdGF0aWMgaW50IHBvbGxmZHNfbnVtID0gMDsKZGlmZiAtLWdpdCBhL2FyY2gvdW0vb3MtTGludXgvbWFpbi5jIGIvYXJjaC91bS9vcy1MaW51eC9tYWluLmMKaW5kZXggZDFjNTY3MC4uNjg1ZmVhYSAxMDA2NDQKLS0tIGEvYXJjaC91bS9vcy1MaW51eC9tYWluLmMKKysrIGIvYXJjaC91bS9vcy1MaW51eC9tYWluLmMKQEAgLTIzLDYgKzIzLDcgQEAKICNpbmNsdWRlICJjaG9vc2UtbW9kZS5oIgogI2luY2x1ZGUgInVtbC1jb25maWcuaCIKICNpbmNsdWRlICJvcy5oIgorI2luY2x1ZGUgInVtX21hbGxvYy5oIgogCiAvKiBTZXQgaW4gc2V0X3N0a2xpbSwgd2hpY2ggaXMgY2FsbGVkIGZyb20gbWFpbiBhbmQgX193cmFwX21hbGxvYy4KICAqIF9fd3JhcF9tYWxsb2Mgb25seSBjYWxscyBpdCBpZiBtYWluIGhhc24ndCBzdGFydGVkLgpkaWZmIC0tZ2l0IGEvYXJjaC91bS9vcy1MaW51eC9wcm9jZXNzLmMgYi9hcmNoL3VtL29zLUxpbnV4L3Byb2Nlc3MuYwppbmRleCA1MWYwODkzLi5jNjkyYTE5IDEwMDY0NAotLS0gYS9hcmNoL3VtL29zLUxpbnV4L3Byb2Nlc3MuYworKysgYi9hcmNoL3VtL29zLUxpbnV4L3Byb2Nlc3MuYwpAQCAtNyw3ICs3LDYgQEAKICNpbmNsdWRlIDxzdGRpby5oPgogI2luY2x1ZGUgPGVycm5vLmg+CiAjaW5jbHVkZSA8c2lnbmFsLmg+Ci0jaW5jbHVkZSA8bGludXgvdW5pc3RkLmg+CiAjaW5jbHVkZSA8c3lzL21tYW4uaD4KICNpbmNsdWRlIDxzeXMvd2FpdC5oPgogI2luY2x1ZGUgPHN5cy9tbWFuLmg+CmRpZmYgLS1naXQgYS9hcmNoL3VtL29zLUxpbnV4L3NpZ2lvLmMgYi9hcmNoL3VtL29zLUxpbnV4L3NpZ2lvLmMKaW5kZXggZjY0NTc3Ni4uOTI1YTY1MiAxMDA2NDQKLS0tIGEvYXJjaC91bS9vcy1MaW51eC9zaWdpby5jCisrKyBiL2FyY2gvdW0vb3MtTGludXgvc2lnaW8uYwpAQCAtMTksNiArMTksNyBAQAogI2luY2x1ZGUgInVzZXJfdXRpbC5oIgogI2luY2x1ZGUgInNpZ2lvLmgiCiAjaW5jbHVkZSAib3MuaCIKKyNpbmNsdWRlICJ1bV9tYWxsb2MuaCIKIAogLyogUHJvdGVjdGVkIGJ5IHNpZ2lvX2xvY2soKSwgYWxzbyB1c2VkIGJ5IHNpZ2lvX2NsZWFudXAsIHdoaWNoIGlzIGFuCiAgKiBleGl0Y2FsbC4KZGlmZiAtLWdpdCBhL2FyY2gvdW0vb3MtTGludXgvc2lnbmFsLmMgYi9hcmNoL3VtL29zLUxpbnV4L3NpZ25hbC5jCmluZGV4IDZiODE3MzkuLmI4OTdlODUgMTAwNjQ0Ci0tLSBhL2FyY2gvdW0vb3MtTGludXgvc2lnbmFsLmMKKysrIGIvYXJjaC91bS9vcy1MaW51eC9zaWduYWwuYwpAQCAtMTUsNiArMTUsNyBAQAogI2luY2x1ZGUgInVzZXIuaCIKICNpbmNsdWRlICJzaWduYWxfa2Vybi5oIgogI2luY2x1ZGUgInN5c2RlcC9zaWdjb250ZXh0LmgiCisjaW5jbHVkZSAic3lzZGVwL2JhcnJpZXIuaCIKICNpbmNsdWRlICJzaWdjb250ZXh0LmgiCiAjaW5jbHVkZSAibW9kZS5oIgogI2luY2x1ZGUgIm9zLmgiCkBAIC0zNCw4ICszNSwxMiBAQAogI2RlZmluZSBTSUdBTFJNX0JJVCAyCiAjZGVmaW5lIFNJR0FMUk1fTUFTSyAoMSA8PCBTSUdBTFJNX0JJVCkKIAotc3RhdGljIGludCBzaWduYWxzX2VuYWJsZWQgPSAxOwotc3RhdGljIGludCBwZW5kaW5nID0gMDsKKy8qIFRoZXNlIGFyZSB1c2VkIGJ5IGJvdGggdGhlIHNpZ25hbCBoYW5kbGVycyBhbmQKKyAqIGJsb2NrL3VuYmxvY2tfc2lnbmFscy4gIEkgZG9uJ3Qgd2FudCBtb2RpZmljYXRpb25zIGNhY2hlZCBpbiBhCisgKiByZWdpc3RlciAtIHRoZXkgbXVzdCBnbyBzdHJhaWdodCB0byBtZW1vcnkuCisgKi8KK3N0YXRpYyB2b2xhdGlsZSBpbnQgc2lnbmFsc19lbmFibGVkID0gMTsKK3N0YXRpYyB2b2xhdGlsZSBpbnQgcGVuZGluZyA9IDA7CiAKIHZvaWQgc2lnX2hhbmRsZXIoaW50IHNpZywgc3RydWN0IHNpZ2NvbnRleHQgKnNjKQogewpAQCAtMTUyLDYgKzE1NywxMiBAQAogdm9pZCBibG9ja19zaWduYWxzKHZvaWQpCiB7CiAJc2lnbmFsc19lbmFibGVkID0gMDsKKwkvKiBUaGlzIG11c3QgcmV0dXJuIHdpdGggc2lnbmFscyBkaXNhYmxlZCwgc28gdGhpcyBiYXJyaWVyCisJICogZW5zdXJlcyB0aGF0IHdyaXRlcyBhcmUgZmx1c2hlZCBvdXQgYmVmb3JlIHRoZSByZXR1cm4uCisJICogVGhpcyBtaWdodCBtYXR0ZXIgaWYgZ2NjIGZpZ3VyZXMgb3V0IGhvdyB0byBpbmxpbmUgdGhpcyBhbmQKKwkgKiBkZWNpZGVzIHRvIHNodWZmbGUgdGhpcyBjb2RlIGludG8gdGhlIGNhbGxlci4KKwkgKi8KKwltYigpOwogfQogCiB2b2lkIHVuYmxvY2tfc2lnbmFscyh2b2lkKQpAQCAtMTcxLDkgKzE4MiwyMyBAQAogCQkgKi8KIAkJc2lnbmFsc19lbmFibGVkID0gMTsKIAorCQkvKiBTZXR0aW5nIHNpZ25hbHNfZW5hYmxlZCBhbmQgcmVhZGluZyBwZW5kaW5nIG11c3QKKwkJICogaGFwcGVuIGluIHRoaXMgb3JkZXIuCisJCSAqLworCQltYigpOworCiAJCXNhdmVfcGVuZGluZyA9IHBlbmRpbmc7Ci0JCWlmKHNhdmVfcGVuZGluZyA9PSAwKQorCQlpZihzYXZlX3BlbmRpbmcgPT0gMCl7CisJCQkvKiBUaGlzIG11c3QgcmV0dXJuIHdpdGggc2lnbmFscyBlbmFibGVkLCBzbworCQkJICogdGhpcyBiYXJyaWVyIGVuc3VyZXMgdGhhdCB3cml0ZXMgYXJlCisJCQkgKiBmbHVzaGVkIG91dCBiZWZvcmUgdGhlIHJldHVybi4gIFRoaXMgbWlnaHQKKwkJCSAqIG1hdHRlciBpZiBnY2MgZmlndXJlcyBvdXQgaG93IHRvIGlubGluZQorCQkJICogdGhpcyAodW5saWtlbHksIGdpdmVuIGl0cyBzaXplKSBhbmQgZGVjaWRlcworCQkJICogdG8gc2h1ZmZsZSB0aGlzIGNvZGUgaW50byB0aGUgY2FsbGVyLgorCQkJICovCisJCQltYigpOwogCQkJcmV0dXJuOworCQl9CiAKIAkJcGVuZGluZyA9IDA7CiAKZGlmZiAtLWdpdCBhL2FyY2gvdW0vb3MtTGludXgvc2thcy9wcm9jZXNzLmMgYi9hcmNoL3VtL29zLUxpbnV4L3NrYXMvcHJvY2Vzcy5jCmluZGV4IGNiOWFiNTQuLjliMzRmZTYgMTAwNjQ0Ci0tLSBhL2FyY2gvdW0vb3MtTGludXgvc2thcy9wcm9jZXNzLmMKKysrIGIvYXJjaC91bS9vcy1MaW51eC9za2FzL3Byb2Nlc3MuYwpAQCAtMTQsNyArMTQsNyBAQAogI2luY2x1ZGUgPHN5cy9tbWFuLmg+CiAjaW5jbHVkZSA8c3lzL3VzZXIuaD4KICNpbmNsdWRlIDxzeXMvdGltZS5oPgotI2luY2x1ZGUgPGFzbS91bmlzdGQuaD4KKyNpbmNsdWRlIDxzeXMvc3lzY2FsbC5oPgogI2luY2x1ZGUgPGFzbS90eXBlcy5oPgogI2luY2x1ZGUgInVzZXIuaCIKICNpbmNsdWRlICJzeXNkZXAvcHRyYWNlLmgiCmRpZmYgLS1naXQgYS9hcmNoL3VtL29zLUxpbnV4L3N5cy1pMzg2L3Rscy5jIGIvYXJjaC91bS9vcy1MaW51eC9zeXMtaTM4Ni90bHMuYwppbmRleCA2ZTk0NWFiLi4yNTY1MzIwIDEwMDY0NAotLS0gYS9hcmNoL3VtL29zLUxpbnV4L3N5cy1pMzg2L3Rscy5jCisrKyBiL2FyY2gvdW0vb3MtTGludXgvc3lzLWkzODYvdGxzLmMKQEAgLTEsNiArMSw5IEBACiAjaW5jbHVkZSA8ZXJybm8uaD4KICNpbmNsdWRlIDxsaW51eC91bmlzdGQuaD4KKwogI2luY2x1ZGUgPHN5cy9zeXNjYWxsLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisKICNpbmNsdWRlICJzeXNkZXAvdGxzLmgiCiAjaW5jbHVkZSAidXNlcl91dGlsLmgiCiAKZGlmZiAtLWdpdCBhL2FyY2gvdW0vb3MtTGludXgvdGltZS5jIGIvYXJjaC91bS9vcy1MaW51eC90aW1lLmMKaW5kZXggMzhiZTA5Ni4uMjExNWI4YiAxMDA2NDQKLS0tIGEvYXJjaC91bS9vcy1MaW51eC90aW1lLmMKKysrIGIvYXJjaC91bS9vcy1MaW51eC90aW1lLmMKQEAgLTE2LDYgKzE2LDcgQEAKICNpbmNsdWRlICJwcm9jZXNzLmgiCiAjaW5jbHVkZSAia2Vybl9jb25zdGFudHMuaCIKICNpbmNsdWRlICJvcy5oIgorI2luY2x1ZGUgInVtbC1jb25maWcuaCIKIAogaW50IHNldF9pbnRlcnZhbChpbnQgaXNfdmlydHVhbCkKIHsKQEAgLTMwLDcgKzMxLDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotI2lmZGVmIENPTkZJR19NT0RFX1RUCisjaWZkZWYgVU1MX0NPTkZJR19NT0RFX1RUCiB2b2lkIGVuYWJsZV90aW1lcih2b2lkKQogewogCXNldF9pbnRlcnZhbCgxKTsKZGlmZiAtLWdpdCBhL2FyY2gvdW0vb3MtTGludXgvdGxzLmMgYi9hcmNoL3VtL29zLUxpbnV4L3Rscy5jCmluZGV4IGEyZGUyNTguLjE2MjE1YjkgMTAwNjQ0Ci0tLSBhL2FyY2gvdW0vb3MtTGludXgvdGxzLmMKKysrIGIvYXJjaC91bS9vcy1MaW51eC90bHMuYwpAQCAtMSw0ICsxLDUgQEAKICNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgogI2luY2x1ZGUgPHN5cy9wdHJhY2UuaD4KICNpbmNsdWRlIDxzeXMvc3lzY2FsbC5oPgogI2luY2x1ZGUgPGFzbS9sZHQuaD4KZGlmZiAtLWdpdCBhL2FyY2gvdW0vb3MtTGludXgvdHQuYyBiL2FyY2gvdW0vb3MtTGludXgvdHQuYwppbmRleCA1NDYxYTA2Li4zZGMzYTAyIDEwMDY0NAotLS0gYS9hcmNoL3VtL29zLUxpbnV4L3R0LmMKKysrIGIvYXJjaC91bS9vcy1MaW51eC90dC5jCkBAIC0xMCw3ICsxMCw2IEBACiAjaW5jbHVkZSA8ZXJybm8uaD4KICNpbmNsdWRlIDxzdGRhcmcuaD4KICNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzZXRqbXAuaD4KICNpbmNsdWRlIDxzeXMvdGltZS5oPgogI2luY2x1ZGUgPHN5cy9wdHJhY2UuaD4KICNpbmNsdWRlIDxsaW51eC9wdHJhY2UuaD4KZGlmZiAtLWdpdCBhL2FyY2gvdW0vb3MtTGludXgvdXRpbC5jIGIvYXJjaC91bS9vcy1MaW51eC91dGlsLmMKaW5kZXggM2Y1YjE1MS4uNTZiOGE1MCAxMDA2NDQKLS0tIGEvYXJjaC91bS9vcy1MaW51eC91dGlsLmMKKysrIGIvYXJjaC91bS9vcy1MaW51eC91dGlsLmMKQEAgLTgwLDExICs4MCwxOCBAQAogCXN0cnVjdCB1dHNuYW1lIGhvc3Q7CiAKIAl1bmFtZSgmaG9zdCk7Ci0jaWYgZGVmaW5lZChVTUxfQ09ORklHX1VNTF9YODYpICYmICFkZWZpbmVkKFVNTF9DT05GSUdfNjRCSVQpCisjaWZkZWYgVU1MX0NPTkZJR19VTUxfWDg2CisjIGlmbmRlZiBVTUxfQ09ORklHXzY0QklUCiAJaWYgKCFzdHJjbXAoaG9zdC5tYWNoaW5lLCAieDg2XzY0IikpIHsKIAkJc3RyY3B5KG1hY2hpbmVfb3V0LCAiaTY4NiIpOwogCQlyZXR1cm47CiAJfQorIyBlbHNlCisJaWYgKCFzdHJjbXAoaG9zdC5tYWNoaW5lLCAiaTY4NiIpKSB7CisJCXN0cmNweShtYWNoaW5lX291dCwgIng4Nl82NCIpOworCQlyZXR1cm47CisJfQorIyBlbmRpZgogI2VuZGlmCiAJc3RyY3B5KG1hY2hpbmVfb3V0LCBob3N0Lm1hY2hpbmUpOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC91bS9zeXMtaTM4Ni91bm1hcC5jIGIvYXJjaC91bS9zeXMtaTM4Ni91bm1hcC5jCmluZGV4IDhlNTVjZDUuLjFiMGFkMGU0IDEwMDY0NAotLS0gYS9hcmNoL3VtL3N5cy1pMzg2L3VubWFwLmMKKysrIGIvYXJjaC91bS9zeXMtaTM4Ni91bm1hcC5jCkBAIC01LDE3ICs1LDIwIEBACiAKICNpbmNsdWRlIDxsaW51eC9tbWFuLmg+CiAjaW5jbHVkZSA8YXNtL3VuaXN0ZC5oPgotI2luY2x1ZGUgPHN5cy9zeXNjYWxsLmg+CiAKK3N0YXRpYyBpbnQgZXJybm87CisKK3N0YXRpYyBpbmxpbmUgX3N5c2NhbGwyKGludCxtdW5tYXAsdm9pZCAqLHN0YXJ0LHNpemVfdCxsZW4pCitzdGF0aWMgaW5saW5lIF9zeXNjYWxsNih2b2lkICosbW1hcDIsdm9pZCAqLGFkZHIsc2l6ZV90LGxlbixpbnQscHJvdCxpbnQsZmxhZ3MsaW50LGZkLG9mZl90LG9mZnNldCkKIGludCBzd2l0Y2hlcm9vKGludCBmZCwgaW50IHByb3QsIHZvaWQgKmZyb20sIHZvaWQgKnRvLCBpbnQgc2l6ZSkKIHsKLQlpZiAoc3lzY2FsbChfX05SX211bm1hcCwgdG8sIHNpemUpIDwgMCl7CisJaWYobXVubWFwKHRvLCBzaXplKSA8IDApewogCQlyZXR1cm4oLTEpOwogCX0KLQlpZiAoc3lzY2FsbChfX05SX21tYXAyLCB0bywgc2l6ZSwgcHJvdCwgTUFQX1NIQVJFRCB8IE1BUF9GSVhFRCwgZmQsIDApID09ICh2b2lkKikgLTEgKXsKKwlpZihtbWFwMih0bywgc2l6ZSwgcHJvdCwgTUFQX1NIQVJFRCB8IE1BUF9GSVhFRCwgZmQsIDApID09ICh2b2lkKikgLTEgKXsKIAkJcmV0dXJuKC0xKTsKIAl9Ci0JaWYgKHN5c2NhbGwoX19OUl9tdW5tYXAsIGZyb20sIHNpemUpIDwgMCl7CisJaWYobXVubWFwKGZyb20sIHNpemUpIDwgMCl7CiAJCXJldHVybigtMSk7CiAJfQogCXJldHVybigwKTsKZGlmZiAtLWdpdCBhL2FyY2gvdW0vc3lzLXg4Nl82NC9rc3ltcy5jIGIvYXJjaC91bS9zeXMteDg2XzY0L2tzeW1zLmMKaW5kZXggODU5MjczOC4uMTJjNTkzNiAxMDA2NDQKLS0tIGEvYXJjaC91bS9zeXMteDg2XzY0L2tzeW1zLmMKKysrIGIvYXJjaC91bS9zeXMteDg2XzY0L2tzeW1zLmMKQEAgLTE0LDYgKzE0LDMgQEAKIAogLypYWFg6IHdlIG5lZWQgdGhlbSBiZWNhdXNlIHRoZXkgd291bGQgYmUgZXhwb3J0ZWQgYnkgeDg2XzY0ICovCiBFWFBPUlRfU1lNQk9MKF9fbWVtY3B5KTsKLQotLyogTmV0d29ya2luZyBoZWxwZXIgcm91dGluZXMuICovCi1FWFBPUlRfU1lNQk9MKGlwX2NvbXB1dGVfY3N1bSk7CmRpZmYgLS1naXQgYS9hcmNoL3VtL3N5cy14ODZfNjQvc3R1Yl9zZWd2LmMgYi9hcmNoL3VtL3N5cy14ODZfNjQvc3R1Yl9zZWd2LmMKaW5kZXggMWM5NjcwMi4uNjUyZmEzNCAxMDA2NDQKLS0tIGEvYXJjaC91bS9zeXMteDg2XzY0L3N0dWJfc2Vndi5jCisrKyBiL2FyY2gvdW0vc3lzLXg4Nl82NC9zdHViX3NlZ3YuYwpAQCAtNSw3ICs1LDYgQEAKIAogI2luY2x1ZGUgPHN0ZGRlZi5oPgogI2luY2x1ZGUgPHNpZ25hbC5oPgotI2luY2x1ZGUgPGxpbnV4L2NvbXBpbGVyLmg+CiAjaW5jbHVkZSA8YXNtL3VuaXN0ZC5oPgogI2luY2x1ZGUgInVtbC1jb25maWcuaCIKICNpbmNsdWRlICJzeXNkZXAvc2lnY29udGV4dC5oIgpkaWZmIC0tZ2l0IGEvYXJjaC91bS9zeXMteDg2XzY0L3VubWFwLmMgYi9hcmNoL3VtL3N5cy14ODZfNjQvdW5tYXAuYwppbmRleCA1N2M5Mjg2Li5mNGE0YmZmIDEwMDY0NAotLS0gYS9hcmNoL3VtL3N5cy14ODZfNjQvdW5tYXAuYworKysgYi9hcmNoL3VtL3N5cy14ODZfNjQvdW5tYXAuYwpAQCAtNSwxNyArNSwyMCBAQAogCiAjaW5jbHVkZSA8bGludXgvbW1hbi5oPgogI2luY2x1ZGUgPGFzbS91bmlzdGQuaD4KLSNpbmNsdWRlIDxzeXMvc3lzY2FsbC5oPgogCitzdGF0aWMgaW50IGVycm5vOworCitzdGF0aWMgaW5saW5lIF9zeXNjYWxsMihpbnQsbXVubWFwLHZvaWQgKixzdGFydCxzaXplX3QsbGVuKQorc3RhdGljIGlubGluZSBfc3lzY2FsbDYodm9pZCAqLG1tYXAsdm9pZCAqLGFkZHIsc2l6ZV90LGxlbixpbnQscHJvdCxpbnQsZmxhZ3MsaW50LGZkLG9mZl90LG9mZnNldCkKIGludCBzd2l0Y2hlcm9vKGludCBmZCwgaW50IHByb3QsIHZvaWQgKmZyb20sIHZvaWQgKnRvLCBpbnQgc2l6ZSkKIHsKLQlpZiAoc3lzY2FsbChfX05SX211bm1hcCwgdG8sIHNpemUpIDwgMCl7CisJaWYobXVubWFwKHRvLCBzaXplKSA8IDApewogCQlyZXR1cm4oLTEpOwogCX0KLQlpZiAoc3lzY2FsbChfX05SX21tYXAsIHRvLCBzaXplLCBwcm90LCBNQVBfU0hBUkVEIHwgTUFQX0ZJWEVELCBmZCwgMCkgPT0gKHZvaWQqKSAtMSl7CisJaWYobW1hcCh0bywgc2l6ZSwgcHJvdCwgTUFQX1NIQVJFRCB8IE1BUF9GSVhFRCwgZmQsIDApID09ICh2b2lkKikgLTEpewogCQlyZXR1cm4oLTEpOwogCX0KLQlpZiAoc3lzY2FsbChfX05SX211bm1hcCwgZnJvbSwgc2l6ZSkgPCAwKXsKKwlpZihtdW5tYXAoZnJvbSwgc2l6ZSkgPCAwKXsKIAkJcmV0dXJuKC0xKTsKIAl9CiAJcmV0dXJuKDApOwpkaWZmIC0tZ2l0IGEvYXJjaC92ODUwL2tlcm5lbC92bWxpbnV4Lmxkcy5TIGIvYXJjaC92ODUwL2tlcm5lbC92bWxpbnV4Lmxkcy5TCmluZGV4IDYzMzk5MjEuLjg4ZDA4N2YgMTAwNjQ0Ci0tLSBhL2FyY2gvdjg1MC9rZXJuZWwvdm1saW51eC5sZHMuUworKysgYi9hcmNoL3Y4NTAva2VybmVsL3ZtbGludXgubGRzLlMKQEAgLTE0MCwxMyArMTQwLDcgQEAKIAkJX19fc2V0dXBfZW5kID0gLiA7CQkJCQkgICAgICBcCiAJCV9fX2luaXRjYWxsX3N0YXJ0ID0gLiA7CQkJCQkgICAgICBcCiAJCQkqKC5pbml0Y2FsbC5pbml0KQkJCQkgICAgICBcCi0JCQkqKC5pbml0Y2FsbDEuaW5pdCkJCQkJICAgICAgXAotCQkJKiguaW5pdGNhbGwyLmluaXQpCQkJCSAgICAgIFwKLQkJCSooLmluaXRjYWxsMy5pbml0KQkJCQkgICAgICBcCi0JCQkqKC5pbml0Y2FsbDQuaW5pdCkJCQkJICAgICAgXAotCQkJKiguaW5pdGNhbGw1LmluaXQpCQkJCSAgICAgIFwKLQkJCSooLmluaXRjYWxsNi5pbml0KQkJCQkgICAgICBcCi0JCQkqKC5pbml0Y2FsbDcuaW5pdCkJCQkJICAgICAgXAorCQkJSU5JVENBTExTCQkJCQkgICAgICBcCiAJCS4gPSBBTElHTiAoNCkgOwkJCQkJCSAgICAgIFwKIAkJX19faW5pdGNhbGxfZW5kID0gLiA7CQkJCQkgICAgICBcCiAJCV9fX2Nvbl9pbml0Y2FsbF9zdGFydCA9IC47CQkJCSAgICAgIFwKZGlmZiAtLWdpdCBhL2FyY2gveDg2XzY0L01ha2VmaWxlIGIvYXJjaC94ODZfNjQvTWFrZWZpbGUKaW5kZXggMWMwZjE4ZC4uNmUzOGQ0ZCAxMDA2NDQKLS0tIGEvYXJjaC94ODZfNjQvTWFrZWZpbGUKKysrIGIvYXJjaC94ODZfNjQvTWFrZWZpbGUKQEAgLTU0LDYgKzU0LDEwIEBACiBjZmxhZ3MteSArPSAkKGNhbGwgY2Mtb3B0aW9uLC1mdW5pdC1hdC1hLXRpbWUpCiAjIHByZXZlbnQgZ2NjIGZyb20gZ2VuZXJhdGluZyBhbnkgRlAgY29kZSBieSBtaXN0YWtlCiBjZmxhZ3MteSArPSAkKGNhbGwgY2Mtb3B0aW9uLC1tbm8tc3NlIC1tbm8tbW14IC1tbm8tc3NlMiAtbW5vLTNkbm93LCkKKyMgdGhpcyB3b3JrcyBhcm91bmQgc29tZSBpc3N1ZXMgd2l0aCBnZW5lcmF0aW5nIHVud2luZCB0YWJsZXMgaW4gb2xkZXIgZ2NjcworIyBuZXdlciBnY2NzIGRvIGl0IGJ5IGRlZmF1bHQKK2NmbGFncy15ICs9IC1tYWNjdW11bGF0ZS1vdXRnb2luZy1hcmdzCisKICMgZG8gYmludXRpbHMgc3VwcG9ydCBDRkk/CiBjZmxhZ3MteSArPSAkKGNhbGwgYXMtaW5zdHIsLmNmaV9zdGFydHByb2Ncbi5jZmlfZW5kcHJvYywtRENPTkZJR19BU19DRkk9MSwpCiBBRkxBR1MgKz0gJChjYWxsIGFzLWluc3RyLC5jZmlfc3RhcnRwcm9jXG4uY2ZpX2VuZHByb2MsLURDT05GSUdfQVNfQ0ZJPTEsKQpAQCAtNjIsOCArNjYsOCBAQAogY2ZsYWdzLXkgKz0gJChjYWxsIGFzLWluc3RyLC5jZmlfc3RhcnRwcm9jXG4uY2ZpX3NpZ25hbF9mcmFtZVxuLmNmaV9lbmRwcm9jLC1EQ09ORklHX0FTX0NGSV9TSUdOQUxfRlJBTUU9MSwpCiBBRkxBR1MgKz0gJChjYWxsIGFzLWluc3RyLC5jZmlfc3RhcnRwcm9jXG4uY2ZpX3NpZ25hbF9mcmFtZVxuLmNmaV9lbmRwcm9jLC1EQ09ORklHX0FTX0NGSV9TSUdOQUxfRlJBTUU9MSwpCiAKLWNmbGFncy0kKENPTkZJR19DQ19TVEFDS1BST1RFQ1RPUikgKz0gJChzaGVsbCAkKENPTkZJR19TSEVMTCkgJChzcmN0cmVlKS9zY3JpcHRzL2djYy14ODZfNjQtaGFzLXN0YWNrLXByb3RlY3Rvci5zaCAkKENDKSAtZnN0YWNrLXByb3RlY3RvciApCi1jZmxhZ3MtJChDT05GSUdfQ0NfU1RBQ0tQUk9URUNUT1JfQUxMKSArPSAkKHNoZWxsICQoQ09ORklHX1NIRUxMKSAkKHNyY3RyZWUpL3NjcmlwdHMvZ2NjLXg4Nl82NC1oYXMtc3RhY2stcHJvdGVjdG9yLnNoICQoQ0MpIC1mc3RhY2stcHJvdGVjdG9yLWFsbCApCitjZmxhZ3MtJChDT05GSUdfQ0NfU1RBQ0tQUk9URUNUT1IpICs9ICQoc2hlbGwgJChDT05GSUdfU0hFTEwpICQoc3JjdHJlZSkvc2NyaXB0cy9nY2MteDg2XzY0LWhhcy1zdGFjay1wcm90ZWN0b3Iuc2ggIiQoQ0MpIiAtZnN0YWNrLXByb3RlY3RvciApCitjZmxhZ3MtJChDT05GSUdfQ0NfU1RBQ0tQUk9URUNUT1JfQUxMKSArPSAkKHNoZWxsICQoQ09ORklHX1NIRUxMKSAkKHNyY3RyZWUpL3NjcmlwdHMvZ2NjLXg4Nl82NC1oYXMtc3RhY2stcHJvdGVjdG9yLnNoICIkKENDKSIgLWZzdGFjay1wcm90ZWN0b3ItYWxsICkKIAogQ0ZMQUdTICs9ICQoY2ZsYWdzLXkpCiBDRkxBR1NfS0VSTkVMICs9ICQoY2ZsYWdzLWtlcm5lbC15KQpkaWZmIC0tZ2l0IGEvYXJjaC94ODZfNjQvYm9vdC9zZXR1cC5TIGIvYXJjaC94ODZfNjQvYm9vdC9zZXR1cC5TCmluZGV4IGMzYmZkMjIuLjc3MDk0MGMgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2XzY0L2Jvb3Qvc2V0dXAuUworKysgYi9hcmNoL3g4Nl82NC9ib290L3NldHVwLlMKQEAgLTgzNiwxMyArODM2LDEyIEBACiAJLndvcmQJMHg5MjAwCQkJCSMgZGF0YSByZWFkL3dyaXRlCiAJLndvcmQJMHgwMENGCQkJCSMgZ3JhbnVsYXJpdHkgPSA0MDk2LCAzODYKIAkJCQkJCSMgICgrNXRoIG5pYmJsZSBvZiBsaW1pdCkKK2dkdF9lbmQ6CiBpZHRfNDg6CiAJLndvcmQJMAkJCQkjIGlkdCBsaW1pdCA9IDAKIAkud29yZAkwLCAwCQkJCSMgaWR0IGJhc2UgPSAwTAogZ2R0XzQ4OgotCS53b3JkCTB4ODAwMAkJCQkjIGdkdCBsaW1pdD0yMDQ4LAotCQkJCQkJIyAgMjU2IEdEVCBlbnRyaWVzCi0KKwkud29yZAlnZHRfZW5kLWdkdC0xCQkJIyBnZHQgbGltaXQKIAkud29yZAkwLCAwCQkJCSMgZ2R0IGJhc2UgKGZpbGxlZCBpbiBsYXRlcikKIAogIyBJbmNsdWRlIHZpZGVvIHNldHVwICYgZGV0ZWN0aW9uIGNvZGUKZGlmZiAtLWdpdCBhL2FyY2gveDg2XzY0L2RlZmNvbmZpZyBiL2FyY2gveDg2XzY0L2RlZmNvbmZpZwppbmRleCA0N2JmYmE2ZS4uMGY1ZDQ0ZSAxMDA2NDQKLS0tIGEvYXJjaC94ODZfNjQvZGVmY29uZmlnCisrKyBiL2FyY2gveDg2XzY0L2RlZmNvbmZpZwpAQCAtMSw3ICsxLDcgQEAKICMKICMgQXV0b21hdGljYWxseSBnZW5lcmF0ZWQgbWFrZSBjb25maWc6IGRvbid0IGVkaXQKLSMgTGludXgga2VybmVsIHZlcnNpb246IDIuNi4xOS1yYzEKLSMgVGh1IE9jdCAgNSAxMzowNDo0MyAyMDA2CisjIExpbnV4IGtlcm5lbCB2ZXJzaW9uOiAyLjYuMTktcmMyLWdpdDQKKyMgU2F0IE9jdCAyMSAwMzozODo1MiAyMDA2CiAjCiBDT05GSUdfWDg2XzY0PXkKIENPTkZJR182NEJJVD15CkBAIC0zMzUsOCArMzM1LDggQEAKICMgQ09ORklHX0lORVQ2X1hGUk1fTU9ERV9UVU5ORUwgaXMgbm90IHNldAogIyBDT05GSUdfSU5FVDZfWEZSTV9NT0RFX0JFRVQgaXMgbm90IHNldAogIyBDT05GSUdfSU5FVDZfWEZSTV9NT0RFX1JPVVRFT1BUSU1JWkFUSU9OIGlzIG5vdCBzZXQKK0NPTkZJR19JUFY2X1NJVD15CiAjIENPTkZJR19JUFY2X1RVTk5FTCBpcyBub3Qgc2V0Ci0jIENPTkZJR19JUFY2X1NVQlRSRUVTIGlzIG5vdCBzZXQKICMgQ09ORklHX0lQVjZfTVVMVElQTEVfVEFCTEVTIGlzIG5vdCBzZXQKICMgQ09ORklHX05FVFdPUktfU0VDTUFSSyBpcyBub3Qgc2V0CiAjIENPTkZJR19ORVRGSUxURVIgaXMgbm90IHNldApAQCAtNDM4LDYgKzQzOCwxMyBAQAogIyBDT05GSUdfQVRBX09WRVJfRVRIIGlzIG5vdCBzZXQKIAogIworIyBNaXNjIGRldmljZXMKKyMKKyMgQ09ORklHX0lCTV9BU00gaXMgbm90IHNldAorIyBDT05GSUdfU0dJX0lPQzQgaXMgbm90IHNldAorIyBDT05GSUdfVElGTV9DT1JFIGlzIG5vdCBzZXQKKworIwogIyBBVEEvQVRBUEkvTUZNL1JMTCBzdXBwb3J0CiAjCiBDT05GSUdfSURFPXkKQEAgLTEwMDgsNiArMTAxNSw3IEBACiAjCiAjIERhbGxhcydzIDEtd2lyZSBidXMKICMKKyMgQ09ORklHX1cxIGlzIG5vdCBzZXQKIAogIwogIyBIYXJkd2FyZSBNb25pdG9yaW5nIHN1cHBvcnQKQEAgLTEwNTksMTIgKzEwNjcsNiBAQAogIyBDT05GSUdfSFdNT05fREVCVUdfQ0hJUCBpcyBub3Qgc2V0CiAKICMKLSMgTWlzYyBkZXZpY2VzCi0jCi0jIENPTkZJR19JQk1fQVNNIGlzIG5vdCBzZXQKLSMgQ09ORklHX1RJRk1fQ09SRSBpcyBub3Qgc2V0Ci0KLSMKICMgTXVsdGltZWRpYSBkZXZpY2VzCiAjCiAjIENPTkZJR19WSURFT19ERVYgaXMgbm90IHNldApAQCAtMTE5Niw3ICsxMTk4LDYgQEAKICMgQ09ORklHX1VTQl9BVElfUkVNT1RFMiBpcyBub3Qgc2V0CiAjIENPTkZJR19VU0JfS0VZU1BBTl9SRU1PVEUgaXMgbm90IHNldAogIyBDT05GSUdfVVNCX0FQUExFVE9VQ0ggaXMgbm90IHNldAotIyBDT05GSUdfVVNCX1RSQU5DRVZJQlJBVE9SIGlzIG5vdCBzZXQKIAogIwogIyBVU0IgSW1hZ2luZyBkZXZpY2VzCkBAIC0xMjQyLDYgKzEyNDMsNyBAQAogIyBDT05GSUdfVVNCX0FQUExFRElTUExBWSBpcyBub3Qgc2V0CiAjIENPTkZJR19VU0JfU0lTVVNCVkdBIGlzIG5vdCBzZXQKICMgQ09ORklHX1VTQl9MRCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfVFJBTkNFVklCUkFUT1IgaXMgbm90IHNldAogIyBDT05GSUdfVVNCX1RFU1QgaXMgbm90IHNldAogCiAjCkBAIC0xMzE4LDYgKzEzMjAsNyBAQAogQ09ORklHX0VYVDNfRlNfWEFUVFI9eQogQ09ORklHX0VYVDNfRlNfUE9TSVhfQUNMPXkKICMgQ09ORklHX0VYVDNfRlNfU0VDVVJJVFkgaXMgbm90IHNldAorIyBDT05GSUdfRVhUNERFVl9GUyBpcyBub3Qgc2V0CiBDT05GSUdfSkJEPXkKICMgQ09ORklHX0pCRF9ERUJVRyBpcyBub3Qgc2V0CiBDT05GSUdfRlNfTUJDQUNIRT15CkBAIC0xMzQxLDYgKzEzNDQsNyBAQAogIyBDT05GSUdfQVVUT0ZTX0ZTIGlzIG5vdCBzZXQKIENPTkZJR19BVVRPRlM0X0ZTPXkKICMgQ09ORklHX0ZVU0VfRlMgaXMgbm90IHNldAorQ09ORklHX0dFTkVSSUNfQUNMPXkKIAogIwogIyBDRC1ST00vRFZEIEZpbGVzeXN0ZW1zCkBAIC0xNDE4LDcgKzE0MjIsNiBAQAogIyBDT05GSUdfQ09EQV9GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19BRlNfRlMgaXMgbm90IHNldAogIyBDT05GSUdfOVBfRlMgaXMgbm90IHNldAotQ09ORklHX0dFTkVSSUNfQUNMPXkKIAogIwogIyBQYXJ0aXRpb24gVHlwZXMKQEAgLTE0NzEsMTAgKzE0NzQsNiBAQAogQ09ORklHX05MU19VVEY4PXkKIAogIwotIyBEaXN0cmlidXRlZCBMb2NrIE1hbmFnZXIKLSMKLQotIwogIyBJbnN0cnVtZW50YXRpb24gU3VwcG9ydAogIwogQ09ORklHX1BST0ZJTElORz15CkBAIC0xNTEyLDYgKzE1MTEsNyBAQAogQ09ORklHX1VOV0lORF9JTkZPPXkKIENPTkZJR19TVEFDS19VTldJTkQ9eQogIyBDT05GSUdfRk9SQ0VEX0lOTElOSU5HIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hFQURFUlNfQ0hFQ0sgaXMgbm90IHNldAogIyBDT05GSUdfUkNVX1RPUlRVUkVfVEVTVCBpcyBub3Qgc2V0CiAjIENPTkZJR19MS0RUTSBpcyBub3Qgc2V0CiAjIENPTkZJR19ERUJVR19ST0RBVEEgaXMgbm90IHNldApkaWZmIC0tZ2l0IGEvYXJjaC94ODZfNjQvaWEzMi9pYTMyX3NpZ25hbC5jIGIvYXJjaC94ODZfNjQvaWEzMi9pYTMyX3NpZ25hbC5jCmluZGV4IGE2YmE5OTUuLjBlMGEyNjYgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2XzY0L2lhMzIvaWEzMl9zaWduYWwuYworKysgYi9hcmNoL3g4Nl82NC9pYTMyL2lhMzJfc2lnbmFsLmMKQEAgLTU3OSw2ICs1NzksMTEgQEAKIAlyZWdzLT5yc3AgPSAodW5zaWduZWQgbG9uZykgZnJhbWU7CiAJcmVncy0+cmlwID0gKHVuc2lnbmVkIGxvbmcpIGthLT5zYS5zYV9oYW5kbGVyOwogCisJLyogTWFrZSAtbXJlZ3Bhcm09MyB3b3JrICovCisJcmVncy0+cmF4ID0gc2lnOworCXJlZ3MtPnJkeCA9ICh1bnNpZ25lZCBsb25nKSAmZnJhbWUtPmluZm87CisJcmVncy0+cmN4ID0gKHVuc2lnbmVkIGxvbmcpICZmcmFtZS0+dWM7CisKIAlhc20gdm9sYXRpbGUoIm1vdmwgJTAsJSVkcyIgOjogInIiIChfX1VTRVIzMl9EUykpOyAKIAlhc20gdm9sYXRpbGUoIm1vdmwgJTAsJSVlcyIgOjogInIiIChfX1VTRVIzMl9EUykpOyAKIAkKZGlmZiAtLWdpdCBhL2FyY2gveDg2XzY0L2lhMzIvcHRyYWNlMzIuYyBiL2FyY2gveDg2XzY0L2lhMzIvcHRyYWNlMzIuYwppbmRleCAzYTc1NjFkLi4wNDU2NmZlIDEwMDY0NAotLS0gYS9hcmNoL3g4Nl82NC9pYTMyL3B0cmFjZTMyLmMKKysrIGIvYXJjaC94ODZfNjQvaWEzMi9wdHJhY2UzMi5jCkBAIC0yNDQsNiArMjQ0LDggQEAKIAljYXNlIFBUUkFDRV9ERVRBQ0g6CiAJY2FzZSBQVFJBQ0VfU1lTQ0FMTDoKIAljYXNlIFBUUkFDRV9TRVRPUFRJT05TOgorCWNhc2UgUFRSQUNFX1NFVF9USFJFQURfQVJFQToKKwljYXNlIFBUUkFDRV9HRVRfVEhSRUFEX0FSRUE6CiAJCXJldHVybiBzeXNfcHRyYWNlKHJlcXVlc3QsIHBpZCwgYWRkciwgZGF0YSk7IAogCiAJZGVmYXVsdDoKZGlmZiAtLWdpdCBhL2FyY2gveDg2XzY0L2tlcm5lbC9lODIwLmMgYi9hcmNoL3g4Nl82NC9rZXJuZWwvZTgyMC5jCmluZGV4IGIzZjA5MDguLjZmZTE5MWMgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2XzY0L2tlcm5lbC9lODIwLmMKKysrIGIvYXJjaC94ODZfNjQva2VybmVsL2U4MjAuYwpAQCAtNTQsMTMgKzU0LDEzIEBACiAKIAkvKiB2YXJpb3VzIGd1bmsgYmVsb3cgdGhhdCBuZWVkZWQgZm9yIFNNUCBzdGFydHVwICovCiAJaWYgKGFkZHIgPCAweDgwMDApIHsgCi0JCSphZGRycCA9IDB4ODAwMDsKKwkJKmFkZHJwID0gUEFHRV9BTElHTigweDgwMDApOwogCQlyZXR1cm4gMTsgCiAJfQogCiAJLyogZGlyZWN0IG1hcHBpbmcgdGFibGVzIG9mIHRoZSBrZXJuZWwgKi8KIAlpZiAobGFzdCA+PSB0YWJsZV9zdGFydDw8UEFHRV9TSElGVCAmJiBhZGRyIDwgdGFibGVfZW5kPDxQQUdFX1NISUZUKSB7IAotCQkqYWRkcnAgPSB0YWJsZV9lbmQgPDwgUEFHRV9TSElGVDsgCisJCSphZGRycCA9IFBBR0VfQUxJR04odGFibGVfZW5kIDw8IFBBR0VfU0hJRlQpOwogCQlyZXR1cm4gMTsKIAl9IAogCkBAIC02OCwxOCArNjgsMTggQEAKICNpZmRlZiBDT05GSUdfQkxLX0RFVl9JTklUUkQKIAlpZiAoTE9BREVSX1RZUEUgJiYgSU5JVFJEX1NUQVJUICYmIGxhc3QgPj0gSU5JVFJEX1NUQVJUICYmIAogCSAgICBhZGRyIDwgSU5JVFJEX1NUQVJUK0lOSVRSRF9TSVpFKSB7IAotCQkqYWRkcnAgPSBJTklUUkRfU1RBUlQgKyBJTklUUkRfU0laRTsgCisJCSphZGRycCA9IFBBR0VfQUxJR04oSU5JVFJEX1NUQVJUICsgSU5JVFJEX1NJWkUpOwogCQlyZXR1cm4gMTsKIAl9IAogI2VuZGlmCiAJLyoga2VybmVsIGNvZGUgKi8KLQlpZiAobGFzdCA+PSBfX3BhX3N5bWJvbCgmX3RleHQpICYmIGxhc3QgPCBfX3BhX3N5bWJvbCgmX2VuZCkpIHsKLQkJKmFkZHJwID0gX19wYV9zeW1ib2woJl9lbmQpOworCWlmIChsYXN0ID49IF9fcGFfc3ltYm9sKCZfdGV4dCkgJiYgYWRkciA8IF9fcGFfc3ltYm9sKCZfZW5kKSkgeworCQkqYWRkcnAgPSBQQUdFX0FMSUdOKF9fcGFfc3ltYm9sKCZfZW5kKSk7CiAJCXJldHVybiAxOwogCX0KIAogCWlmIChsYXN0ID49IGViZGFfYWRkciAmJiBhZGRyIDwgZWJkYV9hZGRyICsgZWJkYV9zaXplKSB7Ci0JCSphZGRycCA9IGViZGFfYWRkciArIGViZGFfc2l6ZTsKKwkJKmFkZHJwID0gUEFHRV9BTElHTihlYmRhX2FkZHIgKyBlYmRhX3NpemUpOwogCQlyZXR1cm4gMTsKIAl9CiAKQEAgLTE1Miw3ICsxNTIsNyBAQAogCQkJY29udGludWU7IAogCQl3aGlsZSAoYmFkX2FkZHIoJmFkZHIsIHNpemUpICYmIGFkZHIrc2l6ZSA8PSBlaS0+YWRkcitlaS0+c2l6ZSkKIAkJCTsKLQkJbGFzdCA9IGFkZHIgKyBzaXplOworCQlsYXN0ID0gUEFHRV9BTElHTihhZGRyKSArIHNpemU7CiAJCWlmIChsYXN0ID4gZWktPmFkZHIgKyBlaS0+c2l6ZSkKIAkJCWNvbnRpbnVlOwogCQlpZiAobGFzdCA+IGVuZCkgCkBAIC0yNzgsNyArMjc4LDcgQEAKIAkJCQkJCQkJPj4gUEFHRV9TSElGVDsKIAogCQkvKiBTa2lwIG1hcCBlbnRyaWVzIHNtYWxsZXIgdGhhbiBhIHBhZ2UgKi8KLQkJaWYgKGVpX3N0YXJ0cGZuID4gZWlfZW5kcGZuKQorCQlpZiAoZWlfc3RhcnRwZm4gPj0gZWlfZW5kcGZuKQogCQkJY29udGludWU7CiAKIAkJLyogQ2hlY2sgaWYgZW5kX3Bmbl9tYXAgc2hvdWxkIGJlIHVwZGF0ZWQgKi8KQEAgLTU5NCw3ICs1OTQsOSBAQAogCQkgKiBzaXplIGJlZm9yZSBvcmlnaW5hbCBtZW1vcnkgbWFwIGlzCiAJCSAqIHJlc2V0LgogCQkgKi8KKwkJZTgyMF9yZWdpc3Rlcl9hY3RpdmVfcmVnaW9ucygwLCAwLCAtMVVMKTsKIAkJc2F2ZWRfbWF4X3BmbiA9IGU4MjBfZW5kX29mX3JhbSgpOworCQlyZW1vdmVfYWxsX2FjdGl2ZV9yYW5nZXMoKTsKICNlbmRpZgogCQllbmRfcGZuX21hcCA9IDA7CiAJCWU4MjAubnJfbWFwID0gMDsKZGlmZiAtLWdpdCBhL2FyY2gveDg2XzY0L2tlcm5lbC9lYXJseS1xdWlya3MuYyBiL2FyY2gveDg2XzY0L2tlcm5lbC9lYXJseS1xdWlya3MuYwppbmRleCAyMDhlMzhhLi42ODI3M2JmIDEwMDY0NAotLS0gYS9hcmNoL3g4Nl82NC9rZXJuZWwvZWFybHktcXVpcmtzLmMKKysrIGIvYXJjaC94ODZfNjQva2VybmVsL2Vhcmx5LXF1aXJrcy5jCkBAIC00NSw3ICs0NSwxMyBAQAogCS8qCiAJICogQWxsIHRpbWVyIG92ZXJyaWRlcyBvbiBOdmlkaWEgYXJlCiAJICogd3JvbmcgdW5sZXNzIEhQRVQgaXMgZW5hYmxlZC4KKwkgKiBVbmZvcnR1bmF0ZWx5IHRoYXQncyBub3QgdHJ1ZSBvbiBtYW55IEFzdXMgYm9hcmRzLgorCSAqIFdlIGRvbid0IGtub3cgeWV0IGhvdyB0byBkZXRlY3QgdGhpcyBhdXRvbWF0aWNhbGx5LCBidXQKKwkgKiBhdCBsZWFzdCBhbGxvdyBhIGNvbW1hbmQgbGluZSBvdmVycmlkZS4KIAkgKi8KKwlpZiAoYWNwaV91c2VfdGltZXJfb3ZlcnJpZGUpCisJCXJldHVybjsKKwogCW52aWRpYV9ocGV0X2RldGVjdGVkID0gMDsKIAlhY3BpX3RhYmxlX3BhcnNlKEFDUElfSFBFVCwgbnZpZGlhX2hwZXRfY2hlY2spOwogCWlmIChudmlkaWFfaHBldF9kZXRlY3RlZCA9PSAwKSB7CkBAIC01Myw2ICs1OSw4IEBACiAJCXByaW50ayhLRVJOX0lORk8gIk52aWRpYSBib2FyZCAiCiAJCSAgICAgICAiZGV0ZWN0ZWQuIElnbm9yaW5nIEFDUEkgIgogCQkgICAgICAgInRpbWVyIG92ZXJyaWRlLlxuIik7CisJCXByaW50ayhLRVJOX0lORk8gIklmIHlvdSBnb3QgdGltZXIgdHJvdWJsZSAiCisJCQkidHJ5IGFjcGlfdXNlX3RpbWVyX292ZXJyaWRlXG4iKTsKIAl9CiAjZW5kaWYKIAkvKiBSRUQtUEVOIHNraXAgdGhlbSBvbiBtcHRhYmxlcyB0b28/ICovCkBAIC02MSwxMCArNjksMTEgQEAKIAogc3RhdGljIHZvaWQgYXRpX2J1Z3Modm9pZCkKIHsKLSNpZiAxIC8qIGZvciB0ZXN0aW5nICovCi0JcHJpbnRrKCJBVEkgYm9hcmQgZGV0ZWN0ZWRcbiIpOwotI2VuZGlmCi0JLyogTm8gYnVncyByaWdodCBub3cgKi8KKwlpZiAodGltZXJfb3Zlcl84MjU0ID09IDEpIHsKKwkJdGltZXJfb3Zlcl84MjU0ID0gMDsKKwkJcHJpbnRrKEtFUk5fSU5GTworCSAJIkFUSSBib2FyZCBkZXRlY3RlZC4gRGlzYWJsaW5nIHRpbWVyIHJvdXRpbmcgb3ZlciA4MjU0LlxuIik7CisJfQogfQogCiBzdHJ1Y3QgY2hpcHNldCB7CmRpZmYgLS1naXQgYS9hcmNoL3g4Nl82NC9rZXJuZWwvZW50cnkuUyBiL2FyY2gveDg2XzY0L2tlcm5lbC9lbnRyeS5TCmluZGV4IDM4YTdiMmQuLjdkNDAxYjAgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2XzY0L2tlcm5lbC9lbnRyeS5TCisrKyBiL2FyY2gveDg2XzY0L2tlcm5lbC9lbnRyeS5TCkBAIC0zMTUsNiArMzE1LDggQEAKIAlMT0FEX0FSR1MgQVJHT0ZGU0VUICAvKiByZWxvYWQgYXJncyBmcm9tIHN0YWNrIGluIGNhc2UgcHRyYWNlIGNoYW5nZWQgaXQgKi8KIAlSRVNUT1JFX1JFU1QKIAljbXBxICRfX05SX3N5c2NhbGxfbWF4LCVyYXgKKwltb3ZxICQtRU5PU1lTLCVyY3gKKwljbW92YSAlcmN4LCVyYXgKIAlqYSAgMWYKIAltb3ZxICVyMTAsJXJjeAkvKiBmaXh1cCBmb3IgQyAqLwogCWNhbGwgKnN5c19jYWxsX3RhYmxlKCwlcmF4LDgpCkBAIC01MzUsOCArNTM3LDYgQEAKIDE6CWluY2wJJWdzOnBkYV9pcnFjb3VudAogCWNtb3ZlcSAlZ3M6cGRhX2lycXN0YWNrcHRyLCVyc3AKIAlwdXNoICAgICVyYnAJCQkjIGJhY2tsaW5rIGZvciBvbGQgdW53aW5kZXIKLQlDRklfQURKVVNUX0NGQV9PRkZTRVQgOAotCUNGSV9SRUxfT0ZGU0VUIHJicCwwCiAJLyoKIAkgKiBXZSBlbnRlcmVkIGFuIGludGVycnVwdCBjb250ZXh0IC0gaXJxcyBhcmUgb2ZmOgogCSAqLwpAQCAtOTgwLDExICs5ODAsNiBAQAogCWNhbGwgZG9fZm9yawogCW1vdnEgJXJheCxSQVgoJXJzcCkKIAl4b3JsICVlZGksJWVkaQotCXRlc3QgJXJheCwlcmF4Ci0Jam56ICAxZgotCS8qIHRlcm1pbmF0ZSBzdGFjayBpbiBjaGlsZCAqLwotCW1vdnEgJXJkaSxSSVAoJXJzcCkKLTE6CiAKIAkvKgogCSAqIEl0IGlzbid0IHdvcnRoIHRvIGNoZWNrIGZvciByZXNjaGVkdWxlIGhlcmUsCkBAIC0xMTc2LDcgKzExNzEsNiBAQAogCWluY2wgJWdzOnBkYV9pcnFjb3VudAogCWNtb3ZlICVnczpwZGFfaXJxc3RhY2twdHIsJXJzcAogCXB1c2ggICVyYnAJCQkjIGJhY2tsaW5rIGZvciBvbGQgdW53aW5kZXIKLQlDRklfQURKVVNUX0NGQV9PRkZTRVQgICAgOAogCWNhbGwgX19kb19zb2Z0aXJxCiAJbGVhdmVxCiAJQ0ZJX0RFRl9DRkFfUkVHSVNURVIJcnNwCmRpZmYgLS1naXQgYS9hcmNoL3g4Nl82NC9rZXJuZWwvZ2VuYXBpY19mbGF0LmMgYi9hcmNoL3g4Nl82NC9rZXJuZWwvZ2VuYXBpY19mbGF0LmMKaW5kZXggMGRmYzIyMy4uN2MwMWRiOCAxMDA2NDQKLS0tIGEvYXJjaC94ODZfNjQva2VybmVsL2dlbmFwaWNfZmxhdC5jCisrKyBiL2FyY2gveDg2XzY0L2tlcm5lbC9nZW5hcGljX2ZsYXQuYwpAQCAtMTUzLDcgKzE1Myw3IEBACiAKIHN0YXRpYyBjcHVtYXNrX3QgcGh5c2ZsYXRfdGFyZ2V0X2NwdXModm9pZCkKIHsKLQlyZXR1cm4gY3B1bWFza19vZl9jcHUoMCk7CisJcmV0dXJuIGNwdV9vbmxpbmVfbWFwOwogfQogCiBzdGF0aWMgY3B1bWFza190IHBoeXNmbGF0X3ZlY3Rvcl9hbGxvY2F0aW9uX2RvbWFpbihpbnQgY3B1KQpkaWZmIC0tZ2l0IGEvYXJjaC94ODZfNjQva2VybmVsL2k4MjU5LmMgYi9hcmNoL3g4Nl82NC9rZXJuZWwvaTgyNTkuYwppbmRleCAwNjEyYTMzLi5jNGVmODAxIDEwMDY0NAotLS0gYS9hcmNoL3g4Nl82NC9rZXJuZWwvaTgyNTkuYworKysgYi9hcmNoL3g4Nl82NC9rZXJuZWwvaTgyNTkuYwpAQCAtMTc4LDcgKzE3OCw4IEBACiB7CiAJZGlzYWJsZV9pcnFfbm9zeW5jKGlycSk7CiAJaW9fYXBpY19pcnFzICY9IH4oMTw8aXJxKTsKLQlzZXRfaXJxX2NoaXBfYW5kX2hhbmRsZXIoaXJxLCAmaTgyNTlBX2NoaXAsIGhhbmRsZV9sZXZlbF9pcnEpOworCXNldF9pcnFfY2hpcF9hbmRfaGFuZGxlcl9uYW1lKGlycSwgJmk4MjU5QV9jaGlwLCBoYW5kbGVfbGV2ZWxfaXJxLAorCQkJCSAgICAgICJYVCIpOwogCWVuYWJsZV9pcnEoaXJxKTsKIH0KIApAQCAtNDMxLDggKzQzMiw4IEBACiAJCQkvKgogCQkJICogMTYgb2xkLXN0eWxlIElOVEEtY3ljbGUgaW50ZXJydXB0czoKIAkJCSAqLwotCQkJc2V0X2lycV9jaGlwX2FuZF9oYW5kbGVyKGksICZpODI1OUFfY2hpcCwKLQkJCQkJCSBoYW5kbGVfbGV2ZWxfaXJxKTsKKwkJCXNldF9pcnFfY2hpcF9hbmRfaGFuZGxlcl9uYW1lKGksICZpODI1OUFfY2hpcCwKKwkJCQkJCSAgICAgIGhhbmRsZV9sZXZlbF9pcnEsICJYVCIpOwogCQl9IGVsc2UgewogCQkJLyoKIAkJCSAqICdoaWdoJyBQQ0kgSVJRcyBmaWxsZWQgaW4gb24gZGVtYW5kCmRpZmYgLS1naXQgYS9hcmNoL3g4Nl82NC9rZXJuZWwvaW9fYXBpYy5jIGIvYXJjaC94ODZfNjQva2VybmVsL2lvX2FwaWMuYwppbmRleCA3NzFiY2Y3Li4xNDY1NGU2IDEwMDY0NAotLS0gYS9hcmNoL3g4Nl82NC9rZXJuZWwvaW9fYXBpYy5jCisrKyBiL2FyY2gveDg2XzY0L2tlcm5lbC9pb19hcGljLmMKQEAgLTU3LDEzICs1NywxMyBAQAogCiBzdGF0aWMgaW50IGRpc2FibGVfdGltZXJfcGluXzEgX19pbml0ZGF0YTsKIAotaW50IHRpbWVyX292ZXJfODI1NCBfX2luaXRkYXRhID0gMDsKK2ludCB0aW1lcl9vdmVyXzgyNTQgX19pbml0ZGF0YSA9IDE7CiAKIC8qIFdoZXJlIGlmIGFueXdoZXJlIGlzIHRoZSBpODI1OSBjb25uZWN0IGluIGV4dGVybmFsIGludCBtb2RlICovCiBzdGF0aWMgc3RydWN0IHsgaW50IHBpbiwgYXBpYzsgfSBpb2FwaWNfaTgyNTkgPSB7IC0xLCAtMSB9OwogCiBzdGF0aWMgREVGSU5FX1NQSU5MT0NLKGlvYXBpY19sb2NrKTsKLXN0YXRpYyBERUZJTkVfU1BJTkxPQ0sodmVjdG9yX2xvY2spOworREVGSU5FX1NQSU5MT0NLKHZlY3Rvcl9sb2NrKTsKIAogLyoKICAqICMgb2YgSVJRIHJvdXRpbmcgcmVnaXN0ZXJzCkBAIC04OCw2ICs4OCw1MiBAQAogCXNob3J0IGFwaWMsIHBpbiwgbmV4dDsKIH0gaXJxXzJfcGluW1BJTl9NQVBfU0laRV07CiAKK3N0cnVjdCBpb19hcGljIHsKKwl1bnNpZ25lZCBpbnQgaW5kZXg7CisJdW5zaWduZWQgaW50IHVudXNlZFszXTsKKwl1bnNpZ25lZCBpbnQgZGF0YTsKK307CisKK3N0YXRpYyBfX2F0dHJpYnV0ZV9jb25zdF9fIHN0cnVjdCBpb19hcGljIF9faW9tZW0gKmlvX2FwaWNfYmFzZShpbnQgaWR4KQoreworCXJldHVybiAodm9pZCBfX2lvbWVtICopIF9fZml4X3RvX3ZpcnQoRklYX0lPX0FQSUNfQkFTRV8wICsgaWR4KQorCQkrIChtcF9pb2FwaWNzW2lkeF0ubXBjX2FwaWNhZGRyICYgflBBR0VfTUFTSyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IGlvX2FwaWNfcmVhZCh1bnNpZ25lZCBpbnQgYXBpYywgdW5zaWduZWQgaW50IHJlZykKK3sKKwlzdHJ1Y3QgaW9fYXBpYyBfX2lvbWVtICppb19hcGljID0gaW9fYXBpY19iYXNlKGFwaWMpOworCXdyaXRlbChyZWcsICZpb19hcGljLT5pbmRleCk7CisJcmV0dXJuIHJlYWRsKCZpb19hcGljLT5kYXRhKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGlvX2FwaWNfd3JpdGUodW5zaWduZWQgaW50IGFwaWMsIHVuc2lnbmVkIGludCByZWcsIHVuc2lnbmVkIGludCB2YWx1ZSkKK3sKKwlzdHJ1Y3QgaW9fYXBpYyBfX2lvbWVtICppb19hcGljID0gaW9fYXBpY19iYXNlKGFwaWMpOworCXdyaXRlbChyZWcsICZpb19hcGljLT5pbmRleCk7CisJd3JpdGVsKHZhbHVlLCAmaW9fYXBpYy0+ZGF0YSk7Cit9CisKKy8qCisgKiBSZS13cml0ZSBhIHZhbHVlOiB0byBiZSB1c2VkIGZvciByZWFkLW1vZGlmeS13cml0ZQorICogY3ljbGVzIHdoZXJlIHRoZSByZWFkIGFscmVhZHkgc2V0IHVwIHRoZSBpbmRleCByZWdpc3Rlci4KKyAqLworc3RhdGljIGlubGluZSB2b2lkIGlvX2FwaWNfbW9kaWZ5KHVuc2lnbmVkIGludCBhcGljLCB1bnNpZ25lZCBpbnQgdmFsdWUpCit7CisJc3RydWN0IGlvX2FwaWMgX19pb21lbSAqaW9fYXBpYyA9IGlvX2FwaWNfYmFzZShhcGljKTsKKwl3cml0ZWwodmFsdWUsICZpb19hcGljLT5kYXRhKTsKK30KKworLyoKKyAqIFN5bmNocm9uaXplIHRoZSBJTy1BUElDIGFuZCB0aGUgQ1BVIGJ5IGRvaW5nCisgKiBhIGR1bW15IHJlYWQgZnJvbSB0aGUgSU8tQVBJQworICovCitzdGF0aWMgaW5saW5lIHZvaWQgaW9fYXBpY19zeW5jKHVuc2lnbmVkIGludCBhcGljKQoreworCXN0cnVjdCBpb19hcGljIF9faW9tZW0gKmlvX2FwaWMgPSBpb19hcGljX2Jhc2UoYXBpYyk7CisJcmVhZGwoJmlvX2FwaWMtPmRhdGEpOworfQorCiAjZGVmaW5lIF9fRE9fQUNUSU9OKFIsIEFDVElPTiwgRklOQUwpCQkJCQlcCiAJCQkJCQkJCQlcCiB7CQkJCQkJCQkJXApAQCAtMTI2LDEyICsxNzIsMzQgQEAKIAlyZXR1cm4gZXUuZW50cnk7CiB9CiAKKy8qCisgKiBXaGVuIHdlIHdyaXRlIGEgbmV3IElPIEFQSUMgcm91dGluZyBlbnRyeSwgd2UgbmVlZCB0byB3cml0ZSB0aGUgaGlnaAorICogd29yZCBmaXJzdCEgSWYgdGhlIG1hc2sgYml0IGluIHRoZSBsb3cgd29yZCBpcyBjbGVhciwgd2Ugd2lsbCBlbmFibGUKKyAqIHRoZSBpbnRlcnJ1cHQsIGFuZCB3ZSBuZWVkIHRvIG1ha2Ugc3VyZSB0aGUgZW50cnkgaXMgZnVsbHkgcG9wdWxhdGVkCisgKiBiZWZvcmUgdGhhdCBoYXBwZW5zLgorICovCiBzdGF0aWMgdm9pZCBpb2FwaWNfd3JpdGVfZW50cnkoaW50IGFwaWMsIGludCBwaW4sIHN0cnVjdCBJT19BUElDX3JvdXRlX2VudHJ5IGUpCiB7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAl1bmlvbiBlbnRyeV91bmlvbiBldTsKIAlldS5lbnRyeSA9IGU7CiAJc3Bpbl9sb2NrX2lycXNhdmUoJmlvYXBpY19sb2NrLCBmbGFncyk7CisJaW9fYXBpY193cml0ZShhcGljLCAweDExICsgMipwaW4sIGV1LncyKTsKKwlpb19hcGljX3dyaXRlKGFwaWMsIDB4MTAgKyAyKnBpbiwgZXUudzEpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlvYXBpY19sb2NrLCBmbGFncyk7Cit9CisKKy8qCisgKiBXaGVuIHdlIG1hc2sgYW4gSU8gQVBJQyByb3V0aW5nIGVudHJ5LCB3ZSBuZWVkIHRvIHdyaXRlIHRoZSBsb3cKKyAqIHdvcmQgZmlyc3QsIGluIG9yZGVyIHRvIHNldCB0aGUgbWFzayBiaXQgYmVmb3JlIHdlIGNoYW5nZSB0aGUKKyAqIGhpZ2ggYml0cyEKKyAqLworc3RhdGljIHZvaWQgaW9hcGljX21hc2tfZW50cnkoaW50IGFwaWMsIGludCBwaW4pCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1bmlvbiBlbnRyeV91bmlvbiBldSA9IHsgLmVudHJ5Lm1hc2sgPSAxIH07CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaW9hcGljX2xvY2ssIGZsYWdzKTsKIAlpb19hcGljX3dyaXRlKGFwaWMsIDB4MTAgKyAyKnBpbiwgZXUudzEpOwogCWlvX2FwaWNfd3JpdGUoYXBpYywgMHgxMSArIDIqcGluLCBldS53Mik7CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW9hcGljX2xvY2ssIGZsYWdzKTsKQEAgLTI1Niw5ICszMjQsNyBAQAogCS8qCiAJICogRGlzYWJsZSBpdCBpbiB0aGUgSU8tQVBJQyBpcnEtcm91dGluZyB0YWJsZToKIAkgKi8KLQltZW1zZXQoJmVudHJ5LCAwLCBzaXplb2YoZW50cnkpKTsKLQllbnRyeS5tYXNrID0gMTsKLQlpb2FwaWNfd3JpdGVfZW50cnkoYXBpYywgcGluLCBlbnRyeSk7CisJaW9hcGljX21hc2tfZW50cnkoYXBpYywgcGluKTsKIH0KIAogc3RhdGljIHZvaWQgY2xlYXJfSU9fQVBJQyAodm9pZCkKQEAgLTYxMiwxNSArNjc4LDE1IEBACiAJICogQWxzbywgd2UndmUgZ290IHRvIGJlIGNhcmVmdWwgbm90IHRvIHRyYXNoIGdhdGUKIAkgKiAweDgwLCBiZWNhdXNlIGludCAweDgwIGlzIGhtLCBraW5kIG9mIGltcG9ydGFudGlzaC4gOykKIAkgKi8KLQlzdGF0aWMgc3RydWN0IHsKLQkJaW50IHZlY3RvcjsKLQkJaW50IG9mZnNldDsKLQl9IHBvc1tOUl9DUFVTXSA9IHsgWyAwIC4uLiBOUl9DUFVTIC0gMV0gPSB7RklSU1RfREVWSUNFX1ZFQ1RPUiwgMH0gfTsKKwlzdGF0aWMgaW50IGN1cnJlbnRfdmVjdG9yID0gRklSU1RfREVWSUNFX1ZFQ1RPUiwgY3VycmVudF9vZmZzZXQgPSAwOwogCWludCBvbGRfdmVjdG9yID0gLTE7CiAJaW50IGNwdTsKIAogCUJVR19PTigodW5zaWduZWQpaXJxID49IE5SX0lSUV9WRUNUT1JTKTsKIAorCS8qIE9ubHkgdHJ5IGFuZCBhbGxvY2F0ZSBpcnFzIG9uIGNwdXMgdGhhdCBhcmUgcHJlc2VudCAqLworCWNwdXNfYW5kKG1hc2ssIG1hc2ssIGNwdV9vbmxpbmVfbWFwKTsKKwogCWlmIChpcnFfdmVjdG9yW2lycV0gPiAwKQogCQlvbGRfdmVjdG9yID0gaXJxX3ZlY3RvcltpcnFdOwogCWlmIChvbGRfdmVjdG9yID4gMCkgewpAQCAtNjMwLDE1ICs2OTYsMTUgQEAKIAl9CiAKIAlmb3JfZWFjaF9jcHVfbWFzayhjcHUsIG1hc2spIHsKLQkJY3B1bWFza190IGRvbWFpbjsKLQkJaW50IGZpcnN0LCBuZXdfY3B1OworCQljcHVtYXNrX3QgZG9tYWluLCBuZXdfbWFzazsKKwkJaW50IG5ld19jcHU7CiAJCWludCB2ZWN0b3IsIG9mZnNldDsKIAogCQlkb21haW4gPSB2ZWN0b3JfYWxsb2NhdGlvbl9kb21haW4oY3B1KTsKLQkJZmlyc3QgPSBmaXJzdF9jcHUoZG9tYWluKTsKKwkJY3B1c19hbmQobmV3X21hc2ssIGRvbWFpbiwgY3B1X29ubGluZV9tYXApOwogCi0JCXZlY3RvciA9IHBvc1tmaXJzdF0udmVjdG9yOwotCQlvZmZzZXQgPSBwb3NbZmlyc3RdLm9mZnNldDsKKwkJdmVjdG9yID0gY3VycmVudF92ZWN0b3I7CisJCW9mZnNldCA9IGN1cnJlbnRfb2Zmc2V0OwogbmV4dDoKIAkJdmVjdG9yICs9IDg7CiAJCWlmICh2ZWN0b3IgPj0gRklSU1RfU1lTVEVNX1ZFQ1RPUikgewpAQCAtNjQ2LDI0ICs3MTIsMjQgQEAKIAkJCW9mZnNldCA9IChvZmZzZXQgKyAxKSAlIDg7CiAJCQl2ZWN0b3IgPSBGSVJTVF9ERVZJQ0VfVkVDVE9SICsgb2Zmc2V0OwogCQl9Ci0JCWlmICh1bmxpa2VseShwb3NbZmlyc3RdLnZlY3RvciA9PSB2ZWN0b3IpKQorCQlpZiAodW5saWtlbHkoY3VycmVudF92ZWN0b3IgPT0gdmVjdG9yKSkKIAkJCWNvbnRpbnVlOwogCQlpZiAodmVjdG9yID09IElBMzJfU1lTQ0FMTF9WRUNUT1IpCiAJCQlnb3RvIG5leHQ7Ci0JCWZvcl9lYWNoX2NwdV9tYXNrKG5ld19jcHUsIGRvbWFpbikKLQkJCWlmIChwZXJfY3B1KHZlY3Rvcl9pcnEsIGNwdSlbdmVjdG9yXSAhPSAtMSkKKwkJZm9yX2VhY2hfY3B1X21hc2sobmV3X2NwdSwgbmV3X21hc2spCisJCQlpZiAocGVyX2NwdSh2ZWN0b3JfaXJxLCBuZXdfY3B1KVt2ZWN0b3JdICE9IC0xKQogCQkJCWdvdG8gbmV4dDsKIAkJLyogRm91bmQgb25lISAqLwotCQlmb3JfZWFjaF9jcHVfbWFzayhuZXdfY3B1LCBkb21haW4pIHsKLQkJCXBvc1tjcHVdLnZlY3RvciA9IHZlY3RvcjsKLQkJCXBvc1tjcHVdLm9mZnNldCA9IG9mZnNldDsKLQkJfQorCQljdXJyZW50X3ZlY3RvciA9IHZlY3RvcjsKKwkJY3VycmVudF9vZmZzZXQgPSBvZmZzZXQ7CiAJCWlmIChvbGRfdmVjdG9yID49IDApIHsKKwkJCWNwdW1hc2tfdCBvbGRfbWFzazsKIAkJCWludCBvbGRfY3B1OwotCQkJZm9yX2VhY2hfY3B1X21hc2sob2xkX2NwdSwgZG9tYWluKQorCQkJY3B1c19hbmQob2xkX21hc2ssIGlycV9kb21haW5baXJxXSwgY3B1X29ubGluZV9tYXApOworCQkJZm9yX2VhY2hfY3B1X21hc2sob2xkX2NwdSwgb2xkX21hc2spCiAJCQkJcGVyX2NwdSh2ZWN0b3JfaXJxLCBvbGRfY3B1KVtvbGRfdmVjdG9yXSA9IC0xOwogCQl9Ci0JCWZvcl9lYWNoX2NwdV9tYXNrKG5ld19jcHUsIGRvbWFpbikKKwkJZm9yX2VhY2hfY3B1X21hc2sobmV3X2NwdSwgbmV3X21hc2spCiAJCQlwZXJfY3B1KHZlY3Rvcl9pcnEsIG5ld19jcHUpW3ZlY3Rvcl0gPSBpcnE7CiAJCWlycV92ZWN0b3JbaXJxXSA9IHZlY3RvcjsKIAkJaXJxX2RvbWFpbltpcnFdID0gZG9tYWluOwpAQCAtNjg0LDYgKzc1MCwzMiBAQAogCXJldHVybiB2ZWN0b3I7CiB9CiAKK3ZvaWQgX19zZXR1cF92ZWN0b3JfaXJxKGludCBjcHUpCit7CisJLyogSW5pdGlhbGl6ZSB2ZWN0b3JfaXJxIG9uIGEgbmV3IGNwdSAqLworCS8qIFRoaXMgZnVuY3Rpb24gbXVzdCBiZSBjYWxsZWQgd2l0aCB2ZWN0b3JfbG9jayBoZWxkICovCisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgaXJxLCB2ZWN0b3I7CisKKworCS8qIE1hcmsgdGhlIGludXNlIHZlY3RvcnMgKi8KKwlmb3IgKGlycSA9IDA7IGlycSA8IE5SX0lSUV9WRUNUT1JTOyArK2lycSkgeworCQlpZiAoIWNwdV9pc3NldChjcHUsIGlycV9kb21haW5baXJxXSkpCisJCQljb250aW51ZTsKKwkJdmVjdG9yID0gaXJxX3ZlY3RvcltpcnFdOworCQlwZXJfY3B1KHZlY3Rvcl9pcnEsIGNwdSlbdmVjdG9yXSA9IGlycTsKKwl9CisJLyogTWFyayB0aGUgZnJlZSB2ZWN0b3JzICovCisJZm9yICh2ZWN0b3IgPSAwOyB2ZWN0b3IgPCBOUl9WRUNUT1JTOyArK3ZlY3RvcikgeworCQlpcnEgPSBwZXJfY3B1KHZlY3Rvcl9pcnEsIGNwdSlbdmVjdG9yXTsKKwkJaWYgKGlycSA8IDApCisJCQljb250aW51ZTsKKwkJaWYgKCFjcHVfaXNzZXQoY3B1LCBpcnFfZG9tYWluW2lycV0pKQorCQkJcGVyX2NwdSh2ZWN0b3JfaXJxLCBjcHUpW3ZlY3Rvcl0gPSAtMTsKKwl9Cit9CisKKwogZXh0ZXJuIHZvaWQgKCppbnRlcnJ1cHRbTlJfSVJRU10pKHZvaWQpOwogCiBzdGF0aWMgc3RydWN0IGlycV9jaGlwIGlvYXBpY19jaGlwOwpAQCAtNjk2LDExICs3ODgsMTMgQEAKIHsKIAlpZiAoKHRyaWdnZXIgPT0gSU9BUElDX0FVVE8gJiYgSU9fQVBJQ19pcnFfdHJpZ2dlcihpcnEpKSB8fAogCQkJdHJpZ2dlciA9PSBJT0FQSUNfTEVWRUwpCi0JCXNldF9pcnFfY2hpcF9hbmRfaGFuZGxlcihpcnEsICZpb2FwaWNfY2hpcCwKLQkJCQkJIGhhbmRsZV9mYXN0ZW9pX2lycSk7Ci0JZWxzZQotCQlzZXRfaXJxX2NoaXBfYW5kX2hhbmRsZXIoaXJxLCAmaW9hcGljX2NoaXAsCi0JCQkJCSBoYW5kbGVfZWRnZV9pcnEpOworCQlzZXRfaXJxX2NoaXBfYW5kX2hhbmRsZXJfbmFtZShpcnEsICZpb2FwaWNfY2hpcCwKKwkJCQkJICAgICAgaGFuZGxlX2Zhc3Rlb2lfaXJxLCAiZmFzdGVvaSIpOworCWVsc2UgeworCQlpcnFfZGVzY1tpcnFdLnN0YXR1cyB8PSBJUlFfREVMQVlFRF9ESVNBQkxFOworCQlzZXRfaXJxX2NoaXBfYW5kX2hhbmRsZXJfbmFtZShpcnEsICZpb2FwaWNfY2hpcCwKKwkJCQkJICAgICAgaGFuZGxlX2VkZ2VfaXJxLCAiZWRnZSIpOworCX0KIH0KIAogc3RhdGljIHZvaWQgX19pbml0IHNldHVwX0lPX0FQSUNfaXJxcyh2b2lkKQpAQCAtODA2LDcgKzkwMCw3IEBACiAJICogVGhlIHRpbWVyIElSUSBkb2Vzbid0IGhhdmUgdG8ga25vdyB0aGF0IGJlaGluZCB0aGUKIAkgKiBzY2VuZSB3ZSBoYXZlIGEgODI1OUEtbWFzdGVyIGluIEFFT0kgbW9kZSAuLi4KIAkgKi8KLQlzZXRfaXJxX2NoaXBfYW5kX2hhbmRsZXIoMCwgJmlvYXBpY19jaGlwLCBoYW5kbGVfZWRnZV9pcnEpOworCXNldF9pcnFfY2hpcF9hbmRfaGFuZGxlcl9uYW1lKDAsICZpb2FwaWNfY2hpcCwgaGFuZGxlX2VkZ2VfaXJxLCAiZWRnZSIpOwogCiAJLyoKIAkgKiBBZGQgaXQgdG8gdGhlIElPLUFQSUMgaXJxLXJvdXRpbmcgdGFibGU6CkBAIC0xMjU1LDEyICsxMzQ5LDE1IEBACiB7CiAJY3B1bWFza190IG1hc2s7CiAJdW5zaWduZWQgdmVjdG9yOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKKwlzcGluX2xvY2tfaXJxc2F2ZSgmdmVjdG9yX2xvY2ssIGZsYWdzKTsKIAl2ZWN0b3IgPSBpcnFfdmVjdG9yW2lycV07CiAJY3B1c19jbGVhcihtYXNrKTsKLQljcHVfc2V0KHZlY3RvciA+PiA4LCBtYXNrKTsKKwljcHVfc2V0KGZpcnN0X2NwdShpcnFfZG9tYWluW2lycV0pLCBtYXNrKTsKIAotCXNlbmRfSVBJX21hc2sobWFzaywgdmVjdG9yICYgMHhmZik7CisJc2VuZF9JUElfbWFzayhtYXNrLCB2ZWN0b3IpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnZlY3Rvcl9sb2NrLCBmbGFncyk7CiAKIAlyZXR1cm4gMTsKIH0KQEAgLTE4MzksNyArMTkzNiw3IEBACiAKIAl3cml0ZV9tc2lfbXNnKGlycSwgJm1zZyk7CiAKLQlzZXRfaXJxX2NoaXBfYW5kX2hhbmRsZXIoaXJxLCAmbXNpX2NoaXAsIGhhbmRsZV9lZGdlX2lycSk7CisJc2V0X2lycV9jaGlwX2FuZF9oYW5kbGVyX25hbWUoaXJxLCAmbXNpX2NoaXAsIGhhbmRsZV9lZGdlX2lycSwgImVkZ2UiKTsKIAogCXJldHVybiAwOwogfQpAQCAtMTg2MCwxOCArMTk1NywxNiBAQAogCiBzdGF0aWMgdm9pZCB0YXJnZXRfaHRfaXJxKHVuc2lnbmVkIGludCBpcnEsIHVuc2lnbmVkIGludCBkZXN0LCB1OCB2ZWN0b3IpCiB7Ci0JdTMyIGxvdywgaGlnaDsKLQlsb3cgID0gcmVhZF9odF9pcnFfbG93KGlycSk7Ci0JaGlnaCA9IHJlYWRfaHRfaXJxX2hpZ2goaXJxKTsKKwlzdHJ1Y3QgaHRfaXJxX21zZyBtc2c7CisJZmV0Y2hfaHRfaXJxX21zZyhpcnEsICZtc2cpOwogCi0JbG93ICAmPSB+KEhUX0lSUV9MT1dfVkVDVE9SX01BU0sgfCBIVF9JUlFfTE9XX0RFU1RfSURfTUFTSyk7Ci0JaGlnaCAmPSB+KEhUX0lSUV9ISUdIX0RFU1RfSURfTUFTSyk7CisJbXNnLmFkZHJlc3NfbG8gJj0gfihIVF9JUlFfTE9XX1ZFQ1RPUl9NQVNLIHwgSFRfSVJRX0xPV19ERVNUX0lEX01BU0spOworCW1zZy5hZGRyZXNzX2hpICY9IH4oSFRfSVJRX0hJR0hfREVTVF9JRF9NQVNLKTsKIAotCWxvdyAgfD0gSFRfSVJRX0xPV19WRUNUT1IodmVjdG9yKSB8IEhUX0lSUV9MT1dfREVTVF9JRChkZXN0KTsKLQloaWdoIHw9IEhUX0lSUV9ISUdIX0RFU1RfSUQoZGVzdCk7CisJbXNnLmFkZHJlc3NfbG8gfD0gSFRfSVJRX0xPV19WRUNUT1IodmVjdG9yKSB8IEhUX0lSUV9MT1dfREVTVF9JRChkZXN0KTsKKwltc2cuYWRkcmVzc19oaSB8PSBIVF9JUlFfSElHSF9ERVNUX0lEKGRlc3QpOwogCi0Jd3JpdGVfaHRfaXJxX2xvdyhpcnEsIGxvdyk7Ci0Jd3JpdGVfaHRfaXJxX2hpZ2goaXJxLCBoaWdoKTsKKwl3cml0ZV9odF9pcnFfbXNnKGlycSwgJm1zZyk7CiB9CiAKIHN0YXRpYyB2b2lkIHNldF9odF9pcnFfYWZmaW5pdHkodW5zaWduZWQgaW50IGlycSwgY3B1bWFza190IG1hc2spCkBAIC0xODkyLDEyICsxOTg3LDEyIEBACiAKIAlkZXN0ID0gY3B1X21hc2tfdG9fYXBpY2lkKHRtcCk7CiAKLQl0YXJnZXRfaHRfaXJxKGlycSwgZGVzdCwgdmVjdG9yICYgMHhmZik7CisJdGFyZ2V0X2h0X2lycShpcnEsIGRlc3QsIHZlY3Rvcik7CiAJc2V0X25hdGl2ZV9pcnFfaW5mbyhpcnEsIG1hc2spOwogfQogI2VuZGlmCiAKLXN0YXRpYyBzdHJ1Y3QgaHdfaW50ZXJydXB0X3R5cGUgaHRfaXJxX2NoaXAgPSB7CitzdGF0aWMgc3RydWN0IGlycV9jaGlwIGh0X2lycV9jaGlwID0gewogCS5uYW1lCQk9ICJQQ0ktSFQiLAogCS5tYXNrCQk9IG1hc2tfaHRfaXJxLAogCS51bm1hc2sJCT0gdW5tYXNrX2h0X2lycSwKQEAgLTE5MTUsMTQgKzIwMTAsMTUgQEAKIAogCXZlY3RvciA9IGFzc2lnbl9pcnFfdmVjdG9yKGlycSwgVEFSR0VUX0NQVVMsICZ0bXApOwogCWlmICh2ZWN0b3IgPj0gMCkgewotCQl1MzIgbG93LCBoaWdoOworCQlzdHJ1Y3QgaHRfaXJxX21zZyBtc2c7CiAJCXVuc2lnbmVkIGRlc3Q7CiAKIAkJZGVzdCA9IGNwdV9tYXNrX3RvX2FwaWNpZCh0bXApOwogCi0JCWhpZ2ggPSAJSFRfSVJRX0hJR0hfREVTVF9JRChkZXN0KTsKKwkJbXNnLmFkZHJlc3NfaGkgPSBIVF9JUlFfSElHSF9ERVNUX0lEKGRlc3QpOwogCi0JCWxvdyA9CUhUX0lSUV9MT1dfQkFTRSB8CisJCW1zZy5hZGRyZXNzX2xvID0KKwkJCUhUX0lSUV9MT1dfQkFTRSB8CiAJCQlIVF9JUlFfTE9XX0RFU1RfSUQoZGVzdCkgfAogCQkJSFRfSVJRX0xPV19WRUNUT1IodmVjdG9yKSB8CiAJCQkoKElOVF9ERVNUX01PREUgPT0gMCkgPwpAQCAtMTkzMSwxMiArMjAyNywxMyBAQAogCQkJSFRfSVJRX0xPV19SUUVPSV9FREdFIHwKIAkJCSgoSU5UX0RFTElWRVJZX01PREUgIT0gZGVzdF9Mb3dlc3RQcmlvKSA/CiAJCQkJSFRfSVJRX0xPV19NVF9GSVhFRCA6Ci0JCQkJSFRfSVJRX0xPV19NVF9BUkJJVFJBVEVEKTsKKwkJCQlIVF9JUlFfTE9XX01UX0FSQklUUkFURUQpIHwKKwkJCUhUX0lSUV9MT1dfSVJRX01BU0tFRDsKIAotCQl3cml0ZV9odF9pcnFfbG93KGlycSwgbG93KTsKLQkJd3JpdGVfaHRfaXJxX2hpZ2goaXJxLCBoaWdoKTsKKwkJd3JpdGVfaHRfaXJxX21zZyhpcnEsICZtc2cpOwogCi0JCXNldF9pcnFfY2hpcF9hbmRfaGFuZGxlcihpcnEsICZodF9pcnFfY2hpcCwgaGFuZGxlX2VkZ2VfaXJxKTsKKwkJc2V0X2lycV9jaGlwX2FuZF9oYW5kbGVyX25hbWUoaXJxLCAmaHRfaXJxX2NoaXAsCisJCQkJCSAgICAgIGhhbmRsZV9lZGdlX2lycSwgImVkZ2UiKTsKIAl9CiAJcmV0dXJuIHZlY3RvcjsKIH0KZGlmZiAtLWdpdCBhL2FyY2gveDg2XzY0L2tlcm5lbC9pcnEuYyBiL2FyY2gveDg2XzY0L2tlcm5lbC9pcnEuYwppbmRleCBkZmY2OGViLi5lNDZjNTU4IDEwMDY0NAotLS0gYS9hcmNoL3g4Nl82NC9rZXJuZWwvaXJxLmMKKysrIGIvYXJjaC94ODZfNjQva2VybmVsL2lycS5jCkBAIC03NSw3ICs3NSw3IEBACiAJCQlzZXFfcHJpbnRmKHAsICIlMTB1ICIsIGtzdGF0X2NwdShqKS5pcnFzW2ldKTsKICNlbmRpZgogCQlzZXFfcHJpbnRmKHAsICIgJThzIiwgaXJxX2Rlc2NbaV0uY2hpcC0+bmFtZSk7Ci0JCXNlcV9wcmludGYocCwgIi0lcyIsIGhhbmRsZV9pcnFfbmFtZShpcnFfZGVzY1tpXS5oYW5kbGVfaXJxKSk7CisJCXNlcV9wcmludGYocCwgIi0lLThzIiwgaXJxX2Rlc2NbaV0ubmFtZSk7CiAKIAkJc2VxX3ByaW50ZihwLCAiICAlcyIsIGFjdGlvbi0+bmFtZSk7CiAJCWZvciAoYWN0aW9uPWFjdGlvbi0+bmV4dDsgYWN0aW9uOyBhY3Rpb24gPSBhY3Rpb24tPm5leHQpCmRpZmYgLS1naXQgYS9hcmNoL3g4Nl82NC9rZXJuZWwvcGNpLWNhbGdhcnkuYyBiL2FyY2gveDg2XzY0L2tlcm5lbC9wY2ktY2FsZ2FyeS5jCmluZGV4IGIzMjk2Y2MuLjM3YTc3MDggMTAwNjQ0Ci0tLSBhL2FyY2gveDg2XzY0L2tlcm5lbC9wY2ktY2FsZ2FyeS5jCisrKyBiL2FyY2gveDg2XzY0L2tlcm5lbC9wY2ktY2FsZ2FyeS5jCkBAIC01Miw3ICs1Miw4IEBACiAjZGVmaW5lIE9ORV9CQVNFRF9DSEFTU0lTX05VTSAgIDEKIAogLyogcmVnaXN0ZXIgb2Zmc2V0cyBpbnNpZGUgdGhlIGhvc3QgYnJpZGdlIHNwYWNlICovCi0jZGVmaW5lIFBIQl9DU1JfT0ZGU0VUCQkweDAxMTAKKyNkZWZpbmUgQ0FMR0FSWV9DT05GSUdfUkVHCTB4MDEwOAorI2RlZmluZSBQSEJfQ1NSX09GRlNFVAkJMHgwMTEwIC8qIENoYW5uZWwgU3RhdHVzICovCiAjZGVmaW5lIFBIQl9QTFNTUl9PRkZTRVQJMHgwMTIwCiAjZGVmaW5lIFBIQl9DT05GSUdfUldfT0ZGU0VUCTB4MDE2MAogI2RlZmluZSBQSEJfSU9CQVNFX0JBUl9MT1cJMHgwMTcwCkBAIC04Myw2ICs4NCw4IEBACiAjZGVmaW5lIFRBUl9WQUxJRAkJMHgwMDAwMDAwMDAwMDAwMDA4VUwKIC8qIENTUiAoQ2hhbm5lbC9ETUEgU3RhdHVzIFJlZ2lzdGVyKSAqLwogI2RlZmluZSBDU1JfQUdFTlRfTUFTSwkJMHhmZmUwZmZmZgorLyogQ0NSIChDYWxnYXJ5IENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIpICovCisjZGVmaW5lIENDUl8yU0VDX1RJTUVPVVQgICAgICAgIDB4MDAwMDAwMDAwMDAwMDAwRVVMCiAKICNkZWZpbmUgTUFYX05VTV9PRl9QSEJTCQk4IC8qIGhvdyBtYW55IFBIQnMgaW4gdG90YWw/ICovCiAjZGVmaW5lIE1BWF9OVU1fQ0hBU1NJUwkJOCAvKiBtYXggbnVtYmVyIG9mIGNoYXNzaXMgKi8KQEAgLTczMiw2ICs3MzUsMzggQEAKIAl9CiB9CiAKK3N0YXRpYyB2b2lkIF9faW5pdCBjYWxnYXJ5X2luY3JlYXNlX3NwbGl0X2NvbXBsZXRpb25fdGltZW91dCh2b2lkIF9faW9tZW0gKmJiYXIsCisJdW5zaWduZWQgY2hhciBidXNudW0pCit7CisJdTY0IHZhbDY0OworCXZvaWQgX19pb21lbSAqdGFyZ2V0OworCXVuc2lnbmVkIGxvbmcgcGhiX3NoaWZ0ID0gLTE7CisJdTY0IG1hc2s7CisKKwlzd2l0Y2ggKGJ1c25vX3RvX3BoYmlkKGJ1c251bSkpIHsKKwljYXNlIDA6IHBoYl9zaGlmdCA9ICg2MyAtIDE5KTsKKwkJYnJlYWs7CisJY2FzZSAxOiBwaGJfc2hpZnQgPSAoNjMgLSAyMyk7CisJCWJyZWFrOworCWNhc2UgMjogcGhiX3NoaWZ0ID0gKDYzIC0gMjcpOworCQlicmVhazsKKwljYXNlIDM6IHBoYl9zaGlmdCA9ICg2MyAtIDM1KTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJQlVHX09OKGJ1c25vX3RvX3BoYmlkKGJ1c251bSkpOworCX0KKworCXRhcmdldCA9IGNhbGdhcnlfcmVnKGJiYXIsIENBTEdBUllfQ09ORklHX1JFRyk7CisJdmFsNjQgPSBiZTY0X3RvX2NwdShyZWFkcSh0YXJnZXQpKTsKKworCS8qIHplcm8gb3V0IHRoaXMgUEhCJ3MgdGltZXIgYml0cyAqLworCW1hc2sgPSB+KDB4RlVMIDw8IHBoYl9zaGlmdCk7CisJdmFsNjQgJj0gbWFzazsKKwl2YWw2NCB8PSAoQ0NSXzJTRUNfVElNRU9VVCA8PCBwaGJfc2hpZnQpOworCXdyaXRlcShjcHVfdG9fYmU2NCh2YWw2NCksIHRhcmdldCk7CisJcmVhZHEodGFyZ2V0KTsgLyogZmx1c2ggKi8KK30KKwogc3RhdGljIHZvaWQgX19pbml0IGNhbGdhcnlfZW5hYmxlX3RyYW5zbGF0aW9uKHN0cnVjdCBwY2lfZGV2ICpkZXYpCiB7CiAJdTMyIHZhbDMyOwpAQCAtNzU2LDYgKzc5MSwxMyBAQAogCXdyaXRlbChjcHVfdG9fYmUzMih2YWwzMiksIHRhcmdldCk7CiAJcmVhZGwodGFyZ2V0KTsgLyogZmx1c2ggKi8KIAorCS8qCisJICogR2l2ZSBzcGxpdCBjb21wbGV0aW9uIGEgbG9uZ2VyIHRpbWVvdXQgb24gYnVzIDEgZm9yIGFpYzk0eHgKKwkgKiBodHRwOi8vYnVnemlsbGEua2VybmVsLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzE4MAorCSAqLworCWlmIChidXNudW0gPT0gMSkKKwkJY2FsZ2FyeV9pbmNyZWFzZV9zcGxpdF9jb21wbGV0aW9uX3RpbWVvdXQoYmJhciwgYnVzbnVtKTsKKwogCWluaXRfdGltZXIoJnRibC0+d2F0Y2hkb2dfdGltZXIpOwogCXRibC0+d2F0Y2hkb2dfdGltZXIuZnVuY3Rpb24gPSAmY2FsZ2FyeV93YXRjaGRvZzsKIAl0YmwtPndhdGNoZG9nX3RpbWVyLmRhdGEgPSAodW5zaWduZWQgbG9uZylkZXY7CmRpZmYgLS1naXQgYS9hcmNoL3g4Nl82NC9rZXJuZWwvcHJvY2Vzcy5jIGIvYXJjaC94ODZfNjQva2VybmVsL3Byb2Nlc3MuYwppbmRleCA1ZTk1YjI1Li43NDUxYTRjIDEwMDY0NAotLS0gYS9hcmNoL3g4Nl82NC9rZXJuZWwvcHJvY2Vzcy5jCisrKyBiL2FyY2gveDg2XzY0L2tlcm5lbC9wcm9jZXNzLmMKQEAgLTg4LDkgKzg4LDggQEAKIAogc3RhdGljIHZvaWQgX19leGl0X2lkbGUodm9pZCkKIHsKLQlpZiAocmVhZF9wZGEoaXNpZGxlKSA9PSAwKQorCWlmICh0ZXN0X2FuZF9jbGVhcl9iaXRfcGRhKDAsIGlzaWRsZSkgPT0gMCkKIAkJcmV0dXJuOwotCXdyaXRlX3BkYShpc2lkbGUsIDApOwogCWF0b21pY19ub3RpZmllcl9jYWxsX2NoYWluKCZpZGxlX25vdGlmaWVyLCBJRExFX0VORCwgTlVMTCk7CiB9CiAKQEAgLTE0NSw3ICsxNDQsNyBAQAogdm9pZCBjcHVfaWRsZV93YWl0KHZvaWQpCiB7CiAJdW5zaWduZWQgaW50IGNwdSwgdGhpc19jcHUgPSBnZXRfY3B1KCk7Ci0JY3B1bWFza190IG1hcDsKKwljcHVtYXNrX3QgbWFwLCB0bXAgPSBjdXJyZW50LT5jcHVzX2FsbG93ZWQ7CiAKIAlzZXRfY3B1c19hbGxvd2VkKGN1cnJlbnQsIGNwdW1hc2tfb2ZfY3B1KHRoaXNfY3B1KSk7CiAJcHV0X2NwdSgpOwpAQCAtMTY4LDYgKzE2Nyw4IEBACiAJCX0KIAkJY3B1c19hbmQobWFwLCBtYXAsIGNwdV9vbmxpbmVfbWFwKTsKIAl9IHdoaWxlICghY3B1c19lbXB0eShtYXApKTsKKworCXNldF9jcHVzX2FsbG93ZWQoY3VycmVudCwgdG1wKTsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKGNwdV9pZGxlX3dhaXQpOwogCkBAIC0yMzgsMTggKzIzOSwyNiBAQAogICogV2UgZXhlY3V0ZSBNT05JVE9SIGFnYWluc3QgbmVlZF9yZXNjaGVkIGFuZCBlbnRlciBvcHRpbWl6ZWQgd2FpdCBzdGF0ZQogICogdGhyb3VnaCBNV0FJVC4gV2hlbmV2ZXIgc29tZW9uZSBjaGFuZ2VzIG5lZWRfcmVzY2hlZCwgd2Ugd291bGQgYmUgd29rZW4KICAqIHVwIGZyb20gTVdBSVQgKHdpdGhvdXQgYW4gSVBJKS4KKyAqCisgKiBOZXcgd2l0aCBDb3JlIER1byBwcm9jZXNzb3JzLCBNV0FJVCBjYW4gdGFrZSBzb21lIGhpbnRzIGJhc2VkIG9uIENQVQorICogY2FwYWJpbGl0eS4KICAqLwordm9pZCBtd2FpdF9pZGxlX3dpdGhfaGludHModW5zaWduZWQgbG9uZyBlYXgsIHVuc2lnbmVkIGxvbmcgZWN4KQoreworCWlmICghbmVlZF9yZXNjaGVkKCkpIHsKKwkJX19tb25pdG9yKCh2b2lkICopJmN1cnJlbnRfdGhyZWFkX2luZm8oKS0+ZmxhZ3MsIDAsIDApOworCQlzbXBfbWIoKTsKKwkJaWYgKCFuZWVkX3Jlc2NoZWQoKSkKKwkJCV9fbXdhaXQoZWF4LCBlY3gpOworCX0KK30KKworLyogRGVmYXVsdCBNT05JVE9SL01XQUlUIHdpdGggbm8gaGludHMsIHVzZWQgZm9yIGRlZmF1bHQgQzEgc3RhdGUgKi8KIHN0YXRpYyB2b2lkIG13YWl0X2lkbGUodm9pZCkKIHsKIAlsb2NhbF9pcnFfZW5hYmxlKCk7Ci0KLQl3aGlsZSAoIW5lZWRfcmVzY2hlZCgpKSB7Ci0JCV9fbW9uaXRvcigodm9pZCAqKSZjdXJyZW50X3RocmVhZF9pbmZvKCktPmZsYWdzLCAwLCAwKTsKLQkJc21wX21iKCk7Ci0JCWlmIChuZWVkX3Jlc2NoZWQoKSkKLQkJCWJyZWFrOwotCQlfX213YWl0KDAsIDApOwotCX0KKwl3aGlsZSAoIW5lZWRfcmVzY2hlZCgpKQorCQltd2FpdF9pZGxlX3dpdGhfaGludHMoMCwwKTsKIH0KIAogdm9pZCBfX2NwdWluaXQgc2VsZWN0X2lkbGVfcm91dGluZShjb25zdCBzdHJ1Y3QgY3B1aW5mb194ODYgKmMpCmRpZmYgLS1naXQgYS9hcmNoL3g4Nl82NC9rZXJuZWwvc21wLmMgYi9hcmNoL3g4Nl82NC9rZXJuZWwvc21wLmMKaW5kZXggNGY2NzY5Ny4uOWY3NGM4OCAxMDA2NDQKLS0tIGEvYXJjaC94ODZfNjQva2VybmVsL3NtcC5jCisrKyBiL2FyY2gveDg2XzY0L2tlcm5lbC9zbXAuYwpAQCAtMzc2LDkgKzM3Niw4IEBACiAJLyogcHJldmVudCBwcmVlbXB0aW9uIGFuZCByZXNjaGVkdWxlIG9uIGFub3RoZXIgcHJvY2Vzc29yICovCiAJaW50IG1lID0gZ2V0X2NwdSgpOwogCWlmIChjcHUgPT0gbWUpIHsKLQkJV0FSTl9PTigxKTsKIAkJcHV0X2NwdSgpOwotCQlyZXR1cm4gLUVCVVNZOworCQlyZXR1cm4gMDsKIAl9CiAJc3Bpbl9sb2NrX2JoKCZjYWxsX2xvY2spOwogCV9fc21wX2NhbGxfZnVuY3Rpb25fc2luZ2xlKGNwdSwgZnVuYywgaW5mbywgbm9uYXRvbWljLCB3YWl0KTsKZGlmZiAtLWdpdCBhL2FyY2gveDg2XzY0L2tlcm5lbC9zbXBib290LmMgYi9hcmNoL3g4Nl82NC9rZXJuZWwvc21wYm9vdC5jCmluZGV4IDdiN2E2ODcuLjYyYzJlNzQgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2XzY0L2tlcm5lbC9zbXBib290LmMKKysrIGIvYXJjaC94ODZfNjQva2VybmVsL3NtcGJvb3QuYwpAQCAtNTgxLDEyICs1ODEsMTYgQEAKIAkgKiBzbXBfY2FsbF9mdW5jdGlvbigpLgogCSAqLwogCWxvY2tfaXBpX2NhbGxfbG9jaygpOworCXNwaW5fbG9jaygmdmVjdG9yX2xvY2spOwogCisJLyogU2V0dXAgdGhlIHBlciBjcHUgaXJxIGhhbmRsaW5nIGRhdGEgc3RydWN0dXJlcyAqLworCV9fc2V0dXBfdmVjdG9yX2lycShzbXBfcHJvY2Vzc29yX2lkKCkpOwogCS8qCiAJICogQWxsb3cgdGhlIG1hc3RlciB0byBjb250aW51ZS4KIAkgKi8KIAljcHVfc2V0KHNtcF9wcm9jZXNzb3JfaWQoKSwgY3B1X29ubGluZV9tYXApOwogCXBlcl9jcHUoY3B1X3N0YXRlLCBzbXBfcHJvY2Vzc29yX2lkKCkpID0gQ1BVX09OTElORTsKKwlzcGluX3VubG9jaygmdmVjdG9yX2xvY2spOwogCXVubG9ja19pcGlfY2FsbF9sb2NrKCk7CiAKIAljcHVfaWRsZSgpOwpAQCAtNzk5LDcgKzgwMyw2IEBACiAJCQkJY3B1LCBub2RlKTsKIAl9CiAKLQogCWFsdGVybmF0aXZlc19zbXBfc3dpdGNoKDEpOwogCiAJY19pZGxlLmlkbGUgPSBnZXRfaWRsZV9mb3JfY3B1KGNwdSk7CkBAIC0xMjQ2LDggKzEyNDksMTAgQEAKIAlsb2NhbF9pcnFfZGlzYWJsZSgpOwogCXJlbW92ZV9zaWJsaW5naW5mbyhjcHUpOwogCisJc3Bpbl9sb2NrKCZ2ZWN0b3JfbG9jayk7CiAJLyogSXQncyBub3cgc2FmZSB0byByZW1vdmUgdGhpcyBwcm9jZXNzb3IgZnJvbSB0aGUgb25saW5lIG1hcCAqLwogCWNwdV9jbGVhcihjcHUsIGNwdV9vbmxpbmVfbWFwKTsKKwlzcGluX3VubG9jaygmdmVjdG9yX2xvY2spOwogCXJlbW92ZV9jcHVfZnJvbV9tYXBzKCk7CiAJZml4dXBfaXJxcyhjcHVfb25saW5lX21hcCk7CiAJcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9hcmNoL3g4Nl82NC9rZXJuZWwvdGltZS5jIGIvYXJjaC94ODZfNjQva2VybmVsL3RpbWUuYwppbmRleCAxYmE1YTQ0Li5lM2VmNTQ0IDEwMDY0NAotLS0gYS9hcmNoL3g4Nl82NC9rZXJuZWwvdGltZS5jCisrKyBiL2FyY2gveDg2XzY0L2tlcm5lbC90aW1lLmMKQEAgLTg3NiwxNSArODc2LDYgQEAKIAl0aW1lcl9pbnRlcnJ1cHQsIElSUUZfRElTQUJMRUQsIENQVV9NQVNLX05PTkUsICJ0aW1lciIsIE5VTEwsIE5VTEwKIH07CiAKLXN0YXRpYyBpbnQgX19jcHVpbml0Ci10aW1lX2NwdV9ub3RpZmllcihzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKm5iLCB1bnNpZ25lZCBsb25nIGFjdGlvbiwgdm9pZCAqaGNwdSkKLXsKLQl1bnNpZ25lZCBjcHUgPSAodW5zaWduZWQgbG9uZykgaGNwdTsKLQlpZiAoYWN0aW9uID09IENQVV9PTkxJTkUpCi0JCXZzeXNjYWxsX3NldF9jcHUoY3B1KTsKLQlyZXR1cm4gTk9USUZZX0RPTkU7Ci19Ci0KIHZvaWQgX19pbml0IHRpbWVfaW5pdCh2b2lkKQogewogCWlmIChub2hwZXQpCkBAIC05MjUsOCArOTE2LDYgQEAKIAl2eHRpbWUubGFzdF90c2MgPSBnZXRfY3ljbGVzX3N5bmMoKTsKIAlzZXRfY3ljMm5zX3NjYWxlKGNwdV9raHopOwogCXNldHVwX2lycSgwLCAmaXJxMCk7Ci0JaG90Y3B1X25vdGlmaWVyKHRpbWVfY3B1X25vdGlmaWVyLCAwKTsKLQl0aW1lX2NwdV9ub3RpZmllcihOVUxMLCBDUFVfT05MSU5FLCAodm9pZCAqKShsb25nKXNtcF9wcm9jZXNzb3JfaWQoKSk7CiAKICNpZm5kZWYgQ09ORklHX1NNUAogCXRpbWVfaW5pdF9ndG9kKCk7CkBAIC05NDgsNyArOTM3LDcgQEAKICAJaWYgKGJvb3RfY3B1X2RhdGEueDg2X3ZlbmRvciA9PSBYODZfVkVORE9SX0lOVEVMKSB7CiAjaWZkZWYgQ09ORklHX0FDUEkKIAkJLyogQnV0IFRTQyBkb2Vzbid0IHRpY2sgaW4gQzMgc28gZG9uJ3QgdXNlIGl0IHRoZXJlICovCi0JCWlmIChhY3BpX2ZhZHQubGVuZ3RoID4gMCAmJiBhY3BpX2ZhZHQucGx2bDNfbGF0IDwgMTAwKQorCQlpZiAoYWNwaV9mYWR0Lmxlbmd0aCA+IDAgJiYgYWNwaV9mYWR0LnBsdmwzX2xhdCA8IDEwMDApCiAJCQlyZXR1cm4gMTsKICNlbmRpZgogIAkJcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9hcmNoL3g4Nl82NC9rZXJuZWwvdHJhcHMuYyBiL2FyY2gveDg2XzY0L2tlcm5lbC90cmFwcy5jCmluZGV4IDc4MTkwMjJhLi5hMTUzZDBhIDEwMDY0NAotLS0gYS9hcmNoL3g4Nl82NC9rZXJuZWwvdHJhcHMuYworKysgYi9hcmNoL3g4Nl82NC9rZXJuZWwvdHJhcHMuYwpAQCAtMjkwLDYgKzI5MCwxMiBAQAogCQlpZiAodHNrICYmIHRzayAhPSBjdXJyZW50KQogCQkJc3RhY2sgPSAodW5zaWduZWQgbG9uZyAqKXRzay0+dGhyZWFkLnJzcDsKIAl9CisJLyoKKwkgKiBBbGlnbiB0aGUgc3RhY2sgcG9pbnRlciBvbiB3b3JkIGJvdW5kYXJ5LCBsYXRlciBsb29wcworCSAqIHJlbHkgb24gdGhhdCAoYW5kIGNvcnJ1cHRpb24gLyBkZWJ1ZyBpbmZvIGJ1Z3MgY2FuIGNhdXNlCisJICogdW5hbGlnbmVkIHZhbHVlcyBoZXJlKToKKwkgKi8KKwlzdGFjayA9ICh1bnNpZ25lZCBsb25nICopKCh1bnNpZ25lZCBsb25nKXN0YWNrICYgfihzaXplb2YobG9uZyktMSkpOwogCiAJLyoKIAkgKiBQcmludCBmdW5jdGlvbiBjYWxsIGVudHJpZXMgd2l0aGluIGEgc3RhY2suICdjb25kJyBpcyB0aGUKZGlmZiAtLWdpdCBhL2FyY2gveDg2XzY0L2tlcm5lbC92bWxpbnV4Lmxkcy5TIGIvYXJjaC94ODZfNjQva2VybmVsL3ZtbGludXgubGRzLlMKaW5kZXggYjlkZjJhYi4uZDk1MzRlNyAxMDA2NDQKLS0tIGEvYXJjaC94ODZfNjQva2VybmVsL3ZtbGludXgubGRzLlMKKysrIGIvYXJjaC94ODZfNjQva2VybmVsL3ZtbGludXgubGRzLlMKQEAgLTE3LDYgKzE3LDcgQEAKIAl0ZXh0IFBUX0xPQUQgRkxBR1MoNSk7CS8qIFJfRSAqLwogCWRhdGEgUFRfTE9BRCBGTEFHUyg3KTsJLyogUldFICovCiAJdXNlciBQVF9MT0FEIEZMQUdTKDcpOwkvKiBSV0UgKi8KKwlkYXRhLmluaXQgUFRfTE9BRCBGTEFHUyg3KTsJLyogUldFICovCiAJbm90ZSBQVF9OT1RFIEZMQUdTKDQpOwkvKiBSX18gKi8KIH0KIFNFQ1RJT05TCkBAIC01OSw2ICs2MCw3IEBACiAgIH0KICNlbmRpZgogCisgIC4gPSBBTElHTihQQUdFX1NJWkUpOyAgICAgICAgLyogQWxpZ24gZGF0YSBzZWdtZW50IHRvIHBhZ2Ugc2l6ZSBib3VuZGFyeSAqLwogCQkJCS8qIERhdGEgKi8KICAgLmRhdGEgOiBBVChBRERSKC5kYXRhKSAtIExPQURfT0ZGU0VUKSB7CiAJKiguZGF0YSkKQEAgLTEzMSw3ICsxMzMsNyBAQAogICAuID0gQUxJR04oODE5Mik7CQkvKiBpbml0X3Rhc2sgKi8KICAgLmRhdGEuaW5pdF90YXNrIDogQVQoQUREUiguZGF0YS5pbml0X3Rhc2spIC0gTE9BRF9PRkZTRVQpIHsKIAkqKC5kYXRhLmluaXRfdGFzaykKLSAgfSA6ZGF0YQorICB9OmRhdGEuaW5pdAogCiAgIC4gPSBBTElHTig0MDk2KTsKICAgLmRhdGEucGFnZV9hbGlnbmVkIDogQVQoQUREUiguZGF0YS5wYWdlX2FsaWduZWQpIC0gTE9BRF9PRkZTRVQpIHsKQEAgLTE3NCwxMyArMTc2LDcgQEAKICAgX19zZXR1cF9lbmQgPSAuOwogICBfX2luaXRjYWxsX3N0YXJ0ID0gLjsKICAgLmluaXRjYWxsLmluaXQgOiBBVChBRERSKC5pbml0Y2FsbC5pbml0KSAtIExPQURfT0ZGU0VUKSB7Ci0JKiguaW5pdGNhbGwxLmluaXQpIAotCSooLmluaXRjYWxsMi5pbml0KSAKLQkqKC5pbml0Y2FsbDMuaW5pdCkgCi0JKiguaW5pdGNhbGw0LmluaXQpIAotCSooLmluaXRjYWxsNS5pbml0KSAKLQkqKC5pbml0Y2FsbDYuaW5pdCkgCi0JKiguaW5pdGNhbGw3LmluaXQpCisJSU5JVENBTExTCiAgIH0KICAgX19pbml0Y2FsbF9lbmQgPSAuOwogICBfX2Nvbl9pbml0Y2FsbF9zdGFydCA9IC47CmRpZmYgLS1naXQgYS9hcmNoL3g4Nl82NC9rZXJuZWwvdnNtcC5jIGIvYXJjaC94ODZfNjQva2VybmVsL3ZzbXAuYwppbmRleCAwNDRlODUyLi40MTRjYWYwIDEwMDY0NAotLS0gYS9hcmNoL3g4Nl82NC9rZXJuZWwvdnNtcC5jCisrKyBiL2FyY2gveDg2XzY0L2tlcm5lbC92c21wLmMKQEAgLTE0LDYgKzE0LDcgQEAKICNpbmNsdWRlIDxsaW51eC9wY2lfaWRzLmg+CiAjaW5jbHVkZSA8bGludXgvcGNpX3JlZ3MuaD4KICNpbmNsdWRlIDxhc20vcGNpLWRpcmVjdC5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgogCiBzdGF0aWMgaW50IF9faW5pdCB2c21wX2luaXQodm9pZCkKIHsKZGlmZiAtLWdpdCBhL2FyY2gveDg2XzY0L2tlcm5lbC92c3lzY2FsbC5jIGIvYXJjaC94ODZfNjQva2VybmVsL3ZzeXNjYWxsLmMKaW5kZXggYTk4YjQ2MC4uOTI1NDZjMSAxMDA2NDQKLS0tIGEvYXJjaC94ODZfNjQva2VybmVsL3ZzeXNjYWxsLmMKKysrIGIvYXJjaC94ODZfNjQva2VybmVsL3ZzeXNjYWxsLmMKQEAgLTI3LDYgKzI3LDkgQEAKICNpbmNsdWRlIDxsaW51eC9qaWZmaWVzLmg+CiAjaW5jbHVkZSA8bGludXgvc3lzY3RsLmg+CiAjaW5jbHVkZSA8bGludXgvZ2V0Y3B1Lmg+CisjaW5jbHVkZSA8bGludXgvY3B1Lmg+CisjaW5jbHVkZSA8bGludXgvc21wLmg+CisjaW5jbHVkZSA8bGludXgvbm90aWZpZXIuaD4KIAogI2luY2x1ZGUgPGFzbS92c3lzY2FsbC5oPgogI2luY2x1ZGUgPGFzbS9wZ3RhYmxlLmg+CkBAIC0yNDMsMzIgKzI0NiwxNyBAQAogCiAjZW5kaWYKIAotc3RhdGljIHZvaWQgX19jcHVpbml0IHdyaXRlX3JkdHNjcF9jYih2b2lkICppbmZvKQotewotCXdyaXRlX3JkdHNjcF9hdXgoKHVuc2lnbmVkIGxvbmcpaW5mbyk7Ci19Ci0KLXZvaWQgX19jcHVpbml0IHZzeXNjYWxsX3NldF9jcHUoaW50IGNwdSkKKy8qIEFzc3VtZSBfX2luaXRjYWxsIGV4ZWN1dGVzIGJlZm9yZSBhbGwgdXNlciBzcGFjZS4gSG9wZWZ1bGx5IGttb2QKKyAgIGRvZXNuJ3QgdmlvbGF0ZSB0aGF0LiBXZSdsbCBmaW5kIG91dCBpZiBpdCBkb2VzLiAqLworc3RhdGljIHZvaWQgX19jcHVpbml0IHZzeXNjYWxsX3NldF9jcHUoaW50IGNwdSkKIHsKIAl1bnNpZ25lZCBsb25nICpkOwogCXVuc2lnbmVkIGxvbmcgbm9kZSA9IDA7CiAjaWZkZWYgQ09ORklHX05VTUEKIAlub2RlID0gY3B1X3RvX25vZGVbY3B1XTsKICNlbmRpZgotCWlmIChjcHVfaGFzKCZjcHVfZGF0YVtjcHVdLCBYODZfRkVBVFVSRV9SRFRTQ1ApKSB7Ci0JCXZvaWQgKmluZm8gPSAodm9pZCAqKSgobm9kZSA8PCAxMikgfCBjcHUpOwotCQkvKiBDYW4gaGFwcGVuIG9uIHByZWVtcHRpdmUga2VybmVsICovCi0JCWlmIChnZXRfY3B1KCkgPT0gY3B1KQotCQkJd3JpdGVfcmR0c2NwX2NiKGluZm8pOwotI2lmZGVmIENPTkZJR19TTVAKLQkJZWxzZSB7Ci0JCQkvKiB0aGUgbm90aWZpZXIgaXMgdW5mb3J0dW5hdGVseSBub3QgZXhlY3V0ZWQgb24gdGhlCi0JCQkgICB0YXJnZXQgQ1BVICovCi0JCQlzbXBfY2FsbF9mdW5jdGlvbl9zaW5nbGUoY3B1LHdyaXRlX3JkdHNjcF9jYixpbmZvLDAsMSk7Ci0JCX0KLSNlbmRpZgotCQlwdXRfY3B1KCk7Ci0JfQorCWlmIChjcHVfaGFzKCZjcHVfZGF0YVtjcHVdLCBYODZfRkVBVFVSRV9SRFRTQ1ApKQorCQl3cml0ZV9yZHRzY3BfYXV4KChub2RlIDw8IDEyKSB8IGNwdSk7CiAKIAkvKiBTdG9yZSBjcHUgbnVtYmVyIGluIGxpbWl0IHNvIHRoYXQgaXQgY2FuIGJlIGxvYWRlZCBxdWlja2x5CiAJICAgaW4gdXNlciBzcGFjZSBpbiB2Z2V0Y3B1LgpAQCAtMjgwLDYgKzI2OCwyMyBAQAogCSpkIHw9IChub2RlID4+IDQpIDw8IDQ4OwogfQogCitzdGF0aWMgdm9pZCBfX2NwdWluaXQgY3B1X3ZzeXNjYWxsX2luaXQodm9pZCAqYXJnKQoreworCS8qIHByZWVtcHRpb24gc2hvdWxkIGJlIGFscmVhZHkgb2ZmICovCisJdnN5c2NhbGxfc2V0X2NwdShyYXdfc21wX3Byb2Nlc3Nvcl9pZCgpKTsKK30KKworI2lmZGVmIENPTkZJR19IT1RQTFVHX0NQVQorc3RhdGljIGludCBfX2NwdWluaXQKK2NwdV92c3lzY2FsbF9ub3RpZmllcihzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKm4sIHVuc2lnbmVkIGxvbmcgYWN0aW9uLCB2b2lkICphcmcpCit7CisJbG9uZyBjcHUgPSAobG9uZylhcmc7CisJaWYgKGFjdGlvbiA9PSBDUFVfT05MSU5FKQorCQlzbXBfY2FsbF9mdW5jdGlvbl9zaW5nbGUoY3B1LCBjcHVfdnN5c2NhbGxfaW5pdCwgTlVMTCwgMCwgMSk7CisJcmV0dXJuIE5PVElGWV9ET05FOworfQorI2VuZGlmCisKIHN0YXRpYyB2b2lkIF9faW5pdCBtYXBfdnN5c2NhbGwodm9pZCkKIHsKIAlleHRlcm4gY2hhciBfX3ZzeXNjYWxsXzA7CkBAIC0yOTksNiArMzA0LDggQEAKICNpZmRlZiBDT05GSUdfU1lTQ1RMCiAJcmVnaXN0ZXJfc3lzY3RsX3RhYmxlKGtlcm5lbF9yb290X3RhYmxlMiwgMCk7CiAjZW5kaWYKKwlvbl9lYWNoX2NwdShjcHVfdnN5c2NhbGxfaW5pdCwgTlVMTCwgMCwgMSk7CisJaG90Y3B1X25vdGlmaWVyKGNwdV92c3lzY2FsbF9ub3RpZmllciwgMCk7CiAJcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL2FyY2gveDg2XzY0L21tL2luaXQuYyBiL2FyY2gveDg2XzY0L21tL2luaXQuYwppbmRleCAxOWM3MjUyLi40YzBjMDBlIDEwMDY0NAotLS0gYS9hcmNoL3g4Nl82NC9tbS9pbml0LmMKKysrIGIvYXJjaC94ODZfNjQvbW0vaW5pdC5jCkBAIC00MDYsOSArNDA2LDEyIEBACiAjaWZuZGVmIENPTkZJR19OVU1BCiB2b2lkIF9faW5pdCBwYWdpbmdfaW5pdCh2b2lkKQogewotCXVuc2lnbmVkIGxvbmcgbWF4X3pvbmVfcGZuc1tNQVhfTlJfWk9ORVNdID0ge01BWF9ETUFfUEZOLAotCQkJCQkJCU1BWF9ETUEzMl9QRk4sCi0JCQkJCQkJZW5kX3Bmbn07CisJdW5zaWduZWQgbG9uZyBtYXhfem9uZV9wZm5zW01BWF9OUl9aT05FU107CisJbWVtc2V0KG1heF96b25lX3BmbnMsIDAsIHNpemVvZihtYXhfem9uZV9wZm5zKSk7CisJbWF4X3pvbmVfcGZuc1taT05FX0RNQV0gPSBNQVhfRE1BX1BGTjsKKwltYXhfem9uZV9wZm5zW1pPTkVfRE1BMzJdID0gTUFYX0RNQTMyX1BGTjsKKwltYXhfem9uZV9wZm5zW1pPTkVfTk9STUFMXSA9IGVuZF9wZm47CisKIAltZW1vcnlfcHJlc2VudCgwLCAwLCBlbmRfcGZuKTsKIAlzcGFyc2VfaW5pdCgpOwogCWZyZWVfYXJlYV9pbml0X25vZGVzKG1heF96b25lX3BmbnMpOwpAQCAtNDkzLDcgKzQ5Niw3IEBACiB9CiBFWFBPUlRfU1lNQk9MX0dQTChyZW1vdmVfbWVtb3J5KTsKIAotI2lmbmRlZiBDT05GSUdfQUNQSV9OVU1BCisjaWYgIWRlZmluZWQoQ09ORklHX0FDUElfTlVNQSkgJiYgZGVmaW5lZChDT05GSUdfTlVNQSkKIGludCBtZW1vcnlfYWRkX3BoeXNhZGRyX3RvX25pZCh1NjQgc3RhcnQpCiB7CiAJcmV0dXJuIDA7CkBAIC01MDEsMTMgKzUwNCw2IEBACiBFWFBPUlRfU1lNQk9MX0dQTChtZW1vcnlfYWRkX3BoeXNhZGRyX3RvX25pZCk7CiAjZW5kaWYKIAotI2lmbmRlZiBDT05GSUdfQUNQSV9OVU1BCi1pbnQgbWVtb3J5X2FkZF9waHlzYWRkcl90b19uaWQodTY0IHN0YXJ0KQotewotCXJldHVybiAwOwotfQotI2VuZGlmCi0KICNlbmRpZiAvKiBDT05GSUdfTUVNT1JZX0hPVFBMVUcgKi8KIAogI2lmZGVmIENPTkZJR19NRU1PUllfSE9UUExVR19SRVNFUlZFCkBAIC02NTIsOSArNjQ4LDIyIEBACiAKIHZvaWQgX19pbml0IHJlc2VydmVfYm9vdG1lbV9nZW5lcmljKHVuc2lnbmVkIGxvbmcgcGh5cywgdW5zaWduZWQgbGVuKSAKIHsgCi0JLyogU2hvdWxkIGNoZWNrIGhlcmUgYWdhaW5zdCB0aGUgZTgyMCBtYXAgdG8gYXZvaWQgZG91YmxlIGZyZWUgKi8gCiAjaWZkZWYgQ09ORklHX05VTUEKIAlpbnQgbmlkID0gcGh5c190b19uaWQocGh5cyk7CisjZW5kaWYKKwl1bnNpZ25lZCBsb25nIHBmbiA9IHBoeXMgPj4gUEFHRV9TSElGVDsKKwlpZiAocGZuID49IGVuZF9wZm4pIHsKKwkJLyogVGhpcyBjYW4gaGFwcGVuIHdpdGgga2R1bXAga2VybmVscyB3aGVuIGFjY2Vzc2luZyBmaXJtd2FyZQorCQkgICB0YWJsZXMuICovCisJCWlmIChwZm4gPCBlbmRfcGZuX21hcCkKKwkJCXJldHVybjsKKwkJcHJpbnRrKEtFUk5fRVJSICJyZXNlcnZlX2Jvb3RtZW06IGlsbGVnYWwgcmVzZXJ2ZSAlbHggJXVcbiIsCisJCQkJcGh5cywgbGVuKTsKKwkJcmV0dXJuOworCX0KKworCS8qIFNob3VsZCBjaGVjayBoZXJlIGFnYWluc3QgdGhlIGU4MjAgbWFwIHRvIGF2b2lkIGRvdWJsZSBmcmVlICovCisjaWZkZWYgQ09ORklHX05VTUEKICAgCXJlc2VydmVfYm9vdG1lbV9ub2RlKE5PREVfREFUQShuaWQpLCBwaHlzLCBsZW4pOwogI2Vsc2UgICAgICAgCQkKIAlyZXNlcnZlX2Jvb3RtZW0ocGh5cywgbGVuKTsgICAgCmRpZmYgLS1naXQgYS9hcmNoL3g4Nl82NC9tbS9udW1hLmMgYi9hcmNoL3g4Nl82NC9tbS9udW1hLmMKaW5kZXggODI5YTAwOGIuLjJlZTJlMDAgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2XzY0L21tL251bWEuYworKysgYi9hcmNoL3g4Nl82NC9tbS9udW1hLmMKQEAgLTMzOCw5ICszMzgsMTEgQEAKIHZvaWQgX19pbml0IHBhZ2luZ19pbml0KHZvaWQpCiB7IAogCWludCBpOwotCXVuc2lnbmVkIGxvbmcgbWF4X3pvbmVfcGZuc1tNQVhfTlJfWk9ORVNdID0geyBNQVhfRE1BX1BGTiwKLQkJTUFYX0RNQTMyX1BGTiwKLQkJZW5kX3Bmbn07CisJdW5zaWduZWQgbG9uZyBtYXhfem9uZV9wZm5zW01BWF9OUl9aT05FU107CisJbWVtc2V0KG1heF96b25lX3BmbnMsIDAsIHNpemVvZihtYXhfem9uZV9wZm5zKSk7CisJbWF4X3pvbmVfcGZuc1taT05FX0RNQV0gPSBNQVhfRE1BX1BGTjsKKwltYXhfem9uZV9wZm5zW1pPTkVfRE1BMzJdID0gTUFYX0RNQTMyX1BGTjsKKwltYXhfem9uZV9wZm5zW1pPTkVfTk9STUFMXSA9IGVuZF9wZm47CiAKIAlhcmNoX3NwYXJzZV9pbml0KCk7CiAKZGlmZiAtLWdpdCBhL2FyY2gveDg2XzY0L21tL3NyYXQuYyBiL2FyY2gveDg2XzY0L21tL3NyYXQuYwppbmRleCAzY2MwNTQ0Li4xMDg3ZTE1IDEwMDY0NAotLS0gYS9hcmNoL3g4Nl82NC9tbS9zcmF0LmMKKysrIGIvYXJjaC94ODZfNjQvbW0vc3JhdC5jCkBAIC0yMDcsNyArMjA3LDcgQEAKIAlyZXR1cm4gaG90YWRkX3BlcmNlbnQgPiAwOwogfQogI2Vsc2UKLWludCB1cGRhdGVfZW5kX29mX21lbW9yeSh1bnNpZ25lZCBsb25nIGVuZCkge3JldHVybiAwO30KK2ludCB1cGRhdGVfZW5kX29mX21lbW9yeSh1bnNpZ25lZCBsb25nIGVuZCkge3JldHVybiAtMTt9CiBzdGF0aWMgaW50IGhvdGFkZF9lbm91Z2hfbWVtb3J5KHN0cnVjdCBib290bm9kZSAqbmQpIHtyZXR1cm4gMTt9CiAjaWZkZWYgQ09ORklHX01FTU9SWV9IT1RQTFVHX1NQQVJTRQogc3RhdGljIGlubGluZSBpbnQgc2F2ZV9hZGRfaW5mbyh2b2lkKSB7cmV0dXJuIDE7fQpAQCAtMzM3LDcgKzMzNyw3IEBACiAJcHVzaF9ub2RlX2JvdW5kYXJpZXMobm9kZSwgbmQtPnN0YXJ0ID4+IFBBR0VfU0hJRlQsCiAJCQkJCQluZC0+ZW5kID4+IFBBR0VfU0hJRlQpOwogCi0gCWlmIChtYS0+ZmxhZ3MuaG90X3BsdWdnYWJsZSAmJiAhcmVzZXJ2ZV9ob3RhZGQobm9kZSwgc3RhcnQsIGVuZCkgPCAwKSB7CisgCWlmIChtYS0+ZmxhZ3MuaG90X3BsdWdnYWJsZSAmJiAocmVzZXJ2ZV9ob3RhZGQobm9kZSwgc3RhcnQsIGVuZCkgPCAwKSkgewogCQkvKiBJZ25vcmUgaG90YWRkIHJlZ2lvbi4gVW5kbyBkYW1hZ2UgKi8KIAkJcHJpbnRrKEtFUk5fTk9USUNFICJTUkFUOiBIb3RwbHVnIHJlZ2lvbiBpZ25vcmVkXG4iKTsKIAkJKm5kID0gb2xkbm9kZTsKZGlmZiAtLWdpdCBhL2FyY2gveDg2XzY0L3BjaS9NYWtlZmlsZSBiL2FyY2gveDg2XzY0L3BjaS9NYWtlZmlsZQppbmRleCAxZWIxOGY0Li4xNDlhYmEwIDEwMDY0NAotLS0gYS9hcmNoL3g4Nl82NC9wY2kvTWFrZWZpbGUKKysrIGIvYXJjaC94ODZfNjQvcGNpL01ha2VmaWxlCkBAIC0zLDcgKzMsNyBAQAogIwogIyBSZXVzZSB0aGUgaTM4NiBQQ0kgc3Vic3lzdGVtCiAjCi1DRkxBR1MgKz0gLUlhcmNoL2kzODYvcGNpCitFWFRSQV9DRkxBR1MgKz0gLUlhcmNoL2kzODYvcGNpCiAKIG9iai15CQk6PSBpMzg2Lm8KIG9iai0kKENPTkZJR19QQ0lfRElSRUNUKSs9IGRpcmVjdC5vCmRpZmYgLS1naXQgYS9hcmNoL3g4Nl82NC9wY2kvbW1jb25maWcuYyBiL2FyY2gveDg2XzY0L3BjaS9tbWNvbmZpZy5jCmluZGV4IDc3MzJmNDIuLmY4YjZiMjggMTAwNjQ0Ci0tLSBhL2FyY2gveDg2XzY0L3BjaS9tbWNvbmZpZy5jCisrKyBiL2FyY2gveDg2XzY0L3BjaS9tbWNvbmZpZy5jCkBAIC0xNjMsMzcgKzE2Myw2IEBACiAJfQogfQogCi1zdGF0aWMgX19pbml0IHZvaWQgcGNpX21tY2ZnX2luc2VydF9yZXNvdXJjZXModm9pZCkKLXsKLSNkZWZpbmUgUENJX01NQ0ZHX1JFU09VUkNFX05BTUVfTEVOIDE5Ci0JaW50IGk7Ci0Jc3RydWN0IHJlc291cmNlICpyZXM7Ci0JY2hhciAqbmFtZXM7Ci0JdW5zaWduZWQgbnVtX2J1c2VzOwotCi0JcmVzID0ga2NhbGxvYyhQQ0lfTU1DRkdfUkVTT1VSQ0VfTkFNRV9MRU4gKyBzaXplb2YoKnJlcyksCi0JCQlwY2lfbW1jZmdfY29uZmlnX251bSwgR0ZQX0tFUk5FTCk7Ci0KLQlpZiAoIXJlcykgewotCQlwcmludGsoS0VSTl9FUlIgIlBDSTogVW5hYmxlIHRvIGFsbG9jYXRlIE1NQ09ORklHIHJlc291cmNlc1xuIik7Ci0JCXJldHVybjsKLQl9Ci0KLQluYW1lcyA9ICh2b2lkICopJnJlc1twY2lfbW1jZmdfY29uZmlnX251bV07Ci0JZm9yIChpID0gMDsgaSA8IHBjaV9tbWNmZ19jb25maWdfbnVtOyBpKyssIHJlcysrKSB7Ci0JCW51bV9idXNlcyA9IHBjaV9tbWNmZ19jb25maWdbaV0uZW5kX2J1c19udW1iZXIgLQotCQkgICAgcGNpX21tY2ZnX2NvbmZpZ1tpXS5zdGFydF9idXNfbnVtYmVyICsgMTsKLQkJcmVzLT5uYW1lID0gbmFtZXM7Ci0JCXNucHJpbnRmKG5hbWVzLCBQQ0lfTU1DRkdfUkVTT1VSQ0VfTkFNRV9MRU4sICJQQ0kgTU1DT05GSUcgJXUiLAotCQkJcGNpX21tY2ZnX2NvbmZpZ1tpXS5wY2lfc2VnbWVudF9ncm91cF9udW1iZXIpOwotCQlyZXMtPnN0YXJ0ID0gcGNpX21tY2ZnX2NvbmZpZ1tpXS5iYXNlX2FkZHJlc3M7Ci0JCXJlcy0+ZW5kID0gcmVzLT5zdGFydCArIChudW1fYnVzZXMgPDwgMjApIC0gMTsKLQkJcmVzLT5mbGFncyA9IElPUkVTT1VSQ0VfTUVNIHwgSU9SRVNPVVJDRV9CVVNZOwotCQlpbnNlcnRfcmVzb3VyY2UoJmlvbWVtX3Jlc291cmNlLCByZXMpOwotCQluYW1lcyArPSBQQ0lfTU1DRkdfUkVTT1VSQ0VfTkFNRV9MRU47Ci0JfQotfQotCiB2b2lkIF9faW5pdCBwY2lfbW1jZmdfaW5pdChpbnQgdHlwZSkKIHsKIAlpbnQgaTsKQEAgLTIyMCw3ICsxODksNyBAQAogCiAJcGNpX21tY2ZnX3ZpcnQgPSBrbWFsbG9jKHNpemVvZigqcGNpX21tY2ZnX3ZpcnQpICogcGNpX21tY2ZnX2NvbmZpZ19udW0sIEdGUF9LRVJORUwpOwogCWlmIChwY2lfbW1jZmdfdmlydCA9PSBOVUxMKSB7Ci0JCXByaW50aygiUENJOiBDYW4gbm90IGFsbG9jYXRlIG1lbW9yeSBmb3IgbW1jb25maWcgc3RydWN0dXJlc1xuIik7CisJCXByaW50ayhLRVJOX0VSUiAiUENJOiBDYW4gbm90IGFsbG9jYXRlIG1lbW9yeSBmb3IgbW1jb25maWcgc3RydWN0dXJlc1xuIik7CiAJCXJldHVybjsKIAl9CiAJZm9yIChpID0gMDsgaSA8IHBjaV9tbWNmZ19jb25maWdfbnVtOyArK2kpIHsKQEAgLTIyOCw3ICsxOTcsOCBAQAogCQlwY2lfbW1jZmdfdmlydFtpXS52aXJ0ID0gaW9yZW1hcF9ub2NhY2hlKHBjaV9tbWNmZ19jb25maWdbaV0uYmFzZV9hZGRyZXNzLAogCQkJCQkJCSBNTUNPTkZJR19BUEVSX01BWCk7CiAJCWlmICghcGNpX21tY2ZnX3ZpcnRbaV0udmlydCkgewotCQkJcHJpbnRrKCJQQ0k6IENhbm5vdCBtYXAgbW1jb25maWcgYXBlcnR1cmUgZm9yIHNlZ21lbnQgJWRcbiIsCisJCQlwcmludGsoS0VSTl9FUlIgIlBDSTogQ2Fubm90IG1hcCBtbWNvbmZpZyBhcGVydHVyZSBmb3IgIgorCQkJCQkic2VnbWVudCAlZFxuIiwKIAkJCSAgICAgICBwY2lfbW1jZmdfY29uZmlnW2ldLnBjaV9zZWdtZW50X2dyb3VwX251bWJlcik7CiAJCQlyZXR1cm47CiAJCX0KQEAgLTIzNiw3ICsyMDYsNiBAQAogCX0KIAogCXVucmVhY2hhYmxlX2RldmljZXMoKTsKLQlwY2lfbW1jZmdfaW5zZXJ0X3Jlc291cmNlcygpOwogCiAJcmF3X3BjaV9vcHMgPSAmcGNpX21tY2ZnOwogCXBjaV9wcm9iZSA9IChwY2lfcHJvYmUgJiB+UENJX1BST0JFX01BU0spIHwgUENJX1BST0JFX01NQ09ORjsKZGlmZiAtLWdpdCBhL2FyY2gveHRlbnNhL2tlcm5lbC92bWxpbnV4Lmxkcy5TIGIvYXJjaC94dGVuc2Eva2VybmVsL3ZtbGludXgubGRzLlMKaW5kZXggYWI2Y2RiZC4uY2ZlNzVmNSAxMDA2NDQKLS0tIGEvYXJjaC94dGVuc2Eva2VybmVsL3ZtbGludXgubGRzLlMKKysrIGIvYXJjaC94dGVuc2Eva2VybmVsL3ZtbGludXgubGRzLlMKQEAgLTE4NCwxMyArMTg0LDcgQEAKIAogICBfX2luaXRjYWxsX3N0YXJ0ID0gLjsKICAgLmluaXRjYWxsLmluaXQgOiB7Ci0gIAkqKC5pbml0Y2FsbDEuaW5pdCkKLSAgCSooLmluaXRjYWxsMi5pbml0KQotICAJKiguaW5pdGNhbGwzLmluaXQpCi0gIAkqKC5pbml0Y2FsbDQuaW5pdCkKLSAgCSooLmluaXRjYWxsNS5pbml0KQotICAJKiguaW5pdGNhbGw2LmluaXQpCi0gIAkqKC5pbml0Y2FsbDcuaW5pdCkKKwlJTklUQ0FMTFMKICAgfQogICBfX2luaXRjYWxsX2VuZCA9IC47CiAKZGlmZiAtLWdpdCBhL2Jsb2NrL2NmcS1pb3NjaGVkLmMgYi9ibG9jay9jZnEtaW9zY2hlZC5jCmluZGV4IGQzZDc2MTMuLjFkOWMzYzcgMTAwNjQ0Ci0tLSBhL2Jsb2NrL2NmcS1pb3NjaGVkLmMKKysrIGIvYmxvY2svY2ZxLWlvc2NoZWQuYwpAQCAtNDU2LDYgKzQ1Niw5IEBACiAJICovCiAJd2hpbGUgKChfX2FsaWFzID0gZWx2X3JiX2FkZCgmY2ZxcS0+c29ydF9saXN0LCBycSkpICE9IE5VTEwpCiAJCWNmcV9kaXNwYXRjaF9pbnNlcnQoY2ZxZC0+cXVldWUsIF9fYWxpYXMpOworCisJaWYgKCFjZnFfY2ZxcV9vbl9ycihjZnFxKSkKKwkJY2ZxX2FkZF9jZnFxX3JyKGNmcWQsIGNmcXEpOwogfQogCiBzdGF0aWMgaW5saW5lIHZvaWQKQEAgLTEyMTUsMTEgKzEyMTgsMTIgQEAKIHsKIAlzdHJ1Y3QgY2ZxX2RhdGEgKmNmcWQgPSBjaWMtPmtleTsKIAlzdHJ1Y3QgY2ZxX3F1ZXVlICpjZnFxOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKIAlpZiAodW5saWtlbHkoIWNmcWQpKQogCQlyZXR1cm47CiAKLQlzcGluX2xvY2soY2ZxZC0+cXVldWUtPnF1ZXVlX2xvY2spOworCXNwaW5fbG9ja19pcnFzYXZlKGNmcWQtPnF1ZXVlLT5xdWV1ZV9sb2NrLCBmbGFncyk7CiAKIAljZnFxID0gY2ljLT5jZnFxW0FTWU5DXTsKIAlpZiAoY2ZxcSkgewpAQCAtMTIzNiw3ICsxMjQwLDcgQEAKIAlpZiAoY2ZxcSkKIAkJY2ZxX21hcmtfY2ZxcV9wcmlvX2NoYW5nZWQoY2ZxcSk7CiAKLQlzcGluX3VubG9jayhjZnFkLT5xdWV1ZS0+cXVldWVfbG9jayk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShjZnFkLT5xdWV1ZS0+cXVldWVfbG9jaywgZmxhZ3MpOwogfQogCiBzdGF0aWMgdm9pZCBjZnFfaW9jX3NldF9pb3ByaW8oc3RydWN0IGlvX2NvbnRleHQgKmlvYykKQEAgLTEzNjIsNiArMTM2Niw3IEBACiAJc3RydWN0IHJiX25vZGUgKipwOwogCXN0cnVjdCByYl9ub2RlICpwYXJlbnQ7CiAJc3RydWN0IGNmcV9pb19jb250ZXh0ICpfX2NpYzsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOwogCXZvaWQgKms7CiAKIAljaWMtPmlvYyA9IGlvYzsKQEAgLTEzOTEsOSArMTM5Niw5IEBACiAJcmJfbGlua19ub2RlKCZjaWMtPnJiX25vZGUsIHBhcmVudCwgcCk7CiAJcmJfaW5zZXJ0X2NvbG9yKCZjaWMtPnJiX25vZGUsICZpb2MtPmNpY19yb290KTsKIAotCXNwaW5fbG9ja19pcnEoY2ZxZC0+cXVldWUtPnF1ZXVlX2xvY2spOworCXNwaW5fbG9ja19pcnFzYXZlKGNmcWQtPnF1ZXVlLT5xdWV1ZV9sb2NrLCBmbGFncyk7CiAJbGlzdF9hZGQoJmNpYy0+cXVldWVfbGlzdCwgJmNmcWQtPmNpY19saXN0KTsKLQlzcGluX3VubG9ja19pcnEoY2ZxZC0+cXVldWUtPnF1ZXVlX2xvY2spOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoY2ZxZC0+cXVldWUtPnF1ZXVlX2xvY2ssIGZsYWdzKTsKIH0KIAogLyoKQEAgLTE2NTAsOSArMTY1NSw2IEBACiAKIAljZnFfYWRkX3JxX3JiKHJxKTsKIAotCWlmICghY2ZxX2NmcXFfb25fcnIoY2ZxcSkpCi0JCWNmcV9hZGRfY2ZxcV9ycihjZnFkLCBjZnFxKTsKLQogCWxpc3RfYWRkX3RhaWwoJnJxLT5xdWV1ZWxpc3QsICZjZnFxLT5maWZvKTsKIAogCWNmcV9ycV9lbnF1ZXVlZChjZnFkLCBjZnFxLCBycSk7CmRpZmYgLS1naXQgYS9ibG9jay9lbGV2YXRvci5jIGIvYmxvY2svZWxldmF0b3IuYwppbmRleCA0ODdkZDNkLi44Y2NkMTYzIDEwMDY0NAotLS0gYS9ibG9jay9lbGV2YXRvci5jCisrKyBiL2Jsb2NrL2VsZXZhdG9yLmMKQEAgLTkzLDIxICs5MywxOCBAQAogCiBzdGF0aWMgc3RydWN0IGVsZXZhdG9yX3R5cGUgKmVsZXZhdG9yX2ZpbmQoY29uc3QgY2hhciAqbmFtZSkKIHsKLQlzdHJ1Y3QgZWxldmF0b3JfdHlwZSAqZSA9IE5VTEw7CisJc3RydWN0IGVsZXZhdG9yX3R5cGUgKmU7CiAJc3RydWN0IGxpc3RfaGVhZCAqZW50cnk7CiAKIAlsaXN0X2Zvcl9lYWNoKGVudHJ5LCAmZWx2X2xpc3QpIHsKLQkJc3RydWN0IGVsZXZhdG9yX3R5cGUgKl9fZTsKIAotCQlfX2UgPSBsaXN0X2VudHJ5KGVudHJ5LCBzdHJ1Y3QgZWxldmF0b3JfdHlwZSwgbGlzdCk7CisJCWUgPSBsaXN0X2VudHJ5KGVudHJ5LCBzdHJ1Y3QgZWxldmF0b3JfdHlwZSwgbGlzdCk7CiAKLQkJaWYgKCFzdHJjbXAoX19lLT5lbGV2YXRvcl9uYW1lLCBuYW1lKSkgewotCQkJZSA9IF9fZTsKLQkJCWJyZWFrOwotCQl9CisJCWlmICghc3RyY21wKGUtPmVsZXZhdG9yX25hbWUsIG5hbWUpKQorCQkJcmV0dXJuIGU7CiAJfQogCi0JcmV0dXJuIGU7CisJcmV0dXJuIE5VTEw7CiB9CiAKIHN0YXRpYyB2b2lkIGVsZXZhdG9yX3B1dChzdHJ1Y3QgZWxldmF0b3JfdHlwZSAqZSkKQEAgLTEwODgsNyArMTA4NSw3IEBACiAJc3RydWN0IGxpc3RfaGVhZCAqZW50cnk7CiAJaW50IGxlbiA9IDA7CiAKLQlzcGluX2xvY2tfaXJxKHEtPnF1ZXVlX2xvY2spOworCXNwaW5fbG9ja19pcnEoJmVsdl9saXN0X2xvY2spOwogCWxpc3RfZm9yX2VhY2goZW50cnksICZlbHZfbGlzdCkgewogCQlzdHJ1Y3QgZWxldmF0b3JfdHlwZSAqX19lOwogCkBAIC0xMDk4LDcgKzEwOTUsNyBAQAogCQllbHNlCiAJCQlsZW4gKz0gc3ByaW50ZihuYW1lK2xlbiwgIiVzICIsIF9fZS0+ZWxldmF0b3JfbmFtZSk7CiAJfQotCXNwaW5fdW5sb2NrX2lycShxLT5xdWV1ZV9sb2NrKTsKKwlzcGluX3VubG9ja19pcnEoJmVsdl9saXN0X2xvY2spOwogCiAJbGVuICs9IHNwcmludGYobGVuK25hbWUsICJcbiIpOwogCXJldHVybiBsZW47CmRpZmYgLS1naXQgYS9ibG9jay9sbF9yd19ibGsuYyBiL2Jsb2NrL2xsX3J3X2Jsay5jCmluZGV4IGM4NDdlMTcuLjllYWVlNjYgMTAwNjQ0Ci0tLSBhL2Jsb2NrL2xsX3J3X2Jsay5jCisrKyBiL2Jsb2NrL2xsX3J3X2Jsay5jCkBAIC01NiwxMSArNTYsNiBAQAogICovCiBzdGF0aWMga21lbV9jYWNoZV90ICppb2NvbnRleHRfY2FjaGVwOwogCi1zdGF0aWMgd2FpdF9xdWV1ZV9oZWFkX3QgY29uZ2VzdGlvbl93cWhbMl0gPSB7Ci0JCV9fV0FJVF9RVUVVRV9IRUFEX0lOSVRJQUxJWkVSKGNvbmdlc3Rpb25fd3FoWzBdKSwKLQkJX19XQUlUX1FVRVVFX0hFQURfSU5JVElBTElaRVIoY29uZ2VzdGlvbl93cWhbMV0pCi0JfTsKLQogLyoKICAqIENvbnRyb2xsaW5nIHN0cnVjdHVyZSB0byBrYmxvY2tkCiAgKi8KQEAgLTExMiwzNSArMTA3LDYgQEAKIAlxLT5ucl9jb25nZXN0aW9uX29mZiA9IG5yOwogfQogCi0vKgotICogQSBxdWV1ZSBoYXMganVzdCBleGl0dGVkIGNvbmdlc3Rpb24uICBOb3RlIHRoaXMgaW4gdGhlIGdsb2JhbCBjb3VudGVyIG9mCi0gKiBjb25nZXN0ZWQgcXVldWVzLCBhbmQgd2FrZSB1cCBhbnlvbmUgd2hvIHdhcyB3YWl0aW5nIGZvciByZXF1ZXN0cyB0byBiZQotICogcHV0IGJhY2suCi0gKi8KLXN0YXRpYyB2b2lkIGNsZWFyX3F1ZXVlX2Nvbmdlc3RlZChyZXF1ZXN0X3F1ZXVlX3QgKnEsIGludCBydykKLXsKLQllbnVtIGJkaV9zdGF0ZSBiaXQ7Ci0Jd2FpdF9xdWV1ZV9oZWFkX3QgKndxaCA9ICZjb25nZXN0aW9uX3dxaFtyd107Ci0KLQliaXQgPSAocncgPT0gV1JJVEUpID8gQkRJX3dyaXRlX2Nvbmdlc3RlZCA6IEJESV9yZWFkX2Nvbmdlc3RlZDsKLQljbGVhcl9iaXQoYml0LCAmcS0+YmFja2luZ19kZXZfaW5mby5zdGF0ZSk7Ci0Jc21wX21iX19hZnRlcl9jbGVhcl9iaXQoKTsKLQlpZiAod2FpdHF1ZXVlX2FjdGl2ZSh3cWgpKQotCQl3YWtlX3VwKHdxaCk7Ci19Ci0KLS8qCi0gKiBBIHF1ZXVlIGhhcyBqdXN0IGVudGVyZWQgY29uZ2VzdGlvbi4gIEZsYWcgdGhhdCBpbiB0aGUgcXVldWUncyBWTS12aXNpYmxlCi0gKiBzdGF0ZSBmbGFncyBhbmQgaW5jcmVtZW50IHRoZSBnbG9iYWwgZ291bnRlciBvZiBjb25nZXN0ZWQgcXVldWVzLgotICovCi1zdGF0aWMgdm9pZCBzZXRfcXVldWVfY29uZ2VzdGVkKHJlcXVlc3RfcXVldWVfdCAqcSwgaW50IHJ3KQotewotCWVudW0gYmRpX3N0YXRlIGJpdDsKLQotCWJpdCA9IChydyA9PSBXUklURSkgPyBCRElfd3JpdGVfY29uZ2VzdGVkIDogQkRJX3JlYWRfY29uZ2VzdGVkOwotCXNldF9iaXQoYml0LCAmcS0+YmFja2luZ19kZXZfaW5mby5zdGF0ZSk7Ci19Ci0KIC8qKgogICogYmxrX2dldF9iYWNraW5nX2Rldl9pbmZvIC0gZ2V0IHRoZSBhZGRyZXNzIG9mIGEgcXVldWUncyBiYWNraW5nX2Rldl9pbmZvCiAgKiBAYmRldjoJZGV2aWNlCkBAIC0xNTksNyArMTI1LDYgQEAKIAkJcmV0ID0gJnEtPmJhY2tpbmdfZGV2X2luZm87CiAJcmV0dXJuIHJldDsKIH0KLQogRVhQT1JUX1NZTUJPTChibGtfZ2V0X2JhY2tpbmdfZGV2X2luZm8pOwogCiB2b2lkIGJsa19xdWV1ZV9hY3Rpdml0eV9mbihyZXF1ZXN0X3F1ZXVlX3QgKnEsIGFjdGl2aXR5X2ZuICpmbiwgdm9pZCAqZGF0YSkKQEAgLTE2Nyw3ICsxMzIsNiBAQAogCXEtPmFjdGl2aXR5X2ZuID0gZm47CiAJcS0+YWN0aXZpdHlfZGF0YSA9IGRhdGE7CiB9Ci0KIEVYUE9SVF9TWU1CT0woYmxrX3F1ZXVlX2FjdGl2aXR5X2ZuKTsKIAogLyoqCkBAIC0yMDY3LDcgKzIwMzEsNyBAQAogCXN0cnVjdCByZXF1ZXN0X2xpc3QgKnJsID0gJnEtPnJxOwogCiAJaWYgKHJsLT5jb3VudFtyd10gPCBxdWV1ZV9jb25nZXN0aW9uX29mZl90aHJlc2hvbGQocSkpCi0JCWNsZWFyX3F1ZXVlX2Nvbmdlc3RlZChxLCBydyk7CisJCWJsa19jbGVhcl9xdWV1ZV9jb25nZXN0ZWQocSwgcncpOwogCiAJaWYgKHJsLT5jb3VudFtyd10gKyAxIDw9IHEtPm5yX3JlcXVlc3RzKSB7CiAJCWlmICh3YWl0cXVldWVfYWN0aXZlKCZybC0+d2FpdFtyd10pKQpAQCAtMjEzNyw3ICsyMTAxLDcgQEAKIAkJCQl9CiAJCQl9CiAJCX0KLQkJc2V0X3F1ZXVlX2Nvbmdlc3RlZChxLCBydyk7CisJCWJsa19zZXRfcXVldWVfY29uZ2VzdGVkKHEsIHJ3KTsKIAl9CiAKIAkvKgpAQCAtMjc1NSw0MSArMjcxOSw2IEBACiB9CiBFWFBPUlRfU1lNQk9MKGJsa19lbmRfc3luY19ycSk7CiAKLS8qKgotICogYmxrX2Nvbmdlc3Rpb25fd2FpdCAtIHdhaXQgZm9yIGEgcXVldWUgdG8gYmVjb21lIHVuY29uZ2VzdGVkCi0gKiBAcnc6IFJFQUQgb3IgV1JJVEUKLSAqIEB0aW1lb3V0OiB0aW1lb3V0IGluIGppZmZpZXMKLSAqCi0gKiBXYWl0cyBmb3IgdXAgdG8gQHRpbWVvdXQgamlmZmllcyBmb3IgYSBxdWV1ZSAoYW55IHF1ZXVlKSB0byBleGl0IGNvbmdlc3Rpb24uCi0gKiBJZiBubyBxdWV1ZXMgYXJlIGNvbmdlc3RlZCB0aGVuIGp1c3Qgd2FpdCBmb3IgdGhlIG5leHQgcmVxdWVzdCB0byBiZQotICogcmV0dXJuZWQuCi0gKi8KLWxvbmcgYmxrX2Nvbmdlc3Rpb25fd2FpdChpbnQgcncsIGxvbmcgdGltZW91dCkKLXsKLQlsb25nIHJldDsKLQlERUZJTkVfV0FJVCh3YWl0KTsKLQl3YWl0X3F1ZXVlX2hlYWRfdCAqd3FoID0gJmNvbmdlc3Rpb25fd3FoW3J3XTsKLQotCXByZXBhcmVfdG9fd2FpdCh3cWgsICZ3YWl0LCBUQVNLX1VOSU5URVJSVVBUSUJMRSk7Ci0JcmV0ID0gaW9fc2NoZWR1bGVfdGltZW91dCh0aW1lb3V0KTsKLQlmaW5pc2hfd2FpdCh3cWgsICZ3YWl0KTsKLQlyZXR1cm4gcmV0OwotfQotCi1FWFBPUlRfU1lNQk9MKGJsa19jb25nZXN0aW9uX3dhaXQpOwotCi0vKioKLSAqIGJsa19jb25nZXN0aW9uX2VuZCAtIHdha2UgdXAgc2xlZXBlcnMgb24gYSBjb25nZXN0aW9uIHF1ZXVlCi0gKiBAcnc6IFJFQUQgb3IgV1JJVEUKLSAqLwotdm9pZCBibGtfY29uZ2VzdGlvbl9lbmQoaW50IHJ3KQotewotCXdhaXRfcXVldWVfaGVhZF90ICp3cWggPSAmY29uZ2VzdGlvbl93cWhbcnddOwotCi0JaWYgKHdhaXRxdWV1ZV9hY3RpdmUod3FoKSkKLQkJd2FrZV91cCh3cWgpOwotfQotCiAvKgogICogSGFzIHRvIGJlIGNhbGxlZCB3aXRoIHRoZSByZXF1ZXN0IHNwaW5sb2NrIGFjcXVpcmVkCiAgKi8KQEAgLTMwNzAsNiArMjk5OSw3IEBACiB7CiAJcmVxdWVzdF9xdWV1ZV90ICpxOwogCXNlY3Rvcl90IG1heHNlY3RvcjsKKwlzZWN0b3JfdCBvbGRfc2VjdG9yOwogCWludCByZXQsIG5yX3NlY3RvcnMgPSBiaW9fc2VjdG9ycyhiaW8pOwogCWRldl90IG9sZF9kZXY7CiAKQEAgLTMwOTgsNyArMzAyOCw3IEBACiAJICogTk9URTogd2UgZG9uJ3QgcmVwZWF0IHRoZSBibGtfc2l6ZSBjaGVjayBmb3IgZWFjaCBuZXcgZGV2aWNlLgogCSAqIFN0YWNraW5nIGRyaXZlcnMgYXJlIGV4cGVjdGVkIHRvIGtub3cgd2hhdCB0aGV5IGFyZSBkb2luZy4KIAkgKi8KLQltYXhzZWN0b3IgPSAtMTsKKwlvbGRfc2VjdG9yID0gLTE7CiAJb2xkX2RldiA9IDA7CiAJZG8gewogCQljaGFyIGJbQkRFVk5BTUVfU0laRV07CkBAIC0zMTMyLDE1ICszMDYyLDMxIEBACiAJCSAqLwogCQlibGtfcGFydGl0aW9uX3JlbWFwKGJpbyk7CiAKLQkJaWYgKG1heHNlY3RvciAhPSAtMSkKKwkJaWYgKG9sZF9zZWN0b3IgIT0gLTEpCiAJCQlibGtfYWRkX3RyYWNlX3JlbWFwKHEsIGJpbywgb2xkX2RldiwgYmlvLT5iaV9zZWN0b3IsIAotCQkJCQkgICAgbWF4c2VjdG9yKTsKKwkJCQkJICAgIG9sZF9zZWN0b3IpOwogCiAJCWJsa19hZGRfdHJhY2VfYmlvKHEsIGJpbywgQkxLX1RBX1FVRVVFKTsKIAotCQltYXhzZWN0b3IgPSBiaW8tPmJpX3NlY3RvcjsKKwkJb2xkX3NlY3RvciA9IGJpby0+Ymlfc2VjdG9yOwogCQlvbGRfZGV2ID0gYmlvLT5iaV9iZGV2LT5iZF9kZXY7CiAKKwkJbWF4c2VjdG9yID0gYmlvLT5iaV9iZGV2LT5iZF9pbm9kZS0+aV9zaXplID4+IDk7CisJCWlmIChtYXhzZWN0b3IpIHsKKwkJCXNlY3Rvcl90IHNlY3RvciA9IGJpby0+Ymlfc2VjdG9yOworCisJCQlpZiAobWF4c2VjdG9yIDwgbnJfc2VjdG9ycyB8fAorCQkJCQltYXhzZWN0b3IgLSBucl9zZWN0b3JzIDwgc2VjdG9yKSB7CisJCQkJLyoKKwkJCQkgKiBUaGlzIG1heSB3ZWxsIGhhcHBlbiAtIHBhcnRpdGlvbnMgYXJlIG5vdAorCQkJCSAqIGNoZWNrZWQgdG8gbWFrZSBzdXJlIHRoZXkgYXJlIHdpdGhpbiB0aGUgc2l6ZQorCQkJCSAqIG9mIHRoZSB3aG9sZSBkZXZpY2UuCisJCQkJICovCisJCQkJaGFuZGxlX2JhZF9zZWN0b3IoYmlvKTsKKwkJCQlnb3RvIGVuZF9pbzsKKwkJCX0KKwkJfQorCiAJCXJldCA9IHEtPm1ha2VfcmVxdWVzdF9mbihxLCBiaW8pOwogCX0gd2hpbGUgKHJldCk7CiB9CkBAIC0zNzY1LDE0ICszNzExLDE0IEBACiAJYmxrX3F1ZXVlX2Nvbmdlc3Rpb25fdGhyZXNob2xkKHEpOwogCiAJaWYgKHJsLT5jb3VudFtSRUFEXSA+PSBxdWV1ZV9jb25nZXN0aW9uX29uX3RocmVzaG9sZChxKSkKLQkJc2V0X3F1ZXVlX2Nvbmdlc3RlZChxLCBSRUFEKTsKKwkJYmxrX3NldF9xdWV1ZV9jb25nZXN0ZWQocSwgUkVBRCk7CiAJZWxzZSBpZiAocmwtPmNvdW50W1JFQURdIDwgcXVldWVfY29uZ2VzdGlvbl9vZmZfdGhyZXNob2xkKHEpKQotCQljbGVhcl9xdWV1ZV9jb25nZXN0ZWQocSwgUkVBRCk7CisJCWJsa19jbGVhcl9xdWV1ZV9jb25nZXN0ZWQocSwgUkVBRCk7CiAKIAlpZiAocmwtPmNvdW50W1dSSVRFXSA+PSBxdWV1ZV9jb25nZXN0aW9uX29uX3RocmVzaG9sZChxKSkKLQkJc2V0X3F1ZXVlX2Nvbmdlc3RlZChxLCBXUklURSk7CisJCWJsa19zZXRfcXVldWVfY29uZ2VzdGVkKHEsIFdSSVRFKTsKIAllbHNlIGlmIChybC0+Y291bnRbV1JJVEVdIDwgcXVldWVfY29uZ2VzdGlvbl9vZmZfdGhyZXNob2xkKHEpKQotCQljbGVhcl9xdWV1ZV9jb25nZXN0ZWQocSwgV1JJVEUpOworCQlibGtfY2xlYXJfcXVldWVfY29uZ2VzdGVkKHEsIFdSSVRFKTsKIAogCWlmIChybC0+Y291bnRbUkVBRF0gPj0gcS0+bnJfcmVxdWVzdHMpIHsKIAkJYmxrX3NldF9xdWV1ZV9mdWxsKHEsIFJFQUQpOwpkaWZmIC0tZ2l0IGEvYmxvY2svc2NzaV9pb2N0bC5jIGIvYmxvY2svc2NzaV9pb2N0bC5jCmluZGV4IGFjNjM5NjQuLmRjZDljNzEgMTAwNjQ0Ci0tLSBhL2Jsb2NrL3Njc2lfaW9jdGwuYworKysgYi9ibG9jay9zY3NpX2lvY3RsLmMKQEAgLTI0NiwxMCArMjQ2LDEwIEBACiAJCXN3aXRjaCAoaGRyLT5keGZlcl9kaXJlY3Rpb24pIHsKIAkJZGVmYXVsdDoKIAkJCXJldHVybiAtRUlOVkFMOwotCQljYXNlIFNHX0RYRkVSX1RPX0ZST01fREVWOgogCQljYXNlIFNHX0RYRkVSX1RPX0RFVjoKIAkJCXdyaXRpbmcgPSAxOwogCQkJYnJlYWs7CisJCWNhc2UgU0dfRFhGRVJfVE9fRlJPTV9ERVY6CiAJCWNhc2UgU0dfRFhGRVJfRlJPTV9ERVY6CiAJCQlicmVhazsKIAkJfQpAQCAtMjg2LDkgKzI4Niw4IEBACiAJICogZmlsbCBpbiByZXF1ZXN0IHN0cnVjdHVyZQogCSAqLwogCXJxLT5jbWRfbGVuID0gaGRyLT5jbWRfbGVuOworCW1lbXNldChycS0+Y21kLCAwLCBCTEtfTUFYX0NEQik7IC8qIEFUQVBJIGhhdGVzIGdhcmJhZ2UgYWZ0ZXIgQ0RCICovCiAJbWVtY3B5KHJxLT5jbWQsIGNtZCwgaGRyLT5jbWRfbGVuKTsKLQlpZiAoc2l6ZW9mKHJxLT5jbWQpICE9IGhkci0+Y21kX2xlbikKLQkJbWVtc2V0KHJxLT5jbWQgKyBoZHItPmNtZF9sZW4sIDAsIHNpemVvZihycS0+Y21kKSAtIGhkci0+Y21kX2xlbik7CiAKIAltZW1zZXQoc2Vuc2UsIDAsIHNpemVvZihzZW5zZSkpOwogCXJxLT5zZW5zZSA9IHNlbnNlOwpkaWZmIC0tZ2l0IGEvY3J5cHRvL0tjb25maWcgYi9jcnlwdG8vS2NvbmZpZwppbmRleCAxZTJmMzljLi5jYmFlODM5IDEwMDY0NAotLS0gYS9jcnlwdG8vS2NvbmZpZworKysgYi9jcnlwdG8vS2NvbmZpZwpAQCAtMjcsNyArMjcsNiBAQAogY29uZmlnIENSWVBUT19NQU5BR0VSCiAJdHJpc3RhdGUgIkNyeXB0b2dyYXBoaWMgYWxnb3JpdGhtIG1hbmFnZXIiCiAJc2VsZWN0IENSWVBUT19BTEdBUEkKLQlkZWZhdWx0IG0KIAloZWxwCiAJICBDcmVhdGUgZGVmYXVsdCBjcnlwdG9ncmFwaGljIHRlbXBsYXRlIGluc3RhbnRpYXRpb25zIHN1Y2ggYXMKIAkgIGNiYyhhZXMpLgpAQCAtMzUsNiArMzQsNyBAQAogY29uZmlnIENSWVBUT19ITUFDCiAJdHJpc3RhdGUgIkhNQUMgc3VwcG9ydCIKIAlzZWxlY3QgQ1JZUFRPX0hBU0gKKwlzZWxlY3QgQ1JZUFRPX01BTkFHRVIKIAloZWxwCiAJICBITUFDOiBLZXllZC1IYXNoaW5nIGZvciBNZXNzYWdlIEF1dGhlbnRpY2F0aW9uIChSRkMyMTA0KS4KIAkgIFRoaXMgaXMgcmVxdWlyZWQgZm9yIElQU2VjLgpAQCAtMTMxLDYgKzEzMSw3IEBACiBjb25maWcgQ1JZUFRPX0VDQgogCXRyaXN0YXRlICJFQ0Igc3VwcG9ydCIKIAlzZWxlY3QgQ1JZUFRPX0JMS0NJUEhFUgorCXNlbGVjdCBDUllQVE9fTUFOQUdFUgogCWRlZmF1bHQgbQogCWhlbHAKIAkgIEVDQjogRWxlY3Ryb25pYyBDb2RlQm9vayBtb2RlCkBAIC0xNDAsNiArMTQxLDcgQEAKIGNvbmZpZyBDUllQVE9fQ0JDCiAJdHJpc3RhdGUgIkNCQyBzdXBwb3J0IgogCXNlbGVjdCBDUllQVE9fQkxLQ0lQSEVSCisJc2VsZWN0IENSWVBUT19NQU5BR0VSCiAJZGVmYXVsdCBtCiAJaGVscAogCSAgQ0JDOiBDaXBoZXIgQmxvY2sgQ2hhaW5pbmcgbW9kZQpkaWZmIC0tZ2l0IGEvY3J5cHRvL2FwaS5jIGIvY3J5cHRvL2FwaS5jCmluZGV4IDJlODRkNGIuLjRmYjdmYTQgMTAwNjQ0Ci0tLSBhL2NyeXB0by9hcGkuYworKysgYi9jcnlwdG8vYXBpLmMKQEAgLTMzMSw3ICszMzEsNyBAQAogCXRmbV9zaXplID0gc2l6ZW9mKCp0Zm0pICsgY3J5cHRvX2N0eHNpemUoYWxnLCBmbGFncyk7CiAJdGZtID0ga3phbGxvYyh0Zm1fc2l6ZSwgR0ZQX0tFUk5FTCk7CiAJaWYgKHRmbSA9PSBOVUxMKQotCQlnb3RvIG91dDsKKwkJZ290byBvdXRfZXJyOwogCiAJdGZtLT5fX2NydF9hbGcgPSBhbGc7CiAKQEAgLTM1NSw2ICszNTUsNyBAQAogCWNyeXB0b19leGl0X29wcyh0Zm0pOwogb3V0X2ZyZWVfdGZtOgogCWtmcmVlKHRmbSk7CitvdXRfZXJyOgogCXRmbSA9IEVSUl9QVFIoZXJyKTsKIG91dDoKIAlyZXR1cm4gdGZtOwpAQCAtNDE0LDE0ICs0MTUsMTQgQEAKIAkJc3RydWN0IGNyeXB0b19hbGcgKmFsZzsKIAogCQlhbGcgPSBjcnlwdG9fYWxnX21vZF9sb29rdXAoYWxnX25hbWUsIHR5cGUsIG1hc2spOwotCQllcnIgPSBQVFJfRVJSKGFsZyk7Ci0JCXRmbSA9IEVSUl9QVFIoZXJyKTsKLQkJaWYgKElTX0VSUihhbGcpKQorCQlpZiAoSVNfRVJSKGFsZykpIHsKKwkJCWVyciA9IFBUUl9FUlIoYWxnKTsKIAkJCWdvdG8gZXJyOworCQl9CiAKIAkJdGZtID0gX19jcnlwdG9fYWxsb2NfdGZtKGFsZywgMCk7CiAJCWlmICghSVNfRVJSKHRmbSkpCi0JCQlicmVhazsKKwkJCXJldHVybiB0Zm07CiAKIAkJY3J5cHRvX21vZF9wdXQoYWxnKTsKIAkJZXJyID0gUFRSX0VSUih0Zm0pOwpAQCAtNDMzLDkgKzQzNCw5IEBACiAJCQllcnIgPSAtRUlOVFI7CiAJCQlicmVhazsKIAkJfQotCX07CisJfQogCi0JcmV0dXJuIHRmbTsKKwlyZXR1cm4gRVJSX1BUUihlcnIpOwogfQogRVhQT1JUX1NZTUJPTF9HUEwoY3J5cHRvX2FsbG9jX2Jhc2UpOwogIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9LY29uZmlnIGIvZHJpdmVycy9LY29uZmlnCmluZGV4IDI2M2U4NmQuLmYzOTQ2MzQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvS2NvbmZpZworKysgYi9kcml2ZXJzL0tjb25maWcKQEAgLTE0LDYgKzE0LDEwIEBACiAKIHNvdXJjZSAiZHJpdmVycy9ibG9jay9LY29uZmlnIgogCisjIG1pc2MgYmVmb3JlIGlkZSAtIEJMS19ERVZfU0dJSU9DNCBkZXBlbmRzIG9uIFNHSV9JT0M0CisKK3NvdXJjZSAiZHJpdmVycy9taXNjL0tjb25maWciCisKIHNvdXJjZSAiZHJpdmVycy9pZGUvS2NvbmZpZyIKIAogc291cmNlICJkcml2ZXJzL3Njc2kvS2NvbmZpZyIKQEAgLTUyLDggKzU2LDYgQEAKIAogc291cmNlICJkcml2ZXJzL2h3bW9uL0tjb25maWciCiAKLXNvdXJjZSAiZHJpdmVycy9taXNjL0tjb25maWciCi0KIHNvdXJjZSAiZHJpdmVycy9tZmQvS2NvbmZpZyIKIAogc291cmNlICJkcml2ZXJzL21lZGlhL0tjb25maWciCmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvYWNwaV9tZW1ob3RwbHVnLmMgYi9kcml2ZXJzL2FjcGkvYWNwaV9tZW1ob3RwbHVnLmMKaW5kZXggOTgwOTlkZS4uNmJjZDllOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL2FjcGlfbWVtaG90cGx1Zy5jCisrKyBiL2RyaXZlcnMvYWNwaS9hY3BpX21lbWhvdHBsdWcuYwpAQCAtODUsNiArODUsOCBAQAogCXN0cnVjdCBsaXN0X2hlYWQgcmVzX2xpc3Q7CiB9OwogCitzdGF0aWMgaW50IGFjcGlfaG90bWVtX2luaXRpYWxpemVkOworCiBzdGF0aWMgYWNwaV9zdGF0dXMKIGFjcGlfbWVtb3J5X2dldF9yZXNvdXJjZShzdHJ1Y3QgYWNwaV9yZXNvdXJjZSAqcmVzb3VyY2UsIHZvaWQgKmNvbnRleHQpCiB7CkBAIC00MTQsNyArNDE2LDcgQEAKIAkvKiBTZXQgdGhlIGRldmljZSBzdGF0ZSAqLwogCW1lbV9kZXZpY2UtPnN0YXRlID0gTUVNT1JZX1BPV0VSX09OX1NUQVRFOwogCi0JcHJpbnRrKEtFUk5fSU5GTyAiJXMgXG4iLCBhY3BpX2RldmljZV9uYW1lKGRldmljZSkpOworCXByaW50ayhLRVJOX0RFQlVHICIlcyBcbiIsIGFjcGlfZGV2aWNlX25hbWUoZGV2aWNlKSk7CiAKIAlyZXR1cm4gcmVzdWx0OwogfQpAQCAtNDM4LDYgKzQ0MCwxNSBAQAogCXN0cnVjdCBhY3BpX21lbW9yeV9kZXZpY2UgKm1lbV9kZXZpY2U7CiAJaW50IHJlc3VsdCA9IDA7CiAKKwkvKgorCSAqIEVhcmx5IGJvb3QgY29kZSBoYXMgcmVjb2duaXplZCBtZW1vcnkgYXJlYSBieSBFRkkvRTgyMC4KKwkgKiBJZiBEU0RUIHNob3dzIHRoZXNlIG1lbW9yeSBkZXZpY2VzIG9uIGJvb3QsIGhvdHBsdWcgaXMgbm90IG5lY2Vzc2FyeQorCSAqIGZvciB0aGVtLiBTbywgaXQganVzdCByZXR1cm5zIHVudGlsIGNvbXBsZXRpb24gb2YgdGhpcyBkcml2ZXIncworCSAqIHN0YXJ0IHVwLgorCSAqLworCWlmICghYWNwaV9ob3RtZW1faW5pdGlhbGl6ZWQpCisJCXJldHVybiAwOworCiAJbWVtX2RldmljZSA9IGFjcGlfZHJpdmVyX2RhdGEoZGV2aWNlKTsKIAogCWlmICghYWNwaV9tZW1vcnlfY2hlY2tfZGV2aWNlKG1lbV9kZXZpY2UpKSB7CkBAIC01MzcsNiArNTQ4LDcgQEAKIAkJcmV0dXJuIC1FTk9ERVY7CiAJfQogCisJYWNwaV9ob3RtZW1faW5pdGlhbGl6ZWQgPSAxOwogCXJldHVybiAwOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvYXN1c19hY3BpLmMgYi9kcml2ZXJzL2FjcGkvYXN1c19hY3BpLmMKaW5kZXggZTllZTRjNS4uYzdhYzkyOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL2FzdXNfYWNwaS5jCisrKyBiL2RyaXZlcnMvYWNwaS9hc3VzX2FjcGkuYwpAQCAtMTM4LDYgKzEzOCw3IEBACiAJCVMyeCwJCS8vUzIwMCAoSjEgcmVwb3J0ZWQpLCBWaWN0b3IgTVAtWFA3MjEwCiAJCVcxTiwJCS8vVzEwMDBOCiAJCVc1QSwJCS8vVzVBCisJCVczViwgICAgICAgICAgICAvL1czMDMwVgogCQl4eE4sCQkvL00yNDAwTiwgTTM3MDBOLCBNNTIwME4sIE02ODAwTiwgUzEzMDBOLCBTNTIwME4KIAkJLy8oQ2VudHJpbm8pCiAJCUVORF9NT0RFTApAQCAtMzc2LDYgKzM3NywxNyBAQAogCSAuZGlzcGxheV9nZXQgPSAiXFxBRFZHIn0sCiAKIAl7CisJIC5uYW1lID0gIlczViIsCisJIC5tdF9tbGVkID0gIk1MRUQiLAorCSAubXRfd2xlZCA9ICJXTEVEIiwKKwkgLm10X2xjZF9zd2l0Y2ggPSB4eE5fUFJFRklYICJfUTEwIiwKKwkgLmxjZF9zdGF0dXMgPSAiXFxCS0xUIiwKKwkgLmJyaWdodG5lc3Nfc2V0ID0gIlNQTFYiLAorCSAuYnJpZ2h0bmVzc19nZXQgPSAiR1BMViIsCisJIC5kaXNwbGF5X3NldCA9ICJTRFNQIiwKKwkgLmRpc3BsYXlfZ2V0ID0gIlxcSU5GQiJ9LAorCisgICAgICAgewogCSAubmFtZSA9ICJ4eE4iLAogCSAubXRfbWxlZCA9ICJNTEVEIiwKIC8qIFdMRUQgcHJlc2VudCwgYnV0IG5vdCBjb250cm9sbGVkIGJ5IEFDUEkgKi8KQEAgLTU1NSwxMSArNTY3LDExIEBACiB3cml0ZV9sZWQoY29uc3QgY2hhciBfX3VzZXIgKiBidWZmZXIsIHVuc2lnbmVkIGxvbmcgY291bnQsCiAJICBjaGFyICpsZWRuYW1lLCBpbnQgbGVkbWFzaywgaW50IGludmVydCkKIHsKLQlpbnQgdmFsdWU7CisJaW50IHJ2LCB2YWx1ZTsKIAlpbnQgbGVkX291dCA9IDA7CiAKLQljb3VudCA9IHBhcnNlX2FyZyhidWZmZXIsIGNvdW50LCAmdmFsdWUpOwotCWlmIChjb3VudCA+IDApCisJcnYgPSBwYXJzZV9hcmcoYnVmZmVyLCBjb3VudCwgJnZhbHVlKTsKKwlpZiAocnYgPiAwKQogCQlsZWRfb3V0ID0gdmFsdWUgPyAxIDogMDsKIAogCWhvdGstPnN0YXR1cyA9CkBAIC01NzIsNyArNTg0LDcgQEAKIAkJcHJpbnRrKEtFUk5fV0FSTklORyAiQXN1cyBBQ1BJOiBMRUQgKCVzKSB3cml0ZSBmYWlsZWRcbiIsCiAJCSAgICAgICBsZWRuYW1lKTsKIAotCXJldHVybiBjb3VudDsKKwlyZXR1cm4gcnY7CiB9CiAKIC8qCkBAIC02MDcsMjAgKzYxOSwxOCBAQAogcHJvY193cml0ZV9sZWRkKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqIGJ1ZmZlciwKIAkJdW5zaWduZWQgbG9uZyBjb3VudCwgdm9pZCAqZGF0YSkKIHsKLQlpbnQgdmFsdWU7CisJaW50IHJ2LCB2YWx1ZTsKIAotCWNvdW50ID0gcGFyc2VfYXJnKGJ1ZmZlciwgY291bnQsICZ2YWx1ZSk7Ci0JaWYgKGNvdW50ID4gMCkgeworCXJ2ID0gcGFyc2VfYXJnKGJ1ZmZlciwgY291bnQsICZ2YWx1ZSk7CisJaWYgKHJ2ID4gMCkgewogCQlpZiAoIXdyaXRlX2FjcGlfaW50CiAJCSAgICAoaG90ay0+aGFuZGxlLCBob3RrLT5tZXRob2RzLT5tdF9sZWRkLCB2YWx1ZSwgTlVMTCkpCiAJCQlwcmludGsoS0VSTl9XQVJOSU5HCiAJCQkgICAgICAgIkFzdXMgQUNQSTogTEVEIGRpc3BsYXkgd3JpdGUgZmFpbGVkXG4iKTsKIAkJZWxzZQogCQkJaG90ay0+bGVkZF9zdGF0dXMgPSAodTMyKSB2YWx1ZTsKLQl9IGVsc2UgaWYgKGNvdW50IDwgMCkKLQkJcHJpbnRrKEtFUk5fV0FSTklORyAiQXN1cyBBQ1BJOiBFcnJvciByZWFkaW5nIHVzZXIgaW5wdXRcbiIpOwotCi0JcmV0dXJuIGNvdW50OworCX0KKwlyZXR1cm4gcnY7CiB9CiAKIC8qCkBAIC03NjEsMTIgKzc3MSwxMiBAQAogcHJvY193cml0ZV9sY2Qoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgX191c2VyICogYnVmZmVyLAogCSAgICAgICB1bnNpZ25lZCBsb25nIGNvdW50LCB2b2lkICpkYXRhKQogewotCWludCB2YWx1ZTsKKwlpbnQgcnYsIHZhbHVlOwogCi0JY291bnQgPSBwYXJzZV9hcmcoYnVmZmVyLCBjb3VudCwgJnZhbHVlKTsKLQlpZiAoY291bnQgPiAwKQorCXJ2ID0gcGFyc2VfYXJnKGJ1ZmZlciwgY291bnQsICZ2YWx1ZSk7CisJaWYgKHJ2ID4gMCkKIAkJc2V0X2xjZF9zdGF0ZSh2YWx1ZSk7Ci0JcmV0dXJuIGNvdW50OworCXJldHVybiBydjsKIH0KIAogc3RhdGljIGludCByZWFkX2JyaWdodG5lc3Modm9pZCkKQEAgLTgzMCwxOCArODQwLDE1IEBACiBwcm9jX3dyaXRlX2JybihzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKiBidWZmZXIsCiAJICAgICAgIHVuc2lnbmVkIGxvbmcgY291bnQsIHZvaWQgKmRhdGEpCiB7Ci0JaW50IHZhbHVlOworCWludCBydiwgdmFsdWU7CiAKLQljb3VudCA9IHBhcnNlX2FyZyhidWZmZXIsIGNvdW50LCAmdmFsdWUpOwotCWlmIChjb3VudCA+IDApIHsKKwlydiA9IHBhcnNlX2FyZyhidWZmZXIsIGNvdW50LCAmdmFsdWUpOworCWlmIChydiA+IDApIHsKIAkJdmFsdWUgPSAoMCA8IHZhbHVlKSA/ICgoMTUgPCB2YWx1ZSkgPyAxNSA6IHZhbHVlKSA6IDA7CiAJCS8qIDAgPD0gdmFsdWUgPD0gMTUgKi8KIAkJc2V0X2JyaWdodG5lc3ModmFsdWUpOwotCX0gZWxzZSBpZiAoY291bnQgPCAwKSB7Ci0JCXByaW50ayhLRVJOX1dBUk5JTkcgIkFzdXMgQUNQSTogRXJyb3IgcmVhZGluZyB1c2VyIGlucHV0XG4iKTsKIAl9Ci0KLQlyZXR1cm4gY291bnQ7CisJcmV0dXJuIHJ2OwogfQogCiBzdGF0aWMgdm9pZCBzZXRfZGlzcGxheShpbnQgdmFsdWUpCkBAIC04ODAsMTUgKzg4NywxMiBAQAogcHJvY193cml0ZV9kaXNwKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqIGJ1ZmZlciwKIAkJdW5zaWduZWQgbG9uZyBjb3VudCwgdm9pZCAqZGF0YSkKIHsKLQlpbnQgdmFsdWU7CisJaW50IHJ2LCB2YWx1ZTsKIAotCWNvdW50ID0gcGFyc2VfYXJnKGJ1ZmZlciwgY291bnQsICZ2YWx1ZSk7Ci0JaWYgKGNvdW50ID4gMCkKKwlydiA9IHBhcnNlX2FyZyhidWZmZXIsIGNvdW50LCAmdmFsdWUpOworCWlmIChydiA+IDApCiAJCXNldF9kaXNwbGF5KHZhbHVlKTsKLQllbHNlIGlmIChjb3VudCA8IDApCi0JCXByaW50ayhLRVJOX1dBUk5JTkcgIkFzdXMgQUNQSTogRXJyb3IgcmVhZGluZyB1c2VyIGlucHV0XG4iKTsKLQotCXJldHVybiBjb3VudDsKKwlyZXR1cm4gcnY7CiB9CiAKIHR5cGVkZWYgaW50IChwcm9jX3JlYWRmdW5jKSAoY2hhciAqcGFnZSwgY2hhciAqKnN0YXJ0LCBvZmZfdCBvZmYsIGludCBjb3VudCwKQEAgLTEwOTcsNiArMTEwMSw4IEBACiAJCXJldHVybiBBNEc7CiAJZWxzZSBpZiAoc3RybmNtcChtb2RlbCwgIlcxTiIsIDMpID09IDApCiAJCXJldHVybiBXMU47CisJZWxzZSBpZiAoc3RybmNtcChtb2RlbCwgIlczViIsIDMpID09IDApCisJCXJldHVybiBXM1Y7CiAJZWxzZSBpZiAoc3RybmNtcChtb2RlbCwgIlc1QSIsIDMpID09IDApCiAJCXJldHVybiBXNUE7CiAJZWxzZQpAQCAtMTIwMCw5ICsxMjA2LDEwIEBACiAJCWhvdGstPm1ldGhvZHMtPm10X3dsZWQgPSBOVUxMOwogCS8qIEw1RCdzIFdMRUQgaXMgbm90IGNvbnRyb2xsZWQgYnkgQUNQSSAqLwogCWVsc2UgaWYgKHN0cm5jbXAoc3RyaW5nLCAiTTJOIiwgMykgPT0gMCB8fAorCQkgc3RybmNtcChzdHJpbmcsICJXM1YiLCAzKSA9PSAwIHx8CiAJCSBzdHJuY21wKHN0cmluZywgIlMxTiIsIDMpID09IDApCiAJCWhvdGstPm1ldGhvZHMtPm10X3dsZWQgPSAiV0xFRCI7Ci0JLyogTTJOIGFuZCBTMU4gaGF2ZSBhIHVzYWJsZSBXTEVEICovCisJLyogTTJOLCBTMU4gYW5kIFczViBoYXZlIGEgdXNhYmxlIFdMRUQgKi8KIAllbHNlIGlmIChhc3VzX2luZm8pIHsKIAkJaWYgKHN0cm5jbXAoYXN1c19pbmZvLT5vZW1fdGFibGVfaWQsICJMMSIsIDIpID09IDApCiAJCQlob3RrLT5tZXRob2RzLT5tbGVkX3N0YXR1cyA9IE5VTEw7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvYmF0dGVyeS5jIGIvZHJpdmVycy9hY3BpL2JhdHRlcnkuYwppbmRleCA5ODEwZTJhLi4wMjZlNDA3NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL2JhdHRlcnkuYworKysgYi9kcml2ZXJzL2FjcGkvYmF0dGVyeS5jCkBAIC02NCw2ICs2NCw3IEBACiAKIHN0YXRpYyBpbnQgYWNwaV9iYXR0ZXJ5X2FkZChzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldmljZSk7CiBzdGF0aWMgaW50IGFjcGlfYmF0dGVyeV9yZW1vdmUoc3RydWN0IGFjcGlfZGV2aWNlICpkZXZpY2UsIGludCB0eXBlKTsKK3N0YXRpYyBpbnQgYWNwaV9iYXR0ZXJ5X3Jlc3VtZShzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldmljZSwgaW50IHN0YXR1cyk7CiAKIHN0YXRpYyBzdHJ1Y3QgYWNwaV9kcml2ZXIgYWNwaV9iYXR0ZXJ5X2RyaXZlciA9IHsKIAkubmFtZSA9IEFDUElfQkFUVEVSWV9EUklWRVJfTkFNRSwKQEAgLTcxLDYgKzcyLDcgQEAKIAkuaWRzID0gQUNQSV9CQVRURVJZX0hJRCwKIAkub3BzID0gewogCQkuYWRkID0gYWNwaV9iYXR0ZXJ5X2FkZCwKKwkJLnJlc3VtZSA9IGFjcGlfYmF0dGVyeV9yZXN1bWUsCiAJCS5yZW1vdmUgPSBhY3BpX2JhdHRlcnlfcmVtb3ZlLAogCQl9LAogfTsKQEAgLTc1Myw2ICs3NTUsMTggQEAKIAlyZXR1cm4gMDsKIH0KIAorLyogdGhpcyBpcyBuZWVkZWQgdG8gbGVhcm4gYWJvdXQgY2hhbmdlcyBtYWRlIGluIHN1c3BlbmRlZCBzdGF0ZSAqLworc3RhdGljIGludCBhY3BpX2JhdHRlcnlfcmVzdW1lKHN0cnVjdCBhY3BpX2RldmljZSAqZGV2aWNlLCBpbnQgc3RhdGUpCit7CisJc3RydWN0IGFjcGlfYmF0dGVyeSAqYmF0dGVyeTsKKworCWlmICghZGV2aWNlKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWJhdHRlcnkgPSBkZXZpY2UtPmRyaXZlcl9kYXRhOworCXJldHVybiBhY3BpX2JhdHRlcnlfY2hlY2soYmF0dGVyeSk7Cit9CisKIHN0YXRpYyBpbnQgX19pbml0IGFjcGlfYmF0dGVyeV9pbml0KHZvaWQpCiB7CiAJaW50IHJlc3VsdDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9lYy5jIGIvZHJpdmVycy9hY3BpL2VjLmMKaW5kZXggZTVkNzk2My4uZTZkNGIwOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL2VjLmMKKysrIGIvZHJpdmVycy9hY3BpL2VjLmMKQEAgLTQ1LDIwNiArNDUsMTQzIEBACiAjZGVmaW5lIEFDUElfRUNfRFJJVkVSX05BTUUJCSJBQ1BJIEVtYmVkZGVkIENvbnRyb2xsZXIgRHJpdmVyIgogI2RlZmluZSBBQ1BJX0VDX0RFVklDRV9OQU1FCQkiRW1iZWRkZWQgQ29udHJvbGxlciIKICNkZWZpbmUgQUNQSV9FQ19GSUxFX0lORk8JCSJpbmZvIgorCisvKiBFQyBzdGF0dXMgcmVnaXN0ZXIgKi8KICNkZWZpbmUgQUNQSV9FQ19GTEFHX09CRgkweDAxCS8qIE91dHB1dCBidWZmZXIgZnVsbCAqLwogI2RlZmluZSBBQ1BJX0VDX0ZMQUdfSUJGCTB4MDIJLyogSW5wdXQgYnVmZmVyIGZ1bGwgKi8KICNkZWZpbmUgQUNQSV9FQ19GTEFHX0JVUlNUCTB4MTAJLyogYnVyc3QgbW9kZSAqLwogI2RlZmluZSBBQ1BJX0VDX0ZMQUdfU0NJCTB4MjAJLyogRUMtU0NJIG9jY3VycmVkICovCi0jZGVmaW5lIEFDUElfRUNfRVZFTlRfT0JGCTB4MDEJLyogT3V0cHV0IGJ1ZmZlciBmdWxsICovCi0jZGVmaW5lIEFDUElfRUNfRVZFTlRfSUJFCTB4MDIJLyogSW5wdXQgYnVmZmVyIGVtcHR5ICovCi0jZGVmaW5lIEFDUElfRUNfREVMQVkJCTUwCS8qIFdhaXQgNTBtcyBtYXguIGR1cmluZyBFQyBvcHMgKi8KLSNkZWZpbmUgQUNQSV9FQ19VREVMQVlfR0xLCTEwMDAJLyogV2FpdCAxbXMgbWF4LiB0byBnZXQgZ2xvYmFsIGxvY2sgKi8KLSNkZWZpbmUgQUNQSV9FQ19VREVMQVkgICAgICAgICAxMDAJLyogUG9sbCBAIDEwMHVzIGluY3JlbWVudHMgKi8KLSNkZWZpbmUgQUNQSV9FQ19VREVMQVlfQ09VTlQgICAxMDAwCS8qIFdhaXQgMTBtcyBtYXguIGR1cmluZyBFQyBvcHMgKi8KKworLyogRUMgY29tbWFuZHMgKi8KICNkZWZpbmUgQUNQSV9FQ19DT01NQU5EX1JFQUQJMHg4MAogI2RlZmluZSBBQ1BJX0VDX0NPTU1BTkRfV1JJVEUJMHg4MQogI2RlZmluZSBBQ1BJX0VDX0JVUlNUX0VOQUJMRQkweDgyCiAjZGVmaW5lIEFDUElfRUNfQlVSU1RfRElTQUJMRQkweDgzCiAjZGVmaW5lIEFDUElfRUNfQ09NTUFORF9RVUVSWQkweDg0Ci0jZGVmaW5lIEVDX1BPTEwJCQkweEZGCi0jZGVmaW5lIEVDX0lOVFIJCQkweDAwCisKKy8qIEVDIGV2ZW50cyAqLworZW51bSB7CisJQUNQSV9FQ19FVkVOVF9PQkZfMSA9IDEsCS8qIE91dHB1dCBidWZmZXIgZnVsbCAqLworCUFDUElfRUNfRVZFTlRfSUJGXzAsCQkvKiBJbnB1dCBidWZmZXIgZW1wdHkgKi8KK307CisKKyNkZWZpbmUgQUNQSV9FQ19ERUxBWQkJNTAJLyogV2FpdCA1MG1zIG1heC4gZHVyaW5nIEVDIG9wcyAqLworI2RlZmluZSBBQ1BJX0VDX1VERUxBWV9HTEsJMTAwMAkvKiBXYWl0IDFtcyBtYXguIHRvIGdldCBnbG9iYWwgbG9jayAqLworI2RlZmluZSBBQ1BJX0VDX1VERUxBWSAgICAgICAgIDEwMAkvKiBQb2xsIEAgMTAwdXMgaW5jcmVtZW50cyAqLworI2RlZmluZSBBQ1BJX0VDX1VERUxBWV9DT1VOVCAgIDEwMDAJLyogV2FpdCAxMG1zIG1heC4gZHVyaW5nIEVDIG9wcyAqLworCitlbnVtIHsKKwlFQ19JTlRSID0gMSwJLyogT3V0cHV0IGJ1ZmZlciBmdWxsICovCisJRUNfUE9MTCwJLyogSW5wdXQgYnVmZmVyIGVtcHR5ICovCit9OworCiBzdGF0aWMgaW50IGFjcGlfZWNfcmVtb3ZlKHN0cnVjdCBhY3BpX2RldmljZSAqZGV2aWNlLCBpbnQgdHlwZSk7CiBzdGF0aWMgaW50IGFjcGlfZWNfc3RhcnQoc3RydWN0IGFjcGlfZGV2aWNlICpkZXZpY2UpOwogc3RhdGljIGludCBhY3BpX2VjX3N0b3Aoc3RydWN0IGFjcGlfZGV2aWNlICpkZXZpY2UsIGludCB0eXBlKTsKLXN0YXRpYyBpbnQgYWNwaV9lY19pbnRyX2FkZChzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldmljZSk7Ci1zdGF0aWMgaW50IGFjcGlfZWNfcG9sbF9hZGQoc3RydWN0IGFjcGlfZGV2aWNlICpkZXZpY2UpOworc3RhdGljIGludCBhY3BpX2VjX2FkZChzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldmljZSk7CiAKIHN0YXRpYyBzdHJ1Y3QgYWNwaV9kcml2ZXIgYWNwaV9lY19kcml2ZXIgPSB7CiAJLm5hbWUgPSBBQ1BJX0VDX0RSSVZFUl9OQU1FLAogCS5jbGFzcyA9IEFDUElfRUNfQ0xBU1MsCiAJLmlkcyA9IEFDUElfRUNfSElELAogCS5vcHMgPSB7Ci0JCS5hZGQgPSBhY3BpX2VjX2ludHJfYWRkLAorCQkuYWRkID0gYWNwaV9lY19hZGQsCiAJCS5yZW1vdmUgPSBhY3BpX2VjX3JlbW92ZSwKIAkJLnN0YXJ0ID0gYWNwaV9lY19zdGFydCwKIAkJLnN0b3AgPSBhY3BpX2VjX3N0b3AsCiAJCX0sCiB9OwotdW5pb24gYWNwaV9lYyB7Ci0Jc3RydWN0IHsKLQkJdTMyIG1vZGU7Ci0JCWFjcGlfaGFuZGxlIGhhbmRsZTsKLQkJdW5zaWduZWQgbG9uZyB1aWQ7Ci0JCXVuc2lnbmVkIGxvbmcgZ3BlX2JpdDsKLQkJc3RydWN0IGFjcGlfZ2VuZXJpY19hZGRyZXNzIHN0YXR1c19hZGRyOwotCQlzdHJ1Y3QgYWNwaV9nZW5lcmljX2FkZHJlc3MgY29tbWFuZF9hZGRyOwotCQlzdHJ1Y3QgYWNwaV9nZW5lcmljX2FkZHJlc3MgZGF0YV9hZGRyOwotCQl1bnNpZ25lZCBsb25nIGdsb2JhbF9sb2NrOwotCX0gY29tbW9uOwogCi0Jc3RydWN0IHsKLQkJdTMyIG1vZGU7Ci0JCWFjcGlfaGFuZGxlIGhhbmRsZTsKLQkJdW5zaWduZWQgbG9uZyB1aWQ7Ci0JCXVuc2lnbmVkIGxvbmcgZ3BlX2JpdDsKLQkJc3RydWN0IGFjcGlfZ2VuZXJpY19hZGRyZXNzIHN0YXR1c19hZGRyOwotCQlzdHJ1Y3QgYWNwaV9nZW5lcmljX2FkZHJlc3MgY29tbWFuZF9hZGRyOwotCQlzdHJ1Y3QgYWNwaV9nZW5lcmljX2FkZHJlc3MgZGF0YV9hZGRyOwotCQl1bnNpZ25lZCBsb25nIGdsb2JhbF9sb2NrOwotCQl1bnNpZ25lZCBpbnQgZXhwZWN0X2V2ZW50OwotCQlhdG9taWNfdCBsZWF2aW5nX2J1cnN0OwkvKiAwIDogTm8sIDEgOiBZZXMsIDI6IGFib3J0ICovCi0JCWF0b21pY190IHBlbmRpbmdfZ3BlOwotCQlzdHJ1Y3Qgc2VtYXBob3JlIHNlbTsKLQkJd2FpdF9xdWV1ZV9oZWFkX3Qgd2FpdDsKLQl9IGludHI7Ci0KLQlzdHJ1Y3QgewotCQl1MzIgbW9kZTsKLQkJYWNwaV9oYW5kbGUgaGFuZGxlOwotCQl1bnNpZ25lZCBsb25nIHVpZDsKLQkJdW5zaWduZWQgbG9uZyBncGVfYml0OwotCQlzdHJ1Y3QgYWNwaV9nZW5lcmljX2FkZHJlc3Mgc3RhdHVzX2FkZHI7Ci0JCXN0cnVjdCBhY3BpX2dlbmVyaWNfYWRkcmVzcyBjb21tYW5kX2FkZHI7Ci0JCXN0cnVjdCBhY3BpX2dlbmVyaWNfYWRkcmVzcyBkYXRhX2FkZHI7Ci0JCXVuc2lnbmVkIGxvbmcgZ2xvYmFsX2xvY2s7Ci0JCXN0cnVjdCBzZW1hcGhvcmUgc2VtOwotCX0gcG9sbDsKLX07Ci0KLXN0YXRpYyBpbnQgYWNwaV9lY19wb2xsX3dhaXQodW5pb24gYWNwaV9lYyAqZWMsIHU4IGV2ZW50KTsKLXN0YXRpYyBpbnQgYWNwaV9lY19pbnRyX3dhaXQodW5pb24gYWNwaV9lYyAqZWMsIHVuc2lnbmVkIGludCBldmVudCk7Ci1zdGF0aWMgaW50IGFjcGlfZWNfcG9sbF9yZWFkKHVuaW9uIGFjcGlfZWMgKmVjLCB1OCBhZGRyZXNzLCB1MzIgKiBkYXRhKTsKLXN0YXRpYyBpbnQgYWNwaV9lY19pbnRyX3JlYWQodW5pb24gYWNwaV9lYyAqZWMsIHU4IGFkZHJlc3MsIHUzMiAqIGRhdGEpOwotc3RhdGljIGludCBhY3BpX2VjX3BvbGxfd3JpdGUodW5pb24gYWNwaV9lYyAqZWMsIHU4IGFkZHJlc3MsIHU4IGRhdGEpOwotc3RhdGljIGludCBhY3BpX2VjX2ludHJfd3JpdGUodW5pb24gYWNwaV9lYyAqZWMsIHU4IGFkZHJlc3MsIHU4IGRhdGEpOwotc3RhdGljIGludCBhY3BpX2VjX3BvbGxfcXVlcnkodW5pb24gYWNwaV9lYyAqZWMsIHUzMiAqIGRhdGEpOwotc3RhdGljIGludCBhY3BpX2VjX2ludHJfcXVlcnkodW5pb24gYWNwaV9lYyAqZWMsIHUzMiAqIGRhdGEpOwotc3RhdGljIHZvaWQgYWNwaV9lY19ncGVfcG9sbF9xdWVyeSh2b2lkICplY19jeHQpOwotc3RhdGljIHZvaWQgYWNwaV9lY19ncGVfaW50cl9xdWVyeSh2b2lkICplY19jeHQpOwotc3RhdGljIHUzMiBhY3BpX2VjX2dwZV9wb2xsX2hhbmRsZXIodm9pZCAqZGF0YSk7Ci1zdGF0aWMgdTMyIGFjcGlfZWNfZ3BlX2ludHJfaGFuZGxlcih2b2lkICpkYXRhKTsKLXN0YXRpYyBhY3BpX3N0YXR1cyBfX2luaXQKLWFjcGlfZmFrZV9lY2R0X3BvbGxfY2FsbGJhY2soYWNwaV9oYW5kbGUgaGFuZGxlLAotCQkJCXUzMiBMZXZlbCwgdm9pZCAqY29udGV4dCwgdm9pZCAqKnJldHZhbCk7Ci0KLXN0YXRpYyBhY3BpX3N0YXR1cyBfX2luaXQKLWFjcGlfZmFrZV9lY2R0X2ludHJfY2FsbGJhY2soYWNwaV9oYW5kbGUgaGFuZGxlLAotCQkJICAgICAgdTMyIExldmVsLCB2b2lkICpjb250ZXh0LCB2b2lkICoqcmV0dmFsKTsKLQotc3RhdGljIGludCBfX2luaXQgYWNwaV9lY19wb2xsX2dldF9yZWFsX2VjZHQodm9pZCk7Ci1zdGF0aWMgaW50IF9faW5pdCBhY3BpX2VjX2ludHJfZ2V0X3JlYWxfZWNkdCh2b2lkKTsKIC8qIElmIHdlIGZpbmQgYW4gRUMgdmlhIHRoZSBFQ0RULCB3ZSBuZWVkIHRvIGtlZXAgYSBwdHIgdG8gaXRzIGNvbnRleHQgKi8KLXN0YXRpYyB1bmlvbiBhY3BpX2VjICplY19lY2R0Oworc3RydWN0IGFjcGlfZWMgeworCWFjcGlfaGFuZGxlIGhhbmRsZTsKKwl1bnNpZ25lZCBsb25nIHVpZDsKKwl1bnNpZ25lZCBsb25nIGdwZV9iaXQ7CisJdW5zaWduZWQgbG9uZyBjb21tYW5kX2FkZHI7CisJdW5zaWduZWQgbG9uZyBkYXRhX2FkZHI7CisJdW5zaWduZWQgbG9uZyBnbG9iYWxfbG9jazsKKwlzdHJ1Y3Qgc2VtYXBob3JlIHNlbTsKKwl1bnNpZ25lZCBpbnQgZXhwZWN0X2V2ZW50OworCWF0b21pY190IGxlYXZpbmdfYnVyc3Q7CS8qIDAgOiBObywgMSA6IFllcywgMjogYWJvcnQgKi8KKwl3YWl0X3F1ZXVlX2hlYWRfdCB3YWl0OworfSAqZWNfZWNkdDsKIAogLyogRXh0ZXJuYWwgaW50ZXJmYWNlcyB1c2UgZmlyc3QgRUMgb25seSwgc28gcmVtZW1iZXIgKi8KIHN0YXRpYyBzdHJ1Y3QgYWNwaV9kZXZpY2UgKmZpcnN0X2VjOwotc3RhdGljIGludCBhY3BpX2VjX3BvbGxfbW9kZSA9IEVDX0lOVFI7CitzdGF0aWMgaW50IGFjcGlfZWNfbW9kZSA9IEVDX0lOVFI7CiAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRyYW5zYWN0aW9uIE1hbmFnZW1lbnQKICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKLXN0YXRpYyB1MzIgYWNwaV9lY19yZWFkX3N0YXR1cyh1bmlvbiBhY3BpX2VjICplYykKK3N0YXRpYyBpbmxpbmUgdTggYWNwaV9lY19yZWFkX3N0YXR1cyhzdHJ1Y3QgYWNwaV9lYyAqZWMpCiB7Ci0JdTMyIHN0YXR1cyA9IDA7Ci0KLQlhY3BpX2h3X2xvd19sZXZlbF9yZWFkKDgsICZzdGF0dXMsICZlYy0+Y29tbW9uLnN0YXR1c19hZGRyKTsKLQlyZXR1cm4gc3RhdHVzOworCXJldHVybiBpbmIoZWMtPmNvbW1hbmRfYWRkcik7CiB9CiAKLXN0YXRpYyBpbnQgYWNwaV9lY193YWl0KHVuaW9uIGFjcGlfZWMgKmVjLCB1OCBldmVudCkKK3N0YXRpYyBpbmxpbmUgdTggYWNwaV9lY19yZWFkX2RhdGEoc3RydWN0IGFjcGlfZWMgKmVjKQogewotCWlmIChhY3BpX2VjX3BvbGxfbW9kZSkKLQkJcmV0dXJuIGFjcGlfZWNfcG9sbF93YWl0KGVjLCBldmVudCk7Ci0JZWxzZQotCQlyZXR1cm4gYWNwaV9lY19pbnRyX3dhaXQoZWMsIGV2ZW50KTsKKwlyZXR1cm4gaW5iKGVjLT5kYXRhX2FkZHIpOwogfQogCi1zdGF0aWMgaW50IGFjcGlfZWNfcG9sbF93YWl0KHVuaW9uIGFjcGlfZWMgKmVjLCB1OCBldmVudCkKK3N0YXRpYyBpbmxpbmUgdm9pZCBhY3BpX2VjX3dyaXRlX2NtZChzdHJ1Y3QgYWNwaV9lYyAqZWMsIHU4IGNvbW1hbmQpCiB7Ci0JdTMyIGFjcGlfZWNfc3RhdHVzID0gMDsKLQl1MzIgaSA9IEFDUElfRUNfVURFTEFZX0NPVU5UOworCW91dGIoY29tbWFuZCwgZWMtPmNvbW1hbmRfYWRkcik7Cit9CiAKLQlpZiAoIWVjKQotCQlyZXR1cm4gLUVJTlZBTDsKK3N0YXRpYyBpbmxpbmUgdm9pZCBhY3BpX2VjX3dyaXRlX2RhdGEoc3RydWN0IGFjcGlfZWMgKmVjLCB1OCBkYXRhKQoreworCW91dGIoZGF0YSwgZWMtPmRhdGFfYWRkcik7Cit9CiAKLQkvKiBQb2xsIHRoZSBFQyBzdGF0dXMgcmVnaXN0ZXIgd2FpdGluZyBmb3IgdGhlIGV2ZW50IHRvIG9jY3VyLiAqLworc3RhdGljIGludCBhY3BpX2VjX2NoZWNrX3N0YXR1cyh1OCBzdGF0dXMsIHU4IGV2ZW50KQorewogCXN3aXRjaCAoZXZlbnQpIHsKLQljYXNlIEFDUElfRUNfRVZFTlRfT0JGOgotCQlkbyB7Ci0JCQlhY3BpX2h3X2xvd19sZXZlbF9yZWFkKDgsICZhY3BpX2VjX3N0YXR1cywKLQkJCQkJICAgICAgICZlYy0+Y29tbW9uLnN0YXR1c19hZGRyKTsKLQkJCWlmIChhY3BpX2VjX3N0YXR1cyAmIEFDUElfRUNfRkxBR19PQkYpCi0JCQkJcmV0dXJuIDA7Ci0JCQl1ZGVsYXkoQUNQSV9FQ19VREVMQVkpOwotCQl9IHdoaWxlICgtLWkgPiAwKTsKKwljYXNlIEFDUElfRUNfRVZFTlRfT0JGXzE6CisJCWlmIChzdGF0dXMgJiBBQ1BJX0VDX0ZMQUdfT0JGKQorCQkJcmV0dXJuIDE7CiAJCWJyZWFrOwotCWNhc2UgQUNQSV9FQ19FVkVOVF9JQkU6Ci0JCWRvIHsKLQkJCWFjcGlfaHdfbG93X2xldmVsX3JlYWQoOCwgJmFjcGlfZWNfc3RhdHVzLAotCQkJCQkgICAgICAgJmVjLT5jb21tb24uc3RhdHVzX2FkZHIpOwotCQkJaWYgKCEoYWNwaV9lY19zdGF0dXMgJiBBQ1BJX0VDX0ZMQUdfSUJGKSkKLQkJCQlyZXR1cm4gMDsKLQkJCXVkZWxheShBQ1BJX0VDX1VERUxBWSk7Ci0JCX0gd2hpbGUgKC0taSA+IDApOworCWNhc2UgQUNQSV9FQ19FVkVOVF9JQkZfMDoKKwkJaWYgKCEoc3RhdHVzICYgQUNQSV9FQ19GTEFHX0lCRikpCisJCQlyZXR1cm4gMTsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKLQkJcmV0dXJuIC1FSU5WQUw7CisJCWJyZWFrOwogCX0KIAotCXJldHVybiAtRVRJTUU7CisJcmV0dXJuIDA7CiB9Ci1zdGF0aWMgaW50IGFjcGlfZWNfaW50cl93YWl0KHVuaW9uIGFjcGlfZWMgKmVjLCB1bnNpZ25lZCBpbnQgZXZlbnQpCisKK3N0YXRpYyBpbnQgYWNwaV9lY193YWl0KHN0cnVjdCBhY3BpX2VjICplYywgdTggZXZlbnQpCiB7Ci0JaW50IHJlc3VsdCA9IDA7CisJaW50IGkgPSAoYWNwaV9lY19tb2RlID09IEVDX1BPTEwpID8gQUNQSV9FQ19VREVMQVlfQ09VTlQgOiAwOworCWxvbmcgdGltZV9sZWZ0OwogCisJZWMtPmV4cGVjdF9ldmVudCA9IGV2ZW50OworCWlmIChhY3BpX2VjX2NoZWNrX3N0YXR1cyhhY3BpX2VjX3JlYWRfc3RhdHVzKGVjKSwgZXZlbnQpKSB7CisJCWVjLT5leHBlY3RfZXZlbnQgPSAwOworCQlyZXR1cm4gMDsKKwl9CiAKLQllYy0+aW50ci5leHBlY3RfZXZlbnQgPSBldmVudDsKLQlzbXBfbWIoKTsKLQotCXN3aXRjaCAoZXZlbnQpIHsKLQljYXNlIEFDUElfRUNfRVZFTlRfSUJFOgotCQlpZiAofmFjcGlfZWNfcmVhZF9zdGF0dXMoZWMpICYgQUNQSV9FQ19GTEFHX0lCRikgewotCQkJZWMtPmludHIuZXhwZWN0X2V2ZW50ID0gMDsKKwlkbyB7CisJCWlmIChhY3BpX2VjX21vZGUgPT0gRUNfUE9MTCkgeworCQkJdWRlbGF5KEFDUElfRUNfVURFTEFZKTsKKwkJfSBlbHNlIHsKKwkJCXRpbWVfbGVmdCA9IHdhaXRfZXZlbnRfdGltZW91dChlYy0+d2FpdCwKKwkJCQkgICAgIWVjLT5leHBlY3RfZXZlbnQsCisJCQkJICAgIG1zZWNzX3RvX2ppZmZpZXMoQUNQSV9FQ19ERUxBWSkpOworCQkJaWYgKHRpbWVfbGVmdCA+IDApIHsKKwkJCQllYy0+ZXhwZWN0X2V2ZW50ID0gMDsKKwkJCQlyZXR1cm4gMDsKKwkJCX0KKwkJfQorCQlpZiAoYWNwaV9lY19jaGVja19zdGF0dXMoYWNwaV9lY19yZWFkX3N0YXR1cyhlYyksIGV2ZW50KSkgeworCQkJZWMtPmV4cGVjdF9ldmVudCA9IDA7CiAJCQlyZXR1cm4gMDsKIAkJfQotCQlicmVhazsKLQlkZWZhdWx0OgotCQlicmVhazsKLQl9CisJfSB3aGlsZSAoLS1pID4gMCk7CiAKLQlyZXN1bHQgPSB3YWl0X2V2ZW50X3RpbWVvdXQoZWMtPmludHIud2FpdCwKLQkJCQkgICAgIWVjLT5pbnRyLmV4cGVjdF9ldmVudCwKLQkJCQkgICAgbXNlY3NfdG9famlmZmllcyhBQ1BJX0VDX0RFTEFZKSk7Ci0KLQllYy0+aW50ci5leHBlY3RfZXZlbnQgPSAwOwotCXNtcF9tYigpOwotCi0JLyoKLQkgKiBWZXJpZnkgdGhhdCB0aGUgZXZlbnQgaW4gcXVlc3Rpb24gaGFzIGFjdHVhbGx5IGhhcHBlbmVkIGJ5Ci0JICogcXVlcnlpbmcgRUMgc3RhdHVzLiBEbyB0aGUgY2hlY2sgZXZlbiBpZiBvcGVyYXRpb24gdGltZWQtb3V0Ci0JICogdG8gbWFrZSBzdXJlIHRoYXQgd2UgZGlkIG5vdCBtaXNzIGludGVycnVwdC4KLQkgKi8KLQlzd2l0Y2ggKGV2ZW50KSB7Ci0JY2FzZSBBQ1BJX0VDX0VWRU5UX09CRjoKLQkJaWYgKGFjcGlfZWNfcmVhZF9zdGF0dXMoZWMpICYgQUNQSV9FQ19GTEFHX09CRikKLQkJCXJldHVybiAwOwotCQlicmVhazsKLQotCWNhc2UgQUNQSV9FQ19FVkVOVF9JQkU6Ci0JCWlmICh+YWNwaV9lY19yZWFkX3N0YXR1cyhlYykgJiBBQ1BJX0VDX0ZMQUdfSUJGKQotCQkJcmV0dXJuIDA7Ci0JCWJyZWFrOwotCX0KKwllYy0+ZXhwZWN0X2V2ZW50ID0gMDsKIAogCXJldHVybiAtRVRJTUU7CiB9CkBAIC0yNTQsMjcyICsxOTEsMTUwIEBACiAgKiBOb3RlOiBzYW1zdW5nIG52NTAwMCBkb2Vzbid0IHdvcmsgd2l0aCBlYyBidXJzdCBtb2RlLgogICogaHR0cDovL2J1Z3ppbGxhLmtlcm5lbC5vcmcvc2hvd19idWcuY2dpP2lkPTQ5ODAKICAqLwotaW50IGFjcGlfZWNfZW50ZXJfYnVyc3RfbW9kZSh1bmlvbiBhY3BpX2VjICplYykKK2ludCBhY3BpX2VjX2VudGVyX2J1cnN0X21vZGUoc3RydWN0IGFjcGlfZWMgKmVjKQogewotCXUzMiB0bXAgPSAwOwotCWludCBzdGF0dXMgPSAwOworCXU4IHRtcCA9IDA7CisJdTggc3RhdHVzID0gMDsKIAogCiAJc3RhdHVzID0gYWNwaV9lY19yZWFkX3N0YXR1cyhlYyk7CiAJaWYgKHN0YXR1cyAhPSAtRUlOVkFMICYmICEoc3RhdHVzICYgQUNQSV9FQ19GTEFHX0JVUlNUKSkgewotCQlzdGF0dXMgPSBhY3BpX2VjX3dhaXQoZWMsIEFDUElfRUNfRVZFTlRfSUJFKTsKKwkJc3RhdHVzID0gYWNwaV9lY193YWl0KGVjLCBBQ1BJX0VDX0VWRU5UX0lCRl8wKTsKIAkJaWYgKHN0YXR1cykKIAkJCWdvdG8gZW5kOwotCQlhY3BpX2h3X2xvd19sZXZlbF93cml0ZSg4LCBBQ1BJX0VDX0JVUlNUX0VOQUJMRSwKLQkJCQkJJmVjLT5jb21tb24uY29tbWFuZF9hZGRyKTsKLQkJc3RhdHVzID0gYWNwaV9lY193YWl0KGVjLCBBQ1BJX0VDX0VWRU5UX09CRik7Ci0JCWFjcGlfaHdfbG93X2xldmVsX3JlYWQoOCwgJnRtcCwgJmVjLT5jb21tb24uZGF0YV9hZGRyKTsKKwkJYWNwaV9lY193cml0ZV9jbWQoZWMsIEFDUElfRUNfQlVSU1RfRU5BQkxFKTsKKwkJc3RhdHVzID0gYWNwaV9lY193YWl0KGVjLCBBQ1BJX0VDX0VWRU5UX09CRl8xKTsKKwkJdG1wID0gYWNwaV9lY19yZWFkX2RhdGEoZWMpOwogCQlpZiAodG1wICE9IDB4OTApIHsJLyogQnVyc3QgQUNLIGJ5dGUgKi8KIAkJCXJldHVybiAtRUlOVkFMOwogCQl9CiAJfQogCi0JYXRvbWljX3NldCgmZWMtPmludHIubGVhdmluZ19idXJzdCwgMCk7CisJYXRvbWljX3NldCgmZWMtPmxlYXZpbmdfYnVyc3QsIDApOwogCXJldHVybiAwOwotICAgICAgZW5kOgotCUFDUElfRVhDRVBUSU9OICgoQUVfSU5GTywgc3RhdHVzLCAiRUMgd2FpdCwgYnVyc3QgbW9kZSIpOworICBlbmQ6CisJQUNQSV9FWENFUFRJT04oKEFFX0lORk8sIHN0YXR1cywgIkVDIHdhaXQsIGJ1cnN0IG1vZGUiKSk7CiAJcmV0dXJuIC0xOwogfQogCi1pbnQgYWNwaV9lY19sZWF2ZV9idXJzdF9tb2RlKHVuaW9uIGFjcGlfZWMgKmVjKQoraW50IGFjcGlfZWNfbGVhdmVfYnVyc3RfbW9kZShzdHJ1Y3QgYWNwaV9lYyAqZWMpCiB7Ci0JaW50IHN0YXR1cyA9IDA7CisJdTggc3RhdHVzID0gMDsKIAogCiAJc3RhdHVzID0gYWNwaV9lY19yZWFkX3N0YXR1cyhlYyk7CiAJaWYgKHN0YXR1cyAhPSAtRUlOVkFMICYmIChzdGF0dXMgJiBBQ1BJX0VDX0ZMQUdfQlVSU1QpKXsKLQkJc3RhdHVzID0gYWNwaV9lY193YWl0KGVjLCBBQ1BJX0VDX0ZMQUdfSUJGKTsKKwkJc3RhdHVzID0gYWNwaV9lY193YWl0KGVjLCBBQ1BJX0VDX0VWRU5UX0lCRl8wKTsKIAkJaWYoc3RhdHVzKQogCQkJZ290byBlbmQ7Ci0JCWFjcGlfaHdfbG93X2xldmVsX3dyaXRlKDgsIEFDUElfRUNfQlVSU1RfRElTQUJMRSwgJmVjLT5jb21tb24uY29tbWFuZF9hZGRyKTsKLQkJYWNwaV9lY193YWl0KGVjLCBBQ1BJX0VDX0ZMQUdfSUJGKTsKLQl9IAotCWF0b21pY19zZXQoJmVjLT5pbnRyLmxlYXZpbmdfYnVyc3QsIDEpOworCQlhY3BpX2VjX3dyaXRlX2NtZChlYywgQUNQSV9FQ19CVVJTVF9ESVNBQkxFKTsKKwkJYWNwaV9lY193YWl0KGVjLCBBQ1BJX0VDX0VWRU5UX0lCRl8wKTsKKwl9CisJYXRvbWljX3NldCgmZWMtPmxlYXZpbmdfYnVyc3QsIDEpOwogCXJldHVybiAwOwotZW5kOgotCUFDUElfRVhDRVBUSU9OKChBRV9JTkZPLCBzdGF0dXMsICJFQyBsZWF2ZSBidXJzdCBtb2RlIik7CisgIGVuZDoKKwlBQ1BJX0VYQ0VQVElPTigoQUVfSU5GTywgc3RhdHVzLCAiRUMgbGVhdmUgYnVyc3QgbW9kZSIpKTsKIAlyZXR1cm4gLTE7CiB9CiAjZW5kaWYgLyogQUNQSV9GVVRVUkVfVVNBR0UgKi8KIAotc3RhdGljIGludCBhY3BpX2VjX3JlYWQodW5pb24gYWNwaV9lYyAqZWMsIHU4IGFkZHJlc3MsIHUzMiAqIGRhdGEpCitzdGF0aWMgaW50IGFjcGlfZWNfdHJhbnNhY3Rpb25fdW5sb2NrZWQoc3RydWN0IGFjcGlfZWMgKmVjLCB1OCBjb21tYW5kLAorCQkJCQljb25zdCB1OCAqd2RhdGEsIHVuc2lnbmVkIHdkYXRhX2xlbiwKKwkJCQkJdTggKnJkYXRhLCB1bnNpZ25lZCByZGF0YV9sZW4pCiB7Ci0JaWYgKGFjcGlfZWNfcG9sbF9tb2RlKQotCQlyZXR1cm4gYWNwaV9lY19wb2xsX3JlYWQoZWMsIGFkZHJlc3MsIGRhdGEpOwotCWVsc2UKLQkJcmV0dXJuIGFjcGlfZWNfaW50cl9yZWFkKGVjLCBhZGRyZXNzLCBkYXRhKTsKLX0KLXN0YXRpYyBpbnQgYWNwaV9lY193cml0ZSh1bmlvbiBhY3BpX2VjICplYywgdTggYWRkcmVzcywgdTggZGF0YSkKLXsKLQlpZiAoYWNwaV9lY19wb2xsX21vZGUpCi0JCXJldHVybiBhY3BpX2VjX3BvbGxfd3JpdGUoZWMsIGFkZHJlc3MsIGRhdGEpOwotCWVsc2UKLQkJcmV0dXJuIGFjcGlfZWNfaW50cl93cml0ZShlYywgYWRkcmVzcywgZGF0YSk7Ci19Ci1zdGF0aWMgaW50IGFjcGlfZWNfcG9sbF9yZWFkKHVuaW9uIGFjcGlfZWMgKmVjLCB1OCBhZGRyZXNzLCB1MzIgKiBkYXRhKQotewotCWFjcGlfc3RhdHVzIHN0YXR1cyA9IEFFX09LOwotCWludCByZXN1bHQgPSAwOwotCXUzMiBnbGsgPSAwOworCWludCByZXN1bHQ7CiAKKwlhY3BpX2VjX3dyaXRlX2NtZChlYywgY29tbWFuZCk7CiAKLQlpZiAoIWVjIHx8ICFkYXRhKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCSpkYXRhID0gMDsKLQotCWlmIChlYy0+Y29tbW9uLmdsb2JhbF9sb2NrKSB7Ci0JCXN0YXR1cyA9IGFjcGlfYWNxdWlyZV9nbG9iYWxfbG9jayhBQ1BJX0VDX1VERUxBWV9HTEssICZnbGspOwotCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpCi0JCQlyZXR1cm4gLUVOT0RFVjsKKwlmb3IgKDsgd2RhdGFfbGVuID4gMDsgd2RhdGFfbGVuIC0tKSB7CisJCXJlc3VsdCA9IGFjcGlfZWNfd2FpdChlYywgQUNQSV9FQ19FVkVOVF9JQkZfMCk7CisJCWlmIChyZXN1bHQpCisJCQlyZXR1cm4gcmVzdWx0OworCQlhY3BpX2VjX3dyaXRlX2RhdGEoZWMsICood2RhdGErKykpOwogCX0KIAotCWlmIChkb3duX2ludGVycnVwdGlibGUoJmVjLT5wb2xsLnNlbSkpIHsKLQkJcmVzdWx0ID0gLUVSRVNUQVJUU1lTOwotCQlnb3RvIGVuZF9ub3NlbTsKKwlpZiAoY29tbWFuZCA9PSBBQ1BJX0VDX0NPTU1BTkRfV1JJVEUpIHsKKwkJcmVzdWx0ID0gYWNwaV9lY193YWl0KGVjLCBBQ1BJX0VDX0VWRU5UX0lCRl8wKTsKKwkJaWYgKHJlc3VsdCkKKwkJCXJldHVybiByZXN1bHQ7CiAJfQotCQotCWFjcGlfaHdfbG93X2xldmVsX3dyaXRlKDgsIEFDUElfRUNfQ09NTUFORF9SRUFELAotCQkJCSZlYy0+Y29tbW9uLmNvbW1hbmRfYWRkcik7Ci0JcmVzdWx0ID0gYWNwaV9lY193YWl0KGVjLCBBQ1BJX0VDX0VWRU5UX0lCRSk7Ci0JaWYgKHJlc3VsdCkKLQkJZ290byBlbmQ7CiAKLQlhY3BpX2h3X2xvd19sZXZlbF93cml0ZSg4LCBhZGRyZXNzLCAmZWMtPmNvbW1vbi5kYXRhX2FkZHIpOwotCXJlc3VsdCA9IGFjcGlfZWNfd2FpdChlYywgQUNQSV9FQ19FVkVOVF9PQkYpOwotCWlmIChyZXN1bHQpCi0JCWdvdG8gZW5kOworCWZvciAoOyByZGF0YV9sZW4gPiAwOyByZGF0YV9sZW4gLS0pIHsKKwkJcmVzdWx0ID0gYWNwaV9lY193YWl0KGVjLCBBQ1BJX0VDX0VWRU5UX09CRl8xKTsKKwkJaWYgKHJlc3VsdCkKKwkJCXJldHVybiByZXN1bHQ7CiAKLQlhY3BpX2h3X2xvd19sZXZlbF9yZWFkKDgsIGRhdGEsICZlYy0+Y29tbW9uLmRhdGFfYWRkcik7CisJCSoocmRhdGErKykgPSBhY3BpX2VjX3JlYWRfZGF0YShlYyk7CisJfQogCi0JQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9JTkZPLCAiUmVhZCBbJTAyeF0gZnJvbSBhZGRyZXNzIFslMDJ4XVxuIiwKLQkJCSAgKmRhdGEsIGFkZHJlc3MpKTsKLQotICAgICAgZW5kOgotCXVwKCZlYy0+cG9sbC5zZW0pOwotZW5kX25vc2VtOgotCWlmIChlYy0+Y29tbW9uLmdsb2JhbF9sb2NrKQotCQlhY3BpX3JlbGVhc2VfZ2xvYmFsX2xvY2soZ2xrKTsKLQotCXJldHVybiByZXN1bHQ7CisJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgYWNwaV9lY19wb2xsX3dyaXRlKHVuaW9uIGFjcGlfZWMgKmVjLCB1OCBhZGRyZXNzLCB1OCBkYXRhKQorc3RhdGljIGludCBhY3BpX2VjX3RyYW5zYWN0aW9uKHN0cnVjdCBhY3BpX2VjICplYywgdTggY29tbWFuZCwKKwkJCQljb25zdCB1OCAqd2RhdGEsIHVuc2lnbmVkIHdkYXRhX2xlbiwKKwkJCQl1OCAqcmRhdGEsIHVuc2lnbmVkIHJkYXRhX2xlbikKIHsKLQlpbnQgcmVzdWx0ID0gMDsKLQlhY3BpX3N0YXR1cyBzdGF0dXMgPSBBRV9PSzsKLQl1MzIgZ2xrID0gMDsKLQotCi0JaWYgKCFlYykKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQlpZiAoZWMtPmNvbW1vbi5nbG9iYWxfbG9jaykgewotCQlzdGF0dXMgPSBhY3BpX2FjcXVpcmVfZ2xvYmFsX2xvY2soQUNQSV9FQ19VREVMQVlfR0xLLCAmZ2xrKTsKLQkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKQotCQkJcmV0dXJuIC1FTk9ERVY7Ci0JfQotCi0JaWYgKGRvd25faW50ZXJydXB0aWJsZSgmZWMtPnBvbGwuc2VtKSkgewotCQlyZXN1bHQgPSAtRVJFU1RBUlRTWVM7Ci0JCWdvdG8gZW5kX25vc2VtOwotCX0KLQkKLQlhY3BpX2h3X2xvd19sZXZlbF93cml0ZSg4LCBBQ1BJX0VDX0NPTU1BTkRfV1JJVEUsCi0JCQkJJmVjLT5jb21tb24uY29tbWFuZF9hZGRyKTsKLQlyZXN1bHQgPSBhY3BpX2VjX3dhaXQoZWMsIEFDUElfRUNfRVZFTlRfSUJFKTsKLQlpZiAocmVzdWx0KQotCQlnb3RvIGVuZDsKLQotCWFjcGlfaHdfbG93X2xldmVsX3dyaXRlKDgsIGFkZHJlc3MsICZlYy0+Y29tbW9uLmRhdGFfYWRkcik7Ci0JcmVzdWx0ID0gYWNwaV9lY193YWl0KGVjLCBBQ1BJX0VDX0VWRU5UX0lCRSk7Ci0JaWYgKHJlc3VsdCkKLQkJZ290byBlbmQ7Ci0KLQlhY3BpX2h3X2xvd19sZXZlbF93cml0ZSg4LCBkYXRhLCAmZWMtPmNvbW1vbi5kYXRhX2FkZHIpOwotCXJlc3VsdCA9IGFjcGlfZWNfd2FpdChlYywgQUNQSV9FQ19FVkVOVF9JQkUpOwotCWlmIChyZXN1bHQpCi0JCWdvdG8gZW5kOwotCi0JQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9JTkZPLCAiV3JvdGUgWyUwMnhdIHRvIGFkZHJlc3MgWyUwMnhdXG4iLAotCQkJICBkYXRhLCBhZGRyZXNzKSk7Ci0KLSAgICAgIGVuZDoKLQl1cCgmZWMtPnBvbGwuc2VtKTsKLWVuZF9ub3NlbToKLQlpZiAoZWMtPmNvbW1vbi5nbG9iYWxfbG9jaykKLQkJYWNwaV9yZWxlYXNlX2dsb2JhbF9sb2NrKGdsayk7Ci0KLQlyZXR1cm4gcmVzdWx0OwotfQotCi1zdGF0aWMgaW50IGFjcGlfZWNfaW50cl9yZWFkKHVuaW9uIGFjcGlfZWMgKmVjLCB1OCBhZGRyZXNzLCB1MzIgKiBkYXRhKQotewotCWludCBzdGF0dXMgPSAwOworCWludCBzdGF0dXM7CiAJdTMyIGdsazsKIAotCi0JaWYgKCFlYyB8fCAhZGF0YSkKKwlpZiAoIWVjIHx8ICh3ZGF0YV9sZW4gJiYgIXdkYXRhKSB8fCAocmRhdGFfbGVuICYmICFyZGF0YSkpCiAJCXJldHVybiAtRUlOVkFMOwogCi0JKmRhdGEgPSAwOworICAgICAgICBpZiAocmRhdGEpCisgICAgICAgICAgICAgICAgbWVtc2V0KHJkYXRhLCAwLCByZGF0YV9sZW4pOwogCi0JaWYgKGVjLT5jb21tb24uZ2xvYmFsX2xvY2spIHsKKwlpZiAoZWMtPmdsb2JhbF9sb2NrKSB7CiAJCXN0YXR1cyA9IGFjcGlfYWNxdWlyZV9nbG9iYWxfbG9jayhBQ1BJX0VDX1VERUxBWV9HTEssICZnbGspOwogCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpCiAJCQlyZXR1cm4gLUVOT0RFVjsKIAl9CisJZG93bigmZWMtPnNlbSk7CiAKLQlXQVJOX09OKGluX2ludGVycnVwdCgpKTsKLQlkb3duKCZlYy0+aW50ci5zZW0pOwotCi0Jc3RhdHVzID0gYWNwaV9lY193YWl0KGVjLCBBQ1BJX0VDX0VWRU5UX0lCRSk7CisJc3RhdHVzID0gYWNwaV9lY193YWl0KGVjLCBBQ1BJX0VDX0VWRU5UX0lCRl8wKTsKIAlpZiAoc3RhdHVzKSB7CiAJCXByaW50ayhLRVJOX0RFQlVHIFBSRUZJWCAicmVhZCBFQywgSUIgbm90IGVtcHR5XG4iKTsKIAkJZ290byBlbmQ7CiAJfQotCWFjcGlfaHdfbG93X2xldmVsX3dyaXRlKDgsIEFDUElfRUNfQ09NTUFORF9SRUFELAotCQkJCSZlYy0+Y29tbW9uLmNvbW1hbmRfYWRkcik7Ci0Jc3RhdHVzID0gYWNwaV9lY193YWl0KGVjLCBBQ1BJX0VDX0VWRU5UX0lCRSk7Ci0JaWYgKHN0YXR1cykgewotCQlwcmludGsoS0VSTl9ERUJVRyBQUkVGSVggInJlYWQgRUMsIElCIG5vdCBlbXB0eVxuIik7Ci0JfQogCi0JYWNwaV9od19sb3dfbGV2ZWxfd3JpdGUoOCwgYWRkcmVzcywgJmVjLT5jb21tb24uZGF0YV9hZGRyKTsKLQlzdGF0dXMgPSBhY3BpX2VjX3dhaXQoZWMsIEFDUElfRUNfRVZFTlRfT0JGKTsKLQlpZiAoc3RhdHVzKSB7Ci0JCXByaW50ayhLRVJOX0RFQlVHIFBSRUZJWCAicmVhZCBFQywgT0Igbm90IGZ1bGxcbiIpOwotCQlnb3RvIGVuZDsKLQl9Ci0JYWNwaV9od19sb3dfbGV2ZWxfcmVhZCg4LCBkYXRhLCAmZWMtPmNvbW1vbi5kYXRhX2FkZHIpOwotCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfSU5GTywgIlJlYWQgWyUwMnhdIGZyb20gYWRkcmVzcyBbJTAyeF1cbiIsCi0JCQkgICpkYXRhLCBhZGRyZXNzKSk7CisgICAgICAgIHN0YXR1cyA9IGFjcGlfZWNfdHJhbnNhY3Rpb25fdW5sb2NrZWQoZWMsIGNvbW1hbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2RhdGEsIHdkYXRhX2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZGF0YSwgcmRhdGFfbGVuKTsKIAotICAgICAgZW5kOgotCXVwKCZlYy0+aW50ci5zZW0pOworZW5kOgorCXVwKCZlYy0+c2VtKTsKIAotCWlmIChlYy0+Y29tbW9uLmdsb2JhbF9sb2NrKQorCWlmIChlYy0+Z2xvYmFsX2xvY2spCiAJCWFjcGlfcmVsZWFzZV9nbG9iYWxfbG9jayhnbGspOwogCiAJcmV0dXJuIHN0YXR1czsKIH0KIAotc3RhdGljIGludCBhY3BpX2VjX2ludHJfd3JpdGUodW5pb24gYWNwaV9lYyAqZWMsIHU4IGFkZHJlc3MsIHU4IGRhdGEpCitzdGF0aWMgaW50IGFjcGlfZWNfcmVhZChzdHJ1Y3QgYWNwaV9lYyAqZWMsIHU4IGFkZHJlc3MsIHU4ICpkYXRhKQogewotCWludCBzdGF0dXMgPSAwOwotCXUzMiBnbGs7CisJaW50IHJlc3VsdDsKKwl1OCBkOwogCisJcmVzdWx0ID0gYWNwaV9lY190cmFuc2FjdGlvbihlYywgQUNQSV9FQ19DT01NQU5EX1JFQUQsCisJCQkJICAgICAmYWRkcmVzcywgMSwgJmQsIDEpOworCSpkYXRhID0gZDsKKwlyZXR1cm4gcmVzdWx0OworfQogCi0JaWYgKCFlYykKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQlpZiAoZWMtPmNvbW1vbi5nbG9iYWxfbG9jaykgewotCQlzdGF0dXMgPSBhY3BpX2FjcXVpcmVfZ2xvYmFsX2xvY2soQUNQSV9FQ19VREVMQVlfR0xLLCAmZ2xrKTsKLQkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKQotCQkJcmV0dXJuIC1FTk9ERVY7Ci0JfQotCi0JV0FSTl9PTihpbl9pbnRlcnJ1cHQoKSk7Ci0JZG93bigmZWMtPmludHIuc2VtKTsKLQotCXN0YXR1cyA9IGFjcGlfZWNfd2FpdChlYywgQUNQSV9FQ19FVkVOVF9JQkUpOwotCWlmIChzdGF0dXMpIHsKLQkJcHJpbnRrKEtFUk5fREVCVUcgUFJFRklYICJ3cml0ZSBFQywgSUIgbm90IGVtcHR5XG4iKTsKLQl9Ci0JYWNwaV9od19sb3dfbGV2ZWxfd3JpdGUoOCwgQUNQSV9FQ19DT01NQU5EX1dSSVRFLAotCQkJCSZlYy0+Y29tbW9uLmNvbW1hbmRfYWRkcik7Ci0Jc3RhdHVzID0gYWNwaV9lY193YWl0KGVjLCBBQ1BJX0VDX0VWRU5UX0lCRSk7Ci0JaWYgKHN0YXR1cykgewotCQlwcmludGsoS0VSTl9ERUJVRyBQUkVGSVggIndyaXRlIEVDLCBJQiBub3QgZW1wdHlcbiIpOwotCX0KLQotCWFjcGlfaHdfbG93X2xldmVsX3dyaXRlKDgsIGFkZHJlc3MsICZlYy0+Y29tbW9uLmRhdGFfYWRkcik7Ci0Jc3RhdHVzID0gYWNwaV9lY193YWl0KGVjLCBBQ1BJX0VDX0VWRU5UX0lCRSk7Ci0JaWYgKHN0YXR1cykgewotCQlwcmludGsoS0VSTl9ERUJVRyBQUkVGSVggIndyaXRlIEVDLCBJQiBub3QgZW1wdHlcbiIpOwotCX0KLQotCWFjcGlfaHdfbG93X2xldmVsX3dyaXRlKDgsIGRhdGEsICZlYy0+Y29tbW9uLmRhdGFfYWRkcik7Ci0KLQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0lORk8sICJXcm90ZSBbJTAyeF0gdG8gYWRkcmVzcyBbJTAyeF1cbiIsCi0JCQkgIGRhdGEsIGFkZHJlc3MpKTsKLQotCXVwKCZlYy0+aW50ci5zZW0pOwotCi0JaWYgKGVjLT5jb21tb24uZ2xvYmFsX2xvY2spCi0JCWFjcGlfcmVsZWFzZV9nbG9iYWxfbG9jayhnbGspOwotCi0JcmV0dXJuIHN0YXR1czsKK3N0YXRpYyBpbnQgYWNwaV9lY193cml0ZShzdHJ1Y3QgYWNwaV9lYyAqZWMsIHU4IGFkZHJlc3MsIHU4IGRhdGEpCit7CisgICAgICAgIHU4IHdkYXRhWzJdID0geyBhZGRyZXNzLCBkYXRhIH07CisgICAgICAgIHJldHVybiBhY3BpX2VjX3RyYW5zYWN0aW9uKGVjLCBBQ1BJX0VDX0NPTU1BTkRfV1JJVEUsCisJCQkJICAgd2RhdGEsIDIsIE5VTEwsIDApOwogfQogCiAvKgogICogRXh0ZXJuYWxseSBjYWxsYWJsZSBFQyBhY2Nlc3MgZnVuY3Rpb25zLiBGb3Igbm93LCBhc3N1bWUgMSBFQyBvbmx5CiAgKi8KLWludCBlY19yZWFkKHU4IGFkZHIsIHU4ICogdmFsKQoraW50IGVjX3JlYWQodTggYWRkciwgdTggKnZhbCkKIHsKLQl1bmlvbiBhY3BpX2VjICplYzsKKwlzdHJ1Y3QgYWNwaV9lYyAqZWM7CiAJaW50IGVycjsKLQl1MzIgdGVtcF9kYXRhOworCXU4IHRlbXBfZGF0YTsKIAogCWlmICghZmlyc3RfZWMpCiAJCXJldHVybiAtRU5PREVWOwpAQCAtNTM5LDcgKzM1NCw3IEBACiAKIGludCBlY193cml0ZSh1OCBhZGRyLCB1OCB2YWwpCiB7Ci0JdW5pb24gYWNwaV9lYyAqZWM7CisJc3RydWN0IGFjcGlfZWMgKmVjOwogCWludCBlcnI7CiAKIAlpZiAoIWZpcnN0X2VjKQpAQCAtNTU0LDI1NSArMzY5LDEwNiBAQAogCiBFWFBPUlRfU1lNQk9MKGVjX3dyaXRlKTsKIAotc3RhdGljIGludCBhY3BpX2VjX3F1ZXJ5KHVuaW9uIGFjcGlfZWMgKmVjLCB1MzIgKiBkYXRhKQorZXh0ZXJuIGludCBlY190cmFuc2FjdGlvbih1OCBjb21tYW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1OCAqd2RhdGEsIHVuc2lnbmVkIHdkYXRhX2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdTggKnJkYXRhLCB1bnNpZ25lZCByZGF0YV9sZW4pCiB7Ci0JaWYgKGFjcGlfZWNfcG9sbF9tb2RlKQotCQlyZXR1cm4gYWNwaV9lY19wb2xsX3F1ZXJ5KGVjLCBkYXRhKTsKLQllbHNlCi0JCXJldHVybiBhY3BpX2VjX2ludHJfcXVlcnkoZWMsIGRhdGEpOworCXN0cnVjdCBhY3BpX2VjICplYzsKKworCWlmICghZmlyc3RfZWMpCisJCXJldHVybiAtRU5PREVWOworCisJZWMgPSBhY3BpX2RyaXZlcl9kYXRhKGZpcnN0X2VjKTsKKworCXJldHVybiBhY3BpX2VjX3RyYW5zYWN0aW9uKGVjLCBjb21tYW5kLCB3ZGF0YSwKKwkJCQkgICB3ZGF0YV9sZW4sIHJkYXRhLCByZGF0YV9sZW4pOwogfQotc3RhdGljIGludCBhY3BpX2VjX3BvbGxfcXVlcnkodW5pb24gYWNwaV9lYyAqZWMsIHUzMiAqIGRhdGEpCisKK0VYUE9SVF9TWU1CT0woZWNfdHJhbnNhY3Rpb24pOworCitzdGF0aWMgaW50IGFjcGlfZWNfcXVlcnkoc3RydWN0IGFjcGlfZWMgKmVjLCB1OCAqZGF0YSkKIHsKLQlpbnQgcmVzdWx0ID0gMDsKLQlhY3BpX3N0YXR1cyBzdGF0dXMgPSBBRV9PSzsKLQl1MzIgZ2xrID0gMDsKKwlpbnQgcmVzdWx0OworICAgICAgICB1OCBkOwogCisgICAgICAgIGlmICghZWMgfHwgIWRhdGEpCisgICAgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CiAKLQlpZiAoIWVjIHx8ICFkYXRhKQotCQlyZXR1cm4gLUVJTlZBTDsKKyAgICAgICAgLyoKKyAgICAgICAgICogUXVlcnkgdGhlIEVDIHRvIGZpbmQgb3V0IHdoaWNoIF9ReHggbWV0aG9kIHdlIG5lZWQgdG8gZXZhbHVhdGUuCisgICAgICAgICAqIE5vdGUgdGhhdCBzdWNjZXNzZnVsIGNvbXBsZXRpb24gb2YgdGhlIHF1ZXJ5IGNhdXNlcyB0aGUgQUNQSV9FQ19TQ0kKKyAgICAgICAgICogYml0IHRvIGJlIGNsZWFyZWQgKGFuZCB0aHVzIGNsZWFyaW5nIHRoZSBpbnRlcnJ1cHQgc291cmNlKS4KKyAgICAgICAgICovCiAKLQkqZGF0YSA9IDA7CisgICAgICAgIHJlc3VsdCA9IGFjcGlfZWNfdHJhbnNhY3Rpb24oZWMsIEFDUElfRUNfQ09NTUFORF9RVUVSWSwgTlVMTCwgMCwgJmQsIDEpOworICAgICAgICBpZiAocmVzdWx0KQorICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CiAKLQlpZiAoZWMtPmNvbW1vbi5nbG9iYWxfbG9jaykgewotCQlzdGF0dXMgPSBhY3BpX2FjcXVpcmVfZ2xvYmFsX2xvY2soQUNQSV9FQ19VREVMQVlfR0xLLCAmZ2xrKTsKLQkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKQotCQkJcmV0dXJuIC1FTk9ERVY7Ci0JfQorICAgICAgICBpZiAoIWQpCisgICAgICAgICAgICAgICAgcmV0dXJuIC1FTk9EQVRBOwogCi0JLyoKLQkgKiBRdWVyeSB0aGUgRUMgdG8gZmluZCBvdXQgd2hpY2ggX1F4eCBtZXRob2Qgd2UgbmVlZCB0byBldmFsdWF0ZS4KLQkgKiBOb3RlIHRoYXQgc3VjY2Vzc2Z1bCBjb21wbGV0aW9uIG9mIHRoZSBxdWVyeSBjYXVzZXMgdGhlIEFDUElfRUNfU0NJCi0JICogYml0IHRvIGJlIGNsZWFyZWQgKGFuZCB0aHVzIGNsZWFyaW5nIHRoZSBpbnRlcnJ1cHQgc291cmNlKS4KLQkgKi8KLQlpZiAoZG93bl9pbnRlcnJ1cHRpYmxlKCZlYy0+cG9sbC5zZW0pKSB7Ci0JCXJlc3VsdCA9IC1FUkVTVEFSVFNZUzsKLQkJZ290byBlbmRfbm9zZW07Ci0JfQotCQotCWFjcGlfaHdfbG93X2xldmVsX3dyaXRlKDgsIEFDUElfRUNfQ09NTUFORF9RVUVSWSwKLQkJCQkmZWMtPmNvbW1vbi5jb21tYW5kX2FkZHIpOwotCXJlc3VsdCA9IGFjcGlfZWNfd2FpdChlYywgQUNQSV9FQ19FVkVOVF9PQkYpOwotCWlmIChyZXN1bHQpCi0JCWdvdG8gZW5kOwotCi0JYWNwaV9od19sb3dfbGV2ZWxfcmVhZCg4LCBkYXRhLCAmZWMtPmNvbW1vbi5kYXRhX2FkZHIpOwotCWlmICghKmRhdGEpCi0JCXJlc3VsdCA9IC1FTk9EQVRBOwotCi0gICAgICBlbmQ6Ci0JdXAoJmVjLT5wb2xsLnNlbSk7Ci1lbmRfbm9zZW06Ci0JaWYgKGVjLT5jb21tb24uZ2xvYmFsX2xvY2spCi0JCWFjcGlfcmVsZWFzZV9nbG9iYWxfbG9jayhnbGspOwotCi0JcmV0dXJuIHJlc3VsdDsKLX0KLXN0YXRpYyBpbnQgYWNwaV9lY19pbnRyX3F1ZXJ5KHVuaW9uIGFjcGlfZWMgKmVjLCB1MzIgKiBkYXRhKQotewotCWludCBzdGF0dXMgPSAwOwotCXUzMiBnbGs7Ci0KLQotCWlmICghZWMgfHwgIWRhdGEpCi0JCXJldHVybiAtRUlOVkFMOwotCSpkYXRhID0gMDsKLQotCWlmIChlYy0+Y29tbW9uLmdsb2JhbF9sb2NrKSB7Ci0JCXN0YXR1cyA9IGFjcGlfYWNxdWlyZV9nbG9iYWxfbG9jayhBQ1BJX0VDX1VERUxBWV9HTEssICZnbGspOwotCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpCi0JCQlyZXR1cm4gLUVOT0RFVjsKLQl9Ci0KLQlkb3duKCZlYy0+aW50ci5zZW0pOwotCi0Jc3RhdHVzID0gYWNwaV9lY193YWl0KGVjLCBBQ1BJX0VDX0VWRU5UX0lCRSk7Ci0JaWYgKHN0YXR1cykgewotCQlwcmludGsoS0VSTl9ERUJVRyBQUkVGSVggInF1ZXJ5IEVDLCBJQiBub3QgZW1wdHlcbiIpOwotCQlnb3RvIGVuZDsKLQl9Ci0JLyoKLQkgKiBRdWVyeSB0aGUgRUMgdG8gZmluZCBvdXQgd2hpY2ggX1F4eCBtZXRob2Qgd2UgbmVlZCB0byBldmFsdWF0ZS4KLQkgKiBOb3RlIHRoYXQgc3VjY2Vzc2Z1bCBjb21wbGV0aW9uIG9mIHRoZSBxdWVyeSBjYXVzZXMgdGhlIEFDUElfRUNfU0NJCi0JICogYml0IHRvIGJlIGNsZWFyZWQgKGFuZCB0aHVzIGNsZWFyaW5nIHRoZSBpbnRlcnJ1cHQgc291cmNlKS4KLQkgKi8KLQlhY3BpX2h3X2xvd19sZXZlbF93cml0ZSg4LCBBQ1BJX0VDX0NPTU1BTkRfUVVFUlksCi0JCQkJJmVjLT5jb21tb24uY29tbWFuZF9hZGRyKTsKLQlzdGF0dXMgPSBhY3BpX2VjX3dhaXQoZWMsIEFDUElfRUNfRVZFTlRfT0JGKTsKLQlpZiAoc3RhdHVzKSB7Ci0JCXByaW50ayhLRVJOX0RFQlVHIFBSRUZJWCAicXVlcnkgRUMsIE9CIG5vdCBmdWxsXG4iKTsKLQkJZ290byBlbmQ7Ci0JfQotCi0JYWNwaV9od19sb3dfbGV2ZWxfcmVhZCg4LCBkYXRhLCAmZWMtPmNvbW1vbi5kYXRhX2FkZHIpOwotCWlmICghKmRhdGEpCi0JCXN0YXR1cyA9IC1FTk9EQVRBOwotCi0gICAgICBlbmQ6Ci0JdXAoJmVjLT5pbnRyLnNlbSk7Ci0KLQlpZiAoZWMtPmNvbW1vbi5nbG9iYWxfbG9jaykKLQkJYWNwaV9yZWxlYXNlX2dsb2JhbF9sb2NrKGdsayk7Ci0KLQlyZXR1cm4gc3RhdHVzOworICAgICAgICAqZGF0YSA9IGQ7CisgICAgICAgIHJldHVybiAwOwogfQogCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFdmVudCBNYW5hZ2VtZW50CiAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCi11bmlvbiBhY3BpX2VjX3F1ZXJ5X2RhdGEgeworc3RydWN0IGFjcGlfZWNfcXVlcnlfZGF0YSB7CiAJYWNwaV9oYW5kbGUgaGFuZGxlOwogCXU4IGRhdGE7CiB9OwogCiBzdGF0aWMgdm9pZCBhY3BpX2VjX2dwZV9xdWVyeSh2b2lkICplY19jeHQpCiB7Ci0JaWYgKGFjcGlfZWNfcG9sbF9tb2RlKQotCQlhY3BpX2VjX2dwZV9wb2xsX3F1ZXJ5KGVjX2N4dCk7Ci0JZWxzZQotCQlhY3BpX2VjX2dwZV9pbnRyX3F1ZXJ5KGVjX2N4dCk7Ci19CisJc3RydWN0IGFjcGlfZWMgKmVjID0gKHN0cnVjdCBhY3BpX2VjICopZWNfY3h0OworCXU4IHZhbHVlID0gMDsKKwlzdGF0aWMgY2hhciBvYmplY3RfbmFtZVs4XTsKIAotc3RhdGljIHZvaWQgYWNwaV9lY19ncGVfcG9sbF9xdWVyeSh2b2lkICplY19jeHQpCi17Ci0JdW5pb24gYWNwaV9lYyAqZWMgPSAodW5pb24gYWNwaV9lYyAqKWVjX2N4dDsKLQl1MzIgdmFsdWUgPSAwOwotCXN0YXRpYyBjaGFyIG9iamVjdF9uYW1lWzVdID0geyAnXycsICdRJywgJzAnLCAnMCcsICdcMCcgfTsKLQljb25zdCBjaGFyIGhleFtdID0geyAnMCcsICcxJywgJzInLCAnMycsICc0JywgJzUnLCAnNicsICc3JywKLQkJJzgnLCAnOScsICdBJywgJ0InLCAnQycsICdEJywgJ0UnLCAnRicKLQl9OwotCi0KLQlpZiAoIWVjX2N4dCkKKwlpZiAoIWVjKQogCQlnb3RvIGVuZDsKIAotCWlmIChkb3duX2ludGVycnVwdGlibGUgKCZlYy0+cG9sbC5zZW0pKSB7Ci0JCXJldHVybjsKLQl9Ci0JYWNwaV9od19sb3dfbGV2ZWxfcmVhZCg4LCAmdmFsdWUsICZlYy0+Y29tbW9uLmNvbW1hbmRfYWRkcik7Ci0JdXAoJmVjLT5wb2xsLnNlbSk7CisJdmFsdWUgPSBhY3BpX2VjX3JlYWRfc3RhdHVzKGVjKTsKIAotCS8qIFRCRDogSW1wbGVtZW50IGFzeW5jaCBldmVudHMhCi0JICogTk9URTogQWxsIHdlIGNhcmUgYWJvdXQgYXJlIEVDLVNDSSdzLiAgT3RoZXIgRUMgZXZlbnRzIGFyZQotCSAqIGhhbmRsZWQgdmlhIHBvbGxpbmcgKHl1Y2shKS4gIFRoaXMgaXMgYmVjYXVzZSBzb21lIHN5c3RlbXMKLQkgKiB0cmVhdCBFQy1TQ0lzIGFzIGxldmVsICh2ZXJzdXMgRURHRSEpIHRyaWdnZXJlZCwgcHJldmVudGluZwotCSAqICBhIHB1cmVseSBpbnRlcnJ1cHQtZHJpdmVuIGFwcHJvYWNoIChncnVtYmxlLCBncnVtYmxlKS4KLQkgKi8KIAlpZiAoISh2YWx1ZSAmIEFDUElfRUNfRkxBR19TQ0kpKQogCQlnb3RvIGVuZDsKIAogCWlmIChhY3BpX2VjX3F1ZXJ5KGVjLCAmdmFsdWUpKQogCQlnb3RvIGVuZDsKIAotCW9iamVjdF9uYW1lWzJdID0gaGV4WygodmFsdWUgPj4gNCkgJiAweDBGKV07Ci0Jb2JqZWN0X25hbWVbM10gPSBoZXhbKHZhbHVlICYgMHgwRildOworCXNucHJpbnRmKG9iamVjdF9uYW1lLCA4LCAiX1ElMi4yWCIsIHZhbHVlKTsKIAotCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfSU5GTywgIkV2YWx1YXRpbmcgJXNcbiIsIG9iamVjdF9uYW1lKSk7CisJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9JTkZPLCAiRXZhbHVhdGluZyAlcyIsIG9iamVjdF9uYW1lKSk7CiAKLQlhY3BpX2V2YWx1YXRlX29iamVjdChlYy0+Y29tbW9uLmhhbmRsZSwgb2JqZWN0X25hbWUsIE5VTEwsIE5VTEwpOworCWFjcGlfZXZhbHVhdGVfb2JqZWN0KGVjLT5oYW5kbGUsIG9iamVjdF9uYW1lLCBOVUxMLCBOVUxMKTsKIAogICAgICAgZW5kOgotCWFjcGlfZW5hYmxlX2dwZShOVUxMLCBlYy0+Y29tbW9uLmdwZV9iaXQsIEFDUElfTk9UX0lTUik7Ci19Ci1zdGF0aWMgdm9pZCBhY3BpX2VjX2dwZV9pbnRyX3F1ZXJ5KHZvaWQgKmVjX2N4dCkKLXsKLQl1bmlvbiBhY3BpX2VjICplYyA9ICh1bmlvbiBhY3BpX2VjICopZWNfY3h0OwotCXUzMiB2YWx1ZTsKLQlpbnQgcmVzdWx0ID0gLUVOT0RBVEE7Ci0Jc3RhdGljIGNoYXIgb2JqZWN0X25hbWVbNV0gPSB7ICdfJywgJ1EnLCAnMCcsICcwJywgJ1wwJyB9OwotCWNvbnN0IGNoYXIgaGV4W10gPSB7ICcwJywgJzEnLCAnMicsICczJywgJzQnLCAnNScsICc2JywgJzcnLAotCQknOCcsICc5JywgJ0EnLCAnQicsICdDJywgJ0QnLCAnRScsICdGJwotCX07Ci0KLQotCWlmIChhY3BpX2VjX3JlYWRfc3RhdHVzKGVjKSAmIEFDUElfRUNfRkxBR19TQ0kpCi0JCXJlc3VsdCA9IGFjcGlfZWNfcXVlcnkoZWMsICZ2YWx1ZSk7Ci0KLQlpZiAocmVzdWx0KQotCQlnb3RvIGVuZDsKLQotCW9iamVjdF9uYW1lWzJdID0gaGV4WygodmFsdWUgPj4gNCkgJiAweDBGKV07Ci0Jb2JqZWN0X25hbWVbM10gPSBoZXhbKHZhbHVlICYgMHgwRildOwotCi0JQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9JTkZPLCAiRXZhbHVhdGluZyAlc1xuIiwgb2JqZWN0X25hbWUpKTsKLQotCWFjcGlfZXZhbHVhdGVfb2JqZWN0KGVjLT5jb21tb24uaGFuZGxlLCBvYmplY3RfbmFtZSwgTlVMTCwgTlVMTCk7Ci0gICAgICBlbmQ6Ci0JYXRvbWljX2RlYygmZWMtPmludHIucGVuZGluZ19ncGUpOwotCXJldHVybjsKKwlhY3BpX2VuYWJsZV9ncGUoTlVMTCwgZWMtPmdwZV9iaXQsIEFDUElfTk9UX0lTUik7CiB9CiAKIHN0YXRpYyB1MzIgYWNwaV9lY19ncGVfaGFuZGxlcih2b2lkICpkYXRhKQogewotCWlmIChhY3BpX2VjX3BvbGxfbW9kZSkKLQkJcmV0dXJuIGFjcGlfZWNfZ3BlX3BvbGxfaGFuZGxlcihkYXRhKTsKLQllbHNlCi0JCXJldHVybiBhY3BpX2VjX2dwZV9pbnRyX2hhbmRsZXIoZGF0YSk7Ci19Ci1zdGF0aWMgdTMyIGFjcGlfZWNfZ3BlX3BvbGxfaGFuZGxlcih2b2lkICpkYXRhKQotewogCWFjcGlfc3RhdHVzIHN0YXR1cyA9IEFFX09LOwotCXVuaW9uIGFjcGlfZWMgKmVjID0gKHVuaW9uIGFjcGlfZWMgKilkYXRhOworCXU4IHZhbHVlOworCXN0cnVjdCBhY3BpX2VjICplYyA9IChzdHJ1Y3QgYWNwaV9lYyAqKWRhdGE7CiAKLQlpZiAoIWVjKQotCQlyZXR1cm4gQUNQSV9JTlRFUlJVUFRfTk9UX0hBTkRMRUQ7Ci0KLQlhY3BpX2Rpc2FibGVfZ3BlKE5VTEwsIGVjLT5jb21tb24uZ3BlX2JpdCwgQUNQSV9JU1IpOwotCi0Jc3RhdHVzID0gYWNwaV9vc19leGVjdXRlKE9TTF9FQ19QT0xMX0hBTkRMRVIsIGFjcGlfZWNfZ3BlX3F1ZXJ5LCBlYyk7Ci0KLQlpZiAoc3RhdHVzID09IEFFX09LKQotCQlyZXR1cm4gQUNQSV9JTlRFUlJVUFRfSEFORExFRDsKLQllbHNlCi0JCXJldHVybiBBQ1BJX0lOVEVSUlVQVF9OT1RfSEFORExFRDsKLX0KLXN0YXRpYyB1MzIgYWNwaV9lY19ncGVfaW50cl9oYW5kbGVyKHZvaWQgKmRhdGEpCi17Ci0JYWNwaV9zdGF0dXMgc3RhdHVzID0gQUVfT0s7Ci0JdTMyIHZhbHVlOwotCXVuaW9uIGFjcGlfZWMgKmVjID0gKHVuaW9uIGFjcGlfZWMgKilkYXRhOwotCi0JaWYgKCFlYykKLQkJcmV0dXJuIEFDUElfSU5URVJSVVBUX05PVF9IQU5ETEVEOwotCi0JYWNwaV9jbGVhcl9ncGUoTlVMTCwgZWMtPmNvbW1vbi5ncGVfYml0LCBBQ1BJX0lTUik7CisJYWNwaV9jbGVhcl9ncGUoTlVMTCwgZWMtPmdwZV9iaXQsIEFDUElfSVNSKTsKIAl2YWx1ZSA9IGFjcGlfZWNfcmVhZF9zdGF0dXMoZWMpOwogCi0Jc3dpdGNoIChlYy0+aW50ci5leHBlY3RfZXZlbnQpIHsKLQljYXNlIEFDUElfRUNfRVZFTlRfT0JGOgotCQlpZiAoISh2YWx1ZSAmIEFDUElfRUNfRkxBR19PQkYpKQotCQkJYnJlYWs7Ci0JCWVjLT5pbnRyLmV4cGVjdF9ldmVudCA9IDA7Ci0JCXdha2VfdXAoJmVjLT5pbnRyLndhaXQpOwotCQlicmVhazsKLQljYXNlIEFDUElfRUNfRVZFTlRfSUJFOgotCQlpZiAoKHZhbHVlICYgQUNQSV9FQ19GTEFHX0lCRikpCi0JCQlicmVhazsKLQkJZWMtPmludHIuZXhwZWN0X2V2ZW50ID0gMDsKLQkJd2FrZV91cCgmZWMtPmludHIud2FpdCk7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCWJyZWFrOworCWlmIChhY3BpX2VjX21vZGUgPT0gRUNfSU5UUikgeworCQlpZiAoYWNwaV9lY19jaGVja19zdGF0dXModmFsdWUsIGVjLT5leHBlY3RfZXZlbnQpKSB7CisJCQllYy0+ZXhwZWN0X2V2ZW50ID0gMDsKKwkJCXdha2VfdXAoJmVjLT53YWl0KTsKKwkJfQogCX0KIAogCWlmICh2YWx1ZSAmIEFDUElfRUNfRkxBR19TQ0kpIHsKLQkJYXRvbWljX2FkZCgxLCAmZWMtPmludHIucGVuZGluZ19ncGUpOwotCQlzdGF0dXMgPSBhY3BpX29zX2V4ZWN1dGUoT1NMX0VDX0JVUlNUX0hBTkRMRVIsCi0JCQkJCQkgICAgIGFjcGlfZWNfZ3BlX3F1ZXJ5LCBlYyk7CisJCXN0YXR1cyA9IGFjcGlfb3NfZXhlY3V0ZShPU0xfRUNfQlVSU1RfSEFORExFUiwgYWNwaV9lY19ncGVfcXVlcnksIGVjKTsKIAkJcmV0dXJuIHN0YXR1cyA9PSBBRV9PSyA/CiAJCSAgICBBQ1BJX0lOVEVSUlVQVF9IQU5ETEVEIDogQUNQSV9JTlRFUlJVUFRfTk9UX0hBTkRMRUQ7CiAJfQotCWFjcGlfZW5hYmxlX2dwZShOVUxMLCBlYy0+Y29tbW9uLmdwZV9iaXQsIEFDUElfSVNSKTsKKwlhY3BpX2VuYWJsZV9ncGUoTlVMTCwgZWMtPmdwZV9iaXQsIEFDUElfSVNSKTsKIAlyZXR1cm4gc3RhdHVzID09IEFFX09LID8KIAkgICAgQUNQSV9JTlRFUlJVUFRfSEFORExFRCA6IEFDUElfSU5URVJSVVBUX05PVF9IQU5ETEVEOwogfQpAQCAtODMzLDcgKzQ5OSw3IEBACiAJCSAgICAgIHZvaWQgKmhhbmRsZXJfY29udGV4dCwgdm9pZCAqcmVnaW9uX2NvbnRleHQpCiB7CiAJaW50IHJlc3VsdCA9IDA7Ci0JdW5pb24gYWNwaV9lYyAqZWMgPSBOVUxMOworCXN0cnVjdCBhY3BpX2VjICplYyA9IE5VTEw7CiAJdTY0IHRlbXAgPSAqdmFsdWU7CiAJYWNwaV9pbnRlZ2VyIGZfdiA9IDA7CiAJaW50IGkgPSAwOwpAQCAtODQzLDE4ICs1MDksMTYgQEAKIAkJcmV0dXJuIEFFX0JBRF9QQVJBTUVURVI7CiAKIAlpZiAoYml0X3dpZHRoICE9IDggJiYgYWNwaV9zdHJpY3QpIHsKLQkJcHJpbnRrKEtFUk5fV0FSTklORyBQUkVGSVgKLQkJICAgICAgICJhY3BpX2VjX3NwYWNlX2hhbmRsZXI6IGJpdF93aWR0aCBzaG91bGQgYmUgOFxuIik7CiAJCXJldHVybiBBRV9CQURfUEFSQU1FVEVSOwogCX0KIAotCWVjID0gKHVuaW9uIGFjcGlfZWMgKiloYW5kbGVyX2NvbnRleHQ7CisJZWMgPSAoc3RydWN0IGFjcGlfZWMgKiloYW5kbGVyX2NvbnRleHQ7CiAKICAgICAgIG5leHRfYnl0ZToKIAlzd2l0Y2ggKGZ1bmN0aW9uKSB7CiAJY2FzZSBBQ1BJX1JFQUQ6CiAJCXRlbXAgPSAwOwotCQlyZXN1bHQgPSBhY3BpX2VjX3JlYWQoZWMsICh1OCkgYWRkcmVzcywgKHUzMiAqKSAmIHRlbXApOworCQlyZXN1bHQgPSBhY3BpX2VjX3JlYWQoZWMsICh1OCkgYWRkcmVzcywgKHU4ICopICZ0ZW1wKTsKIAkJYnJlYWs7CiAJY2FzZSBBQ1BJX1dSSVRFOgogCQlyZXN1bHQgPSBhY3BpX2VjX3dyaXRlKGVjLCAodTgpIGFkZHJlc3MsICh1OCkgdGVtcCk7CkBAIC05MDUsMjAgKzU2OSwyMCBAQAogCiBzdGF0aWMgaW50IGFjcGlfZWNfcmVhZF9pbmZvKHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICpvZmZzZXQpCiB7Ci0JdW5pb24gYWNwaV9lYyAqZWMgPSAodW5pb24gYWNwaV9lYyAqKXNlcS0+cHJpdmF0ZTsKKwlzdHJ1Y3QgYWNwaV9lYyAqZWMgPSAoc3RydWN0IGFjcGlfZWMgKilzZXEtPnByaXZhdGU7CiAKIAogCWlmICghZWMpCiAJCWdvdG8gZW5kOwogCiAJc2VxX3ByaW50ZihzZXEsICJncGUgYml0OiAgICAgICAgICAgICAgICAgMHglMDJ4XG4iLAotCQkgICAodTMyKSBlYy0+Y29tbW9uLmdwZV9iaXQpOworCQkgICAodTMyKSBlYy0+Z3BlX2JpdCk7CiAJc2VxX3ByaW50ZihzZXEsICJwb3J0czogICAgICAgICAgICAgICAgICAgMHglMDJ4LCAweCUwMnhcbiIsCi0JCSAgICh1MzIpIGVjLT5jb21tb24uc3RhdHVzX2FkZHIuYWRkcmVzcywKLQkJICAgKHUzMikgZWMtPmNvbW1vbi5kYXRhX2FkZHIuYWRkcmVzcyk7CisJCSAgICh1MzIpIGVjLT5jb21tYW5kX2FkZHIsCisJCSAgICh1MzIpIGVjLT5kYXRhX2FkZHIpOwogCXNlcV9wcmludGYoc2VxLCAidXNlIGdsb2JhbCBsb2NrOiAgICAgICAgICVzXG4iLAotCQkgICBlYy0+Y29tbW9uLmdsb2JhbF9sb2NrID8gInllcyIgOiAibm8iKTsKLQlhY3BpX2VuYWJsZV9ncGUoTlVMTCwgZWMtPmNvbW1vbi5ncGVfYml0LCBBQ1BJX05PVF9JU1IpOworCQkgICBlYy0+Z2xvYmFsX2xvY2sgPyAieWVzIiA6ICJubyIpOworCWFjcGlfZW5hYmxlX2dwZShOVUxMLCBlYy0+Z3BlX2JpdCwgQUNQSV9OT1RfSVNSKTsKIAogICAgICAgZW5kOgogCXJldHVybiAwOwpAQCAtOTI5LDcgKzU5Myw3IEBACiAJcmV0dXJuIHNpbmdsZV9vcGVuKGZpbGUsIGFjcGlfZWNfcmVhZF9pbmZvLCBQREUoaW5vZGUpLT5kYXRhKTsKIH0KIAotc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgYWNwaV9lY19pbmZvX29wcyA9IHsKK3N0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGFjcGlfZWNfaW5mb19vcHMgPSB7CiAJLm9wZW4gPSBhY3BpX2VjX2luZm9fb3Blbl9mcywKIAkucmVhZCA9IHNlcV9yZWFkLAogCS5sbHNlZWsgPSBzZXFfbHNlZWssCkBAIC05NzgsMzEgKzY0MiwzNSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERyaXZlciBJbnRlcmZhY2UKICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKLXN0YXRpYyBpbnQgYWNwaV9lY19wb2xsX2FkZChzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldmljZSkKK3N0YXRpYyBpbnQgYWNwaV9lY19hZGQoc3RydWN0IGFjcGlfZGV2aWNlICpkZXZpY2UpCiB7CiAJaW50IHJlc3VsdCA9IDA7CiAJYWNwaV9zdGF0dXMgc3RhdHVzID0gQUVfT0s7Ci0JdW5pb24gYWNwaV9lYyAqZWMgPSBOVUxMOworCXN0cnVjdCBhY3BpX2VjICplYyA9IE5VTEw7CiAKIAogCWlmICghZGV2aWNlKQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCWVjID0ga21hbGxvYyhzaXplb2YodW5pb24gYWNwaV9lYyksIEdGUF9LRVJORUwpOworCWVjID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGFjcGlfZWMpLCBHRlBfS0VSTkVMKTsKIAlpZiAoIWVjKQogCQlyZXR1cm4gLUVOT01FTTsKLQltZW1zZXQoZWMsIDAsIHNpemVvZih1bmlvbiBhY3BpX2VjKSk7CisJbWVtc2V0KGVjLCAwLCBzaXplb2Yoc3RydWN0IGFjcGlfZWMpKTsKIAotCWVjLT5jb21tb24uaGFuZGxlID0gZGV2aWNlLT5oYW5kbGU7Ci0JZWMtPmNvbW1vbi51aWQgPSAtMTsKLQlpbml0X01VVEVYKCZlYy0+cG9sbC5zZW0pOworCWVjLT5oYW5kbGUgPSBkZXZpY2UtPmhhbmRsZTsKKwllYy0+dWlkID0gLTE7CisJaW5pdF9NVVRFWCgmZWMtPnNlbSk7CisJaWYgKGFjcGlfZWNfbW9kZSA9PSBFQ19JTlRSKSB7CisJCWF0b21pY19zZXQoJmVjLT5sZWF2aW5nX2J1cnN0LCAxKTsKKwkJaW5pdF93YWl0cXVldWVfaGVhZCgmZWMtPndhaXQpOworCX0KIAlzdHJjcHkoYWNwaV9kZXZpY2VfbmFtZShkZXZpY2UpLCBBQ1BJX0VDX0RFVklDRV9OQU1FKTsKIAlzdHJjcHkoYWNwaV9kZXZpY2VfY2xhc3MoZGV2aWNlKSwgQUNQSV9FQ19DTEFTUyk7CiAJYWNwaV9kcml2ZXJfZGF0YShkZXZpY2UpID0gZWM7CiAKIAkvKiBVc2UgdGhlIGdsb2JhbCBsb2NrIGZvciBhbGwgRUMgdHJhbnNhY3Rpb25zPyAqLwotCWFjcGlfZXZhbHVhdGVfaW50ZWdlcihlYy0+Y29tbW9uLmhhbmRsZSwgIl9HTEsiLCBOVUxMLAotCQkJICAgICAgJmVjLT5jb21tb24uZ2xvYmFsX2xvY2spOworCWFjcGlfZXZhbHVhdGVfaW50ZWdlcihlYy0+aGFuZGxlLCAiX0dMSyIsIE5VTEwsCisJCQkgICAgICAmZWMtPmdsb2JhbF9sb2NrKTsKIAogCS8qIFhYWCB3ZSBkb24ndCB0ZXN0IHVpZHMsIGJlY2F1c2Ugb24gc29tZSBib3hlcyBlY2R0IHVpZCA9IDAsIHNlZToKIAkgICBodHRwOi8vYnVnemlsbGEua2VybmVsLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NjExMSAqLwpAQCAtMTAxMSw3ICs2NzksNyBAQAogCQkJCQkJICBBQ1BJX0FEUl9TUEFDRV9FQywKIAkJCQkJCSAgJmFjcGlfZWNfc3BhY2VfaGFuZGxlcik7CiAKLQkJYWNwaV9yZW1vdmVfZ3BlX2hhbmRsZXIoTlVMTCwgZWNfZWNkdC0+Y29tbW9uLmdwZV9iaXQsCisJCWFjcGlfcmVtb3ZlX2dwZV9oYW5kbGVyKE5VTEwsIGVjX2VjZHQtPmdwZV9iaXQsCiAJCQkJCSZhY3BpX2VjX2dwZV9oYW5kbGVyKTsKIAogCQlrZnJlZShlY19lY2R0KTsKQEAgLTEwMjAsMTAgKzY4OCwxMCBAQAogCS8qIEdldCBHUEUgYml0IGFzc2lnbm1lbnQgKEVDIGV2ZW50cykuICovCiAJLyogVE9ETzogQWRkIHN1cHBvcnQgZm9yIF9HUEUgcmV0dXJuaW5nIGEgcGFja2FnZSAqLwogCXN0YXR1cyA9Ci0JICAgIGFjcGlfZXZhbHVhdGVfaW50ZWdlcihlYy0+Y29tbW9uLmhhbmRsZSwgIl9HUEUiLCBOVUxMLAotCQkJCSAgJmVjLT5jb21tb24uZ3BlX2JpdCk7CisJICAgIGFjcGlfZXZhbHVhdGVfaW50ZWdlcihlYy0+aGFuZGxlLCAiX0dQRSIsIE5VTEwsCisJCQkJICAmZWMtPmdwZV9iaXQpOwogCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewotCQlBQ1BJX0VYQ0VQVElPTigoQUVfSU5GTywgc3RhdHVzLCAiT2J0YWluaW5nIEdQRSBiaXQiKSk7CisJCUFDUElfRVhDRVBUSU9OKChBRV9JTkZPLCBzdGF0dXMsICJPYnRhaW5pbmcgR1BFIGJpdCBhc3NpZ25tZW50IikpOwogCQlyZXN1bHQgPSAtRU5PREVWOwogCQlnb3RvIGVuZDsKIAl9CkBAIC0xMDMyLDg0ICs3MDAsMTQgQEAKIAlpZiAocmVzdWx0KQogCQlnb3RvIGVuZDsKIAotCXByaW50ayhLRVJOX0lORk8gUFJFRklYICIlcyBbJXNdIChncGUgJWQpIHBvbGxpbmcgbW9kZS5cbiIsCisJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9JTkZPLCAiJXMgWyVzXSAoZ3BlICVkKSBpbnRlcnJ1cHQgbW9kZS4iLAogCSAgICAgICBhY3BpX2RldmljZV9uYW1lKGRldmljZSksIGFjcGlfZGV2aWNlX2JpZChkZXZpY2UpLAotCSAgICAgICAodTMyKSBlYy0+Y29tbW9uLmdwZV9iaXQpOworCSAgICAgICAodTMyKSBlYy0+Z3BlX2JpdCkpOwogCiAJaWYgKCFmaXJzdF9lYykKIAkJZmlyc3RfZWMgPSBkZXZpY2U7CiAKLSAgICAgIGVuZDoKLQlpZiAocmVzdWx0KQotCQlrZnJlZShlYyk7Ci0KLQlyZXR1cm4gcmVzdWx0OwotfQotc3RhdGljIGludCBhY3BpX2VjX2ludHJfYWRkKHN0cnVjdCBhY3BpX2RldmljZSAqZGV2aWNlKQotewotCWludCByZXN1bHQgPSAwOwotCWFjcGlfc3RhdHVzIHN0YXR1cyA9IEFFX09LOwotCXVuaW9uIGFjcGlfZWMgKmVjID0gTlVMTDsKLQotCi0JaWYgKCFkZXZpY2UpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JZWMgPSBrbWFsbG9jKHNpemVvZih1bmlvbiBhY3BpX2VjKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFlYykKLQkJcmV0dXJuIC1FTk9NRU07Ci0JbWVtc2V0KGVjLCAwLCBzaXplb2YodW5pb24gYWNwaV9lYykpOwotCi0JZWMtPmNvbW1vbi5oYW5kbGUgPSBkZXZpY2UtPmhhbmRsZTsKLQllYy0+Y29tbW9uLnVpZCA9IC0xOwotCWF0b21pY19zZXQoJmVjLT5pbnRyLnBlbmRpbmdfZ3BlLCAwKTsKLQlhdG9taWNfc2V0KCZlYy0+aW50ci5sZWF2aW5nX2J1cnN0LCAxKTsKLQlpbml0X01VVEVYKCZlYy0+aW50ci5zZW0pOwotCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmVjLT5pbnRyLndhaXQpOwotCXN0cmNweShhY3BpX2RldmljZV9uYW1lKGRldmljZSksIEFDUElfRUNfREVWSUNFX05BTUUpOwotCXN0cmNweShhY3BpX2RldmljZV9jbGFzcyhkZXZpY2UpLCBBQ1BJX0VDX0NMQVNTKTsKLQlhY3BpX2RyaXZlcl9kYXRhKGRldmljZSkgPSBlYzsKLQotCS8qIFVzZSB0aGUgZ2xvYmFsIGxvY2sgZm9yIGFsbCBFQyB0cmFuc2FjdGlvbnM/ICovCi0JYWNwaV9ldmFsdWF0ZV9pbnRlZ2VyKGVjLT5jb21tb24uaGFuZGxlLCAiX0dMSyIsIE5VTEwsCi0JCQkgICAgICAmZWMtPmNvbW1vbi5nbG9iYWxfbG9jayk7Ci0KLQkvKiBYWFggd2UgZG9uJ3QgdGVzdCB1aWRzLCBiZWNhdXNlIG9uIHNvbWUgYm94ZXMgZWNkdCB1aWQgPSAwLCBzZWU6Ci0JICAgaHR0cDovL2J1Z3ppbGxhLmtlcm5lbC5vcmcvc2hvd19idWcuY2dpP2lkPTYxMTEgKi8KLQlpZiAoZWNfZWNkdCkgewotCQlhY3BpX3JlbW92ZV9hZGRyZXNzX3NwYWNlX2hhbmRsZXIoQUNQSV9ST09UX09CSkVDVCwKLQkJCQkJCSAgQUNQSV9BRFJfU1BBQ0VfRUMsCi0JCQkJCQkgICZhY3BpX2VjX3NwYWNlX2hhbmRsZXIpOwotCi0JCWFjcGlfcmVtb3ZlX2dwZV9oYW5kbGVyKE5VTEwsIGVjX2VjZHQtPmNvbW1vbi5ncGVfYml0LAotCQkJCQkmYWNwaV9lY19ncGVfaGFuZGxlcik7Ci0KLQkJa2ZyZWUoZWNfZWNkdCk7Ci0JfQotCi0JLyogR2V0IEdQRSBiaXQgYXNzaWdubWVudCAoRUMgZXZlbnRzKS4gKi8KLQkvKiBUT0RPOiBBZGQgc3VwcG9ydCBmb3IgX0dQRSByZXR1cm5pbmcgYSBwYWNrYWdlICovCi0Jc3RhdHVzID0KLQkgICAgYWNwaV9ldmFsdWF0ZV9pbnRlZ2VyKGVjLT5jb21tb24uaGFuZGxlLCAiX0dQRSIsIE5VTEwsCi0JCQkJICAmZWMtPmNvbW1vbi5ncGVfYml0KTsKLQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKLQkJcHJpbnRrKEtFUk5fRVJSIFBSRUZJWCAiT2J0YWluaW5nIEdQRSBiaXQgYXNzaWdubWVudFxuIik7Ci0JCXJlc3VsdCA9IC1FTk9ERVY7Ci0JCWdvdG8gZW5kOwotCX0KLQotCXJlc3VsdCA9IGFjcGlfZWNfYWRkX2ZzKGRldmljZSk7Ci0JaWYgKHJlc3VsdCkKLQkJZ290byBlbmQ7Ci0KLQlwcmludGsoS0VSTl9JTkZPIFBSRUZJWCAiJXMgWyVzXSAoZ3BlICVkKSBpbnRlcnJ1cHQgbW9kZS5cbiIsCi0JICAgICAgIGFjcGlfZGV2aWNlX25hbWUoZGV2aWNlKSwgYWNwaV9kZXZpY2VfYmlkKGRldmljZSksCi0JICAgICAgICh1MzIpIGVjLT5jb21tb24uZ3BlX2JpdCk7Ci0KLQlpZiAoIWZpcnN0X2VjKQotCQlmaXJzdF9lYyA9IGRldmljZTsKLQotICAgICAgZW5kOgorICBlbmQ6CiAJaWYgKHJlc3VsdCkKIAkJa2ZyZWUoZWMpOwogCkBAIC0xMTE4LDcgKzcxNiw3IEBACiAKIHN0YXRpYyBpbnQgYWNwaV9lY19yZW1vdmUoc3RydWN0IGFjcGlfZGV2aWNlICpkZXZpY2UsIGludCB0eXBlKQogewotCXVuaW9uIGFjcGlfZWMgKmVjID0gTlVMTDsKKwlzdHJ1Y3QgYWNwaV9lYyAqZWMgPSBOVUxMOwogCiAKIAlpZiAoIWRldmljZSkKQEAgLTExMzYsOCArNzM0LDcgQEAKIHN0YXRpYyBhY3BpX3N0YXR1cwogYWNwaV9lY19pb19wb3J0cyhzdHJ1Y3QgYWNwaV9yZXNvdXJjZSAqcmVzb3VyY2UsIHZvaWQgKmNvbnRleHQpCiB7Ci0JdW5pb24gYWNwaV9lYyAqZWMgPSAodW5pb24gYWNwaV9lYyAqKWNvbnRleHQ7Ci0Jc3RydWN0IGFjcGlfZ2VuZXJpY19hZGRyZXNzICphZGRyOworCXN0cnVjdCBhY3BpX2VjICplYyA9IChzdHJ1Y3QgYWNwaV9lYyAqKWNvbnRleHQ7CiAKIAlpZiAocmVzb3VyY2UtPnR5cGUgIT0gQUNQSV9SRVNPVVJDRV9UWVBFX0lPKSB7CiAJCXJldHVybiBBRV9PSzsKQEAgLTExNDgsMjYgKzc0NSwyMSBAQAogCSAqIHRoZSBzZWNvbmQgYWRkcmVzcyByZWdpb24gcmV0dXJuZWQgaXMgdGhlIHN0YXR1cy9jb21tYW5kCiAJICogcG9ydC4KIAkgKi8KLQlpZiAoZWMtPmNvbW1vbi5kYXRhX2FkZHIucmVnaXN0ZXJfYml0X3dpZHRoID09IDApIHsKLQkJYWRkciA9ICZlYy0+Y29tbW9uLmRhdGFfYWRkcjsKLQl9IGVsc2UgaWYgKGVjLT5jb21tb24uY29tbWFuZF9hZGRyLnJlZ2lzdGVyX2JpdF93aWR0aCA9PSAwKSB7Ci0JCWFkZHIgPSAmZWMtPmNvbW1vbi5jb21tYW5kX2FkZHI7CisJaWYgKGVjLT5kYXRhX2FkZHIgPT0gMCkgeworCQllYy0+ZGF0YV9hZGRyID0gcmVzb3VyY2UtPmRhdGEuaW8ubWluaW11bTsKKwl9IGVsc2UgaWYgKGVjLT5jb21tYW5kX2FkZHIgPT0gMCkgeworCQllYy0+Y29tbWFuZF9hZGRyID0gcmVzb3VyY2UtPmRhdGEuaW8ubWluaW11bTsKIAl9IGVsc2UgewogCQlyZXR1cm4gQUVfQ1RSTF9URVJNSU5BVEU7CiAJfQogCi0JYWRkci0+YWRkcmVzc19zcGFjZV9pZCA9IEFDUElfQURSX1NQQUNFX1NZU1RFTV9JTzsKLQlhZGRyLT5yZWdpc3Rlcl9iaXRfd2lkdGggPSA4OwotCWFkZHItPnJlZ2lzdGVyX2JpdF9vZmZzZXQgPSAwOwotCWFkZHItPmFkZHJlc3MgPSByZXNvdXJjZS0+ZGF0YS5pby5taW5pbXVtOwotCiAJcmV0dXJuIEFFX09LOwogfQogCiBzdGF0aWMgaW50IGFjcGlfZWNfc3RhcnQoc3RydWN0IGFjcGlfZGV2aWNlICpkZXZpY2UpCiB7CiAJYWNwaV9zdGF0dXMgc3RhdHVzID0gQUVfT0s7Ci0JdW5pb24gYWNwaV9lYyAqZWMgPSBOVUxMOworCXN0cnVjdCBhY3BpX2VjICplYyA9IE5VTEw7CiAKIAogCWlmICghZGV2aWNlKQpAQCAtMTE4MSwzOSArNzczLDM1IEBACiAJLyoKIAkgKiBHZXQgSS9PIHBvcnQgYWRkcmVzc2VzLiBDb252ZXJ0IHRvIEdBUyBmb3JtYXQuCiAJICovCi0Jc3RhdHVzID0gYWNwaV93YWxrX3Jlc291cmNlcyhlYy0+Y29tbW9uLmhhbmRsZSwgTUVUSE9EX05BTUVfX0NSUywKKwlzdGF0dXMgPSBhY3BpX3dhbGtfcmVzb3VyY2VzKGVjLT5oYW5kbGUsIE1FVEhPRF9OQU1FX19DUlMsCiAJCQkJICAgICBhY3BpX2VjX2lvX3BvcnRzLCBlYyk7Ci0JaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpCi0JICAgIHx8IGVjLT5jb21tb24uY29tbWFuZF9hZGRyLnJlZ2lzdGVyX2JpdF93aWR0aCA9PSAwKSB7Ci0JCXByaW50ayhLRVJOX0VSUiBQUkVGSVggIkVycm9yIGdldHRpbmcgSS9PIHBvcnQgYWRkcmVzc2VzXG4iKTsKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykgfHwgZWMtPmNvbW1hbmRfYWRkciA9PSAwKSB7CisJCUFDUElfRVhDRVBUSU9OKChBRV9JTkZPLCBzdGF0dXMsCisJCQkJIkVycm9yIGdldHRpbmcgSS9PIHBvcnQgYWRkcmVzc2VzIikpOwogCQlyZXR1cm4gLUVOT0RFVjsKIAl9CiAKLQllYy0+Y29tbW9uLnN0YXR1c19hZGRyID0gZWMtPmNvbW1vbi5jb21tYW5kX2FkZHI7Ci0KLQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0lORk8sICJncGU9MHglMDJ4LCBwb3J0cz0weCUyeCwweCUyeFxuIiwKLQkJCSAgKHUzMikgZWMtPmNvbW1vbi5ncGVfYml0LAotCQkJICAodTMyKSBlYy0+Y29tbW9uLmNvbW1hbmRfYWRkci5hZGRyZXNzLAotCQkJICAodTMyKSBlYy0+Y29tbW9uLmRhdGFfYWRkci5hZGRyZXNzKSk7CisJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9JTkZPLCAiZ3BlPTB4JTAybHgsIHBvcnRzPTB4JTJseCwweCUybHgiLAorCQkJICBlYy0+Z3BlX2JpdCwgZWMtPmNvbW1hbmRfYWRkciwgZWMtPmRhdGFfYWRkcikpOwogCiAJLyoKIAkgKiBJbnN0YWxsIEdQRSBoYW5kbGVyCiAJICovCi0Jc3RhdHVzID0gYWNwaV9pbnN0YWxsX2dwZV9oYW5kbGVyKE5VTEwsIGVjLT5jb21tb24uZ3BlX2JpdCwKKwlzdGF0dXMgPSBhY3BpX2luc3RhbGxfZ3BlX2hhbmRsZXIoTlVMTCwgZWMtPmdwZV9iaXQsCiAJCQkJCSAgQUNQSV9HUEVfRURHRV9UUklHR0VSRUQsCiAJCQkJCSAgJmFjcGlfZWNfZ3BlX2hhbmRsZXIsIGVjKTsKIAlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKIAkJcmV0dXJuIC1FTk9ERVY7CiAJfQotCWFjcGlfc2V0X2dwZV90eXBlKE5VTEwsIGVjLT5jb21tb24uZ3BlX2JpdCwgQUNQSV9HUEVfVFlQRV9SVU5USU1FKTsKLQlhY3BpX2VuYWJsZV9ncGUoTlVMTCwgZWMtPmNvbW1vbi5ncGVfYml0LCBBQ1BJX05PVF9JU1IpOworCWFjcGlfc2V0X2dwZV90eXBlKE5VTEwsIGVjLT5ncGVfYml0LCBBQ1BJX0dQRV9UWVBFX1JVTlRJTUUpOworCWFjcGlfZW5hYmxlX2dwZShOVUxMLCBlYy0+Z3BlX2JpdCwgQUNQSV9OT1RfSVNSKTsKIAotCXN0YXR1cyA9IGFjcGlfaW5zdGFsbF9hZGRyZXNzX3NwYWNlX2hhbmRsZXIoZWMtPmNvbW1vbi5oYW5kbGUsCisJc3RhdHVzID0gYWNwaV9pbnN0YWxsX2FkZHJlc3Nfc3BhY2VfaGFuZGxlcihlYy0+aGFuZGxlLAogCQkJCQkJICAgIEFDUElfQURSX1NQQUNFX0VDLAogCQkJCQkJICAgICZhY3BpX2VjX3NwYWNlX2hhbmRsZXIsCiAJCQkJCQkgICAgJmFjcGlfZWNfc3BhY2Vfc2V0dXAsIGVjKTsKIAlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKLQkJYWNwaV9yZW1vdmVfZ3BlX2hhbmRsZXIoTlVMTCwgZWMtPmNvbW1vbi5ncGVfYml0LAorCQlhY3BpX3JlbW92ZV9ncGVfaGFuZGxlcihOVUxMLCBlYy0+Z3BlX2JpdCwKIAkJCQkJJmFjcGlfZWNfZ3BlX2hhbmRsZXIpOwogCQlyZXR1cm4gLUVOT0RFVjsKIAl9CkBAIC0xMjI0LDcgKzgxMiw3IEBACiBzdGF0aWMgaW50IGFjcGlfZWNfc3RvcChzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldmljZSwgaW50IHR5cGUpCiB7CiAJYWNwaV9zdGF0dXMgc3RhdHVzID0gQUVfT0s7Ci0JdW5pb24gYWNwaV9lYyAqZWMgPSBOVUxMOworCXN0cnVjdCBhY3BpX2VjICplYyA9IE5VTEw7CiAKIAogCWlmICghZGV2aWNlKQpAQCAtMTIzMiwxNCArODIwLDE0IEBACiAKIAllYyA9IGFjcGlfZHJpdmVyX2RhdGEoZGV2aWNlKTsKIAotCXN0YXR1cyA9IGFjcGlfcmVtb3ZlX2FkZHJlc3Nfc3BhY2VfaGFuZGxlcihlYy0+Y29tbW9uLmhhbmRsZSwKKwlzdGF0dXMgPSBhY3BpX3JlbW92ZV9hZGRyZXNzX3NwYWNlX2hhbmRsZXIoZWMtPmhhbmRsZSwKIAkJCQkJCSAgIEFDUElfQURSX1NQQUNFX0VDLAogCQkJCQkJICAgJmFjcGlfZWNfc3BhY2VfaGFuZGxlcik7CiAJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKQogCQlyZXR1cm4gLUVOT0RFVjsKIAogCXN0YXR1cyA9Ci0JICAgIGFjcGlfcmVtb3ZlX2dwZV9oYW5kbGVyKE5VTEwsIGVjLT5jb21tb24uZ3BlX2JpdCwKKwkgICAgYWNwaV9yZW1vdmVfZ3BlX2hhbmRsZXIoTlVMTCwgZWMtPmdwZV9iaXQsCiAJCQkJICAgICZhY3BpX2VjX2dwZV9oYW5kbGVyKTsKIAlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpCiAJCXJldHVybiAtRU5PREVWOwpAQCAtMTI1MSw3NiArODM5LDMwIEBACiBhY3BpX2Zha2VfZWNkdF9jYWxsYmFjayhhY3BpX2hhbmRsZSBoYW5kbGUsCiAJCQl1MzIgTGV2ZWwsIHZvaWQgKmNvbnRleHQsIHZvaWQgKipyZXR2YWwpCiB7Ci0KLQlpZiAoYWNwaV9lY19wb2xsX21vZGUpCi0JCXJldHVybiBhY3BpX2Zha2VfZWNkdF9wb2xsX2NhbGxiYWNrKGhhbmRsZSwKLQkJCQkJCSAgICAgICBMZXZlbCwgY29udGV4dCwgcmV0dmFsKTsKLQllbHNlCi0JCXJldHVybiBhY3BpX2Zha2VfZWNkdF9pbnRyX2NhbGxiYWNrKGhhbmRsZSwKLQkJCQkJCSAgICAgTGV2ZWwsIGNvbnRleHQsIHJldHZhbCk7Ci19Ci0KLXN0YXRpYyBhY3BpX3N0YXR1cyBfX2luaXQKLWFjcGlfZmFrZV9lY2R0X3BvbGxfY2FsbGJhY2soYWNwaV9oYW5kbGUgaGFuZGxlLAotCQkJCXUzMiBMZXZlbCwgdm9pZCAqY29udGV4dCwgdm9pZCAqKnJldHZhbCkKLXsKIAlhY3BpX3N0YXR1cyBzdGF0dXM7CiAKKwlpbml0X01VVEVYKCZlY19lY2R0LT5zZW0pOworCWlmIChhY3BpX2VjX21vZGUgPT0gRUNfSU5UUikgeworCQlpbml0X3dhaXRxdWV1ZV9oZWFkKCZlY19lY2R0LT53YWl0KTsKKwl9CiAJc3RhdHVzID0gYWNwaV93YWxrX3Jlc291cmNlcyhoYW5kbGUsIE1FVEhPRF9OQU1FX19DUlMsCiAJCQkJICAgICBhY3BpX2VjX2lvX3BvcnRzLCBlY19lY2R0KTsKIAlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpCiAJCXJldHVybiBzdGF0dXM7Ci0JZWNfZWNkdC0+Y29tbW9uLnN0YXR1c19hZGRyID0gZWNfZWNkdC0+Y29tbW9uLmNvbW1hbmRfYWRkcjsKIAotCWVjX2VjZHQtPmNvbW1vbi51aWQgPSAtMTsKLQlhY3BpX2V2YWx1YXRlX2ludGVnZXIoaGFuZGxlLCAiX1VJRCIsIE5VTEwsICZlY19lY2R0LT5jb21tb24udWlkKTsKKwllY19lY2R0LT51aWQgPSAtMTsKKwlhY3BpX2V2YWx1YXRlX2ludGVnZXIoaGFuZGxlLCAiX1VJRCIsIE5VTEwsICZlY19lY2R0LT51aWQpOwogCiAJc3RhdHVzID0KIAkgICAgYWNwaV9ldmFsdWF0ZV9pbnRlZ2VyKGhhbmRsZSwgIl9HUEUiLCBOVUxMLAotCQkJCSAgJmVjX2VjZHQtPmNvbW1vbi5ncGVfYml0KTsKKwkJCQkgICZlY19lY2R0LT5ncGVfYml0KTsKIAlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpCiAJCXJldHVybiBzdGF0dXM7Ci0JaW5pdF9NVVRFWCgmZWNfZWNkdC0+cG9sbC5zZW0pOwotCWVjX2VjZHQtPmNvbW1vbi5nbG9iYWxfbG9jayA9IFRSVUU7Ci0JZWNfZWNkdC0+Y29tbW9uLmhhbmRsZSA9IGhhbmRsZTsKKwllY19lY2R0LT5nbG9iYWxfbG9jayA9IFRSVUU7CisJZWNfZWNkdC0+aGFuZGxlID0gaGFuZGxlOwogCi0JcHJpbnRrKEtFUk5fSU5GTyBQUkVGSVggIkdQRT0weCUwMngsIHBvcnRzPTB4JTJ4LCAweCUyeFxuIiwKLQkgICAgICAgKHUzMikgZWNfZWNkdC0+Y29tbW9uLmdwZV9iaXQsCi0JICAgICAgICh1MzIpIGVjX2VjZHQtPmNvbW1vbi5jb21tYW5kX2FkZHIuYWRkcmVzcywKLQkgICAgICAgKHUzMikgZWNfZWNkdC0+Y29tbW9uLmRhdGFfYWRkci5hZGRyZXNzKTsKLQotCXJldHVybiBBRV9DVFJMX1RFUk1JTkFURTsKLX0KLQotc3RhdGljIGFjcGlfc3RhdHVzIF9faW5pdAotYWNwaV9mYWtlX2VjZHRfaW50cl9jYWxsYmFjayhhY3BpX2hhbmRsZSBoYW5kbGUsCi0JCQkgICAgICB1MzIgTGV2ZWwsIHZvaWQgKmNvbnRleHQsIHZvaWQgKipyZXR2YWwpCi17Ci0JYWNwaV9zdGF0dXMgc3RhdHVzOwotCi0JaW5pdF9NVVRFWCgmZWNfZWNkdC0+aW50ci5zZW0pOwotCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmVjX2VjZHQtPmludHIud2FpdCk7Ci0Jc3RhdHVzID0gYWNwaV93YWxrX3Jlc291cmNlcyhoYW5kbGUsIE1FVEhPRF9OQU1FX19DUlMsCi0JCQkJICAgICBhY3BpX2VjX2lvX3BvcnRzLCBlY19lY2R0KTsKLQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpCi0JCXJldHVybiBzdGF0dXM7Ci0JZWNfZWNkdC0+Y29tbW9uLnN0YXR1c19hZGRyID0gZWNfZWNkdC0+Y29tbW9uLmNvbW1hbmRfYWRkcjsKLQotCWVjX2VjZHQtPmNvbW1vbi51aWQgPSAtMTsKLQlhY3BpX2V2YWx1YXRlX2ludGVnZXIoaGFuZGxlLCAiX1VJRCIsIE5VTEwsICZlY19lY2R0LT5jb21tb24udWlkKTsKLQotCXN0YXR1cyA9Ci0JICAgIGFjcGlfZXZhbHVhdGVfaW50ZWdlcihoYW5kbGUsICJfR1BFIiwgTlVMTCwKLQkJCQkgICZlY19lY2R0LT5jb21tb24uZ3BlX2JpdCk7Ci0JaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKQotCQlyZXR1cm4gc3RhdHVzOwotCWVjX2VjZHQtPmNvbW1vbi5nbG9iYWxfbG9jayA9IFRSVUU7Ci0JZWNfZWNkdC0+Y29tbW9uLmhhbmRsZSA9IGhhbmRsZTsKLQotCXByaW50ayhLRVJOX0lORk8gUFJFRklYICJHUEU9MHglMDJ4LCBwb3J0cz0weCUyeCwgMHglMnhcbiIsCi0JICAgICAgICh1MzIpIGVjX2VjZHQtPmNvbW1vbi5ncGVfYml0LAotCSAgICAgICAodTMyKSBlY19lY2R0LT5jb21tb24uY29tbWFuZF9hZGRyLmFkZHJlc3MsCi0JICAgICAgICh1MzIpIGVjX2VjZHQtPmNvbW1vbi5kYXRhX2FkZHIuYWRkcmVzcyk7CisJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9JTkZPLCAiR1BFPTB4JTAybHgsIHBvcnRzPTB4JTJseCwgMHglMmx4IiwKKwkgICAgICAgZWNfZWNkdC0+Z3BlX2JpdCwgZWNfZWNkdC0+Y29tbWFuZF9hZGRyLCBlY19lY2R0LT5kYXRhX2FkZHIpKTsKIAogCXJldHVybiBBRV9DVFJMX1RFUk1JTkFURTsKIH0KQEAgLTEzNDAsMTQgKzg4MiwxNCBAQAogCWFjcGlfc3RhdHVzIHN0YXR1czsKIAlpbnQgcmV0ID0gMDsKIAotCXByaW50ayhLRVJOX0lORk8gUFJFRklYICJUcnkgdG8gbWFrZSBhbiBmYWtlIEVDRFRcbiIpOworCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfSU5GTywgIlRyeSB0byBtYWtlIGFuIGZha2UgRUNEVCIpKTsKIAotCWVjX2VjZHQgPSBrbWFsbG9jKHNpemVvZih1bmlvbiBhY3BpX2VjKSwgR0ZQX0tFUk5FTCk7CisJZWNfZWNkdCA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBhY3BpX2VjKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFlY19lY2R0KSB7CiAJCXJldCA9IC1FTk9NRU07CiAJCWdvdG8gZXJyb3I7CiAJfQotCW1lbXNldChlY19lY2R0LCAwLCBzaXplb2YodW5pb24gYWNwaV9lYykpOworCW1lbXNldChlY19lY2R0LCAwLCBzaXplb2Yoc3RydWN0IGFjcGlfZWMpKTsKIAogCXN0YXR1cyA9IGFjcGlfZ2V0X2RldmljZXMoQUNQSV9FQ19ISUQsCiAJCQkJICBhY3BpX2Zha2VfZWNkdF9jYWxsYmFjaywgTlVMTCwgTlVMTCk7CkBAIC0xMzU1LDI0ICs4OTcsMTYgQEAKIAkJa2ZyZWUoZWNfZWNkdCk7CiAJCWVjX2VjZHQgPSBOVUxMOwogCQlyZXQgPSAtRU5PREVWOworCQlBQ1BJX0VYQ0VQVElPTigoQUVfSU5GTywgc3RhdHVzLCAiQ2FuJ3QgbWFrZSBhbiBmYWtlIEVDRFQiKSk7CiAJCWdvdG8gZXJyb3I7CiAJfQogCXJldHVybiAwOwotICAgICAgZXJyb3I6Ci0JcHJpbnRrKEtFUk5fRVJSIFBSRUZJWCAiQ2FuJ3QgbWFrZSBhbiBmYWtlIEVDRFRcbiIpOworICBlcnJvcjoKIAlyZXR1cm4gcmV0OwogfQogCiBzdGF0aWMgaW50IF9faW5pdCBhY3BpX2VjX2dldF9yZWFsX2VjZHQodm9pZCkKIHsKLQlpZiAoYWNwaV9lY19wb2xsX21vZGUpCi0JCXJldHVybiBhY3BpX2VjX3BvbGxfZ2V0X3JlYWxfZWNkdCgpOwotCWVsc2UKLQkJcmV0dXJuIGFjcGlfZWNfaW50cl9nZXRfcmVhbF9lY2R0KCk7Ci19Ci0KLXN0YXRpYyBpbnQgX19pbml0IGFjcGlfZWNfcG9sbF9nZXRfcmVhbF9lY2R0KHZvaWQpCi17CiAJYWNwaV9zdGF0dXMgc3RhdHVzOwogCXN0cnVjdCBhY3BpX3RhYmxlX2VjZHQgKmVjZHRfcHRyOwogCkBAIC0xMzgyLDgwICs5MTYsMzYgQEAKIAlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpCiAJCXJldHVybiAtRU5PREVWOwogCi0JcHJpbnRrKEtFUk5fSU5GTyBQUkVGSVggIkZvdW5kIEVDRFRcbiIpOworCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfSU5GTywgIkZvdW5kIEVDRFQiKSk7CiAKIAkvKgogCSAqIEdlbmVyYXRlIGEgdGVtcG9yYXJ5IGVjIGNvbnRleHQgdG8gdXNlIHVudGlsIHRoZSBuYW1lc3BhY2UgaXMgc2Nhbm5lZAogCSAqLwotCWVjX2VjZHQgPSBrbWFsbG9jKHNpemVvZih1bmlvbiBhY3BpX2VjKSwgR0ZQX0tFUk5FTCk7CisJZWNfZWNkdCA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBhY3BpX2VjKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFlY19lY2R0KQogCQlyZXR1cm4gLUVOT01FTTsKLQltZW1zZXQoZWNfZWNkdCwgMCwgc2l6ZW9mKHVuaW9uIGFjcGlfZWMpKTsKKwltZW1zZXQoZWNfZWNkdCwgMCwgc2l6ZW9mKHN0cnVjdCBhY3BpX2VjKSk7CiAKLQllY19lY2R0LT5jb21tb24uY29tbWFuZF9hZGRyID0gZWNkdF9wdHItPmVjX2NvbnRyb2w7Ci0JZWNfZWNkdC0+Y29tbW9uLnN0YXR1c19hZGRyID0gZWNkdF9wdHItPmVjX2NvbnRyb2w7Ci0JZWNfZWNkdC0+Y29tbW9uLmRhdGFfYWRkciA9IGVjZHRfcHRyLT5lY19kYXRhOwotCWVjX2VjZHQtPmNvbW1vbi5ncGVfYml0ID0gZWNkdF9wdHItPmdwZV9iaXQ7Ci0JaW5pdF9NVVRFWCgmZWNfZWNkdC0+cG9sbC5zZW0pOworCWluaXRfTVVURVgoJmVjX2VjZHQtPnNlbSk7CisJaWYgKGFjcGlfZWNfbW9kZSA9PSBFQ19JTlRSKSB7CisJCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmVjX2VjZHQtPndhaXQpOworCX0KKwllY19lY2R0LT5jb21tYW5kX2FkZHIgPSBlY2R0X3B0ci0+ZWNfY29udHJvbC5hZGRyZXNzOworCWVjX2VjZHQtPmRhdGFfYWRkciA9IGVjZHRfcHRyLT5lY19kYXRhLmFkZHJlc3M7CisJZWNfZWNkdC0+Z3BlX2JpdCA9IGVjZHRfcHRyLT5ncGVfYml0OwogCS8qIHVzZSB0aGUgR0wganVzdCB0byBiZSBzYWZlICovCi0JZWNfZWNkdC0+Y29tbW9uLmdsb2JhbF9sb2NrID0gVFJVRTsKLQllY19lY2R0LT5jb21tb24udWlkID0gZWNkdF9wdHItPnVpZDsKKwllY19lY2R0LT5nbG9iYWxfbG9jayA9IFRSVUU7CisJZWNfZWNkdC0+dWlkID0gZWNkdF9wdHItPnVpZDsKIAogCXN0YXR1cyA9Ci0JICAgIGFjcGlfZ2V0X2hhbmRsZShOVUxMLCBlY2R0X3B0ci0+ZWNfaWQsICZlY19lY2R0LT5jb21tb24uaGFuZGxlKTsKKwkgICAgYWNwaV9nZXRfaGFuZGxlKE5VTEwsIGVjZHRfcHRyLT5lY19pZCwgJmVjX2VjZHQtPmhhbmRsZSk7CiAJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CiAJCWdvdG8gZXJyb3I7CiAJfQogCiAJcmV0dXJuIDA7Ci0gICAgICBlcnJvcjoKLQlwcmludGsoS0VSTl9FUlIgUFJFRklYICJDb3VsZCBub3QgdXNlIEVDRFRcbiIpOwotCWtmcmVlKGVjX2VjZHQpOwotCWVjX2VjZHQgPSBOVUxMOwotCi0JcmV0dXJuIC1FTk9ERVY7Ci19Ci0KLXN0YXRpYyBpbnQgX19pbml0IGFjcGlfZWNfaW50cl9nZXRfcmVhbF9lY2R0KHZvaWQpCi17Ci0JYWNwaV9zdGF0dXMgc3RhdHVzOwotCXN0cnVjdCBhY3BpX3RhYmxlX2VjZHQgKmVjZHRfcHRyOwotCi0Jc3RhdHVzID0gYWNwaV9nZXRfZmlybXdhcmVfdGFibGUoIkVDRFQiLCAxLCBBQ1BJX0xPR0lDQUxfQUREUkVTU0lORywKLQkJCQkJIChzdHJ1Y3QgYWNwaV90YWJsZV9oZWFkZXIgKiopCi0JCQkJCSAmZWNkdF9wdHIpOwotCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkKLQkJcmV0dXJuIC1FTk9ERVY7Ci0KLQlwcmludGsoS0VSTl9JTkZPIFBSRUZJWCAiRm91bmQgRUNEVFxuIik7Ci0KLQkvKgotCSAqIEdlbmVyYXRlIGEgdGVtcG9yYXJ5IGVjIGNvbnRleHQgdG8gdXNlIHVudGlsIHRoZSBuYW1lc3BhY2UgaXMgc2Nhbm5lZAotCSAqLwotCWVjX2VjZHQgPSBrbWFsbG9jKHNpemVvZih1bmlvbiBhY3BpX2VjKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFlY19lY2R0KQotCQlyZXR1cm4gLUVOT01FTTsKLQltZW1zZXQoZWNfZWNkdCwgMCwgc2l6ZW9mKHVuaW9uIGFjcGlfZWMpKTsKLQotCWluaXRfTVVURVgoJmVjX2VjZHQtPmludHIuc2VtKTsKLQlpbml0X3dhaXRxdWV1ZV9oZWFkKCZlY19lY2R0LT5pbnRyLndhaXQpOwotCWVjX2VjZHQtPmNvbW1vbi5jb21tYW5kX2FkZHIgPSBlY2R0X3B0ci0+ZWNfY29udHJvbDsKLQllY19lY2R0LT5jb21tb24uc3RhdHVzX2FkZHIgPSBlY2R0X3B0ci0+ZWNfY29udHJvbDsKLQllY19lY2R0LT5jb21tb24uZGF0YV9hZGRyID0gZWNkdF9wdHItPmVjX2RhdGE7Ci0JZWNfZWNkdC0+Y29tbW9uLmdwZV9iaXQgPSBlY2R0X3B0ci0+Z3BlX2JpdDsKLQkvKiB1c2UgdGhlIEdMIGp1c3QgdG8gYmUgc2FmZSAqLwotCWVjX2VjZHQtPmNvbW1vbi5nbG9iYWxfbG9jayA9IFRSVUU7Ci0JZWNfZWNkdC0+Y29tbW9uLnVpZCA9IGVjZHRfcHRyLT51aWQ7Ci0KLQlzdGF0dXMgPQotCSAgICBhY3BpX2dldF9oYW5kbGUoTlVMTCwgZWNkdF9wdHItPmVjX2lkLCAmZWNfZWNkdC0+Y29tbW9uLmhhbmRsZSk7Ci0JaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7Ci0JCWdvdG8gZXJyb3I7Ci0JfQotCi0JcmV0dXJuIDA7Ci0gICAgICBlcnJvcjoKLQlwcmludGsoS0VSTl9FUlIgUFJFRklYICJDb3VsZCBub3QgdXNlIEVDRFRcbiIpOworICBlcnJvcjoKKwlBQ1BJX0VYQ0VQVElPTigoQUVfSU5GTywgc3RhdHVzLCAiQ291bGQgbm90IHVzZSBFQ0RUIikpOwogCWtmcmVlKGVjX2VjZHQpOwogCWVjX2VjZHQgPSBOVUxMOwogCkBAIC0xNDgwLDE0ICs5NzAsMTQgQEAKIAkvKgogCSAqIEluc3RhbGwgR1BFIGhhbmRsZXIKIAkgKi8KLQlzdGF0dXMgPSBhY3BpX2luc3RhbGxfZ3BlX2hhbmRsZXIoTlVMTCwgZWNfZWNkdC0+Y29tbW9uLmdwZV9iaXQsCisJc3RhdHVzID0gYWNwaV9pbnN0YWxsX2dwZV9oYW5kbGVyKE5VTEwsIGVjX2VjZHQtPmdwZV9iaXQsCiAJCQkJCSAgQUNQSV9HUEVfRURHRV9UUklHR0VSRUQsCiAJCQkJCSAgJmFjcGlfZWNfZ3BlX2hhbmRsZXIsIGVjX2VjZHQpOwogCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewogCQlnb3RvIGVycm9yOwogCX0KLQlhY3BpX3NldF9ncGVfdHlwZShOVUxMLCBlY19lY2R0LT5jb21tb24uZ3BlX2JpdCwgQUNQSV9HUEVfVFlQRV9SVU5USU1FKTsKLQlhY3BpX2VuYWJsZV9ncGUoTlVMTCwgZWNfZWNkdC0+Y29tbW9uLmdwZV9iaXQsIEFDUElfTk9UX0lTUik7CisJYWNwaV9zZXRfZ3BlX3R5cGUoTlVMTCwgZWNfZWNkdC0+Z3BlX2JpdCwgQUNQSV9HUEVfVFlQRV9SVU5USU1FKTsKKwlhY3BpX2VuYWJsZV9ncGUoTlVMTCwgZWNfZWNkdC0+Z3BlX2JpdCwgQUNQSV9OT1RfSVNSKTsKIAogCXN0YXR1cyA9IGFjcGlfaW5zdGFsbF9hZGRyZXNzX3NwYWNlX2hhbmRsZXIoQUNQSV9ST09UX09CSkVDVCwKIAkJCQkJCSAgICBBQ1BJX0FEUl9TUEFDRV9FQywKQEAgLTE0OTUsNyArOTg1LDcgQEAKIAkJCQkJCSAgICAmYWNwaV9lY19zcGFjZV9zZXR1cCwKIAkJCQkJCSAgICBlY19lY2R0KTsKIAlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKLQkJYWNwaV9yZW1vdmVfZ3BlX2hhbmRsZXIoTlVMTCwgZWNfZWNkdC0+Y29tbW9uLmdwZV9iaXQsCisJCWFjcGlfcmVtb3ZlX2dwZV9oYW5kbGVyKE5VTEwsIGVjX2VjZHQtPmdwZV9iaXQsCiAJCQkJCSZhY3BpX2VjX2dwZV9oYW5kbGVyKTsKIAkJZ290byBlcnJvcjsKIAl9CkBAIC0xNTAzLDcgKzk5Myw3IEBACiAJcmV0dXJuIDA7CiAKICAgICAgIGVycm9yOgotCXByaW50ayhLRVJOX0VSUiBQUkVGSVggIkNvdWxkIG5vdCB1c2UgRUNEVFxuIik7CisJQUNQSV9FWENFUFRJT04oKEFFX0lORk8sIHN0YXR1cywgIkNvdWxkIG5vdCB1c2UgRUNEVCIpKTsKIAlrZnJlZShlY19lY2R0KTsKIAllY19lY2R0ID0gTlVMTDsKIApAQCAtMTU2MiwxMyArMTA1MiwxMyBAQAogCQlyZXR1cm4gMDsKIAogCWlmIChpbnRyKSB7Ci0JCWFjcGlfZWNfcG9sbF9tb2RlID0gRUNfSU5UUjsKLQkJYWNwaV9lY19kcml2ZXIub3BzLmFkZCA9IGFjcGlfZWNfaW50cl9hZGQ7CisJCWFjcGlfZWNfbW9kZSA9IEVDX0lOVFI7CiAJfSBlbHNlIHsKLQkJYWNwaV9lY19wb2xsX21vZGUgPSBFQ19QT0xMOwotCQlhY3BpX2VjX2RyaXZlci5vcHMuYWRkID0gYWNwaV9lY19wb2xsX2FkZDsKKwkJYWNwaV9lY19tb2RlID0gRUNfUE9MTDsKIAl9Ci0JcHJpbnRrKEtFUk5fSU5GTyBQUkVGSVggIkVDICVzIG1vZGUuXG4iLCBpbnRyID8gImludGVycnVwdCIgOiAicG9sbGluZyIpOworCWFjcGlfZWNfZHJpdmVyLm9wcy5hZGQgPSBhY3BpX2VjX2FkZDsKKwlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0lORk8sICJFQyAlcyBtb2RlLlxuIiwgaW50ciA/ICJpbnRlcnJ1cHQiIDogInBvbGxpbmciKSk7CisKIAlyZXR1cm4gMTsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2V2ZW50cy9ldm1pc2MuYyBiL2RyaXZlcnMvYWNwaS9ldmVudHMvZXZtaXNjLmMKaW5kZXggNmVlZjRlZi4uZWUyYTEwYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL2V2ZW50cy9ldm1pc2MuYworKysgYi9kcml2ZXJzL2FjcGkvZXZlbnRzL2V2bWlzYy5jCkBAIC0zNDIsMjAgKzM0Miw4IEBACiAJaWYgKGFjcXVpcmVkKSB7CiAKIAkJLyogR290IHRoZSBsb2NrLCBub3cgd2FrZSBhbGwgdGhyZWFkcyB3YWl0aW5nIGZvciBpdCAqLwotCiAJCWFjcGlfZ2JsX2dsb2JhbF9sb2NrX2FjcXVpcmVkID0gVFJVRTsKLQotCQkvKiBSdW4gdGhlIEdsb2JhbCBMb2NrIHRocmVhZCB3aGljaCB3aWxsIHNpZ25hbCBhbGwgd2FpdGluZyB0aHJlYWRzICovCi0KLQkJc3RhdHVzID0KLQkJICAgIGFjcGlfb3NfZXhlY3V0ZShPU0xfR0xPQkFMX0xPQ0tfSEFORExFUiwKLQkJCQkgICAgYWNwaV9ldl9nbG9iYWxfbG9ja190aHJlYWQsIGNvbnRleHQpOwotCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKLQkJCUFDUElfRVhDRVBUSU9OKChBRV9JTkZPLCBzdGF0dXMsCi0JCQkJCSJDb3VsZCBub3QgcXVldWUgR2xvYmFsIExvY2sgdGhyZWFkIikpOwotCi0JCQlyZXR1cm4gKEFDUElfSU5URVJSVVBUX05PVF9IQU5ETEVEKTsKLQkJfQorCQlhY3BpX2V2X2dsb2JhbF9sb2NrX3RocmVhZChjb250ZXh0KTsKIAl9CiAKIAlyZXR1cm4gKEFDUElfSU5URVJSVVBUX0hBTkRMRUQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2V2ZW50cy9ldnJnbmluaS5jIGIvZHJpdmVycy9hY3BpL2V2ZW50cy9ldnJnbmluaS5jCmluZGV4IDViM2M3YTguLjIwM2QxMzUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9ldmVudHMvZXZyZ25pbmkuYworKysgYi9kcml2ZXJzL2FjcGkvZXZlbnRzL2V2cmduaW5pLmMKQEAgLTIyNSwxMyArMjI1LDEyIEBACiAJCQkJaWYgKCEKIAkJCQkgICAgKEFDUElfU1RSTkNNUAogCQkJCSAgICAgKG9iamVjdF9oSUQudmFsdWUsIFBDSV9ST09UX0hJRF9TVFJJTkcsCi0JCQkJICAgICAgc2l6ZW9mKFBDSV9ST09UX0hJRF9TVFJJTkcpKQotCQkJCSAgICAgfHwKLQkJCQkgICAgICEoQUNQSV9TVFJOQ01QCi0JCQkJICAgICAgIChvYmplY3RfaElELnZhbHVlLAotCQkJCQlQQ0lfRVhQUkVTU19ST09UX0hJRF9TVFJJTkcsCi0JCQkJCXNpemVvZihQQ0lfRVhQUkVTU19ST09UX0hJRF9TVFJJTkcpKSkpKQotCQkJCXsKKwkJCQkgICAgICBzaXplb2YoUENJX1JPT1RfSElEX1NUUklORykpKQorCQkJCSAgICB8fAorCQkJCSAgICAhKEFDUElfU1RSTkNNUAorCQkJCSAgICAgIChvYmplY3RfaElELnZhbHVlLAorCQkJCSAgICAgICBQQ0lfRVhQUkVTU19ST09UX0hJRF9TVFJJTkcsCisJCQkJICAgICAgIHNpemVvZihQQ0lfRVhQUkVTU19ST09UX0hJRF9TVFJJTkcpKSkpIHsKIAogCQkJCQkvKiBJbnN0YWxsIGEgaGFuZGxlciBmb3IgdGhpcyBQQ0kgcm9vdCBicmlkZ2UgKi8KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2libV9hY3BpLmMgYi9kcml2ZXJzL2FjcGkvaWJtX2FjcGkuYwppbmRleCAxNWZjMTI0Li4wMDNhOTg3IDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvaWJtX2FjcGkuYworKysgYi9kcml2ZXJzL2FjcGkvaWJtX2FjcGkuYwpAQCAtMTcwMiwxMyArMTcwMiwxMSBAQAogCSAubmFtZSA9ICJicmlnaHRuZXNzIiwKIAkgLnJlYWQgPSBicmlnaHRuZXNzX3JlYWQsCiAJIC53cml0ZSA9IGJyaWdodG5lc3Nfd3JpdGUsCi0JIC5leHBlcmltZW50YWwgPSAxLAogCSB9LAogCXsKIAkgLm5hbWUgPSAidm9sdW1lIiwKIAkgLnJlYWQgPSB2b2x1bWVfcmVhZCwKIAkgLndyaXRlID0gdm9sdW1lX3dyaXRlLAotCSAuZXhwZXJpbWVudGFsID0gMSwKIAkgfSwKIAl7CiAJIC5uYW1lID0gImZhbiIsCmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvbW90aGVyYm9hcmQuYyBiL2RyaXZlcnMvYWNwaS9tb3RoZXJib2FyZC5jCmluZGV4IGVjNmI3ZjkuLjJlMTdlYzcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9tb3RoZXJib2FyZC5jCisrKyBiL2RyaXZlcnMvYWNwaS9tb3RoZXJib2FyZC5jCkBAIC00OCw2ICs0OCwxMiBAQAogICogdGhlIGlvIHBvcnRzIGlmIHRoZXkgcmVhbGx5IGtub3cgdGhleSBjYW4gdXNlIGl0LCB3aGlsZQogICogc3RpbGwgcHJldmVudGluZyBob3RwbHVnIFBDSSBkZXZpY2VzIGZyb20gdXNpbmcgaXQuCiAgKi8KKworLyoKKyAqIFdoZW4gQ09ORklHX1BOUCBpcyBlbmFibGVkLCBwbnAvc3lzdGVtLmMgYmluZHMgdG8gUE5QMEMwMQorICogYW5kIFBOUDBDMDIsIHJlZHVuZGFudCB3aXRoIGFjcGlfcmVzZXJ2ZV9pb19yYW5nZXMoKS4KKyAqIEJ1dCBhY3BpX3Jlc2VydmVfaW9fcmFuZ2VzKCkgaXMgbmVjZXNzYXJ5IGZvciAhQ09ORklHX1BOUC4KKyAqLwogc3RhdGljIGFjcGlfc3RhdHVzIGFjcGlfcmVzZXJ2ZV9pb19yYW5nZXMoc3RydWN0IGFjcGlfcmVzb3VyY2UgKnJlcywgdm9pZCAqZGF0YSkKIHsKIAlzdHJ1Y3QgcmVzb3VyY2UgKnJlcXVlc3RlZF9yZXMgPSBOVUxMOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL3BjaV9saW5rLmMgYi9kcml2ZXJzL2FjcGkvcGNpX2xpbmsuYwppbmRleCA3ZjNlN2U3Li5kNTNiZDk4IDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvcGNpX2xpbmsuYworKysgYi9kcml2ZXJzL2FjcGkvcGNpX2xpbmsuYwpAQCAtMzA3LDcgKzMwNyw3IEBACiAJaWYgKCFsaW5rIHx8ICFpcnEpCiAJCXJldHVybiAtRUlOVkFMOwogCi0JcmVzb3VyY2UgPSBrbWFsbG9jKHNpemVvZigqcmVzb3VyY2UpICsgMSwgR0ZQX0FUT01JQyk7CisJcmVzb3VyY2UgPSBrbWFsbG9jKHNpemVvZigqcmVzb3VyY2UpICsgMSwgaXJxc19kaXNhYmxlZCgpID8gR0ZQX0FUT01JQzogR0ZQX0tFUk5FTCk7CiAJaWYgKCFyZXNvdXJjZSkKIAkJcmV0dXJuIC1FTk9NRU07CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9wb3dlci5jIGIvZHJpdmVycy9hY3BpL3Bvd2VyLmMKaW5kZXggZmVjMjI1ZC4uZmU2N2E4YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL3Bvd2VyLmMKKysrIGIvZHJpdmVycy9hY3BpL3Bvd2VyLmMKQEAgLTIxNiwxMCArMjE2LDggQEAKIHsKIAlpbnQgcmVzdWx0ID0gMDsKIAlhY3BpX3N0YXR1cyBzdGF0dXMgPSBBRV9PSzsKLQlzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldmljZSA9IE5VTEw7CiAJc3RydWN0IGFjcGlfcG93ZXJfcmVzb3VyY2UgKnJlc291cmNlID0gTlVMTDsKIAotCiAJcmVzdWx0ID0gYWNwaV9wb3dlcl9nZXRfY29udGV4dChoYW5kbGUsICZyZXNvdXJjZSk7CiAJaWYgKHJlc3VsdCkKIAkJcmV0dXJuIHJlc3VsdDsKQEAgLTIzMCwxMyArMjI4LDEzIEBACiAJaWYgKHJlc291cmNlLT5yZWZlcmVuY2VzKSB7CiAJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfSU5GTywKIAkJCQkgICJSZXNvdXJjZSBbJXNdIGlzIHN0aWxsIGluIHVzZSwgZGVyZWZlcmVuY2luZ1xuIiwKLQkJCQkgIGRldmljZS0+cG5wLmJ1c19pZCkpOworCQkJCSAgcmVzb3VyY2UtPmRldmljZS0+cG5wLmJ1c19pZCkpOwogCQlyZXR1cm4gMDsKIAl9CiAKIAlpZiAocmVzb3VyY2UtPnN0YXRlID09IEFDUElfUE9XRVJfUkVTT1VSQ0VfU1RBVEVfT0ZGKSB7CiAJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfSU5GTywgIlJlc291cmNlIFslc10gYWxyZWFkeSBvZmZcbiIsCi0JCQkJICBkZXZpY2UtPnBucC5idXNfaWQpKTsKKwkJCQkgIHJlc291cmNlLT5kZXZpY2UtPnBucC5idXNfaWQpKTsKIAkJcmV0dXJuIDA7CiAJfQogCkBAIC0yNTEsOCArMjQ5LDcgQEAKIAkJcmV0dXJuIC1FTk9FWEVDOwogCiAJLyogVXBkYXRlIHRoZSBwb3dlciByZXNvdXJjZSdzIF9kZXZpY2VfIHBvd2VyIHN0YXRlICovCi0JZGV2aWNlID0gcmVzb3VyY2UtPmRldmljZTsKLQlkZXZpY2UtPnBvd2VyLnN0YXRlID0gQUNQSV9TVEFURV9EMzsKKwlyZXNvdXJjZS0+ZGV2aWNlLT5wb3dlci5zdGF0ZSA9IEFDUElfU1RBVEVfRDM7CiAKIAlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0lORk8sICJSZXNvdXJjZSBbJXNdIHR1cm5lZCBvZmZcbiIsCiAJCQkgIHJlc291cmNlLT5uYW1lKSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvcHJvY2Vzc29yX2NvcmUuYyBiL2RyaXZlcnMvYWNwaS9wcm9jZXNzb3JfY29yZS5jCmluZGV4IGIxM2Q2NDQuLjE5MDhlMGQyIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvcHJvY2Vzc29yX2NvcmUuYworKysgYi9kcml2ZXJzL2FjcGkvcHJvY2Vzc29yX2NvcmUuYwpAQCAtNTE5LDcgKzUxOSw3IEBACiAKIHN0YXRpYyB2b2lkICpwcm9jZXNzb3JfZGV2aWNlX2FycmF5W05SX0NQVVNdOwogCi1zdGF0aWMgaW50IGFjcGlfcHJvY2Vzc29yX3N0YXJ0KHN0cnVjdCBhY3BpX2RldmljZSAqZGV2aWNlKQorc3RhdGljIGludCBfX2NwdWluaXQgYWNwaV9wcm9jZXNzb3Jfc3RhcnQoc3RydWN0IGFjcGlfZGV2aWNlICpkZXZpY2UpCiB7CiAJaW50IHJlc3VsdCA9IDA7CiAJYWNwaV9zdGF0dXMgc3RhdHVzID0gQUVfT0s7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvcHJvY2Vzc29yX2lkbGUuYyBiL2RyaXZlcnMvYWNwaS9wcm9jZXNzb3JfaWRsZS5jCmluZGV4IDBhMzk1ZmMuLjY1YjNmMDUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9wcm9jZXNzb3JfaWRsZS5jCisrKyBiL2RyaXZlcnMvYWNwaS9wcm9jZXNzb3JfaWRsZS5jCkBAIC0yMTksNiArMjE5LDIzIEBACiAKIHN0YXRpYyBhdG9taWNfdCBjM19jcHVfY291bnQ7CiAKKy8qIENvbW1vbiBDLXN0YXRlIGVudHJ5IGZvciBDMiwgQzMsIC4uICovCitzdGF0aWMgdm9pZCBhY3BpX2NzdGF0ZV9lbnRlcihzdHJ1Y3QgYWNwaV9wcm9jZXNzb3JfY3ggKmNzdGF0ZSkKK3sKKwlpZiAoY3N0YXRlLT5zcGFjZV9pZCA9PSBBQ1BJX0NTVEFURV9GRkgpIHsKKwkJLyogQ2FsbCBpbnRvIGFyY2hpdGVjdHVyYWwgRkZIIGJhc2VkIEMtc3RhdGUgKi8KKwkJYWNwaV9wcm9jZXNzb3JfZmZoX2NzdGF0ZV9lbnRlcihjc3RhdGUpOworCX0gZWxzZSB7CisJCWludCB1bnVzZWQ7CisJCS8qIElPIHBvcnQgYmFzZWQgQy1zdGF0ZSAqLworCQlpbmIoY3N0YXRlLT5hZGRyZXNzKTsKKwkJLyogRHVtbXkgd2FpdCBvcCAtIG11c3QgZG8gc29tZXRoaW5nIHVzZWxlc3MgYWZ0ZXIgUF9MVkwyIHJlYWQKKwkJICAgYmVjYXVzZSBjaGlwc2V0cyBjYW5ub3QgZ3VhcmFudGVlIHRoYXQgU1RQQ0xLIyBzaWduYWwKKwkJICAgZ2V0cyBhc3NlcnRlZCBpbiB0aW1lIHRvIGZyZWV6ZSBleGVjdXRpb24gcHJvcGVybHkuICovCisJCXVudXNlZCA9IGlubChhY3BpX2ZhZHQueHBtX3Rtcl9ibGsuYWRkcmVzcyk7CisJfQorfQorCiBzdGF0aWMgdm9pZCBhY3BpX3Byb2Nlc3Nvcl9pZGxlKHZvaWQpCiB7CiAJc3RydWN0IGFjcGlfcHJvY2Vzc29yICpwciA9IE5VTEw7CkBAIC0zNjEsMTEgKzM3OCw3IEBACiAJCS8qIEdldCBzdGFydCB0aW1lICh0aWNrcykgKi8KIAkJdDEgPSBpbmwoYWNwaV9mYWR0LnhwbV90bXJfYmxrLmFkZHJlc3MpOwogCQkvKiBJbnZva2UgQzIgKi8KLQkJaW5iKGN4LT5hZGRyZXNzKTsKLQkJLyogRHVtbXkgd2FpdCBvcCAtIG11c3QgZG8gc29tZXRoaW5nIHVzZWxlc3MgYWZ0ZXIgUF9MVkwyIHJlYWQKLQkJICAgYmVjYXVzZSBjaGlwc2V0cyBjYW5ub3QgZ3VhcmFudGVlIHRoYXQgU1RQQ0xLIyBzaWduYWwKLQkJICAgZ2V0cyBhc3NlcnRlZCBpbiB0aW1lIHRvIGZyZWV6ZSBleGVjdXRpb24gcHJvcGVybHkuICovCi0JCXQyID0gaW5sKGFjcGlfZmFkdC54cG1fdG1yX2Jsay5hZGRyZXNzKTsKKwkJYWNwaV9jc3RhdGVfZW50ZXIoY3gpOwogCQkvKiBHZXQgZW5kIHRpbWUgKHRpY2tzKSAqLwogCQl0MiA9IGlubChhY3BpX2ZhZHQueHBtX3Rtcl9ibGsuYWRkcmVzcyk7CiAKQEAgLTQwMSw5ICs0MTQsNyBAQAogCQkvKiBHZXQgc3RhcnQgdGltZSAodGlja3MpICovCiAJCXQxID0gaW5sKGFjcGlfZmFkdC54cG1fdG1yX2Jsay5hZGRyZXNzKTsKIAkJLyogSW52b2tlIEMzICovCi0JCWluYihjeC0+YWRkcmVzcyk7Ci0JCS8qIER1bW15IHdhaXQgb3AgKHNlZSBhYm92ZSkgKi8KLQkJdDIgPSBpbmwoYWNwaV9mYWR0LnhwbV90bXJfYmxrLmFkZHJlc3MpOworCQlhY3BpX2NzdGF0ZV9lbnRlcihjeCk7CiAJCS8qIEdldCBlbmQgdGltZSAodGlja3MpICovCiAJCXQyID0gaW5sKGFjcGlfZmFkdC54cG1fdG1yX2Jsay5hZGRyZXNzKTsKIAkJaWYgKHByLT5mbGFncy5ibV9jaGVjaykgewpAQCAtNjI4LDIwICs2MzksMTYgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBhY3BpX3Byb2Nlc3Nvcl9nZXRfcG93ZXJfaW5mb19kZWZhdWx0X2MxKHN0cnVjdCBhY3BpX3Byb2Nlc3NvciAqcHIpCitzdGF0aWMgaW50IGFjcGlfcHJvY2Vzc29yX2dldF9wb3dlcl9pbmZvX2RlZmF1bHQoc3RydWN0IGFjcGlfcHJvY2Vzc29yICpwcikKIHsKLQotCS8qIFplcm8gaW5pdGlhbGl6ZSBhbGwgdGhlIEMtc3RhdGVzIGluZm8uICovCi0JbWVtc2V0KHByLT5wb3dlci5zdGF0ZXMsIDAsIHNpemVvZihwci0+cG93ZXIuc3RhdGVzKSk7Ci0KLQkvKiBzZXQgdGhlIGZpcnN0IEMtU3RhdGUgdG8gQzEgKi8KLQlwci0+cG93ZXIuc3RhdGVzW0FDUElfU1RBVEVfQzFdLnR5cGUgPSBBQ1BJX1NUQVRFX0MxOwotCi0JLyogdGhlIEMwIHN0YXRlIG9ubHkgZXhpc3RzIGFzIGEgZmlsbGVyIGluIG91ciBhcnJheSwKLQkgKiBhbmQgYWxsIHByb2Nlc3NvcnMgbmVlZCB0byBzdXBwb3J0IEMxICovCisJaWYgKCFwci0+cG93ZXIuc3RhdGVzW0FDUElfU1RBVEVfQzFdLnZhbGlkKSB7CisJCS8qIHNldCB0aGUgZmlyc3QgQy1TdGF0ZSB0byBDMSAqLworCQkvKiBhbGwgcHJvY2Vzc29ycyBuZWVkIHRvIHN1cHBvcnQgQzEgKi8KKwkJcHItPnBvd2VyLnN0YXRlc1tBQ1BJX1NUQVRFX0MxXS50eXBlID0gQUNQSV9TVEFURV9DMTsKKwkJcHItPnBvd2VyLnN0YXRlc1tBQ1BJX1NUQVRFX0MxXS52YWxpZCA9IDE7CisJfQorCS8qIHRoZSBDMCBzdGF0ZSBvbmx5IGV4aXN0cyBhcyBhIGZpbGxlciBpbiBvdXIgYXJyYXkgKi8KIAlwci0+cG93ZXIuc3RhdGVzW0FDUElfU1RBVEVfQzBdLnZhbGlkID0gMTsKLQlwci0+cG93ZXIuc3RhdGVzW0FDUElfU1RBVEVfQzFdLnZhbGlkID0gMTsKLQogCXJldHVybiAwOwogfQogCkBAIC02NTgsMTIgKzY2NSw3IEBACiAJaWYgKG5vY3N0KQogCQlyZXR1cm4gLUVOT0RFVjsKIAotCWN1cnJlbnRfY291bnQgPSAxOwotCi0JLyogWmVybyBpbml0aWFsaXplIEMyIG9ud2FyZHMgYW5kIHByZXBhcmUgZm9yIGZyZXNoIENTVCBsb29rdXAgKi8KLQlmb3IgKGkgPSAyOyBpIDwgQUNQSV9QUk9DRVNTT1JfTUFYX1BPV0VSOyBpKyspCi0JCW1lbXNldCgmKHByLT5wb3dlci5zdGF0ZXNbaV0pLCAwLCAKLQkJCQlzaXplb2Yoc3RydWN0IGFjcGlfcHJvY2Vzc29yX2N4KSk7CisJY3VycmVudF9jb3VudCA9IDA7CiAKIAlzdGF0dXMgPSBhY3BpX2V2YWx1YXRlX29iamVjdChwci0+aGFuZGxlLCAiX0NTVCIsIE5VTEwsICZidWZmZXIpOwogCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewpAQCAtNzE4LDIyICs3MjAsMzkgQEAKIAkJICAgIChyZWctPnNwYWNlX2lkICE9IEFDUElfQURSX1NQQUNFX0ZJWEVEX0hBUkRXQVJFKSkKIAkJCWNvbnRpbnVlOwogCi0JCWN4LmFkZHJlc3MgPSAocmVnLT5zcGFjZV9pZCA9PSBBQ1BJX0FEUl9TUEFDRV9GSVhFRF9IQVJEV0FSRSkgPwotCQkgICAgMCA6IHJlZy0+YWRkcmVzczsKLQogCQkvKiBUaGVyZSBzaG91bGQgYmUgYW4gZWFzeSB3YXkgdG8gZXh0cmFjdCBhbiBpbnRlZ2VyLi4uICovCiAJCW9iaiA9ICh1bmlvbiBhY3BpX29iamVjdCAqKSYoZWxlbWVudC0+cGFja2FnZS5lbGVtZW50c1sxXSk7CiAJCWlmIChvYmotPnR5cGUgIT0gQUNQSV9UWVBFX0lOVEVHRVIpCiAJCQljb250aW51ZTsKIAogCQljeC50eXBlID0gb2JqLT5pbnRlZ2VyLnZhbHVlOworCQkvKgorCQkgKiBTb21lIGJ1Z2d5IEJJT1NlcyB3b24ndCBsaXN0IEMxIGluIF9DU1QgLQorCQkgKiBMZXQgYWNwaV9wcm9jZXNzb3JfZ2V0X3Bvd2VyX2luZm9fZGVmYXVsdCgpIGhhbmRsZSB0aGVtIGxhdGVyCisJCSAqLworCQlpZiAoaSA9PSAxICYmIGN4LnR5cGUgIT0gQUNQSV9TVEFURV9DMSkKKwkJCWN1cnJlbnRfY291bnQrKzsKIAotCQlpZiAoKGN4LnR5cGUgIT0gQUNQSV9TVEFURV9DMSkgJiYKLQkJICAgIChyZWctPnNwYWNlX2lkICE9IEFDUElfQURSX1NQQUNFX1NZU1RFTV9JTykpCi0JCQljb250aW51ZTsKKwkJY3guYWRkcmVzcyA9IHJlZy0+YWRkcmVzczsKKwkJY3guaW5kZXggPSBjdXJyZW50X2NvdW50ICsgMTsKIAotCQlpZiAoKGN4LnR5cGUgPCBBQ1BJX1NUQVRFX0MyKSB8fCAoY3gudHlwZSA+IEFDUElfU1RBVEVfQzMpKQotCQkJY29udGludWU7CisJCWN4LnNwYWNlX2lkID0gQUNQSV9DU1RBVEVfU1lTVEVNSU87CisJCWlmIChyZWctPnNwYWNlX2lkID09IEFDUElfQURSX1NQQUNFX0ZJWEVEX0hBUkRXQVJFKSB7CisJCQlpZiAoYWNwaV9wcm9jZXNzb3JfZmZoX2NzdGF0ZV9wcm9iZQorCQkJCQkocHItPmlkLCAmY3gsIHJlZykgPT0gMCkgeworCQkJCWN4LnNwYWNlX2lkID0gQUNQSV9DU1RBVEVfRkZIOworCQkJfSBlbHNlIGlmIChjeC50eXBlICE9IEFDUElfU1RBVEVfQzEpIHsKKwkJCQkvKgorCQkJCSAqIEMxIGlzIGEgc3BlY2lhbCBjYXNlIHdoZXJlIEZJWEVEX0hBUkRXQVJFCisJCQkJICogY2FuIGJlIGhhbmRsZWQgaW4gbm9uLU1XQUlUIHdheSBhcyB3ZWxsLgorCQkJCSAqIEluIHRoYXQgY2FzZSwgc2F2ZSB0aGlzIF9DU1QgZW50cnkgaW5mby4KKwkJCQkgKiBUaGF0IGlzLCB3ZSByZXRhaW4gc3BhY2VfaWQgb2YgU1lTVEVNX0lPIGZvcgorCQkJCSAqIGhhbHQgYmFzZWQgQzEuCisJCQkJICogT3RoZXJ3aXNlLCBpZ25vcmUgdGhpcyBpbmZvIGFuZCBjb250aW51ZS4KKwkJCQkgKi8KKwkJCQljb250aW51ZTsKKwkJCX0KKwkJfQogCiAJCW9iaiA9ICh1bmlvbiBhY3BpX29iamVjdCAqKSYoZWxlbWVudC0+cGFja2FnZS5lbGVtZW50c1syXSk7CiAJCWlmIChvYmotPnR5cGUgIT0gQUNQSV9UWVBFX0lOVEVHRVIpCkBAIC05MzgsMTEgKzk1NywxNyBAQAogCS8qIE5PVEU6IHRoZSBpZGxlIHRocmVhZCBtYXkgbm90IGJlIHJ1bm5pbmcgd2hpbGUgY2FsbGluZwogCSAqIHRoaXMgZnVuY3Rpb24gKi8KIAotCS8qIEFkZGluZyBDMSBzdGF0ZSAqLwotCWFjcGlfcHJvY2Vzc29yX2dldF9wb3dlcl9pbmZvX2RlZmF1bHRfYzEocHIpOworCS8qIFplcm8gaW5pdGlhbGl6ZSBhbGwgdGhlIEMtc3RhdGVzIGluZm8uICovCisJbWVtc2V0KHByLT5wb3dlci5zdGF0ZXMsIDAsIHNpemVvZihwci0+cG93ZXIuc3RhdGVzKSk7CisKIAlyZXN1bHQgPSBhY3BpX3Byb2Nlc3Nvcl9nZXRfcG93ZXJfaW5mb19jc3QocHIpOwogCWlmIChyZXN1bHQgPT0gLUVOT0RFVikKLQkJYWNwaV9wcm9jZXNzb3JfZ2V0X3Bvd2VyX2luZm9fZmFkdChwcik7CisJCXJlc3VsdCA9IGFjcGlfcHJvY2Vzc29yX2dldF9wb3dlcl9pbmZvX2ZhZHQocHIpOworCisJaWYgKHJlc3VsdCkKKwkJcmV0dXJuIHJlc3VsdDsKKworCWFjcGlfcHJvY2Vzc29yX2dldF9wb3dlcl9pbmZvX2RlZmF1bHQocHIpOwogCiAJcHItPnBvd2VyLmNvdW50ID0gYWNwaV9wcm9jZXNzb3JfcG93ZXJfdmVyaWZ5KHByKTsKIApAQCAtMTA4Myw2ICsxMTA4LDcgQEAKIAkucmVsZWFzZSA9IHNpbmdsZV9yZWxlYXNlLAogfTsKIAorI2lmZGVmIENPTkZJR19TTVAKIHN0YXRpYyB2b2lkIHNtcF9jYWxsYmFjayh2b2lkICp2KQogewogCS8qIHdlIGFscmVhZHkgd29rZSB0aGUgQ1BVIHVwLCBub3RoaW5nIG1vcmUgdG8gZG8gKi8KQEAgLTExMDQsOCArMTEzMCw5IEBACiBzdGF0aWMgc3RydWN0IG5vdGlmaWVyX2Jsb2NrIGFjcGlfcHJvY2Vzc29yX2xhdGVuY3lfbm90aWZpZXIgPSB7CiAJLm5vdGlmaWVyX2NhbGwgPSBhY3BpX3Byb2Nlc3Nvcl9sYXRlbmN5X25vdGlmeSwKIH07CisjZW5kaWYKIAotaW50IGFjcGlfcHJvY2Vzc29yX3Bvd2VyX2luaXQoc3RydWN0IGFjcGlfcHJvY2Vzc29yICpwciwKK2ludCBfX2NwdWluaXQgYWNwaV9wcm9jZXNzb3JfcG93ZXJfaW5pdChzdHJ1Y3QgYWNwaV9wcm9jZXNzb3IgKnByLAogCQkJICAgICAgc3RydWN0IGFjcGlfZGV2aWNlICpkZXZpY2UpCiB7CiAJYWNwaV9zdGF0dXMgc3RhdHVzID0gMDsKQEAgLTExMjEsNyArMTE0OCw5IEBACiAJCQkgICAgICAgIkFDUEk6IHByb2Nlc3NvciBsaW1pdGVkIHRvIG1heCBDLXN0YXRlICVkXG4iLAogCQkJICAgICAgIG1heF9jc3RhdGUpOwogCQlmaXJzdF9ydW4rKzsKKyNpZmRlZiBDT05GSUdfU01QCiAJCXJlZ2lzdGVyX2xhdGVuY3lfbm90aWZpZXIoJmFjcGlfcHJvY2Vzc29yX2xhdGVuY3lfbm90aWZpZXIpOworI2VuZGlmCiAJfQogCiAJaWYgKCFwcikKQEAgLTExOTMsNyArMTIyMiw5IEBACiAJCSAqIGNvcGllcyBvZiBwbV9pZGxlIGJlZm9yZSBwcm9jZWVkaW5nLgogCQkgKi8KIAkJY3B1X2lkbGVfd2FpdCgpOworI2lmZGVmIENPTkZJR19TTVAKIAkJdW5yZWdpc3Rlcl9sYXRlbmN5X25vdGlmaWVyKCZhY3BpX3Byb2Nlc3Nvcl9sYXRlbmN5X25vdGlmaWVyKTsKKyNlbmRpZgogCX0KIAogCXJldHVybiAwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL3Nicy5jIGIvZHJpdmVycy9hY3BpL3Nicy5jCmluZGV4IDYyYmVmMGIuLjg5MDhhOTcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9zYnMuYworKysgYi9kcml2ZXJzL2FjcGkvc2JzLmMKQEAgLTk4LDExICs5OCwxMSBAQAogc3RhdGljIGludCB1cGRhdGVfdGltZSA9IFVQREFURV9USU1FOwogc3RhdGljIGludCB1cGRhdGVfdGltZTIgPSBVUERBVEVfVElNRTI7CiAKLW1vZHVsZV9wYXJhbShjYXBhY2l0eV9tb2RlLCBpbnQsIENBUEFDSVRZX1VOSVQpOwotbW9kdWxlX3BhcmFtKHVwZGF0ZV9tb2RlLCBpbnQsIFVQREFURV9NT0RFKTsKLW1vZHVsZV9wYXJhbSh1cGRhdGVfaW5mb19tb2RlLCBpbnQsIFVQREFURV9JTkZPX01PREUpOwotbW9kdWxlX3BhcmFtKHVwZGF0ZV90aW1lLCBpbnQsIFVQREFURV9USU1FKTsKLW1vZHVsZV9wYXJhbSh1cGRhdGVfdGltZTIsIGludCwgVVBEQVRFX1RJTUUyKTsKK21vZHVsZV9wYXJhbShjYXBhY2l0eV9tb2RlLCBpbnQsIDApOworbW9kdWxlX3BhcmFtKHVwZGF0ZV9tb2RlLCBpbnQsIDApOworbW9kdWxlX3BhcmFtKHVwZGF0ZV9pbmZvX21vZGUsIGludCwgMCk7Cittb2R1bGVfcGFyYW0odXBkYXRlX3RpbWUsIGludCwgMCk7Cittb2R1bGVfcGFyYW0odXBkYXRlX3RpbWUyLCBpbnQsIDApOwogCiBzdGF0aWMgaW50IGFjcGlfc2JzX2FkZChzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldmljZSk7CiBzdGF0aWMgaW50IGFjcGlfc2JzX3JlbW92ZShzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldmljZSwgaW50IHR5cGUpOwpAQCAtMTY4NSwxMCArMTY4NSwxNiBAQAogCiBpbnQgYWNwaV9zYnNfcmVtb3ZlKHN0cnVjdCBhY3BpX2RldmljZSAqZGV2aWNlLCBpbnQgdHlwZSkKIHsKLQlzdHJ1Y3QgYWNwaV9zYnMgKnNicyA9IChzdHJ1Y3QgYWNwaV9zYnMgKilhY3BpX2RyaXZlcl9kYXRhKGRldmljZSk7CisJc3RydWN0IGFjcGlfc2JzICpzYnMgPSBOVUxMOwogCWludCBpZDsKIAotCWlmICghZGV2aWNlIHx8ICFzYnMpIHsKKwlpZiAoIWRldmljZSkgeworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlzYnMgPSAoc3RydWN0IGFjcGlfc2JzICopYWNwaV9kcml2ZXJfZGF0YShkZXZpY2UpOworCisJaWYgKCFzYnMpIHsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvdGFibGVzL3RiZ2V0LmMgYi9kcml2ZXJzL2FjcGkvdGFibGVzL3RiZ2V0LmMKaW5kZXggNzg1NmRiNy4uMTFlMmQ0NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL3RhYmxlcy90YmdldC5jCisrKyBiL2RyaXZlcnMvYWNwaS90YWJsZXMvdGJnZXQuYwpAQCAtMzI0LDcgKzMyNCw3IEBACiAKIAlpZiAoaGVhZGVyLT5sZW5ndGggPCBzaXplb2Yoc3RydWN0IGFjcGlfdGFibGVfaGVhZGVyKSkgewogCQlBQ1BJX0VSUk9SKChBRV9JTkZPLAotCQkJICAgICJUYWJsZSBsZW5ndGggKCVYKSBpcyBzbWFsbGVyIHRoYW4gbWluaW11bSAoJVgpIiwKKwkJCSAgICAiVGFibGUgbGVuZ3RoICglWCkgaXMgc21hbGxlciB0aGFuIG1pbmltdW0gKCV6WCkiLAogCQkJICAgIGhlYWRlci0+bGVuZ3RoLCBzaXplb2Yoc3RydWN0IGFjcGlfdGFibGVfaGVhZGVyKSkpOwogCiAJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9JTlZBTElEX1RBQkxFX0xFTkdUSCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvdGFibGVzL3RicnNkdC5jIGIvZHJpdmVycy9hY3BpL3RhYmxlcy90YnJzZHQuYwppbmRleCAwYWQzZGJiLi44NmE1ZmNhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvdGFibGVzL3RicnNkdC5jCisrKyBiL2RyaXZlcnMvYWNwaS90YWJsZXMvdGJyc2R0LmMKQEAgLTE4Nyw3ICsxODcsNyBAQAogCiAJaWYgKHRhYmxlX3B0ci0+bGVuZ3RoIDwgc2l6ZW9mKHN0cnVjdCBhY3BpX3RhYmxlX2hlYWRlcikpIHsKIAkJQUNQSV9FUlJPUigoQUVfSU5GTywKLQkJCSAgICAiUlNEVC9YU0RUIGxlbmd0aCAoJVgpIGlzIHNtYWxsZXIgdGhhbiBtaW5pbXVtICglWCkiLAorCQkJICAgICJSU0RUL1hTRFQgbGVuZ3RoICglWCkgaXMgc21hbGxlciB0aGFuIG1pbmltdW0gKCV6WCkiLAogCQkJICAgIHRhYmxlX3B0ci0+bGVuZ3RoLAogCQkJICAgIHNpemVvZihzdHJ1Y3QgYWNwaV90YWJsZV9oZWFkZXIpKSk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYXRhL0tjb25maWcgYi9kcml2ZXJzL2F0YS9LY29uZmlnCmluZGV4IDNmNGFhMGMuLjAzZjYzMzggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYXRhL0tjb25maWcKKysrIGIvZHJpdmVycy9hdGEvS2NvbmZpZwpAQCAtNiw2ICs2LDcgQEAKIAogY29uZmlnIEFUQQogCXRyaXN0YXRlICJBVEEgZGV2aWNlIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBCTE9DSwogCWRlcGVuZHMgb24gIShNMzJSIHx8IE02OEspIHx8IEJST0tFTgogCWRlcGVuZHMgb24gIVNVTjQgfHwgQlJPS0VOCiAJc2VsZWN0IFNDU0kKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYXRhL2FoY2kuYyBiL2RyaXZlcnMvYXRhL2FoY2kuYwppbmRleCAyNTkyOTEyLi4yMzQxOTdlIDEwMDY0NAotLS0gYS9kcml2ZXJzL2F0YS9haGNpLmMKKysrIGIvZHJpdmVycy9hdGEvYWhjaS5jCkBAIC0zMzQsNiArMzM0LDE0IEBACiAJeyBQQ0lfVkRFVklDRShOVklESUEsIDB4MDQ0ZCksIGJvYXJkX2FoY2kgfSwJCS8qIE1DUDY1ICovCiAJeyBQQ0lfVkRFVklDRShOVklESUEsIDB4MDQ0ZSksIGJvYXJkX2FoY2kgfSwJCS8qIE1DUDY1ICovCiAJeyBQQ0lfVkRFVklDRShOVklESUEsIDB4MDQ0ZiksIGJvYXJkX2FoY2kgfSwJCS8qIE1DUDY1ICovCisJeyBQQ0lfVkRFVklDRShOVklESUEsIDB4MDU1NCksIGJvYXJkX2FoY2kgfSwJCS8qIE1DUDY3ICovCisJeyBQQ0lfVkRFVklDRShOVklESUEsIDB4MDU1NSksIGJvYXJkX2FoY2kgfSwJCS8qIE1DUDY3ICovCisJeyBQQ0lfVkRFVklDRShOVklESUEsIDB4MDU1NiksIGJvYXJkX2FoY2kgfSwJCS8qIE1DUDY3ICovCisJeyBQQ0lfVkRFVklDRShOVklESUEsIDB4MDU1NyksIGJvYXJkX2FoY2kgfSwJCS8qIE1DUDY3ICovCisJeyBQQ0lfVkRFVklDRShOVklESUEsIDB4MDU1OCksIGJvYXJkX2FoY2kgfSwJCS8qIE1DUDY3ICovCisJeyBQQ0lfVkRFVklDRShOVklESUEsIDB4MDU1OSksIGJvYXJkX2FoY2kgfSwJCS8qIE1DUDY3ICovCisJeyBQQ0lfVkRFVklDRShOVklESUEsIDB4MDU1YSksIGJvYXJkX2FoY2kgfSwJCS8qIE1DUDY3ICovCisJeyBQQ0lfVkRFVklDRShOVklESUEsIDB4MDU1YiksIGJvYXJkX2FoY2kgfSwJCS8qIE1DUDY3ICovCiAKIAkvKiBTaVMgKi8KIAl7IFBDSV9WREVWSUNFKFNJLCAweDExODQpLCBib2FyZF9haGNpIH0sIC8qIFNpUyA5NjYgKi8KQEAgLTczNiw4ICs3NDQsNyBAQAogCX0KIAogCS8qIGNoZWNrIEJVU1kvRFJRLCBwZXJmb3JtIENvbW1hbmQgTGlzdCBPdmVycmlkZSBpZiBuZWNlc3NhcnkgKi8KLQlhaGNpX3RmX3JlYWQoYXAsICZ0Zik7Ci0JaWYgKHRmLmNvbW1hbmQgJiAoQVRBX0JVU1kgfCBBVEFfRFJRKSkgeworCWlmIChhaGNpX2NoZWNrX3N0YXR1cyhhcCkgJiAoQVRBX0JVU1kgfCBBVEFfRFJRKSkgewogCQlyYyA9IGFoY2lfY2xvKGFwKTsKIAogCQlpZiAocmMgPT0gLUVPUE5PVFNVUFApIHsKQEAgLTEwNDEsNyArMTA0OCw3IEBACiAJLyogaG1tbS4uLiBhIHNwdXJpb3VzIGludGVydXB0ICovCiAKIAkvKiBzb21lIGRldmljZXMgc2VuZCBEMkggcmVnIHdpdGggSSBiaXQgc2V0IGR1cmluZyBOQ1EgY29tbWFuZCBwaGFzZSAqLwotCWlmIChhcC0+c2FjdGl2ZSAmJiBzdGF0dXMgJiBQT1JUX0lSUV9EMkhfUkVHX0ZJUykKKwlpZiAoYXAtPnNhY3RpdmUgJiYgKHN0YXR1cyAmIFBPUlRfSVJRX0QySF9SRUdfRklTKSkKIAkJcmV0dXJuOwogCiAJLyogaWdub3JlIGludGVyaW0gUElPIHNldHVwIGZpcyBpbnRlcnJ1cHRzICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2F0YS9hdGFfcGlpeC5jIGIvZHJpdmVycy9hdGEvYXRhX3BpaXguYwppbmRleCA1NzE5NzA0Li43MjAxNzRkIDEwMDY0NAotLS0gYS9kcml2ZXJzL2F0YS9hdGFfcGlpeC5jCisrKyBiL2RyaXZlcnMvYXRhL2F0YV9waWl4LmMKQEAgLTEyNiw4ICsxMjYsNyBAQAogCWljaDZfc2F0YQkJPSA3LAogCWljaDZfc2F0YV9haGNpCQk9IDgsCiAJaWNoNm1fc2F0YV9haGNpCQk9IDksCi0JaWNoN21fc2F0YV9haGNpCQk9IDEwLAotCWljaDhfc2F0YV9haGNpCQk9IDExLAorCWljaDhfc2F0YV9haGNpCQk9IDEwLAogCiAJLyogY29uc3RhbnRzIGZvciBtYXBwaW5nIHRhYmxlICovCiAJUDAJCQk9IDAsICAvKiBwb3J0IDAgKi8KQEAgLTIyNyw3ICsyMjYsNyBAQAogCS8qIDgyODAxR0IvR1IvR0ggKElDSDcsIGlkZW50aWNhbCB0byBJQ0g2KSAqLwogCXsgMHg4MDg2LCAweDI3YzAsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIGljaDZfc2F0YV9haGNpIH0sCiAJLyogMjgwMUdCTS9HSE0gKElDSDdNLCBpZGVudGljYWwgdG8gSUNINk0pICovCi0JeyAweDgwODYsIDB4MjdjNCwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgaWNoN21fc2F0YV9haGNpIH0sCisJeyAweDgwODYsIDB4MjdjNCwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgaWNoNm1fc2F0YV9haGNpIH0sCiAJLyogRW50ZXJwcmlzZSBTb3V0aGJyaWRnZSAyICh3aGVyZSdzIHRoZSBkYXRhc2hlZXQ/KSAqLwogCXsgMHg4MDg2LCAweDI2ODAsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIGljaDZfc2F0YV9haGNpIH0sCiAJLyogU0FUQSBDb250cm9sbGVyIDEgSURFIChJQ0g4LCBubyBkYXRhc2hlZXQgeWV0KSAqLwpAQCAtMzk5LDIzICszOTgsMTAgQEAKIAkubWFzayA9IDB4MywKIAkucG9ydF9lbmFibGUgPSAweDUsCiAJLnByZXNlbnRfc2hpZnQgPSA0LAotCS5tYXAgPSB7Ci0JCS8qIFBNICAgUFMgICBTTSAgIFNTICAgICAgIE1BUCAqLwotCQl7ICBQMCwgIFAyLCAgUlYsICBSViB9LCAvKiAwMGIgKi8KLQkJeyAgUlYsICBSViwgIFJWLCAgUlYgfSwKLQkJeyAgUDAsICBQMiwgSURFLCBJREUgfSwgLyogMTBiICovCi0JCXsgIFJWLCAgUlYsICBSViwgIFJWIH0sCi0JfSwKLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgcGlpeF9tYXBfZGIgaWNoN21fbWFwX2RiID0gewotCS5tYXNrID0gMHgzLAotCS5wb3J0X2VuYWJsZSA9IDB4NSwKLQkucHJlc2VudF9zaGlmdCA9IDQsCiAKIAkvKiBNYXAgMDFiIGlzbid0IHNwZWNpZmllZCBpbiB0aGUgZG9jIGJ1dCBzb21lIG5vdGVib29rcyB1c2UKLQkgKiBpdCBhbnl3YXkuICBBVE0sIHRoZSBvbmx5IGNhc2Ugc3BvdHRlZCBjYXJyaWVzIHN1YnN5c3RlbSBJRAotCSAqIDEwMjU6MDEwNy4gIFRoaXMgaXMgdGhlIG9ubHkgZGlmZmVyZW5jZSBmcm9tIGljaDZtLgorCSAqIGl0IGFueXdheS4gIE1BUCAwMWIgaGF2ZSBiZWVuIHNwb3R0ZWQgb24gYm90aCBJQ0g2TSBhbmQKKwkgKiBJQ0g3TS4KIAkgKi8KIAkubWFwID0gewogCQkvKiBQTSAgIFBTICAgU00gICBTUyAgICAgICBNQVAgKi8KQEAgLTQzMiw5ICs0MTgsOSBAQAogCS5wcmVzZW50X3NoaWZ0ID0gOCwKIAkubWFwID0gewogCQkvKiBQTSAgIFBTICAgU00gICBTUyAgICAgICBNQVAgKi8KLQkJeyAgUDAsICBOQSwgIFAxLCAgTkEgfSwgLyogMDBiIChoYXJkd2lyZWQpICovCisJCXsgIFAwLCAgUDIsICBQMSwgIFAzIH0sIC8qIDAwYiAoaGFyZHdpcmVkIHdoZW4gaW4gQUhDSSkgKi8KIAkJeyAgUlYsICBSViwgIFJWLCAgUlYgfSwKLQkJeyAgUlYsICBSViwgIFJWLCAgUlYgfSwgLyogMTBiIChuZXZlcikgKi8KKwkJeyAgSURFLCAgSURFLCAgTkEsICBOQSB9LCAvKiAxMGIgKElERSBtb2RlKSAqLwogCQl7ICBSViwgIFJWLCAgUlYsICBSViB9LAogCX0sCiB9OwpAQCAtNDQ1LDcgKzQzMSw2IEBACiAJW2ljaDZfc2F0YV0JCT0gJmljaDZfbWFwX2RiLAogCVtpY2g2X3NhdGFfYWhjaV0JPSAmaWNoNl9tYXBfZGIsCiAJW2ljaDZtX3NhdGFfYWhjaV0JPSAmaWNoNm1fbWFwX2RiLAotCVtpY2g3bV9zYXRhX2FoY2ldCT0gJmljaDdtX21hcF9kYiwKIAlbaWNoOF9zYXRhX2FoY2ldCT0gJmljaDhfbWFwX2RiLAogfTsKIApAQCAtNTU2LDE5ICs1NDEsNyBAQAogCQkucG9ydF9vcHMJPSAmcGlpeF9zYXRhX29wcywKIAl9LAogCi0JLyogaWNoN21fc2F0YV9haGNpOiAxMCAqLwotCXsKLQkJLnNodAkJPSAmcGlpeF9zaHQsCi0JCS5mbGFncwkJPSBBVEFfRkxBR19TQVRBIHwKLQkJCQkgIFBJSVhfRkxBR19DSEVDS0lOVFIgfCBQSUlYX0ZMQUdfU0NSIHwKLQkJCQkgIFBJSVhfRkxBR19BSENJLAotCQkucGlvX21hc2sJPSAweDFmLAkvKiBwaW8wLTQgKi8KLQkJLm13ZG1hX21hc2sJPSAweDA3LCAvKiBtd2RtYTAtMiAqLwotCQkudWRtYV9tYXNrCT0gMHg3ZiwJLyogdWRtYTAtNiAqLwotCQkucG9ydF9vcHMJPSAmcGlpeF9zYXRhX29wcywKLQl9LAotCi0JLyogaWNoOF9zYXRhX2FoY2k6IDExICovCisJLyogaWNoOF9zYXRhX2FoY2k6IDEwICovCiAJewogCQkuc2h0CQk9ICZwaWl4X3NodCwKIAkJLmZsYWdzCQk9IEFUQV9GTEFHX1NBVEEgfApkaWZmIC0tZ2l0IGEvZHJpdmVycy9hdGEvbGliYXRhLWNvcmUuYyBiL2RyaXZlcnMvYXRhL2xpYmF0YS1jb3JlLmMKaW5kZXggNzcxMzhhMy4uOTE1YTU1YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9hdGEvbGliYXRhLWNvcmUuYworKysgYi9kcml2ZXJzL2F0YS9saWJhdGEtY29yZS5jCkBAIC04NzAsNyArODcwLDExIEBACiAJCSAqIHRoZSBQSU8gdGltaW5nIG51bWJlciBmb3IgdGhlIG1heGltdW0uIFR1cm4gaXQgaW50bwogCQkgKiBhIG1hc2suCiAJCSAqLwotCQlwaW9fbWFzayA9ICgyIDw8IChpZFtBVEFfSURfT0xEX1BJT19NT0RFU10gJiAweEZGKSkgLSAxIDsKKwkJdTggbW9kZSA9IGlkW0FUQV9JRF9PTERfUElPX01PREVTXSAmIDB4RkY7CisJCWlmIChtb2RlIDwgNSkJLyogVmFsaWQgUElPIHJhbmdlICovCisgICAgICAgICAgICAgICAgCXBpb19tYXNrID0gKDIgPDwgbW9kZSkgLSAxOworCQllbHNlCisJCQlwaW9fbWFzayA9IDE7CiAKIAkJLyogQnV0IHdhaXQuLiB0aGVyZSdzIG1vcmUuIERlc2lnbiB5b3VyIHN0YW5kYXJkcyBieQogCQkgKiBjb21taXR0ZWUgYW5kIHlvdSB0b28gY2FuIGdldCBhIGZyZWUgaW9yZHkgZmllbGQgdG8KQEAgLTU5NTMsNyArNTk1Nyw3IEBACiAJZGVzdHJveV93b3JrcXVldWUoYXRhX2F1eF93cSk7CiB9CiAKLW1vZHVsZV9pbml0KGF0YV9pbml0KTsKK3N1YnN5c19pbml0Y2FsbChhdGFfaW5pdCk7CiBtb2R1bGVfZXhpdChhdGFfZXhpdCk7CiAKIHN0YXRpYyB1bnNpZ25lZCBsb25nIHJhdGVsaW1pdF90aW1lOwpAQCAtNjExOCw3ICs2MTIyLDYgQEAKIEVYUE9SVF9TWU1CT0xfR1BMKGF0YV9zdGRfc29mdHJlc2V0KTsKIEVYUE9SVF9TWU1CT0xfR1BMKHNhdGFfc3RkX2hhcmRyZXNldCk7CiBFWFBPUlRfU1lNQk9MX0dQTChhdGFfc3RkX3Bvc3RyZXNldCk7Ci1FWFBPUlRfU1lNQk9MX0dQTChhdGFfZGV2X3JldmFsaWRhdGUpOwogRVhQT1JUX1NZTUJPTF9HUEwoYXRhX2Rldl9jbGFzc2lmeSk7CiBFWFBPUlRfU1lNQk9MX0dQTChhdGFfZGV2X3BhaXIpOwogRVhQT1JUX1NZTUJPTF9HUEwoYXRhX3BvcnRfZGlzYWJsZSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2F0YS9saWJhdGEtc2NzaS5jIGIvZHJpdmVycy9hdGEvbGliYXRhLXNjc2kuYwppbmRleCBiMGQwY2M0Li41YzFmYzQ2IDEwMDY0NAotLS0gYS9kcml2ZXJzL2F0YS9saWJhdGEtc2NzaS5jCisrKyBiL2RyaXZlcnMvYXRhL2xpYmF0YS1zY3NpLmMKQEAgLTE2NCwxMCArMTY0LDEwIEBACiB7CiAJaW50IHJjID0gMDsKIAl1OCBzY3NpX2NtZFtNQVhfQ09NTUFORF9TSVpFXTsKLQl1OCBhcmdzWzRdLCAqYXJnYnVmID0gTlVMTDsKKwl1OCBhcmdzWzRdLCAqYXJnYnVmID0gTlVMTCwgKnNlbnNlYnVmID0gTlVMTDsKIAlpbnQgYXJnc2l6ZSA9IDA7Ci0Jc3RydWN0IHNjc2lfc2Vuc2VfaGRyIHNzaGRyOwogCWVudW0gZG1hX2RhdGFfZGlyZWN0aW9uIGRhdGFfZGlyOworCWludCBjbWRfcmVzdWx0OwogCiAJaWYgKGFyZyA9PSBOVUxMKQogCQlyZXR1cm4gLUVJTlZBTDsKQEAgLTE3NSw2ICsxNzUsMTAgQEAKIAlpZiAoY29weV9mcm9tX3VzZXIoYXJncywgYXJnLCBzaXplb2YoYXJncykpKQogCQlyZXR1cm4gLUVGQVVMVDsKIAorCXNlbnNlYnVmID0ga3phbGxvYyhTQ1NJX1NFTlNFX0JVRkZFUlNJWkUsIEdGUF9OT0lPKTsKKwlpZiAoIXNlbnNlYnVmKQorCQlyZXR1cm4gLUVOT01FTTsKKwogCW1lbXNldChzY3NpX2NtZCwgMCwgc2l6ZW9mKHNjc2lfY21kKSk7CiAKIAlpZiAoYXJnc1szXSkgewpAQCAtMTkxLDcgKzE5NSw3IEBACiAJCWRhdGFfZGlyID0gRE1BX0ZST01fREVWSUNFOwogCX0gZWxzZSB7CiAJCXNjc2lfY21kWzFdICA9ICgzIDw8IDEpOyAvKiBOb24tZGF0YSAqLwotCQkvKiBzY3NpX2NtZFsyXSBpcyBhbHJlYWR5IDAgLS0gbm8gb2ZmLmxpbmUsIGNjLCBvciBkYXRhIHhmZXIgKi8KKwkJc2NzaV9jbWRbMl0gID0gMHgyMDsgICAgIC8qIGNjIGJ1dCBubyBvZmYubGluZSBvciBkYXRhIHhmZXIgKi8KIAkJZGF0YV9kaXIgPSBETUFfTk9ORTsKIAl9CiAKQEAgLTIxMCwxOCArMjE0LDQ2IEBACiAKIAkvKiBHb29kIHZhbHVlcyBmb3IgdGltZW91dCBhbmQgcmV0cmllcz8gIFZhbHVlcyBiZWxvdwogCSAgIGZyb20gc2NzaV9pb2N0bF9zZW5kX2NvbW1hbmQoKSBmb3IgZGVmYXVsdCBjYXNlLi4uICovCi0JaWYgKHNjc2lfZXhlY3V0ZV9yZXEoc2NzaWRldiwgc2NzaV9jbWQsIGRhdGFfZGlyLCBhcmdidWYsIGFyZ3NpemUsCi0JCQkgICAgICZzc2hkciwgKDEwKkhaKSwgNSkpIHsKKwljbWRfcmVzdWx0ID0gc2NzaV9leGVjdXRlKHNjc2lkZXYsIHNjc2lfY21kLCBkYXRhX2RpciwgYXJnYnVmLCBhcmdzaXplLAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vuc2VidWYsICgxMCpIWiksIDUsIDApOworCisJaWYgKGRyaXZlcl9ieXRlKGNtZF9yZXN1bHQpID09IERSSVZFUl9TRU5TRSkgey8qIHNlbnNlIGRhdGEgYXZhaWxhYmxlICovCisJCXU4ICpkZXNjID0gc2Vuc2VidWYgKyA4OworCQljbWRfcmVzdWx0ICY9IH4oMHhGRjw8MjQpOyAvKiBEUklWRVJfU0VOU0UgaXMgbm90IGFuIGVycm9yICovCisKKwkJLyogSWYgd2Ugc2V0IGNjIHRoZW4gQVRBIHBhc3MtdGhyb3VnaCB3aWxsIGNhdXNlIGEKKwkJICogY2hlY2sgY29uZGl0aW9uIGV2ZW4gaWYgbm8gZXJyb3IuIEZpbHRlciB0aGF0LiAqLworCQlpZiAoY21kX3Jlc3VsdCAmIFNBTV9TVEFUX0NIRUNLX0NPTkRJVElPTikgeworCQkJc3RydWN0IHNjc2lfc2Vuc2VfaGRyIHNzaGRyOworCQkJc2NzaV9ub3JtYWxpemVfc2Vuc2Uoc2Vuc2VidWYsIFNDU0lfU0VOU0VfQlVGRkVSU0laRSwKKwkJCSAgICAgICAgICAgICAgICAgICAgICAmc3NoZHIpOworCQkJaWYgKHNzaGRyLnNlbnNlX2tleT09MCAmJgorCQkJICAgIHNzaGRyLmFzYz09MCAmJiBzc2hkci5hc2NxPT0wKQorCQkJCWNtZF9yZXN1bHQgJj0gflNBTV9TVEFUX0NIRUNLX0NPTkRJVElPTjsKKwkJfQorCisJCS8qIFNlbmQgdXNlcnNwYWNlIGEgZmV3IEFUQSByZWdpc3RlcnMgKHNhbWUgYXMgZHJpdmVycy9pZGUpICovCisJCWlmIChzZW5zZWJ1ZlswXSA9PSAweDcyICYmICAgICAvKiBmb3JtYXQgaXMgImRlc2NyaXB0b3IiICovCisJCSAgICBkZXNjWzBdID09IDB4MDkgKSB7ICAgICAgICAvKiBjb2RlIGlzICJBVEEgRGVzY3JpcHRvciIgKi8KKwkJCWFyZ3NbMF0gPSBkZXNjWzEzXTsgICAgLyogc3RhdHVzICovCisJCQlhcmdzWzFdID0gZGVzY1szXTsgICAgIC8qIGVycm9yICovCisJCQlhcmdzWzJdID0gZGVzY1s1XTsgICAgIC8qIHNlY3RvciBjb3VudCAoMDo3KSAqLworCQkJaWYgKGNvcHlfdG9fdXNlcihhcmcsIGFyZ3MsIHNpemVvZihhcmdzKSkpCisJCQkJcmMgPSAtRUZBVUxUOworCQl9CisJfQorCisKKwlpZiAoY21kX3Jlc3VsdCkgewogCQlyYyA9IC1FSU87CiAJCWdvdG8gZXJyb3I7CiAJfQogCi0JLyogTmVlZCBjb2RlIHRvIHJldHJpZXZlIGRhdGEgZnJvbSBjaGVjayBjb25kaXRpb24/ICovCi0KIAlpZiAoKGFyZ2J1ZikKIAkgJiYgY29weV90b191c2VyKGFyZyArIHNpemVvZihhcmdzKSwgYXJnYnVmLCBhcmdzaXplKSkKIAkJcmMgPSAtRUZBVUxUOwogZXJyb3I6CisJa2ZyZWUoc2Vuc2VidWYpOwogCWtmcmVlKGFyZ2J1Zik7CiAJcmV0dXJuIHJjOwogfQpAQCAtMTU4MCw5ICsxNjEyLDkgQEAKIAogZXJyX2RpZDoKIAlhdGFfcWNfZnJlZShxYyk7Ci1lcnJfbWVtOgogCWNtZC0+cmVzdWx0ID0gKERJRF9FUlJPUiA8PCAxNik7CiAJZG9uZShjbWQpOworZXJyX21lbToKIAlEUFJJTlRLKCJFWElUIC0gaW50ZXJuYWxcbiIpOwogCXJldHVybiAwOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2F0YS9saWJhdGEtc2ZmLmMgYi9kcml2ZXJzL2F0YS9saWJhdGEtc2ZmLmMKaW5kZXggMDZkYWFhMy4uNzY0NWYyYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9hdGEvbGliYXRhLXNmZi5jCisrKyBiL2RyaXZlcnMvYXRhL2xpYmF0YS1zZmYuYwpAQCAtOTgxLDYgKzk4MSwxNSBAQAogCQltYXNrID0gKDEgPDwgMikgfCAoMSA8PCAwKTsKIAkJaWYgKCh0bXA4ICYgbWFzaykgIT0gbWFzaykKIAkJCWxlZ2FjeV9tb2RlID0gKDEgPDwgMyk7CisjaWYgZGVmaW5lZChDT05GSUdfTk9fQVRBX0xFR0FDWSkKKwkJLyogU29tZSBwbGF0Zm9ybXMgd2l0aCBQQ0kgbGltaXRzIGNhbm5vdCBhZGRyZXNzIGNvbXBhdAorCQkgICBwb3J0IHNwYWNlLiBJbiB0aGF0IGNhc2Ugd2UgcHVudCBpZiB0aGVpciBmaXJtd2FyZSBoYXMKKwkJICAgbGVmdCBhIGRldmljZSBpbiBjb21wYXRpYmlsaXR5IG1vZGUgKi8KKwkJaWYgKGxlZ2FjeV9tb2RlKSB7CisJCQlwcmludGsoS0VSTl9FUlIgImF0YTogQ29tcGF0aWJpbGl0eSBtb2RlIEFUQSBpcyBub3Qgc3VwcG9ydGVkIG9uIHRoaXMgcGxhdGZvcm0sIHNraXBwaW5nLlxuIik7CisJCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisJCX0KKyNlbmRpZgogCX0KIAogCXJjID0gcGNpX3JlcXVlc3RfcmVnaW9ucyhwZGV2LCBEUlZfTkFNRSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2F0YS9saWJhdGEuaCBiL2RyaXZlcnMvYXRhL2xpYmF0YS5oCmluZGV4IGE1ZWNiNzEuLjBlZDI2M2IgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYXRhL2xpYmF0YS5oCisrKyBiL2RyaXZlcnMvYXRhL2xpYmF0YS5oCkBAIC01Myw2ICs1Myw3IEBACiBleHRlcm4gdW5zaWduZWQgaW50IGF0YV9kb19zaW1wbGVfY21kKHN0cnVjdCBhdGFfZGV2aWNlICpkZXYsIHU4IGNtZCk7CiBleHRlcm4gaW50IGF0YV9kZXZfcmVhZF9pZChzdHJ1Y3QgYXRhX2RldmljZSAqZGV2LCB1bnNpZ25lZCBpbnQgKnBfY2xhc3MsCiAJCQkgICBpbnQgcG9zdF9yZXNldCwgdTE2ICppZCk7CitleHRlcm4gaW50IGF0YV9kZXZfcmV2YWxpZGF0ZShzdHJ1Y3QgYXRhX2RldmljZSAqZGV2LCBpbnQgcG9zdF9yZXNldCk7CiBleHRlcm4gaW50IGF0YV9kZXZfY29uZmlndXJlKHN0cnVjdCBhdGFfZGV2aWNlICpkZXYsIGludCBwcmludF9pbmZvKTsKIGV4dGVybiBpbnQgc2F0YV9kb3duX3NwZF9saW1pdChzdHJ1Y3QgYXRhX3BvcnQgKmFwKTsKIGV4dGVybiBpbnQgc2F0YV9zZXRfc3BkX25lZWRlZChzdHJ1Y3QgYXRhX3BvcnQgKmFwKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYXRhL3BhdGFfYW1kLmMgYi9kcml2ZXJzL2F0YS9wYXRhX2FtZC5jCmluZGV4IDI5MjM0YzguLjVjNDdhOWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYXRhL3BhdGFfYW1kLmMKKysrIGIvZHJpdmVycy9hdGEvcGF0YV9hbWQuYwpAQCAtNjc3LDYgKzY3Nyw4IEBACiAJeyBQQ0lfVkRFVklDRShOVklESUEsCVBDSV9ERVZJQ0VfSURfTlZJRElBX05GT1JDRV9NQ1A1MV9JREUpLAk4IH0sCiAJeyBQQ0lfVkRFVklDRShOVklESUEsCVBDSV9ERVZJQ0VfSURfTlZJRElBX05GT1JDRV9NQ1A1NV9JREUpLAk4IH0sCiAJeyBQQ0lfVkRFVklDRShOVklESUEsCVBDSV9ERVZJQ0VfSURfTlZJRElBX05GT1JDRV9NQ1A2MV9JREUpLAk4IH0sCisJeyBQQ0lfVkRFVklDRShOVklESUEsCVBDSV9ERVZJQ0VfSURfTlZJRElBX05GT1JDRV9NQ1A2NV9JREUpLAk4IH0sCisJeyBQQ0lfVkRFVklDRShOVklESUEsCVBDSV9ERVZJQ0VfSURfTlZJRElBX05GT1JDRV9NQ1A2N19JREUpLAk4IH0sCiAJeyBQQ0lfVkRFVklDRShBTUQsCVBDSV9ERVZJQ0VfSURfQU1EX0NTNTUzNl9JREUpLAkJOSB9LAogCiAJeyB9LApkaWZmIC0tZ2l0IGEvZHJpdmVycy9hdGEvcGF0YV9hcnRvcC5jIGIvZHJpdmVycy9hdGEvcGF0YV9hcnRvcC5jCmluZGV4IDY5MDgyOGUuLjk2YTA5ODAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYXRhL3BhdGFfYXJ0b3AuYworKysgYi9kcml2ZXJzL2F0YS9wYXRhX2FydG9wLmMKQEAgLTkyLDcgKzkyLDcgQEAKIAkJcmV0dXJuIC1FTk9FTlQ7CiAKIAlwY2lfcmVhZF9jb25maWdfYnl0ZShwZGV2LCAweDQ5LCAmdG1wKTsKLQlpZiAodG1wICYgKDEgPj4gYXAtPnBvcnRfbm8pKQorCWlmICh0bXAgJiAoMSA8PCBhcC0+cG9ydF9ubykpCiAJCWFwLT5jYmwgPSBBVEFfQ0JMX1BBVEE0MDsKIAllbHNlCiAJCWFwLT5jYmwgPSBBVEFfQ0JMX1BBVEE4MDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYXRhL3BhdGFfaHB0Mzd4LmMgYi9kcml2ZXJzL2F0YS9wYXRhX2hwdDM3eC5jCmluZGV4IDczNTA0NDMuLmZjZTNmY2QgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYXRhL3BhdGFfaHB0Mzd4LmMKKysrIGIvZHJpdmVycy9hdGEvcGF0YV9ocHQzN3guYwpAQCAtMjUsNyArMjUsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2xpYmF0YS5oPgogCiAjZGVmaW5lIERSVl9OQU1FCSJwYXRhX2hwdDM3eCIKLSNkZWZpbmUgRFJWX1ZFUlNJT04JIjAuNSIKKyNkZWZpbmUgRFJWX1ZFUlNJT04JIjAuNS4xIgogCiBzdHJ1Y3QgaHB0X2Nsb2NrIHsKIAl1OAl4ZmVyX3NwZWVkOwpAQCAtNDUzLDcgKzQ1MywxMyBAQAogewogCXU4IHNjcjIsIGF0YTY2OwogCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gdG9fcGNpX2RldihhcC0+aG9zdC0+ZGV2KTsKLQorCXN0YXRpYyBjb25zdCBzdHJ1Y3QgcGNpX2JpdHMgaHB0Mzd4X2VuYWJsZV9iaXRzW10gPSB7CisJCXsgMHg1MCwgMSwgMHgwNCwgMHgwNCB9LAorCQl7IDB4NTQsIDEsIDB4MDQsIDB4MDQgfQorCX07CisJaWYgKCFwY2lfdGVzdF9jb25maWdfYml0cyhwZGV2LCAmaHB0Mzd4X2VuYWJsZV9iaXRzW2FwLT5wb3J0X25vXSkpCisJCXJldHVybiAtRU5PRU5UOworCQkKIAlwY2lfcmVhZF9jb25maWdfYnl0ZShwZGV2LCAweDVCLCAmc2NyMik7CiAJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKHBkZXYsIDB4NUIsIHNjcjIgJiB+MHgwMSk7CiAJLyogQ2FibGUgcmVnaXN0ZXIgbm93IGFjdGl2ZSAqLwpAQCAtNDg4LDEwICs0OTQsMTcgQEAKIAogc3RhdGljIGludCBocHQzNzRfcHJlX3Jlc2V0KHN0cnVjdCBhdGFfcG9ydCAqYXApCiB7CisJc3RhdGljIGNvbnN0IHN0cnVjdCBwY2lfYml0cyBocHQzN3hfZW5hYmxlX2JpdHNbXSA9IHsKKwkJeyAweDUwLCAxLCAweDA0LCAweDA0IH0sCisJCXsgMHg1NCwgMSwgMHgwNCwgMHgwNCB9CisJfTsKIAl1MTYgbWNyMywgbWNyNjsKIAl1OCBhdGE2NjsKLQogCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gdG9fcGNpX2RldihhcC0+aG9zdC0+ZGV2KTsKKworCWlmICghcGNpX3Rlc3RfY29uZmlnX2JpdHMocGRldiwgJmhwdDM3eF9lbmFibGVfYml0c1thcC0+cG9ydF9ub10pKQorCQlyZXR1cm4gLUVOT0VOVDsKKwkJCiAJLyogRG8gdGhlIGV4dHJhIGNoYW5uZWwgd29yayAqLwogCXBjaV9yZWFkX2NvbmZpZ193b3JkKHBkZXYsIDB4NTIsICZtY3IzKTsKIAlwY2lfcmVhZF9jb25maWdfd29yZChwZGV2LCAweDU2LCAmbWNyNik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2F0YS9wYXRhX3FkaS5jIGIvZHJpdmVycy9hdGEvcGF0YV9xZGkuYwppbmRleCA3OTc3ZjQ3Li4yYzNjYzBjIDEwMDY0NAotLS0gYS9kcml2ZXJzL2F0YS9wYXRhX3FkaS5jCisrKyBiL2RyaXZlcnMvYXRhL3BhdGFfcWRpLmMKQEAgLTE0MSw3ICsxNDEsNyBAQAogCQkJCW1lbWNweSgmcGFkLCBidWYgKyBidWZsZW4gLSBzbG9wLCBzbG9wKTsKIAkJCQlvdXRsKGxlMzJfdG9fY3B1KHBhZCksIGFwLT5pb2FkZHIuZGF0YV9hZGRyKTsKIAkJCX0gZWxzZSB7Ci0JCQkJcGFkID0gY3B1X3RvX2xlMTYoaW5sKGFwLT5pb2FkZHIuZGF0YV9hZGRyKSk7CisJCQkJcGFkID0gY3B1X3RvX2xlMzIoaW5sKGFwLT5pb2FkZHIuZGF0YV9hZGRyKSk7CiAJCQkJbWVtY3B5KGJ1ZiArIGJ1ZmxlbiAtIHNsb3AsICZwYWQsIHNsb3ApOwogCQkJfQogCQl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2F0YS9zYXRhX252LmMgYi9kcml2ZXJzL2F0YS9zYXRhX252LmMKaW5kZXggMzIzYjYwNy4uZDY1ZWJmZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9hdGEvc2F0YV9udi5jCisrKyBiL2RyaXZlcnMvYXRhL3NhdGFfbnYuYwpAQCAtMTE3LDEwICsxMTcsMTQgQEAKIAl7IFBDSV9WREVWSUNFKE5WSURJQSwgUENJX0RFVklDRV9JRF9OVklESUFfTkZPUkNFX01DUDYxX1NBVEEpLCBHRU5FUklDIH0sCiAJeyBQQ0lfVkRFVklDRShOVklESUEsIFBDSV9ERVZJQ0VfSURfTlZJRElBX05GT1JDRV9NQ1A2MV9TQVRBMiksIEdFTkVSSUMgfSwKIAl7IFBDSV9WREVWSUNFKE5WSURJQSwgUENJX0RFVklDRV9JRF9OVklESUFfTkZPUkNFX01DUDYxX1NBVEEzKSwgR0VORVJJQyB9LAotCXsgUENJX1ZERVZJQ0UoTlZJRElBLCAweDA0NWMpLCBHRU5FUklDIH0sCi0JeyBQQ0lfVkRFVklDRShOVklESUEsIDB4MDQ1ZCksIEdFTkVSSUMgfSwKLQl7IFBDSV9WREVWSUNFKE5WSURJQSwgMHgwNDVlKSwgR0VORVJJQyB9LAotCXsgUENJX1ZERVZJQ0UoTlZJRElBLCAweDA0NWYpLCBHRU5FUklDIH0sCisJeyBQQ0lfVkRFVklDRShOVklESUEsIDB4MDQ1YyksIEdFTkVSSUMgfSwgLyogTUNQNjUgKi8KKwl7IFBDSV9WREVWSUNFKE5WSURJQSwgMHgwNDVkKSwgR0VORVJJQyB9LCAvKiBNQ1A2NSAqLworCXsgUENJX1ZERVZJQ0UoTlZJRElBLCAweDA0NWUpLCBHRU5FUklDIH0sIC8qIE1DUDY1ICovCisJeyBQQ0lfVkRFVklDRShOVklESUEsIDB4MDQ1ZiksIEdFTkVSSUMgfSwgLyogTUNQNjUgKi8KKwl7IFBDSV9WREVWSUNFKE5WSURJQSwgMHgwNTUwKSwgR0VORVJJQyB9LCAvKiBNQ1A2NyAqLworCXsgUENJX1ZERVZJQ0UoTlZJRElBLCAweDA1NTEpLCBHRU5FUklDIH0sIC8qIE1DUDY3ICovCisJeyBQQ0lfVkRFVklDRShOVklESUEsIDB4MDU1MiksIEdFTkVSSUMgfSwgLyogTUNQNjcgKi8KKwl7IFBDSV9WREVWSUNFKE5WSURJQSwgMHgwNTUzKSwgR0VORVJJQyB9LCAvKiBNQ1A2NyAqLwogCXsgUENJX1ZFTkRPUl9JRF9OVklESUEsIFBDSV9BTllfSUQsCiAJCVBDSV9BTllfSUQsIFBDSV9BTllfSUQsCiAJCVBDSV9DTEFTU19TVE9SQUdFX0lERTw8OCwgMHhmZmZmMDAsIEdFTkVSSUMgfSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYXRhL3NhdGFfcHJvbWlzZS5jIGIvZHJpdmVycy9hdGEvc2F0YV9wcm9taXNlLmMKaW5kZXggOGJjZGZhNjQ2Li43MmVkYTUxIDEwMDY0NAotLS0gYS9kcml2ZXJzL2F0YS9zYXRhX3Byb21pc2UuYworKysgYi9kcml2ZXJzL2F0YS9zYXRhX3Byb21pc2UuYwpAQCAtMjYwLDYgKzI2MCw3IEBACiAjaWYgMAogCXsgUENJX1ZERVZJQ0UoUFJPTUlTRSwgMHgzNTcwKSwgYm9hcmRfMjA3NzEgfSwKICNlbmRpZgorCXsgUENJX1ZERVZJQ0UoUFJPTUlTRSwgMHgzNTc3KSwgYm9hcmRfMjA3NzEgfSwKIAogCXsgfQkvKiB0ZXJtaW5hdGUgbGlzdCAqLwogfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYXRhL3NhdGFfc2lzLmMgYi9kcml2ZXJzL2F0YS9zYXRhX3Npcy5jCmluZGV4IDA3MzhmNTIuLjlkMTIzNWIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYXRhL3NhdGFfc2lzLmMKKysrIGIvZHJpdmVycy9hdGEvc2F0YV9zaXMuYwpAQCAtMjQwLDcgKzI0MCw3IEBACiAJc3RydWN0IGF0YV9wcm9iZV9lbnQgKnByb2JlX2VudCA9IE5VTEw7CiAJaW50IHJjOwogCXUzMiBnZW5jdGw7Ci0Jc3RydWN0IGF0YV9wb3J0X2luZm8gKnBwaVsyXTsKKwlzdHJ1Y3QgYXRhX3BvcnRfaW5mbyBwaSA9IHNpc19wb3J0X2luZm8sICpwcGlbMl0gPSB7ICZwaSwgJnBpIH07CiAJaW50IHBjaV9kZXZfYnVzeSA9IDA7CiAJdTggcG1yOwogCXU4IHBvcnQyX3N0YXJ0OwpAQCAtMjY1LDI3ICsyNjUsMjAgQEAKIAlpZiAocmMpCiAJCWdvdG8gZXJyX291dF9yZWdpb25zOwogCi0JcHBpWzBdID0gcHBpWzFdID0gJnNpc19wb3J0X2luZm87Ci0JcHJvYmVfZW50ID0gYXRhX3BjaV9pbml0X25hdGl2ZV9tb2RlKHBkZXYsIHBwaSwgQVRBX1BPUlRfUFJJTUFSWSB8IEFUQV9QT1JUX1NFQ09OREFSWSk7Ci0JaWYgKCFwcm9iZV9lbnQpIHsKLQkJcmMgPSAtRU5PTUVNOwotCQlnb3RvIGVycl9vdXRfcmVnaW9uczsKLQl9Ci0KIAkvKiBjaGVjayBhbmQgc2VlIGlmIHRoZSBTQ1JzIGFyZSBpbiBJTyBzcGFjZSBvciBQQ0kgY2ZnIHNwYWNlICovCiAJcGNpX3JlYWRfY29uZmlnX2R3b3JkKHBkZXYsIFNJU19HRU5DVEwsICZnZW5jdGwpOwogCWlmICgoZ2VuY3RsICYgR0VOQ1RMX0lPTUFQUEVEX1NDUikgPT0gMCkKLQkJcHJvYmVfZW50LT5wb3J0X2ZsYWdzIHw9IFNJU19GTEFHX0NGR1NDUjsKKwkJcGkuZmxhZ3MgfD0gU0lTX0ZMQUdfQ0ZHU0NSOwogCiAJLyogaWYgaGFyZHdhcmUgdGhpbmtzIFNDUnMgYXJlIGluIElPIHNwYWNlLCBidXQgdGhlcmUgYXJlCiAJICogbm8gSU8gcmVzb3VyY2VzIGFzc2lnbmVkLCBjaGFuZ2UgdG8gUENJIGNmZyBzcGFjZS4KIAkgKi8KLQlpZiAoKCEocHJvYmVfZW50LT5wb3J0X2ZsYWdzICYgU0lTX0ZMQUdfQ0ZHU0NSKSkgJiYKKwlpZiAoKCEocGkuZmxhZ3MgJiBTSVNfRkxBR19DRkdTQ1IpKSAmJgogCSAgICAoKHBjaV9yZXNvdXJjZV9zdGFydChwZGV2LCBTSVNfU0NSX1BDSV9CQVIpID09IDApIHx8CiAJICAgICAocGNpX3Jlc291cmNlX2xlbihwZGV2LCBTSVNfU0NSX1BDSV9CQVIpIDwgMTI4KSkpIHsKIAkJZ2VuY3RsICY9IH5HRU5DVExfSU9NQVBQRURfU0NSOwogCQlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKHBkZXYsIFNJU19HRU5DVEwsIGdlbmN0bCk7Ci0JCXByb2JlX2VudC0+cG9ydF9mbGFncyB8PSBTSVNfRkxBR19DRkdTQ1I7CisJCXBpLmZsYWdzIHw9IFNJU19GTEFHX0NGR1NDUjsKIAl9CiAKIAlwY2lfcmVhZF9jb25maWdfYnl0ZShwZGV2LCBTSVNfUE1SLCAmcG1yKTsKQEAgLTMwNiw2ICsyOTksMTIgQEAKIAkJcG9ydDJfc3RhcnQgPSAweDIwOwogCX0KIAorCXByb2JlX2VudCA9IGF0YV9wY2lfaW5pdF9uYXRpdmVfbW9kZShwZGV2LCBwcGksIEFUQV9QT1JUX1BSSU1BUlkgfCBBVEFfUE9SVF9TRUNPTkRBUlkpOworCWlmICghcHJvYmVfZW50KSB7CisJCXJjID0gLUVOT01FTTsKKwkJZ290byBlcnJfb3V0X3JlZ2lvbnM7CisJfQorCiAJaWYgKCEocHJvYmVfZW50LT5wb3J0X2ZsYWdzICYgU0lTX0ZMQUdfQ0ZHU0NSKSkgewogCQlwcm9iZV9lbnQtPnBvcnRbMF0uc2NyX2FkZHIgPQogCQkJcGNpX3Jlc291cmNlX3N0YXJ0KHBkZXYsIFNJU19TQ1JfUENJX0JBUik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2F0YS9zYXRhX3ZpYS5jIGIvZHJpdmVycy9hdGEvc2F0YV92aWEuYwppbmRleCBmNDQ1NWExLi4xYzdmMTlhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2F0YS9zYXRhX3ZpYS5jCisrKyBiL2RyaXZlcnMvYXRhL3NhdGFfdmlhLmMKQEAgLTIzMCw3ICsyMzAsNyBAQAogCWludCBvbmxpbmU7CiAKIAkvKiBkb24ndCBkbyBhbnkgU0NSIHN0dWZmIGlmIHdlJ3JlIG5vdCBsb2FkaW5nICovCi0JaWYgKCFBVEFfUEZMQUdfTE9BRElORykKKwlpZiAoIShhcC0+cGZsYWdzICYgQVRBX1BGTEFHX0xPQURJTkcpKQogCQlnb3RvIHNraXBfc2NyOwogCiAJLyogUmVzdW1lIHBoeS4gIFRoaXMgaXMgdGhlIG9sZCByZXN1bWUgc2VxdWVuY2UgZnJvbQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hdG0vYW1iYXNzYWRvci5jIGIvZHJpdmVycy9hdG0vYW1iYXNzYWRvci5jCmluZGV4IDMyMzU5MmQuLjlmZmZhN2FmIDEwMDY0NAotLS0gYS9kcml2ZXJzL2F0bS9hbWJhc3NhZG9yLmMKKysrIGIvZHJpdmVycy9hdG0vYW1iYXNzYWRvci5jCkBAIC0yNDUyLDggKzI0NTIsOCBAQAogc3RhdGljIHZvaWQgX19leGl0IGFtYl9tb2R1bGVfZXhpdCAodm9pZCkKIHsKICAgUFJJTlREIChEQkdfRkxPV3xEQkdfSU5JVCwgImNsZWFudXBfbW9kdWxlIik7Ci0gIAotICByZXR1cm4gcGNpX3VucmVnaXN0ZXJfZHJpdmVyKCZhbWJfZHJpdmVyKTsKKworICBwY2lfdW5yZWdpc3Rlcl9kcml2ZXIoJmFtYl9kcml2ZXIpOwogfQogCiBtb2R1bGVfaW5pdChhbWJfbW9kdWxlX2luaXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hdG0vZmlyZXN0cmVhbS5jIGIvZHJpdmVycy9hdG0vZmlyZXN0cmVhbS5jCmluZGV4IDQwYWI5YjYuLjY5N2FkODIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYXRtL2ZpcmVzdHJlYW0uYworKysgYi9kcml2ZXJzL2F0bS9maXJlc3RyZWFtLmMKQEAgLTEwMDIsNiArMTAwMiwxMCBAQAogCQkJCQlyID0gUk9VTkRfVVA7CiAJCQkJfQogCQkJCWVycm9yID0gbWFrZV9yYXRlIChwY3IsIHIsICZ0bWMwLCBOVUxMKTsKKwkJCQlpZiAoZXJyb3IpIHsKKwkJCQkJa2ZyZWUodGMpOworCQkJCQlyZXR1cm4gZXJyb3I7CisJCQkJfQogCQkJfQogCQkJZnNfZHByaW50ayAoRlNfREVCVUdfT1BFTiwgInBjciA9ICVkLlxuIiwgcGNyKTsKIAkJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hdG0vaG9yaXpvbi5jIGIvZHJpdmVycy9hdG0vaG9yaXpvbi5jCmluZGV4IGY1OTM0OTIuLjRkYzEwMTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYXRtL2hvcml6b24uYworKysgYi9kcml2ZXJzL2F0bS9ob3Jpem9uLmMKQEAgLTE3ODksNyArMTc4OSw3IEBACiAJV1JJVEVfSVRfV0FJVChkZXYsIGN0cmwgfCBTRUVQUk9NX1NLKTsKIH0KIAotc3RhdGljIHUxNiBfX2luaXQgcmVhZF9iaWEgKGNvbnN0IGhyel9kZXYgKiBkZXYsIHUxNiBhZGRyKQorc3RhdGljIHUxNiBfX2RldmluaXQgcmVhZF9iaWEgKGNvbnN0IGhyel9kZXYgKiBkZXYsIHUxNiBhZGRyKQogewogICB1MzIgY3RybCA9IHJkX3JlZ2wgKGRldiwgQ09OVFJPTF8wX1JFRyk7CiAgIApAQCAtMjkzMiw4ICsyOTMyLDggQEAKIAogc3RhdGljIHZvaWQgX19leGl0IGhyel9tb2R1bGVfZXhpdCAodm9pZCkgewogICBQUklOVEQgKERCR19GTE9XLCAiY2xlYW51cF9tb2R1bGUiKTsKLSAgCi0gIHJldHVybiBwY2lfdW5yZWdpc3Rlcl9kcml2ZXIoJmhyel9kcml2ZXIpOworCisgIHBjaV91bnJlZ2lzdGVyX2RyaXZlcigmaHJ6X2RyaXZlcik7CiB9CiAKIG1vZHVsZV9pbml0KGhyel9tb2R1bGVfaW5pdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2F0bS9uaWNzdGFyLmMgYi9kcml2ZXJzL2F0bS9uaWNzdGFyLmMKaW5kZXggNjMyZWRlNS4uYmQwOTA0NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9hdG0vbmljc3Rhci5jCisrKyBiL2RyaXZlcnMvYXRtL25pY3N0YXIuYwpAQCAtMjc1OSw3ICsyNzU5LDcgQEAKIHsKICAgIG5zX2RldiAqY2FyZDsKICAgIHBvb2xfbGV2ZWxzIHBsOwotICAgaW50IGJ0eXBlOworICAgbG9uZyBidHlwZTsKICAgIHVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKICAgIGNhcmQgPSBkZXYtPmRldl9kYXRhOwpAQCAtMjg1OSw3ICsyODU5LDcgQEAKICAgICAgIGNhc2UgTlNfQURKQlVGTEVWOgogICAgICAgICAgaWYgKCFjYXBhYmxlKENBUF9ORVRfQURNSU4pKQogCSAgICByZXR1cm4gLUVQRVJNOwotICAgICAgICAgYnR5cGUgPSAoaW50KSBhcmc7CS8qIGFuIGludCBpcyB0aGUgc2FtZSBzaXplIGFzIGEgcG9pbnRlciAqLworICAgICAgICAgYnR5cGUgPSAobG9uZykgYXJnOwkvKiBhIGxvbmcgaXMgdGhlIHNhbWUgc2l6ZSBhcyBhIHBvaW50ZXIgb3IgYmlnZ2VyICovCiAgICAgICAgICBzd2l0Y2ggKGJ0eXBlKQogCSB7CiAJICAgIGNhc2UgTlNfQlVGVFlQRV9TTUFMTDoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmFzZS9LY29uZmlnIGIvZHJpdmVycy9iYXNlL0tjb25maWcKaW5kZXggMGI0ZTIyNC4uMTQyOWYzYTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmFzZS9LY29uZmlnCisrKyBiL2RyaXZlcnMvYmFzZS9LY29uZmlnCkBAIC0zNyw4ICszNyw4IEBACiAKIAkgIElmIHlvdSBhcmUgdW5zdXJlIGFib3V0IHRoaXMsIHNheSBOIGhlcmUuCiAKLWVuZG1lbnUKLQogY29uZmlnIFNZU19IWVBFUlZJU09SCiAJYm9vbAogCWRlZmF1bHQgbgorCitlbmRtZW51CmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jhc2UvYnVzLmMgYi9kcml2ZXJzL2Jhc2UvYnVzLmMKaW5kZXggMTIxNzNkMS4uN2Q4YTdjZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9iYXNlL2J1cy5jCisrKyBiL2RyaXZlcnMvYmFzZS9idXMuYwpAQCAtMzcyLDE5ICszNzIsMzAgQEAKIAkJcHJfZGVidWcoImJ1cyAlczogYWRkIGRldmljZSAlc1xuIiwgYnVzLT5uYW1lLCBkZXYtPmJ1c19pZCk7CiAJCWVycm9yID0gZGV2aWNlX2FkZF9hdHRycyhidXMsIGRldik7CiAJCWlmIChlcnJvcikKLQkJCWdvdG8gb3V0OworCQkJZ290byBvdXRfcHV0OwogCQllcnJvciA9IHN5c2ZzX2NyZWF0ZV9saW5rKCZidXMtPmRldmljZXMua29iaiwKIAkJCQkJCSZkZXYtPmtvYmosIGRldi0+YnVzX2lkKTsKIAkJaWYgKGVycm9yKQotCQkJZ290byBvdXQ7CisJCQlnb3RvIG91dF9pZDsKIAkJZXJyb3IgPSBzeXNmc19jcmVhdGVfbGluaygmZGV2LT5rb2JqLAogCQkJCSZkZXYtPmJ1cy0+c3Vic3lzLmtzZXQua29iaiwgInN1YnN5c3RlbSIpOwogCQlpZiAoZXJyb3IpCi0JCQlnb3RvIG91dDsKKwkJCWdvdG8gb3V0X3N1YnN5czsKIAkJZXJyb3IgPSBzeXNmc19jcmVhdGVfbGluaygmZGV2LT5rb2JqLAogCQkJCSZkZXYtPmJ1cy0+c3Vic3lzLmtzZXQua29iaiwgImJ1cyIpOworCQlpZiAoZXJyb3IpCisJCQlnb3RvIG91dF9kZXByZWNhdGVkOwogCX0KLW91dDoKKwlyZXR1cm4gMDsKKworb3V0X2RlcHJlY2F0ZWQ6CisJc3lzZnNfcmVtb3ZlX2xpbmsoJmRldi0+a29iaiwgInN1YnN5c3RlbSIpOworb3V0X3N1YnN5czoKKwlzeXNmc19yZW1vdmVfbGluaygmYnVzLT5kZXZpY2VzLmtvYmosIGRldi0+YnVzX2lkKTsKK291dF9pZDoKKwlkZXZpY2VfcmVtb3ZlX2F0dHJzKGJ1cywgZGV2KTsKK291dF9wdXQ6CisJcHV0X2J1cyhkZXYtPmJ1cyk7CiAJcmV0dXJuIGVycm9yOwogfQogCkBAIC00MjgsOCArNDM5LDEwIEBACiAJCXN5c2ZzX3JlbW92ZV9saW5rKCZkZXYtPmtvYmosICJidXMiKTsKIAkJc3lzZnNfcmVtb3ZlX2xpbmsoJmRldi0+YnVzLT5kZXZpY2VzLmtvYmosIGRldi0+YnVzX2lkKTsKIAkJZGV2aWNlX3JlbW92ZV9hdHRycyhkZXYtPmJ1cywgZGV2KTsKLQkJZGV2LT5pc19yZWdpc3RlcmVkID0gMDsKLQkJa2xpc3RfZGVsKCZkZXYtPmtub2RlX2J1cyk7CisJCWlmIChkZXYtPmlzX3JlZ2lzdGVyZWQpIHsKKwkJCWRldi0+aXNfcmVnaXN0ZXJlZCA9IDA7CisJCQlrbGlzdF9kZWwoJmRldi0+a25vZGVfYnVzKTsKKwkJfQogCQlwcl9kZWJ1ZygiYnVzICVzOiByZW1vdmUgZGV2aWNlICVzXG4iLCBkZXYtPmJ1cy0+bmFtZSwgZGV2LT5idXNfaWQpOwogCQlkZXZpY2VfcmVsZWFzZV9kcml2ZXIoZGV2KTsKIAkJcHV0X2J1cyhkZXYtPmJ1cyk7CkBAIC01MDUsMzQgKzUxOCwzNiBAQAogCXN0cnVjdCBidXNfdHlwZSAqIGJ1cyA9IGdldF9idXMoZHJ2LT5idXMpOwogCWludCBlcnJvciA9IDA7CiAKLQlpZiAoYnVzKSB7Ci0JCXByX2RlYnVnKCJidXMgJXM6IGFkZCBkcml2ZXIgJXNcbiIsIGJ1cy0+bmFtZSwgZHJ2LT5uYW1lKTsKLQkJZXJyb3IgPSBrb2JqZWN0X3NldF9uYW1lKCZkcnYtPmtvYmosICIlcyIsIGRydi0+bmFtZSk7Ci0JCWlmIChlcnJvcikKLQkJCWdvdG8gb3V0X3B1dF9idXM7Ci0JCWRydi0+a29iai5rc2V0ID0gJmJ1cy0+ZHJpdmVyczsKLQkJaWYgKChlcnJvciA9IGtvYmplY3RfcmVnaXN0ZXIoJmRydi0+a29iaikpKQotCQkJZ290byBvdXRfcHV0X2J1czsKKwlpZiAoIWJ1cykKKwkJcmV0dXJuIDA7CiAKLQkJZXJyb3IgPSBkcml2ZXJfYXR0YWNoKGRydik7Ci0JCWlmIChlcnJvcikKLQkJCWdvdG8gb3V0X3VucmVnaXN0ZXI7Ci0JCWtsaXN0X2FkZF90YWlsKCZkcnYtPmtub2RlX2J1cywgJmJ1cy0+a2xpc3RfZHJpdmVycyk7Ci0JCW1vZHVsZV9hZGRfZHJpdmVyKGRydi0+b3duZXIsIGRydik7CisJcHJfZGVidWcoImJ1cyAlczogYWRkIGRyaXZlciAlc1xuIiwgYnVzLT5uYW1lLCBkcnYtPm5hbWUpOworCWVycm9yID0ga29iamVjdF9zZXRfbmFtZSgmZHJ2LT5rb2JqLCAiJXMiLCBkcnYtPm5hbWUpOworCWlmIChlcnJvcikKKwkJZ290byBvdXRfcHV0X2J1czsKKwlkcnYtPmtvYmoua3NldCA9ICZidXMtPmRyaXZlcnM7CisJaWYgKChlcnJvciA9IGtvYmplY3RfcmVnaXN0ZXIoJmRydi0+a29iaikpKQorCQlnb3RvIG91dF9wdXRfYnVzOwogCi0JCWVycm9yID0gZHJpdmVyX2FkZF9hdHRycyhidXMsIGRydik7Ci0JCWlmIChlcnJvcikgewotCQkJLyogSG93IHRoZSBoZWxsIGRvIHdlIGdldCBvdXQgb2YgdGhpcyBwaWNrbGU/IEdpdmUgdXAgKi8KLQkJCXByaW50ayhLRVJOX0VSUiAiJXM6IGRyaXZlcl9hZGRfYXR0cnMoJXMpIGZhaWxlZFxuIiwKLQkJCQlfX0ZVTkNUSU9OX18sIGRydi0+bmFtZSk7Ci0JCX0KLQkJZXJyb3IgPSBhZGRfYmluZF9maWxlcyhkcnYpOwotCQlpZiAoZXJyb3IpIHsKLQkJCS8qIERpdHRvICovCi0JCQlwcmludGsoS0VSTl9FUlIgIiVzOiBhZGRfYmluZF9maWxlcyglcykgZmFpbGVkXG4iLAotCQkJCV9fRlVOQ1RJT05fXywgZHJ2LT5uYW1lKTsKLQkJfQorCWVycm9yID0gZHJpdmVyX2F0dGFjaChkcnYpOworCWlmIChlcnJvcikKKwkJZ290byBvdXRfdW5yZWdpc3RlcjsKKwlrbGlzdF9hZGRfdGFpbCgmZHJ2LT5rbm9kZV9idXMsICZidXMtPmtsaXN0X2RyaXZlcnMpOworCW1vZHVsZV9hZGRfZHJpdmVyKGRydi0+b3duZXIsIGRydik7CisKKwllcnJvciA9IGRyaXZlcl9hZGRfYXR0cnMoYnVzLCBkcnYpOworCWlmIChlcnJvcikgeworCQkvKiBIb3cgdGhlIGhlbGwgZG8gd2UgZ2V0IG91dCBvZiB0aGlzIHBpY2tsZT8gR2l2ZSB1cCAqLworCQlwcmludGsoS0VSTl9FUlIgIiVzOiBkcml2ZXJfYWRkX2F0dHJzKCVzKSBmYWlsZWRcbiIsCisJCQlfX0ZVTkNUSU9OX18sIGRydi0+bmFtZSk7CiAJfQorCWVycm9yID0gYWRkX2JpbmRfZmlsZXMoZHJ2KTsKKwlpZiAoZXJyb3IpIHsKKwkJLyogRGl0dG8gKi8KKwkJcHJpbnRrKEtFUk5fRVJSICIlczogYWRkX2JpbmRfZmlsZXMoJXMpIGZhaWxlZFxuIiwKKwkJCV9fRlVOQ1RJT05fXywgZHJ2LT5uYW1lKTsKKwl9CisKIAlyZXR1cm4gZXJyb3I7CiBvdXRfdW5yZWdpc3RlcjoKIAlrb2JqZWN0X3VucmVnaXN0ZXIoJmRydi0+a29iaik7CkBAIC01NTIsMTYgKzU2NywxNyBAQAogCiB2b2lkIGJ1c19yZW1vdmVfZHJpdmVyKHN0cnVjdCBkZXZpY2VfZHJpdmVyICogZHJ2KQogewotCWlmIChkcnYtPmJ1cykgewotCQlyZW1vdmVfYmluZF9maWxlcyhkcnYpOwotCQlkcml2ZXJfcmVtb3ZlX2F0dHJzKGRydi0+YnVzLCBkcnYpOwotCQlrbGlzdF9yZW1vdmUoJmRydi0+a25vZGVfYnVzKTsKLQkJcHJfZGVidWcoImJ1cyAlczogcmVtb3ZlIGRyaXZlciAlc1xuIiwgZHJ2LT5idXMtPm5hbWUsIGRydi0+bmFtZSk7Ci0JCWRyaXZlcl9kZXRhY2goZHJ2KTsKLQkJbW9kdWxlX3JlbW92ZV9kcml2ZXIoZHJ2KTsKLQkJa29iamVjdF91bnJlZ2lzdGVyKCZkcnYtPmtvYmopOwotCQlwdXRfYnVzKGRydi0+YnVzKTsKLQl9CisJaWYgKCFkcnYtPmJ1cykKKwkJcmV0dXJuOworCisJcmVtb3ZlX2JpbmRfZmlsZXMoZHJ2KTsKKwlkcml2ZXJfcmVtb3ZlX2F0dHJzKGRydi0+YnVzLCBkcnYpOworCWtsaXN0X3JlbW92ZSgmZHJ2LT5rbm9kZV9idXMpOworCXByX2RlYnVnKCJidXMgJXM6IHJlbW92ZSBkcml2ZXIgJXNcbiIsIGRydi0+YnVzLT5uYW1lLCBkcnYtPm5hbWUpOworCWRyaXZlcl9kZXRhY2goZHJ2KTsKKwltb2R1bGVfcmVtb3ZlX2RyaXZlcihkcnYpOworCWtvYmplY3RfdW5yZWdpc3RlcigmZHJ2LT5rb2JqKTsKKwlwdXRfYnVzKGRydi0+YnVzKTsKIH0KIAogCkBAIC03MzIsMTEgKzc0OCwxNSBAQAogCiAJa2xpc3RfaW5pdCgmYnVzLT5rbGlzdF9kZXZpY2VzLCBrbGlzdF9kZXZpY2VzX2dldCwga2xpc3RfZGV2aWNlc19wdXQpOwogCWtsaXN0X2luaXQoJmJ1cy0+a2xpc3RfZHJpdmVycywgTlVMTCwgTlVMTCk7Ci0JYnVzX2FkZF9hdHRycyhidXMpOworCXJldHZhbCA9IGJ1c19hZGRfYXR0cnMoYnVzKTsKKwlpZiAocmV0dmFsKQorCQlnb3RvIGJ1c19hdHRyc19mYWlsOwogCiAJcHJfZGVidWcoImJ1cyB0eXBlICclcycgcmVnaXN0ZXJlZFxuIiwgYnVzLT5uYW1lKTsKIAlyZXR1cm4gMDsKIAorYnVzX2F0dHJzX2ZhaWw6CisJa3NldF91bnJlZ2lzdGVyKCZidXMtPmRyaXZlcnMpOwogYnVzX2RyaXZlcnNfZmFpbDoKIAlrc2V0X3VucmVnaXN0ZXIoJmJ1cy0+ZGV2aWNlcyk7CiBidXNfZGV2aWNlc19mYWlsOgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9iYXNlL2NsYXNzLmMgYi9kcml2ZXJzL2Jhc2UvY2xhc3MuYwppbmRleCBiMzJiNzdmLi4wZmYyNjdhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2Jhc2UvY2xhc3MuYworKysgYi9kcml2ZXJzL2Jhc2UvY2xhc3MuYwpAQCAtNTYyLDcgKzU2MiwxMCBAQAogCQlnb3RvIG91dDI7CiAKIAkvKiBhZGQgdGhlIG5lZWRlZCBhdHRyaWJ1dGVzIHRvIHRoaXMgZGV2aWNlICovCi0Jc3lzZnNfY3JlYXRlX2xpbmsoJmNsYXNzX2Rldi0+a29iaiwgJnBhcmVudF9jbGFzcy0+c3Vic3lzLmtzZXQua29iaiwgInN1YnN5c3RlbSIpOworCWVycm9yID0gc3lzZnNfY3JlYXRlX2xpbmsoJmNsYXNzX2Rldi0+a29iaiwKKwkJCQkgICZwYXJlbnRfY2xhc3MtPnN1YnN5cy5rc2V0LmtvYmosICJzdWJzeXN0ZW0iKTsKKwlpZiAoZXJyb3IpCisJCWdvdG8gb3V0MzsKIAljbGFzc19kZXYtPnVldmVudF9hdHRyLmF0dHIubmFtZSA9ICJ1ZXZlbnQiOwogCWNsYXNzX2Rldi0+dWV2ZW50X2F0dHIuYXR0ci5tb2RlID0gU19JV1VTUjsKIAljbGFzc19kZXYtPnVldmVudF9hdHRyLmF0dHIub3duZXIgPSBwYXJlbnRfY2xhc3MtPm93bmVyOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9iYXNlL2NvcmUuYyBiL2RyaXZlcnMvYmFzZS9jb3JlLmMKaW5kZXggYjIyNGJiNC4uNjhhZDExYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9iYXNlL2NvcmUuYworKysgYi9kcml2ZXJzL2Jhc2UvY29yZS5jCkBAIC00NCw3ICs0NCw3IEBACiAJcmV0dXJuIGRldi0+ZHJpdmVyID8gZGV2LT5kcml2ZXItPm5hbWUgOgogCQkJKGRldi0+YnVzID8gZGV2LT5idXMtPm5hbWUgOiAiIik7CiB9Ci1FWFBPUlRfU1lNQk9MX0dQTChkZXZfZHJpdmVyX3N0cmluZyk7CitFWFBPUlRfU1lNQk9MKGRldl9kcml2ZXJfc3RyaW5nKTsKIAogI2RlZmluZSB0b19kZXYob2JqKSBjb250YWluZXJfb2Yob2JqLCBzdHJ1Y3QgZGV2aWNlLCBrb2JqKQogI2RlZmluZSB0b19kZXZfYXR0cihfYXR0cikgY29udGFpbmVyX29mKF9hdHRyLCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSwgYXR0cikKQEAgLTQzMywxNCArNDMzLDE2IEBACiAJaWYgKGRldi0+ZHJpdmVyKQogCQlkZXYtPnVldmVudF9hdHRyLmF0dHIub3duZXIgPSBkZXYtPmRyaXZlci0+b3duZXI7CiAJZGV2LT51ZXZlbnRfYXR0ci5zdG9yZSA9IHN0b3JlX3VldmVudDsKLQlkZXZpY2VfY3JlYXRlX2ZpbGUoZGV2LCAmZGV2LT51ZXZlbnRfYXR0cik7CisJZXJyb3IgPSBkZXZpY2VfY3JlYXRlX2ZpbGUoZGV2LCAmZGV2LT51ZXZlbnRfYXR0cik7CisJaWYgKGVycm9yKQorCQlnb3RvIGF0dHJFcnJvcjsKIAogCWlmIChNQUpPUihkZXYtPmRldnQpKSB7CiAJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyOwogCQlhdHRyID0ga3phbGxvYyhzaXplb2YoKmF0dHIpLCBHRlBfS0VSTkVMKTsKIAkJaWYgKCFhdHRyKSB7CiAJCQllcnJvciA9IC1FTk9NRU07Ci0JCQlnb3RvIFBNRXJyb3I7CisJCQlnb3RvIHVldmVudGF0dHJFcnJvcjsKIAkJfQogCQlhdHRyLT5hdHRyLm5hbWUgPSAiZGV2IjsKIAkJYXR0ci0+YXR0ci5tb2RlID0gU19JUlVHTzsKQEAgLTQ1MCw3ICs0NTIsNyBAQAogCQllcnJvciA9IGRldmljZV9jcmVhdGVfZmlsZShkZXYsIGF0dHIpOwogCQlpZiAoZXJyb3IpIHsKIAkJCWtmcmVlKGF0dHIpOwotCQkJZ290byBhdHRyRXJyb3I7CisJCQlnb3RvIHVldmVudGF0dHJFcnJvcjsKIAkJfQogCiAJCWRldi0+ZGV2dF9hdHRyID0gYXR0cjsKQEAgLTQ3Nyw3ICs0NzksOCBAQAogCWlmICgoZXJyb3IgPSBidXNfYWRkX2RldmljZShkZXYpKSkKIAkJZ290byBCdXNFcnJvcjsKIAlrb2JqZWN0X3VldmVudCgmZGV2LT5rb2JqLCBLT0JKX0FERCk7Ci0JYnVzX2F0dGFjaF9kZXZpY2UoZGV2KTsKKwlpZiAoKGVycm9yID0gYnVzX2F0dGFjaF9kZXZpY2UoZGV2KSkpCisJCWdvdG8gQXR0YWNoRXJyb3I7CiAJaWYgKHBhcmVudCkKIAkJa2xpc3RfYWRkX3RhaWwoJmRldi0+a25vZGVfcGFyZW50LCAmcGFyZW50LT5rbGlzdF9jaGlsZHJlbik7CiAKQEAgLTQ5Niw2ICs0OTksOCBAQAogIAlrZnJlZShjbGFzc19uYW1lKTsKIAlwdXRfZGV2aWNlKGRldik7CiAJcmV0dXJuIGVycm9yOworIEF0dGFjaEVycm9yOgorCWJ1c19yZW1vdmVfZGV2aWNlKGRldik7CiAgQnVzRXJyb3I6CiAJZGV2aWNlX3BtX3JlbW92ZShkZXYpOwogIFBNRXJyb3I6CkBAIC01MDcsNiArNTEyLDggQEAKIAkJZGV2aWNlX3JlbW92ZV9maWxlKGRldiwgZGV2LT5kZXZ0X2F0dHIpOwogCQlrZnJlZShkZXYtPmRldnRfYXR0cik7CiAJfQorIHVldmVudGF0dHJFcnJvcjoKKwlkZXZpY2VfcmVtb3ZlX2ZpbGUoZGV2LCAmZGV2LT51ZXZlbnRfYXR0cik7CiAgYXR0ckVycm9yOgogCWtvYmplY3RfdWV2ZW50KCZkZXYtPmtvYmosIEtPQkpfUkVNT1ZFKTsKIAlrb2JqZWN0X2RlbCgmZGV2LT5rb2JqKTsKQEAgLTgwNSw4ICs4MTIsMTAgQEAKIAogCWlmIChkZXYtPmNsYXNzKSB7CiAJCW9sZF9zeW1saW5rX25hbWUgPSBrbWFsbG9jKEJVU19JRF9TSVpFLCBHRlBfS0VSTkVMKTsKLQkJaWYgKCFvbGRfc3ltbGlua19uYW1lKQotCQkJcmV0dXJuIC1FTk9NRU07CisJCWlmICghb2xkX3N5bWxpbmtfbmFtZSkgeworCQkJZXJyb3IgPSAtRU5PTUVNOworCQkJZ290byBvdXRfZnJlZV9vbGRfY2xhc3M7CisJCX0KIAkJc3RybGNweShvbGRfc3ltbGlua19uYW1lLCBkZXYtPmJ1c19pZCwgQlVTX0lEX1NJWkUpOwogCX0KIApAQCAtODMwLDkgKzgzOSwxMCBAQAogCX0KIAlwdXRfZGV2aWNlKGRldik7CiAKLQlrZnJlZShvbGRfY2xhc3NfbmFtZSk7CiAJa2ZyZWUobmV3X2NsYXNzX25hbWUpOwogCWtmcmVlKG9sZF9zeW1saW5rX25hbWUpOworIG91dF9mcmVlX29sZF9jbGFzczoKKwlrZnJlZShvbGRfY2xhc3NfbmFtZSk7CiAKIAlyZXR1cm4gZXJyb3I7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jhc2UvZGQuYyBiL2RyaXZlcnMvYmFzZS9kZC5jCmluZGV4IGI1ZjQzYzMuLmM1ZDZiYjQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmFzZS9kZC5jCisrKyBiL2RyaXZlcnMvYmFzZS9kZC5jCkBAIC0xOCw2ICsxOCw3IEBACiAjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgva3RocmVhZC5oPgorI2luY2x1ZGUgPGxpbnV4L3dhaXQuaD4KIAogI2luY2x1ZGUgImJhc2UuaCIKICNpbmNsdWRlICJwb3dlci9wb3dlci5oIgpAQCAtNzAsNiArNzEsOCBAQAogfTsKIAogc3RhdGljIGF0b21pY190IHByb2JlX2NvdW50ID0gQVRPTUlDX0lOSVQoMCk7CitzdGF0aWMgREVDTEFSRV9XQUlUX1FVRVVFX0hFQUQocHJvYmVfd2FpdHF1ZXVlKTsKKwogc3RhdGljIGludCByZWFsbHlfcHJvYmUodm9pZCAqdm9pZF9kYXRhKQogewogCXN0cnVjdCBzdHVwaWRfdGhyZWFkX3N0cnVjdHVyZSAqZGF0YSA9IHZvaWRfZGF0YTsKQEAgLTEyMSw2ICsxMjQsNyBAQAogZG9uZToKIAlrZnJlZShkYXRhKTsKIAlhdG9taWNfZGVjKCZwcm9iZV9jb3VudCk7CisJd2FrZV91cCgmcHJvYmVfd2FpdHF1ZXVlKTsKIAlyZXR1cm4gcmV0OwogfQogCkBAIC0xNzEsNiArMTc1LDggQEAKIAkJIGRydi0+YnVzLT5uYW1lLCBkZXYtPmJ1c19pZCwgZHJ2LT5uYW1lKTsKIAogCWRhdGEgPSBrbWFsbG9jKHNpemVvZigqZGF0YSksIEdGUF9LRVJORUwpOworCWlmICghZGF0YSkKKwkJcmV0dXJuIC1FTk9NRU07CiAJZGF0YS0+ZHJ2ID0gZHJ2OwogCWRhdGEtPmRldiA9IGRldjsKIApAQCAtMTc4LDcgKzE4NCw3IEBACiAJCXByb2JlX3Rhc2sgPSBrdGhyZWFkX3J1bihyZWFsbHlfcHJvYmUsIGRhdGEsCiAJCQkJCSAicHJvYmUtJXMiLCBkZXYtPmJ1c19pZCk7CiAJCWlmIChJU19FUlIocHJvYmVfdGFzaykpCi0JCQlyZXQgPSBQVFJfRVJSKHByb2JlX3Rhc2spOworCQkJcmV0ID0gcmVhbGx5X3Byb2JlKGRhdGEpOwogCX0gZWxzZQogCQlyZXQgPSByZWFsbHlfcHJvYmUoZGF0YSk7CiAKQEAgLTMzNSw2ICszNDEsMzIgQEAKIAl9CiB9CiAKKyNpZmRlZiBDT05GSUdfUENJX01VTFRJVEhSRUFEX1BST0JFCitzdGF0aWMgaW50IF9faW5pdCB3YWl0X2Zvcl9wcm9iZXModm9pZCkKK3sKKwlERUZJTkVfV0FJVCh3YWl0KTsKKworCXByaW50ayhLRVJOX0lORk8gIiVzOiB3YWl0aW5nIGZvciAlZCB0aHJlYWRzXG4iLCBfX0ZVTkNUSU9OX18sCisJCQlhdG9taWNfcmVhZCgmcHJvYmVfY291bnQpKTsKKwlpZiAoIWF0b21pY19yZWFkKCZwcm9iZV9jb3VudCkpCisJCXJldHVybiAwOworCXdoaWxlIChhdG9taWNfcmVhZCgmcHJvYmVfY291bnQpKSB7CisJCXByZXBhcmVfdG9fd2FpdCgmcHJvYmVfd2FpdHF1ZXVlLCAmd2FpdCwgVEFTS19VTklOVEVSUlVQVElCTEUpOworCQlpZiAoYXRvbWljX3JlYWQoJnByb2JlX2NvdW50KSkKKwkJCXNjaGVkdWxlKCk7CisJfQorCWZpbmlzaF93YWl0KCZwcm9iZV93YWl0cXVldWUsICZ3YWl0KTsKKwlyZXR1cm4gMDsKK30KKworY29yZV9pbml0Y2FsbF9zeW5jKHdhaXRfZm9yX3Byb2Jlcyk7Citwb3N0Y29yZV9pbml0Y2FsbF9zeW5jKHdhaXRfZm9yX3Byb2Jlcyk7CithcmNoX2luaXRjYWxsX3N5bmMod2FpdF9mb3JfcHJvYmVzKTsKK3N1YnN5c19pbml0Y2FsbF9zeW5jKHdhaXRfZm9yX3Byb2Jlcyk7Citmc19pbml0Y2FsbF9zeW5jKHdhaXRfZm9yX3Byb2Jlcyk7CitkZXZpY2VfaW5pdGNhbGxfc3luYyh3YWl0X2Zvcl9wcm9iZXMpOworbGF0ZV9pbml0Y2FsbF9zeW5jKHdhaXRfZm9yX3Byb2Jlcyk7CisjZW5kaWYKIAogRVhQT1JUX1NZTUJPTF9HUEwoZGV2aWNlX2JpbmRfZHJpdmVyKTsKIEVYUE9SVF9TWU1CT0xfR1BMKGRldmljZV9yZWxlYXNlX2RyaXZlcik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jhc2UvZG1hcG9vbC5jIGIvZHJpdmVycy9iYXNlL2RtYXBvb2wuYwppbmRleCAzM2M1Y2NlLi5iMmVmYmQ0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2Jhc2UvZG1hcG9vbC5jCisrKyBiL2RyaXZlcnMvYmFzZS9kbWFwb29sLmMKQEAgLTE0MSwxMSArMTQxLDIwIEBACiAJaW5pdF93YWl0cXVldWVfaGVhZCAoJnJldHZhbC0+d2FpdHEpOwogCiAJaWYgKGRldikgeworCQlpbnQgcmV0OworCiAJCWRvd24gKCZwb29sc19sb2NrKTsKIAkJaWYgKGxpc3RfZW1wdHkgKCZkZXYtPmRtYV9wb29scykpCi0JCQlkZXZpY2VfY3JlYXRlX2ZpbGUgKGRldiwgJmRldl9hdHRyX3Bvb2xzKTsKKwkJCXJldCA9IGRldmljZV9jcmVhdGVfZmlsZSAoZGV2LCAmZGV2X2F0dHJfcG9vbHMpOworCQllbHNlCisJCQlyZXQgPSAwOwogCQkvKiBub3RlOiAgbm90IGN1cnJlbnRseSBpbnNpc3RpbmcgIm5hbWUiIGJlIHVuaXF1ZSAqLwotCQlsaXN0X2FkZCAoJnJldHZhbC0+cG9vbHMsICZkZXYtPmRtYV9wb29scyk7CisJCWlmICghcmV0KQorCQkJbGlzdF9hZGQgKCZyZXR2YWwtPnBvb2xzLCAmZGV2LT5kbWFfcG9vbHMpOworCQllbHNlIHsKKwkJCWtmcmVlKHJldHZhbCk7CisJCQlyZXR2YWwgPSBOVUxMOworCQl9CiAJCXVwICgmcG9vbHNfbG9jayk7CiAJfSBlbHNlCiAJCUlOSVRfTElTVF9IRUFEICgmcmV0dmFsLT5wb29scyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jhc2UvdG9wb2xvZ3kuYyBiL2RyaXZlcnMvYmFzZS90b3BvbG9neS5jCmluZGV4IDNlZjlkNTEuLjI4ZGNjYjcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmFzZS90b3BvbG9neS5jCisrKyBiL2RyaXZlcnMvYmFzZS90b3BvbG9neS5jCkBAIC05Nyw4ICs5Nyw3IEBACiAvKiBBZGQvUmVtb3ZlIGNwdV90b3BvbG9neSBpbnRlcmZhY2UgZm9yIENQVSBkZXZpY2UgKi8KIHN0YXRpYyBpbnQgX19jcHVpbml0IHRvcG9sb2d5X2FkZF9kZXYoc3RydWN0IHN5c19kZXZpY2UgKiBzeXNfZGV2KQogewotCXN5c2ZzX2NyZWF0ZV9ncm91cCgmc3lzX2Rldi0+a29iaiwgJnRvcG9sb2d5X2F0dHJfZ3JvdXApOwotCXJldHVybiAwOworCXJldHVybiBzeXNmc19jcmVhdGVfZ3JvdXAoJnN5c19kZXYtPmtvYmosICZ0b3BvbG9neV9hdHRyX2dyb3VwKTsKIH0KIAogc3RhdGljIGludCBfX2NwdWluaXQgdG9wb2xvZ3lfcmVtb3ZlX2RldihzdHJ1Y3Qgc3lzX2RldmljZSAqIHN5c19kZXYpCmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jsb2NrL0RBQzk2MC5oIGIvZHJpdmVycy9ibG9jay9EQUM5NjAuaAppbmRleCBjZWM1MzllLi42MTQ4MDczIDEwMDY0NAotLS0gYS9kcml2ZXJzL2Jsb2NrL0RBQzk2MC5oCisrKyBiL2RyaXZlcnMvYmxvY2svREFDOTYwLmgKQEAgLTQzNzksOCArNDM3OSw4IEBACiBzdGF0aWMgaW5saW5lIHZvaWQgREFDOTYwX1BfVG9fUERfVHJhbnNsYXRlRGV2aWNlU3RhdGUodm9pZCAqRGV2aWNlU3RhdGUpCiB7CiAgIG1lbWNweShEZXZpY2VTdGF0ZSArIDIsIERldmljZVN0YXRlICsgMywgMSk7Ci0gIG1lbWNweShEZXZpY2VTdGF0ZSArIDQsIERldmljZVN0YXRlICsgNSwgMik7Ci0gIG1lbWNweShEZXZpY2VTdGF0ZSArIDYsIERldmljZVN0YXRlICsgOCwgNCk7CisgIG1lbW1vdmUoRGV2aWNlU3RhdGUgKyA0LCBEZXZpY2VTdGF0ZSArIDUsIDIpOworICBtZW1tb3ZlKERldmljZVN0YXRlICsgNiwgRGV2aWNlU3RhdGUgKyA4LCA0KTsKIH0KIAogc3RhdGljIGlubGluZQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ibG9jay9hbWlmbG9wLmMgYi9kcml2ZXJzL2Jsb2NrL2FtaWZsb3AuYwppbmRleCA1ZDI1NGI3Li41ZDY1NjIxIDEwMDY0NAotLS0gYS9kcml2ZXJzL2Jsb2NrL2FtaWZsb3AuYworKysgYi9kcml2ZXJzL2Jsb2NrL2FtaWZsb3AuYwpAQCAtMTcwOSwxMCArMTcwOSwxMyBAQAogCXJldHVybiBnZXRfZGlzayh1bml0W2RyaXZlXS5nZW5kaXNrKTsKIH0KIAotaW50IF9faW5pdCBhbWlnYV9mbG9wcHlfaW5pdCh2b2lkKQorc3RhdGljIGludCBfX2luaXQgYW1pZ2FfZmxvcHB5X2luaXQodm9pZCkKIHsKIAlpbnQgaSwgcmV0OwogCisJaWYgKCFNQUNIX0lTX0FNSUdBKQorCQlyZXR1cm4gLUVOWElPOworCiAJaWYgKCFBTUlHQUhXX1BSRVNFTlQoQU1JX0ZMT1BQWSkpCiAJCXJldHVybiAtRU5YSU87CiAKQEAgLTE4MDksMTUgKzE4MTIsOSBAQAogCXJldHVybiByZXQ7CiB9CiAKK21vZHVsZV9pbml0KGFtaWdhX2Zsb3BweV9pbml0KTsKICNpZmRlZiBNT0RVTEUKIAotaW50IGluaXRfbW9kdWxlKHZvaWQpCi17Ci0JaWYgKCFNQUNIX0lTX0FNSUdBKQotCQlyZXR1cm4gLUVOWElPOwotCXJldHVybiBhbWlnYV9mbG9wcHlfaW5pdCgpOwotfQotCiAjaWYgMCAvKiBub3Qgc2FmZSB0byB1bmxvYWQgKi8KIHZvaWQgY2xlYW51cF9tb2R1bGUodm9pZCkKIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmxvY2svYW9lL2FvZS5oIGIvZHJpdmVycy9ibG9jay9hb2UvYW9lLmgKaW5kZXggNmVlYmNiNy4uNmQxMTEyMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ibG9jay9hb2UvYW9lLmgKKysrIGIvZHJpdmVycy9ibG9jay9hb2UvYW9lLmgKQEAgLTEsNSArMSw1IEBACi0vKiBDb3B5cmlnaHQgKGMpIDIwMDQgQ29yYWlkLCBJbmMuICBTZWUgQ09QWUlORyBmb3IgR1BMIHRlcm1zLiAqLwotI2RlZmluZSBWRVJTSU9OICIyMiIKKy8qIENvcHlyaWdodCAoYykgMjAwNiBDb3JhaWQsIEluYy4gIFNlZSBDT1BZSU5HIGZvciBHUEwgdGVybXMuICovCisjZGVmaW5lIFZFUlNJT04gIjMyIgogI2RlZmluZSBBT0VfTUFKT1IgMTUyCiAjZGVmaW5lIERFVklDRV9OQU1FICJhb2UiCiAKQEAgLTY1LDcgKzY1LDcgQEAKIHN0cnVjdCBhb2VfY2ZnaGRyIHsKIAlfX2JlMTYgYnVmY250OwogCV9fYmUxNiBmd3ZlcjsKLQl1bnNpZ25lZCBjaGFyIHJlczsKKwl1bnNpZ25lZCBjaGFyIHNjbnQ7CiAJdW5zaWduZWQgY2hhciBhb2VjY21kOwogCXVuc2lnbmVkIGNoYXIgY3NsZW5bMl07CiB9OwpAQCAtNzgsMTIgKzc4LDE0IEBACiAJREVWRkxfR0RBTExPQyA9ICgxPDw0KSwJLyogbmVlZCB0byBhbGxvYyBnZW5kaXNrICovCiAJREVWRkxfUEFVU0UgPSAoMTw8NSksCiAJREVWRkxfTkVXU0laRSA9ICgxPDw2KSwJLyogbmVlZCB0byB1cGRhdGUgZGV2IHNpemUgaW4gYmxvY2sgbGF5ZXIgKi8KKwlERVZGTF9NQVhCQ05UID0gKDE8PDcpLCAvKiBkLT5tYXhiY250IGlzIG5vdCBjaGFuZ2VhYmxlICovCisJREVWRkxfS0lDS01FID0gKDE8PDgpLAogCiAJQlVGRkxfRkFJTCA9IDEsCiB9OwogCiBlbnVtIHsKLQlNQVhBVEFEQVRBID0gMTAyNCwKKwlERUZBVUxUQkNOVCA9IDIgKiA1MTIsCS8qIDIgc2VjdG9ycyAqLwogCU5QRVJTSEVMRiA9IDE2LAkJLyogbnVtYmVyIG9mIHNsb3RzIHBlciBzaGVsZiBhZGRyZXNzICovCiAJRlJFRVRBRyA9IC0xLAogCU1JTl9CVUZTID0gOCwKQEAgLTEwNywxMSArMTA5LDkgQEAKIAl1bG9uZyB3YWl0ZWQ7CiAJc3RydWN0IGJ1ZiAqYnVmOwogCWNoYXIgKmJ1ZmFkZHI7Ci0JaW50IHdyaXRlZGF0YWxlbjsKLQlpbnQgbmRhdGE7Ci0KLQkvKiBsYXJnZXN0IHBvc3NpYmxlICovCi0JdW5zaWduZWQgY2hhciBkYXRhW3NpemVvZihzdHJ1Y3QgYW9lX2hkcikgKyBzaXplb2Yoc3RydWN0IGFvZV9hdGFoZHIpXTsKKwl1bG9uZyBiY250OworCXNlY3Rvcl90IGxiYTsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwogfTsKIAogc3RydWN0IGFvZWRldiB7CkBAIC0xMjEsOSArMTIxLDEyIEBACiAJdWxvbmcgc3lzbWlub3I7CiAJdWxvbmcgYW9lbWFqb3I7CiAJdWxvbmcgYW9lbWlub3I7Ci0JdWxvbmcgbm9wZW47CQkvKiAoYmRfb3BlbmVycyBpc24ndCBhdmFpbGFibGUgd2l0aG91dCBzbGVlcGluZykgKi8KLQl1bG9uZyBydHRhdmc7CQkvKiByb3VuZCB0cmlwIGF2ZXJhZ2Ugb2YgcmVxdWVzdHMvcmVzcG9uc2VzICovCisJdTE2IG5vcGVuOwkJLyogKGJkX29wZW5lcnMgaXNuJ3QgYXZhaWxhYmxlIHdpdGhvdXQgc2xlZXBpbmcpICovCisJdTE2IGxhc3R0YWc7CQkvKiBsYXN0IHRhZyBzZW50ICovCisJdTE2IHJ0dGF2ZzsJCS8qIHJvdW5kIHRyaXAgYXZlcmFnZSBvZiByZXF1ZXN0cy9yZXNwb25zZXMgKi8KKwl1MTYgbWludGltZXI7CiAJdTE2IGZ3X3ZlcjsJCS8qIHZlcnNpb24gb2YgYmxhZGUncyBmaXJtd2FyZSAqLworCXUxNiBtYXhiY250OwogCXN0cnVjdCB3b3JrX3N0cnVjdCB3b3JrOy8qIGRpc2sgY3JlYXRlIHdvcmsgc3RydWN0ICovCiAJc3RydWN0IGdlbmRpc2sgKmdkOwogCXJlcXVlc3RfcXVldWVfdCBibGtxOwpAQCAtMTM3LDggKzE0MCw4IEBACiAJbWVtcG9vbF90ICpidWZwb29sOwkvKiBmb3IgZGVhZGxvY2stZnJlZSBCdWYgYWxsb2NhdGlvbiAqLwogCXN0cnVjdCBsaXN0X2hlYWQgYnVmcTsJLyogcXVldWUgb2YgYmlvcyB0byB3b3JrIG9uICovCiAJc3RydWN0IGJ1ZiAqaW5wcm9jZXNzOwkvKiB0aGUgb25lIHdlJ3JlIGN1cnJlbnRseSB3b3JraW5nIG9uICovCi0JdWxvbmcgbGFzdHRhZzsJCS8qIGxhc3QgdGFnIHNlbnQgKi8KLQl1bG9uZyBuZnJhbWVzOwkJLyogbnVtYmVyIG9mIGZyYW1lcyBiZWxvdyAqLworCXVzaG9ydCBsb3N0anVtYm87CisJdXNob3J0IG5mcmFtZXM7CQkvKiBudW1iZXIgb2YgZnJhbWVzIGJlbG93ICovCiAJc3RydWN0IGZyYW1lICpmcmFtZXM7CiB9OwogCkBAIC0xNTcsNiArMTYwLDcgQEAKIHZvaWQgYW9lY21kX2F0YV9yc3Aoc3RydWN0IHNrX2J1ZmYgKik7CiB2b2lkIGFvZWNtZF9jZmdfcnNwKHN0cnVjdCBza19idWZmICopOwogdm9pZCBhb2VjbWRfc2xlZXB3b3JrKHZvaWQgKnZwKTsKK3N0cnVjdCBza19idWZmICpuZXdfc2tiKHVsb25nKTsKIAogaW50IGFvZWRldl9pbml0KHZvaWQpOwogdm9pZCBhb2VkZXZfZXhpdCh2b2lkKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmxvY2svYW9lL2FvZWJsay5jIGIvZHJpdmVycy9ibG9jay9hb2UvYW9lYmxrLmMKaW5kZXggMzkzYjg2YS4uYWEyNWY4YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ibG9jay9hb2UvYW9lYmxrLmMKKysrIGIvZHJpdmVycy9ibG9jay9hb2UvYW9lYmxrLmMKQEAgLTEsNCArMSw0IEBACi0vKiBDb3B5cmlnaHQgKGMpIDIwMDQgQ29yYWlkLCBJbmMuICBTZWUgQ09QWUlORyBmb3IgR1BMIHRlcm1zLiAqLworLyogQ29weXJpZ2h0IChjKSAyMDA2IENvcmFpZCwgSW5jLiAgU2VlIENPUFlJTkcgZm9yIEdQTCB0ZXJtcy4gKi8KIC8qCiAgKiBhb2VibGsuYwogICogYmxvY2sgZGV2aWNlIHJvdXRpbmVzCkBAIC0xNCw3ICsxNCw2IEBACiAKIHN0YXRpYyBrbWVtX2NhY2hlX3QgKmJ1Zl9wb29sX2NhY2hlOwogCi0vKiBhZGQgYXR0cmlidXRlcyBmb3Igb3VyIGJsb2NrIGRldmljZXMgaW4gc3lzZnMgKi8KIHN0YXRpYyBzc2l6ZV90IGFvZWRpc2tfc2hvd19zdGF0ZShzdHJ1Y3QgZ2VuZGlzayAqIGRpc2ssIGNoYXIgKnBhZ2UpCiB7CiAJc3RydWN0IGFvZWRldiAqZCA9IGRpc2stPnByaXZhdGVfZGF0YTsKQEAgLTY0LDIxICs2MywyNyBAQAogCS5zaG93ID0gYW9lZGlza19zaG93X2Z3dmVyCiB9OwogCi1zdGF0aWMgdm9pZAorc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGUgKmFvZV9hdHRyc1tdID0geworCSZkaXNrX2F0dHJfc3RhdGUuYXR0ciwKKwkmZGlza19hdHRyX21hYy5hdHRyLAorCSZkaXNrX2F0dHJfbmV0aWYuYXR0ciwKKwkmZGlza19hdHRyX2Z3dmVyLmF0dHIsCisJTlVMTAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBhdHRyaWJ1dGVfZ3JvdXAgYXR0cl9ncm91cCA9IHsKKwkuYXR0cnMgPSBhb2VfYXR0cnMsCit9OworCitzdGF0aWMgaW50CiBhb2VkaXNrX2FkZF9zeXNmcyhzdHJ1Y3QgYW9lZGV2ICpkKQogewotCXN5c2ZzX2NyZWF0ZV9maWxlKCZkLT5nZC0+a29iaiwgJmRpc2tfYXR0cl9zdGF0ZS5hdHRyKTsKLQlzeXNmc19jcmVhdGVfZmlsZSgmZC0+Z2QtPmtvYmosICZkaXNrX2F0dHJfbWFjLmF0dHIpOwotCXN5c2ZzX2NyZWF0ZV9maWxlKCZkLT5nZC0+a29iaiwgJmRpc2tfYXR0cl9uZXRpZi5hdHRyKTsKLQlzeXNmc19jcmVhdGVfZmlsZSgmZC0+Z2QtPmtvYmosICZkaXNrX2F0dHJfZnd2ZXIuYXR0cik7CisJcmV0dXJuIHN5c2ZzX2NyZWF0ZV9ncm91cCgmZC0+Z2QtPmtvYmosICZhdHRyX2dyb3VwKTsKIH0KIHZvaWQKIGFvZWRpc2tfcm1fc3lzZnMoc3RydWN0IGFvZWRldiAqZCkKIHsKLQlzeXNmc19yZW1vdmVfbGluaygmZC0+Z2QtPmtvYmosICJzdGF0ZSIpOwotCXN5c2ZzX3JlbW92ZV9saW5rKCZkLT5nZC0+a29iaiwgIm1hYyIpOwotCXN5c2ZzX3JlbW92ZV9saW5rKCZkLT5nZC0+a29iaiwgIm5ldGlmIik7Ci0Jc3lzZnNfcmVtb3ZlX2xpbmsoJmQtPmdkLT5rb2JqLCAiZmlybXdhcmUtdmVyc2lvbiIpOworCXN5c2ZzX3JlbW92ZV9ncm91cCgmZC0+Z2QtPmtvYmosICZhdHRyX2dyb3VwKTsKIH0KIAogc3RhdGljIGludApAQCAtMTMyLDggKzEzNyw3IEBACiAJZCA9IGJpby0+YmlfYmRldi0+YmRfZGlzay0+cHJpdmF0ZV9kYXRhOwogCWJ1ZiA9IG1lbXBvb2xfYWxsb2MoZC0+YnVmcG9vbCwgR0ZQX05PSU8pOwogCWlmIChidWYgPT0gTlVMTCkgewotCQlwcmludGsoS0VSTl9JTkZPICJhb2U6IGFvZWJsa19tYWtlX3JlcXVlc3Q6IGJ1ZiBhbGxvY2F0aW9uICIKLQkJCSJmYWlsdXJlXG4iKTsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiYW9lOiBidWYgYWxsb2NhdGlvbiBmYWlsdXJlXG4iKTsKIAkJYmlvX2VuZGlvKGJpbywgYmlvLT5iaV9zaXplLCAtRU5PTUVNKTsKIAkJcmV0dXJuIDA7CiAJfQpAQCAtMTQzLDE0ICsxNDcsMTUgQEAKIAlidWYtPmJpbyA9IGJpbzsKIAlidWYtPnJlc2lkID0gYmlvLT5iaV9zaXplOwogCWJ1Zi0+c2VjdG9yID0gYmlvLT5iaV9zZWN0b3I7Ci0JYnVmLT5idiA9IGJ1Zi0+YmlvLT5iaV9pb192ZWM7CisJYnVmLT5idiA9ICZiaW8tPmJpX2lvX3ZlY1tiaW8tPmJpX2lkeF07CisJV0FSTl9PTihidWYtPmJ2LT5idl9sZW4gPT0gMCk7CiAJYnVmLT5idl9yZXNpZCA9IGJ1Zi0+YnYtPmJ2X2xlbjsKIAlidWYtPmJ1ZmFkZHIgPSBwYWdlX2FkZHJlc3MoYnVmLT5idi0+YnZfcGFnZSkgKyBidWYtPmJ2LT5idl9vZmZzZXQ7CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmZC0+bG9jaywgZmxhZ3MpOwogCiAJaWYgKChkLT5mbGFncyAmIERFVkZMX1VQKSA9PSAwKSB7Ci0JCXByaW50ayhLRVJOX0lORk8gImFvZTogYW9lYmxrX21ha2VfcmVxdWVzdDogZGV2aWNlICVsZC4lbGQgaXMgbm90IHVwXG4iLAorCQlwcmludGsoS0VSTl9JTkZPICJhb2U6IGRldmljZSAlbGQuJWxkIGlzIG5vdCB1cFxuIiwKIAkJCWQtPmFvZW1ham9yLCBkLT5hb2VtaW5vcik7CiAJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmQtPmxvY2ssIGZsYWdzKTsKIAkJbWVtcG9vbF9mcmVlKGJ1ZiwgZC0+YnVmcG9vbCk7CkBAIC0xNzYsNyArMTgxLDcgQEAKIAlzdHJ1Y3QgYW9lZGV2ICpkID0gYmRldi0+YmRfZGlzay0+cHJpdmF0ZV9kYXRhOwogCiAJaWYgKChkLT5mbGFncyAmIERFVkZMX1VQKSA9PSAwKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiYW9lOiBhb2VibGtfaW9jdGw6IGRpc2sgbm90IHVwXG4iKTsKKwkJcHJpbnRrKEtFUk5fRVJSICJhb2U6IGRpc2sgbm90IHVwXG4iKTsKIAkJcmV0dXJuIC1FTk9ERVY7CiAJfQogCkBAIC0yMDMsOCArMjA4LDggQEAKIAogCWdkID0gYWxsb2NfZGlzayhBT0VfUEFSVElUSU9OUyk7CiAJaWYgKGdkID09IE5VTEwpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJhb2U6IGFvZWJsa19nZGFsbG9jOiBjYW5ub3QgYWxsb2NhdGUgZGlzayAiCi0JCQkic3RydWN0dXJlIGZvciAlbGQuJWxkXG4iLCBkLT5hb2VtYWpvciwgZC0+YW9lbWlub3IpOworCQlwcmludGsoS0VSTl9FUlIgImFvZTogY2Fubm90IGFsbG9jYXRlIGRpc2sgc3RydWN0dXJlIGZvciAlbGQuJWxkXG4iLAorCQkJZC0+YW9lbWFqb3IsIGQtPmFvZW1pbm9yKTsKIAkJc3Bpbl9sb2NrX2lycXNhdmUoJmQtPmxvY2ssIGZsYWdzKTsKIAkJZC0+ZmxhZ3MgJj0gfkRFVkZMX0dEQUxMT0M7CiAJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmQtPmxvY2ssIGZsYWdzKTsKQEAgLTIxMyw4ICsyMTgsOCBAQAogCiAJZC0+YnVmcG9vbCA9IG1lbXBvb2xfY3JlYXRlX3NsYWJfcG9vbChNSU5fQlVGUywgYnVmX3Bvb2xfY2FjaGUpOwogCWlmIChkLT5idWZwb29sID09IE5VTEwpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJhb2U6IGFvZWJsa19nZGFsbG9jOiBjYW5ub3QgYWxsb2NhdGUgYnVmcG9vbCAiCi0JCQkiZm9yICVsZC4lbGRcbiIsIGQtPmFvZW1ham9yLCBkLT5hb2VtaW5vcik7CisJCXByaW50ayhLRVJOX0VSUiAiYW9lOiBjYW5ub3QgYWxsb2NhdGUgYnVmcG9vbCBmb3IgJWxkLiVsZFxuIiwKKwkJCWQtPmFvZW1ham9yLCBkLT5hb2VtaW5vcik7CiAJCXB1dF9kaXNrKGdkKTsKIAkJc3Bpbl9sb2NrX2lycXNhdmUoJmQtPmxvY2ssIGZsYWdzKTsKIAkJZC0+ZmxhZ3MgJj0gfkRFVkZMX0dEQUxMT0M7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jsb2NrL2FvZS9hb2VjaHIuYyBiL2RyaXZlcnMvYmxvY2svYW9lL2FvZWNoci5jCmluZGV4IDFiYzFjZjkuLmUyMmI0YzkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmxvY2svYW9lL2FvZWNoci5jCisrKyBiL2RyaXZlcnMvYmxvY2svYW9lL2FvZWNoci5jCkBAIC0xLDQgKzEsNCBAQAotLyogQ29weXJpZ2h0IChjKSAyMDA0IENvcmFpZCwgSW5jLiAgU2VlIENPUFlJTkcgZm9yIEdQTCB0ZXJtcy4gKi8KKy8qIENvcHlyaWdodCAoYykgMjAwNiBDb3JhaWQsIEluYy4gIFNlZSBDT1BZSU5HIGZvciBHUEwgdGVybXMuICovCiAvKgogICogYW9lY2hyLmMKICAqIEFvRSBjaGFyYWN0ZXIgZGV2aWNlIGRyaXZlcgpAQCAtMTUsNyArMTUsNiBAQAogCU1JTk9SX0lOVEVSRkFDRVMsCiAJTUlOT1JfUkVWQUxJREFURSwKIAlNU0dTWiA9IDIwNDgsCi0JTkFSR1MgPSAxMCwKIAlOTVNHID0gMTAwLAkJLyogbWVzc2FnZSBiYWNrbG9nIHRvIHJldGFpbiAqLwogfTsKIApAQCAtNTYsOSArNTUsOCBAQAogaW50ZXJmYWNlcyhjb25zdCBjaGFyIF9fdXNlciAqc3RyLCBzaXplX3Qgc2l6ZSkKIHsKIAlpZiAoc2V0X2FvZV9pZmxpc3Qoc3RyLCBzaXplKSkgewotCQlwcmludGsoS0VSTl9DUklUCi0JCSAgICAgICAiJXM6IGNvdWxkIG5vdCBzZXQgaW50ZXJmYWNlIGxpc3Q6ICVzXG4iLAotCQkgICAgICAgX19GVU5DVElPTl9fLCAidG9vIG1hbnkgaW50ZXJmYWNlcyIpOworCQlwcmludGsoS0VSTl9FUlIKKwkJCSJhb2U6IGNvdWxkIG5vdCBzZXQgaW50ZXJmYWNlIGxpc3Q6IHRvbyBtYW55IGludGVyZmFjZXNcbiIpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAJcmV0dXJuIDA7CkBAIC04MSw4ICs3OSw3IEBACiAJLyogc2hvdWxkIGJlIGUlZC4lZCBmb3JtYXQgKi8KIAluID0gc3NjYW5mKGJ1ZiwgImUlZC4lZCIsICZtYWpvciwgJm1pbm9yKTsKIAlpZiAobiAhPSAyKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiYW9lOiAlczogaW52YWxpZCBkZXZpY2Ugc3BlY2lmaWNhdGlvblxuIiwKLQkJCV9fRlVOQ1RJT05fXyk7CisJCXByaW50ayhLRVJOX0VSUiAiYW9lOiBpbnZhbGlkIGRldmljZSBzcGVjaWZpY2F0aW9uXG4iKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCWQgPSBhb2VkZXZfYnlfYW9lYWRkcihtYWpvciwgbWlub3IpOwpAQCAtOTAsNiArODcsNyBAQAogCQlyZXR1cm4gLUVJTlZBTDsKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZkLT5sb2NrLCBmbGFncyk7CisJZC0+ZmxhZ3MgJj0gfkRFVkZMX01BWEJDTlQ7CiAJZC0+ZmxhZ3MgfD0gREVWRkxfUEFVU0U7CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZC0+bG9jaywgZmxhZ3MpOwogCWFvZWNtZF9jZmcobWFqb3IsIG1pbm9yKTsKQEAgLTExNiw3ICsxMTQsNyBAQAogCiAJbXAgPSBrbWFsbG9jKG4sIEdGUF9BVE9NSUMpOwogCWlmIChtcCA9PSBOVUxMKSB7Ci0JCXByaW50ayhLRVJOX0NSSVQgImFvZTogYW9lY2hyX2Vycm9yOiBhbGxvY2F0aW9uIGZhaWx1cmUsIGxlbj0lbGRcbiIsIG4pOworCQlwcmludGsoS0VSTl9FUlIgImFvZTogYWxsb2NhdGlvbiBmYWlsdXJlLCBsZW49JWxkXG4iLCBuKTsKIAkJZ290byBiYWlsOwogCX0KIApAQCAtMTQxLDcgKzEzOSw3IEBACiAKIAlzd2l0Y2ggKCh1bnNpZ25lZCBsb25nKSBmaWxwLT5wcml2YXRlX2RhdGEpIHsKIAlkZWZhdWx0OgotCQlwcmludGsoS0VSTl9JTkZPICJhb2U6IGFvZWNocl93cml0ZTogY2FuJ3Qgd3JpdGUgdG8gdGhhdCBmaWxlLlxuIik7CisJCXByaW50ayhLRVJOX0lORk8gImFvZTogY2FuJ3Qgd3JpdGUgdG8gdGhhdCBmaWxlLlxuIik7CiAJCWJyZWFrOwogCWNhc2UgTUlOT1JfRElTQ09WRVI6CiAJCXJldCA9IGRpc2NvdmVyKCk7CkBAIC0yNTAsNyArMjQ4LDcgQEAKIAogCW4gPSByZWdpc3Rlcl9jaHJkZXYoQU9FX01BSk9SLCAiYW9lY2hyIiwgJmFvZV9mb3BzKTsKIAlpZiAobiA8IDApIHsgCi0JCXByaW50ayhLRVJOX0VSUiAiYW9lOiBhb2VjaHJfaW5pdDogY2FuJ3QgcmVnaXN0ZXIgY2hhciBkZXZpY2VcbiIpOworCQlwcmludGsoS0VSTl9FUlIgImFvZTogY2FuJ3QgcmVnaXN0ZXIgY2hhciBkZXZpY2VcbiIpOwogCQlyZXR1cm4gbjsKIAl9CiAJc2VtYV9pbml0KCZlbXNnc19zZW1hLCAwKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmxvY2svYW9lL2FvZWNtZC5jIGIvZHJpdmVycy9ibG9jay9hb2UvYW9lY21kLmMKaW5kZXggMzlkYTI4ZC4uOGExM2IxYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ibG9jay9hb2UvYW9lY21kLmMKKysrIGIvZHJpdmVycy9ibG9jay9hb2UvYW9lY21kLmMKQEAgLTEsNCArMSw0IEBACi0vKiBDb3B5cmlnaHQgKGMpIDIwMDQgQ29yYWlkLCBJbmMuICBTZWUgQ09QWUlORyBmb3IgR1BMIHRlcm1zLiAqLworLyogQ29weXJpZ2h0IChjKSAyMDA2IENvcmFpZCwgSW5jLiAgU2VlIENPUFlJTkcgZm9yIEdQTCB0ZXJtcy4gKi8KIC8qCiAgKiBhb2VjbWQuYwogICogRmlsZXN5c3RlbSByZXF1ZXN0IGhhbmRsaW5nIG1ldGhvZHMKQEAgLTE1LDE3ICsxNSwxOSBAQAogI2RlZmluZSBUSU1FUlRJQ0sgKEhaIC8gMTApCiAjZGVmaW5lIE1JTlRJTUVSICgyICogVElNRVJUSUNLKQogI2RlZmluZSBNQVhUSU1FUiAoSFogPDwgMSkKLSNkZWZpbmUgTUFYV0FJVCAoNjAgKiAzKQkvKiBBZnRlciBNQVhXQUlUIHNlY29uZHMsIGdpdmUgdXAgYW5kIGZhaWwgZGV2ICovCiAKLXN0YXRpYyBzdHJ1Y3Qgc2tfYnVmZiAqCi1uZXdfc2tiKHN0cnVjdCBuZXRfZGV2aWNlICppZl9kZXYsIHVsb25nIGxlbikKK3N0YXRpYyBpbnQgYW9lX2RlYWRzZWNzID0gNjAgKiAzOworbW9kdWxlX3BhcmFtKGFvZV9kZWFkc2VjcywgaW50LCAwNjQ0KTsKK01PRFVMRV9QQVJNX0RFU0MoYW9lX2RlYWRzZWNzLCAiQWZ0ZXIgYW9lX2RlYWRzZWNzIHNlY29uZHMsIGdpdmUgdXAgYW5kIGZhaWwgZGV2LiIpOworCitzdHJ1Y3Qgc2tfYnVmZiAqCituZXdfc2tiKHVsb25nIGxlbikKIHsKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwogCiAJc2tiID0gYWxsb2Nfc2tiKGxlbiwgR0ZQX0FUT01JQyk7CiAJaWYgKHNrYikgewogCQlza2ItPm5oLnJhdyA9IHNrYi0+bWFjLnJhdyA9IHNrYi0+ZGF0YTsKLQkJc2tiLT5kZXYgPSBpZl9kZXY7CiAJCXNrYi0+cHJvdG9jb2wgPSBfX2NvbnN0YW50X2h0b25zKEVUSF9QX0FPRSk7CiAJCXNrYi0+cHJpb3JpdHkgPSAwOwogCQlza2JfcHV0KHNrYiwgbGVuKTsKQEAgLTQwLDI5ICs0Miw2IEBACiAJcmV0dXJuIHNrYjsKIH0KIAotc3RhdGljIHN0cnVjdCBza19idWZmICoKLXNrYl9wcmVwYXJlKHN0cnVjdCBhb2VkZXYgKmQsIHN0cnVjdCBmcmFtZSAqZikKLXsKLQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwotCWNoYXIgKnA7Ci0KLQlza2IgPSBuZXdfc2tiKGQtPmlmcCwgZi0+bmRhdGEgKyBmLT53cml0ZWRhdGFsZW4pOwotCWlmICghc2tiKSB7Ci0JCXByaW50ayhLRVJOX0lORk8gImFvZTogc2tiX3ByZXBhcmU6IGZhaWx1cmUgdG8gYWxsb2NhdGUgc2tiXG4iKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCi0JcCA9IHNrYi0+bWFjLnJhdzsKLQltZW1jcHkocCwgZi0+ZGF0YSwgZi0+bmRhdGEpOwotCi0JaWYgKGYtPndyaXRlZGF0YWxlbikgewotCQlwICs9IHNpemVvZihzdHJ1Y3QgYW9lX2hkcikgKyBzaXplb2Yoc3RydWN0IGFvZV9hdGFoZHIpOwotCQltZW1jcHkocCwgZi0+YnVmYWRkciwgZi0+d3JpdGVkYXRhbGVuKTsKLQl9Ci0KLQlyZXR1cm4gc2tiOwotfQotCiBzdGF0aWMgc3RydWN0IGZyYW1lICoKIGdldGZyYW1lKHN0cnVjdCBhb2VkZXYgKmQsIGludCB0YWcpCiB7CkBAIC0xMDcsNiArODYsMTcgQEAKIAlyZXR1cm4gaG9zdF90YWc7CiB9CiAKK3N0YXRpYyBpbmxpbmUgdm9pZAorcHV0X2xiYShzdHJ1Y3QgYW9lX2F0YWhkciAqYWgsIHNlY3Rvcl90IGxiYSkKK3sKKwlhaC0+bGJhMCA9IGxiYTsKKwlhaC0+bGJhMSA9IGxiYSA+Pj0gODsKKwlhaC0+bGJhMiA9IGxiYSA+Pj0gODsKKwlhaC0+bGJhMyA9IGxiYSA+Pj0gODsKKwlhaC0+bGJhNCA9IGxiYSA+Pj0gODsKKwlhaC0+bGJhNSA9IGxiYSA+Pj0gODsKK30KKwogc3RhdGljIHZvaWQKIGFvZWNtZF9hdGFfcncoc3RydWN0IGFvZWRldiAqZCwgc3RydWN0IGZyYW1lICpmKQogewpAQCAtMTI1LDI5ICsxMTUsMjcgQEAKIAogCXNlY3RvciA9IGJ1Zi0+c2VjdG9yOwogCWJjbnQgPSBidWYtPmJ2X3Jlc2lkOwotCWlmIChiY250ID4gTUFYQVRBREFUQSkKLQkJYmNudCA9IE1BWEFUQURBVEE7CisJaWYgKGJjbnQgPiBkLT5tYXhiY250KQorCQliY250ID0gZC0+bWF4YmNudDsKIAogCS8qIGluaXRpYWxpemUgdGhlIGhlYWRlcnMgJiBmcmFtZSAqLwotCWggPSAoc3RydWN0IGFvZV9oZHIgKikgZi0+ZGF0YTsKKwlza2IgPSBmLT5za2I7CisJaCA9IChzdHJ1Y3QgYW9lX2hkciAqKSBza2ItPm1hYy5yYXc7CiAJYWggPSAoc3RydWN0IGFvZV9hdGFoZHIgKikgKGgrMSk7Ci0JZi0+bmRhdGEgPSBzaXplb2YgKmggKyBzaXplb2YgKmFoOwotCW1lbXNldChoLCAwLCBmLT5uZGF0YSk7CisJc2tiLT5sZW4gPSBzaXplb2YgKmggKyBzaXplb2YgKmFoOworCW1lbXNldChoLCAwLCBFVEhfWkxFTik7CiAJZi0+dGFnID0gYW9laGRyX2F0YWluaXQoZCwgaCk7CiAJZi0+d2FpdGVkID0gMDsKIAlmLT5idWYgPSBidWY7CiAJZi0+YnVmYWRkciA9IGJ1Zi0+YnVmYWRkcjsKKwlmLT5iY250ID0gYmNudDsKKwlmLT5sYmEgPSBzZWN0b3I7CiAKIAkvKiBzZXQgdXAgYXRhIGhlYWRlciAqLwogCWFoLT5zY250ID0gYmNudCA+PiA5OwotCWFoLT5sYmEwID0gc2VjdG9yOwotCWFoLT5sYmExID0gc2VjdG9yID4+PSA4OwotCWFoLT5sYmEyID0gc2VjdG9yID4+PSA4OwotCWFoLT5sYmEzID0gc2VjdG9yID4+PSA4OworCXB1dF9sYmEoYWgsIHNlY3Rvcik7CiAJaWYgKGQtPmZsYWdzICYgREVWRkxfRVhUKSB7CiAJCWFoLT5hZmxhZ3MgfD0gQU9FQUZMX0VYVDsKLQkJYWgtPmxiYTQgPSBzZWN0b3IgPj49IDg7Ci0JCWFoLT5sYmE1ID0gc2VjdG9yID4+PSA4OwogCX0gZWxzZSB7CiAJCWV4dGJpdCA9IDA7CiAJCWFoLT5sYmEzICY9IDB4MGY7CkBAIC0xNTUsMTEgKzE0MywxNCBAQAogCX0KIAogCWlmIChiaW9fZGF0YV9kaXIoYnVmLT5iaW8pID09IFdSSVRFKSB7CisJCXNrYl9maWxsX3BhZ2VfZGVzYyhza2IsIDAsIHZpcnRfdG9fcGFnZShmLT5idWZhZGRyKSwKKwkJCW9mZnNldF9pbl9wYWdlKGYtPmJ1ZmFkZHIpLCBiY250KTsKIAkJYWgtPmFmbGFncyB8PSBBT0VBRkxfV1JJVEU7Ci0JCWYtPndyaXRlZGF0YWxlbiA9IGJjbnQ7CisJCXNrYi0+bGVuICs9IGJjbnQ7CisJCXNrYi0+ZGF0YV9sZW4gPSBiY250OwogCX0gZWxzZSB7CisJCXNrYi0+bGVuID0gRVRIX1pMRU47CiAJCXdyaXRlYml0ID0gMDsKLQkJZi0+d3JpdGVkYXRhbGVuID0gMDsKIAl9CiAKIAlhaC0+Y21kc3RhdCA9IFdJTl9SRUFEIHwgd3JpdGViaXQgfCBleHRiaXQ7CkBAIC0xNjgsMjYgKzE1OSwyNyBAQAogCWJ1Zi0+bmZyYW1lc291dCArPSAxOwogCWJ1Zi0+YnVmYWRkciArPSBiY250OwogCWJ1Zi0+YnZfcmVzaWQgLT0gYmNudDsKLS8qIHByaW50ayhLRVJOX0lORk8gImFvZTogYnZfcmVzaWQ9JWxkXG4iLCBidWYtPmJ2X3Jlc2lkKTsgKi8KKy8qIHByaW50ayhLRVJOX0RFQlVHICJhb2U6IGJ2X3Jlc2lkPSVsZFxuIiwgYnVmLT5idl9yZXNpZCk7ICovCiAJYnVmLT5yZXNpZCAtPSBiY250OwogCWJ1Zi0+c2VjdG9yICs9IGJjbnQgPj4gOTsKIAlpZiAoYnVmLT5yZXNpZCA9PSAwKSB7CiAJCWQtPmlucHJvY2VzcyA9IE5VTEw7CiAJfSBlbHNlIGlmIChidWYtPmJ2X3Jlc2lkID09IDApIHsKIAkJYnVmLT5idisrOworCQlXQVJOX09OKGJ1Zi0+YnYtPmJ2X2xlbiA9PSAwKTsKIAkJYnVmLT5idl9yZXNpZCA9IGJ1Zi0+YnYtPmJ2X2xlbjsKIAkJYnVmLT5idWZhZGRyID0gcGFnZV9hZGRyZXNzKGJ1Zi0+YnYtPmJ2X3BhZ2UpICsgYnVmLT5idi0+YnZfb2Zmc2V0OwogCX0KIAotCXNrYiA9IHNrYl9wcmVwYXJlKGQsIGYpOwotCWlmIChza2IpIHsKLQkJc2tiLT5uZXh0ID0gTlVMTDsKLQkJaWYgKGQtPnNlbmRxX2hkKQotCQkJZC0+c2VuZHFfdGwtPm5leHQgPSBza2I7Ci0JCWVsc2UKLQkJCWQtPnNlbmRxX2hkID0gc2tiOwotCQlkLT5zZW5kcV90bCA9IHNrYjsKLQl9CisJc2tiLT5kZXYgPSBkLT5pZnA7CisJc2tiID0gc2tiX2Nsb25lKHNrYiwgR0ZQX0FUT01JQyk7CisJaWYgKHNrYiA9PSBOVUxMKQorCQlyZXR1cm47CisJaWYgKGQtPnNlbmRxX2hkKQorCQlkLT5zZW5kcV90bC0+bmV4dCA9IHNrYjsKKwllbHNlCisJCWQtPnNlbmRxX2hkID0gc2tiOworCWQtPnNlbmRxX3RsID0gc2tiOwogfQogCiAvKiBzb21lIGNhbGxlcnMgY2Fubm90IHNsZWVwLCBhbmQgdGhleSBjYW4gY2FsbCB0aGlzIGZ1bmN0aW9uLApAQCAtMjA5LDExICsyMDEsMTIgQEAKIAkJaWYgKCFpc19hb2VfbmV0aWYoaWZwKSkKIAkJCWNvbnRpbnVlOwogCi0JCXNrYiA9IG5ld19za2IoaWZwLCBzaXplb2YgKmggKyBzaXplb2YgKmNoKTsKKwkJc2tiID0gbmV3X3NrYihzaXplb2YgKmggKyBzaXplb2YgKmNoKTsKIAkJaWYgKHNrYiA9PSBOVUxMKSB7Ci0JCQlwcmludGsoS0VSTl9JTkZPICJhb2U6IGFvZWNtZF9jZmc6IHNrYiBhbGxvYyBmYWlsdXJlXG4iKTsKKwkJCXByaW50ayhLRVJOX0lORk8gImFvZTogc2tiIGFsbG9jIGZhaWx1cmVcbiIpOwogCQkJY29udGludWU7CiAJCX0KKwkJc2tiLT5kZXYgPSBpZnA7CiAJCWlmIChzbF90YWlsID09IE5VTEwpCiAJCQlzbF90YWlsID0gc2tiOwogCQloID0gKHN0cnVjdCBhb2VfaGRyICopIHNrYi0+bWFjLnJhdzsKQEAgLTIzNyw2ICsyMzAsMjkgQEAKIAlyZXR1cm4gc2w7CiB9CiAKK3N0YXRpYyBzdHJ1Y3QgZnJhbWUgKgorZnJlZWZyYW1lKHN0cnVjdCBhb2VkZXYgKmQpCit7CisJc3RydWN0IGZyYW1lICpmLCAqZTsKKwlpbnQgbiA9IDA7CisKKwlmID0gZC0+ZnJhbWVzOworCWUgPSBmICsgZC0+bmZyYW1lczsKKwlmb3IgKDsgZjxlOyBmKyspIHsKKwkJaWYgKGYtPnRhZyAhPSBGUkVFVEFHKQorCQkJY29udGludWU7CisJCWlmIChhdG9taWNfcmVhZCgmc2tiX3NoaW5mbyhmLT5za2IpLT5kYXRhcmVmKSA9PSAxKSB7CisJCQlza2Jfc2hpbmZvKGYtPnNrYiktPm5yX2ZyYWdzID0gZi0+c2tiLT5kYXRhX2xlbiA9IDA7CisJCQlyZXR1cm4gZjsKKwkJfQorCQluKys7CisJfQorCWlmIChuID09IGQtPm5mcmFtZXMpCS8qIHdhaXQgZm9yIG5ldHdvcmsgbGF5ZXIgKi8KKwkJZC0+ZmxhZ3MgfD0gREVWRkxfS0lDS01FOworCisJcmV0dXJuIE5VTEw7Cit9CisKIC8qIGVudGVycyB3aXRoIGQtPmxvY2sgaGVsZCAqLwogdm9pZAogYW9lY21kX3dvcmsoc3RydWN0IGFvZWRldiAqZCkKQEAgLTI1Miw3ICsyNjgsNyBAQAogCX0KIAogbG9vcDoKLQlmID0gZ2V0ZnJhbWUoZCwgRlJFRVRBRyk7CisJZiA9IGZyZWVmcmFtZShkKTsKIAlpZiAoZiA9PSBOVUxMKQogCQlyZXR1cm47CiAJaWYgKGQtPmlucHJvY2VzcyA9PSBOVUxMKSB7CkBAIC0yNjAsNyArMjc2LDcgQEAKIAkJCXJldHVybjsKIAkJYnVmID0gY29udGFpbmVyX29mKGQtPmJ1ZnEubmV4dCwgc3RydWN0IGJ1ZiwgYnVmcyk7CiAJCWxpc3RfZGVsKGQtPmJ1ZnEubmV4dCk7Ci0vKnByaW50ayhLRVJOX0lORk8gImFvZWNtZF93b3JrOiBiaV9zaXplPSVsZFxuIiwgYnVmLT5iaW8tPmJpX3NpemUpOyAqLworLypwcmludGsoS0VSTl9ERUJVRyAiYW9lOiBiaV9zaXplPSVsZFxuIiwgYnVmLT5iaW8tPmJpX3NpemUpOyAqLwogCQlkLT5pbnByb2Nlc3MgPSBidWY7CiAJfQogCWFvZWNtZF9hdGFfcncoZCwgZik7CkBAIC0yNzIsNiArMjg4LDcgQEAKIHsKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwogCXN0cnVjdCBhb2VfaGRyICpoOworCXN0cnVjdCBhb2VfYXRhaGRyICphaDsKIAljaGFyIGJ1ZlsxMjhdOwogCXUzMiBuOwogCkBAIC0yODMsMjEgKzMwMCw0MSBAQAogCQlkLT5hb2VtYWpvciwgZC0+YW9lbWlub3IsIGYtPnRhZywgamlmZmllcywgbik7CiAJYW9lY2hyX2Vycm9yKGJ1Zik7CiAKLQloID0gKHN0cnVjdCBhb2VfaGRyICopIGYtPmRhdGE7CisJc2tiID0gZi0+c2tiOworCWggPSAoc3RydWN0IGFvZV9oZHIgKikgc2tiLT5tYWMucmF3OworCWFoID0gKHN0cnVjdCBhb2VfYXRhaGRyICopIChoKzEpOwogCWYtPnRhZyA9IG47CiAJaC0+dGFnID0gY3B1X3RvX2JlMzIobik7CiAJbWVtY3B5KGgtPmRzdCwgZC0+YWRkciwgc2l6ZW9mIGgtPmRzdCk7CiAJbWVtY3B5KGgtPnNyYywgZC0+aWZwLT5kZXZfYWRkciwgc2l6ZW9mIGgtPnNyYyk7CiAKLQlza2IgPSBza2JfcHJlcGFyZShkLCBmKTsKLQlpZiAoc2tiKSB7Ci0JCXNrYi0+bmV4dCA9IE5VTEw7Ci0JCWlmIChkLT5zZW5kcV9oZCkKLQkJCWQtPnNlbmRxX3RsLT5uZXh0ID0gc2tiOwotCQllbHNlCi0JCQlkLT5zZW5kcV9oZCA9IHNrYjsKLQkJZC0+c2VuZHFfdGwgPSBza2I7CisJbiA9IERFRkFVTFRCQ05UIC8gNTEyOworCWlmIChhaC0+c2NudCA+IG4pIHsKKwkJYWgtPnNjbnQgPSBuOworCQlpZiAoYWgtPmFmbGFncyAmIEFPRUFGTF9XUklURSkgeworCQkJc2tiX2ZpbGxfcGFnZV9kZXNjKHNrYiwgMCwgdmlydF90b19wYWdlKGYtPmJ1ZmFkZHIpLAorCQkJCW9mZnNldF9pbl9wYWdlKGYtPmJ1ZmFkZHIpLCBERUZBVUxUQkNOVCk7CisJCQlza2ItPmxlbiA9IHNpemVvZiAqaCArIHNpemVvZiAqYWggKyBERUZBVUxUQkNOVDsKKwkJCXNrYi0+ZGF0YV9sZW4gPSBERUZBVUxUQkNOVDsKKwkJfQorCQlpZiAoKytkLT5sb3N0anVtYm8gPiAoZC0+bmZyYW1lcyA8PCAxKSkKKwkJaWYgKGQtPm1heGJjbnQgIT0gREVGQVVMVEJDTlQpIHsKKwkJCXByaW50ayhLRVJOX0lORk8gImFvZTogZSVsZC4lbGQ6IHRvbyBtYW55IGxvc3QganVtYm8gb24gJXMgLSB1c2luZyAxS0IgZnJhbWVzLlxuIiwKKwkJCQlkLT5hb2VtYWpvciwgZC0+YW9lbWlub3IsIGQtPmlmcC0+bmFtZSk7CisJCQlkLT5tYXhiY250ID0gREVGQVVMVEJDTlQ7CisJCQlkLT5mbGFncyB8PSBERVZGTF9NQVhCQ05UOworCQl9CiAJfQorCisJc2tiLT5kZXYgPSBkLT5pZnA7CisJc2tiID0gc2tiX2Nsb25lKHNrYiwgR0ZQX0FUT01JQyk7CisJaWYgKHNrYiA9PSBOVUxMKQorCQlyZXR1cm47CisJaWYgKGQtPnNlbmRxX2hkKQorCQlkLT5zZW5kcV90bC0+bmV4dCA9IHNrYjsKKwllbHNlCisJCWQtPnNlbmRxX2hkID0gc2tiOworCWQtPnNlbmRxX3RsID0gc2tiOwogfQogCiBzdGF0aWMgaW50CkBAIC0zNDAsMTMgKzM3NywxNyBAQAogCQlpZiAoZi0+dGFnICE9IEZSRUVUQUcgJiYgdHNpbmNlKGYtPnRhZykgPj0gdGltZW91dCkgewogCQkJbiA9IGYtPndhaXRlZCArPSB0aW1lb3V0OwogCQkJbiAvPSBIWjsKLQkJCWlmIChuID4gTUFYV0FJVCkgeyAvKiB3YWl0ZWQgdG9vIGxvbmcuICBkZXZpY2UgZmFpbHVyZS4gKi8KKwkJCWlmIChuID4gYW9lX2RlYWRzZWNzKSB7IC8qIHdhaXRlZCB0b28gbG9uZyBmb3IgcmVzcG9uc2UgKi8KIAkJCQlhb2VkZXZfZG93bmRldihkKTsKIAkJCQlicmVhazsKIAkJCX0KIAkJCXJleG1pdChkLCBmKTsKIAkJfQogCX0KKwlpZiAoZC0+ZmxhZ3MgJiBERVZGTF9LSUNLTUUpIHsKKwkJZC0+ZmxhZ3MgJj0gfkRFVkZMX0tJQ0tNRTsKKwkJYW9lY21kX3dvcmsoZCk7CisJfQogCiAJc2wgPSBkLT5zZW5kcV9oZDsKIAlkLT5zZW5kcV9oZCA9IGQtPnNlbmRxX3RsID0gTlVMTDsKQEAgLTQzMSw4ICs0NzIsOCBAQAogCX0KIAogCWlmIChkLT5zc2l6ZSAhPSBzc2l6ZSkKLQkJcHJpbnRrKEtFUk5fSU5GTyAiYW9lOiAlMDEybGx4IGUlbHUuJWx1IHYlMDR4IGhhcyAlbGx1ICIKLQkJCSJzZWN0b3JzXG4iLCAodW5zaWduZWQgbG9uZyBsb25nKW1hY19hZGRyKGQtPmFkZHIpLAorCQlwcmludGsoS0VSTl9JTkZPICJhb2U6ICUwMTJsbHggZSVsdS4lbHUgdiUwNHggaGFzICVsbHUgc2VjdG9yc1xuIiwKKwkJCSh1bnNpZ25lZCBsb25nIGxvbmcpbWFjX2FkZHIoZC0+YWRkciksCiAJCQlkLT5hb2VtYWpvciwgZC0+YW9lbWlub3IsCiAJCQlkLT5md192ZXIsIChsb25nIGxvbmcpc3NpemUpOwogCWQtPnNzaXplID0gc3NpemU7CkBAIC00NDIsMTEgKzQ4Myw5IEBACiAJCWQtPmZsYWdzIHw9IERFVkZMX05FV1NJWkU7CiAJfSBlbHNlIHsKIAkJaWYgKGQtPmZsYWdzICYgREVWRkxfR0RBTExPQykgewotCQkJcHJpbnRrKEtFUk5fSU5GTyAiYW9lOiAlczogJXMgZSVsdS4lbHUsICVzXG4iLAotCQkJICAgICAgIF9fRlVOQ1RJT05fXywKLQkJCSAgICAgICAiY2FuJ3Qgc2NoZWR1bGUgd29yayBmb3IiLAorCQkJcHJpbnRrKEtFUk5fRVJSICJhb2U6IGNhbid0IHNjaGVkdWxlIHdvcmsgZm9yIGUlbHUuJWx1LCAlc1xuIiwKIAkJCSAgICAgICBkLT5hb2VtYWpvciwgZC0+YW9lbWlub3IsCi0JCQkgICAgICAgIml0J3MgYWxyZWFkeSBvbiEgKFRoaXMgcmVhbGx5IHNob3VsZG4ndCBoYXBwZW4pLlxuIik7CisJCQkgICAgICAgIml0J3MgYWxyZWFkeSBvbiEgIFRoaXMgc2hvdWxkbid0IGhhcHBlbi5cbiIpOwogCQkJcmV0dXJuOwogCQl9CiAJCWQtPmZsYWdzIHw9IERFVkZMX0dEQUxMT0M7CkBAIC00NjAsOCArNDk5LDE1IEBACiAJcmVnaXN0ZXIgbG9uZyBuOwogCiAJbiA9IHJ0dDsKLQlpZiAobiA8IE1JTlRJTUVSKQotCQluID0gTUlOVElNRVI7CisJaWYgKG4gPCAwKSB7CisJCW4gPSAtcnR0OworCQlpZiAobiA8IE1JTlRJTUVSKQorCQkJbiA9IE1JTlRJTUVSOworCQllbHNlIGlmIChuID4gTUFYVElNRVIpCisJCQluID0gTUFYVElNRVI7CisJCWQtPm1pbnRpbWVyICs9IChuIC0gZC0+bWludGltZXIpID4+IDE7CisJfSBlbHNlIGlmIChuIDwgZC0+bWludGltZXIpCisJCW4gPSBkLT5taW50aW1lcjsKIAllbHNlIGlmIChuID4gTUFYVElNRVIpCiAJCW4gPSBNQVhUSU1FUjsKIApAQCAtNDc0LDcgKzUyMCw3IEBACiBhb2VjbWRfYXRhX3JzcChzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQogewogCXN0cnVjdCBhb2VkZXYgKmQ7Ci0Jc3RydWN0IGFvZV9oZHIgKmhpbjsKKwlzdHJ1Y3QgYW9lX2hkciAqaGluLCAqaG91dDsKIAlzdHJ1Y3QgYW9lX2F0YWhkciAqYWhpbiwgKmFob3V0OwogCXN0cnVjdCBmcmFtZSAqZjsKIAlzdHJ1Y3QgYnVmICpidWY7CkBAIC00OTcsOCArNTQzLDEwIEBACiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmZC0+bG9jaywgZmxhZ3MpOwogCi0JZiA9IGdldGZyYW1lKGQsIGJlMzJfdG9fY3B1KGhpbi0+dGFnKSk7CisJbiA9IGJlMzJfdG9fY3B1KGhpbi0+dGFnKTsKKwlmID0gZ2V0ZnJhbWUoZCwgbik7CiAJaWYgKGYgPT0gTlVMTCkgeworCQljYWxjX3J0dGF2ZyhkLCAtdHNpbmNlKG4pKTsKIAkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZC0+bG9jaywgZmxhZ3MpOwogCQlzbnByaW50ZihlYnVmLCBzaXplb2YgZWJ1ZiwKIAkJCSIlMTVzIGUlZC4lZCAgICB0YWc9JTA4eEAlMDhseFxuIiwKQEAgLTUxNCwyNiArNTYyLDI3IEBACiAJY2FsY19ydHRhdmcoZCwgdHNpbmNlKGYtPnRhZykpOwogCiAJYWhpbiA9IChzdHJ1Y3QgYW9lX2F0YWhkciAqKSAoaGluKzEpOwotCWFob3V0ID0gKHN0cnVjdCBhb2VfYXRhaGRyICopIChmLT5kYXRhICsgc2l6ZW9mKHN0cnVjdCBhb2VfaGRyKSk7CisJaG91dCA9IChzdHJ1Y3QgYW9lX2hkciAqKSBmLT5za2ItPm1hYy5yYXc7CisJYWhvdXQgPSAoc3RydWN0IGFvZV9hdGFoZHIgKikgKGhvdXQrMSk7CiAJYnVmID0gZi0+YnVmOwogCiAJaWYgKGFob3V0LT5jbWRzdGF0ID09IFdJTl9JREVOVElGWSkKIAkJZC0+ZmxhZ3MgJj0gfkRFVkZMX1BBVVNFOwogCWlmIChhaGluLT5jbWRzdGF0ICYgMHhhOSkgewkvKiB0aGVzZSBiaXRzIGNsZWFyZWQgb24gc3VjY2VzcyAqLwotCQlwcmludGsoS0VSTl9DUklUICJhb2U6IGFvZWNtZF9hdGFfcnNwOiBhdGEgZXJyb3IgY21kPSUyLjJYaCAiCi0JCQkic3RhdD0lMi4yWGggZnJvbSBlJWxkLiVsZFxuIiwgCisJCXByaW50ayhLRVJOX0VSUgorCQkJImFvZTogYXRhIGVycm9yIGNtZD0lMi4yWGggc3RhdD0lMi4yWGggZnJvbSBlJWxkLiVsZFxuIiwKIAkJCWFob3V0LT5jbWRzdGF0LCBhaGluLT5jbWRzdGF0LAogCQkJZC0+YW9lbWFqb3IsIGQtPmFvZW1pbm9yKTsKIAkJaWYgKGJ1ZikKIAkJCWJ1Zi0+ZmxhZ3MgfD0gQlVGRkxfRkFJTDsKIAl9IGVsc2UgeworCQluID0gYWhvdXQtPnNjbnQgPDwgOTsKIAkJc3dpdGNoIChhaG91dC0+Y21kc3RhdCkgewogCQljYXNlIFdJTl9SRUFEOgogCQljYXNlIFdJTl9SRUFEX0VYVDoKLQkJCW4gPSBhaG91dC0+c2NudCA8PCA5OwogCQkJaWYgKHNrYi0+bGVuIC0gc2l6ZW9mICpoaW4gLSBzaXplb2YgKmFoaW4gPCBuKSB7Ci0JCQkJcHJpbnRrKEtFUk5fQ1JJVCAiYW9lOiBhb2VjbWRfYXRhX3JzcDogcnVudCAiCi0JCQkJCSJhdGEgZGF0YSBzaXplIGluIHJlYWQuICBza2ItPmxlbj0lZFxuIiwKKwkJCQlwcmludGsoS0VSTl9FUlIKKwkJCQkJImFvZTogcnVudCBkYXRhIHNpemUgaW4gcmVhZC4gIHNrYi0+bGVuPSVkXG4iLAogCQkJCQlza2ItPmxlbik7CiAJCQkJLyogZmFpbCBmcmFtZSBmPyAganVzdCByZXR1cm5pbmcgd2lsbCByZXhtaXQuICovCiAJCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZC0+bG9jaywgZmxhZ3MpOwpAQCAtNTQyLDIyICs1OTEsNDkgQEAKIAkJCW1lbWNweShmLT5idWZhZGRyLCBhaGluKzEsIG4pOwogCQljYXNlIFdJTl9XUklURToKIAkJY2FzZSBXSU5fV1JJVEVfRVhUOgorCQkJaWYgKGYtPmJjbnQgLT0gbikgeworCQkJCXNrYiA9IGYtPnNrYjsKKwkJCQlmLT5idWZhZGRyICs9IG47CisJCQkJcHV0X2xiYShhaG91dCwgZi0+bGJhICs9IGFob3V0LT5zY250KTsKKwkJCQluID0gZi0+YmNudDsKKwkJCQlpZiAobiA+IERFRkFVTFRCQ05UKQorCQkJCQluID0gREVGQVVMVEJDTlQ7CisJCQkJYWhvdXQtPnNjbnQgPSBuID4+IDk7CisJCQkJaWYgKGFob3V0LT5hZmxhZ3MgJiBBT0VBRkxfV1JJVEUpIHsKKwkJCQkJc2tiX2ZpbGxfcGFnZV9kZXNjKHNrYiwgMCwKKwkJCQkJCXZpcnRfdG9fcGFnZShmLT5idWZhZGRyKSwKKwkJCQkJCW9mZnNldF9pbl9wYWdlKGYtPmJ1ZmFkZHIpLCBuKTsKKwkJCQkJc2tiLT5sZW4gPSBzaXplb2YgKmhvdXQgKyBzaXplb2YgKmFob3V0ICsgbjsKKwkJCQkJc2tiLT5kYXRhX2xlbiA9IG47CisJCQkJfQorCQkJCWYtPnRhZyA9IG5ld3RhZyhkKTsKKwkJCQlob3V0LT50YWcgPSBjcHVfdG9fYmUzMihmLT50YWcpOworCQkJCXNrYi0+ZGV2ID0gZC0+aWZwOworCQkJCXNrYiA9IHNrYl9jbG9uZShza2IsIEdGUF9BVE9NSUMpOworCQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmQtPmxvY2ssIGZsYWdzKTsKKwkJCQlpZiAoc2tiKQorCQkJCQlhb2VuZXRfeG1pdChza2IpOworCQkJCXJldHVybjsKKwkJCX0KKwkJCWlmIChuID4gREVGQVVMVEJDTlQpCisJCQkJZC0+bG9zdGp1bWJvID0gMDsKIAkJCWJyZWFrOwogCQljYXNlIFdJTl9JREVOVElGWToKIAkJCWlmIChza2ItPmxlbiAtIHNpemVvZiAqaGluIC0gc2l6ZW9mICphaGluIDwgNTEyKSB7Ci0JCQkJcHJpbnRrKEtFUk5fSU5GTyAiYW9lOiBhb2VjbWRfYXRhX3JzcDogcnVudCBkYXRhIHNpemUgIgotCQkJCQkiaW4gYXRhaWQuICBza2ItPmxlbj0lZFxuIiwgc2tiLT5sZW4pOworCQkJCXByaW50ayhLRVJOX0lORk8KKwkJCQkJImFvZTogcnVudCBkYXRhIHNpemUgaW4gYXRhaWQuICBza2ItPmxlbj0lZFxuIiwKKwkJCQkJc2tiLT5sZW4pOwogCQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmQtPmxvY2ssIGZsYWdzKTsKIAkJCQlyZXR1cm47CiAJCQl9CiAJCQlhdGFpZF9jb21wbGV0ZShkLCAoY2hhciAqKSAoYWhpbisxKSk7CiAJCQlicmVhazsKIAkJZGVmYXVsdDoKLQkJCXByaW50ayhLRVJOX0lORk8gImFvZTogYW9lY21kX2F0YV9yc3A6IHVucmVjb2duaXplZCAiCi0JCQkgICAgICAgIm91dGJvdW5kIGF0YSBjb21tYW5kICUyLjJYaCBmb3IgJWQuJWRcbiIsIAotCQkJICAgICAgIGFob3V0LT5jbWRzdGF0LAotCQkJICAgICAgIGJlMTZfdG9fY3B1KGhpbi0+bWFqb3IpLAotCQkJICAgICAgIGhpbi0+bWlub3IpOworCQkJcHJpbnRrKEtFUk5fSU5GTworCQkJCSJhb2U6IHVucmVjb2duaXplZCBhdGEgY29tbWFuZCAlMi4yWGggZm9yICVkLiVkXG4iLAorCQkJCWFob3V0LT5jbWRzdGF0LAorCQkJCWJlMTZfdG9fY3B1KGhpbi0+bWFqb3IpLAorCQkJCWhpbi0+bWlub3IpOwogCQl9CiAJfQogCkBAIC02MTIsMzMgKzY4OCwzMiBAQAogCXN0cnVjdCBmcmFtZSAqZjsKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwogCi0JZiA9IGdldGZyYW1lKGQsIEZSRUVUQUcpOworCWYgPSBmcmVlZnJhbWUoZCk7CiAJaWYgKGYgPT0gTlVMTCkgewotCQlwcmludGsoS0VSTl9DUklUICJhb2U6IGFvZWNtZF9hdGFfaWQ6IGNhbid0IGdldCBhIGZyYW1lLiAgIgotCQkJIlRoaXMgc2hvdWxkbid0IGhhcHBlbi5cbiIpOworCQlwcmludGsoS0VSTl9FUlIgImFvZTogY2FuJ3QgZ2V0IGEgZnJhbWUuIFRoaXMgc2hvdWxkbid0IGhhcHBlbi5cbiIpOwogCQlyZXR1cm4gTlVMTDsKIAl9CiAKIAkvKiBpbml0aWFsaXplIHRoZSBoZWFkZXJzICYgZnJhbWUgKi8KLQloID0gKHN0cnVjdCBhb2VfaGRyICopIGYtPmRhdGE7CisJc2tiID0gZi0+c2tiOworCWggPSAoc3RydWN0IGFvZV9oZHIgKikgc2tiLT5tYWMucmF3OwogCWFoID0gKHN0cnVjdCBhb2VfYXRhaGRyICopIChoKzEpOwotCWYtPm5kYXRhID0gc2l6ZW9mICpoICsgc2l6ZW9mICphaDsKLQltZW1zZXQoaCwgMCwgZi0+bmRhdGEpOworCXNrYi0+bGVuID0gRVRIX1pMRU47CisJbWVtc2V0KGgsIDAsIEVUSF9aTEVOKTsKIAlmLT50YWcgPSBhb2VoZHJfYXRhaW5pdChkLCBoKTsKIAlmLT53YWl0ZWQgPSAwOwotCWYtPndyaXRlZGF0YWxlbiA9IDA7CiAKIAkvKiBzZXQgdXAgYXRhIGhlYWRlciAqLwogCWFoLT5zY250ID0gMTsKIAlhaC0+Y21kc3RhdCA9IFdJTl9JREVOVElGWTsKIAlhaC0+bGJhMyA9IDB4YTA7CiAKLQlza2IgPSBza2JfcHJlcGFyZShkLCBmKTsKKwlza2ItPmRldiA9IGQtPmlmcDsKIAogCWQtPnJ0dGF2ZyA9IE1BWFRJTUVSOwogCWQtPnRpbWVyLmZ1bmN0aW9uID0gcmV4bWl0X3RpbWVyOwogCi0JcmV0dXJuIHNrYjsKKwlyZXR1cm4gc2tiX2Nsb25lKHNrYiwgR0ZQX0FUT01JQyk7CiB9CiAgCiB2b2lkCkBAIC02NDgsOSArNzIzLDkgQEAKIAlzdHJ1Y3QgYW9lX2hkciAqaDsKIAlzdHJ1Y3QgYW9lX2NmZ2hkciAqY2g7CiAJdWxvbmcgZmxhZ3MsIHN5c21pbm9yLCBhb2VtYWpvcjsKLQl1MTYgYnVmY250OwogCXN0cnVjdCBza19idWZmICpzbDsKIAllbnVtIHsgTUFYRlJBTUVTID0gMTYgfTsKKwl1MTYgbjsKIAogCWggPSAoc3RydWN0IGFvZV9oZHIgKikgc2tiLT5tYWMucmF3OwogCWNoID0gKHN0cnVjdCBhb2VfY2ZnaGRyICopIChoKzEpOwpAQCAtNjYxLDI2ICs3MzYsMjUgQEAKIAkgKi8KIAlhb2VtYWpvciA9IGJlMTZfdG9fY3B1KGgtPm1ham9yKTsKIAlpZiAoYW9lbWFqb3IgPT0gMHhmZmYpIHsKLQkJcHJpbnRrKEtFUk5fQ1JJVCAiYW9lOiBhb2VjbWRfY2ZnX3JzcDogV2FybmluZzogc2hlbGYgIgotCQkJImFkZHJlc3MgaXMgYWxsIG9uZXMuICBDaGVjayBzaGVsZiBkaXAgc3dpdGNoZXNcbiIpOworCQlwcmludGsoS0VSTl9FUlIgImFvZTogV2FybmluZzogc2hlbGYgYWRkcmVzcyBpcyBhbGwgb25lcy4gICIKKwkJCSJDaGVjayBzaGVsZiBkaXAgc3dpdGNoZXMuXG4iKTsKIAkJcmV0dXJuOwogCX0KIAogCXN5c21pbm9yID0gU1lTTUlOT1IoYW9lbWFqb3IsIGgtPm1pbm9yKTsKIAlpZiAoc3lzbWlub3IgKiBBT0VfUEFSVElUSU9OUyArIEFPRV9QQVJUSVRJT05TID4gTUlOT1JNQVNLKSB7Ci0JCXByaW50ayhLRVJOX0lORk8KLQkJCSJhb2U6IGUlbGQuJWQ6IG1pbm9yIG51bWJlciB0b28gbGFyZ2VcbiIsIAorCQlwcmludGsoS0VSTl9JTkZPICJhb2U6IGUlbGQuJWQ6IG1pbm9yIG51bWJlciB0b28gbGFyZ2VcbiIsCiAJCQlhb2VtYWpvciwgKGludCkgaC0+bWlub3IpOwogCQlyZXR1cm47CiAJfQogCi0JYnVmY250ID0gYmUxNl90b19jcHUoY2gtPmJ1ZmNudCk7Ci0JaWYgKGJ1ZmNudCA+IE1BWEZSQU1FUykJLyoga2VlcCBpdCByZWFzb25hYmxlICovCi0JCWJ1ZmNudCA9IE1BWEZSQU1FUzsKKwluID0gYmUxNl90b19jcHUoY2gtPmJ1ZmNudCk7CisJaWYgKG4gPiBNQVhGUkFNRVMpCS8qIGtlZXAgaXQgcmVhc29uYWJsZSAqLworCQluID0gTUFYRlJBTUVTOwogCi0JZCA9IGFvZWRldl9ieV9zeXNtaW5vcl9tKHN5c21pbm9yLCBidWZjbnQpOworCWQgPSBhb2VkZXZfYnlfc3lzbWlub3JfbShzeXNtaW5vciwgbik7CiAJaWYgKGQgPT0gTlVMTCkgewotCQlwcmludGsoS0VSTl9JTkZPICJhb2U6IGFvZWNtZF9jZmdfcnNwOiBkZXZpY2Ugc3lzbWlub3JfbSBmYWlsdXJlXG4iKTsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiYW9lOiBkZXZpY2Ugc3lzbWlub3JfbSBmYWlsdXJlXG4iKTsKIAkJcmV0dXJuOwogCX0KIApAQCAtNjg5LDYgKzc2MywyMCBAQAogCS8qIHBlcm1pdCBkZXZpY2UgdG8gbWlncmF0ZSBtYWMgYW5kIG5ldHdvcmsgaW50ZXJmYWNlICovCiAJZC0+aWZwID0gc2tiLT5kZXY7CiAJbWVtY3B5KGQtPmFkZHIsIGgtPnNyYywgc2l6ZW9mIGQtPmFkZHIpOworCWlmICghKGQtPmZsYWdzICYgREVWRkxfTUFYQkNOVCkpIHsKKwkJbiA9IGQtPmlmcC0+bXR1OworCQluIC09IHNpemVvZiAoc3RydWN0IGFvZV9oZHIpICsgc2l6ZW9mIChzdHJ1Y3QgYW9lX2F0YWhkcik7CisJCW4gLz0gNTEyOworCQlpZiAobiA+IGNoLT5zY250KQorCQkJbiA9IGNoLT5zY250OworCQluID0gbiA/IG4gKiA1MTIgOiBERUZBVUxUQkNOVDsKKwkJaWYgKG4gIT0gZC0+bWF4YmNudCkgeworCQkJcHJpbnRrKEtFUk5fSU5GTworCQkJCSJhb2U6IGUlbGQuJWxkOiBzZXR0aW5nICVkIGJ5dGUgZGF0YSBmcmFtZXMgb24gJXNcbiIsCisJCQkJZC0+YW9lbWFqb3IsIGQtPmFvZW1pbm9yLCBuLCBkLT5pZnAtPm5hbWUpOworCQkJZC0+bWF4YmNudCA9IG47CisJCX0KKwl9CiAKIAkvKiBkb24ndCBjaGFuZ2UgdXNlcnMnIHBlcnNwZWN0aXZlICovCiAJaWYgKGQtPm5vcGVuICYmICEoZC0+ZmxhZ3MgJiBERVZGTF9QQVVTRSkpIHsKQEAgLTY5Niw2ICs3ODQsNyBAQAogCQlyZXR1cm47CiAJfQogCWQtPmZsYWdzIHw9IERFVkZMX1BBVVNFOwkvKiBmb3JjZSBwYXVzZSAqLworCWQtPm1pbnRpbWVyID0gTUlOVElNRVI7CiAJZC0+ZndfdmVyID0gYmUxNl90b19jcHUoY2gtPmZ3dmVyKTsKIAogCS8qIGNoZWNrIGZvciBhbHJlYWR5IG91dHN0YW5kaW5nIGF0YWlkICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jsb2NrL2FvZS9hb2VkZXYuYyBiL2RyaXZlcnMvYmxvY2svYW9lL2FvZWRldi5jCmluZGV4IGVkNDI1OGEuLjYxMjU5MjEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmxvY2svYW9lL2FvZWRldi5jCisrKyBiL2RyaXZlcnMvYmxvY2svYW9lL2FvZWRldi5jCkBAIC0xLDQgKzEsNCBAQAotLyogQ29weXJpZ2h0IChjKSAyMDA0IENvcmFpZCwgSW5jLiAgU2VlIENPUFlJTkcgZm9yIEdQTCB0ZXJtcy4gKi8KKy8qIENvcHlyaWdodCAoYykgMjAwNiBDb3JhaWQsIEluYy4gIFNlZSBDT1BZSU5HIGZvciBHUEwgdGVybXMuICovCiAvKgogICogYW9lZGV2LmMKICAqIEFvRSBkZXZpY2UgdXRpbGl0eSBmdW5jdGlvbnM7IG1haW50YWlucyBkZXZpY2UgbGlzdC4KQEAgLTIwLDExICsyMCw4IEBACiAJZiA9IGQtPmZyYW1lczsKIAllID0gZiArIGQtPm5mcmFtZXM7CiAJZG8gewotCQlpZiAoZi0+dGFnICE9IEZSRUVUQUcpIHsKLQkJCXByaW50ayhLRVJOX0RFQlVHICJhb2U6ICVsZC4lbGQgaXNidXN5XG4iLAotCQkJCWQtPmFvZW1ham9yLCBkLT5hb2VtaW5vcik7CisJCWlmIChmLT50YWcgIT0gRlJFRVRBRykKIAkJCXJldHVybiAxOwotCQl9CiAJfSB3aGlsZSAoKytmIDwgZSk7CiAKIAlyZXR1cm4gMDsKQEAgLTY2LDIyICs2MywzMiBAQAogCXN0cnVjdCBmcmFtZSAqZiwgKmU7CiAKIAlkID0ga3phbGxvYyhzaXplb2YgKmQsIEdGUF9BVE9NSUMpOwotCWlmIChkID09IE5VTEwpCi0JCXJldHVybiBOVUxMOwogCWYgPSBrY2FsbG9jKG5mcmFtZXMsIHNpemVvZiAqZiwgR0ZQX0FUT01JQyk7Ci0JaWYgKGYgPT0gTlVMTCkgewotCQlrZnJlZShkKTsKKyAJc3dpdGNoICghZCB8fCAhZikgeworIAljYXNlIDA6CisgCQlkLT5uZnJhbWVzID0gbmZyYW1lczsKKyAJCWQtPmZyYW1lcyA9IGY7CisgCQllID0gZiArIG5mcmFtZXM7CisgCQlmb3IgKDsgZjxlOyBmKyspIHsKKyAJCQlmLT50YWcgPSBGUkVFVEFHOworIAkJCWYtPnNrYiA9IG5ld19za2IoRVRIX1pMRU4pOworIAkJCWlmICghZi0+c2tiKQorIAkJCQlicmVhazsKKyAJCX0KKyAJCWlmIChmID09IGUpCisgCQkJYnJlYWs7CisgCQl3aGlsZSAoZiA+IGQtPmZyYW1lcykgeworIAkJCWYtLTsKKyAJCQlkZXZfa2ZyZWVfc2tiKGYtPnNrYik7CisgCQl9CisgCWRlZmF1bHQ6CisgCQlpZiAoZikKKyAJCQlrZnJlZShmKTsKKyAJCWlmIChkKQorIAkJCWtmcmVlKGQpOwogCQlyZXR1cm4gTlVMTDsKIAl9Ci0KIAlJTklUX1dPUksoJmQtPndvcmssIGFvZWNtZF9zbGVlcHdvcmssIGQpOwotCi0JZC0+bmZyYW1lcyA9IG5mcmFtZXM7Ci0JZC0+ZnJhbWVzID0gZjsKLQllID0gZiArIG5mcmFtZXM7Ci0JZm9yICg7IGY8ZTsgZisrKQotCQlmLT50YWcgPSBGUkVFVEFHOwotCiAJc3Bpbl9sb2NrX2luaXQoJmQtPmxvY2spOwogCWluaXRfdGltZXIoJmQtPnRpbWVyKTsKIAlkLT50aW1lci5kYXRhID0gKHVsb25nKSBkOwpAQCAtMTE0LDYgKzEyMSw3IEBACiAJCQltZW1wb29sX2ZyZWUoYnVmLCBkLT5idWZwb29sKTsKIAkJCWJpb19lbmRpbyhiaW8sIGJpby0+Ymlfc2l6ZSwgLUVJTyk7CiAJCX0KKwkJc2tiX3NoaW5mbyhmLT5za2IpLT5ucl9mcmFncyA9IGYtPnNrYi0+ZGF0YV9sZW4gPSAwOwogCX0KIAlkLT5pbnByb2Nlc3MgPSBOVUxMOwogCkBAIC0xNDgsNyArMTU2LDcgQEAKIAkJZCA9IGFvZWRldl9uZXdkZXYoYnVmY250KTsKIAkgCWlmIChkID09IE5VTEwpIHsKIAkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldmxpc3RfbG9jaywgZmxhZ3MpOwotCQkJcHJpbnRrKEtFUk5fSU5GTyAiYW9lOiBhb2VkZXZfc2V0OiBhb2VkZXZfbmV3ZGV2IGZhaWx1cmUuXG4iKTsKKwkJCXByaW50ayhLRVJOX0lORk8gImFvZTogYW9lZGV2X25ld2RldiBmYWlsdXJlLlxuIik7CiAJCQlyZXR1cm4gTlVMTDsKIAkJfQogCQlkLT5zeXNtaW5vciA9IHN5c21pbm9yOwpAQCAtMTYzLDExICsxNzEsMTkgQEAKIHN0YXRpYyB2b2lkCiBhb2VkZXZfZnJlZWRldihzdHJ1Y3QgYW9lZGV2ICpkKQogeworCXN0cnVjdCBmcmFtZSAqZiwgKmU7CisKIAlpZiAoZC0+Z2QpIHsKIAkJYW9lZGlza19ybV9zeXNmcyhkKTsKIAkJZGVsX2dlbmRpc2soZC0+Z2QpOwogCQlwdXRfZGlzayhkLT5nZCk7CiAJfQorCWYgPSBkLT5mcmFtZXM7CisJZSA9IGYgKyBkLT5uZnJhbWVzOworCWZvciAoOyBmPGU7IGYrKykgeworCQlza2Jfc2hpbmZvKGYtPnNrYiktPm5yX2ZyYWdzID0gMDsKKwkJZGV2X2tmcmVlX3NrYihmLT5za2IpOworCX0KIAlrZnJlZShkLT5mcmFtZXMpOwogCWlmIChkLT5idWZwb29sKQogCQltZW1wb29sX2Rlc3Ryb3koZC0+YnVmcG9vbCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jsb2NrL2FvZS9hb2VtYWluLmMgYi9kcml2ZXJzL2Jsb2NrL2FvZS9hb2VtYWluLmMKaW5kZXggZGUwODQ5MS4uYTA0YjdkNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ibG9jay9hb2UvYW9lbWFpbi5jCisrKyBiL2RyaXZlcnMvYmxvY2svYW9lL2FvZW1haW4uYwpAQCAtMSw0ICsxLDQgQEAKLS8qIENvcHlyaWdodCAoYykgMjAwNCBDb3JhaWQsIEluYy4gIFNlZSBDT1BZSU5HIGZvciBHUEwgdGVybXMuICovCisvKiBDb3B5cmlnaHQgKGMpIDIwMDYgQ29yYWlkLCBJbmMuICBTZWUgQ09QWUlORyBmb3IgR1BMIHRlcm1zLiAqLwogLyoKICAqIGFvZW1haW4uYwogICogTW9kdWxlIGluaXRpYWxpemF0aW9uIHJvdXRpbmVzLCBkaXNjb3ZlciB0aW1lcgpAQCAtODQsMTMgKzg0LDExIEBACiAJCWdvdG8gbmV0X2ZhaWw7CiAJcmV0ID0gcmVnaXN0ZXJfYmxrZGV2KEFPRV9NQUpPUiwgREVWSUNFX05BTUUpOwogCWlmIChyZXQgPCAwKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiYW9lOiBhb2VibGtfaW5pdDogY2FuJ3QgcmVnaXN0ZXIgbWFqb3JcbiIpOworCQlwcmludGsoS0VSTl9FUlIgImFvZTogY2FuJ3QgcmVnaXN0ZXIgbWFqb3JcbiIpOwogCQlnb3RvIGJsa3JlZ19mYWlsOwogCX0KIAotCXByaW50ayhLRVJOX0lORk8KLQkgICAgICAgImFvZTogYW9lX2luaXQ6IEFvRSB2JXMgaW5pdGlhbGlzZWQuXG4iLAotCSAgICAgICBWRVJTSU9OKTsKKwlwcmludGsoS0VSTl9JTkZPICJhb2U6IEFvRSB2JXMgaW5pdGlhbGlzZWQuXG4iLCBWRVJTSU9OKTsKIAlkaXNjb3Zlcl90aW1lcihUSU5JVCk7CiAJcmV0dXJuIDA7CiAKQEAgLTEwMyw3ICsxMDEsNyBAQAogIGNocl9mYWlsOgogCWFvZWRldl9leGl0KCk7CiAJCi0JcHJpbnRrKEtFUk5fSU5GTyAiYW9lOiBhb2VfaW5pdDogaW5pdGlhbGlzYXRpb24gZmFpbHVyZS5cbiIpOworCXByaW50ayhLRVJOX0lORk8gImFvZTogaW5pdGlhbGlzYXRpb24gZmFpbHVyZS5cbiIpOwogCXJldHVybiByZXQ7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmxvY2svYW9lL2FvZW5ldC5jIGIvZHJpdmVycy9ibG9jay9hb2UvYW9lbmV0LmMKaW5kZXggYzE0MzRlZC4uOTYyNmUwZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ibG9jay9hb2UvYW9lbmV0LmMKKysrIGIvZHJpdmVycy9ibG9jay9hb2UvYW9lbmV0LmMKQEAgLTEsNCArMSw0IEBACi0vKiBDb3B5cmlnaHQgKGMpIDIwMDQgQ29yYWlkLCBJbmMuICBTZWUgQ09QWUlORyBmb3IgR1BMIHRlcm1zLiAqLworLyogQ29weXJpZ2h0IChjKSAyMDA2IENvcmFpZCwgSW5jLiAgU2VlIENPUFlJTkcgZm9yIEdQTCB0ZXJtcy4gKi8KIC8qCiAgKiBhb2VuZXQuYwogICogRXRoZXJuZXQgcG9ydGlvbiBvZiBBb0UgZHJpdmVyCkBAIC03NCw3ICs3NCw3IEBACiAJCXJldHVybiAtRUlOVkFMOwogCiAJaWYgKGNvcHlfZnJvbV91c2VyKGFvZV9pZmxpc3QsIHVzZXJfc3RyLCBzaXplKSkgewotCQlwcmludGsoS0VSTl9JTkZPICJhb2U6ICVzOiBjb3B5IGZyb20gdXNlciBmYWlsZWRcbiIsIF9fRlVOQ1RJT05fXyk7CisJCXByaW50ayhLRVJOX0lORk8gImFvZTogY29weSBmcm9tIHVzZXIgZmFpbGVkXG4iKTsKIAkJcmV0dXJuIC1FRkFVTFQ7CiAJfQogCWFvZV9pZmxpc3Rbc2l6ZV0gPSAweDAwOwpAQCAtMTMyLDggKzEzMiw3IEBACiAJCWlmIChuID4gTkVDT0RFUykKIAkJCW4gPSAwOwogCQlpZiAobmV0X3JhdGVsaW1pdCgpKQotCQkJcHJpbnRrKEtFUk5fRVJSICJhb2U6IGFvZW5ldF9yY3Y6IGVycm9yIHBhY2tldCBmcm9tICVkLiVkOyAiCi0JCQkgICAgICAgImVjb2RlPSVkICclcydcbiIsCisJCQlwcmludGsoS0VSTl9FUlIgImFvZTogZXJyb3IgcGFja2V0IGZyb20gJWQuJWQ7IGVjb2RlPSVkICclcydcbiIsCiAJCQkgICAgICAgYmUxNl90b19jcHUoaC0+bWFqb3IpLCBoLT5taW5vciwgCiAJCQkgICAgICAgaC0+ZXJyLCBhb2VfZXJybGlzdFtuXSk7CiAJCWdvdG8gZXhpdDsKQEAgLTE0Nyw3ICsxNDYsNyBAQAogCQlhb2VjbWRfY2ZnX3JzcChza2IpOwogCQlicmVhazsKIAlkZWZhdWx0OgotCQlwcmludGsoS0VSTl9JTkZPICJhb2U6IGFvZW5ldF9yY3Y6IHVua25vd24gY21kICVkXG4iLCBoLT5jbWQpOworCQlwcmludGsoS0VSTl9JTkZPICJhb2U6IHVua25vd24gY21kICVkXG4iLCBoLT5jbWQpOwogCX0KIGV4aXQ6CiAJZGV2X2tmcmVlX3NrYihza2IpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ibG9jay9jY2lzcy5jIGIvZHJpdmVycy9ibG9jay9jY2lzcy5jCmluZGV4IGRjY2NhZjIuLjQxMDVjM2IgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmxvY2svY2Npc3MuYworKysgYi9kcml2ZXJzL2Jsb2NrL2NjaXNzLmMKQEAgLTEzMDAsNiArMTMwMCwxMiBAQAogCiAJY29tcGxldGVfYnVmZmVycyhycS0+YmlvLCBycS0+ZXJyb3JzKTsKIAorCWlmIChibGtfZnNfcmVxdWVzdChycSkpIHsKKwkJY29uc3QgaW50IHJ3ID0gcnFfZGF0YV9kaXIocnEpOworCisJCWRpc2tfc3RhdF9hZGQocnEtPnJxX2Rpc2ssIHNlY3RvcnNbcnddLCBycS0+bnJfc2VjdG9ycyk7CisJfQorCiAjaWZkZWYgQ0NJU1NfREVCVUcKIAlwcmludGsoIkRvbmUgd2l0aCAlcFxuIiwgcnEpOwogI2VuZGlmCQkJCS8qIENDSVNTX0RFQlVHICovCkBAIC0xOTIzLDcgKzE5MjksNiBAQAogewogCWludCByZXR1cm5fY29kZTsKIAl1bnNpZ25lZCBsb25nIHQ7Ci0JdW5zaWduZWQgbG9uZyByZW07CiAKIAltZW1zZXQoaW5xX2J1ZmYsIDAsIHNpemVvZihJbnF1aXJ5RGF0YV9zdHJ1Y3QpKTsKIAlpZiAod2l0aGlycSkKQEAgLTE5MzksMjYgKzE5NDQsMjMgQEAKIAkJCXByaW50ayhLRVJOX1dBUk5JTkcKIAkJCSAgICAgICAiY2Npc3M6IHJlYWRpbmcgZ2VvbWV0cnkgZmFpbGVkLCB2b2x1bWUgIgogCQkJICAgICAgICJkb2VzIG5vdCBzdXBwb3J0IHJlYWRpbmcgZ2VvbWV0cnlcbiIpOwotCQkJZHJ2LT5ibG9ja19zaXplID0gYmxvY2tfc2l6ZTsKLQkJCWRydi0+bnJfYmxvY2tzID0gdG90YWxfc2l6ZTsKIAkJCWRydi0+aGVhZHMgPSAyNTU7CiAJCQlkcnYtPnNlY3RvcnMgPSAzMjsJLy8gU2VjdG9ycyBwZXIgdHJhY2sKLQkJCXQgPSBkcnYtPmhlYWRzICogZHJ2LT5zZWN0b3JzOwotCQkJZHJ2LT5jeWxpbmRlcnMgPSB0b3RhbF9zaXplOwotCQkJcmVtID0gZG9fZGl2KGRydi0+Y3lsaW5kZXJzLCB0KTsKIAkJfSBlbHNlIHsKLQkJCWRydi0+YmxvY2tfc2l6ZSA9IGJsb2NrX3NpemU7Ci0JCQlkcnYtPm5yX2Jsb2NrcyA9IHRvdGFsX3NpemU7CiAJCQlkcnYtPmhlYWRzID0gaW5xX2J1ZmYtPmRhdGFfYnl0ZVs2XTsKIAkJCWRydi0+c2VjdG9ycyA9IGlucV9idWZmLT5kYXRhX2J5dGVbN107CiAJCQlkcnYtPmN5bGluZGVycyA9IChpbnFfYnVmZi0+ZGF0YV9ieXRlWzRdICYgMHhmZikgPDwgODsKIAkJCWRydi0+Y3lsaW5kZXJzICs9IGlucV9idWZmLT5kYXRhX2J5dGVbNV07CiAJCQlkcnYtPnJhaWRfbGV2ZWwgPSBpbnFfYnVmZi0+ZGF0YV9ieXRlWzhdOwotCQkJdCA9IGRydi0+aGVhZHMgKiBkcnYtPnNlY3RvcnM7Ci0JCQlpZiAodCA+IDEpIHsKLQkJCQlkcnYtPmN5bGluZGVycyA9IHRvdGFsX3NpemU7Ci0JCQkJcmVtID0gZG9fZGl2KGRydi0+Y3lsaW5kZXJzLCB0KTsKLQkJCX0KKwkJfQorCQlkcnYtPmJsb2NrX3NpemUgPSBibG9ja19zaXplOworCQlkcnYtPm5yX2Jsb2NrcyA9IHRvdGFsX3NpemU7CisJCXQgPSBkcnYtPmhlYWRzICogZHJ2LT5zZWN0b3JzOworCQlpZiAodCA+IDEpIHsKKwkJCXVuc2lnbmVkIHJlbSA9IHNlY3Rvcl9kaXYodG90YWxfc2l6ZSwgdCk7CisJCQlpZiAocmVtKQorCQkJCXRvdGFsX3NpemUrKzsKKwkJCWRydi0+Y3lsaW5kZXJzID0gdG90YWxfc2l6ZTsKIAkJfQogCX0gZWxzZSB7CQkvKiBHZXQgZ2VvbWV0cnkgZmFpbGVkICovCiAJCXByaW50ayhLRVJOX1dBUk5JTkcgImNjaXNzOiByZWFkaW5nIGdlb21ldHJ5IGZhaWxlZFxuIik7CkBAIC0xOTk2LDggKzE5OTgsOCBAQAogCQkqYmxvY2tfc2l6ZSA9IEJMT0NLX1NJWkU7CiAJfQogCWlmICgqdG90YWxfc2l6ZSAhPSAoX191MzIpIDApCi0JCXByaW50ayhLRVJOX0lORk8gIiAgICAgIGJsb2Nrcz0gJWxsZCBibG9ja19zaXplPSAlZFxuIiwKLQkJKnRvdGFsX3NpemUsICpibG9ja19zaXplKTsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiICAgICAgYmxvY2tzPSAlbGx1IGJsb2NrX3NpemU9ICVkXG4iLAorCQkodW5zaWduZWQgbG9uZyBsb25nKSp0b3RhbF9zaXplLCAqYmxvY2tfc2l6ZSk7CiAJa2ZyZWUoYnVmKTsKIAlyZXR1cm47CiB9CkBAIC0yMDMxLDggKzIwMzMsOCBAQAogCQkqdG90YWxfc2l6ZSA9IDA7CiAJCSpibG9ja19zaXplID0gQkxPQ0tfU0laRTsKIAl9Ci0JcHJpbnRrKEtFUk5fSU5GTyAiICAgICAgYmxvY2tzPSAlbGxkIGJsb2NrX3NpemU9ICVkXG4iLAotCSAgICAgICAqdG90YWxfc2l6ZSwgKmJsb2NrX3NpemUpOworCXByaW50ayhLRVJOX0lORk8gIiAgICAgIGJsb2Nrcz0gJWxsdSBibG9ja19zaXplPSAlZFxuIiwKKwkgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZykqdG90YWxfc2l6ZSwgKmJsb2NrX3NpemUpOwogCWtmcmVlKGJ1Zik7CiAJcmV0dXJuOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ibG9jay9jcHFhcnJheS5jIGIvZHJpdmVycy9ibG9jay9jcHFhcnJheS5jCmluZGV4IDU3MGQyZjAuLmQ1ZjUxOWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmxvY2svY3BxYXJyYXkuYworKysgYi9kcml2ZXJzL2Jsb2NrL2NwcWFycmF5LmMKQEAgLTk5OCw2ICs5OTgsNyBAQAogICovCiBzdGF0aWMgaW5saW5lIHZvaWQgY29tcGxldGVfY29tbWFuZChjbWRsaXN0X3QgKmNtZCwgaW50IHRpbWVvdXQpCiB7CisJc3RydWN0IHJlcXVlc3QgKnJxID0gY21kLT5ycTsKIAlpbnQgb2s9MTsKIAlpbnQgaSwgZGRpcjsKIApAQCAtMTAyOSwxMiArMTAzMCwxOCBAQAogICAgICAgICAgICAgICAgIHBjaV91bm1hcF9wYWdlKGhiYVtjbWQtPmN0bHJdLT5wY2lfZGV2LCBjbWQtPnJlcS5zZ1tpXS5hZGRyLAogCQkJCWNtZC0+cmVxLnNnW2ldLnNpemUsIGRkaXIpOwogCi0JY29tcGxldGVfYnVmZmVycyhjbWQtPnJxLT5iaW8sIG9rKTsKKwljb21wbGV0ZV9idWZmZXJzKHJxLT5iaW8sIG9rKTsKIAotCWFkZF9kaXNrX3JhbmRvbW5lc3MoY21kLT5ycS0+cnFfZGlzayk7CisJaWYgKGJsa19mc19yZXF1ZXN0KHJxKSkgeworCQljb25zdCBpbnQgcncgPSBycV9kYXRhX2RpcihycSk7CiAKLSAgICAgICAgREJHUFgocHJpbnRrKCJEb25lIHdpdGggJXBcbiIsIGNtZC0+cnEpOyk7Ci0JZW5kX3RoYXRfcmVxdWVzdF9sYXN0KGNtZC0+cnEsIG9rID8gMSA6IC1FSU8pOworCQlkaXNrX3N0YXRfYWRkKHJxLT5ycV9kaXNrLCBzZWN0b3JzW3J3XSwgcnEtPm5yX3NlY3RvcnMpOworCX0KKworCWFkZF9kaXNrX3JhbmRvbW5lc3MocnEtPnJxX2Rpc2spOworCisJREJHUFgocHJpbnRrKCJEb25lIHdpdGggJXBcbiIsIHJxKTspOworCWVuZF90aGF0X3JlcXVlc3RfbGFzdChycSwgb2sgPyAxIDogLUVJTyk7CiB9CiAKIC8qCmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jsb2NrL3JkLmMgYi9kcml2ZXJzL2Jsb2NrL3JkLmMKaW5kZXggYTNmNjRiZi4uNDg1YWE4NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9ibG9jay9yZC5jCisrKyBiL2RyaXZlcnMvYmxvY2svcmQuYwpAQCAtNDMyLDYgKzQzMiwxMiBAQAogCQlyZF9kaXNrc1tpXSA9IGFsbG9jX2Rpc2soMSk7CiAJCWlmICghcmRfZGlza3NbaV0pCiAJCQlnb3RvIG91dDsKKworCQlyZF9xdWV1ZVtpXSA9IGJsa19hbGxvY19xdWV1ZShHRlBfS0VSTkVMKTsKKwkJaWYgKCFyZF9xdWV1ZVtpXSkgeworCQkJcHV0X2Rpc2socmRfZGlza3NbaV0pOworCQkJZ290byBvdXQ7CisJCX0KIAl9CiAKIAlpZiAocmVnaXN0ZXJfYmxrZGV2KFJBTURJU0tfTUFKT1IsICJyYW1kaXNrIikpIHsKQEAgLTQ0MiwxMCArNDQ4LDYgQEAKIAlmb3IgKGkgPSAwOyBpIDwgQ09ORklHX0JMS19ERVZfUkFNX0NPVU5UOyBpKyspIHsKIAkJc3RydWN0IGdlbmRpc2sgKmRpc2sgPSByZF9kaXNrc1tpXTsKIAotCQlyZF9xdWV1ZVtpXSA9IGJsa19hbGxvY19xdWV1ZShHRlBfS0VSTkVMKTsKLQkJaWYgKCFyZF9xdWV1ZVtpXSkKLQkJCWdvdG8gb3V0X3F1ZXVlOwotCiAJCWJsa19xdWV1ZV9tYWtlX3JlcXVlc3QocmRfcXVldWVbaV0sICZyZF9tYWtlX3JlcXVlc3QpOwogCQlibGtfcXVldWVfaGFyZHNlY3Rfc2l6ZShyZF9xdWV1ZVtpXSwgcmRfYmxvY2tzaXplKTsKIApAQCAtNDY2LDggKzQ2OCw2IEBACiAJCUNPTkZJR19CTEtfREVWX1JBTV9DT1VOVCwgcmRfc2l6ZSwgcmRfYmxvY2tzaXplKTsKIAogCXJldHVybiAwOwotb3V0X3F1ZXVlOgotCXVucmVnaXN0ZXJfYmxrZGV2KFJBTURJU0tfTUFKT1IsICJyYW1kaXNrIik7CiBvdXQ6CiAJd2hpbGUgKGktLSkgewogCQlwdXRfZGlzayhyZF9kaXNrc1tpXSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jsb2NrL3hkLmMgYi9kcml2ZXJzL2Jsb2NrL3hkLmMKaW5kZXggMTBjYzM4Ny4uMGQ5N2I3ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ibG9jay94ZC5jCisrKyBiL2RyaXZlcnMvYmxvY2sveGQuYwpAQCAtNDgsOSArNDgsOSBAQAogI2luY2x1ZGUgPGxpbnV4L2Jsa2Rldi5oPgogI2luY2x1ZGUgPGxpbnV4L2Jsa3BnLmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgogCiAjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgotI2luY2x1ZGUgPGFzbS9pby5oPgogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CiAjaW5jbHVkZSA8YXNtL2RtYS5oPgogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jsb2NrL3oycmFtLmMgYi9kcml2ZXJzL2Jsb2NrL3oycmFtLmMKaW5kZXggODJkZGJkZC4uN2NjMjY4NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ibG9jay96MnJhbS5jCisrKyBiL2RyaXZlcnMvYmxvY2svejJyYW0uYwpAQCAtMzI5LDcgKzMyOSw3IEBACiAKIHN0YXRpYyBzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqejJfcXVldWU7CiAKLWludCBfX2luaXQgCitzdGF0aWMgaW50IF9faW5pdCAKIHoyX2luaXQodm9pZCkKIHsKICAgICBpbnQgcmV0OwpAQCAtMzcwLDI2ICszNzAsNyBAQAogICAgIHJldHVybiByZXQ7CiB9CiAKLSNpZiBkZWZpbmVkKE1PRFVMRSkKLQotTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwotCi1pbnQKLWluaXRfbW9kdWxlKCB2b2lkICkKLXsKLSAgICBpbnQgZXJyb3I7Ci0gICAgCi0gICAgZXJyb3IgPSB6Ml9pbml0KCk7Ci0gICAgaWYgKCBlcnJvciA9PSAwICkKLSAgICB7Ci0JcHJpbnRrKCBLRVJOX0lORk8gREVWSUNFX05BTUUgIjogbG9hZGVkIGFzIG1vZHVsZVxuIiApOwotICAgIH0KLSAgICAKLSAgICByZXR1cm4gZXJyb3I7Ci19Ci0KLXZvaWQKLWNsZWFudXBfbW9kdWxlKCB2b2lkICkKK3N0YXRpYyB2b2lkIF9fZXhpdCB6Ml9leGl0KHZvaWQpCiB7CiAgICAgaW50IGksIGo7CiAgICAgYmxrX3VucmVnaXN0ZXJfcmVnaW9uKE1LREVWKFoyUkFNX01BSk9SLCAwKSwgMjU2KTsKQEAgLTQyNSw0ICs0MDYsNyBAQAogCiAgICAgcmV0dXJuOwogfSAKLSNlbmRpZgorCittb2R1bGVfaW5pdCh6Ml9pbml0KTsKK21vZHVsZV9leGl0KHoyX2V4aXQpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ibHVldG9vdGgvYmNtMjAzeC5jIGIvZHJpdmVycy9ibHVldG9vdGgvYmNtMjAzeC5jCmluZGV4IDY3Y2RkYTQuLjUxNjc1MTcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmx1ZXRvb3RoL2JjbTIwM3guYworKysgYi9kcml2ZXJzL2JsdWV0b290aC9iY20yMDN4LmMKQEAgLTI5LDcgKzI5LDYgQEAKICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KICNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgotI2luY2x1ZGUgPGxpbnV4L3RpbWVyLmg+CiAKICNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9maXJtd2FyZS5oPgpAQCAtNDMsNyArNDIsNyBAQAogI2RlZmluZSBCVF9EQkcoRC4uLikKICNlbmRpZgogCi0jZGVmaW5lIFZFUlNJT04gIjEuMCIKKyNkZWZpbmUgVkVSU0lPTiAiMS4xIgogCiBzdGF0aWMgaW50IGlnbm9yZSA9IDA7CiAKQEAgLTcyLDcgKzcxLDcgQEAKIAogCXVuc2lnbmVkIGxvbmcJCXN0YXRlOwogCi0Jc3RydWN0IHRpbWVyX2xpc3QJdGltZXI7CisJc3RydWN0IHdvcmtfc3RydWN0CXdvcms7CiAKIAlzdHJ1Y3QgdXJiCQkqdXJiOwogCXVuc2lnbmVkIGNoYXIJCSpidWZmZXI7CkBAIC0xMDUsNyArMTA0LDcgQEAKIAogCQlkYXRhLT5zdGF0ZSA9IEJDTTIwM1hfU0VMRUNUX01FTU9SWTsKIAotCQltb2RfdGltZXIoJmRhdGEtPnRpbWVyLCBqaWZmaWVzICsgKEhaIC8gMTApKTsKKwkJc2NoZWR1bGVfd29yaygmZGF0YS0+d29yayk7CiAJCWJyZWFrOwogCiAJY2FzZSBCQ00yMDNYX1NFTEVDVF9NRU1PUlk6CkBAIC0xNTgsOSArMTU3LDkgQEAKIAl9CiB9CiAKLXN0YXRpYyB2b2lkIGJjbTIwM3hfdGltZXIodW5zaWduZWQgbG9uZyB1c2VyX2RhdGEpCitzdGF0aWMgdm9pZCBiY20yMDN4X3dvcmsodm9pZCAqdXNlcl9kYXRhKQogewotCXN0cnVjdCBiY20yMDN4X2RhdGEgKmRhdGEgPSAoc3RydWN0IGJjbTIwM3hfZGF0YSAqKSB1c2VyX2RhdGE7CisJc3RydWN0IGJjbTIwM3hfZGF0YSAqZGF0YSA9IHVzZXJfZGF0YTsKIAogCWlmICh1c2Jfc3VibWl0X3VyYihkYXRhLT51cmIsIEdGUF9BVE9NSUMpIDwgMCkKIAkJQlRfRVJSKCJDYW4ndCBzdWJtaXQgVVJCIik7CkBAIC0yNDcsMTMgKzI0NiwxMSBAQAogCiAJcmVsZWFzZV9maXJtd2FyZShmaXJtd2FyZSk7CiAKLQlpbml0X3RpbWVyKCZkYXRhLT50aW1lcik7Ci0JZGF0YS0+dGltZXIuZnVuY3Rpb24gPSBiY20yMDN4X3RpbWVyOwotCWRhdGEtPnRpbWVyLmRhdGEgPSAodW5zaWduZWQgbG9uZykgZGF0YTsKKwlJTklUX1dPUksoJmRhdGEtPndvcmssIGJjbTIwM3hfd29yaywgKHZvaWQgKikgZGF0YSk7CiAKIAl1c2Jfc2V0X2ludGZkYXRhKGludGYsIGRhdGEpOwogCi0JbW9kX3RpbWVyKCZkYXRhLT50aW1lciwgamlmZmllcyArIEhaKTsKKwlzY2hlZHVsZV93b3JrKCZkYXRhLT53b3JrKTsKIAogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ibHVldG9vdGgvYmx1ZWNhcmRfY3MuYyBiL2RyaXZlcnMvYmx1ZXRvb3RoL2JsdWVjYXJkX2NzLmMKaW5kZXggODQ1Yjg2OC4uY2JjMDcyNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ibHVldG9vdGgvYmx1ZWNhcmRfY3MuYworKysgYi9kcml2ZXJzL2JsdWV0b290aC9ibHVlY2FyZF9jcy5jCkBAIC0yODIsNyArMjgyLDcgQEAKIAkJY2xlYXJfYml0KHJlYWR5X2JpdCwgJihpbmZvLT50eF9zdGF0ZSkpOwogCiAJCWlmIChidF9jYihza2IpLT5wa3RfdHlwZSAmIDB4ODApIHsKLQkJCURFQ0xBUkVfV0FJVF9RVUVVRV9IRUFEKHdxKTsKKwkJCURFQ0xBUkVfV0FJVF9RVUVVRV9IRUFEX09OU1RBQ0sod3EpOwogCQkJREVGSU5FX1dBSVQod2FpdCk7CiAKIAkJCXVuc2lnbmVkIGNoYXIgYmF1ZF9yZWc7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2JsdWV0b290aC9kdGwxX2NzLmMgYi9kcml2ZXJzL2JsdWV0b290aC9kdGwxX2NzLmMKaW5kZXggZTdjODAwZi4uMDdlYWZiYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9ibHVldG9vdGgvZHRsMV9jcy5jCisrKyBiL2RyaXZlcnMvYmx1ZXRvb3RoL2R0bDFfY3MuYwpAQCAtNzExLDYgKzcxMSw3IEBACiAKIHN0YXRpYyBzdHJ1Y3QgcGNtY2lhX2RldmljZV9pZCBkdGwxX2lkc1tdID0gewogCVBDTUNJQV9ERVZJQ0VfUFJPRF9JRDEyKCJOb2tpYSBNb2JpbGUgUGhvbmVzIiwgIkRUTC0xIiwgMHhlMWJmZGQ2NCwgMHhlMTY4NDgwZCksCisJUENNQ0lBX0RFVklDRV9QUk9EX0lEMTIoIk5va2lhIE1vYmlsZSBQaG9uZXMiLCAiRFRMLTQiLCAweGUxYmZkZDY0LCAweDkxMDJiYzgyKSwKIAlQQ01DSUFfREVWSUNFX1BST0RfSUQxMigiU29ja2V0IiwgIkNGIiwgMHhiMzhiY2MyZSwgMHg0NGViZjg2MyksCiAJUENNQ0lBX0RFVklDRV9QUk9EX0lEMTIoIlNvY2tldCIsICJDRisgUGVyc29uYWwgTmV0d29yayBDYXJkIiwgMHhiMzhiY2MyZSwgMHhlNzMyYmFlMyksCiAJUENNQ0lBX0RFVklDRV9OVUxMCmRpZmYgLS1naXQgYS9kcml2ZXJzL2JsdWV0b290aC9oY2lfdXNiLmMgYi9kcml2ZXJzL2JsdWV0b290aC9oY2lfdXNiLmMKaW5kZXggNzU2NTY0Mi4uZmRlYTU4YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ibHVldG9vdGgvaGNpX3VzYi5jCisrKyBiL2RyaXZlcnMvYmx1ZXRvb3RoL2hjaV91c2IuYwpAQCAtMTE4LDYgKzExOCw5IEBACiAJLyogSUJNL0xlbm92byBUaGlua1BhZCB3aXRoIEJyb2FkY29tIGNoaXAgKi8KIAl7IFVTQl9ERVZJQ0UoMHgwYTVjLCAweDIwMWUpLCAuZHJpdmVyX2luZm8gPSBIQ0lfV1JPTkdfU0NPX01UVSB9LAogCisJLyogQU5ZQ09NIEJsdWV0b290aCBVU0ItMjAwIGFuZCBVU0ItMjUwICovCisJeyBVU0JfREVWSUNFKDB4MGE1YywgMHgyMTExKSwgLmRyaXZlcl9pbmZvID0gSENJX1JFU0VUIH0sCisKIAkvKiBNaWNyb3NvZnQgV2lyZWxlc3MgVHJhbnNjZWl2ZXIgZm9yIEJsdWV0b290aCAyLjAgKi8KIAl7IFVTQl9ERVZJQ0UoMHgwNDVlLCAweDAwOWMpLCAuZHJpdmVyX2luZm8gPSBIQ0lfUkVTRVQgfSwKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL0tjb25maWcgYi9kcml2ZXJzL2NoYXIvS2NvbmZpZwppbmRleCAwZTZmMzVmLi4yYWYxMmZjIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvS2NvbmZpZworKysgYi9kcml2ZXJzL2NoYXIvS2NvbmZpZwpAQCAtNDA5LDE0ICs0MDksNiBAQAogICAgICAgICAgSWYgeW91IGhhdmUgYW4gU0dJIEFsdGl4IHdpdGggYW4gYXR0YWNoZWQgU0FCcmljawogICAgICAgICAgc2F5IFkgb3IgTSBoZXJlLCBvdGhlcndpc2Ugc2F5IE4uCiAKLWNvbmZpZyBNU1BFQwotCXRyaXN0YXRlICJNZW1vcnkgc3BlY2lhbCBvcGVyYXRpb25zIGRyaXZlciIKLQlkZXBlbmRzIG9uIElBNjQKLQloZWxwCi0JICBJZiB5b3UgaGF2ZSBhbiBpYTY0IGFuZCB5b3Ugd2FudCB0byBlbmFibGUgbWVtb3J5IHNwZWNpYWwKLQkgIG9wZXJhdGlvbnMgc3VwcG9ydCAoZm9ybWVybHkga25vd24gYXMgZmV0Y2hvcCksIHNheSBZIGhlcmUsCi0JICBvdGhlcndpc2Ugc2F5IE4uCi0KIHNvdXJjZSAiZHJpdmVycy9zZXJpYWwvS2NvbmZpZyIKIAogY29uZmlnIFVOSVg5OF9QVFlTCkBAIC0xMDQ2LDcgKzEwMzgsNyBAQAogCiBjb25maWcgVEVMQ0xPQ0sKIAl0cmlzdGF0ZSAiVGVsZWNvbSBjbG9jayBkcml2ZXIgZm9yIE1QQkwwMDEwIEFUQ0EgU0JDIgotCWRlcGVuZHMgb24gRVhQRVJJTUVOVEFMCisJZGVwZW5kcyBvbiBFWFBFUklNRU5UQUwgJiYgWDg2CiAJZGVmYXVsdCBuCiAJaGVscAogCSAgVGhlIHRlbGVjb20gY2xvY2sgZGV2aWNlIGlzIHNwZWNpZmljIHRvIHRoZSBNUEJMMDAxMCBBVENBIGNvbXB1dGVyIGFuZApkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2FncC91bmlub3J0aC1hZ3AuYyBiL2RyaXZlcnMvY2hhci9hZ3AvdW5pbm9ydGgtYWdwLmMKaW5kZXggOTFiNzFlNy4uZGZmYzE5MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2FncC91bmlub3J0aC1hZ3AuYworKysgYi9kcml2ZXJzL2NoYXIvYWdwL3VuaW5vcnRoLWFncC5jCkBAIC0yNywzMiArMjcsNDIgQEAKIHN0YXRpYyBpbnQgdW5pbm9ydGhfcmV2Owogc3RhdGljIGludCBpc191MzsKIAorc3RhdGljIGNoYXIgX19kZXZpbml0ZGF0YSAqYXBlcnR1cmUgPSBOVUxMOwogCiBzdGF0aWMgaW50IHVuaW5vcnRoX2ZldGNoX3NpemUodm9pZCkKIHsKLQlpbnQgaTsKLQl1MzIgdGVtcDsKLQlzdHJ1Y3QgYXBlcl9zaXplX2luZm9fMzIgKnZhbHVlczsKKwlpbnQgaSwgc2l6ZSA9IDA7CisJc3RydWN0IGFwZXJfc2l6ZV9pbmZvXzMyICp2YWx1ZXMgPQorCSAgICBBX1NJWkVfMzIoYWdwX2JyaWRnZS0+ZHJpdmVyLT5hcGVydHVyZV9zaXplcyk7CiAKLQlwY2lfcmVhZF9jb25maWdfZHdvcmQoYWdwX2JyaWRnZS0+ZGV2LCBVTklfTl9DRkdfR0FSVF9CQVNFLCAmdGVtcCk7Ci0JdGVtcCAmPSB+KDB4ZmZmZmYwMDApOwotCXZhbHVlcyA9IEFfU0laRV8zMihhZ3BfYnJpZGdlLT5kcml2ZXItPmFwZXJ0dXJlX3NpemVzKTsKKwlpZiAoYXBlcnR1cmUpIHsKKwkJY2hhciAqc2F2ZSA9IGFwZXJ0dXJlOwogCi0JZm9yIChpID0gMDsgaSA8IGFncF9icmlkZ2UtPmRyaXZlci0+bnVtX2FwZXJ0dXJlX3NpemVzOyBpKyspIHsKLQkJaWYgKHRlbXAgPT0gdmFsdWVzW2ldLnNpemVfdmFsdWUpIHsKLQkJCWFncF9icmlkZ2UtPnByZXZpb3VzX3NpemUgPQotCQkJICAgIGFncF9icmlkZ2UtPmN1cnJlbnRfc2l6ZSA9ICh2b2lkICopICh2YWx1ZXMgKyBpKTsKLQkJCWFncF9icmlkZ2UtPmFwZXJ0dXJlX3NpemVfaWR4ID0gaTsKLQkJCXJldHVybiB2YWx1ZXNbaV0uc2l6ZTsKKwkJc2l6ZSA9IG1lbXBhcnNlKGFwZXJ0dXJlLCAmYXBlcnR1cmUpID4+IDIwOworCQlhcGVydHVyZSA9IHNhdmU7CisKKwkJZm9yIChpID0gMDsgaSA8IGFncF9icmlkZ2UtPmRyaXZlci0+bnVtX2FwZXJ0dXJlX3NpemVzOyBpKyspCisJCQlpZiAoc2l6ZSA9PSB2YWx1ZXNbaV0uc2l6ZSkKKwkJCQlicmVhazsKKworCQlpZiAoaSA9PSBhZ3BfYnJpZGdlLT5kcml2ZXItPm51bV9hcGVydHVyZV9zaXplcykgeworCQkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiSW52YWxpZCBhcGVydHVyZSBzaXplLCB1c2luZyIKKwkJCSAgICAgICAiIGRlZmF1bHRcbiIpOworCQkJc2l6ZSA9IDA7CisJCQlhcGVydHVyZSA9IE5VTEw7CiAJCX0KIAl9CiAKLQlhZ3BfYnJpZGdlLT5wcmV2aW91c19zaXplID0KLQkgICAgYWdwX2JyaWRnZS0+Y3VycmVudF9zaXplID0gKHZvaWQgKikgKHZhbHVlcyArIDEpOwotCWFncF9icmlkZ2UtPmFwZXJ0dXJlX3NpemVfaWR4ID0gMTsKLQlyZXR1cm4gdmFsdWVzWzFdLnNpemU7CisJaWYgKCFzaXplKSB7CisJCWZvciAoaSA9IDA7IGkgPCBhZ3BfYnJpZGdlLT5kcml2ZXItPm51bV9hcGVydHVyZV9zaXplczsgaSsrKQorCQkJaWYgKHZhbHVlc1tpXS5zaXplID09IDMyKQorCQkJCWJyZWFrOworCX0KIAotCXJldHVybiAwOworCWFncF9icmlkZ2UtPnByZXZpb3VzX3NpemUgPQorCSAgICBhZ3BfYnJpZGdlLT5jdXJyZW50X3NpemUgPSAodm9pZCAqKSh2YWx1ZXMgKyBpKTsKKwlhZ3BfYnJpZGdlLT5hcGVydHVyZV9zaXplX2lkeCA9IGk7CisJcmV0dXJuIHZhbHVlc1tpXS5zaXplOwogfQogCiBzdGF0aWMgdm9pZCB1bmlub3J0aF90bGJmbHVzaChzdHJ1Y3QgYWdwX21lbW9yeSAqbWVtKQpAQCAtNjgzLDUgKzY5MywxMSBAQAogbW9kdWxlX2luaXQoYWdwX3VuaW5vcnRoX2luaXQpOwogbW9kdWxlX2V4aXQoYWdwX3VuaW5vcnRoX2NsZWFudXApOwogCittb2R1bGVfcGFyYW0oYXBlcnR1cmUsIGNoYXJwLCAwKTsKK01PRFVMRV9QQVJNX0RFU0MoYXBlcnR1cmUsCisJCSAiQXBlcnR1cmUgc2l6ZSwgbXVzdCBiZSBwb3dlciBvZiB0d28gYmV0d2VlbiA0TUIgYW5kIGFuXG4iCisJCSAiXHRcdHVwcGVyIGxpbWl0IHNwZWNpZmljIHRvIHRoZSBVbmlOb3J0aCByZXZpc2lvbi5cbiIKKwkJICJcdFx0RGVmYXVsdDogMzJNIik7CisKIE1PRFVMRV9BVVRIT1IoIkJlbiBIZXJyZW5zY2htaWR0ICYgUGF1bCBNYWNrZXJyYXMiKTsKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9kcm0vZHJtX2J1ZnMuYyBiL2RyaXZlcnMvY2hhci9kcm0vZHJtX2J1ZnMuYwppbmRleCAwMjliYWVhLi42ZWFmZmYxIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvZHJtL2RybV9idWZzLmMKKysrIGIvZHJpdmVycy9jaGFyL2RybS9kcm1fYnVmcy5jCkBAIC0yMzcsNiArMjM3LDggQEAKIAogCWxpc3QgPSBkcm1fYWxsb2Moc2l6ZW9mKCpsaXN0KSwgRFJNX01FTV9NQVBTKTsKIAlpZiAoIWxpc3QpIHsKKwkJaWYgKG1hcC0+dHlwZSA9PSBfRFJNX1JFR0lTVEVSUykKKwkJCWRybV9pb3JlbWFwZnJlZShtYXAtPmhhbmRsZSwgbWFwLT5zaXplLCBkZXYpOwogCQlkcm1fZnJlZShtYXAsIHNpemVvZigqbWFwKSwgRFJNX01FTV9NQVBTKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQpAQCAtMjUyLDYgKzI1NCw4IEBACiAJCW1hcC0+b2Zmc2V0OwogCXJldCA9IGRybV9tYXBfaGFuZGxlKGRldiwgJmxpc3QtPmhhc2gsIHVzZXJfdG9rZW4sIDApOwogCWlmIChyZXQpIHsKKwkJaWYgKG1hcC0+dHlwZSA9PSBfRFJNX1JFR0lTVEVSUykKKwkJCWRybV9pb3JlbWFwZnJlZShtYXAtPmhhbmRsZSwgbWFwLT5zaXplLCBkZXYpOwogCQlkcm1fZnJlZShtYXAsIHNpemVvZigqbWFwKSwgRFJNX01FTV9NQVBTKTsKIAkJZHJtX2ZyZWUobGlzdCwgc2l6ZW9mKCpsaXN0KSwgRFJNX01FTV9NQVBTKTsKIAkJbXV0ZXhfdW5sb2NrKCZkZXYtPnN0cnVjdF9tdXRleCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZHJtL2RybV9zeXNmcy5jIGIvZHJpdmVycy9jaGFyL2RybS9kcm1fc3lzZnMuYwppbmRleCA1MWFkOThjLi5iYTRiOGRlIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvZHJtL2RybV9zeXNmcy5jCisrKyBiL2RyaXZlcnMvY2hhci9kcm0vZHJtX3N5c2ZzLmMKQEAgLTQyLDEzICs0MiwyNCBAQAogc3RydWN0IGNsYXNzICpkcm1fc3lzZnNfY3JlYXRlKHN0cnVjdCBtb2R1bGUgKm93bmVyLCBjaGFyICpuYW1lKQogewogCXN0cnVjdCBjbGFzcyAqY2xhc3M7CisJaW50IGVycjsKIAogCWNsYXNzID0gY2xhc3NfY3JlYXRlKG93bmVyLCBuYW1lKTsKLQlpZiAoIWNsYXNzKQotCQlyZXR1cm4gY2xhc3M7CisJaWYgKCFjbGFzcykgeworCQllcnIgPSAtRU5PTUVNOworCQlnb3RvIGVycl9vdXQ7CisJfQogCi0JY2xhc3NfY3JlYXRlX2ZpbGUoY2xhc3MsICZjbGFzc19hdHRyX3ZlcnNpb24pOworCWVyciA9IGNsYXNzX2NyZWF0ZV9maWxlKGNsYXNzLCAmY2xhc3NfYXR0cl92ZXJzaW9uKTsKKwlpZiAoZXJyKQorCQlnb3RvIGVycl9vdXRfY2xhc3M7CisKIAlyZXR1cm4gY2xhc3M7CisKK2Vycl9vdXRfY2xhc3M6CisJY2xhc3NfZGVzdHJveShjbGFzcyk7CitlcnJfb3V0OgorCXJldHVybiBFUlJfUFRSKGVycik7CiB9CiAKIC8qKgpAQCAtOTYsMjAgKzEwNywzNiBAQAogc3RydWN0IGNsYXNzX2RldmljZSAqZHJtX3N5c2ZzX2RldmljZV9hZGQoc3RydWN0IGNsYXNzICpjcywgZHJtX2hlYWRfdCAqaGVhZCkKIHsKIAlzdHJ1Y3QgY2xhc3NfZGV2aWNlICpjbGFzc19kZXY7Ci0JaW50IGk7CisJaW50IGksIGosIGVycjsKIAogCWNsYXNzX2RldiA9IGNsYXNzX2RldmljZV9jcmVhdGUoY3MsIE5VTEwsCiAJCQkJCU1LREVWKERSTV9NQUpPUiwgaGVhZC0+bWlub3IpLAogCQkJCQkmKGhlYWQtPmRldi0+cGRldiktPmRldiwKIAkJCQkJImNhcmQlZCIsIGhlYWQtPm1pbm9yKTsKLQlpZiAoIWNsYXNzX2RldikKLQkJcmV0dXJuIE5VTEw7CisJaWYgKCFjbGFzc19kZXYpIHsKKwkJZXJyID0gLUVOT01FTTsKKwkJZ290byBlcnJfb3V0OworCX0KIAogCWNsYXNzX3NldF9kZXZkYXRhKGNsYXNzX2RldiwgaGVhZCk7CiAKLQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShjbGFzc19kZXZpY2VfYXR0cnMpOyBpKyspCi0JCWNsYXNzX2RldmljZV9jcmVhdGVfZmlsZShjbGFzc19kZXYsICZjbGFzc19kZXZpY2VfYXR0cnNbaV0pOworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGNsYXNzX2RldmljZV9hdHRycyk7IGkrKykgeworCQllcnIgPSBjbGFzc19kZXZpY2VfY3JlYXRlX2ZpbGUoY2xhc3NfZGV2LAorCQkJCQkgICAgICAgJmNsYXNzX2RldmljZV9hdHRyc1tpXSk7CisJCWlmIChlcnIpCisJCQlnb3RvIGVycl9vdXRfZmlsZXM7CisJfQorCiAJcmV0dXJuIGNsYXNzX2RldjsKKworZXJyX291dF9maWxlczoKKwlpZiAoaSA+IDApCisJCWZvciAoaiA9IDA7IGogPCBpOyBqKyspCisJCQljbGFzc19kZXZpY2VfcmVtb3ZlX2ZpbGUoY2xhc3NfZGV2LAorCQkJCQkJICZjbGFzc19kZXZpY2VfYXR0cnNbaV0pOworCWNsYXNzX2RldmljZV91bnJlZ2lzdGVyKGNsYXNzX2Rldik7CitlcnJfb3V0OgorCXJldHVybiBFUlJfUFRSKGVycik7CiB9CiAKIC8qKgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2RybS9tZ2FfZHJ2LmMgYi9kcml2ZXJzL2NoYXIvZHJtL21nYV9kcnYuYwppbmRleCBlMzBmNTU2Li5iZTQ5ZGJiIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvZHJtL21nYV9kcnYuYworKysgYi9kcml2ZXJzL2NoYXIvZHJtL21nYV9kcnYuYwpAQCAtNDcsNiArNDcsNyBAQAogCSAgICBEUklWRVJfVVNFX0FHUCB8IERSSVZFUl9VU0VfTVRSUiB8IERSSVZFUl9QQ0lfRE1BIHwKIAkgICAgRFJJVkVSX0hBVkVfRE1BIHwgRFJJVkVSX0hBVkVfSVJRIHwgRFJJVkVSX0lSUV9TSEFSRUQgfAogCSAgICBEUklWRVJfSVJRX1ZCTCwKKwkuZGV2X3ByaXZfc2l6ZSA9IHNpemVvZihkcm1fbWdhX2J1Zl9wcml2X3QpLAogCS5sb2FkID0gbWdhX2RyaXZlcl9sb2FkLAogCS51bmxvYWQgPSBtZ2FfZHJpdmVyX3VubG9hZCwKIAkubGFzdGNsb3NlID0gbWdhX2RyaXZlcl9sYXN0Y2xvc2UsCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZHJtL3IzMDBfY21kYnVmLmMgYi9kcml2ZXJzL2NoYXIvZHJtL3IzMDBfY21kYnVmLmMKaW5kZXggMjZiZGYyYy4uZDE0NDc3YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2RybS9yMzAwX2NtZGJ1Zi5jCisrKyBiL2RyaXZlcnMvY2hhci9kcm0vcjMwMF9jbWRidWYuYwpAQCAtNTM4LDYgKzUzOCwzNiBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgX19pbmxpbmVfXyBpbnQgcjMwMF9lbWl0X2luZHhfYnVmZmVyKGRybV9yYWRlb25fcHJpdmF0ZV90ICpkZXZfcHJpdiwKKwkJCQkJICAgICBkcm1fcmFkZW9uX2tjbWRfYnVmZmVyX3QgKmNtZGJ1ZikKK3sKKwl1MzIgKmNtZCA9ICh1MzIgKikgY21kYnVmLT5idWY7CisJaW50IGNvdW50LCByZXQ7CisJUklOR19MT0NBTFM7CisKKwljb3VudD0oY21kWzBdPj4xNikgJiAweDNmZmY7CisKKwlpZiAoKGNtZFsxXSAmIDB4ODAwMGZmZmYpICE9IDB4ODAwMDA4MTApIHsKKwkJRFJNX0VSUk9SKCJJbnZhbGlkIGluZHhfYnVmZmVyIHJlZyBhZGRyZXNzICUwOFhcbiIsIGNtZFsxXSk7CisJCXJldHVybiBEUk1fRVJSKEVJTlZBTCk7CisJfQorCXJldCA9IHIzMDBfY2hlY2tfb2Zmc2V0KGRldl9wcml2LCBjbWRbMl0pOworCWlmIChyZXQpIHsKKwkJRFJNX0VSUk9SKCJJbnZhbGlkIGluZHhfYnVmZmVyIG9mZnNldCBpcyAlMDhYXG4iLCBjbWRbMl0pOworCQlyZXR1cm4gRFJNX0VSUihFSU5WQUwpOworCX0KKworCUJFR0lOX1JJTkcoY291bnQrMik7CisJT1VUX1JJTkcoY21kWzBdKTsKKwlPVVRfUklOR19UQUJMRSgoaW50ICopKGNtZGJ1Zi0+YnVmICsgNCksIGNvdW50ICsgMSk7CisJQURWQU5DRV9SSU5HKCk7CisKKwljbWRidWYtPmJ1ZiArPSAoY291bnQrMikqNDsKKwljbWRidWYtPmJ1ZnN6IC09IChjb3VudCsyKSo0OworCisJcmV0dXJuIDA7Cit9CisKIHN0YXRpYyBfX2lubGluZV9fIGludCByMzAwX2VtaXRfcmF3X3BhY2tldDMoZHJtX3JhZGVvbl9wcml2YXRlX3QgKmRldl9wcml2LAogCQkJCQkgICAgZHJtX3JhZGVvbl9rY21kX2J1ZmZlcl90ICpjbWRidWYpCiB7CkBAIC01NzgsMTAgKzYwOCwxMSBAQAogCWNhc2UgUkFERU9OX0NOVExfQklUQkxUX01VTFRJOgogCQlyZXR1cm4gcjMwMF9lbWl0X2JpdGJsdF9tdWx0aShkZXZfcHJpdiwgY21kYnVmKTsKIAorCWNhc2UgUkFERU9OX0NQX0lORFhfQlVGRkVSOgkvKiBEUkFXX0lORFhfMiB3aXRob3V0IElORFhfQlVGRkVSIHNlZW1zIHRvIGxvY2sgdXAgdGhlIGdwdSAqLworCQlyZXR1cm4gcjMwMF9lbWl0X2luZHhfYnVmZmVyKGRldl9wcml2LCBjbWRidWYpOwogCWNhc2UgUkFERU9OX0NQXzNEX0RSQVdfSU1NRF8yOgkvKiB0cmlnZ2VycyBkcmF3aW5nIHVzaW5nIGluLXBhY2tldCB2ZXJ0ZXggZGF0YSAqLwogCWNhc2UgUkFERU9OX0NQXzNEX0RSQVdfVkJVRl8yOgkvKiB0cmlnZ2VycyBkcmF3aW5nIG9mIHZlcnRleCBidWZmZXJzIHNldHVwIGVsc2V3aGVyZSAqLwogCWNhc2UgUkFERU9OX0NQXzNEX0RSQVdfSU5EWF8yOgkvKiB0cmlnZ2VycyBkcmF3aW5nIHVzaW5nIGluZGljZXMgdG8gdmVydGV4IGJ1ZmZlciAqLwotCWNhc2UgUkFERU9OX0NQX0lORFhfQlVGRkVSOgkvKiBEUkFXX0lORFhfMiB3aXRob3V0IElORFhfQlVGRkVSIHNlZW1zIHRvIGxvY2sgdXAgdGhlIGdwdSAqLwogCWNhc2UgUkFERU9OX1dBSVRfRk9SX0lETEU6CiAJY2FzZSBSQURFT05fQ1BfTk9QOgogCQkvKiB0aGVzZSBwYWNrZXRzIGFyZSBzYWZlICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZHJtL3JhZGVvbl9zdGF0ZS5jIGIvZHJpdmVycy9jaGFyL2RybS9yYWRlb25fc3RhdGUuYwppbmRleCBmZWFjNWYwLi42ZTA0ZmRkIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvZHJtL3JhZGVvbl9zdGF0ZS5jCisrKyBiL2RyaXZlcnMvY2hhci9kcm0vcmFkZW9uX3N0YXRlLmMKQEAgLTI3NSw2ICsyNzUsOCBAQAogCQkJCQkJICAgICB1bnNpZ25lZCBpbnQgKmNtZHN6KQogewogCXUzMiAqY21kID0gKHUzMiAqKSBjbWRidWYtPmJ1ZjsKKwl1MzIgb2Zmc2V0LCBuYXJyYXlzOworCWludCBjb3VudCwgaSwgazsKIAogCSpjbWRzeiA9IDIgKyAoKGNtZFswXSAmIFJBREVPTl9DUF9QQUNLRVRfQ09VTlRfTUFTSykgPj4gMTYpOwogCkBAIC0yODgsMTAgKzI5MCwxMDYgQEAKIAkJcmV0dXJuIERSTV9FUlIoRUlOVkFMKTsKIAl9CiAKLQkvKiBDaGVjayBjbGllbnQgc3RhdGUgYW5kIGZpeCBpdCB1cCBpZiBuZWNlc3NhcnkgKi8KLQlpZiAoY21kWzBdICYgMHg4MDAwKSB7CS8qIE1TQiBvZiBvcGNvZGU6IG5leHQgRFdPUkQgR1VJX0NOVEwgKi8KLQkJdTMyIG9mZnNldDsKKwlzd2l0Y2goY21kWzBdICYgMHhmZjAwKSB7CisJLyogWFhYIEFyZSB0aGVyZSBvbGQgZHJpdmVycyBuZWVkaW5nIG90aGVyIHBhY2tldHM/ICovCiAKKwljYXNlIFJBREVPTl8zRF9EUkFXX0lNTUQ6CisJY2FzZSBSQURFT05fM0RfRFJBV19WQlVGOgorCWNhc2UgUkFERU9OXzNEX0RSQVdfSU5EWDoKKwljYXNlIFJBREVPTl9XQUlUX0ZPUl9JRExFOgorCWNhc2UgUkFERU9OX0NQX05PUDoKKwljYXNlIFJBREVPTl8zRF9DTEVBUl9aTUFTSzoKKy8qCWNhc2UgUkFERU9OX0NQX05FWFRfQ0hBUjoKKwljYXNlIFJBREVPTl9DUF9QTFlfTkVYVFNDQU46CisJY2FzZSBSQURFT05fQ1BfU0VUX1NDSVNTT1JTOiAqLyAvKiBwcm9iYWJseSBzYWZlIGJ1dCB3aWxsIG5ldmVyIG5lZWQgdGhlbT8gKi8KKwkJLyogdGhlc2UgcGFja2V0cyBhcmUgc2FmZSAqLworCQlicmVhazsKKworCWNhc2UgUkFERU9OX0NQXzNEX0RSQVdfSU1NRF8yOgorCWNhc2UgUkFERU9OX0NQXzNEX0RSQVdfVkJVRl8yOgorCWNhc2UgUkFERU9OX0NQXzNEX0RSQVdfSU5EWF8yOgorCWNhc2UgUkFERU9OXzNEX0NMRUFSX0hJWjoKKwkJLyogc2FmZSBidXQgcjIwMCBvbmx5ICovCisJCWlmIChkZXZfcHJpdi0+bWljcm9jb2RlX3ZlcnNpb24gIT0gVUNPREVfUjIwMCkgeworCQkJRFJNX0VSUk9SKCJJbnZhbGlkIDNkIHBhY2tldCBmb3IgcjEwMC1jbGFzcyBjaGlwXG4iKTsKKwkJCXJldHVybiBEUk1fRVJSKEVJTlZBTCk7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIFJBREVPTl8zRF9MT0FEX1ZCUE5UUjoKKwkJY291bnQgPSAoY21kWzBdID4+IDE2KSAmIDB4M2ZmZjsKKworCQlpZiAoY291bnQgPiAxOCkgeyAvKiAxMiBhcnJheXMgbWF4ICovCisJCQlEUk1fRVJST1IoIlRvbyBsYXJnZSBwYXlsb2FkIGluIDNEX0xPQURfVkJQTlRSIChjb3VudD0lZClcbiIsCisJCQkJICBjb3VudCk7CisJCQlyZXR1cm4gRFJNX0VSUihFSU5WQUwpOworCQl9CisKKwkJLyogY2FyZWZ1bGx5IGNoZWNrIHBhY2tldCBjb250ZW50cyAqLworCQluYXJyYXlzID0gY21kWzFdICYgfjB4YzAwMDsKKwkJayA9IDA7CisJCWkgPSAyOworCQl3aGlsZSAoKGsgPCBuYXJyYXlzKSAmJiAoaSA8IChjb3VudCArIDIpKSkgeworCQkJaSsrOwkJLyogc2tpcCBhdHRyaWJ1dGUgZmllbGQgKi8KKwkJCWlmIChyYWRlb25fY2hlY2tfYW5kX2ZpeHVwX29mZnNldChkZXZfcHJpdiwgZmlscF9wcml2LCAmY21kW2ldKSkgeworCQkJCURSTV9FUlJPUgorCQkJCSAgICAoIkludmFsaWQgb2Zmc2V0IChrPSVkIGk9JWQpIGluIDNEX0xPQURfVkJQTlRSIHBhY2tldC5cbiIsCisJCQkJICAgICBrLCBpKTsKKwkJCQlyZXR1cm4gRFJNX0VSUihFSU5WQUwpOworCQkJfQorCQkJaysrOworCQkJaSsrOworCQkJaWYgKGsgPT0gbmFycmF5cykKKwkJCQlicmVhazsKKwkJCS8qIGhhdmUgb25lIG1vcmUgdG8gcHJvY2VzcywgdGhleSBjb21lIGluIHBhaXJzICovCisJCQlpZiAocmFkZW9uX2NoZWNrX2FuZF9maXh1cF9vZmZzZXQoZGV2X3ByaXYsIGZpbHBfcHJpdiwgJmNtZFtpXSkpIHsKKwkJCQlEUk1fRVJST1IKKwkJCQkgICAgKCJJbnZhbGlkIG9mZnNldCAoaz0lZCBpPSVkKSBpbiAzRF9MT0FEX1ZCUE5UUiBwYWNrZXQuXG4iLAorCQkJCSAgICAgaywgaSk7CisJCQkJcmV0dXJuIERSTV9FUlIoRUlOVkFMKTsKKwkJCX0KKwkJCWsrKzsKKwkJCWkrKzsKKwkJfQorCQkvKiBkbyB0aGUgY291bnRzIG1hdGNoIHdoYXQgd2UgZXhwZWN0ID8gKi8KKwkJaWYgKChrICE9IG5hcnJheXMpIHx8IChpICE9IChjb3VudCArIDIpKSkgeworCQkJRFJNX0VSUk9SCisJCQkgICAgKCJNYWxmb3JtZWQgM0RfTE9BRF9WQlBOVFIgcGFja2V0IChrPSVkIGk9JWQgbmFycmF5cz0lZCBjb3VudCsxPSVkKS5cbiIsCisJCQkgICAgICBrLCBpLCBuYXJyYXlzLCBjb3VudCArIDEpOworCQkJcmV0dXJuIERSTV9FUlIoRUlOVkFMKTsKKwkJfQorCQlicmVhazsKKworCWNhc2UgUkFERU9OXzNEX1JORFJfR0VOX0lORFhfUFJJTToKKwkJaWYgKGRldl9wcml2LT5taWNyb2NvZGVfdmVyc2lvbiAhPSBVQ09ERV9SMTAwKSB7CisJCQlEUk1fRVJST1IoIkludmFsaWQgM2QgcGFja2V0IGZvciByMjAwLWNsYXNzIGNoaXBcbiIpOworCQkJcmV0dXJuIERSTV9FUlIoRUlOVkFMKTsKKwkJfQorCQlpZiAocmFkZW9uX2NoZWNrX2FuZF9maXh1cF9vZmZzZXQoZGV2X3ByaXYsIGZpbHBfcHJpdiwgJmNtZFsxXSkpIHsKKwkJCQlEUk1fRVJST1IoIkludmFsaWQgcm5kcl9nZW5faW5keCBvZmZzZXRcbiIpOworCQkJCXJldHVybiBEUk1fRVJSKEVJTlZBTCk7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIFJBREVPTl9DUF9JTkRYX0JVRkZFUjoKKwkJaWYgKGRldl9wcml2LT5taWNyb2NvZGVfdmVyc2lvbiAhPSBVQ09ERV9SMjAwKSB7CisJCQlEUk1fRVJST1IoIkludmFsaWQgM2QgcGFja2V0IGZvciByMTAwLWNsYXNzIGNoaXBcbiIpOworCQkJcmV0dXJuIERSTV9FUlIoRUlOVkFMKTsKKwkJfQorCQlpZiAoKGNtZFsxXSAmIDB4ODAwMGZmZmYpICE9IDB4ODAwMDA4MTApIHsKKwkJCURSTV9FUlJPUigiSW52YWxpZCBpbmR4X2J1ZmZlciByZWcgYWRkcmVzcyAlMDhYXG4iLCBjbWRbMV0pOworCQkJcmV0dXJuIERSTV9FUlIoRUlOVkFMKTsKKwkJfQorCQlpZiAocmFkZW9uX2NoZWNrX2FuZF9maXh1cF9vZmZzZXQoZGV2X3ByaXYsIGZpbHBfcHJpdiwgJmNtZFsyXSkpIHsKKwkJCURSTV9FUlJPUigiSW52YWxpZCBpbmR4X2J1ZmZlciBvZmZzZXQgaXMgJTA4WFxuIiwgY21kWzJdKTsKKwkJCXJldHVybiBEUk1fRVJSKEVJTlZBTCk7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIFJBREVPTl9DTlRMX0hPU1REQVRBX0JMVDoKKwljYXNlIFJBREVPTl9DTlRMX1BBSU5UX01VTFRJOgorCWNhc2UgUkFERU9OX0NOVExfQklUQkxUX01VTFRJOgorCQkvKiBNU0Igb2Ygb3Bjb2RlOiBuZXh0IERXT1JEIEdVSV9DTlRMICovCiAJCWlmIChjbWRbMV0gJiAoUkFERU9OX0dNQ19TUkNfUElUQ0hfT0ZGU0VUX0NOVEwKIAkJCSAgICAgIHwgUkFERU9OX0dNQ19EU1RfUElUQ0hfT0ZGU0VUX0NOVEwpKSB7CiAJCQlvZmZzZXQgPSBjbWRbMl0gPDwgMTA7CkBAIC0zMTMsNiArNDExLDExIEBACiAJCQl9CiAJCQljbWRbM10gPSAoY21kWzNdICYgMHhmZmMwMDAwMCkgfCBvZmZzZXQgPj4gMTA7CiAJCX0KKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlEUk1fRVJST1IoIkludmFsaWQgcGFja2V0IHR5cGUgJXhcbiIsIGNtZFswXSAmIDB4ZmYwMCk7CisJCXJldHVybiBEUk1fRVJSKEVJTlZBTCk7CiAJfQogCiAJcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZHJtL3NhdmFnZV9iY2kuYyBiL2RyaXZlcnMvY2hhci9kcm0vc2F2YWdlX2JjaS5jCmluZGV4IDU5Yzc1MjAuLmE5YTg0ZjggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9kcm0vc2F2YWdlX2JjaS5jCisrKyBiL2RyaXZlcnMvY2hhci9kcm0vc2F2YWdlX2JjaS5jCkBAIC03MjgsNiArNzI4LDcgQEAKIAkJZGV2X3ByaXYtPnN0YXR1cyA9IE5VTEw7CiAJfQogCWlmIChkZXZfcHJpdi0+ZG1hX3R5cGUgPT0gU0FWQUdFX0RNQV9BR1AgJiYgaW5pdC0+YnVmZmVyc19vZmZzZXQpIHsKKwkJZGV2LT5hZ3BfYnVmZmVyX3Rva2VuID0gaW5pdC0+YnVmZmVyc19vZmZzZXQ7CiAJCWRldi0+YWdwX2J1ZmZlcl9tYXAgPSBkcm1fY29yZV9maW5kbWFwKGRldiwKIAkJCQkJCSAgICAgICBpbml0LT5idWZmZXJzX29mZnNldCk7CiAJCWlmICghZGV2LT5hZ3BfYnVmZmVyX21hcCkgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2RybS9zYXZhZ2Vfc3RhdGUuYyBiL2RyaXZlcnMvY2hhci9kcm0vc2F2YWdlX3N0YXRlLmMKaW5kZXggZWYyNTgxZC4uMWNhMWU5YyAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2RybS9zYXZhZ2Vfc3RhdGUuYworKysgYi9kcml2ZXJzL2NoYXIvZHJtL3NhdmFnZV9zdGF0ZS5jCkBAIC05OTQsNyArOTk0LDcgQEAKIAlpZiAoY21kYnVmLnNpemUpIHsKIAkJa2NtZF9hZGRyID0gZHJtX2FsbG9jKGNtZGJ1Zi5zaXplICogOCwgRFJNX01FTV9EUklWRVIpOwogCQlpZiAoa2NtZF9hZGRyID09IE5VTEwpCi0JCQlyZXR1cm4gRU5PTUVNOworCQkJcmV0dXJuIERSTV9FUlIoRU5PTUVNKTsKIAogCQlpZiAoRFJNX0NPUFlfRlJPTV9VU0VSKGtjbWRfYWRkciwgY21kYnVmLmNtZF9hZGRyLAogCQkJCSAgICAgICBjbWRidWYuc2l6ZSAqIDgpKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2VwY2EuYyBiL2RyaXZlcnMvY2hhci9lcGNhLmMKaW5kZXggYzNmOTU1OC4uNzA2NzMzYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2VwY2EuYworKysgYi9kcml2ZXJzL2NoYXIvZXBjYS5jCkBAIC0xMTU3LDYgKzExNTcsNyBAQAogCWludCBjcmQ7CiAJc3RydWN0IGJvYXJkX2luZm8gKmJkOwogCXVuc2lnbmVkIGNoYXIgYm9hcmRfaWQgPSAwOworCWludCBlcnIgPSAtRU5PTUVNOwogCiAJaW50IHBjaV9ib2FyZHNfZm91bmQsIHBjaV9jb3VudDsKIApAQCAtMTE2NCwxMyArMTE2NSwxMSBAQAogCiAJcGNfZHJpdmVyID0gYWxsb2NfdHR5X2RyaXZlcihNQVhfQUxMT0MpOwogCWlmICghcGNfZHJpdmVyKQotCQlyZXR1cm4gLUVOT01FTTsKKwkJZ290byBvdXQxOwogCiAJcGNfaW5mbyA9IGFsbG9jX3R0eV9kcml2ZXIoTUFYX0FMTE9DKTsKLQlpZiAoIXBjX2luZm8pIHsKLQkJcHV0X3R0eV9kcml2ZXIocGNfZHJpdmVyKTsKLQkJcmV0dXJuIC1FTk9NRU07Ci0JfQorCWlmICghcGNfaW5mbykKKwkJZ290byBvdXQyOwogCiAJLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAkJSWYgZXBjYV9zZXR1cCBoYXMgbm90IGJlZW4gcmFuIGJ5IExJTE8gc2V0IG51bV9jYXJkcyB0byBkZWZhdWx0czsgY29weQpAQCAtMTM3MCwxMSArMTM2OSwxNyBAQAogCiAJfSAvKiBFbmQgZm9yIGVhY2ggY2FyZCAqLwogCi0JaWYgKHR0eV9yZWdpc3Rlcl9kcml2ZXIocGNfZHJpdmVyKSkKLQkJcGFuaWMoIkNvdWxkbid0IHJlZ2lzdGVyIERpZ2kgUEMvIGRyaXZlciIpOworCWVyciA9IHR0eV9yZWdpc3Rlcl9kcml2ZXIocGNfZHJpdmVyKTsKKwlpZiAoZXJyKSB7CisJCXByaW50ayhLRVJOX0VSUiAiQ291bGRuJ3QgcmVnaXN0ZXIgRGlnaSBQQy8gZHJpdmVyIik7CisJCWdvdG8gb3V0MzsKKwl9CiAKLQlpZiAodHR5X3JlZ2lzdGVyX2RyaXZlcihwY19pbmZvKSkKLQkJcGFuaWMoIkNvdWxkbid0IHJlZ2lzdGVyIERpZ2kgUEMvIGluZm8gIik7CisJZXJyID0gdHR5X3JlZ2lzdGVyX2RyaXZlcihwY19pbmZvKTsKKwlpZiAoZXJyKSB7CisJCXByaW50ayhLRVJOX0VSUiAiQ291bGRuJ3QgcmVnaXN0ZXIgRGlnaSBQQy8gaW5mbyAiKTsKKwkJZ290byBvdXQ0OworCX0KIAogCS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAkgICBTdGFydCB1cCB0aGUgcG9sbGVyIHRvIGNoZWNrIGZvciBldmVudHMgb24gYWxsIGVuYWJsZWQgYm9hcmRzCkBAIC0xMzg1LDYgKzEzOTAsMTUgQEAKIAltb2RfdGltZXIoJmVwY2FfdGltZXIsIGppZmZpZXMgKyBIWi8yNSk7CiAJcmV0dXJuIDA7CiAKK291dDQ6CisJdHR5X3VucmVnaXN0ZXJfZHJpdmVyKHBjX2RyaXZlcik7CitvdXQzOgorCXB1dF90dHlfZHJpdmVyKHBjX2luZm8pOworb3V0MjoKKwlwdXRfdHR5X2RyaXZlcihwY19kcml2ZXIpOworb3V0MToKKwlyZXR1cm4gZXJyOworCiB9IC8qIEVuZCBwY19pbml0ICovCiAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLSBCZWdpbiBwb3N0X2ZlcF9pbml0ICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZnRhcGUvemZ0YXBlL3pmdGFwZS1idWZmZXJzLmMgYi9kcml2ZXJzL2NoYXIvZnRhcGUvemZ0YXBlL3pmdGFwZS1idWZmZXJzLmMKaW5kZXggZGEwNmYxMy4uN2ViY2UyZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2Z0YXBlL3pmdGFwZS96ZnRhcGUtYnVmZmVycy5jCisrKyBiL2RyaXZlcnMvY2hhci9mdGFwZS96ZnRhcGUvemZ0YXBlLWJ1ZmZlcnMuYwpAQCAtODUsNyArODUsNyBAQAogCQlwZWFrX21lbW9yeSA9IHVzZWRfbWVtb3J5OwogCX0KIAlUUkFDRV9BQk9SVCgwLCBmdF90X25vaXNlLAotCQkgICAgImFsbG9jYXRlZCBidWZmZXIgQCAlcCwgJWQgYnl0ZXMiLCAqKHZvaWQgKiopbmV3LCBzaXplKTsKKwkJICAgICJhbGxvY2F0ZWQgYnVmZmVyIEAgJXAsICV6ZCBieXRlcyIsICoodm9pZCAqKiluZXcsIHNpemUpOwogfQogaW50IHpmdF92bWFsbG9jX2Fsd2F5cyh2b2lkICpuZXcsIHNpemVfdCBzaXplKQogewpAQCAtMTAxLDcgKzEwMSw3IEBACiAJaWYgKCoodm9pZCAqKilvbGQpIHsKIAkJdmZyZWUoKih2b2lkICoqKW9sZCk7CiAJCXVzZWRfbWVtb3J5IC09IHNpemU7Ci0JCVRSQUNFKGZ0X3Rfbm9pc2UsICJyZWxlYXNlZCBidWZmZXIgQCAlcCwgJWQgYnl0ZXMiLAorCQlUUkFDRShmdF90X25vaXNlLCAicmVsZWFzZWQgYnVmZmVyIEAgJXAsICV6ZCBieXRlcyIsCiAJCSAgICAgICoodm9pZCAqKilvbGQsIHNpemUpOwogCQkqKHZvaWQgKiopb2xkID0gTlVMTDsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvaXAyL2kybGliLmMgYi9kcml2ZXJzL2NoYXIvaXAyL2kybGliLmMKaW5kZXggZmM5NDRkMy4uNTRkOTNmMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2lwMi9pMmxpYi5jCisrKyBiL2RyaXZlcnMvY2hhci9pcDIvaTJsaWIuYwpAQCAtMTAwNyw3ICsxMDA3LDcgQEAKIC8vIGFwcGxpY2F0aW9ucyB0aGF0IG9uZSBjYW5ub3QgYnJlYWsgb3V0IG9mLgogLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKIHN0YXRpYyBpbnQKLWkyT3V0cHV0KGkyQ2hhblN0clB0ciBwQ2gsIGNvbnN0IGNoYXIgKnBTb3VyY2UsIGludCBjb3VudCwgaW50IHVzZXIgKQoraTJPdXRwdXQoaTJDaGFuU3RyUHRyIHBDaCwgY29uc3QgY2hhciAqcFNvdXJjZSwgaW50IGNvdW50KQogewogCWkyZUJvcmRTdHJQdHIgcEI7CiAJdW5zaWduZWQgY2hhciAqcEluc2VydDsKQEAgLTEwMjAsNyArMTAyMCw3IEBACiAKIAlpbnQgYmFpbG91dCA9IDEwOwogCi0JaXAydHJhY2UgKENIQU5OLCBJVFJDX09VVFBVVCwgSVRSQ19FTlRFUiwgMiwgY291bnQsIHVzZXIgKTsKKwlpcDJ0cmFjZSAoQ0hBTk4sIElUUkNfT1VUUFVULCBJVFJDX0VOVEVSLCAyLCBjb3VudCwgMCApOwogCiAJLy8gRW5zdXJlIGNoYW5uZWwgc3RydWN0dXJlIHNlZW1zIHJlYWwKIAlpZiAoICFpMlZhbGlkYXRlICggcENoICkgKSAKQEAgLTEwODcsMTIgKzEwODcsNyBAQAogCQkJREFUQV9DT1VOVF9PRihwSW5zZXJ0KSAgPSBhbW91bnRUb01vdmU7CiAKIAkJCS8vIE1vdmUgdGhlIGRhdGEKLQkJCWlmICggdXNlciApIHsKLQkJCQlyYyA9IGNvcHlfZnJvbV91c2VyKChjaGFyKikoREFUQV9PRihwSW5zZXJ0KSksIHBTb3VyY2UsCi0JCQkJCQlhbW91bnRUb01vdmUgKTsKLQkJCX0gZWxzZSB7Ci0JCQkJbWVtY3B5KCAoY2hhciopKERBVEFfT0YocEluc2VydCkpLCBwU291cmNlLCBhbW91bnRUb01vdmUgKTsKLQkJCX0KKwkJCW1lbWNweSggKGNoYXIqKShEQVRBX09GKHBJbnNlcnQpKSwgcFNvdXJjZSwgYW1vdW50VG9Nb3ZlICk7CiAJCQkvLyBBZGp1c3QgcG9pbnRlcnMgYW5kIGluZGljZXMKIAkJCXBTb3VyY2UJCQkJCSs9IGFtb3VudFRvTW92ZTsKIAkJCXBDaC0+T2J1Zl9jaGFyX2NvdW50CSs9IGFtb3VudFRvTW92ZTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9pcDIvaTJsaWIuaCBiL2RyaXZlcnMvY2hhci9pcDIvaTJsaWIuaAppbmRleCA5NTJlMTEzLi5lNTU5ZTliIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvaXAyL2kybGliLmgKKysrIGIvZHJpdmVycy9jaGFyL2lwMi9pMmxpYi5oCkBAIC0zMzIsNyArMzMyLDcgQEAKIHN0YXRpYyBpbnQgIGkyR2V0U3RhdHVzKGkyQ2hhblN0clB0ciwgaW50KTsKIHN0YXRpYyBpbnQgIGkySW5wdXQoaTJDaGFuU3RyUHRyKTsKIHN0YXRpYyBpbnQgIGkySW5wdXRGbHVzaChpMkNoYW5TdHJQdHIpOwotc3RhdGljIGludCAgaTJPdXRwdXQoaTJDaGFuU3RyUHRyLCBjb25zdCBjaGFyICosIGludCwgaW50KTsKK3N0YXRpYyBpbnQgIGkyT3V0cHV0KGkyQ2hhblN0clB0ciwgY29uc3QgY2hhciAqLCBpbnQpOwogc3RhdGljIGludCAgaTJPdXRwdXRGcmVlKGkyQ2hhblN0clB0cik7CiBzdGF0aWMgaW50ICBpMlNlcnZpY2VCb2FyZChpMmVCb3JkU3RyUHRyKTsKIHN0YXRpYyB2b2lkIGkyRHJhaW5PdXRwdXQoaTJDaGFuU3RyUHRyLCBpbnQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2lwMi9pcDJtYWluLmMgYi9kcml2ZXJzL2NoYXIvaXAyL2lwMm1haW4uYwppbmRleCA4NThiYTU0Li5hM2YzMmQ0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvaXAyL2lwMm1haW4uYworKysgYi9kcml2ZXJzL2NoYXIvaXAyL2lwMm1haW4uYwpAQCAtMTcwNCw3ICsxNzA0LDcgQEAKIAogCS8qIFRoaXMgaXMgdGhlIGFjdHVhbCBtb3ZlIGJpdC4gTWFrZSBzdXJlIGl0IGRvZXMgd2hhdCB3ZSBuZWVkISEhISEgKi8KIAlXUklURV9MT0NLX0lSUVNBVkUoJnBDaC0+UGJ1Zl9zcGlubG9jayxmbGFncyk7Ci0JYnl0ZXNTZW50ID0gaTJPdXRwdXQoIHBDaCwgcERhdGEsIGNvdW50LCAwICk7CisJYnl0ZXNTZW50ID0gaTJPdXRwdXQoIHBDaCwgcERhdGEsIGNvdW50KTsKIAlXUklURV9VTkxPQ0tfSVJRUkVTVE9SRSgmcENoLT5QYnVmX3NwaW5sb2NrLGZsYWdzKTsKIAogCWlwMnRyYWNlIChDSEFOTiwgSVRSQ19XUklURSwgSVRSQ19SRVRVUk4sIDEsIGJ5dGVzU2VudCApOwpAQCAtMTc2NCw3ICsxNzY0LDcgQEAKIAkJLy8KIAkJLy8gV2UgbWF5IG5lZWQgdG8gcmVzdGFydCBpMk91dHB1dCBpZiBpdCBkb2VzIG5vdCBmdWxsZmlsbCB0aGlzIHJlcXVlc3QKIAkJLy8KLQkJc3RyaXAgPSBpMk91dHB1dCggcENoLCBwQ2gtPlBidWYsIHBDaC0+UGJ1Zl9zdHVmZiwgMCApOworCQlzdHJpcCA9IGkyT3V0cHV0KCBwQ2gsIHBDaC0+UGJ1ZiwgcENoLT5QYnVmX3N0dWZmKTsKIAkJaWYgKCBzdHJpcCAhPSBwQ2gtPlBidWZfc3R1ZmYgKSB7CiAJCQltZW1tb3ZlKCBwQ2gtPlBidWYsICZwQ2gtPlBidWZbc3RyaXBdLCBwQ2gtPlBidWZfc3R1ZmYgLSBzdHJpcCApOwogCQl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvaXBtaS9pcG1pX21zZ2hhbmRsZXIuYyBiL2RyaXZlcnMvY2hhci9pcG1pL2lwbWlfbXNnaGFuZGxlci5jCmluZGV4IDI0NTVlOGQuLmM0N2FkZDggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9pcG1pL2lwbWlfbXNnaGFuZGxlci5jCisrKyBiL2RyaXZlcnMvY2hhci9pcG1pL2lwbWlfbXNnaGFuZGxlci5jCkBAIC0zNzYsMTMgKzM3NiwyMyBAQAogCX0KIH0KIAorc3RhdGljIHZvaWQgZnJlZV9zbWlfbXNnX2xpc3Qoc3RydWN0IGxpc3RfaGVhZCAqcSkKK3sKKwlzdHJ1Y3QgaXBtaV9zbWlfbXNnICptc2csICptc2cyOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKG1zZywgbXNnMiwgcSwgbGluaykgeworCQlsaXN0X2RlbCgmbXNnLT5saW5rKTsKKwkJaXBtaV9mcmVlX3NtaV9tc2cobXNnKTsKKwl9Cit9CisKIHN0YXRpYyB2b2lkIGNsZWFuX3VwX2ludGVyZmFjZV9kYXRhKGlwbWlfc21pX3QgaW50ZikKIHsKIAlpbnQgICAgICAgICAgICAgIGk7CiAJc3RydWN0IGNtZF9yY3ZyICAqcmN2ciwgKnJjdnIyOwogCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKIAotCWZyZWVfcmVjdl9tc2dfbGlzdCgmaW50Zi0+d2FpdGluZ19tc2dzKTsKKwlmcmVlX3NtaV9tc2dfbGlzdCgmaW50Zi0+d2FpdGluZ19tc2dzKTsKIAlmcmVlX3JlY3ZfbXNnX2xpc3QoJmludGYtPndhaXRpbmdfZXZlbnRzKTsKIAogCS8qIFdob2xlc2FsZSByZW1vdmUgYWxsIHRoZSBlbnRyaWVzIGZyb20gdGhlIGxpc3QgaW4gdGhlCkBAIC0xODQ0LDcgKzE4NTQsNyBAQAogCXN0cnVjdCBibWNfZGV2aWNlICpibWMgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKIAogCXJldHVybiBzbnByaW50ZihidWYsIDEwLCAiJXVcbiIsCi0JCQlibWMtPmlkLmRldmljZV9yZXZpc2lvbiAmJiAweDgwID4+IDcpOworCQkJKGJtYy0+aWQuZGV2aWNlX3JldmlzaW9uICYgMHg4MCkgPj4gNyk7CiB9CiAKIHN0YXRpYyBzc2l6ZV90IHJldmlzaW9uX3Nob3coc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKQEAgLTE4NTMsNyArMTg2Myw3IEBACiAJc3RydWN0IGJtY19kZXZpY2UgKmJtYyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwogCiAJcmV0dXJuIHNucHJpbnRmKGJ1ZiwgMjAsICIldVxuIiwKLQkJCWJtYy0+aWQuZGV2aWNlX3JldmlzaW9uICYmIDB4MEYpOworCQkJYm1jLT5pZC5kZXZpY2VfcmV2aXNpb24gJiAweDBGKTsKIH0KIAogc3RhdGljIHNzaXplX3QgZmlybXdhcmVfcmV2X3Nob3coc3RydWN0IGRldmljZSAqZGV2LApAQCAtMTkyOCwxMyArMTkzOCw4IEBACiAJCQkobG9uZyBsb25nKSBibWMtPmd1aWRbOF0pOwogfQogCi1zdGF0aWMgdm9pZAotY2xlYW51cF9ibWNfZGV2aWNlKHN0cnVjdCBrcmVmICpyZWYpCitzdGF0aWMgdm9pZCByZW1vdmVfZmlsZXMoc3RydWN0IGJtY19kZXZpY2UgKmJtYykKIHsKLQlzdHJ1Y3QgYm1jX2RldmljZSAqYm1jOwotCi0JYm1jID0gY29udGFpbmVyX29mKHJlZiwgc3RydWN0IGJtY19kZXZpY2UsIHJlZmNvdW50KTsKLQogCWRldmljZV9yZW1vdmVfZmlsZSgmYm1jLT5kZXYtPmRldiwKIAkJCSAgICZibWMtPmRldmljZV9pZF9hdHRyKTsKIAlkZXZpY2VfcmVtb3ZlX2ZpbGUoJmJtYy0+ZGV2LT5kZXYsCkBAIC0xOTUxLDEyICsxOTU2LDIzIEBACiAJCQkgICAmYm1jLT5tYW51ZmFjdHVyZXJfaWRfYXR0cik7CiAJZGV2aWNlX3JlbW92ZV9maWxlKCZibWMtPmRldi0+ZGV2LAogCQkJICAgJmJtYy0+cHJvZHVjdF9pZF9hdHRyKTsKKwogCWlmIChibWMtPmlkLmF1eF9maXJtd2FyZV9yZXZpc2lvbl9zZXQpCiAJCWRldmljZV9yZW1vdmVfZmlsZSgmYm1jLT5kZXYtPmRldiwKIAkJCQkgICAmYm1jLT5hdXhfZmlybXdhcmVfcmV2X2F0dHIpOwogCWlmIChibWMtPmd1aWRfc2V0KQogCQlkZXZpY2VfcmVtb3ZlX2ZpbGUoJmJtYy0+ZGV2LT5kZXYsCiAJCQkJICAgJmJtYy0+Z3VpZF9hdHRyKTsKK30KKworc3RhdGljIHZvaWQKK2NsZWFudXBfYm1jX2RldmljZShzdHJ1Y3Qga3JlZiAqcmVmKQoreworCXN0cnVjdCBibWNfZGV2aWNlICpibWM7CisKKwlibWMgPSBjb250YWluZXJfb2YocmVmLCBzdHJ1Y3QgYm1jX2RldmljZSwgcmVmY291bnQpOworCisJcmVtb3ZlX2ZpbGVzKGJtYyk7CiAJcGxhdGZvcm1fZGV2aWNlX3VucmVnaXN0ZXIoYm1jLT5kZXYpOwogCWtmcmVlKGJtYyk7CiB9CkBAIC0xOTc3LDYgKzE5OTMsNzkgQEAKIAltdXRleF91bmxvY2soJmlwbWlkcml2ZXJfbXV0ZXgpOwogfQogCitzdGF0aWMgaW50IGNyZWF0ZV9maWxlcyhzdHJ1Y3QgYm1jX2RldmljZSAqYm1jKQoreworCWludCBlcnI7CisKKwllcnIgPSBkZXZpY2VfY3JlYXRlX2ZpbGUoJmJtYy0+ZGV2LT5kZXYsCisJCQkgICAmYm1jLT5kZXZpY2VfaWRfYXR0cik7CisJaWYgKGVycikgZ290byBvdXQ7CisJZXJyID0gZGV2aWNlX2NyZWF0ZV9maWxlKCZibWMtPmRldi0+ZGV2LAorCQkJICAgJmJtYy0+cHJvdmlkZXNfZGV2X3NkcnNfYXR0cik7CisJaWYgKGVycikgZ290byBvdXRfZGV2aWQ7CisJZXJyID0gZGV2aWNlX2NyZWF0ZV9maWxlKCZibWMtPmRldi0+ZGV2LAorCQkJICAgJmJtYy0+cmV2aXNpb25fYXR0cik7CisJaWYgKGVycikgZ290byBvdXRfc2RyczsKKwllcnIgPSBkZXZpY2VfY3JlYXRlX2ZpbGUoJmJtYy0+ZGV2LT5kZXYsCisJCQkgICAmYm1jLT5maXJtd2FyZV9yZXZfYXR0cik7CisJaWYgKGVycikgZ290byBvdXRfcmV2OworCWVyciA9IGRldmljZV9jcmVhdGVfZmlsZSgmYm1jLT5kZXYtPmRldiwKKwkJCSAgICZibWMtPnZlcnNpb25fYXR0cik7CisJaWYgKGVycikgZ290byBvdXRfZmlybTsKKwllcnIgPSBkZXZpY2VfY3JlYXRlX2ZpbGUoJmJtYy0+ZGV2LT5kZXYsCisJCQkgICAmYm1jLT5hZGRfZGV2X3N1cHBvcnRfYXR0cik7CisJaWYgKGVycikgZ290byBvdXRfdmVyc2lvbjsKKwllcnIgPSBkZXZpY2VfY3JlYXRlX2ZpbGUoJmJtYy0+ZGV2LT5kZXYsCisJCQkgICAmYm1jLT5tYW51ZmFjdHVyZXJfaWRfYXR0cik7CisJaWYgKGVycikgZ290byBvdXRfYWRkX2RldjsKKwllcnIgPSBkZXZpY2VfY3JlYXRlX2ZpbGUoJmJtYy0+ZGV2LT5kZXYsCisJCQkgICAmYm1jLT5wcm9kdWN0X2lkX2F0dHIpOworCWlmIChlcnIpIGdvdG8gb3V0X21hbnU7CisJaWYgKGJtYy0+aWQuYXV4X2Zpcm13YXJlX3JldmlzaW9uX3NldCkgeworCQllcnIgPSBkZXZpY2VfY3JlYXRlX2ZpbGUoJmJtYy0+ZGV2LT5kZXYsCisJCQkJICAgJmJtYy0+YXV4X2Zpcm13YXJlX3Jldl9hdHRyKTsKKwkJaWYgKGVycikgZ290byBvdXRfcHJvZF9pZDsKKwl9CisJaWYgKGJtYy0+Z3VpZF9zZXQpIHsKKwkJZXJyID0gZGV2aWNlX2NyZWF0ZV9maWxlKCZibWMtPmRldi0+ZGV2LAorCQkJCSAgICZibWMtPmd1aWRfYXR0cik7CisJCWlmIChlcnIpIGdvdG8gb3V0X2F1eF9maXJtOworCX0KKworCXJldHVybiAwOworCitvdXRfYXV4X2Zpcm06CisJaWYgKGJtYy0+aWQuYXV4X2Zpcm13YXJlX3JldmlzaW9uX3NldCkKKwkJZGV2aWNlX3JlbW92ZV9maWxlKCZibWMtPmRldi0+ZGV2LAorCQkJCSAgICZibWMtPmF1eF9maXJtd2FyZV9yZXZfYXR0cik7CitvdXRfcHJvZF9pZDoKKwlkZXZpY2VfcmVtb3ZlX2ZpbGUoJmJtYy0+ZGV2LT5kZXYsCisJCQkgICAmYm1jLT5wcm9kdWN0X2lkX2F0dHIpOworb3V0X21hbnU6CisJZGV2aWNlX3JlbW92ZV9maWxlKCZibWMtPmRldi0+ZGV2LAorCQkJICAgJmJtYy0+bWFudWZhY3R1cmVyX2lkX2F0dHIpOworb3V0X2FkZF9kZXY6CisJZGV2aWNlX3JlbW92ZV9maWxlKCZibWMtPmRldi0+ZGV2LAorCQkJICAgJmJtYy0+YWRkX2Rldl9zdXBwb3J0X2F0dHIpOworb3V0X3ZlcnNpb246CisJZGV2aWNlX3JlbW92ZV9maWxlKCZibWMtPmRldi0+ZGV2LAorCQkJICAgJmJtYy0+dmVyc2lvbl9hdHRyKTsKK291dF9maXJtOgorCWRldmljZV9yZW1vdmVfZmlsZSgmYm1jLT5kZXYtPmRldiwKKwkJCSAgICZibWMtPmZpcm13YXJlX3Jldl9hdHRyKTsKK291dF9yZXY6CisJZGV2aWNlX3JlbW92ZV9maWxlKCZibWMtPmRldi0+ZGV2LAorCQkJICAgJmJtYy0+cmV2aXNpb25fYXR0cik7CitvdXRfc2RyczoKKwlkZXZpY2VfcmVtb3ZlX2ZpbGUoJmJtYy0+ZGV2LT5kZXYsCisJCQkgICAmYm1jLT5wcm92aWRlc19kZXZfc2Ryc19hdHRyKTsKK291dF9kZXZpZDoKKwlkZXZpY2VfcmVtb3ZlX2ZpbGUoJmJtYy0+ZGV2LT5kZXYsCisJCQkgICAmYm1jLT5kZXZpY2VfaWRfYXR0cik7CitvdXQ6CisJcmV0dXJuIGVycjsKK30KKwogc3RhdGljIGludCBpcG1pX2JtY19yZWdpc3RlcihpcG1pX3NtaV90IGludGYpCiB7CiAJaW50ICAgICAgICAgICAgICAgcnY7CkBAIC0yMDI5LDcgKzIxMTgsNyBAQAogCQlkZXZfc2V0X2RydmRhdGEoJmJtYy0+ZGV2LT5kZXYsIGJtYyk7CiAJCWtyZWZfaW5pdCgmYm1jLT5yZWZjb3VudCk7CiAKLQkJcnYgPSBwbGF0Zm9ybV9kZXZpY2VfcmVnaXN0ZXIoYm1jLT5kZXYpOworCQlydiA9IHBsYXRmb3JtX2RldmljZV9hZGQoYm1jLT5kZXYpOwogCQltdXRleF91bmxvY2soJmlwbWlkcml2ZXJfbXV0ZXgpOwogCQlpZiAocnYpIHsKIAkJCXByaW50ayhLRVJOX0VSUgpAQCAtMjA1MSw3ICsyMTQwLDYgQEAKIAkJYm1jLT5wcm92aWRlc19kZXZfc2Ryc19hdHRyLmF0dHIubW9kZSA9IFNfSVJVR087CiAJCWJtYy0+cHJvdmlkZXNfZGV2X3NkcnNfYXR0ci5zaG93ID0gcHJvdmlkZXNfZGV2X3NkcnNfc2hvdzsKIAotCiAJCWJtYy0+cmV2aXNpb25fYXR0ci5hdHRyLm5hbWUgPSAicmV2aXNpb24iOwogCQlibWMtPnJldmlzaW9uX2F0dHIuYXR0ci5vd25lciA9IFRISVNfTU9EVUxFOwogCQlibWMtPnJldmlzaW9uX2F0dHIuYXR0ci5tb2RlID0gU19JUlVHTzsKQEAgLTIwOTMsMjggKzIxODEsMTQgQEAKIAkJYm1jLT5hdXhfZmlybXdhcmVfcmV2X2F0dHIuYXR0ci5tb2RlID0gU19JUlVHTzsKIAkJYm1jLT5hdXhfZmlybXdhcmVfcmV2X2F0dHIuc2hvdyA9IGF1eF9maXJtd2FyZV9yZXZfc2hvdzsKIAotCQlkZXZpY2VfY3JlYXRlX2ZpbGUoJmJtYy0+ZGV2LT5kZXYsCi0JCQkJICAgJmJtYy0+ZGV2aWNlX2lkX2F0dHIpOwotCQlkZXZpY2VfY3JlYXRlX2ZpbGUoJmJtYy0+ZGV2LT5kZXYsCi0JCQkJICAgJmJtYy0+cHJvdmlkZXNfZGV2X3NkcnNfYXR0cik7Ci0JCWRldmljZV9jcmVhdGVfZmlsZSgmYm1jLT5kZXYtPmRldiwKLQkJCQkgICAmYm1jLT5yZXZpc2lvbl9hdHRyKTsKLQkJZGV2aWNlX2NyZWF0ZV9maWxlKCZibWMtPmRldi0+ZGV2LAotCQkJCSAgICZibWMtPmZpcm13YXJlX3Jldl9hdHRyKTsKLQkJZGV2aWNlX2NyZWF0ZV9maWxlKCZibWMtPmRldi0+ZGV2LAotCQkJCSAgICZibWMtPnZlcnNpb25fYXR0cik7Ci0JCWRldmljZV9jcmVhdGVfZmlsZSgmYm1jLT5kZXYtPmRldiwKLQkJCQkgICAmYm1jLT5hZGRfZGV2X3N1cHBvcnRfYXR0cik7Ci0JCWRldmljZV9jcmVhdGVfZmlsZSgmYm1jLT5kZXYtPmRldiwKLQkJCQkgICAmYm1jLT5tYW51ZmFjdHVyZXJfaWRfYXR0cik7Ci0JCWRldmljZV9jcmVhdGVfZmlsZSgmYm1jLT5kZXYtPmRldiwKLQkJCQkgICAmYm1jLT5wcm9kdWN0X2lkX2F0dHIpOwotCQlpZiAoYm1jLT5pZC5hdXhfZmlybXdhcmVfcmV2aXNpb25fc2V0KQotCQkJZGV2aWNlX2NyZWF0ZV9maWxlKCZibWMtPmRldi0+ZGV2LAotCQkJCQkgICAmYm1jLT5hdXhfZmlybXdhcmVfcmV2X2F0dHIpOwotCQlpZiAoYm1jLT5ndWlkX3NldCkKLQkJCWRldmljZV9jcmVhdGVfZmlsZSgmYm1jLT5kZXYtPmRldiwKLQkJCQkJICAgJmJtYy0+Z3VpZF9hdHRyKTsKKwkJcnYgPSBjcmVhdGVfZmlsZXMoYm1jKTsKKwkJaWYgKHJ2KSB7CisJCQltdXRleF9sb2NrKCZpcG1pZHJpdmVyX211dGV4KTsKKwkJCXBsYXRmb3JtX2RldmljZV91bnJlZ2lzdGVyKGJtYy0+ZGV2KTsKKwkJCW11dGV4X3VubG9jaygmaXBtaWRyaXZlcl9tdXRleCk7CisKKwkJCXJldHVybiBydjsKKwkJfQogCiAJCXByaW50ayhLRVJOX0lORk8KIAkJICAgICAgICJpcG1pOiBGb3VuZCBuZXcgQk1DIChtYW5faWQ6IDB4JTYuNngsICIKQEAgLTMxNjgsNyArMzI0Miw5IEBACiAgICAgICAgICAgICAgICAgICAgcmVwb3J0IHRoZSBlcnJvciBpbW1lZGlhdGVseS4gKi8KIAkJaWYgKChtc2ctPnJzcF9zaXplID49IDMpICYmIChtc2ctPnJzcFsyXSAhPSAwKQogCQkgICAgJiYgKG1zZy0+cnNwWzJdICE9IElQTUlfTk9ERV9CVVNZX0VSUikKLQkJICAgICYmIChtc2ctPnJzcFsyXSAhPSBJUE1JX0xPU1RfQVJCSVRSQVRJT05fRVJSKSkKKwkJICAgICYmIChtc2ctPnJzcFsyXSAhPSBJUE1JX0xPU1RfQVJCSVRSQVRJT05fRVJSKQorCQkgICAgJiYgKG1zZy0+cnNwWzJdICE9IElQTUlfQlVTX0VSUikKKwkJICAgICYmIChtc2ctPnJzcFsyXSAhPSBJUE1JX05BS19PTl9XUklURV9FUlIpKQogCQl7CiAJCQlpbnQgY2hhbiA9IG1zZy0+cnNwWzNdICYgMHhmOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvaXBtaS9pcG1pX3NpX2ludGYuYyBiL2RyaXZlcnMvY2hhci9pcG1pL2lwbWlfc2lfaW50Zi5jCmluZGV4IDI0ODI1YmQuLmJiMWZhYzEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9pcG1pL2lwbWlfc2lfaW50Zi5jCisrKyBiL2RyaXZlcnMvY2hhci9pcG1pL2lwbWlfc2lfaW50Zi5jCkBAIC0xMjExLDcgKzEyMTEsNyBAQAogc3RhdGljIHVuc2lnbmVkIGNoYXIgaW50Zl9tZW1faW53KHN0cnVjdCBzaV9zbV9pbyAqaW8sIHVuc2lnbmVkIGludCBvZmZzZXQpCiB7CiAJcmV0dXJuIChyZWFkdygoaW8tPmFkZHIpKyhvZmZzZXQgKiBpby0+cmVnc3BhY2luZykpID4+IGlvLT5yZWdzaGlmdCkKLQkJJiYgMHhmZjsKKwkJJiAweGZmOwogfQogCiBzdGF0aWMgdm9pZCBpbnRmX21lbV9vdXR3KHN0cnVjdCBzaV9zbV9pbyAqaW8sIHVuc2lnbmVkIGludCBvZmZzZXQsCkBAIC0xMjIzLDcgKzEyMjMsNyBAQAogc3RhdGljIHVuc2lnbmVkIGNoYXIgaW50Zl9tZW1faW5sKHN0cnVjdCBzaV9zbV9pbyAqaW8sIHVuc2lnbmVkIGludCBvZmZzZXQpCiB7CiAJcmV0dXJuIChyZWFkbCgoaW8tPmFkZHIpKyhvZmZzZXQgKiBpby0+cmVnc3BhY2luZykpID4+IGlvLT5yZWdzaGlmdCkKLQkJJiYgMHhmZjsKKwkJJiAweGZmOwogfQogCiBzdGF0aWMgdm9pZCBpbnRmX21lbV9vdXRsKHN0cnVjdCBzaV9zbV9pbyAqaW8sIHVuc2lnbmVkIGludCBvZmZzZXQsCkBAIC0xMjM2LDcgKzEyMzYsNyBAQAogc3RhdGljIHVuc2lnbmVkIGNoYXIgbWVtX2lucShzdHJ1Y3Qgc2lfc21faW8gKmlvLCB1bnNpZ25lZCBpbnQgb2Zmc2V0KQogewogCXJldHVybiAocmVhZHEoKGlvLT5hZGRyKSsob2Zmc2V0ICogaW8tPnJlZ3NwYWNpbmcpKSA+PiBpby0+cmVnc2hpZnQpCi0JCSYmIDB4ZmY7CisJCSYgMHhmZjsKIH0KIAogc3RhdGljIHZvaWQgbWVtX291dHEoc3RydWN0IHNpX3NtX2lvICppbywgdW5zaWduZWQgaW50IG9mZnNldCwKQEAgLTE3ODksNyArMTc4OSw3IEBACiAKIAlpbmZvID0ga3phbGxvYyhzaXplb2YoKmluZm8pLCBHRlBfS0VSTkVMKTsKIAlpZiAoIWluZm8pCi0JCXJldHVybiBFTk9NRU07CisJCXJldHVybiAtRU5PTUVNOwogCiAJaW5mby0+YWRkcl9zb3VyY2UgPSAiUENJIjsKIApAQCAtMTgxMCw3ICsxODEwLDcgQEAKIAkJa2ZyZWUoaW5mbyk7CiAJCXByaW50ayhLRVJOX0lORk8gImlwbWlfc2k6ICVzOiBVbmtub3duIElQTUkgdHlwZTogJWRcbiIsCiAJCSAgICAgICBwY2lfbmFtZShwZGV2KSwgY2xhc3NfdHlwZSk7Ci0JCXJldHVybiBFTk9NRU07CisJCXJldHVybiAtRU5PTUVNOwogCX0KIAogCXJ2ID0gcGNpX2VuYWJsZV9kZXZpY2UocGRldik7CkBAIC0xODY3LDcgKzE4NjcsNyBAQAogCiBzdGF0aWMgc3RydWN0IHBjaV9kZXZpY2VfaWQgaXBtaV9wY2lfZGV2aWNlc1tdID0gewogCXsgUENJX0RFVklDRShQQ0lfSFBfVkVORE9SX0lELCBQQ0lfTU1DX0RFVklDRV9JRCkgfSwKLQl7IFBDSV9ERVZJQ0VfQ0xBU1MoUENJX0VSTUNfQ0xBU1NDT0RFLCBQQ0lfRVJNQ19DTEFTU0NPREUpIH0KKwl7IFBDSV9ERVZJQ0VfQ0xBU1MoUENJX0VSTUNfQ0xBU1NDT0RFLCBQQ0lfRVJNQ19DTEFTU0NPREVfTUFTSykgfQogfTsKIE1PRFVMRV9ERVZJQ0VfVEFCTEUocGNpLCBpcG1pX3BjaV9kZXZpY2VzKTsKIApAQCAtMjM0Niw3ICsyMzQ2LDcgQEAKIAkJbmV3X3NtaS0+ZGV2ID0gJm5ld19zbWktPnBkZXYtPmRldjsKIAkJbmV3X3NtaS0+ZGV2LT5kcml2ZXIgPSAmaXBtaV9kcml2ZXI7CiAKLQkJcnYgPSBwbGF0Zm9ybV9kZXZpY2VfcmVnaXN0ZXIobmV3X3NtaS0+cGRldik7CisJCXJ2ID0gcGxhdGZvcm1fZGV2aWNlX2FkZChuZXdfc21pLT5wZGV2KTsKIAkJaWYgKHJ2KSB7CiAJCQlwcmludGsoS0VSTl9FUlIKIAkJCSAgICAgICAiaXBtaV9zaV9pbnRmOiIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9pc2ljb20uYyBiL2RyaXZlcnMvY2hhci9pc2ljb20uYwppbmRleCBlOWU5YmYzLi41OGM5NTVlIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvaXNpY29tLmMKKysrIGIvZHJpdmVycy9jaGFyL2lzaWNvbS5jCkBAIC0xMDYyLDExICsxMDYyLDEyIEBACiBzdGF0aWMgdm9pZCBpc2ljb21fY2xvc2Uoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IGZpbGUgKmZpbHApCiB7CiAJc3RydWN0IGlzaV9wb3J0ICpwb3J0ID0gdHR5LT5kcml2ZXJfZGF0YTsKLQlzdHJ1Y3QgaXNpX2JvYXJkICpjYXJkID0gcG9ydC0+Y2FyZDsKKwlzdHJ1Y3QgaXNpX2JvYXJkICpjYXJkOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKIAlpZiAoIXBvcnQpCiAJCXJldHVybjsKKwljYXJkID0gcG9ydC0+Y2FyZDsKIAlpZiAoaXNpY29tX3BhcmFub2lhX2NoZWNrKHBvcnQsIHR0eS0+bmFtZSwgImlzaWNvbV9jbG9zZSIpKQogCQlyZXR1cm47CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9tZW0uYyBiL2RyaXZlcnMvY2hhci9tZW0uYwppbmRleCA2NTExMDEyLi41NTQ3MzM3IDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvbWVtLmMKKysrIGIvZHJpdmVycy9jaGFyL21lbS5jCkBAIC0yNiw2ICsyNiw3IEBACiAjaW5jbHVkZSA8bGludXgvYmFja2luZy1kZXYuaD4KICNpbmNsdWRlIDxsaW51eC9ib290bWVtLmg+CiAjaW5jbHVkZSA8bGludXgvcGlwZV9mc19pLmg+CisjaW5jbHVkZSA8bGludXgvcGZuLmg+CiAKICNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgogI2luY2x1ZGUgPGFzbS9pby5oPgpAQCAtMjkyLDggKzI5Myw4IEBACiB7CiAJdW5zaWduZWQgbG9uZyBwZm47CiAKLQkvKiBUdXJuIGEga2VybmVsLXZpcnR1YWwgYWRkcmVzcyBpbnRvIGEgcGh5c2ljYWwgcGFnZSBmcmFtZSAqLwotCXBmbiA9IF9fcGEoKHU2NCl2bWEtPnZtX3Bnb2ZmIDw8IFBBR0VfU0hJRlQpID4+IFBBR0VfU0hJRlQ7CisJLyogVHVybiBhIHBmbiBvZmZzZXQgaW50byBhbiBhYnNvbHV0ZSBwZm4gKi8KKwlwZm4gPSBQRk5fRE9XTih2aXJ0X3RvX3BoeXMoKHZvaWQgKilQQUdFX09GRlNFVCkpICsgdm1hLT52bV9wZ29mZjsKIAogCS8qCiAJICogUkVELVBFTjogb24gc29tZSBhcmNoaXRlY3R1cmVzIHRoZXJlIGlzIG1vcmUgbWFwcGVkIG1lbW9yeQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL21veGEuYyBiL2RyaXZlcnMvY2hhci9tb3hhLmMKaW5kZXggYjQwMTM4My4uOTZjYjFmMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL21veGEuYworKysgYi9kcml2ZXJzL2NoYXIvbW94YS5jCkBAIC0xMzAsNiArMTMwLDcgQEAKIHR5cGVkZWYgc3RydWN0IF9tb3hhX3BjaV9kZXZpbmZvIHsKIAl1c2hvcnQgYnVzTnVtOwogCXVzaG9ydCBkZXZOdW07CisJc3RydWN0IHBjaV9kZXYgKnBkZXY7CiB9IG1veGFfcGNpX2RldmluZm87CiAKIHR5cGVkZWYgc3RydWN0IF9tb3hhX2JvYXJkX2NvbmYgewpAQCAtMzI0LDYgKzMyNSw5IEBACiAJYm9hcmQtPmJ1c1R5cGUgPSBNT1hBX0JVU19UWVBFX1BDSTsKIAlib2FyZC0+cGNpSW5mby5idXNOdW0gPSBwLT5idXMtPm51bWJlcjsKIAlib2FyZC0+cGNpSW5mby5kZXZOdW0gPSBwLT5kZXZmbiA+PiAzOworCWJvYXJkLT5wY2lJbmZvLnBkZXYgPSBwOworCS8qIGRvbid0IGxvc2UgdGhlIHJlZmVyZW5jZSBpbiB0aGUgbmV4dCBwY2lfZ2V0X2RldmljZSBpdGVyYXRpb24gKi8KKwlwY2lfZGV2X2dldChwKTsKIAogCXJldHVybiAoMCk7CiB9CkBAIC00OTMsNiArNDk3LDExIEBACiAJaWYgKHR0eV91bnJlZ2lzdGVyX2RyaXZlcihtb3hhRHJpdmVyKSkKIAkJcHJpbnRrKCJDb3VsZG4ndCB1bnJlZ2lzdGVyIE1PWEEgSW50ZWxsaW8gZmFtaWx5IHNlcmlhbCBkcml2ZXJcbiIpOwogCXB1dF90dHlfZHJpdmVyKG1veGFEcml2ZXIpOworCisJZm9yIChpID0gMDsgaSA8IE1BWF9CT0FSRFM7IGkrKykKKwkJaWYgKG1veGFfYm9hcmRzW2ldLmJ1c1R5cGUgPT0gTU9YQV9CVVNfVFlQRV9QQ0kpCisJCQlwY2lfZGV2X3B1dChtb3hhX2JvYXJkc1tpXS5wY2lJbmZvLnBkZXYpOworCiAJaWYgKHZlcmJvc2UpCiAJCXByaW50aygiRG9uZVxuIik7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvbXNwZWMuYyBiL2RyaXZlcnMvY2hhci9tc3BlYy5jCmluZGV4IDVjMGRlYzMuLjIzNWU4OTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9tc3BlYy5jCisrKyBiL2RyaXZlcnMvY2hhci9tc3BlYy5jCkBAIC03Miw3ICs3MiwxMSBAQAogCU1TUEVDX1VOQ0FDSEVECiB9OwogCisjaWZkZWYgQ09ORklHX1NHSV9TTgogc3RhdGljIGludCBpc19zbjI7CisjZWxzZQorI2RlZmluZSBpc19zbjIJCTAKKyNlbmRpZgogCiAvKgogICogT25lIG9mIHRoZXNlIHN0cnVjdHVyZXMgaXMgYWxsb2NhdGVkIHdoZW4gYW4gbXNwZWMgcmVnaW9uIGlzIG1tYXBlZC4gVGhlCkBAIC0yMTEsNyArMjE1LDcgQEAKIAlpZiAodmRhdGEtPnR5cGUgPT0gTVNQRUNfRkVUQ0hPUCkKIAkJcGFkZHIgPSBUT19BTU8obWFkZHIpOwogCWVsc2UKLQkJcGFkZHIgPSBfX3BhKFRPX0NBQyhtYWRkcikpOworCQlwYWRkciA9IG1hZGRyICYgfl9fSUE2NF9VTkNBQ0hFRF9PRkZTRVQ7CiAKIAlwZm4gPSBwYWRkciA+PiBQQUdFX1NISUZUOwogCkBAIC0zMzUsNiArMzM5LDcgQEAKIAkgKiBUaGUgZmV0Y2hvcCBkZXZpY2Ugb25seSB3b3JrcyBvbiBTTjIgaGFyZHdhcmUsIHVuY2FjaGVkIGFuZCBjYWNoZWQKIAkgKiBtZW1vcnkgZHJpdmVycyBzaG91bGQgYm90aCBiZSB2YWxpZCBvbiBhbGwgaWE2NCBoYXJkd2FyZQogCSAqLworI2lmZGVmIENPTkZJR19TR0lfU04KIAlpZiAoaWE2NF9wbGF0Zm9ybV9pcygic24yIikpIHsKIAkJaXNfc24yID0gMTsKIAkJaWYgKGlzX3NodWIyKCkpIHsKQEAgLTM2Myw2ICszNjgsNyBAQAogCQkJZ290byBmcmVlX3NjcmF0Y2hfcGFnZXM7CiAJCX0KIAl9CisjZW5kaWYKIAlyZXQgPSBtaXNjX3JlZ2lzdGVyKCZjYWNoZWRfbWlzY2Rldik7CiAJaWYgKHJldCkgewogCQlwcmludGsoS0VSTl9FUlIgIiVzOiBmYWlsZWQgdG8gcmVnaXN0ZXIgZGV2aWNlICVpXG4iLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL3JhbmRvbS5jIGIvZHJpdmVycy9jaGFyL3JhbmRvbS5jCmluZGV4IDA3ZjQ3YTAuLmViNmIxM2YgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9yYW5kb20uYworKysgYi9kcml2ZXJzL2NoYXIvcmFuZG9tLmMKQEAgLTY0NSw2ICs2NDUsNyBAQAogCWFkZF90aW1lcl9yYW5kb21uZXNzKCZpbnB1dF90aW1lcl9zdGF0ZSwKIAkJCSAgICAgKHR5cGUgPDwgNCkgXiBjb2RlIF4gKGNvZGUgPj4gNCkgXiB2YWx1ZSk7CiB9CitFWFBPUlRfU1lNQk9MX0dQTChhZGRfaW5wdXRfcmFuZG9tbmVzcyk7CiAKIHZvaWQgYWRkX2ludGVycnVwdF9yYW5kb21uZXNzKGludCBpcnEpCiB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvcmlvL2hvc3QuaCBiL2RyaXZlcnMvY2hhci9yaW8vaG9zdC5oCmluZGV4IGVlMmRkZWEuLjIzZDA2ODEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9yaW8vaG9zdC5oCisrKyBiL2RyaXZlcnMvY2hhci9yaW8vaG9zdC5oCkBAIC00NCw2ICs0NCw3IEBACiAqKiAgICB0aGUgaG9zdC4KICovCiBzdHJ1Y3QgSG9zdCB7CisJc3RydWN0IHBjaV9kZXYgKnBkZXY7CiAJdW5zaWduZWQgY2hhciBUeXBlOwkJLyogUklPX0VJU0EsIFJJT19NQ0EsIC4uLiAqLwogCXVuc2lnbmVkIGNoYXIgSXZlYzsJCS8qIFBPTExFRCBvciBpdmVjIG51bWJlciAqLwogCXVuc2lnbmVkIGNoYXIgTW9kZTsJCS8qIENvbnRyb2wgc3R1ZmYgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9yaW8vcmlvX2xpbnV4LmMgYi9kcml2ZXJzL2NoYXIvcmlvL3Jpb19saW51eC5jCmluZGV4IGMzODJkZjAuLjdhYzY4Y2IgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9yaW8vcmlvX2xpbnV4LmMKKysrIGIvZHJpdmVycy9jaGFyL3Jpby9yaW9fbGludXguYwpAQCAtMTAxNyw2ICsxMDE3LDEwIEBACiAJCQlyaW9fZHByaW50ayhSSU9fREVCVUdfUFJPQkUsICJIbW0gVGVzdGVkIG9rLCB1bmlxaWQgPSAleC5cbiIsIHAtPlJJT0hvc3RzW3AtPlJJT051bUhvc3RzXS5VbmlxdWVOdW0pOwogCiAJCQlmaXhfcmlvX3BjaShwZGV2KTsKKworCQkJcC0+UklPSG9zdHNbcC0+UklPTnVtSG9zdHNdLnBkZXYgPSBwZGV2OworCQkJcGNpX2Rldl9nZXQocGRldik7CisKIAkJCXAtPlJJT0xhc3RQQ0lTZWFyY2ggPSAwOwogCQkJcC0+UklPTnVtSG9zdHMrKzsKIAkJCWZvdW5kKys7CkBAIC0xMDY2LDYgKzEwNzAsOSBAQAogCQkJICAgICgocmVhZGIoJnAtPlJJT0hvc3RzW3AtPlJJT051bUhvc3RzXS5VbmlxdWVbMV0pICYgMHhGRikgPDwgOCkgfCAoKHJlYWRiKCZwLT5SSU9Ib3N0c1twLT5SSU9OdW1Ib3N0c10uVW5pcXVlWzJdKSAmIDB4RkYpIDw8IDE2KSB8ICgocmVhZGIoJnAtPlJJT0hvc3RzW3AtPlJJT051bUhvc3RzXS5VbmlxdWVbM10pICYgMHhGRikgPDwgMjQpOwogCQkJcmlvX2RwcmludGsoUklPX0RFQlVHX1BST0JFLCAiSG1tIFRlc3RlZCBvaywgdW5pcWlkID0gJXguXG4iLCBwLT5SSU9Ib3N0c1twLT5SSU9OdW1Ib3N0c10uVW5pcXVlTnVtKTsKIAorCQkJcC0+UklPSG9zdHNbcC0+UklPTnVtSG9zdHNdLnBkZXYgPSBwZGV2OworCQkJcGNpX2Rldl9nZXQocGRldik7CisKIAkJCXAtPlJJT0xhc3RQQ0lTZWFyY2ggPSAwOwogCQkJcC0+UklPTnVtSG9zdHMrKzsKIAkJCWZvdW5kKys7CkBAIC0xMTgxLDYgKzExODgsOCBAQAogCQl9CiAJCS8qIEl0IGlzIHNhZmUvYWxsb3dlZCB0byBkZWxfdGltZXIgYSBub24tYWN0aXZlIHRpbWVyICovCiAJCWRlbF90aW1lcigmaHAtPnRpbWVyKTsKKwkJaWYgKGhwLT5UeXBlID09IFJJT19QQ0kpCisJCQlwY2lfZGV2X3B1dChocC0+cGRldik7CiAJfQogCiAJaWYgKG1pc2NfZGVyZWdpc3RlcigmcmlvX2Z3X2RldmljZSkgPCAwKSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvcmlvL3Jpb2N0cmwuYyBiL2RyaXZlcnMvY2hhci9yaW8vcmlvY3RybC5jCmluZGV4IDA1MmU4MTIuLjdjZTc3NjEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9yaW8vcmlvY3RybC5jCisrKyBiL2RyaXZlcnMvY2hhci9yaW8vcmlvY3RybC5jCkBAIC02NjIsNyArNjYyLDcgQEAKIAkJCXAtPlJJT0Vycm9yLkVycm9yID0gQ09QWUlOX0ZBSUxFRDsKIAkJCXJldHVybiAtRUZBVUxUOwogCQl9Ci0JCWlmIChwb3J0U3RhdHMucG9ydCA+PSBSSU9fUE9SVFMpIHsKKwkJaWYgKHBvcnRTdGF0cy5wb3J0IDwgMCB8fCBwb3J0U3RhdHMucG9ydCA+PSBSSU9fUE9SVFMpIHsKIAkJCXAtPlJJT0Vycm9yLkVycm9yID0gUE9SVF9OVU1CRVJfT1VUX09GX1JBTkdFOwogCQkJcmV0dXJuIC1FTlhJTzsKIAkJfQpAQCAtNzAyLDcgKzcwMiw3IEBACiAJCQlwLT5SSU9FcnJvci5FcnJvciA9IENPUFlJTl9GQUlMRUQ7CiAJCQlyZXR1cm4gLUVGQVVMVDsKIAkJfQotCQlpZiAocG9ydFN0YXRzLnBvcnQgPj0gUklPX1BPUlRTKSB7CisJCWlmIChwb3J0U3RhdHMucG9ydCA8IDAgfHwgcG9ydFN0YXRzLnBvcnQgPj0gUklPX1BPUlRTKSB7CiAJCQlwLT5SSU9FcnJvci5FcnJvciA9IFBPUlRfTlVNQkVSX09VVF9PRl9SQU5HRTsKIAkJCXJldHVybiAtRU5YSU87CiAJCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9zZXJpYWwxNjcuYyBiL2RyaXZlcnMvY2hhci9zZXJpYWwxNjcuYwppbmRleCA0NjFiZmUwLi4zYWY3ZjA5IDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvc2VyaWFsMTY3LmMKKysrIGIvZHJpdmVycy9jaGFyL3NlcmlhbDE2Ny5jCkBAIC04MzksNyArODM5LDcgQEAKICAgICBsb2NhbF9pcnFfc2F2ZShmbGFncyk7CiAJaWYgKGluZm8tPnhtaXRfYnVmKXsKIAkgICAgZnJlZV9wYWdlKCh1bnNpZ25lZCBsb25nKSBpbmZvLT54bWl0X2J1Zik7Ci0JICAgIGluZm8tPnhtaXRfYnVmID0gMDsKKwkgICAgaW5mby0+eG1pdF9idWYgPSBOVUxMOwogCX0KIAogCWJhc2VfYWRkcltDeUNBUl0gPSAodV9jaGFyKWNoYW5uZWw7CkBAIC0xMzU0LDcgKzEzNTQsNyBAQAogCiBzdGF0aWMgaW50CiBnZXRfc2VyaWFsX2luZm8oc3RydWN0IGN5Y2xhZGVzX3BvcnQgKiBpbmZvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHNlcmlhbF9zdHJ1Y3QgKiByZXRpbmZvKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHNlcmlhbF9zdHJ1Y3QgX191c2VyICogcmV0aW5mbykKIHsKICAgc3RydWN0IHNlcmlhbF9zdHJ1Y3QgdG1wOwogCkBAIC0xMzc2LDcgKzEzNzYsNyBAQAogCiBzdGF0aWMgaW50CiBzZXRfc2VyaWFsX2luZm8oc3RydWN0IGN5Y2xhZGVzX3BvcnQgKiBpbmZvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHNlcmlhbF9zdHJ1Y3QgKiBuZXdfaW5mbykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBzZXJpYWxfc3RydWN0IF9fdXNlciAqIG5ld19pbmZvKQogewogICBzdHJ1Y3Qgc2VyaWFsX3N0cnVjdCBuZXdfc2VyaWFsOwogICBzdHJ1Y3QgY3ljbGFkZXNfcG9ydCBvbGRfaW5mbzsKQEAgLTE1MDMsNyArMTUwMyw3IEBACiB9IC8qIHNlbmRfYnJlYWsgKi8KIAogc3RhdGljIGludAotZ2V0X21vbl9pbmZvKHN0cnVjdCBjeWNsYWRlc19wb3J0ICogaW5mbywgc3RydWN0IGN5Y2xhZGVzX21vbml0b3IgKiBtb24pCitnZXRfbW9uX2luZm8oc3RydWN0IGN5Y2xhZGVzX3BvcnQgKiBpbmZvLCBzdHJ1Y3QgY3ljbGFkZXNfbW9uaXRvciBfX3VzZXIgKiBtb24pCiB7CiAKICAgIGlmIChjb3B5X3RvX3VzZXIobW9uLCAmaW5mby0+bW9uLCBzaXplb2Yoc3RydWN0IGN5Y2xhZGVzX21vbml0b3IpKSkKQEAgLTE1MTYsNyArMTUxNiw3IEBACiB9CiAKIHN0YXRpYyBpbnQKLXNldF90aHJlc2hvbGQoc3RydWN0IGN5Y2xhZGVzX3BvcnQgKiBpbmZvLCB1bnNpZ25lZCBsb25nICphcmcpCitzZXRfdGhyZXNob2xkKHN0cnVjdCBjeWNsYWRlc19wb3J0ICogaW5mbywgdW5zaWduZWQgbG9uZyBfX3VzZXIgKmFyZykKIHsKICAgIHZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgKmJhc2VfYWRkciA9ICh1X2NoYXIgKilCQVNFX0FERFI7CiAgICB1bnNpZ25lZCBsb25nIHZhbHVlOwpAQCAtMTUzMyw3ICsxNTMzLDcgQEAKIH0KIAogc3RhdGljIGludAotZ2V0X3RocmVzaG9sZChzdHJ1Y3QgY3ljbGFkZXNfcG9ydCAqIGluZm8sIHVuc2lnbmVkIGxvbmcgKnZhbHVlKQorZ2V0X3RocmVzaG9sZChzdHJ1Y3QgY3ljbGFkZXNfcG9ydCAqIGluZm8sIHVuc2lnbmVkIGxvbmcgX191c2VyICp2YWx1ZSkKIHsKICAgIHZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgKmJhc2VfYWRkciA9ICh1X2NoYXIgKilCQVNFX0FERFI7CiAgICBpbnQgY2hhbm5lbDsKQEAgLTE1NDYsNyArMTU0Niw3IEBACiB9CiAKIHN0YXRpYyBpbnQKLXNldF9kZWZhdWx0X3RocmVzaG9sZChzdHJ1Y3QgY3ljbGFkZXNfcG9ydCAqIGluZm8sIHVuc2lnbmVkIGxvbmcgKmFyZykKK3NldF9kZWZhdWx0X3RocmVzaG9sZChzdHJ1Y3QgY3ljbGFkZXNfcG9ydCAqIGluZm8sIHVuc2lnbmVkIGxvbmcgX191c2VyICphcmcpCiB7CiAgICB1bnNpZ25lZCBsb25nIHZhbHVlOwogCkBAIC0xNTU4LDEzICsxNTU4LDEzIEBACiB9CiAKIHN0YXRpYyBpbnQKLWdldF9kZWZhdWx0X3RocmVzaG9sZChzdHJ1Y3QgY3ljbGFkZXNfcG9ydCAqIGluZm8sIHVuc2lnbmVkIGxvbmcgKnZhbHVlKQorZ2V0X2RlZmF1bHRfdGhyZXNob2xkKHN0cnVjdCBjeWNsYWRlc19wb3J0ICogaW5mbywgdW5zaWduZWQgbG9uZyBfX3VzZXIgKnZhbHVlKQogewogICAgcmV0dXJuIHB1dF91c2VyKGluZm8tPmRlZmF1bHRfdGhyZXNob2xkLHZhbHVlKTsKIH0KIAogc3RhdGljIGludAotc2V0X3RpbWVvdXQoc3RydWN0IGN5Y2xhZGVzX3BvcnQgKiBpbmZvLCB1bnNpZ25lZCBsb25nICphcmcpCitzZXRfdGltZW91dChzdHJ1Y3QgY3ljbGFkZXNfcG9ydCAqIGluZm8sIHVuc2lnbmVkIGxvbmcgX191c2VyICphcmcpCiB7CiAgICB2b2xhdGlsZSB1bnNpZ25lZCBjaGFyICpiYXNlX2FkZHIgPSAodV9jaGFyICopQkFTRV9BRERSOwogICAgaW50IGNoYW5uZWw7CkBAIC0xNTgxLDcgKzE1ODEsNyBAQAogfQogCiBzdGF0aWMgaW50Ci1nZXRfdGltZW91dChzdHJ1Y3QgY3ljbGFkZXNfcG9ydCAqIGluZm8sIHVuc2lnbmVkIGxvbmcgKnZhbHVlKQorZ2V0X3RpbWVvdXQoc3RydWN0IGN5Y2xhZGVzX3BvcnQgKiBpbmZvLCB1bnNpZ25lZCBsb25nIF9fdXNlciAqdmFsdWUpCiB7CiAgICB2b2xhdGlsZSB1bnNpZ25lZCBjaGFyICpiYXNlX2FkZHIgPSAodV9jaGFyICopQkFTRV9BRERSOwogICAgaW50IGNoYW5uZWw7CkBAIC0xNjAxLDcgKzE2MDEsNyBAQAogfQogCiBzdGF0aWMgaW50Ci1nZXRfZGVmYXVsdF90aW1lb3V0KHN0cnVjdCBjeWNsYWRlc19wb3J0ICogaW5mbywgdW5zaWduZWQgbG9uZyAqdmFsdWUpCitnZXRfZGVmYXVsdF90aW1lb3V0KHN0cnVjdCBjeWNsYWRlc19wb3J0ICogaW5mbywgdW5zaWduZWQgbG9uZyBfX3VzZXIgKnZhbHVlKQogewogICAgcmV0dXJuIHB1dF91c2VyKGluZm8tPmRlZmF1bHRfdGltZW91dCx2YWx1ZSk7CiB9CkBAIC0xNjEzLDYgKzE2MTMsNyBAQAogICB1bnNpZ25lZCBsb25nIHZhbDsKICAgc3RydWN0IGN5Y2xhZGVzX3BvcnQgKiBpbmZvID0gKHN0cnVjdCBjeWNsYWRlc19wb3J0ICopdHR5LT5kcml2ZXJfZGF0YTsKICAgaW50IHJldF92YWwgPSAwOworICB2b2lkIF9fdXNlciAqYXJncCA9ICh2b2lkIF9fdXNlciAqKWFyZzsKIAogI2lmZGVmIFNFUklBTF9ERUJVR19PVEhFUgogICAgIHByaW50aygiY3lfaW9jdGwgJXMsIGNtZCA9ICV4IGFyZyA9ICVseFxuIiwgdHR5LT5uYW1lLCBjbWQsIGFyZyk7IC8qICovCkBAIC0xNjIwLDI4ICsxNjIxLDI4IEBACiAKICAgICBzd2l0Y2ggKGNtZCkgewogICAgICAgICBjYXNlIENZR0VUTU9OOgotICAgICAgICAgICAgcmV0X3ZhbCA9IGdldF9tb25faW5mbyhpbmZvLCAoc3RydWN0IGN5Y2xhZGVzX21vbml0b3IgKilhcmcpOworICAgICAgICAgICAgcmV0X3ZhbCA9IGdldF9tb25faW5mbyhpbmZvLCBhcmdwKTsKIAkgICAgYnJlYWs7CiAgICAgICAgIGNhc2UgQ1lHRVRUSFJFU0g6Ci0JICAgIHJldF92YWwgPSBnZXRfdGhyZXNob2xkKGluZm8sICh1bnNpZ25lZCBsb25nICopYXJnKTsKKwkgICAgcmV0X3ZhbCA9IGdldF90aHJlc2hvbGQoaW5mbywgYXJncCk7CiAgCSAgICBicmVhazsKICAgICAgICAgY2FzZSBDWVNFVFRIUkVTSDoKLSAgICAgICAgICAgIHJldF92YWwgPSBzZXRfdGhyZXNob2xkKGluZm8sICh1bnNpZ25lZCBsb25nICopYXJnKTsKKyAgICAgICAgICAgIHJldF92YWwgPSBzZXRfdGhyZXNob2xkKGluZm8sIGFyZ3ApOwogCSAgICBicmVhazsKICAgICAgICAgY2FzZSBDWUdFVERFRlRIUkVTSDoKLQkgICAgcmV0X3ZhbCA9IGdldF9kZWZhdWx0X3RocmVzaG9sZChpbmZvLCAodW5zaWduZWQgbG9uZyAqKWFyZyk7CisJICAgIHJldF92YWwgPSBnZXRfZGVmYXVsdF90aHJlc2hvbGQoaW5mbywgYXJncCk7CiAgCSAgICBicmVhazsKICAgICAgICAgY2FzZSBDWVNFVERFRlRIUkVTSDoKLSAgICAgICAgICAgIHJldF92YWwgPSBzZXRfZGVmYXVsdF90aHJlc2hvbGQoaW5mbywgKHVuc2lnbmVkIGxvbmcgKilhcmcpOworICAgICAgICAgICAgcmV0X3ZhbCA9IHNldF9kZWZhdWx0X3RocmVzaG9sZChpbmZvLCBhcmdwKTsKIAkgICAgYnJlYWs7CiAgICAgICAgIGNhc2UgQ1lHRVRUSU1FT1VUOgotCSAgICByZXRfdmFsID0gZ2V0X3RpbWVvdXQoaW5mbywgKHVuc2lnbmVkIGxvbmcgKilhcmcpOworCSAgICByZXRfdmFsID0gZ2V0X3RpbWVvdXQoaW5mbywgYXJncCk7CiAgCSAgICBicmVhazsKICAgICAgICAgY2FzZSBDWVNFVFRJTUVPVVQ6Ci0gICAgICAgICAgICByZXRfdmFsID0gc2V0X3RpbWVvdXQoaW5mbywgKHVuc2lnbmVkIGxvbmcgKilhcmcpOworICAgICAgICAgICAgcmV0X3ZhbCA9IHNldF90aW1lb3V0KGluZm8sIGFyZ3ApOwogCSAgICBicmVhazsKICAgICAgICAgY2FzZSBDWUdFVERFRlRJTUVPVVQ6Ci0JICAgIHJldF92YWwgPSBnZXRfZGVmYXVsdF90aW1lb3V0KGluZm8sICh1bnNpZ25lZCBsb25nICopYXJnKTsKKwkgICAgcmV0X3ZhbCA9IGdldF9kZWZhdWx0X3RpbWVvdXQoaW5mbywgYXJncCk7CiAgCSAgICBicmVhazsKICAgICAgICAgY2FzZSBDWVNFVERFRlRJTUVPVVQ6CiAgICAgICAgICAgICByZXRfdmFsID0gc2V0X2RlZmF1bHRfdGltZW91dChpbmZvLCAodW5zaWduZWQgbG9uZylhcmcpOwpAQCAtMTY2NCwyMSArMTY2NSwyMCBAQAogCiAvKiBUaGUgZm9sbG93aW5nIGNvbW1hbmRzIGFyZSBpbmNvbXBsZXRlbHkgaW1wbGVtZW50ZWQhISEgKi8KICAgICAgICAgY2FzZSBUSU9DR1NPRlRDQVI6Ci0gICAgICAgICAgICByZXRfdmFsID0gcHV0X3VzZXIoQ19DTE9DQUwodHR5KSA/IDEgOiAwLCAodW5zaWduZWQgbG9uZyAqKSBhcmcpOworICAgICAgICAgICAgcmV0X3ZhbCA9IHB1dF91c2VyKENfQ0xPQ0FMKHR0eSkgPyAxIDogMCwgKHVuc2lnbmVkIGxvbmcgX191c2VyICopIGFyZ3ApOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGNhc2UgVElPQ1NTT0ZUQ0FSOgotICAgICAgICAgICAgcmV0X3ZhbCA9IGdldF91c2VyKHZhbCwgKHVuc2lnbmVkIGxvbmcgKikgYXJnKTsKKyAgICAgICAgICAgIHJldF92YWwgPSBnZXRfdXNlcih2YWwsICh1bnNpZ25lZCBsb25nIF9fdXNlciAqKSBhcmdwKTsKIAkgICAgaWYgKHJldF92YWwpCiAJCSAgICBicmVhazsKICAgICAgICAgICAgIHR0eS0+dGVybWlvcy0+Y19jZmxhZyA9CiAgICAgICAgICAgICAgICAgICAgICgodHR5LT50ZXJtaW9zLT5jX2NmbGFnICYgfkNMT0NBTCkgfCAodmFsID8gQ0xPQ0FMIDogMCkpOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGNhc2UgVElPQ0dTRVJJQUw6Ci0gICAgICAgICAgICByZXRfdmFsID0gZ2V0X3NlcmlhbF9pbmZvKGluZm8sIChzdHJ1Y3Qgc2VyaWFsX3N0cnVjdCAqKSBhcmcpOworICAgICAgICAgICAgcmV0X3ZhbCA9IGdldF9zZXJpYWxfaW5mbyhpbmZvLCBhcmdwKTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlIFRJT0NTU0VSSUFMOgotICAgICAgICAgICAgcmV0X3ZhbCA9IHNldF9zZXJpYWxfaW5mbyhpbmZvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc3RydWN0IHNlcmlhbF9zdHJ1Y3QgKikgYXJnKTsKKyAgICAgICAgICAgIHJldF92YWwgPSBzZXRfc2VyaWFsX2luZm8oaW5mbywgYXJncCk7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgZGVmYXVsdDoKIAkgICAgcmV0X3ZhbCA9IC1FTk9JT0NUTENNRDsKQEAgLTE3NzMsNyArMTc3Myw3IEBACiAJdHR5LT5kcml2ZXItPmZsdXNoX2J1ZmZlcih0dHkpOwogICAgIHR0eV9sZGlzY19mbHVzaCh0dHkpOwogICAgIGluZm8tPmV2ZW50ID0gMDsKLSAgICBpbmZvLT50dHkgPSAwOworICAgIGluZm8tPnR0eSA9IE5VTEw7CiAgICAgaWYgKGluZm8tPmJsb2NrZWRfb3BlbikgewogCWlmIChpbmZvLT5jbG9zZV9kZWxheSkgewogCSAgICBtc2xlZXBfaW50ZXJydXB0aWJsZShqaWZmaWVzX3RvX21zZWNzKGluZm8tPmNsb3NlX2RlbGF5KSk7CkBAIC0yMjUwLDcgKzIyNTAsNyBAQAogCQlpbmZvLT5jYXJkID0gaW5kZXg7CiAJCWluZm8tPmxpbmUgPSBwb3J0X251bTsKIAkJaW5mby0+ZmxhZ3MgPSBTVERfQ09NX0ZMQUdTOwotCQlpbmZvLT50dHkgPSAwOworCQlpbmZvLT50dHkgPSBOVUxMOwogCQlpbmZvLT54bWl0X2ZpZm9fc2l6ZSA9IDEyOwogCQlpbmZvLT5jb3IxID0gQ3lQQVJJVFlfTk9ORXxDeV84X0JJVFM7CiAJCWluZm8tPmNvcjIgPSBDeUVUQzsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9zcGVjaWFsaXguYyBiL2RyaXZlcnMvY2hhci9zcGVjaWFsaXguYwppbmRleCBkMGI4OGQwLi43ZTFiZDk1IDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvc3BlY2lhbGl4LmMKKysrIGIvZHJpdmVycy9jaGFyL3NwZWNpYWxpeC5jCkBAIC0xODMsMTEgKzE4Myw2IEBACiAKIHN0YXRpYyBzdHJ1Y3QgdHR5X2RyaXZlciAqc3BlY2lhbGl4X2RyaXZlcjsKIAotc3RhdGljIHVuc2lnbmVkIGxvbmcgYmF1ZF90YWJsZVtdID0gIHsKLQkwLCA1MCwgNzUsIDExMCwgMTM0LCAxNTAsIDIwMCwgMzAwLCA2MDAsIDEyMDAsIDE4MDAsIDI0MDAsIDQ4MDAsCi0JOTYwMCwgMTkyMDAsIDM4NDAwLCA1NzYwMCwgMTE1MjAwLCAwLAotfTsKLQogc3RhdGljIHN0cnVjdCBzcGVjaWFsaXhfYm9hcmQgc3hfYm9hcmRbU1hfTkJPQVJEXSA9ICB7CiAJeyAwLCBTWF9JT0JBU0UxLCAgOSwgfSwKIAl7IDAsIFNYX0lPQkFTRTIsIDExLCB9LApAQCAtMTA5MCw5ICsxMDg1LDkgQEAKIAogCWlmIChiYXVkID09IDM4NDAwKSB7CiAJCWlmICgocG9ydC0+ZmxhZ3MgJiBBU1lOQ19TUERfTUFTSykgPT0gQVNZTkNfU1BEX0hJKQotCQkJYmF1ZCArKzsKKwkJCWJhdWQgPSA1NzYwMDsKIAkJaWYgKChwb3J0LT5mbGFncyAmIEFTWU5DX1NQRF9NQVNLKSA9PSBBU1lOQ19TUERfVkhJKQotCQkJYmF1ZCArPSAyOworCQkJYmF1ZCA9IDExNTIwMDsKIAl9CiAKIAlpZiAoIWJhdWQpIHsKQEAgLTExNTAsMTEgKzExNDUsOSBAQAogCXN4X291dChicCwgQ0QxODZ4X1JCUFJMLCB0bXAgJiAweGZmKTsKIAlzeF9vdXQoYnAsIENEMTg2eF9UQlBSTCwgdG1wICYgMHhmZik7CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYnAtPmxvY2ssIGZsYWdzKTsKLQlpZiAocG9ydC0+Y3VzdG9tX2Rpdmlzb3IpIHsKKwlpZiAocG9ydC0+Y3VzdG9tX2Rpdmlzb3IpCiAJCWJhdWQgPSAoU1hfT1NDRlJFUSArIHBvcnQtPmN1c3RvbV9kaXZpc29yLzIpIC8gcG9ydC0+Y3VzdG9tX2Rpdmlzb3I7Ci0JCWJhdWQgPSAoIGJhdWQgKyA1ICkgLyAxMDsKLQl9IGVsc2UKLQkJYmF1ZCA9IChiYXVkX3RhYmxlW2JhdWRdICsgNSkgLyAxMDsgICAvKiBFc3RpbWF0ZWQgQ1BTICovCisJYmF1ZCA9IChiYXVkICsgNSkgLyAxMDsJCS8qIEVzdGltYXRlZCBDUFMgKi8KIAogCS8qIFR3byB0aW1lciB0aWNrcyBzZWVtcyBlbm91Z2ggdG8gd2FrZXVwIHNvbWV0aGluZyBsaWtlIFNMSVAgZHJpdmVyICovCiAJdG1wID0gKChiYXVkICsgSFovMikgLyBIWikgKiAyIC0gQ0QxODZ4X05GSUZPOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL3N4LmMgYi9kcml2ZXJzL2NoYXIvc3guYwppbmRleCA1ZmVjNjI2Li5jYzEwYWYwIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvc3guYworKysgYi9kcml2ZXJzL2NoYXIvc3guYwpAQCAtMjYwMiw3ICsyNjAyLDcgQEAKIAkJfQogCX0KIAlpZiAobWlzY19kZXJlZ2lzdGVyKCZzeF9md19kZXZpY2UpIDwgMCkgewotCQlwcmludGsgKEtFUk5fSU5GTyAic3g6IGNvdWxkbid0IGRlcmVnaXN0ZXIgZmlybXdhcmUgbG9hZGVyIGRldmljXG4iKTsKKwkJcHJpbnRrIChLRVJOX0lORk8gInN4OiBjb3VsZG4ndCBkZXJlZ2lzdGVyIGZpcm13YXJlIGxvYWRlciBkZXZpY2VcbiIpOwogCX0KIAlzeF9kcHJpbnRrIChTWF9ERUJVR19DTEVBTlVQLCAiQ2xlYW5pbmcgdXAgZHJpdmVycyAoJWQpXG4iLCBzeF9pbml0aWFsaXplZCk7CiAJaWYgKHN4X2luaXRpYWxpemVkKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL3N5bmNsaW5rLmMgYi9kcml2ZXJzL2NoYXIvc3luY2xpbmsuYwppbmRleCBmMjg2NGNjLi4wNjc4NGFkIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvc3luY2xpbmsuYworKysgYi9kcml2ZXJzL2NoYXIvc3luY2xpbmsuYwpAQCAtMTMzLDggKzEzMyw4IEBACiB9OwogCiAjZGVmaW5lIFNIQVJFRF9NRU1fQUREUkVTU19TSVpFIDB4NDAwMDAKLSNkZWZpbmUgQlVGRkVSTElTVFNJWkUgKFBBR0VfU0laRSkKLSNkZWZpbmUgRE1BQlVGRkVSU0laRSAoUEFHRV9TSVpFKQorI2RlZmluZSBCVUZGRVJMSVNUU0laRSA0MDk2CisjZGVmaW5lIERNQUJVRkZFUlNJWkUgNDA5NgogI2RlZmluZSBNQVhSWEZSQU1FUyA3CiAKIHR5cGVkZWYgc3RydWN0IF9ETUFCVUZGRVJFTlRSWQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL3RwbS90cG0uYyBiL2RyaXZlcnMvY2hhci90cG0vdHBtLmMKaW5kZXggYTA4MmEyZS4uNmFkMmQzYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL3RwbS90cG0uYworKysgYi9kcml2ZXJzL2NoYXIvdHBtL3RwbS5jCkBAIC0xMTUzLDcgKzExNTMsMTQgQEAKIAogCXNwaW5fdW5sb2NrKCZkcml2ZXJfbG9jayk7CiAKLQlzeXNmc19jcmVhdGVfZ3JvdXAoJmRldi0+a29iaiwgY2hpcC0+dmVuZG9yLmF0dHJfZ3JvdXApOworCWlmIChzeXNmc19jcmVhdGVfZ3JvdXAoJmRldi0+a29iaiwgY2hpcC0+dmVuZG9yLmF0dHJfZ3JvdXApKSB7CisJCWxpc3RfZGVsKCZjaGlwLT5saXN0KTsKKwkJcHV0X2RldmljZShkZXYpOworCQljbGVhcl9iaXQoY2hpcC0+ZGV2X251bSwgZGV2X21hc2spOworCQlrZnJlZShjaGlwKTsKKwkJa2ZyZWUoZGV2bmFtZSk7CisJCXJldHVybiBOVUxMOworCX0KIAogCWNoaXAtPmJpb3NfZGlyID0gdHBtX2Jpb3NfbG9nX3NldHVwKGRldm5hbWUpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvdHBtL3RwbV9hdG1lbC5jIGIvZHJpdmVycy9jaGFyL3RwbS90cG1fYXRtZWwuYwppbmRleCBhZDhmZmU0Li4xYWIwODk2IDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvdHBtL3RwbV9hdG1lbC5jCisrKyBiL2RyaXZlcnMvY2hhci90cG0vdHBtX2F0bWVsLmMKQEAgLTE4NCw3ICsxODQsOSBAQAogCXVuc2lnbmVkIGxvbmcgYmFzZTsKIAlzdHJ1Y3QgIHRwbV9jaGlwICpjaGlwOwogCi0JZHJpdmVyX3JlZ2lzdGVyKCZhdG1sX2Rydik7CisJcmMgPSBkcml2ZXJfcmVnaXN0ZXIoJmF0bWxfZHJ2KTsKKwlpZiAocmMpCisJCXJldHVybiByYzsKIAogCWlmICgoaW9iYXNlID0gYXRtZWxfZ2V0X2Jhc2VfYWRkcigmYmFzZSwgJnJlZ2lvbl9zaXplKSkgPT0gTlVMTCkgewogCQlyYyA9IC1FTk9ERVY7CkBAIC0xOTUsMTAgKzE5Nyw4IEBACiAJICAgIChhdG1lbF9yZXF1ZXN0X3JlZ2lvbgogCSAgICAgKHRwbV9hdG1lbC5iYXNlLCByZWdpb25fc2l6ZSwgInRwbV9hdG1lbDAiKSA9PSBOVUxMKSA/IDAgOiAxOwogCi0KLQlpZiAoSVNfRVJSCi0JICAgIChwZGV2ID0KLQkgICAgIHBsYXRmb3JtX2RldmljZV9yZWdpc3Rlcl9zaW1wbGUoInRwbV9hdG1lbCIsIC0xLCBOVUxMLCAwKSkpIHsKKwlwZGV2ID0gcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyX3NpbXBsZSgidHBtX2F0bWVsIiwgLTEsIE5VTEwsIDApOworCWlmIChJU19FUlIocGRldikpIHsKIAkJcmMgPSBQVFJfRVJSKHBkZXYpOwogCQlnb3RvIGVycl9yZWxfcmVnOwogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci90cG0vdHBtX25zYy5jIGIvZHJpdmVycy9jaGFyL3RwbS90cG1fbnNjLmMKaW5kZXggMjYyODdhYS4uNjA4ZjczMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL3RwbS90cG1fbnNjLmMKKysrIGIvZHJpdmVycy9jaGFyL3RwbS90cG1fbnNjLmMKQEAgLTI4NCw3ICsyODQsNyBAQAogc3RhdGljIGludCBfX2luaXQgaW5pdF9uc2Modm9pZCkKIHsKIAlpbnQgcmMgPSAwOwotCWludCBsbywgaGk7CisJaW50IGxvLCBoaSwgZXJyOwogCWludCBuc2NBZGRyQmFzZSA9IFRQTV9BRERSOwogCXN0cnVjdCB0cG1fY2hpcCAqY2hpcDsKIAl1bnNpZ25lZCBsb25nIGJhc2U7CkBAIC0yOTcsNyArMjk3LDkgQEAKIAkJCXJldHVybiAtRU5PREVWOwogCX0KIAotCWRyaXZlcl9yZWdpc3RlcigmbnNjX2Rydik7CisJZXJyID0gZHJpdmVyX3JlZ2lzdGVyKCZuc2NfZHJ2KTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOwogCiAJaGkgPSB0cG1fcmVhZF9pbmRleChuc2NBZGRyQmFzZSwgVFBNX05TQ19CQVNFMF9ISSk7CiAJbG8gPSB0cG1fcmVhZF9pbmRleChuc2NBZGRyQmFzZSwgVFBNX05TQ19CQVNFMF9MTyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvd2F0Y2hkb2cvS2NvbmZpZyBiL2RyaXZlcnMvY2hhci93YXRjaGRvZy9LY29uZmlnCmluZGV4IDg5ZTQ2ZDZkLi4wMTg3YjExIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvd2F0Y2hkb2cvS2NvbmZpZworKysgYi9kcml2ZXJzL2NoYXIvd2F0Y2hkb2cvS2NvbmZpZwpAQCAtMTMsNyArMTMsNyBAQAogCSAgc3Vic2VxdWVudGx5IG9wZW5pbmcgdGhlIGZpbGUgYW5kIHRoZW4gZmFpbGluZyB0byB3cml0ZSB0byBpdCBmb3IKIAkgIGxvbmdlciB0aGFuIDEgbWludXRlIHdpbGwgcmVzdWx0IGluIHJlYm9vdGluZyB0aGUgbWFjaGluZS4gVGhpcwogCSAgY291bGQgYmUgdXNlZnVsIGZvciBhIG5ldHdvcmtlZCBtYWNoaW5lIHRoYXQgbmVlZHMgdG8gY29tZSBiYWNrCi0JICBvbmxpbmUgYXMgZmFzdCBhcyBwb3NzaWJsZSBhZnRlciBhIGxvY2stdXAuIFRoZXJlJ3MgYm90aCBhIHdhdGNoZG9nCisJICBvbi1saW5lIGFzIGZhc3QgYXMgcG9zc2libGUgYWZ0ZXIgYSBsb2NrLXVwLiBUaGVyZSdzIGJvdGggYSB3YXRjaGRvZwogCSAgaW1wbGVtZW50YXRpb24gZW50aXJlbHkgaW4gc29mdHdhcmUgKHdoaWNoIGNhbiBzb21ldGltZXMgZmFpbCB0bwogCSAgcmVib290IHRoZSBtYWNoaW5lKSBhbmQgYSBkcml2ZXIgZm9yIGhhcmR3YXJlIHdhdGNoZG9nIGJvYXJkcywgd2hpY2gKIAkgIGFyZSBtb3JlIHJvYnVzdCBhbmQgY2FuIGFsc28ga2VlcCB0cmFjayBvZiB0aGUgdGVtcGVyYXR1cmUgaW5zaWRlCkBAIC02MCw3ICs2MCw3IEBACiAKICMgQVJNIEFyY2hpdGVjdHVyZQogCi1jb25maWcgQVQ5MV9XQVRDSERPRworY29uZmlnIEFUOTFSTTkyMDBfV0FUQ0hET0cKIAl0cmlzdGF0ZSAiQVQ5MVJNOTIwMCB3YXRjaGRvZyIKIAlkZXBlbmRzIG9uIFdBVENIRE9HICYmIEFSQ0hfQVQ5MVJNOTIwMAogCWhlbHAKQEAgLTcxLDcgKzcxLDcgQEAKIAl0cmlzdGF0ZSAiREMyMTI4NSB3YXRjaGRvZyIKIAlkZXBlbmRzIG9uIFdBVENIRE9HICYmIEZPT1RCUklER0UKIAloZWxwCi0JICBUaGUgSW50ZWwgRm9vdGJyaWRnZSBjaGlwIGNvbnRhaW5zIGEgYnVpbHRpbiB3YXRjaGRvZyBjaXJjdWl0LiBTYXkgWQorCSAgVGhlIEludGVsIEZvb3RicmlkZ2UgY2hpcCBjb250YWlucyBhIGJ1aWx0LWluIHdhdGNoZG9nIGNpcmN1aXQuIFNheSBZCiAJICBoZXJlIGlmIHlvdSB3aXNoIHRvIHVzZSB0aGlzLiBBbHRlcm5hdGl2ZWx5IHNheSBNIHRvIGNvbXBpbGUgdGhlCiAJICBkcml2ZXIgYXMgYSBtb2R1bGUsIHdoaWNoIHdpbGwgYmUgY2FsbGVkIHdkdDI4NS4KIApAQCAtMjY5LDExICsyNjksMTEgQEAKIAkgIE1vc3QgcGVvcGxlIHdpbGwgc2F5IE4uCiAKIGNvbmZpZyBJQk1BU1IKLSAgICAgICAgdHJpc3RhdGUgIklCTSBBdXRvbWF0aWMgU2VydmVyIFJlc3RhcnQiCi0gICAgICAgIGRlcGVuZHMgb24gV0FUQ0hET0cgJiYgWDg2Ci0gICAgICAgIGhlbHAKKwl0cmlzdGF0ZSAiSUJNIEF1dG9tYXRpYyBTZXJ2ZXIgUmVzdGFydCIKKwlkZXBlbmRzIG9uIFdBVENIRE9HICYmIFg4NgorCWhlbHAKIAkgIFRoaXMgaXMgdGhlIGRyaXZlciBmb3IgdGhlIElCTSBBdXRvbWF0aWMgU2VydmVyIFJlc3RhcnQgd2F0Y2hkb2cKLQkgIHRpbWVyIGJ1aWx0aW4gaW50byBzb21lIGVTZXJ2ZXIgeFNlcmllcyBtYWNoaW5lcy4KKwkgIHRpbWVyIGJ1aWx0LWluIGludG8gc29tZSBlU2VydmVyIHhTZXJpZXMgbWFjaGluZXMuCiAKIAkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZQogCSAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIGlibWFzci4KQEAgLTMxNiwxMyArMzE2LDE2IEBACiAJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUKIAkgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCBpOHh4X3Rjby4KIAorCSAgTm90ZTogVGhpcyBkcml2ZXIgd2lsbCBiZSByZW1vdmVkIGluIHRoZSBuZWFyIGZ1dHVyZS4gUGxlYXNlCisJICB1c2UgdGhlIEludGVsIFRDTyBUaW1lci9XYXRjaGRvZyBkcml2ZXIuCisKIGNvbmZpZyBJVENPX1dEVAotCXRyaXN0YXRlICJJbnRlbCBUQ08gVGltZXIvV2F0Y2hkb2cgKEVYUEVSSU1FTlRBTCkiCi0JZGVwZW5kcyBvbiBXQVRDSERPRyAmJiAoWDg2IHx8IElBNjQpICYmIFBDSSAmJiBFWFBFUklNRU5UQUwKKwl0cmlzdGF0ZSAiSW50ZWwgVENPIFRpbWVyL1dhdGNoZG9nIgorCWRlcGVuZHMgb24gV0FUQ0hET0cgJiYgKFg4NiB8fCBJQTY0KSAmJiBQQ0kKIAktLS1oZWxwLS0tCiAJICBIYXJkd2FyZSBkcml2ZXIgZm9yIHRoZSBpbnRlbCBUQ08gdGltZXIgYmFzZWQgd2F0Y2hkb2cgZGV2aWNlcy4KIAkgIFRoZXNlIGRyaXZlcnMgYXJlIGluY2x1ZGVkIGluIHRoZSBJbnRlbCA4MjgwMSBJL08gQ29udHJvbGxlcgotCSAgSHViIGZhbWlseSAnZnJvbSBJQ0gwIHVwIHRvIElDSDcpIGFuZCBpbiB0aGUgSW50ZWwgNjMwMEVTQgorCSAgSHViIGZhbWlseSAoZnJvbSBJQ0gwIHVwIHRvIElDSDgpIGFuZCBpbiB0aGUgSW50ZWwgNjMwMEVTQgogCSAgY29udHJvbGxlciBodWIuCiAKIAkgIFRoZSBUQ08gKFRvdGFsIENvc3Qgb2YgT3duZXJzaGlwKSB0aW1lciBpcyBhIHdhdGNoZG9nIHRpbWVyCkBAIC0zOTUsNiArMzk4LDI2IEBACiAJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUKIAkgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCBjcHU1d2R0LgogCitjb25maWcgU01TQzM3Qjc4N19XRFQKKwl0cmlzdGF0ZSAiV2luYm9uZCBTTXNDMzdCNzg3IFdhdGNoZG9nIFRpbWVyIgorCWRlcGVuZHMgb24gV0FUQ0hET0cgJiYgWDg2CisJLS0taGVscC0tLQorCSAgVGhpcyBpcyB0aGUgZHJpdmVyIGZvciB0aGUgaGFyZHdhcmUgd2F0Y2hkb2cgY29tcG9uZW50IG9uIHRoZQorCSAgV2luYm9uZCBTTXNDMzdCNzg3IGNoaXBzZXQgYXMgdXNlZCBvbiB0aGUgTmV0UnVubmVyIE1haW5ib2FyZAorCSAgZnJvbSBWaXNpb24gU3lzdGVtcyBhbmQgbWF5YmUgb3RoZXJzLgorCisJICBUaGlzIHdhdGNoZG9nIHNpbXBseSB3YXRjaGVzIHlvdXIga2VybmVsIHRvIG1ha2Ugc3VyZSBpdCBkb2Vzbid0CisJICBmcmVlemUsIGFuZCBpZiBpdCBkb2VzLCBpdCByZWJvb3RzIHlvdXIgY29tcHV0ZXIgYWZ0ZXIgYSBjZXJ0YWluCisJICBhbW91bnQgb2YgdGltZS4KKworCSAgVXN1YWxseSBhIHVzZXJzcGFjZSBkYWVtb24gd2lsbCBub3RpZnkgdGhlIGtlcm5lbCBXRFQgZHJpdmVyIHRoYXQKKwkgIHVzZXJzcGFjZSBpcyBzdGlsbCBhbGl2ZSwgYXQgcmVndWxhciBpbnRlcnZhbHMuCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZQorCSAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIHNtc2MzN2I3ODdfd2R0LgorCisJICBNb3N0IHBlb3BsZSB3aWxsIHNheSBOLgorCiBjb25maWcgVzgzNjI3SEZfV0RUCiAJdHJpc3RhdGUgIlc4MzYyN0hGIFdhdGNoZG9nIFRpbWVyIgogCWRlcGVuZHMgb24gV0FUQ0hET0cgJiYgWDg2CkBAIC00MTAsNiArNDMzLDIxIEBACiAKIAkgIE1vc3QgcGVvcGxlIHdpbGwgc2F5IE4uCiAKK2NvbmZpZyBXODM2OTdIRl9XRFQKKwl0cmlzdGF0ZSAiVzgzNjk3SEYvVzgzNjk3SEcgV2F0Y2hkb2cgVGltZXIiCisJZGVwZW5kcyBvbiBXQVRDSERPRyAmJiBYODYKKwktLS1oZWxwLS0tCisJICBUaGlzIGlzIHRoZSBkcml2ZXIgZm9yIHRoZSBoYXJkd2FyZSB3YXRjaGRvZyBvbiB0aGUgVzgzNjk3SEYvSEcKKwkgIGNoaXBzZXQgYXMgdXNlZCBpbiBEZWRpYm94L1ZJQSBtb3RoZXJib2FyZHMgKGFuZCBsaWtlbHkgb3RoZXJzKS4KKwkgIFRoaXMgd2F0Y2hkb2cgc2ltcGx5IHdhdGNoZXMgeW91ciBrZXJuZWwgdG8gbWFrZSBzdXJlIGl0IGRvZXNuJ3QKKwkgIGZyZWV6ZSwgYW5kIGlmIGl0IGRvZXMsIGl0IHJlYm9vdHMgeW91ciBjb21wdXRlciBhZnRlciBhIGNlcnRhaW4KKwkgIGFtb3VudCBvZiB0aW1lLgorCisJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUKKwkgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCB3ODM2OTdoZl93ZHQuCisKKwkgIE1vc3QgcGVvcGxlIHdpbGwgc2F5IE4uCisKIGNvbmZpZyBXODM4NzdGX1dEVAogCXRyaXN0YXRlICJXODM4NzdGIChFTUFDUykgV2F0Y2hkb2cgVGltZXIiCiAJZGVwZW5kcyBvbiBXQVRDSERPRyAmJiBYODYKQEAgLTQ0Myw3ICs0ODEsNyBAQAogCWRlcGVuZHMgb24gV0FUQ0hET0cgJiYgWDg2CiAJLS0taGVscC0tLQogCSAgSWYgeW91IGFyZSB1c2luZyBhIFpGIE1pY3JvIE1hY2haIHByb2Nlc3Nvciwgc2F5IFkgaGVyZSwgb3RoZXJ3aXNlCi0JICBOLiAgVGhpcyBpcyB0aGUgZHJpdmVyIGZvciB0aGUgd2F0Y2hkb2cgdGltZXIgYnVpbHRpbiBvbiB0aGF0CisJICBOLiAgVGhpcyBpcyB0aGUgZHJpdmVyIGZvciB0aGUgd2F0Y2hkb2cgdGltZXIgYnVpbHQtaW4gb24gdGhhdAogCSAgcHJvY2Vzc29yIHVzaW5nIFpGLUxvZ2ljIGludGVyZmFjZS4gIFRoaXMgd2F0Y2hkb2cgc2ltcGx5IHdhdGNoZXMKIAkgIHlvdXIga2VybmVsIHRvIG1ha2Ugc3VyZSBpdCBkb2Vzbid0IGZyZWV6ZSwgYW5kIGlmIGl0IGRvZXMsIGl0CiAJICByZWJvb3RzIHlvdXIgY29tcHV0ZXIgYWZ0ZXIgYSBjZXJ0YWluIGFtb3VudCBvZiB0aW1lLgpAQCAtNDcyLDcgKzUxMCw2IEBACiAJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUKIAkgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCBzYmNfZXB4X2MzLgogCi0KICMgUG93ZXJQQyBBcmNoaXRlY3R1cmUKIAogY29uZmlnIDh4eF9XRFQKQEAgLTUwMiw3ICs1MzksNyBAQAogCWhlbHAKIAkgIFRoaXMgZHJpdmVyIGFkZHMgd2F0Y2hkb2cgc3VwcG9ydCBmb3IgdGhlIFJUQVMgd2F0Y2hkb2cuCiAKLSAgICAgICAgICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlLiBUaGUgbW9kdWxlCisJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlLiBUaGUgbW9kdWxlCiAJICB3aWxsIGJlIGNhbGxlZCB3ZHJ0YXMuCiAKICMgTUlQUyBBcmNoaXRlY3R1cmUKQEAgLTU1Niw3ICs1OTMsNyBAQAogCWhlbHAKIAkgIElmIHlvdSBzYXkgWSBoZXJlLCB1c2VyIGFwcGxpY2F0aW9ucyB3aWxsIGJlIGFibGUgdG8gbW1hcCB0aGUKIAkgIFdEVC9DUEcgcmVnaXN0ZXJzLgotIworCiAjIFNQQVJDNjQgQXJjaGl0ZWN0dXJlCiAKIGNvbmZpZyBXQVRDSERPR19DUDFYWFgKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci93YXRjaGRvZy9NYWtlZmlsZSBiL2RyaXZlcnMvY2hhci93YXRjaGRvZy9NYWtlZmlsZQppbmRleCA3ZjcwYWJhLi4zNjQ0MDQ5IDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvd2F0Y2hkb2cvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9jaGFyL3dhdGNoZG9nL01ha2VmaWxlCkBAIC0yMyw3ICsyMyw3IEBACiBvYmotJChDT05GSUdfVVNCUENXQVRDSERPRykgKz0gcGN3ZF91c2IubwogCiAjIEFSTSBBcmNoaXRlY3R1cmUKLW9iai0kKENPTkZJR19BVDkxX1dBVENIRE9HKSArPSBhdDkxX3dkdC5vCitvYmotJChDT05GSUdfQVQ5MVJNOTIwMF9XQVRDSERPRykgKz0gYXQ5MXJtOTIwMF93ZHQubwogb2JqLSQoQ09ORklHX09NQVBfV0FUQ0hET0cpICs9IG9tYXBfd2R0Lm8KIG9iai0kKENPTkZJR18yMTI4NV9XQVRDSERPRykgKz0gd2R0Mjg1Lm8KIG9iai0kKENPTkZJR185NzdfV0FUQ0hET0cpICs9IHdkdDk3Ny5vCkBAIC01Myw3ICs1Myw5IEBACiBvYmotJChDT05GSUdfNjBYWF9XRFQpICs9IHNiYzYweHh3ZHQubwogb2JqLSQoQ09ORklHX1NCQzgzNjBfV0RUKSArPSBzYmM4MzYwLm8KIG9iai0kKENPTkZJR19DUFU1X1dEVCkgKz0gY3B1NXdkdC5vCitvYmotJChDT05GSUdfU01TQzM3Qjc4N19XRFQpICs9IHNtc2MzN2I3ODdfd2R0Lm8KIG9iai0kKENPTkZJR19XODM2MjdIRl9XRFQpICs9IHc4MzYyN2hmX3dkdC5vCitvYmotJChDT05GSUdfVzgzNjk3SEZfV0RUKSArPSB3ODM2OTdoZl93ZHQubwogb2JqLSQoQ09ORklHX1c4Mzg3N0ZfV0RUKSArPSB3ODM4NzdmX3dkdC5vCiBvYmotJChDT05GSUdfVzgzOTc3Rl9XRFQpICs9IHc4Mzk3N2Zfd2R0Lm8KIG9iai0kKENPTkZJR19NQUNIWl9XRFQpICs9IG1hY2h6d2QubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL3dhdGNoZG9nL2FsaW03MTAxX3dkdC5jIGIvZHJpdmVycy9jaGFyL3dhdGNoZG9nL2FsaW03MTAxX3dkdC5jCmluZGV4IDU5NDg4NjMuLmJmMjVkMGEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci93YXRjaGRvZy9hbGltNzEwMV93ZHQuYworKysgYi9kcml2ZXJzL2NoYXIvd2F0Y2hkb2cvYWxpbTcxMDFfd2R0LmMKQEAgLTc3LDcgKzc3LDggQEAKIAogc3RhdGljIGludCBub3dheW91dCA9IFdBVENIRE9HX05PV0FZT1VUOwogbW9kdWxlX3BhcmFtKG5vd2F5b3V0LCBpbnQsIDApOwotTU9EVUxFX1BBUk1fREVTQyhub3dheW91dCwgIldhdGNoZG9nIGNhbm5vdCBiZSBzdG9wcGVkIG9uY2Ugc3RhcnRlZCAoZGVmYXVsdD1DT05GSUdfV0FUQ0hET0dfTk9XQVlPVVQpIik7CitNT0RVTEVfUEFSTV9ERVNDKG5vd2F5b3V0LCAiV2F0Y2hkb2cgY2Fubm90IGJlIHN0b3BwZWQgb25jZSBzdGFydGVkIChkZWZhdWx0PSIKKwkJIF9fc3RyaW5naWZ5KENPTkZJR19XQVRDSERPR19OT1dBWU9VVCkgIikiKTsKIAogLyoKICAqCVdoYWNrIHRoZSBkb2cKQEAgLTQxNSw2ICs0MTYsMTYgQEAKIG1vZHVsZV9pbml0KGFsaW03MTAxX3dkdF9pbml0KTsKIG1vZHVsZV9leGl0KGFsaW03MTAxX3dkdF91bmxvYWQpOwogCitzdGF0aWMgc3RydWN0IHBjaV9kZXZpY2VfaWQgYWxpbTcxMDFfcGNpX3RibFtdIF9fZGV2aW5pdGRhdGEgPSB7CisJeyBQQ0lfVkVORE9SX0lEX0FMLCBQQ0lfREVWSUNFX0lEX0FMX00xNTMzLAorCSAgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMH0sCisJeyBQQ0lfVkVORE9SX0lEX0FMLCBQQ0lfREVWSUNFX0lEX0FMX003MTAxLAorCSAgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMH0sCisJeyB9Cit9OworCitNT0RVTEVfREVWSUNFX1RBQkxFKHBjaSwgYWxpbTcxMDFfcGNpX3RibCk7CisKIE1PRFVMRV9BVVRIT1IoIlN0ZXZlIEhpbGwiKTsKIE1PRFVMRV9ERVNDUklQVElPTigiQUxpIE03MTAxIFBNVSBDb21wdXRlciBXYXRjaGRvZyBUaW1lciBkcml2ZXIiKTsKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci93YXRjaGRvZy9hdDkxX3dkdC5jIGIvZHJpdmVycy9jaGFyL3dhdGNoZG9nL2F0OTFybTkyMDBfd2R0LmMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGRyaXZlcnMvY2hhci93YXRjaGRvZy9hdDkxX3dkdC5jCnJlbmFtZSB0byBkcml2ZXJzL2NoYXIvd2F0Y2hkb2cvYXQ5MXJtOTIwMF93ZHQuYwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL3dhdGNoZG9nL2lUQ09fd2R0LmMgYi9kcml2ZXJzL2NoYXIvd2F0Y2hkb2cvaVRDT193ZHQuYwppbmRleCBhYWFjOTRkLi5iNmYyOWNiIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvd2F0Y2hkb2cvaVRDT193ZHQuYworKysgYi9kcml2ZXJzL2NoYXIvd2F0Y2hkb2cvaVRDT193ZHQuYwpAQCAtMzUsNiArMzUsMTAgQEAKICAqCTgyODAxR0RIIChJQ0g3REgpICAgIDogZG9jdW1lbnQgbnVtYmVyIDMwNzAxMy0wMDIsIDMwNzAxNC0wMDksCiAgKgk4MjgwMUdCTSAoSUNINy1NKSAgICA6IGRvY3VtZW50IG51bWJlciAzMDcwMTMtMDAyLCAzMDcwMTQtMDA5LAogICoJODI4MDFHSE0gKElDSDctTSBESCkgOiBkb2N1bWVudCBudW1iZXIgMzA3MDEzLTAwMiwgMzA3MDE0LTAwOSwKKyAqCTgyODAxSEIgIChJQ0g4KSAgICAgIDogZG9jdW1lbnQgbnVtYmVyIDMxMzA1Ni0wMDIsIDMxMzA1Ny0wMDQsCisgKgk4MjgwMUhSICAoSUNIOFIpICAgICA6IGRvY3VtZW50IG51bWJlciAzMTMwNTYtMDAyLCAzMTMwNTctMDA0LAorICoJODI4MDFISCAgKElDSDhESCkgICAgOiBkb2N1bWVudCBudW1iZXIgMzEzMDU2LTAwMiwgMzEzMDU3LTAwNCwKKyAqCTgyODAxSE8gIChJQ0g4RE8pICAgIDogZG9jdW1lbnQgbnVtYmVyIDMxMzA1Ni0wMDIsIDMxMzA1Ny0wMDQsCiAgKgk2MzAwRVNCICAoNjMwMEVTQikgICA6IGRvY3VtZW50IG51bWJlciAzMDA2NDEtMDAzCiAgKi8KIApAQCAtNDUsNyArNDksNyBAQAogLyogTW9kdWxlIGFuZCB2ZXJzaW9uIGluZm9ybWF0aW9uICovCiAjZGVmaW5lIERSVl9OQU1FICAgICAgICAiaVRDT193ZHQiCiAjZGVmaW5lIERSVl9WRVJTSU9OICAgICAiMS4wMCIKLSNkZWZpbmUgRFJWX1JFTERBVEUgICAgICIzMC1KdWwtMjAwNiIKKyNkZWZpbmUgRFJWX1JFTERBVEUgICAgICIwOC1PY3QtMjAwNiIKICNkZWZpbmUgUEZYCQlEUlZfTkFNRSAiOiAiCiAKIC8qIEluY2x1ZGVzICovCkBAIC04NSw2ICs4OSw5IEBACiAJVENPX0lDSDcsCS8qIElDSDcgJiBJQ0g3UiAqLwogCVRDT19JQ0g3TSwJLyogSUNINy1NICovCiAJVENPX0lDSDdNREgsCS8qIElDSDctTSBESCAqLworCVRDT19JQ0g4LAkvKiBJQ0g4ICYgSUNIOFIgKi8KKwlUQ09fSUNIOERILAkvKiBJQ0g4REggKi8KKwlUQ09fSUNIOERPLAkvKiBJQ0g4RE8gKi8KIH07CiAKIHN0YXRpYyBzdHJ1Y3QgewpAQCAtMTA4LDYgKzExNSw5IEBACiAJeyJJQ0g3IG9yIElDSDdSIiwgMn0sCiAJeyJJQ0g3LU0iLCAyfSwKIAl7IklDSDctTSBESCIsIDJ9LAorCXsiSUNIOCBvciBJQ0g4UiIsIDJ9LAorCXsiSUNIOERIIiwgMn0sCisJeyJJQ0g4RE8iLCAyfSwKIAl7TlVMTCwwfQogfTsKIApAQCAtMTM1LDYgKzE0NSw5IEBACiAJeyBQQ0lfVkVORE9SX0lEX0lOVEVMLCBQQ0lfREVWSUNFX0lEX0lOVEVMX0lDSDdfMCwJUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgVENPX0lDSDcgICAgfSwKIAl7IFBDSV9WRU5ET1JfSURfSU5URUwsIFBDSV9ERVZJQ0VfSURfSU5URUxfSUNIN18xLAlQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBUQ09fSUNIN00gICB9LAogCXsgUENJX1ZFTkRPUl9JRF9JTlRFTCwgUENJX0RFVklDRV9JRF9JTlRFTF9JQ0g3XzMxLAlQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBUQ09fSUNIN01ESCB9LAorCXsgUENJX1ZFTkRPUl9JRF9JTlRFTCwgUENJX0RFVklDRV9JRF9JTlRFTF9JQ0g4XzAsCVBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIFRDT19JQ0g4ICAgIH0sCisJeyBQQ0lfVkVORE9SX0lEX0lOVEVMLCBQQ0lfREVWSUNFX0lEX0lOVEVMX0lDSDhfMiwJUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgVENPX0lDSDhESCAgfSwKKwl7IFBDSV9WRU5ET1JfSURfSU5URUwsIFBDSV9ERVZJQ0VfSURfSU5URUxfSUNIOF8zLAlQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBUQ09fSUNIOERPICB9LAogCXsgMCwgfSwJCQkvKiBFbmQgb2YgbGlzdCAqLwogfTsKIE1PRFVMRV9ERVZJQ0VfVEFCTEUgKHBjaSwgaVRDT193ZHRfcGNpX3RibCk7CkBAIC0zNTUsNyArMzY4LDggQEAKIAkJc3Bpbl91bmxvY2soJmlUQ09fd2R0X3ByaXZhdGUuaW9fbG9jayk7CiAKIAkJKnRpbWVfbGVmdCA9ICh2YWw4ICogNikgLyAxMDsKLQl9CisJfSBlbHNlCisJCXJldHVybiAtRUlOVkFMOwogCXJldHVybiAwOwogfQogCkBAIC00MjYsNyArNDQwLDYgQEAKIHsKIAlpbnQgbmV3X29wdGlvbnMsIHJldHZhbCA9IC1FSU5WQUw7CiAJaW50IG5ld19oZWFydGJlYXQ7Ci0JaW50IHRpbWVfbGVmdDsKIAl2b2lkIF9fdXNlciAqYXJncCA9ICh2b2lkIF9fdXNlciAqKWFyZzsKIAlpbnQgX191c2VyICpwID0gYXJncDsKIAlzdGF0aWMgc3RydWN0IHdhdGNoZG9nX2luZm8gaWRlbnQgPSB7CkBAIC00ODYsNiArNDk5LDggQEAKIAogCQljYXNlIFdESU9DX0dFVFRJTUVMRUZUOgogCQl7CisJCQlpbnQgdGltZV9sZWZ0OworCiAJCQlpZiAoaVRDT193ZHRfZ2V0X3RpbWVsZWZ0KCZ0aW1lX2xlZnQpKQogCQkJCXJldHVybiAtRUlOVkFMOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvd2F0Y2hkb2cvczNjMjQxMF93ZHQuYyBiL2RyaXZlcnMvY2hhci93YXRjaGRvZy9zM2MyNDEwX3dkdC5jCmluZGV4IDY4YjFjYTk3Ni4uMThjYjA1MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL3dhdGNoZG9nL3MzYzI0MTBfd2R0LmMKKysrIGIvZHJpdmVycy9jaGFyL3dhdGNoZG9nL3MzYzI0MTBfd2R0LmMKQEAgLTM4MCwxOCArMzgwLDIxIEBACiAJcmVzID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfSVJRLCAwKTsKIAlpZiAocmVzID09IE5VTEwpIHsKIAkJcHJpbnRrKEtFUk5fSU5GTyBQRlggImZhaWxlZCB0byBnZXQgaXJxIHJlc291cmNlXG4iKTsKKwkJaW91bm1hcCh3ZHRfYmFzZSk7CiAJCXJldHVybiAtRU5PRU5UOwogCX0KIAogCXJldCA9IHJlcXVlc3RfaXJxKHJlcy0+c3RhcnQsIHMzYzI0MTB3ZHRfaXJxLCAwLCBwZGV2LT5uYW1lLCBwZGV2KTsKIAlpZiAocmV0ICE9IDApIHsKIAkJcHJpbnRrKEtFUk5fSU5GTyBQRlggImZhaWxlZCB0byBpbnN0YWxsIGlycSAoJWQpXG4iLCByZXQpOworCQlpb3VubWFwKHdkdF9iYXNlKTsKIAkJcmV0dXJuIHJldDsKIAl9CiAKIAl3ZHRfY2xvY2sgPSBjbGtfZ2V0KCZwZGV2LT5kZXYsICJ3YXRjaGRvZyIpOwogCWlmICh3ZHRfY2xvY2sgPT0gTlVMTCkgewogCQlwcmludGsoS0VSTl9JTkZPIFBGWCAiZmFpbGVkIHRvIGZpbmQgd2F0Y2hkb2cgY2xvY2sgc291cmNlXG4iKTsKKwkJaW91bm1hcCh3ZHRfYmFzZSk7CiAJCXJldHVybiAtRU5PRU5UOwogCX0KIApAQCAtNDE1LDYgKzQxOCw3IEBACiAJaWYgKHJldCkgewogCQlwcmludGsgKEtFUk5fRVJSIFBGWCAiY2Fubm90IHJlZ2lzdGVyIG1pc2NkZXYgb24gbWlub3I9JWQgKCVkKVxuIiwKIAkJCVdBVENIRE9HX01JTk9SLCByZXQpOworCQlpb3VubWFwKHdkdF9iYXNlKTsKIAkJcmV0dXJuIHJldDsKIAl9CiAKQEAgLTQ1MSw2ICs0NTUsNyBAQAogCQl3ZHRfY2xvY2sgPSBOVUxMOwogCX0KIAorCWlvdW5tYXAod2R0X2Jhc2UpOwogCW1pc2NfZGVyZWdpc3RlcigmczNjMjQxMHdkdF9taXNjZGV2KTsKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci93YXRjaGRvZy9zYzEyMDB3ZHQuYyBiL2RyaXZlcnMvY2hhci93YXRjaGRvZy9zYzEyMDB3ZHQuYwppbmRleCBkOGQwZjI4Li5lMzIzOTgzIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvd2F0Y2hkb2cvc2MxMjAwd2R0LmMKKysrIGIvZHJpdmVycy9jaGFyL3dhdGNoZG9nL3NjMTIwMHdkdC5jCkBAIC0zOTIsNyArMzkyLDcgQEAKIAlpZiAoaW8gPT0gLTEpIHsKIAkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiaW8gcGFyYW1ldGVyIG11c3QgYmUgc3BlY2lmaWVkXG4iKTsKIAkJcmV0ID0gLUVJTlZBTDsKLQkJZ290byBvdXRfY2xlYW47CisJCWdvdG8gb3V0X3BucDsKIAl9CiAKICNpZiBkZWZpbmVkIENPTkZJR19QTlAKQEAgLTQwNSw3ICs0MDUsNyBAQAogCWlmICghcmVxdWVzdF9yZWdpb24oaW8sIGlvX2xlbiwgU0MxMjAwX01PRFVMRV9OQU1FKSkgewogCQlwcmludGsoS0VSTl9FUlIgUEZYICJVbmFibGUgdG8gcmVnaXN0ZXIgSU8gcG9ydCAlI3hcbiIsIGlvKTsKIAkJcmV0ID0gLUVCVVNZOwotCQlnb3RvIG91dF9jbGVhbjsKKwkJZ290byBvdXRfcG5wOwogCX0KIAogCXJldCA9IHNjMTIwMHdkdF9wcm9iZSgpOwpAQCAtNDM1LDYgKzQzNSwxMSBAQAogb3V0X2lvOgogCXJlbGVhc2VfcmVnaW9uKGlvLCBpb19sZW4pOwogCitvdXRfcG5wOgorI2lmIGRlZmluZWQgQ09ORklHX1BOUAorCWlmIChpc2FwbnApCisJCXBucF91bnJlZ2lzdGVyX2RyaXZlcigmc2NsMjAwd2R0X3BucF9kcml2ZXIpOworI2VuZGlmCiAJZ290byBvdXRfY2xlYW47CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci93YXRjaGRvZy9zbXNjMzdiNzg3X3dkdC5jIGIvZHJpdmVycy9jaGFyL3dhdGNoZG9nL3Ntc2MzN2I3ODdfd2R0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWY1NjkxMwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci93YXRjaGRvZy9zbXNjMzdiNzg3X3dkdC5jCkBAIC0wLDAgKzEsNjI3IEBACisvKgorICoJU01zQyAzN0I3ODcgV2F0Y2hkb2cgVGltZXIgZHJpdmVyIGZvciBMaW51eCAyLjYueC54CisgKgorICogICAgICBCYXNlZCBvbiBhY3F1aXJld2R0LmMgYnkgQWxhbiBDb3ggPGFsYW5AcmVkaGF0LmNvbT4KKyAqICAgICAgIGFuZCBzb21lIG90aGVyIGV4aXN0aW5nIGRyaXZlcnMKKyAqCisgKglUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKgltb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICoJYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKgkyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqCVRoZSBhdXRob3JzIGRvIE5PVCBhZG1pdCBsaWFiaWxpdHkgbm9yIHByb3ZpZGUgd2FycmFudHkgZm9yCisgKglhbnkgb2YgdGhpcyBzb2Z0d2FyZS4gVGhpcyBtYXRlcmlhbCBpcyBwcm92aWRlZCAiQVMtSVMiIGluCisgKiAgICAgIHRoZSBob3BlIHRoYXQgaXQgbWF5IGJlIHVzZWZ1bCBmb3Igb3RoZXJzLgorICoKKyAqCShDKSBDb3B5cmlnaHQgMjAwMy0yMDA2ICBTdmVuIEFuZGVycyA8YW5kZXJzQGFuZHVyYXMuZGU+CisgKgorICogIEhpc3Rvcnk6CisgKgkyMDAzIC0gQ3JlYXRlZCB2ZXJzaW9uIDEuMCBmb3IgTGludXggMi40LnguCisgKgkyMDA2IC0gUG9ydGVkIHRvIExpbnV4IDIuNiwgYWRkZWQgbm93YXlvdXQgYW5kIE1BR0lDQ0xPU0UKKyAqICAgICAgICAgICAgIGZlYXR1cmVzLiBSZWxlYXNlZCB2ZXJzaW9uIDEuMQorICoKKyAqICBUaGVvcnkgb2Ygb3BlcmF0aW9uOgorICoKKyAqICAgICAgQSBXYXRjaGRvZyBUaW1lciAoV0RUKSBpcyBhIGhhcmR3YXJlIGNpcmN1aXQgdGhhdCBjYW4KKyAqICAgICAgcmVzZXQgdGhlIGNvbXB1dGVyIHN5c3RlbSBpbiBjYXNlIG9mIGEgc29mdHdhcmUgZmF1bHQuCisgKiAgICAgIFlvdSBwcm9iYWJseSBrbmV3IHRoYXQgYWxyZWFkeS4KKyAqCisgKiAgICAgIFVzdWFsbHkgYSB1c2Vyc3BhY2UgZGFlbW9uIHdpbGwgbm90aWZ5IHRoZSBrZXJuZWwgV0RUIGRyaXZlcgorICogICAgICB2aWEgdGhlIC9kZXYvd2F0Y2hkb2cgc3BlY2lhbCBkZXZpY2UgZmlsZSB0aGF0IHVzZXJzcGFjZSBpcworICogICAgICBzdGlsbCBhbGl2ZSwgYXQgcmVndWxhciBpbnRlcnZhbHMuICBXaGVuIHN1Y2ggYSBub3RpZmljYXRpb24KKyAqICAgICAgb2NjdXJzLCB0aGUgZHJpdmVyIHdpbGwgdXN1YWxseSB0ZWxsIHRoZSBoYXJkd2FyZSB3YXRjaGRvZworICogICAgICB0aGF0IGV2ZXJ5dGhpbmcgaXMgaW4gb3JkZXIsIGFuZCB0aGF0IHRoZSB3YXRjaGRvZyBzaG91bGQgd2FpdAorICogICAgICBmb3IgeWV0IGFub3RoZXIgbGl0dGxlIHdoaWxlIHRvIHJlc2V0IHRoZSBzeXN0ZW0uCisgKiAgICAgIElmIHVzZXJzcGFjZSBmYWlscyAoUkFNIGVycm9yLCBrZXJuZWwgYnVnLCB3aGF0ZXZlciksIHRoZQorICogICAgICBub3RpZmljYXRpb25zIGNlYXNlIHRvIG9jY3VyLCBhbmQgdGhlIGhhcmR3YXJlIHdhdGNoZG9nIHdpbGwKKyAqICAgICAgcmVzZXQgdGhlIHN5c3RlbSAoY2F1c2luZyBhIHJlYm9vdCkgYWZ0ZXIgdGhlIHRpbWVvdXQgb2NjdXJzLgorICoKKyAqIENyZWF0ZSBkZXZpY2Ugd2l0aDoKKyAqICBta25vZCAvZGV2L3dhdGNoZG9nIGMgMTAgMTMwCisgKgorICogRm9yIGFuIGV4YW1wbGUgdXNlcnNwYWNlIGtlZXAtYWxpdmUgZGFlbW9uLCBzZWU6CisgKiAgIERvY3VtZW50YXRpb24vd2F0Y2hkb2cvd2F0Y2hkb2cudHh0CisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9taXNjZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvd2F0Y2hkb2cuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvbm90aWZpZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9yZWJvb3QuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKworI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorCisvKiBlbmFibGUgc3VwcG9ydCBmb3IgbWludXRlcyBhcyB1bml0cz8gKi8KKy8qIChkb2VzIG5vdCBhbHdheXMgd29yayBjb3JyZWN0bHksIHNvIGRpc2FibGVkIGJ5IGRlZmF1bHQhKSAqLworI2RlZmluZSBTTVNDX1NVUFBPUlRfTUlOVVRFUworI3VuZGVmIFNNU0NfU1VQUE9SVF9NSU5VVEVTCisKKyNkZWZpbmUgTUFYX1RJTUVPVVQgICAgIDI1NQorCisjZGVmaW5lIFVOSVRfU0VDT05EICAgICAwCisjZGVmaW5lIFVOSVRfTUlOVVRFICAgICAxCisKKyNkZWZpbmUgTU9ETkFNRQkJInNtc2MzN2I3ODdfd2R0OiAiCisjZGVmaW5lIFZFUlNJT04gICAgICAgICAiMS4xIgorCisjZGVmaW5lIElPUE9SVCAgICAgICAgICAweDNGMAorI2RlZmluZSBJT1BPUlRfU0laRSAgICAgMgorI2RlZmluZSBJT0RFVl9OTyAgICAgICAgOAorCitzdGF0aWMgaW50IHVuaXQgPSBVTklUX1NFQ09ORDsgIC8qIHRpbWVyJ3MgdW5pdCAqLworc3RhdGljIGludCB0aW1lb3V0ID0gNjA7ICAgICAgICAvKiB0aW1lb3V0IHZhbHVlOiBkZWZhdWx0IGlzIDYwICJ1bml0cyIgKi8KK3N0YXRpYyB1bnNpZ25lZCBsb25nIHRpbWVyX2VuYWJsZWQgPSAwOyAgIC8qIGlzIHRoZSB0aW1lciBlbmFibGVkPyAqLworCitzdGF0aWMgY2hhciBleHBlY3RfY2xvc2U7ICAgICAgIC8qIGlzIHRoZSBjbG9zZSBleHBlY3RlZD8gKi8KKworc3RhdGljIHNwaW5sb2NrX3QgaW9fbG9jazsJLyogdG8gZ3VhcmQgdGhlIHdhdGNoZG9nIGZyb20gaW8gcmFjZXMgKi8KKworc3RhdGljIGludCBub3dheW91dCA9IFdBVENIRE9HX05PV0FZT1VUOworCisvKiAtLSBMb3cgbGV2ZWwgZnVuY3Rpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIHVubG9jayB0aGUgSU8gY2hpcCAqLworCitzdGF0aWMgaW5saW5lIHZvaWQgb3Blbl9pb19jb25maWcodm9pZCkKK3sKKyAgICAgICAgb3V0YigweDU1LCBJT1BPUlQpOworCW1kZWxheSgxKTsKKyAgICAgICAgb3V0YigweDU1LCBJT1BPUlQpOworfQorCisvKiBsb2NrIHRoZSBJTyBjaGlwICovCitzdGF0aWMgaW5saW5lIHZvaWQgY2xvc2VfaW9fY29uZmlnKHZvaWQpCit7CisgICAgICAgIG91dGIoMHhBQSwgSU9QT1JUKTsKK30KKworLyogc2VsZWN0IHRoZSBJTyBkZXZpY2UgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBzZWxlY3RfaW9fZGV2aWNlKHVuc2lnbmVkIGNoYXIgZGV2bm8pCit7CisgICAgICAgIG91dGIoMHgwNywgSU9QT1JUKTsKKyAgICAgICAgb3V0YihkZXZubywgSU9QT1JUKzEpOworfQorCisvKiB3cml0ZSB0byB0aGUgY29udHJvbCByZWdpc3RlciAqLworc3RhdGljIGlubGluZSB2b2lkIHdyaXRlX2lvX2NyKHVuc2lnbmVkIGNoYXIgcmVnLCB1bnNpZ25lZCBjaGFyIGRhdGEpCit7CisgICAgICAgIG91dGIocmVnLCBJT1BPUlQpOworICAgICAgICBvdXRiKGRhdGEsIElPUE9SVCsxKTsKK30KKworLyogcmVhZCBmcm9tIHRoZSBjb250cm9sIHJlZ2lzdGVyICovCitzdGF0aWMgaW5saW5lIGNoYXIgcmVhZF9pb19jcih1bnNpZ25lZCBjaGFyIHJlZykKK3sKKyAgICAgICAgb3V0YihyZWcsIElPUE9SVCk7CisgICAgICAgIHJldHVybiBpbmIoSU9QT1JUKzEpOworfQorCisvKiAtLSBNZWRpdW0gbGV2ZWwgZnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBncGlvX2JpdDEyKHVuc2lnbmVkIGNoYXIgcmVnKQoreworCS8vIC0tIEdlbmVyYWwgUHVycG9zZSBJL08gQml0IDEuMiAtLQorCS8vIEJpdCAwLCAgIEluL091dDogMCA9IE91dHB1dCwgMSA9IElucHV0CisJLy8gQml0IDEsICAgUG9sYXJpdHk6IDAgPSBObyBJbnZlcnQsIDEgPSBJbnZlcnQKKwkvLyBCaXQgMiwgICBHcm91cCBFbmFibGUgSW50ci46IDAgPSBEaXNhYmxlLCAxID0gRW5hYmxlCisJLy8gQml0IDMvNCwgRnVuY3Rpb24gc2VsZWN0OiAwMCA9IEdQSS9PLCAwMSA9IFdEVCwgMTAgPSBQMTcsCisJLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAxMSA9IEVpdGhlciBFZGdlIFRyaWdnZXJlZCBJbnRyLiAyCisgICAgICAgIC8vIEJpdCA1LzYgIChSZXNlcnZlZCkKKwkvLyBCaXQgNywgICBPdXRwdXQgVHlwZTogMCA9IFB1c2ggUHVsbCBCaXQsIDEgPSBPcGVuIERyYWluCisgICAgICAgIHdyaXRlX2lvX2NyKDB4RTIsIHJlZyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBncGlvX2JpdDEzKHVuc2lnbmVkIGNoYXIgcmVnKQoreworCS8vIC0tIEdlbmVyYWwgUHVycG9zZSBJL08gQml0IDEuMyAtLQorCS8vIEJpdCAwLCAgSW4vT3V0OiAwID0gT3V0cHV0LCAxID0gSW5wdXQKKwkvLyBCaXQgMSwgIFBvbGFyaXR5OiAwID0gTm8gSW52ZXJ0LCAxID0gSW52ZXJ0CisJLy8gQml0IDIsICBHcm91cCBFbmFibGUgSW50ci46IDAgPSBEaXNhYmxlLCAxID0gRW5hYmxlCisJLy8gQml0IDMsICBGdW5jdGlvbiBzZWxlY3Q6IDAgPSBHUEkvTywgMSA9IExFRAorICAgICAgICAvLyBCaXQgNC02IChSZXNlcnZlZCkKKwkvLyBCaXQgNywgIE91dHB1dCBUeXBlOiAwID0gUHVzaCBQdWxsIEJpdCwgMSA9IE9wZW4gRHJhaW4KKyAgICAgICAgd3JpdGVfaW9fY3IoMHhFMywgcmVnKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHdkdF90aW1lcl91bml0cyh1bnNpZ25lZCBjaGFyIG5ld191bml0cykKK3sKKwkvLyAtLSBXYXRjaGRvZyB0aW1lciB1bml0cyAtLQorCS8vIEJpdCAwLTYgKFJlc2VydmVkKQorCS8vIEJpdCA3LCAgV0RUIFRpbWUtb3V0IFZhbHVlIFVuaXRzIFNlbGVjdAorCS8vICAgICAgICAgKDAgPSBNaW51dGVzLCAxID0gU2Vjb25kcykKKyAgICAgICAgd3JpdGVfaW9fY3IoMHhGMSwgbmV3X3VuaXRzKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHdkdF90aW1lb3V0X3ZhbHVlKHVuc2lnbmVkIGNoYXIgbmV3X3RpbWVvdXQpCit7CisJLy8gLS0gV2F0Y2hkb2cgVGltZXIgVGltZS1vdXQgVmFsdWUgLS0KKwkvLyBCaXQgMC03IEJpbmFyeSBjb2RlZCB1bml0cyAoMD1EaXNhYmxlZCwgMS4uMjU1KQorICAgICAgICB3cml0ZV9pb19jcigweEYyLCBuZXdfdGltZW91dCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCB3ZHRfdGltZXJfY29uZih1bnNpZ25lZCBjaGFyIGNvbmYpCit7CisJLy8gLS0gV2F0Y2hkb2cgdGltZXIgY29uZmlndXJhdGlvbiAtLQorCS8vIEJpdCAwICAgSm95c3RpY2sgZW5hYmxlOiAwKiA9IE5vIFJlc2V0LCAxID0gUmVzZXQgV0RUIHVwb24gR2FtZXBvcnQgSS9PCisJLy8gQml0IDEgICBLZXlib2FyZCBlbmFibGU6IDAqID0gTm8gUmVzZXQsIDEgPSBSZXNldCBXRFQgdXBvbiBLQkQgSW50ci4KKwkvLyBCaXQgMiAgIE1vdXNlIGVuYWJsZTogMCogPSBObyBSZXNldCwgMSA9IFJlc2V0IFdEVCB1cG9uIE1vdXNlIEludHIuCisgICAgICAgIC8vIEJpdCAzICAgUmVzZXQgdGhlIHRpbWVyCisgICAgICAgIC8vICAgICAgICAgKFdyb25nIGluIFNNc0MgZG9jdW1lbnRhdGlvbj8gR2l2ZW4gYXM6IFBvd2VyTEVEIFRpbW91dCBFbmFibGVkKQorCS8vIEJpdCA0LTcgV0RUIEludGVycnVwdCBNYXBwaW5nOiAoMDAwMCogPSBEaXNhYmxlZCwKKwkvLyAgICAgICAgICAgIDAwMDE9SVJRMSwgMDAxMD0oSW52YWxpZCksIDAwMTE9SVJRMyB0byAxMTExPUlSUTE1KQorICAgICAgICB3cml0ZV9pb19jcigweEYzLCBjb25mKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHdkdF90aW1lcl9jdHJsKHVuc2lnbmVkIGNoYXIgcmVnKQoreworCS8vIC0tIFdhdGNoZG9nIHRpbWVyIGNvbnRyb2wgLS0KKwkvLyBCaXQgMCAgIFN0YXR1cyBCaXQ6IDAgPSBUaW1lciBjb3VudGluZywgMSA9IFRpbWVvdXQgb2NjdXJlZAorCS8vIEJpdCAxICAgUG93ZXIgTEVEIFRvZ2dsZTogMCA9IERpc2FibGUgVG9nZ2xlLCAxID0gVG9nZ2xlIGF0IDEgSHoKKwkvLyBCaXQgMiAgIEZvcmNlIFRpbWVvdXQ6IDEgPSBGb3JjZXMgV0QgdGltZW91dCBldmVudCAoc2VsZi1jbGVhbmluZykKKwkvLyBCaXQgMyAgIFAyMCBGb3JjZSBUaW1lb3V0IGVuYWJsZWQ6CisJLy8gICAgICAgICAgMCA9IFAyMCBhY3Rpdml0eSBkb2VzIG5vdCBnZW5lcmF0ZSB0aGUgV0QgdGltZW91dCBldmVudAorCS8vICAgICAgICAgIDEgPSBQMjAgQWxsb3dzIHJpc2luZyBlZGdlIG9mIFAyMCwgZnJvbSB0aGUga2V5Ym9hcmQKKwkvLyAgICAgICAgICAgICAgY29udHJvbGxlciwgdG8gZm9yY2UgdGhlIFdEIHRpbWVvdXQgZXZlbnQuCisJLy8gQml0IDQgICAoUmVzZXJ2ZWQpCisJLy8gLS0gU29mdCBwb3dlciBtYW5hZ2VtZW50IC0tCisJLy8gQml0IDUgICBTdG9wIENvdW50ZXI6IDEgPSBTdG9wIHNvZnR3YXJlIHBvd2VyIGRvd24gY291bnRlcgorCS8vICAgICAgICAgICAgc2V0IHZpYSByZWdpc3RlciAweEI4LCAoc2VsZi1jbGVhbmluZykKKwkvLyAgICAgICAgICAgIChVcG9uIHJlYWQ6IDAgPSBDb3VudGVyIHJ1bm5pbmcsIDEgPSBDb3VudGVyIHN0b3BwZWQpCisJLy8gQml0IDYgICBSZXN0YXJ0IENvdW50ZXI6IDEgPSBSZXN0YXJ0IHNvZnR3YXJlIHBvd2VyIGRvd24gY291bnRlcgorCS8vICAgICAgICAgICAgc2V0IHZpYSByZWdpc3RlciAweEI4LCAoc2VsZi1jbGVhbmluZykKKwkvLyBCaXQgNyAgIFNQT0ZGOiAxID0gRm9yY2Ugc29mdHdhcmUgcG93ZXIgZG93biAoc2VsZi1jbGVhbmluZykKKworICAgICAgICB3cml0ZV9pb19jcigweEY0LCByZWcpOworfQorCisvKiAtLSBIaWdoZXIgbGV2ZWwgZnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIGluaXRpYWxpemUgd2F0Y2hkb2cgKi8KKworc3RhdGljIHZvaWQgd2Jfc21zY193ZHRfaW5pdGlhbGl6ZSh2b2lkKQoreworICAgICAgICB1bnNpZ25lZCBjaGFyIG9sZDsKKworCXNwaW5fbG9jaygmaW9fbG9jayk7CisgICAgICAgIG9wZW5faW9fY29uZmlnKCk7CisgICAgICAgIHNlbGVjdF9pb19kZXZpY2UoSU9ERVZfTk8pOworCisJLy8gZW5hYmxlIHRoZSB3YXRjaGRvZworCWdwaW9fYml0MTMoMHgwOCk7ICAvLyBTZWxlY3QgcGluIDgwID0gTEVEIG5vdCBHUElPCisJZ3Bpb19iaXQxMigweDBBKTsgIC8vIFNldCBwaW4gNzkgPSBXRFQgbm90IEdQSU8vT3V0cHV0L1BvbGFyaXR5PUludmVydAorCisJLy8gZGlzYWJsZSB0aGUgdGltZW91dAorICAgICAgICB3ZHRfdGltZW91dF92YWx1ZSgwKTsKKworCS8vIHJlc2V0IGNvbnRyb2wgcmVnaXN0ZXIKKyAgICAgICAgd2R0X3RpbWVyX2N0cmwoMHgwMCk7CisKKwkvLyByZXNldCBjb25maWd1cmF0aW9uIHJlZ2lzdGVyCisJd2R0X3RpbWVyX2NvbmYoMHgwMCk7CisKKwkvLyByZWFkIG9sZCAodGltZXIgdW5pdHMpIHJlZ2lzdGVyCisgICAgICAgIG9sZCA9IHJlYWRfaW9fY3IoMHhGMSkgJiAweDdGOworICAgICAgICBpZiAodW5pdCA9PSBVTklUX1NFQ09ORCkgb2xkIHw9IDB4ODA7IC8vIHNldCB0byBzZWNvbmRzCisKKwkvLyBzZXQgdGhlIHdhdGNoZG9nIHRpbWVyIHVuaXRzCisgICAgICAgIHdkdF90aW1lcl91bml0cyhvbGQpOworCisgICAgICAgIGNsb3NlX2lvX2NvbmZpZygpOworCXNwaW5fdW5sb2NrKCZpb19sb2NrKTsKK30KKworLyogc2h1dGRvd24gdGhlIHdhdGNoZG9nICovCisKK3N0YXRpYyB2b2lkIHdiX3Ntc2Nfd2R0X3NodXRkb3duKHZvaWQpCit7CisJc3Bpbl9sb2NrKCZpb19sb2NrKTsKKyAgICAgICAgb3Blbl9pb19jb25maWcoKTsKKyAgICAgICAgc2VsZWN0X2lvX2RldmljZShJT0RFVl9OTyk7CisKKwkvLyBkaXNhYmxlIHRoZSB3YXRjaGRvZworICAgICAgICBncGlvX2JpdDEzKDB4MDkpOworICAgICAgICBncGlvX2JpdDEyKDB4MDkpOworCisJLy8gcmVzZXQgd2F0Y2hkb2cgY29uZmlnIHJlZ2lzdGVyCisJd2R0X3RpbWVyX2NvbmYoMHgwMCk7CisKKwkvLyByZXNldCB3YXRjaGRvZyBjb250cm9sIHJlZ2lzdGVyCisgICAgICAgIHdkdF90aW1lcl9jdHJsKDB4MDApOworCisJLy8gZGlzYWJsZSB0aW1lb3V0CisgICAgICAgIHdkdF90aW1lb3V0X3ZhbHVlKDB4MDApOworCisgICAgICAgIGNsb3NlX2lvX2NvbmZpZygpOworCXNwaW5fdW5sb2NrKCZpb19sb2NrKTsKK30KKworLyogc2V0IHRpbWVvdXQgPT4gZW5hYmxlIHdhdGNoZG9nICovCisKK3N0YXRpYyB2b2lkIHdiX3Ntc2Nfd2R0X3NldF90aW1lb3V0KHVuc2lnbmVkIGNoYXIgbmV3X3RpbWVvdXQpCit7CisJc3Bpbl9sb2NrKCZpb19sb2NrKTsKKyAgICAgICAgb3Blbl9pb19jb25maWcoKTsKKyAgICAgICAgc2VsZWN0X2lvX2RldmljZShJT0RFVl9OTyk7CisKKwkvLyBzZXQgUG93ZXIgTEVEIHRvIGJsaW5rLCBpZiB3ZSBlbmFibGUgdGhlIHRpbWVvdXQKKyAgICAgICAgd2R0X3RpbWVyX2N0cmwoKG5ld190aW1lb3V0ID09IDApID8gMHgwMCA6IDB4MDIpOworCisJLy8gc2V0IHRpbWVvdXQgdmFsdWUKKyAgICAgICAgd2R0X3RpbWVvdXRfdmFsdWUobmV3X3RpbWVvdXQpOworCisgICAgICAgIGNsb3NlX2lvX2NvbmZpZygpOworCXNwaW5fdW5sb2NrKCZpb19sb2NrKTsKK30KKworLyogZ2V0IHRpbWVvdXQgKi8KKworc3RhdGljIHVuc2lnbmVkIGNoYXIgd2Jfc21zY193ZHRfZ2V0X3RpbWVvdXQodm9pZCkKK3sKKyAgICAgICAgdW5zaWduZWQgY2hhciBzZXRfdGltZW91dDsKKworCXNwaW5fbG9jaygmaW9fbG9jayk7CisgICAgICAgIG9wZW5faW9fY29uZmlnKCk7CisgICAgICAgIHNlbGVjdF9pb19kZXZpY2UoSU9ERVZfTk8pOworICAgICAgICBzZXRfdGltZW91dCA9IHJlYWRfaW9fY3IoMHhGMik7CisgICAgICAgIGNsb3NlX2lvX2NvbmZpZygpOworCXNwaW5fdW5sb2NrKCZpb19sb2NrKTsKKworICAgICAgICByZXR1cm4gc2V0X3RpbWVvdXQ7Cit9CisKKy8qIGRpc2FibGUgd2F0Y2hkb2cgKi8KKworc3RhdGljIHZvaWQgd2Jfc21zY193ZHRfZGlzYWJsZSh2b2lkKQoreworICAgICAgICAvLyBzZXQgdGhlIHRpbWVvdXQgdG8gMCB0byBkaXNhYmxlIHRoZSB3YXRjaGRvZworICAgICAgICB3Yl9zbXNjX3dkdF9zZXRfdGltZW91dCgwKTsKK30KKworLyogZW5hYmxlIHdhdGNoZG9nIGJ5IHNldHRpbmcgdGhlIGN1cnJlbnQgdGltZW91dCAqLworCitzdGF0aWMgdm9pZCB3Yl9zbXNjX3dkdF9lbmFibGUodm9pZCkKK3sKKyAgICAgICAgLy8gc2V0IHRoZSBjdXJyZW50IHRpbWVvdXQuLi4KKyAgICAgICAgd2Jfc21zY193ZHRfc2V0X3RpbWVvdXQodGltZW91dCk7Cit9CisKKy8qIHJlc2V0IHRoZSB0aW1lciAqLworCitzdGF0aWMgdm9pZCB3Yl9zbXNjX3dkdF9yZXNldF90aW1lcih2b2lkKQoreworCXNwaW5fbG9jaygmaW9fbG9jayk7CisgICAgICAgIG9wZW5faW9fY29uZmlnKCk7CisgICAgICAgIHNlbGVjdF9pb19kZXZpY2UoSU9ERVZfTk8pOworCisJLy8gcmVzZXQgdGhlIHRpbWVyCisJd2R0X3RpbWVvdXRfdmFsdWUodGltZW91dCk7CisJd2R0X3RpbWVyX2NvbmYoMHgwOCk7CisKKyAgICAgICAgY2xvc2VfaW9fY29uZmlnKCk7CisJc3Bpbl91bmxvY2soJmlvX2xvY2spOworfQorCisvKiByZXR1cm4sIGlmIHRoZSB3YXRjaGRvZyBpcyBlbmFibGVkICh0aW1lb3V0IGlzIHNldC4uLikgKi8KKworc3RhdGljIGludCB3Yl9zbXNjX3dkdF9zdGF0dXModm9pZCkKK3sKKwlyZXR1cm4gKHdiX3Ntc2Nfd2R0X2dldF90aW1lb3V0KCkgPT0gMCkgPyAwIDogV0RJT0ZfS0VFUEFMSVZFUElORzsKK30KKworCisvKiAtLSBGaWxlIG9wZXJhdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIG9wZW4gPT4gZW5hYmxlIHdhdGNoZG9nIGFuZCBzZXQgaW5pdGlhbCB0aW1lb3V0ICovCisKK3N0YXRpYyBpbnQgd2Jfc21zY193ZHRfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwkvKiAvZGV2L3dhdGNoZG9nIGNhbiBvbmx5IGJlIG9wZW5lZCBvbmNlICovCisKKwlpZiAodGVzdF9hbmRfc2V0X2JpdCgwLCAmdGltZXJfZW5hYmxlZCkpCisJCXJldHVybiAtRUJVU1k7CisKKwlpZiAobm93YXlvdXQpCisJCV9fbW9kdWxlX2dldChUSElTX01PRFVMRSk7CisKKwkvKiBSZWxvYWQgYW5kIGFjdGl2YXRlIHRpbWVyICovCisJd2Jfc21zY193ZHRfZW5hYmxlKCk7CisKKwlwcmludGsoS0VSTl9JTkZPIE1PRE5BTUUgIldhdGNoZG9nIGVuYWJsZWQuIFRpbWVvdXQgc2V0IHRvICVkICVzLlxuIiwgdGltZW91dCwgKHVuaXQgPT0gVU5JVF9TRUNPTkQpID8gInNlY29uZChzKSIgOiAibWludXRlKHMpIik7CisKKwlyZXR1cm4gbm9uc2Vla2FibGVfb3Blbihpbm9kZSwgZmlsZSk7Cit9CisKKy8qIGNsb3NlID0+IHNodXQgb2ZmIHRoZSB0aW1lciAqLworCitzdGF0aWMgaW50IHdiX3Ntc2Nfd2R0X3JlbGVhc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJLyogU2h1dCBvZmYgdGhlIHRpbWVyLiAqLworCisJaWYgKGV4cGVjdF9jbG9zZSA9PSA0MikgeworCSAgICAgICAgd2Jfc21zY193ZHRfZGlzYWJsZSgpOworCQlwcmludGsoS0VSTl9JTkZPIE1PRE5BTUUgIldhdGNoZG9nIGRpc2FibGVkLCBzbGVlcGluZyBhZ2Fpbi4uLlxuIik7CisJfSBlbHNlIHsKKwkJcHJpbnRrKEtFUk5fQ1JJVCBNT0ROQU1FICJVbmV4cGVjdGVkIGNsb3NlLCBub3Qgc3RvcHBpbmcgd2F0Y2hkb2chXG4iKTsKKwkJd2Jfc21zY193ZHRfcmVzZXRfdGltZXIoKTsKKwl9CisKKwljbGVhcl9iaXQoMCwgJnRpbWVyX2VuYWJsZWQpOworCWV4cGVjdF9jbG9zZSA9IDA7CisJcmV0dXJuIDA7Cit9CisKKy8qIHdyaXRlID0+IHVwZGF0ZSB0aGUgdGltZXIgdG8ga2VlcCB0aGUgbWFjaGluZSBhbGl2ZSAqLworCitzdGF0aWMgc3NpemVfdCB3Yl9zbXNjX3dkdF93cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKmRhdGEsCisJCQkJIHNpemVfdCBsZW4sIGxvZmZfdCAqcHBvcykKK3sKKwkvKiBTZWUgaWYgd2UgZ290IHRoZSBtYWdpYyBjaGFyYWN0ZXIgJ1YnIGFuZCByZWxvYWQgdGhlIHRpbWVyICovCisJaWYgKGxlbikgeworCQlpZiAoIW5vd2F5b3V0KSB7CisJCQlzaXplX3QgaTsKKworCQkJLyogcmVzZXQgZXhwZWN0IGZsYWcgKi8KKwkJCWV4cGVjdF9jbG9zZSA9IDA7CisKKwkJCS8qIHNjYW4gdG8gc2VlIHdoZXRoZXIgb3Igbm90IHdlIGdvdCB0aGUgbWFnaWMgY2hhcmFjdGVyICovCisJCQlmb3IgKGkgPSAwOyBpICE9IGxlbjsgaSsrKSB7CisJCQkJY2hhciBjOworCQkJCWlmIChnZXRfdXNlcihjLCBkYXRhK2kpKQorCQkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCQlpZiAoYyA9PSAnVicpCisJCQkJCWV4cGVjdF9jbG9zZSA9IDQyOworCQkJfQorCQl9CisKKwkJLyogc29tZW9uZSB3cm90ZSB0byB1cywgd2Ugc2hvdWxkIHJlbG9hZCB0aGUgdGltZXIgKi8KKwkJd2Jfc21zY193ZHRfcmVzZXRfdGltZXIoKTsKKwl9CisJcmV0dXJuIGxlbjsKK30KKworLyogaW9jdGwgPT4gY29udHJvbCBpbnRlcmZhY2UgKi8KKworc3RhdGljIGludCB3Yl9zbXNjX3dkdF9pb2N0bChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSwKKwkJCSAgICAgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJaW50IG5ld190aW1lb3V0OworCisJdW5pb24geworCQlzdHJ1Y3Qgd2F0Y2hkb2dfaW5mbyBfX3VzZXIgKmlkZW50OworCQlpbnQgX191c2VyICppOworCX0gdWFyZzsKKworCXN0YXRpYyBzdHJ1Y3Qgd2F0Y2hkb2dfaW5mbyBpZGVudCA9IHsKKwkJLm9wdGlvbnMgPSAJCVdESU9GX0tFRVBBTElWRVBJTkcgfAorCQkgICAgICAgICAgICAgICAgICAgICAgICBXRElPRl9TRVRUSU1FT1VUIHwKKwkJCQkJV0RJT0ZfTUFHSUNDTE9TRSwKKwkJLmZpcm13YXJlX3ZlcnNpb24gPQkwLAorCQkuaWRlbnRpdHkgPSAJCSJTTXNDIDM3Qjc4NyBXYXRjaGRvZyIKKwl9OworCisJdWFyZy5pID0gKGludCBfX3VzZXIgKilhcmc7CisKKwlzd2l0Y2ggKGNtZCkgeworCQlkZWZhdWx0OgorCQkJcmV0dXJuIC1FTk9UVFk7CisKKwkJY2FzZSBXRElPQ19HRVRTVVBQT1JUOgorCQkJcmV0dXJuIGNvcHlfdG9fdXNlcih1YXJnLmlkZW50LCAmaWRlbnQsCisJCQkJc2l6ZW9mKGlkZW50KSkgPyAtRUZBVUxUIDogMDsKKworCQljYXNlIFdESU9DX0dFVFNUQVRVUzoKKwkJCXJldHVybiBwdXRfdXNlcih3Yl9zbXNjX3dkdF9zdGF0dXMoKSwgdWFyZy5pKTsKKworCQljYXNlIFdESU9DX0dFVEJPT1RTVEFUVVM6CisJCQlyZXR1cm4gcHV0X3VzZXIoMCwgdWFyZy5pKTsKKworCQljYXNlIFdESU9DX0tFRVBBTElWRToKKwkJCXdiX3Ntc2Nfd2R0X3Jlc2V0X3RpbWVyKCk7CisJCQlyZXR1cm4gMDsKKworCQljYXNlIFdESU9DX1NFVFRJTUVPVVQ6CisJCQlpZiAoZ2V0X3VzZXIobmV3X3RpbWVvdXQsIHVhcmcuaSkpCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisKKwkJCS8vIHRoZSBBUEkgc3RhdGVzIHRoaXMgaXMgZ2l2ZW4gaW4gc2VjcworCQkJaWYgKHVuaXQgPT0gVU5JVF9NSU5VVEUpCisJCQkgIG5ld190aW1lb3V0IC89IDYwOworCisJCQlpZiAobmV3X3RpbWVvdXQgPCAwIHx8IG5ld190aW1lb3V0ID4gTUFYX1RJTUVPVVQpCisJCQkJcmV0dXJuIC1FSU5WQUw7CisKKwkJCXRpbWVvdXQgPSBuZXdfdGltZW91dDsKKwkJCXdiX3Ntc2Nfd2R0X3NldF90aW1lb3V0KHRpbWVvdXQpOworCisJCQkvLyBmYWxsIHRocm91Z2ggYW5kIHJldHVybiB0aGUgbmV3IHRpbWVvdXQuLi4KKworCQljYXNlIFdESU9DX0dFVFRJTUVPVVQ6CisKKwkJICAgICAgICBuZXdfdGltZW91dCA9IHRpbWVvdXQ7CisKKwkJCWlmICh1bml0ID09IFVOSVRfTUlOVVRFKQorCQkJICBuZXdfdGltZW91dCAqPSA2MDsKKworCQkJcmV0dXJuIHB1dF91c2VyKG5ld190aW1lb3V0LCB1YXJnLmkpOworCisJCWNhc2UgV0RJT0NfU0VUT1BUSU9OUzoKKwkJeworCQkJaW50IG9wdGlvbnMsIHJldHZhbCA9IC1FSU5WQUw7CisKKwkJCWlmIChnZXRfdXNlcihvcHRpb25zLCB1YXJnLmkpKQorCQkJCXJldHVybiAtRUZBVUxUOworCisJCQlpZiAob3B0aW9ucyAmIFdESU9TX0RJU0FCTEVDQVJEKSB7CisJCQkJd2Jfc21zY193ZHRfZGlzYWJsZSgpOworCQkJCXJldHZhbCA9IDA7CisJCQl9CisKKwkJCWlmIChvcHRpb25zICYgV0RJT1NfRU5BQkxFQ0FSRCkgeworCQkJCXdiX3Ntc2Nfd2R0X2VuYWJsZSgpOworCQkJCXJldHZhbCA9IDA7CisJCQl9CisKKwkJCXJldHVybiByZXR2YWw7CisJCX0KKwl9Cit9CisKKy8qIC0tIE5vdGlmaWVyIGZ1bnRpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworc3RhdGljIGludCB3Yl9zbXNjX3dkdF9ub3RpZnlfc3lzKHN0cnVjdCBub3RpZmllcl9ibG9jayAqdGhpcywgdW5zaWduZWQgbG9uZyBjb2RlLCB2b2lkICp1bnVzZWQpCit7CisJaWYgKGNvZGUgPT0gU1lTX0RPV04gfHwgY29kZSA9PSBTWVNfSEFMVCkKKwl7CisgICAgICAgICAgICAgICAgLy8gc2V0IHRpbWVvdXQgdG8gMCwgdG8gYXZvaWQgcG9zc2libGUgcmFjZS1jb25kaXRpb24KKwkgICAgICAgIHRpbWVvdXQgPSAwOworCQl3Yl9zbXNjX3dkdF9kaXNhYmxlKCk7CisJfQorCXJldHVybiBOT1RJRllfRE9ORTsKK30KKworLyogLS0gTW9kdWxlJ3Mgc3RydWN0dXJlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyB3Yl9zbXNjX3dkdF9mb3BzID0KK3sKKwkub3duZXIgICAgICAgICAgPSBUSElTX01PRFVMRSwKKwkubGxzZWVrCQk9IG5vX2xsc2VlaywKKwkud3JpdGUJCT0gd2Jfc21zY193ZHRfd3JpdGUsCisJLmlvY3RsCQk9IHdiX3Ntc2Nfd2R0X2lvY3RsLAorCS5vcGVuCQk9IHdiX3Ntc2Nfd2R0X29wZW4sCisJLnJlbGVhc2UJPSB3Yl9zbXNjX3dkdF9yZWxlYXNlLAorfTsKKworc3RhdGljIHN0cnVjdCBub3RpZmllcl9ibG9jayB3Yl9zbXNjX3dkdF9ub3RpZmllciA9Cit7CisJLm5vdGlmaWVyX2NhbGwgID0gd2Jfc21zY193ZHRfbm90aWZ5X3N5cywKK307CisKK3N0YXRpYyBzdHJ1Y3QgbWlzY2RldmljZSB3Yl9zbXNjX3dkdF9taXNjZGV2ID0KK3sKKwkubWlub3IJCT0gV0FUQ0hET0dfTUlOT1IsCisJLm5hbWUJCT0gIndhdGNoZG9nIiwKKwkuZm9wcwkJPSAmd2Jfc21zY193ZHRfZm9wcywKK307CisKKy8qIC0tIE1vZHVsZSBpbml0IGZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyogbW9kdWxlJ3MgImNvbnN0cnVjdG9yIiAqLworCitzdGF0aWMgaW50IF9faW5pdCB3Yl9zbXNjX3dkdF9pbml0KHZvaWQpCit7CisJaW50IHJldDsKKworCXNwaW5fbG9ja19pbml0KCZpb19sb2NrKTsKKworCXByaW50aygiU01zQyAzN0I3ODcgd2F0Y2hkb2cgY29tcG9uZW50IGRyaXZlciAiIFZFUlNJT04gIiBpbml0aWFsaXNpbmcuLi5cbiIpOworCisJaWYgKCFyZXF1ZXN0X3JlZ2lvbihJT1BPUlQsIElPUE9SVF9TSVpFLCAiU01zQyAzN0I3ODcgd2F0Y2hkb2ciKSkgeworCQlwcmludGsoS0VSTl9FUlIgTU9ETkFNRSAiVW5hYmxlIHRvIHJlZ2lzdGVyIElPIHBvcnQgJSN4XG4iLCBJT1BPUlQpOworCQlyZXQgPSAtRUJVU1k7CisJCWdvdG8gb3V0X3BucDsKKwl9CisKKyAgICAgICAgLy8gc2V0IG5ldyBtYXhpbXVtLCBpZiBpdCdzIHRvbyBiaWcKKyAgICAgICAgaWYgKHRpbWVvdXQgPiBNQVhfVElNRU9VVCkKKyAgICAgICAgICAgICAgIHRpbWVvdXQgPSBNQVhfVElNRU9VVDsKKworICAgICAgICAvLyBpbml0IHRoZSB3YXRjaGRvZyB0aW1lcgorICAgICAgICB3Yl9zbXNjX3dkdF9pbml0aWFsaXplKCk7CisKKwlyZXQgPSByZWdpc3Rlcl9yZWJvb3Rfbm90aWZpZXIoJndiX3Ntc2Nfd2R0X25vdGlmaWVyKTsKKwlpZiAocmV0KSB7CisJCXByaW50ayhLRVJOX0VSUiBNT0ROQU1FICJVbmFibGUgdG8gcmVnaXN0ZXIgcmVib290IG5vdGlmaWVyIGVyciA9ICVkXG4iLCByZXQpOworCQlnb3RvIG91dF9pbzsKKwl9CisKKwlyZXQgPSBtaXNjX3JlZ2lzdGVyKCZ3Yl9zbXNjX3dkdF9taXNjZGV2KTsKKwlpZiAocmV0KSB7CisJCXByaW50ayhLRVJOX0VSUiBNT0ROQU1FICJVbmFibGUgdG8gcmVnaXN0ZXIgbWlzY2RldiBvbiBtaW5vciAlZFxuIiwgV0FUQ0hET0dfTUlOT1IpOworCQlnb3RvIG91dF9yYnQ7CisJfQorCisJLy8gb3V0cHV0IGluZm8KKwlwcmludGsoS0VSTl9JTkZPIE1PRE5BTUUgIlRpbWVvdXQgc2V0IHRvICVkICVzLlxuIiwgdGltZW91dCwgKHVuaXQgPT0gVU5JVF9TRUNPTkQpID8gInNlY29uZChzKSIgOiAibWludXRlKHMpIik7CisJcHJpbnRrKEtFUk5fSU5GTyBNT0ROQU1FICJXYXRjaGRvZyBpbml0aWFsaXplZCBhbmQgc2xlZXBpbmcgKG5vd2F5b3V0PSVkKS4uLlxuIiwgbm93YXlvdXQpOworCisJLy8gcmV0ID0gMAorCitvdXRfY2xlYW46CisJcmV0dXJuIHJldDsKKworb3V0X3JidDoKKwl1bnJlZ2lzdGVyX3JlYm9vdF9ub3RpZmllcigmd2Jfc21zY193ZHRfbm90aWZpZXIpOworCitvdXRfaW86CisJcmVsZWFzZV9yZWdpb24oSU9QT1JULCBJT1BPUlRfU0laRSk7CisKK291dF9wbnA6CisJZ290byBvdXRfY2xlYW47Cit9CisKKy8qIG1vZHVsZSdzICJkZXN0cnVjdG9yIiAqLworCitzdGF0aWMgdm9pZCBfX2V4aXQgd2Jfc21zY193ZHRfZXhpdCh2b2lkKQoreworCS8qIFN0b3AgdGhlIHRpbWVyIGJlZm9yZSB3ZSBsZWF2ZSAqLworCWlmICghbm93YXlvdXQpCisJeworCQl3Yl9zbXNjX3dkdF9zaHV0ZG93bigpOworCQlwcmludGsoS0VSTl9JTkZPIE1PRE5BTUUgIldhdGNoZG9nIGRpc2FibGVkLlxuIik7CisJfQorCisJbWlzY19kZXJlZ2lzdGVyKCZ3Yl9zbXNjX3dkdF9taXNjZGV2KTsKKwl1bnJlZ2lzdGVyX3JlYm9vdF9ub3RpZmllcigmd2Jfc21zY193ZHRfbm90aWZpZXIpOworCXJlbGVhc2VfcmVnaW9uKElPUE9SVCwgSU9QT1JUX1NJWkUpOworCisJcHJpbnRrKCJTTXNDIDM3Qjc4NyB3YXRjaGRvZyBjb21wb25lbnQgZHJpdmVyIHJlbW92ZWQuXG4iKTsKK30KKworbW9kdWxlX2luaXQod2Jfc21zY193ZHRfaW5pdCk7Cittb2R1bGVfZXhpdCh3Yl9zbXNjX3dkdF9leGl0KTsKKworTU9EVUxFX0FVVEhPUigiU3ZlbiBBbmRlcnMgPGFuZGVyc0BhbmR1cmFzLmRlPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJEcml2ZXIgZm9yIFNNc0MgMzdCNzg3IHdhdGNoZG9nIGNvbXBvbmVudCAoVmVyc2lvbiAiIFZFUlNJT04gIikiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworTU9EVUxFX0FMSUFTX01JU0NERVYoV0FUQ0hET0dfTUlOT1IpOworCisjaWZkZWYgU01TQ19TVVBQT1JUX01JTlVURVMKK21vZHVsZV9wYXJhbSh1bml0LCBpbnQsIDApOworTU9EVUxFX1BBUk1fREVTQyh1bml0LCAic2V0IHVuaXQgdG8gdXNlLCAwPXNlY29uZHMgb3IgMT1taW51dGVzLCBkZWZhdWx0IGlzIDAiKTsKKyNlbmRpZgorCittb2R1bGVfcGFyYW0odGltZW91dCwgaW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0ModGltZW91dCwgInJhbmdlIGlzIDEtMjU1IHVuaXRzLCBkZWZhdWx0IGlzIDYwIik7CisKK21vZHVsZV9wYXJhbShub3dheW91dCwgaW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0Mobm93YXlvdXQsICJXYXRjaGRvZyBjYW5ub3QgYmUgc3RvcHBlZCBvbmNlIHN0YXJ0ZWQgKGRlZmF1bHQ9Q09ORklHX1dBVENIRE9HX05PV0FZT1VUKSIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL3dhdGNoZG9nL3c4MzYyN2hmX3dkdC5jIGIvZHJpdmVycy9jaGFyL3dhdGNoZG9nL3c4MzYyN2hmX3dkdC5jCmluZGV4IGI0YWRjNTIuLjA3ZDRiZmYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci93YXRjaGRvZy93ODM2MjdoZl93ZHQuYworKysgYi9kcml2ZXJzL2NoYXIvd2F0Y2hkb2cvdzgzNjI3aGZfd2R0LmMKQEAgLTMzLDYgKzMzLDcgQEAKICNpbmNsdWRlIDxsaW51eC9ub3RpZmllci5oPgogI2luY2x1ZGUgPGxpbnV4L3JlYm9vdC5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgogCiAjaW5jbHVkZSA8YXNtL2lvLmg+CiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KQEAgLTQ0LDYgKzQ1LDcgQEAKIAogc3RhdGljIHVuc2lnbmVkIGxvbmcgd2R0X2lzX29wZW47CiBzdGF0aWMgY2hhciBleHBlY3RfY2xvc2U7CitzdGF0aWMgc3BpbmxvY2tfdCBpb19sb2NrOwogCiAvKiBZb3UgbXVzdCBzZXQgdGhpcyAtIHRoZXJlIGlzIG5vIHNhbmUgd2F5IHRvIHByb2JlIGZvciB0aGlzIGJvYXJkLiAqLwogc3RhdGljIGludCB3ZHRfaW8gPSAweDJFOwpAQCAtMTEwLDEyICsxMTIsMTYgQEAKIHN0YXRpYyB2b2lkCiB3ZHRfY3RybChpbnQgdGltZW91dCkKIHsKKwlzcGluX2xvY2soJmlvX2xvY2spOworCQogCXc4MzYyN2hmX3NlbGVjdF93ZF9yZWdpc3RlcigpOwogCiAJb3V0Yl9wKDB4RjYsIFdEVF9FRkVSKTsgICAgLyogU2VsZWN0IENSRjYgKi8KIAlvdXRiX3AodGltZW91dCwgV0RUX0VGRFIpOyAvKiBXcml0ZSBUaW1lb3V0IGNvdW50ZXIgdG8gQ1JGNiAqLwogCiAJdzgzNjI3aGZfdW5zZWxlY3Rfd2RfcmVnaXN0ZXIoKTsKKworCXNwaW5fdW5sb2NrKCZpb19sb2NrKTsKIH0KIAogc3RhdGljIGludApAQCAtMzAzLDYgKzMwOSw4IEBACiB7CiAJaW50IHJldDsKIAorCXNwaW5fbG9ja19pbml0KCZpb19sb2NrKTsKKwogCXByaW50ayhLRVJOX0lORk8gIldEVCBkcml2ZXIgZm9yIHRoZSBXaW5ib25kKFRNKSBXODM2MjdIRiBTdXBlciBJL08gY2hpcCBpbml0aWFsaXNpbmcuXG4iKTsKIAogCWlmICh3ZHRfc2V0X2hlYXJ0YmVhdCh0aW1lb3V0KSkgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL3dhdGNoZG9nL3c4MzY5N2hmX3dkdC5jIGIvZHJpdmVycy9jaGFyL3dhdGNoZG9nL3c4MzY5N2hmX3dkdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc3NjhiNTUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvd2F0Y2hkb2cvdzgzNjk3aGZfd2R0LmMKQEAgLTAsMCArMSw0NTAgQEAKKy8qCisgKgl3ODM2OTdoZi9oZyBXRFQgZHJpdmVyCisgKgorICoJKGMpIENvcHlyaWdodCAyMDA2IFNhbXVlbCBUYXJkaWV1IDxzYW1AcmZjMTE0OS5uZXQ+CisgKgkoYykgQ29weXJpZ2h0IDIwMDYgTWFyY3VzIEp1bmtlciA8anVua2VyQGFuZHVyYXMuZGU+CisgKgorICoJQmFzZWQgb24gdzgzNjI3aGZfd2R0LmMgd2hpY2ggaXMgYmFzZWQgb24gYWR2YW50ZWNod2R0LmMKKyAqCXdoaWNoIGlzIGJhc2VkIG9uIHdkdC5jLgorICoJT3JpZ2luYWwgY29weXJpZ2h0IG1lc3NhZ2VzOgorICoKKyAqCShjKSBDb3B5cmlnaHQgMjAwMyBQ4WRyYWlnIEJyYWR5IDxQQGRyYWlnQnJhZHkuY29tPgorICoKKyAqCShjKSBDb3B5cmlnaHQgMjAwMC0yMDAxIE1hcmVrIE1pY2hhbGtpZXdpY3ogPG1hcmVrbUBsaW51eC5vcmcucGw+CisgKgorICoJKGMpIENvcHlyaWdodCAxOTk2IEFsYW4gQ294IDxhbGFuQHJlZGhhdC5jb20+LCBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoJCQkJaHR0cDovL3d3dy5yZWRoYXQuY29tCisgKgorICoJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICoJbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqCWFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICoJMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKglOZWl0aGVyIE1hcmN1cyBKdW5rZXIgbm9yIEFORFVSQVMgQUcgYWRtaXQgbGlhYmlsaXR5IG5vciBwcm92aWRlCisgKgl3YXJyYW50eSBmb3IgYW55IG9mIHRoaXMgc29mdHdhcmUuIFRoaXMgbWF0ZXJpYWwgaXMgcHJvdmlkZWQKKyAqCSJBUy1JUyIgYW5kIGF0IG5vIGNoYXJnZS4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L21pc2NkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC93YXRjaGRvZy5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvbm90aWZpZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9yZWJvb3QuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKworI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorCisjZGVmaW5lIFdBVENIRE9HX05BTUUgInc4MzY5N2hmL2hnIFdEVCIKKyNkZWZpbmUgUEZYIFdBVENIRE9HX05BTUUgIjogIgorI2RlZmluZSBXQVRDSERPR19USU1FT1VUIDYwCQkvKiA2MCBzZWMgZGVmYXVsdCB0aW1lb3V0ICovCisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIHdkdF9pc19vcGVuOworc3RhdGljIGNoYXIgZXhwZWN0X2Nsb3NlOworc3RhdGljIHNwaW5sb2NrX3QgaW9fbG9jazsKKworLyogWW91IG11c3Qgc2V0IHRoaXMgLSB0aGVyZSBpcyBubyBzYW5lIHdheSB0byBwcm9iZSBmb3IgdGhpcyBib2FyZC4gKi8KK3N0YXRpYyBpbnQgd2R0X2lvID0gMHgyZTsKK21vZHVsZV9wYXJhbSh3ZHRfaW8sIGludCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKHdkdF9pbywgInc4MzY5N2hmL2hnIFdEVCBpbyBwb3J0IChkZWZhdWx0IDB4MmUsIDAgPSBhdXRvZGV0ZWN0KSIpOworCitzdGF0aWMgaW50IHRpbWVvdXQgPSBXQVRDSERPR19USU1FT1VUOwkvKiBpbiBzZWNvbmRzICovCittb2R1bGVfcGFyYW0odGltZW91dCwgaW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0ModGltZW91dCwgIldhdGNoZG9nIHRpbWVvdXQgaW4gc2Vjb25kcy4gMTw9IHRpbWVvdXQgPD0yNTUsIGRlZmF1bHQ9IiBfX01PRFVMRV9TVFJJTkcoV0FUQ0hET0dfVElNRU9VVCkgIi4iKTsKKworc3RhdGljIGludCBub3dheW91dCA9IFdBVENIRE9HX05PV0FZT1VUOworbW9kdWxlX3BhcmFtKG5vd2F5b3V0LCBpbnQsIDApOworTU9EVUxFX1BBUk1fREVTQyhub3dheW91dCwgIldhdGNoZG9nIGNhbm5vdCBiZSBzdG9wcGVkIG9uY2Ugc3RhcnRlZCAoZGVmYXVsdD1DT05GSUdfV0FUQ0hET0dfTk9XQVlPVVQpIik7CisKKy8qCisgKglLZXJuZWwgbWV0aG9kcy4KKyAqLworCisjZGVmaW5lIFc4MzY5N0hGX0VGRVIgKHdkdF9pbyswKQkvKiBFeHRlbmRlZCBGdW5jdGlvbiBFbmFibGUgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgVzgzNjk3SEZfRUZJUiAod2R0X2lvKzApCS8qIEV4dGVuZGVkIEZ1bmN0aW9uIEluZGV4IFJlZ2lzdGVyIChzYW1lIGFzIEVGRVIpICovCisjZGVmaW5lIFc4MzY5N0hGX0VGRFIgKHdkdF9pbysxKQkvKiBFeHRlbmRlZCBGdW5jdGlvbiBEYXRhIFJlZ2lzdGVyICovCisKK3N0YXRpYyBpbmxpbmUgdm9pZAordzgzNjk3aGZfdW5sb2NrKHZvaWQpCit7CisJb3V0Yl9wKDB4ODcsIFc4MzY5N0hGX0VGRVIpOwkvKiBFbnRlciBleHRlbmRlZCBmdW5jdGlvbiBtb2RlICovCisJb3V0Yl9wKDB4ODcsIFc4MzY5N0hGX0VGRVIpOwkvKiBBZ2FpbiBhY2NvcmRpbmcgdG8gbWFudWFsICovCit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZAordzgzNjk3aGZfbG9jayh2b2lkKQoreworCW91dGJfcCgweEFBLCBXODM2OTdIRl9FRkVSKTsJLyogTGVhdmUgZXh0ZW5kZWQgZnVuY3Rpb24gbW9kZSAqLworfQorCisvKgorICoJVGhlIHRocmVlIGZ1bmN0aW9ucyB3ODM2OTdoZl9nZXRfcmVnKCksIHc4MzY5N2hmX3NldF9yZWcoKSBhbmQKKyAqCXc4MzY5N2hmX3dyaXRlX3RpbWVvdXQoKSBtdXN0IGJlIGNhbGxlZCB3aXRoIHRoZSBkZXZpY2UgdW5sb2NrZWQuCisgKi8KKworc3RhdGljIHVuc2lnbmVkIGNoYXIKK3c4MzY5N2hmX2dldF9yZWcodW5zaWduZWQgY2hhciByZWcpCit7CisJb3V0Yl9wKHJlZywgVzgzNjk3SEZfRUZJUik7CisJcmV0dXJuIGluYl9wKFc4MzY5N0hGX0VGRFIpOworfQorCitzdGF0aWMgdm9pZAordzgzNjk3aGZfc2V0X3JlZyh1bnNpZ25lZCBjaGFyIHJlZywgdW5zaWduZWQgY2hhciBkYXRhKQoreworCW91dGJfcChyZWcsIFc4MzY5N0hGX0VGSVIpOworCW91dGJfcChkYXRhLCBXODM2OTdIRl9FRkRSKTsKK30KKworc3RhdGljIHZvaWQKK3c4MzY5N2hmX3dyaXRlX3RpbWVvdXQoaW50IHRpbWVvdXQpCit7CisJdzgzNjk3aGZfc2V0X3JlZygweEY0LCB0aW1lb3V0KTsJLyogV3JpdGUgVGltZW91dCBjb3VudGVyIHRvIENSRjQgKi8KK30KKworc3RhdGljIHZvaWQKK3c4MzY5N2hmX3NlbGVjdF93ZHQodm9pZCkKK3sKKwl3ODM2OTdoZl91bmxvY2soKTsKKwl3ODM2OTdoZl9zZXRfcmVnKDB4MDcsIDB4MDgpOwkvKiBTd2l0Y2ggdG8gbG9naWMgZGV2aWNlIDggKEdQSU8yKSAqLworfQorCitzdGF0aWMgaW5saW5lIHZvaWQKK3c4MzY5N2hmX2Rlc2VsZWN0X3dkdCh2b2lkKQoreworCXc4MzY5N2hmX2xvY2soKTsKK30KKworc3RhdGljIHZvaWQKK3c4MzY5N2hmX2luaXQodm9pZCkKK3sKKwl1bnNpZ25lZCBjaGFyIGJidWY7CisKKwl3ODM2OTdoZl9zZWxlY3Rfd2R0KCk7CisKKwliYnVmID0gdzgzNjk3aGZfZ2V0X3JlZygweDI5KTsKKwliYnVmICY9IH4weDYwOworCWJidWYgfD0gMHgyMDsKKwl3ODM2OTdoZl9zZXRfcmVnKDB4MjksIGJidWYpOwkvKiBTZXQgcGluIDExOSB0byBXRFRPIyBtb2RlICg9IENSMjksIFdEVDApICovCisKKwliYnVmID0gdzgzNjk3aGZfZ2V0X3JlZygweEYzKTsKKwliYnVmICY9IH4weDA0OworCXc4MzY5N2hmX3NldF9yZWcoMHhGMywgYmJ1Zik7CS8qIENvdW50IG1vZGUgaXMgc2Vjb25kcyAqLworCisJdzgzNjk3aGZfZGVzZWxlY3Rfd2R0KCk7Cit9CisKK3N0YXRpYyBpbnQKK3dkdF9waW5nKHZvaWQpCit7CisJc3Bpbl9sb2NrKCZpb19sb2NrKTsKKwl3ODM2OTdoZl9zZWxlY3Rfd2R0KCk7CisKKwl3ODM2OTdoZl93cml0ZV90aW1lb3V0KHRpbWVvdXQpOworCisJdzgzNjk3aGZfZGVzZWxlY3Rfd2R0KCk7CisJc3Bpbl91bmxvY2soJmlvX2xvY2spOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50Cit3ZHRfZW5hYmxlKHZvaWQpCit7CisJc3Bpbl9sb2NrKCZpb19sb2NrKTsKKwl3ODM2OTdoZl9zZWxlY3Rfd2R0KCk7CisKKwl3ODM2OTdoZl93cml0ZV90aW1lb3V0KHRpbWVvdXQpOworCXc4MzY5N2hmX3NldF9yZWcoMHgzMCwgMSk7CS8qIEVuYWJsZSB0aW1lciAqLworCisJdzgzNjk3aGZfZGVzZWxlY3Rfd2R0KCk7CisJc3Bpbl91bmxvY2soJmlvX2xvY2spOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50Cit3ZHRfZGlzYWJsZSh2b2lkKQoreworCXNwaW5fbG9jaygmaW9fbG9jayk7CisJdzgzNjk3aGZfc2VsZWN0X3dkdCgpOworCisJdzgzNjk3aGZfc2V0X3JlZygweDMwLCAwKTsJLyogRGlzYWJsZSB0aW1lciAqLworCXc4MzY5N2hmX3dyaXRlX3RpbWVvdXQoMCk7CisKKwl3ODM2OTdoZl9kZXNlbGVjdF93ZHQoKTsKKwlzcGluX3VubG9jaygmaW9fbG9jayk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK3dkdF9zZXRfaGVhcnRiZWF0KGludCB0KQoreworCWlmICgodCA8IDEpIHx8ICh0ID4gMjU1KSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwl0aW1lb3V0ID0gdDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHNzaXplX3QKK3dkdF93cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKmJ1Ziwgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCit7CisJaWYgKGNvdW50KSB7CisJCWlmICghbm93YXlvdXQpIHsKKwkJCXNpemVfdCBpOworCisJCQlleHBlY3RfY2xvc2UgPSAwOworCisJCQlmb3IgKGkgPSAwOyBpICE9IGNvdW50OyBpKyspIHsKKwkJCQljaGFyIGM7CisJCQkJaWYgKGdldF91c2VyKGMsIGJ1ZitpKSkKKwkJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQkJaWYgKGMgPT0gJ1YnKQorCQkJCQlleHBlY3RfY2xvc2UgPSA0MjsKKwkJCX0KKwkJfQorCQl3ZHRfcGluZygpOworCX0KKwlyZXR1cm4gY291bnQ7Cit9CisKK3N0YXRpYyBpbnQKK3dkdF9pb2N0bChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgaW50IGNtZCwKKwkgIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCXZvaWQgX191c2VyICphcmdwID0gKHZvaWQgX191c2VyICopYXJnOworCWludCBfX3VzZXIgKnAgPSBhcmdwOworCWludCBuZXdfdGltZW91dDsKKwlzdGF0aWMgc3RydWN0IHdhdGNoZG9nX2luZm8gaWRlbnQgPSB7CisJCS5vcHRpb25zID0gV0RJT0ZfS0VFUEFMSVZFUElORyB8IFdESU9GX1NFVFRJTUVPVVQgfCBXRElPRl9NQUdJQ0NMT1NFLAorCQkuZmlybXdhcmVfdmVyc2lvbiA9IDEsCisJCS5pZGVudGl0eSA9ICJXODM2OTdIRiBXRFQiLAorCX07CisKKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgV0RJT0NfR0VUU1VQUE9SVDoKKwkJaWYgKGNvcHlfdG9fdXNlcihhcmdwLCAmaWRlbnQsIHNpemVvZihpZGVudCkpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCWJyZWFrOworCisJY2FzZSBXRElPQ19HRVRTVEFUVVM6CisJY2FzZSBXRElPQ19HRVRCT09UU1RBVFVTOgorCQlyZXR1cm4gcHV0X3VzZXIoMCwgcCk7CisKKwljYXNlIFdESU9DX0tFRVBBTElWRToKKwkJd2R0X3BpbmcoKTsKKwkJYnJlYWs7CisKKwljYXNlIFdESU9DX1NFVFRJTUVPVVQ6CisJCWlmIChnZXRfdXNlcihuZXdfdGltZW91dCwgcCkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJaWYgKHdkdF9zZXRfaGVhcnRiZWF0KG5ld190aW1lb3V0KSkKKwkJCXJldHVybiAtRUlOVkFMOworCQl3ZHRfcGluZygpOworCQkvKiBGYWxsICovCisKKwljYXNlIFdESU9DX0dFVFRJTUVPVVQ6CisJCXJldHVybiBwdXRfdXNlcih0aW1lb3V0LCBwKTsKKworCWNhc2UgV0RJT0NfU0VUT1BUSU9OUzoKKwl7CisJCWludCBvcHRpb25zLCByZXR2YWwgPSAtRUlOVkFMOworCisJCWlmIChnZXRfdXNlcihvcHRpb25zLCBwKSkKKwkJCXJldHVybiAtRUZBVUxUOworCisJCWlmIChvcHRpb25zICYgV0RJT1NfRElTQUJMRUNBUkQpIHsKKwkJCXdkdF9kaXNhYmxlKCk7CisJCQlyZXR2YWwgPSAwOworCQl9CisKKwkJaWYgKG9wdGlvbnMgJiBXRElPU19FTkFCTEVDQVJEKSB7CisJCQl3ZHRfZW5hYmxlKCk7CisJCQlyZXR2YWwgPSAwOworCQl9CisKKwkJcmV0dXJuIHJldHZhbDsKKwl9CisKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVOT1RUWTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK3dkdF9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCWlmICh0ZXN0X2FuZF9zZXRfYml0KDAsICZ3ZHRfaXNfb3BlbikpCisJCXJldHVybiAtRUJVU1k7CisJLyoKKwkgKglBY3RpdmF0ZQorCSAqLworCisJd2R0X2VuYWJsZSgpOworCXJldHVybiBub25zZWVrYWJsZV9vcGVuKGlub2RlLCBmaWxlKTsKK30KKworc3RhdGljIGludAord2R0X2Nsb3NlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCWlmIChleHBlY3RfY2xvc2UgPT0gNDIpIHsKKwkJd2R0X2Rpc2FibGUoKTsKKwl9IGVsc2UgeworCQlwcmludGsgKEtFUk5fQ1JJVCBQRlggIlVuZXhwZWN0ZWQgY2xvc2UsIG5vdCBzdG9wcGluZyB3YXRjaGRvZyFcbiIpOworCQl3ZHRfcGluZygpOworCX0KKwlleHBlY3RfY2xvc2UgPSAwOworCWNsZWFyX2JpdCgwLCAmd2R0X2lzX29wZW4pOworCXJldHVybiAwOworfQorCisvKgorICoJTm90aWZpZXIgZm9yIHN5c3RlbSBkb3duCisgKi8KKworc3RhdGljIGludAord2R0X25vdGlmeV9zeXMoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICp0aGlzLCB1bnNpZ25lZCBsb25nIGNvZGUsCisJdm9pZCAqdW51c2VkKQoreworCWlmIChjb2RlID09IFNZU19ET1dOIHx8IGNvZGUgPT0gU1lTX0hBTFQpIHsKKwkJLyogVHVybiB0aGUgV0RUIG9mZiAqLworCQl3ZHRfZGlzYWJsZSgpOworCX0KKwlyZXR1cm4gTk9USUZZX0RPTkU7Cit9CisKKy8qCisgKglLZXJuZWwgSW50ZXJmYWNlcworICovCisKK3N0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHdkdF9mb3BzID0geworCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwkubGxzZWVrCQk9IG5vX2xsc2VlaywKKwkud3JpdGUJCT0gd2R0X3dyaXRlLAorCS5pb2N0bAkJPSB3ZHRfaW9jdGwsCisJLm9wZW4JCT0gd2R0X29wZW4sCisJLnJlbGVhc2UJPSB3ZHRfY2xvc2UsCit9OworCitzdGF0aWMgc3RydWN0IG1pc2NkZXZpY2Ugd2R0X21pc2NkZXYgPSB7CisJLm1pbm9yID0gV0FUQ0hET0dfTUlOT1IsCisJLm5hbWUgPSAid2F0Y2hkb2ciLAorCS5mb3BzID0gJndkdF9mb3BzLAorfTsKKworLyoKKyAqCVRoZSBXRFQgbmVlZHMgdG8gbGVhcm4gYWJvdXQgc29mdCBzaHV0ZG93bnMgaW4gb3JkZXIgdG8KKyAqCXR1cm4gdGhlIHRpbWVib21iIHJlZ2lzdGVycyBvZmYuCisgKi8KKworc3RhdGljIHN0cnVjdCBub3RpZmllcl9ibG9jayB3ZHRfbm90aWZpZXIgPSB7CisJLm5vdGlmaWVyX2NhbGwgPSB3ZHRfbm90aWZ5X3N5cywKK307CisKK3N0YXRpYyBpbnQKK3c4MzY5N2hmX2NoZWNrX3dkdCh2b2lkKQoreworCWlmICghcmVxdWVzdF9yZWdpb24od2R0X2lvLCAyLCBXQVRDSERPR19OQU1FKSkgeworCQlwcmludGsgKEtFUk5fRVJSIFBGWCAiSS9PIGFkZHJlc3MgMHgleCBhbHJlYWR5IGluIHVzZVxuIiwgd2R0X2lvKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCisJcHJpbnRrIChLRVJOX0RFQlVHIFBGWCAiTG9va2luZyBmb3Igd2F0Y2hkb2cgYXQgYWRkcmVzcyAweCV4XG4iLCB3ZHRfaW8pOworCXc4MzY5N2hmX3VubG9jaygpOworCWlmICh3ODM2OTdoZl9nZXRfcmVnKDB4MjApID09IDB4NjApIHsKKwkJcHJpbnRrIChLRVJOX0lORk8gUEZYICJ3YXRjaGRvZyBmb3VuZCBhdCBhZGRyZXNzIDB4JXhcbiIsIHdkdF9pbyk7CisJCXc4MzY5N2hmX2xvY2soKTsKKwkJcmV0dXJuIDA7CisJfQorCXc4MzY5N2hmX2xvY2soKTsJLyogUmVwcm90ZWN0IGluIGNhc2UgaXQgd2FzIGEgY29tcGF0aWJsZSBkZXZpY2UgKi8KKworCXByaW50ayAoS0VSTl9JTkZPIFBGWCAid2F0Y2hkb2cgbm90IGZvdW5kIGF0IGFkZHJlc3MgMHgleFxuIiwgd2R0X2lvKTsKKwlyZWxlYXNlX3JlZ2lvbih3ZHRfaW8sIDIpOworCXJldHVybiAtRUlPOworfQorCitzdGF0aWMgaW50IHc4MzY5N2hmX2lvcG9ydHNbXSA9IHsgMHgyZSwgMHg0ZSwgMHgwMCB9OworCitzdGF0aWMgaW50IF9faW5pdAord2R0X2luaXQodm9pZCkKK3sKKwlpbnQgcmV0LCBpLCBmb3VuZCA9IDA7CisKKwlzcGluX2xvY2tfaW5pdCgmaW9fbG9jayk7CisKKwlwcmludGsgKEtFUk5fSU5GTyBQRlggIldEVCBkcml2ZXIgZm9yIFc4MzY5N0hGL0hHIGluaXRpYWxpemluZ1xuIik7CisKKwlpZiAod2R0X2lvID09IDApIHsKKwkJLyogd2Ugd2lsbCBhdXRvZGV0ZWN0IHRoZSBXODM2OTdIRi9IRyB3YXRjaGRvZyAqLworCQlmb3IgKGkgPSAwOyAoKCFmb3VuZCkgJiYgKHc4MzY5N2hmX2lvcG9ydHNbaV0gIT0gMCkpOyBpKyspIHsKKwkJCXdkdF9pbyA9IHc4MzY5N2hmX2lvcG9ydHNbaV07CisJCQlpZiAoIXc4MzY5N2hmX2NoZWNrX3dkdCgpKQorCQkJCWZvdW5kKys7CisJCX0KKwl9IGVsc2UgeworCQlpZiAoIXc4MzY5N2hmX2NoZWNrX3dkdCgpKQorCQkJZm91bmQrKzsKKwl9CisKKwlpZiAoIWZvdW5kKSB7CisJCXByaW50ayAoS0VSTl9FUlIgUEZYICJObyBXODM2OTdIRi9IRyBjb3VsZCBiZSBmb3VuZFxuIik7CisJCXJldCA9IC1FSU87CisJCWdvdG8gb3V0OworCX0KKworCXc4MzY5N2hmX2luaXQoKTsKKwl3ZHRfZGlzYWJsZSgpOwkvKiBEaXNhYmxlIHdhdGNoZG9nIHVudGlsIGZpcnN0IHVzZSAqLworCisJaWYgKHdkdF9zZXRfaGVhcnRiZWF0KHRpbWVvdXQpKSB7CisJCXdkdF9zZXRfaGVhcnRiZWF0KFdBVENIRE9HX1RJTUVPVVQpOworCQlwcmludGsgKEtFUk5fSU5GTyBQRlggInRpbWVvdXQgdmFsdWUgbXVzdCBiZSAxPD10aW1lb3V0PD0yNTUsIHVzaW5nICVkXG4iLAorCQkJV0FUQ0hET0dfVElNRU9VVCk7CisJfQorCisJcmV0ID0gcmVnaXN0ZXJfcmVib290X25vdGlmaWVyKCZ3ZHRfbm90aWZpZXIpOworCWlmIChyZXQgIT0gMCkgeworCQlwcmludGsgKEtFUk5fRVJSIFBGWCAiY2Fubm90IHJlZ2lzdGVyIHJlYm9vdCBub3RpZmllciAoZXJyPSVkKVxuIiwKKwkJCXJldCk7CisJCWdvdG8gdW5yZWdfcmVnaW9uczsKKwl9CisKKwlyZXQgPSBtaXNjX3JlZ2lzdGVyKCZ3ZHRfbWlzY2Rldik7CisJaWYgKHJldCAhPSAwKSB7CisJCXByaW50ayAoS0VSTl9FUlIgUEZYICJjYW5ub3QgcmVnaXN0ZXIgbWlzY2RldiBvbiBtaW5vcj0lZCAoZXJyPSVkKVxuIiwKKwkJCVdBVENIRE9HX01JTk9SLCByZXQpOworCQlnb3RvIHVucmVnX3JlYm9vdDsKKwl9CisKKwlwcmludGsgKEtFUk5fSU5GTyBQRlggImluaXRpYWxpemVkLiB0aW1lb3V0PSVkIHNlYyAobm93YXlvdXQ9JWQpXG4iLAorCQl0aW1lb3V0LCBub3dheW91dCk7CisKK291dDoKKwlyZXR1cm4gcmV0OwordW5yZWdfcmVib290OgorCXVucmVnaXN0ZXJfcmVib290X25vdGlmaWVyKCZ3ZHRfbm90aWZpZXIpOwordW5yZWdfcmVnaW9uczoKKwlyZWxlYXNlX3JlZ2lvbih3ZHRfaW8sIDIpOworCWdvdG8gb3V0OworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQKK3dkdF9leGl0KHZvaWQpCit7CisJbWlzY19kZXJlZ2lzdGVyKCZ3ZHRfbWlzY2Rldik7CisJdW5yZWdpc3Rlcl9yZWJvb3Rfbm90aWZpZXIoJndkdF9ub3RpZmllcik7CisJcmVsZWFzZV9yZWdpb24od2R0X2lvLCAyKTsKK30KKworbW9kdWxlX2luaXQod2R0X2luaXQpOworbW9kdWxlX2V4aXQod2R0X2V4aXQpOworCitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfQVVUSE9SKCJNYXJjdXMgSnVua2VyIDxqdW5rZXJAYW5kdXJhcy5kZT4sIFNhbXVlbCBUYXJkaWV1IDxzYW1AcmZjMTE0OS5uZXQ+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oInc4MzY5N2hmL2hnIFdEVCBkcml2ZXIiKTsKK01PRFVMRV9BTElBU19NSVNDREVWKFdBVENIRE9HX01JTk9SKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2xvY2tzb3VyY2UvYWNwaV9wbS5jIGIvZHJpdmVycy9jbG9ja3NvdXJjZS9hY3BpX3BtLmMKaW5kZXggN2FkM2JlOC4uN2ZjYjc3YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9jbG9ja3NvdXJjZS9hY3BpX3BtLmMKKysrIGIvZHJpdmVycy9jbG9ja3NvdXJjZS9hY3BpX3BtLmMKQEAgLTU0LDggKzU0LDggQEAKIAkJdjEgPSByZWFkX3BtdG1yKCk7CiAJCXYyID0gcmVhZF9wbXRtcigpOwogCQl2MyA9IHJlYWRfcG10bXIoKTsKLQl9IHdoaWxlICgodjEgPiB2MiAmJiB2MSA8IHYzKSB8fCAodjIgPiB2MyAmJiB2MiA8IHYxKQotCQkJfHwgKHYzID4gdjEgJiYgdjMgPCB2MikpOworCX0gd2hpbGUgKHVubGlrZWx5KCh2MSA+IHYyICYmIHYxIDwgdjMpIHx8ICh2MiA+IHYzICYmIHYyIDwgdjEpCisJCQkgIHx8ICh2MyA+IHYxICYmIHYzIDwgdjIpKSk7CiAKIAlyZXR1cm4gKGN5Y2xlX3QpdjI7CiB9CkBAIC0xMzgsNiArMTM4LDggQEAKIH0KIERFQ0xBUkVfUENJX0ZJWFVQX0VBUkxZKFBDSV9WRU5ET1JfSURfSU5URUwsIFBDSV9ERVZJQ0VfSURfSU5URUxfODI4MDFEQl8wLAogCQkJYWNwaV9wbV9jaGVja19ncmF5bGlzdCk7CitERUNMQVJFX1BDSV9GSVhVUF9FQVJMWShQQ0lfVkVORE9SX0lEX1NFUlZFUldPUktTLCBQQ0lfREVWSUNFX0lEX1NFUlZFUldPUktTX0xFLAorCQkJYWNwaV9wbV9jaGVja19ncmF5bGlzdCk7CiAjZW5kaWYKIAogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NwdWZyZXEvS2NvbmZpZyBiL2RyaXZlcnMvY3B1ZnJlcS9LY29uZmlnCmluZGV4IDJjYzcxYjYuLjQ5MTc3OWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY3B1ZnJlcS9LY29uZmlnCisrKyBiL2RyaXZlcnMvY3B1ZnJlcS9LY29uZmlnCkBAIC0xMDcsNiArMTA3LDcgQEAKIAogY29uZmlnIENQVV9GUkVRX0dPVl9PTkRFTUFORAogCXRyaXN0YXRlICInb25kZW1hbmQnIGNwdWZyZXEgcG9saWN5IGdvdmVybm9yIgorCXNlbGVjdCBDUFVfRlJFUV9UQUJMRQogCWhlbHAKIAkgICdvbmRlbWFuZCcgLSBUaGlzIGRyaXZlciBhZGRzIGEgZHluYW1pYyBjcHVmcmVxIHBvbGljeSBnb3Zlcm5vci4KIAkgIFRoZSBnb3Zlcm5vciBkb2VzIGEgcGVyaW9kaWMgcG9sbGluZyBhbmQgCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NwdWZyZXEvY3B1ZnJlcS5jIGIvZHJpdmVycy9jcHVmcmVxL2NwdWZyZXEuYwppbmRleCA4NmU2OWI3Li5kZDBjMjYyIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NwdWZyZXEvY3B1ZnJlcS5jCisrKyBiL2RyaXZlcnMvY3B1ZnJlcS9jcHVmcmVxLmMKQEAgLTU5LDcgKzU5LDcgQEAKIAlzcmN1X2luaXRfbm90aWZpZXJfaGVhZCgmY3B1ZnJlcV90cmFuc2l0aW9uX25vdGlmaWVyX2xpc3QpOwogCXJldHVybiAwOwogfQotY29yZV9pbml0Y2FsbChpbml0X2NwdWZyZXFfdHJhbnNpdGlvbl9ub3RpZmllcl9saXN0KTsKK3B1cmVfaW5pdGNhbGwoaW5pdF9jcHVmcmVxX3RyYW5zaXRpb25fbm90aWZpZXJfbGlzdCk7CiAKIHN0YXRpYyBMSVNUX0hFQUQoY3B1ZnJlcV9nb3Zlcm5vcl9saXN0KTsKIHN0YXRpYyBERUZJTkVfTVVURVggKGNwdWZyZXFfZ292ZXJub3JfbXV0ZXgpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9lZGFjL2VkYWNfbWMuYyBiL2RyaXZlcnMvZWRhYy9lZGFjX21jLmMKaW5kZXggNGJkZTMwYi4uNzVlOWUzOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9lZGFjL2VkYWNfbWMuYworKysgYi9kcml2ZXJzL2VkYWMvZWRhY19tYy5jCkBAIC0yMzAsMzQgKzIzMCw0MyBAQAogICovCiBzdGF0aWMgaW50IGVkYWNfc3lzZnNfbWVtY3RybF9zZXR1cCh2b2lkKQogewotCWludCBlcnI9MDsKKwlpbnQgZXJyID0gMDsKIAogCWRlYnVnZjEoIiVzKClcbiIsIF9fZnVuY19fKTsKIAogCS8qIGNyZWF0ZSB0aGUgL3N5cy9kZXZpY2VzL3N5c3RlbS9lZGFjIGRpcmVjdG9yeSAqLwogCWVyciA9IHN5c2Rldl9jbGFzc19yZWdpc3RlcigmZWRhY19jbGFzcyk7CiAKLQlpZiAoIWVycikgewotCQkvKiBJbml0IHRoZSBNQydzIGtvYmplY3QgKi8KLQkJbWVtc2V0KCZlZGFjX21lbWN0cmxfa29iaiwgMCwgc2l6ZW9mIChlZGFjX21lbWN0cmxfa29iaikpOwotCQllZGFjX21lbWN0cmxfa29iai5wYXJlbnQgPSAmZWRhY19jbGFzcy5rc2V0LmtvYmo7Ci0JCWVkYWNfbWVtY3RybF9rb2JqLmt0eXBlID0gJmt0eXBlX21lbWN0cmw7Ci0KLQkJLyogZ2VuZXJhdGUgc3lzZnMgIi4uLi4vZWRhYy9tYyIgICAqLwotCQllcnIgPSBrb2JqZWN0X3NldF9uYW1lKCZlZGFjX21lbWN0cmxfa29iaiwibWMiKTsKLQotCQlpZiAoIWVycikgewotCQkJLyogRklYTUU6IG1heWJlIG5ldyBzeXNkZXZfY3JlYXRlX3N1YmRpcigpICovCi0JCQllcnIgPSBrb2JqZWN0X3JlZ2lzdGVyKCZlZGFjX21lbWN0cmxfa29iaik7Ci0KLQkJCWlmIChlcnIpCi0JCQkJZGVidWdmMSgiRmFpbGVkIHRvIHJlZ2lzdGVyICcuLi4vZWRhYy9tYydcbiIpOwotCQkJZWxzZQotCQkJCWRlYnVnZjEoIlJlZ2lzdGVyZWQgJy4uLi9lZGFjL21jJyBrb2JqZWN0XG4iKTsKLQkJfQotCX0gZWxzZQorCWlmIChlcnIpIHsKIAkJZGVidWdmMSgiJXMoKSBlcnJvcj0lZFxuIiwgX19mdW5jX18sIGVycik7CisJCXJldHVybiBlcnI7CisJfQogCisJLyogSW5pdCB0aGUgTUMncyBrb2JqZWN0ICovCisJbWVtc2V0KCZlZGFjX21lbWN0cmxfa29iaiwgMCwgc2l6ZW9mIChlZGFjX21lbWN0cmxfa29iaikpOworCWVkYWNfbWVtY3RybF9rb2JqLnBhcmVudCA9ICZlZGFjX2NsYXNzLmtzZXQua29iajsKKwllZGFjX21lbWN0cmxfa29iai5rdHlwZSA9ICZrdHlwZV9tZW1jdHJsOworCisJLyogZ2VuZXJhdGUgc3lzZnMgIi4uLi4vZWRhYy9tYyIgICAqLworCWVyciA9IGtvYmplY3Rfc2V0X25hbWUoJmVkYWNfbWVtY3RybF9rb2JqLCJtYyIpOworCisJaWYgKGVycikKKwkJZ290byBmYWlsOworCisJLyogRklYTUU6IG1heWJlIG5ldyBzeXNkZXZfY3JlYXRlX3N1YmRpcigpICovCisJZXJyID0ga29iamVjdF9yZWdpc3RlcigmZWRhY19tZW1jdHJsX2tvYmopOworCisJaWYgKGVycikgeworCQlkZWJ1Z2YxKCJGYWlsZWQgdG8gcmVnaXN0ZXIgJy4uLi9lZGFjL21jJ1xuIik7CisJCWdvdG8gZmFpbDsKKwl9CisKKwlkZWJ1Z2YxKCJSZWdpc3RlcmVkICcuLi4vZWRhYy9tYycga29iamVjdFxuIik7CisKKwlyZXR1cm4gMDsKKworZmFpbDoKKwlzeXNkZXZfY2xhc3NfdW5yZWdpc3RlcigmZWRhY19jbGFzcyk7CiAJcmV0dXJuIGVycjsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9laXNhL2Vpc2EtYnVzLmMgYi9kcml2ZXJzL2Vpc2EvZWlzYS1idXMuYwppbmRleCAzYTM2NWUxLi5kOTQ0NjQ3IDEwMDY0NAotLS0gYS9kcml2ZXJzL2Vpc2EvZWlzYS1idXMuYworKysgYi9kcml2ZXJzL2Vpc2EvZWlzYS1idXMuYwpAQCAtMjI2LDE0ICsyMjYsMjYgQEAKIAogc3RhdGljIGludCBfX2luaXQgZWlzYV9yZWdpc3Rlcl9kZXZpY2UgKHN0cnVjdCBlaXNhX2RldmljZSAqZWRldikKIHsKLQlpZiAoZGV2aWNlX3JlZ2lzdGVyICgmZWRldi0+ZGV2KSkKLQkJcmV0dXJuIC0xOworCWludCByYyA9IGRldmljZV9yZWdpc3RlciAoJmVkZXYtPmRldik7CisJaWYgKHJjKQorCQlyZXR1cm4gcmM7CiAKLQlkZXZpY2VfY3JlYXRlX2ZpbGUgKCZlZGV2LT5kZXYsICZkZXZfYXR0cl9zaWduYXR1cmUpOwotCWRldmljZV9jcmVhdGVfZmlsZSAoJmVkZXYtPmRldiwgJmRldl9hdHRyX2VuYWJsZWQpOwotCWRldmljZV9jcmVhdGVfZmlsZSAoJmVkZXYtPmRldiwgJmRldl9hdHRyX21vZGFsaWFzKTsKKwlyYyA9IGRldmljZV9jcmVhdGVfZmlsZSAoJmVkZXYtPmRldiwgJmRldl9hdHRyX3NpZ25hdHVyZSk7CisJaWYgKHJjKSBnb3RvIGVycl9kZXZyZWc7CisJcmMgPSBkZXZpY2VfY3JlYXRlX2ZpbGUgKCZlZGV2LT5kZXYsICZkZXZfYXR0cl9lbmFibGVkKTsKKwlpZiAocmMpIGdvdG8gZXJyX3NpZzsKKwlyYyA9IGRldmljZV9jcmVhdGVfZmlsZSAoJmVkZXYtPmRldiwgJmRldl9hdHRyX21vZGFsaWFzKTsKKwlpZiAocmMpIGdvdG8gZXJyX2VuYWI7CiAKIAlyZXR1cm4gMDsKKworZXJyX2VuYWI6CisJZGV2aWNlX3JlbW92ZV9maWxlICgmZWRldi0+ZGV2LCAmZGV2X2F0dHJfZW5hYmxlZCk7CitlcnJfc2lnOgorCWRldmljZV9yZW1vdmVfZmlsZSAoJmVkZXYtPmRldiwgJmRldl9hdHRyX3NpZ25hdHVyZSk7CitlcnJfZGV2cmVnOgorCWRldmljZV91bnJlZ2lzdGVyKCZlZGV2LT5kZXYpOworCXJldHVybiByYzsKIH0KIAogc3RhdGljIGludCBfX2luaXQgZWlzYV9yZXF1ZXN0X3Jlc291cmNlcyAoc3RydWN0IGVpc2Ffcm9vdF9kZXZpY2UgKnJvb3QsCmRpZmYgLS1naXQgYS9kcml2ZXJzL2ZjNC9mYy5jIGIvZHJpdmVycy9mYzQvZmMuYwppbmRleCAyMmQxNzQ3Li5jYTRlNjdhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2ZjNC9mYy5jCisrKyBiL2RyaXZlcnMvZmM0L2ZjLmMKQEAgLTcwLDkgKzcwLDkgQEAKIAogI2RlZmluZSBGQ1BfQ01ORChTQ3BudCkgKChmY3BfY21uZCAqKSYoU0NwbnQtPlNDcCkpCiAjZGVmaW5lIEZDX1NDTU5EKFNDcG50KSAoKGZjX2NoYW5uZWwgKikoU0NwbnQtPmRldmljZS0+aG9zdC0+aG9zdGRhdGFbMF0pKQotI2RlZmluZSBTQ19GQ01ORChmY21uZCkgKChTY3NpX0NtbmQgKikoKGxvbmcpZmNtbmQgLSAobG9uZykmKCgoU2NzaV9DbW5kICopMCktPlNDcCkpKQorI2RlZmluZSBTQ19GQ01ORChmY21uZCkJKChzdHJ1Y3Qgc2NzaV9jbW5kICopKChsb25nKWZjbW5kIC0gKGxvbmcpJigoKHN0cnVjdCBzY3NpX2NtbmQgKikwKS0+U0NwKSkpCiAKLXN0YXRpYyBpbnQgZmNwX3Njc2lfcXVldWVfaXQoZmNfY2hhbm5lbCAqLCBTY3NpX0NtbmQgKiwgZmNwX2NtbmQgKiwgaW50KTsKK3N0YXRpYyBpbnQgZmNwX3Njc2lfcXVldWVfaXQoZmNfY2hhbm5lbCAqLCBzdHJ1Y3Qgc2NzaV9jbW5kICosIGZjcF9jbW5kICosIGludCk7CiB2b2lkIGZjcF9xdWV1ZV9lbXB0eShmY19jaGFubmVsICopOwogCiBzdGF0aWMgdm9pZCBmY3Bfc2NzaV9pbnNlcnRfcXVldWUgKGZjX2NoYW5uZWwgKmZjLCBmY3BfY21uZCAqZmNtZCkKQEAgLTM3OCwxNCArMzc4LDE0IEBACiAJCXByaW50ayAoIkZDOiAlc2VnaXN0ZXJpbmcgdW5rbm93biB0eXBlICUwMnhcbiIsIHVucmVnaXN0ZXIgPyAiVW5yIiA6ICJSIiwgdHlwZSk7CiB9CiAKLXN0YXRpYyB2b2lkIGZjcF9zY3NpX2RvbmUoU2NzaV9DbW5kICpTQ3BudCk7CitzdGF0aWMgdm9pZCBmY3Bfc2NzaV9kb25lKHN0cnVjdCBzY3NpX2NtbmQgKlNDcG50KTsKIAogc3RhdGljIGlubGluZSB2b2lkIGZjcF9zY3NpX3JlY2VpdmUoZmNfY2hhbm5lbCAqZmMsIGludCB0b2tlbiwgaW50IHN0YXR1cywgZmNfaGRyICpmY2gpCiB7CiAJZmNwX2NtbmQgKmZjbWQ7CiAJZmNwX3JzcCAgKnJzcDsKIAlpbnQgaG9zdF9zdGF0dXM7Ci0JU2NzaV9DbW5kICpTQ3BudDsKKwlzdHJ1Y3Qgc2NzaV9jbW5kICpTQ3BudDsKIAlpbnQgc2Vuc2VfbGVuOwogCWludCByc3Bfc3RhdHVzOwogCkBAIC03NTcsMTMgKzc1NywxNCBAQAogfQogCiAKLXN0YXRpYyB2b2lkIGZjcF9zY3NpX2RvbmUgKFNjc2lfQ21uZCAqU0NwbnQpCitzdGF0aWMgdm9pZCBmY3Bfc2NzaV9kb25lKHN0cnVjdCBzY3NpX2NtbmQgKlNDcG50KQogewogCWlmIChGQ1BfQ01ORChTQ3BudCktPmRvbmUpCiAJCUZDUF9DTU5EKFNDcG50KS0+ZG9uZShTQ3BudCk7CiB9CiAKLXN0YXRpYyBpbnQgZmNwX3Njc2lfcXVldWVfaXQoZmNfY2hhbm5lbCAqZmMsIFNjc2lfQ21uZCAqU0NwbnQsIGZjcF9jbW5kICpmY21kLCBpbnQgcHJlcGFyZSkKK3N0YXRpYyBpbnQgZmNwX3Njc2lfcXVldWVfaXQoZmNfY2hhbm5lbCAqZmMsIHN0cnVjdCBzY3NpX2NtbmQgKlNDcG50LAorCQkJICAgICBmY3BfY21uZCAqZmNtZCwgaW50IHByZXBhcmUpCiB7CiAJbG9uZyBpOwogCWZjcF9jbWQgKmNtZDsKQEAgLTgzNyw3ICs4MzgsOCBAQAogCXJldHVybiAwOwogfQogCi1pbnQgZmNwX3Njc2lfcXVldWVjb21tYW5kKFNjc2lfQ21uZCAqU0NwbnQsIHZvaWQgKCogZG9uZSkoU2NzaV9DbW5kICopKQoraW50IGZjcF9zY3NpX3F1ZXVlY29tbWFuZChzdHJ1Y3Qgc2NzaV9jbW5kICpTQ3BudCwKKwkJCSAgdm9pZCAoKiBkb25lKShzdHJ1Y3Qgc2NzaV9jbW5kICopKQogewogCWZjcF9jbW5kICpmY21kID0gRkNQX0NNTkQoU0NwbnQpOwogCWZjX2NoYW5uZWwgKmZjID0gRkNfU0NNTkQoU0NwbnQpOwpAQCAtODczLDcgKzg3NSw3IEBACiAJfQogfQogCi1pbnQgZmNwX3Njc2lfYWJvcnQoU2NzaV9DbW5kICpTQ3BudCkKK2ludCBmY3Bfc2NzaV9hYm9ydChzdHJ1Y3Qgc2NzaV9jbW5kICpTQ3BudCkKIHsKIAkvKiBJbnRlcm5hbCBib29ra2VlcGluZyBvbmx5LiBMb3NlIDEgY21kX3Nsb3RzIHNsb3QuICovCiAJZmNwX2NtbmQgKmZjbWQgPSBGQ1BfQ01ORChTQ3BudCk7CkBAIC05MTAsNyArOTEyLDcgQEAKIH0KIAogI2lmIDAKLXZvaWQgZmNwX3Njc2lfcmVzZXRfZG9uZShTY3NpX0NtbmQgKlNDcG50KQordm9pZCBmY3Bfc2NzaV9yZXNldF9kb25lKHN0cnVjdCBzY3NpX2NtbmQgKlNDcG50KQogewogCWZjX2NoYW5uZWwgKmZjID0gRkNfU0NNTkQoU0NwbnQpOwogCkBAIC05MjEsNyArOTIzLDcgQEAKIAogI2RlZmluZSBGQ1BfUkVTRVRfVElNRU9VVCAoMipIWikKIAotaW50IGZjcF9zY3NpX2Rldl9yZXNldChTY3NpX0NtbmQgKlNDcG50KQoraW50IGZjcF9zY3NpX2Rldl9yZXNldChzdHJ1Y3Qgc2NzaV9jbW5kICpTQ3BudCkKIHsKICNpZiAwIC8qIGJyb2tlbiBqdW5rLCBidXQgaWYgZGF2ZW0gd2FudHMgdG8gY29tcGlsZSB0aGlzIGRyaXZlciwgbGV0IGhpbS4uICovCiAJdW5zaWduZWQgbG9uZyBmbGFnczsKQEAgLTkzMSw3ICs5MzMsNyBAQAogICAgICAgICBERUNMQVJFX01VVEVYX0xPQ0tFRChzZW0pOwogCiAJaWYgKCFmYy0+cnN0X3BrdCkgewotCQlmYy0+cnN0X3BrdCA9IChTY3NpX0NtbmQgKikga21hbGxvYyhzaXplb2YoU0NwbnQpLCBHRlBfS0VSTkVMKTsKKwkJZmMtPnJzdF9wa3QgPSAoc3RydWN0IHNjc2lfY21uZCAqKSBrbWFsbG9jKHNpemVvZihTQ3BudCksIEdGUF9LRVJORUwpOwogCQlpZiAoIWZjLT5yc3RfcGt0KSByZXR1cm4gRkFJTEVEOwogCQkKIAkJZmNtZCA9IEZDUF9DTU5EKGZjLT5yc3RfcGt0KTsKQEAgLTk5OSw3ICsxMDAxLDcgQEAKIAlyZXR1cm4gU1VDQ0VTUzsKIH0KIAotc3RhdGljIGludCBfX2ZjcF9zY3NpX2hvc3RfcmVzZXQoU2NzaV9DbW5kICpTQ3BudCkKK3N0YXRpYyBpbnQgX19mY3Bfc2NzaV9ob3N0X3Jlc2V0KHN0cnVjdCBzY3NpX2NtbmQgKlNDcG50KQogewogCWZjX2NoYW5uZWwgKmZjID0gRkNfU0NNTkQoU0NwbnQpOwogCWZjcF9jbW5kICpmY21kID0gRkNQX0NNTkQoU0NwbnQpOwpAQCAtMTAyMCw3ICsxMDIyLDcgQEAKIAllbHNlIHJldHVybiBGQUlMRUQ7CiB9CiAKLWludCBmY3Bfc2NzaV9ob3N0X3Jlc2V0KFNjc2lfQ21uZCAqU0NwbnQpCitpbnQgZmNwX3Njc2lfaG9zdF9yZXNldChzdHJ1Y3Qgc2NzaV9jbW5kICpTQ3BudCkKIHsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCWludCByYzsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZmM0L2ZjcF9pbXBsLmggYi9kcml2ZXJzL2ZjNC9mY3BfaW1wbC5oCmluZGV4IGMzOTdjODQuLjFhYzYxMzMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZmM0L2ZjcF9pbXBsLmgKKysrIGIvZHJpdmVycy9mYzQvZmNwX2ltcGwuaApAQCAtMzksNyArMzksNyBAQAogdHlwZWRlZiBzdHJ1Y3QgZmNwX2NtbmQgewogCXN0cnVjdCBmY3BfY21uZAkJKm5leHQ7CiAJc3RydWN0IGZjcF9jbW5kCQkqcHJldjsKLQl2b2lkCQkJKCpkb25lKShTY3NpX0NtbmQgKik7CisJdm9pZAkJCSgqZG9uZSkoc3RydWN0IHNjc2lfY21uZCAqKTsKIAl1bnNpZ25lZCBzaG9ydAkJcHJvdG87CiAJdW5zaWduZWQgc2hvcnQJCXRva2VuOwogCXVuc2lnbmVkIGludAkJZGlkOwpAQCAtOTQsMTQgKzk0LDE0IEBACiAJbG9uZwkJCSpzY3NpX2JpdG1hcDsKIAlsb25nCQkJc2NzaV9iaXRtYXBfZW5kOwogCWludAkJCXNjc2lfZnJlZTsKLQlpbnQJCQkoKmVuY29kZV9hZGRyKShTY3NpX0NtbmQgKiwgdTE2ICosIHN0cnVjdCBfZmNfY2hhbm5lbCAqLCBmY3BfY21uZCAqKTsKKwlpbnQJCQkoKmVuY29kZV9hZGRyKShzdHJ1Y3Qgc2NzaV9jbW5kICosIHUxNiAqLCBzdHJ1Y3QgX2ZjX2NoYW5uZWwgKiwgZmNwX2NtbmQgKik7CiAJZmNwX2NtbmQJCSpzY3NpX3F1ZTsKIAljaGFyCQkJc2NzaV9uYW1lWzRdOwogCWZjcF9jbW5kCQkqKmNtZF9zbG90czsKIAlpbnQJCQljaGFubmVsczsKIAlpbnQJCQl0YXJnZXRzOwogCWxvbmcJCQkqYWdlczsKLQlTY3NpX0NtbmQJCSpyc3RfcGt0OworCXN0cnVjdCBzY3NpX2NtbmQJKnJzdF9wa3Q7CiAJZmNwX3Bvc21hcAkJKnBvc21hcDsKIAkvKiBMT0dJTiBzdHVmZiAqLwogCWZjcF9jbW5kCQkqbG9naW47CkBAIC0xNTUsOSArMTU1LDEwIEBACiAJZm9yX2VhY2hfZmNfY2hhbm5lbChmYykJCQkJXAogCQlpZiAoZmMtPnN0YXRlID09IEZDX1NUQVRFX09OTElORSkKIAotaW50IGZjcF9zY3NpX3F1ZXVlY29tbWFuZChTY3NpX0NtbmQgKiwgdm9pZCAoKiBkb25lKShTY3NpX0NtbmQgKikpOwotaW50IGZjcF9zY3NpX2Fib3J0KFNjc2lfQ21uZCAqKTsKLWludCBmY3Bfc2NzaV9kZXZfcmVzZXQoU2NzaV9DbW5kICopOwotaW50IGZjcF9zY3NpX2hvc3RfcmVzZXQoU2NzaV9DbW5kICopOworaW50IGZjcF9zY3NpX3F1ZXVlY29tbWFuZChzdHJ1Y3Qgc2NzaV9jbW5kICosCisJCQkgIHZvaWQgKCogZG9uZSkgKHN0cnVjdCBzY3NpX2NtbmQgKikpOworaW50IGZjcF9zY3NpX2Fib3J0KHN0cnVjdCBzY3NpX2NtbmQgKik7CitpbnQgZmNwX3Njc2lfZGV2X3Jlc2V0KHN0cnVjdCBzY3NpX2NtbmQgKik7CitpbnQgZmNwX3Njc2lfaG9zdF9yZXNldChzdHJ1Y3Qgc2NzaV9jbW5kICopOwogCiAjZW5kaWYgLyogIShfRkNQX1NDU0lfSCkgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZmlybXdhcmUvZGNkYmFzLmMgYi9kcml2ZXJzL2Zpcm13YXJlL2RjZGJhcy5jCmluZGV4IDhiY2I1OGMuLjE4NjViNTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZmlybXdhcmUvZGNkYmFzLmMKKysrIGIvZHJpdmVycy9maXJtd2FyZS9kY2RiYXMuYwpAQCAtOCw3ICs4LDcgQEAKICAqCiAgKiAgU2VlIERvY3VtZW50YXRpb24vZGNkYmFzLnR4dCBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KICAqCi0gKiAgQ29weXJpZ2h0IChDKSAxOTk1LTIwMDUgRGVsbCBJbmMuCisgKiAgQ29weXJpZ2h0IChDKSAxOTk1LTIwMDYgRGVsbCBJbmMuCiAgKgogICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiAgKiAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2Mi4wIGFzIHB1Ymxpc2hlZCBieQpAQCAtNDAsNyArNDAsNyBAQAogI2luY2x1ZGUgImRjZGJhcy5oIgogCiAjZGVmaW5lIERSSVZFUl9OQU1FCQkiZGNkYmFzIgotI2RlZmluZSBEUklWRVJfVkVSU0lPTgkJIjUuNi4wLTIiCisjZGVmaW5lIERSSVZFUl9WRVJTSU9OCQkiNS42LjAtMy4yIgogI2RlZmluZSBEUklWRVJfREVTQ1JJUFRJT04JIkRlbGwgU3lzdGVtcyBNYW5hZ2VtZW50IEJhc2UgRHJpdmVyIgogCiBzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSAqZGNkYmFzX3BkZXY7CkBAIC0xNzUsNiArMTc1LDkgQEAKIHsKIAlzc2l6ZV90IHJldDsKIAorCWlmICgocG9zICsgY291bnQpID4gTUFYX1NNSV9EQVRBX0JVRl9TSVpFKQorCQlyZXR1cm4gLUVJTlZBTDsKKwogCW11dGV4X2xvY2soJnNtaV9kYXRhX2xvY2spOwogCiAJcmV0ID0gc21pX2RhdGFfYnVmX3JlYWxsb2MocG9zICsgY291bnQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9maXJtd2FyZS9kZWxsX3JidS5jIGIvZHJpdmVycy9maXJtd2FyZS9kZWxsX3JidS5jCmluZGV4IGZjMTc1OTkuLmZjNzAyZTQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZmlybXdhcmUvZGVsbF9yYnUuYworKysgYi9kcml2ZXJzL2Zpcm13YXJlL2RlbGxfcmJ1LmMKQEAgLTI0OSw3ICsyNDksNyBAQAogCQlpZiAoKHJjID0gY3JlYXRlX3BhY2tldCh0ZW1wLCBwYWNrZXRfbGVuZ3RoKSkpCiAJCQlyZXR1cm4gcmM7CiAKLQkJcHJfZGVidWcoIiVwOiVsdVxuIiwgdGVtcCwgKGVuZCAtIHRlbXApKTsKKwkJcHJfZGVidWcoIiVwOiV0ZFxuIiwgdGVtcCwgKGVuZCAtIHRlbXApKTsKIAkJdGVtcCArPSBwYWNrZXRfbGVuZ3RoOwogCX0KIApAQCAtNzA1LDI3ICs3MDUsMzkgQEAKIAogc3RhdGljIGludCBfX2luaXQgZGNkcmJ1X2luaXQodm9pZCkKIHsKLQlpbnQgcmMgPSAwOworCWludCByYzsKIAlzcGluX2xvY2tfaW5pdCgmcmJ1X2RhdGEubG9jayk7CiAKIAlpbml0X3BhY2tldF9oZWFkKCk7Ci0JcmJ1X2RldmljZSA9Ci0JCXBsYXRmb3JtX2RldmljZV9yZWdpc3Rlcl9zaW1wbGUoImRlbGxfcmJ1IiwgLTEsIE5VTEwsIDApOwotCWlmICghcmJ1X2RldmljZSkgeworCXJidV9kZXZpY2UgPSBwbGF0Zm9ybV9kZXZpY2VfcmVnaXN0ZXJfc2ltcGxlKCJkZWxsX3JidSIsIC0xLCBOVUxMLCAwKTsKKwlpZiAoSVNfRVJSKHJidV9kZXZpY2UpKSB7CiAJCXByaW50ayhLRVJOX0VSUgogCQkJImRlbGxfcmJ1OiVzOnBsYXRmb3JtX2RldmljZV9yZWdpc3Rlcl9zaW1wbGUgIgogCQkJImZhaWxlZFxuIiwgX19GVU5DVElPTl9fKTsKLQkJcmV0dXJuIC1FSU87CisJCXJldHVybiBQVFJfRVJSKHJidV9kZXZpY2UpOwogCX0KIAotCXN5c2ZzX2NyZWF0ZV9iaW5fZmlsZSgmcmJ1X2RldmljZS0+ZGV2LmtvYmosICZyYnVfZGF0YV9hdHRyKTsKLQlzeXNmc19jcmVhdGVfYmluX2ZpbGUoJnJidV9kZXZpY2UtPmRldi5rb2JqLCAmcmJ1X2ltYWdlX3R5cGVfYXR0cik7Ci0Jc3lzZnNfY3JlYXRlX2Jpbl9maWxlKCZyYnVfZGV2aWNlLT5kZXYua29iaiwKKwlyYyA9IHN5c2ZzX2NyZWF0ZV9iaW5fZmlsZSgmcmJ1X2RldmljZS0+ZGV2LmtvYmosICZyYnVfZGF0YV9hdHRyKTsKKwlpZiAocmMpCisJCWdvdG8gb3V0X2RldnJlZzsKKwlyYyA9IHN5c2ZzX2NyZWF0ZV9iaW5fZmlsZSgmcmJ1X2RldmljZS0+ZGV2LmtvYmosICZyYnVfaW1hZ2VfdHlwZV9hdHRyKTsKKwlpZiAocmMpCisJCWdvdG8gb3V0X2RhdGE7CisJcmMgPSBzeXNmc19jcmVhdGVfYmluX2ZpbGUoJnJidV9kZXZpY2UtPmRldi5rb2JqLAogCQkmcmJ1X3BhY2tldF9zaXplX2F0dHIpOworCWlmIChyYykKKwkJZ290byBvdXRfaW10eXBlOwogCiAJcmJ1X2RhdGEuZW50cnlfY3JlYXRlZCA9IDA7Ci0JcmV0dXJuIHJjOworCXJldHVybiAwOwogCitvdXRfaW10eXBlOgorCXN5c2ZzX3JlbW92ZV9iaW5fZmlsZSgmcmJ1X2RldmljZS0+ZGV2LmtvYmosICZyYnVfaW1hZ2VfdHlwZV9hdHRyKTsKK291dF9kYXRhOgorCXN5c2ZzX3JlbW92ZV9iaW5fZmlsZSgmcmJ1X2RldmljZS0+ZGV2LmtvYmosICZyYnVfZGF0YV9hdHRyKTsKK291dF9kZXZyZWc6CisJcGxhdGZvcm1fZGV2aWNlX3VucmVnaXN0ZXIocmJ1X2RldmljZSk7CisJcmV0dXJuIHJjOwogfQogCiBzdGF0aWMgX19leGl0IHZvaWQgZGNkcmJ1X2V4aXQodm9pZCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZmlybXdhcmUvZG1pX3NjYW4uYyBiL2RyaXZlcnMvZmlybXdhcmUvZG1pX3NjYW4uYwppbmRleCBiOGI1OTZkLi4zN2RlZWU2IDEwMDY0NAotLS0gYS9kcml2ZXJzL2Zpcm13YXJlL2RtaV9zY2FuLmMKKysrIGIvZHJpdmVycy9maXJtd2FyZS9kbWlfc2Nhbi5jCkBAIC0zMjYsNiArMzI2LDI2IEBACiB9CiBFWFBPUlRfU1lNQk9MKGRtaV9nZXRfc3lzdGVtX2luZm8pOwogCisKKy8qKgorICoJZG1pX25hbWVfaW5fdmVuZG9ycyAtIENoZWNrIGlmIHN0cmluZyBpcyBhbnl3aGVyZSBpbiB0aGUgRE1JIHZlbmRvciBpbmZvcm1hdGlvbi4KKyAqCUBzdHI6IAlDYXNlIHNlbnNpdGl2ZSBOYW1lCisgKi8KK2ludCBkbWlfbmFtZV9pbl92ZW5kb3JzKGNoYXIgKnN0cikKK3sKKwlzdGF0aWMgaW50IGZpZWxkc1tdID0geyBETUlfQklPU19WRU5ET1IsIERNSV9CSU9TX1ZFUlNJT04sIERNSV9TWVNfVkVORE9SLAorCQkJCURNSV9QUk9EVUNUX05BTUUsIERNSV9QUk9EVUNUX1ZFUlNJT04sIERNSV9CT0FSRF9WRU5ET1IsCisJCQkJRE1JX0JPQVJEX05BTUUsIERNSV9CT0FSRF9WRVJTSU9OLCBETUlfTk9ORSB9OworCWludCBpOworCWZvciAoaSA9IDA7IGZpZWxkc1tpXSAhPSBETUlfTk9ORTsgaSsrKSB7CisJCWludCBmID0gZmllbGRzW2ldOworCQlpZiAoZG1pX2lkZW50W2ZdICYmIHN0cnN0cihkbWlfaWRlbnRbZl0sIHN0cikpCisJCQlyZXR1cm4gMTsKKwl9CisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MKGRtaV9uYW1lX2luX3ZlbmRvcnMpOworCiAvKioKICAqCWRtaV9maW5kX2RldmljZSAtIGZpbmQgb25ib2FyZCBkZXZpY2UgYnkgdHlwZS9uYW1lCiAgKglAdHlwZTogZGV2aWNlIHR5cGUgb3IgJURNSV9ERVZfVFlQRV9BTlkgdG8gbWF0Y2ggYWxsIGRldmljZSB0eXBlcwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9maXJtd2FyZS9lZml2YXJzLmMgYi9kcml2ZXJzL2Zpcm13YXJlL2VmaXZhcnMuYwppbmRleCA4ZWJjZTFjMDMuLjVhYjVlMzkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZmlybXdhcmUvZWZpdmFycy5jCisrKyBiL2RyaXZlcnMvZmlybXdhcmUvZWZpdmFycy5jCkBAIC02MzksNyArNjM5LDEyIEBACiAKIAlrb2JqZWN0X3NldF9uYW1lKCZuZXdfZWZpdmFyLT5rb2JqLCAiJXMiLCBzaG9ydF9uYW1lKTsKIAlrb2JqX3NldF9rc2V0X3MobmV3X2VmaXZhciwgdmFyc19zdWJzeXMpOwotCWtvYmplY3RfcmVnaXN0ZXIoJm5ld19lZml2YXItPmtvYmopOworCWkgPSBrb2JqZWN0X3JlZ2lzdGVyKCZuZXdfZWZpdmFyLT5rb2JqKTsKKwlpZiAoaSkgeworCQlrZnJlZShzaG9ydF9uYW1lKTsKKwkJa2ZyZWUobmV3X2VmaXZhcik7CisJCXJldHVybiAxOworCX0KIAogCWtmcmVlKHNob3J0X25hbWUpOwogCXNob3J0X25hbWUgPSBOVUxMOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9od21vbi9LY29uZmlnIGIvZHJpdmVycy9od21vbi9LY29uZmlnCmluZGV4IDliODhiMjUuLmU3NmQ5MTkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaHdtb24vS2NvbmZpZworKysgYi9kcml2ZXJzL2h3bW9uL0tjb25maWcKQEAgLTk1LDExICs5NSwxMyBAQAogCSAgd2lsbCBiZSBjYWxsZWQgYWRtOTI0MC4KIAogY29uZmlnIFNFTlNPUlNfSzhURU1QCi0JdHJpc3RhdGUgIkFNRCBLOCBwcm9jZXNzb3Igc2Vuc29yIgorCXRyaXN0YXRlICJBTUQgQXRobG9uNjQvRlggb3IgT3B0ZXJvbiB0ZW1wZXJhdHVyZSBzZW5zb3IiCiAJZGVwZW5kcyBvbiBIV01PTiAmJiBYODYgJiYgUENJICYmIEVYUEVSSU1FTlRBTAogCWhlbHAKIAkgIElmIHlvdSBzYXkgeWVzIGhlcmUgeW91IGdldCBzdXBwb3J0IGZvciB0aGUgdGVtcGVyYXR1cmUKLQkgIHNlbnNvcihzKSBpbnNpZGUgeW91ciBBTUQgSzggQ1BVLgorCSAgc2Vuc29yKHMpIGluc2lkZSB5b3VyIENQVS4gU3VwcG9ydGVkIGlzIHdob2xlIEFNRCBLOAorCSAgbWljcm9hcmNoaXRlY3R1cmUuIFBsZWFzZSBub3RlIHRoYXQgeW91IHdpbGwgbmVlZCBhdCBsZWFzdAorCSAgbG0tc2Vuc29ycyAyLjEwLjEgZm9yIHByb3BlciB1c2Vyc3BhY2Ugc3VwcG9ydC4KIAogCSAgVGhpcyBkcml2ZXIgY2FuIGFsc28gYmUgYnVpbHQgYXMgYSBtb2R1bGUuICBJZiBzbywgdGhlIG1vZHVsZQogCSAgd2lsbCBiZSBjYWxsZWQgazh0ZW1wLgpAQCAtMzY5LDggKzM3MSw4IEBACiAJaGVscAogCSAgSWYgeW91IHNheSB5ZXMgaGVyZSB5b3UgZ2V0IHN1cHBvcnQgZm9yIHRoZSBpbnRlZ3JhdGVkIGZhbgogCSAgbW9uaXRvcmluZyBhbmQgY29udHJvbCBjYXBhYmlsaXRpZXMgb2YgdGhlIFNNU0MgTFBDNDdCMjd4LAotCSAgTFBDNDdNMTB4LCBMUEM0N00xM3gsIExQQzQ3TTE0eCwgTFBDNDdNMTV4LCBMUEM0N00xOTIgYW5kCi0JICBMUEM0N005OTcgY2hpcHMuCisJICBMUEM0N00xMHgsIExQQzQ3TTExMiwgTFBDNDdNMTN4LCBMUEM0N00xNHgsIExQQzQ3TTE1eCwKKwkgIExQQzQ3TTE5MiBhbmQgTFBDNDdNOTk3IGNoaXBzLgogCiAJICBUaGUgdGVtcGVyYXR1cmUgYW5kIHZvbHRhZ2Ugc2Vuc29yIGZlYXR1cmVzIG9mIHRoZSBMUEM0N00xOTIKIAkgIGFuZCBMUEM0N005OTcgYXJlIHN1cHBvcnRlZCBieSBhbm90aGVyIGRyaXZlciwgc2VsZWN0IGFsc28KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaHdtb24vYWRtOTI0MC5jIGIvZHJpdmVycy9od21vbi9hZG05MjQwLmMKaW5kZXggMzc3OTYxYy4uYWFkNTk0YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9od21vbi9hZG05MjQwLmMKKysrIGIvZHJpdmVycy9od21vbi9hZG05MjQwLmMKQEAgLTUsNyArNSw3IEBACiAgKiBDb3B5cmlnaHQgKEMpIDE5OTkJRnJvZG8gTG9vaWphYXJkIDxmcm9kb2xAZGRzLm5sPgogICoJCQlQaGlsaXAgRWRlbGJyb2NrIDxwaGlsQG5ldHJvZWRnZS5jb20+CiAgKiBDb3B5cmlnaHQgKEMpIDIwMDMJTWljaGllbCBSb29rIDxtaWNoaWVsQGdyZW5kZWxwcm9qZWN0Lm5sPgotICogQ29weXJpZ2h0IChDKSAyMDA1CUdyYW50IENvYWR5IDxnY29hZHlAZ21haWwuY29tPiB3aXRoIHZhbHVhYmxlCisgKiBDb3B5cmlnaHQgKEMpIDIwMDUJR3JhbnQgQ29hZHkgPGdjb2FkeS5sa0BnbWFpbC5jb20+IHdpdGggdmFsdWFibGUKICAqIAkJCQlndWlkYW5jZSBmcm9tIEplYW4gRGVsdmFyZQogICoKICAqIERyaXZlciBzdXBwb3J0cwlBbmFsb2cgRGV2aWNlcwkJQURNOTI0MApAQCAtNzc0LDcgKzc3NCw3IEBACiB9CiAKIE1PRFVMRV9BVVRIT1IoIk1pY2hpZWwgUm9vayA8bWljaGllbEBncmVuZGVscHJvamVjdC5ubD4sICIKLQkJIkdyYW50IENvYWR5IDxnY29hZHlAZ21haWwuY29tPiBhbmQgb3RoZXJzIik7CisJCSJHcmFudCBDb2FkeSA8Z2NvYWR5LmxrQGdtYWlsLmNvbT4gYW5kIG90aGVycyIpOwogTU9EVUxFX0RFU0NSSVBUSU9OKCJBRE05MjQwL0RTMTc4MC9MTTgxIGRyaXZlciIpOwogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2h3bW9uL2xtNzguYyBiL2RyaXZlcnMvaHdtb24vbG03OC5jCmluZGV4IGFjMWI3NDYuLjczYmMyZmYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaHdtb24vbG03OC5jCisrKyBiL2RyaXZlcnMvaHdtb24vbG03OC5jCkBAIC04MTUsMTggKzgxNSwxOCBAQAogCWlmIChyZXMpCiAJCXJldHVybiByZXM7CiAKLQlyZXMgPSBpMmNfaXNhX2FkZF9kcml2ZXIoJmxtNzhfaXNhX2RyaXZlcik7Ci0JaWYgKHJlcykgewotCQlpMmNfZGVsX2RyaXZlcigmbG03OF9kcml2ZXIpOwotCQlyZXR1cm4gcmVzOwotCX0KKwkvKiBEb24ndCBleGl0IGlmIHRoaXMgb25lIGZhaWxzLCB3ZSBzdGlsbCB3YW50IHRoZSBJMkMgdmFyaWFudHMKKwkgICB0byB3b3JrISAqLworCWlmIChpMmNfaXNhX2FkZF9kcml2ZXIoJmxtNzhfaXNhX2RyaXZlcikpCisJCWlzYV9hZGRyZXNzID0gMDsKIAogCXJldHVybiAwOwogfQogCiBzdGF0aWMgdm9pZCBfX2V4aXQgc21fbG03OF9leGl0KHZvaWQpCiB7Ci0JaTJjX2lzYV9kZWxfZHJpdmVyKCZsbTc4X2lzYV9kcml2ZXIpOworCWlmIChpc2FfYWRkcmVzcykKKwkJaTJjX2lzYV9kZWxfZHJpdmVyKCZsbTc4X2lzYV9kcml2ZXIpOwogCWkyY19kZWxfZHJpdmVyKCZsbTc4X2RyaXZlcik7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaHdtb24vc21zYzQ3bTEuYyBiL2RyaXZlcnMvaHdtb24vc21zYzQ3bTEuYwppbmRleCA0NzEzMmZkLi5iZWI4ODFjIDEwMDY0NAotLS0gYS9kcml2ZXJzL2h3bW9uL3Ntc2M0N20xLmMKKysrIGIvZHJpdmVycy9od21vbi9zbXNjNDdtMS5jCkBAIC0yLDggKzIsOCBAQAogICAgIHNtc2M0N20xLmMgLSBQYXJ0IG9mIGxtX3NlbnNvcnMsIExpbnV4IGtlcm5lbCBtb2R1bGVzCiAgICAgICAgICAgICAgICAgIGZvciBoYXJkd2FyZSBtb25pdG9yaW5nCiAKLSAgICBTdXBwb3J0cyB0aGUgU01TQyBMUEM0N0IyN3gsIExQQzQ3TTEweCwgTFBDNDdNMTN4LCBMUEM0N00xNHgsCi0gICAgTFBDNDdNMTV4LCBMUEM0N00xOTIgYW5kIExQQzQ3TTk5NyBTdXBlci1JL08gY2hpcHMuCisgICAgU3VwcG9ydHMgdGhlIFNNU0MgTFBDNDdCMjd4LCBMUEM0N00xMHgsIExQQzQ3TTExMiwgTFBDNDdNMTN4LAorICAgIExQQzQ3TTE0eCwgTFBDNDdNMTV4LCBMUEM0N00xOTIgYW5kIExQQzQ3TTk5NyBTdXBlci1JL08gY2hpcHMuCiAKICAgICBDb3B5cmlnaHQgKEMpIDIwMDIgTWFyayBELiBTdHVkZWJha2VyIDxtZHN4eXoxMjNAeWFob28uY29tPgogICAgIENvcHlyaWdodCAoQykgMjAwNCBKZWFuIERlbHZhcmUgPGtoYWxpQGxpbnV4LWZyLm9yZz4KQEAgLTM4MCw4ICszODAsOCBAQAogCXZhbCA9IHN1cGVyaW9faW5iKFNVUEVSSU9fUkVHX0RFVklEKTsKIAogCS8qCi0JICogU01TQyBMUEM0N00xMHgvTFBDNDdNMTN4IChkZXZpY2UgaWQgMHg1OSksIExQQzQ3TTE0eCAoZGV2aWNlIGlkCi0JICogMHg1RikgYW5kIExQQzQ3QjI3eCAoZGV2aWNlIGlkIDB4NTEpIGhhdmUgZmFuIGNvbnRyb2wuCisJICogU01TQyBMUEM0N00xMHgvTFBDNDdNMTEyL0xQQzQ3TTEzeCAoZGV2aWNlIGlkIDB4NTkpLCBMUEM0N00xNHgKKwkgKiAoZGV2aWNlIGlkIDB4NUYpIGFuZCBMUEM0N0IyN3ggKGRldmljZSBpZCAweDUxKSBoYXZlIGZhbiBjb250cm9sLgogCSAqIFRoZSBMUEM0N00xNXggYW5kIExQQzQ3TTE5MiBjaGlwcyAid2l0aCBoYXJkd2FyZSBtb25pdG9yaW5nIGJsb2NrIgogCSAqIGNhbiBkbyBtdWNoIG1vcmUgYmVzaWRlcyAoZGV2aWNlIGlkIDB4NjApLgogCSAqIFRoZSBMUEM0N005OTcgaXMgdW5kb2N1bWVudGVkLCBidXQgc2VlbXMgdG8gYmUgY29tcGF0aWJsZSB3aXRoCkBAIC0zOTAsNyArMzkwLDggQEAKIAlpZiAodmFsID09IDB4NTEpCiAJCXByaW50ayhLRVJOX0lORk8gInNtc2M0N20xOiBGb3VuZCBTTVNDIExQQzQ3QjI3eFxuIik7CiAJZWxzZSBpZiAodmFsID09IDB4NTkpCi0JCXByaW50ayhLRVJOX0lORk8gInNtc2M0N20xOiBGb3VuZCBTTVNDIExQQzQ3TTEweC9MUEM0N00xM3hcbiIpOworCQlwcmludGsoS0VSTl9JTkZPICJzbXNjNDdtMTogRm91bmQgU01TQyAiCisJCSAgICAgICAiTFBDNDdNMTB4L0xQQzQ3TTExMi9MUEM0N00xM3hcbiIpOwogCWVsc2UgaWYgKHZhbCA9PSAweDVGKQogCQlwcmludGsoS0VSTl9JTkZPICJzbXNjNDdtMTogRm91bmQgU01TQyBMUEM0N00xNHhcbiIpOwogCWVsc2UgaWYgKHZhbCA9PSAweDYwKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9od21vbi93ODM2MjdlaGYuYyBiL2RyaXZlcnMvaHdtb24vdzgzNjI3ZWhmLmMKaW5kZXggODMzZmFhMi4uMjI1NzgwNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9od21vbi93ODM2MjdlaGYuYworKysgYi9kcml2ZXJzL2h3bW9uL3c4MzYyN2VoZi5jCkBAIC0zNTQsNiArMzU0LDggQEAKIAljYXNlIDA6CiAJCXJlZyA9ICh3ODM2MjdlaGZfcmVhZF92YWx1ZShjbGllbnQsIFc4MzYyN0VIRl9SRUdfRkFORElWMSkgJiAweGNmKQogCQkgICAgfCAoKGRhdGEtPmZhbl9kaXZbMF0gJiAweDAzKSA8PCA0KTsKKwkJLyogZmFuNSBpbnB1dCBjb250cm9sIGJpdCBpcyB3cml0ZSBvbmx5LCBjb21wdXRlIHRoZSB2YWx1ZSAqLworCQlyZWcgfD0gKGRhdGEtPmhhc19mYW4gJiAoMSA8PCA0KSkgPyAxIDogMDsKIAkJdzgzNjI3ZWhmX3dyaXRlX3ZhbHVlKGNsaWVudCwgVzgzNjI3RUhGX1JFR19GQU5ESVYxLCByZWcpOwogCQlyZWcgPSAodzgzNjI3ZWhmX3JlYWRfdmFsdWUoY2xpZW50LCBXODM2MjdFSEZfUkVHX1ZCQVQpICYgMHhkZikKIAkJICAgIHwgKChkYXRhLT5mYW5fZGl2WzBdICYgMHgwNCkgPDwgMyk7CkBAIC0zNjIsNiArMzY0LDggQEAKIAljYXNlIDE6CiAJCXJlZyA9ICh3ODM2MjdlaGZfcmVhZF92YWx1ZShjbGllbnQsIFc4MzYyN0VIRl9SRUdfRkFORElWMSkgJiAweDNmKQogCQkgICAgfCAoKGRhdGEtPmZhbl9kaXZbMV0gJiAweDAzKSA8PCA2KTsKKwkJLyogZmFuNSBpbnB1dCBjb250cm9sIGJpdCBpcyB3cml0ZSBvbmx5LCBjb21wdXRlIHRoZSB2YWx1ZSAqLworCQlyZWcgfD0gKGRhdGEtPmhhc19mYW4gJiAoMSA8PCA0KSkgPyAxIDogMDsKIAkJdzgzNjI3ZWhmX3dyaXRlX3ZhbHVlKGNsaWVudCwgVzgzNjI3RUhGX1JFR19GQU5ESVYxLCByZWcpOwogCQlyZWcgPSAodzgzNjI3ZWhmX3JlYWRfdmFsdWUoY2xpZW50LCBXODM2MjdFSEZfUkVHX1ZCQVQpICYgMHhiZikKIAkJICAgIHwgKChkYXRhLT5mYW5fZGl2WzFdICYgMHgwNCkgPDwgNCk7CkBAIC0xMjE2LDEzICsxMjIwLDE2IEBACiAJc3VwZXJpb19leGl0KCk7CiAKIAkvKiBJdCBsb29rcyBsaWtlIGZhbjQgYW5kIGZhbjUgcGlucyBjYW4gYmUgYWx0ZXJuYXRpdmVseSB1c2VkCi0JICAgYXMgZmFuIG9uL29mZiBzd2l0Y2hlcyAqLworCSAgIGFzIGZhbiBvbi9vZmYgc3dpdGNoZXMsIGJ1dCBmYW41IGNvbnRyb2wgaXMgd3JpdGUgb25seSA6LworCSAgIFdlIGFzc3VtZSB0aGF0IGlmIHRoZSBzZXJpYWwgaW50ZXJmYWNlIGlzIGRpc2FibGVkLCBkZXNpZ25lcnMKKwkgICBjb25uZWN0ZWQgZmFuNSBhcyBpbnB1dCB1bmxlc3MgdGhleSBhcmUgZW1pdHRpbmcgbG9nIDEsIHdoaWNoCisJICAgaXMgbm90IHRoZSBkZWZhdWx0LiAqLwogCiAJZGF0YS0+aGFzX2ZhbiA9IDB4MDc7IC8qIGZhbjEsIGZhbjIgYW5kIGZhbjMgKi8KIAlpID0gdzgzNjI3ZWhmX3JlYWRfdmFsdWUoY2xpZW50LCBXODM2MjdFSEZfUkVHX0ZBTkRJVjEpOwogCWlmICgoaSAmICgxIDw8IDIpKSAmJiAoIWZhbjRwaW4pKQogCQlkYXRhLT5oYXNfZmFuIHw9ICgxIDw8IDMpOwotCWlmICgoaSAmICgxIDw8IDApKSAmJiAoIWZhbjVwaW4pKQorCWlmICghKGkgJiAoMSA8PCAxKSkgJiYgKCFmYW41cGluKSkKIAkJZGF0YS0+aGFzX2ZhbiB8PSAoMSA8PCA0KTsKIAogCS8qIFJlZ2lzdGVyIHN5c2ZzIGhvb2tzICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2h3bW9uL3c4Mzc4MWQuYyBiL2RyaXZlcnMvaHdtb24vdzgzNzgxZC5jCmluZGV4IGE0NTg0ZWMuLjEyMzIxNzEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaHdtb24vdzgzNzgxZC5jCisrKyBiL2RyaXZlcnMvaHdtb24vdzgzNzgxZC5jCkBAIC0xMDk5LDcgKzEwOTksOCBAQAogCSAgIGJhbmsuICovCiAJaWYgKGtpbmQgPCAwKSB7CiAJCWlmICh3ODM3ODFkX3JlYWRfdmFsdWUoY2xpZW50LCBXODM3ODFEX1JFR19DT05GSUcpICYgMHg4MCkgewotCQkJZGV2X2RiZyhkZXYsICJEZXRlY3Rpb24gZmFpbGVkIGF0IHN0ZXAgM1xuIik7CisJCQlkZXZfZGJnKCZhZGFwdGVyLT5kZXYsICJEZXRlY3Rpb24gb2YgdzgzNzgxZCBjaGlwICIKKwkJCQkiZmFpbGVkIGF0IHN0ZXAgM1xuIik7CiAJCQllcnIgPSAtRU5PREVWOwogCQkJZ290byBFUlJPUjI7CiAJCX0KQEAgLTExMDksNyArMTExMCw4IEBACiAJCWlmICgoISh2YWwxICYgMHgwNykpICYmCiAJCSAgICAoKCghKHZhbDEgJiAweDgwKSkgJiYgKHZhbDIgIT0gMHhhMykgJiYgKHZhbDIgIT0gMHhjMykpCiAJCSAgICAgfHwgKCh2YWwxICYgMHg4MCkgJiYgKHZhbDIgIT0gMHg1YykgJiYgKHZhbDIgIT0gMHgxMikpKSkgewotCQkJZGV2X2RiZyhkZXYsICJEZXRlY3Rpb24gZmFpbGVkIGF0IHN0ZXAgNFxuIik7CisJCQlkZXZfZGJnKCZhZGFwdGVyLT5kZXYsICJEZXRlY3Rpb24gb2YgdzgzNzgxZCBjaGlwICIKKwkJCQkiZmFpbGVkIGF0IHN0ZXAgNFxuIik7CiAJCQllcnIgPSAtRU5PREVWOwogCQkJZ290byBFUlJPUjI7CiAJCX0KQEAgLTExMTksNyArMTEyMSw4IEBACiAJCQkJICAoKHZhbDEgJiAweDgwKSAmJiAodmFsMiA9PSAweDVjKSkpKSB7CiAJCQlpZiAodzgzNzgxZF9yZWFkX3ZhbHVlCiAJCQkgICAgKGNsaWVudCwgVzgzNzgxRF9SRUdfSTJDX0FERFIpICE9IGFkZHJlc3MpIHsKLQkJCQlkZXZfZGJnKGRldiwgIkRldGVjdGlvbiBmYWlsZWQgYXQgc3RlcCA1XG4iKTsKKwkJCQlkZXZfZGJnKCZhZGFwdGVyLT5kZXYsICJEZXRlY3Rpb24gb2YgdzgzNzgxZCAiCisJCQkJCSJjaGlwIGZhaWxlZCBhdCBzdGVwIDVcbiIpOwogCQkJCWVyciA9IC1FTk9ERVY7CiAJCQkJZ290byBFUlJPUjI7CiAJCQl9CkBAIC0xMTQxLDggKzExNDQsOCBAQAogCQllbHNlIGlmICh2YWwyID09IDB4MTIpCiAJCQl2ZW5kaWQgPSBhc3VzOwogCQllbHNlIHsKLQkJCWRldl9kYmcoZGV2LCAiQ2hpcCB3YXMgbWFkZSBieSBuZWl0aGVyICIKLQkJCQkiV2luYm9uZCBub3IgQXN1cz9cbiIpOworCQkJZGV2X2RiZygmYWRhcHRlci0+ZGV2LCAidzgzNzgxZCBjaGlwIHZlbmRvciBpcyAiCisJCQkJIm5laXRoZXIgV2luYm9uZCBub3IgQXN1c1xuIik7CiAJCQllcnIgPSAtRU5PREVWOwogCQkJZ290byBFUlJPUjI7CiAJCX0KQEAgLTExNjEsMTAgKzExNjQsOSBAQAogCQkJa2luZCA9IGFzOTkxMjdmOwogCQllbHNlIHsKIAkJCWlmIChraW5kID09IDApCi0JCQkJZGV2X3dhcm4oZGV2LCAiSWdub3JpbmcgJ2ZvcmNlJyAiCisJCQkJZGV2X3dhcm4oJmFkYXB0ZXItPmRldiwgIklnbm9yaW5nICdmb3JjZScgIgogCQkJCQkgInBhcmFtZXRlciBmb3IgdW5rbm93biBjaGlwIGF0ICIKLQkJCQkJICJhZGFwdGVyICVkLCBhZGRyZXNzIDB4JTAyeFxuIiwKLQkJCQkJIGkyY19hZGFwdGVyX2lkKGFkYXB0ZXIpLCBhZGRyZXNzKTsKKwkJCQkJICJhZGRyZXNzIDB4JTAyeFxuIiwgYWRkcmVzcyk7CiAJCQllcnIgPSAtRUlOVkFMOwogCQkJZ290byBFUlJPUjI7CiAJCX0KQEAgLTE2ODUsMTEgKzE2ODcsMTAgQEAKIAlpZiAocmVzKQogCQlyZXR1cm4gcmVzOwogCi0JcmVzID0gaTJjX2lzYV9hZGRfZHJpdmVyKCZ3ODM3ODFkX2lzYV9kcml2ZXIpOwotCWlmIChyZXMpIHsKLQkJaTJjX2RlbF9kcml2ZXIoJnc4Mzc4MWRfZHJpdmVyKTsKLQkJcmV0dXJuIHJlczsKLQl9CisJLyogRG9uJ3QgZXhpdCBpZiB0aGlzIG9uZSBmYWlscywgd2Ugc3RpbGwgd2FudCB0aGUgSTJDIHZhcmlhbnRzCisJICAgdG8gd29yayEgKi8KKwlpZiAoaTJjX2lzYV9hZGRfZHJpdmVyKCZ3ODM3ODFkX2lzYV9kcml2ZXIpKQorCQlpc2FfYWRkcmVzcyA9IDA7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTE2OTcsNyArMTY5OCw4IEBACiBzdGF0aWMgdm9pZCBfX2V4aXQKIHNlbnNvcnNfdzgzNzgxZF9leGl0KHZvaWQpCiB7Ci0JaTJjX2lzYV9kZWxfZHJpdmVyKCZ3ODM3ODFkX2lzYV9kcml2ZXIpOworCWlmIChpc2FfYWRkcmVzcykKKwkJaTJjX2lzYV9kZWxfZHJpdmVyKCZ3ODM3ODFkX2lzYV9kcml2ZXIpOwogCWkyY19kZWxfZHJpdmVyKCZ3ODM3ODFkX2RyaXZlcik7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaHdtb24vdzgzNzkxZC5jIGIvZHJpdmVycy9od21vbi93ODM3OTFkLmMKaW5kZXggMzcxZWQ0Zi4uOWU1Zjg4NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9od21vbi93ODM3OTFkLmMKKysrIGIvZHJpdmVycy9od21vbi93ODM3OTFkLmMKQEAgLTc0Niw2ICs3NDYsNTIgQEAKIAogc3RhdGljIERFVklDRV9BVFRSKHZybSwgU19JUlVHTyB8IFNfSVdVU1IsIHNob3dfdnJtX3JlZywgc3RvcmVfdnJtX3JlZyk7CiAKKyNkZWZpbmUgSU5fVU5JVF9BVFRSUyhYKSBcCisJJnNkYV9pbl9pbnB1dFtYXS5kZXZfYXR0ci5hdHRyLCBcCisJJnNkYV9pbl9taW5bWF0uZGV2X2F0dHIuYXR0ciwgICBcCisJJnNkYV9pbl9tYXhbWF0uZGV2X2F0dHIuYXR0cgorCisjZGVmaW5lIEZBTl9VTklUX0FUVFJTKFgpIFwKKwkmc2RhX2Zhbl9pbnB1dFtYXS5kZXZfYXR0ci5hdHRyLCAgICAgICAgXAorCSZzZGFfZmFuX21pbltYXS5kZXZfYXR0ci5hdHRyLCAgICAgICAgICBcCisJJnNkYV9mYW5fZGl2W1hdLmRldl9hdHRyLmF0dHIKKworI2RlZmluZSBURU1QX1VOSVRfQVRUUlMoWCkgXAorCSZzZGFfdGVtcF9pbnB1dFtYXS5kZXZfYXR0ci5hdHRyLCAgICAgICBcCisJJnNkYV90ZW1wX21heFtYXS5kZXZfYXR0ci5hdHRyLCAgICAgICAgIFwKKwkmc2RhX3RlbXBfbWF4X2h5c3RbWF0uZGV2X2F0dHIuYXR0cgorCitzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqdzgzNzkxZF9hdHRyaWJ1dGVzW10gPSB7CisJSU5fVU5JVF9BVFRSUygwKSwKKwlJTl9VTklUX0FUVFJTKDEpLAorCUlOX1VOSVRfQVRUUlMoMiksCisJSU5fVU5JVF9BVFRSUygzKSwKKwlJTl9VTklUX0FUVFJTKDQpLAorCUlOX1VOSVRfQVRUUlMoNSksCisJSU5fVU5JVF9BVFRSUyg2KSwKKwlJTl9VTklUX0FUVFJTKDcpLAorCUlOX1VOSVRfQVRUUlMoOCksCisJSU5fVU5JVF9BVFRSUyg5KSwKKwlGQU5fVU5JVF9BVFRSUygwKSwKKwlGQU5fVU5JVF9BVFRSUygxKSwKKwlGQU5fVU5JVF9BVFRSUygyKSwKKwlGQU5fVU5JVF9BVFRSUygzKSwKKwlGQU5fVU5JVF9BVFRSUyg0KSwKKwlURU1QX1VOSVRfQVRUUlMoMCksCisJVEVNUF9VTklUX0FUVFJTKDEpLAorCVRFTVBfVU5JVF9BVFRSUygyKSwKKwkmZGV2X2F0dHJfYWxhcm1zLmF0dHIsCisJJnNkYV9iZWVwX2N0cmxbMF0uZGV2X2F0dHIuYXR0ciwKKwkmc2RhX2JlZXBfY3RybFsxXS5kZXZfYXR0ci5hdHRyLAorCSZkZXZfYXR0cl9jcHUwX3ZpZC5hdHRyLAorCSZkZXZfYXR0cl92cm0uYXR0ciwKKwlOVUxMCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCB3ODM3OTFkX2dyb3VwID0geworCS5hdHRycyA9IHc4Mzc5MWRfYXR0cmlidXRlcywKK307CisKIC8qIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHdoZW46CiAgICAgICogdzgzNzkxZF9kcml2ZXIgaXMgaW5zZXJ0ZWQgKHdoZW4gdGhpcyBtb2R1bGUgaXMgbG9hZGVkKSwgZm9yIGVhY2gKICAgICAgICBhdmFpbGFibGUgYWRhcHRlcgpAQCAtOTY3LDQxICsxMDEzLDIwIEBACiAJfQogCiAJLyogUmVnaXN0ZXIgc3lzZnMgaG9va3MgKi8KKwlpZiAoKGVyciA9IHN5c2ZzX2NyZWF0ZV9ncm91cCgmY2xpZW50LT5kZXYua29iaiwgJnc4Mzc5MWRfZ3JvdXApKSkKKwkJZ290byBlcnJvcjM7CisKKwkvKiBFdmVyeXRoaW5nIGlzIHJlYWR5LCBub3cgcmVnaXN0ZXIgdGhlIHdvcmtpbmcgZGV2aWNlICovCiAJZGF0YS0+Y2xhc3NfZGV2ID0gaHdtb25fZGV2aWNlX3JlZ2lzdGVyKGRldik7CiAJaWYgKElTX0VSUihkYXRhLT5jbGFzc19kZXYpKSB7CiAJCWVyciA9IFBUUl9FUlIoZGF0YS0+Y2xhc3NfZGV2KTsKLQkJZ290byBlcnJvcjM7CisJCWdvdG8gZXJyb3I0OwogCX0KIAotCWZvciAoaSA9IDA7IGkgPCBOVU1CRVJfT0ZfVklOOyBpKyspIHsKLQkJZGV2aWNlX2NyZWF0ZV9maWxlKGRldiwgJnNkYV9pbl9pbnB1dFtpXS5kZXZfYXR0cik7Ci0JCWRldmljZV9jcmVhdGVfZmlsZShkZXYsICZzZGFfaW5fbWluW2ldLmRldl9hdHRyKTsKLQkJZGV2aWNlX2NyZWF0ZV9maWxlKGRldiwgJnNkYV9pbl9tYXhbaV0uZGV2X2F0dHIpOwotCX0KLQotCWZvciAoaSA9IDA7IGkgPCBOVU1CRVJfT0ZfRkFOSU47IGkrKykgewotCQlkZXZpY2VfY3JlYXRlX2ZpbGUoZGV2LCAmc2RhX2Zhbl9pbnB1dFtpXS5kZXZfYXR0cik7Ci0JCWRldmljZV9jcmVhdGVfZmlsZShkZXYsICZzZGFfZmFuX2RpdltpXS5kZXZfYXR0cik7Ci0JCWRldmljZV9jcmVhdGVfZmlsZShkZXYsICZzZGFfZmFuX21pbltpXS5kZXZfYXR0cik7Ci0JfQotCi0JZm9yIChpID0gMDsgaSA8IE5VTUJFUl9PRl9URU1QSU47IGkrKykgewotCQlkZXZpY2VfY3JlYXRlX2ZpbGUoZGV2LCAmc2RhX3RlbXBfaW5wdXRbaV0uZGV2X2F0dHIpOwotCQlkZXZpY2VfY3JlYXRlX2ZpbGUoZGV2LCAmc2RhX3RlbXBfbWF4W2ldLmRldl9hdHRyKTsKLQkJZGV2aWNlX2NyZWF0ZV9maWxlKGRldiwgJnNkYV90ZW1wX21heF9oeXN0W2ldLmRldl9hdHRyKTsKLQl9Ci0KLQlkZXZpY2VfY3JlYXRlX2ZpbGUoZGV2LCAmZGV2X2F0dHJfYWxhcm1zKTsKLQotCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHNkYV9iZWVwX2N0cmwpOyBpKyspIHsKLQkJZGV2aWNlX2NyZWF0ZV9maWxlKGRldiwgJnNkYV9iZWVwX2N0cmxbaV0uZGV2X2F0dHIpOwotCX0KLQotCWRldmljZV9jcmVhdGVfZmlsZShkZXYsICZkZXZfYXR0cl9jcHUwX3ZpZCk7Ci0JZGV2aWNlX2NyZWF0ZV9maWxlKGRldiwgJmRldl9hdHRyX3ZybSk7Ci0KIAlyZXR1cm4gMDsKIAorZXJyb3I0OgorCXN5c2ZzX3JlbW92ZV9ncm91cCgmY2xpZW50LT5kZXYua29iaiwgJnc4Mzc5MWRfZ3JvdXApOwogZXJyb3IzOgogCWlmIChkYXRhLT5sbTc1WzBdICE9IE5VTEwpIHsKIAkJaTJjX2RldGFjaF9jbGllbnQoZGF0YS0+bG03NVswXSk7CkBAIC0xMDI1LDggKzEwNTAsMTAgQEAKIAlpbnQgZXJyOwogCiAJLyogbWFpbiBjbGllbnQgKi8KLQlpZiAoZGF0YSkKKwlpZiAoZGF0YSkgewogCQlod21vbl9kZXZpY2VfdW5yZWdpc3RlcihkYXRhLT5jbGFzc19kZXYpOworCQlzeXNmc19yZW1vdmVfZ3JvdXAoJmNsaWVudC0+ZGV2LmtvYmosICZ3ODM3OTFkX2dyb3VwKTsKKwl9CiAKIAlpZiAoKGVyciA9IGkyY19kZXRhY2hfY2xpZW50KGNsaWVudCkpKQogCQlyZXR1cm4gZXJyOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1pc2EuYyBiL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtaXNhLmMKaW5kZXggNDM4MDY1My4uOGVkNTlhMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1pc2EuYworKysgYi9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLWlzYS5jCkBAIC05MSw3ICs5MSw3IEBACiAJLyogTm93IGxvb2sgZm9yIGNsaWVudHMgKi8KIAlyZXMgPSBkcml2ZXItPmF0dGFjaF9hZGFwdGVyKCZpc2FfYWRhcHRlcik7CiAJaWYgKHJlcykgewotCQlkZXZfZXJyKCZpc2FfYWRhcHRlci5kZXYsCisJCWRldl9kYmcoJmlzYV9hZGFwdGVyLmRldiwKIAkJCSJEcml2ZXIgJXMgZmFpbGVkIHRvIGF0dGFjaCBhZGFwdGVyLCB1bnJlZ2lzdGVyaW5nXG4iLAogCQkJZHJpdmVyLT5kcml2ZXIubmFtZSk7CiAJCWRyaXZlcl91bnJlZ2lzdGVyKCZkcml2ZXItPmRyaXZlcik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLWl4cDR4eC5jIGIvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1peHA0eHguYwppbmRleCAxY2UwMWZiLi4wNWZmZmI5IDEwMDY0NAotLS0gYS9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLWl4cDR4eC5jCisrKyBiL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtaXhwNHh4LmMKQEAgLTEzNyw3ICsxMzcsOCBAQAogCWdwaW9fbGluZV9zZXQoZ3Bpby0+c2NsX3BpbiwgMCk7CiAJZ3Bpb19saW5lX3NldChncGlvLT5zZGFfcGluLCAwKTsKIAotCWlmICgoZXJyID0gaTJjX2JpdF9hZGRfYnVzKCZkcnZfZGF0YS0+YWRhcHRlcikgIT0gMCkpIHsKKwllcnIgPSBpMmNfYml0X2FkZF9idXMoJmRydl9kYXRhLT5hZGFwdGVyKTsKKwlpZiAoZXJyICE9IDApCiAJCXByaW50ayhLRVJOX0VSUiAiRVJST1I6IENvdWxkIG5vdCBpbnN0YWxsICVzXG4iLCBwbGF0X2Rldi0+ZGV2LmJ1c19pZCk7CiAKIAkJa2ZyZWUoZHJ2X2RhdGEpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1weGEuYyBiL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtcHhhLmMKaW5kZXggODEwNTBkMy4uYzk1YTZjMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1weGEuYworKysgYi9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLXB4YS5jCkBAIC0yNzIsNyArMjcyLDggQEAKIAkJCWRldl9kYmcoJmkyYy0+YWRhcC5kZXYsICIlczogJWxkOiBJU1I9JTA4eCwgSUNSPSUwOHgsIElCTVI9JTAyeFxuIiwKIAkJCQlfX2Z1bmNfXywgKGxvbmcpamlmZmllcywgSVNSLCBJQ1IsIElCTVIpOwogCi0JCWlmICgoSVNSICYgKElTUl9VQnxJU1JfSUJCfElTUl9TQUQpKSA9PSBJU1JfU0FEIHx8CisJCWlmICgoSVNSICYgKElTUl9VQnxJU1JfSUJCKSkgPT0gMCB8fAorCQkgICAgKElTUiAmIElTUl9TQUQpICE9IDAgfHwKIAkJICAgIChJQ1IgJiBJQ1JfU0NMRSkgPT0gMCkgewogCQkJaWYgKGkyY19kZWJ1ZyA+IDEpCiAJCQkJZGV2X2RiZygmaTJjLT5hZGFwLmRldiwgIiVzOiBkb25lXG4iLCBfX2Z1bmNfXyk7CkBAIC00OTIsNyArNDkzLDEwIEBACiAJaWYgKGlzciAmIElTUl9CRUQpIHsKIAkJLyogd2hhdCBzaG91bGQgd2UgZG8gaGVyZT8gKi8KIAl9IGVsc2UgewotCQlpbnQgcmV0ID0gaTJjLT5zbGF2ZS0+cmVhZChpMmMtPnNsYXZlLT5kYXRhKTsKKwkJaW50IHJldCA9IDA7CisKKwkJaWYgKGkyYy0+c2xhdmUgIT0gTlVMTCkKKwkJCXJldCA9IGkyYy0+c2xhdmUtPnJlYWQoaTJjLT5zbGF2ZS0+ZGF0YSk7CiAKIAkJSURCUiA9IHJldDsKIAkJSUNSIHw9IElDUl9UQjsgICAvKiBhbGxvdyBuZXh0IGJ5dGUgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaTJjL2J1c3Nlcy9zY3gyMDBfYWNiLmMgYi9kcml2ZXJzL2kyYy9idXNzZXMvc2N4MjAwX2FjYi5jCmluZGV4IDMyYWFiMGQuLjcxNGJhZTcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaTJjL2J1c3Nlcy9zY3gyMDBfYWNiLmMKKysrIGIvZHJpdmVycy9pMmMvYnVzc2VzL3NjeDIwMF9hY2IuYwpAQCAtNDk0LDExICs0OTQsMTIgQEAKIAlpZmFjZS0+cGRldiA9IHBkZXY7CiAJaWZhY2UtPmJhciA9IGJhcjsKIAotCXBjaV9lbmFibGVfZGV2aWNlX2JhcnMoaWZhY2UtPnBkZXYsIDEgPDwgaWZhY2UtPmJhcik7CisJcmMgPSBwY2lfZW5hYmxlX2RldmljZV9iYXJzKGlmYWNlLT5wZGV2LCAxIDw8IGlmYWNlLT5iYXIpOworCWlmIChyYykKKwkJZ290byBlcnJvdXRfZnJlZTsKIAogCXJjID0gcGNpX3JlcXVlc3RfcmVnaW9uKGlmYWNlLT5wZGV2LCBpZmFjZS0+YmFyLCBpZmFjZS0+YWRhcHRlci5uYW1lKTsKLQotCWlmIChyYyAhPSAwKSB7CisJaWYgKHJjKSB7CiAJCXByaW50ayhLRVJOX0VSUiBOQU1FICI6IGNhbid0IGFsbG9jYXRlIFBDSSBCQVIgJWRcbiIsCiAJCQkJaWZhY2UtPmJhcik7CiAJCWdvdG8gZXJyb3V0X2ZyZWU7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lkZS9pZGUtY2QuYyBiL2RyaXZlcnMvaWRlL2lkZS1jZC5jCmluZGV4IDY5YmJiNjIuLjg4MjE0OTQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWRlL2lkZS1jZC5jCisrKyBiL2RyaXZlcnMvaWRlL2lkZS1jZC5jCkBAIC01OTcsNyArNTk3LDcgQEAKIAlzdHJ1Y3QgY2Ryb21faW5mbyAqY2QgPSBkcml2ZS0+ZHJpdmVyX2RhdGE7CiAKIAlpZGVfaW5pdF9kcml2ZV9jbWQocnEpOwotCXJxLT5jbWRfdHlwZSA9IFJFUV9UWVBFX0JMT0NLX1BDOworCXJxLT5jbWRfdHlwZSA9IFJFUV9UWVBFX0FUQV9QQzsKIAlycS0+cnFfZGlzayA9IGNkLT5kaXNrOwogfQogCkBAIC03MTYsNyArNzE2LDcgQEAKIAkJaWRlX2Vycm9yKGRyaXZlLCAicmVxdWVzdCBzZW5zZSBmYWlsdXJlIiwgc3RhdCk7CiAJCXJldHVybiAxOwogCi0JfSBlbHNlIGlmIChibGtfcGNfcmVxdWVzdChycSkpIHsKKwl9IGVsc2UgaWYgKGJsa19wY19yZXF1ZXN0KHJxKSB8fCBycS0+Y21kX3R5cGUgPT0gUkVRX1RZUEVfQVRBX1BDKSB7CiAJCS8qIEFsbCBvdGhlciBmdW5jdGlvbnMsIGV4Y2VwdCBmb3IgUkVBRC4gKi8KIAkJdW5zaWduZWQgbG9uZyBmbGFnczsKIApAQCAtNzI0LDcgKzcyNCw3IEBACiAJCSAqIGlmIHdlIGhhdmUgYW4gZXJyb3IsIHBhc3MgYmFjayBDSEVDS19DT05ESVRJT04gYXMgdGhlCiAJCSAqIHNjc2kgc3RhdHVzIGJ5dGUKIAkJICovCi0JCWlmICghcnEtPmVycm9ycykKKwkJaWYgKGJsa19wY19yZXF1ZXN0KHJxKSAmJiAhcnEtPmVycm9ycykKIAkJCXJxLT5lcnJvcnMgPSBTQU1fU1RBVF9DSEVDS19DT05ESVRJT047CiAKIAkJLyogQ2hlY2sgZm9yIHRyYXkgb3Blbi4gKi8KQEAgLTIwMjMsNyArMjAyMyw4IEBACiAJCX0KIAkJaW5mby0+bGFzdF9ibG9jayA9IGJsb2NrOwogCQlyZXR1cm4gYWN0aW9uOwotCX0gZWxzZSBpZiAocnEtPmNtZF90eXBlID09IFJFUV9UWVBFX1NFTlNFKSB7CisJfSBlbHNlIGlmIChycS0+Y21kX3R5cGUgPT0gUkVRX1RZUEVfU0VOU0UgfHwKKwkJICAgcnEtPmNtZF90eXBlID09IFJFUV9UWVBFX0FUQV9QQykgewogCQlyZXR1cm4gY2Ryb21fZG9fcGFja2V0X2NvbW1hbmQoZHJpdmUpOwogCX0gZWxzZSBpZiAoYmxrX3BjX3JlcXVlc3QocnEpKSB7CiAJCXJldHVybiBjZHJvbV9kb19ibG9ja19wYyhkcml2ZSwgcnEpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pZGUvaWRlLXRhc2tmaWxlLmMgYi9kcml2ZXJzL2lkZS9pZGUtdGFza2ZpbGUuYwppbmRleCAxZDA0NzBjLi4zMDE3NWM3IDEwMDY0NAotLS0gYS9kcml2ZXJzL2lkZS9pZGUtdGFza2ZpbGUuYworKysgYi9kcml2ZXJzL2lkZS9pZGUtdGFza2ZpbGUuYwpAQCAtNTI0LDggKzUyNCw4IEBACiAJdGFza19pb3JlZ190ICpob2JzcHRyCT0gYXJncy5ob2JSZWdpc3RlcjsKIAlpbnQgZXJyCQkJPSAwOwogCWludCB0YXNrc2l6ZQkJPSBzaXplb2Yoc3RydWN0IGlkZV90YXNrX3JlcXVlc3Rfcyk7Ci0JaW50IHRhc2tpbgkJPSAwOwotCWludCB0YXNrb3V0CQk9IDA7CisJdW5zaWduZWQgaW50IHRhc2tpbgk9IDA7CisJdW5zaWduZWQgaW50IHRhc2tvdXQJPSAwOwogCXU4IGlvXzMyYml0CQk9IGRyaXZlLT5pb18zMmJpdDsKIAljaGFyIF9fdXNlciAqYnVmID0gKGNoYXIgX191c2VyICopYXJnOwogCkBAIC01MzgsOCArNTM4LDEzIEBACiAJCXJldHVybiAtRUZBVUxUOwogCX0KIAotCXRhc2tvdXQgPSAoaW50KSByZXFfdGFzay0+b3V0X3NpemU7Ci0JdGFza2luICA9IChpbnQpIHJlcV90YXNrLT5pbl9zaXplOworCXRhc2tvdXQgPSByZXFfdGFzay0+b3V0X3NpemU7CisJdGFza2luICA9IHJlcV90YXNrLT5pbl9zaXplOworCQorCWlmICh0YXNraW4gPiA2NTUzNiB8fCB0YXNrb3V0ID4gNjU1MzYpIHsKKwkJZXJyID0gLUVJTlZBTDsKKwkJZ290byBhYm9ydDsKKwl9CiAKIAlpZiAodGFza291dCkgewogCQlpbnQgb3V0dG90YWwgPSB0YXNrc2l6ZTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWRlL2xlZ2FjeS9oZC5jIGIvZHJpdmVycy9pZGUvbGVnYWN5L2hkLmMKaW5kZXggYjFkNTI5MS4uNDVlZDAzNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pZGUvbGVnYWN5L2hkLmMKKysrIGIvZHJpdmVycy9pZGUvbGVnYWN5L2hkLmMKQEAgLTQ1OSw3ICs0NTksNyBAQAogI2lmZGVmIERFQlVHCiAJcHJpbnRrKCIlczogcmVhZDogc2VjdG9yICVsZCwgcmVtYWluaW5nID0gJWxkLCBidWZmZXI9JXBcbiIsCiAJCXJlcS0+cnFfZGlzay0+ZGlza19uYW1lLCByZXEtPnNlY3RvciwgcmVxLT5ucl9zZWN0b3JzLAotCQlyZXEtPmJ1ZmZlcis1MTIpKTsKKwkJcmVxLT5idWZmZXIrNTEyKTsKICNlbmRpZgogCWlmIChyZXEtPmN1cnJlbnRfbnJfc2VjdG9ycyA8PSAwKQogCQllbmRfcmVxdWVzdChyZXEsIDEpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pZGUvcGNpL2FtZDc0eHguYyBiL2RyaXZlcnMvaWRlL3BjaS9hbWQ3NHh4LmMKaW5kZXggMmIwZWE4Yi4uNzUzZmUwZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pZGUvcGNpL2FtZDc0eHguYworKysgYi9kcml2ZXJzL2lkZS9wY2kvYW1kNzR4eC5jCkBAIC03NSw2ICs3NSw3IEBACiAJeyBQQ0lfREVWSUNFX0lEX05WSURJQV9ORk9SQ0VfTUNQNTVfSURFLAkweDUwLCBBTURfVURNQV8xMzMgfSwKIAl7IFBDSV9ERVZJQ0VfSURfTlZJRElBX05GT1JDRV9NQ1A2MV9JREUsCTB4NTAsIEFNRF9VRE1BXzEzMyB9LAogCXsgUENJX0RFVklDRV9JRF9OVklESUFfTkZPUkNFX01DUDY1X0lERSwJMHg1MCwgQU1EX1VETUFfMTMzIH0sCisJeyBQQ0lfREVWSUNFX0lEX05WSURJQV9ORk9SQ0VfTUNQNjdfSURFLAkweDUwLCBBTURfVURNQV8xMzMgfSwKIAl7IFBDSV9ERVZJQ0VfSURfQU1EX0NTNTUzNl9JREUsCQkJMHg0MCwgQU1EX1VETUFfMTAwIH0sCiAJeyAwIH0KIH07CkBAIC00OTEsNyArNDkyLDggQEAKIAkvKiAxNiAqLyBERUNMQVJFX05WX0RFVigiTkZPUkNFLU1DUDU1IiksCiAJLyogMTcgKi8gREVDTEFSRV9OVl9ERVYoIk5GT1JDRS1NQ1A2MSIpLAogCS8qIDE4ICovIERFQ0xBUkVfTlZfREVWKCJORk9SQ0UtTUNQNjUiKSwKLQkvKiAxOSAqLyBERUNMQVJFX0FNRF9ERVYoIkFNRDU1MzYiKSwKKwkvKiAxOSAqLyBERUNMQVJFX05WX0RFVigiTkZPUkNFLU1DUDY3IiksCisJLyogMjAgKi8gREVDTEFSRV9BTURfREVWKCJBTUQ1NTM2IiksCiB9OwogCiBzdGF0aWMgaW50IF9fZGV2aW5pdCBhbWQ3NHh4X3Byb2JlKHN0cnVjdCBwY2lfZGV2ICpkZXYsIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICppZCkKQEAgLTUzMCw3ICs1MzIsOCBAQAogCXsgUENJX1ZFTkRPUl9JRF9OVklESUEsIFBDSV9ERVZJQ0VfSURfTlZJRElBX05GT1JDRV9NQ1A1NV9JREUsCVBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDE2IH0sCiAJeyBQQ0lfVkVORE9SX0lEX05WSURJQSwgUENJX0RFVklDRV9JRF9OVklESUFfTkZPUkNFX01DUDYxX0lERSwJUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMTcgfSwKIAl7IFBDSV9WRU5ET1JfSURfTlZJRElBLCBQQ0lfREVWSUNFX0lEX05WSURJQV9ORk9SQ0VfTUNQNjVfSURFLCAgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMTggfSwKLQl7IFBDSV9WRU5ET1JfSURfQU1ELAlQQ0lfREVWSUNFX0lEX0FNRF9DUzU1MzZfSURFLAkJUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMTkgfSwKKwl7IFBDSV9WRU5ET1JfSURfTlZJRElBLCBQQ0lfREVWSUNFX0lEX05WSURJQV9ORk9SQ0VfTUNQNjdfSURFLCAgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMTkgfSwKKwl7IFBDSV9WRU5ET1JfSURfQU1ELAlQQ0lfREVWSUNFX0lEX0FNRF9DUzU1MzZfSURFLAkJUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMjAgfSwKIAl7IDAsIH0sCiB9OwogTU9EVUxFX0RFVklDRV9UQUJMRShwY2ksIGFtZDc0eHhfcGNpX3RibCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lkZS9wY2kvZ2VuZXJpYy5jIGIvZHJpdmVycy9pZGUvcGNpL2dlbmVyaWMuYwppbmRleCA5NjVjNDM2Li45ZjMwNjg4IDEwMDY0NAotLS0gYS9kcml2ZXJzL2lkZS9wY2kvZ2VuZXJpYy5jCisrKyBiL2RyaXZlcnMvaWRlL3BjaS9nZW5lcmljLmMKQEAgLTQwLDYgKzQwLDE5IEBACiAKIHN0YXRpYyBpbnQgaWRlX2dlbmVyaWNfYWxsOwkJLyogU2V0IHRvIGNsYWltIGFsbCBkZXZpY2VzICovCiAKKy8qCisgKiB0aGUgbW9kdWxlX3BhcmFtX25hbWVkKCkgd2FzIGFkZGVkIGZvciB0aGUgbW9kdWxhciBjYXNlCisgKiB0aGUgX19zZXR1cCgpIGlzIGxlZnQgYXMgY29tcGF0aWJpbGl0eSBmb3IgZXhpc3Rpbmcgc2V0dXBzCisgKi8KKyNpZm5kZWYgTU9EVUxFCitzdGF0aWMgaW50IF9faW5pdCBpZGVfZ2VuZXJpY19hbGxfb24oY2hhciAqdW51c2VkKQoreworCWlkZV9nZW5lcmljX2FsbCA9IDE7CisJcHJpbnRrKEtFUk5fSU5GTyAiSURFIGdlbmVyaWMgd2lsbCBjbGFpbSBhbGwgdW5rbm93biBQQ0kgSURFIHN0b3JhZ2UgY29udHJvbGxlcnMuXG4iKTsKKwlyZXR1cm4gMTsKK30KK19fc2V0dXAoImFsbC1nZW5lcmljLWlkZSIsIGlkZV9nZW5lcmljX2FsbF9vbik7CisjZW5kaWYKIG1vZHVsZV9wYXJhbV9uYW1lZChhbGxfZ2VuZXJpY19pZGUsIGlkZV9nZW5lcmljX2FsbCwgYm9vbCwgMDQ0NCk7CiBNT0RVTEVfUEFSTV9ERVNDKGFsbF9nZW5lcmljX2lkZSwgIklERSBnZW5lcmljIHdpbGwgY2xhaW0gYWxsIHVua25vd24gUENJIElERSBzdG9yYWdlIGNvbnRyb2xsZXJzLiIpOwogCkBAIC0yMzQsMTMgKzI0NywxNyBAQAogCSAgICAoIShQQ0lfRlVOQyhkZXYtPmRldmZuKSAmIDEpKSkKIAkJZ290byBvdXQ7CiAKLQlpZiAoZGV2LT52ZW5kb3IgPT0gUENJX1ZFTkRPUl9JRF9KTUlDUk9OICYmIFBDSV9GVU5DKGRldi0+ZGV2Zm4pICE9IDEpCi0JCWdvdG8gb3V0OworCWlmIChkZXYtPnZlbmRvciA9PSBQQ0lfVkVORE9SX0lEX0pNSUNST04pIHsKKwkJaWYgKGRldi0+ZGV2aWNlICE9IFBDSV9ERVZJQ0VfSURfSk1JQ1JPTl9KTUIzNjggJiYgUENJX0ZVTkMoZGV2LT5kZXZmbikgIT0gMSkKKwkJCWdvdG8gb3V0OworCX0KIAotCXBjaV9yZWFkX2NvbmZpZ193b3JkKGRldiwgUENJX0NPTU1BTkQsICZjb21tYW5kKTsKLQlpZiAoIShjb21tYW5kICYgUENJX0NPTU1BTkRfSU8pKSB7Ci0JCXByaW50ayhLRVJOX0lORk8gIlNraXBwaW5nIGRpc2FibGVkICVzIElERSBjb250cm9sbGVyLlxuIiwgZC0+bmFtZSk7Ci0JCWdvdG8gb3V0OworCWlmIChkZXYtPnZlbmRvciAhPSBQQ0lfVkVORE9SX0lEX0pNSUNST04pIHsKKwkJcGNpX3JlYWRfY29uZmlnX3dvcmQoZGV2LCBQQ0lfQ09NTUFORCwgJmNvbW1hbmQpOworCQlpZiAoIShjb21tYW5kICYgUENJX0NPTU1BTkRfSU8pKSB7CisJCQlwcmludGsoS0VSTl9JTkZPICJTa2lwcGluZyBkaXNhYmxlZCAlcyBJREUgY29udHJvbGxlci5cbiIsIGQtPm5hbWUpOworCQkJZ290byBvdXQ7CisJCX0KIAl9CiAJcmV0ID0gaWRlX3NldHVwX3BjaV9kZXZpY2UoZGV2LCBkKTsKIG91dDoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWRlL3BjaS9zZ2lpb2M0LmMgYi9kcml2ZXJzL2lkZS9wY2kvc2dpaW9jNC5jCmluZGV4IGYzZmUyODcuLjI0NGY3ZWIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWRlL3BjaS9zZ2lpb2M0LmMKKysrIGIvZHJpdmVycy9pZGUvcGNpL3NnaWlvYzQuYwpAQCAtNzc0LDcgKzc3NCw3IEBACiAJaW9jNF91bnJlZ2lzdGVyX3N1Ym1vZHVsZSgmaW9jNF9pZGVfc3VibW9kdWxlKTsKIH0KIAotbW9kdWxlX2luaXQoaW9jNF9pZGVfaW5pdCk7CitsYXRlX2luaXRjYWxsKGlvYzRfaWRlX2luaXQpOyAvKiBDYWxsIG9ubHkgYWZ0ZXIgSURFIGluaXQgaXMgZG9uZSAqLwogbW9kdWxlX2V4aXQoaW9jNF9pZGVfZXhpdCk7CiAKIE1PRFVMRV9BVVRIT1IoIkFuaWtldCBNYWxhdHB1cmUvSmVyZW15IEhpZ2RvbiIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pZWVlMTM5NC9ldGgxMzk0LmMgYi9kcml2ZXJzL2llZWUxMzk0L2V0aDEzOTQuYwppbmRleCA4YTdiOGZhLi4zMWU1Y2M0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2llZWUxMzk0L2V0aDEzOTQuYworKysgYi9kcml2ZXJzL2llZWUxMzk0L2V0aDEzOTQuYwpAQCAtNjQsNiArNjQsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2V0aHRvb2wuaD4KICNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgogI2luY2x1ZGUgPGFzbS9kZWxheS5oPgorI2luY2x1ZGUgPGFzbS91bmFsaWduZWQuaD4KICNpbmNsdWRlIDxuZXQvYXJwLmg+CiAKICNpbmNsdWRlICJjb25maWdfcm9tcy5oIgpAQCAtNDkxLDcgKzQ5Miw3IEBACiAJaW50IGk7CiAJc3RydWN0IGV0aDEzOTRfcHJpdiAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CiAJc3RydWN0IGhwc2JfaG9zdCAqaG9zdCA9IHByaXYtPmhvc3Q7Ci0JdTY0IGd1aWQgPSAqKCh1NjQqKSYoaG9zdC0+Y3NyLnJvbS0+YnVzX2luZm9fZGF0YVszXSkpOworCXU2NCBndWlkID0gZ2V0X3VuYWxpZ25lZCgodTY0KikmKGhvc3QtPmNzci5yb20tPmJ1c19pbmZvX2RhdGFbM10pKTsKIAl1MTYgbWF4cGF5bG9hZCA9IDEgPDwgKGhvc3QtPmNzci5tYXhfcmVjICsgMSk7CiAJaW50IG1heF9zcGVlZCA9IElFRUUxMzk0X1NQRUVEX01BWDsKIApAQCAtNTE0LDggKzUxNSw4IEBACiAJCQkJICAgICAgRVRIRVIxMzk0X0dBU1BfT1ZFUkhFQUQpKSk7CiAKIAkJLyogU2V0IG91ciBoYXJkd2FyZSBhZGRyZXNzIHdoaWxlIHdlJ3JlIGF0IGl0ICovCi0JCSoodTY0KilkZXYtPmRldl9hZGRyID0gZ3VpZDsKLQkJKih1NjQqKWRldi0+YnJvYWRjYXN0ID0gfjB4MFVMTDsKKwkJbWVtY3B5KGRldi0+ZGV2X2FkZHIsICZndWlkLCBzaXplb2YodTY0KSk7CisJCW1lbXNldChkZXYtPmJyb2FkY2FzdCwgMHhmZiwgc2l6ZW9mKHU2NCkpOwogCX0KIAogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUgKCZwcml2LT5sb2NrLCBmbGFncyk7CkBAIC04OTQsNiArODk1LDcgQEAKIAkJdTE2IG1heHBheWxvYWQ7CiAJCXN0cnVjdCBldGgxMzk0X25vZGVfcmVmICpub2RlOwogCQlzdHJ1Y3QgZXRoMTM5NF9ub2RlX2luZm8gKm5vZGVfaW5mbzsKKwkJX19iZTY0IGd1aWQ7CiAKIAkJLyogU2FuaXR5IGNoZWNrLiBNYWNPU1ggc2VlbXMgdG8gYmUgc2VuZGluZyB1cyAxMzEgaW4gdGhpcwogCQkgKiBmaWVsZCAoYXRsZWFzdCBvbiBteSBQYW50aGVyIEc1KS4gTm90IHN1cmUgd2h5LiAqLwpAQCAtOTAyLDggKzkwNCw5IEBACiAKIAkJbWF4cGF5bG9hZCA9IG1pbihldGgxMzk0X3NwZWVkdG9fbWF4cGF5bG9hZFtzc3BkXSwgKHUxNikoMSA8PCAobWF4X3JlYyArIDEpKSk7CiAKKwkJZ3VpZCA9IGdldF91bmFsaWduZWQoJmFycDEzOTQtPnNfdW5pcV9pZCk7CiAJCW5vZGUgPSBldGgxMzk0X2ZpbmRfbm9kZV9ndWlkKCZwcml2LT5pcF9ub2RlX2xpc3QsCi0JCQkJCSAgICAgIGJlNjRfdG9fY3B1KGFycDEzOTQtPnNfdW5pcV9pZCkpOworCQkJCQkgICAgICBiZTY0X3RvX2NwdShndWlkKSk7CiAJCWlmICghbm9kZSkgewogCQkJcmV0dXJuIDA7CiAJCX0KQEAgLTkzMSwxMCArOTM0LDkgQEAKIAkJYXJwX3B0ciArPSBhcnAtPmFyX3BsbjsJCS8qIHNraXAgb3ZlciBzZW5kZXIgSVAgYWRkciAqLwogCiAJCWlmIChhcnAtPmFyX29wID09IGh0b25zKEFSUE9QX1JFUVVFU1QpKQotCQkJLyoganVzdCBzZXQgQVJQIHJlcSB0YXJnZXQgdW5pcXVlIElEIHRvIDAgKi8KLQkJCSooKHU2NCopYXJwX3B0cikgPSAwOworCQkJbWVtc2V0KGFycF9wdHIsIDAsIHNpemVvZih1NjQpKTsKIAkJZWxzZQotCQkJKigodTY0KilhcnBfcHRyKSA9ICooKHU2NCopZGV2LT5kZXZfYWRkcik7CisJCQltZW1jcHkoYXJwX3B0ciwgZGV2LT5kZXZfYWRkciwgc2l6ZW9mKHU2NCkpOwogCX0KIAogCS8qIE5vdyBhZGQgdGhlIGV0aGVybmV0IGhlYWRlci4gKi8KQEAgLTE2NzUsOCArMTY3NywxMCBAQAogCQlpZiAobWF4X3BheWxvYWQgPCBkZ19zaXplICsgaGRyX3R5cGVfbGVuW0VUSDEzOTRfSERSX0xGX1VGXSkKIAkJCXByaXYtPmJjX2RnbCsrOwogCX0gZWxzZSB7CisJCV9fYmU2NCBndWlkID0gZ2V0X3VuYWxpZ25lZCgodTY0ICopZXRoLT5oX2Rlc3QpOworCiAJCW5vZGUgPSBldGgxMzk0X2ZpbmRfbm9kZV9ndWlkKCZwcml2LT5pcF9ub2RlX2xpc3QsCi0JCQkJCSAgICAgIGJlNjRfdG9fY3B1KCoodTY0KilldGgtPmhfZGVzdCkpOworCQkJCQkgICAgICBiZTY0X3RvX2NwdShndWlkKSk7CiAJCWlmICghbm9kZSkgewogCQkJcmV0ID0gLUVBR0FJTjsKIAkJCWdvdG8gZmFpbDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWVlZTEzOTQvb2hjaTEzOTQuYyBiL2RyaXZlcnMvaWVlZTEzOTQvb2hjaTEzOTQuYwppbmRleCBkZWExMzUyLi42ZThlYTkxIDEwMDY0NAotLS0gYS9kcml2ZXJzL2llZWUxMzk0L29oY2kxMzk0LmMKKysrIGIvZHJpdmVycy9pZWVlMTM5NC9vaGNpMTM5NC5jCkBAIC0zNTUyLDEyICszNTUyLDIxIEBACiB7CiAJaW50IGVycjsKIAorCXByaW50ayhLRVJOX0lORk8gIiVzIGRvZXMgbm90IGZ1bGx5IHN1cHBvcnQgc3VzcGVuZCBhbmQgcmVzdW1lIHlldFxuIiwKKwkgICAgICAgT0hDSTEzOTRfRFJJVkVSX05BTUUpOworCiAJZXJyID0gcGNpX3NhdmVfc3RhdGUocGRldik7Ci0JaWYgKGVycikKLQkJZ290byBvdXQ7CisJaWYgKGVycikgeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiBwY2lfc2F2ZV9zdGF0ZSBmYWlsZWQgd2l0aCAlZFxuIiwKKwkJICAgICAgIE9IQ0kxMzk0X0RSSVZFUl9OQU1FLCBlcnIpOworCQlyZXR1cm4gZXJyOworCX0KIAllcnIgPSBwY2lfc2V0X3Bvd2VyX3N0YXRlKHBkZXYsIHBjaV9jaG9vc2Vfc3RhdGUocGRldiwgc3RhdGUpKTsKKyNpZmRlZiBPSENJMTM5NF9ERUJVRwogCWlmIChlcnIpCi0JCWdvdG8gb3V0OworCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IHBjaV9zZXRfcG93ZXJfc3RhdGUgZmFpbGVkIHdpdGggJWRcbiIsCisJCSAgICAgICBPSENJMTM5NF9EUklWRVJfTkFNRSwgZXJyKTsKKyNlbmRpZiAvKiBPSENJMTM5NF9ERUJVRyAqLwogCiAvKiBQb3dlck1hYyBzdXNwZW5kIGNvZGUgY29tZXMgbGFzdCAqLwogI2lmZGVmIENPTkZJR19QUENfUE1BQwpAQCAtMzU3MCw4ICszNTc5LDggQEAKIAkJCXBtYWNfY2FsbF9mZWF0dXJlKFBNQUNfRlRSXzEzOTRfRU5BQkxFLCBvZl9ub2RlLCAwLCAwKTsKIAl9CiAjZW5kaWYgLyogQ09ORklHX1BQQ19QTUFDICovCi1vdXQ6Ci0JcmV0dXJuIGVycjsKKworCXJldHVybiAwOwogfQogI2VuZGlmIC8qIENPTkZJR19QTSAqLwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvY29yZS9hZGRyLmMgYi9kcml2ZXJzL2luZmluaWJhbmQvY29yZS9hZGRyLmMKaW5kZXggNjBkM2ZiZC4uZTExMTg3ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbmZpbmliYW5kL2NvcmUvYWRkci5jCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC9jb3JlL2FkZHIuYwpAQCAtNDcsNiArNDcsNyBAQAogCXN0cnVjdCBzb2NrYWRkciBzcmNfYWRkcjsKIAlzdHJ1Y3Qgc29ja2FkZHIgZHN0X2FkZHI7CiAJc3RydWN0IHJkbWFfZGV2X2FkZHIgKmFkZHI7CisJc3RydWN0IHJkbWFfYWRkcl9jbGllbnQgKmNsaWVudDsKIAl2b2lkICpjb250ZXh0OwogCXZvaWQgKCpjYWxsYmFjaykoaW50IHN0YXR1cywgc3RydWN0IHNvY2thZGRyICpzcmNfYWRkciwKIAkJCSBzdHJ1Y3QgcmRtYV9kZXZfYWRkciAqYWRkciwgdm9pZCAqY29udGV4dCk7CkBAIC02MSw2ICs2MiwyNiBAQAogc3RhdGljIERFQ0xBUkVfV09SSyh3b3JrLCBwcm9jZXNzX3JlcSwgTlVMTCk7CiBzdGF0aWMgc3RydWN0IHdvcmtxdWV1ZV9zdHJ1Y3QgKmFkZHJfd3E7CiAKK3ZvaWQgcmRtYV9hZGRyX3JlZ2lzdGVyX2NsaWVudChzdHJ1Y3QgcmRtYV9hZGRyX2NsaWVudCAqY2xpZW50KQoreworCWF0b21pY19zZXQoJmNsaWVudC0+cmVmY291bnQsIDEpOworCWluaXRfY29tcGxldGlvbigmY2xpZW50LT5jb21wKTsKK30KK0VYUE9SVF9TWU1CT0wocmRtYV9hZGRyX3JlZ2lzdGVyX2NsaWVudCk7CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBwdXRfY2xpZW50KHN0cnVjdCByZG1hX2FkZHJfY2xpZW50ICpjbGllbnQpCit7CisJaWYgKGF0b21pY19kZWNfYW5kX3Rlc3QoJmNsaWVudC0+cmVmY291bnQpKQorCQljb21wbGV0ZSgmY2xpZW50LT5jb21wKTsKK30KKwordm9pZCByZG1hX2FkZHJfdW5yZWdpc3Rlcl9jbGllbnQoc3RydWN0IHJkbWFfYWRkcl9jbGllbnQgKmNsaWVudCkKK3sKKwlwdXRfY2xpZW50KGNsaWVudCk7CisJd2FpdF9mb3JfY29tcGxldGlvbigmY2xpZW50LT5jb21wKTsKK30KK0VYUE9SVF9TWU1CT0wocmRtYV9hZGRyX3VucmVnaXN0ZXJfY2xpZW50KTsKKwogaW50IHJkbWFfY29weV9hZGRyKHN0cnVjdCByZG1hX2Rldl9hZGRyICpkZXZfYWRkciwgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKIAkJICAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpkc3RfZGV2X2FkZHIpCiB7CkBAIC0yMjksNiArMjUwLDcgQEAKIAkJbGlzdF9kZWwoJnJlcS0+bGlzdCk7CiAJCXJlcS0+Y2FsbGJhY2socmVxLT5zdGF0dXMsICZyZXEtPnNyY19hZGRyLCByZXEtPmFkZHIsCiAJCQkgICAgICByZXEtPmNvbnRleHQpOworCQlwdXRfY2xpZW50KHJlcS0+Y2xpZW50KTsKIAkJa2ZyZWUocmVxKTsKIAl9CiB9CkBAIC0yNjQsNyArMjg2LDggQEAKIAlyZXR1cm4gcmV0OwogfQogCi1pbnQgcmRtYV9yZXNvbHZlX2lwKHN0cnVjdCBzb2NrYWRkciAqc3JjX2FkZHIsIHN0cnVjdCBzb2NrYWRkciAqZHN0X2FkZHIsCitpbnQgcmRtYV9yZXNvbHZlX2lwKHN0cnVjdCByZG1hX2FkZHJfY2xpZW50ICpjbGllbnQsCisJCSAgICBzdHJ1Y3Qgc29ja2FkZHIgKnNyY19hZGRyLCBzdHJ1Y3Qgc29ja2FkZHIgKmRzdF9hZGRyLAogCQkgICAgc3RydWN0IHJkbWFfZGV2X2FkZHIgKmFkZHIsIGludCB0aW1lb3V0X21zLAogCQkgICAgdm9pZCAoKmNhbGxiYWNrKShpbnQgc3RhdHVzLCBzdHJ1Y3Qgc29ja2FkZHIgKnNyY19hZGRyLAogCQkJCSAgICAgc3RydWN0IHJkbWFfZGV2X2FkZHIgKmFkZHIsIHZvaWQgKmNvbnRleHQpLApAQCAtMjg1LDYgKzMwOCw4IEBACiAJcmVxLT5hZGRyID0gYWRkcjsKIAlyZXEtPmNhbGxiYWNrID0gY2FsbGJhY2s7CiAJcmVxLT5jb250ZXh0ID0gY29udGV4dDsKKwlyZXEtPmNsaWVudCA9IGNsaWVudDsKKwlhdG9taWNfaW5jKCZjbGllbnQtPnJlZmNvdW50KTsKIAogCXNyY19pbiA9IChzdHJ1Y3Qgc29ja2FkZHJfaW4gKikgJnJlcS0+c3JjX2FkZHI7CiAJZHN0X2luID0gKHN0cnVjdCBzb2NrYWRkcl9pbiAqKSAmcmVxLT5kc3RfYWRkcjsKQEAgLTMwNSw2ICszMzAsNyBAQAogCQlicmVhazsKIAlkZWZhdWx0OgogCQlyZXQgPSByZXEtPnN0YXR1czsKKwkJYXRvbWljX2RlYygmY2xpZW50LT5yZWZjb3VudCk7CiAJCWtmcmVlKHJlcSk7CiAJCWJyZWFrOwogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5maW5pYmFuZC9jb3JlL2NtYS5jIGIvZHJpdmVycy9pbmZpbmliYW5kL2NvcmUvY21hLmMKaW5kZXggOWFlNGYzYS4uODQ1MDkwYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbmZpbmliYW5kL2NvcmUvY21hLmMKKysrIGIvZHJpdmVycy9pbmZpbmliYW5kL2NvcmUvY21hLmMKQEAgLTYzLDYgKzYzLDcgQEAKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgaWJfc2FfY2xpZW50IHNhX2NsaWVudDsKK3N0YXRpYyBzdHJ1Y3QgcmRtYV9hZGRyX2NsaWVudCBhZGRyX2NsaWVudDsKIHN0YXRpYyBMSVNUX0hFQUQoZGV2X2xpc3QpOwogc3RhdGljIExJU1RfSEVBRChsaXN0ZW5fYW55X2xpc3QpOwogc3RhdGljIERFRklORV9NVVRFWChsb2NrKTsKQEAgLTE2MjUsOCArMTYyNiw4IEBACiAJaWYgKGNtYV9hbnlfYWRkcihkc3RfYWRkcikpCiAJCXJldCA9IGNtYV9yZXNvbHZlX2xvb3BiYWNrKGlkX3ByaXYpOwogCWVsc2UKLQkJcmV0ID0gcmRtYV9yZXNvbHZlX2lwKCZpZC0+cm91dGUuYWRkci5zcmNfYWRkciwgZHN0X2FkZHIsCi0JCQkJICAgICAgJmlkLT5yb3V0ZS5hZGRyLmRldl9hZGRyLAorCQlyZXQgPSByZG1hX3Jlc29sdmVfaXAoJmFkZHJfY2xpZW50LCAmaWQtPnJvdXRlLmFkZHIuc3JjX2FkZHIsCisJCQkJICAgICAgZHN0X2FkZHIsICZpZC0+cm91dGUuYWRkci5kZXZfYWRkciwKIAkJCQkgICAgICB0aW1lb3V0X21zLCBhZGRyX2hhbmRsZXIsIGlkX3ByaXYpOwogCWlmIChyZXQpCiAJCWdvdG8gZXJyOwpAQCAtMTc2MiwyMiArMTc2MywyOSBAQAogCiAJaWYgKCFjbWFfYW55X2FkZHIoYWRkcikpIHsKIAkJcmV0ID0gcmRtYV90cmFuc2xhdGVfaXAoYWRkciwgJmlkLT5yb3V0ZS5hZGRyLmRldl9hZGRyKTsKLQkJaWYgKCFyZXQpIHsKLQkJCW11dGV4X2xvY2soJmxvY2spOwotCQkJcmV0ID0gY21hX2FjcXVpcmVfZGV2KGlkX3ByaXYpOwotCQkJbXV0ZXhfdW5sb2NrKCZsb2NrKTsKLQkJfQogCQlpZiAocmV0KQotCQkJZ290byBlcnI7CisJCQlnb3RvIGVycjE7CisKKwkJbXV0ZXhfbG9jaygmbG9jayk7CisJCXJldCA9IGNtYV9hY3F1aXJlX2RldihpZF9wcml2KTsKKwkJbXV0ZXhfdW5sb2NrKCZsb2NrKTsKKwkJaWYgKHJldCkKKwkJCWdvdG8gZXJyMTsKIAl9CiAKIAltZW1jcHkoJmlkLT5yb3V0ZS5hZGRyLnNyY19hZGRyLCBhZGRyLCBpcF9hZGRyX3NpemUoYWRkcikpOwogCXJldCA9IGNtYV9nZXRfcG9ydChpZF9wcml2KTsKIAlpZiAocmV0KQotCQlnb3RvIGVycjsKKwkJZ290byBlcnIyOwogCiAJcmV0dXJuIDA7Ci1lcnI6CitlcnIyOgorCWlmICghY21hX2FueV9hZGRyKGFkZHIpKSB7CisJCW11dGV4X2xvY2soJmxvY2spOworCQljbWFfZGV0YWNoX2Zyb21fZGV2KGlkX3ByaXYpOworCQltdXRleF91bmxvY2soJmxvY2spOworCX0KK2VycjE6CiAJY21hX2NvbXBfZXhjaChpZF9wcml2LCBDTUFfQUREUl9CT1VORCwgQ01BX0lETEUpOwogCXJldHVybiByZXQ7CiB9CkBAIC0yMjEwLDYgKzIyMTgsNyBAQAogCQlyZXR1cm4gLUVOT01FTTsKIAogCWliX3NhX3JlZ2lzdGVyX2NsaWVudCgmc2FfY2xpZW50KTsKKwlyZG1hX2FkZHJfcmVnaXN0ZXJfY2xpZW50KCZhZGRyX2NsaWVudCk7CiAKIAlyZXQgPSBpYl9yZWdpc3Rlcl9jbGllbnQoJmNtYV9jbGllbnQpOwogCWlmIChyZXQpCkBAIC0yMjE3LDYgKzIyMjYsNyBAQAogCXJldHVybiAwOwogCiBlcnI6CisJcmRtYV9hZGRyX3VucmVnaXN0ZXJfY2xpZW50KCZhZGRyX2NsaWVudCk7CiAJaWJfc2FfdW5yZWdpc3Rlcl9jbGllbnQoJnNhX2NsaWVudCk7CiAJZGVzdHJveV93b3JrcXVldWUoY21hX3dxKTsKIAlyZXR1cm4gcmV0OwpAQCAtMjIyNSw2ICsyMjM1LDcgQEAKIHN0YXRpYyB2b2lkIGNtYV9jbGVhbnVwKHZvaWQpCiB7CiAJaWJfdW5yZWdpc3Rlcl9jbGllbnQoJmNtYV9jbGllbnQpOworCXJkbWFfYWRkcl91bnJlZ2lzdGVyX2NsaWVudCgmYWRkcl9jbGllbnQpOwogCWliX3NhX3VucmVnaXN0ZXJfY2xpZW50KCZzYV9jbGllbnQpOwogCWRlc3Ryb3lfd29ya3F1ZXVlKGNtYV93cSk7CiAJaWRyX2Rlc3Ryb3koJnNkcF9wcyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvY29yZS9tYWQuYyBiL2RyaXZlcnMvaW5maW5pYmFuZC9jb3JlL21hZC5jCmluZGV4IDQ5M2Y0YzYuLmE3MmJjZWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5maW5pYmFuZC9jb3JlL21hZC5jCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC9jb3JlL21hZC5jCkBAIC0xNzUwLDcgKzE3NTAsNyBAQAogCQkgICAgICovCiAJCSAgICAoaXNfZGlyZWN0KHdjLT5yZWN2X2J1Zi5tYWQtPm1hZF9oZHIubWdtdF9jbGFzcykgfHwKIAkJICAgICByY3ZfaGFzX3NhbWVfZ2lkKG1hZF9hZ2VudF9wcml2LCB3ciwgd2MpKSkKLQkJCXJldHVybiB3cjsKKwkJCXJldHVybiAod3ItPnN0YXR1cyA9PSBJQl9XQ19TVUNDRVNTKSA/IHdyIDogTlVMTDsKIAl9CiAKIAkvKgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbmZpbmliYW5kL2NvcmUvdXZlcmJzX2NtZC5jIGIvZHJpdmVycy9pbmZpbmliYW5kL2NvcmUvdXZlcmJzX2NtZC5jCmluZGV4IGI3MmM3ZjYuLjc0MzI0N2UgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5maW5pYmFuZC9jb3JlL3V2ZXJic19jbWQuYworKysgYi9kcml2ZXJzL2luZmluaWJhbmQvY29yZS91dmVyYnNfY21kLmMKQEAgLTEyMTQsNyArMTIxNCw3IEBACiAJcmVzcC5xcF9hY2Nlc3NfZmxhZ3MgICAgICAgID0gYXR0ci0+cXBfYWNjZXNzX2ZsYWdzOwogCXJlc3AucGtleV9pbmRleCAgICAgICAgICAgICA9IGF0dHItPnBrZXlfaW5kZXg7CiAJcmVzcC5hbHRfcGtleV9pbmRleCAgICAgICAgID0gYXR0ci0+YWx0X3BrZXlfaW5kZXg7Ci0JcmVzcC5lbl9zcWRfYXN5bmNfbm90aWZ5ICAgID0gYXR0ci0+ZW5fc3FkX2FzeW5jX25vdGlmeTsKKwlyZXNwLnNxX2RyYWluaW5nICAgICAgICAgICAgPSBhdHRyLT5zcV9kcmFpbmluZzsKIAlyZXNwLm1heF9yZF9hdG9taWMgICAgICAgICAgPSBhdHRyLT5tYXhfcmRfYXRvbWljOwogCXJlc3AubWF4X2Rlc3RfcmRfYXRvbWljICAgICA9IGF0dHItPm1heF9kZXN0X3JkX2F0b21pYzsKIAlyZXNwLm1pbl9ybnJfdGltZXIgICAgICAgICAgPSBhdHRyLT5taW5fcm5yX3RpbWVyOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L2Ftc28xMTAwL2MyLmMgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvYW1zbzExMDAvYzIuYwppbmRleCBkYzFlYmVhLi4yN2ZlMjQyIDEwMDY0NAotLS0gYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvYW1zbzExMDAvYzIuYworKysgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvYW1zbzExMDAvYzIuYwpAQCAtMTE1NSw3ICsxMTU1LDggQEAKIAkJZ290byBiYWlsMTA7CiAJfQogCi0JYzJfcmVnaXN0ZXJfZGV2aWNlKGMyZGV2KTsKKwlpZiAoYzJfcmVnaXN0ZXJfZGV2aWNlKGMyZGV2KSkKKwkJZ290byBiYWlsMTA7CiAKIAlyZXR1cm4gMDsKIApAQCAtMTI0Myw3ICsxMjQ0LDcgQEAKIAogc3RhdGljIGludCBfX2luaXQgYzJfaW5pdF9tb2R1bGUodm9pZCkKIHsKLQlyZXR1cm4gcGNpX21vZHVsZV9pbml0KCZjMl9wY2lfZHJpdmVyKTsKKwlyZXR1cm4gcGNpX3JlZ2lzdGVyX2RyaXZlcigmYzJfcGNpX2RyaXZlcik7CiB9CiAKIHN0YXRpYyB2b2lkIF9fZXhpdCBjMl9leGl0X21vZHVsZSh2b2lkKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L2Ftc28xMTAwL2MyX2FsbG9jLmMgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvYW1zbzExMDAvYzJfYWxsb2MuYwppbmRleCAwMjhhNjBiLi4wMzE1Zjk5IDEwMDY0NAotLS0gYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvYW1zbzExMDAvYzJfYWxsb2MuYworKysgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvYW1zbzExMDAvYzJfYWxsb2MuYwpAQCAtNDIsMTMgKzQyLDE0IEBACiB7CiAJaW50IGk7CiAJc3RydWN0IHNwX2NodW5rICpuZXdfaGVhZDsKKwlkbWFfYWRkcl90IGRtYV9hZGRyOwogCi0JbmV3X2hlYWQgPSAoc3RydWN0IHNwX2NodW5rICopIF9fZ2V0X2ZyZWVfcGFnZShnZnBfbWFzayk7CisJbmV3X2hlYWQgPSBkbWFfYWxsb2NfY29oZXJlbnQoJmMyZGV2LT5wY2lkZXYtPmRldiwgUEFHRV9TSVpFLAorCQkJCSAgICAgICZkbWFfYWRkciwgZ2ZwX21hc2spOwogCWlmIChuZXdfaGVhZCA9PSBOVUxMKQogCQlyZXR1cm4gLUVOT01FTTsKIAotCW5ld19oZWFkLT5kbWFfYWRkciA9IGRtYV9tYXBfc2luZ2xlKGMyZGV2LT5pYmRldi5kbWFfZGV2aWNlLCBuZXdfaGVhZCwKLQkJCQkJICAgIFBBR0VfU0laRSwgRE1BX0ZST01fREVWSUNFKTsKKwluZXdfaGVhZC0+ZG1hX2FkZHIgPSBkbWFfYWRkcjsKIAlwY2lfdW5tYXBfYWRkcl9zZXQobmV3X2hlYWQsIG1hcHBpbmcsIG5ld19oZWFkLT5kbWFfYWRkcik7CiAKIAluZXdfaGVhZC0+bmV4dCA9IE5VTEw7CkBAIC04MCwxMCArODEsOCBAQAogCiAJd2hpbGUgKHJvb3QpIHsKIAkJbmV4dCA9IHJvb3QtPm5leHQ7Ci0JCWRtYV91bm1hcF9zaW5nbGUoYzJkZXYtPmliZGV2LmRtYV9kZXZpY2UsCi0JCQkJIHBjaV91bm1hcF9hZGRyKHJvb3QsIG1hcHBpbmcpLCBQQUdFX1NJWkUsCi0JCQkgICAgICAgICBETUFfRlJPTV9ERVZJQ0UpOwotCQlfX2ZyZWVfcGFnZSgoc3RydWN0IHBhZ2UgKikgcm9vdCk7CisJCWRtYV9mcmVlX2NvaGVyZW50KCZjMmRldi0+cGNpZGV2LT5kZXYsIFBBR0VfU0laRSwgcm9vdCwKKwkJCQkgIHBjaV91bm1hcF9hZGRyKHJvb3QsIG1hcHBpbmcpKTsKIAkJcm9vdCA9IG5leHQ7CiAJfQogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L2Ftc28xMTAwL2MyX2NxLmMgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvYW1zbzExMDAvYzJfY3EuYwppbmRleCA5ZDdiY2M1Li4wNWM5MTU0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvYW1zbzExMDAvYzJfY3EuYworKysgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvYW1zbzExMDAvYzJfY3EuYwpAQCAtMjQ2LDIwICsyNDYsMTcgQEAKIAogc3RhdGljIHZvaWQgYzJfZnJlZV9jcV9idWYoc3RydWN0IGMyX2RldiAqYzJkZXYsIHN0cnVjdCBjMl9tcSAqbXEpCiB7Ci0KLQlkbWFfdW5tYXBfc2luZ2xlKGMyZGV2LT5pYmRldi5kbWFfZGV2aWNlLCBwY2lfdW5tYXBfYWRkcihtcSwgbWFwcGluZyksCi0JCQkgbXEtPnFfc2l6ZSAqIG1xLT5tc2dfc2l6ZSwgRE1BX0ZST01fREVWSUNFKTsKLQlmcmVlX3BhZ2VzKCh1bnNpZ25lZCBsb25nKSBtcS0+bXNnX3Bvb2wuaG9zdCwKLQkJICAgZ2V0X29yZGVyKG1xLT5xX3NpemUgKiBtcS0+bXNnX3NpemUpKTsKKwlkbWFfZnJlZV9jb2hlcmVudCgmYzJkZXYtPnBjaWRldi0+ZGV2LCBtcS0+cV9zaXplICogbXEtPm1zZ19zaXplLAorCQkJICBtcS0+bXNnX3Bvb2wuaG9zdCwgcGNpX3VubWFwX2FkZHIobXEsIG1hcHBpbmcpKTsKIH0KIAogc3RhdGljIGludCBjMl9hbGxvY19jcV9idWYoc3RydWN0IGMyX2RldiAqYzJkZXYsIHN0cnVjdCBjMl9tcSAqbXEsIGludCBxX3NpemUsCiAJCQkgICBpbnQgbXNnX3NpemUpCiB7Ci0JdW5zaWduZWQgbG9uZyBwb29sX3N0YXJ0OworCXU4ICpwb29sX3N0YXJ0OwogCi0JcG9vbF9zdGFydCA9IF9fZ2V0X2ZyZWVfcGFnZXMoR0ZQX0tFUk5FTCwKLQkJCQkgICAgICBnZXRfb3JkZXIocV9zaXplICogbXNnX3NpemUpKTsKKwlwb29sX3N0YXJ0ID0gZG1hX2FsbG9jX2NvaGVyZW50KCZjMmRldi0+cGNpZGV2LT5kZXYsIHFfc2l6ZSAqIG1zZ19zaXplLAorCQkJCQkmbXEtPmhvc3RfZG1hLCBHRlBfS0VSTkVMKTsKIAlpZiAoIXBvb2xfc3RhcnQpCiAJCXJldHVybiAtRU5PTUVNOwogCkBAIC0yNjcsMTMgKzI2NCwxMCBAQAogCQkgICAgICAgMCwJCS8qIGluZGV4IChjdXJyZW50bHkgdW5rbm93bikgKi8KIAkJICAgICAgIHFfc2l6ZSwKIAkJICAgICAgIG1zZ19zaXplLAotCQkgICAgICAgKHU4ICopIHBvb2xfc3RhcnQsCisJCSAgICAgICBwb29sX3N0YXJ0LAogCQkgICAgICAgTlVMTCwJLyogcGVlciAoY3VycmVudGx5IHVua25vd24pICovCiAJCSAgICAgICBDMl9NUV9IT1NUX1RBUkdFVCk7CiAKLQltcS0+aG9zdF9kbWEgPSBkbWFfbWFwX3NpbmdsZShjMmRldi0+aWJkZXYuZG1hX2RldmljZSwKLQkJCQkgICAgICAodm9pZCAqKXBvb2xfc3RhcnQsCi0JCQkJICAgICAgcV9zaXplICogbXNnX3NpemUsIERNQV9GUk9NX0RFVklDRSk7CiAJcGNpX3VubWFwX2FkZHJfc2V0KG1xLCBtYXBwaW5nLCBtcS0+aG9zdF9kbWEpOwogCiAJcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvYW1zbzExMDAvYzJfcHJvdmlkZXIuYyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9hbXNvMTEwMC9jMl9wcm92aWRlci5jCmluZGV4IGRhOThkOWYuLmZlZjk3MjcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9hbXNvMTEwMC9jMl9wcm92aWRlci5jCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9hbXNvMTEwMC9jMl9wcm92aWRlci5jCkBAIC03NTcsMjAgKzc1NywxNyBAQAogCiBpbnQgYzJfcmVnaXN0ZXJfZGV2aWNlKHN0cnVjdCBjMl9kZXYgKmRldikKIHsKLQlpbnQgcmV0OworCWludCByZXQgPSAtRU5PTUVNOwogCWludCBpOwogCiAJLyogUmVnaXN0ZXIgcHNldWRvIG5ldHdvcmsgZGV2aWNlICovCiAJZGV2LT5wc2V1ZG9fbmV0ZGV2ID0gYzJfcHNldWRvX25ldGRldl9pbml0KGRldik7Ci0JaWYgKGRldi0+cHNldWRvX25ldGRldikgewotCQlyZXQgPSByZWdpc3Rlcl9uZXRkZXYoZGV2LT5wc2V1ZG9fbmV0ZGV2KTsKLQkJaWYgKHJldCkgewotCQkJcHJpbnRrKEtFUk5fRVJSIFBGWAotCQkJCSJVbmFibGUgdG8gcmVnaXN0ZXIgbmV0ZGV2LCByZXQgPSAlZFxuIiwgcmV0KTsKLQkJCWZyZWVfbmV0ZGV2KGRldi0+cHNldWRvX25ldGRldik7Ci0JCQlyZXR1cm4gcmV0OwotCQl9Ci0JfQorCWlmICghZGV2LT5wc2V1ZG9fbmV0ZGV2KQorCQlnb3RvIG91dDM7CisKKwlyZXQgPSByZWdpc3Rlcl9uZXRkZXYoZGV2LT5wc2V1ZG9fbmV0ZGV2KTsKKwlpZiAocmV0KQorCQlnb3RvIG91dDI7CiAKIAlwcl9kZWJ1ZygiJXM6JXVcbiIsIF9fRlVOQ1RJT05fXywgX19MSU5FX18pOwogCXN0cmxjcHkoZGV2LT5pYmRldi5uYW1lLCAiYW1zbyVkIiwgSUJfREVWSUNFX05BTUVfTUFYKTsKQEAgLTg0OCwyMSArODQ1LDI1IEBACiAKIAlyZXQgPSBpYl9yZWdpc3Rlcl9kZXZpY2UoJmRldi0+aWJkZXYpOwogCWlmIChyZXQpCi0JCXJldHVybiByZXQ7CisJCWdvdG8gb3V0MTsKIAogCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGMyX2NsYXNzX2F0dHJpYnV0ZXMpOyArK2kpIHsKIAkJcmV0ID0gY2xhc3NfZGV2aWNlX2NyZWF0ZV9maWxlKCZkZXYtPmliZGV2LmNsYXNzX2RldiwKIAkJCQkJICAgICAgIGMyX2NsYXNzX2F0dHJpYnV0ZXNbaV0pOwotCQlpZiAocmV0KSB7Ci0JCQl1bnJlZ2lzdGVyX25ldGRldihkZXYtPnBzZXVkb19uZXRkZXYpOwotCQkJZnJlZV9uZXRkZXYoZGV2LT5wc2V1ZG9fbmV0ZGV2KTsKLQkJCWliX3VucmVnaXN0ZXJfZGV2aWNlKCZkZXYtPmliZGV2KTsKLQkJCXJldHVybiByZXQ7Ci0JCX0KKwkJaWYgKHJldCkKKwkJCWdvdG8gb3V0MDsKIAl9CisJZ290byBvdXQzOwogCi0JcHJfZGVidWcoIiVzOiV1XG4iLCBfX0ZVTkNUSU9OX18sIF9fTElORV9fKTsKLQlyZXR1cm4gMDsKK291dDA6CisJaWJfdW5yZWdpc3Rlcl9kZXZpY2UoJmRldi0+aWJkZXYpOworb3V0MToKKwl1bnJlZ2lzdGVyX25ldGRldihkZXYtPnBzZXVkb19uZXRkZXYpOworb3V0MjoKKwlmcmVlX25ldGRldihkZXYtPnBzZXVkb19uZXRkZXYpOworb3V0MzoKKwlwcl9kZWJ1ZygiJXM6JXUgcmV0PSVkXG4iLCBfX0ZVTkNUSU9OX18sIF9fTElORV9fLCByZXQpOworCXJldHVybiByZXQ7CiB9CiAKIHZvaWQgYzJfdW5yZWdpc3Rlcl9kZXZpY2Uoc3RydWN0IGMyX2RldiAqZGV2KQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L2Ftc28xMTAwL2MyX3JuaWMuYyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9hbXNvMTEwMC9jMl9ybmljLmMKaW5kZXggZTM3YzU2OC4uNjIzZGM5NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L2Ftc28xMTAwL2MyX3JuaWMuYworKysgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvYW1zbzExMDAvYzJfcm5pYy5jCkBAIC0xNTAsMTUgKzE1MCwxNSBAQAogCSAgICAoc3RydWN0IGMyd3Jfcm5pY19xdWVyeV9yZXAgKikgKHVuc2lnbmVkIGxvbmcpICh2cV9yZXEtPnJlcGx5X21zZyk7CiAJaWYgKCFyZXBseSkKIAkJZXJyID0gLUVOT01FTTsKLQotCWVyciA9IGMyX2Vycm5vKHJlcGx5KTsKKwllbHNlCisJCWVyciA9IGMyX2Vycm5vKHJlcGx5KTsKIAlpZiAoZXJyKQogCQlnb3RvIGJhaWwyOwogCiAJcHJvcHMtPmZ3X3ZlciA9CiAJCSgodTY0KWJlMzJfdG9fY3B1KHJlcGx5LT5md192ZXJfbWFqb3IpIDw8IDMyKSB8Ci0JCSgoYmUzMl90b19jcHUocmVwbHktPmZ3X3Zlcl9taW5vcikgJiYgMHhGRkZGKSA8PCAxNikgfAotCQkoYmUzMl90b19jcHUocmVwbHktPmZ3X3Zlcl9wYXRjaCkgJiYgMHhGRkZGKTsKKwkJKChiZTMyX3RvX2NwdShyZXBseS0+ZndfdmVyX21pbm9yKSAmIDB4RkZGRikgPDwgMTYpIHwKKwkJKGJlMzJfdG9fY3B1KHJlcGx5LT5md192ZXJfcGF0Y2gpICYgMHhGRkZGKTsKIAltZW1jcHkoJnByb3BzLT5zeXNfaW1hZ2VfZ3VpZCwgYzJkZXYtPm5ldGRldi0+ZGV2X2FkZHIsIDYpOwogCXByb3BzLT5tYXhfbXJfc2l6ZSAgICAgICAgID0gMHhGRkZGRkZGRjsKIAlwcm9wcy0+cGFnZV9zaXplX2NhcCAgICAgICA9IH4oQzJfTUlOX1BBR0VTSVpFLTEpOwpAQCAtNTE3LDE0ICs1MTcsMTIgQEAKIAkvKiBJbml0aWFsaXplIHRoZSBWZXJicyBSZXBseSBRdWV1ZSAqLwogCXFzaXplID0gYmUzMl90b19jcHUocmVhZGwobW1pb19yZWdzICsgQzJfUkVHU19RMV9RU0laRSkpOwogCW1zZ3NpemUgPSBiZTMyX3RvX2NwdShyZWFkbChtbWlvX3JlZ3MgKyBDMl9SRUdTX1ExX01TR1NJWkUpKTsKLQlxMV9wYWdlcyA9IGttYWxsb2MocXNpemUgKiBtc2dzaXplLCBHRlBfS0VSTkVMKTsKKwlxMV9wYWdlcyA9IGRtYV9hbGxvY19jb2hlcmVudCgmYzJkZXYtPnBjaWRldi0+ZGV2LCBxc2l6ZSAqIG1zZ3NpemUsCisJCQkJICAgICAgJmMyZGV2LT5yZXBfdnEuaG9zdF9kbWEsIEdGUF9LRVJORUwpOwogCWlmICghcTFfcGFnZXMpIHsKIAkJZXJyID0gLUVOT01FTTsKIAkJZ290byBiYWlsMTsKIAl9Ci0JYzJkZXYtPnJlcF92cS5ob3N0X2RtYSA9IGRtYV9tYXBfc2luZ2xlKGMyZGV2LT5pYmRldi5kbWFfZGV2aWNlLAotCQkJCQkgICAgICAgICh2b2lkICopcTFfcGFnZXMsIHFzaXplICogbXNnc2l6ZSwKLQkJCQkgICAgICAJCURNQV9GUk9NX0RFVklDRSk7CiAJcGNpX3VubWFwX2FkZHJfc2V0KCZjMmRldi0+cmVwX3ZxLCBtYXBwaW5nLCBjMmRldi0+cmVwX3ZxLmhvc3RfZG1hKTsKIAlwcl9kZWJ1ZygiJXMgcmVwX3ZxIHZhICVwIGRtYSAlbGx4XG4iLCBfX0ZVTkNUSU9OX18sIHExX3BhZ2VzLAogCQkgKHVuc2lnbmVkIGxvbmcgbG9uZykgYzJkZXYtPnJlcF92cS5ob3N0X2RtYSk7CkBAIC01NDAsMTcgKzUzOCwxNSBAQAogCS8qIEluaXRpYWxpemUgdGhlIEFzeW5jaHJvbnVzIEV2ZW50IFF1ZXVlICovCiAJcXNpemUgPSBiZTMyX3RvX2NwdShyZWFkbChtbWlvX3JlZ3MgKyBDMl9SRUdTX1EyX1FTSVpFKSk7CiAJbXNnc2l6ZSA9IGJlMzJfdG9fY3B1KHJlYWRsKG1taW9fcmVncyArIEMyX1JFR1NfUTJfTVNHU0laRSkpOwotCXEyX3BhZ2VzID0ga21hbGxvYyhxc2l6ZSAqIG1zZ3NpemUsIEdGUF9LRVJORUwpOworCXEyX3BhZ2VzID0gZG1hX2FsbG9jX2NvaGVyZW50KCZjMmRldi0+cGNpZGV2LT5kZXYsIHFzaXplICogbXNnc2l6ZSwKKwkJCQkgICAgICAmYzJkZXYtPmFlcS5ob3N0X2RtYSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFxMl9wYWdlcykgewogCQllcnIgPSAtRU5PTUVNOwogCQlnb3RvIGJhaWwyOwogCX0KLQljMmRldi0+YWVxLmhvc3RfZG1hID0gZG1hX21hcF9zaW5nbGUoYzJkZXYtPmliZGV2LmRtYV9kZXZpY2UsCi0JCQkJCSAgICAgICAgKHZvaWQgKilxMl9wYWdlcywgcXNpemUgKiBtc2dzaXplLAotCQkJCSAgICAgIAkJRE1BX0ZST01fREVWSUNFKTsKIAlwY2lfdW5tYXBfYWRkcl9zZXQoJmMyZGV2LT5hZXEsIG1hcHBpbmcsIGMyZGV2LT5hZXEuaG9zdF9kbWEpOwotCXByX2RlYnVnKCIlcyBhZXEgdmEgJXAgZG1hICVsbHhcbiIsIF9fRlVOQ1RJT05fXywgcTFfcGFnZXMsCi0JCSAodW5zaWduZWQgbG9uZyBsb25nKSBjMmRldi0+cmVwX3ZxLmhvc3RfZG1hKTsKKwlwcl9kZWJ1ZygiJXMgYWVxIHZhICVwIGRtYSAlbGx4XG4iLCBfX0ZVTkNUSU9OX18sIHEyX3BhZ2VzLAorCQkgKHVuc2lnbmVkIGxvbmcgbG9uZykgYzJkZXYtPmFlcS5ob3N0X2RtYSk7CiAJYzJfbXFfcmVwX2luaXQoJmMyZGV2LT5hZXEsCiAJCSAgICAgICAyLAogCQkgICAgICAgcXNpemUsCkBAIC01OTcsMTcgKzU5MywxMyBAQAogICAgICAgYmFpbDQ6CiAJdnFfdGVybShjMmRldik7CiAgICAgICBiYWlsMzoKLQlkbWFfdW5tYXBfc2luZ2xlKGMyZGV2LT5pYmRldi5kbWFfZGV2aWNlLAotCQkJIHBjaV91bm1hcF9hZGRyKCZjMmRldi0+YWVxLCBtYXBwaW5nKSwKLQkJCSBjMmRldi0+YWVxLnFfc2l6ZSAqIGMyZGV2LT5hZXEubXNnX3NpemUsCi0JCSAgCSBETUFfRlJPTV9ERVZJQ0UpOwotCWtmcmVlKHEyX3BhZ2VzKTsKKwlkbWFfZnJlZV9jb2hlcmVudCgmYzJkZXYtPnBjaWRldi0+ZGV2LAorCQkJICBjMmRldi0+YWVxLnFfc2l6ZSAqIGMyZGV2LT5hZXEubXNnX3NpemUsCisJCQkgIHEyX3BhZ2VzLCBwY2lfdW5tYXBfYWRkcigmYzJkZXYtPmFlcSwgbWFwcGluZykpOwogICAgICAgYmFpbDI6Ci0JZG1hX3VubWFwX3NpbmdsZShjMmRldi0+aWJkZXYuZG1hX2RldmljZSwKLQkJCSBwY2lfdW5tYXBfYWRkcigmYzJkZXYtPnJlcF92cSwgbWFwcGluZyksCi0JCQkgYzJkZXYtPnJlcF92cS5xX3NpemUgKiBjMmRldi0+cmVwX3ZxLm1zZ19zaXplLAotCQkgIAkgRE1BX0ZST01fREVWSUNFKTsKLQlrZnJlZShxMV9wYWdlcyk7CisJZG1hX2ZyZWVfY29oZXJlbnQoJmMyZGV2LT5wY2lkZXYtPmRldiwKKwkJCSAgYzJkZXYtPnJlcF92cS5xX3NpemUgKiBjMmRldi0+cmVwX3ZxLm1zZ19zaXplLAorCQkJICBxMV9wYWdlcywgcGNpX3VubWFwX2FkZHIoJmMyZGV2LT5yZXBfdnEsIG1hcHBpbmcpKTsKICAgICAgIGJhaWwxOgogCWMyX2ZyZWVfbXFzcF9wb29sKGMyZGV2LCBjMmRldi0+a2Vybl9tcXNwX3Bvb2wpOwogICAgICAgYmFpbDA6CkBAIC02NDAsMTkgKzYzMiwxNyBAQAogCS8qIEZyZWUgdGhlIHZlcmJzIHJlcXVlc3QgYWxsb2NhdG9yICovCiAJdnFfdGVybShjMmRldik7CiAKLQkvKiBVbm1hcCBhbmQgZnJlZSB0aGUgYXN5bmNocm9udXMgZXZlbnQgcXVldWUgKi8KLQlkbWFfdW5tYXBfc2luZ2xlKGMyZGV2LT5pYmRldi5kbWFfZGV2aWNlLAotCQkJIHBjaV91bm1hcF9hZGRyKCZjMmRldi0+YWVxLCBtYXBwaW5nKSwKLQkJCSBjMmRldi0+YWVxLnFfc2l6ZSAqIGMyZGV2LT5hZXEubXNnX3NpemUsCi0JCSAgCSBETUFfRlJPTV9ERVZJQ0UpOwotCWtmcmVlKGMyZGV2LT5hZXEubXNnX3Bvb2wuaG9zdCk7CisJLyogRnJlZSB0aGUgYXN5bmNocm9udXMgZXZlbnQgcXVldWUgKi8KKwlkbWFfZnJlZV9jb2hlcmVudCgmYzJkZXYtPnBjaWRldi0+ZGV2LAorCQkJICBjMmRldi0+YWVxLnFfc2l6ZSAqIGMyZGV2LT5hZXEubXNnX3NpemUsCisJCQkgIGMyZGV2LT5hZXEubXNnX3Bvb2wuaG9zdCwKKwkJCSAgcGNpX3VubWFwX2FkZHIoJmMyZGV2LT5hZXEsIG1hcHBpbmcpKTsKIAotCS8qIFVubWFwIGFuZCBmcmVlIHRoZSB2ZXJicyByZXBseSBxdWV1ZSAqLwotCWRtYV91bm1hcF9zaW5nbGUoYzJkZXYtPmliZGV2LmRtYV9kZXZpY2UsCi0JCQkgcGNpX3VubWFwX2FkZHIoJmMyZGV2LT5yZXBfdnEsIG1hcHBpbmcpLAotCQkJIGMyZGV2LT5yZXBfdnEucV9zaXplICogYzJkZXYtPnJlcF92cS5tc2dfc2l6ZSwKLQkJICAJIERNQV9GUk9NX0RFVklDRSk7Ci0Ja2ZyZWUoYzJkZXYtPnJlcF92cS5tc2dfcG9vbC5ob3N0KTsKKwkvKiBGcmVlIHRoZSB2ZXJicyByZXBseSBxdWV1ZSAqLworCWRtYV9mcmVlX2NvaGVyZW50KCZjMmRldi0+cGNpZGV2LT5kZXYsCisJCQkgIGMyZGV2LT5yZXBfdnEucV9zaXplICogYzJkZXYtPnJlcF92cS5tc2dfc2l6ZSwKKwkJCSAgYzJkZXYtPnJlcF92cS5tc2dfcG9vbC5ob3N0LAorCQkJICBwY2lfdW5tYXBfYWRkcigmYzJkZXYtPnJlcF92cSwgbWFwcGluZykpOwogCiAJLyogRnJlZSB0aGUgTVEgc2hhcmVkIHBvaW50ZXIgcG9vbCAqLwogCWMyX2ZyZWVfbXFzcF9wb29sKGMyZGV2LCBjMmRldi0+a2Vybl9tcXNwX3Bvb2wpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L2VoY2EvS2NvbmZpZyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9laGNhL0tjb25maWcKaW5kZXggOTIyMzg5Yi4uNzI3YjEwZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L2VoY2EvS2NvbmZpZworKysgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvZWhjYS9LY29uZmlnCkBAIC0xMCw2ICsxMCw3IEBACiBjb25maWcgSU5GSU5JQkFORF9FSENBX1NDQUxJTkcKIAlib29sICJTY2FsaW5nIHN1cHBvcnQgKEVYUEVSSU1FTlRBTCkiCiAJZGVwZW5kcyBvbiBJQk1FQlVTICYmIElORklOSUJBTkRfRUhDQSAmJiBIT1RQTFVHX0NQVSAmJiBFWFBFUklNRU5UQUwKKwlkZWZhdWx0IHkKIAktLS1oZWxwLS0tCiAJZUhDQSBzY2FsaW5nIHN1cHBvcnQgc2NoZWR1bGVzIHRoZSBDUSBjYWxsYmFja3MgdG8gZGlmZmVyZW50IENQVXMuCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9laGNhL2VoY2FfYXYuYyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9laGNhL2VoY2FfYXYuYwppbmRleCAzYmFjMTk3Li4yMTRlMmZkIDEwMDY0NAotLS0gYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvZWhjYS9laGNhX2F2LmMKKysrIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L2VoY2EvZWhjYV9hdi5jCkBAIC0xMTgsOCArMTE4LDcgQEAKIAkJfQogCQltZW1jcHkoJmF2LT5hdi5ncmgud29yZF8xLCAmZ2lkLCBzaXplb2YoZ2lkKSk7CiAJfQotCS8qIGZvciB0aGUgdGltZSBiZWluZyB3ZSB1c2UgYSBoYXJkIGNvZGVkIFBNVFUgb2YgMjA0OCBCeXRlcyAqLwotCWF2LT5hdi5wbXR1ID0gNDsKKwlhdi0+YXYucG10dSA9IEVIQ0FfTUFYX01UVTsKIAogCS8qIGRnaWQgY29tZXMgaW4gZ3JoLndvcmRfMyAqLwogCW1lbWNweSgmYXYtPmF2LmdyaC53b3JkXzMsICZhaF9hdHRyLT5ncmguZGdpZCwKQEAgLTE5Myw3ICsxOTIsNyBAQAogCQltZW1jcHkoJm5ld19laGNhX2F2LmdyaC53b3JkXzEsICZnaWQsIHNpemVvZihnaWQpKTsKIAl9CiAKLQluZXdfZWhjYV9hdi5wbXR1ID0gNDsgLyogc2VlIGFsc28gY29tbWVudCBpbiBjcmVhdGVfYWgoKSAqLworCW5ld19laGNhX2F2LnBtdHUgPSBFSENBX01BWF9NVFU7CiAKIAltZW1jcHkoJm5ld19laGNhX2F2LmdyaC53b3JkXzMsICZhaF9hdHRyLT5ncmguZGdpZCwKIAkgICAgICAgc2l6ZW9mKGFoX2F0dHItPmdyaC5kZ2lkKSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvZWhjYS9laGNhX2hjYS5jIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L2VoY2EvZWhjYV9oY2EuYwppbmRleCA1ZWFlNmFjLi5lMWI2MThjIDEwMDY0NAotLS0gYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvZWhjYS9laGNhX2hjYS5jCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9laGNhL2VoY2FfaGNhLmMKQEAgLTQwLDYgKzQwLDcgQEAKICAqLwogCiAjaW5jbHVkZSAiZWhjYV90b29scy5oIgorI2luY2x1ZGUgImVoY2FfaXZlcmJzLmgiCiAjaW5jbHVkZSAiaGNwX2lmLmgiCiAKIGludCBlaGNhX3F1ZXJ5X2RldmljZShzdHJ1Y3QgaWJfZGV2aWNlICppYmRldiwgc3RydWN0IGliX2RldmljZV9hdHRyICpwcm9wcykKQEAgLTQ5LDcgKzUwLDcgQEAKIAkJCQkJICAgICAgaWJfZGV2aWNlKTsKIAlzdHJ1Y3QgaGlwel9xdWVyeV9oY2EgKnJibG9jazsKIAotCXJibG9jayA9IGt6YWxsb2MoSF9DQl9BTElHTk1FTlQsIEdGUF9LRVJORUwpOworCXJibG9jayA9IGVoY2FfYWxsb2NfZndfY3RybGJsb2NrKCk7CiAJaWYgKCFyYmxvY2spIHsKIAkJZWhjYV9lcnIoJnNoY2EtPmliX2RldmljZSwgIkNhbid0IGFsbG9jYXRlIHJibG9jayBtZW1vcnkuIik7CiAJCXJldHVybiAtRU5PTUVNOwpAQCAtOTYsNyArOTcsNyBAQAogCQk9IG1pbl90KGludCwgcmJsb2NrLT5tYXhfdG90YWxfbWNhc3RfcXBfYXR0YWNoLCBJTlRfTUFYKTsKIAogcXVlcnlfZGV2aWNlMToKLQlrZnJlZShyYmxvY2spOworCWVoY2FfZnJlZV9md19jdHJsYmxvY2socmJsb2NrKTsKIAogCXJldHVybiByZXQ7CiB9CkBAIC0xMDksNyArMTEwLDcgQEAKIAkJCQkJICAgICAgaWJfZGV2aWNlKTsKIAlzdHJ1Y3QgaGlwel9xdWVyeV9wb3J0ICpyYmxvY2s7CiAKLQlyYmxvY2sgPSBremFsbG9jKEhfQ0JfQUxJR05NRU5ULCBHRlBfS0VSTkVMKTsKKwlyYmxvY2sgPSBlaGNhX2FsbG9jX2Z3X2N0cmxibG9jaygpOwogCWlmICghcmJsb2NrKSB7CiAJCWVoY2FfZXJyKCZzaGNhLT5pYl9kZXZpY2UsICJDYW4ndCBhbGxvY2F0ZSByYmxvY2sgbWVtb3J5LiIpOwogCQlyZXR1cm4gLUVOT01FTTsKQEAgLTE2Miw3ICsxNjMsNyBAQAogCXByb3BzLT5hY3RpdmVfc3BlZWQgICAgPSAweDE7CiAKIHF1ZXJ5X3BvcnQxOgotCWtmcmVlKHJibG9jayk7CisJZWhjYV9mcmVlX2Z3X2N0cmxibG9jayhyYmxvY2spOwogCiAJcmV0dXJuIHJldDsKIH0KQEAgLTE3OCw3ICsxNzksNyBAQAogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKLQlyYmxvY2sgPSBremFsbG9jKEhfQ0JfQUxJR05NRU5ULCBHRlBfS0VSTkVMKTsKKwlyYmxvY2sgPSBlaGNhX2FsbG9jX2Z3X2N0cmxibG9jaygpOwogCWlmICghcmJsb2NrKSB7CiAJCWVoY2FfZXJyKCZzaGNhLT5pYl9kZXZpY2UsICAiQ2FuJ3QgYWxsb2NhdGUgcmJsb2NrIG1lbW9yeS4iKTsKIAkJcmV0dXJuIC1FTk9NRU07CkBAIC0xOTMsNyArMTk0LDcgQEAKIAltZW1jcHkocGtleSwgJnJibG9jay0+cGtleV9lbnRyaWVzICsgaW5kZXgsIHNpemVvZih1MTYpKTsKIAogcXVlcnlfcGtleTE6Ci0Ja2ZyZWUocmJsb2NrKTsKKwllaGNhX2ZyZWVfZndfY3RybGJsb2NrKHJibG9jayk7CiAKIAlyZXR1cm4gcmV0OwogfQpAQCAtMjExLDcgKzIxMiw3IEBACiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAotCXJibG9jayA9IGt6YWxsb2MoSF9DQl9BTElHTk1FTlQsIEdGUF9LRVJORUwpOworCXJibG9jayA9IGVoY2FfYWxsb2NfZndfY3RybGJsb2NrKCk7CiAJaWYgKCFyYmxvY2spIHsKIAkJZWhjYV9lcnIoJnNoY2EtPmliX2RldmljZSwgIkNhbid0IGFsbG9jYXRlIHJibG9jayBtZW1vcnkuIik7CiAJCXJldHVybiAtRU5PTUVNOwpAQCAtMjI3LDcgKzIyOCw3IEBACiAJbWVtY3B5KCZnaWQtPnJhd1s4XSwgJnJibG9jay0+Z3VpZF9lbnRyaWVzW2luZGV4XSwgc2l6ZW9mKHU2NCkpOwogCiBxdWVyeV9naWQxOgotCWtmcmVlKHJibG9jayk7CisJZWhjYV9mcmVlX2Z3X2N0cmxibG9jayhyYmxvY2spOwogCiAJcmV0dXJuIHJldDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9laGNhL2VoY2FfaXJxLmMgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvZWhjYS9laGNhX2lycS5jCmluZGV4IDA0OGNjNDQuLmMzZWE3NDYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9laGNhL2VoY2FfaXJxLmMKKysrIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L2VoY2EvZWhjYV9pcnEuYwpAQCAtNDUsNiArNDUsNyBAQAogI2luY2x1ZGUgImVoY2FfdG9vbHMuaCIKICNpbmNsdWRlICJoY3BfaWYuaCIKICNpbmNsdWRlICJoaXB6X2Zucy5oIgorI2luY2x1ZGUgImlwel9wdF9mbi5oIgogCiAjZGVmaW5lIEVRRV9DT01QTEVUSU9OX0VWRU5UICAgRUhDQV9CTUFTS19JQk0oMSwxKQogI2RlZmluZSBFUUVfQ1FfUVBfTlVNQkVSICAgICAgIEVIQ0FfQk1BU0tfSUJNKDgsMzEpCkBAIC0xMzcsMzggKzEzOCwzNiBAQAogCXU2NCAqcmJsb2NrOwogCXVuc2lnbmVkIGxvbmcgYmxvY2tfY291bnQ7CiAKLQlyYmxvY2sgPSBremFsbG9jKEhfQ0JfQUxJR05NRU5ULCBHRlBfS0VSTkVMKTsKKwlyYmxvY2sgPSBlaGNhX2FsbG9jX2Z3X2N0cmxibG9jaygpOwogCWlmICghcmJsb2NrKSB7CiAJCWVoY2FfZXJyKCZzaGNhLT5pYl9kZXZpY2UsICJDYW5ub3QgYWxsb2NhdGUgcmJsb2NrIG1lbW9yeS4iKTsKIAkJcmV0ID0gLUVOT01FTTsKIAkJZ290byBlcnJvcl9kYXRhMTsKIAl9CiAKKwkvKiByYmxvY2sgbXVzdCBiZSA0SyBhbGlnbmVkIGFuZCBzaG91bGQgYmUgNEsgbGFyZ2UgKi8KIAlyZXQgPSBoaXB6X2hfZXJyb3JfZGF0YShzaGNhLT5pcHpfaGNhX2hhbmRsZSwKIAkJCQlyZXNvdXJjZSwKIAkJCQlyYmxvY2ssCiAJCQkJJmJsb2NrX2NvdW50KTsKIAotCWlmIChyZXQgPT0gSF9SX1NUQVRFKSB7CisJaWYgKHJldCA9PSBIX1JfU1RBVEUpCiAJCWVoY2FfZXJyKCZzaGNhLT5pYl9kZXZpY2UsCiAJCQkgIk5vIGVycm9yIGRhdGEgaXMgYXZhaWxhYmxlOiAlbHguIiwgcmVzb3VyY2UpOwotCX0KIAllbHNlIGlmIChyZXQgPT0gSF9TVUNDRVNTKSB7CiAJCWludCBsZW5ndGg7CiAKIAkJbGVuZ3RoID0gRUhDQV9CTUFTS19HRVQoRVJST1JfREFUQV9MRU5HVEgsIHJibG9ja1swXSk7CiAKLQkJaWYgKGxlbmd0aCA+IFBBR0VfU0laRSkKLQkJCWxlbmd0aCA9IFBBR0VfU0laRTsKKwkJaWYgKGxlbmd0aCA+IEVIQ0FfUEFHRVNJWkUpCisJCQlsZW5ndGggPSBFSENBX1BBR0VTSVpFOwogCiAJCXByaW50X2Vycm9yX2RhdGEoc2hjYSwgZGF0YSwgcmJsb2NrLCBsZW5ndGgpOwotCX0KLQllbHNlIHsKKwl9IGVsc2UKIAkJZWhjYV9lcnIoJnNoY2EtPmliX2RldmljZSwKIAkJCSAiRXJyb3IgZGF0YSBjb3VsZCBub3QgYmUgZmV0Y2hlZDogJWx4IiwgcmVzb3VyY2UpOwotCX0KIAotCWtmcmVlKHJibG9jayk7CisJZWhjYV9mcmVlX2Z3X2N0cmxibG9jayhyYmxvY2spOwogCiBlcnJvcl9kYXRhMToKIAlyZXR1cm4gcmV0OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L2VoY2EvZWhjYV9pdmVyYnMuaCBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9laGNhL2VoY2FfaXZlcmJzLmgKaW5kZXggMzE5YzM5ZC4uMzcyMGUzMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L2VoY2EvZWhjYV9pdmVyYnMuaAorKysgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvZWhjYS9laGNhX2l2ZXJicy5oCkBAIC0xNzksNCArMTc5LDEyIEBACiAKIGludCBlaGNhX211bm1hcCh1bnNpZ25lZCBsb25nIGFkZHIsIHNpemVfdCBsZW4pOwogCisjaWZkZWYgQ09ORklHX1BQQ182NEtfUEFHRVMKK3ZvaWQgKmVoY2FfYWxsb2NfZndfY3RybGJsb2NrKHZvaWQpOwordm9pZCBlaGNhX2ZyZWVfZndfY3RybGJsb2NrKHZvaWQgKnB0cik7CisjZWxzZQorI2RlZmluZSBlaGNhX2FsbG9jX2Z3X2N0cmxibG9jaygpICgodm9pZCAqKSBnZXRfemVyb2VkX3BhZ2UoR0ZQX0tFUk5FTCkpCisjZGVmaW5lIGVoY2FfZnJlZV9md19jdHJsYmxvY2socHRyKSBmcmVlX3BhZ2UoKHVuc2lnbmVkIGxvbmcpKHB0cikpCisjZW5kaWYKKwogI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvZWhjYS9laGNhX21haW4uYyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9laGNhL2VoY2FfbWFpbi5jCmluZGV4IDAyNGQ1MTEuLjAxZjVhYTkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9laGNhL2VoY2FfbWFpbi5jCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9laGNhL2VoY2FfbWFpbi5jCkBAIC00MCw2ICs0MCw5IEBACiAgKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KICAqLwogCisjaWZkZWYgQ09ORklHX1BQQ182NEtfUEFHRVMKKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjZW5kaWYKICNpbmNsdWRlICJlaGNhX2NsYXNzZXMuaCIKICNpbmNsdWRlICJlaGNhX2l2ZXJicy5oIgogI2luY2x1ZGUgImVoY2FfbXJtdy5oIgpAQCAtNDksNyArNTIsNyBAQAogTU9EVUxFX0xJQ0VOU0UoIkR1YWwgQlNEL0dQTCIpOwogTU9EVUxFX0FVVEhPUigiQ2hyaXN0b3BoIFJhaXNjaCA8cmFpc2NoQGRlLmlibS5jb20+Iik7CiBNT0RVTEVfREVTQ1JJUFRJT04oIklCTSBlU2VydmVyIEhDQSBJbmZpbmlCYW5kIERldmljZSBEcml2ZXIiKTsKLU1PRFVMRV9WRVJTSU9OKCJTVk5FSENBXzAwMTciKTsKK01PRFVMRV9WRVJTSU9OKCJTVk5FSENBXzAwMTgiKTsKIAogaW50IGVoY2Ffb3Blbl9hcXAxICAgICA9IDA7CiBpbnQgZWhjYV9kZWJ1Z19sZXZlbCAgID0gMDsKQEAgLTk0LDExICs5NywzMSBAQAogREVGSU5FX0lEUihlaGNhX3FwX2lkcik7CiBERUZJTkVfSURSKGVoY2FfY3FfaWRyKTsKIAorCiBzdGF0aWMgc3RydWN0IGxpc3RfaGVhZCBzaGNhX2xpc3Q7IC8qIGxpc3Qgb2YgYWxsIHJlZ2lzdGVyZWQgZWhjYXMgKi8KIHN0YXRpYyBzcGlubG9ja190IHNoY2FfbGlzdF9sb2NrOwogCiBzdGF0aWMgc3RydWN0IHRpbWVyX2xpc3QgcG9sbF9lcXNfdGltZXI7CiAKKyNpZmRlZiBDT05GSUdfUFBDXzY0S19QQUdFUworc3RhdGljIHN0cnVjdCBrbWVtX2NhY2hlICpjdGJsa19jYWNoZSA9IE5VTEw7CisKK3ZvaWQgKmVoY2FfYWxsb2NfZndfY3RybGJsb2NrKHZvaWQpCit7CisJdm9pZCAqcmV0ID0ga21lbV9jYWNoZV96YWxsb2MoY3RibGtfY2FjaGUsIFNMQUJfS0VSTkVMKTsKKwlpZiAoIXJldCkKKwkJZWhjYV9nZW5fZXJyKCJPdXQgb2YgbWVtb3J5IGZvciBjdGJsayIpOworCXJldHVybiByZXQ7Cit9CisKK3ZvaWQgZWhjYV9mcmVlX2Z3X2N0cmxibG9jayh2b2lkICpwdHIpCit7CisJaWYgKHB0cikKKwkJa21lbV9jYWNoZV9mcmVlKGN0YmxrX2NhY2hlLCBwdHIpOworCit9CisjZW5kaWYKKwogc3RhdGljIGludCBlaGNhX2NyZWF0ZV9zbGFiX2NhY2hlcyh2b2lkKQogewogCWludCByZXQ7CkBAIC0xMzMsNiArMTU2LDE3IEBACiAJCWdvdG8gY3JlYXRlX3NsYWJfY2FjaGVzNTsKIAl9CiAKKyNpZmRlZiBDT05GSUdfUFBDXzY0S19QQUdFUworCWN0YmxrX2NhY2hlID0ga21lbV9jYWNoZV9jcmVhdGUoImVoY2FfY2FjaGVfY3RibGsiLAorCQkJCQlFSENBX1BBR0VTSVpFLCBIX0NCX0FMSUdOTUVOVCwKKwkJCQkJU0xBQl9IV0NBQ0hFX0FMSUdOLAorCQkJCQlOVUxMLCBOVUxMKTsKKwlpZiAoIWN0YmxrX2NhY2hlKSB7CisJCWVoY2FfZ2VuX2VycigiQ2Fubm90IGNyZWF0ZSBjdGJsayBTTEFCIGNhY2hlLiIpOworCQllaGNhX2NsZWFudXBfbXJtd19jYWNoZSgpOworCQlnb3RvIGNyZWF0ZV9zbGFiX2NhY2hlczU7CisJfQorI2VuZGlmCiAJcmV0dXJuIDA7CiAKIGNyZWF0ZV9zbGFiX2NhY2hlczU6CkBAIC0xNTcsNiArMTkxLDEwIEBACiAJZWhjYV9jbGVhbnVwX3FwX2NhY2hlKCk7CiAJZWhjYV9jbGVhbnVwX2NxX2NhY2hlKCk7CiAJZWhjYV9jbGVhbnVwX3BkX2NhY2hlKCk7CisjaWZkZWYgQ09ORklHX1BQQ182NEtfUEFHRVMKKwlpZiAoY3RibGtfY2FjaGUpCisJCWttZW1fY2FjaGVfZGVzdHJveShjdGJsa19jYWNoZSk7CisjZW5kaWYKIH0KIAogI2RlZmluZSBFSENBX0hDQUFWRVIgIEVIQ0FfQk1BU0tfSUJNKDMyLDM5KQpAQCAtMTY4LDcgKzIwNiw3IEBACiAJdTY0IGhfcmV0OwogCXN0cnVjdCBoaXB6X3F1ZXJ5X2hjYSAqcmJsb2NrOwogCi0JcmJsb2NrID0ga3phbGxvYyhIX0NCX0FMSUdOTUVOVCwgR0ZQX0tFUk5FTCk7CisJcmJsb2NrID0gZWhjYV9hbGxvY19md19jdHJsYmxvY2soKTsKIAlpZiAoIXJibG9jaykgewogCQllaGNhX2dlbl9lcnIoIkNhbm5vdCBhbGxvY2F0ZSByYmxvY2sgbWVtb3J5LiIpOwogCQlyZXR1cm4gLUVOT01FTTsKQEAgLTIxMSw3ICsyNDksNyBAQAogCXNoY2EtPnNwb3J0WzFdLnJhdGUgPSBJQl9SQVRFXzMwX0dCUFM7CiAKIG51bV9wb3J0czE6Ci0Ja2ZyZWUocmJsb2NrKTsKKwllaGNhX2ZyZWVfZndfY3RybGJsb2NrKHJibG9jayk7CiAJcmV0dXJuIHJldDsKIH0KIApAQCAtMjIwLDcgKzI1OCw3IEBACiAJaW50IHJldCA9IDA7CiAJc3RydWN0IGhpcHpfcXVlcnlfaGNhICpyYmxvY2s7CiAKLQlyYmxvY2sgPSBremFsbG9jKEhfQ0JfQUxJR05NRU5ULCBHRlBfS0VSTkVMKTsKKwlyYmxvY2sgPSBlaGNhX2FsbG9jX2Z3X2N0cmxibG9jaygpOwogCWlmICghcmJsb2NrKSB7CiAJCWVoY2FfZXJyKCZzaGNhLT5pYl9kZXZpY2UsICJDYW4ndCBhbGxvY2F0ZSByYmxvY2sgbWVtb3J5LiIpOwogCQlyZXR1cm4gLUVOT01FTTsKQEAgLTIzNSw3ICsyNzMsNyBAQAogCW1lbWNweSgmc2hjYS0+aWJfZGV2aWNlLm5vZGVfZ3VpZCwgJnJibG9jay0+bm9kZV9ndWlkLCBzaXplb2YodTY0KSk7CiAKIGluaXRfbm9kZV9ndWlkMToKLQlrZnJlZShyYmxvY2spOworCWVoY2FfZnJlZV9md19jdHJsYmxvY2socmJsb2NrKTsKIAlyZXR1cm4gcmV0OwogfQogCkBAIC00MzEsNyArNDY5LDcgQEAKIAkJCQkJCQkJCSAgIFwKIAlzaGNhID0gZGV2LT5kcml2ZXJfZGF0YTsJCQkJCSAgIFwKIAkJCQkJCQkJCSAgIFwKLQlyYmxvY2sgPSBremFsbG9jKEhfQ0JfQUxJR05NRU5ULCBHRlBfS0VSTkVMKTsJCQkgICBcCisJcmJsb2NrID0gZWhjYV9hbGxvY19md19jdHJsYmxvY2soKTsJCQkJICAgXAogCWlmICghcmJsb2NrKSB7CQkJCQkJICAgICAgICAgICBcCiAJCWRldl9lcnIoZGV2LCAiQ2FuJ3QgYWxsb2NhdGUgcmJsb2NrIG1lbW9yeS4iKTsJCSAgIFwKIAkJcmV0dXJuIDA7CQkJCQkJICAgXApAQCAtNDM5LDEyICs0NzcsMTIgQEAKIAkJCQkJCQkJCSAgIFwKIAlpZiAoaGlwel9oX3F1ZXJ5X2hjYShzaGNhLT5pcHpfaGNhX2hhbmRsZSwgcmJsb2NrKSAhPSBIX1NVQ0NFU1MpIHsgXAogCQlkZXZfZXJyKGRldiwgIkNhbid0IHF1ZXJ5IGRldmljZSBwcm9wZXJ0aWVzIik7CSAgIAkgICBcCi0JCWtmcmVlKHJibG9jayk7CQkJCQkgICAJICAgXAorCQllaGNhX2ZyZWVfZndfY3RybGJsb2NrKHJibG9jayk7CQkJICAgCSAgIFwKIAkJcmV0dXJuIDA7CQkJCQkgICAJICAgXAogCX0JCQkJCQkJCSAgIFwKIAkJCQkJCQkJCSAgIFwKIAlkYXRhID0gcmJsb2NrLT5uYW1lOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCWtmcmVlKHJibG9jayk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJZWhjYV9mcmVlX2Z3X2N0cmxibG9jayhyYmxvY2spOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKIAkJCQkJCQkJCSAgIFwKIAlpZiAoKHN0cmNtcCgjbmFtZSwgIm51bV9wb3J0cyIpID09IDApICYmIChlaGNhX25yX3BvcnRzID09IDEpKQkgICBcCiAJCXJldHVybiBzbnByaW50ZihidWYsIDI1NiwgIjFcbiIpOwkJCSAgIFwKQEAgLTc1Miw3ICs3OTAsNyBAQAogCWludCByZXQ7CiAKIAlwcmludGsoS0VSTl9JTkZPICJlSENBIEluZmluaWJhbmQgRGV2aWNlIERyaXZlciAiCi0JICAgICAgICAgICAgICAgICAiKFJlbC46IFNWTkVIQ0FfMDAxNylcbiIpOworCSAgICAgICAgICAgICAgICAgIihSZWwuOiBTVk5FSENBXzAwMTgpXG4iKTsKIAlpZHJfaW5pdCgmZWhjYV9xcF9pZHIpOwogCWlkcl9pbml0KCZlaGNhX2NxX2lkcik7CiAJc3Bpbl9sb2NrX2luaXQoJmVoY2FfcXBfaWRyX2xvY2spOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L2VoY2EvZWhjYV9tcm13LmMgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvZWhjYS9laGNhX21ybXcuYwppbmRleCA1Y2E2NTQ0Li5hYmNlNjc2IDEwMDY0NAotLS0gYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvZWhjYS9laGNhX21ybXcuYworKysgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvZWhjYS9laGNhX21ybXcuYwpAQCAtMTAxMyw3ICsxMDEzLDcgQEAKIAl1MzIgaTsKIAl1NjQgKmtwYWdlOwogCi0Ja3BhZ2UgPSBremFsbG9jKEhfQ0JfQUxJR05NRU5ULCBHRlBfS0VSTkVMKTsKKwlrcGFnZSA9IGVoY2FfYWxsb2NfZndfY3RybGJsb2NrKCk7CiAJaWYgKCFrcGFnZSkgewogCQllaGNhX2Vycigmc2hjYS0+aWJfZGV2aWNlLCAia3BhZ2UgYWxsb2MgZmFpbGVkIik7CiAJCXJldCA9IC1FTk9NRU07CkBAIC0xMDkyLDcgKzEwOTIsNyBAQAogCiAKIGVoY2FfcmVnX21yX3JwYWdlc19leGl0MToKLQlrZnJlZShrcGFnZSk7CisJZWhjYV9mcmVlX2Z3X2N0cmxibG9jayhrcGFnZSk7CiBlaGNhX3JlZ19tcl9ycGFnZXNfZXhpdDA6CiAJaWYgKHJldCkKIAkJZWhjYV9lcnIoJnNoY2EtPmliX2RldmljZSwgInJldD0leCBzaGNhPSVwIGVfbXI9JXAgcGdpbmZvPSVwICIKQEAgLTExMjQsNyArMTEyNCw3IEBACiAJZWhjYV9tcm13X21hcF9hY2woYWNsLCAmaGlwel9hY2wpOwogCWVoY2FfbXJtd19zZXRfcGdzaXplX2hpcHpfYWNsKCZoaXB6X2FjbCk7CiAKLQlrcGFnZSA9IGt6YWxsb2MoSF9DQl9BTElHTk1FTlQsIEdGUF9LRVJORUwpOworCWtwYWdlID0gZWhjYV9hbGxvY19md19jdHJsYmxvY2soKTsKIAlpZiAoIWtwYWdlKSB7CiAJCWVoY2FfZXJyKCZzaGNhLT5pYl9kZXZpY2UsICJrcGFnZSBhbGxvYyBmYWlsZWQiKTsKIAkJcmV0ID0gLUVOT01FTTsKQEAgLTExODEsNyArMTE4MSw3IEBACiAJfQogCiBlaGNhX3JlcmVnX21yX3JlcmVnMV9leGl0MToKLQlrZnJlZShrcGFnZSk7CisJZWhjYV9mcmVlX2Z3X2N0cmxibG9jayhrcGFnZSk7CiBlaGNhX3JlcmVnX21yX3JlcmVnMV9leGl0MDoKIAlpZiAoIHJldCAmJiAocmV0ICE9IC1FQUdBSU4pICkKIAkJZWhjYV9lcnIoJnNoY2EtPmliX2RldmljZSwgInJldD0leCBsa2V5PSV4IHJrZXk9JXggIgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L2VoY2EvZWhjYV9xcC5jIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L2VoY2EvZWhjYV9xcC5jCmluZGV4IDQzOTQxMjMuLmNmM2U1MGUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9laGNhL2VoY2FfcXAuYworKysgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvZWhjYS9laGNhX3FwLmMKQEAgLTgxMSw4ICs4MTEsOCBAQAogCXVuc2lnbmVkIGxvbmcgc3BsX2ZsYWdzID0gMDsKIAogCS8qIGRvIHF1ZXJ5X3FwIHRvIG9idGFpbiBjdXJyZW50IGF0dHIgdmFsdWVzICovCi0JbXFwY2IgPSBremFsbG9jKEhfQ0JfQUxJR05NRU5ULCBHRlBfS0VSTkVMKTsKLQlpZiAobXFwY2IgPT0gTlVMTCkgeworCW1xcGNiID0gZWhjYV9hbGxvY19md19jdHJsYmxvY2soKTsKKwlpZiAoIW1xcGNiKSB7CiAJCWVoY2FfZXJyKGlicXAtPmRldmljZSwgIkNvdWxkIG5vdCBnZXQgemVyb2VkIHBhZ2UgZm9yIG1xcGNiICIKIAkJCSAiZWhjYV9xcD0lcCBxcF9udW09JXggIiwgbXlfcXAsIGlicXAtPnFwX251bSk7CiAJCXJldHVybiAtRU5PTUVNOwpAQCAtMTIyNSw3ICsxMjI1LDcgQEAKIAl9CiAKIG1vZGlmeV9xcF9leGl0MToKLQlrZnJlZShtcXBjYik7CisJZWhjYV9mcmVlX2Z3X2N0cmxibG9jayhtcXBjYik7CiAKIAlyZXR1cm4gcmV0OwogfQpAQCAtMTI3Nyw3ICsxMjc3LDcgQEAKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCi0JcXBjYiA9IGt6YWxsb2MoSF9DQl9BTElHTk1FTlQsIEdGUF9LRVJORUwgKTsKKwlxcGNiID0gZWhjYV9hbGxvY19md19jdHJsYmxvY2soKTsKIAlpZiAoIXFwY2IpIHsKIAkJZWhjYV9lcnIocXAtPmRldmljZSwiT3V0IG9mIG1lbW9yeSBmb3IgcXBjYiAiCiAJCQkgImVoY2FfcXA9JXAgcXBfbnVtPSV4IiwgbXlfcXAsIHFwLT5xcF9udW0pOwpAQCAtMTQwMSw3ICsxNDAxLDcgQEAKIAkJZWhjYV9kbXAocXBjYiwgNCo3MCwgInFwX251bT0leCIsIHFwLT5xcF9udW0pOwogCiBxdWVyeV9xcF9leGl0MToKLQlrZnJlZShxcGNiKTsKKwllaGNhX2ZyZWVfZndfY3RybGJsb2NrKHFwY2IpOwogCiAJcmV0dXJuIHJldDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9laGNhL2VoY2FfdG9vbHMuaCBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9laGNhL2VoY2FfdG9vbHMuaAppbmRleCA4MDlkYTNlLi45NzNjNGI1IDEwMDY0NAotLS0gYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvZWhjYS9laGNhX3Rvb2xzLmgKKysrIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L2VoY2EvZWhjYV90b29scy5oCkBAIC02Myw2ICs2Myw3IEBACiAjaW5jbHVkZSA8YXNtL2libWVidXMuaD4KICNpbmNsdWRlIDxhc20vaW8uaD4KICNpbmNsdWRlIDxhc20vcGd0YWJsZS5oPgorI2luY2x1ZGUgPGFzbS9odmNhbGwuaD4KIAogZXh0ZXJuIGludCBlaGNhX2RlYnVnX2xldmVsOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvZWhjYS9oaXB6X2h3LmggYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvZWhjYS9oaXB6X2h3LmgKaW5kZXggM2ZjOTJiMC4uZmFkOTEzNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L2VoY2EvaGlwel9ody5oCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9laGNhL2hpcHpfaHcuaApAQCAtNDUsNiArNDUsOCBAQAogCiAjaW5jbHVkZSAiZWhjYV90b29scy5oIgogCisjZGVmaW5lIEVIQ0FfTUFYX01UVSA0CisKIC8qIFFQIFRhYmxlIEVudHJ5IE1lbW9yeSBNYXAgKi8KIHN0cnVjdCBoaXB6X3FwdGVtbSB7CiAJdTY0IHFweF9oY3I7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvaXBhdGgvS2NvbmZpZyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9pcGF0aC9LY29uZmlnCmluZGV4IDU3NGE2NzguLjkwYzE0NTQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9pcGF0aC9LY29uZmlnCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9pcGF0aC9LY29uZmlnCkBAIC0xLDYgKzEsNiBAQAogY29uZmlnIElORklOSUJBTkRfSVBBVEgKIAl0cmlzdGF0ZSAiUUxvZ2ljIEluZmluaVBhdGggRHJpdmVyIgotCWRlcGVuZHMgb24gUENJX01TSSAmJiA2NEJJVCAmJiBJTkZJTklCQU5ECisJZGVwZW5kcyBvbiAoUENJX01TSSB8fCBIVF9JUlEpICYmIDY0QklUICYmIElORklOSUJBTkQgJiYgTkVUCiAJLS0taGVscC0tLQogCVRoaXMgaXMgYSBkcml2ZXIgZm9yIFFMb2dpYyBJbmZpbmlQYXRoIGhvc3QgY2hhbm5lbCBhZGFwdGVycywKIAlpbmNsdWRpbmcgSW5maW5pQmFuZCB2ZXJicyBzdXBwb3J0LiAgVGhpcyBkcml2ZXIgYWxsb3dzIHRoZXNlCmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvaXBhdGgvTWFrZWZpbGUgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvaXBhdGgvTWFrZWZpbGUKaW5kZXggNWUyOWNiMC4uN2RjMTA1NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L2lwYXRoL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9pcGF0aC9NYWtlZmlsZQpAQCAtMTAsOCArMTAsNiBAQAogCWlwYXRoX2VlcHJvbS5vIFwKIAlpcGF0aF9maWxlX29wcy5vIFwKIAlpcGF0aF9mcy5vIFwKLQlpcGF0aF9pYmE2MTEwLm8gXAotCWlwYXRoX2liYTYxMjAubyBcCiAJaXBhdGhfaW5pdF9jaGlwLm8gXAogCWlwYXRoX2ludHIubyBcCiAJaXBhdGhfa2V5cy5vIFwKQEAgLTMxLDUgKzI5LDggQEAKIAlpcGF0aF92ZXJic19tY2FzdC5vIFwKIAlpcGF0aF92ZXJicy5vCiAKK2liX2lwYXRoLSQoQ09ORklHX0hUX0lSUSkgKz0gaXBhdGhfaWJhNjExMC5vCitpYl9pcGF0aC0kKENPTkZJR19QQ0lfTVNJKSArPSBpcGF0aF9pYmE2MTIwLm8KKwogaWJfaXBhdGgtJChDT05GSUdfWDg2XzY0KSArPSBpcGF0aF93Y194ODZfNjQubwogaWJfaXBhdGgtJChDT05GSUdfUFBDNjQpICs9IGlwYXRoX3djX3BwYzY0Lm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9pcGF0aC9pcGF0aF9kaWFnLmMgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvaXBhdGgvaXBhdGhfZGlhZy5jCmluZGV4IDI5OTU4YjYuLjI4YzA4N2IgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9pcGF0aC9pcGF0aF9kaWFnLmMKKysrIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L2lwYXRoL2lwYXRoX2RpYWcuYwpAQCAtNjcsMTkgKzY3LDU0IEBACiAJLnJlbGVhc2UgPSBpcGF0aF9kaWFnX3JlbGVhc2UKIH07CiAKK3N0YXRpYyBzc2l6ZV90IGlwYXRoX2RpYWdwa3Rfd3JpdGUoc3RydWN0IGZpbGUgKmZwLAorCQkJCSAgIGNvbnN0IGNoYXIgX191c2VyICpkYXRhLAorCQkJCSAgIHNpemVfdCBjb3VudCwgbG9mZl90ICpvZmYpOworCitzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBkaWFncGt0X2ZpbGVfb3BzID0geworCS5vd25lciA9IFRISVNfTU9EVUxFLAorCS53cml0ZSA9IGlwYXRoX2RpYWdwa3Rfd3JpdGUsCit9OworCitzdGF0aWMgYXRvbWljX3QgZGlhZ3BrdF9jb3VudCA9IEFUT01JQ19JTklUKDApOworc3RhdGljIHN0cnVjdCBjZGV2ICpkaWFncGt0X2NkZXY7CitzdGF0aWMgc3RydWN0IGNsYXNzX2RldmljZSAqZGlhZ3BrdF9jbGFzc19kZXY7CisKIGludCBpcGF0aF9kaWFnX2FkZChzdHJ1Y3QgaXBhdGhfZGV2ZGF0YSAqZGQpCiB7CiAJY2hhciBuYW1lWzE2XTsKKwlpbnQgcmV0ID0gMDsKKworCWlmIChhdG9taWNfaW5jX3JldHVybigmZGlhZ3BrdF9jb3VudCkgPT0gMSkgeworCQlyZXQgPSBpcGF0aF9jZGV2X2luaXQoSVBBVEhfRElBR1BLVF9NSU5PUiwKKwkJCQkgICAgICAiaXBhdGhfZGlhZ3BrdCIsICZkaWFncGt0X2ZpbGVfb3BzLAorCQkJCSAgICAgICZkaWFncGt0X2NkZXYsICZkaWFncGt0X2NsYXNzX2Rldik7CisKKwkJaWYgKHJldCkgeworCQkJaXBhdGhfZGV2X2VycihkZCwgIkNvdWxkbid0IGNyZWF0ZSBpcGF0aF9kaWFncGt0ICIKKwkJCQkgICAgICAiZGV2aWNlOiAlZCIsIHJldCk7CisJCQlnb3RvIGRvbmU7CisJCX0KKwl9CiAKIAlzbnByaW50ZihuYW1lLCBzaXplb2YobmFtZSksICJpcGF0aF9kaWFnJWQiLCBkZC0+aXBhdGhfdW5pdCk7CiAKLQlyZXR1cm4gaXBhdGhfY2Rldl9pbml0KElQQVRIX0RJQUdfTUlOT1JfQkFTRSArIGRkLT5pcGF0aF91bml0LCBuYW1lLAotCQkJICAgICAgICZkaWFnX2ZpbGVfb3BzLCAmZGQtPmRpYWdfY2RldiwKLQkJCSAgICAgICAmZGQtPmRpYWdfY2xhc3NfZGV2KTsKKwlyZXQgPSBpcGF0aF9jZGV2X2luaXQoSVBBVEhfRElBR19NSU5PUl9CQVNFICsgZGQtPmlwYXRoX3VuaXQsIG5hbWUsCisJCQkgICAgICAmZGlhZ19maWxlX29wcywgJmRkLT5kaWFnX2NkZXYsCisJCQkgICAgICAmZGQtPmRpYWdfY2xhc3NfZGV2KTsKKwlpZiAocmV0KQorCQlpcGF0aF9kZXZfZXJyKGRkLCAiQ291bGRuJ3QgY3JlYXRlICVzIGRldmljZTogJWQiLAorCQkJICAgICAgbmFtZSwgcmV0KTsKKworZG9uZToKKwlyZXR1cm4gcmV0OwogfQogCiB2b2lkIGlwYXRoX2RpYWdfcmVtb3ZlKHN0cnVjdCBpcGF0aF9kZXZkYXRhICpkZCkKIHsKKwlpZiAoYXRvbWljX2RlY19hbmRfdGVzdCgmZGlhZ3BrdF9jb3VudCkpCisJCWlwYXRoX2NkZXZfY2xlYW51cCgmZGlhZ3BrdF9jZGV2LCAmZGlhZ3BrdF9jbGFzc19kZXYpOworCiAJaXBhdGhfY2Rldl9jbGVhbnVwKCZkZC0+ZGlhZ19jZGV2LCAmZGQtPmRpYWdfY2xhc3NfZGV2KTsKIH0KIApAQCAtMjc1LDMwICszMTAsNiBAQAogCXJldHVybiByZXQ7CiB9CiAKLXN0YXRpYyBzc2l6ZV90IGlwYXRoX2RpYWdwa3Rfd3JpdGUoc3RydWN0IGZpbGUgKmZwLAotCQkJCSAgIGNvbnN0IGNoYXIgX191c2VyICpkYXRhLAotCQkJCSAgIHNpemVfdCBjb3VudCwgbG9mZl90ICpvZmYpOwotCi1zdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBkaWFncGt0X2ZpbGVfb3BzID0gewotCS5vd25lciA9IFRISVNfTU9EVUxFLAotCS53cml0ZSA9IGlwYXRoX2RpYWdwa3Rfd3JpdGUsCi19OwotCi1zdGF0aWMgc3RydWN0IGNkZXYgKmRpYWdwa3RfY2RldjsKLXN0YXRpYyBzdHJ1Y3QgY2xhc3NfZGV2aWNlICpkaWFncGt0X2NsYXNzX2RldjsKLQotaW50IF9faW5pdCBpcGF0aF9kaWFncGt0X2FkZCh2b2lkKQotewotCXJldHVybiBpcGF0aF9jZGV2X2luaXQoSVBBVEhfRElBR1BLVF9NSU5PUiwKLQkJCSAgICAgICAiaXBhdGhfZGlhZ3BrdCIsICZkaWFncGt0X2ZpbGVfb3BzLAotCQkJICAgICAgICZkaWFncGt0X2NkZXYsICZkaWFncGt0X2NsYXNzX2Rldik7Ci19Ci0KLXZvaWQgX19leGl0IGlwYXRoX2RpYWdwa3RfcmVtb3ZlKHZvaWQpCi17Ci0JaXBhdGhfY2Rldl9jbGVhbnVwKCZkaWFncGt0X2NkZXYsICZkaWFncGt0X2NsYXNzX2Rldik7Ci19Ci0KIC8qKgogICogaXBhdGhfZGlhZ3BrdF93cml0ZSAtIHdyaXRlIGFuIElCIHBhY2tldAogICogQGZwOiB0aGUgZGlhZyBkYXRhIGRldmljZSBmaWxlIHBvaW50ZXIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9pcGF0aC9pcGF0aF9kcml2ZXIuYyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9pcGF0aC9pcGF0aF9kcml2ZXIuYwppbmRleCAxMmNlZmE2Li4xYWVkZGI0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvaXBhdGgvaXBhdGhfZHJpdmVyLmMKKysrIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L2lwYXRoL2lwYXRoX2RyaXZlci5jCkBAIC0zMDQsNyArMzA0LDcgQEAKIAl9CiAJYWRkciA9IHBjaV9yZXNvdXJjZV9zdGFydChwZGV2LCAwKTsKIAlsZW4gPSBwY2lfcmVzb3VyY2VfbGVuKHBkZXYsIDApOwotCWlwYXRoX2NkYmcoVkVSQk9TRSwgInJlZ2Jhc2UgKDApICVsbHggbGVuICVkIGlycSAleCwgdmVuZCAleC8leCAiCisJaXBhdGhfY2RiZyhWRVJCT1NFLCAicmVnYmFzZSAoMCkgJWxseCBsZW4gJWQgcGRldi0+aXJxICVkLCB2ZW5kICV4LyV4ICIKIAkJICAgImRyaXZlcl9kYXRhICVseFxuIiwgYWRkciwgbGVuLCBwZGV2LT5pcnEsIGVudC0+dmVuZG9yLAogCQkgICBlbnQtPmRldmljZSwgZW50LT5kcml2ZXJfZGF0YSk7CiAKQEAgLTM5MCwxMiArMzkwLDE2IEBACiAKIAkvKiBzZXR1cCB0aGUgY2hpcC1zcGVjaWZpYyBmdW5jdGlvbnMsIGFzIGVhcmx5IGFzIHBvc3NpYmxlLiAqLwogCXN3aXRjaCAoZW50LT5kZXZpY2UpIHsKKyNpZmRlZiBDT05GSUdfSFRfSVJRCiAJY2FzZSBQQ0lfREVWSUNFX0lEX0lORklOSVBBVEhfSFQ6CiAJCWlwYXRoX2luaXRfaWJhNjExMF9mdW5jcyhkZCk7CiAJCWJyZWFrOworI2VuZGlmCisjaWZkZWYgQ09ORklHX1BDSV9NU0kKIAljYXNlIFBDSV9ERVZJQ0VfSURfSU5GSU5JUEFUSF9QRTgwMDoKIAkJaXBhdGhfaW5pdF9pYmE2MTIwX2Z1bmNzKGRkKTsKIAkJYnJlYWs7CisjZW5kaWYKIAlkZWZhdWx0OgogCQlpcGF0aF9kZXZfZXJyKGRkLCAiRm91bmQgdW5rbm93biBRTG9naWMgZGV2aWNlaWQgMHgleCwgIgogCQkJICAgICAgImZhaWxpbmdcbiIsIGVudC0+ZGV2aWNlKTsKQEAgLTQ2NywxNSArNDcxLDE1IEBACiAJICogY2hlY2sgMCBpcnEgYWZ0ZXIgd2UgcmV0dXJuIGZyb20gY2hpcC1zcGVjaWZpYyBidXMgc2V0dXAsIHNpbmNlCiAJICogdGhhdCBjYW4gYWZmZWN0IHRoaXMgZHVlIHRvIHNldHVwCiAJICovCi0JaWYgKCFwZGV2LT5pcnEpCisJaWYgKCFkZC0+aXBhdGhfaXJxKQogCQlpcGF0aF9kZXZfZXJyKGRkLCAiaXJxIGlzIDAsIEJJT1MgZXJyb3I/ICBJbnRlcnJ1cHRzIHdvbid0ICIKIAkJCSAgICAgICJ3b3JrXG4iKTsKIAllbHNlIHsKLQkJcmV0ID0gcmVxdWVzdF9pcnEocGRldi0+aXJxLCBpcGF0aF9pbnRyLCBJUlFGX1NIQVJFRCwKKwkJcmV0ID0gcmVxdWVzdF9pcnEoZGQtPmlwYXRoX2lycSwgaXBhdGhfaW50ciwgSVJRRl9TSEFSRUQsCiAJCQkJICBJUEFUSF9EUlZfTkFNRSwgZGQpOwogCQlpZiAocmV0KSB7CiAJCQlpcGF0aF9kZXZfZXJyKGRkLCAiQ291bGRuJ3Qgc2V0dXAgaXJxIGhhbmRsZXIsICIKLQkJCQkgICAgICAiaXJxPSV1OiAlZFxuIiwgcGRldi0+aXJxLCByZXQpOworCQkJCSAgICAgICJpcnE9JWQ6ICVkXG4iLCBkZC0+aXBhdGhfaXJxLCByZXQpOwogCQkJZ290byBiYWlsX2lvdW5tYXA7CiAJCX0KIAl9CkBAIC02MzcsMTEgKzY0MSwxMCBAQAogCSAqIGZyZWUgdXAgcG9ydCAwIChrZXJuZWwpIHJjdmhkciwgZWdyIGJ1ZnMsIGFuZCBldmVudHVhbGx5IHRpZCBidWZzCiAJICogZm9yIGFsbCB2ZXJzaW9ucyBvZiB0aGUgZHJpdmVyLCBpZiB0aGV5IHdlcmUgYWxsb2NhdGVkCiAJICovCi0JaWYgKHBkZXYtPmlycSkgewotCQlpcGF0aF9jZGJnKFZFUkJPU0UsCi0JCQkgICAidW5pdCAldSBmcmVlX2lycSBvZiBpcnEgJXhcbiIsCi0JCQkgICBkZC0+aXBhdGhfdW5pdCwgcGRldi0+aXJxKTsKLQkJZnJlZV9pcnEocGRldi0+aXJxLCBkZCk7CisJaWYgKGRkLT5pcGF0aF9pcnEpIHsKKwkJaXBhdGhfY2RiZyhWRVJCT1NFLCAidW5pdCAldSBmcmVlIGlycSAlZFxuIiwKKwkJCSAgIGRkLT5pcGF0aF91bml0LCBkZC0+aXBhdGhfaXJxKTsKKwkJZGQtPmlwYXRoX2ZfZnJlZV9pcnEoZGQpOwogCX0gZWxzZQogCQlpcGF0aF9kYmcoImlycSBpcyAwLCBub3QgZG9pbmcgZnJlZV9pcnEgIgogCQkJICAiZm9yIHVuaXQgJXVcbiIsIGRkLT5pcGF0aF91bml0KTsKQEAgLTIwMDUsMTggKzIwMDgsOCBAQAogCQlnb3RvIGJhaWxfZ3JvdXA7CiAJfQogCi0JcmV0ID0gaXBhdGhfZGlhZ3BrdF9hZGQoKTsKLQlpZiAocmV0IDwgMCkgewotCQlwcmludGsoS0VSTl9FUlIgSVBBVEhfRFJWX05BTUUgIjogVW5hYmxlIHRvIGNyZWF0ZSAiCi0JCSAgICAgICAiZGlhZyBkYXRhIGRldmljZTogZXJyb3IgJWRcbiIsIC1yZXQpOwotCQlnb3RvIGJhaWxfaXBhdGhmczsKLQl9Ci0KIAlnb3RvIGJhaWw7CiAKLWJhaWxfaXBhdGhmczoKLQlpcGF0aF9leGl0X2lwYXRoZnMoKTsKLQogYmFpbF9ncm91cDoKIAlpcGF0aF9kcml2ZXJfcmVtb3ZlX2dyb3VwKCZpcGF0aF9kcml2ZXIuZHJpdmVyKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L2lwYXRoL2lwYXRoX2liYTYxMTAuYyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9pcGF0aC9pcGF0aF9pYmE2MTEwLmMKaW5kZXggOWU0ZThkNC4uZTU3YzdhMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L2lwYXRoL2lwYXRoX2liYTYxMTAuYworKysgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvaXBhdGgvaXBhdGhfaWJhNjExMC5jCkBAIC0zOCw2ICszOCw3IEBACiAKICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2h0aXJxLmg+CiAKICNpbmNsdWRlICJpcGF0aF9rZXJuZWwuaCIKICNpbmNsdWRlICJpcGF0aF9yZWdpc3RlcnMuaCIKQEAgLTkxMyw0OSArOTE0LDQwIEBACiAJfQogfQogCi1zdGF0aWMgaW50IHNldF9pbnRfaGFuZGxlcihzdHJ1Y3QgaXBhdGhfZGV2ZGF0YSAqZGQsIHN0cnVjdCBwY2lfZGV2ICpwZGV2LAotCQkJICAgIGludCBwb3MpCitzdGF0aWMgaW50IGlwYXRoX2h0X2ludGNvbmZpZyhzdHJ1Y3QgaXBhdGhfZGV2ZGF0YSAqZGQpCiB7Ci0JdTMyIGludF9oYW5kbGVyX2FkZHJfbG93ZXI7Ci0JdTMyIGludF9oYW5kbGVyX2FkZHJfdXBwZXI7Ci0JdTY0IGloYW5kbGVyOwotCXUzMiBpbnR2ZWM7CisJaW50IHJldDsKIAotCS8qIHVzZSBpbmRpcmVjdGlvbiByZWdpc3RlciB0byBnZXQgdGhlIGludHIgaGFuZGxlciAqLwotCXBjaV93cml0ZV9jb25maWdfYnl0ZShwZGV2LCBwb3MgKyBIVF9JTlRSX1JFR19JTkRFWCwgMHgxMCk7Ci0JcGNpX3JlYWRfY29uZmlnX2R3b3JkKHBkZXYsIHBvcyArIDQsICZpbnRfaGFuZGxlcl9hZGRyX2xvd2VyKTsKLQlwY2lfd3JpdGVfY29uZmlnX2J5dGUocGRldiwgcG9zICsgSFRfSU5UUl9SRUdfSU5ERVgsIDB4MTEpOwotCXBjaV9yZWFkX2NvbmZpZ19kd29yZChwZGV2LCBwb3MgKyA0LCAmaW50X2hhbmRsZXJfYWRkcl91cHBlcik7CisJaWYgKGRkLT5pcGF0aF9pbnRjb25maWcpIHsKKwkJaXBhdGhfd3JpdGVfa3JlZyhkZCwgZGQtPmlwYXRoX2tyZWdzLT5rcl9pbnRlcnJ1cHRjb25maWcsCisJCQkJIGRkLT5pcGF0aF9pbnRjb25maWcpOwkvKiBpbnRlcnJ1cHQgYWRkcmVzcyAqLworCQlyZXQgPSAwOworCX0gZWxzZSB7CisJCWlwYXRoX2Rldl9lcnIoZGQsICJObyBpbnRlcnJ1cHRzIGVuYWJsZWQsIGNvdWxkbid0IHNldHVwICIKKwkJCSAgICAgICJpbnRlcnJ1cHQgYWRkcmVzc1xuIik7CisJCXJldCA9IC1FSU5WQUw7CisJfQogCi0JaWhhbmRsZXIgPSAodTY0KSBpbnRfaGFuZGxlcl9hZGRyX2xvd2VyIHwKLQkJKCh1NjQpIGludF9oYW5kbGVyX2FkZHJfdXBwZXIgPDwgMzIpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIGlwYXRoX2h0X2lycV91cGRhdGUoc3RydWN0IHBjaV9kZXYgKmRldiwgaW50IGlycSwKKwkJCQlzdHJ1Y3QgaHRfaXJxX21zZyAqbXNnKQoreworCXN0cnVjdCBpcGF0aF9kZXZkYXRhICpkZCA9IHBjaV9nZXRfZHJ2ZGF0YShkZXYpOworCXU2NCBwcmV2X2ludGNvbmZpZyA9IGRkLT5pcGF0aF9pbnRjb25maWc7CisKKwlkZC0+aXBhdGhfaW50Y29uZmlnID0gbXNnLT5hZGRyZXNzX2xvOworCWRkLT5pcGF0aF9pbnRjb25maWcgfD0gKCh1NjQpIG1zZy0+YWRkcmVzc19oaSkgPDwgMzI7CiAKIAkvKgotCSAqIGtlcm5lbHMgd2l0aCBDT05GSUdfUENJX01TSSBzZXQgdGhlIHZlY3RvciBpbiB0aGUgaXJxIGZpZWxkIG9mCi0JICogc3RydWN0IHBjaV9kZXZpY2UsIHNvIHdlIHVzZSB0aGF0IHRvIHByb2dyYW0gdGhlIGludGVybmFsCi0JICogaW50ZXJydXB0IHJlZ2lzdGVyIChub3QgY29uZmlnIHNwYWNlKSB3aXRoIHRoYXQgdmFsdWUuIFRoZSBCSU9TCi0JICogbXVzdCBzdGlsbCBoYXZlIGRvbmUgdGhlIGJhc2ljIE1TSSBzZXR1cC4KKwkgKiBJZiB0aGUgcHJldmlvdXMgdmFsdWUgb2YgZGQtPmlwYXRoX2ludGNvbmZpZyBpcyB6ZXJvLCB3ZSdyZQorCSAqIGdldHRpbmcgY29uZmlndXJlZCBmb3IgdGhlIGZpcnN0IHRpbWUsIGFuZCBtdXN0IG5vdCBwcm9ncmFtIHRoZQorCSAqIGludGNvbmZpZyByZWdpc3RlciBoZXJlIChpdCB3aWxsIGJlIHByb2dyYW1tZWQgbGF0ZXIsIHdoZW4gdGhlCisJICogaGFyZHdhcmUgaXMgcmVhZHkpLiAgT3RoZXJ3aXNlLCB3ZSBzaG91bGQuCiAJICovCi0JaW50dmVjID0gcGRldi0+aXJxOwotCS8qCi0JICogY2xlYXIgYW55IHZlY3RvciBiaXRzIHRoZXJlOyBub3JtYWxseSBub3Qgc2V0IGJ1dCB3ZSdsbCBvdmVybG9hZAotCSAqIHRoaXMgZm9yIHNvbWUgZGVidWcgcHVycG9zZXMgKHNldHRpbmcgdGhlIEhUQyBkZWJ1ZyByZWdpc3RlcgotCSAqIHZhbHVlIGZyb20gc29mdHdhcmUsIHJhdGhlciB0aGFuIEdQSU9zKSwgc28gaXQgbWlnaHQgYmUgc2V0IG9uIGEKLQkgKiBkcml2ZXIgcmVsb2FkLgotCSAqLwotCWloYW5kbGVyICY9IH4weGZmMDAwMDsKLQkvKiB4ODYgdmVjdG9yIGdvZXMgaW4gaW50cmluZm9bMjM6MTZdICovCi0JaWhhbmRsZXIgfD0gaW50dmVjIDw8IDE2OwotCWlwYXRoX2NkYmcoVkVSQk9TRSwgImloYW5kbGVyIGxvd2VyICV4LCB1cHBlciAleCwgaW50dmVjICV4LCAiCi0JCSAgICJpbnRlcnJ1cHRjb25maWcgJWxseFxuIiwgaW50X2hhbmRsZXJfYWRkcl9sb3dlciwKLQkJICAgaW50X2hhbmRsZXJfYWRkcl91cHBlciwgaW50dmVjLAotCQkgICAodW5zaWduZWQgbG9uZyBsb25nKSBpaGFuZGxlcik7Ci0KLQkvKiBjYW4ndCBwcm9ncmFtIHlldCwgc28gc2F2ZSBmb3IgaW50ZXJydXB0IHNldHVwICovCi0JZGQtPmlwYXRoX2ludGNvbmZpZyA9IGloYW5kbGVyOwotCS8qIGtlZXAgZ29pbmcsIHNvIHdlIGZpbmQgbGluayBjb250cm9sIHN0dWZmIGFsc28gKi8KLQotCXJldHVybiBpaGFuZGxlciAhPSAwOworCWlmIChwcmV2X2ludGNvbmZpZykKKwkJaXBhdGhfaHRfaW50Y29uZmlnKGRkKTsKIH0KIAogLyoqCkBAIC05NzEsMTIgKzk2MywxOSBAQAogc3RhdGljIGludCBpcGF0aF9zZXR1cF9odF9jb25maWcoc3RydWN0IGlwYXRoX2RldmRhdGEgKmRkLAogCQkJCSBzdHJ1Y3QgcGNpX2RldiAqcGRldikKIHsKLQlpbnQgcG9zLCByZXQgPSAwOwotCWludCBpaGFuZGxlciA9IDA7CisJaW50IHBvcywgcmV0OworCisJcmV0ID0gX19odF9jcmVhdGVfaXJxKHBkZXYsIDAsIGlwYXRoX2h0X2lycV91cGRhdGUpOworCWlmIChyZXQgPCAwKSB7CisJCWlwYXRoX2Rldl9lcnIoZGQsICJDb3VsZG4ndCBjcmVhdGUgaW50ZXJydXB0IGhhbmRsZXI6ICIKKwkJCSAgICAgICJlcnIgJWRcbiIsIHJldCk7CisJCWdvdG8gYmFpbDsKKwl9CisJZGQtPmlwYXRoX2lycSA9IHJldDsKKwlyZXQgPSAwOwogCiAJLyoKLQkgKiBSZWFkIHRoZSBjYXBhYmlsaXR5IGluZm8gdG8gZmluZCB0aGUgaW50ZXJydXB0IGluZm8sIGFuZCBhbHNvCi0JICogaGFuZGxlIGNsZWFyaW5nIENSQyBlcnJvcnMgaW4gbGlua2N0cmwgcmVnaXN0ZXIgaWYgbmVjZXNzYXJ5LiAgV2UKKwkgKiBIYW5kbGUgY2xlYXJpbmcgQ1JDIGVycm9ycyBpbiBsaW5rY3RybCByZWdpc3RlciBpZiBuZWNlc3NhcnkuICBXZQogCSAqIGRvIHRoaXMgZWFybHksIGJlZm9yZSB3ZSBldmVyIGVuYWJsZSBlcnJvcnMgb3IgaGFyZHdhcmUgZXJyb3JzLAogCSAqIG1vc3RseSB0byBhdm9pZCBjYXVzaW5nIHRoZSBjaGlwIHRvIGVudGVyIGZyZWV6ZSBtb2RlLgogCSAqLwpAQCAtMTAwMCwxNyArOTk5LDkgQEAKIAkJfQogCQlpZiAoIShjYXBfdHlwZSAmIDB4RTApKQogCQkJc2xhdmVfb3JfcHJpX2JsayhkZCwgcGRldiwgcG9zLCBjYXBfdHlwZSk7Ci0JCWVsc2UgaWYgKGNhcF90eXBlID09IEhUX0lOVFJfRElTQ19DT05GSUcpCi0JCQlpaGFuZGxlciA9IHNldF9pbnRfaGFuZGxlcihkZCwgcGRldiwgcG9zKTsKIAl9IHdoaWxlICgocG9zID0gcGNpX2ZpbmRfbmV4dF9jYXBhYmlsaXR5KHBkZXYsIHBvcywKIAkJCQkJCSBQQ0lfQ0FQX0lEX0hUKSkpOwogCi0JaWYgKCFpaGFuZGxlcikgewotCQlpcGF0aF9kZXZfZXJyKGRkLCAiQ291bGRuJ3QgZmluZCBpbnRlcnJ1cHQgaGFuZGxlciBpbiAiCi0JCQkgICAgICAiY29uZmlnIHNwYWNlXG4iKTsKLQkJcmV0ID0gLUVOT0RFVjsKLQl9Ci0KIGJhaWw6CiAJcmV0dXJuIHJldDsKIH0KQEAgLTEzNjAsMjUgKzEzNTEsNiBAQAogCWlwYXRoX3dyaXRlX2tyZWcoZGQsIGRkLT5pcGF0aF9rcmVncy0+a3Jfc2VyZGVzY29uZmlnMCwgdmFsKTsKIH0KIAotc3RhdGljIGludCBpcGF0aF9odF9pbnRjb25maWcoc3RydWN0IGlwYXRoX2RldmRhdGEgKmRkKQotewotCWludCByZXQ7Ci0KLQlpZiAoIWRkLT5pcGF0aF9pbnRjb25maWcpIHsKLQkJaXBhdGhfZGV2X2VycihkZCwgIk5vIGludGVycnVwdHMgZW5hYmxlZCwgY291bGRuJ3Qgc2V0dXAgIgotCQkJICAgICAgImludGVycnVwdCBhZGRyZXNzXG4iKTsKLQkJcmV0ID0gMTsKLQkJZ290byBiYWlsOwotCX0KLQotCWlwYXRoX3dyaXRlX2tyZWcoZGQsIGRkLT5pcGF0aF9rcmVncy0+a3JfaW50ZXJydXB0Y29uZmlnLAotCQkJIGRkLT5pcGF0aF9pbnRjb25maWcpOwkvKiBpbnRlcnJ1cHQgYWRkcmVzcyAqLwotCXJldCA9IDA7Ci0KLWJhaWw6Ci0JcmV0dXJuIHJldDsKLX0KLQogLyoqCiAgKiBpcGF0aF9wZV9wdXRfdGlkIC0gd3JpdGUgYSBUSUQgaW4gY2hpcAogICogQGRkOiB0aGUgaW5maW5pcGF0aCBkZXZpY2UKQEAgLTE1NzUsNiArMTU0NywxNCBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgdm9pZCBpcGF0aF9odF9mcmVlX2lycShzdHJ1Y3QgaXBhdGhfZGV2ZGF0YSAqZGQpCit7CisJZnJlZV9pcnEoZGQtPmlwYXRoX2lycSwgZGQpOworCWh0X2Rlc3Ryb3lfaXJxKGRkLT5pcGF0aF9pcnEpOworCWRkLT5pcGF0aF9pcnEgPSAwOworCWRkLT5pcGF0aF9pbnRjb25maWcgPSAwOworfQorCiAvKioKICAqIGlwYXRoX2luaXRfaWJhNjExMF9mdW5jcyAtIHNldCB1cCB0aGUgY2hpcC1zcGVjaWZpYyBmdW5jdGlvbiBwb2ludGVycwogICogQGRkOiB0aGUgaW5maW5pcGF0aCBkZXZpY2UKQEAgLTE1OTgsNiArMTU3OCw3IEBACiAJZGQtPmlwYXRoX2ZfY2xlYW51cCA9IGlwYXRoX3NldHVwX2h0X2NsZWFudXA7CiAJZGQtPmlwYXRoX2Zfc2V0ZXh0bGVkID0gaXBhdGhfc2V0dXBfaHRfc2V0ZXh0bGVkOwogCWRkLT5pcGF0aF9mX2dldF9iYXNlX2luZm8gPSBpcGF0aF9odF9nZXRfYmFzZV9pbmZvOworCWRkLT5pcGF0aF9mX2ZyZWVfaXJxID0gaXBhdGhfaHRfZnJlZV9pcnE7CiAKIAkvKgogCSAqIGluaXRpYWxpemUgY2hpcC1zcGVjaWZpYyB2YXJpYWJsZXMKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9pcGF0aC9pcGF0aF9pYmE2MTIwLmMgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvaXBhdGgvaXBhdGhfaWJhNjEyMC5jCmluZGV4IGE3MmFiOWQuLjZhZjg5NjggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9pcGF0aC9pcGF0aF9pYmE2MTIwLmMKKysrIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L2lwYXRoL2lwYXRoX2liYTYxMjAuYwpAQCAtODUxLDYgKzg1MSw3IEBACiAJaW50IHBvcywgcmV0OwogCiAJZGQtPmlwYXRoX21zaV9sbyA9IDA7CS8qIHVzZWQgYXMgYSBmbGFnIGR1cmluZyByZXNldCBwcm9jZXNzaW5nICovCisJZGQtPmlwYXRoX2lycSA9IHBkZXYtPmlycTsKIAlyZXQgPSBwY2lfZW5hYmxlX21zaShkZC0+cGNpZGV2KTsKIAlpZiAocmV0KQogCQlpcGF0aF9kZXZfZXJyKGRkLCAicGNpX2VuYWJsZV9tc2kgZmFpbGVkOiAlZCwgIgpAQCAtMTMyMyw2ICsxMzI0LDEyIEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyB2b2lkIGlwYXRoX3BlX2ZyZWVfaXJxKHN0cnVjdCBpcGF0aF9kZXZkYXRhICpkZCkKK3sKKwlmcmVlX2lycShkZC0+aXBhdGhfaXJxLCBkZCk7CisJZGQtPmlwYXRoX2lycSA9IDA7Cit9CisKIC8qKgogICogaXBhdGhfaW5pdF9pYmE2MTIwX2Z1bmNzIC0gc2V0IHVwIHRoZSBjaGlwLXNwZWNpZmljIGZ1bmN0aW9uIHBvaW50ZXJzCiAgKiBAZGQ6IHRoZSBpbmZpbmlwYXRoIGRldmljZQpAQCAtMTM0OSw2ICsxMzU2LDcgQEAKIAlkZC0+aXBhdGhfZl9jbGVhbnVwID0gaXBhdGhfc2V0dXBfcGVfY2xlYW51cDsKIAlkZC0+aXBhdGhfZl9zZXRleHRsZWQgPSBpcGF0aF9zZXR1cF9wZV9zZXRleHRsZWQ7CiAJZGQtPmlwYXRoX2ZfZ2V0X2Jhc2VfaW5mbyA9IGlwYXRoX3BlX2dldF9iYXNlX2luZm87CisJZGQtPmlwYXRoX2ZfZnJlZV9pcnEgPSBpcGF0aF9wZV9mcmVlX2lycTsKIAogCS8qIGluaXRpYWxpemUgY2hpcC1zcGVjaWZpYyB2YXJpYWJsZXMgKi8KIAlkZC0+aXBhdGhfZl90aWR0ZW1wbGF0ZSA9IGlwYXRoX3BlX3RpZHRlbXBsYXRlOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L2lwYXRoL2lwYXRoX2ludHIuYyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9pcGF0aC9pcGF0aF9pbnRyLmMKaW5kZXggZDkwNzllZS4uNTY1MmE1NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L2lwYXRoL2lwYXRoX2ludHIuYworKysgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvaXBhdGgvaXBhdGhfaW50ci5jCkBAIC03MTAsMTQgKzcxMCwxNCBAQAogCQkJICogbGludXhiaW9zIGRldmVsb3BtZW50IHdvcmssIGFuZCBpdCBtYXkgaGFwcGVuIGluCiAJCQkgKiB0aGUgZnV0dXJlIGFnYWluLgogCQkJICovCi0JCQlpZiAoZGQtPnBjaWRldiAmJiBkZC0+cGNpZGV2LT5pcnEpIHsKKwkJCWlmIChkZC0+cGNpZGV2ICYmIGRkLT5pcGF0aF9pcnEpIHsKIAkJCQlpcGF0aF9kZXZfZXJyKGRkLCAiTm93ICV1IHVuZXhwZWN0ZWQgIgogCQkJCQkgICAgICAiaW50ZXJydXB0cywgdW5yZWdpc3RlcmluZyAiCiAJCQkJCSAgICAgICJpbnRlcnJ1cHQgaGFuZGxlclxuIiwKIAkJCQkJICAgICAgKnVuZXhwZWN0cCk7Ci0JCQkJaXBhdGhfZGJnKCJmcmVlX2lycSBvZiBpcnEgJXhcbiIsCi0JCQkJCSAgZGQtPnBjaWRldi0+aXJxKTsKLQkJCQlmcmVlX2lycShkZC0+cGNpZGV2LT5pcnEsIGRkKTsKKwkJCQlpcGF0aF9kYmcoImZyZWVfaXJxIG9mIGlycSAlZFxuIiwKKwkJCQkJICBkZC0+aXBhdGhfaXJxKTsKKwkJCQlkZC0+aXBhdGhfZl9mcmVlX2lycShkZCk7CiAJCQl9CiAJCX0KIAkJaWYgKGlwYXRoX3JlYWRfa3JlZzMyKGRkLCBkZC0+aXBhdGhfa3JlZ3MtPmtyX2ludG1hc2spKSB7CkBAIC03NTMsNyArNzUzLDcgQEAKIAkJaWYgKGFsbGJpdHMgPT0gMikgewogCQkJaXBhdGhfZGV2X2VycihkZCwgIlN0aWxsIGJhZCBpbnRlcnJ1cHQgc3RhdHVzLCAiCiAJCQkJICAgICAgInVucmVnaXN0ZXJpbmcgaW50ZXJydXB0XG4iKTsKLQkJCWZyZWVfaXJxKGRkLT5wY2lkZXYtPmlycSwgZGQpOworCQkJZGQtPmlwYXRoX2ZfZnJlZV9pcnEoZGQpOwogCQl9IGVsc2UgaWYgKGFsbGJpdHMgPiAyKSB7CiAJCQlpZiAoKGFsbGJpdHMgJSAxMDAwMCkgPT0gMCkKIAkJCQlwcmludGsoIi4iKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9pcGF0aC9pcGF0aF9rZXJuZWwuaCBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9pcGF0aC9pcGF0aF9rZXJuZWwuaAppbmRleCA3YzQzNjY5Li45ODZiMjEyIDEwMDY0NAotLS0gYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvaXBhdGgvaXBhdGhfa2VybmVsLmgKKysrIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L2lwYXRoL2lwYXRoX2tlcm5lbC5oCkBAIC0yMTMsNiArMjEzLDggQEAKIAl2b2lkICgqaXBhdGhfZl9zZXRleHRsZWQpKHN0cnVjdCBpcGF0aF9kZXZkYXRhICosIHU2NCwgdTY0KTsKIAkvKiBmaWxsIG91dCBjaGlwLXNwZWNpZmljIGZpZWxkcyAqLwogCWludCAoKmlwYXRoX2ZfZ2V0X2Jhc2VfaW5mbykoc3RydWN0IGlwYXRoX3BvcnRkYXRhICosIHZvaWQgKik7CisJLyogZnJlZSBpcnEgKi8KKwl2b2lkICgqaXBhdGhfZl9mcmVlX2lycSkoc3RydWN0IGlwYXRoX2RldmRhdGEgKik7CiAJc3RydWN0IGlwYXRoX2liZGV2ICp2ZXJic19kZXY7CiAJc3RydWN0IHRpbWVyX2xpc3QgdmVyYnNfdGltZXI7CiAJLyogdG90YWwgZHdvcmRzIHNlbnQgKHN1bW1lZCBmcm9tIGNvdW50ZXIpICovCkBAIC0zMjgsNiArMzMwLDggQEAKIAkvKiBzbyB3ZSBjYW4gcmV3cml0ZSBpdCBhZnRlciBhIGNoaXAgcmVzZXQgKi8KIAl1MzIgaXBhdGhfcGNpYmFyMTsKIAorCS8qIGludGVycnVwdCBudW1iZXIgKi8KKwlpbnQgaXBhdGhfaXJxOwogCS8qIEhUL1BDSSBWZW5kb3IgSUQgKGhlcmUgZm9yIE5vZGVJbmZvKSAqLwogCXUxNiBpcGF0aF92ZW5kb3JpZDsKIAkvKiBIVC9QQ0kgRGV2aWNlIElEIChoZXJlIGZvciBOb2RlSW5mbykgKi8KQEAgLTg2OSw5ICs4NzMsNiBAQAogdm9pZCBpcGF0aF9kZXZpY2VfcmVtb3ZlX2dyb3VwKHN0cnVjdCBkZXZpY2UgKiwgc3RydWN0IGlwYXRoX2RldmRhdGEgKik7CiBpbnQgaXBhdGhfZXhwb3NlX3Jlc2V0KHN0cnVjdCBkZXZpY2UgKik7CiAKLWludCBpcGF0aF9kaWFncGt0X2FkZCh2b2lkKTsKLXZvaWQgaXBhdGhfZGlhZ3BrdF9yZW1vdmUodm9pZCk7Ci0KIGludCBpcGF0aF9pbml0X2lwYXRoZnModm9pZCk7CiB2b2lkIGlwYXRoX2V4aXRfaXBhdGhmcyh2b2lkKTsKIGludCBpcGF0aGZzX2FkZF9kZXZpY2Uoc3RydWN0IGlwYXRoX2RldmRhdGEgKik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvbXRoY2EvbXRoY2FfY21kLmMgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvbXRoY2EvbXRoY2FfY21kLmMKaW5kZXggOTlhOTRkNy4uNzY4ZGY3MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L210aGNhL210aGNhX2NtZC5jCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9tdGhjYS9tdGhjYV9jbWQuYwpAQCAtMTgyMCwxMSArMTgyMCwxMSBAQAogCiAjZGVmaW5lIE1BRF9JRkNfQk9YX1NJWkUgICAgICAweDQwMAogI2RlZmluZSBNQURfSUZDX01ZX1FQTl9PRkZTRVQgMHgxMDAKLSNkZWZpbmUgTUFEX0lGQ19SUVBOX09GRlNFVCAgIDB4MTA0Ci0jZGVmaW5lIE1BRF9JRkNfU0xfT0ZGU0VUICAgICAweDEwOAotI2RlZmluZSBNQURfSUZDX0dfUEFUSF9PRkZTRVQgMHgxMDkKLSNkZWZpbmUgTUFEX0lGQ19STElEX09GRlNFVCAgIDB4MTBhCi0jZGVmaW5lIE1BRF9JRkNfUEtFWV9PRkZTRVQgICAweDEwZQorI2RlZmluZSBNQURfSUZDX1JRUE5fT0ZGU0VUICAgMHgxMDgKKyNkZWZpbmUgTUFEX0lGQ19TTF9PRkZTRVQgICAgIDB4MTBjCisjZGVmaW5lIE1BRF9JRkNfR19QQVRIX09GRlNFVCAweDEwZAorI2RlZmluZSBNQURfSUZDX1JMSURfT0ZGU0VUICAgMHgxMGUKKyNkZWZpbmUgTUFEX0lGQ19QS0VZX09GRlNFVCAgIDB4MTEyCiAjZGVmaW5lIE1BRF9JRkNfR1JIX09GRlNFVCAgICAweDE0MAogCiAJaW5tYWlsYm94ID0gbXRoY2FfYWxsb2NfbWFpbGJveChkZXYsIEdGUF9LRVJORUwpOwpAQCAtMTg2Miw3ICsxODYyLDcgQEAKIAogCQl2YWwgPSBpbl93Yy0+ZGxpZF9wYXRoX2JpdHMgfAogCQkJKGluX3djLT53Y19mbGFncyAmIElCX1dDX0dSSCA/IDB4ODAgOiAwKTsKLQkJTVRIQ0FfUFVUKGluYm94LCB2YWwsICAgICAgICAgICAgICAgTUFEX0lGQ19HUkhfT0ZGU0VUKTsKKwkJTVRIQ0FfUFVUKGluYm94LCB2YWwsICAgICAgICAgICAgICAgTUFEX0lGQ19HX1BBVEhfT0ZGU0VUKTsKIAogCQlNVEhDQV9QVVQoaW5ib3gsIGluX3djLT5zbGlkLCAgICAgICBNQURfSUZDX1JMSURfT0ZGU0VUKTsKIAkJTVRIQ0FfUFVUKGluYm94LCBpbl93Yy0+cGtleV9pbmRleCwgTUFEX0lGQ19QS0VZX09GRlNFVCk7CkBAIC0xODcwLDcgKzE4NzAsNyBAQAogCQlpZiAoaW5fZ3JoKQogCQkJbWVtY3B5KGluYm94ICsgTUFEX0lGQ19HUkhfT0ZGU0VULCBpbl9ncmgsIDQwKTsKIAotCQlvcF9tb2RpZmllciB8PSAweDEwOworCQlvcF9tb2RpZmllciB8PSAweDQ7CiAKIAkJaW5fbW9kaWZpZXIgfD0gaW5fd2MtPnNsaWQgPDwgMTY7CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L210aGNhL210aGNhX2NxLmMgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvbXRoY2EvbXRoY2FfY3EuYwppbmRleCBlMzkzNjgxLi4xNDliMzY5IDEwMDY0NAotLS0gYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvbXRoY2EvbXRoY2FfY3EuYworKysgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvbXRoY2EvbXRoY2FfY3EuYwpAQCAtMzksNiArMzksOCBAQAogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9oYXJkaXJxLmg+CiAKKyNpbmNsdWRlIDxhc20vaW8uaD4KKwogI2luY2x1ZGUgPHJkbWEvaWJfcGFjay5oPgogCiAjaW5jbHVkZSAibXRoY2FfZGV2LmgiCkBAIC0yMTAsNiArMjEyLDExIEBACiAJCW10aGNhX3dyaXRlNjQoZG9vcmJlbGwsCiAJCQkgICAgICBkZXYtPmthciArIE1USENBX0NRX0RPT1JCRUxMLAogCQkJICAgICAgTVRIQ0FfR0VUX0RPT1JCRUxMX0xPQ0soJmRldi0+ZG9vcmJlbGxfbG9jaykpOworCQkvKgorCQkgKiBNYWtlIHN1cmUgZG9vcmJlbGxzIGRvbid0IGxlYWsgb3V0IG9mIENRIHNwaW5sb2NrCisJCSAqIGFuZCByZWFjaCB0aGUgSENBIG91dCBvZiBvcmRlcjoKKwkJICovCisJCW1taW93YigpOwogCX0KIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L210aGNhL210aGNhX3FwLmMgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvbXRoY2EvbXRoY2FfcXAuYwppbmRleCA1ZTVjNThiLi42YTc4MjJlIDEwMDY0NAotLS0gYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvbXRoY2EvbXRoY2FfcXAuYworKysgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvbXRoY2EvbXRoY2FfcXAuYwpAQCAtMzksNiArMzksOCBAQAogI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KIAorI2luY2x1ZGUgPGFzbS9pby5oPgorCiAjaW5jbHVkZSA8cmRtYS9pYl92ZXJicy5oPgogI2luY2x1ZGUgPHJkbWEvaWJfY2FjaGUuaD4KICNpbmNsdWRlIDxyZG1hL2liX3BhY2suaD4KQEAgLTE3MzIsNiArMTczNCwxMSBAQAogCQltdGhjYV93cml0ZTY0KGRvb3JiZWxsLAogCQkJICAgICAgZGV2LT5rYXIgKyBNVEhDQV9TRU5EX0RPT1JCRUxMLAogCQkJICAgICAgTVRIQ0FfR0VUX0RPT1JCRUxMX0xPQ0soJmRldi0+ZG9vcmJlbGxfbG9jaykpOworCQkvKgorCQkgKiBNYWtlIHN1cmUgZG9vcmJlbGxzIGRvbid0IGxlYWsgb3V0IG9mIFNRIHNwaW5sb2NrCisJCSAqIGFuZCByZWFjaCB0aGUgSENBIG91dCBvZiBvcmRlcjoKKwkJICovCisJCW1taW93YigpOwogCX0KIAogCXFwLT5zcS5uZXh0X2luZCA9IGluZDsKQEAgLTE4NTEsNiArMTg1OCwxMiBAQAogCXFwLT5ycS5uZXh0X2luZCA9IGluZDsKIAlxcC0+cnEuaGVhZCAgICArPSBucmVxOwogCisJLyoKKwkgKiBNYWtlIHN1cmUgZG9vcmJlbGxzIGRvbid0IGxlYWsgb3V0IG9mIFJRIHNwaW5sb2NrIGFuZCByZWFjaAorCSAqIHRoZSBIQ0Egb3V0IG9mIG9yZGVyOgorCSAqLworCW1taW93YigpOworCiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcXAtPnJxLmxvY2ssIGZsYWdzKTsKIAlyZXR1cm4gZXJyOwogfQpAQCAtMjExMiw2ICsyMTI1LDEyIEBACiAJCQkgICAgICBNVEhDQV9HRVRfRE9PUkJFTExfTE9DSygmZGV2LT5kb29yYmVsbF9sb2NrKSk7CiAJfQogCisJLyoKKwkgKiBNYWtlIHN1cmUgZG9vcmJlbGxzIGRvbid0IGxlYWsgb3V0IG9mIFNRIHNwaW5sb2NrIGFuZCByZWFjaAorCSAqIHRoZSBIQ0Egb3V0IG9mIG9yZGVyOgorCSAqLworCW1taW93YigpOworCiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcXAtPnNxLmxvY2ssIGZsYWdzKTsKIAlyZXR1cm4gZXJyOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L210aGNhL210aGNhX3NycS5jIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L210aGNhL210aGNhX3NycS5jCmluZGV4IDkyYTcyZjUuLmY1ZDc2NzcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9tdGhjYS9tdGhjYV9zcnEuYworKysgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvbXRoY2EvbXRoY2Ffc3JxLmMKQEAgLTM1LDYgKzM1LDggQEAKICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CiAKKyNpbmNsdWRlIDxhc20vaW8uaD4KKwogI2luY2x1ZGUgIm10aGNhX2Rldi5oIgogI2luY2x1ZGUgIm10aGNhX2NtZC5oIgogI2luY2x1ZGUgIm10aGNhX21lbWZyZWUuaCIKQEAgLTU5NSw2ICs1OTcsMTIgQEAKIAkJCSAgICAgIE1USENBX0dFVF9ET09SQkVMTF9MT0NLKCZkZXYtPmRvb3JiZWxsX2xvY2spKTsKIAl9CiAKKwkvKgorCSAqIE1ha2Ugc3VyZSBkb29yYmVsbHMgZG9uJ3QgbGVhayBvdXQgb2YgU1JRIHNwaW5sb2NrIGFuZAorCSAqIHJlYWNoIHRoZSBIQ0Egb3V0IG9mIG9yZGVyOgorCSAqLworCW1taW93YigpOworCiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc3JxLT5sb2NrLCBmbGFncyk7CiAJcmV0dXJuIGVycjsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5maW5pYmFuZC91bHAvaXBvaWIvaXBvaWJfbWFpbi5jIGIvZHJpdmVycy9pbmZpbmliYW5kL3VscC9pcG9pYi9pcG9pYl9tYWluLmMKaW5kZXggMWVhZjAwZS4uODU1MjJkYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbmZpbmliYW5kL3VscC9pcG9pYi9pcG9pYl9tYWluLmMKKysrIGIvZHJpdmVycy9pbmZpbmliYW5kL3VscC9pcG9pYi9pcG9pYl9tYWluLmMKQEAgLTQ5LDYgKzQ5LDggQEAKIAogI2luY2x1ZGUgPG5ldC9kc3QuaD4KIAorI2RlZmluZSBJUE9JQl9RUE4oaGEpIChiZTMyX3RvX2NwdXAoKF9fYmUzMiAqKSBoYSkgJiAweGZmZmZmZikKKwogTU9EVUxFX0FVVEhPUigiUm9sYW5kIERyZWllciIpOwogTU9EVUxFX0RFU0NSSVBUSU9OKCJJUC1vdmVyLUluZmluaUJhbmQgbmV0IGRyaXZlciIpOwogTU9EVUxFX0xJQ0VOU0UoIkR1YWwgQlNEL0dQTCIpOwpAQCAtNTIwLDggKzUyMiw3IEBACiAJCW1lbWNweSgmbmVpZ2gtPmRnaWQucmF3LCAmcGF0aC0+cGF0aHJlYy5kZ2lkLnJhdywKIAkJICAgICAgIHNpemVvZih1bmlvbiBpYl9naWQpKTsKIAotCQlpcG9pYl9zZW5kKGRldiwgc2tiLCBwYXRoLT5haCwKLQkJCSAgIGJlMzJfdG9fY3B1cCgoX19iZTMyICopIHNrYi0+ZHN0LT5uZWlnaGJvdXItPmhhKSk7CisJCWlwb2liX3NlbmQoZGV2LCBza2IsIHBhdGgtPmFoLCBJUE9JQl9RUE4oc2tiLT5kc3QtPm5laWdoYm91ci0+aGEpKTsKIAl9IGVsc2UgewogCQluZWlnaC0+YWggID0gTlVMTDsKIAkJX19za2JfcXVldWVfdGFpbCgmbmVpZ2gtPnF1ZXVlLCBza2IpOwpAQCAtNTk5LDggKzYwMCw3IEBACiAJCWlwb2liX2RiZyhwcml2LCAiU2VuZCB1bmljYXN0IEFSUCB0byAlMDR4XG4iLAogCQkJICBiZTE2X3RvX2NwdShwYXRoLT5wYXRocmVjLmRsaWQpKTsKIAotCQlpcG9pYl9zZW5kKGRldiwgc2tiLCBwYXRoLT5haCwKLQkJCSAgIGJlMzJfdG9fY3B1cCgoX19iZTMyICopIHBoZHItPmh3YWRkcikpOworCQlpcG9pYl9zZW5kKGRldiwgc2tiLCBwYXRoLT5haCwgSVBPSUJfUVBOKHBoZHItPmh3YWRkcikpOwogCX0gZWxzZSBpZiAoKHBhdGgtPnF1ZXJ5IHx8ICFwYXRoX3JlY19zdGFydChkZXYsIHBhdGgpKSAmJgogCQkgICBza2JfcXVldWVfbGVuKCZwYXRoLT5xdWV1ZSkgPCBJUE9JQl9NQVhfUEFUSF9SRUNfUVVFVUUpIHsKIAkJLyogcHV0IHBzZXVkb2hlYWRlciBiYWNrIG9uIGZvciBuZXh0IHRpbWUgKi8KQEAgLTY2MSw4ICs2NjEsNyBAQAogCQkJCWdvdG8gb3V0OwogCQkJfQogCi0JCQlpcG9pYl9zZW5kKGRldiwgc2tiLCBuZWlnaC0+YWgsCi0JCQkJICAgYmUzMl90b19jcHVwKChfX2JlMzIgKikgc2tiLT5kc3QtPm5laWdoYm91ci0+aGEpKTsKKwkJCWlwb2liX3NlbmQoZGV2LCBza2IsIG5laWdoLT5haCwgSVBPSUJfUVBOKHNrYi0+ZHN0LT5uZWlnaGJvdXItPmhhKSk7CiAJCQlnb3RvIG91dDsKIAkJfQogCkBAIC02OTQsNyArNjkzLDcgQEAKIAkJCQkJICAgSVBPSUJfR0lEX0ZNVCAiXG4iLAogCQkJCQkgICBza2ItPmRzdCA/ICJuZWlnaCIgOiAiZHN0IiwKIAkJCQkJICAgYmUxNl90b19jcHVwKChfX2JlMTYgKikgc2tiLT5kYXRhKSwKLQkJCQkJICAgYmUzMl90b19jcHVwKChfX2JlMzIgKikgcGhkci0+aHdhZGRyKSwKKwkJCQkJICAgSVBPSUJfUVBOKHBoZHItPmh3YWRkciksCiAJCQkJCSAgIElQT0lCX0dJRF9SQVdfQVJHKHBoZHItPmh3YWRkciArIDQpKTsKIAkJCQlkZXZfa2ZyZWVfc2tiX2FueShza2IpOwogCQkJCSsrcHJpdi0+c3RhdHMudHhfZHJvcHBlZDsKQEAgLTc3Nyw3ICs3NzYsNyBAQAogCiAJaXBvaWJfZGJnKHByaXYsCiAJCSAgIm5laWdoX2Rlc3RydWN0b3IgZm9yICUwNnggIiBJUE9JQl9HSURfRk1UICJcbiIsCi0JCSAgYmUzMl90b19jcHVwKChfX2JlMzIgKikgbi0+aGEpLAorCQkgIElQT0lCX1FQTihuLT5oYSksCiAJCSAgSVBPSUJfR0lEX1JBV19BUkcobi0+aGEgKyA0KSk7CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+bG9jaywgZmxhZ3MpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbmZpbmliYW5kL3VscC9pc2VyL2lzY3NpX2lzZXIuYyBiL2RyaXZlcnMvaW5maW5pYmFuZC91bHAvaXNlci9pc2NzaV9pc2VyLmMKaW5kZXggZWI2Zjk4ZC4uOWIyMDQxZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbmZpbmliYW5kL3VscC9pc2VyL2lzY3NpX2lzZXIuYworKysgYi9kcml2ZXJzL2luZmluaWJhbmQvdWxwL2lzZXIvaXNjc2lfaXNlci5jCkBAIC0zNjMsMTEgKzM2MywxMSBAQAogCXN0cnVjdCBpc2NzaV9jb25uICpjb25uID0gY2xzX2Nvbm4tPmRkX2RhdGE7CiAJaW50IGVycjsKIAotCWVyciA9IGlzY3NpX2Nvbm5fc3RhcnQoY2xzX2Nvbm4pOworCWVyciA9IGlzZXJfY29ubl9zZXRfZnVsbF9mZWF0dXJlZF9tb2RlKGNvbm4pOwogCWlmIChlcnIpCiAJCXJldHVybiBlcnI7CiAKLQlyZXR1cm4gaXNlcl9jb25uX3NldF9mdWxsX2ZlYXR1cmVkX21vZGUoY29ubik7CisJcmV0dXJuIGlzY3NpX2Nvbm5fc3RhcnQoY2xzX2Nvbm4pOwogfQogCiBzdGF0aWMgc3RydWN0IGlzY3NpX3RyYW5zcG9ydCBpc2NzaV9pc2VyX3RyYW5zcG9ydDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5wdXQvZ2FtZXBvcnQvZm04MDEtZ3AuYyBiL2RyaXZlcnMvaW5wdXQvZ2FtZXBvcnQvZm04MDEtZ3AuYwppbmRleCA5MGRlNWFmLi4xZGVjMDBlIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lucHV0L2dhbWVwb3J0L2ZtODAxLWdwLmMKKysrIGIvZHJpdmVycy9pbnB1dC9nYW1lcG9ydC9mbTgwMS1ncC5jCkBAIC04MiwxNyArODIsMTkgQEAKIHsKIAlzdHJ1Y3QgZm04MDFfZ3AgKmdwOwogCXN0cnVjdCBnYW1lcG9ydCAqcG9ydDsKKwlpbnQgZXJyb3I7CiAKIAlncCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBmbTgwMV9ncCksIEdGUF9LRVJORUwpOwogCXBvcnQgPSBnYW1lcG9ydF9hbGxvY2F0ZV9wb3J0KCk7CiAJaWYgKCFncCB8fCAhcG9ydCkgewogCQlwcmludGsoS0VSTl9FUlIgImZtODAxLWdwOiBNZW1vcnkgYWxsb2NhdGlvbiBmYWlsZWRcbiIpOwotCQlrZnJlZShncCk7Ci0JCWdhbWVwb3J0X2ZyZWVfcG9ydChwb3J0KTsKLQkJcmV0dXJuIC1FTk9NRU07CisJCWVycm9yID0gLUVOT01FTTsKKwkJZ290byBlcnJfb3V0X2ZyZWU7CiAJfQogCi0JcGNpX2VuYWJsZV9kZXZpY2UocGNpKTsKKwllcnJvciA9IHBjaV9lbmFibGVfZGV2aWNlKHBjaSk7CisJaWYgKGVycm9yKQorCQlnb3RvIGVycl9vdXRfZnJlZTsKIAogCXBvcnQtPm9wZW4gPSBmbTgwMV9ncF9vcGVuOwogI2lmZGVmIEhBVkVfQ09PS0VECkBAIC0xMDgsOSArMTEwLDggQEAKIAlpZiAoIWdwLT5yZXNfcG9ydCkgewogCQlwcmludGsoS0VSTl9ERUJVRyAiZm04MDEtZ3A6IHVuYWJsZSB0byBncmFiIHJlZ2lvbiAweCV4LTB4JXhcbiIsCiAJCQlwb3J0LT5pbywgcG9ydC0+aW8gKyAweDBmKTsKLQkJZ2FtZXBvcnRfZnJlZV9wb3J0KHBvcnQpOwotCQlrZnJlZShncCk7Ci0JCXJldHVybiAtRUJVU1k7CisJCWVycm9yID0gLUVCVVNZOworCQlnb3RvIGVycl9vdXRfZGlzYWJsZV9kZXY7CiAJfQogCiAJcGNpX3NldF9kcnZkYXRhKHBjaSwgZ3ApOwpAQCAtMTE5LDYgKzEyMCwxMyBAQAogCWdhbWVwb3J0X3JlZ2lzdGVyX3BvcnQocG9ydCk7CiAKIAlyZXR1cm4gMDsKKworIGVycl9vdXRfZGlzYWJsZV9kZXY6CisJcGNpX2Rpc2FibGVfZGV2aWNlKHBjaSk7CisgZXJyX291dF9mcmVlOgorCWdhbWVwb3J0X2ZyZWVfcG9ydChwb3J0KTsKKwlrZnJlZShncCk7CisJcmV0dXJuIGVycm9yOwogfQogCiBzdGF0aWMgdm9pZCBfX2RldmV4aXQgZm04MDFfZ3BfcmVtb3ZlKHN0cnVjdCBwY2lfZGV2ICpwY2kpCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L2dhbWVwb3J0L2dhbWVwb3J0LmMgYi9kcml2ZXJzL2lucHV0L2dhbWVwb3J0L2dhbWVwb3J0LmMKaW5kZXggM2Y0N2FlNS4uYTBhZjk3ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbnB1dC9nYW1lcG9ydC9nYW1lcG9ydC5jCisrKyBiL2RyaXZlcnMvaW5wdXQvZ2FtZXBvcnQvZ2FtZXBvcnQuYwpAQCAtMTkxLDYgKzE5MSw4IEBACiAKIHN0YXRpYyB2b2lkIGdhbWVwb3J0X2JpbmRfZHJpdmVyKHN0cnVjdCBnYW1lcG9ydCAqZ2FtZXBvcnQsIHN0cnVjdCBnYW1lcG9ydF9kcml2ZXIgKmRydikKIHsKKwlpbnQgZXJyb3I7CisKIAlkb3duX3dyaXRlKCZnYW1lcG9ydF9idXMuc3Vic3lzLnJ3c2VtKTsKIAogCWdhbWVwb3J0LT5kZXYuZHJpdmVyID0gJmRydi0+ZHJpdmVyOwpAQCAtMTk4LDggKzIwMCwyMCBAQAogCQlnYW1lcG9ydC0+ZGV2LmRyaXZlciA9IE5VTEw7CiAJCWdvdG8gb3V0OwogCX0KLQlkZXZpY2VfYmluZF9kcml2ZXIoJmdhbWVwb3J0LT5kZXYpOwotb3V0OgorCisJZXJyb3IgPSBkZXZpY2VfYmluZF9kcml2ZXIoJmdhbWVwb3J0LT5kZXYpOworCWlmIChlcnJvcikgeworCQlwcmludGsoS0VSTl9XQVJOSU5HCisJCQkiZ2FtZXBvcnQ6IGRldmljZV9iaW5kX2RyaXZlcigpIGZhaWxlZCAiCisJCQkiZm9yICVzICglcykgYW5kICVzLCBlcnJvcjogJWRcbiIsCisJCQlnYW1lcG9ydC0+cGh5cywgZ2FtZXBvcnQtPm5hbWUsCisJCQlkcnYtPmRlc2NyaXB0aW9uLCBlcnJvcik7CisJCWRydi0+ZGlzY29ubmVjdChnYW1lcG9ydCk7CisJCWdhbWVwb3J0LT5kZXYuZHJpdmVyID0gTlVMTDsKKwkJZ290byBvdXQ7CisJfQorCisgb3V0OgogCXVwX3dyaXRlKCZnYW1lcG9ydF9idXMuc3Vic3lzLnJ3c2VtKTsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbnB1dC9rZXlib2FyZC9hdGtiZC5jIGIvZHJpdmVycy9pbnB1dC9rZXlib2FyZC9hdGtiZC5jCmluZGV4IGI2ZWY5ZWEuLmNiYjkzNjYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5wdXQva2V5Ym9hcmQvYXRrYmQuYworKysgYi9kcml2ZXJzL2lucHV0L2tleWJvYXJkL2F0a2JkLmMKQEAgLTIyMSw2ICsyMjEsNyBAQAogCXVuc2lnbmVkIGxvbmcgeGxfYml0OwogCXVuc2lnbmVkIGludCBsYXN0OwogCXVuc2lnbmVkIGxvbmcgdGltZTsKKwl1bnNpZ25lZCBsb25nIGVycl9jb3VudDsKIAogCXN0cnVjdCB3b3JrX3N0cnVjdCBldmVudF93b3JrOwogCXN0cnVjdCBtdXRleCBldmVudF9tdXRleDsKQEAgLTIzNCwxMSArMjM1LDEzIEBACiAjZGVmaW5lIEFUS0JEX0RFRklORV9BVFRSKF9uYW1lKQkJCQkJCVwKIHN0YXRpYyBzc2l6ZV90IGF0a2JkX3Nob3dfIyNfbmFtZShzdHJ1Y3QgYXRrYmQgKiwgY2hhciAqKTsJCQlcCiBzdGF0aWMgc3NpemVfdCBhdGtiZF9zZXRfIyNfbmFtZShzdHJ1Y3QgYXRrYmQgKiwgY29uc3QgY2hhciAqLCBzaXplX3QpOwkJXAotc3RhdGljIHNzaXplX3QgYXRrYmRfZG9fc2hvd18jI19uYW1lKHN0cnVjdCBkZXZpY2UgKmQsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpiKQkJCVwKK3N0YXRpYyBzc2l6ZV90IGF0a2JkX2RvX3Nob3dfIyNfbmFtZShzdHJ1Y3QgZGV2aWNlICpkLAkJCQlcCisJCQkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmIpCQlcCiB7CQkJCQkJCQkJCVwKIAlyZXR1cm4gYXRrYmRfYXR0cl9zaG93X2hlbHBlcihkLCBiLCBhdGtiZF9zaG93XyMjX25hbWUpOwkJXAogfQkJCQkJCQkJCQlcCi1zdGF0aWMgc3NpemVfdCBhdGtiZF9kb19zZXRfIyNfbmFtZShzdHJ1Y3QgZGV2aWNlICpkLCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY29uc3QgY2hhciAqYiwgc2l6ZV90IHMpCVwKK3N0YXRpYyBzc2l6ZV90IGF0a2JkX2RvX3NldF8jI19uYW1lKHN0cnVjdCBkZXZpY2UgKmQsCQkJCVwKKwkJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjb25zdCBjaGFyICpiLCBzaXplX3QgcykJXAogewkJCQkJCQkJCQlcCiAJcmV0dXJuIGF0a2JkX2F0dHJfc2V0X2hlbHBlcihkLCBiLCBzLCBhdGtiZF9zZXRfIyNfbmFtZSk7CQlcCiB9CQkJCQkJCQkJCVwKQEAgLTI1MSw2ICsyNTQsMzIgQEAKIEFUS0JEX0RFRklORV9BVFRSKHNvZnRyZXBlYXQpOwogQVRLQkRfREVGSU5FX0FUVFIoc29mdHJhdyk7CiAKKyNkZWZpbmUgQVRLQkRfREVGSU5FX1JPX0FUVFIoX25hbWUpCQkJCQkJXAorc3RhdGljIHNzaXplX3QgYXRrYmRfc2hvd18jI19uYW1lKHN0cnVjdCBhdGtiZCAqLCBjaGFyICopOwkJCVwKK3N0YXRpYyBzc2l6ZV90IGF0a2JkX2RvX3Nob3dfIyNfbmFtZShzdHJ1Y3QgZGV2aWNlICpkLAkJCQlcCisJCQkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmIpCQlcCit7CQkJCQkJCQkJCVwKKwlyZXR1cm4gYXRrYmRfYXR0cl9zaG93X2hlbHBlcihkLCBiLCBhdGtiZF9zaG93XyMjX25hbWUpOwkJXAorfQkJCQkJCQkJCQlcCitzdGF0aWMgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgYXRrYmRfYXR0cl8jI19uYW1lID0JCQkJXAorCV9fQVRUUihfbmFtZSwgU19JUlVHTywgYXRrYmRfZG9fc2hvd18jI19uYW1lLCBOVUxMKTsKKworQVRLQkRfREVGSU5FX1JPX0FUVFIoZXJyX2NvdW50KTsKKworc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGUgKmF0a2JkX2F0dHJpYnV0ZXNbXSA9IHsKKwkmYXRrYmRfYXR0cl9leHRyYS5hdHRyLAorCSZhdGtiZF9hdHRyX3Njcm9sbC5hdHRyLAorCSZhdGtiZF9hdHRyX3NldC5hdHRyLAorCSZhdGtiZF9hdHRyX3NvZnRyZXBlYXQuYXR0ciwKKwkmYXRrYmRfYXR0cl9zb2Z0cmF3LmF0dHIsCisJJmF0a2JkX2F0dHJfZXJyX2NvdW50LmF0dHIsCisJTlVMTAorfTsKKworc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGVfZ3JvdXAgYXRrYmRfYXR0cmlidXRlX2dyb3VwID0geworCS5hdHRycwk9IGF0a2JkX2F0dHJpYnV0ZXMsCit9OworCiBzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHhsX3RhYmxlW10gPSB7CiAJQVRLQkRfUkVUX0JBVCwgQVRLQkRfUkVUX0VSUiwgQVRLQkRfUkVUX0FDSywKIAlBVEtCRF9SRVRfTkFLLCBBVEtCRF9SRVRfSEFOSkEsIEFUS0JEX1JFVF9IQU5HRVVMLApAQCAtMzk2LDcgKzQyNSwxMCBAQAogCQkJYWRkX3JlbGVhc2VfZXZlbnQgPSAxOwogCQkJYnJlYWs7CiAJCWNhc2UgQVRLQkRfUkVUX0VSUjoKKwkJCWF0a2JkLT5lcnJfY291bnQrKzsKKyNpZmRlZiBBVEtCRF9ERUJVRwogCQkJcHJpbnRrKEtFUk5fREVCVUcgImF0a2JkLmM6IEtleWJvYXJkIG9uICVzIHJlcG9ydHMgdG9vIG1hbnkga2V5cyBwcmVzc2VkLlxuIiwgc2VyaW8tPnBoeXMpOworI2VuZGlmCiAJCQlnb3RvIG91dDsKIAl9CiAKQEAgLTc4NiwxMiArODE4LDcgQEAKIAlzeW5jaHJvbml6ZV9zY2hlZCgpOyAgLyogQWxsb3cgYXRrYmRfaW50ZXJydXB0KClzIHRvIGNvbXBsZXRlLiAqLwogCWZsdXNoX3NjaGVkdWxlZF93b3JrKCk7CiAKLQlkZXZpY2VfcmVtb3ZlX2ZpbGUoJnNlcmlvLT5kZXYsICZhdGtiZF9hdHRyX2V4dHJhKTsKLQlkZXZpY2VfcmVtb3ZlX2ZpbGUoJnNlcmlvLT5kZXYsICZhdGtiZF9hdHRyX3Njcm9sbCk7Ci0JZGV2aWNlX3JlbW92ZV9maWxlKCZzZXJpby0+ZGV2LCAmYXRrYmRfYXR0cl9zZXQpOwotCWRldmljZV9yZW1vdmVfZmlsZSgmc2VyaW8tPmRldiwgJmF0a2JkX2F0dHJfc29mdHJlcGVhdCk7Ci0JZGV2aWNlX3JlbW92ZV9maWxlKCZzZXJpby0+ZGV2LCAmYXRrYmRfYXR0cl9zb2Z0cmF3KTsKLQorCXN5c2ZzX3JlbW92ZV9ncm91cCgmc2VyaW8tPmRldi5rb2JqLCAmYXRrYmRfYXR0cmlidXRlX2dyb3VwKTsKIAlpbnB1dF91bnJlZ2lzdGVyX2RldmljZShhdGtiZC0+ZGV2KTsKIAlzZXJpb19jbG9zZShzZXJpbyk7CiAJc2VyaW9fc2V0X2RydmRhdGEoc2VyaW8sIE5VTEwpOwpAQCAtOTYxLDExICs5ODgsNyBAQAogCWF0a2JkX3NldF9rZXljb2RlX3RhYmxlKGF0a2JkKTsKIAlhdGtiZF9zZXRfZGV2aWNlX2F0dHJzKGF0a2JkKTsKIAotCWRldmljZV9jcmVhdGVfZmlsZSgmc2VyaW8tPmRldiwgJmF0a2JkX2F0dHJfZXh0cmEpOwotCWRldmljZV9jcmVhdGVfZmlsZSgmc2VyaW8tPmRldiwgJmF0a2JkX2F0dHJfc2Nyb2xsKTsKLQlkZXZpY2VfY3JlYXRlX2ZpbGUoJnNlcmlvLT5kZXYsICZhdGtiZF9hdHRyX3NldCk7Ci0JZGV2aWNlX2NyZWF0ZV9maWxlKCZzZXJpby0+ZGV2LCAmYXRrYmRfYXR0cl9zb2Z0cmVwZWF0KTsKLQlkZXZpY2VfY3JlYXRlX2ZpbGUoJnNlcmlvLT5kZXYsICZhdGtiZF9hdHRyX3NvZnRyYXcpOworCXN5c2ZzX2NyZWF0ZV9ncm91cCgmc2VyaW8tPmRldi5rb2JqLCAmYXRrYmRfYXR0cmlidXRlX2dyb3VwKTsKIAogCWF0a2JkX2VuYWJsZShhdGtiZCk7CiAKQEAgLTEyNTksNiArMTI4MiwxMSBAQAogCXJldHVybiBjb3VudDsKIH0KIAorc3RhdGljIHNzaXplX3QgYXRrYmRfc2hvd19lcnJfY291bnQoc3RydWN0IGF0a2JkICphdGtiZCwgY2hhciAqYnVmKQoreworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVsdVxuIiwgYXRrYmQtPmVycl9jb3VudCk7Cit9CisKIAogc3RhdGljIGludCBfX2luaXQgYXRrYmRfaW5pdCh2b2lkKQogewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbnB1dC9rZXlib2FyZC9jb3JnaWtiZC5jIGIvZHJpdmVycy9pbnB1dC9rZXlib2FyZC9jb3JnaWtiZC5jCmluZGV4IGNiNzA5NzAuLmJlZmRkNjAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5wdXQva2V5Ym9hcmQvY29yZ2lrYmQuYworKysgYi9kcml2ZXJzL2lucHV0L2tleWJvYXJkL2Nvcmdpa2JkLmMKQEAgLTIwNyw3ICsyMDcsNyBAQAogc3RhdGljIHZvaWQgY29yZ2lrYmRfdGltZXJfY2FsbGJhY2sodW5zaWduZWQgbG9uZyBkYXRhKQogewogCXN0cnVjdCBjb3JnaWtiZCAqY29yZ2lrYmRfZGF0YSA9IChzdHJ1Y3QgY29yZ2lrYmQgKikgZGF0YTsKLQljb3JnaWtiZF9zY2Fua2V5Ym9hcmQoY29yZ2lrYmRfZGF0YSwgTlVMTCk7CisJY29yZ2lrYmRfc2NhbmtleWJvYXJkKGNvcmdpa2JkX2RhdGEpOwogfQogCiAvKgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbnB1dC9rZXlib2FyZC9sa2tiZC5jIGIvZHJpdmVycy9pbnB1dC9rZXlib2FyZC9sa2tiZC5jCmluZGV4IDcwOGQ1YTEuLjk3OWI5M2UgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5wdXQva2V5Ym9hcmQvbGtrYmQuYworKysgYi9kcml2ZXJzL2lucHV0L2tleWJvYXJkL2xra2JkLmMKQEAgLTU5LDExICs1OSw2IEBACiAgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQogICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKICAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBCi0gKgotICogU2hvdWxkIHlvdSBuZWVkIHRvIGNvbnRhY3QgbWUsIHRoZSBhdXRob3IsIHlvdSBjYW4gZG8gc28gZWl0aGVyIGJ5Ci0gKiBlbWFpbCBvciBieSBwYXBlciBtYWlsOgotICogSmFuLUJlbmVkaWN0IEdsYXcsIExpbGllbnN0cmHfZSAxNiwgMzM3OTAgSPZyc3RlIChuZWFyIEhhbGxlL1dlc3RmLiksCi0gKiBHZXJtYW55LgogICovCiAKICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbnB1dC9rZXlib2FyZC9sb2NvbW9rYmQuYyBiL2RyaXZlcnMvaW5wdXQva2V5Ym9hcmQvbG9jb21va2JkLmMKaW5kZXggZmQzM2M5Yy4uNTc4OGRiYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbnB1dC9rZXlib2FyZC9sb2NvbW9rYmQuYworKysgYi9kcml2ZXJzL2lucHV0L2tleWJvYXJkL2xvY29tb2tiZC5jCkBAIC0xODYsNyArMTg2LDcgQEAKIHN0YXRpYyB2b2lkIGxvY29tb2tiZF90aW1lcl9jYWxsYmFjayh1bnNpZ25lZCBsb25nIGRhdGEpCiB7CiAJc3RydWN0IGxvY29tb2tiZCAqbG9jb21va2JkID0gKHN0cnVjdCBsb2NvbW9rYmQgKikgZGF0YTsKLQlsb2NvbW9rYmRfc2NhbmtleWJvYXJkKGxvY29tb2tiZCwgTlVMTCk7CisJbG9jb21va2JkX3NjYW5rZXlib2FyZChsb2NvbW9rYmQpOwogfQogCiBzdGF0aWMgaW50IGxvY29tb2tiZF9wcm9iZShzdHJ1Y3QgbG9jb21vX2RldiAqZGV2KQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbnB1dC9rZXlib2FyZC9zcGl0emtiZC5jIGIvZHJpdmVycy9pbnB1dC9rZXlib2FyZC9zcGl0emtiZC5jCmluZGV4IDhiMThjMDAuLjI4YjI3NDggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5wdXQva2V5Ym9hcmQvc3BpdHprYmQuYworKysgYi9kcml2ZXJzL2lucHV0L2tleWJvYXJkL3NwaXR6a2JkLmMKQEAgLTI1Nyw3ICsyNTcsNyBAQAogewogCXN0cnVjdCBzcGl0emtiZCAqc3BpdHprYmRfZGF0YSA9IChzdHJ1Y3Qgc3BpdHprYmQgKikgZGF0YTsKIAotCXNwaXR6a2JkX3NjYW5rZXlib2FyZChzcGl0emtiZF9kYXRhLCBOVUxMKTsKKwlzcGl0emtiZF9zY2Fua2V5Ym9hcmQoc3BpdHprYmRfZGF0YSk7CiB9CiAKIC8qCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L21pc2MvaHBfc2RjX3J0Yy5jIGIvZHJpdmVycy9pbnB1dC9taXNjL2hwX3NkY19ydGMuYwppbmRleCAxYmU5NjM5Li5hYjRkYTc5IDEwMDY0NAotLS0gYS9kcml2ZXJzL2lucHV0L21pc2MvaHBfc2RjX3J0Yy5jCisrKyBiL2RyaXZlcnMvaW5wdXQvbWlzYy9ocF9zZGNfcnRjLmMKQEAgLTYwLDcgKzYwLDcgQEAKIAogc3RhdGljIERFQ0xBUkVfV0FJVF9RVUVVRV9IRUFEKGhwX3NkY19ydGNfd2FpdCk7CiAKLXN0YXRpYyBzc2l6ZV90IGhwX3NkY19ydGNfcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciAqYnVmLAorc3RhdGljIHNzaXplX3QgaHBfc2RjX3J0Y19yZWFkKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqYnVmLAogCQkJICAgICAgIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKTsKIAogc3RhdGljIGludCBocF9zZGNfcnRjX2lvY3RsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlLApAQCAtMzg1LDE0ICszODUsMTQgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHNzaXplX3QgaHBfc2RjX3J0Y19yZWFkKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyICpidWYsCitzdGF0aWMgc3NpemVfdCBocF9zZGNfcnRjX3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICpidWYsCiAJCQkgICAgICAgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpIHsKIAlzc2l6ZV90IHJldHZhbDsKIAogICAgICAgICBpZiAoY291bnQgPCBzaXplb2YodW5zaWduZWQgbG9uZykpCiAgICAgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CiAKLQlyZXR2YWwgPSBwdXRfdXNlcig2OCwgKHVuc2lnbmVkIGxvbmcgKilidWYpOworCXJldHZhbCA9IHB1dF91c2VyKDY4LCAodW5zaWduZWQgbG9uZyBfX3VzZXIgKilidWYpOwogCXJldHVybiByZXR2YWw7CiB9CiAKQEAgLTY5Niw3ICs2OTYsNyBAQAogCWlmICgocmV0ID0gaHBfc2RjX3JlcXVlc3RfdGltZXJfaXJxKCZocF9zZGNfcnRjX2lzcikpKQogCQlyZXR1cm4gcmV0OwogCW1pc2NfcmVnaXN0ZXIoJmhwX3NkY19ydGNfZGV2KTsKLSAgICAgICAgY3JlYXRlX3Byb2NfcmVhZF9lbnRyeSAoImRyaXZlci9ydGMiLCAwLCAwLCAKKyAgICAgICAgY3JlYXRlX3Byb2NfcmVhZF9lbnRyeSAoImRyaXZlci9ydGMiLCAwLCBOVUxMLAogCQkJCWhwX3NkY19ydGNfcmVhZF9wcm9jLCBOVUxMKTsKIAogCXByaW50ayhLRVJOX0lORk8gIkhQIGk4MDQyIFNEQyArIE1TTS01ODMyMSBSVEMgc3VwcG9ydCBsb2FkZWQgIgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbnB1dC9taXNjL3dpc3Ryb25fYnRucy5jIGIvZHJpdmVycy9pbnB1dC9taXNjL3dpc3Ryb25fYnRucy5jCmluZGV4IDQ2Mzk1MzcuLjdiOWQxYzEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5wdXQvbWlzYy93aXN0cm9uX2J0bnMuYworKysgYi9kcml2ZXJzL2lucHV0L21pc2Mvd2lzdHJvbl9idG5zLmMKQEAgLTE3LDcgKzE3LDcgQEAKICAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCiAgKiA1OSBUZW1wbGUgUGxhY2UgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KICAqLwotI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CiAjaW5jbHVkZSA8bGludXgvZG1pLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2lucHV0Lmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L3NlcmlvL2hpbF9tbGMuYyBiL2RyaXZlcnMvaW5wdXQvc2VyaW8vaGlsX21sYy5jCmluZGV4IGJkZmRlMDQuLjQ5ZTExZTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5wdXQvc2VyaW8vaGlsX21sYy5jCisrKyBiL2RyaXZlcnMvaW5wdXQvc2VyaW8vaGlsX21sYy5jCkBAIC0zOTEsMjMgKzM5MSwyMyBAQAogfQogCiAjZGVmaW5lIEZVTkMoZnVuY3QsIGZ1bmN0X2FyZywgemVyb19yYywgbmVnX3JjLCBwb3NfcmMpIFwKLXsgSElMU0VfRlVOQywJCXsgZnVuYzogJmZ1bmN0IH0sIGZ1bmN0X2FyZywgemVyb19yYywgbmVnX3JjLCBwb3NfcmMgfSwKK3sgSElMU0VfRlVOQywJCXsgLmZ1bmMgPSBmdW5jdCB9LCBmdW5jdF9hcmcsIHplcm9fcmMsIG5lZ19yYywgcG9zX3JjIH0sCiAjZGVmaW5lIE9VVChwYWNrKSBcCi17IEhJTFNFX09VVCwJCXsgcGFja2V0OiBwYWNrIH0sIDAsIEhJTFNFTl9ORVhULCBISUxTRU5fRE9aRSwgMCB9LAoreyBISUxTRV9PVVQsCQl7IC5wYWNrZXQgPSBwYWNrIH0sIDAsIEhJTFNFTl9ORVhULCBISUxTRU5fRE9aRSwgMCB9LAogI2RlZmluZSBDVFMgXAoteyBISUxTRV9DVFMsCQl7IHBhY2tldDogMCAgICB9LCAwLCBISUxTRU5fTkVYVCB8IEhJTFNFTl9TQ0hFRCB8IEhJTFNFTl9CUkVBSywgSElMU0VOX0RPWkUsIDAgfSwKK3sgSElMU0VfQ1RTLAkJeyAucGFja2V0ID0gMCAgICB9LCAwLCBISUxTRU5fTkVYVCB8IEhJTFNFTl9TQ0hFRCB8IEhJTFNFTl9CUkVBSywgSElMU0VOX0RPWkUsIDAgfSwKICNkZWZpbmUgRVhQRUNUKGNvbXAsIHRvLCBnb3QsIGdvdF93cm9uZywgdGltZWRfb3V0KSBcCi17IEhJTFNFX0VYUEVDVCwJCXsgcGFja2V0OiBjb21wIH0sIHRvLCBnb3QsIGdvdF93cm9uZywgdGltZWRfb3V0IH0sCit7IEhJTFNFX0VYUEVDVCwJCXsgLnBhY2tldCA9IGNvbXAgfSwgdG8sIGdvdCwgZ290X3dyb25nLCB0aW1lZF9vdXQgfSwKICNkZWZpbmUgRVhQRUNUX0xBU1QoY29tcCwgdG8sIGdvdCwgZ290X3dyb25nLCB0aW1lZF9vdXQpIFwKLXsgSElMU0VfRVhQRUNUX0xBU1QsCXsgcGFja2V0OiBjb21wIH0sIHRvLCBnb3QsIGdvdF93cm9uZywgdGltZWRfb3V0IH0sCit7IEhJTFNFX0VYUEVDVF9MQVNULAl7IC5wYWNrZXQgPSBjb21wIH0sIHRvLCBnb3QsIGdvdF93cm9uZywgdGltZWRfb3V0IH0sCiAjZGVmaW5lIEVYUEVDVF9ESVNDKGNvbXAsIHRvLCBnb3QsIGdvdF93cm9uZywgdGltZWRfb3V0KSBcCi17IEhJTFNFX0VYUEVDVF9ESVNDLAl7IHBhY2tldDogY29tcCB9LCB0bywgZ290LCBnb3Rfd3JvbmcsIHRpbWVkX291dCB9LAoreyBISUxTRV9FWFBFQ1RfRElTQywJeyAucGFja2V0ID0gY29tcCB9LCB0bywgZ290LCBnb3Rfd3JvbmcsIHRpbWVkX291dCB9LAogI2RlZmluZSBJTih0bywgZ290LCBnb3RfZXJyb3IsIHRpbWVkX291dCkgXAoteyBISUxTRV9JTiwJCXsgcGFja2V0OiAwICAgIH0sIHRvLCBnb3QsIGdvdF9lcnJvciwgdGltZWRfb3V0IH0sCit7IEhJTFNFX0lOLAkJeyAucGFja2V0ID0gMCAgICB9LCB0bywgZ290LCBnb3RfZXJyb3IsIHRpbWVkX291dCB9LAogI2RlZmluZSBPVVRfRElTQyhwYWNrKSBcCi17IEhJTFNFX09VVF9ESVNDLAl7IHBhY2tldDogcGFjayB9LCAwLCAwLCAwLCAwIH0sCit7IEhJTFNFX09VVF9ESVNDLAl7IC5wYWNrZXQgPSBwYWNrIH0sIDAsIDAsIDAsIDAgfSwKICNkZWZpbmUgT1VUX0xBU1QocGFjaykgXAoteyBISUxTRV9PVVRfTEFTVCwJeyBwYWNrZXQ6IHBhY2sgfSwgMCwgMCwgMCwgMCB9LAoreyBISUxTRV9PVVRfTEFTVCwJeyAucGFja2V0ID0gcGFjayB9LCAwLCAwLCAwLCAwIH0sCiAKIHN0cnVjdCBoaWxzZV9ub2RlIGhpbF9tbGNfc2VbSElMU0VOX0VORF0gPSB7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5wdXQvc2VyaW8vaHBfc2RjLmMgYi9kcml2ZXJzL2lucHV0L3NlcmlvL2hwX3NkYy5jCmluZGV4IGJhN2I5MjAuLjk5MDdhZDMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5wdXQvc2VyaW8vaHBfc2RjLmMKKysrIGIvZHJpdmVycy9pbnB1dC9zZXJpby9ocF9zZGMuYwpAQCAtMzEwLDcgKzMxMCw3IEBACiAJCQkJICogaW4gdGFza2xldC9iaCBjb250ZXh0LgogCQkJCSAqLwogCQkJCWlmIChjdXJyLT5hY3QuaXJxaG9vaykgCi0JCQkJCWN1cnItPmFjdC5pcnFob29rKDAsIDAsIDAsIDApOworCQkJCQljdXJyLT5hY3QuaXJxaG9vaygwLCBOVUxMLCAwLCAwKTsKIAkJCX0KIAkJCWN1cnItPmFjdGlkeCA9IGN1cnItPmlkeDsKIAkJCWN1cnItPmlkeCsrOwpAQCAtNTI1LDcgKzUyNSw3IEBACiAJCXVwKGN1cnItPmFjdC5zZW1hcGhvcmUpOwogCX0KIAllbHNlIGlmIChhY3QgJiBIUF9TRENfQUNUX0NBTExCQUNLKSB7Ci0JCWN1cnItPmFjdC5pcnFob29rKDAsMCwwLDApOworCQljdXJyLT5hY3QuaXJxaG9vaygwLE5VTEwsMCwwKTsKIAl9CiAJaWYgKGN1cnItPmlkeCA+PSBjdXJyLT5lbmRpZHgpIHsgLyogVGhpcyB0cmFuc2FjdGlvbiBpcyBvdmVyLiAqLwogCQlpZiAoYWN0ICYgSFBfU0RDX0FDVF9ERUFMTE9DKSBrZnJlZShjdXJyKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5wdXQvc2VyaW8vaTgwNDIuYyBiL2RyaXZlcnMvaW5wdXQvc2VyaW8vaTgwNDIuYwppbmRleCAwOWIwNmU2Li43ZTMxNDFmIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lucHV0L3NlcmlvL2k4MDQyLmMKKysrIGIvZHJpdmVycy9pbnB1dC9zZXJpby9pODA0Mi5jCkBAIC0xMDYsNiArMTA2LDcgQEAKIHN0YXRpYyB1bnNpZ25lZCBjaGFyIGk4MDQyX211eF9wcmVzZW50Owogc3RhdGljIHVuc2lnbmVkIGNoYXIgaTgwNDJfa2JkX2lycV9yZWdpc3RlcmVkOwogc3RhdGljIHVuc2lnbmVkIGNoYXIgaTgwNDJfYXV4X2lycV9yZWdpc3RlcmVkOworc3RhdGljIHVuc2lnbmVkIGNoYXIgaTgwNDJfc3VwcHJlc3Nfa2JkX2FjazsKIHN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICppODA0Ml9wbGF0Zm9ybV9kZXZpY2U7CiAKIHN0YXRpYyBpcnFyZXR1cm5fdCBpODA0Ml9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkKTsKQEAgLTMxNiw3ICszMTcsNyBAQAogCXVuc2lnbmVkIGNoYXIgc3RyLCBkYXRhOwogCXVuc2lnbmVkIGludCBkZmw7CiAJdW5zaWduZWQgaW50IHBvcnRfbm87Ci0JaW50IHJldDsKKwlpbnQgcmV0ID0gMTsKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZpODA0Ml9sb2NrLCBmbGFncyk7CiAJc3RyID0gaTgwNDJfcmVhZF9zdGF0dXMoKTsKQEAgLTM3OCwxMCArMzc5LDE2IEBACiAJICAgIGRmbCAmIFNFUklPX1BBUklUWSA/ICIsIGJhZCBwYXJpdHkiIDogIiIsCiAJICAgIGRmbCAmIFNFUklPX1RJTUVPVVQgPyAiLCB0aW1lb3V0IiA6ICIiKTsKIAorCWlmICh1bmxpa2VseShpODA0Ml9zdXBwcmVzc19rYmRfYWNrKSkKKwkJaWYgKHBvcnRfbm8gPT0gSTgwNDJfS0JEX1BPUlRfTk8gJiYKKwkJICAgIChkYXRhID09IDB4ZmEgfHwgZGF0YSA9PSAweGZlKSkgeworCQkJaTgwNDJfc3VwcHJlc3Nfa2JkX2FjayA9IDA7CisJCQlnb3RvIG91dDsKKwkJfQorCiAJaWYgKGxpa2VseShwb3J0LT5leGlzdHMpKQogCQlzZXJpb19pbnRlcnJ1cHQocG9ydC0+c2VyaW8sIGRhdGEsIGRmbCk7CiAKLQlyZXQgPSAxOwogIG91dDoKIAlyZXR1cm4gSVJRX1JFVFZBTChyZXQpOwogfQpAQCAtODQyLDExICs4NDksMTMgQEAKIAlsZWQgXj0gMHgwMSB8IDB4MDQ7CiAJd2hpbGUgKGk4MDQyX3JlYWRfc3RhdHVzKCkgJiBJODA0Ml9TVFJfSUJGKQogCQlERUxBWTsKKwlpODA0Ml9zdXBwcmVzc19rYmRfYWNrID0gMTsKIAlpODA0Ml93cml0ZV9kYXRhKDB4ZWQpOyAvKiBzZXQgbGVkcyAqLwogCURFTEFZOwogCXdoaWxlIChpODA0Ml9yZWFkX3N0YXR1cygpICYgSTgwNDJfU1RSX0lCRikKIAkJREVMQVk7CiAJREVMQVk7CisJaTgwNDJfc3VwcHJlc3Nfa2JkX2FjayA9IDE7CiAJaTgwNDJfd3JpdGVfZGF0YShsZWQpOwogCURFTEFZOwogCWxhc3RfYmxpbmsgPSBjb3VudDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5wdXQvc2VyaW8vbGlicHMyLmMgYi9kcml2ZXJzL2lucHV0L3NlcmlvL2xpYnBzMi5jCmluZGV4IGRjYjE2YjUuLmU1YjFiNjAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5wdXQvc2VyaW8vbGlicHMyLmMKKysrIGIvZHJpdmVycy9pbnB1dC9zZXJpby9saWJwczIuYwpAQCAtMTg5LDcgKzE4OSw3IEBACiAJCXJldHVybiAtMTsKIAl9CiAKLQltdXRleF9sb2NrX25lc3RlZCgmcHMyZGV2LT5jbWRfbXV0ZXgsIFNJTkdMRV9ERVBUSF9ORVNUSU5HKTsKKwltdXRleF9sb2NrKCZwczJkZXYtPmNtZF9tdXRleCk7CiAKIAlzZXJpb19wYXVzZV9yeChwczJkZXYtPnNlcmlvKTsKIAlwczJkZXYtPmZsYWdzID0gY29tbWFuZCA9PSBQUzJfQ01EX0dFVElEID8gUFMyX0ZMQUdfV0FJVElEIDogMDsKQEAgLTI5Niw2ICsyOTYsNyBAQAogdm9pZCBwczJfaW5pdChzdHJ1Y3QgcHMyZGV2ICpwczJkZXYsIHN0cnVjdCBzZXJpbyAqc2VyaW8pCiB7CiAJbXV0ZXhfaW5pdCgmcHMyZGV2LT5jbWRfbXV0ZXgpOworCWxvY2tkZXBfc2V0X3N1YmNsYXNzKCZwczJkZXYtPmNtZF9tdXRleCwgc2VyaW8tPmRlcHRoKTsKIAlpbml0X3dhaXRxdWV1ZV9oZWFkKCZwczJkZXYtPndhaXQpOwogCXBzMmRldi0+c2VyaW8gPSBzZXJpbzsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5wdXQvc2VyaW8vc2VyaW8uYyBiL2RyaXZlcnMvaW5wdXQvc2VyaW8vc2VyaW8uYwppbmRleCA5NjBmYWUzLi4yMTE5NDNmIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lucHV0L3NlcmlvL3NlcmlvLmMKKysrIGIvZHJpdmVycy9pbnB1dC9zZXJpby9zZXJpby5jCkBAIC0xMTgsNiArMTE4LDggQEAKIAogc3RhdGljIHZvaWQgc2VyaW9fYmluZF9kcml2ZXIoc3RydWN0IHNlcmlvICpzZXJpbywgc3RydWN0IHNlcmlvX2RyaXZlciAqZHJ2KQogeworCWludCBlcnJvcjsKKwogCWRvd25fd3JpdGUoJnNlcmlvX2J1cy5zdWJzeXMucndzZW0pOwogCiAJaWYgKHNlcmlvX21hdGNoX3BvcnQoZHJ2LT5pZF90YWJsZSwgc2VyaW8pKSB7CkBAIC0xMjYsOSArMTI4LDE5IEBACiAJCQlzZXJpby0+ZGV2LmRyaXZlciA9IE5VTEw7CiAJCQlnb3RvIG91dDsKIAkJfQotCQlkZXZpY2VfYmluZF9kcml2ZXIoJnNlcmlvLT5kZXYpOworCQllcnJvciA9IGRldmljZV9iaW5kX2RyaXZlcigmc2VyaW8tPmRldik7CisJCWlmIChlcnJvcikgeworCQkJcHJpbnRrKEtFUk5fV0FSTklORworCQkJCSJzZXJpbzogZGV2aWNlX2JpbmRfZHJpdmVyKCkgZmFpbGVkICIKKwkJCQkiZm9yICVzICglcykgYW5kICVzLCBlcnJvcjogJWRcbiIsCisJCQkJc2VyaW8tPnBoeXMsIHNlcmlvLT5uYW1lLAorCQkJCWRydi0+ZGVzY3JpcHRpb24sIGVycm9yKTsKKwkJCXNlcmlvX2Rpc2Nvbm5lY3RfZHJpdmVyKHNlcmlvKTsKKwkJCXNlcmlvLT5kZXYuZHJpdmVyID0gTlVMTDsKKwkJCWdvdG8gb3V0OworCQl9CiAJfQotb3V0OgorIG91dDoKIAl1cF93cml0ZSgmc2VyaW9fYnVzLnN1YnN5cy5yd3NlbSk7CiB9CiAKQEAgLTUzOCw4ICs1NTAsMTIgQEAKIAkJICJzZXJpbyVsZCIsIChsb25nKWF0b21pY19pbmNfcmV0dXJuKCZzZXJpb19ubykgLSAxKTsKIAlzZXJpby0+ZGV2LmJ1cyA9ICZzZXJpb19idXM7CiAJc2VyaW8tPmRldi5yZWxlYXNlID0gc2VyaW9fcmVsZWFzZV9wb3J0OwotCWlmIChzZXJpby0+cGFyZW50KQorCWlmIChzZXJpby0+cGFyZW50KSB7CiAJCXNlcmlvLT5kZXYucGFyZW50ID0gJnNlcmlvLT5wYXJlbnQtPmRldjsKKwkJc2VyaW8tPmRlcHRoID0gc2VyaW8tPnBhcmVudC0+ZGVwdGggKyAxOworCX0gZWxzZQorCQlzZXJpby0+ZGVwdGggPSAwOworCWxvY2tkZXBfc2V0X3N1YmNsYXNzKCZzZXJpby0+bG9jaywgc2VyaW8tPmRlcHRoKTsKIH0KIAogLyoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5wdXQvdG91Y2hzY3JlZW4vY29yZ2lfdHMuYyBiL2RyaXZlcnMvaW5wdXQvdG91Y2hzY3JlZW4vY29yZ2lfdHMuYwppbmRleCBjYTc5YjIyLi42NjEyMWY2IDEwMDY0NAotLS0gYS9kcml2ZXJzL2lucHV0L3RvdWNoc2NyZWVuL2NvcmdpX3RzLmMKKysrIGIvZHJpdmVycy9pbnB1dC90b3VjaHNjcmVlbi9jb3JnaV90cy5jCkBAIC0yMTksNyArMjE5LDcgQEAKIHN0YXRpYyB2b2lkIGNvcmdpX3RzX3RpbWVyKHVuc2lnbmVkIGxvbmcgZGF0YSkKIHsKIAlzdHJ1Y3QgY29yZ2lfdHMgKmNvcmdpdHNfZGF0YSA9IChzdHJ1Y3QgY29yZ2lfdHMgKikgZGF0YTsKLQl0c19pbnRlcnJ1cHRfbWFpbihjb3JnaXRzX2RhdGEsIDEsIE5VTEwpOworCXRzX2ludGVycnVwdF9tYWluKGNvcmdpdHNfZGF0YSwgMSk7CiB9CiAKIHN0YXRpYyBpcnFyZXR1cm5fdCB0c19pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkKQpAQCAtMjM3LDcgKzIzNyw3IEBACiAJaWYgKGNvcmdpX3RzLT5wZW5kb3duKSB7CiAJCWRlbF90aW1lcl9zeW5jKCZjb3JnaV90cy0+dGltZXIpOwogCQljb3JnaV90cy0+dGMucHJlc3N1cmUgPSAwOwotCQluZXdfZGF0YShjb3JnaV90cywgTlVMTCk7CisJCW5ld19kYXRhKGNvcmdpX3RzKTsKIAkJY29yZ2lfdHMtPnBlbmRvd24gPSAwOwogCX0KIAljb3JnaV90cy0+cG93ZXJfbW9kZSA9IFBXUl9NT0RFX1NVU1BFTkQ7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L3RvdWNoc2NyZWVuL2hwNjgwX3RzX2lucHV0LmMgYi9kcml2ZXJzL2lucHV0L3RvdWNoc2NyZWVuL2hwNjgwX3RzX2lucHV0LmMKaW5kZXggZTMxYzZjNS4uNThmY2EzMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbnB1dC90b3VjaHNjcmVlbi9ocDY4MF90c19pbnB1dC5jCisrKyBiL2RyaXZlcnMvaW5wdXQvdG91Y2hzY3JlZW4vaHA2ODBfdHNfaW5wdXQuYwpAQCAtNiw3ICs2LDcgQEAKICNpbmNsdWRlIDxhc20vaW8uaD4KICNpbmNsdWRlIDxhc20vZGVsYXkuaD4KICNpbmNsdWRlIDxhc20vYWRjLmg+Ci0jaW5jbHVkZSA8YXNtL2hwNnh4L2hwNnh4Lmg+CisjaW5jbHVkZSA8YXNtL2hwNnh4Lmg+CiAKICNkZWZpbmUgTU9ETkFNRSAiaHA2ODBfdHNfaW5wdXQiCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaXNkbi9jYXBpL2NhcGlkcnYuYyBiL2RyaXZlcnMvaXNkbi9jYXBpL2NhcGlkcnYuYwppbmRleCBkMTBjOGI4Li5iNmY5NDc2IDEwMDY0NAotLS0gYS9kcml2ZXJzL2lzZG4vY2FwaS9jYXBpZHJ2LmMKKysrIGIvZHJpdmVycy9pc2RuL2NhcGkvY2FwaWRydi5jCkBAIC0xOTA3LDcgKzE5MDcsOCBAQAogCX0KIAogCWZvciAocD1idWYsIGNvdW50PTA7IGNvdW50IDwgbGVuOyBwKyssIGNvdW50KyspIHsKLQkJcHV0X3VzZXIoKmNhcmQtPnE5MzFfcmVhZCsrLCBwKTsKKwkJaWYgKHB1dF91c2VyKCpjYXJkLT5xOTMxX3JlYWQrKywgcCkpCisJCQlyZXR1cm4gLUVGQVVMVDsKIAkgICAgICAgIGlmIChjYXJkLT5xOTMxX3JlYWQgPiBjYXJkLT5xOTMxX2VuZCkKIAkgICAgICAgICAgICAgICAgY2FyZC0+cTkzMV9yZWFkID0gY2FyZC0+cTkzMV9idWY7CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pc2RuL2dpZ2FzZXQvY29tbW9uLmMgYi9kcml2ZXJzL2lzZG4vZ2lnYXNldC9jb21tb24uYwppbmRleCBhY2ExNjVkLi41ODAwYmVlZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pc2RuL2dpZ2FzZXQvY29tbW9uLmMKKysrIGIvZHJpdmVycy9pc2RuL2dpZ2FzZXQvY29tbW9uLmMKQEAgLTYxNiw3ICs2MTYsNyBAQAogCX0gZWxzZSBpZiAoKGJjcy0+c2tiID0gZGV2X2FsbG9jX3NrYihTQlVGU0laRSArIEhXX0hEUl9MRU4pKSAhPSBOVUxMKQogCQlza2JfcmVzZXJ2ZShiY3MtPnNrYiwgSFdfSERSX0xFTik7CiAJZWxzZSB7Ci0JCWRldl93YXJuKGNzLT5kZXYsICJjb3VsZCBub3QgYWxsb2NhdGUgc2tiXG4iKTsKKwkJd2FybigiY291bGQgbm90IGFsbG9jYXRlIHNrYlxuIik7CiAJCWJjcy0+aW5wdXRzdGF0ZSB8PSBJTlNfc2tpcF9mcmFtZTsKIAl9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaXNkbi9oaXNheC9LY29uZmlnIGIvZHJpdmVycy9pc2RuL2hpc2F4L0tjb25maWcKaW5kZXggZWI1N2E5OC4uY2ZkMjcxOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pc2RuL2hpc2F4L0tjb25maWcKKysrIGIvZHJpdmVycy9pc2RuL2hpc2F4L0tjb25maWcKQEAgLTM0NCw3ICszNDQsNyBAQAogCiBjb25maWcgSElTQVhfRU5URVJOT1dfUENJCiAJYm9vbCAiRm9ybXVsYS1uIGVudGVyOm5vdyBQQ0kgY2FyZCIKLQlkZXBlbmRzIG9uIFBDSSAmJiAoQlJPS0VOIHx8ICEoU1BBUkMgfHwgUFBDIHx8IFBBUklTQyB8fCBNNjhLIHx8IEZSVikpCisJZGVwZW5kcyBvbiBISVNBWF9ORVRKRVQgJiYgUENJICYmIChCUk9LRU4gfHwgIShTUEFSQyB8fCBQUEMgfHwgUEFSSVNDIHx8IE02OEsgfHwgRlJWKSkKIAloZWxwCiAJICBUaGlzIGVuYWJsZXMgSGlTYXggc3VwcG9ydCBmb3IgdGhlIEZvcm11bGEtbiBlbnRlcjpub3cgUENJCiAJICBJU0ROIGNhcmQuCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lzZG4vaGlzYXgvY29uZmlnLmMgYi9kcml2ZXJzL2lzZG4vaGlzYXgvY29uZmlnLmMKaW5kZXggZTQ4MjNhYjIuLjc4NWIwODUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaXNkbi9oaXNheC9jb25maWcuYworKysgYi9kcml2ZXJzL2lzZG4vaGlzYXgvY29uZmlnLmMKQEAgLTYzMSw3ICs2MzEsOCBAQAogCQljb3VudCA9IGNzLT5zdGF0dXNfZW5kIC0gY3MtPnN0YXR1c19yZWFkICsgMTsKIAkJaWYgKGNvdW50ID49IGxlbikKIAkJCWNvdW50ID0gbGVuOwotCQljb3B5X3RvX3VzZXIocCwgY3MtPnN0YXR1c19yZWFkLCBjb3VudCk7CisJCWlmIChjb3B5X3RvX3VzZXIocCwgY3MtPnN0YXR1c19yZWFkLCBjb3VudCkpCisJCQlyZXR1cm4gLUVGQVVMVDsKIAkJY3MtPnN0YXR1c19yZWFkICs9IGNvdW50OwogCQlpZiAoY3MtPnN0YXR1c19yZWFkID4gY3MtPnN0YXR1c19lbmQpCiAJCQljcy0+c3RhdHVzX3JlYWQgPSBjcy0+c3RhdHVzX2J1ZjsKQEAgLTY0Miw3ICs2NDMsOCBAQAogCQkJCWNudCA9IEhJU0FYX1NUQVRVU19CVUZTSVpFOwogCQkJZWxzZQogCQkJCWNudCA9IGNvdW50OwotCQkJY29weV90b191c2VyKHAsIGNzLT5zdGF0dXNfcmVhZCwgY250KTsKKwkJCWlmIChjb3B5X3RvX3VzZXIocCwgY3MtPnN0YXR1c19yZWFkLCBjbnQpKQorCQkJCXJldHVybiAtRUZBVUxUOwogCQkJcCArPSBjbnQ7CiAJCQljcy0+c3RhdHVzX3JlYWQgKz0gY250ICUgSElTQVhfU1RBVFVTX0JVRlNJWkU7CiAJCQljb3VudCAtPSBjbnQ7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lzZG4vaGlzYXgvZGl2YS5jIGIvZHJpdmVycy9pc2RuL2hpc2F4L2RpdmEuYwppbmRleCA3ZTk1ZjA0Li4zZGFjZmZmIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lzZG4vaGlzYXgvZGl2YS5jCisrKyBiL2RyaXZlcnMvaXNkbi9oaXNheC9kaXZhLmMKQEAgLTcxNiw4ICs3MTYsMTAgQEAKIAogCQkqY2ZnID0gMDsgLyogZGlzYWJsZSBJTlQwLzEgKi8gCiAJCSpjZmcgPSAyOyAvKiByZXNldCBwZW5kaW5nIElOVDAgKi8KLQkJaW91bm1hcCgodm9pZCAqKWNzLT5ody5kaXZhLmNmZ19yZWcpOwotCQlpb3VubWFwKCh2b2lkICopY3MtPmh3LmRpdmEucGNpX2NmZyk7CisJCWlmIChjcy0+aHcuZGl2YS5jZmdfcmVnKQorCQkJaW91bm1hcCgodm9pZCAqKWNzLT5ody5kaXZhLmNmZ19yZWcpOworCQlpZiAoY3MtPmh3LmRpdmEucGNpX2NmZykKKwkJCWlvdW5tYXAoKHZvaWQgKiljcy0+aHcuZGl2YS5wY2lfY2ZnKTsKIAkJcmV0dXJuOwogCX0gZWxzZSBpZiAoY3MtPnN1YnR5cCAhPSBESVZBX0lQQUNfSVNBKSB7CiAJCWRlbF90aW1lcigmY3MtPmh3LmRpdmEudGwpOwpAQCAtNzM0LDYgKzczNiwyMyBAQAogfQogCiBzdGF0aWMgdm9pZAoraW91bm1hcF9kaXZhKHN0cnVjdCBJc2RuQ2FyZFN0YXRlICpjcykKK3sKKwlpZiAoKGNzLT5zdWJ0eXAgPT0gRElWQV9JUEFDX1BDSSkgfHwgKGNzLT5zdWJ0eXAgPT0gRElWQV9JUEFDWF9QQ0kpKSB7CisJCWlmIChjcy0+aHcuZGl2YS5jZmdfcmVnKSB7CisJCQlpb3VubWFwKCh2b2lkICopY3MtPmh3LmRpdmEuY2ZnX3JlZyk7CisJCQljcy0+aHcuZGl2YS5jZmdfcmVnID0gMDsKKwkJfQorCQlpZiAoY3MtPmh3LmRpdmEucGNpX2NmZykgeworCQkJaW91bm1hcCgodm9pZCAqKWNzLT5ody5kaXZhLnBjaV9jZmcpOworCQkJY3MtPmh3LmRpdmEucGNpX2NmZyA9IDA7CisJCX0KKwl9CisKKwlyZXR1cm47Cit9CisKK3N0YXRpYyB2b2lkCiByZXNldF9kaXZhKHN0cnVjdCBJc2RuQ2FyZFN0YXRlICpjcykKIHsKIAlpZiAoY3MtPnN1YnR5cCA9PSBESVZBX0lQQUNfSVNBKSB7CkBAIC0xMDY5LDExICsxMDg4LDEzIEBACiAKIAkJaWYgKCFjcy0+aXJxKSB7CiAJCQlwcmludGsoS0VSTl9XQVJOSU5HICJEaXZhOiBObyBJUlEgZm9yIFBDSSBjYXJkIGZvdW5kXG4iKTsKKwkJCWlvdW5tYXBfZGl2YShjcyk7CiAJCQlyZXR1cm4oMCk7CiAJCX0KIAogCQlpZiAoIWNzLT5ody5kaXZhLmNmZ19yZWcpIHsKIAkJCXByaW50ayhLRVJOX1dBUk5JTkcgIkRpdmE6IE5vIElPLUFkciBmb3IgUENJIGNhcmQgZm91bmRcbiIpOworCQkJaW91bm1hcF9kaXZhKGNzKTsKIAkJCXJldHVybigwKTsKIAkJfQogCQljcy0+aXJxX2ZsYWdzIHw9IElSUUZfU0hBUkVEOwpAQCAtMTEyMyw2ICsxMTQ0LDcgQEAKIAkJCSAgICAgICBDYXJkVHlwZVtjYXJkLT50eXBdLAogCQkJICAgICAgIGNzLT5ody5kaXZhLmNmZ19yZWcsCiAJCQkgICAgICAgY3MtPmh3LmRpdmEuY2ZnX3JlZyArIGJ5dGVjbnQpOworCQkJaW91bm1hcF9kaXZhKGNzKTsKIAkJCXJldHVybiAoMCk7CiAJCX0KIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lzZG4vaHlzZG4vYm9hcmRlcmdvLmMgYi9kcml2ZXJzL2lzZG4vaHlzZG4vYm9hcmRlcmdvLmMKaW5kZXggMTYwZjIyZi4uODJlNDJhOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pc2RuL2h5c2RuL2JvYXJkZXJnby5jCisrKyBiL2RyaXZlcnMvaXNkbi9oeXNkbi9ib2FyZGVyZ28uYwpAQCAtNDUsMTEgKzQ1LDEwIEBACiAJaWYgKCFjYXJkLT5pcnFfZW5hYmxlZCkKIAkJcmV0dXJuIElSUV9OT05FOwkJLyogb3RoZXIgZGV2aWNlIGludGVycnVwdGluZyBvciBpcnEgc3dpdGNoZWQgb2ZmICovCiAKLQlzYXZlX2ZsYWdzKGZsYWdzKTsKLQljbGkoKTsJCQkvKiBubyBmdXJ0aGVyIGlycXMgYWxsb3dlZCAqLworCXNwaW5fbG9ja19pcnFzYXZlKCZjYXJkLT5oeXNkbl9sb2NrLCBmbGFncyk7IC8qIG5vIGZ1cnRoZXIgaXJxcyBhbGxvd2VkICovCiAKIAlpZiAoIShieXRlaW4oY2FyZC0+aW9iYXNlICsgUENJOTA1MF9JTlRSX1JFRykgJiBQQ0k5MDUwX0lOVFJfUkVHX1NUQVQxKSkgewotCQlyZXN0b3JlX2ZsYWdzKGZsYWdzKTsJLyogcmVzdG9yZSBvbGQgc3RhdGUgKi8KKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2FyZC0+aHlzZG5fbG9jaywgZmxhZ3MpOwkvKiByZXN0b3JlIG9sZCBzdGF0ZSAqLwogCQlyZXR1cm4gSVJRX05PTkU7CQkvKiBubyBpbnRlcnJ1cHQgcmVxdWVzdGVkIGJ5IEUxICovCiAJfQogCS8qIGNsZWFyIGFueSBwZW5kaW5nIGludHMgb24gdGhlIGJvYXJkICovCkBAIC02MSw3ICs2MCw3IEBACiAJLyogc3RhcnQga2VybmVsIHRhc2sgaW1tZWRpYXRlbHkgYWZ0ZXIgbGVhdmluZyBhbGwgaW50ZXJydXB0cyAqLwogCWlmICghY2FyZC0+aHdfbG9jaykKIAkJc2NoZWR1bGVfd29yaygmY2FyZC0+aXJxX3F1ZXVlKTsKLQlyZXN0b3JlX2ZsYWdzKGZsYWdzKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjYXJkLT5oeXNkbl9sb2NrLCBmbGFncyk7CiAJcmV0dXJuIElSUV9IQU5ETEVEOwogfQkJCQkvKiBlcmdvX2ludGVycnVwdCAqLwogCkBAIC04MywxMCArODIsOSBAQAogCiAJZHByID0gY2FyZC0+ZHByYW07CS8qIHBvaW50IHRvIERQUkFNICovCiAKLQlzYXZlX2ZsYWdzKGZsYWdzKTsKLQljbGkoKTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmY2FyZC0+aHlzZG5fbG9jaywgZmxhZ3MpOwogCWlmIChjYXJkLT5od19sb2NrKSB7Ci0JCXJlc3RvcmVfZmxhZ3MoZmxhZ3MpOwkvKiBoYXJkd2FyZSBjdXJyZW50bHkgdW5hdmFpbGFibGUgKi8KKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2FyZC0+aHlzZG5fbG9jaywgZmxhZ3MpOwkvKiBoYXJkd2FyZSBjdXJyZW50bHkgdW5hdmFpbGFibGUgKi8KIAkJcmV0dXJuOwogCX0KIAljYXJkLT5od19sb2NrID0gMTsJLyogd2Ugbm93IGxvY2sgdGhlIGhhcmR3YXJlICovCkBAIC0xMjAsNyArMTE4LDcgQEAKIAkJCWNhcmQtPmh3X2xvY2sgPSAwOwkvKiBmcmVlIGhhcmR3YXJlIGFnYWluICovCiAJfSB3aGlsZSAoYWdhaW4pOwkvKiB1bnRpbCBub3RoaW5nIG1vcmUgdG8gZG8gKi8KIAotCXJlc3RvcmVfZmxhZ3MoZmxhZ3MpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNhcmQtPmh5c2RuX2xvY2ssIGZsYWdzKTsKIH0JCQkJLyogZXJnb19pcnFfYmggKi8KIAogCkBAIC0xMzcsOCArMTM1LDcgQEAKICNpZmRlZiBDT05GSUdfSFlTRE5fQ0FQSQogCWh5Y2FwaV9jYXBpX3N0b3AoY2FyZCk7CiAjZW5kaWYgLyogQ09ORklHX0hZU0ROX0NBUEkgKi8KLQlzYXZlX2ZsYWdzKGZsYWdzKTsKLQljbGkoKTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmY2FyZC0+aHlzZG5fbG9jaywgZmxhZ3MpOwogCXZhbCA9IGJ5dGVpbihjYXJkLT5pb2Jhc2UgKyBQQ0k5MDUwX0lOVFJfUkVHKTsJLyogZ2V0IGFjdHVhbCB2YWx1ZSAqLwogCXZhbCAmPSB+KFBDSTkwNTBfSU5UUl9SRUdfRU5QQ0kgfCBQQ0k5MDUwX0lOVFJfUkVHX0VOMSk7CS8qIG1hc2sgaXJxICovCiAJYnl0ZW91dChjYXJkLT5pb2Jhc2UgKyBQQ0k5MDUwX0lOVFJfUkVHLCB2YWwpOwpAQCAtMTQ3LDcgKzE0NCw3IEBACiAJY2FyZC0+c3RhdGUgPSBDQVJEX1NUQVRFX1VOVVNFRDsKIAljYXJkLT5lcnJfbG9nX3N0YXRlID0gRVJSTE9HX1NUQVRFX09GRjsJCS8qIGN1cnJlbnRseSBubyBsb2cgYWN0aXZlICovCiAKLQlyZXN0b3JlX2ZsYWdzKGZsYWdzKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjYXJkLT5oeXNkbl9sb2NrLCBmbGFncyk7CiB9CQkJCS8qIGVyZ29fc3RvcGNhcmQgKi8KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpAQCAtMTYyLDEyICsxNTksMTEgQEAKIAkJY2FyZC0+ZXJyX2xvZ19zdGF0ZSA9IEVSUkxPR19TVEFURV9PRkY7CQkvKiBtdXN0IGJlIG9mZiAqLwogCQlyZXR1cm47CiAJfQotCXNhdmVfZmxhZ3MoZmxhZ3MpOwotCWNsaSgpOworCXNwaW5fbG9ja19pcnFzYXZlKCZjYXJkLT5oeXNkbl9sb2NrLCBmbGFncyk7CiAKIAlpZiAoKChjYXJkLT5lcnJfbG9nX3N0YXRlID09IEVSUkxPR19TVEFURV9PRkYpICYmICFvbikgfHwKIAkgICAgKChjYXJkLT5lcnJfbG9nX3N0YXRlID09IEVSUkxPR19TVEFURV9PTikgJiYgb24pKSB7Ci0JCXJlc3RvcmVfZmxhZ3MoZmxhZ3MpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjYXJkLT5oeXNkbl9sb2NrLCBmbGFncyk7CiAJCXJldHVybjsJCS8qIG5vdGhpbmcgdG8gZG8gKi8KIAl9CiAJaWYgKG9uKQpAQCAtMTc1LDcgKzE3MSw3IEBACiAJZWxzZQogCQljYXJkLT5lcnJfbG9nX3N0YXRlID0gRVJSTE9HX1NUQVRFX1NUT1A7CS8qIHJlcXVlc3Qgc3RvcCAqLwogCi0JcmVzdG9yZV9mbGFncyhmbGFncyk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2FyZC0+aHlzZG5fbG9jaywgZmxhZ3MpOwogCXNjaGVkdWxlX3dvcmsoJmNhcmQtPmlycV9xdWV1ZSk7CiB9CQkJCS8qIGVyZ29fc2V0X2VycmxvZ19zdGF0ZSAqLwogCkBAIC0zNTYsOCArMzUyLDcgQEAKIAogCQkJaWYgKGNhcmQtPmRlYnVnX2ZsYWdzICYgTE9HX1BPRl9SRUNPUkQpCiAJCQkJaHlzZG5fYWRkbG9nKGNhcmQsICJFUkdPOiBwb2YgYm9vdCBzdWNjZXNzIik7Ci0JCQlzYXZlX2ZsYWdzKGZsYWdzKTsKLQkJCWNsaSgpOworCQkJc3Bpbl9sb2NrX2lycXNhdmUoJmNhcmQtPmh5c2RuX2xvY2ssIGZsYWdzKTsKIAogCQkJY2FyZC0+c3RhdGUgPSBDQVJEX1NUQVRFX1JVTjsJLyogbm93IGNhcmQgaXMgcnVubmluZyAqLwogCQkJLyogZW5hYmxlIHRoZSBjYXJkcyBpbnRlcnJ1cHQgKi8KQEAgLTM3MCw3ICszNjUsNyBAQAogCQkJZHByLT5Ub0h5SW50ID0gMTsKIAkJCWRwci0+VG9QY0ludCA9IDE7CS8qIGludGVycnVwdCB0byBFMSBmb3IgYWxsIGNhcmRzICovCiAKLQkJCXJlc3RvcmVfZmxhZ3MoZmxhZ3MpOworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2FyZC0+aHlzZG5fbG9jaywgZmxhZ3MpOwogCQkJaWYgKChoeW5ldF9lbmFibGUgJiAoMSA8PCBjYXJkLT5teWlkKSkgCiAJCQkgICAgJiYgKGkgPSBoeXNkbl9uZXRfY3JlYXRlKGNhcmQpKSkgCiAJCQl7CkBAIC00MDgsNyArNDAzLDcgQEAKIAlmcmVlX2lycShjYXJkLT5pcnEsIGNhcmQpOwkvKiByZWxlYXNlIGludGVycnVwdCAqLwogCXJlbGVhc2VfcmVnaW9uKGNhcmQtPmlvYmFzZSArIFBDSTkwNTBfSU5UUl9SRUcsIDEpOwkvKiByZWxlYXNlIGFsbCBpbyBwb3J0cyAqLwogCXJlbGVhc2VfcmVnaW9uKGNhcmQtPmlvYmFzZSArIFBDSTkwNTBfVVNFUl9JTywgMSk7Ci0JdmZyZWUoY2FyZC0+ZHByYW0pOworCWlvdW5tYXAoY2FyZC0+ZHByYW0pOwogCWNhcmQtPmRwcmFtID0gTlVMTDsJLyogcmVsZWFzZSBzaGFyZWQgbWVtICovCiB9CQkJCS8qIGVyZ29fcmVsZWFzZWhhcmR3YXJlICovCiAKQEAgLTQ0OCw2ICs0NDMsNyBAQAogCWNhcmQtPndhaXRwb2ZyZWFkeSA9IGVyZ29fd2FpdHBvZnJlYWR5OwogCWNhcmQtPnNldF9lcnJsb2dfc3RhdGUgPSBlcmdvX3NldF9lcnJsb2dfc3RhdGU7CiAJSU5JVF9XT1JLKCZjYXJkLT5pcnFfcXVldWUsICh2b2lkICopICh2b2lkICopIGVyZ29faXJxX2JoLCBjYXJkKTsKKwljYXJkLT5oeXNkbl9sb2NrID0gU1BJTl9MT0NLX1VOTE9DS0VEOwogCiAJcmV0dXJuICgwKTsKIH0JCQkJLyogZXJnb19pbml0aGFyZHdhcmUgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaXNkbi9oeXNkbi9oeXNkbl9kZWZzLmggYi9kcml2ZXJzL2lzZG4vaHlzZG4vaHlzZG5fZGVmcy5oCmluZGV4IDQ2MWU4MzEuLjcyOWRmNDAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaXNkbi9oeXNkbi9oeXNkbl9kZWZzLmgKKysrIGIvZHJpdmVycy9pc2RuL2h5c2RuL2h5c2RuX2RlZnMuaApAQCAtMTg4LDYgKzE4OCw4IEBACiAJLyogaW5pdCBhbmQgZGVpbml0IHN0b3BjYXJkIGZvciBib290aW5nLCB0b28gKi8KIAl2b2lkICgqc3RvcGNhcmQpIChzdHJ1Y3QgSFlTRE5fQ0FSRCAqKTsKIAl2b2lkICgqcmVsZWFzZWhhcmR3YXJlKSAoc3RydWN0IEhZU0ROX0NBUkQgKik7CisKKwlzcGlubG9ja190IGh5c2RuX2xvY2s7CiAjaWZkZWYgQ09ORklHX0hZU0ROX0NBUEkKIAlzdHJ1Y3QgaHljYXBpY3RybF9pbmZvIHsKIAkJY2hhciBjYXJkbmFtZVszMl07CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lzZG4vaHlzZG4vaHlzZG5fcHJvY2xvZy5jIGIvZHJpdmVycy9pc2RuL2h5c2RuL2h5c2RuX3Byb2Nsb2cuYwppbmRleCBjNDMwMWU4Li5mY2Q0OTkyIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lzZG4vaHlzZG4vaHlzZG5fcHJvY2xvZy5jCisrKyBiL2RyaXZlcnMvaXNkbi9oeXNkbi9oeXNkbl9wcm9jbG9nLmMKQEAgLTExNiw4ICsxMTYsNyBAQAogCXN0cmNweShpYi0+bG9nX3N0YXJ0LCBjcCk7CS8qIHNldCBvdXRwdXQgc3RyaW5nICovCiAJaWItPm5leHQgPSBOVUxMOwogCWliLT5wcm9jX2N0cmwgPSBwZDsJLyogcG9pbnQgdG8gb3duIGNvbnRyb2wgc3RydWN0dXJlICovCi0Jc2F2ZV9mbGFncyhmbGFncyk7Ci0JY2xpKCk7CisJc3Bpbl9sb2NrX2lycXNhdmUoJmNhcmQtPmh5c2RuX2xvY2ssIGZsYWdzKTsKIAlpYi0+dXNhZ2VfY250ID0gcGQtPmlmX3VzZWQ7CiAJaWYgKCFwZC0+bG9nX2hlYWQpCiAJCXBkLT5sb2dfaGVhZCA9IGliOwkvKiBuZXcgaGVhZCAqLwpAQCAtMTI1LDcgKzEyNCw3IEBACiAJCXBkLT5sb2dfdGFpbC0+bmV4dCA9IGliOwkvKiBmb2xsb3dzIGV4aXN0aW5nIG1lc3NhZ2VzICovCiAJcGQtPmxvZ190YWlsID0gaWI7CS8qIG5ldyB0YWlsICovCiAJaSA9IHBkLT5kZWxfbG9jaysrOwkvKiBnZXQgbG9jayBzdGF0ZSAqLwotCXJlc3RvcmVfZmxhZ3MoZmxhZ3MpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNhcmQtPmh5c2RuX2xvY2ssIGZsYWdzKTsKIAogCS8qIGRlbGV0ZSBvbGQgZW50cnlzICovCiAJaWYgKCFpKQpAQCAtMjcwLDE0ICsyNjksMTMgQEAKIAl9IGVsc2UgaWYgKChmaWxlcC0+Zl9tb2RlICYgKEZNT0RFX1JFQUQgfCBGTU9ERV9XUklURSkpID09IEZNT0RFX1JFQUQpIHsKIAogCQkvKiByZWFkIGFjY2VzcyAtPiBsb2cvZGVidWcgcmVhZCAqLwotCQlzYXZlX2ZsYWdzKGZsYWdzKTsKLQkJY2xpKCk7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZjYXJkLT5oeXNkbl9sb2NrLCBmbGFncyk7CiAJCXBkLT5pZl91c2VkKys7CiAJCWlmIChwZC0+bG9nX2hlYWQpCiAJCQlmaWxlcC0+cHJpdmF0ZV9kYXRhID0gJnBkLT5sb2dfdGFpbC0+bmV4dDsKIAkJZWxzZQogCQkJZmlsZXAtPnByaXZhdGVfZGF0YSA9ICZwZC0+bG9nX2hlYWQ7Ci0JCXJlc3RvcmVfZmxhZ3MoZmxhZ3MpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjYXJkLT5oeXNkbl9sb2NrLCBmbGFncyk7CiAJfSBlbHNlIHsJCS8qIHNpbXVsdGFuZW91cyByZWFkL3dyaXRlIGFjY2VzcyBmb3JiaWRkZW4gISAqLwogCQl1bmxvY2tfa2VybmVsKCk7CiAJCXJldHVybiAoLUVQRVJNKTsJLyogbm8gcGVybWlzc2lvbiB0aGlzIHRpbWUgKi8KQEAgLTMwMSw3ICsyOTksNyBAQAogCWh5c2RuX2NhcmQgKmNhcmQ7CiAJaW50IHJldHZhbCA9IDA7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKLQorCXNwaW5sb2NrX3QgaHlzZG5fbG9jayA9IFNQSU5fTE9DS19VTkxPQ0tFRDsKIAogCWxvY2tfa2VybmVsKCk7CiAJaWYgKChmaWxlcC0+Zl9tb2RlICYgKEZNT0RFX1JFQUQgfCBGTU9ERV9XUklURSkpID09IEZNT0RFX1dSSVRFKSB7CkBAIC0zMTEsOCArMzA5LDcgQEAKIAkJLyogcmVhZCBhY2Nlc3MgLT4gbG9nL2RlYnVnIHJlYWQsIG1hcmsgb25lIGZ1cnRoZXIgZmlsZSBhcyBjbG9zZWQgKi8KIAogCQlwZCA9IE5VTEw7Ci0JCXNhdmVfZmxhZ3MoZmxhZ3MpOwotCQljbGkoKTsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmh5c2RuX2xvY2ssIGZsYWdzKTsKIAkJaW5mID0gKigoc3RydWN0IGxvZ19kYXRhICoqKSBmaWxlcC0+cHJpdmF0ZV9kYXRhKTsJLyogZ2V0IGZpcnN0IGxvZyBlbnRyeSAqLwogCQlpZiAoaW5mKQogCQkJcGQgPSAoc3RydWN0IHByb2NkYXRhICopIGluZi0+cHJvY19jdHJsOwkvKiBzdGlsbCBlbnRyaWVzIHRoZXJlICovCkBAIC0zMzUsNyArMzMyLDcgQEAKIAkJCWluZi0+dXNhZ2VfY250LS07CS8qIGRlY3JlbWVudCB1c2FnZSBjb3VudCBmb3IgYnVmZmVycyAqLwogCQkJaW5mID0gaW5mLT5uZXh0OwogCQl9Ci0JCXJlc3RvcmVfZmxhZ3MoZmxhZ3MpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZoeXNkbl9sb2NrLCBmbGFncyk7CiAKIAkJaWYgKHBkKQogCQkJaWYgKHBkLT5pZl91c2VkIDw9IDApCS8qIGRlbGV0ZSBidWZmZXJzIGlmIGxhc3QgZmlsZSBjbG9zZWQgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaXNkbi9oeXNkbi9oeXNkbl9zY2hlZC5jIGIvZHJpdmVycy9pc2RuL2h5c2RuL2h5c2RuX3NjaGVkLmMKaW5kZXggMWMwZDU0YS4uMTg3NTg3NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9pc2RuL2h5c2RuL2h5c2RuX3NjaGVkLmMKKysrIGIvZHJpdmVycy9pc2RuL2h5c2RuL2h5c2RuX3NjaGVkLmMKQEAgLTE1NSwyMiArMTU1LDE3IEBACiAJaWYgKGNhcmQtPmRlYnVnX2ZsYWdzICYgTE9HX1NDSEVEX0FTWU4pCiAJCWh5c2RuX2FkZGxvZyhjYXJkLCAiYXN5bmMgdHgtY2ZnIGNoYW49JWQgbGVuPSVkIiwgY2hhbiwgc3RybGVuKGxpbmUpICsgMSk7CiAKLQlzYXZlX2ZsYWdzKGZsYWdzKTsKLQljbGkoKTsKIAl3aGlsZSAoY2FyZC0+YXN5bmNfYnVzeSkgewotCQlzdGkoKTsKIAogCQlpZiAoY2FyZC0+ZGVidWdfZmxhZ3MgJiBMT0dfU0NIRURfQVNZTikKIAkJCWh5c2RuX2FkZGxvZyhjYXJkLCAiYXN5bmMgdHgtY2ZnIGRlbGF5ZWQiKTsKIAogCQltc2xlZXBfaW50ZXJydXB0aWJsZSgyMCk7CQkvKiBUaW1lb3V0IDIwbXMgKi8KLQkJaWYgKCEtLWNudCkgewotCQkJcmVzdG9yZV9mbGFncyhmbGFncyk7CisJCWlmICghLS1jbnQpCiAJCQlyZXR1cm4gKC1FUlJfQVNZTkNfVElNRSk7CS8qIHRpbWVkIG91dCAqLwotCQl9Ci0JCWNsaSgpOwogCX0JCQkvKiB3YWl0IGZvciBidWZmZXIgdG8gYmVjb21lIGZyZWUgKi8KIAorCXNwaW5fbG9ja19pcnFzYXZlKCZjYXJkLT5oeXNkbl9sb2NrLCBmbGFncyk7CiAJc3RyY3B5KGNhcmQtPmFzeW5jX2RhdGEsIGxpbmUpOwogCWNhcmQtPmFzeW5jX2xlbiA9IHN0cmxlbihsaW5lKSArIDE7CiAJY2FyZC0+YXN5bmNfY2hhbm5lbCA9IGNoYW47CkBAIC0xNzgsMzAgKzE3MywyMyBAQAogCiAJLyogbm93IHF1ZXVlIHRoZSB0YXNrICovCiAJc2NoZWR1bGVfd29yaygmY2FyZC0+aXJxX3F1ZXVlKTsKLQlzdGkoKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjYXJkLT5oeXNkbl9sb2NrLCBmbGFncyk7CiAKIAlpZiAoY2FyZC0+ZGVidWdfZmxhZ3MgJiBMT0dfU0NIRURfQVNZTikKIAkJaHlzZG5fYWRkbG9nKGNhcmQsICJhc3luYyB0eC1jZmcgZGF0YSBxdWV1ZWQiKTsKIAogCWNudCsrOwkJCS8qIHNob3J0IGRlbGF5ICovCi0JY2xpKCk7CiAKIAl3aGlsZSAoY2FyZC0+YXN5bmNfYnVzeSkgewotCQlzdGkoKTsKIAogCQlpZiAoY2FyZC0+ZGVidWdfZmxhZ3MgJiBMT0dfU0NIRURfQVNZTikKIAkJCWh5c2RuX2FkZGxvZyhjYXJkLCAiYXN5bmMgdHgtY2ZnIHdhaXRpbmcgZm9yIHR4LXJlYWR5Iik7CiAKIAkJbXNsZWVwX2ludGVycnVwdGlibGUoMjApOwkJLyogVGltZW91dCAyMG1zICovCi0JCWlmICghLS1jbnQpIHsKLQkJCXJlc3RvcmVfZmxhZ3MoZmxhZ3MpOworCQlpZiAoIS0tY250KQogCQkJcmV0dXJuICgtRVJSX0FTWU5DX1RJTUUpOwkvKiB0aW1lZCBvdXQgKi8KLQkJfQotCQljbGkoKTsKIAl9CQkJLyogd2FpdCBmb3IgYnVmZmVyIHRvIGJlY29tZSBmcmVlIGFnYWluICovCiAKLQlyZXN0b3JlX2ZsYWdzKGZsYWdzKTsKLQogCWlmIChjYXJkLT5kZWJ1Z19mbGFncyAmIExPR19TQ0hFRF9BU1lOKQogCQloeXNkbl9hZGRsb2coY2FyZCwgImFzeW5jIHR4LWNmZyBkYXRhIHNlbmQiKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9pc2RuL2k0bC9pc2RuX2NvbW1vbi5jIGIvZHJpdmVycy9pc2RuL2k0bC9pc2RuX2NvbW1vbi5jCmluZGV4IGMzZDc5ZWUuLjY5YWVlMjYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaXNkbi9pNGwvaXNkbl9jb21tb24uYworKysgYi9kcml2ZXJzL2lzZG4vaTRsL2lzZG5fY29tbW9uLmMKQEAgLTExMzQsOSArMTEzNCwxMiBAQAogCQlpZiAoZGV2LT5kcnZbZHJ2aWR4XS0+aW50ZXJmYWNlLT5yZWFkc3RhdCkgewogCQkJaWYgKGNvdW50ID4gZGV2LT5kcnZbZHJ2aWR4XS0+c3RhdmFpbCkKIAkJCQljb3VudCA9IGRldi0+ZHJ2W2RydmlkeF0tPnN0YXZhaWw7Ci0JCQlsZW4gPSBkZXYtPmRydltkcnZpZHhdLT5pbnRlcmZhY2UtPgotCQkJCXJlYWRzdGF0KGJ1ZiwgY291bnQsIGRydmlkeCwKLQkJCQkJIGlzZG5fbWlub3IyY2hhbihtaW5vcikpOworCQkJbGVuID0gZGV2LT5kcnZbZHJ2aWR4XS0+aW50ZXJmYWNlLT5yZWFkc3RhdChidWYsIGNvdW50LAorCQkJCQkJZHJ2aWR4LCBpc2RuX21pbm9yMmNoYW4obWlub3IpKTsKKwkJCWlmIChsZW4gPCAwKSB7CisJCQkJcmV0dmFsID0gbGVuOworCQkJCWdvdG8gb3V0OworCQkJfQogCQl9IGVsc2UgewogCQkJbGVuID0gMDsKIAkJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pc2RuL2ljbi9pY24uYyBiL2RyaXZlcnMvaXNkbi9pY24vaWNuLmMKaW5kZXggNjY0OWY4Yi4uNzMwYmJkMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pc2RuL2ljbi9pY24uYworKysgYi9kcml2ZXJzL2lzZG4vaWNuL2ljbi5jCkBAIC0xMDEwLDcgKzEwMTAsOCBAQAogCWZvciAocCA9IGJ1ZiwgY291bnQgPSAwOyBjb3VudCA8IGxlbjsgcCsrLCBjb3VudCsrKSB7CiAJCWlmIChjYXJkLT5tc2dfYnVmX3JlYWQgPT0gY2FyZC0+bXNnX2J1Zl93cml0ZSkKIAkJCXJldHVybiBjb3VudDsKLQkJcHV0X3VzZXIoKmNhcmQtPm1zZ19idWZfcmVhZCsrLCBwKTsKKwkJaWYgKHB1dF91c2VyKCpjYXJkLT5tc2dfYnVmX3JlYWQrKywgcCkpCisJCQlyZXR1cm4gLUVGQVVMVDsKIAkJaWYgKGNhcmQtPm1zZ19idWZfcmVhZCA+IGNhcmQtPm1zZ19idWZfZW5kKQogCQkJY2FyZC0+bXNnX2J1Zl9yZWFkID0gY2FyZC0+bXNnX2J1ZjsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lzZG4vaXNkbmxvb3AvaXNkbmxvb3AuYyBiL2RyaXZlcnMvaXNkbi9pc2RubG9vcC9pc2RubG9vcC5jCmluZGV4IGZhYmJkNDYuLmMzYWUyZWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaXNkbi9pc2RubG9vcC9pc2RubG9vcC5jCisrKyBiL2RyaXZlcnMvaXNkbi9pc2RubG9vcC9pc2RubG9vcC5jCkBAIC0xMDAsMTIgKzEwMCwxMSBAQAogCQlpc2RubG9vcF9iY2hhbl9zZW5kKGNhcmQsIDEpOwogCWlmIChjYXJkLT5mbGFncyAmIChJU0ROTE9PUF9GTEFHU19CMUFDVElWRSB8IElTRE5MT09QX0ZMQUdTX0IyQUNUSVZFKSkgewogCQkvKiBzY2hlZHVsZSBiLWNoYW5uZWwgcG9sbGluZyBhZ2FpbiAqLwotCQlzYXZlX2ZsYWdzKGZsYWdzKTsKLQkJY2xpKCk7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZjYXJkLT5pc2RubG9vcF9sb2NrLCBmbGFncyk7CiAJCWNhcmQtPnJiX3RpbWVyLmV4cGlyZXMgPSBqaWZmaWVzICsgSVNETkxPT1BfVElNRVJfQkNSRUFEOwogCQlhZGRfdGltZXIoJmNhcmQtPnJiX3RpbWVyKTsKIAkJY2FyZC0+ZmxhZ3MgfD0gSVNETkxPT1BfRkxBR1NfUkJUSU1FUjsKLQkJcmVzdG9yZV9mbGFncyhmbGFncyk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNhcmQtPmlzZG5sb29wX2xvY2ssIGZsYWdzKTsKIAl9IGVsc2UKIAkJY2FyZC0+ZmxhZ3MgJj0gfklTRE5MT09QX0ZMQUdTX1JCVElNRVI7CiB9CkBAIC0yODEsOCArMjgwLDcgQEAKIHsKIAl1bG9uZyBmbGFnczsKIAotCXNhdmVfZmxhZ3MoZmxhZ3MpOwotCWNsaSgpOworCXNwaW5fbG9ja19pcnFzYXZlKCZjYXJkLT5pc2RubG9vcF9sb2NrLCBmbGFncyk7CiAJKmNhcmQtPm1zZ19idWZfd3JpdGUrKyA9IChjID09IDB4ZmYpID8gJ1xuJyA6IGM7CiAJaWYgKGNhcmQtPm1zZ19idWZfd3JpdGUgPT0gY2FyZC0+bXNnX2J1Zl9yZWFkKSB7CiAJCWlmICgrK2NhcmQtPm1zZ19idWZfcmVhZCA+IGNhcmQtPm1zZ19idWZfZW5kKQpAQCAtMjkwLDcgKzI4OCw3IEBACiAJfQogCWlmIChjYXJkLT5tc2dfYnVmX3dyaXRlID4gY2FyZC0+bXNnX2J1Zl9lbmQpCiAJCWNhcmQtPm1zZ19idWZfd3JpdGUgPSBjYXJkLT5tc2dfYnVmOwotCXJlc3RvcmVfZmxhZ3MoZmxhZ3MpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNhcmQtPmlzZG5sb29wX2xvY2ssIGZsYWdzKTsKIH0KIAogLyoKQEAgLTM3MiwyMSArMzcwLDE5IEBACiAJCWlmICghKGNhcmQtPmZsYWdzICYgSVNETkxPT1BfRkxBR1NfUkJUSU1FUikpIHsKIAkJCS8qIHNjaGVkdWxlIGItY2hhbm5lbCBwb2xsaW5nICovCiAJCQljYXJkLT5mbGFncyB8PSBJU0ROTE9PUF9GTEFHU19SQlRJTUVSOwotCQkJc2F2ZV9mbGFncyhmbGFncyk7Ci0JCQljbGkoKTsKKwkJCXNwaW5fbG9ja19pcnFzYXZlKCZjYXJkLT5pc2RubG9vcF9sb2NrLCBmbGFncyk7CiAJCQlkZWxfdGltZXIoJmNhcmQtPnJiX3RpbWVyKTsKIAkJCWNhcmQtPnJiX3RpbWVyLmZ1bmN0aW9uID0gaXNkbmxvb3BfcG9sbGJjaGFuOwogCQkJY2FyZC0+cmJfdGltZXIuZGF0YSA9ICh1bnNpZ25lZCBsb25nKSBjYXJkOwogCQkJY2FyZC0+cmJfdGltZXIuZXhwaXJlcyA9IGppZmZpZXMgKyBJU0ROTE9PUF9USU1FUl9CQ1JFQUQ7CiAJCQlhZGRfdGltZXIoJmNhcmQtPnJiX3RpbWVyKTsKLQkJCXJlc3RvcmVfZmxhZ3MoZmxhZ3MpOworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2FyZC0+aXNkbmxvb3BfbG9jaywgZmxhZ3MpOwogCQl9CiAJLyogc2NoZWR1bGUgYWdhaW4gKi8KLQlzYXZlX2ZsYWdzKGZsYWdzKTsKLQljbGkoKTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmY2FyZC0+aXNkbmxvb3BfbG9jaywgZmxhZ3MpOwogCWNhcmQtPnN0X3RpbWVyLmV4cGlyZXMgPSBqaWZmaWVzICsgSVNETkxPT1BfVElNRVJfRENSRUFEOwogCWFkZF90aW1lcigmY2FyZC0+c3RfdGltZXIpOwotCXJlc3RvcmVfZmxhZ3MoZmxhZ3MpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNhcmQtPmlzZG5sb29wX2xvY2ssIGZsYWdzKTsKIH0KIAogLyoKQEAgLTQxNiw4ICs0MTIsNyBAQAogCQkJcmV0dXJuIDA7CiAJCWlmIChjYXJkLT5zbmRjb3VudFtjaGFubmVsXSA+IElTRE5MT09QX01BWF9TUVVFVUUpCiAJCQlyZXR1cm4gMDsKLQkJc2F2ZV9mbGFncyhmbGFncyk7Ci0JCWNsaSgpOworCQlzcGluX2xvY2tfaXJxc2F2ZSgmY2FyZC0+aXNkbmxvb3BfbG9jaywgZmxhZ3MpOwogCQluc2tiID0gZGV2X2FsbG9jX3NrYihza2ItPmxlbik7CiAJCWlmIChuc2tiKSB7CiAJCQltZW1jcHkoc2tiX3B1dChuc2tiLCBsZW4pLCBza2ItPmRhdGEsIGxlbik7CkBAIC00MjYsNyArNDIxLDcgQEAKIAkJfSBlbHNlCiAJCQlsZW4gPSAwOwogCQljYXJkLT5zbmRjb3VudFtjaGFubmVsXSArPSBsZW47Ci0JCXJlc3RvcmVfZmxhZ3MoZmxhZ3MpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjYXJkLT5pc2RubG9vcF9sb2NrLCBmbGFncyk7CiAJfQogCXJldHVybiBsZW47CiB9CkBAIC00NTEsNyArNDQ2LDggQEAKIAlmb3IgKHAgPSBidWYsIGNvdW50ID0gMDsgY291bnQgPCBsZW47IHArKywgY291bnQrKykgewogCQlpZiAoY2FyZC0+bXNnX2J1Zl9yZWFkID09IGNhcmQtPm1zZ19idWZfd3JpdGUpCiAJCQlyZXR1cm4gY291bnQ7Ci0JCXB1dF91c2VyKCpjYXJkLT5tc2dfYnVmX3JlYWQrKywgcCk7CisJCWlmIChwdXRfdXNlcigqY2FyZC0+bXNnX2J1Zl9yZWFkKyssIHApKQorCQkJcmV0dXJuIC1FRkFVTFQ7CiAJCWlmIChjYXJkLT5tc2dfYnVmX3JlYWQgPiBjYXJkLT5tc2dfYnVmX2VuZCkKIAkJCWNhcmQtPm1zZ19idWZfcmVhZCA9IGNhcmQtPm1zZ19idWY7CiAJfQpAQCAtNTc2LDggKzU3Miw3IEBACiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAljaGFyIGJ1Zls2MF07CiAKLQlzYXZlX2ZsYWdzKGZsYWdzKTsKLQljbGkoKTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmY2FyZC0+aXNkbmxvb3BfbG9jaywgZmxhZ3MpOwogCWlmIChjYXJkLT5yY2FyZCkgewogCQlpc2RubG9vcF9mYWtlKGNhcmQtPnJjYXJkW2NoXSwgIkRESVNfSSIsIGNhcmQtPnJjaFtjaF0gKyAxKTsKIAkJY2FyZC0+cmNhcmRbY2hdLT5yY2FyZFtjYXJkLT5yY2hbY2hdXSA9IE5VTEw7CkBAIC01ODcsNyArNTgyLDcgQEAKIAkvKiBObyB1c2VyIHJlc3BvbmRpbmcgKi8KIAlzcHJpbnRmKGJ1ZiwgIkNBVSVzIiwgaXNkbmxvb3BfdW5pY2F1c2UoY2FyZCwgMSwgMykpOwogCWlzZG5sb29wX2Zha2UoY2FyZCwgYnVmLCBjaCArIDEpOwotCXJlc3RvcmVfZmxhZ3MoZmxhZ3MpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNhcmQtPmlzZG5sb29wX2xvY2ssIGZsYWdzKTsKIH0KIAogLyoKQEAgLTYyMiw4ICs2MTcsNyBAQAogewogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKLQlzYXZlX2ZsYWdzKGZsYWdzKTsKLQljbGkoKTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmY2FyZC0+aXNkbmxvb3BfbG9jaywgZmxhZ3MpOwogCWluaXRfdGltZXIoJmNhcmQtPmNfdGltZXJbY2hdKTsKIAljYXJkLT5jX3RpbWVyW2NoXS5leHBpcmVzID0gamlmZmllcyArIElTRE5MT09QX1RJTUVSX0FMRVJUV0FJVDsKIAlpZiAoY2gpCkBAIC02MzIsNyArNjI2LDcgQEAKIAkJY2FyZC0+Y190aW1lcltjaF0uZnVuY3Rpb24gPSBpc2RubG9vcF9hdGltZW91dDA7CiAJY2FyZC0+Y190aW1lcltjaF0uZGF0YSA9ICh1bnNpZ25lZCBsb25nKSBjYXJkOwogCWFkZF90aW1lcigmY2FyZC0+Y190aW1lcltjaF0pOwotCXJlc3RvcmVfZmxhZ3MoZmxhZ3MpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNhcmQtPmlzZG5sb29wX2xvY2ssIGZsYWdzKTsKIH0KIAogLyoKQEAgLTY0NywxMCArNjQxLDkgQEAKIHsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCi0Jc2F2ZV9mbGFncyhmbGFncyk7Ci0JY2xpKCk7CisJc3Bpbl9sb2NrX2lycXNhdmUoJmNhcmQtPmlzZG5sb29wX2xvY2ssIGZsYWdzKTsKIAlkZWxfdGltZXIoJmNhcmQtPmNfdGltZXJbY2hdKTsKLQlyZXN0b3JlX2ZsYWdzKGZsYWdzKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjYXJkLT5pc2RubG9vcF9sb2NrLCBmbGFncyk7CiB9CiAKIHN0YXRpYyB1X2NoYXIgc2kyYml0W10gPQpAQCAtNzA2LDEzICs2OTksMTIgQEAKIAkJCQkJfQogCQkJfQogCQkJaWYgKG51bV9tYXRjaCkgewotCQkJCXNhdmVfZmxhZ3MoZmxhZ3MpOwotCQkJCWNsaSgpOworCQkJCXNwaW5fbG9ja19pcnFzYXZlKCZjYXJkLT5pc2RubG9vcF9sb2NrLCBmbGFncyk7CiAJCQkJLyogY2hhbm5lbCBpZGxlPyAqLwogCQkJCWlmICghKGNjLT5yY2FyZFtjaF0pKSB7CiAJCQkJCS8qIENoZWNrIFNJICovCiAJCQkJCWlmICghKHNpMmJpdFtjbWQtPnBhcm0uc2V0dXAuc2kxXSAmIGNjLT5zaWxbY2hdKSkgewotCQkJCQkJcmVzdG9yZV9mbGFncyhmbGFncyk7CisJCQkJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjYXJkLT5pc2RubG9vcF9sb2NrLCBmbGFncyk7CiAJCQkJCQlyZXR1cm4gMzsKIAkJCQkJfQogCQkJCQkvKiBjaCBpcyBpZGxlLCBzaSBhbmQgbnVtYmVyIG1hdGNoZXMgKi8KQEAgLTcyMCwxMCArNzEyLDEwIEBACiAJCQkJCWNjLT5yY2hbY2hdID0gbGNoOwogCQkJCQljYXJkLT5yY2FyZFtsY2hdID0gY2M7CiAJCQkJCWNhcmQtPnJjaFtsY2hdID0gY2g7Ci0JCQkJCXJlc3RvcmVfZmxhZ3MoZmxhZ3MpOworCQkJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjYXJkLT5pc2RubG9vcF9sb2NrLCBmbGFncyk7CiAJCQkJCXJldHVybiAwOwogCQkJCX0gZWxzZSB7Ci0JCQkJCXJlc3RvcmVfZmxhZ3MoZmxhZ3MpOworCQkJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjYXJkLT5pc2RubG9vcF9sb2NrLCBmbGFncyk7CiAJCQkJCS8qIG51bSBtYXRjaGVzLCBidXQgYnVzeSAqLwogCQkJCQlpZiAoY2ggPT0gMSkKIAkJCQkJCXJldHVybiAxOwpAQCAtMTAyNyw4ICsxMDE5LDcgQEAKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCWlzZG5fY3RybCBjbWQ7CiAKLQlzYXZlX2ZsYWdzKGZsYWdzKTsKLQljbGkoKTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmY2FyZC0+aXNkbmxvb3BfbG9jaywgZmxhZ3MpOwogCWlmIChjYXJkLT5mbGFncyAmIElTRE5MT09QX0ZMQUdTX1JVTk5JTkcpIHsKIAkJY2FyZC0+ZmxhZ3MgJj0gfklTRE5MT09QX0ZMQUdTX1JVTk5JTkc7CiAJCWRlbF90aW1lcigmY2FyZC0+c3RfdGltZXIpOwpAQCAtMTAzOSw3ICsxMDMwLDcgQEAKIAkJY21kLmRyaXZlciA9IGNhcmQtPm15aWQ7CiAJCWNhcmQtPmludGVyZmFjZS5zdGF0Y2FsbGIoJmNtZCk7CiAJfQotCXJlc3RvcmVfZmxhZ3MoZmxhZ3MpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNhcmQtPmlzZG5sb29wX2xvY2ssIGZsYWdzKTsKIH0KIAogLyoKQEAgLTEwNzgsMTggKzEwNjksMTcgQEAKIAkJcmV0dXJuIC1FQlVTWTsKIAlpZiAoY29weV9mcm9tX3VzZXIoKGNoYXIgKikgJnNkZWYsIChjaGFyICopIHNkZWZwLCBzaXplb2Yoc2RlZikpKQogCQlyZXR1cm4gLUVGQVVMVDsKLQlzYXZlX2ZsYWdzKGZsYWdzKTsKLQljbGkoKTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmY2FyZC0+aXNkbmxvb3BfbG9jaywgZmxhZ3MpOwogCXN3aXRjaCAoc2RlZi5wdHlwZSkgewogCQljYXNlIElTRE5fUFRZUEVfRVVSTzoKIAkJCWlmIChpc2RubG9vcF9mYWtlKGNhcmQsICJEUlYxLjIzRUMtUS45MzEtQ0FQSS1DTlMtQkFTSVMtMjAuMDIuOTYiLAogCQkJCQkgIC0xKSkgewotCQkJCXJlc3RvcmVfZmxhZ3MoZmxhZ3MpOworCQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNhcmQtPmlzZG5sb29wX2xvY2ssIGZsYWdzKTsKIAkJCQlyZXR1cm4gLUVOT01FTTsKIAkJCX0KIAkJCWNhcmQtPnNpbFswXSA9IGNhcmQtPnNpbFsxXSA9IDQ7CiAJCQlpZiAoaXNkbmxvb3BfZmFrZShjYXJkLCAiVEVJIE9LIiwgMCkpIHsKLQkJCQlyZXN0b3JlX2ZsYWdzKGZsYWdzKTsKKwkJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjYXJkLT5pc2RubG9vcF9sb2NrLCBmbGFncyk7CiAJCQkJcmV0dXJuIC1FTk9NRU07CiAJCQl9CiAJCQlmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKQpAQCAtMTA5OCwxMiArMTA4OCwxMiBAQAogCQljYXNlIElTRE5fUFRZUEVfMVRSNjoKIAkJCWlmIChpc2RubG9vcF9mYWtlKGNhcmQsICJEUlYxLjA0VEMtMVRSNi1DQVBJLUNOUy1CQVNJUy0yOS4xMS45NSIsCiAJCQkJCSAgLTEpKSB7Ci0JCQkJcmVzdG9yZV9mbGFncyhmbGFncyk7CisJCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2FyZC0+aXNkbmxvb3BfbG9jaywgZmxhZ3MpOwogCQkJCXJldHVybiAtRU5PTUVNOwogCQkJfQogCQkJY2FyZC0+c2lsWzBdID0gY2FyZC0+c2lsWzFdID0gNDsKIAkJCWlmIChpc2RubG9vcF9mYWtlKGNhcmQsICJURUkgT0siLCAwKSkgewotCQkJCXJlc3RvcmVfZmxhZ3MoZmxhZ3MpOworCQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNhcmQtPmlzZG5sb29wX2xvY2ssIGZsYWdzKTsKIAkJCQlyZXR1cm4gLUVOT01FTTsKIAkJCX0KIAkJCXN0cmNweShjYXJkLT5zMG51bVswXSwgc2RlZi5udW1bMF0pOwpAQCAtMTExMSw3ICsxMTAxLDcgQEAKIAkJCWNhcmQtPnMwbnVtWzJdWzBdID0gJ1wwJzsKIAkJCWJyZWFrOwogCQlkZWZhdWx0OgotCQkJcmVzdG9yZV9mbGFncyhmbGFncyk7CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjYXJkLT5pc2RubG9vcF9sb2NrLCBmbGFncyk7CiAJCQlwcmludGsoS0VSTl9XQVJOSU5HICJpc2RubG9vcDogSWxsZWdhbCBELWNoYW5uZWwgcHJvdG9jb2wgJWRcbiIsCiAJCQkgICAgICAgc2RlZi5wdHlwZSk7CiAJCQlyZXR1cm4gLUVJTlZBTDsKQEAgLTExMjIsNyArMTExMiw3IEBACiAJY2FyZC0+c3RfdGltZXIuZGF0YSA9ICh1bnNpZ25lZCBsb25nKSBjYXJkOwogCWFkZF90aW1lcigmY2FyZC0+c3RfdGltZXIpOwogCWNhcmQtPmZsYWdzIHw9IElTRE5MT09QX0ZMQUdTX1JVTk5JTkc7Ci0JcmVzdG9yZV9mbGFncyhmbGFncyk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2FyZC0+aXNkbmxvb3BfbG9jaywgZmxhZ3MpOwogCXJldHVybiAwOwogfQogCkBAIC0xNDcyLDYgKzE0NjIsNyBAQAogCQlza2JfcXVldWVfaGVhZF9pbml0KCZjYXJkLT5icXVldWVbaV0pOwogCX0KIAlza2JfcXVldWVfaGVhZF9pbml0KCZjYXJkLT5kcXVldWUpOworCWNhcmQtPmlzZG5sb29wX2xvY2sgPSBTUElOX0xPQ0tfVU5MT0NLRUQ7CiAJY2FyZC0+bmV4dCA9IGNhcmRzOwogCWNhcmRzID0gY2FyZDsKIAlpZiAoIXJlZ2lzdGVyX2lzZG4oJmNhcmQtPmludGVyZmFjZSkpIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaXNkbi9pc2RubG9vcC9pc2RubG9vcC5oIGIvZHJpdmVycy9pc2RuL2lzZG5sb29wL2lzZG5sb29wLmgKaW5kZXggZDY5OWZlNS4uMGQ0NThhOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pc2RuL2lzZG5sb29wL2lzZG5sb29wLmgKKysrIGIvZHJpdmVycy9pc2RuL2lzZG5sb29wL2lzZG5sb29wLmgKQEAgLTk0LDYgKzk0LDcgQEAKIAlzdHJ1Y3Qgc2tfYnVmZl9oZWFkCiAJIGJxdWV1ZVtJU0ROTE9PUF9CQ0hdOyAgLyogQi1DaGFubmVsIHF1ZXVlcyAgICAgICAgICAgICAgICAgKi8KIAlzdHJ1Y3Qgc2tfYnVmZl9oZWFkIGRxdWV1ZTsJLyogRC1DaGFubmVsIHF1ZXVlICAgICAgICAgICAgICAgICAgKi8KKwlzcGlubG9ja190IGlzZG5sb29wX2xvY2s7CiB9IGlzZG5sb29wX2NhcmQ7CiAKIC8qCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lzZG4vcGNiaXQvZHJ2LmMgYi9kcml2ZXJzL2lzZG4vcGNiaXQvZHJ2LmMKaW5kZXggOTRmMjE0OC4uNmVhZDVlMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pc2RuL3BjYml0L2Rydi5jCisrKyBiL2RyaXZlcnMvaXNkbi9wY2JpdC9kcnYuYwpAQCAtNzI1LDIzICs3MjUsMjcgQEAKIAogCWlmIChzdGF0X3N0IDwgc3RhdF9lbmQpCiAJewotCQljb3B5X3RvX3VzZXIoYnVmLCBzdGF0YnVmICsgc3RhdF9zdCwgbGVuKTsKKwkJaWYgKGNvcHlfdG9fdXNlcihidWYsIHN0YXRidWYgKyBzdGF0X3N0LCBsZW4pKQorCQkJcmV0dXJuIC1FRkFVTFQ7CiAJCXN0YXRfc3QgKz0gbGVuOwkgICAKIAl9CiAJZWxzZQogCXsKIAkJaWYgKGxlbiA+IFNUQVRCVUZfTEVOIC0gc3RhdF9zdCkKIAkJewotCQkJY29weV90b191c2VyKGJ1Ziwgc3RhdGJ1ZiArIHN0YXRfc3QsIAotCQkJCSAgICAgICBTVEFUQlVGX0xFTiAtIHN0YXRfc3QpOwotCQkJY29weV90b191c2VyKGJ1Ziwgc3RhdGJ1ZiwgCi0JCQkJICAgICAgIGxlbiAtIChTVEFUQlVGX0xFTiAtIHN0YXRfc3QpKTsKKwkJCWlmIChjb3B5X3RvX3VzZXIoYnVmLCBzdGF0YnVmICsgc3RhdF9zdCwKKwkJCQkgICAgICAgU1RBVEJVRl9MRU4gLSBzdGF0X3N0KSkKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCWlmIChjb3B5X3RvX3VzZXIoYnVmLCBzdGF0YnVmLAorCQkJCSAgICAgICBsZW4gLSAoU1RBVEJVRl9MRU4gLSBzdGF0X3N0KSkpCisJCQkJcmV0dXJuIC1FRkFVTFQ7CiAKIAkJCXN0YXRfc3QgPSBsZW4gLSAoU1RBVEJVRl9MRU4gLSBzdGF0X3N0KTsKIAkJfQogCQllbHNlCiAJCXsKLQkJCWNvcHlfdG9fdXNlcihidWYsIHN0YXRidWYgKyBzdGF0X3N0LCBsZW4pOworCQkJaWYgKGNvcHlfdG9fdXNlcihidWYsIHN0YXRidWYgKyBzdGF0X3N0LCBsZW4pKQorCQkJCXJldHVybiAtRUZBVUxUOwogCiAJCQlzdGF0X3N0ICs9IGxlbjsKIAkJCQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pc2RuL3BjYml0L2xheWVyMi5jIGIvZHJpdmVycy9pc2RuL3BjYml0L2xheWVyMi5jCmluZGV4IDEzZTdkMjEuLjkzN2ZkMjEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaXNkbi9wY2JpdC9sYXllcjIuYworKysgYi9kcml2ZXJzL2lzZG4vcGNiaXQvbGF5ZXIyLmMKQEAgLTMxMSw2ICszMTEsNyBAQAogCQlkZXYtPnJlYWRfcXVldWUgPSBmcmFtZS0+bmV4dDsKIAkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2LT5sb2NrLCBmbGFncyk7CiAKKwkJbXNnID0gMDsKIAkJU0VUX01TR19DUFUobXNnLCAwKTsKIAkJU0VUX01TR19QUk9DKG1zZywgMCk7CiAJCVNFVF9NU0dfQ01EKG1zZywgZnJhbWUtPnNrYi0+ZGF0YVsyXSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lzZG4vc2MvaW5pdC5jIGIvZHJpdmVycy9pc2RuL3NjL2luaXQuYwppbmRleCAyMjJjYTdjLi4wNmM5ODcyIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lzZG4vc2MvaW5pdC5jCisrKyBiL2RyaXZlcnMvaXNkbi9zYy9pbml0LmMKQEAgLTk4LDEzICs5OCwxNCBAQAogCQkJICogQ29uZmlybSB0aGUgSS9PIEFkZHJlc3Mgd2l0aCBhIHRlc3QKIAkJCSAqLwogCQkJaWYoaW9bYl0gPT0gMCkgewotCQkJCXByX2RlYnVnKCJJL08gQWRkcmVzcyAweCV4IGlzIGluIHVzZS5cbiIpOworCQkJCXByX2RlYnVnKCJJL08gQWRkcmVzcyBpbnZhbGlkLlxuIik7CiAJCQkJY29udGludWU7CiAJCQl9CiAKIAkJCW91dGIoMHgxOCwgaW9bYl0gKyAweDQwMCAqIEVYUF9QQUdFMCk7CiAJCQlpZihpbmIoaW9bYl0gKyAweDQwMCAqIEVYUF9QQUdFMCkgIT0gMHgxOCkgewotCQkJCXByX2RlYnVnKCJJL08gQmFzZSAweCV4IGZhaWxzIHRlc3RcbiIpOworCQkJCXByX2RlYnVnKCJJL08gQmFzZSAweCV4IGZhaWxzIHRlc3RcbiIsCisJCQkJCSBpb1tiXSArIDB4NDAwICogRVhQX1BBR0UwKTsKIAkJCQljb250aW51ZTsKIAkJCX0KIAkJfQpAQCAtMTU4LDggKzE1OSw4IEBACiAJCQlvdXRiKDB4RkYsIGlvW2JdICsgUkVTRVRfT0ZGU0VUKTsKIAkJCW1zbGVlcF9pbnRlcnJ1cHRpYmxlKDEwMDAwKTsKIAkJfQotCQlwcl9kZWJ1ZygiUkFNIEJhc2UgZm9yIGJvYXJkICVkIGlzIDB4JXgsICVzIHByb2JlXG4iLCBiLCByYW1bYl0sCi0JCQlyYW1bYl0gPT0gMCA/ICJ3aWxsIiA6ICJ3b24ndCIpOworCQlwcl9kZWJ1ZygiUkFNIEJhc2UgZm9yIGJvYXJkICVkIGlzIDB4JWx4LCAlcyBwcm9iZVxuIiwgYiwKKwkJCXJhbVtiXSwgcmFtW2JdID09IDAgPyAid2lsbCIgOiAid29uJ3QiKTsKIAogCQlpZihyYW1bYl0pIHsKIAkJCS8qCkBAIC0xNjgsNyArMTY5LDcgQEAKIAkJCSAqIGJvYXJkIG1vZGVsCiAJCQkgKi8KIAkJCWlmKHJlcXVlc3RfcmVnaW9uKHJhbVtiXSwgU1JBTV9QQUdFU0laRSwgInNjIHRlc3QiKSkgewotCQkJCXByX2RlYnVnKCJyZXF1ZXN0X3JlZ2lvbiBmb3IgUkFNIGJhc2UgMHgleCBzdWNjZWVkZWRcbiIsIHJhbVtiXSk7CisJCQkJcHJfZGVidWcoInJlcXVlc3RfcmVnaW9uIGZvciBSQU0gYmFzZSAweCVseCBzdWNjZWVkZWRcbiIsIHJhbVtiXSk7CiAJCQkgCW1vZGVsID0gaWRlbnRpZnlfYm9hcmQocmFtW2JdLCBpb1tiXSk7CiAJCQkJcmVsZWFzZV9yZWdpb24ocmFtW2JdLCBTUkFNX1BBR0VTSVpFKTsKIAkJCX0KQEAgLTIwNCw3ICsyMDUsNyBAQAogCQkJICogTm9wZSwgdGhlcmUgd2FzIG5vIHBsYWNlIGluIFJBTSBmb3IgdGhlCiAJCQkgKiBib2FyZCwgb3IgaXQgY291bGRuJ3QgYmUgaWRlbnRpZmllZAogCQkJICovCi0JCQkgcHJfZGVidWcoIkZhaWxlZCB0byBmaW5kIGFuIGFkYXB0ZXIgYXQgMHgleFxuIiwgcmFtW2JdKTsKKwkJCSBwcl9kZWJ1ZygiRmFpbGVkIHRvIGZpbmQgYW4gYWRhcHRlciBhdCAweCVseFxuIiwgcmFtW2JdKTsKIAkJCSBjb250aW51ZTsKIAkJfQogCkBAIC00NTEsNyArNDUyLDcgQEAKIAlIV0NvbmZpZ19wbCBod2NpOwogCWludCB4OwogCi0JcHJfZGVidWcoIkF0dGVtcHRpbmcgdG8gaWRlbnRpZnkgYWRhcHRlciBAIDB4JXggaW8gMHgleFxuIiwKKwlwcl9kZWJ1ZygiQXR0ZW1wdGluZyB0byBpZGVudGlmeSBhZGFwdGVyIEAgMHglbHggaW8gMHgleFxuIiwKIAkJcmFtYmFzZSwgaW9iYXNlKTsKIAogCS8qCkBAIC00OTAsNyArNDkxLDcgQEAKIAlvdXRiKFBSSV9CQVNFUEdfVkFMLCBwZ3BvcnQpOwogCW1zbGVlcF9pbnRlcnJ1cHRpYmxlKDEwMDApOwogCXNpZyA9IHJlYWRsKHJhbWJhc2UgKyBTSUdfT0ZGU0VUKTsKLQlwcl9kZWJ1ZygiTG9va2luZyBmb3IgYSBzaWduYXR1cmUsIGdvdCAweCV4XG4iLCBzaWcpOworCXByX2RlYnVnKCJMb29raW5nIGZvciBhIHNpZ25hdHVyZSwgZ290IDB4JWx4XG4iLCBzaWcpOwogCWlmKHNpZyA9PSBTSUdOQVRVUkUpCiAJCXJldHVybiBQUklfQk9BUkQ7CiAKQEAgLTUwMCw3ICs1MDEsNyBAQAogCW91dGIoQlJJX0JBU0VQR19WQUwsIHBncG9ydCk7CiAJbXNsZWVwX2ludGVycnVwdGlibGUoMTAwMCk7CiAJc2lnID0gcmVhZGwocmFtYmFzZSArIFNJR19PRkZTRVQpOwotCXByX2RlYnVnKCJMb29raW5nIGZvciBhIHNpZ25hdHVyZSwgZ290IDB4JXhcbiIsIHNpZyk7CisJcHJfZGVidWcoIkxvb2tpbmcgZm9yIGEgc2lnbmF0dXJlLCBnb3QgMHglbHhcbiIsIHNpZyk7CiAJaWYoc2lnID09IFNJR05BVFVSRSkKIAkJcmV0dXJuIEJSSV9CT0FSRDsKIApAQCAtNTEwLDcgKzUxMSw3IEBACiAJICogVHJ5IHRvIHNwb3QgYSBjYXJkCiAJICovCiAJc2lnID0gcmVhZGwocmFtYmFzZSArIFNJR19PRkZTRVQpOwotCXByX2RlYnVnKCJMb29raW5nIGZvciBhIHNpZ25hdHVyZSwgZ290IDB4JXhcbiIsIHNpZyk7CisJcHJfZGVidWcoIkxvb2tpbmcgZm9yIGEgc2lnbmF0dXJlLCBnb3QgMHglbHhcbiIsIHNpZyk7CiAJaWYoc2lnICE9IFNJR05BVFVSRSkKIAkJcmV0dXJuIC0xOwogCkBAIC01NDAsNyArNTQxLDcgQEAKIAltZW1jcHlfZnJvbWlvKCZyY3Ztc2csICYoZHBtLT5yc3BfcXVldWVbZHBtLT5yc3BfdGFpbF0pLCBNU0dfTEVOKTsKIAlwcl9kZWJ1ZygiR290IEhXQ29uZmlnIHJlc3BvbnNlLCBzdGF0dXMgPSAweCV4XG4iLCByY3Ztc2cucnNwX3N0YXR1cyk7CiAJbWVtY3B5KCZod2NpLCAmKHJjdm1zZy5tc2dfZGF0YS5IV0NyZXNwb25zZSksIHNpemVvZihIV0NvbmZpZ19wbCkpOwotCXByX2RlYnVnKCJIYXJkd2FyZSBDb25maWc6IEludGVyZmFjZTogJXMsIFJBTSBTaXplOiAlZCwgU2VyaWFsOiAlc1xuIgorCXByX2RlYnVnKCJIYXJkd2FyZSBDb25maWc6IEludGVyZmFjZTogJXMsIFJBTSBTaXplOiAlbGQsIFNlcmlhbDogJXNcbiIKIAkJICIgICAgICAgICAgICAgICAgIFBhcnQ6ICVzLCBSZXY6ICVzXG4iLAogCQkgaHdjaS5zdF91X3NlbnNlID8gIlMvVCIgOiAiVSIsIGh3Y2kucmFtX3NpemUsCiAJCSBod2NpLnNlcmlhbF9ubywgaHdjaS5wYXJ0X25vLCBod2NpLnJldl9ubyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lzZG4vc2MvcGFja2V0LmMgYi9kcml2ZXJzL2lzZG4vc2MvcGFja2V0LmMKaW5kZXggZjUwZGVmYy4uMWUwNDY3NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9pc2RuL3NjL3BhY2tldC5jCisrKyBiL2RyaXZlcnMvaXNkbi9zYy9wYWNrZXQuYwpAQCAtNDQsNyArNDQsNyBAQAogCQlyZXR1cm4gLUVOT0RFVjsKIAl9CiAKLQlwcl9kZWJ1ZygiJXM6IHNuZHBrdDogZnJzdCA9IDB4JXggbnh0ID0gJWQgIGYgPSAlZCBuID0gJWRcbiIsCisJcHJfZGVidWcoIiVzOiBzbmRwa3Q6IGZyc3QgPSAweCVseCBueHQgPSAlZCAgZiA9ICVkIG4gPSAlZFxuIiwKIAkJc2NfYWRhcHRlcltjYXJkXS0+ZGV2aWNlbmFtZSwKIAkJc2NfYWRhcHRlcltjYXJkXS0+Y2hhbm5lbFtjaGFubmVsXS5maXJzdF9zZW5kYnVmLAogCQlzY19hZGFwdGVyW2NhcmRdLT5jaGFubmVsW2NoYW5uZWxdLm5leHRfc2VuZGJ1ZiwKQEAgLTY2LDcgKzY2LDcgQEAKIAlSZXFMbmtXcml0ZS5idWZmX29mZnNldCA9IHNjX2FkYXB0ZXJbY2FyZF0tPmNoYW5uZWxbY2hhbm5lbF0ubmV4dF9zZW5kYnVmICoKIAkJQlVGRkVSX1NJWkUgKyBzY19hZGFwdGVyW2NhcmRdLT5jaGFubmVsW2NoYW5uZWxdLmZpcnN0X3NlbmRidWY7CiAJUmVxTG5rV3JpdGUubXNnX2xlbiA9IGRhdGEtPmxlbjsgLyogc2tfYnVmZiBzaXplICovCi0JcHJfZGVidWcoIiVzOiB3cml0aW5nICVkIGJ5dGVzIHRvIGJ1ZmZlciBvZmZzZXQgMHgleFxuIiwKKwlwcl9kZWJ1ZygiJXM6IHdyaXRpbmcgJWQgYnl0ZXMgdG8gYnVmZmVyIG9mZnNldCAweCVseFxuIiwKIAkJCXNjX2FkYXB0ZXJbY2FyZF0tPmRldmljZW5hbWUsCiAJCQlSZXFMbmtXcml0ZS5tc2dfbGVuLCBSZXFMbmtXcml0ZS5idWZmX29mZnNldCk7CiAJbWVtY3B5X3Rvc2htZW0oY2FyZCwgKGNoYXIgKilSZXFMbmtXcml0ZS5idWZmX29mZnNldCwgZGF0YS0+ZGF0YSwgUmVxTG5rV3JpdGUubXNnX2xlbik7CkBAIC03NCw3ICs3NCw3IEBACiAJLyoKIAkgKiBzZW5kbWVzc2FnZQogCSAqLwotCXByX2RlYnVnKCIlczogc25kcGt0IHNpemU9JWQsIGJ1Zl9vZmZzZXQ9MHgleCBidWZfaW5keD0lZFxuIiwKKwlwcl9kZWJ1ZygiJXM6IHNuZHBrdCBzaXplPSVkLCBidWZfb2Zmc2V0PTB4JWx4IGJ1Zl9pbmR4PSVkXG4iLAogCQlzY19hZGFwdGVyW2NhcmRdLT5kZXZpY2VuYW1lLAogCQlSZXFMbmtXcml0ZS5tc2dfbGVuLCBSZXFMbmtXcml0ZS5idWZmX29mZnNldCwKIAkJc2NfYWRhcHRlcltjYXJkXS0+Y2hhbm5lbFtjaGFubmVsXS5uZXh0X3NlbmRidWYpOwpAQCAtMTI0LDcgKzEyNCw3IEBACiAJCQlyZXR1cm47CiAJCX0KIAkJc2tiX3B1dChza2IsIHJjdm1zZy0+bXNnX2RhdGEucmVzcG9uc2UubXNnX2xlbik7Ci0JCXByX2RlYnVnKCIlczogZ2V0dGluZyBkYXRhIGZyb20gb2Zmc2V0OiAweCV4XG4iLAorCQlwcl9kZWJ1ZygiJXM6IGdldHRpbmcgZGF0YSBmcm9tIG9mZnNldDogMHglbHhcbiIsCiAJCQlzY19hZGFwdGVyW2NhcmRdLT5kZXZpY2VuYW1lLAogCQkJcmN2bXNnLT5tc2dfZGF0YS5yZXNwb25zZS5idWZmX29mZnNldCk7CiAJCW1lbWNweV9mcm9tc2htZW0oY2FyZCwKQEAgLTE0Myw3ICsxNDMsNyBAQAogLyoJCW1lbXNldF9zaG1lbShjYXJkLCByY3Ztc2ctPm1zZ19kYXRhLnJlc3BvbnNlLmJ1ZmZfb2Zmc2V0LCAwLCBCVUZGRVJfU0laRSk7ICovCiAJCW5ld2xsLmJ1ZmZfb2Zmc2V0ID0gcmN2bXNnLT5tc2dfZGF0YS5yZXNwb25zZS5idWZmX29mZnNldDsKIAkJbmV3bGwubXNnX2xlbiA9IEJVRkZFUl9TSVpFOwotCQlwcl9kZWJ1ZygiJXM6IHJlY3ljbGVkIGJ1ZmZlciBhdCBvZmZzZXQgMHgleCBzaXplICVkXG4iLAorCQlwcl9kZWJ1ZygiJXM6IHJlY3ljbGVkIGJ1ZmZlciBhdCBvZmZzZXQgMHglbHggc2l6ZSAlZFxuIiwKIAkJCXNjX2FkYXB0ZXJbY2FyZF0tPmRldmljZW5hbWUsCiAJCQluZXdsbC5idWZmX29mZnNldCwgbmV3bGwubXNnX2xlbik7CiAJCXNlbmRtZXNzYWdlKGNhcmQsIENFUElELCBjZVJlcVR5cGVMbmssIGNlUmVxQ2xhc3MxLCBjZVJlcUxua1JlYWQsCkBAIC0xODYsNyArMTg2LDcgQEAKIAlzY19hZGFwdGVyW2NhcmRdLT5jaGFubmVsW2MtMV0ubnVtX3NlbmRidWZzID0gbkJ1ZmZlcnMgLyAyOwogCXNjX2FkYXB0ZXJbY2FyZF0tPmNoYW5uZWxbYy0xXS5mcmVlX3NlbmRidWZzID0gbkJ1ZmZlcnMgLyAyOwogCXNjX2FkYXB0ZXJbY2FyZF0tPmNoYW5uZWxbYy0xXS5uZXh0X3NlbmRidWYgPSAwOwotCXByX2RlYnVnKCIlczogc2VuZCBidWZmZXIgc2V0dXAgY29tcGxldGU6IGZpcnN0PTB4JXggbj0lZCBmPSVkLCBueHQ9JWRcbiIsCisJcHJfZGVidWcoIiVzOiBzZW5kIGJ1ZmZlciBzZXR1cCBjb21wbGV0ZTogZmlyc3Q9MHglbHggbj0lZCBmPSVkLCBueHQ9JWRcbiIsCiAJCQkJc2NfYWRhcHRlcltjYXJkXS0+ZGV2aWNlbmFtZSwKIAkJCQlzY19hZGFwdGVyW2NhcmRdLT5jaGFubmVsW2MtMV0uZmlyc3Rfc2VuZGJ1ZiwKIAkJCQlzY19hZGFwdGVyW2NhcmRdLT5jaGFubmVsW2MtMV0ubnVtX3NlbmRidWZzLApAQCAtMjAzLDcgKzIwMyw3IEBACiAJCQkoKHNjX2FkYXB0ZXJbY2FyZF0tPmNoYW5uZWxbYy0xXS5maXJzdF9zZW5kYnVmICsKIAkJCShuQnVmZmVycyAvIDIpICogYnVmZmVyX3NpemUpICsgKGJ1ZmZlcl9zaXplICogaSkpOwogCQlSY3ZCdWZmT2Zmc2V0Lm1zZ19sZW4gPSBidWZmZXJfc2l6ZTsKLQkJcHJfZGVidWcoIiVzOiBhZGRpbmcgUmN2QnVmZmVyICMlZCBvZmZzZXQ9MHgleCBzej0lZCBidWZzejolZFxuIiwKKwkJcHJfZGVidWcoIiVzOiBhZGRpbmcgUmN2QnVmZmVyICMlZCBvZmZzZXQ9MHglbHggc3o9JWQgYnVmc3o6JWRcbiIsCiAJCQkJc2NfYWRhcHRlcltjYXJkXS0+ZGV2aWNlbmFtZSwKIAkJCQlpICsgMSwgUmN2QnVmZk9mZnNldC5idWZmX29mZnNldCwgCiAJCQkJUmN2QnVmZk9mZnNldC5tc2dfbGVuLGJ1ZmZlcl9zaXplKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaXNkbi9zYy9zaG1lbS5jIGIvZHJpdmVycy9pc2RuL3NjL3NobWVtLmMKaW5kZXggMjQ4NTQ4MjYuLjZmNTg4NjIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaXNkbi9zYy9zaG1lbS5jCisrKyBiL2RyaXZlcnMvaXNkbi9zYy9zaG1lbS5jCkBAIC02MSw3ICs2MSw3IEBACiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc2NfYWRhcHRlcltjYXJkXS0+bG9jaywgZmxhZ3MpOwogCXByX2RlYnVnKCIlczogc2V0IHBhZ2UgdG8gJSN4XG4iLHNjX2FkYXB0ZXJbY2FyZF0tPmRldmljZW5hbWUsCiAJCSgoc2NfYWRhcHRlcltjYXJkXS0+c2htZW1fbWFnaWMgKyBjaCAqIFNSQU1fUEFHRVNJWkUpPj4xNCl8MHg4MCk7Ci0JcHJfZGVidWcoIiVzOiBjb3B5aW5nICVkIGJ5dGVzIGZyb20gJSN4IHRvICUjeFxuIiwKKwlwcl9kZWJ1ZygiJXM6IGNvcHlpbmcgJWQgYnl0ZXMgZnJvbSAlI2x4IHRvICUjbHhcbiIsCiAJCXNjX2FkYXB0ZXJbY2FyZF0tPmRldmljZW5hbWUsIG4sCiAJCSh1bnNpZ25lZCBsb25nKSBzcmMsCiAJCXNjX2FkYXB0ZXJbY2FyZF0tPnJhbWJhc2UgKyAoKHVuc2lnbmVkIGxvbmcpIGRlc3QgJTB4NDAwMCkpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9sZWRzL2xlZC1jbGFzcy5jIGIvZHJpdmVycy9sZWRzL2xlZC1jbGFzcy5jCmluZGV4IGFlY2JiZTIuLjNjMTcxMTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbGVkcy9sZWQtY2xhc3MuYworKysgYi9kcml2ZXJzL2xlZHMvbGVkLWNsYXNzLmMKQEAgLTkxLDYgKzkxLDggQEAKICAqLwogaW50IGxlZF9jbGFzc2Rldl9yZWdpc3RlcihzdHJ1Y3QgZGV2aWNlICpwYXJlbnQsIHN0cnVjdCBsZWRfY2xhc3NkZXYgKmxlZF9jZGV2KQogeworCWludCByYzsKKwogCWxlZF9jZGV2LT5jbGFzc19kZXYgPSBjbGFzc19kZXZpY2VfY3JlYXRlKGxlZHNfY2xhc3MsIE5VTEwsIDAsCiAJCQkJCQlwYXJlbnQsICIlcyIsIGxlZF9jZGV2LT5uYW1lKTsKIAlpZiAodW5saWtlbHkoSVNfRVJSKGxlZF9jZGV2LT5jbGFzc19kZXYpKSkKQEAgLTk5LDggKzEwMSwxMCBAQAogCWNsYXNzX3NldF9kZXZkYXRhKGxlZF9jZGV2LT5jbGFzc19kZXYsIGxlZF9jZGV2KTsKIAogCS8qIHJlZ2lzdGVyIHRoZSBhdHRyaWJ1dGVzICovCi0JY2xhc3NfZGV2aWNlX2NyZWF0ZV9maWxlKGxlZF9jZGV2LT5jbGFzc19kZXYsCi0JCQkJJmNsYXNzX2RldmljZV9hdHRyX2JyaWdodG5lc3MpOworCXJjID0gY2xhc3NfZGV2aWNlX2NyZWF0ZV9maWxlKGxlZF9jZGV2LT5jbGFzc19kZXYsCisJCQkJICAgICAgJmNsYXNzX2RldmljZV9hdHRyX2JyaWdodG5lc3MpOworCWlmIChyYykKKwkJZ290byBlcnJfb3V0OwogCiAJLyogYWRkIHRvIHRoZSBsaXN0IG9mIGxlZHMgKi8KIAl3cml0ZV9sb2NrKCZsZWRzX2xpc3RfbG9jayk7CkBAIC0xMTAsMTYgKzExNCwyOCBAQAogI2lmZGVmIENPTkZJR19MRURTX1RSSUdHRVJTCiAJcndsb2NrX2luaXQoJmxlZF9jZGV2LT50cmlnZ2VyX2xvY2spOwogCi0JbGVkX3RyaWdnZXJfc2V0X2RlZmF1bHQobGVkX2NkZXYpOworCXJjID0gY2xhc3NfZGV2aWNlX2NyZWF0ZV9maWxlKGxlZF9jZGV2LT5jbGFzc19kZXYsCisJCQkJICAgICAgJmNsYXNzX2RldmljZV9hdHRyX3RyaWdnZXIpOworCWlmIChyYykKKwkJZ290byBlcnJfb3V0X2xlZF9saXN0OwogCi0JY2xhc3NfZGV2aWNlX2NyZWF0ZV9maWxlKGxlZF9jZGV2LT5jbGFzc19kZXYsCi0JCQkJJmNsYXNzX2RldmljZV9hdHRyX3RyaWdnZXIpOworCWxlZF90cmlnZ2VyX3NldF9kZWZhdWx0KGxlZF9jZGV2KTsKICNlbmRpZgogCiAJcHJpbnRrKEtFUk5fSU5GTyAiUmVnaXN0ZXJlZCBsZWQgZGV2aWNlOiAlc1xuIiwKIAkJCWxlZF9jZGV2LT5jbGFzc19kZXYtPmNsYXNzX2lkKTsKIAogCXJldHVybiAwOworCisjaWZkZWYgQ09ORklHX0xFRFNfVFJJR0dFUlMKK2Vycl9vdXRfbGVkX2xpc3Q6CisJY2xhc3NfZGV2aWNlX3JlbW92ZV9maWxlKGxlZF9jZGV2LT5jbGFzc19kZXYsCisJCQkJJmNsYXNzX2RldmljZV9hdHRyX2JyaWdodG5lc3MpOworCWxpc3RfZGVsKCZsZWRfY2Rldi0+bm9kZSk7CisjZW5kaWYKK2Vycl9vdXQ6CisJY2xhc3NfZGV2aWNlX3VucmVnaXN0ZXIobGVkX2NkZXYtPmNsYXNzX2Rldik7CisJcmV0dXJuIHJjOwogfQogRVhQT1JUX1NZTUJPTF9HUEwobGVkX2NsYXNzZGV2X3JlZ2lzdGVyKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9sZWRzL2xlZHRyaWctdGltZXIuYyBiL2RyaXZlcnMvbGVkcy9sZWR0cmlnLXRpbWVyLmMKaW5kZXggMTc5YzI4Ny4uMjlhODgxOGEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbGVkcy9sZWR0cmlnLXRpbWVyLmMKKysrIGIvZHJpdmVycy9sZWRzL2xlZHRyaWctdGltZXIuYwpAQCAtMTIzLDYgKzEyMyw3IEBACiBzdGF0aWMgdm9pZCB0aW1lcl90cmlnX2FjdGl2YXRlKHN0cnVjdCBsZWRfY2xhc3NkZXYgKmxlZF9jZGV2KQogewogCXN0cnVjdCB0aW1lcl90cmlnX2RhdGEgKnRpbWVyX2RhdGE7CisJaW50IHJjOwogCiAJdGltZXJfZGF0YSA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCB0aW1lcl90cmlnX2RhdGEpLCBHRlBfS0VSTkVMKTsKIAlpZiAoIXRpbWVyX2RhdGEpCkBAIC0xMzQsMTAgKzEzNSwyMSBAQAogCXRpbWVyX2RhdGEtPnRpbWVyLmZ1bmN0aW9uID0gbGVkX3RpbWVyX2Z1bmN0aW9uOwogCXRpbWVyX2RhdGEtPnRpbWVyLmRhdGEgPSAodW5zaWduZWQgbG9uZykgbGVkX2NkZXY7CiAKLQljbGFzc19kZXZpY2VfY3JlYXRlX2ZpbGUobGVkX2NkZXYtPmNsYXNzX2RldiwKKwlyYyA9IGNsYXNzX2RldmljZV9jcmVhdGVfZmlsZShsZWRfY2Rldi0+Y2xhc3NfZGV2LAogCQkJCSZjbGFzc19kZXZpY2VfYXR0cl9kZWxheV9vbik7Ci0JY2xhc3NfZGV2aWNlX2NyZWF0ZV9maWxlKGxlZF9jZGV2LT5jbGFzc19kZXYsCisJaWYgKHJjKSBnb3RvIGVycl9vdXQ7CisJcmMgPSBjbGFzc19kZXZpY2VfY3JlYXRlX2ZpbGUobGVkX2NkZXYtPmNsYXNzX2RldiwKIAkJCQkmY2xhc3NfZGV2aWNlX2F0dHJfZGVsYXlfb2ZmKTsKKwlpZiAocmMpIGdvdG8gZXJyX291dF9kZWxheW9uOworCisJcmV0dXJuOworCitlcnJfb3V0X2RlbGF5b246CisJY2xhc3NfZGV2aWNlX3JlbW92ZV9maWxlKGxlZF9jZGV2LT5jbGFzc19kZXYsCisJCQkJJmNsYXNzX2RldmljZV9hdHRyX2RlbGF5X29uKTsKK2Vycl9vdXQ6CisJbGVkX2NkZXYtPnRyaWdnZXJfZGF0YSA9IE5VTEw7CisJa2ZyZWUodGltZXJfZGF0YSk7CiB9CiAKIHN0YXRpYyB2b2lkIHRpbWVyX3RyaWdfZGVhY3RpdmF0ZShzdHJ1Y3QgbGVkX2NsYXNzZGV2ICpsZWRfY2RldikKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWFjaW50b3NoL3dpbmRmYXJtX3BtMTEyLmMgYi9kcml2ZXJzL21hY2ludG9zaC93aW5kZmFybV9wbTExMi5jCmluZGV4IGZhNGIxM2YuLmIzZmJiNDUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWFjaW50b3NoL3dpbmRmYXJtX3BtMTEyLmMKKysrIGIvZHJpdmVycy9tYWNpbnRvc2gvd2luZGZhcm1fcG0xMTIuYwpAQCAtNjg1LDYgKzY4NSwxNyBAQAogCQkrK25yX2NvcmVzOwogCiAJcHJpbnRrKEtFUk5fSU5GTyAid2luZGZhcm06IGluaXRpYWxpemluZyBmb3IgZHVhbC1jb3JlIGRlc2t0b3AgRzVcbiIpOworCisjaWZkZWYgTU9EVUxFCisJcmVxdWVzdF9tb2R1bGUoIndpbmRmYXJtX3NtdV9jb250cm9scyIpOworCXJlcXVlc3RfbW9kdWxlKCJ3aW5kZmFybV9zbXVfc2Vuc29ycyIpOworCXJlcXVlc3RfbW9kdWxlKCJ3aW5kZmFybV9zbXVfc2F0Iik7CisJcmVxdWVzdF9tb2R1bGUoIndpbmRmYXJtX2xtNzVfc2Vuc29yIik7CisJcmVxdWVzdF9tb2R1bGUoIndpbmRmYXJtX21heDY2OTBfc2Vuc29yIik7CisJcmVxdWVzdF9tb2R1bGUoIndpbmRmYXJtX2NwdWZyZXFfY2xhbXAiKTsKKworI2VuZGlmIC8qIE1PRFVMRSAqLworCiAJcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZ3Zl9wbTExMl9kcml2ZXIpOwogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tYWNpbnRvc2gvd2luZGZhcm1fcG04MS5jIGIvZHJpdmVycy9tYWNpbnRvc2gvd2luZGZhcm1fcG04MS5jCmluZGV4IDJhOTQ0ODUuLmYyNGZhNzMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWFjaW50b3NoL3dpbmRmYXJtX3BtODEuYworKysgYi9kcml2ZXJzL21hY2ludG9zaC93aW5kZmFybV9wbTgxLmMKQEAgLTc4OCw2ICs3ODgsNyBAQAogCQlyZXF1ZXN0X21vZHVsZSgid2luZGZhcm1fc211X2NvbnRyb2xzIik7CiAJCXJlcXVlc3RfbW9kdWxlKCJ3aW5kZmFybV9zbXVfc2Vuc29ycyIpOwogCQlyZXF1ZXN0X21vZHVsZSgid2luZGZhcm1fbG03NV9zZW5zb3IiKTsKKwkJcmVxdWVzdF9tb2R1bGUoIndpbmRmYXJtX2NwdWZyZXFfY2xhbXAiKTsKIAogI2VuZGlmIC8qIE1PRFVMRSAqLwogCQlwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJndmX3NtdV9kcml2ZXIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tYWNpbnRvc2gvd2luZGZhcm1fcG05MS5jIGIvZHJpdmVycy9tYWNpbnRvc2gvd2luZGZhcm1fcG05MS5jCmluZGV4IDk5NjFhNjcuLjI2ZWVlNjkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWFjaW50b3NoL3dpbmRmYXJtX3BtOTEuYworKysgYi9kcml2ZXJzL21hY2ludG9zaC93aW5kZmFybV9wbTkxLmMKQEAgLTcxOSw2ICs3MTksNyBAQAogCQlyZXF1ZXN0X21vZHVsZSgid2luZGZhcm1fc211X2NvbnRyb2xzIik7CiAJCXJlcXVlc3RfbW9kdWxlKCJ3aW5kZmFybV9zbXVfc2Vuc29ycyIpOwogCQlyZXF1ZXN0X21vZHVsZSgid2luZGZhcm1fbG03NV9zZW5zb3IiKTsKKwkJcmVxdWVzdF9tb2R1bGUoIndpbmRmYXJtX2NwdWZyZXFfY2xhbXAiKTsKIAogI2VuZGlmIC8qIE1PRFVMRSAqLwogCQlwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJndmX3NtdV9kcml2ZXIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tY2EvbWNhLWJ1cy5jIGIvZHJpdmVycy9tY2EvbWNhLWJ1cy5jCmluZGV4IDA5YmFhNDMuLmRhODYyZTQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWNhL21jYS1idXMuYworKysgYi9kcml2ZXJzL21jYS9tY2EtYnVzLmMKQEAgLTEwMCw2ICsxMDAsNyBAQAogaW50IF9faW5pdCBtY2FfcmVnaXN0ZXJfZGV2aWNlKGludCBidXMsIHN0cnVjdCBtY2FfZGV2aWNlICptY2FfZGV2KQogewogCXN0cnVjdCBtY2FfYnVzICptY2FfYnVzID0gbWNhX3Jvb3RfYnVzc2VzW2J1c107CisJaW50IHJjOwogCiAJbWNhX2Rldi0+ZGV2LnBhcmVudCA9ICZtY2FfYnVzLT5kZXY7CiAJbWNhX2Rldi0+ZGV2LmJ1cyA9ICZtY2FfYnVzX3R5cGU7CkBAIC0xMDgsMTMgKzEwOSwyMyBAQAogCW1jYV9kZXYtPmRldi5kbWFfbWFzayA9ICZtY2FfZGV2LT5kbWFfbWFzazsKIAltY2FfZGV2LT5kZXYuY29oZXJlbnRfZG1hX21hc2sgPSBtY2FfZGV2LT5kbWFfbWFzazsKIAotCWlmIChkZXZpY2VfcmVnaXN0ZXIoJm1jYV9kZXYtPmRldikpCi0JCXJldHVybiAwOworCXJjID0gZGV2aWNlX3JlZ2lzdGVyKCZtY2FfZGV2LT5kZXYpOworCWlmIChyYykKKwkJZ290byBlcnJfb3V0OwogCi0JZGV2aWNlX2NyZWF0ZV9maWxlKCZtY2FfZGV2LT5kZXYsICZkZXZfYXR0cl9pZCk7Ci0JZGV2aWNlX2NyZWF0ZV9maWxlKCZtY2FfZGV2LT5kZXYsICZkZXZfYXR0cl9wb3MpOworCXJjID0gZGV2aWNlX2NyZWF0ZV9maWxlKCZtY2FfZGV2LT5kZXYsICZkZXZfYXR0cl9pZCk7CisJaWYgKHJjKSBnb3RvIGVycl9vdXRfZGV2cmVnOworCXJjID0gZGV2aWNlX2NyZWF0ZV9maWxlKCZtY2FfZGV2LT5kZXYsICZkZXZfYXR0cl9wb3MpOworCWlmIChyYykgZ290byBlcnJfb3V0X2lkOwogCiAJcmV0dXJuIDE7CisKK2Vycl9vdXRfaWQ6CisJZGV2aWNlX3JlbW92ZV9maWxlKCZtY2FfZGV2LT5kZXYsICZkZXZfYXR0cl9pZCk7CitlcnJfb3V0X2RldnJlZzoKKwlkZXZpY2VfdW5yZWdpc3RlcigmbWNhX2Rldi0+ZGV2KTsKK2Vycl9vdXQ6CisJcmV0dXJuIDA7CiB9CiAKIC8qICovCkBAIC0xMzAsMTMgKzE0MSwxNiBAQAogCQlyZXR1cm4gTlVMTDsKIAl9CiAKLQltY2FfYnVzID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IG1jYV9idXMpLCBHRlBfS0VSTkVMKTsKKwltY2FfYnVzID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IG1jYV9idXMpLCBHRlBfS0VSTkVMKTsKIAlpZiAoIW1jYV9idXMpCiAJCXJldHVybiBOVUxMOwotCW1lbXNldChtY2FfYnVzLCAwLCBzaXplb2Yoc3RydWN0IG1jYV9idXMpKTsKKwogCXNwcmludGYobWNhX2J1cy0+ZGV2LmJ1c19pZCwibWNhJWQiLGJ1cyk7CiAJc3ByaW50ZihtY2FfYnVzLT5uYW1lLCJIb3N0ICVzIE1DQSBCcmlkZ2UiLCBidXMgPyAiU2Vjb25kYXJ5IiA6ICJQcmltYXJ5Iik7Ci0JZGV2aWNlX3JlZ2lzdGVyKCZtY2FfYnVzLT5kZXYpOworCWlmIChkZXZpY2VfcmVnaXN0ZXIoJm1jYV9idXMtPmRldikpIHsKKwkJa2ZyZWUobWNhX2J1cyk7CisJCXJldHVybiBOVUxMOworCX0KIAogCW1jYV9yb290X2J1c3Nlc1tidXNdID0gbWNhX2J1czsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZC9iaXRtYXAuYyBiL2RyaXZlcnMvbWQvYml0bWFwLmMKaW5kZXggOGU2NzYzNC4uZDZmNjE0NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZC9iaXRtYXAuYworKysgYi9kcml2ZXJzL21kL2JpdG1hcC5jCkBAIC01MzYsNyArNTM2LDcgQEAKIAkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IGJpdG1hcCBmaWxlIGlzIG91dCBvZiBkYXRlICglbGx1IDwgJWxsdSkgIgogCQkJIi0tIGZvcmNpbmcgZnVsbCByZWNvdmVyeVxuIiwgYm1uYW1lKGJpdG1hcCksIGV2ZW50cywKIAkJCSh1bnNpZ25lZCBsb25nIGxvbmcpIGJpdG1hcC0+bWRkZXYtPmV2ZW50cyk7Ci0JCXNiLT5zdGF0ZSB8PSBCSVRNQVBfU1RBTEU7CisJCXNiLT5zdGF0ZSB8PSBjcHVfdG9fbGUzMihCSVRNQVBfU1RBTEUpOwogCX0KIHN1Y2Nlc3M6CiAJLyogYXNzaWduIGZpZWxkcyB1c2luZyB2YWx1ZXMgZnJvbSBzdXBlcmJsb2NrICovCkBAIC01NDQsMTEgKzU0NCwxMSBAQAogCWJpdG1hcC0+ZGFlbW9uX3NsZWVwID0gZGFlbW9uX3NsZWVwOwogCWJpdG1hcC0+ZGFlbW9uX2xhc3RydW4gPSBqaWZmaWVzOwogCWJpdG1hcC0+bWF4X3dyaXRlX2JlaGluZCA9IHdyaXRlX2JlaGluZDsKLQliaXRtYXAtPmZsYWdzIHw9IHNiLT5zdGF0ZTsKKwliaXRtYXAtPmZsYWdzIHw9IGxlMzJfdG9fY3B1KHNiLT5zdGF0ZSk7CiAJaWYgKGxlMzJfdG9fY3B1KHNiLT52ZXJzaW9uKSA9PSBCSVRNQVBfTUFKT1JfSE9TVEVORElBTikKIAkJYml0bWFwLT5mbGFncyB8PSBCSVRNQVBfSE9TVEVORElBTjsKIAliaXRtYXAtPmV2ZW50c19jbGVhcmVkID0gbGU2NF90b19jcHUoc2ItPmV2ZW50c19jbGVhcmVkKTsKLQlpZiAoc2ItPnN0YXRlICYgQklUTUFQX1NUQUxFKQorCWlmIChzYi0+c3RhdGUgJiBjcHVfdG9fbGUzMihCSVRNQVBfU1RBTEUpKQogCQliaXRtYXAtPmV2ZW50c19jbGVhcmVkID0gYml0bWFwLT5tZGRldi0+ZXZlbnRzOwogCWVyciA9IDA7CiBvdXQ6CkBAIC01NzgsOSArNTc4LDkgQEAKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZiaXRtYXAtPmxvY2ssIGZsYWdzKTsKIAlzYiA9IChiaXRtYXBfc3VwZXJfdCAqKWttYXBfYXRvbWljKGJpdG1hcC0+c2JfcGFnZSwgS01fVVNFUjApOwogCXN3aXRjaCAob3ApIHsKLQkJY2FzZSBNQVNLX1NFVDogc2ItPnN0YXRlIHw9IGJpdHM7CisJCWNhc2UgTUFTS19TRVQ6IHNiLT5zdGF0ZSB8PSBjcHVfdG9fbGUzMihiaXRzKTsKIAkJCQlicmVhazsKLQkJY2FzZSBNQVNLX1VOU0VUOiBzYi0+c3RhdGUgJj0gfmJpdHM7CisJCWNhc2UgTUFTS19VTlNFVDogc2ItPnN0YXRlICY9IGNwdV90b19sZTMyKH5iaXRzKTsKIAkJCQlicmVhazsKIAkJZGVmYXVsdDogQlVHKCk7CiAJfQpAQCAtMTQxMyw3ICsxNDEzLDcgQEAKIAlpbnQgZXJyOwogCXNlY3Rvcl90IHN0YXJ0OwogCi0JQlVHX09OKHNpemVvZihiaXRtYXBfc3VwZXJfdCkgIT0gMjU2KTsKKwlCVUlMRF9CVUdfT04oc2l6ZW9mKGJpdG1hcF9zdXBlcl90KSAhPSAyNTYpOwogCiAJaWYgKCFmaWxlICYmICFtZGRldi0+Yml0bWFwX29mZnNldCkgLyogYml0bWFwIGRpc2FibGVkLCBub3RoaW5nIHRvIGRvICovCiAJCXJldHVybiAwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZC9kbS1jcnlwdC5jIGIvZHJpdmVycy9tZC9kbS1jcnlwdC5jCmluZGV4IDY1NWQ4MTYuLjA4YTQwZjQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWQvZG0tY3J5cHQuYworKysgYi9kcml2ZXJzL21kL2RtLWNyeXB0LmMKQEAgLTE2LDYgKzE2LDcgQEAKICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvY3J5cHRvLmg+CiAjaW5jbHVkZSA8bGludXgvd29ya3F1ZXVlLmg+CisjaW5jbHVkZSA8bGludXgvYmFja2luZy1kZXYuaD4KICNpbmNsdWRlIDxhc20vYXRvbWljLmg+CiAjaW5jbHVkZSA8bGludXgvc2NhdHRlcmxpc3QuaD4KICNpbmNsdWRlIDxhc20vcGFnZS5oPgpAQCAtNjAyLDcgKzYwMyw3IEBACiAKIAkJLyogb3V0IG9mIG1lbW9yeSAtPiBydW4gcXVldWVzICovCiAJCWlmIChyZW1haW5pbmcpCi0JCQlibGtfY29uZ2VzdGlvbl93YWl0KGJpb19kYXRhX2RpcihjbG9uZSksIEhaLzEwMCk7CisJCQljb25nZXN0aW9uX3dhaXQoYmlvX2RhdGFfZGlyKGNsb25lKSwgSFovMTAwKTsKIAl9CiB9CiAKQEAgLTkxNCw4ICs5MTUsNiBAQAogCQkJY2hhciAqcmVzdWx0LCB1bnNpZ25lZCBpbnQgbWF4bGVuKQogewogCXN0cnVjdCBjcnlwdF9jb25maWcgKmNjID0gKHN0cnVjdCBjcnlwdF9jb25maWcgKikgdGktPnByaXZhdGU7Ci0JY29uc3QgY2hhciAqY2lwaGVyOwotCWNvbnN0IGNoYXIgKmNoYWlubW9kZSA9IE5VTEw7CiAJdW5zaWduZWQgaW50IHN6ID0gMDsKIAogCXN3aXRjaCAodHlwZSkgewpAQCAtOTI0LDE0ICs5MjMsMTEgQEAKIAkJYnJlYWs7CiAKIAljYXNlIFNUQVRVU1RZUEVfVEFCTEU6Ci0JCWNpcGhlciA9IGNyeXB0b19ibGtjaXBoZXJfbmFtZShjYy0+dGZtKTsKLQotCQljaGFpbm1vZGUgPSBjYy0+Y2hhaW5tb2RlOwotCiAJCWlmIChjYy0+aXZfbW9kZSkKLQkJCURNRU1JVCgiJXMtJXMtJXMgIiwgY2lwaGVyLCBjaGFpbm1vZGUsIGNjLT5pdl9tb2RlKTsKKwkJCURNRU1JVCgiJXMtJXMtJXMgIiwgY2MtPmNpcGhlciwgY2MtPmNoYWlubW9kZSwKKwkJCSAgICAgICBjYy0+aXZfbW9kZSk7CiAJCWVsc2UKLQkJCURNRU1JVCgiJXMtJXMgIiwgY2lwaGVyLCBjaGFpbm1vZGUpOworCQkJRE1FTUlUKCIlcy0lcyAiLCBjYy0+Y2lwaGVyLCBjYy0+Y2hhaW5tb2RlKTsKIAogCQlpZiAoY2MtPmtleV9zaXplID4gMCkgewogCQkJaWYgKChtYXhsZW4gLSBzeikgPCAoKGNjLT5rZXlfc2l6ZSA8PCAxKSArIDEpKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZC9kbS1pb2N0bC5jIGIvZHJpdmVycy9tZC9kbS1pb2N0bC5jCmluZGV4IGQxM2JiMTUuLjQ1MTBhZDggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWQvZG0taW9jdGwuYworKysgYi9kcml2ZXJzL21kL2RtLWlvY3RsLmMKQEAgLTYwNiw5ICs2MDYsMTQgQEAKIAkJcmV0dXJuIF9fZ2V0X25hbWVfY2VsbChwYXJhbS0+bmFtZSk7CiAKIAltZCA9IGRtX2dldF9tZChodWdlX2RlY29kZV9kZXYocGFyYW0tPmRldikpOwotCWlmIChtZCkKLQkJbWRwdHIgPSBkbV9nZXRfbWRwdHIobWQpOworCWlmICghbWQpCisJCWdvdG8gb3V0OwogCisJbWRwdHIgPSBkbV9nZXRfbWRwdHIobWQpOworCWlmICghbWRwdHIpCisJCWRtX3B1dChtZCk7CisKK291dDoKIAlyZXR1cm4gbWRwdHI7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWQvZG0tcmFpZDEuYyBiL2RyaXZlcnMvbWQvZG0tcmFpZDEuYwppbmRleCA2NTkyMjRjLi40OGE2NTNiIDEwMDY0NAotLS0gYS9kcml2ZXJzL21kL2RtLXJhaWQxLmMKKysrIGIvZHJpdmVycy9tZC9kbS1yYWlkMS5jCkBAIC0yNCw2ICsyNCw3IEBACiAKIHN0YXRpYyBzdHJ1Y3Qgd29ya3F1ZXVlX3N0cnVjdCAqX2ttaXJyb3JkX3dxOwogc3RhdGljIHN0cnVjdCB3b3JrX3N0cnVjdCBfa21pcnJvcmRfd29yazsKK3N0YXRpYyBERUNMQVJFX1dBSVRfUVVFVUVfSEVBRChfa21pcnJvcmRfcmVjb3Zlcnlfc3RvcHBlZCk7CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCB3YWtlKHZvaWQpCiB7CkBAIC04Myw2ICs4NCw3IEBACiAJc3RydWN0IGxpc3RfaGVhZCAqYnVja2V0czsKIAogCXNwaW5sb2NrX3QgcmVnaW9uX2xvY2s7CisJYXRvbWljX3QgcmVjb3ZlcnlfaW5fZmxpZ2h0OwogCXN0cnVjdCBzZW1hcGhvcmUgcmVjb3ZlcnlfY291bnQ7CiAJc3RydWN0IGxpc3RfaGVhZCBjbGVhbl9yZWdpb25zOwogCXN0cnVjdCBsaXN0X2hlYWQgcXVpZXNjZWRfcmVnaW9uczsKQEAgLTE5MSw2ICsxOTMsNyBAQAogCiAJc3Bpbl9sb2NrX2luaXQoJnJoLT5yZWdpb25fbG9jayk7CiAJc2VtYV9pbml0KCZyaC0+cmVjb3ZlcnlfY291bnQsIDApOworCWF0b21pY19zZXQoJnJoLT5yZWNvdmVyeV9pbl9mbGlnaHQsIDApOwogCUlOSVRfTElTVF9IRUFEKCZyaC0+Y2xlYW5fcmVnaW9ucyk7CiAJSU5JVF9MSVNUX0hFQUQoJnJoLT5xdWllc2NlZF9yZWdpb25zKTsKIAlJTklUX0xJU1RfSEVBRCgmcmgtPnJlY292ZXJlZF9yZWdpb25zKTsKQEAgLTM4Miw2ICszODUsOCBAQAogCQlyaC0+bG9nLT50eXBlLT5jbGVhcl9yZWdpb24ocmgtPmxvZywgcmVnLT5rZXkpOwogCQlyaC0+bG9nLT50eXBlLT5jb21wbGV0ZV9yZXN5bmNfd29yayhyaC0+bG9nLCByZWctPmtleSwgMSk7CiAJCWRpc3BhdGNoX2Jpb3MocmgtPm1zLCAmcmVnLT5kZWxheWVkX2Jpb3MpOworCQlpZiAoYXRvbWljX2RlY19hbmRfdGVzdCgmcmgtPnJlY292ZXJ5X2luX2ZsaWdodCkpCisJCQl3YWtlX3VwX2FsbCgmX2ttaXJyb3JkX3JlY292ZXJ5X3N0b3BwZWQpOwogCQl1cCgmcmgtPnJlY292ZXJ5X2NvdW50KTsKIAkJbWVtcG9vbF9mcmVlKHJlZywgcmgtPnJlZ2lvbl9wb29sKTsKIAl9CkBAIC01MDIsMTEgKzUwNywyMSBAQAogCiBzdGF0aWMgdm9pZCByaF9yZWNvdmVyeV9wcmVwYXJlKHN0cnVjdCByZWdpb25faGFzaCAqcmgpCiB7Ci0Jd2hpbGUgKCFkb3duX3RyeWxvY2soJnJoLT5yZWNvdmVyeV9jb3VudCkpCisJLyogRXh0cmEgcmVmZXJlbmNlIHRvIGF2b2lkIHJhY2Ugd2l0aCByaF9zdG9wX3JlY292ZXJ5ICovCisJYXRvbWljX2luYygmcmgtPnJlY292ZXJ5X2luX2ZsaWdodCk7CisKKwl3aGlsZSAoIWRvd25fdHJ5bG9jaygmcmgtPnJlY292ZXJ5X2NvdW50KSkgeworCQlhdG9taWNfaW5jKCZyaC0+cmVjb3ZlcnlfaW5fZmxpZ2h0KTsKIAkJaWYgKF9fcmhfcmVjb3ZlcnlfcHJlcGFyZShyaCkgPD0gMCkgeworCQkJYXRvbWljX2RlYygmcmgtPnJlY292ZXJ5X2luX2ZsaWdodCk7CiAJCQl1cCgmcmgtPnJlY292ZXJ5X2NvdW50KTsKIAkJCWJyZWFrOwogCQl9CisJfQorCisJLyogRHJvcCB0aGUgZXh0cmEgcmVmZXJlbmNlICovCisJaWYgKGF0b21pY19kZWNfYW5kX3Rlc3QoJnJoLT5yZWNvdmVyeV9pbl9mbGlnaHQpKQorCQl3YWtlX3VwX2FsbCgmX2ttaXJyb3JkX3JlY292ZXJ5X3N0b3BwZWQpOwogfQogCiAvKgpAQCAtMTE3Nyw2ICsxMTkyLDExIEBACiAJc3RydWN0IGRpcnR5X2xvZyAqbG9nID0gbXMtPnJoLmxvZzsKIAogCXJoX3N0b3BfcmVjb3ZlcnkoJm1zLT5yaCk7CisKKwkvKiBXYWl0IGZvciBhbGwgSS9PIHdlIGdlbmVyYXRlZCB0byBjb21wbGV0ZSAqLworCXdhaXRfZXZlbnQoX2ttaXJyb3JkX3JlY292ZXJ5X3N0b3BwZWQsCisJCSAgICFhdG9taWNfcmVhZCgmbXMtPnJoLnJlY292ZXJ5X2luX2ZsaWdodCkpOworCiAJaWYgKGxvZy0+dHlwZS0+c3VzcGVuZCAmJiBsb2ctPnR5cGUtPnN1c3BlbmQobG9nKSkKIAkJLyogRklYTUU6IG5lZWQgYmV0dGVyIGVycm9yIGhhbmRsaW5nICovCiAJCURNV0FSTigibG9nIHN1c3BlbmQgZmFpbGVkIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21kL2RtLXJvdW5kLXJvYmluLmMgYi9kcml2ZXJzL21kL2RtLXJvdW5kLXJvYmluLmMKaW5kZXggYzVhMTZjNS4uNmY5ZmNkNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZC9kbS1yb3VuZC1yb2Jpbi5jCisrKyBiL2RyaXZlcnMvbWQvZG0tcm91bmQtcm9iaW4uYwpAQCAtMTM2LDcgKzEzNiw3IEBACiAKIAlwYXRoLT5wc2NvbnRleHQgPSBwaTsKIAotCWxpc3RfYWRkKCZwaS0+bGlzdCwgJnMtPnZhbGlkX3BhdGhzKTsKKwlsaXN0X2FkZF90YWlsKCZwaS0+bGlzdCwgJnMtPnZhbGlkX3BhdGhzKTsKIAogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZC9kbS5jIGIvZHJpdmVycy9tZC9kbS5jCmluZGV4IGI1NzY0YTguLmZjNGY3NDMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWQvZG0uYworKysgYi9kcml2ZXJzL21kL2RtLmMKQEAgLTEyODUsNyArMTI4NSw3IEBACiAJZG93bigmbWQtPnN1c3BlbmRfbG9jayk7CiAKIAlpZiAoZG1fc3VzcGVuZGVkKG1kKSkKLQkJZ290byBvdXQ7CisJCWdvdG8gb3V0X3VubG9jazsKIAogCW1hcCA9IGRtX2dldF90YWJsZShtZCk7CiAKQEAgLTEzNjEsNiArMTM2MSw4IEBACiAJfQogCiAJZG1fdGFibGVfcHV0KG1hcCk7CisKK291dF91bmxvY2s6CiAJdXAoJm1kLT5zdXNwZW5kX2xvY2spOwogCXJldHVybiByOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZC9tZC5jIGIvZHJpdmVycy9tZC9tZC5jCmluZGV4IDU3ZmE2NGYuLjhjYmY5YzkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWQvbWQuYworKysgYi9kcml2ZXJzL21kL21kLmMKQEAgLTk3NCwxMiArOTc0LDEzIEBACiAgKiB2ZXJzaW9uIDEgc3VwZXJibG9jawogICovCiAKLXN0YXRpYyB1bnNpZ25lZCBpbnQgY2FsY19zYl8xX2NzdW0oc3RydWN0IG1kcF9zdXBlcmJsb2NrXzEgKiBzYikKK3N0YXRpYyBfX2xlMzIgY2FsY19zYl8xX2NzdW0oc3RydWN0IG1kcF9zdXBlcmJsb2NrXzEgKiBzYikKIHsKLQl1bnNpZ25lZCBpbnQgZGlza19jc3VtLCBjc3VtOworCV9fbGUzMiBkaXNrX2NzdW07CisJdTMyIGNzdW07CiAJdW5zaWduZWQgbG9uZyBsb25nIG5ld2NzdW07CiAJaW50IHNpemUgPSAyNTYgKyBsZTMyX3RvX2NwdShzYi0+bWF4X2RldikqMjsKLQl1bnNpZ25lZCBpbnQgKmlzdXBlciA9ICh1bnNpZ25lZCBpbnQqKXNiOworCV9fbGUzMiAqaXN1cGVyID0gKF9fbGUzMiopc2I7CiAJaW50IGk7CiAKIAlkaXNrX2NzdW0gPSBzYi0+c2JfY3N1bTsKQEAgLTk4OSw3ICs5OTAsNyBAQAogCQluZXdjc3VtICs9IGxlMzJfdG9fY3B1KCppc3VwZXIrKyk7CiAKIAlpZiAoc2l6ZSA9PSAyKQotCQluZXdjc3VtICs9IGxlMTZfdG9fY3B1KCoodW5zaWduZWQgc2hvcnQqKSBpc3VwZXIpOworCQluZXdjc3VtICs9IGxlMTZfdG9fY3B1KCooX19sZTE2KikgaXN1cGVyKTsKIAogCWNzdW0gPSAobmV3Y3N1bSAmIDB4ZmZmZmZmZmYpICsgKG5ld2NzdW0gPj4gMzIpOwogCXNiLT5zYl9jc3VtID0gZGlza19jc3VtOwpAQCAtMTEwNiw3ICsxMTA3LDcgQEAKIAlpZiAobGUzMl90b19jcHUoc2ItPmNodW5rc2l6ZSkpCiAJCXJkZXYtPnNpemUgJj0gfigoc2VjdG9yX3QpbGUzMl90b19jcHUoc2ItPmNodW5rc2l6ZSkvMiAtIDEpOwogCi0JaWYgKGxlMzJfdG9fY3B1KHNiLT5zaXplKSA+IHJkZXYtPnNpemUqMikKKwlpZiAobGU2NF90b19jcHUoc2ItPnNpemUpID4gcmRldi0+c2l6ZSoyKQogCQlyZXR1cm4gLUVJTlZBTDsKIAlyZXR1cm4gcmV0OwogfQpAQCAtMTIyOCw3ICsxMjI5LDcgQEAKIAllbHNlCiAJCXNiLT5yZXN5bmNfb2Zmc2V0ID0gY3B1X3RvX2xlNjQoMCk7CiAKLQlzYi0+Y250X2NvcnJlY3RlZF9yZWFkID0gYXRvbWljX3JlYWQoJnJkZXYtPmNvcnJlY3RlZF9lcnJvcnMpOworCXNiLT5jbnRfY29ycmVjdGVkX3JlYWQgPSBjcHVfdG9fbGUzMihhdG9taWNfcmVhZCgmcmRldi0+Y29ycmVjdGVkX2Vycm9ycykpOwogCiAJc2ItPnJhaWRfZGlza3MgPSBjcHVfdG9fbGUzMihtZGRldi0+cmFpZF9kaXNrcyk7CiAJc2ItPnNpemUgPSBjcHVfdG9fbGU2NChtZGRldi0+c2l6ZTw8MSk7CkBAIC0yMDAyLDYgKzIwMDMsNyBAQAogCWtvYmplY3RfaW5pdCgmcmRldi0+a29iaik7CiAKIAlyZGV2LT5kZXNjX25yID0gLTE7CisJcmRldi0+c2F2ZWRfcmFpZF9kaXNrID0gLTE7CiAJcmRldi0+ZmxhZ3MgPSAwOwogCXJkZXYtPmRhdGFfb2Zmc2V0ID0gMDsKIAlyZGV2LT5zYl9ldmVudHMgPSAwOwpAQCAtMzE5OCw2ICszMjAwLDcgQEAKIAogCW1kZGV2LT5jaGFuZ2VkID0gMTsKIAltZF9uZXdfZXZlbnQobWRkZXYpOworCWtvYmplY3RfdWV2ZW50KCZtZGRldi0+Z2VuZGlzay0+a29iaiwgS09CSl9DSEFOR0UpOwogCXJldHVybiAwOwogfQogCkBAIC00MDQzLDExICs0MDQ2LDggQEAKIAkJcmV0dXJuIC1FQlVTWTsKIAlJVEVSQVRFX1JERVYobWRkZXYscmRldix0bXApIHsKIAkJc2VjdG9yX3QgYXZhaWw7Ci0JCWlmIChyZGV2LT5zYl9vZmZzZXQgPiByZGV2LT5kYXRhX29mZnNldCkKLQkJCWF2YWlsID0gKHJkZXYtPnNiX29mZnNldCoyKSAtIHJkZXYtPmRhdGFfb2Zmc2V0OwotCQllbHNlCi0JCQlhdmFpbCA9IGdldF9jYXBhY2l0eShyZGV2LT5iZGV2LT5iZF9kaXNrKQotCQkJCS0gcmRldi0+ZGF0YV9vZmZzZXQ7CisJCWF2YWlsID0gcmRldi0+c2l6ZSAqIDI7CisKIAkJaWYgKGZpdCAmJiAoc2l6ZSA9PSAwIHx8IHNpemUgPiBhdmFpbC8yKSkKIAkJCXNpemUgPSBhdmFpbC8yOwogCQlpZiAoYXZhaWwgPCAoKHNlY3Rvcl90KXNpemUgPDwgMSkpCkBAIC00NDg2LDYgKzQ0ODYsNyBAQAogCSAqIG1hbnkgZGlydHkgUkFJRDUgYmxvY2tzLgogCSAqLwogCisJY3VycmVudC0+ZmxhZ3MgfD0gUEZfTk9GUkVFWkU7CiAJYWxsb3dfc2lnbmFsKFNJR0tJTEwpOwogCXdoaWxlICgha3RocmVhZF9zaG91bGRfc3RvcCgpKSB7CiAKQEAgLTQ1MDIsNyArNDUwMyw2IEBACiAJCQkgdGVzdF9iaXQoVEhSRUFEX1dBS0VVUCwgJnRocmVhZC0+ZmxhZ3MpCiAJCQkgfHwga3RocmVhZF9zaG91bGRfc3RvcCgpLAogCQkJIHRocmVhZC0+dGltZW91dCk7Ci0JCXRyeV90b19mcmVlemUoKTsKIAogCQljbGVhcl9iaXQoVEhSRUFEX1dBS0VVUCwgJnRocmVhZC0+ZmxhZ3MpOwogCkBAIC00OTEyLDYgKzQ5MTIsNyBAQAogfQogCiBzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBtZF9zZXFfZm9wcyA9IHsKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCiAJLm9wZW4gICAgICAgICAgID0gbWRfc2VxX29wZW4sCiAJLnJlYWQgICAgICAgICAgID0gc2VxX3JlYWQsCiAJLmxsc2VlayAgICAgICAgID0gc2VxX2xzZWVrLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZC9tdWx0aXBhdGguYyBiL2RyaXZlcnMvbWQvbXVsdGlwYXRoLmMKaW5kZXggMTcxZmY0MS4uMTRkYTM3ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZC9tdWx0aXBhdGguYworKysgYi9kcml2ZXJzL21kL211bHRpcGF0aC5jCkBAIC0yNzcsNiArMjc3LDcgQEAKIAkJCXNldF9iaXQoRmF1bHR5LCAmcmRldi0+ZmxhZ3MpOwogCQkJc2V0X2JpdChNRF9DSEFOR0VfREVWUywgJm1kZGV2LT5mbGFncyk7CiAJCQljb25mLT53b3JraW5nX2Rpc2tzLS07CisJCQltZGRldi0+ZGVncmFkZWQrKzsKIAkJCXByaW50ayhLRVJOX0FMRVJUICJtdWx0aXBhdGg6IElPIGZhaWx1cmUgb24gJXMsIgogCQkJCSIgZGlzYWJsaW5nIElPIHBhdGguIFxuCU9wZXJhdGlvbiBjb250aW51aW5nIgogCQkJCSIgb24gJWQgSU8gcGF0aHMuXG4iLApAQCAtMzM2LDYgKzMzNyw3IEBACiAJCQkJYmxrX3F1ZXVlX21heF9zZWN0b3JzKG1kZGV2LT5xdWV1ZSwgUEFHRV9TSVpFPj45KTsKIAogCQkJY29uZi0+d29ya2luZ19kaXNrcysrOworCQkJbWRkZXYtPmRlZ3JhZGVkLS07CiAJCQlyZGV2LT5yYWlkX2Rpc2sgPSBwYXRoOwogCQkJc2V0X2JpdChJbl9zeW5jLCAmcmRldi0+ZmxhZ3MpOwogCQkJcmN1X2Fzc2lnbl9wb2ludGVyKHAtPnJkZXYsIHJkZXYpOwpAQCAtNTAxLDcgKzUwMyw3IEBACiAJCQltZG5hbWUobWRkZXYpKTsKIAkJZ290byBvdXRfZnJlZV9jb25mOwogCX0KLQltZGRldi0+ZGVncmFkZWQgPSBjb25mLT5yYWlkX2Rpc2tzID0gY29uZi0+d29ya2luZ19kaXNrczsKKwltZGRldi0+ZGVncmFkZWQgPSBjb25mLT5yYWlkX2Rpc2tzIC0gY29uZi0+d29ya2luZ19kaXNrczsKIAogCWNvbmYtPnBvb2wgPSBtZW1wb29sX2NyZWF0ZV9remFsbG9jX3Bvb2woTlJfUkVTRVJWRURfQlVGUywKIAkJCQkJCSBzaXplb2Yoc3RydWN0IG11bHRpcGF0aF9iaCkpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZC9yYWlkMS5jIGIvZHJpdmVycy9tZC9yYWlkMS5jCmluZGV4IGRjOWQyZGUuLjY1NmZhZTkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWQvcmFpZDEuYworKysgYi9kcml2ZXJzL21kL3JhaWQxLmMKQEAgLTE0NzQsOCArMTQ3NCw4IEBACiAJCQkJCSAgICAgICAicmFpZDE6JXM6IHJlYWQgZXJyb3IgY29ycmVjdGVkICIKIAkJCQkJICAgICAgICIoJWQgc2VjdG9ycyBhdCAlbGx1IG9uICVzKVxuIiwKIAkJCQkJICAgICAgIG1kbmFtZShtZGRldiksIHMsCi0JCQkJCSAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKXNlY3QgKwotCQkJCQkgICAgICAgICAgIHJkZXYtPmRhdGFfb2Zmc2V0LAorCQkJCQkgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZykoc2VjdCArCisJCQkJCSAgICAgICAgICAgcmRldi0+ZGF0YV9vZmZzZXQpLAogCQkJCQkgICAgICAgYmRldm5hbWUocmRldi0+YmRldiwgYikpOwogCQkJCX0KIAkJCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWQvcmFpZDEwLmMgYi9kcml2ZXJzL21kL3JhaWQxMC5jCmluZGV4IDEyNTBmMGUuLjc0OTJkNjAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWQvcmFpZDEwLmMKKysrIGIvZHJpdmVycy9tZC9yYWlkMTAuYwpAQCAtMTQ3MCw4ICsxNDcwLDggQEAKIAkJCQkJICAgICAgICJyYWlkMTA6JXM6IHJlYWQgZXJyb3IgY29ycmVjdGVkIgogCQkJCQkgICAgICAgIiAoJWQgc2VjdG9ycyBhdCAlbGx1IG9uICVzKVxuIiwKIAkJCQkJICAgICAgIG1kbmFtZShtZGRldiksIHMsCi0JCQkJCSAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKXNlY3QrCi0JCQkJCSAgICAgICAgICAgIHJkZXYtPmRhdGFfb2Zmc2V0LAorCQkJCQkgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZykoc2VjdCsKKwkJCQkJICAgICAgICAgICAgcmRldi0+ZGF0YV9vZmZzZXQpLAogCQkJCQkgICAgICAgYmRldm5hbWUocmRldi0+YmRldiwgYikpOwogCiAJCQkJcmRldl9kZWNfcGVuZGluZyhyZGV2LCBtZGRldik7CkBAIC0yMDc5LDcgKzIwNzksNyBAQAogCQlkaXNrID0gY29uZi0+bWlycm9ycyArIGk7CiAKIAkJaWYgKCFkaXNrLT5yZGV2IHx8Ci0JCSAgICAhdGVzdF9iaXQoSW5fc3luYywgJnJkZXYtPmZsYWdzKSkgeworCQkgICAgIXRlc3RfYml0KEluX3N5bmMsICZkaXNrLT5yZGV2LT5mbGFncykpIHsKIAkJCWRpc2stPmhlYWRfcG9zaXRpb24gPSAwOwogCQkJbWRkZXYtPmRlZ3JhZGVkKys7CiAJCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWQvcmFpZDUuYyBiL2RyaXZlcnMvbWQvcmFpZDUuYwppbmRleCBlMTRmNDU3Li42OWMzZTIwIDEwMDY0NAotLS0gYS9kcml2ZXJzL21kL3JhaWQ1LmMKKysrIGIvZHJpdmVycy9tZC9yYWlkNS5jCkBAIC0zNjU5LDcgKzM2NTksNyBAQAogCQliZGV2ID0gYmRnZXRfZGlzayhjb25mLT5tZGRldi0+Z2VuZGlzaywgMCk7CiAJCWlmIChiZGV2KSB7CiAJCQltdXRleF9sb2NrKCZiZGV2LT5iZF9pbm9kZS0+aV9tdXRleCk7Ci0JCQlpX3NpemVfd3JpdGUoYmRldi0+YmRfaW5vZGUsIGNvbmYtPm1kZGV2LT5hcnJheV9zaXplIDw8IDEwKTsKKwkJCWlfc2l6ZV93cml0ZShiZGV2LT5iZF9pbm9kZSwgKGxvZmZfdCljb25mLT5tZGRldi0+YXJyYXlfc2l6ZSA8PCAxMCk7CiAJCQltdXRleF91bmxvY2soJmJkZXYtPmJkX2lub2RlLT5pX211dGV4KTsKIAkJCWJkcHV0KGJkZXYpOwogCQl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2NvbW1vbi9zYWE3MTQ2X2kyYy5jIGIvZHJpdmVycy9tZWRpYS9jb21tb24vc2FhNzE0Nl9pMmMuYwppbmRleCBkOTk1M2Y3Li41Mjk3YTM2IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2NvbW1vbi9zYWE3MTQ2X2kyYy5jCisrKyBiL2RyaXZlcnMvbWVkaWEvY29tbW9uL3NhYTcxNDZfaTJjLmMKQEAgLTIxNywxMSArMjE3LDkgQEAKIAkJfQogCQkvKiB3YWl0IHVudGlsIHdlIGdldCBhIHRyYW5zZmVyIGRvbmUgb3IgZXJyb3IgKi8KIAkJdGltZW91dCA9IGppZmZpZXMgKyBIWi8xMDAgKyAxOyAvKiAxMG1zICovCisJCS8qIGZpcnN0IHJlYWQgdXN1YWxseSBkZWxpdmVycyBib2d1cyByZXN1bHRzLi4uICovCisJCXNhYTcxNDZfaTJjX3N0YXR1cyhkZXYpOwogCQl3aGlsZSgxKSB7Ci0JCQkvKioKLQkJCSAqICBmaXJzdCByZWFkIHVzdWFsbHkgZGVsaXZlcnMgYm9ndXMgcmVzdWx0cy4uLgotCQkJICovCi0JCQlzYWE3MTQ2X2kyY19zdGF0dXMoZGV2KTsKIAkJCXN0YXR1cyA9IHNhYTcxNDZfaTJjX3N0YXR1cyhkZXYpOwogCQkJaWYgKChzdGF0dXMgJiAweDMpICE9IDEpCiAJCQkJYnJlYWs7CkBAIC0yMzIsMTAgKzIzMCwxMCBAQAogCQkJCURFQl9JMkMoKCJzYWE3MTQ2X2kyY193cml0ZW91dDogdGltZWQgb3V0IHdhaXRpbmcgZm9yIGVuZCBvZiB4ZmVyXG4iKSk7CiAJCQkJcmV0dXJuIC1FSU87CiAJCQl9Ci0JCQlpZiAoKCsrdHJpYWwgPCAyMCkgJiYgc2hvcnRfZGVsYXkpCisJCQlpZiAoKyt0cmlhbCA8IDUwICYmIHNob3J0X2RlbGF5KQogCQkJCXVkZWxheSgxMCk7CiAJCQllbHNlCi0JCQltc2xlZXAoMSk7CisJCQkJbXNsZWVwKDEpOwogCQl9CiAJfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9iMmMyL2ZsZXhjb3AtdXNiLmMgYi9kcml2ZXJzL21lZGlhL2R2Yi9iMmMyL2ZsZXhjb3AtdXNiLmMKaW5kZXggMjg1M2VhMS4uODdmYjc1ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvYjJjMi9mbGV4Y29wLXVzYi5jCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2IyYzIvZmxleGNvcC11c2IuYwpAQCAtMjQ2LDcgKzI0Niw3IEBACiAJd0luZGV4ID0gKGNoaXBhZGRyIDw8IDggKSB8IGFkZHI7CiAKIAlkZWJfaTJjKCJpMmMgJTJkOiAlMDJ4ICUwMnggJTAyeCAlMDJ4ICUwMnggJTAyeFxuIixmdW5jLHJlcXVlc3RfdHlwZSxyZXEsCi0JCQkoKHdWYWx1ZSAmJiAweGZmKSA8PCA4KSx3VmFsdWUgPj4gOCwoKHdJbmRleCAmJiAweGZmKSA8PCA4KSx3SW5kZXggPj4gOCk7CisJCXdWYWx1ZSAmIDB4ZmYsIHdWYWx1ZSA+PiA4LCB3SW5kZXggJiAweGZmLCB3SW5kZXggPj4gOCk7CiAKIAlsZW4gPSB1c2JfY29udHJvbF9tc2coZmNfdXNiLT51ZGV2LHBpcGUsCiAJCQlyZXEsCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9idDh4eC9kdmItYnQ4eHguYyBiL2RyaXZlcnMvbWVkaWEvZHZiL2J0OHh4L2R2Yi1idDh4eC5jCmluZGV4IGZiNmM0Y2MuLjE0ZTY5YTcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL2J0OHh4L2R2Yi1idDh4eC5jCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2J0OHh4L2R2Yi1idDh4eC5jCkBAIC02NjUsNiArNjY1LDEwIEBACiAJY2FzZSBCVFRWX0JPQVJEX1RXSU5IQU5fRFNUOgogCQkvKglEU1QgaXMgbm90IGEgZnJvbnRlbmQgZHJpdmVyICEhIQkJKi8KIAkJc3RhdGUgPSAoc3RydWN0IGRzdF9zdGF0ZSAqKSBrbWFsbG9jKHNpemVvZiAoc3RydWN0IGRzdF9zdGF0ZSksIEdGUF9LRVJORUwpOworCQlpZiAoIXN0YXRlKSB7CisJCQlwcmludGsoImR2Yl9idDh4eDogTm8gbWVtb3J5XG4iKTsKKwkJCWJyZWFrOworCQl9CiAJCS8qCVNldHVwIHRoZSBDYXJkCQkJCQkqLwogCQlzdGF0ZS0+Y29uZmlnID0gJmRzdF9jb25maWc7CiAJCXN0YXRlLT5pMmMgPSBjYXJkLT5pMmNfYWRhcHRlcjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi1jb3JlL0tjb25maWcgYi9kcml2ZXJzL21lZGlhL2R2Yi9kdmItY29yZS9LY29uZmlnCmluZGV4IGU0NmVhZTMuLjE5OTBlZGEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi1jb3JlL0tjb25maWcKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZHZiLWNvcmUvS2NvbmZpZwpAQCAtMTksNiArMTksNiBAQAogCSAgYWxsb3cgdGhlIGNhcmQgZHJpdmVycyB0byBvbmx5IGxvYWQgdGhlIGZyb250ZW5kIG1vZHVsZXMKIAkgIHRoZXkgcmVxdWlyZS4gVGhpcyBzYXZlcyBzZXZlcmFsIEtCeXRlcyBvZiBtZW1vcnkuCiAKLQkgIE5vdGU6IFlvdSB3aWxsIG5lZWQgbW91ZHVsZS1pbml0LXRvb2xzIHYzLjIgb3IgbGF0ZXIgZm9yIHRoaXMgZmVhdHVyZS4KKwkgIE5vdGU6IFlvdSB3aWxsIG5lZWQgbW9kdWxlLWluaXQtdG9vbHMgdjMuMiBvciBsYXRlciBmb3IgdGhpcyBmZWF0dXJlLgogCiAJICBJZiB1bnN1cmUgc2F5IFkuCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL0tjb25maWcgYi9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL0tjb25maWcKaW5kZXggMmNjNWNhYS4uYTI2M2IzZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9LY29uZmlnCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvS2NvbmZpZwpAQCAtMjYsNyArMjYsNyBAQAogCXRyaXN0YXRlICJBVmVyTWVkaWEgQXZlclRWIERWQi1UIFVTQiAyLjAgKEE4MDApIgogCWRlcGVuZHMgb24gRFZCX1VTQgogCXNlbGVjdCBEVkJfRElCMzAwME1DCi0Jc2VsZWN0IERWQl9UVU5FUl9NVDIwNjAKKwlzZWxlY3QgRFZCX1RVTkVSX01UMjA2MCBpZiAhRFZCX0ZFX0NVU1RPTUlTRQogCWhlbHAKIAkgIFNheSBZIGhlcmUgdG8gc3VwcG9ydCB0aGUgQVZlck1lZGlhIEF2ZXJUViBEVkItVCBVU0IgMi4wIChBODAwKSByZWNlaXZlci4KIApAQCAtMzQsNyArMzQsNyBAQAogCXRyaXN0YXRlICJEaUJjb20gVVNCIERWQi1UIGRldmljZXMgKGJhc2VkIG9uIHRoZSBEaUIzMDAwTS1CKSAoc2VlIGhlbHAgZm9yIGRldmljZSBsaXN0KSIKIAlkZXBlbmRzIG9uIERWQl9VU0IKIAlzZWxlY3QgRFZCX0RJQjMwMDBNQgotCXNlbGVjdCBEVkJfVFVORVJfTVQyMDYwCisJc2VsZWN0IERWQl9UVU5FUl9NVDIwNjAgaWYgIURWQl9GRV9DVVNUT01JU0UKIAloZWxwCiAJICBTdXBwb3J0IGZvciBVU0IgMS4xIGFuZCAyLjAgRFZCLVQgcmVjZWl2ZXJzIGJhc2VkIG9uIHJlZmVyZW5jZSBkZXNpZ25zIG1hZGUgYnkKIAkgIERpQmNvbSAoPGh0dHA6Ly93d3cuZGliY29tLmZyPikgZXF1aXBwZWQgd2l0aCBhIERpQjMwMDBNLUIgZGVtb2R1bGF0b3IuCkBAIC01NSw3ICs1NSw3IEBACiAJdHJpc3RhdGUgIkRpQmNvbSBVU0IgRFZCLVQgZGV2aWNlcyAoYmFzZWQgb24gdGhlIERpQjMwMDBNLUMvUCkgKHNlZSBoZWxwIGZvciBkZXZpY2UgbGlzdCkiCiAJZGVwZW5kcyBvbiBEVkJfVVNCCiAJc2VsZWN0IERWQl9ESUIzMDAwTUMKLQlzZWxlY3QgRFZCX1RVTkVSX01UMjA2MAorCXNlbGVjdCBEVkJfVFVORVJfTVQyMDYwIGlmICFEVkJfRkVfQ1VTVE9NSVNFCiAJaGVscAogCSAgU3VwcG9ydCBmb3IgVVNCMi4wIERWQi1UIHJlY2VpdmVycyBiYXNlZCBvbiByZWZlcmVuY2UgZGVzaWducyBtYWRlIGJ5CiAJICBEaUJjb20gKDxodHRwOi8vd3d3LmRpYmNvbS5mcj4pIGVxdWlwcGVkIHdpdGggYSBEaUIzMDAwTS1DL1AgZGVtb2R1bGF0b3IuCkBAIC03MCw3ICs3MCw3IEBACiAJdHJpc3RhdGUgIkRpQmNvbSBEaUIwNzAwIFVTQiBEVkIgZGV2aWNlcyAoc2VlIGhlbHAgZm9yIHN1cHBvcnRlZCBkZXZpY2VzKSIKIAlkZXBlbmRzIG9uIERWQl9VU0IKIAlzZWxlY3QgRFZCX0RJQjMwMDBNQwotCXNlbGVjdCBEVkJfVFVORVJfTVQyMDYwCisJc2VsZWN0IERWQl9UVU5FUl9NVDIwNjAgaWYgIURWQl9GRV9DVVNUT01JU0UKIAloZWxwCiAJICBTdXBwb3J0IGZvciBVU0IyLjAvMS4xIERWQiByZWNlaXZlcnMgYmFzZWQgb24gdGhlIERpQjA3MDAgVVNCIGJyaWRnZS4gVGhlCiAJICBVU0IgYnJpZGdlIGlzIGFsc28gcHJlc2VudCBpbiBkZXZpY2VzIGhhdmluZyB0aGUgRGlCNzcwMCBEVkItVC1VU0IKQEAgLTg3LDcgKzg3LDcgQEAKIAl0cmlzdGF0ZSAiSGFuZlRlayBVTVQtMDEwIERWQi1UIFVTQjIuMCBzdXBwb3J0IgogCWRlcGVuZHMgb24gRFZCX1VTQgogCXNlbGVjdCBEVkJfRElCMzAwME1DCi0Jc2VsZWN0IERWQl9UVU5FUl9NVDIwNjAKKwlzZWxlY3QgRFZCX1RVTkVSX01UMjA2MCBpZiAhRFZCX0ZFX0NVU1RPTUlTRQogCWhlbHAKIAkgIFNheSBZIGhlcmUgdG8gc3VwcG9ydCB0aGUgSGFuZlRlayBVTVQtMDEwIFVTQjIuMCBzdGljay1zaXplZCBEVkItVCByZWNlaXZlci4KIApAQCAtMTUzLDcgKzE1Myw3IEBACiAJdHJpc3RhdGUgIkhhdXBwYXVnZSBXaW5UVi1OT1ZBLVQgdXNiMiBEVkItVCBVU0IyLjAgc3VwcG9ydCIKIAlkZXBlbmRzIG9uIERWQl9VU0IKIAlzZWxlY3QgRFZCX0RJQjMwMDBNQwotCXNlbGVjdCBEVkJfVFVORVJfTVQyMDYwCisJc2VsZWN0IERWQl9UVU5FUl9NVDIwNjAgaWYgIURWQl9GRV9DVVNUT01JU0UKIAloZWxwCiAJICBTYXkgWSBoZXJlIHRvIHN1cHBvcnQgdGhlIEhhdXBwYXVnZSBXaW5UVi1OT1ZBLVQgdXNiMiBEVkItVCBVU0IyLjAgcmVjZWl2ZXIuCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvZGlidXNiLWNvbW1vbi5jIGIvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9kaWJ1c2ItY29tbW9uLmMKaW5kZXggZmQzYTk5MC4uNTE0M2U0MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9kaWJ1c2ItY29tbW9uLmMKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9kaWJ1c2ItY29tbW9uLmMKQEAgLTE2OSw3ICsxNjksNyBAQAogLy8gQ29uZmlnIEFkamFjZW50IGNoYW5uZWxzICBQZXJmIC1jYWwyMgogc3RhdGljIHN0cnVjdCBkaWJ4MDAwX2FnY19jb25maWcgZGliMzAwMHBfbXQyMDYwX2FnY19jb25maWcgPSB7CiAJLmJhbmRfY2FwcyA9IEJBTkRfVkhGIHwgQkFORF9VSEYsCi0JLnNldHVwICAgICA9ICgwIDw8IDE1KSB8ICgwIDw8IDE0KSB8ICgxIDw8IDEzKSB8ICgxIDw8IDEyKSB8ICgyOSA8PCAwKSwKKwkuc2V0dXAgICAgID0gKDEgPDwgOCkgfCAoNSA8PCA1KSB8ICgxIDw8IDQpIHwgKDEgPDwgMykgfCAoMCA8PCAyKSB8ICgyIDw8IDApLAogCiAJLmFnYzFfbWF4ID0gNDg0OTcsCiAJLmFnYzFfbWluID0gMjM1OTMsCkBAIC0xOTYsMTAgKzE5NiwxNCBAQAogCS5sbl9hZGNfbGV2ZWwgPSAweDFjYzcsCiAKIAkub3V0cHV0X21wZWcyX2luXzE4OF9ieXRlcyA9IDEsCisKKwkuYWdjX2NvbW1hbmQxID0gMSwKKwkuYWdjX2NvbW1hbmQyID0gMSwKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgZGlieDAwMF9hZ2NfY29uZmlnIGRpYjMwMDBwX3BhbmFzb25pY19hZ2NfY29uZmlnID0gewotCS5zZXR1cCAgICA9ICgwIDw8IDE1KSB8ICgwIDw8IDE0KSB8ICgxIDw8IDEzKSB8ICgxIDw8IDEyKSB8ICgyOSA8PCAwKSwKKwkuYmFuZF9jYXBzID0gQkFORF9WSEYgfCBCQU5EX1VIRiwKKwkuc2V0dXAgICAgID0gKDEgPDwgOCkgfCAoNSA8PCA1KSB8ICgxIDw8IDQpIHwgKDEgPDwgMykgfCAoMCA8PCAyKSB8ICgyIDw8IDApLAogCiAJLmFnYzFfbWF4ID0gNTYzNjEsCiAJLmFnYzFfbWluID0gMjIyODIsCkBAIC0yMjYsNiArMjMwLDkgQEAKIAkubG5fYWRjX2xldmVsID0gMHgxY2M3LAogCiAJLm91dHB1dF9tcGVnMl9pbl8xODhfYnl0ZXMgPSAxLAorCisJLmFnY19jb21tYW5kMSA9IDEsCisJLmFnY19jb21tYW5kMiA9IDEsCiB9OwogCiBpbnQgZGlidXNiX2RpYjMwMDBtY19mcm9udGVuZF9hdHRhY2goc3RydWN0IGR2Yl91c2JfYWRhcHRlciAqYWRhcCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvZGlidXNiLmggYi9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL2RpYnVzYi5oCmluZGV4IDUxNTNmYjkuLmI2MDc4MTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvZGlidXNiLmgKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9kaWJ1c2IuaApAQCAtOTksNyArOTksOSBAQAogc3RydWN0IGRpYnVzYl9zdGF0ZSB7CiAJc3RydWN0IGRpYl9mZV94ZmVyX29wcyBvcHM7CiAJaW50IG10MjA2MF9wcmVzZW50OworfTsKIAorc3RydWN0IGRpYnVzYl9kZXZpY2Vfc3RhdGUgewogCS8qIGZvciBSQzUgcmVtb3RlIGNvbnRyb2wgKi8KIAlpbnQgb2xkX3RvZ2dsZTsKIAlpbnQgbGFzdF9yZXBlYXRfY291bnQ7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL25vdmEtdC11c2IyLmMgYi9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL25vdmEtdC11c2IyLmMKaW5kZXggYTkyMTliZi4uYTU4ODc0YyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9ub3ZhLXQtdXNiMi5jCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2Ivbm92YS10LXVzYjIuYwpAQCAtNzUsNyArNzUsNyBAQAogCXU4IGtleVs1XSxjbWRbMl0gPSB7IERJQlVTQl9SRVFfUE9MTF9SRU1PVEUsIDB4MzUgfSwgZGF0YSx0b2dnbGUsY3VzdG9tOwogCXUxNiByYXc7CiAJaW50IGk7Ci0Jc3RydWN0IGRpYnVzYl9zdGF0ZSAqc3QgPSBkLT5wcml2OworCXN0cnVjdCBkaWJ1c2JfZGV2aWNlX3N0YXRlICpzdCA9IGQtPnByaXY7CiAKIAlkdmJfdXNiX2dlbmVyaWNfcncoZCxjbWQsMixrZXksNSwwKTsKIApAQCAtMTg0LDYgKzE4NCw3IEBACiAJCQkuc2l6ZV9vZl9wcml2ICAgICA9IHNpemVvZihzdHJ1Y3QgZGlidXNiX3N0YXRlKSwKIAkJfQogCX0sCisJLnNpemVfb2ZfcHJpdiAgICAgPSBzaXplb2Yoc3RydWN0IGRpYnVzYl9kZXZpY2Vfc3RhdGUpLAogCiAJLnBvd2VyX2N0cmwgICAgICAgPSBkaWJ1c2IyXzBfcG93ZXJfY3RybCwKIAkucmVhZF9tYWNfYWRkcmVzcyA9IG5vdmFfdF9yZWFkX21hY19hZGRyZXNzLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL0tjb25maWcgYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvS2NvbmZpZwppbmRleCAwODBmYTI1Li5hZWJiOGQ2ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL0tjb25maWcKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL0tjb25maWcKQEAgLTI3Niw2ICsyNzYsOCBAQAogCiBjb25maWcgRFZCX1RVTkVSX01UMjA2MAogCXRyaXN0YXRlICJNaWNyb3R1bmUgTVQyMDYwIHNpbGljb24gSUYgdHVuZXIiCisJZGVwZW5kcyBvbiBJMkMKKwlkZWZhdWx0IG0gaWYgRFZCX0ZFX0NVU1RPTUlTRQogCWhlbHAKIAkgIEEgZHJpdmVyIGZvciB0aGUgc2lsaWNvbiBJRiB0dW5lciBNVDIwNjAgZnJvbSBNaWNyb3R1bmUuCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9iY20zNTEwLmggYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvYmNtMzUxMC5oCmluZGV4IDZkZmE4MzkuLjdlNGY5NWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9iY20zNTEwLmgKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL2JjbTM1MTAuaApAQCAtMzQsNyArMzQsNyBAQAogCWludCAoKnJlcXVlc3RfZmlybXdhcmUpKHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlLCBjb25zdCBzdHJ1Y3QgZmlybXdhcmUgKipmdywgY2hhciogbmFtZSk7CiB9OwogCi0jaWYgZGVmaW5lZChDT05GSUdfRFZCX0JDTTM1MTApIHx8IGRlZmluZWQoQ09ORklHX0RWQl9CQ00zNTEwX01PRFVMRSkKKyNpZiBkZWZpbmVkKENPTkZJR19EVkJfQkNNMzUxMCkgfHwgKGRlZmluZWQoQ09ORklHX0RWQl9CQ00zNTEwX01PRFVMRSkgJiYgZGVmaW5lZChNT0RVTEUpKQogZXh0ZXJuIHN0cnVjdCBkdmJfZnJvbnRlbmQqIGJjbTM1MTBfYXR0YWNoKGNvbnN0IHN0cnVjdCBiY20zNTEwX2NvbmZpZyogY29uZmlnLAogCQkJCQkgICBzdHJ1Y3QgaTJjX2FkYXB0ZXIqIGkyYyk7CiAjZWxzZQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL2N4MjI3MDAuaCBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9jeDIyNzAwLmgKaW5kZXggMTAyODZjYy4uN2FjMzM2OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL2N4MjI3MDAuaAorKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvY3gyMjcwMC5oCkBAIC0zMSw3ICszMSw3IEBACiAJdTggZGVtb2RfYWRkcmVzczsKIH07CiAKLSNpZiBkZWZpbmVkKENPTkZJR19EVkJfQ1gyMjcwMCkgfHwgZGVmaW5lZChDT05GSUdfRFZCX0NYMjI3MDBfTU9EVUxFKQorI2lmIGRlZmluZWQoQ09ORklHX0RWQl9DWDIyNzAwKSB8fCAoZGVmaW5lZChDT05GSUdfRFZCX0NYMjI3MDBfTU9EVUxFKSAmJiBkZWZpbmVkKE1PRFVMRSkpCiBleHRlcm4gc3RydWN0IGR2Yl9mcm9udGVuZCogY3gyMjcwMF9hdHRhY2goY29uc3Qgc3RydWN0IGN4MjI3MDBfY29uZmlnKiBjb25maWcsCiAJCQkJCSAgIHN0cnVjdCBpMmNfYWRhcHRlciogaTJjKTsKICNlbHNlCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvY3gyMjcwMi5oIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL2N4MjI3MDIuaAppbmRleCBiYzIxN2RkLi45Y2Q2NGRhIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvY3gyMjcwMi5oCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9jeDIyNzAyLmgKQEAgLTQxLDcgKzQxLDcgQEAKIAl1OCBvdXRwdXRfbW9kZTsKIH07CiAKLSNpZiBkZWZpbmVkKENPTkZJR19EVkJfQ1gyMjcwMikgfHwgZGVmaW5lZChDT05GSUdfRFZCX0NYMjI3MDJfTU9EVUxFKQorI2lmIGRlZmluZWQoQ09ORklHX0RWQl9DWDIyNzAyKSB8fCAoZGVmaW5lZChDT05GSUdfRFZCX0NYMjI3MDJfTU9EVUxFKSAmJiBkZWZpbmVkKE1PRFVMRSkpCiBleHRlcm4gc3RydWN0IGR2Yl9mcm9udGVuZCogY3gyMjcwMl9hdHRhY2goY29uc3Qgc3RydWN0IGN4MjI3MDJfY29uZmlnKiBjb25maWcsCiAJCQkJCSAgIHN0cnVjdCBpMmNfYWRhcHRlciogaTJjKTsKICNlbHNlCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvY3gyNDExMC5oIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL2N4MjQxMTAuaAppbmRleCBjOWQ1YWUyLi4wY2EzYWY0IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvY3gyNDExMC5oCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9jeDI0MTEwLmgKQEAgLTQxLDcgKzQxLDcgQEAKIAlyZXR1cm4gcjsKIH0KIAotI2lmIGRlZmluZWQoQ09ORklHX0RWQl9DWDI0MTEwKSB8fCBkZWZpbmVkKENPTkZJR19EVkJfQ1gyNDExMF9NT0RVTEUpCisjaWYgZGVmaW5lZChDT05GSUdfRFZCX0NYMjQxMTApIHx8IChkZWZpbmVkKENPTkZJR19EVkJfQ1gyNDExMF9NT0RVTEUpICYmIGRlZmluZWQoTU9EVUxFKSkKIGV4dGVybiBzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBjeDI0MTEwX2F0dGFjaChjb25zdCBzdHJ1Y3QgY3gyNDExMF9jb25maWcqIGNvbmZpZywKIAkJCQkJICAgc3RydWN0IGkyY19hZGFwdGVyKiBpMmMpOwogI2Vsc2UKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9jeDI0MTIzLmggYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvY3gyNDEyMy5oCmluZGV4IDU3YTFkYWUuLjg0ZjllNGYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9jeDI0MTIzLmgKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL2N4MjQxMjMuaApAQCAtMzUsNyArMzUsNyBAQAogCWludCBsbmJfcG9sYXJpdHk7CiB9OwogCi0jaWYgZGVmaW5lZChDT05GSUdfRFZCX0NYMjQxMjMpIHx8IGRlZmluZWQoQ09ORklHX0RWQl9DWDI0MTIzX01PRFVMRSkKKyNpZiBkZWZpbmVkKENPTkZJR19EVkJfQ1gyNDEyMykgfHwgKGRlZmluZWQoQ09ORklHX0RWQl9DWDI0MTIzX01PRFVMRSkgJiYgZGVmaW5lZChNT0RVTEUpKQogZXh0ZXJuIHN0cnVjdCBkdmJfZnJvbnRlbmQqIGN4MjQxMjNfYXR0YWNoKGNvbnN0IHN0cnVjdCBjeDI0MTIzX2NvbmZpZyogY29uZmlnLAogCQkJCQkgICBzdHJ1Y3QgaTJjX2FkYXB0ZXIqIGkyYyk7CiAjZWxzZQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL2RpYjMwMDAuaCBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9kaWIzMDAwLmgKaW5kZXggMGNhYWMzZi4uYTZkMzg1NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL2RpYjMwMDAuaAorKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvZGliMzAwMC5oCkBAIC00MSw3ICs0MSw3IEBACiAJaW50ICgqdHVuZXJfcGFzc19jdHJsKShzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSwgaW50IG9ub2ZmLCB1OCBwbGxfY3RybCk7CiB9OwogCi0jaWYgZGVmaW5lZChDT05GSUdfRFZCX0RJQjMwMDBNQikgfHwgZGVmaW5lZChDT05GSUdfRFZCX0RJQjMwMDBNQl9NT0RVTEUpCisjaWYgZGVmaW5lZChDT05GSUdfRFZCX0RJQjMwMDBNQikgfHwgKGRlZmluZWQoQ09ORklHX0RWQl9ESUIzMDAwTUJfTU9EVUxFKSAmJiBkZWZpbmVkKE1PRFVMRSkpCiBleHRlcm4gc3RydWN0IGR2Yl9mcm9udGVuZCogZGliMzAwMG1iX2F0dGFjaChjb25zdCBzdHJ1Y3QgZGliMzAwMF9jb25maWcqIGNvbmZpZywKIAkJCQkJICAgICBzdHJ1Y3QgaTJjX2FkYXB0ZXIqIGkyYywgc3RydWN0IGRpYl9mZV94ZmVyX29wcyAqeGZlcl9vcHMpOwogI2Vsc2UKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9kaWIzMDAwbWMuYyBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9kaWIzMDAwbWMuYwppbmRleCBjY2M4MTNiLi4zNTYxYTc3IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvZGliMzAwMG1jLmMKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL2RpYjMwMDBtYy5jCkBAIC0zNDUsNyArMzQ1LDcgQEAKIAogCS8qIGFnYyAqLwogCWRpYjMwMDBtY193cml0ZV93b3JkKHN0YXRlLCAzNiwgc3RhdGUtPmNmZy0+bWF4X3RpbWUpOwotCWRpYjMwMDBtY193cml0ZV93b3JkKHN0YXRlLCAzNywgYWdjLT5zZXR1cCk7CisJZGliMzAwMG1jX3dyaXRlX3dvcmQoc3RhdGUsIDM3LCAoc3RhdGUtPmNmZy0+YWdjX2NvbW1hbmQxIDw8IDEzKSB8IChzdGF0ZS0+Y2ZnLT5hZ2NfY29tbWFuZDIgPDwgMTIpIHwgKDB4MWQgPDwgMCkpOwogCWRpYjMwMDBtY193cml0ZV93b3JkKHN0YXRlLCAzOCwgc3RhdGUtPmNmZy0+cHdtM192YWx1ZSk7CiAJZGliMzAwMG1jX3dyaXRlX3dvcmQoc3RhdGUsIDM5LCBzdGF0ZS0+Y2ZnLT5sbl9hZGNfbGV2ZWwpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvZGliMzAwMG1jLmggYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvZGliMzAwMG1jLmgKaW5kZXggYjE5OGNkNS4uNzJkNDc1NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL2RpYjMwMDBtYy5oCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9kaWIzMDAwbWMuaApAQCAtMjgsNiArMjgsOSBAQAogCXUxNiBtYXhfdGltZTsKIAl1MTYgbG5fYWRjX2xldmVsOwogCisJdTggYWdjX2NvbW1hbmQxIDoxOworCXU4IGFnY19jb21tYW5kMiA6MTsKKwogCXU4IG1vYmlsZV9tb2RlOwogCiAJdTggb3V0cHV0X21wZWcyX2luXzE4OF9ieXRlczsKQEAgLTM2LDcgKzM5LDcgQEAKICNkZWZpbmUgREVGQVVMVF9ESUIzMDAwTUNfSTJDX0FERFJFU1MgMTYKICNkZWZpbmUgREVGQVVMVF9ESUIzMDAwUF9JMkNfQUREUkVTUyAgMjQKIAotI2lmIGRlZmluZWQoQ09ORklHX0RWQl9ESUIzMDAwTUMpIHx8IGRlZmluZWQoQ09ORklHX0RWQl9ESUIzMDAwTUNfTU9EVUxFKQorI2lmIGRlZmluZWQoQ09ORklHX0RWQl9ESUIzMDAwTUMpIHx8IChkZWZpbmVkKENPTkZJR19EVkJfRElCMzAwME1DX01PRFVMRSkgJiYgZGVmaW5lZChNT0RVTEUpKQogZXh0ZXJuIHN0cnVjdCBkdmJfZnJvbnRlbmQgKiBkaWIzMDAwbWNfYXR0YWNoKHN0cnVjdCBpMmNfYWRhcHRlciAqaTJjX2FkYXAsIHU4IGkyY19hZGRyLCBzdHJ1Y3QgZGliMzAwMG1jX2NvbmZpZyAqY2ZnKTsKICNlbHNlCiBzdGF0aWMgaW5saW5lIHN0cnVjdCBkdmJfZnJvbnRlbmQgKiBkaWIzMDAwbWNfYXR0YWNoKHN0cnVjdCBpMmNfYWRhcHRlciAqaTJjX2FkYXAsIHU4IGkyY19hZGRyLCBzdHJ1Y3QgZGliMzAwMG1jX2NvbmZpZyAqY2ZnKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL2lzbDY0MjEuaCBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9pc2w2NDIxLmgKaW5kZXggMTkxNmUzZS4uZWE3Zjc4YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL2lzbDY0MjEuaAorKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvaXNsNjQyMS5oCkBAIC0zOSw3ICszOSw3IEBACiAjZGVmaW5lIElTTDY0MjFfSVNFTDEJMHgyMAogI2RlZmluZSBJU0w2NDIxX0RDTAkweDQwCiAKLSNpZiBkZWZpbmVkKENPTkZJR19EVkJfSVNMNjQyMSkgfHwgZGVmaW5lZChDT05GSUdfRFZCX0lTTDY0MjFfTU9EVUxFKQorI2lmIGRlZmluZWQoQ09ORklHX0RWQl9JU0w2NDIxKSB8fCAoZGVmaW5lZChDT05GSUdfRFZCX0lTTDY0MjFfTU9EVUxFKSAmJiBkZWZpbmVkKE1PRFVMRSkpCiAvKiBvdmVycmlkZV9zZXQgYW5kIG92ZXJyaWRlX2NsZWFyIGNvbnRyb2wgd2hpY2ggc3lzdGVtIHJlZ2lzdGVyIGJpdHMgKGFib3ZlKSB0byBhbHdheXMgc2V0ICYgY2xlYXIgKi8KIGV4dGVybiBzdHJ1Y3QgZHZiX2Zyb250ZW5kICppc2w2NDIxX2F0dGFjaChzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSwgc3RydWN0IGkyY19hZGFwdGVyICppMmMsIHU4IGkyY19hZGRyLAogCQkJICB1OCBvdmVycmlkZV9zZXQsIHU4IG92ZXJyaWRlX2NsZWFyKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9sNjQ3ODEuaCBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9sNjQ3ODEuaAppbmRleCAyMWJhNGEyLi5jZDE1Zjc2IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvbDY0NzgxLmgKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL2w2NDc4MS5oCkBAIC0zMSw3ICszMSw3IEBACiAJdTggZGVtb2RfYWRkcmVzczsKIH07CiAKLSNpZiBkZWZpbmVkKENPTkZJR19EVkJfTDY0NzgxKSB8fCBkZWZpbmVkKENPTkZJR19EVkJfTDY0NzgxX01PRFVMRSkKKyNpZiBkZWZpbmVkKENPTkZJR19EVkJfTDY0NzgxKSB8fCAoZGVmaW5lZChDT05GSUdfRFZCX0w2NDc4MV9NT0RVTEUpICYmIGRlZmluZWQoTU9EVUxFKSkKIGV4dGVybiBzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBsNjQ3ODFfYXR0YWNoKGNvbnN0IHN0cnVjdCBsNjQ3ODFfY29uZmlnKiBjb25maWcsCiAJCQkJCSAgc3RydWN0IGkyY19hZGFwdGVyKiBpMmMpOwogI2Vsc2UKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9sZ2R0MzMweC5oIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL2xnZHQzMzB4LmgKaW5kZXggM2Y5NmI0OC4uOTk1MDU5MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL2xnZHQzMzB4LmgKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL2xnZHQzMzB4LmgKQEAgLTUyLDcgKzUyLDcgQEAKIAlpbnQgY2xvY2tfcG9sYXJpdHlfZmxpcDsKIH07CiAKLSNpZiBkZWZpbmVkKENPTkZJR19EVkJfTEdEVDMzMFgpIHx8IGRlZmluZWQoQ09ORklHX0RWQl9MR0RUMzMwWF9NT0RVTEUpCisjaWYgZGVmaW5lZChDT05GSUdfRFZCX0xHRFQzMzBYKSB8fCAoZGVmaW5lZChDT05GSUdfRFZCX0xHRFQzMzBYX01PRFVMRSkgJiYgZGVmaW5lZChNT0RVTEUpKQogZXh0ZXJuIHN0cnVjdCBkdmJfZnJvbnRlbmQqIGxnZHQzMzB4X2F0dGFjaChjb25zdCBzdHJ1Y3QgbGdkdDMzMHhfY29uZmlnKiBjb25maWcsCiAJCQkJCSAgICBzdHJ1Y3QgaTJjX2FkYXB0ZXIqIGkyYyk7CiAjZWxzZQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL2xuYnAyMS5oIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL2xuYnAyMS5oCmluZGV4IDFmZTFkZDEuLjY4OTA2YWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9sbmJwMjEuaAorKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvbG5icDIxLmgKQEAgLTM5LDcgKzM5LDcgQEAKIAogI2luY2x1ZGUgPGxpbnV4L2R2Yi9mcm9udGVuZC5oPgogCi0jaWYgZGVmaW5lZChDT05GSUdfRFZCX0xOQlAyMSkgfHwgZGVmaW5lZChDT05GSUdfRFZCX0xOQlAyMV9NT0RVTEUpCisjaWYgZGVmaW5lZChDT05GSUdfRFZCX0xOQlAyMSkgfHwgKGRlZmluZWQoQ09ORklHX0RWQl9MTkJQMjFfTU9EVUxFKSAmJiBkZWZpbmVkKE1PRFVMRSkpCiAvKiBvdmVycmlkZV9zZXQgYW5kIG92ZXJyaWRlX2NsZWFyIGNvbnRyb2wgd2hpY2ggc3lzdGVtIHJlZ2lzdGVyIGJpdHMgKGFib3ZlKSB0byBhbHdheXMgc2V0ICYgY2xlYXIgKi8KIGV4dGVybiBzdHJ1Y3QgZHZiX2Zyb250ZW5kICpsbmJwMjFfYXR0YWNoKHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlLCBzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmkyYywgdTggb3ZlcnJpZGVfc2V0LCB1OCBvdmVycmlkZV9jbGVhcik7CiAjZWxzZQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL210MjA2MC5oIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL210MjA2MC5oCmluZGV4IDM0YTM3YzIuLjBhODZlYWIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9tdDIwNjAuaAorKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvbXQyMDYwLmgKQEAgLTMwLDYgKzMwLDE0IEBACiAJdTggY2xvY2tfb3V0OyAvKiAwID0gb2ZmLCAxID0gQ0xLLzQsIDIgPSBDTEsvMiwgMyA9IENMSy8xICovCiB9OwogCisjaWYgZGVmaW5lZChDT05GSUdfRFZCX1RVTkVSX01UMjA2MCkgfHwgKGRlZmluZWQoQ09ORklHX0RWQl9UVU5FUl9NVDIwNjBfTU9EVUxFKSAmJiBkZWZpbmVkKE1PRFVMRSkpCiBleHRlcm4gc3RydWN0IGR2Yl9mcm9udGVuZCAqIG10MjA2MF9hdHRhY2goc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUsIHN0cnVjdCBpMmNfYWRhcHRlciAqaTJjLCBzdHJ1Y3QgbXQyMDYwX2NvbmZpZyAqY2ZnLCB1MTYgaWYxKTsKKyNlbHNlCitzdGF0aWMgaW5saW5lIHN0cnVjdCBkdmJfZnJvbnRlbmQgKiBtdDIwNjBfYXR0YWNoKHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlLCBzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmkyYywgc3RydWN0IG10MjA2MF9jb25maWcgKmNmZywgdTE2IGlmMSkKK3sKKwlwcmludGsoS0VSTl9XQVJOSU5HICIlczogZHJpdmVyIGRpc2FibGVkIGJ5IEtjb25maWdcbiIsIF9fRlVOQ1RJT05fXyk7CisJcmV0dXJuIE5VTEw7Cit9CisjZW5kaWYgLy8gQ09ORklHX0RWQl9UVU5FUl9NVDIwNjAKIAogI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvbXQzMTIuaCBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9tdDMxMi5oCmluZGV4IDcxMTJmYjQuLmNmOWExNTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9tdDMxMi5oCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9tdDMxMi5oCkBAIC0zNCw3ICszNCw3IEBACiAJdTggZGVtb2RfYWRkcmVzczsKIH07CiAKLSNpZiBkZWZpbmVkKENPTkZJR19EVkJfTVQzMTIpIHx8IGRlZmluZWQoQ09ORklHX0RWQl9NVDMxMl9NT0RVTEUpCisjaWYgZGVmaW5lZChDT05GSUdfRFZCX01UMzEyKSB8fCAoZGVmaW5lZChDT05GSUdfRFZCX01UMzEyX01PRFVMRSkgJiYgZGVmaW5lZChNT0RVTEUpKQogc3RydWN0IGR2Yl9mcm9udGVuZCogdnAzMTBfbXQzMTJfYXR0YWNoKGNvbnN0IHN0cnVjdCBtdDMxMl9jb25maWcqIGNvbmZpZywKIAkJCQkJc3RydWN0IGkyY19hZGFwdGVyKiBpMmMpOwogI2Vsc2UKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9tdDM1Mi5oIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL210MzUyLmgKaW5kZXggMDAzNWMyZS4uZTk5NjQwOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL210MzUyLmgKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL210MzUyLmgKQEAgLTUxLDcgKzUxLDcgQEAKIAlpbnQgKCpkZW1vZF9pbml0KShzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSk7CiB9OwogCi0jaWYgZGVmaW5lZChDT05GSUdfRFZCX01UMzUyKSB8fCBkZWZpbmVkKENPTkZJR19EVkJfTVQzNTJfTU9EVUxFKQorI2lmIGRlZmluZWQoQ09ORklHX0RWQl9NVDM1MikgfHwgKGRlZmluZWQoQ09ORklHX0RWQl9NVDM1Ml9NT0RVTEUpICYmIGRlZmluZWQoTU9EVUxFKSkKIGV4dGVybiBzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBtdDM1Ml9hdHRhY2goY29uc3Qgc3RydWN0IG10MzUyX2NvbmZpZyogY29uZmlnLAogCQkJCQkgc3RydWN0IGkyY19hZGFwdGVyKiBpMmMpOwogI2Vsc2UKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9ueHQyMDB4LmggYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvbnh0MjAweC5oCmluZGV4IDJlYjIyMGUuLjI4YmM1NTkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9ueHQyMDB4LmgKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL254dDIwMHguaApAQCAtNDUsNyArNDUsNyBAQAogCWludCAoKnNldF90c19wYXJhbXMpKHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlLCBpbnQgaXNfcHVuY3R1cmVkKTsKIH07CiAKLSNpZiBkZWZpbmVkKENPTkZJR19EVkJfTlhUMjAwWCkgfHwgZGVmaW5lZChDT05GSUdfRFZCX05YVDIwMFhfTU9EVUxFKQorI2lmIGRlZmluZWQoQ09ORklHX0RWQl9OWFQyMDBYKSB8fCAoZGVmaW5lZChDT05GSUdfRFZCX05YVDIwMFhfTU9EVUxFKSAmJiBkZWZpbmVkKE1PRFVMRSkpCiBleHRlcm4gc3RydWN0IGR2Yl9mcm9udGVuZCogbnh0MjAweF9hdHRhY2goY29uc3Qgc3RydWN0IG54dDIwMHhfY29uZmlnKiBjb25maWcsCiAJCQkJCSAgIHN0cnVjdCBpMmNfYWRhcHRlciogaTJjKTsKICNlbHNlCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvbnh0NjAwMC5oIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL254dDYwMDAuaAppbmRleCA5Mzk3MzkzLi4xM2QyMjUxIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvbnh0NjAwMC5oCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9ueHQ2MDAwLmgKQEAgLTMzLDcgKzMzLDcgQEAKIAl1OCBjbG9ja19pbnZlcnNpb246MTsKIH07CiAKLSNpZiBkZWZpbmVkKENPTkZJR19EVkJfTlhUNjAwMCkgfHwgZGVmaW5lZChDT05GSUdfRFZCX05YVDYwMDBfTU9EVUxFKQorI2lmIGRlZmluZWQoQ09ORklHX0RWQl9OWFQ2MDAwKSB8fCAoZGVmaW5lZChDT05GSUdfRFZCX05YVDYwMDBfTU9EVUxFKSAmJiBkZWZpbmVkKE1PRFVMRSkpCiBleHRlcm4gc3RydWN0IGR2Yl9mcm9udGVuZCogbnh0NjAwMF9hdHRhY2goY29uc3Qgc3RydWN0IG54dDYwMDBfY29uZmlnKiBjb25maWcsCiAJCQkJCSAgIHN0cnVjdCBpMmNfYWRhcHRlciogaTJjKTsKICNlbHNlCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvb3I1MTEzMi5oIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL29yNTExMzIuaAppbmRleCA5NzE4YmU0Li5hZGQyNGYwIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvb3I1MTEzMi5oCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9vcjUxMTMyLmgKQEAgLTM0LDcgKzM0LDcgQEAKIAlpbnQgKCpzZXRfdHNfcGFyYW1zKShzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSwgaW50IGlzX3B1bmN0dXJlZCk7CiB9OwogCi0jaWYgZGVmaW5lZChDT05GSUdfRFZCX09SNTExMzIpIHx8IGRlZmluZWQoQ09ORklHX0RWQl9PUjUxMTMyX01PRFVMRSkKKyNpZiBkZWZpbmVkKENPTkZJR19EVkJfT1I1MTEzMikgfHwgKGRlZmluZWQoQ09ORklHX0RWQl9PUjUxMTMyX01PRFVMRSkgJiYgZGVmaW5lZChNT0RVTEUpKQogZXh0ZXJuIHN0cnVjdCBkdmJfZnJvbnRlbmQqIG9yNTExMzJfYXR0YWNoKGNvbnN0IHN0cnVjdCBvcjUxMTMyX2NvbmZpZyogY29uZmlnLAogCQkJCQkgICBzdHJ1Y3QgaTJjX2FkYXB0ZXIqIGkyYyk7CiAjZWxzZQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL29yNTEyMTEuaCBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9vcjUxMjExLmgKaW5kZXggMTBhNTQxOS4uOGFhZDg0MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL29yNTEyMTEuaAorKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvb3I1MTIxMS5oCkBAIC0zNyw3ICszNyw3IEBACiAJdm9pZCAoKnNsZWVwKShzdHJ1Y3QgZHZiX2Zyb250ZW5kICogZmUpOwogfTsKIAotI2lmIGRlZmluZWQoQ09ORklHX0RWQl9PUjUxMjExKSB8fCBkZWZpbmVkKENPTkZJR19EVkJfT1I1MTIxMV9NT0RVTEUpCisjaWYgZGVmaW5lZChDT05GSUdfRFZCX09SNTEyMTEpIHx8IChkZWZpbmVkKENPTkZJR19EVkJfT1I1MTIxMV9NT0RVTEUpICYmIGRlZmluZWQoTU9EVUxFKSkKIGV4dGVybiBzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBvcjUxMjExX2F0dGFjaChjb25zdCBzdHJ1Y3Qgb3I1MTIxMV9jb25maWcqIGNvbmZpZywKIAkJCQkJICAgc3RydWN0IGkyY19hZGFwdGVyKiBpMmMpOwogI2Vsc2UKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9zNWgxNDIwLmggYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvczVoMTQyMC5oCmluZGV4IGVmYzU0ZDcuLjE1NTU4NzAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9zNWgxNDIwLmgKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL3M1aDE0MjAuaApAQCAtMzQsNyArMzQsNyBAQAogCXU4IGludmVydDoxOwogfTsKIAotI2lmIGRlZmluZWQoQ09ORklHX0RWQl9TNUgxNDIwKSB8fCBkZWZpbmVkKENPTkZJR19EVkJfUzVIMTQyMF9NT0RVTEUpCisjaWYgZGVmaW5lZChDT05GSUdfRFZCX1M1SDE0MjApIHx8IChkZWZpbmVkKENPTkZJR19EVkJfUzVIMTQyMF9NT0RVTEUpICYmIGRlZmluZWQoTU9EVUxFKSkKIGV4dGVybiBzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBzNWgxNDIwX2F0dGFjaChjb25zdCBzdHJ1Y3QgczVoMTQyMF9jb25maWcqIGNvbmZpZywKIAkgICAgIHN0cnVjdCBpMmNfYWRhcHRlciogaTJjKTsKICNlbHNlCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvc3A4ODcwLmggYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvc3A4ODcwLmgKaW5kZXggNGNmMjdkMy4uOTA5Y2VmZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL3NwODg3MC5oCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9zcDg4NzAuaApAQCAtMzUsNyArMzUsNyBAQAogCWludCAoKnJlcXVlc3RfZmlybXdhcmUpKHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlLCBjb25zdCBzdHJ1Y3QgZmlybXdhcmUgKipmdywgY2hhciogbmFtZSk7CiB9OwogCi0jaWYgZGVmaW5lZChDT05GSUdfRFZCX1NQODg3MCkgfHwgZGVmaW5lZChDT05GSUdfRFZCX1NQODg3MF9NT0RVTEUpCisjaWYgZGVmaW5lZChDT05GSUdfRFZCX1NQODg3MCkgfHwgKGRlZmluZWQoQ09ORklHX0RWQl9TUDg4NzBfTU9EVUxFKSAmJiBkZWZpbmVkKE1PRFVMRSkpCiBleHRlcm4gc3RydWN0IGR2Yl9mcm9udGVuZCogc3A4ODcwX2F0dGFjaChjb25zdCBzdHJ1Y3Qgc3A4ODcwX2NvbmZpZyogY29uZmlnLAogCQkJCQkgIHN0cnVjdCBpMmNfYWRhcHRlciogaTJjKTsKICNlbHNlCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvc3A4ODd4LmggYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvc3A4ODd4LmgKaW5kZXggY2FiN2VhNi4uN2VlNzhkNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL3NwODg3eC5oCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9zcDg4N3guaApAQCAtMTcsNyArMTcsNyBAQAogCWludCAoKnJlcXVlc3RfZmlybXdhcmUpKHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlLCBjb25zdCBzdHJ1Y3QgZmlybXdhcmUgKipmdywgY2hhciogbmFtZSk7CiB9OwogCi0jaWYgZGVmaW5lZChDT05GSUdfRFZCX1NQODg3WCkgfHwgZGVmaW5lZChDT05GSUdfRFZCX1NQODg3WF9NT0RVTEUpCisjaWYgZGVmaW5lZChDT05GSUdfRFZCX1NQODg3WCkgfHwgKGRlZmluZWQoQ09ORklHX0RWQl9TUDg4N1hfTU9EVUxFKSAmJiBkZWZpbmVkKE1PRFVMRSkpCiBleHRlcm4gc3RydWN0IGR2Yl9mcm9udGVuZCogc3A4ODd4X2F0dGFjaChjb25zdCBzdHJ1Y3Qgc3A4ODd4X2NvbmZpZyogY29uZmlnLAogCQkJCQkgIHN0cnVjdCBpMmNfYWRhcHRlciogaTJjKTsKICNlbHNlCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvc3R2MDI5Ny5oIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL3N0djAyOTcuaAppbmRleCA3NjBiODBkLi42OWY0NTE1IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvc3R2MDI5Ny5oCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9zdHYwMjk3LmgKQEAgLTQyLDcgKzQyLDcgQEAKIAl1OCBzdG9wX2R1cmluZ19yZWFkOjE7CiB9OwogCi0jaWYgZGVmaW5lZChDT05GSUdfRFZCX1NUVjAyOTcpIHx8IGRlZmluZWQoQ09ORklHX0RWQl9TVFYwMjk3X01PRFVMRSkKKyNpZiBkZWZpbmVkKENPTkZJR19EVkJfU1RWMDI5NykgfHwgKGRlZmluZWQoQ09ORklHX0RWQl9TVFYwMjk3X01PRFVMRSkgJiYgZGVmaW5lZChNT0RVTEUpKQogZXh0ZXJuIHN0cnVjdCBkdmJfZnJvbnRlbmQqIHN0djAyOTdfYXR0YWNoKGNvbnN0IHN0cnVjdCBzdHYwMjk3X2NvbmZpZyogY29uZmlnLAogCQkJCQkgICBzdHJ1Y3QgaTJjX2FkYXB0ZXIqIGkyYyk7CiAjZWxzZQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL3N0djAyOTkuaCBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9zdHYwMjk5LmgKaW5kZXggN2VmMjUyMC4uMzNkZjk0OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL3N0djAyOTkuaAorKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvc3R2MDI5OS5oCkBAIC04OSw3ICs4OSw3IEBACiAJaW50ICgqc2V0X3N5bWJvbF9yYXRlKShzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSwgdTMyIHNyYXRlLCB1MzIgcmF0aW8pOwogfTsKIAotI2lmIGRlZmluZWQoQ09ORklHX0RWQl9TVFYwMjk5KSB8fCBkZWZpbmVkKENPTkZJR19EVkJfU1RWMDI5OV9NT0RVTEUpCisjaWYgZGVmaW5lZChDT05GSUdfRFZCX1NUVjAyOTkpIHx8IChkZWZpbmVkKENPTkZJR19EVkJfU1RWMDI5OV9NT0RVTEUpICYmIGRlZmluZWQoTU9EVUxFKSkKIGV4dGVybiBzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBzdHYwMjk5X2F0dGFjaChjb25zdCBzdHJ1Y3Qgc3R2MDI5OV9jb25maWcqIGNvbmZpZywKIAkJCQkJICAgc3RydWN0IGkyY19hZGFwdGVyKiBpMmMpOwogI2Vsc2UKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy90ZGExMDAyMS5oIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL3RkYTEwMDIxLmgKaW5kZXggZDY4YWUyMC4uZTNkYTc4MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL3RkYTEwMDIxLmgKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL3RkYTEwMDIxLmgKQEAgLTMyLDcgKzMyLDcgQEAKIAl1OCBkZW1vZF9hZGRyZXNzOwogfTsKIAotI2lmIGRlZmluZWQoQ09ORklHX0RWQl9UREExMDAyMSkgfHwgZGVmaW5lZChDT05GSUdfRFZCX1REQTEwMDIxX01PRFVMRSkKKyNpZiBkZWZpbmVkKENPTkZJR19EVkJfVERBMTAwMjEpIHx8IChkZWZpbmVkKENPTkZJR19EVkJfVERBMTAwMjFfTU9EVUxFKSAmJiBkZWZpbmVkKE1PRFVMRSkpCiBleHRlcm4gc3RydWN0IGR2Yl9mcm9udGVuZCogdGRhMTAwMjFfYXR0YWNoKGNvbnN0IHN0cnVjdCB0ZGExMDAyMV9jb25maWcqIGNvbmZpZywKIAkJCQkJICAgIHN0cnVjdCBpMmNfYWRhcHRlciogaTJjLCB1OCBwd20pOwogI2Vsc2UKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy90ZGExMDA0eC5oIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL3RkYTEwMDR4LmgKaW5kZXggZTI4ZmNhMC4uNjA1YWQyZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL3RkYTEwMDR4LmgKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL3RkYTEwMDR4LmgKQEAgLTcxLDcgKzcxLDcgQEAKIAlpbnQgKCpyZXF1ZXN0X2Zpcm13YXJlKShzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSwgY29uc3Qgc3RydWN0IGZpcm13YXJlICoqZncsIGNoYXIqIG5hbWUpOwogfTsKIAotI2lmIGRlZmluZWQoQ09ORklHX0RWQl9UREExMDA0WCkgfHwgZGVmaW5lZChDT05GSUdfRFZCX1REQTEwMDRYX01PRFVMRSkKKyNpZiBkZWZpbmVkKENPTkZJR19EVkJfVERBMTAwNFgpIHx8IChkZWZpbmVkKENPTkZJR19EVkJfVERBMTAwNFhfTU9EVUxFKSAmJiBkZWZpbmVkKE1PRFVMRSkpCiBleHRlcm4gc3RydWN0IGR2Yl9mcm9udGVuZCogdGRhMTAwNDVfYXR0YWNoKGNvbnN0IHN0cnVjdCB0ZGExMDA0eF9jb25maWcqIGNvbmZpZywKIAkJCQkJICAgIHN0cnVjdCBpMmNfYWRhcHRlciogaTJjKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL3RkYTEwMDg2LmggYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvdGRhMTAwODYuaAppbmRleCBlODA2MWRiLi5lZDU4NGE4IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvdGRhMTAwODYuaAorKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvdGRhMTAwODYuaApAQCAtMzUsNyArMzUsMTYgQEAKIAl1OCBpbnZlcnQ7CiB9OwogCisjaWYgZGVmaW5lZChDT05GSUdfRFZCX1REQTEwMDg2KSB8fCAoZGVmaW5lZChDT05GSUdfRFZCX1REQTEwMDg2X01PRFVMRSkgJiYgZGVmaW5lZChNT0RVTEUpKQogZXh0ZXJuIHN0cnVjdCBkdmJfZnJvbnRlbmQqIHRkYTEwMDg2X2F0dGFjaChjb25zdCBzdHJ1Y3QgdGRhMTAwODZfY29uZmlnKiBjb25maWcsCiAJCQkJCSAgICBzdHJ1Y3QgaTJjX2FkYXB0ZXIqIGkyYyk7CisjZWxzZQorc3RhdGljIGlubGluZSBzdHJ1Y3QgZHZiX2Zyb250ZW5kKiB0ZGExMDA4Nl9hdHRhY2goY29uc3Qgc3RydWN0IHRkYTEwMDg2X2NvbmZpZyogY29uZmlnLAorCQkJCQkJICAgc3RydWN0IGkyY19hZGFwdGVyKiBpMmMpCit7CisJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IGRyaXZlciBkaXNhYmxlZCBieSBLY29uZmlnXG4iLCBfX0ZVTkNUSU9OX18pOworCXJldHVybiBOVUxMOworfQorI2VuZGlmIC8vIENPTkZJR19EVkJfVERBMTAwODYKIAogI2VuZGlmIC8vIFREQTEwMDg2X0gKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy90ZGE4MDgzLmggYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvdGRhODA4My5oCmluZGV4IGFhZTE1YmQuLjJkMzMwNzkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy90ZGE4MDgzLmgKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL3RkYTgwODMuaApAQCAtMzUsNyArMzUsNyBAQAogCXU4IGRlbW9kX2FkZHJlc3M7CiB9OwogCi0jaWYgZGVmaW5lZChDT05GSUdfRFZCX1REQTgwODMpIHx8IGRlZmluZWQoQ09ORklHX0RWQl9UREE4MDgzX01PRFVMRSkKKyNpZiBkZWZpbmVkKENPTkZJR19EVkJfVERBODA4MykgfHwgKGRlZmluZWQoQ09ORklHX0RWQl9UREE4MDgzX01PRFVMRSkgJiYgZGVmaW5lZChNT0RVTEUpKQogZXh0ZXJuIHN0cnVjdCBkdmJfZnJvbnRlbmQqIHRkYTgwODNfYXR0YWNoKGNvbnN0IHN0cnVjdCB0ZGE4MDgzX2NvbmZpZyogY29uZmlnLAogCQkJCQkgICBzdHJ1Y3QgaTJjX2FkYXB0ZXIqIGkyYyk7CiAjZWxzZQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL3RkYTgyNnguYyBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy90ZGE4MjZ4LmMKaW5kZXggZWVhYjI2Yi4uMzQ4MTViMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL3RkYTgyNnguYworKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvdGRhODI2eC5jCkBAIC0xMjEsNyArMTIxLDcgQEAKIAkuaW5mbyA9IHsKIAkJLm5hbWUgPSAiUGhpbGlwcyBUREE4MjZYIiwKIAkJLmZyZXF1ZW5jeV9taW4gPSA5NTAwMDAsCi0JCS5mcmVxdWVuY3lfbWluID0gMjE3NTAwMAorCQkuZnJlcXVlbmN5X21heCA9IDIxNzUwMDAKIAl9LAogCS5yZWxlYXNlID0gdGRhODI2eF9yZWxlYXNlLAogCS5zbGVlcCA9IHRkYTgyNnhfc2xlZXAsCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvdGRhODI2eC5oIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL3RkYTgyNnguaAppbmRleCAzMzA3NjA3Li5hZDk5ODExIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvdGRhODI2eC5oCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy90ZGE4MjZ4LmgKQEAgLTM1LDYgKzM1LDE5IEBACiAgKiBAcGFyYW0gaGFzX2xvb3B0aHJvdWdoIFNldCB0byAxIGlmIHRoZSBjYXJkIGhhcyBhIGxvb3B0aHJvdWdoIFJGIGNvbm5lY3Rvci4KICAqIEByZXR1cm4gRkUgcG9pbnRlciBvbiBzdWNjZXNzLCBOVUxMIG9uIGZhaWx1cmUuCiAgKi8KLWV4dGVybiBzdHJ1Y3QgZHZiX2Zyb250ZW5kICp0ZGE4MjZ4X2F0dGFjaChzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSwgaW50IGFkZHIsIHN0cnVjdCBpMmNfYWRhcHRlciAqaTJjLCBpbnQgaGFzX2xvb3B0aHJvdWdoKTsKKyNpZiBkZWZpbmVkKENPTkZJR19EVkJfVERBODI2WCkgfHwgKGRlZmluZWQoQ09ORklHX0RWQl9UREE4MjZYX01PRFVMRSkgJiYgZGVmaW5lZChNT0RVTEUpKQorZXh0ZXJuIHN0cnVjdCBkdmJfZnJvbnRlbmQqIHRkYTgyNnhfYXR0YWNoKHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlLCBpbnQgYWRkciwKKwkJCQkJICAgc3RydWN0IGkyY19hZGFwdGVyICppMmMsCisJCQkJCSAgIGludCBoYXNfbG9vcHRocm91Z2gpOworI2Vsc2UKK3N0YXRpYyBpbmxpbmUgc3RydWN0IGR2Yl9mcm9udGVuZCogdGRhODI2eF9hdHRhY2goc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUsCisJCQkJCQkgIGludCBhZGRyLAorCQkJCQkJICBzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmkyYywKKwkJCQkJCSAgaW50IGhhc19sb29wdGhyb3VnaCkKK3sKKwlwcmludGsoS0VSTl9XQVJOSU5HICIlczogZHJpdmVyIGRpc2FibGVkIGJ5IEtjb25maWdcbiIsIF9fRlVOQ1RJT05fXyk7CisJcmV0dXJuIE5VTEw7Cit9CisjZW5kaWYgLy8gQ09ORklHX0RWQl9UREE4MjZYCiAKLSNlbmRpZgorI2VuZGlmIC8vIF9fRFZCX1REQTgyNlhfSF9fCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvdHVhNjEwMC5oIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL3R1YTYxMDAuaAppbmRleCA4Zjk4MDMzLi4wM2E2NjVlIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvdHVhNjEwMC5oCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy90dWE2MTAwLmgKQEAgLTM0LDcgKzM0LDcgQEAKICNpbmNsdWRlIDxsaW51eC9pMmMuaD4KICNpbmNsdWRlICJkdmJfZnJvbnRlbmQuaCIKIAotI2lmIGRlZmluZWQoQ09ORklHX0RWQl9UVUE2MTAwKSB8fCBkZWZpbmVkKENPTkZJR19EVkJfVFVBNjEwMF9NT0RVTEUpCisjaWYgZGVmaW5lZChDT05GSUdfRFZCX1RVQTYxMDApIHx8IChkZWZpbmVkKENPTkZJR19EVkJfVFVBNjEwMF9NT0RVTEUpICYmIGRlZmluZWQoTU9EVUxFKSkKIGV4dGVybiBzdHJ1Y3QgZHZiX2Zyb250ZW5kICp0dWE2MTAwX2F0dGFjaChzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSwgaW50IGFkZHIsIHN0cnVjdCBpMmNfYWRhcHRlciAqaTJjKTsKICNlbHNlCiBzdGF0aWMgaW5saW5lIHN0cnVjdCBkdmJfZnJvbnRlbmQqIHR1YTYxMDBfYXR0YWNoKHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlLCBpbnQgYWRkciwgc3RydWN0IGkyY19hZGFwdGVyICppMmMpCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvdmVzMTgyMC5oIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL3ZlczE4MjAuaAppbmRleCBmMGM5ZGRlLi5lNGEyYTMyIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvdmVzMTgyMC5oCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy92ZXMxODIwLmgKQEAgLTQxLDcgKzQxLDcgQEAKIAl1OCBzZWxhZ2M6MTsKIH07CiAKLSNpZiBkZWZpbmVkKENPTkZJR19EVkJfVkVTMTgyMCkgfHwgZGVmaW5lZChDT05GSUdfRFZCX1ZFUzE4MjBfTU9EVUxFKQorI2lmIGRlZmluZWQoQ09ORklHX0RWQl9WRVMxODIwKSB8fCAoZGVmaW5lZChDT05GSUdfRFZCX1ZFUzE4MjBfTU9EVUxFKSAmJiBkZWZpbmVkKE1PRFVMRSkpCiBleHRlcm4gc3RydWN0IGR2Yl9mcm9udGVuZCogdmVzMTgyMF9hdHRhY2goY29uc3Qgc3RydWN0IHZlczE4MjBfY29uZmlnKiBjb25maWcsCiAJCQkJCSAgIHN0cnVjdCBpMmNfYWRhcHRlciogaTJjLCB1OCBwd20pOwogI2Vsc2UKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy92ZXMxeDkzLmggYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvdmVzMXg5My5oCmluZGV4IDM5NWZlZDMuLmQ1MDdmODkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy92ZXMxeDkzLmgKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL3ZlczF4OTMuaApAQCAtNDAsNyArNDAsNyBAQAogCXU4IGludmVydF9wd206MTsKIH07CiAKLSNpZiBkZWZpbmVkKENPTkZJR19EVkJfVkVTMVg5MykgfHwgZGVmaW5lZChDT05GSUdfRFZCX1ZFUzFYOTNfTU9EVUxFKQorI2lmIGRlZmluZWQoQ09ORklHX0RWQl9WRVMxWDkzKSB8fCAoZGVmaW5lZChDT05GSUdfRFZCX1ZFUzFYOTNfTU9EVUxFKSAmJiBkZWZpbmVkKE1PRFVMRSkpCiBleHRlcm4gc3RydWN0IGR2Yl9mcm9udGVuZCogdmVzMXg5M19hdHRhY2goY29uc3Qgc3RydWN0IHZlczF4OTNfY29uZmlnKiBjb25maWcsCiAJCQkJCSAgIHN0cnVjdCBpMmNfYWRhcHRlciogaTJjKTsKICNlbHNlCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvemwxMDM1My5oIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL3psMTAzNTMuaAppbmRleCA3OWE5NDcyLi4wYmMwMTA5IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvemwxMDM1My5oCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy96bDEwMzUzLmgKQEAgLTM2LDcgKzM2LDcgQEAKIAlpbnQgcGFyYWxsZWxfdHM7CiB9OwogCi0jaWYgZGVmaW5lZChDT05GSUdfRFZCX1pMMTAzNTMpIHx8IGRlZmluZWQoQ09ORklHX0RWQl9aTDEwMzUzX01PRFVMRSkKKyNpZiBkZWZpbmVkKENPTkZJR19EVkJfWkwxMDM1MykgfHwgKGRlZmluZWQoQ09ORklHX0RWQl9aTDEwMzUzX01PRFVMRSkgJiYgZGVmaW5lZChNT0RVTEUpKQogZXh0ZXJuIHN0cnVjdCBkdmJfZnJvbnRlbmQqIHpsMTAzNTNfYXR0YWNoKGNvbnN0IHN0cnVjdCB6bDEwMzUzX2NvbmZpZyAqY29uZmlnLAogCQkJCQkgICBzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmkyYyk7CiAjZWxzZQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvdHRwY2kvYnVkZ2V0LWNpLmMgYi9kcml2ZXJzL21lZGlhL2R2Yi90dHBjaS9idWRnZXQtY2kuYwppbmRleCAyYTJlOWI0Li5jZDVlYzQ4IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi90dHBjaS9idWRnZXQtY2kuYworKysgYi9kcml2ZXJzL21lZGlhL2R2Yi90dHBjaS9idWRnZXQtY2kuYwpAQCAtNDYsNyArNDYsMTQgQEAKICNpbmNsdWRlICJic2JlMS5oIgogI2luY2x1ZGUgImJzcnU2LmgiCiAKLSNkZWZpbmUgREVCSUFERFJfSVIJCTB4MTIzNAorLyoKKyAqIFJlZ2FyZGluZyBERUJJQUREUl9JUjoKKyAqIFNvbWUgQ0kgbW9kdWxlcyBoYW5nIGlmIHJhbmRvbSBhZGRyZXNzZXMgYXJlIHJlYWQuCisgKiBVc2luZyBhZGRyZXNzIDB4NDAwMCBmb3IgdGhlIElSIHJlYWQgbWVhbnMgdGhhdCB3ZQorICogdXNlIHRoZSBzYW1lIGFkZHJlc3MgYXMgZm9yIENJIHZlcnNpb24sIHdoaWNoIHNob3VsZAorICogYmUgYSBzYWZlIGRlZmF1bHQuCisgKi8KKyNkZWZpbmUgREVCSUFERFJfSVIJCTB4NDAwMAogI2RlZmluZSBERUJJQUREUl9DSUNPTlRST0wJMHgwMDAwCiAjZGVmaW5lIERFQklBRERSX0NJVkVSU0lPTgkweDQwMDAKICNkZWZpbmUgREVCSUFERFJfSU8JCTB4MTAwMApAQCAtMTAyOCw2ICsxMDM1LDcgQEAKIAogCWNhc2UgMHgxMDEyOgkJLy8gVFQgRFZCLVQgQ0kgYnVkZ2V0ICh0ZGExMDA0Ni9QaGlsaXBzIHRkbTEzMTZsKHRkYTY2NTF0dCkpCiAJCWJ1ZGdldF9jaS0+dHVuZXJfcGxsX2FkZHJlc3MgPSAweDYwOworCQlwaGlsaXBzX3RkbTEzMTZsX2NvbmZpZy5pbnZlcnQgPSAxOwogCQlidWRnZXRfY2ktPmJ1ZGdldC5kdmJfZnJvbnRlbmQgPQogCQkJZHZiX2F0dGFjaCh0ZGExMDA0Nl9hdHRhY2gsICZwaGlsaXBzX3RkbTEzMTZsX2NvbmZpZywgJmJ1ZGdldF9jaS0+YnVkZ2V0LmkyY19hZGFwKTsKIAkJaWYgKGJ1ZGdldF9jaS0+YnVkZ2V0LmR2Yl9mcm9udGVuZCkgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9LY29uZmlnIGIvZHJpdmVycy9tZWRpYS92aWRlby9LY29uZmlnCmluZGV4IGFmYjczNGQuLmJmMjY3NTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vS2NvbmZpZworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL0tjb25maWcKQEAgLTE4Niw3ICsxODYsNyBAQAogCiBjb25maWcgVklERU9fU0FBNzExMAogCXRyaXN0YXRlICJQaGlsaXBzIFNBQTcxMTAgdmlkZW8gZGVjb2RlciIKLQlkZXBlbmRzIG9uIFZJREVPX1Y0TDEKKwlkZXBlbmRzIG9uIFZJREVPX1Y0TDEgJiYgSTJDCiAJLS0taGVscC0tLQogCSAgU3VwcG9ydCBmb3IgdGhlIFBoaWxpcHMgU0FBNzExMCB2aWRlbyBkZWNvZGVycy4KIApAQCAtNjc3LDYgKzY3Nyw4IEBACiBtZW51ICJWNEwgVVNCIGRldmljZXMiCiAJZGVwZW5kcyBvbiBVU0IgJiYgVklERU9fREVWCiAKK3NvdXJjZSAiZHJpdmVycy9tZWRpYS92aWRlby9wdnJ1c2IyL0tjb25maWciCisKIHNvdXJjZSAiZHJpdmVycy9tZWRpYS92aWRlby9lbTI4eHgvS2NvbmZpZyIKIAogc291cmNlICJkcml2ZXJzL21lZGlhL3ZpZGVvL3VzYnZpZGVvL0tjb25maWciCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2J0OHh4L2J0dHYtY2FyZHMuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vYnQ4eHgvYnR0di1jYXJkcy5jCmluZGV4IGE4NDkwM2UuLjIxZWJlOGYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vYnQ4eHgvYnR0di1jYXJkcy5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vYnQ4eHgvYnR0di1jYXJkcy5jCkBAIC00MDAxLDcgKzQwMDEsNyBAQAogICogICAgICAtIHNsZWVwIDFtcwogICogICAgICAtIHdyaXRlIDB4MEUKICAqICAgICByZWFkIGZyb20gR1BJT19EQVRBIGludG8gYnVmICh1aW50XzMyKQotICogICAgICAtIGlmICggYnVmPj4xOCAmIDB4MDEgKSB8fCAoIGJ1Zj4+MTkgJiYgMHgwMSAhPSAwICkKKyAqICAgICAgLSBpZiAoIGJ1Zj4+MTggJiAweDAxICkgfHwgKCBidWY+PjE5ICYgMHgwMSAhPSAwICkKICAqICAgICAgICAgICAgICAgIGVycm9yLiBFUlJPUl9DUExEX0NoZWNrX0ZhaWxlZC4KICAqLwogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3gyNTg0MC9jeDI1ODQwLXZiaS5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9jeDI1ODQwL2N4MjU4NDAtdmJpLmMKaW5kZXggNDgwMTRhMi4uZjg1ZjIwOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9jeDI1ODQwL2N4MjU4NDAtdmJpLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9jeDI1ODQwL2N4MjU4NDAtdmJpLmMKQEAgLTIzNSw2ICsyMzUsNyBAQAogCQkJMCwgMCwgVjRMMl9TTElDRURfVlBTLCAwLCAwLAkvKiA5ICovCiAJCQkwLCAwLCAwLCAwCiAJCX07CisJCWludCBpc19wYWwgPSAhKGN4MjU4NDBfZ2V0X3Y0bHN0ZChjbGllbnQpICYgVjRMMl9TVERfNTI1XzYwKTsKIAkJaW50IGk7CiAKIAkJZm10ID0gYXJnOwpAQCAtMjQ2LDEzICsyNDcsMjUgQEAKIAkJaWYgKChjeDI1ODQwX3JlYWQoY2xpZW50LCAweDQwNCkgJiAweDEwKSA9PSAwKQogCQkJYnJlYWs7CiAKLQkJZm9yIChpID0gNzsgaSA8PSAyMzsgaSsrKSB7Ci0JCQl1OCB2ID0gY3gyNTg0MF9yZWFkKGNsaWVudCwgMHg0MjQgKyBpIC0gNyk7CisJCWlmIChpc19wYWwpIHsKKwkJCWZvciAoaSA9IDc7IGkgPD0gMjM7IGkrKykgeworCQkJCXU4IHYgPSBjeDI1ODQwX3JlYWQoY2xpZW50LCAweDQyNCArIGkgLSA3KTsKIAotCQkJc3ZiaS0+c2VydmljZV9saW5lc1swXVtpXSA9IGxjcjJ2YmlbdiA+PiA0XTsKLQkJCXN2YmktPnNlcnZpY2VfbGluZXNbMV1baV0gPSBsY3IydmJpW3YgJiAweGZdOwotCQkJc3ZiaS0+c2VydmljZV9zZXQgfD0KLQkJCQkgc3ZiaS0+c2VydmljZV9saW5lc1swXVtpXSB8IHN2YmktPnNlcnZpY2VfbGluZXNbMV1baV07CisJCQkJc3ZiaS0+c2VydmljZV9saW5lc1swXVtpXSA9IGxjcjJ2YmlbdiA+PiA0XTsKKwkJCQlzdmJpLT5zZXJ2aWNlX2xpbmVzWzFdW2ldID0gbGNyMnZiaVt2ICYgMHhmXTsKKwkJCQlzdmJpLT5zZXJ2aWNlX3NldCB8PQorCQkJCQlzdmJpLT5zZXJ2aWNlX2xpbmVzWzBdW2ldIHwgc3ZiaS0+c2VydmljZV9saW5lc1sxXVtpXTsKKwkJCX0KKwkJfQorCQllbHNlIHsKKwkJCWZvciAoaSA9IDEwOyBpIDw9IDIxOyBpKyspIHsKKwkJCQl1OCB2ID0gY3gyNTg0MF9yZWFkKGNsaWVudCwgMHg0MjQgKyBpIC0gMTApOworCisJCQkJc3ZiaS0+c2VydmljZV9saW5lc1swXVtpXSA9IGxjcjJ2YmlbdiA+PiA0XTsKKwkJCQlzdmJpLT5zZXJ2aWNlX2xpbmVzWzFdW2ldID0gbGNyMnZiaVt2ICYgMHhmXTsKKwkJCQlzdmJpLT5zZXJ2aWNlX3NldCB8PQorCQkJCQlzdmJpLT5zZXJ2aWNlX2xpbmVzWzBdW2ldIHwgc3ZiaS0+c2VydmljZV9saW5lc1sxXVtpXTsKKwkJCX0KIAkJfQogCQlicmVhazsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4ODgvY3g4OC1jYXJkcy5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9jeDg4L2N4ODgtY2FyZHMuYwppbmRleCBhZjcxZDQyLi5mNzY0YTU3IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4ODgvY3g4OC1jYXJkcy5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3g4OC9jeDg4LWNhcmRzLmMKQEAgLTEyMzAsNiArMTIzMCw3IEBACiAJCQkudm11eCAgID0gMiwKIAkJCS5ncGlvMCAgPSAweDg0YmYsCiAJCX19LAorCQkubXBlZyAgICAgICAgICAgPSBDWDg4X01QRUdfRFZCLAogCX0sCiAJW0NYODhfQk9BUkRfTk9SV09PRF9NSUNST10gPSB7CiAJCS5uYW1lICAgICAgICAgICA9ICJOb3J3b29kIE1pY3JvIFRWIFR1bmVyIiwKQEAgLTE1OTAsNiArMTU5MSwxOCBAQAogCQkuc3VidmVuZG9yID0gMHgwMDcwLAogCQkuc3ViZGV2aWNlID0gMHg5MDAwLAogCQkuY2FyZCAgICAgID0gQ1g4OF9CT0FSRF9IQVVQUEFVR0VfRFZCX1QxLAorCX0seworCQkuc3VidmVuZG9yID0gMHgwMDcwLAorCQkuc3ViZGV2aWNlID0gMHgxNDAwLAorCQkuY2FyZCAgICAgID0gQ1g4OF9CT0FSRF9IQVVQUEFVR0VfSFZSMzAwMCwKKwl9LHsKKwkJLnN1YnZlbmRvciA9IDB4MDA3MCwKKwkJLnN1YmRldmljZSA9IDB4MTQwMSwKKwkJLmNhcmQgICAgICA9IENYODhfQk9BUkRfSEFVUFBBVUdFX0hWUjMwMDAsCisJfSx7CisJCS5zdWJ2ZW5kb3IgPSAweDAwNzAsCisJCS5zdWJkZXZpY2UgPSAweDE0MDIsCisJCS5jYXJkICAgICAgPSBDWDg4X0JPQVJEX0hBVVBQQVVHRV9IVlIzMDAwLAogCX0sCiB9OwogY29uc3QgdW5zaWduZWQgaW50IGN4ODhfaWRjb3VudCA9IEFSUkFZX1NJWkUoY3g4OF9zdWJpZHMpOwpAQCAtMTYzMyw3ICsxNjQ2LDE1IEBACiAJLyogTWFrZSBzdXJlIHdlIHN1cHBvcnQgdGhlIGJvYXJkIG1vZGVsICovCiAJc3dpdGNoICh0di5tb2RlbCkKIAl7CisJY2FzZSAxNDAwOTogLyogV2luVFYtSFZSMzAwMCAoUmV0YWlsLCBJUiwgYi9wYW5lbCB2aWRlbywgMy41bW0gYXVkaW8gaW4pICovCisJY2FzZSAxNDAxOTogLyogV2luVFYtSFZSMzAwMCAoUmV0YWlsLCBJUiBCbGFzdGVyLCBiL3BhbmVsIHZpZGVvLCAzLjVtbSBhdWRpbyBpbikgKi8KKwljYXNlIDE0MDI5OiAvKiBXaW5UVi1IVlIzMDAwIChSZXRhaWwsIElSLCBiL3BhbmVsIHZpZGVvLCAzLjVtbSBhdWRpbyBpbiAtIDg4MCBicmlkZ2UpICovCisJY2FzZSAxNDEwOTogLyogV2luVFYtSFZSMzAwMCAoUmV0YWlsLCBJUiwgYi9wYW5lbCB2aWRlbywgMy41bW0gYXVkaW8gaW4gLSBsb3cgcHJvZmlsZSkgKi8KKwljYXNlIDE0MTI5OiAvKiBXaW5UVi1IVlIzMDAwIChSZXRhaWwsIElSLCBiL3BhbmVsIHZpZGVvLCAzLjVtbSBhdWRpbyBpbiAtIDg4MCBicmlkZ2UgLSBMUCkgKi8KKwljYXNlIDE0NTU5OiAvKiBXaW5UVi1IVlIzMDAwIChPRU0sIG5vIElSLCBiL3BhbmVsIHZpZGVvLCAzLjVtbSBhdWRpbyBpbikgKi8KIAljYXNlIDE0NTY5OiAvKiBXaW5UVi1IVlIzMDAwIChPRU0sIG5vIElSLCBubyBiYWNrIHBhbmVsIHZpZGVvKSAqLworCWNhc2UgMTQ2NTk6IC8qIFdpblRWLUhWUjMwMDAgKE9FTSwgbm8gSVIsIGIvcGFuZWwgdmlkZW8sIFJDQSBhdWRpbyBpbiAtIExvdyBwcm9maWxlKSAqLworCWNhc2UgMTQ2Njk6IC8qIFdpblRWLUhWUjMwMDAgKE9FTSwgbm8gSVIsIG5vIGIvcGFuZWwgdmlkZW8gLSBMb3cgcHJvZmlsZSkgKi8KIAljYXNlIDI4NTUyOiAvKiBXaW5UVi1QVlIgJ1Jvc2x5bicgKE5vIElSKSAqLwogCWNhc2UgMzQ1MTk6IC8qIFdpblRWLVBDSS1GTSAqLwogCWNhc2UgOTAwMDI6IC8qIE5vdmEtVC1QQ0kgKDkwMDIpICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4ODgvY3g4OC1kdmIuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3g4OC9jeDg4LWR2Yi5jCmluZGV4IGJkMGM4NzkuLjBlZjEzZTcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3g4OC9jeDg4LWR2Yi5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3g4OC9jeDg4LWR2Yi5jCkBAIC0zMTUsMTUgKzMxNSwyMiBAQAogCS5kZW1vZF9hZGRyZXNzID0gMHg0MywKIAkub3V0cHV0X21vZGUgICA9IENYMjI3MDJfU0VSSUFMX09VVFBVVCwKIH07CisKIHN0YXRpYyBzdHJ1Y3QgY3gyMjcwMl9jb25maWcgaGF1cHBhdWdlX2h2cjExMDBfY29uZmlnID0gewogCS5kZW1vZF9hZGRyZXNzID0gMHg2MywKIAkub3V0cHV0X21vZGUgICA9IENYMjI3MDJfU0VSSUFMX09VVFBVVCwKIH07CisKIHN0YXRpYyBzdHJ1Y3QgY3gyMjcwMl9jb25maWcgaGF1cHBhdWdlX2h2cjEzMDBfY29uZmlnID0gewogCS5kZW1vZF9hZGRyZXNzID0gMHg2MywKIAkub3V0cHV0X21vZGUgICA9IENYMjI3MDJfU0VSSUFMX09VVFBVVCwKIH07CiAKK3N0YXRpYyBzdHJ1Y3QgY3gyMjcwMl9jb25maWcgaGF1cHBhdWdlX2h2cjMwMDBfY29uZmlnID0geworCS5kZW1vZF9hZGRyZXNzID0gMHg2MywKKwkub3V0cHV0X21vZGUgPSBDWDIyNzAyX1NFUklBTF9PVVRQVVQsCit9OworCiBzdGF0aWMgaW50IG9yNTExMzJfc2V0X3RzX3BhcmFtKHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlLAogCQkJCWludCBpc19wdW5jdHVyZWQpCiB7CkBAIC01NTgsNiArNTY1LDE2IEBACiAJCQkJICAgJmR2Yl9wbGxfZm1kMTIxNm1lKTsKIAkJfQogCQlicmVhazsKKwljYXNlIENYODhfQk9BUkRfSEFVUFBBVUdFX0hWUjMwMDA6CisJCWRldi0+ZHZiLmZyb250ZW5kID0gZHZiX2F0dGFjaChjeDIyNzAyX2F0dGFjaCwKKwkJCQkJICAgICAgICZoYXVwcGF1Z2VfaHZyMzAwMF9jb25maWcsCisJCQkJCSAgICAgICAmZGV2LT5jb3JlLT5pMmNfYWRhcCk7CisJCWlmIChkZXYtPmR2Yi5mcm9udGVuZCAhPSBOVUxMKSB7CisJCQlkdmJfYXR0YWNoKGR2Yl9wbGxfYXR0YWNoLCBkZXYtPmR2Yi5mcm9udGVuZCwgMHg2MSwKKwkJCQkgICAmZGV2LT5jb3JlLT5pMmNfYWRhcCwKKwkJCQkgICAmZHZiX3BsbF9mbWQxMjE2bWUpOworCQl9CisJCWJyZWFrOwogCWNhc2UgQ1g4OF9CT0FSRF9EVklDT19GVVNJT05IRFRWX0RWQl9UX1BMVVM6CiAJCWRldi0+ZHZiLmZyb250ZW5kID0gZHZiX2F0dGFjaChtdDM1Ml9hdHRhY2gsCiAJCQkJCSAgICAgICAmZHZpY29fZnVzaW9uaGR0diwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3g4OC9jeDg4LWlucHV0LmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4ODgvY3g4OC1pbnB1dC5jCmluZGV4IDgzZWJmN2EuLjU3ZTFjMDIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3g4OC9jeDg4LWlucHV0LmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9jeDg4L2N4ODgtaW5wdXQuYwpAQCAtMTk2LDE4ICsxOTYsMjUgQEAKIAljYXNlIENYODhfQk9BUkRfSEFVUFBBVUdFX05PVkFTUExVU19TMToKIAljYXNlIENYODhfQk9BUkRfSEFVUFBBVUdFX0hWUjExMDA6CiAJY2FzZSBDWDg4X0JPQVJEX0hBVVBQQVVHRV9IVlIxMzAwOgorCWNhc2UgQ1g4OF9CT0FSRF9IQVVQUEFVR0VfSFZSMzAwMDoKIAkJaXJfY29kZXMgPSBpcl9jb2Rlc19oYXVwcGF1Z2VfbmV3OwogCQlpcl90eXBlID0gSVJfVFlQRV9SQzU7CiAJCWlyLT5zYW1wbGluZyA9IDE7CiAJCWJyZWFrOwogCWNhc2UgQ1g4OF9CT0FSRF9XSU5GQVNUX0RUVjIwMDBIOgotCWNhc2UgQ1g4OF9CT0FSRF9XSU5GQVNUMjAwMFhQX0VYUEVSVDoKIAkJaXJfY29kZXMgPSBpcl9jb2Rlc193aW5mYXN0OwogCQlpci0+Z3Bpb19hZGRyID0gTU9fR1AwX0lPOwogCQlpci0+bWFza19rZXljb2RlID0gMHg4Zjg7CiAJCWlyLT5tYXNrX2tleXVwID0gMHgxMDA7CiAJCWlyLT5wb2xsaW5nID0gNTA7IC8qIG1zICovCiAJCWJyZWFrOworCWNhc2UgQ1g4OF9CT0FSRF9XSU5GQVNUMjAwMFhQX0VYUEVSVDoKKwkJaXJfY29kZXMgPSBpcl9jb2Rlc193aW5mYXN0OworCQlpci0+Z3Bpb19hZGRyID0gTU9fR1AwX0lPOworCQlpci0+bWFza19rZXljb2RlID0gMHg4Zjg7CisJCWlyLT5tYXNrX2tleXVwID0gMHgxMDA7CisJCWlyLT5wb2xsaW5nID0gMTsgLyogbXMgKi8KKwkJYnJlYWs7CiAJY2FzZSBDWDg4X0JPQVJEX0lPREFUQV9HVkJDVFY3RToKIAkJaXJfY29kZXMgPSBpcl9jb2Rlc19pb2RhdGFfYmN0djdlOwogCQlpci0+Z3Bpb19hZGRyID0gTU9fR1AwX0lPOwpAQCAtMjE1LDcgKzIyMiw3IEBACiAJCWlyLT5tYXNrX2tleWRvd24gPSAweDAyOwogCQlpci0+cG9sbGluZyA9IDU7IC8qIG1zICovCiAJCWJyZWFrOwotICAgICAgIGNhc2UgQ1g4OF9CT0FSRF9QUk9MSU5LX1BMQVlUVlBWUjoKKwljYXNlIENYODhfQk9BUkRfUFJPTElOS19QTEFZVFZQVlI6CiAJY2FzZSBDWDg4X0JPQVJEX1BJWEVMVklFV19QTEFZVFZfVUxUUkFfUFJPOgogCQlpcl9jb2RlcyA9IGlyX2NvZGVzX3BpeGVsdmlldzsKIAkJaXItPmdwaW9fYWRkciA9IE1PX0dQMV9JTzsKQEAgLTQxOSw2ICs0MjYsNyBAQAogCWNhc2UgQ1g4OF9CT0FSRF9IQVVQUEFVR0VfTk9WQVNQTFVTX1MxOgogCWNhc2UgQ1g4OF9CT0FSRF9IQVVQUEFVR0VfSFZSMTEwMDoKIAljYXNlIENYODhfQk9BUkRfSEFVUFBBVUdFX0hWUjEzMDA6CisJY2FzZSBDWDg4X0JPQVJEX0hBVVBQQVVHRV9IVlIzMDAwOgogCQlpcmNvZGUgPSBpcl9kZWNvZGVfYmlwaGFzZShpci0+c2FtcGxlcywgaXItPnNjb3VudCwgNSwgNyk7CiAJCWlyX2RwcmludGsoImJpcGhhc2UgZGVjb2RlZDogJXhcbiIsIGlyY29kZSk7CiAJCWlmICgoaXJjb2RlICYgMHhmZmZmZjAwMCkgIT0gMHgzMDAwKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9ldDYxeDI1MS9ldDYxeDI1MV9jb3JlLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2V0NjF4MjUxL2V0NjF4MjUxX2NvcmUuYwppbmRleCBiYzU0NGNjLi5mNzg2YWIxIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2V0NjF4MjUxL2V0NjF4MjUxX2NvcmUuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2V0NjF4MjUxL2V0NjF4MjUxX2NvcmUuYwpAQCAtOTczLDE2ICs5NzMsMzIgQEAKIAkJCSBldDYxeDI1MV9zaG93X2kyY192YWwsIGV0NjF4MjUxX3N0b3JlX2kyY192YWwpOwogCiAKLXN0YXRpYyB2b2lkIGV0NjF4MjUxX2NyZWF0ZV9zeXNmcyhzdHJ1Y3QgZXQ2MXgyNTFfZGV2aWNlKiBjYW0pCitzdGF0aWMgaW50IGV0NjF4MjUxX2NyZWF0ZV9zeXNmcyhzdHJ1Y3QgZXQ2MXgyNTFfZGV2aWNlKiBjYW0pCiB7CiAJc3RydWN0IHZpZGVvX2RldmljZSAqdjRsZGV2ID0gY2FtLT52NGxkZXY7CisJaW50IHJjOwogCi0JdmlkZW9fZGV2aWNlX2NyZWF0ZV9maWxlKHY0bGRldiwgJmNsYXNzX2RldmljZV9hdHRyX3JlZyk7Ci0JdmlkZW9fZGV2aWNlX2NyZWF0ZV9maWxlKHY0bGRldiwgJmNsYXNzX2RldmljZV9hdHRyX3ZhbCk7CisJcmMgPSB2aWRlb19kZXZpY2VfY3JlYXRlX2ZpbGUodjRsZGV2LCAmY2xhc3NfZGV2aWNlX2F0dHJfcmVnKTsKKwlpZiAocmMpIGdvdG8gZXJyOworCXJjID0gdmlkZW9fZGV2aWNlX2NyZWF0ZV9maWxlKHY0bGRldiwgJmNsYXNzX2RldmljZV9hdHRyX3ZhbCk7CisJaWYgKHJjKSBnb3RvIGVycl9yZWc7CiAJaWYgKGNhbS0+c2Vuc29yLnN5c2ZzX29wcykgewotCQl2aWRlb19kZXZpY2VfY3JlYXRlX2ZpbGUodjRsZGV2LCAmY2xhc3NfZGV2aWNlX2F0dHJfaTJjX3JlZyk7Ci0JCXZpZGVvX2RldmljZV9jcmVhdGVfZmlsZSh2NGxkZXYsICZjbGFzc19kZXZpY2VfYXR0cl9pMmNfdmFsKTsKKwkJcmMgPSB2aWRlb19kZXZpY2VfY3JlYXRlX2ZpbGUodjRsZGV2LCAmY2xhc3NfZGV2aWNlX2F0dHJfaTJjX3JlZyk7CisJCWlmIChyYykgZ290byBlcnJfdmFsOworCQlyYyA9IHZpZGVvX2RldmljZV9jcmVhdGVfZmlsZSh2NGxkZXYsICZjbGFzc19kZXZpY2VfYXR0cl9pMmNfdmFsKTsKKwkJaWYgKHJjKSBnb3RvIGVycl9pMmNfcmVnOwogCX0KKworCXJldHVybiAwOworCitlcnJfaTJjX3JlZzoKKwl2aWRlb19kZXZpY2VfcmVtb3ZlX2ZpbGUodjRsZGV2LCAmY2xhc3NfZGV2aWNlX2F0dHJfaTJjX3JlZyk7CitlcnJfdmFsOgorCXZpZGVvX2RldmljZV9yZW1vdmVfZmlsZSh2NGxkZXYsICZjbGFzc19kZXZpY2VfYXR0cl92YWwpOworZXJyX3JlZzoKKwl2aWRlb19kZXZpY2VfcmVtb3ZlX2ZpbGUodjRsZGV2LCAmY2xhc3NfZGV2aWNlX2F0dHJfcmVnKTsKK2VycjoKKwlyZXR1cm4gcmM7CiB9CiAjZW5kaWYgLyogQ09ORklHX1ZJREVPX0FEVl9ERUJVRyAqLwogCkBAIC0yNTM0LDcgKzI1NTAsOSBAQAogCWRldl9uciA9IChkZXZfbnIgPCBFVDYxWDI1MV9NQVhfREVWSUNFUy0xKSA/IGRldl9ucisxIDogMDsKIAogI2lmZGVmIENPTkZJR19WSURFT19BRFZfREVCVUcKLQlldDYxeDI1MV9jcmVhdGVfc3lzZnMoY2FtKTsKKwllcnIgPSBldDYxeDI1MV9jcmVhdGVfc3lzZnMoY2FtKTsKKwlpZiAoZXJyKQorCQlnb3RvIGZhaWwyOwogCURCRygyLCAiT3B0aW9uYWwgZGV2aWNlIGNvbnRyb2wgdGhyb3VnaCAnc3lzZnMnIGludGVyZmFjZSByZWFkeSIpOwogI2VuZGlmCiAKQEAgLTI1NDQsNiArMjU2MiwxMyBAQAogCiAJcmV0dXJuIDA7CiAKKyNpZmRlZiBDT05GSUdfVklERU9fQURWX0RFQlVHCitmYWlsMjoKKwl2aWRlb19ucltkZXZfbnJdID0gLTE7CisJZGV2X25yID0gKGRldl9uciA8IEVUNjFYMjUxX01BWF9ERVZJQ0VTLTEpID8gZGV2X25yKzEgOiAwOworCW11dGV4X3VubG9jaygmY2FtLT5kZXZfbXV0ZXgpOworCXZpZGVvX3VucmVnaXN0ZXJfZGV2aWNlKGNhbS0+djRsZGV2KTsKKyNlbmRpZgogZmFpbDoKIAlpZiAoY2FtKSB7CiAJCWtmcmVlKGNhbS0+Y29udHJvbF9idWZmZXIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9vdjUxMS5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9vdjUxMS5jCmluZGV4IGNlNDg4NmYuLmI0ZGIyY2IgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vb3Y1MTEuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL292NTExLmMKQEAgLTU2NDgsMTcgKzU2NDgsNDkgQEAKIH0KIHN0YXRpYyBDTEFTU19ERVZJQ0VfQVRUUihleHBvc3VyZSwgU19JUlVHTywgc2hvd19leHBvc3VyZSwgTlVMTCk7CiAKLXN0YXRpYyB2b2lkIG92X2NyZWF0ZV9zeXNmcyhzdHJ1Y3QgdmlkZW9fZGV2aWNlICp2ZGV2KQorc3RhdGljIGludCBvdl9jcmVhdGVfc3lzZnMoc3RydWN0IHZpZGVvX2RldmljZSAqdmRldikKIHsKLQl2aWRlb19kZXZpY2VfY3JlYXRlX2ZpbGUodmRldiwgJmNsYXNzX2RldmljZV9hdHRyX2N1c3RvbV9pZCk7Ci0JdmlkZW9fZGV2aWNlX2NyZWF0ZV9maWxlKHZkZXYsICZjbGFzc19kZXZpY2VfYXR0cl9tb2RlbCk7Ci0JdmlkZW9fZGV2aWNlX2NyZWF0ZV9maWxlKHZkZXYsICZjbGFzc19kZXZpY2VfYXR0cl9icmlkZ2UpOwotCXZpZGVvX2RldmljZV9jcmVhdGVfZmlsZSh2ZGV2LCAmY2xhc3NfZGV2aWNlX2F0dHJfc2Vuc29yKTsKLQl2aWRlb19kZXZpY2VfY3JlYXRlX2ZpbGUodmRldiwgJmNsYXNzX2RldmljZV9hdHRyX2JyaWdodG5lc3MpOwotCXZpZGVvX2RldmljZV9jcmVhdGVfZmlsZSh2ZGV2LCAmY2xhc3NfZGV2aWNlX2F0dHJfc2F0dXJhdGlvbik7Ci0JdmlkZW9fZGV2aWNlX2NyZWF0ZV9maWxlKHZkZXYsICZjbGFzc19kZXZpY2VfYXR0cl9jb250cmFzdCk7Ci0JdmlkZW9fZGV2aWNlX2NyZWF0ZV9maWxlKHZkZXYsICZjbGFzc19kZXZpY2VfYXR0cl9odWUpOwotCXZpZGVvX2RldmljZV9jcmVhdGVfZmlsZSh2ZGV2LCAmY2xhc3NfZGV2aWNlX2F0dHJfZXhwb3N1cmUpOworCWludCByYzsKKworCXJjID0gdmlkZW9fZGV2aWNlX2NyZWF0ZV9maWxlKHZkZXYsICZjbGFzc19kZXZpY2VfYXR0cl9jdXN0b21faWQpOworCWlmIChyYykgZ290byBlcnI7CisJcmMgPSB2aWRlb19kZXZpY2VfY3JlYXRlX2ZpbGUodmRldiwgJmNsYXNzX2RldmljZV9hdHRyX21vZGVsKTsKKwlpZiAocmMpIGdvdG8gZXJyX2lkOworCXJjID0gdmlkZW9fZGV2aWNlX2NyZWF0ZV9maWxlKHZkZXYsICZjbGFzc19kZXZpY2VfYXR0cl9icmlkZ2UpOworCWlmIChyYykgZ290byBlcnJfbW9kZWw7CisJcmMgPSB2aWRlb19kZXZpY2VfY3JlYXRlX2ZpbGUodmRldiwgJmNsYXNzX2RldmljZV9hdHRyX3NlbnNvcik7CisJaWYgKHJjKSBnb3RvIGVycl9icmlkZ2U7CisJcmMgPSB2aWRlb19kZXZpY2VfY3JlYXRlX2ZpbGUodmRldiwgJmNsYXNzX2RldmljZV9hdHRyX2JyaWdodG5lc3MpOworCWlmIChyYykgZ290byBlcnJfc2Vuc29yOworCXJjID0gdmlkZW9fZGV2aWNlX2NyZWF0ZV9maWxlKHZkZXYsICZjbGFzc19kZXZpY2VfYXR0cl9zYXR1cmF0aW9uKTsKKwlpZiAocmMpIGdvdG8gZXJyX2JyaWdodDsKKwlyYyA9IHZpZGVvX2RldmljZV9jcmVhdGVfZmlsZSh2ZGV2LCAmY2xhc3NfZGV2aWNlX2F0dHJfY29udHJhc3QpOworCWlmIChyYykgZ290byBlcnJfc2F0OworCXJjID0gdmlkZW9fZGV2aWNlX2NyZWF0ZV9maWxlKHZkZXYsICZjbGFzc19kZXZpY2VfYXR0cl9odWUpOworCWlmIChyYykgZ290byBlcnJfY29udHJhc3Q7CisJcmMgPSB2aWRlb19kZXZpY2VfY3JlYXRlX2ZpbGUodmRldiwgJmNsYXNzX2RldmljZV9hdHRyX2V4cG9zdXJlKTsKKwlpZiAocmMpIGdvdG8gZXJyX2h1ZTsKKworCXJldHVybiAwOworCitlcnJfaHVlOgorCXZpZGVvX2RldmljZV9yZW1vdmVfZmlsZSh2ZGV2LCAmY2xhc3NfZGV2aWNlX2F0dHJfaHVlKTsKK2Vycl9jb250cmFzdDoKKwl2aWRlb19kZXZpY2VfcmVtb3ZlX2ZpbGUodmRldiwgJmNsYXNzX2RldmljZV9hdHRyX2NvbnRyYXN0KTsKK2Vycl9zYXQ6CisJdmlkZW9fZGV2aWNlX3JlbW92ZV9maWxlKHZkZXYsICZjbGFzc19kZXZpY2VfYXR0cl9zYXR1cmF0aW9uKTsKK2Vycl9icmlnaHQ6CisJdmlkZW9fZGV2aWNlX3JlbW92ZV9maWxlKHZkZXYsICZjbGFzc19kZXZpY2VfYXR0cl9icmlnaHRuZXNzKTsKK2Vycl9zZW5zb3I6CisJdmlkZW9fZGV2aWNlX3JlbW92ZV9maWxlKHZkZXYsICZjbGFzc19kZXZpY2VfYXR0cl9zZW5zb3IpOworZXJyX2JyaWRnZToKKwl2aWRlb19kZXZpY2VfcmVtb3ZlX2ZpbGUodmRldiwgJmNsYXNzX2RldmljZV9hdHRyX2JyaWRnZSk7CitlcnJfbW9kZWw6CisJdmlkZW9fZGV2aWNlX3JlbW92ZV9maWxlKHZkZXYsICZjbGFzc19kZXZpY2VfYXR0cl9tb2RlbCk7CitlcnJfaWQ6CisJdmlkZW9fZGV2aWNlX3JlbW92ZV9maWxlKHZkZXYsICZjbGFzc19kZXZpY2VfYXR0cl9jdXN0b21faWQpOworZXJyOgorCXJldHVybiByYzsKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKQEAgLTU4MTcsNyArNTg0OSwxMSBAQAogCSAgICAgb3YtPnZkZXYtPm1pbm9yKTsKIAogCXVzYl9zZXRfaW50ZmRhdGEoaW50Ziwgb3YpOwotCW92X2NyZWF0ZV9zeXNmcyhvdi0+dmRldik7CisJaWYgKG92X2NyZWF0ZV9zeXNmcyhvdi0+dmRldikpIHsKKwkJZXJyKCJvdl9jcmVhdGVfc3lzZnMgZmFpbGVkIik7CisJCWdvdG8gZXJyb3I7CisJfQorCiAJcmV0dXJuIDA7CiAKIGVycm9yOgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9wdnJ1c2IyL3B2cnVzYjItY3gyNTg0eC12NGwuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vcHZydXNiMi9wdnJ1c2IyLWN4MjU4NHgtdjRsLmMKaW5kZXggZGY4ZmVhYy4uYzgwYzI2YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9wdnJ1c2IyL3B2cnVzYjItY3gyNTg0eC12NGwuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3B2cnVzYjIvcHZydXNiMi1jeDI1ODR4LXY0bC5jCkBAIC0yMjEsNyArMjIxLDcgQEAKIHN0YXRpYyB2b2lkIGRlY29kZXJfcmVzZXQoc3RydWN0IHB2cjJfdjRsX2N4MjU4NHggKmN0eHQpCiB7CiAJaW50IHJldDsKLQlyZXQgPSBwdnIyX2kyY19jbGllbnRfY21kKGN0eHQtPmNsaWVudCxWSURJT0NfSU5UX1JFU0VULDApOworCXJldCA9IHB2cjJfaTJjX2NsaWVudF9jbWQoY3R4dC0+Y2xpZW50LFZJRElPQ19JTlRfUkVTRVQsTlVMTCk7CiAJcHZyMl90cmFjZShQVlIyX1RSQUNFX0NISVBTLCJpMmMgY3gyNTg0MCBkZWNvZGVyX3Jlc2V0IChyZXQ9JWQpIixyZXQpOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3B2cnVzYjIvcHZydXNiMi12NGwyLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3B2cnVzYjIvcHZydXNiMi12NGwyLmMKaW5kZXggOTdlOTc0ZC4uYmI0MGU5MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9wdnJ1c2IyL3B2cnVzYjItdjRsMi5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vcHZydXNiMi9wdnJ1c2IyLXY0bDIuYwpAQCAtNzExLDggKzcxMSw4IEBACiAJICAgICAgIGRpcC0+ZGV2YmFzZS5taW5vcixwdnIyX2NvbmZpZ19nZXRfbmFtZShkaXAtPmNvbmZpZykpOwogCiAJLyogUGFyYW5vaWEgKi8KLQlkaXAtPnY0bHAgPSAwOwotCWRpcC0+c3RyZWFtID0gMDsKKwlkaXAtPnY0bHAgPSBOVUxMOworCWRpcC0+c3RyZWFtID0gTlVMTDsKIAogCS8qIEFjdHVhbCBkZWFsbG9jYXRpb24gaGFwcGVucyBsYXRlciB3aGVuIGFsbCBpbnRlcm5hbCByZWZlcmVuY2VzCiAJICAgYXJlIGdvbmUuICovCkBAIC0xMDc2LDcgKzEwNzYsNyBAQAogCXZwLT52ZGV2ID0ga21hbGxvYyhzaXplb2YoKnZwLT52ZGV2KSxHRlBfS0VSTkVMKTsKIAlpZiAoIXZwLT52ZGV2KSB7CiAJCWtmcmVlKHZwKTsKLQkJcmV0dXJuIDA7CisJCXJldHVybiBOVUxMOwogCX0KIAltZW1zZXQodnAtPnZkZXYsMCxzaXplb2YoKnZwLT52ZGV2KSk7CiAJcHZyMl9jaGFubmVsX2luaXQoJnZwLT5jaGFubmVsLG1ucCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3B3Yy9wd2MtaWYuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vcHdjL3B3Yy1pZi5jCmluZGV4IGM3N2I4NWMuLjQ2YzExNDggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vcHdjL3B3Yy1pZi5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vcHdjL3B3Yy1pZi5jCkBAIC0xMDI0LDEyICsxMDI0LDI1IEBACiBzdGF0aWMgQ0xBU1NfREVWSUNFX0FUVFIoYnV0dG9uLCBTX0lSVUdPIHwgU19JV1VTUiwgc2hvd19zbmFwc2hvdF9idXR0b25fc3RhdHVzLAogCQkJIE5VTEwpOwogCi1zdGF0aWMgdm9pZCBwd2NfY3JlYXRlX3N5c2ZzX2ZpbGVzKHN0cnVjdCB2aWRlb19kZXZpY2UgKnZkZXYpCitzdGF0aWMgaW50IHB3Y19jcmVhdGVfc3lzZnNfZmlsZXMoc3RydWN0IHZpZGVvX2RldmljZSAqdmRldikKIHsKIAlzdHJ1Y3QgcHdjX2RldmljZSAqcGRldiA9IHZpZGVvX2dldF9kcnZkYXRhKHZkZXYpOwotCWlmIChwZGV2LT5mZWF0dXJlcyAmIEZFQVRVUkVfTU9UT1JfUEFOVElMVCkKLQkJdmlkZW9fZGV2aWNlX2NyZWF0ZV9maWxlKHZkZXYsICZjbGFzc19kZXZpY2VfYXR0cl9wYW5fdGlsdCk7Ci0JdmlkZW9fZGV2aWNlX2NyZWF0ZV9maWxlKHZkZXYsICZjbGFzc19kZXZpY2VfYXR0cl9idXR0b24pOworCWludCByYzsKKworCXJjID0gdmlkZW9fZGV2aWNlX2NyZWF0ZV9maWxlKHZkZXYsICZjbGFzc19kZXZpY2VfYXR0cl9idXR0b24pOworCWlmIChyYykKKwkJZ290byBlcnI7CisJaWYgKHBkZXYtPmZlYXR1cmVzICYgRkVBVFVSRV9NT1RPUl9QQU5USUxUKSB7CisJCXJjID0gdmlkZW9fZGV2aWNlX2NyZWF0ZV9maWxlKHZkZXYsJmNsYXNzX2RldmljZV9hdHRyX3Bhbl90aWx0KTsKKwkJaWYgKHJjKSBnb3RvIGVycl9idXR0b247CisJfQorCisJcmV0dXJuIDA7CisKK2Vycl9idXR0b246CisJdmlkZW9fZGV2aWNlX3JlbW92ZV9maWxlKHZkZXYsICZjbGFzc19kZXZpY2VfYXR0cl9idXR0b24pOworZXJyOgorCXJldHVybiByYzsKIH0KIAogc3RhdGljIHZvaWQgcHdjX3JlbW92ZV9zeXNmc19maWxlcyhzdHJ1Y3QgdmlkZW9fZGV2aWNlICp2ZGV2KQpAQCAtMTQwOCw3ICsxNDIxLDcgQEAKIAlzdHJ1Y3QgdXNiX2RldmljZSAqdWRldiA9IGludGVyZmFjZV90b191c2JkZXYoaW50Zik7CiAJc3RydWN0IHB3Y19kZXZpY2UgKnBkZXYgPSBOVUxMOwogCWludCB2ZW5kb3JfaWQsIHByb2R1Y3RfaWQsIHR5cGVfaWQ7Ci0JaW50IGksIGhpbnQ7CisJaW50IGksIGhpbnQsIHJjOwogCWludCBmZWF0dXJlcyA9IDA7CiAJaW50IHZpZGVvX25yID0gLTE7IC8qIGRlZmF1bHQ6IHVzZSBuZXh0IGF2YWlsYWJsZSBkZXZpY2UgKi8KIAljaGFyIHNlcmlhbF9udW1iZXJbMzBdLCAqbmFtZTsKQEAgLTE3MDksOSArMTcyMiw4IEBACiAJaSA9IHZpZGVvX3JlZ2lzdGVyX2RldmljZShwZGV2LT52ZGV2LCBWRkxfVFlQRV9HUkFCQkVSLCB2aWRlb19ucik7CiAJaWYgKGkgPCAwKSB7CiAJCVBXQ19FUlJPUigiRmFpbGVkIHRvIHJlZ2lzdGVyIGFzIHZpZGVvIGRldmljZSAoJWQpLlxuIiwgaSk7Ci0JCXZpZGVvX2RldmljZV9yZWxlYXNlKHBkZXYtPnZkZXYpOyAvKiBEcmlwLi4uIGRyaXAuLi4gZHJpcC4uLiAqLwotCQlrZnJlZShwZGV2KTsgLyogT29wcywgbm8gbWVtb3J5IGxlYWtzIHBsZWFzZSAqLwotCQlyZXR1cm4gLUVJTzsKKwkJcmMgPSBpOworCQlnb3RvIGVycjsKIAl9CiAJZWxzZSB7CiAJCVBXQ19JTkZPKCJSZWdpc3RlcmVkIGFzIC9kZXYvdmlkZW8lZC5cbiIsIHBkZXYtPnZkZXYtPm1pbm9yICYgMHgzRik7CkBAIC0xNzIzLDEzICsxNzM1LDI0IEBACiAKIAlQV0NfREVCVUdfUFJPQkUoInByb2JlKCkgZnVuY3Rpb24gcmV0dXJuaW5nIHN0cnVjdCBhdCAweCVwLlxuIiwgcGRldik7CiAJdXNiX3NldF9pbnRmZGF0YSAoaW50ZiwgcGRldik7Ci0JcHdjX2NyZWF0ZV9zeXNmc19maWxlcyhwZGV2LT52ZGV2KTsKKwlyYyA9IHB3Y19jcmVhdGVfc3lzZnNfZmlsZXMocGRldi0+dmRldik7CisJaWYgKHJjKQorCQlnb3RvIGVycl91bnJlZzsKIAogCS8qIFNldCB0aGUgbGVkcyBvZmYgKi8KIAlwd2Nfc2V0X2xlZHMocGRldiwgMCwgMCk7CiAJcHdjX2NhbWVyYV9wb3dlcihwZGV2LCAwKTsKIAogCXJldHVybiAwOworCitlcnJfdW5yZWc6CisJaWYgKGhpbnQgPCBNQVhfREVWX0hJTlRTKQorCQlkZXZpY2VfaGludFtoaW50XS5wZGV2ID0gTlVMTDsKKwl2aWRlb191bnJlZ2lzdGVyX2RldmljZShwZGV2LT52ZGV2KTsKK2VycjoKKwl2aWRlb19kZXZpY2VfcmVsZWFzZShwZGV2LT52ZGV2KTsgLyogRHJpcC4uLiBkcmlwLi4uIGRyaXAuLi4gKi8KKwlrZnJlZShwZGV2KTsgLyogT29wcywgbm8gbWVtb3J5IGxlYWtzIHBsZWFzZSAqLworCXJldHVybiByYzsKIH0KIAogLyogVGhlIHVzZXIgamFua2VkIG91dCB0aGUgY2FibGUuLi4gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vc2FhNzExNS5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9zYWE3MTE1LmMKaW5kZXggOTc0MTc5ZC4uYzU3MTlmNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9zYWE3MTE1LmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9zYWE3MTE1LmMKQEAgLTk2MCw2ICs5NjAsOCBAQAogCQkJcmVnIHw9IDB4MTA7CiAJCX0gZWxzZSBpZiAoc3RkID09IFY0TDJfU1REX05UU0NfTV9KUCkgewogCQkJcmVnIHw9IDB4NDA7CisJCX0gZWxzZSBpZiAoc3RkID09IFY0TDJfU1REX1NFQ0FNKSB7CisJCQlyZWcgfD0gMHg1MDsKIAkJfQogCQlzYWE3MTF4X3dyaXRlKGNsaWVudCwgUl8wRV9DSFJPTUFfQ05UTF8xLCByZWcpOwogCX0gZWxzZSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3NhYTcxMzQvc2FhNzEzNC1jYXJkcy5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9zYWE3MTM0L3NhYTcxMzQtY2FyZHMuYwppbmRleCBjOWQ4ZTNiLi41MWYwY2ZkIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3NhYTcxMzQvc2FhNzEzNC1jYXJkcy5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vc2FhNzEzNC9zYWE3MTM0LWNhcmRzLmMKQEAgLTI5NjksNyArMjk2OSw3IEBACiAJCS8qIFBldHIgQmF1ZGlzIDxwYXNreUB1Y3cuY3o+ICovCiAJCS5uYW1lICAgICAgICAgICA9ICJBVmVyTWVkaWEgVFYgSHlicmlkIEExNkFSIiwKIAkJLmF1ZGlvX2Nsb2NrICAgID0gMHgxODdkZTcsCi0JCS50dW5lcl90eXBlICAgICA9IFRVTkVSX1BISUxJUFNfVERBODI5MCwgLyogdW50ZXN0ZWQgKi8KKwkJLnR1bmVyX3R5cGUgICAgID0gVFVORVJfUEhJTElQU19URDEzMTYsIC8qIHVudGVzdGVkICovCiAJCS5yYWRpb190eXBlICAgICA9IFRVTkVSX1RFQTU3NjcsIC8qIHVudGVzdGVkICovCiAJCS50dW5lcl9hZGRyICAgICA9IEFERFJfVU5TRVQsCiAJCS5yYWRpb19hZGRyICAgICA9IEFERFJfVU5TRVQsCkBAIC0zNzE4LDYgKzM3MTgsNyBAQAogCWNhc2UgU0FBNzEzNF9CT0FSRF9BVkVSTUVESUFfU1RVRElPXzMwNzoKIAljYXNlIFNBQTcxMzRfQk9BUkRfQVZFUk1FRElBXzMwNzoKIAljYXNlIFNBQTcxMzRfQk9BUkRfQVZFUk1FRElBX0dPXzAwN19GTToKKwljYXNlIFNBQTcxMzRfQk9BUkRfQVZFUk1FRElBXzc3NzoKIC8qICAgICAgY2FzZSBTQUE3MTM0X0JPQVJEX1NBQlJFTlRfU0JUVFZGTTogICovIC8qIG5vdCBmaW5pc2hlZCB5ZXQgKi8KIAljYXNlIFNBQTcxMzRfQk9BUkRfVklERU9NQVRFX1RWX1BWUjoKIAljYXNlIFNBQTcxMzRfQk9BUkRfVklERU9NQVRFX0dPTERfUExVUzoKQEAgLTM3MzQsNiArMzczNSw3IEBACiAJY2FzZSBTQUE3MTM0X0JPQVJEX0ZMWURWQlRfTFIzMDE6CiAJY2FzZSBTQUE3MTM0X0JPQVJEX0ZMWURWQlREVU86CiAJY2FzZSBTQUE3MTM0X0JPQVJEX1BST1RFVVNfMjMwOToKKwljYXNlIFNBQTcxMzRfQk9BUkRfQVZFUk1FRElBX0ExNkFSOgogCQlkZXYtPmhhc19yZW1vdGUgPSBTQUE3MTM0X1JFTU9URV9HUElPOwogCQlicmVhazsKIAljYXNlIFNBQTcxMzRfQk9BUkRfRkxZRFZCU19MUjMwMDoKQEAgLTM3NzIsNyArMzc3NCw2IEBACiAJCXNhYV93cml0ZWIoU0FBNzEzNF9HUElPX0dQTU9ERTMsIDB4MDgpOwogCQlzYWFfd3JpdGViKFNBQTcxMzRfR1BJT19HUFNUQVRVUzMsIDB4MDApOwogCQlicmVhazsKLQljYXNlIFNBQTcxMzRfQk9BUkRfQVZFUk1FRElBX0ExNkFSOgogCWNhc2UgU0FBNzEzNF9CT0FSRF9BVkVSTUVESUFfQ0FSREJVUzoKIAkJLyogcG93ZXItdXAgdHVuZXIgY2hpcCAqLwogCQlzYWFfYW5kb3JsKFNBQTcxMzRfR1BJT19HUE1PREUwID4+IDIsICAgMHhmZmZmZmZmZiwgMHhmZmZmZmZmZik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3NhYTcxMzQvc2FhNzEzNC1kdmIuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vc2FhNzEzNC9zYWE3MTM0LWR2Yi5jCmluZGV4IDFiYTUzYjUuLjZiNjFkOWIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vc2FhNzEzNC9zYWE3MTM0LWR2Yi5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vc2FhNzEzNC9zYWE3MTM0LWR2Yi5jCkBAIC0xMTQ3LDYgKzExNDcsOCBAQAogCQkJCQkgICAgICAgJnBoaWxpcHNfZXVyb3BhX2NvbmZpZywKIAkJCQkJICAgICAgICZkZXYtPmkyY19hZGFwKTsKIAkJaWYgKGRldi0+ZHZiLmZyb250ZW5kKSB7CisJCQlkZXYtPm9yaWdpbmFsX2RlbW9kX3NsZWVwID0gZGV2LT5kdmIuZnJvbnRlbmQtPm9wcy5zbGVlcDsKKwkJCWRldi0+ZHZiLmZyb250ZW5kLT5vcHMuc2xlZXAgPSBwaGlsaXBzX2V1cm9wYV9kZW1vZF9zbGVlcDsKIAkJCWRldi0+ZHZiLmZyb250ZW5kLT5vcHMudHVuZXJfb3BzLmluaXQgPSBwaGlsaXBzX2V1cm9wYV90dW5lcl9pbml0OwogCQkJZGV2LT5kdmIuZnJvbnRlbmQtPm9wcy50dW5lcl9vcHMuc2xlZXAgPSBwaGlsaXBzX2V1cm9wYV90dW5lcl9zbGVlcDsKIAkJCWRldi0+ZHZiLmZyb250ZW5kLT5vcHMudHVuZXJfb3BzLnNldF9wYXJhbXMgPSBwaGlsaXBzX3RkMTMxNl90dW5lcl9zZXRfcGFyYW1zOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9zYWE3MTM0L3NhYTcxMzQtaW5wdXQuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vc2FhNzEzNC9zYWE3MTM0LWlucHV0LmMKaW5kZXggZmY1OTkxMS4uZGVlODM1NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9zYWE3MTM0L3NhYTcxMzQtaW5wdXQuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3NhYTcxMzQvc2FhNzEzNC1pbnB1dC5jCkBAIC0xODUsNyArMTg1LDYgQEAKIAljYXNlIFNBQTcxMzRfQk9BUkRfQVZFUk1FRElBX1NUVURJT18zMDU6CiAJY2FzZSBTQUE3MTM0X0JPQVJEX0FWRVJNRURJQV9TVFVESU9fMzA3OgogCWNhc2UgU0FBNzEzNF9CT0FSRF9BVkVSTUVESUFfR09fMDA3X0ZNOgotCWNhc2UgU0FBNzEzNF9CT0FSRF9BVkVSTUVESUFfQTE2QVI6CiAJCWlyX2NvZGVzICAgICA9IGlyX2NvZGVzX2F2ZXJtZWRpYTsKIAkJbWFza19rZXljb2RlID0gMHgwMDA3Qzg7CiAJCW1hc2tfa2V5ZG93biA9IDB4MDAwMDEwOwpAQCAtMTk0LDYgKzE5MywxNiBAQAogCQlzYWFfc2V0YihTQUE3MTM0X0dQSU9fR1BNT0RFMCwgMHg0KTsKIAkJc2FhX3NldGIoU0FBNzEzNF9HUElPX0dQU1RBVFVTMCwgMHg0KTsKIAkJYnJlYWs7CisJY2FzZSBTQUE3MTM0X0JPQVJEX0FWRVJNRURJQV83Nzc6CisJY2FzZSBTQUE3MTM0X0JPQVJEX0FWRVJNRURJQV9BMTZBUjoKKwkJaXJfY29kZXMgICAgID0gaXJfY29kZXNfYXZlcm1lZGlhOworCQltYXNrX2tleWNvZGUgPSAweDAyRjIwMDsKKwkJbWFza19rZXlkb3duID0gMHgwMDA0MDA7CisJCXBvbGxpbmcgICAgICA9IDUwOyAvLyBtcworCQkvKiBXaXRob3V0IHRoaXMgd2Ugd29uJ3QgcmVjZWl2ZSBrZXkgdXAgZXZlbnRzICovCisJCXNhYV9zZXRiKFNBQTcxMzRfR1BJT19HUE1PREUxLCAweDEpOworCQlzYWFfc2V0YihTQUE3MTM0X0dQSU9fR1BTVEFUVVMxLCAweDEpOworCQlicmVhazsKIAljYXNlIFNBQTcxMzRfQk9BUkRfS1dPUkxEX1RFUk1JTkFUT1I6CiAJCWlyX2NvZGVzICAgICA9IGlyX2NvZGVzX3BpeGVsdmlldzsKIAkJbWFza19rZXljb2RlID0gMHgwMDAwMWY7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3NhYTcxMzQvc2FhNzEzNC12aWRlby5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9zYWE3MTM0L3NhYTcxMzQtdmlkZW8uYwppbmRleCAyMDMzMDJmLi44MzA2MTdlIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3NhYTcxMzQvc2FhNzEzNC12aWRlby5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vc2FhNzEzNC9zYWE3MTM0LXZpZGVvLmMKQEAgLTIyNDgsNyArMjI0OCwxMSBAQAogCQl0LT50eXBlID0gVjRMMl9UVU5FUl9SQURJTzsKIAogCQlzYWE3MTM0X2kyY19jYWxsX2NsaWVudHMoZGV2LCBWSURJT0NfR19UVU5FUiwgdCk7Ci0KKwkJaWYgKGRldi0+aW5wdXQtPmFtdXggPT0gVFYpIHsKKwkJCXQtPnNpZ25hbCA9IDB4ZjgwMCAtICgoc2FhX3JlYWRiKDB4NTgxKSAmIDB4MWYpIDw8IDExKTsKKwkJCXQtPnJ4c3ViY2hhbnMgPSAoc2FhX3JlYWRiKDB4NTI5KSAmIDB4MDgpID8KKwkJCQkJVjRMMl9UVU5FUl9TVUJfU1RFUkVPIDogVjRMMl9UVU5FUl9TVUJfTU9OTzsKKwkJfQogCQlyZXR1cm4gMDsKIAl9CiAJY2FzZSBWSURJT0NfU19UVU5FUjoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vc245YzEwMi9zbjljMTAyX2NvcmUuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vc245YzEwMi9zbjljMTAyX2NvcmUuYwppbmRleCAzZTBmZjhhLi5hNDcwMmQzIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3NuOWMxMDIvc245YzEwMl9jb3JlLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9zbjljMTAyL3NuOWMxMDJfY29yZS5jCkBAIC0xMjQwLDIzICsxMjQwLDUzIEBACiAJCQkgc245YzEwMl9zaG93X2ZyYW1lX2hlYWRlciwgTlVMTCk7CiAKIAotc3RhdGljIHZvaWQgc245YzEwMl9jcmVhdGVfc3lzZnMoc3RydWN0IHNuOWMxMDJfZGV2aWNlKiBjYW0pCitzdGF0aWMgaW50IHNuOWMxMDJfY3JlYXRlX3N5c2ZzKHN0cnVjdCBzbjljMTAyX2RldmljZSogY2FtKQogewogCXN0cnVjdCB2aWRlb19kZXZpY2UgKnY0bGRldiA9IGNhbS0+djRsZGV2OworCWludCByYzsKIAotCXZpZGVvX2RldmljZV9jcmVhdGVfZmlsZSh2NGxkZXYsICZjbGFzc19kZXZpY2VfYXR0cl9yZWcpOwotCXZpZGVvX2RldmljZV9jcmVhdGVfZmlsZSh2NGxkZXYsICZjbGFzc19kZXZpY2VfYXR0cl92YWwpOwotCXZpZGVvX2RldmljZV9jcmVhdGVfZmlsZSh2NGxkZXYsICZjbGFzc19kZXZpY2VfYXR0cl9mcmFtZV9oZWFkZXIpOwotCWlmIChjYW0tPmJyaWRnZSA9PSBCUklER0VfU045QzEwMSB8fCBjYW0tPmJyaWRnZSA9PSBCUklER0VfU045QzEwMikKLQkJdmlkZW9fZGV2aWNlX2NyZWF0ZV9maWxlKHY0bGRldiwgJmNsYXNzX2RldmljZV9hdHRyX2dyZWVuKTsKLQllbHNlIGlmIChjYW0tPmJyaWRnZSA9PSBCUklER0VfU045QzEwMykgewotCQl2aWRlb19kZXZpY2VfY3JlYXRlX2ZpbGUodjRsZGV2LCAmY2xhc3NfZGV2aWNlX2F0dHJfYmx1ZSk7Ci0JCXZpZGVvX2RldmljZV9jcmVhdGVfZmlsZSh2NGxkZXYsICZjbGFzc19kZXZpY2VfYXR0cl9yZWQpOwotCX0KKwlyYyA9IHZpZGVvX2RldmljZV9jcmVhdGVfZmlsZSh2NGxkZXYsICZjbGFzc19kZXZpY2VfYXR0cl9yZWcpOworCWlmIChyYykgZ290byBlcnI7CisJcmMgPSB2aWRlb19kZXZpY2VfY3JlYXRlX2ZpbGUodjRsZGV2LCAmY2xhc3NfZGV2aWNlX2F0dHJfdmFsKTsKKwlpZiAocmMpIGdvdG8gZXJyX3JlZzsKKwlyYyA9IHZpZGVvX2RldmljZV9jcmVhdGVfZmlsZSh2NGxkZXYsICZjbGFzc19kZXZpY2VfYXR0cl9mcmFtZV9oZWFkZXIpOworCWlmIChyYykgZ290byBlcnJfdmFsOworCiAJaWYgKGNhbS0+c2Vuc29yLnN5c2ZzX29wcykgewotCQl2aWRlb19kZXZpY2VfY3JlYXRlX2ZpbGUodjRsZGV2LCAmY2xhc3NfZGV2aWNlX2F0dHJfaTJjX3JlZyk7Ci0JCXZpZGVvX2RldmljZV9jcmVhdGVfZmlsZSh2NGxkZXYsICZjbGFzc19kZXZpY2VfYXR0cl9pMmNfdmFsKTsKKwkJcmMgPSB2aWRlb19kZXZpY2VfY3JlYXRlX2ZpbGUodjRsZGV2LCAmY2xhc3NfZGV2aWNlX2F0dHJfaTJjX3JlZyk7CisJCWlmIChyYykgZ290byBlcnJfZnJoZWFkOworCQlyYyA9IHZpZGVvX2RldmljZV9jcmVhdGVfZmlsZSh2NGxkZXYsICZjbGFzc19kZXZpY2VfYXR0cl9pMmNfdmFsKTsKKwkJaWYgKHJjKSBnb3RvIGVycl9pMmNfcmVnOwogCX0KKworCWlmIChjYW0tPmJyaWRnZSA9PSBCUklER0VfU045QzEwMSB8fCBjYW0tPmJyaWRnZSA9PSBCUklER0VfU045QzEwMikgeworCQlyYyA9IHZpZGVvX2RldmljZV9jcmVhdGVfZmlsZSh2NGxkZXYsICZjbGFzc19kZXZpY2VfYXR0cl9ncmVlbik7CisJCWlmIChyYykgZ290byBlcnJfaTJjX3ZhbDsKKwl9IGVsc2UgaWYgKGNhbS0+YnJpZGdlID09IEJSSURHRV9TTjlDMTAzKSB7CisJCXJjID0gdmlkZW9fZGV2aWNlX2NyZWF0ZV9maWxlKHY0bGRldiwgJmNsYXNzX2RldmljZV9hdHRyX2JsdWUpOworCQlpZiAocmMpIGdvdG8gZXJyX2kyY192YWw7CisJCXJjID0gdmlkZW9fZGV2aWNlX2NyZWF0ZV9maWxlKHY0bGRldiwgJmNsYXNzX2RldmljZV9hdHRyX3JlZCk7CisJCWlmIChyYykgZ290byBlcnJfYmx1ZTsKKwl9CisKKwlyZXR1cm4gMDsKKworZXJyX2JsdWU6CisJdmlkZW9fZGV2aWNlX3JlbW92ZV9maWxlKHY0bGRldiwgJmNsYXNzX2RldmljZV9hdHRyX2JsdWUpOworZXJyX2kyY192YWw6CisJaWYgKGNhbS0+c2Vuc29yLnN5c2ZzX29wcykKKwkJdmlkZW9fZGV2aWNlX3JlbW92ZV9maWxlKHY0bGRldiwgJmNsYXNzX2RldmljZV9hdHRyX2kyY192YWwpOworZXJyX2kyY19yZWc6CisJaWYgKGNhbS0+c2Vuc29yLnN5c2ZzX29wcykKKwkJdmlkZW9fZGV2aWNlX3JlbW92ZV9maWxlKHY0bGRldiwgJmNsYXNzX2RldmljZV9hdHRyX2kyY19yZWcpOworZXJyX2ZyaGVhZDoKKwl2aWRlb19kZXZpY2VfcmVtb3ZlX2ZpbGUodjRsZGV2LCAmY2xhc3NfZGV2aWNlX2F0dHJfZnJhbWVfaGVhZGVyKTsKK2Vycl92YWw6CisJdmlkZW9fZGV2aWNlX3JlbW92ZV9maWxlKHY0bGRldiwgJmNsYXNzX2RldmljZV9hdHRyX3ZhbCk7CitlcnJfcmVnOgorCXZpZGVvX2RldmljZV9yZW1vdmVfZmlsZSh2NGxkZXYsICZjbGFzc19kZXZpY2VfYXR0cl9yZWcpOworZXJyOgorCXJldHVybiByYzsKIH0KICNlbmRpZiAvKiBDT05GSUdfVklERU9fQURWX0RFQlVHICovCiAKQEAgLTI4MDksMTAgKzI4MzksNyBAQAogCQlEQkcoMSwgIlY0TDIgZGV2aWNlIHJlZ2lzdHJhdGlvbiBmYWlsZWQiKTsKIAkJaWYgKGVyciA9PSAtRU5GSUxFICYmIHZpZGVvX25yW2Rldl9ucl0gPT0gLTEpCiAJCQlEQkcoMSwgIkZyZWUgL2Rldi92aWRlb1ggbm9kZSBub3QgZm91bmQiKTsKLQkJdmlkZW9fbnJbZGV2X25yXSA9IC0xOwotCQlkZXZfbnIgPSAoZGV2X25yIDwgU045QzEwMl9NQVhfREVWSUNFUy0xKSA/IGRldl9ucisxIDogMDsKLQkJbXV0ZXhfdW5sb2NrKCZjYW0tPmRldl9tdXRleCk7Ci0JCWdvdG8gZmFpbDsKKwkJZ290byBmYWlsMjsKIAl9CiAKIAlEQkcoMiwgIlY0TDIgZGV2aWNlIHJlZ2lzdGVyZWQgYXMgL2Rldi92aWRlbyVkIiwgY2FtLT52NGxkZXYtPm1pbm9yKTsKQEAgLTI4MjMsNyArMjg1MCw5IEBACiAJZGV2X25yID0gKGRldl9uciA8IFNOOUMxMDJfTUFYX0RFVklDRVMtMSkgPyBkZXZfbnIrMSA6IDA7CiAKICNpZmRlZiBDT05GSUdfVklERU9fQURWX0RFQlVHCi0Jc245YzEwMl9jcmVhdGVfc3lzZnMoY2FtKTsKKwllcnIgPSBzbjljMTAyX2NyZWF0ZV9zeXNmcyhjYW0pOworCWlmIChlcnIpCisJCWdvdG8gZmFpbDM7CiAJREJHKDIsICJPcHRpb25hbCBkZXZpY2UgY29udHJvbCB0aHJvdWdoICdzeXNmcycgaW50ZXJmYWNlIHJlYWR5Iik7CiAjZW5kaWYKIApAQCAtMjgzMyw2ICsyODYyLDE0IEBACiAKIAlyZXR1cm4gMDsKIAorI2lmZGVmIENPTkZJR19WSURFT19BRFZfREVCVUcKK2ZhaWwzOgorCXZpZGVvX3VucmVnaXN0ZXJfZGV2aWNlKGNhbS0+djRsZGV2KTsKKyNlbmRpZgorZmFpbDI6CisJdmlkZW9fbnJbZGV2X25yXSA9IC0xOworCWRldl9uciA9IChkZXZfbnIgPCBTTjlDMTAyX01BWF9ERVZJQ0VTLTEpID8gZGV2X25yKzEgOiAwOworCW11dGV4X3VubG9jaygmY2FtLT5kZXZfbXV0ZXgpOwogZmFpbDoKIAlpZiAoY2FtKSB7CiAJCWtmcmVlKGNhbS0+Y29udHJvbF9idWZmZXIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9zdHY2ODAuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vc3R2NjgwLmMKaW5kZXggODdlMTEzMC4uNmQxZWYxZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9zdHY2ODAuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3N0djY4MC5jCkBAIC01MTYsMTYgKzUxNiw0NSBAQAogc3R2NjgwX2ZpbGUocGFja2V0c19kcm9wcGVkLCBkcm9wcGVkLCAiJWRcbiIpOwogc3R2NjgwX2ZpbGUoZGVjb2RpbmdfZXJyb3JzLCBlcnJvciwgIiVkXG4iKTsKIAotc3RhdGljIHZvaWQgc3R2NjgwX2NyZWF0ZV9zeXNmc19maWxlcyhzdHJ1Y3QgdmlkZW9fZGV2aWNlICp2ZGV2KQorc3RhdGljIGludCBzdHY2ODBfY3JlYXRlX3N5c2ZzX2ZpbGVzKHN0cnVjdCB2aWRlb19kZXZpY2UgKnZkZXYpCiB7Ci0JdmlkZW9fZGV2aWNlX2NyZWF0ZV9maWxlKHZkZXYsICZjbGFzc19kZXZpY2VfYXR0cl9tb2RlbCk7Ci0JdmlkZW9fZGV2aWNlX2NyZWF0ZV9maWxlKHZkZXYsICZjbGFzc19kZXZpY2VfYXR0cl9pbl91c2UpOwotCXZpZGVvX2RldmljZV9jcmVhdGVfZmlsZSh2ZGV2LCAmY2xhc3NfZGV2aWNlX2F0dHJfc3RyZWFtaW5nKTsKLQl2aWRlb19kZXZpY2VfY3JlYXRlX2ZpbGUodmRldiwgJmNsYXNzX2RldmljZV9hdHRyX3BhbGV0dGUpOwotCXZpZGVvX2RldmljZV9jcmVhdGVfZmlsZSh2ZGV2LCAmY2xhc3NfZGV2aWNlX2F0dHJfZnJhbWVzX3RvdGFsKTsKLQl2aWRlb19kZXZpY2VfY3JlYXRlX2ZpbGUodmRldiwgJmNsYXNzX2RldmljZV9hdHRyX2ZyYW1lc19yZWFkKTsKLQl2aWRlb19kZXZpY2VfY3JlYXRlX2ZpbGUodmRldiwgJmNsYXNzX2RldmljZV9hdHRyX3BhY2tldHNfZHJvcHBlZCk7Ci0JdmlkZW9fZGV2aWNlX2NyZWF0ZV9maWxlKHZkZXYsICZjbGFzc19kZXZpY2VfYXR0cl9kZWNvZGluZ19lcnJvcnMpOworCWludCByYzsKKworCXJjID0gdmlkZW9fZGV2aWNlX2NyZWF0ZV9maWxlKHZkZXYsICZjbGFzc19kZXZpY2VfYXR0cl9tb2RlbCk7CisJaWYgKHJjKSBnb3RvIGVycjsKKwlyYyA9IHZpZGVvX2RldmljZV9jcmVhdGVfZmlsZSh2ZGV2LCAmY2xhc3NfZGV2aWNlX2F0dHJfaW5fdXNlKTsKKwlpZiAocmMpIGdvdG8gZXJyX21vZGVsOworCXJjID0gdmlkZW9fZGV2aWNlX2NyZWF0ZV9maWxlKHZkZXYsICZjbGFzc19kZXZpY2VfYXR0cl9zdHJlYW1pbmcpOworCWlmIChyYykgZ290byBlcnJfaW51c2U7CisJcmMgPSB2aWRlb19kZXZpY2VfY3JlYXRlX2ZpbGUodmRldiwgJmNsYXNzX2RldmljZV9hdHRyX3BhbGV0dGUpOworCWlmIChyYykgZ290byBlcnJfc3RyZWFtOworCXJjID0gdmlkZW9fZGV2aWNlX2NyZWF0ZV9maWxlKHZkZXYsICZjbGFzc19kZXZpY2VfYXR0cl9mcmFtZXNfdG90YWwpOworCWlmIChyYykgZ290byBlcnJfcGFsOworCXJjID0gdmlkZW9fZGV2aWNlX2NyZWF0ZV9maWxlKHZkZXYsICZjbGFzc19kZXZpY2VfYXR0cl9mcmFtZXNfcmVhZCk7CisJaWYgKHJjKSBnb3RvIGVycl9mcmFtdG90OworCXJjID0gdmlkZW9fZGV2aWNlX2NyZWF0ZV9maWxlKHZkZXYsICZjbGFzc19kZXZpY2VfYXR0cl9wYWNrZXRzX2Ryb3BwZWQpOworCWlmIChyYykgZ290byBlcnJfZnJhbXJlYWQ7CisJcmMgPSB2aWRlb19kZXZpY2VfY3JlYXRlX2ZpbGUodmRldiwgJmNsYXNzX2RldmljZV9hdHRyX2RlY29kaW5nX2Vycm9ycyk7CisJaWYgKHJjKSBnb3RvIGVycl9kcm9wcGVkOworCisJcmV0dXJuIDA7CisKK2Vycl9kcm9wcGVkOgorCXZpZGVvX2RldmljZV9yZW1vdmVfZmlsZSh2ZGV2LCAmY2xhc3NfZGV2aWNlX2F0dHJfcGFja2V0c19kcm9wcGVkKTsKK2Vycl9mcmFtcmVhZDoKKwl2aWRlb19kZXZpY2VfcmVtb3ZlX2ZpbGUodmRldiwgJmNsYXNzX2RldmljZV9hdHRyX2ZyYW1lc19yZWFkKTsKK2Vycl9mcmFtdG90OgorCXZpZGVvX2RldmljZV9yZW1vdmVfZmlsZSh2ZGV2LCAmY2xhc3NfZGV2aWNlX2F0dHJfZnJhbWVzX3RvdGFsKTsKK2Vycl9wYWw6CisJdmlkZW9fZGV2aWNlX3JlbW92ZV9maWxlKHZkZXYsICZjbGFzc19kZXZpY2VfYXR0cl9wYWxldHRlKTsKK2Vycl9zdHJlYW06CisJdmlkZW9fZGV2aWNlX3JlbW92ZV9maWxlKHZkZXYsICZjbGFzc19kZXZpY2VfYXR0cl9zdHJlYW1pbmcpOworZXJyX2ludXNlOgorCXZpZGVvX2RldmljZV9yZW1vdmVfZmlsZSh2ZGV2LCAmY2xhc3NfZGV2aWNlX2F0dHJfaW5fdXNlKTsKK2Vycl9tb2RlbDoKKwl2aWRlb19kZXZpY2VfcmVtb3ZlX2ZpbGUodmRldiwgJmNsYXNzX2RldmljZV9hdHRyX21vZGVsKTsKK2VycjoKKwlyZXR1cm4gcmM7CiB9CiAKIHN0YXRpYyB2b2lkIHN0djY4MF9yZW1vdmVfc3lzZnNfZmlsZXMoc3RydWN0IHZpZGVvX2RldmljZSAqdmRldikKQEAgLTE0MTgsOSArMTQ0NywxMyBAQAogCVBERUJVRyAoMCwgIlNUVihpKTogcmVnaXN0ZXJlZCBuZXcgdmlkZW8gZGV2aWNlOiB2aWRlbyVkIiwgc3R2NjgwLT52ZGV2LT5taW5vcik7CiAKIAl1c2Jfc2V0X2ludGZkYXRhIChpbnRmLCBzdHY2ODApOwotCXN0djY4MF9jcmVhdGVfc3lzZnNfZmlsZXMoc3R2NjgwLT52ZGV2KTsKKwlyZXR2YWwgPSBzdHY2ODBfY3JlYXRlX3N5c2ZzX2ZpbGVzKHN0djY4MC0+dmRldik7CisJaWYgKHJldHZhbCkKKwkJZ290byBlcnJvcl91bnJlZzsKIAlyZXR1cm4gMDsKIAorZXJyb3JfdW5yZWc6CisJdmlkZW9fdW5yZWdpc3Rlcl9kZXZpY2Uoc3R2NjgwLT52ZGV2KTsKIGVycm9yX3ZkZXY6CiAJdmlkZW9fZGV2aWNlX3JlbGVhc2Uoc3R2NjgwLT52ZGV2KTsKIGVycm9yOgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby90dW5lci10eXBlcy5jIGIvZHJpdmVycy9tZWRpYS92aWRlby90dW5lci10eXBlcy5jCmluZGV4IDhmZmY2NDIuLjc4MTY4MjMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vdHVuZXItdHlwZXMuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3R1bmVyLXR5cGVzLmMKQEAgLTEwNDYsNyArMTA0Niw2IEBACiAJCS50eXBlICAgPSBUVU5FUl9QQVJBTV9UWVBFX05UU0MsCiAJCS5yYW5nZXMgPSB0dW5lcl9zYW1zdW5nX3RjcG5fMjEyMXAzMGFfbnRzY19yYW5nZXMsCiAJCS5jb3VudCAgPSBBUlJBWV9TSVpFKHR1bmVyX3NhbXN1bmdfdGNwbl8yMTIxcDMwYV9udHNjX3JhbmdlcyksCi0JCS5oYXNfdGRhOTg4NyA9IDEsCiAJfSwKIH07CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vdHZlZXByb20uYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vdHZlZXByb20uYwppbmRleCBlNmJhYWVlLi42YjllZjczIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3R2ZWVwcm9tLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby90dmVlcHJvbS5jCkBAIC00NjgsNyArNDY4LDcgQEAKIAkJCQkoZWVwcm9tX2RhdGFbaSs2XSA8PCA4KSArCiAJCQkJKGVlcHJvbV9kYXRhW2krN10gPDwgMTYpOwogCi0JCQkJaWYgKCAoZWVwcm9tX2RhdGFbaSArIDhdICYmIDB4ZjApICYmCisJCQkJaWYgKCAoZWVwcm9tX2RhdGFbaSArIDhdICYgMHhmMCkgJiYKIAkJCQkJKHR2ZWUtPnNlcmlhbF9udW1iZXIgPCAweGZmZmZmZikgKSB7CiAJCQkJCXR2ZWUtPk1BQ19hZGRyZXNzWzBdID0gMHgwMDsKIAkJCQkJdHZlZS0+TUFDX2FkZHJlc3NbMV0gPSAweDBEOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby92aWRlb2Rldi5jIGIvZHJpdmVycy9tZWRpYS92aWRlby92aWRlb2Rldi5jCmluZGV4IDQ3OWEwNjcuLmQ0MjRhNDEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vdmlkZW9kZXYuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3ZpZGVvZGV2LmMKQEAgLTE3LDEwICsxNywxMSBAQAogICovCiAKICNkZWZpbmUgZGJnYXJnKGNtZCwgZm10LCBhcmcuLi4pIFwKLQkJaWYgKHZmZC0+ZGVidWcgJiBWNEwyX0RFQlVHX0lPQ1RMX0FSRykJCQlcCisJCWlmICh2ZmQtPmRlYnVnICYgVjRMMl9ERUJVR19JT0NUTF9BUkcpIHsJCVwKIAkJCXByaW50ayAoS0VSTl9ERUJVRyAiJXM6ICIsICB2ZmQtPm5hbWUpOwkJXAogCQkJdjRsX3ByaW50a19pb2N0bChjbWQpOwkJCQlcCi0JCQlwcmludGsgKEtFUk5fREVCVUcgIiVzOiAiIGZtdCwgdmZkLT5uYW1lLCAjIyBhcmcpOworCQkJcHJpbnRrIChLRVJOX0RFQlVHICIlczogIiBmbXQsIHZmZC0+bmFtZSwgIyMgYXJnKTsgXAorCQl9CiAKICNkZWZpbmUgZGJnYXJnMihmbXQsIGFyZy4uLikgXAogCQlpZiAodmZkLT5kZWJ1ZyAmIFY0TDJfREVCVUdfSU9DVExfQVJHKQkJCVwKQEAgLTEyODcsNiArMTI4OCw3IEBACiAJCQlyZXQ9dmZkLT52aWRpb2NfZ19wYXJtKGZpbGUsIGZoLCBwKTsKIAkJfSBlbHNlIHsKIAkJCXN0cnVjdCB2NGwyX3N0YW5kYXJkIHM7CisJCQlpbnQgaTsKIAogCQkJaWYgKCF2ZmQtPnR2bm9ybXNpemUpIHsKIAkJCQlwcmludGsgKEtFUk5fV0FSTklORyAiJXM6IG5vIFRWIG5vcm1zIGRlZmluZWQhXG4iLApAQCAtMTI5Nyw4ICsxMjk5LDE0IEBACiAJCQlpZiAocC0+dHlwZSAhPSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkUpCiAJCQkJcmV0dXJuIC1FSU5WQUw7CiAKLQkJCXY0bDJfdmlkZW9fc3RkX2NvbnN0cnVjdCgmcywgdmZkLT50dm5vcm1zW3ZmZC0+Y3VycmVudF9ub3JtXS5pZCwKLQkJCQkJCSB2ZmQtPnR2bm9ybXNbdmZkLT5jdXJyZW50X25vcm1dLm5hbWUpOworCQkJZm9yIChpID0gMDsgaSA8IHZmZC0+dHZub3Jtc2l6ZTsgaSsrKQorCQkJCWlmICh2ZmQtPnR2bm9ybXNbaV0uaWQgPT0gdmZkLT5jdXJyZW50X25vcm0pCisJCQkJCWJyZWFrOworCQkJaWYgKGkgPj0gdmZkLT50dm5vcm1zaXplKQorCQkJCXJldHVybiAtRUlOVkFMOworCisJCQl2NGwyX3ZpZGVvX3N0ZF9jb25zdHJ1Y3QoJnMsIHZmZC0+Y3VycmVudF9ub3JtLAorCQkJCQkJIHZmZC0+dHZub3Jtc1tpXS5uYW1lKTsKIAogCQkJbWVtc2V0KHAsMCxzaXplb2YoKnApKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby92aXZpLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3ZpdmkuYwppbmRleCBlN2MwMWQ1Li4zYzhkYzcyIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3ZpdmkuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3ZpdmkuYwpAQCAtMjcyLDcgKzI3Miw3IEBACiAKIAkvKiBHZXQgZmlyc3QgYWRkciBwb2ludGVkIHRvIHBpeGVsIHBvc2l0aW9uICovCiAJb2xkcGc9Z2V0X2FkZHJfcG9zKHBvcyxwYWdlcyx0b19hZGRyKTsKLQlwZz1wZm5fdG9fcGFnZSh0b19hZGRyW29sZHBnXS5zZy0+ZG1hX2FkZHJlc3MgPj4gUEFHRV9TSElGVCk7CisJcGc9cGZuX3RvX3BhZ2Uoc2dfZG1hX2FkZHJlc3ModG9fYWRkcltvbGRwZ10uc2cpID4+IFBBR0VfU0hJRlQpOwogCWJhc2VwID0ga21hcF9hdG9taWMocGcsIEtNX0JPVU5DRV9SRUFEKSt0b19hZGRyW29sZHBnXS5zZy0+b2Zmc2V0OwogCiAJLyogV2Ugd2lsbCBqdXN0IGR1cGxpY2F0ZSB0aGUgc2Vjb25kIHBpeGVsIGF0IHRoZSBwYWNrZXQgKi8KQEAgLTI4Nyw3ICsyODcsNyBAQAogCQlmb3IgKGNvbG9yPTA7Y29sb3I8NDtjb2xvcisrKSB7CiAJCQlwZ3Bvcz1nZXRfYWRkcl9wb3MocG9zLHBhZ2VzLHRvX2FkZHIpOwogCQkJaWYgKHBncG9zIT1vbGRwZykgewotCQkJCXBnPXBmbl90b19wYWdlKHRvX2FkZHJbcGdwb3NdLnNnLT5kbWFfYWRkcmVzcyA+PiBQQUdFX1NISUZUKTsKKwkJCQlwZz1wZm5fdG9fcGFnZShzZ19kbWFfYWRkcmVzcyh0b19hZGRyW3BncG9zXS5zZykgPj4gUEFHRV9TSElGVCk7CiAJCQkJa3VubWFwX2F0b21pYyhiYXNlcCwgS01fQk9VTkNFX1JFQUQpOwogCQkJCWJhc2VwPSBrbWFwX2F0b21pYyhwZywgS01fQk9VTkNFX1JFQUQpK3RvX2FkZHJbcGdwb3NdLnNnLT5vZmZzZXQ7CiAJCQkJb2xkcGc9cGdwb3M7CkBAIC0zMzksOCArMzM5LDggQEAKIAkJCQlmb3IgKGNvbG9yPTA7Y29sb3I8NDtjb2xvcisrKSB7CiAJCQkJCXBncG9zPWdldF9hZGRyX3Bvcyhwb3MscGFnZXMsdG9fYWRkcik7CiAJCQkJCWlmIChwZ3BvcyE9b2xkcGcpIHsKLQkJCQkJCXBnPXBmbl90b19wYWdlKHRvX2FkZHJbcGdwb3NdLgotCQkJCQkJCQlzZy0+ZG1hX2FkZHJlc3MKKwkJCQkJCXBnPXBmbl90b19wYWdlKHNnX2RtYV9hZGRyZXNzKAorCQkJCQkJCQl0b19hZGRyW3BncG9zXS5zZykKIAkJCQkJCQkJPj4gUEFHRV9TSElGVCk7CiAJCQkJCQlrdW5tYXBfYXRvbWljKGJhc2VwLAogCQkJCQkJCQlLTV9CT1VOQ0VfUkVBRCk7CkBAIC0zODYsNyArMzg2LDcgQEAKIAlzdHJ1Y3QgdGltZXZhbCB0czsKIAogCS8qIFRlc3QgaWYgRE1BIG1hcHBpbmcgaXMgcmVhZHkgKi8KLQlpZiAoIXZiLT5kbWEuc2dsaXN0WzBdLmRtYV9hZGRyZXNzKQorCWlmICghc2dfZG1hX2FkZHJlc3MoJnZiLT5kbWEuc2dsaXN0WzBdKSkKIAkJcmV0dXJuOwogCiAJcHJlcF90b19hZGRyKHRvX2FkZHIsdmIpOwpAQCAtNzgzLDcgKzc4Myw3IEBACiAJZm9yIChpID0gMDsgaSA8IG5lbnRzOyBpKysgKSB7CiAJCUJVR19PTighc2dbaV0ucGFnZSk7CiAKLQkJc2dbaV0uZG1hX2FkZHJlc3MgPSBwYWdlX3RvX3BoeXMoc2dbaV0ucGFnZSkgKyBzZ1tpXS5vZmZzZXQ7CisJCXNnX2RtYV9hZGRyZXNzKCZzZ1tpXSkgPSBwYWdlX3RvX3BoeXMoc2dbaV0ucGFnZSkgKyBzZ1tpXS5vZmZzZXQ7CiAJfQogCiAJcmV0dXJuIG5lbnRzOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZXNzYWdlL2Z1c2lvbi9tcHRiYXNlLmggYi9kcml2ZXJzL21lc3NhZ2UvZnVzaW9uL21wdGJhc2UuaAppbmRleCBjNTM3ZDcxLi5hNGFmYWQ0IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lc3NhZ2UvZnVzaW9uL21wdGJhc2UuaAorKysgYi9kcml2ZXJzL21lc3NhZ2UvZnVzaW9uL21wdGJhc2UuaApAQCAtNzUsOCArNzUsOCBAQAogI2RlZmluZSBDT1BZUklHSFQJIkNvcHlyaWdodCAoYykgMTk5OS0yMDA1ICIgTU9EVUxFQVVUSE9SCiAjZW5kaWYKIAotI2RlZmluZSBNUFRfTElOVVhfVkVSU0lPTl9DT01NT04JIjMuMDQuMDEiCi0jZGVmaW5lIE1QVF9MSU5VWF9QQUNLQUdFX05BTUUJCSJAKCMpbXB0bGludXgtMy4wNC4wMSIKKyNkZWZpbmUgTVBUX0xJTlVYX1ZFUlNJT05fQ09NTU9OCSIzLjA0LjAyIgorI2RlZmluZSBNUFRfTElOVVhfUEFDS0FHRV9OQU1FCQkiQCgjKW1wdGxpbnV4LTMuMDQuMDIiCiAjZGVmaW5lIFdIQVRfTUFHSUNfU1RSSU5HCQkiQCIgIigiICIjIiAiKSIKIAogI2RlZmluZSBzaG93X21wdG1vZF92ZXIocyx2ZXIpICBcCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lc3NhZ2UvZnVzaW9uL21wdGZjLmMgYi9kcml2ZXJzL21lc3NhZ2UvZnVzaW9uL21wdGZjLmMKaW5kZXggZTU3YmIwMy4uMWRkNDkxNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZXNzYWdlL2Z1c2lvbi9tcHRmYy5jCisrKyBiL2RyaXZlcnMvbWVzc2FnZS9mdXNpb24vbXB0ZmMuYwpAQCAtOTYsNiArOTYsMTAgQEAKIHN0YXRpYyB2b2lkIG1wdGZjX3RhcmdldF9kZXN0cm95KHN0cnVjdCBzY3NpX3RhcmdldCAqc3RhcmdldCk7CiBzdGF0aWMgdm9pZCBtcHRmY19zZXRfcnBvcnRfbG9zc190bW8oc3RydWN0IGZjX3Jwb3J0ICpycG9ydCwgdWludDMyX3QgdGltZW91dCk7CiBzdGF0aWMgdm9pZCBfX2RldmV4aXQgbXB0ZmNfcmVtb3ZlKHN0cnVjdCBwY2lfZGV2ICpwZGV2KTsKK3N0YXRpYyBpbnQgbXB0ZmNfYWJvcnQoc3RydWN0IHNjc2lfY21uZCAqU0NwbnQpOworc3RhdGljIGludCBtcHRmY19kZXZfcmVzZXQoc3RydWN0IHNjc2lfY21uZCAqU0NwbnQpOworc3RhdGljIGludCBtcHRmY19idXNfcmVzZXQoc3RydWN0IHNjc2lfY21uZCAqU0NwbnQpOworc3RhdGljIGludCBtcHRmY19ob3N0X3Jlc2V0KHN0cnVjdCBzY3NpX2NtbmQgKlNDcG50KTsKIAogc3RhdGljIHN0cnVjdCBzY3NpX2hvc3RfdGVtcGxhdGUgbXB0ZmNfZHJpdmVyX3RlbXBsYXRlID0gewogCS5tb2R1bGUJCQkJPSBUSElTX01PRFVMRSwKQEAgLTExMCwxMCArMTE0LDEwIEBACiAJLnRhcmdldF9kZXN0cm95CQkJPSBtcHRmY190YXJnZXRfZGVzdHJveSwKIAkuc2xhdmVfZGVzdHJveQkJCT0gbXB0c2NzaWhfc2xhdmVfZGVzdHJveSwKIAkuY2hhbmdlX3F1ZXVlX2RlcHRoIAkJPSBtcHRzY3NpaF9jaGFuZ2VfcXVldWVfZGVwdGgsCi0JLmVoX2Fib3J0X2hhbmRsZXIJCT0gbXB0c2NzaWhfYWJvcnQsCi0JLmVoX2RldmljZV9yZXNldF9oYW5kbGVyCT0gbXB0c2NzaWhfZGV2X3Jlc2V0LAotCS5laF9idXNfcmVzZXRfaGFuZGxlcgkJPSBtcHRzY3NpaF9idXNfcmVzZXQsCi0JLmVoX2hvc3RfcmVzZXRfaGFuZGxlcgkJPSBtcHRzY3NpaF9ob3N0X3Jlc2V0LAorCS5laF9hYm9ydF9oYW5kbGVyCQk9IG1wdGZjX2Fib3J0LAorCS5laF9kZXZpY2VfcmVzZXRfaGFuZGxlcgk9IG1wdGZjX2Rldl9yZXNldCwKKwkuZWhfYnVzX3Jlc2V0X2hhbmRsZXIJCT0gbXB0ZmNfYnVzX3Jlc2V0LAorCS5laF9ob3N0X3Jlc2V0X2hhbmRsZXIJCT0gbXB0ZmNfaG9zdF9yZXNldCwKIAkuYmlvc19wYXJhbQkJCT0gbXB0c2NzaWhfYmlvc19wYXJhbSwKIAkuY2FuX3F1ZXVlCQkJPSBNUFRfRkNfQ0FOX1FVRVVFLAogCS50aGlzX2lkCQkJPSAtMSwKQEAgLTE3MSw2ICsxNzUsNzcgQEAKIAkuc2hvd19ob3N0X3N5bWJvbGljX25hbWUgPSAxLAogfTsKIAorc3RhdGljIGludAorbXB0ZmNfYmxvY2tfZXJyb3JfaGFuZGxlcihzdHJ1Y3Qgc2NzaV9jbW5kICpTQ3BudCwKKwkJCSAgaW50ICgqZnVuYykoc3RydWN0IHNjc2lfY21uZCAqU0NwbnQpLAorCQkJICBjb25zdCBjaGFyICpjYWxsZXIpCit7CisJc3RydWN0IHNjc2lfZGV2aWNlCSpzZGV2ID0gU0NwbnQtPmRldmljZTsKKwlzdHJ1Y3QgU2NzaV9Ib3N0CSpzaG9zdCA9IHNkZXYtPmhvc3Q7CisJc3RydWN0IGZjX3Jwb3J0CQkqcnBvcnQgPSBzdGFyZ2V0X3RvX3Jwb3J0KHNjc2lfdGFyZ2V0KHNkZXYpKTsKKwl1bnNpZ25lZCBsb25nCQlmbGFnczsKKwlpbnQJCQlyZWFkeTsKKworCXNwaW5fbG9ja19pcnFzYXZlKHNob3N0LT5ob3N0X2xvY2ssIGZsYWdzKTsKKwl3aGlsZSAoKHJlYWR5ID0gZmNfcmVtb3RlX3BvcnRfY2hrcmVhZHkocnBvcnQpID4+IDE2KSA9PSBESURfSU1NX1JFVFJZKSB7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoc2hvc3QtPmhvc3RfbG9jaywgZmxhZ3MpOworCQlkZmNwcmludGsgKChNWUlPQ19zX0lORk9fRk1UCisJCQkibXB0ZmNfYmxvY2tfZXJyb3JfaGFuZGxlci4lZDogJWQ6JWQsIHBvcnQgc3RhdHVzIGlzICIKKwkJCSJESURfSU1NX1JFVFJZLCBkZWZlcnJpbmcgJXMgcmVjb3ZlcnkuXG4iLAorCQkJKChNUFRfU0NTSV9IT1NUICopIHNob3N0LT5ob3N0ZGF0YSktPmlvYy0+bmFtZSwKKwkJCSgoTVBUX1NDU0lfSE9TVCAqKSBzaG9zdC0+aG9zdGRhdGEpLT5pb2MtPnNoLT5ob3N0X25vLAorCQkJU0NwbnQtPmRldmljZS0+aWQsU0NwbnQtPmRldmljZS0+bHVuLGNhbGxlcikpOworCQltc2xlZXAoMTAwMCk7CisJCXNwaW5fbG9ja19pcnFzYXZlKHNob3N0LT5ob3N0X2xvY2ssIGZsYWdzKTsKKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShzaG9zdC0+aG9zdF9sb2NrLCBmbGFncyk7CisKKwlpZiAocmVhZHkgPT0gRElEX05PX0NPTk5FQ1QgfHwgIVNDcG50LT5kZXZpY2UtPmhvc3RkYXRhKSB7CisJCWRmY3ByaW50ayAoKE1ZSU9DX3NfSU5GT19GTVQKKwkJCSIlcy4lZDogJWQ6JWQsIGZhaWxpbmcgcmVjb3ZlcnksICIKKwkJCSJwb3J0IHN0YXRlICVkLCB2ZGV2ICVwLlxuIiwgY2FsbGVyLAorCQkJKChNUFRfU0NTSV9IT1NUICopIHNob3N0LT5ob3N0ZGF0YSktPmlvYy0+bmFtZSwKKwkJCSgoTVBUX1NDU0lfSE9TVCAqKSBzaG9zdC0+aG9zdGRhdGEpLT5pb2MtPnNoLT5ob3N0X25vLAorCQkJU0NwbnQtPmRldmljZS0+aWQsU0NwbnQtPmRldmljZS0+bHVuLHJlYWR5LAorCQkJU0NwbnQtPmRldmljZS0+aG9zdGRhdGEpKTsKKwkJcmV0dXJuIEZBSUxFRDsKKwl9CisJZGZjcHJpbnRrICgoTVlJT0Nfc19JTkZPX0ZNVAorCQkiJXMuJWQ6ICVkOiVkLCBleGVjdXRpbmcgcmVjb3ZlcnkuXG4iLCBjYWxsZXIsCisJCSgoTVBUX1NDU0lfSE9TVCAqKSBzaG9zdC0+aG9zdGRhdGEpLT5pb2MtPm5hbWUsCisJCSgoTVBUX1NDU0lfSE9TVCAqKSBzaG9zdC0+aG9zdGRhdGEpLT5pb2MtPnNoLT5ob3N0X25vLAorCQlTQ3BudC0+ZGV2aWNlLT5pZCxTQ3BudC0+ZGV2aWNlLT5sdW4pKTsKKwlyZXR1cm4gKCpmdW5jKShTQ3BudCk7Cit9CisKK3N0YXRpYyBpbnQKK21wdGZjX2Fib3J0KHN0cnVjdCBzY3NpX2NtbmQgKlNDcG50KQoreworCXJldHVybgorCSAgICBtcHRmY19ibG9ja19lcnJvcl9oYW5kbGVyKFNDcG50LCBtcHRzY3NpaF9hYm9ydCwgX19GVU5DVElPTl9fKTsKK30KKworc3RhdGljIGludAorbXB0ZmNfZGV2X3Jlc2V0KHN0cnVjdCBzY3NpX2NtbmQgKlNDcG50KQoreworCXJldHVybgorCSAgICBtcHRmY19ibG9ja19lcnJvcl9oYW5kbGVyKFNDcG50LCBtcHRzY3NpaF9kZXZfcmVzZXQsIF9fRlVOQ1RJT05fXyk7Cit9CisKK3N0YXRpYyBpbnQKK21wdGZjX2J1c19yZXNldChzdHJ1Y3Qgc2NzaV9jbW5kICpTQ3BudCkKK3sKKwlyZXR1cm4KKwkgICAgbXB0ZmNfYmxvY2tfZXJyb3JfaGFuZGxlcihTQ3BudCwgbXB0c2NzaWhfYnVzX3Jlc2V0LCBfX0ZVTkNUSU9OX18pOworfQorCitzdGF0aWMgaW50CittcHRmY19ob3N0X3Jlc2V0KHN0cnVjdCBzY3NpX2NtbmQgKlNDcG50KQoreworCXJldHVybgorCSAgICBtcHRmY19ibG9ja19lcnJvcl9oYW5kbGVyKFNDcG50LCBtcHRzY3NpaF9ob3N0X3Jlc2V0LCBfX0ZVTkNUSU9OX18pOworfQorCiBzdGF0aWMgdm9pZAogbXB0ZmNfc2V0X3Jwb3J0X2xvc3NfdG1vKHN0cnVjdCBmY19ycG9ydCAqcnBvcnQsIHVpbnQzMl90IHRpbWVvdXQpCiB7CkBAIC01NjIsNiArNjM3LDEyIEBACiAJCXJldHVybiAwOwogCX0KIAorCWlmICghU0NwbnQtPmRldmljZS0+aG9zdGRhdGEpIHsJLyogdmRldiAqLworCQlTQ3BudC0+cmVzdWx0ID0gRElEX05PX0NPTk5FQ1QgPDwgMTY7CisJCWRvbmUoU0NwbnQpOworCQlyZXR1cm4gMDsKKwl9CisKIAkvKiBkZF9kYXRhIGlzIG51bGwgdW50aWwgZmluaXNoZWQgYWRkaW5nIHRhcmdldCAqLwogCXJpID0gKigoc3RydWN0IG1wdGZjX3Jwb3J0X2luZm8gKiopcnBvcnQtPmRkX2RhdGEpOwogCWlmICh1bmxpa2VseSghcmkpKSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lc3NhZ2UvaTJvL2J1cy1vc20uYyBiL2RyaXZlcnMvbWVzc2FnZS9pMm8vYnVzLW9zbS5jCmluZGV4IGFjMDZmMTAuLmQ5NmM2ODcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVzc2FnZS9pMm8vYnVzLW9zbS5jCisrKyBiL2RyaXZlcnMvbWVzc2FnZS9pMm8vYnVzLW9zbS5jCkBAIC04MCwxOCArODAsMjYgQEAKICAqCUBkZXY6IGRldmljZSB0byB2ZXJpZnkgaWYgaXQgaXMgYSBJMk8gQnVzIEFkYXB0ZXIgZGV2aWNlCiAgKgogICoJQmVjYXVzZSB3ZSB3YW50IGFsbCBCdXMgQWRhcHRlcnMgYWx3YXlzIHJldHVybiAwLgorICoJRXhjZXB0IHdoZW4gd2UgZmFpbC4gIFRoZW4gd2UgYXJlIHNhZC4KICAqCi0gKglSZXR1cm5zIDAuCisgKglSZXR1cm5zIDAsIGV4Y2VwdCB3aGVuIHdlIGZhaWwgdG8gZXhjZWwuCiAgKi8KIHN0YXRpYyBpbnQgaTJvX2J1c19wcm9iZShzdHJ1Y3QgZGV2aWNlICpkZXYpCiB7CiAJc3RydWN0IGkyb19kZXZpY2UgKmkyb19kZXYgPSB0b19pMm9fZGV2aWNlKGdldF9kZXZpY2UoZGV2KSk7CisJaW50IHJjOwogCi0JZGV2aWNlX2NyZWF0ZV9maWxlKGRldiwgJmRldl9hdHRyX3NjYW4pOworCXJjID0gZGV2aWNlX2NyZWF0ZV9maWxlKGRldiwgJmRldl9hdHRyX3NjYW4pOworCWlmIChyYykKKwkJZ290byBlcnJfb3V0OwogCiAJb3NtX2luZm8oImRldmljZSBhZGRlZCAoVElEOiAlMDN4KVxuIiwgaTJvX2Rldi0+bGN0X2RhdGEudGlkKTsKIAogCXJldHVybiAwOworCitlcnJfb3V0OgorCXB1dF9kZXZpY2UoZGV2KTsKKwlyZXR1cm4gcmM7CiB9OwogCiAvKioKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVzc2FnZS9pMm8vZXhlYy1vc20uYyBiL2RyaXZlcnMvbWVzc2FnZS9pMm8vZXhlYy1vc20uYwppbmRleCA3YmQ0ZDg1Li5hMjM1MDY0IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lc3NhZ2UvaTJvL2V4ZWMtb3NtLmMKKysrIGIvZHJpdmVycy9tZXNzYWdlL2kyby9leGVjLW9zbS5jCkBAIC0xMjQsMTAgKzEyNCwxMCBAQAogaW50IGkyb19tc2dfcG9zdF93YWl0X21lbShzdHJ1Y3QgaTJvX2NvbnRyb2xsZXIgKmMsIHN0cnVjdCBpMm9fbWVzc2FnZSAqbXNnLAogCQkJICB1bnNpZ25lZCBsb25nIHRpbWVvdXQsIHN0cnVjdCBpMm9fZG1hICpkbWEpCiB7Ci0JREVDTEFSRV9XQUlUX1FVRVVFX0hFQUQod3EpOworCURFQ0xBUkVfV0FJVF9RVUVVRV9IRUFEX09OU1RBQ0sod3EpOwogCXN0cnVjdCBpMm9fZXhlY193YWl0ICp3YWl0OwogCXN0YXRpYyB1MzIgdGNudHh0ID0gMHg4MDAwMDAwMDsKLQlsb25nIGZsYWdzOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJaW50IHJjID0gMDsKIAogCXdhaXQgPSBpMm9fZXhlY193YWl0X2FsbG9jKCk7CkBAIC0zMjUsMTMgKzMyNSwyNCBAQAogc3RhdGljIGludCBpMm9fZXhlY19wcm9iZShzdHJ1Y3QgZGV2aWNlICpkZXYpCiB7CiAJc3RydWN0IGkyb19kZXZpY2UgKmkyb19kZXYgPSB0b19pMm9fZGV2aWNlKGRldik7CisJaW50IHJjOwogCi0JaTJvX2V2ZW50X3JlZ2lzdGVyKGkyb19kZXYsICZpMm9fZXhlY19kcml2ZXIsIDAsIDB4ZmZmZmZmZmYpOworCXJjID0gaTJvX2V2ZW50X3JlZ2lzdGVyKGkyb19kZXYsICZpMm9fZXhlY19kcml2ZXIsIDAsIDB4ZmZmZmZmZmYpOworCWlmIChyYykgZ290byBlcnJfb3V0OwogCi0JZGV2aWNlX2NyZWF0ZV9maWxlKGRldiwgJmRldl9hdHRyX3ZlbmRvcl9pZCk7Ci0JZGV2aWNlX2NyZWF0ZV9maWxlKGRldiwgJmRldl9hdHRyX3Byb2R1Y3RfaWQpOworCXJjID0gZGV2aWNlX2NyZWF0ZV9maWxlKGRldiwgJmRldl9hdHRyX3ZlbmRvcl9pZCk7CisJaWYgKHJjKSBnb3RvIGVycl9ldnRyZWc7CisJcmMgPSBkZXZpY2VfY3JlYXRlX2ZpbGUoZGV2LCAmZGV2X2F0dHJfcHJvZHVjdF9pZCk7CisJaWYgKHJjKSBnb3RvIGVycl92aWQ7CiAKIAlyZXR1cm4gMDsKKworZXJyX3ZpZDoKKwlkZXZpY2VfcmVtb3ZlX2ZpbGUoZGV2LCAmZGV2X2F0dHJfdmVuZG9yX2lkKTsKK2Vycl9ldnRyZWc6CisJaTJvX2V2ZW50X3JlZ2lzdGVyKHRvX2kyb19kZXZpY2UoZGV2KSwgJmkyb19leGVjX2RyaXZlciwgMCwgMCk7CitlcnJfb3V0OgorCXJldHVybiByYzsKIH07CiAKIC8qKgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9taXNjL0tjb25maWcgYi9kcml2ZXJzL21pc2MvS2NvbmZpZwppbmRleCAzZGYwZTdhLi4wMGRiMzFjIDEwMDY0NAotLS0gYS9kcml2ZXJzL21pc2MvS2NvbmZpZworKysgYi9kcml2ZXJzL21pc2MvS2NvbmZpZwpAQCAtMjgsNiArMjgsMTggQEAKIAogCSAgSWYgdW5zdXJlLCBzYXkgTi4KIAorY29uZmlnIFNHSV9JT0M0CisJdHJpc3RhdGUgIlNHSSBJT0M0IEJhc2UgSU8gc3VwcG9ydCIKKwlkZXBlbmRzIG9uIFBDSQorCS0tLWhlbHAtLS0KKwkgIFRoaXMgb3B0aW9uIGVuYWJsZXMgYmFzaWMgc3VwcG9ydCBmb3IgdGhlIElPQzQgY2hpcCBvbiBjZXJ0YWluCisJICBTR0kgSU8gY29udHJvbGxlciBjYXJkcyAoSU85LCBJTzEwLCBhbmQgUENJLVJUKS4gIFRoaXMgb3B0aW9uCisJICBkb2VzIG5vdCBlbmFibGUgYW55IHNwZWNpZmljIGZ1bmN0aW9ucyBvbiBzdWNoIGEgY2FyZCwgYnV0IHByb3ZpZGVzCisJICBuZWNlc3NhcnkgaW5mcmFzdHJ1Y3R1cmUgZm9yIG90aGVyIGRyaXZlcnMgdG8gdXRpbGl6ZS4KKworCSAgSWYgeW91IGhhdmUgYW4gU0dJIEFsdGl4IHdpdGggYW4gSU9DNC1iYXNlZCBjYXJkIHNheSBZLgorCSAgT3RoZXJ3aXNlIHNheSBOLgorCiBjb25maWcgVElGTV9DT1JFCiAJdHJpc3RhdGUgIlRJIEZsYXNoIE1lZGlhIGludGVyZmFjZSBzdXBwb3J0IChFWFBFUklNRU5UQUwpIgogCWRlcGVuZHMgb24gRVhQRVJJTUVOVEFMCkBAIC01Nyw0ICs2OSwyMyBAQAogICAgICAgICAgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZSBtb2R1bGUgd2lsbAogCSAgYmUgY2FsbGVkIHRpZm1fN3h4MS4KIAorY29uZmlnIE1TSV9MQVBUT1AKKyAgICAgICAgdHJpc3RhdGUgIk1TSSBMYXB0b3AgRXh0cmFzIgorICAgICAgICBkZXBlbmRzIG9uIFg4NgorICAgICAgICBkZXBlbmRzIG9uIEFDUElfRUMKKyAgICAgICAgZGVwZW5kcyBvbiBCQUNLTElHSFRfQ0xBU1NfREVWSUNFCisgICAgICAgIC0tLWhlbHAtLS0KKwkgIFRoaXMgaXMgYSBkcml2ZXIgZm9yIGxhcHRvcHMgYnVpbHQgYnkgTVNJIChNSUNSTy1TVEFSCisJICBJTlRFUk5BVElPTkFMKToKKworCSAgTVNJIE1lZ2FCb29rIFMyNzAgKE1TLTEwMTMpCisJICBDeXRyb24vVENNL01lZGlvbi9UY2hpYm8gTUQ5NjEwMC9TQU0yMDAwCisKKwkgIEl0IGFkZHMgc3VwcG9ydCBmb3IgQmx1ZXRvb3RoLCBXTEFOIGFuZCBMQ0QgYnJpZ2h0bmVzcyBjb250cm9sLgorCisJICBNb3JlIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgZHJpdmVyIGlzIGF2YWlsYWJsZSBhdAorCSAgPGh0dHA6Ly8wcG9pbnRlci5kZS9sZW5uYXJ0L3RjaGliby5odG1sPi4KKworCSAgSWYgeW91IGhhdmUgYW4gTVNJIFMyNzAgbGFwdG9wLCBzYXkgWSBvciBNIGhlcmUuCisKIGVuZG1lbnUKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWlzYy9NYWtlZmlsZSBiL2RyaXZlcnMvbWlzYy9NYWtlZmlsZQppbmRleCBkNjVlY2U3Li5jOWU5OGFiIDEwMDY0NAotLS0gYS9kcml2ZXJzL21pc2MvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9taXNjL01ha2VmaWxlCkBAIC01LDYgKzUsOCBAQAogCiBvYmotJChDT05GSUdfSUJNX0FTTSkJCSs9IGlibWFzbS8KIG9iai0kKENPTkZJR19IRFBVX0ZFQVRVUkVTKQkrPSBoZHB1ZnRycy8KK29iai0kKENPTkZJR19NU0lfTEFQVE9QKSAgICAgKz0gbXNpLWxhcHRvcC5vCiBvYmotJChDT05GSUdfTEtEVE0pCQkrPSBsa2R0bS5vCiBvYmotJChDT05GSUdfVElGTV9DT1JFKSAgICAgICAJKz0gdGlmbV9jb3JlLm8KIG9iai0kKENPTkZJR19USUZNXzdYWDEpICAgICAgIAkrPSB0aWZtXzd4eDEubworb2JqLSQoQ09ORklHX1NHSV9JT0M0KQkJKz0gaW9jNC5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL3NuL2lvYzQuYyBiL2RyaXZlcnMvbWlzYy9pb2M0LmMKc2ltaWxhcml0eSBpbmRleCA5MiUKcmVuYW1lIGZyb20gZHJpdmVycy9zbi9pb2M0LmMKcmVuYW1lIHRvIGRyaXZlcnMvbWlzYy9pb2M0LmMKaW5kZXggODU2MjgyMS4uYjk5NWExNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zbi9pb2M0LmMKKysrIGIvZHJpdmVycy9taXNjL2lvYzQuYwpAQCAtMyw3ICszLDcgQEAKICAqIExpY2Vuc2UuICBTZWUgdGhlIGZpbGUgIkNPUFlJTkciIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGlzIGFyY2hpdmUKICAqIGZvciBtb3JlIGRldGFpbHMuCiAgKgotICogQ29weXJpZ2h0IChDKSAyMDA1IFNpbGljb24gR3JhcGhpY3MsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDUtMjAwNiBTaWxpY29uIEdyYXBoaWNzLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICovCiAKIC8qIFRoaXMgZmlsZSBjb250YWlucyB0aGUgbWFzdGVyIGRyaXZlciBtb2R1bGUgZm9yIHVzZSBieSBTR0kgSU9DNCBzdWJkcml2ZXJzLgpAQCAtMjksMTIgKzI5LDEwIEBACiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvcGNpLmg+CiAjaW5jbHVkZSA8bGludXgvaW9jNC5oPgotI2luY2x1ZGUgPGxpbnV4L21tdGltZXIuaD4KLSNpbmNsdWRlIDxsaW51eC9ydGMuaD4KKyNpbmNsdWRlIDxsaW51eC9rdGltZS5oPgogI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+Ci0jaW5jbHVkZSA8YXNtL3NuL2FkZHJzLmg+Ci0jaW5jbHVkZSA8YXNtL3NuL2Nsa3N1cHBvcnQuaD4KLSNpbmNsdWRlIDxhc20vc24vc2h1Yl9tbXIuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CiAKIC8qKioqKioqKioqKioqKioKICAqIERlZmluaXRpb25zICoKQEAgLTQzLDcgKzQxLDcgQEAKIC8qIFR3ZWFrYWJsZSB2YWx1ZXMgKi8KIAogLyogUENJIGJ1cyBzcGVlZCBkZXRlY3Rpb24vY2FsaWJyYXRpb24gKi8KLSNkZWZpbmUgSU9DNF9DQUxJQlJBVEVfQ09VTlQgNjMJLyogQ2FsaWJyYXRpb24gY3ljbGUgcGVyaW9kICovCisjZGVmaW5lIElPQzRfQ0FMSUJSQVRFX0NPVU5UIDYzCQkvKiBDYWxpYnJhdGlvbiBjeWNsZSBwZXJpb2QgKi8KICNkZWZpbmUgSU9DNF9DQUxJQlJBVEVfQ1lDTEVTIDI1NgkvKiBBdmVyYWdlIG92ZXIgdGhpcyBtYW55IGN5Y2xlcyAqLwogI2RlZmluZSBJT0M0X0NBTElCUkFURV9ESVNDQVJEIDIJLyogRGlzY2FyZCBmaXJzdCBmZXcgY3ljbGVzICovCiAjZGVmaW5lIElPQzRfQ0FMSUJSQVRFX0xPV19NSFogMjUJLyogTG93ZXIgYm91bmQgb24gYnVzIHNwZWVkIHNhbml0eSAqLwpAQCAtMTQzLDExICsxNDEsMTEgQEAKIHN0YXRpYyB2b2lkCiBpb2M0X2Nsb2NrX2NhbGlicmF0ZShzdHJ1Y3QgaW9jNF9kcml2ZXJfZGF0YSAqaWRkKQogewotCWV4dGVybiB1bnNpZ25lZCBsb25nIHNuX3J0Y19jeWNsZXNfcGVyX3NlY29uZDsKIAl1bmlvbiBpb2M0X2ludF9vdXQgaW50X291dDsKIAl1bmlvbiBpb2M0X2dwY3IgZ3BjcjsKIAl1bnNpZ25lZCBpbnQgc3RhdGUsIGxhc3Rfc3RhdGUgPSAxOwotCXVpbnQ2NF90IHN0YXJ0ID0gMCwgZW5kLCBwZXJpb2Q7CisJc3RydWN0IHRpbWVzcGVjIHN0YXJ0X3RzLCBlbmRfdHM7CisJdWludDY0X3Qgc3RhcnQsIGVuZCwgcGVyaW9kOwogCXVuc2lnbmVkIGludCBjb3VudCA9IDA7CiAKIAkvKiBFbmFibGUgb3V0cHV0ICovCkBAIC0xNzUsMzAgKzE3MywyOCBAQAogCQlpZiAoIWxhc3Rfc3RhdGUgJiYgc3RhdGUpIHsKIAkJCWNvdW50Kys7CiAJCQlpZiAoY291bnQgPT0gSU9DNF9DQUxJQlJBVEVfRU5EKSB7Ci0JCQkJZW5kID0gcnRjX3RpbWUoKTsKKwkJCQlrdGltZV9nZXRfdHMoJmVuZF90cyk7CiAJCQkJYnJlYWs7CiAJCQl9IGVsc2UgaWYgKGNvdW50ID09IElPQzRfQ0FMSUJSQVRFX0RJU0NBUkQpCi0JCQkJc3RhcnQgPSBydGNfdGltZSgpOworCQkJCWt0aW1lX2dldF90cygmc3RhcnRfdHMpOwogCQl9CiAJCWxhc3Rfc3RhdGUgPSBzdGF0ZTsKIAl9IHdoaWxlICgxKTsKIAogCS8qIENhbGN1bGF0aW9uIHJlYXJyYW5nZWQgdG8gcHJlc2VydmUgaW50ZXJtZWRpYXRlIHByZWNpc2lvbi4KIAkgKiBMb2dpY2FsbHk6Ci0JICogMS4gImVuZCAtIHN0YXJ0IiBnaXZlcyB1cyBudW1iZXIgb2YgUlRDIGN5Y2xlcyBvdmVyIGFsbCB0aGUKLQkgKiAgICBzcXVhcmUgd2F2ZSBjeWNsZXMgbWVhc3VyZWQuCi0JICogMi4gRGl2aWRlIGJ5IG51bWJlciBvZiBzcXVhcmUgd2F2ZSBjeWNsZXMgdG8gZ2V0IG51bWJlciBvZgotCSAqICAgIFJUQyBjeWNsZXMgcGVyIHNxdWFyZSB3YXZlIGN5Y2xlLgorCSAqIDEuICJlbmQgLSBzdGFydCIgZ2l2ZXMgdXMgdGhlIG1lYXN1cmVtZW50IHBlcmlvZCBvdmVyIGFsbAorCSAqICAgIHRoZSBzcXVhcmUgd2F2ZSBjeWNsZXMuCisJICogMi4gRGl2aWRlIGJ5IG51bWJlciBvZiBzcXVhcmUgd2F2ZSBjeWNsZXMgdG8gZ2V0IHRoZSBwZXJpb2QKKwkgKiAgICBvZiBhIHNxdWFyZSB3YXZlIGN5Y2xlLgogCSAqIDMuIERpdmlkZSBieSAyKihpbnRfb3V0LmZpZWxkcy5jb3VudCsxKSwgd2hpY2ggaXMgdGhlIGZvcm11bGEKIAkgKiAgICBieSB3aGljaCB0aGUgSU9DNCBnZW5lcmF0ZXMgdGhlIHNxdWFyZSB3YXZlLCB0byBnZXQgdGhlCi0JICogICAgbnVtYmVyIG9mIFJUQyBjeWNsZXMgcGVyIElPQzQgSU5UX09VVCBjb3VudC4KLQkgKiA0LiBEaXZpZGUgYnkgc25fcnRjX2N5Y2xlc19wZXJfc2Vjb25kIHRvIGdldCBzZWNvbmRzIHBlcgotCSAqICAgIGNvdW50LgotCSAqIDUuIE11bHRpcGx5IGJ5IDFFOSB0byBnZXQgbmFub3NlY29uZHMgcGVyIGNvdW50LgorCSAqICAgIHBlcmlvZCBvZiBhbiBJT0M0IElOVF9PVVQgY291bnQuCiAJICovCi0JcGVyaW9kID0gKChlbmQgLSBzdGFydCkgKiAxMDAwMDAwMDAwKSAvCi0JICAgIChJT0M0X0NBTElCUkFURV9DWUNMRVMgKiAyICogKElPQzRfQ0FMSUJSQVRFX0NPVU5UICsgMSkKLQkgICAgICogc25fcnRjX2N5Y2xlc19wZXJfc2Vjb25kKTsKKwllbmQgPSBlbmRfdHMudHZfc2VjICogTlNFQ19QRVJfU0VDICsgZW5kX3RzLnR2X25zZWM7CisJc3RhcnQgPSBzdGFydF90cy50dl9zZWMgKiBOU0VDX1BFUl9TRUMgKyBzdGFydF90cy50dl9uc2VjOworCXBlcmlvZCA9IChlbmQgLSBzdGFydCkgLworCQkoSU9DNF9DQUxJQlJBVEVfQ1lDTEVTICogMiAqIChJT0M0X0NBTElCUkFURV9DT1VOVCArIDEpKTsKIAogCS8qIEJvdW5kcyBjaGVjayB0aGUgcmVzdWx0LiAqLwogCWlmIChwZXJpb2QgPiBJT0M0X0NBTElCUkFURV9MT1dfTElNSVQgfHwKQEAgLTIxMCwxMCArMjA2LDEyIEBACiAJCSAgICAgICBJT0M0X0NBTElCUkFURV9ERUZBVUxUIC8gSU9DNF9FWFRJTlRfQ09VTlRfRElWSVNPUik7CiAJCXBlcmlvZCA9IElPQzRfQ0FMSUJSQVRFX0RFRkFVTFQ7CiAJfSBlbHNlIHsKKwkJdTY0IG5zID0gcGVyaW9kOworCisJCWRvX2RpdihucywgSU9DNF9FWFRJTlRfQ09VTlRfRElWSVNPUik7CiAJCXByaW50ayhLRVJOX0RFQlVHCi0JCSAgICAgICAiSU9DNCAlczogUENJIGNsb2NrIGlzICVsZCBucy5cbiIsCi0JCSAgICAgICBwY2lfbmFtZShpZGQtPmlkZF9wZGV2KSwKLQkJICAgICAgIHBlcmlvZCAvIElPQzRfRVhUSU5UX0NPVU5UX0RJVklTT1IpOworCQkgICAgICAgIklPQzQgJXM6IFBDSSBjbG9jayBpcyAlbGx1IG5zLlxuIiwKKwkJICAgICAgIHBjaV9uYW1lKGlkZC0+aWRkX3BkZXYpLCAodW5zaWduZWQgbG9uZyBsb25nKW5zKTsKIAl9CiAKIAkvKiBSZW1lbWJlciByZXN1bHRzLiAgV2Ugc3RvcmUgdGhlIGV4dGludCBjbG9jayBwZXJpb2QgcmF0aGVyCmRpZmYgLS1naXQgYS9kcml2ZXJzL21pc2MvbGtkdG0uYyBiL2RyaXZlcnMvbWlzYy9sa2R0bS5jCmluZGV4IGJiZGJhN2IuLmRiOWQ3ZGYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWlzYy9sa2R0bS5jCisrKyBiL2RyaXZlcnMvbWlzYy9sa2R0bS5jCkBAIC00NCwxMiArNDQsMTQgQEAKICAqLwogCiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9idWZmZXJfaGVhZC5oPgogI2luY2x1ZGUgPGxpbnV4L2twcm9iZXMuaD4KLSNpbmNsdWRlIDxsaW51eC9rYWxsc3ltcy5oPgorI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0jaW5jbHVkZSA8bGludXgvaXJxLmg+CiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvaHJ0aW1lci5oPgogI2luY2x1ZGUgPHNjc2kvc2NzaV9jbW5kLmg+CiAKICNpZmRlZiBDT05GSUdfSURFCkBAIC0xMTYsMTYgKzExOCwxNiBAQAogc3RhdGljIGludCBjb3VudCA9IERFRkFVTFRfQ09VTlQ7CiAKIG1vZHVsZV9wYXJhbShyZWN1cl9jb3VudCwgaW50LCAwNjQ0KTsKLU1PRFVMRV9QQVJNX0RFU0MocmVjdXJfY291bnQsICJSZWN1cmNpb24gbGV2ZWwgZm9yIHRoZSBzdGFjayBvdmVyZmxvdyB0ZXN0LFwKLQkJCQkgZGVmYXVsdCBpcyAxMCIpOworTU9EVUxFX1BBUk1fREVTQyhyZWN1cl9jb3VudCwgIiBSZWN1cnNpb24gbGV2ZWwgZm9yIHRoZSBzdGFjayBvdmVyZmxvdyB0ZXN0LCAiXAorCQkJCSAiZGVmYXVsdCBpcyAxMCIpOwogbW9kdWxlX3BhcmFtKGNwb2ludF9uYW1lLCBjaGFycCwgMDY0NCk7Ci1NT0RVTEVfUEFSTV9ERVNDKGNwb2ludF9uYW1lLCAiQ3Jhc2ggUG9pbnQsIHdoZXJlIGtlcm5lbCBpcyB0byBiZSBjcmFzaGVkIik7Ci1tb2R1bGVfcGFyYW0oY3BvaW50X3R5cGUsIGNoYXJwLCAwNjQ0NCk7Ci1NT0RVTEVfUEFSTV9ERVNDKGNwb2ludF90eXBlLCAiQ3Jhc2ggUG9pbnQgVHlwZSwgYWN0aW9uIHRvIGJlIHRha2VuIG9uXAotCQkJCWhpdHRpbmcgdGhlIGNyYXNoIHBvaW50Iik7Ci1tb2R1bGVfcGFyYW0oY3BvaW50X2NvdW50LCBpbnQsIDA2NDQ0KTsKLU1PRFVMRV9QQVJNX0RFU0MoY3BvaW50X2NvdW50LCAiQ3Jhc2ggUG9pbnQgQ291bnQsIG51bWJlciBvZiB0aW1lcyB0aGUgXAotCQkJCWNyYXNoIHBvaW50IGlzIHRvIGJlIGhpdCB0byB0cmlnZ2VyIGFjdGlvbiIpOworTU9EVUxFX1BBUk1fREVTQyhjcG9pbnRfbmFtZSwgIiBDcmFzaCBQb2ludCwgd2hlcmUga2VybmVsIGlzIHRvIGJlIGNyYXNoZWQiKTsKK21vZHVsZV9wYXJhbShjcG9pbnRfdHlwZSwgY2hhcnAsIDA2NDQpOworTU9EVUxFX1BBUk1fREVTQyhjcG9pbnRfdHlwZSwgIiBDcmFzaCBQb2ludCBUeXBlLCBhY3Rpb24gdG8gYmUgdGFrZW4gb24gIlwKKwkJCQkiaGl0dGluZyB0aGUgY3Jhc2ggcG9pbnQiKTsKK21vZHVsZV9wYXJhbShjcG9pbnRfY291bnQsIGludCwgMDY0NCk7CitNT0RVTEVfUEFSTV9ERVNDKGNwb2ludF9jb3VudCwgIiBDcmFzaCBQb2ludCBDb3VudCwgbnVtYmVyIG9mIHRpbWVzIHRoZSAiXAorCQkJCSJjcmFzaCBwb2ludCBpcyB0byBiZSBoaXQgdG8gdHJpZ2dlciBhY3Rpb24iKTsKIAogdW5zaWduZWQgaW50IGpwX2RvX2lycSh1bnNpZ25lZCBpbnQgaXJxKQogewpAQCAtMTU1LDggKzE1Nyw4IEBACiAKIHN0cnVjdCBzY2FuX2NvbnRyb2w7CiAKLXVuc2lnbmVkIGxvbmcganBfc2hyaW5rX3BhZ2VfbGlzdChzdHJ1Y3QgbGlzdF9oZWFkICpwYWdlX2xpc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHNjYW5fY29udHJvbCAqc2MpCit1bnNpZ25lZCBsb25nIGpwX3Nocmlua19pbmFjdGl2ZV9saXN0KHVuc2lnbmVkIGxvbmcgbWF4X3NjYW4sCisJCQkJc3RydWN0IHpvbmUgKnpvbmUsIHN0cnVjdCBzY2FuX2NvbnRyb2wgKnNjKQogewogCWxrZHRtX2hhbmRsZXIoKTsKIAlqcHJvYmVfcmV0dXJuKCk7CkBAIC0yOTUsOCArMjk3LDggQEAKIAkJbGtkdG0uZW50cnkgPSAoa3Byb2JlX29wY29kZV90KikganBfbGxfcndfYmxvY2s7CiAJCWJyZWFrOwogCWNhc2UgTUVNX1NXQVBPVVQ6Ci0JCWxrZHRtLmtwLnN5bWJvbF9uYW1lID0gInNocmlua19wYWdlX2xpc3QiOwotCQlsa2R0bS5lbnRyeSA9IChrcHJvYmVfb3Bjb2RlX3QqKSBqcF9zaHJpbmtfcGFnZV9saXN0OworCQlsa2R0bS5rcC5zeW1ib2xfbmFtZSA9ICJzaHJpbmtfaW5hY3RpdmVfbGlzdCI7CisJCWxrZHRtLmVudHJ5ID0gKGtwcm9iZV9vcGNvZGVfdCopIGpwX3Nocmlua19pbmFjdGl2ZV9saXN0OwogCQlicmVhazsKIAljYXNlIFRJTUVSQUREOgogCQlsa2R0bS5rcC5zeW1ib2xfbmFtZSA9ICJocnRpbWVyX3N0YXJ0IjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWlzYy9tc2ktbGFwdG9wLmMgYi9kcml2ZXJzL21pc2MvbXNpLWxhcHRvcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZkYjcxNTMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21pc2MvbXNpLWxhcHRvcC5jCkBAIC0wLDAgKzEsMzk1IEBACisvKi0qLWxpbnV4LWMtKi0qLworCisvKgorICBDb3B5cmlnaHQgKEMpIDIwMDYgTGVubmFydCBQb2V0dGVyaW5nIDxtenhyZWFyeSAoYXQpIDBwb2ludGVyIChkb3QpIGRlPgorCisgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BCisgIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisvKgorICogbXNpLWxhcHRvcC5jIC0gTVNJIFMyNzAgbGFwdG9wIHN1cHBvcnQuIFRoaXMgbGFwdG9wIGlzIHNvbGQgdW5kZXIKKyAqIHZhcmlvdXMgYnJhbmRzLCBpbmNsdWRpbmcgIkN5dHJvbi9UQ00vTWVkaW9uL1RjaGlibyBNRDk2MTAwIi4KKyAqCisgKiBUaGlzIGRyaXZlciBleHBvcnRzIGEgZmV3IGZpbGVzIGluIC9zeXMvZGV2aWNlcy9wbGF0Zm9ybS9tc2ktbGFwdG9wLXBmLzoKKyAqCisgKiAgIGxjZF9sZXZlbCAtIFNjcmVlbiBicmlnaHRuZXNzOiBjb250YWlucyBhIHNpbmdsZSBpbnRlZ2VyIGluIHRoZQorICogICByYW5nZSAwLi44LiAocncpCisgKgorICogICBhdXRvX2JyaWdodG5lc3MgLSBFbmFibGUgYXV0b21hdGljIGJyaWdodG5lc3MgY29udHJvbDogY29udGFpbnMKKyAqICAgZWl0aGVyIDAgb3IgMS4gSWYgc2V0IHRvIDEgdGhlIGhhcmR3YXJlIGFkanVzdHMgdGhlIHNjcmVlbgorICogICBicmlnaHRuZXNzIGF1dG9tYXRpY2FsbHkgd2hlbiB0aGUgcG93ZXIgY29yZCBpcworICogICBwbHVnZ2VkL3VucGx1Z2dlZC4gKHJ3KQorICoKKyAqICAgd2xhbiAtIFdMQU4gc3Vic3lzdGVtIGVuYWJsZWQ6IGNvbnRhaW5zIGVpdGhlciAwIG9yIDEuIChybykKKyAqCisgKiAgIGJsdWV0b290aCAtIEJsdWV0b290aCBzdWJzeXN0ZW0gZW5hYmxlZDogY29udGFpbnMgZWl0aGVyIDAgb3IgMQorICogICBQbGVhc2Ugbm90ZSB0aGF0IHRoaXMgZmlsZSBpcyBjb25zdGFudGx5IDAgaWYgbm8gQmx1ZXRvb3RoCisgKiAgIGhhcmR3YXJlIGlzIGF2YWlsYWJsZS4gKHJvKQorICoKKyAqIEluIGFkZGl0aW9uIHRvIHRoZXNlIHBsYXRmb3JtIGRldmljZSBhdHRyaWJ1dGVzIHRoZSBkcml2ZXIKKyAqIHJlZ2lzdGVycyBpdHNlbGYgaW4gdGhlIExpbnV4IGJhY2tsaWdodCBjb250cm9sIHN1YnN5c3RlbSBhbmQgaXMKKyAqIGF2YWlsYWJsZSB0byB1c2Vyc3BhY2UgdW5kZXIgL3N5cy9jbGFzcy9iYWNrbGlnaHQvbXNpLWxhcHRvcC1ibC8uCisgKgorICogVGhpcyBkcml2ZXIgbWlnaHQgd29yayBvbiBvdGhlciBsYXB0b3BzIHByb2R1Y2VkIGJ5IE1TSS4gSWYgeW91CisgKiB3YW50IHRvIHRyeSBpdCB5b3UgY2FuIHBhc3MgZm9yY2U9MSBhcyBhcmd1bWVudCB0byB0aGUgbW9kdWxlIHdoaWNoCisgKiB3aWxsIGZvcmNlIGl0IHRvIGxvYWQgZXZlbiB3aGVuIHRoZSBETUkgZGF0YSBkb2Vzbid0IGlkZW50aWZ5IHRoZQorICogbGFwdG9wIGFzIE1TSSBTMjcwLiBZTU1WLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvYWNwaS5oPgorI2luY2x1ZGUgPGxpbnV4L2RtaS5oPgorI2luY2x1ZGUgPGxpbnV4L2JhY2tsaWdodC5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2F1dG9jb25mLmg+CisKKyNkZWZpbmUgTVNJX0RSSVZFUl9WRVJTSU9OICIwLjUiCisKKyNkZWZpbmUgTVNJX0xDRF9MRVZFTF9NQVggOQorCisjZGVmaW5lIE1TSV9FQ19DT01NQU5EX1dJUkVMRVNTIDB4MTAKKyNkZWZpbmUgTVNJX0VDX0NPTU1BTkRfTENEX0xFVkVMIDB4MTEKKworc3RhdGljIGludCBmb3JjZTsKK21vZHVsZV9wYXJhbShmb3JjZSwgYm9vbCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKGZvcmNlLCAiRm9yY2UgZHJpdmVyIGxvYWQsIGlnbm9yZSBETUkgZGF0YSIpOworCitzdGF0aWMgaW50IGF1dG9fYnJpZ2h0bmVzczsKK21vZHVsZV9wYXJhbShhdXRvX2JyaWdodG5lc3MsIGludCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKGF1dG9fYnJpZ2h0bmVzcywgIkVuYWJsZSBhdXRvbWF0aWMgYnJpZ2h0bmVzcyBjb250cm9sICgwOiBkaXNhYmxlZDsgMTogZW5hYmxlZDsgMjogZG9uJ3QgdG91Y2gpIik7CisKKy8qIEhhcmR3YXJlIGFjY2VzcyAqLworCitzdGF0aWMgaW50IHNldF9sY2RfbGV2ZWwoaW50IGxldmVsKQoreworCXU4IGJ1ZlsyXTsKKworCWlmIChsZXZlbCA8IDAgfHwgbGV2ZWwgPj0gTVNJX0xDRF9MRVZFTF9NQVgpCisJCXJldHVybiAtRUlOVkFMOworCisJYnVmWzBdID0gMHg4MDsKKwlidWZbMV0gPSAodTgpIChsZXZlbCozMSk7CisKKwlyZXR1cm4gZWNfdHJhbnNhY3Rpb24oTVNJX0VDX0NPTU1BTkRfTENEX0xFVkVMLCBidWYsIHNpemVvZihidWYpLCBOVUxMLCAwKTsKK30KKworc3RhdGljIGludCBnZXRfbGNkX2xldmVsKHZvaWQpCit7CisJdTggd2RhdGEgPSAwLCByZGF0YTsKKwlpbnQgcmVzdWx0OworCisJcmVzdWx0ID0gZWNfdHJhbnNhY3Rpb24oTVNJX0VDX0NPTU1BTkRfTENEX0xFVkVMLCAmd2RhdGEsIDEsICZyZGF0YSwgMSk7CisJaWYgKHJlc3VsdCA8IDApCisJCXJldHVybiByZXN1bHQ7CisKKwlyZXR1cm4gKGludCkgcmRhdGEgLyAzMTsKK30KKworc3RhdGljIGludCBnZXRfYXV0b19icmlnaHRuZXNzKHZvaWQpCit7CisJdTggd2RhdGEgPSA0LCByZGF0YTsKKwlpbnQgcmVzdWx0OworCisJcmVzdWx0ID0gZWNfdHJhbnNhY3Rpb24oTVNJX0VDX0NPTU1BTkRfTENEX0xFVkVMLCAmd2RhdGEsIDEsICZyZGF0YSwgMSk7CisJaWYgKHJlc3VsdCA8IDApCisJCXJldHVybiByZXN1bHQ7CisKKwlyZXR1cm4gISEocmRhdGEgJiA4KTsKK30KKworc3RhdGljIGludCBzZXRfYXV0b19icmlnaHRuZXNzKGludCBlbmFibGUpCit7CisJdTggd2RhdGFbMl0sIHJkYXRhOworCWludCByZXN1bHQ7CisKKwl3ZGF0YVswXSA9IDQ7CisKKwlyZXN1bHQgPSBlY190cmFuc2FjdGlvbihNU0lfRUNfQ09NTUFORF9MQ0RfTEVWRUwsIHdkYXRhLCAxLCAmcmRhdGEsIDEpOworCWlmIChyZXN1bHQgPCAwKQorCQlyZXR1cm4gcmVzdWx0OworCisJd2RhdGFbMF0gPSAweDg0OworCXdkYXRhWzFdID0gKHJkYXRhICYgMHhGNykgfCAoZW5hYmxlID8gOCA6IDApOworCisJcmV0dXJuIGVjX3RyYW5zYWN0aW9uKE1TSV9FQ19DT01NQU5EX0xDRF9MRVZFTCwgd2RhdGEsIDIsIE5VTEwsIDApOworfQorCitzdGF0aWMgaW50IGdldF93aXJlbGVzc19zdGF0ZShpbnQgKndsYW4sIGludCAqYmx1ZXRvb3RoKQoreworCXU4IHdkYXRhID0gMCwgcmRhdGE7CisJaW50IHJlc3VsdDsKKworCXJlc3VsdCA9IGVjX3RyYW5zYWN0aW9uKE1TSV9FQ19DT01NQU5EX1dJUkVMRVNTLCAmd2RhdGEsIDEsICZyZGF0YSwgMSk7CisJaWYgKHJlc3VsdCA8IDApCisJCXJldHVybiAtMTsKKworCWlmICh3bGFuKQorCQkqd2xhbiA9ICEhKHJkYXRhICYgOCk7CisKKwlpZiAoYmx1ZXRvb3RoKQorCQkqYmx1ZXRvb3RoID0gISEocmRhdGEgJiAxMjgpOworCisJcmV0dXJuIDA7Cit9CisKKy8qIEJhY2tsaWdodCBkZXZpY2Ugc3R1ZmYgKi8KKworc3RhdGljIGludCBibF9nZXRfYnJpZ2h0bmVzcyhzdHJ1Y3QgYmFja2xpZ2h0X2RldmljZSAqYikKK3sKKwlyZXR1cm4gZ2V0X2xjZF9sZXZlbCgpOworfQorCisKK3N0YXRpYyBpbnQgYmxfdXBkYXRlX3N0YXR1cyhzdHJ1Y3QgYmFja2xpZ2h0X2RldmljZSAqYikKK3sKKwlyZXR1cm4gc2V0X2xjZF9sZXZlbChiLT5wcm9wcy0+YnJpZ2h0bmVzcyk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgYmFja2xpZ2h0X3Byb3BlcnRpZXMgbXNpYmxfcHJvcHMgPSB7CisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCS5nZXRfYnJpZ2h0bmVzcyA9IGJsX2dldF9icmlnaHRuZXNzLAorCS51cGRhdGVfc3RhdHVzICA9IGJsX3VwZGF0ZV9zdGF0dXMsCisJLm1heF9icmlnaHRuZXNzID0gTVNJX0xDRF9MRVZFTF9NQVgtMSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgYmFja2xpZ2h0X2RldmljZSAqbXNpYmxfZGV2aWNlOworCisvKiBQbGF0Zm9ybSBkZXZpY2UgKi8KKworc3RhdGljIHNzaXplX3Qgc2hvd193bGFuKHN0cnVjdCBkZXZpY2UgKmRldiwKKwlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQoreworCisJaW50IHJldCwgZW5hYmxlZDsKKworCXJldCA9IGdldF93aXJlbGVzc19zdGF0ZSgmZW5hYmxlZCwgTlVMTCk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlaVxuIiwgZW5hYmxlZCk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHNob3dfYmx1ZXRvb3RoKHN0cnVjdCBkZXZpY2UgKmRldiwKKwlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQoreworCisJaW50IHJldCwgZW5hYmxlZDsKKworCXJldCA9IGdldF93aXJlbGVzc19zdGF0ZShOVUxMLCAmZW5hYmxlZCk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlaVxuIiwgZW5hYmxlZCk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHNob3dfbGNkX2xldmVsKHN0cnVjdCBkZXZpY2UgKmRldiwKKwlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQoreworCisJaW50IHJldDsKKworCXJldCA9IGdldF9sY2RfbGV2ZWwoKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVpXG4iLCByZXQpOworfQorCitzdGF0aWMgc3NpemVfdCBzdG9yZV9sY2RfbGV2ZWwoc3RydWN0IGRldmljZSAqZGV2LAorCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKK3sKKworCWludCBsZXZlbCwgcmV0OworCisJaWYgKHNzY2FuZihidWYsICIlaSIsICZsZXZlbCkgIT0gMSB8fCAobGV2ZWwgPCAwIHx8IGxldmVsID49IE1TSV9MQ0RfTEVWRUxfTUFYKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlyZXQgPSBzZXRfbGNkX2xldmVsKGxldmVsKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCXJldHVybiBjb3VudDsKK30KKworc3RhdGljIHNzaXplX3Qgc2hvd19hdXRvX2JyaWdodG5lc3Moc3RydWN0IGRldmljZSAqZGV2LAorCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCit7CisKKwlpbnQgcmV0OworCisJcmV0ID0gZ2V0X2F1dG9fYnJpZ2h0bmVzcygpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWlcbiIsIHJldCk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHN0b3JlX2F1dG9fYnJpZ2h0bmVzcyhzdHJ1Y3QgZGV2aWNlICpkZXYsCisJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQoreworCisJaW50IGVuYWJsZSwgcmV0OworCisJaWYgKHNzY2FuZihidWYsICIlaSIsICZlbmFibGUpICE9IDEgfHwgKGVuYWJsZSAhPSAoZW5hYmxlICYgMSkpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXJldCA9IHNldF9hdXRvX2JyaWdodG5lc3MoZW5hYmxlKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCXJldHVybiBjb3VudDsKK30KKworc3RhdGljIERFVklDRV9BVFRSKGxjZF9sZXZlbCwgMDY0NCwgc2hvd19sY2RfbGV2ZWwsIHN0b3JlX2xjZF9sZXZlbCk7CitzdGF0aWMgREVWSUNFX0FUVFIoYXV0b19icmlnaHRuZXNzLCAwNjQ0LCBzaG93X2F1dG9fYnJpZ2h0bmVzcywgc3RvcmVfYXV0b19icmlnaHRuZXNzKTsKK3N0YXRpYyBERVZJQ0VfQVRUUihibHVldG9vdGgsIDA0NDQsIHNob3dfYmx1ZXRvb3RoLCBOVUxMKTsKK3N0YXRpYyBERVZJQ0VfQVRUUih3bGFuLCAwNDQ0LCBzaG93X3dsYW4sIE5VTEwpOworCitzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqbXNpcGZfYXR0cmlidXRlc1tdID0geworCSZkZXZfYXR0cl9sY2RfbGV2ZWwuYXR0ciwKKwkmZGV2X2F0dHJfYXV0b19icmlnaHRuZXNzLmF0dHIsCisJJmRldl9hdHRyX2JsdWV0b290aC5hdHRyLAorCSZkZXZfYXR0cl93bGFuLmF0dHIsCisJTlVMTAorfTsKKworc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGVfZ3JvdXAgbXNpcGZfYXR0cmlidXRlX2dyb3VwID0geworCS5hdHRycyA9IG1zaXBmX2F0dHJpYnV0ZXMKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIG1zaXBmX2RyaXZlciA9IHsKKwkuZHJpdmVyID0geworCQkubmFtZSA9ICJtc2ktbGFwdG9wLXBmIiwKKwkJLm93bmVyID0gVEhJU19NT0RVTEUsCisJfQorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKm1zaXBmX2RldmljZTsKKworLyogSW5pdGlhbGl6YXRpb24gKi8KKworc3RhdGljIHN0cnVjdCBkbWlfc3lzdGVtX2lkIF9faW5pdGRhdGEgbXNpX2RtaV90YWJsZVtdID0geworCXsKKwkJLmlkZW50ID0gIk1TSSBTMjcwIiwKKwkJLm1hdGNoZXMgPSB7CisJCQlETUlfTUFUQ0goRE1JX1NZU19WRU5ET1IsICJNSUNSTy1TVEFSIElOVCdMIENPLixMVEQiKSwKKwkJCURNSV9NQVRDSChETUlfUFJPRFVDVF9OQU1FLCAiTVMtMTAxMyIpLAorCQl9CisJfSwKKwl7CisJCS5pZGVudCA9ICJNZWRpb24gTUQ5NjEwMCIsCisJCS5tYXRjaGVzID0geworCQkJRE1JX01BVENIKERNSV9TWVNfVkVORE9SLCAiTk9URUJPT0siKSwKKwkJCURNSV9NQVRDSChETUlfUFJPRFVDVF9OQU1FLCAiU0FNMjAwMCIpLAorCQl9CisJfSwKKwl7IH0KK307CisKKworc3RhdGljIGludCBfX2luaXQgbXNpX2luaXQodm9pZCkKK3sKKwlpbnQgcmV0OworCisJaWYgKGFjcGlfZGlzYWJsZWQpCisJCXJldHVybiAtRU5PREVWOworCisJaWYgKCFmb3JjZSAmJiAhZG1pX2NoZWNrX3N5c3RlbShtc2lfZG1pX3RhYmxlKSkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlpZiAoYXV0b19icmlnaHRuZXNzIDwgMCB8fCBhdXRvX2JyaWdodG5lc3MgPiAyKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCS8qIFJlZ2lzdGVyIGJhY2tsaWdodCBzdHVmZiAqLworCisJbXNpYmxfZGV2aWNlID0gYmFja2xpZ2h0X2RldmljZV9yZWdpc3RlcigibXNpLWxhcHRvcC1ibCIsIE5VTEwsICZtc2libF9wcm9wcyk7CisJaWYgKElTX0VSUihtc2libF9kZXZpY2UpKQorCQlyZXR1cm4gUFRSX0VSUihtc2libF9kZXZpY2UpOworCisJcmV0ID0gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZtc2lwZl9kcml2ZXIpOworCWlmIChyZXQpCisJCWdvdG8gZmFpbF9iYWNrbGlnaHQ7CisKKwkvKiBSZWdpc3RlciBwbGF0Zm9ybSBzdHVmZiAqLworCisJbXNpcGZfZGV2aWNlID0gcGxhdGZvcm1fZGV2aWNlX2FsbG9jKCJtc2ktbGFwdG9wLXBmIiwgLTEpOworCWlmICghbXNpcGZfZGV2aWNlKSB7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gZmFpbF9wbGF0Zm9ybV9kcml2ZXI7CisJfQorCisJcmV0ID0gcGxhdGZvcm1fZGV2aWNlX2FkZChtc2lwZl9kZXZpY2UpOworCWlmIChyZXQpCisJCWdvdG8gZmFpbF9wbGF0Zm9ybV9kZXZpY2UxOworCisJcmV0ID0gc3lzZnNfY3JlYXRlX2dyb3VwKCZtc2lwZl9kZXZpY2UtPmRldi5rb2JqLCAmbXNpcGZfYXR0cmlidXRlX2dyb3VwKTsKKwlpZiAocmV0KQorCQlnb3RvIGZhaWxfcGxhdGZvcm1fZGV2aWNlMjsKKworCS8qIERpc2FibGUgYXV0b21hdGljIGJyaWdodG5lc3MgY29udHJvbCBieSBkZWZhdWx0IGJlY2F1c2UKKwkgKiB0aGlzIG1vZHVsZSB3YXMgcHJvYmFibHkgbG9hZGVkIHRvIGRvIGJyaWdodG5lc3MgY29udHJvbCBpbgorCSAqIHNvZnR3YXJlLiAqLworCisJaWYgKGF1dG9fYnJpZ2h0bmVzcyAhPSAyKQorCQlzZXRfYXV0b19icmlnaHRuZXNzKGF1dG9fYnJpZ2h0bmVzcyk7CisKKwlwcmludGsoS0VSTl9JTkZPICJtc2ktbGFwdG9wOiBkcml2ZXIgIk1TSV9EUklWRVJfVkVSU0lPTiIgc3VjY2Vzc2Z1bGx5IGxvYWRlZC5cbiIpOworCisJcmV0dXJuIDA7CisKK2ZhaWxfcGxhdGZvcm1fZGV2aWNlMjoKKworCXBsYXRmb3JtX2RldmljZV9kZWwobXNpcGZfZGV2aWNlKTsKKworZmFpbF9wbGF0Zm9ybV9kZXZpY2UxOgorCisJcGxhdGZvcm1fZGV2aWNlX3B1dChtc2lwZl9kZXZpY2UpOworCitmYWlsX3BsYXRmb3JtX2RyaXZlcjoKKworCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZtc2lwZl9kcml2ZXIpOworCitmYWlsX2JhY2tsaWdodDoKKworCWJhY2tsaWdodF9kZXZpY2VfdW5yZWdpc3Rlcihtc2libF9kZXZpY2UpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgX19leGl0IG1zaV9jbGVhbnVwKHZvaWQpCit7CisKKwlzeXNmc19yZW1vdmVfZ3JvdXAoJm1zaXBmX2RldmljZS0+ZGV2LmtvYmosICZtc2lwZl9hdHRyaWJ1dGVfZ3JvdXApOworCXBsYXRmb3JtX2RldmljZV91bnJlZ2lzdGVyKG1zaXBmX2RldmljZSk7CisJcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJm1zaXBmX2RyaXZlcik7CisJYmFja2xpZ2h0X2RldmljZV91bnJlZ2lzdGVyKG1zaWJsX2RldmljZSk7CisKKwkvKiBFbmFibGUgYXV0b21hdGljIGJyaWdodG5lc3MgY29udHJvbCBhZ2FpbiAqLworCWlmIChhdXRvX2JyaWdodG5lc3MgIT0gMikKKwkJc2V0X2F1dG9fYnJpZ2h0bmVzcygxKTsKKworCXByaW50ayhLRVJOX0lORk8gIm1zaS1sYXB0b3A6IGRyaXZlciB1bmxvYWRlZC5cbiIpOworfQorCittb2R1bGVfaW5pdChtc2lfaW5pdCk7Cittb2R1bGVfZXhpdChtc2lfY2xlYW51cCk7CisKK01PRFVMRV9BVVRIT1IoIkxlbm5hcnQgUG9ldHRlcmluZyIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJNU0kgTGFwdG9wIFN1cHBvcnQiKTsKK01PRFVMRV9WRVJTSU9OKE1TSV9EUklWRVJfVkVSU0lPTik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21tYy9tbWMuYyBiL2RyaXZlcnMvbW1jL21tYy5jCmluZGV4IGVlODg2M2MuLjc2NmJjNTQ0IDEwMDY0NAotLS0gYS9kcml2ZXJzL21tYy9tbWMuYworKysgYi9kcml2ZXJzL21tYy9tbWMuYwpAQCAtNDc1LDcgKzQ3NSw3IEBACiAJaWYgKGJpdCkgewogCQliaXQgLT0gMTsKIAotCQlvY3IgPSAzIDw8IGJpdDsKKwkJb2NyICY9IDMgPDwgYml0OwogCiAJCWhvc3QtPmlvcy52ZGQgPSBiaXQ7CiAJCW1tY19zZXRfaW9zKGhvc3QpOwpAQCAtMTE3OCwxNCArMTE3OCwyOSBAQAogewogCXN0cnVjdCBtbWNfaG9zdCAqaG9zdCA9IGRhdGE7CiAJc3RydWN0IGxpc3RfaGVhZCAqbCwgKm47CisJdW5zaWduZWQgY2hhciBwb3dlcl9tb2RlOwogCiAJbW1jX2NsYWltX2hvc3QoaG9zdCk7CiAKLQlpZiAoaG9zdC0+aW9zLnBvd2VyX21vZGUgPT0gTU1DX1BPV0VSX09OKQorCS8qCisJICogQ2hlY2sgZm9yIHJlbW92ZWQgY2FyZHMgYW5kIG5ld2x5IGluc2VydGVkIG9uZXMuIFdlIGNoZWNrIGZvcgorCSAqIHJlbW92ZWQgY2FyZHMgZmlyc3Qgc28gd2UgY2FuIGludGVsbGlnZW50bHkgcmUtc2VsZWN0IHRoZSBWREQuCisJICovCisJcG93ZXJfbW9kZSA9IGhvc3QtPmlvcy5wb3dlcl9tb2RlOworCWlmIChwb3dlcl9tb2RlID09IE1NQ19QT1dFUl9PTikKIAkJbW1jX2NoZWNrX2NhcmRzKGhvc3QpOwogCiAJbW1jX3NldHVwKGhvc3QpOwogCisJLyoKKwkgKiBTb21lIGJyb2tlbiBjYXJkcyBwcm9jZXNzIENNRDEgZXZlbiBpbiBzdGFuZC1ieSBzdGF0ZS4gVGhlcmUgaXMKKwkgKiBubyByZXBseSwgYnV0IGFuIElMTEVHQUxfQ09NTUFORCBlcnJvciBpcyBjYWNoZWQgYW5kIHJldHVybmVkCisJICogYWZ0ZXIgbmV4dCBjb21tYW5kLiBXZSBwb2xsIGZvciBjYXJkIHN0YXR1cyBoZXJlIHRvIGNsZWFyIGFueQorCSAqIHBvc3NpYmx5IHBlbmRpbmcgZXJyb3IuCisJICovCisJaWYgKHBvd2VyX21vZGUgPT0gTU1DX1BPV0VSX09OKQorCQltbWNfY2hlY2tfY2FyZHMoaG9zdCk7CisKIAlpZiAoIWxpc3RfZW1wdHkoJmhvc3QtPmNhcmRzKSkgewogCQkvKgogCQkgKiAoUmUtKWNhbGN1bGF0ZSB0aGUgZmFzdGVzdCBjbG9jayByYXRlIHdoaWNoIHRoZQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tbWMvdGlmbV9zZC5jIGIvZHJpdmVycy9tbWMvdGlmbV9zZC5jCmluZGV4IDJiYWNmZjYuLjBmZGM1NWIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbW1jL3RpZm1fc2QuYworKysgYi9kcml2ZXJzL21tYy90aWZtX3NkLmMKQEAgLTE0LDYgKzE0LDcgQEAKICNpbmNsdWRlIDxsaW51eC9tbWMvcHJvdG9jb2wuaD4KICNpbmNsdWRlIDxsaW51eC9tbWMvaG9zdC5oPgogI2luY2x1ZGUgPGxpbnV4L2hpZ2htZW0uaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KIAogI2RlZmluZSBEUklWRVJfTkFNRSAidGlmbV9zZCIKICNkZWZpbmUgRFJJVkVSX1ZFUlNJT04gIjAuNiIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbXRkL25hbmQvbmFuZF9iYXNlLmMgYi9kcml2ZXJzL210ZC9uYW5kL25hbmRfYmFzZS5jCmluZGV4IGJhZWNlNjEuLjQxYmZjYWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbXRkL25hbmQvbmFuZF9iYXNlLmMKKysrIGIvZHJpdmVycy9tdGQvbmFuZC9uYW5kX2Jhc2UuYwpAQCAtMTQ3OSw2ICsxNDc5LDcgQEAKICAqIEBidWY6CXRoZSBkYXRhIHRvIHdyaXRlCiAgKiBAcGFnZToJcGFnZSBudW1iZXIgdG8gd3JpdGUKICAqIEBjYWNoZWQ6CWNhY2hlZCBwcm9ncmFtbWluZworICogQHJhdzoJdXNlIF9yYXcgdmVyc2lvbiBvZiB3cml0ZV9wYWdlCiAgKi8KIHN0YXRpYyBpbnQgbmFuZF93cml0ZV9wYWdlKHN0cnVjdCBtdGRfaW5mbyAqbXRkLCBzdHJ1Y3QgbmFuZF9jaGlwICpjaGlwLAogCQkJICAgY29uc3QgdWludDhfdCAqYnVmLCBpbnQgcGFnZSwgaW50IGNhY2hlZCwgaW50IHJhdykKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L0tjb25maWcgYi9kcml2ZXJzL25ldC9LY29uZmlnCmluZGV4IGFiOTJjYzcuLjZlODYzYWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L0tjb25maWcKKysrIGIvZHJpdmVycy9uZXQvS2NvbmZpZwpAQCAtNDg2LDcgKzQ4Niw3IEBACiAKIGNvbmZpZyBNSVBTX1NJTV9ORVQKIAl0cmlzdGF0ZSAiTUlQUyBzaW11bGF0b3IgTmV0d29yayBkZXZpY2UgKEVYUEVSSU1FTlRBTCkiCi0JZGVwZW5kcyBvbiBORVRERVZJQ0VTICYmIE1JUFNfU0lNICYmIEVYUEVSSU1FTlRBTAorCWRlcGVuZHMgb24gTUlQU19TSU0gJiYgRVhQRVJJTUVOVEFMCiAJaGVscAogCSAgVGhlIE1JUFNORVQgZGV2aWNlIGlzIGEgc2ltcGxlIEV0aGVybmV0IG5ldHdvcmsgZGV2aWNlIHdoaWNoIGlzCiAJICBlbXVsYXRlZCBieSB0aGUgTUlQUyBTaW11bGF0b3IuCkBAIC0yMTEyLDcgKzIxMTIsNyBAQAogCiBjb25maWcgU0tZMgogCXRyaXN0YXRlICJTeXNLb25uZWN0IFl1a29uMiBzdXBwb3J0IChFWFBFUklNRU5UQUwpIgotCWRlcGVuZHMgb24gUENJICYmIEVYUEVSSU1FTlRBTAorCWRlcGVuZHMgb24gUENJCiAJc2VsZWN0IENSQzMyCiAJLS0taGVscC0tLQogCSAgVGhpcyBkcml2ZXIgc3VwcG9ydHMgR2lnYWJpdCBFdGhlcm5ldCBhZGFwdGVycyBiYXNlZCBvbiB0aGUKQEAgLTIxMjAsOCArMjEyMCw4IEBACiAJICBNYXJ2ZWxsIDg4RTgwMjEvODhFODAyMi84OEU4MDM1Lzg4RTgwMzYvODhFODAzOC84OEU4MDUwLzg4RTgwNTIvCiAJICA4OEU4MDUzLzg4RTgwNTUvODhFODA2MS84OEU4MDYyLCBTeXNLb25uZWN0IFNLLTlFMjFEL1NLLTlTMjEKIAotCSAgVGhpcyBkcml2ZXIgZG9lcyBub3Qgc3VwcG9ydCB0aGUgb3JpZ2luYWwgWXVrb24gY2hpcHNldDogYSBzZXBlcmF0ZQotCSAgZHJpdmVyLCBza2dlLCBpcyBwcm92aWRlZCBmb3IgWXVrb24tYmFzZWQgYWRhcHRlcnMuCisJICBUaGVyZSBpcyBjb21wYW5pb24gZHJpdmVyIGZvciB0aGUgb2xkZXIgTWFydmVsbCBZdWtvbiBhbmQKKwkgIEdlbmVzaXMgYmFzZWQgYWRhcHRlcnM6IHNrZ2UuCiAKIAkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZSBtb2R1bGUKIAkgIHdpbGwgYmUgY2FsbGVkIHNreTIuICBUaGlzIGlzIHJlY29tbWVuZGVkLgpAQCAtMjI4OCw3ICsyMjg4LDcgQEAKIAogY29uZmlnIFVHRVRIX0hBU19HSUdBCiAJYm9vbAotCWRlcGVuZHMgb24gVUNDX0dFVEggJiYgTVBDODM2eAorCWRlcGVuZHMgb24gVUNDX0dFVEggJiYgUFBDX01QQzgzNngKIAogY29uZmlnIE1WNjQzWFhfRVRICiAJdHJpc3RhdGUgIk1WLTY0M1hYIEV0aGVybmV0IHN1cHBvcnQiCkBAIC0yNDY3LDcgKzI0NjcsNyBAQAogCiBjb25maWcgUklPTkVUCiAJdHJpc3RhdGUgIlJhcGlkSU8gRXRoZXJuZXQgb3ZlciBtZXNzYWdpbmcgZHJpdmVyIHN1cHBvcnQiCi0JZGVwZW5kcyBvbiBORVRERVZJQ0VTICYmIFJBUElESU8KKwlkZXBlbmRzIG9uIFJBUElESU8KIAogY29uZmlnIFJJT05FVF9UWF9TSVpFCiAJaW50ICJOdW1iZXIgb2Ygb3V0Ym91bmQgcXVldWUgZW50cmllcyIKQEAgLTI3MTcsNiArMjcxNyw3IEBACiAgICAgICAgc2VsZWN0IENSWVBUTwogICAgICAgIHNlbGVjdCBDUllQVE9fU0hBMQogICAgICAgIHNlbGVjdCBDUllQVE9fQVJDNAorICAgICAgIHNlbGVjdCBDUllQVE9fRUNCCiAgICAgICAgLS0taGVscC0tLQogICAgICAgICAgU3VwcG9ydCBmb3IgdGhlIE1QUEUgRW5jcnlwdGlvbiBwcm90b2NvbCwgYXMgZW1wbG95ZWQgYnkgdGhlCiAJIE1pY3Jvc29mdCBQb2ludC10by1Qb2ludCBUdW5uZWxpbmcgUHJvdG9jb2wuCkBAIC0yODMyLDcgKzI4MzMsNyBAQAogCSAgIlNDU0kgZ2VuZXJpYyBzdXBwb3J0Ii4KIAogY29uZmlnIFNIQVBFUgotCXRyaXN0YXRlICJUcmFmZmljIFNoYXBlciAoRVhQRVJJTUVOVEFMKSIKKwl0cmlzdGF0ZSAiVHJhZmZpYyBTaGFwZXIgKE9CU09MRVRFKSIKIAlkZXBlbmRzIG9uIEVYUEVSSU1FTlRBTAogCS0tLWhlbHAtLS0KIAkgIFRoZSB0cmFmZmljIHNoYXBlciBpcyBhIHZpcnR1YWwgbmV0d29yayBkZXZpY2UgdGhhdCBhbGxvd3MgeW91IHRvCkBAIC0yODQxLDkgKzI4NDIsOSBAQAogCSAgdGhlc2UgdmlydHVhbCBkZXZpY2VzLiBTZWUKIAkgIDxmaWxlOkRvY3VtZW50YXRpb24vbmV0d29ya2luZy9zaGFwZXIudHh0PiBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KIAotCSAgQW4gYWx0ZXJuYXRpdmUgdG8gdGhpcyB0cmFmZmljIHNoYXBlciBpcyB0aGUgZXhwZXJpbWVudGFsCi0JICBDbGFzcy1CYXNlZCBRdWV1aW5nIChDQlEpIHNjaGVkdWxpbmcgc3VwcG9ydCB3aGljaCB5b3UgZ2V0IGlmIHlvdQotCSAgc2F5IFkgdG8gIlFvUyBhbmQvb3IgZmFpciBxdWV1aW5nIiBhYm92ZS4KKwkgIEFuIGFsdGVybmF0aXZlIHRvIHRoaXMgdHJhZmZpYyBzaGFwZXIgYXJlIHRyYWZmaWMgc2NoZWR1bGVycyB3aGljaAorCSAgeW91J2xsIGdldCBpZiB5b3Ugc2F5IFkgdG8gIlFvUyBhbmQvb3IgZmFpciBxdWV1aW5nIiBpbgorCSAgIk5ldHdvcmtpbmcgb3B0aW9ucyIuCiAKIAkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZSBtb2R1bGUKIAkgIHdpbGwgYmUgY2FsbGVkIHNoYXBlci4gIElmIHVuc3VyZSwgc2F5IE4uCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9hcmNuZXQvY29tMjAwMjAuYyBiL2RyaXZlcnMvbmV0L2FyY25ldC9jb20yMDAyMC5jCmluZGV4IDBkYzcwYzcuLmFhOWRkOGYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2FyY25ldC9jb20yMDAyMC5jCisrKyBiL2RyaXZlcnMvbmV0L2FyY25ldC9jb20yMDAyMC5jCkBAIC0zMzcsMTMgKzMzNywxNiBAQAogCX0KIH0KIAotI2lmZGVmIE1PRFVMRQotCisjaWYgZGVmaW5lZChDT05GSUdfQVJDTkVUX0NPTTIwMDIwX1BDSV9NT0RVTEUpIHx8IFwKKyAgICBkZWZpbmVkKENPTkZJR19BUkNORVRfQ09NMjAwMjBfSVNBX01PRFVMRSkKIEVYUE9SVF9TWU1CT0woY29tMjAwMjBfY2hlY2spOwogRVhQT1JUX1NZTUJPTChjb20yMDAyMF9mb3VuZCk7CisjZW5kaWYKIAogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwogCisjaWZkZWYgTU9EVUxFCisKIGludCBpbml0X21vZHVsZSh2b2lkKQogewogCUJVR0xWTChEX05PUk1BTCkgcHJpbnRrKFZFUlNJT04pOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvYXJtL2VwOTN4eF9ldGguYyBiL2RyaXZlcnMvbmV0L2FybS9lcDkzeHhfZXRoLmMKaW5kZXggMTI3NTYxYy4uOGViZDY4ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvYXJtL2VwOTN4eF9ldGguYworKysgYi9kcml2ZXJzL25ldC9hcm0vZXA5M3h4X2V0aC5jCkBAIC0xOTMsMTIgKzE5Myw5IEBACiBzdGF0aWMgaW50IGVwOTN4eF9yeChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgKmJ1ZGdldCkKIHsKIAlzdHJ1Y3QgZXA5M3h4X3ByaXYgKmVwID0gbmV0ZGV2X3ByaXYoZGV2KTsKLQlpbnQgdGFpbF9vZmZzZXQ7CiAJaW50IHJ4X2RvbmU7CiAJaW50IHByb2Nlc3NlZDsKIAotCXRhaWxfb2Zmc2V0ID0gcmRsKGVwLCBSRUdfUlhTVFNRQ1VSQUREKSAtIGVwLT5kZXNjc19kbWFfYWRkcjsKLQogCXJ4X2RvbmUgPSAwOwogCXByb2Nlc3NlZCA9IDA7CiAJd2hpbGUgKCpidWRnZXQgPiAwKSB7CkBAIC0yMTEsMzYgKzIwOCwyOCBAQAogCiAJCWVudHJ5ID0gZXAtPnJ4X3BvaW50ZXI7CiAJCXJzdGF0ID0gZXAtPmRlc2NzLT5yc3RhdCArIGVudHJ5OwotCQlpZiAoKHZvaWQgKilyc3RhdCAtICh2b2lkICopZXAtPmRlc2NzID09IHRhaWxfb2Zmc2V0KSB7CisKKwkJcnN0YXQwID0gcnN0YXQtPnJzdGF0MDsKKwkJcnN0YXQxID0gcnN0YXQtPnJzdGF0MTsKKwkJaWYgKCEocnN0YXQwICYgUlNUQVQwX1JGUCkgfHwgIShyc3RhdDEgJiBSU1RBVDFfUkZQKSkgewogCQkJcnhfZG9uZSA9IDE7CiAJCQlicmVhazsKIAkJfQogCi0JCXJzdGF0MCA9IHJzdGF0LT5yc3RhdDA7Ci0JCXJzdGF0MSA9IHJzdGF0LT5yc3RhdDE7CiAJCXJzdGF0LT5yc3RhdDAgPSAwOwogCQlyc3RhdC0+cnN0YXQxID0gMDsKIAotCQlpZiAoIShyc3RhdDAgJiBSU1RBVDBfUkZQKSkKLQkJCXByaW50ayhLRVJOX0NSSVQgImVwOTN4eF9yeDogYnVmZmVyIG5vdCBkb25lICIKLQkJCQkJICIgJS44eCAlLjh4XG4iLCByc3RhdDAsIHJzdGF0MSk7CiAJCWlmICghKHJzdGF0MCAmIFJTVEFUMF9FT0YpKQogCQkJcHJpbnRrKEtFUk5fQ1JJVCAiZXA5M3h4X3J4OiBub3QgZW5kLW9mLWZyYW1lICIKIAkJCQkJICIgJS44eCAlLjh4XG4iLCByc3RhdDAsIHJzdGF0MSk7CiAJCWlmICghKHJzdGF0MCAmIFJTVEFUMF9FT0IpKQogCQkJcHJpbnRrKEtFUk5fQ1JJVCAiZXA5M3h4X3J4OiBub3QgZW5kLW9mLWJ1ZmZlciAiCiAJCQkJCSAiICUuOHggJS44eFxuIiwgcnN0YXQwLCByc3RhdDEpOwotCQlpZiAoIShyc3RhdDEgJiBSU1RBVDFfUkZQKSkKLQkJCXByaW50ayhLRVJOX0NSSVQgImVwOTN4eF9yeDogYnVmZmVyMSBub3QgZG9uZSAiCi0JCQkJCSAiICUuOHggJS44eFxuIiwgcnN0YXQwLCByc3RhdDEpOwogCQlpZiAoKHJzdGF0MSAmIFJTVEFUMV9CVUZGRVJfSU5ERVgpID4+IDE2ICE9IGVudHJ5KQogCQkJcHJpbnRrKEtFUk5fQ1JJVCAiZXA5M3h4X3J4OiBlbnRyeSBtaXNtYXRjaCAiCiAJCQkJCSAiICUuOHggJS44eFxuIiwgcnN0YXQwLCByc3RhdDEpOwogCiAJCWlmICghKHJzdGF0MCAmIFJTVEFUMF9SV0UpKSB7Ci0JCQlwcmludGsoS0VSTl9OT1RJQ0UgImVwOTN4eF9yeDogcmVjZWl2ZSBlcnJvciAiCi0JCQkJCSAiICUuOHggJS44eFxuIiwgcnN0YXQwLCByc3RhdDEpOwotCiAJCQllcC0+c3RhdHMucnhfZXJyb3JzKys7CiAJCQlpZiAocnN0YXQwICYgUlNUQVQwX09FKQogCQkJCWVwLT5zdGF0cy5yeF9maWZvX2Vycm9ycysrOwpAQCAtMzAxLDEzICsyOTAsOCBAQAogCiBzdGF0aWMgaW50IGVwOTN4eF9oYXZlX21vcmVfcngoc3RydWN0IGVwOTN4eF9wcml2ICplcCkKIHsKLQlzdHJ1Y3QgZXA5M3h4X3JzdGF0ICpyc3RhdDsKLQlpbnQgdGFpbF9vZmZzZXQ7Ci0KLQlyc3RhdCA9IGVwLT5kZXNjcy0+cnN0YXQgKyBlcC0+cnhfcG9pbnRlcjsKLQl0YWlsX29mZnNldCA9IHJkbChlcCwgUkVHX1JYU1RTUUNVUkFERCkgLSBlcC0+ZGVzY3NfZG1hX2FkZHI7Ci0KLQlyZXR1cm4gISgodm9pZCAqKXJzdGF0IC0gKHZvaWQgKillcC0+ZGVzY3MgPT0gdGFpbF9vZmZzZXQpOworCXN0cnVjdCBlcDkzeHhfcnN0YXQgKnJzdGF0ID0gZXAtPmRlc2NzLT5yc3RhdCArIGVwLT5yeF9wb2ludGVyOworCXJldHVybiAhISgocnN0YXQtPnJzdGF0MCAmIFJTVEFUMF9SRlApICYmIChyc3RhdC0+cnN0YXQxICYgUlNUQVQxX1JGUCkpOwogfQogCiBzdGF0aWMgaW50IGVwOTN4eF9wb2xsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCAqYnVkZ2V0KQpAQCAtMzQ3LDcgKzMzMSw3IEBACiAJc3RydWN0IGVwOTN4eF9wcml2ICplcCA9IG5ldGRldl9wcml2KGRldik7CiAJaW50IGVudHJ5OwogCi0JaWYgKHVubGlrZWx5KHNrYi0+bGVuKSA+IE1BWF9QS1RfU0laRSkgeworCWlmICh1bmxpa2VseShza2ItPmxlbiA+IE1BWF9QS1RfU0laRSkpIHsKIAkJZXAtPnN0YXRzLnR4X2Ryb3BwZWQrKzsKIAkJZGV2X2tmcmVlX3NrYihza2IpOwogCQlyZXR1cm4gTkVUREVWX1RYX09LOwpAQCAtMzc5LDEwICszNjMsOCBAQAogc3RhdGljIHZvaWQgZXA5M3h4X3R4X2NvbXBsZXRlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7CiAJc3RydWN0IGVwOTN4eF9wcml2ICplcCA9IG5ldGRldl9wcml2KGRldik7Ci0JaW50IHRhaWxfb2Zmc2V0OwogCWludCB3YWtlOwogCi0JdGFpbF9vZmZzZXQgPSByZGwoZXAsIFJFR19UWFNUU1FDVVJBREQpIC0gZXAtPmRlc2NzX2RtYV9hZGRyOwogCXdha2UgPSAwOwogCiAJc3Bpbl9sb2NrKCZlcC0+dHhfcGVuZGluZ19sb2NrKTsKQEAgLTM5MywxNSArMzc1LDEzIEBACiAKIAkJZW50cnkgPSBlcC0+dHhfY2xlYW5fcG9pbnRlcjsKIAkJdHN0YXQgPSBlcC0+ZGVzY3MtPnRzdGF0ICsgZW50cnk7Ci0JCWlmICgodm9pZCAqKXRzdGF0IC0gKHZvaWQgKillcC0+ZGVzY3MgPT0gdGFpbF9vZmZzZXQpCi0JCQlicmVhazsKIAogCQl0c3RhdDAgPSB0c3RhdC0+dHN0YXQwOworCQlpZiAoISh0c3RhdDAgJiBUU1RBVDBfVFhGUCkpCisJCQlicmVhazsKKwogCQl0c3RhdC0+dHN0YXQwID0gMDsKIAotCQlpZiAoISh0c3RhdDAgJiBUU1RBVDBfVFhGUCkpCi0JCQlwcmludGsoS0VSTl9DUklUICJlcDkzeHhfdHhfY29tcGxldGU6IGJ1ZmZlciBub3QgZG9uZSAiCi0JCQkJCSAiICUuOHhcbiIsIHRzdGF0MCk7CiAJCWlmICh0c3RhdDAgJiBUU1RBVDBfRkEpCiAJCQlwcmludGsoS0VSTl9DUklUICJlcDkzeHhfdHhfY29tcGxldGU6IGZyYW1lIGFib3J0ZWQgIgogCQkJCQkgIiAlLjh4XG4iLCB0c3RhdDApOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvYXUxMDAwX2V0aC5jIGIvZHJpdmVycy9uZXQvYXUxMDAwX2V0aC5jCmluZGV4IDQ4NzNkYzYuLjdkYjNjOGEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2F1MTAwMF9ldGguYworKysgYi9kcml2ZXJzL25ldC9hdTEwMDBfZXRoLmMKQEAgLTEwMiw3ICsxMDIsNyBAQAogLy8gZXh0ZXJucwogZXh0ZXJuIGludCBnZXRfZXRoZXJuZXRfYWRkcihjaGFyICpldGhlcm5ldF9hZGRyKTsKIGV4dGVybiB2b2lkIHN0cjJlYWRkcih1bnNpZ25lZCBjaGFyICplYSwgdW5zaWduZWQgY2hhciAqc3RyKTsKLWV4dGVybiBjaGFyICogX19pbml0IHByb21fZ2V0Y21kbGluZSh2b2lkKTsKK2V4dGVybiBjaGFyICogcHJvbV9nZXRjbWRsaW5lKHZvaWQpOwogCiAvKgogICogVGhlb3J5IG9mIG9wZXJhdGlvbgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvYjQ0LmMgYi9kcml2ZXJzL25ldC9iNDQuYwppbmRleCBiMTI0ZWVlLi40NzRhNGUzNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvYjQ0LmMKKysrIGIvZHJpdmVycy9uZXQvYjQ0LmMKQEAgLTkwOCw4ICs5MDgsOSBAQAogCWlzdGF0ID0gYnIzMihicCwgQjQ0X0lTVEFUKTsKIAlpbWFzayA9IGJyMzIoYnAsIEI0NF9JTUFTSyk7CiAKLQkvKiA/Pz8gV2hhdCB0aGUgZnVjayBpcyB0aGUgcHVycG9zZSBvZiB0aGUgaW50ZXJydXB0IG1hc2sKLQkgKiA/Pz8gcmVnaXN0ZXIgaWYgd2UgaGF2ZSB0byBtYXNrIGl0IG91dCBieSBoYW5kIGFueXdheXM/CisJLyogVGhlIGludGVycnVwdCBtYXNrIHJlZ2lzdGVyIGNvbnRyb2xzIHdoaWNoIGludGVycnVwdCBiaXRzCisJICogd2lsbCBhY3R1YWxseSByYWlzZSBhbiBpbnRlcnJ1cHQgdG8gdGhlIENQVSB3aGVuIHNldCBieSBody9maXJtd2FyZSwKKwkgKiBidXQgZG9lc24ndCBtYXNrIG9mZiB0aGUgYml0cy4KIAkgKi8KIAlpc3RhdCAmPSBpbWFzazsKIAlpZiAoaXN0YXQpIHsKQEAgLTE3MDYsMTQgKzE3MDcsMTUgQEAKIAogCQlfX2I0NF9zZXRfbWFjX2FkZHIoYnApOwogCi0JCWlmIChkZXYtPmZsYWdzICYgSUZGX0FMTE1VTFRJKQorCQlpZiAoKGRldi0+ZmxhZ3MgJiBJRkZfQUxMTVVMVEkpIHx8CisJCSAgICAoZGV2LT5tY19jb3VudCA+IEI0NF9NQ0FTVF9UQUJMRV9TSVpFKSkKIAkJCXZhbCB8PSBSWENPTkZJR19BTExNVUxUSTsKIAkJZWxzZQogCQkJaSA9IF9fYjQ0X2xvYWRfbWNhc3QoYnAsIGRldik7CiAKLQkJZm9yICg7IGkgPCA2NDsgaSsrKSB7CisJCWZvciAoOyBpIDwgNjQ7IGkrKykKIAkJCV9fYjQ0X2NhbV93cml0ZShicCwgemVybywgaSk7Ci0JCX0KKwogCQlidzMyKGJwLCBCNDRfUlhDT05GSUcsIHZhbCk7CiAgICAgICAgIAl2YWwgPSBicjMyKGJwLCBCNDRfQ0FNX0NUUkwpOwogCSAgICAgICAgYnczMihicCwgQjQ0X0NBTV9DVFJMLCB2YWwgfCBDQU1fQ1RSTF9FTkFCTEUpOwpAQCAtMjA1NSw3ICsyMDU3LDcgQEAKIAl1MTYgKnB0ciA9ICh1MTYgKikgZGF0YTsKIAogCWZvciAoaSA9IDA7IGkgPCAxMjg7IGkgKz0gMikKLQkJcHRyW2kgLyAyXSA9IHJlYWR3KGJwLT5yZWdzICsgNDA5NiArIGkpOworCQlwdHJbaSAvIDJdID0gY3B1X3RvX2xlMTYocmVhZHcoYnAtPnJlZ3MgKyA0MDk2ICsgaSkpOwogCiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ib25kaW5nL2JvbmRfYWxiLmMgYi9kcml2ZXJzL25ldC9ib25kaW5nL2JvbmRfYWxiLmMKaW5kZXggZTgzYmM4Mi4uMzI5MjMxNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvYm9uZGluZy9ib25kX2FsYi5jCisrKyBiL2RyaXZlcnMvbmV0L2JvbmRpbmcvYm9uZF9hbGIuYwpAQCAtMTQzMyw3ICsxNDMzLDcgQEAKIAkJICogd3JpdGUgbG9jayB0byBwcm90ZWN0IGZyb20gb3RoZXIgY29kZSB0aGF0IGFsc28KIAkJICogc2V0cyB0aGUgcHJvbWlzY3VpdHkuCiAJCSAqLwotCQl3cml0ZV9sb2NrKCZib25kLT5jdXJyX3NsYXZlX2xvY2spOworCQl3cml0ZV9sb2NrX2JoKCZib25kLT5jdXJyX3NsYXZlX2xvY2spOwogCiAJCWlmIChib25kX2luZm8tPnByaW1hcnlfaXNfcHJvbWlzYyAmJgogCQkgICAgKCsrYm9uZF9pbmZvLT5ybGJfcHJvbWlzY190aW1lb3V0X2NvdW50ZXIgPj0gUkxCX1BST01JU0NfVElNRU9VVCkpIHsKQEAgLTE0NDgsNyArMTQ0OCw3IEBACiAJCQlib25kX2luZm8tPnByaW1hcnlfaXNfcHJvbWlzYyA9IDA7CiAJCX0KIAotCQl3cml0ZV91bmxvY2soJmJvbmQtPmN1cnJfc2xhdmVfbG9jayk7CisJCXdyaXRlX3VubG9ja19iaCgmYm9uZC0+Y3Vycl9zbGF2ZV9sb2NrKTsKIAogCQlpZiAoYm9uZF9pbmZvLT5ybGJfcmViYWxhbmNlKSB7CiAJCQlib25kX2luZm8tPnJsYl9yZWJhbGFuY2UgPSAwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvYm9uZGluZy9ib25kX21haW4uYyBiL2RyaXZlcnMvbmV0L2JvbmRpbmcvYm9uZF9tYWluLmMKaW5kZXggYzBiYmRkYS4uMTdhNDYxMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvYm9uZGluZy9ib25kX21haW4uYworKysgYi9kcml2ZXJzL25ldC9ib25kaW5nL2JvbmRfbWFpbi5jCkBAIC00NjkyLDYgKzQ2OTIsOCBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgc3RydWN0IGxvY2tfY2xhc3Nfa2V5IGJvbmRpbmdfbmV0ZGV2X3htaXRfbG9ja19rZXk7CisKIC8qIENyZWF0ZSBhIG5ldyBib25kIGJhc2VkIG9uIHRoZSBzcGVjaWZpZWQgbmFtZSBhbmQgYm9uZGluZyBwYXJhbWV0ZXJzLgogICogQ2FsbGVyIG11c3QgTk9UIGhvbGQgcnRubF9sb2NrOyB3ZSBuZWVkIHRvIHJlbGVhc2UgaXQgaGVyZSBiZWZvcmUgd2UKICAqIHNldCB1cCBvdXIgc3lzZnMgZW50cmllcy4KQEAgLTQ3MjcsNiArNDcyOSw5IEBACiAJaWYgKHJlcyA8IDApIHsKIAkJZ290byBvdXRfYm9uZDsKIAl9CisKKwlsb2NrZGVwX3NldF9jbGFzcygmYm9uZF9kZXYtPl94bWl0X2xvY2ssICZib25kaW5nX25ldGRldl94bWl0X2xvY2tfa2V5KTsKKwogCWlmIChuZXdib25kKQogCQkqbmV3Ym9uZCA9IGJvbmRfZGV2LT5wcml2OwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9jcmlzL2V0aF92MTAuYyBiL2RyaXZlcnMvbmV0L2NyaXMvZXRoX3YxMC5jCmluZGV4IDk2NmI1NjMuLmEwM2Q3ODEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2NyaXMvZXRoX3YxMC5jCisrKyBiL2RyaXZlcnMvbmV0L2NyaXMvZXRoX3YxMC5jCkBAIC01MDksNiArNTA5LDggQEAKIAkJICogZG9lcyBub3Qgc2hhcmUgY2FjaGVsaW5lIHdpdGggYW55IG90aGVyIGRhdGEgKHRvIGF2b2lkIGNhY2hlIGJ1ZykKIAkJICovCiAJCVJ4RGVzY0xpc3RbaV0uc2tiID0gZGV2X2FsbG9jX3NrYihNQVhfTUVESUFfREFUQV9TSVpFICsgMiAqIEwxX0NBQ0hFX0JZVEVTKTsKKwkJaWYgKCFSeERlc2NMaXN0W2ldLnNrYikKKwkJCXJldHVybiAtRU5PTUVNOwogCQlSeERlc2NMaXN0W2ldLmRlc2NyLmN0cmwgICA9IDA7CiAJCVJ4RGVzY0xpc3RbaV0uZGVzY3Iuc3dfbGVuID0gTUFYX01FRElBX0RBVEFfU0laRTsKIAkJUnhEZXNjTGlzdFtpXS5kZXNjci5uZXh0ICAgPSB2aXJ0X3RvX3BoeXMoJlJ4RGVzY0xpc3RbaSArIDFdKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2UxMDAuYyBiL2RyaXZlcnMvbmV0L2UxMDAuYwppbmRleCAyN2Q1ZDJmLi4xOWFiMzQ0IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9lMTAwLmMKKysrIGIvZHJpdmVycy9uZXQvZTEwMC5jCkBAIC0yMDM5LDcgKzIwMzksNiBAQAogCXJldHVybiAwOwogfQogCi0jaWZkZWYgQ09ORklHX1BNCiBzdGF0aWMgaW50IGUxMDBfYXNmKHN0cnVjdCBuaWMgKm5pYykKIHsKIAkvKiBBU0YgY2FuIGJlIGVuYWJsZWQgZnJvbSBlZXByb20gKi8KQEAgLTIwNDgsNyArMjA0Nyw2IEBACiAJICAgIShuaWMtPmVlcHJvbVtlZXByb21fY29uZmlnX2FzZl0gJiBlZXByb21fZ2NsKSAmJgogCSAgICgobmljLT5lZXByb21bZWVwcm9tX3NtYnVzX2FkZHJdICYgMHhGRikgIT0gMHhGRSkpOwogfQotI2VuZGlmCiAKIHN0YXRpYyBpbnQgZTEwMF91cChzdHJ1Y3QgbmljICpuaWMpCiB7CkBAIC0yNzE1LDM0ICsyNzEzLDM1IEBACiAJfQogfQogCisjaWZkZWYgQ09ORklHX1BNCiBzdGF0aWMgaW50IGUxMDBfc3VzcGVuZChzdHJ1Y3QgcGNpX2RldiAqcGRldiwgcG1fbWVzc2FnZV90IHN0YXRlKQogewogCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYgPSBwY2lfZ2V0X2RydmRhdGEocGRldik7CiAJc3RydWN0IG5pYyAqbmljID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKIAorI2lmZGVmIENPTkZJR19FMTAwX05BUEkKIAlpZiAobmV0aWZfcnVubmluZyhuZXRkZXYpKQotCQllMTAwX2Rvd24obmljKTsKLQllMTAwX2h3X3Jlc2V0KG5pYyk7Ci0JbmV0aWZfZGV2aWNlX2RldGFjaChuZXRkZXYpOwotCi0jaWZkZWYgQ09ORklHX1BNCi0JcGNpX3NhdmVfc3RhdGUocGRldik7Ci0JaWYgKG5pYy0+ZmxhZ3MgJiAod29sX21hZ2ljIHwgZTEwMF9hc2YobmljKSkpCi0jZWxzZQotCWlmIChuaWMtPmZsYWdzICYgKHdvbF9tYWdpYykpCisJCW5ldGlmX3BvbGxfZGlzYWJsZShuaWMtPm5ldGRldik7CiAjZW5kaWYKLQkJcGNpX2VuYWJsZV93YWtlKHBkZXYsIHBjaV9jaG9vc2Vfc3RhdGUocGRldiwgc3RhdGUpLCAxKTsKLQllbHNlCi0JCS8qIGRpc2FibGUgUE1FICovCi0JCXBjaV9lbmFibGVfd2FrZShwZGV2LCAwLCAwKTsKKwlkZWxfdGltZXJfc3luYygmbmljLT53YXRjaGRvZyk7CisJbmV0aWZfY2Fycmllcl9vZmYobmljLT5uZXRkZXYpOworCisJcGNpX3NhdmVfc3RhdGUocGRldik7CisKKwlpZiAoKG5pYy0+ZmxhZ3MgJiB3b2xfbWFnaWMpIHwgZTEwMF9hc2YobmljKSkgeworCQlwY2lfZW5hYmxlX3dha2UocGRldiwgUENJX0QzaG90LCAxKTsKKwkJcGNpX2VuYWJsZV93YWtlKHBkZXYsIFBDSV9EM2NvbGQsIDEpOworCX0gZWxzZSB7CisJCXBjaV9lbmFibGVfd2FrZShwZGV2LCBQQ0lfRDNob3QsIDApOworCQlwY2lfZW5hYmxlX3dha2UocGRldiwgUENJX0QzY29sZCwgMCk7CisJfQogCiAJcGNpX2Rpc2FibGVfZGV2aWNlKHBkZXYpOwotCXBjaV9zZXRfcG93ZXJfc3RhdGUocGRldiwgcGNpX2Nob29zZV9zdGF0ZShwZGV2LCBzdGF0ZSkpOworCXBjaV9zZXRfcG93ZXJfc3RhdGUocGRldiwgUENJX0QzaG90KTsKIAogCXJldHVybiAwOwogfQogCi0jaWZkZWYgQ09ORklHX1BNCiBzdGF0aWMgaW50IGUxMDBfcmVzdW1lKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQogewogCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYgPSBwY2lfZ2V0X2RydmRhdGEocGRldik7CkBAIC0yNzY0LDcgKzI3NjMsMjYgQEAKIAogc3RhdGljIHZvaWQgZTEwMF9zaHV0ZG93bihzdHJ1Y3QgcGNpX2RldiAqcGRldikKIHsKLQllMTAwX3N1c3BlbmQocGRldiwgUE1TR19TVVNQRU5EKTsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2ID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOworCXN0cnVjdCBuaWMgKm5pYyA9IG5ldGRldl9wcml2KG5ldGRldik7CisKKyNpZmRlZiBDT05GSUdfRTEwMF9OQVBJCisJaWYgKG5ldGlmX3J1bm5pbmcobmV0ZGV2KSkKKwkJbmV0aWZfcG9sbF9kaXNhYmxlKG5pYy0+bmV0ZGV2KTsKKyNlbmRpZgorCWRlbF90aW1lcl9zeW5jKCZuaWMtPndhdGNoZG9nKTsKKwluZXRpZl9jYXJyaWVyX29mZihuaWMtPm5ldGRldik7CisKKwlpZiAoKG5pYy0+ZmxhZ3MgJiB3b2xfbWFnaWMpIHwgZTEwMF9hc2YobmljKSkgeworCQlwY2lfZW5hYmxlX3dha2UocGRldiwgUENJX0QzaG90LCAxKTsKKwkJcGNpX2VuYWJsZV93YWtlKHBkZXYsIFBDSV9EM2NvbGQsIDEpOworCX0gZWxzZSB7CisJCXBjaV9lbmFibGVfd2FrZShwZGV2LCBQQ0lfRDNob3QsIDApOworCQlwY2lfZW5hYmxlX3dha2UocGRldiwgUENJX0QzY29sZCwgMCk7CisJfQorCisJcGNpX2Rpc2FibGVfZGV2aWNlKHBkZXYpOworCXBjaV9zZXRfcG93ZXJfc3RhdGUocGRldiwgUENJX0QzaG90KTsKIH0KIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tIFBDSSBFcnJvciBSZWNvdmVyeSBpbmZyYXN0cnVjdHVyZSAgLS0tLS0tLS0tLS0tLS0gKi8KQEAgLTI4NDgsOSArMjg2Niw5IEBACiAJLmlkX3RhYmxlID0gICAgIGUxMDBfaWRfdGFibGUsCiAJLnByb2JlID0gICAgICAgIGUxMDBfcHJvYmUsCiAJLnJlbW92ZSA9ICAgICAgIF9fZGV2ZXhpdF9wKGUxMDBfcmVtb3ZlKSwKKyNpZmRlZiBDT05GSUdfUE0KIAkvKiBQb3dlciBNYW5hZ2VtZW50IGhvb2tzICovCiAJLnN1c3BlbmQgPSAgICAgIGUxMDBfc3VzcGVuZCwKLSNpZmRlZiBDT05GSUdfUE0KIAkucmVzdW1lID0gICAgICAgZTEwMF9yZXN1bWUsCiAjZW5kaWYKIAkuc2h1dGRvd24gPSAgICAgZTEwMF9zaHV0ZG93biwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2UxMDAwL2UxMDAwX2V0aHRvb2wuYyBiL2RyaXZlcnMvbmV0L2UxMDAwL2UxMDAwX2V0aHRvb2wuYwppbmRleCA3NzM4MjFlLi5jNTY0YWRiIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9lMTAwMC9lMTAwMF9ldGh0b29sLmMKKysrIGIvZHJpdmVycy9uZXQvZTEwMDAvZTEwMDBfZXRodG9vbC5jCkBAIC00NjEsNyArNDYxLDggQEAKIAlyZWdzX2J1ZmZbMjRdID0gKHVpbnQzMl90KXBoeV9kYXRhOyAgLyogcGh5IGxvY2FsIHJlY2VpdmVyIHN0YXR1cyAqLwogCXJlZ3NfYnVmZlsyNV0gPSByZWdzX2J1ZmZbMjRdOyAgLyogcGh5IHJlbW90ZSByZWNlaXZlciBzdGF0dXMgKi8KIAlpZiAoaHctPm1hY190eXBlID49IGUxMDAwXzgyNTQwICYmCi0JICAgaHctPm1lZGlhX3R5cGUgPT0gZTEwMDBfbWVkaWFfdHlwZV9jb3BwZXIpIHsKKwkgICAgaHctPm1hY190eXBlIDwgZTEwMDBfODI1NzEgJiYKKwkgICAgaHctPm1lZGlhX3R5cGUgPT0gZTEwMDBfbWVkaWFfdHlwZV9jb3BwZXIpIHsKIAkJcmVnc19idWZmWzI2XSA9IEUxMDAwX1JFQURfUkVHKGh3LCBNQU5DKTsKIAl9CiB9CkBAIC0xNjkwLDYgKzE2OTEsNyBAQAogCWludCByZXR2YWwgPSAxOyAvKiBmYWlsIGJ5IGRlZmF1bHQgKi8KIAogCXN3aXRjaCAoaHctPmRldmljZV9pZCkgeworCWNhc2UgRTEwMDBfREVWX0lEXzgyNTQyOgogCWNhc2UgRTEwMDBfREVWX0lEXzgyNTQzR0NfRklCRVI6CiAJY2FzZSBFMTAwMF9ERVZfSURfODI1NDNHQ19DT1BQRVI6CiAJY2FzZSBFMTAwMF9ERVZfSURfODI1NDRFSV9GSUJFUjoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2UxMDAwL2UxMDAwX2h3LmggYi9kcml2ZXJzL25ldC9lMTAwMC9lMTAwMF9ody5oCmluZGV4IDExMjQ0N2YuLjQ0OWE2MDMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2UxMDAwL2UxMDAwX2h3LmgKKysrIGIvZHJpdmVycy9uZXQvZTEwMDAvZTEwMDBfaHcuaApAQCAtMTk2MSw5ICsxOTYxLDkgQEAKICNkZWZpbmUgRTEwMDBfUlhEQ1RMX0dSQU4gICAgMHgwMTAwMDAwMCAvKiBSWERDVEwgR3JhbnVsYXJpdHkgKi8KIAogLyogVHJhbnNtaXQgRGVzY3JpcHRvciBDb250cm9sICovCi0jZGVmaW5lIEUxMDAwX1RYRENUTF9QVEhSRVNIIDB4MDAwMDAwRkYgLyogVFhEQ1RMIFByZWZldGNoIFRocmVzaG9sZCAqLwotI2RlZmluZSBFMTAwMF9UWERDVExfSFRIUkVTSCAweDAwMDBGRjAwIC8qIFRYRENUTCBIb3N0IFRocmVzaG9sZCAqLwotI2RlZmluZSBFMTAwMF9UWERDVExfV1RIUkVTSCAweDAwRkYwMDAwIC8qIFRYRENUTCBXcml0ZWJhY2sgVGhyZXNob2xkICovCisjZGVmaW5lIEUxMDAwX1RYRENUTF9QVEhSRVNIIDB4MDAwMDAwM0YgLyogVFhEQ1RMIFByZWZldGNoIFRocmVzaG9sZCAqLworI2RlZmluZSBFMTAwMF9UWERDVExfSFRIUkVTSCAweDAwMDAzRjAwIC8qIFRYRENUTCBIb3N0IFRocmVzaG9sZCAqLworI2RlZmluZSBFMTAwMF9UWERDVExfV1RIUkVTSCAweDAwM0YwMDAwIC8qIFRYRENUTCBXcml0ZWJhY2sgVGhyZXNob2xkICovCiAjZGVmaW5lIEUxMDAwX1RYRENUTF9HUkFOICAgIDB4MDEwMDAwMDAgLyogVFhEQ1RMIEdyYW51bGFyaXR5ICovCiAjZGVmaW5lIEUxMDAwX1RYRENUTF9MV1RIUkVTSCAweEZFMDAwMDAwIC8qIFRYRENUTCBMb3cgVGhyZXNob2xkICovCiAjZGVmaW5lIEUxMDAwX1RYRENUTF9GVUxMX1RYX0RFU0NfV0IgMHgwMTAxMDAwMCAvKiBHUkFOPTEsIFdUSFJFU0g9MSAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZTEwMDAvZTEwMDBfbWFpbi5jIGIvZHJpdmVycy9uZXQvZTEwMDAvZTEwMDBfbWFpbi5jCmluZGV4IGNlMGQzNWYuLjcyNmVjNWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2UxMDAwL2UxMDAwX21haW4uYworKysgYi9kcml2ZXJzL25ldC9lMTAwMC9lMTAwMF9tYWluLmMKQEAgLTM1LDcgKzM1LDcgQEAKICNlbHNlCiAjZGVmaW5lIERSSVZFUk5BUEkgIi1OQVBJIgogI2VuZGlmCi0jZGVmaW5lIERSVl9WRVJTSU9OICI3LjIuOS1rMiJEUklWRVJOQVBJCisjZGVmaW5lIERSVl9WRVJTSU9OICI3LjIuOS1rNCJEUklWRVJOQVBJCiBjaGFyIGUxMDAwX2RyaXZlcl92ZXJzaW9uW10gPSBEUlZfVkVSU0lPTjsKIHN0YXRpYyBjaGFyIGUxMDAwX2NvcHlyaWdodFtdID0gIkNvcHlyaWdodCAoYykgMTk5OS0yMDA2IEludGVsIENvcnBvcmF0aW9uLiI7CiAKQEAgLTY5OSw3ICs2OTksMTAgQEAKIAkJICAgICAgICAgICAgICAgICAgICBwaHlfZGF0YSk7CiAJfQogCi0JaWYgKChhZGFwdGVyLT5lbl9tbmdfcHQpICYmIChhZGFwdGVyLT5ody5tYWNfdHlwZSA8IGUxMDAwXzgyNTcxKSkgeworCWlmICgoYWRhcHRlci0+ZW5fbW5nX3B0KSAmJgorCSAgICAoYWRhcHRlci0+aHcubWFjX3R5cGUgPj0gZTEwMDBfODI1NDApICYmCisJICAgIChhZGFwdGVyLT5ody5tYWNfdHlwZSA8IGUxMDAwXzgyNTcxKSAmJgorCSAgICAoYWRhcHRlci0+aHcubWVkaWFfdHlwZSA9PSBlMTAwMF9tZWRpYV90eXBlX2NvcHBlcikpIHsKIAkJbWFuYyA9IEUxMDAwX1JFQURfUkVHKCZhZGFwdGVyLT5odywgTUFOQyk7CiAJCW1hbmMgfD0gKEUxMDAwX01BTkNfQVJQX0VOIHwgRTEwMDBfTUFOQ19FTl9NTkcySE9TVCk7CiAJCUUxMDAwX1dSSVRFX1JFRygmYWRhcHRlci0+aHcsIE1BTkMsIG1hbmMpOwpAQCAtMTA3Niw4ICsxMDc5LDkgQEAKIAogCWZsdXNoX3NjaGVkdWxlZF93b3JrKCk7CiAKLQlpZiAoYWRhcHRlci0+aHcubWFjX3R5cGUgPCBlMTAwMF84MjU3MSAmJgotCSAgIGFkYXB0ZXItPmh3Lm1lZGlhX3R5cGUgPT0gZTEwMDBfbWVkaWFfdHlwZV9jb3BwZXIpIHsKKwlpZiAoYWRhcHRlci0+aHcubWFjX3R5cGUgPj0gZTEwMDBfODI1NDAgJiYKKwkgICAgYWRhcHRlci0+aHcubWFjX3R5cGUgPCBlMTAwMF84MjU3MSAmJgorCSAgICBhZGFwdGVyLT5ody5tZWRpYV90eXBlID09IGUxMDAwX21lZGlhX3R5cGVfY29wcGVyKSB7CiAJCW1hbmMgPSBFMTAwMF9SRUFEX1JFRygmYWRhcHRlci0+aHcsIE1BTkMpOwogCQlpZiAobWFuYyAmIEUxMDAwX01BTkNfU01CVVNfRU4pIHsKIAkJCW1hbmMgfD0gRTEwMDBfTUFOQ19BUlBfRU47CkBAIC0xODA0LDkgKzE4MDgsMTEgQEAKIAkgKiBmb2xsb3dlZCBieSB0aGUgcGFnZSBidWZmZXJzLiAgVGhlcmVmb3JlLCBza2ItPmRhdGEgaXMKIAkgKiBzaXplZCB0byBob2xkIHRoZSBsYXJnZXN0IHByb3RvY29sIGhlYWRlci4KIAkgKi8KKwkvKiBhbGxvY2F0aW9ucyB1c2luZyBhbGxvY19wYWdlIHRha2UgdG9vIGxvbmcgZm9yIHJlZ3VsYXIgTVRVCisJICogc28gb25seSBlbmFibGUgcGFja2V0IHNwbGl0IGZvciBqdW1ibyBmcmFtZXMgKi8KIAlwYWdlcyA9IFBBR0VfVVNFX0NPVU5UKGFkYXB0ZXItPm5ldGRldi0+bXR1KTsKLQlpZiAoKGFkYXB0ZXItPmh3Lm1hY190eXBlID4gZTEwMDBfODI1NDdfcmV2XzIpICYmIChwYWdlcyA8PSAzKSAmJgotCSAgICBQQUdFX1NJWkUgPD0gMTYzODQpCisJaWYgKChhZGFwdGVyLT5ody5tYWNfdHlwZSA+PSBlMTAwMF84MjU3MSkgJiYgKHBhZ2VzIDw9IDMpICYmCisJICAgIFBBR0VfU0laRSA8PSAxNjM4NCAmJiAocmN0bCAmIEUxMDAwX1JDVExfTFBFKSkKIAkJYWRhcHRlci0+cnhfcHNfcGFnZXMgPSBwYWdlczsKIAllbHNlCiAJCWFkYXB0ZXItPnJ4X3BzX3BhZ2VzID0gMDsKQEAgLTI5ODYsNiArMjk5MiwxMSBAQAogCQlyZXR1cm4gTkVUREVWX1RYX09LOwogCX0KIAorCS8qIDgyNTcxIGFuZCBuZXdlciBkb2Vzbid0IG5lZWQgdGhlIHdvcmthcm91bmQgdGhhdCBsaW1pdGVkIGRlc2NyaXB0b3IKKwkgKiBsZW5ndGggdG8gNGtCICovCisJaWYgKGFkYXB0ZXItPmh3Lm1hY190eXBlID49IGUxMDAwXzgyNTcxKQorCQltYXhfcGVyX3R4ZCA9IDgxOTI7CisKICNpZmRlZiBORVRJRl9GX1RTTwogCW1zcyA9IHNrYl9zaGluZm8oc2tiKS0+Z3NvX3NpemU7CiAJLyogVGhlIGNvbnRyb2xsZXIgZG9lcyBhIHNpbXBsZSBjYWxjdWxhdGlvbiB0bwpAQCAtMzc3NSw5ICszNzg2LDYgQEAKIAogCQlsZW5ndGggPSBsZTE2X3RvX2NwdShyeF9kZXNjLT5sZW5ndGgpOwogCi0JCS8qIGFkanVzdCBsZW5ndGggdG8gcmVtb3ZlIEV0aGVybmV0IENSQyAqLwotCQlsZW5ndGggLT0gNDsKLQogCQlpZiAodW5saWtlbHkoIShzdGF0dXMgJiBFMTAwMF9SWERfU1RBVF9FT1ApKSkgewogCQkJLyogQWxsIHJlY2VpdmVzIG11c3QgZml0IGludG8gYSBzaW5nbGUgYnVmZmVyICovCiAJCQlFMTAwMF9EQkcoIiVzOiBSZWNlaXZlIHBhY2tldCBjb25zdW1lZCBtdWx0aXBsZSIKQEAgLTM4MDUsNiArMzgxMywxMCBAQAogCQkJfQogCQl9CiAKKwkJLyogYWRqdXN0IGxlbmd0aCB0byByZW1vdmUgRXRoZXJuZXQgQ1JDLCB0aGlzIG11c3QgYmUKKwkJICogZG9uZSBhZnRlciB0aGUgVEJJX0FDQ0VQVCB3b3JrYXJvdW5kIGFib3ZlICovCisJCWxlbmd0aCAtPSA0OworCiAJCS8qIGNvZGUgYWRkZWQgZm9yIGNvcHlicmVhaywgdGhpcyBzaG91bGQgaW1wcm92ZQogCQkgKiBwZXJmb3JtYW5jZSBmb3Igc21hbGwgcGFja2V0cyB3aXRoIGxhcmdlIGFtb3VudHMKIAkJICogb2YgcmVhc3NlbWJseSBiZWluZyBkb25lIGluIHRoZSBzdGFjayAqLwpAQCAtNDc3Myw4ICs0Nzg1LDkgQEAKIAkJcGNpX2VuYWJsZV93YWtlKHBkZXYsIFBDSV9EM2NvbGQsIDApOwogCX0KIAotCWlmIChhZGFwdGVyLT5ody5tYWNfdHlwZSA8IGUxMDAwXzgyNTcxICYmCi0JICAgYWRhcHRlci0+aHcubWVkaWFfdHlwZSA9PSBlMTAwMF9tZWRpYV90eXBlX2NvcHBlcikgeworCWlmIChhZGFwdGVyLT5ody5tYWNfdHlwZSA+PSBlMTAwMF84MjU0MCAmJgorCSAgICBhZGFwdGVyLT5ody5tYWNfdHlwZSA8IGUxMDAwXzgyNTcxICYmCisJICAgIGFkYXB0ZXItPmh3Lm1lZGlhX3R5cGUgPT0gZTEwMDBfbWVkaWFfdHlwZV9jb3BwZXIpIHsKIAkJbWFuYyA9IEUxMDAwX1JFQURfUkVHKCZhZGFwdGVyLT5odywgTUFOQyk7CiAJCWlmIChtYW5jICYgRTEwMDBfTUFOQ19TTUJVU19FTikgewogCQkJbWFuYyB8PSBFMTAwMF9NQU5DX0FSUF9FTjsKQEAgLTQ3ODcsNiArNDgwMCw5IEBACiAJaWYgKGFkYXB0ZXItPmh3LnBoeV90eXBlID09IGUxMDAwX3BoeV9pZ3BfMykKIAkJZTEwMDBfcGh5X3Bvd2VyZG93bl93b3JrYXJvdW5kKCZhZGFwdGVyLT5odyk7CiAKKwlpZiAobmV0aWZfcnVubmluZyhuZXRkZXYpKQorCQllMTAwMF9mcmVlX2lycShhZGFwdGVyKTsKKwogCS8qIFJlbGVhc2UgY29udHJvbCBvZiBoL3cgdG8gZi93LiAgSWYgZi93IGlzIEFNVCBlbmFibGVkLCB0aGlzCiAJICogd291bGQgaGF2ZSBhbHJlYWR5IGhhcHBlbmVkIGluIGNsb3NlIGFuZCBpcyByZWR1bmRhbnQuICovCiAJZTEwMDBfcmVsZWFzZV9od19jb250cm9sKGFkYXB0ZXIpOwpAQCAtNDgxNyw2ICs0ODMzLDEwIEBACiAJcGNpX2VuYWJsZV93YWtlKHBkZXYsIFBDSV9EM2hvdCwgMCk7CiAJcGNpX2VuYWJsZV93YWtlKHBkZXYsIFBDSV9EM2NvbGQsIDApOwogCisJaWYgKG5ldGlmX3J1bm5pbmcobmV0ZGV2KSAmJiAoZXJyID0gZTEwMDBfcmVxdWVzdF9pcnEoYWRhcHRlcikpKQorCQlyZXR1cm4gZXJyOworCisJZTEwMDBfcG93ZXJfdXBfcGh5KGFkYXB0ZXIpOwogCWUxMDAwX3Jlc2V0KGFkYXB0ZXIpOwogCUUxMDAwX1dSSVRFX1JFRygmYWRhcHRlci0+aHcsIFdVUywgfjApOwogCkBAIC00ODI1LDggKzQ4NDUsOSBAQAogCiAJbmV0aWZfZGV2aWNlX2F0dGFjaChuZXRkZXYpOwogCi0JaWYgKGFkYXB0ZXItPmh3Lm1hY190eXBlIDwgZTEwMDBfODI1NzEgJiYKLQkgICBhZGFwdGVyLT5ody5tZWRpYV90eXBlID09IGUxMDAwX21lZGlhX3R5cGVfY29wcGVyKSB7CisJaWYgKGFkYXB0ZXItPmh3Lm1hY190eXBlID49IGUxMDAwXzgyNTQwICYmCisJICAgIGFkYXB0ZXItPmh3Lm1hY190eXBlIDwgZTEwMDBfODI1NzEgJiYKKwkgICAgYWRhcHRlci0+aHcubWVkaWFfdHlwZSA9PSBlMTAwMF9tZWRpYV90eXBlX2NvcHBlcikgewogCQltYW5jID0gRTEwMDBfUkVBRF9SRUcoJmFkYXB0ZXItPmh3LCBNQU5DKTsKIAkJbWFuYyAmPSB+KEUxMDAwX01BTkNfQVJQX0VOKTsKIAkJRTEwMDBfV1JJVEVfUkVHKCZhZGFwdGVyLT5odywgTUFOQywgbWFuYyk7CkBAIC00OTE0LDEwICs0OTM1LDYgQEAKIAlwY2lfZW5hYmxlX3dha2UocGRldiwgUENJX0QzaG90LCAwKTsKIAlwY2lfZW5hYmxlX3dha2UocGRldiwgUENJX0QzY29sZCwgMCk7CiAKLQkvKiBQZXJmb3JtIGNhcmQgcmVzZXQgb25seSBvbiBvbmUgaW5zdGFuY2Ugb2YgdGhlIGNhcmQgKi8KLQlpZiAoUENJX0ZVTkMgKHBkZXYtPmRldmZuKSAhPSAwKQotCQlyZXR1cm4gUENJX0VSU19SRVNVTFRfUkVDT1ZFUkVEOwotCiAJZTEwMDBfcmVzZXQoYWRhcHRlcik7CiAJRTEwMDBfV1JJVEVfUkVHKCZhZGFwdGVyLT5odywgV1VTLCB+MCk7CiAKQEAgLTQ5NDgsNiArNDk2NSw3IEBACiAJbmV0aWZfZGV2aWNlX2F0dGFjaChuZXRkZXYpOwogCiAJaWYgKGFkYXB0ZXItPmh3Lm1hY190eXBlID49IGUxMDAwXzgyNTQwICYmCisJICAgIGFkYXB0ZXItPmh3Lm1hY190eXBlIDwgZTEwMDBfODI1NzEgJiYKIAkgICAgYWRhcHRlci0+aHcubWVkaWFfdHlwZSA9PSBlMTAwMF9tZWRpYV90eXBlX2NvcHBlcikgewogCQltYW5jID0gRTEwMDBfUkVBRF9SRUcoJmFkYXB0ZXItPmh3LCBNQU5DKTsKIAkJbWFuYyAmPSB+KEUxMDAwX01BTkNfQVJQX0VOKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2VoZWEvZWhlYS5oIGIvZHJpdmVycy9uZXQvZWhlYS9laGVhLmgKaW5kZXggMjNiNDUxYS4uMzlhZDlmNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZWhlYS9laGVhLmgKKysrIGIvZHJpdmVycy9uZXQvZWhlYS9laGVhLmgKQEAgLTM5LDcgKzM5LDcgQEAKICNpbmNsdWRlIDxhc20vaW8uaD4KIAogI2RlZmluZSBEUlZfTkFNRQkiZWhlYSIKLSNkZWZpbmUgRFJWX1ZFUlNJT04JIkVIRUFfMDAyOCIKKyNkZWZpbmUgRFJWX1ZFUlNJT04JIkVIRUFfMDA0MyIKIAogI2RlZmluZSBFSEVBX01TR19ERUZBVUxUIChORVRJRl9NU0dfTElOSyB8IE5FVElGX01TR19USU1FUiBcCiAJfCBORVRJRl9NU0dfUlhfRVJSIHwgTkVUSUZfTVNHX1RYX0VSUikKQEAgLTUwLDYgKzUwLDcgQEAKICNkZWZpbmUgRUhFQV9NQVhfRU5UUklFU19TUSAgMzI3NjcKICNkZWZpbmUgRUhFQV9NSU5fRU5UUklFU19RUCAgMTI3CiAKKyNkZWZpbmUgRUhFQV9TTUFMTF9RVUVVRVMKICNkZWZpbmUgRUhFQV9OVU1fVFhfUVAgMQogCiAjaWZkZWYgRUhFQV9TTUFMTF9RVUVVRVMKQEAgLTU5LDExICs2MCwxMSBAQAogI2RlZmluZSBFSEVBX0RFRl9FTlRSSUVTX1JRMiAgICAxMDIzCiAjZGVmaW5lIEVIRUFfREVGX0VOVFJJRVNfUlEzICAgIDEwMjMKICNlbHNlCi0jZGVmaW5lIEVIRUFfTUFYX0NRRV9DT1VOVCAgICAgMzIwMDAKLSNkZWZpbmUgRUhFQV9ERUZfRU5UUklFU19TUSAgICAxNjAwMAotI2RlZmluZSBFSEVBX0RFRl9FTlRSSUVTX1JRMSAgIDMyMDgwCi0jZGVmaW5lIEVIRUFfREVGX0VOVFJJRVNfUlEyICAgIDQwMjAKLSNkZWZpbmUgRUhFQV9ERUZfRU5UUklFU19SUTMgICAgNDAyMAorI2RlZmluZSBFSEVBX01BWF9DUUVfQ09VTlQgICAgICA0MDgwCisjZGVmaW5lIEVIRUFfREVGX0VOVFJJRVNfU1EgICAgIDQwODAKKyNkZWZpbmUgRUhFQV9ERUZfRU5UUklFU19SUTEgICAgODE2MAorI2RlZmluZSBFSEVBX0RFRl9FTlRSSUVTX1JRMiAgICAyMDQwCisjZGVmaW5lIEVIRUFfREVGX0VOVFJJRVNfUlEzICAgIDIwNDAKICNlbmRpZgogCiAjZGVmaW5lIEVIRUFfTUFYX0VOVFJJRVNfRVEgMjAKQEAgLTEwNCw5ICsxMDUsNiBAQAogI2RlZmluZSBFSEVBX0JDTUNfVkxBTklEX0FMTAkweDAxCiAjZGVmaW5lIEVIRUFfQkNNQ19WTEFOSURfU0lOR0xFCTB4MDAKIAotLyogVXNlIHRoaXMgZGVmaW5lIHRvIGttYWxsb2NhdGUgcEhZUCBjb250cm9sIGJsb2NrcyAqLwotI2RlZmluZSBIX0NCX0FMSUdOTUVOVAkJNDA5NgotCiAjZGVmaW5lIEVIRUFfQ0FDSEVfTElORSAgICAgICAgICAxMjgKIAogLyogTWVtb3J5IFJlZ2lvbnMgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2VoZWEvZWhlYV9ldGh0b29sLmMgYi9kcml2ZXJzL25ldC9laGVhL2VoZWFfZXRodG9vbC5jCmluZGV4IDgyZWIyZmIuLjlmNTdjMmUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2VoZWEvZWhlYV9ldGh0b29sLmMKKysrIGIvZHJpdmVycy9uZXQvZWhlYS9laGVhX2V0aHRvb2wuYwpAQCAtMjM4LDcgKzIzOCw3IEBACiAJZGF0YVtpKytdID0gcG9ydC0+cG9ydF9yZXNbMF0uc3dxZV9yZWZpbGxfdGg7CiAJZGF0YVtpKytdID0gcG9ydC0+cmVzZXRzOwogCi0JY2I2ID0ga3phbGxvYyhIX0NCX0FMSUdOTUVOVCwgR0ZQX0tFUk5FTCk7CisJY2I2ID0ga3phbGxvYyhQQUdFX1NJWkUsIEdGUF9LRVJORUwpOwogCWlmICghY2I2KSB7CiAJCWVoZWFfZXJyb3IoIm5vIG1lbSBmb3IgY2I2Iik7CiAJCXJldHVybjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2VoZWEvZWhlYV9tYWluLmMgYi9kcml2ZXJzL25ldC9laGVhL2VoZWFfbWFpbi5jCmluZGV4IGM2YjMxNzcuLjZhZDY5NjEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2VoZWEvZWhlYV9tYWluLmMKKysrIGIvZHJpdmVycy9uZXQvZWhlYS9laGVhX21haW4uYwpAQCAtOTIsNyArOTIsNyBAQAogCiAJbWVtc2V0KHN0YXRzLCAwLCBzaXplb2YoKnN0YXRzKSk7CiAKLQljYjIgPSBremFsbG9jKEhfQ0JfQUxJR05NRU5ULCBHRlBfS0VSTkVMKTsKKwljYjIgPSBremFsbG9jKFBBR0VfU0laRSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFjYjIpIHsKIAkJZWhlYV9lcnJvcigibm8gbWVtIGZvciBjYjIiKTsKIAkJZ290byBvdXQ7CkBAIC01ODYsOCArNTg2LDggQEAKIAl1NjQgaHJldDsKIAlzdHJ1Y3QgaGNwX2VoZWFfcG9ydF9jYjAgKmNiMDsKIAotCWNiMCA9IGt6YWxsb2MoSF9DQl9BTElHTk1FTlQsIEdGUF9LRVJORUwpOwotCWlmICghY2IwKSB7CisJY2IwID0ga3phbGxvYyhQQUdFX1NJWkUsIEdGUF9BVE9NSUMpOyAgIC8qIE1heSBiZSBjYWxsZWQgdmlhICovCisJaWYgKCFjYjApIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGVoZWFfbmVxX3Rhc2tsZXQoKSAqLwogCQllaGVhX2Vycm9yKCJubyBtZW0gZm9yIGNiMCIpOwogCQlyZXQgPSAtRU5PTUVNOwogCQlnb3RvIG91dDsKQEAgLTY3MCw3ICs2NzAsNyBAQAogCXU2NCBocmV0OwogCWludCByZXQgPSAwOwogCi0JY2I0ID0ga3phbGxvYyhIX0NCX0FMSUdOTUVOVCwgR0ZQX0tFUk5FTCk7CisJY2I0ID0ga3phbGxvYyhQQUdFX1NJWkUsIEdGUF9LRVJORUwpOwogCWlmICghY2I0KSB7CiAJCWVoZWFfZXJyb3IoIm5vIG1lbSBmb3IgY2I0Iik7CiAJCXJldCA9IC1FTk9NRU07CkBAIC03NjUsOCArNzY1LDcgQEAKIAogCQlpZiAoRUhFQV9CTUFTS19HRVQoTkVRRV9QT1JUX1VQLCBlcWUpKSB7CiAJCQlpZiAoIW5ldGlmX2NhcnJpZXJfb2socG9ydC0+bmV0ZGV2KSkgewotCQkJCXJldCA9IGVoZWFfc2Vuc2VfcG9ydF9hdHRyKAotCQkJCQlhZGFwdGVyLT5wb3J0W3BvcnRudW1dKTsKKwkJCQlyZXQgPSBlaGVhX3NlbnNlX3BvcnRfYXR0cihwb3J0KTsKIAkJCQlpZiAocmV0KSB7CiAJCQkJCWVoZWFfZXJyb3IoImZhaWxlZCByZXNlbnNpbmcgcG9ydCAiCiAJCQkJCQkgICAiYXR0cmlidXRlcyIpOwpAQCAtODE4LDcgKzgxNyw3IEBACiAJCW5ldGlmX3N0b3BfcXVldWUocG9ydC0+bmV0ZGV2KTsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKLQkJZWhlYV9lcnJvcigidW5rbm93biBldmVudCBjb2RlICV4IiwgZWMpOworCQllaGVhX2Vycm9yKCJ1bmtub3duIGV2ZW50IGNvZGUgJXgsIGVxZT0weCVsWCIsIGVjLCBlcWUpOwogCQlicmVhazsKIAl9CiB9CkBAIC05ODYsNyArOTg1LDcgQEAKIAlzdHJ1Y3QgaGNwX2VoZWFfcG9ydF9jYjAgKmNiMDsKIAogCXJldCA9IC1FTk9NRU07Ci0JY2IwID0ga3phbGxvYyhIX0NCX0FMSUdOTUVOVCwgR0ZQX0tFUk5FTCk7CisJY2IwID0ga3phbGxvYyhQQUdFX1NJWkUsIEdGUF9LRVJORUwpOwogCWlmICghY2IwKQogCQlnb3RvIG91dDsKIApAQCAtMTQ0NCw3ICsxNDQzLDcgQEAKIAkJZ290byBvdXQ7CiAJfQogCi0JY2IwID0ga3phbGxvYyhIX0NCX0FMSUdOTUVOVCwgR0ZQX0tFUk5FTCk7CisJY2IwID0ga3phbGxvYyhQQUdFX1NJWkUsIEdGUF9LRVJORUwpOwogCWlmICghY2IwKSB7CiAJCWVoZWFfZXJyb3IoIm5vIG1lbSBmb3IgY2IwIik7CiAJCXJldCA9IC1FTk9NRU07CkBAIC0xNTAyLDcgKzE1MDEsNyBAQAogCWlmICgoZW5hYmxlICYmIHBvcnQtPnByb21pc2MpIHx8ICghZW5hYmxlICYmICFwb3J0LT5wcm9taXNjKSkKIAkJcmV0dXJuOwogCi0JY2I3ID0ga3phbGxvYyhIX0NCX0FMSUdOTUVOVCwgR0ZQX0tFUk5FTCk7CisJY2I3ID0ga3phbGxvYyhQQUdFX1NJWkUsIEdGUF9BVE9NSUMpOwogCWlmICghY2I3KSB7CiAJCWVoZWFfZXJyb3IoIm5vIG1lbSBmb3IgY2I3Iik7CiAJCWdvdG8gb3V0OwpAQCAtMTYwNiw3ICsxNjA1LDcgQEAKIAlzdHJ1Y3QgZWhlYV9tY19saXN0ICplaGVhX21jbF9lbnRyeTsKIAl1NjQgaHJldDsKIAotCWVoZWFfbWNsX2VudHJ5ID0ga3phbGxvYyhzaXplb2YoKmVoZWFfbWNsX2VudHJ5KSwgR0ZQX0tFUk5FTCk7CisJZWhlYV9tY2xfZW50cnkgPSBremFsbG9jKHNpemVvZigqZWhlYV9tY2xfZW50cnkpLCBHRlBfQVRPTUlDKTsKIAlpZiAoIWVoZWFfbWNsX2VudHJ5KSB7CiAJCWVoZWFfZXJyb3IoIm5vIG1lbSBmb3IgbWNsX2VudHJ5Iik7CiAJCXJldHVybjsKQEAgLTE4NDEsNyArMTg0MCw3IEBACiAKIAlpZiAobmV0aWZfbXNnX3R4X3F1ZXVlZChwb3J0KSkgewogCQllaGVhX2luZm8oInBvc3Qgc3dxZSBvbiBRUCAlZCIsIHByLT5xcC0+aW5pdF9hdHRyLnFwX25yKTsKLQkJZWhlYV9kdW1wKHN3cWUsIHNpemVvZigqc3dxZSksICJzd3FlIik7CisJCWVoZWFfZHVtcChzd3FlLCA1MTIsICJzd3FlIik7CiAJfQogCiAJZWhlYV9wb3N0X3N3cWUocHItPnFwLCBzd3FlKTsKQEAgLTE4NzEsNyArMTg3MCw3IEBACiAKIAlwb3J0LT52Z3JwID0gZ3JwOwogCi0JY2IxID0ga3phbGxvYyhIX0NCX0FMSUdOTUVOVCwgR0ZQX0tFUk5FTCk7CisJY2IxID0ga3phbGxvYyhQQUdFX1NJWkUsIEdGUF9LRVJORUwpOwogCWlmICghY2IxKSB7CiAJCWVoZWFfZXJyb3IoIm5vIG1lbSBmb3IgY2IxIik7CiAJCWdvdG8gb3V0OwpAQCAtMTkwMCw3ICsxODk5LDcgQEAKIAlpbnQgaW5kZXg7CiAJdTY0IGhyZXQ7CiAKLQljYjEgPSBremFsbG9jKEhfQ0JfQUxJR05NRU5ULCBHRlBfS0VSTkVMKTsKKwljYjEgPSBremFsbG9jKFBBR0VfU0laRSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFjYjEpIHsKIAkJZWhlYV9lcnJvcigibm8gbWVtIGZvciBjYjEiKTsKIAkJZ290byBvdXQ7CkBAIC0xOTM2LDcgKzE5MzUsNyBAQAogCWlmIChwb3J0LT52Z3JwKQogCQlwb3J0LT52Z3JwLT52bGFuX2RldmljZXNbdmlkXSA9IE5VTEw7CiAKLQljYjEgPSBremFsbG9jKEhfQ0JfQUxJR05NRU5ULCBHRlBfS0VSTkVMKTsKKwljYjEgPSBremFsbG9jKFBBR0VfU0laRSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFjYjEpIHsKIAkJZWhlYV9lcnJvcigibm8gbWVtIGZvciBjYjEiKTsKIAkJZ290byBvdXQ7CkBAIC0xOTY5LDcgKzE5NjgsNyBAQAogCXU2NCBkdW1teTY0ID0gMDsKIAlzdHJ1Y3QgaGNwX21vZGlmeV9xcF9jYjAqIGNiMDsKIAotCWNiMCA9IGt6YWxsb2MoSF9DQl9BTElHTk1FTlQsIEdGUF9LRVJORUwpOworCWNiMCA9IGt6YWxsb2MoUEFHRV9TSVpFLCBHRlBfS0VSTkVMKTsKIAlpZiAoIWNiMCkgewogCQlyZXQgPSAtRU5PTUVNOwogCQlnb3RvIG91dDsKQEAgLTIyNzAsNyArMjI2OSw3IEBACiAJdTY0IGhyZXQ7CiAJaW50IHJldDsKIAotCWNiID0ga3phbGxvYyhIX0NCX0FMSUdOTUVOVCwgR0ZQX0tFUk5FTCk7CisJY2IgPSBremFsbG9jKFBBR0VfU0laRSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFjYikgewogCQlyZXQgPSAtRU5PTUVNOwogCQlnb3RvIG91dDsKQEAgLTIzNDEsNyArMjM0MCw3IEBACiAJCWdvdG8gb3V0OwogCiAJLyogRW5hYmxlIEp1bWJvIGZyYW1lcyAqLwotCWNiNCA9IGt6YWxsb2MoSF9DQl9BTElHTk1FTlQsIEdGUF9LRVJORUwpOworCWNiNCA9IGt6YWxsb2MoUEFHRV9TSVpFLCBHRlBfS0VSTkVMKTsKIAlpZiAoIWNiNCkgewogCQllaGVhX2Vycm9yKCJubyBtZW0gZm9yIGNiNCIpOwogCX0gZWxzZSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9laGVhL2VoZWFfcGh5cC5jIGIvZHJpdmVycy9uZXQvZWhlYS9laGVhX3BoeXAuYwppbmRleCA0YTg1YWNhLi4wY2ZjMmJjIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9laGVhL2VoZWFfcGh5cC5jCisrKyBiL2RyaXZlcnMvbmV0L2VoZWEvZWhlYV9waHlwLmMKQEAgLTQ0LDcxICs0NCw5OSBAQAogI2RlZmluZSBIX0FMTF9SRVNfVFlQRV9NUiAgICAgICAgNQogI2RlZmluZSBIX0FMTF9SRVNfVFlQRV9NVyAgICAgICAgNgogCi1zdGF0aWMgbG9uZyBlaGVhX2hjYWxsXzlhcmdfOXJldCh1bnNpZ25lZCBsb25nIG9wY29kZSwKLSAgICAgICAgIAkJCSB1bnNpZ25lZCBsb25nIGFyZzEsIHVuc2lnbmVkIGxvbmcgYXJnMiwKLSAgICAgICAgIAkJCSB1bnNpZ25lZCBsb25nIGFyZzMsIHVuc2lnbmVkIGxvbmcgYXJnNCwKLSAgICAgICAgIAkJCSB1bnNpZ25lZCBsb25nIGFyZzUsIHVuc2lnbmVkIGxvbmcgYXJnNiwKLSAgICAgICAgIAkJCSB1bnNpZ25lZCBsb25nIGFyZzcsIHVuc2lnbmVkIGxvbmcgYXJnOCwKLSAgICAgICAgIAkJCSB1bnNpZ25lZCBsb25nIGFyZzksIHVuc2lnbmVkIGxvbmcgKm91dDEsCi0gICAgICAgICAJCQkgdW5zaWduZWQgbG9uZyAqb3V0Mix1bnNpZ25lZCBsb25nICpvdXQzLAotICAgICAgICAgCQkJIHVuc2lnbmVkIGxvbmcgKm91dDQsdW5zaWduZWQgbG9uZyAqb3V0NSwKLSAgICAgICAgIAkJCSB1bnNpZ25lZCBsb25nICpvdXQ2LHVuc2lnbmVkIGxvbmcgKm91dDcsCi0gICAgICAgICAJCQkgdW5zaWduZWQgbG9uZyAqb3V0OCx1bnNpZ25lZCBsb25nICpvdXQ5KQorc3RhdGljIGxvbmcgZWhlYV9wbHBhcl9oY2FsbF9ub3JldHModW5zaWduZWQgbG9uZyBvcGNvZGUsCisJCQkJICAgIHVuc2lnbmVkIGxvbmcgYXJnMSwKKwkJCQkgICAgdW5zaWduZWQgbG9uZyBhcmcyLAorCQkJCSAgICB1bnNpZ25lZCBsb25nIGFyZzMsCisJCQkJICAgIHVuc2lnbmVkIGxvbmcgYXJnNCwKKwkJCQkgICAgdW5zaWduZWQgbG9uZyBhcmc1LAorCQkJCSAgICB1bnNpZ25lZCBsb25nIGFyZzYsCisJCQkJICAgIHVuc2lnbmVkIGxvbmcgYXJnNykKIHsKLQlsb25nIGhyZXQ7CisJbG9uZyByZXQ7CiAJaW50IGksIHNsZWVwX21zZWNzOwogCiAJZm9yIChpID0gMDsgaSA8IDU7IGkrKykgewotCQlocmV0ID0gcGxwYXJfaGNhbGxfOWFyZ185cmV0KG9wY29kZSxhcmcxLCBhcmcyLCBhcmczLCBhcmc0LAotCQkJCQkgICAgIGFyZzUsIGFyZzYsIGFyZzcsIGFyZzgsIGFyZzksIG91dDEsCi0JCQkJCSAgICAgb3V0Miwgb3V0Mywgb3V0NCwgb3V0NSwgb3V0Niwgb3V0NywKLQkJCQkJICAgICBvdXQ4LCBvdXQ5KTsKLQkJaWYgKEhfSVNfTE9OR19CVVNZKGhyZXQpKSB7Ci0JCQlzbGVlcF9tc2VjcyA9IGdldF9sb25nYnVzeV9tc2VjcyhocmV0KTsKKwkJcmV0ID0gcGxwYXJfaGNhbGxfbm9yZXRzKG9wY29kZSwgYXJnMSwgYXJnMiwgYXJnMywgYXJnNCwKKwkJCQkJIGFyZzUsIGFyZzYsIGFyZzcpOworCisJCWlmIChIX0lTX0xPTkdfQlVTWShyZXQpKSB7CisJCQlzbGVlcF9tc2VjcyA9IGdldF9sb25nYnVzeV9tc2VjcyhyZXQpOwogCQkJbXNsZWVwX2ludGVycnVwdGlibGUoc2xlZXBfbXNlY3MpOwogCQkJY29udGludWU7CiAJCX0KIAotCQlpZiAoaHJldCA8IEhfU1VDQ0VTUykKLQkJCWVoZWFfZXJyb3IoIm9wPSVseCBocmV0PSVseCAiCi0JCQkJICAgImkxPSVseCBpMj0lbHggaTM9JWx4IGk0PSVseCBpNT0lbHggaTY9JWx4ICIKLQkJCQkgICAiaTc9JWx4IGk4PSVseCBpOT0lbHggIgotCQkJCSAgICJvMT0lbHggbzI9JWx4IG8zPSVseCBvND0lbHggbzU9JWx4IG82PSVseCAiCi0JCQkJICAgIm83PSVseCBvOD0lbHggbzk9JWx4IiwKLQkJCQkgICBvcGNvZGUsIGhyZXQsIGFyZzEsIGFyZzIsIGFyZzMsIGFyZzQsIGFyZzUsCi0JCQkJICAgYXJnNiwgYXJnNywgYXJnOCwgYXJnOSwgKm91dDEsICpvdXQyLCAqb3V0MywKLQkJCQkgICAqb3V0NCwgKm91dDUsICpvdXQ2LCAqb3V0NywgKm91dDgsICpvdXQ5KTsKLQkJcmV0dXJuIGhyZXQ7CisJCWlmIChyZXQgPCBIX1NVQ0NFU1MpCisJCQllaGVhX2Vycm9yKCJvcGNvZGU9JWx4IHJldD0lbHgiCisJCQkJICAgIiBhcmcxPSVseCBhcmcyPSVseCBhcmczPSVseCBhcmc0PSVseCIKKwkJCQkgICAiIGFyZzU9JWx4IGFyZzY9JWx4IGFyZzc9JWx4ICIsCisJCQkJICAgb3Bjb2RlLCByZXQsCisJCQkJICAgYXJnMSwgYXJnMiwgYXJnMywgYXJnNCwgYXJnNSwKKwkJCQkgICBhcmc2LCBhcmc3KTsKKworCQlyZXR1cm4gcmV0OwogCX0KKworCXJldHVybiBIX0JVU1k7Cit9CisKK3N0YXRpYyBsb25nIGVoZWFfcGxwYXJfaGNhbGw5KHVuc2lnbmVkIGxvbmcgb3Bjb2RlLAorCQkJICAgICAgdW5zaWduZWQgbG9uZyAqb3V0cywgLyogYXJyYXkgb2YgOSBvdXRwdXRzICovCisJCQkgICAgICB1bnNpZ25lZCBsb25nIGFyZzEsCisJCQkgICAgICB1bnNpZ25lZCBsb25nIGFyZzIsCisJCQkgICAgICB1bnNpZ25lZCBsb25nIGFyZzMsCisJCQkgICAgICB1bnNpZ25lZCBsb25nIGFyZzQsCisJCQkgICAgICB1bnNpZ25lZCBsb25nIGFyZzUsCisJCQkgICAgICB1bnNpZ25lZCBsb25nIGFyZzYsCisJCQkgICAgICB1bnNpZ25lZCBsb25nIGFyZzcsCisJCQkgICAgICB1bnNpZ25lZCBsb25nIGFyZzgsCisJCQkgICAgICB1bnNpZ25lZCBsb25nIGFyZzkpCit7CisJbG9uZyByZXQ7CisJaW50IGksIHNsZWVwX21zZWNzOworCisJZm9yIChpID0gMDsgaSA8IDU7IGkrKykgeworCQlyZXQgPSBwbHBhcl9oY2FsbDkob3Bjb2RlLCBvdXRzLAorCQkJCSAgIGFyZzEsIGFyZzIsIGFyZzMsIGFyZzQsIGFyZzUsCisJCQkJICAgYXJnNiwgYXJnNywgYXJnOCwgYXJnOSk7CisKKwkJaWYgKEhfSVNfTE9OR19CVVNZKHJldCkpIHsKKwkJCXNsZWVwX21zZWNzID0gZ2V0X2xvbmdidXN5X21zZWNzKHJldCk7CisJCQltc2xlZXBfaW50ZXJydXB0aWJsZShzbGVlcF9tc2Vjcyk7CisJCQljb250aW51ZTsKKwkJfQorCisJCWlmIChyZXQgPCBIX1NVQ0NFU1MpCisJCQllaGVhX2Vycm9yKCJvcGNvZGU9JWx4IHJldD0lbHgiCisJCQkJICAgIiBhcmcxPSVseCBhcmcyPSVseCBhcmczPSVseCBhcmc0PSVseCIKKwkJCQkgICAiIGFyZzU9JWx4IGFyZzY9JWx4IGFyZzc9JWx4IGFyZzg9JWx4IgorCQkJCSAgICIgYXJnOT0lbHgiCisJCQkJICAgIiBvdXQxPSVseCBvdXQyPSVseCBvdXQzPSVseCBvdXQ0PSVseCIKKwkJCQkgICAiIG91dDU9JWx4IG91dDY9JWx4IG91dDc9JWx4IG91dDg9JWx4IgorCQkJCSAgICIgb3V0OT0lbHgiLAorCQkJCSAgIG9wY29kZSwgcmV0LAorCQkJCSAgIGFyZzEsIGFyZzIsIGFyZzMsIGFyZzQsIGFyZzUsCisJCQkJICAgYXJnNiwgYXJnNywgYXJnOCwgYXJnOSwKKwkJCQkgICBvdXRzWzBdLCBvdXRzWzFdLCBvdXRzWzJdLCBvdXRzWzNdLAorCQkJCSAgIG91dHNbNF0sIG91dHNbNV0sIG91dHNbNl0sIG91dHNbN10sCisJCQkJICAgb3V0c1s4XSk7CisKKwkJcmV0dXJuIHJldDsKKwl9CisKIAlyZXR1cm4gSF9CVVNZOwogfQogCiB1NjQgZWhlYV9oX3F1ZXJ5X2VoZWFfcXAoY29uc3QgdTY0IGFkYXB0ZXJfaGFuZGxlLCBjb25zdCB1OCBxcF9jYXRlZ29yeSwKIAkJCSBjb25zdCB1NjQgcXBfaGFuZGxlLCBjb25zdCB1NjQgc2VsX21hc2ssIHZvaWQgKmNiX2FkZHIpCiB7Ci0JdTY0IGR1bW15OwotCi0JaWYgKCgoKHU2NCljYl9hZGRyKSAmIChQQUdFX1NJWkUgLSAxKSkgIT0gMCkgewotCQllaGVhX2Vycm9yKCJub3Qgb24gcGFnZWJvdW5kYXJ5Iik7Ci0JCXJldHVybiBIX1BBUkFNRVRFUjsKLQl9Ci0KLQlyZXR1cm4gZWhlYV9oY2FsbF85YXJnXzlyZXQoSF9RVUVSWV9IRUFfUVAsCi0JCQkJICAgIGFkYXB0ZXJfaGFuZGxlLAkgICAgICAgIC8qIFI0ICovCi0JCQkJICAgIHFwX2NhdGVnb3J5LAkgICAgICAgIC8qIFI1ICovCi0JCQkJICAgIHFwX2hhbmRsZSwJICAgICAgICAgICAgICAgIC8qIFI2ICovCi0JCQkJICAgIHNlbF9tYXNrLAkgICAgICAgICAgICAgICAgLyogUjcgKi8KLQkJCQkgICAgdmlydF90b19hYnMoY2JfYWRkciksCS8qIFI4ICovCi0JCQkJICAgIDAsIDAsIDAsIDAsCSAgICAgICAgICAgICAgICAvKiBSOS1SMTIgKi8KLQkJCQkgICAgJmR1bW15LCAgICAgICAgICAgICAgICAgICAgIC8qIFI0ICovCi0JCQkJICAgICZkdW1teSwgICAgICAgICAgICAgICAgICAgICAvKiBSNSAqLwotCQkJCSAgICAmZHVtbXksCSAgICAgICAgICAgICAgICAvKiBSNiAqLwotCQkJCSAgICAmZHVtbXksCSAgICAgICAgICAgICAgICAvKiBSNyAqLwotCQkJCSAgICAmZHVtbXksCSAgICAgICAgICAgICAgICAvKiBSOCAqLwotCQkJCSAgICAmZHVtbXksCSAgICAgICAgICAgICAgICAvKiBSOSAqLwotCQkJCSAgICAmZHVtbXksCSAgICAgICAgICAgICAgICAvKiBSMTAgKi8KLQkJCQkgICAgJmR1bW15LAkgICAgICAgICAgICAgICAgLyogUjExICovCi0JCQkJICAgICZkdW1teSk7CSAgICAgICAgICAgICAgICAvKiBSMTIgKi8KKwlyZXR1cm4gZWhlYV9wbHBhcl9oY2FsbF9ub3JldHMoSF9RVUVSWV9IRUFfUVAsCisJCQkJICAgICAgIGFkYXB0ZXJfaGFuZGxlLAkgICAgICAgIC8qIFI0ICovCisJCQkJICAgICAgIHFwX2NhdGVnb3J5LAkgICAgICAgIC8qIFI1ICovCisJCQkJICAgICAgIHFwX2hhbmRsZSwgICAgICAgICAgICAgICAvKiBSNiAqLworCQkJCSAgICAgICBzZWxfbWFzaywgICAgICAgICAgICAgICAgLyogUjcgKi8KKwkJCQkgICAgICAgdmlydF90b19hYnMoY2JfYWRkciksCS8qIFI4ICovCisJCQkJICAgICAgIDAsIDApOwogfQogCiAvKiBpbnB1dCBwYXJhbSBSNSAqLwpAQCAtMTgwLDYgKzIwOCw3IEBACiAJCQkgICAgIHU2NCAqcXBfaGFuZGxlLCBzdHJ1Y3QgaF9lcGFzICpoX2VwYXMpCiB7CiAJdTY0IGhyZXQ7CisJdTY0IG91dHNbUExQQVJfSENBTEw5X0JVRlNJWkVdOwogCiAJdTY0IGFsbG9jYXRlX2NvbnRyb2xzID0KIAkgICAgRUhFQV9CTUFTS19TRVQoSF9BTExfUkVTX1FQX0VRUE8sIGluaXRfYXR0ci0+bG93X2xhdF9ycTEgPyAxIDogMCkKQEAgLTIxOSw0NSArMjQ4LDI5IEBACiAJICAgIEVIRUFfQk1BU0tfU0VUKEhfQUxMX1JFU19RUF9USF9SUTIsIGluaXRfYXR0ci0+cnEyX3RocmVzaG9sZCkKIAkgICAgfCBFSEVBX0JNQVNLX1NFVChIX0FMTF9SRVNfUVBfVEhfUlEzLCBpbml0X2F0dHItPnJxM190aHJlc2hvbGQpOwogCi0JdTY0IHI1X291dCA9IDA7Ci0JdTY0IHI2X291dCA9IDA7Ci0JdTY0IHI3X291dCA9IDA7Ci0JdTY0IHI4X291dCA9IDA7Ci0JdTY0IHI5X291dCA9IDA7Ci0JdTY0IGdfbGFfdXNlcl9vdXQgPSAwOwotCXU2NCByMTFfb3V0ID0gMDsKLQl1NjQgcjEyX291dCA9IDA7CisJaHJldCA9IGVoZWFfcGxwYXJfaGNhbGw5KEhfQUxMT0NfSEVBX1JFU09VUkNFLAorCQkJCSBvdXRzLAorCQkJCSBhZGFwdGVyX2hhbmRsZSwJCS8qIFI0ICovCisJCQkJIGFsbG9jYXRlX2NvbnRyb2xzLAkJLyogUjUgKi8KKwkJCQkgaW5pdF9hdHRyLT5zZW5kX2NxX2hhbmRsZSwJLyogUjYgKi8KKwkJCQkgaW5pdF9hdHRyLT5yZWN2X2NxX2hhbmRsZSwJLyogUjcgKi8KKwkJCQkgaW5pdF9hdHRyLT5hZmZfZXFfaGFuZGxlLAkvKiBSOCAqLworCQkJCSByOV9yZWcsCQkJLyogUjkgKi8KKwkJCQkgbWF4X3IxMF9yZWcsCQkJLyogUjEwICovCisJCQkJIHIxMV9pbiwJCQkvKiBSMTEgKi8KKwkJCQkgdGhyZXNob2xkKTsJCQkvKiBSMTIgKi8KIAotCWhyZXQgPSBlaGVhX2hjYWxsXzlhcmdfOXJldChIX0FMTE9DX0hFQV9SRVNPVVJDRSwKLQkJCQkgICAgYWRhcHRlcl9oYW5kbGUsCQkvKiBSNCAqLwotCQkJCSAgICBhbGxvY2F0ZV9jb250cm9scywJCS8qIFI1ICovCi0JCQkJICAgIGluaXRfYXR0ci0+c2VuZF9jcV9oYW5kbGUsCS8qIFI2ICovCi0JCQkJICAgIGluaXRfYXR0ci0+cmVjdl9jcV9oYW5kbGUsCS8qIFI3ICovCi0JCQkJICAgIGluaXRfYXR0ci0+YWZmX2VxX2hhbmRsZSwJLyogUjggKi8KLQkJCQkgICAgcjlfcmVnLAkJCS8qIFI5ICovCi0JCQkJICAgIG1heF9yMTBfcmVnLAkJLyogUjEwICovCi0JCQkJICAgIHIxMV9pbiwJCQkvKiBSMTEgKi8KLQkJCQkgICAgdGhyZXNob2xkLAkJCS8qIFIxMiAqLwotCQkJCSAgICBxcF9oYW5kbGUsCQkJLyogUjQgKi8KLQkJCQkgICAgJnI1X291dCwJCQkvKiBSNSAqLwotCQkJCSAgICAmcjZfb3V0LAkJCS8qIFI2ICovCi0JCQkJICAgICZyN19vdXQsCQkJLyogUjcgKi8KLQkJCQkgICAgJnI4X291dCwJCQkvKiBSOCAqLwotCQkJCSAgICAmcjlfb3V0LAkJCS8qIFI5ICovCi0JCQkJICAgICZnX2xhX3VzZXJfb3V0LAkJLyogUjEwICovCi0JCQkJICAgICZyMTFfb3V0LAkJCS8qIFIxMSAqLwotCQkJCSAgICAmcjEyX291dCk7CQkJLyogUjEyICovCi0KLQlpbml0X2F0dHItPnFwX25yID0gKHUzMilyNV9vdXQ7CisJKnFwX2hhbmRsZSA9IG91dHNbMF07CisJaW5pdF9hdHRyLT5xcF9uciA9ICh1MzIpb3V0c1sxXTsKIAogCWluaXRfYXR0ci0+YWN0X25yX3NlbmRfd3FlcyA9Ci0JICAgICh1MTYpRUhFQV9CTUFTS19HRVQoSF9BTExfUkVTX1FQX0FDVF9TV1FFLCByNl9vdXQpOworCSAgICAodTE2KUVIRUFfQk1BU0tfR0VUKEhfQUxMX1JFU19RUF9BQ1RfU1dRRSwgb3V0c1syXSk7CiAJaW5pdF9hdHRyLT5hY3RfbnJfcndxZXNfcnExID0KLQkgICAgKHUxNilFSEVBX0JNQVNLX0dFVChIX0FMTF9SRVNfUVBfQUNUX1IxV1FFLCByNl9vdXQpOworCSAgICAodTE2KUVIRUFfQk1BU0tfR0VUKEhfQUxMX1JFU19RUF9BQ1RfUjFXUUUsIG91dHNbMl0pOwogCWluaXRfYXR0ci0+YWN0X25yX3J3cWVzX3JxMiA9Ci0JICAgICh1MTYpRUhFQV9CTUFTS19HRVQoSF9BTExfUkVTX1FQX0FDVF9SMldRRSwgcjZfb3V0KTsKKwkgICAgKHUxNilFSEVBX0JNQVNLX0dFVChIX0FMTF9SRVNfUVBfQUNUX1IyV1FFLCBvdXRzWzJdKTsKIAlpbml0X2F0dHItPmFjdF9ucl9yd3Flc19ycTMgPQotCSAgICAodTE2KUVIRUFfQk1BU0tfR0VUKEhfQUxMX1JFU19RUF9BQ1RfUjNXUUUsIHI2X291dCk7CisJICAgICh1MTYpRUhFQV9CTUFTS19HRVQoSF9BTExfUkVTX1FQX0FDVF9SM1dRRSwgb3V0c1syXSk7CiAKIAlpbml0X2F0dHItPmFjdF93cWVfc2l6ZV9lbmNfc3EgPSBpbml0X2F0dHItPndxZV9zaXplX2VuY19zcTsKIAlpbml0X2F0dHItPmFjdF93cWVfc2l6ZV9lbmNfcnExID0gaW5pdF9hdHRyLT53cWVfc2l6ZV9lbmNfcnExOwpAQCAtMjY1LDI1ICsyNzgsMjUgQEAKIAlpbml0X2F0dHItPmFjdF93cWVfc2l6ZV9lbmNfcnEzID0gaW5pdF9hdHRyLT53cWVfc2l6ZV9lbmNfcnEzOwogCiAJaW5pdF9hdHRyLT5ucl9zcV9wYWdlcyA9Ci0JICAgICh1MzIpRUhFQV9CTUFTS19HRVQoSF9BTExfUkVTX1FQX1NJWkVfU1EsIHI4X291dCk7CisJICAgICh1MzIpRUhFQV9CTUFTS19HRVQoSF9BTExfUkVTX1FQX1NJWkVfU1EsIG91dHNbNF0pOwogCWluaXRfYXR0ci0+bnJfcnExX3BhZ2VzID0KLQkgICAgKHUzMilFSEVBX0JNQVNLX0dFVChIX0FMTF9SRVNfUVBfU0laRV9SUTEsIHI4X291dCk7CisJICAgICh1MzIpRUhFQV9CTUFTS19HRVQoSF9BTExfUkVTX1FQX1NJWkVfUlExLCBvdXRzWzRdKTsKIAlpbml0X2F0dHItPm5yX3JxMl9wYWdlcyA9Ci0JICAgICh1MzIpRUhFQV9CTUFTS19HRVQoSF9BTExfUkVTX1FQX1NJWkVfUlEyLCByOV9vdXQpOworCSAgICAodTMyKUVIRUFfQk1BU0tfR0VUKEhfQUxMX1JFU19RUF9TSVpFX1JRMiwgb3V0c1s1XSk7CiAJaW5pdF9hdHRyLT5ucl9ycTNfcGFnZXMgPQotCSAgICAodTMyKUVIRUFfQk1BU0tfR0VUKEhfQUxMX1JFU19RUF9TSVpFX1JRMywgcjlfb3V0KTsKKwkgICAgKHUzMilFSEVBX0JNQVNLX0dFVChIX0FMTF9SRVNfUVBfU0laRV9SUTMsIG91dHNbNV0pOwogCiAJaW5pdF9hdHRyLT5saW9ibl9zcSA9Ci0JICAgICh1MzIpRUhFQV9CTUFTS19HRVQoSF9BTExfUkVTX1FQX0xJT0JOX1NRLCByMTFfb3V0KTsKKwkgICAgKHUzMilFSEVBX0JNQVNLX0dFVChIX0FMTF9SRVNfUVBfTElPQk5fU1EsIG91dHNbN10pOwogCWluaXRfYXR0ci0+bGlvYm5fcnExID0KLQkgICAgKHUzMilFSEVBX0JNQVNLX0dFVChIX0FMTF9SRVNfUVBfTElPQk5fUlExLCByMTFfb3V0KTsKKwkgICAgKHUzMilFSEVBX0JNQVNLX0dFVChIX0FMTF9SRVNfUVBfTElPQk5fUlExLCBvdXRzWzddKTsKIAlpbml0X2F0dHItPmxpb2JuX3JxMiA9Ci0JICAgICh1MzIpRUhFQV9CTUFTS19HRVQoSF9BTExfUkVTX1FQX0xJT0JOX1JRMiwgcjEyX291dCk7CisJICAgICh1MzIpRUhFQV9CTUFTS19HRVQoSF9BTExfUkVTX1FQX0xJT0JOX1JRMiwgb3V0c1s4XSk7CiAJaW5pdF9hdHRyLT5saW9ibl9ycTMgPQotCSAgICAodTMyKUVIRUFfQk1BU0tfR0VUKEhfQUxMX1JFU19RUF9MSU9CTl9SUTMsIHIxMl9vdXQpOworCSAgICAodTMyKUVIRUFfQk1BU0tfR0VUKEhfQUxMX1JFU19RUF9MSU9CTl9SUTMsIG91dHNbOF0pOwogCiAJaWYgKCFocmV0KQotCQloY3BfZXBhc19jdG9yKGhfZXBhcywgZ19sYV91c2VyX291dCwgZ19sYV91c2VyX291dCk7CisJCWhjcF9lcGFzX2N0b3IoaF9lcGFzLCBvdXRzWzZdLCBvdXRzWzZdKTsKIAogCXJldHVybiBocmV0OwogfQpAQCAtMjkyLDMxICszMDUsMjQgQEAKIAkJCSAgICAgc3RydWN0IGVoZWFfY3FfYXR0ciAqY3FfYXR0ciwKIAkJCSAgICAgdTY0ICpjcV9oYW5kbGUsIHN0cnVjdCBoX2VwYXMgKmVwYXMpCiB7Ci0JdTY0IGhyZXQsIGR1bW15LCBhY3RfbnJfb2ZfY3Flc19vdXQsIGFjdF9wYWdlc19vdXQ7Ci0JdTY0IGdfbGFfcHJpdmlsZWdlZF9vdXQsIGdfbGFfdXNlcl9vdXQ7CisJdTY0IGhyZXQ7CisJdTY0IG91dHNbUExQQVJfSENBTEw5X0JVRlNJWkVdOwogCi0JaHJldCA9IGVoZWFfaGNhbGxfOWFyZ185cmV0KEhfQUxMT0NfSEVBX1JFU09VUkNFLAotCQkJCSAgICBhZGFwdGVyX2hhbmRsZSwJCS8qIFI0ICovCi0JCQkJICAgIEhfQUxMX1JFU19UWVBFX0NRLAkJLyogUjUgKi8KLQkJCQkgICAgY3FfYXR0ci0+ZXFfaGFuZGxlLAkJLyogUjYgKi8KLQkJCQkgICAgY3FfYXR0ci0+Y3FfdG9rZW4sCQkvKiBSNyAqLwotCQkJCSAgICBjcV9hdHRyLT5tYXhfbnJfb2ZfY3FlcywJLyogUjggKi8KLQkJCQkgICAgMCwgMCwgMCwgMCwJCQkvKiBSOS1SMTIgKi8KLQkJCQkgICAgY3FfaGFuZGxlLAkJCS8qIFI0ICovCi0JCQkJICAgICZkdW1teSwJCQkvKiBSNSAqLwotCQkJCSAgICAmZHVtbXksCQkJLyogUjYgKi8KLQkJCQkgICAgJmFjdF9ucl9vZl9jcWVzX291dCwJLyogUjcgKi8KLQkJCQkgICAgJmFjdF9wYWdlc19vdXQsCQkvKiBSOCAqLwotCQkJCSAgICAmZ19sYV9wcml2aWxlZ2VkX291dCwJLyogUjkgKi8KLQkJCQkgICAgJmdfbGFfdXNlcl9vdXQsCQkvKiBSMTAgKi8KLQkJCQkgICAgJmR1bW15LAkgICAgICAgICAgICAgICAgLyogUjExICovCi0JCQkJICAgICZkdW1teSk7CSAgICAgICAgICAgICAgICAvKiBSMTIgKi8KKwlocmV0ID0gZWhlYV9wbHBhcl9oY2FsbDkoSF9BTExPQ19IRUFfUkVTT1VSQ0UsCisJCQkJIG91dHMsCisJCQkJIGFkYXB0ZXJfaGFuZGxlLAkJLyogUjQgKi8KKwkJCQkgSF9BTExfUkVTX1RZUEVfQ1EsCQkvKiBSNSAqLworCQkJCSBjcV9hdHRyLT5lcV9oYW5kbGUsCQkvKiBSNiAqLworCQkJCSBjcV9hdHRyLT5jcV90b2tlbiwJCS8qIFI3ICovCisJCQkJIGNxX2F0dHItPm1heF9ucl9vZl9jcWVzLAkvKiBSOCAqLworCQkJCSAwLCAwLCAwLCAwKTsJCQkvKiBSOS1SMTIgKi8KIAotCWNxX2F0dHItPmFjdF9ucl9vZl9jcWVzID0gYWN0X25yX29mX2NxZXNfb3V0OwotCWNxX2F0dHItPm5yX3BhZ2VzID0gYWN0X3BhZ2VzX291dDsKKwkqY3FfaGFuZGxlID0gb3V0c1swXTsKKwljcV9hdHRyLT5hY3RfbnJfb2ZfY3FlcyA9IG91dHNbM107CisJY3FfYXR0ci0+bnJfcGFnZXMgPSBvdXRzWzRdOwogCiAJaWYgKCFocmV0KQotCQloY3BfZXBhc19jdG9yKGVwYXMsIGdfbGFfcHJpdmlsZWdlZF9vdXQsIGdfbGFfdXNlcl9vdXQpOworCQloY3BfZXBhc19jdG9yKGVwYXMsIG91dHNbNV0sIG91dHNbNl0pOwogCiAJcmV0dXJuIGhyZXQ7CiB9CkBAIC0zNjEsOSArMzY3LDggQEAKIHU2NCBlaGVhX2hfYWxsb2NfcmVzb3VyY2VfZXEoY29uc3QgdTY0IGFkYXB0ZXJfaGFuZGxlLAogCQkJICAgICBzdHJ1Y3QgZWhlYV9lcV9hdHRyICplcV9hdHRyLCB1NjQgKmVxX2hhbmRsZSkKIHsKLQl1NjQgaHJldCwgZHVtbXksIGVxX2xpb2JuLCBhbGxvY2F0ZV9jb250cm9sczsKLQl1NjQgaXN0MV9vdXQsIGlzdDJfb3V0LCBpc3QzX291dCwgaXN0NF9vdXQ7Ci0JdTY0IGFjdF9ucl9vZl9lcWVzX291dCwgYWN0X3BhZ2VzX291dDsKKwl1NjQgaHJldCwgYWxsb2NhdGVfY29udHJvbHM7CisJdTY0IG91dHNbUExQQVJfSENBTEw5X0JVRlNJWkVdOwogCiAJLyogcmVzb3VyY2UgdHlwZSAqLwogCWFsbG9jYXRlX2NvbnRyb2xzID0KQEAgLTM3MiwyNyArMzc3LDIwIEBACiAJICAgIHwgRUhFQV9CTUFTS19TRVQoSF9BTExfUkVTX0VRX0lOSF9FUUVfR0VOLCAhZXFfYXR0ci0+ZXFlX2dlbikKIAkgICAgfCBFSEVBX0JNQVNLX1NFVChIX0FMTF9SRVNfRVFfTk9OX05FUV9JU04sIDEpOwogCi0JaHJldCA9IGVoZWFfaGNhbGxfOWFyZ185cmV0KEhfQUxMT0NfSEVBX1JFU09VUkNFLAotCQkJCSAgICBhZGFwdGVyX2hhbmRsZSwJCS8qIFI0ICovCi0JCQkJICAgIGFsbG9jYXRlX2NvbnRyb2xzLAkJLyogUjUgKi8KLQkJCQkgICAgZXFfYXR0ci0+bWF4X25yX29mX2VxZXMsCS8qIFI2ICovCi0JCQkJICAgIDAsIDAsIDAsIDAsIDAsIDAsCQkvKiBSNy1SMTAgKi8KLQkJCQkgICAgZXFfaGFuZGxlLAkJCS8qIFI0ICovCi0JCQkJICAgICZkdW1teSwJCQkvKiBSNSAqLwotCQkJCSAgICAmZXFfbGlvYm4sCQkJLyogUjYgKi8KLQkJCQkgICAgJmFjdF9ucl9vZl9lcWVzX291dCwJLyogUjcgKi8KLQkJCQkgICAgJmFjdF9wYWdlc19vdXQsCQkvKiBSOCAqLwotCQkJCSAgICAmaXN0MV9vdXQsCQkJLyogUjkgKi8KLQkJCQkgICAgJmlzdDJfb3V0LAkJCS8qIFIxMCAqLwotCQkJCSAgICAmaXN0M19vdXQsCQkJLyogUjExICovCi0JCQkJICAgICZpc3Q0X291dCk7CQkJLyogUjEyICovCisJaHJldCA9IGVoZWFfcGxwYXJfaGNhbGw5KEhfQUxMT0NfSEVBX1JFU09VUkNFLAorCQkJCSBvdXRzLAorCQkJCSBhZGFwdGVyX2hhbmRsZSwJCS8qIFI0ICovCisJCQkJIGFsbG9jYXRlX2NvbnRyb2xzLAkJLyogUjUgKi8KKwkJCQkgZXFfYXR0ci0+bWF4X25yX29mX2VxZXMsCS8qIFI2ICovCisJCQkJIDAsIDAsIDAsIDAsIDAsIDApOwkJLyogUjctUjEwICovCiAKLQllcV9hdHRyLT5hY3RfbnJfb2ZfZXFlcyA9IGFjdF9ucl9vZl9lcWVzX291dDsKLQllcV9hdHRyLT5ucl9wYWdlcyA9IGFjdF9wYWdlc19vdXQ7Ci0JZXFfYXR0ci0+aXN0MSA9IGlzdDFfb3V0OwotCWVxX2F0dHItPmlzdDIgPSBpc3QyX291dDsKLQllcV9hdHRyLT5pc3QzID0gaXN0M19vdXQ7Ci0JZXFfYXR0ci0+aXN0NCA9IGlzdDRfb3V0OworCSplcV9oYW5kbGUgPSBvdXRzWzBdOworCWVxX2F0dHItPmFjdF9ucl9vZl9lcWVzID0gb3V0c1szXTsKKwllcV9hdHRyLT5ucl9wYWdlcyA9IG91dHNbNF07CisJZXFfYXR0ci0+aXN0MSA9IG91dHNbNV07CisJZXFfYXR0ci0+aXN0MiA9IG91dHNbNl07CisJZXFfYXR0ci0+aXN0MyA9IG91dHNbN107CisJZXFfYXR0ci0+aXN0NCA9IG91dHNbOF07CiAKIAlyZXR1cm4gaHJldDsKIH0KQEAgLTQwMiwzMSArNDAwLDIyIEBACiAJCQkgIHZvaWQgKmNiX2FkZHIsIHU2NCAqaW52X2F0dHJfaWQsIHU2NCAqcHJvY19tYXNrLAogCQkJICB1MTYgKm91dF9zd3IsIHUxNiAqb3V0X3J3cikKIHsKLQl1NjQgaHJldCwgZHVtbXksIGFjdF9vdXRfc3dyLCBhY3Rfb3V0X3J3cjsKKwl1NjQgaHJldDsKKwl1NjQgb3V0c1tQTFBBUl9IQ0FMTDlfQlVGU0laRV07CiAKLQlpZiAoKCgodTY0KWNiX2FkZHIpICYgKFBBR0VfU0laRSAtIDEpKSAhPSAwKSB7Ci0JCWVoZWFfZXJyb3IoIm5vdCBvbiBwYWdlIGJvdW5kYXJ5Iik7Ci0JCXJldHVybiBIX1BBUkFNRVRFUjsKLQl9CisJaHJldCA9IGVoZWFfcGxwYXJfaGNhbGw5KEhfTU9ESUZZX0hFQV9RUCwKKwkJCQkgb3V0cywKKwkJCQkgYWRhcHRlcl9oYW5kbGUsCQkvKiBSNCAqLworCQkJCSAodTY0KSBjYXQsCQkJLyogUjUgKi8KKwkJCQkgcXBfaGFuZGxlLAkJCS8qIFI2ICovCisJCQkJIHNlbF9tYXNrLAkJCS8qIFI3ICovCisJCQkJIHZpcnRfdG9fYWJzKGNiX2FkZHIpLAkJLyogUjggKi8KKwkJCQkgMCwgMCwgMCwgMCk7CQkJLyogUjktUjEyICovCiAKLQlocmV0ID0gZWhlYV9oY2FsbF85YXJnXzlyZXQoSF9NT0RJRllfSEVBX1FQLAotCQkJCSAgICBhZGFwdGVyX2hhbmRsZSwJCS8qIFI0ICovCi0JCQkJICAgICh1NjQpIGNhdCwJCQkvKiBSNSAqLwotCQkJCSAgICBxcF9oYW5kbGUsCQkJLyogUjYgKi8KLQkJCQkgICAgc2VsX21hc2ssCQkJLyogUjcgKi8KLQkJCQkgICAgdmlydF90b19hYnMoY2JfYWRkciksCS8qIFI4ICovCi0JCQkJICAgIDAsIDAsIDAsIDAsCQkJLyogUjktUjEyICovCi0JCQkJICAgIGludl9hdHRyX2lkLAkJLyogUjQgKi8KLQkJCQkgICAgJmR1bW15LAkJCS8qIFI1ICovCi0JCQkJICAgICZkdW1teSwJCQkvKiBSNiAqLwotCQkJCSAgICAmYWN0X291dF9zd3IsCQkvKiBSNyAqLwotCQkJCSAgICAmYWN0X291dF9yd3IsCQkvKiBSOCAqLwotCQkJCSAgICBwcm9jX21hc2ssCQkJLyogUjkgKi8KLQkJCQkgICAgJmR1bW15LAkJCS8qIFIxMCAqLwotCQkJCSAgICAmZHVtbXksCQkJLyogUjExICovCi0JCQkJICAgICZkdW1teSk7CQkJLyogUjEyICovCi0JKm91dF9zd3IgPSBhY3Rfb3V0X3N3cjsKLQkqb3V0X3J3ciA9IGFjdF9vdXRfcndyOworCSppbnZfYXR0cl9pZCA9IG91dHNbMF07CisJKm91dF9zd3IgPSBvdXRzWzNdOworCSpvdXRfcndyID0gb3V0c1s0XTsKKwkqcHJvY19tYXNrID0gb3V0c1s1XTsKIAogCXJldHVybiBocmV0OwogfQpAQCAtNDM1LDEyMiArNDI0LDgxIEBACiAJCQkgIGNvbnN0IHU4IHF1ZXVlX3R5cGUsIGNvbnN0IHU2NCByZXNvdXJjZV9oYW5kbGUsCiAJCQkgIGNvbnN0IHU2NCBsb2dfcGFnZWFkZHIsIHU2NCBjb3VudCkKIHsKLQl1NjQgZHVtbXksIHJlZ19jb250cm9sOworCXU2NCAgcmVnX2NvbnRyb2w7CiAKIAlyZWdfY29udHJvbCA9IEVIRUFfQk1BU0tfU0VUKEhfUkVHX1JQQUdFX1BBR0VfU0laRSwgcGFnZXNpemUpCiAJCSAgICB8IEVIRUFfQk1BU0tfU0VUKEhfUkVHX1JQQUdFX1FULCBxdWV1ZV90eXBlKTsKIAotCXJldHVybiBlaGVhX2hjYWxsXzlhcmdfOXJldChIX1JFR0lTVEVSX0hFQV9SUEFHRVMsCi0JCQkJICAgIGFkYXB0ZXJfaGFuZGxlLAkJLyogUjQgKi8KLQkJCQkgICAgcmVnX2NvbnRyb2wsCQkvKiBSNSAqLwotCQkJCSAgICByZXNvdXJjZV9oYW5kbGUsCQkvKiBSNiAqLwotCQkJCSAgICBsb2dfcGFnZWFkZHIsCQkvKiBSNyAqLwotCQkJCSAgICBjb3VudCwJCQkvKiBSOCAqLwotCQkJCSAgICAwLCAwLCAwLCAwLAkJCS8qIFI5LVIxMiAqLwotCQkJCSAgICAmZHVtbXksCQkJLyogUjQgKi8KLQkJCQkgICAgJmR1bW15LAkJCS8qIFI1ICovCi0JCQkJICAgICZkdW1teSwJCQkvKiBSNiAqLwotCQkJCSAgICAmZHVtbXksCQkJLyogUjcgKi8KLQkJCQkgICAgJmR1bW15LAkJCS8qIFI4ICovCi0JCQkJICAgICZkdW1teSwJCQkvKiBSOSAqLwotCQkJCSAgICAmZHVtbXksCQkJLyogUjEwICovCi0JCQkJICAgICZkdW1teSwJICAgICAgICAgICAgICAgIC8qIFIxMSAqLwotCQkJCSAgICAmZHVtbXkpOwkgICAgICAgICAgICAgICAgLyogUjEyICovCisJcmV0dXJuIGVoZWFfcGxwYXJfaGNhbGxfbm9yZXRzKEhfUkVHSVNURVJfSEVBX1JQQUdFUywKKwkJCQkgICAgICAgYWRhcHRlcl9oYW5kbGUsCQkvKiBSNCAqLworCQkJCSAgICAgICByZWdfY29udHJvbCwJCS8qIFI1ICovCisJCQkJICAgICAgIHJlc291cmNlX2hhbmRsZSwJCS8qIFI2ICovCisJCQkJICAgICAgIGxvZ19wYWdlYWRkciwJCS8qIFI3ICovCisJCQkJICAgICAgIGNvdW50LAkJCS8qIFI4ICovCisJCQkJICAgICAgIDAsIDApOwkJCS8qIFI5LVIxMCAqLwogfQogCiB1NjQgZWhlYV9oX3JlZ2lzdGVyX3Ntcihjb25zdCB1NjQgYWRhcHRlcl9oYW5kbGUsIGNvbnN0IHU2NCBvcmlnX21yX2hhbmRsZSwKIAkJCWNvbnN0IHU2NCB2YWRkcl9pbiwgY29uc3QgdTMyIGFjY2Vzc19jdHJsLCBjb25zdCB1MzIgcGQsCiAJCQlzdHJ1Y3QgZWhlYV9tciAqbXIpCiB7Ci0JdTY0IGhyZXQsIGR1bW15LCBsa2V5X291dDsKKwl1NjQgaHJldDsKKwl1NjQgb3V0c1tQTFBBUl9IQ0FMTDlfQlVGU0laRV07CiAKLQlocmV0ID0gZWhlYV9oY2FsbF85YXJnXzlyZXQoSF9SRUdJU1RFUl9TTVIsCi0JCQkJICAgIGFkYXB0ZXJfaGFuZGxlICAgICAgICwgICAgICAgICAgLyogUjQgKi8KLQkJCQkgICAgb3JpZ19tcl9oYW5kbGUsICAgICAgICAgICAgICAgICAvKiBSNSAqLwotCQkJCSAgICB2YWRkcl9pbiwgICAgICAgICAgICAgICAgICAgICAgIC8qIFI2ICovCi0JCQkJICAgICgoKHU2NClhY2Nlc3NfY3RybCkgPDwgMzJVTEwpLCAgLyogUjcgKi8KLQkJCQkgICAgcGQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBSOCAqLwotCQkJCSAgICAwLCAwLCAwLCAwLAkJCSAgICAvKiBSOS1SMTIgKi8KLQkJCQkgICAgJm1yLT5oYW5kbGUsICAgICAgICAgICAgICAgICAgICAvKiBSNCAqLwotCQkJCSAgICAmZHVtbXksICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFI1ICovCi0JCQkJICAgICZsa2V5X291dCwgICAgICAgICAgICAgICAgICAgICAgLyogUjYgKi8KLQkJCQkgICAgJmR1bW15LCAgICAgICAgICAgICAgICAgICAgICAgICAvKiBSNyAqLwotCQkJCSAgICAmZHVtbXksICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFI4ICovCi0JCQkJICAgICZkdW1teSwgICAgICAgICAgICAgICAgICAgICAgICAgLyogUjkgKi8KLQkJCQkgICAgJmR1bW15LCAgICAgICAgICAgICAgICAgICAgICAgICAvKiBSMTAgKi8KLQkJCQkgICAgJmR1bW15LCAgICAgICAgICAgICAgICAgICAgICAgICAvKiBSMTEgKi8KLQkJCQkgICAgJmR1bW15KTsgICAgICAgICAgICAgICAgICAgICAgICAvKiBSMTIgKi8KLQltci0+bGtleSA9ICh1MzIpbGtleV9vdXQ7CisJaHJldCA9IGVoZWFfcGxwYXJfaGNhbGw5KEhfUkVHSVNURVJfU01SLAorCQkJCSBvdXRzLAorCQkJCSBhZGFwdGVyX2hhbmRsZSAgICAgICAsICAgICAgICAJIC8qIFI0ICovCisJCQkJIG9yaWdfbXJfaGFuZGxlLCAgICAgICAgICAgICAgICAgLyogUjUgKi8KKwkJCQkgdmFkZHJfaW4sICAgICAgICAgICAgICAgICAgICAgICAvKiBSNiAqLworCQkJCSAoKCh1NjQpYWNjZXNzX2N0cmwpIDw8IDMyVUxMKSwgIC8qIFI3ICovCisJCQkJIHBkLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogUjggKi8KKwkJCQkgMCwgMCwgMCwgMCk7CSAgIAkJIC8qIFI5LVIxMiAqLworCisJbXItPmhhbmRsZSA9IG91dHNbMF07CisJbXItPmxrZXkgPSAodTMyKW91dHNbMl07CiAKIAlyZXR1cm4gaHJldDsKIH0KIAogdTY0IGVoZWFfaF9kaXNhYmxlX2FuZF9nZXRfaGVhKGNvbnN0IHU2NCBhZGFwdGVyX2hhbmRsZSwgY29uc3QgdTY0IHFwX2hhbmRsZSkKIHsKLQl1NjQgaHJldCwgZHVtbXksIGxhZHJfbmV4dF9zcV93cWVfb3V0OwotCXU2NCBsYWRyX25leHRfcnExX3dxZV9vdXQsIGxhZHJfbmV4dF9ycTJfd3FlX291dCwgbGFkcl9uZXh0X3JxM193cWVfb3V0OworCXU2NCBvdXRzW1BMUEFSX0hDQUxMOV9CVUZTSVpFXTsKIAotCWhyZXQgPSBlaGVhX2hjYWxsXzlhcmdfOXJldChIX0RJU0FCTEVfQU5EX0dFVF9IRUEsCi0JCQkJICAgIGFkYXB0ZXJfaGFuZGxlLAkJLyogUjQgKi8KLQkJCQkgICAgSF9ESVNBQkxFX0dFVF9FSEVBX1dRRV9QLAkvKiBSNSAqLwotCQkJCSAgICBxcF9oYW5kbGUsCQkJLyogUjYgKi8KLQkJCQkgICAgMCwgMCwgMCwgMCwgMCwgMCwJCS8qIFI3LVIxMiAqLwotCQkJCSAgICAmbGFkcl9uZXh0X3NxX3dxZV9vdXQsCS8qIFI0ICovCi0JCQkJICAgICZsYWRyX25leHRfcnExX3dxZV9vdXQsCS8qIFI1ICovCi0JCQkJICAgICZsYWRyX25leHRfcnEyX3dxZV9vdXQsCS8qIFI2ICovCi0JCQkJICAgICZsYWRyX25leHRfcnEzX3dxZV9vdXQsCS8qIFI3ICovCi0JCQkJICAgICZkdW1teSwJCQkvKiBSOCAqLwotCQkJCSAgICAmZHVtbXksCQkJLyogUjkgKi8KLQkJCQkgICAgJmR1bW15LAkJCS8qIFIxMCAqLwotCQkJCSAgICAmZHVtbXksICAgICAgICAgICAgICAgICAgICAgLyogUjExICovCi0JCQkJICAgICZkdW1teSk7ICAgICAgICAgICAgICAgICAgICAvKiBSMTIgKi8KLQlyZXR1cm4gaHJldDsKKwlyZXR1cm4gZWhlYV9wbHBhcl9oY2FsbDkoSF9ESVNBQkxFX0FORF9HRVRfSEVBLAorICAgICAgIAkJCQkgb3V0cywKKwkJCQkgYWRhcHRlcl9oYW5kbGUsCQkvKiBSNCAqLworCQkJCSBIX0RJU0FCTEVfR0VUX0VIRUFfV1FFX1AsCS8qIFI1ICovCisJCQkJIHFwX2hhbmRsZSwJCQkvKiBSNiAqLworCQkJCSAwLCAwLCAwLCAwLCAwLCAwKTsgICAgICAgICAgICAgLyogUjctUjEyICovCiB9CiAKIHU2NCBlaGVhX2hfZnJlZV9yZXNvdXJjZShjb25zdCB1NjQgYWRhcHRlcl9oYW5kbGUsIGNvbnN0IHU2NCByZXNfaGFuZGxlKQogewotCXU2NCBkdW1teTsKLQotCXJldHVybiBlaGVhX2hjYWxsXzlhcmdfOXJldChIX0ZSRUVfUkVTT1VSQ0UsCi0JCQkJICAgIGFkYXB0ZXJfaGFuZGxlLAkgICAvKiBSNCAqLwotCQkJCSAgICByZXNfaGFuZGxlLCAgICAgICAgICAgIC8qIFI1ICovCi0JCQkJICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsICAgLyogUjYtUjEyICovCi0JCQkJICAgICZkdW1teSwgICAgICAgICAgICAgICAgLyogUjQgKi8KLQkJCQkgICAgJmR1bW15LCAgICAgICAgICAgICAgICAvKiBSNSAqLwotCQkJCSAgICAmZHVtbXksICAgICAgICAgICAgICAgIC8qIFI2ICovCi0JCQkJICAgICZkdW1teSwgICAgICAgICAgICAgICAgLyogUjcgKi8KLQkJCQkgICAgJmR1bW15LCAgICAgICAgICAgICAgICAvKiBSOCAqLwotCQkJCSAgICAmZHVtbXksICAgICAgICAgICAgICAgIC8qIFI5ICovCi0JCQkJICAgICZkdW1teSwJCSAgIC8qIFIxMCAqLwotCQkJCSAgICAmZHVtbXksICAgICAgICAgICAgICAgIC8qIFIxMSAqLwotCQkJCSAgICAmZHVtbXkpOyAgICAgICAgICAgICAgIC8qIFIxMiAqLworCXJldHVybiBlaGVhX3BscGFyX2hjYWxsX25vcmV0cyhIX0ZSRUVfUkVTT1VSQ0UsCisJCQkJICAgICAgIGFkYXB0ZXJfaGFuZGxlLAkgICAvKiBSNCAqLworCQkJCSAgICAgICByZXNfaGFuZGxlLCAgICAgICAgIC8qIFI1ICovCisJCQkJICAgICAgIDAsIDAsIDAsIDAsIDApOyAgICAgLyogUjYtUjEwICovCiB9CiAKIHU2NCBlaGVhX2hfYWxsb2NfcmVzb3VyY2VfbXIoY29uc3QgdTY0IGFkYXB0ZXJfaGFuZGxlLCBjb25zdCB1NjQgdmFkZHIsCiAJCQkgICAgIGNvbnN0IHU2NCBsZW5ndGgsIGNvbnN0IHUzMiBhY2Nlc3NfY3RybCwKIAkJCSAgICAgY29uc3QgdTMyIHBkLCB1NjQgKm1yX2hhbmRsZSwgdTMyICpsa2V5KQogewotCXU2NCBocmV0LCBkdW1teSwgbGtleV9vdXQ7CisJdTY0IGhyZXQ7CisgCXU2NCBvdXRzW1BMUEFSX0hDQUxMOV9CVUZTSVpFXTsKIAotCWhyZXQgPSBlaGVhX2hjYWxsXzlhcmdfOXJldChIX0FMTE9DX0hFQV9SRVNPVVJDRSwKLQkJCQkgICAgYWRhcHRlcl9oYW5kbGUsCQkgICAvKiBSNCAqLwotCQkJCSAgICA1LAkJCQkgICAvKiBSNSAqLwotCQkJCSAgICB2YWRkciwJCQkgICAvKiBSNiAqLwotCQkJCSAgICBsZW5ndGgsCQkJICAgLyogUjcgKi8KLQkJCQkgICAgKCgodTY0KSBhY2Nlc3NfY3RybCkgPDwgMzJVTEwpLC8qIFI4ICovCi0JCQkJICAgIHBkLAkJCQkgICAvKiBSOSAqLwotCQkJCSAgICAwLCAwLCAwLAkJCSAgIC8qIFIxMC1SMTIgKi8KLQkJCQkgICAgbXJfaGFuZGxlLAkJCSAgIC8qIFI0ICovCi0JCQkJICAgICZkdW1teSwJCQkgICAvKiBSNSAqLwotCQkJCSAgICAmbGtleV9vdXQsCQkJICAgLyogUjYgKi8KLQkJCQkgICAgJmR1bW15LAkJCSAgIC8qIFI3ICovCi0JCQkJICAgICZkdW1teSwJCQkgICAvKiBSOCAqLwotCQkJCSAgICAmZHVtbXksCQkJICAgLyogUjkgKi8KLQkJCQkgICAgJmR1bW15LAkJCSAgIC8qIFIxMCAqLwotCQkJCSAgICAmZHVtbXksICAgICAgICAgICAgICAgICAgICAgICAgLyogUjExICovCi0JCQkJICAgICZkdW1teSk7ICAgICAgICAgICAgICAgICAgICAgICAvKiBSMTIgKi8KLQkqbGtleSA9ICh1MzIpIGxrZXlfb3V0OworCWhyZXQgPSBlaGVhX3BscGFyX2hjYWxsOShIX0FMTE9DX0hFQV9SRVNPVVJDRSwKKwkJCQkgb3V0cywKKwkJCQkgYWRhcHRlcl9oYW5kbGUsCQkgICAvKiBSNCAqLworCQkJCSA1LAkJCQkgICAvKiBSNSAqLworCQkJCSB2YWRkciwJCQkgICAgICAgICAgIC8qIFI2ICovCisJCQkJIGxlbmd0aCwJCQkgICAvKiBSNyAqLworCQkJCSAoKCh1NjQpIGFjY2Vzc19jdHJsKSA8PCAzMlVMTCksICAgLyogUjggKi8KKwkJCQkgcGQsCQkJCSAgIC8qIFI5ICovCisJCQkJIDAsIDAsIDApOwkJCSAgIC8qIFIxMC1SMTIgKi8KIAorCSptcl9oYW5kbGUgPSBvdXRzWzBdOworCSpsa2V5ID0gKHUzMilvdXRzWzJdOwogCXJldHVybiBocmV0OwogfQogCkBAIC01NTgsNyArNTA2LDcgQEAKIAkJCSAgICAgY29uc3QgdTggcGFnZXNpemUsIGNvbnN0IHU4IHF1ZXVlX3R5cGUsCiAJCQkgICAgIGNvbnN0IHU2NCBsb2dfcGFnZWFkZHIsIGNvbnN0IHU2NCBjb3VudCkKIHsKLQlpZiAoKGNvdW50ID4gMSkgJiYgKGxvZ19wYWdlYWRkciAmIDB4ZmZmKSkgeworCWlmICgoY291bnQgPiAxKSAmJiAobG9nX3BhZ2VhZGRyICYgflBBR0VfTUFTSykpIHsKIAkJZWhlYV9lcnJvcigibm90IG9uIHBhZ2Vib3VuZGFyeSIpOwogCQlyZXR1cm4gSF9QQVJBTUVURVI7CiAJfQpAQCAtNTcwLDIzICs1MTgsMTQgQEAKIAogdTY0IGVoZWFfaF9xdWVyeV9laGVhKGNvbnN0IHU2NCBhZGFwdGVyX2hhbmRsZSwgdm9pZCAqY2JfYWRkcikKIHsKLQl1NjQgaHJldCwgZHVtbXksIGNiX2xvZ2FkZHI7CisJdTY0IGhyZXQsIGNiX2xvZ2FkZHI7CiAKIAljYl9sb2dhZGRyID0gdmlydF90b19hYnMoY2JfYWRkcik7CiAKLQlocmV0ID0gZWhlYV9oY2FsbF85YXJnXzlyZXQoSF9RVUVSWV9IRUEsCi0JCQkJICAgIGFkYXB0ZXJfaGFuZGxlLAkJLyogUjQgKi8KLQkJCQkgICAgY2JfbG9nYWRkciwJCQkvKiBSNSAqLwotCQkJCSAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLAkvKiBSNi1SMTIgKi8KLQkJCQkgICAgJmR1bW15LAkJCS8qIFI0ICovCi0JCQkJICAgICZkdW1teSwJCQkvKiBSNSAqLwotCQkJCSAgICAmZHVtbXksCQkJLyogUjYgKi8KLQkJCQkgICAgJmR1bW15LAkJCS8qIFI3ICovCi0JCQkJICAgICZkdW1teSwJCQkvKiBSOCAqLwotCQkJCSAgICAmZHVtbXksCQkJLyogUjkgKi8KLQkJCQkgICAgJmR1bW15LAkJCS8qIFIxMCAqLwotCQkJCSAgICAmZHVtbXksICAgICAgICAgICAgIAkvKiBSMTEgKi8KLQkJCQkgICAgJmR1bW15KTsgICAgICAgICAgICAJLyogUjEyICovCisJaHJldCA9IGVoZWFfcGxwYXJfaGNhbGxfbm9yZXRzKEhfUVVFUllfSEVBLAorCQkJCSAgICAgICBhZGFwdGVyX2hhbmRsZSwJCS8qIFI0ICovCisJCQkJICAgICAgIGNiX2xvZ2FkZHIsCQkvKiBSNSAqLworCQkJCSAgICAgICAwLCAwLCAwLCAwLCAwKTsJCS8qIFI2LVIxMCAqLwogI2lmZGVmIERFQlVHCiAJZWhlYV9kbXAoY2JfYWRkciwgc2l6ZW9mKHN0cnVjdCBoY3BfcXVlcnlfZWhlYSksICJoY3BfcXVlcnlfZWhlYSIpOwogI2VuZGlmCkBAIC01OTcsMzYgKzUzNiwyOCBAQAogCQkJICAgY29uc3QgdTggY2JfY2F0LCBjb25zdCB1NjQgc2VsZWN0X21hc2ssCiAJCQkgICB2b2lkICpjYl9hZGRyKQogewotCXU2NCBwb3J0X2luZm8sIGR1bW15OworCXU2NCBwb3J0X2luZm87CiAJdTY0IGNiX2xvZ2FkZHIgPSB2aXJ0X3RvX2FicyhjYl9hZGRyKTsKIAl1NjQgYXJyX2luZGV4ID0gMDsKIAogCXBvcnRfaW5mbyA9IEVIRUFfQk1BU0tfU0VUKEhfTUVIRUFQT1JUX0NBVCwgY2JfY2F0KQogCQkgIHwgRUhFQV9CTUFTS19TRVQoSF9NRUhFQVBPUlRfUE4sIHBvcnRfbnVtKTsKIAotCXJldHVybiBlaGVhX2hjYWxsXzlhcmdfOXJldChIX1FVRVJZX0hFQV9QT1JULAotCQkJCSAgICBhZGFwdGVyX2hhbmRsZSwJCS8qIFI0ICovCi0JCQkJICAgIHBvcnRfaW5mbywJCQkvKiBSNSAqLwotCQkJCSAgICBzZWxlY3RfbWFzaywJCS8qIFI2ICovCi0JCQkJICAgIGFycl9pbmRleCwJCQkvKiBSNyAqLwotCQkJCSAgICBjYl9sb2dhZGRyLAkJCS8qIFI4ICovCi0JCQkJICAgIDAsIDAsIDAsIDAsCQkJLyogUjktUjEyICovCi0JCQkJICAgICZkdW1teSwJCQkvKiBSNCAqLwotCQkJCSAgICAmZHVtbXksCQkJLyogUjUgKi8KLQkJCQkgICAgJmR1bW15LAkJCS8qIFI2ICovCi0JCQkJICAgICZkdW1teSwJCQkvKiBSNyAqLwotCQkJCSAgICAmZHVtbXksCQkJLyogUjggKi8KLQkJCQkgICAgJmR1bW15LAkJCS8qIFI5ICovCi0JCQkJICAgICZkdW1teSwJCQkvKiBSMTAgKi8KLQkJCQkgICAgJmR1bW15LCAgICAgICAgICAgICAgICAgICAgIC8qIFIxMSAqLwotCQkJCSAgICAmZHVtbXkpOyAgICAgICAgICAgICAgICAgICAgLyogUjEyICovCisJcmV0dXJuIGVoZWFfcGxwYXJfaGNhbGxfbm9yZXRzKEhfUVVFUllfSEVBX1BPUlQsCisJCQkJICAgICAgIGFkYXB0ZXJfaGFuZGxlLAkJLyogUjQgKi8KKwkJCQkgICAgICAgcG9ydF9pbmZvLAkJLyogUjUgKi8KKwkJCQkgICAgICAgc2VsZWN0X21hc2ssCQkvKiBSNiAqLworCQkJCSAgICAgICBhcnJfaW5kZXgsCQkvKiBSNyAqLworCQkJCSAgICAgICBjYl9sb2dhZGRyLAkJLyogUjggKi8KKwkJCQkgICAgICAgMCwgMCk7CQkJLyogUjktUjEwICovCiB9CiAKIHU2NCBlaGVhX2hfbW9kaWZ5X2VoZWFfcG9ydChjb25zdCB1NjQgYWRhcHRlcl9oYW5kbGUsIGNvbnN0IHUxNiBwb3J0X251bSwKIAkJCSAgICBjb25zdCB1OCBjYl9jYXQsIGNvbnN0IHU2NCBzZWxlY3RfbWFzaywKIAkJCSAgICB2b2lkICpjYl9hZGRyKQogewotCXU2NCBwb3J0X2luZm8sIGR1bW15LCBpbnZfYXR0cl9pZGVudCwgcHJvY19tYXNrOworCXU2NCBvdXRzW1BMUEFSX0hDQUxMOV9CVUZTSVpFXTsKKwl1NjQgcG9ydF9pbmZvOwogCXU2NCBhcnJfaW5kZXggPSAwOwogCXU2NCBjYl9sb2dhZGRyID0gdmlydF90b19hYnMoY2JfYWRkcik7CiAKQEAgLTYzNSwyOSArNTY2LDIxIEBACiAjaWZkZWYgREVCVUcKIAllaGVhX2R1bXAoY2JfYWRkciwgc2l6ZW9mKHN0cnVjdCBoY3BfZWhlYV9wb3J0X2NiMCksICJCZWZvcmUgSENBTEwiKTsKICNlbmRpZgotCXJldHVybiBlaGVhX2hjYWxsXzlhcmdfOXJldChIX01PRElGWV9IRUFfUE9SVCwKLQkJCQkgICAgYWRhcHRlcl9oYW5kbGUsCQkvKiBSNCAqLwotCQkJCSAgICBwb3J0X2luZm8sCQkJLyogUjUgKi8KLQkJCQkgICAgc2VsZWN0X21hc2ssCQkvKiBSNiAqLwotCQkJCSAgICBhcnJfaW5kZXgsCQkJLyogUjcgKi8KLQkJCQkgICAgY2JfbG9nYWRkciwJCQkvKiBSOCAqLwotCQkJCSAgICAwLCAwLCAwLCAwLAkJCS8qIFI5LVIxMiAqLwotCQkJCSAgICAmaW52X2F0dHJfaWRlbnQsCQkvKiBSNCAqLwotCQkJCSAgICAmcHJvY19tYXNrLAkJCS8qIFI1ICovCi0JCQkJICAgICZkdW1teSwJCQkvKiBSNiAqLwotCQkJCSAgICAmZHVtbXksCQkJLyogUjcgKi8KLQkJCQkgICAgJmR1bW15LAkJCS8qIFI4ICovCi0JCQkJICAgICZkdW1teSwJCQkvKiBSOSAqLwotCQkJCSAgICAmZHVtbXksCQkJLyogUjEwICovCi0JCQkJICAgICZkdW1teSwgICAgICAgICAgICAgICAgICAgICAvKiBSMTEgKi8KLQkJCQkgICAgJmR1bW15KTsgICAgICAgICAgICAgICAgICAgIC8qIFIxMiAqLworCXJldHVybiBlaGVhX3BscGFyX2hjYWxsOShIX01PRElGWV9IRUFfUE9SVCwKKwkJCQkgb3V0cywKKwkJCQkgYWRhcHRlcl9oYW5kbGUsCQkvKiBSNCAqLworCQkJCSBwb3J0X2luZm8sCQkJLyogUjUgKi8KKwkJCQkgc2VsZWN0X21hc2ssCQkJLyogUjYgKi8KKwkJCQkgYXJyX2luZGV4LAkJCS8qIFI3ICovCisJCQkJIGNiX2xvZ2FkZHIsCQkJLyogUjggKi8KKwkJCQkgMCwgMCwgMCwgMCk7CQkJLyogUjktUjEyICovCiB9CiAKIHU2NCBlaGVhX2hfcmVnX2RlcmVnX2JjbWMoY29uc3QgdTY0IGFkYXB0ZXJfaGFuZGxlLCBjb25zdCB1MTYgcG9ydF9udW0sCiAJCQkgIGNvbnN0IHU4IHJlZ190eXBlLCBjb25zdCB1NjQgbWNfbWFjX2FkZHIsCiAJCQkgIGNvbnN0IHUxNiB2bGFuX2lkLCBjb25zdCB1MzIgaGNhbGxfaWQpCiB7Ci0JdTY0IHI1X3BvcnRfbnVtLCByNl9yZWdfdHlwZSwgcjdfbWNfbWFjX2FkZHIsIHI4X3ZsYW5faWQsIGR1bW15OworCXU2NCByNV9wb3J0X251bSwgcjZfcmVnX3R5cGUsIHI3X21jX21hY19hZGRyLCByOF92bGFuX2lkOwogCXU2NCBtYWNfYWRkciA9IG1jX21hY19hZGRyID4+IDE2OwogCiAJcjVfcG9ydF9udW0gPSBFSEVBX0JNQVNLX1NFVChIX1JFR0JDTUNfUE4sIHBvcnRfbnVtKTsKQEAgLTY2NSw0MSArNTg4LDIxIEBACiAJcjdfbWNfbWFjX2FkZHIgPSBFSEVBX0JNQVNLX1NFVChIX1JFR0JDTUNfTUFDQUREUiwgbWFjX2FkZHIpOwogCXI4X3ZsYW5faWQgPSBFSEVBX0JNQVNLX1NFVChIX1JFR0JDTUNfVkxBTklELCB2bGFuX2lkKTsKIAotCXJldHVybiBlaGVhX2hjYWxsXzlhcmdfOXJldChoY2FsbF9pZCwKLQkJCQkgICAgYWRhcHRlcl9oYW5kbGUsCQkvKiBSNCAqLwotCQkJCSAgICByNV9wb3J0X251bSwJCS8qIFI1ICovCi0JCQkJICAgIHI2X3JlZ190eXBlLAkJLyogUjYgKi8KLQkJCQkgICAgcjdfbWNfbWFjX2FkZHIsCQkvKiBSNyAqLwotCQkJCSAgICByOF92bGFuX2lkLAkJCS8qIFI4ICovCi0JCQkJICAgIDAsIDAsIDAsIDAsCQkJLyogUjktUjEyICovCi0JCQkJICAgICZkdW1teSwJCQkvKiBSNCAqLwotCQkJCSAgICAmZHVtbXksCQkJLyogUjUgKi8KLQkJCQkgICAgJmR1bW15LAkJCS8qIFI2ICovCi0JCQkJICAgICZkdW1teSwJCQkvKiBSNyAqLwotCQkJCSAgICAmZHVtbXksCQkJLyogUjggKi8KLQkJCQkgICAgJmR1bW15LAkJCS8qIFI5ICovCi0JCQkJICAgICZkdW1teSwJCQkvKiBSMTAgKi8KLQkJCQkgICAgJmR1bW15LCAgICAgICAgICAgICAgICAgICAgIC8qIFIxMSAqLwotCQkJCSAgICAmZHVtbXkpOyAgICAgICAgICAgICAgICAgICAgLyogUjEyICovCisJcmV0dXJuIGVoZWFfcGxwYXJfaGNhbGxfbm9yZXRzKGhjYWxsX2lkLAorCQkJCSAgICAgICBhZGFwdGVyX2hhbmRsZSwJCS8qIFI0ICovCisJCQkJICAgICAgIHI1X3BvcnRfbnVtLAkJLyogUjUgKi8KKwkJCQkgICAgICAgcjZfcmVnX3R5cGUsCQkvKiBSNiAqLworCQkJCSAgICAgICByN19tY19tYWNfYWRkciwJCS8qIFI3ICovCisJCQkJICAgICAgIHI4X3ZsYW5faWQsCQkvKiBSOCAqLworCQkJCSAgICAgICAwLCAwKTsJCQkvKiBSOS1SMTIgKi8KIH0KIAogdTY0IGVoZWFfaF9yZXNldF9ldmVudHMoY29uc3QgdTY0IGFkYXB0ZXJfaGFuZGxlLCBjb25zdCB1NjQgbmVxX2hhbmRsZSwKIAkJCWNvbnN0IHU2NCBldmVudF9tYXNrKQogewotCXU2NCBkdW1teTsKLQotCXJldHVybiBlaGVhX2hjYWxsXzlhcmdfOXJldChIX1JFU0VUX0VWRU5UUywKLQkJCQkgICAgYWRhcHRlcl9oYW5kbGUsCQkvKiBSNCAqLwotCQkJCSAgICBuZXFfaGFuZGxlLAkJCS8qIFI1ICovCi0JCQkJICAgIGV2ZW50X21hc2ssCQkJLyogUjYgKi8KLQkJCQkgICAgMCwgMCwgMCwgMCwgMCwgMCwJCS8qIFI3LVIxMiAqLwotCQkJCSAgICAmZHVtbXksCQkJLyogUjQgKi8KLQkJCQkgICAgJmR1bW15LAkJCS8qIFI1ICovCi0JCQkJICAgICZkdW1teSwJCQkvKiBSNiAqLwotCQkJCSAgICAmZHVtbXksCQkJLyogUjcgKi8KLQkJCQkgICAgJmR1bW15LAkJCS8qIFI4ICovCi0JCQkJICAgICZkdW1teSwJCQkvKiBSOSAqLwotCQkJCSAgICAmZHVtbXksCQkJLyogUjEwICovCi0JCQkJICAgICZkdW1teSwgICAgICAgICAgICAgICAgICAgICAvKiBSMTEgKi8KLQkJCQkgICAgJmR1bW15KTsgICAgICAgICAgICAgICAgICAgIC8qIFIxMiAqLworCXJldHVybiBlaGVhX3BscGFyX2hjYWxsX25vcmV0cyhIX1JFU0VUX0VWRU5UUywKKwkJCQkgICAgICAgYWRhcHRlcl9oYW5kbGUsCQkvKiBSNCAqLworCQkJCSAgICAgICBuZXFfaGFuZGxlLAkJLyogUjUgKi8KKwkJCQkgICAgICAgZXZlbnRfbWFzaywJCS8qIFI2ICovCisJCQkJICAgICAgIDAsIDAsIDAsIDApOwkJLyogUjctUjEyICovCiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9laGVhL2VoZWFfcGh5cC5oIGIvZHJpdmVycy9uZXQvZWhlYS9laGVhX3BoeXAuaAppbmRleCBmYTUxZTNiLi45MTlmOTRiIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9laGVhL2VoZWFfcGh5cC5oCisrKyBiL2RyaXZlcnMvbmV0L2VoZWEvZWhlYV9waHlwLmgKQEAgLTgxLDE0ICs4MSwxNiBAQAogc3RhdGljIGlubGluZSB2b2lkIGhjcF9lcGFzX2N0b3Ioc3RydWN0IGhfZXBhcyAqZXBhcywgdTY0IHBhZGRyX2tlcm5lbCwKIAkJCQkgdTY0IHBhZGRyX3VzZXIpCiB7Ci0JZXBhcy0+a2VybmVsLmFkZHIgPSBpb3JlbWFwKHBhZGRyX2tlcm5lbCwgUEFHRV9TSVpFKTsKKwkvKiBUbyBzdXBwb3J0IDY0ayBwYWdlcyB3ZSBtdXN0IHJvdW5kIHRvIDY0ayBwYWdlIGJvdW5kYXJ5ICovCisJZXBhcy0+a2VybmVsLmFkZHIgPSBpb3JlbWFwKChwYWRkcl9rZXJuZWwgJiBQQUdFX01BU0spLCBQQUdFX1NJWkUpICsKKwkJCSAgICAocGFkZHJfa2VybmVsICYgflBBR0VfTUFTSyk7CiAJZXBhcy0+dXNlci5hZGRyID0gcGFkZHJfdXNlcjsKIH0KIAogc3RhdGljIGlubGluZSB2b2lkIGhjcF9lcGFzX2R0b3Ioc3RydWN0IGhfZXBhcyAqZXBhcykKIHsKIAlpZiAoZXBhcy0+a2VybmVsLmFkZHIpCi0JCWlvdW5tYXAoZXBhcy0+a2VybmVsLmFkZHIpOworCQlpb3VubWFwKCh2b2lkIF9faW9tZW0qKSgodTY0KWVwYXMtPmtlcm5lbC5hZGRyICYgUEFHRV9NQVNLKSk7CiAKIAllcGFzLT51c2VyLmFkZHIgPSAwOwogCWVwYXMtPmtlcm5lbC5hZGRyID0gMDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2VoZWEvZWhlYV9xbXIuYyBiL2RyaXZlcnMvbmV0L2VoZWEvZWhlYV9xbXIuYwppbmRleCAzZTE4NjIzLi43MmVmN2JkIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9laGVhL2VoZWFfcW1yLmMKKysrIGIvZHJpdmVycy9uZXQvZWhlYS9laGVhX3Ftci5jCkBAIC0yMDksMTEgKzIwOSwxMSBAQAogewogCXU2NCBhZGFwdGVyX2hhbmRsZSwgaHJldDsKIAotCWFkYXB0ZXJfaGFuZGxlID0gY3EtPmFkYXB0ZXItPmhhbmRsZTsKLQogCWlmICghY3EpCiAJCXJldHVybiAwOwogCisJYWRhcHRlcl9oYW5kbGUgPSBjcS0+YWRhcHRlci0+aGFuZGxlOworCiAJLyogZGVyZWdpc3RlciBhbGwgcHJldmlvdXMgcmVnaXN0ZXJlZCBwYWdlcyAqLwogCWhyZXQgPSBlaGVhX2hfZnJlZV9yZXNvdXJjZShhZGFwdGVyX2hhbmRsZSwgY3EtPmZ3X2hhbmRsZSk7CiAJaWYgKGhyZXQgIT0gSF9TVUNDRVNTKSB7CkBAIC01MTIsNyArNTEyLDcgQEAKIAogCXN0YXJ0ID0gS0VSTkVMQkFTRTsKIAllbmQgPSAodTY0KWhpZ2hfbWVtb3J5OwotCW5yX3BhZ2VzID0gKGVuZCAtIHN0YXJ0KSAvIFBBR0VfU0laRTsKKwlucl9wYWdlcyA9IChlbmQgLSBzdGFydCkgLyBFSEVBX1BBR0VTSVpFOwogCiAJcHQgPSAga3phbGxvYyhQQUdFX1NJWkUsIEdGUF9LRVJORUwpOwogCWlmICghcHQpIHsKQEAgLTUzOCw5ICs1MzgsOSBAQAogCQlpZiAobnJfcGFnZXMgPiAxKSB7CiAJCQl1NjQgbnVtX3BhZ2VzID0gbWluKG5yX3BhZ2VzLCAodTY0KTUxMik7CiAJCQlmb3IgKGkgPSAwOyBpIDwgbnVtX3BhZ2VzOyBpKyspCi0JCQkJcHRbaV0gPSB2aXJ0X3RvX2Ficygodm9pZCopKCgodTY0KXN0YXJ0KQotCQkJCQkJCSAgICAgKyAoKGsrKykgKgotCQkJCQkJCQlQQUdFX1NJWkUpKSk7CisJCQkJcHRbaV0gPSB2aXJ0X3RvX2Ficygodm9pZCopKCgodTY0KXN0YXJ0KSArCisJCQkJCQkJICAgICgoaysrKSAqCisJCQkJCQkJICAgICBFSEVBX1BBR0VTSVpFKSkpOwogCiAJCQlocmV0ID0gZWhlYV9oX3JlZ2lzdGVyX3JwYWdlX21yKGFkYXB0ZXItPmhhbmRsZSwKIAkJCQkJCQlhZGFwdGVyLT5tci5oYW5kbGUsIDAsCkBAIC01NDgsOCArNTQ4LDkgQEAKIAkJCQkJCQludW1fcGFnZXMpOwogCQkJbnJfcGFnZXMgLT0gbnVtX3BhZ2VzOwogCQl9IGVsc2UgewotCQkJdTY0IGFic19hZHIgPSB2aXJ0X3RvX2Ficygodm9pZCopKCgodTY0KXN0YXJ0KQotCQkJCQkJCSAgICsgKGsgKiBQQUdFX1NJWkUpKSk7CisJCQl1NjQgYWJzX2FkciA9IHZpcnRfdG9fYWJzKCh2b2lkKikoKCh1NjQpc3RhcnQpICsKKwkJCQkJCQkgIChrICogRUhFQV9QQUdFU0laRSkpKTsKKwogCQkJaHJldCA9IGVoZWFfaF9yZWdpc3Rlcl9ycGFnZV9tcihhZGFwdGVyLT5oYW5kbGUsCiAJCQkJCQkJYWRhcHRlci0+bXIuaGFuZGxlLCAwLAogCQkJCQkJCTAsIGFic19hZHIsMSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGgxNmkuYyBiL2RyaXZlcnMvbmV0L2V0aDE2aS5jCmluZGV4IDhjYzNjMzMuLmI3YjhiYzIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aDE2aS5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aDE2aS5jCkBAIC0xNjIsOSArMTYyLDkgQEAKICNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KICNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KICNpbmNsdWRlIDxsaW51eC9qaWZmaWVzLmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KIAogI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KLSNpbmNsdWRlIDxhc20vaW8uaD4KICNpbmNsdWRlIDxhc20vZG1hLmg+CiAKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZm9yY2VkZXRoLmMgYi9kcml2ZXJzL25ldC9mb3JjZWRldGguYwppbmRleCA5OWI3YTQxLi5jNWVkNjM1IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9mb3JjZWRldGguYworKysgYi9kcml2ZXJzL25ldC9mb3JjZWRldGguYwpAQCAtMjQ5Nyw2ICsyNDk3LDcgQEAKIAl1OCBfX2lvbWVtICpiYXNlID0gZ2V0X2h3YmFzZShkZXYpOwogCXUzMiBldmVudHM7CiAJaW50IGk7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKIAogCWRwcmludGsoS0VSTl9ERUJVRyAiJXM6IG52X25pY19pcnFfdHhcbiIsIGRldi0+bmFtZSk7CiAKQEAgLTI1MDgsMTYgKzI1MDksMTYgQEAKIAkJaWYgKCEoZXZlbnRzICYgbnAtPmlycW1hc2spKQogCQkJYnJlYWs7CiAKLQkJc3Bpbl9sb2NrX2lycSgmbnAtPmxvY2spOworCQlzcGluX2xvY2tfaXJxc2F2ZSgmbnAtPmxvY2ssIGZsYWdzKTsKIAkJbnZfdHhfZG9uZShkZXYpOwotCQlzcGluX3VubG9ja19pcnEoJm5wLT5sb2NrKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbnAtPmxvY2ssIGZsYWdzKTsKIAogCQlpZiAoZXZlbnRzICYgKE5WUkVHX0lSUV9UWF9FUlIpKSB7CiAJCQlkcHJpbnRrKEtFUk5fREVCVUcgIiVzOiByZWNlaXZlZCBpcnEgd2l0aCBldmVudHMgMHgleC4gUHJvYmFibHkgVFggZmFpbC5cbiIsCiAJCQkJCQlkZXYtPm5hbWUsIGV2ZW50cyk7CiAJCX0KIAkJaWYgKGkgPiBtYXhfaW50ZXJydXB0X3dvcmspIHsKLQkJCXNwaW5fbG9ja19pcnEoJm5wLT5sb2NrKTsKKwkJCXNwaW5fbG9ja19pcnFzYXZlKCZucC0+bG9jaywgZmxhZ3MpOwogCQkJLyogZGlzYWJsZSBpbnRlcnJ1cHRzIG9uIHRoZSBuaWMgKi8KIAkJCXdyaXRlbChOVlJFR19JUlFfVFhfQUxMLCBiYXNlICsgTnZSZWdJcnFNYXNrKTsKIAkJCXBjaV9wdXNoKGJhc2UpOwpAQCAtMjUyNyw3ICsyNTI4LDcgQEAKIAkJCQltb2RfdGltZXIoJm5wLT5uaWNfcG9sbCwgamlmZmllcyArIFBPTExfV0FJVCk7CiAJCQl9CiAJCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IHRvbyBtYW55IGl0ZXJhdGlvbnMgKCVkKSBpbiBudl9uaWNfaXJxX3R4LlxuIiwgZGV2LT5uYW1lLCBpKTsKLQkJCXNwaW5fdW5sb2NrX2lycSgmbnAtPmxvY2spOworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbnAtPmxvY2ssIGZsYWdzKTsKIAkJCWJyZWFrOwogCQl9CiAKQEAgLTI2MDEsNiArMjYwMiw3IEBACiAJdTggX19pb21lbSAqYmFzZSA9IGdldF9od2Jhc2UoZGV2KTsKIAl1MzIgZXZlbnRzOwogCWludCBpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKIAlkcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBudl9uaWNfaXJxX3J4XG4iLCBkZXYtPm5hbWUpOwogCkBAIC0yNjE0LDE0ICsyNjE2LDE0IEBACiAKIAkJbnZfcnhfcHJvY2VzcyhkZXYsIGRldi0+d2VpZ2h0KTsKIAkJaWYgKG52X2FsbG9jX3J4KGRldikpIHsKLQkJCXNwaW5fbG9ja19pcnEoJm5wLT5sb2NrKTsKKwkJCXNwaW5fbG9ja19pcnFzYXZlKCZucC0+bG9jaywgZmxhZ3MpOwogCQkJaWYgKCFucC0+aW5fc2h1dGRvd24pCiAJCQkJbW9kX3RpbWVyKCZucC0+b29tX2tpY2ssIGppZmZpZXMgKyBPT01fUkVGSUxMKTsKLQkJCXNwaW5fdW5sb2NrX2lycSgmbnAtPmxvY2spOworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbnAtPmxvY2ssIGZsYWdzKTsKIAkJfQogCiAJCWlmIChpID4gbWF4X2ludGVycnVwdF93b3JrKSB7Ci0JCQlzcGluX2xvY2tfaXJxKCZucC0+bG9jayk7CisJCQlzcGluX2xvY2tfaXJxc2F2ZSgmbnAtPmxvY2ssIGZsYWdzKTsKIAkJCS8qIGRpc2FibGUgaW50ZXJydXB0cyBvbiB0aGUgbmljICovCiAJCQl3cml0ZWwoTlZSRUdfSVJRX1JYX0FMTCwgYmFzZSArIE52UmVnSXJxTWFzayk7CiAJCQlwY2lfcHVzaChiYXNlKTsKQEAgLTI2MzEsNyArMjYzMyw3IEBACiAJCQkJbW9kX3RpbWVyKCZucC0+bmljX3BvbGwsIGppZmZpZXMgKyBQT0xMX1dBSVQpOwogCQkJfQogCQkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiB0b28gbWFueSBpdGVyYXRpb25zICglZCkgaW4gbnZfbmljX2lycV9yeC5cbiIsIGRldi0+bmFtZSwgaSk7Ci0JCQlzcGluX3VubG9ja19pcnEoJm5wLT5sb2NrKTsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm5wLT5sb2NrLCBmbGFncyk7CiAJCQlicmVhazsKIAkJfQogCX0KQEAgLTI2NDgsNiArMjY1MCw3IEBACiAJdTggX19pb21lbSAqYmFzZSA9IGdldF9od2Jhc2UoZGV2KTsKIAl1MzIgZXZlbnRzOwogCWludCBpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKIAlkcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBudl9uaWNfaXJxX290aGVyXG4iLCBkZXYtPm5hbWUpOwogCkBAIC0yNjYwLDE0ICsyNjYzLDE0IEBACiAJCQlicmVhazsKIAogCQlpZiAoZXZlbnRzICYgTlZSRUdfSVJRX0xJTkspIHsKLQkJCXNwaW5fbG9ja19pcnEoJm5wLT5sb2NrKTsKKwkJCXNwaW5fbG9ja19pcnFzYXZlKCZucC0+bG9jaywgZmxhZ3MpOwogCQkJbnZfbGlua19pcnEoZGV2KTsKLQkJCXNwaW5fdW5sb2NrX2lycSgmbnAtPmxvY2spOworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbnAtPmxvY2ssIGZsYWdzKTsKIAkJfQogCQlpZiAobnAtPm5lZWRfbGlua3RpbWVyICYmIHRpbWVfYWZ0ZXIoamlmZmllcywgbnAtPmxpbmtfdGltZW91dCkpIHsKLQkJCXNwaW5fbG9ja19pcnEoJm5wLT5sb2NrKTsKKwkJCXNwaW5fbG9ja19pcnFzYXZlKCZucC0+bG9jaywgZmxhZ3MpOwogCQkJbnZfbGlua2NoYW5nZShkZXYpOwotCQkJc3Bpbl91bmxvY2tfaXJxKCZucC0+bG9jayk7CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZucC0+bG9jaywgZmxhZ3MpOwogCQkJbnAtPmxpbmtfdGltZW91dCA9IGppZmZpZXMgKyBMSU5LX1RJTUVPVVQ7CiAJCX0KIAkJaWYgKGV2ZW50cyAmIChOVlJFR19JUlFfVU5LTk9XTikpIHsKQEAgLTI2NzUsNyArMjY3OCw3IEBACiAJCQkJCQlkZXYtPm5hbWUsIGV2ZW50cyk7CiAJCX0KIAkJaWYgKGkgPiBtYXhfaW50ZXJydXB0X3dvcmspIHsKLQkJCXNwaW5fbG9ja19pcnEoJm5wLT5sb2NrKTsKKwkJCXNwaW5fbG9ja19pcnFzYXZlKCZucC0+bG9jaywgZmxhZ3MpOwogCQkJLyogZGlzYWJsZSBpbnRlcnJ1cHRzIG9uIHRoZSBuaWMgKi8KIAkJCXdyaXRlbChOVlJFR19JUlFfT1RIRVIsIGJhc2UgKyBOdlJlZ0lycU1hc2spOwogCQkJcGNpX3B1c2goYmFzZSk7CkBAIC0yNjg1LDcgKzI2ODgsNyBAQAogCQkJCW1vZF90aW1lcigmbnAtPm5pY19wb2xsLCBqaWZmaWVzICsgUE9MTF9XQUlUKTsKIAkJCX0KIAkJCXByaW50ayhLRVJOX0RFQlVHICIlczogdG9vIG1hbnkgaXRlcmF0aW9ucyAoJWQpIGluIG52X25pY19pcnFfb3RoZXIuXG4iLCBkZXYtPm5hbWUsIGkpOwotCQkJc3Bpbl91bmxvY2tfaXJxKCZucC0+bG9jayk7CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZucC0+bG9jaywgZmxhZ3MpOwogCQkJYnJlYWs7CiAJCX0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvaWJtdmV0aC5jIGIvZHJpdmVycy9uZXQvaWJtdmV0aC5jCmluZGV4IDRiYWMzY2QuLjQ0YzlmOTkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2libXZldGguYworKysgYi9kcml2ZXJzL25ldC9pYm12ZXRoLmMKQEAgLTIxMiw3ICsyMTIsOCBAQAogCQkJYnJlYWs7CiAJCX0KIAotCQlmcmVlX2luZGV4ID0gcG9vbC0+Y29uc3VtZXJfaW5kZXgrKyAlIHBvb2wtPnNpemU7CisJCWZyZWVfaW5kZXggPSBwb29sLT5jb25zdW1lcl9pbmRleDsKKwkJcG9vbC0+Y29uc3VtZXJfaW5kZXggPSAocG9vbC0+Y29uc3VtZXJfaW5kZXggKyAxKSAlIHBvb2wtPnNpemU7CiAJCWluZGV4ID0gcG9vbC0+ZnJlZV9tYXBbZnJlZV9pbmRleF07CiAKIAkJaWJtdmV0aF9hc3NlcnQoaW5kZXggIT0gSUJNX1ZFVEhfSU5WQUxJRF9NQVApOwpAQCAtMjM4LDcgKzIzOSwxMCBAQAogCQlpZihscGFyX3JjICE9IEhfU1VDQ0VTUykgewogCQkJcG9vbC0+ZnJlZV9tYXBbZnJlZV9pbmRleF0gPSBpbmRleDsKIAkJCXBvb2wtPnNrYnVmZltpbmRleF0gPSBOVUxMOwotCQkJcG9vbC0+Y29uc3VtZXJfaW5kZXgtLTsKKwkJCWlmIChwb29sLT5jb25zdW1lcl9pbmRleCA9PSAwKQorCQkJCXBvb2wtPmNvbnN1bWVyX2luZGV4ID0gcG9vbC0+c2l6ZSAtIDE7CisJCQllbHNlCisJCQkJcG9vbC0+Y29uc3VtZXJfaW5kZXgtLTsKIAkJCWRtYV91bm1hcF9zaW5nbGUoJmFkYXB0ZXItPnZkZXYtPmRldiwKIAkJCQkJcG9vbC0+ZG1hX2FkZHJbaW5kZXhdLCBwb29sLT5idWZmX3NpemUsCiAJCQkJCURNQV9GUk9NX0RFVklDRSk7CkBAIC0zMjUsNyArMzI5LDEwIEBACiAJCQkgYWRhcHRlci0+cnhfYnVmZl9wb29sW3Bvb2xdLmJ1ZmZfc2l6ZSwKIAkJCSBETUFfRlJPTV9ERVZJQ0UpOwogCi0JZnJlZV9pbmRleCA9IGFkYXB0ZXItPnJ4X2J1ZmZfcG9vbFtwb29sXS5wcm9kdWNlcl9pbmRleCsrICUgYWRhcHRlci0+cnhfYnVmZl9wb29sW3Bvb2xdLnNpemU7CisJZnJlZV9pbmRleCA9IGFkYXB0ZXItPnJ4X2J1ZmZfcG9vbFtwb29sXS5wcm9kdWNlcl9pbmRleDsKKwlhZGFwdGVyLT5yeF9idWZmX3Bvb2xbcG9vbF0ucHJvZHVjZXJfaW5kZXgKKwkJPSAoYWRhcHRlci0+cnhfYnVmZl9wb29sW3Bvb2xdLnByb2R1Y2VyX2luZGV4ICsgMSkKKwkJJSBhZGFwdGVyLT5yeF9idWZmX3Bvb2xbcG9vbF0uc2l6ZTsKIAlhZGFwdGVyLT5yeF9idWZmX3Bvb2xbcG9vbF0uZnJlZV9tYXBbZnJlZV9pbmRleF0gPSBpbmRleDsKIAogCW1iKCk7CkBAIC00MzcsNiArNDQ0LDMxIEBACiAJCQkJCQkgJmFkYXB0ZXItPnJ4X2J1ZmZfcG9vbFtpXSk7CiB9CiAKK3N0YXRpYyBpbnQgaWJtdmV0aF9yZWdpc3Rlcl9sb2dpY2FsX2xhbihzdHJ1Y3QgaWJtdmV0aF9hZGFwdGVyICphZGFwdGVyLAorICAgICAgICB1bmlvbiBpYm12ZXRoX2J1Zl9kZXNjIHJ4cV9kZXNjLCB1NjQgbWFjX2FkZHJlc3MpCit7CisJaW50IHJjLCB0cnlfYWdhaW4gPSAxOworCisJLyogQWZ0ZXIgYSBrZXhlYyB0aGUgYWRhcHRlciB3aWxsIHN0aWxsIGJlIG9wZW4sIHNvIG91ciBhdHRlbXB0IHRvCisJKiBvcGVuIGl0IHdpbGwgZmFpbC4gU28gaWYgd2UgZ2V0IGEgZmFpbHVyZSB3ZSBmcmVlIHRoZSBhZGFwdGVyIGFuZAorCSogdHJ5IGFnYWluLCBidXQgb25seSBvbmNlLiAqLworcmV0cnk6CisJcmMgPSBoX3JlZ2lzdGVyX2xvZ2ljYWxfbGFuKGFkYXB0ZXItPnZkZXYtPnVuaXRfYWRkcmVzcywKKwkJCQkgICAgYWRhcHRlci0+YnVmZmVyX2xpc3RfZG1hLCByeHFfZGVzYy5kZXNjLAorCQkJCSAgICBhZGFwdGVyLT5maWx0ZXJfbGlzdF9kbWEsIG1hY19hZGRyZXNzKTsKKworCWlmIChyYyAhPSBIX1NVQ0NFU1MgJiYgdHJ5X2FnYWluKSB7CisJCWRvIHsKKwkJCXJjID0gaF9mcmVlX2xvZ2ljYWxfbGFuKGFkYXB0ZXItPnZkZXYtPnVuaXRfYWRkcmVzcyk7CisJCX0gd2hpbGUgKEhfSVNfTE9OR19CVVNZKHJjKSB8fCAocmMgPT0gSF9CVVNZKSk7CisKKwkJdHJ5X2FnYWluID0gMDsKKwkJZ290byByZXRyeTsKKwl9CisKKwlyZXR1cm4gcmM7Cit9CisKIHN0YXRpYyBpbnQgaWJtdmV0aF9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYpCiB7CiAJc3RydWN0IGlibXZldGhfYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldi0+cHJpdjsKQEAgLTUwMiwxMiArNTM0LDkgQEAKIAlpYm12ZXRoX2RlYnVnX3ByaW50aygiZmlsdGVyIGxpc3QgQCAweCVwXG4iLCBhZGFwdGVyLT5maWx0ZXJfbGlzdF9hZGRyKTsKIAlpYm12ZXRoX2RlYnVnX3ByaW50aygicmVjZWl2ZSBxICAgQCAweCVwXG4iLCBhZGFwdGVyLT5yeF9xdWV1ZS5xdWV1ZV9hZGRyKTsKIAorCWhfdmlvX3NpZ25hbChhZGFwdGVyLT52ZGV2LT51bml0X2FkZHJlc3MsIFZJT19JUlFfRElTQUJMRSk7CiAKLQlscGFyX3JjID0gaF9yZWdpc3Rlcl9sb2dpY2FsX2xhbihhZGFwdGVyLT52ZGV2LT51bml0X2FkZHJlc3MsCi0JCQkJCSBhZGFwdGVyLT5idWZmZXJfbGlzdF9kbWEsCi0JCQkJCSByeHFfZGVzYy5kZXNjLAotCQkJCQkgYWRhcHRlci0+ZmlsdGVyX2xpc3RfZG1hLAotCQkJCQkgbWFjX2FkZHJlc3MpOworCWxwYXJfcmMgPSBpYm12ZXRoX3JlZ2lzdGVyX2xvZ2ljYWxfbGFuKGFkYXB0ZXIsIHJ4cV9kZXNjLCBtYWNfYWRkcmVzcyk7CiAKIAlpZihscGFyX3JjICE9IEhfU1VDQ0VTUykgewogCQlpYm12ZXRoX2Vycm9yX3ByaW50aygiaF9yZWdpc3Rlcl9sb2dpY2FsX2xhbiBmYWlsZWQgd2l0aCAlbGRcbiIsIGxwYXJfcmMpOwpAQCAtOTA1LDYgKzkzNCwxNCBAQAogCXJldHVybiAtRUlOVkFMOwogfQogCisjaWZkZWYgQ09ORklHX05FVF9QT0xMX0NPTlRST0xMRVIKK3N0YXRpYyB2b2lkIGlibXZldGhfcG9sbF9jb250cm9sbGVyKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJaWJtdmV0aF9yZXBsZW5pc2hfdGFzayhkZXYtPnByaXYpOworCWlibXZldGhfaW50ZXJydXB0KGRldi0+aXJxLCBkZXYpOworfQorI2VuZGlmCisKIHN0YXRpYyBpbnQgX19kZXZpbml0IGlibXZldGhfcHJvYmUoc3RydWN0IHZpb19kZXYgKmRldiwgY29uc3Qgc3RydWN0IHZpb19kZXZpY2VfaWQgKmlkKQogewogCWludCByYywgaTsKQEAgLTk3Nyw2ICsxMDE0LDkgQEAKIAluZXRkZXYtPmV0aHRvb2xfb3BzICAgICAgICAgICA9ICZuZXRkZXZfZXRodG9vbF9vcHM7CiAJbmV0ZGV2LT5jaGFuZ2VfbXR1ICAgICAgICAgPSBpYm12ZXRoX2NoYW5nZV9tdHU7CiAJU0VUX05FVERFVl9ERVYobmV0ZGV2LCAmZGV2LT5kZXYpOworI2lmZGVmIENPTkZJR19ORVRfUE9MTF9DT05UUk9MTEVSCisJbmV0ZGV2LT5wb2xsX2NvbnRyb2xsZXIgPSBpYm12ZXRoX3BvbGxfY29udHJvbGxlcjsKKyNlbmRpZgogIAluZXRkZXYtPmZlYXR1cmVzIHw9IE5FVElGX0ZfTExUWDsKIAlzcGluX2xvY2tfaW5pdCgmYWRhcHRlci0+c3RhdHNfbG9jayk7CiAKQEAgLTExMzIsNyArMTE3Miw5IEBACiB7CiAJc3RydWN0IHByb2NfZGlyX2VudHJ5ICplbnRyeTsKIAlpZiAoaWJtdmV0aF9wcm9jX2RpcikgewotCQllbnRyeSA9IGNyZWF0ZV9wcm9jX2VudHJ5KGFkYXB0ZXItPm5ldGRldi0+bmFtZSwgU19JRlJFRywgaWJtdmV0aF9wcm9jX2Rpcik7CisJCWNoYXIgdV9hZGRyWzEwXTsKKwkJc3ByaW50Zih1X2FkZHIsICIleCIsIGFkYXB0ZXItPnZkZXYtPnVuaXRfYWRkcmVzcyk7CisJCWVudHJ5ID0gY3JlYXRlX3Byb2NfZW50cnkodV9hZGRyLCBTX0lGUkVHLCBpYm12ZXRoX3Byb2NfZGlyKTsKIAkJaWYgKCFlbnRyeSkgewogCQkJaWJtdmV0aF9lcnJvcl9wcmludGsoIkNhbm5vdCBjcmVhdGUgYWRhcHRlciBwcm9jIGVudHJ5Iik7CiAJCX0gZWxzZSB7CkBAIC0xMTQ3LDcgKzExODksOSBAQAogc3RhdGljIHZvaWQgaWJtdmV0aF9wcm9jX3VucmVnaXN0ZXJfYWRhcHRlcihzdHJ1Y3QgaWJtdmV0aF9hZGFwdGVyICphZGFwdGVyKQogewogCWlmIChpYm12ZXRoX3Byb2NfZGlyKSB7Ci0JCXJlbW92ZV9wcm9jX2VudHJ5KGFkYXB0ZXItPm5ldGRldi0+bmFtZSwgaWJtdmV0aF9wcm9jX2Rpcik7CisJCWNoYXIgdV9hZGRyWzEwXTsKKwkJc3ByaW50Zih1X2FkZHIsICIleCIsIGFkYXB0ZXItPnZkZXYtPnVuaXRfYWRkcmVzcyk7CisJCXJlbW92ZV9wcm9jX2VudHJ5KHVfYWRkciwgaWJtdmV0aF9wcm9jX2Rpcik7CiAJfQogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9pb2MzLWV0aC5jIGIvZHJpdmVycy9uZXQvaW9jMy1ldGguYwppbmRleCBlOTYzZGJmLi5mNTZiMDBlIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9pb2MzLWV0aC5jCisrKyBiL2RyaXZlcnMvbmV0L2lvYzMtZXRoLmMKQEAgLTEwMTcsNyArMTAxNyw3IEBACiAJc3RydWN0IGlvYzNfcHJpdmF0ZSAqaXAgPSBuZXRkZXZfcHJpdihkZXYpOwogCXN0cnVjdCBpb2MzICppb2MzID0gaXAtPnJlZ3M7CiAKLQlkZWxfdGltZXIoJmlwLT5pb2MzX3RpbWVyKTsJCS8qIEtpbGwgaWYgcnVubmluZwkqLworCWRlbF90aW1lcl9zeW5jKCZpcC0+aW9jM190aW1lcik7CS8qIEtpbGwgaWYgcnVubmluZwkqLwogCiAJaW9jM193X2VtY3IoRU1DUl9SU1QpOwkJCS8qIFJlc2V0CQkqLwogCSh2b2lkKSBpb2MzX3JfZW1jcigpOwkJCS8qIEZsdXNoIFdCCQkqLwpAQCAtMTA4MSw3ICsxMDgxLDcgQEAKIHsKIAlzdHJ1Y3QgaW9jM19wcml2YXRlICppcCA9IG5ldGRldl9wcml2KGRldik7CiAKLQlkZWxfdGltZXIoJmlwLT5pb2MzX3RpbWVyKTsKKwlkZWxfdGltZXJfc3luYygmaXAtPmlvYzNfdGltZXIpOwogCiAJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9pcmRhL3N0aXI0MjAwLmMgYi9kcml2ZXJzL25ldC9pcmRhL3N0aXI0MjAwLmMKaW5kZXggYmU4YTY2ZS4uM2I0YzQ3OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvaXJkYS9zdGlyNDIwMC5jCisrKyBiL2RyaXZlcnMvbmV0L2lyZGEvc3RpcjQyMDAuYwpAQCAtMTUsOCArMTUsNyBAQAogKgogKglUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQogKglpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotKgl0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKgkoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorKgl0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLgogKgogKglUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICoJYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2xvb3BiYWNrLmMgYi9kcml2ZXJzL25ldC9sb29wYmFjay5jCmluZGV4IDQxNzhiNGIxLi44MmMxMGRlIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9sb29wYmFjay5jCisrKyBiL2RyaXZlcnMvbmV0L2xvb3BiYWNrLmMKQEAgLTU4LDcgKzU4LDExIEBACiAjaW5jbHVkZSA8bGludXgvdGNwLmg+CiAjaW5jbHVkZSA8bGludXgvcGVyY3B1Lmg+CiAKLXN0YXRpYyBERUZJTkVfUEVSX0NQVShzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cywgbG9vcGJhY2tfc3RhdHMpOworc3RydWN0IHBjcHVfbHN0YXRzIHsKKwl1bnNpZ25lZCBsb25nIHBhY2tldHM7CisJdW5zaWduZWQgbG9uZyBieXRlczsKK307CitzdGF0aWMgREVGSU5FX1BFUl9DUFUoc3RydWN0IHBjcHVfbHN0YXRzLCBwY3B1X2xzdGF0cyk7CiAKICNkZWZpbmUgTE9PUEJBQ0tfT1ZFUkhFQUQgKDEyOCArIE1BWF9IRUFERVIgKyAxNiArIDE2KQogCkBAIC0xMjgsNyArMTMyLDcgQEAKICAqLwogc3RhdGljIGludCBsb29wYmFja194bWl0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7Ci0Jc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKmxiX3N0YXRzOworCXN0cnVjdCBwY3B1X2xzdGF0cyAqbGJfc3RhdHM7CiAKIAlza2Jfb3JwaGFuKHNrYik7CiAKQEAgLTE0OSwxNiArMTUzLDE0IEBACiAjZW5kaWYKIAlkZXYtPmxhc3RfcnggPSBqaWZmaWVzOwogCi0JbGJfc3RhdHMgPSAmcGVyX2NwdShsb29wYmFja19zdGF0cywgZ2V0X2NwdSgpKTsKLQlsYl9zdGF0cy0+cnhfYnl0ZXMgKz0gc2tiLT5sZW47Ci0JbGJfc3RhdHMtPnR4X2J5dGVzID0gbGJfc3RhdHMtPnJ4X2J5dGVzOwotCWxiX3N0YXRzLT5yeF9wYWNrZXRzKys7Ci0JbGJfc3RhdHMtPnR4X3BhY2tldHMgPSBsYl9zdGF0cy0+cnhfcGFja2V0czsKLQlwdXRfY3B1KCk7CisJLyogaXQncyBPSyB0byB1c2UgX19nZXRfY3B1X3ZhcigpIGJlY2F1c2UgQkhzIGFyZSBvZmYgKi8KKwlsYl9zdGF0cyA9ICZfX2dldF9jcHVfdmFyKHBjcHVfbHN0YXRzKTsKKwlsYl9zdGF0cy0+Ynl0ZXMgKz0gc2tiLT5sZW47CisJbGJfc3RhdHMtPnBhY2tldHMrKzsKIAogCW5ldGlmX3J4KHNrYik7CiAKLQlyZXR1cm4oMCk7CisJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyBsb29wYmFja19zdGF0czsKQEAgLTE2NiwyMCArMTY4LDIxIEBACiBzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKmdldF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewogCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpzdGF0cyA9ICZsb29wYmFja19zdGF0czsKKwl1bnNpZ25lZCBsb25nIGJ5dGVzID0gMDsKKwl1bnNpZ25lZCBsb25nIHBhY2tldHMgPSAwOwogCWludCBpOwogCi0JbWVtc2V0KHN0YXRzLCAwLCBzaXplb2Yoc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMpKTsKLQogCWZvcl9lYWNoX3Bvc3NpYmxlX2NwdShpKSB7Ci0JCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpsYl9zdGF0czsKKwkJY29uc3Qgc3RydWN0IHBjcHVfbHN0YXRzICpsYl9zdGF0czsKIAotCQlsYl9zdGF0cyA9ICZwZXJfY3B1KGxvb3BiYWNrX3N0YXRzLCBpKTsKLQkJc3RhdHMtPnJ4X2J5dGVzICAgKz0gbGJfc3RhdHMtPnJ4X2J5dGVzOwotCQlzdGF0cy0+dHhfYnl0ZXMgICArPSBsYl9zdGF0cy0+dHhfYnl0ZXM7Ci0JCXN0YXRzLT5yeF9wYWNrZXRzICs9IGxiX3N0YXRzLT5yeF9wYWNrZXRzOwotCQlzdGF0cy0+dHhfcGFja2V0cyArPSBsYl9zdGF0cy0+dHhfcGFja2V0czsKKwkJbGJfc3RhdHMgPSAmcGVyX2NwdShwY3B1X2xzdGF0cywgaSk7CisJCWJ5dGVzICAgKz0gbGJfc3RhdHMtPmJ5dGVzOworCQlwYWNrZXRzICs9IGxiX3N0YXRzLT5wYWNrZXRzOwogCX0KLQorCXN0YXRzLT5yeF9wYWNrZXRzID0gcGFja2V0czsKKwlzdGF0cy0+dHhfcGFja2V0cyA9IHBhY2tldHM7CisJc3RhdHMtPnJ4X2J5dGVzID0gYnl0ZXM7CisJc3RhdHMtPnR4X2J5dGVzID0gYnl0ZXM7CiAJcmV0dXJuIHN0YXRzOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9tdjY0M3h4X2V0aC5jIGIvZHJpdmVycy9uZXQvbXY2NDN4eF9ldGguYwppbmRleCAyZmZhM2E1Li45OTk3MDgxIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9tdjY0M3h4X2V0aC5jCisrKyBiL2RyaXZlcnMvbmV0L212NjQzeHhfZXRoLmMKQEAgLTIxNTUsNyArMjE1NSw3IEBACiAJZm9yIChvZmZzZXQgPSBFVEhfTUlCX0JBRF9PQ1RFVFNfUkVDRUlWRUQ7CiAJCQlvZmZzZXQgPD0gRVRIX01JQl9GUkFNRVNfMTAyNF9UT19NQVhfT0NURVRTOwogCQkJb2Zmc2V0ICs9IDQpCi0JCSoodTMyICopKChjaGFyICopcCArIG9mZnNldCkgPSByZWFkX21pYihtcCwgb2Zmc2V0KTsKKwkJKih1MzIgKikoKGNoYXIgKilwICsgb2Zmc2V0KSArPSByZWFkX21pYihtcCwgb2Zmc2V0KTsKIAogCXAtPmdvb2Rfb2N0ZXRzX3NlbnQgKz0gcmVhZF9taWIobXAsIEVUSF9NSUJfR09PRF9PQ1RFVFNfU0VOVF9MT1cpOwogCXAtPmdvb2Rfb2N0ZXRzX3NlbnQgKz0KQEAgLTIxNjQsNyArMjE2NCw3IEBACiAJZm9yIChvZmZzZXQgPSBFVEhfTUlCX0dPT0RfRlJBTUVTX1NFTlQ7CiAJCQlvZmZzZXQgPD0gRVRIX01JQl9MQVRFX0NPTExJU0lPTjsKIAkJCW9mZnNldCArPSA0KQotCQkqKHUzMiAqKSgoY2hhciAqKXAgKyBvZmZzZXQpID0gcmVhZF9taWIobXAsIG9mZnNldCk7CisJCSoodTMyICopKChjaGFyICopcCArIG9mZnNldCkgKz0gcmVhZF9taWIobXAsIG9mZnNldCk7CiB9CiAKIC8qCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9teXJpMTBnZS9teXJpMTBnZS5jIGIvZHJpdmVycy9uZXQvbXlyaTEwZ2UvbXlyaTEwZ2UuYwppbmRleCBmZGJiMGQ3Li44MDYwODFiIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9teXJpMTBnZS9teXJpMTBnZS5jCisrKyBiL2RyaXZlcnMvbmV0L215cmkxMGdlL215cmkxMGdlLmMKQEAgLTI0MTYsNyArMjQxNiw2IEBACiAgKiBmaXJtd2FyZSBpbWFnZSwgYW5kIHNldCB0eC5ib3VuZGFyeSB0byA0S0IuCiAgKi8KIAotI2RlZmluZSBQQ0lfREVWSUNFX0lEX1NFUlZFUldPUktTX0hUMjAwMF9QQ0lFCTB4MDEzMgogI2RlZmluZSBQQ0lfREVWSUNFX0lEX0lOVEVMX0U1MDAwX1BDSUUyMyAweDI1ZjcKICNkZWZpbmUgUENJX0RFVklDRV9JRF9JTlRFTF9FNTAwMF9QQ0lFNDcgMHgyNWZhCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L215cmlfY29kZS5oIGIvZHJpdmVycy9uZXQvbXlyaV9jb2RlLmgKaW5kZXggZTIxZWM5Yi4uYmE3Yjg2NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvbXlyaV9jb2RlLmgKKysrIGIvZHJpdmVycy9uZXQvbXlyaV9jb2RlLmgKQEAgLTEsOCArMSw4IEBACiAvKiBUaGlzIGlzIHRoZSBNeXJpbmV0IE1DUCBjb2RlIGZvciBMQU5haTQueCAqLwogLyogR2VuZXJhdGVkIGJ5ICBjYXQgJE1ZUklfSE9NRS9saWIvbGFuYWkvbWNwNC5kYXQgPiBteXJpX2NvZGU0LmggKi8KIAotc3RhdGljIHVuc2lnbmVkIGludCBsYW5haTRfY29kZV9vZmYgPSAweDAwMDA7IC8qIGhhbGYtd29yZCBvZmZzZXQgKi8KLXN0YXRpYyB1bnNpZ25lZCBjaGFyIGxhbmFpNF9jb2RlWzc2MjU2XSBfX2luaXRkYXRhID0geworc3RhdGljIHVuc2lnbmVkIGludCBfX2RldmluaXRkYXRhIGxhbmFpNF9jb2RlX29mZiA9IDB4MDAwMDsgLyogaGFsZi13b3JkIG9mZnNldCAqLworc3RhdGljIHVuc2lnbmVkIGNoYXIgX19kZXZpbml0ZGF0YSBsYW5haTRfY29kZVs3NjI1Nl0gPSB7CiAweEYyLDB4MEUsCiAweEZFLDB4MDAsIDB4QzIsMHg5MCwgMHgwMCwweDAwLCAweDA3LDB4ODgsIDB4MDAsMHgwOCwgMHhFMCwweDAxLCAweDAxLDB4NEMsIDB4OTcsMHg5MywKIDB4RkYsMHhGQywgMHhFMCwweDAwLCAweDAwLDB4MTQsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHg5MiwweDkzLApAQCAtNDc3NCw4ICs0Nzc0LDggQEAKIAogLyogVGhpcyBpcyB0aGUgTEFOYWkgZGF0YSAqLwogCi1zdGF0aWMgdW5zaWduZWQgaW50IGxhbmFpNF9kYXRhX29mZiA9IDB4OTRGMDsgLyogaGFsZi13b3JkIG9mZnNldCAqLwotc3RhdGljIHVuc2lnbmVkIGNoYXIgbGFuYWk0X2RhdGFbMjA0NzJdIF9faW5pdGRhdGE7CitzdGF0aWMgdW5zaWduZWQgaW50IF9fZGV2aW5pdGRhdGEgbGFuYWk0X2RhdGFfb2ZmID0gMHg5NEYwOyAvKiBoYWxmLXdvcmQgb2Zmc2V0ICovCitzdGF0aWMgdW5zaWduZWQgY2hhciBfX2RldmluaXRkYXRhIGxhbmFpNF9kYXRhWzIwNDcyXTsKIAogCiAjaWZkZWYgU1lNQk9MX0RFRklORVNfQ09NUElMRUQKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L215cmlfc2J1cy5jIGIvZHJpdmVycy9uZXQvbXlyaV9zYnVzLmMKaW5kZXggNDY2YjQ4NC4uNzc0N2JmZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvbXlyaV9zYnVzLmMKKysrIGIvZHJpdmVycy9uZXQvbXlyaV9zYnVzLmMKQEAgLTE2OCw3ICsxNjgsNyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IG15cmlfbG9hZF9sYW5haShzdHJ1Y3QgbXlyaV9ldGggKm1wKQorc3RhdGljIGludCBfX2RldmluaXQgbXlyaV9sb2FkX2xhbmFpKHN0cnVjdCBteXJpX2V0aCAqbXApCiB7CiAJc3RydWN0IG5ldF9kZXZpY2UJKmRldiA9IG1wLT5kZXY7CiAJc3RydWN0IG15cmlfc2htZW0gX19pb21lbSAqc2htZW0gPSBtcC0+c2htZW07CkBAIC04OTEsNyArODkxLDcgQEAKIH0KICNlbmRpZgogCi1zdGF0aWMgaW50IF9faW5pdCBteXJpX2V0aGVyX2luaXQoc3RydWN0IHNidXNfZGV2ICpzZGV2KQorc3RhdGljIGludCBfX2RldmluaXQgbXlyaV9ldGhlcl9pbml0KHN0cnVjdCBzYnVzX2RldiAqc2RldikKIHsKIAlzdGF0aWMgaW50IG51bTsKIAlzdGF0aWMgdW5zaWduZWQgdmVyc2lvbl9wcmludGVkOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvcjgxNjkuYyBiL2RyaXZlcnMvbmV0L3I4MTY5LmMKaW5kZXggZjFjNzU3NS4uMjdmOTBiMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvcjgxNjkuYworKysgYi9kcml2ZXJzL25ldC9yODE2OS5jCkBAIC0yMTQsNiArMjE0LDcgQEAKIAl7IFBDSV9ERVZJQ0UoUENJX1ZFTkRPUl9JRF9SRUFMVEVLLAkweDgxNjgpLCAwLCAwLCBSVExfQ0ZHXzIgfSwKIAl7IFBDSV9ERVZJQ0UoUENJX1ZFTkRPUl9JRF9SRUFMVEVLLAkweDgxNjkpLCAwLCAwLCBSVExfQ0ZHXzAgfSwKIAl7IFBDSV9ERVZJQ0UoUENJX1ZFTkRPUl9JRF9ETElOSywJMHg0MzAwKSwgMCwgMCwgUlRMX0NGR18wIH0sCisJeyBQQ0lfREVWSUNFKDB4MTI1OSwJCQkweGMxMDcpLCAwLCAwLCBSVExfQ0ZHXzAgfSwKIAl7IFBDSV9ERVZJQ0UoMHgxNmVjLAkJCTB4MDExNiksIDAsIDAsIFJUTF9DRkdfMCB9LAogCXsgUENJX1ZFTkRPUl9JRF9MSU5LU1lTLAkJMHgxMDMyLAogCQlQQ0lfQU5ZX0lELCAweDAwMjQsIDAsIDAsIFJUTF9DRkdfMCB9LApAQCAtMTM5Niw0MSArMTM5Nyw2IEBACiB9CiAjZW5kaWYKIAotc3RhdGljIHZvaWQgX19ydGw4MTY5X3NldF9tYWNfYWRkcihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB2b2lkIF9faW9tZW0gKmlvYWRkcikKLXsKLQl1bnNpZ25lZCBpbnQgaSwgajsKLQotCVJUTF9XOChDZmc5MzQ2LCBDZmc5MzQ2X1VubG9jayk7Ci0JZm9yIChpID0gMDsgaSA8IDI7IGkrKykgewotCQlfX2xlMzIgbCA9IDA7Ci0KLQkJZm9yIChqID0gMDsgaiA8IDQ7IGorKykgewotCQkJbCA8PD0gODsKLQkJCWwgfD0gZGV2LT5kZXZfYWRkcls0KmkgKyBqXTsKLQkJfQotCQlSVExfVzMyKE1BQzAgKyA0KmksIGNwdV90b19iZTMyKGwpKTsKLQl9Ci0JUlRMX1c4KENmZzkzNDYsIENmZzkzNDZfTG9jayk7Ci19Ci0KLXN0YXRpYyBpbnQgcnRsODE2OV9zZXRfbWFjX2FkZHIoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdm9pZCAqcCkKLXsKLQlzdHJ1Y3QgcnRsODE2OV9wcml2YXRlICp0cCA9IG5ldGRldl9wcml2KGRldik7Ci0Jc3RydWN0IHNvY2thZGRyICphZGRyID0gcDsKLQotCWlmICghaXNfdmFsaWRfZXRoZXJfYWRkcihhZGRyLT5zYV9kYXRhKSkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQltZW1jcHkoZGV2LT5kZXZfYWRkciwgYWRkci0+c2FfZGF0YSwgZGV2LT5hZGRyX2xlbik7Ci0KLQlpZiAobmV0aWZfcnVubmluZyhkZXYpKSB7Ci0JCXNwaW5fbG9ja19pcnEoJnRwLT5sb2NrKTsKLQkJX19ydGw4MTY5X3NldF9tYWNfYWRkcihkZXYsIHRwLT5tbWlvX2FkZHIpOwotCQlzcGluX3VubG9ja19pcnEoJnRwLT5sb2NrKTsKLQl9Ci0JcmV0dXJuIDA7Ci19Ci0KIHN0YXRpYyB2b2lkIHJ0bDgxNjlfcmVsZWFzZV9ib2FyZChzdHJ1Y3QgcGNpX2RldiAqcGRldiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKIAkJCQkgIHZvaWQgX19pb21lbSAqaW9hZGRyKQogewpAQCAtMTY4MCw3ICsxNjQ2LDYgQEAKIAlkZXYtPnN0b3AgPSBydGw4MTY5X2Nsb3NlOwogCWRldi0+dHhfdGltZW91dCA9IHJ0bDgxNjlfdHhfdGltZW91dDsKIAlkZXYtPnNldF9tdWx0aWNhc3RfbGlzdCA9IHJ0bDgxNjlfc2V0X3J4X21vZGU7Ci0JZGV2LT5zZXRfbWFjX2FkZHJlc3MgPSBydGw4MTY5X3NldF9tYWNfYWRkcjsKIAlkZXYtPndhdGNoZG9nX3RpbWVvID0gUlRMODE2OV9UWF9USU1FT1VUOwogCWRldi0+aXJxID0gcGRldi0+aXJxOwogCWRldi0+YmFzZV9hZGRyID0gKHVuc2lnbmVkIGxvbmcpIGlvYWRkcjsKQEAgLTE5MjgsOCArMTg5Myw2IEBACiAJLyogRW5hYmxlIGFsbCBrbm93biBpbnRlcnJ1cHRzIGJ5IHNldHRpbmcgdGhlIGludGVycnVwdCBtYXNrLiAqLwogCVJUTF9XMTYoSW50ck1hc2ssIHJ0bDgxNjlfaW50cl9tYXNrKTsKIAotCV9fcnRsODE2OV9zZXRfbWFjX2FkZHIoZGV2LCBpb2FkZHIpOwotCiAJbmV0aWZfc3RhcnRfcXVldWUoZGV2KTsKIH0KIApAQCAtMjcwMCw2ICsyNjYzLDcgQEAKIAlzdHJ1Y3QgcnRsODE2OV9wcml2YXRlICp0cCA9IG5ldGRldl9wcml2KGRldik7CiAJdm9pZCBfX2lvbWVtICppb2FkZHIgPSB0cC0+bW1pb19hZGRyOwogCXVuc2lnbmVkIGludCBwb2xsX2xvY2tlZCA9IDA7CisJdW5zaWduZWQgaW50IGludHJtYXNrOwogCiAJcnRsODE2OV9kZWxldGVfdGltZXIoZGV2KTsKIApAQCAtMjczOCw4ICsyNzAyLDExIEBACiAJICogMikgZGV2LT5jaGFuZ2VfbXR1CiAJICogICAgLT4gcnRsODE2OV9wb2xsIGNhbiBub3QgYmUgaXNzdWVkIGFnYWluIGFuZCByZS1lbmFibGUgdGhlCiAJICogICAgICAgaW50ZXJydXB0aW9ucy4gTGV0J3Mgc2ltcGx5IGlzc3VlIHRoZSBJUlEgZG93biBzZXF1ZW5jZSBhZ2Fpbi4KKwkgKgorCSAqIE5vIGxvb3AgaWYgaG90cGx1Z2VkIG9yIG1ham9yIGVycm9yICgweGZmZmYpLgogCSAqLwotCWlmIChSVExfUjE2KEludHJNYXNrKSkKKwlpbnRybWFzayA9IFJUTF9SMTYoSW50ck1hc2spOworCWlmIChpbnRybWFzayAmJiAoaW50cm1hc2sgIT0gMHhmZmZmKSkKIAkJZ290byBjb3JlX2Rvd247CiAKIAlydGw4MTY5X3R4X2NsZWFyKHRwKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3MyaW8uYyBiL2RyaXZlcnMvbmV0L3MyaW8uYwppbmRleCBhMjMxYWI3Li4zMzU2OWVjIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9zMmlvLmMKKysrIGIvZHJpdmVycy9uZXQvczJpby5jCkBAIC01OTg1LDYgKzU5ODUsMTEgQEAKIAkJCSgoUnhEM190KilyeGRwKS0+QnVmZmVyMV9wdHIgPSAqdGVtcDE7CiAJCX0gZWxzZSB7CiAJCQkqc2tiID0gZGV2X2FsbG9jX3NrYihzaXplKTsKKwkJCWlmICghKCpza2IpKSB7CisJCQkJREJHX1BSSU5UKEVSUl9EQkcsICIlczogZGV2X2FsbG9jX3NrYiBmYWlsZWRcbiIsCisJCQkJCSAgZGV2LT5uYW1lKTsKKwkJCQlyZXR1cm4gLUVOT01FTTsKKwkJCX0KIAkJCSgoUnhEM190KilyeGRwKS0+QnVmZmVyMl9wdHIgPSAqdGVtcDIgPQogCQkJCXBjaV9tYXBfc2luZ2xlKHNwLT5wZGV2LCAoKnNrYiktPmRhdGEsCiAJCQkJCSAgICAgICBkZXYtPm10dSArIDQsCkBAIC02MDA3LDcgKzYwMTIsMTEgQEAKIAkJCSgoUnhEM190KilyeGRwKS0+QnVmZmVyMl9wdHIgPSAqdGVtcDI7CiAJCX0gZWxzZSB7CiAJCQkqc2tiID0gZGV2X2FsbG9jX3NrYihzaXplKTsKLQorCQkJaWYgKCEoKnNrYikpIHsKKwkJCQlEQkdfUFJJTlQoRVJSX0RCRywgIiVzOiBkZXZfYWxsb2Nfc2tiIGZhaWxlZFxuIiwKKwkJCQkJICBkZXYtPm5hbWUpOworCQkJCXJldHVybiAtRU5PTUVNOworCQkJfQogCQkJKChSeEQzX3QqKXJ4ZHApLT5CdWZmZXIwX3B0ciA9ICp0ZW1wMCA9CiAJCQkJcGNpX21hcF9zaW5nbGUoc3AtPnBkZXYsIGJhLT5iYV8wLCBCVUYwX0xFTiwKIAkJCQkJICAgICAgIFBDSV9ETUFfRlJPTURFVklDRSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9zYjEyNTAtbWFjLmMgYi9kcml2ZXJzL25ldC9zYjEyNTAtbWFjLmMKaW5kZXggZGIyMzI0OS4uMWVhZTE2YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvc2IxMjUwLW1hYy5jCisrKyBiL2RyaXZlcnMvbmV0L3NiMTI1MC1tYWMuYwpAQCAtMjkwMyw3ICsyOTAzLDcgQEAKIAogCQlkZXYgPSBhbGxvY19ldGhlcmRldihzaXplb2Yoc3RydWN0IHNibWFjX3NvZnRjKSk7CiAJCWlmICghZGV2KQotCQkJcmV0dXJuIC1FTk9NRU07CS8qIHJldHVybiBFTk9NRU0gKi8KKwkJCXJldHVybiAtRU5PTUVNOwogCiAJCXByaW50ayhLRVJOX0RFQlVHICJzYm1hYzogY29uZmlndXJpbmcgTUFDIGF0ICVseFxuIiwgcG9ydCk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3NrZ2UuYyBiL2RyaXZlcnMvbmV0L3NrZ2UuYwppbmRleCBhNGE1OGU0Li5iMjk0OTAzIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9za2dlLmMKKysrIGIvZHJpdmVycy9uZXQvc2tnZS5jCkBAIC0xMSw4ICsxMSw3IEBACiAgKgogICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKICAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UuCiAgKgogICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgpAQCAtNDMsNyArNDIsNyBAQAogI2luY2x1ZGUgInNrZ2UuaCIKIAogI2RlZmluZSBEUlZfTkFNRQkJInNrZ2UiCi0jZGVmaW5lIERSVl9WRVJTSU9OCQkiMS44IgorI2RlZmluZSBEUlZfVkVSU0lPTgkJIjEuOSIKICNkZWZpbmUgUEZYCQkJRFJWX05BTUUgIiAiCiAKICNkZWZpbmUgREVGQVVMVF9UWF9SSU5HX1NJWkUJMTI4CkBAIC0xOTcsOCArMTk2LDggQEAKIAkJZWxzZSBpZiAoaHctPmNoaXBfaWQgPT0gQ0hJUF9JRF9ZVUtPTikKIAkJCXN1cHBvcnRlZCAmPSB+U1VQUE9SVEVEXzEwMDBiYXNlVF9IYWxmOwogCX0gZWxzZQotCQlzdXBwb3J0ZWQgPSBTVVBQT1JURURfMTAwMGJhc2VUX0Z1bGwgfCBTVVBQT1JURURfRklCUkUKLQkJCXwgU1VQUE9SVEVEX0F1dG9uZWc7CisJCXN1cHBvcnRlZCA9IFNVUFBPUlRFRF8xMDAwYmFzZVRfRnVsbCB8IFNVUFBPUlRFRF8xMDAwYmFzZVRfSGFsZgorCQkJfCBTVVBQT1JURURfRklCUkUgfCBTVVBQT1JURURfQXV0b25lZzsKIAogCXJldHVybiBzdXBwb3J0ZWQ7CiB9CkBAIC00ODcsMzEgKzQ4NiwzNyBAQAogewogCXN0cnVjdCBza2dlX3BvcnQgKnNrZ2UgPSBuZXRkZXZfcHJpdihkZXYpOwogCi0JZWNtZC0+dHhfcGF1c2UgPSAoc2tnZS0+Zmxvd19jb250cm9sID09IEZMT1dfTU9ERV9MT0NfU0VORCkKLQkJfHwgKHNrZ2UtPmZsb3dfY29udHJvbCA9PSBGTE9XX01PREVfU1lNTUVUUklDKTsKLQllY21kLT5yeF9wYXVzZSA9IChza2dlLT5mbG93X2NvbnRyb2wgPT0gRkxPV19NT0RFX1JFTV9TRU5EKQotCQl8fCAoc2tnZS0+Zmxvd19jb250cm9sID09IEZMT1dfTU9ERV9TWU1NRVRSSUMpOworCWVjbWQtPnJ4X3BhdXNlID0gKHNrZ2UtPmZsb3dfY29udHJvbCA9PSBGTE9XX01PREVfU1lNTUVUUklDKQorCQl8fCAoc2tnZS0+Zmxvd19jb250cm9sID09IEZMT1dfTU9ERV9TWU1fT1JfUkVNKTsKKwllY21kLT50eF9wYXVzZSA9IGVjbWQtPnJ4X3BhdXNlIHx8IChza2dlLT5mbG93X2NvbnRyb2wgPT0gRkxPV19NT0RFX0xPQ19TRU5EKTsKIAotCWVjbWQtPmF1dG9uZWcgPSBza2dlLT5hdXRvbmVnOworCWVjbWQtPmF1dG9uZWcgPSBlY21kLT5yeF9wYXVzZSB8fCBlY21kLT50eF9wYXVzZTsKIH0KIAogc3RhdGljIGludCBza2dlX3NldF9wYXVzZXBhcmFtKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCiAJCQkgICAgICAgc3RydWN0IGV0aHRvb2xfcGF1c2VwYXJhbSAqZWNtZCkKIHsKIAlzdHJ1Y3Qgc2tnZV9wb3J0ICpza2dlID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlzdHJ1Y3QgZXRodG9vbF9wYXVzZXBhcmFtIG9sZDsKIAotCXNrZ2UtPmF1dG9uZWcgPSBlY21kLT5hdXRvbmVnOwotCWlmIChlY21kLT5yeF9wYXVzZSAmJiBlY21kLT50eF9wYXVzZSkKLQkJc2tnZS0+Zmxvd19jb250cm9sID0gRkxPV19NT0RFX1NZTU1FVFJJQzsKLQllbHNlIGlmIChlY21kLT5yeF9wYXVzZSAmJiAhZWNtZC0+dHhfcGF1c2UpCi0JCXNrZ2UtPmZsb3dfY29udHJvbCA9IEZMT1dfTU9ERV9SRU1fU0VORDsKLQllbHNlIGlmICghZWNtZC0+cnhfcGF1c2UgJiYgZWNtZC0+dHhfcGF1c2UpCi0JCXNrZ2UtPmZsb3dfY29udHJvbCA9IEZMT1dfTU9ERV9MT0NfU0VORDsKLQllbHNlCi0JCXNrZ2UtPmZsb3dfY29udHJvbCA9IEZMT1dfTU9ERV9OT05FOworCXNrZ2VfZ2V0X3BhdXNlcGFyYW0oZGV2LCAmb2xkKTsKKworCWlmIChlY21kLT5hdXRvbmVnICE9IG9sZC5hdXRvbmVnKQorCQlza2dlLT5mbG93X2NvbnRyb2wgPSBlY21kLT5hdXRvbmVnID8gRkxPV19NT0RFX05PTkUgOiBGTE9XX01PREVfU1lNTUVUUklDOworCWVsc2UgeworCQlpZiAoZWNtZC0+cnhfcGF1c2UgJiYgZWNtZC0+dHhfcGF1c2UpCisJCQlza2dlLT5mbG93X2NvbnRyb2wgPSBGTE9XX01PREVfU1lNTUVUUklDOworCQllbHNlIGlmIChlY21kLT5yeF9wYXVzZSAmJiAhZWNtZC0+dHhfcGF1c2UpCisJCQlza2dlLT5mbG93X2NvbnRyb2wgPSBGTE9XX01PREVfU1lNX09SX1JFTTsKKwkJZWxzZSBpZiAoIWVjbWQtPnJ4X3BhdXNlICYmIGVjbWQtPnR4X3BhdXNlKQorCQkJc2tnZS0+Zmxvd19jb250cm9sID0gRkxPV19NT0RFX0xPQ19TRU5EOworCQllbHNlCisJCQlza2dlLT5mbG93X2NvbnRyb2wgPSBGTE9XX01PREVfTk9ORTsKKwl9CiAKIAlpZiAobmV0aWZfcnVubmluZyhkZXYpKQogCQlza2dlX3BoeV9yZXNldChza2dlKTsKKwogCXJldHVybiAwOwogfQogCkBAIC04NTQsNiArODU5LDIzIEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBjb25zdCBjaGFyICpza2dlX3BhdXNlKGVudW0gcGF1c2Vfc3RhdHVzIHN0YXR1cykKK3sKKwlzd2l0Y2goc3RhdHVzKSB7CisJY2FzZSBGTE9XX1NUQVRfTk9ORToKKwkJcmV0dXJuICJub25lIjsKKwljYXNlIEZMT1dfU1RBVF9SRU1fU0VORDoKKwkJcmV0dXJuICJyeCBvbmx5IjsKKwljYXNlIEZMT1dfU1RBVF9MT0NfU0VORDoKKwkJcmV0dXJuICJ0eF9vbmx5IjsKKwljYXNlIEZMT1dfU1RBVF9TWU1NRVRSSUM6CQkvKiBCb3RoIHN0YXRpb24gbWF5IHNlbmQgUEFVU0UgKi8KKwkJcmV0dXJuICJib3RoIjsKKwlkZWZhdWx0OgorCQlyZXR1cm4gImluZGV0ZXJtaW5hdGVkIjsKKwl9Cit9CisKKwogc3RhdGljIHZvaWQgc2tnZV9saW5rX3VwKHN0cnVjdCBza2dlX3BvcnQgKnNrZ2UpCiB7CiAJc2tnZV93cml0ZTgoc2tnZS0+aHcsIFNLX1JFRyhza2dlLT5wb3J0LCBMTktfTEVEX1JFRyksCkBAIC04NjIsMTYgKzg4NCwxMyBAQAogCW5ldGlmX2NhcnJpZXJfb24oc2tnZS0+bmV0ZGV2KTsKIAluZXRpZl93YWtlX3F1ZXVlKHNrZ2UtPm5ldGRldik7CiAKLQlpZiAobmV0aWZfbXNnX2xpbmsoc2tnZSkpCisJaWYgKG5ldGlmX21zZ19saW5rKHNrZ2UpKSB7CiAJCXByaW50ayhLRVJOX0lORk8gUEZYCiAJCSAgICAgICAiJXM6IExpbmsgaXMgdXAgYXQgJWQgTWJwcywgJXMgZHVwbGV4LCBmbG93IGNvbnRyb2wgJXNcbiIsCiAJCSAgICAgICBza2dlLT5uZXRkZXYtPm5hbWUsIHNrZ2UtPnNwZWVkLAogCQkgICAgICAgc2tnZS0+ZHVwbGV4ID09IERVUExFWF9GVUxMID8gImZ1bGwiIDogImhhbGYiLAotCQkgICAgICAgKHNrZ2UtPmZsb3dfY29udHJvbCA9PSBGTE9XX01PREVfTk9ORSkgPyAibm9uZSIgOgotCQkgICAgICAgKHNrZ2UtPmZsb3dfY29udHJvbCA9PSBGTE9XX01PREVfTE9DX1NFTkQpID8gInR4IG9ubHkiIDoKLQkJICAgICAgIChza2dlLT5mbG93X2NvbnRyb2wgPT0gRkxPV19NT0RFX1JFTV9TRU5EKSA/ICJyeCBvbmx5IiA6Ci0JCSAgICAgICAoc2tnZS0+Zmxvd19jb250cm9sID09IEZMT1dfTU9ERV9TWU1NRVRSSUMpID8gInR4IGFuZCByeCIgOgotCQkgICAgICAgInVua25vd24iKTsKKwkJICAgICAgIHNrZ2VfcGF1c2Uoc2tnZS0+Zmxvd19zdGF0dXMpKTsKKwl9CiB9CiAKIHN0YXRpYyB2b2lkIHNrZ2VfbGlua19kb3duKHN0cnVjdCBza2dlX3BvcnQgKnNrZ2UpCkBAIC04ODQsNiArOTAzLDI5IEBACiAJCXByaW50ayhLRVJOX0lORk8gUEZYICIlczogTGluayBpcyBkb3duLlxuIiwgc2tnZS0+bmV0ZGV2LT5uYW1lKTsKIH0KIAorCitzdGF0aWMgdm9pZCB4bV9saW5rX2Rvd24oc3RydWN0IHNrZ2VfaHcgKmh3LCBpbnQgcG9ydCkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gaHctPmRldltwb3J0XTsKKwlzdHJ1Y3Qgc2tnZV9wb3J0ICpza2dlID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl1MTYgY21kLCBtc2s7CisKKwlpZiAoaHctPnBoeV90eXBlID09IFNLX1BIWV9YTUFDKSB7CisJCW1zayA9IHhtX3JlYWQxNihodywgcG9ydCwgWE1fSU1TSyk7CisJCW1zayB8PSBYTV9JU19JTlBfQVNTIHwgWE1fSVNfTElQQV9SQyB8IFhNX0lTX1JYX1BBR0UgfCBYTV9JU19BTkQ7CisJCXhtX3dyaXRlMTYoaHcsIHBvcnQsIFhNX0lNU0ssIG1zayk7CisJfQorCisJY21kID0geG1fcmVhZDE2KGh3LCBwb3J0LCBYTV9NTVVfQ01EKTsKKwljbWQgJj0gfihYTV9NTVVfRU5BX1JYIHwgWE1fTU1VX0VOQV9UWCk7CisJeG1fd3JpdGUxNihodywgcG9ydCwgWE1fTU1VX0NNRCwgY21kKTsKKwkvKiBkdW1teSByZWFkIHRvIGVuc3VyZSB3cml0aW5nICovCisJKHZvaWQpIHhtX3JlYWQxNihodywgcG9ydCwgWE1fTU1VX0NNRCk7CisKKwlpZiAobmV0aWZfY2Fycmllcl9vayhkZXYpKQorCQlza2dlX2xpbmtfZG93bihza2dlKTsKK30KKwogc3RhdGljIGludCBfX3htX3BoeV9yZWFkKHN0cnVjdCBza2dlX2h3ICpodywgaW50IHBvcnQsIHUxNiByZWcsIHUxNiAqdmFsKQogewogCWludCBpOwpAQCAtOTkyLDcgKzEwMzQsMTUgQEAKIAlbRkxPV19NT0RFX05PTkVdID0JMCwKIAlbRkxPV19NT0RFX0xPQ19TRU5EXSA9CVBIWV9BTl9QQVVTRV9BU1lNLAogCVtGTE9XX01PREVfU1lNTUVUUklDXSA9IFBIWV9BTl9QQVVTRV9DQVAsCi0JW0ZMT1dfTU9ERV9SRU1fU0VORF0gID0gUEhZX0FOX1BBVVNFX0NBUCB8IFBIWV9BTl9QQVVTRV9BU1lNLAorCVtGTE9XX01PREVfU1lNX09SX1JFTV0gID0gUEhZX0FOX1BBVVNFX0NBUCB8IFBIWV9BTl9QQVVTRV9BU1lNLAorfTsKKworLyogc3BlY2lhbCBkZWZpbmVzIGZvciBGSUJFUiAoODhFMTAxMVMgb25seSkgKi8KK3N0YXRpYyBjb25zdCB1MTYgZmliZXJfcGF1c2VfbWFwW10gPSB7CisJW0ZMT1dfTU9ERV9OT05FXQk9IFBIWV9YX1BfTk9fUEFVU0UsCisJW0ZMT1dfTU9ERV9MT0NfU0VORF0JPSBQSFlfWF9QX0FTWU1fTUQsCisJW0ZMT1dfTU9ERV9TWU1NRVRSSUNdCT0gUEhZX1hfUF9TWU1fTUQsCisJW0ZMT1dfTU9ERV9TWU1fT1JfUkVNXQk9IFBIWV9YX1BfQk9USF9NRCwKIH07CiAKIApAQCAtMTAwOCwxNCArMTA1OCw3IEBACiAJc3RhdHVzID0geG1fcGh5X3JlYWQoaHcsIHBvcnQsIFBIWV9CQ09NX1NUQVQpOwogCiAJaWYgKChzdGF0dXMgJiBQSFlfU1RfTFNZTkMpID09IDApIHsKLQkJdTE2IGNtZCA9IHhtX3JlYWQxNihodywgcG9ydCwgWE1fTU1VX0NNRCk7Ci0JCWNtZCAmPSB+KFhNX01NVV9FTkFfUlggfCBYTV9NTVVfRU5BX1RYKTsKLQkJeG1fd3JpdGUxNihodywgcG9ydCwgWE1fTU1VX0NNRCwgY21kKTsKLQkJLyogZHVtbXkgcmVhZCB0byBlbnN1cmUgd3JpdGluZyAqLwotCQkodm9pZCkgeG1fcmVhZDE2KGh3LCBwb3J0LCBYTV9NTVVfQ01EKTsKLQotCQlpZiAobmV0aWZfY2Fycmllcl9vayhkZXYpKQotCQkJc2tnZV9saW5rX2Rvd24oc2tnZSk7CisJCXhtX2xpbmtfZG93bihodywgcG9ydCk7CiAJCXJldHVybjsKIAl9CiAKQEAgLTEwNDgsMjAgKzEwOTEsMTkgQEAKIAkJCXJldHVybjsKIAkJfQogCi0KIAkJLyogV2UgYXJlIHVzaW5nIElFRUUgODAyLjN6L0Q1LjAgVGFibGUgMzctNCAqLwogCQlzd2l0Y2ggKGF1eCAmIFBIWV9CX0FTX1BBVVNFX01TSykgewogCQljYXNlIFBIWV9CX0FTX1BBVVNFX01TSzoKLQkJCXNrZ2UtPmZsb3dfY29udHJvbCA9IEZMT1dfTU9ERV9TWU1NRVRSSUM7CisJCQlza2dlLT5mbG93X3N0YXR1cyA9IEZMT1dfU1RBVF9TWU1NRVRSSUM7CiAJCQlicmVhazsKIAkJY2FzZSBQSFlfQl9BU19QUlI6Ci0JCQlza2dlLT5mbG93X2NvbnRyb2wgPSBGTE9XX01PREVfUkVNX1NFTkQ7CisJCQlza2dlLT5mbG93X3N0YXR1cyA9IEZMT1dfU1RBVF9SRU1fU0VORDsKIAkJCWJyZWFrOwogCQljYXNlIFBIWV9CX0FTX1BSVDoKLQkJCXNrZ2UtPmZsb3dfY29udHJvbCA9IEZMT1dfTU9ERV9MT0NfU0VORDsKKwkJCXNrZ2UtPmZsb3dfc3RhdHVzID0gRkxPV19TVEFUX0xPQ19TRU5EOwogCQkJYnJlYWs7CiAJCWRlZmF1bHQ6Ci0JCQlza2dlLT5mbG93X2NvbnRyb2wgPSBGTE9XX01PREVfTk9ORTsKKwkJCXNrZ2UtPmZsb3dfc3RhdHVzID0gRkxPV19TVEFUX05PTkU7CiAJCX0KIAkJc2tnZS0+c3BlZWQgPSBTUEVFRF8xMDAwOwogCX0KQEAgLTExOTEsMTcgKzEyMzMsNyBAQAogCQlpZiAoc2tnZS0+YWR2ZXJ0aXNpbmcgJiBBRFZFUlRJU0VEXzEwMDBiYXNlVF9GdWxsKQogCQkJY3RybCB8PSBQSFlfWF9BTl9GRDsKIAotCQlzd2l0Y2goc2tnZS0+Zmxvd19jb250cm9sKSB7Ci0JCWNhc2UgRkxPV19NT0RFX05PTkU6Ci0JCQljdHJsIHw9IFBIWV9YX1BfTk9fUEFVU0U7Ci0JCQlicmVhazsKLQkJY2FzZSBGTE9XX01PREVfTE9DX1NFTkQ6Ci0JCQljdHJsIHw9IFBIWV9YX1BfQVNZTV9NRDsKLQkJCWJyZWFrOwotCQljYXNlIEZMT1dfTU9ERV9TWU1NRVRSSUM6Ci0JCQljdHJsIHw9IFBIWV9YX1BfQk9USF9NRDsKLQkJCWJyZWFrOwotCQl9CisJCWN0cmwgfD0gZmliZXJfcGF1c2VfbWFwW3NrZ2UtPmZsb3dfY29udHJvbF07CiAKIAkJeG1fcGh5X3dyaXRlKGh3LCBwb3J0LCBQSFlfWE1BQ19BVU5FX0FEViwgY3RybCk7CiAKQEAgLTEyMzUsMTQgKzEyNjcsNyBAQAogCXN0YXR1cyA9IHhtX3BoeV9yZWFkKGh3LCBwb3J0LCBQSFlfWE1BQ19TVEFUKTsKIAogCWlmICgoc3RhdHVzICYgUEhZX1NUX0xTWU5DKSA9PSAwKSB7Ci0JCXUxNiBjbWQgPSB4bV9yZWFkMTYoaHcsIHBvcnQsIFhNX01NVV9DTUQpOwotCQljbWQgJj0gfihYTV9NTVVfRU5BX1JYIHwgWE1fTU1VX0VOQV9UWCk7Ci0JCXhtX3dyaXRlMTYoaHcsIHBvcnQsIFhNX01NVV9DTUQsIGNtZCk7Ci0JCS8qIGR1bW15IHJlYWQgdG8gZW5zdXJlIHdyaXRpbmcgKi8KLQkJKHZvaWQpIHhtX3JlYWQxNihodywgcG9ydCwgWE1fTU1VX0NNRCk7Ci0KLQkJaWYgKG5ldGlmX2NhcnJpZXJfb2soZGV2KSkKLQkJCXNrZ2VfbGlua19kb3duKHNrZ2UpOworCQl4bV9saW5rX2Rvd24oaHcsIHBvcnQpOwogCQlyZXR1cm47CiAJfQogCkBAIC0xMjc2LDE1ICsxMzAxLDIwIEBACiAJCX0KIAogCQkvKiBXZSBhcmUgdXNpbmcgSUVFRSA4MDIuM3ovRDUuMCBUYWJsZSAzNy00ICovCi0JCWlmIChscGEgJiBQSFlfWF9QX1NZTV9NRCkKLQkJCXNrZ2UtPmZsb3dfY29udHJvbCA9IEZMT1dfTU9ERV9TWU1NRVRSSUM7Ci0JCWVsc2UgaWYgKChscGEgJiBQSFlfWF9SU19QQVVTRSkgPT0gUEhZX1hfUF9BU1lNX01EKQotCQkJc2tnZS0+Zmxvd19jb250cm9sID0gRkxPV19NT0RFX1JFTV9TRU5EOwotCQllbHNlIGlmICgobHBhICYgUEhZX1hfUlNfUEFVU0UpID09IFBIWV9YX1BfQk9USF9NRCkKLQkJCXNrZ2UtPmZsb3dfY29udHJvbCA9IEZMT1dfTU9ERV9MT0NfU0VORDsKKwkJaWYgKChza2dlLT5mbG93X2NvbnRyb2wgPT0gRkxPV19NT0RFX1NZTU1FVFJJQyB8fAorCQkgICAgIHNrZ2UtPmZsb3dfY29udHJvbCA9PSBGTE9XX01PREVfU1lNX09SX1JFTSkgJiYKKwkJICAgIChscGEgJiBQSFlfWF9QX1NZTV9NRCkpCisJCQlza2dlLT5mbG93X3N0YXR1cyA9IEZMT1dfU1RBVF9TWU1NRVRSSUM7CisJCWVsc2UgaWYgKHNrZ2UtPmZsb3dfY29udHJvbCA9PSBGTE9XX01PREVfU1lNX09SX1JFTSAmJgorCQkJIChscGEgJiBQSFlfWF9SU19QQVVTRSkgPT0gUEhZX1hfUF9BU1lNX01EKQorCQkJLyogRW5hYmxlIFBBVVNFIHJlY2VpdmUsIGRpc2FibGUgUEFVU0UgdHJhbnNtaXQgKi8KKwkJCXNrZ2UtPmZsb3dfc3RhdHVzICA9IEZMT1dfU1RBVF9SRU1fU0VORDsKKwkJZWxzZSBpZiAoc2tnZS0+Zmxvd19jb250cm9sID09IEZMT1dfTU9ERV9MT0NfU0VORCAmJgorCQkJIChscGEgJiBQSFlfWF9SU19QQVVTRSkgPT0gUEhZX1hfUF9CT1RIX01EKQorCQkJLyogRGlzYWJsZSBQQVVTRSByZWNlaXZlLCBlbmFibGUgUEFVU0UgdHJhbnNtaXQgKi8KKwkJCXNrZ2UtPmZsb3dfc3RhdHVzID0gRkxPV19TVEFUX0xPQ19TRU5EOwogCQllbHNlCi0JCQlza2dlLT5mbG93X2NvbnRyb2wgPSBGTE9XX01PREVfTk9ORTsKLQorCQkJc2tnZS0+Zmxvd19zdGF0dXMgPSBGTE9XX1NUQVRfTk9ORTsKIAogCQlza2dlLT5zcGVlZCA9IFNQRUVEXzEwMDA7CiAJfQpAQCAtMTU2OCw2ICsxNTk4LDEwIEBACiAJCXByaW50ayhLRVJOX0RFQlVHIFBGWCAiJXM6IG1hYyBpbnRlcnJ1cHQgc3RhdHVzIDB4JXhcbiIsCiAJCSAgICAgICBza2dlLT5uZXRkZXYtPm5hbWUsIHN0YXR1cyk7CiAKKwlpZiAoaHctPnBoeV90eXBlID09IFNLX1BIWV9YTUFDICYmCisJICAgIChzdGF0dXMgJiAoWE1fSVNfSU5QX0FTUyB8IFhNX0lTX0xJUEFfUkMpKSkKKwkJeG1fbGlua19kb3duKGh3LCBwb3J0KTsKKwogCWlmIChzdGF0dXMgJiBYTV9JU19UWEZfVVIpIHsKIAkJeG1fd3JpdGUzMihodywgcG9ydCwgWE1fTU9ERSwgWE1fTURfRlRGKTsKIAkJKytza2dlLT5uZXRfc3RhdHMudHhfZmlmb19lcnJvcnM7CkBAIC0xNTgyLDcgKzE2MTYsNyBAQAogewogCXN0cnVjdCBza2dlX2h3ICpodyA9IHNrZ2UtPmh3OwogCWludCBwb3J0ID0gc2tnZS0+cG9ydDsKLQl1MTYgY21kOworCXUxNiBjbWQsIG1zazsKIAl1MzIgbW9kZTsKIAogCWNtZCA9IHhtX3JlYWQxNihodywgcG9ydCwgWE1fTU1VX0NNRCk7CkBAIC0xNTkxLDggKzE2MjUsOCBAQAogCSAqIGVuYWJsaW5nIHBhdXNlIGZyYW1lIHJlY2VwdGlvbiBpcyByZXF1aXJlZCBmb3IgMTAwMEJUCiAJICogYmVjYXVzZSB0aGUgWE1BQyBpcyBub3QgcmVzZXQgaWYgdGhlIGxpbmsgaXMgZ29pbmcgZG93bgogCSAqLwotCWlmIChza2dlLT5mbG93X2NvbnRyb2wgPT0gRkxPV19NT0RFX05PTkUgfHwKLQkgICAgc2tnZS0+Zmxvd19jb250cm9sID09IEZMT1dfTU9ERV9MT0NfU0VORCkKKwlpZiAoc2tnZS0+Zmxvd19zdGF0dXMgPT0gRkxPV19TVEFUX05PTkUgfHwKKwkgICAgc2tnZS0+Zmxvd19zdGF0dXMgPT0gRkxPV19TVEFUX0xPQ19TRU5EKQogCQkvKiBEaXNhYmxlIFBhdXNlIEZyYW1lIFJlY2VwdGlvbiAqLwogCQljbWQgfD0gWE1fTU1VX0lHTl9QRjsKIAllbHNlCkBAIC0xNjAyLDggKzE2MzYsOCBAQAogCXhtX3dyaXRlMTYoaHcsIHBvcnQsIFhNX01NVV9DTUQsIGNtZCk7CiAKIAltb2RlID0geG1fcmVhZDMyKGh3LCBwb3J0LCBYTV9NT0RFKTsKLQlpZiAoc2tnZS0+Zmxvd19jb250cm9sID09IEZMT1dfTU9ERV9TWU1NRVRSSUMgfHwKLQkgICAgc2tnZS0+Zmxvd19jb250cm9sID09IEZMT1dfTU9ERV9MT0NfU0VORCkgeworCWlmIChza2dlLT5mbG93X3N0YXR1cz09IEZMT1dfU1RBVF9TWU1NRVRSSUMgfHwKKwkgICAgc2tnZS0+Zmxvd19zdGF0dXMgPT0gRkxPV19TVEFUX0xPQ19TRU5EKSB7CiAJCS8qCiAJCSAqIENvbmZpZ3VyZSBQYXVzZSBGcmFtZSBHZW5lcmF0aW9uCiAJCSAqIFVzZSBpbnRlcm5hbCBhbmQgZXh0ZXJuYWwgUGF1c2UgRnJhbWUgR2VuZXJhdGlvbi4KQEAgLTE2MzEsNyArMTY2NSwxMSBAQAogCX0KIAogCXhtX3dyaXRlMzIoaHcsIHBvcnQsIFhNX01PREUsIG1vZGUpOwotCXhtX3dyaXRlMTYoaHcsIHBvcnQsIFhNX0lNU0ssIFhNX0RFRl9NU0spOworCW1zayA9IFhNX0RFRl9NU0s7CisJaWYgKGh3LT5waHlfdHlwZSAhPSBTS19QSFlfWE1BQykKKwkJbXNrIHw9IFhNX0lTX0lOUF9BU1M7CS8qIGRpc2FibGUgR1AwIGludGVycnVwdCBiaXQgKi8KKworCXhtX3dyaXRlMTYoaHcsIHBvcnQsIFhNX0lNU0ssIG1zayk7CiAJeG1fcmVhZDE2KGh3LCBwb3J0LCBYTV9JU1JDKTsKIAogCS8qIGdldCBNTVUgQ29tbWFuZCBSZWcuICovCkBAIC0xNzc5LDExICsxODE3LDE3IEBACiAJCQkJYWR2IHw9IFBIWV9NX0FOXzEwX0ZEOwogCQkJaWYgKHNrZ2UtPmFkdmVydGlzaW5nICYgQURWRVJUSVNFRF8xMGJhc2VUX0hhbGYpCiAJCQkJYWR2IHw9IFBIWV9NX0FOXzEwX0hEOwotCQl9IGVsc2UJLyogc3BlY2lhbCBkZWZpbmVzIGZvciBGSUJFUiAoODhFMTAxMVMgb25seSkgKi8KLQkJCWFkdiB8PSBQSFlfTV9BTl8xMDAwWF9BSEQgfCBQSFlfTV9BTl8xMDAwWF9BRkQ7CiAKLQkJLyogU2V0IEZsb3ctY29udHJvbCBjYXBhYmlsaXRpZXMgKi8KLQkJYWR2IHw9IHBoeV9wYXVzZV9tYXBbc2tnZS0+Zmxvd19jb250cm9sXTsKKwkJCS8qIFNldCBGbG93LWNvbnRyb2wgY2FwYWJpbGl0aWVzICovCisJCQlhZHYgfD0gcGh5X3BhdXNlX21hcFtza2dlLT5mbG93X2NvbnRyb2xdOworCQl9IGVsc2UgeworCQkJaWYgKHNrZ2UtPmFkdmVydGlzaW5nICYgQURWRVJUSVNFRF8xMDAwYmFzZVRfRnVsbCkKKwkJCQlhZHYgfD0gUEhZX01fQU5fMTAwMFhfQUZEOworCQkJaWYgKHNrZ2UtPmFkdmVydGlzaW5nICYgQURWRVJUSVNFRF8xMDAwYmFzZVRfSGFsZikKKwkJCQlhZHYgfD0gUEhZX01fQU5fMTAwMFhfQUhEOworCisJCQlhZHYgfD0gZmliZXJfcGF1c2VfbWFwW3NrZ2UtPmZsb3dfY29udHJvbF07CisJCX0KIAogCQkvKiBSZXN0YXJ0IEF1dG8tbmVnb3RpYXRpb24gKi8KIAkJY3RybCB8PSBQSFlfQ1RfQU5FIHwgUEhZX0NUX1JFX0NGRzsKQEAgLTE5MTcsNiArMTk2MSwxMSBAQAogCWNhc2UgRkxPV19NT0RFX0xPQ19TRU5EOgogCQkvKiBkaXNhYmxlIFJ4IGZsb3ctY29udHJvbCAqLwogCQlyZWcgfD0gR01fR1BDUl9GQ19SWF9ESVMgfCBHTV9HUENSX0FVX0ZDVF9ESVM7CisJCWJyZWFrOworCWNhc2UgRkxPV19NT0RFX1NZTU1FVFJJQzoKKwljYXNlIEZMT1dfTU9ERV9TWU1fT1JfUkVNOgorCQkvKiBlbmFibGUgVHggJiBSeCBmbG93LWNvbnRyb2wgKi8KKwkJYnJlYWs7CiAJfQogCiAJZ21hX3dyaXRlMTYoaHcsIHBvcnQsIEdNX0dQX0NUUkwsIHJlZyk7CkBAIC0yMTExLDEzICsyMTYwLDExIEBACiAJY3RybCAmPSB+KEdNX0dQQ1JfUlhfRU5BIHwgR01fR1BDUl9UWF9FTkEpOwogCWdtYV93cml0ZTE2KGh3LCBwb3J0LCBHTV9HUF9DVFJMLCBjdHJsKTsKIAotCWlmIChza2dlLT5mbG93X2NvbnRyb2wgPT0gRkxPV19NT0RFX1JFTV9TRU5EKSB7CisJaWYgKHNrZ2UtPmZsb3dfc3RhdHVzID09IEZMT1dfU1RBVF9SRU1fU0VORCkgeworCQljdHJsID0gZ21fcGh5X3JlYWQoaHcsIHBvcnQsIFBIWV9NQVJWX0FVTkVfQURWKTsKKwkJY3RybCB8PSBQSFlfTV9BTl9BU1A7CiAJCS8qIHJlc3RvcmUgQXN5bW1ldHJpYyBQYXVzZSBiaXQgKi8KLQkJZ21fcGh5X3dyaXRlKGh3LCBwb3J0LCBQSFlfTUFSVl9BVU5FX0FEViwKLQkJCQkgIGdtX3BoeV9yZWFkKGh3LCBwb3J0LAotCQkJCQkJICAgUEhZX01BUlZfQVVORV9BRFYpCi0JCQkJICB8IFBIWV9NX0FOX0FTUCk7Ci0KKwkJZ21fcGh5X3dyaXRlKGh3LCBwb3J0LCBQSFlfTUFSVl9BVU5FX0FEViwgY3RybCk7CiAJfQogCiAJeXVrb25fcmVzZXQoaHcsIHBvcnQpOwpAQCAtMjE2NCwxOSArMjIxMSwxOSBAQAogCQkvKiBXZSBhcmUgdXNpbmcgSUVFRSA4MDIuM3ovRDUuMCBUYWJsZSAzNy00ICovCiAJCXN3aXRjaCAocGh5c3RhdCAmIFBIWV9NX1BTX1BBVVNFX01TSykgewogCQljYXNlIFBIWV9NX1BTX1BBVVNFX01TSzoKLQkJCXNrZ2UtPmZsb3dfY29udHJvbCA9IEZMT1dfTU9ERV9TWU1NRVRSSUM7CisJCQlza2dlLT5mbG93X3N0YXR1cyA9IEZMT1dfU1RBVF9TWU1NRVRSSUM7CiAJCQlicmVhazsKIAkJY2FzZSBQSFlfTV9QU19SWF9QX0VOOgotCQkJc2tnZS0+Zmxvd19jb250cm9sID0gRkxPV19NT0RFX1JFTV9TRU5EOworCQkJc2tnZS0+Zmxvd19zdGF0dXMgPSBGTE9XX1NUQVRfUkVNX1NFTkQ7CiAJCQlicmVhazsKIAkJY2FzZSBQSFlfTV9QU19UWF9QX0VOOgotCQkJc2tnZS0+Zmxvd19jb250cm9sID0gRkxPV19NT0RFX0xPQ19TRU5EOworCQkJc2tnZS0+Zmxvd19zdGF0dXMgPSBGTE9XX1NUQVRfTE9DX1NFTkQ7CiAJCQlicmVhazsKIAkJZGVmYXVsdDoKLQkJCXNrZ2UtPmZsb3dfY29udHJvbCA9IEZMT1dfTU9ERV9OT05FOworCQkJc2tnZS0+Zmxvd19zdGF0dXMgPSBGTE9XX1NUQVRfTk9ORTsKIAkJfQogCi0JCWlmIChza2dlLT5mbG93X2NvbnRyb2wgPT0gRkxPV19NT0RFX05PTkUgfHwKKwkJaWYgKHNrZ2UtPmZsb3dfc3RhdHVzID09IEZMT1dfU1RBVF9OT05FIHx8CiAJCSAgICAoc2tnZS0+c3BlZWQgPCBTUEVFRF8xMDAwICYmIHNrZ2UtPmR1cGxleCA9PSBEVVBMRVhfSEFMRikpCiAJCQlza2dlX3dyaXRlOChodywgU0tfUkVHKHBvcnQsIEdNQUNfQ1RSTCksIEdNQ19QQVVTRV9PRkYpOwogCQllbHNlCkBAIC0zMzk5LDcgKzM0NDYsNyBAQAogCiAJLyogQXV0byBzcGVlZCBhbmQgZmxvdyBjb250cm9sICovCiAJc2tnZS0+YXV0b25lZyA9IEFVVE9ORUdfRU5BQkxFOwotCXNrZ2UtPmZsb3dfY29udHJvbCA9IEZMT1dfTU9ERV9TWU1NRVRSSUM7CisJc2tnZS0+Zmxvd19jb250cm9sID0gRkxPV19NT0RFX1NZTV9PUl9SRU07CiAJc2tnZS0+ZHVwbGV4ID0gLTE7CiAJc2tnZS0+c3BlZWQgPSAtMTsKIAlza2dlLT5hZHZlcnRpc2luZyA9IHNrZ2Vfc3VwcG9ydGVkX21vZGVzKGh3KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3NrZ2UuaCBiL2RyaXZlcnMvbmV0L3NrZ2UuaAppbmRleCBkMGI0N2Q0Li41MzdjMGFhIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9za2dlLmgKKysrIGIvZHJpdmVycy9uZXQvc2tnZS5oCkBAIC0yMTk1LDcgKzIxOTUsOCBAQAogCVhNX0lTX1JYX0NPTVAJPSAxPDwwLAkvKiBCaXQgIDA6CUZyYW1lIFJ4IENvbXBsZXRlICovCiB9OwogCi0jZGVmaW5lIFhNX0RFRl9NU0sJKH4oWE1fSVNfUlhDX09WIHwgWE1fSVNfVFhDX09WIHwgWE1fSVNfUlhGX09WIHwgWE1fSVNfVFhGX1VSKSkKKyNkZWZpbmUgWE1fREVGX01TSwkofihYTV9JU19JTlBfQVNTIHwgWE1fSVNfTElQQV9SQyB8IFwKKwkJCSAgIFhNX0lTX1JYRl9PViB8IFhNX0lTX1RYRl9VUikpCiAKIAogLyoJWE1fSFdfQ0ZHCTE2IGJpdCByL3cJSGFyZHdhcmUgQ29uZmlnIFJlZ2lzdGVyICovCkBAIC0yNDI2LDEzICsyNDI3LDI0IEBACiAJc3RydWN0IG11dGV4CSAgICAgcGh5X211dGV4OwogfTsKIAotZW51bSB7Ci0JRkxPV19NT0RFX05PTkUgCQk9IDAsIC8qIE5vIEZsb3ctQ29udHJvbCAqLwotCUZMT1dfTU9ERV9MT0NfU0VORAk9IDEsIC8qIExvY2FsIHN0YXRpb24gc2VuZHMgUEFVU0UgKi8KLQlGTE9XX01PREVfUkVNX1NFTkQJPSAyLCAvKiBTeW1tZXRyaWMgb3IganVzdCByZW1vdGUgKi8KK2VudW0gcGF1c2VfY29udHJvbCB7CisJRkxPV19NT0RFX05PTkUgCQk9IDEsIC8qIE5vIEZsb3ctQ29udHJvbCAqLworCUZMT1dfTU9ERV9MT0NfU0VORAk9IDIsIC8qIExvY2FsIHN0YXRpb24gc2VuZHMgUEFVU0UgKi8KIAlGTE9XX01PREVfU1lNTUVUUklDCT0gMywgLyogQm90aCBzdGF0aW9ucyBtYXkgc2VuZCBQQVVTRSAqLworCUZMT1dfTU9ERV9TWU1fT1JfUkVNCT0gNCwgLyogQm90aCBzdGF0aW9ucyBtYXkgc2VuZCBQQVVTRSBvcgorCQkJCSAgICAgICoganVzdCB0aGUgcmVtb3RlIHN0YXRpb24gbWF5IHNlbmQgUEFVU0UKKwkJCQkgICAgICAqLwogfTsKIAorZW51bSBwYXVzZV9zdGF0dXMgeworCUZMT1dfU1RBVF9JTkRFVEVSTUlOQVRFRD0wLAkvKiBpbmRldGVybWluYXRlZCAqLworCUZMT1dfU1RBVF9OT05FLAkJCS8qIE5vIEZsb3cgQ29udHJvbCAqLworCUZMT1dfU1RBVF9SRU1fU0VORCwJCS8qIFJlbW90ZSBTdGF0aW9uIHNlbmRzIFBBVVNFICovCisJRkxPV19TVEFUX0xPQ19TRU5ELAkJLyogTG9jYWwgc3RhdGlvbiBzZW5kcyBQQVVTRSAqLworCUZMT1dfU1RBVF9TWU1NRVRSSUMsCQkvKiBCb3RoIHN0YXRpb24gbWF5IHNlbmQgUEFVU0UgKi8KK307CisKKwogc3RydWN0IHNrZ2VfcG9ydCB7CiAJdTMyCQkgICAgIG1zZ19lbmFibGU7CiAJc3RydWN0IHNrZ2VfaHcJICAgICAqaHc7CkBAIC0yNDQ1LDkgKzI0NTcsMTAgQEAKIAlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyBuZXRfc3RhdHM7CiAKIAlzdHJ1Y3Qgd29ya19zdHJ1Y3QgICBsaW5rX3RocmVhZDsKKwllbnVtIHBhdXNlX2NvbnRyb2wgICBmbG93X2NvbnRyb2w7CisJZW51bSBwYXVzZV9zdGF0dXMgICAgZmxvd19zdGF0dXM7CiAJdTgJCSAgICAgcnhfY3N1bTsKIAl1OAkJICAgICBibGlua19vbjsKLQl1OAkJICAgICBmbG93X2NvbnRyb2w7CiAJdTgJCSAgICAgd29sOwogCXU4CQkgICAgIGF1dG9uZWc7CS8qIEFVVE9ORUdfRU5BQkxFLCBBVVRPTkVHX0RJU0FCTEUgKi8KIAl1OAkJICAgICBkdXBsZXg7CS8qIERVUExFWF9IQUxGLCBEVVBMRVhfRlVMTCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvc2t5Mi5jIGIvZHJpdmVycy9uZXQvc2t5Mi5jCmluZGV4IDQ1OWM4NDUuLjE2NjE2ZjUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3NreTIuYworKysgYi9kcml2ZXJzL25ldC9za3kyLmMKQEAgLTEwLDggKzEwLDcgQEAKICAqCiAgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQogICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZS4KICAqCiAgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCkBAIC01MCw3ICs0OSw3IEBACiAjaW5jbHVkZSAic2t5Mi5oIgogCiAjZGVmaW5lIERSVl9OQU1FCQkic2t5MiIKLSNkZWZpbmUgRFJWX1ZFUlNJT04JCSIxLjkiCisjZGVmaW5lIERSVl9WRVJTSU9OCQkiMS4xMCIKICNkZWZpbmUgUEZYCQkJRFJWX05BTUUgIiAiCiAKIC8qCkBAIC05Niw5ICs5NSw5IEBACiBtb2R1bGVfcGFyYW0oZGlzYWJsZV9tc2ksIGludCwgMCk7CiBNT0RVTEVfUEFSTV9ERVNDKGRpc2FibGVfbXNpLCAiRGlzYWJsZSBNZXNzYWdlIFNpZ25hbGVkIEludGVycnVwdCAoTVNJKSIpOwogCi1zdGF0aWMgaW50IGlkbGVfdGltZW91dCA9IDEwMDsKK3N0YXRpYyBpbnQgaWRsZV90aW1lb3V0ID0gMDsKIG1vZHVsZV9wYXJhbShpZGxlX3RpbWVvdXQsIGludCwgMCk7Ci1NT0RVTEVfUEFSTV9ERVNDKGlkbGVfdGltZW91dCwgIklkbGUgdGltZW91dCB3b3JrYXJvdW5kIGZvciBsb3N0IGludGVycnVwdHMgKG1zKSIpOworTU9EVUxFX1BBUk1fREVTQyhpZGxlX3RpbWVvdXQsICJXYXRjaGRvZyB0aW1lciBmb3IgbG9zdCBpbnRlcnJ1cHRzIChtcykiKTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkIHNreTJfaWRfdGFibGVbXSA9IHsKIAl7IFBDSV9ERVZJQ0UoUENJX1ZFTkRPUl9JRF9TWVNLT05ORUNULCAweDkwMDApIH0sCkBAIC0yODQsNiArMjgzLDMxIEBACiAJZ21hX3dyaXRlMTYoaHcsIHBvcnQsIEdNX1JYX0NUUkwsIHJlZyk7CiB9CiAKKy8qIGZsb3cgY29udHJvbCB0byBhZHZlcnRpc2UgYml0cyAqLworc3RhdGljIGNvbnN0IHUxNiBjb3BwZXJfZmNfYWR2W10gPSB7CisJW0ZDX05PTkVdCT0gMCwKKwlbRkNfVFhdCQk9IFBIWV9NX0FOX0FTUCwKKwlbRkNfUlhdCQk9IFBIWV9NX0FOX1BDLAorCVtGQ19CT1RIXQk9IFBIWV9NX0FOX1BDIHwgUEhZX01fQU5fQVNQLAorfTsKKworLyogZmxvdyBjb250cm9sIHRvIGFkdmVydGlzZSBiaXRzIHdoZW4gdXNpbmcgMTAwMEJhc2VYICovCitzdGF0aWMgY29uc3QgdTE2IGZpYmVyX2ZjX2FkdltdID0geworCVtGQ19CT1RIXSA9IFBIWV9NX1BfQk9USF9NRF9YLAorCVtGQ19UWF0gICA9IFBIWV9NX1BfQVNZTV9NRF9YLAorCVtGQ19SWF0JICA9IFBIWV9NX1BfU1lNX01EX1gsCisJW0ZDX05PTkVdID0gUEhZX01fUF9OT19QQVVTRV9YLAorfTsKKworLyogZmxvdyBjb250cm9sIHRvIEdNQSBkaXNhYmxlIGJpdHMgKi8KK3N0YXRpYyBjb25zdCB1MTYgZ21fZmNfZGlzYWJsZVtdID0geworCVtGQ19OT05FXSA9IEdNX0dQQ1JfRkNfUlhfRElTIHwgR01fR1BDUl9GQ19UWF9ESVMsCisJW0ZDX1RYXQkgID0gR01fR1BDUl9GQ19SWF9ESVMsCisJW0ZDX1JYXQkgID0gR01fR1BDUl9GQ19UWF9ESVMsCisJW0ZDX0JPVEhdID0gMCwKK307CisKKwogc3RhdGljIHZvaWQgc2t5Ml9waHlfaW5pdChzdHJ1Y3Qgc2t5Ml9odyAqaHcsIHVuc2lnbmVkIHBvcnQpCiB7CiAJc3RydWN0IHNreTJfcG9ydCAqc2t5MiA9IG5ldGRldl9wcml2KGh3LT5kZXZbcG9ydF0pOwpAQCAtMzU2LDE2ICszODAsNyBAQAogCQlnbV9waHlfd3JpdGUoaHcsIHBvcnQsIFBIWV9NQVJWX0VYVF9BRFIsIHBnKTsKIAl9CiAKLQljdHJsID0gZ21fcGh5X3JlYWQoaHcsIHBvcnQsIFBIWV9NQVJWX0NUUkwpOwotCWlmIChza3kyLT5hdXRvbmVnID09IEFVVE9ORUdfRElTQUJMRSkKLQkJY3RybCAmPSB+UEhZX0NUX0FORTsKLQllbHNlCi0JCWN0cmwgfD0gUEhZX0NUX0FORTsKLQotCWN0cmwgfD0gUEhZX0NUX1JFU0VUOwotCWdtX3BoeV93cml0ZShodywgcG9ydCwgUEhZX01BUlZfQ1RSTCwgY3RybCk7Ci0KLQljdHJsID0gMDsKKwljdHJsID0gUEhZX0NUX1JFU0VUOwogCWN0MTAwMCA9IDA7CiAJYWR2ID0gUEhZX0FOX0NTTUE7CiAJcmVnID0gMDsKQEAgLTM4NCwyMCArMzk5LDE2IEBACiAJCQkJYWR2IHw9IFBIWV9NX0FOXzEwX0ZEOwogCQkJaWYgKHNreTItPmFkdmVydGlzaW5nICYgQURWRVJUSVNFRF8xMGJhc2VUX0hhbGYpCiAJCQkJYWR2IHw9IFBIWV9NX0FOXzEwX0hEOworCisJCQlhZHYgfD0gY29wcGVyX2ZjX2Fkdltza3kyLT5mbG93X21vZGVdOwogCQl9IGVsc2UgewkvKiBzcGVjaWFsIGRlZmluZXMgZm9yIEZJQkVSICg4OEUxMDQwUyBvbmx5KSAqLwogCQkJaWYgKHNreTItPmFkdmVydGlzaW5nICYgQURWRVJUSVNFRF8xMDAwYmFzZVRfRnVsbCkKIAkJCQlhZHYgfD0gUEhZX01fQU5fMTAwMFhfQUZEOwogCQkJaWYgKHNreTItPmFkdmVydGlzaW5nICYgQURWRVJUSVNFRF8xMDAwYmFzZVRfSGFsZikKIAkJCQlhZHYgfD0gUEhZX01fQU5fMTAwMFhfQUhEOwotCQl9CiAKLQkJLyogU2V0IEZsb3ctY29udHJvbCBjYXBhYmlsaXRpZXMgKi8KLQkJaWYgKHNreTItPnR4X3BhdXNlICYmIHNreTItPnJ4X3BhdXNlKQotCQkJYWR2IHw9IFBIWV9BTl9QQVVTRV9DQVA7CS8qIHN5bW1ldHJpYyAqLwotCQllbHNlIGlmIChza3kyLT5yeF9wYXVzZSAmJiAhc2t5Mi0+dHhfcGF1c2UpCi0JCQlhZHYgfD0gUEhZX0FOX1BBVVNFX0FTWU0gfCBQSFlfQU5fUEFVU0VfQ0FQOwotCQllbHNlIGlmICghc2t5Mi0+cnhfcGF1c2UgJiYgc2t5Mi0+dHhfcGF1c2UpCi0JCQlhZHYgfD0gUEhZX0FOX1BBVVNFX0FTWU07CS8qIGxvY2FsICovCisJCQlhZHYgfD0gZmliZXJfZmNfYWR2W3NreTItPmZsb3dfbW9kZV07CisJCX0KIAogCQkvKiBSZXN0YXJ0IEF1dG8tbmVnb3RpYXRpb24gKi8KIAkJY3RybCB8PSBQSFlfQ1RfQU5FIHwgUEhZX0NUX1JFX0NGRzsKQEAgLTQyMiwyNSArNDMzLDE3IEBACiAJCWlmIChza3kyLT5kdXBsZXggPT0gRFVQTEVYX0ZVTEwpIHsKIAkJCXJlZyB8PSBHTV9HUENSX0RVUF9GVUxMOwogCQkJY3RybCB8PSBQSFlfQ1RfRFVQX01EOwotCQl9IGVsc2UgaWYgKHNreTItPnNwZWVkICE9IFNQRUVEXzEwMDAgJiYgaHctPmNoaXBfaWQgIT0gQ0hJUF9JRF9ZVUtPTl9FQ19VKSB7Ci0JCQkvKiBUdXJuIG9mZiBmbG93IGNvbnRyb2wgZm9yIDEwLzEwMG1icHMgKi8KLQkJCXNreTItPnJ4X3BhdXNlID0gMDsKLQkJCXNreTItPnR4X3BhdXNlID0gMDsKLQkJfQorCQl9IGVsc2UgaWYgKHNreTItPnNwZWVkIDwgU1BFRURfMTAwMCkKKwkJCXNreTItPmZsb3dfbW9kZSA9IEZDX05PTkU7CiAKLQkJaWYgKCFza3kyLT5yeF9wYXVzZSkKLQkJCXJlZyB8PSBHTV9HUENSX0ZDX1JYX0RJUzsKIAotCQlpZiAoIXNreTItPnR4X3BhdXNlKQotCQkJcmVnIHw9IEdNX0dQQ1JfRkNfVFhfRElTOworIAkJcmVnIHw9IGdtX2ZjX2Rpc2FibGVbc2t5Mi0+Zmxvd19tb2RlXTsKIAogCQkvKiBGb3J3YXJkIHBhdXNlIHBhY2tldHMgdG8gR01BQz8gKi8KLQkJaWYgKHNreTItPnR4X3BhdXNlIHx8IHNreTItPnJ4X3BhdXNlKQorCQlpZiAoc2t5Mi0+Zmxvd19tb2RlICYgRkNfUlgpCiAJCQlza3kyX3dyaXRlOChodywgU0tfUkVHKHBvcnQsIEdNQUNfQ1RSTCksIEdNQ19QQVVTRV9PTik7CiAJCWVsc2UKIAkJCXNreTJfd3JpdGU4KGh3LCBTS19SRUcocG9ydCwgR01BQ19DVFJMKSwgR01DX1BBVVNFX09GRik7Ci0KLQkJY3RybCB8PSBQSFlfQ1RfUkVTRVQ7CiAJfQogCiAJZ21hX3dyaXRlMTYoaHcsIHBvcnQsIEdNX0dQX0NUUkwsIHJlZyk7CkBAIC02ODMsNyArNjg2LDcgQEAKIAlza3kyX3dyaXRlMTYoaHcsIFNLX1JFRyhwb3J0LCBUWF9HTUZfQ1RSTF9UKSwgR01GX09QRVJfT04pOwogCiAJaWYgKGh3LT5jaGlwX2lkID09IENISVBfSURfWVVLT05fRUNfVSkgewotCQlza3kyX3dyaXRlOChodywgU0tfUkVHKHBvcnQsIFJYX0dNRl9MUF9USFIpLCA3NjgvOCk7CisJCXNreTJfd3JpdGU4KGh3LCBTS19SRUcocG9ydCwgUlhfR01GX0xQX1RIUiksIDUxMi84KTsKIAkJc2t5Ml93cml0ZTgoaHcsIFNLX1JFRyhwb3J0LCBSWF9HTUZfVVBfVEhSKSwgMTAyNC84KTsKIAkJaWYgKGh3LT5kZXZbcG9ydF0tPm10dSA+IEVUSF9EQVRBX0xFTikgewogCQkJLyogc2V0IFR4IEdNQUMgRklGTyBBbG1vc3QgRW1wdHkgVGhyZXNob2xkICovCkBAIC02OTUsMTYgKzY5OCwxMCBAQAogCiB9CiAKLS8qIEFzc2lnbiBSYW0gQnVmZmVyIGFsbG9jYXRpb24uCi0gKiBzdGFydCBhbmQgZW5kIGFyZSBpbiB1bml0cyBvZiA0ayBieXRlcwotICogcmFtIHJlZ2lzdGVycyBhcmUgaW4gdW5pdHMgb2YgNjRiaXQgd29yZHMKLSAqLwotc3RhdGljIHZvaWQgc2t5Ml9yYW1zZXQoc3RydWN0IHNreTJfaHcgKmh3LCB1MTYgcSwgdTggc3RhcnRrLCB1OCBlbmRrKQorLyogQXNzaWduIFJhbSBCdWZmZXIgYWxsb2NhdGlvbiBpbiB1bml0cyBvZiA2NGJpdCAoOCBieXRlcykgKi8KK3N0YXRpYyB2b2lkIHNreTJfcmFtc2V0KHN0cnVjdCBza3kyX2h3ICpodywgdTE2IHEsIHUzMiBzdGFydCwgdTMyIGVuZCkKIHsKLQl1MzIgc3RhcnQsIGVuZDsKLQotCXN0YXJ0ID0gc3RhcnRrICogNDA5Ni84OwotCWVuZCA9IChlbmRrICogNDA5Ni84KSAtIDE7CisJcHJfZGVidWcoUEZYICJxICVkICUjeCAlI3hcbiIsIHEsIHN0YXJ0LCBlbmQpOwogCiAJc2t5Ml93cml0ZTgoaHcsIFJCX0FERFIocSwgUkJfQ1RSTCksIFJCX1JTVF9DTFIpOwogCXNreTJfd3JpdGUzMihodywgUkJfQUREUihxLCBSQl9TVEFSVCksIHN0YXJ0KTsKQEAgLTcxMyw3ICs3MTAsNyBAQAogCXNreTJfd3JpdGUzMihodywgUkJfQUREUihxLCBSQl9SUCksIHN0YXJ0KTsKIAogCWlmIChxID09IFFfUjEgfHwgcSA9PSBRX1IyKSB7Ci0JCXUzMiBzcGFjZSA9IChlbmRrIC0gc3RhcnRrKSAqIDQwOTYvODsKKwkJdTMyIHNwYWNlID0gZW5kIC0gc3RhcnQgKyAxOwogCQl1MzIgdHAgPSBzcGFjZSAtIHNwYWNlLzQ7CiAKIAkJLyogT24gcmVjZWl2ZSBxdWV1ZSdzIHNldCB0aGUgdGhyZXNob2xkcwpAQCAtMTE5NSwxOSArMTE5MiwxNiBAQAogCiAJc2t5Ml9tYWNfaW5pdChodywgcG9ydCk7CiAKLQkvKiBEZXRlcm1pbmUgYXZhaWxhYmxlIHJhbSBidWZmZXIgc3BhY2UgKGluIDRLIGJsb2NrcykuCi0JICogTm90ZTogbm90IHN1cmUgYWJvdXQgdGhlIEZFIHNldHRpbmcgYmVsb3cgeWV0Ci0JICovCi0JaWYgKGh3LT5jaGlwX2lkID09IENISVBfSURfWVVLT05fRkUpCi0JCXJhbXNpemUgPSA0OworCS8qIERldGVybWluZSBhdmFpbGFibGUgcmFtIGJ1ZmZlciBzcGFjZSBpbiBxd29yZHMuICAqLworCXJhbXNpemUgPSBza3kyX3JlYWQ4KGh3LCBCMl9FXzApICogNDA5Ni84OworCisJaWYgKHJhbXNpemUgPiA2KjEwMjQvOCkKKwkJcnhzcGFjZSA9IHJhbXNpemUgLSAocmFtc2l6ZSArIDIpIC8gMzsKIAllbHNlCi0JCXJhbXNpemUgPSBza3kyX3JlYWQ4KGh3LCBCMl9FXzApOworCQlyeHNwYWNlID0gcmFtc2l6ZSAvIDI7CiAKLQkvKiBHaXZlIHRyYW5zbWl0dGVyIG9uZSB0aGlyZCAocm91bmRlZCB1cCkgKi8KLQlyeHNwYWNlID0gcmFtc2l6ZSAtIChyYW1zaXplICsgMikgLyAzOwotCi0Jc2t5Ml9yYW1zZXQoaHcsIHJ4cWFkZHJbcG9ydF0sIDAsIHJ4c3BhY2UpOwotCXNreTJfcmFtc2V0KGh3LCB0eHFhZGRyW3BvcnRdLCByeHNwYWNlLCByYW1zaXplKTsKKwlza3kyX3JhbXNldChodywgcnhxYWRkcltwb3J0XSwgMCwgcnhzcGFjZS0xKTsKKwlza3kyX3JhbXNldChodywgdHhxYWRkcltwb3J0XSwgcnhzcGFjZSwgcmFtc2l6ZS0xKTsKIAogCS8qIE1ha2Ugc3VyZSBTeW5jUSBpcyBkaXNhYmxlZCAqLwogCXNreTJfd3JpdGU4KGh3LCBSQl9BRERSKHBvcnQgPT0gMCA/IFFfWFMxIDogUV9YUzIsIFJCX0NUUkwpLApAQCAtMTQ5OSw2ICsxNDkzLDExIEBACiAJLyogU3RvcCBtb3JlIHBhY2tldHMgZnJvbSBiZWluZyBxdWV1ZWQgKi8KIAluZXRpZl9zdG9wX3F1ZXVlKGRldik7CiAKKwkvKiBEaXNhYmxlIHBvcnQgSVJRICovCisJaW1hc2sgPSBza3kyX3JlYWQzMihodywgQjBfSU1TSyk7CisJaW1hc2sgJj0gfnBvcnRpcnFfbXNrW3BvcnRdOworCXNreTJfd3JpdGUzMihodywgQjBfSU1TSywgaW1hc2spOworCiAJc2t5Ml9nbWFjX3Jlc2V0KGh3LCBwb3J0KTsKIAogCS8qIFN0b3AgdHJhbnNtaXR0ZXIgKi8KQEAgLTE1NDksMTEgKzE1NDgsNiBAQAogCXNreTJfd3JpdGU4KGh3LCBTS19SRUcocG9ydCwgUlhfR01GX0NUUkxfVCksIEdNRl9SU1RfU0VUKTsKIAlza3kyX3dyaXRlOChodywgU0tfUkVHKHBvcnQsIFRYX0dNRl9DVFJMX1QpLCBHTUZfUlNUX1NFVCk7CiAKLQkvKiBEaXNhYmxlIHBvcnQgSVJRICovCi0JaW1hc2sgPSBza3kyX3JlYWQzMihodywgQjBfSU1TSyk7Ci0JaW1hc2sgJj0gfnBvcnRpcnFfbXNrW3BvcnRdOwotCXNreTJfd3JpdGUzMihodywgQjBfSU1TSywgaW1hc2spOwotCiAJc2t5Ml9waHlfcG93ZXIoaHcsIHBvcnQsIDApOwogCiAJLyogdHVybiBvZmYgTEVEJ3MgKi8KQEAgLTE2MDUsNiArMTU5OSwxMiBAQAogCXN0cnVjdCBza3kyX2h3ICpodyA9IHNreTItPmh3OwogCXVuc2lnbmVkIHBvcnQgPSBza3kyLT5wb3J0OwogCXUxNiByZWc7CisJc3RhdGljIGNvbnN0IGNoYXIgKmZjX25hbWVbXSA9IHsKKwkJW0ZDX05PTkVdCT0gIm5vbmUiLAorCQlbRkNfVFhdCQk9ICJ0eCIsCisJCVtGQ19SWF0JCT0gInJ4IiwKKwkJW0ZDX0JPVEhdCT0gImJvdGgiLAorCX07CiAKIAkvKiBlbmFibGUgUngvVHggKi8KIAlyZWcgPSBnbWFfcmVhZDE2KGh3LCBwb3J0LCBHTV9HUF9DVFJMKTsKQEAgLTE2NDgsOCArMTY0OCw3IEBACiAJCSAgICAgICAiJXM6IExpbmsgaXMgdXAgYXQgJWQgTWJwcywgJXMgZHVwbGV4LCBmbG93IGNvbnRyb2wgJXNcbiIsCiAJCSAgICAgICBza3kyLT5uZXRkZXYtPm5hbWUsIHNreTItPnNwZWVkLAogCQkgICAgICAgc2t5Mi0+ZHVwbGV4ID09IERVUExFWF9GVUxMID8gImZ1bGwiIDogImhhbGYiLAotCQkgICAgICAgKHNreTItPnR4X3BhdXNlICYmIHNreTItPnJ4X3BhdXNlKSA/ICJib3RoIiA6Ci0JCSAgICAgICBza3kyLT50eF9wYXVzZSA/ICJ0eCIgOiBza3kyLT5yeF9wYXVzZSA/ICJyeCIgOiAibm9uZSIpOworCQkgICAgICAgZmNfbmFtZVtza3kyLT5mbG93X3N0YXR1c10pOwogfQogCiBzdGF0aWMgdm9pZCBza3kyX2xpbmtfZG93bihzdHJ1Y3Qgc2t5Ml9wb3J0ICpza3kyKQpAQCAtMTY2NCw3ICsxNjYzLDcgQEAKIAlyZWcgJj0gfihHTV9HUENSX1JYX0VOQSB8IEdNX0dQQ1JfVFhfRU5BKTsKIAlnbWFfd3JpdGUxNihodywgcG9ydCwgR01fR1BfQ1RSTCwgcmVnKTsKIAotCWlmIChza3kyLT5yeF9wYXVzZSAmJiAhc2t5Mi0+dHhfcGF1c2UpIHsKKwlpZiAoc2t5Mi0+Zmxvd19zdGF0dXMgPT0gRkNfUlgpIHsKIAkJLyogcmVzdG9yZSBBc3ltbWV0cmljIFBhdXNlIGJpdCAqLwogCQlnbV9waHlfd3JpdGUoaHcsIHBvcnQsIFBIWV9NQVJWX0FVTkVfQURWLAogCQkJICAgICBnbV9waHlfcmVhZChodywgcG9ydCwgUEhZX01BUlZfQVVORV9BRFYpCkBAIC0xNjgzLDYgKzE2ODIsMTQgQEAKIAlza3kyX3BoeV9pbml0KGh3LCBwb3J0KTsKIH0KIAorc3RhdGljIGVudW0gZmxvd19jb250cm9sIHNreTJfZmxvdyhpbnQgcngsIGludCB0eCkKK3sKKwlpZiAocngpCisJCXJldHVybiB0eCA/IEZDX0JPVEggOiBGQ19SWDsKKwllbHNlCisJCXJldHVybiB0eCA/IEZDX1RYIDogRkNfTk9ORTsKK30KKwogc3RhdGljIGludCBza3kyX2F1dG9uZWdfZG9uZShzdHJ1Y3Qgc2t5Ml9wb3J0ICpza3kyLCB1MTYgYXV4KQogewogCXN0cnVjdCBza3kyX2h3ICpodyA9IHNreTItPmh3OwpAQCAtMTcwMywzOSArMTcxMCwyMCBAQAogCX0KIAogCXNreTItPnNwZWVkID0gc2t5Ml9waHlfc3BlZWQoaHcsIGF1eCk7Ci0JaWYgKHNreTItPnNwZWVkID09IFNQRUVEXzEwMDApIHsKLQkJdTE2IGN0bDIgPSBnbV9waHlfcmVhZChodywgcG9ydCwgUEhZX01BUlZfMTAwMFRfQ1RSTCk7Ci0JCXUxNiBscGEyID0gZ21fcGh5X3JlYWQoaHcsIHBvcnQsIFBIWV9NQVJWXzEwMDBUX1NUQVQpOwotCQlpZiAobHBhMiAgJiBQSFlfQl8xMDAwU19NU0YpIHsKLQkJCXByaW50ayhLRVJOX0VSUiBQRlggIiVzOiBtYXN0ZXIvc2xhdmUgZmF1bHQiLAotCQkJICAgICAgIHNreTItPm5ldGRldi0+bmFtZSk7Ci0JCQlyZXR1cm4gLTE7Ci0JCX0KLQotCQlpZiAoKGN0bDIgJiBQSFlfTV8xMDAwQ19BRkQpICYmIChscGEyICYgUEhZX0JfMTAwMFNfTFBfRkQpKQotCQkJc2t5Mi0+ZHVwbGV4ID0gRFVQTEVYX0ZVTEw7Ci0JCWVsc2UKLQkJCXNreTItPmR1cGxleCA9IERVUExFWF9IQUxGOwotCX0gZWxzZSB7Ci0JCXUxNiBhZHYgPSBnbV9waHlfcmVhZChodywgcG9ydCwgUEhZX01BUlZfQVVORV9BRFYpOwotCQlpZiAoKGF1eCAmIGFkdikgJiBQSFlfQU5fRlVMTCkKLQkJCXNreTItPmR1cGxleCA9IERVUExFWF9GVUxMOwotCQllbHNlCi0JCQlza3kyLT5kdXBsZXggPSBEVVBMRVhfSEFMRjsKLQl9CisJc2t5Mi0+ZHVwbGV4ID0gKGF1eCAmIFBIWV9NX1BTX0ZVTExfRFVQKSA/IERVUExFWF9GVUxMIDogRFVQTEVYX0hBTEY7CiAKIAkvKiBQYXVzZSBiaXRzIGFyZSBvZmZzZXQgKDkuLjgpICovCiAJaWYgKGh3LT5jaGlwX2lkID09IENISVBfSURfWVVLT05fWEwgfHwgaHctPmNoaXBfaWQgPT0gQ0hJUF9JRF9ZVUtPTl9FQ19VKQogCQlhdXggPj49IDY7CiAKLQlza3kyLT5yeF9wYXVzZSA9IChhdXggJiBQSFlfTV9QU19SWF9QX0VOKSAhPSAwOwotCXNreTItPnR4X3BhdXNlID0gKGF1eCAmIFBIWV9NX1BTX1RYX1BfRU4pICE9IDA7CisJc2t5Mi0+Zmxvd19zdGF0dXMgPSBza3kyX2Zsb3coYXV4ICYgUEhZX01fUFNfUlhfUF9FTiwKKwkJCQkgICAgICBhdXggJiBQSFlfTV9QU19UWF9QX0VOKTsKIAotCWlmIChza3kyLT5kdXBsZXggPT0gRFVQTEVYX0hBTEYgJiYgc2t5Mi0+c3BlZWQgIT0gU1BFRURfMTAwMAorCWlmIChza3kyLT5kdXBsZXggPT0gRFVQTEVYX0hBTEYgJiYgc2t5Mi0+c3BlZWQgPCBTUEVFRF8xMDAwCiAJICAgICYmIGh3LT5jaGlwX2lkICE9IENISVBfSURfWVVLT05fRUNfVSkKLQkJc2t5Mi0+cnhfcGF1c2UgPSBza3kyLT50eF9wYXVzZSA9IDA7CisJCXNreTItPmZsb3dfc3RhdHVzID0gRkNfTk9ORTsKIAotCWlmIChza3kyLT5yeF9wYXVzZSB8fCBza3kyLT50eF9wYXVzZSkKKwlpZiAoYXV4ICYgUEhZX01fUFNfUlhfUF9FTikKIAkJc2t5Ml93cml0ZTgoaHcsIFNLX1JFRyhwb3J0LCBHTUFDX0NUUkwpLCBHTUNfUEFVU0VfT04pOwogCWVsc2UKIAkJc2t5Ml93cml0ZTgoaHcsIFNLX1JFRyhwb3J0LCBHTUFDX0NUUkwpLCBHTUNfUEFVU0VfT0ZGKTsKQEAgLTE3NTAsMTMgKzE3MzgsMTMgQEAKIAlzdHJ1Y3Qgc2t5Ml9wb3J0ICpza3kyID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAl1MTYgaXN0YXR1cywgcGh5c3RhdDsKIAorCWlmICghbmV0aWZfcnVubmluZyhkZXYpKQorCQlyZXR1cm47CisKIAlzcGluX2xvY2soJnNreTItPnBoeV9sb2NrKTsKIAlpc3RhdHVzID0gZ21fcGh5X3JlYWQoaHcsIHBvcnQsIFBIWV9NQVJWX0lOVF9TVEFUKTsKIAlwaHlzdGF0ID0gZ21fcGh5X3JlYWQoaHcsIHBvcnQsIFBIWV9NQVJWX1BIWV9TVEFUKTsKIAotCWlmICghbmV0aWZfcnVubmluZyhkZXYpKQotCQlnb3RvIG91dDsKLQogCWlmIChuZXRpZl9tc2dfaW50cihza3kyKSkKIAkJcHJpbnRrKEtFUk5fSU5GTyBQRlggIiVzOiBwaHkgaW50ZXJydXB0IHN0YXR1cyAweCV4IDB4JXhcbiIsCiAJCSAgICAgICBza3kyLT5uZXRkZXYtPm5hbWUsIGlzdGF0dXMsIHBoeXN0YXQpOwpAQCAtMTkwNyw3ICsxODk1LDcgQEAKIAkJcGNpX2RtYV9zeW5jX3NpbmdsZV9mb3JfZGV2aWNlKHNreTItPmh3LT5wZGV2LCByZS0+ZGF0YV9hZGRyLAogCQkJCQkgICAgICAgbGVuZ3RoLCBQQ0lfRE1BX0ZST01ERVZJQ0UpOwogCQlyZS0+c2tiLT5pcF9zdW1tZWQgPSBDSEVDS1NVTV9OT05FOwotCQlfX3NrYl9wdXQoc2tiLCBsZW5ndGgpOworCQlza2JfcHV0KHNrYiwgbGVuZ3RoKTsKIAl9CiAJcmV0dXJuIHNrYjsKIH0KQEAgLTE5NzAsNyArMTk1OCw3IEBACiAJaWYgKHNrYl9zaGluZm8oc2tiKS0+bnJfZnJhZ3MpCiAJCXNrYl9wdXRfZnJhZ3Moc2tiLCBoZHJfc3BhY2UsIGxlbmd0aCk7CiAJZWxzZQotCQlza2JfcHV0KHNrYiwgaGRyX3NwYWNlKTsKKwkJc2tiX3B1dChza2IsIGxlbmd0aCk7CiAJcmV0dXJuIHNrYjsKIH0KIApAQCAtMjAxNiw2ICsyMDA0LDEwIEBACiAKIGVycm9yOgogCSsrc2t5Mi0+bmV0X3N0YXRzLnJ4X2Vycm9yczsKKwlpZiAoc3RhdHVzICYgR01SX0ZTX1JYX0ZGX09WKSB7CisJCXNreTItPm5ldF9zdGF0cy5yeF9maWZvX2Vycm9ycysrOworCQlnb3RvIHJlc3VibWl0OworCX0KIAogCWlmIChuZXRpZl9tc2dfcnhfZXJyKHNreTIpICYmIG5ldF9yYXRlbGltaXQoKSkKIAkJcHJpbnRrKEtFUk5fSU5GTyBQRlggIiVzOiByeCBlcnJvciwgc3RhdHVzIDB4JXggbGVuZ3RoICVkXG4iLApAQCAtMjAyNyw4ICsyMDE5LDYgQEAKIAkJc2t5Mi0+bmV0X3N0YXRzLnJ4X2ZyYW1lX2Vycm9ycysrOwogCWlmIChzdGF0dXMgJiBHTVJfRlNfQ1JDX0VSUikKIAkJc2t5Mi0+bmV0X3N0YXRzLnJ4X2NyY19lcnJvcnMrKzsKLQlpZiAoc3RhdHVzICYgR01SX0ZTX1JYX0ZGX09WKQotCQlza3kyLT5uZXRfc3RhdHMucnhfZmlmb19lcnJvcnMrKzsKIAogCWdvdG8gcmVzdWJtaXQ7CiB9CkBAIC0yMjIwLDggKzIyMTAsNyBAQAogCQkvKiBQQ0ktRXhwcmVzcyB1bmNvcnJlY3RhYmxlIEVycm9yIG9jY3VycmVkICovCiAJCXUzMiBwZXhfZXJyOwogCi0JCXBleF9lcnIgPSBza3kyX3BjaV9yZWFkMzIoaHcsCi0JCQkJCSAgaHctPmVycl9jYXAgKyBQQ0lfRVJSX1VOQ09SX1NUQVRVUyk7CisJCXBleF9lcnIgPSBza3kyX3BjaV9yZWFkMzIoaHcsIFBFWF9VTkNfRVJSX1NUQVQpOwogCiAJCWlmIChuZXRfcmF0ZWxpbWl0KCkpCiAJCQlwcmludGsoS0VSTl9FUlIgUEZYICIlczogcGNpIGV4cHJlc3MgZXJyb3IgKDB4JXgpXG4iLApAQCAtMjIyOSwyMCArMjIxOCwxNSBAQAogCiAJCS8qIGNsZWFyIHRoZSBpbnRlcnJ1cHQgKi8KIAkJc2t5Ml93cml0ZTMyKGh3LCBCMl9UU1RfQ1RSTDEsIFRTVF9DRkdfV1JJVEVfT04pOwotCQlza3kyX3BjaV93cml0ZTMyKGh3LAotCQkJCSBody0+ZXJyX2NhcCArIFBDSV9FUlJfVU5DT1JfU1RBVFVTLAotCQkJCSAweGZmZmZmZmZmVUwpOworCQlza3kyX3BjaV93cml0ZTMyKGh3LCBQRVhfVU5DX0VSUl9TVEFULAorCQkJCSAgICAgICAweGZmZmZmZmZmVUwpOwogCQlza3kyX3dyaXRlMzIoaHcsIEIyX1RTVF9DVFJMMSwgVFNUX0NGR19XUklURV9PRkYpOwogCi0KLQkJLyogSW4gY2FzZSBvZiBmYXRhbCBlcnJvciBtYXNrIG9mZiB0byBrZWVwIGZyb20gZ2V0dGluZyBzdHVjayAqLwotCQlpZiAocGV4X2VyciAmIChQQ0lfRVJSX1VOQ19QT0lTT05fVExQIHwgUENJX0VSUl9VTkNfRkNQCi0JCQkgICAgICAgfCBQQ0lfRVJSX1VOQ19ETFApKSB7CisJCWlmIChwZXhfZXJyICYgUEVYX0ZBVEFMX0VSUk9SUykgewogCQkJdTMyIGh3bXNrID0gc2t5Ml9yZWFkMzIoaHcsIEIwX0hXRV9JTVNLKTsKIAkJCWh3bXNrICY9IH5ZMl9JU19QQ0lfRVhQOwogCQkJc2t5Ml93cml0ZTMyKGh3LCBCMF9IV0VfSU1TSywgaHdtc2spOwogCQl9Ci0KIAl9CiAKIAlpZiAoc3RhdHVzICYgWTJfSFdFX0wxX01BU0spCkBAIC0yNDIzLDcgKzI0MDcsNiBAQAogCXUxNiBzdGF0dXM7CiAJdTggdDg7CiAJaW50IGk7Ci0JdTMyIG1zazsKIAogCXNreTJfd3JpdGU4KGh3LCBCMF9DVFNULCBDU19SU1RfQ0xSKTsKIApAQCAtMjQ2NCwxMyArMjQ0Nyw5IEBACiAJc2t5Ml93cml0ZTgoaHcsIEIwX0NUU1QsIENTX01SU1RfQ0xSKTsKIAogCS8qIGNsZWFyIGFueSBQRVggZXJyb3JzICovCi0JaWYgKHBjaV9maW5kX2NhcGFiaWxpdHkoaHctPnBkZXYsIFBDSV9DQVBfSURfRVhQKSkgewotCQlody0+ZXJyX2NhcCA9IHBjaV9maW5kX2V4dF9jYXBhYmlsaXR5KGh3LT5wZGV2LCBQQ0lfRVhUX0NBUF9JRF9FUlIpOwotCQlpZiAoaHctPmVycl9jYXApCi0JCQlza3kyX3BjaV93cml0ZTMyKGh3LAotCQkJCQkgaHctPmVycl9jYXAgKyBQQ0lfRVJSX1VOQ09SX1NUQVRVUywKLQkJCQkJIDB4ZmZmZmZmZmZVTCk7Ci0JfQorCWlmIChwY2lfZmluZF9jYXBhYmlsaXR5KGh3LT5wZGV2LCBQQ0lfQ0FQX0lEX0VYUCkpCisJCXNreTJfcGNpX3dyaXRlMzIoaHcsIFBFWF9VTkNfRVJSX1NUQVQsIDB4ZmZmZmZmZmZVTCk7CisKIAogCWh3LT5wbWRfdHlwZSA9IHNreTJfcmVhZDgoaHcsIEIyX1BNRF9UWVApOwogCWh3LT5wb3J0cyA9IDE7CkBAIC0yNTI3LDEwICsyNTA2LDcgQEAKIAkJc2t5Ml93cml0ZTgoaHcsIFJBTV9CVUZGRVIoaSwgQjNfUklfUlRPX1hTMiksIFNLX1JJX1RPXzUzKTsKIAl9CiAKLQltc2sgPSBZMl9IV0VfQUxMX01BU0s7Ci0JaWYgKCFody0+ZXJyX2NhcCkKLQkJbXNrICY9IH5ZMl9JU19QQ0lfRVhQOwotCXNreTJfd3JpdGUzMihodywgQjBfSFdFX0lNU0ssIG1zayk7CisJc2t5Ml93cml0ZTMyKGh3LCBCMF9IV0VfSU1TSywgWTJfSFdFX0FMTF9NQVNLKTsKIAogCWZvciAoaSA9IDA7IGkgPCBody0+cG9ydHM7IGkrKykKIAkJc2t5Ml9nbWFjX3Jlc2V0KGh3LCBpKTsKQEAgLTI3NjIsNyArMjczOCw3IEBACiB7CiAJc3RydWN0IHNreTJfcG9ydCAqc2t5MiA9IG5ldGRldl9wcml2KGRldik7CiAKLQlpZiAoc2t5Mi0+YXV0b25lZyAhPSBBVVRPTkVHX0VOQUJMRSkKKwlpZiAoIW5ldGlmX3J1bm5pbmcoZGV2KSB8fCBza3kyLT5hdXRvbmVnICE9IEFVVE9ORUdfRU5BQkxFKQogCQlyZXR1cm4gLUVJTlZBTDsKIAogCXNreTJfcGh5X3JlaW5pdChza3kyKTsKQEAgLTI4NjQsNiArMjg0MCwxNCBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgdm9pZCBpbmxpbmUgc2t5Ml9hZGRfZmlsdGVyKHU4IGZpbHRlcls4XSwgY29uc3QgdTggKmFkZHIpCit7CisJdTMyIGJpdDsKKworCWJpdCA9IGV0aGVyX2NyYyhFVEhfQUxFTiwgYWRkcikgJiA2MzsKKwlmaWx0ZXJbYml0ID4+IDNdIHw9IDEgPDwgKGJpdCAmIDcpOworfQorCiBzdGF0aWMgdm9pZCBza3kyX3NldF9tdWx0aWNhc3Qoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKIHsKIAlzdHJ1Y3Qgc2t5Ml9wb3J0ICpza3kyID0gbmV0ZGV2X3ByaXYoZGV2KTsKQEAgLTI4NzIsNyArMjg1NiwxMCBAQAogCXN0cnVjdCBkZXZfbWNfbGlzdCAqbGlzdCA9IGRldi0+bWNfbGlzdDsKIAl1MTYgcmVnOwogCXU4IGZpbHRlcls4XTsKKwlpbnQgcnhfcGF1c2U7CisJc3RhdGljIGNvbnN0IHU4IHBhdXNlX21jX2FkZHJbRVRIX0FMRU5dID0geyAweDEsIDB4ODAsIDB4YzIsIDB4MCwgMHgwLCAweDEgfTsKIAorCXJ4X3BhdXNlID0gKHNreTItPmZsb3dfc3RhdHVzID09IEZDX1JYIHx8IHNreTItPmZsb3dfc3RhdHVzID09IEZDX0JPVEgpOwogCW1lbXNldChmaWx0ZXIsIDAsIHNpemVvZihmaWx0ZXIpKTsKIAogCXJlZyA9IGdtYV9yZWFkMTYoaHcsIHBvcnQsIEdNX1JYX0NUUkwpOwpAQCAtMjg4MCwxOCArMjg2NywxOSBAQAogCiAJaWYgKGRldi0+ZmxhZ3MgJiBJRkZfUFJPTUlTQykJLyogcHJvbWlzY3VvdXMgKi8KIAkJcmVnICY9IH4oR01fUlhDUl9VQ0ZfRU5BIHwgR01fUlhDUl9NQ0ZfRU5BKTsKLQllbHNlIGlmICgoZGV2LT5mbGFncyAmIElGRl9BTExNVUxUSSkgfHwgZGV2LT5tY19jb3VudCA+IDE2KQkvKiBhbGwgbXVsdGljYXN0ICovCisJZWxzZSBpZiAoZGV2LT5mbGFncyAmIElGRl9BTExNVUxUSSkKIAkJbWVtc2V0KGZpbHRlciwgMHhmZiwgc2l6ZW9mKGZpbHRlcikpOwotCWVsc2UgaWYgKGRldi0+bWNfY291bnQgPT0gMCkJLyogbm8gbXVsdGljYXN0ICovCisJZWxzZSBpZiAoZGV2LT5tY19jb3VudCA9PSAwICYmICFyeF9wYXVzZSkKIAkJcmVnICY9IH5HTV9SWENSX01DRl9FTkE7CiAJZWxzZSB7CiAJCWludCBpOwogCQlyZWcgfD0gR01fUlhDUl9NQ0ZfRU5BOwogCi0JCWZvciAoaSA9IDA7IGxpc3QgJiYgaSA8IGRldi0+bWNfY291bnQ7IGkrKywgbGlzdCA9IGxpc3QtPm5leHQpIHsKLQkJCXUzMiBiaXQgPSBldGhlcl9jcmMoRVRIX0FMRU4sIGxpc3QtPmRtaV9hZGRyKSAmIDB4M2Y7Ci0JCQlmaWx0ZXJbYml0IC8gOF0gfD0gMSA8PCAoYml0ICUgOCk7Ci0JCX0KKwkJaWYgKHJ4X3BhdXNlKQorCQkJc2t5Ml9hZGRfZmlsdGVyKGZpbHRlciwgcGF1c2VfbWNfYWRkcik7CisKKwkJZm9yIChpID0gMDsgbGlzdCAmJiBpIDwgZGV2LT5tY19jb3VudDsgaSsrLCBsaXN0ID0gbGlzdC0+bmV4dCkKKwkJCXNreTJfYWRkX2ZpbHRlcihmaWx0ZXIsIGxpc3QtPmRtaV9hZGRyKTsKIAl9CiAKIAlnbWFfd3JpdGUxNihodywgcG9ydCwgR01fTUNfQUREUl9IMSwKQEAgLTMwMDQsOCArMjk5MiwyMCBAQAogewogCXN0cnVjdCBza3kyX3BvcnQgKnNreTIgPSBuZXRkZXZfcHJpdihkZXYpOwogCi0JZWNtZC0+dHhfcGF1c2UgPSBza3kyLT50eF9wYXVzZTsKLQllY21kLT5yeF9wYXVzZSA9IHNreTItPnJ4X3BhdXNlOworCXN3aXRjaCAoc2t5Mi0+Zmxvd19tb2RlKSB7CisJY2FzZSBGQ19OT05FOgorCQllY21kLT50eF9wYXVzZSA9IGVjbWQtPnJ4X3BhdXNlID0gMDsKKwkJYnJlYWs7CisJY2FzZSBGQ19UWDoKKwkJZWNtZC0+dHhfcGF1c2UgPSAxLCBlY21kLT5yeF9wYXVzZSA9IDA7CisJCWJyZWFrOworCWNhc2UgRkNfUlg6CisJCWVjbWQtPnR4X3BhdXNlID0gMCwgZWNtZC0+cnhfcGF1c2UgPSAxOworCQlicmVhazsKKwljYXNlIEZDX0JPVEg6CisJCWVjbWQtPnR4X3BhdXNlID0gZWNtZC0+cnhfcGF1c2UgPSAxOworCX0KKwogCWVjbWQtPmF1dG9uZWcgPSBza3kyLT5hdXRvbmVnOwogfQogCkBAIC0zMDE1LDEwICszMDE1LDEwIEBACiAJc3RydWN0IHNreTJfcG9ydCAqc2t5MiA9IG5ldGRldl9wcml2KGRldik7CiAKIAlza3kyLT5hdXRvbmVnID0gZWNtZC0+YXV0b25lZzsKLQlza3kyLT50eF9wYXVzZSA9IGVjbWQtPnR4X3BhdXNlICE9IDA7Ci0Jc2t5Mi0+cnhfcGF1c2UgPSBlY21kLT5yeF9wYXVzZSAhPSAwOworCXNreTItPmZsb3dfbW9kZSA9IHNreTJfZmxvdyhlY21kLT5yeF9wYXVzZSwgZWNtZC0+dHhfcGF1c2UpOwogCi0Jc2t5Ml9waHlfcmVpbml0KHNreTIpOworCWlmIChuZXRpZl9ydW5uaW5nKGRldikpCisJCXNreTJfcGh5X3JlaW5pdChza3kyKTsKIAogCXJldHVybiAwOwogfQpAQCAtMzIzOCw3ICszMjM4LDExIEBACiAJCWRldi0+cG9sbCA9IHNreTJfcG9sbDsKIAlkZXYtPndlaWdodCA9IE5BUElfV0VJR0hUOwogI2lmZGVmIENPTkZJR19ORVRfUE9MTF9DT05UUk9MTEVSCi0JZGV2LT5wb2xsX2NvbnRyb2xsZXIgPSBza3kyX25ldHBvbGw7CisJLyogTmV0d29yayBjb25zb2xlIChvbmx5IHdvcmtzIG9uIHBvcnQgMCkKKwkgKiBiZWNhdXNlIG5ldHBvbGwgbWFrZXMgYXNzdW1wdGlvbnMgYWJvdXQgTkFQSQorCSAqLworCWlmIChwb3J0ID09IDApCisJCWRldi0+cG9sbF9jb250cm9sbGVyID0gc2t5Ml9uZXRwb2xsOwogI2VuZGlmCiAKIAlza3kyID0gbmV0ZGV2X3ByaXYoZGV2KTsKQEAgLTMyNDgsOCArMzI1Miw4IEBACiAKIAkvKiBBdXRvIHNwZWVkIGFuZCBmbG93IGNvbnRyb2wgKi8KIAlza3kyLT5hdXRvbmVnID0gQVVUT05FR19FTkFCTEU7Ci0Jc2t5Mi0+dHhfcGF1c2UgPSAxOwotCXNreTItPnJ4X3BhdXNlID0gMTsKKwlza3kyLT5mbG93X21vZGUgPSBGQ19CT1RIOworCiAJc2t5Mi0+ZHVwbGV4ID0gLTE7CiAJc2t5Mi0+c3BlZWQgPSAtMTsKIAlza3kyLT5hZHZlcnRpc2luZyA9IHNreTJfc3VwcG9ydGVkX21vZGVzKGh3KTsKQEAgLTMzNDAsOSArMzM0NCw4IEBACiAKIAlpZiAoIWh3LT5tc2lfZGV0ZWN0ZWQpIHsKIAkJLyogTVNJIHRlc3QgZmFpbGVkLCBnbyBiYWNrIHRvIElOVHggbW9kZSAqLwotCQlwcmludGsoS0VSTl9XQVJOSU5HIFBGWCAiJXM6IE5vIGludGVycnVwdCB3YXMgZ2VuZXJhdGVkIHVzaW5nIE1TSSwgIgotCQkgICAgICAgInN3aXRjaGluZyB0byBJTlR4IG1vZGUuIFBsZWFzZSByZXBvcnQgdGhpcyBmYWlsdXJlIHRvICIKLQkJICAgICAgICJ0aGUgUENJIG1haW50YWluZXIgYW5kIGluY2x1ZGUgc3lzdGVtIGNoaXBzZXQgaW5mb3JtYXRpb24uXG4iLAorCQlwcmludGsoS0VSTl9JTkZPIFBGWCAiJXM6IE5vIGludGVycnVwdCBnZW5lcmF0ZWQgdXNpbmcgTVNJLCAiCisJCSAgICAgICAic3dpdGNoaW5nIHRvIElOVHggbW9kZS5cbiIsCiAJCSAgICAgICBwY2lfbmFtZShwZGV2KSk7CiAKIAkJZXJyID0gLUVPUE5PVFNVUFA7CkBAIC0zMzUwLDYgKzMzNTMsNyBAQAogCX0KIAogCXNreTJfd3JpdGUzMihodywgQjBfSU1TSywgMCk7CisJc2t5Ml9yZWFkMzIoaHcsIEIwX0lNU0spOwogCiAJZnJlZV9pcnEocGRldi0+aXJxLCBodyk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3NreTIuaCBiL2RyaXZlcnMvbmV0L3NreTIuaAppbmRleCBmNjYxMDlhLi42ZDJhMjNmIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9za3kyLmgKKysrIGIvZHJpdmVycy9uZXQvc2t5Mi5oCkBAIC02LDE1ICs2LDI0IEBACiAKICNkZWZpbmUgRVRIX0pVTUJPX01UVQkJOTAwMAkvKiBNYXhpbXVtIE1UVSBzdXBwb3J0ZWQgKi8KIAotLyogUENJIGRldmljZSBzcGVjaWZpYyBjb25maWcgcmVnaXN0ZXJzICovCisvKiBQQ0kgY29uZmlnIHJlZ2lzdGVycyAqLwogZW51bSB7CiAJUENJX0RFVl9SRUcxCT0gMHg0MCwKIAlQQ0lfREVWX1JFRzIJPSAweDQ0LAorCVBDSV9ERVZfU1RBVFVTICA9IDB4N2MsCiAJUENJX0RFVl9SRUczCT0gMHg4MCwKIAlQQ0lfREVWX1JFRzQJPSAweDg0LAogCVBDSV9ERVZfUkVHNSAgICA9IDB4ODgsCiB9OwogCitlbnVtIHsKKwlQRVhfREVWX0NBUAk9IDB4ZTQsCisJUEVYX0RFVl9DVFJMCT0gMHhlOCwKKwlQRVhfREVWX1NUQQk9IDB4ZWEsCisJUEVYX0xOS19TVEFUCT0gMHhmMiwKKwlQRVhfVU5DX0VSUl9TVEFUPSAweDEwNCwKK307CisKIC8qIFl1a29uLTIgKi8KIGVudW0gcGNpX2Rldl9yZWdfMSB7CiAJUENJX1kyX1BJR19FTkEJID0gMTw8MzEsIC8qIEVuYWJsZSBQbHVnLWluLUdvIChZVUtPTi0yKSAqLwpAQCAtNjMsNiArNzIsMzkgQEAKIAkJCSAgICAgICBQQ0lfU1RBVFVTX1JFQ19NQVNURVJfQUJPUlQgfCBcCiAJCQkgICAgICAgUENJX1NUQVRVU19SRUNfVEFSR0VUX0FCT1JUIHwgXAogCQkJICAgICAgIFBDSV9TVEFUVVNfUEFSSVRZKQorCitlbnVtIHBleF9kZXZfY3RybCB7CisJUEVYX0RDX01BWF9SUlNfTVNLCT0gNzw8MTIsIC8qIEJpdCAxNC4uMTI6CU1heC4gUmVhZCBSZXF1ZXN0IFNpemUgKi8KKwlQRVhfRENfRU5fTk9fU05PT1AJPSAxPDwxMSwvKiBFbmFibGUgTm8gU25vb3AgKi8KKwlQRVhfRENfRU5fQVVYX1BPVwk9IDE8PDEwLC8qIEVuYWJsZSBBVVggUG93ZXIgKi8KKwlQRVhfRENfRU5fUEhBTlRPTQk9IDE8PDksCS8qIEVuYWJsZSBQaGFudG9tIEZ1bmN0aW9ucyAqLworCVBFWF9EQ19FTl9FWFRfVEFHCT0gMTw8OCwJLyogRW5hYmxlIEV4dGVuZGVkIFRhZyBGaWVsZCAqLworCVBFWF9EQ19NQVhfUExTX01TSwk9IDc8PDUsCS8qIEJpdCAgNy4uIDU6CU1heC4gUGF5bG9hZCBTaXplIE1hc2sgKi8KKwlQRVhfRENfRU5fUkVMX09SRAk9IDE8PDQsCS8qIEVuYWJsZSBSZWxheGVkIE9yZGVyaW5nICovCisJUEVYX0RDX0VOX1VOU19SUV9SUAk9IDE8PDMsCS8qIEVuYWJsZSBVbnN1cHBvcnRlZCBSZXF1ZXN0IFJlcG9ydGluZyAqLworCVBFWF9EQ19FTl9GQVRfRVJfUlAJPSAxPDwyLAkvKiBFbmFibGUgRmF0YWwgRXJyb3IgUmVwb3J0aW5nICovCisJUEVYX0RDX0VOX05GQV9FUl9SUAk9IDE8PDEsCS8qIEVuYWJsZSBOb24tRmF0YWwgRXJyb3IgUmVwb3J0aW5nICovCisJUEVYX0RDX0VOX0NPUl9FUl9SUAk9IDE8PDAsCS8qIEVuYWJsZSBDb3JyZWN0YWJsZSBFcnJvciBSZXBvcnRpbmcgKi8KK307CisjZGVmaW5lICBQRVhfRENfTUFYX1JEX1JRX1NJWkUoeCkgKCgoeCk8PDEyKSAmIFBFWF9EQ19NQVhfUlJTX01TSykKKworLyogUEVYX1VOQ19FUlJfU1RBVAkgUEVYIFVuY29ycmVjdGFibGUgRXJyb3JzIFN0YXR1cyBSZWdpc3RlciAoWXVrb24tMikgKi8KK2VudW0gcGV4X2VyciB7CisJUEVYX1VOU1VQX1JFUSAJPSAxPDwyMCwgLyogVW5zdXBwb3J0ZWQgUmVxdWVzdCBFcnJvciAqLworCisJUEVYX01BTEZPUl9UTFAJPSAxPDwxOCwgLyogTWFsZm9ybWVkIFRMUCAqLworCisJUEVYX1VORVhQX0NPTVAJPSAxPDwxNiwgLyogVW5leHBlY3RlZCBDb21wbGV0aW9uICovCisKKwlQRVhfQ09NUF9UTwk9IDE8PDE0LCAvKiBDb21wbGV0aW9uIFRpbWVvdXQgKi8KKwlQRVhfRkxPV19DVFJMX1AJPSAxPDwxMywgLyogRmxvdyBDb250cm9sIFByb3RvY29sIEVycm9yICovCisJUEVYX1BPSVNfVExQCT0gMTw8MTIsIC8qIFBvaXNvbmVkIFRMUCAqLworCisJUEVYX0RBVEFfTElOS19QID0gMTw8NCwJLyogRGF0YSBMaW5rIFByb3RvY29sIEVycm9yICovCisJUEVYX0ZBVEFMX0VSUk9SUz0gKFBFWF9NQUxGT1JfVExQIHwgUEVYX0ZMT1dfQ1RSTF9QIHwgUEVYX0RBVEFfTElOS19QKSwKK307CisKKwogZW51bSBjc3JfcmVncyB7CiAJQjBfUkFQCQk9IDB4MDAwMCwKIAlCMF9DVFNUCQk9IDB4MDAwNCwKQEAgLTE1MzQsNyArMTU3Niw3IEBACiAKIAlHTVJfRlNfQU5ZX0VSUgk9IEdNUl9GU19SWF9GRl9PViB8IEdNUl9GU19DUkNfRVJSIHwKIAkJCSAgR01SX0ZTX0ZSQUdNRU5UIHwgR01SX0ZTX0xPTkdfRVJSIHwKLQkJICAJICBHTVJfRlNfTUlJX0VSUiB8IEdNUl9GU19CQURfRkMgfAorCQkgIAkgIEdNUl9GU19NSUlfRVJSIHwgR01SX0ZTX0dPT0RfRkMgfCBHTVJfRlNfQkFEX0ZDIHwKIAkJCSAgR01SX0ZTX1VOX1NJWkUgfCBHTVJfRlNfSkFCQkVSLAogfTsKIApAQCAtMTc4Niw2ICsxODI4LDEzIEBACiAJZG1hX2FkZHJfdAlmcmFnX2FkZHJbRVRIX0pVTUJPX01UVSA+PiBQQUdFX1NISUZUXTsKIH07CiAKK2VudW0gZmxvd19jb250cm9sIHsKKwlGQ19OT05FCT0gMCwKKwlGQ19UWAk9IDEsCisJRkNfUlgJPSAyLAorCUZDX0JPVEgJPSAzLAorfTsKKwogc3RydWN0IHNreTJfcG9ydCB7CiAJc3RydWN0IHNreTJfaHcJICAgICAqaHc7CiAJc3RydWN0IG5ldF9kZXZpY2UgICAgKm5ldGRldjsKQEAgLTE4MTgsMTMgKzE4NjcsMTMgQEAKIAogCWRtYV9hZGRyX3QJICAgICByeF9sZV9tYXA7CiAJZG1hX2FkZHJfdAkgICAgIHR4X2xlX21hcDsKLQl1MzIJCSAgICAgYWR2ZXJ0aXNpbmc7CS8qIEFEVkVSVElTRURfIGJpdHMgKi8KKwl1MTYJCSAgICAgYWR2ZXJ0aXNpbmc7CS8qIEFEVkVSVElTRURfIGJpdHMgKi8KIAl1MTYJCSAgICAgc3BlZWQ7CS8qIFNQRUVEXzEwMDAsIFNQRUVEXzEwMCwgLi4uICovCiAJdTgJCSAgICAgYXV0b25lZzsJLyogQVVUT05FR19FTkFCTEUsIEFVVE9ORUdfRElTQUJMRSAqLwogCXU4CQkgICAgIGR1cGxleDsJLyogRFVQTEVYX0hBTEYsIERVUExFWF9GVUxMICovCi0JdTgJCSAgICAgcnhfcGF1c2U7Ci0JdTgJCSAgICAgdHhfcGF1c2U7CiAJdTgJCSAgICAgcnhfY3N1bTsKKyAJZW51bSBmbG93X2NvbnRyb2wgICAgZmxvd19tb2RlOworIAllbnVtIGZsb3dfY29udHJvbCAgICBmbG93X3N0YXR1czsKIAogCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzIG5ldF9zdGF0czsKIApAQCAtMTgzNiw3ICsxODg1LDYgQEAKIAlzdHJ1Y3QgbmV0X2RldmljZSAgICAqZGV2WzJdOwogCiAJaW50CQkgICAgIHBtX2NhcDsKLQlpbnQJCSAgICAgZXJyX2NhcDsKIAl1OAkgICAgIAkgICAgIGNoaXBfaWQ7CiAJdTgJCSAgICAgY2hpcF9yZXY7CiAJdTgJCSAgICAgcG1kX3R5cGU7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9zbWM5MXguaCBiL2RyaXZlcnMvbmV0L3NtYzkxeC5oCmluZGV4IDYzNmRiZmNkLi5hODY0MDE2IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9zbWM5MXguaAorKysgYi9kcml2ZXJzL25ldC9zbWM5MXguaApAQCAtMzk4LDYgKzM5OCw0MiBAQAogCiAjZGVmaW5lIFNNQ19JUlFfRkxBR1MJCSgwKQogCisjZWxpZglkZWZpbmVkKENPTkZJR19BUkNIX1ZFUlNBVElMRSkKKworI2RlZmluZSBTTUNfQ0FOX1VTRV84QklUCTEKKyNkZWZpbmUgU01DX0NBTl9VU0VfMTZCSVQJMQorI2RlZmluZSBTTUNfQ0FOX1VTRV8zMkJJVAkxCisjZGVmaW5lIFNNQ19OT1dBSVQJCTEKKworI2RlZmluZSBTTUNfaW5iKGEsIHIpCQlyZWFkYigoYSkgKyAocikpCisjZGVmaW5lIFNNQ19pbncoYSwgcikJCXJlYWR3KChhKSArIChyKSkKKyNkZWZpbmUgU01DX2lubChhLCByKQkJcmVhZGwoKGEpICsgKHIpKQorI2RlZmluZSBTTUNfb3V0Yih2LCBhLCByKQl3cml0ZWIodiwgKGEpICsgKHIpKQorI2RlZmluZSBTTUNfb3V0dyh2LCBhLCByKQl3cml0ZXcodiwgKGEpICsgKHIpKQorI2RlZmluZSBTTUNfb3V0bCh2LCBhLCByKQl3cml0ZWwodiwgKGEpICsgKHIpKQorI2RlZmluZSBTTUNfaW5zbChhLCByLCBwLCBsKQlyZWFkc2woKGEpICsgKHIpLCBwLCBsKQorI2RlZmluZSBTTUNfb3V0c2woYSwgciwgcCwgbCkJd3JpdGVzbCgoYSkgKyAociksIHAsIGwpCisKKyNkZWZpbmUgU01DX0lSUV9GTEFHUwkJKDApCisKKyNlbGlmCWRlZmluZWQoQ09ORklHX0FSQ0hfVkVSU0FUSUxFKQorCisjZGVmaW5lIFNNQ19DQU5fVVNFXzhCSVQJMQorI2RlZmluZSBTTUNfQ0FOX1VTRV8xNkJJVAkxCisjZGVmaW5lIFNNQ19DQU5fVVNFXzMyQklUCTEKKyNkZWZpbmUgU01DX05PV0FJVAkJMQorCisjZGVmaW5lIFNNQ19pbmIoYSwgcikJCXJlYWRiKChhKSArIChyKSkKKyNkZWZpbmUgU01DX2ludyhhLCByKQkJcmVhZHcoKGEpICsgKHIpKQorI2RlZmluZSBTTUNfaW5sKGEsIHIpCQlyZWFkbCgoYSkgKyAocikpCisjZGVmaW5lIFNNQ19vdXRiKHYsIGEsIHIpCXdyaXRlYih2LCAoYSkgKyAocikpCisjZGVmaW5lIFNNQ19vdXR3KHYsIGEsIHIpCXdyaXRldyh2LCAoYSkgKyAocikpCisjZGVmaW5lIFNNQ19vdXRsKHYsIGEsIHIpCXdyaXRlbCh2LCAoYSkgKyAocikpCisjZGVmaW5lIFNNQ19pbnNsKGEsIHIsIHAsIGwpCXJlYWRzbCgoYSkgKyAociksIHAsIGwpCisjZGVmaW5lIFNNQ19vdXRzbChhLCByLCBwLCBsKQl3cml0ZXNsKChhKSArIChyKSwgcCwgbCkKKworI2RlZmluZSBTTUNfSVJRX0ZMQUdTCQkoMCkKKwogI2Vsc2UKIAogI2RlZmluZSBTTUNfQ0FOX1VTRV84QklUCTEKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3NwaWRlcl9uZXQuYyBiL2RyaXZlcnMvbmV0L3NwaWRlcl9uZXQuYwppbmRleCA0NmEwMDkwLi40MTgxMzhkIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9zcGlkZXJfbmV0LmMKKysrIGIvZHJpdmVycy9uZXQvc3BpZGVyX25ldC5jCkBAIC01NSwxMiArNTUsMTMgQEAKIAkgICAgICAiPEplbnMuT3N0ZXJrYW1wQGRlLmlibS5jb20+Iik7CiBNT0RVTEVfREVTQ1JJUFRJT04oIlNwaWRlciBTb3V0aGJyaWRnZSBHaWdhYml0IEV0aGVybmV0IGRyaXZlciIpOwogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX1ZFUlNJT04oVkVSU0lPTik7CiAKIHN0YXRpYyBpbnQgcnhfZGVzY3JpcHRvcnMgPSBTUElERVJfTkVUX1JYX0RFU0NSSVBUT1JTX0RFRkFVTFQ7CiBzdGF0aWMgaW50IHR4X2Rlc2NyaXB0b3JzID0gU1BJREVSX05FVF9UWF9ERVNDUklQVE9SU19ERUZBVUxUOwogCi1tb2R1bGVfcGFyYW0ocnhfZGVzY3JpcHRvcnMsIGludCwgMDY0NCk7Ci1tb2R1bGVfcGFyYW0odHhfZGVzY3JpcHRvcnMsIGludCwgMDY0NCk7Cittb2R1bGVfcGFyYW0ocnhfZGVzY3JpcHRvcnMsIGludCwgMDQ0NCk7Cittb2R1bGVfcGFyYW0odHhfZGVzY3JpcHRvcnMsIGludCwgMDQ0NCk7CiAKIE1PRFVMRV9QQVJNX0RFU0MocnhfZGVzY3JpcHRvcnMsICJudW1iZXIgb2YgZGVzY3JpcHRvcnMgdXNlZCAiIFwKIAkJICJpbiByeCBjaGFpbnMiKTsKQEAgLTMwMCw3ICszMDEsNyBAQAogc3BpZGVyX25ldF9pbml0X2NoYWluKHN0cnVjdCBzcGlkZXJfbmV0X2NhcmQgKmNhcmQsCiAJCSAgICAgICBzdHJ1Y3Qgc3BpZGVyX25ldF9kZXNjcl9jaGFpbiAqY2hhaW4sCiAJCSAgICAgICBzdHJ1Y3Qgc3BpZGVyX25ldF9kZXNjciAqc3RhcnRfZGVzY3IsCi0JCSAgICAgICBpbnQgZGlyZWN0aW9uLCBpbnQgbm8pCisJCSAgICAgICBpbnQgbm8pCiB7CiAJaW50IGk7CiAJc3RydWN0IHNwaWRlcl9uZXRfZGVzY3IgKmRlc2NyOwpAQCAtMzE1LDcgKzMxNiw3IEBACiAKIAkJYnVmID0gcGNpX21hcF9zaW5nbGUoY2FyZC0+cGRldiwgZGVzY3IsCiAJCQkJICAgICBTUElERVJfTkVUX0RFU0NSX1NJWkUsCi0JCQkJICAgICBkaXJlY3Rpb24pOworCQkJCSAgICAgUENJX0RNQV9CSURJUkVDVElPTkFMKTsKIAogCQlpZiAocGNpX2RtYV9tYXBwaW5nX2Vycm9yKGJ1ZikpCiAJCQlnb3RvIGlvbW11X2Vycm9yOwpAQCAtMzI5LDExICszMzAsNiBAQAogCShkZXNjci0xKS0+bmV4dCA9IHN0YXJ0X2Rlc2NyOwogCXN0YXJ0X2Rlc2NyLT5wcmV2ID0gZGVzY3ItMTsKIAotCWRlc2NyID0gc3RhcnRfZGVzY3I7Ci0JaWYgKGRpcmVjdGlvbiA9PSBQQ0lfRE1BX0ZST01ERVZJQ0UpCi0JCWZvciAoaT0wOyBpIDwgbm87IGkrKywgZGVzY3IrKykKLQkJCWRlc2NyLT5uZXh0X2Rlc2NyX2FkZHIgPSBkZXNjci0+bmV4dC0+YnVzX2FkZHI7Ci0KIAlzcGluX2xvY2tfaW5pdCgmY2hhaW4tPmxvY2spOwogCWNoYWluLT5oZWFkID0gc3RhcnRfZGVzY3I7CiAJY2hhaW4tPnRhaWwgPSBzdGFydF9kZXNjcjsKQEAgLTM0Niw3ICszNDIsNyBAQAogCQlpZiAoZGVzY3ItPmJ1c19hZGRyKQogCQkJcGNpX3VubWFwX3NpbmdsZShjYXJkLT5wZGV2LCBkZXNjci0+YnVzX2FkZHIsCiAJCQkJCSBTUElERVJfTkVUX0RFU0NSX1NJWkUsCi0JCQkJCSBkaXJlY3Rpb24pOworCQkJCQkgUENJX0RNQV9CSURJUkVDVElPTkFMKTsKIAlyZXR1cm4gLUVOT01FTTsKIH0KIApAQCAtMzYyLDE1ICszNTgsMTUgQEAKIAlzdHJ1Y3Qgc3BpZGVyX25ldF9kZXNjciAqZGVzY3I7CiAKIAlkZXNjciA9IGNhcmQtPnJ4X2NoYWluLmhlYWQ7Ci0Jd2hpbGUgKGRlc2NyLT5uZXh0ICE9IGNhcmQtPnJ4X2NoYWluLmhlYWQpIHsKKwlkbyB7CiAJCWlmIChkZXNjci0+c2tiKSB7CiAJCQlkZXZfa2ZyZWVfc2tiKGRlc2NyLT5za2IpOwogCQkJcGNpX3VubWFwX3NpbmdsZShjYXJkLT5wZGV2LCBkZXNjci0+YnVmX2FkZHIsCiAJCQkJCSBTUElERVJfTkVUX01BWF9GUkFNRSwKLQkJCQkJIFBDSV9ETUFfRlJPTURFVklDRSk7CisJCQkJCSBQQ0lfRE1BX0JJRElSRUNUSU9OQUwpOwogCQl9CiAJCWRlc2NyID0gZGVzY3ItPm5leHQ7Ci0JfQorCX0gd2hpbGUgKGRlc2NyICE9IGNhcmQtPnJ4X2NoYWluLmhlYWQpOwogfQogCiAvKioKQEAgLTY0NSwyNiArNjQxLDQxIEBACiBzcGlkZXJfbmV0X3ByZXBhcmVfdHhfZGVzY3Ioc3RydWN0IHNwaWRlcl9uZXRfY2FyZCAqY2FyZCwKIAkJCSAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQogewotCXN0cnVjdCBzcGlkZXJfbmV0X2Rlc2NyICpkZXNjciA9IGNhcmQtPnR4X2NoYWluLmhlYWQ7CisJc3RydWN0IHNwaWRlcl9uZXRfZGVzY3IgKmRlc2NyOwogCWRtYV9hZGRyX3QgYnVmOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IGxlbmd0aDsKIAotCWJ1ZiA9IHBjaV9tYXBfc2luZ2xlKGNhcmQtPnBkZXYsIHNrYi0+ZGF0YSwgc2tiLT5sZW4sIFBDSV9ETUFfVE9ERVZJQ0UpOworCWxlbmd0aCA9IHNrYi0+bGVuOworCWlmIChsZW5ndGggPCBFVEhfWkxFTikgeworCQlpZiAoc2tiX3BhZChza2IsIEVUSF9aTEVOLWxlbmd0aCkpCisJCQlyZXR1cm4gMDsKKwkJbGVuZ3RoID0gRVRIX1pMRU47CisJfQorCisJYnVmID0gcGNpX21hcF9zaW5nbGUoY2FyZC0+cGRldiwgc2tiLT5kYXRhLCBsZW5ndGgsIFBDSV9ETUFfVE9ERVZJQ0UpOwogCWlmIChwY2lfZG1hX21hcHBpbmdfZXJyb3IoYnVmKSkgewogCQlpZiAobmV0aWZfbXNnX3R4X2VycihjYXJkKSAmJiBuZXRfcmF0ZWxpbWl0KCkpCiAJCQlwcl9lcnIoImNvdWxkIG5vdCBpb21tdS1tYXAgcGFja2V0ICglcCwgJWkpLiAiCi0JCQkJICAiRHJvcHBpbmcgcGFja2V0XG4iLCBza2ItPmRhdGEsIHNrYi0+bGVuKTsKKwkJCQkgICJEcm9wcGluZyBwYWNrZXRcbiIsIHNrYi0+ZGF0YSwgbGVuZ3RoKTsKIAkJY2FyZC0+c3BpZGVyX3N0YXRzLnR4X2lvbW11X21hcF9lcnJvcisrOwogCQlyZXR1cm4gLUVOT01FTTsKIAl9CiAKKwlzcGluX2xvY2tfaXJxc2F2ZSgmY2FyZC0+dHhfY2hhaW4ubG9jaywgZmxhZ3MpOworCWRlc2NyID0gY2FyZC0+dHhfY2hhaW4uaGVhZDsKKwljYXJkLT50eF9jaGFpbi5oZWFkID0gZGVzY3ItPm5leHQ7CisKIAlkZXNjci0+YnVmX2FkZHIgPSBidWY7Ci0JZGVzY3ItPmJ1Zl9zaXplID0gc2tiLT5sZW47CisJZGVzY3ItPmJ1Zl9zaXplID0gbGVuZ3RoOwogCWRlc2NyLT5uZXh0X2Rlc2NyX2FkZHIgPSAwOwogCWRlc2NyLT5za2IgPSBza2I7CiAJZGVzY3ItPmRhdGFfc3RhdHVzID0gMDsKIAogCWRlc2NyLT5kbWFjX2NtZF9zdGF0dXMgPQogCQkJU1BJREVSX05FVF9ERVNDUl9DQVJET1dORUQgfCBTUElERVJfTkVUX0RNQUNfTk9DUzsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjYXJkLT50eF9jaGFpbi5sb2NrLCBmbGFncyk7CisKIAlpZiAoc2tiLT5wcm90b2NvbCA9PSBodG9ucyhFVEhfUF9JUCkpCiAJCXN3aXRjaCAoc2tiLT5uaC5pcGgtPnByb3RvY29sKSB7CiAJCWNhc2UgSVBQUk9UT19UQ1A6CkBAIC02NzUsMzIgKzY4Niw1MSBAQAogCQkJYnJlYWs7CiAJCX0KIAorCS8qIENoYWluIHRoZSBidXMgYWRkcmVzcywgc28gdGhhdCB0aGUgRE1BIGVuZ2luZSBmaW5kcyB0aGlzIGRlc2NyLiAqLwogCWRlc2NyLT5wcmV2LT5uZXh0X2Rlc2NyX2FkZHIgPSBkZXNjci0+YnVzX2FkZHI7CiAKKwljYXJkLT5uZXRkZXYtPnRyYW5zX3N0YXJ0ID0gamlmZmllczsgLyogc2V0IG5ldGRldiB3YXRjaGRvZyB0aW1lciAqLwogCXJldHVybiAwOwogfQogCi0vKioKLSAqIHNwaWRlcl9uZXRfcmVsZWFzZV90eF9kZXNjciAtIHByb2Nlc3NlcyBhIHVzZWQgdHggZGVzY3JpcHRvcgotICogQGNhcmQ6IGNhcmQgc3RydWN0dXJlCi0gKiBAZGVzY3I6IGRlc2NyaXB0b3IgdG8gcmVsZWFzZQotICoKLSAqIHJlbGVhc2VzIGEgdXNlZCB0eCBkZXNjcmlwdG9yICh1bm1hcHBpbmcsIGZyZWVpbmcgb2Ygc2tiKQotICovCi1zdGF0aWMgaW5saW5lIHZvaWQKLXNwaWRlcl9uZXRfcmVsZWFzZV90eF9kZXNjcihzdHJ1Y3Qgc3BpZGVyX25ldF9jYXJkICpjYXJkKQorc3RhdGljIGludAorc3BpZGVyX25ldF9zZXRfbG93X3dhdGVybWFyayhzdHJ1Y3Qgc3BpZGVyX25ldF9jYXJkICpjYXJkKQogeworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IHN0YXR1czsKKwlpbnQgY250PTA7CisJaW50IGk7CiAJc3RydWN0IHNwaWRlcl9uZXRfZGVzY3IgKmRlc2NyID0gY2FyZC0+dHhfY2hhaW4udGFpbDsKLQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwogCi0JY2FyZC0+dHhfY2hhaW4udGFpbCA9IGNhcmQtPnR4X2NoYWluLnRhaWwtPm5leHQ7Ci0JZGVzY3ItPmRtYWNfY21kX3N0YXR1cyB8PSBTUElERVJfTkVUX0RFU0NSX05PVF9JTl9VU0U7CisJLyogTWVhc3VyZSB0aGUgbGVuZ3RoIG9mIHRoZSBxdWV1ZS4gTWVhc3VyZW1lbnQgZG9lcyBub3QKKwkgKiBuZWVkIHRvIGJlIHByZWNpc2UgLS0gZG9lcyBub3QgbmVlZCBhIGxvY2suICovCisJd2hpbGUgKGRlc2NyICE9IGNhcmQtPnR4X2NoYWluLmhlYWQpIHsKKwkJc3RhdHVzID0gZGVzY3ItPmRtYWNfY21kX3N0YXR1cyAmIFNQSURFUl9ORVRfREVTQ1JfTk9UX0lOX1VTRTsKKwkJaWYgKHN0YXR1cyA9PSBTUElERVJfTkVUX0RFU0NSX05PVF9JTl9VU0UpCisJCQlicmVhazsKKwkJZGVzY3IgPSBkZXNjci0+bmV4dDsKKwkJY250Kys7CisJfQogCi0JLyogdW5tYXAgdGhlIHNrYiAqLwotCXNrYiA9IGRlc2NyLT5za2I7Ci0JcGNpX3VubWFwX3NpbmdsZShjYXJkLT5wZGV2LCBkZXNjci0+YnVmX2FkZHIsIHNrYi0+bGVuLAotCQkJUENJX0RNQV9UT0RFVklDRSk7Ci0JZGV2X2tmcmVlX3NrYl9hbnkoc2tiKTsKKwkvKiBJZiBUWCBxdWV1ZSBpcyBzaG9ydCwgZG9uJ3QgZXZlbiBib3RoZXIgd2l0aCBpbnRlcnJ1cHRzICovCisJaWYgKGNudCA8IGNhcmQtPm51bV90eF9kZXNjLzQpCisJCXJldHVybiBjbnQ7CisKKwkvKiBTZXQgbG93LXdhdGVybWFyayAzLzR0aCdzIG9mIHRoZSB3YXkgaW50byB0aGUgcXVldWUuICovCisJZGVzY3IgPSBjYXJkLT50eF9jaGFpbi50YWlsOworCWNudCA9IChjbnQqMykvNDsKKwlmb3IgKGk9MDtpPGNudDsgaSsrKQorCQlkZXNjciA9IGRlc2NyLT5uZXh0OworCisJLyogU2V0IHRoZSBuZXcgd2F0ZXJtYXJrLCBjbGVhciB0aGUgb2xkIHdhdGVybWFyayAqLworCXNwaW5fbG9ja19pcnFzYXZlKCZjYXJkLT50eF9jaGFpbi5sb2NrLCBmbGFncyk7CisJZGVzY3ItPmRtYWNfY21kX3N0YXR1cyB8PSBTUElERVJfTkVUX0RFU0NSX1RYREVTRkxHOworCWlmIChjYXJkLT5sb3dfd2F0ZXJtYXJrICYmIGNhcmQtPmxvd193YXRlcm1hcmsgIT0gZGVzY3IpCisJCWNhcmQtPmxvd193YXRlcm1hcmstPmRtYWNfY21kX3N0YXR1cyA9CisJCSAgICAgY2FyZC0+bG93X3dhdGVybWFyay0+ZG1hY19jbWRfc3RhdHVzICYgflNQSURFUl9ORVRfREVTQ1JfVFhERVNGTEc7CisJY2FyZC0+bG93X3dhdGVybWFyayA9IGRlc2NyOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNhcmQtPnR4X2NoYWluLmxvY2ssIGZsYWdzKTsKKwlyZXR1cm4gY250OwogfQogCiAvKioKQEAgLTcxOSwyMSArNzQ5LDI5IEBACiBzcGlkZXJfbmV0X3JlbGVhc2VfdHhfY2hhaW4oc3RydWN0IHNwaWRlcl9uZXRfY2FyZCAqY2FyZCwgaW50IGJydXRhbCkKIHsKIAlzdHJ1Y3Qgc3BpZGVyX25ldF9kZXNjcl9jaGFpbiAqY2hhaW4gPSAmY2FyZC0+dHhfY2hhaW47CisJc3RydWN0IHNwaWRlcl9uZXRfZGVzY3IgKmRlc2NyOworCXN0cnVjdCBza19idWZmICpza2I7CisJdTMyIGJ1Zl9hZGRyOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJaW50IHN0YXR1czsKIAotCXNwaWRlcl9uZXRfcmVhZF9yZWcoY2FyZCwgU1BJREVSX05FVF9HRFRETUFDQ05UUik7Ci0KIAl3aGlsZSAoY2hhaW4tPnRhaWwgIT0gY2hhaW4tPmhlYWQpIHsKLQkJc3RhdHVzID0gc3BpZGVyX25ldF9nZXRfZGVzY3Jfc3RhdHVzKGNoYWluLT50YWlsKTsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmNoYWluLT5sb2NrLCBmbGFncyk7CisJCWRlc2NyID0gY2hhaW4tPnRhaWw7CisKKwkJc3RhdHVzID0gc3BpZGVyX25ldF9nZXRfZGVzY3Jfc3RhdHVzKGRlc2NyKTsKIAkJc3dpdGNoIChzdGF0dXMpIHsKIAkJY2FzZSBTUElERVJfTkVUX0RFU0NSX0NPTVBMRVRFOgogCQkJY2FyZC0+bmV0ZGV2X3N0YXRzLnR4X3BhY2tldHMrKzsKLQkJCWNhcmQtPm5ldGRldl9zdGF0cy50eF9ieXRlcyArPSBjaGFpbi0+dGFpbC0+c2tiLT5sZW47CisJCQljYXJkLT5uZXRkZXZfc3RhdHMudHhfYnl0ZXMgKz0gZGVzY3ItPnNrYi0+bGVuOwogCQkJYnJlYWs7CiAKIAkJY2FzZSBTUElERVJfTkVUX0RFU0NSX0NBUkRPV05FRDoKLQkJCWlmICghYnJ1dGFsKQorCQkJaWYgKCFicnV0YWwpIHsKKwkJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjaGFpbi0+bG9jaywgZmxhZ3MpOwogCQkJCXJldHVybiAxOworCQkJfQorCiAJCQkvKiBmYWxsdGhyb3VnaCwgaWYgd2UgcmVsZWFzZSB0aGUgZGVzY3JpcHRvcnMKIAkJCSAqIGJydXRhbGx5ICh0aGVuIHdlIGRvbid0IGNhcmUgYWJvdXQKIAkJCSAqIFNQSURFUl9ORVRfREVTQ1JfQ0FSRE9XTkVEKSAqLwpAQCAtNzUwLDExICs3ODgsMjUgQEAKIAogCQlkZWZhdWx0OgogCQkJY2FyZC0+bmV0ZGV2X3N0YXRzLnR4X2Ryb3BwZWQrKzsKLQkJCXJldHVybiAxOworCQkJaWYgKCFicnV0YWwpIHsKKwkJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjaGFpbi0+bG9jaywgZmxhZ3MpOworCQkJCXJldHVybiAxOworCQkJfQogCQl9Ci0JCXNwaWRlcl9uZXRfcmVsZWFzZV90eF9kZXNjcihjYXJkKTsKLQl9CiAKKwkJY2hhaW4tPnRhaWwgPSBkZXNjci0+bmV4dDsKKwkJZGVzY3ItPmRtYWNfY21kX3N0YXR1cyB8PSBTUElERVJfTkVUX0RFU0NSX05PVF9JTl9VU0U7CisJCXNrYiA9IGRlc2NyLT5za2I7CisJCWJ1Zl9hZGRyID0gZGVzY3ItPmJ1Zl9hZGRyOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjaGFpbi0+bG9jaywgZmxhZ3MpOworCisJCS8qIHVubWFwIHRoZSBza2IgKi8KKwkJaWYgKHNrYikgeworCQkJaW50IGxlbiA9IHNrYi0+bGVuIDwgRVRIX1pMRU4gPyBFVEhfWkxFTiA6IHNrYi0+bGVuOworCQkJcGNpX3VubWFwX3NpbmdsZShjYXJkLT5wZGV2LCBidWZfYWRkciwgbGVuLCBQQ0lfRE1BX1RPREVWSUNFKTsKKwkJCWRldl9rZnJlZV9za2Ioc2tiKTsKKwkJfQorCX0KIAlyZXR1cm4gMDsKIH0KIApAQCAtNzYzLDggKzgxNSwxMiBAQAogICogQGNhcmQ6IGNhcmQgc3RydWN0dXJlCiAgKiBAZGVzY3I6IGRlc2NyaXB0b3IgYWRkcmVzcyB0byBlbmFibGUgVFggcHJvY2Vzc2luZyBhdAogICoKLSAqIHNwaWRlcl9uZXRfa2lja190eF9kbWEgd3JpdGVzIHRoZSBjdXJyZW50IHR4IGNoYWluIGhlYWQgYXMgc3RhcnQgYWRkcmVzcwotICogb2YgdGhlIHR4IGRlc2NyaXB0b3IgY2hhaW4gYW5kIGVuYWJsZXMgdGhlIHRyYW5zbWlzc2lvbiBETUEgZW5naW5lCisgKiBUaGlzIHJvdXRpbmUgd2lsbCBzdGFydCB0aGUgdHJhbnNtaXQgRE1BIHJ1bm5pbmcgaWYKKyAqIGl0IGlzIG5vdCBhbHJlYWR5IHJ1bm5pbmcuIFRoaXMgcm91dGluZSBuZWQgb25seSBiZQorICogY2FsbGVkIHdoZW4gcXVldWVpbmcgYSBuZXcgcGFja2V0IHRvIGFuIGVtcHR5IHR4IHF1ZXVlLgorICogV3JpdGVzIHRoZSBjdXJyZW50IHR4IGNoYWluIGhlYWQgYXMgc3RhcnQgYWRkcmVzcworICogb2YgdGhlIHR4IGRlc2NyaXB0b3IgY2hhaW4gYW5kIGVuYWJsZXMgdGhlIHRyYW5zbWlzc2lvbgorICogRE1BIGVuZ2luZS4KICAqLwogc3RhdGljIGlubGluZSB2b2lkCiBzcGlkZXJfbmV0X2tpY2tfdHhfZG1hKHN0cnVjdCBzcGlkZXJfbmV0X2NhcmQgKmNhcmQpCkBAIC04MDQsNjUgKzg2MCw0MyBAQAogc3RhdGljIGludAogc3BpZGVyX25ldF94bWl0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYpCiB7CisJaW50IGNudDsKIAlzdHJ1Y3Qgc3BpZGVyX25ldF9jYXJkICpjYXJkID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKIAlzdHJ1Y3Qgc3BpZGVyX25ldF9kZXNjcl9jaGFpbiAqY2hhaW4gPSAmY2FyZC0+dHhfY2hhaW47Ci0Jc3RydWN0IHNwaWRlcl9uZXRfZGVzY3IgKmRlc2NyID0gY2hhaW4tPmhlYWQ7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQlpbnQgcmVzdWx0OwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmNoYWluLT5sb2NrLCBmbGFncyk7CiAKIAlzcGlkZXJfbmV0X3JlbGVhc2VfdHhfY2hhaW4oY2FyZCwgMCk7CiAKLQlpZiAoY2hhaW4tPmhlYWQtPm5leHQgPT0gY2hhaW4tPnRhaWwtPnByZXYpIHsKKwlpZiAoKGNoYWluLT5oZWFkLT5uZXh0ID09IGNoYWluLT50YWlsLT5wcmV2KSB8fAorCSAgIChzcGlkZXJfbmV0X3ByZXBhcmVfdHhfZGVzY3IoY2FyZCwgc2tiKSAhPSAwKSkgeworCiAJCWNhcmQtPm5ldGRldl9zdGF0cy50eF9kcm9wcGVkKys7Ci0JCXJlc3VsdCA9IE5FVERFVl9UWF9MT0NLRUQ7Ci0JCWdvdG8gb3V0OworCQluZXRpZl9zdG9wX3F1ZXVlKG5ldGRldik7CisJCXJldHVybiBORVRERVZfVFhfQlVTWTsKIAl9CiAKLQlpZiAoc3BpZGVyX25ldF9nZXRfZGVzY3Jfc3RhdHVzKGRlc2NyKSAhPSBTUElERVJfTkVUX0RFU0NSX05PVF9JTl9VU0UpIHsKLQkJY2FyZC0+bmV0ZGV2X3N0YXRzLnR4X2Ryb3BwZWQrKzsKLQkJcmVzdWx0ID0gTkVUREVWX1RYX0xPQ0tFRDsKLQkJZ290byBvdXQ7Ci0JfQotCi0JaWYgKHNwaWRlcl9uZXRfcHJlcGFyZV90eF9kZXNjcihjYXJkLCBza2IpICE9IDApIHsKLQkJY2FyZC0+bmV0ZGV2X3N0YXRzLnR4X2Ryb3BwZWQrKzsKLQkJcmVzdWx0ID0gTkVUREVWX1RYX0JVU1k7Ci0JCWdvdG8gb3V0OwotCX0KLQotCXJlc3VsdCA9IE5FVERFVl9UWF9PSzsKLQotCXNwaWRlcl9uZXRfa2lja190eF9kbWEoY2FyZCk7Ci0JY2FyZC0+dHhfY2hhaW4uaGVhZCA9IGNhcmQtPnR4X2NoYWluLmhlYWQtPm5leHQ7Ci0KLW91dDoKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjaGFpbi0+bG9jaywgZmxhZ3MpOwotCW5ldGlmX3dha2VfcXVldWUobmV0ZGV2KTsKLQlyZXR1cm4gcmVzdWx0OworCWNudCA9IHNwaWRlcl9uZXRfc2V0X2xvd193YXRlcm1hcmsoY2FyZCk7CisJaWYgKGNudCA8IDUpCisJCXNwaWRlcl9uZXRfa2lja190eF9kbWEoY2FyZCk7CisJcmV0dXJuIE5FVERFVl9UWF9PSzsKIH0KIAogLyoqCiAgKiBzcGlkZXJfbmV0X2NsZWFudXBfdHhfcmluZyAtIGNsZWFucyB1cCB0aGUgVFggcmluZwogICogQGNhcmQ6IGNhcmQgc3RydWN0dXJlCiAgKgotICogc3BpZGVyX25ldF9jbGVhbnVwX3R4X3JpbmcgaXMgY2FsbGVkIGJ5IHRoZSB0eF90aW1lciAoYXMgd2UgZG9uJ3QgdXNlCi0gKiBpbnRlcnJ1cHRzIHRvIGNsZWFudXAgb3VyIFRYIHJpbmcpIGFuZCByZXR1cm5zIHNlbnQgcGFja2V0cyB0byB0aGUgc3RhY2sKLSAqIGJ5IGZyZWVpbmcgdGhlbQorICogc3BpZGVyX25ldF9jbGVhbnVwX3R4X3JpbmcgaXMgY2FsbGVkIGJ5IGVpdGhlciB0aGUgdHhfdGltZXIKKyAqIG9yIGZyb20gdGhlIE5BUEkgcG9sbGluZyByb3V0aW5lLgorICogVGhpcyByb3V0aW5lIHJlbGVhc2VzIHJlc291cmNlcyBhc3NvY2l0ZWQgd2l0aCB0cmFuc21pdHRlZAorICogcGFja2V0cywgaW5jbHVkaW5nIHVwZGF0aW5nIHRoZSBxdWV1ZSB0YWlsIHBvaW50ZXIuCiAgKi8KIHN0YXRpYyB2b2lkCiBzcGlkZXJfbmV0X2NsZWFudXBfdHhfcmluZyhzdHJ1Y3Qgc3BpZGVyX25ldF9jYXJkICpjYXJkKQogewotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmY2FyZC0+dHhfY2hhaW4ubG9jaywgZmxhZ3MpOwotCiAJaWYgKChzcGlkZXJfbmV0X3JlbGVhc2VfdHhfY2hhaW4oY2FyZCwgMCkgIT0gMCkgJiYKLQkgICAgKGNhcmQtPm5ldGRldi0+ZmxhZ3MgJiBJRkZfVVApKQorCSAgICAoY2FyZC0+bmV0ZGV2LT5mbGFncyAmIElGRl9VUCkpIHsKIAkJc3BpZGVyX25ldF9raWNrX3R4X2RtYShjYXJkKTsKLQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNhcmQtPnR4X2NoYWluLmxvY2ssIGZsYWdzKTsKKwkJbmV0aWZfd2FrZV9xdWV1ZShjYXJkLT5uZXRkZXYpOworCX0KIH0KIAogLyoqCkBAIC0xMDUzLDYgKzEwODcsNyBAQAogCWludCBwYWNrZXRzX3RvX2RvLCBwYWNrZXRzX2RvbmUgPSAwOwogCWludCBub19tb3JlX3BhY2tldHMgPSAwOwogCisJc3BpZGVyX25ldF9jbGVhbnVwX3R4X3JpbmcoY2FyZCk7CiAJcGFja2V0c190b19kbyA9IG1pbigqYnVkZ2V0LCBuZXRkZXYtPnF1b3RhKTsKIAogCXdoaWxlIChwYWNrZXRzX3RvX2RvKSB7CkBAIC0xMjQzLDEyICsxMjc4LDE1IEBACiAJY2FzZSBTUElERVJfTkVUX1BIWUlOVDoKIAljYXNlIFNQSURFUl9ORVRfR01BQzJJTlQ6CiAJY2FzZSBTUElERVJfTkVUX0dNQUMxSU5UOgotCWNhc2UgU1BJREVSX05FVF9HSVBTSU5UOgogCWNhc2UgU1BJREVSX05FVF9HRklGT0lOVDoKIAljYXNlIFNQSURFUl9ORVRfRE1BQ0lOVDoKIAljYXNlIFNQSURFUl9ORVRfR1NZU0lOVDoKIAkJYnJlYWs7ICovCiAKKwljYXNlIFNQSURFUl9ORVRfR0lQU0lOVDoKKwkJc2hvd19lcnJvciA9IDA7CisJCWJyZWFrOworCiAJY2FzZSBTUElERVJfTkVUX0dQV09QQ01QSU5UOgogCQkvKiBQSFkgd3JpdGUgb3BlcmF0aW9uIGNvbXBsZXRlZCAqLwogCQlzaG93X2Vycm9yID0gMDsKQEAgLTEzMDcsOSArMTM0NSwxMCBAQAogCWNhc2UgU1BJREVSX05FVF9HRFREQ0VJTlQ6CiAJCS8qIGNoYWluIGVuZC4gSWYgYSBkZXNjcmlwdG9yIHNob3VsZCBiZSBzZW50LCBraWNrIG9mZgogCQkgKiB0eCBkbWEKLQkJaWYgKGNhcmQtPnR4X2NoYWluLnRhaWwgPT0gY2FyZC0+dHhfY2hhaW4uaGVhZCkKKwkJaWYgKGNhcmQtPnR4X2NoYWluLnRhaWwgIT0gY2FyZC0+dHhfY2hhaW4uaGVhZCkKIAkJCXNwaWRlcl9uZXRfa2lja190eF9kbWEoY2FyZCk7Ci0JCXNob3dfZXJyb3IgPSAwOyAqLworCQkqLworCQlzaG93X2Vycm9yID0gMDsKIAkJYnJlYWs7CiAKIAkvKiBjYXNlIFNQSURFUl9ORVRfRzFUTUNOVElOVDogbm90IHVzZWQuIHByaW50IGEgbWVzc2FnZSAqLwpAQCAtMTM1NCw3ICsxMzkzLDcgQEAKIAkJaWYgKG5ldGlmX21zZ19pbnRyKGNhcmQpKQogCQkJcHJfZXJyKCJnb3QgZGVzY3JpcHRvciBjaGFpbiBlbmQgaW50ZXJydXB0LCAiCiAJCQkgICAgICAgInJlc3RhcnRpbmcgRE1BQyAlYy5cbiIsCi0JCQkgICAgICAgJ0QnK2ktU1BJREVSX05FVF9HREREQ0VJTlQpOworCQkJICAgICAgICdEJy0oaS1TUElERVJfTkVUX0dERERDRUlOVCkvMyk7CiAJCXNwaWRlcl9uZXRfcmVmaWxsX3J4X2NoYWluKGNhcmQpOwogCQlzcGlkZXJfbmV0X2VuYWJsZV9yeGRtYWMoY2FyZCk7CiAJCXNob3dfZXJyb3IgPSAwOwpAQCAtMTQyMyw4ICsxNDYyLDkgQEAKIAl9CiAKIAlpZiAoKHNob3dfZXJyb3IpICYmIChuZXRpZl9tc2dfaW50cihjYXJkKSkpCi0JCXByX2VycigiR290IGVycm9yIGludGVycnVwdCwgR0hJSU5UMFNUUyA9IDB4JTA4eCwgIgorCQlwcl9lcnIoIkdvdCBlcnJvciBpbnRlcnJ1cHQgb24gJXMsIEdISUlOVDBTVFMgPSAweCUwOHgsICIKIAkJICAgICAgICJHSElJTlQxU1RTID0gMHglMDh4LCBHSElJTlQyU1RTID0gMHglMDh4XG4iLAorCQkgICAgICAgY2FyZC0+bmV0ZGV2LT5uYW1lLAogCQkgICAgICAgc3RhdHVzX3JlZywgZXJyb3JfcmVnMSwgZXJyb3JfcmVnMik7CiAKIAkvKiBjbGVhciBpbnRlcnJ1cHQgc291cmNlcyAqLwpAQCAtMTQ2MCw2ICsxNTAwLDggQEAKIAkJc3BpZGVyX25ldF9yeF9pcnFfb2ZmKGNhcmQpOwogCQluZXRpZl9yeF9zY2hlZHVsZShuZXRkZXYpOwogCX0KKwlpZiAoc3RhdHVzX3JlZyAmIFNQSURFUl9ORVRfVFhJTlQpCisJCW5ldGlmX3J4X3NjaGVkdWxlKG5ldGRldik7CiAKIAlpZiAoc3RhdHVzX3JlZyAmIFNQSURFUl9ORVRfRVJSSU5UICkKIAkJc3BpZGVyX25ldF9oYW5kbGVfZXJyb3JfaXJxKGNhcmQsIHN0YXR1c19yZWcpOwpAQCAtMTU5OSw3ICsxNjQxLDcgQEAKIAkJCSAgICAgU1BJREVSX05FVF9JTlQyX01BU0tfVkFMVUUpOwogCiAJc3BpZGVyX25ldF93cml0ZV9yZWcoY2FyZCwgU1BJREVSX05FVF9HRFRETUFDQ05UUiwKLQkJCSAgICAgU1BJREVSX05FVF9HRFREQ0VJRElTKTsKKwkJCSAgICAgU1BJREVSX05FVF9HRFRCU1RBIHwgU1BJREVSX05FVF9HRFREQ0VJRElTKTsKIH0KIAogLyoqCkBAIC0xNjE1LDE3ICsxNjU3LDI2IEBACiBzcGlkZXJfbmV0X29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldikKIHsKIAlzdHJ1Y3Qgc3BpZGVyX25ldF9jYXJkICpjYXJkID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKLQlpbnQgcmVzdWx0OworCXN0cnVjdCBzcGlkZXJfbmV0X2Rlc2NyICpkZXNjcjsKKwlpbnQgaSwgcmVzdWx0OwogCiAJcmVzdWx0ID0gLUVOT01FTTsKIAlpZiAoc3BpZGVyX25ldF9pbml0X2NoYWluKGNhcmQsICZjYXJkLT50eF9jaGFpbiwgY2FyZC0+ZGVzY3IsCi0JCQlQQ0lfRE1BX1RPREVWSUNFLCBjYXJkLT50eF9kZXNjKSkKKwkgICAgICAgICAgICAgICAgICAgICAgICAgIGNhcmQtPm51bV90eF9kZXNjKSkKIAkJZ290byBhbGxvY190eF9mYWlsZWQ7CisKKwljYXJkLT5sb3dfd2F0ZXJtYXJrID0gTlVMTDsKKworCS8qIHJ4X2NoYWluIGlzIGFmdGVyIHR4X2NoYWluLCBzbyBvZmZzZXQgaXMgZGVzY3IgKyB0eF9jb3VudCAqLwogCWlmIChzcGlkZXJfbmV0X2luaXRfY2hhaW4oY2FyZCwgJmNhcmQtPnJ4X2NoYWluLAotCQkJY2FyZC0+ZGVzY3IgKyBjYXJkLT5yeF9kZXNjLAotCQkJUENJX0RNQV9GUk9NREVWSUNFLCBjYXJkLT5yeF9kZXNjKSkKKwkgICAgICAgICAgICAgICAgICAgICAgICAgIGNhcmQtPmRlc2NyICsgY2FyZC0+bnVtX3R4X2Rlc2MsCisJICAgICAgICAgICAgICAgICAgICAgICAgICBjYXJkLT5udW1fcnhfZGVzYykpCiAJCWdvdG8gYWxsb2NfcnhfZmFpbGVkOwogCisJZGVzY3IgPSBjYXJkLT5yeF9jaGFpbi5oZWFkOworCWZvciAoaT0wOyBpIDwgY2FyZC0+bnVtX3J4X2Rlc2M7IGkrKywgZGVzY3IrKykKKwkJZGVzY3ItPm5leHRfZGVzY3JfYWRkciA9IGRlc2NyLT5uZXh0LT5idXNfYWRkcjsKKwogCS8qIGFsbG9jYXRlIHJ4IHNrYnMgKi8KIAlpZiAoc3BpZGVyX25ldF9hbGxvY19yeF9za2JzKGNhcmQpKQogCQlnb3RvIGFsbG9jX3NrYnNfZmFpbGVkOwpAQCAtMTg3OCwxMCArMTkyOSw3IEBACiAJc3BpZGVyX25ldF9kaXNhYmxlX3J4ZG1hYyhjYXJkKTsKIAogCS8qIHJlbGVhc2UgY2hhaW5zICovCi0JaWYgKHNwaW5fdHJ5bG9jaygmY2FyZC0+dHhfY2hhaW4ubG9jaykpIHsKLQkJc3BpZGVyX25ldF9yZWxlYXNlX3R4X2NoYWluKGNhcmQsIDEpOwotCQlzcGluX3VubG9jaygmY2FyZC0+dHhfY2hhaW4ubG9jayk7Ci0JfQorCXNwaWRlcl9uZXRfcmVsZWFzZV90eF9jaGFpbihjYXJkLCAxKTsKIAogCXNwaWRlcl9uZXRfZnJlZV9jaGFpbihjYXJkLCAmY2FyZC0+dHhfY2hhaW4pOwogCXNwaWRlcl9uZXRfZnJlZV9jaGFpbihjYXJkLCAmY2FyZC0+cnhfY2hhaW4pOwpAQCAtMjAxMiw4ICsyMDYwLDggQEAKIAogCWNhcmQtPm9wdGlvbnMucnhfY3N1bSA9IFNQSURFUl9ORVRfUlhfQ1NVTV9ERUZBVUxUOwogCi0JY2FyZC0+dHhfZGVzYyA9IHR4X2Rlc2NyaXB0b3JzOwotCWNhcmQtPnJ4X2Rlc2MgPSByeF9kZXNjcmlwdG9yczsKKwljYXJkLT5udW1fdHhfZGVzYyA9IHR4X2Rlc2NyaXB0b3JzOworCWNhcmQtPm51bV9yeF9kZXNjID0gcnhfZGVzY3JpcHRvcnM7CiAKIAlzcGlkZXJfbmV0X3NldHVwX25ldGRldl9vcHMobmV0ZGV2KTsKIApAQCAtMjI1Miw2ICsyMzAwLDggQEAKICAqLwogc3RhdGljIGludCBfX2luaXQgc3BpZGVyX25ldF9pbml0KHZvaWQpCiB7CisJcHJpbnRrKEtFUk5fSU5GTyAiU3BpZGVybmV0IHZlcnNpb24gJXMuXG4iLCBWRVJTSU9OKTsKKwogCWlmIChyeF9kZXNjcmlwdG9ycyA8IFNQSURFUl9ORVRfUlhfREVTQ1JJUFRPUlNfTUlOKSB7CiAJCXJ4X2Rlc2NyaXB0b3JzID0gU1BJREVSX05FVF9SWF9ERVNDUklQVE9SU19NSU47CiAJCXByX2luZm8oImFkanVzdGluZyByeCBkZXNjcmlwdG9ycyB0byAlaS5cbiIsIHJ4X2Rlc2NyaXB0b3JzKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3NwaWRlcl9uZXQuaCBiL2RyaXZlcnMvbmV0L3NwaWRlcl9uZXQuaAppbmRleCBhNTlkZWRhLi5iM2I0NjExIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9zcGlkZXJfbmV0LmgKKysrIGIvZHJpdmVycy9uZXQvc3BpZGVyX25ldC5oCkBAIC0yNCw2ICsyNCw4IEBACiAjaWZuZGVmIF9TUElERVJfTkVUX0gKICNkZWZpbmUgX1NQSURFUl9ORVRfSAogCisjZGVmaW5lIFZFUlNJT04gIjEuMSBBIgorCiAjaW5jbHVkZSAic3VuZ2VtX3BoeS5oIgogCiBleHRlcm4gaW50IHNwaWRlcl9uZXRfc3RvcChzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2KTsKQEAgLTQ3LDcgKzQ5LDcgQEAKICNkZWZpbmUgU1BJREVSX05FVF9UWF9ERVNDUklQVE9SU19NSU4JCTE2CiAjZGVmaW5lIFNQSURFUl9ORVRfVFhfREVTQ1JJUFRPUlNfTUFYCQk1MTIKIAotI2RlZmluZSBTUElERVJfTkVUX1RYX1RJTUVSCQkJMjAKKyNkZWZpbmUgU1BJREVSX05FVF9UWF9USU1FUgkJCShIWi81KQogCiAjZGVmaW5lIFNQSURFUl9ORVRfUlhfQ1NVTV9ERUZBVUxUCQkxCiAKQEAgLTE4OSw3ICsxOTEsOSBAQAogI2RlZmluZSBTUElERVJfTkVUX01BQ01PREVfVkFMVUUJMHgwMDAwMDAwMQogI2RlZmluZSBTUElERVJfTkVUX0JVUlNUTE1UX1ZBTFVFCTB4MDAwMDAyMDAgLyogYWJvdXQgMTYgdXMgKi8KIAotLyogMSgwKQkJCQkJZW5hYmxlIHIvdHggZG1hCisvKiBETUFDIGNvbnRyb2wgcmVnaXN0ZXIgR0RNQUNDTlRSCisgKgorICogMSgwKQkJCQllbmFibGUgci90eCBkbWEKICAqICAwMDAwMDAwCQkJCWZpeGVkIHRvIDAKICAqCiAgKiAgICAgICAgIDAwMDAwMAkJCWZpeGVkIHRvIDAKQEAgLTE5OCw2ICsyMDIsNyBAQAogICoKICAqICAgICAgICAgICAgICAgICAwMDAwMDAJCWZpeGVkIHRvIDAKICAqICAgICAgICAgICAgICAgICAgICAgICAwMAkJYnVyc3QgYWxpZ25tZW50OiAxMjggYnl0ZXMKKyAqICAgICAgICAgICAgICAgICAgICAgICAxMQkJYnVyc3QgYWxpZ25tZW50OiAxMDI0IGJ5dGVzCiAgKgogICogICAgICAgICAgICAgICAgICAgICAgICAgMDAwMDAJZml4ZWQgdG8gMAogICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwCWRlc2NyIHdyaXRlYmFjayBzaXplIDMyIGJ5dGVzCkBAIC0yMDgsMTAgKzIxMywxMyBAQAogI2RlZmluZSBTUElERVJfTkVUX0RNQV9SWF9WQUxVRQkJMHg4MDAwMDAwMAogI2RlZmluZSBTUElERVJfTkVUX0RNQV9SWF9GRU5EX1ZBTFVFCTB4MDAwMzAwMDMKIC8qIHRvIHNldCBUWF9ETUFfRU4gKi8KLSNkZWZpbmUgU1BJREVSX05FVF9UWF9ETUFfRU4JCTB4ODAwMDAwMDAKLSNkZWZpbmUgU1BJREVSX05FVF9HRFREQ0VJRElTCQkweDAwMDAwMDAyCi0jZGVmaW5lIFNQSURFUl9ORVRfRE1BX1RYX1ZBTFVFCQlTUElERVJfTkVUX1RYX0RNQV9FTiB8IFwKLQkJCQkJU1BJREVSX05FVF9HRFREQ0VJRElTCisjZGVmaW5lIFNQSURFUl9ORVRfVFhfRE1BX0VOICAgICAgICAgICAweDgwMDAwMDAwCisjZGVmaW5lIFNQSURFUl9ORVRfR0RUQlNUQSAgICAgICAgICAgICAweDAwMDAwMzAwCisjZGVmaW5lIFNQSURFUl9ORVRfR0RURENFSURJUyAgICAgICAgICAweDAwMDAwMDAyCisjZGVmaW5lIFNQSURFUl9ORVRfRE1BX1RYX1ZBTFVFICAgICAgICBTUElERVJfTkVUX1RYX0RNQV9FTiB8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNQSURFUl9ORVRfR0RUQlNUQSB8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNQSURFUl9ORVRfR0RURENFSURJUworCiAjZGVmaW5lIFNQSURFUl9ORVRfRE1BX1RYX0ZFTkRfVkFMVUUJMHgwMDAzMDAwMwogCiAvKiBTUElERVJfTkVUX1VBX0RFU0NSX1ZBTFVFIGlzIE9SJ2VkIHdpdGggdGhlIHVuaWNhc3QgYWRkcmVzcyAqLwpAQCAtMzIwLDEzICszMjgsMTAgQEAKIAlTUElERVJfTkVUX0dSSVNQRE5HSU5UCiB9OwogCi0jZGVmaW5lIFNQSURFUl9ORVRfVFhJTlQJKCAoMSA8PCBTUElERVJfTkVUX0dUVEVESU5UKSB8IFwKLQkJCQkgICgxIDw8IFNQSURFUl9ORVRfR0RURENFSU5UKSB8IFwKLQkJCQkgICgxIDw8IFNQSURFUl9ORVRfR0RURkRDSU5UKSApCisjZGVmaW5lIFNQSURFUl9ORVRfVFhJTlQJKCAoMSA8PCBTUElERVJfTkVUX0dEVEZEQ0lOVCkgKQogCi0vKiB3ZSByZWx5IG9uIGZsYWdnZWQgZGVzY3JpcHRvciBpbnRlcnJ1cHRzKi8KLSNkZWZpbmUgU1BJREVSX05FVF9SWElOVAkoICgxIDw8IFNQSURFUl9ORVRfR0RBRkRDSU5UKSB8IFwKLQkJCQkgICgxIDw8IFNQSURFUl9ORVRfR1JNRkxMSU5UKSApCisvKiBXZSByZWx5IG9uIGZsYWdnZWQgZGVzY3JpcHRvciBpbnRlcnJ1cHRzICovCisjZGVmaW5lIFNQSURFUl9ORVRfUlhJTlQJKCAoMSA8PCBTUElERVJfTkVUX0dEQUZEQ0lOVCkgKQogCiAjZGVmaW5lIFNQSURFUl9ORVRfRVJSSU5UCSggMHhmZmZmZmZmZiAmIFwKIAkJCQkgICh+U1BJREVSX05FVF9UWElOVCkgJiBcCkBAIC0zNDksNiArMzU0LDcgQEAKICNkZWZpbmUgU1BJREVSX05FVF9ERVNDUl9GT1JDRV9FTkQJCTB4NTAwMDAwMDAgLyogdXNlZCBpbiByeCBhbmQgdHggKi8KICNkZWZpbmUgU1BJREVSX05FVF9ERVNDUl9DQVJET1dORUQJCTB4QTAwMDAwMDAgLyogdXNlZCBpbiByeCBhbmQgdHggKi8KICNkZWZpbmUgU1BJREVSX05FVF9ERVNDUl9OT1RfSU5fVVNFCQkweEYwMDAwMDAwCisjZGVmaW5lIFNQSURFUl9ORVRfREVTQ1JfVFhERVNGTEcJCTB4MDA4MDAwMDAKIAogc3RydWN0IHNwaWRlcl9uZXRfZGVzY3IgewogCS8qIGFzIGRlZmluZWQgYnkgdGhlIGhhcmR3YXJlICovCkBAIC00MzMsNiArNDM5LDcgQEAKIAogCXN0cnVjdCBzcGlkZXJfbmV0X2Rlc2NyX2NoYWluIHR4X2NoYWluOwogCXN0cnVjdCBzcGlkZXJfbmV0X2Rlc2NyX2NoYWluIHJ4X2NoYWluOworCXN0cnVjdCBzcGlkZXJfbmV0X2Rlc2NyICpsb3dfd2F0ZXJtYXJrOwogCiAJc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgbmV0ZGV2X3N0YXRzOwogCkBAIC00NDgsOCArNDU1LDggQEAKIAogCS8qIGZvciBldGh0b29sICovCiAJaW50IG1zZ19lbmFibGU7Ci0JaW50IHJ4X2Rlc2M7Ci0JaW50IHR4X2Rlc2M7CisJaW50IG51bV9yeF9kZXNjOworCWludCBudW1fdHhfZGVzYzsKIAlzdHJ1Y3Qgc3BpZGVyX25ldF9leHRyYV9zdGF0cyBzcGlkZXJfc3RhdHM7CiAKIAlzdHJ1Y3Qgc3BpZGVyX25ldF9kZXNjciBkZXNjclswXTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3NwaWRlcl9uZXRfZXRodG9vbC5jIGIvZHJpdmVycy9uZXQvc3BpZGVyX25ldF9ldGh0b29sLmMKaW5kZXggNTg5ZTQzNi4uOTFiOTk1MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvc3BpZGVyX25ldF9ldGh0b29sLmMKKysrIGIvZHJpdmVycy9uZXQvc3BpZGVyX25ldF9ldGh0b29sLmMKQEAgLTc2LDcgKzc2LDcgQEAKIAkvKiBjbGVhciBhbmQgZmlsbCBvdXQgaW5mbyAqLwogCW1lbXNldChkcnZpbmZvLCAwLCBzaXplb2Yoc3RydWN0IGV0aHRvb2xfZHJ2aW5mbykpOwogCXN0cm5jcHkoZHJ2aW5mby0+ZHJpdmVyLCBzcGlkZXJfbmV0X2RyaXZlcl9uYW1lLCAzMik7Ci0Jc3RybmNweShkcnZpbmZvLT52ZXJzaW9uLCAiMC4xIiwgMzIpOworCXN0cm5jcHkoZHJ2aW5mby0+dmVyc2lvbiwgVkVSU0lPTiwgMzIpOwogCXN0cmNweShkcnZpbmZvLT5md192ZXJzaW9uLCAibm8gaW5mb3JtYXRpb24iKTsKIAlzdHJuY3B5KGRydmluZm8tPmJ1c19pbmZvLCBwY2lfbmFtZShjYXJkLT5wZGV2KSwgMzIpOwogfQpAQCAtMTU4LDkgKzE1OCw5IEBACiAJc3RydWN0IHNwaWRlcl9uZXRfY2FyZCAqY2FyZCA9IG5ldGRldi0+cHJpdjsKIAogCWVyaW5nLT50eF9tYXhfcGVuZGluZyA9IFNQSURFUl9ORVRfVFhfREVTQ1JJUFRPUlNfTUFYOwotCWVyaW5nLT50eF9wZW5kaW5nID0gY2FyZC0+dHhfZGVzYzsKKwllcmluZy0+dHhfcGVuZGluZyA9IGNhcmQtPm51bV90eF9kZXNjOwogCWVyaW5nLT5yeF9tYXhfcGVuZGluZyA9IFNQSURFUl9ORVRfUlhfREVTQ1JJUFRPUlNfTUFYOwotCWVyaW5nLT5yeF9wZW5kaW5nID0gY2FyZC0+cnhfZGVzYzsKKwllcmluZy0+cnhfcGVuZGluZyA9IGNhcmQtPm51bV9yeF9kZXNjOwogfQogCiBzdGF0aWMgaW50IHNwaWRlcl9uZXRfZ2V0X3N0YXRzX2NvdW50KHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYpCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9zdW4zXzgyNTg2LmMgYi9kcml2ZXJzL25ldC9zdW4zXzgyNTg2LmMKaW5kZXggZDFkMTg4NS4uYTMyMjBhOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvc3VuM184MjU4Ni5jCisrKyBiL2RyaXZlcnMvbmV0L3N1bjNfODI1ODYuYwpAQCAtMzMwLDcgKzMzMCw3IEBACiBvdXQxOgogCWZyZWVfbmV0ZGV2KGRldik7CiBvdXQ6Ci0JaW91bm1hcCgodm9pZCAqKWlvYWRkcik7CisJaW91bm1hcCgodm9pZCBfX2lvbWVtICopaW9hZGRyKTsKIAlyZXR1cm4gRVJSX1BUUihlcnIpOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9zdW4zbGFuY2UuYyBiL2RyaXZlcnMvbmV0L3N1bjNsYW5jZS5jCmluZGV4IDkxYzc2NTQuLmI4NjVkYjMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3N1bjNsYW5jZS5jCisrKyBiL2RyaXZlcnMvbmV0L3N1bjNsYW5jZS5jCkBAIC0yODYsNyArMjg2LDcgQEAKIAogb3V0MToKICNpZmRlZiBDT05GSUdfU1VOMwotCWlvdW5tYXAoKHZvaWQgKilkZXYtPmJhc2VfYWRkcik7CisJaW91bm1hcCgodm9pZCBfX2lvbWVtICopZGV2LT5iYXNlX2FkZHIpOwogI2VuZGlmCiBvdXQ6CiAJZnJlZV9uZXRkZXYoZGV2KTsKQEAgLTMyNiw3ICszMjYsNyBAQAogCQlpb2FkZHJfcHJvYmVbMV0gPSB0bXAyOwogCiAjaWZkZWYgQ09ORklHX1NVTjMKLQkJaW91bm1hcCgodm9pZCAqKWlvYWRkcik7CisJCWlvdW5tYXAoKHZvaWQgX19pb21lbSAqKWlvYWRkcik7CiAjZW5kaWYKIAkJcmV0dXJuIDA7CiAJfQpAQCAtOTU2LDcgKzk1Niw3IEBACiB7CiAJdW5yZWdpc3Rlcl9uZXRkZXYoc3VuM2xhbmNlX2Rldik7CiAjaWZkZWYgQ09ORklHX1NVTjMKLQlpb3VubWFwKCh2b2lkICopc3VuM2xhbmNlX2Rldi0+YmFzZV9hZGRyKTsKKwlpb3VubWFwKCh2b2lkIF9faW9tZW0gKilzdW4zbGFuY2VfZGV2LT5iYXNlX2FkZHIpOwogI2VuZGlmCiAJZnJlZV9uZXRkZXYoc3VuM2xhbmNlX2Rldik7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9zdW5ibWFjLmMgYi9kcml2ZXJzL25ldC9zdW5ibWFjLmMKaW5kZXggNjQzOWIwYy4uMThmODg4NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvc3VuYm1hYy5jCisrKyBiL2RyaXZlcnMvbmV0L3N1bmJtYWMuYwpAQCAtNDIsNyArNDIsNyBAQAogI2RlZmluZSBEUlZfUkVMREFURQkiMTEvMjQvMDMiCiAjZGVmaW5lIERSVl9BVVRIT1IJIkRhdmlkIFMuIE1pbGxlciAoZGF2ZW1AcmVkaGF0LmNvbSkiCiAKLXN0YXRpYyBjaGFyIHZlcnNpb25bXSBfX2luaXRkYXRhID0KK3N0YXRpYyBjaGFyIHZlcnNpb25bXSA9CiAJRFJWX05BTUUgIi5jOnYiIERSVl9WRVJTSU9OICIgIiBEUlZfUkVMREFURSAiICIgRFJWX0FVVEhPUiAiXG4iOwogCiBNT0RVTEVfVkVSU0lPTihEUlZfVkVSU0lPTik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC90ZzMuYyBiL2RyaXZlcnMvbmV0L3RnMy5jCmluZGV4IDMyNzgzNmIuLmMyMGJiOTkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3RnMy5jCisrKyBiL2RyaXZlcnMvbmV0L3RnMy5jCkBAIC02OCw4ICs2OCw4IEBACiAKICNkZWZpbmUgRFJWX01PRFVMRV9OQU1FCQkidGczIgogI2RlZmluZSBQRlggRFJWX01PRFVMRV9OQU1FCSI6ICIKLSNkZWZpbmUgRFJWX01PRFVMRV9WRVJTSU9OCSIzLjY2IgotI2RlZmluZSBEUlZfTU9EVUxFX1JFTERBVEUJIlNlcHRlbWJlciAyMywgMjAwNiIKKyNkZWZpbmUgRFJWX01PRFVMRV9WRVJTSU9OCSIzLjY5IgorI2RlZmluZSBEUlZfTU9EVUxFX1JFTERBVEUJIk5vdmVtYmVyIDE1LCAyMDA2IgogCiAjZGVmaW5lIFRHM19ERUZfTUFDX01PREUJMAogI2RlZmluZSBURzNfREVGX1JYX01PREUJCTAKQEAgLTEyOSw3ICsxMjksNyBAQAogI2RlZmluZSBSWF9KVU1CT19QS1RfQlVGX1NaCSg5MDQ2ICsgdHAtPnJ4X29mZnNldCArIDY0KQogCiAvKiBtaW5pbXVtIG51bWJlciBvZiBmcmVlIFRYIGRlc2NyaXB0b3JzIHJlcXVpcmVkIHRvIHdha2UgdXAgVFggcHJvY2VzcyAqLwotI2RlZmluZSBURzNfVFhfV0FLRVVQX1RIUkVTSAkJKFRHM19UWF9SSU5HX1NJWkUgLyA0KQorI2RlZmluZSBURzNfVFhfV0FLRVVQX1RIUkVTSCh0cCkJCSgodHApLT50eF9wZW5kaW5nIC8gNCkKIAogLyogbnVtYmVyIG9mIEVUSFRPT0xfR1NUQVRTIHU2NCdzICovCiAjZGVmaW5lIFRHM19OVU1fU1RBVFMJCShzaXplb2Yoc3RydWN0IHRnM19ldGh0b29sX3N0YXRzKS9zaXplb2YodTY0KSkKQEAgLTMwNzUsMTAgKzMwNzUsMTAgQEAKIAlzbXBfbWIoKTsKIAogCWlmICh1bmxpa2VseShuZXRpZl9xdWV1ZV9zdG9wcGVkKHRwLT5kZXYpICYmCi0JCSAgICAgKHRnM190eF9hdmFpbCh0cCkgPiBURzNfVFhfV0FLRVVQX1RIUkVTSCkpKSB7CisJCSAgICAgKHRnM190eF9hdmFpbCh0cCkgPiBURzNfVFhfV0FLRVVQX1RIUkVTSCh0cCkpKSkgewogCQluZXRpZl90eF9sb2NrKHRwLT5kZXYpOwogCQlpZiAobmV0aWZfcXVldWVfc3RvcHBlZCh0cC0+ZGV2KSAmJgotCQkgICAgKHRnM190eF9hdmFpbCh0cCkgPiBURzNfVFhfV0FLRVVQX1RIUkVTSCkpCisJCSAgICAodGczX3R4X2F2YWlsKHRwKSA+IFRHM19UWF9XQUtFVVBfVEhSRVNIKHRwKSkpCiAJCQluZXRpZl93YWtlX3F1ZXVlKHRwLT5kZXYpOwogCQluZXRpZl90eF91bmxvY2sodHAtPmRldik7CiAJfQpAQCAtMzkyOCw3ICszOTI4LDcgQEAKIAl0cC0+dHhfcHJvZCA9IGVudHJ5OwogCWlmICh1bmxpa2VseSh0ZzNfdHhfYXZhaWwodHApIDw9IChNQVhfU0tCX0ZSQUdTICsgMSkpKSB7CiAJCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKLQkJaWYgKHRnM190eF9hdmFpbCh0cCkgPiBURzNfVFhfV0FLRVVQX1RIUkVTSCkKKwkJaWYgKHRnM190eF9hdmFpbCh0cCkgPiBURzNfVFhfV0FLRVVQX1RIUkVTSCh0cCkpCiAJCQluZXRpZl93YWtlX3F1ZXVlKHRwLT5kZXYpOwogCX0KIApAQCAtNDE0Myw3ICs0MTQzLDcgQEAKIAl0cC0+dHhfcHJvZCA9IGVudHJ5OwogCWlmICh1bmxpa2VseSh0ZzNfdHhfYXZhaWwodHApIDw9IChNQVhfU0tCX0ZSQUdTICsgMSkpKSB7CiAJCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKLQkJaWYgKHRnM190eF9hdmFpbCh0cCkgPiBURzNfVFhfV0FLRVVQX1RIUkVTSCkKKwkJaWYgKHRnM190eF9hdmFpbCh0cCkgPiBURzNfVFhfV0FLRVVQX1RIUkVTSCh0cCkpCiAJCQluZXRpZl93YWtlX3F1ZXVlKHRwLT5kZXYpOwogCX0KIApAQCAtNDcyOCwxMCArNDcyOCwxMSBAQAogCXUzMiB2YWw7CiAKIAlpZiAoR0VUX0FTSUNfUkVWKHRwLT5wY2lfY2hpcF9yZXZfaWQpID09IEFTSUNfUkVWXzU5MDYpIHsKLQkJZm9yIChpID0gMDsgaSA8IDQwMDsgaSsrKSB7CisJCS8qIFdhaXQgdXAgdG8gMjBtcyBmb3IgaW5pdCBkb25lLiAqLworCQlmb3IgKGkgPSAwOyBpIDwgMjAwOyBpKyspIHsKIAkJCWlmICh0cjMyKFZDUFVfU1RBVFVTKSAmIFZDUFVfU1RBVFVTX0lOSVRfRE9ORSkKIAkJCQlyZXR1cm4gMDsKLQkJCXVkZWxheSgxMCk7CisJCQl1ZGVsYXkoMTAwKTsKIAkJfQogCQlyZXR1cm4gLUVOT0RFVjsKIAl9CkBAIC02MDE0LDcgKzYwMTUsNyBAQAogCQl0ZzNfYWJvcnRfaHcodHAsIDEpOwogCX0KIAotCWlmICgodHAtPnRnM19mbGFnczIgJiBURzNfRkxHMl9NSUlfU0VSREVTKSAmJiByZXNldF9waHkpCisJaWYgKHJlc2V0X3BoeSkKIAkJdGczX3BoeV9yZXNldCh0cCk7CiAKIAllcnIgPSB0ZzNfY2hpcF9yZXNldCh0cCk7CkBAIC02NTc0LDcgKzY1NzUsNyBAQAogCQl0dzMyKEdSQ19MT0NBTF9DVFJMLCB0cC0+Z3JjX2xvY2FsX2N0cmwpOwogCX0KIAotCWVyciA9IHRnM19zZXR1cF9waHkodHAsIHJlc2V0X3BoeSk7CisJZXJyID0gdGczX3NldHVwX3BoeSh0cCwgMCk7CiAJaWYgKGVycikKIAkJcmV0dXJuIGVycjsKIApAQCAtNjk3OCw4ICs2OTc5LDEwIEBACiAJdGczX2Z1bGxfbG9jayh0cCwgMCk7CiAKIAllcnIgPSB0ZzNfc2V0X3Bvd2VyX3N0YXRlKHRwLCBQQ0lfRDApOwotCWlmIChlcnIpCisJaWYgKGVycikgeworCQl0ZzNfZnVsbF91bmxvY2sodHApOwogCQlyZXR1cm4gZXJyOworCX0KIAogCXRnM19kaXNhYmxlX2ludHModHApOwogCXRwLT50ZzNfZmxhZ3MgJj0gflRHM19GTEFHX0lOSVRfQ09NUExFVEU7CkBAIC04MTA2LDcgKzgxMDksMTAgQEAKIAogCWlmICgoZXJpbmctPnJ4X3BlbmRpbmcgPiBURzNfUlhfUklOR19TSVpFIC0gMSkgfHwKIAkgICAgKGVyaW5nLT5yeF9qdW1ib19wZW5kaW5nID4gVEczX1JYX0pVTUJPX1JJTkdfU0laRSAtIDEpIHx8Ci0JICAgIChlcmluZy0+dHhfcGVuZGluZyA+IFRHM19UWF9SSU5HX1NJWkUgLSAxKSkKKwkgICAgKGVyaW5nLT50eF9wZW5kaW5nID4gVEczX1RYX1JJTkdfU0laRSAtIDEpIHx8CisJICAgIChlcmluZy0+dHhfcGVuZGluZyA8PSBNQVhfU0tCX0ZSQUdTKSB8fAorCSAgICAoKHRwLT50ZzNfZmxhZ3MyICYgVEczX0ZMRzJfSFdfVFNPXzFfQlVHKSAmJgorCSAgICAgKGVyaW5nLT50eF9wZW5kaW5nIDw9IChNQVhfU0tCX0ZSQUdTICogMykpKSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKIAlpZiAobmV0aWZfcnVubmluZyhkZXYpKSB7CkBAIC0xMDIwOSw3ICsxMDIxNSw3IEBACiBzdGF0aWMgdm9pZCBfX2RldmluaXQgdGczX3JlYWRfcGFydG5vKHN0cnVjdCB0ZzMgKnRwKQogewogCXVuc2lnbmVkIGNoYXIgdnBkX2RhdGFbMjU2XTsKLQlpbnQgaTsKKwl1bnNpZ25lZCBpbnQgaTsKIAl1MzIgbWFnaWM7CiAKIAlpZiAodGczX252cmFtX3JlYWRfc3dhYih0cCwgMHgwLCAmbWFnaWMpKQpAQCAtMTAyNTUsOSArMTAyNjEsOSBAQAogCX0KIAogCS8qIE5vdyBwYXJzZSBhbmQgZmluZCB0aGUgcGFydCBudW1iZXIuICovCi0JZm9yIChpID0gMDsgaSA8IDI1NjsgKSB7CisJZm9yIChpID0gMDsgaSA8IDI1NDsgKSB7CiAJCXVuc2lnbmVkIGNoYXIgdmFsID0gdnBkX2RhdGFbaV07Ci0JCWludCBibG9ja19lbmQ7CisJCXVuc2lnbmVkIGludCBibG9ja19lbmQ7CiAKIAkJaWYgKHZhbCA9PSAweDgyIHx8IHZhbCA9PSAweDkxKSB7CiAJCQlpID0gKGkgKyAzICsKQEAgLTEwMjczLDIxICsxMDI3OSwyNiBAQAogCQkJICAgICAodnBkX2RhdGFbaSArIDFdICsKIAkJCSAgICAgICh2cGRfZGF0YVtpICsgMl0gPDwgOCkpKTsKIAkJaSArPSAzOwotCQl3aGlsZSAoaSA8IGJsb2NrX2VuZCkgeworCisJCWlmIChibG9ja19lbmQgPiAyNTYpCisJCQlnb3RvIG91dF9ub3RfZm91bmQ7CisKKwkJd2hpbGUgKGkgPCAoYmxvY2tfZW5kIC0gMikpIHsKIAkJCWlmICh2cGRfZGF0YVtpICsgMF0gPT0gJ1AnICYmCiAJCQkgICAgdnBkX2RhdGFbaSArIDFdID09ICdOJykgewogCQkJCWludCBwYXJ0bm9fbGVuID0gdnBkX2RhdGFbaSArIDJdOwogCi0JCQkJaWYgKHBhcnRub19sZW4gPiAyNCkKKwkJCQlpICs9IDM7CisJCQkJaWYgKHBhcnRub19sZW4gPiAyNCB8fCAocGFydG5vX2xlbiArIGkpID4gMjU2KQogCQkJCQlnb3RvIG91dF9ub3RfZm91bmQ7CiAKIAkJCQltZW1jcHkodHAtPmJvYXJkX3BhcnRfbnVtYmVyLAotCQkJCSAgICAgICAmdnBkX2RhdGFbaSArIDNdLAotCQkJCSAgICAgICBwYXJ0bm9fbGVuKTsKKwkJCQkgICAgICAgJnZwZF9kYXRhW2ldLCBwYXJ0bm9fbGVuKTsKIAogCQkJCS8qIFN1Y2Nlc3MuICovCiAJCQkJcmV0dXJuOwogCQkJfQorCQkJaSArPSAzICsgdnBkX2RhdGFbaSArIDJdOwogCQl9CiAKIAkJLyogUGFydCBudW1iZXIgbm90IGZvdW5kLiAqLwpAQCAtMTAzNTcsNyArMTAzNjgsNyBAQAogCXUzMiBwY2lfc3RhdGVfcmVnLCBncmNfbWlzY19jZmc7CiAJdTMyIHZhbDsKIAl1MTYgcGNpX2NtZDsKLQlpbnQgZXJyOworCWludCBlcnIsIHBjaWVfY2FwOwogCiAJLyogRm9yY2UgbWVtb3J5IHdyaXRlIGludmFsaWRhdGUgb2ZmLiAgSWYgd2UgbGVhdmUgaXQgb24sCiAJICogdGhlbiBvbiA1NzAwX0JYIGNoaXBzIHdlIGhhdmUgdG8gZW5hYmxlIGEgd29ya2Fyb3VuZC4KQEAgLTEwNTMyLDggKzEwNTQzLDE5IEBACiAJICAgIEdFVF9BU0lDX1JFVih0cC0+cGNpX2NoaXBfcmV2X2lkKSAhPSBBU0lDX1JFVl81OTA2KQogCQl0cC0+dGczX2ZsYWdzMiB8PSBURzNfRkxHMl9KVU1CT19DQVBBQkxFOwogCi0JaWYgKHBjaV9maW5kX2NhcGFiaWxpdHkodHAtPnBkZXYsIFBDSV9DQVBfSURfRVhQKSAhPSAwKQorCXBjaWVfY2FwID0gcGNpX2ZpbmRfY2FwYWJpbGl0eSh0cC0+cGRldiwgUENJX0NBUF9JRF9FWFApOworCWlmIChwY2llX2NhcCAhPSAwKSB7CiAJCXRwLT50ZzNfZmxhZ3MyIHw9IFRHM19GTEcyX1BDSV9FWFBSRVNTOworCQlpZiAoR0VUX0FTSUNfUkVWKHRwLT5wY2lfY2hpcF9yZXZfaWQpID09IEFTSUNfUkVWXzU5MDYpIHsKKwkJCXUxNiBsbmtjdGw7CisKKwkJCXBjaV9yZWFkX2NvbmZpZ193b3JkKHRwLT5wZGV2LAorCQkJCQkgICAgIHBjaWVfY2FwICsgUENJX0VYUF9MTktDVEwsCisJCQkJCSAgICAgJmxua2N0bCk7CisJCQlpZiAobG5rY3RsICYgUENJX0VYUF9MTktDVExfQ0xLUkVRX0VOKQorCQkJCXRwLT50ZzNfZmxhZ3MyICY9IH5URzNfRkxHMl9IV19UU09fMjsKKwkJfQorCX0KIAogCS8qIElmIHdlIGhhdmUgYW4gQU1EIDc2MiBvciBWSUEgSzhUODAwIGNoaXBzZXQsIHdyaXRlCiAJICogcmVvcmRlcmluZyB0byB0aGUgbWFpbGJveCByZWdpc3RlcnMgZG9uZSBieSB0aGUgaG9zdApAQCAtMTE4MDAsNiArMTE4MjIsNyBAQAogCWVsc2UgaWYgKEdFVF9BU0lDX1JFVih0cC0+cGNpX2NoaXBfcmV2X2lkKSA9PSBBU0lDX1JFVl81NzAwIHx8CiAJICAgIEdFVF9BU0lDX1JFVih0cC0+cGNpX2NoaXBfcmV2X2lkKSA9PSBBU0lDX1JFVl81NzAxIHx8CiAJICAgIHRwLT5wY2lfY2hpcF9yZXZfaWQgPT0gQ0hJUFJFVl9JRF81NzA1X0EwIHx8CisJICAgIEdFVF9BU0lDX1JFVih0cC0+cGNpX2NoaXBfcmV2X2lkKSA9PSBBU0lDX1JFVl81OTA2IHx8CiAJICAgICh0cC0+dGczX2ZsYWdzICYgVEczX0ZMQUdfRU5BQkxFX0FTRikgIT0gMCkgewogCQl0cC0+dGczX2ZsYWdzMiAmPSB+VEczX0ZMRzJfVFNPX0NBUEFCTEU7CiAJfSBlbHNlIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3Rva2VucmluZy9wcm90ZW9uLmMgYi9kcml2ZXJzL25ldC90b2tlbnJpbmcvcHJvdGVvbi5jCmluZGV4IDRmNzU2OTYuLmNiN2RiYjYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3Rva2VucmluZy9wcm90ZW9uLmMKKysrIGIvZHJpdmVycy9uZXQvdG9rZW5yaW5nL3Byb3Rlb24uYwpAQCAtMzcwLDYgKzM3MCwxMCBAQAogCQlkZXYtPmRtYSA9IGRtYVtpXTsKIAkJcGRldiA9IHBsYXRmb3JtX2RldmljZV9yZWdpc3Rlcl9zaW1wbGUoInByb3Rlb24iLAogCQkJaSwgTlVMTCwgMCk7CisJCWlmIChJU19FUlIocGRldikpIHsKKwkJCWZyZWVfbmV0ZGV2KGRldik7CisJCQljb250aW51ZTsKKwkJfQogCQllcnIgPSBzZXR1cF9jYXJkKGRldiwgJnBkZXYtPmRldik7CiAJCWlmICghZXJyKSB7CiAJCQlwcm90ZW9uX2RldltpXSA9IHBkZXY7CkBAIC0zODUsOSArMzg5LDEwIEBACiAJLyogUHJvYmUgZm9yIGNhcmRzLiAqLwogCWlmIChudW0gPT0gMCkgewogCQlwcmludGsoS0VSTl9OT1RJQ0UgInByb3Rlb24uYzogTm8gY2FyZHMgZm91bmQuXG4iKTsKLQkJcmV0dXJuICgtRU5PREVWKTsKKwkJcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJnByb3Rlb25fZHJpdmVyKTsKKwkJcmV0dXJuIC1FTk9ERVY7CiAJfQotCXJldHVybiAoMCk7CisJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyB2b2lkIF9fZXhpdCBwcm90ZW9uX2NsZWFudXAodm9pZCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3Rva2VucmluZy9za2lzYS5jIGIvZHJpdmVycy9uZXQvdG9rZW5yaW5nL3NraXNhLmMKaW5kZXggZDZiYTQxYy4uMzNhZmVhMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvdG9rZW5yaW5nL3NraXNhLmMKKysrIGIvZHJpdmVycy9uZXQvdG9rZW5yaW5nL3NraXNhLmMKQEAgLTM4MCw2ICszODAsMTAgQEAKIAkJZGV2LT5kbWEgPSBkbWFbaV07CiAJCXBkZXYgPSBwbGF0Zm9ybV9kZXZpY2VfcmVnaXN0ZXJfc2ltcGxlKCJza2lzYSIsCiAJCQlpLCBOVUxMLCAwKTsKKwkJaWYgKElTX0VSUihwZGV2KSkgeworCQkJZnJlZV9uZXRkZXYoZGV2KTsKKwkJCWNvbnRpbnVlOworCQl9CiAJCWVyciA9IHNldHVwX2NhcmQoZGV2LCAmcGRldi0+ZGV2KTsKIAkJaWYgKCFlcnIpIHsKIAkJCXNrX2lzYV9kZXZbaV0gPSBwZGV2OwpAQCAtMzk1LDkgKzM5OSwxMCBAQAogCS8qIFByb2JlIGZvciBjYXJkcy4gKi8KIAlpZiAobnVtID09IDApIHsKIAkJcHJpbnRrKEtFUk5fTk9USUNFICJza2lzYS5jOiBObyBjYXJkcyBmb3VuZC5cbiIpOwotCQlyZXR1cm4gKC1FTk9ERVYpOworCQlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3Rlcigmc2tfaXNhX2RyaXZlcik7CisJCXJldHVybiAtRU5PREVWOwogCX0KLQlyZXR1cm4gKDApOworCXJldHVybiAwOwogfQogCiBzdGF0aWMgdm9pZCBfX2V4aXQgc2tfaXNhX2NsZWFudXAodm9pZCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3R1bGlwL2RlMjEwNHguYyBiL2RyaXZlcnMvbmV0L3R1bGlwL2RlMjEwNHguYwppbmRleCAyY2ZkOTYzLi5mNmIzYTk0IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC90dWxpcC9kZTIxMDR4LmMKKysrIGIvZHJpdmVycy9uZXQvdHVsaXAvZGUyMTA0eC5jCkBAIC0xNzMwLDcgKzE3MzAsNyBAQAogfQogCiAvKiBOb3RlOiB0aGlzIHJvdXRpbmUgcmV0dXJucyBleHRyYSBkYXRhIGJpdHMgZm9yIHNpemUgZGV0ZWN0aW9uLiAqLwotc3RhdGljIHVuc2lnbmVkIF9faW5pdCB0dWxpcF9yZWFkX2VlcHJvbSh2b2lkIF9faW9tZW0gKnJlZ3MsIGludCBsb2NhdGlvbiwgaW50IGFkZHJfbGVuKQorc3RhdGljIHVuc2lnbmVkIF9fZGV2aW5pdCB0dWxpcF9yZWFkX2VlcHJvbSh2b2lkIF9faW9tZW0gKnJlZ3MsIGludCBsb2NhdGlvbiwgaW50IGFkZHJfbGVuKQogewogCWludCBpOwogCXVuc2lnbmVkIHJldHZhbCA9IDA7CkBAIC0xOTI2LDcgKzE5MjYsNyBAQAogCWdvdG8gZmlsbF9kZWZhdWx0czsKIH0KIAotc3RhdGljIGludCBfX2luaXQgZGVfaW5pdF9vbmUgKHN0cnVjdCBwY2lfZGV2ICpwZGV2LAorc3RhdGljIGludCBfX2RldmluaXQgZGVfaW5pdF9vbmUgKHN0cnVjdCBwY2lfZGV2ICpwZGV2LAogCQkJCSAgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmVudCkKIHsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OwpAQCAtMjA4Miw3ICsyMDgyLDcgQEAKIAlyZXR1cm4gcmM7CiB9CiAKLXN0YXRpYyB2b2lkIF9fZXhpdCBkZV9yZW1vdmVfb25lIChzdHJ1Y3QgcGNpX2RldiAqcGRldikKK3N0YXRpYyB2b2lkIF9fZGV2ZXhpdCBkZV9yZW1vdmVfb25lIChzdHJ1Y3QgcGNpX2RldiAqcGRldikKIHsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOwogCXN0cnVjdCBkZV9wcml2YXRlICpkZSA9IGRldi0+cHJpdjsKQEAgLTIxNjQsNyArMjE2NCw3IEBACiAJLm5hbWUJCT0gRFJWX05BTUUsCiAJLmlkX3RhYmxlCT0gZGVfcGNpX3RibCwKIAkucHJvYmUJCT0gZGVfaW5pdF9vbmUsCi0JLnJlbW92ZQkJPSBfX2V4aXRfcChkZV9yZW1vdmVfb25lKSwKKwkucmVtb3ZlCQk9IF9fZGV2ZXhpdF9wKGRlX3JlbW92ZV9vbmUpLAogI2lmZGVmIENPTkZJR19QTQogCS5zdXNwZW5kCT0gZGVfc3VzcGVuZCwKIAkucmVzdW1lCQk9IGRlX3Jlc3VtZSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3VjY19nZXRoLmMgYi9kcml2ZXJzL25ldC91Y2NfZ2V0aC5jCmluZGV4IDEyY2Q3YjUuLmIzNzg4ODAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3VjY19nZXRoLmMKKysrIGIvZHJpdmVycy9uZXQvdWNjX2dldGguYwpAQCAtMiwxNCArMiwxMSBAQAogICogQ29weXJpZ2h0IChDKSBGcmVlc2NhbGUgU2VtaWNvbmR1dG9yLCBJbmMuIDIwMDYuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogQXV0aG9yOiBTaGxvbWkgR3JpZGlzaCA8Z3JpZGlzaEBmcmVlc2NhbGUuY29tPgorICoJICAgTGkgWWFuZyA8bGVvbGlAZnJlZXNjYWxlLmNvbT4KICAqCiAgKiBEZXNjcmlwdGlvbjoKICAqIFFFIFVDQyBHaWdhYml0IEV0aGVybmV0IERyaXZlcgogICoKLSAqIENoYW5nZWxvZzoKLSAqIEp1bCA2LCAyMDA2IExpIFlhbmcgPExlb0xpQGZyZWVzY2FsZS5jb20+Ci0gKiAtIFJlYXJyYW5nZSBjb2RlIGFuZCBzdHlsZSBmaXhlcwotICoKICAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSAgaXQgYW5kL29yIG1vZGlmeSBpdAogICogdW5kZXIgIHRoZSB0ZXJtcyBvZiAgdGhlIEdOVSBHZW5lcmFsICBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCiAgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247ICBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSAgTGljZW5zZSwgb3IgKGF0IHlvdXIKQEAgLTMxLDkgKzI4LDkgQEAKICNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgogI2luY2x1ZGUgPGxpbnV4L2ZzbF9kZXZpY2VzLmg+CiAjaW5jbHVkZSA8bGludXgvZXRodG9vbC5oPgotI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L21paS5oPgogCisjaW5jbHVkZSA8YXNtL29mX2RldmljZS5oPgogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CiAjaW5jbHVkZSA8YXNtL2lycS5oPgogI2luY2x1ZGUgPGFzbS9pby5oPgpAQCAtNzAsNyArNjcsNyBAQAogCiBzdGF0aWMgREVGSU5FX1NQSU5MT0NLKHVnZXRoX2xvY2spOwogCi1zdGF0aWMgdWNjX2dldGhfaW5mb190IHVnZXRoX3ByaW1hcnlfaW5mbyA9IHsKK3N0YXRpYyBzdHJ1Y3QgdWNjX2dldGhfaW5mbyB1Z2V0aF9wcmltYXJ5X2luZm8gPSB7CiAJLnVmX2luZm8gPSB7CiAJCSAgICAuYmRfbWVtX3BhcnQgPSBNRU1fUEFSVF9TWVNURU0sCiAJCSAgICAucnRzbSA9IFVDQ19GQVNUX1NFTkRfSURMRVNfQkVUV0VFTl9GUkFNRVMsCkBAIC0xNjMsNyArMTYwLDcgQEAKIAkucmlzY1J4ID0gUUVfUklTQ19BTExPQ0FUSU9OX1JJU0MxX0FORF9SSVNDMiwKIH07CiAKLXN0YXRpYyB1Y2NfZ2V0aF9pbmZvX3QgdWdldGhfaW5mb1s4XTsKK3N0YXRpYyBzdHJ1Y3QgdWNjX2dldGhfaW5mbyB1Z2V0aF9pbmZvWzhdOwogCiAjaWZkZWYgREVCVUcKIHN0YXRpYyB2b2lkIG1lbV9kaXNwKHU4ICphZGRyLCBpbnQgc2l6ZSkKQEAgLTIxOSw4ICsyMTYsOCBAQAogCX0KIH0KIAotc3RhdGljIGludCBnZXRfaW50ZXJmYWNlX2RldGFpbHMoZW5ldF9pbnRlcmZhY2VfZSBlbmV0X2ludGVyZmFjZSwKLQkJCQkgZW5ldF9zcGVlZF9lICpzcGVlZCwKK3N0YXRpYyBpbnQgZ2V0X2ludGVyZmFjZV9kZXRhaWxzKGVudW0gZW5ldF9pbnRlcmZhY2UgZW5ldF9pbnRlcmZhY2UsCisJCQkJIGVudW0gZW5ldF9zcGVlZCAqc3BlZWQsCiAJCQkJIGludCAqcjEwbSwKIAkJCQkgaW50ICpybW0sCiAJCQkJIGludCAqcnBtLApAQCAtMjgzLDcgKzI4MCw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBzdHJ1Y3Qgc2tfYnVmZiAqZ2V0X25ld19za2IodWNjX2dldGhfcHJpdmF0ZV90ICp1Z2V0aCwgdTggKmJkKQorc3RhdGljIHN0cnVjdCBza19idWZmICpnZXRfbmV3X3NrYihzdHJ1Y3QgdWNjX2dldGhfcHJpdmF0ZSAqdWdldGgsIHU4ICpiZCkKIHsKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gTlVMTDsKIApAQCAtMzAzLDIxICszMDAsMTkgQEAKIAogCXNrYi0+ZGV2ID0gdWdldGgtPmRldjsKIAotCUJEX0JVRkZFUl9TRVQoYmQsCisJb3V0X2JlMzIoJigoc3RydWN0IHFlX2JkICopYmQpLT5idWYsCiAJCSAgICAgIGRtYV9tYXBfc2luZ2xlKE5VTEwsCiAJCQkJICAgICBza2ItPmRhdGEsCiAJCQkJICAgICB1Z2V0aC0+dWdfaW5mby0+dWZfaW5mby5tYXhfcnhfYnVmX2xlbmd0aCArCiAJCQkJICAgICBVQ0NfR0VUSF9SWF9EQVRBX0JVRl9BTElHTk1FTlQsCiAJCQkJICAgICBETUFfRlJPTV9ERVZJQ0UpKTsKIAotCUJEX1NUQVRVU19BTkRfTEVOR1RIX1NFVChiZCwKLQkJCQkgKFJfRSB8IFJfSSB8Ci0JCQkJICAoQkRfU1RBVFVTX0FORF9MRU5HVEgoYmQpICYgUl9XKSkpOworCW91dF9iZTMyKCh1MzIgKiliZCwgKFJfRSB8IFJfSSB8IChpbl9iZTMyKCh1MzIgKiliZCkgJiBSX1cpKSk7CiAKIAlyZXR1cm4gc2tiOwogfQogCi1zdGF0aWMgaW50IHJ4X2JkX2J1ZmZlcl9zZXQodWNjX2dldGhfcHJpdmF0ZV90ICp1Z2V0aCwgdTggcnhRKQorc3RhdGljIGludCByeF9iZF9idWZmZXJfc2V0KHN0cnVjdCB1Y2NfZ2V0aF9wcml2YXRlICp1Z2V0aCwgdTggcnhRKQogewogCXU4ICpiZDsKIAl1MzIgYmRfc3RhdHVzOwpAQCAtMzI4LDcgKzMyMyw3IEBACiAJaSA9IDA7CiAKIAlkbyB7Ci0JCWJkX3N0YXR1cyA9IEJEX1NUQVRVU19BTkRfTEVOR1RIKGJkKTsKKwkJYmRfc3RhdHVzID0gaW5fYmUzMigodTMyKiliZCk7CiAJCXNrYiA9IGdldF9uZXdfc2tiKHVnZXRoLCBiZCk7CiAKIAkJaWYgKCFza2IpCS8qIElmIGNhbiBub3QgYWxsb2NhdGUgZGF0YSBidWZmZXIsCkBAIC0zMzgsMTkgKzMzMywxOSBAQAogCQl1Z2V0aC0+cnhfc2tidWZmW3J4UV1baV0gPSBza2I7CiAKIAkJLyogYWR2YW5jZSB0aGUgQkQgcG9pbnRlciAqLwotCQliZCArPSBVQ0NfR0VUSF9TSVpFX09GX0JEOworCQliZCArPSBzaXplb2Yoc3RydWN0IHFlX2JkKTsKIAkJaSsrOwogCX0gd2hpbGUgKCEoYmRfc3RhdHVzICYgUl9XKSk7CiAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBmaWxsX2luaXRfZW5ldF9lbnRyaWVzKHVjY19nZXRoX3ByaXZhdGVfdCAqdWdldGgsCitzdGF0aWMgaW50IGZpbGxfaW5pdF9lbmV0X2VudHJpZXMoc3RydWN0IHVjY19nZXRoX3ByaXZhdGUgKnVnZXRoLAogCQkJCSAgdm9sYXRpbGUgdTMyICpwX3N0YXJ0LAogCQkJCSAgdTggbnVtX2VudHJpZXMsCiAJCQkJICB1MzIgdGhyZWFkX3NpemUsCiAJCQkJICB1MzIgdGhyZWFkX2FsaWdubWVudCwKLQkJCQkgIHFlX3Jpc2NfYWxsb2NhdGlvbl9lIHJpc2MsCisJCQkJICBlbnVtIHFlX3Jpc2NfYWxsb2NhdGlvbiByaXNjLAogCQkJCSAgaW50IHNraXBfcGFnZV9mb3JfZmlyc3RfZW50cnkpCiB7CiAJdTMyIGluaXRfZW5ldF9vZmZzZXQ7CkBAIC0zODMsMTAgKzM3OCwxMCBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IHJldHVybl9pbml0X2VuZXRfZW50cmllcyh1Y2NfZ2V0aF9wcml2YXRlX3QgKnVnZXRoLAorc3RhdGljIGludCByZXR1cm5faW5pdF9lbmV0X2VudHJpZXMoc3RydWN0IHVjY19nZXRoX3ByaXZhdGUgKnVnZXRoLAogCQkJCSAgICB2b2xhdGlsZSB1MzIgKnBfc3RhcnQsCiAJCQkJICAgIHU4IG51bV9lbnRyaWVzLAotCQkJCSAgICBxZV9yaXNjX2FsbG9jYXRpb25fZSByaXNjLAorCQkJCSAgICBlbnVtIHFlX3Jpc2NfYWxsb2NhdGlvbiByaXNjLAogCQkJCSAgICBpbnQgc2tpcF9wYWdlX2Zvcl9maXJzdF9lbnRyeSkKIHsKIAl1MzIgaW5pdF9lbmV0X29mZnNldDsKQEAgLTQxNiwxMSArNDExLDExIEBACiB9CiAKICNpZmRlZiBERUJVRwotc3RhdGljIGludCBkdW1wX2luaXRfZW5ldF9lbnRyaWVzKHVjY19nZXRoX3ByaXZhdGVfdCAqdWdldGgsCitzdGF0aWMgaW50IGR1bXBfaW5pdF9lbmV0X2VudHJpZXMoc3RydWN0IHVjY19nZXRoX3ByaXZhdGUgKnVnZXRoLAogCQkJCSAgdm9sYXRpbGUgdTMyICpwX3N0YXJ0LAogCQkJCSAgdTggbnVtX2VudHJpZXMsCiAJCQkJICB1MzIgdGhyZWFkX3NpemUsCi0JCQkJICBxZV9yaXNjX2FsbG9jYXRpb25fZSByaXNjLAorCQkJCSAgZW51bSBxZV9yaXNjX2FsbG9jYXRpb24gcmlzYywKIAkJCQkgIGludCBza2lwX3BhZ2VfZm9yX2ZpcnN0X2VudHJ5KQogewogCXUzMiBpbml0X2VuZXRfb2Zmc2V0OwpAQCAtNDU2LDE0ICs0NTEsMTQgQEAKICNlbmRpZgogCiAjaWZkZWYgQ09ORklHX1VHRVRIX0ZJTFRFUklORwotc3RhdGljIGVuZXRfYWRkcl9jb250YWluZXJfdCAqZ2V0X2VuZXRfYWRkcl9jb250YWluZXIodm9pZCkKK3N0YXRpYyBzdHJ1Y3QgZW5ldF9hZGRyX2NvbnRhaW5lciAqZ2V0X2VuZXRfYWRkcl9jb250YWluZXIodm9pZCkKIHsKLQllbmV0X2FkZHJfY29udGFpbmVyX3QgKmVuZXRfYWRkcl9jb250OworCXN0cnVjdCBlbmV0X2FkZHJfY29udGFpbmVyICplbmV0X2FkZHJfY29udDsKIAogCS8qIGFsbG9jYXRlIG1lbW9yeSAqLwotCWVuZXRfYWRkcl9jb250ID0ga21hbGxvYyhzaXplb2YoZW5ldF9hZGRyX2NvbnRhaW5lcl90KSwgR0ZQX0tFUk5FTCk7CisJZW5ldF9hZGRyX2NvbnQgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgZW5ldF9hZGRyX2NvbnRhaW5lciksIEdGUF9LRVJORUwpOwogCWlmICghZW5ldF9hZGRyX2NvbnQpIHsKLQkJdWdldGhfZXJyKCIlczogTm8gbWVtb3J5IGZvciBlbmV0X2FkZHJfY29udGFpbmVyX3Qgb2JqZWN0LiIsCisJCXVnZXRoX2VycigiJXM6IE5vIG1lbW9yeSBmb3IgZW5ldF9hZGRyX2NvbnRhaW5lciBvYmplY3QuIiwKIAkJCSAgX19GVU5DVElPTl9fKTsKIAkJcmV0dXJuIE5VTEw7CiAJfQpAQCAtNDcyLDQ1ICs0NjcsNDMgQEAKIH0KICNlbmRpZiAvKiBDT05GSUdfVUdFVEhfRklMVEVSSU5HICovCiAKLXN0YXRpYyB2b2lkIHB1dF9lbmV0X2FkZHJfY29udGFpbmVyKGVuZXRfYWRkcl9jb250YWluZXJfdCAqZW5ldF9hZGRyX2NvbnQpCitzdGF0aWMgdm9pZCBwdXRfZW5ldF9hZGRyX2NvbnRhaW5lcihzdHJ1Y3QgZW5ldF9hZGRyX2NvbnRhaW5lciAqZW5ldF9hZGRyX2NvbnQpCiB7CiAJa2ZyZWUoZW5ldF9hZGRyX2NvbnQpOwogfQogCi0jaWZkZWYgQ09ORklHX1VHRVRIX0ZJTFRFUklORwotc3RhdGljIGludCBod19hZGRfYWRkcl9pbl9wYWRkcih1Y2NfZ2V0aF9wcml2YXRlX3QgKnVnZXRoLAotCQkJCWVuZXRfYWRkcl90ICpwX2VuZXRfYWRkciwgdTggcGFkZHJfbnVtKQorc3RhdGljIGludCBzZXRfbWFjX2FkZHIoX19iZTE2IF9faW9tZW0gKnJlZywgdTggKm1hYykKIHsKLQl1Y2NfZ2V0aF84Mnh4X2FkZHJlc3NfZmlsdGVyaW5nX3ByYW1fdCAqcF84Mnh4X2FkZHJfZmlsdDsKKwlvdXRfYmUxNigmcmVnWzBdLCAoKHUxNiltYWNbNV0gPDwgOCkgfCBtYWNbNF0pOworCW91dF9iZTE2KCZyZWdbMV0sICgodTE2KW1hY1szXSA8PCA4KSB8IG1hY1syXSk7CisJb3V0X2JlMTYoJnJlZ1syXSwgKCh1MTYpbWFjWzFdIDw8IDgpIHwgbWFjWzBdKTsKK30KKworI2lmZGVmIENPTkZJR19VR0VUSF9GSUxURVJJTkcKK3N0YXRpYyBpbnQgaHdfYWRkX2FkZHJfaW5fcGFkZHIoc3RydWN0IHVjY19nZXRoX3ByaXZhdGUgKnVnZXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1OCAqcF9lbmV0X2FkZHIsIHU4IHBhZGRyX251bSkKK3sKKwlzdHJ1Y3QgdWNjX2dldGhfODJ4eF9hZGRyZXNzX2ZpbHRlcmluZ19wcmFtICpwXzgyeHhfYWRkcl9maWx0OwogCiAJaWYgKCEocGFkZHJfbnVtIDwgTlVNX09GX1BBRERSUykpIHsKLQkJdWdldGhfd2FybigiJXM6IElsbGFnZWwgcGFkZHJfbnVtLiIsIF9fRlVOQ1RJT05fXyk7CisJCXVnZXRoX3dhcm4oIiVzOiBJbGxlZ2FsIHBhZGRyX251bS4iLCBfX0ZVTkNUSU9OX18pOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKIAlwXzgyeHhfYWRkcl9maWx0ID0KLQkgICAgKHVjY19nZXRoXzgyeHhfYWRkcmVzc19maWx0ZXJpbmdfcHJhbV90ICopIHVnZXRoLT5wX3J4X2dsYmxfcHJhbS0+CisJICAgIChzdHJ1Y3QgdWNjX2dldGhfODJ4eF9hZGRyZXNzX2ZpbHRlcmluZ19wcmFtICopIHVnZXRoLT5wX3J4X2dsYmxfcHJhbS0+CiAJICAgIGFkZHJlc3NmaWx0ZXJpbmc7CiAKIAkvKiBFdGhlcm5ldCBmcmFtZXMgYXJlIGRlZmluZWQgaW4gTGl0dGxlIEVuZGlhbiBtb2RlLCAgICAqLwogCS8qIHRoZXJlZm9yZSB0byBpbnNlcnQgdGhlIGFkZHJlc3Mgd2UgcmV2ZXJzZSB0aGUgYnl0ZXMuICovCi0Jb3V0X2JlMTYoJnBfODJ4eF9hZGRyX2ZpbHQtPnBhZGRyW3BhZGRyX251bV0uaCwKLQkJICh1MTYpICgoKHUxNikgKCgodTE2KSAoKCpwX2VuZXRfYWRkcilbNV0pKSA8PCA4KSkgfAotCQkJKHUxNikgKCpwX2VuZXRfYWRkcilbNF0pKTsKLQlvdXRfYmUxNigmcF84Mnh4X2FkZHJfZmlsdC0+cGFkZHJbcGFkZHJfbnVtXS5tLAotCQkgKHUxNikgKCgodTE2KSAoKCh1MTYpICgoKnBfZW5ldF9hZGRyKVszXSkpIDw8IDgpKSB8Ci0JCQkodTE2KSAoKnBfZW5ldF9hZGRyKVsyXSkpOwotCW91dF9iZTE2KCZwXzgyeHhfYWRkcl9maWx0LT5wYWRkcltwYWRkcl9udW1dLmwsCi0JCSAodTE2KSAoKCh1MTYpICgoKHUxNikgKCgqcF9lbmV0X2FkZHIpWzFdKSkgPDwgOCkpIHwKLQkJCSh1MTYpICgqcF9lbmV0X2FkZHIpWzBdKSk7Ci0KKwlzZXRfbWFjX2FkZHIoJnBfODJ4eF9hZGRyX2ZpbHQtPnBhZGRyW3BhZGRyX251bV0uaCwgcF9lbmV0X2FkZHIpOwogCXJldHVybiAwOwogfQogI2VuZGlmIC8qIENPTkZJR19VR0VUSF9GSUxURVJJTkcgKi8KIAotc3RhdGljIGludCBod19jbGVhcl9hZGRyX2luX3BhZGRyKHVjY19nZXRoX3ByaXZhdGVfdCAqdWdldGgsIHU4IHBhZGRyX251bSkKK3N0YXRpYyBpbnQgaHdfY2xlYXJfYWRkcl9pbl9wYWRkcihzdHJ1Y3QgdWNjX2dldGhfcHJpdmF0ZSAqdWdldGgsIHU4IHBhZGRyX251bSkKIHsKLQl1Y2NfZ2V0aF84Mnh4X2FkZHJlc3NfZmlsdGVyaW5nX3ByYW1fdCAqcF84Mnh4X2FkZHJfZmlsdDsKKwlzdHJ1Y3QgdWNjX2dldGhfODJ4eF9hZGRyZXNzX2ZpbHRlcmluZ19wcmFtICpwXzgyeHhfYWRkcl9maWx0OwogCiAJaWYgKCEocGFkZHJfbnVtIDwgTlVNX09GX1BBRERSUykpIHsKIAkJdWdldGhfd2FybigiJXM6IElsbGFnZWwgcGFkZHJfbnVtLiIsIF9fRlVOQ1RJT05fXyk7CkBAIC01MTgsNyArNTExLDcgQEAKIAl9CiAKIAlwXzgyeHhfYWRkcl9maWx0ID0KLQkgICAgKHVjY19nZXRoXzgyeHhfYWRkcmVzc19maWx0ZXJpbmdfcHJhbV90ICopIHVnZXRoLT5wX3J4X2dsYmxfcHJhbS0+CisJICAgIChzdHJ1Y3QgdWNjX2dldGhfODJ4eF9hZGRyZXNzX2ZpbHRlcmluZ19wcmFtICopIHVnZXRoLT5wX3J4X2dsYmxfcHJhbS0+CiAJICAgIGFkZHJlc3NmaWx0ZXJpbmc7CiAKIAkvKiBXcml0aW5nIGFkZHJlc3MgZmYuZmYuZmYuZmYuZmYuZmYgZGlzYWJsZXMgYWRkcmVzcwpAQCAtNTMwLDE0ICs1MjMsMTQgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHZvaWQgaHdfYWRkX2FkZHJfaW5faGFzaCh1Y2NfZ2V0aF9wcml2YXRlX3QgKnVnZXRoLAotCQkJCWVuZXRfYWRkcl90ICpwX2VuZXRfYWRkcikKK3N0YXRpYyB2b2lkIGh3X2FkZF9hZGRyX2luX2hhc2goc3RydWN0IHVjY19nZXRoX3ByaXZhdGUgKnVnZXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1OCAqcF9lbmV0X2FkZHIpCiB7Ci0JdWNjX2dldGhfODJ4eF9hZGRyZXNzX2ZpbHRlcmluZ19wcmFtX3QgKnBfODJ4eF9hZGRyX2ZpbHQ7CisJc3RydWN0IHVjY19nZXRoXzgyeHhfYWRkcmVzc19maWx0ZXJpbmdfcHJhbSAqcF84Mnh4X2FkZHJfZmlsdDsKIAl1MzIgY2Vjcl9zdWJibG9jazsKIAogCXBfODJ4eF9hZGRyX2ZpbHQgPQotCSAgICAodWNjX2dldGhfODJ4eF9hZGRyZXNzX2ZpbHRlcmluZ19wcmFtX3QgKikgdWdldGgtPnBfcnhfZ2xibF9wcmFtLT4KKwkgICAgKHN0cnVjdCB1Y2NfZ2V0aF84Mnh4X2FkZHJlc3NfZmlsdGVyaW5nX3ByYW0gKikgdWdldGgtPnBfcnhfZ2xibF9wcmFtLT4KIAkgICAgYWRkcmVzc2ZpbHRlcmluZzsKIAogCWNlY3Jfc3ViYmxvY2sgPQpAQCAtNTQ2LDI1ICs1MzksMTggQEAKIAkvKiBFdGhlcm5ldCBmcmFtZXMgYXJlIGRlZmluZWQgaW4gTGl0dGxlIEVuZGlhbiBtb2RlLAogCXRoZXJlZm9yIHRvIGluc2VydCAqLwogCS8qIHRoZSBhZGRyZXNzIHRvIHRoZSBoYXNoIChCaWcgRW5kaWFuIG1vZGUpLCB3ZSByZXZlcnNlIHRoZSBieXRlcy4qLwotCW91dF9iZTE2KCZwXzgyeHhfYWRkcl9maWx0LT50YWRkci5oLAotCQkgKHUxNikgKCgodTE2KSAoKCh1MTYpICgoKnBfZW5ldF9hZGRyKVs1XSkpIDw8IDgpKSB8Ci0JCQkodTE2KSAoKnBfZW5ldF9hZGRyKVs0XSkpOwotCW91dF9iZTE2KCZwXzgyeHhfYWRkcl9maWx0LT50YWRkci5tLAotCQkgKHUxNikgKCgodTE2KSAoKCh1MTYpICgoKnBfZW5ldF9hZGRyKVszXSkpIDw8IDgpKSB8Ci0JCQkodTE2KSAoKnBfZW5ldF9hZGRyKVsyXSkpOwotCW91dF9iZTE2KCZwXzgyeHhfYWRkcl9maWx0LT50YWRkci5sLAotCQkgKHUxNikgKCgodTE2KSAoKCh1MTYpICgoKnBfZW5ldF9hZGRyKVsxXSkpIDw8IDgpKSB8Ci0JCQkodTE2KSAoKnBfZW5ldF9hZGRyKVswXSkpOworCisJc2V0X21hY19hZGRyKCZwXzgyeHhfYWRkcl9maWx0LT50YWRkci5oLCBwX2VuZXRfYWRkcik7CiAKIAlxZV9pc3N1ZV9jbWQoUUVfU0VUX0dST1VQX0FERFJFU1MsIGNlY3Jfc3ViYmxvY2ssCi0JCSAgICAgKHU4KSBRRV9DUl9QUk9UT0NPTF9FVEhFUk5FVCwgMCk7CisJCSAgICAgUUVfQ1JfUFJPVE9DT0xfRVRIRVJORVQsIDApOwogfQogCiAjaWZkZWYgQ09ORklHX1VHRVRIX01BR0lDX1BBQ0tFVAotc3RhdGljIHZvaWQgbWFnaWNfcGFja2V0X2RldGVjdGlvbl9lbmFibGUodWNjX2dldGhfcHJpdmF0ZV90ICp1Z2V0aCkKK3N0YXRpYyB2b2lkIG1hZ2ljX3BhY2tldF9kZXRlY3Rpb25fZW5hYmxlKHN0cnVjdCB1Y2NfZ2V0aF9wcml2YXRlICp1Z2V0aCkKIHsKLQl1Y2NfZmFzdF9wcml2YXRlX3QgKnVjY2Y7Ci0JdWNjX2dldGhfdCAqdWdfcmVnczsKKwlzdHJ1Y3QgdWNjX2Zhc3RfcHJpdmF0ZSAqdWNjZjsKKwlzdHJ1Y3QgdWNjX2dldGggKnVnX3JlZ3M7CiAJdTMyIG1hY2NmZzIsIHVjY207CiAKIAl1Y2NmID0gdWdldGgtPnVjY2Y7CkBAIC01ODEsMTAgKzU2NywxMCBAQAogCW91dF9iZTMyKCZ1Z19yZWdzLT5tYWNjZmcyLCBtYWNjZmcyKTsKIH0KIAotc3RhdGljIHZvaWQgbWFnaWNfcGFja2V0X2RldGVjdGlvbl9kaXNhYmxlKHVjY19nZXRoX3ByaXZhdGVfdCAqdWdldGgpCitzdGF0aWMgdm9pZCBtYWdpY19wYWNrZXRfZGV0ZWN0aW9uX2Rpc2FibGUoc3RydWN0IHVjY19nZXRoX3ByaXZhdGUgKnVnZXRoKQogewotCXVjY19mYXN0X3ByaXZhdGVfdCAqdWNjZjsKLQl1Y2NfZ2V0aF90ICp1Z19yZWdzOworCXN0cnVjdCB1Y2NfZmFzdF9wcml2YXRlICp1Y2NmOworCXN0cnVjdCB1Y2NfZ2V0aCAqdWdfcmVnczsKIAl1MzIgbWFjY2ZnMiwgdWNjbTsKIAogCXVjY2YgPSB1Z2V0aC0+dWNjZjsKQEAgLTYwMiwyNiArNTg4LDI2IEBACiB9CiAjZW5kaWYgLyogTUFHSUNfUEFDS0VUICovCiAKLXN0YXRpYyBpbmxpbmUgaW50IGNvbXBhcmVfYWRkcihlbmV0X2FkZHJfdCAqYWRkcjEsIGVuZXRfYWRkcl90ICphZGRyMikKK3N0YXRpYyBpbmxpbmUgaW50IGNvbXBhcmVfYWRkcih1OCAqKmFkZHIxLCB1OCAqKmFkZHIyKQogewogCXJldHVybiBtZW1jbXAoYWRkcjEsIGFkZHIyLCBFTkVUX05VTV9PQ1RFVFNfUEVSX0FERFJFU1MpOwogfQogCiAjaWZkZWYgREVCVUcKLXN0YXRpYyB2b2lkIGdldF9zdGF0aXN0aWNzKHVjY19nZXRoX3ByaXZhdGVfdCAqdWdldGgsCi0JCQkgICB1Y2NfZ2V0aF90eF9maXJtd2FyZV9zdGF0aXN0aWNzX3QgKgorc3RhdGljIHZvaWQgZ2V0X3N0YXRpc3RpY3Moc3RydWN0IHVjY19nZXRoX3ByaXZhdGUgKnVnZXRoLAorCQkJICAgc3RydWN0IHVjY19nZXRoX3R4X2Zpcm13YXJlX3N0YXRpc3RpY3MgKgogCQkJICAgdHhfZmlybXdhcmVfc3RhdGlzdGljcywKLQkJCSAgIHVjY19nZXRoX3J4X2Zpcm13YXJlX3N0YXRpc3RpY3NfdCAqCisJCQkgICBzdHJ1Y3QgdWNjX2dldGhfcnhfZmlybXdhcmVfc3RhdGlzdGljcyAqCiAJCQkgICByeF9maXJtd2FyZV9zdGF0aXN0aWNzLAotCQkJICAgdWNjX2dldGhfaGFyZHdhcmVfc3RhdGlzdGljc190ICpoYXJkd2FyZV9zdGF0aXN0aWNzKQorCQkJICAgc3RydWN0IHVjY19nZXRoX2hhcmR3YXJlX3N0YXRpc3RpY3MgKmhhcmR3YXJlX3N0YXRpc3RpY3MpCiB7Ci0JdWNjX2Zhc3RfdCAqdWZfcmVnczsKLQl1Y2NfZ2V0aF90ICp1Z19yZWdzOwotCXVjY19nZXRoX3R4X2Zpcm13YXJlX3N0YXRpc3RpY3NfcHJhbV90ICpwX3R4X2Z3X3N0YXRpc3RpY3NfcHJhbTsKLQl1Y2NfZ2V0aF9yeF9maXJtd2FyZV9zdGF0aXN0aWNzX3ByYW1fdCAqcF9yeF9md19zdGF0aXN0aWNzX3ByYW07CisJc3RydWN0IHVjY19mYXN0ICp1Zl9yZWdzOworCXN0cnVjdCB1Y2NfZ2V0aCAqdWdfcmVnczsKKwlzdHJ1Y3QgdWNjX2dldGhfdHhfZmlybXdhcmVfc3RhdGlzdGljc19wcmFtICpwX3R4X2Z3X3N0YXRpc3RpY3NfcHJhbTsKKwlzdHJ1Y3QgdWNjX2dldGhfcnhfZmlybXdhcmVfc3RhdGlzdGljc19wcmFtICpwX3J4X2Z3X3N0YXRpc3RpY3NfcHJhbTsKIAogCXVnX3JlZ3MgPSB1Z2V0aC0+dWdfcmVnczsKLQl1Zl9yZWdzID0gKHVjY19mYXN0X3QgKikgdWdfcmVnczsKKwl1Zl9yZWdzID0gKHN0cnVjdCB1Y2NfZmFzdCAqKSB1Z19yZWdzOwogCXBfdHhfZndfc3RhdGlzdGljc19wcmFtID0gdWdldGgtPnBfdHhfZndfc3RhdGlzdGljc19wcmFtOwogCXBfcnhfZndfc3RhdGlzdGljc19wcmFtID0gdWdldGgtPnBfcnhfZndfc3RhdGlzdGljc19wcmFtOwogCkBAIC03MjcsNyArNzEzLDcgQEAKIAl9CiB9CiAKLXN0YXRpYyB2b2lkIGR1bXBfYmRzKHVjY19nZXRoX3ByaXZhdGVfdCAqdWdldGgpCitzdGF0aWMgdm9pZCBkdW1wX2JkcyhzdHJ1Y3QgdWNjX2dldGhfcHJpdmF0ZSAqdWdldGgpCiB7CiAJaW50IGk7CiAJaW50IGxlbmd0aDsKQEAgLTczNiw3ICs3MjIsNyBAQAogCQlpZiAodWdldGgtPnBfdHhfYmRfcmluZ1tpXSkgewogCQkJbGVuZ3RoID0KIAkJCSAgICAodWdldGgtPnVnX2luZm8tPmJkUmluZ0xlblR4W2ldICoKLQkJCSAgICAgVUNDX0dFVEhfU0laRV9PRl9CRCk7CisJCQkgICAgIHNpemVvZihzdHJ1Y3QgcWVfYmQpKTsKIAkJCXVnZXRoX2luZm8oIlRYIEJEc1slZF0iLCBpKTsKIAkJCW1lbV9kaXNwKHVnZXRoLT5wX3R4X2JkX3JpbmdbaV0sIGxlbmd0aCk7CiAJCX0KQEAgLTc0NSwxNCArNzMxLDE0IEBACiAJCWlmICh1Z2V0aC0+cF9yeF9iZF9yaW5nW2ldKSB7CiAJCQlsZW5ndGggPQogCQkJICAgICh1Z2V0aC0+dWdfaW5mby0+YmRSaW5nTGVuUnhbaV0gKgotCQkJICAgICBVQ0NfR0VUSF9TSVpFX09GX0JEKTsKKwkJCSAgICAgc2l6ZW9mKHN0cnVjdCBxZV9iZCkpOwogCQkJdWdldGhfaW5mbygiUlggQkRzWyVkXSIsIGkpOwogCQkJbWVtX2Rpc3AodWdldGgtPnBfcnhfYmRfcmluZ1tpXSwgbGVuZ3RoKTsKIAkJfQogCX0KIH0KIAotc3RhdGljIHZvaWQgZHVtcF9yZWdzKHVjY19nZXRoX3ByaXZhdGVfdCAqdWdldGgpCitzdGF0aWMgdm9pZCBkdW1wX3JlZ3Moc3RydWN0IHVjY19nZXRoX3ByaXZhdGUgKnVnZXRoKQogewogCWludCBpOwogCkBAIC04OTMsNyArODc5LDcgQEAKIAkJCXVnZXRoX2luZm8oIkJhc2UgYWRkcmVzczogMHglMDh4IiwKIAkJCQkgICAodTMyKSAmIHVnZXRoLT5wX3RocmVhZF9kYXRhX3R4W2ldKTsKIAkJCW1lbV9kaXNwKCh1OCAqKSAmIHVnZXRoLT5wX3RocmVhZF9kYXRhX3R4W2ldLAotCQkJCSBzaXplb2YodWNjX2dldGhfdGhyZWFkX2RhdGFfdHhfdCkpOworCQkJCSBzaXplb2Yoc3RydWN0IHVjY19nZXRoX3RocmVhZF9kYXRhX3R4KSk7CiAJCX0KIAl9CiAJaWYgKHVnZXRoLT5wX3RocmVhZF9kYXRhX3J4KSB7CkBAIC05MjcsNyArOTEzLDcgQEAKIAkJCXVnZXRoX2luZm8oIkJhc2UgYWRkcmVzczogMHglMDh4IiwKIAkJCQkgICAodTMyKSAmIHVnZXRoLT5wX3RocmVhZF9kYXRhX3J4W2ldKTsKIAkJCW1lbV9kaXNwKCh1OCAqKSAmIHVnZXRoLT5wX3RocmVhZF9kYXRhX3J4W2ldLAotCQkJCSBzaXplb2YodWNjX2dldGhfdGhyZWFkX2RhdGFfcnhfdCkpOworCQkJCSBzaXplb2Yoc3RydWN0IHVjY19nZXRoX3RocmVhZF9kYXRhX3J4KSk7CiAJCX0KIAl9CiAJaWYgKHVnZXRoLT5wX2V4Zl9nbGJsX3BhcmFtKSB7CkBAIC0xMTA1LDcgKzEwOTEsNyBAQAogCQkJdWdldGhfaW5mbygiQmFzZSBhZGRyZXNzOiAweCUwOHgiLAogCQkJCSAgICh1MzIpICYgdWdldGgtPnBfc2VuZF9xX21lbV9yZWctPnNxcWRbaV0pOwogCQkJbWVtX2Rpc3AoKHU4ICopICYgdWdldGgtPnBfc2VuZF9xX21lbV9yZWctPnNxcWRbaV0sCi0JCQkJIHNpemVvZih1Y2NfZ2V0aF9zZW5kX3F1ZXVlX3FkX3QpKTsKKwkJCQkgc2l6ZW9mKHN0cnVjdCB1Y2NfZ2V0aF9zZW5kX3F1ZXVlX3FkKSk7CiAJCX0KIAl9CiAJaWYgKHVnZXRoLT5wX3NjaGVkdWxlcikgewpAQCAtMTE4Nyw3ICsxMTczLDcgQEAKIAkJCQkgcWVfbXVyYW1fYWRkcihpbl9iZTMyCiAJCQkJCSAgICAgICAoJnVnZXRoLT5wX3J4X2JkX3FzX3RibFtpXS4KIAkJCQkJCWJkYmFzZXB0cikpLAotCQkJCSBzaXplb2YodWNjX2dldGhfcnhfcHJlZmV0Y2hlZF9iZHNfdCkpOworCQkJCSBzaXplb2Yoc3RydWN0IHVjY19nZXRoX3J4X3ByZWZldGNoZWRfYmRzKSk7CiAJCX0KIAl9CiAJaWYgKHVnZXRoLT5wX2luaXRfZW5ldF9wYXJhbV9zaGFkb3cpIHsKQEAgLTExOTgsNyArMTE4NCw3IEBACiAJCW1lbV9kaXNwKCh1OCAqKSB1Z2V0aC0+cF9pbml0X2VuZXRfcGFyYW1fc2hhZG93LAogCQkJIHNpemVvZigqdWdldGgtPnBfaW5pdF9lbmV0X3BhcmFtX3NoYWRvdykpOwogCi0JCXNpemUgPSBzaXplb2YodWNjX2dldGhfdGhyZWFkX3J4X3ByYW1fdCk7CisJCXNpemUgPSBzaXplb2Yoc3RydWN0IHVjY19nZXRoX3RocmVhZF9yeF9wcmFtKTsKIAkJaWYgKHVnZXRoLT51Z19pbmZvLT5yeEV4dGVuZGVkRmlsdGVyaW5nKSB7CiAJCQlzaXplICs9CiAJCQkgICAgVEhSRUFEX1JYX1BSQU1fQURESVRJT05BTF9GT1JfRVhURU5ERURfRklMVEVSSU5HOwpAQCAtMTIxNiw3ICsxMjAyLDcgQEAKIAkJCQkgICAgICAgJih1Z2V0aC0+cF9pbml0X2VuZXRfcGFyYW1fc2hhZG93LT4KIAkJCQkJIHR4dGhyZWFkWzBdKSwKIAkJCQkgICAgICAgRU5FVF9JTklUX1BBUkFNX01BWF9FTlRSSUVTX1RYLAotCQkJCSAgICAgICBzaXplb2YodWNjX2dldGhfdGhyZWFkX3R4X3ByYW1fdCksCisJCQkJICAgICAgIHNpemVvZihzdHJ1Y3QgdWNjX2dldGhfdGhyZWFkX3R4X3ByYW0pLAogCQkJCSAgICAgICB1Z2V0aC0+dWdfaW5mby0+cmlzY1R4LCAwKTsKIAkJZHVtcF9pbml0X2VuZXRfZW50cmllcyh1Z2V0aCwKIAkJCQkgICAgICAgJih1Z2V0aC0+cF9pbml0X2VuZXRfcGFyYW1fc2hhZG93LT4KQEAgLTE1NzgsMTIgKzE1NjQsMTIgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBhZGp1c3RfZW5ldF9pbnRlcmZhY2UodWNjX2dldGhfcHJpdmF0ZV90ICp1Z2V0aCkKK3N0YXRpYyBpbnQgYWRqdXN0X2VuZXRfaW50ZXJmYWNlKHN0cnVjdCB1Y2NfZ2V0aF9wcml2YXRlICp1Z2V0aCkKIHsKLQl1Y2NfZ2V0aF9pbmZvX3QgKnVnX2luZm87Ci0JdWNjX2dldGhfdCAqdWdfcmVnczsKLQl1Y2NfZmFzdF90ICp1Zl9yZWdzOwotCWVuZXRfc3BlZWRfZSBzcGVlZDsKKwlzdHJ1Y3QgdWNjX2dldGhfaW5mbyAqdWdfaW5mbzsKKwlzdHJ1Y3QgdWNjX2dldGggKnVnX3JlZ3M7CisJc3RydWN0IHVjY19mYXN0ICp1Zl9yZWdzOworCWVudW0gZW5ldF9zcGVlZCBzcGVlZDsKIAlpbnQgcmV0X3ZhbCwgcnBtID0gMCwgdGJpID0gMCwgcjEwbSA9IDAsIHJtbSA9CiAJICAgIDAsIGxpbWl0ZWRfdG9fZnVsbF9kdXBsZXggPSAwOwogCXUzMiB1cHNtciwgbWFjY2ZnMiwgdXRiaXBhciwgdGJpQmFzZUFkZHJlc3M7CkBAIC0xNjkxLDggKzE2NzcsOCBAQAogICovCiBzdGF0aWMgdm9pZCBhZGp1c3RfbGluayhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewotCXVjY19nZXRoX3ByaXZhdGVfdCAqdWdldGggPSBuZXRkZXZfcHJpdihkZXYpOwotCXVjY19nZXRoX3QgKnVnX3JlZ3M7CisJc3RydWN0IHVjY19nZXRoX3ByaXZhdGUgKnVnZXRoID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlzdHJ1Y3QgdWNjX2dldGggKnVnX3JlZ3M7CiAJdTMyIHRlbXB2YWw7CiAJc3RydWN0IHVnZXRoX21paV9pbmZvICptaWlfaW5mbyA9IHVnZXRoLT5taWlfaW5mbzsKIApAQCAtMTcyMiw3ICsxNzA4LDcgQEAKIAkJaWYgKG1paV9pbmZvLT5zcGVlZCAhPSB1Z2V0aC0+b2xkc3BlZWQpIHsKIAkJCXN3aXRjaCAobWlpX2luZm8tPnNwZWVkKSB7CiAJCQljYXNlIDEwMDA6Ci0jaWZkZWYgQ09ORklHX01QQzgzNngKKyNpZmRlZiBDT05GSUdfUFBDX01QQzgzNngKIC8qIEZJWE1FOiBUaGlzIGNvZGUgaXMgZm9yIDEwME1icyBCVUcgZml4aW5nLAogcmVtb3ZlIHRoaXMgd2hlbiBpdCBpcyBmaXhlZCEhISAqLwogCQkJCWlmICh1Z2V0aC0+dWdfaW5mby0+ZW5ldF9pbnRlcmZhY2UgPT0KQEAgLTE3NjgsNyArMTc1NCw3IEBACiAJCQkJYnJlYWs7CiAJCQljYXNlIDEwMDoKIAkJCWNhc2UgMTA6Ci0jaWZkZWYgQ09ORklHX01QQzgzNngKKyNpZmRlZiBDT05GSUdfUFBDX01QQzgzNngKIC8qIEZJWE1FOiBUaGlzIGNvZGUgaXMgZm9yIDEwME1icyBCVUcgZml4aW5nLAogcmVtb3ZlIHRoaXMgbGluZXMgd2hlbiBpdCB3aWxsIGJlIGZpeGVkISEhICovCiAJCQkJdWdldGgtPnVnX2luZm8tPmVuZXRfaW50ZXJmYWNlID0gRU5FVF8xMDBfUkdNSUk7CkBAIC0xODI3LDkgKzE4MTMsOSBAQAogICovCiBzdGF0aWMgaW50IGluaXRfcGh5KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7Ci0JdWNjX2dldGhfcHJpdmF0ZV90ICp1Z2V0aCA9IG5ldGRldl9wcml2KGRldik7CisJc3RydWN0IHVjY19nZXRoX3ByaXZhdGUgKnVnZXRoID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAlzdHJ1Y3QgcGh5X2luZm8gKmN1cnBoeTsKLQl1Y2NfbWlpX21uZ190ICptaWlfcmVnczsKKwlzdHJ1Y3QgdWNjX21paV9tbmcgKm1paV9yZWdzOwogCXN0cnVjdCB1Z2V0aF9taWlfaW5mbyAqbWlpX2luZm87CiAJaW50IGVycjsKIApAQCAtMTkxNCwxNyArMTkwMCwxNyBAQAogfQogCiAjaWZkZWYgQ09ORklHX1VHRVRIX1RYX09OX0RFTU9ORAotc3RhdGljIGludCB1Z2V0aF90cmFuc21pdF9vbl9kZW1hbmQodWNjX2dldGhfcHJpdmF0ZV90ICp1Z2V0aCkKK3N0YXRpYyBpbnQgdWdldGhfdHJhbnNtaXRfb25fZGVtYW5kKHN0cnVjdCB1Y2NfZ2V0aF9wcml2YXRlICp1Z2V0aCkKIHsKLQl1Y2NfZmFzdF90cmFuc21pdF9vbl9kZW1hbmQodWdldGgtPnVjY2YpOworCXN0cnVjdCB1Y2NfZmFzdHJhbnNtaXRfb25fZGVtYW5kKHVnZXRoLT51Y2NmKTsKIAogCXJldHVybiAwOwogfQogI2VuZGlmCiAKLXN0YXRpYyBpbnQgdWdldGhfZ3JhY2VmdWxfc3RvcF90eCh1Y2NfZ2V0aF9wcml2YXRlX3QgKnVnZXRoKQorc3RhdGljIGludCB1Z2V0aF9ncmFjZWZ1bF9zdG9wX3R4KHN0cnVjdCB1Y2NfZ2V0aF9wcml2YXRlICp1Z2V0aCkKIHsKLQl1Y2NfZmFzdF9wcml2YXRlX3QgKnVjY2Y7CisJc3RydWN0IHVjY19mYXN0X3ByaXZhdGUgKnVjY2Y7CiAJdTMyIGNlY3Jfc3ViYmxvY2s7CiAJdTMyIHRlbXA7CiAKQEAgLTE5NDAsNyArMTkyNiw3IEBACiAJY2Vjcl9zdWJibG9jayA9CiAJICAgIHVjY19mYXN0X2dldF9xZV9jcl9zdWJibG9jayh1Z2V0aC0+dWdfaW5mby0+dWZfaW5mby51Y2NfbnVtKTsKIAlxZV9pc3N1ZV9jbWQoUUVfR1JBQ0VGVUxfU1RPUF9UWCwgY2Vjcl9zdWJibG9jaywKLQkJICAgICAodTgpIFFFX0NSX1BST1RPQ09MX0VUSEVSTkVULCAwKTsKKwkJICAgICBRRV9DUl9QUk9UT0NPTF9FVEhFUk5FVCwgMCk7CiAKIAkvKiBXYWl0IGZvciBjb21tYW5kIHRvIGNvbXBsZXRlICovCiAJZG8gewpAQCAtMTk1Miw5ICsxOTM4LDkgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCB1Z2V0aF9ncmFjZWZ1bF9zdG9wX3J4KHVjY19nZXRoX3ByaXZhdGVfdCAqIHVnZXRoKQorc3RhdGljIGludCB1Z2V0aF9ncmFjZWZ1bF9zdG9wX3J4KHN0cnVjdCB1Y2NfZ2V0aF9wcml2YXRlICogdWdldGgpCiB7Ci0JdWNjX2Zhc3RfcHJpdmF0ZV90ICp1Y2NmOworCXN0cnVjdCB1Y2NfZmFzdF9wcml2YXRlICp1Y2NmOwogCXUzMiBjZWNyX3N1YmJsb2NrOwogCXU4IHRlbXA7CiAKQEAgLTE5NzMsNyArMTk1OSw3IEBACiAJCSAgICB1Y2NfZmFzdF9nZXRfcWVfY3Jfc3ViYmxvY2sodWdldGgtPnVnX2luZm8tPnVmX2luZm8uCiAJCQkJCQl1Y2NfbnVtKTsKIAkJcWVfaXNzdWVfY21kKFFFX0dSQUNFRlVMX1NUT1BfUlgsIGNlY3Jfc3ViYmxvY2ssCi0JCQkgICAgICh1OCkgUUVfQ1JfUFJPVE9DT0xfRVRIRVJORVQsIDApOworCQkJICAgICBRRV9DUl9QUk9UT0NPTF9FVEhFUk5FVCwgMCk7CiAKIAkJdGVtcCA9IHVnZXRoLT5wX3J4X2dsYmxfcHJhbS0+cnhnc3RwYWNrOwogCX0gd2hpbGUgKCEodGVtcCAmIEdSQUNFRlVMX1NUT1BfQUNLTk9XTEVER0VfUlgpKTsKQEAgLTE5ODMsNDEgKzE5NjksNDAgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCB1Z2V0aF9yZXN0YXJ0X3R4KHVjY19nZXRoX3ByaXZhdGVfdCAqdWdldGgpCitzdGF0aWMgaW50IHVnZXRoX3Jlc3RhcnRfdHgoc3RydWN0IHVjY19nZXRoX3ByaXZhdGUgKnVnZXRoKQogewotCXVjY19mYXN0X3ByaXZhdGVfdCAqdWNjZjsKKwlzdHJ1Y3QgdWNjX2Zhc3RfcHJpdmF0ZSAqdWNjZjsKIAl1MzIgY2Vjcl9zdWJibG9jazsKIAogCXVjY2YgPSB1Z2V0aC0+dWNjZjsKIAogCWNlY3Jfc3ViYmxvY2sgPQogCSAgICB1Y2NfZmFzdF9nZXRfcWVfY3Jfc3ViYmxvY2sodWdldGgtPnVnX2luZm8tPnVmX2luZm8udWNjX251bSk7Ci0JcWVfaXNzdWVfY21kKFFFX1JFU1RBUlRfVFgsIGNlY3Jfc3ViYmxvY2ssICh1OCkgUUVfQ1JfUFJPVE9DT0xfRVRIRVJORVQsCi0JCSAgICAgMCk7CisJcWVfaXNzdWVfY21kKFFFX1JFU1RBUlRfVFgsIGNlY3Jfc3ViYmxvY2ssIFFFX0NSX1BST1RPQ09MX0VUSEVSTkVULCAwKTsKIAl1Y2NmLT5zdG9wcGVkX3R4ID0gMDsKIAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IHVnZXRoX3Jlc3RhcnRfcngodWNjX2dldGhfcHJpdmF0ZV90ICp1Z2V0aCkKK3N0YXRpYyBpbnQgdWdldGhfcmVzdGFydF9yeChzdHJ1Y3QgdWNjX2dldGhfcHJpdmF0ZSAqdWdldGgpCiB7Ci0JdWNjX2Zhc3RfcHJpdmF0ZV90ICp1Y2NmOworCXN0cnVjdCB1Y2NfZmFzdF9wcml2YXRlICp1Y2NmOwogCXUzMiBjZWNyX3N1YmJsb2NrOwogCiAJdWNjZiA9IHVnZXRoLT51Y2NmOwogCiAJY2Vjcl9zdWJibG9jayA9CiAJICAgIHVjY19mYXN0X2dldF9xZV9jcl9zdWJibG9jayh1Z2V0aC0+dWdfaW5mby0+dWZfaW5mby51Y2NfbnVtKTsKLQlxZV9pc3N1ZV9jbWQoUUVfUkVTVEFSVF9SWCwgY2Vjcl9zdWJibG9jaywgKHU4KSBRRV9DUl9QUk9UT0NPTF9FVEhFUk5FVCwKKwlxZV9pc3N1ZV9jbWQoUUVfUkVTVEFSVF9SWCwgY2Vjcl9zdWJibG9jaywgUUVfQ1JfUFJPVE9DT0xfRVRIRVJORVQsCiAJCSAgICAgMCk7CiAJdWNjZi0+c3RvcHBlZF9yeCA9IDA7CiAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCB1Z2V0aF9lbmFibGUodWNjX2dldGhfcHJpdmF0ZV90ICp1Z2V0aCwgY29tbV9kaXJfZSBtb2RlKQorc3RhdGljIGludCB1Z2V0aF9lbmFibGUoc3RydWN0IHVjY19nZXRoX3ByaXZhdGUgKnVnZXRoLCBlbnVtIGNvbW1fZGlyIG1vZGUpCiB7Ci0JdWNjX2Zhc3RfcHJpdmF0ZV90ICp1Y2NmOworCXN0cnVjdCB1Y2NfZmFzdF9wcml2YXRlICp1Y2NmOwogCWludCBlbmFibGVkX3R4LCBlbmFibGVkX3J4OwogCiAJdWNjZiA9IHVnZXRoLT51Y2NmOwpAQCAtMjA0NCw5ICsyMDI5LDkgQEAKIAogfQogCi1zdGF0aWMgaW50IHVnZXRoX2Rpc2FibGUodWNjX2dldGhfcHJpdmF0ZV90ICogdWdldGgsIGNvbW1fZGlyX2UgbW9kZSkKK3N0YXRpYyBpbnQgdWdldGhfZGlzYWJsZShzdHJ1Y3QgdWNjX2dldGhfcHJpdmF0ZSAqIHVnZXRoLCBlbnVtIGNvbW1fZGlyIG1vZGUpCiB7Ci0JdWNjX2Zhc3RfcHJpdmF0ZV90ICp1Y2NmOworCXN0cnVjdCB1Y2NfZmFzdF9wcml2YXRlICp1Y2NmOwogCiAJdWNjZiA9IHVnZXRoLT51Y2NmOwogCkBAIC0yMDY5LDcgKzIwNTQsNyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgdm9pZCB1Z2V0aF9kdW1wX3JlZ3ModWNjX2dldGhfcHJpdmF0ZV90ICp1Z2V0aCkKK3N0YXRpYyB2b2lkIHVnZXRoX2R1bXBfcmVncyhzdHJ1Y3QgdWNjX2dldGhfcHJpdmF0ZSAqdWdldGgpCiB7CiAjaWZkZWYgREVCVUcKIAl1Y2NfZmFzdF9kdW1wX3JlZ3ModWdldGgtPnVjY2YpOwpAQCAtMjA3OSw5ICsyMDY0LDkgQEAKIH0KIAogI2lmZGVmIENPTkZJR19VR0VUSF9GSUxURVJJTkcKLXN0YXRpYyBpbnQgdWdldGhfZXh0X2ZpbHRlcmluZ19zZXJpYWxpemVfdGFkKHVjY19nZXRoX3RhZF9wYXJhbXNfdCAqCitzdGF0aWMgaW50IHVnZXRoX2V4dF9maWx0ZXJpbmdfc2VyaWFsaXplX3RhZChzdHJ1Y3QgdWNjX2dldGhfdGFkX3BhcmFtcyAqCiAJCQkJCSAgICAgcF9VY2NHZXRoVGFkUGFyYW1zLAotCQkJCQkgICAgIHFlX2ZsdHJfdGFkX3QgKnFlX2ZsdHJfdGFkKQorCQkJCQkgICAgIHN0cnVjdCBxZV9mbHRyX3RhZCAqcWVfZmx0cl90YWQpCiB7CiAJdTE2IHRlbXA7CiAKQEAgLTIxMTksMTEgKzIxMDQsMTEgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGVuZXRfYWRkcl9jb250YWluZXJfdAotICAgICp1Z2V0aF84Mnh4X2ZpbHRlcmluZ19nZXRfbWF0Y2hfYWRkcl9pbl9oYXNoKHVjY19nZXRoX3ByaXZhdGVfdCAqdWdldGgsCi0JCQkJCQkgZW5ldF9hZGRyX3QgKnBfZW5ldF9hZGRyKQorc3RhdGljIHN0cnVjdCBlbmV0X2FkZHJfY29udGFpbmVyX3QKKyAgICAqdWdldGhfODJ4eF9maWx0ZXJpbmdfZ2V0X21hdGNoX2FkZHJfaW5faGFzaChzdHJ1Y3QgdWNjX2dldGhfcHJpdmF0ZSAqdWdldGgsCisJCQkJCQkgc3RydWN0IGVuZXRfYWRkciAqcF9lbmV0X2FkZHIpCiB7Ci0JZW5ldF9hZGRyX2NvbnRhaW5lcl90ICplbmV0X2FkZHJfY29udDsKKwlzdHJ1Y3QgZW5ldF9hZGRyX2NvbnRhaW5lciAqZW5ldF9hZGRyX2NvbnQ7CiAJc3RydWN0IGxpc3RfaGVhZCAqcF9saDsKIAl1MTYgaSwgbnVtOwogCWludDMyX3QgajsKQEAgLTIxNDQsNyArMjEyOSw3IEBACiAKIAlmb3IgKGkgPSAwOyBpIDwgbnVtOyBpKyspIHsKIAkJZW5ldF9hZGRyX2NvbnQgPQotCQkgICAgKGVuZXRfYWRkcl9jb250YWluZXJfdCAqKQorCQkgICAgKHN0cnVjdCBlbmV0X2FkZHJfY29udGFpbmVyICopCiAJCSAgICBFTkVUX0FERFJfQ09OVF9FTlRSWShkZXF1ZXVlKHBfbGgpKTsKIAkJZm9yIChqID0gRU5FVF9OVU1fT0NURVRTX1BFUl9BRERSRVNTIC0gMTsgaiA+PSAwOyBqLS0pIHsKIAkJCWlmICgoKnBfZW5ldF9hZGRyKVtqXSAhPSAoZW5ldF9hZGRyX2NvbnQtPmFkZHJlc3MpW2pdKQpAQCAtMjE1NywxMSArMjE0MiwxMSBAQAogCXJldHVybiBOVUxMOwogfQogCi1zdGF0aWMgaW50IHVnZXRoXzgyeHhfZmlsdGVyaW5nX2FkZF9hZGRyX2luX2hhc2godWNjX2dldGhfcHJpdmF0ZV90ICp1Z2V0aCwKLQkJCQkJCSBlbmV0X2FkZHJfdCAqcF9lbmV0X2FkZHIpCitzdGF0aWMgaW50IHVnZXRoXzgyeHhfZmlsdGVyaW5nX2FkZF9hZGRyX2luX2hhc2goc3RydWN0IHVjY19nZXRoX3ByaXZhdGUgKnVnZXRoLAorCQkJCQkJIHN0cnVjdCBlbmV0X2FkZHIgKnBfZW5ldF9hZGRyKQogewotCXVjY19nZXRoX2VuZXRfYWRkcmVzc19yZWNvZ25pdGlvbl9sb2NhdGlvbl9lIGxvY2F0aW9uOwotCWVuZXRfYWRkcl9jb250YWluZXJfdCAqZW5ldF9hZGRyX2NvbnQ7CisJZW51bSB1Y2NfZ2V0aF9lbmV0X2FkZHJlc3NfcmVjb2duaXRpb25fbG9jYXRpb24gbG9jYXRpb247CisJc3RydWN0IGVuZXRfYWRkcl9jb250YWluZXIgKmVuZXRfYWRkcl9jb250OwogCXN0cnVjdCBsaXN0X2hlYWQgKnBfbGg7CiAJdTggaTsKIAl1MzIgbGltaXQ7CkBAIC0yMTk2LDE4ICsyMTgxLDE3IEBACiAJZW5xdWV1ZShwX2xoLCAmZW5ldF9hZGRyX2NvbnQtPm5vZGUpOwkvKiBQdXQgaXQgYmFjayAqLwogCSsrKCpwX2NvdW50ZXIpOwogCi0JaHdfYWRkX2FkZHJfaW5faGFzaCh1Z2V0aCwgJihlbmV0X2FkZHJfY29udC0+YWRkcmVzcykpOwotCisJaHdfYWRkX2FkZHJfaW5faGFzaCh1Z2V0aCwgZW5ldF9hZGRyX2NvbnQtPmFkZHJlc3MpOwogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IHVnZXRoXzgyeHhfZmlsdGVyaW5nX2NsZWFyX2FkZHJfaW5faGFzaCh1Y2NfZ2V0aF9wcml2YXRlX3QgKnVnZXRoLAotCQkJCQkJICAgZW5ldF9hZGRyX3QgKnBfZW5ldF9hZGRyKQorc3RhdGljIGludCB1Z2V0aF84Mnh4X2ZpbHRlcmluZ19jbGVhcl9hZGRyX2luX2hhc2goc3RydWN0IHVjY19nZXRoX3ByaXZhdGUgKnVnZXRoLAorCQkJCQkJICAgc3RydWN0IGVuZXRfYWRkciAqcF9lbmV0X2FkZHIpCiB7Ci0JdWNjX2dldGhfODJ4eF9hZGRyZXNzX2ZpbHRlcmluZ19wcmFtX3QgKnBfODJ4eF9hZGRyX2ZpbHQ7Ci0JZW5ldF9hZGRyX2NvbnRhaW5lcl90ICplbmV0X2FkZHJfY29udDsKLQl1Y2NfZmFzdF9wcml2YXRlX3QgKnVjY2Y7Ci0JY29tbV9kaXJfZSBjb21tX2RpcjsKKwlzdHJ1Y3QgdWNjX2dldGhfODJ4eF9hZGRyZXNzX2ZpbHRlcmluZ19wcmFtICpwXzgyeHhfYWRkcl9maWx0OworCXN0cnVjdCBlbmV0X2FkZHJfY29udGFpbmVyICplbmV0X2FkZHJfY29udDsKKwlzdHJ1Y3QgdWNjX2Zhc3RfcHJpdmF0ZSAqdWNjZjsKKwllbnVtIGNvbW1fZGlyIGNvbW1fZGlyOwogCXUxNiBpLCBudW07CiAJc3RydWN0IGxpc3RfaGVhZCAqcF9saDsKIAl1MzIgKmFkZHJfaCwgKmFkZHJfbDsKQEAgLTIyMTYsNyArMjIwMCw3IEBACiAJdWNjZiA9IHVnZXRoLT51Y2NmOwogCiAJcF84Mnh4X2FkZHJfZmlsdCA9Ci0JICAgICh1Y2NfZ2V0aF84Mnh4X2FkZHJlc3NfZmlsdGVyaW5nX3ByYW1fdCAqKSB1Z2V0aC0+cF9yeF9nbGJsX3ByYW0tPgorCSAgICAoc3RydWN0IHVjY19nZXRoXzgyeHhfYWRkcmVzc19maWx0ZXJpbmdfcHJhbSAqKSB1Z2V0aC0+cF9yeF9nbGJsX3ByYW0tPgogCSAgICBhZGRyZXNzZmlsdGVyaW5nOwogCiAJaWYgKCEKQEAgLTIyNTYsOSArMjI0MCw5IEBACiAJbnVtID0gLS0oKnBfY291bnRlcik7CiAJZm9yIChpID0gMDsgaSA8IG51bTsgaSsrKSB7CiAJCWVuZXRfYWRkcl9jb250ID0KLQkJICAgIChlbmV0X2FkZHJfY29udGFpbmVyX3QgKikKKwkJICAgIChzdHJ1Y3QgZW5ldF9hZGRyX2NvbnRhaW5lciAqKQogCQkgICAgRU5FVF9BRERSX0NPTlRfRU5UUlkoZGVxdWV1ZShwX2xoKSk7Ci0JCWh3X2FkZF9hZGRyX2luX2hhc2godWdldGgsICYoZW5ldF9hZGRyX2NvbnQtPmFkZHJlc3MpKTsKKwkJaHdfYWRkX2FkZHJfaW5faGFzaCh1Z2V0aCwgZW5ldF9hZGRyX2NvbnQtPmFkZHJlc3MpOwogCQllbnF1ZXVlKHBfbGgsICZlbmV0X2FkZHJfY29udC0+bm9kZSk7CS8qIFB1dCBpdCBiYWNrICovCiAJfQogCkBAIC0yMjY5LDE0ICsyMjUzLDE0IEBACiB9CiAjZW5kaWYgLyogQ09ORklHX1VHRVRIX0ZJTFRFUklORyAqLwogCi1zdGF0aWMgaW50IHVnZXRoXzgyeHhfZmlsdGVyaW5nX2NsZWFyX2FsbF9hZGRyX2luX2hhc2godWNjX2dldGhfcHJpdmF0ZV90ICoKK3N0YXRpYyBpbnQgdWdldGhfODJ4eF9maWx0ZXJpbmdfY2xlYXJfYWxsX2FkZHJfaW5faGFzaChzdHJ1Y3QgdWNjX2dldGhfcHJpdmF0ZSAqCiAJCQkJCQkgICAgICAgdWdldGgsCi0JCQkJCQkgICAgICAgZW5ldF9hZGRyX3R5cGVfZQorCQkJCQkJICAgICAgIGVudW0gZW5ldF9hZGRyX3R5cGUKIAkJCQkJCSAgICAgICBlbmV0X2FkZHJfdHlwZSkKIHsKLQl1Y2NfZ2V0aF84Mnh4X2FkZHJlc3NfZmlsdGVyaW5nX3ByYW1fdCAqcF84Mnh4X2FkZHJfZmlsdDsKLQl1Y2NfZmFzdF9wcml2YXRlX3QgKnVjY2Y7Ci0JY29tbV9kaXJfZSBjb21tX2RpcjsKKwlzdHJ1Y3QgdWNjX2dldGhfODJ4eF9hZGRyZXNzX2ZpbHRlcmluZ19wcmFtICpwXzgyeHhfYWRkcl9maWx0OworCXN0cnVjdCB1Y2NfZmFzdF9wcml2YXRlICp1Y2NmOworCWVudW0gY29tbV9kaXIgY29tbV9kaXI7CiAJc3RydWN0IGxpc3RfaGVhZCAqcF9saDsKIAl1MTYgaSwgbnVtOwogCXUzMiAqYWRkcl9oLCAqYWRkcl9sOwpAQCAtMjI4NSw3ICsyMjY5LDcgQEAKIAl1Y2NmID0gdWdldGgtPnVjY2Y7CiAKIAlwXzgyeHhfYWRkcl9maWx0ID0KLQkgICAgKHVjY19nZXRoXzgyeHhfYWRkcmVzc19maWx0ZXJpbmdfcHJhbV90ICopIHVnZXRoLT5wX3J4X2dsYmxfcHJhbS0+CisJICAgIChzdHJ1Y3QgdWNjX2dldGhfODJ4eF9hZGRyZXNzX2ZpbHRlcmluZ19wcmFtICopIHVnZXRoLT5wX3J4X2dsYmxfcHJhbS0+CiAJICAgIGFkZHJlc3NmaWx0ZXJpbmc7CiAKIAlpZiAoZW5ldF9hZGRyX3R5cGUgPT0gRU5FVF9BRERSX1RZUEVfR1JPVVApIHsKQEAgLTIzMzEsOCArMjMxNSw4IEBACiB9CiAKICNpZmRlZiBDT05GSUdfVUdFVEhfRklMVEVSSU5HCi1zdGF0aWMgaW50IHVnZXRoXzgyeHhfZmlsdGVyaW5nX2FkZF9hZGRyX2luX3BhZGRyKHVjY19nZXRoX3ByaXZhdGVfdCAqdWdldGgsCi0JCQkJCQkgIGVuZXRfYWRkcl90ICpwX2VuZXRfYWRkciwKK3N0YXRpYyBpbnQgdWdldGhfODJ4eF9maWx0ZXJpbmdfYWRkX2FkZHJfaW5fcGFkZHIoc3RydWN0IHVjY19nZXRoX3ByaXZhdGUgKnVnZXRoLAorCQkJCQkJICBzdHJ1Y3QgZW5ldF9hZGRyICpwX2VuZXRfYWRkciwKIAkJCQkJCSAgdTggcGFkZHJfbnVtKQogewogCWludCBpOwpAQCAtMjM1MiwxNCArMjMzNiwxNCBAQAogfQogI2VuZGlmIC8qIENPTkZJR19VR0VUSF9GSUxURVJJTkcgKi8KIAotc3RhdGljIGludCB1Z2V0aF84Mnh4X2ZpbHRlcmluZ19jbGVhcl9hZGRyX2luX3BhZGRyKHVjY19nZXRoX3ByaXZhdGVfdCAqdWdldGgsCitzdGF0aWMgaW50IHVnZXRoXzgyeHhfZmlsdGVyaW5nX2NsZWFyX2FkZHJfaW5fcGFkZHIoc3RydWN0IHVjY19nZXRoX3ByaXZhdGUgKnVnZXRoLAogCQkJCQkJICAgIHU4IHBhZGRyX251bSkKIHsKIAl1Z2V0aC0+aW5kQWRkclJlZ1VzZWRbcGFkZHJfbnVtXSA9IDA7IC8qIG1hcmsgdGhpcyBwYWRkciBhcyBub3QgdXNlZCAqLwogCXJldHVybiBod19jbGVhcl9hZGRyX2luX3BhZGRyKHVnZXRoLCBwYWRkcl9udW0pOy8qIGNsZWFyIGluIGhhcmR3YXJlICovCiB9CiAKLXN0YXRpYyB2b2lkIHVjY19nZXRoX21lbWNsZWFuKHVjY19nZXRoX3ByaXZhdGVfdCAqdWdldGgpCitzdGF0aWMgdm9pZCB1Y2NfZ2V0aF9tZW1jbGVhbihzdHJ1Y3QgdWNjX2dldGhfcHJpdmF0ZSAqdWdldGgpCiB7CiAJdTE2IGksIGo7CiAJdTggKmJkOwpAQCAtMjQzMyw4ICsyNDE3LDggQEAKIAkJZm9yIChqID0gMDsgaiA8IHVnZXRoLT51Z19pbmZvLT5iZFJpbmdMZW5UeFtpXTsgaisrKSB7CiAJCQlpZiAodWdldGgtPnR4X3NrYnVmZltpXVtqXSkgewogCQkJCWRtYV91bm1hcF9zaW5nbGUoTlVMTCwKLQkJCQkJCSBCRF9CVUZGRVJfQVJHKGJkKSwKLQkJCQkJCSAoQkRfU1RBVFVTX0FORF9MRU5HVEgoYmQpICYKKwkJCQkJCSAoKHFlX2JkX3QgKiliZCktPmJ1ZiwKKwkJCQkJCSAoaW5fYmUzMigodTMyICopYmQpICYKIAkJCQkJCSAgQkRfTEVOR1RIX01BU0spLAogCQkJCQkJIERNQV9UT19ERVZJQ0UpOwogCQkJCWRldl9rZnJlZV9za2JfYW55KHVnZXRoLT50eF9za2J1ZmZbaV1bal0pOwpAQCAtMjQ2MCwxOCArMjQ0NCwxNyBAQAogCQkJYmQgPSB1Z2V0aC0+cF9yeF9iZF9yaW5nW2ldOwogCQkJZm9yIChqID0gMDsgaiA8IHVnZXRoLT51Z19pbmZvLT5iZFJpbmdMZW5SeFtpXTsgaisrKSB7CiAJCQkJaWYgKHVnZXRoLT5yeF9za2J1ZmZbaV1bal0pIHsKLQkJCQkJZG1hX3VubWFwX3NpbmdsZShOVUxMLCBCRF9CVUZGRVIoYmQpLAotCQkJCQkJIHVnZXRoLT51Z19pbmZvLT4KLQkJCQkJCSB1Zl9pbmZvLgotCQkJCQkJIG1heF9yeF9idWZfbGVuZ3RoICsKLQkJCQkJCSBVQ0NfR0VUSF9SWF9EQVRBX0JVRl9BTElHTk1FTlQsCi0JCQkJCQkgRE1BX0ZST01fREVWSUNFKTsKLQotCQkJCQlkZXZfa2ZyZWVfc2tiX2FueSh1Z2V0aC0+Ci0JCQkJCQkJICByeF9za2J1ZmZbaV1bal0pOworCQkJCQlkbWFfdW5tYXBfc2luZ2xlKE5VTEwsCisJCQkJCQkoKHN0cnVjdCBxZV9iZCAqKWJkKS0+YnVmLAorCQkJCQkJdWdldGgtPnVnX2luZm8tPgorCQkJCQkJdWZfaW5mby5tYXhfcnhfYnVmX2xlbmd0aCArCisJCQkJCQlVQ0NfR0VUSF9SWF9EQVRBX0JVRl9BTElHTk1FTlQsCisJCQkJCQlETUFfRlJPTV9ERVZJQ0UpOworCQkJCQlkZXZfa2ZyZWVfc2tiX2FueSgKKwkJCQkJCXVnZXRoLT5yeF9za2J1ZmZbaV1bal0pOwogCQkJCQl1Z2V0aC0+cnhfc2tidWZmW2ldW2pdID0gTlVMTDsKIAkJCQl9Ci0JCQkJYmQgKz0gVUNDX0dFVEhfU0laRV9PRl9CRDsKKwkJCQliZCArPSBzaXplb2Yoc3RydWN0IHFlX2JkKTsKIAkJCX0KIAogCQkJa2ZyZWUodWdldGgtPnJ4X3NrYnVmZltpXSk7CkBAIC0yNDk2LDExICsyNDc5LDExIEBACiAKIHN0YXRpYyB2b2lkIHVjY19nZXRoX3NldF9tdWx0aShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewotCXVjY19nZXRoX3ByaXZhdGVfdCAqdWdldGg7CisJc3RydWN0IHVjY19nZXRoX3ByaXZhdGUgKnVnZXRoOwogCXN0cnVjdCBkZXZfbWNfbGlzdCAqZG1pOwotCXVjY19mYXN0X3QgKnVmX3JlZ3M7Ci0JdWNjX2dldGhfODJ4eF9hZGRyZXNzX2ZpbHRlcmluZ19wcmFtX3QgKnBfODJ4eF9hZGRyX2ZpbHQ7Ci0JZW5ldF9hZGRyX3QgdGVtcGFkZHI7CisJc3RydWN0IHVjY19mYXN0ICp1Zl9yZWdzOworCXN0cnVjdCB1Y2NfZ2V0aF84Mnh4X2FkZHJlc3NfZmlsdGVyaW5nX3ByYW0gKnBfODJ4eF9hZGRyX2ZpbHQ7CisJdTggdGVtcGFkZHJbNl07CiAJdTggKm1jcHRyLCAqdGRwdHI7CiAJaW50IGksIGo7CiAKQEAgLTI1MTcsNyArMjUwMCw3IEBACiAJCXVmX3JlZ3MtPnVwc21yICY9IH5VUFNNUl9QUk87CiAKIAkJcF84Mnh4X2FkZHJfZmlsdCA9Ci0JCSAgICAodWNjX2dldGhfODJ4eF9hZGRyZXNzX2ZpbHRlcmluZ19wcmFtX3QgKikgdWdldGgtPgorCQkgICAgKHN0cnVjdCB1Y2NfZ2V0aF84Mnh4X2FkZHJlc3NfZmlsdGVyaW5nX3ByYW0gKikgdWdldGgtPgogCQkgICAgcF9yeF9nbGJsX3ByYW0tPmFkZHJlc3NmaWx0ZXJpbmc7CiAKIAkJaWYgKGRldi0+ZmxhZ3MgJiBJRkZfQUxMTVVMVEkpIHsKQEAgLTI1NDYsMjMgKzI1MjksMjIgQEAKIAkJCQkgKiBjb3B5IGJ5dGVzIE1TQiBmaXJzdCBmcm9tIGRtaV9hZGRyLgogCQkJCSAqLwogCQkJCW1jcHRyID0gKHU4ICopIGRtaS0+ZG1pX2FkZHIgKyA1OwotCQkJCXRkcHRyID0gKHU4ICopICYgdGVtcGFkZHI7CisJCQkJdGRwdHIgPSAodTggKikgdGVtcGFkZHI7CiAJCQkJZm9yIChqID0gMDsgaiA8IDY7IGorKykKIAkJCQkJKnRkcHRyKysgPSAqbWNwdHItLTsKIAogCQkJCS8qIEFzayBDUE0gdG8gcnVuIENSQyBhbmQgc2V0IGJpdCBpbgogCQkJCSAqIGZpbHRlciBtYXNrLgogCQkJCSAqLwotCQkJCWh3X2FkZF9hZGRyX2luX2hhc2godWdldGgsICZ0ZW1wYWRkcik7Ci0KKwkJCQlod19hZGRfYWRkcl9pbl9oYXNoKHVnZXRoLCB0ZW1wYWRkcik7CiAJCQl9CiAJCX0KIAl9CiB9CiAKLXN0YXRpYyB2b2lkIHVjY19nZXRoX3N0b3AodWNjX2dldGhfcHJpdmF0ZV90ICp1Z2V0aCkKK3N0YXRpYyB2b2lkIHVjY19nZXRoX3N0b3Aoc3RydWN0IHVjY19nZXRoX3ByaXZhdGUgKnVnZXRoKQogewotCXVjY19nZXRoX3QgKnVnX3JlZ3MgPSB1Z2V0aC0+dWdfcmVnczsKKwlzdHJ1Y3QgdWNjX2dldGggKnVnX3JlZ3MgPSB1Z2V0aC0+dWdfcmVnczsKIAl1MzIgdGVtcHZhbDsKIAogCXVnZXRoX3ZkYmcoIiVzOiBJTiIsIF9fRlVOQ1RJT05fXyk7CkBAIC0yNjA1LDE1ICsyNTg3LDE1IEBACiAJdWNjX2dldGhfbWVtY2xlYW4odWdldGgpOwogfQogCi1zdGF0aWMgaW50IHVjY19nZXRoX3N0YXJ0dXAodWNjX2dldGhfcHJpdmF0ZV90ICp1Z2V0aCkKK3N0YXRpYyBpbnQgdWNjX2dldGhfc3RhcnR1cChzdHJ1Y3QgdWNjX2dldGhfcHJpdmF0ZSAqdWdldGgpCiB7Ci0JdWNjX2dldGhfODJ4eF9hZGRyZXNzX2ZpbHRlcmluZ19wcmFtX3QgKnBfODJ4eF9hZGRyX2ZpbHQ7Ci0JdWNjX2dldGhfaW5pdF9wcmFtX3QgKnBfaW5pdF9lbmV0X3ByYW07Ci0JdWNjX2Zhc3RfcHJpdmF0ZV90ICp1Y2NmOwotCXVjY19nZXRoX2luZm9fdCAqdWdfaW5mbzsKLQl1Y2NfZmFzdF9pbmZvX3QgKnVmX2luZm87Ci0JdWNjX2Zhc3RfdCAqdWZfcmVnczsKLQl1Y2NfZ2V0aF90ICp1Z19yZWdzOworCXN0cnVjdCB1Y2NfZ2V0aF84Mnh4X2FkZHJlc3NfZmlsdGVyaW5nX3ByYW0gKnBfODJ4eF9hZGRyX2ZpbHQ7CisJc3RydWN0IHVjY19nZXRoX2luaXRfcHJhbSAqcF9pbml0X2VuZXRfcHJhbTsKKwlzdHJ1Y3QgdWNjX2Zhc3RfcHJpdmF0ZSAqdWNjZjsKKwlzdHJ1Y3QgdWNjX2dldGhfaW5mbyAqdWdfaW5mbzsKKwlzdHJ1Y3QgdWNjX2Zhc3RfaW5mbyAqdWZfaW5mbzsKKwlzdHJ1Y3QgdWNjX2Zhc3QgKnVmX3JlZ3M7CisJc3RydWN0IHVjY19nZXRoICp1Z19yZWdzOwogCWludCByZXRfdmFsID0gLUVJTlZBTDsKIAl1MzIgcmVtb2RlciA9IFVDQ19HRVRIX1JFTU9ERVJfSU5JVDsKIAl1MzIgaW5pdF9lbmV0X3ByYW1fb2Zmc2V0LCBjZWNyX3N1YmJsb2NrLCBjb21tYW5kLCBtYWNjZmcxOwpAQCAtMjc4OCw3ICsyNzcwLDcgQEAKIAkJVUNDX0dFVEhfVkxBTl9PUEVSQVRJT05fTk9OX1RBR0dFRF9OT1ApOwogCiAJdWZfcmVncyA9IHVjY2YtPnVmX3JlZ3M7Ci0JdWdfcmVncyA9ICh1Y2NfZ2V0aF90ICopICh1Y2NmLT51Zl9yZWdzKTsKKwl1Z19yZWdzID0gKHN0cnVjdCB1Y2NfZ2V0aCAqKSAodWNjZi0+dWZfcmVncyk7CiAJdWdldGgtPnVnX3JlZ3MgPSB1Z19yZWdzOwogCiAJaW5pdF9kZWZhdWx0X3JlZ192YWxzKCZ1Zl9yZWdzLT51cHNtciwKQEAgLTI4NjksMTAgKzI4NTEsMTAgQEAKIAkJLyogQWxsb2NhdGUgaW4gbXVsdGlwbGUgb2YKIAkJICAgVUNDX0dFVEhfVFhfQkRfUklOR19TSVpFX01FTU9SWV9BTElHTk1FTlQsCiAJCSAgIGFjY29yZGluZyB0byBzcGVjICovCi0JCWxlbmd0aCA9ICgodWdfaW5mby0+YmRSaW5nTGVuVHhbal0gKiBVQ0NfR0VUSF9TSVpFX09GX0JEKQorCQlsZW5ndGggPSAoKHVnX2luZm8tPmJkUmluZ0xlblR4W2pdICogc2l6ZW9mKHN0cnVjdCBxZV9iZCkpCiAJCQkgIC8gVUNDX0dFVEhfVFhfQkRfUklOR19TSVpFX01FTU9SWV9BTElHTk1FTlQpCiAJCSAgICAqIFVDQ19HRVRIX1RYX0JEX1JJTkdfU0laRV9NRU1PUllfQUxJR05NRU5UOwotCQlpZiAoKHVnX2luZm8tPmJkUmluZ0xlblR4W2pdICogVUNDX0dFVEhfU0laRV9PRl9CRCkgJQorCQlpZiAoKHVnX2luZm8tPmJkUmluZ0xlblR4W2pdICogc2l6ZW9mKHN0cnVjdCBxZV9iZCkpICUKIAkJICAgIFVDQ19HRVRIX1RYX0JEX1JJTkdfU0laRV9NRU1PUllfQUxJR05NRU5UKQogCQkJbGVuZ3RoICs9IFVDQ19HRVRIX1RYX0JEX1JJTkdfU0laRV9NRU1PUllfQUxJR05NRU5UOwogCQlpZiAodWZfaW5mby0+YmRfbWVtX3BhcnQgPT0gTUVNX1BBUlRfU1lTVEVNKSB7CkBAIC0yOTA0LDEzICsyODg2LDEzIEBACiAJCX0KIAkJLyogWmVybyB1bnVzZWQgZW5kIG9mIGJkIHJpbmcsIGFjY29yZGluZyB0byBzcGVjICovCiAJCW1lbXNldCh1Z2V0aC0+cF90eF9iZF9yaW5nW2pdICsKLQkJICAgICAgIHVnX2luZm8tPmJkUmluZ0xlblR4W2pdICogVUNDX0dFVEhfU0laRV9PRl9CRCwgMCwKLQkJICAgICAgIGxlbmd0aCAtIHVnX2luZm8tPmJkUmluZ0xlblR4W2pdICogVUNDX0dFVEhfU0laRV9PRl9CRCk7CisJCSAgICAgICB1Z19pbmZvLT5iZFJpbmdMZW5UeFtqXSAqIHNpemVvZihzdHJ1Y3QgcWVfYmQpLCAwLAorCQkgICAgICAgbGVuZ3RoIC0gdWdfaW5mby0+YmRSaW5nTGVuVHhbal0gKiBzaXplb2Yoc3RydWN0IHFlX2JkKSk7CiAJfQogCiAJLyogQWxsb2NhdGUgUnggYmRzICovCiAJZm9yIChqID0gMDsgaiA8IHVnX2luZm8tPm51bVF1ZXVlc1J4OyBqKyspIHsKLQkJbGVuZ3RoID0gdWdfaW5mby0+YmRSaW5nTGVuUnhbal0gKiBVQ0NfR0VUSF9TSVpFX09GX0JEOworCQlsZW5ndGggPSB1Z19pbmZvLT5iZFJpbmdMZW5SeFtqXSAqIHNpemVvZihzdHJ1Y3QgcWVfYmQpOwogCQlpZiAodWZfaW5mby0+YmRfbWVtX3BhcnQgPT0gTUVNX1BBUlRfU1lTVEVNKSB7CiAJCQl1MzIgYWxpZ24gPSA0OwogCQkJaWYgKFVDQ19HRVRIX1JYX0JEX1JJTkdfQUxJR05NRU5UID4gNCkKQEAgLTI5NjAsMTIgKzI5NDIsMTUgQEAKIAkJdWdldGgtPnNrYl9jdXJ0eFtqXSA9IHVnZXRoLT5za2JfZGlydHl0eFtqXSA9IDA7CiAJCWJkID0gdWdldGgtPmNvbmZCZFtqXSA9IHVnZXRoLT50eEJkW2pdID0gdWdldGgtPnBfdHhfYmRfcmluZ1tqXTsKIAkJZm9yIChpID0gMDsgaSA8IHVnX2luZm8tPmJkUmluZ0xlblR4W2pdOyBpKyspIHsKLQkJCUJEX0JVRkZFUl9DTEVBUihiZCk7Ci0JCQlCRF9TVEFUVVNfQU5EX0xFTkdUSF9TRVQoYmQsIDApOwotCQkJYmQgKz0gVUNDX0dFVEhfU0laRV9PRl9CRDsKKwkJCS8qIGNsZWFyIGJkIGJ1ZmZlciAqLworCQkJb3V0X2JlMzIoJigoc3RydWN0IHFlX2JkICopYmQpLT5idWYsIDApOworCQkJLyogc2V0IGJkIHN0YXR1cyBhbmQgbGVuZ3RoICovCisJCQlvdXRfYmUzMigodTMyICopYmQsIDApOworCQkJYmQgKz0gc2l6ZW9mKHN0cnVjdCBxZV9iZCk7CiAJCX0KLQkJYmQgLT0gVUNDX0dFVEhfU0laRV9PRl9CRDsKLQkJQkRfU1RBVFVTX0FORF9MRU5HVEhfU0VUKGJkLCBUX1cpOy8qIGZvciBsYXN0IEJEIHNldCBXcmFwIGJpdCAqLworCQliZCAtPSBzaXplb2Yoc3RydWN0IHFlX2JkKTsKKwkJLyogc2V0IGJkIHN0YXR1cyBhbmQgbGVuZ3RoICovCisJCW91dF9iZTMyKCh1MzIgKiliZCwgVF9XKTsJLyogZm9yIGxhc3QgQkQgc2V0IFdyYXAgYml0ICovCiAJfQogCiAJLyogSW5pdCBSeCBiZHMgKi8KQEAgLTI5ODksMTIgKzI5NzQsMTUgQEAKIAkJdWdldGgtPnNrYl9jdXJyeFtqXSA9IDA7CiAJCWJkID0gdWdldGgtPnJ4QmRbal0gPSB1Z2V0aC0+cF9yeF9iZF9yaW5nW2pdOwogCQlmb3IgKGkgPSAwOyBpIDwgdWdfaW5mby0+YmRSaW5nTGVuUnhbal07IGkrKykgewotCQkJQkRfU1RBVFVTX0FORF9MRU5HVEhfU0VUKGJkLCBSX0kpOwotCQkJQkRfQlVGRkVSX0NMRUFSKGJkKTsKLQkJCWJkICs9IFVDQ19HRVRIX1NJWkVfT0ZfQkQ7CisJCQkvKiBzZXQgYmQgc3RhdHVzIGFuZCBsZW5ndGggKi8KKwkJCW91dF9iZTMyKCh1MzIgKiliZCwgUl9JKTsKKwkJCS8qIGNsZWFyIGJkIGJ1ZmZlciAqLworCQkJb3V0X2JlMzIoJigoc3RydWN0IHFlX2JkICopYmQpLT5idWYsIDApOworCQkJYmQgKz0gc2l6ZW9mKHN0cnVjdCBxZV9iZCk7CiAJCX0KLQkJYmQgLT0gVUNDX0dFVEhfU0laRV9PRl9CRDsKLQkJQkRfU1RBVFVTX0FORF9MRU5HVEhfU0VUKGJkLCBSX1cpOy8qIGZvciBsYXN0IEJEIHNldCBXcmFwIGJpdCAqLworCQliZCAtPSBzaXplb2Yoc3RydWN0IHFlX2JkKTsKKwkJLyogc2V0IGJkIHN0YXR1cyBhbmQgbGVuZ3RoICovCisJCW91dF9iZTMyKCh1MzIgKiliZCwgUl9XKTsgLyogZm9yIGxhc3QgQkQgc2V0IFdyYXAgYml0ICovCiAJfQogCiAJLyoKQEAgLTMwMDMsNyArMjk5MSw3IEBACiAJLyogVHggZ2xvYmFsIFBSQU0gKi8KIAkvKiBBbGxvY2F0ZSBnbG9iYWwgdHggcGFyYW1ldGVyIFJBTSBwYWdlICovCiAJdWdldGgtPnR4X2dsYmxfcHJhbV9vZmZzZXQgPQotCSAgICBxZV9tdXJhbV9hbGxvYyhzaXplb2YodWNjX2dldGhfdHhfZ2xvYmFsX3ByYW1fdCksCisJICAgIHFlX211cmFtX2FsbG9jKHNpemVvZihzdHJ1Y3QgdWNjX2dldGhfdHhfZ2xvYmFsX3ByYW0pLAogCQkJICAgVUNDX0dFVEhfVFhfR0xPQkFMX1BSQU1fQUxJR05NRU5UKTsKIAlpZiAoSVNfTVVSQU1fRVJSKHVnZXRoLT50eF9nbGJsX3ByYW1fb2Zmc2V0KSkgewogCQl1Z2V0aF9lcnIKQEAgLTMwMTMsMTAgKzMwMDEsMTAgQEAKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQogCXVnZXRoLT5wX3R4X2dsYmxfcHJhbSA9Ci0JICAgICh1Y2NfZ2V0aF90eF9nbG9iYWxfcHJhbV90ICopIHFlX211cmFtX2FkZHIodWdldGgtPgorCSAgICAoc3RydWN0IHVjY19nZXRoX3R4X2dsb2JhbF9wcmFtICopIHFlX211cmFtX2FkZHIodWdldGgtPgogCQkJCQkJCXR4X2dsYmxfcHJhbV9vZmZzZXQpOwogCS8qIFplcm8gb3V0IHBfdHhfZ2xibF9wcmFtICovCi0JbWVtc2V0KHVnZXRoLT5wX3R4X2dsYmxfcHJhbSwgMCwgc2l6ZW9mKHVjY19nZXRoX3R4X2dsb2JhbF9wcmFtX3QpKTsKKwltZW1zZXQodWdldGgtPnBfdHhfZ2xibF9wcmFtLCAwLCBzaXplb2Yoc3RydWN0IHVjY19nZXRoX3R4X2dsb2JhbF9wcmFtKSk7CiAKIAkvKiBGaWxsIGdsb2JhbCBQUkFNICovCiAKQEAgLTMwMjQsNyArMzAxMiw3IEBACiAJLyogU2l6ZSB2YXJpZXMgd2l0aCBudW1iZXIgb2YgVHggdGhyZWFkcyAqLwogCXVnZXRoLT50aHJlYWRfZGF0X3R4X29mZnNldCA9CiAJICAgIHFlX211cmFtX2FsbG9jKG51bVRocmVhZHNUeE51bWVyaWNhbCAqCi0JCQkgICBzaXplb2YodWNjX2dldGhfdGhyZWFkX2RhdGFfdHhfdCkgKworCQkJICAgc2l6ZW9mKHN0cnVjdCB1Y2NfZ2V0aF90aHJlYWRfZGF0YV90eCkgKwogCQkJICAgMzIgKiAobnVtVGhyZWFkc1R4TnVtZXJpY2FsID09IDEpLAogCQkJICAgVUNDX0dFVEhfVEhSRUFEX0RBVEFfQUxJR05NRU5UKTsKIAlpZiAoSVNfTVVSQU1fRVJSKHVnZXRoLT50aHJlYWRfZGF0X3R4X29mZnNldCkpIHsKQEAgLTMwMzYsNyArMzAyNCw3IEBACiAJfQogCiAJdWdldGgtPnBfdGhyZWFkX2RhdGFfdHggPQotCSAgICAodWNjX2dldGhfdGhyZWFkX2RhdGFfdHhfdCAqKSBxZV9tdXJhbV9hZGRyKHVnZXRoLT4KKwkgICAgKHN0cnVjdCB1Y2NfZ2V0aF90aHJlYWRfZGF0YV90eCAqKSBxZV9tdXJhbV9hZGRyKHVnZXRoLT4KIAkJCQkJCQl0aHJlYWRfZGF0X3R4X29mZnNldCk7CiAJb3V0X2JlMzIoJnVnZXRoLT5wX3R4X2dsYmxfcHJhbS0+dHFwdHIsIHVnZXRoLT50aHJlYWRfZGF0X3R4X29mZnNldCk7CiAKQEAgLTMwNTMsNyArMzA0MSw3IEBACiAJLyogU2l6ZSB2YXJpZXMgd2l0aCBudW1iZXIgb2YgVHggcXVldWVzICovCiAJdWdldGgtPnNlbmRfcV9tZW1fcmVnX29mZnNldCA9CiAJICAgIHFlX211cmFtX2FsbG9jKHVnX2luZm8tPm51bVF1ZXVlc1R4ICoKLQkJCSAgIHNpemVvZih1Y2NfZ2V0aF9zZW5kX3F1ZXVlX3FkX3QpLAorCQkJICAgc2l6ZW9mKHN0cnVjdCB1Y2NfZ2V0aF9zZW5kX3F1ZXVlX3FkKSwKIAkJCSAgIFVDQ19HRVRIX1NFTkRfUVVFVUVfUVVFVUVfREVTQ1JJUFRPUl9BTElHTk1FTlQpOwogCWlmIChJU19NVVJBTV9FUlIodWdldGgtPnNlbmRfcV9tZW1fcmVnX29mZnNldCkpIHsKIAkJdWdldGhfZXJyCkBAIC0zMDY0LDcgKzMwNTIsNyBAQAogCX0KIAogCXVnZXRoLT5wX3NlbmRfcV9tZW1fcmVnID0KLQkgICAgKHVjY19nZXRoX3NlbmRfcXVldWVfbWVtX3JlZ2lvbl90ICopIHFlX211cmFtX2FkZHIodWdldGgtPgorCSAgICAoc3RydWN0IHVjY19nZXRoX3NlbmRfcXVldWVfbWVtX3JlZ2lvbiAqKSBxZV9tdXJhbV9hZGRyKHVnZXRoLT4KIAkJCXNlbmRfcV9tZW1fcmVnX29mZnNldCk7CiAJb3V0X2JlMzIoJnVnZXRoLT5wX3R4X2dsYmxfcHJhbS0+c3FwdHIsIHVnZXRoLT5zZW5kX3FfbWVtX3JlZ19vZmZzZXQpOwogCkBAIC0zMDczLDcgKzMwNjEsNyBAQAogCWZvciAoaSA9IDA7IGkgPCB1Z19pbmZvLT5udW1RdWV1ZXNUeDsgaSsrKSB7CiAJCWVuZE9mUmluZyA9CiAJCSAgICB1Z2V0aC0+cF90eF9iZF9yaW5nW2ldICsgKHVnX2luZm8tPmJkUmluZ0xlblR4W2ldIC0KLQkJCQkJICAgICAgMSkgKiBVQ0NfR0VUSF9TSVpFX09GX0JEOworCQkJCQkgICAgICAxKSAqIHNpemVvZihzdHJ1Y3QgcWVfYmQpOwogCQlpZiAodWdldGgtPnVnX2luZm8tPnVmX2luZm8uYmRfbWVtX3BhcnQgPT0gTUVNX1BBUlRfU1lTVEVNKSB7CiAJCQlvdXRfYmUzMigmdWdldGgtPnBfc2VuZF9xX21lbV9yZWctPnNxcWRbaV0uYmRfcmluZ19iYXNlLAogCQkJCSAodTMyKSB2aXJ0X3RvX3BoeXModWdldGgtPnBfdHhfYmRfcmluZ1tpXSkpOwpAQCAtMzA5Niw3ICszMDg0LDcgQEAKIAlpZiAodWdfaW5mby0+bnVtUXVldWVzVHggPiAxKSB7CiAJLyogc2NoZWR1bGVyIGV4aXN0cyBvbmx5IGlmIG1vcmUgdGhhbiAxIHR4IHF1ZXVlICovCiAJCXVnZXRoLT5zY2hlZHVsZXJfb2Zmc2V0ID0KLQkJICAgIHFlX211cmFtX2FsbG9jKHNpemVvZih1Y2NfZ2V0aF9zY2hlZHVsZXJfdCksCisJCSAgICBxZV9tdXJhbV9hbGxvYyhzaXplb2Yoc3RydWN0IHVjY19nZXRoX3NjaGVkdWxlciksCiAJCQkJICAgVUNDX0dFVEhfU0NIRURVTEVSX0FMSUdOTUVOVCk7CiAJCWlmIChJU19NVVJBTV9FUlIodWdldGgtPnNjaGVkdWxlcl9vZmZzZXQpKSB7CiAJCQl1Z2V0aF9lcnIKQEAgLTMxMDcsMTIgKzMwOTUsMTIgQEAKIAkJfQogCiAJCXVnZXRoLT5wX3NjaGVkdWxlciA9Ci0JCSAgICAodWNjX2dldGhfc2NoZWR1bGVyX3QgKikgcWVfbXVyYW1fYWRkcih1Z2V0aC0+CisJCSAgICAoc3RydWN0IHVjY19nZXRoX3NjaGVkdWxlciAqKSBxZV9tdXJhbV9hZGRyKHVnZXRoLT4KIAkJCQkJCQkgICBzY2hlZHVsZXJfb2Zmc2V0KTsKIAkJb3V0X2JlMzIoJnVnZXRoLT5wX3R4X2dsYmxfcHJhbS0+c2NoZWR1bGVyYmFzZXBvaW50ZXIsCiAJCQkgdWdldGgtPnNjaGVkdWxlcl9vZmZzZXQpOwogCQkvKiBaZXJvIG91dCBwX3NjaGVkdWxlciAqLwotCQltZW1zZXQodWdldGgtPnBfc2NoZWR1bGVyLCAwLCBzaXplb2YodWNjX2dldGhfc2NoZWR1bGVyX3QpKTsKKwkJbWVtc2V0KHVnZXRoLT5wX3NjaGVkdWxlciwgMCwgc2l6ZW9mKHN0cnVjdCB1Y2NfZ2V0aF9zY2hlZHVsZXIpKTsKIAogCQkvKiBTZXQgdmFsdWVzIGluIHNjaGVkdWxlciAqLwogCQlvdXRfYmUzMigmdWdldGgtPnBfc2NoZWR1bGVyLT5tYmxpbnRlcnZhbCwKQEAgLTMxNDQsNyArMzEzMiw3IEBACiAJICAgIHN0YXRpc3RpY3NNb2RlICYgVUNDX0dFVEhfU1RBVElTVElDU19HQVRIRVJJTkdfTU9ERV9GSVJNV0FSRV9UWCkgewogCQl1Z2V0aC0+dHhfZndfc3RhdGlzdGljc19wcmFtX29mZnNldCA9CiAJCSAgICBxZV9tdXJhbV9hbGxvYyhzaXplb2YKLQkJCQkgICAodWNjX2dldGhfdHhfZmlybXdhcmVfc3RhdGlzdGljc19wcmFtX3QpLAorCQkJCSAgIChzdHJ1Y3QgdWNjX2dldGhfdHhfZmlybXdhcmVfc3RhdGlzdGljc19wcmFtKSwKIAkJCQkgICBVQ0NfR0VUSF9UWF9TVEFUSVNUSUNTX0FMSUdOTUVOVCk7CiAJCWlmIChJU19NVVJBTV9FUlIodWdldGgtPnR4X2Z3X3N0YXRpc3RpY3NfcHJhbV9vZmZzZXQpKSB7CiAJCQl1Z2V0aF9lcnIKQEAgLTMxNTQsMTEgKzMxNDIsMTEgQEAKIAkJCXJldHVybiAtRU5PTUVNOwogCQl9CiAJCXVnZXRoLT5wX3R4X2Z3X3N0YXRpc3RpY3NfcHJhbSA9Ci0JCSAgICAodWNjX2dldGhfdHhfZmlybXdhcmVfc3RhdGlzdGljc19wcmFtX3QgKikKKwkJICAgIChzdHJ1Y3QgdWNjX2dldGhfdHhfZmlybXdhcmVfc3RhdGlzdGljc19wcmFtICopCiAJCSAgICBxZV9tdXJhbV9hZGRyKHVnZXRoLT50eF9md19zdGF0aXN0aWNzX3ByYW1fb2Zmc2V0KTsKIAkJLyogWmVybyBvdXQgcF90eF9md19zdGF0aXN0aWNzX3ByYW0gKi8KIAkJbWVtc2V0KHVnZXRoLT5wX3R4X2Z3X3N0YXRpc3RpY3NfcHJhbSwKLQkJICAgICAgIDAsIHNpemVvZih1Y2NfZ2V0aF90eF9maXJtd2FyZV9zdGF0aXN0aWNzX3ByYW1fdCkpOworCQkgICAgICAgMCwgc2l6ZW9mKHN0cnVjdCB1Y2NfZ2V0aF90eF9maXJtd2FyZV9zdGF0aXN0aWNzX3ByYW0pKTsKIAl9CiAKIAkvKiB0ZW1vZGVyICovCkBAIC0zMTgzLDcgKzMxNzEsNyBAQAogCS8qIFJ4IGdsb2JhbCBQUkFNICovCiAJLyogQWxsb2NhdGUgZ2xvYmFsIHJ4IHBhcmFtZXRlciBSQU0gcGFnZSAqLwogCXVnZXRoLT5yeF9nbGJsX3ByYW1fb2Zmc2V0ID0KLQkgICAgcWVfbXVyYW1fYWxsb2Moc2l6ZW9mKHVjY19nZXRoX3J4X2dsb2JhbF9wcmFtX3QpLAorCSAgICBxZV9tdXJhbV9hbGxvYyhzaXplb2Yoc3RydWN0IHVjY19nZXRoX3J4X2dsb2JhbF9wcmFtKSwKIAkJCSAgIFVDQ19HRVRIX1JYX0dMT0JBTF9QUkFNX0FMSUdOTUVOVCk7CiAJaWYgKElTX01VUkFNX0VSUih1Z2V0aC0+cnhfZ2xibF9wcmFtX29mZnNldCkpIHsKIAkJdWdldGhfZXJyCkBAIC0zMTkzLDEwICszMTgxLDEwIEBACiAJCXJldHVybiAtRU5PTUVNOwogCX0KIAl1Z2V0aC0+cF9yeF9nbGJsX3ByYW0gPQotCSAgICAodWNjX2dldGhfcnhfZ2xvYmFsX3ByYW1fdCAqKSBxZV9tdXJhbV9hZGRyKHVnZXRoLT4KKwkgICAgKHN0cnVjdCB1Y2NfZ2V0aF9yeF9nbG9iYWxfcHJhbSAqKSBxZV9tdXJhbV9hZGRyKHVnZXRoLT4KIAkJCQkJCQlyeF9nbGJsX3ByYW1fb2Zmc2V0KTsKIAkvKiBaZXJvIG91dCBwX3J4X2dsYmxfcHJhbSAqLwotCW1lbXNldCh1Z2V0aC0+cF9yeF9nbGJsX3ByYW0sIDAsIHNpemVvZih1Y2NfZ2V0aF9yeF9nbG9iYWxfcHJhbV90KSk7CisJbWVtc2V0KHVnZXRoLT5wX3J4X2dsYmxfcHJhbSwgMCwgc2l6ZW9mKHN0cnVjdCB1Y2NfZ2V0aF9yeF9nbG9iYWxfcHJhbSkpOwogCiAJLyogRmlsbCBnbG9iYWwgUFJBTSAqLwogCkBAIC0zMjA0LDcgKzMxOTIsNyBAQAogCS8qIFNpemUgdmFyaWVzIHdpdGggbnVtYmVyIG9mIFJ4IHRocmVhZHMgKi8KIAl1Z2V0aC0+dGhyZWFkX2RhdF9yeF9vZmZzZXQgPQogCSAgICBxZV9tdXJhbV9hbGxvYyhudW1UaHJlYWRzUnhOdW1lcmljYWwgKgotCQkJICAgc2l6ZW9mKHVjY19nZXRoX3RocmVhZF9kYXRhX3J4X3QpLAorCQkJICAgc2l6ZW9mKHN0cnVjdCB1Y2NfZ2V0aF90aHJlYWRfZGF0YV9yeCksCiAJCQkgICBVQ0NfR0VUSF9USFJFQURfREFUQV9BTElHTk1FTlQpOwogCWlmIChJU19NVVJBTV9FUlIodWdldGgtPnRocmVhZF9kYXRfcnhfb2Zmc2V0KSkgewogCQl1Z2V0aF9lcnIKQEAgLTMyMTUsNyArMzIwMyw3IEBACiAJfQogCiAJdWdldGgtPnBfdGhyZWFkX2RhdGFfcnggPQotCSAgICAodWNjX2dldGhfdGhyZWFkX2RhdGFfcnhfdCAqKSBxZV9tdXJhbV9hZGRyKHVnZXRoLT4KKwkgICAgKHN0cnVjdCB1Y2NfZ2V0aF90aHJlYWRfZGF0YV9yeCAqKSBxZV9tdXJhbV9hZGRyKHVnZXRoLT4KIAkJCQkJCQl0aHJlYWRfZGF0X3J4X29mZnNldCk7CiAJb3V0X2JlMzIoJnVnZXRoLT5wX3J4X2dsYmxfcHJhbS0+cnFwdHIsIHVnZXRoLT50aHJlYWRfZGF0X3J4X29mZnNldCk7CiAKQEAgLTMyMjcsNyArMzIxNSw3IEBACiAJICAgIHN0YXRpc3RpY3NNb2RlICYgVUNDX0dFVEhfU1RBVElTVElDU19HQVRIRVJJTkdfTU9ERV9GSVJNV0FSRV9SWCkgewogCQl1Z2V0aC0+cnhfZndfc3RhdGlzdGljc19wcmFtX29mZnNldCA9CiAJCSAgICBxZV9tdXJhbV9hbGxvYyhzaXplb2YKLQkJCQkgICAodWNjX2dldGhfcnhfZmlybXdhcmVfc3RhdGlzdGljc19wcmFtX3QpLAorCQkJCSAgIChzdHJ1Y3QgdWNjX2dldGhfcnhfZmlybXdhcmVfc3RhdGlzdGljc19wcmFtKSwKIAkJCQkgICBVQ0NfR0VUSF9SWF9TVEFUSVNUSUNTX0FMSUdOTUVOVCk7CiAJCWlmIChJU19NVVJBTV9FUlIodWdldGgtPnJ4X2Z3X3N0YXRpc3RpY3NfcHJhbV9vZmZzZXQpKSB7CiAJCQl1Z2V0aF9lcnIKQEAgLTMyMzcsMTEgKzMyMjUsMTEgQEAKIAkJCXJldHVybiAtRU5PTUVNOwogCQl9CiAJCXVnZXRoLT5wX3J4X2Z3X3N0YXRpc3RpY3NfcHJhbSA9Ci0JCSAgICAodWNjX2dldGhfcnhfZmlybXdhcmVfc3RhdGlzdGljc19wcmFtX3QgKikKKwkJICAgIChzdHJ1Y3QgdWNjX2dldGhfcnhfZmlybXdhcmVfc3RhdGlzdGljc19wcmFtICopCiAJCSAgICBxZV9tdXJhbV9hZGRyKHVnZXRoLT5yeF9md19zdGF0aXN0aWNzX3ByYW1fb2Zmc2V0KTsKIAkJLyogWmVybyBvdXQgcF9yeF9md19zdGF0aXN0aWNzX3ByYW0gKi8KIAkJbWVtc2V0KHVnZXRoLT5wX3J4X2Z3X3N0YXRpc3RpY3NfcHJhbSwgMCwKLQkJICAgICAgIHNpemVvZih1Y2NfZ2V0aF9yeF9maXJtd2FyZV9zdGF0aXN0aWNzX3ByYW1fdCkpOworCQkgICAgICAgc2l6ZW9mKHN0cnVjdCB1Y2NfZ2V0aF9yeF9maXJtd2FyZV9zdGF0aXN0aWNzX3ByYW0pKTsKIAl9CiAKIAkvKiBpbnRDb2FsZXNjaW5nUHRyICovCkBAIC0zMjQ5LDcgKzMyMzcsNyBAQAogCS8qIFNpemUgdmFyaWVzIHdpdGggbnVtYmVyIG9mIFJ4IHF1ZXVlcyAqLwogCXVnZXRoLT5yeF9pcnFfY29hbGVzY2luZ190Ymxfb2Zmc2V0ID0KIAkgICAgcWVfbXVyYW1fYWxsb2ModWdfaW5mby0+bnVtUXVldWVzUnggKgotCQkJICAgc2l6ZW9mKHVjY19nZXRoX3J4X2ludGVycnVwdF9jb2FsZXNjaW5nX2VudHJ5X3QpLAorCQkJICAgc2l6ZW9mKHN0cnVjdCB1Y2NfZ2V0aF9yeF9pbnRlcnJ1cHRfY29hbGVzY2luZ19lbnRyeSksCiAJCQkgICBVQ0NfR0VUSF9SWF9JTlRFUlJVUFRfQ09BTEVTQ0lOR19BTElHTk1FTlQpOwogCWlmIChJU19NVVJBTV9FUlIodWdldGgtPnJ4X2lycV9jb2FsZXNjaW5nX3RibF9vZmZzZXQpKSB7CiAJCXVnZXRoX2VycgpAQCAtMzI2MCw3ICszMjQ4LDcgQEAKIAl9CiAKIAl1Z2V0aC0+cF9yeF9pcnFfY29hbGVzY2luZ190YmwgPQotCSAgICAodWNjX2dldGhfcnhfaW50ZXJydXB0X2NvYWxlc2NpbmdfdGFibGVfdCAqKQorCSAgICAoc3RydWN0IHVjY19nZXRoX3J4X2ludGVycnVwdF9jb2FsZXNjaW5nX3RhYmxlICopCiAJICAgIHFlX211cmFtX2FkZHIodWdldGgtPnJ4X2lycV9jb2FsZXNjaW5nX3RibF9vZmZzZXQpOwogCW91dF9iZTMyKCZ1Z2V0aC0+cF9yeF9nbGJsX3ByYW0tPmludGNvYWxlc2NpbmdwdHIsCiAJCSB1Z2V0aC0+cnhfaXJxX2NvYWxlc2NpbmdfdGJsX29mZnNldCk7CkBAIC0zMzAwLDcgKzMyODgsNyBAQAogCQlsM3F0ID0gMDsKIAkJZm9yIChpID0gMDsgaSA8IDg7IGkrKykKIAkJCWwzcXQgfD0gKHVnX2luZm8tPmwzcXRbaiArIGldIDw8ICgyOCAtIDQgKiBpKSk7Ci0JCW91dF9iZTMyKCZ1Z2V0aC0+cF9yeF9nbGJsX3ByYW0tPmwzcXRbal0sIGwzcXQpOworCQlvdXRfYmUzMigmdWdldGgtPnBfcnhfZ2xibF9wcmFtLT5sM3F0W2ovOF0sIGwzcXQpOwogCX0KIAogCS8qIHZsYW50eXBlICovCkBAIC0zMzE2LDggKzMzMDQsOCBAQAogCS8qIFNpemUgdmFyaWVzIHdpdGggbnVtYmVyIG9mIFJ4IHF1ZXVlcyAqLwogCXVnZXRoLT5yeF9iZF9xc190Ymxfb2Zmc2V0ID0KIAkgICAgcWVfbXVyYW1fYWxsb2ModWdfaW5mby0+bnVtUXVldWVzUnggKgotCQkJICAgKHNpemVvZih1Y2NfZ2V0aF9yeF9iZF9xdWV1ZXNfZW50cnlfdCkgKwotCQkJICAgIHNpemVvZih1Y2NfZ2V0aF9yeF9wcmVmZXRjaGVkX2Jkc190KSksCisJCQkgICAoc2l6ZW9mKHN0cnVjdCB1Y2NfZ2V0aF9yeF9iZF9xdWV1ZXNfZW50cnkpICsKKwkJCSAgICBzaXplb2Yoc3RydWN0IHVjY19nZXRoX3J4X3ByZWZldGNoZWRfYmRzKSksCiAJCQkgICBVQ0NfR0VUSF9SWF9CRF9RVUVVRVNfQUxJR05NRU5UKTsKIAlpZiAoSVNfTVVSQU1fRVJSKHVnZXRoLT5yeF9iZF9xc190Ymxfb2Zmc2V0KSkgewogCQl1Z2V0aF9lcnIKQEAgLTMzMjgsMTQgKzMzMTYsMTQgQEAKIAl9CiAKIAl1Z2V0aC0+cF9yeF9iZF9xc190YmwgPQotCSAgICAodWNjX2dldGhfcnhfYmRfcXVldWVzX2VudHJ5X3QgKikgcWVfbXVyYW1fYWRkcih1Z2V0aC0+CisJICAgIChzdHJ1Y3QgdWNjX2dldGhfcnhfYmRfcXVldWVzX2VudHJ5ICopIHFlX211cmFtX2FkZHIodWdldGgtPgogCQkJCSAgICByeF9iZF9xc190Ymxfb2Zmc2V0KTsKIAlvdXRfYmUzMigmdWdldGgtPnBfcnhfZ2xibF9wcmFtLT5yYmRxcHRyLCB1Z2V0aC0+cnhfYmRfcXNfdGJsX29mZnNldCk7CiAJLyogWmVybyBvdXQgcF9yeF9iZF9xc190YmwgKi8KIAltZW1zZXQodWdldGgtPnBfcnhfYmRfcXNfdGJsLAogCSAgICAgICAwLAotCSAgICAgICB1Z19pbmZvLT5udW1RdWV1ZXNSeCAqIChzaXplb2YodWNjX2dldGhfcnhfYmRfcXVldWVzX2VudHJ5X3QpICsKLQkJCQkgICAgICAgc2l6ZW9mKHVjY19nZXRoX3J4X3ByZWZldGNoZWRfYmRzX3QpKSk7CisJICAgICAgIHVnX2luZm8tPm51bVF1ZXVlc1J4ICogKHNpemVvZihzdHJ1Y3QgdWNjX2dldGhfcnhfYmRfcXVldWVzX2VudHJ5KSArCisJCQkJICAgICAgIHNpemVvZihzdHJ1Y3QgdWNjX2dldGhfcnhfcHJlZmV0Y2hlZF9iZHMpKSk7CiAKIAkvKiBTZXR1cCB0aGUgdGFibGUgKi8KIAkvKiBBc3N1bWUgQkQgcmluZ3MgYXJlIGFscmVhZHkgZXN0YWJsaXNoZWQgKi8KQEAgLTM0MDYsNyArMzM5NCw3IEBACiAJCS8qIEFsbG9jYXRlIG1lbW9yeSBmb3IgZXh0ZW5kZWQgZmlsdGVyaW5nIE1vZGUgR2xvYmFsCiAJCVBhcmFtZXRlcnMgKi8KIAkJdWdldGgtPmV4Zl9nbGJsX3BhcmFtX29mZnNldCA9Ci0JCSAgICBxZV9tdXJhbV9hbGxvYyhzaXplb2YodWNjX2dldGhfZXhmX2dsb2JhbF9wcmFtX3QpLAorCQkgICAgcWVfbXVyYW1fYWxsb2Moc2l6ZW9mKHN0cnVjdCB1Y2NfZ2V0aF9leGZfZ2xvYmFsX3ByYW0pLAogCQlVQ0NfR0VUSF9SWF9FWFRFTkRFRF9GSUxURVJJTkdfR0xPQkFMX1BBUkFNRVRFUlNfQUxJR05NRU5UKTsKIAkJaWYgKElTX01VUkFNX0VSUih1Z2V0aC0+ZXhmX2dsYmxfcGFyYW1fb2Zmc2V0KSkgewogCQkJdWdldGhfZXJyCkBAIC0zNDE3LDcgKzM0MDUsNyBAQAogCQl9CiAKIAkJdWdldGgtPnBfZXhmX2dsYmxfcGFyYW0gPQotCQkgICAgKHVjY19nZXRoX2V4Zl9nbG9iYWxfcHJhbV90ICopIHFlX211cmFtX2FkZHIodWdldGgtPgorCQkgICAgKHN0cnVjdCB1Y2NfZ2V0aF9leGZfZ2xvYmFsX3ByYW0gKikgcWVfbXVyYW1fYWRkcih1Z2V0aC0+CiAJCQkJIGV4Zl9nbGJsX3BhcmFtX29mZnNldCk7CiAJCW91dF9iZTMyKCZ1Z2V0aC0+cF9yeF9nbGJsX3ByYW0tPmV4Zkdsb2JhbFBhcmFtLAogCQkJIHVnZXRoLT5leGZfZ2xibF9wYXJhbV9vZmZzZXQpOwpAQCAtMzQzOSw3ICszNDI3LDcgQEAKIAkJCUlOSVRfTElTVF9IRUFEKCZ1Z2V0aC0+aW5kX2hhc2hfcSk7CiAJCX0KIAkJcF84Mnh4X2FkZHJfZmlsdCA9Ci0JCSAgICAodWNjX2dldGhfODJ4eF9hZGRyZXNzX2ZpbHRlcmluZ19wcmFtX3QgKikgdWdldGgtPgorCQkgICAgKHN0cnVjdCB1Y2NfZ2V0aF84Mnh4X2FkZHJlc3NfZmlsdGVyaW5nX3ByYW0gKikgdWdldGgtPgogCQkgICAgcF9yeF9nbGJsX3ByYW0tPmFkZHJlc3NmaWx0ZXJpbmc7CiAKIAkJdWdldGhfODJ4eF9maWx0ZXJpbmdfY2xlYXJfYWxsX2FkZHJfaW5faGFzaCh1Z2V0aCwKQEAgLTM0NjIsNyArMzQ1MCw3IEBACiAJICogYWxsb2NhdGVkIHJlc291cmNlcyBjYW4gYmUgcmVsZWFzZWQgd2hlbiB0aGUgY2hhbm5lbCBpcyBmcmVlZC4KIAkgKi8KIAlpZiAoISh1Z2V0aC0+cF9pbml0X2VuZXRfcGFyYW1fc2hhZG93ID0KLQkgICAgICh1Y2NfZ2V0aF9pbml0X3ByYW1fdCAqKSBrbWFsbG9jKHNpemVvZih1Y2NfZ2V0aF9pbml0X3ByYW1fdCksCisJICAgICAoc3RydWN0IHVjY19nZXRoX2luaXRfcHJhbSAqKSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgdWNjX2dldGhfaW5pdF9wcmFtKSwKIAkJCQkJICAgICAgR0ZQX0tFUk5FTCkpKSB7CiAJCXVnZXRoX2VycgogCQkgICAgKCIlczogQ2FuIG5vdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIgpAQCAtMzQ3Miw3ICszNDYwLDcgQEAKIAl9CiAJLyogWmVybyBvdXQgKnBfaW5pdF9lbmV0X3BhcmFtX3NoYWRvdyAqLwogCW1lbXNldCgoY2hhciAqKXVnZXRoLT5wX2luaXRfZW5ldF9wYXJhbV9zaGFkb3csCi0JICAgICAgIDAsIHNpemVvZih1Y2NfZ2V0aF9pbml0X3ByYW1fdCkpOworCSAgICAgICAwLCBzaXplb2Yoc3RydWN0IHVjY19nZXRoX2luaXRfcHJhbSkpOwogCiAJLyogRmlsbCBzaGFkb3cgSW5pdEVuZXQgY29tbWFuZCBwYXJhbWV0ZXIgc3RydWN0dXJlICovCiAKQEAgLTM1MDYsNyArMzQ5NCw3IEBACiAJfQogCXVnZXRoLT5wX2luaXRfZW5ldF9wYXJhbV9zaGFkb3ctPmxhcmdlc3RleHRlcm5hbGxvb2t1cGtleXNpemUgPQogCSAgICB1Z19pbmZvLT5sYXJnZXN0ZXh0ZXJuYWxsb29rdXBrZXlzaXplOwotCXNpemUgPSBzaXplb2YodWNjX2dldGhfdGhyZWFkX3J4X3ByYW1fdCk7CisJc2l6ZSA9IHNpemVvZihzdHJ1Y3QgdWNjX2dldGhfdGhyZWFkX3J4X3ByYW0pOwogCWlmICh1Z19pbmZvLT5yeEV4dGVuZGVkRmlsdGVyaW5nKSB7CiAJCXNpemUgKz0gVEhSRUFEX1JYX1BSQU1fQURESVRJT05BTF9GT1JfRVhURU5ERURfRklMVEVSSU5HOwogCQlpZiAodWdfaW5mby0+bGFyZ2VzdGV4dGVybmFsbG9va3Vwa2V5c2l6ZSA9PQpAQCAtMzUzNyw3ICszNTI1LDcgQEAKIAkgICAgIGZpbGxfaW5pdF9lbmV0X2VudHJpZXModWdldGgsCiAJCQkJICAgICYodWdldGgtPnBfaW5pdF9lbmV0X3BhcmFtX3NoYWRvdy0+CiAJCQkJICAgICAgdHh0aHJlYWRbMF0pLCBudW1UaHJlYWRzVHhOdW1lcmljYWwsCi0JCQkJICAgIHNpemVvZih1Y2NfZ2V0aF90aHJlYWRfdHhfcHJhbV90KSwKKwkJCQkgICAgc2l6ZW9mKHN0cnVjdCB1Y2NfZ2V0aF90aHJlYWRfdHhfcHJhbSksCiAJCQkJICAgIFVDQ19HRVRIX1RIUkVBRF9UWF9QUkFNX0FMSUdOTUVOVCwKIAkJCQkgICAgdWdfaW5mby0+cmlzY1R4LCAwKSkgIT0gMCkgewogCQl1Z2V0aF9lcnIoIiVzOiBDYW4gbm90IGZpbGwgcF9pbml0X2VuZXRfcGFyYW1fc2hhZG93LiIsCkBAIC0zNTU3LDcgKzM1NDUsNyBAQAogCX0KIAogCS8qIEFsbG9jYXRlIEluaXRFbmV0IGNvbW1hbmQgcGFyYW1ldGVyIHN0cnVjdHVyZSAqLwotCWluaXRfZW5ldF9wcmFtX29mZnNldCA9IHFlX211cmFtX2FsbG9jKHNpemVvZih1Y2NfZ2V0aF9pbml0X3ByYW1fdCksIDQpOworCWluaXRfZW5ldF9wcmFtX29mZnNldCA9IHFlX211cmFtX2FsbG9jKHNpemVvZihzdHJ1Y3QgdWNjX2dldGhfaW5pdF9wcmFtKSwgNCk7CiAJaWYgKElTX01VUkFNX0VSUihpbml0X2VuZXRfcHJhbV9vZmZzZXQpKSB7CiAJCXVnZXRoX2VycgogCQkgICAgKCIlczogQ2FuIG5vdCBhbGxvY2F0ZSBEUFJBTSBtZW1vcnkgZm9yIHBfaW5pdF9lbmV0X3ByYW0uIiwKQEAgLTM1NjYsNyArMzU1NCw3IEBACiAJCXJldHVybiAtRU5PTUVNOwogCX0KIAlwX2luaXRfZW5ldF9wcmFtID0KLQkgICAgKHVjY19nZXRoX2luaXRfcHJhbV90ICopIHFlX211cmFtX2FkZHIoaW5pdF9lbmV0X3ByYW1fb2Zmc2V0KTsKKwkgICAgKHN0cnVjdCB1Y2NfZ2V0aF9pbml0X3ByYW0gKikgcWVfbXVyYW1fYWRkcihpbml0X2VuZXRfcHJhbV9vZmZzZXQpOwogCiAJLyogQ29weSBzaGFkb3cgSW5pdEVuZXQgY29tbWFuZCBwYXJhbWV0ZXIgc3RydWN0dXJlIGludG8gUFJBTSAqLwogCXBfaW5pdF9lbmV0X3ByYW0tPnJlc2luaXQxID0gdWdldGgtPnBfaW5pdF9lbmV0X3BhcmFtX3NoYWRvdy0+cmVzaW5pdDE7CkBAIC0zNTkxLDcgKzM1NzksNyBAQAogCS8qIElzc3VlIFFFIGNvbW1hbmQgKi8KIAljZWNyX3N1YmJsb2NrID0KIAkgICAgdWNjX2Zhc3RfZ2V0X3FlX2NyX3N1YmJsb2NrKHVnZXRoLT51Z19pbmZvLT51Zl9pbmZvLnVjY19udW0pOwotCXFlX2lzc3VlX2NtZChjb21tYW5kLCBjZWNyX3N1YmJsb2NrLCAodTgpIFFFX0NSX1BST1RPQ09MX0VUSEVSTkVULAorCXFlX2lzc3VlX2NtZChjb21tYW5kLCBjZWNyX3N1YmJsb2NrLCBRRV9DUl9QUk9UT0NPTF9FVEhFUk5FVCwKIAkJICAgICBpbml0X2VuZXRfcHJhbV9vZmZzZXQpOwogCiAJLyogRnJlZSBJbml0RW5ldCBjb21tYW5kIHBhcmFtZXRlciAqLwpAQCAtMzYwMyw3ICszNTkxLDcgQEAKIC8qIHJldHVybnMgYSBuZXRfZGV2aWNlX3N0YXRzIHN0cnVjdHVyZSBwb2ludGVyICovCiBzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKnVjY19nZXRoX2dldF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewotCXVjY19nZXRoX3ByaXZhdGVfdCAqdWdldGggPSBuZXRkZXZfcHJpdihkZXYpOworCXN0cnVjdCB1Y2NfZ2V0aF9wcml2YXRlICp1Z2V0aCA9IG5ldGRldl9wcml2KGRldik7CiAKIAlyZXR1cm4gJih1Z2V0aC0+c3RhdHMpOwogfQpAQCAtMzYxNCw3ICszNjAyLDcgQEAKICAqIHN0YXJ0aW5nIG92ZXIgd2lsbCBmaXggdGhlIHByb2JsZW0uICovCiBzdGF0aWMgdm9pZCB1Y2NfZ2V0aF90aW1lb3V0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7Ci0JdWNjX2dldGhfcHJpdmF0ZV90ICp1Z2V0aCA9IG5ldGRldl9wcml2KGRldik7CisJc3RydWN0IHVjY19nZXRoX3ByaXZhdGUgKnVnZXRoID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAogCXVnZXRoX3ZkYmcoIiVzOiBJTiIsIF9fRlVOQ1RJT05fXyk7CiAKQEAgLTM2MzQsNyArMzYyMiw3IEBACiAvKiBJdCBpcyBwb2ludGVkIHRvIGJ5IHRoZSBkZXYtPmhhcmRfc3RhcnRfeG1pdCBmdW5jdGlvbiBwb2ludGVyICovCiBzdGF0aWMgaW50IHVjY19nZXRoX3N0YXJ0X3htaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKIHsKLQl1Y2NfZ2V0aF9wcml2YXRlX3QgKnVnZXRoID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlzdHJ1Y3QgdWNjX2dldGhfcHJpdmF0ZSAqdWdldGggPSBuZXRkZXZfcHJpdihkZXYpOwogCXU4ICpiZDsJCQkvKiBCRCBwb2ludGVyICovCiAJdTMyIGJkX3N0YXR1czsKIAl1OCB0eFEgPSAwOwpAQCAtMzY0Nyw3ICszNjM1LDcgQEAKIAogCS8qIFN0YXJ0IGZyb20gdGhlIG5leHQgQkQgdGhhdCBzaG91bGQgYmUgZmlsbGVkICovCiAJYmQgPSB1Z2V0aC0+dHhCZFt0eFFdOwotCWJkX3N0YXR1cyA9IEJEX1NUQVRVU19BTkRfTEVOR1RIKGJkKTsKKwliZF9zdGF0dXMgPSBpbl9iZTMyKCh1MzIgKiliZCk7CiAJLyogU2F2ZSB0aGUgc2tiIHBvaW50ZXIgc28gd2UgY2FuIGZyZWUgaXQgbGF0ZXIgKi8KIAl1Z2V0aC0+dHhfc2tidWZmW3R4UV1bdWdldGgtPnNrYl9jdXJ0eFt0eFFdXSA9IHNrYjsKIApAQCAtMzY1NywyMCArMzY0NSwyMSBAQAogCSAgICAgMSkgJiBUWF9SSU5HX01PRF9NQVNLKHVnZXRoLT51Z19pbmZvLT5iZFJpbmdMZW5UeFt0eFFdKTsKIAogCS8qIHNldCB1cCB0aGUgYnVmZmVyIGRlc2NyaXB0b3IgKi8KLQlCRF9CVUZGRVJfU0VUKGJkLAorCW91dF9iZTMyKCYoKHN0cnVjdCBxZV9iZCAqKWJkKS0+YnVmLAogCQkgICAgICBkbWFfbWFwX3NpbmdsZShOVUxMLCBza2ItPmRhdGEsIHNrYi0+bGVuLCBETUFfVE9fREVWSUNFKSk7CiAKLQkvL3ByaW50ayhLRVJOX0RFQlVHInNrYi0+ZGF0YSBpcyAweCV4XG4iLHNrYi0+ZGF0YSk7CisJLyogcHJpbnRrKEtFUk5fREVCVUcic2tiLT5kYXRhIGlzIDB4JXhcbiIsc2tiLT5kYXRhKTsgKi8KIAogCWJkX3N0YXR1cyA9IChiZF9zdGF0dXMgJiBUX1cpIHwgVF9SIHwgVF9JIHwgVF9MIHwgc2tiLT5sZW47CiAKLQlCRF9TVEFUVVNfQU5EX0xFTkdUSF9TRVQoYmQsIGJkX3N0YXR1cyk7CisJLyogc2V0IGJkIHN0YXR1cyBhbmQgbGVuZ3RoICovCisJb3V0X2JlMzIoKHUzMiAqKWJkLCBiZF9zdGF0dXMpOwogCiAJZGV2LT50cmFuc19zdGFydCA9IGppZmZpZXM7CiAKIAkvKiBNb3ZlIHRvIG5leHQgQkQgaW4gdGhlIHJpbmcgKi8KIAlpZiAoIShiZF9zdGF0dXMgJiBUX1cpKQotCQl1Z2V0aC0+dHhCZFt0eFFdID0gYmQgKyBVQ0NfR0VUSF9TSVpFX09GX0JEOworCQl1Z2V0aC0+dHhCZFt0eFFdID0gYmQgKyBzaXplb2Yoc3RydWN0IHFlX2JkKTsKIAllbHNlCiAJCXVnZXRoLT50eEJkW3R4UV0gPSB1Z2V0aC0+cF90eF9iZF9yaW5nW3R4UV07CiAKQEAgLTM2OTUsNyArMzY4NCw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgdWNjX2dldGhfcngodWNjX2dldGhfcHJpdmF0ZV90ICp1Z2V0aCwgdTggcnhRLCBpbnQgcnhfd29ya19saW1pdCkKK3N0YXRpYyBpbnQgdWNjX2dldGhfcngoc3RydWN0IHVjY19nZXRoX3ByaXZhdGUgKnVnZXRoLCB1OCByeFEsIGludCByeF93b3JrX2xpbWl0KQogewogCXN0cnVjdCBza19idWZmICpza2I7CiAJdTggKmJkOwpAQCAtMzcwOSwxMSArMzY5OCwxMSBAQAogCS8qIGNvbGxlY3QgcmVjZWl2ZWQgYnVmZmVycyAqLwogCWJkID0gdWdldGgtPnJ4QmRbcnhRXTsKIAotCWJkX3N0YXR1cyA9IEJEX1NUQVRVU19BTkRfTEVOR1RIKGJkKTsKKwliZF9zdGF0dXMgPSBpbl9iZTMyKCh1MzIgKiliZCk7CiAKIAkvKiB3aGlsZSB0aGVyZSBhcmUgcmVjZWl2ZWQgYnVmZmVycyBhbmQgQkQgaXMgZnVsbCAoflJfRSkgKi8KIAl3aGlsZSAoISgoYmRfc3RhdHVzICYgKFJfRSkpIHx8ICgtLXJ4X3dvcmtfbGltaXQgPCAwKSkpIHsKLQkJYmRCdWZmZXIgPSAodTggKikgQkRfQlVGRkVSKGJkKTsKKwkJYmRCdWZmZXIgPSAodTggKikgaW5fYmUzMigmKChzdHJ1Y3QgcWVfYmQgKiliZCktPmJ1Zik7CiAJCWxlbmd0aCA9ICh1MTYpICgoYmRfc3RhdHVzICYgQkRfTEVOR1RIX01BU0spIC0gNCk7CiAJCXNrYiA9IHVnZXRoLT5yeF9za2J1ZmZbcnhRXVt1Z2V0aC0+c2tiX2N1cnJ4W3J4UV1dOwogCkBAIC0zNzY4LDkgKzM3NTcsOSBAQAogCQlpZiAoYmRfc3RhdHVzICYgUl9XKQogCQkJYmQgPSB1Z2V0aC0+cF9yeF9iZF9yaW5nW3J4UV07CiAJCWVsc2UKLQkJCWJkICs9IFVDQ19HRVRIX1NJWkVfT0ZfQkQ7CisJCQliZCArPSBzaXplb2Yoc3RydWN0IHFlX2JkKTsKIAotCQliZF9zdGF0dXMgPSBCRF9TVEFUVVNfQU5EX0xFTkdUSChiZCk7CisJCWJkX3N0YXR1cyA9IGluX2JlMzIoKHUzMiAqKWJkKTsKIAl9CiAKIAl1Z2V0aC0+cnhCZFtyeFFdID0gYmQ7CkBAIC0zNzgxLDEyICszNzcwLDEyIEBACiBzdGF0aWMgaW50IHVjY19nZXRoX3R4KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHU4IHR4USkKIHsKIAkvKiBTdGFydCBmcm9tIHRoZSBuZXh0IEJEIHRoYXQgc2hvdWxkIGJlIGZpbGxlZCAqLwotCXVjY19nZXRoX3ByaXZhdGVfdCAqdWdldGggPSBuZXRkZXZfcHJpdihkZXYpOworCXN0cnVjdCB1Y2NfZ2V0aF9wcml2YXRlICp1Z2V0aCA9IG5ldGRldl9wcml2KGRldik7CiAJdTggKmJkOwkJCS8qIEJEIHBvaW50ZXIgKi8KIAl1MzIgYmRfc3RhdHVzOwogCiAJYmQgPSB1Z2V0aC0+Y29uZkJkW3R4UV07Ci0JYmRfc3RhdHVzID0gQkRfU1RBVFVTX0FORF9MRU5HVEgoYmQpOworCWJkX3N0YXR1cyA9IGluX2JlMzIoKHUzMiAqKWJkKTsKIAogCS8qIE5vcm1hbCBwcm9jZXNzaW5nLiAqLwogCXdoaWxlICgoYmRfc3RhdHVzICYgVF9SKSA9PSAwKSB7CkBAIC0zODEzLDcgKzM4MDIsNyBAQAogCiAJCS8qIEFkdmFuY2UgdGhlIGNvbmZpcm1hdGlvbiBCRCBwb2ludGVyICovCiAJCWlmICghKGJkX3N0YXR1cyAmIFRfVykpCi0JCQl1Z2V0aC0+Y29uZkJkW3R4UV0gKz0gVUNDX0dFVEhfU0laRV9PRl9CRDsKKwkJCXVnZXRoLT5jb25mQmRbdHhRXSArPSBzaXplb2Yoc3RydWN0IHFlX2JkKTsKIAkJZWxzZQogCQkJdWdldGgtPmNvbmZCZFt0eFFdID0gdWdldGgtPnBfdHhfYmRfcmluZ1t0eFFdOwogCX0KQEAgLTM4MjMsNyArMzgxMiw3IEBACiAjaWZkZWYgQ09ORklHX1VHRVRIX05BUEkKIHN0YXRpYyBpbnQgdWNjX2dldGhfcG9sbChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgKmJ1ZGdldCkKIHsKLQl1Y2NfZ2V0aF9wcml2YXRlX3QgKnVnZXRoID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlzdHJ1Y3QgdWNjX2dldGhfcHJpdmF0ZSAqdWdldGggPSBuZXRkZXZfcHJpdihkZXYpOwogCWludCBob3dtYW55OwogCWludCByeF93b3JrX2xpbWl0ID0gKmJ1ZGdldDsKIAl1OCByeFEgPSAwOwpAQCAtMzg0Nyw5ICszODM2LDkgQEAKIHN0YXRpYyBpcnFyZXR1cm5fdCB1Y2NfZ2V0aF9pcnFfaGFuZGxlcihpbnQgaXJxLCB2b2lkICppbmZvKQogewogCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSAoc3RydWN0IG5ldF9kZXZpY2UgKilpbmZvOwotCXVjY19nZXRoX3ByaXZhdGVfdCAqdWdldGggPSBuZXRkZXZfcHJpdihkZXYpOwotCXVjY19mYXN0X3ByaXZhdGVfdCAqdWNjZjsKLQl1Y2NfZ2V0aF9pbmZvX3QgKnVnX2luZm87CisJc3RydWN0IHVjY19nZXRoX3ByaXZhdGUgKnVnZXRoID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlzdHJ1Y3QgdWNjX2Zhc3RfcHJpdmF0ZSAqdWNjZjsKKwlzdHJ1Y3QgdWNjX2dldGhfaW5mbyAqdWdfaW5mbzsKIAlyZWdpc3RlciB1MzIgdWNjZSA9IDA7CiAJcmVnaXN0ZXIgdTMyIGJpdF9tYXNrID0gVUNDRV9SWEJGX1NJTkdMRV9NQVNLOwogCXJlZ2lzdGVyIHUzMiB0eF9tYXNrID0gVUNDRV9UWEJGX1NJTkdMRV9NQVNLOwpAQCAtMzkxMiw3ICszOTAxLDcgQEAKIHN0YXRpYyBpcnFyZXR1cm5fdCBwaHlfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCkKIHsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gKHN0cnVjdCBuZXRfZGV2aWNlICopZGV2X2lkOwotCXVjY19nZXRoX3ByaXZhdGVfdCAqdWdldGggPSBuZXRkZXZfcHJpdihkZXYpOworCXN0cnVjdCB1Y2NfZ2V0aF9wcml2YXRlICp1Z2V0aCA9IG5ldGRldl9wcml2KGRldik7CiAKIAl1Z2V0aF92ZGJnKCIlczogSU4iLCBfX0ZVTkNUSU9OX18pOwogCkBAIC0zOTMyLDggKzM5MjEsOCBAQAogc3RhdGljIHZvaWQgdWdldGhfcGh5X2NoYW5nZSh2b2lkICpkYXRhKQogewogCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSAoc3RydWN0IG5ldF9kZXZpY2UgKilkYXRhOwotCXVjY19nZXRoX3ByaXZhdGVfdCAqdWdldGggPSBuZXRkZXZfcHJpdihkZXYpOwotCXVjY19nZXRoX3QgKnVnX3JlZ3M7CisJc3RydWN0IHVjY19nZXRoX3ByaXZhdGUgKnVnZXRoID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlzdHJ1Y3QgdWNjX2dldGggKnVnX3JlZ3M7CiAJaW50IHJlc3VsdCA9IDA7CiAKIAl1Z2V0aF92ZGJnKCIlczogSU4iLCBfX0ZVTkNUSU9OX18pOwpAQCAtMzk2Myw3ICszOTUyLDcgQEAKIHN0YXRpYyB2b2lkIHVnZXRoX3BoeV90aW1lcih1bnNpZ25lZCBsb25nIGRhdGEpCiB7CiAJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IChzdHJ1Y3QgbmV0X2RldmljZSAqKWRhdGE7Ci0JdWNjX2dldGhfcHJpdmF0ZV90ICp1Z2V0aCA9IG5ldGRldl9wcml2KGRldik7CisJc3RydWN0IHVjY19nZXRoX3ByaXZhdGUgKnVnZXRoID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAogCXNjaGVkdWxlX3dvcmsoJnVnZXRoLT50cSk7CiAKQEAgLTM5NzksNyArMzk2OCw3IEBACiBzdGF0aWMgdm9pZCB1Z2V0aF9waHlfc3RhcnR1cF90aW1lcih1bnNpZ25lZCBsb25nIGRhdGEpCiB7CiAJc3RydWN0IHVnZXRoX21paV9pbmZvICptaWlfaW5mbyA9IChzdHJ1Y3QgdWdldGhfbWlpX2luZm8gKilkYXRhOwotCXVjY19nZXRoX3ByaXZhdGVfdCAqdWdldGggPSBuZXRkZXZfcHJpdihtaWlfaW5mby0+ZGV2KTsKKwlzdHJ1Y3QgdWNjX2dldGhfcHJpdmF0ZSAqdWdldGggPSBuZXRkZXZfcHJpdihtaWlfaW5mby0+ZGV2KTsKIAlzdGF0aWMgaW50IHNlY29uZGFyeSA9IFVHRVRIX0FOX1RJTUVPVVQ7CiAJaW50IHJlc3VsdDsKIApAQCAtNDAzNCw3ICs0MDIzLDcgQEAKIC8qIFJldHVybnMgMCBmb3Igc3VjY2Vzcy4gKi8KIHN0YXRpYyBpbnQgdWNjX2dldGhfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewotCXVjY19nZXRoX3ByaXZhdGVfdCAqdWdldGggPSBuZXRkZXZfcHJpdihkZXYpOworCXN0cnVjdCB1Y2NfZ2V0aF9wcml2YXRlICp1Z2V0aCA9IG5ldGRldl9wcml2KGRldik7CiAJaW50IGVycjsKIAogCXVnZXRoX3ZkYmcoIiVzOiBJTiIsIF9fRlVOQ1RJT05fXyk7CkBAIC00MTExLDcgKzQxMDAsNyBAQAogLyogU3RvcHMgdGhlIGtlcm5lbCBxdWV1ZSwgYW5kIGhhbHRzIHRoZSBjb250cm9sbGVyICovCiBzdGF0aWMgaW50IHVjY19nZXRoX2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7Ci0JdWNjX2dldGhfcHJpdmF0ZV90ICp1Z2V0aCA9IG5ldGRldl9wcml2KGRldik7CisJc3RydWN0IHVjY19nZXRoX3ByaXZhdGUgKnVnZXRoID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAogCXVnZXRoX3ZkYmcoIiVzOiBJTiIsIF9fRlVOQ1RJT05fXyk7CiAKQEAgLTQxMzAsMzAgKzQxMTksNTMgQEAKIAogY29uc3Qgc3RydWN0IGV0aHRvb2xfb3BzIHVjY19nZXRoX2V0aHRvb2xfb3BzID0geyB9OwogCi1zdGF0aWMgaW50IHVjY19nZXRoX3Byb2JlKHN0cnVjdCBkZXZpY2UgKmRldmljZSkKK3N0YXRpYyBpbnQgdWNjX2dldGhfcHJvYmUoc3RydWN0IG9mX2RldmljZSogb2ZkZXYsIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgKm1hdGNoKQogewotCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYgPSB0b19wbGF0Zm9ybV9kZXZpY2UoZGV2aWNlKTsKLQlzdHJ1Y3QgdWNjX2dldGhfcGxhdGZvcm1fZGF0YSAqdWdldGhfcGRhdGE7CisJc3RydWN0IGRldmljZSAqZGV2aWNlID0gJm9mZGV2LT5kZXY7CisJc3RydWN0IGRldmljZV9ub2RlICpucCA9IG9mZGV2LT5ub2RlOwogCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBOVUxMOwogCXN0cnVjdCB1Y2NfZ2V0aF9wcml2YXRlICp1Z2V0aCA9IE5VTEw7CiAJc3RydWN0IHVjY19nZXRoX2luZm8gKnVnX2luZm87Ci0JaW50IGVycjsKKwlzdHJ1Y3QgcmVzb3VyY2UgcmVzOworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqcGh5OworCWludCBlcnIsIHVjY19udW0sIHBoeV9pbnRlcmZhY2U7CiAJc3RhdGljIGludCBtaWlfbW5nX2NvbmZpZ3VyZWQgPSAwOworCWNvbnN0IHBoYW5kbGUgKnBoOworCWNvbnN0IHVuc2lnbmVkIGludCAqcHJvcDsKIAogCXVnZXRoX3ZkYmcoIiVzOiBJTiIsIF9fRlVOQ1RJT05fXyk7CiAKLQl1Z2V0aF9wZGF0YSA9IChzdHJ1Y3QgdWNjX2dldGhfcGxhdGZvcm1fZGF0YSAqKXBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhOworCXByb3AgPSBnZXRfcHJvcGVydHkobnAsICJkZXZpY2UtaWQiLCBOVUxMKTsKKwl1Y2NfbnVtID0gKnByb3AgLSAxOworCWlmICgodWNjX251bSA8IDApIHx8ICh1Y2NfbnVtID4gNykpCisJCXJldHVybiAtRU5PREVWOwogCi0JdWdfaW5mbyA9ICZ1Z2V0aF9pbmZvW3BkZXYtPmlkXTsKLQl1Z19pbmZvLT51Zl9pbmZvLnVjY19udW0gPSBwZGV2LT5pZDsKLQl1Z19pbmZvLT51Zl9pbmZvLnJ4X2Nsb2NrID0gdWdldGhfcGRhdGEtPnJ4X2Nsb2NrOwotCXVnX2luZm8tPnVmX2luZm8udHhfY2xvY2sgPSB1Z2V0aF9wZGF0YS0+dHhfY2xvY2s7Ci0JdWdfaW5mby0+dWZfaW5mby5yZWdzID0gdWdldGhfcGRhdGEtPnBoeV9yZWdfYWRkcjsKLQl1Z19pbmZvLT51Zl9pbmZvLmlycSA9IHBsYXRmb3JtX2dldF9pcnEocGRldiwgMCk7Ci0JdWdfaW5mby0+cGh5X2FkZHJlc3MgPSB1Z2V0aF9wZGF0YS0+cGh5X2lkOwotCXVnX2luZm8tPmVuZXRfaW50ZXJmYWNlID0gdWdldGhfcGRhdGEtPnBoeV9pbnRlcmZhY2U7Ci0JdWdfaW5mby0+Ym9hcmRfZmxhZ3MgPSB1Z2V0aF9wZGF0YS0+Ym9hcmRfZmxhZ3M7Ci0JdWdfaW5mby0+cGh5X2ludGVycnVwdCA9IHVnZXRoX3BkYXRhLT5waHlfaW50ZXJydXB0OworCXVnX2luZm8gPSAmdWdldGhfaW5mb1t1Y2NfbnVtXTsKKwl1Z19pbmZvLT51Zl9pbmZvLnVjY19udW0gPSB1Y2NfbnVtOworCXByb3AgPSBnZXRfcHJvcGVydHkobnAsICJyeC1jbG9jayIsIE5VTEwpOworCXVnX2luZm8tPnVmX2luZm8ucnhfY2xvY2sgPSAqcHJvcDsKKwlwcm9wID0gZ2V0X3Byb3BlcnR5KG5wLCAidHgtY2xvY2siLCBOVUxMKTsKKwl1Z19pbmZvLT51Zl9pbmZvLnR4X2Nsb2NrID0gKnByb3A7CisJZXJyID0gb2ZfYWRkcmVzc190b19yZXNvdXJjZShucCwgMCwgJnJlcyk7CisJaWYgKGVycikKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwl1Z19pbmZvLT51Zl9pbmZvLnJlZ3MgPSByZXMuc3RhcnQ7CisJdWdfaW5mby0+dWZfaW5mby5pcnEgPSBpcnFfb2ZfcGFyc2VfYW5kX21hcChucCwgMCk7CisKKwlwaCA9IGdldF9wcm9wZXJ0eShucCwgInBoeS1oYW5kbGUiLCBOVUxMKTsKKwlwaHkgPSBvZl9maW5kX25vZGVfYnlfcGhhbmRsZSgqcGgpOworCisJaWYgKHBoeSA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCXByb3AgPSBnZXRfcHJvcGVydHkocGh5LCAicmVnIiwgTlVMTCk7CisJdWdfaW5mby0+cGh5X2FkZHJlc3MgPSAqcHJvcDsKKwlwcm9wID0gZ2V0X3Byb3BlcnR5KHBoeSwgImludGVyZmFjZSIsIE5VTEwpOworCXVnX2luZm8tPmVuZXRfaW50ZXJmYWNlID0gKnByb3A7CisJdWdfaW5mby0+cGh5X2ludGVycnVwdCA9IGlycV9vZl9wYXJzZV9hbmRfbWFwKHBoeSwgMCk7CisJdWdfaW5mby0+Ym9hcmRfZmxhZ3MgPSAodWdfaW5mby0+cGh5X2ludGVycnVwdCA9PSBOT19JUlEpPworCQkJMDpGU0xfVUdFVEhfQlJEX0hBU19QSFlfSU5UUjsKIAogCXByaW50ayhLRVJOX0lORk8gInVjY19nZXRoOiBVQ0MlMWQgYXQgMHglOHggKGlycSA9ICVkKSBcbiIsCiAJCXVnX2luZm8tPnVmX2luZm8udWNjX251bSArIDEsIHVnX2luZm8tPnVmX2luZm8ucmVncywKQEAgLTQxNjEsMTIgKzQxNzMsNDQgQEAKIAogCWlmICh1Z19pbmZvID09IE5VTEwpIHsKIAkJdWdldGhfZXJyKCIlczogWyVkXSBNaXNzaW5nIGFkZGl0aW9uYWwgZGF0YSEiLCBfX0ZVTkNUSU9OX18sCi0JCQkgIHBkZXYtPmlkKTsKKwkJCSAgdWNjX251bSk7CiAJCXJldHVybiAtRU5PREVWOwogCX0KIAorCS8qIEZJWE1FOiBXb3JrIGFyb3VuZCBmb3IgZWFybHkgY2hpcCByZXYuICAgICAgICAgICAgICAgKi8KKwkvKiBUaGVyZSdzIGEgYnVnIGluIGluaXRpYWwgY2hpcCByZXYocykgaW4gdGhlIFJHTUlJIGFjICovCisJLyogdGltaW5nLgkJCQkJCSovCisJLyogVGhlIGZvbGxvd2luZyBjb21wZW5zYXRlcyBieSB3cml0aW5nIHRvIHRoZSByZXNlcnZlZCAqLworCS8qIFFFIFBvcnQgT3V0cHV0IEhvbGQgUmVnaXN0ZXJzIChDUE9IMT8pLiAgICAgICAgICAgICAgKi8KKwlwcm9wID0gZ2V0X3Byb3BlcnR5KHBoeSwgImludGVyZmFjZSIsIE5VTEwpOworCXBoeV9pbnRlcmZhY2UgPSAqcHJvcDsKKwlpZiAoKHBoeV9pbnRlcmZhY2UgPT0gRU5FVF8xMDAwX1JHTUlJKSB8fAorCQkJKHBoeV9pbnRlcmZhY2UgPT0gRU5FVF8xMDBfUkdNSUkpIHx8CisJCQkocGh5X2ludGVyZmFjZSA9PSBFTkVUXzEwX1JHTUlJKSkgeworCQlzdHJ1Y3QgZGV2aWNlX25vZGUgKnNvYzsKKwkJcGh5c19hZGRyX3QgaW1tcmJhc2UgPSAtMTsKKwkJdTMyICp0bXBfcmVnOworCQl1MzIgdG1wX3ZhbDsKKworCQlzb2MgPSBvZl9maW5kX25vZGVfYnlfdHlwZShOVUxMLCAic29jIik7CisJCWlmIChzb2MpIHsKKwkJCXVuc2lnbmVkIGludCBzaXplOworCQkJY29uc3Qgdm9pZCAqcHJvcCA9IGdldF9wcm9wZXJ0eShzb2MsICJyZWciLCAmc2l6ZSk7CisJCQlpbW1yYmFzZSA9IG9mX3RyYW5zbGF0ZV9hZGRyZXNzKHNvYywgcHJvcCk7CisJCQlvZl9ub2RlX3B1dChzb2MpOworCQl9OworCisJCXRtcF9yZWcgPSAodTMyICopIGlvcmVtYXAoaW1tcmJhc2UgKyAweDE0QTgsIDB4NCk7CisJCXRtcF92YWwgPSBpbl9iZTMyKHRtcF9yZWcpOworCQlpZiAodWNjX251bSA9PSAxKQorCQkJb3V0X2JlMzIodG1wX3JlZywgdG1wX3ZhbCB8IDB4MDAwMDMwMDApOworCQllbHNlIGlmICh1Y2NfbnVtID09IDIpCisJCQlvdXRfYmUzMih0bXBfcmVnLCB0bXBfdmFsIHwgMHgwYzAwMDAwMCk7CisJCWlvdW5tYXAodG1wX3JlZyk7CisJfQorCiAJaWYgKCFtaWlfbW5nX2NvbmZpZ3VyZWQpIHsKLQkJdWNjX3NldF9xZV9tdXhfbWlpX21uZyh1Z19pbmZvLT51Zl9pbmZvLnVjY19udW0pOworCQl1Y2Nfc2V0X3FlX211eF9taWlfbW5nKHVjY19udW0pOwogCQltaWlfbW5nX2NvbmZpZ3VyZWQgPSAxOwogCX0KIApAQCAtNDIxMywxMyArNDI1NywxNCBAQAogCiAJdWdldGgtPnVnX2luZm8gPSB1Z19pbmZvOwogCXVnZXRoLT5kZXYgPSBkZXY7Ci0JbWVtY3B5KGRldi0+ZGV2X2FkZHIsIHVnZXRoX3BkYXRhLT5tYWNfYWRkciwgNik7CisJbWVtY3B5KGRldi0+ZGV2X2FkZHIsIGdldF9wcm9wZXJ0eShucCwgIm1hYy1hZGRyZXNzIiwgTlVMTCksIDYpOwogCiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgdWNjX2dldGhfcmVtb3ZlKHN0cnVjdCBkZXZpY2UgKmRldmljZSkKK3N0YXRpYyBpbnQgdWNjX2dldGhfcmVtb3ZlKHN0cnVjdCBvZl9kZXZpY2UqIG9mZGV2KQogeworCXN0cnVjdCBkZXZpY2UgKmRldmljZSA9ICZvZmRldi0+ZGV2OwogCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBkZXZfZ2V0X2RydmRhdGEoZGV2aWNlKTsKIAlzdHJ1Y3QgdWNjX2dldGhfcHJpdmF0ZSAqdWdldGggPSBuZXRkZXZfcHJpdihkZXYpOwogCkBAIC00MjMwLDI4ICs0Mjc1LDM4IEBACiAJcmV0dXJuIDA7CiB9CiAKLS8qIFN0cnVjdHVyZSBmb3IgYSBkZXZpY2UgZHJpdmVyICovCi1zdGF0aWMgc3RydWN0IGRldmljZV9kcml2ZXIgdWNjX2dldGhfZHJpdmVyID0gewotCS5uYW1lID0gRFJWX05BTUUsCi0JLmJ1cyA9ICZwbGF0Zm9ybV9idXNfdHlwZSwKLQkucHJvYmUgPSB1Y2NfZ2V0aF9wcm9iZSwKLQkucmVtb3ZlID0gdWNjX2dldGhfcmVtb3ZlLAorc3RhdGljIHN0cnVjdCBvZl9kZXZpY2VfaWQgdWNjX2dldGhfbWF0Y2hbXSA9IHsKKwl7CisJCS50eXBlID0gIm5ldHdvcmsiLAorCQkuY29tcGF0aWJsZSA9ICJ1Y2NfZ2V0aCIsCisJfSwKKwl7fSwKK307CisKK01PRFVMRV9ERVZJQ0VfVEFCTEUob2YsIHVjY19nZXRoX21hdGNoKTsKKworc3RhdGljIHN0cnVjdCBvZl9wbGF0Zm9ybV9kcml2ZXIgdWNjX2dldGhfZHJpdmVyID0geworCS5uYW1lCQk9IERSVl9OQU1FLAorCS5tYXRjaF90YWJsZQk9IHVjY19nZXRoX21hdGNoLAorCS5wcm9iZQkJPSB1Y2NfZ2V0aF9wcm9iZSwKKwkucmVtb3ZlCQk9IHVjY19nZXRoX3JlbW92ZSwKIH07CiAKIHN0YXRpYyBpbnQgX19pbml0IHVjY19nZXRoX2luaXQodm9pZCkKIHsKIAlpbnQgaTsKKwogCXByaW50ayhLRVJOX0lORk8gInVjY19nZXRoOiAiIERSVl9ERVNDICJcbiIpOwogCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspCiAJCW1lbWNweSgmKHVnZXRoX2luZm9baV0pLCAmdWdldGhfcHJpbWFyeV9pbmZvLAogCQkgICAgICAgc2l6ZW9mKHVnZXRoX3ByaW1hcnlfaW5mbykpOwogCi0JcmV0dXJuIGRyaXZlcl9yZWdpc3RlcigmdWNjX2dldGhfZHJpdmVyKTsKKwlyZXR1cm4gb2ZfcmVnaXN0ZXJfZHJpdmVyKCZ1Y2NfZ2V0aF9kcml2ZXIpOwogfQogCiBzdGF0aWMgdm9pZCBfX2V4aXQgdWNjX2dldGhfZXhpdCh2b2lkKQogewotCWRyaXZlcl91bnJlZ2lzdGVyKCZ1Y2NfZ2V0aF9kcml2ZXIpOworCW9mX3VucmVnaXN0ZXJfZHJpdmVyKCZ1Y2NfZ2V0aF9kcml2ZXIpOwogfQogCiBtb2R1bGVfaW5pdCh1Y2NfZ2V0aF9pbml0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3VjY19nZXRoLmggYi9kcml2ZXJzL25ldC91Y2NfZ2V0aC5oCmluZGV4IDAwNTk2NWYuLmE2NjU2MTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3VjY19nZXRoLmgKKysrIGIvZHJpdmVycy9uZXQvdWNjX2dldGguaApAQCAtMzYsMjQgKzM2LDI0IEBACiAjZGVmaW5lIEVORVRfSU5JVF9QQVJBTV9NQVhfRU5UUklFU19SWCAgOQogI2RlZmluZSBFTkVUX0lOSVRfUEFSQU1fTUFYX0VOVFJJRVNfVFggIDgKIAotdHlwZWRlZiBzdHJ1Y3QgdWNjX21paV9tbmcgeworc3RydWN0IHVjY19taWlfbW5nIHsKIAl1MzIgbWlpbWNmZzsJCS8qIE1JSSBtYW5hZ2VtZW50IGNvbmZpZ3VyYXRpb24gcmVnICovCiAJdTMyIG1paW1jb207CQkvKiBNSUkgbWFuYWdlbWVudCBjb21tYW5kIHJlZyAqLwogCXUzMiBtaWltYWRkOwkJLyogTUlJIG1hbmFnZW1lbnQgYWRkcmVzcyByZWcgKi8KIAl1MzIgbWlpbWNvbjsJCS8qIE1JSSBtYW5hZ2VtZW50IGNvbnRyb2wgcmVnICovCiAJdTMyIG1paW1zdGF0OwkJLyogTUlJIG1hbmFnZW1lbnQgc3RhdHVzIHJlZyAqLwogCXUzMiBtaWltaW5kOwkJLyogTUlJIG1hbmFnZW1lbnQgaW5kaWNhdGlvbiByZWcgKi8KLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpIHVjY19taWlfbW5nX3Q7Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKIAotdHlwZWRlZiBzdHJ1Y3QgdWNjX2dldGggewotCXVjY19mYXN0X3QgdWNjZjsKK3N0cnVjdCB1Y2NfZ2V0aCB7CisJc3RydWN0IHVjY19mYXN0IHVjY2Y7CiAKIAl1MzIgbWFjY2ZnMTsJCS8qIG1hYyBjb25maWd1cmF0aW9uIHJlZy4gMSAqLwogCXUzMiBtYWNjZmcyOwkJLyogbWFjIGNvbmZpZ3VyYXRpb24gcmVnLiAyICovCiAJdTMyIGlwZ2lmZzsJCS8qIGludGVyZnJhbWUgZ2FwIHJlZy4gICovCiAJdTMyIGhhZmR1cDsJCS8qIGhhbGYtZHVwbGV4IHJlZy4gICovCiAJdTggcmVzMVsweDEwXTsKLQl1Y2NfbWlpX21uZ190IG1paW1uZzsJLyogTUlJIG1hbmFnZW1lbnQgc3RydWN0dXJlICovCisJc3RydWN0IHVjY19taWlfbW5nIG1paW1uZzsJLyogTUlJIG1hbmFnZW1lbnQgc3RydWN0dXJlICovCiAJdTMyIGlmY3RsOwkJLyogaW50ZXJmYWNlIGNvbnRyb2wgcmVnICovCiAJdTMyIGlmc3RhdDsJCS8qIGludGVyZmFjZSBzdGF0dXggcmVnICovCiAJdTMyIG1hY3N0bmFkZHIxOwkvKiBtYWMgc3RhdGlvbiBhZGRyZXNzIHBhcnQgMSByZWcgKi8KQEAgLTExMSw3ICsxMTEsNyBAQAogCXUzMiBzY2FyOwkJLyogU3RhdGlzdGljcyBjYXJyeSByZWdpc3RlciAqLwogCXUzMiBzY2FtOwkJLyogU3RhdGlzdGljcyBjYXJ5eSBtYXNrIHJlZ2lzdGVyICovCiAJdTggcmVzNVsweDIwMCAtIDB4MWM0XTsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpIHVjY19nZXRoX3Q7Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKIAogLyogVUNDIEdFVEggVEVNT0RSIFJlZ2lzdGVyICovCiAjZGVmaW5lIFRFTU9ERVJfVFhfUk1PTl9TVEFUSVNUSUNTX0VOQUJMRSAgICAgICAweDAxMDAJLyogZW5hYmxlIFR4IHN0YXRpc3RpY3MKQEAgLTUwOCwzOSArNTA4LDM5IEBACiAvKiBVQ0MgR0VUSCBVRFNSIChEYXRhIFN5bmNocm9uaXphdGlvbiBSZWdpc3RlcikgKi8KICNkZWZpbmUgVURTUl9NQUdJQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDY3RQogCi10eXBlZGVmIHN0cnVjdCB1Y2NfZ2V0aF90aHJlYWRfZGF0YV90eCB7CitzdHJ1Y3QgdWNjX2dldGhfdGhyZWFkX2RhdGFfdHggewogCXU4IHJlczBbMTA0XTsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpIHVjY19nZXRoX3RocmVhZF9kYXRhX3R4X3Q7Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKIAotdHlwZWRlZiBzdHJ1Y3QgdWNjX2dldGhfdGhyZWFkX2RhdGFfcnggeworc3RydWN0IHVjY19nZXRoX3RocmVhZF9kYXRhX3J4IHsKIAl1OCByZXMwWzQwXTsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpIHVjY19nZXRoX3RocmVhZF9kYXRhX3J4X3Q7Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKIAogLyogU2VuZCBRdWV1ZSBRdWV1ZS1EZXNjcmlwdG9yICovCi10eXBlZGVmIHN0cnVjdCB1Y2NfZ2V0aF9zZW5kX3F1ZXVlX3FkIHsKK3N0cnVjdCB1Y2NfZ2V0aF9zZW5kX3F1ZXVlX3FkIHsKIAl1MzIgYmRfcmluZ19iYXNlOwkvKiBwb2ludGVyIHRvIEJEIHJpbmcgYmFzZSBhZGRyZXNzICovCiAJdTggcmVzMFsweDhdOwogCXUzMiBsYXN0X2JkX2NvbXBsZXRlZF9hZGRyZXNzOy8qIGluaXRpYWxpemUgdG8gbGFzdCBlbnRyeSBpbiBCRCByaW5nICovCiAJdTggcmVzMVsweDMwXTsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpIHVjY19nZXRoX3NlbmRfcXVldWVfcWRfdDsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOwogCi10eXBlZGVmIHN0cnVjdCB1Y2NfZ2V0aF9zZW5kX3F1ZXVlX21lbV9yZWdpb24gewotCXVjY19nZXRoX3NlbmRfcXVldWVfcWRfdCBzcXFkW05VTV9UWF9RVUVVRVNdOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSkgdWNjX2dldGhfc2VuZF9xdWV1ZV9tZW1fcmVnaW9uX3Q7CitzdHJ1Y3QgdWNjX2dldGhfc2VuZF9xdWV1ZV9tZW1fcmVnaW9uIHsKKwlzdHJ1Y3QgdWNjX2dldGhfc2VuZF9xdWV1ZV9xZCBzcXFkW05VTV9UWF9RVUVVRVNdOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CiAKLXR5cGVkZWYgc3RydWN0IHVjY19nZXRoX3RocmVhZF90eF9wcmFtIHsKK3N0cnVjdCB1Y2NfZ2V0aF90aHJlYWRfdHhfcHJhbSB7CiAJdTggcmVzMFs2NF07Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKSB1Y2NfZ2V0aF90aHJlYWRfdHhfcHJhbV90OworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CiAKLXR5cGVkZWYgc3RydWN0IHVjY19nZXRoX3RocmVhZF9yeF9wcmFtIHsKK3N0cnVjdCB1Y2NfZ2V0aF90aHJlYWRfcnhfcHJhbSB7CiAJdTggcmVzMFsxMjhdOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSkgdWNjX2dldGhfdGhyZWFkX3J4X3ByYW1fdDsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOwogCiAjZGVmaW5lIFRIUkVBRF9SWF9QUkFNX0FERElUSU9OQUxfRk9SX0VYVEVOREVEX0ZJTFRFUklORyAgICAgICAgNjQKICNkZWZpbmUgVEhSRUFEX1JYX1BSQU1fQURESVRJT05BTF9GT1JfRVhURU5ERURfRklMVEVSSU5HXzggICAgICA2NAogI2RlZmluZSBUSFJFQURfUlhfUFJBTV9BRERJVElPTkFMX0ZPUl9FWFRFTkRFRF9GSUxURVJJTkdfMTYgICAgIDk2CiAKLXR5cGVkZWYgc3RydWN0IHVjY19nZXRoX3NjaGVkdWxlciB7CitzdHJ1Y3QgdWNjX2dldGhfc2NoZWR1bGVyIHsKIAl1MTYgY3B1Y291bnQwOwkJLyogQ1BVIHBhY2tldCBjb3VudGVyICovCiAJdTE2IGNwdWNvdW50MTsJCS8qIENQVSBwYWNrZXQgY291bnRlciAqLwogCXUxNiBjZWNvdW50MDsJCS8qIFFFIHBhY2tldCBjb3VudGVyICovCkBAIC01NzQsOSArNTc0LDkgQEAKIAkJCQkgICAgICAvKio8IHdlaWdodCBmYWN0b3IgZm9yIHF1ZXVlcyAgICovCiAJdTMyIG1pbnc7CQkvKiB0ZW1wb3JhcnkgdmFyaWFibGUgaGFuZGxlZCBieSBRRSAqLwogCXU4IHJlczFbMHg3MCAtIDB4NjRdOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSkgdWNjX2dldGhfc2NoZWR1bGVyX3Q7Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKIAotdHlwZWRlZiBzdHJ1Y3QgdWNjX2dldGhfdHhfZmlybXdhcmVfc3RhdGlzdGljc19wcmFtIHsKK3N0cnVjdCB1Y2NfZ2V0aF90eF9maXJtd2FyZV9zdGF0aXN0aWNzX3ByYW0gewogCXUzMiBzaWNvbHR4OwkJLyogc2luZ2xlIGNvbGxpc2lvbiAqLwogCXUzMiBtdWxjb2x0eDsJCS8qIG11bHRpcGxlIGNvbGxpc2lvbiAqLwogCXUzMiBsYXRlY29sdHhmcjsJLyogbGF0ZSBjb2xsaXNpb24gKi8KQEAgLTU5Niw5ICs1OTYsOSBAQAogCQkJCSAgIGFuZCAxNTE4IG9jdGV0cyAqLwogCXUzMiB0eHBrdHNqdW1ibzsJLyogdG90YWwgcGFja2V0cyAoaW5jbHVkaW5nIGJhZCkgYmV0d2VlbiAxMDI0CiAJCQkJICAgYW5kIE1BWExlbmd0aCBvY3RldHMgKi8KLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpIHVjY19nZXRoX3R4X2Zpcm13YXJlX3N0YXRpc3RpY3NfcHJhbV90OworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CiAKLXR5cGVkZWYgc3RydWN0IHVjY19nZXRoX3J4X2Zpcm13YXJlX3N0YXRpc3RpY3NfcHJhbSB7CitzdHJ1Y3QgdWNjX2dldGhfcnhfZmlybXdhcmVfc3RhdGlzdGljc19wcmFtIHsKIAl1MzIgZnJyeGZjc2VyOwkJLyogZnJhbWVzIHdpdGggY3JjIGVycm9yICovCiAJdTMyIGZyYWxpZ25lcjsJCS8qIGZyYW1lcyB3aXRoIGFsaWdubWVudCBlcnJvciAqLwogCXUzMiBpbnJhbmdlbGVucnhlcjsJLyogaW4gcmFuZ2UgbGVuZ3RoIGVycm9yICovCkBAIC02MzAsMzMgKzYzMCwzMyBAQAogCQkJCSAgIHJlcGxhY2VkICovCiAJdTMyIGluc2VydHZsYW47CQkvKiB0b3RhbCBmcmFtZXMgdGhhdCBoYWQgdGhlaXIgVkxBTiB0YWcKIAkJCQkgICBpbnNlcnRlZCAqLwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSkgdWNjX2dldGhfcnhfZmlybXdhcmVfc3RhdGlzdGljc19wcmFtX3Q7Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKIAotdHlwZWRlZiBzdHJ1Y3QgdWNjX2dldGhfcnhfaW50ZXJydXB0X2NvYWxlc2NpbmdfZW50cnkgeworc3RydWN0IHVjY19nZXRoX3J4X2ludGVycnVwdF9jb2FsZXNjaW5nX2VudHJ5IHsKIAl1MzIgaW50ZXJydXB0Y29hbGVzY2luZ21heHZhbHVlOwkvKiBpbnRlcnJ1cHQgY29hbGVzY2luZyBtYXgKIAkJCQkJCSAgIHZhbHVlICovCiAJdTMyIGludGVycnVwdGNvYWxlc2Npbmdjb3VudGVyOwkvKiBpbnRlcnJ1cHQgY29hbGVzY2luZyBjb3VudGVyLAogCQkJCQkgICBpbml0aWFsaXplIHRvCiAJCQkJCSAgIGludGVycnVwdGNvYWxlc2NpbmdtYXh2YWx1ZSAqLwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSkgdWNjX2dldGhfcnhfaW50ZXJydXB0X2NvYWxlc2NpbmdfZW50cnlfdDsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOwogCi10eXBlZGVmIHN0cnVjdCB1Y2NfZ2V0aF9yeF9pbnRlcnJ1cHRfY29hbGVzY2luZ190YWJsZSB7Ci0JdWNjX2dldGhfcnhfaW50ZXJydXB0X2NvYWxlc2NpbmdfZW50cnlfdCBjb2FsZXNjaW5nZW50cnlbTlVNX1JYX1FVRVVFU107CitzdHJ1Y3QgdWNjX2dldGhfcnhfaW50ZXJydXB0X2NvYWxlc2NpbmdfdGFibGUgeworCXN0cnVjdCB1Y2NfZ2V0aF9yeF9pbnRlcnJ1cHRfY29hbGVzY2luZ19lbnRyeSBjb2FsZXNjaW5nZW50cnlbTlVNX1JYX1FVRVVFU107CiAJCQkJICAgICAgIC8qKjwgaW50ZXJydXB0IGNvYWxlc2NpbmcgZW50cnkgKi8KLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpIHVjY19nZXRoX3J4X2ludGVycnVwdF9jb2FsZXNjaW5nX3RhYmxlX3Q7Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKIAotdHlwZWRlZiBzdHJ1Y3QgdWNjX2dldGhfcnhfcHJlZmV0Y2hlZF9iZHMgewotCXFlX2JkX3QgYmRbTlVNX0JEU19JTl9QUkVGRVRDSEVEX0JEU107CS8qIHByZWZldGNoZWQgYmQgKi8KLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpIHVjY19nZXRoX3J4X3ByZWZldGNoZWRfYmRzX3Q7CitzdHJ1Y3QgdWNjX2dldGhfcnhfcHJlZmV0Y2hlZF9iZHMgeworCXN0cnVjdCBxZV9iZCBiZFtOVU1fQkRTX0lOX1BSRUZFVENIRURfQkRTXTsJLyogcHJlZmV0Y2hlZCBiZCAqLworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CiAKLXR5cGVkZWYgc3RydWN0IHVjY19nZXRoX3J4X2JkX3F1ZXVlc19lbnRyeSB7CitzdHJ1Y3QgdWNjX2dldGhfcnhfYmRfcXVldWVzX2VudHJ5IHsKIAl1MzIgYmRiYXNlcHRyOwkJLyogQkQgYmFzZSBwb2ludGVyICovCiAJdTMyIGJkcHRyOwkJLyogQkQgcG9pbnRlciAqLwogCXUzMiBleHRlcm5hbGJkYmFzZXB0cjsJLyogZXh0ZXJuYWwgQkQgYmFzZSBwb2ludGVyICovCiAJdTMyIGV4dGVybmFsYmRwdHI7CS8qIGV4dGVybmFsIEJEIHBvaW50ZXIgKi8KLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpIHVjY19nZXRoX3J4X2JkX3F1ZXVlc19lbnRyeV90OworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CiAKLXR5cGVkZWYgc3RydWN0IHVjY19nZXRoX3R4X2dsb2JhbF9wcmFtIHsKK3N0cnVjdCB1Y2NfZ2V0aF90eF9nbG9iYWxfcHJhbSB7CiAJdTE2IHRlbW9kZXI7CiAJdTggcmVzMFsweDM4IC0gMHgwMl07CiAJdTMyIHNxcHRyOwkJLyogYSBiYXNlIHBvaW50ZXIgdG8gc2VuZCBxdWV1ZSBtZW1vcnkgcmVnaW9uICovCkBAIC02NzAsMTUgKzY3MCwxNSBAQAogCXUzMiB0cXB0cjsJCS8qIGEgYmFzZSBwb2ludGVyIHRvIHRoZSBUeCBRdWV1ZXMgTWVtb3J5CiAJCQkJICAgUmVnaW9uICovCiAJdTggcmVzMlsweDgwIC0gMHg3NF07Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKSB1Y2NfZ2V0aF90eF9nbG9iYWxfcHJhbV90OworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CiAKIC8qIHN0cnVjdHVyZSByZXByZXNlbnRpbmcgRXh0ZW5kZWQgRmlsdGVyaW5nIEdsb2JhbCBQYXJhbWV0ZXJzIGluIFBSQU0gKi8KLXR5cGVkZWYgc3RydWN0IHVjY19nZXRoX2V4Zl9nbG9iYWxfcHJhbSB7CitzdHJ1Y3QgdWNjX2dldGhfZXhmX2dsb2JhbF9wcmFtIHsKIAl1MzIgbDJwY2RwdHI7CQkvKiBpbmRpdmlkdWFsIGFkZHJlc3MgZmlsdGVyLCBoaWdoICovCiAJdTggcmVzMFsweDEwIC0gMHgwNF07Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKSB1Y2NfZ2V0aF9leGZfZ2xvYmFsX3ByYW1fdDsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOwogCi10eXBlZGVmIHN0cnVjdCB1Y2NfZ2V0aF9yeF9nbG9iYWxfcHJhbSB7CitzdHJ1Y3QgdWNjX2dldGhfcnhfZ2xvYmFsX3ByYW0gewogCXUzMiByZW1vZGVyOwkJLyogZXRoZXJuZXQgbW9kZSByZWcuICovCiAJdTMyIHJxcHRyOwkJLyogYmFzZSBwb2ludGVyIHRvIHRoZSBSeCBRdWV1ZXMgTWVtb3J5IFJlZ2lvbiovCiAJdTMyIHJlczBbMHgxXTsKQEAgLTcxMCwxMiArNzEwLDEyIEBACiAJdTMyIGV4Zkdsb2JhbFBhcmFtOwkvKiBiYXNlIGFkZHJlc3MgZm9yIGV4dGVuZGVkIGZpbHRlcmluZyBnbG9iYWwKIAkJCQkgICBwYXJhbWV0ZXJzICovCiAJdTggcmVzNlsweDEwMCAtIDB4QzRdOwkvKiBJbml0aWFsaXplIHRvIHplcm8gKi8KLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpIHVjY19nZXRoX3J4X2dsb2JhbF9wcmFtX3Q7Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKIAogI2RlZmluZSBHUkFDRUZVTF9TVE9QX0FDS05PV0xFREdFX1JYICAgICAgICAgICAgMHgwMQogCiAvKiBzdHJ1Y3R1cmUgcmVwcmVzZW50aW5nIEluaXRFbmV0IGNvbW1hbmQgKi8KLXR5cGVkZWYgc3RydWN0IHVjY19nZXRoX2luaXRfcHJhbSB7CitzdHJ1Y3QgdWNjX2dldGhfaW5pdF9wcmFtIHsKIAl1OCByZXNpbml0MTsKIAl1OCByZXNpbml0MjsKIAl1OCByZXNpbml0MzsKQEAgLTcyOSw3ICs3MjksNyBAQAogCXUzMiB0eGdsb2JhbDsJCS8qIHR4IGdsb2JhbCAqLwogCXUzMiB0eHRocmVhZFtFTkVUX0lOSVRfUEFSQU1fTUFYX0VOVFJJRVNfVFhdOwkvKiB0eCB0aHJlYWRzICovCiAJdTggcmVzM1sweDFdOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSkgdWNjX2dldGhfaW5pdF9wcmFtX3Q7Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKIAogI2RlZmluZSBFTkVUX0lOSVRfUEFSQU1fUkdGX1NISUZUICAgICAgICAgICAgICAgKDMyIC0gNCkKICNkZWZpbmUgRU5FVF9JTklUX1BBUkFNX1RHRl9TSElGVCAgICAgICAgICAgICAgICgzMiAtIDgpCkBAIC03NDYsMjcgKzc0NiwyNyBAQAogI2RlZmluZSBFTkVUX0lOSVRfUEFSQU1fTUFHSUNfUkVTX0lOSVQ1ICAgICAgICAgMHgwNDAwCiAKIC8qIHN0cnVjdHVyZSByZXByZXNlbnRpbmcgODJ4eCBBZGRyZXNzIEZpbHRlcmluZyBFbmV0IEFkZHJlc3MgaW4gUFJBTSAqLwotdHlwZWRlZiBzdHJ1Y3QgdWNjX2dldGhfODJ4eF9lbmV0X2FkZHJlc3Mgeworc3RydWN0IHVjY19nZXRoXzgyeHhfZW5ldF9hZGRyZXNzIHsKIAl1OCByZXMxWzB4Ml07CiAJdTE2IGg7CQkJLyogYWRkcmVzcyAoTVNCKSAqLwogCXUxNiBtOwkJCS8qIGFkZHJlc3MgKi8KIAl1MTYgbDsJCQkvKiBhZGRyZXNzIChMU0IpICovCi19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKSB1Y2NfZ2V0aF84Mnh4X2VuZXRfYWRkcmVzc190OworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CiAKIC8qIHN0cnVjdHVyZSByZXByZXNlbnRpbmcgODJ4eCBBZGRyZXNzIEZpbHRlcmluZyBQUkFNICovCi10eXBlZGVmIHN0cnVjdCB1Y2NfZ2V0aF84Mnh4X2FkZHJlc3NfZmlsdGVyaW5nX3ByYW0geworc3RydWN0IHVjY19nZXRoXzgyeHhfYWRkcmVzc19maWx0ZXJpbmdfcHJhbSB7CiAJdTMyIGlhZGRyX2g7CQkvKiBpbmRpdmlkdWFsIGFkZHJlc3MgZmlsdGVyLCBoaWdoICovCiAJdTMyIGlhZGRyX2w7CQkvKiBpbmRpdmlkdWFsIGFkZHJlc3MgZmlsdGVyLCBsb3cgKi8KIAl1MzIgZ2FkZHJfaDsJCS8qIGdyb3VwIGFkZHJlc3MgZmlsdGVyLCBoaWdoICovCiAJdTMyIGdhZGRyX2w7CQkvKiBncm91cCBhZGRyZXNzIGZpbHRlciwgbG93ICovCi0JdWNjX2dldGhfODJ4eF9lbmV0X2FkZHJlc3NfdCB0YWRkcjsKLQl1Y2NfZ2V0aF84Mnh4X2VuZXRfYWRkcmVzc190IHBhZGRyW05VTV9PRl9QQUREUlNdOworCXN0cnVjdCB1Y2NfZ2V0aF84Mnh4X2VuZXRfYWRkcmVzcyB0YWRkcjsKKwlzdHJ1Y3QgdWNjX2dldGhfODJ4eF9lbmV0X2FkZHJlc3MgcGFkZHJbTlVNX09GX1BBRERSU107CiAJdTggcmVzMFsweDQwIC0gMHgzOF07Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKSB1Y2NfZ2V0aF84Mnh4X2FkZHJlc3NfZmlsdGVyaW5nX3ByYW1fdDsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOwogCiAvKiBHRVRIIFR4IGZpcm13YXJlIHN0YXRpc3RpY3Mgc3RydWN0dXJlLCB1c2VkIHdoZW4gY2FsbGluZwogICAgVUNDX0dFVEhfR2V0U3RhdGlzdGljcy4gKi8KLXR5cGVkZWYgc3RydWN0IHVjY19nZXRoX3R4X2Zpcm13YXJlX3N0YXRpc3RpY3Mgeworc3RydWN0IHVjY19nZXRoX3R4X2Zpcm13YXJlX3N0YXRpc3RpY3MgewogCXUzMiBzaWNvbHR4OwkJLyogc2luZ2xlIGNvbGxpc2lvbiAqLwogCXUzMiBtdWxjb2x0eDsJCS8qIG11bHRpcGxlIGNvbGxpc2lvbiAqLwogCXUzMiBsYXRlY29sdHhmcjsJLyogbGF0ZSBjb2xsaXNpb24gKi8KQEAgLTc4NiwxMSArNzg2LDExIEBACiAJCQkJICAgYW5kIDE1MTggb2N0ZXRzICovCiAJdTMyIHR4cGt0c2p1bWJvOwkvKiB0b3RhbCBwYWNrZXRzIChpbmNsdWRpbmcgYmFkKSBiZXR3ZWVuIDEwMjQKIAkJCQkgICBhbmQgTUFYTGVuZ3RoIG9jdGV0cyAqLwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSkgdWNjX2dldGhfdHhfZmlybXdhcmVfc3RhdGlzdGljc190OworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CiAKIC8qIEdFVEggUnggZmlybXdhcmUgc3RhdGlzdGljcyBzdHJ1Y3R1cmUsIHVzZWQgd2hlbiBjYWxsaW5nCiAgICBVQ0NfR0VUSF9HZXRTdGF0aXN0aWNzLiAqLwotdHlwZWRlZiBzdHJ1Y3QgdWNjX2dldGhfcnhfZmlybXdhcmVfc3RhdGlzdGljcyB7CitzdHJ1Y3QgdWNjX2dldGhfcnhfZmlybXdhcmVfc3RhdGlzdGljcyB7CiAJdTMyIGZycnhmY3NlcjsJCS8qIGZyYW1lcyB3aXRoIGNyYyBlcnJvciAqLwogCXUzMiBmcmFsaWduZXI7CQkvKiBmcmFtZXMgd2l0aCBhbGlnbm1lbnQgZXJyb3IgKi8KIAl1MzIgaW5yYW5nZWxlbnJ4ZXI7CS8qIGluIHJhbmdlIGxlbmd0aCBlcnJvciAqLwpAQCAtODIyLDExICs4MjIsMTEgQEAKIAkJCQkgICByZXBsYWNlZCAqLwogCXUzMiBpbnNlcnR2bGFuOwkJLyogdG90YWwgZnJhbWVzIHRoYXQgaGFkIHRoZWlyIFZMQU4gdGFnCiAJCQkJICAgaW5zZXJ0ZWQgKi8KLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpIHVjY19nZXRoX3J4X2Zpcm13YXJlX3N0YXRpc3RpY3NfdDsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOwogCiAvKiBHRVRIIGhhcmR3YXJlIHN0YXRpc3RpY3Mgc3RydWN0dXJlLCB1c2VkIHdoZW4gY2FsbGluZwogICAgVUNDX0dFVEhfR2V0U3RhdGlzdGljcy4gKi8KLXR5cGVkZWYgc3RydWN0IHVjY19nZXRoX2hhcmR3YXJlX3N0YXRpc3RpY3Mgeworc3RydWN0IHVjY19nZXRoX2hhcmR3YXJlX3N0YXRpc3RpY3MgewogCXUzMiB0eDY0OwkJLyogVG90YWwgbnVtYmVyIG9mIGZyYW1lcyAoaW5jbHVkaW5nIGJhZAogCQkJCSAgIGZyYW1lcykgdHJhbnNtaXR0ZWQgdGhhdCB3ZXJlIGV4YWN0bHkgb2YgdGhlCiAJCQkJICAgbWluaW1hbCBsZW5ndGggKDY0IGZvciB1biB0YWdnZWQsIDY4IGZvcgpAQCAtODcxLDcgKzg3MSw3IEBACiAJdTMyIHJiY2E7CQkvKiBUb3RhbCBudW1iZXIgb2YgZnJhbWVzIHJlY2VpdmVkIHN1Y2Nlc2Z1bGx5CiAJCQkJICAgdGhhdCBoYWQgZGVzdGluYXRpb24gYWRkcmVzcyBlcXVhbCB0byB0aGUKIAkJCQkgICBicm9hZGNhc3QgYWRkcmVzcyAqLwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSkgdWNjX2dldGhfaGFyZHdhcmVfc3RhdGlzdGljc190OworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CiAKIC8qIFVDQyBHRVRIIFR4IGVycm9ycyByZXR1cm5lZCB2aWEgVHhDb25mIGNhbGxiYWNrICovCiAjZGVmaW5lIFRYX0VSUk9SU19ERUYgICAgICAweDAyMDAKQEAgLTEwMTMsMjEgKzEwMTMsMjEgQEAKIAkJCQkoTUlJTUNGR19NQU5BR0VNRU5UX0NMT0NLX0RJVklERV9CWV8xMTIpCiAKIC8qIEV0aGVybmV0IHNwZWVkICovCi10eXBlZGVmIGVudW0gZW5ldF9zcGVlZCB7CitlbnVtIGVuZXRfc3BlZWQgewogCUVORVRfU1BFRURfMTBCVCwJLyogMTAgQmFzZSBUICovCiAJRU5FVF9TUEVFRF8xMDBCVCwJLyogMTAwIEJhc2UgVCAqLwogCUVORVRfU1BFRURfMTAwMEJUCS8qIDEwMDAgQmFzZSBUICovCi19IGVuZXRfc3BlZWRfZTsKK307CiAKIC8qIEV0aGVybmV0IEFkZHJlc3MgVHlwZS4gKi8KLXR5cGVkZWYgZW51bSBlbmV0X2FkZHJfdHlwZSB7CitlbnVtIGVuZXRfYWRkcl90eXBlIHsKIAlFTkVUX0FERFJfVFlQRV9JTkRJVklEVUFMLAogCUVORVRfQUREUl9UWVBFX0dST1VQLAogCUVORVRfQUREUl9UWVBFX0JST0FEQ0FTVAotfSBlbmV0X2FkZHJfdHlwZV9lOworfTsKIAogLyogVEJJIC8gTUlJIFNldCBSZWdpc3RlciAqLwotdHlwZWRlZiBlbnVtIGVuZXRfdGJpX21paV9yZWcgeworZW51bSBlbmV0X3RiaV9taWlfcmVnIHsKIAlFTkVUX1RCSV9NSUlfQ1IgPSAweDAwLAkvKiBDb250cm9sIChDUiApICovCiAJRU5FVF9UQklfTUlJX1NSID0gMHgwMSwJLyogU3RhdHVzIChTUiApICovCiAJRU5FVF9UQklfTUlJX0FOQSA9IDB4MDQsCS8qIEFOIGFkdmVydGlzZW1lbnQgKEFOQSApICovCkBAIC0xMDQwLDEwICsxMDQwLDEwIEBACiAJRU5FVF9UQklfTUlJX0VYU1QgPSAweDBGLAkvKiBFeHRlbmRlZCBzdGF0dXMgKEVYU1QgKSAqLwogCUVORVRfVEJJX01JSV9KRCA9IDB4MTAsCS8qIEppdHRlciBkaWFnbm9zdGljcyAoSkQgKSAqLwogCUVORVRfVEJJX01JSV9UQklDT04gPSAweDExCS8qIFRCSSBjb250cm9sIChUQklDT04gKSAqLwotfSBlbmV0X3RiaV9taWlfcmVnX2U7Cit9OwogCiAvKiBVQ0MgR0VUSCA4Mnh4IEV0aGVybmV0IEFkZHJlc3MgUmVjb2duaXRpb24gTG9jYXRpb24gKi8KLXR5cGVkZWYgZW51bSB1Y2NfZ2V0aF9lbmV0X2FkZHJlc3NfcmVjb2duaXRpb25fbG9jYXRpb24geworZW51bSB1Y2NfZ2V0aF9lbmV0X2FkZHJlc3NfcmVjb2duaXRpb25fbG9jYXRpb24gewogCVVDQ19HRVRIX0VORVRfQUREUkVTU19SRUNPR05JVElPTl9MT0NBVElPTl9TVEFUSU9OX0FERFJFU1MsLyogc3RhdGlvbgogCQkJCQkJCQkgICAgICBhZGRyZXNzICovCiAJVUNDX0dFVEhfRU5FVF9BRERSRVNTX1JFQ09HTklUSU9OX0xPQ0FUSU9OX1BBRERSX0ZJUlNULAkvKiBhZGRpdGlvbmFsCkBAIC0xMDY1LDEwICsxMDY1LDEwIEBACiAJVUNDX0dFVEhfRU5FVF9BRERSRVNTX1JFQ09HTklUSU9OX0xPQ0FUSU9OX0dST1VQX0hBU0gsCS8qIGdyb3VwIGhhc2ggKi8KIAlVQ0NfR0VUSF9FTkVUX0FERFJFU1NfUkVDT0dOSVRJT05fTE9DQVRJT05fSU5ESVZJRFVBTF9IQVNIIC8qIGluZGl2aWR1YWwKIAkJCQkJCQkJICAgICAgaGFzaCAqLwotfSB1Y2NfZ2V0aF9lbmV0X2FkZHJlc3NfcmVjb2duaXRpb25fbG9jYXRpb25fZTsKK307CiAKIC8qIFVDQyBHRVRIIHZsYW4gb3BlcmF0aW9uIHRhZ2dlZCAqLwotdHlwZWRlZiBlbnVtIHVjY19nZXRoX3ZsYW5fb3BlcmF0aW9uX3RhZ2dlZCB7CitlbnVtIHVjY19nZXRoX3ZsYW5fb3BlcmF0aW9uX3RhZ2dlZCB7CiAJVUNDX0dFVEhfVkxBTl9PUEVSQVRJT05fVEFHR0VEX05PUCA9IDB4MCwJLyogVGFnZ2VkIC0gbm9wICovCiAJVUNDX0dFVEhfVkxBTl9PUEVSQVRJT05fVEFHR0VEX1JFUExBQ0VfVklEX1BPUlRJT05fT0ZfUV9UQUcKIAkJPSAweDEsCS8qIFRhZ2dlZCAtIHJlcGxhY2UgdmlkIHBvcnRpb24gb2YgcSB0YWcgKi8KQEAgLTEwNzYsMTggKzEwNzYsMTggQEAKIAkJPSAweDIsCS8qIFRhZ2dlZCAtIGlmIHZpZDAgcmVwbGFjZSB2aWQgd2l0aCBkZWZhdWx0IHZhbHVlICAqLwogCVVDQ19HRVRIX1ZMQU5fT1BFUkFUSU9OX1RBR0dFRF9FWFRSQUNUX1FfVEFHX0ZST01fRlJBTUUKIAkJPSAweDMJLyogVGFnZ2VkIC0gZXh0cmFjdCBxIHRhZyBmcm9tIGZyYW1lICovCi19IHVjY19nZXRoX3ZsYW5fb3BlcmF0aW9uX3RhZ2dlZF9lOworfTsKIAogLyogVUNDIEdFVEggdmxhbiBvcGVyYXRpb24gbm9uLXRhZ2dlZCAqLwotdHlwZWRlZiBlbnVtIHVjY19nZXRoX3ZsYW5fb3BlcmF0aW9uX25vbl90YWdnZWQgeworZW51bSB1Y2NfZ2V0aF92bGFuX29wZXJhdGlvbl9ub25fdGFnZ2VkIHsKIAlVQ0NfR0VUSF9WTEFOX09QRVJBVElPTl9OT05fVEFHR0VEX05PUCA9IDB4MCwJLyogTm9uIHRhZ2dlZCAtIG5vcCAqLwogCVVDQ19HRVRIX1ZMQU5fT1BFUkFUSU9OX05PTl9UQUdHRURfUV9UQUdfSU5TRVJUID0gMHgxCS8qIE5vbiB0YWdnZWQgLQogCQkJCQkJCQkgICBxIHRhZyBpbnNlcnQKIAkJCQkJCQkJICovCi19IHVjY19nZXRoX3ZsYW5fb3BlcmF0aW9uX25vbl90YWdnZWRfZTsKK307CiAKIC8qIFVDQyBHRVRIIFJ4IFF1YWxpdHkgb2YgU2VydmljZSBNb2RlICovCi10eXBlZGVmIGVudW0gdWNjX2dldGhfcW9zX21vZGUgeworZW51bSB1Y2NfZ2V0aF9xb3NfbW9kZSB7CiAJVUNDX0dFVEhfUU9TX01PREVfREVGQVVMVCA9IDB4MCwJLyogZGVmYXVsdCBxdWV1ZSAqLwogCVVDQ19HRVRIX1FPU19NT0RFX1FVRVVFX05VTV9GUk9NX0wyX0NSSVRFUklBID0gMHgxLAkvKiBxdWV1ZQogCQkJCQkJCQkgICBkZXRlcm1pbmVkCkBAIC0xMDk3LDExICsxMDk3LDExIEBACiAJCQkJCQkJCSAgIGRldGVybWluZWQKIAkJCQkJCQkJICAgYnkgTDMKIAkJCQkJCQkJICAgY3JpdGVyaWEgKi8KLX0gdWNjX2dldGhfcW9zX21vZGVfZTsKK307CiAKIC8qIFVDQyBHRVRIIFN0YXRpc3RpY3MgR2F0aGVyaW5nIE1vZGUgLSBUaGVzZSBhcmUgYml0IGZsYWdzLCAnb3InIHRoZW0gdG9nZXRoZXIKICAgIGZvciBjb21iaW5lZCBmdW5jdGlvbmFsaXR5ICovCi10eXBlZGVmIGVudW0gdWNjX2dldGhfc3RhdGlzdGljc19nYXRoZXJpbmdfbW9kZSB7CitlbnVtIHVjY19nZXRoX3N0YXRpc3RpY3NfZ2F0aGVyaW5nX21vZGUgewogCVVDQ19HRVRIX1NUQVRJU1RJQ1NfR0FUSEVSSU5HX01PREVfTk9ORSA9IDB4MDAwMDAwMDAsCS8qIE5vCiAJCQkJCQkJCSAgIHN0YXRpc3RpY3MKIAkJCQkJCQkJICAgZ2F0aGVyaW5nICovCkBAIC0xMTIyLDEwICsxMTIyLDEwIEBACiAJCQkJCQkJCSAgICAgIHN0YXRpc3RpY3MKIAkJCQkJCQkJICAgICAgZ2F0aGVyaW5nCiAJCQkJCQkJCSAgICAqLwotfSB1Y2NfZ2V0aF9zdGF0aXN0aWNzX2dhdGhlcmluZ19tb2RlX2U7Cit9OwogCiAvKiBVQ0MgR0VUSCBQYWQgYW5kIENSQyBNb2RlIC0gTm90ZSwgUGFkZGluZyB3aXRob3V0IENSQyBpcyBub3QgcG9zc2libGUgKi8KLXR5cGVkZWYgZW51bSB1Y2NfZ2V0aF9tYWNjZmcyX3BhZF9hbmRfY3JjX21vZGUgeworZW51bSB1Y2NfZ2V0aF9tYWNjZmcyX3BhZF9hbmRfY3JjX21vZGUgewogCVVDQ19HRVRIX1BBRF9BTkRfQ1JDX01PREVfTk9ORQogCQk9IE1BQ0NGRzJfUEFEX0FORF9DUkNfTU9ERV9OT05FLAkvKiBOZWl0aGVyIFBhZGRpbmcKIAkJCQkJCQkgICBzaG9ydCBmcmFtZXMKQEAgLTExMzUsNjEgKzExMzUsNTkgQEAKIAkJCQkJCQkgICBDUkMgb25seSAqLwogCVVDQ19HRVRIX1BBRF9BTkRfQ1JDX01PREVfUEFEX0FORF9DUkMgPQogCSAgICBNQUNDRkcyX1BBRF9BTkRfQ1JDX01PREVfUEFEX0FORF9DUkMKLX0gdWNjX2dldGhfbWFjY2ZnMl9wYWRfYW5kX2NyY19tb2RlX2U7Cit9OwogCiAvKiBVQ0MgR0VUSCB1cHNtciBGbG93IENvbnRyb2wgTW9kZSAqLwotdHlwZWRlZiBlbnVtIHVjY19nZXRoX2Zsb3dfY29udHJvbF9tb2RlIHsKK2VudW0gdWNjX2dldGhfZmxvd19jb250cm9sX21vZGUgewogCVVQU01SX0FVVE9NQVRJQ19GTE9XX0NPTlRST0xfTU9ERV9OT05FID0gMHgwMDAwMDAwMCwJLyogTm8gYXV0b21hdGljCiAJCQkJCQkJCSAgIGZsb3cgY29udHJvbAogCQkJCQkJCQkgKi8KIAlVUFNNUl9BVVRPTUFUSUNfRkxPV19DT05UUk9MX01PREVfUEFVU0VfV0hFTl9FTUVSR0VOQ1kKIAkJPSAweDAwMDA0MDAwCS8qIFNlbmQgcGF1c2UgZnJhbWUgd2hlbiBSeEZJRk8gcmVhY2hlcyBpdHMKIAkJCQkgICBlbWVyZ2VuY3kgdGhyZXNob2xkICovCi19IHVjY19nZXRoX2Zsb3dfY29udHJvbF9tb2RlX2U7Cit9OwogCiAvKiBVQ0MgR0VUSCBudW1iZXIgb2YgdGhyZWFkcyAqLwotdHlwZWRlZiBlbnVtIHVjY19nZXRoX251bV9vZl90aHJlYWRzIHsKK2VudW0gdWNjX2dldGhfbnVtX29mX3RocmVhZHMgewogCVVDQ19HRVRIX05VTV9PRl9USFJFQURTXzEgPSAweDEsCS8qIDEgKi8KIAlVQ0NfR0VUSF9OVU1fT0ZfVEhSRUFEU18yID0gMHgyLAkvKiAyICovCiAJVUNDX0dFVEhfTlVNX09GX1RIUkVBRFNfNCA9IDB4MCwJLyogNCAqLwogCVVDQ19HRVRIX05VTV9PRl9USFJFQURTXzYgPSAweDMsCS8qIDYgKi8KIAlVQ0NfR0VUSF9OVU1fT0ZfVEhSRUFEU184ID0gMHg0CS8qIDggKi8KLX0gdWNjX2dldGhfbnVtX29mX3RocmVhZHNfZTsKK307CiAKIC8qIFVDQyBHRVRIIG51bWJlciBvZiBzdGF0aW9uIGFkZHJlc3NlcyAqLwotdHlwZWRlZiBlbnVtIHVjY19nZXRoX251bV9vZl9zdGF0aW9uX2FkZHJlc3NlcyB7CitlbnVtIHVjY19nZXRoX251bV9vZl9zdGF0aW9uX2FkZHJlc3NlcyB7CiAJVUNDX0dFVEhfTlVNX09GX1NUQVRJT05fQUREUkVTU0VTXzEsCS8qIDEgKi8KIAlVQ0NfR0VUSF9OVU1fT0ZfU1RBVElPTl9BRERSRVNTRVNfNQkvKiA1ICovCi19IHVjY19nZXRoX251bV9vZl9zdGF0aW9uX2FkZHJlc3Nlc19lOwotCi10eXBlZGVmIHU4IGVuZXRfYWRkcl90W0VORVRfTlVNX09DVEVUU19QRVJfQUREUkVTU107Cit9OwogCiAvKiBVQ0MgR0VUSCA4Mnh4IEV0aGVybmV0IEFkZHJlc3MgQ29udGFpbmVyICovCi10eXBlZGVmIHN0cnVjdCBlbmV0X2FkZHJfY29udGFpbmVyIHsKLQllbmV0X2FkZHJfdCBhZGRyZXNzOwkvKiBldGhlcm5ldCBhZGRyZXNzICovCi0JdWNjX2dldGhfZW5ldF9hZGRyZXNzX3JlY29nbml0aW9uX2xvY2F0aW9uX2UgbG9jYXRpb247CS8qIGxvY2F0aW9uIGluCitzdHJ1Y3QgZW5ldF9hZGRyX2NvbnRhaW5lciB7CisJdTggYWRkcmVzc1tFTkVUX05VTV9PQ1RFVFNfUEVSX0FERFJFU1NdOwkvKiBldGhlcm5ldCBhZGRyZXNzICovCisJZW51bSB1Y2NfZ2V0aF9lbmV0X2FkZHJlc3NfcmVjb2duaXRpb25fbG9jYXRpb24gbG9jYXRpb247CS8qIGxvY2F0aW9uIGluCiAJCQkJCQkJCSAgIDgyeHggYWRkcmVzcwogCQkJCQkJCQkgICByZWNvZ25pdGlvbgogCQkJCQkJCQkgICBoYXJkd2FyZSAqLwogCXN0cnVjdCBsaXN0X2hlYWQgbm9kZTsKLX0gZW5ldF9hZGRyX2NvbnRhaW5lcl90OworfTsKIAotI2RlZmluZSBFTkVUX0FERFJfQ09OVF9FTlRSWShwdHIpIGxpc3RfZW50cnkocHRyLCBlbmV0X2FkZHJfY29udGFpbmVyX3QsIG5vZGUpCisjZGVmaW5lIEVORVRfQUREUl9DT05UX0VOVFJZKHB0cikgbGlzdF9lbnRyeShwdHIsIHN0cnVjdCBlbmV0X2FkZHJfY29udGFpbmVyLCBub2RlKQogCiAvKiBVQ0MgR0VUSCBUZXJtaW5hdGlvbiBBY3Rpb24gRGVzY3JpcHRvciAoVEFEKSBzdHJ1Y3R1cmUuICovCi10eXBlZGVmIHN0cnVjdCB1Y2NfZ2V0aF90YWRfcGFyYW1zIHsKK3N0cnVjdCB1Y2NfZ2V0aF90YWRfcGFyYW1zIHsKIAlpbnQgcnhfbm9uX2R5bmFtaWNfZXh0ZW5kZWRfZmVhdHVyZXNfbW9kZTsKIAlpbnQgcmVqZWN0X2ZyYW1lOwotCXVjY19nZXRoX3ZsYW5fb3BlcmF0aW9uX3RhZ2dlZF9lIHZ0YWdfb3A7Ci0JdWNjX2dldGhfdmxhbl9vcGVyYXRpb25fbm9uX3RhZ2dlZF9lIHZub250YWdfb3A7Ci0JdWNjX2dldGhfcW9zX21vZGVfZSBycW9zOworCWVudW0gdWNjX2dldGhfdmxhbl9vcGVyYXRpb25fdGFnZ2VkIHZ0YWdfb3A7CisJZW51bSB1Y2NfZ2V0aF92bGFuX29wZXJhdGlvbl9ub25fdGFnZ2VkIHZub250YWdfb3A7CisJZW51bSB1Y2NfZ2V0aF9xb3NfbW9kZSBycW9zOwogCXU4IHZwcmk7CiAJdTE2IHZpZDsKLX0gdWNjX2dldGhfdGFkX3BhcmFtc190OworfTsKIAogLyogR0VUSCBwcm90b2NvbCBpbml0aWFsaXphdGlvbiBzdHJ1Y3R1cmUgKi8KLXR5cGVkZWYgc3RydWN0IHVjY19nZXRoX2luZm8gewotCXVjY19mYXN0X2luZm9fdCB1Zl9pbmZvOworc3RydWN0IHVjY19nZXRoX2luZm8geworCXN0cnVjdCB1Y2NfZmFzdF9pbmZvIHVmX2luZm87CiAJdTggbnVtUXVldWVzVHg7CiAJdTggbnVtUXVldWVzUng7CiAJaW50IGlwQ2hlY2tTdW1DaGVjazsKQEAgLTEyNTEsNTEgKzEyNDksNTEgQEAKIAl1OCBpcGhvZmZzZXRbVFhfSVBfT0ZGU0VUX0VOVFJZX01BWF07CiAJdTE2IGJkUmluZ0xlblR4W05VTV9UWF9RVUVVRVNdOwogCXUxNiBiZFJpbmdMZW5SeFtOVU1fUlhfUVVFVUVTXTsKLQllbmV0X2ludGVyZmFjZV9lIGVuZXRfaW50ZXJmYWNlOwotCXVjY19nZXRoX251bV9vZl9zdGF0aW9uX2FkZHJlc3Nlc19lIG51bVN0YXRpb25BZGRyZXNzZXM7Ci0JIHFlX2ZsdHJfbGFyZ2VzdF9leHRlcm5hbF90YmxfbG9va3VwX2tleV9zaXplX2UKKwllbnVtIGVuZXRfaW50ZXJmYWNlIGVuZXRfaW50ZXJmYWNlOworCWVudW0gdWNjX2dldGhfbnVtX29mX3N0YXRpb25fYWRkcmVzc2VzIG51bVN0YXRpb25BZGRyZXNzZXM7CisJZW51bSBxZV9mbHRyX2xhcmdlc3RfZXh0ZXJuYWxfdGJsX2xvb2t1cF9rZXlfc2l6ZQogCSAgICBsYXJnZXN0ZXh0ZXJuYWxsb29rdXBrZXlzaXplOwotCXVjY19nZXRoX3N0YXRpc3RpY3NfZ2F0aGVyaW5nX21vZGVfZSBzdGF0aXN0aWNzTW9kZTsKLQl1Y2NfZ2V0aF92bGFuX29wZXJhdGlvbl90YWdnZWRfZSB2bGFuT3BlcmF0aW9uVGFnZ2VkOwotCXVjY19nZXRoX3ZsYW5fb3BlcmF0aW9uX25vbl90YWdnZWRfZSB2bGFuT3BlcmF0aW9uTm9uVGFnZ2VkOwotCXVjY19nZXRoX3Fvc19tb2RlX2UgcnhRb1NNb2RlOwotCXVjY19nZXRoX2Zsb3dfY29udHJvbF9tb2RlX2UgYXVmYzsKLQl1Y2NfZ2V0aF9tYWNjZmcyX3BhZF9hbmRfY3JjX21vZGVfZSBwYWRBbmRDcmM7Ci0JdWNjX2dldGhfbnVtX29mX3RocmVhZHNfZSBudW1UaHJlYWRzVHg7Ci0JdWNjX2dldGhfbnVtX29mX3RocmVhZHNfZSBudW1UaHJlYWRzUng7Ci0JcWVfcmlzY19hbGxvY2F0aW9uX2UgcmlzY1R4OwotCXFlX3Jpc2NfYWxsb2NhdGlvbl9lIHJpc2NSeDsKLX0gdWNjX2dldGhfaW5mb190OworCWVudW0gdWNjX2dldGhfc3RhdGlzdGljc19nYXRoZXJpbmdfbW9kZSBzdGF0aXN0aWNzTW9kZTsKKwllbnVtIHVjY19nZXRoX3ZsYW5fb3BlcmF0aW9uX3RhZ2dlZCB2bGFuT3BlcmF0aW9uVGFnZ2VkOworCWVudW0gdWNjX2dldGhfdmxhbl9vcGVyYXRpb25fbm9uX3RhZ2dlZCB2bGFuT3BlcmF0aW9uTm9uVGFnZ2VkOworCWVudW0gdWNjX2dldGhfcW9zX21vZGUgcnhRb1NNb2RlOworCWVudW0gdWNjX2dldGhfZmxvd19jb250cm9sX21vZGUgYXVmYzsKKwllbnVtIHVjY19nZXRoX21hY2NmZzJfcGFkX2FuZF9jcmNfbW9kZSBwYWRBbmRDcmM7CisJZW51bSB1Y2NfZ2V0aF9udW1fb2ZfdGhyZWFkcyBudW1UaHJlYWRzVHg7CisJZW51bSB1Y2NfZ2V0aF9udW1fb2ZfdGhyZWFkcyBudW1UaHJlYWRzUng7CisJZW51bSBxZV9yaXNjX2FsbG9jYXRpb24gcmlzY1R4OworCWVudW0gcWVfcmlzY19hbGxvY2F0aW9uIHJpc2NSeDsKK307CiAKIC8qIHN0cnVjdHVyZSByZXByZXNlbnRpbmcgVUNDIEdFVEggKi8KLXR5cGVkZWYgc3RydWN0IHVjY19nZXRoX3ByaXZhdGUgewotCXVjY19nZXRoX2luZm9fdCAqdWdfaW5mbzsKLQl1Y2NfZmFzdF9wcml2YXRlX3QgKnVjY2Y7CitzdHJ1Y3QgdWNjX2dldGhfcHJpdmF0ZSB7CisJc3RydWN0IHVjY19nZXRoX2luZm8gKnVnX2luZm87CisJc3RydWN0IHVjY19mYXN0X3ByaXZhdGUgKnVjY2Y7CiAJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKIAlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyBzdGF0czsJLyogbGludXggbmV0d29yayBzdGF0aXN0aWNzICovCi0JdWNjX2dldGhfdCAqdWdfcmVnczsKLQl1Y2NfZ2V0aF9pbml0X3ByYW1fdCAqcF9pbml0X2VuZXRfcGFyYW1fc2hhZG93OwotCXVjY19nZXRoX2V4Zl9nbG9iYWxfcHJhbV90ICpwX2V4Zl9nbGJsX3BhcmFtOworCXN0cnVjdCB1Y2NfZ2V0aCAqdWdfcmVnczsKKwlzdHJ1Y3QgdWNjX2dldGhfaW5pdF9wcmFtICpwX2luaXRfZW5ldF9wYXJhbV9zaGFkb3c7CisJc3RydWN0IHVjY19nZXRoX2V4Zl9nbG9iYWxfcHJhbSAqcF9leGZfZ2xibF9wYXJhbTsKIAl1MzIgZXhmX2dsYmxfcGFyYW1fb2Zmc2V0OwotCXVjY19nZXRoX3J4X2dsb2JhbF9wcmFtX3QgKnBfcnhfZ2xibF9wcmFtOworCXN0cnVjdCB1Y2NfZ2V0aF9yeF9nbG9iYWxfcHJhbSAqcF9yeF9nbGJsX3ByYW07CiAJdTMyIHJ4X2dsYmxfcHJhbV9vZmZzZXQ7Ci0JdWNjX2dldGhfdHhfZ2xvYmFsX3ByYW1fdCAqcF90eF9nbGJsX3ByYW07CisJc3RydWN0IHVjY19nZXRoX3R4X2dsb2JhbF9wcmFtICpwX3R4X2dsYmxfcHJhbTsKIAl1MzIgdHhfZ2xibF9wcmFtX29mZnNldDsKLQl1Y2NfZ2V0aF9zZW5kX3F1ZXVlX21lbV9yZWdpb25fdCAqcF9zZW5kX3FfbWVtX3JlZzsKKwlzdHJ1Y3QgdWNjX2dldGhfc2VuZF9xdWV1ZV9tZW1fcmVnaW9uICpwX3NlbmRfcV9tZW1fcmVnOwogCXUzMiBzZW5kX3FfbWVtX3JlZ19vZmZzZXQ7Ci0JdWNjX2dldGhfdGhyZWFkX2RhdGFfdHhfdCAqcF90aHJlYWRfZGF0YV90eDsKKwlzdHJ1Y3QgdWNjX2dldGhfdGhyZWFkX2RhdGFfdHggKnBfdGhyZWFkX2RhdGFfdHg7CiAJdTMyIHRocmVhZF9kYXRfdHhfb2Zmc2V0OwotCXVjY19nZXRoX3RocmVhZF9kYXRhX3J4X3QgKnBfdGhyZWFkX2RhdGFfcng7CisJc3RydWN0IHVjY19nZXRoX3RocmVhZF9kYXRhX3J4ICpwX3RocmVhZF9kYXRhX3J4OwogCXUzMiB0aHJlYWRfZGF0X3J4X29mZnNldDsKLQl1Y2NfZ2V0aF9zY2hlZHVsZXJfdCAqcF9zY2hlZHVsZXI7CisJc3RydWN0IHVjY19nZXRoX3NjaGVkdWxlciAqcF9zY2hlZHVsZXI7CiAJdTMyIHNjaGVkdWxlcl9vZmZzZXQ7Ci0JdWNjX2dldGhfdHhfZmlybXdhcmVfc3RhdGlzdGljc19wcmFtX3QgKnBfdHhfZndfc3RhdGlzdGljc19wcmFtOworCXN0cnVjdCB1Y2NfZ2V0aF90eF9maXJtd2FyZV9zdGF0aXN0aWNzX3ByYW0gKnBfdHhfZndfc3RhdGlzdGljc19wcmFtOwogCXUzMiB0eF9md19zdGF0aXN0aWNzX3ByYW1fb2Zmc2V0OwotCXVjY19nZXRoX3J4X2Zpcm13YXJlX3N0YXRpc3RpY3NfcHJhbV90ICpwX3J4X2Z3X3N0YXRpc3RpY3NfcHJhbTsKKwlzdHJ1Y3QgdWNjX2dldGhfcnhfZmlybXdhcmVfc3RhdGlzdGljc19wcmFtICpwX3J4X2Z3X3N0YXRpc3RpY3NfcHJhbTsKIAl1MzIgcnhfZndfc3RhdGlzdGljc19wcmFtX29mZnNldDsKLQl1Y2NfZ2V0aF9yeF9pbnRlcnJ1cHRfY29hbGVzY2luZ190YWJsZV90ICpwX3J4X2lycV9jb2FsZXNjaW5nX3RibDsKKwlzdHJ1Y3QgdWNjX2dldGhfcnhfaW50ZXJydXB0X2NvYWxlc2NpbmdfdGFibGUgKnBfcnhfaXJxX2NvYWxlc2NpbmdfdGJsOwogCXUzMiByeF9pcnFfY29hbGVzY2luZ190Ymxfb2Zmc2V0OwotCXVjY19nZXRoX3J4X2JkX3F1ZXVlc19lbnRyeV90ICpwX3J4X2JkX3FzX3RibDsKKwlzdHJ1Y3QgdWNjX2dldGhfcnhfYmRfcXVldWVzX2VudHJ5ICpwX3J4X2JkX3FzX3RibDsKIAl1MzIgcnhfYmRfcXNfdGJsX29mZnNldDsKIAl1OCAqcF90eF9iZF9yaW5nW05VTV9UWF9RVUVVRVNdOwogCXUzMiB0eF9iZF9yaW5nX29mZnNldFtOVU1fVFhfUVVFVUVTXTsKQEAgLTEzMDgsNyArMTMwNiw3IEBACiAJdTE2IGNwdWNvdW50W05VTV9UWF9RVUVVRVNdOwogCXZvbGF0aWxlIHUxNiAqcF9jcHVjb3VudFtOVU1fVFhfUVVFVUVTXTsKIAlpbnQgaW5kQWRkclJlZ1VzZWRbTlVNX09GX1BBRERSU107Ci0JZW5ldF9hZGRyX3QgcGFkZHJbTlVNX09GX1BBRERSU107CisJdTggcGFkZHJbTlVNX09GX1BBRERSU11bRU5FVF9OVU1fT0NURVRTX1BFUl9BRERSRVNTXTsJLyogZXRoZXJuZXQgYWRkcmVzcyAqLwogCXU4IG51bUdyb3VwQWRkckluSGFzaDsKIAl1OCBudW1JbmRBZGRySW5IYXNoOwogCXU4IG51bUluZEFkZHJJblJlZzsKQEAgLTEzMzQsNiArMTMzMiw2IEBACiAJaW50IG9sZHNwZWVkOwogCWludCBvbGRkdXBsZXg7CiAJaW50IG9sZGxpbms7Ci19IHVjY19nZXRoX3ByaXZhdGVfdDsKK307CiAKICNlbmRpZgkJCQkvKiBfX1VDQ19HRVRIX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvdWNjX2dldGhfcGh5LmMgYi9kcml2ZXJzL25ldC91Y2NfZ2V0aF9waHkuYwppbmRleCA2NzI2MGViLi41MzYwZWMwIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC91Y2NfZ2V0aF9waHkuYworKysgYi9kcml2ZXJzL25ldC91Y2NfZ2V0aF9waHkuYwpAQCAtNDIsNyArNDIsNiBAQAogCiAjaW5jbHVkZSAidWNjX2dldGguaCIKICNpbmNsdWRlICJ1Y2NfZ2V0aF9waHkuaCIKLSNpbmNsdWRlIDxwbGF0Zm9ybXMvODN4eC9tcGM4MzYwZV9wYi5oPgogCiAjZGVmaW5lIHVncGh5X3ByaW50ayhsZXZlbCwgZm9ybWF0LCBhcmcuLi4pICBcCiAgICAgICAgIHByaW50ayhsZXZlbCBmb3JtYXQgIlxuIiwgIyMgYXJnKQpAQCAtNzIsMTYgKzcxLDE0IEBACiB1MTYgcGh5X3JlYWQoc3RydWN0IHVnZXRoX21paV9pbmZvICptaWlfaW5mbywgdTE2IHJlZ251bSk7CiB2b2lkIHBoeV93cml0ZShzdHJ1Y3QgdWdldGhfbWlpX2luZm8gKm1paV9pbmZvLCB1MTYgcmVnbnVtLCB1MTYgdmFsKTsKIAotc3RhdGljIHU4ICpiY3NyX3JlZ3MgPSBOVUxMOwotCiAvKiBXcml0ZSB2YWx1ZSB0byB0aGUgUEhZIGZvciB0aGlzIGRldmljZSB0byB0aGUgcmVnaXN0ZXIgYXQgcmVnbnVtLCAqLwogLyogd2FpdGluZyB1bnRpbCB0aGUgd3JpdGUgaXMgZG9uZSBiZWZvcmUgaXQgcmV0dXJucy4gIEFsbCBQSFkgKi8KIC8qIGNvbmZpZ3VyYXRpb24gaGFzIHRvIGJlIGRvbmUgdGhyb3VnaCB0aGUgVFNFQzEgTUlJTSByZWdzICovCiB2b2lkIHdyaXRlX3BoeV9yZWcoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IG1paV9pZCwgaW50IHJlZ251bSwgaW50IHZhbHVlKQogewotCXVjY19nZXRoX3ByaXZhdGVfdCAqdWdldGggPSBuZXRkZXZfcHJpdihkZXYpOwotCXVjY19taWlfbW5nX3QgKm1paV9yZWdzOwotCWVuZXRfdGJpX21paV9yZWdfZSBtaWlfcmVnID0gKGVuZXRfdGJpX21paV9yZWdfZSkgcmVnbnVtOworCXN0cnVjdCB1Y2NfZ2V0aF9wcml2YXRlICp1Z2V0aCA9IG5ldGRldl9wcml2KGRldik7CisJc3RydWN0IHVjY19taWlfbW5nICptaWlfcmVnczsKKwllbnVtIGVuZXRfdGJpX21paV9yZWcgbWlpX3JlZyA9IChlbnVtIGVuZXRfdGJpX21paV9yZWcpIHJlZ251bTsKIAl1MzIgdG1wX3JlZzsKIAogCXVncGh5X3ZkYmcoIiVzOiBJTiIsIF9fRlVOQ1RJT05fXyk7CkBAIC0xMTYsOSArMTEzLDkgQEAKIC8qIGNvbmZpZ3VyYXRpb24gaGFzIHRvIGJlIGRvbmUgdGhyb3VnaCB0aGUgVFNFQzEgTUlJTSByZWdzICovCiBpbnQgcmVhZF9waHlfcmVnKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBtaWlfaWQsIGludCByZWdudW0pCiB7Ci0JdWNjX2dldGhfcHJpdmF0ZV90ICp1Z2V0aCA9IG5ldGRldl9wcml2KGRldik7Ci0JdWNjX21paV9tbmdfdCAqbWlpX3JlZ3M7Ci0JZW5ldF90YmlfbWlpX3JlZ19lIG1paV9yZWcgPSAoZW5ldF90YmlfbWlpX3JlZ19lKSByZWdudW07CisJc3RydWN0IHVjY19nZXRoX3ByaXZhdGUgKnVnZXRoID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlzdHJ1Y3QgdWNjX21paV9tbmcgKm1paV9yZWdzOworCWVudW0gZW5ldF90YmlfbWlpX3JlZyBtaWlfcmVnID0gKGVudW0gZW5ldF90YmlfbWlpX3JlZykgcmVnbnVtOwogCXUzMiB0bXBfcmVnOwogCXUxNiB2YWx1ZTsKIApAQCAtNjM0LDExICs2MzEsNiBAQAogCiBzdGF0aWMgaW50IGRtOTE2MV9hY2tfaW50ZXJydXB0KHN0cnVjdCB1Z2V0aF9taWlfaW5mbyAqbWlpX2luZm8pCiB7Ci0vKiBGSVhNRTogVGhpcyBsaW5lcyBhcmUgZm9yIEJVRyBmaXhpbmcgaW4gdGhlIG1wYzgzMjUuCi1SZW1vdmUgdGhpcyBmcm9tIGhlcmUgd2hlbiBpdCdzIGZpeGVkICovCi0JaWYgKGJjc3JfcmVncyA9PSBOVUxMKQotCQliY3NyX3JlZ3MgPSAodTggKikgaW9yZW1hcChCQ1NSX1BIWVNfQUREUiwgQkNTUl9TSVpFKTsKLQliY3NyX3JlZ3NbMTRdIHw9IDB4NDA7CiAJdWdwaHlfdmRiZygiJXM6IElOIiwgX19GVU5DVElPTl9fKTsKIAogCS8qIENsZWFyIHRoZSBpbnRlcnJ1cHRzIGJ5IHJlYWRpbmcgdGhlIHJlZyAqLwpAQCAtNjUwLDEyICs2NDIsNiBAQAogCiBzdGF0aWMgaW50IGRtOTE2MV9jb25maWdfaW50cihzdHJ1Y3QgdWdldGhfbWlpX2luZm8gKm1paV9pbmZvKQogewotLyogRklYTUU6IFRoaXMgbGluZXMgYXJlIGZvciBCVUcgZml4aW5nIGluIHRoZSBtcGM4MzI1LgotUmVtb3ZlIHRoaXMgZnJvbSBoZXJlIHdoZW4gaXQncyBmaXhlZCAqLwotCWlmIChiY3NyX3JlZ3MgPT0gTlVMTCkgewotCQliY3NyX3JlZ3MgPSAodTggKikgaW9yZW1hcChCQ1NSX1BIWVNfQUREUiwgQkNTUl9TSVpFKTsKLQkJYmNzcl9yZWdzWzE0XSAmPSB+MHg0MDsKLQl9CiAJdWdwaHlfdmRiZygiJXM6IElOIiwgX19GVU5DVElPTl9fKTsKIAogCWlmIChtaWlfaW5mby0+aW50ZXJydXB0cyA9PSBNSUlfSU5URVJSVVBUX0VOQUJMRUQpCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC91Y2NfZ2V0aF9waHkuaCBiL2RyaXZlcnMvbmV0L3VjY19nZXRoX3BoeS5oCmluZGV4IDJmOThiOGYuLmY1NzQwNzggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3VjY19nZXRoX3BoeS5oCisrKyBiL2RyaXZlcnMvbmV0L3VjY19nZXRoX3BoeS5oCkBAIC0xMjYsNyArMTI2LDcgQEAKIAkvKiBBbmQgbWFuYWdlbWVudCBmdW5jdGlvbnMgKi8KIAlzdHJ1Y3QgcGh5X2luZm8gKnBoeWluZm87CiAKLQl1Y2NfbWlpX21uZ190ICptaWlfcmVnczsKKwlzdHJ1Y3QgdWNjX21paV9tbmcgKm1paV9yZWdzOwogCiAJLyogZm9yY2VkIHNwZWVkICYgZHVwbGV4IChubyBhdXRvbmVnKQogCSAqIHBhcnRuZXIgc3BlZWQgJiBkdXBsZXggJiBwYXVzZSAoYXV0b25lZykKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dhbi9LY29uZmlnIGIvZHJpdmVycy9uZXQvd2FuL0tjb25maWcKaW5kZXggNThiN2VmYi4uYjVkMGQ3ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2FuL0tjb25maWcKKysrIGIvZHJpdmVycy9uZXQvd2FuL0tjb25maWcKQEAgLTEyNyw3ICsxMjcsNyBAQAogIyBUaGVyZSBpcyBubyB3YXkgdG8gZGV0ZWN0IGEgU2VhbGV2ZWwgYm9hcmQuIEZvcmNlIGl0IG1vZHVsYXIKIGNvbmZpZyBTRUFMRVZFTF80MDIxCiAJdHJpc3RhdGUgIlNlYWxldmVsIFN5c3RlbXMgNDAyMSBzdXBwb3J0IgotCWRlcGVuZHMgb24gV0FOICYmIElTQSAmJiBtICYmIElTQV9ETUFfQVBJCisJZGVwZW5kcyBvbiBXQU4gJiYgSVNBICYmIG0gJiYgSVNBX0RNQV9BUEkgJiYgSU5FVAogCWhlbHAKIAkgIFRoaXMgaXMgYSBkcml2ZXIgZm9yIHRoZSBTZWFsZXZlbCBTeXN0ZW1zIEFDQiA1NiBzZXJpYWwgSS9PIGFkYXB0ZXIuCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dhbi9uMi5jIGIvZHJpdmVycy9uZXQvd2FuL24yLmMKaW5kZXggZGNmNDZhZC4uNWMzMjJkZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2FuL24yLmMKKysrIGIvZHJpdmVycy9uZXQvd2FuL24yLmMKQEAgLTUwMCw3ICs1MDAsNyBAQAogI2lmZGVmIE1PRFVMRQogCQlwcmludGsoS0VSTl9JTkZPICJuMjogbm8gY2FyZCBpbml0aWFsaXplZFxuIik7CiAjZW5kaWYKLQkJcmV0dXJuIC1FTk9TWVM7CS8qIG5vIHBhcmFtZXRlcnMgc3BlY2lmaWVkLCBhYm9ydCAqLworCQlyZXR1cm4gLUVJTlZBTDsJLyogbm8gcGFyYW1ldGVycyBzcGVjaWZpZWQsIGFib3J0ICovCiAJfQogCiAJcHJpbnRrKEtFUk5fSU5GTyAiJXNcbiIsIHZlcnNpb24pOwpAQCAtNTM4LDExICs1MzgsMTEgQEAKIAkJCW4yX3J1bihpbywgaXJxLCByYW0sIHZhbGlkWzBdLCB2YWxpZFsxXSk7CiAKIAkJaWYgKCpodyA9PSAnXHgwJykKLQkJCXJldHVybiBmaXJzdF9jYXJkID8gMCA6IC1FTk9TWVM7CisJCQlyZXR1cm4gZmlyc3RfY2FyZCA/IDAgOiAtRUlOVkFMOwogCX13aGlsZSgqaHcrKyA9PSAnOicpOwogCiAJcHJpbnRrKEtFUk5fRVJSICJuMjogaW52YWxpZCBoYXJkd2FyZSBwYXJhbWV0ZXJzXG4iKTsKLQlyZXR1cm4gZmlyc3RfY2FyZCA/IDAgOiAtRU5PU1lTOworCXJldHVybiBmaXJzdF9jYXJkID8gMCA6IC1FSU5WQUw7CiB9CiAKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2FuL3BjMzAwX2Rydi5jIGIvZHJpdmVycy9uZXQvd2FuL3BjMzAwX2Rydi5jCmluZGV4IDU4MjNlM2IuLjM2ZDFjM2YgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dhbi9wYzMwMF9kcnYuYworKysgYi9kcml2ZXJzL25ldC93YW4vcGMzMDBfZHJ2LmMKQEAgLTI4NjcsNyArMjg2Nyw2IEBACiAJdWNsb25nIGNsa3R5cGUgPSBjaGFuLT5jb25mLnBoeXNfc2V0dGluZ3MuY2xvY2tfdHlwZTsKIAl1Y3Nob3J0IGVuY29kaW5nID0gY2hhbi0+Y29uZi5wcm90b19zZXR0aW5ncy5lbmNvZGluZzsKIAl1Y3Nob3J0IHBhcml0eSA9IGNoYW4tPmNvbmYucHJvdG9fc2V0dGluZ3MucGFyaXR5OyAgIAotCWludCB0bWMsIGJyOwogCXVjY2hhciBtZDAsIG1kMjsKICAgICAKIAkvKiBSZXNldCB0aGUgY2hhbm5lbCAqLwpAQCAtMjk0MCw4ICsyOTM5LDEyIEBACiAJCWNhc2UgUEMzMDBfUlNWOgogCQljYXNlIFBDMzAwX1gyMToKIAkJCWlmIChjbGt0eXBlID09IENMT0NLX0lOVCB8fCBjbGt0eXBlID09IENMT0NLX1RYSU5UKSB7CisJCQkJaW50IHRtYywgYnI7CisKIAkJCQkvKiBDYWxjdWxhdGUgdGhlIGNsa3JhdGUgcGFyYW1ldGVycyAqLwogCQkJCXRtYyA9IGNsb2NrX3JhdGVfY2FsYyhjbGtyYXRlLCBjYXJkLT5ody5jbG9jaywgJmJyKTsKKwkJCQlpZiAodG1jIDwgMCkKKwkJCQkJcmV0dXJuIC1FSU87CiAJCQkJY3BjX3dyaXRlYihzY2FiYXNlICsgTV9SRUcoVE1DVCwgY2gpLCB0bWMpOwogCQkJCWNwY193cml0ZWIoc2NhYmFzZSArIE1fUkVHKFRYUywgY2gpLAogCQkJCQkgICAoVFhTX0RUUlhDIHwgVFhTX0lCUkcgfCBicikpOwpAQCAtMzA5NywxNCArMzEwMCwxNiBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgdm9pZCBjcGNfb3BlbmNoKHBjMzAwZGV2X3QgKiBkKQorc3RhdGljIGludCBjcGNfb3BlbmNoKHBjMzAwZGV2X3QgKiBkKQogewogCXBjMzAwY2hfdCAqY2hhbiA9IChwYzMwMGNoX3QgKikgZC0+Y2hhbjsKIAlwYzMwMF90ICpjYXJkID0gKHBjMzAwX3QgKikgY2hhbi0+Y2FyZDsKLQlpbnQgY2ggPSBjaGFuLT5jaGFubmVsOworCWludCBjaCA9IGNoYW4tPmNoYW5uZWwsIHJjOwogCXZvaWQgX19pb21lbSAqc2NhYmFzZSA9IGNhcmQtPmh3LnNjYWJhc2U7CiAKLQljaF9jb25maWcoZCk7CisJcmMgPSBjaF9jb25maWcoZCk7CisJaWYgKHJjKQorCQlyZXR1cm4gcmM7CiAKIAlyeF9jb25maWcoZCk7CiAKQEAgLTMxMTMsNiArMzExOCw4IEBACiAJLyogQXNzZXJ0IFJUUyBhbmQgRFRSICovCiAJY3BjX3dyaXRlYihzY2FiYXNlICsgTV9SRUcoQ1RMLCBjaCksCiAJCSAgIGNwY19yZWFkYihzY2FiYXNlICsgTV9SRUcoQ1RMLCBjaCkpICYgfihDVExfUlRTIHwgQ1RMX0RUUikpOworCisJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyB2b2lkIGNwY19jbG9zZWNoKHBjMzAwZGV2X3QgKiBkKQpAQCAtMzE2OCw5ICszMTc1LDE2IEBACiAJfQogCiAJc3ByaW50ZihpZnIuaWZyX25hbWUsICIlcyIsIGRldi0+bmFtZSk7Ci0JY3BjX29wZW5jaChkKTsKKwlyZXN1bHQgPSBjcGNfb3BlbmNoKGQpOworCWlmIChyZXN1bHQpCisJCWdvdG8gZXJyX291dDsKKwogCW5ldGlmX3N0YXJ0X3F1ZXVlKGRldik7CiAJcmV0dXJuIDA7CisKK2Vycl9vdXQ6CisJaGRsY19jbG9zZShkZXYpOworCXJldHVybiByZXN1bHQ7CiB9CiAKIHN0YXRpYyBpbnQgY3BjX2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9haXJvLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9haXJvLmMKaW5kZXggMGEzM2M4YS4uZWZjZGFmMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYWlyby5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2Fpcm8uYwpAQCAtMjg5Nyw2ICsyODk3LDggQEAKIAkJZ290byBlcnJfb3V0X21hcDsKIAl9CiAJYWktPndpZmlkZXYgPSBpbml0X3dpZmlkZXYoYWksIGRldik7CisJaWYgKCFhaS0+d2lmaWRldikKKwkJZ290byBlcnJfb3V0X3JlZzsKIAogCXNldF9iaXQoRkxBR19SRUdJU1RFUkVELCZhaS0+ZmxhZ3MpOwogCWFpcm9fcHJpbnRfaW5mbyhkZXYtPm5hbWUsICJNQUMgZW5hYmxlZCAleDoleDoleDoleDoleDoleCIsCkBAIC0yOTA4LDExICsyOTEwLDE4IEBACiAJCWZvciggaSA9IDA7IGkgPCBNQVhfRklEUzsgaSsrICkKIAkJCWFpLT5maWRzW2ldID0gdHJhbnNtaXRfYWxsb2NhdGUoYWksQUlST19ERUZfTVRVLGk+PU1BWF9GSURTLzIpOwogCi0Jc2V0dXBfcHJvY19lbnRyeSggZGV2LCBkZXYtPnByaXYgKTsgLyogWFhYIGNoZWNrIGZvciBmYWlsdXJlICovCisJaWYgKHNldHVwX3Byb2NfZW50cnkoZGV2LCBkZXYtPnByaXYpIDwgMCkKKwkJZ290byBlcnJfb3V0X3dpZmk7CisKIAluZXRpZl9zdGFydF9xdWV1ZShkZXYpOwogCVNFVF9NT0RVTEVfT1dORVIoZGV2KTsKIAlyZXR1cm4gZGV2OwogCitlcnJfb3V0X3dpZmk6CisJdW5yZWdpc3Rlcl9uZXRkZXYoYWktPndpZmlkZXYpOworCWZyZWVfbmV0ZGV2KGFpLT53aWZpZGV2KTsKK2Vycl9vdXRfcmVnOgorCXVucmVnaXN0ZXJfbmV0ZGV2KGRldik7CiBlcnJfb3V0X21hcDoKIAlpZiAodGVzdF9iaXQoRkxBR19NUEksJmFpLT5mbGFncykgJiYgcGNpKSB7CiAJCXBjaV9mcmVlX2NvbnNpc3RlbnQocGNpLCBQQ0lfU0hBUkVEX0xFTiwgYWktPnNoYXJlZCwgYWktPnNoYXJlZF9kbWEpOwpAQCAtMzA4OSw3ICszMDk4LDggQEAKIAkJCQkJCXNldF9iaXQoSk9CX0FVVE9XRVAsICZhaS0+am9icyk7CiAJCQkJCQlicmVhazsKIAkJCQkJfQotCQkJCQlpZiAoIWt0aHJlYWRfc2hvdWxkX3N0b3AoKSkgeworCQkJCQlpZiAoIWt0aHJlYWRfc2hvdWxkX3N0b3AoKSAmJgorCQkJCQkgICAgIWZyZWV6aW5nKGN1cnJlbnQpKSB7CiAJCQkJCQl1bnNpZ25lZCBsb25nIHdha2VfYXQ7CiAJCQkJCQlpZiAoIWFpLT5leHBpcmVzIHx8ICFhaS0+c2Nhbl90aW1lb3V0KSB7CiAJCQkJCQkJd2FrZV9hdCA9IG1heChhaS0+ZXhwaXJlcywKQEAgLTMxMDEsNyArMzExMSw4IEBACiAJCQkJCQlzY2hlZHVsZV90aW1lb3V0KHdha2VfYXQgLSBqaWZmaWVzKTsKIAkJCQkJCWNvbnRpbnVlOwogCQkJCQl9Ci0JCQkJfSBlbHNlIGlmICgha3RocmVhZF9zaG91bGRfc3RvcCgpKSB7CisJCQkJfSBlbHNlIGlmICgha3RocmVhZF9zaG91bGRfc3RvcCgpICYmCisJCQkJCSAgICFmcmVlemluZyhjdXJyZW50KSkgewogCQkJCQlzY2hlZHVsZSgpOwogCQkJCQljb250aW51ZTsKIAkJCQl9CkBAIC00NDk1LDkxICs0NTA2LDEyOCBAQAogCWFwcml2LT5wcm9jX2VudHJ5ID0gY3JlYXRlX3Byb2NfZW50cnkoYXByaXYtPnByb2NfbmFtZSwKIAkJCQkJICAgICAgU19JRkRJUnxhaXJvX3Blcm0sCiAJCQkJCSAgICAgIGFpcm9fZW50cnkpOwotICAgICAgICBhcHJpdi0+cHJvY19lbnRyeS0+dWlkID0gcHJvY191aWQ7Ci0gICAgICAgIGFwcml2LT5wcm9jX2VudHJ5LT5naWQgPSBwcm9jX2dpZDsKLSAgICAgICAgYXByaXYtPnByb2NfZW50cnktPm93bmVyID0gVEhJU19NT0RVTEU7CisJaWYgKCFhcHJpdi0+cHJvY19lbnRyeSkKKwkJZ290byBmYWlsOworCWFwcml2LT5wcm9jX2VudHJ5LT51aWQgPSBwcm9jX3VpZDsKKwlhcHJpdi0+cHJvY19lbnRyeS0+Z2lkID0gcHJvY19naWQ7CisJYXByaXYtPnByb2NfZW50cnktPm93bmVyID0gVEhJU19NT0RVTEU7CiAKIAkvKiBTZXR1cCB0aGUgU3RhdHNEZWx0YSAqLwogCWVudHJ5ID0gY3JlYXRlX3Byb2NfZW50cnkoIlN0YXRzRGVsdGEiLAogCQkJCSAgU19JRlJFRyB8IChTX0lSVUdPJnByb2NfcGVybSksCiAJCQkJICBhcHJpdi0+cHJvY19lbnRyeSk7Ci0gICAgICAgIGVudHJ5LT51aWQgPSBwcm9jX3VpZDsKLSAgICAgICAgZW50cnktPmdpZCA9IHByb2NfZ2lkOworCWlmICghZW50cnkpCisJCWdvdG8gZmFpbF9zdGF0c19kZWx0YTsKKwllbnRyeS0+dWlkID0gcHJvY191aWQ7CisJZW50cnktPmdpZCA9IHByb2NfZ2lkOwogCWVudHJ5LT5kYXRhID0gZGV2OwotICAgICAgICBlbnRyeS0+b3duZXIgPSBUSElTX01PRFVMRTsKKwllbnRyeS0+b3duZXIgPSBUSElTX01PRFVMRTsKIAlTRVRQUk9DX09QUyhlbnRyeSwgcHJvY19zdGF0c2RlbHRhX29wcyk7CiAKIAkvKiBTZXR1cCB0aGUgU3RhdHMgKi8KIAllbnRyeSA9IGNyZWF0ZV9wcm9jX2VudHJ5KCJTdGF0cyIsCiAJCQkJICBTX0lGUkVHIHwgKFNfSVJVR08mcHJvY19wZXJtKSwKIAkJCQkgIGFwcml2LT5wcm9jX2VudHJ5KTsKLSAgICAgICAgZW50cnktPnVpZCA9IHByb2NfdWlkOwotICAgICAgICBlbnRyeS0+Z2lkID0gcHJvY19naWQ7CisJaWYgKCFlbnRyeSkKKwkJZ290byBmYWlsX3N0YXRzOworCWVudHJ5LT51aWQgPSBwcm9jX3VpZDsKKwllbnRyeS0+Z2lkID0gcHJvY19naWQ7CiAJZW50cnktPmRhdGEgPSBkZXY7Ci0gICAgICAgIGVudHJ5LT5vd25lciA9IFRISVNfTU9EVUxFOworCWVudHJ5LT5vd25lciA9IFRISVNfTU9EVUxFOwogCVNFVFBST0NfT1BTKGVudHJ5LCBwcm9jX3N0YXRzX29wcyk7CiAKIAkvKiBTZXR1cCB0aGUgU3RhdHVzICovCiAJZW50cnkgPSBjcmVhdGVfcHJvY19lbnRyeSgiU3RhdHVzIiwKIAkJCQkgIFNfSUZSRUcgfCAoU19JUlVHTyZwcm9jX3Blcm0pLAogCQkJCSAgYXByaXYtPnByb2NfZW50cnkpOwotICAgICAgICBlbnRyeS0+dWlkID0gcHJvY191aWQ7Ci0gICAgICAgIGVudHJ5LT5naWQgPSBwcm9jX2dpZDsKKwlpZiAoIWVudHJ5KQorCQlnb3RvIGZhaWxfc3RhdHVzOworCWVudHJ5LT51aWQgPSBwcm9jX3VpZDsKKwllbnRyeS0+Z2lkID0gcHJvY19naWQ7CiAJZW50cnktPmRhdGEgPSBkZXY7Ci0gICAgICAgIGVudHJ5LT5vd25lciA9IFRISVNfTU9EVUxFOworCWVudHJ5LT5vd25lciA9IFRISVNfTU9EVUxFOwogCVNFVFBST0NfT1BTKGVudHJ5LCBwcm9jX3N0YXR1c19vcHMpOwogCiAJLyogU2V0dXAgdGhlIENvbmZpZyAqLwogCWVudHJ5ID0gY3JlYXRlX3Byb2NfZW50cnkoIkNvbmZpZyIsCiAJCQkJICBTX0lGUkVHIHwgcHJvY19wZXJtLAogCQkJCSAgYXByaXYtPnByb2NfZW50cnkpOwotICAgICAgICBlbnRyeS0+dWlkID0gcHJvY191aWQ7Ci0gICAgICAgIGVudHJ5LT5naWQgPSBwcm9jX2dpZDsKKwlpZiAoIWVudHJ5KQorCQlnb3RvIGZhaWxfY29uZmlnOworCWVudHJ5LT51aWQgPSBwcm9jX3VpZDsKKwllbnRyeS0+Z2lkID0gcHJvY19naWQ7CiAJZW50cnktPmRhdGEgPSBkZXY7Ci0gICAgICAgIGVudHJ5LT5vd25lciA9IFRISVNfTU9EVUxFOworCWVudHJ5LT5vd25lciA9IFRISVNfTU9EVUxFOwogCVNFVFBST0NfT1BTKGVudHJ5LCBwcm9jX2NvbmZpZ19vcHMpOwogCiAJLyogU2V0dXAgdGhlIFNTSUQgKi8KIAllbnRyeSA9IGNyZWF0ZV9wcm9jX2VudHJ5KCJTU0lEIiwKIAkJCQkgIFNfSUZSRUcgfCBwcm9jX3Blcm0sCiAJCQkJICBhcHJpdi0+cHJvY19lbnRyeSk7Ci0gICAgICAgIGVudHJ5LT51aWQgPSBwcm9jX3VpZDsKLSAgICAgICAgZW50cnktPmdpZCA9IHByb2NfZ2lkOworCWlmICghZW50cnkpCisJCWdvdG8gZmFpbF9zc2lkOworCWVudHJ5LT51aWQgPSBwcm9jX3VpZDsKKwllbnRyeS0+Z2lkID0gcHJvY19naWQ7CiAJZW50cnktPmRhdGEgPSBkZXY7Ci0gICAgICAgIGVudHJ5LT5vd25lciA9IFRISVNfTU9EVUxFOworCWVudHJ5LT5vd25lciA9IFRISVNfTU9EVUxFOwogCVNFVFBST0NfT1BTKGVudHJ5LCBwcm9jX1NTSURfb3BzKTsKIAogCS8qIFNldHVwIHRoZSBBUExpc3QgKi8KIAllbnRyeSA9IGNyZWF0ZV9wcm9jX2VudHJ5KCJBUExpc3QiLAogCQkJCSAgU19JRlJFRyB8IHByb2NfcGVybSwKIAkJCQkgIGFwcml2LT5wcm9jX2VudHJ5KTsKLSAgICAgICAgZW50cnktPnVpZCA9IHByb2NfdWlkOwotICAgICAgICBlbnRyeS0+Z2lkID0gcHJvY19naWQ7CisJaWYgKCFlbnRyeSkKKwkJZ290byBmYWlsX2FwbGlzdDsKKwllbnRyeS0+dWlkID0gcHJvY191aWQ7CisJZW50cnktPmdpZCA9IHByb2NfZ2lkOwogCWVudHJ5LT5kYXRhID0gZGV2OwotICAgICAgICBlbnRyeS0+b3duZXIgPSBUSElTX01PRFVMRTsKKwllbnRyeS0+b3duZXIgPSBUSElTX01PRFVMRTsKIAlTRVRQUk9DX09QUyhlbnRyeSwgcHJvY19BUExpc3Rfb3BzKTsKIAogCS8qIFNldHVwIHRoZSBCU1NMaXN0ICovCiAJZW50cnkgPSBjcmVhdGVfcHJvY19lbnRyeSgiQlNTTGlzdCIsCiAJCQkJICBTX0lGUkVHIHwgcHJvY19wZXJtLAogCQkJCSAgYXByaXYtPnByb2NfZW50cnkpOworCWlmICghZW50cnkpCisJCWdvdG8gZmFpbF9ic3NsaXN0OwogCWVudHJ5LT51aWQgPSBwcm9jX3VpZDsKIAllbnRyeS0+Z2lkID0gcHJvY19naWQ7CiAJZW50cnktPmRhdGEgPSBkZXY7Ci0gICAgICAgIGVudHJ5LT5vd25lciA9IFRISVNfTU9EVUxFOworCWVudHJ5LT5vd25lciA9IFRISVNfTU9EVUxFOwogCVNFVFBST0NfT1BTKGVudHJ5LCBwcm9jX0JTU0xpc3Rfb3BzKTsKIAogCS8qIFNldHVwIHRoZSBXZXBLZXkgKi8KIAllbnRyeSA9IGNyZWF0ZV9wcm9jX2VudHJ5KCJXZXBLZXkiLAogCQkJCSAgU19JRlJFRyB8IHByb2NfcGVybSwKIAkJCQkgIGFwcml2LT5wcm9jX2VudHJ5KTsKLSAgICAgICAgZW50cnktPnVpZCA9IHByb2NfdWlkOwotICAgICAgICBlbnRyeS0+Z2lkID0gcHJvY19naWQ7CisJaWYgKCFlbnRyeSkKKwkJZ290byBmYWlsX3dlcGtleTsKKwllbnRyeS0+dWlkID0gcHJvY191aWQ7CisJZW50cnktPmdpZCA9IHByb2NfZ2lkOwogCWVudHJ5LT5kYXRhID0gZGV2OwotICAgICAgICBlbnRyeS0+b3duZXIgPSBUSElTX01PRFVMRTsKKwllbnRyeS0+b3duZXIgPSBUSElTX01PRFVMRTsKIAlTRVRQUk9DX09QUyhlbnRyeSwgcHJvY193ZXBrZXlfb3BzKTsKIAogCXJldHVybiAwOworCitmYWlsX3dlcGtleToKKwlyZW1vdmVfcHJvY19lbnRyeSgiQlNTTGlzdCIsIGFwcml2LT5wcm9jX2VudHJ5KTsKK2ZhaWxfYnNzbGlzdDoKKwlyZW1vdmVfcHJvY19lbnRyeSgiQVBMaXN0IiwgYXByaXYtPnByb2NfZW50cnkpOworZmFpbF9hcGxpc3Q6CisJcmVtb3ZlX3Byb2NfZW50cnkoIlNTSUQiLCBhcHJpdi0+cHJvY19lbnRyeSk7CitmYWlsX3NzaWQ6CisJcmVtb3ZlX3Byb2NfZW50cnkoIkNvbmZpZyIsIGFwcml2LT5wcm9jX2VudHJ5KTsKK2ZhaWxfY29uZmlnOgorCXJlbW92ZV9wcm9jX2VudHJ5KCJTdGF0dXMiLCBhcHJpdi0+cHJvY19lbnRyeSk7CitmYWlsX3N0YXR1czoKKwlyZW1vdmVfcHJvY19lbnRyeSgiU3RhdHMiLCBhcHJpdi0+cHJvY19lbnRyeSk7CitmYWlsX3N0YXRzOgorCXJlbW92ZV9wcm9jX2VudHJ5KCJTdGF0c0RlbHRhIiwgYXByaXYtPnByb2NfZW50cnkpOworZmFpbF9zdGF0c19kZWx0YToKKwlyZW1vdmVfcHJvY19lbnRyeShhcHJpdi0+cHJvY19uYW1lLCBhaXJvX2VudHJ5KTsKK2ZhaWw6CisJcmV0dXJuIC1FTk9NRU07CiB9CiAKIHN0YXRpYyBpbnQgdGFrZWRvd25fcHJvY19lbnRyeSggc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKQEAgLTU5MjQsNyArNTk3Miw2IEBACiAKIAkvKiBHZXQgdGhlIGN1cnJlbnQgU1NJRCAqLwogCW1lbWNweShleHRyYSwgc3RhdHVzX3JpZC5TU0lELCBzdGF0dXNfcmlkLlNTSURsZW4pOwotCWV4dHJhW3N0YXR1c19yaWQuU1NJRGxlbl0gPSAnXDAnOwogCS8qIElmIG5vbmUsIHdlIG1heSB3YW50IHRvIGdldCB0aGUgb25lIHRoYXQgd2FzIHNldCAqLwogCiAJLyogUHVzaCBpdCBvdXQgISAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRtZWwuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0bWVsLmMKaW5kZXggMzFlZWQ4NS4uMGMwN2I4YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRtZWwuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdG1lbC5jCkBAIC0xNjc4LDExICsxNjc4LDkgQEAKIAkvKiBHZXQgdGhlIGN1cnJlbnQgU1NJRCAqLwogCWlmIChwcml2LT5uZXdfU1NJRF9zaXplICE9IDApIHsKIAkJbWVtY3B5KGV4dHJhLCBwcml2LT5uZXdfU1NJRCwgcHJpdi0+bmV3X1NTSURfc2l6ZSk7Ci0JCWV4dHJhW3ByaXYtPm5ld19TU0lEX3NpemVdID0gJ1wwJzsKIAkJZHdycS0+bGVuZ3RoID0gcHJpdi0+bmV3X1NTSURfc2l6ZTsKIAl9IGVsc2UgewogCQltZW1jcHkoZXh0cmEsIHByaXYtPlNTSUQsIHByaXYtPlNTSURfc2l6ZSk7Ci0JCWV4dHJhW3ByaXYtPlNTSURfc2l6ZV0gPSAnXDAnOwogCQlkd3JxLT5sZW5ndGggPSBwcml2LT5TU0lEX3NpemU7CiAJfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9iY200M3h4L2JjbTQzeHhfZG1hLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9iY200M3h4L2JjbTQzeHhfZG1hLmMKaW5kZXggNzZlM2FlZC4uOTc4ZWQwOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYmNtNDN4eC9iY200M3h4X2RtYS5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2JjbTQzeHgvYmNtNDN4eF9kbWEuYwpAQCAtNzA1LDExICs3MDUsMzAgQEAKIAlzdHJ1Y3QgYmNtNDN4eF9kbWFyaW5nICpyaW5nOwogCWludCBlcnIgPSAtRU5PTUVNOwogCWludCBkbWE2NCA9IDA7Ci0JdTMyIHNidG1zdGF0ZWhpOworCXU2NCBtYXNrID0gYmNtNDN4eF9nZXRfc3VwcG9ydGVkX2RtYV9tYXNrKGJjbSk7CisJaW50IG5vYml0czsKIAotCXNidG1zdGF0ZWhpID0gYmNtNDN4eF9yZWFkMzIoYmNtLCBCQ000M3h4X0NJUl9TQlRNU1RBVEVISUdIKTsKLQlpZiAoc2J0bXN0YXRlaGkgJiBCQ000M3h4X1NCVE1TVEFURUhJR0hfRE1BNjRCSVQpCisJaWYgKG1hc2sgPT0gRE1BXzY0QklUX01BU0spIHsKIAkJZG1hNjQgPSAxOworCQlub2JpdHMgPSA2NDsKKwl9IGVsc2UgaWYgKG1hc2sgPT0gRE1BXzMyQklUX01BU0spCisJCW5vYml0cyA9IDMyOworCWVsc2UKKwkJbm9iaXRzID0gMzA7CisJZXJyID0gcGNpX3NldF9kbWFfbWFzayhiY20tPnBjaV9kZXYsIG1hc2spOworCWVyciB8PSBwY2lfc2V0X2NvbnNpc3RlbnRfZG1hX21hc2soYmNtLT5wY2lfZGV2LCBtYXNrKTsKKwlpZiAoZXJyKSB7CisjaWZkZWYgQ09ORklHX0JDTTQzWFhfUElPCisJCXByaW50ayhLRVJOX1dBUk5JTkcgUEZYICJETUEgbm90IHN1cHBvcnRlZCBvbiB0aGlzIGRldmljZS4iCisJCQkJCSIgRmFsbGluZyBiYWNrIHRvIFBJTy5cbiIpOworCQliY20tPl9fdXNpbmdfcGlvID0gMTsKKwkJcmV0dXJuIC1FTk9TWVM7CisjZWxzZQorCQlwcmludGsoS0VSTl9FUlIgUEZYICJGQVRBTDogRE1BIG5vdCBzdXBwb3J0ZWQgYW5kIFBJTyBub3QgY29uZmlndXJlZC4gIgorCQkJCSAgICAiUGxlYXNlIHJlY29tcGlsZSB0aGUgZHJpdmVyIHdpdGggUElPIHN1cHBvcnQuXG4iKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisjZW5kaWYgLyogQ09ORklHX0JDTTQzWFhfUElPICovCisJfQogCiAJLyogc2V0dXAgVFggRE1BIGNoYW5uZWxzLiAqLwogCXJpbmcgPSBiY200M3h4X3NldHVwX2RtYXJpbmcoYmNtLCAwLCAxLCBkbWE2NCk7CkBAIC03NTUsOCArNzc0LDcgQEAKIAkJZG1hLT5yeF9yaW5nMyA9IHJpbmc7CiAJfQogCi0JZHByaW50ayhLRVJOX0lORk8gUEZYICIlcyBETUEgaW5pdGlhbGl6ZWRcbiIsCi0JCQlkbWE2NCA/ICI2NC1iaXQiIDogIjMyLWJpdCIpOworCWRwcmludGsoS0VSTl9JTkZPIFBGWCAiJWQtYml0IERNQSBpbml0aWFsaXplZFxuIiwgbm9iaXRzKTsKIAllcnIgPSAwOwogb3V0OgogCXJldHVybiBlcnI7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9iY200M3h4L2JjbTQzeHhfZG1hLmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9iY200M3h4L2JjbTQzeHhfZG1hLmgKaW5kZXggZTA0YmNhZC4uZDExMDVlNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYmNtNDN4eC9iY200M3h4X2RtYS5oCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2JjbTQzeHgvYmNtNDN4eF9kbWEuaApAQCAtNCw2ICs0LDcgQEAKICNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CiAjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KICNpbmNsdWRlIDxsaW51eC93b3JrcXVldWUuaD4KKyNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgogI2luY2x1ZGUgPGxpbnV4L2xpbmthZ2UuaD4KICNpbmNsdWRlIDxhc20vYXRvbWljLmg+CiAKQEAgLTMxNCw2ICszMTUsMjMgQEAKIAkJICAgc3RydWN0IGllZWU4MDIxMV90eGIgKnR4Yik7CiB2b2lkIGJjbTQzeHhfZG1hX3J4KHN0cnVjdCBiY200M3h4X2RtYXJpbmcgKnJpbmcpOwogCisvKiBIZWxwZXIgZnVuY3Rpb24gdGhhdCByZXR1cm5zIHRoZSBkbWEgbWFzayBmb3IgdGhpcyBkZXZpY2UuICovCitzdGF0aWMgaW5saW5lCit1NjQgYmNtNDN4eF9nZXRfc3VwcG9ydGVkX2RtYV9tYXNrKHN0cnVjdCBiY200M3h4X3ByaXZhdGUgKmJjbSkKK3sKKwlpbnQgZG1hNjQgPSBiY200M3h4X3JlYWQzMihiY20sIEJDTTQzeHhfQ0lSX1NCVE1TVEFURUhJR0gpICYKKwkJCQkgICBCQ000M3h4X1NCVE1TVEFURUhJR0hfRE1BNjRCSVQ7CisJdTE2IG1taW9fYmFzZSA9IGJjbTQzeHhfZG1hY29udHJvbGxlcl9iYXNlKGRtYTY0LCAwKTsKKwl1MzIgbWFzayA9IEJDTTQzeHhfRE1BMzJfVFhBRERSRVhUX01BU0s7CisKKwlpZiAoZG1hNjQpCisJCXJldHVybiBETUFfNjRCSVRfTUFTSzsKKwliY200M3h4X3dyaXRlMzIoYmNtLCBtbWlvX2Jhc2UgKyBCQ000M3h4X0RNQTMyX1RYQ1RMLCBtYXNrKTsKKwlpZiAoYmNtNDN4eF9yZWFkMzIoYmNtLCBtbWlvX2Jhc2UgKyBCQ000M3h4X0RNQTMyX1RYQ1RMKSAmIG1hc2spCisJCXJldHVybiBETUFfMzJCSVRfTUFTSzsKKwlyZXR1cm4gRE1BXzMwQklUX01BU0s7Cit9CisKICNlbHNlIC8qIENPTkZJR19CQ000M1hYX0RNQSAqLwogCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2JjbTQzeHgvYmNtNDN4eF9sZWRzLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9iY200M3h4L2JjbTQzeHhfbGVkcy5jCmluZGV4IGMzZjkwYzguLjdkMzgzYTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2JjbTQzeHgvYmNtNDN4eF9sZWRzLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYmNtNDN4eC9iY200M3h4X2xlZHMuYwpAQCAtMTg5LDIwICsxODksMjQgQEAKIAkJY2FzZSBCQ000M3h4X0xFRF9JTkFDVElWRToKIAkJCWNvbnRpbnVlOwogCQljYXNlIEJDTTQzeHhfTEVEX09GRjoKKwkJY2FzZSBCQ000M3h4X0xFRF9CQ000MzAzXzM6CiAJCQlicmVhazsKIAkJY2FzZSBCQ000M3h4X0xFRF9PTjoKIAkJCXR1cm5fb24gPSAxOwogCQkJYnJlYWs7CiAJCWNhc2UgQkNNNDN4eF9MRURfQUNUSVZJVFk6CisJCWNhc2UgQkNNNDN4eF9MRURfQkNNNDMwM18wOgogCQkJdHVybl9vbiA9IGFjdGl2aXR5OwogCQkJYnJlYWs7CiAJCWNhc2UgQkNNNDN4eF9MRURfUkFESU9fQUxMOgogCQkJdHVybl9vbiA9IHJhZGlvLT5lbmFibGVkOwogCQkJYnJlYWs7CiAJCWNhc2UgQkNNNDN4eF9MRURfUkFESU9fQToKKwkJY2FzZSBCQ000M3h4X0xFRF9CQ000MzAzXzI6CiAJCQl0dXJuX29uID0gKHJhZGlvLT5lbmFibGVkICYmIHBoeS0+dHlwZSA9PSBCQ000M3h4X1BIWVRZUEVfQSk7CiAJCQlicmVhazsKIAkJY2FzZSBCQ000M3h4X0xFRF9SQURJT19COgorCQljYXNlIEJDTTQzeHhfTEVEX0JDTTQzMDNfMToKIAkJCXR1cm5fb24gPSAocmFkaW8tPmVuYWJsZWQgJiYKIAkJCQkgICAocGh5LT50eXBlID09IEJDTTQzeHhfUEhZVFlQRV9CIHx8CiAJCQkJICAgIHBoeS0+dHlwZSA9PSBCQ000M3h4X1BIWVRZUEVfRykpOwpAQCAtMjQyLDcgKzI0Niw3IEBACiAJCQkvL1RPRE8KIAkJCWJyZWFrOwogCQljYXNlIEJDTTQzeHhfTEVEX0FTU09DOgotCQkJaWYgKGJjbS0+c29mdG1hYy0+YXNzb2NpYXRlZCkKKwkJCWlmIChiY20tPnNvZnRtYWMtPmFzc29jaW5mby5hc3NvY2lhdGVkKQogCQkJCXR1cm5fb24gPSAxOwogCQkJYnJlYWs7CiAjaWZkZWYgQ09ORklHX0JDTTQzWFhfREVCVUcKQEAgLTI1Nyw3ICsyNjEsOCBAQAogCQkJY29udGludWU7CiAjZW5kaWYgLyogQ09ORklHX0JDTTQzWFhfREVCVUcgKi8KIAkJZGVmYXVsdDoKLQkJCWFzc2VydCgwKTsKKwkJCWRwcmludGtsKEtFUk5fSU5GTyBQRlggIkJhZCB2YWx1ZSBpbiBsZWRzX3VwZGF0ZSwiCisJCQkJIiBsZWQtPmJlaGF2aW91cjogMHgleFxuIiwgbGVkLT5iZWhhdmlvdXIpOwogCQl9OwogCiAJCWlmIChsZWQtPmFjdGl2ZWxvdykKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2JjbTQzeHgvYmNtNDN4eF9sZWRzLmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9iY200M3h4L2JjbTQzeHhfbGVkcy5oCmluZGV4IGQzNzE2Y2YuLjgxMWUxNGEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2JjbTQzeHgvYmNtNDN4eF9sZWRzLmgKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYmNtNDN4eC9iY200M3h4X2xlZHMuaApAQCAtNDYsNiArNDYsMTIgQEAKIAlCQ000M3h4X0xFRF9URVNUX0JMSU5LU0xPVywKIAlCQ000M3h4X0xFRF9URVNUX0JMSU5LTUVESVVNLAogCUJDTTQzeHhfTEVEX1RFU1RfQkxJTktGQVNULAorCisJLyogTWlzYyB2YWx1ZXMgZm9yIEJDTTQzMDMgKi8KKwlCQ000M3h4X0xFRF9CQ000MzAzXzAgPSAweDJCLAorCUJDTTQzeHhfTEVEX0JDTTQzMDNfMSA9IDB4NzgsCisJQkNNNDN4eF9MRURfQkNNNDMwM18yID0gMHgyRSwKKwlCQ000M3h4X0xFRF9CQ000MzAzXzMgPSAweDE5LAogfTsKIAogaW50IGJjbTQzeHhfbGVkc19pbml0KHN0cnVjdCBiY200M3h4X3ByaXZhdGUgKmJjbSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9iY200M3h4L2JjbTQzeHhfbWFpbi5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYmNtNDN4eC9iY200M3h4X21haW4uYwppbmRleCBiYWQzNDUyLi5hMWI3ODM4IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9iY200M3h4L2JjbTQzeHhfbWFpbi5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2JjbTQzeHgvYmNtNDN4eF9tYWluLmMKQEAgLTc0Niw3ICs3NDYsNyBAQAogCWlmIChlcnIpCiAJCWdvdG8gZXJyX2N0bHJlZzsKIAlzcHJvbWN0bCB8PSAweDEwOyAvKiBTUFJPTSBXUklURSBlbmFibGUuICovCi0JYmNtNDN4eF9wY2lfd3JpdGVfY29uZmlnMzIoYmNtLCBCQ000M3h4X1BDSUNGR19TUFJPTUNUTCwgc3Byb21jdGwpOworCWVyciA9IGJjbTQzeHhfcGNpX3dyaXRlX2NvbmZpZzMyKGJjbSwgQkNNNDN4eF9QQ0lDRkdfU1BST01DVEwsIHNwcm9tY3RsKTsKIAlpZiAoZXJyKQogCQlnb3RvIGVycl9jdGxyZWc7CiAJLyogV2UgbXVzdCBidXJuIGxvdHMgb2YgQ1BVIGN5Y2xlcyBoZXJlLCBidXQgdGhhdCBkb2VzIG5vdApAQCAtNzY4LDcgKzc2OCw3IEBACiAJCW1kZWxheSgyMCk7CiAJfQogCXNwcm9tY3RsICY9IH4weDEwOyAvKiBTUFJPTSBXUklURSBlbmFibGUuICovCi0JYmNtNDN4eF9wY2lfd3JpdGVfY29uZmlnMzIoYmNtLCBCQ000M3h4X1BDSUNGR19TUFJPTUNUTCwgc3Byb21jdGwpOworCWVyciA9IGJjbTQzeHhfcGNpX3dyaXRlX2NvbmZpZzMyKGJjbSwgQkNNNDN4eF9QQ0lDRkdfU1BST01DVEwsIHNwcm9tY3RsKTsKIAlpZiAoZXJyKQogCQlnb3RvIGVycl9jdGxyZWc7CiAJbWRlbGF5KDUwMCk7CkBAIC0xNDYzLDYgKzE0NjMsMjMgQEAKIAl9CiB9CiAKK3N0YXRpYyB2b2lkIGRyYWluX3R4c3RhdHVzX3F1ZXVlKHN0cnVjdCBiY200M3h4X3ByaXZhdGUgKmJjbSkKK3sKKwl1MzIgZHVtbXk7CisKKwlpZiAoYmNtLT5jdXJyZW50X2NvcmUtPnJldiA8IDUpCisJCXJldHVybjsKKwkvKiBSZWFkIGFsbCBlbnRyaWVzIGZyb20gdGhlIG1pY3JvY29kZSBUWHN0YXR1cyBGSUZPCisJICogYW5kIHRocm93IHRoZW0gYXdheS4KKwkgKi8KKwl3aGlsZSAoMSkgeworCQlkdW1teSA9IGJjbTQzeHhfcmVhZDMyKGJjbSwgQkNNNDN4eF9NTUlPX1hNSVRTVEFUXzApOworCQlpZiAoIWR1bW15KQorCQkJYnJlYWs7CisJCWR1bW15ID0gYmNtNDN4eF9yZWFkMzIoYmNtLCBCQ000M3h4X01NSU9fWE1JVFNUQVRfMSk7CisJfQorfQorCiBzdGF0aWMgdm9pZCBiY200M3h4X2dlbmVyYXRlX25vaXNlX3NhbXBsZShzdHJ1Y3QgYmNtNDN4eF9wcml2YXRlICpiY20pCiB7CiAJYmNtNDN4eF9zaG1fd3JpdGUxNihiY20sIEJDTTQzeHhfU0hNX1NIQVJFRCwgMHg0MDgsIDB4N0Y3Rik7CkBAIC0yOTI1LDEwICsyOTQyLDEzIEBACiAJCWJjbTQzeHhfd3JpdGUxNihiY20sIDB4MDQzQywgMHgwMDBDKTsKIAogCWlmIChhY3RpdmVfd2xjb3JlKSB7Ci0JCWlmIChiY200M3h4X3VzaW5nX3BpbyhiY20pKQorCQlpZiAoYmNtNDN4eF91c2luZ19waW8oYmNtKSkgewogCQkJZXJyID0gYmNtNDN4eF9waW9faW5pdChiY20pOwotCQllbHNlCisJCX0gZWxzZSB7CiAJCQllcnIgPSBiY200M3h4X2RtYV9pbml0KGJjbSk7CisJCQlpZiAoZXJyID09IC1FTk9TWVMpCisJCQkJZXJyID0gYmNtNDN4eF9waW9faW5pdChiY20pOworCQl9CiAJCWlmIChlcnIpCiAJCQlnb3RvIGVycl9jaGlwX2NsZWFudXA7CiAJfQpAQCAtMzE2MCwxNyArMzE4MCwzMCBAQAogc3RhdGljIHZvaWQgYmNtNDN4eF9wZXJpb2RpY193b3JrX2hhbmRsZXIodm9pZCAqZCkKIHsKIAlzdHJ1Y3QgYmNtNDN4eF9wcml2YXRlICpiY20gPSBkOworCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRfZGV2ID0gYmNtLT5uZXRfZGV2OwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJdTMyIHNhdmVkaXJxcyA9IDA7CiAJaW50IGJhZG5lc3M7CisJdW5zaWduZWQgbG9uZyBvcmlnX3RyYW5zX3N0YXJ0ID0gMDsKIAorCW11dGV4X2xvY2soJmJjbS0+bXV0ZXgpOwogCWJhZG5lc3MgPSBlc3RpbWF0ZV9wZXJpb2RpY193b3JrX2JhZG5lc3MoYmNtLT5wZXJpb2RpY19zdGF0ZSk7CiAJaWYgKGJhZG5lc3MgPiBCQURORVNTX0xJTUlUKSB7CiAJCS8qIFBlcmlvZGljIHdvcmsgd2lsbCB0YWtlIGEgbG9uZyB0aW1lLCBzbyB3ZSB3YW50IGl0IHRvCiAJCSAqIGJlIHByZWVtdGlibGUuCiAJCSAqLwotCQltdXRleF9sb2NrKCZiY20tPm11dGV4KTsKLQkJbmV0aWZfdHhfZGlzYWJsZShiY20tPm5ldF9kZXYpOworCisJCW5ldGlmX3R4X2xvY2tfYmgobmV0X2Rldik7CisJCS8qIFdlIG11c3QgZmFrZSBhIHN0YXJ0ZWQgdHJhbnNtaXNzaW9uIGhlcmUsIGFzIHdlIGFyZSBnb2luZyB0bworCQkgKiBkaXNhYmxlIFRYLiBJZiB3ZSB3b3VsZG4ndCBmYWtlIGEgVFgsIGl0IHdvdWxkIGJlIHBvc3NpYmxlIHRvCisJCSAqIHRyaWdnZXIgdGhlIG5ldGRldiB3YXRjaGRvZywgaWYgdGhlIGxhc3QgcmVhbCBUWCBpcyBhbHJlYWR5CisJCSAqIHNvbWUgdGltZSBvbiB0aGUgcGFzdCAoc2xpZ2h0bHkgbGVzcyB0aGFuIDVzZWNzKQorCQkgKi8KKwkJb3JpZ190cmFuc19zdGFydCA9IG5ldF9kZXYtPnRyYW5zX3N0YXJ0OworCQluZXRfZGV2LT50cmFuc19zdGFydCA9IGppZmZpZXM7CisJCW5ldGlmX3N0b3BfcXVldWUobmV0X2Rldik7CisJCW5ldGlmX3R4X3VubG9ja19iaChuZXRfZGV2KTsKKwogCQlzcGluX2xvY2tfaXJxc2F2ZSgmYmNtLT5pcnFfbG9jaywgZmxhZ3MpOwogCQliY200M3h4X21hY19zdXNwZW5kKGJjbSk7CiAJCWlmIChiY200M3h4X3VzaW5nX3BpbyhiY20pKQpAQCAtMzE4Miw3ICszMjE1LDYgQEAKIAkJLyogUGVyaW9kaWMgd29yayBzaG91bGQgdGFrZSBzaG9ydCB0aW1lLCBzbyB3ZSB3YW50IGxvdwogCQkgKiBsb2NraW5nIG92ZXJoZWFkLgogCQkgKi8KLQkJbXV0ZXhfbG9jaygmYmNtLT5tdXRleCk7CiAJCXNwaW5fbG9ja19pcnFzYXZlKCZiY20tPmlycV9sb2NrLCBmbGFncyk7CiAJfQogCkBAIC0zMTk2LDYgKzMyMjgsNyBAQAogCQkJYmNtNDN4eF9waW9fdGhhd190eHF1ZXVlcyhiY20pOwogCQliY200M3h4X21hY19lbmFibGUoYmNtKTsKIAkJbmV0aWZfd2FrZV9xdWV1ZShiY20tPm5ldF9kZXYpOworCQluZXRfZGV2LT50cmFuc19zdGFydCA9IG9yaWdfdHJhbnNfc3RhcnQ7CiAJfQogCW1taW93YigpOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJjbS0+aXJxX2xvY2ssIGZsYWdzKTsKQEAgLTM1MTYsNiArMzU0OSw3IEBACiAJYmNtNDN4eF9tYWNmaWx0ZXJfY2xlYXIoYmNtLCBCQ000M3h4X01BQ0ZJTFRFUl9BU1NPQyk7CiAJYmNtNDN4eF9tYWNmaWx0ZXJfc2V0KGJjbSwgQkNNNDN4eF9NQUNGSUxURVJfU0VMRiwgKHU4ICopKGJjbS0+bmV0X2Rldi0+ZGV2X2FkZHIpKTsKIAliY200M3h4X3NlY3VyaXR5X2luaXQoYmNtKTsKKwlkcmFpbl90eHN0YXR1c19xdWV1ZShiY20pOwogCWllZWU4MDIxMXNvZnRtYWNfc3RhcnQoYmNtLT5uZXRfZGV2KTsKIAogCS8qIExldCdzIGdvISBCZSBjYXJlZnVsIGFmdGVyIGVuYWJsaW5nIHRoZSBJUlFzLgpAQCAtMzk5Myw4ICs0MDI3LDYgQEAKIAkJCQlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0X2RldiwKIAkJCQlzdHJ1Y3QgcGNpX2RldiAqcGNpX2RldikKIHsKLQlpbnQgZXJyOwotCiAJYmNtNDN4eF9zZXRfc3RhdHVzKGJjbSwgQkNNNDN4eF9TVEFUX1VOSU5JVCk7CiAJYmNtLT5pZWVlID0gbmV0ZGV2X3ByaXYobmV0X2Rldik7CiAJYmNtLT5zb2Z0bWFjID0gaWVlZTgwMjExX3ByaXYobmV0X2Rldik7CkBAIC00MDEyLDIyICs0MDQ0LDggQEAKIAkJICAgICAodm9pZCAoKikodW5zaWduZWQgbG9uZykpYmNtNDN4eF9pbnRlcnJ1cHRfdGFza2xldCwKIAkJICAgICAodW5zaWduZWQgbG9uZyliY20pOwogCXRhc2tsZXRfZGlzYWJsZV9ub3N5bmMoJmJjbS0+aXNyX3Rhc2tsZXQpOwotCWlmIChtb2RwYXJhbV9waW8pIHsKKwlpZiAobW9kcGFyYW1fcGlvKQogCQliY20tPl9fdXNpbmdfcGlvID0gMTsKLQl9IGVsc2UgewotCQllcnIgPSBwY2lfc2V0X2RtYV9tYXNrKHBjaV9kZXYsIERNQV8zMEJJVF9NQVNLKTsKLQkJZXJyIHw9IHBjaV9zZXRfY29uc2lzdGVudF9kbWFfbWFzayhwY2lfZGV2LCBETUFfMzBCSVRfTUFTSyk7Ci0JCWlmIChlcnIpIHsKLSNpZmRlZiBDT05GSUdfQkNNNDNYWF9QSU8KLQkJCXByaW50ayhLRVJOX1dBUk5JTkcgUEZYICJETUEgbm90IHN1cHBvcnRlZC4gRmFsbGluZyBiYWNrIHRvIFBJTy5cbiIpOwotCQkJYmNtLT5fX3VzaW5nX3BpbyA9IDE7Ci0jZWxzZQotCQkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiRkFUQUw6IERNQSBub3Qgc3VwcG9ydGVkIGFuZCBQSU8gbm90IGNvbmZpZ3VyZWQuICIKLQkJCQkJICAgICJSZWNvbXBpbGUgdGhlIGRyaXZlciB3aXRoIFBJTyBzdXBwb3J0LCBwbGVhc2UuXG4iKTsKLQkJCXJldHVybiAtRU5PREVWOwotI2VuZGlmIC8qIENPTkZJR19CQ000M1hYX1BJTyAqLwotCQl9Ci0JfQogCWJjbS0+cnRzX3RocmVzaG9sZCA9IEJDTTQzeHhfREVGQVVMVF9SVFNfVEhSRVNIT0xEOwogCiAJLyogZGVmYXVsdCB0byBzdyBlbmNyeXB0aW9uIGZvciBub3cgKi8KQEAgLTQyMDgsNyArNDIyNiwxMSBAQAogCWRwcmludGsoS0VSTl9JTkZPIFBGWCAiUmVzdW1pbmcuLi5cbiIpOwogCiAJcGNpX3NldF9wb3dlcl9zdGF0ZShwZGV2LCAwKTsKLQlwY2lfZW5hYmxlX2RldmljZShwZGV2KTsKKwllcnIgPSBwY2lfZW5hYmxlX2RldmljZShwZGV2KTsKKwlpZiAoZXJyKSB7CisJCXByaW50ayhLRVJOX0VSUiBQRlggIkZhaWx1cmUgd2l0aCBwY2lfZW5hYmxlX2RldmljZSFcbiIpOworCQlyZXR1cm4gZXJyOworCX0KIAlwY2lfcmVzdG9yZV9zdGF0ZShwZGV2KTsKIAogCWJjbTQzeHhfY2hpcHNldF9hdHRhY2goYmNtKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2JjbTQzeHgvYmNtNDN4eF93eC5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYmNtNDN4eC9iY200M3h4X3d4LmMKaW5kZXggOWI3YjE1Yy4uZDI3MDE2ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYmNtNDN4eC9iY200M3h4X3d4LmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYmNtNDN4eC9iY200M3h4X3d4LmMKQEAgLTg0Nyw3ICs4NDcsNyBAQAogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKIAl3c3RhdHMgPSAmYmNtLT5zdGF0cy53c3RhdHM7Ci0JaWYgKCFtYWMtPmFzc29jaWF0ZWQpIHsKKwlpZiAoIW1hYy0+YXNzb2NpbmZvLmFzc29jaWF0ZWQpIHsKIAkJd3N0YXRzLT5taXNzLmJlYWNvbiA9IDA7CiAvLwkJYmNtLT5pZWVlLT5pZWVlX3N0YXRzLnR4X3JldHJ5X2xpbWl0X2V4Y2VlZGVkID0gMDsgLy8gRklYTUU6IHNob3VsZCB0aGlzIGJlIGNsZWFyZWQgaGVyZT8KIAkJd3N0YXRzLT5kaXNjYXJkLnJldHJpZXMgPSAwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaG9zdGFwL2hvc3RhcF9jcy5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaG9zdGFwL2hvc3RhcF9jcy5jCmluZGV4IDY4NmQ4OTUuLmY2MzkwOWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2hvc3RhcC9ob3N0YXBfY3MuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9ob3N0YXAvaG9zdGFwX2NzLmMKQEAgLTg4Nyw2ICs4ODcsMTMgQEAKIAlQQ01DSUFfREVWSUNFX1BST0RfSUQxMjMoCiAJCSJVLlMuIFJvYm90aWNzIiwgIklFRUUgODAyLjExYiBQQy1DQVJEIiwgIlZlcnNpb24gMDEuMDIiLAogCQkweGM3YjhkZjlkLCAweDE3MDBkMDg3LCAweDRiNzRiYWEwKSwKKwlQQ01DSUFfREVWSUNFX1BST0RfSUQxMjMoCisJCSJBbGxpZWQgVGVsZXN5biIsICJBVC1XQ0w0NTIgV2lyZWxlc3MgUENNQ0lBIFJhZGlvIiwKKwkJIlZlci4gMS4wMCIsCisJCTB4NWNkMDE3MDUsIDB4NDI3MTY2MGYsIDB4OWQwOGVlMTIpLAorCVBDTUNJQV9ERVZJQ0VfUFJPRF9JRDEyMygKKwkJImNvcmVnYSIsICJXTCBQQ0NMLTExIiwgIklTTDM3MzAwUCIsCisJCTB4YTIxNTAxYSwgMHg1OTg2ODkyNiwgMHhjOTA0OWEzOSksCiAJUENNQ0lBX0RFVklDRV9OVUxMCiB9OwogTU9EVUxFX0RFVklDRV9UQUJMRShwY21jaWEsIGhvc3RhcF9jc19pZHMpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaG9zdGFwL2hvc3RhcF9wbHguYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2hvc3RhcC9ob3N0YXBfcGx4LmMKaW5kZXggNmRmYTA0MS4uYmM4MWIxMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaG9zdGFwL2hvc3RhcF9wbHguYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9ob3N0YXAvaG9zdGFwX3BseC5jCkBAIC0zNjQsNyArMzY0LDcgQEAKIAogCXBvcyA9IDA7CiAJd2hpbGUgKHBvcyA8IENJU19NQVhfTEVOIC0gMSAmJiBjaXNbcG9zXSAhPSBDSVNUUExfRU5EKSB7Ci0JCWlmIChwb3MgKyBjaXNbcG9zICsgMV0gPj0gQ0lTX01BWF9MRU4pCisJCWlmIChwb3MgKyAyICsgY2lzW3BvcyArIDFdID4gQ0lTX01BWF9MRU4pCiAJCQlnb3RvIGNpc19lcnJvcjsKIAogCQlzd2l0Y2ggKGNpc1twb3NdKSB7CkBAIC0zOTEsNyArMzkxLDcgQEAKIAkJCWJyZWFrOwogCiAJCWNhc2UgQ0lTVFBMX01BTkZJRDoKLQkJCWlmIChjaXNbcG9zICsgMV0gPCA1KQorCQkJaWYgKGNpc1twb3MgKyAxXSA8IDQpCiAJCQkJZ290byBjaXNfZXJyb3I7CiAJCQltYW5maWQxID0gY2lzW3BvcyArIDJdICsgKGNpc1twb3MgKyAzXSA8PCA4KTsKIAkJCW1hbmZpZDIgPSBjaXNbcG9zICsgNF0gKyAoY2lzW3BvcyArIDVdIDw8IDgpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3Mvb3Jpbm9jby5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3Mvb3Jpbm9jby5jCmluZGV4IGI3NzljN2QuLjMzNmNhYmEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL29yaW5vY28uYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9vcmlub2NvLmMKQEAgLTI0NTcsNiArMjQ1Nyw3IEBACiAvKiBXaXJlbGVzcyBleHRlbnNpb25zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKKy8qIFJldHVybiA6IDwgMCAtPiBlcnJvciBjb2RlIDsgPj0gMCAtPiBsZW5ndGggKi8KIHN0YXRpYyBpbnQgb3Jpbm9jb19od19nZXRfZXNzaWQoc3RydWN0IG9yaW5vY29fcHJpdmF0ZSAqcHJpdiwgaW50ICphY3RpdmUsCiAJCQkJY2hhciBidWZbSVdfRVNTSURfTUFYX1NJWkUrMV0pCiB7CkBAIC0yNTAxLDkgKzI1MDIsOSBAQAogCWxlbiA9IGxlMTZfdG9fY3B1KGVzc2lkYnVmLmxlbik7CiAJQlVHX09OKGxlbiA+IElXX0VTU0lEX01BWF9TSVpFKTsKIAotCW1lbXNldChidWYsIDAsIElXX0VTU0lEX01BWF9TSVpFKzEpOworCW1lbXNldChidWYsIDAsIElXX0VTU0lEX01BWF9TSVpFKTsKIAltZW1jcHkoYnVmLCBwLCBsZW4pOwotCWJ1ZltsZW5dID0gJ1wwJzsKKwllcnIgPSBsZW47CiAKICBmYWlsX3VubG9jazoKIAlvcmlub2NvX3VubG9jayhwcml2LCAmZmxhZ3MpOwpAQCAtMzAyNywxNyArMzAyOCwxOCBAQAogCiAJaWYgKG5ldGlmX3J1bm5pbmcoZGV2KSkgewogCQllcnIgPSBvcmlub2NvX2h3X2dldF9lc3NpZChwcml2LCAmYWN0aXZlLCBlc3NpZGJ1Zik7Ci0JCWlmIChlcnIpCisJCWlmIChlcnIgPCAwKQogCQkJcmV0dXJuIGVycjsKKwkJZXJxLT5sZW5ndGggPSBlcnI7CiAJfSBlbHNlIHsKIAkJaWYgKG9yaW5vY29fbG9jayhwcml2LCAmZmxhZ3MpICE9IDApCiAJCQlyZXR1cm4gLUVCVVNZOwotCQltZW1jcHkoZXNzaWRidWYsIHByaXYtPmRlc2lyZWRfZXNzaWQsIElXX0VTU0lEX01BWF9TSVpFICsgMSk7CisJCW1lbWNweShlc3NpZGJ1ZiwgcHJpdi0+ZGVzaXJlZF9lc3NpZCwgSVdfRVNTSURfTUFYX1NJWkUpOworCQllcnEtPmxlbmd0aCA9IHN0cmxlbihwcml2LT5kZXNpcmVkX2Vzc2lkKTsKIAkJb3Jpbm9jb191bmxvY2socHJpdiwgJmZsYWdzKTsKIAl9CiAKIAllcnEtPmZsYWdzID0gMTsKLQllcnEtPmxlbmd0aCA9IHN0cmxlbihlc3NpZGJ1Zik7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTMwNzUsMTAgKzMwNzcsMTAgQEAKIAlpZiAob3Jpbm9jb19sb2NrKHByaXYsICZmbGFncykgIT0gMCkKIAkJcmV0dXJuIC1FQlVTWTsKIAotCW1lbWNweShuaWNrYnVmLCBwcml2LT5uaWNrLCBJV19FU1NJRF9NQVhfU0laRSsxKTsKKwltZW1jcHkobmlja2J1ZiwgcHJpdi0+bmljaywgSVdfRVNTSURfTUFYX1NJWkUpOwogCW9yaW5vY29fdW5sb2NrKHByaXYsICZmbGFncyk7CiAKLQlucnEtPmxlbmd0aCA9IHN0cmxlbihuaWNrYnVmKTsKKwlucnEtPmxlbmd0aCA9IHN0cmxlbihwcml2LT5uaWNrKTsKIAogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcmF5X2NzLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9yYXlfY3MuYwppbmRleCAwYjM4MWQ3Li43ZmJmYzllIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9yYXlfY3MuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9yYXlfY3MuYwpAQCAtMTE5OCw3ICsxMTk4LDYgQEAKIAogCS8qIEdldCB0aGUgZXNzaWQgdGhhdCB3YXMgc2V0ICovCiAJbWVtY3B5KGV4dHJhLCBsb2NhbC0+c3Bhcm0uYjUuYV9jdXJyZW50X2Vzc19pZCwgSVdfRVNTSURfTUFYX1NJWkUpOwotCWV4dHJhW0lXX0VTU0lEX01BWF9TSVpFXSA9ICdcMCc7CiAKIAkvKiBQdXNoIGl0IG91dCAhICovCiAJZHdycS0+bGVuZ3RoID0gc3RybGVuKGV4dHJhKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3pkMTIwMS5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvemQxMjAxLmMKaW5kZXggMzAwNTdhMy4uMzZiMjlmZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvemQxMjAxLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvemQxMjAxLmMKQEAgLTE5MywxMCArMTkzLDggQEAKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwogCXVuc2lnbmVkIGNoYXIgdHlwZTsKIAotCWlmICghemQpIHsKLQkJZnJlZSA9IDE7Ci0JCWdvdG8gZXhpdDsKLQl9CisJaWYgKCF6ZCkKKwkJcmV0dXJuOwogCiAJc3dpdGNoKHVyYi0+c3RhdHVzKSB7CiAJCWNhc2UgLUVJTFNFUToKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3pkMTIxMXJ3L3pkX21hYy5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvemQxMjExcncvemRfbWFjLmMKaW5kZXggMmQxMjgzNy4uYTdkMjliZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvemQxMjExcncvemRfbWFjLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvemQxMjExcncvemRfbWFjLmMKQEAgLTEwOTksNyArMTA5OSw3IEBACiAJaW50IHI7CiAKIAlzcGluX2xvY2tfaXJxKCZtYWMtPmxvY2spOwotCWlzX2Fzc29jaWF0ZWQgPSBzbS0+YXNzb2NpYXRlZCAhPSAwOworCWlzX2Fzc29jaWF0ZWQgPSBzbS0+YXNzb2NpbmZvLmFzc29jaWF0ZWQgIT0gMDsKIAlzcGluX3VubG9ja19pcnEoJm1hYy0+bG9jayk7CiAKIAlyID0gemRfY2hpcF9jb250cm9sX2xlZHMoY2hpcCwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGFycG9ydC9wYXJwb3J0X2lwMzIuYyBiL2RyaXZlcnMvcGFycG9ydC9wYXJwb3J0X2lwMzIuYwppbmRleCBlM2UxOTI3Li5lYzQ0ZWZkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BhcnBvcnQvcGFycG9ydF9pcDMyLmMKKysrIGIvZHJpdmVycy9wYXJwb3J0L3BhcnBvcnRfaXAzMi5jCkBAIC03ODAsNyArNzgwLDcgQEAKIAllbnVtIHBhcnBvcnRfaXAzMl9pcnFfbW9kZSBpcnFfbW9kZSA9IHByaXYtPmlycV9tb2RlOwogCXN3aXRjaCAoaXJxX21vZGUpIHsKIAljYXNlIFBBUlBPUlRfSVAzMl9JUlFfRldEOgotCQlwYXJwb3J0X2dlbmVyaWNfaXJxKGlycSwgcCwgcmVncyk7CisJCXBhcnBvcnRfZ2VuZXJpY19pcnEoaXJxLCBwKTsKIAkJYnJlYWs7CiAJY2FzZSBQQVJQT1JUX0lQMzJfSVJRX0hFUkU6CiAJCXBhcnBvcnRfaXAzMl93YWtldXAocCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9LY29uZmlnIGIvZHJpdmVycy9wY2kvS2NvbmZpZwppbmRleCAzMDI5NDEyLi41ZjFiOWY1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjaS9LY29uZmlnCisrKyBiL2RyaXZlcnMvcGNpL0tjb25maWcKQEAgLTE5LDcgKzE5LDcgQEAKIAogY29uZmlnIFBDSV9NVUxUSVRIUkVBRF9QUk9CRQogCWJvb2wgIlBDSSBNdWx0aS10aHJlYWRlZCBwcm9iZSAoRVhQRVJJTUVOVEFMKSIKLQlkZXBlbmRzIG9uIFBDSSAmJiBFWFBFUklNRU5UQUwKKwlkZXBlbmRzIG9uIFBDSSAmJiBFWFBFUklNRU5UQUwgJiYgQlJPS0VOCiAJaGVscAogCSAgU2F5IFkgaGVyZSBpZiB5b3Ugd2FudCB0aGUgUENJIGNvcmUgdG8gc3Bhd24gYSBuZXcgdGhyZWFkIGZvcgogCSAgZXZlcnkgUENJIGRldmljZSB0aGF0IGlzIHByb2JlZC4gIFRoaXMgY2FuIGNhdXNlIGEgaHVnZQpAQCAtNTUsNyArNTUsNyBAQAogY29uZmlnIEhUX0lSUQogCWJvb2wgIkludGVycnVwdHMgb24gaHlwZXJ0cmFuc3BvcnQgZGV2aWNlcyIKIAlkZWZhdWx0IHkKLQlkZXBlbmRzIG9uIFg4Nl9MT0NBTF9BUElDICYmIFg4Nl9JT19BUElDCisJZGVwZW5kcyBvbiBQQ0kgJiYgWDg2X0xPQ0FMX0FQSUMgJiYgWDg2X0lPX0FQSUMKIAloZWxwCiAJICAgVGhpcyBhbGxvd3MgbmF0aXZlIGh5cGVydHJhbnNwb3J0IGRldmljZXMgdG8gdXNlIGludGVycnVwdHMuCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL2hvdHBsdWcvYWNwaV9wY2locC5jIGIvZHJpdmVycy9wY2kvaG90cGx1Zy9hY3BpX3BjaWhwLmMKaW5kZXggNTFjYjlmOC4uMjcwYTMzYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY2kvaG90cGx1Zy9hY3BpX3BjaWhwLmMKKysrIGIvZHJpdmVycy9wY2kvaG90cGx1Zy9hY3BpX3BjaWhwLmMKQEAgLTI5LDEwICsyOSwxMCBAQAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvcGNpX2hvdHBsdWcuaD4KICNpbmNsdWRlIDxhY3BpL2FjcGkuaD4KICNpbmNsdWRlIDxhY3BpL2FjcGlfYnVzLmg+CiAjaW5jbHVkZSA8YWNwaS9hY3R5cGVzLmg+Ci0jaW5jbHVkZSAicGNpX2hvdHBsdWcuaCIKIAogI2RlZmluZSBNWV9OQU1FCSJhY3BpX3BjaWhwIgogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9ob3RwbHVnL2FjcGlwaHAuaCBiL2RyaXZlcnMvcGNpL2hvdHBsdWcvYWNwaXBocC5oCmluZGV4IDdmZmYwN2UuLjU5YzViMjQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNpL2hvdHBsdWcvYWNwaXBocC5oCisrKyBiL2RyaXZlcnMvcGNpL2hvdHBsdWcvYWNwaXBocC5oCkBAIC0zOCw3ICszOCw3IEBACiAjaW5jbHVkZSA8bGludXgvYWNwaS5oPgogI2luY2x1ZGUgPGxpbnV4L2tvYmplY3QuaD4JLyogZm9yIEtPQkpfTkFNRV9MRU4gKi8KICNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgotI2luY2x1ZGUgInBjaV9ob3RwbHVnLmgiCisjaW5jbHVkZSA8bGludXgvcGNpX2hvdHBsdWcuaD4KIAogI2RlZmluZSBkYmcoZm9ybWF0LCBhcmcuLi4pCQkJCQlcCiAJZG8gewkJCQkJCQlcCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9ob3RwbHVnL2FjcGlwaHBfY29yZS5jIGIvZHJpdmVycy9wY2kvaG90cGx1Zy9hY3BpcGhwX2NvcmUuYwppbmRleCBlMmZlZjYwLi5jNTdkOWQ1YyAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY2kvaG90cGx1Zy9hY3BpcGhwX2NvcmUuYworKysgYi9kcml2ZXJzL3BjaS9ob3RwbHVnL2FjcGlwaHBfY29yZS5jCkBAIC0zNywxMCArMzcsMTAgQEAKIAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaV9ob3RwbHVnLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L3NtcC5oPgogI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+Ci0jaW5jbHVkZSAicGNpX2hvdHBsdWcuaCIKICNpbmNsdWRlICJhY3BpcGhwLmgiCiAKICNkZWZpbmUgTVlfTkFNRQkiYWNwaXBocCIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL2hvdHBsdWcvYWNwaXBocF9nbHVlLmMgYi9kcml2ZXJzL3BjaS9ob3RwbHVnL2FjcGlwaHBfZ2x1ZS5jCmluZGV4IDgzZThlNDQuLjE2MTY3YjAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNpL2hvdHBsdWcvYWNwaXBocF9nbHVlLmMKKysrIGIvZHJpdmVycy9wY2kvaG90cGx1Zy9hY3BpcGhwX2dsdWUuYwpAQCAtNDUsMTEgKzQ1LDExIEBACiAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2lfaG90cGx1Zy5oPgogI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+CiAjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KIAogI2luY2x1ZGUgIi4uL3BjaS5oIgotI2luY2x1ZGUgInBjaV9ob3RwbHVnLmgiCiAjaW5jbHVkZSAiYWNwaXBocC5oIgogCiBzdGF0aWMgTElTVF9IRUFEKGJyaWRnZV9saXN0KTsKQEAgLTE4MDcsOCArMTgwNyw4IEBACiAKIAogLyoKLSAqIGxhdGNoIGNsb3NlZDogIDEKLSAqIGxhdGNoICAgb3BlbjogIDAKKyAqIGxhdGNoICAgb3BlbjogIDEKKyAqIGxhdGNoIGNsb3NlZDogIDAKICAqLwogdTggYWNwaXBocF9nZXRfbGF0Y2hfc3RhdHVzKHN0cnVjdCBhY3BpcGhwX3Nsb3QgKnNsb3QpCiB7CkBAIC0xODE2LDcgKzE4MTYsNyBAQAogCiAJc3RhID0gZ2V0X3Nsb3Rfc3RhdHVzKHNsb3QpOwogCi0JcmV0dXJuIChzdGEgJiBBQ1BJX1NUQV9TSE9XX0lOX1VJKSA/IDEgOiAwOworCXJldHVybiAoc3RhICYgQUNQSV9TVEFfU0hPV19JTl9VSSkgPyAwIDogMTsKIH0KIAogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9ob3RwbHVnL2FjcGlwaHBfaWJtLmMgYi9kcml2ZXJzL3BjaS9ob3RwbHVnL2FjcGlwaHBfaWJtLmMKaW5kZXggZDBhMDdkOS4uYmQ0MGFlZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY2kvaG90cGx1Zy9hY3BpcGhwX2libS5jCisrKyBiL2RyaXZlcnMvcGNpL2hvdHBsdWcvYWNwaXBocF9pYm0uYwpAQCAtMzUsNyArMzUsNiBAQAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+CiAKICNpbmNsdWRlICJhY3BpcGhwLmgiCi0jaW5jbHVkZSAicGNpX2hvdHBsdWcuaCIKIAogI2RlZmluZSBEUklWRVJfVkVSU0lPTgkiMS4wLjEiCiAjZGVmaW5lIERSSVZFUl9BVVRIT1IJIklyZW5lIFp1YmFyZXYgPHp1YmFyZXZAdXMuaWJtLmNvbT4sIFZlcm5vbiBNYXVlcnkgPHZlcm51eEB1cy5pYm0uY29tPiIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL2hvdHBsdWcvY3BjaV9ob3RwbHVnX2NvcmUuYyBiL2RyaXZlcnMvcGNpL2hvdHBsdWcvY3BjaV9ob3RwbHVnX2NvcmUuYwppbmRleCBkMDZhYjQwLi42ODQ1NTE1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjaS9ob3RwbHVnL2NwY2lfaG90cGx1Z19jb3JlLmMKKysrIGIvZHJpdmVycy9wY2kvaG90cGx1Zy9jcGNpX2hvdHBsdWdfY29yZS5jCkBAIC0yOSwxMiArMjksMTIgQEAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvcGNpX2hvdHBsdWcuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAjaW5jbHVkZSA8bGludXgvc21wX2xvY2suaD4KICNpbmNsdWRlIDxhc20vYXRvbWljLmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KLSNpbmNsdWRlICJwY2lfaG90cGx1Zy5oIgogI2luY2x1ZGUgImNwY2lfaG90cGx1Zy5oIgogCiAjZGVmaW5lIERSSVZFUl9BVVRIT1IJIlNjb3R0IE11cnJheSA8c2NvdHRtQHNvbWFuZXR3b3Jrcy5jb20+IgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY2kvaG90cGx1Zy9jcGNpX2hvdHBsdWdfcGNpLmMgYi9kcml2ZXJzL3BjaS9ob3RwbHVnL2NwY2lfaG90cGx1Z19wY2kuYwppbmRleCA0YWZjYWZmLi43YjFiZWFhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjaS9ob3RwbHVnL2NwY2lfaG90cGx1Z19wY2kuYworKysgYi9kcml2ZXJzL3BjaS9ob3RwbHVnL2NwY2lfaG90cGx1Z19wY2kuYwpAQCAtMjYsOSArMjYsOSBAQAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaV9ob3RwbHVnLmg+CiAjaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgogI2luY2x1ZGUgIi4uL3BjaS5oIgotI2luY2x1ZGUgInBjaV9ob3RwbHVnLmgiCiAjaW5jbHVkZSAiY3BjaV9ob3RwbHVnLmgiCiAKICNkZWZpbmUgTVlfTkFNRQkiY3BjaV9ob3RwbHVnIgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY2kvaG90cGx1Zy9jcGNpaHBfZ2VuZXJpYy5jIGIvZHJpdmVycy9wY2kvaG90cGx1Zy9jcGNpaHBfZ2VuZXJpYy5jCmluZGV4IGU4NDdmMGQuLmYzODUyYTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNpL2hvdHBsdWcvY3BjaWhwX2dlbmVyaWMuYworKysgYi9kcml2ZXJzL3BjaS9ob3RwbHVnL2NwY2locF9nZW5lcmljLmMKQEAgLTg0LDcgKzg0LDcgQEAKIAogCWlmKCFicmlkZ2UpIHsKIAkJaW5mbygibm90IGNvbmZpZ3VyZWQsIGRpc2FibGluZy4iKTsKLQkJcmV0dXJuIDE7CisJCXJldHVybiAtRUlOVkFMOwogCX0KIAlzdHIgPSBicmlkZ2U7CiAJaWYoISpzdHIpCkBAIC0xNDcsNyArMTQ3LDcgQEAKIAogCWluZm8oRFJJVkVSX0RFU0MgIiB2ZXJzaW9uOiAiIERSSVZFUl9WRVJTSU9OKTsKIAlzdGF0dXMgPSB2YWxpZGF0ZV9wYXJhbWV0ZXJzKCk7Ci0JaWYoc3RhdHVzICE9IDApCisJaWYgKHN0YXR1cykKIAkJcmV0dXJuIHN0YXR1czsKIAogCXIgPSByZXF1ZXN0X3JlZ2lvbihwb3J0LCAxLCAiI0VOVU0gaG90c3dhcCBzaWduYWwgcmVnaXN0ZXIiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL2hvdHBsdWcvY3BxcGhwLmggYi9kcml2ZXJzL3BjaS9ob3RwbHVnL2NwcXBocC5oCmluZGV4IGVhMDQwYzMuLjI5OGFkN2YgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNpL2hvdHBsdWcvY3BxcGhwLmgKKysrIGIvZHJpdmVycy9wY2kvaG90cGx1Zy9jcHFwaHAuaApAQCAtMjgsNyArMjgsNiBAQAogI2lmbmRlZiBfQ1BRUEhQX0gKICNkZWZpbmUgX0NQUVBIUF9ICiAKLSNpbmNsdWRlICJwY2lfaG90cGx1Zy5oIgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgPGFzbS9pby5oPgkJLyogZm9yIHJlYWQ/IGFuZCB3cml0ZT8gZnVuY3Rpb25zICovCiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4JLyogZm9yIGRlbGF5cyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY2kvaG90cGx1Zy9jcHFwaHBfY29yZS5jIGIvZHJpdmVycy9wY2kvaG90cGx1Zy9jcHFwaHBfY29yZS5jCmluZGV4IDFmYzI1OTkuLjU2MTdjZmQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNpL2hvdHBsdWcvY3BxcGhwX2NvcmUuYworKysgYi9kcml2ZXJzL3BjaS9ob3RwbHVnL2NwcXBocF9jb3JlLmMKQEAgLTM3LDYgKzM3LDcgQEAKICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvd29ya3F1ZXVlLmg+CiAjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvcGNpX2hvdHBsdWcuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL2hvdHBsdWcvY3BxcGhwX2N0cmwuYyBiL2RyaXZlcnMvcGNpL2hvdHBsdWcvY3BxcGhwX2N0cmwuYwppbmRleCAzZWMyYWQ3Li43OWZmNmI0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjaS9ob3RwbHVnL2NwcXBocF9jdHJsLmMKKysrIGIvZHJpdmVycy9wY2kvaG90cGx1Zy9jcHFwaHBfY3RybC5jCkBAIC0zNiw2ICszNiw3IEBACiAjaW5jbHVkZSA8bGludXgvd2FpdC5oPgogI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+CiAjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvcGNpX2hvdHBsdWcuaD4KICNpbmNsdWRlICJjcHFwaHAuaCIKIAogc3RhdGljIHUzMiBjb25maWd1cmVfbmV3X2RldmljZShzdHJ1Y3QgY29udHJvbGxlciogY3RybCwgc3RydWN0IHBjaV9mdW5jICpmdW5jLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY2kvaG90cGx1Zy9jcHFwaHBfbnZyYW0uYyBiL2RyaXZlcnMvcGNpL2hvdHBsdWcvY3BxcGhwX252cmFtLmMKaW5kZXggY2YwODc4OS4uMjk4YTZjZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY2kvaG90cGx1Zy9jcHFwaHBfbnZyYW0uYworKysgYi9kcml2ZXJzL3BjaS9ob3RwbHVnL2NwcXBocF9udnJhbS5jCkBAIC0zMyw2ICszMyw3IEBACiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaV9ob3RwbHVnLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CiAjaW5jbHVkZSAiY3BxcGhwLmgiCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9ob3RwbHVnL2NwcXBocF9wY2kuYyBiL2RyaXZlcnMvcGNpL2hvdHBsdWcvY3BxcGhwX3BjaS5jCmluZGV4IDBkOTY4ODkuLmZjN2M3NGQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNpL2hvdHBsdWcvY3BxcGhwX3BjaS5jCisrKyBiL2RyaXZlcnMvcGNpL2hvdHBsdWcvY3BxcGhwX3BjaS5jCkBAIC0zMyw2ICszMyw3IEBACiAjaW5jbHVkZSA8bGludXgvd29ya3F1ZXVlLmg+CiAjaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaV9ob3RwbHVnLmg+CiAjaW5jbHVkZSAiLi4vcGNpLmgiCiAjaW5jbHVkZSAiY3BxcGhwLmgiCiAjaW5jbHVkZSAiY3BxcGhwX252cmFtLmgiCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9ob3RwbHVnL2NwcXBocF9zeXNmcy5jIGIvZHJpdmVycy9wY2kvaG90cGx1Zy9jcHFwaHBfc3lzZnMuYwppbmRleCA1YmFiNjY2Li42MzRmNzRkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjaS9ob3RwbHVnL2NwcXBocF9zeXNmcy5jCisrKyBiL2RyaXZlcnMvcGNpL2hvdHBsdWcvY3BxcGhwX3N5c2ZzLmMKQEAgLTMyLDYgKzMyLDcgQEAKICNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CiAjaW5jbHVkZSA8bGludXgvd29ya3F1ZXVlLmg+CiAjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvcGNpX2hvdHBsdWcuaD4KICNpbmNsdWRlIDxsaW51eC9kZWJ1Z2ZzLmg+CiAjaW5jbHVkZSAiY3BxcGhwLmgiCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL2hvdHBsdWcvZmFrZXBocC5jIGIvZHJpdmVycy9wY2kvaG90cGx1Zy9mYWtlcGhwLmMKaW5kZXggMDVhNGYwZi4uZTI3OTA3YyAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY2kvaG90cGx1Zy9mYWtlcGhwLmMKKysrIGIvZHJpdmVycy9wY2kvaG90cGx1Zy9mYWtlcGhwLmMKQEAgLTM1LDEwICszNSwxMCBAQAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaV9ob3RwbHVnLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KLSNpbmNsdWRlICJwY2lfaG90cGx1Zy5oIgogI2luY2x1ZGUgIi4uL3BjaS5oIgogCiAjaWYgIWRlZmluZWQoTU9EVUxFKQpAQCAtMTgxLDcgKzE4MSw5IEBACiAKIAlpZiAoIXBjaV9yZWFkX2NvbmZpZ19ieXRlKHRlbXAsIFBDSV9IRUFERVJfVFlQRSwgJmhkcl90eXBlKSkgewogCQl0ZW1wLT5oZHJfdHlwZSA9IGhkcl90eXBlICYgMHg3ZjsKLQkJaWYgKCFwY2lfZmluZF9zbG90KGJ1cy0+bnVtYmVyLCB0ZW1wLT5kZXZmbikpIHsKKwkJaWYgKChkZXYgPSBwY2lfZ2V0X3Nsb3QoYnVzLCB0ZW1wLT5kZXZmbikpICE9IE5VTEwpCisJCQlwY2lfZGV2X3B1dChkZXYpOworCQllbHNlIHsKIAkJCWRldiA9IHBjaV9zY2FuX3NpbmdsZV9kZXZpY2UoYnVzLCB0ZW1wLT5kZXZmbik7CiAJCQlpZiAoZGV2KSB7CiAJCQkJZGJnKCJOZXcgZGV2aWNlIG9uICVzIGZ1bmN0aW9uICV4OiV4XG4iLApAQCAtMjA1LDcgKzIwNyw5IEBACiAJCQkJY29udGludWU7CiAJCQl0ZW1wLT5oZHJfdHlwZSA9IGhkcl90eXBlICYgMHg3ZjsKIAotCQkJaWYgKCFwY2lfZmluZF9zbG90KGJ1cy0+bnVtYmVyLCB0ZW1wLT5kZXZmbikpIHsKKwkJCWlmICgoZGV2ID0gcGNpX2dldF9zbG90KGJ1cywgdGVtcC0+ZGV2Zm4pKSAhPSBOVUxMKQorCQkJCXBjaV9kZXZfcHV0KGRldik7CisJCQllbHNlIHsKIAkJCQlkZXYgPSBwY2lfc2Nhbl9zaW5nbGVfZGV2aWNlKGJ1cywgdGVtcC0+ZGV2Zm4pOwogCQkJCWlmIChkZXYpIHsKIAkJCQkJZGJnKCJOZXcgZGV2aWNlIG9uICVzIGZ1bmN0aW9uICV4OiV4XG4iLApAQCAtMzA1LDcgKzMwOSw3IEBACiAJLyogc2VhcmNoIGZvciBzdWJmdW5jdGlvbnMgYW5kIGRpc2FibGUgdGhlbSBmaXJzdCAqLwogCWlmICghKGRzbG90LT5kZXYtPmRldmZuICYgNykpIHsKIAkJZm9yIChmdW5jID0gMTsgZnVuYyA8IDg7IGZ1bmMrKykgewotCQkJZGV2ID0gcGNpX2ZpbmRfc2xvdChkc2xvdC0+ZGV2LT5idXMtPm51bWJlciwKKwkJCWRldiA9IHBjaV9nZXRfc2xvdChkc2xvdC0+ZGV2LT5idXMsCiAJCQkJCWRzbG90LT5kZXYtPmRldmZuICsgZnVuYyk7CiAJCQlpZiAoZGV2KSB7CiAJCQkJaHNsb3QgPSBnZXRfc2xvdF9mcm9tX2RldihkZXYpOwpAQCAtMzE1LDYgKzMxOSw3IEBACiAJCQkJCWVycigiSG90cGx1ZyBzbG90IG5vdCBmb3VuZCBmb3Igc3ViZnVuY3Rpb24gb2YgUENJIGRldmljZVxuIik7CiAJCQkJCXJldHVybiAtRU5PREVWOwogCQkJCX0KKwkJCQlwY2lfZGV2X3B1dChkZXYpOwogCQkJfSBlbHNlCiAJCQkJZGJnKCJObyBkZXZpY2UgaW4gc2xvdCBmb3VuZFxuIik7CiAJCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL2hvdHBsdWcvaWJtcGhwLmggYi9kcml2ZXJzL3BjaS9ob3RwbHVnL2libXBocC5oCmluZGV4IGRiYTZkOGMuLjYxMmQ5NjMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNpL2hvdHBsdWcvaWJtcGhwLmgKKysrIGIvZHJpdmVycy9wY2kvaG90cGx1Zy9pYm1waHAuaApAQCAtMzAsNyArMzAsNyBAQAogICoKICAqLwogCi0jaW5jbHVkZSAicGNpX2hvdHBsdWcuaCIKKyNpbmNsdWRlIDxsaW51eC9wY2lfaG90cGx1Zy5oPgogCiBleHRlcm4gaW50IGlibXBocF9kZWJ1ZzsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY2kvaG90cGx1Zy9wY2lfaG90cGx1Z19jb3JlLmMgYi9kcml2ZXJzL3BjaS9ob3RwbHVnL3BjaV9ob3RwbHVnX2NvcmUuYwppbmRleCBlMjgyM2VhLi5mNWQ2MzJlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjaS9ob3RwbHVnL3BjaV9ob3RwbHVnX2NvcmUuYworKysgYi9kcml2ZXJzL3BjaS9ob3RwbHVnL3BjaV9ob3RwbHVnX2NvcmUuYwpAQCAtMjEsOSArMjEsNyBAQAogICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKICAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgogICoKLSAqIFNlbmQgZmVlZGJhY2sgdG8gPGdyZWdAa3JvYWguY29tPgotICoKLSAqIEZpbGVzeXN0ZW0gcG9ydGlvbiBiYXNlZCBvbiB3b3JrIGRvbmUgYnkgUGF0IE1vY2hlbCBvbiBkZGZzL2RyaXZlcmZzCisgKiBTZW5kIGZlZWRiYWNrIHRvIDxrcmlzdGVuLmMuYWNjYXJkaUBpbnRlbC5jb20+CiAgKgogICovCiAKQEAgLTMyLDYgKzMwLDggQEAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KKyNpbmNsdWRlIDxsaW51eC9rb2JqZWN0Lmg+CisjaW5jbHVkZSA8bGludXgvc3lzZnMuaD4KICNpbmNsdWRlIDxsaW51eC9wYWdlbWFwLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+CkBAIC0zOSwxMSArMzksOCBAQAogI2luY2x1ZGUgPGxpbnV4L21vdW50Lmg+CiAjaW5jbHVkZSA8bGludXgvbmFtZWkuaD4KICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2lfaG90cGx1Zy5oPgogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+Ci0jaW5jbHVkZSA8bGludXgva29iamVjdC5oPgotI2luY2x1ZGUgPGxpbnV4L3N5c2ZzLmg+Ci0jaW5jbHVkZSAicGNpX2hvdHBsdWcuaCIKLQogCiAjZGVmaW5lIE1ZX05BTUUJInBjaV9ob3RwbHVnIgogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9ob3RwbHVnL3BjaWVocC5oIGIvZHJpdmVycy9wY2kvaG90cGx1Zy9wY2llaHAuaAppbmRleCBlYWVhOWQzLi40ZmIxMmZjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjaS9ob3RwbHVnL3BjaWVocC5oCisrKyBiL2RyaXZlcnMvcGNpL2hvdHBsdWcvcGNpZWhwLmgKQEAgLTMxLDExICszMSwxMSBAQAogCiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2lfaG90cGx1Zy5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4JCS8qIHNpZ25hbF9wZW5kaW5nKCkgKi8KICNpbmNsdWRlIDxsaW51eC9wY2llcG9ydF9pZi5oPgogI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+Ci0jaW5jbHVkZSAicGNpX2hvdHBsdWcuaCIKIAogI2RlZmluZSBNWV9OQU1FCSJwY2llaHAiCiAKQEAgLTkyLDYgKzkyLDcgQEAKIHN0cnVjdCBjb250cm9sbGVyIHsKIAlzdHJ1Y3QgY29udHJvbGxlciAqbmV4dDsKIAlzdHJ1Y3QgbXV0ZXggY3JpdF9zZWN0OwkJLyogY3JpdGljYWwgc2VjdGlvbiBtdXRleCAqLworCXN0cnVjdCBtdXRleCBjdHJsX2xvY2s7CQkvKiBjb250cm9sbGVyIGxvY2sgKi8KIAlzdHJ1Y3QgcGhwX2N0bHJfc3RhdGVfcyAqaHBjX2N0bHJfaGFuZGxlOyAvKiBIUEMgY29udHJvbGxlciBoYW5kbGUgKi8KIAlpbnQgbnVtX3Nsb3RzOwkJCS8qIE51bWJlciBvZiBzbG90cyBvbiBjdGxyICovCiAJaW50IHNsb3RfbnVtX2luYzsJCS8qIDEgb3IgLTEgKi8KQEAgLTE2NiwxMCArMTY3LDEwIEBACiAgKiBlcnJvciBNZXNzYWdlcwogICovCiAjZGVmaW5lIG1zZ19pbml0aWFsaXphdGlvbl9lcnIJIkluaXRpYWxpemF0aW9uIGZhaWx1cmUsIGVycm9yPSVkXG4iCi0jZGVmaW5lIG1zZ19idXR0b25fb24JCSJQQ0kgc2xvdCAjJWQgLSBwb3dlcmluZyBvbiBkdWUgdG8gYnV0dG9uIHByZXNzLlxuIgotI2RlZmluZSBtc2dfYnV0dG9uX29mZgkJIlBDSSBzbG90ICMlZCAtIHBvd2VyaW5nIG9mZiBkdWUgdG8gYnV0dG9uIHByZXNzLlxuIgotI2RlZmluZSBtc2dfYnV0dG9uX2NhbmNlbAkiUENJIHNsb3QgIyVkIC0gYWN0aW9uIGNhbmNlbGVkIGR1ZSB0byBidXR0b24gcHJlc3MuXG4iCi0jZGVmaW5lIG1zZ19idXR0b25faWdub3JlCSJQQ0kgc2xvdCAjJWQgLSBidXR0b24gcHJlc3MgaWdub3JlZC4gIChhY3Rpb24gaW4gcHJvZ3Jlc3MuLi4pXG4iCisjZGVmaW5lIG1zZ19idXR0b25fb24JCSJQQ0kgc2xvdCAjJXMgLSBwb3dlcmluZyBvbiBkdWUgdG8gYnV0dG9uIHByZXNzLlxuIgorI2RlZmluZSBtc2dfYnV0dG9uX29mZgkJIlBDSSBzbG90ICMlcyAtIHBvd2VyaW5nIG9mZiBkdWUgdG8gYnV0dG9uIHByZXNzLlxuIgorI2RlZmluZSBtc2dfYnV0dG9uX2NhbmNlbAkiUENJIHNsb3QgIyVzIC0gYWN0aW9uIGNhbmNlbGVkIGR1ZSB0byBidXR0b24gcHJlc3MuXG4iCisjZGVmaW5lIG1zZ19idXR0b25faWdub3JlCSJQQ0kgc2xvdCAjJXMgLSBidXR0b24gcHJlc3MgaWdub3JlZC4gIChhY3Rpb24gaW4gcHJvZ3Jlc3MuLi4pXG4iCiAKIC8qIGNvbnRyb2xsZXIgZnVuY3Rpb25zICovCiBleHRlcm4gaW50CXBjaWVocF9ldmVudF9zdGFydF90aHJlYWQJKHZvaWQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY2kvaG90cGx1Zy9wY2llaHBfY29yZS5jIGIvZHJpdmVycy9wY2kvaG90cGx1Zy9wY2llaHBfY29yZS5jCmluZGV4IGM2N2I3YzMuLmY5M2U4MWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNpL2hvdHBsdWcvcGNpZWhwX2NvcmUuYworKysgYi9kcml2ZXJzL3BjaS9ob3RwbHVnL3BjaWVocF9jb3JlLmMKQEAgLTQ0OCw3ICs0NDgsNyBAQAogCX0KIAogCS8qIFdhaXQgZm9yIGV4Y2x1c2l2ZSBhY2Nlc3MgdG8gaGFyZHdhcmUgKi8KLQltdXRleF9sb2NrKCZjdHJsLT5jcml0X3NlY3QpOworCW11dGV4X2xvY2soJmN0cmwtPmN0cmxfbG9jayk7CiAKIAl0X3Nsb3QtPmhwY19vcHMtPmdldF9hZGFwdGVyX3N0YXR1cyh0X3Nsb3QsICZ2YWx1ZSk7IC8qIENoZWNrIGlmIHNsb3QgaXMgb2NjdXBpZWQgKi8KIAkKQEAgLTQ1Niw3ICs0NTYsNyBAQAogCQlyYyA9IHRfc2xvdC0+aHBjX29wcy0+cG93ZXJfb2ZmX3Nsb3QodF9zbG90KTsgLyogUG93ZXIgb2ZmIHNsb3QgaWYgbm90IG9jY3VwaWVkKi8KIAkJaWYgKHJjKSB7CiAJCQkvKiBEb25lIHdpdGggZXhjbHVzaXZlIGhhcmR3YXJlIGFjY2VzcyAqLwotCQkJbXV0ZXhfdW5sb2NrKCZjdHJsLT5jcml0X3NlY3QpOworCQkJbXV0ZXhfdW5sb2NrKCZjdHJsLT5jdHJsX2xvY2spOwogCQkJZ290byBlcnJfb3V0X2ZyZWVfY3RybF9zbG90OwogCQl9IGVsc2UKIAkJCS8qIFdhaXQgZm9yIHRoZSBjb21tYW5kIHRvIGNvbXBsZXRlICovCkBAIC00NjQsNyArNDY0LDcgQEAKIAl9CiAKIAkvKiBEb25lIHdpdGggZXhjbHVzaXZlIGhhcmR3YXJlIGFjY2VzcyAqLwotCW11dGV4X3VubG9jaygmY3RybC0+Y3JpdF9zZWN0KTsKKwltdXRleF91bmxvY2soJmN0cmwtPmN0cmxfbG9jayk7CiAKIAlyZXR1cm4gMDsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY2kvaG90cGx1Zy9wY2llaHBfY3RybC5jIGIvZHJpdmVycy9wY2kvaG90cGx1Zy9wY2llaHBfY3RybC5jCmluZGV4IDQxMjkwYTEuLjM3MmM2M2UgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNpL2hvdHBsdWcvcGNpZWhwX2N0cmwuYworKysgYi9kcml2ZXJzL3BjaS9ob3RwbHVnL3BjaWVocF9jdHJsLmMKQEAgLTQzLDYgKzQzLDExIEBACiBzdGF0aWMgdW5zaWduZWQgbG9uZyBwdXNoYnV0dG9uX3BlbmRpbmc7CS8qID0gMCAqLwogc3RhdGljIHVuc2lnbmVkIGxvbmcgc3VycHJpc2Vfcm1fcGVuZGluZzsJLyogPSAwICovCiAKK3N0YXRpYyBpbmxpbmUgY2hhciAqc2xvdF9uYW1lKHN0cnVjdCBzbG90ICpwX3Nsb3QpCit7CisJcmV0dXJuIHBfc2xvdC0+aG90cGx1Z19zbG90LT5uYW1lOworfQorCiB1OCBwY2llaHBfaGFuZGxlX2F0dGVudGlvbl9idXR0b24odTggaHBfc2xvdCwgdm9pZCAqaW5zdF9pZCkKIHsKIAlzdHJ1Y3QgY29udHJvbGxlciAqY3RybCA9IChzdHJ1Y3QgY29udHJvbGxlciAqKSBpbnN0X2lkOwpAQCAtNjgsNyArNzMsNyBAQAogCS8qCiAJICogIEJ1dHRvbiBwcmVzc2VkIC0gU2VlIGlmIG5lZWQgdG8gVEFLRSBBQ1RJT04hISEKIAkgKi8KLQlpbmZvKCJCdXR0b24gcHJlc3NlZCBvbiBTbG90KCVkKVxuIiwgY3RybC0+Zmlyc3Rfc2xvdCArIGhwX3Nsb3QpOworCWluZm8oIkJ1dHRvbiBwcmVzc2VkIG9uIFNsb3QoJXMpXG4iLCBzbG90X25hbWUocF9zbG90KSk7CiAJdGFza0luZm8tPmV2ZW50X3R5cGUgPSBJTlRfQlVUVE9OX1BSRVNTOwogCiAJaWYgKChwX3Nsb3QtPnN0YXRlID09IEJMSU5LSU5HT05fU1RBVEUpCkBAIC03OCw3ICs4Myw3IEBACiAJCSAqIG9yIGhvdC1yZW1vdmUKIAkJICovCiAJCXRhc2tJbmZvLT5ldmVudF90eXBlID0gSU5UX0JVVFRPTl9DQU5DRUw7Ci0JCWluZm8oIkJ1dHRvbiBjYW5jZWwgb24gU2xvdCglZClcbiIsIGN0cmwtPmZpcnN0X3Nsb3QgKyBocF9zbG90KTsKKwkJaW5mbygiQnV0dG9uIGNhbmNlbCBvbiBTbG90KCVzKVxuIiwgc2xvdF9uYW1lKHBfc2xvdCkpOwogCX0gZWxzZSBpZiAoKHBfc2xvdC0+c3RhdGUgPT0gUE9XRVJPTl9TVEFURSkKIAkJICAgfHwgKHBfc2xvdC0+c3RhdGUgPT0gUE9XRVJPRkZfU1RBVEUpKSB7CiAJCS8qIElnbm9yZSBpZiB0aGUgc2xvdCBpcyBvbiBwb3dlci1vbiBvciBwb3dlci1vZmYgc3RhdGU7IHRoaXMgCkBAIC04Niw3ICs5MSw3IEBACiAJCSAqIGhvdC1yZW1vdmUgaXMgdW5kZXJnb2luZwogCQkgKi8KIAkJdGFza0luZm8tPmV2ZW50X3R5cGUgPSBJTlRfQlVUVE9OX0lHTk9SRTsKLQkJaW5mbygiQnV0dG9uIGlnbm9yZSBvbiBTbG90KCVkKVxuIiwgY3RybC0+Zmlyc3Rfc2xvdCArIGhwX3Nsb3QpOworCQlpbmZvKCJCdXR0b24gaWdub3JlIG9uIFNsb3QoJXMpXG4iLCBzbG90X25hbWUocF9zbG90KSk7CiAJfQogCiAJaWYgKHJjKQpAQCAtMTIyLDEzICsxMjcsMTMgQEAKIAkJLyoKIAkJICogU3dpdGNoIG9wZW5lZAogCQkgKi8KLQkJaW5mbygiTGF0Y2ggb3BlbiBvbiBTbG90KCVkKVxuIiwgY3RybC0+Zmlyc3Rfc2xvdCArIGhwX3Nsb3QpOworCQlpbmZvKCJMYXRjaCBvcGVuIG9uIFNsb3QoJXMpXG4iLCBzbG90X25hbWUocF9zbG90KSk7CiAJCXRhc2tJbmZvLT5ldmVudF90eXBlID0gSU5UX1NXSVRDSF9PUEVOOwogCX0gZWxzZSB7CiAJCS8qCiAJCSAqICBTd2l0Y2ggY2xvc2VkCiAJCSAqLwotCQlpbmZvKCJMYXRjaCBjbG9zZSBvbiBTbG90KCVkKVxuIiwgY3RybC0+Zmlyc3Rfc2xvdCArIGhwX3Nsb3QpOworCQlpbmZvKCJMYXRjaCBjbG9zZSBvbiBTbG90KCVzKVxuIiwgc2xvdF9uYW1lKHBfc2xvdCkpOwogCQl0YXNrSW5mby0+ZXZlbnRfdHlwZSA9IElOVF9TV0lUQ0hfQ0xPU0U7CiAJfQogCkBAIC0xNjYsMTMgKzE3MSwxMyBAQAogCQkvKgogCQkgKiBDYXJkIFByZXNlbnQKIAkJICovCi0JCWluZm8oIkNhcmQgcHJlc2VudCBvbiBTbG90KCVkKVxuIiwgY3RybC0+Zmlyc3Rfc2xvdCArIGhwX3Nsb3QpOworCQlpbmZvKCJDYXJkIHByZXNlbnQgb24gU2xvdCglcylcbiIsIHNsb3RfbmFtZShwX3Nsb3QpKTsKIAkJdGFza0luZm8tPmV2ZW50X3R5cGUgPSBJTlRfUFJFU0VOQ0VfT047CiAJfSBlbHNlIHsKIAkJLyoKIAkJICogTm90IFByZXNlbnQKIAkJICovCi0JCWluZm8oIkNhcmQgbm90IHByZXNlbnQgb24gU2xvdCglZClcbiIsIGN0cmwtPmZpcnN0X3Nsb3QgKyBocF9zbG90KTsKKwkJaW5mbygiQ2FyZCBub3QgcHJlc2VudCBvbiBTbG90KCVzKVxuIiwgc2xvdF9uYW1lKHBfc2xvdCkpOwogCQl0YXNrSW5mby0+ZXZlbnRfdHlwZSA9IElOVF9QUkVTRU5DRV9PRkY7CiAJfQogCkBAIC0yMDYsMTMgKzIxMSwxMyBAQAogCQkvKgogCQkgKiBwb3dlciBmYXVsdCBDbGVhcmVkCiAJCSAqLwotCQlpbmZvKCJQb3dlciBmYXVsdCBjbGVhcmVkIG9uIFNsb3QoJWQpXG4iLCBjdHJsLT5maXJzdF9zbG90ICsgaHBfc2xvdCk7CisJCWluZm8oIlBvd2VyIGZhdWx0IGNsZWFyZWQgb24gU2xvdCglcylcbiIsIHNsb3RfbmFtZShwX3Nsb3QpKTsKIAkJdGFza0luZm8tPmV2ZW50X3R5cGUgPSBJTlRfUE9XRVJfRkFVTFRfQ0xFQVI7CiAJfSBlbHNlIHsKIAkJLyoKIAkJICogICBwb3dlciBmYXVsdAogCQkgKi8KLQkJaW5mbygiUG93ZXIgZmF1bHQgb24gU2xvdCglZClcbiIsIGN0cmwtPmZpcnN0X3Nsb3QgKyBocF9zbG90KTsKKwkJaW5mbygiUG93ZXIgZmF1bHQgb24gU2xvdCglcylcbiIsIHNsb3RfbmFtZShwX3Nsb3QpKTsKIAkJdGFza0luZm8tPmV2ZW50X3R5cGUgPSBJTlRfUE9XRVJfRkFVTFQ7CiAJCWluZm8oInBvd2VyIGZhdWx0IGJpdCAleCBzZXRcbiIsIGhwX3Nsb3QpOwogCX0KQEAgLTIyOSwxMyArMjM0LDEzIEBACiBzdGF0aWMgdm9pZCBzZXRfc2xvdF9vZmYoc3RydWN0IGNvbnRyb2xsZXIgKmN0cmwsIHN0cnVjdCBzbG90ICogcHNsb3QpCiB7CiAJLyogV2FpdCBmb3IgZXhjbHVzaXZlIGFjY2VzcyB0byBoYXJkd2FyZSAqLwotCW11dGV4X2xvY2soJmN0cmwtPmNyaXRfc2VjdCk7CisJbXV0ZXhfbG9jaygmY3RybC0+Y3RybF9sb2NrKTsKIAogCS8qIHR1cm4gb2ZmIHNsb3QsIHR1cm4gb24gQW1iZXIgTEVELCB0dXJuIG9mZiBHcmVlbiBMRUQgaWYgc3VwcG9ydGVkKi8KIAlpZiAoUE9XRVJfQ1RSTChjdHJsLT5jdHJsY2FwKSkgewogCQlpZiAocHNsb3QtPmhwY19vcHMtPnBvd2VyX29mZl9zbG90KHBzbG90KSkgeyAgIAogCQkJZXJyKCIlczogSXNzdWUgb2YgU2xvdCBQb3dlciBPZmYgY29tbWFuZCBmYWlsZWRcbiIsIF9fRlVOQ1RJT05fXyk7Ci0JCQltdXRleF91bmxvY2soJmN0cmwtPmNyaXRfc2VjdCk7CisJCQltdXRleF91bmxvY2soJmN0cmwtPmN0cmxfbG9jayk7CiAJCQlyZXR1cm47CiAJCX0KIAkJd2FpdF9mb3JfY3RybF9pcnEgKGN0cmwpOwpAQCAtMjQ5LDE0ICsyNTQsMTQgQEAKIAlpZiAoQVRUTl9MRUQoY3RybC0+Y3RybGNhcCkpIHsgCiAJCWlmIChwc2xvdC0+aHBjX29wcy0+c2V0X2F0dGVudGlvbl9zdGF0dXMocHNsb3QsIDEpKSB7ICAgCiAJCQllcnIoIiVzOiBJc3N1ZSBvZiBTZXQgQXR0ZW50aW9uIExlZCBjb21tYW5kIGZhaWxlZFxuIiwgX19GVU5DVElPTl9fKTsKLQkJCW11dGV4X3VubG9jaygmY3RybC0+Y3JpdF9zZWN0KTsKKwkJCW11dGV4X3VubG9jaygmY3RybC0+Y3RybF9sb2NrKTsKIAkJCXJldHVybjsKIAkJfQogCQl3YWl0X2Zvcl9jdHJsX2lycSAoY3RybCk7CiAJfQogCiAJLyogRG9uZSB3aXRoIGV4Y2x1c2l2ZSBoYXJkd2FyZSBhY2Nlc3MgKi8KLQltdXRleF91bmxvY2soJmN0cmwtPmNyaXRfc2VjdCk7CisJbXV0ZXhfdW5sb2NrKCZjdHJsLT5jdHJsX2xvY2spOwogfQogCiAvKioKQEAgLTI3OSwxMyArMjg0LDEzIEBACiAJCQljdHJsLT5zbG90X2RldmljZV9vZmZzZXQsIGhwX3Nsb3QpOwogCiAJLyogV2FpdCBmb3IgZXhjbHVzaXZlIGFjY2VzcyB0byBoYXJkd2FyZSAqLwotCW11dGV4X2xvY2soJmN0cmwtPmNyaXRfc2VjdCk7CisJbXV0ZXhfbG9jaygmY3RybC0+Y3RybF9sb2NrKTsKIAogCWlmIChQT1dFUl9DVFJMKGN0cmwtPmN0cmxjYXApKSB7CiAJCS8qIFBvd2VyIG9uIHNsb3QgKi8KIAkJcmMgPSBwX3Nsb3QtPmhwY19vcHMtPnBvd2VyX29uX3Nsb3QocF9zbG90KTsKIAkJaWYgKHJjKSB7Ci0JCQltdXRleF91bmxvY2soJmN0cmwtPmNyaXRfc2VjdCk7CisJCQltdXRleF91bmxvY2soJmN0cmwtPmN0cmxfbG9jayk7CiAJCQlyZXR1cm4gLTE7CiAJCX0KIApAQCAtMzAxLDcgKzMwNiw3IEBACiAJfQogCiAJLyogRG9uZSB3aXRoIGV4Y2x1c2l2ZSBoYXJkd2FyZSBhY2Nlc3MgKi8KLQltdXRleF91bmxvY2soJmN0cmwtPmNyaXRfc2VjdCk7CisJbXV0ZXhfdW5sb2NrKCZjdHJsLT5jdHJsX2xvY2spOwogCiAJLyogV2FpdCBmb3IgfjEgc2Vjb25kICovCiAJd2FpdF9mb3JfY3RybF9pcnEgKGN0cmwpOwpAQCAtMzM1LDcgKzM0MCw3IEBACiAJCXBjaV9maXh1cF9kZXZpY2UocGNpX2ZpeHVwX2ZpbmFsLCBjdHJsLT5wY2lfZGV2KTsKIAlpZiAoUFdSX0xFRChjdHJsLT5jdHJsY2FwKSkgewogCQkvKiBXYWl0IGZvciBleGNsdXNpdmUgYWNjZXNzIHRvIGhhcmR3YXJlICovCi0gIAkJbXV0ZXhfbG9jaygmY3RybC0+Y3JpdF9zZWN0KTsKKyAgCQltdXRleF9sb2NrKCZjdHJsLT5jdHJsX2xvY2spOwogCiAgIAkJcF9zbG90LT5ocGNfb3BzLT5ncmVlbl9sZWRfb24ocF9zbG90KTsKICAgCkBAIC0zNDMsNyArMzQ4LDcgQEAKICAgCQl3YWl0X2Zvcl9jdHJsX2lycSAoY3RybCk7CiAgIAkKICAgCQkvKiBEb25lIHdpdGggZXhjbHVzaXZlIGhhcmR3YXJlIGFjY2VzcyAqLwotICAJCW11dGV4X3VubG9jaygmY3RybC0+Y3JpdF9zZWN0KTsKKyAgCQltdXRleF91bmxvY2soJmN0cmwtPmN0cmxfbG9jayk7CiAgIAl9CiAJcmV0dXJuIDA7CiAKQEAgLTM3NSwxNCArMzgwLDE0IEBACiAJZGJnKCJJbiAlcywgaHBfc2xvdCA9ICVkXG4iLCBfX0ZVTkNUSU9OX18sIGhwX3Nsb3QpOwogCiAJLyogV2FpdCBmb3IgZXhjbHVzaXZlIGFjY2VzcyB0byBoYXJkd2FyZSAqLwotCW11dGV4X2xvY2soJmN0cmwtPmNyaXRfc2VjdCk7CisJbXV0ZXhfbG9jaygmY3RybC0+Y3RybF9sb2NrKTsKIAogCWlmIChQT1dFUl9DVFJMKGN0cmwtPmN0cmxjYXApKSB7CiAJCS8qIHBvd2VyIG9mZiBzbG90ICovCiAJCXJjID0gcF9zbG90LT5ocGNfb3BzLT5wb3dlcl9vZmZfc2xvdChwX3Nsb3QpOwogCQlpZiAocmMpIHsKIAkJCWVycigiJXM6IElzc3VlIG9mIFNsb3QgRGlzYWJsZSBjb21tYW5kIGZhaWxlZFxuIiwgX19GVU5DVElPTl9fKTsKLQkJCW11dGV4X3VubG9jaygmY3RybC0+Y3JpdF9zZWN0KTsKKwkJCW11dGV4X3VubG9jaygmY3RybC0+Y3RybF9sb2NrKTsKIAkJCXJldHVybiByYzsKIAkJfQogCQkvKiBXYWl0IGZvciB0aGUgY29tbWFuZCB0byBjb21wbGV0ZSAqLwpAQCAtMzk4LDcgKzQwMyw3IEBACiAJfQogCiAJLyogRG9uZSB3aXRoIGV4Y2x1c2l2ZSBoYXJkd2FyZSBhY2Nlc3MgKi8KLQltdXRleF91bmxvY2soJmN0cmwtPmNyaXRfc2VjdCk7CisJbXV0ZXhfdW5sb2NrKCZjdHJsLT5jdHJsX2xvY2spOwogCiAJcmV0dXJuIDA7CiB9CkBAIC00NDUsNyArNDUwLDcgQEAKIAogCQlpZiAocGNpZWhwX2VuYWJsZV9zbG90KHBfc2xvdCkgJiYgUFdSX0xFRChwX3Nsb3QtPmN0cmwtPmN0cmxjYXApKSB7CiAJCQkvKiBXYWl0IGZvciBleGNsdXNpdmUgYWNjZXNzIHRvIGhhcmR3YXJlICovCi0JCQltdXRleF9sb2NrKCZwX3Nsb3QtPmN0cmwtPmNyaXRfc2VjdCk7CisJCQltdXRleF9sb2NrKCZwX3Nsb3QtPmN0cmwtPmN0cmxfbG9jayk7CiAKIAkJCXBfc2xvdC0+aHBjX29wcy0+Z3JlZW5fbGVkX29mZihwX3Nsb3QpOwogCkBAIC00NTMsNyArNDU4LDcgQEAKIAkJCXdhaXRfZm9yX2N0cmxfaXJxIChwX3Nsb3QtPmN0cmwpOwogCiAJCQkvKiBEb25lIHdpdGggZXhjbHVzaXZlIGhhcmR3YXJlIGFjY2VzcyAqLwotCQkJbXV0ZXhfdW5sb2NrKCZwX3Nsb3QtPmN0cmwtPmNyaXRfc2VjdCk7CisJCQltdXRleF91bmxvY2soJnBfc2xvdC0+Y3RybC0+Y3RybF9sb2NrKTsKIAkJfQogCQlwX3Nsb3QtPnN0YXRlID0gU1RBVElDX1NUQVRFOwogCX0KQEAgLTQ5NSw3ICs1MDAsNyBAQAogCiAJCWlmIChwY2llaHBfZW5hYmxlX3Nsb3QocF9zbG90KSAmJiBQV1JfTEVEKHBfc2xvdC0+Y3RybC0+Y3RybGNhcCkpIHsKIAkJCS8qIFdhaXQgZm9yIGV4Y2x1c2l2ZSBhY2Nlc3MgdG8gaGFyZHdhcmUgKi8KLQkJCW11dGV4X2xvY2soJnBfc2xvdC0+Y3RybC0+Y3JpdF9zZWN0KTsKKwkJCW11dGV4X2xvY2soJnBfc2xvdC0+Y3RybC0+Y3RybF9sb2NrKTsKIAogCQkJcF9zbG90LT5ocGNfb3BzLT5ncmVlbl9sZWRfb2ZmKHBfc2xvdCk7CiAKQEAgLTUwMyw3ICs1MDgsNyBAQAogCQkJd2FpdF9mb3JfY3RybF9pcnEgKHBfc2xvdC0+Y3RybCk7CiAKIAkJCS8qIERvbmUgd2l0aCBleGNsdXNpdmUgaGFyZHdhcmUgYWNjZXNzICovCi0JCQltdXRleF91bmxvY2soJnBfc2xvdC0+Y3RybC0+Y3JpdF9zZWN0KTsKKwkJCW11dGV4X3VubG9jaygmcF9zbG90LT5jdHJsLT5jdHJsX2xvY2spOwogCQl9CiAJCXBfc2xvdC0+c3RhdGUgPSBTVEFUSUNfU1RBVEU7CiAJfQpAQCAtNjE2LDcgKzYyMSw3IEBACiAJCQkJCXN3aXRjaCAocF9zbG90LT5zdGF0ZSkgewogCQkJCQljYXNlIEJMSU5LSU5HT0ZGX1NUQVRFOgogCQkJCQkJLyogV2FpdCBmb3IgZXhjbHVzaXZlIGFjY2VzcyB0byBoYXJkd2FyZSAqLwotCQkJCQkJbXV0ZXhfbG9jaygmY3RybC0+Y3JpdF9zZWN0KTsKKwkJCQkJCW11dGV4X2xvY2soJmN0cmwtPmN0cmxfbG9jayk7CiAJCQkJCQkKIAkJCQkJCWlmIChQV1JfTEVEKGN0cmwtPmN0cmxjYXApKSB7CiAJCQkJCQkJcF9zbG90LT5ocGNfb3BzLT5ncmVlbl9sZWRfb24ocF9zbG90KTsKQEAgLTYzMCwxMSArNjM1LDExIEBACiAJCQkJCQkJd2FpdF9mb3JfY3RybF9pcnEgKGN0cmwpOwogCQkJCQkJfQogCQkJCQkJLyogRG9uZSB3aXRoIGV4Y2x1c2l2ZSBoYXJkd2FyZSBhY2Nlc3MgKi8KLQkJCQkJCW11dGV4X3VubG9jaygmY3RybC0+Y3JpdF9zZWN0KTsKKwkJCQkJCW11dGV4X3VubG9jaygmY3RybC0+Y3RybF9sb2NrKTsKIAkJCQkJCWJyZWFrOwogCQkJCQljYXNlIEJMSU5LSU5HT05fU1RBVEU6CiAJCQkJCQkvKiBXYWl0IGZvciBleGNsdXNpdmUgYWNjZXNzIHRvIGhhcmR3YXJlICovCi0JCQkJCQltdXRleF9sb2NrKCZjdHJsLT5jcml0X3NlY3QpOworCQkJCQkJbXV0ZXhfbG9jaygmY3RybC0+Y3RybF9sb2NrKTsKIAogCQkJCQkJaWYgKFBXUl9MRUQoY3RybC0+Y3RybGNhcCkpIHsKIAkJCQkJCQlwX3Nsb3QtPmhwY19vcHMtPmdyZWVuX2xlZF9vZmYocF9zbG90KTsKQEAgLTY0NywxNCArNjUyLDE0IEBACiAJCQkJCQkJd2FpdF9mb3JfY3RybF9pcnEgKGN0cmwpOwogCQkJCQkJfQogCQkJCQkJLyogRG9uZSB3aXRoIGV4Y2x1c2l2ZSBoYXJkd2FyZSBhY2Nlc3MgKi8KLQkJCQkJCW11dGV4X3VubG9jaygmY3RybC0+Y3JpdF9zZWN0KTsKKwkJCQkJCW11dGV4X3VubG9jaygmY3RybC0+Y3RybF9sb2NrKTsKIAogCQkJCQkJYnJlYWs7CiAJCQkJCWRlZmF1bHQ6CiAJCQkJCQl3YXJuKCJOb3QgYSB2YWxpZCBzdGF0ZVxuIik7CiAJCQkJCQlyZXR1cm47CiAJCQkJCX0KLQkJCQkJaW5mbyhtc2dfYnV0dG9uX2NhbmNlbCwgcF9zbG90LT5udW1iZXIpOworCQkJCQlpbmZvKG1zZ19idXR0b25fY2FuY2VsLCBzbG90X25hbWUocF9zbG90KSk7CiAJCQkJCXBfc2xvdC0+c3RhdGUgPSBTVEFUSUNfU1RBVEU7CiAJCQkJfQogCQkJCS8qICoqKioqKioqKioqQnV0dG9uIFByZXNzZWQgKE5vIGFjdGlvbiBvbiAxc3QgcHJlc3MuLi4pICovCkBAIC02NjcsMTYgKzY3MiwxNiBAQAogCQkJCQkJCS8qIHNsb3QgaXMgb24gKi8KIAkJCQkJCQlkYmcoInNsb3QgaXMgb25cbiIpOwogCQkJCQkJCXBfc2xvdC0+c3RhdGUgPSBCTElOS0lOR09GRl9TVEFURTsKLQkJCQkJCQlpbmZvKG1zZ19idXR0b25fb2ZmLCBwX3Nsb3QtPm51bWJlcik7CisJCQkJCQkJaW5mbyhtc2dfYnV0dG9uX29mZiwgc2xvdF9uYW1lKHBfc2xvdCkpOwogCQkJCQkJfSBlbHNlIHsKIAkJCQkJCQkvKiBzbG90IGlzIG9mZiAqLwogCQkJCQkJCWRiZygic2xvdCBpcyBvZmZcbiIpOwogCQkJCQkJCXBfc2xvdC0+c3RhdGUgPSBCTElOS0lOR09OX1NUQVRFOwotCQkJCQkJCWluZm8obXNnX2J1dHRvbl9vbiwgcF9zbG90LT5udW1iZXIpOworCQkJCQkJCWluZm8obXNnX2J1dHRvbl9vbiwgc2xvdF9uYW1lKHBfc2xvdCkpOwogCQkJCQkJfQogCiAJCQkJCQkvKiBXYWl0IGZvciBleGNsdXNpdmUgYWNjZXNzIHRvIGhhcmR3YXJlICovCi0JCQkJCQltdXRleF9sb2NrKCZjdHJsLT5jcml0X3NlY3QpOworCQkJCQkJbXV0ZXhfbG9jaygmY3RybC0+Y3RybF9sb2NrKTsKIAogCQkJCQkJLyogYmxpbmsgZ3JlZW4gTEVEIGFuZCB0dXJuIG9mZiBhbWJlciAqLwogCQkJCQkJaWYgKFBXUl9MRUQoY3RybC0+Y3RybGNhcCkpIHsKQEAgLTY5Myw3ICs2OTgsNyBAQAogCQkJCQkJfQogCiAJCQkJCQkvKiBEb25lIHdpdGggZXhjbHVzaXZlIGhhcmR3YXJlIGFjY2VzcyAqLwotCQkJCQkJbXV0ZXhfdW5sb2NrKCZjdHJsLT5jcml0X3NlY3QpOworCQkJCQkJbXV0ZXhfdW5sb2NrKCZjdHJsLT5jdHJsX2xvY2spOwogCiAJCQkJCQlpbml0X3RpbWVyKCZwX3Nsb3QtPnRhc2tfZXZlbnQpOwogCQkJCQkJcF9zbG90LT50YXNrX2V2ZW50LmV4cGlyZXMgPSBqaWZmaWVzICsgNSAqIEhaOyAgIC8qIDUgc2Vjb25kIGRlbGF5ICovCkBAIC03MDgsNyArNzEzLDcgQEAKIAkJCQkJaWYgKFBPV0VSX0NUUkwoY3RybC0+Y3RybGNhcCkpIHsKIAkJCQkJCWRiZygicG93ZXIgZmF1bHRcbiIpOwogCQkJCQkJLyogV2FpdCBmb3IgZXhjbHVzaXZlIGFjY2VzcyB0byBoYXJkd2FyZSAqLwotCQkJCQkJbXV0ZXhfbG9jaygmY3RybC0+Y3JpdF9zZWN0KTsKKwkJCQkJCW11dGV4X2xvY2soJmN0cmwtPmN0cmxfbG9jayk7CiAKIAkJCQkJCWlmIChBVFROX0xFRChjdHJsLT5jdHJsY2FwKSkgewogCQkJCQkJCXBfc2xvdC0+aHBjX29wcy0+c2V0X2F0dGVudGlvbl9zdGF0dXMocF9zbG90LCAxKTsKQEAgLTcyMSw3ICs3MjYsNyBAQAogCQkJCQkJfQogCiAJCQkJCQkvKiBEb25lIHdpdGggZXhjbHVzaXZlIGhhcmR3YXJlIGFjY2VzcyAqLwotCQkJCQkJbXV0ZXhfdW5sb2NrKCZjdHJsLT5jcml0X3NlY3QpOworCQkJCQkJbXV0ZXhfdW5sb2NrKCZjdHJsLT5jdHJsX2xvY2spOwogCQkJCQl9CiAJCQkJfQogCQkJCS8qKioqKioqKioqKlNVUlBSSVNFIFJFTU9WQUwqKioqKioqKioqKioqKioqKioqKi8KQEAgLTc2MCwxNCArNzY1LDE2IEBACiAKIAlyYyA9IHBfc2xvdC0+aHBjX29wcy0+Z2V0X2FkYXB0ZXJfc3RhdHVzKHBfc2xvdCwgJmdldHN0YXR1cyk7CiAJaWYgKHJjIHx8ICFnZXRzdGF0dXMpIHsKLQkJaW5mbygiJXM6IG5vIGFkYXB0ZXIgb24gc2xvdCgleClcbiIsIF9fRlVOQ1RJT05fXywgcF9zbG90LT5udW1iZXIpOworCQlpbmZvKCIlczogbm8gYWRhcHRlciBvbiBzbG90KCVzKVxuIiwgX19GVU5DVElPTl9fLAorCQkgICAgIHNsb3RfbmFtZShwX3Nsb3QpKTsKIAkJbXV0ZXhfdW5sb2NrKCZwX3Nsb3QtPmN0cmwtPmNyaXRfc2VjdCk7CiAJCXJldHVybiAtRU5PREVWOwogCX0KIAlpZiAoTVJMX1NFTlMocF9zbG90LT5jdHJsLT5jdHJsY2FwKSkgewkKIAkJcmMgPSBwX3Nsb3QtPmhwY19vcHMtPmdldF9sYXRjaF9zdGF0dXMocF9zbG90LCAmZ2V0c3RhdHVzKTsKIAkJaWYgKHJjIHx8IGdldHN0YXR1cykgewotCQkJaW5mbygiJXM6IGxhdGNoIG9wZW4gb24gc2xvdCgleClcbiIsIF9fRlVOQ1RJT05fXywgcF9zbG90LT5udW1iZXIpOworCQkJaW5mbygiJXM6IGxhdGNoIG9wZW4gb24gc2xvdCglcylcbiIsIF9fRlVOQ1RJT05fXywKKwkJCSAgICAgc2xvdF9uYW1lKHBfc2xvdCkpOwogCQkJbXV0ZXhfdW5sb2NrKCZwX3Nsb3QtPmN0cmwtPmNyaXRfc2VjdCk7CiAJCQlyZXR1cm4gLUVOT0RFVjsKIAkJfQpAQCAtNzc2LDEyICs3ODMsMTIgQEAKIAlpZiAoUE9XRVJfQ1RSTChwX3Nsb3QtPmN0cmwtPmN0cmxjYXApKSB7CQogCQlyYyA9IHBfc2xvdC0+aHBjX29wcy0+Z2V0X3Bvd2VyX3N0YXR1cyhwX3Nsb3QsICZnZXRzdGF0dXMpOwogCQlpZiAocmMgfHwgZ2V0c3RhdHVzKSB7Ci0JCQlpbmZvKCIlczogYWxyZWFkeSBlbmFibGVkIG9uIHNsb3QoJXgpXG4iLCBfX0ZVTkNUSU9OX18sIHBfc2xvdC0+bnVtYmVyKTsKKwkJCWluZm8oIiVzOiBhbHJlYWR5IGVuYWJsZWQgb24gc2xvdCglcylcbiIsIF9fRlVOQ1RJT05fXywKKwkJCSAgICAgc2xvdF9uYW1lKHBfc2xvdCkpOwogCQkJbXV0ZXhfdW5sb2NrKCZwX3Nsb3QtPmN0cmwtPmNyaXRfc2VjdCk7CiAJCQlyZXR1cm4gLUVJTlZBTDsKIAkJfQogCX0KLQltdXRleF91bmxvY2soJnBfc2xvdC0+Y3RybC0+Y3JpdF9zZWN0KTsKIAogCXBfc2xvdC0+aHBjX29wcy0+Z2V0X2xhdGNoX3N0YXR1cyhwX3Nsb3QsICZnZXRzdGF0dXMpOwogCkBAIC03OTAsOSArNzk3LDkgQEAKIAkJcF9zbG90LT5ocGNfb3BzLT5nZXRfbGF0Y2hfc3RhdHVzKHBfc2xvdCwgJmdldHN0YXR1cyk7CiAJfQogCi0JaWYgKHBfc2xvdCkKLQkJdXBkYXRlX3Nsb3RfaW5mbyhwX3Nsb3QpOworCXVwZGF0ZV9zbG90X2luZm8ocF9zbG90KTsKIAorCW11dGV4X3VubG9jaygmcF9zbG90LT5jdHJsLT5jcml0X3NlY3QpOwogCXJldHVybiByYzsKIH0KIApAQCAtODExLDcgKzgxOCw4IEBACiAJaWYgKCFIUF9TVVBSX1JNKHBfc2xvdC0+Y3RybC0+Y3RybGNhcCkpIHsJCiAJCXJldCA9IHBfc2xvdC0+aHBjX29wcy0+Z2V0X2FkYXB0ZXJfc3RhdHVzKHBfc2xvdCwgJmdldHN0YXR1cyk7CiAJCWlmIChyZXQgfHwgIWdldHN0YXR1cykgewotCQkJaW5mbygiJXM6IG5vIGFkYXB0ZXIgb24gc2xvdCgleClcbiIsIF9fRlVOQ1RJT05fXywgcF9zbG90LT5udW1iZXIpOworCQkJaW5mbygiJXM6IG5vIGFkYXB0ZXIgb24gc2xvdCglcylcbiIsIF9fRlVOQ1RJT05fXywKKwkJCSAgICAgc2xvdF9uYW1lKHBfc2xvdCkpOwogCQkJbXV0ZXhfdW5sb2NrKCZwX3Nsb3QtPmN0cmwtPmNyaXRfc2VjdCk7CiAJCQlyZXR1cm4gLUVOT0RFVjsKIAkJfQpAQCAtODIwLDcgKzgyOCw4IEBACiAJaWYgKE1STF9TRU5TKHBfc2xvdC0+Y3RybC0+Y3RybGNhcCkpIHsJCiAJCXJldCA9IHBfc2xvdC0+aHBjX29wcy0+Z2V0X2xhdGNoX3N0YXR1cyhwX3Nsb3QsICZnZXRzdGF0dXMpOwogCQlpZiAocmV0IHx8IGdldHN0YXR1cykgewotCQkJaW5mbygiJXM6IGxhdGNoIG9wZW4gb24gc2xvdCgleClcbiIsIF9fRlVOQ1RJT05fXywgcF9zbG90LT5udW1iZXIpOworCQkJaW5mbygiJXM6IGxhdGNoIG9wZW4gb24gc2xvdCglcylcbiIsIF9fRlVOQ1RJT05fXywKKwkJCSAgICAgc2xvdF9uYW1lKHBfc2xvdCkpOwogCQkJbXV0ZXhfdW5sb2NrKCZwX3Nsb3QtPmN0cmwtPmNyaXRfc2VjdCk7CiAJCQlyZXR1cm4gLUVOT0RFVjsKIAkJfQpAQCAtODI5LDE2ICs4MzgsMTcgQEAKIAlpZiAoUE9XRVJfQ1RSTChwX3Nsb3QtPmN0cmwtPmN0cmxjYXApKSB7CQogCQlyZXQgPSBwX3Nsb3QtPmhwY19vcHMtPmdldF9wb3dlcl9zdGF0dXMocF9zbG90LCAmZ2V0c3RhdHVzKTsKIAkJaWYgKHJldCB8fCAhZ2V0c3RhdHVzKSB7Ci0JCQlpbmZvKCIlczogYWxyZWFkeSBkaXNhYmxlZCBzbG90KCV4KVxuIiwgX19GVU5DVElPTl9fLCBwX3Nsb3QtPm51bWJlcik7CisJCQlpbmZvKCIlczogYWxyZWFkeSBkaXNhYmxlZCBzbG90KCVzKVxuIiwgX19GVU5DVElPTl9fLAorCQkJICAgICBzbG90X25hbWUocF9zbG90KSk7CiAJCQltdXRleF91bmxvY2soJnBfc2xvdC0+Y3RybC0+Y3JpdF9zZWN0KTsKIAkJCXJldHVybiAtRUlOVkFMOwogCQl9CiAJfQogCi0JbXV0ZXhfdW5sb2NrKCZwX3Nsb3QtPmN0cmwtPmNyaXRfc2VjdCk7Ci0KIAlyZXQgPSByZW1vdmVfYm9hcmQocF9zbG90KTsKIAl1cGRhdGVfc2xvdF9pbmZvKHBfc2xvdCk7CisKKwltdXRleF91bmxvY2soJnBfc2xvdC0+Y3RybC0+Y3JpdF9zZWN0KTsKIAlyZXR1cm4gcmV0OwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9ob3RwbHVnL3BjaWVocF9ocGMuYyBiL2RyaXZlcnMvcGNpL2hvdHBsdWcvcGNpZWhwX2hwYy5jCmluZGV4IDcwM2E2NGEuLjFjNTUxYzYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNpL2hvdHBsdWcvcGNpZWhwX2hwYy5jCisrKyBiL2RyaXZlcnMvcGNpL2hvdHBsdWcvcGNpZWhwX2hwYy5jCkBAIC0xNDAyLDYgKzE0MDIsOCBAQAogCQlwZGV2LT5zdWJzeXN0ZW1fdmVuZG9yLCBwZGV2LT5zdWJzeXN0ZW1fZGV2aWNlKTsKIAogCW11dGV4X2luaXQoJmN0cmwtPmNyaXRfc2VjdCk7CisJbXV0ZXhfaW5pdCgmY3RybC0+Y3RybF9sb2NrKTsKKwogCS8qIHNldHVwIHdhaXQgcXVldWUgKi8KIAlpbml0X3dhaXRxdWV1ZV9oZWFkKCZjdHJsLT5xdWV1ZSk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL2hvdHBsdWcvcGNpaHBfc2tlbGV0b24uYyBiL2RyaXZlcnMvcGNpL2hvdHBsdWcvcGNpaHBfc2tlbGV0b24uYwppbmRleCAyYjllMTBlLi41MGJjZDNmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjaS9ob3RwbHVnL3BjaWhwX3NrZWxldG9uLmMKKysrIGIvZHJpdmVycy9wY2kvaG90cGx1Zy9wY2locF9za2VsZXRvbi5jCkBAIC0zMyw4ICszMyw4IEBACiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaV9ob3RwbHVnLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgotI2luY2x1ZGUgInBjaV9ob3RwbHVnLmgiCiAKICNkZWZpbmUgU0xPVF9OQU1FX1NJWkUJMTAKIHN0cnVjdCBzbG90IHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL2hvdHBsdWcvcnBhZGxwYXJfc3lzZnMuYyBiL2RyaXZlcnMvcGNpL2hvdHBsdWcvcnBhZGxwYXJfc3lzZnMuYwppbmRleCBkYjY5YmU4Li42YzViZTNmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjaS9ob3RwbHVnL3JwYWRscGFyX3N5c2ZzLmMKKysrIGIvZHJpdmVycy9wY2kvaG90cGx1Zy9ycGFkbHBhcl9zeXNmcy5jCkBAIC0xNCw3ICsxNCw3IEBACiAgKi8KICNpbmNsdWRlIDxsaW51eC9rb2JqZWN0Lmg+CiAjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+Ci0jaW5jbHVkZSAicGNpX2hvdHBsdWcuaCIKKyNpbmNsdWRlIDxsaW51eC9wY2lfaG90cGx1Zy5oPgogI2luY2x1ZGUgInJwYWRscGFyLmgiCiAKICNkZWZpbmUgRExQQVJfS09CSl9OQU1FICAgICAgICJjb250cm9sIgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY2kvaG90cGx1Zy9ycGFwaHAuaCBiL2RyaXZlcnMvcGNpL2hvdHBsdWcvcnBhcGhwLmgKaW5kZXggMzEwYjYxOC4uMmU3YWNjZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY2kvaG90cGx1Zy9ycGFwaHAuaAorKysgYi9kcml2ZXJzL3BjaS9ob3RwbHVnL3JwYXBocC5oCkBAIC0yOCw3ICsyOCw3IEBACiAjZGVmaW5lIF9QUEM2NFBIUF9ICiAKICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KLSNpbmNsdWRlICJwY2lfaG90cGx1Zy5oIgorI2luY2x1ZGUgPGxpbnV4L3BjaV9ob3RwbHVnLmg+CiAKICNkZWZpbmUgRFJfSU5ESUNBVE9SIDkwMDIKICNkZWZpbmUgRFJfRU5USVRZX1NFTlNFIDkwMDMKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL2hvdHBsdWcvcnBhcGhwX2NvcmUuYyBiL2RyaXZlcnMvcGNpL2hvdHBsdWcvcnBhcGhwX2NvcmUuYwppbmRleCA3Mjg4YTNlLi4xNDE0ODZkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjaS9ob3RwbHVnL3JwYXBocF9jb3JlLmMKKysrIGIvZHJpdmVycy9wY2kvaG90cGx1Zy9ycGFwaHBfY29yZS5jCkBAIC0yNiw2ICsyNiw3IEBACiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2lfaG90cGx1Zy5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9zbXAuaD4KICNpbmNsdWRlIDxsaW51eC9zbXBfbG9jay5oPgpAQCAtMzYsNyArMzcsNiBAQAogI2luY2x1ZGUgIi4uL3BjaS5oIgkJLyogZm9yIHBjaV9hZGRfbmV3X2J1cyAqLwogCQkJCS8qIGFuZCBwY2lfZG9fc2Nhbl9idXMgKi8KICNpbmNsdWRlICJycGFwaHAuaCIKLSNpbmNsdWRlICJwY2lfaG90cGx1Zy5oIgogCiBpbnQgZGVidWc7CiBzdGF0aWMgc3RydWN0IHNlbWFwaG9yZSBycGFwaHBfc2VtOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY2kvaG90cGx1Zy9zZ2lfaG90cGx1Zy5jIGIvZHJpdmVycy9wY2kvaG90cGx1Zy9zZ2lfaG90cGx1Zy5jCmluZGV4IGYzMWQ4M2MuLmI2MmFkMzEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNpL2hvdHBsdWcvc2dpX2hvdHBsdWcuYworKysgYi9kcml2ZXJzL3BjaS9ob3RwbHVnL3NnaV9ob3RwbHVnLmMKQEAgLTEzLDYgKzEzLDcgQEAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2lfaG90cGx1Zy5oPgogI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CkBAIC0yOSw3ICszMCw2IEBACiAjaW5jbHVkZSA8YXNtL3NuL3R5cGVzLmg+CiAKICNpbmNsdWRlICIuLi9wY2kuaCIKLSNpbmNsdWRlICJwY2lfaG90cGx1Zy5oIgogCiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CiBNT0RVTEVfQVVUSE9SKCJTR0kgKHByYXJpdEBzZ2kuY29tLCBkaWNraWVAc2dpLmNvbSwgaGFiZWNrQHNnaS5jb20pIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9ob3RwbHVnL3NocGNocC5oIGIvZHJpdmVycy9wY2kvaG90cGx1Zy9zaHBjaHAuaAppbmRleCBjNzEwM2FjLi5lYTIwODdjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjaS9ob3RwbHVnL3NocGNocC5oCisrKyBiL2RyaXZlcnMvcGNpL2hvdHBsdWcvc2hwY2hwLmgKQEAgLTMxLDEyICszMSwxMSBAQAogCiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2lfaG90cGx1Zy5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4JLyogc2lnbmFsX3BlbmRpbmcoKSwgc3RydWN0IHRpbWVyX2xpc3QgKi8KICNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgogCi0jaW5jbHVkZSAicGNpX2hvdHBsdWcuaCIKLQogI2lmICFkZWZpbmVkKE1PRFVMRSkKIAkjZGVmaW5lIE1ZX05BTUUJInNocGNocCIKICNlbHNlCkBAIC0xMDMsNyArMTAyLDYgQEAKIAl1MzIgY2FwX29mZnNldDsKIAl1bnNpZ25lZCBsb25nIG1taW9fYmFzZTsKIAl1bnNpZ25lZCBsb25nIG1taW9fc2l6ZTsKLQl2b2xhdGlsZSBpbnQgY21kX2J1c3k7CiB9OwogCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL2hvdHBsdWcvc2hwY2hwX2hwYy5jIGIvZHJpdmVycy9wY2kvaG90cGx1Zy9zaHBjaHBfaHBjLmMKaW5kZXggNGQ4YWVlMS4uODNhNTIyNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY2kvaG90cGx1Zy9zaHBjaHBfaHBjLmMKKysrIGIvZHJpdmVycy9wY2kvaG90cGx1Zy9zaHBjaHBfaHBjLmMKQEAgLTMwMiwyMSArMzAyLDUxIEBACiAJYWRkX3RpbWVyKCZwaHBfY3Rsci0+aW50X3BvbGxfdGltZXIpOwogfQogCitzdGF0aWMgaW5saW5lIGludCBpc19jdHJsX2J1c3koc3RydWN0IGNvbnRyb2xsZXIgKmN0cmwpCit7CisJdTE2IGNtZF9zdGF0dXMgPSBzaHBjX3JlYWR3KGN0cmwsIENNRF9TVEFUVVMpOworCXJldHVybiBjbWRfc3RhdHVzICYgMHgxOworfQorCisvKgorICogUmV0dXJucyAxIGlmIFNIUEMgZmluaXNoZXMgZXhlY3V0aW5nIGEgY29tbWFuZCB3aXRoaW4gMSBzZWMsCisgKiBvdGhlcndpc2UgcmV0dXJucyAwLgorICovCitzdGF0aWMgaW5saW5lIGludCBzaHBjX3BvbGxfY3RybF9idXN5KHN0cnVjdCBjb250cm9sbGVyICpjdHJsKQoreworCWludCBpOworCisJaWYgKCFpc19jdHJsX2J1c3koY3RybCkpCisJCXJldHVybiAxOworCisJLyogQ2hlY2sgZXZlcnkgMC4xIHNlYyBmb3IgYSB0b3RhbCBvZiAxIHNlYyAqLworCWZvciAoaSA9IDA7IGkgPCAxMDsgaSsrKSB7CisJCW1zbGVlcCgxMDApOworCQlpZiAoIWlzX2N0cmxfYnVzeShjdHJsKSkKKwkJCXJldHVybiAxOworCX0KKworCXJldHVybiAwOworfQorCiBzdGF0aWMgaW5saW5lIGludCBzaHBjX3dhaXRfY21kKHN0cnVjdCBjb250cm9sbGVyICpjdHJsKQogewogCWludCByZXR2YWwgPSAwOwotCXVuc2lnbmVkIGludCB0aW1lb3V0X21zZWMgPSBzaHBjaHBfcG9sbF9tb2RlID8gMjAwMCA6IDEwMDA7Ci0JdW5zaWduZWQgbG9uZyB0aW1lb3V0ID0gbXNlY3NfdG9famlmZmllcyh0aW1lb3V0X21zZWMpOwotCWludCByYyA9IHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZV90aW1lb3V0KGN0cmwtPnF1ZXVlLAotCQkJCQkJICAhY3RybC0+Y21kX2J1c3ksIHRpbWVvdXQpOwotCWlmICghcmMpIHsKKwl1bnNpZ25lZCBsb25nIHRpbWVvdXQgPSBtc2Vjc190b19qaWZmaWVzKDEwMDApOworCWludCByYzsKKworCWlmIChzaHBjaHBfcG9sbF9tb2RlKQorCQlyYyA9IHNocGNfcG9sbF9jdHJsX2J1c3koY3RybCk7CisJZWxzZQorCQlyYyA9IHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZV90aW1lb3V0KGN0cmwtPnF1ZXVlLAorCQkJCQkJIWlzX2N0cmxfYnVzeShjdHJsKSwgdGltZW91dCk7CisJaWYgKCFyYyAmJiBpc19jdHJsX2J1c3koY3RybCkpIHsKIAkJcmV0dmFsID0gLUVJTzsKLQkJZXJyKCJDb21tYW5kIG5vdCBjb21wbGV0ZWQgaW4gJWQgbXNlY1xuIiwgdGltZW91dF9tc2VjKTsKKwkJZXJyKCJDb21tYW5kIG5vdCBjb21wbGV0ZWQgaW4gMTAwMCBtc2VjXG4iKTsKIAl9IGVsc2UgaWYgKHJjIDwgMCkgewogCQlyZXR2YWwgPSAtRUlOVFI7CiAJCWluZm8oIkNvbW1hbmQgd2FzIGludGVycnVwdGVkIGJ5IGEgc2lnbmFsXG4iKTsKIAl9Ci0JY3RybC0+Y21kX2J1c3kgPSAwOwogCiAJcmV0dXJuIHJldHZhbDsKIH0KQEAgLTMyNywyNiArMzU3LDE1IEBACiAJdTE2IGNtZF9zdGF0dXM7CiAJaW50IHJldHZhbCA9IDA7CiAJdTE2IHRlbXBfd29yZDsKLQlpbnQgaTsKIAogCURCR19FTlRFUl9ST1VUSU5FIAogCiAJbXV0ZXhfbG9jaygmc2xvdC0+Y3RybC0+Y21kX2xvY2spOwogCi0JZm9yIChpID0gMDsgaSA8IDEwOyBpKyspIHsKLQkJY21kX3N0YXR1cyA9IHNocGNfcmVhZHcoY3RybCwgQ01EX1NUQVRVUyk7Ci0JCQotCQlpZiAoIShjbWRfc3RhdHVzICYgMHgxKSkKLQkJCWJyZWFrOwotCQkvKiAgQ2hlY2sgZXZlcnkgMC4xIHNlYyBmb3IgYSB0b3RhbCBvZiAxIHNlYyovCi0JCW1zbGVlcCgxMDApOwotCX0KLQotCWNtZF9zdGF0dXMgPSBzaHBjX3JlYWR3KGN0cmwsIENNRF9TVEFUVVMpOwotCQotCWlmIChjbWRfc3RhdHVzICYgMHgxKSB7IAorCWlmICghc2hwY19wb2xsX2N0cmxfYnVzeShjdHJsKSkgewogCQkvKiBBZnRlciAxIHNlYyBhbmQgYW5kIHRoZSBjb250cm9sbGVyIGlzIHN0aWxsIGJ1c3kgKi8KLQkJZXJyKCIlcyA6IENvbnRyb2xsZXIgaXMgc3RpbGwgYnVzeSBhZnRlciAxIHNlYy5cbiIsIF9fRlVOQ1RJT05fXyk7CisJCWVycigiJXMgOiBDb250cm9sbGVyIGlzIHN0aWxsIGJ1c3kgYWZ0ZXIgMSBzZWMuXG4iLAorCQkgICAgX19GVU5DVElPTl9fKTsKIAkJcmV0dmFsID0gLUVCVVNZOwogCQlnb3RvIG91dDsKIAl9CkBAIC0zNTgsNyArMzc3LDYgQEAKIAkvKiBUbyBtYWtlIHN1cmUgdGhlIENvbnRyb2xsZXIgQnVzeSBiaXQgaXMgMCBiZWZvcmUgd2Ugc2VuZCBvdXQgdGhlCiAJICogY29tbWFuZC4gCiAJICovCi0Jc2xvdC0+Y3RybC0+Y21kX2J1c3kgPSAxOwogCXNocGNfd3JpdGV3KGN0cmwsIENNRCwgdGVtcF93b3JkKTsKIAogCS8qCkBAIC05MDgsNyArOTI2LDYgQEAKIAkJc2Vycl9pbnQgJj0gflNFUlJfSU5UUl9SU1ZEWl9NQVNLOwogCQlzaHBjX3dyaXRlbChjdHJsLCBTRVJSX0lOVFJfRU5BQkxFLCBzZXJyX2ludCk7CiAKLQkJY3RybC0+Y21kX2J1c3kgPSAwOwogCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJmN0cmwtPnF1ZXVlKTsKIAl9CiAKQEAgLTExMDEsNyArMTExOCw3IEBACiB7CiAJc3RydWN0IHBocF9jdGxyX3N0YXRlX3MgKnBocF9jdGxyLCAqcDsKIAl2b2lkICppbnN0YW5jZV9pZCA9IGN0cmw7Ci0JaW50IHJjLCBudW1fc2xvdHMgPSAwOworCWludCByYyA9IC0xLCBudW1fc2xvdHMgPSAwOwogCXU4IGhwX3Nsb3Q7CiAJdTMyIHNocGNfYmFzZV9vZmZzZXQ7CiAJdTMyIHRlbXBkd29yZCwgc2xvdF9yZWcsIHNsb3RfY29uZmlnOwpAQCAtMTE2NywxMSArMTE4NCwxNSBAQAogCWluZm8oIkhQQyB2ZW5kb3JfaWQgJXggZGV2aWNlX2lkICV4IHNzX3ZpZCAleCBzc19kaWQgJXhcbiIsIHBkZXYtPnZlbmRvciwgcGRldi0+ZGV2aWNlLCBwZGV2LT5zdWJzeXN0ZW1fdmVuZG9yLCAKIAkJcGRldi0+c3Vic3lzdGVtX2RldmljZSk7CiAJCi0JaWYgKHBjaV9lbmFibGVfZGV2aWNlKHBkZXYpKQorCXJjID0gcGNpX2VuYWJsZV9kZXZpY2UocGRldik7CisJaWYgKHJjKSB7CisJCWVycigiJXM6IHBjaV9lbmFibGVfZGV2aWNlIGZhaWxlZFxuIiwgX19GVU5DVElPTl9fKTsKIAkJZ290byBhYm9ydF9mcmVlX2N0bHI7CisJfQogCiAJaWYgKCFyZXF1ZXN0X21lbV9yZWdpb24oY3RybC0+bW1pb19iYXNlLCBjdHJsLT5tbWlvX3NpemUsIE1ZX05BTUUpKSB7CiAJCWVycigiJXM6IGNhbm5vdCByZXNlcnZlIE1NSU8gcmVnaW9uXG4iLCBfX0ZVTkNUSU9OX18pOworCQlyYyA9IC0xOwogCQlnb3RvIGFib3J0X2ZyZWVfY3RscjsKIAl9CiAKQEAgLTExODAsNiArMTIwMSw3IEBACiAJCWVycigiJXM6IGNhbm5vdCByZW1hcCBNTUlPIHJlZ2lvbiAlbHggQCAlbHhcbiIsIF9fRlVOQ1RJT05fXywKIAkJICAgIGN0cmwtPm1taW9fc2l6ZSwgY3RybC0+bW1pb19iYXNlKTsKIAkJcmVsZWFzZV9tZW1fcmVnaW9uKGN0cmwtPm1taW9fYmFzZSwgY3RybC0+bW1pb19zaXplKTsKKwkJcmMgPSAtMTsKIAkJZ290byBhYm9ydF9mcmVlX2N0bHI7CiAJfQogCWRiZygiJXM6IHBocF9jdGxyLT5jcmVnICVwXG4iLCBfX0ZVTkNUSU9OX18sIHBocF9jdGxyLT5jcmVnKTsKQEAgLTEyODIsOCArMTMwNCwxMCBAQAogCSAqLwogCWlmIChhdG9taWNfYWRkX3JldHVybigxLCAmc2hwY2hwX251bV9jb250cm9sbGVycykgPT0gMSkgewogCQlzaHBjaHBfd3EgPSBjcmVhdGVfc2luZ2xldGhyZWFkX3dvcmtxdWV1ZSgic2hwY2hwZCIpOwotCQlpZiAoIXNocGNocF93cSkKLQkJCXJldHVybiAtRU5PTUVNOworCQlpZiAoIXNocGNocF93cSkgeworCQkJcmMgPSAtRU5PTUVNOworCQkJZ290byBhYm9ydF9mcmVlX2N0bHI7CisJCX0KIAl9CiAKIAkvKgpAQCAtMTMxMyw4ICsxMzM3LDEwIEBACiAKIAkvKiBXZSBlbmQgdXAgaGVyZSBmb3IgdGhlIG1hbnkgcG9zc2libGUgd2F5cyB0byBmYWlsIHRoaXMgQVBJLiAgKi8KIGFib3J0X2ZyZWVfY3RscjoKKwlpZiAocGhwX2N0bHItPmNyZWcpCisJCWlvdW5tYXAocGhwX2N0bHItPmNyZWcpOwogCWtmcmVlKHBocF9jdGxyKTsKIGFib3J0OgogCURCR19MRUFWRV9ST1VUSU5FCi0JcmV0dXJuIC0xOworCXJldHVybiByYzsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL2h0aXJxLmMgYi9kcml2ZXJzL3BjaS9odGlycS5jCmluZGV4IDBlMjdmMjQuLjBhOGQxY2MgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNpL2h0aXJxLmMKKysrIGIvZHJpdmVycy9wY2kvaHRpcnEuYwpAQCAtMjUsOTcgKzI1LDcyIEBACiAKIHN0cnVjdCBodF9pcnFfY2ZnIHsKIAlzdHJ1Y3QgcGNpX2RldiAqZGV2OworCSAvKiBVcGRhdGUgY2FsbGJhY2sgdXNlZCB0byBjb3BlIHdpdGggYnVnZ3kgaGFyZHdhcmUgKi8KKwlodF9pcnFfdXBkYXRlX3QgKnVwZGF0ZTsKIAl1bnNpZ25lZCBwb3M7CiAJdW5zaWduZWQgaWR4OworCXN0cnVjdCBodF9pcnFfbXNnIG1zZzsKIH07CiAKLXZvaWQgd3JpdGVfaHRfaXJxX2xvdyh1bnNpZ25lZCBpbnQgaXJxLCB1MzIgZGF0YSkKKwordm9pZCB3cml0ZV9odF9pcnFfbXNnKHVuc2lnbmVkIGludCBpcnEsIHN0cnVjdCBodF9pcnFfbXNnICptc2cpCiB7CiAJc3RydWN0IGh0X2lycV9jZmcgKmNmZyA9IGdldF9pcnFfZGF0YShpcnEpOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJc3Bpbl9sb2NrX2lycXNhdmUoJmh0X2lycV9sb2NrLCBmbGFncyk7Ci0JcGNpX3dyaXRlX2NvbmZpZ19ieXRlKGNmZy0+ZGV2LCBjZmctPnBvcyArIDIsIGNmZy0+aWR4KTsKLQlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKGNmZy0+ZGV2LCBjZmctPnBvcyArIDQsIGRhdGEpOworCWlmIChjZmctPm1zZy5hZGRyZXNzX2xvICE9IG1zZy0+YWRkcmVzc19sbykgeworCQlwY2lfd3JpdGVfY29uZmlnX2J5dGUoY2ZnLT5kZXYsIGNmZy0+cG9zICsgMiwgY2ZnLT5pZHgpOworCQlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKGNmZy0+ZGV2LCBjZmctPnBvcyArIDQsIG1zZy0+YWRkcmVzc19sbyk7CisJfQorCWlmIChjZmctPm1zZy5hZGRyZXNzX2hpICE9IG1zZy0+YWRkcmVzc19oaSkgeworCQlwY2lfd3JpdGVfY29uZmlnX2J5dGUoY2ZnLT5kZXYsIGNmZy0+cG9zICsgMiwgY2ZnLT5pZHggKyAxKTsKKwkJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChjZmctPmRldiwgY2ZnLT5wb3MgKyA0LCBtc2ctPmFkZHJlc3NfaGkpOworCX0KKwlpZiAoY2ZnLT51cGRhdGUpCisJCWNmZy0+dXBkYXRlKGNmZy0+ZGV2LCBpcnEsIG1zZyk7CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaHRfaXJxX2xvY2ssIGZsYWdzKTsKKwljZmctPm1zZyA9ICptc2c7CiB9CiAKLXZvaWQgd3JpdGVfaHRfaXJxX2hpZ2godW5zaWduZWQgaW50IGlycSwgdTMyIGRhdGEpCit2b2lkIGZldGNoX2h0X2lycV9tc2codW5zaWduZWQgaW50IGlycSwgc3RydWN0IGh0X2lycV9tc2cgKm1zZykKIHsKIAlzdHJ1Y3QgaHRfaXJxX2NmZyAqY2ZnID0gZ2V0X2lycV9kYXRhKGlycSk7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQlzcGluX2xvY2tfaXJxc2F2ZSgmaHRfaXJxX2xvY2ssIGZsYWdzKTsKLQlwY2lfd3JpdGVfY29uZmlnX2J5dGUoY2ZnLT5kZXYsIGNmZy0+cG9zICsgMiwgY2ZnLT5pZHggKyAxKTsKLQlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKGNmZy0+ZGV2LCBjZmctPnBvcyArIDQsIGRhdGEpOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmh0X2lycV9sb2NrLCBmbGFncyk7Ci19Ci0KLXUzMiByZWFkX2h0X2lycV9sb3codW5zaWduZWQgaW50IGlycSkKLXsKLQlzdHJ1Y3QgaHRfaXJxX2NmZyAqY2ZnID0gZ2V0X2lycV9kYXRhKGlycSk7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQl1MzIgZGF0YTsKLQlzcGluX2xvY2tfaXJxc2F2ZSgmaHRfaXJxX2xvY2ssIGZsYWdzKTsKLQlwY2lfd3JpdGVfY29uZmlnX2J5dGUoY2ZnLT5kZXYsIGNmZy0+cG9zICsgMiwgY2ZnLT5pZHgpOwotCXBjaV9yZWFkX2NvbmZpZ19kd29yZChjZmctPmRldiwgY2ZnLT5wb3MgKyA0LCAmZGF0YSk7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaHRfaXJxX2xvY2ssIGZsYWdzKTsKLQlyZXR1cm4gZGF0YTsKLX0KLQotdTMyIHJlYWRfaHRfaXJxX2hpZ2godW5zaWduZWQgaW50IGlycSkKLXsKLQlzdHJ1Y3QgaHRfaXJxX2NmZyAqY2ZnID0gZ2V0X2lycV9kYXRhKGlycSk7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQl1MzIgZGF0YTsKLQlzcGluX2xvY2tfaXJxc2F2ZSgmaHRfaXJxX2xvY2ssIGZsYWdzKTsKLQlwY2lfd3JpdGVfY29uZmlnX2J5dGUoY2ZnLT5kZXYsIGNmZy0+cG9zICsgMiwgY2ZnLT5pZHggKyAxKTsKLQlwY2lfcmVhZF9jb25maWdfZHdvcmQoY2ZnLT5kZXYsIGNmZy0+cG9zICsgNCwgJmRhdGEpOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmh0X2lycV9sb2NrLCBmbGFncyk7Ci0JcmV0dXJuIGRhdGE7CisJKm1zZyA9IGNmZy0+bXNnOwogfQogCiB2b2lkIG1hc2tfaHRfaXJxKHVuc2lnbmVkIGludCBpcnEpCiB7CiAJc3RydWN0IGh0X2lycV9jZmcgKmNmZzsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCXUzMiBkYXRhOworCXN0cnVjdCBodF9pcnFfbXNnIG1zZzsKIAogCWNmZyA9IGdldF9pcnFfZGF0YShpcnEpOwogCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmh0X2lycV9sb2NrLCBmbGFncyk7Ci0JcGNpX3dyaXRlX2NvbmZpZ19ieXRlKGNmZy0+ZGV2LCBjZmctPnBvcyArIDIsIGNmZy0+aWR4KTsKLQlwY2lfcmVhZF9jb25maWdfZHdvcmQoY2ZnLT5kZXYsIGNmZy0+cG9zICsgNCwgJmRhdGEpOwotCWRhdGEgfD0gMTsKLQlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKGNmZy0+ZGV2LCBjZmctPnBvcyArIDQsIGRhdGEpOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmh0X2lycV9sb2NrLCBmbGFncyk7CisJbXNnID0gY2ZnLT5tc2c7CisJbXNnLmFkZHJlc3NfbG8gfD0gMTsKKwl3cml0ZV9odF9pcnFfbXNnKGlycSwgJm1zZyk7CiB9CiAKIHZvaWQgdW5tYXNrX2h0X2lycSh1bnNpZ25lZCBpbnQgaXJxKQogewogCXN0cnVjdCBodF9pcnFfY2ZnICpjZmc7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQl1MzIgZGF0YTsKKwlzdHJ1Y3QgaHRfaXJxX21zZyBtc2c7CiAKIAljZmcgPSBnZXRfaXJxX2RhdGEoaXJxKTsKIAotCXNwaW5fbG9ja19pcnFzYXZlKCZodF9pcnFfbG9jaywgZmxhZ3MpOwotCXBjaV93cml0ZV9jb25maWdfYnl0ZShjZmctPmRldiwgY2ZnLT5wb3MgKyAyLCBjZmctPmlkeCk7Ci0JcGNpX3JlYWRfY29uZmlnX2R3b3JkKGNmZy0+ZGV2LCBjZmctPnBvcyArIDQsICZkYXRhKTsKLQlkYXRhICY9IH4xOwotCXBjaV93cml0ZV9jb25maWdfZHdvcmQoY2ZnLT5kZXYsIGNmZy0+cG9zICsgNCwgZGF0YSk7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaHRfaXJxX2xvY2ssIGZsYWdzKTsKKwltc2cgPSBjZmctPm1zZzsKKwltc2cuYWRkcmVzc19sbyAmPSB+MTsKKwl3cml0ZV9odF9pcnFfbXNnKGlycSwgJm1zZyk7CiB9CiAKIC8qKgotICogaHRfY3JlYXRlX2lycSAtIGNyZWF0ZSBhbiBpcnEgYW5kIGF0dGFjaCBpdCB0byBhIGRldmljZS4KKyAqIF9faHRfY3JlYXRlX2lycSAtIGNyZWF0ZSBhbiBpcnEgYW5kIGF0dGFjaCBpdCB0byBhIGRldmljZS4KICAqIEBkZXY6IFRoZSBoeXBlcnRyYW5zcG9ydCBkZXZpY2UgdG8gZmluZCB0aGUgaXJxIGNhcGFiaWxpdHkgb24uCiAgKiBAaWR4OiBXaGljaCBvZiB0aGUgcG9zc2libGUgaXJxcyB0byBhdHRhY2ggdG8uCi0gKgotICogaHRfY3JlYXRlX2lycSBpcyBuZWVkcyB0byBiZSBjYWxsZWQgZm9yIGFsbCBoeXBlcnRyYW5zcG9ydCBkZXZpY2VzCi0gKiB0aGF0IGdlbmVyYXRlIGlycXMuCisgKiBAdXBkYXRlOiBGdW5jdGlvbiB0byBiZSBjYWxsZWQgd2hlbiBjaGFuZ2luZyB0aGUgaHRpcnEgbWVzc2FnZQogICoKICAqIFRoZSBpcnEgbnVtYmVyIG9mIHRoZSBuZXcgaXJxIG9yIGEgbmVnYXRpdmUgZXJyb3IgdmFsdWUgaXMgcmV0dXJuZWQuCiAgKi8KLWludCBodF9jcmVhdGVfaXJxKHN0cnVjdCBwY2lfZGV2ICpkZXYsIGludCBpZHgpCitpbnQgX19odF9jcmVhdGVfaXJxKHN0cnVjdCBwY2lfZGV2ICpkZXYsIGludCBpZHgsIGh0X2lycV91cGRhdGVfdCAqdXBkYXRlKQogewogCXN0cnVjdCBodF9pcnFfY2ZnICpjZmc7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKQEAgLTE1MCw4ICsxMjUsMTIgQEAKIAkJcmV0dXJuIC1FTk9NRU07CiAKIAljZmctPmRldiA9IGRldjsKKwljZmctPnVwZGF0ZSA9IHVwZGF0ZTsKIAljZmctPnBvcyA9IHBvczsKIAljZmctPmlkeCA9IDB4MTAgKyAoaWR4ICogMik7CisJLyogSW5pdGlhbGl6ZSBtc2cgdG8gYSB2YWx1ZSB0aGF0IHdpbGwgbmV2ZXIgbWF0Y2ggdGhlIGZpcnN0IHdyaXRlLiAqLworCWNmZy0+bXNnLmFkZHJlc3NfbG8gPSAweGZmZmZmZmZmOworCWNmZy0+bXNnLmFkZHJlc3NfaGkgPSAweGZmZmZmZmZmOwogCiAJaXJxID0gY3JlYXRlX2lycSgpOwogCWlmIChpcnEgPCAwKSB7CkBAIC0xNjksNiArMTQ4LDIxIEBACiB9CiAKIC8qKgorICogaHRfY3JlYXRlX2lycSAtIGNyZWF0ZSBhbiBpcnEgYW5kIGF0dGFjaCBpdCB0byBhIGRldmljZS4KKyAqIEBkZXY6IFRoZSBoeXBlcnRyYW5zcG9ydCBkZXZpY2UgdG8gZmluZCB0aGUgaXJxIGNhcGFiaWxpdHkgb24uCisgKiBAaWR4OiBXaGljaCBvZiB0aGUgcG9zc2libGUgaXJxcyB0byBhdHRhY2ggdG8uCisgKgorICogaHRfY3JlYXRlX2lycSBuZWVkcyB0byBiZSBjYWxsZWQgZm9yIGFsbCBoeXBlcnRyYW5zcG9ydCBkZXZpY2VzCisgKiB0aGF0IGdlbmVyYXRlIGlycXMuCisgKgorICogVGhlIGlycSBudW1iZXIgb2YgdGhlIG5ldyBpcnEgb3IgYSBuZWdhdGl2ZSBlcnJvciB2YWx1ZSBpcyByZXR1cm5lZC4KKyAqLworaW50IGh0X2NyZWF0ZV9pcnEoc3RydWN0IHBjaV9kZXYgKmRldiwgaW50IGlkeCkKK3sKKwlyZXR1cm4gX19odF9jcmVhdGVfaXJxKGRldiwgaWR4LCBOVUxMKTsKK30KKworLyoqCiAgKiBodF9kZXN0cm95X2lycSAtIGRlc3Ryb3kgYW4gaXJxIGNyZWF0ZWQgd2l0aCBodF9jcmVhdGVfaXJxCiAgKgogICogVGhpcyByZXZlcnNlcyBodF9jcmVhdGVfaXJxIHJlbW92aW5nIHRoZSBzcGVjaWZpZWQgaXJxIGZyb20KQEAgLTE4Niw1ICsxODAsNiBAQAogCWtmcmVlKGNmZyk7CiB9CiAKK0VYUE9SVF9TWU1CT0woX19odF9jcmVhdGVfaXJxKTsKIEVYUE9SVF9TWU1CT0woaHRfY3JlYXRlX2lycSk7CiBFWFBPUlRfU1lNQk9MKGh0X2Rlc3Ryb3lfaXJxKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL21zaS5jIGIvZHJpdmVycy9wY2kvbXNpLmMKaW5kZXggZjlmZGM1NC4uOWZjOWEzNGUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNpL21zaS5jCisrKyBiL2RyaXZlcnMvcGNpL21zaS5jCkBAIC02MjcsMjIgKzYyNywyNCBAQAogICogcGNpX21zaV9zdXBwb3J0ZWQgLSBjaGVjayB3aGV0aGVyIE1TSSBtYXkgYmUgZW5hYmxlZCBvbiBkZXZpY2UKICAqIEBkZXY6IHBvaW50ZXIgdG8gdGhlIHBjaV9kZXYgZGF0YSBzdHJ1Y3R1cmUgb2YgTVNJIGRldmljZSBmdW5jdGlvbgogICoKLSAqIE1TSSBtdXN0IGJlIGdsb2JhbGx5IGVuYWJsZWQgYW5kIHN1cHBvcnRlZCBieSB0aGUgZGV2aWNlIGFuZCBpdHMgcm9vdAotICogYnVzLiBCdXQsIHRoZSByb290IGJ1cyBpcyBub3QgZWFzeSB0byBmaW5kIHNpbmNlIHNvbWUgYXJjaGl0ZWN0dXJlcwotICogaGF2ZSB2aXJ0dWFsIGJ1c3NlcyBvbiB0b3Agb2YgdGhlIFBDSSBoaWVyYXJjaHkgKGZvciBpbnN0YW5jZSB0aGUKLSAqIGh5cGVydHJhbnNwb3J0IGJ1cyksIHdoaWxlIHRoZSBhY3R1YWwgYnVzIHdoZXJlIE1TSSBtdXN0IGJlIHN1cHBvcnRlZAotICogaXMgYmVsb3cuIFNvIHdlIHRlc3QgdGhlIE1TSSBmbGFnIG9uIGFsbCBwYXJlbnQgYnVzc2VzIGFuZCBhc3N1bWUKLSAqIHRoYXQgbm8gcXVpcmsgd2lsbCBldmVyIHNldCB0aGUgTk9fTVNJIGZsYWcgb24gYSBub24tcm9vdCBidXMuCisgKiBMb29rIGF0IGdsb2JhbCBmbGFncywgdGhlIGRldmljZSBpdHNlbGYsIGFuZCBpdHMgcGFyZW50IGJ1c3NlcworICogdG8gcmV0dXJuIDAgaWYgTVNJIGFyZSBzdXBwb3J0ZWQgZm9yIHRoZSBkZXZpY2UuCiAgKiovCiBzdGF0aWMKIGludCBwY2lfbXNpX3N1cHBvcnRlZChzdHJ1Y3QgcGNpX2RldiAqIGRldikKIHsKIAlzdHJ1Y3QgcGNpX2J1cyAqYnVzOwogCisJLyogTVNJIG11c3QgYmUgZ2xvYmFsbHkgZW5hYmxlZCBhbmQgc3VwcG9ydGVkIGJ5IHRoZSBkZXZpY2UgKi8KIAlpZiAoIXBjaV9tc2lfZW5hYmxlIHx8ICFkZXYgfHwgZGV2LT5ub19tc2kpCiAJCXJldHVybiAtRUlOVkFMOwogCi0JLyogY2hlY2sgTVNJIGZsYWdzIG9mIGFsbCBwYXJlbnQgYnVzc2VzICovCisJLyogQW55IGJyaWRnZSB3aGljaCBkb2VzIE5PVCByb3V0ZSBNU0kgdHJhbnNhY3Rpb25zIGZyb20gaXQncworCSAqIHNlY29uZGFyeSBidXMgdG8gaXQncyBwcmltYXJ5IGJ1cyBtdXN0IHNldCBOT19NU0kgZmxhZyBvbgorCSAqIHRoZSBzZWNvbmRhcnkgcGNpX2J1cy4KKwkgKiBXZSBleHBlY3Qgb25seSBhcmNoLXNwZWNpZmljIFBDSSBob3N0IGJ1cyBjb250cm9sbGVyIGRyaXZlcgorCSAqIG9yIHF1aXJrcyBmb3Igc3BlY2lmaWMgUENJIGJyaWRnZXMgdG8gYmUgc2V0dGluZyBOT19NU0kuCisJICovCiAJZm9yIChidXMgPSBkZXYtPmJ1czsgYnVzOyBidXMgPSBidXMtPnBhcmVudCkKIAkJaWYgKGJ1cy0+YnVzX2ZsYWdzICYgUENJX0JVU19GTEFHU19OT19NU0kpCiAJCQlyZXR1cm4gLUVJTlZBTDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL3BjaS1kcml2ZXIuYyBiL2RyaXZlcnMvcGNpL3BjaS1kcml2ZXIuYwppbmRleCBiMWMwYzcwLi4xOTRmMWQyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjaS9wY2ktZHJpdmVyLmMKKysrIGIvZHJpdmVycy9wY2kvcGNpLWRyaXZlci5jCkBAIC0yNjUsNiArMjY1LDEzIEBACiAJfQogCiAJLyoKKwkgKiBJZiB0aGUgZGV2aWNlIGlzIHN0aWxsIG9uLCBzZXQgdGhlIHBvd2VyIHN0YXRlIGFzICJ1bmtub3duIiwKKwkgKiBzaW5jZSBpdCBtaWdodCBjaGFuZ2UgYnkgdGhlIG5leHQgdGltZSB3ZSBsb2FkIHRoZSBkcml2ZXIuCisJICovCisJaWYgKHBjaV9kZXYtPmN1cnJlbnRfc3RhdGUgPT0gUENJX0QwKQorCQlwY2lfZGV2LT5jdXJyZW50X3N0YXRlID0gUENJX1VOS05PV047CisKKwkvKgogCSAqIFdlIHdvdWxkIGxvdmUgdG8gY29tcGxhaW4gaGVyZSBpZiBwY2lfZGV2LT5pc19lbmFibGVkIGlzIHNldCwgdGhhdAogCSAqIHRoZSBkcml2ZXIgc2hvdWxkIGhhdmUgY2FsbGVkIHBjaV9kaXNhYmxlX2RldmljZSgpLCBidXQgdGhlCiAJICogdW5mb3J0dW5hdGUgZmFjdCBpcyB0aGVyZSBhcmUgdG9vIG1hbnkgb2RkIEJJT1MgYW5kIGJyaWRnZSBzZXR1cHMKQEAgLTI4OCw2ICsyOTUsMTIgQEAKIAkJc3VzcGVuZF9yZXBvcnRfcmVzdWx0KGRydi0+c3VzcGVuZCwgaSk7CiAJfSBlbHNlIHsKIAkJcGNpX3NhdmVfc3RhdGUocGNpX2Rldik7CisJCS8qCisJCSAqIG1hcmsgaXRzIHBvd2VyIHN0YXRlIGFzICJ1bmtub3duIiwgc2luY2Ugd2UgZG9uJ3Qga25vdyBpZgorCQkgKiBlLmcuIHRoZSBCSU9TIHdpbGwgY2hhbmdlIGl0cyBkZXZpY2Ugc3RhdGUgd2hlbiB3ZSBzdXNwZW5kLgorCQkgKi8KKwkJaWYgKHBjaV9kZXYtPmN1cnJlbnRfc3RhdGUgPT0gUENJX0QwKQorCQkJcGNpX2Rldi0+Y3VycmVudF9zdGF0ZSA9IFBDSV9VTktOT1dOOwogCX0KIAlyZXR1cm4gaTsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL3BjaS1zeXNmcy5jIGIvZHJpdmVycy9wY2kvcGNpLXN5c2ZzLmMKaW5kZXggYTFkMmU5Ny4uZjk1MmJmZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY2kvcGNpLXN5c2ZzLmMKKysrIGIvZHJpdmVycy9wY2kvcGNpLXN5c2ZzLmMKQEAgLTY0Miw2ICs2NDIsOSBAQAogICovCiB2b2lkIHBjaV9yZW1vdmVfc3lzZnNfZGV2X2ZpbGVzKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQogeworCWlmICghc3lzZnNfaW5pdGlhbGl6ZWQpCisJCXJldHVybjsKKwogCWlmIChwZGV2LT5jZmdfc2l6ZSA8IDQwOTYpCiAJCXN5c2ZzX3JlbW92ZV9iaW5fZmlsZSgmcGRldi0+ZGV2LmtvYmosICZwY2lfY29uZmlnX2F0dHIpOwogCWVsc2UKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL3BjaWUvcG9ydGRydi5oIGIvZHJpdmVycy9wY2kvcGNpZS9wb3J0ZHJ2LmgKaW5kZXggNjdmY2QxNy4uMzY1NmUwMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY2kvcGNpZS9wb3J0ZHJ2LmgKKysrIGIvZHJpdmVycy9wY2kvcGNpZS9wb3J0ZHJ2LmgKQEAgLTksNiArOSw4IEBACiAjaWZuZGVmIF9QT1JURFJWX0hfCiAjZGVmaW5lIF9QT1JURFJWX0hfCiAKKyNpbmNsdWRlIDxsaW51eC9jb21waWxlci5oPgorCiAjaWYgIWRlZmluZWQoUENJX0NBUF9JRF9QTUUpCiAjZGVmaW5lIFBDSV9DQVBfSURfUE1FCQkJMQogI2VuZGlmCkBAIC0zOSw3ICs0MSw3IEBACiBleHRlcm4gaW50IHBjaWVfcG9ydF9kZXZpY2VfcmVzdW1lKHN0cnVjdCBwY2lfZGV2ICpkZXYpOwogI2VuZGlmCiBleHRlcm4gdm9pZCBwY2llX3BvcnRfZGV2aWNlX3JlbW92ZShzdHJ1Y3QgcGNpX2RldiAqZGV2KTsKLWV4dGVybiBpbnQgcGNpZV9wb3J0X2J1c19yZWdpc3Rlcih2b2lkKTsKK2V4dGVybiBpbnQgX19tdXN0X2NoZWNrIHBjaWVfcG9ydF9idXNfcmVnaXN0ZXIodm9pZCk7CiBleHRlcm4gdm9pZCBwY2llX3BvcnRfYnVzX3VucmVnaXN0ZXIodm9pZCk7CiAKICNlbmRpZiAvKiBfUE9SVERSVl9IXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY2kvcGNpZS9wb3J0ZHJ2X2NvcmUuYyBiL2RyaXZlcnMvcGNpL3BjaWUvcG9ydGRydl9jb3JlLmMKaW5kZXggYmQ2NjE1Yi4uYjIwYTliOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY2kvcGNpZS9wb3J0ZHJ2X2NvcmUuYworKysgYi9kcml2ZXJzL3BjaS9wY2llL3BvcnRkcnZfY29yZS5jCkBAIC02LDcgKzYsNiBAQAogICogQ29weXJpZ2h0IChDKSBUb20gTG9uZyBOZ3V5ZW4gKHRvbS5sLm5ndXllbkBpbnRlbC5jb20pCiAgKi8KIAotI2luY2x1ZGUgPGxpbnV4L2NvbXBpbGVyLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvcGNpLmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CkBAIC00MDEsNyArNDAwLDcgQEAKIAkJcGNpX2Rpc2FibGVfbXNpKGRldik7CiB9CiAKLWludCBfX211c3RfY2hlY2sgcGNpZV9wb3J0X2J1c19yZWdpc3Rlcih2b2lkKQoraW50IHBjaWVfcG9ydF9idXNfcmVnaXN0ZXIodm9pZCkKIHsKIAlyZXR1cm4gYnVzX3JlZ2lzdGVyKCZwY2llX3BvcnRfYnVzX3R5cGUpOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY2kvcGNpZS9wb3J0ZHJ2X3BjaS5jIGIvZHJpdmVycy9wY2kvcGNpZS9wb3J0ZHJ2X3BjaS5jCmluZGV4IDAzNzY5MGUuLmI0ZGE3OTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNpL3BjaWUvcG9ydGRydl9wY2kuYworKysgYi9kcml2ZXJzL3BjaS9wY2llL3BvcnRkcnZfcGNpLmMKQEAgLTM3LDcgKzM3LDYgQEAKIAlyZXR1cm4gcGNpX3NhdmVfc3RhdGUoZGV2KTsKIH0KIAotI2lmZGVmIENPTkZJR19QTQogc3RhdGljIGludCBwY2llX3BvcnRkcnZfcmVzdG9yZV9jb25maWcoc3RydWN0IHBjaV9kZXYgKmRldikKIHsKIAlpbnQgcmV0dmFsOwpAQCAtNTAsNiArNDksNyBAQAogCXJldHVybiAwOwogfQogCisjaWZkZWYgQ09ORklHX1BNCiBzdGF0aWMgaW50IHBjaWVfcG9ydGRydl9zdXNwZW5kKHN0cnVjdCBwY2lfZGV2ICpkZXYsIHBtX21lc3NhZ2VfdCBzdGF0ZSkKIHsKIAlpbnQgcmV0ID0gcGNpZV9wb3J0X2RldmljZV9zdXNwZW5kKGRldiwgc3RhdGUpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY2kvcHJvYmUuYyBiL2RyaXZlcnMvcGNpL3Byb2JlLmMKaW5kZXggYTNiMGE1ZS4uZTE1OWQ2NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY2kvcHJvYmUuYworKysgYi9kcml2ZXJzL3BjaS9wcm9iZS5jCkBAIC0xMDY3LDMgKzEwNjcsOTUgQEAKIEVYUE9SVF9TWU1CT0wocGNpX3NjYW5fc2luZ2xlX2RldmljZSk7CiBFWFBPUlRfU1lNQk9MX0dQTChwY2lfc2Nhbl9jaGlsZF9idXMpOwogI2VuZGlmCisKK3N0YXRpYyBpbnQgX19pbml0IHBjaV9zb3J0X2JmX2NtcChjb25zdCBzdHJ1Y3QgcGNpX2RldiAqYSwgY29uc3Qgc3RydWN0IHBjaV9kZXYgKmIpCit7CisJaWYgICAgICAocGNpX2RvbWFpbl9ucihhLT5idXMpIDwgcGNpX2RvbWFpbl9ucihiLT5idXMpKSByZXR1cm4gLTE7CisJZWxzZSBpZiAocGNpX2RvbWFpbl9ucihhLT5idXMpID4gcGNpX2RvbWFpbl9ucihiLT5idXMpKSByZXR1cm4gIDE7CisKKwlpZiAgICAgIChhLT5idXMtPm51bWJlciA8IGItPmJ1cy0+bnVtYmVyKSByZXR1cm4gLTE7CisJZWxzZSBpZiAoYS0+YnVzLT5udW1iZXIgPiBiLT5idXMtPm51bWJlcikgcmV0dXJuICAxOworCisJaWYgICAgICAoYS0+ZGV2Zm4gPCBiLT5kZXZmbikgcmV0dXJuIC0xOworCWVsc2UgaWYgKGEtPmRldmZuID4gYi0+ZGV2Zm4pIHJldHVybiAgMTsKKworCXJldHVybiAwOworfQorCisvKgorICogWWVzLCB0aGlzIGZvcmNhYmx5IGJyZWFrcyB0aGUga2xpc3QgYWJzdHJhY3Rpb24gdGVtcG9yYXJpbHkuICBJdAorICoganVzdCB3YW50cyB0byBzb3J0IHRoZSBrbGlzdCwgbm90IGNoYW5nZSByZWZlcmVuY2UgY291bnRzIGFuZAorICogdGFrZS9kcm9wIGxvY2tzIHJhcGlkbHkgaW4gdGhlIHByb2Nlc3MuICBJdCBkb2VzIGFsbCB0aGlzIHdoaWxlCisgKiBob2xkaW5nIHRoZSBsb2NrIGZvciB0aGUgbGlzdCwgc28gb2JqZWN0cyBjYW4ndCBvdGhlcndpc2UgYmUKKyAqIGFkZGVkL3JlbW92ZWQgd2hpbGUgd2UncmUgc3dpenpsaW5nLgorICovCitzdGF0aWMgdm9pZCBfX2luaXQgcGNpX2luc2VydGlvbl9zb3J0X2tsaXN0KHN0cnVjdCBwY2lfZGV2ICphLCBzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0KQoreworCXN0cnVjdCBsaXN0X2hlYWQgKnBvczsKKwlzdHJ1Y3Qga2xpc3Rfbm9kZSAqbjsKKwlzdHJ1Y3QgZGV2aWNlICpkZXY7CisJc3RydWN0IHBjaV9kZXYgKmI7CisKKwlsaXN0X2Zvcl9lYWNoKHBvcywgbGlzdCkgeworCQluID0gY29udGFpbmVyX29mKHBvcywgc3RydWN0IGtsaXN0X25vZGUsIG5fbm9kZSk7CisJCWRldiA9IGNvbnRhaW5lcl9vZihuLCBzdHJ1Y3QgZGV2aWNlLCBrbm9kZV9idXMpOworCQliID0gdG9fcGNpX2RldihkZXYpOworCQlpZiAocGNpX3NvcnRfYmZfY21wKGEsIGIpIDw9IDApIHsKKwkJCWxpc3RfbW92ZV90YWlsKCZhLT5kZXYua25vZGVfYnVzLm5fbm9kZSwgJmItPmRldi5rbm9kZV9idXMubl9ub2RlKTsKKwkJCXJldHVybjsKKwkJfQorCX0KKwlsaXN0X21vdmVfdGFpbCgmYS0+ZGV2Lmtub2RlX2J1cy5uX25vZGUsIGxpc3QpOworfQorCitzdGF0aWMgdm9pZCBfX2luaXQgcGNpX3NvcnRfYnJlYWR0aGZpcnN0X2tsaXN0KHZvaWQpCit7CisJTElTVF9IRUFEKHNvcnRlZF9kZXZpY2VzKTsKKwlzdHJ1Y3QgbGlzdF9oZWFkICpwb3MsICp0bXA7CisJc3RydWN0IGtsaXN0X25vZGUgKm47CisJc3RydWN0IGRldmljZSAqZGV2OworCXN0cnVjdCBwY2lfZGV2ICpwZGV2OworCisJc3Bpbl9sb2NrKCZwY2lfYnVzX3R5cGUua2xpc3RfZGV2aWNlcy5rX2xvY2spOworCWxpc3RfZm9yX2VhY2hfc2FmZShwb3MsIHRtcCwgJnBjaV9idXNfdHlwZS5rbGlzdF9kZXZpY2VzLmtfbGlzdCkgeworCQluID0gY29udGFpbmVyX29mKHBvcywgc3RydWN0IGtsaXN0X25vZGUsIG5fbm9kZSk7CisJCWRldiA9IGNvbnRhaW5lcl9vZihuLCBzdHJ1Y3QgZGV2aWNlLCBrbm9kZV9idXMpOworCQlwZGV2ID0gdG9fcGNpX2RldihkZXYpOworCQlwY2lfaW5zZXJ0aW9uX3NvcnRfa2xpc3QocGRldiwgJnNvcnRlZF9kZXZpY2VzKTsKKwl9CisJbGlzdF9zcGxpY2UoJnNvcnRlZF9kZXZpY2VzLCAmcGNpX2J1c190eXBlLmtsaXN0X2RldmljZXMua19saXN0KTsKKwlzcGluX3VubG9jaygmcGNpX2J1c190eXBlLmtsaXN0X2RldmljZXMua19sb2NrKTsKK30KKworc3RhdGljIHZvaWQgX19pbml0IHBjaV9pbnNlcnRpb25fc29ydF9kZXZpY2VzKHN0cnVjdCBwY2lfZGV2ICphLCBzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0KQoreworCXN0cnVjdCBwY2lfZGV2ICpiOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShiLCBsaXN0LCBnbG9iYWxfbGlzdCkgeworCQlpZiAocGNpX3NvcnRfYmZfY21wKGEsIGIpIDw9IDApIHsKKwkJCWxpc3RfbW92ZV90YWlsKCZhLT5nbG9iYWxfbGlzdCwgJmItPmdsb2JhbF9saXN0KTsKKwkJCXJldHVybjsKKwkJfQorCX0KKwlsaXN0X21vdmVfdGFpbCgmYS0+Z2xvYmFsX2xpc3QsIGxpc3QpOworfQorCitzdGF0aWMgdm9pZCBfX2luaXQgcGNpX3NvcnRfYnJlYWR0aGZpcnN0X2RldmljZXModm9pZCkKK3sKKwlMSVNUX0hFQUQoc29ydGVkX2RldmljZXMpOworCXN0cnVjdCBwY2lfZGV2ICpkZXYsICp0bXA7CisKKwlkb3duX3dyaXRlKCZwY2lfYnVzX3NlbSk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGRldiwgdG1wLCAmcGNpX2RldmljZXMsIGdsb2JhbF9saXN0KSB7CisJCXBjaV9pbnNlcnRpb25fc29ydF9kZXZpY2VzKGRldiwgJnNvcnRlZF9kZXZpY2VzKTsKKwl9CisJbGlzdF9zcGxpY2UoJnNvcnRlZF9kZXZpY2VzLCAmcGNpX2RldmljZXMpOworCXVwX3dyaXRlKCZwY2lfYnVzX3NlbSk7Cit9CisKK3ZvaWQgX19pbml0IHBjaV9zb3J0X2JyZWFkdGhmaXJzdCh2b2lkKQoreworCXBjaV9zb3J0X2JyZWFkdGhmaXJzdF9kZXZpY2VzKCk7CisJcGNpX3NvcnRfYnJlYWR0aGZpcnN0X2tsaXN0KCk7Cit9CisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL3F1aXJrcy5jIGIvZHJpdmVycy9wY2kvcXVpcmtzLmMKaW5kZXggMjNiNTk5ZC4uNWI0NDgzOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY2kvcXVpcmtzLmMKKysrIGIvZHJpdmVycy9wY2kvcXVpcmtzLmMKQEAgLTQ1Myw2ICs0NTMsMTIgQEAKIH0KIERFQ0xBUkVfUENJX0ZJWFVQX0hFQURFUihQQ0lfVkVORE9SX0lEX0lOVEVMLAlQQ0lfREVWSUNFX0lEX0lOVEVMX0lDSDZfMCwgcXVpcmtfaWNoNl9scGNfYWNwaSApOwogREVDTEFSRV9QQ0lfRklYVVBfSEVBREVSKFBDSV9WRU5ET1JfSURfSU5URUwsCVBDSV9ERVZJQ0VfSURfSU5URUxfSUNINl8xLCBxdWlya19pY2g2X2xwY19hY3BpICk7CitERUNMQVJFX1BDSV9GSVhVUF9IRUFERVIoUENJX1ZFTkRPUl9JRF9JTlRFTCwJUENJX0RFVklDRV9JRF9JTlRFTF9JQ0g3XzAsIHF1aXJrX2ljaDZfbHBjX2FjcGkgKTsKK0RFQ0xBUkVfUENJX0ZJWFVQX0hFQURFUihQQ0lfVkVORE9SX0lEX0lOVEVMLAlQQ0lfREVWSUNFX0lEX0lOVEVMX0lDSDdfMSwgcXVpcmtfaWNoNl9scGNfYWNwaSApOworREVDTEFSRV9QQ0lfRklYVVBfSEVBREVSKFBDSV9WRU5ET1JfSURfSU5URUwsCVBDSV9ERVZJQ0VfSURfSU5URUxfSUNIN18zMSwgcXVpcmtfaWNoNl9scGNfYWNwaSApOworREVDTEFSRV9QQ0lfRklYVVBfSEVBREVSKFBDSV9WRU5ET1JfSURfSU5URUwsCVBDSV9ERVZJQ0VfSURfSU5URUxfSUNIOF8wLCBxdWlya19pY2g2X2xwY19hY3BpICk7CitERUNMQVJFX1BDSV9GSVhVUF9IRUFERVIoUENJX1ZFTkRPUl9JRF9JTlRFTCwJUENJX0RFVklDRV9JRF9JTlRFTF9JQ0g4XzIsIHF1aXJrX2ljaDZfbHBjX2FjcGkgKTsKK0RFQ0xBUkVfUENJX0ZJWFVQX0hFQURFUihQQ0lfVkVORE9SX0lEX0lOVEVMLAlQQ0lfREVWSUNFX0lEX0lOVEVMX0lDSDhfMywgcXVpcmtfaWNoNl9scGNfYWNwaSApOwogCiAvKgogICogVklBIEFDUEk6IE9uZSBJTyByZWdpb24gcG9pbnRlZCB0byBieSBsb25nd29yZCBhdApAQCAtNjQ4LDExICs2NTQsNDMgQEAKICAqIFNvbWUgb2YgdGhlIG9uLWNoaXAgZGV2aWNlcyBhcmUgYWN0dWFsbHkgJzU4NiBkZXZpY2VzJyBzbyB0aGV5IGFyZQogICogbGlzdGVkIGhlcmUuCiAgKi8KKworc3RhdGljIGludCB2aWFfaXJxX2ZpeHVwX25lZWRlZCA9IC0xOworCisvKgorICogQXMgc29tZSBWSUEgaGFyZHdhcmUgaXMgYXZhaWxhYmxlIGluIFBDSS1jYXJkIGZvcm0sIHdlIG5lZWQgdG8gcmVzdHJpY3QKKyAqIHRoaXMgcXVpcmsgdG8gVklBIFBDSSBoYXJkd2FyZSBidWlsdCBvbnRvIFZJQS1iYXNlZCBtb3RoZXJib2FyZHMgb25seS4KKyAqIFdlIHRyeSB0byBsb2NhdGUgYSBWSUEgc291dGhicmlkZ2UgYmVmb3JlIGRlY2lkaW5nIHdoZXRoZXIgdGhlIHF1aXJrCisgKiBzaG91bGQgYmUgYXBwbGllZC4KKyAqLworc3RhdGljIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkIHZpYV9pcnFfZml4dXBfdGJsW10gPSB7CisJeworCQkudmVuZG9yIAk9IFBDSV9WRU5ET1JfSURfVklBLAorCQkuZGV2aWNlCQk9IFBDSV9BTllfSUQsCisJCS5zdWJ2ZW5kb3IJPSBQQ0lfQU5ZX0lELAorCQkuc3ViZGV2aWNlCT0gUENJX0FOWV9JRCwKKwkJLmNsYXNzCQk9IFBDSV9DTEFTU19CUklER0VfSVNBIDw8IDgsCisJCS5jbGFzc19tYXNrCT0gMHhmZmZmMDAsCisJfSwKKwl7IDAsIH0sCit9OworCiBzdGF0aWMgdm9pZCBxdWlya192aWFfaXJxKHN0cnVjdCBwY2lfZGV2ICpkZXYpCiB7CiAJdTggaXJxLCBuZXdfaXJxOwogCi0JbmV3X2lycSA9IGRldi0+aXJxICYgMHhmOworCWlmICh2aWFfaXJxX2ZpeHVwX25lZWRlZCA9PSAtMSkKKwkJdmlhX2lycV9maXh1cF9uZWVkZWQgPSBwY2lfZGV2X3ByZXNlbnQodmlhX2lycV9maXh1cF90YmwpOworCisJaWYgKCF2aWFfaXJxX2ZpeHVwX25lZWRlZCkKKwkJcmV0dXJuOworCisJbmV3X2lycSA9IGRldi0+aXJxOworCisJLyogRG9uJ3QgcXVpcmsgaW50ZXJydXB0cyBvdXRzaWRlIHRoZSBsZWdhY3kgSVJRIHJhbmdlICovCisJaWYgKCFuZXdfaXJxIHx8IG5ld19pcnEgPiAxNSkKKwkJcmV0dXJuOworCiAJcGNpX3JlYWRfY29uZmlnX2J5dGUoZGV2LCBQQ0lfSU5URVJSVVBUX0xJTkUsICZpcnEpOwogCWlmIChuZXdfaXJxICE9IGlycSkgewogCQlwcmludGsoS0VSTl9JTkZPICJQQ0k6IFZJQSBJUlEgZml4dXAgZm9yICVzLCBmcm9tICVkIHRvICVkXG4iLApAQCAtNjYxLDE0ICs2OTksNyBAQAogCQlwY2lfd3JpdGVfY29uZmlnX2J5dGUoZGV2LCBQQ0lfSU5URVJSVVBUX0xJTkUsIG5ld19pcnEpOwogCX0KIH0KLURFQ0xBUkVfUENJX0ZJWFVQX0VOQUJMRShQQ0lfVkVORE9SX0lEX1ZJQSwgUENJX0RFVklDRV9JRF9WSUFfODJDNTg2XzAsIHF1aXJrX3ZpYV9pcnEpOwotREVDTEFSRV9QQ0lfRklYVVBfRU5BQkxFKFBDSV9WRU5ET1JfSURfVklBLCBQQ0lfREVWSUNFX0lEX1ZJQV84MkM1ODZfMSwgcXVpcmtfdmlhX2lycSk7Ci1ERUNMQVJFX1BDSV9GSVhVUF9FTkFCTEUoUENJX1ZFTkRPUl9JRF9WSUEsIFBDSV9ERVZJQ0VfSURfVklBXzgyQzU4Nl8yLCBxdWlya192aWFfaXJxKTsKLURFQ0xBUkVfUENJX0ZJWFVQX0VOQUJMRShQQ0lfVkVORE9SX0lEX1ZJQSwgUENJX0RFVklDRV9JRF9WSUFfODJDNTg2XzMsIHF1aXJrX3ZpYV9pcnEpOwotREVDTEFSRV9QQ0lfRklYVVBfRU5BQkxFKFBDSV9WRU5ET1JfSURfVklBLCBQQ0lfREVWSUNFX0lEX1ZJQV84MjM1X1VTQl8yLCBxdWlya192aWFfaXJxKTsKLURFQ0xBUkVfUENJX0ZJWFVQX0VOQUJMRShQQ0lfVkVORE9SX0lEX1ZJQSwgUENJX0RFVklDRV9JRF9WSUFfODJDNjg2LCBxdWlya192aWFfaXJxKTsKLURFQ0xBUkVfUENJX0ZJWFVQX0VOQUJMRShQQ0lfVkVORE9SX0lEX1ZJQSwgUENJX0RFVklDRV9JRF9WSUFfODJDNjg2XzQsIHF1aXJrX3ZpYV9pcnEpOwotREVDTEFSRV9QQ0lfRklYVVBfRU5BQkxFKFBDSV9WRU5ET1JfSURfVklBLCBQQ0lfREVWSUNFX0lEX1ZJQV84MkM2ODZfNSwgcXVpcmtfdmlhX2lycSk7CitERUNMQVJFX1BDSV9GSVhVUF9FTkFCTEUoUENJX1ZFTkRPUl9JRF9WSUEsIFBDSV9BTllfSUQsIHF1aXJrX3ZpYV9pcnEpOwogCiAvKgogICogVklBIFZUODJDNTk4IGhhcyBpdHMgZGV2aWNlIElEIHNldHRhYmxlIGFuZCBtYW55IEJJT1NlcwpAQCAtNjgzLDMzICs3MTQsNiBAQAogfQogREVDTEFSRV9QQ0lfRklYVVBfSEVBREVSKFBDSV9WRU5ET1JfSURfVklBLAlQQ0lfREVWSUNFX0lEX1ZJQV84MkM1OTdfMCwJcXVpcmtfdnQ4MmM1OThfaWQgKTsKIAotI2lmZGVmIENPTkZJR19BQ1BJX1NMRUVQCi0KLS8qCi0gKiBTb21lIFZJQSBzeXN0ZW1zIGJvb3Qgd2l0aCB0aGUgYWJub3JtYWwgc3RhdHVzIGZsYWcgc2V0LiBUaGlzIGNhbiBjYXVzZQotICogdGhlIEJJT1MgdG8gcmUtUE9TVCB0aGUgc3lzdGVtIG9uIHJlc3VtZSByYXRoZXIgdGhhbiBwYXNzaW5nIGNvbnRyb2wKLSAqIGJhY2sgdG8gdGhlIE9TLiAgQ2xlYXIgdGhlIGZsYWcgb24gYm9vdAotICovCi1zdGF0aWMgdm9pZCBfX2RldmluaXQgcXVpcmtfdmlhX2Fibm9ybWFsX3Bvd2Vyb2ZmKHN0cnVjdCBwY2lfZGV2ICpkZXYpCi17Ci0JdTMyIHJlZzsKLQotCWFjcGlfaHdfcmVnaXN0ZXJfcmVhZChBQ1BJX01UWF9ET19OT1RfTE9DSywgQUNQSV9SRUdJU1RFUl9QTTFfU1RBVFVTLAotCQkJCSZyZWcpOwotCi0JaWYgKHJlZyAmIDB4ODAwKSB7Ci0JCXByaW50aygiQ2xlYXJpbmcgYWJub3JtYWwgcG93ZXJvZmYgZmxhZ1xuIik7Ci0JCWFjcGlfaHdfcmVnaXN0ZXJfd3JpdGUoQUNQSV9NVFhfRE9fTk9UX0xPQ0ssCi0JCQkJCUFDUElfUkVHSVNURVJfUE0xX1NUQVRVUywKLQkJCQkJKHUxNikweDgwMCk7Ci0JfQotfQotCi1ERUNMQVJFX1BDSV9GSVhVUF9GSU5BTChQQ0lfVkVORE9SX0lEX1ZJQSwgUENJX0RFVklDRV9JRF9WSUFfODIzNSwgcXVpcmtfdmlhX2Fibm9ybWFsX3Bvd2Vyb2ZmKTsKLURFQ0xBUkVfUENJX0ZJWFVQX0ZJTkFMKFBDSV9WRU5ET1JfSURfVklBLCBQQ0lfREVWSUNFX0lEX1ZJQV84MjM3LCBxdWlya192aWFfYWJub3JtYWxfcG93ZXJvZmYpOwotCi0jZW5kaWYKLQogLyoKICAqIENhcmRCdXMgY29udHJvbGxlcnMgaGF2ZSBhIGxlZ2FjeSBiYXNlIGFkZHJlc3MgdGhhdCBlbmFibGVzIHRoZW0KICAqIHRvIHJlc3BvbmQgYXMgaTgyMzY1IHBjbWNpYSBjb250cm9sbGVycy4gIFdlIGRvbid0IHdhbnQgdGhlbSB0bwpAQCAtMTQ1NiwzMyArMTQ2MCw2IEBACiBERUNMQVJFX1BDSV9GSVhVUF9GSU5BTChQQ0lfVkVORE9SX0lEX0lOVEVMLAkweDI2MGEsIHF1aXJrX2ludGVsX3BjaWVfcG0pOwogREVDTEFSRV9QQ0lfRklYVVBfRklOQUwoUENJX1ZFTkRPUl9JRF9JTlRFTCwJMHgyNjBiLCBxdWlya19pbnRlbF9wY2llX3BtKTsKIAotLyoKLSAqIEZpeHVwIHRoZSBjYXJkYnVzIGJyaWRnZXMgb24gdGhlIElCTSBEb2NrIElJIGRvY2tpbmcgc3RhdGlvbgotICovCi1zdGF0aWMgdm9pZCBfX2RldmluaXQgcXVpcmtfaWJtX2RvY2syX2NhcmRidXMoc3RydWN0IHBjaV9kZXYgKmRldikKLXsKLQl1MzIgdmFsOwotCi0JLyoKLQkgKiB0aWUgdGhlIDIgaW50ZXJydXB0IHBpbnMgdG8gSU5UQSwgYW5kIGNvbmZpZ3VyZSB0aGUKLQkgKiBtdWx0aWZ1bmN0aW9uIHJvdXRpbmcgcmVnaXN0ZXIgdG8gaGFuZGxlIHRoaXMuCi0JICovCi0JaWYgKChkZXYtPnN1YnN5c3RlbV92ZW5kb3IgPT0gUENJX1ZFTkRPUl9JRF9JQk0pICYmCi0JCShkZXYtPnN1YnN5c3RlbV9kZXZpY2UgPT0gMHgwMTQ4KSkgewotCQlwcmludGsoS0VSTl9JTkZPICJQQ0k6IEZvdW5kIElCTSBEb2NrIElJIENhcmRidXMgQnJpZGdlICIKLQkJCSJhcHBseWluZyBxdWlya1xuIik7Ci0JCXBjaV9yZWFkX2NvbmZpZ19kd29yZChkZXYsIDB4OGMsICZ2YWwpOwotCQl2YWwgPSAoKHZhbCAmIDB4ZmZmZmZmMDApIHwgMHgxMDAyKTsKLQkJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChkZXYsIDB4OGMsIHZhbCk7Ci0JCXBjaV9yZWFkX2NvbmZpZ19kd29yZChkZXYsIDB4ODAsICZ2YWwpOwotCQl2YWwgPSAoKHZhbCAmIDB4MDBmZmZmMDApIHwgMHgyODY0YzA3Nyk7Ci0JCXBjaV93cml0ZV9jb25maWdfZHdvcmQoZGV2LCAweDgwLCB2YWwpOwotCX0KLX0KLQotREVDTEFSRV9QQ0lfRklYVVBfSEVBREVSKFBDSV9WRU5ET1JfSURfVEksIFBDSV9ERVZJQ0VfSURfVElfMTQyMCwKLQkJCQlxdWlya19pYm1fZG9jazJfY2FyZGJ1cyk7Ci0KIHN0YXRpYyB2b2lkIF9fZGV2aW5pdCBxdWlya19uZXRtb3Moc3RydWN0IHBjaV9kZXYgKmRldikKIHsKIAl1bnNpZ25lZCBpbnQgbnVtX3BhcmFsbGVsID0gKGRldi0+c3Vic3lzdGVtX2RldmljZSAmIDB4ZjApID4+IDQ7CkBAIC0xNTg4LDcgKzE1NjUsNiBAQAogfQogREVDTEFSRV9QQ0lfRklYVVBfSEVBREVSKFBDSV9WRU5ET1JfSURfTkNSLCBQQ0lfREVWSUNFX0lEX05DUl81M0M4MTAsIGZpeHVwX3JldjFfNTNjODEwKTsKIAotCiBzdGF0aWMgdm9pZCBwY2lfZG9fZml4dXBzKHN0cnVjdCBwY2lfZGV2ICpkZXYsIHN0cnVjdCBwY2lfZml4dXAgKmYsIHN0cnVjdCBwY2lfZml4dXAgKmVuZCkKIHsKIAl3aGlsZSAoZiA8IGVuZCkgewpAQCAtMTc2NCw3ICsxNzQwLDcgQEAKIAkvKiBjaGVjayBIVCBNU0kgY2FwIG9uIHRoaXMgY2hpcHNldCBhbmQgdGhlIHJvb3Qgb25lLgogCSAqIGEgc2luZ2xlIG9uZSBoYXZpbmcgTVNJIGlzIGVub3VnaCB0byBiZSBzdXJlIHRoYXQgTVNJIGFyZSBzdXBwb3J0ZWQuCiAJICovCi0JcGRldiA9IHBjaV9maW5kX3Nsb3QoZGV2LT5idXMtPm51bWJlciwgMCk7CisJcGRldiA9IHBjaV9nZXRfc2xvdChkZXYtPmJ1cywgMCk7CiAJaWYgKGRldi0+c3Vib3JkaW5hdGUgJiYgIW1zaV9odF9jYXBfZW5hYmxlZChkZXYpCiAJICAgICYmICFtc2lfaHRfY2FwX2VuYWJsZWQocGRldikpIHsKIAkJcHJpbnRrKEtFUk5fV0FSTklORyAiUENJOiBNU0kgcXVpcmsgZGV0ZWN0ZWQuICIKQEAgLTE3NzIsNiArMTc0OCw3IEBACiAJCSAgICAgICBwY2lfbmFtZShkZXYpKTsKIAkJZGV2LT5zdWJvcmRpbmF0ZS0+YnVzX2ZsYWdzIHw9IFBDSV9CVVNfRkxBR1NfTk9fTVNJOwogCX0KKwlwY2lfZGV2X3B1dChwZGV2KTsKIH0KIERFQ0xBUkVfUENJX0ZJWFVQX0ZJTkFMKFBDSV9WRU5ET1JfSURfTlZJRElBLCBQQ0lfREVWSUNFX0lEX05WSURJQV9DSzgwNF9QQ0lFLAogCQkJcXVpcmtfbnZpZGlhX2NrODA0X21zaV9odF9jYXApOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY2kvcm9tLmMgYi9kcml2ZXJzL3BjaS9yb20uYwppbmRleCBmNWVlN2NlLi5lMWRjZWZjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjaS9yb20uYworKysgYi9kcml2ZXJzL3BjaS9yb20uYwpAQCAtNzEsNyArNzEsMTEgQEAKIAl2b2lkIF9faW9tZW0gKmltYWdlOwogCWludCBsYXN0X2ltYWdlOwogCi0JLyogSU9SRVNPVVJDRV9ST01fU0hBRE9XIG9ubHkgc2V0IG9uIHg4NiAqLworCS8qCisJICogSU9SRVNPVVJDRV9ST01fU0hBRE9XIHNldCBvbiB4ODYsIHg4Nl82NCBhbmQgSUE2NCBzdXBwb3J0cyBsZWdhY3kKKwkgKiBtZW1vcnkgbWFwIGlmIHRoZSBWR0EgZW5hYmxlIGJpdCBvZiB0aGUgQnJpZGdlIENvbnRyb2wgcmVnaXN0ZXIgaXMKKwkgKiBzZXQgZm9yIGVtYmVkZGVkIFZHQS4KKwkgKi8KIAlpZiAocmVzLT5mbGFncyAmIElPUkVTT1VSQ0VfUk9NX1NIQURPVykgewogCQkvKiBwcmltYXJ5IHZpZGVvIHJvbSBhbHdheXMgc3RhcnRzIGhlcmUgKi8KIAkJc3RhcnQgPSAobG9mZl90KTB4QzAwMDA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9zZWFyY2guYyBiL2RyaXZlcnMvcGNpL3NlYXJjaC5jCmluZGV4IGQ1Mjk0NjIuLjJmMTNlYmEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNpL3NlYXJjaC5jCisrKyBiL2RyaXZlcnMvcGNpL3NlYXJjaC5jCkBAIC0xNDAsNiArMTQwLDMxIEBACiB9CiAKIC8qKgorICogcGNpX2dldF9idXNfYW5kX3Nsb3QgLSBsb2NhdGUgUENJIGRldmljZSBmcm9tIGEgZ2l2ZW4gUENJIHNsb3QKKyAqIEBidXM6IG51bWJlciBvZiBQQ0kgYnVzIG9uIHdoaWNoIGRlc2lyZWQgUENJIGRldmljZSByZXNpZGVzCisgKiBAZGV2Zm46IGVuY29kZXMgbnVtYmVyIG9mIFBDSSBzbG90IGluIHdoaWNoIHRoZSBkZXNpcmVkIFBDSQorICogZGV2aWNlIHJlc2lkZXMgYW5kIHRoZSBsb2dpY2FsIGRldmljZSBudW1iZXIgd2l0aGluIHRoYXQgc2xvdAorICogaW4gY2FzZSBvZiBtdWx0aS1mdW5jdGlvbiBkZXZpY2VzLgorICoKKyAqIEdpdmVuIGEgUENJIGJ1cyBhbmQgc2xvdC9mdW5jdGlvbiBudW1iZXIsIHRoZSBkZXNpcmVkIFBDSSBkZXZpY2UKKyAqIGlzIGxvY2F0ZWQgaW4gc3lzdGVtIGdsb2JhbCBsaXN0IG9mIFBDSSBkZXZpY2VzLiAgSWYgdGhlIGRldmljZQorICogaXMgZm91bmQsIGEgcG9pbnRlciB0byBpdHMgZGF0YSBzdHJ1Y3R1cmUgaXMgcmV0dXJuZWQuICBJZiBubworICogZGV2aWNlIGlzIGZvdW5kLCAlTlVMTCBpcyByZXR1cm5lZC4gVGhlIHJldHVybmVkIGRldmljZSBoYXMgaXRzCisgKiByZWZlcmVuY2UgY291bnQgYnVtcGVkIGJ5IG9uZS4KKyAqLworCitzdHJ1Y3QgcGNpX2RldiAqIHBjaV9nZXRfYnVzX2FuZF9zbG90KHVuc2lnbmVkIGludCBidXMsIHVuc2lnbmVkIGludCBkZXZmbikKK3sKKwlzdHJ1Y3QgcGNpX2RldiAqZGV2ID0gTlVMTDsKKworCXdoaWxlICgoZGV2ID0gcGNpX2dldF9kZXZpY2UoUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgZGV2KSkgIT0gTlVMTCkgeworCQlpZiAoZGV2LT5idXMtPm51bWJlciA9PSBidXMgJiYgZGV2LT5kZXZmbiA9PSBkZXZmbikKKwkJCXJldHVybiBkZXY7CisJfQorCXJldHVybiBOVUxMOworfQorCisvKioKICAqIHBjaV9maW5kX3N1YnN5cyAtIGJlZ2luIG9yIGNvbnRpbnVlIHNlYXJjaGluZyBmb3IgYSBQQ0kgZGV2aWNlIGJ5IHZlbmRvci9zdWJ2ZW5kb3IvZGV2aWNlL3N1YmRldmljZSBpZAogICogQHZlbmRvcjogUENJIHZlbmRvciBpZCB0byBtYXRjaCwgb3IgJVBDSV9BTllfSUQgdG8gbWF0Y2ggYWxsIHZlbmRvciBpZHMKICAqIEBkZXZpY2U6IFBDSSBkZXZpY2UgaWQgdG8gbWF0Y2gsIG9yICVQQ0lfQU5ZX0lEIHRvIG1hdGNoIGFsbCBkZXZpY2UgaWRzCkBAIC0yNzQsNiArMjk5LDQ1IEBACiAJcmV0dXJuIHBjaV9nZXRfc3Vic3lzKHZlbmRvciwgZGV2aWNlLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCBmcm9tKTsKIH0KIAorLyoqCisgKiBwY2lfZ2V0X2RldmljZV9yZXZlcnNlIC0gYmVnaW4gb3IgY29udGludWUgc2VhcmNoaW5nIGZvciBhIFBDSSBkZXZpY2UgYnkgdmVuZG9yL2RldmljZSBpZAorICogQHZlbmRvcjogUENJIHZlbmRvciBpZCB0byBtYXRjaCwgb3IgJVBDSV9BTllfSUQgdG8gbWF0Y2ggYWxsIHZlbmRvciBpZHMKKyAqIEBkZXZpY2U6IFBDSSBkZXZpY2UgaWQgdG8gbWF0Y2gsIG9yICVQQ0lfQU5ZX0lEIHRvIG1hdGNoIGFsbCBkZXZpY2UgaWRzCisgKiBAZnJvbTogUHJldmlvdXMgUENJIGRldmljZSBmb3VuZCBpbiBzZWFyY2gsIG9yICVOVUxMIGZvciBuZXcgc2VhcmNoLgorICoKKyAqIEl0ZXJhdGVzIHRocm91Z2ggdGhlIGxpc3Qgb2Yga25vd24gUENJIGRldmljZXMgaW4gdGhlIHJldmVyc2Ugb3JkZXIgb2YKKyAqIHBjaV9nZXRfZGV2aWNlLgorICogSWYgYSBQQ0kgZGV2aWNlIGlzIGZvdW5kIHdpdGggYSBtYXRjaGluZyBAdmVuZG9yIGFuZCBAZGV2aWNlLCB0aGUgcmVmZXJlbmNlCisgKiBjb3VudCB0byB0aGUgIGRldmljZSBpcyBpbmNyZW1lbnRlZCBhbmQgYSBwb2ludGVyIHRvIGl0cyBkZXZpY2Ugc3RydWN0dXJlCisgKiBpcyByZXR1cm5lZCBPdGhlcndpc2UsICVOVUxMIGlzIHJldHVybmVkLiAgQSBuZXcgc2VhcmNoIGlzIGluaXRpYXRlZCBieQorICogcGFzc2luZyAlTlVMTCBhcyB0aGUgQGZyb20gYXJndW1lbnQuICBPdGhlcndpc2UgaWYgQGZyb20gaXMgbm90ICVOVUxMLAorICogc2VhcmNoZXMgY29udGludWUgZnJvbSBuZXh0IGRldmljZSBvbiB0aGUgZ2xvYmFsIGxpc3QuICBUaGUgcmVmZXJlbmNlCisgKiBjb3VudCBmb3IgQGZyb20gaXMgYWx3YXlzIGRlY3JlbWVudGVkIGlmIGl0IGlzIG5vdCAlTlVMTC4KKyAqLworc3RydWN0IHBjaV9kZXYgKgorcGNpX2dldF9kZXZpY2VfcmV2ZXJzZSh1bnNpZ25lZCBpbnQgdmVuZG9yLCB1bnNpZ25lZCBpbnQgZGV2aWNlLCBzdHJ1Y3QgcGNpX2RldiAqZnJvbSkKK3sKKwlzdHJ1Y3QgbGlzdF9oZWFkICpuOworCXN0cnVjdCBwY2lfZGV2ICpkZXY7CisKKwlXQVJOX09OKGluX2ludGVycnVwdCgpKTsKKwlkb3duX3JlYWQoJnBjaV9idXNfc2VtKTsKKwluID0gZnJvbSA/IGZyb20tPmdsb2JhbF9saXN0LnByZXYgOiBwY2lfZGV2aWNlcy5wcmV2OworCisJd2hpbGUgKG4gJiYgKG4gIT0gJnBjaV9kZXZpY2VzKSkgeworCQlkZXYgPSBwY2lfZGV2X2cobik7CisJCWlmICgodmVuZG9yID09IFBDSV9BTllfSUQgfHwgZGV2LT52ZW5kb3IgPT0gdmVuZG9yKSAmJgorCQkgICAgKGRldmljZSA9PSBQQ0lfQU5ZX0lEIHx8IGRldi0+ZGV2aWNlID09IGRldmljZSkpCisJCQlnb3RvIGV4aXQ7CisJCW4gPSBuLT5wcmV2OworCX0KKwlkZXYgPSBOVUxMOworZXhpdDoKKwlkZXYgPSBwY2lfZGV2X2dldChkZXYpOworCXVwX3JlYWQoJnBjaV9idXNfc2VtKTsKKwlwY2lfZGV2X3B1dChmcm9tKTsKKwlyZXR1cm4gZGV2OworfQogCiAvKioKICAqIHBjaV9maW5kX2RldmljZV9yZXZlcnNlIC0gYmVnaW4gb3IgY29udGludWUgc2VhcmNoaW5nIGZvciBhIFBDSSBkZXZpY2UgYnkgdmVuZG9yL2RldmljZSBpZApAQCAtMzgyLDEyICs0NDYsMTYgQEAKIH0KIEVYUE9SVF9TWU1CT0wocGNpX2Rldl9wcmVzZW50KTsKIAotRVhQT1JUX1NZTUJPTChwY2lfZmluZF9idXMpOwotRVhQT1JUX1NZTUJPTChwY2lfZmluZF9uZXh0X2J1cyk7CiBFWFBPUlRfU1lNQk9MKHBjaV9maW5kX2RldmljZSk7CiBFWFBPUlRfU1lNQk9MKHBjaV9maW5kX2RldmljZV9yZXZlcnNlKTsKIEVYUE9SVF9TWU1CT0wocGNpX2ZpbmRfc2xvdCk7CisvKiBGb3IgYm9vdCB0aW1lIHdvcmsgKi8KK0VYUE9SVF9TWU1CT0wocGNpX2ZpbmRfYnVzKTsKK0VYUE9SVF9TWU1CT0wocGNpX2ZpbmRfbmV4dF9idXMpOworLyogRm9yIGV2ZXJ5b25lICovCiBFWFBPUlRfU1lNQk9MKHBjaV9nZXRfZGV2aWNlKTsKK0VYUE9SVF9TWU1CT0wocGNpX2dldF9kZXZpY2VfcmV2ZXJzZSk7CiBFWFBPUlRfU1lNQk9MKHBjaV9nZXRfc3Vic3lzKTsKIEVYUE9SVF9TWU1CT0wocGNpX2dldF9zbG90KTsKK0VYUE9SVF9TWU1CT0wocGNpX2dldF9idXNfYW5kX3Nsb3QpOwogRVhQT1JUX1NZTUJPTChwY2lfZ2V0X2NsYXNzKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNtY2lhL2F0OTFfY2YuYyBiL2RyaXZlcnMvcGNtY2lhL2F0OTFfY2YuYwppbmRleCA3ZjVkZjlhLi4zYmNiN2RjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjbWNpYS9hdDkxX2NmLmMKKysrIGIvZHJpdmVycy9wY21jaWEvYXQ5MV9jZi5jCkBAIC0yNDEsMTIgKzI0MSw2IEBACiAJY3NhID0gYXQ5MV9zeXNfcmVhZChBVDkxX0VCSV9DU0EpOwogCWF0OTFfc3lzX3dyaXRlKEFUOTFfRUJJX0NTQSwgY3NhIHwgQVQ5MV9FQklfQ1M0QV9TTUNfQ09NUEFDVEZMQVNIKTsKIAotCS8qIGZvcmNlIHBvd2Vyb24gZGVmYXVsdHMgZm9yIHRoZXNlIHBpbnMgLi4uICovCi0JKHZvaWQpIGF0OTFfc2V0X0FfcGVyaXBoKEFUOTFfUElOX1BDOSwgMCk7CS8qIEEyNS9DRlJOVyAqLwotCSh2b2lkKSBhdDkxX3NldF9BX3BlcmlwaChBVDkxX1BJTl9QQzEwLCAwKTsJLyogTkNTNC9DRkNTICovCi0JKHZvaWQpIGF0OTFfc2V0X0FfcGVyaXBoKEFUOTFfUElOX1BDMTEsIDApOwkvKiBOQ1M1L0NGQ0UxICovCi0JKHZvaWQpIGF0OTFfc2V0X0FfcGVyaXBoKEFUOTFfUElOX1BDMTIsIDApOwkvKiBOQ1M2L0NGQ0UyICovCi0KIAkvKiBuV0FJVCBpcyBfbm90XyBhIGRlZmF1bHQgc2V0dGluZyAqLwogCSh2b2lkKSBhdDkxX3NldF9BX3BlcmlwaChBVDkxX1BJTl9QQzYsIDEpOwkvKiAgbldBSVQgKi8KIApAQCAtMzE2LDEyICszMTAsMTQgQEAKIAlyZXR1cm4gMDsKIAogZmFpbDI6Ci0JaW91bm1hcCgodm9pZCBfX2lvbWVtICopIGNmLT5zb2NrZXQuaW9fb2Zmc2V0KTsKIAlyZWxlYXNlX21lbV9yZWdpb24oaW8tPnN0YXJ0LCBpby0+ZW5kICsgMSAtIGlvLT5zdGFydCk7CiBmYWlsMToKKwlpZiAoY2YtPnNvY2tldC5pb19vZmZzZXQpCisJCWlvdW5tYXAoKHZvaWQgX19pb21lbSAqKSBjZi0+c29ja2V0LmlvX29mZnNldCk7CiAJaWYgKGJvYXJkLT5pcnFfcGluKQogCQlmcmVlX2lycShib2FyZC0+aXJxX3BpbiwgY2YpOwogZmFpbDBhOgorCWRldmljZV9pbml0X3dha2V1cCgmcGRldi0+ZGV2LCAwKTsKIAlmcmVlX2lycShib2FyZC0+ZGV0X3BpbiwgY2YpOwogCWRldmljZV9pbml0X3dha2V1cCgmcGRldi0+ZGV2LCAwKTsKIGZhaWwwOgpAQCAtMzYwLDI2ICszNTYsMjAgQEAKIAlzdHJ1Y3QgYXQ5MV9jZl9kYXRhCSpib2FyZCA9IGNmLT5ib2FyZDsKIAogCXBjbWNpYV9zb2NrZXRfZGV2X3N1c3BlbmQoJnBkZXYtPmRldiwgbWVzZyk7Ci0JaWYgKGRldmljZV9tYXlfd2FrZXVwKCZwZGV2LT5kZXYpKQorCWlmIChkZXZpY2VfbWF5X3dha2V1cCgmcGRldi0+ZGV2KSkgewogCQllbmFibGVfaXJxX3dha2UoYm9hcmQtPmRldF9waW4pOwotCWVsc2UgeworCQlpZiAoYm9hcmQtPmlycV9waW4pCisJCQllbmFibGVfaXJxX3dha2UoYm9hcmQtPmlycV9waW4pOworCX0gZWxzZSB7CiAJCWRpc2FibGVfaXJxX3dha2UoYm9hcmQtPmRldF9waW4pOwotCQlkaXNhYmxlX2lycShib2FyZC0+ZGV0X3Bpbik7CisJCWlmIChib2FyZC0+aXJxX3BpbikKKwkJCWRpc2FibGVfaXJxX3dha2UoYm9hcmQtPmlycV9waW4pOwogCX0KLQlpZiAoYm9hcmQtPmlycV9waW4pCi0JCWRpc2FibGVfaXJxKGJvYXJkLT5pcnFfcGluKTsKIAlyZXR1cm4gMDsKIH0KIAogc3RhdGljIGludCBhdDkxX2NmX3Jlc3VtZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQogewotCXN0cnVjdCBhdDkxX2NmX3NvY2tldAkqY2YgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKLQlzdHJ1Y3QgYXQ5MV9jZl9kYXRhCSpib2FyZCA9IGNmLT5ib2FyZDsKLQotCWlmIChib2FyZC0+aXJxX3BpbikKLQkJZW5hYmxlX2lycShib2FyZC0+aXJxX3Bpbik7Ci0JaWYgKCFkZXZpY2VfbWF5X3dha2V1cCgmcGRldi0+ZGV2KSkKLQkJZW5hYmxlX2lycShib2FyZC0+ZGV0X3Bpbik7CiAJcGNtY2lhX3NvY2tldF9kZXZfcmVzdW1lKCZwZGV2LT5kZXYpOwogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY21jaWEvYXUxMDAwX2dlbmVyaWMuYyBiL2RyaXZlcnMvcGNtY2lhL2F1MTAwMF9nZW5lcmljLmMKaW5kZXggZDVkZDBjZS4uNTUxYmRlNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY21jaWEvYXUxMDAwX2dlbmVyaWMuYworKysgYi9kcml2ZXJzL3BjbWNpYS9hdTEwMDBfZ2VuZXJpYy5jCkBAIC0zNTEsNiArMzUxLDcgQEAKIGludCBhdTF4MDBfcGNtY2lhX3NvY2tldF9wcm9iZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBwY21jaWFfbG93X2xldmVsICpvcHMsIGludCBmaXJzdCwgaW50IG5yKQogewogCXN0cnVjdCBza3RfZGV2X2luZm8gKnNpbmZvOworCXN0cnVjdCBhdTEwMDBfcGNtY2lhX3NvY2tldCAqc2t0OwogCWludCByZXQsIGk7CiAKIAlzaW5mbyA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBza3RfZGV2X2luZm8pLCBHRlBfS0VSTkVMKTsKQEAgLTM2NSw3ICszNjYsNyBAQAogCSAqIEluaXRpYWxpc2UgdGhlIHBlci1zb2NrZXQgc3RydWN0dXJlLgogCSAqLwogCWZvciAoaSA9IDA7IGkgPCBucjsgaSsrKSB7Ci0JCXN0cnVjdCBhdTEwMDBfcGNtY2lhX3NvY2tldCAqc2t0ID0gUENNQ0lBX1NPQ0tFVChpKTsKKwkJc2t0ID0gUENNQ0lBX1NPQ0tFVChpKTsKIAkJbWVtc2V0KHNrdCwgMCwgc2l6ZW9mKCpza3QpKTsKIAogCQlza3QtPnNvY2tldC5yZXNvdXJjZV9vcHMgPSAmcGNjYXJkX3N0YXRpY19vcHM7CkBAIC00MzgsMTcgKzQzOSwyOSBAQAogCWRldl9zZXRfZHJ2ZGF0YShkZXYsIHNpbmZvKTsKIAlyZXR1cm4gMDsKIAotCWRvIHsKLQkJc3RydWN0IGF1MTAwMF9wY21jaWFfc29ja2V0ICpza3QgPSBQQ01DSUFfU09DS0VUKGkpOworCitvdXRfZXJyOgorCWZsdXNoX3NjaGVkdWxlZF93b3JrKCk7CisJb3BzLT5od19zaHV0ZG93bihza3QpOworCXdoaWxlIChpLS0gPiAwKSB7CisJCXNrdCA9IFBDTUNJQV9TT0NLRVQoaSk7CiAKIAkJZGVsX3RpbWVyX3N5bmMoJnNrdC0+cG9sbF90aW1lcik7CiAJCXBjbWNpYV91bnJlZ2lzdGVyX3NvY2tldCgmc2t0LT5zb2NrZXQpOwotb3V0X2VycjoKIAkJZmx1c2hfc2NoZWR1bGVkX3dvcmsoKTsKKwkJaWYgKGkgPT0gMCkgeworCQkJaW91bm1hcChza3QtPnZpcnRfaW8gKyAodTMyKW1pcHNfaW9fcG9ydF9iYXNlKTsKKwkJCXNrdC0+dmlydF9pbyA9IE5VTEw7CisJCX0KKyNpZm5kZWYgQ09ORklHX01JUFNfWFhTMTUwMAorCQllbHNlIHsKKwkJCWlvdW5tYXAoc2t0LT52aXJ0X2lvICsgKHUzMiltaXBzX2lvX3BvcnRfYmFzZSk7CisJCQlza3QtPnZpcnRfaW8gPSBOVUxMOworCQl9CisjZW5kaWYKIAkJb3BzLT5od19zaHV0ZG93bihza3QpOwogCi0JCWktLTsKLQl9IHdoaWxlIChpID4gMCk7CisJfQogCWtmcmVlKHNpbmZvKTsKIG91dDoKIAlyZXR1cm4gcmV0OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY21jaWEvZHMuYyBiL2RyaXZlcnMvcGNtY2lhL2RzLmMKaW5kZXggNzRiMzEyNC4uYTIwZDg0ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY21jaWEvZHMuYworKysgYi9kcml2ZXJzL3BjbWNpYS9kcy5jCkBAIC03MTcsNiArNzE3LDcgQEAKIHN0YXRpYyB2b2lkIHBjbWNpYV9idXNfcmVzY2FuKHN0cnVjdCBwY21jaWFfc29ja2V0ICpza3QpCiB7CiAJaW50IG5vX2RldmljZXM9MDsKKwlpbnQgcmV0ID0gMDsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCiAJLyogbXVzdCBiZSBjYWxsZWQgd2l0aCBza3RfbXV0ZXggaGVsZCAqLwpAQCAtNzI5LDcgKzczMCw3IEBACiAJICogbWlzc2luZyByZXNvdXJjZSBpbmZvcm1hdGlvbiBvciBvdGhlciB0cm91YmxlLCB3ZSBuZWVkIHRvCiAJICogZG8gdGhpcyBub3cuICovCiAJaWYgKG5vX2RldmljZXMpIHsKLQkJaW50IHJldCA9IHBjbWNpYV9jYXJkX2FkZChza3QpOworCQlyZXQgPSBwY21jaWFfY2FyZF9hZGQoc2t0KTsKIAkJaWYgKHJldCkKIAkJCXJldHVybjsKIAl9CkBAIC03NDEsNyArNzQyLDkgQEAKIAogCS8qIHdlIHJlLXNjYW4gYWxsIGRldmljZXMsIG5vdCBqdXN0IHRoZSBvbmVzIGNvbm5lY3RlZCB0byB0aGlzCiAJICogc29ja2V0LiBUaGlzIGRvZXMgbm90IG1hdHRlciwgdGhvdWdoLiAqLwotCWJ1c19yZXNjYW5fZGV2aWNlcygmcGNtY2lhX2J1c190eXBlKTsKKwlyZXQgPSBidXNfcmVzY2FuX2RldmljZXMoJnBjbWNpYV9idXNfdHlwZSk7CisJaWYgKHJldCkKKwkJcHJpbnRrKEtFUk5fSU5GTyAicGNtY2lhOiBidXNfcmVzY2FuX2RldmljZXMgZmFpbGVkXG4iKTsKIH0KIAogc3RhdGljIGlubGluZSBpbnQgcGNtY2lhX2Rldm1hdGNoKHN0cnVjdCBwY21jaWFfZGV2aWNlICpkZXYsCkBAIC0xMDAxLDYgKzEwMDQsNyBAQAogCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCiB7CiAJc3RydWN0IHBjbWNpYV9kZXZpY2UgKnBfZGV2ID0gdG9fcGNtY2lhX2RldihkZXYpOworCWludCByZXQ7CiAKIAlpZiAoIWNvdW50KQogCQlyZXR1cm4gLUVJTlZBTDsKQEAgLTEwMDksNyArMTAxMywxMCBAQAogCXBfZGV2LT5hbGxvd19mdW5jX2lkX21hdGNoID0gMTsKIAltdXRleF91bmxvY2soJnBfZGV2LT5zb2NrZXQtPnNrdF9tdXRleCk7CiAKLQlidXNfcmVzY2FuX2RldmljZXMoJnBjbWNpYV9idXNfdHlwZSk7CisJcmV0ID0gYnVzX3Jlc2Nhbl9kZXZpY2VzKCZwY21jaWFfYnVzX3R5cGUpOworCWlmIChyZXQpCisJCXByaW50ayhLRVJOX0lORk8gInBjbWNpYTogYnVzX3Jlc2Nhbl9kZXZpY2VzIGZhaWxlZCBhZnRlciAiCisJCSAgICAgICAiYWxsb3dpbmcgZnVuY19pZCBtYXRjaGVzXG4iKTsKIAogCXJldHVybiBjb3VudDsKIH0KQEAgLTEyNjQsNiArMTI3MSw5IEBACiAJc29ja2V0LT5wY21jaWFfc3RhdGUuZGVhZCA9IDE7CiAJcGNjYXJkX3JlZ2lzdGVyX3BjbWNpYShzb2NrZXQsIE5VTEwpOwogCisJLyogdW5yZWdpc3RlciBhbnkgdW5ib3VuZCBkZXZpY2VzICovCisJcGNtY2lhX2NhcmRfcmVtb3ZlKHNvY2tldCwgTlVMTCk7CisKIAlwY21jaWFfcHV0X3NvY2tldChzb2NrZXQpOwogCiAJcmV0dXJuOwpAQCAtMTI5MiwxMCArMTMwMiwyMiBAQAogCiBzdGF0aWMgaW50IF9faW5pdCBpbml0X3BjbWNpYV9idXModm9pZCkKIHsKKwlpbnQgcmV0OworCiAJc3Bpbl9sb2NrX2luaXQoJnBjbWNpYV9kZXZfbGlzdF9sb2NrKTsKIAotCWJ1c19yZWdpc3RlcigmcGNtY2lhX2J1c190eXBlKTsKLQljbGFzc19pbnRlcmZhY2VfcmVnaXN0ZXIoJnBjbWNpYV9idXNfaW50ZXJmYWNlKTsKKwlyZXQgPSBidXNfcmVnaXN0ZXIoJnBjbWNpYV9idXNfdHlwZSk7CisJaWYgKHJldCA8IDApIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAicGNtY2lhOiBidXNfcmVnaXN0ZXIgZXJyb3I6ICVkXG4iLCByZXQpOworCQlyZXR1cm4gcmV0OworCX0KKwlyZXQgPSBjbGFzc19pbnRlcmZhY2VfcmVnaXN0ZXIoJnBjbWNpYV9idXNfaW50ZXJmYWNlKTsKKwlpZiAocmV0IDwgMCkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HCisJCQkicGNtY2lhOiBjbGFzc19pbnRlcmZhY2VfcmVnaXN0ZXIgZXJyb3I6ICVkXG4iLCByZXQpOworCQlidXNfdW5yZWdpc3RlcigmcGNtY2lhX2J1c190eXBlKTsKKwkJcmV0dXJuIHJldDsKKwl9CiAKIAlwY21jaWFfc2V0dXBfaW9jdGwoKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY21jaWEvaTgyMDkyLmMgYi9kcml2ZXJzL3BjbWNpYS9pODIwOTIuYwppbmRleCA4MjcxNWY0Li5jMmVhMDdhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjbWNpYS9pODIwOTIuYworKysgYi9kcml2ZXJzL3BjbWNpYS9pODIwOTIuYwpAQCAtNDEsNiArNDEsNyBAQAogfTsKIE1PRFVMRV9ERVZJQ0VfVEFCTEUocGNpLCBpODIwOTJhYV9wY2lfaWRzKTsKIAorI2lmZGVmIENPTkZJR19QTQogc3RhdGljIGludCBpODIwOTJhYV9zb2NrZXRfc3VzcGVuZCAoc3RydWN0IHBjaV9kZXYgKmRldiwgcG1fbWVzc2FnZV90IHN0YXRlKQogewogCXJldHVybiBwY21jaWFfc29ja2V0X2Rldl9zdXNwZW5kKCZkZXYtPmRldiwgc3RhdGUpOwpAQCAtNTAsMTQgKzUxLDE3IEBACiB7CiAJcmV0dXJuIHBjbWNpYV9zb2NrZXRfZGV2X3Jlc3VtZSgmZGV2LT5kZXYpOwogfQorI2VuZGlmCiAKIHN0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciBpODIwOTJhYV9wY2lfZHJ2ID0gewogCS5uYW1lICAgICAgICAgICA9ICJpODIwOTJhYSIsCiAJLmlkX3RhYmxlICAgICAgID0gaTgyMDkyYWFfcGNpX2lkcywKIAkucHJvYmUgICAgICAgICAgPSBpODIwOTJhYV9wY2lfcHJvYmUsCiAJLnJlbW92ZSAgICAgICAgID0gX19kZXZleGl0X3AoaTgyMDkyYWFfcGNpX3JlbW92ZSksCisjaWZkZWYgQ09ORklHX1BNCiAJLnN1c3BlbmQgICAgICAgID0gaTgyMDkyYWFfc29ja2V0X3N1c3BlbmQsCiAJLnJlc3VtZSAgICAgICAgID0gaTgyMDkyYWFfc29ja2V0X3Jlc3VtZSwKKyNlbmRpZgogfTsKIAogCkBAIC03MDUsMTAgKzcwOSw3IEBACiAKIHN0YXRpYyBpbnQgaTgyMDkyYWFfbW9kdWxlX2luaXQodm9pZCkKIHsKLQllbnRlcigiaTgyMDkyYWFfbW9kdWxlX2luaXQiKTsKLQlwY2lfcmVnaXN0ZXJfZHJpdmVyKCZpODIwOTJhYV9wY2lfZHJ2KTsKLQlsZWF2ZSgiaTgyMDkyYWFfbW9kdWxlX2luaXQiKTsKLQlyZXR1cm4gMDsKKwlyZXR1cm4gcGNpX3JlZ2lzdGVyX2RyaXZlcigmaTgyMDkyYWFfcGNpX2Rydik7CiB9CiAKIHN0YXRpYyB2b2lkIGk4MjA5MmFhX21vZHVsZV9leGl0KHZvaWQpCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjbWNpYS9tOHh4X3BjbWNpYS5jIGIvZHJpdmVycy9wY21jaWEvbTh4eF9wY21jaWEuYwppbmRleCBlMDcwYTI4Li4zYjcyYmU4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjbWNpYS9tOHh4X3BjbWNpYS5jCisrKyBiL2RyaXZlcnMvcGNtY2lhL204eHhfcGNtY2lhLmMKQEAgLTQyNyw3ICs0MjcsNyBAQAogCQkJcmVnIHw9IEJDU1IxX1BDQ1ZDQzE7CiAJCQlicmVhazsKIAkJZGVmYXVsdDoKLQkJCXJldHVybiAxOworCQkJZ290byBvdXRfdW5tYXA7CiAJfQogCiAJc3dpdGNoKHZwcCkgewpAQCAtNDM4LDE1ICs0MzgsMTUgQEAKIAkJCWlmKHZjYyA9PSB2cHApCiAJCQkJcmVnIHw9IEJDU1IxX1BDQ1ZQUDE7CiAJCQllbHNlCi0JCQkJcmV0dXJuIDE7CisJCQkJZ290byBvdXRfdW5tYXA7CiAJCQlicmVhazsKIAkJY2FzZSAxMjA6CiAJCQlpZiAoKHZjYyA9PSAzMykgfHwgKHZjYyA9PSA1MCkpCiAJCQkJcmVnIHw9IEJDU1IxX1BDQ1ZQUDA7CiAJCQllbHNlCi0JCQkJcmV0dXJuIDE7CisJCQkJZ290byBvdXRfdW5tYXA7CiAJCWRlZmF1bHQ6Ci0JCQlyZXR1cm4gMTsKKwkJCWdvdG8gb3V0X3VubWFwOwogCX0KIAogCS8qIGZpcnN0LCB0dXJuIG9mZiBhbGwgcG93ZXIgKi8KQEAgLTQ1Nyw2ICs0NTcsMTAgQEAKIAogCWlvdW5tYXAoYmNzcl9pbyk7CiAJcmV0dXJuIDA7CisKK291dF91bm1hcDoKKwlpb3VubWFwKGJjc3JfaW8pOworCXJldHVybiAxOwogfQogCiAjZGVmaW5lIHNvY2tldF9nZXQoX3Nsb3RfKSBQQ01DSUFfU09DS0VUX0tFWV81VgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY21jaWEvb21hcF9jZi5jIGIvZHJpdmVycy9wY21jaWEvb21hcF9jZi5jCmluZGV4IGM4ZTgzOGMuLjA2YmY3ZjQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNtY2lhL29tYXBfY2YuYworKysgYi9kcml2ZXJzL3BjbWNpYS9vbWFwX2NmLmMKQEAgLTMwOSw5ICszMDksMTAgQEAKIAlyZXR1cm4gMDsKIAogZmFpbDI6Ci0JaW91bm1hcCgodm9pZCBfX2lvbWVtICopIGNmLT5zb2NrZXQuaW9fb2Zmc2V0KTsKIAlyZWxlYXNlX21lbV9yZWdpb24oY2YtPnBoeXNfY2YsIFNaXzhLKTsKIGZhaWwxOgorCWlmIChjZi0+c29ja2V0LmlvX29mZnNldCkKKwkJaW91bm1hcCgodm9pZCBfX2lvbWVtICopIGNmLT5zb2NrZXQuaW9fb2Zmc2V0KTsKIAlmcmVlX2lycShpcnEsIGNmKTsKIGZhaWwwOgogCWtmcmVlKGNmKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNtY2lhL3BjbWNpYV9pb2N0bC5jIGIvZHJpdmVycy9wY21jaWEvcGNtY2lhX2lvY3RsLmMKaW5kZXggOWFkMThlNi4uMzEwZWRlNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY21jaWEvcGNtY2lhX2lvY3RsLmMKKysrIGIvZHJpdmVycy9wY21jaWEvcGNtY2lhX2lvY3RsLmMKQEAgLTEyOCw5ICsxMjgsMTIgQEAKIAkJCSAgICAgaW50IGNvdW50LCBpbnQgKmVvZiwgdm9pZCAqZGF0YSkKIHsKIAljaGFyICpwID0gYnVmOworCWludCByYzsKIAotCWJ1c19mb3JfZWFjaF9kcnYoJnBjbWNpYV9idXNfdHlwZSwgTlVMTCwKLQkJCSAodm9pZCAqKSAmcCwgcHJvY19yZWFkX2RyaXZlcnNfY2FsbGJhY2spOworCXJjID0gYnVzX2Zvcl9lYWNoX2RydigmcGNtY2lhX2J1c190eXBlLCBOVUxMLAorCQkJICAgICAgKHZvaWQgKikgJnAsIHByb2NfcmVhZF9kcml2ZXJzX2NhbGxiYWNrKTsKKwlpZiAocmMgPCAwKQorCQlyZXR1cm4gcmM7CiAKIAlyZXR1cm4gKHAgLSBidWYpOwogfQpAQCAtMjY5LDggKzI3MiwxMCBAQAogCSAqIFByZXZlbnQgdGhpcyByYWNpbmcgd2l0aCBhIGNhcmQgaW5zZXJ0aW9uLgogCSAqLwogCW11dGV4X2xvY2soJnMtPnNrdF9tdXRleCk7Ci0JYnVzX3Jlc2Nhbl9kZXZpY2VzKCZwY21jaWFfYnVzX3R5cGUpOworCXJldCA9IGJ1c19yZXNjYW5fZGV2aWNlcygmcGNtY2lhX2J1c190eXBlKTsKIAltdXRleF91bmxvY2soJnMtPnNrdF9tdXRleCk7CisJaWYgKHJldCkKKwkJZ290byBlcnJfcHV0X21vZHVsZTsKIAogCS8qIGNoZWNrIHdoZXRoZXIgdGhlIGRyaXZlciBpbmRlZWQgbWF0Y2hlZC4gSSBkb24ndCBjYXJlIGlmIHRoaXMKIAkgKiBpcyByYWN5IG9yIG5vdCwgYmVjYXVzZSBpdCBjYW4gb25seSBoYXBwZW4gb24gY2FyZG1nciBhY2Nlc3MKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNtY2lhL3BjbWNpYV9yZXNvdXJjZS5jIGIvZHJpdmVycy9wY21jaWEvcGNtY2lhX3Jlc291cmNlLmMKaW5kZXggNzRjZWJkNC4uYjkyMDFjMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY21jaWEvcGNtY2lhX3Jlc291cmNlLmMKKysrIGIvZHJpdmVycy9wY21jaWEvcGNtY2lhX3Jlc291cmNlLmMKQEAgLTk1LDcgKzk1LDcgQEAKIAkgKiBwb3RlbnRpYWwgY29uZmxpY3RzLCBqdXN0IHRoZSBtb3N0IG9idmlvdXMgb25lcy4KIAkgKi8KIAlmb3IgKGkgPSAwOyBpIDwgTUFYX0lPX1dJTjsgaSsrKQotCQlpZiAoKHMtPmlvW2ldLnJlcykgJiYKKwkJaWYgKChzLT5pb1tpXS5yZXMpICYmICpiYXNlICYmCiAJCSAgICAoKHMtPmlvW2ldLnJlcy0+c3RhcnQgJiAoYWxpZ24tMSkpID09ICpiYXNlKSkKIAkJCXJldHVybiAxOwogCWZvciAoaSA9IDA7IGkgPCBNQVhfSU9fV0lOOyBpKyspIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNtY2lhL3BkNjcyOS5jIGIvZHJpdmVycy9wY21jaWEvcGQ2NzI5LmMKaW5kZXggYzgzYTBhNi4uYTcwZjk3ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY21jaWEvcGQ2NzI5LmMKKysrIGIvZHJpdmVycy9wY21jaWEvcGQ2NzI5LmMKQEAgLTc1NSw2ICs3NTUsNyBAQAogCWtmcmVlKHNvY2tldCk7CiB9CiAKKyNpZmRlZiBDT05GSUdfUE0KIHN0YXRpYyBpbnQgcGQ2NzI5X3NvY2tldF9zdXNwZW5kKHN0cnVjdCBwY2lfZGV2ICpkZXYsIHBtX21lc3NhZ2VfdCBzdGF0ZSkKIHsKIAlyZXR1cm4gcGNtY2lhX3NvY2tldF9kZXZfc3VzcGVuZCgmZGV2LT5kZXYsIHN0YXRlKTsKQEAgLTc2NCw2ICs3NjUsNyBAQAogewogCXJldHVybiBwY21jaWFfc29ja2V0X2Rldl9yZXN1bWUoJmRldi0+ZGV2KTsKIH0KKyNlbmRpZgogCiBzdGF0aWMgc3RydWN0IHBjaV9kZXZpY2VfaWQgcGQ2NzI5X3BjaV9pZHNbXSA9IHsKIAl7CkBAIC03ODEsOCArNzgzLDEwIEBACiAJLmlkX3RhYmxlCT0gcGQ2NzI5X3BjaV9pZHMsCiAJLnByb2JlCQk9IHBkNjcyOV9wY2lfcHJvYmUsCiAJLnJlbW92ZQkJPSBfX2RldmV4aXRfcChwZDY3MjlfcGNpX3JlbW92ZSksCisjaWZkZWYgQ09ORklHX1BNCiAJLnN1c3BlbmQJPSBwZDY3Mjlfc29ja2V0X3N1c3BlbmQsCiAJLnJlc3VtZQkJPSBwZDY3Mjlfc29ja2V0X3Jlc3VtZSwKKyNlbmRpZgogfTsKIAogc3RhdGljIGludCBwZDY3MjlfbW9kdWxlX2luaXQodm9pZCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNtY2lhL3B4YTJ4eF9iYXNlLmMgYi9kcml2ZXJzL3BjbWNpYS9weGEyeHhfYmFzZS5jCmluZGV4IGIzNTE4MTMuLmRjYTlmODUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNtY2lhL3B4YTJ4eF9iYXNlLmMKKysrIGIvZHJpdmVycy9wY21jaWEvcHhhMnh4X2Jhc2UuYwpAQCAtMTY2LDcgKzE2Niw3IEBACiB9CiAjZW5kaWYKIAotaW50IHB4YTJ4eF9kcnZfcGNtY2lhX3Byb2JlKHN0cnVjdCBkZXZpY2UgKmRldikKK2ludCBfX3B4YTJ4eF9kcnZfcGNtY2lhX3Byb2JlKHN0cnVjdCBkZXZpY2UgKmRldikKIHsKIAlpbnQgcmV0OwogCXN0cnVjdCBwY21jaWFfbG93X2xldmVsICpvcHM7CkBAIC0yMDMsMzUgKzIwMyw1MiBAQAogCiAJcmV0dXJuIHJldDsKIH0KLUVYUE9SVF9TWU1CT0wocHhhMnh4X2Rydl9wY21jaWFfcHJvYmUpOworRVhQT1JUX1NZTUJPTChfX3B4YTJ4eF9kcnZfcGNtY2lhX3Byb2JlKTsKIAotc3RhdGljIGludCBweGEyeHhfZHJ2X3BjbWNpYV9yZXN1bWUoc3RydWN0IGRldmljZSAqZGV2KQorCitzdGF0aWMgaW50IHB4YTJ4eF9kcnZfcGNtY2lhX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmRldikKIHsKLQlzdHJ1Y3QgcGNtY2lhX2xvd19sZXZlbCAqb3BzID0gZGV2LT5wbGF0Zm9ybV9kYXRhOworCXJldHVybiBfX3B4YTJ4eF9kcnZfcGNtY2lhX3Byb2JlKCZkZXYtPmRldik7Cit9CisKK3N0YXRpYyBpbnQgcHhhMnh4X2Rydl9wY21jaWFfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmRldikKK3sKKwlyZXR1cm4gc29jX2NvbW1vbl9kcnZfcGNtY2lhX3JlbW92ZSgmZGV2LT5kZXYpOworfQorCitzdGF0aWMgaW50IHB4YTJ4eF9kcnZfcGNtY2lhX3N1c3BlbmQoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqZGV2LCBwbV9tZXNzYWdlX3Qgc3RhdGUpCit7CisJcmV0dXJuIHBjbWNpYV9zb2NrZXRfZGV2X3N1c3BlbmQoJmRldi0+ZGV2LCBzdGF0ZSk7Cit9CisKK3N0YXRpYyBpbnQgcHhhMnh4X2Rydl9wY21jaWFfcmVzdW1lKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgcGNtY2lhX2xvd19sZXZlbCAqb3BzID0gZGV2LT5kZXYucGxhdGZvcm1fZGF0YTsKIAlpbnQgbnIgPSBvcHMgPyBvcHMtPm5yIDogMDsKIAogCU1FQ1IgPSBuciA+IDEgPyBNRUNSX0NJVCB8IE1FQ1JfTk9TIDogKG5yID4gMCA/IE1FQ1JfQ0lUIDogMCk7CiAKLQlyZXR1cm4gcGNtY2lhX3NvY2tldF9kZXZfcmVzdW1lKGRldik7CisJcmV0dXJuIHBjbWNpYV9zb2NrZXRfZGV2X3Jlc3VtZSgmZGV2LT5kZXYpOwogfQogCi1zdGF0aWMgc3RydWN0IGRldmljZV9kcml2ZXIgcHhhMnh4X3BjbWNpYV9kcml2ZXIgPSB7CitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBweGEyeHhfcGNtY2lhX2RyaXZlciA9IHsKIAkucHJvYmUJCT0gcHhhMnh4X2Rydl9wY21jaWFfcHJvYmUsCi0JLnJlbW92ZQkJPSBzb2NfY29tbW9uX2Rydl9wY21jaWFfcmVtb3ZlLAotCS5zdXNwZW5kIAk9IHBjbWNpYV9zb2NrZXRfZGV2X3N1c3BlbmQsCisJLnJlbW92ZQkJPSBweGEyeHhfZHJ2X3BjbWNpYV9yZW1vdmUsCisJLnN1c3BlbmQgCT0gcHhhMnh4X2Rydl9wY21jaWFfc3VzcGVuZCwKIAkucmVzdW1lIAk9IHB4YTJ4eF9kcnZfcGNtY2lhX3Jlc3VtZSwKLQkubmFtZQkJPSAicHhhMnh4LXBjbWNpYSIsCi0JLmJ1cwkJPSAmcGxhdGZvcm1fYnVzX3R5cGUsCisJLmRyaXZlcgkJPSB7CisJCS5uYW1lCT0gInB4YTJ4eC1wY21jaWEiLAorCX0sCiB9OwogCiBzdGF0aWMgaW50IF9faW5pdCBweGEyeHhfcGNtY2lhX2luaXQodm9pZCkKIHsKLQlyZXR1cm4gZHJpdmVyX3JlZ2lzdGVyKCZweGEyeHhfcGNtY2lhX2RyaXZlcik7CisJcmV0dXJuIHBsYXRmb3JtX2RyaXZlcl9yZWdpc3RlcigmcHhhMnh4X3BjbWNpYV9kcml2ZXIpOwogfQogCiBzdGF0aWMgdm9pZCBfX2V4aXQgcHhhMnh4X3BjbWNpYV9leGl0KHZvaWQpCiB7Ci0JZHJpdmVyX3VucmVnaXN0ZXIoJnB4YTJ4eF9wY21jaWFfZHJpdmVyKTsKKwlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3RlcigmcHhhMnh4X3BjbWNpYV9kcml2ZXIpOwogfQogCiBmc19pbml0Y2FsbChweGEyeHhfcGNtY2lhX2luaXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY21jaWEvcHhhMnh4X2Jhc2UuaCBiL2RyaXZlcnMvcGNtY2lhL3B4YTJ4eF9iYXNlLmgKaW5kZXggZTQ2Y2ZmMy4uMjM1ZDY4MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY21jaWEvcHhhMnh4X2Jhc2UuaAorKysgYi9kcml2ZXJzL3BjbWNpYS9weGEyeHhfYmFzZS5oCkBAIC0xLDMgKzEsMyBAQAogLyogdGVtcG9yYXJ5IG1lYXN1cmUgKi8KLWV4dGVybiBpbnQgcHhhMnh4X2Rydl9wY21jaWFfcHJvYmUoc3RydWN0IGRldmljZSAqKTsKK2V4dGVybiBpbnQgX19weGEyeHhfZHJ2X3BjbWNpYV9wcm9iZShzdHJ1Y3QgZGV2aWNlICopOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjbWNpYS9weGEyeHhfbHViYm9jay5jIGIvZHJpdmVycy9wY21jaWEvcHhhMnh4X2x1YmJvY2suYwppbmRleCBmZDFmNjkxLi5hOTJmMTExIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjbWNpYS9weGEyeHhfbHViYm9jay5jCisrKyBiL2RyaXZlcnMvcGNtY2lhL3B4YTJ4eF9sdWJib2NrLmMKQEAgLTI2MCw3ICsyNjAsNyBAQAogCQlsdWJib2NrX3NldF9taXNjX3dyKCgxIDw8IDE1KSB8ICgxIDw8IDE0KSwgMCk7CiAKIAkJc2FkZXYtPmRldi5wbGF0Zm9ybV9kYXRhID0gJmx1YmJvY2tfcGNtY2lhX29wczsKLQkJcmV0ID0gcHhhMnh4X2Rydl9wY21jaWFfcHJvYmUoJnNhZGV2LT5kZXYpOworCQlyZXQgPSBfX3B4YTJ4eF9kcnZfcGNtY2lhX3Byb2JlKCZzYWRldi0+ZGV2KTsKIAl9CiAKIAlyZXR1cm4gcmV0OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY21jaWEvc29jX2NvbW1vbi5jIGIvZHJpdmVycy9wY21jaWEvc29jX2NvbW1vbi5jCmluZGV4IDM2MjdlNTIuLmU0MzM3MDQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNtY2lhL3NvY19jb21tb24uYworKysgYi9kcml2ZXJzL3BjbWNpYS9zb2NfY29tbW9uLmMKQEAgLTgyNCwzICs4MjQsNCBAQAogCiAJcmV0dXJuIDA7CiB9CitFWFBPUlRfU1lNQk9MKHNvY19jb21tb25fZHJ2X3BjbWNpYV9yZW1vdmUpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY21jaWEveWVudGFfc29ja2V0LmMgYi9kcml2ZXJzL3BjbWNpYS95ZW50YV9zb2NrZXQuYwppbmRleCAyNjIyOWQ5Li5kYTQ3MWJkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjbWNpYS95ZW50YV9zb2NrZXQuYworKysgYi9kcml2ZXJzL3BjbWNpYS95ZW50YV9zb2NrZXQuYwpAQCAtMTE5Nyw4ICsxMTk3LDEyIEBACiAJcmV0ID0gcGNtY2lhX3JlZ2lzdGVyX3NvY2tldCgmc29ja2V0LT5zb2NrZXQpOwogCWlmIChyZXQgPT0gMCkgewogCQkvKiBBZGQgdGhlIHllbnRhIHJlZ2lzdGVyIGF0dHJpYnV0ZXMgKi8KLQkJZGV2aWNlX2NyZWF0ZV9maWxlKCZkZXYtPmRldiwgJmRldl9hdHRyX3llbnRhX3JlZ2lzdGVycyk7Ci0JCWdvdG8gb3V0OworCQlyZXQgPSBkZXZpY2VfY3JlYXRlX2ZpbGUoJmRldi0+ZGV2LCAmZGV2X2F0dHJfeWVudGFfcmVnaXN0ZXJzKTsKKwkJaWYgKHJldCA9PSAwKQorCQkJZ290byBvdXQ7CisKKwkJLyogZXJyb3IgcGF0aC4uLiAqLworCQlwY21jaWFfdW5yZWdpc3Rlcl9zb2NrZXQoJnNvY2tldC0+c29ja2V0KTsKIAl9CiAKICB1bm1hcDoKQEAgLTEyMTMsNyArMTIxNyw3IEBACiAJcmV0dXJuIHJldDsKIH0KIAotCisjaWZkZWYgQ09ORklHX1BNCiBzdGF0aWMgaW50IHllbnRhX2Rldl9zdXNwZW5kIChzdHJ1Y3QgcGNpX2RldiAqZGV2LCBwbV9tZXNzYWdlX3Qgc3RhdGUpCiB7CiAJc3RydWN0IHllbnRhX3NvY2tldCAqc29ja2V0ID0gcGNpX2dldF9kcnZkYXRhKGRldik7CkBAIC0xMjQ4LDEyICsxMjUyLDE4IEBACiAJc3RydWN0IHllbnRhX3NvY2tldCAqc29ja2V0ID0gcGNpX2dldF9kcnZkYXRhKGRldik7CiAKIAlpZiAoc29ja2V0KSB7CisJCWludCByYzsKKwogCQlwY2lfc2V0X3Bvd2VyX3N0YXRlKGRldiwgMCk7CiAJCS8qIEZJWE1FOiBwY2lfcmVzdG9yZV9zdGF0ZSBuZWVkcyB0byBoYXZlIGEgYmV0dGVyIGludGVyZmFjZSAqLwogCQlwY2lfcmVzdG9yZV9zdGF0ZShkZXYpOwogCQlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKGRldiwgMTYqNCwgc29ja2V0LT5zYXZlZF9zdGF0ZVswXSk7CiAJCXBjaV93cml0ZV9jb25maWdfZHdvcmQoZGV2LCAxNyo0LCBzb2NrZXQtPnNhdmVkX3N0YXRlWzFdKTsKLQkJcGNpX2VuYWJsZV9kZXZpY2UoZGV2KTsKKworCQlyYyA9IHBjaV9lbmFibGVfZGV2aWNlKGRldik7CisJCWlmIChyYykKKwkJCXJldHVybiByYzsKKwogCQlwY2lfc2V0X21hc3RlcihkZXYpOwogCiAJCWlmIChzb2NrZXQtPnR5cGUgJiYgc29ja2V0LT50eXBlLT5yZXN0b3JlX3N0YXRlKQpAQCAtMTI2Miw3ICsxMjcyLDcgQEAKIAogCXJldHVybiBwY21jaWFfc29ja2V0X2Rldl9yZXN1bWUoJmRldi0+ZGV2KTsKIH0KLQorI2VuZGlmCiAKICNkZWZpbmUgQ0JfSUQodmVuZCxkZXYsdHlwZSkJCQkJXAogCXsJCQkJCQlcCkBAIC0xMzU5LDggKzEzNjksMTAgQEAKIAkuaWRfdGFibGUJPSB5ZW50YV90YWJsZSwKIAkucHJvYmUJCT0geWVudGFfcHJvYmUsCiAJLnJlbW92ZQkJPSBfX2RldmV4aXRfcCh5ZW50YV9jbG9zZSksCisjaWZkZWYgQ09ORklHX1BNCiAJLnN1c3BlbmQJPSB5ZW50YV9kZXZfc3VzcGVuZCwKIAkucmVzdW1lCQk9IHllbnRhX2Rldl9yZXN1bWUsCisjZW5kaWYKIH07CiAKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9wbnAvcG5wYWNwaS9yc3BhcnNlci5jIGIvZHJpdmVycy9wbnAvcG5wYWNwaS9yc3BhcnNlci5jCmluZGV4IGRjNzliMGEuLjM3OTA0OGYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcG5wL3BucGFjcGkvcnNwYXJzZXIuYworKysgYi9kcml2ZXJzL3BucC9wbnBhY3BpL3JzcGFyc2VyLmMKQEAgLTc3NiwyMSArNzc2LDMyIEBACiAJc3RydWN0IHJlc291cmNlICpwKQogewogCS8qIE5vdGU6IHBucF9hc3NpZ25fZG1hIHdpbGwgY29weSBwbnBfZG1hLT5mbGFncyBpbnRvIHAtPmZsYWdzICovCi0JaWYgKHAtPmZsYWdzICYgSU9SRVNPVVJDRV9ETUFfQ09NUEFUSUJMRSkKLQkJcmVzb3VyY2UtPmRhdGEuZG1hLnR5cGUgPSBBQ1BJX0NPTVBBVElCSUxJVFk7Ci0JZWxzZSBpZiAocC0+ZmxhZ3MgJiBJT1JFU09VUkNFX0RNQV9UWVBFQSkKLQkJcmVzb3VyY2UtPmRhdGEuZG1hLnR5cGUgPSBBQ1BJX1RZUEVfQTsKLQllbHNlIGlmIChwLT5mbGFncyAmIElPUkVTT1VSQ0VfRE1BX1RZUEVCKQotCQlyZXNvdXJjZS0+ZGF0YS5kbWEudHlwZSA9IEFDUElfVFlQRV9COwotCWVsc2UgaWYgKHAtPmZsYWdzICYgSU9SRVNPVVJDRV9ETUFfVFlQRUYpCi0JCXJlc291cmNlLT5kYXRhLmRtYS50eXBlID0gQUNQSV9UWVBFX0Y7Ci0JaWYgKHAtPmZsYWdzICYgSU9SRVNPVVJDRV9ETUFfOEJJVCkKLQkJcmVzb3VyY2UtPmRhdGEuZG1hLnRyYW5zZmVyID0gQUNQSV9UUkFOU0ZFUl84OwotCWVsc2UgaWYgKHAtPmZsYWdzICYgSU9SRVNPVVJDRV9ETUFfOEFORDE2QklUKQotCQlyZXNvdXJjZS0+ZGF0YS5kbWEudHJhbnNmZXIgPSBBQ1BJX1RSQU5TRkVSXzhfMTY7Ci0JZWxzZSBpZiAocC0+ZmxhZ3MgJiBJT1JFU09VUkNFX0RNQV8xNkJJVCkKLQkJcmVzb3VyY2UtPmRhdGEuZG1hLnRyYW5zZmVyID0gQUNQSV9UUkFOU0ZFUl8xNjsKLQlyZXNvdXJjZS0+ZGF0YS5kbWEuYnVzX21hc3RlciA9IHAtPmZsYWdzICYgSU9SRVNPVVJDRV9ETUFfTUFTVEVSOworCXN3aXRjaCAocC0+ZmxhZ3MgJiBJT1JFU09VUkNFX0RNQV9TUEVFRF9NQVNLKSB7CisJCWNhc2UgSU9SRVNPVVJDRV9ETUFfVFlQRUE6CisJCQlyZXNvdXJjZS0+ZGF0YS5kbWEudHlwZSA9IEFDUElfVFlQRV9BOworCQkJYnJlYWs7CisJCWNhc2UgSU9SRVNPVVJDRV9ETUFfVFlQRUI6CisJCQlyZXNvdXJjZS0+ZGF0YS5kbWEudHlwZSA9IEFDUElfVFlQRV9COworCQkJYnJlYWs7CisJCWNhc2UgSU9SRVNPVVJDRV9ETUFfVFlQRUY6CisJCQlyZXNvdXJjZS0+ZGF0YS5kbWEudHlwZSA9IEFDUElfVFlQRV9GOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlyZXNvdXJjZS0+ZGF0YS5kbWEudHlwZSA9IEFDUElfQ09NUEFUSUJJTElUWTsKKwl9CisKKwlzd2l0Y2ggKHAtPmZsYWdzICYgSU9SRVNPVVJDRV9ETUFfVFlQRV9NQVNLKSB7CisJCWNhc2UgSU9SRVNPVVJDRV9ETUFfOEJJVDoKKwkJCXJlc291cmNlLT5kYXRhLmRtYS50cmFuc2ZlciA9IEFDUElfVFJBTlNGRVJfODsKKwkJCWJyZWFrOworCQljYXNlIElPUkVTT1VSQ0VfRE1BXzhBTkQxNkJJVDoKKwkJCXJlc291cmNlLT5kYXRhLmRtYS50cmFuc2ZlciA9IEFDUElfVFJBTlNGRVJfOF8xNjsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJcmVzb3VyY2UtPmRhdGEuZG1hLnRyYW5zZmVyID0gQUNQSV9UUkFOU0ZFUl8xNjsKKwl9CisKKwlyZXNvdXJjZS0+ZGF0YS5kbWEuYnVzX21hc3RlciA9ICEhKHAtPmZsYWdzICYgSU9SRVNPVVJDRV9ETUFfTUFTVEVSKTsKIAlyZXNvdXJjZS0+ZGF0YS5kbWEuY2hhbm5lbF9jb3VudCA9IDE7CiAJcmVzb3VyY2UtPmRhdGEuZG1hLmNoYW5uZWxzWzBdID0gcC0+c3RhcnQ7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3J0Yy9ydGMtbWF4NjkwMi5jIGIvZHJpdmVycy9ydGMvcnRjLW1heDY5MDIuYwppbmRleCAwYjIwZGZhLi5kOTQxNzA3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3J0Yy9ydGMtbWF4NjkwMi5jCisrKyBiL2RyaXZlcnMvcnRjL3J0Yy1tYXg2OTAyLmMKQEAgLTEzNiw3ICsxMzYsNyBAQAogCWR0LT50bV9taW4JPSBCQ0QyQklOKGNoaXAtPmJ1ZlsyXSk7CiAJZHQtPnRtX2hvdXIJPSBCQ0QyQklOKGNoaXAtPmJ1ZlszXSk7CiAJZHQtPnRtX21kYXkJPSBCQ0QyQklOKGNoaXAtPmJ1Zls0XSk7Ci0JZHQtPnRtX21vbgk9IEJDRDJCSU4oY2hpcC0+YnVmWzVdIC0gMSk7CisJZHQtPnRtX21vbgk9IEJDRDJCSU4oY2hpcC0+YnVmWzVdKSAtIDE7CiAJZHQtPnRtX3dkYXkJPSBCQ0QyQklOKGNoaXAtPmJ1Zls2XSk7CiAJZHQtPnRtX3llYXIgPSBCQ0QyQklOKGNoaXAtPmJ1Zls3XSk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcnRjL3J0Yy1zaC5jIGIvZHJpdmVycy9ydGMvcnRjLXNoLmMKaW5kZXggOGI2ZWZjYy4uMTQzMzAyYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ydGMvcnRjLXNoLmMKKysrIGIvZHJpdmVycy9ydGMvcnRjLXNoLmMKQEAgLTE2MCw3ICsxNjAsNyBAQAogCXRtcCB8PSBSQ1IxX0NJRTsKIAl3cml0ZWIodG1wLCBydGMtPnJlZ2Jhc2UgKyBSQ1IxKTsKIAotCXJldCA9IHJlcXVlc3RfaXJxKHJ0Yy0+cGVyaW9kaWNfaXJxLCBzaF9ydGNfcGVyaW9kaWMsIFNBX0lOVEVSUlVQVCwKKwlyZXQgPSByZXF1ZXN0X2lycShydGMtPnBlcmlvZGljX2lycSwgc2hfcnRjX3BlcmlvZGljLCBJUlFGX0RJU0FCTEVELAogCQkJICAic2gtcnRjIHBlcmlvZCIsIGRldik7CiAJaWYgKHVubGlrZWx5KHJldCkpIHsKIAkJZGV2X2VycihkZXYsICJyZXF1ZXN0IHBlcmlvZCBJUlEgZmFpbGVkIHdpdGggJWQsIElSUSAlZFxuIiwKQEAgLTE2OCw3ICsxNjgsNyBAQAogCQlyZXR1cm4gcmV0OwogCX0KIAotCXJldCA9IHJlcXVlc3RfaXJxKHJ0Yy0+Y2FycnlfaXJxLCBzaF9ydGNfaW50ZXJydXB0LCBTQV9JTlRFUlJVUFQsCisJcmV0ID0gcmVxdWVzdF9pcnEocnRjLT5jYXJyeV9pcnEsIHNoX3J0Y19pbnRlcnJ1cHQsIElSUUZfRElTQUJMRUQsCiAJCQkgICJzaC1ydGMgY2FycnkiLCBkZXYpOwogCWlmICh1bmxpa2VseShyZXQpKSB7CiAJCWRldl9lcnIoZGV2LCAicmVxdWVzdCBjYXJyeSBJUlEgZmFpbGVkIHdpdGggJWQsIElSUSAlZFxuIiwKQEAgLTE3Nyw3ICsxNzcsNyBAQAogCQlnb3RvIGVycl9iYWRfY2Fycnk7CiAJfQogCi0JcmV0ID0gcmVxdWVzdF9pcnEocnRjLT5hbGFybV9pcnEsIHNoX3J0Y19pbnRlcnJ1cHQsIFNBX0lOVEVSUlVQVCwKKwlyZXQgPSByZXF1ZXN0X2lycShydGMtPmFsYXJtX2lycSwgc2hfcnRjX2ludGVycnVwdCwgSVJRRl9ESVNBQkxFRCwKIAkJCSAgInNoLXJ0YyBhbGFybSIsIGRldik7CiAJaWYgKHVubGlrZWx5KHJldCkpIHsKIAkJZGV2X2VycihkZXYsICJyZXF1ZXN0IGFsYXJtIElSUSBmYWlsZWQgd2l0aCAlZCwgSVJRICVkXG4iLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9ydGMvcnRjLXYzMDIwLmMgYi9kcml2ZXJzL3J0Yy9ydGMtdjMwMjAuYwppbmRleCAwOWI3MTRmLi4zYjU4ZDNkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3J0Yy9ydGMtdjMwMjAuYworKysgYi9kcml2ZXJzL3J0Yy9ydGMtdjMwMjAuYwpAQCAtMTk1LDkgKzE5NSw5IEBACiAJICogYXJlIGFsbCBkaXNhYmxlZCAqLwogCXYzMDIwX3NldF9yZWcoY2hpcCwgVjMwMjBfU1RBVFVTXzAsIDB4MCk7CiAKLQlkZXZfaW5mbygmcGRldi0+ZGV2LCAiQ2hpcCBhdmFpbGFibGUgYXQgcGh5c2ljYWwgYWRkcmVzcyAweCVwLCIKKwlkZXZfaW5mbygmcGRldi0+ZGV2LCAiQ2hpcCBhdmFpbGFibGUgYXQgcGh5c2ljYWwgYWRkcmVzcyAweCVsbHgsIgogCQkiZGF0YSBjb25uZWN0ZWQgdG8gRCVkXG4iLAotCQkodm9pZCopcGRldi0+cmVzb3VyY2VbMF0uc3RhcnQsCisJCSh1bnNpZ25lZCBsb25nIGxvbmcpcGRldi0+cmVzb3VyY2VbMF0uc3RhcnQsCiAJCWNoaXAtPmxlZnRzaGlmdCk7CiAKIAlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBjaGlwKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvczM5MC9ibG9jay9kYXNkLmMgYi9kcml2ZXJzL3MzOTAvYmxvY2svZGFzZC5jCmluZGV4IGQwNjQ3ZDEuLjc5ZmZlZjYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvczM5MC9ibG9jay9kYXNkLmMKKysrIGIvZHJpdmVycy9zMzkwL2Jsb2NrL2Rhc2QuYwpAQCAtMjAzLDYgKzIwMyw3IEBACiAJcmMgPSBkYXNkX2ZsdXNoX2Njd19xdWV1ZShkZXZpY2UsIDEpOwogCWlmIChyYykKIAkJcmV0dXJuIHJjOworCWRhc2RfY2xlYXJfdGltZXIoZGV2aWNlKTsKIAogCURCRl9ERVZfRVZFTlQoREJGX0VNRVJHLCBkZXZpY2UsICIlcCBkZWJ1ZyBhcmVhIGRlbGV0ZWQiLCBkZXZpY2UpOwogCWlmIChkZXZpY2UtPmRlYnVnX2FyZWEgIT0gTlVMTCkgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zMzkwL2NoYXIvbW9ud3JpdGVyLmMgYi9kcml2ZXJzL3MzOTAvY2hhci9tb253cml0ZXIuYwppbmRleCA0MzYyZmYyLi5iOWIwZmMzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3MzOTAvY2hhci9tb253cml0ZXIuYworKysgYi9kcml2ZXJzL3MzOTAvY2hhci9tb253cml0ZXIuYwpAQCAtNzMsMTIgKzczLDE1IEBACiAJc3RydWN0IG1vbl9idWYgKmVudHJ5LCAqbmV4dDsKIAogCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShlbnRyeSwgbmV4dCwgJm1vbnByaXYtPmxpc3QsIGxpc3QpCi0JCWlmIChlbnRyeS0+aGRyLmFwcGxpZCA9PSBtb25oZHItPmFwcGxpZCAmJgorCQlpZiAoKGVudHJ5LT5oZHIubW9uX2Z1bmN0aW9uID09IG1vbmhkci0+bW9uX2Z1bmN0aW9uIHx8CisJCSAgICAgbW9uaGRyLT5tb25fZnVuY3Rpb24gPT0gTU9OV1JJVEVfU1RPUF9JTlRFUlZBTCkgJiYKKwkJICAgIGVudHJ5LT5oZHIuYXBwbGlkID09IG1vbmhkci0+YXBwbGlkICYmCiAJCSAgICBlbnRyeS0+aGRyLnJlY29yZF9udW0gPT0gbW9uaGRyLT5yZWNvcmRfbnVtICYmCiAJCSAgICBlbnRyeS0+aGRyLnZlcnNpb24gPT0gbW9uaGRyLT52ZXJzaW9uICYmCiAJCSAgICBlbnRyeS0+aGRyLnJlbGVhc2UgPT0gbW9uaGRyLT5yZWxlYXNlICYmCiAJCSAgICBlbnRyeS0+aGRyLm1vZF9sZXZlbCA9PSBtb25oZHItPm1vZF9sZXZlbCkKIAkJCXJldHVybiBlbnRyeTsKKwogCXJldHVybiBOVUxMOwogfQogCkBAIC05Miw3ICs5NSw5IEBACiAJICAgIG1vbmhkci0+bW9uX2Z1bmN0aW9uID4gTU9OV1JJVEVfU1RBUlRfQ09ORklHIHx8CiAJICAgIG1vbmhkci0+aGRybGVuICE9IHNpemVvZihzdHJ1Y3QgbW9ud3JpdGVfaGRyKSkKIAkJcmV0dXJuIC1FSU5WQUw7Ci0JbW9uYnVmID0gbW9ud3JpdGVfZmluZF9oZHIobW9ucHJpdiwgbW9uaGRyKTsKKwltb25idWYgPSBOVUxMOworCWlmIChtb25oZHItPm1vbl9mdW5jdGlvbiAhPSBNT05XUklURV9HRU5fRVZFTlQpCisJCW1vbmJ1ZiA9IG1vbndyaXRlX2ZpbmRfaGRyKG1vbnByaXYsIG1vbmhkcik7CiAJaWYgKG1vbmJ1ZikgewogCQlpZiAobW9uaGRyLT5tb25fZnVuY3Rpb24gPT0gTU9OV1JJVEVfU1RPUF9JTlRFUlZBTCkgewogCQkJbW9uaGRyLT5kYXRhbGVuID0gbW9uYnVmLT5oZHIuZGF0YWxlbjsKQEAgLTEwNCwxMyArMTA5LDEzIEBACiAJCQlrZnJlZShtb25idWYpOwogCQkJbW9uYnVmID0gTlVMTDsKIAkJfQotCX0gZWxzZSB7CisJfSBlbHNlIGlmIChtb25oZHItPm1vbl9mdW5jdGlvbiAhPSBNT05XUklURV9TVE9QX0lOVEVSVkFMKSB7CiAJCWlmIChtb25fYnVmX2NvdW50ID49IG1vbl9tYXhfYnVmcykKIAkJCXJldHVybiAtRU5PU1BDOwogCQltb25idWYgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgbW9uX2J1ZiksIEdGUF9LRVJORUwpOwogCQlpZiAoIW1vbmJ1ZikKIAkJCXJldHVybiAtRU5PTUVNOwotCQltb25idWYtPmRhdGEgPSBremFsbG9jKG1vbmJ1Zi0+aGRyLmRhdGFsZW4sCisJCW1vbmJ1Zi0+ZGF0YSA9IGt6YWxsb2MobW9uaGRyLT5kYXRhbGVuLAogCQkJCSAgICAgICBHRlBfS0VSTkVMIHwgR0ZQX0RNQSk7CiAJCWlmICghbW9uYnVmLT5kYXRhKSB7CiAJCQlrZnJlZShtb25idWYpOwpAQCAtMTE4LDcgKzEyMyw4IEBACiAJCX0KIAkJbW9uYnVmLT5oZHIgPSAqbW9uaGRyOwogCQlsaXN0X2FkZF90YWlsKCZtb25idWYtPmxpc3QsICZtb25wcml2LT5saXN0KTsKLQkJbW9uX2J1Zl9jb3VudCsrOworCQlpZiAobW9uaGRyLT5tb25fZnVuY3Rpb24gIT0gTU9OV1JJVEVfR0VOX0VWRU5UKQorCQkJbW9uX2J1Zl9jb3VudCsrOwogCX0KIAltb25wcml2LT5jdXJyZW50X2J1ZiA9IG1vbmJ1ZjsKIAlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvczM5MC9jaW8vY2hzYy5jIGIvZHJpdmVycy9zMzkwL2Npby9jaHNjLmMKaW5kZXggMDdjN2YxOS4uMmQ3OGYwZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zMzkwL2Npby9jaHNjLmMKKysrIGIvZHJpdmVycy9zMzkwL2Npby9jaHNjLmMKQEAgLTM3MCw3ICszNzAsNyBAQAogCXN0cnVjdCByZXNfYWNjX2RhdGEgKnJlc19kYXRhOwogCXN0cnVjdCBzdWJjaGFubmVsICpzY2g7CiAKLQlyZXNfZGF0YSA9IChzdHJ1Y3QgcmVzX2FjY19kYXRhICopZGF0YTsKKwlyZXNfZGF0YSA9IGRhdGE7CiAJc2NoID0gZ2V0X3N1YmNoYW5uZWxfYnlfc2NoaWQoc2NoaWQpOwogCWlmICghc2NoKQogCQkvKiBDaGVjayBpZiBhIHN1YmNoYW5uZWwgaXMgbmV3bHkgYXZhaWxhYmxlLiAqLwpAQCAtNDQ0LDcgKzQ0NCw3IEBACiAJCXUzMiBpc2luZm9bMjhdOwogCX0gKmxpcjsKIAotCWxpciA9IChzdHJ1Y3QgbGlyKikgZGF0YTsKKwlsaXIgPSBkYXRhOwogCWlmICghKGxpci0+aXEmMHg4MCkpCiAJCS8qIE5VTEwgbGluayBpbmNpZGVudCByZWNvcmQgKi8KIAkJcmV0dXJuIC1FSU5WQUw7CkBAIC02MjgsNyArNjI4LDcgQEAKIAlzdHJ1Y3QgY2hhbm5lbF9wYXRoICpjaHA7CiAJc3RydWN0IHN1YmNoYW5uZWwgKnNjaDsKIAotCWNocCA9IChzdHJ1Y3QgY2hhbm5lbF9wYXRoICopZGF0YTsKKwljaHAgPSBkYXRhOwogCXNjaCA9IGdldF9zdWJjaGFubmVsX2J5X3NjaGlkKHNjaGlkKTsKIAlpZiAoIXNjaCkKIAkJLyogQ2hlY2sgaWYgdGhlIHN1YmNoYW5uZWwgaXMgbm93IGF2YWlsYWJsZS4gKi8KQEAgLTcwNyw4ICs3MDcsNyBAQAogCXJldHVybiBjaHBfYWRkKGNocGlkKTsKIH0KIAotc3RhdGljIGlubGluZSBpbnQKLV9fY2hlY2tfZm9yX2lvX2FuZF9raWxsKHN0cnVjdCBzdWJjaGFubmVsICpzY2gsIGludCBpbmRleCkKK3N0YXRpYyBpbmxpbmUgaW50IGNoZWNrX2Zvcl9pb19vbl9wYXRoKHN0cnVjdCBzdWJjaGFubmVsICpzY2gsIGludCBpbmRleCkKIHsKIAlpbnQgY2M7CiAKQEAgLTcxOCwxMCArNzE3LDggQEAKIAljYyA9IHN0c2NoKHNjaC0+c2NoaWQsICZzY2gtPnNjaGliKTsKIAlpZiAoY2MpCiAJCXJldHVybiAwOwotCWlmIChzY2gtPnNjaGliLnNjc3cuYWN0bCAmJiBzY2gtPnNjaGliLnBtY3cubHB1bSA9PSAoMHg4MCA+PiBpbmRleCkpIHsKLQkJZGV2aWNlX3NldF93YWl0aW5nKHNjaCk7CisJaWYgKHNjaC0+c2NoaWIuc2Nzdy5hY3RsICYmIHNjaC0+c2NoaWIucG1jdy5scHVtID09ICgweDgwID4+IGluZGV4KSkKIAkJcmV0dXJuIDE7Ci0JfQogCXJldHVybiAwOwogfQogCkBAIC03NTAsMTIgKzc0NywxMCBAQAogCQl9IGVsc2UgewogCQkJc2NoLT5vcG0gJj0gfigweDgwID4+IGNocCk7CiAJCQlzY2gtPmxwbSAmPSB+KDB4ODAgPj4gY2hwKTsKLQkJCS8qCi0JCQkgKiBHaXZlIHJ1bm5pbmcgSS9PIGEgZ3JhY2UgcGVyaW9kIGluIHdoaWNoIGl0Ci0JCQkgKiBjYW4gc3VjY2Vzc2Z1bGx5IHRlcm1pbmF0ZSwgZXZlbiB1c2luZyB0aGUKLQkJCSAqIGp1c3QgdmFyaWVkIG9mZiBwYXRoLiBUaGVuIGtpbGwgaXQuCi0JCQkgKi8KLQkJCWlmICghX19jaGVja19mb3JfaW9fYW5kX2tpbGwoc2NoLCBjaHApICYmICFzY2gtPmxwbSkgeworCQkJaWYgKGNoZWNrX2Zvcl9pb19vbl9wYXRoKHNjaCwgY2hwKSkKKwkJCQkvKiBQYXRoIHZlcmlmaWNhdGlvbiBpcyBkb25lIGFmdGVyIGtpbGxpbmcuICovCisJCQkJZGV2aWNlX2tpbGxfaW8oc2NoKTsKKwkJCWVsc2UgaWYgKCFzY2gtPmxwbSkgewogCQkJCWlmIChjc3NfZW5xdWV1ZV9zdWJjaGFubmVsX3Nsb3coc2NoLT5zY2hpZCkpIHsKIAkJCQkJY3NzX2NsZWFyX3N1YmNoYW5uZWxfc2xvd19saXN0KCk7CiAJCQkJCW5lZWRfcmVzY2FuID0gMTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvczM5MC9jaW8vY2lvLmMgYi9kcml2ZXJzL3MzOTAvY2lvL2Npby5jCmluZGV4IGYxOGIxNjIuLjg5MzZlNDYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvczM5MC9jaW8vY2lvLmMKKysrIGIvZHJpdmVycy9zMzkwL2Npby9jaW8uYwpAQCAtNjA5LDggKzYwOSw4IEBACiAJc3RydWN0IGlyYiAqaXJiOwogCXN0cnVjdCBwdF9yZWdzICpvbGRfcmVnczsKIAotCWlycV9lbnRlciAoKTsKIAlvbGRfcmVncyA9IHNldF9pcnFfcmVncyhyZWdzKTsKKwlpcnFfZW50ZXIoKTsKIAlhc20gdm9sYXRpbGUgKCJtYyAwLDAiKTsKIAlpZiAoUzM5MF9sb3djb3JlLmludF9jbG9jayA+PSBTMzkwX2xvd2NvcmUuamlmZnlfdGltZXIpCiAJCS8qKgpAQCAtNjU1LDggKzY1NSw4IEBACiAJCSAqIG91dCBvZiB0aGUgc2llIHdoaWNoIGNvc3RzIG1vcmUgY3ljbGVzIHRoYW4gaXQgc2F2ZXMuCiAJCSAqLwogCX0gd2hpbGUgKCFNQUNISU5FX0lTX1ZNICYmIHRwaSAoTlVMTCkgIT0gMCk7CisJaXJxX2V4aXQoKTsKIAlzZXRfaXJxX3JlZ3Mob2xkX3JlZ3MpOwotCWlycV9leGl0ICgpOwogfQogCiAjaWZkZWYgQ09ORklHX0NDV19DT05TT0xFCmRpZmYgLS1naXQgYS9kcml2ZXJzL3MzOTAvY2lvL2Nzcy5jIGIvZHJpdmVycy9zMzkwL2Npby9jc3MuYwppbmRleCA3MDg2YTc0Li5hZDdmN2UxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3MzOTAvY2lvL2Nzcy5jCisrKyBiL2RyaXZlcnMvczM5MC9jaW8vY3NzLmMKQEAgLTE3Nyw3ICsxNzcsNyBAQAogCXN0cnVjdCBkZXZpY2UgKmRldjsKIAogCWRldiA9IGJ1c19maW5kX2RldmljZSgmY3NzX2J1c190eXBlLCBOVUxMLAotCQkJICAgICAgKHZvaWQgKikmc2NoaWQsIGNoZWNrX3N1YmNoYW5uZWwpOworCQkJICAgICAgJnNjaGlkLCBjaGVja19zdWJjaGFubmVsKTsKIAogCXJldHVybiBkZXYgPyB0b19zdWJjaGFubmVsKGRldikgOiBOVUxMOwogfQpAQCAtMjcxLDEwICsyNzEsNiBAQAogCQkvKiBSZXNldCBpbnRwYXJtIHRvIHplcm9lcy4gKi8KIAkJc2NoLT5zY2hpYi5wbWN3LmludHBhcm0gPSAwOwogCQljaW9fbW9kaWZ5KHNjaCk7Ci0KLQkJLyogUHJvYmUgaWYgbmVjZXNzYXJ5LiAqLwotCQlpZiAoYWN0aW9uID09IFVOUkVHSVNURVJfUFJPQkUpCi0JCQlyZXQgPSBjc3NfcHJvYmVfZGV2aWNlKHNjaC0+c2NoaWQpOwogCQlicmVhazsKIAljYXNlIFJFUFJPQkU6CiAJCWRldmljZV90cmlnZ2VyX3JlcHJvYmUoc2NoKTsKQEAgLTI4Myw2ICsyNzksOSBAQAogCQlicmVhazsKIAl9CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc2NoLT5sb2NrLCBmbGFncyk7CisJLyogUHJvYmUgaWYgbmVjZXNzYXJ5LiAqLworCWlmIChhY3Rpb24gPT0gVU5SRUdJU1RFUl9QUk9CRSkKKwkJcmV0ID0gY3NzX3Byb2JlX2RldmljZShzY2gtPnNjaGlkKTsKIAogCXJldHVybiByZXQ7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3MzOTAvY2lvL2Nzcy5oIGIvZHJpdmVycy9zMzkwL2Npby9jc3MuaAppbmRleCA4YWFiYjRhLi40YzJmZjgzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3MzOTAvY2lvL2Nzcy5oCisrKyBiL2RyaXZlcnMvczM5MC9jaW8vY3NzLmgKQEAgLTc2LDkgKzc2LDggQEAKIAlpbnQgc3RhdGU7CQkvKiBkZXZpY2Ugc3RhdGUgKi8KIAlhdG9taWNfdCBvbm9mZjsKIAl1bnNpZ25lZCBsb25nIHJlZ2lzdGVyZWQ7Ci0JX191MTYgZGV2bm87CQkvKiBkZXZpY2UgbnVtYmVyICovCi0JX191MTYgc2NoX25vOwkJLyogc3ViY2hhbm5lbCBudW1iZXIgKi8KLQlfX3U4IHNzaWQ7ICAgICAgICAgICAgICAvKiBzdWJjaGFubmVsIHNldCBpZCAqLworCXN0cnVjdCBjY3dfZGV2X2lkIGRldl9pZDsJLyogZGV2aWNlIGlkICovCisJc3RydWN0IHN1YmNoYW5uZWxfaWQgc2NoaWQ7CS8qIHN1YmNoYW5uZWwgbnVtYmVyICovCiAJX191OCBpbWFzazsJCS8qIGxwbSBtYXNrIGZvciBTTklEL1NJRC9TUEdJRCAqLwogCWludCBpcmV0cnk7CQkvKiByZXRyeSBjb3VudGVyIFNOSUQvU0lEL1NQR0lEICovCiAJc3RydWN0IHsKQEAgLTE3MSw3ICsxNzAsNyBAQAogCiAvKiBIZWxwZXIgZnVuY3Rpb25zIGZvciB2YXJ5IG9uL29mZi4gKi8KIGludCBkZXZpY2VfaXNfb25saW5lKHN0cnVjdCBzdWJjaGFubmVsICopOwotdm9pZCBkZXZpY2Vfc2V0X3dhaXRpbmcoc3RydWN0IHN1YmNoYW5uZWwgKik7Cit2b2lkIGRldmljZV9raWxsX2lvKHN0cnVjdCBzdWJjaGFubmVsICopOwogCiAvKiBNYWNoaW5lIGNoZWNrIGhlbHBlciBmdW5jdGlvbi4gKi8KIHZvaWQgZGV2aWNlX2tpbGxfcGVuZGluZ190aW1lcihzdHJ1Y3Qgc3ViY2hhbm5lbCAqKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvczM5MC9jaW8vZGV2aWNlLmMgYi9kcml2ZXJzL3MzOTAvY2lvL2RldmljZS5jCmluZGV4IDY4ODk0NTYuLjM5Yzk4ZjkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvczM5MC9jaW8vZGV2aWNlLmMKKysrIGIvZHJpdmVycy9zMzkwL2Npby9kZXZpY2UuYwpAQCAtNTMyLDggKzUzMiw3IEBACiAKIC8qIHRoaXMgaXMgYSBzaW1wbGUgYWJzdHJhY3Rpb24gZm9yIGRldmljZV9yZWdpc3RlciB0aGF0IHNldHMgdGhlCiAgKiBjb3JyZWN0IGJ1cyB0eXBlIGFuZCBhZGRzIHRoZSBidXMgc3BlY2lmaWMgZmlsZXMgKi8KLWludAotY2N3X2RldmljZV9yZWdpc3RlcihzdHJ1Y3QgY2N3X2RldmljZSAqY2RldikKK3N0YXRpYyBpbnQgY2N3X2RldmljZV9yZWdpc3RlcihzdHJ1Y3QgY2N3X2RldmljZSAqY2RldikKIHsKIAlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmY2Rldi0+ZGV2OwogCWludCByZXQ7CkBAIC01NTIsMjEgKzU1MSwxOSBAQAogfQogCiBzdHJ1Y3QgbWF0Y2hfZGF0YSB7Ci0JdW5zaWduZWQgaW50IGRldm5vOwotCXVuc2lnbmVkIGludCBzc2lkOworCXN0cnVjdCBjY3dfZGV2X2lkIGRldl9pZDsKIAlzdHJ1Y3QgY2N3X2RldmljZSAqIHNpYmxpbmc7CiB9OwogCiBzdGF0aWMgaW50CiBtYXRjaF9kZXZubyhzdHJ1Y3QgZGV2aWNlICogZGV2LCB2b2lkICogZGF0YSkKIHsKLQlzdHJ1Y3QgbWF0Y2hfZGF0YSAqIGQgPSAoc3RydWN0IG1hdGNoX2RhdGEgKilkYXRhOworCXN0cnVjdCBtYXRjaF9kYXRhICogZCA9IGRhdGE7CiAJc3RydWN0IGNjd19kZXZpY2UgKiBjZGV2OwogCiAJY2RldiA9IHRvX2Njd2RldihkZXYpOwogCWlmICgoY2Rldi0+cHJpdmF0ZS0+c3RhdGUgPT0gREVWX1NUQVRFX0RJU0NPTk5FQ1RFRCkgJiYKLQkgICAgKGNkZXYtPnByaXZhdGUtPmRldm5vID09IGQtPmRldm5vKSAmJgotCSAgICAoY2Rldi0+cHJpdmF0ZS0+c3NpZCA9PSBkLT5zc2lkKSAmJgorCSAgICBjY3dfZGV2X2lkX2lzX2VxdWFsKCZjZGV2LT5wcml2YXRlLT5kZXZfaWQsICZkLT5kZXZfaWQpICYmCiAJICAgIChjZGV2ICE9IGQtPnNpYmxpbmcpKSB7CiAJCWNkZXYtPnByaXZhdGUtPnN0YXRlID0gREVWX1NUQVRFX05PVF9PUEVSOwogCQlyZXR1cm4gMTsKQEAgLTU3NCwxNSArNTcxLDEzIEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgY2N3X2RldmljZSAqCi1nZXRfZGlzY19jY3dkZXZfYnlfZGV2bm8odW5zaWduZWQgaW50IGRldm5vLCB1bnNpZ25lZCBpbnQgc3NpZCwKLQkJCSBzdHJ1Y3QgY2N3X2RldmljZSAqc2libGluZykKK3N0YXRpYyBzdHJ1Y3QgY2N3X2RldmljZSAqIGdldF9kaXNjX2Njd2Rldl9ieV9kZXZfaWQoc3RydWN0IGNjd19kZXZfaWQgKmRldl9pZCwKKwkJCQkJCSAgICAgc3RydWN0IGNjd19kZXZpY2UgKnNpYmxpbmcpCiB7CiAJc3RydWN0IGRldmljZSAqZGV2OwogCXN0cnVjdCBtYXRjaF9kYXRhIGRhdGE7CiAKLQlkYXRhLmRldm5vID0gZGV2bm87Ci0JZGF0YS5zc2lkID0gc3NpZDsKKwlkYXRhLmRldl9pZCA9ICpkZXZfaWQ7CiAJZGF0YS5zaWJsaW5nID0gc2libGluZzsKIAlkZXYgPSBidXNfZmluZF9kZXZpY2UoJmNjd19idXNfdHlwZSwgTlVMTCwgJmRhdGEsIG1hdGNoX2Rldm5vKTsKIApAQCAtNTk1LDcgKzU5MCw3IEBACiAKIAlzdHJ1Y3QgY2N3X2RldmljZSAqY2RldjsKIAotCWNkZXYgPSAoc3RydWN0IGNjd19kZXZpY2UgKilkYXRhOworCWNkZXYgPSBkYXRhOwogCWlmIChkZXZpY2VfYWRkKCZjZGV2LT5kZXYpKSB7CiAJCXB1dF9kZXZpY2UoJmNkZXYtPmRldik7CiAJCXJldHVybjsKQEAgLTYxNiw5ICs2MTEsOSBAQAogCXN0cnVjdCBzdWJjaGFubmVsICpzY2g7CiAJaW50IG5lZWRfcmVuYW1lOwogCi0JY2RldiA9IChzdHJ1Y3QgY2N3X2RldmljZSAqKWRhdGE7CisJY2RldiA9IGRhdGE7CiAJc2NoID0gdG9fc3ViY2hhbm5lbChjZGV2LT5kZXYucGFyZW50KTsKLQlpZiAoY2Rldi0+cHJpdmF0ZS0+ZGV2bm8gIT0gc2NoLT5zY2hpYi5wbWN3LmRldikgeworCWlmIChjZGV2LT5wcml2YXRlLT5kZXZfaWQuZGV2bm8gIT0gc2NoLT5zY2hpYi5wbWN3LmRldikgewogCQkvKgogCQkgKiBUaGUgZGV2aWNlIG51bWJlciBoYXMgY2hhbmdlZC4gVGhpcyBpcyB1c3VhbGx5IG9ubHkgd2hlbgogCQkgKiBhIGRldmljZSBoYXMgYmVlbiBkZXRhY2hlZCB1bmRlciBWTSBhbmQgdGhlbiByZS1hcHBlYXJlZApAQCAtNjMzLDEwICs2MjgsMTIgQEAKIAkJICogICAgICAgIGdldCBwb3NzaWJseSBzaWNrLi4uCiAJCSAqLwogCQlzdHJ1Y3QgY2N3X2RldmljZSAqb3RoZXJfY2RldjsKKwkJc3RydWN0IGNjd19kZXZfaWQgZGV2X2lkOwogCiAJCW5lZWRfcmVuYW1lID0gMTsKLQkJb3RoZXJfY2RldiA9IGdldF9kaXNjX2Njd2Rldl9ieV9kZXZubyhzY2gtPnNjaGliLnBtY3cuZGV2LAotCQkJCQkJICAgICAgc2NoLT5zY2hpZC5zc2lkLCBjZGV2KTsKKwkJZGV2X2lkLmRldm5vID0gc2NoLT5zY2hpYi5wbWN3LmRldjsKKwkJZGV2X2lkLnNzaWQgPSBzY2gtPnNjaGlkLnNzaWQ7CisJCW90aGVyX2NkZXYgPSBnZXRfZGlzY19jY3dkZXZfYnlfZGV2X2lkKCZkZXZfaWQsIGNkZXYpOwogCQlpZiAob3RoZXJfY2RldikgewogCQkJc3RydWN0IHN1YmNoYW5uZWwgKm90aGVyX3NjaDsKIApAQCAtNjUyLDcgKzY0OSw3IEBACiAJCX0KIAkJLyogVXBkYXRlIHNzZCBpbmZvIGhlcmUuICovCiAJCWNzc19nZXRfc3NkX2luZm8oc2NoKTsKLQkJY2Rldi0+cHJpdmF0ZS0+ZGV2bm8gPSBzY2gtPnNjaGliLnBtY3cuZGV2OworCQljZGV2LT5wcml2YXRlLT5kZXZfaWQuZGV2bm8gPSBzY2gtPnNjaGliLnBtY3cuZGV2OwogCX0gZWxzZQogCQluZWVkX3JlbmFtZSA9IDA7CiAJZGV2aWNlX3JlbW92ZV9maWxlcygmY2Rldi0+ZGV2KTsKQEAgLTY2Miw3ICs2NTksNyBAQAogCQlzbnByaW50ZiAoY2Rldi0+ZGV2LmJ1c19pZCwgQlVTX0lEX1NJWkUsICIwLiV4LiUwNHgiLAogCQkJICBzY2gtPnNjaGlkLnNzaWQsIHNjaC0+c2NoaWIucG1jdy5kZXYpOwogCVBSRVBBUkVfV09SSygmY2Rldi0+cHJpdmF0ZS0+a2lja193b3JrLAotCQkgICAgIGNjd19kZXZpY2VfYWRkX2NoYW5nZWQsICh2b2lkICopY2Rldik7CisJCSAgICAgY2N3X2RldmljZV9hZGRfY2hhbmdlZCwgY2Rldik7CiAJcXVldWVfd29yayhjY3dfZGV2aWNlX3dvcmssICZjZGV2LT5wcml2YXRlLT5raWNrX3dvcmspOwogfQogCkBAIC02ODcsNyArNjg0LDcgQEAKIAlpbnQgcmV0OwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKLQljZGV2ID0gKHN0cnVjdCBjY3dfZGV2aWNlICopIGRhdGE7CisJY2RldiA9IGRhdGE7CiAJc2NoID0gdG9fc3ViY2hhbm5lbChjZGV2LT5kZXYucGFyZW50KTsKIAogCWlmIChrbGlzdF9ub2RlX2F0dGFjaGVkKCZjZGV2LT5kZXYua25vZGVfcGFyZW50KSkgewpAQCAtNzU5LDcgKzc1Niw3IEBACiAJCQlicmVhazsKIAkJc2NoID0gdG9fc3ViY2hhbm5lbChjZGV2LT5kZXYucGFyZW50KTsKIAkJUFJFUEFSRV9XT1JLKCZjZGV2LT5wcml2YXRlLT5raWNrX3dvcmssCi0JCQkgICAgIGNjd19kZXZpY2VfY2FsbF9zY2hfdW5yZWdpc3RlciwgKHZvaWQgKikgY2Rldik7CisJCQkgICAgIGNjd19kZXZpY2VfY2FsbF9zY2hfdW5yZWdpc3RlciwgY2Rldik7CiAJCXF1ZXVlX3dvcmsoc2xvd19wYXRoX3dxLCAmY2Rldi0+cHJpdmF0ZS0+a2lja193b3JrKTsKIAkJaWYgKGF0b21pY19kZWNfYW5kX3Rlc3QoJmNjd19kZXZpY2VfaW5pdF9jb3VudCkpCiAJCQl3YWtlX3VwKCZjY3dfZGV2aWNlX2luaXRfd3EpOwpAQCAtNzc0LDcgKzc3MSw3IEBACiAJCWlmICghZ2V0X2RldmljZSgmY2Rldi0+ZGV2KSkKIAkJCWJyZWFrOwogCQlQUkVQQVJFX1dPUksoJmNkZXYtPnByaXZhdGUtPmtpY2tfd29yaywKLQkJCSAgICAgaW9fc3ViY2hhbm5lbF9yZWdpc3RlciwgKHZvaWQgKikgY2Rldik7CisJCQkgICAgIGlvX3N1YmNoYW5uZWxfcmVnaXN0ZXIsIGNkZXYpOwogCQlxdWV1ZV93b3JrKHNsb3dfcGF0aF93cSwgJmNkZXYtPnByaXZhdGUtPmtpY2tfd29yayk7CiAJCWJyZWFrOwogCX0KQEAgLTc5Miw5ICs3ODksOSBAQAogCiAJLyogSW5pdCBwcml2YXRlIGRhdGEuICovCiAJcHJpdiA9IGNkZXYtPnByaXZhdGU7Ci0JcHJpdi0+ZGV2bm8gPSBzY2gtPnNjaGliLnBtY3cuZGV2OwotCXByaXYtPnNzaWQgPSBzY2gtPnNjaGlkLnNzaWQ7Ci0JcHJpdi0+c2NoX25vID0gc2NoLT5zY2hpZC5zY2hfbm87CisJcHJpdi0+ZGV2X2lkLmRldm5vID0gc2NoLT5zY2hpYi5wbWN3LmRldjsKKwlwcml2LT5kZXZfaWQuc3NpZCA9IHNjaC0+c2NoaWQuc3NpZDsKKwlwcml2LT5zY2hpZCA9IHNjaC0+c2NoaWQ7CiAJcHJpdi0+c3RhdGUgPSBERVZfU1RBVEVfTk9UX09QRVI7CiAJSU5JVF9MSVNUX0hFQUQoJnByaXYtPmNtYl9saXN0KTsKIAlpbml0X3dhaXRxdWV1ZV9oZWFkKCZwcml2LT53YWl0X3EpOwpAQCAtOTEyLDcgKzkwOSw3IEBACiAJICovCiAJaWYgKGdldF9kZXZpY2UoJmNkZXYtPmRldikpIHsKIAkJUFJFUEFSRV9XT1JLKCZjZGV2LT5wcml2YXRlLT5raWNrX3dvcmssCi0JCQkgICAgIGNjd19kZXZpY2VfdW5yZWdpc3RlciwgKHZvaWQgKikgY2Rldik7CisJCQkgICAgIGNjd19kZXZpY2VfdW5yZWdpc3RlciwgY2Rldik7CiAJCXF1ZXVlX3dvcmsoY2N3X2RldmljZV93b3JrLCAmY2Rldi0+cHJpdmF0ZS0+a2lja193b3JrKTsKIAl9CiAJcmV0dXJuIDA7CkBAIC0xMDU1LDcgKzEwNTIsNyBAQAogewogCWNoYXIgKmJ1c19pZDsKIAotCWJ1c19pZCA9IChjaGFyICopaWQ7CisJYnVzX2lkID0gaWQ7CiAKIAlyZXR1cm4gKHN0cm5jbXAoYnVzX2lkLCBkZXYtPmJ1c19pZCwgQlVTX0lEX1NJWkUpID09IDApOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zMzkwL2Npby9kZXZpY2UuaCBiL2RyaXZlcnMvczM5MC9jaW8vZGV2aWNlLmgKaW5kZXggMDBiZTlhNS4uOTIzM2I1YyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zMzkwL2Npby9kZXZpY2UuaAorKysgYi9kcml2ZXJzL3MzOTAvY2lvL2RldmljZS5oCkBAIC0yMSw3ICsyMSw2IEBACiAJLyogc3RhdGVzIHRvIHdhaXQgZm9yIGkvbyBjb21wbGV0aW9uIGJlZm9yZSBkb2luZyBzb21ldGhpbmcgKi8KIAlERVZfU1RBVEVfQ0xFQVJfVkVSSUZZLAogCURFVl9TVEFURV9USU1FT1VUX0tJTEwsCi0JREVWX1NUQVRFX1dBSVQ0SU8sCiAJREVWX1NUQVRFX1FVSUVTQ0UsCiAJLyogc3BlY2lhbCBzdGF0ZXMgZm9yIGRldmljZXMgZ29uZSBub3Qgb3BlcmF0aW9uYWwgKi8KIAlERVZfU1RBVEVfRElTQ09OTkVDVEVELApAQCAtNzksNyArNzgsNiBAQAogCiBpbnQgY2N3X2RldmljZV9jYW5jZWxfaGFsdF9jbGVhcihzdHJ1Y3QgY2N3X2RldmljZSAqKTsKIAotaW50IGNjd19kZXZpY2VfcmVnaXN0ZXIoc3RydWN0IGNjd19kZXZpY2UgKik7CiB2b2lkIGNjd19kZXZpY2VfZG9fdW5yZWdfcmVyZWcodm9pZCAqKTsKIHZvaWQgY2N3X2RldmljZV9jYWxsX3NjaF91bnJlZ2lzdGVyKHZvaWQgKik7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvczM5MC9jaW8vZGV2aWNlX2ZzbS5jIGIvZHJpdmVycy9zMzkwL2Npby9kZXZpY2VfZnNtLmMKaW5kZXggYjY3NjIwMi4uZGUzZDA4NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zMzkwL2Npby9kZXZpY2VfZnNtLmMKKysrIGIvZHJpdmVycy9zMzkwL2Npby9kZXZpY2VfZnNtLmMKQEAgLTU5LDE4ICs1OSw2IEBACiAJY2Rldi0+cHJpdmF0ZS0+c3RhdGUgPSBERVZfU1RBVEVfRElTQ09OTkVDVEVEOwogfQogCi12b2lkCi1kZXZpY2Vfc2V0X3dhaXRpbmcoc3RydWN0IHN1YmNoYW5uZWwgKnNjaCkKLXsKLQlzdHJ1Y3QgY2N3X2RldmljZSAqY2RldjsKLQotCWlmICghc2NoLT5kZXYuZHJpdmVyX2RhdGEpCi0JCXJldHVybjsKLQljZGV2ID0gc2NoLT5kZXYuZHJpdmVyX2RhdGE7Ci0JY2N3X2RldmljZV9zZXRfdGltZW91dChjZGV2LCAxMCpIWik7Ci0JY2Rldi0+cHJpdmF0ZS0+c3RhdGUgPSBERVZfU1RBVEVfV0FJVDRJTzsKLX0KLQogLyoKICAqIFRpbWVvdXQgZnVuY3Rpb24uIEl0IGp1c3QgdHJpZ2dlcnMgYSBERVZfRVZFTlRfVElNRU9VVC4KICAqLwpAQCAtMTgzLDkgKzE3MSw5IEBACiAJICAgIGNkZXYtPmlkLmN1X21vZGVsICE9IGNkZXYtPnByaXZhdGUtPnNlbnNlaWQuY3VfbW9kZWwgfHwKIAkgICAgY2Rldi0+aWQuZGV2X3R5cGUgIT0gY2Rldi0+cHJpdmF0ZS0+c2Vuc2VpZC5kZXZfdHlwZSB8fAogCSAgICBjZGV2LT5pZC5kZXZfbW9kZWwgIT0gY2Rldi0+cHJpdmF0ZS0+c2Vuc2VpZC5kZXZfbW9kZWwgfHwKLQkgICAgY2Rldi0+cHJpdmF0ZS0+ZGV2bm8gIT0gc2NoLT5zY2hpYi5wbWN3LmRldikgeworCSAgICBjZGV2LT5wcml2YXRlLT5kZXZfaWQuZGV2bm8gIT0gc2NoLT5zY2hpYi5wbWN3LmRldikgewogCQlQUkVQQVJFX1dPUksoJmNkZXYtPnByaXZhdGUtPmtpY2tfd29yaywKLQkJCSAgICAgY2N3X2RldmljZV9kb191bnJlZ19yZXJlZywgKHZvaWQgKiljZGV2KTsKKwkJCSAgICAgY2N3X2RldmljZV9kb191bnJlZ19yZXJlZywgY2Rldik7CiAJCXF1ZXVlX3dvcmsoY2N3X2RldmljZV93b3JrLCAmY2Rldi0+cHJpdmF0ZS0+a2lja193b3JrKTsKIAkJcmV0dXJuIDA7CiAJfQpAQCAtMjU1LDcgKzI0Myw3IEBACiAJY2FzZSBERVZfU1RBVEVfTk9UX09QRVI6CiAJCUNJT19ERUJVRyhLRVJOX1dBUk5JTkcsIDIsCiAJCQkgICJTZW5zZUlEIDogdW5rbm93biBkZXZpY2UgJTA0eCBvbiBzdWJjaGFubmVsICIKLQkJCSAgIjAuJXguJTA0eFxuIiwgY2Rldi0+cHJpdmF0ZS0+ZGV2bm8sCisJCQkgICIwLiV4LiUwNHhcbiIsIGNkZXYtPnByaXZhdGUtPmRldl9pZC5kZXZubywKIAkJCSAgc2NoLT5zY2hpZC5zc2lkLCBzY2gtPnNjaGlkLnNjaF9ubyk7CiAJCWJyZWFrOwogCWNhc2UgREVWX1NUQVRFX09GRkxJTkU6CkBAIC0yODIsMTQgKzI3MCwxNSBAQAogCQlDSU9fREVCVUcoS0VSTl9JTkZPLCAyLCAiU2Vuc2VJRCA6IGRldmljZSAwLiV4LiUwNHggcmVwb3J0czogIgogCQkJICAiQ1UgIFR5cGUvTW9kID0gJTA0WC8lMDJYLCBEZXYgVHlwZS9Nb2QgPSAiCiAJCQkgICIlMDRYLyUwMlhcbiIsCi0JCQkgIGNkZXYtPnByaXZhdGUtPnNzaWQsIGNkZXYtPnByaXZhdGUtPmRldm5vLAorCQkJICBjZGV2LT5wcml2YXRlLT5kZXZfaWQuc3NpZCwKKwkJCSAgY2Rldi0+cHJpdmF0ZS0+ZGV2X2lkLmRldm5vLAogCQkJICBjZGV2LT5pZC5jdV90eXBlLCBjZGV2LT5pZC5jdV9tb2RlbCwKIAkJCSAgY2Rldi0+aWQuZGV2X3R5cGUsIGNkZXYtPmlkLmRldl9tb2RlbCk7CiAJCWJyZWFrOwogCWNhc2UgREVWX1NUQVRFX0JPWEVEOgogCQlDSU9fREVCVUcoS0VSTl9XQVJOSU5HLCAyLAogCQkJICAiU2Vuc2VJRCA6IGJveGVkIGRldmljZSAlMDR4IG9uIHN1YmNoYW5uZWwgIgotCQkJICAiMC4leC4lMDR4XG4iLCBjZGV2LT5wcml2YXRlLT5kZXZubywKKwkJCSAgIjAuJXguJTA0eFxuIiwgY2Rldi0+cHJpdmF0ZS0+ZGV2X2lkLmRldm5vLAogCQkJICBzY2gtPnNjaGlkLnNzaWQsIHNjaC0+c2NoaWQuc2NoX25vKTsKIAkJYnJlYWs7CiAJfQpAQCAtMzI1LDEzICszMTQsMTMgQEAKIAlzdHJ1Y3Qgc3ViY2hhbm5lbCAqc2NoOwogCWludCByZXQ7CiAKLQljZGV2ID0gKHN0cnVjdCBjY3dfZGV2aWNlICopZGF0YTsKKwljZGV2ID0gZGF0YTsKIAlzY2ggPSB0b19zdWJjaGFubmVsKGNkZXYtPmRldi5wYXJlbnQpOwogCXJldCA9IChzY2gtPmRyaXZlciAmJiBzY2gtPmRyaXZlci0+bm90aWZ5KSA/CiAJCXNjaC0+ZHJpdmVyLT5ub3RpZnkoJnNjaC0+ZGV2LCBDSU9fT1BFUikgOiAwOwogCWlmICghcmV0KQogCQkvKiBEcml2ZXIgZG9lc24ndCB3YW50IGRldmljZSBiYWNrLiAqLwotCQljY3dfZGV2aWNlX2RvX3VucmVnX3JlcmVnKCh2b2lkICopY2Rldik7CisJCWNjd19kZXZpY2VfZG9fdW5yZWdfcmVyZWcoY2Rldik7CiAJZWxzZSB7CiAJCS8qIFJlZW5hYmxlIGNoYW5uZWwgbWVhc3VyZW1lbnRzLCBpZiBuZWVkZWQuICovCiAJCWNtZl9yZWVuYWJsZShjZGV2KTsKQEAgLTM2MywxMiArMzUyLDEyIEBACiAJaWYgKHN0YXRlID09IERFVl9TVEFURV9CT1hFRCkKIAkJQ0lPX0RFQlVHKEtFUk5fV0FSTklORywgMiwKIAkJCSAgIkJveGVkIGRldmljZSAlMDR4IG9uIHN1YmNoYW5uZWwgJTA0eFxuIiwKLQkJCSAgY2Rldi0+cHJpdmF0ZS0+ZGV2bm8sIHNjaC0+c2NoaWQuc2NoX25vKTsKKwkJCSAgY2Rldi0+cHJpdmF0ZS0+ZGV2X2lkLmRldm5vLCBzY2gtPnNjaGlkLnNjaF9ubyk7CiAKIAlpZiAoY2Rldi0+cHJpdmF0ZS0+ZmxhZ3MuZG9ub3RpZnkpIHsKIAkJY2Rldi0+cHJpdmF0ZS0+ZmxhZ3MuZG9ub3RpZnkgPSAwOwogCQlQUkVQQVJFX1dPUksoJmNkZXYtPnByaXZhdGUtPmtpY2tfd29yaywgY2N3X2RldmljZV9vcGVyX25vdGlmeSwKLQkJCSAgICAgKHZvaWQgKiljZGV2KTsKKwkJCSAgICAgY2Rldik7CiAJCXF1ZXVlX3dvcmsoY2N3X2RldmljZV9ub3RpZnlfd29yaywgJmNkZXYtPnByaXZhdGUtPmtpY2tfd29yayk7CiAJfQogCXdha2VfdXAoJmNkZXYtPnByaXZhdGUtPndhaXRfcSk7CkBAIC00MTIsNyArNDAxLDggQEAKIAkJLyogUEdJRCBtaXNtYXRjaCwgY2FuJ3QgcGF0aGdyb3VwLiAqLwogCQlDSU9fTVNHX0VWRU5UKDAsICJTTklEIC0gcGdpZCBtaXNtYXRjaCBmb3IgZGV2aWNlICIKIAkJCSAgICAgICIwLiV4LiUwNHgsIGNhbid0IHBhdGhncm91cFxuIiwKLQkJCSAgICAgIGNkZXYtPnByaXZhdGUtPnNzaWQsIGNkZXYtPnByaXZhdGUtPmRldm5vKTsKKwkJCSAgICAgIGNkZXYtPnByaXZhdGUtPmRldl9pZC5zc2lkLAorCQkJICAgICAgY2Rldi0+cHJpdmF0ZS0+ZGV2X2lkLmRldm5vKTsKIAkJY2Rldi0+cHJpdmF0ZS0+b3B0aW9ucy5wZ3JvdXAgPSAwOwogCQlyZXR1cm47CiAJfQpAQCAtNTIzLDcgKzUxMyw3IEBACiAJc3RydWN0IHN1YmNoYW5uZWwgKnNjaDsKIAlpbnQgcmV0OwogCi0JY2RldiA9IChzdHJ1Y3QgY2N3X2RldmljZSAqKWRhdGE7CisJY2RldiA9IGRhdGE7CiAJc2NoID0gdG9fc3ViY2hhbm5lbChjZGV2LT5kZXYucGFyZW50KTsKIAkvKiBFeHRyYSBzYW5pdHkuICovCiAJaWYgKHNjaC0+bHBtKQpAQCAtNTM3LDcgKzUyNyw3IEBACiAJCQlpZiAoZ2V0X2RldmljZSgmY2Rldi0+ZGV2KSkgewogCQkJCVBSRVBBUkVfV09SSygmY2Rldi0+cHJpdmF0ZS0+a2lja193b3JrLAogCQkJCQkgICAgIGNjd19kZXZpY2VfY2FsbF9zY2hfdW5yZWdpc3RlciwKLQkJCQkJICAgICAodm9pZCAqKWNkZXYpOworCQkJCQkgICAgIGNkZXYpOwogCQkJCXF1ZXVlX3dvcmsoY2N3X2RldmljZV93b3JrLAogCQkJCQkgICAmY2Rldi0+cHJpdmF0ZS0+a2lja193b3JrKTsKIAkJCX0gZWxzZQpAQCAtNTg4LDExICs1NzgsMTUgQEAKIAkJfQogCQlicmVhazsKIAljYXNlIC1FVElNRToKKwkJLyogUmVzZXQgb3BlciBub3RpZnkgaW5kaWNhdGlvbiBhZnRlciB2ZXJpZnkgZXJyb3IuICovCisJCWNkZXYtPnByaXZhdGUtPmZsYWdzLmRvbm90aWZ5ID0gMDsKIAkJY2N3X2RldmljZV9kb25lKGNkZXYsIERFVl9TVEFURV9CT1hFRCk7CiAJCWJyZWFrOwogCWRlZmF1bHQ6CisJCS8qIFJlc2V0IG9wZXIgbm90aWZ5IGluZGljYXRpb24gYWZ0ZXIgdmVyaWZ5IGVycm9yLiAqLworCQljZGV2LT5wcml2YXRlLT5mbGFncy5kb25vdGlmeSA9IDA7CiAJCVBSRVBBUkVfV09SSygmY2Rldi0+cHJpdmF0ZS0+a2lja193b3JrLAotCQkJICAgICBjY3dfZGV2aWNlX25vcGF0aF9ub3RpZnksICh2b2lkICopY2Rldik7CisJCQkgICAgIGNjd19kZXZpY2Vfbm9wYXRoX25vdGlmeSwgY2Rldik7CiAJCXF1ZXVlX3dvcmsoY2N3X2RldmljZV9ub3RpZnlfd29yaywgJmNkZXYtPnByaXZhdGUtPmtpY2tfd29yayk7CiAJCWNjd19kZXZpY2VfZG9uZShjZGV2LCBERVZfU1RBVEVfTk9UX09QRVIpOwogCQlicmVhazsKQEAgLTcyMyw3ICs3MTcsNyBAQAogCXNjaCA9IHRvX3N1YmNoYW5uZWwoY2Rldi0+ZGV2LnBhcmVudCk7CiAJaWYgKGdldF9kZXZpY2UoJmNkZXYtPmRldikpIHsKIAkJUFJFUEFSRV9XT1JLKCZjZGV2LT5wcml2YXRlLT5raWNrX3dvcmssCi0JCQkgICAgIGNjd19kZXZpY2VfY2FsbF9zY2hfdW5yZWdpc3RlciwgKHZvaWQgKiljZGV2KTsKKwkJCSAgICAgY2N3X2RldmljZV9jYWxsX3NjaF91bnJlZ2lzdGVyLCBjZGV2KTsKIAkJcXVldWVfd29yayhjY3dfZGV2aWNlX3dvcmssICZjZGV2LT5wcml2YXRlLT5raWNrX3dvcmspOwogCX0KIAl3YWtlX3VwKCZjZGV2LT5wcml2YXRlLT53YWl0X3EpOwpAQCAtNzU0LDcgKzc0OCw3IEBACiAJfQogCWlmIChnZXRfZGV2aWNlKCZjZGV2LT5kZXYpKSB7CiAJCVBSRVBBUkVfV09SSygmY2Rldi0+cHJpdmF0ZS0+a2lja193b3JrLAotCQkJICAgICBjY3dfZGV2aWNlX2NhbGxfc2NoX3VucmVnaXN0ZXIsICh2b2lkICopY2Rldik7CisJCQkgICAgIGNjd19kZXZpY2VfY2FsbF9zY2hfdW5yZWdpc3RlciwgY2Rldik7CiAJCXF1ZXVlX3dvcmsoY2N3X2RldmljZV93b3JrLCAmY2Rldi0+cHJpdmF0ZS0+a2lja193b3JrKTsKIAl9CiAJd2FrZV91cCgmY2Rldi0+cHJpdmF0ZS0+d2FpdF9xKTsKQEAgLTg1OSw3ICs4NTMsNyBAQAogCQlzY2ggPSB0b19zdWJjaGFubmVsKGNkZXYtPmRldi5wYXJlbnQpOwogCQlpZiAoIXNjaC0+bHBtKSB7CiAJCQlQUkVQQVJFX1dPUksoJmNkZXYtPnByaXZhdGUtPmtpY2tfd29yaywKLQkJCQkgICAgIGNjd19kZXZpY2Vfbm9wYXRoX25vdGlmeSwgKHZvaWQgKiljZGV2KTsKKwkJCQkgICAgIGNjd19kZXZpY2Vfbm9wYXRoX25vdGlmeSwgY2Rldik7CiAJCQlxdWV1ZV93b3JrKGNjd19kZXZpY2Vfbm90aWZ5X3dvcmssCiAJCQkJICAgJmNkZXYtPnByaXZhdGUtPmtpY2tfd29yayk7CiAJCX0gZWxzZQpAQCAtODg1LDcgKzg3OSw4IEBACiAJCQkvKiBCYXNpYyBzZW5zZSBoYXNuJ3Qgc3RhcnRlZC4gVHJ5IGFnYWluLiAqLwogCQkJY2N3X2RldmljZV9kb19zZW5zZShjZGV2LCBpcmIpOwogCQllbHNlIHsKLQkJCXByaW50aygiSHVoPyAlcyglcyk6IHVuc29saWNpdGVkIGludGVycnVwdC4uLlxuIiwKKwkJCXByaW50ayhLRVJOX0lORk8gIkh1aD8gJXMoJXMpOiB1bnNvbGljaXRlZCAiCisJCQkgICAgICAgImludGVycnVwdC4uLlxuIiwKIAkJCSAgICAgICBfX0ZVTkNUSU9OX18sIGNkZXYtPmRldi5idXNfaWQpOwogCQkJaWYgKGNkZXYtPmhhbmRsZXIpCiAJCQkJY2Rldi0+aGFuZGxlciAoY2RldiwgMCwgaXJiKTsKQEAgLTk0NCwxMCArOTM5LDEwIEBACiAJY2Rldi0+cHJpdmF0ZS0+c3RhdGUgPSBERVZfU1RBVEVfT05MSU5FOwogCWlmIChjZGV2LT5oYW5kbGVyKQogCQljZGV2LT5oYW5kbGVyKGNkZXYsIGNkZXYtPnByaXZhdGUtPmludHBhcm0sCi0JCQkgICAgICBFUlJfUFRSKC1FVElNRURPVVQpKTsKKwkJCSAgICAgIEVSUl9QVFIoLUVJTykpOwogCWlmICghc2NoLT5scG0pIHsKIAkJUFJFUEFSRV9XT1JLKCZjZGV2LT5wcml2YXRlLT5raWNrX3dvcmssCi0JCQkgICAgIGNjd19kZXZpY2Vfbm9wYXRoX25vdGlmeSwgKHZvaWQgKiljZGV2KTsKKwkJCSAgICAgY2N3X2RldmljZV9ub3BhdGhfbm90aWZ5LCBjZGV2KTsKIAkJcXVldWVfd29yayhjY3dfZGV2aWNlX25vdGlmeV93b3JrLCAmY2Rldi0+cHJpdmF0ZS0+a2lja193b3JrKTsKIAl9IGVsc2UgaWYgKGNkZXYtPnByaXZhdGUtPmZsYWdzLmRvdmVyaWZ5KQogCQkvKiBTdGFydCBkZWxheWVkIHBhdGggdmVyaWZpY2F0aW9uLiAqLwpAQCAtOTcwLDcgKzk2NSw3IEBACiAJCXNjaCA9IHRvX3N1YmNoYW5uZWwoY2Rldi0+ZGV2LnBhcmVudCk7CiAJCWlmICghc2NoLT5scG0pIHsKIAkJCVBSRVBBUkVfV09SSygmY2Rldi0+cHJpdmF0ZS0+a2lja193b3JrLAotCQkJCSAgICAgY2N3X2RldmljZV9ub3BhdGhfbm90aWZ5LCAodm9pZCAqKWNkZXYpOworCQkJCSAgICAgY2N3X2RldmljZV9ub3BhdGhfbm90aWZ5LCBjZGV2KTsKIAkJCXF1ZXVlX3dvcmsoY2N3X2RldmljZV9ub3RpZnlfd29yaywKIAkJCQkgICAmY2Rldi0+cHJpdmF0ZS0+a2lja193b3JrKTsKIAkJfSBlbHNlCkBAIC05ODEsNTEgKzk3NiwxNSBAQAogCWNkZXYtPnByaXZhdGUtPnN0YXRlID0gREVWX1NUQVRFX09OTElORTsKIAlpZiAoY2Rldi0+aGFuZGxlcikKIAkJY2Rldi0+aGFuZGxlcihjZGV2LCBjZGV2LT5wcml2YXRlLT5pbnRwYXJtLAotCQkJICAgICAgRVJSX1BUUigtRVRJTUVET1VUKSk7CisJCQkgICAgICBFUlJfUFRSKC1FSU8pKTsKIH0KIAotc3RhdGljIHZvaWQKLWNjd19kZXZpY2Vfd2FpdDRpb19pcnEoc3RydWN0IGNjd19kZXZpY2UgKmNkZXYsIGVudW0gZGV2X2V2ZW50IGRldl9ldmVudCkKLXsKLQlzdHJ1Y3QgaXJiICppcmI7Ci0Jc3RydWN0IHN1YmNoYW5uZWwgKnNjaDsKLQotCWlyYiA9IChzdHJ1Y3QgaXJiICopIF9fTENfSVJCOwotCS8qCi0JICogQWNjdW11bGF0ZSBzdGF0dXMgYW5kIGZpbmQgb3V0IGlmIGEgYmFzaWMgc2Vuc2UgaXMgbmVlZGVkLgotCSAqIFRoaXMgaXMgZmluZSBzaW5jZSB3ZSBoYXZlIGFscmVhZHkgYWRhcHRlZCB0aGUgbHBtLgotCSAqLwotCWNjd19kZXZpY2VfYWNjdW11bGF0ZV9pcmIoY2RldiwgaXJiKTsKLQlpZiAoY2Rldi0+cHJpdmF0ZS0+ZmxhZ3MuZG9zZW5zZSkgewotCQlpZiAoY2N3X2RldmljZV9kb19zZW5zZShjZGV2LCBpcmIpID09IDApIHsKLQkJCWNkZXYtPnByaXZhdGUtPnN0YXRlID0gREVWX1NUQVRFX1c0U0VOU0U7Ci0JCX0KLQkJcmV0dXJuOwotCX0KLQotCS8qIElmZiBkZXZpY2UgaXMgaWRsZSwgcmVzZXQgdGltZW91dC4gKi8KLQlzY2ggPSB0b19zdWJjaGFubmVsKGNkZXYtPmRldi5wYXJlbnQpOwotCWlmICghc3RzY2goc2NoLT5zY2hpZCwgJnNjaC0+c2NoaWIpKQotCQlpZiAoc2NoLT5zY2hpYi5zY3N3LmFjdGwgPT0gMCkKLQkJCWNjd19kZXZpY2Vfc2V0X3RpbWVvdXQoY2RldiwgMCk7Ci0JLyogQ2FsbCB0aGUgaGFuZGxlci4gKi8KLQljY3dfZGV2aWNlX2NhbGxfaGFuZGxlcihjZGV2KTsKLQlpZiAoIXNjaC0+bHBtKSB7Ci0JCVBSRVBBUkVfV09SSygmY2Rldi0+cHJpdmF0ZS0+a2lja193b3JrLAotCQkJICAgICBjY3dfZGV2aWNlX25vcGF0aF9ub3RpZnksICh2b2lkICopY2Rldik7Ci0JCXF1ZXVlX3dvcmsoY2N3X2RldmljZV9ub3RpZnlfd29yaywgJmNkZXYtPnByaXZhdGUtPmtpY2tfd29yayk7Ci0JfSBlbHNlIGlmIChjZGV2LT5wcml2YXRlLT5mbGFncy5kb3ZlcmlmeSkKLQkJY2N3X2RldmljZV9vbmxpbmVfdmVyaWZ5KGNkZXYsIDApOwotfQotCi1zdGF0aWMgdm9pZAotY2N3X2RldmljZV93YWl0NGlvX3RpbWVvdXQoc3RydWN0IGNjd19kZXZpY2UgKmNkZXYsIGVudW0gZGV2X2V2ZW50IGRldl9ldmVudCkKK3ZvaWQgZGV2aWNlX2tpbGxfaW8oc3RydWN0IHN1YmNoYW5uZWwgKnNjaCkKIHsKIAlpbnQgcmV0OwotCXN0cnVjdCBzdWJjaGFubmVsICpzY2g7CisJc3RydWN0IGNjd19kZXZpY2UgKmNkZXY7CiAKLQlzY2ggPSB0b19zdWJjaGFubmVsKGNkZXYtPmRldi5wYXJlbnQpOwotCWNjd19kZXZpY2Vfc2V0X3RpbWVvdXQoY2RldiwgMCk7CisJY2RldiA9IHNjaC0+ZGV2LmRyaXZlcl9kYXRhOwogCXJldCA9IGNjd19kZXZpY2VfY2FuY2VsX2hhbHRfY2xlYXIoY2Rldik7CiAJaWYgKHJldCA9PSAtRUJVU1kpIHsKIAkJY2N3X2RldmljZV9zZXRfdGltZW91dChjZGV2LCAzKkhaKTsKQEAgLTEwMzUsNyArOTk0LDcgQEAKIAlpZiAocmV0ID09IC1FTk9ERVYpIHsKIAkJaWYgKCFzY2gtPmxwbSkgewogCQkJUFJFUEFSRV9XT1JLKCZjZGV2LT5wcml2YXRlLT5raWNrX3dvcmssCi0JCQkJICAgICBjY3dfZGV2aWNlX25vcGF0aF9ub3RpZnksICh2b2lkICopY2Rldik7CisJCQkJICAgICBjY3dfZGV2aWNlX25vcGF0aF9ub3RpZnksIGNkZXYpOwogCQkJcXVldWVfd29yayhjY3dfZGV2aWNlX25vdGlmeV93b3JrLAogCQkJCSAgICZjZGV2LT5wcml2YXRlLT5raWNrX3dvcmspOwogCQl9IGVsc2UKQEAgLTEwNDQsMTIgKzEwMDMsMTIgQEAKIAl9CiAJaWYgKGNkZXYtPmhhbmRsZXIpCiAJCWNkZXYtPmhhbmRsZXIoY2RldiwgY2Rldi0+cHJpdmF0ZS0+aW50cGFybSwKLQkJCSAgICAgIEVSUl9QVFIoLUVUSU1FRE9VVCkpOworCQkJICAgICAgRVJSX1BUUigtRUlPKSk7CiAJaWYgKCFzY2gtPmxwbSkgewogCQlQUkVQQVJFX1dPUksoJmNkZXYtPnByaXZhdGUtPmtpY2tfd29yaywKLQkJCSAgICAgY2N3X2RldmljZV9ub3BhdGhfbm90aWZ5LCAodm9pZCAqKWNkZXYpOworCQkJICAgICBjY3dfZGV2aWNlX25vcGF0aF9ub3RpZnksIGNkZXYpOwogCQlxdWV1ZV93b3JrKGNjd19kZXZpY2Vfbm90aWZ5X3dvcmssICZjZGV2LT5wcml2YXRlLT5raWNrX3dvcmspOwotCX0gZWxzZSBpZiAoY2Rldi0+cHJpdmF0ZS0+ZmxhZ3MuZG92ZXJpZnkpCisJfSBlbHNlCiAJCS8qIFN0YXJ0IGRlbGF5ZWQgcGF0aCB2ZXJpZmljYXRpb24uICovCiAJCWNjd19kZXZpY2Vfb25saW5lX3ZlcmlmeShjZGV2LCAwKTsKIH0KQEAgLTEyODYsMTIgKzEyNDUsNiBAQAogCQlbREVWX0VWRU5UX1RJTUVPVVRdCT0gY2N3X2RldmljZV9raWxsaW5nX3RpbWVvdXQsCiAJCVtERVZfRVZFTlRfVkVSSUZZXQk9IGNjd19kZXZpY2Vfbm9wLCAvL0ZJWE1FCiAJfSwKLQlbREVWX1NUQVRFX1dBSVQ0SU9dID0gewotCQlbREVWX0VWRU5UX05PVE9QRVJdCT0gY2N3X2RldmljZV9vbmxpbmVfbm90b3BlciwKLQkJW0RFVl9FVkVOVF9JTlRFUlJVUFRdCT0gY2N3X2RldmljZV93YWl0NGlvX2lycSwKLQkJW0RFVl9FVkVOVF9USU1FT1VUXQk9IGNjd19kZXZpY2Vfd2FpdDRpb190aW1lb3V0LAotCQlbREVWX0VWRU5UX1ZFUklGWV0JPSBjY3dfZGV2aWNlX2RlbGF5X3ZlcmlmeSwKLQl9LAogCVtERVZfU1RBVEVfUVVJRVNDRV0gPSB7CiAJCVtERVZfRVZFTlRfTk9UT1BFUl0JPSBjY3dfZGV2aWNlX3F1aWVzY2VfZG9uZSwKIAkJW0RFVl9FVkVOVF9JTlRFUlJVUFRdCT0gY2N3X2RldmljZV9xdWllc2NlX2RvbmUsCmRpZmYgLS1naXQgYS9kcml2ZXJzL3MzOTAvY2lvL2RldmljZV9pZC5jIGIvZHJpdmVycy9zMzkwL2Npby9kZXZpY2VfaWQuYwppbmRleCAxMzk4MzY3Li5hNzQ3ODViIDEwMDY0NAotLS0gYS9kcml2ZXJzL3MzOTAvY2lvL2RldmljZV9pZC5jCisrKyBiL2RyaXZlcnMvczM5MC9jaW8vZGV2aWNlX2lkLmMKQEAgLTI1MSw3ICsyNTEsNyBAQAogCQkgKi8KIAkJQ0lPX01TR19FVkVOVCgyLCAiU2Vuc2VJRCA6IGRldmljZSAlMDR4IG9uIFN1YmNoYW5uZWwgIgogCQkJICAgICAgIjAuJXguJTA0eCByZXBvcnRzIGNtZCByZWplY3RcbiIsCi0JCQkgICAgICBjZGV2LT5wcml2YXRlLT5kZXZubywgc2NoLT5zY2hpZC5zc2lkLAorCQkJICAgICAgY2Rldi0+cHJpdmF0ZS0+ZGV2X2lkLmRldm5vLCBzY2gtPnNjaGlkLnNzaWQsCiAJCQkgICAgICBzY2gtPnNjaGlkLnNjaF9ubyk7CiAJCXJldHVybiAtRU9QTk9UU1VQUDsKIAl9CkBAIC0yNTksNyArMjU5LDggQEAKIAkJQ0lPX01TR19FVkVOVCgyLCAiU2Vuc2VJRCA6IFVDIG9uIGRldiAwLiV4LiUwNHgsICIKIAkJCSAgICAgICJscHVtICUwMlgsIGNudCAlMDJkLCBzbnMgOiIKIAkJCSAgICAgICIgJTAyWCUwMlglMDJYJTAyWCAlMDJYJTAyWCUwMlglMDJYIC4uLlxuIiwKLQkJCSAgICAgIGNkZXYtPnByaXZhdGUtPnNzaWQsIGNkZXYtPnByaXZhdGUtPmRldm5vLAorCQkJICAgICAgY2Rldi0+cHJpdmF0ZS0+ZGV2X2lkLnNzaWQsCisJCQkgICAgICBjZGV2LT5wcml2YXRlLT5kZXZfaWQuZGV2bm8sCiAJCQkgICAgICBpcmItPmVzdy5lc3cwLnN1YmxvZy5scHVtLAogCQkJICAgICAgaXJiLT5lc3cuZXN3MC5lcncuc2NudCwKIAkJCSAgICAgIGlyYi0+ZWN3WzBdLCBpcmItPmVjd1sxXSwKQEAgLTI3NCwxNCArMjc1LDE1IEBACiAJCQlDSU9fTVNHX0VWRU5UKDIsICJTZW5zZUlEIDogcGF0aCAlMDJYIGZvciBkZXZpY2UgJTA0eCAiCiAJCQkJICAgICAgIm9uIHN1YmNoYW5uZWwgMC4leC4lMDR4IGlzICIKIAkJCQkgICAgICAiJ25vdCBvcGVyYXRpb25hbCdcbiIsIHNjaC0+b3JiLmxwbSwKLQkJCQkgICAgICBjZGV2LT5wcml2YXRlLT5kZXZubywgc2NoLT5zY2hpZC5zc2lkLAotCQkJCSAgICAgIHNjaC0+c2NoaWQuc2NoX25vKTsKKwkJCQkgICAgICBjZGV2LT5wcml2YXRlLT5kZXZfaWQuZGV2bm8sCisJCQkJICAgICAgc2NoLT5zY2hpZC5zc2lkLCBzY2gtPnNjaGlkLnNjaF9ubyk7CiAJCXJldHVybiAtRUFDQ0VTOwogCX0KIAkvKiBIbW0sIHdoYXRldmVyIGhhcHBlbmVkLCB0cnkgYWdhaW4uICovCiAJQ0lPX01TR19FVkVOVCgyLCAiU2Vuc2VJRCA6IHN0YXJ0X0lPKCkgZm9yIGRldmljZSAlMDR4IG9uICIKIAkJICAgICAgInN1YmNoYW5uZWwgMC4leC4lMDR4IHJldHVybnMgc3RhdHVzICUwMlglMDJYXG4iLAotCQkgICAgICBjZGV2LT5wcml2YXRlLT5kZXZubywgc2NoLT5zY2hpZC5zc2lkLCBzY2gtPnNjaGlkLnNjaF9ubywKKwkJICAgICAgY2Rldi0+cHJpdmF0ZS0+ZGV2X2lkLmRldm5vLCBzY2gtPnNjaGlkLnNzaWQsCisJCSAgICAgIHNjaC0+c2NoaWQuc2NoX25vLAogCQkgICAgICBpcmItPnNjc3cuZHN0YXQsIGlyYi0+c2Nzdy5jc3RhdCk7CiAJcmV0dXJuIC1FQUdBSU47CiB9CkBAIC0zMzAsNyArMzMyLDcgQEAKIAkJLyogZmFsbCB0aHJvdWdoLiAqLwogCWRlZmF1bHQ6CQkvKiBTZW5zZSBJRCBmYWlsZWQuIFRyeSBhc2tpbmcgVk0uICovCiAJCWlmIChNQUNISU5FX0lTX1ZNKSB7Ci0JCQlWTV92aXJ0dWFsX2RldmljZV9pbmZvIChjZGV2LT5wcml2YXRlLT5kZXZubywKKwkJCVZNX3ZpcnR1YWxfZGV2aWNlX2luZm8gKGNkZXYtPnByaXZhdGUtPmRldl9pZC5kZXZubywKIAkJCQkJCSZjZGV2LT5wcml2YXRlLT5zZW5zZWlkKTsKIAkJCWlmIChjZGV2LT5wcml2YXRlLT5zZW5zZWlkLmN1X3R5cGUgIT0gMHhGRkZGKSB7CiAJCQkJLyogR290IHRoZSBkZXZpY2UgaW5mb3JtYXRpb24gZnJvbSBWTS4gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvczM5MC9jaW8vZGV2aWNlX29wcy5jIGIvZHJpdmVycy9zMzkwL2Npby9kZXZpY2Vfb3BzLmMKaW5kZXggODRiOWIxOC4uYjM5YzFmYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zMzkwL2Npby9kZXZpY2Vfb3BzLmMKKysrIGIvZHJpdmVycy9zMzkwL2Npby9kZXZpY2Vfb3BzLmMKQEAgLTUwLDcgKzUwLDYgQEAKIAlpZiAoY2Rldi0+cHJpdmF0ZS0+c3RhdGUgPT0gREVWX1NUQVRFX05PVF9PUEVSKQogCQlyZXR1cm4gLUVOT0RFVjsKIAlpZiAoY2Rldi0+cHJpdmF0ZS0+c3RhdGUgIT0gREVWX1NUQVRFX09OTElORSAmJgotCSAgICBjZGV2LT5wcml2YXRlLT5zdGF0ZSAhPSBERVZfU1RBVEVfV0FJVDRJTyAmJgogCSAgICBjZGV2LT5wcml2YXRlLT5zdGF0ZSAhPSBERVZfU1RBVEVfVzRTRU5TRSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAJc2NoID0gdG9fc3ViY2hhbm5lbChjZGV2LT5kZXYucGFyZW50KTsKQEAgLTE1NSw3ICsxNTQsNiBAQAogCWlmIChjZGV2LT5wcml2YXRlLT5zdGF0ZSA9PSBERVZfU1RBVEVfTk9UX09QRVIpCiAJCXJldHVybiAtRU5PREVWOwogCWlmIChjZGV2LT5wcml2YXRlLT5zdGF0ZSAhPSBERVZfU1RBVEVfT05MSU5FICYmCi0JICAgIGNkZXYtPnByaXZhdGUtPnN0YXRlICE9IERFVl9TVEFURV9XQUlUNElPICYmCiAJICAgIGNkZXYtPnByaXZhdGUtPnN0YXRlICE9IERFVl9TVEFURV9XNFNFTlNFKQogCQlyZXR1cm4gLUVJTlZBTDsKIAlzY2ggPSB0b19zdWJjaGFubmVsKGNkZXYtPmRldi5wYXJlbnQpOwpAQCAtNTkyLDEzICs1OTAsMTMgQEAKIGludAogX2Njd19kZXZpY2VfZ2V0X3N1YmNoYW5uZWxfbnVtYmVyKHN0cnVjdCBjY3dfZGV2aWNlICpjZGV2KQogewotCXJldHVybiBjZGV2LT5wcml2YXRlLT5zY2hfbm87CisJcmV0dXJuIGNkZXYtPnByaXZhdGUtPnNjaGlkLnNjaF9ubzsKIH0KIAogaW50CiBfY2N3X2RldmljZV9nZXRfZGV2aWNlX251bWJlcihzdHJ1Y3QgY2N3X2RldmljZSAqY2RldikKIHsKLQlyZXR1cm4gY2Rldi0+cHJpdmF0ZS0+ZGV2bm87CisJcmV0dXJuIGNkZXYtPnByaXZhdGUtPmRldl9pZC5kZXZubzsKIH0KIAogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3MzOTAvY2lvL2RldmljZV9wZ2lkLmMgYi9kcml2ZXJzL3MzOTAvY2lvL2RldmljZV9wZ2lkLmMKaW5kZXggODQ5MTdiMy4uMjk3NWNlOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zMzkwL2Npby9kZXZpY2VfcGdpZC5jCisrKyBiL2RyaXZlcnMvczM5MC9jaW8vZGV2aWNlX3BnaWQuYwpAQCAtNzksNyArNzksOCBAQAogCQkJQ0lPX01TR19FVkVOVCgyLCAiU05JRCAtIERldmljZSAlMDR4IG9uIFN1YmNoYW5uZWwgIgogCQkJCSAgICAgICIwLiV4LiUwNHgsIGxwbSAlMDJYLCBiZWNhbWUgJ25vdCAiCiAJCQkJICAgICAgIm9wZXJhdGlvbmFsJ1xuIiwKLQkJCQkgICAgICBjZGV2LT5wcml2YXRlLT5kZXZubywgc2NoLT5zY2hpZC5zc2lkLAorCQkJCSAgICAgIGNkZXYtPnByaXZhdGUtPmRldl9pZC5kZXZubywKKwkJCQkgICAgICBzY2gtPnNjaGlkLnNzaWQsCiAJCQkJICAgICAgc2NoLT5zY2hpZC5zY2hfbm8sIGNkZXYtPnByaXZhdGUtPmltYXNrKTsKIAogCQl9CkBAIC0xMzUsNyArMTM2LDggQEAKIAkJQ0lPX01TR19FVkVOVCgyLCAiU05JRCAtIGRldmljZSAwLiV4LiUwNHgsIHVuaXQgY2hlY2ssICIKIAkJCSAgICAgICJscHVtICUwMlgsIGNudCAlMDJkLCBzbnMgOiAiCiAJCQkgICAgICAiJTAyWCUwMlglMDJYJTAyWCAlMDJYJTAyWCUwMlglMDJYIC4uLlxuIiwKLQkJCSAgICAgIGNkZXYtPnByaXZhdGUtPnNzaWQsIGNkZXYtPnByaXZhdGUtPmRldm5vLAorCQkJICAgICAgY2Rldi0+cHJpdmF0ZS0+ZGV2X2lkLnNzaWQsCisJCQkgICAgICBjZGV2LT5wcml2YXRlLT5kZXZfaWQuZGV2bm8sCiAJCQkgICAgICBpcmItPmVzdy5lc3cwLnN1YmxvZy5scHVtLAogCQkJICAgICAgaXJiLT5lc3cuZXN3MC5lcncuc2NudCwKIAkJCSAgICAgIGlyYi0+ZWN3WzBdLCBpcmItPmVjd1sxXSwKQEAgLTE0Nyw3ICsxNDksNyBAQAogCWlmIChpcmItPnNjc3cuY2MgPT0gMykgewogCQlDSU9fTVNHX0VWRU5UKDIsICJTTklEIC0gRGV2aWNlICUwNHggb24gU3ViY2hhbm5lbCAwLiV4LiUwNHgsIgogCQkJICAgICAgIiBscG0gJTAyWCwgYmVjYW1lICdub3Qgb3BlcmF0aW9uYWwnXG4iLAotCQkJICAgICAgY2Rldi0+cHJpdmF0ZS0+ZGV2bm8sIHNjaC0+c2NoaWQuc3NpZCwKKwkJCSAgICAgIGNkZXYtPnByaXZhdGUtPmRldl9pZC5kZXZubywgc2NoLT5zY2hpZC5zc2lkLAogCQkJICAgICAgc2NoLT5zY2hpZC5zY2hfbm8sIHNjaC0+b3JiLmxwbSk7CiAJCXJldHVybiAtRUFDQ0VTOwogCX0KQEAgLTE1NSw3ICsxNTcsNyBAQAogCWlmIChjZGV2LT5wcml2YXRlLT5wZ2lkW2ldLmluZi5wcy5zdGF0ZTIgPT0gU05JRF9TVEFURTJfUkVTVkRfRUxTRSkgewogCQlDSU9fTVNHX0VWRU5UKDIsICJTTklEIC0gRGV2aWNlICUwNHggb24gU3ViY2hhbm5lbCAwLiV4LiUwNHggIgogCQkJICAgICAgImlzIHJlc2VydmVkIGJ5IHNvbWVvbmUgZWxzZVxuIiwKLQkJCSAgICAgIGNkZXYtPnByaXZhdGUtPmRldm5vLCBzY2gtPnNjaGlkLnNzaWQsCisJCQkgICAgICBjZGV2LT5wcml2YXRlLT5kZXZfaWQuZGV2bm8sIHNjaC0+c2NoaWQuc3NpZCwKIAkJCSAgICAgIHNjaC0+c2NoaWQuc2NoX25vKTsKIAkJcmV0dXJuIC1FVVNFUlM7CiAJfQpAQCAtMjYxLDcgKzI2Myw3IEBACiAJLyogUEdJRCBjb21tYW5kIGZhaWxlZCBvbiB0aGlzIHBhdGguICovCiAJQ0lPX01TR19FVkVOVCgyLCAiU1BJRCAtIERldmljZSAlMDR4IG9uIFN1YmNoYW5uZWwgIgogCQkgICAgICAiMC4leC4lMDR4LCBscG0gJTAyWCwgYmVjYW1lICdub3Qgb3BlcmF0aW9uYWwnXG4iLAotCQkgICAgICBjZGV2LT5wcml2YXRlLT5kZXZubywgc2NoLT5zY2hpZC5zc2lkLAorCQkgICAgICBjZGV2LT5wcml2YXRlLT5kZXZfaWQuZGV2bm8sIHNjaC0+c2NoaWQuc3NpZCwKIAkJICAgICAgc2NoLT5zY2hpZC5zY2hfbm8sIGNkZXYtPnByaXZhdGUtPmltYXNrKTsKIAlyZXR1cm4gcmV0OwogfQpAQCAtMzAxLDcgKzMwMyw3IEBACiAJLyogbm9wIGNvbW1hbmQgZmFpbGVkIG9uIHRoaXMgcGF0aC4gKi8KIAlDSU9fTVNHX0VWRU5UKDIsICJOT1AgLSBEZXZpY2UgJTA0eCBvbiBTdWJjaGFubmVsICIKIAkJICAgICAgIjAuJXguJTA0eCwgbHBtICUwMlgsIGJlY2FtZSAnbm90IG9wZXJhdGlvbmFsJ1xuIiwKLQkJICAgICAgY2Rldi0+cHJpdmF0ZS0+ZGV2bm8sIHNjaC0+c2NoaWQuc3NpZCwKKwkJICAgICAgY2Rldi0+cHJpdmF0ZS0+ZGV2X2lkLmRldm5vLCBzY2gtPnNjaGlkLnNzaWQsCiAJCSAgICAgIHNjaC0+c2NoaWQuc2NoX25vLCBjZGV2LT5wcml2YXRlLT5pbWFzayk7CiAJcmV0dXJuIHJldDsKIH0KQEAgLTMyOCw4ICszMzAsOSBAQAogCQlDSU9fTVNHX0VWRU5UKDIsICJTUElEIC0gZGV2aWNlIDAuJXguJTA0eCwgdW5pdCBjaGVjaywgIgogCQkJICAgICAgImNudCAlMDJkLCAiCiAJCQkgICAgICAic25zIDogJTAyWCUwMlglMDJYJTAyWCAlMDJYJTAyWCUwMlglMDJYIC4uLlxuIiwKLQkJCSAgICAgIGNkZXYtPnByaXZhdGUtPnNzaWQsCi0JCQkgICAgICBjZGV2LT5wcml2YXRlLT5kZXZubywgaXJiLT5lc3cuZXN3MC5lcncuc2NudCwKKwkJCSAgICAgIGNkZXYtPnByaXZhdGUtPmRldl9pZC5zc2lkLAorCQkJICAgICAgY2Rldi0+cHJpdmF0ZS0+ZGV2X2lkLmRldm5vLAorCQkJICAgICAgaXJiLT5lc3cuZXN3MC5lcncuc2NudCwKIAkJCSAgICAgIGlyYi0+ZWN3WzBdLCBpcmItPmVjd1sxXSwKIAkJCSAgICAgIGlyYi0+ZWN3WzJdLCBpcmItPmVjd1szXSwKIAkJCSAgICAgIGlyYi0+ZWN3WzRdLCBpcmItPmVjd1s1XSwKQEAgLTMzOSw3ICszNDIsNyBAQAogCWlmIChpcmItPnNjc3cuY2MgPT0gMykgewogCQlDSU9fTVNHX0VWRU5UKDIsICJTUElEIC0gRGV2aWNlICUwNHggb24gU3ViY2hhbm5lbCAwLiV4LiUwNHgsIgogCQkJICAgICAgIiBscG0gJTAyWCwgYmVjYW1lICdub3Qgb3BlcmF0aW9uYWwnXG4iLAotCQkJICAgICAgY2Rldi0+cHJpdmF0ZS0+ZGV2bm8sIHNjaC0+c2NoaWQuc3NpZCwKKwkJCSAgICAgIGNkZXYtPnByaXZhdGUtPmRldl9pZC5kZXZubywgc2NoLT5zY2hpZC5zc2lkLAogCQkJICAgICAgc2NoLT5zY2hpZC5zY2hfbm8sIGNkZXYtPnByaXZhdGUtPmltYXNrKTsKIAkJcmV0dXJuIC1FQUNDRVM7CiAJfQpAQCAtMzYyLDcgKzM2NSw3IEBACiAJaWYgKGlyYi0+c2Nzdy5jYyA9PSAzKSB7CiAJCUNJT19NU0dfRVZFTlQoMiwgIk5PUCAtIERldmljZSAlMDR4IG9uIFN1YmNoYW5uZWwgMC4leC4lMDR4LCIKIAkJCSAgICAgICIgbHBtICUwMlgsIGJlY2FtZSAnbm90IG9wZXJhdGlvbmFsJ1xuIiwKLQkJCSAgICAgIGNkZXYtPnByaXZhdGUtPmRldm5vLCBzY2gtPnNjaGlkLnNzaWQsCisJCQkgICAgICBjZGV2LT5wcml2YXRlLT5kZXZfaWQuZGV2bm8sIHNjaC0+c2NoaWQuc3NpZCwKIAkJCSAgICAgIHNjaC0+c2NoaWQuc2NoX25vLCBjZGV2LT5wcml2YXRlLT5pbWFzayk7CiAJCXJldHVybiAtRUFDQ0VTOwogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvczM5MC9jaW8vZGV2aWNlX3N0YXR1cy5jIGIvZHJpdmVycy9zMzkwL2Npby9kZXZpY2Vfc3RhdHVzLmMKaW5kZXggY2FmMTQ4ZC4uM2Y3Y2JjZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zMzkwL2Npby9kZXZpY2Vfc3RhdHVzLmMKKysrIGIvZHJpdmVycy9zMzkwL2Npby9kZXZpY2Vfc3RhdHVzLmMKQEAgLTMyLDE5ICszMiwxOCBAQAogCQkJCSBTQ0hOX1NUQVRfQ0hOX0NUUkxfQ0hLIHwKIAkJCQkgU0NITl9TVEFUX0lOVEZfQ1RSTF9DSEspKSkKIAkJcmV0dXJuOwotCQkKIAlDSU9fTVNHX0VWRU5UKDAsICJDaGFubmVsLUNoZWNrIG9yIEludGVyZmFjZS1Db250cm9sLUNoZWNrICIKIAkJICAgICAgInJlY2VpdmVkIgogCQkgICAgICAiIC4uLiBkZXZpY2UgJTA0eCBvbiBzdWJjaGFubmVsIDAuJXguJTA0eCwgZGV2X3N0YXQgIgogCQkgICAgICAiOiAlMDJYIHNjaF9zdGF0IDogJTAyWFxuIiwKLQkJICAgICAgY2Rldi0+cHJpdmF0ZS0+ZGV2bm8sIGNkZXYtPnByaXZhdGUtPnNzaWQsCi0JCSAgICAgIGNkZXYtPnByaXZhdGUtPnNjaF9ubywKKwkJICAgICAgY2Rldi0+cHJpdmF0ZS0+ZGV2X2lkLmRldm5vLCBjZGV2LT5wcml2YXRlLT5zY2hpZC5zc2lkLAorCQkgICAgICBjZGV2LT5wcml2YXRlLT5zY2hpZC5zY2hfbm8sCiAJCSAgICAgIGlyYi0+c2Nzdy5kc3RhdCwgaXJiLT5zY3N3LmNzdGF0KTsKIAogCWlmIChpcmItPnNjc3cuY2MgIT0gMykgewogCQljaGFyIGRiZl90ZXh0WzE1XTsKIAotCQlzcHJpbnRmKGRiZl90ZXh0LCAiY2hrJXgiLCBjZGV2LT5wcml2YXRlLT5zY2hfbm8pOworCQlzcHJpbnRmKGRiZl90ZXh0LCAiY2hrJXgiLCBjZGV2LT5wcml2YXRlLT5zY2hpZC5zY2hfbm8pOwogCQlDSU9fVFJBQ0VfRVZFTlQoMCwgZGJmX3RleHQpOwogCQlDSU9fSEVYX0VWRU5UKDAsIGlyYiwgc2l6ZW9mIChzdHJ1Y3QgaXJiKSk7CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zMzkwL2Npby9xZGlvLmMgYi9kcml2ZXJzL3MzOTAvY2lvL3FkaW8uYwppbmRleCBjZGU4MjJkLi40NzZhYTFkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3MzOTAvY2lvL3FkaW8uYworKysgYi9kcml2ZXJzL3MzOTAvY2lvL3FkaW8uYwpAQCAtMTc0MSw3ICsxNzQxLDcgQEAKIAl2b2lkICpwdHI7CiAJaW50IGF2YWlsYWJsZTsKIAotCXNwcmludGYoZGJmX3RleHQsInFmcXMlNHgiLGNkZXYtPnByaXZhdGUtPnNjaF9ubyk7CisJc3ByaW50ZihkYmZfdGV4dCwicWZxcyU0eCIsY2Rldi0+cHJpdmF0ZS0+c2NoaWQuc2NoX25vKTsKIAlRRElPX0RCRl9URVhUMCgwLHNldHVwLGRiZl90ZXh0KTsKIAlmb3IgKGk9MDtpPG5vX2lucHV0X3FzO2krKykgewogCQlxPWlycV9wdHItPmlucHV0X3FzW2ldOwpAQCAtMjkyNCw3ICsyOTI0LDcgQEAKIAogCWlycV9wdHIgPSBjZGV2LT5wcml2YXRlLT5xZGlvX2RhdGE7CiAKLQlzcHJpbnRmKGRiZl90ZXh0LCJxZWhpJTR4IixjZGV2LT5wcml2YXRlLT5zY2hfbm8pOworCXNwcmludGYoZGJmX3RleHQsInFlaGklNHgiLGNkZXYtPnByaXZhdGUtPnNjaGlkLnNjaF9ubyk7CiAJUURJT19EQkZfVEVYVDAoMCxzZXR1cCxkYmZfdGV4dCk7CiAJUURJT19EQkZfVEVYVDAoMCx0cmFjZSxkYmZfdGV4dCk7CiAKQEAgLTI5NDMsNyArMjk0Myw3IEBACiAJaW50IHJjOwogCWNoYXIgZGJmX3RleHRbMTVdOwogCi0Jc3ByaW50ZihkYmZfdGV4dCwicWluaSU0eCIsaW5pdF9kYXRhLT5jZGV2LT5wcml2YXRlLT5zY2hfbm8pOworCXNwcmludGYoZGJmX3RleHQsInFpbmklNHgiLGluaXRfZGF0YS0+Y2Rldi0+cHJpdmF0ZS0+c2NoaWQuc2NoX25vKTsKIAlRRElPX0RCRl9URVhUMCgwLHNldHVwLGRiZl90ZXh0KTsKIAlRRElPX0RCRl9URVhUMCgwLHRyYWNlLGRiZl90ZXh0KTsKIApAQCAtMjk2NCw3ICsyOTY0LDcgQEAKIAlzdHJ1Y3QgcWRpb19pcnEgKmlycV9wdHI7CiAJY2hhciBkYmZfdGV4dFsxNV07CiAKLQlzcHJpbnRmKGRiZl90ZXh0LCJxYWxjJTR4Iixpbml0X2RhdGEtPmNkZXYtPnByaXZhdGUtPnNjaF9ubyk7CisJc3ByaW50ZihkYmZfdGV4dCwicWFsYyU0eCIsaW5pdF9kYXRhLT5jZGV2LT5wcml2YXRlLT5zY2hpZC5zY2hfbm8pOwogCVFESU9fREJGX1RFWFQwKDAsc2V0dXAsZGJmX3RleHQpOwogCVFESU9fREJGX1RFWFQwKDAsdHJhY2UsZGJmX3RleHQpOwogCWlmICggKGluaXRfZGF0YS0+bm9faW5wdXRfcXM+UURJT19NQVhfUVVFVUVTX1BFUl9JUlEpIHx8CkBAIC0zMTg3LDcgKzMxODcsNyBAQAogCQl0aXFkaW9fc2V0X2RlbGF5X3RhcmdldChpcnFfcHRyLFRJUURJT19ERUxBWV9UQVJHRVQpOwogCX0KIAotCXNwcmludGYoZGJmX3RleHQsInFlc3QlNHgiLGNkZXYtPnByaXZhdGUtPnNjaF9ubyk7CisJc3ByaW50ZihkYmZfdGV4dCwicWVzdCU0eCIsY2Rldi0+cHJpdmF0ZS0+c2NoaWQuc2NoX25vKTsKIAlRRElPX0RCRl9URVhUMCgwLHNldHVwLGRiZl90ZXh0KTsKIAlRRElPX0RCRl9URVhUMCgwLHRyYWNlLGRiZl90ZXh0KTsKIApAQCAtMzUyOSw3ICszNTI5LDcgQEAKICNpZmRlZiBDT05GSUdfUURJT19ERUJVRwogCWNoYXIgZGJmX3RleHRbMjBdOwogCi0Jc3ByaW50ZihkYmZfdGV4dCwiZG9RRCUwNHgiLGNkZXYtPnByaXZhdGUtPnNjaF9ubyk7CisJc3ByaW50ZihkYmZfdGV4dCwiZG9RRCUwNHgiLGNkZXYtPnByaXZhdGUtPnNjaGlkLnNjaF9ubyk7CiAgCVFESU9fREJGX1RFWFQzKDAsdHJhY2UsZGJmX3RleHQpOwogI2VuZGlmIC8qIENPTkZJR19RRElPX0RFQlVHICovCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvczM5MC9jcnlwdG8vYXBfYnVzLmMgYi9kcml2ZXJzL3MzOTAvY3J5cHRvL2FwX2J1cy5jCmluZGV4IGM1Y2NkMjAuLjc5ZDg5YzMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvczM5MC9jcnlwdG8vYXBfYnVzLmMKKysrIGIvZHJpdmVycy9zMzkwL2NyeXB0by9hcF9idXMuYwpAQCAtNzM5LDExICs3MzksMTYgQEAKIAkJZGV2ID0gYnVzX2ZpbmRfZGV2aWNlKCZhcF9idXNfdHlwZSwgTlVMTCwKIAkJCQkgICAgICAodm9pZCAqKSh1bnNpZ25lZCBsb25nKXFpZCwKIAkJCQkgICAgICBfX2FwX3NjYW5fYnVzKTsKKwkJcmMgPSBhcF9xdWVyeV9xdWV1ZShxaWQsICZxdWV1ZV9kZXB0aCwgJmRldmljZV90eXBlKTsKKwkJaWYgKGRldiAmJiByYykgeworCQkJcHV0X2RldmljZShkZXYpOworCQkJZGV2aWNlX3VucmVnaXN0ZXIoZGV2KTsKKwkJCWNvbnRpbnVlOworCQl9CiAJCWlmIChkZXYpIHsKIAkJCXB1dF9kZXZpY2UoZGV2KTsKIAkJCWNvbnRpbnVlOwogCQl9Ci0JCXJjID0gYXBfcXVlcnlfcXVldWUocWlkLCAmcXVldWVfZGVwdGgsICZkZXZpY2VfdHlwZSk7CiAJCWlmIChyYykKIAkJCWNvbnRpbnVlOwogCQlyYyA9IGFwX2luaXRfcXVldWUocWlkKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvczM5MC9zY3NpL3pmY3BfZGVmLmggYi9kcml2ZXJzL3MzOTAvc2NzaS96ZmNwX2RlZi5oCmluZGV4IDhmODgyNjkuLjc0YzBlYWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvczM5MC9zY3NpL3pmY3BfZGVmLmgKKysrIGIvZHJpdmVycy9zMzkwL3Njc2kvemZjcF9kZWYuaApAQCAtMTA3LDYgKzEwNywxMCBAQAogCShaRkNQX01BWF9TQkFMU19QRVJfUkVRICogWkZDUF9NQVhfU0JBTEVTX1BFUl9TQkFMIC0gMikKICAgICAgICAgLyogcmVxdWVzdCBJRCArIFFUQ0IgaW4gU0JBTEUgMCArIDEgb2YgZmlyc3QgU0JBTCBpbiBjaGFpbiAqLwogCisjZGVmaW5lIFpGQ1BfTUFYX1NFQ1RPUlMgKFpGQ1BfTUFYX1NCQUxFU19QRVJfUkVRICogOCkKKyAgICAgICAgLyogbWF4LiBudW1iZXIgb2YgKGRhdGEgYnVmZmVyKSBTQkFMRXMgaW4gbGFyZ2VzdCBTQkFMIGNoYWluCisgICAgICAgICAgIG11bHRpcGxpZWQgd2l0aCBudW1iZXIgb2Ygc2VjdG9ycyBwZXIgNGsgYmxvY2sgKi8KKwogLyogRklYTUUodHVuZSk6IGZyZWUgc3BhY2Ugc2hvdWxkIGJlIG9uZSBtYXguIFNCQUwgY2hhaW4gcGx1cyB3aGF0PyAqLwogI2RlZmluZSBaRkNQX1FESU9fUENJX0lOVEVSVkFMCQkoUURJT19NQVhfQlVGRkVSU19QRVJfUSBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gKFpGQ1BfTUFYX1NCQUxTX1BFUl9SRVEgKyA0KSkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvczM5MC9zY3NpL3pmY3Bfc2NzaS5jIGIvZHJpdmVycy9zMzkwL3Njc2kvemZjcF9zY3NpLmMKaW5kZXggNGQyYmM3OS4uNDUyZDk2ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zMzkwL3Njc2kvemZjcF9zY3NpLmMKKysrIGIvZHJpdmVycy9zMzkwL3Njc2kvemZjcF9zY3NpLmMKQEAgLTU4LDYgKzU4LDcgQEAKIAkJLmNtZF9wZXJfbHVuCQk9IDEsCiAJCS51c2VfY2x1c3RlcmluZwkJPSAxLAogCQkuc2Rldl9hdHRycwkJPSB6ZmNwX3N5c2ZzX3NkZXZfYXR0cnMsCisJCS5tYXhfc2VjdG9ycwkJPSBaRkNQX01BWF9TRUNUT1JTLAogCX0sCiAJLmRyaXZlcl92ZXJzaW9uID0gWkZDUF9WRVJTSU9OLAogfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2J1cy9jaGFyL2JiY19lbnZjdHJsLmMgYi9kcml2ZXJzL3NidXMvY2hhci9iYmNfZW52Y3RybC5jCmluZGV4IGQyN2U0ZjYuLmE1NGU0MTQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2J1cy9jaGFyL2JiY19lbnZjdHJsLmMKKysrIGIvZHJpdmVycy9zYnVzL2NoYXIvYmJjX2VudmN0cmwuYwpAQCAtNCwxMSArNCw5IEBACiAgKiBDb3B5cmlnaHQgKEMpIDIwMDEgRGF2aWQgUy4gTWlsbGVyIChkYXZlbUByZWRoYXQuY29tKQogICovCiAKLSNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9rdGhyZWFkLmg+Ci0jaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KLSNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9rbW9kLmg+CiAjaW5jbHVkZSA8YXNtL29wbGliLmg+CiAjaW5jbHVkZSA8YXNtL2VidXMuaD4KIApAQCAtMTk3LDcgKzE5NSw3IEBACiAJcHJpbnRrKEtFUk5fQ1JJVCAia2VudmN0cmxkOiBTaHV0dGluZyBkb3duIHRoZSBzeXN0ZW0gbm93LlxuIik7CiAKIAlzaHV0dGluZ19kb3duID0gMTsKLQlpZiAoa2VybmVsX2V4ZWN2ZSgiL3NiaW4vc2h1dGRvd24iLCBhcmd2LCBlbnZwKSA8IDApCisJaWYgKGNhbGxfdXNlcm1vZGVoZWxwZXIoIi9zYmluL3NodXRkb3duIiwgYXJndiwgZW52cCwgMCkgPCAwKQogCQlwcmludGsoS0VSTl9DUklUICJlbnZjdHJsOiBzaHV0ZG93biBleGVjdXRpb24gZmFpbGVkXG4iKTsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zYnVzL2NoYXIvZW52Y3RybC5jIGIvZHJpdmVycy9zYnVzL2NoYXIvZW52Y3RybC5jCmluZGV4IDcyOGExMzMuLmZmZjQ2NjAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2J1cy9jaGFyL2VudmN0cmwuYworKysgYi9kcml2ZXJzL3NidXMvY2hhci9lbnZjdHJsLmMKQEAgLTIwLDE2ICsyMCwxMiBAQAogICovCiAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9rdGhyZWFkLmg+Ci0jaW5jbHVkZSA8bGludXgvZXJybm8uaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9taXNjZGV2aWNlLmg+Ci0jaW5jbHVkZSA8bGludXgvbW0uaD4KLSNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Ci0jaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgva21vZC5oPgogCiAjaW5jbHVkZSA8YXNtL2VidXMuaD4KICNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgpAQCAtOTgwLDcgKzk3Niw3IEBACiAKIAlpbnByb2cgPSAxOwogCXByaW50ayhLRVJOX0NSSVQgImtlbnZjdHJsZDogV0FSTklORzogU2h1dHRpbmcgZG93biB0aGUgc3lzdGVtIG5vdy5cbiIpOwotCXJldCA9IGtlcm5lbF9leGVjdmUoIi9zYmluL3NodXRkb3duIiwgYXJndiwgZW52cCk7CisJcmV0ID0gY2FsbF91c2VybW9kZWhlbHBlcigiL3NiaW4vc2h1dGRvd24iLCBhcmd2LCBlbnZwLCAwKTsKIAlpZiAocmV0IDwgMCkgewogCQlwcmludGsoS0VSTl9DUklUICJrZW52Y3RybGQ6IFdBUk5JTkc6IHN5c3RlbSBzaHV0ZG93biBmYWlsZWQhXG4iKTsgCiAJCWlucHJvZyA9IDA7ICAvKiB1bmxpa2VseSB0byBzdWNjZWVkLCBidXQgd2UgY291bGQgdHJ5IGFnYWluICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3NidXMvc2J1cy5jIGIvZHJpdmVycy9zYnVzL3NidXMuYwppbmRleCA5MzU5NTJlLi45OGZjYmIzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3NidXMvc2J1cy5jCisrKyBiL2RyaXZlcnMvc2J1cy9zYnVzLmMKQEAgLTYxLDExICs2MSwxMSBAQAogCWVsc2UKIAkJc2Rldi0+b2ZkZXYuZGV2LnBhcmVudCA9ICZzZGV2LT5idXMtPm9mZGV2LmRldjsKIAlzZGV2LT5vZmRldi5kZXYuYnVzID0gJnNidXNfYnVzX3R5cGU7Ci0Jc3RyY3B5KHNkZXYtPm9mZGV2LmRldi5idXNfaWQsIGRwLT5wYXRoX2NvbXBvbmVudF9uYW1lKTsKKwlzcHJpbnRmKHNkZXYtPm9mZGV2LmRldi5idXNfaWQsICJzYnVzWyUwOHhdIiwgZHAtPm5vZGUpOwogCiAJaWYgKG9mX2RldmljZV9yZWdpc3Rlcigmc2Rldi0+b2ZkZXYpICE9IDApCiAJCXByaW50ayhLRVJOX0RFQlVHICJzYnVzOiBkZXZpY2UgcmVnaXN0cmF0aW9uIGVycm9yIGZvciAlcyFcbiIsCi0JCSAgICAgICBzZGV2LT5vZmRldi5kZXYuYnVzX2lkKTsKKwkJICAgICAgIGRwLT5wYXRoX2NvbXBvbmVudF9uYW1lKTsKIH0KIAogc3RhdGljIHZvaWQgX19pbml0IHNidXNfYnVzX3Jhbmdlc19pbml0KHN0cnVjdCBkZXZpY2Vfbm9kZSAqZHAsIHN0cnVjdCBzYnVzX2J1cyAqc2J1cykKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS8zdy05eHh4LmMgYi9kcml2ZXJzL3Njc2kvM3ctOXh4eC5jCmluZGV4IDVmOGMyNmMuLmIwOTFhMGYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS8zdy05eHh4LmMKKysrIGIvZHJpdmVycy9zY3NpLzN3LTl4eHguYwpAQCAtNjYsNiArNjYsOSBAQAogICAgMi4yNi4wMi4wMDYgLSBGaXggOTU1MFNYIHBjaGlwIHJlc2V0IHRpbWVvdXQuCiAgICAgICAgICAgICAgICAgIEFkZCBiaWcgZW5kaWFuIHN1cHBvcnQuCiAgICAyLjI2LjAyLjAwNyAtIERpc2FibGUgbG9jYWwgaW50ZXJydXB0cyBkdXJpbmcga21hcC91bm1hcF9hdG9taWMoKS4KKyAgIDIuMjYuMDIuMDA4IC0gRnJlZSBpcnEgaGFuZGxlciBpbiBfX3R3YV9zaHV0ZG93bigpLgorICAgICAgICAgICAgICAgICBTZXJpYWxpemUgcmVzZXQgY29kZS4KKyAgICAgICAgICAgICAgICAgQWRkIHN1cHBvcnQgZm9yIDk2NTBTRSBjb250cm9sbGVycy4KICovCiAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KQEAgLTg5LDcgKzkyLDcgQEAKICNpbmNsdWRlICIzdy05eHh4LmgiCiAKIC8qIEdsb2JhbHMgKi8KLSNkZWZpbmUgVFdfRFJJVkVSX1ZFUlNJT04gIjIuMjYuMDIuMDA3IgorI2RlZmluZSBUV19EUklWRVJfVkVSU0lPTiAiMi4yNi4wMi4wMDgiCiBzdGF0aWMgVFdfRGV2aWNlX0V4dGVuc2lvbiAqdHdhX2RldmljZV9leHRlbnNpb25fbGlzdFtUV19NQVhfU0xPVF07CiBzdGF0aWMgdW5zaWduZWQgaW50IHR3YV9kZXZpY2VfZXh0ZW5zaW9uX2NvdW50Owogc3RhdGljIGludCB0d2FfbWFqb3IgPSAtMTsKQEAgLTU2Niw5ICs1NjksOSBAQAogCQlnb3RvIG91dDsKIAl9CiAKLQl0d19kZXYtPndvcmtpbmdfc3JsID0gZndfb25fY3Rscl9zcmw7Ci0JdHdfZGV2LT53b3JraW5nX2JyYW5jaCA9IGZ3X29uX2N0bHJfYnJhbmNoOwotCXR3X2Rldi0+d29ya2luZ19idWlsZCA9IGZ3X29uX2N0bHJfYnVpbGQ7CisJdHdfZGV2LT50d19jb21wYXRfaW5mby53b3JraW5nX3NybCA9IGZ3X29uX2N0bHJfc3JsOworCXR3X2Rldi0+dHdfY29tcGF0X2luZm8ud29ya2luZ19icmFuY2ggPSBmd19vbl9jdGxyX2JyYW5jaDsKKwl0d19kZXYtPnR3X2NvbXBhdF9pbmZvLndvcmtpbmdfYnVpbGQgPSBmd19vbl9jdGxyX2J1aWxkOwogCiAJLyogVHJ5IGJhc2UgbW9kZSBjb21wYXRpYmlsaXR5ICovCiAJaWYgKCEoaW5pdF9jb25uZWN0X3Jlc3VsdCAmIFRXX0NUTFJfRldfQ09NUEFUSUJMRSkpIHsKQEAgLTU5MCwxMCArNTkzLDIzIEBACiAJCQl9CiAJCQlnb3RvIG91dDsKIAkJfQotCQl0d19kZXYtPndvcmtpbmdfc3JsID0gVFdfQkFTRV9GV19TUkw7Ci0JCXR3X2Rldi0+d29ya2luZ19icmFuY2ggPSBUV19CQVNFX0ZXX0JSQU5DSDsKLQkJdHdfZGV2LT53b3JraW5nX2J1aWxkID0gVFdfQkFTRV9GV19CVUlMRDsKKwkJdHdfZGV2LT50d19jb21wYXRfaW5mby53b3JraW5nX3NybCA9IFRXX0JBU0VfRldfU1JMOworCQl0d19kZXYtPnR3X2NvbXBhdF9pbmZvLndvcmtpbmdfYnJhbmNoID0gVFdfQkFTRV9GV19CUkFOQ0g7CisJCXR3X2Rldi0+dHdfY29tcGF0X2luZm8ud29ya2luZ19idWlsZCA9IFRXX0JBU0VfRldfQlVJTEQ7CiAJfQorCisJLyogTG9hZCByZXN0IG9mIGNvbXBhdGliaWxpdHkgc3RydWN0ICovCisJc3RybmNweSh0d19kZXYtPnR3X2NvbXBhdF9pbmZvLmRyaXZlcl92ZXJzaW9uLCBUV19EUklWRVJfVkVSU0lPTiwgc3RybGVuKFRXX0RSSVZFUl9WRVJTSU9OKSk7CisJdHdfZGV2LT50d19jb21wYXRfaW5mby5kcml2ZXJfc3JsX2hpZ2ggPSBUV19DVVJSRU5UX0RSSVZFUl9TUkw7CisJdHdfZGV2LT50d19jb21wYXRfaW5mby5kcml2ZXJfYnJhbmNoX2hpZ2ggPSBUV19DVVJSRU5UX0RSSVZFUl9CUkFOQ0g7CisJdHdfZGV2LT50d19jb21wYXRfaW5mby5kcml2ZXJfYnVpbGRfaGlnaCA9IFRXX0NVUlJFTlRfRFJJVkVSX0JVSUxEOworCXR3X2Rldi0+dHdfY29tcGF0X2luZm8uZHJpdmVyX3NybF9sb3cgPSBUV19CQVNFX0ZXX1NSTDsKKwl0d19kZXYtPnR3X2NvbXBhdF9pbmZvLmRyaXZlcl9icmFuY2hfbG93ID0gVFdfQkFTRV9GV19CUkFOQ0g7CisJdHdfZGV2LT50d19jb21wYXRfaW5mby5kcml2ZXJfYnVpbGRfbG93ID0gVFdfQkFTRV9GV19CVUlMRDsKKwl0d19kZXYtPnR3X2NvbXBhdF9pbmZvLmZ3X29uX2N0bHJfc3JsID0gZndfb25fY3Rscl9zcmw7CisJdHdfZGV2LT50d19jb21wYXRfaW5mby5md19vbl9jdGxyX2JyYW5jaCA9IGZ3X29uX2N0bHJfYnJhbmNoOworCXR3X2Rldi0+dHdfY29tcGF0X2luZm8uZndfb25fY3Rscl9idWlsZCA9IGZ3X29uX2N0bHJfYnVpbGQ7CisKIAlyZXR2YWwgPSAwOwogb3V0OgogCXJldHVybiByZXR2YWw7CkBAIC02MzEsNyArNjQ3LDcgQEAKIAkJZ290byBvdXQyOwogCiAJLyogQ2hlY2sgZGF0YSBidWZmZXIgc2l6ZSAqLwotCWlmIChkcml2ZXJfY29tbWFuZC5idWZmZXJfbGVuZ3RoID4gVFdfTUFYX1NFQ1RPUlMgKiA1MTIpIHsKKwlpZiAoZHJpdmVyX2NvbW1hbmQuYnVmZmVyX2xlbmd0aCA+IFRXX01BWF9TRUNUT1JTICogMjA0OCkgewogCQlyZXR2YWwgPSBUV19JT0NUTF9FUlJPUl9PU19FSU5WQUw7CiAJCWdvdG8gb3V0MjsKIAl9CkBAIC02ODAsMTMgKzY5Niw2IEBACiAJCS8qIE5vdyB3YWl0IGZvciBjb21tYW5kIHRvIGNvbXBsZXRlICovCiAJCXRpbWVvdXQgPSB3YWl0X2V2ZW50X3RpbWVvdXQodHdfZGV2LT5pb2N0bF93cXVldWUsIHR3X2Rldi0+Y2hyZGV2X3JlcXVlc3RfaWQgPT0gVFdfSU9DVExfQ0hSREVWX0ZSRUUsIHRpbWVvdXQpOwogCi0JCS8qIFNlZSBpZiB3ZSByZXNldCB3aGlsZSB3YWl0aW5nIGZvciB0aGUgaW9jdGwgdG8gY29tcGxldGUgKi8KLQkJaWYgKHRlc3RfYml0KFRXX0lOX1JFU0VULCAmdHdfZGV2LT5mbGFncykpIHsKLQkJCWNsZWFyX2JpdChUV19JTl9SRVNFVCwgJnR3X2Rldi0+ZmxhZ3MpOwotCQkJcmV0dmFsID0gVFdfSU9DVExfRVJST1JfT1NfRVJFU1RBUlRTWVM7Ci0JCQlnb3RvIG91dDM7Ci0JCX0KLQogCQkvKiBXZSB0aW1lZCBvdXQsIGFuZCBkaWRuJ3QgZ2V0IGFuIGludGVycnVwdCAqLwogCQlpZiAodHdfZGV2LT5jaHJkZXZfcmVxdWVzdF9pZCAhPSBUV19JT0NUTF9DSFJERVZfRlJFRSkgewogCQkJLyogTm93IHdlIG5lZWQgdG8gcmVzZXQgdGhlIGJvYXJkICovCkBAIC02OTQsMTEgKzcwMyw2IEBACiAJCQkgICAgICAgdHdfZGV2LT5ob3N0LT5ob3N0X25vLCBUV19EUklWRVIsIDB4YywKIAkJCSAgICAgICBjbWQpOwogCQkJcmV0dmFsID0gVFdfSU9DVExfRVJST1JfT1NfRUlPOwotCQkJc3Bpbl9sb2NrX2lycXNhdmUodHdfZGV2LT5ob3N0LT5ob3N0X2xvY2ssIGZsYWdzKTsKLQkJCXR3X2Rldi0+c3RhdGVbcmVxdWVzdF9pZF0gPSBUV19TX0NPTVBMRVRFRDsKLQkJCXR3YV9mcmVlX3JlcXVlc3RfaWQodHdfZGV2LCByZXF1ZXN0X2lkKTsKLQkJCXR3X2Rldi0+cG9zdGVkX3JlcXVlc3RfY291bnQtLTsKLQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUodHdfZGV2LT5ob3N0LT5ob3N0X2xvY2ssIGZsYWdzKTsKIAkJCXR3YV9yZXNldF9kZXZpY2VfZXh0ZW5zaW9uKHR3X2RldiwgMSk7CiAJCQlnb3RvIG91dDM7CiAJCX0KQEAgLTcxNywxNiArNzIxLDcgQEAKIAkJdHdfaW9jdGwtPmRyaXZlcl9jb21tYW5kLnN0YXR1cyA9IDA7CiAJCS8qIENvcHkgY29tcGF0aWJsaXR5IHN0cnVjdCBpbnRvIGlvY3RsIGRhdGEgYnVmZmVyICovCiAJCXR3X2NvbXBhdF9pbmZvID0gKFRXX0NvbXBhdGliaWxpdHlfSW5mbyAqKXR3X2lvY3RsLT5kYXRhX2J1ZmZlcjsKLQkJc3RybmNweSh0d19jb21wYXRfaW5mby0+ZHJpdmVyX3ZlcnNpb24sIFRXX0RSSVZFUl9WRVJTSU9OLCBzdHJsZW4oVFdfRFJJVkVSX1ZFUlNJT04pKTsKLQkJdHdfY29tcGF0X2luZm8tPndvcmtpbmdfc3JsID0gdHdfZGV2LT53b3JraW5nX3NybDsKLQkJdHdfY29tcGF0X2luZm8tPndvcmtpbmdfYnJhbmNoID0gdHdfZGV2LT53b3JraW5nX2JyYW5jaDsKLQkJdHdfY29tcGF0X2luZm8tPndvcmtpbmdfYnVpbGQgPSB0d19kZXYtPndvcmtpbmdfYnVpbGQ7Ci0JCXR3X2NvbXBhdF9pbmZvLT5kcml2ZXJfc3JsX2hpZ2ggPSBUV19DVVJSRU5UX0RSSVZFUl9TUkw7Ci0JCXR3X2NvbXBhdF9pbmZvLT5kcml2ZXJfYnJhbmNoX2hpZ2ggPSBUV19DVVJSRU5UX0RSSVZFUl9CUkFOQ0g7Ci0JCXR3X2NvbXBhdF9pbmZvLT5kcml2ZXJfYnVpbGRfaGlnaCA9IFRXX0NVUlJFTlRfRFJJVkVSX0JVSUxEOwotCQl0d19jb21wYXRfaW5mby0+ZHJpdmVyX3NybF9sb3cgPSBUV19CQVNFX0ZXX1NSTDsKLQkJdHdfY29tcGF0X2luZm8tPmRyaXZlcl9icmFuY2hfbG93ID0gVFdfQkFTRV9GV19CUkFOQ0g7Ci0JCXR3X2NvbXBhdF9pbmZvLT5kcml2ZXJfYnVpbGRfbG93ID0gVFdfQkFTRV9GV19CVUlMRDsKKwkJbWVtY3B5KHR3X2NvbXBhdF9pbmZvLCAmdHdfZGV2LT50d19jb21wYXRfaW5mbywgc2l6ZW9mKFRXX0NvbXBhdGliaWxpdHlfSW5mbykpOwogCQlicmVhazsKIAljYXNlIFRXX0lPQ1RMX0dFVF9MQVNUX0VWRU5UOgogCQlpZiAodHdfZGV2LT5ldmVudF9xdWV1ZV93cmFwcGVkKSB7CkBAIC04OTUsNyArODkwLDggQEAKIAl9CiAKIAlpZiAoc3RhdHVzX3JlZ192YWx1ZSAmIFRXX1NUQVRVU19RVUVVRV9FUlJPUikgewotCQlUV19QUklOVEsodHdfZGV2LT5ob3N0LCBUV19EUklWRVIsIDB4ZSwgIkNvbnRyb2xsZXIgUXVldWUgRXJyb3I6IGNsZWFyaW5nIik7CisJCWlmICgodHdfZGV2LT50d19wY2lfZGV2LT5kZXZpY2UgIT0gUENJX0RFVklDRV9JRF8zV0FSRV85NjUwU0UpIHx8ICghdGVzdF9iaXQoVFdfSU5fUkVTRVQsICZ0d19kZXYtPmZsYWdzKSkpCisJCQlUV19QUklOVEsodHdfZGV2LT5ob3N0LCBUV19EUklWRVIsIDB4ZSwgIkNvbnRyb2xsZXIgUXVldWUgRXJyb3I6IGNsZWFyaW5nIik7CiAJCXdyaXRlbChUV19DT05UUk9MX0NMRUFSX1FVRVVFX0VSUk9SLCBUV19DT05UUk9MX1JFR19BRERSKHR3X2RldikpOwogCX0KIApAQCAtOTM5LDEwICs5MzUsMTIgQEAKIAl1bnNpZ25lZCBsb25nIGJlZm9yZTsKIAlpbnQgcmV0dmFsID0gMTsKIAotCWlmICh0d19kZXYtPnR3X3BjaV9kZXYtPmRldmljZSA9PSBQQ0lfREVWSUNFX0lEXzNXQVJFXzk1NTBTWCkgeworCWlmICgodHdfZGV2LT50d19wY2lfZGV2LT5kZXZpY2UgPT0gUENJX0RFVklDRV9JRF8zV0FSRV85NTUwU1gpIHx8CisJICAgICh0d19kZXYtPnR3X3BjaV9kZXYtPmRldmljZSA9PSBQQ0lfREVWSUNFX0lEXzNXQVJFXzk2NTBTRSkpIHsKIAkJYmVmb3JlID0gamlmZmllczsKIAkJd2hpbGUgKChyZXNwb25zZV9xdWVfdmFsdWUgJiBUV185NTUwU1hfRFJBSU5fQ09NUExFVEVEKSAhPSBUV185NTUwU1hfRFJBSU5fQ09NUExFVEVEKSB7CiAJCQlyZXNwb25zZV9xdWVfdmFsdWUgPSByZWFkbChUV19SRVNQT05TRV9RVUVVRV9SRUdfQUREUl9MQVJHRSh0d19kZXYpKTsKKwkJCW1zbGVlcCgxKTsKIAkJCWlmICh0aW1lX2FmdGVyKGppZmZpZXMsIGJlZm9yZSArIEhaICogMzApKQogCQkJCWdvdG8gb3V0OwogCQl9CkBAIC0xMjE0LDYgKzEyMTIsMTAgQEAKIAogCWhhbmRsZWQgPSAxOwogCisJLyogSWYgd2UgYXJlIHJlc2V0dGluZywgYmFpbCAqLworCWlmICh0ZXN0X2JpdChUV19JTl9SRVNFVCwgJnR3X2Rldi0+ZmxhZ3MpKQorCQlnb3RvIHR3YV9pbnRlcnJ1cHRfYmFpbDsKKwogCS8qIENoZWNrIGNvbnRyb2xsZXIgZm9yIGVycm9ycyAqLwogCWlmICh0d2FfY2hlY2tfYml0cyhzdGF0dXNfcmVnX3ZhbHVlKSkgewogCQlpZiAodHdhX2RlY29kZV9iaXRzKHR3X2Rldiwgc3RhdHVzX3JlZ192YWx1ZSkpIHsKQEAgLTEzNTUsOCArMTM1Nyw4IEBACiAKIAlpZiAoVFdfT1BfT1VUKGZ1bGxfY29tbWFuZF9wYWNrZXQtPmNvbW1hbmQubmV3Y29tbWFuZC5vcGNvZGVfX3Jlc2VydmVkKSA9PSBUV19PUF9FWEVDVVRFX1NDU0kpIHsKIAkJbmV3Y29tbWFuZCA9ICZmdWxsX2NvbW1hbmRfcGFja2V0LT5jb21tYW5kLm5ld2NvbW1hbmQ7Ci0JCW5ld2NvbW1hbmQtPnJlcXVlc3RfaWRfX2x1bmwgPSAKLQkJCVRXX1JFUV9MVU5fSU4oVFdfTFVOX09VVChuZXdjb21tYW5kLT5yZXF1ZXN0X2lkX19sdW5sKSwgcmVxdWVzdF9pZCk7CisJCW5ld2NvbW1hbmQtPnJlcXVlc3RfaWRfX2x1bmwgPQorCQkJY3B1X3RvX2xlMTYoVFdfUkVRX0xVTl9JTihUV19MVU5fT1VUKG5ld2NvbW1hbmQtPnJlcXVlc3RfaWRfX2x1bmwpLCByZXF1ZXN0X2lkKSk7CiAJCW5ld2NvbW1hbmQtPnNnX2xpc3RbMF0uYWRkcmVzcyA9IFRXX0NQVV9UT19TR0woZG1hX2hhbmRsZSArIHNpemVvZihUV19Jb2N0bF9CdWZfQXBhY2hlKSAtIDEpOwogCQluZXdjb21tYW5kLT5zZ19saXN0WzBdLmxlbmd0aCA9IGNwdV90b19sZTMyKGxlbmd0aCk7CiAJCW5ld2NvbW1hbmQtPnNnbF9lbnRyaWVzX19sdW5oID0KQEAgLTE1MzEsNiArMTUzMywxMyBAQAogCWludCByZXR2YWwgPSAxOwogCiAJY29tbWFuZF9xdWVfdmFsdWUgPSB0d19kZXYtPmNvbW1hbmRfcGFja2V0X3BoeXNbcmVxdWVzdF9pZF07CisKKwkvKiBGb3IgOTY1MFNFIHdyaXRlIGxvdyA0IGJ5dGVzIGZpcnN0ICovCisJaWYgKHR3X2Rldi0+dHdfcGNpX2Rldi0+ZGV2aWNlID09IFBDSV9ERVZJQ0VfSURfM1dBUkVfOTY1MFNFKSB7CisJCWNvbW1hbmRfcXVlX3ZhbHVlICs9IFRXX0NPTU1BTkRfT0ZGU0VUOworCQl3cml0ZWwoKHUzMiljb21tYW5kX3F1ZV92YWx1ZSwgVFdfQ09NTUFORF9RVUVVRV9SRUdfQUREUl9MQVJHRSh0d19kZXYpKTsKKwl9CisKIAlzdGF0dXNfcmVnX3ZhbHVlID0gcmVhZGwoVFdfU1RBVFVTX1JFR19BRERSKHR3X2RldikpOwogCiAJaWYgKHR3YV9jaGVja19iaXRzKHN0YXR1c19yZWdfdmFsdWUpKQpAQCAtMTU1NywxMyArMTU2NiwxNyBAQAogCQlUV19VTk1BU0tfQ09NTUFORF9JTlRFUlJVUFQodHdfZGV2KTsKIAkJZ290byBvdXQ7CiAJfSBlbHNlIHsKLQkJLyogV2Ugc3VjY2Vzc2Z1bGx5IHBvc3RlZCB0aGUgY29tbWFuZCBwYWNrZXQgKi8KLQkJaWYgKHNpemVvZihkbWFfYWRkcl90KSA+IDQpIHsKLQkJCWNvbW1hbmRfcXVlX3ZhbHVlICs9IFRXX0NPTU1BTkRfT0ZGU0VUOwotCQkJd3JpdGVsKCh1MzIpY29tbWFuZF9xdWVfdmFsdWUsIFRXX0NPTU1BTkRfUVVFVUVfUkVHX0FERFIodHdfZGV2KSk7Ci0JCQl3cml0ZWwoKHUzMikoKHU2NCljb21tYW5kX3F1ZV92YWx1ZSA+PiAzMiksIFRXX0NPTU1BTkRfUVVFVUVfUkVHX0FERFIodHdfZGV2KSArIDB4NCk7CisJCWlmICh0d19kZXYtPnR3X3BjaV9kZXYtPmRldmljZSA9PSBQQ0lfREVWSUNFX0lEXzNXQVJFXzk2NTBTRSkgeworCQkJLyogTm93IHdyaXRlIHVwcGVyIDQgYnl0ZXMgKi8KKwkJCXdyaXRlbCgodTMyKSgodTY0KWNvbW1hbmRfcXVlX3ZhbHVlID4+IDMyKSwgVFdfQ09NTUFORF9RVUVVRV9SRUdfQUREUl9MQVJHRSh0d19kZXYpICsgMHg0KTsKIAkJfSBlbHNlIHsKLQkJCXdyaXRlbChUV19DT01NQU5EX09GRlNFVCArIGNvbW1hbmRfcXVlX3ZhbHVlLCBUV19DT01NQU5EX1FVRVVFX1JFR19BRERSKHR3X2RldikpOworCQkJaWYgKHNpemVvZihkbWFfYWRkcl90KSA+IDQpIHsKKwkJCQljb21tYW5kX3F1ZV92YWx1ZSArPSBUV19DT01NQU5EX09GRlNFVDsKKwkJCQl3cml0ZWwoKHUzMiljb21tYW5kX3F1ZV92YWx1ZSwgVFdfQ09NTUFORF9RVUVVRV9SRUdfQUREUih0d19kZXYpKTsKKwkJCQl3cml0ZWwoKHUzMikoKHU2NCljb21tYW5kX3F1ZV92YWx1ZSA+PiAzMiksIFRXX0NPTU1BTkRfUVVFVUVfUkVHX0FERFIodHdfZGV2KSArIDB4NCk7CisJCQl9IGVsc2UgeworCQkJCXdyaXRlbChUV19DT01NQU5EX09GRlNFVCArIGNvbW1hbmRfcXVlX3ZhbHVlLCBUV19DT01NQU5EX1FVRVVFX1JFR19BRERSKHR3X2RldikpOworCQkJfQogCQl9CiAJCXR3X2Rldi0+c3RhdGVbcmVxdWVzdF9pZF0gPSBUV19TX1BPU1RFRDsKIAkJdHdfZGV2LT5wb3N0ZWRfcmVxdWVzdF9jb3VudCsrOwpAQCAtMTYyMCwxNCArMTYzMyw5IEBACiAJCWdvdG8gb3V0OwogCiAJVFdfRU5BQkxFX0FORF9DTEVBUl9JTlRFUlJVUFRTKHR3X2Rldik7CisJY2xlYXJfYml0KFRXX0lOX1JFU0VULCAmdHdfZGV2LT5mbGFncyk7CisJdHdfZGV2LT5jaHJkZXZfcmVxdWVzdF9pZCA9IFRXX0lPQ1RMX0NIUkRFVl9GUkVFOwogCi0JLyogV2FrZSB1cCBhbnkgaW9jdGwgdGhhdCB3YXMgcGVuZGluZyBiZWZvcmUgdGhlIHJlc2V0ICovCi0JaWYgKCh0d19kZXYtPmNocmRldl9yZXF1ZXN0X2lkID09IFRXX0lPQ1RMX0NIUkRFVl9GUkVFKSB8fCAoaW9jdGxfcmVzZXQpKSB7Ci0JCWNsZWFyX2JpdChUV19JTl9SRVNFVCwgJnR3X2Rldi0+ZmxhZ3MpOwotCX0gZWxzZSB7Ci0JCXR3X2Rldi0+Y2hyZGV2X3JlcXVlc3RfaWQgPSBUV19JT0NUTF9DSFJERVZfRlJFRTsKLQkJd2FrZV91cCgmdHdfZGV2LT5pb2N0bF93cXVldWUpOwotCX0KIAlyZXR2YWwgPSAwOwogb3V0OgogCXJldHVybiByZXR2YWw7CkBAIC0xNzM2LDYgKzE3NDQsOSBAQAogCQkiV0FSTklORzogKDB4JTAyWDoweCUwNFgpOiBDb21tYW5kICgweCV4KSB0aW1lZCBvdXQsIHJlc2V0dGluZyBjYXJkLlxuIiwKIAkJVFdfRFJJVkVSLCAweDJjLCBTQ3BudC0+Y21uZFswXSk7CiAKKwkvKiBNYWtlIHN1cmUgd2UgYXJlIG5vdCBpc3N1aW5nIGFuIGlvY3RsIG9yIHJlc2V0dGluZyBmcm9tIGlvY3RsICovCisJbXV0ZXhfbG9jaygmdHdfZGV2LT5pb2N0bF9sb2NrKTsKKwogCS8qIE5vdyByZXNldCB0aGUgY2FyZCBhbmQgc29tZSBvZiB0aGUgZGV2aWNlIGV4dGVuc2lvbiBkYXRhICovCiAJaWYgKHR3YV9yZXNldF9kZXZpY2VfZXh0ZW5zaW9uKHR3X2RldiwgMCkpIHsKIAkJVFdfUFJJTlRLKHR3X2Rldi0+aG9zdCwgVFdfRFJJVkVSLCAweDJiLCAiQ29udHJvbGxlciByZXNldCBmYWlsZWQgZHVyaW5nIHNjc2kgaG9zdCByZXNldCIpOwpAQCAtMTc0NCw2ICsxNzU1LDcgQEAKIAogCXJldHZhbCA9IFNVQ0NFU1M7CiBvdXQ6CisJbXV0ZXhfdW5sb2NrKCZ0d19kZXYtPmlvY3RsX2xvY2spOwogCXJldHVybiByZXR2YWw7CiB9IC8qIEVuZCB0d2Ffc2NzaV9laF9yZXNldCgpICovCiAKQEAgLTE3NTMsOCArMTc2NSwxNCBAQAogCWludCByZXF1ZXN0X2lkLCByZXR2YWw7CiAJVFdfRGV2aWNlX0V4dGVuc2lvbiAqdHdfZGV2ID0gKFRXX0RldmljZV9FeHRlbnNpb24gKilTQ3BudC0+ZGV2aWNlLT5ob3N0LT5ob3N0ZGF0YTsKIAorCS8qIElmIHdlIGFyZSByZXNldHRpbmcgZHVlIHRvIHRpbWVkIG91dCBpb2N0bCwgcmVwb3J0IGFzIGJ1c3kgKi8KKwlpZiAodGVzdF9iaXQoVFdfSU5fUkVTRVQsICZ0d19kZXYtPmZsYWdzKSkgeworCQlyZXR2YWwgPSBTQ1NJX01MUVVFVUVfSE9TVF9CVVNZOworCQlnb3RvIG91dDsKKwl9CisKIAkvKiBDaGVjayBpZiB0aGlzIEZXIHN1cHBvcnRzIGx1bnMgKi8KLQlpZiAoKFNDcG50LT5kZXZpY2UtPmx1biAhPSAwKSAmJiAodHdfZGV2LT53b3JraW5nX3NybCA8IFRXX0ZXX1NSTF9MVU5TX1NVUFBPUlRFRCkpIHsKKwlpZiAoKFNDcG50LT5kZXZpY2UtPmx1biAhPSAwKSAmJiAodHdfZGV2LT50d19jb21wYXRfaW5mby53b3JraW5nX3NybCA8IFRXX0ZXX1NSTF9MVU5TX1NVUFBPUlRFRCkpIHsKIAkJU0NwbnQtPnJlc3VsdCA9IChESURfQkFEX1RBUkdFVCA8PCAxNik7CiAJCWRvbmUoU0NwbnQpOwogCQlyZXR2YWwgPSAwOwpAQCAtMTk2MCw2ICsxOTc4LDkgQEAKIAkvKiBEaXNhYmxlIGludGVycnVwdHMgKi8KIAlUV19ESVNBQkxFX0lOVEVSUlVQVFModHdfZGV2KTsKIAorCS8qIEZyZWUgdXAgdGhlIElSUSAqLworCWZyZWVfaXJxKHR3X2Rldi0+dHdfcGNpX2Rldi0+aXJxLCB0d19kZXYpOworCiAJcHJpbnRrKEtFUk5fV0FSTklORyAiM3ctOXh4eDogU2h1dHRpbmcgZG93biBob3N0ICVkLlxuIiwgdHdfZGV2LT5ob3N0LT5ob3N0X25vKTsKIAogCS8qIFRlbGwgdGhlIGNhcmQgd2UgYXJlIHNodXR0aW5nIGRvd24gKi8KQEAgLTIwOTEsMjEgKzIxMTIsMjUgQEAKIAogCS8qIEluaXRpYWxpemUgdGhlIGNhcmQgKi8KIAlpZiAodHdhX3Jlc2V0X3NlcXVlbmNlKHR3X2RldiwgMCkpCi0JCWdvdG8gb3V0X3JlbGVhc2VfbWVtX3JlZ2lvbjsKKwkJZ290byBvdXRfaW91bm1hcDsKIAogCS8qIFNldCBob3N0IHNwZWNpZmljIHBhcmFtZXRlcnMgKi8KLQlob3N0LT5tYXhfaWQgPSBUV19NQVhfVU5JVFM7CisJaWYgKHBkZXYtPmRldmljZSA9PSBQQ0lfREVWSUNFX0lEXzNXQVJFXzk2NTBTRSkKKwkJaG9zdC0+bWF4X2lkID0gVFdfTUFYX1VOSVRTXzk2NTBTRTsKKwllbHNlCisJCWhvc3QtPm1heF9pZCA9IFRXX01BWF9VTklUUzsKKwogCWhvc3QtPm1heF9jbWRfbGVuID0gVFdfTUFYX0NEQl9MRU47CiAKIAkvKiBDaGFubmVscyBhcmVuJ3Qgc3VwcG9ydGVkIGJ5IGFkYXB0ZXIgKi8KLQlob3N0LT5tYXhfbHVuID0gVFdfTUFYX0xVTlModHdfZGV2LT53b3JraW5nX3NybCk7CisJaG9zdC0+bWF4X2x1biA9IFRXX01BWF9MVU5TKHR3X2Rldi0+dHdfY29tcGF0X2luZm8ud29ya2luZ19zcmwpOwogCWhvc3QtPm1heF9jaGFubmVsID0gMDsKIAogCS8qIFJlZ2lzdGVyIHRoZSBjYXJkIHdpdGggdGhlIGtlcm5lbCBTQ1NJIGxheWVyICovCiAJcmV0dmFsID0gc2NzaV9hZGRfaG9zdChob3N0LCAmcGRldi0+ZGV2KTsKIAlpZiAocmV0dmFsKSB7CiAJCVRXX1BSSU5USyh0d19kZXYtPmhvc3QsIFRXX0RSSVZFUiwgMHgyNywgInNjc2kgYWRkIGhvc3QgZmFpbGVkIik7Ci0JCWdvdG8gb3V0X3JlbGVhc2VfbWVtX3JlZ2lvbjsKKwkJZ290byBvdXRfaW91bm1hcDsKIAl9CiAKIAlwY2lfc2V0X2RydmRhdGEocGRldiwgaG9zdCk7CkBAIC0yMTQ1LDYgKzIxNzAsOCBAQAogCiBvdXRfcmVtb3ZlX2hvc3Q6CiAJc2NzaV9yZW1vdmVfaG9zdChob3N0KTsKK291dF9pb3VubWFwOgorCWlvdW5tYXAodHdfZGV2LT5iYXNlX2FkZHIpOwogb3V0X3JlbGVhc2VfbWVtX3JlZ2lvbjoKIAlwY2lfcmVsZWFzZV9yZWdpb25zKHBkZXYpOwogb3V0X2ZyZWVfZGV2aWNlX2V4dGVuc2lvbjoKQEAgLTIxNzAsMTIgKzIxOTcsMTIgQEAKIAkJdHdhX21ham9yID0gLTE7CiAJfQogCi0JLyogRnJlZSB1cCB0aGUgSVJRICovCi0JZnJlZV9pcnEodHdfZGV2LT50d19wY2lfZGV2LT5pcnEsIHR3X2Rldik7Ci0KIAkvKiBTaHV0ZG93biB0aGUgY2FyZCAqLwogCV9fdHdhX3NodXRkb3duKHR3X2Rldik7CiAKKwkvKiBGcmVlIElPIHJlbWFwcGluZyAqLworCWlvdW5tYXAodHdfZGV2LT5iYXNlX2FkZHIpOworCiAJLyogRnJlZSB1cCB0aGUgbWVtIHJlZ2lvbiAqLwogCXBjaV9yZWxlYXNlX3JlZ2lvbnMocGRldik7CiAKQEAgLTIxOTMsNiArMjIyMCw4IEBACiAJICBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAwfSwKIAl7IFBDSV9WRU5ET1JfSURfM1dBUkUsIFBDSV9ERVZJQ0VfSURfM1dBUkVfOTU1MFNYLAogCSAgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMH0sCisJeyBQQ0lfVkVORE9SX0lEXzNXQVJFLCBQQ0lfREVWSUNFX0lEXzNXQVJFXzk2NTBTRSwKKwkgIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDB9LAogCXsgfQogfTsKIE1PRFVMRV9ERVZJQ0VfVEFCTEUocGNpLCB0d2FfcGNpX3RibCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvM3ctOXh4eC5oIGIvZHJpdmVycy9zY3NpLzN3LTl4eHguaAppbmRleCBlNTY4NWJlLi43OTAxNTE3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvM3ctOXh4eC5oCisrKyBiL2RyaXZlcnMvc2NzaS8zdy05eHh4LmgKQEAgLTI4OSw3ICsyODksNiBAQAogI2RlZmluZSBUV19TVEFUVVNfVkFMSURfSU5URVJSVVBUICAgICAgICAgICAgICAweDAwREYwMDAwCiAKIC8qIFBDSSByZWxhdGVkIGRlZmluZXMgKi8KLSNkZWZpbmUgVFdfTlVNREVWSUNFUyAxCiAjZGVmaW5lIFRXX1BDSV9DTEVBUl9QQVJJVFlfRVJST1JTIDB4YzEwMAogI2RlZmluZSBUV19QQ0lfQ0xFQVJfUENJX0FCT1JUICAgICAweDIwMDAKIApAQCAtMzM1LDYgKzMzNCw3IEBACiAjZGVmaW5lIFRXX0FMSUdOTUVOVF85MDAwICAgICAgICAgICAgICAgICAgICAgNCAgLyogNCBieXRlcyAqLwogI2RlZmluZSBUV19BTElHTk1FTlRfOTAwMF9TR0wgICAgICAgICAgICAgICAgIDB4MwogI2RlZmluZSBUV19NQVhfVU5JVFMJCQkgICAgICAxNgorI2RlZmluZSBUV19NQVhfVU5JVFNfOTY1MFNFCQkgICAgICAzMgogI2RlZmluZSBUV19JTklUX01FU1NBR0VfQ1JFRElUUwkJICAgICAgMHgxMDAKICNkZWZpbmUgVFdfSU5JVF9DT01NQU5EX1BBQ0tFVF9TSVpFCSAgICAgIDB4MwogI2RlZmluZSBUV19JTklUX0NPTU1BTkRfUEFDS0VUX1NJWkVfRVhURU5ERUQgIDB4NgpAQCAtMzU0LDcgKzM1NCw2IEBACiAjZGVmaW5lIFRXX01BWF9SRVNQT05TRV9EUkFJTgkJICAgICAgMjU2CiAjZGVmaW5lIFRXX01BWF9BRU5fRFJBSU4JCSAgICAgIDQwCiAjZGVmaW5lIFRXX0lOX1JFU0VUICAgICAgICAgICAgICAgICAgICAgICAgICAgMgotI2RlZmluZSBUV19JTl9DSFJERVZfSU9DVEwgICAgICAgICAgICAgICAgICAgIDMKICNkZWZpbmUgVFdfSU5fQVRURU5USU9OX0xPT1AJCSAgICAgIDQKICNkZWZpbmUgVFdfTUFYX1NFQ1RPUlMgICAgICAgICAgICAgICAgICAgICAgICAyNTYKICNkZWZpbmUgVFdfQUVOX1dBSVRfVElNRSAgICAgICAgICAgICAgICAgICAgICAxMDAwCkBAIC00MTcsNiArNDE2LDkgQEAKICNpZm5kZWYgUENJX0RFVklDRV9JRF8zV0FSRV85NTUwU1gKICNkZWZpbmUgUENJX0RFVklDRV9JRF8zV0FSRV85NTUwU1ggMHgxMDAzCiAjZW5kaWYKKyNpZm5kZWYgUENJX0RFVklDRV9JRF8zV0FSRV85NjUwU0UKKyNkZWZpbmUgUENJX0RFVklDRV9JRF8zV0FSRV85NjUwU0UgMHgxMDA0CisjZW5kaWYKIAogLyogQml0bWFzayBtYWNyb3MgdG8gZWxpbWluYXRlIGJpdGZpZWxkcyAqLwogCkBAIC00NDIsNiArNDQ0LDcgQEAKICNkZWZpbmUgVFdfQ09OVFJPTF9SRUdfQUREUih4KSAoeC0+YmFzZV9hZGRyKQogI2RlZmluZSBUV19TVEFUVVNfUkVHX0FERFIoeCkgKCh1bnNpZ25lZCBjaGFyIF9faW9tZW0gKil4LT5iYXNlX2FkZHIgKyAweDQpCiAjZGVmaW5lIFRXX0NPTU1BTkRfUVVFVUVfUkVHX0FERFIoeCkgKHNpemVvZihkbWFfYWRkcl90KSA+IDQgPyAoKHVuc2lnbmVkIGNoYXIgX19pb21lbSAqKXgtPmJhc2VfYWRkciArIDB4MjApIDogKCh1bnNpZ25lZCBjaGFyIF9faW9tZW0gKil4LT5iYXNlX2FkZHIgKyAweDgpKQorI2RlZmluZSBUV19DT01NQU5EX1FVRVVFX1JFR19BRERSX0xBUkdFKHgpICgodW5zaWduZWQgY2hhciBfX2lvbWVtICopeC0+YmFzZV9hZGRyICsgMHgyMCkKICNkZWZpbmUgVFdfUkVTUE9OU0VfUVVFVUVfUkVHX0FERFIoeCkgKCh1bnNpZ25lZCBjaGFyIF9faW9tZW0gKil4LT5iYXNlX2FkZHIgKyAweEMpCiAjZGVmaW5lIFRXX1JFU1BPTlNFX1FVRVVFX1JFR19BRERSX0xBUkdFKHgpICgodW5zaWduZWQgY2hhciBfX2lvbWVtICopeC0+YmFzZV9hZGRyICsgMHgzMCkKICNkZWZpbmUgVFdfQ0xFQVJfQUxMX0lOVEVSUlVQVFMoeCkgKHdyaXRlbChUV19TVEFUVVNfVkFMSURfSU5URVJSVVBULCBUV19DT05UUk9MX1JFR19BRERSKHgpKSkKQEAgLTYyNiw2ICs2MjksOSBAQAogCXVuc2lnbmVkIHNob3J0IGRyaXZlcl9zcmxfbG93OwogCXVuc2lnbmVkIHNob3J0IGRyaXZlcl9icmFuY2hfbG93OwogCXVuc2lnbmVkIHNob3J0IGRyaXZlcl9idWlsZF9sb3c7CisJdW5zaWduZWQgc2hvcnQgZndfb25fY3Rscl9zcmw7CisJdW5zaWduZWQgc2hvcnQgZndfb25fY3Rscl9icmFuY2g7CisJdW5zaWduZWQgc2hvcnQgZndfb25fY3Rscl9idWlsZDsKIH0gVFdfQ29tcGF0aWJpbGl0eV9JbmZvOwogCiAjcHJhZ21hIHBhY2soKQpAQCAtNjY4LDkgKzY3NCw3IEBACiAJd2FpdF9xdWV1ZV9oZWFkX3QJaW9jdGxfd3F1ZXVlOwogCXN0cnVjdCBtdXRleAkJaW9jdGxfbG9jazsKIAljaGFyCQkJYWVuX2Nsb2JiZXI7Ci0JdW5zaWduZWQgc2hvcnQJCXdvcmtpbmdfc3JsOwotCXVuc2lnbmVkIHNob3J0CQl3b3JraW5nX2JyYW5jaDsKLQl1bnNpZ25lZCBzaG9ydAkJd29ya2luZ19idWlsZDsKKwlUV19Db21wYXRpYmlsaXR5X0luZm8JdHdfY29tcGF0X2luZm87CiB9IFRXX0RldmljZV9FeHRlbnNpb247CiAKICNlbmRpZiAvKiBfM1dfOVhYWF9IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvQnVzTG9naWMuYyBiL2RyaXZlcnMvc2NzaS9CdXNMb2dpYy5jCmluZGV4IDY4OWRjNGMuLjMwNzUyMDQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9CdXNMb2dpYy5jCisrKyBiL2RyaXZlcnMvc2NzaS9CdXNMb2dpYy5jCkBAIC0zNjAwLDUgKzM2MDAsMTYgQEAKIAogX19zZXR1cCgiQnVzTG9naWM9IiwgQnVzTG9naWNfU2V0dXApOwogCitzdGF0aWMgc3RydWN0IHBjaV9kZXZpY2VfaWQgQnVzTG9naWNfcGNpX3RibFtdIF9fZGV2aW5pdGRhdGEgPSB7CisJeyBQQ0lfVkVORE9SX0lEX0JVU0xPR0lDLCBQQ0lfREVWSUNFX0lEX0JVU0xPR0lDX01VTFRJTUFTVEVSLAorCSAgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMH0sCisJeyBQQ0lfVkVORE9SX0lEX0JVU0xPR0lDLCBQQ0lfREVWSUNFX0lEX0JVU0xPR0lDX01VTFRJTUFTVEVSX05DLAorCSAgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMH0sCisJeyBQQ0lfVkVORE9SX0lEX0JVU0xPR0lDLCBQQ0lfREVWSUNFX0lEX0JVU0xPR0lDX0ZMQVNIUE9JTlQsCisJICBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAwfSwKKwl7IH0KK307CitNT0RVTEVfREVWSUNFX1RBQkxFKHBjaSwgQnVzTG9naWNfcGNpX3RibCk7CisKIG1vZHVsZV9pbml0KEJ1c0xvZ2ljX2luaXQpOwogbW9kdWxlX2V4aXQoQnVzTG9naWNfZXhpdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYWhhMTUyeC5jIGIvZHJpdmVycy9zY3NpL2FoYTE1MnguYwppbmRleCBhMGQxY2VlLi4zMDZmNDZiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvYWhhMTUyeC5jCisrKyBiL2RyaXZlcnMvc2NzaS9haGExNTJ4LmMKQEAgLTIzOCw3ICsyMzgsNyBAQAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CiAjaW5jbHVkZSA8YXNtL2lycS5oPgotI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CiAjaW5jbHVkZSA8bGludXgvYmxrZGV2Lmg+CiAjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgogI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYWljN3h4eC9haWM3OXh4LmggYi9kcml2ZXJzL3Njc2kvYWljN3h4eC9haWM3OXh4LmgKaW5kZXggZGYzMzQ2Yi4uMTcwYTQzNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2FpYzd4eHgvYWljNzl4eC5oCisrKyBiL2RyaXZlcnMvc2NzaS9haWM3eHh4L2FpYzc5eHguaApAQCAtNTMsMTQgKzUzLDYgQEAKIHN0cnVjdCBzY2JfcGxhdGZvcm1fZGF0YTsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBVc2VmdWwgTWFjcm9zICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNpZm5kZWYgTUFYCi0jZGVmaW5lIE1BWChhLGIpICgoKGEpID4gKGIpKSA/IChhKSA6IChiKSkKLSNlbmRpZgotCi0jaWZuZGVmIE1JTgotI2RlZmluZSBNSU4oYSxiKSAoKChhKSA8IChiKSkgPyAoYSkgOiAoYikpCi0jZW5kaWYKLQogI2lmbmRlZiBUUlVFCiAjZGVmaW5lIFRSVUUgMQogI2VuZGlmCkBAIC05NzIsOCArOTY0LDYgQEAKIAogaW50CQlhaGRfd3JpdGVfc2VlcHJvbShzdHJ1Y3QgYWhkX3NvZnRjICphaGQsIHVpbnQxNl90ICpidWYsCiAJCQkJICB1X2ludCBzdGFydF9hZGRyLCB1X2ludCBjb3VudCk7Ci1pbnQJCWFoZF93YWl0X3NlZXByb20oc3RydWN0IGFoZF9zb2Z0YyAqYWhkKTsKLWludAkJYWhkX3ZlcmlmeV92cGRfY2tzdW0oc3RydWN0IHZwZF9jb25maWcgKnZwZCk7CiBpbnQJCWFoZF92ZXJpZnlfY2tzdW0oc3RydWN0IHNlZXByb21fY29uZmlnICpzYyk7CiBpbnQJCWFoZF9hY3F1aXJlX3NlZXByb20oc3RydWN0IGFoZF9zb2Z0YyAqYWhkKTsKIHZvaWQJCWFoZF9yZWxlYXNlX3NlZXByb20oc3RydWN0IGFoZF9zb2Z0YyAqYWhkKTsKQEAgLTEzMjAsOCArMTMxMCw2IEBACiAJY2hhcgkJCSpuYW1lOwogCWFoZF9kZXZpY2Vfc2V0dXBfdAkqc2V0dXA7CiB9OwotZXh0ZXJuIHN0cnVjdCBhaGRfcGNpX2lkZW50aXR5IGFoZF9wY2lfaWRlbnRfdGFibGUgW107Ci1leHRlcm4gY29uc3QgdV9pbnQgYWhkX251bV9wY2lfZGV2czsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqIFZML0VJU0EgRGVjbGFyYXRpb25zICoqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHN0cnVjdCBhaWM3NzcwX2lkZW50aXR5IHsKQEAgLTEzMzksMTUgKzEzMjcsNiBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKiBGdW5jdGlvbiBEZWNsYXJhdGlvbnMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiB2b2lkCQkJYWhkX3Jlc2V0X2NtZHNfcGVuZGluZyhzdHJ1Y3QgYWhkX3NvZnRjICphaGQpOwotdV9pbnQJCQlhaGRfZmluZF9idXN5X3RjbChzdHJ1Y3QgYWhkX3NvZnRjICphaGQsIHVfaW50IHRjbCk7Ci12b2lkCQkJYWhkX2J1c3lfdGNsKHN0cnVjdCBhaGRfc29mdGMgKmFoZCwKLQkJCQkgICAgIHVfaW50IHRjbCwgdV9pbnQgYnVzeWlkKTsKLXN0YXRpYyBfX2lubGluZSB2b2lkCWFoZF91bmJ1c3lfdGNsKHN0cnVjdCBhaGRfc29mdGMgKmFoZCwgdV9pbnQgdGNsKTsKLXN0YXRpYyBfX2lubGluZSB2b2lkCi1haGRfdW5idXN5X3RjbChzdHJ1Y3QgYWhkX3NvZnRjICphaGQsIHVfaW50IHRjbCkKLXsKLQlhaGRfYnVzeV90Y2woYWhkLCB0Y2wsIFNDQl9MSVNUX05VTEwpOwotfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogUENJIEZyb250IEVuZCAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBzdHJ1Y3QJYWhkX3BjaV9pZGVudGl0eSAqYWhkX2ZpbmRfcGNpX2RldmljZShhaGRfZGV2X3NvZnRjX3QpOwpAQCAtMTM1Niw3ICsxMzM1LDYgQEAKIGludAlhaGRfcGNpX3Rlc3RfcmVnaXN0ZXJfYWNjZXNzKHN0cnVjdCBhaGRfc29mdGMgKik7CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKiBTQ0IgYW5kIFNDQiBxdWV1ZSBtYW5hZ2VtZW50ICoqKioqKioqKioqKioqKioqKioqKiovCi1pbnQJCWFoZF9wcm9iZV9zY2JzKHN0cnVjdCBhaGRfc29mdGMgKik7CiB2b2lkCQlhaGRfcWluZmlmb19yZXF1ZXVlX3RhaWwoc3RydWN0IGFoZF9zb2Z0YyAqYWhkLAogCQkJCQkgc3RydWN0IHNjYiAqc2NiKTsKIGludAkJYWhkX21hdGNoX3NjYihzdHJ1Y3QgYWhkX3NvZnRjICphaGQsIHN0cnVjdCBzY2IgKnNjYiwKQEAgLTEzNzQsMzMgKzEzNTIsMjAgQEAKIGludAkJCSBhaGRfcGFyc2VfY2ZnZGF0YShzdHJ1Y3QgYWhkX3NvZnRjICphaGQsCiAJCQkJCSAgIHN0cnVjdCBzZWVwcm9tX2NvbmZpZyAqc2MpOwogdm9pZAkJCSBhaGRfaW50cl9lbmFibGUoc3RydWN0IGFoZF9zb2Z0YyAqYWhkLCBpbnQgZW5hYmxlKTsKLXZvaWQJCQkgYWhkX3VwZGF0ZV9jb2FsZXNjaW5nX3ZhbHVlcyhzdHJ1Y3QgYWhkX3NvZnRjICphaGQsCi0JCQkJCQkgICAgICB1X2ludCB0aW1lciwKLQkJCQkJCSAgICAgIHVfaW50IG1heGNtZHMsCi0JCQkJCQkgICAgICB1X2ludCBtaW5jbWRzKTsKLXZvaWQJCQkgYWhkX2VuYWJsZV9jb2FsZXNjaW5nKHN0cnVjdCBhaGRfc29mdGMgKmFoZCwKLQkJCQkJICAgICAgIGludCBlbmFibGUpOwogdm9pZAkJCSBhaGRfcGF1c2VfYW5kX2ZsdXNod29yayhzdHJ1Y3QgYWhkX3NvZnRjICphaGQpOwogaW50CQkJIGFoZF9zdXNwZW5kKHN0cnVjdCBhaGRfc29mdGMgKmFoZCk7IAotaW50CQkJIGFoZF9yZXN1bWUoc3RydWN0IGFoZF9zb2Z0YyAqYWhkKTsKIHZvaWQJCQkgYWhkX3NldF91bml0KHN0cnVjdCBhaGRfc29mdGMgKiwgaW50KTsKIHZvaWQJCQkgYWhkX3NldF9uYW1lKHN0cnVjdCBhaGRfc29mdGMgKiwgY2hhciAqKTsKIHN0cnVjdCBzY2IJCSphaGRfZ2V0X3NjYihzdHJ1Y3QgYWhkX3NvZnRjICphaGQsIHVfaW50IGNvbF9pZHgpOwogdm9pZAkJCSBhaGRfZnJlZV9zY2Ioc3RydWN0IGFoZF9zb2Z0YyAqYWhkLCBzdHJ1Y3Qgc2NiICpzY2IpOwotdm9pZAkJCSBhaGRfYWxsb2Nfc2NicyhzdHJ1Y3QgYWhkX3NvZnRjICphaGQpOwogdm9pZAkJCSBhaGRfZnJlZShzdHJ1Y3QgYWhkX3NvZnRjICphaGQpOwogaW50CQkJIGFoZF9yZXNldChzdHJ1Y3QgYWhkX3NvZnRjICphaGQsIGludCByZWluaXQpOwotdm9pZAkJCSBhaGRfc2h1dGRvd24odm9pZCAqYXJnKTsKIGludAkJCSBhaGRfd3JpdGVfZmxleHBvcnQoc3RydWN0IGFoZF9zb2Z0YyAqYWhkLAogCQkJCQkgICAgdV9pbnQgYWRkciwgdV9pbnQgdmFsdWUpOwogaW50CQkJIGFoZF9yZWFkX2ZsZXhwb3J0KHN0cnVjdCBhaGRfc29mdGMgKmFoZCwgdV9pbnQgYWRkciwKIAkJCQkJICAgdWludDhfdCAqdmFsdWUpOwotaW50CQkJIGFoZF93YWl0X2ZsZXhwb3J0KHN0cnVjdCBhaGRfc29mdGMgKmFoZCk7CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKiogSW50ZXJydXB0IFNlcnZpY2VzICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkCQkJYWhkX3BjaV9pbnRyKHN0cnVjdCBhaGRfc29mdGMgKmFoZCk7Ci12b2lkCQkJYWhkX2NsZWFyX2ludHN0YXQoc3RydWN0IGFoZF9zb2Z0YyAqYWhkKTsKLXZvaWQJCQlhaGRfZmx1c2hfcW91dGZpZm8oc3RydWN0IGFoZF9zb2Z0YyAqYWhkKTsKIHZvaWQJCQlhaGRfcnVuX3FvdXRmaWZvKHN0cnVjdCBhaGRfc29mdGMgKmFoZCk7CiAjaWZkZWYgQUhEX1RBUkdFVF9NT0RFCiB2b2lkCQkJYWhkX3J1bl90cWluZmlmbyhzdHJ1Y3QgYWhkX3NvZnRjICphaGQsIGludCBwYXVzZWQpOwpAQCAtMTQwOSw3ICsxMzc0LDYgQEAKIHZvaWQJCQlhaGRfaGFuZGxlX3NlcWludChzdHJ1Y3QgYWhkX3NvZnRjICphaGQsIHVfaW50IGludHN0YXQpOwogdm9pZAkJCWFoZF9oYW5kbGVfc2NzaWludChzdHJ1Y3QgYWhkX3NvZnRjICphaGQsCiAJCQkJCSAgIHVfaW50IGludHN0YXQpOwotdm9pZAkJCWFoZF9jbGVhcl9jcml0aWNhbF9zZWN0aW9uKHN0cnVjdCBhaGRfc29mdGMgKmFoZCk7CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBFcnJvciBSZWNvdmVyeSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiB0eXBlZGVmIGVudW0gewpAQCAtMTQyNiwyMyArMTM5MCw5IEBACiAJCQkJCSAgICAgY2hhciBjaGFubmVsLCBpbnQgbHVuLCB1X2ludCB0YWcsCiAJCQkJCSAgICAgaW50IHN0b3Bfb25fZmlyc3QsIGludCByZW1vdmUsCiAJCQkJCSAgICAgaW50IHNhdmVfc3RhdGUpOwotdm9pZAkJCWFoZF9mcmVlemVfZGV2cShzdHJ1Y3QgYWhkX3NvZnRjICphaGQsIHN0cnVjdCBzY2IgKnNjYik7CiBpbnQJCQlhaGRfcmVzZXRfY2hhbm5lbChzdHJ1Y3QgYWhkX3NvZnRjICphaGQsIGNoYXIgY2hhbm5lbCwKIAkJCQkJICBpbnQgaW5pdGlhdGVfcmVzZXQpOwotaW50CQkJYWhkX2Fib3J0X3NjYnMoc3RydWN0IGFoZF9zb2Z0YyAqYWhkLCBpbnQgdGFyZ2V0LAotCQkJCSAgICAgICBjaGFyIGNoYW5uZWwsIGludCBsdW4sIHVfaW50IHRhZywKLQkJCQkgICAgICAgcm9sZV90IHJvbGUsIHVpbnQzMl90IHN0YXR1cyk7Ci12b2lkCQkJYWhkX3Jlc3RhcnQoc3RydWN0IGFoZF9zb2Z0YyAqYWhkKTsKLXZvaWQJCQlhaGRfY2xlYXJfZmlmbyhzdHJ1Y3QgYWhkX3NvZnRjICphaGQsIHVfaW50IGZpZm8pOwotdm9pZAkJCWFoZF9oYW5kbGVfc2NiX3N0YXR1cyhzdHJ1Y3QgYWhkX3NvZnRjICphaGQsCi0JCQkJCSAgICAgIHN0cnVjdCBzY2IgKnNjYik7Ci12b2lkCQkJYWhkX2hhbmRsZV9zY3NpX3N0YXR1cyhzdHJ1Y3QgYWhkX3NvZnRjICphaGQsCi0JCQkJCSAgICAgICBzdHJ1Y3Qgc2NiICpzY2IpOwotdm9pZAkJCWFoZF9jYWxjX3Jlc2lkdWFsKHN0cnVjdCBhaGRfc29mdGMgKmFoZCwKLQkJCQkJICBzdHJ1Y3Qgc2NiICpzY2IpOwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKiBVdGlsaXR5IEZ1bmN0aW9ucyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0cnVjdCBhaGRfcGhhc2VfdGFibGVfZW50cnkqCi0JCQlhaGRfbG9va3VwX3BoYXNlX2VudHJ5KGludCBwaGFzZSk7CiB2b2lkCQkJYWhkX2NvbXBpbGVfZGV2aW5mbyhzdHJ1Y3QgYWhkX2RldmluZm8gKmRldmluZm8sCiAJCQkJCSAgICB1X2ludCBvdXJfaWQsIHVfaW50IHRhcmdldCwKIAkJCQkJICAgIHVfaW50IGx1biwgY2hhciBjaGFubmVsLApAQCAtMTQ1MCwxNCArMTQwMCw2IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKiogVHJhbnNmZXIgTmVnb3RpYXRpb24gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogdm9pZAkJCWFoZF9maW5kX3N5bmNyYXRlKHN0cnVjdCBhaGRfc29mdGMgKmFoZCwgdV9pbnQgKnBlcmlvZCwKIAkJCQkJICB1X2ludCAqcHByX29wdGlvbnMsIHVfaW50IG1heHN5bmMpOwotdm9pZAkJCWFoZF92YWxpZGF0ZV9vZmZzZXQoc3RydWN0IGFoZF9zb2Z0YyAqYWhkLAotCQkJCQkgICAgc3RydWN0IGFoZF9pbml0aWF0b3JfdGluZm8gKnRpbmZvLAotCQkJCQkgICAgdV9pbnQgcGVyaW9kLCB1X2ludCAqb2Zmc2V0LAotCQkJCQkgICAgaW50IHdpZGUsIHJvbGVfdCByb2xlKTsKLXZvaWQJCQlhaGRfdmFsaWRhdGVfd2lkdGgoc3RydWN0IGFoZF9zb2Z0YyAqYWhkLAotCQkJCQkgICBzdHJ1Y3QgYWhkX2luaXRpYXRvcl90aW5mbyAqdGluZm8sCi0JCQkJCSAgIHVfaW50ICpidXNfd2lkdGgsCi0JCQkJCSAgIHJvbGVfdCByb2xlKTsKIC8qCiAgKiBOZWdvdGlhdGlvbiB0eXBlcy4gIFRoZXNlIGFyZSB1c2VkIHRvIHF1YWxpZnkgaWYgd2Ugc2hvdWxkIHJlbmVnb3RpYXRlCiAgKiBldmVuIGlmIG91ciBnb2FsIGFuZCBjdXJyZW50IHRyYW5zcG9ydCBwYXJhbWV0ZXJzIGFyZSBpZGVudGljYWwuCkBAIC0xNDg2LDExICsxNDI4LDYgQEAKIAlBSERfUVVFVUVfVEFHR0VECiB9IGFoZF9xdWV1ZV9hbGc7CiAKLXZvaWQJCQlhaGRfc2V0X3RhZ3Moc3RydWN0IGFoZF9zb2Z0YyAqYWhkLAotCQkJCSAgICAgc3RydWN0IHNjc2lfY21uZCAqY21kLAotCQkJCSAgICAgc3RydWN0IGFoZF9kZXZpbmZvICpkZXZpbmZvLAotCQkJCSAgICAgYWhkX3F1ZXVlX2FsZyBhbGcpOwotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBUYXJnZXQgTW9kZSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogI2lmZGVmIEFIRF9UQVJHRVRfTU9ERQogdm9pZAkJYWhkX3NlbmRfbHN0YXRlX2V2ZW50cyhzdHJ1Y3QgYWhkX3NvZnRjICosCkBAIC0xNTI4LDEwICsxNDY1LDggQEAKICNkZWZpbmUgQUhEX1NIT1dfSU5UX0NPQUxFU0NJTkcJMHgxMDAwMAogI2RlZmluZSBBSERfREVCVUdfU0VRVUVOQ0VSCTB4MjAwMDAKICNlbmRpZgotdm9pZAkJCWFoZF9wcmludF9zY2Ioc3RydWN0IHNjYiAqc2NiKTsKIHZvaWQJCQlhaGRfcHJpbnRfZGV2aW5mbyhzdHJ1Y3QgYWhkX3NvZnRjICphaGQsCiAJCQkJCSAgc3RydWN0IGFoZF9kZXZpbmZvICpkZXZpbmZvKTsKLXZvaWQJCQlhaGRfZHVtcF9zZ2xpc3Qoc3RydWN0IHNjYiAqc2NiKTsKIHZvaWQJCQlhaGRfZHVtcF9jYXJkX3N0YXRlKHN0cnVjdCBhaGRfc29mdGMgKmFoZCk7CiBpbnQJCQlhaGRfcHJpbnRfcmVnaXN0ZXIoYWhkX3JlZ19wYXJzZV9lbnRyeV90ICp0YWJsZSwKIAkJCQkJICAgdV9pbnQgbnVtX2VudHJpZXMsCkBAIC0xNTQwLDUgKzE0NzUsNCBAQAogCQkJCQkgICB1X2ludCB2YWx1ZSwKIAkJCQkJICAgdV9pbnQgKmN1cl9jb2x1bW4sCiAJCQkJCSAgIHVfaW50IHdyYXBfcG9pbnQpOwotdm9pZAkJCWFoZF9kdW1wX3NjYnMoc3RydWN0IGFoZF9zb2Z0YyAqYWhkKTsKICNlbmRpZiAvKiBfQUlDNzlYWF9IXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2FpYzd4eHgvYWljNzl4eF9jb3JlLmMgYi9kcml2ZXJzL3Njc2kvYWljN3h4eC9haWM3OXh4X2NvcmUuYwppbmRleCA2NTM4MThkLi4wN2E4NmEzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvYWljN3h4eC9haWM3OXh4X2NvcmUuYworKysgYi9kcml2ZXJzL3Njc2kvYWljN3h4eC9haWM3OXh4X2NvcmUuYwpAQCAtNTIsNyArNTIsNyBAQAogCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBMb29rdXAgVGFibGVzICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1jaGFyICphaGRfY2hpcF9uYW1lc1tdID0KK3N0YXRpYyBjaGFyICphaGRfY2hpcF9uYW1lc1tdID0KIHsKIAkiTk9ORSIsCiAJImFpYzc5MDEiLApAQCAtMjM3LDEwICsyMzcsMzMgQEAKIAkJCQkJICAgICAgc3RydWN0IHRhcmdldF9jbWQgKmNtZCk7CiAjZW5kaWYKIAorc3RhdGljIGludAkJYWhkX2Fib3J0X3NjYnMoc3RydWN0IGFoZF9zb2Z0YyAqYWhkLCBpbnQgdGFyZ2V0LAorCQkJCSAgICAgICBjaGFyIGNoYW5uZWwsIGludCBsdW4sIHVfaW50IHRhZywKKwkJCQkgICAgICAgcm9sZV90IHJvbGUsIHVpbnQzMl90IHN0YXR1cyk7CitzdGF0aWMgdm9pZAkJYWhkX2FsbG9jX3NjYnMoc3RydWN0IGFoZF9zb2Z0YyAqYWhkKTsKK3N0YXRpYyB2b2lkCQlhaGRfYnVzeV90Y2woc3RydWN0IGFoZF9zb2Z0YyAqYWhkLCB1X2ludCB0Y2wsCisJCQkJICAgICB1X2ludCBzY2JpZCk7CitzdGF0aWMgdm9pZAkJYWhkX2NhbGNfcmVzaWR1YWwoc3RydWN0IGFoZF9zb2Z0YyAqYWhkLAorCQkJCQkgIHN0cnVjdCBzY2IgKnNjYik7CitzdGF0aWMgdm9pZAkJYWhkX2NsZWFyX2NyaXRpY2FsX3NlY3Rpb24oc3RydWN0IGFoZF9zb2Z0YyAqYWhkKTsKK3N0YXRpYyB2b2lkCQlhaGRfY2xlYXJfaW50c3RhdChzdHJ1Y3QgYWhkX3NvZnRjICphaGQpOworc3RhdGljIHZvaWQJCWFoZF9lbmFibGVfY29hbGVzY2luZyhzdHJ1Y3QgYWhkX3NvZnRjICphaGQsCisJCQkJCSAgICAgIGludCBlbmFibGUpOworc3RhdGljIHVfaW50CQlhaGRfZmluZF9idXN5X3RjbChzdHJ1Y3QgYWhkX3NvZnRjICphaGQsIHVfaW50IHRjbCk7CitzdGF0aWMgdm9pZAkJYWhkX2ZyZWV6ZV9kZXZxKHN0cnVjdCBhaGRfc29mdGMgKmFoZCwKKwkJCQkJc3RydWN0IHNjYiAqc2NiKTsKK3N0YXRpYyB2b2lkCQlhaGRfaGFuZGxlX3NjYl9zdGF0dXMoc3RydWN0IGFoZF9zb2Z0YyAqYWhkLAorCQkJCQkgICAgICBzdHJ1Y3Qgc2NiICpzY2IpOworc3RhdGljIHN0cnVjdCBhaGRfcGhhc2VfdGFibGVfZW50cnkqIGFoZF9sb29rdXBfcGhhc2VfZW50cnkoaW50IHBoYXNlKTsKK3N0YXRpYyB2b2lkCQlhaGRfc2h1dGRvd24odm9pZCAqYXJnKTsKK3N0YXRpYyB2b2lkCQlhaGRfdXBkYXRlX2NvYWxlc2NpbmdfdmFsdWVzKHN0cnVjdCBhaGRfc29mdGMgKmFoZCwKKwkJCQkJCSAgICAgdV9pbnQgdGltZXIsCisJCQkJCQkgICAgIHVfaW50IG1heGNtZHMsCisJCQkJCQkgICAgIHVfaW50IG1pbmNtZHMpOworc3RhdGljIGludAkJYWhkX3ZlcmlmeV92cGRfY2tzdW0oc3RydWN0IHZwZF9jb25maWcgKnZwZCk7CitzdGF0aWMgaW50CQlhaGRfd2FpdF9zZWVwcm9tKHN0cnVjdCBhaGRfc29mdGMgKmFoZCk7CisKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBQcml2YXRlIElubGluZXMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgX19pbmxpbmUgdm9pZAlhaGRfYXNzZXJ0X2F0bihzdHJ1Y3QgYWhkX3NvZnRjICphaGQpOwotc3RhdGljIF9faW5saW5lIGludAlhaGRfY3VycmVudGx5X3BhY2tldGl6ZWQoc3RydWN0IGFoZF9zb2Z0YyAqYWhkKTsKLXN0YXRpYyBfX2lubGluZSBpbnQJYWhkX3NldF9hY3RpdmVfZmlmbyhzdHJ1Y3QgYWhkX3NvZnRjICphaGQpOwogCiBzdGF0aWMgX19pbmxpbmUgdm9pZAogYWhkX2Fzc2VydF9hdG4oc3RydWN0IGFoZF9zb2Z0YyAqYWhkKQpAQCAtMjk0LDExICszMTcsNDQgQEAKIAl9CiB9CiAKK3N0YXRpYyBfX2lubGluZSB2b2lkCithaGRfdW5idXN5X3RjbChzdHJ1Y3QgYWhkX3NvZnRjICphaGQsIHVfaW50IHRjbCkKK3sKKwlhaGRfYnVzeV90Y2woYWhkLCB0Y2wsIFNDQl9MSVNUX05VTEwpOworfQorCisvKgorICogRGV0ZXJtaW5lIHdoZXRoZXIgdGhlIHNlcXVlbmNlciByZXBvcnRlZCBhIHJlc2lkdWFsCisgKiBmb3IgdGhpcyBTQ0IvdHJhbnNhY3Rpb24uCisgKi8KK3N0YXRpYyBfX2lubGluZSB2b2lkCithaGRfdXBkYXRlX3Jlc2lkdWFsKHN0cnVjdCBhaGRfc29mdGMgKmFoZCwgc3RydWN0IHNjYiAqc2NiKQoreworCXVpbnQzMl90IHNncHRyOworCisJc2dwdHIgPSBhaGRfbGUzMnRvaChzY2ItPmhzY2ItPnNncHRyKTsKKwlpZiAoKHNncHRyICYgU0dfU1RBVFVTX1ZBTElEKSAhPSAwKQorCQlhaGRfY2FsY19yZXNpZHVhbChhaGQsIHNjYik7Cit9CisKK3N0YXRpYyBfX2lubGluZSB2b2lkCithaGRfY29tcGxldGVfc2NiKHN0cnVjdCBhaGRfc29mdGMgKmFoZCwgc3RydWN0IHNjYiAqc2NiKQoreworCXVpbnQzMl90IHNncHRyOworCisJc2dwdHIgPSBhaGRfbGUzMnRvaChzY2ItPmhzY2ItPnNncHRyKTsKKwlpZiAoKHNncHRyICYgU0dfU1RBVFVTX1ZBTElEKSAhPSAwKQorCQlhaGRfaGFuZGxlX3NjYl9zdGF0dXMoYWhkLCBzY2IpOworCWVsc2UKKwkJYWhkX2RvbmUoYWhkLCBzY2IpOworfQorCisKIC8qKioqKioqKioqKioqKioqKioqKioqKioqIFNlcXVlbmNlciBFeGVjdXRpb24gQ29udHJvbCAqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKgogICogUmVzdGFydCB0aGUgc2VxdWVuY2VyIHByb2dyYW0gZnJvbSBhZGRyZXNzIHplcm8KICAqLwotdm9pZAorc3RhdGljIHZvaWQKIGFoZF9yZXN0YXJ0KHN0cnVjdCBhaGRfc29mdGMgKmFoZCkKIHsKIApAQCAtMzQyLDcgKzM5OCw3IEBACiAJYWhkX3VucGF1c2UoYWhkKTsKIH0KIAotdm9pZAorc3RhdGljIHZvaWQKIGFoZF9jbGVhcl9maWZvKHN0cnVjdCBhaGRfc29mdGMgKmFoZCwgdV9pbnQgZmlmbykKIHsKIAlhaGRfbW9kZV9zdGF0ZQkgc2F2ZWRfbW9kZXM7CkBAIC0zNjYsNyArNDIyLDcgQEAKICAqIEZsdXNoIGFuZCBjb21wbGV0ZWQgY29tbWFuZHMgdGhhdCBhcmUgc2l0dGluZyBpbiB0aGUgY29tbWFuZAogICogY29tcGxldGUgcXVldWVzIGRvd24gb24gdGhlIGNoaXAgYnV0IGhhdmUgeWV0IHRvIGJlIGRtYSdlZCBiYWNrIHVwLgogICovCi12b2lkCitzdGF0aWMgdm9pZAogYWhkX2ZsdXNoX3FvdXRmaWZvKHN0cnVjdCBhaGRfc29mdGMgKmFoZCkKIHsKIAlzdHJ1Y3QJCXNjYiAqc2NiOwpAQCAtOTA1LDYgKzk2MSw1MSBAQAogCWFoZF9mcmVlKGFoZCk7CiB9CiAKKyNpZmRlZiBBSERfREVCVUcKK3N0YXRpYyB2b2lkCithaGRfZHVtcF9zZ2xpc3Qoc3RydWN0IHNjYiAqc2NiKQoreworCWludCBpOworCisJaWYgKHNjYi0+c2dfY291bnQgPiAwKSB7CisJCWlmICgoc2NiLT5haGRfc29mdGMtPmZsYWdzICYgQUhEXzY0QklUX0FERFJFU1NJTkcpICE9IDApIHsKKwkJCXN0cnVjdCBhaGRfZG1hNjRfc2VnICpzZ19saXN0OworCisJCQlzZ19saXN0ID0gKHN0cnVjdCBhaGRfZG1hNjRfc2VnKilzY2ItPnNnX2xpc3Q7CisJCQlmb3IgKGkgPSAwOyBpIDwgc2NiLT5zZ19jb3VudDsgaSsrKSB7CisJCQkJdWludDY0X3QgYWRkcjsKKwkJCQl1aW50MzJfdCBsZW47CisKKwkJCQlhZGRyID0gYWhkX2xlNjR0b2goc2dfbGlzdFtpXS5hZGRyKTsKKwkJCQlsZW4gPSBhaGRfbGUzMnRvaChzZ19saXN0W2ldLmxlbik7CisJCQkJcHJpbnRmKCJzZ1slZF0gLSBBZGRyIDB4JXgleCA6IExlbmd0aCAlZCVzXG4iLAorCQkJCSAgICAgICBpLAorCQkJCSAgICAgICAodWludDMyX3QpKChhZGRyID4+IDMyKSAmIDB4RkZGRkZGRkYpLAorCQkJCSAgICAgICAodWludDMyX3QpKGFkZHIgJiAweEZGRkZGRkZGKSwKKwkJCQkgICAgICAgc2dfbGlzdFtpXS5sZW4gJiBBSERfU0dfTEVOX01BU0ssCisJCQkJICAgICAgIChzZ19saXN0W2ldLmxlbiAmIEFIRF9ETUFfTEFTVF9TRUcpCisJCQkJICAgICA/ICIgTGFzdCIgOiAiIik7CisJCQl9CisJCX0gZWxzZSB7CisJCQlzdHJ1Y3QgYWhkX2RtYV9zZWcgKnNnX2xpc3Q7CisKKwkJCXNnX2xpc3QgPSAoc3RydWN0IGFoZF9kbWFfc2VnKilzY2ItPnNnX2xpc3Q7CisJCQlmb3IgKGkgPSAwOyBpIDwgc2NiLT5zZ19jb3VudDsgaSsrKSB7CisJCQkJdWludDMyX3QgbGVuOworCisJCQkJbGVuID0gYWhkX2xlMzJ0b2goc2dfbGlzdFtpXS5sZW4pOworCQkJCXByaW50Zigic2dbJWRdIC0gQWRkciAweCV4JXggOiBMZW5ndGggJWQlc1xuIiwKKwkJCQkgICAgICAgaSwKKwkJCQkgICAgICAgKGxlbiAmIEFIRF9TR19ISUdIX0FERFJfTUFTSykgPj4gMjQsCisJCQkJICAgICAgIGFoZF9sZTMydG9oKHNnX2xpc3RbaV0uYWRkciksCisJCQkJICAgICAgIGxlbiAmIEFIRF9TR19MRU5fTUFTSywKKwkJCQkgICAgICAgbGVuICYgQUhEX0RNQV9MQVNUX1NFRyA/ICIgTGFzdCIgOiAiIik7CisJCQl9CisJCX0KKwl9Cit9CisjZW5kaWYgIC8qICBBSERfREVCVUcgICovCisKIHZvaWQKIGFoZF9oYW5kbGVfc2VxaW50KHN0cnVjdCBhaGRfc29mdGMgKmFoZCwgdV9pbnQgaW50c3RhdCkKIHsKQEAgLTEwNTMsMTAgKzExNTQsMTIgQEAKIAkJCSAqIElmIGEgdGFyZ2V0IHRha2VzIHVzIGludG8gdGhlIGNvbW1hbmQgcGhhc2UKIAkJCSAqIGFzc3VtZSB0aGF0IGl0IGhhcyBiZWVuIGV4dGVybmFsbHkgcmVzZXQgYW5kCiAJCQkgKiBoYXMgdGh1cyBsb3N0IG91ciBwcmV2aW91cyBwYWNrZXRpemVkIG5lZ290aWF0aW9uCi0JCQkgKiBhZ3JlZW1lbnQuCi0JCQkgKiBSZXZlcnQgdG8gYXN5bmMvbmFycm93IHRyYW5zZmVycyB1bnRpbCB3ZQotCQkJICogY2FuIHJlbmVnb3RpYXRlIHdpdGggdGhlIGRldmljZSBhbmQgbm90aWZ5Ci0JCQkgKiB0aGUgT1NNIGFib3V0IHRoZSByZXNldC4KKwkJCSAqIGFncmVlbWVudC4gIFNpbmNlIHdlIGhhdmUgbm90IHNlbnQgYW4gaWRlbnRpZnkKKwkJCSAqIG1lc3NhZ2UgYW5kIG1heSBub3QgaGF2ZSBmdWxseSBxdWFsaWZpZWQgdGhlCisJCQkgKiBjb25uZWN0aW9uLCB3ZSBjaGFuZ2Ugb3VyIGNvbW1hbmQgdG8gVFVSLCBhc3NlcnQKKwkJCSAqIEFUTiBhbmQgQUJPUlQgdGhlIHRhc2sgd2hlbiB3ZSBnbyB0byBtZXNzYWdlIGluCisJCQkgKiBwaGFzZS4gIFRoZSBPU00gd2lsbCBzZWUgdGhlIFJFUVVFVUVfUkVRVUVTVAorCQkJICogc3RhdHVzIGFuZCByZXRyeSB0aGUgY29tbWFuZC4KIAkJCSAqLwogCQkJc2NiaWQgPSBhaGRfZ2V0X3NjYnB0cihhaGQpOwogCQkJc2NiID0gYWhkX2xvb2t1cF9zY2IoYWhkLCBzY2JpZCk7CkBAIC0xMDgzLDcgKzExODYsMjggQEAKIAkJCWFoZF9zZXRfc3luY3JhdGUoYWhkLCAmZGV2aW5mbywgLypwZXJpb2QqLzAsCiAJCQkJCSAvKm9mZnNldCovMCwgLypwcHJfb3B0aW9ucyovMCwKIAkJCQkJIEFIRF9UUkFOU19BQ1RJVkUsIC8qcGF1c2VkKi9UUlVFKTsKLQkJCXNjYi0+ZmxhZ3MgfD0gU0NCX0VYVEVSTkFMX1JFU0VUOworCQkJLyogSGFuZC1jcmFmdCBUVVIgY29tbWFuZCAqLworCQkJYWhkX291dGIoYWhkLCBTQ0JfQ0RCX1NUT1JFLCAwKTsKKwkJCWFoZF9vdXRiKGFoZCwgU0NCX0NEQl9TVE9SRSsxLCAwKTsKKwkJCWFoZF9vdXRiKGFoZCwgU0NCX0NEQl9TVE9SRSsyLCAwKTsKKwkJCWFoZF9vdXRiKGFoZCwgU0NCX0NEQl9TVE9SRSszLCAwKTsKKwkJCWFoZF9vdXRiKGFoZCwgU0NCX0NEQl9TVE9SRSs0LCAwKTsKKwkJCWFoZF9vdXRiKGFoZCwgU0NCX0NEQl9TVE9SRSs1LCAwKTsKKwkJCWFoZF9vdXRiKGFoZCwgU0NCX0NEQl9MRU4sIDYpOworCQkJc2NiLT5oc2NiLT5jb250cm9sICY9IH4oVEFHX0VOQnxTQ0JfVEFHX1RZUEUpOworCQkJc2NiLT5oc2NiLT5jb250cm9sIHw9IE1LX01FU1NBR0U7CisJCQlhaGRfb3V0YihhaGQsIFNDQl9DT05UUk9MLCBzY2ItPmhzY2ItPmNvbnRyb2wpOworCQkJYWhkX291dGIoYWhkLCBNU0dfT1VULCBIT1NUX01TRyk7CisJCQlhaGRfb3V0YihhaGQsIFNBVkVEX1NDU0lJRCwgc2NiLT5oc2NiLT5zY3NpaWQpOworCQkJLyoKKwkJCSAqIFRoZSBsdW4gaXMgMCwgcmVnYXJkbGVzcyBvZiB0aGUgU0NCJ3MgbHVuCisJCQkgKiBhcyB3ZSBoYXZlIG5vdCBzZW50IGFuIGlkZW50aWZ5IG1lc3NhZ2UuCisJCQkgKi8KKwkJCWFoZF9vdXRiKGFoZCwgU0FWRURfTFVOLCAwKTsKKwkJCWFoZF9vdXRiKGFoZCwgU0VRX0ZMQUdTLCAwKTsKKwkJCWFoZF9hc3NlcnRfYXRuKGFoZCk7CisJCQlzY2ItPmZsYWdzICY9IH5TQ0JfUEFDS0VUSVpFRDsKKwkJCXNjYi0+ZmxhZ3MgfD0gU0NCX0FCT1JUfFNDQl9FWFRFUk5BTF9SRVNFVDsKIAkJCWFoZF9mcmVlemVfZGV2cShhaGQsIHNjYik7CiAJCQlhaGRfc2V0X3RyYW5zYWN0aW9uX3N0YXR1cyhzY2IsIENBTV9SRVFVRVVFX1JFUSk7CiAJCQlhaGRfZnJlZXplX3NjYihzY2IpOwpAQCAtMTUxOSw4ICsxNjQzLDEwIEBACiAJLyoKIAkgKiBJZ25vcmUgZXh0ZXJuYWwgcmVzZXRzIGFmdGVyIGEgYnVzIHJlc2V0LgogCSAqLwotCWlmICgoKHN0YXR1cyAmIFNDU0lSU1RJKSAhPSAwKSAmJiAoYWhkLT5mbGFncyAmIEFIRF9CVVNfUkVTRVRfQUNUSVZFKSkKKwlpZiAoKChzdGF0dXMgJiBTQ1NJUlNUSSkgIT0gMCkgJiYgKGFoZC0+ZmxhZ3MgJiBBSERfQlVTX1JFU0VUX0FDVElWRSkpIHsKKwkJYWhkX291dGIoYWhkLCBDTFJTSU5UMSwgQ0xSU0NTSVJTVEkpOwogCQlyZXR1cm47CisJfQogCiAJLyoKIAkgKiBDbGVhciBidXMgcmVzZXQgZmxhZwpAQCAtMjIwMCw2ICsyMzI2LDIyIEBACiAJCQlpZiAoc2VudF9tc2cgPT0gTVNHX0FCT1JUX1RBRykKIAkJCQl0YWcgPSBTQ0JfR0VUX1RBRyhzY2IpOwogCisJCQlpZiAoKHNjYi0+ZmxhZ3MgJiBTQ0JfRVhURVJOQUxfUkVTRVQpICE9IDApIHsKKwkJCQkvKgorCQkJCSAqIFRoaXMgYWJvcnQgaXMgaW4gcmVzcG9uc2UgdG8gYW4KKwkJCQkgKiB1bmV4cGVjdGVkIHN3aXRjaCB0byBjb21tYW5kIHBoYXNlCisJCQkJICogZm9yIGEgcGFja2V0aXplZCBjb25uZWN0aW9uLiAgU2luY2UKKwkJCQkgKiB0aGUgaWRlbnRpZnkgbWVzc2FnZSB3YXMgbmV2ZXIgc2VudCwKKwkJCQkgKiAic2F2ZWQgbHVuIiBpcyAwLiAgV2UgcmVhbGx5IHdhbnQgdG8KKwkJCQkgKiBhYm9ydCBvbmx5IHRoZSBTQ0IgdGhhdCBlbmNvdW50ZXJlZAorCQkJCSAqIHRoaXMgZXJyb3IsIHdoaWNoIGNvdWxkIGhhdmUgYSBkaWZmZXJlbnQKKwkJCQkgKiBsdW4uICBUaGUgU0NCIHdpbGwgYmUgcmV0cmllZCBzbyB0aGUgT1MKKwkJCQkgKiB3aWxsIHNlZSB0aGUgVUEgYWZ0ZXIgcmVuZWdvdGlhdGluZyB0bworCQkJCSAqIHBhY2tldGl6ZWQuCisJCQkJICovCisJCQkJdGFnID0gU0NCX0dFVF9UQUcoc2NiKTsKKwkJCQlzYXZlZF9sdW4gPSBzY2ItPmhzY2ItPmx1bjsKKwkJCX0KIAkJCWZvdW5kID0gYWhkX2Fib3J0X3NjYnMoYWhkLCB0YXJnZXQsICdBJywgc2F2ZWRfbHVuLAogCQkJCQkgICAgICAgdGFnLCBST0xFX0lOSVRJQVRPUiwKIAkJCQkJICAgICAgIENBTV9SRVFfQUJPUlRFRCk7CkBAIC0yNTIzLDcgKzI2NjUsNyBAQAogfQogCiAjZGVmaW5lIEFIRF9NQVhfU1RFUFMgMjAwMAotdm9pZAorc3RhdGljIHZvaWQKIGFoZF9jbGVhcl9jcml0aWNhbF9zZWN0aW9uKHN0cnVjdCBhaGRfc29mdGMgKmFoZCkKIHsKIAlhaGRfbW9kZV9zdGF0ZQlzYXZlZF9tb2RlczsKQEAgLTI2NDYsNyArMjc4OCw3IEBACiAvKgogICogQ2xlYXIgYW55IHBlbmRpbmcgaW50ZXJydXB0IHN0YXR1cy4KICAqLwotdm9pZAorc3RhdGljIHZvaWQKIGFoZF9jbGVhcl9pbnRzdGF0KHN0cnVjdCBhaGRfc29mdGMgKmFoZCkKIHsKIAlBSERfQVNTRVJUX01PREVTKGFoZCwgfihBSERfTU9ERV9VTktOT1dOX01TS3xBSERfTU9ERV9DRkdfTVNLKSwKQEAgLTI2NzcsNiArMjgxOSw4IEBACiAjaWZkZWYgQUhEX0RFQlVHCiB1aW50MzJfdCBhaGRfZGVidWcgPSBBSERfREVCVUdfT1BUUzsKICNlbmRpZgorCisjaWYgMAogdm9pZAogYWhkX3ByaW50X3NjYihzdHJ1Y3Qgc2NiICpzY2IpCiB7CkBAIC0yNzAxLDQ5ICsyODQ1LDcgQEAKIAkgICAgICAgU0NCX0dFVF9UQUcoc2NiKSk7CiAJYWhkX2R1bXBfc2dsaXN0KHNjYik7CiB9Ci0KLXZvaWQKLWFoZF9kdW1wX3NnbGlzdChzdHJ1Y3Qgc2NiICpzY2IpCi17Ci0JaW50IGk7Ci0KLQlpZiAoc2NiLT5zZ19jb3VudCA+IDApIHsKLQkJaWYgKChzY2ItPmFoZF9zb2Z0Yy0+ZmxhZ3MgJiBBSERfNjRCSVRfQUREUkVTU0lORykgIT0gMCkgewotCQkJc3RydWN0IGFoZF9kbWE2NF9zZWcgKnNnX2xpc3Q7Ci0KLQkJCXNnX2xpc3QgPSAoc3RydWN0IGFoZF9kbWE2NF9zZWcqKXNjYi0+c2dfbGlzdDsKLQkJCWZvciAoaSA9IDA7IGkgPCBzY2ItPnNnX2NvdW50OyBpKyspIHsKLQkJCQl1aW50NjRfdCBhZGRyOwotCQkJCXVpbnQzMl90IGxlbjsKLQotCQkJCWFkZHIgPSBhaGRfbGU2NHRvaChzZ19saXN0W2ldLmFkZHIpOwotCQkJCWxlbiA9IGFoZF9sZTMydG9oKHNnX2xpc3RbaV0ubGVuKTsKLQkJCQlwcmludGYoInNnWyVkXSAtIEFkZHIgMHgleCV4IDogTGVuZ3RoICVkJXNcbiIsCi0JCQkJICAgICAgIGksCi0JCQkJICAgICAgICh1aW50MzJfdCkoKGFkZHIgPj4gMzIpICYgMHhGRkZGRkZGRiksCi0JCQkJICAgICAgICh1aW50MzJfdCkoYWRkciAmIDB4RkZGRkZGRkYpLAotCQkJCSAgICAgICBzZ19saXN0W2ldLmxlbiAmIEFIRF9TR19MRU5fTUFTSywKLQkJCQkgICAgICAgKHNnX2xpc3RbaV0ubGVuICYgQUhEX0RNQV9MQVNUX1NFRykKLQkJCQkgICAgID8gIiBMYXN0IiA6ICIiKTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCXN0cnVjdCBhaGRfZG1hX3NlZyAqc2dfbGlzdDsKLQotCQkJc2dfbGlzdCA9IChzdHJ1Y3QgYWhkX2RtYV9zZWcqKXNjYi0+c2dfbGlzdDsKLQkJCWZvciAoaSA9IDA7IGkgPCBzY2ItPnNnX2NvdW50OyBpKyspIHsKLQkJCQl1aW50MzJfdCBsZW47Ci0KLQkJCQlsZW4gPSBhaGRfbGUzMnRvaChzZ19saXN0W2ldLmxlbik7Ci0JCQkJcHJpbnRmKCJzZ1slZF0gLSBBZGRyIDB4JXgleCA6IExlbmd0aCAlZCVzXG4iLAotCQkJCSAgICAgICBpLAotCQkJCSAgICAgICAobGVuICYgQUhEX1NHX0hJR0hfQUREUl9NQVNLKSA+PiAyNCwKLQkJCQkgICAgICAgYWhkX2xlMzJ0b2goc2dfbGlzdFtpXS5hZGRyKSwKLQkJCQkgICAgICAgbGVuICYgQUhEX1NHX0xFTl9NQVNLLAotCQkJCSAgICAgICBsZW4gJiBBSERfRE1BX0xBU1RfU0VHID8gIiBMYXN0IiA6ICIiKTsKLQkJCX0KLQkJfQotCX0KLX0KKyNlbmRpZiAgLyogIDAgICovCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqIFRyYW5zZmVyIE5lZ290aWF0aW9uICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKgpAQCAtMjg1MCwxNCArMjk1MiwxNCBAQAogCQl0cmFuc2luZm8gPSAmdGluZm8tPmdvYWw7CiAJKnBwcl9vcHRpb25zICY9ICh0cmFuc2luZm8tPnBwcl9vcHRpb25zfE1TR19FWFRfUFBSX1BDT01QX0VOKTsKIAlpZiAodHJhbnNpbmZvLT53aWR0aCA9PSBNU0dfRVhUX1dEVFJfQlVTXzhfQklUKSB7Ci0JCW1heHN5bmMgPSBNQVgobWF4c3luYywgQUhEX1NZTkNSQVRFX1VMVFJBMik7CisJCW1heHN5bmMgPSBtYXgobWF4c3luYywgKHVfaW50KUFIRF9TWU5DUkFURV9VTFRSQTIpOwogCQkqcHByX29wdGlvbnMgJj0gfk1TR19FWFRfUFBSX0RUX1JFUTsKIAl9CiAJaWYgKHRyYW5zaW5mby0+cGVyaW9kID09IDApIHsKIAkJKnBlcmlvZCA9IDA7CiAJCSpwcHJfb3B0aW9ucyA9IDA7CiAJfSBlbHNlIHsKLQkJKnBlcmlvZCA9IE1BWCgqcGVyaW9kLCB0cmFuc2luZm8tPnBlcmlvZCk7CisJCSpwZXJpb2QgPSBtYXgoKnBlcmlvZCwgKHVfaW50KXRyYW5zaW5mby0+cGVyaW9kKTsKIAkJYWhkX2ZpbmRfc3luY3JhdGUoYWhkLCBwZXJpb2QsIHBwcl9vcHRpb25zLCBtYXhzeW5jKTsKIAl9CiB9CkBAIC0yOTA2LDcgKzMwMDgsNyBAQAogICogVHJ1bmNhdGUgdGhlIGdpdmVuIHN5bmNocm9ub3VzIG9mZnNldCB0byBhIHZhbHVlIHRoZQogICogY3VycmVudCBhZGFwdGVyIHR5cGUgYW5kIHN5bmNyYXRlIGFyZSBjYXBhYmxlIG9mLgogICovCi12b2lkCitzdGF0aWMgdm9pZAogYWhkX3ZhbGlkYXRlX29mZnNldChzdHJ1Y3QgYWhkX3NvZnRjICphaGQsCiAJCSAgICBzdHJ1Y3QgYWhkX2luaXRpYXRvcl90aW5mbyAqdGluZm8sCiAJCSAgICB1X2ludCBwZXJpb2QsIHVfaW50ICpvZmZzZXQsIGludCB3aWRlLApAQCAtMjkyNCwxMiArMzAyNiwxMiBAQAogCQkJbWF4b2Zmc2V0ID0gTUFYX09GRlNFVF9QQUNFRDsKIAl9IGVsc2UKIAkJbWF4b2Zmc2V0ID0gTUFYX09GRlNFVF9OT05fUEFDRUQ7Ci0JKm9mZnNldCA9IE1JTigqb2Zmc2V0LCBtYXhvZmZzZXQpOworCSpvZmZzZXQgPSBtaW4oKm9mZnNldCwgbWF4b2Zmc2V0KTsKIAlpZiAodGluZm8gIT0gTlVMTCkgewogCQlpZiAocm9sZSA9PSBST0xFX1RBUkdFVCkKLQkJCSpvZmZzZXQgPSBNSU4oKm9mZnNldCwgdGluZm8tPnVzZXIub2Zmc2V0KTsKKwkJCSpvZmZzZXQgPSBtaW4oKm9mZnNldCwgKHVfaW50KXRpbmZvLT51c2VyLm9mZnNldCk7CiAJCWVsc2UKLQkJCSpvZmZzZXQgPSBNSU4oKm9mZnNldCwgdGluZm8tPmdvYWwub2Zmc2V0KTsKKwkJCSpvZmZzZXQgPSBtaW4oKm9mZnNldCwgKHVfaW50KXRpbmZvLT5nb2FsLm9mZnNldCk7CiAJfQogfQogCkBAIC0yOTM3LDcgKzMwMzksNyBAQAogICogVHJ1bmNhdGUgdGhlIGdpdmVuIHRyYW5zZmVyIHdpZHRoIHBhcmFtZXRlciB0byBhIHZhbHVlIHRoZQogICogY3VycmVudCBhZGFwdGVyIHR5cGUgaXMgY2FwYWJsZSBvZi4KICAqLwotdm9pZAorc3RhdGljIHZvaWQKIGFoZF92YWxpZGF0ZV93aWR0aChzdHJ1Y3QgYWhkX3NvZnRjICphaGQsIHN0cnVjdCBhaGRfaW5pdGlhdG9yX3RpbmZvICp0aW5mbywKIAkJICAgdV9pbnQgKmJ1c193aWR0aCwgcm9sZV90IHJvbGUpCiB7CkBAIC0yOTU1LDkgKzMwNTcsOSBAQAogCX0KIAlpZiAodGluZm8gIT0gTlVMTCkgewogCQlpZiAocm9sZSA9PSBST0xFX1RBUkdFVCkKLQkJCSpidXNfd2lkdGggPSBNSU4odGluZm8tPnVzZXIud2lkdGgsICpidXNfd2lkdGgpOworCQkJKmJ1c193aWR0aCA9IG1pbigodV9pbnQpdGluZm8tPnVzZXIud2lkdGgsICpidXNfd2lkdGgpOwogCQllbHNlCi0JCQkqYnVzX3dpZHRoID0gTUlOKHRpbmZvLT5nb2FsLndpZHRoLCAqYnVzX3dpZHRoKTsKKwkJCSpidXNfd2lkdGggPSBtaW4oKHVfaW50KXRpbmZvLT5nb2FsLndpZHRoLCAqYnVzX3dpZHRoKTsKIAl9CiB9CiAKQEAgLTMyMTAsNyArMzMxMiw3IEBACiAvKgogICogVXBkYXRlIHRoZSBjdXJyZW50IHN0YXRlIG9mIHRhZ2dlZCBxdWV1aW5nIGZvciBhIGdpdmVuIHRhcmdldC4KICAqLwotdm9pZAorc3RhdGljIHZvaWQKIGFoZF9zZXRfdGFncyhzdHJ1Y3QgYWhkX3NvZnRjICphaGQsIHN0cnVjdCBzY3NpX2NtbmQgKmNtZCwKIAkgICAgIHN0cnVjdCBhaGRfZGV2aW5mbyAqZGV2aW5mbywgYWhkX3F1ZXVlX2FsZyBhbGcpCiB7CkBAIC0zNDY2LDcgKzM1NjgsNyBAQAogCSAgICAgICBkZXZpbmZvLT50YXJnZXQsIGRldmluZm8tPmx1bik7CiB9CiAKLXN0cnVjdCBhaGRfcGhhc2VfdGFibGVfZW50cnkqCitzdGF0aWMgc3RydWN0IGFoZF9waGFzZV90YWJsZV9lbnRyeSoKIGFoZF9sb29rdXBfcGhhc2VfZW50cnkoaW50IHBoYXNlKQogewogCXN0cnVjdCBhaGRfcGhhc2VfdGFibGVfZW50cnkgKmVudHJ5OwpAQCAtNTM1MSw3ICs1NDUzLDcgQEAKIAlyZXR1cm47CiB9CiAKLXZvaWQKK3N0YXRpYyB2b2lkCiBhaGRfc2h1dGRvd24odm9pZCAqYXJnKQogewogCXN0cnVjdAlhaGRfc29mdGMgKmFoZDsKQEAgLTU0ODAsNyArNTU4Miw3IEBACiAvKgogICogRGV0ZXJtaW5lIHRoZSBudW1iZXIgb2YgU0NCcyBhdmFpbGFibGUgb24gdGhlIGNvbnRyb2xsZXIKICAqLwotaW50CitzdGF0aWMgaW50CiBhaGRfcHJvYmVfc2NicyhzdHJ1Y3QgYWhkX3NvZnRjICphaGQpIHsKIAlpbnQgaTsKIApAQCAtNTkyOSw3ICs2MDMxLDcgQEAKIAlhaGRfcGxhdGZvcm1fc2NiX2ZyZWUoYWhkLCBzY2IpOwogfQogCi12b2lkCitzdGF0aWMgdm9pZAogYWhkX2FsbG9jX3NjYnMoc3RydWN0IGFoZF9zb2Z0YyAqYWhkKQogewogCXN0cnVjdCBzY2JfZGF0YSAqc2NiX2RhdGE7CkBAIC02MDU3LDkgKzYxNTksOSBAQAogI2VuZGlmCiAJfQogCi0JbmV3Y291bnQgPSBNSU4oc2NiX2RhdGEtPnNlbnNlX2xlZnQsIHNjYl9kYXRhLT5zY2JzX2xlZnQpOwotCW5ld2NvdW50ID0gTUlOKG5ld2NvdW50LCBzY2JfZGF0YS0+c2dzX2xlZnQpOwotCW5ld2NvdW50ID0gTUlOKG5ld2NvdW50LCAoQUhEX1NDQl9NQVhfQUxMT0MgLSBzY2JfZGF0YS0+bnVtc2NicykpOworCW5ld2NvdW50ID0gbWluKHNjYl9kYXRhLT5zZW5zZV9sZWZ0LCBzY2JfZGF0YS0+c2Nic19sZWZ0KTsKKwluZXdjb3VudCA9IG1pbihuZXdjb3VudCwgc2NiX2RhdGEtPnNnc19sZWZ0KTsKKwluZXdjb3VudCA9IG1pbihuZXdjb3VudCwgKEFIRF9TQ0JfTUFYX0FMTE9DIC0gc2NiX2RhdGEtPm51bXNjYnMpKTsKIAlmb3IgKGkgPSAwOyBpIDwgbmV3Y291bnQ7IGkrKykgewogCQlzdHJ1Y3Qgc2NiX3BsYXRmb3JtX2RhdGEgKnBkYXRhOwogCQl1X2ludCBjb2xfdGFnOwpAQCAtNjk4Miw3ICs3MDg0LDcgQEAKIAlhaGRfb3V0YihhaGQsIEhDTlRSTCwgaGNudHJsKTsKIH0KIAotdm9pZAorc3RhdGljIHZvaWQKIGFoZF91cGRhdGVfY29hbGVzY2luZ192YWx1ZXMoc3RydWN0IGFoZF9zb2Z0YyAqYWhkLCB1X2ludCB0aW1lciwgdV9pbnQgbWF4Y21kcywKIAkJCSAgICAgdV9pbnQgbWluY21kcykKIHsKQEAgLTcwMDAsNyArNzEwMiw3IEBACiAJYWhkX291dGIoYWhkLCBJTlRfQ09BTEVTQ0lOR19NSU5DTURTLCAtbWluY21kcyk7CiB9CiAKLXZvaWQKK3N0YXRpYyB2b2lkCiBhaGRfZW5hYmxlX2NvYWxlc2Npbmcoc3RydWN0IGFoZF9zb2Z0YyAqYWhkLCBpbnQgZW5hYmxlKQogewogCkBAIC03MDcwLDYgKzcxNzIsNyBAQAogCWFoZC0+ZmxhZ3MgJj0gfkFIRF9BTExfSU5URVJSVVBUUzsKIH0KIAorI2lmIDAKIGludAogYWhkX3N1c3BlbmQoc3RydWN0IGFoZF9zb2Z0YyAqYWhkKQogewpAQCAtNzA4Myw3ICs3MTg2LDkgQEAKIAlhaGRfc2h1dGRvd24oYWhkKTsKIAlyZXR1cm4gKDApOwogfQorI2VuZGlmICAvKiAgMCAgKi8KIAorI2lmIDAKIGludAogYWhkX3Jlc3VtZShzdHJ1Y3QgYWhkX3NvZnRjICphaGQpCiB7CkBAIC03MDkzLDYgKzcxOTgsNyBAQAogCWFoZF9yZXN0YXJ0KGFoZCk7CiAJcmV0dXJuICgwKTsKIH0KKyNlbmRpZiAgLyogIDAgICovCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKiBCdXN5IFRhcmdldCBUYWJsZSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKgpAQCAtNzEyNSw3ICs3MjMxLDcgQEAKIC8qCiAgKiBSZXR1cm4gdGhlIHVudGFnZ2VkIHRyYW5zYWN0aW9uIGlkIGZvciBhIGdpdmVuIHRhcmdldC9jaGFubmVsIGx1bi4KICAqLwotdV9pbnQKK3N0YXRpYyB1X2ludAogYWhkX2ZpbmRfYnVzeV90Y2woc3RydWN0IGFoZF9zb2Z0YyAqYWhkLCB1X2ludCB0Y2wpCiB7CiAJdV9pbnQgc2NiaWQ7CkBAIC03MTM4LDcgKzcyNDQsNyBAQAogCXJldHVybiAoc2NiaWQpOwogfQogCi12b2lkCitzdGF0aWMgdm9pZAogYWhkX2J1c3lfdGNsKHN0cnVjdCBhaGRfc29mdGMgKmFoZCwgdV9pbnQgdGNsLCB1X2ludCBzY2JpZCkKIHsKIAl1X2ludCBzY2Jfb2Zmc2V0OwpAQCAtNzE4Niw3ICs3MjkyLDcgQEAKIAlyZXR1cm4gbWF0Y2g7CiB9CiAKLXZvaWQKK3N0YXRpYyB2b2lkCiBhaGRfZnJlZXplX2RldnEoc3RydWN0IGFoZF9zb2Z0YyAqYWhkLCBzdHJ1Y3Qgc2NiICpzY2IpCiB7CiAJaW50CXRhcmdldDsKQEAgLTc2OTAsNyArNzc5Niw3IEBACiAgKiBiZWVuIG1vZGlmaWVkIGZyb20gQ0FNX1JFUV9JTlBST0cuICBUaGlzIHJvdXRpbmUgYXNzdW1lcyB0aGF0IHRoZSBzZXF1ZW5jZXIKICAqIGlzIHBhdXNlZCBiZWZvcmUgaXQgaXMgY2FsbGVkLgogICovCi1pbnQKK3N0YXRpYyBpbnQKIGFoZF9hYm9ydF9zY2JzKHN0cnVjdCBhaGRfc29mdGMgKmFoZCwgaW50IHRhcmdldCwgY2hhciBjaGFubmVsLAogCSAgICAgICBpbnQgbHVuLCB1X2ludCB0YWcsIHJvbGVfdCByb2xlLCB1aW50MzJfdCBzdGF0dXMpCiB7CkBAIC03OTIwLDYgKzgwMjYsMTEgQEAKIAlhaGRfY2xlYXJfZmlmbyhhaGQsIDEpOwogCiAJLyoKKwkgKiBDbGVhciBTQ1NJIGludGVycnVwdCBzdGF0dXMKKwkgKi8KKwlhaGRfb3V0YihhaGQsIENMUlNJTlQxLCBDTFJTQ1NJUlNUSSk7CisKKwkvKgogCSAqIFJlZW5hYmxlIHNlbGVjdGlvbnMKIAkgKi8KIAlhaGRfb3V0YihhaGQsIFNJTU9ERTEsIGFoZF9pbmIoYWhkLCBTSU1PREUxKSB8IEVOU0NTSVJTVCk7CkBAIC03OTUyLDEwICs4MDYzLDYgQEAKIAkJfQogCX0KICNlbmRpZgotCS8qIE5vdGlmeSB0aGUgWFBUIHRoYXQgYSBidXMgcmVzZXQgb2NjdXJyZWQgKi8KLQlhaGRfc2VuZF9hc3luYyhhaGQsIGRldmluZm8uY2hhbm5lbCwgQ0FNX1RBUkdFVF9XSUxEQ0FSRCwKLQkJICAgICAgIENBTV9MVU5fV0lMRENBUkQsIEFDX0JVU19SRVNFVCk7Ci0KIAkvKgogCSAqIFJldmVydCB0byBhc3luYy9uYXJyb3cgdHJhbnNmZXJzIHVudGlsIHdlIHJlbmVnb3RpYXRlLgogCSAqLwpAQCAtNzk3Nyw2ICs4MDg0LDEwIEBACiAJCX0KIAl9CiAKKwkvKiBOb3RpZnkgdGhlIFhQVCB0aGF0IGEgYnVzIHJlc2V0IG9jY3VycmVkICovCisJYWhkX3NlbmRfYXN5bmMoYWhkLCBkZXZpbmZvLmNoYW5uZWwsIENBTV9UQVJHRVRfV0lMRENBUkQsCisJCSAgICAgICBDQU1fTFVOX1dJTERDQVJELCBBQ19CVVNfUkVTRVQpOworCiAJYWhkX3Jlc3RhcnQoYWhkKTsKIAogCXJldHVybiAoZm91bmQpOwpAQCAtODAxOSwxOCArODEzMCw4IEBACiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogU3RhdHVzIFByb2Nlc3NpbmcgKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkCi1haGRfaGFuZGxlX3NjYl9zdGF0dXMoc3RydWN0IGFoZF9zb2Z0YyAqYWhkLCBzdHJ1Y3Qgc2NiICpzY2IpCi17Ci0JaWYgKHNjYi0+aHNjYi0+c2hhcmVkX2RhdGEuaXN0YXR1cy5zY3NpX3N0YXR1cyAhPSAwKSB7Ci0JCWFoZF9oYW5kbGVfc2NzaV9zdGF0dXMoYWhkLCBzY2IpOwotCX0gZWxzZSB7Ci0JCWFoZF9jYWxjX3Jlc2lkdWFsKGFoZCwgc2NiKTsKLQkJYWhkX2RvbmUoYWhkLCBzY2IpOwotCX0KLX0KIAotdm9pZAorc3RhdGljIHZvaWQKIGFoZF9oYW5kbGVfc2NzaV9zdGF0dXMoc3RydWN0IGFoZF9zb2Z0YyAqYWhkLCBzdHJ1Y3Qgc2NiICpzY2IpCiB7CiAJc3RydWN0CWhhcmR3YXJlX3NjYiAqaHNjYjsKQEAgLTgyMzgsMTAgKzgzMzksMjEgQEAKIAl9CiB9CiAKK3N0YXRpYyB2b2lkCithaGRfaGFuZGxlX3NjYl9zdGF0dXMoc3RydWN0IGFoZF9zb2Z0YyAqYWhkLCBzdHJ1Y3Qgc2NiICpzY2IpCit7CisJaWYgKHNjYi0+aHNjYi0+c2hhcmVkX2RhdGEuaXN0YXR1cy5zY3NpX3N0YXR1cyAhPSAwKSB7CisJCWFoZF9oYW5kbGVfc2NzaV9zdGF0dXMoYWhkLCBzY2IpOworCX0gZWxzZSB7CisJCWFoZF9jYWxjX3Jlc2lkdWFsKGFoZCwgc2NiKTsKKwkJYWhkX2RvbmUoYWhkLCBzY2IpOworCX0KK30KKwogLyoKICAqIENhbGN1bGF0ZSB0aGUgcmVzaWR1YWwgZm9yIGEganVzdCBjb21wbGV0ZWQgU0NCLgogICovCi12b2lkCitzdGF0aWMgdm9pZAogYWhkX2NhbGNfcmVzaWR1YWwoc3RydWN0IGFoZF9zb2Z0YyAqYWhkLCBzdHJ1Y3Qgc2NiICpzY2IpCiB7CiAJc3RydWN0IGhhcmR3YXJlX3NjYiAqaHNjYjsKQEAgLTg2NjgsNyArODc4MCw3IEBACiAJCWlmIChza2lwX2FkZHIgPiBpKSB7CiAJCQlpbnQgZW5kX2FkZHI7CiAKLQkJCWVuZF9hZGRyID0gTUlOKGFkZHJlc3MsIHNraXBfYWRkcik7CisJCQllbmRfYWRkciA9IG1pbihhZGRyZXNzLCBza2lwX2FkZHIpOwogCQkJYWRkcmVzc19vZmZzZXQgKz0gZW5kX2FkZHIgLSBpOwogCQkJaSA9IHNraXBfYWRkcjsKIAkJfSBlbHNlIHsKQEAgLTkwOTIsNiArOTIwNCw3IEBACiAJCWFoZF91bnBhdXNlKGFoZCk7CiB9CiAKKyNpZiAwCiB2b2lkCiBhaGRfZHVtcF9zY2JzKHN0cnVjdCBhaGRfc29mdGMgKmFoZCkKIHsKQEAgLTkxMTcsNiArOTIzMCw3IEBACiAJYWhkX3NldF9zY2JwdHIoYWhkLCBzYXZlZF9zY2JfaW5kZXgpOwogCWFoZF9yZXN0b3JlX21vZGVzKGFoZCwgc2F2ZWRfbW9kZXMpOwogfQorI2VuZGlmICAvKiAgMCAgKi8KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKiogRmxleHBvcnQgTG9naWMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qCkBAIC05MjE5LDcgKzkzMzMsNyBAQAogLyoKICAqIFdhaXQgfjEwMHVzIGZvciB0aGUgc2VyaWFsIGVlcHJvbSB0byBzYXRpc2Z5IG91ciByZXF1ZXN0LgogICovCi1pbnQKK3N0YXRpYyBpbnQKIGFoZF93YWl0X3NlZXByb20oc3RydWN0IGFoZF9zb2Z0YyAqYWhkKQogewogCWludCBjbnQ7CkBAIC05MjM3LDcgKzkzNTEsNyBAQAogICogVmFsaWRhdGUgdGhlIHR3byBjaGVja3N1bXMgaW4gdGhlIHBlcl9jaGFubmVsCiAgKiB2aXRhbCBwcm9kdWN0IGRhdGEgc3RydWN0LgogICovCi1pbnQKK3N0YXRpYyBpbnQKIGFoZF92ZXJpZnlfdnBkX2Nrc3VtKHN0cnVjdCB2cGRfY29uZmlnICp2cGQpCiB7CiAJaW50IGk7CkBAIC05MzE2LDYgKzk0MzAsMjQgQEAKIAkvKiBDdXJyZW50bHkgYSBuby1vcCAqLwogfQogCisvKgorICogV2FpdCBhdCBtb3N0IDIgc2Vjb25kcyBmb3IgZmxleHBvcnQgYXJiaXRyYXRpb24gdG8gc3VjY2VlZC4KKyAqLworc3RhdGljIGludAorYWhkX3dhaXRfZmxleHBvcnQoc3RydWN0IGFoZF9zb2Z0YyAqYWhkKQoreworCWludCBjbnQ7CisKKwlBSERfQVNTRVJUX01PREVTKGFoZCwgQUhEX01PREVfU0NTSV9NU0ssIEFIRF9NT0RFX1NDU0lfTVNLKTsKKwljbnQgPSAxMDAwMDAwICogMiAvIDU7CisJd2hpbGUgKChhaGRfaW5iKGFoZCwgQlJEQ1RMKSAmIEZMWEFSQkFDSykgPT0gMCAmJiAtLWNudCkKKwkJYWhkX2RlbGF5KDUpOworCisJaWYgKGNudCA9PSAwKQorCQlyZXR1cm4gKEVUSU1FRE9VVCk7CisJcmV0dXJuICgwKTsKK30KKwogaW50CiBhaGRfd3JpdGVfZmxleHBvcnQoc3RydWN0IGFoZF9zb2Z0YyAqYWhkLCB1X2ludCBhZGRyLCB1X2ludCB2YWx1ZSkKIHsKQEAgLTkzNTcsMjQgKzk0ODksNiBAQAogCXJldHVybiAoMCk7CiB9CiAKLS8qCi0gKiBXYWl0IGF0IG1vc3QgMiBzZWNvbmRzIGZvciBmbGV4cG9ydCBhcmJpdHJhdGlvbiB0byBzdWNjZWVkLgotICovCi1pbnQKLWFoZF93YWl0X2ZsZXhwb3J0KHN0cnVjdCBhaGRfc29mdGMgKmFoZCkKLXsKLQlpbnQgY250OwotCi0JQUhEX0FTU0VSVF9NT0RFUyhhaGQsIEFIRF9NT0RFX1NDU0lfTVNLLCBBSERfTU9ERV9TQ1NJX01TSyk7Ci0JY250ID0gMTAwMDAwMCAqIDIgLyA1OwotCXdoaWxlICgoYWhkX2luYihhaGQsIEJSRENUTCkgJiBGTFhBUkJBQ0spID09IDAgJiYgLS1jbnQpCi0JCWFoZF9kZWxheSg1KTsKLQotCWlmIChjbnQgPT0gMCkKLQkJcmV0dXJuIChFVElNRURPVVQpOwotCXJldHVybiAoMCk7Ci19Ci0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqIFRhcmdldCBNb2RlICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAjaWZkZWYgQUhEX1RBUkdFVF9NT0RFCiBjYW1fc3RhdHVzCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYWljN3h4eC9haWM3OXh4X2lubGluZS5oIGIvZHJpdmVycy9zY3NpL2FpYzd4eHgvYWljNzl4eF9pbmxpbmUuaAppbmRleCBhMzI2NmUwLi4yY2ViNjdmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvYWljN3h4eC9haWM3OXh4X2lubGluZS5oCisrKyBiL2RyaXZlcnMvc2NzaS9haWM3eHh4L2FpYzc5eHhfaW5saW5lLmgKQEAgLTQxOCwxMCArNDE4LDYgQEAKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqIE1pc2NlbGFuZW91cyBTdXBwb3J0IEZ1bmN0aW9ucyAqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyBfX2lubGluZSB2b2lkCWFoZF9jb21wbGV0ZV9zY2Ioc3RydWN0IGFoZF9zb2Z0YyAqYWhkLAotCQkJCQkgc3RydWN0IHNjYiAqc2NiKTsKLXN0YXRpYyBfX2lubGluZSB2b2lkCWFoZF91cGRhdGVfcmVzaWR1YWwoc3RydWN0IGFoZF9zb2Z0YyAqYWhkLAotCQkJCQkgICAgc3RydWN0IHNjYiAqc2NiKTsKIHN0YXRpYyBfX2lubGluZSBzdHJ1Y3QgYWhkX2luaXRpYXRvcl90aW5mbyAqCiAJCQlhaGRfZmV0Y2hfdHJhbnNpbmZvKHN0cnVjdCBhaGRfc29mdGMgKmFoZCwKIAkJCQkJICAgIGNoYXIgY2hhbm5lbCwgdV9pbnQgb3VyX2lkLApAQCAtNDY3LDMyICs0NjMsNiBAQAogCQkJYWhkX2dldF9zZW5zZV9idWZhZGRyKHN0cnVjdCBhaGRfc29mdGMgKmFoZCwKIAkJCQkJICAgICAgc3RydWN0IHNjYiAqc2NiKTsKIAotc3RhdGljIF9faW5saW5lIHZvaWQKLWFoZF9jb21wbGV0ZV9zY2Ioc3RydWN0IGFoZF9zb2Z0YyAqYWhkLCBzdHJ1Y3Qgc2NiICpzY2IpCi17Ci0JdWludDMyX3Qgc2dwdHI7Ci0KLQlzZ3B0ciA9IGFoZF9sZTMydG9oKHNjYi0+aHNjYi0+c2dwdHIpOwotCWlmICgoc2dwdHIgJiBTR19TVEFUVVNfVkFMSUQpICE9IDApCi0JCWFoZF9oYW5kbGVfc2NiX3N0YXR1cyhhaGQsIHNjYik7Ci0JZWxzZQotCQlhaGRfZG9uZShhaGQsIHNjYik7Ci19Ci0KLS8qCi0gKiBEZXRlcm1pbmUgd2hldGhlciB0aGUgc2VxdWVuY2VyIHJlcG9ydGVkIGEgcmVzaWR1YWwKLSAqIGZvciB0aGlzIFNDQi90cmFuc2FjdGlvbi4KLSAqLwotc3RhdGljIF9faW5saW5lIHZvaWQKLWFoZF91cGRhdGVfcmVzaWR1YWwoc3RydWN0IGFoZF9zb2Z0YyAqYWhkLCBzdHJ1Y3Qgc2NiICpzY2IpCi17Ci0JdWludDMyX3Qgc2dwdHI7Ci0KLQlzZ3B0ciA9IGFoZF9sZTMydG9oKHNjYi0+aHNjYi0+c2dwdHIpOwotCWlmICgoc2dwdHIgJiBTR19TVEFUVVNfVkFMSUQpICE9IDApCi0JCWFoZF9jYWxjX3Jlc2lkdWFsKGFoZCwgc2NiKTsKLX0KLQogLyoKICAqIFJldHVybiBwb2ludGVycyB0byB0aGUgdHJhbnNmZXIgbmVnb3RpYXRpb24gaW5mb3JtYXRpb24KICAqIGZvciB0aGUgc3BlY2lmaWVkIG91cl9pZC9yZW1vdGVfaWQgcGFpci4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9haWM3eHh4L2FpYzc5eHhfb3NtLmMgYi9kcml2ZXJzL3Njc2kvYWljN3h4eC9haWM3OXh4X29zbS5jCmluZGV4IGY4ZTYwNDguLjliZmNjYTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9haWM3eHh4L2FpYzc5eHhfb3NtLmMKKysrIGIvZHJpdmVycy9zY3NpL2FpYzd4eHgvYWljNzl4eF9vc20uYwpAQCAtMjkzLDcgKzI5Myw3IEBACiAgKiBmb3JjZSBhbGwgb3V0c3RhbmRpbmcgdHJhbnNhY3Rpb25zIHRvIGJlIHNlcnZpY2VkIHByaW9yIHRvIGEgbmV3CiAgKiB0cmFuc2FjdGlvbi4KICAqLwotdWludDMyX3QgYWljNzl4eF9wZXJpb2RpY19vdGFnOworc3RhdGljIHVpbnQzMl90IGFpYzc5eHhfcGVyaW9kaWNfb3RhZzsKIAogLyogU29tZSBzdG9yYWdlIGJveGVzIGFyZSB1c2luZyBhbiBMU0kgY2hpcCB3aGljaCBoYXMgYSBidWcgbWFraW5nIGl0CiAgKiBpbXBvc3NpYmxlIHRvIHVzZSBhaWM3OXh4IFJldiBCIGNoaXAgaW4gMzIwIHNwZWVkcy4gIFRoZSBmb2xsb3dpbmcKQEAgLTc3Myw2ICs3NzMsNyBAQAogI2VuZGlmCiAJLmNhbl9xdWV1ZQkJPSBBSERfTUFYX1FVRVVFLAogCS50aGlzX2lkCQk9IC0xLAorCS5tYXhfc2VjdG9ycwkJPSA4MTkyLAogCS5jbWRfcGVyX2x1bgkJPSAyLAogCS51c2VfY2x1c3RlcmluZwkJPSBFTkFCTEVfQ0xVU1RFUklORywKIAkuc2xhdmVfYWxsb2MJCT0gYWhkX2xpbnV4X3NsYXZlX2FsbG9jLApAQCAtMTgxMyw5ICsxODE0LDkgQEAKIAkJCXVfaW50IHNlbnNlX29mZnNldDsKIAogCQkJaWYgKHNjYi0+ZmxhZ3MgJiBTQ0JfU0VOU0UpIHsKLQkJCQlzZW5zZV9zaXplID0gTUlOKHNpemVvZihzdHJ1Y3Qgc2NzaV9zZW5zZV9kYXRhKQorCQkJCXNlbnNlX3NpemUgPSBtaW4oc2l6ZW9mKHN0cnVjdCBzY3NpX3NlbnNlX2RhdGEpCiAJCQkJCSAgICAgICAtIGFoZF9nZXRfc2Vuc2VfcmVzaWR1YWwoc2NiKSwKLQkJCQkJCSBzaXplb2YoY21kLT5zZW5zZV9idWZmZXIpKTsKKwkJCQkJCSAodV9sb25nKXNpemVvZihjbWQtPnNlbnNlX2J1ZmZlcikpOwogCQkJCXNlbnNlX29mZnNldCA9IDA7CiAJCQl9IGVsc2UgewogCQkJCS8qCkBAIC0xODI0LDcgKzE4MjUsOCBAQAogCQkJCSAqLwogCQkJCXNpdSA9IChzdHJ1Y3Qgc2NzaV9zdGF0dXNfaXVfaGVhZGVyICopCiAJCQkJICAgIHNjYi0+c2Vuc2VfZGF0YTsKLQkJCQlzZW5zZV9zaXplID0gTUlOKHNjc2lfNGJ0b3VsKHNpdS0+c2Vuc2VfbGVuZ3RoKSwKKwkJCQlzZW5zZV9zaXplID0gbWluX3Qoc2l6ZV90LAorCQkJCQkJc2NzaV80YnRvdWwoc2l1LT5zZW5zZV9sZW5ndGgpLAogCQkJCQkJc2l6ZW9mKGNtZC0+c2Vuc2VfYnVmZmVyKSk7CiAJCQkJc2Vuc2Vfb2Zmc2V0ID0gU0lVX1NFTlNFX09GRlNFVChzaXUpOwogCQkJfQpAQCAtMjYzNCw4ICsyNjM2LDIyIEBACiAJCSAgICAgICBwY29tcCA/ICJFbmFibGUiIDogIkRpc2FibGUiKTsKICNlbmRpZgogCi0JaWYgKHBjb21wKQorCWlmIChwY29tcCkgeworCQl1aW50OF90IHByZWNvbXA7CisKKwkJaWYgKGFoZC0+dW5pdCA8IEFSUkFZX1NJWkUoYWljNzl4eF9pb2NlbGxfaW5mbykpIHsKKwkJCXN0cnVjdCBhaGRfbGludXhfaW9jZWxsX29wdHMgKmlvY2VsbF9vcHRzOworCisJCQlpb2NlbGxfb3B0cyA9ICZhaWM3OXh4X2lvY2VsbF9pbmZvW2FoZC0+dW5pdF07CisJCQlwcmVjb21wID0gaW9jZWxsX29wdHMtPnByZWNvbXA7CisJCX0gZWxzZSB7CisJCQlwcmVjb21wID0gQUlDNzlYWF9ERUZBVUxUX1BSRUNPTVA7CisJCX0KIAkJcHByX29wdGlvbnMgfD0gTVNHX0VYVF9QUFJfUENPTVBfRU47CisJCUFIRF9TRVRfUFJFQ09NUChhaGQsIHByZWNvbXApOworCX0gZWxzZSB7CisJCUFIRF9TRVRfUFJFQ09NUChhaGQsIDApOworCX0KIAogCWFoZF9jb21waWxlX2RldmluZm8oJmRldmluZm8sIHNob3N0LT50aGlzX2lkLCBzdGFyZ2V0LT5pZCwgMCwKIAkJCSAgICBzdGFyZ2V0LT5jaGFubmVsICsgJ0EnLCBST0xFX0lOSVRJQVRPUik7CkBAIC0yNjc4LDcgKzI2OTQsMjUgQEAKIAlhaGRfdW5sb2NrKGFoZCwgJmZsYWdzKTsKIH0KIAorc3RhdGljIHZvaWQgYWhkX2xpbnV4X2dldF9zaWduYWxsaW5nKHN0cnVjdCBTY3NpX0hvc3QgKnNob3N0KQoreworCXN0cnVjdCBhaGRfc29mdGMgKmFoZCA9ICooc3RydWN0IGFoZF9zb2Z0YyAqKilzaG9zdC0+aG9zdGRhdGE7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1OCBtb2RlOwogCisJYWhkX2xvY2soYWhkLCAmZmxhZ3MpOworCWFoZF9wYXVzZShhaGQpOworCW1vZGUgPSBhaGRfaW5iKGFoZCwgU0JMS0NUTCk7CisJYWhkX3VucGF1c2UoYWhkKTsKKwlhaGRfdW5sb2NrKGFoZCwgJmZsYWdzKTsKKworCWlmIChtb2RlICYgRU5BQjQwKQorCQlzcGlfc2lnbmFsbGluZyhzaG9zdCkgPSBTUElfU0lHTkFMX0xWRDsKKwllbHNlIGlmIChtb2RlICYgRU5BQjIwKQorCQlzcGlfc2lnbmFsbGluZyhzaG9zdCkgPSBTUElfU0lHTkFMX1NFOworCWVsc2UKKwkJc3BpX3NpZ25hbGxpbmcoc2hvc3QpID0gU1BJX1NJR05BTF9VTktOT1dOOworfQogCiBzdGF0aWMgc3RydWN0IHNwaV9mdW5jdGlvbl90ZW1wbGF0ZSBhaGRfbGludXhfdHJhbnNwb3J0X2Z1bmN0aW9ucyA9IHsKIAkuc2V0X29mZnNldAk9IGFoZF9saW51eF9zZXRfb2Zmc2V0LApAQCAtMjcwMyw2ICsyNzM3LDcgQEAKIAkuc2hvd19wY29tcF9lbgk9IDEsCiAJLnNldF9ob2xkX21jcwk9IGFoZF9saW51eF9zZXRfaG9sZF9tY3MsCiAJLnNob3dfaG9sZF9tY3MJPSAxLAorCS5nZXRfc2lnbmFsbGluZyA9IGFoZF9saW51eF9nZXRfc2lnbmFsbGluZywKIH07CiAKIHN0YXRpYyBpbnQgX19pbml0CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYWljN3h4eC9haWM3OXh4X29zbS5oIGIvZHJpdmVycy9zY3NpL2FpYzd4eHgvYWljNzl4eF9vc20uaAppbmRleCBmYjNkNGRkLi4zYTY3ZmM1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvYWljN3h4eC9haWM3OXh4X29zbS5oCisrKyBiL2RyaXZlcnMvc2NzaS9haWM3eHh4L2FpYzc5eHhfb3NtLmgKQEAgLTUwNiw5ICs1MDYsNiBAQAogCWludCBwb3M7CiB9OwogCi12b2lkCWFoZF9mb3JtYXRfdHJhbnNpbmZvKHN0cnVjdCBpbmZvX3N0ciAqaW5mbywKLQkJCSAgICAgc3RydWN0IGFoZF90cmFuc2luZm8gKnRpbmZvKTsKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIExvY2tpbmcgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHN0YXRpYyBfX2lubGluZSB2b2lkCiBhaGRfbG9ja2luaXQoc3RydWN0IGFoZF9zb2Z0YyAqYWhkKQpAQCAtNTgyLDggKzU3OSw2IEBACiAjZGVmaW5lIFBDSVhNX1NUQVRVU19NQVhDUkRTCTB4MUMwMAkvKiBNYXhpbXVtIEN1bXVsYXRpdmUgUmVhZCBTaXplICovCiAjZGVmaW5lIFBDSVhNX1NUQVRVU19SQ1ZEU0NFTQkweDIwMDAJLyogUmVjZWl2ZWQgYSBTcGxpdCBDb21wIHcvRXJyb3IgbXNnICovCiAKLWV4dGVybiBzdHJ1Y3QgcGNpX2RyaXZlciBhaWM3OXh4X3BjaV9kcml2ZXI7Ci0KIHR5cGVkZWYgZW51bQogewogCUFIRF9QT1dFUl9TVEFURV9EMCwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9haWM3eHh4L2FpYzc5eHhfb3NtX3BjaS5jIGIvZHJpdmVycy9zY3NpL2FpYzd4eHgvYWljNzl4eF9vc21fcGNpLmMKaW5kZXggNGI1MzU0Mi4uMjAwMWZlOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2FpYzd4eHgvYWljNzl4eF9vc21fcGNpLmMKKysrIGIvZHJpdmVycy9zY3NpL2FpYzd4eHgvYWljNzl4eF9vc21fcGNpLmMKQEAgLTgyLDcgKzgyLDcgQEAKIAogTU9EVUxFX0RFVklDRV9UQUJMRShwY2ksIGFoZF9saW51eF9wY2lfaWRfdGFibGUpOwogCi1zdHJ1Y3QgcGNpX2RyaXZlciBhaWM3OXh4X3BjaV9kcml2ZXIgPSB7CitzdGF0aWMgc3RydWN0IHBjaV9kcml2ZXIgYWljNzl4eF9wY2lfZHJpdmVyID0gewogCS5uYW1lCQk9ICJhaWM3OXh4IiwKIAkucHJvYmUJCT0gYWhkX2xpbnV4X3BjaV9kZXZfcHJvYmUsCiAJLnJlbW92ZQkJPSBhaGRfbGludXhfcGNpX2Rldl9yZW1vdmUsCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYWljN3h4eC9haWM3OXh4X3BjaS5jIGIvZHJpdmVycy9zY3NpL2FpYzd4eHgvYWljNzl4eF9wY2kuYwppbmRleCAxNDg1MGYzLi5jMDc3MzU4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvYWljN3h4eC9haWM3OXh4X3BjaS5jCisrKyBiL2RyaXZlcnMvc2NzaS9haWM3eHh4L2FpYzc5eHhfcGNpLmMKQEAgLTk3LDcgKzk3LDcgQEAKIHN0YXRpYyBhaGRfZGV2aWNlX3NldHVwX3QgYWhkX2FpYzc5MDJfc2V0dXA7CiBzdGF0aWMgYWhkX2RldmljZV9zZXR1cF90IGFoZF9haWM3OTBYX3NldHVwOwogCi1zdHJ1Y3QgYWhkX3BjaV9pZGVudGl0eSBhaGRfcGNpX2lkZW50X3RhYmxlIFtdID0KK3N0YXRpYyBzdHJ1Y3QgYWhkX3BjaV9pZGVudGl0eSBhaGRfcGNpX2lkZW50X3RhYmxlIFtdID0KIHsKIAkvKiBhaWM3OTAxIGJhc2VkIGNvbnRyb2xsZXJzICovCiAJewpAQCAtMjAxLDcgKzIwMSw3IEBACiAJfQogfTsKIAotY29uc3QgdV9pbnQgYWhkX251bV9wY2lfZGV2cyA9IEFSUkFZX1NJWkUoYWhkX3BjaV9pZGVudF90YWJsZSk7CitzdGF0aWMgY29uc3QgdV9pbnQgYWhkX251bV9wY2lfZGV2cyA9IEFSUkFZX1NJWkUoYWhkX3BjaV9pZGVudF90YWJsZSk7CiAJCQogI2RlZmluZQlERVZDT05GSUcJCTB4NDAKICNkZWZpbmUJCVBDSVhJTklUUEFUCTB4MDAwMEUwMDB1bApAQCAtMjQ1LDYgKzI0NSw3IEBACiBzdGF0aWMgdm9pZAlhaGRfY29uZmlndXJlX3Rlcm1pbmF0aW9uKHN0cnVjdCBhaGRfc29mdGMgKmFoZCwKIAkJCQkJICB1X2ludCBhZGFwdGVyX2NvbnRyb2wpOwogc3RhdGljIHZvaWQJYWhkX3BjaV9zcGxpdF9pbnRyKHN0cnVjdCBhaGRfc29mdGMgKmFoZCwgdV9pbnQgaW50c3RhdCk7CitzdGF0aWMgdm9pZAlhaGRfcGNpX2ludHIoc3RydWN0IGFoZF9zb2Z0YyAqYWhkKTsKIAogc3RydWN0IGFoZF9wY2lfaWRlbnRpdHkgKgogYWhkX2ZpbmRfcGNpX2RldmljZShhaGRfZGV2X3NvZnRjX3QgcGNpKQpAQCAtNzU3LDcgKzc1OCw3IEBACiAJIiVzOiBBZGRyZXNzIG9yIFdyaXRlIFBoYXNlIFBhcml0eSBFcnJvciBEZXRlY3RlZCBpbiAlcy5cbiIKIH07CiAKLXZvaWQKK3N0YXRpYyB2b2lkCiBhaGRfcGNpX2ludHIoc3RydWN0IGFoZF9zb2Z0YyAqYWhkKQogewogCXVpbnQ4X3QJCXBjaV9zdGF0dXNbOF07CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYWljN3h4eC9haWM3OXh4X3Byb2MuYyBiL2RyaXZlcnMvc2NzaS9haWM3eHh4L2FpYzc5eHhfcHJvYy5jCmluZGV4IGM1ZjBlZTUuLjZiMjhiZWIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9haWM3eHh4L2FpYzc5eHhfcHJvYy5jCisrKyBiL2RyaXZlcnMvc2NzaS9haWM3eHh4L2FpYzc5eHhfcHJvYy5jCkBAIC0xMzYsNyArMTM2LDcgQEAKIAlyZXR1cm4gKGxlbik7CiB9CiAKLXZvaWQKK3N0YXRpYyB2b2lkCiBhaGRfZm9ybWF0X3RyYW5zaW5mbyhzdHJ1Y3QgaW5mb19zdHIgKmluZm8sIHN0cnVjdCBhaGRfdHJhbnNpbmZvICp0aW5mbykKIHsKIAl1X2ludCBzcGVlZDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9haWM3eHh4L2FpYzd4eHguaCBiL2RyaXZlcnMvc2NzaS9haWM3eHh4L2FpYzd4eHguaAppbmRleCA2MmZmOGMzLi45NTRjN2MyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvYWljN3h4eC9haWM3eHh4LmgKKysrIGIvZHJpdmVycy9zY3NpL2FpYzd4eHgvYWljN3h4eC5oCkBAIC01NCwxNCArNTQsNiBAQAogc3RydWN0IHNlZXByb21fZGVzY3JpcHRvcjsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBVc2VmdWwgTWFjcm9zICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNpZm5kZWYgTUFYCi0jZGVmaW5lIE1BWChhLGIpICgoKGEpID4gKGIpKSA/IChhKSA6IChiKSkKLSNlbmRpZgotCi0jaWZuZGVmIE1JTgotI2RlZmluZSBNSU4oYSxiKSAoKChhKSA8IChiKSkgPyAoYSkgOiAoYikpCi0jZW5kaWYKLQogI2lmbmRlZiBUUlVFCiAjZGVmaW5lIFRSVUUgMQogI2VuZGlmCkBAIC0xMTM1LDggKzExMjcsNiBAQAogCWNoYXIJCQkqbmFtZTsKIAlhaGNfZGV2aWNlX3NldHVwX3QJKnNldHVwOwogfTsKLWV4dGVybiBzdHJ1Y3QgYWhjX3BjaV9pZGVudGl0eSBhaGNfcGNpX2lkZW50X3RhYmxlW107Ci1leHRlcm4gY29uc3QgdV9pbnQgYWhjX251bV9wY2lfZGV2czsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqIFZML0VJU0EgRGVjbGFyYXRpb25zICoqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHN0cnVjdCBhaWM3NzcwX2lkZW50aXR5IHsKQEAgLTEyODksNiArMTI3OSw3IEBACiB9IGFoY19xdWV1ZV9hbGc7CiAKIHZvaWQJCQlhaGNfc2V0X3RhZ3Moc3RydWN0IGFoY19zb2Z0YyAqYWhjLAorCQkJCSAgICAgc3RydWN0IHNjc2lfY21uZCAqY21kLAogCQkJCSAgICAgc3RydWN0IGFoY19kZXZpbmZvICpkZXZpbmZvLAogCQkJCSAgICAgYWhjX3F1ZXVlX2FsZyBhbGcpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYWljN3h4eC9haWM3eHh4X2NvcmUuYyBiL2RyaXZlcnMvc2NzaS9haWM3eHh4L2FpYzd4eHhfY29yZS5jCmluZGV4IDkzZTRlNDA5Li41MGVmNzg1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvYWljN3h4eC9haWM3eHh4X2NvcmUuYworKysgYi9kcml2ZXJzL3Njc2kvYWljN3h4eC9haWM3eHh4X2NvcmUuYwpAQCAtMTY3MSw3ICsxNjcxLDcgQEAKIAkJdHJhbnNpbmZvID0gJnRpbmZvLT5nb2FsOwogCSpwcHJfb3B0aW9ucyAmPSB0cmFuc2luZm8tPnBwcl9vcHRpb25zOwogCWlmICh0cmFuc2luZm8tPndpZHRoID09IE1TR19FWFRfV0RUUl9CVVNfOF9CSVQpIHsKLQkJbWF4c3luYyA9IE1BWChtYXhzeW5jLCBBSENfU1lOQ1JBVEVfVUxUUkEyKTsKKwkJbWF4c3luYyA9IG1heChtYXhzeW5jLCAodV9pbnQpQUhDX1NZTkNSQVRFX1VMVFJBMik7CiAJCSpwcHJfb3B0aW9ucyAmPSB+TVNHX0VYVF9QUFJfRFRfUkVROwogCX0KIAlpZiAodHJhbnNpbmZvLT5wZXJpb2QgPT0gMCkgewpAQCAtMTY3OSw3ICsxNjc5LDcgQEAKIAkJKnBwcl9vcHRpb25zID0gMDsKIAkJcmV0dXJuIChOVUxMKTsKIAl9Ci0JKnBlcmlvZCA9IE1BWCgqcGVyaW9kLCB0cmFuc2luZm8tPnBlcmlvZCk7CisJKnBlcmlvZCA9IG1heCgqcGVyaW9kLCAodV9pbnQpdHJhbnNpbmZvLT5wZXJpb2QpOwogCXJldHVybiAoYWhjX2ZpbmRfc3luY3JhdGUoYWhjLCBwZXJpb2QsIHBwcl9vcHRpb25zLCBtYXhzeW5jKSk7CiB9CiAKQEAgLTE4MDQsMTIgKzE4MDQsMTIgQEAKIAkJZWxzZQogCQkJbWF4b2Zmc2V0ID0gTUFYX09GRlNFVF84QklUOwogCX0KLQkqb2Zmc2V0ID0gTUlOKCpvZmZzZXQsIG1heG9mZnNldCk7CisJKm9mZnNldCA9IG1pbigqb2Zmc2V0LCBtYXhvZmZzZXQpOwogCWlmICh0aW5mbyAhPSBOVUxMKSB7CiAJCWlmIChyb2xlID09IFJPTEVfVEFSR0VUKQotCQkJKm9mZnNldCA9IE1JTigqb2Zmc2V0LCB0aW5mby0+dXNlci5vZmZzZXQpOworCQkJKm9mZnNldCA9IG1pbigqb2Zmc2V0LCAodV9pbnQpdGluZm8tPnVzZXIub2Zmc2V0KTsKIAkJZWxzZQotCQkJKm9mZnNldCA9IE1JTigqb2Zmc2V0LCB0aW5mby0+Z29hbC5vZmZzZXQpOworCQkJKm9mZnNldCA9IG1pbigqb2Zmc2V0LCAodV9pbnQpdGluZm8tPmdvYWwub2Zmc2V0KTsKIAl9CiB9CiAKQEAgLTE4MzUsOSArMTgzNSw5IEBACiAJfQogCWlmICh0aW5mbyAhPSBOVUxMKSB7CiAJCWlmIChyb2xlID09IFJPTEVfVEFSR0VUKQotCQkJKmJ1c193aWR0aCA9IE1JTih0aW5mby0+dXNlci53aWR0aCwgKmJ1c193aWR0aCk7CisJCQkqYnVzX3dpZHRoID0gbWluKCh1X2ludCl0aW5mby0+dXNlci53aWR0aCwgKmJ1c193aWR0aCk7CiAJCWVsc2UKLQkJCSpidXNfd2lkdGggPSBNSU4odGluZm8tPmdvYWwud2lkdGgsICpidXNfd2lkdGgpOworCQkJKmJ1c193aWR0aCA9IG1pbigodV9pbnQpdGluZm8tPmdvYWwud2lkdGgsICpidXNfd2lkdGgpOwogCX0KIH0KIApAQCAtMTk4Niw3ICsxOTg2LDcgQEAKIAkJdGluZm8tPmN1cnIucHByX29wdGlvbnMgPSBwcHJfb3B0aW9uczsKIAogCQlhaGNfc2VuZF9hc3luYyhhaGMsIGRldmluZm8tPmNoYW5uZWwsIGRldmluZm8tPnRhcmdldCwKLQkJCSAgICAgICBDQU1fTFVOX1dJTERDQVJELCBBQ19UUkFOU0ZFUl9ORUcsIE5VTEwpOworCQkJICAgICAgIENBTV9MVU5fV0lMRENBUkQsIEFDX1RSQU5TRkVSX05FRyk7CiAJCWlmIChib290dmVyYm9zZSkgewogCQkJaWYgKG9mZnNldCAhPSAwKSB7CiAJCQkJcHJpbnRmKCIlczogdGFyZ2V0ICVkIHN5bmNocm9ub3VzIGF0ICVzTUh6JXMsICIKQEAgLTIwNTYsNyArMjA1Niw3IEBACiAJCXRpbmZvLT5jdXJyLndpZHRoID0gd2lkdGg7CiAKIAkJYWhjX3NlbmRfYXN5bmMoYWhjLCBkZXZpbmZvLT5jaGFubmVsLCBkZXZpbmZvLT50YXJnZXQsCi0JCQkgICAgICAgQ0FNX0xVTl9XSUxEQ0FSRCwgQUNfVFJBTlNGRVJfTkVHLCBOVUxMKTsKKwkJCSAgICAgICBDQU1fTFVOX1dJTERDQVJELCBBQ19UUkFOU0ZFUl9ORUcpOwogCQlpZiAoYm9vdHZlcmJvc2UpIHsKIAkJCXByaW50ZigiJXM6IHRhcmdldCAlZCB1c2luZyAlZGJpdCB0cmFuc2ZlcnNcbiIsCiAJCQkgICAgICAgYWhjX25hbWUoYWhjKSwgZGV2aW5mby0+dGFyZ2V0LApAQCAtMjA3NCwxMiArMjA3NCwxNCBAQAogICogVXBkYXRlIHRoZSBjdXJyZW50IHN0YXRlIG9mIHRhZ2dlZCBxdWV1aW5nIGZvciBhIGdpdmVuIHRhcmdldC4KICAqLwogdm9pZAotYWhjX3NldF90YWdzKHN0cnVjdCBhaGNfc29mdGMgKmFoYywgc3RydWN0IGFoY19kZXZpbmZvICpkZXZpbmZvLAotCSAgICAgYWhjX3F1ZXVlX2FsZyBhbGcpCithaGNfc2V0X3RhZ3Moc3RydWN0IGFoY19zb2Z0YyAqYWhjLCBzdHJ1Y3Qgc2NzaV9jbW5kICpjbWQsCisJICAgICBzdHJ1Y3QgYWhjX2RldmluZm8gKmRldmluZm8sIGFoY19xdWV1ZV9hbGcgYWxnKQogewotIAlhaGNfcGxhdGZvcm1fc2V0X3RhZ3MoYWhjLCBkZXZpbmZvLCBhbGcpOworCXN0cnVjdCBzY3NpX2RldmljZSAqc2RldiA9IGNtZC0+ZGV2aWNlOworCisgCWFoY19wbGF0Zm9ybV9zZXRfdGFncyhhaGMsIHNkZXYsIGRldmluZm8sIGFsZyk7CiAgCWFoY19zZW5kX2FzeW5jKGFoYywgZGV2aW5mby0+Y2hhbm5lbCwgZGV2aW5mby0+dGFyZ2V0LAotIAkJICAgICAgIGRldmluZm8tPmx1biwgQUNfVFJBTlNGRVJfTkVHLCAmYWxnKTsKKyAJCSAgICAgICBkZXZpbmZvLT5sdW4sIEFDX1RSQU5TRkVSX05FRyk7CiB9CiAKIC8qCkBAIC0zNDg5LDcgKzM0OTEsNyBAQAogCQkJcHJpbnRmKCIoJXM6JWM6JWQ6JWQpOiByZWZ1c2VzIHRhZ2dlZCBjb21tYW5kcy4gICIKIAkJCSAgICAgICAiUGVyZm9ybWluZyBub24tdGFnZ2VkIEkvT1xuIiwgYWhjX25hbWUoYWhjKSwKIAkJCSAgICAgICBkZXZpbmZvLT5jaGFubmVsLCBkZXZpbmZvLT50YXJnZXQsIGRldmluZm8tPmx1bik7Ci0JCQlhaGNfc2V0X3RhZ3MoYWhjLCBkZXZpbmZvLCBBSENfUVVFVUVfTk9ORSk7CisJCQlhaGNfc2V0X3RhZ3MoYWhjLCBzY2ItPmlvX2N0eCwgZGV2aW5mbywgQUhDX1FVRVVFX05PTkUpOwogCQkJbWFzayA9IH4weDIzOwogCQl9IGVsc2UgewogCQkJcHJpbnRmKCIoJXM6JWM6JWQ6JWQpOiByZWZ1c2VzICVzIHRhZ2dlZCBjb21tYW5kcy4gICIKQEAgLTM0OTcsNyArMzQ5OSw3IEBACiAJCQkgICAgICAgYWhjX25hbWUoYWhjKSwgZGV2aW5mby0+Y2hhbm5lbCwgZGV2aW5mby0+dGFyZ2V0LAogCQkJICAgICAgIGRldmluZm8tPmx1biwgdGFnX3R5cGUgPT0gTVNHX09SREVSRURfVEFTSwogCQkJICAgICAgID8gIm9yZGVyZWQiIDogImhlYWQgb2YgcXVldWUiKTsKLQkJCWFoY19zZXRfdGFncyhhaGMsIGRldmluZm8sIEFIQ19RVUVVRV9CQVNJQyk7CisJCQlhaGNfc2V0X3RhZ3MoYWhjLCBzY2ItPmlvX2N0eCwgZGV2aW5mbywgQUhDX1FVRVVFX0JBU0lDKTsKIAkJCW1hc2sgPSB+MHgwMzsKIAkJfQogCkBAIC0zNzYzLDcgKzM3NjUsNyBAQAogCQogCWlmIChzdGF0dXMgIT0gQ0FNX1NFTF9USU1FT1VUKQogCQlhaGNfc2VuZF9hc3luYyhhaGMsIGRldmluZm8tPmNoYW5uZWwsIGRldmluZm8tPnRhcmdldCwKLQkJCSAgICAgICBDQU1fTFVOX1dJTERDQVJELCBBQ19TRU5UX0JEUiwgTlVMTCk7CisJCQkgICAgICAgQ0FNX0xVTl9XSUxEQ0FSRCwgQUNfU0VOVF9CRFIpOwogCiAJaWYgKG1lc3NhZ2UgIT0gTlVMTAogCSAmJiAodmVyYm9zZV9sZXZlbCA8PSBib290dmVyYm9zZSkpCkBAIC00NDA2LDcgKzQ0MDgsNyBAQAogCXBoeXNhZGRyID0gc2dfbWFwLT5zZ19waHlzYWRkcjsKIAogCW5ld2NvdW50ID0gKFBBR0VfU0laRSAvIChBSENfTlNFRyAqIHNpemVvZihzdHJ1Y3QgYWhjX2RtYV9zZWcpKSk7Ci0JbmV3Y291bnQgPSBNSU4obmV3Y291bnQsIChBSENfU0NCX01BWF9BTExPQyAtIHNjYl9kYXRhLT5udW1zY2JzKSk7CisJbmV3Y291bnQgPSBtaW4obmV3Y291bnQsIChBSENfU0NCX01BWF9BTExPQyAtIHNjYl9kYXRhLT5udW1zY2JzKSk7CiAJZm9yIChpID0gMDsgaSA8IG5ld2NvdW50OyBpKyspIHsKIAkJc3RydWN0IHNjYl9wbGF0Zm9ybV9kYXRhICpwZGF0YTsKICNpZm5kZWYgX19saW51eF9fCkBAIC02MDE4LDcgKzYwMjAsNyBAQAogI2VuZGlmCiAJLyogTm90aWZ5IHRoZSBYUFQgdGhhdCBhIGJ1cyByZXNldCBvY2N1cnJlZCAqLwogCWFoY19zZW5kX2FzeW5jKGFoYywgZGV2aW5mby5jaGFubmVsLCBDQU1fVEFSR0VUX1dJTERDQVJELAotCQkgICAgICAgQ0FNX0xVTl9XSUxEQ0FSRCwgQUNfQlVTX1JFU0VULCBOVUxMKTsKKwkJICAgICAgIENBTV9MVU5fV0lMRENBUkQsIEFDX0JVU19SRVNFVCk7CiAKIAkvKgogCSAqIFJldmVydCB0byBhc3luYy9uYXJyb3cgdHJhbnNmZXJzIHVudGlsIHdlIHJlbmVnb3RpYXRlLgpAQCAtNjQ0Miw3ICs2NDQ0LDcgQEAKIAkJCWlmIChza2lwX2FkZHIgPiBpKSB7CiAJCQkJaW50IGVuZF9hZGRyOwogCi0JCQkJZW5kX2FkZHIgPSBNSU4oYWRkcmVzcywgc2tpcF9hZGRyKTsKKwkJCQllbmRfYWRkciA9IG1pbihhZGRyZXNzLCBza2lwX2FkZHIpOwogCQkJCWFkZHJlc3Nfb2Zmc2V0ICs9IGVuZF9hZGRyIC0gaTsKIAkJCQlpID0gc2tpcF9hZGRyOwogCQkJfSBlbHNlIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9haWM3eHh4L2FpYzd4eHhfb3NtLmMgYi9kcml2ZXJzL3Njc2kvYWljN3h4eC9haWM3eHh4X29zbS5jCmluZGV4IDQzYWI3NTMuLjY2MGYyNmUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9haWM3eHh4L2FpYzd4eHhfb3NtLmMKKysrIGIvZHJpdmVycy9zY3NpL2FpYzd4eHgvYWljN3h4eF9vc20uYwpAQCAtMzI4LDcgKzMyOCw3IEBACiAgKiBmb3JjZSBhbGwgb3V0c3RhbmRpbmcgdHJhbnNhY3Rpb25zIHRvIGJlIHNlcnZpY2VkIHByaW9yIHRvIGEgbmV3CiAgKiB0cmFuc2FjdGlvbi4KICAqLwotdWludDMyX3QgYWljN3h4eF9wZXJpb2RpY19vdGFnOworc3RhdGljIHVpbnQzMl90IGFpYzd4eHhfcGVyaW9kaWNfb3RhZzsKIAogLyoKICAqIE1vZHVsZSBpbmZvcm1hdGlvbiBhbmQgc2V0dGFibGUgb3B0aW9ucy4KQEAgLTUxMiw3ICs1MTIsNiBAQAogCXN0cnVjdCBzZWVwcm9tX2NvbmZpZyAqc2MgPSBhaGMtPnNlZXBfY29uZmlnOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJc3RydWN0IHNjc2lfdGFyZ2V0ICoqYWhjX3RhcmdwID0gYWhjX2xpbnV4X3RhcmdldF9pbl9zb2Z0YyhzdGFyZ2V0KTsKLQlzdHJ1Y3QgYWhjX2xpbnV4X3RhcmdldCAqdGFyZyA9IHNjc2lfdHJhbnNwb3J0X3RhcmdldF9kYXRhKHN0YXJnZXQpOwogCXVuc2lnbmVkIHNob3J0IHNjc2lyYXRlOwogCXN0cnVjdCBhaGNfZGV2aW5mbyBkZXZpbmZvOwogCXN0cnVjdCBhaGNfaW5pdGlhdG9yX3RpbmZvICp0aW5mbzsKQEAgLTUzMyw3ICs1MzIsNiBAQAogCUJVR19PTigqYWhjX3RhcmdwICE9IE5VTEwpOwogCiAJKmFoY190YXJncCA9IHN0YXJnZXQ7Ci0JbWVtc2V0KHRhcmcsIDAsIHNpemVvZigqdGFyZykpOwogCiAJaWYgKHNjKSB7CiAJCWludCBtYXhzeW5jID0gQUhDX1NZTkNSQVRFX0RUOwpAQCAtNTk0LDE0ICs1OTIsMTEgQEAKIAlzdHJ1Y3QJYWhjX3NvZnRjICphaGMgPQogCQkqKChzdHJ1Y3QgYWhjX3NvZnRjICoqKXNkZXYtPmhvc3QtPmhvc3RkYXRhKTsKIAlzdHJ1Y3Qgc2NzaV90YXJnZXQgKnN0YXJnZXQgPSBzZGV2LT5zZGV2X3RhcmdldDsKLQlzdHJ1Y3QgYWhjX2xpbnV4X3RhcmdldCAqdGFyZyA9IHNjc2lfdHJhbnNwb3J0X3RhcmdldF9kYXRhKHN0YXJnZXQpOwogCXN0cnVjdCBhaGNfbGludXhfZGV2aWNlICpkZXY7CiAKIAlpZiAoYm9vdHZlcmJvc2UpCiAJCXByaW50ZigiJXM6IFNsYXZlIEFsbG9jICVkXG4iLCBhaGNfbmFtZShhaGMpLCBzZGV2LT5pZCk7CiAKLQlCVUdfT04odGFyZy0+c2RldltzZGV2LT5sdW5dICE9IE5VTEwpOwotCiAJZGV2ID0gc2NzaV90cmFuc3BvcnRfZGV2aWNlX2RhdGEoc2Rldik7CiAJbWVtc2V0KGRldiwgMCwgc2l6ZW9mKCpkZXYpKTsKIApAQCAtNjE4LDggKzYxMyw2IEBACiAJICovCiAJZGV2LT5tYXh0YWdzID0gMDsKIAkKLQl0YXJnLT5zZGV2W3NkZXYtPmx1bl0gPSBzZGV2OwotCiAJc3BpX3BlcmlvZChzdGFyZ2V0KSA9IDA7CiAKIAlyZXR1cm4gMDsKQEAgLTY0NCwyMiArNjM3LDYgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHZvaWQKLWFoY19saW51eF9zbGF2ZV9kZXN0cm95KHN0cnVjdCBzY3NpX2RldmljZSAqc2RldikKLXsKLQlzdHJ1Y3QJYWhjX3NvZnRjICphaGM7Ci0Jc3RydWN0CWFoY19saW51eF9kZXZpY2UgKmRldiA9IHNjc2lfdHJhbnNwb3J0X2RldmljZV9kYXRhKHNkZXYpOwotCXN0cnVjdAlhaGNfbGludXhfdGFyZ2V0ICp0YXJnID0gc2NzaV90cmFuc3BvcnRfdGFyZ2V0X2RhdGEoc2Rldi0+c2Rldl90YXJnZXQpOwotCi0JYWhjID0gKigoc3RydWN0IGFoY19zb2Z0YyAqKilzZGV2LT5ob3N0LT5ob3N0ZGF0YSk7Ci0JaWYgKGJvb3R2ZXJib3NlKQotCQlwcmludGYoIiVzOiBTbGF2ZSBEZXN0cm95ICVkXG4iLCBhaGNfbmFtZShhaGMpLCBzZGV2LT5pZCk7Ci0KLQlCVUdfT04oZGV2LT5hY3RpdmUpOwotCi0JdGFyZy0+c2RldltzZGV2LT5sdW5dID0gTlVMTDsKLX0KLQogI2lmIGRlZmluZWQoX19pMzg2X18pCiAvKgogICogUmV0dXJuIHRoZSBkaXNrIGdlb21ldHJ5IGZvciB0aGUgZ2l2ZW4gU0NTSSBkZXZpY2UuCkBAIC03NzcsMTEgKzc1NCwxMSBAQAogI2VuZGlmCiAJLmNhbl9xdWV1ZQkJPSBBSENfTUFYX1FVRVVFLAogCS50aGlzX2lkCQk9IC0xLAorCS5tYXhfc2VjdG9ycwkJPSA4MTkyLAogCS5jbWRfcGVyX2x1bgkJPSAyLAogCS51c2VfY2x1c3RlcmluZwkJPSBFTkFCTEVfQ0xVU1RFUklORywKIAkuc2xhdmVfYWxsb2MJCT0gYWhjX2xpbnV4X3NsYXZlX2FsbG9jLAogCS5zbGF2ZV9jb25maWd1cmUJPSBhaGNfbGludXhfc2xhdmVfY29uZmlndXJlLAotCS5zbGF2ZV9kZXN0cm95CQk9IGFoY19saW51eF9zbGF2ZV9kZXN0cm95LAogCS50YXJnZXRfYWxsb2MJCT0gYWhjX2xpbnV4X3RhcmdldF9hbGxvYywKIAkudGFyZ2V0X2Rlc3Ryb3kJCT0gYWhjX2xpbnV4X3RhcmdldF9kZXN0cm95LAogfTsKQEAgLTEyMDMsMjEgKzExODAsMTMgQEAKIGFoY19wbGF0Zm9ybV9mcmVlKHN0cnVjdCBhaGNfc29mdGMgKmFoYykKIHsKIAlzdHJ1Y3Qgc2NzaV90YXJnZXQgKnN0YXJnZXQ7Ci0JaW50IGksIGo7CisJaW50IGk7CiAKIAlpZiAoYWhjLT5wbGF0Zm9ybV9kYXRhICE9IE5VTEwpIHsKIAkJLyogZGVzdHJveSBhbGwgb2YgdGhlIGRldmljZSBhbmQgdGFyZ2V0IG9iamVjdHMgKi8KIAkJZm9yIChpID0gMDsgaSA8IEFIQ19OVU1fVEFSR0VUUzsgaSsrKSB7CiAJCQlzdGFyZ2V0ID0gYWhjLT5wbGF0Zm9ybV9kYXRhLT5zdGFyZ2V0W2ldOwogCQkJaWYgKHN0YXJnZXQgIT0gTlVMTCkgewotCQkJCWZvciAoaiA9IDA7IGogPCBBSENfTlVNX0xVTlM7IGorKykgewotCQkJCQlzdHJ1Y3QgYWhjX2xpbnV4X3RhcmdldCAqdGFyZyA9Ci0JCQkJCQlzY3NpX3RyYW5zcG9ydF90YXJnZXRfZGF0YShzdGFyZ2V0KTsKLQotCQkJCQlpZiAodGFyZy0+c2RldltqXSA9PSBOVUxMKQotCQkJCQkJY29udGludWU7Ci0JCQkJCXRhcmctPnNkZXZbal0gPSBOVUxMOwotCQkJCX0KIAkJCQlhaGMtPnBsYXRmb3JtX2RhdGEtPnN0YXJnZXRbaV0gPSBOVUxMOwogIAkJCX0KICAJCX0KQEAgLTEyNTEsMjQgKzEyMjAsMTMgQEAKIH0KIAogdm9pZAotYWhjX3BsYXRmb3JtX3NldF90YWdzKHN0cnVjdCBhaGNfc29mdGMgKmFoYywgc3RydWN0IGFoY19kZXZpbmZvICpkZXZpbmZvLAotCQkgICAgICBhaGNfcXVldWVfYWxnIGFsZykKK2FoY19wbGF0Zm9ybV9zZXRfdGFncyhzdHJ1Y3QgYWhjX3NvZnRjICphaGMsIHN0cnVjdCBzY3NpX2RldmljZSAqc2RldiwKKwkJICAgICAgc3RydWN0IGFoY19kZXZpbmZvICpkZXZpbmZvLCBhaGNfcXVldWVfYWxnIGFsZykKIHsKLQlzdHJ1Y3Qgc2NzaV90YXJnZXQgKnN0YXJnZXQ7Ci0Jc3RydWN0IGFoY19saW51eF90YXJnZXQgKnRhcmc7CiAJc3RydWN0IGFoY19saW51eF9kZXZpY2UgKmRldjsKLQlzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNkZXY7Ci0JdV9pbnQgdGFyZ2V0X29mZnNldDsKIAlpbnQgd2FzX3F1ZXVpbmc7CiAJaW50IG5vd19xdWV1aW5nOwogCi0JdGFyZ2V0X29mZnNldCA9IGRldmluZm8tPnRhcmdldDsKLQlpZiAoZGV2aW5mby0+Y2hhbm5lbCAhPSAnQScpCi0JCXRhcmdldF9vZmZzZXQgKz0gODsKLQlzdGFyZ2V0ID0gYWhjLT5wbGF0Zm9ybV9kYXRhLT5zdGFyZ2V0W3RhcmdldF9vZmZzZXRdOwotCXRhcmcgPSBzY3NpX3RyYW5zcG9ydF90YXJnZXRfZGF0YShzdGFyZ2V0KTsKLQlCVUdfT04odGFyZyA9PSBOVUxMKTsKLQlzZGV2ID0gdGFyZy0+c2RldltkZXZpbmZvLT5sdW5dOwogCWlmIChzZGV2ID09IE5VTEwpCiAJCXJldHVybjsKIAlkZXYgPSBzY3NpX3RyYW5zcG9ydF9kZXZpY2VfZGF0YShzZGV2KTsKQEAgLTE0MDEsMTEgKzEzNTksMTUgQEAKIAl0YWdzID0gYWhjX2xpbnV4X3VzZXJfdGFnZGVwdGgoYWhjLCAmZGV2aW5mbyk7CiAJaWYgKHRhZ3MgIT0gMCAmJiBzZGV2LT50YWdnZWRfc3VwcG9ydGVkICE9IDApIHsKIAotCQlhaGNfc2V0X3RhZ3MoYWhjLCAmZGV2aW5mbywgQUhDX1FVRVVFX1RBR0dFRCk7CisJCWFoY19wbGF0Zm9ybV9zZXRfdGFncyhhaGMsIHNkZXYsICZkZXZpbmZvLCBBSENfUVVFVUVfVEFHR0VEKTsKKwkJYWhjX3NlbmRfYXN5bmMoYWhjLCBkZXZpbmZvLmNoYW5uZWwsIGRldmluZm8udGFyZ2V0LAorCQkJICAgICAgIGRldmluZm8ubHVuLCBBQ19UUkFOU0ZFUl9ORUcpOwogCQlhaGNfcHJpbnRfZGV2aW5mbyhhaGMsICZkZXZpbmZvKTsKIAkJcHJpbnRmKCJUYWdnZWQgUXVldWluZyBlbmFibGVkLiAgRGVwdGggJWRcbiIsIHRhZ3MpOwogCX0gZWxzZSB7Ci0JCWFoY19zZXRfdGFncyhhaGMsICZkZXZpbmZvLCBBSENfUVVFVUVfTk9ORSk7CisJCWFoY19wbGF0Zm9ybV9zZXRfdGFncyhhaGMsIHNkZXYsICZkZXZpbmZvLCBBSENfUVVFVUVfTk9ORSk7CisJCWFoY19zZW5kX2FzeW5jKGFoYywgZGV2aW5mby5jaGFubmVsLCBkZXZpbmZvLnRhcmdldCwKKwkJCSAgICAgICBkZXZpbmZvLmx1biwgQUNfVFJBTlNGRVJfTkVHKTsKIAl9CiB9CiAKQEAgLTE2MjksNyArMTU5MSw3IEBACiAKIHZvaWQKIGFoY19zZW5kX2FzeW5jKHN0cnVjdCBhaGNfc29mdGMgKmFoYywgY2hhciBjaGFubmVsLAotCSAgICAgICB1X2ludCB0YXJnZXQsIHVfaW50IGx1biwgYWNfY29kZSBjb2RlLCB2b2lkICphcmcpCisJICAgICAgIHVfaW50IHRhcmdldCwgdV9pbnQgbHVuLCBhY19jb2RlIGNvZGUpCiB7CiAJc3dpdGNoIChjb2RlKSB7CiAJY2FzZSBBQ19UUkFOU0ZFUl9ORUc6CkBAIC0xODc1LDkgKzE4MzcsOSBAQAogCQlpZiAoc2NiLT5mbGFncyAmIFNDQl9TRU5TRSkgewogCQkJdV9pbnQgc2Vuc2Vfc2l6ZTsKIAotCQkJc2Vuc2Vfc2l6ZSA9IE1JTihzaXplb2Yoc3RydWN0IHNjc2lfc2Vuc2VfZGF0YSkKKwkJCXNlbnNlX3NpemUgPSBtaW4oc2l6ZW9mKHN0cnVjdCBzY3NpX3NlbnNlX2RhdGEpCiAJCQkJICAgICAgIC0gYWhjX2dldF9zZW5zZV9yZXNpZHVhbChzY2IpLAotCQkJCQkgc2l6ZW9mKGNtZC0+c2Vuc2VfYnVmZmVyKSk7CisJCQkJCSAodV9sb25nKXNpemVvZihjbWQtPnNlbnNlX2J1ZmZlcikpOwogCQkJbWVtY3B5KGNtZC0+c2Vuc2VfYnVmZmVyLAogCQkJICAgICAgIGFoY19nZXRfc2Vuc2VfYnVmKGFoYywgc2NiKSwgc2Vuc2Vfc2l6ZSk7CiAJCQlpZiAoc2Vuc2Vfc2l6ZSA8IHNpemVvZihjbWQtPnNlbnNlX2J1ZmZlcikpCkBAIC0xOTQ2LDcgKzE5MDgsNyBAQAogCQkJfQogCQkJYWhjX3NldF90cmFuc2FjdGlvbl9zdGF0dXMoc2NiLCBDQU1fUkVRVUVVRV9SRVEpOwogCQkJYWhjX3NldF9zY3NpX3N0YXR1cyhzY2IsIFNDU0lfU1RBVFVTX09LKTsKLQkJCWFoY19wbGF0Zm9ybV9zZXRfdGFncyhhaGMsICZkZXZpbmZvLAorCQkJYWhjX3BsYXRmb3JtX3NldF90YWdzKGFoYywgc2RldiwgJmRldmluZm8sCiAJCQkJICAgICAoZGV2LT5mbGFncyAmIEFIQ19ERVZfUV9CQVNJQykKIAkJCQkgICA/IEFIQ19RVUVVRV9CQVNJQyA6IEFIQ19RVUVVRV9UQUdHRUQpOwogCQkJYnJlYWs7CkBAIC0xOTU3LDcgKzE5MTksNyBAQAogCQkgKi8KIAkJZGV2LT5vcGVuaW5ncyA9IDE7CiAJCWFoY19zZXRfc2NzaV9zdGF0dXMoc2NiLCBTQ1NJX1NUQVRVU19CVVNZKTsKLQkJYWhjX3BsYXRmb3JtX3NldF90YWdzKGFoYywgJmRldmluZm8sCisJCWFoY19wbGF0Zm9ybV9zZXRfdGFncyhhaGMsIHNkZXYsICZkZXZpbmZvLAogCQkJICAgICAoZGV2LT5mbGFncyAmIEFIQ19ERVZfUV9CQVNJQykKIAkJCSAgID8gQUhDX1FVRVVFX0JBU0lDIDogQUhDX1FVRVVFX1RBR0dFRCk7CiAJCWJyZWFrOwpAQCAtMjU5OSw4ICsyNTYxLDYgQEAKIAlpZiAoIWFoY19saW51eF90cmFuc3BvcnRfdGVtcGxhdGUpCiAJCXJldHVybiAtRU5PREVWOwogCi0Jc2NzaV90cmFuc3BvcnRfcmVzZXJ2ZV90YXJnZXQoYWhjX2xpbnV4X3RyYW5zcG9ydF90ZW1wbGF0ZSwKLQkJCQkgICAgICBzaXplb2Yoc3RydWN0IGFoY19saW51eF90YXJnZXQpKTsKIAlzY3NpX3RyYW5zcG9ydF9yZXNlcnZlX2RldmljZShhaGNfbGludXhfdHJhbnNwb3J0X3RlbXBsYXRlLAogCQkJCSAgICAgIHNpemVvZihzdHJ1Y3QgYWhjX2xpbnV4X2RldmljZSkpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYWljN3h4eC9haWM3eHh4X29zbS5oIGIvZHJpdmVycy9zY3NpL2FpYzd4eHgvYWljN3h4eF9vc20uaAppbmRleCBhODdhNGNlLi44NWFlNWQ4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvYWljN3h4eC9haWM3eHh4X29zbS5oCisrKyBiL2RyaXZlcnMvc2NzaS9haWM3eHh4L2FpYzd4eHhfb3NtLmgKQEAgLTI1Niw3ICsyNTYsNiBAQAogCUFIQ19ERVZfUEVSSU9ESUNfT1RBRwkgPSAweDQwLCAvKiBTZW5kIE9UQUcgdG8gcHJldmVudCBzdGFydmF0aW9uICovCiB9IGFoY19saW51eF9kZXZfZmxhZ3M7CiAKLXN0cnVjdCBhaGNfbGludXhfdGFyZ2V0Owogc3RydWN0IGFoY19saW51eF9kZXZpY2UgewogCS8qCiAJICogVGhlIG51bWJlciBvZiB0cmFuc2FjdGlvbnMgY3VycmVudGx5CkBAIC0zMjksMTIgKzMyOCw2IEBACiAjZGVmaW5lIEFIQ19PVEFHX1RIUkVTSAk1MDAKIH07CiAKLXN0cnVjdCBhaGNfbGludXhfdGFyZ2V0IHsKLQlzdHJ1Y3Qgc2NzaV9kZXZpY2UJICpzZGV2W0FIQ19OVU1fTFVOU107Ci0Jc3RydWN0IGFoY190cmFuc2luZm8JICBsYXN0X3RpbmZvOwotCXN0cnVjdCBhaGNfc29mdGMJICphaGM7Ci19OwotCiAvKioqKioqKioqKioqKioqKioqKioqIERlZmluaXRpb25zIFJlcXVpcmVkIGJ5IHRoZSBDb3JlICoqKioqKioqKioqKioqKioqKioqKioqLwogLyoKICAqIE51bWJlciBvZiBTRyBzZWdtZW50cyB3ZSByZXF1aXJlLiAgU28gbG9uZyBhcyB0aGUgUy9HIHNlZ21lbnRzIGZvcgpAQCAtNTMzLDggKzUyNiw2IEBACiAjZGVmaW5lIFBDSVJfU1VCVkVORF8wCTB4MmMKICNkZWZpbmUgUENJUl9TVUJERVZfMAkweDJlCiAKLWV4dGVybiBzdHJ1Y3QgcGNpX2RyaXZlciBhaWM3eHh4X3BjaV9kcml2ZXI7Ci0KIHR5cGVkZWYgZW51bQogewogCUFIQ19QT1dFUl9TVEFURV9EMCwKQEAgLTgyNCw3ICs4MTUsNyBAQAogICAgICAgICB9CiB9CiAKLXZvaWQJYWhjX3BsYXRmb3JtX3NldF90YWdzKHN0cnVjdCBhaGNfc29mdGMgKmFoYywKK3ZvaWQJYWhjX3BsYXRmb3JtX3NldF90YWdzKHN0cnVjdCBhaGNfc29mdGMgKmFoYywgc3RydWN0IHNjc2lfZGV2aWNlICpzZGV2LAogCQkJICAgICAgc3RydWN0IGFoY19kZXZpbmZvICpkZXZpbmZvLCBhaGNfcXVldWVfYWxnKTsKIGludAlhaGNfcGxhdGZvcm1fYWJvcnRfc2NicyhzdHJ1Y3QgYWhjX3NvZnRjICphaGMsIGludCB0YXJnZXQsCiAJCQkJY2hhciBjaGFubmVsLCBpbnQgbHVuLCB1X2ludCB0YWcsCkBAIC04MzQsNyArODI1LDcgQEAKIHZvaWQJYWhjX3BsYXRmb3JtX2ZsdXNod29yayhzdHJ1Y3QgYWhjX3NvZnRjICphaGMpOwogdm9pZAlhaGNfZG9uZShzdHJ1Y3QgYWhjX3NvZnRjKiwgc3RydWN0IHNjYiopOwogdm9pZAlhaGNfc2VuZF9hc3luYyhzdHJ1Y3QgYWhjX3NvZnRjICosIGNoYXIgY2hhbm5lbCwKLQkJICAgICAgIHVfaW50IHRhcmdldCwgdV9pbnQgbHVuLCBhY19jb2RlLCB2b2lkICopOworCQkgICAgICAgdV9pbnQgdGFyZ2V0LCB1X2ludCBsdW4sIGFjX2NvZGUpOwogdm9pZAlhaGNfcHJpbnRfcGF0aChzdHJ1Y3QgYWhjX3NvZnRjICosIHN0cnVjdCBzY2IgKik7CiB2b2lkCWFoY19wbGF0Zm9ybV9kdW1wX2NhcmRfc3RhdGUoc3RydWN0IGFoY19zb2Z0YyAqYWhjKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2FpYzd4eHgvYWljN3h4eF9vc21fcGNpLmMgYi9kcml2ZXJzL3Njc2kvYWljN3h4eC9haWM3eHh4X29zbV9wY2kuYwppbmRleCBkMjBjYTUxLi5lYTU2ODdkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvYWljN3h4eC9haWM3eHh4X29zbV9wY2kuYworKysgYi9kcml2ZXJzL3Njc2kvYWljN3h4eC9haWM3eHh4X29zbV9wY2kuYwpAQCAtMTMwLDcgKzEzMCw3IEBACiAKIE1PRFVMRV9ERVZJQ0VfVEFCTEUocGNpLCBhaGNfbGludXhfcGNpX2lkX3RhYmxlKTsKIAotc3RydWN0IHBjaV9kcml2ZXIgYWljN3h4eF9wY2lfZHJpdmVyID0geworc3RhdGljIHN0cnVjdCBwY2lfZHJpdmVyIGFpYzd4eHhfcGNpX2RyaXZlciA9IHsKIAkubmFtZQkJPSAiYWljN3h4eCIsCiAJLnByb2JlCQk9IGFoY19saW51eF9wY2lfZGV2X3Byb2JlLAogCS5yZW1vdmUJCT0gYWhjX2xpbnV4X3BjaV9kZXZfcmVtb3ZlLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2FpYzd4eHgvYWljN3h4eF9wY2kuYyBiL2RyaXZlcnMvc2NzaS9haWM3eHh4L2FpYzd4eHhfcGNpLmMKaW5kZXggNjNjYWIyZC4uMDljODE3MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2FpYzd4eHgvYWljN3h4eF9wY2kuYworKysgYi9kcml2ZXJzL3Njc2kvYWljN3h4eC9haWM3eHh4X3BjaS5jCkBAIC0xNjgsNyArMTY4LDcgQEAKIHN0YXRpYyBhaGNfZGV2aWNlX3NldHVwX3QgYWhjX2FoYTQ5NFhYX3NldHVwOwogc3RhdGljIGFoY19kZXZpY2Vfc2V0dXBfdCBhaGNfYWhhMzk4WFhfc2V0dXA7CiAKLXN0cnVjdCBhaGNfcGNpX2lkZW50aXR5IGFoY19wY2lfaWRlbnRfdGFibGUgW10gPQorc3RhdGljIHN0cnVjdCBhaGNfcGNpX2lkZW50aXR5IGFoY19wY2lfaWRlbnRfdGFibGUgW10gPQogewogCS8qIGFpYzc4NTAgYmFzZWQgY29udHJvbGxlcnMgKi8KIAl7CkBAIC01NTksNyArNTU5LDcgQEAKIAl9CiB9OwogCi1jb25zdCB1X2ludCBhaGNfbnVtX3BjaV9kZXZzID0gQVJSQVlfU0laRShhaGNfcGNpX2lkZW50X3RhYmxlKTsKK3N0YXRpYyBjb25zdCB1X2ludCBhaGNfbnVtX3BjaV9kZXZzID0gQVJSQVlfU0laRShhaGNfcGNpX2lkZW50X3RhYmxlKTsKIAkJCiAjZGVmaW5lIEFIQ18zOTRYX1NMT1RfQ0hBTk5FTF9BCTQKICNkZWZpbmUgQUhDXzM5NFhfU0xPVF9DSEFOTkVMX0IJNQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2FpYzd4eHgvYWljN3h4eF9wcm9jLmMgYi9kcml2ZXJzL3Njc2kvYWljN3h4eC9haWM3eHh4X3Byb2MuYwppbmRleCA1OTE0YjRhLi45OWU1NDQzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvYWljN3h4eC9haWM3eHh4X3Byb2MuYworKysgYi9kcml2ZXJzL3Njc2kvYWljN3h4eC9haWM3eHh4X3Byb2MuYwpAQCAtMTgyLDcgKzE4Miw2IEBACiAJCSAgICAgIHVfaW50IG91cl9pZCwgY2hhciBjaGFubmVsLCB1X2ludCB0YXJnZXRfaWQsCiAJCSAgICAgIHVfaW50IHRhcmdldF9vZmZzZXQpCiB7Ci0Jc3RydWN0CWFoY19saW51eF90YXJnZXQgKnRhcmc7CiAJc3RydWN0CXNjc2lfdGFyZ2V0ICpzdGFyZ2V0OwogCXN0cnVjdAlhaGNfaW5pdGlhdG9yX3RpbmZvICp0aW5mbzsKIAlzdHJ1Y3QJYWhjX3Rtb2RlX3RzdGF0ZSAqdHN0YXRlOwpAQCAtMTk4LDcgKzE5Nyw2IEBACiAJc3RhcmdldCA9IGFoYy0+cGxhdGZvcm1fZGF0YS0+c3RhcmdldFt0YXJnZXRfb2Zmc2V0XTsKIAlpZiAoIXN0YXJnZXQpCiAJCXJldHVybjsKLQl0YXJnID0gc2NzaV90cmFuc3BvcnRfdGFyZ2V0X2RhdGEoc3RhcmdldCk7CiAKIAljb3B5X2luZm8oaW5mbywgIlx0R29hbDogIik7CiAJYWhjX2Zvcm1hdF90cmFuc2luZm8oaW5mbywgJnRpbmZvLT5nb2FsKTsKQEAgLTIwOCw3ICsyMDYsNyBAQAogCWZvciAobHVuID0gMDsgbHVuIDwgQUhDX05VTV9MVU5TOyBsdW4rKykgewogCQlzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNkZXY7CiAKLQkJc2RldiA9IHRhcmctPnNkZXZbbHVuXTsKKwkJc2RldiA9IHNjc2lfZGV2aWNlX2xvb2t1cF9ieV90YXJnZXQoc3RhcmdldCwgbHVuKTsKIAogCQlpZiAoc2RldiA9PSBOVUxMKQogCQkJY29udGludWU7CkBAIC0zODMsMTEgKzM4MSwxMSBAQAogCX0KIAljb3B5X2luZm8oJmluZm8sICJcbiIpOwogCi0JbWF4X3RhcmcgPSAxNTsKKwltYXhfdGFyZyA9IDE2OwogCWlmICgoYWhjLT5mZWF0dXJlcyAmIChBSENfV0lERXxBSENfVFdJTikpID09IDApCi0JCW1heF90YXJnID0gNzsKKwkJbWF4X3RhcmcgPSA4OwogCi0JZm9yIChpID0gMDsgaSA8PSBtYXhfdGFyZzsgaSsrKSB7CisJZm9yIChpID0gMDsgaSA8IG1heF90YXJnOyBpKyspIHsKIAkJdV9pbnQgb3VyX2lkOwogCQl1X2ludCB0YXJnZXRfaWQ7CiAJCWNoYXIgY2hhbm5lbDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9haWM3eHh4X29sZC5jIGIvZHJpdmVycy9zY3NpL2FpYzd4eHhfb2xkLmMKaW5kZXggYmNkN2ZmZi4uNDZlZWQxMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2FpYzd4eHhfb2xkLmMKKysrIGIvZHJpdmVycy9zY3NpL2FpYzd4eHhfb2xkLmMKQEAgLTI2NDYsNyArMjY0Niw3IEBACiAKIAl3aGlsZSAocC0+Y29tcGxldGVxLmhlYWQgIT0gTlVMTCkgewogCQljbWQgPSBwLT5jb21wbGV0ZXEuaGVhZDsKLQkJcC0+Y29tcGxldGVxLmhlYWQgPSAoc3RydWN0IHNjc2lfQ21uZCAqKSBjbWQtPmhvc3Rfc2NyaWJibGU7CisJCXAtPmNvbXBsZXRlcS5oZWFkID0gKHN0cnVjdCBzY3NpX2NtbmQgKikgY21kLT5ob3N0X3NjcmliYmxlOwogCQljbWQtPmhvc3Rfc2NyaWJibGUgPSBOVUxMOwogCQljbWQtPnNjc2lfZG9uZShjbWQpOwogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9haWM5NHh4L2FpYzk0eHhfaHdpLmMgYi9kcml2ZXJzL3Njc2kvYWljOTR4eC9haWM5NHh4X2h3aS5jCmluZGV4IDNjMmQ3YTMuLmFmN2UwMTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9haWM5NHh4L2FpYzk0eHhfaHdpLmMKKysrIGIvZHJpdmVycy9zY3NpL2FpYzk0eHgvYWljOTR4eF9od2kuYwpAQCAtMTEyLDYgKzExMiwyMSBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgdm9pZCBhc2RfaW5pdF9wb3J0cyhzdHJ1Y3QgYXNkX2hhX3N0cnVjdCAqYXNkX2hhKQoreworCWludCBpOworCisJc3Bpbl9sb2NrX2luaXQoJmFzZF9oYS0+YXNkX3BvcnRzX2xvY2spOworCWZvciAoaSA9IDA7IGkgPCBBU0RfTUFYX1BIWVM7IGkrKykgeworCQlzdHJ1Y3QgYXNkX3BvcnQgKmFzZF9wb3J0ID0gJmFzZF9oYS0+YXNkX3BvcnRzW2ldOworCisJCW1lbXNldChhc2RfcG9ydC0+c2FzX2FkZHIsIDAsIFNBU19BRERSX1NJWkUpOworCQltZW1zZXQoYXNkX3BvcnQtPmF0dGFjaGVkX3Nhc19hZGRyLCAwLCBTQVNfQUREUl9TSVpFKTsKKwkJYXNkX3BvcnQtPnBoeV9tYXNrID0gMDsKKwkJYXNkX3BvcnQtPm51bV9waHlzID0gMDsKKwl9Cit9CisKIHN0YXRpYyBpbnQgYXNkX2luaXRfcGh5cyhzdHJ1Y3QgYXNkX2hhX3N0cnVjdCAqYXNkX2hhKQogewogCXU4IGk7CkBAIC0xMjEsNiArMTM2LDcgQEAKIAkJc3RydWN0IGFzZF9waHkgKnBoeSA9ICZhc2RfaGEtPnBoeXNbaV07CiAKIAkJcGh5LT5waHlfZGVzYyA9ICZhc2RfaGEtPmh3X3Byb2YucGh5X2Rlc2NbaV07CisJCXBoeS0+YXNkX3BvcnQgPSBOVUxMOwogCiAJCXBoeS0+c2FzX3BoeS5lbmFibGVkID0gMDsKIAkJcGh5LT5zYXNfcGh5LmlkID0gaTsKQEAgLTY1OCw2ICs2NzQsOCBAQAogCQlnb3RvIE91dDsKIAl9CiAKKwlhc2RfaW5pdF9wb3J0cyhhc2RfaGEpOworCiAJZXJyID0gYXNkX2luaXRfc2Nicyhhc2RfaGEpOwogCWlmIChlcnIpIHsKIAkJYXNkX3ByaW50aygiY291bGRuJ3QgaW5pdGlhbGl6ZSBzY2JzIGZvciAlc1xuIiwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9haWM5NHh4L2FpYzk0eHhfaHdpLmggYi9kcml2ZXJzL3Njc2kvYWljOTR4eC9haWM5NHh4X2h3aS5oCmluZGV4IDE0MzE5ZDEuLmM2YzNkMTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9haWM5NHh4L2FpYzk0eHhfaHdpLmgKKysrIGIvZHJpdmVycy9zY3NpL2FpYzk0eHgvYWljOTR4eF9od2kuaApAQCAtNDYsNiArNDYsNyBAQAogI2RlZmluZSBQQ0lfREVWSUNFX0lEX0FEQVBURUMyX1JBWk9SMTAgMHg0MTAKICNkZWZpbmUgUENJX0RFVklDRV9JRF9BREFQVEVDMl9SQVpPUjEyIDB4NDEyCiAjZGVmaW5lIFBDSV9ERVZJQ0VfSURfQURBUFRFQzJfUkFaT1IxRSAweDQxRQorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0FEQVBURUMyX1JBWk9SMUYgMHg0MUYKICNkZWZpbmUgUENJX0RFVklDRV9JRF9BREFQVEVDMl9SQVpPUjMwIDB4NDMwCiAjZGVmaW5lIFBDSV9ERVZJQ0VfSURfQURBUFRFQzJfUkFaT1IzMiAweDQzMgogI2RlZmluZSBQQ0lfREVWSUNFX0lEX0FEQVBURUMyX1JBWk9SM0UgMHg0M0UKQEAgLTE5Miw2ICsxOTMsMTYgQEAKIAlzdHJ1Y3QgYXNkX2FzY2IgKiplc2NiX2FycjsgLyogYXJyYXkgb2YgcG9pbnRlcnMgdG8gZXNjYnMgKi8KIH07CiAKKy8qIFRoaXMgaXMgYW4gaW50ZXJuYWwgcG9ydCBzdHJ1Y3R1cmUuIFRoZXNlIGFyZSB1c2VkIHRvIGdldCBhY2N1cmF0ZQorICogcGh5X21hc2sgZm9yIHVwZGF0aW5nIEREQiAwLgorICovCitzdHJ1Y3QgYXNkX3BvcnQgeworCXU4ICBzYXNfYWRkcltTQVNfQUREUl9TSVpFXTsKKwl1OCAgYXR0YWNoZWRfc2FzX2FkZHJbU0FTX0FERFJfU0laRV07CisJdTMyIHBoeV9tYXNrOworCWludCBudW1fcGh5czsKK307CisKIC8qIFRoaXMgaXMgdGhlIEhvc3QgQWRhcHRlciBzdHJ1Y3R1cmUuICBJdCBkZXNjcmliZXMgdGhlIGhhcmR3YXJlCiAgKiBTQVMgYWRhcHRlci4KICAqLwpAQCAtMjEwLDYgKzIyMSw4IEBACiAJc3RydWN0IGh3X3Byb2ZpbGUgaHdfcHJvZjsKIAogCXN0cnVjdCBhc2RfcGh5ICAgIHBoeXNbQVNEX01BWF9QSFlTXTsKKwlzcGlubG9ja190ICAgICAgICBhc2RfcG9ydHNfbG9jazsKKwlzdHJ1Y3QgYXNkX3BvcnQgICBhc2RfcG9ydHNbQVNEX01BWF9QSFlTXTsKIAlzdHJ1Y3QgYXNkX3Nhc19wb3J0ICAgcG9ydHNbQVNEX01BWF9QSFlTXTsKIAogCXN0cnVjdCBkbWFfcG9vbCAgKnNjYl9wb29sOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2FpYzk0eHgvYWljOTR4eF9pbml0LmMgYi9kcml2ZXJzL3Njc2kvYWljOTR4eC9haWM5NHh4X2luaXQuYwppbmRleCAzYTViYmJhLi40MjMwMmVmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvYWljOTR4eC9haWM5NHh4X2luaXQuYworKysgYi9kcml2ZXJzL3Njc2kvYWljOTR4eC9haWM5NHh4X2luaXQuYwpAQCAtNzk1LDggKzc5NSw2IEBACiB9CiAKIHN0YXRpYyBzdHJ1Y3Qgc2FzX2RvbWFpbl9mdW5jdGlvbl90ZW1wbGF0ZSBhaWM5NHh4X3RyYW5zcG9ydF9mdW5jdGlvbnMgPSB7Ci0JLmxsZGRfcG9ydF9mb3JtZWQJPSBhc2RfdXBkYXRlX3BvcnRfbGlua3MsCi0KIAkubGxkZF9kZXZfZm91bmQJCT0gYXNkX2Rldl9mb3VuZCwKIAkubGxkZF9kZXZfZ29uZQkJPSBhc2RfZGV2X2dvbmUsCiAKQEAgLTgyMyw2ICs4MjEsOCBAQAogCSAwLCAwLCAxfSwKIAl7UENJX0RFVklDRShQQ0lfVkVORE9SX0lEX0FEQVBURUMyLCBQQ0lfREVWSUNFX0lEX0FEQVBURUMyX1JBWk9SMUUpLAogCSAwLCAwLCAxfSwKKwl7UENJX0RFVklDRShQQ0lfVkVORE9SX0lEX0FEQVBURUMyLCBQQ0lfREVWSUNFX0lEX0FEQVBURUMyX1JBWk9SMUYpLAorCSAwLCAwLCAxfSwKIAl7UENJX0RFVklDRShQQ0lfVkVORE9SX0lEX0FEQVBURUMyLCBQQ0lfREVWSUNFX0lEX0FEQVBURUMyX1JBWk9SMzApLAogCSAwLCAwLCAyfSwKIAl7UENJX0RFVklDRShQQ0lfVkVORE9SX0lEX0FEQVBURUMyLCBQQ0lfREVWSUNFX0lEX0FEQVBURUMyX1JBWk9SMzIpLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2FpYzk0eHgvYWljOTR4eF9zYXMuaCBiL2RyaXZlcnMvc2NzaS9haWM5NHh4L2FpYzk0eHhfc2FzLmgKaW5kZXggNjRkMjMxNy4uOTA1MGU5MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2FpYzk0eHgvYWljOTR4eF9zYXMuaAorKysgYi9kcml2ZXJzL3Njc2kvYWljOTR4eC9haWM5NHh4X3Nhcy5oCkBAIC03MzMsNiArNzMzLDcgQEAKIAogCXN0cnVjdCBzYXNfaWRlbnRpZnlfZnJhbWUgKmlkZW50aWZ5X2ZyYW1lOwogCXN0cnVjdCBhc2RfZG1hX3RvayAgKmlkX2ZybV90b2s7CisJc3RydWN0IGFzZF9wb3J0ICAgICAqYXNkX3BvcnQ7CiAKIAl1OCAgICAgICAgIGZyYW1lX3JjdmRbQVNEX0VEQl9TSVpFXTsKIH07CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYWljOTR4eC9haWM5NHh4X3NjYi5jIGIvZHJpdmVycy9zY3NpL2FpYzk0eHgvYWljOTR4eF9zY2IuYwppbmRleCA1MmM2ZWE0Li4xNGQ1ZDhjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvYWljOTR4eC9haWM5NHh4X3NjYi5jCisrKyBiL2RyaXZlcnMvc2NzaS9haWM5NHh4L2FpYzk0eHhfc2NiLmMKQEAgLTE2OSw2ICsxNjksNzAgQEAKIAl9CiB9CiAKK3N0YXRpYyB2b2lkIGFzZF9mb3JtX3BvcnQoc3RydWN0IGFzZF9oYV9zdHJ1Y3QgKmFzZF9oYSwgc3RydWN0IGFzZF9waHkgKnBoeSkKK3sKKwlpbnQgaTsKKwlzdHJ1Y3QgYXNkX3BvcnQgKmZyZWVfcG9ydCA9IE5VTEw7CisJc3RydWN0IGFzZF9wb3J0ICpwb3J0OworCXN0cnVjdCBhc2Rfc2FzX3BoeSAqc2FzX3BoeSA9ICZwaHktPnNhc19waHk7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZhc2RfaGEtPmFzZF9wb3J0c19sb2NrLCBmbGFncyk7CisJaWYgKCFwaHktPmFzZF9wb3J0KSB7CisJCWZvciAoaSA9IDA7IGkgPCBBU0RfTUFYX1BIWVM7IGkrKykgeworCQkJcG9ydCA9ICZhc2RfaGEtPmFzZF9wb3J0c1tpXTsKKworCQkJLyogQ2hlY2sgZm9yIHdpZGUgcG9ydCAqLworCQkJaWYgKHBvcnQtPm51bV9waHlzID4gMCAmJgorCQkJICAgIG1lbWNtcChwb3J0LT5zYXNfYWRkciwgc2FzX3BoeS0+c2FzX2FkZHIsCisJCQkJICAgU0FTX0FERFJfU0laRSkgPT0gMCAmJgorCQkJICAgIG1lbWNtcChwb3J0LT5hdHRhY2hlZF9zYXNfYWRkciwKKwkJCQkgICBzYXNfcGh5LT5hdHRhY2hlZF9zYXNfYWRkciwKKwkJCQkgICBTQVNfQUREUl9TSVpFKSA9PSAwKSB7CisJCQkJYnJlYWs7CisJCQl9CisKKwkJCS8qIEZpbmQgYSBmcmVlIHBvcnQgKi8KKwkJCWlmIChwb3J0LT5udW1fcGh5cyA9PSAwICYmIGZyZWVfcG9ydCA9PSBOVUxMKSB7CisJCQkJZnJlZV9wb3J0ID0gcG9ydDsKKwkJCX0KKwkJfQorCisJCS8qIFVzZSBhIGZyZWUgcG9ydCBpZiB0aGlzIGRvZXNuJ3QgZm9ybSBhIHdpZGUgcG9ydCAqLworCQlpZiAoaSA+PSBBU0RfTUFYX1BIWVMpIHsKKwkJCXBvcnQgPSBmcmVlX3BvcnQ7CisJCQlCVUdfT04oIXBvcnQpOworCQkJbWVtY3B5KHBvcnQtPnNhc19hZGRyLCBzYXNfcGh5LT5zYXNfYWRkciwKKwkJCSAgICAgICBTQVNfQUREUl9TSVpFKTsKKwkJCW1lbWNweShwb3J0LT5hdHRhY2hlZF9zYXNfYWRkciwKKwkJCSAgICAgICBzYXNfcGh5LT5hdHRhY2hlZF9zYXNfYWRkciwKKwkJCSAgICAgICBTQVNfQUREUl9TSVpFKTsKKwkJfQorCQlwb3J0LT5udW1fcGh5cysrOworCQlwb3J0LT5waHlfbWFzayB8PSAoMVUgPDwgc2FzX3BoeS0+aWQpOworCQlwaHktPmFzZF9wb3J0ID0gcG9ydDsKKwl9CisJQVNEX0RQUklOVEsoIiVzOiB1cGRhdGluZyBwaHlfbWFzayAweCV4IGZvciBwaHklZFxuIiwKKwkJICAgIF9fRlVOQ1RJT05fXywgcGh5LT5hc2RfcG9ydC0+cGh5X21hc2ssIHNhc19waHktPmlkKTsKKwlhc2RfdXBkYXRlX3BvcnRfbGlua3MoYXNkX2hhLCBwaHkpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmFzZF9oYS0+YXNkX3BvcnRzX2xvY2ssIGZsYWdzKTsKK30KKworc3RhdGljIHZvaWQgYXNkX2RlZm9ybV9wb3J0KHN0cnVjdCBhc2RfaGFfc3RydWN0ICphc2RfaGEsIHN0cnVjdCBhc2RfcGh5ICpwaHkpCit7CisJc3RydWN0IGFzZF9wb3J0ICpwb3J0ID0gcGh5LT5hc2RfcG9ydDsKKwlzdHJ1Y3QgYXNkX3Nhc19waHkgKnNhc19waHkgPSAmcGh5LT5zYXNfcGh5OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmYXNkX2hhLT5hc2RfcG9ydHNfbG9jaywgZmxhZ3MpOworCWlmIChwb3J0KSB7CisJCXBvcnQtPm51bV9waHlzLS07CisJCXBvcnQtPnBoeV9tYXNrICY9IH4oMVUgPDwgc2FzX3BoeS0+aWQpOworCQlwaHktPmFzZF9wb3J0ID0gTlVMTDsKKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYXNkX2hhLT5hc2RfcG9ydHNfbG9jaywgZmxhZ3MpOworfQorCiBzdGF0aWMgaW5saW5lIHZvaWQgYXNkX2J5dGVzX2RtYWVkX3Rhc2tsZXQoc3RydWN0IGFzZF9hc2NiICphc2NiLAogCQkJCQkgICBzdHJ1Y3QgZG9uZV9saXN0X3N0cnVjdCAqZGwsCiAJCQkJCSAgIGludCBlZGJfaWQsIGludCBwaHlfaWQpCkBAIC0xODgsNiArMjUyLDcgQEAKIAlhc2RfZ2V0X2F0dGFjaGVkX3Nhc19hZGRyKHBoeSwgcGh5LT5zYXNfcGh5LmF0dGFjaGVkX3Nhc19hZGRyKTsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwaHktPnNhc19waHkuZnJhbWVfcmN2ZF9sb2NrLCBmbGFncyk7CiAJYXNkX2R1bXBfZnJhbWVfcmN2ZChwaHksIGRsKTsKKwlhc2RfZm9ybV9wb3J0KGFzY2ItPmhhLCBwaHkpOwogCXNhc19oYS0+bm90aWZ5X3BvcnRfZXZlbnQoJnBoeS0+c2FzX3BoeSwgUE9SVEVfQllURVNfRE1BRUQpOwogfQogCkBAIC0xOTgsNiArMjYzLDcgQEAKIAlzdHJ1Y3QgYXNkX2hhX3N0cnVjdCAqYXNkX2hhID0gYXNjYi0+aGE7CiAJc3RydWN0IHNhc19oYV9zdHJ1Y3QgKnNhc19oYSA9ICZhc2RfaGEtPnNhc19oYTsKIAlzdHJ1Y3QgYXNkX3Nhc19waHkgKnNhc19waHkgPSBzYXNfaGEtPnNhc19waHlbcGh5X2lkXTsKKwlzdHJ1Y3QgYXNkX3BoeSAqcGh5ID0gJmFzZF9oYS0+cGh5c1twaHlfaWRdOwogCXU4IGxyX2Vycm9yID0gZGwtPnN0YXR1c19ibG9ja1sxXTsKIAl1OCByZXRyaWVzX2xlZnQgPSBkbC0+c3RhdHVzX2Jsb2NrWzJdOwogCkBAIC0yMjIsNiArMjg4LDcgQEAKIAogCWFzZF90dXJuX2xlZChhc2RfaGEsIHBoeV9pZCwgMCk7CiAJc2FzX3BoeV9kaXNjb25uZWN0ZWQoc2FzX3BoeSk7CisJYXNkX2RlZm9ybV9wb3J0KGFzZF9oYSwgcGh5KTsKIAlzYXNfaGEtPm5vdGlmeV9wb3J0X2V2ZW50KHNhc19waHksIFBPUlRFX0xJTktfUkVTRVRfRVJSKTsKIAogCWlmIChyZXRyaWVzX2xlZnQgPT0gMCkgewpAQCAtMjQ5LDYgKzMxNiw4IEBACiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAlzdHJ1Y3Qgc2FzX2hhX3N0cnVjdCAqc2FzX2hhID0gJmFzY2ItPmhhLT5zYXNfaGE7CiAJc3RydWN0IGFzZF9zYXNfcGh5ICpzYXNfcGh5ID0gc2FzX2hhLT5zYXNfcGh5W3BoeV9pZF07CisJc3RydWN0IGFzZF9oYV9zdHJ1Y3QgKmFzZF9oYSA9IGFzY2ItPmhhOworCXN0cnVjdCBhc2RfcGh5ICpwaHkgPSAmYXNkX2hhLT5waHlzW3BoeV9pZF07CiAJdTggIHJlZyAgPSBkbC0+c3RhdHVzX2Jsb2NrWzFdOwogCXUzMiBjb250ID0gZGwtPnN0YXR1c19ibG9ja1syXSA8PCAoKHJlZyAmIDMpKjgpOwogCkBAIC0yODUsNiArMzU0LDcgQEAKIAkJCQkgICAgcGh5X2lkKTsKIAkJCS8qIFRoZSBzZXF1ZW5jZXIgZGlzYWJsZXMgYWxsIHBoeXMgb24gdGhhdCBwb3J0LgogCQkJICogV2UgaGF2ZSB0byByZS1lbmFibGUgdGhlIHBoeXMgb3Vyc2VsdmVzLiAqLworCQkJYXNkX2RlZm9ybV9wb3J0KGFzZF9oYSwgcGh5KTsKIAkJCXNhc19oYS0+bm90aWZ5X3BvcnRfZXZlbnQoc2FzX3BoeSwgUE9SVEVfSEFSRF9SRVNFVCk7CiAJCQlicmVhazsKIApAQCAtMzg1LDYgKzQ1NSw3IEBACiAJdTggIHNiX29wY29kZSA9IGRsLT5zdGF0dXNfYmxvY2tbMF07CiAJaW50IHBoeV9pZCA9IHNiX29wY29kZSAmIERMX1BIWV9NQVNLOwogCXN0cnVjdCBhc2Rfc2FzX3BoeSAqc2FzX3BoeSA9IHNhc19oYS0+c2FzX3BoeVtwaHlfaWRdOworCXN0cnVjdCBhc2RfcGh5ICpwaHkgPSAmYXNkX2hhLT5waHlzW3BoeV9pZF07CiAKIAlpZiAoZWRiID4gNiB8fCBlZGIgPCAwKSB7CiAJCUFTRF9EUFJJTlRLKCJlZGIgaXMgMHgleCEgZGwtPm9wY29kZSBpcyAweCV4XG4iLApAQCAtNDk3LDYgKzU2OCw3IEBACiAJCWFzZF90dXJuX2xlZChhc2RfaGEsIHBoeV9pZCwgMCk7CiAJCS8qIHRoZSBkZXZpY2UgaXMgZ29uZSAqLwogCQlzYXNfcGh5X2Rpc2Nvbm5lY3RlZChzYXNfcGh5KTsKKwkJYXNkX2RlZm9ybV9wb3J0KGFzZF9oYSwgcGh5KTsKIAkJc2FzX2hhLT5ub3RpZnlfcG9ydF9ldmVudChzYXNfcGh5LCBQT1JURV9USU1FUl9FVkVOVCk7CiAJCWJyZWFrOwogCWRlZmF1bHQ6CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYWljOTR4eC9haWM5NHh4X3Nkcy5jIGIvZHJpdmVycy9zY3NpL2FpYzk0eHgvYWljOTR4eF9zZHMuYwppbmRleCA4MzU3NGI1Li5kZTdjMDRkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvYWljOTR4eC9haWM5NHh4X3Nkcy5jCisrKyBiL2RyaXZlcnMvc2NzaS9haWM5NHh4L2FpYzk0eHhfc2RzLmMKQEAgLTYzMCwxMCArNjMwLDYgQEAKIAogCXJlZyA9IGFzZF9yZWFkX3JlZ19kd29yZChhc2RfaGEsIEVYU0lDTkZHUik7CiAKLQlpZiAoIShyZWcgJiBGTEFTSEVYKSkgewotCQlBU0RfRFBSSU5USygiZmxhc2ggZG9lc24ndCBleGlzdFxuIik7Ci0JCXJldHVybiAtRU5PRU5UOwotCX0KIAlpZiAocGNpX3JlYWRfY29uZmlnX2R3b3JkKGFzZF9oYS0+cGNpZGV2LCBQQ0lfQ09ORl9GTFNIX0JBUiwKIAkJCQkgICZhc2RfaGEtPmh3X3Byb2YuZmxhc2guYmFyKSkgewogCQlhc2RfcHJpbnRrKCJjb3VsZG4ndCByZWFkIFBDSV9DT05GX0ZMU0hfQkFSIG9mICVzXG4iLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2FpYzk0eHgvYWljOTR4eF9zZXEuYyBiL2RyaXZlcnMvc2NzaS9haWM5NHh4L2FpYzk0eHhfc2VxLmMKaW5kZXggNTZlNGIzYi4uODQ1MTEyNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2FpYzk0eHgvYWljOTR4eF9zZXEuYworKysgYi9kcml2ZXJzL3Njc2kvYWljOTR4eC9haWM5NHh4X3NlcS5jCkBAIC0xMzY5LDEwICsxMzY5LDkgQEAKICAqIHBvcnRfbWFwX2J5X2xpbmtzIGlzIGFsc28gdXNlZCBhcyB0aGUgY29ubl9tYXNrIGJ5dGUgaW4gdGhlCiAgKiBpbml0aWF0b3IvdGFyZ2V0IHBvcnQgRERCLgogICovCi12b2lkIGFzZF91cGRhdGVfcG9ydF9saW5rcyhzdHJ1Y3QgYXNkX3Nhc19waHkgKnNhc19waHkpCit2b2lkIGFzZF91cGRhdGVfcG9ydF9saW5rcyhzdHJ1Y3QgYXNkX2hhX3N0cnVjdCAqYXNkX2hhLCBzdHJ1Y3QgYXNkX3BoeSAqcGh5KQogewotCXN0cnVjdCBhc2RfaGFfc3RydWN0ICphc2RfaGEgPSBzYXNfcGh5LT5oYS0+bGxkZF9oYTsKLQljb25zdCB1OCBwaHlfbWFzayA9ICh1OCkgc2FzX3BoeS0+cG9ydC0+cGh5X21hc2s7CisJY29uc3QgdTggcGh5X21hc2sgPSAodTgpIHBoeS0+YXNkX3BvcnQtPnBoeV9tYXNrOwogCXU4ICBwaHlfaXNfdXA7CiAJdTggIG1hc2s7CiAJaW50IGksIGVycjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9haWM5NHh4L2FpYzk0eHhfc2VxLmggYi9kcml2ZXJzL3Njc2kvYWljOTR4eC9haWM5NHh4X3NlcS5oCmluZGV4IDQyMjgxYzMuLjllNzE1ZTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9haWM5NHh4L2FpYzk0eHhfc2VxLmgKKysrIGIvZHJpdmVycy9zY3NpL2FpYzk0eHgvYWljOTR4eF9zZXEuaApAQCAtNjQsNyArNjQsNyBAQAogaW50IGFzZF9pbml0X3NlcXMoc3RydWN0IGFzZF9oYV9zdHJ1Y3QgKmFzZF9oYSk7CiBpbnQgYXNkX3N0YXJ0X3NlcXMoc3RydWN0IGFzZF9oYV9zdHJ1Y3QgKmFzZF9oYSk7CiAKLXZvaWQgYXNkX3VwZGF0ZV9wb3J0X2xpbmtzKHN0cnVjdCBhc2Rfc2FzX3BoeSAqcGh5KTsKK3ZvaWQgYXNkX3VwZGF0ZV9wb3J0X2xpbmtzKHN0cnVjdCBhc2RfaGFfc3RydWN0ICphc2RfaGEsIHN0cnVjdCBhc2RfcGh5ICpwaHkpOwogI2VuZGlmCiAKICNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2RwdC9kcHRpX2kyby5oIGIvZHJpdmVycy9zY3NpL2RwdC9kcHRpX2kyby5oCmluZGV4IGIzZmE3ZWQuLjVhNDkyMTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9kcHQvZHB0aV9pMm8uaAorKysgYi9kcml2ZXJzL3Njc2kvZHB0L2RwdGlfaTJvLmgKQEAgLTQ5LDcgKzQ5LDcgQEAKIAogI2luY2x1ZGUgPGxpbnV4L3dhaXQuaD4KIHR5cGVkZWYgd2FpdF9xdWV1ZV9oZWFkX3QgYWRwdF93YWl0X3F1ZXVlX2hlYWRfdDsKLSNkZWZpbmUgQURQVF9ERUNMQVJFX1dBSVRfUVVFVUVfSEVBRCh3YWl0KSBERUNMQVJFX1dBSVRfUVVFVUVfSEVBRCh3YWl0KQorI2RlZmluZSBBRFBUX0RFQ0xBUkVfV0FJVF9RVUVVRV9IRUFEKHdhaXQpIERFQ0xBUkVfV0FJVF9RVUVVRV9IRUFEX09OU1RBQ0sod2FpdCkKIHR5cGVkZWYgd2FpdF9xdWV1ZV90IGFkcHRfd2FpdF9xdWV1ZV90OwogCiAvKgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2R0Yy5jIGIvZHJpdmVycy9zY3NpL2R0Yy5jCmluZGV4IDBkNTcxM2QuLjU0NzU2NzIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9kdGMuYworKysgYi9kcml2ZXJzL3Njc2kvZHRjLmMKQEAgLTgyLDcgKzgyLDcgQEAKICNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+Ci0jaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KICNpbmNsdWRlICJzY3NpLmgiCiAjaW5jbHVkZSA8c2NzaS9zY3NpX2hvc3QuaD4KICNpbmNsdWRlICJkdGMuaCIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9lYXRhX3Bpby5jIGIvZHJpdmVycy9zY3NpL2VhdGFfcGlvLmMKaW5kZXggODExZDg4NC4uMmRiYjY2ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2VhdGFfcGlvLmMKKysrIGIvZHJpdmVycy9zY3NpL2VhdGFfcGlvLmMKQEAgLTIwMyw3ICsyMDMsNyBAQAogCWlycXJldHVybl90IHJldDsKIAogCXNwaW5fbG9ja19pcnFzYXZlKGRldi0+aG9zdF9sb2NrLCBmbGFncyk7Ci0JcmV0ID0gZWF0YV9waW9faW50X2hhbmRsZXIoaXJxLCBkZXZfaWQsIHJlZ3MpOworCXJldCA9IGVhdGFfcGlvX2ludF9oYW5kbGVyKGlycSwgZGV2X2lkKTsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKGRldi0+aG9zdF9sb2NrLCBmbGFncyk7CiAJcmV0dXJuIHJldDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9mZG9tYWluLmMgYi9kcml2ZXJzL3Njc2kvZmRvbWFpbi5jCmluZGV4IDQxYjA1ZmM0Li41ZDRlYTZmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvZmRvbWFpbi5jCisrKyBiL2RyaXZlcnMvc2NzaS9mZG9tYWluLmMKQEAgLTI3OCw5ICsyNzgsOSBAQAogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgogI2luY2x1ZGUgPGxpbnV4L3N0YXQuaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CiAjaW5jbHVkZSA8c2NzaS9zY3NpY2FtLmg+CiAKLSNpbmNsdWRlIDxhc20vaW8uaD4KICNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CiAKICNpbmNsdWRlIDxzY3NpL3Njc2kuaD4KQEAgLTM4Nyw2ICszODcsNyBAQAogc3RhdGljIGludCAgICAgICAgICAgICAgIGJpb3NfbWFqb3I7CiBzdGF0aWMgaW50ICAgICAgICAgICAgICAgYmlvc19taW5vcjsKIHN0YXRpYyBpbnQgICAgICAgICAgICAgICBQQ0lfYnVzOworc3RhdGljIHN0cnVjdCBwY2lfZGV2CSpQQ0lfZGV2Owogc3RhdGljIGludCAgICAgICAgICAgICAgIFF1YW50dW07CS8qIFF1YW50dW0gYm9hcmQgdmFyaWFudCAqLwogc3RhdGljIGludCAgICAgICAgICAgICAgIGludGVycnVwdF9sZXZlbDsKIHN0YXRpYyB2b2xhdGlsZSBpbnQgICAgICBpbl9jb21tYW5kOwpAQCAtODEyLDkgKzgxMywxMCBAQAogCSAgIFBDSV9ERVZJQ0VfSURfRkRfMzZDNzAgKTsKICNlbmRpZiAKIAotICAgaWYgKChwZGV2ID0gcGNpX2ZpbmRfZGV2aWNlKFBDSV9WRU5ET1JfSURfRkQsIFBDSV9ERVZJQ0VfSURfRkRfMzZDNzAsIHBkZXYpKSA9PSBOVUxMKQorICAgaWYgKChwZGV2ID0gcGNpX2dldF9kZXZpY2UoUENJX1ZFTkRPUl9JRF9GRCwgUENJX0RFVklDRV9JRF9GRF8zNkM3MCwgcGRldikpID09IE5VTEwpCiAJCXJldHVybiAwOwotICAgaWYgKHBjaV9lbmFibGVfZGV2aWNlKHBkZXYpKSByZXR1cm4gMDsKKyAgIGlmIChwY2lfZW5hYmxlX2RldmljZShwZGV2KSkKKyAgIAlnb3RvIGZhaWw7CiAgICAgICAgCiAjaWYgREVCVUdfREVURUNUCiAgICBwcmludGsoICJzY3NpOiA8ZmRvbWFpbj4gVE1DLTMyNjAgZGV0ZWN0OiIKQEAgLTgzMSw3ICs4MzMsNyBAQAogICAgcGNpX2lycSA9IHBkZXYtPmlycTsKIAogICAgaWYgKCFyZXF1ZXN0X3JlZ2lvbiggcGNpX2Jhc2UsIDB4MTAsICJmZG9tYWluIiApKQotCXJldHVybiAwOworICAgCWdvdG8gZmFpbDsKIAogICAgLyogTm93IHdlIGhhdmUgdGhlIEkvTyBiYXNlIGFkZHJlc3MgYW5kIGludGVycnVwdCBmcm9tIHRoZSBQQ0kKICAgICAgIGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXJzLiAqLwpAQCAtODQ4LDE3ICs4NTAsMjIgQEAKICAgIGlmICghZmRvbWFpbl9pc192YWxpZF9wb3J0KHBjaV9iYXNlKSkgewogICAgICAgcHJpbnRrKEtFUk5fRVJSICJzY3NpOiA8ZmRvbWFpbj4gUENJIGNhcmQgZGV0ZWN0ZWQsIGJ1dCBkcml2ZXIgbm90IGxvYWRlZCAoaW52YWxpZCBwb3J0KVxuIiApOwogICAgICAgcmVsZWFzZV9yZWdpb24ocGNpX2Jhc2UsIDB4MTApOwotICAgICAgcmV0dXJuIDA7CisgICAgICBnb3RvIGZhaWw7CiAgICB9CiAKIAkJCQkvKiBGaWxsIGluIGEgZmV3IGdsb2JhbCB2YXJpYWJsZXMuICBVZ2guICovCiAgICBiaW9zX21ham9yID0gYmlvc19taW5vciA9IC0xOwogICAgUENJX2J1cyAgICA9IDE7CisgICBQQ0lfZGV2ICAgID0gcGRldjsKICAgIFF1YW50dW0gICAgPSAwOwogICAgYmlvc19iYXNlICA9IDA7CiAgICAKICAgIHJldHVybiAxOworZmFpbDoKKyAgIHBjaV9kZXZfcHV0KHBkZXYpOworICAgcmV0dXJuIDA7CiB9CisKICNlbmRpZgogCiBzdHJ1Y3QgU2NzaV9Ib3N0ICpfX2Zkb21haW5fMTZ4MF9kZXRlY3Qoc3RydWN0IHNjc2lfaG9zdF90ZW1wbGF0ZSAqdHBudCApCkBAIC05MDksOCArOTE2LDcgQEAKICAgICAgIGlmIChzZXR1cF9jYWxsZWQpIHsKIAkgcHJpbnRrKEtFUk5fRVJSICJzY3NpOiA8ZmRvbWFpbj4gQmFkIExJTE8vSU5TTU9EIHBhcmFtZXRlcnM/XG4iKTsKICAgICAgIH0KLSAgICAgIHJlbGVhc2VfcmVnaW9uKHBvcnRfYmFzZSwgMHgxMCk7Ci0gICAgICByZXR1cm4gTlVMTDsKKyAgICAgIGdvdG8gZmFpbDsKICAgIH0KIAogICAgaWYgKHRoaXNfaWQpIHsKQEAgLTk0Miw4ICs5NDgsNyBAQAogICAgLyogTG9nIElSUSB3aXRoIGtlcm5lbCAqLyAgIAogICAgaWYgKCFpbnRlcnJ1cHRfbGV2ZWwpIHsKICAgICAgIHByaW50ayhLRVJOX0VSUiAic2NzaTogPGZkb21haW4+IENhcmQgRGV0ZWN0ZWQsIGJ1dCBkcml2ZXIgbm90IGxvYWRlZCAobm8gSVJRKVxuIiApOwotICAgICAgcmVsZWFzZV9yZWdpb24ocG9ydF9iYXNlLCAweDEwKTsKLSAgICAgIHJldHVybiBOVUxMOworICAgICAgZ290byBmYWlsOwogICAgfSBlbHNlIHsKICAgICAgIC8qIFJlZ2lzdGVyIHRoZSBJUlEgd2l0aCB0aGUga2VybmVsICovCiAKQEAgLTk2NCwxMSArOTY5LDE0IEBACiAJICAgIHByaW50ayhLRVJOX0VSUiAiICAgICAgICAgICAgICAgIFNlbmQgbWFpbCB0byBmYWl0aEBhY20ub3JnXG4iICk7CiAJIH0KIAkgcHJpbnRrKEtFUk5fRVJSICJzY3NpOiA8ZmRvbWFpbj4gRGV0ZWN0ZWQsIGJ1dCBkcml2ZXIgbm90IGxvYWRlZCAoSVJRKVxuIiApOwotICAgICAgICAgcmVsZWFzZV9yZWdpb24ocG9ydF9iYXNlLCAweDEwKTsKLQkgcmV0dXJuIE5VTEw7CisJIGdvdG8gZmFpbDsKICAgICAgIH0KICAgIH0KICAgIHJldHVybiBzaHBudDsKK2ZhaWw6CisgICBwY2lfZGV2X3B1dChwZGV2KTsKKyAgIHJlbGVhc2VfcmVnaW9uKHBvcnRfYmFzZSwgMHgxMCk7CisgICByZXR1cm4gTlVMTDsKIH0KIAogc3RhdGljIGludCBmZG9tYWluXzE2eDBfZGV0ZWN0KHN0cnVjdCBzY3NpX2hvc3RfdGVtcGxhdGUgKnRwbnQpCkBAIC0xNzE0LDYgKzE3MjIsOCBAQAogCQlmcmVlX2lycShzaHBudC0+aXJxLCBzaHBudCk7CiAJaWYgKHNocG50LT5pb19wb3J0ICYmIHNocG50LT5uX2lvX3BvcnQpCiAJCXJlbGVhc2VfcmVnaW9uKHNocG50LT5pb19wb3J0LCBzaHBudC0+bl9pb19wb3J0KTsKKwlpZiAoUENJX2J1cykKKwkJcGNpX2Rldl9wdXQoUENJX2Rldik7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTE3MzYsNiArMTc0NiwxNSBAQAogfTsKIAogI2lmbmRlZiBQQ01DSUEKKworc3RhdGljIHN0cnVjdCBwY2lfZGV2aWNlX2lkIGZkb21haW5fcGNpX3RibFtdIF9fZGV2aW5pdGRhdGEgPSB7CisJeyBQQ0lfVkVORE9SX0lEX0ZELCBQQ0lfREVWSUNFX0lEX0ZEXzM2QzcwLAorCSAgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMFVMIH0sCisJeyB9Cit9OworTU9EVUxFX0RFVklDRV9UQUJMRShwY2ksIGZkb21haW5fcGNpX3RibCk7CisKICNkZWZpbmUgZHJpdmVyX3RlbXBsYXRlIGZkb21haW5fZHJpdmVyX3RlbXBsYXRlCiAjaW5jbHVkZSAic2NzaV9tb2R1bGUuYyIKKwogI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvZ2R0aC5jIGIvZHJpdmVycy9zY3NpL2dkdGguYwppbmRleCA0YmMxNGFkLi40YzY5OGE3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvZ2R0aC5jCisrKyBiL2RyaXZlcnMvc2NzaS9nZHRoLmMKQEAgLTM1MzEsNyArMzUzMSw3IEBACiAgICAgICAgICAgICAgICAgSVN0YXR1cyAmPSB+MHg4MDsKICNpZmRlZiBJTlRfQ09BTAogICAgICAgICAgICAgICAgIGlmIChjb2FsZXNjZWQpCi0gICAgICAgICAgICAgICAgICAgIGhhLT5zdGF0dXMgPSBwY3MtPmV4dF9zdGF0dXMgJiYgMHhmZmZmOworICAgICAgICAgICAgICAgICAgICBoYS0+c3RhdHVzID0gcGNzLT5leHRfc3RhdHVzICYgMHhmZmZmOwogICAgICAgICAgICAgICAgIGVsc2UgCiAjZW5kaWYKICAgICAgICAgICAgICAgICAgICAgaGEtPnN0YXR1cyA9IGdkdGhfcmVhZHcoJmRwNm1fcHRyLT5pOTYwci5zdGF0dXMpOwpAQCAtMzU0Myw3ICszNTQzLDcgQEAKICAgICAgICAgICAgIGlmIChjb2FsZXNjZWQpIHsgICAgCiAgICAgICAgICAgICAgICAgaGEtPmluZm8gPSBwY3MtPmluZm8wOwogICAgICAgICAgICAgICAgIGhhLT5pbmZvMiA9IHBjcy0+aW5mbzE7Ci0gICAgICAgICAgICAgICAgaGEtPnNlcnZpY2UgPSAocGNzLT5leHRfc3RhdHVzID4+IDE2KSAmJiAweGZmZmY7CisgICAgICAgICAgICAgICAgaGEtPnNlcnZpY2UgPSAocGNzLT5leHRfc3RhdHVzID4+IDE2KSAmIDB4ZmZmZjsKICAgICAgICAgICAgIH0gZWxzZQogI2VuZGlmCiAgICAgICAgICAgICB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvaWJtdnNjc2kvaWJtdnNjc2kuYyBiL2RyaXZlcnMvc2NzaS9pYm12c2NzaS9pYm12c2NzaS5jCmluZGV4IDY2OWVhNGYuLmZiYzFkNWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9pYm12c2NzaS9pYm12c2NzaS5jCisrKyBiL2RyaXZlcnMvc2NzaS9pYm12c2NzaS9pYm12c2NzaS5jCkBAIC0xMjEzLDcgKzEyMTMsNyBAQAogCQkJICAgICAgICJpYm12c2NzaTogUmUtZW5hYmxpbmcgYWRhcHRlciFcbiIpOwogCQkJcHVyZ2VfcmVxdWVzdHMoaG9zdGRhdGEsIERJRF9SRVFVRVVFKTsKIAkJCWlmICgoaWJtdnNjc2lfcmVlbmFibGVfY3JxX3F1ZXVlKCZob3N0ZGF0YS0+cXVldWUsCi0JCQkJCQkJaG9zdGRhdGEpID09IDApIHx8CisJCQkJCQkJaG9zdGRhdGEpKSB8fAogCQkJICAgIChpYm12c2NzaV9zZW5kX2NycShob3N0ZGF0YSwKIAkJCQkJICAgICAgIDB4QzAwMTAwMDAwMDAwMDAwMExMLCAwKSkpIHsKIAkJCQkJYXRvbWljX3NldCgmaG9zdGRhdGEtPnJlcXVlc3RfbGltaXQsCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvaW1tLmMgYi9kcml2ZXJzL3Njc2kvaW1tLmMKaW5kZXggMmQ5NWFjOS4uZTMxZjYxMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2ltbS5jCisrKyBiL2RyaXZlcnMvc2NzaS9pbW0uYwpAQCAtMTE1Myw3ICsxMTUzLDcgQEAKIHsKIAlzdHJ1Y3QgU2NzaV9Ib3N0ICpob3N0OwogCWltbV9zdHJ1Y3QgKmRldjsKLQlERUNMQVJFX1dBSVRfUVVFVUVfSEVBRCh3YWl0aW5nKTsKKwlERUNMQVJFX1dBSVRfUVVFVUVfSEVBRF9PTlNUQUNLKHdhaXRpbmcpOwogCURFRklORV9XQUlUKHdhaXQpOwogCWludCBwb3J0czsKIAlpbnQgbW9kZXMsIHBwYjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9pbml0aW8uYyBiL2RyaXZlcnMvc2NzaS9pbml0aW8uYwppbmRleCA5MTFmMmZmLi5hZmVkMjkzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvaW5pdGlvLmMKKysrIGIvZHJpdmVycy9zY3NpL2luaXRpby5jCkBAIC0xNDIsOCArMTQyLDYgQEAKICNkZWZpbmUgaTkxdV9NQVhRVUVVRQkJMgogI2RlZmluZSBpOTF1X1JFVklEICJJbml0aW8gSU5JLTlYMDBVL1VXIFNDU0kgZGV2aWNlIGRyaXZlcjsgUmV2aXNpb246IDEuMDRhIgogCi0jZGVmaW5lIElOSV9WRU5ET1JfSUQgICAweDExMDEJLyogSW5pdGlvJ3MgUENJIHZlbmRvciBJRCAgICAgICAqLwotI2RlZmluZSBETVhfVkVORE9SX0lECTB4MTM0YQkvKiBEb21leCdzIFBDSSB2ZW5kb3IgSUQJKi8KICNkZWZpbmUgSTk1MF9ERVZJQ0VfSUQJMHg5NTAwCS8qIEluaXRpbydzIGluaWMtOTUwIHByb2R1Y3QgSUQgICAqLwogI2RlZmluZSBJOTQwX0RFVklDRV9JRAkweDk0MDAJLyogSW5pdGlvJ3MgaW5pYy05NDAgcHJvZHVjdCBJRCAgICovCiAjZGVmaW5lIEk5MzVfREVWSUNFX0lECTB4OTQwMQkvKiBJbml0aW8ncyBpbmljLTkzNSBwcm9kdWN0IElEICAgKi8KQEAgLTE3MSwxMyArMTY5LDE2IEBACiAKIHN0YXRpYyB2b2lkIGk5MXVTQ0JQb3N0KEJZVEUgKiBwSGNiLCBCWVRFICogcFNjYik7CiAKLXN0YXRpYyBjb25zdCBQQ0lfSUQgaTkxdV9wY2lfZGV2aWNlc1tdID0gewotCXsgSU5JX1ZFTkRPUl9JRCwgSTk1MF9ERVZJQ0VfSUQgfSwKLQl7IElOSV9WRU5ET1JfSUQsIEk5NDBfREVWSUNFX0lEIH0sCi0JeyBJTklfVkVORE9SX0lELCBJOTM1X0RFVklDRV9JRCB9LAotCXsgSU5JX1ZFTkRPUl9JRCwgSTkyMF9ERVZJQ0VfSUQgfSwKLQl7IERNWF9WRU5ET1JfSUQsIEk5MjBfREVWSUNFX0lEIH0sCisvKiBQQ0kgRGV2aWNlcyBzdXBwb3J0ZWQgYnkgdGhpcyBkcml2ZXIgKi8KK3N0YXRpYyBzdHJ1Y3QgcGNpX2RldmljZV9pZCBpOTF1X3BjaV9kZXZpY2VzW10gX19kZXZpbml0ZGF0YSA9IHsKKwl7IFBDSV9WRU5ET1JfSURfSU5JVCwgIEk5NTBfREVWSUNFX0lELCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAwfSwKKwl7IFBDSV9WRU5ET1JfSURfSU5JVCwgIEk5NDBfREVWSUNFX0lELCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAwfSwKKwl7IFBDSV9WRU5ET1JfSURfSU5JVCwgIEk5MzVfREVWSUNFX0lELCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAwfSwKKwl7IFBDSV9WRU5ET1JfSURfSU5JVCwgIEk5MjBfREVWSUNFX0lELCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAwfSwKKwl7IFBDSV9WRU5ET1JfSURfRE9NRVgsIEk5MjBfREVWSUNFX0lELCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAwfSwKKwl7IH0KIH07CitNT0RVTEVfREVWSUNFX1RBQkxFKHBjaSwgaTkxdV9wY2lfZGV2aWNlcyk7CiAKICNkZWZpbmUgREVCVUdfSU5URVJSVVBUIDAKICNkZWZpbmUgREVCVUdfUVVFVUUgICAgIDAKQEAgLTI3NzEsNyArMjc3Miw3IEBACiAKIAlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShpOTF1X3BjaV9kZXZpY2VzKTsgaSsrKQogCXsKLQkJd2hpbGUgKChwRGV2ID0gcGNpX2ZpbmRfZGV2aWNlKGk5MXVfcGNpX2RldmljZXNbaV0udmVuZG9yX2lkLCBpOTF1X3BjaV9kZXZpY2VzW2ldLmRldmljZV9pZCwgcERldikpICE9IE5VTEwpIHsKKwkJd2hpbGUgKChwRGV2ID0gcGNpX2ZpbmRfZGV2aWNlKGk5MXVfcGNpX2RldmljZXNbaV0udmVuZG9yLCBpOTF1X3BjaV9kZXZpY2VzW2ldLmRldmljZSwgcERldikpICE9IE5VTEwpIHsKIAkJCWlmIChwY2lfZW5hYmxlX2RldmljZShwRGV2KSkKIAkJCQljb250aW51ZTsKIAkJCXBjaV9yZWFkX2NvbmZpZ19kd29yZChwRGV2LCAweDQ0LCAodTMyICopICYgZFJlZ1ZhbHVlKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9pc2NzaV90Y3AuYyBiL2RyaXZlcnMvc2NzaS9pc2NzaV90Y3AuYwppbmRleCAwYTlkYmM1Li5kMGIxMzljIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvaXNjc2lfdGNwLmMKKysrIGIvZHJpdmVycy9zY3NpL2lzY3NpX3RjcC5jCkBAIC00MTUsOCArNDE1LDggQEAKIAlpc2NzaV9zb2xpY2l0X2RhdGFfaW5pdChjb25uLCBjdGFzaywgcjJ0KTsKIAogCXRjcF9jdGFzay0+ZXhwX3IydHNuID0gcjJ0c24gKyAxOwotCXRjcF9jdGFzay0+eG1zdGF0ZSB8PSBYTVNUQVRFX1NPTF9IRFI7CiAJX19rZmlmb19wdXQodGNwX2N0YXNrLT5yMnRxdWV1ZSwgKHZvaWQqKSZyMnQsIHNpemVvZih2b2lkKikpOworCXRjcF9jdGFzay0+eG1zdGF0ZSB8PSBYTVNUQVRFX1NPTF9IRFI7CiAJbGlzdF9tb3ZlX3RhaWwoJmN0YXNrLT5ydW5uaW5nLCAmY29ubi0+eG1pdHF1ZXVlKTsKIAogCXNjc2lfcXVldWVfd29yayhzZXNzaW9uLT5ob3N0LCAmY29ubi0+eG1pdHdvcmspOwpAQCAtMTYyNyw5ICsxNjI3LDEyIEBACiAJaWYgKHRjcF9jdGFzay0+eG1zdGF0ZSAmIFhNU1RBVEVfU09MX0hEUikgewogCQl0Y3BfY3Rhc2stPnhtc3RhdGUgJj0gflhNU1RBVEVfU09MX0hEUjsKIAkJdGNwX2N0YXNrLT54bXN0YXRlIHw9IFhNU1RBVEVfU09MX0RBVEE7Ci0JCWlmICghdGNwX2N0YXNrLT5yMnQpCisJCWlmICghdGNwX2N0YXNrLT5yMnQpIHsKKwkJCXNwaW5fbG9ja19iaCgmc2Vzc2lvbi0+bG9jayk7CiAJCQlfX2tmaWZvX2dldCh0Y3BfY3Rhc2stPnIydHF1ZXVlLCAodm9pZCopJnRjcF9jdGFzay0+cjJ0LAogCQkJCSAgICBzaXplb2Yodm9pZCopKTsKKwkJCXNwaW5fdW5sb2NrX2JoKCZzZXNzaW9uLT5sb2NrKTsKKwkJfQogc2VuZF9oZHI6CiAJCXIydCA9IHRjcF9jdGFzay0+cjJ0OwogCQlkdGFzayA9ICZyMnQtPmR0YXNrOwpAQCAtMTgxNiwyMSArMTgxOSwxNCBAQAogewogCXN0cnVjdCBpc2NzaV9jb25uICpjb25uID0gY2xzX2Nvbm4tPmRkX2RhdGE7CiAJc3RydWN0IGlzY3NpX3RjcF9jb25uICp0Y3BfY29ubiA9IGNvbm4tPmRkX2RhdGE7Ci0JaW50IGRpZ2VzdCA9IDA7Ci0KLQlpZiAoY29ubi0+aGRyZGdzdF9lbiB8fCBjb25uLT5kYXRhZGdzdF9lbikKLQkJZGlnZXN0ID0gMTsKIAogCWlzY3NpX3RjcF9yZWxlYXNlX2Nvbm4oY29ubik7CiAJaXNjc2lfY29ubl90ZWFyZG93bihjbHNfY29ubik7CiAKLQkvKiBub3cgZnJlZSB0Y3BfY29ubiAqLwotCWlmIChkaWdlc3QpIHsKLQkJaWYgKHRjcF9jb25uLT50eF9oYXNoLnRmbSkKLQkJCWNyeXB0b19mcmVlX2hhc2godGNwX2Nvbm4tPnR4X2hhc2gudGZtKTsKLQkJaWYgKHRjcF9jb25uLT5yeF9oYXNoLnRmbSkKLQkJCWNyeXB0b19mcmVlX2hhc2godGNwX2Nvbm4tPnJ4X2hhc2gudGZtKTsKLQl9CisJaWYgKHRjcF9jb25uLT50eF9oYXNoLnRmbSkKKwkJY3J5cHRvX2ZyZWVfaGFzaCh0Y3BfY29ubi0+dHhfaGFzaC50Zm0pOworCWlmICh0Y3BfY29ubi0+cnhfaGFzaC50Zm0pCisJCWNyeXB0b19mcmVlX2hhc2godGNwX2Nvbm4tPnJ4X2hhc2gudGZtKTsKIAogCWtmcmVlKHRjcF9jb25uKTsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9saWJpc2NzaS5jIGIvZHJpdmVycy9zY3NpL2xpYmlzY3NpLmMKaW5kZXggYzU0MmQwZS4uNWQ4ODYyMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2xpYmlzY3NpLmMKKysrIGIvZHJpdmVycy9zY3NpL2xpYmlzY3NpLmMKQEAgLTQ4MSw4ICs0ODEsOCBAQAogCQkJYnJlYWs7CiAJCWNhc2UgSVNDU0lfT1BfQVNZTkNfRVZFTlQ6CiAJCQljb25uLT5leHBfc3RhdHNuID0gYmUzMl90b19jcHUoaGRyLT5zdGF0c24pICsgMTsKLQkJCS8qIHdlIG5lZWQgc3RoIGxpa2UgaXNjc2lfYXN5bmNfZXZlbnRfcnNwKCkgKi8KLQkJCXJjID0gSVNDU0lfRVJSX0JBRF9PUENPREU7CisJCQlpZiAoaXNjc2lfcmVjdl9wZHUoY29ubi0+Y2xzX2Nvbm4sIGhkciwgZGF0YSwgZGF0YWxlbikpCisJCQkJcmMgPSBJU0NTSV9FUlJfQ09OTl9GQUlMRUQ7CiAJCQlicmVhazsKIAkJZGVmYXVsdDoKIAkJCXJjID0gSVNDU0lfRVJSX0JBRF9PUENPREU7CkBAIC01NzgsNiArNTc4LDI3IEBACiB9CiBFWFBPUlRfU1lNQk9MX0dQTChpc2NzaV9jb25uX2ZhaWx1cmUpOwogCitzdGF0aWMgaW50IGlzY3NpX3htaXRfaW1tX3Rhc2soc3RydWN0IGlzY3NpX2Nvbm4gKmNvbm4pCit7CisJc3RydWN0IGlzY3NpX2hkciAqaGRyID0gY29ubi0+bXRhc2stPmhkcjsKKwlpbnQgcmMsIHdhc19sb2dvdXQgPSAwOworCisJaWYgKChoZHItPm9wY29kZSAmIElTQ1NJX09QQ09ERV9NQVNLKSA9PSBJU0NTSV9PUF9MT0dPVVQpIHsKKwkJY29ubi0+c2Vzc2lvbi0+c3RhdGUgPSBJU0NTSV9TVEFURV9JTl9SRUNPVkVSWTsKKwkJaXNjc2lfYmxvY2tfc2Vzc2lvbihzZXNzaW9uX3RvX2Nscyhjb25uLT5zZXNzaW9uKSk7CisJCXdhc19sb2dvdXQgPSAxOworCX0KKwlyYyA9IGNvbm4tPnNlc3Npb24tPnR0LT54bWl0X21nbXRfdGFzayhjb25uLCBjb25uLT5tdGFzayk7CisJaWYgKHJjKQorCQlyZXR1cm4gcmM7CisKKwlpZiAod2FzX2xvZ291dCkgeworCQlzZXRfYml0KElTQ1NJX1NVU1BFTkRfQklULCAmY29ubi0+c3VzcGVuZF90eCk7CisJCXJldHVybiAtRU5PREFUQTsKKwl9CisJcmV0dXJuIDA7Cit9CisKIC8qKgogICogaXNjc2lfZGF0YV94bWl0IC0geG1pdCBhbnkgY29tbWFuZCBpbnRvIHRoZSBzY2hlZHVsZWQgY29ubmVjdGlvbgogICogQGNvbm46IGlzY3NpIGNvbm5lY3Rpb24KQEAgLTYyMyw3ICs2NDQsNyBAQAogCQljb25uLT5jdGFzayA9IE5VTEw7CiAJfQogCWlmIChjb25uLT5tdGFzaykgewotCQlyYyA9IHR0LT54bWl0X21nbXRfdGFzayhjb25uLCBjb25uLT5tdGFzayk7CisJCXJjID0gaXNjc2lfeG1pdF9pbW1fdGFzayhjb25uKTsKIAkgICAgICAgIGlmIChyYykKIAkJICAgICAgICBnb3RvIGFnYWluOwogCQkvKiBkb25lIHdpdGggdGhpcyBpbi1wcm9ncmVzcyBtdGFzayAqLwpAQCAtNjM4LDcgKzY1OSw3IEBACiAJCQlsaXN0X2FkZF90YWlsKCZjb25uLT5tdGFzay0+cnVubmluZywKIAkJCQkgICAgICAmY29ubi0+bWdtdF9ydW5fbGlzdCk7CiAJCQlzcGluX3VubG9ja19iaCgmY29ubi0+c2Vzc2lvbi0+bG9jayk7Ci0JCQlyYyA9IHR0LT54bWl0X21nbXRfdGFzayhjb25uLCBjb25uLT5tdGFzayk7CisJCQlyYyA9IGlzY3NpX3htaXRfaW1tX3Rhc2soY29ubik7CiAJCSAgICAgICAgaWYgKHJjKQogCQkJICAgICAgICBnb3RvIGFnYWluOwogCSAgICAgICAgfQpAQCAtNjYxLDggKzY4Miw2IEBACiAJCXNwaW5fdW5sb2NrX2JoKCZjb25uLT5zZXNzaW9uLT5sb2NrKTsKIAogCQlyYyA9IHR0LT54bWl0X2NtZF90YXNrKGNvbm4sIGNvbm4tPmN0YXNrKTsKLQkJaWYgKHJjKQotCQkJZ290byBhZ2FpbjsKIAogCQlzcGluX2xvY2tfYmgoJmNvbm4tPnNlc3Npb24tPmxvY2spOwogCQlfX2lzY3NpX3B1dF9jdGFzayhjb25uLT5jdGFzayk7CkBAIC03NzgsNiArNzk3LDEwIEBACiAJfQogCiAJY29ubiA9IHNlc3Npb24tPmxlYWRjb25uOworCWlmICghY29ubikgeworCQlyZWFzb24gPSBGQUlMVVJFX1NFU1NJT05fRlJFRUQ7CisJCWdvdG8gZmF1bHQ7CisJfQogCiAJaWYgKCFfX2tmaWZvX2dldChzZXNzaW9uLT5jbWRwb29sLnF1ZXVlLCAodm9pZCopJmN0YXNrLAogCQkJIHNpemVvZih2b2lkKikpKSB7CkBAIC05NTIsMTMgKzk3NSwxMyBAQAogCWlmIChzZXNzaW9uLT5zdGF0ZSA9PSBJU0NTSV9TVEFURV9URVJNSU5BVEUpIHsKIGZhaWxlZDoKIAkJZGVidWdfc2NzaSgiZmFpbGluZyBob3N0IHJlc2V0OiBzZXNzaW9uIHRlcm1pbmF0ZWQgIgotCQkJICAgIltDSUQgJWQgYWdlICVkXSIsIGNvbm4tPmlkLCBzZXNzaW9uLT5hZ2UpOworCQkJICAgIltDSUQgJWQgYWdlICVkXVxuIiwgY29ubi0+aWQsIHNlc3Npb24tPmFnZSk7CiAJCXNwaW5fdW5sb2NrX2JoKCZzZXNzaW9uLT5sb2NrKTsKIAkJcmV0dXJuIEZBSUxFRDsKIAl9CiAKIAlpZiAoc2MtPlNDcC5waGFzZSA9PSBzZXNzaW9uLT5hZ2UpIHsKLQkJZGVidWdfc2NzaSgiZmFpbGluZyBjb25uZWN0aW9uIENJRCAlZCBkdWUgdG8gU0NTSSBob3N0IHJlc2V0IiwKKwkJZGVidWdfc2NzaSgiZmFpbGluZyBjb25uZWN0aW9uIENJRCAlZCBkdWUgdG8gU0NTSSBob3N0IHJlc2V0XG4iLAogCQkJICAgY29ubi0+aWQpOwogCQlmYWlsX3Nlc3Npb24gPSAxOwogCX0KQEAgLTEwMzEsNyArMTA1NCw4IEBACiAJCQkJICAgICBOVUxMLCAwKTsKIAlpZiAocmMpIHsKIAkJaXNjc2lfY29ubl9mYWlsdXJlKGNvbm4sIElTQ1NJX0VSUl9DT05OX0ZBSUxFRCk7Ci0JCWRlYnVnX3Njc2koImFib3J0IHNlbnQgZmFpbHVyZSBbaXR0IDB4JXhdICVkIiwgY3Rhc2stPml0dCwgcmMpOworCQlkZWJ1Z19zY3NpKCJhYm9ydCBzZW50IGZhaWx1cmUgW2l0dCAweCV4XSAlZFxuIiwgY3Rhc2stPml0dCwKKwkJICAgICAgICAgICByYyk7CiAJCXJldHVybiByYzsKIAl9CiAKQEAgLTEwNDgsNyArMTA3Miw3IEBACiAJCWNvbm4tPnRtYWJvcnRfdGltZXIuZnVuY3Rpb24gPSBpc2NzaV90bWFib3J0X3RpbWVkb3V0OwogCQljb25uLT50bWFib3J0X3RpbWVyLmRhdGEgPSAodW5zaWduZWQgbG9uZyljdGFzazsKIAkJYWRkX3RpbWVyKCZjb25uLT50bWFib3J0X3RpbWVyKTsKLQkJZGVidWdfc2NzaSgiYWJvcnQgc2V0IHRpbWVvdXQgW2l0dCAweCV4XSIsIGN0YXNrLT5pdHQpOworCQlkZWJ1Z19zY3NpKCJhYm9ydCBzZXQgdGltZW91dCBbaXR0IDB4JXhdXG4iLCBjdGFzay0+aXR0KTsKIAl9CiAJc3Bpbl91bmxvY2tfYmgoJnNlc3Npb24tPmxvY2spOwogCW11dGV4X3VubG9jaygmY29ubi0+eG1pdG11dGV4KTsKQEAgLTEzNzcsNyArMTQwMSw2IEBACiAJfQogCiAJc3Bpbl9sb2NrX2luaXQoJnNlc3Npb24tPmxvY2spOwotCUlOSVRfTElTVF9IRUFEKCZzZXNzaW9uLT5jb25uZWN0aW9ucyk7CiAKIAkvKiBpbml0aWFsaXplIGltbWVkaWF0ZSBjb21tYW5kIHBvb2wgKi8KIAlpZiAoaXNjc2lfcG9vbF9pbml0KCZzZXNzaW9uLT5tZ210cG9vbCwgc2Vzc2lvbi0+bWdtdHBvb2xfbWF4LApAQCAtMTU4MCwxNiArMTYwMywxMSBAQAogCWtmcmVlKGNvbm4tPnBlcnNpc3RlbnRfYWRkcmVzcyk7CiAJX19rZmlmb19wdXQoc2Vzc2lvbi0+bWdtdHBvb2wucXVldWUsICh2b2lkKikmY29ubi0+bG9naW5fbXRhc2ssCiAJCSAgICBzaXplb2Yodm9pZCopKTsKLQlsaXN0X2RlbCgmY29ubi0+aXRlbSk7Ci0JaWYgKGxpc3RfZW1wdHkoJnNlc3Npb24tPmNvbm5lY3Rpb25zKSkKKwlpZiAoc2Vzc2lvbi0+bGVhZGNvbm4gPT0gY29ubikgewogCQlzZXNzaW9uLT5sZWFkY29ubiA9IE5VTEw7Ci0JaWYgKHNlc3Npb24tPmxlYWRjb25uICYmIHNlc3Npb24tPmxlYWRjb25uID09IGNvbm4pCi0JCXNlc3Npb24tPmxlYWRjb25uID0gY29udGFpbmVyX29mKHNlc3Npb24tPmNvbm5lY3Rpb25zLm5leHQsCi0JCQlzdHJ1Y3QgaXNjc2lfY29ubiwgaXRlbSk7Ci0KLQlpZiAoc2Vzc2lvbi0+bGVhZGNvbm4gPT0gTlVMTCkKIAkJLyogbm8gY29ubmVjdGlvbnMgZXhpdHMuLiByZXNldCBzZXF1ZW5jaW5nICovCiAJCXNlc3Npb24tPmNtZHNuID0gc2Vzc2lvbi0+bWF4X2NtZHNuID0gc2Vzc2lvbi0+ZXhwX2NtZHNuID0gMTsKKwl9CiAJc3Bpbl91bmxvY2tfYmgoJnNlc3Npb24tPmxvY2spOwogCiAJa2ZpZm9fZnJlZShjb25uLT5pbW1xdWV1ZSk7CkBAIC0xNzc3LDMyICsxNzk1LDEyIEBACiAJCSAgICBzdHJ1Y3QgaXNjc2lfY2xzX2Nvbm4gKmNsc19jb25uLCBpbnQgaXNfbGVhZGluZykKIHsKIAlzdHJ1Y3QgaXNjc2lfc2Vzc2lvbiAqc2Vzc2lvbiA9IGNsYXNzX3RvX3RyYW5zcG9ydF9zZXNzaW9uKGNsc19zZXNzaW9uKTsKLQlzdHJ1Y3QgaXNjc2lfY29ubiAqdG1wID0gRVJSX1BUUigtRUVYSVNUKSwgKmNvbm4gPSBjbHNfY29ubi0+ZGRfZGF0YTsKKwlzdHJ1Y3QgaXNjc2lfY29ubiAqY29ubiA9IGNsc19jb25uLT5kZF9kYXRhOwogCi0JLyogbG9va3VwIGZvciBleGlzdGluZyBjb25uZWN0aW9uICovCiAJc3Bpbl9sb2NrX2JoKCZzZXNzaW9uLT5sb2NrKTsKLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHRtcCwgJnNlc3Npb24tPmNvbm5lY3Rpb25zLCBpdGVtKSB7Ci0JCWlmICh0bXAgPT0gY29ubikgewotCQkJaWYgKGNvbm4tPmNfc3RhZ2UgIT0gSVNDU0lfQ09OTl9TVE9QUEVEIHx8Ci0JCQkgICAgY29ubi0+c3RvcF9zdGFnZSA9PSBTVE9QX0NPTk5fVEVSTSkgewotCQkJCXByaW50ayhLRVJOX0VSUiAiaXNjc2k6IGNhbid0IGJpbmQgIgotCQkJCSAgICAgICAibm9uLXN0b3BwZWQgY29ubmVjdGlvbiAoJWQ6JWQpXG4iLAotCQkJCSAgICAgICBjb25uLT5jX3N0YWdlLCBjb25uLT5zdG9wX3N0YWdlKTsKLQkJCQlzcGluX3VubG9ja19iaCgmc2Vzc2lvbi0+bG9jayk7Ci0JCQkJcmV0dXJuIC1FSU87Ci0JCQl9Ci0JCQlicmVhazsKLQkJfQotCX0KLQlpZiAodG1wICE9IGNvbm4pIHsKLQkJLyogYmluZCBuZXcgaVNDU0kgY29ubmVjdGlvbiB0byBzZXNzaW9uICovCi0JCWNvbm4tPnNlc3Npb24gPSBzZXNzaW9uOwotCQlsaXN0X2FkZCgmY29ubi0+aXRlbSwgJnNlc3Npb24tPmNvbm5lY3Rpb25zKTsKLQl9Ci0Jc3Bpbl91bmxvY2tfYmgoJnNlc3Npb24tPmxvY2spOwotCiAJaWYgKGlzX2xlYWRpbmcpCiAJCXNlc3Npb24tPmxlYWRjb25uID0gY29ubjsKKwlzcGluX3VubG9ja19iaCgmc2Vzc2lvbi0+bG9jayk7CiAKIAkvKgogCSAqIFVuYmxvY2sgeG1pdHdvcmtlcigpLCBMb2dpbiBQaGFzZSB3aWxsIHBhc3MgdGhyb3VnaC4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9saWJzYXMvc2FzX2V4cGFuZGVyLmMgYi9kcml2ZXJzL3Njc2kvbGlic2FzL3Nhc19leHBhbmRlci5jCmluZGV4IDMwYjgwMTQuLmUzNGE5MzQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9saWJzYXMvc2FzX2V4cGFuZGVyLmMKKysrIGIvZHJpdmVycy9zY3NpL2xpYnNhcy9zYXNfZXhwYW5kZXIuYwpAQCAtNzEsNTUgKzcxLDY1IEBACiBzdGF0aWMgaW50IHNtcF9leGVjdXRlX3Rhc2soc3RydWN0IGRvbWFpbl9kZXZpY2UgKmRldiwgdm9pZCAqcmVxLCBpbnQgcmVxX3NpemUsCiAJCQkgICAgdm9pZCAqcmVzcCwgaW50IHJlc3Bfc2l6ZSkKIHsKLQlpbnQgcmVzOwotCXN0cnVjdCBzYXNfdGFzayAqdGFzayA9IHNhc19hbGxvY190YXNrKEdGUF9LRVJORUwpOworCWludCByZXMsIHJldHJ5OworCXN0cnVjdCBzYXNfdGFzayAqdGFzayA9IE5VTEw7CiAJc3RydWN0IHNhc19pbnRlcm5hbCAqaSA9CiAJCXRvX3Nhc19pbnRlcm5hbChkZXYtPnBvcnQtPmhhLT5jb3JlLnNob3N0LT50cmFuc3BvcnR0KTsKIAotCWlmICghdGFzaykKLQkJcmV0dXJuIC1FTk9NRU07CisJZm9yIChyZXRyeSA9IDA7IHJldHJ5IDwgMzsgcmV0cnkrKykgeworCQl0YXNrID0gc2FzX2FsbG9jX3Rhc2soR0ZQX0tFUk5FTCk7CisJCWlmICghdGFzaykKKwkJCXJldHVybiAtRU5PTUVNOwogCi0JdGFzay0+ZGV2ID0gZGV2OwotCXRhc2stPnRhc2tfcHJvdG8gPSBkZXYtPnRwcm90bzsKLQlzZ19pbml0X29uZSgmdGFzay0+c21wX3Rhc2suc21wX3JlcSwgcmVxLCByZXFfc2l6ZSk7Ci0Jc2dfaW5pdF9vbmUoJnRhc2stPnNtcF90YXNrLnNtcF9yZXNwLCByZXNwLCByZXNwX3NpemUpOworCQl0YXNrLT5kZXYgPSBkZXY7CisJCXRhc2stPnRhc2tfcHJvdG8gPSBkZXYtPnRwcm90bzsKKwkJc2dfaW5pdF9vbmUoJnRhc2stPnNtcF90YXNrLnNtcF9yZXEsIHJlcSwgcmVxX3NpemUpOworCQlzZ19pbml0X29uZSgmdGFzay0+c21wX3Rhc2suc21wX3Jlc3AsIHJlc3AsIHJlc3Bfc2l6ZSk7CiAKLQl0YXNrLT50YXNrX2RvbmUgPSBzbXBfdGFza19kb25lOworCQl0YXNrLT50YXNrX2RvbmUgPSBzbXBfdGFza19kb25lOwogCi0JdGFzay0+dGltZXIuZGF0YSA9ICh1bnNpZ25lZCBsb25nKSB0YXNrOwotCXRhc2stPnRpbWVyLmZ1bmN0aW9uID0gc21wX3Rhc2tfdGltZWRvdXQ7Ci0JdGFzay0+dGltZXIuZXhwaXJlcyA9IGppZmZpZXMgKyBTTVBfVElNRU9VVCpIWjsKLQlhZGRfdGltZXIoJnRhc2stPnRpbWVyKTsKKwkJdGFzay0+dGltZXIuZGF0YSA9ICh1bnNpZ25lZCBsb25nKSB0YXNrOworCQl0YXNrLT50aW1lci5mdW5jdGlvbiA9IHNtcF90YXNrX3RpbWVkb3V0OworCQl0YXNrLT50aW1lci5leHBpcmVzID0gamlmZmllcyArIFNNUF9USU1FT1VUKkhaOworCQlhZGRfdGltZXIoJnRhc2stPnRpbWVyKTsKIAotCXJlcyA9IGktPmRmdC0+bGxkZF9leGVjdXRlX3Rhc2sodGFzaywgMSwgR0ZQX0tFUk5FTCk7CisJCXJlcyA9IGktPmRmdC0+bGxkZF9leGVjdXRlX3Rhc2sodGFzaywgMSwgR0ZQX0tFUk5FTCk7CiAKLQlpZiAocmVzKSB7Ci0JCWRlbF90aW1lcigmdGFzay0+dGltZXIpOwotCQlTQVNfRFBSSU5USygiZXhlY3V0aW5nIFNNUCB0YXNrIGZhaWxlZDolZFxuIiwgcmVzKTsKLQkJZ290byBleF9lcnI7Ci0JfQotCi0Jd2FpdF9mb3JfY29tcGxldGlvbigmdGFzay0+Y29tcGxldGlvbik7Ci0JcmVzID0gLUVUQVNLOwotCWlmICgodGFzay0+dGFza19zdGF0ZV9mbGFncyAmIFNBU19UQVNLX1NUQVRFX0FCT1JURUQpKSB7Ci0JCVNBU19EUFJJTlRLKCJzbXAgdGFzayB0aW1lZCBvdXQgb3IgYWJvcnRlZFxuIik7Ci0JCWktPmRmdC0+bGxkZF9hYm9ydF90YXNrKHRhc2spOwotCQlpZiAoISh0YXNrLT50YXNrX3N0YXRlX2ZsYWdzICYgU0FTX1RBU0tfU1RBVEVfRE9ORSkpIHsKLQkJCVNBU19EUFJJTlRLKCJTTVAgdGFzayBhYm9ydGVkIGFuZCBub3QgZG9uZVxuIik7CisJCWlmIChyZXMpIHsKKwkJCWRlbF90aW1lcigmdGFzay0+dGltZXIpOworCQkJU0FTX0RQUklOVEsoImV4ZWN1dGluZyBTTVAgdGFzayBmYWlsZWQ6JWRcbiIsIHJlcyk7CiAJCQlnb3RvIGV4X2VycjsKIAkJfQorCisJCXdhaXRfZm9yX2NvbXBsZXRpb24oJnRhc2stPmNvbXBsZXRpb24pOworCQlyZXMgPSAtRVRBU0s7CisJCWlmICgodGFzay0+dGFza19zdGF0ZV9mbGFncyAmIFNBU19UQVNLX1NUQVRFX0FCT1JURUQpKSB7CisJCQlTQVNfRFBSSU5USygic21wIHRhc2sgdGltZWQgb3V0IG9yIGFib3J0ZWRcbiIpOworCQkJaS0+ZGZ0LT5sbGRkX2Fib3J0X3Rhc2sodGFzayk7CisJCQlpZiAoISh0YXNrLT50YXNrX3N0YXRlX2ZsYWdzICYgU0FTX1RBU0tfU1RBVEVfRE9ORSkpIHsKKwkJCQlTQVNfRFBSSU5USygiU01QIHRhc2sgYWJvcnRlZCBhbmQgbm90IGRvbmVcbiIpOworCQkJCWdvdG8gZXhfZXJyOworCQkJfQorCQl9CisJCWlmICh0YXNrLT50YXNrX3N0YXR1cy5yZXNwID09IFNBU19UQVNLX0NPTVBMRVRFICYmCisJCSAgICB0YXNrLT50YXNrX3N0YXR1cy5zdGF0ID09IFNBTV9HT09EKSB7CisJCQlyZXMgPSAwOworCQkJYnJlYWs7CisJCX0gZWxzZSB7CisJCQlTQVNfRFBSSU5USygiJXM6IHRhc2sgdG8gZGV2ICUwMTZsbHggcmVzcG9uc2U6IDB4JXggIgorCQkJCSAgICAic3RhdHVzIDB4JXhcbiIsIF9fRlVOQ1RJT05fXywKKwkJCQkgICAgU0FTX0FERFIoZGV2LT5zYXNfYWRkciksCisJCQkJICAgIHRhc2stPnRhc2tfc3RhdHVzLnJlc3AsCisJCQkJICAgIHRhc2stPnRhc2tfc3RhdHVzLnN0YXQpOworCQkJc2FzX2ZyZWVfdGFzayh0YXNrKTsKKwkJCXRhc2sgPSBOVUxMOworCQl9CiAJfQotCWlmICh0YXNrLT50YXNrX3N0YXR1cy5yZXNwID09IFNBU19UQVNLX0NPTVBMRVRFICYmCi0JICAgIHRhc2stPnRhc2tfc3RhdHVzLnN0YXQgPT0gU0FNX0dPT0QpCi0JCXJlcyA9IDA7Ci0JZWxzZQotCQlTQVNfRFBSSU5USygiJXM6IHRhc2sgdG8gZGV2ICUwMTZsbHggcmVzcG9uc2U6IDB4JXggIgotCQkJICAgICJzdGF0dXMgMHgleFxuIiwgX19GVU5DVElPTl9fLAotCQkJICAgIFNBU19BRERSKGRldi0+c2FzX2FkZHIpLAotCQkJICAgIHRhc2stPnRhc2tfc3RhdHVzLnJlc3AsCi0JCQkgICAgdGFzay0+dGFza19zdGF0dXMuc3RhdCk7CiBleF9lcnI6Ci0Jc2FzX2ZyZWVfdGFzayh0YXNrKTsKKwlCVUdfT04ocmV0cnkgPT0gMyAmJiB0YXNrICE9IE5VTEwpOworCWlmICh0YXNrICE9IE5VTEwpIHsKKwkJc2FzX2ZyZWVfdGFzayh0YXNrKTsKKwl9CiAJcmV0dXJuIHJlczsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2xwZmMvbHBmY19hdHRyLmMgYi9kcml2ZXJzL3Njc2kvbHBmYy9scGZjX2F0dHIuYwppbmRleCA5NDk2ZTg3Li4yYTRlMDJlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvbHBmYy9scGZjX2F0dHIuYworKysgYi9kcml2ZXJzL3Njc2kvbHBmYy9scGZjX2F0dHIuYwpAQCAtNTk0LDcgKzU5NCw4IEBACiB7CiAJc3RydWN0IFNjc2lfSG9zdCAqaG9zdCA9IGNsYXNzX3RvX3Nob3N0KGNkZXYpOwogCXN0cnVjdCBscGZjX2hiYSAqcGhiYSA9IChzdHJ1Y3QgbHBmY19oYmEqKWhvc3QtPmhvc3RkYXRhOwotCXJldHVybiBzbnByaW50ZihidWYsIFBBR0VfU0laRSwgIjB4JWxseFxuIiwgcGhiYS0+Y2ZnX3NvZnRfd3dwbik7CisJcmV0dXJuIHNucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAiMHglbGx4XG4iLAorCQkJKHVuc2lnbmVkIGxvbmcgbG9uZylwaGJhLT5jZmdfc29mdF93d3BuKTsKIH0KIAogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvbHBmYy9scGZjX2N0LmMgYi9kcml2ZXJzL3Njc2kvbHBmYy9scGZjX2N0LmMKaW5kZXggMWI1M2FmYi4uM2FkZDdjMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2xwZmMvbHBmY19jdC5jCisrKyBiL2RyaXZlcnMvc2NzaS9scGZjL2xwZmNfY3QuYwpAQCAtMTg4LDcgKzE4OCw4IEBACiAKIAkJaWYgKCFtcC0+dmlydCkgewogCQkJa2ZyZWUobXApOwotCQkJbHBmY19mcmVlX2N0X3JzcChwaGJhLCBtbGlzdCk7CisJCQlpZiAobWxpc3QpCisJCQkJbHBmY19mcmVlX2N0X3JzcChwaGJhLCBtbGlzdCk7CiAJCQlyZXR1cm4gTlVMTDsKIAkJfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvbHBmYy9scGZjX2hiYWRpc2MuYyBiL2RyaXZlcnMvc2NzaS9scGZjL2xwZmNfaGJhZGlzYy5jCmluZGV4IGQ1ODZjM2QuLjE5Yzc5YTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9scGZjL2xwZmNfaGJhZGlzYy5jCisrKyBiL2RyaXZlcnMvc2NzaS9scGZjL2xwZmNfaGJhZGlzYy5jCkBAIC0zMDUsNyArMzA1LDcgQEAKIHsKIAlzdHJ1Y3QgbHBmY19oYmEgKnBoYmEgPSBwOwogCWludCByYzsKLQlERUNMQVJFX1dBSVRfUVVFVUVfSEVBRCh3b3JrX3dhaXRxKTsKKwlERUNMQVJFX1dBSVRfUVVFVUVfSEVBRF9PTlNUQUNLKHdvcmtfd2FpdHEpOwogCiAJc2V0X3VzZXJfbmljZShjdXJyZW50LCAtMjApOwogCXBoYmEtPndvcmtfd2FpdCA9ICZ3b3JrX3dhaXRxOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2xwZmMvbHBmY19zbGkuYyBiL2RyaXZlcnMvc2NzaS9scGZjL2xwZmNfc2xpLmMKaW5kZXggMjRhMTc3OS4uNTgyZjVlYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2xwZmMvbHBmY19zbGkuYworKysgYi9kcml2ZXJzL3Njc2kvbHBmYy9scGZjX3NsaS5jCkBAIC0yOTgzLDcgKzI5ODMsNyBAQAogCQkJIHN0cnVjdCBscGZjX2lvY2JxICogcHJzcGlvY2JxLAogCQkJIHVpbnQzMl90IHRpbWVvdXQpCiB7Ci0JREVDTEFSRV9XQUlUX1FVRVVFX0hFQUQoZG9uZV9xKTsKKwlERUNMQVJFX1dBSVRfUVVFVUVfSEVBRF9PTlNUQUNLKGRvbmVfcSk7CiAJbG9uZyB0aW1lbGVmdCwgdGltZW91dF9yZXEgPSAwOwogCWludCByZXR2YWwgPSBJT0NCX1NVQ0NFU1M7CiAJdWludDMyX3QgY3JlZ192YWw7CkBAIC0zMDYxLDcgKzMwNjEsNyBAQAogbHBmY19zbGlfaXNzdWVfbWJveF93YWl0KHN0cnVjdCBscGZjX2hiYSAqIHBoYmEsIExQRkNfTUJPWFFfdCAqIHBtYm94cSwKIAkJCSB1aW50MzJfdCB0aW1lb3V0KQogewotCURFQ0xBUkVfV0FJVF9RVUVVRV9IRUFEKGRvbmVfcSk7CisJREVDTEFSRV9XQUlUX1FVRVVFX0hFQURfT05TVEFDSyhkb25lX3EpOwogCURFQ0xBUkVfV0FJVFFVRVVFKHdxX2VudHJ5LCBjdXJyZW50KTsKIAl1aW50MzJfdCB0aW1lbGVmdCA9IDA7CiAJaW50IHJldHZhbDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9tZWdhcmFpZC9tZWdhcmFpZF9tYm94LmMgYi9kcml2ZXJzL3Njc2kvbWVnYXJhaWQvbWVnYXJhaWRfbWJveC5jCmluZGV4IGMwZWRiNjYuLjdiYWM4NmQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9tZWdhcmFpZC9tZWdhcmFpZF9tYm94LmMKKysrIGIvZHJpdmVycy9zY3NpL21lZ2FyYWlkL21lZ2FyYWlkX21ib3guYwpAQCAtODg0LDcgKzg4NCw3IEBACiAKIAlpZiAoKChtYWdpYzY0ID09IEhCQV9TSUdOQVRVUkVfNjRfQklUKSAmJgogCQkoKGFkYXB0ZXItPnBkZXYtPnN1YnN5c3RlbV9kZXZpY2UgIT0KLQkJUENJX1NVQlNZU19JRF9NRUdBUkFJRF9TQVRBXzE1MF82KSB8fAorCQlQQ0lfU1VCU1lTX0lEX01FR0FSQUlEX1NBVEFfMTUwXzYpICYmCiAJCShhZGFwdGVyLT5wZGV2LT5zdWJzeXN0ZW1fZGV2aWNlICE9CiAJCVBDSV9TVUJTWVNfSURfTUVHQVJBSURfU0FUQV8xNTBfNCkpKSB8fAogCQkoYWRhcHRlci0+cGRldi0+dmVuZG9yID09IFBDSV9WRU5ET1JfSURfTFNJX0xPR0lDICYmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvcGNtY2lhL25zcF9jcy5jIGIvZHJpdmVycy9zY3NpL3BjbWNpYS9uc3BfY3MuYwppbmRleCBiMWQzNDYwLi5mMmQ3OWMzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvcGNtY2lhL25zcF9jcy5jCisrKyBiL2RyaXZlcnMvc2NzaS9wY21jaWEvbnNwX2NzLmMKQEAgLTE4Myw3ICsxODMsNyBAQAogICogQ2xlbmF1cCBwYXJhbWV0ZXJzIGFuZCBjYWxsIGRvbmUoKSBmdW5jdGlvbnMuCiAgKiBZb3UgbXVzdCBiZSBzZXQgU0NwbnQtPnJlc3VsdCBiZWZvcmUgY2FsbCB0aGlzIGZ1bmN0aW9uLgogICovCi1zdGF0aWMgdm9pZCBuc3Bfc2NzaV9kb25lKFNjc2lfQ21uZCAqU0NwbnQpCitzdGF0aWMgdm9pZCBuc3Bfc2NzaV9kb25lKHN0cnVjdCBzY3NpX2NtbmQgKlNDcG50KQogewogCW5zcF9od19kYXRhICpkYXRhID0gKG5zcF9od19kYXRhICopU0NwbnQtPmRldmljZS0+aG9zdC0+aG9zdGRhdGE7CiAKQEAgLTE5Miw3ICsxOTIsOCBAQAogCVNDcG50LT5zY3NpX2RvbmUoU0NwbnQpOwogfQogCi1zdGF0aWMgaW50IG5zcF9xdWV1ZWNvbW1hbmQoU2NzaV9DbW5kICpTQ3BudCwgdm9pZCAoKmRvbmUpKFNjc2lfQ21uZCAqKSkKK3N0YXRpYyBpbnQgbnNwX3F1ZXVlY29tbWFuZChzdHJ1Y3Qgc2NzaV9jbW5kICpTQ3BudCwKKwkJCSAgICB2b2lkICgqZG9uZSkoc3RydWN0IHNjc2lfY21uZCAqKSkKIHsKICNpZmRlZiBOU1BfREVCVUcKIAkvKnVuc2lnbmVkIGludCBob3N0X2lkID0gU0NwbnQtPmRldmljZS0+aG9zdC0+dGhpc19pZDsqLwpAQCAtMzY1LDcgKzM2Niw3IEBACiAvKgogICogU3RhcnQgc2VsZWN0aW9uIHBoYXNlCiAgKi8KLXN0YXRpYyBpbnQgbnNwaHdfc3RhcnRfc2VsZWN0aW9uKFNjc2lfQ21uZCAqU0NwbnQpCitzdGF0aWMgaW50IG5zcGh3X3N0YXJ0X3NlbGVjdGlvbihzdHJ1Y3Qgc2NzaV9jbW5kICpTQ3BudCkKIHsKIAl1bnNpZ25lZCBpbnQgIGhvc3RfaWQJID0gU0NwbnQtPmRldmljZS0+aG9zdC0+dGhpc19pZDsKIAl1bnNpZ25lZCBpbnQgIGJhc2UJID0gU0NwbnQtPmRldmljZS0+aG9zdC0+aW9fcG9ydDsKQEAgLTQ0Niw3ICs0NDcsNyBAQAogLyoKICAqIHNldHVwIHN5bmNocm9ub3VzIGRhdGEgdHJhbnNmZXIgbW9kZQogICovCi1zdGF0aWMgaW50IG5zcF9hbmFseXplX3NkdHIoU2NzaV9DbW5kICpTQ3BudCkKK3N0YXRpYyBpbnQgbnNwX2FuYWx5emVfc2R0cihzdHJ1Y3Qgc2NzaV9jbW5kICpTQ3BudCkKIHsKIAl1bnNpZ25lZCBjaGFyCSAgICAgICB0YXJnZXQgPSBzY21kX2lkKFNDcG50KTsKIC8vCXVuc2lnbmVkIGNoYXIJICAgICAgIGx1biAgICA9IFNDcG50LT5kZXZpY2UtPmx1bjsKQEAgLTUwNCw3ICs1MDUsNyBAQAogLyoKICAqIHN0YXJ0IG5pbmphIGhhcmR3YXJlIHRpbWVyCiAgKi8KLXN0YXRpYyB2b2lkIG5zcF9zdGFydF90aW1lcihTY3NpX0NtbmQgKlNDcG50LCBpbnQgdGltZSkKK3N0YXRpYyB2b2lkIG5zcF9zdGFydF90aW1lcihzdHJ1Y3Qgc2NzaV9jbW5kICpTQ3BudCwgaW50IHRpbWUpCiB7CiAJdW5zaWduZWQgaW50IGJhc2UgPSBTQ3BudC0+ZGV2aWNlLT5ob3N0LT5pb19wb3J0OwogCW5zcF9od19kYXRhICpkYXRhID0gKG5zcF9od19kYXRhICopU0NwbnQtPmRldmljZS0+aG9zdC0+aG9zdGRhdGE7CkBAIC01MTcsNyArNTE4LDggQEAKIC8qCiAgKiB3YWl0IGZvciBidXMgcGhhc2UgY2hhbmdlCiAgKi8KLXN0YXRpYyBpbnQgbnNwX25lZ2F0ZV9zaWduYWwoU2NzaV9DbW5kICpTQ3BudCwgdW5zaWduZWQgY2hhciBtYXNrLCBjaGFyICpzdHIpCitzdGF0aWMgaW50IG5zcF9uZWdhdGVfc2lnbmFsKHN0cnVjdCBzY3NpX2NtbmQgKlNDcG50LCB1bnNpZ25lZCBjaGFyIG1hc2ssCisJCQkgICAgIGNoYXIgKnN0cikKIHsKIAl1bnNpZ25lZCBpbnQgIGJhc2UgPSBTQ3BudC0+ZGV2aWNlLT5ob3N0LT5pb19wb3J0OwogCXVuc2lnbmVkIGNoYXIgcmVnOwpAQCAtNTQ0LDkgKzU0Niw5IEBACiAvKgogICogZXhwZWN0IE5pbmphIElycQogICovCi1zdGF0aWMgaW50IG5zcF9leHBlY3Rfc2lnbmFsKFNjc2lfQ21uZAkgICAqU0NwbnQsCi0JCQkgICAgIHVuc2lnbmVkIGNoYXIgIGN1cnJlbnRfcGhhc2UsCi0JCQkgICAgIHVuc2lnbmVkIGNoYXIgIG1hc2spCitzdGF0aWMgaW50IG5zcF9leHBlY3Rfc2lnbmFsKHN0cnVjdCBzY3NpX2NtbmQgKlNDcG50LAorCQkJICAgICB1bnNpZ25lZCBjaGFyIGN1cnJlbnRfcGhhc2UsCisJCQkgICAgIHVuc2lnbmVkIGNoYXIgbWFzaykKIHsKIAl1bnNpZ25lZCBpbnQgIGJhc2UJID0gU0NwbnQtPmRldmljZS0+aG9zdC0+aW9fcG9ydDsKIAlpbnQJICAgICAgdGltZV9vdXQ7CkBAIC01NzksNyArNTgxLDcgQEAKIC8qCiAgKiB0cmFuc2ZlciBTQ1NJIG1lc3NhZ2UKICAqLwotc3RhdGljIGludCBuc3BfeGZlcihTY3NpX0NtbmQgKlNDcG50LCBpbnQgcGhhc2UpCitzdGF0aWMgaW50IG5zcF94ZmVyKHN0cnVjdCBzY3NpX2NtbmQgKlNDcG50LCBpbnQgcGhhc2UpCiB7CiAJdW5zaWduZWQgaW50ICBiYXNlID0gU0NwbnQtPmRldmljZS0+aG9zdC0+aW9fcG9ydDsKIAluc3BfaHdfZGF0YSAgKmRhdGEgPSAobnNwX2h3X2RhdGEgKilTQ3BudC0+ZGV2aWNlLT5ob3N0LT5ob3N0ZGF0YTsKQEAgLTYxOSw3ICs2MjEsNyBAQAogLyoKICAqIGdldCBleHRyYSBTQ1NJIGRhdGEgZnJvbSBmaWZvCiAgKi8KLXN0YXRpYyBpbnQgbnNwX2RhdGFwaGFzZV9ieXBhc3MoU2NzaV9DbW5kICpTQ3BudCkKK3N0YXRpYyBpbnQgbnNwX2RhdGFwaGFzZV9ieXBhc3Moc3RydWN0IHNjc2lfY21uZCAqU0NwbnQpCiB7CiAJbnNwX2h3X2RhdGEgKmRhdGEgPSAobnNwX2h3X2RhdGEgKilTQ3BudC0+ZGV2aWNlLT5ob3N0LT5ob3N0ZGF0YTsKIAl1bnNpZ25lZCBpbnQgY291bnQ7CkBAIC02NTEsNyArNjUzLDcgQEAKIC8qCiAgKiBhY2NlcHQgcmVzZWxlY3Rpb24KICAqLwotc3RhdGljIGludCBuc3BfcmVzZWxlY3RlZChTY3NpX0NtbmQgKlNDcG50KQorc3RhdGljIGludCBuc3BfcmVzZWxlY3RlZChzdHJ1Y3Qgc2NzaV9jbW5kICpTQ3BudCkKIHsKIAl1bnNpZ25lZCBpbnQgIGJhc2UgICAgPSBTQ3BudC0+ZGV2aWNlLT5ob3N0LT5pb19wb3J0OwogCXVuc2lnbmVkIGludCAgaG9zdF9pZCA9IFNDcG50LT5kZXZpY2UtPmhvc3QtPnRoaXNfaWQ7CkBAIC02OTAsNyArNjkyLDcgQEAKIC8qCiAgKiBjb3VudCBob3cgbWFueSBkYXRhIHRyYW5zZmVyZAogICovCi1zdGF0aWMgaW50IG5zcF9maWZvX2NvdW50KFNjc2lfQ21uZCAqU0NwbnQpCitzdGF0aWMgaW50IG5zcF9maWZvX2NvdW50KHN0cnVjdCBzY3NpX2NtbmQgKlNDcG50KQogewogCXVuc2lnbmVkIGludCBiYXNlID0gU0NwbnQtPmRldmljZS0+aG9zdC0+aW9fcG9ydDsKIAl1bnNpZ25lZCBpbnQgY291bnQ7CkBAIC03MTcsNyArNzE5LDcgQEAKIC8qCiAgKiByZWFkIGRhdGEgaW4gREFUQSBJTiBwaGFzZQogICovCi1zdGF0aWMgdm9pZCBuc3BfcGlvX3JlYWQoU2NzaV9DbW5kICpTQ3BudCkKK3N0YXRpYyB2b2lkIG5zcF9waW9fcmVhZChzdHJ1Y3Qgc2NzaV9jbW5kICpTQ3BudCkKIHsKIAl1bnNpZ25lZCBpbnQgIGJhc2UgICAgICA9IFNDcG50LT5kZXZpY2UtPmhvc3QtPmlvX3BvcnQ7CiAJdW5zaWduZWQgbG9uZyBtbWlvX2Jhc2UgPSBTQ3BudC0+ZGV2aWNlLT5ob3N0LT5iYXNlOwpAQCAtODEyLDcgKzgxNCw3IEBACiAvKgogICogd3JpdGUgZGF0YSBpbiBEQVRBIE9VVCBwaGFzZQogICovCi1zdGF0aWMgdm9pZCBuc3BfcGlvX3dyaXRlKFNjc2lfQ21uZCAqU0NwbnQpCitzdGF0aWMgdm9pZCBuc3BfcGlvX3dyaXRlKHN0cnVjdCBzY3NpX2NtbmQgKlNDcG50KQogewogCXVuc2lnbmVkIGludCAgYmFzZSAgICAgID0gU0NwbnQtPmRldmljZS0+aG9zdC0+aW9fcG9ydDsKIAl1bnNpZ25lZCBsb25nIG1taW9fYmFzZSA9IFNDcG50LT5kZXZpY2UtPmhvc3QtPmJhc2U7CkBAIC05MDUsNyArOTA3LDcgQEAKIC8qCiAgKiBzZXR1cCBzeW5jaHJvbm91cy9hc3luY2hyb25vdXMgZGF0YSB0cmFuc2ZlciBtb2RlCiAgKi8KLXN0YXRpYyBpbnQgbnNwX25leHVzKFNjc2lfQ21uZCAqU0NwbnQpCitzdGF0aWMgaW50IG5zcF9uZXh1cyhzdHJ1Y3Qgc2NzaV9jbW5kICpTQ3BudCkKIHsKIAl1bnNpZ25lZCBpbnQgICBiYXNlICAgPSBTQ3BudC0+ZGV2aWNlLT5ob3N0LT5pb19wb3J0OwogCXVuc2lnbmVkIGNoYXIgIHRhcmdldCA9IHNjbWRfaWQoU0NwbnQpOwpAQCAtOTUyLDcgKzk1NCw3IEBACiB7CiAJdW5zaWduZWQgaW50ICAgYmFzZTsKIAl1bnNpZ25lZCBjaGFyICBpcnFfc3RhdHVzLCBpcnFfcGhhc2UsIHBoYXNlOwotCVNjc2lfQ21uZCAgICAgKnRtcFNDOworCXN0cnVjdCBzY3NpX2NtbmQgKnRtcFNDOwogCXVuc2lnbmVkIGNoYXIgIHRhcmdldCwgbHVuOwogCXVuc2lnbmVkIGludCAgKnN5bmNfbmVnOwogCWludCAgICAgICAgICAgIGksIHRtcDsKQEAgLTE1MzAsNyArMTUzMiw3IEBACiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAKIC8qCi1zdGF0aWMgaW50IG5zcF9laF9hYm9ydChTY3NpX0NtbmQgKlNDcG50KQorc3RhdGljIGludCBuc3BfZWhfYWJvcnQoc3RydWN0IHNjc2lfY21uZCAqU0NwbnQpCiB7CiAJbnNwX2RiZyhOU1BfREVCVUdfQlVTUkVTRVQsICJTQ3BudD0weCVwIiwgU0NwbnQpOwogCkBAIC0xNTU4LDcgKzE1NjAsNyBAQAogCXJldHVybiBTVUNDRVNTOwogfQogCi1zdGF0aWMgaW50IG5zcF9laF9idXNfcmVzZXQoU2NzaV9DbW5kICpTQ3BudCkKK3N0YXRpYyBpbnQgbnNwX2VoX2J1c19yZXNldChzdHJ1Y3Qgc2NzaV9jbW5kICpTQ3BudCkKIHsKIAluc3BfaHdfZGF0YSAqZGF0YSA9IChuc3BfaHdfZGF0YSAqKVNDcG50LT5kZXZpY2UtPmhvc3QtPmhvc3RkYXRhOwogCkBAIC0xNTY3LDcgKzE1NjksNyBAQAogCXJldHVybiBuc3BfYnVzX3Jlc2V0KGRhdGEpOwogfQogCi1zdGF0aWMgaW50IG5zcF9laF9ob3N0X3Jlc2V0KFNjc2lfQ21uZCAqU0NwbnQpCitzdGF0aWMgaW50IG5zcF9laF9ob3N0X3Jlc2V0KHN0cnVjdCBzY3NpX2NtbmQgKlNDcG50KQogewogCW5zcF9od19kYXRhICpkYXRhID0gKG5zcF9od19kYXRhICopU0NwbnQtPmRldmljZS0+aG9zdC0+aG9zdGRhdGE7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9wY21jaWEvbnNwX2NzLmggYi9kcml2ZXJzL3Njc2kvcGNtY2lhL25zcF9jcy5oCmluZGV4IGE4ODcxNGYuLjYyNWNhOTcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9wY21jaWEvbnNwX2NzLmgKKysrIGIvZHJpdmVycy9zY3NpL3BjbWNpYS9uc3BfY3MuaApAQCAtMjY2LDcgKzI2Niw3IEBACiAKIAlpbnQgICAgICAgICAgIFRpbWVyQ291bnQ7CiAJaW50ICAgICAgICAgICBTZWxlY3Rpb25UaW1lT3V0OwotCVNjc2lfQ21uZCAgICAqQ3VycmVudFNDOworCXN0cnVjdCBzY3NpX2NtbmQgKkN1cnJlbnRTQzsKIAkvL2ludCAgICAgICAgICAgQ3Vycm5ldFRhcmdldDsKIAogCWludCAgICAgICAgICAgRmlmb0NvdW50OwpAQCAtMzE5LDMwICszMTksMzQgQEAKIAkJCQkJIGludCAgICAgaG9zdG5vLAogI2VuZGlmCiAJCQkJCSBpbnQgICAgIGlub3V0KTsKLXN0YXRpYyAgICAgICAgaW50ICAgICAgICBuc3BfcXVldWVjb21tYW5kKFNjc2lfQ21uZCAqU0NwbnQsIHZvaWQgKCogZG9uZSkoU2NzaV9DbW5kICpTQ3BudCkpOworc3RhdGljIGludCBuc3BfcXVldWVjb21tYW5kKHN0cnVjdCBzY3NpX2NtbmQgKlNDcG50LAorCQkJICAgIHZvaWQgKCogZG9uZSkoc3RydWN0IHNjc2lfY21uZCAqU0NwbnQpKTsKIAogLyogRXJyb3IgaGFuZGxlciAqLwotLypzdGF0aWMgaW50IG5zcF9laF9hYm9ydCAgICAgICAoU2NzaV9DbW5kICpTQ3BudCk7Ki8KLS8qc3RhdGljIGludCBuc3BfZWhfZGV2aWNlX3Jlc2V0KFNjc2lfQ21uZCAqU0NwbnQpOyovCi1zdGF0aWMgaW50IG5zcF9laF9idXNfcmVzZXQgICAgKFNjc2lfQ21uZCAqU0NwbnQpOwotc3RhdGljIGludCBuc3BfZWhfaG9zdF9yZXNldCAgIChTY3NpX0NtbmQgKlNDcG50KTsKKy8qc3RhdGljIGludCBuc3BfZWhfYWJvcnQgICAgICAgKHN0cnVjdCBzY3NpX2NtbmQgKlNDcG50KTsqLworLypzdGF0aWMgaW50IG5zcF9laF9kZXZpY2VfcmVzZXQoc3RydWN0IHNjc2lfY21uZCAqU0NwbnQpOyovCitzdGF0aWMgaW50IG5zcF9laF9idXNfcmVzZXQgICAgKHN0cnVjdCBzY3NpX2NtbmQgKlNDcG50KTsKK3N0YXRpYyBpbnQgbnNwX2VoX2hvc3RfcmVzZXQgICAoc3RydWN0IHNjc2lfY21uZCAqU0NwbnQpOwogc3RhdGljIGludCBuc3BfYnVzX3Jlc2V0ICAgICAgIChuc3BfaHdfZGF0YSAqZGF0YSk7CiAKIC8qICovCiBzdGF0aWMgaW50ICBuc3Bod19pbml0ICAgICAgICAgICAobnNwX2h3X2RhdGEgKmRhdGEpOwotc3RhdGljIGludCAgbnNwaHdfc3RhcnRfc2VsZWN0aW9uKFNjc2lfQ21uZCAqU0NwbnQpOwotc3RhdGljIHZvaWQgbnNwX3N0YXJ0X3RpbWVyICAgICAgKFNjc2lfQ21uZCAqU0NwbnQsIGludCB0aW1lKTsKLXN0YXRpYyBpbnQgIG5zcF9maWZvX2NvdW50ICAgICAgIChTY3NpX0NtbmQgKlNDcG50KTsKLXN0YXRpYyB2b2lkIG5zcF9waW9fcmVhZCAgICAgICAgIChTY3NpX0NtbmQgKlNDcG50KTsKLXN0YXRpYyB2b2lkIG5zcF9waW9fd3JpdGUgICAgICAgIChTY3NpX0NtbmQgKlNDcG50KTsKLXN0YXRpYyBpbnQgIG5zcF9uZXh1cyAgICAgICAgICAgIChTY3NpX0NtbmQgKlNDcG50KTsKLXN0YXRpYyB2b2lkIG5zcF9zY3NpX2RvbmUgICAgICAgIChTY3NpX0NtbmQgKlNDcG50KTsKLXN0YXRpYyBpbnQgIG5zcF9hbmFseXplX3NkdHIgICAgIChTY3NpX0NtbmQgKlNDcG50KTsKLXN0YXRpYyBpbnQgIG5zcF9uZWdhdGVfc2lnbmFsICAgIChTY3NpX0NtbmQgKlNDcG50LCB1bnNpZ25lZCBjaGFyIG1hc2ssIGNoYXIgKnN0cik7Ci1zdGF0aWMgaW50ICBuc3BfZXhwZWN0X3NpZ25hbCAgICAoU2NzaV9DbW5kICpTQ3BudCwgdW5zaWduZWQgY2hhciBjdXJyZW50X3BoYXNlLCB1bnNpZ25lZCBjaGFyICBtYXNrKTsKLXN0YXRpYyBpbnQgIG5zcF94ZmVyICAgICAgICAgICAgIChTY3NpX0NtbmQgKlNDcG50LCBpbnQgcGhhc2UpOwotc3RhdGljIGludCAgbnNwX2RhdGFwaGFzZV9ieXBhc3MgKFNjc2lfQ21uZCAqU0NwbnQpOwotc3RhdGljIGludCAgbnNwX3Jlc2VsZWN0ZWQgICAgICAgKFNjc2lfQ21uZCAqU0NwbnQpOworc3RhdGljIGludCAgbnNwaHdfc3RhcnRfc2VsZWN0aW9uKHN0cnVjdCBzY3NpX2NtbmQgKlNDcG50KTsKK3N0YXRpYyB2b2lkIG5zcF9zdGFydF90aW1lciAgICAgIChzdHJ1Y3Qgc2NzaV9jbW5kICpTQ3BudCwgaW50IHRpbWUpOworc3RhdGljIGludCAgbnNwX2ZpZm9fY291bnQgICAgICAgKHN0cnVjdCBzY3NpX2NtbmQgKlNDcG50KTsKK3N0YXRpYyB2b2lkIG5zcF9waW9fcmVhZCAgICAgICAgIChzdHJ1Y3Qgc2NzaV9jbW5kICpTQ3BudCk7CitzdGF0aWMgdm9pZCBuc3BfcGlvX3dyaXRlICAgICAgICAoc3RydWN0IHNjc2lfY21uZCAqU0NwbnQpOworc3RhdGljIGludCAgbnNwX25leHVzICAgICAgICAgICAgKHN0cnVjdCBzY3NpX2NtbmQgKlNDcG50KTsKK3N0YXRpYyB2b2lkIG5zcF9zY3NpX2RvbmUgICAgICAgIChzdHJ1Y3Qgc2NzaV9jbW5kICpTQ3BudCk7CitzdGF0aWMgaW50ICBuc3BfYW5hbHl6ZV9zZHRyICAgICAoc3RydWN0IHNjc2lfY21uZCAqU0NwbnQpOworc3RhdGljIGludCAgbnNwX25lZ2F0ZV9zaWduYWwgICAgKHN0cnVjdCBzY3NpX2NtbmQgKlNDcG50LAorCQkJCSAgdW5zaWduZWQgY2hhciBtYXNrLCBjaGFyICpzdHIpOworc3RhdGljIGludCAgbnNwX2V4cGVjdF9zaWduYWwgICAgKHN0cnVjdCBzY3NpX2NtbmQgKlNDcG50LAorCQkJCSAgdW5zaWduZWQgY2hhciBjdXJyZW50X3BoYXNlLAorCQkJCSAgdW5zaWduZWQgY2hhciAgbWFzayk7CitzdGF0aWMgaW50ICBuc3BfeGZlciAgICAgICAgICAgICAoc3RydWN0IHNjc2lfY21uZCAqU0NwbnQsIGludCBwaGFzZSk7CitzdGF0aWMgaW50ICBuc3BfZGF0YXBoYXNlX2J5cGFzcyAoc3RydWN0IHNjc2lfY21uZCAqU0NwbnQpOworc3RhdGljIGludCAgbnNwX3Jlc2VsZWN0ZWQgICAgICAgKHN0cnVjdCBzY3NpX2NtbmQgKlNDcG50KTsKIHN0YXRpYyBzdHJ1Y3QgU2NzaV9Ib3N0ICpuc3BfZGV0ZWN0KHN0cnVjdCBzY3NpX2hvc3RfdGVtcGxhdGUgKnNodCk7CiAKIC8qIEludGVycnVwdCBoYW5kbGVyICovCkBAIC0zNTUsOCArMzU5LDggQEAKIAogLyogRGVidWcgKi8KICNpZmRlZiBOU1BfREVCVUcKLXN0YXRpYyB2b2lkIHNob3dfY29tbWFuZCAoU2NzaV9DbW5kICpTQ3BudCk7Ci1zdGF0aWMgdm9pZCBzaG93X3BoYXNlICAgKFNjc2lfQ21uZCAqU0NwbnQpOworc3RhdGljIHZvaWQgc2hvd19jb21tYW5kIChzdHJ1Y3Qgc2NzaV9jbW5kICpTQ3BudCk7CitzdGF0aWMgdm9pZCBzaG93X3BoYXNlICAgKHN0cnVjdCBzY3NpX2NtbmQgKlNDcG50KTsKIHN0YXRpYyB2b2lkIHNob3dfYnVzcGhhc2UodW5zaWduZWQgY2hhciBzdGF0KTsKIHN0YXRpYyB2b2lkIHNob3dfbWVzc2FnZSAobnNwX2h3X2RhdGEgKmRhdGEpOwogI2Vsc2UKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9wY21jaWEvbnNwX2RlYnVnLmMgYi9kcml2ZXJzL3Njc2kvcGNtY2lhL25zcF9kZWJ1Zy5jCmluZGV4IDYyZTVjNjAuLjJmNzVmZTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9wY21jaWEvbnNwX2RlYnVnLmMKKysrIGIvZHJpdmVycy9zY3NpL3BjbWNpYS9uc3BfZGVidWcuYwpAQCAtMTM4LDEyICsxMzgsMTIgQEAKIAlwcmludGsoIlxuIik7CiB9CiAKLXN0YXRpYyB2b2lkIHNob3dfY29tbWFuZChTY3NpX0NtbmQgKlNDcG50KQorc3RhdGljIHZvaWQgc2hvd19jb21tYW5kKHN0cnVjdCBzY3NpX2NtbmQgKlNDcG50KQogewogCXByaW50X2NvbW1hbmRrKFNDcG50LT5jbW5kKTsKIH0KIAotc3RhdGljIHZvaWQgc2hvd19waGFzZShTY3NpX0NtbmQgKlNDcG50KQorc3RhdGljIHZvaWQgc2hvd19waGFzZShzdHJ1Y3Qgc2NzaV9jbW5kICpTQ3BudCkKIHsKIAlpbnQgaSA9IFNDcG50LT5TQ3AucGhhc2U7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9wY21jaWEvbnNwX21lc3NhZ2UuYyBiL2RyaXZlcnMvc2NzaS9wY21jaWEvbnNwX21lc3NhZ2UuYwppbmRleCBkNzA1NzczLi5lZjU5M2I3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvcGNtY2lhL25zcF9tZXNzYWdlLmMKKysrIGIvZHJpdmVycy9zY3NpL3BjbWNpYS9uc3BfbWVzc2FnZS5jCkBAIC04LDcgKzgsNyBAQAogCiAvKiAkSWQ6IG5zcF9tZXNzYWdlLmMsdiAxLjYgMjAwMy8wNy8yNiAxNDoyMTowOSBlbGNhIEV4cCAkICovCiAKLXN0YXRpYyB2b2lkIG5zcF9tZXNzYWdlX2luKFNjc2lfQ21uZCAqU0NwbnQpCitzdGF0aWMgdm9pZCBuc3BfbWVzc2FnZV9pbihzdHJ1Y3Qgc2NzaV9jbW5kICpTQ3BudCkKIHsKIAl1bnNpZ25lZCBpbnQgIGJhc2UgPSBTQ3BudC0+ZGV2aWNlLT5ob3N0LT5pb19wb3J0OwogCW5zcF9od19kYXRhICAqZGF0YSA9IChuc3BfaHdfZGF0YSAqKVNDcG50LT5kZXZpY2UtPmhvc3QtPmhvc3RkYXRhOwpAQCAtNTAsNyArNTAsNyBAQAogCiB9CiAKLXN0YXRpYyB2b2lkIG5zcF9tZXNzYWdlX291dChTY3NpX0NtbmQgKlNDcG50KQorc3RhdGljIHZvaWQgbnNwX21lc3NhZ2Vfb3V0KHN0cnVjdCBzY3NpX2NtbmQgKlNDcG50KQogewogCW5zcF9od19kYXRhICpkYXRhID0gKG5zcF9od19kYXRhICopU0NwbnQtPmRldmljZS0+aG9zdC0+aG9zdGRhdGE7CiAJaW50IHJldCA9IDE7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvcHBhLmMgYi9kcml2ZXJzL3Njc2kvcHBhLmMKaW5kZXggYjBlYmEzOS4uODlhMmE5ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL3BwYS5jCisrKyBiL2RyaXZlcnMvc2NzaS9wcGEuYwpAQCAtMTAxMiw3ICsxMDEyLDcgQEAKIHN0YXRpYyBpbnQgX19wcGFfYXR0YWNoKHN0cnVjdCBwYXJwb3J0ICpwYikKIHsKIAlzdHJ1Y3QgU2NzaV9Ib3N0ICpob3N0OwotCURFQ0xBUkVfV0FJVF9RVUVVRV9IRUFEKHdhaXRpbmcpOworCURFQ0xBUkVfV0FJVF9RVUVVRV9IRUFEX09OU1RBQ0sod2FpdGluZyk7CiAJREVGSU5FX1dBSVQod2FpdCk7CiAJcHBhX3N0cnVjdCAqZGV2OwogCWludCBwb3J0czsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9wc2kyNDBpLmMgYi9kcml2ZXJzL3Njc2kvcHNpMjQwaS5jCmluZGV4IGE3MjBjOTIuLjg5OWU4OWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9wc2kyNDBpLmMKKysrIGIvZHJpdmVycy9zY3NpL3BzaTI0MGkuYwpAQCAtODcsMTEgKzg3LDExIEBACiAJewogCVVTSE9SVAkJIHBvcnRzWzEzXTsKIAlPVVJfREVWSUNFCSBkZXZpY2VbOF07Ci0JU2NzaV9DbW5kCSpwU0NtbmQ7CisJc3RydWN0IHNjc2lfY21uZCAqcFNDbW5kOwogCUlERV9TVFJVQ1QJIGlkZTsKIAlVTE9ORwkJIHN0YXJ0U2VjdG9yOwogCVVTSE9SVAkJIHNlY3RvckNvdW50OwotCVNjc2lfQ21uZAkqU0NwbnQ7CisJc3RydWN0IHNjc2lfY21uZCAqU0NwbnQ7CiAJVk9JRAkJKmJ1ZmZlcjsKIAlVU0hPUlQJCSBleHBlY3RpbmdJUlE7CiAJfQlBREFQVEVSMjQwSSwgKlBBREFQVEVSMjQwSTsKQEAgLTI1MywxMiArMjUzLDEyIEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHN0YXRpYyB2b2lkIElycV9IYW5kbGVyIChpbnQgaXJxLCB2b2lkICpkZXZfaWQpCiAJewotCXN0cnVjdCBTY3NpX0hvc3QgICAqc2hvc3Q7CQkJLy8gUG9pbnRlciB0byBob3N0IGRhdGEgYmxvY2sKLQlQQURBUFRFUjI0MEkJCXBhZGFwdGVyOwkJLy8gUG9pbnRlciB0byBhZGFwdGVyIGNvbnRyb2wgc3RydWN0dXJlCi0JVVNIT1JUCQkgCSAgICpwcG9ydHM7CQkJLy8gSS9PIHBvcnQgYXJyYXkKLQlTY3NpX0NtbmQJCSAgICpTQ3BudDsKLQlVQ0hBUgkJCQlzdGF0dXM7Ci0JaW50CQkJCQl6OworCXN0cnVjdCBTY3NpX0hvc3QgKnNob3N0OwkvLyBQb2ludGVyIHRvIGhvc3QgZGF0YSBibG9jaworCVBBREFQVEVSMjQwSSBwYWRhcHRlcjsJCS8vIFBvaW50ZXIgdG8gYWRhcHRlciBjb250cm9sIHN0cnVjdHVyZQorCVVTSE9SVCAqcHBvcnRzOwkJCS8vIEkvTyBwb3J0IGFycmF5CisJc3RydWN0IHNjc2lfY21uZCAqU0NwbnQ7CisJVUNIQVIgc3RhdHVzOworCWludCB6OwogCiAJREVCKHByaW50ayAoIlxucHNpMjQwaSByZWNlaXZlZCBpbnRlcnJ1cHRcbiIpKTsKIApAQCAtMzI4LDcgKzMyOCw3IEBACiAJCQkJcGlucXVpcnlEYXRhLT5BZGRpdGlvbmFsTGVuZ3RoID0gMzUgLSA0OwogCiAJCQkJLy8gRmlsbCBpbiB2ZW5kb3IgaWRlbnRpZmljYXRpb24gZmllbGRzLgotCQkJCWZvciAoIHogPSAwOyAgeiA8IDIwOyAgeiArPSAyICkKKwkJCQlmb3IgKCB6ID0gMDsgIHogPCA4OyAgeiArPSAyICkKIAkJCQkJewogCQkJCQlwaW5xdWlyeURhdGEtPlZlbmRvcklkW3pdCSAgPSAoKFVDSEFSICopaWRlbnRpZnlEYXRhLk1vZGVsTnVtYmVyKVt6ICsgMV07CiAJCQkJCXBpbnF1aXJ5RGF0YS0+VmVuZG9ySWRbeiArIDFdID0gKChVQ0hBUiAqKWlkZW50aWZ5RGF0YS5Nb2RlbE51bWJlcilbel07CkBAIC0zODksMTIgKzM4OSwxNyBAQAogICoJUmV0dXJuczoJCVN0YXR1cyBjb2RlLgogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIGludCBQc2kyNDBpX1F1ZXVlQ29tbWFuZCAoU2NzaV9DbW5kICpTQ3BudCwgdm9pZCAoKmRvbmUpKFNjc2lfQ21uZCAqKSkKK3N0YXRpYyBpbnQgUHNpMjQwaV9RdWV1ZUNvbW1hbmQoc3RydWN0IHNjc2lfY21uZCAqU0NwbnQsCisJCQkJdm9pZCAoKmRvbmUpKHN0cnVjdCBzY3NpX2NtbmQgKikpCiAJewotCVVDSEFSCQkgICAqY2RiID0gKFVDSEFSICopU0NwbnQtPmNtbmQ7CQkJCQkvLyBQb2ludGVyIHRvIFNDU0kgQ0RCCi0JUEFEQVBURVIyNDBJCXBhZGFwdGVyID0gSE9TVERBVEEgKFNDcG50LT5kZXZpY2UtPmhvc3QpOyAJCQkvLyBQb2ludGVyIHRvIGFkYXB0ZXIgY29udHJvbCBzdHJ1Y3R1cmUKLQlQT1VSX0RFVklDRSAJCXBkZXYJID0gJnBhZGFwdGVyLT5kZXZpY2UgW1NDcG50LT5kZXZpY2UtPmlkXTsvLyBQb2ludGVyIHRvIGRldmljZSBpbmZvcm1hdGlvbgotCVVDSEFSCQkJcmM7CQkJCQkJCQkJCQkvLyBjb21tYW5kIHJldHVybiBjb2RlCisJVUNIQVIgKmNkYiA9IChVQ0hBUiAqKVNDcG50LT5jbW5kOworCS8vIFBvaW50ZXIgdG8gU0NTSSBDREIKKwlQQURBUFRFUjI0MEkgcGFkYXB0ZXIgPSBIT1NUREFUQSAoU0NwbnQtPmRldmljZS0+aG9zdCk7CisJLy8gUG9pbnRlciB0byBhZGFwdGVyIGNvbnRyb2wgc3RydWN0dXJlCisJUE9VUl9ERVZJQ0UgcGRldiA9ICZwYWRhcHRlci0+ZGV2aWNlIFtTQ3BudC0+ZGV2aWNlLT5pZF07CisJLy8gUG9pbnRlciB0byBkZXZpY2UgaW5mb3JtYXRpb24KKwlVQ0hBUiByYzsKKwkvLyBjb21tYW5kIHJldHVybiBjb2RlCiAKIAlTQ3BudC0+c2NzaV9kb25lID0gZG9uZTsKIAlwYWRhcHRlci0+aWRlLmlkZS5pZGVzLnNwaWdvdCA9IHBkZXYtPnNwaWdvdDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9wc2kyNDBpLmggYi9kcml2ZXJzL3Njc2kvcHNpMjQwaS5oCmluZGV4IDZhNTk4NzYuLjIxZWJiOTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9wc2kyNDBpLmgKKysrIGIvZHJpdmVycy9zY3NpL3BzaTI0MGkuaApAQCAtMzA5LDcgKzMwOSw3IEBACiAjZW5kaWYJLy8gUFNJX0VJREVfU0NTSU9QCiAKIC8vIGZ1bmN0aW9uIHByb3RvdHlwZXMKLWludCBQc2kyNDBpX0NvbW1hbmQJCQkoU2NzaV9DbW5kICpTQ3BudCk7Ci1pbnQgUHNpMjQwaV9BYm9ydAkJCShTY3NpX0NtbmQgKlNDcG50KTsKLWludCBQc2kyNDBpX1Jlc2V0CQkJKFNjc2lfQ21uZCAqU0NwbnQsIHVuc2lnbmVkIGludCBmbGFncyk7CitpbnQgUHNpMjQwaV9Db21tYW5kKHN0cnVjdCBzY3NpX2NtbmQgKlNDcG50KTsKK2ludCBQc2kyNDBpX0Fib3J0KHN0cnVjdCBzY3NpX2NtbmQgKlNDcG50KTsKK2ludCBQc2kyNDBpX1Jlc2V0KHN0cnVjdCBzY3NpX2NtbmQgKlNDcG50LCB1bnNpZ25lZCBpbnQgZmxhZ3MpOwogI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvcWxhMTI4MC5jIGIvZHJpdmVycy9zY3NpL3FsYTEyODAuYwppbmRleCAyNTIxZDU0Li4xNmFmNWI3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvcWxhMTI4MC5jCisrKyBiL2RyaXZlcnMvc2NzaS9xbGExMjgwLmMKQEAgLTkzMSwxMSArOTMxLDEwIEBACiAKIAljYXNlIEJVU19SRVNFVDoKIAkJaWYgKHFsYTEyODBfdmVyYm9zZSkKLQkJCXByaW50ayhLRVJOX0lORk8gInFsYTEyODAoJWxkOiVkKTogSXNzdWluZyBCVVMgIgotCQkJICAgICAgICJERVZJQ0UgUkVTRVRcbiIsIGhhLT5ob3N0X25vLCBidXMpOwotCQlpZiAocWxhMTI4MF9idXNfcmVzZXQoaGEsIGJ1cyA9PSAwKSkKKwkJCXByaW50ayhLRVJOX0lORk8gInFsYTEyODAoJWxkOiVkKTogSXNzdWVkIGJ1cyAiCisJCQkgICAgICAgInJlc2V0LlxuIiwgaGEtPmhvc3Rfbm8sIGJ1cyk7CisJCWlmIChxbGExMjgwX2J1c19yZXNldChoYSwgYnVzKSA9PSAwKQogCQkJcmVzdWx0ID0gU1VDQ0VTUzsKLQogCQlicmVhazsKIAogCWNhc2UgQURBUFRFUl9SRVNFVDoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9hdHRyLmMgYi9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfYXR0ci5jCmluZGV4IGVlNzVhNzEuLjI4NWM4ZTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9hdHRyLmMKKysrIGIvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX2F0dHIuYwpAQCAtMzc5LDIxICszNzksMzcgQEAKIAkucmVhZCA9IHFsYTJ4MDBfc3lzZnNfcmVhZF9zZnAsCiB9OwogCitzdGF0aWMgc3RydWN0IHN5c2ZzX2VudHJ5IHsKKwljaGFyICpuYW1lOworCXN0cnVjdCBiaW5fYXR0cmlidXRlICphdHRyOworCWludCBpczRHQnBfb25seTsKK30gYmluX2ZpbGVfZW50cmllc1tdID0geworCXsgImZ3X2R1bXAiLCAmc3lzZnNfZndfZHVtcF9hdHRyLCB9LAorCXsgIm52cmFtIiwgJnN5c2ZzX252cmFtX2F0dHIsIH0sCisJeyAib3B0cm9tIiwgJnN5c2ZzX29wdHJvbV9hdHRyLCB9LAorCXsgIm9wdHJvbV9jdGwiLCAmc3lzZnNfb3B0cm9tX2N0bF9hdHRyLCB9LAorCXsgInZwZCIsICZzeXNmc192cGRfYXR0ciwgMSB9LAorCXsgInNmcCIsICZzeXNmc19zZnBfYXR0ciwgMSB9LAorCXsgMCB9LAorfTsKKwogdm9pZAogcWxhMngwMF9hbGxvY19zeXNmc19hdHRyKHNjc2lfcWxhX2hvc3RfdCAqaGEpCiB7CiAJc3RydWN0IFNjc2lfSG9zdCAqaG9zdCA9IGhhLT5ob3N0OworCXN0cnVjdCBzeXNmc19lbnRyeSAqaXRlcjsKKwlpbnQgcmV0OwogCi0Jc3lzZnNfY3JlYXRlX2Jpbl9maWxlKCZob3N0LT5zaG9zdF9nZW5kZXYua29iaiwgJnN5c2ZzX2Z3X2R1bXBfYXR0cik7Ci0Jc3lzZnNfY3JlYXRlX2Jpbl9maWxlKCZob3N0LT5zaG9zdF9nZW5kZXYua29iaiwgJnN5c2ZzX252cmFtX2F0dHIpOwotCXN5c2ZzX2NyZWF0ZV9iaW5fZmlsZSgmaG9zdC0+c2hvc3RfZ2VuZGV2LmtvYmosICZzeXNmc19vcHRyb21fYXR0cik7Ci0Jc3lzZnNfY3JlYXRlX2Jpbl9maWxlKCZob3N0LT5zaG9zdF9nZW5kZXYua29iaiwKLQkgICAgJnN5c2ZzX29wdHJvbV9jdGxfYXR0cik7Ci0JaWYgKElTX1FMQTI0WFgoaGEpIHx8IElTX1FMQTU0WFgoaGEpKSB7Ci0JCXN5c2ZzX2NyZWF0ZV9iaW5fZmlsZSgmaG9zdC0+c2hvc3RfZ2VuZGV2LmtvYmosCi0JCSAgICAmc3lzZnNfdnBkX2F0dHIpOwotCQlzeXNmc19jcmVhdGVfYmluX2ZpbGUoJmhvc3QtPnNob3N0X2dlbmRldi5rb2JqLAotCQkgICAgJnN5c2ZzX3NmcF9hdHRyKTsKKwlmb3IgKGl0ZXIgPSBiaW5fZmlsZV9lbnRyaWVzOyBpdGVyLT5uYW1lOyBpdGVyKyspIHsKKwkJaWYgKGl0ZXItPmlzNEdCcF9vbmx5ICYmICghSVNfUUxBMjRYWChoYSkgJiYgIUlTX1FMQTU0WFgoaGEpKSkKKwkJCWNvbnRpbnVlOworCisJCXJldCA9IHN5c2ZzX2NyZWF0ZV9iaW5fZmlsZSgmaG9zdC0+c2hvc3RfZ2VuZGV2LmtvYmosCisJCSAgICBpdGVyLT5hdHRyKTsKKwkJaWYgKHJldCkKKwkJCXFsYV9wcmludGsoS0VSTl9JTkZPLCBoYSwKKwkJCSAgICAiVW5hYmxlIHRvIGNyZWF0ZSBzeXNmcyAlcyBiaW5hcnkgYXR0cmlidXRlICIKKwkJCSAgICAiKCVkKS5cbiIsIGl0ZXItPm5hbWUsIHJldCk7CiAJfQogfQogCkBAIC00MDEsMTcgKzQxNywxNCBAQAogcWxhMngwMF9mcmVlX3N5c2ZzX2F0dHIoc2NzaV9xbGFfaG9zdF90ICpoYSkKIHsKIAlzdHJ1Y3QgU2NzaV9Ib3N0ICpob3N0ID0gaGEtPmhvc3Q7CisJc3RydWN0IHN5c2ZzX2VudHJ5ICppdGVyOwogCi0Jc3lzZnNfcmVtb3ZlX2Jpbl9maWxlKCZob3N0LT5zaG9zdF9nZW5kZXYua29iaiwgJnN5c2ZzX2Z3X2R1bXBfYXR0cik7Ci0Jc3lzZnNfcmVtb3ZlX2Jpbl9maWxlKCZob3N0LT5zaG9zdF9nZW5kZXYua29iaiwgJnN5c2ZzX252cmFtX2F0dHIpOwotCXN5c2ZzX3JlbW92ZV9iaW5fZmlsZSgmaG9zdC0+c2hvc3RfZ2VuZGV2LmtvYmosICZzeXNmc19vcHRyb21fYXR0cik7Ci0Jc3lzZnNfcmVtb3ZlX2Jpbl9maWxlKCZob3N0LT5zaG9zdF9nZW5kZXYua29iaiwKLQkgICAgJnN5c2ZzX29wdHJvbV9jdGxfYXR0cik7Ci0JaWYgKElTX1FMQTI0WFgoaGEpIHx8IElTX1FMQTU0WFgoaGEpKSB7CisJZm9yIChpdGVyID0gYmluX2ZpbGVfZW50cmllczsgaXRlci0+bmFtZTsgaXRlcisrKSB7CisJCWlmIChpdGVyLT5pczRHQnBfb25seSAmJiAoIUlTX1FMQTI0WFgoaGEpICYmICFJU19RTEE1NFhYKGhhKSkpCisJCQljb250aW51ZTsKKwogCQlzeXNmc19yZW1vdmVfYmluX2ZpbGUoJmhvc3QtPnNob3N0X2dlbmRldi5rb2JqLAotCQkgICAgJnN5c2ZzX3ZwZF9hdHRyKTsKLQkJc3lzZnNfcmVtb3ZlX2Jpbl9maWxlKCZob3N0LT5zaG9zdF9nZW5kZXYua29iaiwKLQkJICAgICZzeXNmc19zZnBfYXR0cik7CisJCSAgICBpdGVyLT5hdHRyKTsKIAl9CiAKIAlpZiAoaGEtPmJlYWNvbl9ibGlua19sZWQgPT0gMSkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9kYmcuaCBiL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9kYmcuaAppbmRleCA5MGRhZDdlLi41YjEyMjc4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfZGJnLmgKKysrIGIvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX2RiZy5oCkBAIC0zOCw3ICszOCw3IEBACiAqIE1hY3JvcyB1c2UgZm9yIGRlYnVnZ2luZyB0aGUgZHJpdmVyLgogKi8KIAotI2RlZmluZSBERUJVRyh4KQlkbyB7IGlmIChxbGEyX2V4dGVuZGVkX2Vycm9yX2xvZ2dpbmcpIHsgeDsgfSB9IHdoaWxlICgwKQorI2RlZmluZSBERUJVRyh4KQlkbyB7IGlmIChxbDJ4ZXh0ZW5kZWRfZXJyb3JfbG9nZ2luZykgeyB4OyB9IH0gd2hpbGUgKDApCiAKICNpZiBkZWZpbmVkKFFMX0RFQlVHX0xFVkVMXzEpCiAjZGVmaW5lIERFQlVHMSh4KQlkbyB7eDt9IHdoaWxlICgwKQpAQCAtNDYsMTIgKzQ2LDEyIEBACiAjZGVmaW5lIERFQlVHMSh4KQlkbyB7fSB3aGlsZSAoMCkKICNlbmRpZgogCi0jZGVmaW5lIERFQlVHMih4KQlkbyB7IGlmIChxbGEyX2V4dGVuZGVkX2Vycm9yX2xvZ2dpbmcpIHsgeDsgfSB9IHdoaWxlICgwKQotI2RlZmluZSBERUJVRzJfMyh4KQlkbyB7IGlmIChxbGEyX2V4dGVuZGVkX2Vycm9yX2xvZ2dpbmcpIHsgeDsgfSB9IHdoaWxlICgwKQotI2RlZmluZSBERUJVRzJfM18xMSh4KQlkbyB7IGlmIChxbGEyX2V4dGVuZGVkX2Vycm9yX2xvZ2dpbmcpIHsgeDsgfSB9IHdoaWxlICgwKQotI2RlZmluZSBERUJVRzJfOV8xMCh4KQlkbyB7IGlmIChxbGEyX2V4dGVuZGVkX2Vycm9yX2xvZ2dpbmcpIHsgeDsgfSB9IHdoaWxlICgwKQotI2RlZmluZSBERUJVRzJfMTEoeCkJZG8geyBpZiAocWxhMl9leHRlbmRlZF9lcnJvcl9sb2dnaW5nKSB7IHg7IH0gfSB3aGlsZSAoMCkKLSNkZWZpbmUgREVCVUcyXzEzKHgpCWRvIHsgaWYgKHFsYTJfZXh0ZW5kZWRfZXJyb3JfbG9nZ2luZykgeyB4OyB9IH0gd2hpbGUgKDApCisjZGVmaW5lIERFQlVHMih4KQlkbyB7IGlmIChxbDJ4ZXh0ZW5kZWRfZXJyb3JfbG9nZ2luZykgeyB4OyB9IH0gd2hpbGUgKDApCisjZGVmaW5lIERFQlVHMl8zKHgpCWRvIHsgaWYgKHFsMnhleHRlbmRlZF9lcnJvcl9sb2dnaW5nKSB7IHg7IH0gfSB3aGlsZSAoMCkKKyNkZWZpbmUgREVCVUcyXzNfMTEoeCkJZG8geyBpZiAocWwyeGV4dGVuZGVkX2Vycm9yX2xvZ2dpbmcpIHsgeDsgfSB9IHdoaWxlICgwKQorI2RlZmluZSBERUJVRzJfOV8xMCh4KQlkbyB7IGlmIChxbDJ4ZXh0ZW5kZWRfZXJyb3JfbG9nZ2luZykgeyB4OyB9IH0gd2hpbGUgKDApCisjZGVmaW5lIERFQlVHMl8xMSh4KQlkbyB7IGlmIChxbDJ4ZXh0ZW5kZWRfZXJyb3JfbG9nZ2luZykgeyB4OyB9IH0gd2hpbGUgKDApCisjZGVmaW5lIERFQlVHMl8xMyh4KQlkbyB7IGlmIChxbDJ4ZXh0ZW5kZWRfZXJyb3JfbG9nZ2luZykgeyB4OyB9IH0gd2hpbGUgKDApCiAKICNpZiBkZWZpbmVkKFFMX0RFQlVHX0xFVkVMXzMpCiAjZGVmaW5lIERFQlVHMyh4KQlkbyB7eDt9IHdoaWxlICgwKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX2RlZi5oIGIvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX2RlZi5oCmluZGV4IGJhYjMzZjYuLmM0ZmM0MGYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9kZWYuaAorKysgYi9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfZGVmLmgKQEAgLTE1NDUsNiArMTU0NSw5IEBACiAJc3BpbmxvY2tfdCBycG9ydF9sb2NrOwogCXN0cnVjdCBmY19ycG9ydCAqcnBvcnQsICpkcnBvcnQ7CiAJdTMyIHN1cHBvcnRlZF9jbGFzc2VzOworCisJdW5zaWduZWQgbG9uZyBsYXN0X3F1ZXVlX2Z1bGw7CisJdW5zaWduZWQgbG9uZyBsYXN0X3JhbXBfdXA7CiB9IGZjX3BvcnRfdDsKIAogLyoKQEAgLTIyNTUsNiArMjI1OCw3IEBACiAJdWludDE2X3QJbWdtdF9zdnJfbG9vcF9pZDsKIAogICAgICAgICB1aW50MzJfdAlsb2dpbl9yZXRyeV9jb3VudDsKKwlpbnQJCW1heF9xX2RlcHRoOwogCiAJLyogRmlicmUgQ2hhbm5lbCBEZXZpY2UgTGlzdC4gKi8KIAlzdHJ1Y3QgbGlzdF9oZWFkCWZjcG9ydHM7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfZ2JsLmggYi9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfZ2JsLmgKaW5kZXggN2RhNjk4My4uMzJlYmVlYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX2dibC5oCisrKyBiL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9nYmwuaApAQCAtNDgsNiArNDgsNyBAQAogZXh0ZXJuIHZvaWQgcWxhMngwMF9yZWdfcmVtb3RlX3BvcnQoc2NzaV9xbGFfaG9zdF90ICosIGZjX3BvcnRfdCAqKTsKIAogZXh0ZXJuIHZvaWQgcWxhMngwMF9hbGxvY19md19kdW1wKHNjc2lfcWxhX2hvc3RfdCAqKTsKK2V4dGVybiB2b2lkIHFsYTJ4MDBfdHJ5X3RvX3N0b3BfZmlybXdhcmUoc2NzaV9xbGFfaG9zdF90ICopOwogCiAvKgogICogR2xvYmFsIERhdGEgaW4gcWxhX29zLmMgc291cmNlIGZpbGUuCkBAIC02MCw3ICs2MSw4IEBACiBleHRlcm4gaW50IHFsMnhsb2dpbnJldHJ5Y291bnQ7CiBleHRlcm4gaW50IHFsMnhmZG1pZW5hYmxlOwogZXh0ZXJuIGludCBxbDJ4YWxsb2Nmd2R1bXA7Ci1leHRlcm4gaW50IHFsYTJfZXh0ZW5kZWRfZXJyb3JfbG9nZ2luZzsKK2V4dGVybiBpbnQgcWwyeGV4dGVuZGVkX2Vycm9yX2xvZ2dpbmc7CitleHRlcm4gaW50IHFsMnhxZnVsbHJhbXB1cDsKIAogZXh0ZXJuIHZvaWQgcWxhMngwMF9zcF9jb21wbChzY3NpX3FsYV9ob3N0X3QgKiwgc3JiX3QgKik7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9pbml0LmMgYi9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfaW5pdC5jCmluZGV4IDgzM2I5MzAuLjA4Y2I1ZTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9pbml0LmMKKysrIGIvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX2luaXQuYwpAQCAtMTY0NCw3ICsxNjQ0LDcgQEAKIAkgKiBTZXQgaG9zdCBhZGFwdGVyIHBhcmFtZXRlcnMuCiAJICovCiAJaWYgKG52LT5ob3N0X3BbMF0gJiBCSVRfNykKLQkJcWxhMl9leHRlbmRlZF9lcnJvcl9sb2dnaW5nID0gMTsKKwkJcWwyeGV4dGVuZGVkX2Vycm9yX2xvZ2dpbmcgPSAxOwogCWhhLT5mbGFncy5kaXNhYmxlX3Jpc2NfY29kZV9sb2FkID0gKChudi0+aG9zdF9wWzBdICYgQklUXzQpID8gMSA6IDApOwogCS8qIEFsd2F5cyBsb2FkIFJJU0MgY29kZSBvbiBub24gSVNQMlsxMl0wMCBjaGlwcy4gKi8KIAlpZiAoIUlTX1FMQTIxMDAoaGEpICYmICFJU19RTEEyMjAwKGhhKSkKQEAgLTM5NDgsMyArMzk0OCwyNCBAQAogZmFpbF9md19pbnRlZ3JpdHk6CiAJcmV0dXJuIFFMQV9GVU5DVElPTl9GQUlMRUQ7CiB9CisKK3ZvaWQKK3FsYTJ4MDBfdHJ5X3RvX3N0b3BfZmlybXdhcmUoc2NzaV9xbGFfaG9zdF90ICpoYSkKK3sKKwlpbnQgcmV0LCByZXRyaWVzOworCisJaWYgKCFJU19RTEEyNFhYKGhhKSAmJiAhSVNfUUxBNTRYWChoYSkpCisJCXJldHVybjsKKworCXJldCA9IHFsYTJ4MDBfc3RvcF9maXJtd2FyZShoYSk7CisJZm9yIChyZXRyaWVzID0gNTsgcmV0ICE9IFFMQV9TVUNDRVNTICYmIHJldHJpZXMgOyByZXRyaWVzLS0pIHsKKwkJcWxhMngwMF9yZXNldF9jaGlwKGhhKTsKKwkJaWYgKHFsYTJ4MDBfY2hpcF9kaWFnKGhhKSAhPSBRTEFfU1VDQ0VTUykKKwkJCWNvbnRpbnVlOworCQlpZiAocWxhMngwMF9zZXR1cF9jaGlwKGhhKSAhPSBRTEFfU1VDQ0VTUykKKwkJCWNvbnRpbnVlOworCQlxbGFfcHJpbnRrKEtFUk5fSU5GTywgaGEsCisJCSAgICAiQXR0ZW1wdGluZyByZXRyeSBvZiBzdG9wLWZpcm13YXJlIGNvbW1hbmQuLi5cbiIpOworCQlyZXQgPSBxbGEyeDAwX3N0b3BfZmlybXdhcmUoaGEpOworCX0KK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9pc3IuYyBiL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9pc3IuYwppbmRleCA2MjZjNzE3Li5kM2I2ZGY0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfaXNyLmMKKysrIGIvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX2lzci5jCkBAIC02LDYgKzYsOCBAQAogICovCiAjaW5jbHVkZSAicWxhX2RlZi5oIgogCisjaW5jbHVkZSA8c2NzaS9zY3NpX3RjcS5oPgorCiBzdGF0aWMgdm9pZCBxbGEyeDAwX21ieF9jb21wbGV0aW9uKHNjc2lfcWxhX2hvc3RfdCAqLCB1aW50MTZfdCk7CiBzdGF0aWMgdm9pZCBxbGEyeDAwX2FzeW5jX2V2ZW50KHNjc2lfcWxhX2hvc3RfdCAqLCB1aW50MTZfdCAqKTsKIHN0YXRpYyB2b2lkIHFsYTJ4MDBfcHJvY2Vzc19jb21wbGV0ZWRfcmVxdWVzdChzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqLCB1aW50MzJfdCk7CkBAIC01OTMsNiArNTk1LDY3IEBACiAJfQogfQogCitzdGF0aWMgdm9pZAorcWxhMngwMF9hZGp1c3Rfc2Rldl9xZGVwdGhfdXAoc3RydWN0IHNjc2lfZGV2aWNlICpzZGV2LCB2b2lkICpkYXRhKQoreworCWZjX3BvcnRfdCAqZmNwb3J0ID0gZGF0YTsKKworCWlmIChmY3BvcnQtPmhhLT5tYXhfcV9kZXB0aCA8PSBzZGV2LT5xdWV1ZV9kZXB0aCkKKwkJcmV0dXJuOworCisJaWYgKHNkZXYtPm9yZGVyZWRfdGFncykKKwkJc2NzaV9hZGp1c3RfcXVldWVfZGVwdGgoc2RldiwgTVNHX09SREVSRURfVEFHLAorCQkgICAgc2Rldi0+cXVldWVfZGVwdGggKyAxKTsKKwllbHNlCisJCXNjc2lfYWRqdXN0X3F1ZXVlX2RlcHRoKHNkZXYsIE1TR19TSU1QTEVfVEFHLAorCQkgICAgc2Rldi0+cXVldWVfZGVwdGggKyAxKTsKKworCWZjcG9ydC0+bGFzdF9yYW1wX3VwID0gamlmZmllczsKKworCURFQlVHMihxbGFfcHJpbnRrKEtFUk5fSU5GTywgZmNwb3J0LT5oYSwKKwkgICAgInNjc2koJWxkOiVkOiVkOiVkKTogUXVldWUgZGVwdGggYWRqdXN0ZWQtdXAgdG8gJWQuXG4iLAorCSAgICBmY3BvcnQtPmhhLT5ob3N0X25vLCBzZGV2LT5jaGFubmVsLCBzZGV2LT5pZCwgc2Rldi0+bHVuLAorCSAgICBzZGV2LT5xdWV1ZV9kZXB0aCkpOworfQorCitzdGF0aWMgdm9pZAorcWxhMngwMF9hZGp1c3Rfc2Rldl9xZGVwdGhfZG93bihzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNkZXYsIHZvaWQgKmRhdGEpCit7CisJZmNfcG9ydF90ICpmY3BvcnQgPSBkYXRhOworCisJaWYgKCFzY3NpX3RyYWNrX3F1ZXVlX2Z1bGwoc2Rldiwgc2Rldi0+cXVldWVfZGVwdGggLSAxKSkKKwkJcmV0dXJuOworCisJREVCVUcyKHFsYV9wcmludGsoS0VSTl9JTkZPLCBmY3BvcnQtPmhhLAorCSAgICAic2NzaSglbGQ6JWQ6JWQ6JWQpOiBRdWV1ZSBkZXB0aCBhZGp1c3RlZC1kb3duIHRvICVkLlxuIiwKKwkgICAgZmNwb3J0LT5oYS0+aG9zdF9ubywgc2Rldi0+Y2hhbm5lbCwgc2Rldi0+aWQsIHNkZXYtPmx1biwKKwkgICAgc2Rldi0+cXVldWVfZGVwdGgpKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkCitxbGEyeDAwX3JhbXBfdXBfcXVldWVfZGVwdGgoc2NzaV9xbGFfaG9zdF90ICpoYSwgc3JiX3QgKnNwKQoreworCWZjX3BvcnRfdCAqZmNwb3J0OworCXN0cnVjdCBzY3NpX2RldmljZSAqc2RldjsKKworCXNkZXYgPSBzcC0+Y21kLT5kZXZpY2U7CisJaWYgKHNkZXYtPnF1ZXVlX2RlcHRoID49IGhhLT5tYXhfcV9kZXB0aCkKKwkJcmV0dXJuOworCisJZmNwb3J0ID0gc3AtPmZjcG9ydDsKKwlpZiAodGltZV9iZWZvcmUoamlmZmllcywKKwkgICAgZmNwb3J0LT5sYXN0X3JhbXBfdXAgKyBxbDJ4cWZ1bGxyYW1wdXAgKiBIWikpCisJCXJldHVybjsKKwlpZiAodGltZV9iZWZvcmUoamlmZmllcywKKwkgICAgZmNwb3J0LT5sYXN0X3F1ZXVlX2Z1bGwgKyBxbDJ4cWZ1bGxyYW1wdXAgKiBIWikpCisJCXJldHVybjsKKworCXNwaW5fdW5sb2NrX2lycSgmaGEtPmhhcmR3YXJlX2xvY2spOworCXN0YXJnZXRfZm9yX2VhY2hfZGV2aWNlKHNkZXYtPnNkZXZfdGFyZ2V0LCBmY3BvcnQsCisJICAgIHFsYTJ4MDBfYWRqdXN0X3NkZXZfcWRlcHRoX3VwKTsKKwlzcGluX2xvY2tfaXJxKCZoYS0+aGFyZHdhcmVfbG9jayk7Cit9CisKIC8qKgogICogcWxhMngwMF9wcm9jZXNzX2NvbXBsZXRlZF9yZXF1ZXN0KCkgLSBQcm9jZXNzIGEgRmFzdCBQb3N0IHJlc3BvbnNlLgogICogQGhhOiBTQ1NJIGRyaXZlciBIQSBjb250ZXh0CkBAIC02MjQsNiArNjg3LDggQEAKIAogCQkvKiBTYXZlIElTUCBjb21wbGV0aW9uIHN0YXR1cyAqLwogCQlzcC0+Y21kLT5yZXN1bHQgPSBESURfT0sgPDwgMTY7CisKKwkJcWxhMngwMF9yYW1wX3VwX3F1ZXVlX2RlcHRoKGhhLCBzcCk7CiAJCXFsYTJ4MDBfc3BfY29tcGwoaGEsIHNwKTsKIAl9IGVsc2UgewogCQlERUJVRzIocHJpbnRrKCJzY3NpKCVsZCk6IEludmFsaWQgSVNQIFNDU0kgY29tcGxldGlvbiBoYW5kbGVcbiIsCkBAIC04MjMsNiArODg4LDcgQEAKIAkgKi8KIAlzd2l0Y2ggKGNvbXBfc3RhdHVzKSB7CiAJY2FzZSBDU19DT01QTEVURToKKwljYXNlIENTX1FVRVVFX0ZVTEw6CiAJCWlmIChzY3NpX3N0YXR1cyA9PSAwKSB7CiAJCQljcC0+cmVzdWx0ID0gRElEX09LIDw8IDE2OwogCQkJYnJlYWs7CkBAIC04NDksNiArOTE1LDIwIEBACiAJCX0KIAkJY3AtPnJlc3VsdCA9IERJRF9PSyA8PCAxNiB8IGxzY3NpX3N0YXR1czsKIAorCQlpZiAobHNjc2lfc3RhdHVzID09IFNBTV9TVEFUX1RBU0tfU0VUX0ZVTEwpIHsKKwkJCURFQlVHMihwcmludGsoS0VSTl9JTkZPCisJCQkgICAgInNjc2koJWxkKTogUVVFVUUgRlVMTCBzdGF0dXMgZGV0ZWN0ZWQgIgorCQkJICAgICIweCV4LTB4JXguXG4iLCBoYS0+aG9zdF9ubywgY29tcF9zdGF0dXMsCisJCQkgICAgc2NzaV9zdGF0dXMpKTsKKworCQkJLyogQWRqdXN0IHF1ZXVlIGRlcHRoIGZvciBhbGwgbHVucyBvbiB0aGUgcG9ydC4gKi8KKwkJCWZjcG9ydC0+bGFzdF9xdWV1ZV9mdWxsID0gamlmZmllczsKKwkJCXNwaW5fdW5sb2NrX2lycSgmaGEtPmhhcmR3YXJlX2xvY2spOworCQkJc3RhcmdldF9mb3JfZWFjaF9kZXZpY2UoY3AtPmRldmljZS0+c2Rldl90YXJnZXQsCisJCQkgICAgZmNwb3J0LCBxbGEyeDAwX2FkanVzdF9zZGV2X3FkZXB0aF9kb3duKTsKKwkJCXNwaW5fbG9ja19pcnEoJmhhLT5oYXJkd2FyZV9sb2NrKTsKKwkJCWJyZWFrOworCQl9CiAJCWlmIChsc2NzaV9zdGF0dXMgIT0gU1NfQ0hFQ0tfQ09ORElUSU9OKQogCQkJYnJlYWs7CiAKQEAgLTEwNjYsMTcgKzExNDYsNiBAQAogCQkJcWxhMngwMF9tYXJrX2RldmljZV9sb3N0KGhhLCBmY3BvcnQsIDEsIDEpOwogCQlicmVhazsKIAotCWNhc2UgQ1NfUVVFVUVfRlVMTDoKLQkJREVCVUcyKHByaW50ayhLRVJOX0lORk8KLQkJICAgICJzY3NpKCVsZCk6IFFVRVVFIEZVTEwgc3RhdHVzIGRldGVjdGVkIDB4JXgtMHgleC5cbiIsCi0JCSAgICBoYS0+aG9zdF9ubywgY29tcF9zdGF0dXMsIHNjc2lfc3RhdHVzKSk7Ci0KLQkJLyogU0NTSSBNaWQtTGF5ZXIgaGFuZGxlcyBkZXZpY2UgcXVldWUgZnVsbCAqLwotCi0JCWNwLT5yZXN1bHQgPSBESURfT0sgPDwgMTYgfCBsc2NzaV9zdGF0dXM7Ci0KLQkJYnJlYWs7Ci0KIAlkZWZhdWx0OgogCQlERUJVRzMocHJpbnRrKCJzY3NpKCVsZCk6IEVycm9yIGRldGVjdGVkICh1bmtub3duIHN0YXR1cykgIgogCQkgICAgIjB4JXgtMHgleC5cbiIsIGhhLT5ob3N0X25vLCBjb21wX3N0YXR1cywgc2NzaV9zdGF0dXMpKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9vcy5jIGIvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX29zLmMKaW5kZXggNWU3MGM0OS4uM2ViNGNkMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX29zLmMKKysrIGIvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX29zLmMKQEAgLTYxLDkgKzYxLDkgQEAKIAkJImR1cmluZyBIQkEgaW5pdGlhbGl6YXRpb24uICBNZW1vcnkgYWxsb2NhdGlvbiByZXF1aXJlbWVudHMgIgogCQkidmFyeSBieSBJU1AgdHlwZS4gIERlZmF1bHQgaXMgMSAtIGFsbG9jYXRlIG1lbW9yeS4iKTsKIAotaW50IHFsYTJfZXh0ZW5kZWRfZXJyb3JfbG9nZ2luZzsKLW1vZHVsZV9wYXJhbShxbGEyX2V4dGVuZGVkX2Vycm9yX2xvZ2dpbmcsIGludCwgU19JUlVHT3xTX0lSVVNSKTsKLU1PRFVMRV9QQVJNX0RFU0MocWxhMl9leHRlbmRlZF9lcnJvcl9sb2dnaW5nLAoraW50IHFsMnhleHRlbmRlZF9lcnJvcl9sb2dnaW5nOworbW9kdWxlX3BhcmFtKHFsMnhleHRlbmRlZF9lcnJvcl9sb2dnaW5nLCBpbnQsIFNfSVJVR098U19JUlVTUik7CitNT0RVTEVfUEFSTV9ERVNDKHFsMnhleHRlbmRlZF9lcnJvcl9sb2dnaW5nLAogCQkiT3B0aW9uIHRvIGVuYWJsZSBleHRlbmRlZCBlcnJvciBsb2dnaW5nLCAiCiAJCSJEZWZhdWx0IGlzIDAgLSBubyBsb2dnaW5nLiAxIC0gbG9nIGVycm9ycy4iKTsKIApAQCAtNzcsNiArNzcsMTkgQEAKIAkJIkVuYWJsZXMgRkRNSSByZWdpc3RyYXRvbnMgIgogCQkiRGVmYXVsdCBpcyAwIC0gbm8gRkRNSS4gMSAtIHBlcmZvbSBGRE1JLiIpOwogCisjZGVmaW5lIE1BWF9RX0RFUFRIICAgIDMyCitzdGF0aWMgaW50IHFsMnhtYXhxZGVwdGggPSBNQVhfUV9ERVBUSDsKK21vZHVsZV9wYXJhbShxbDJ4bWF4cWRlcHRoLCBpbnQsIFNfSVJVR098U19JV1VTUik7CitNT0RVTEVfUEFSTV9ERVNDKHFsMnhtYXhxZGVwdGgsCisJCSJNYXhpbXVtIHF1ZXVlIGRlcHRoIHRvIHJlcG9ydCBmb3IgdGFyZ2V0IGRldmljZXMuIik7CisKK2ludCBxbDJ4cWZ1bGxyYW1wdXAgPSAxMjA7Cittb2R1bGVfcGFyYW0ocWwyeHFmdWxscmFtcHVwLCBpbnQsIFNfSVJVR098U19JV1VTUik7CitNT0RVTEVfUEFSTV9ERVNDKHFsMnhxZnVsbHJhbXB1cCwKKwkJIk51bWJlciBvZiBzZWNvbmRzIHRvIHdhaXQgdG8gYmVnaW4gdG8gcmFtcC11cCB0aGUgcXVldWUgIgorCQkiZGVwdGggZm9yIGEgZGV2aWNlIGFmdGVyIGEgcXVldWUtZnVsbCBjb25kaXRpb24gaGFzIGJlZW4gIgorCQkiZGV0ZWN0ZWQuICBEZWZhdWx0IGlzIDEyMCBzZWNvbmRzLiIpOworCiAvKgogICogU0NTSSBob3N0IHRlbXBsYXRlIGVudHJ5IHBvaW50cwogICovCkBAIC0xMTA0LDkgKzExMTcsOSBAQAogCXN0cnVjdCBmY19ycG9ydCAqcnBvcnQgPSBzdGFyZ2V0X3RvX3Jwb3J0KHNkZXYtPnNkZXZfdGFyZ2V0KTsKIAogCWlmIChzZGV2LT50YWdnZWRfc3VwcG9ydGVkKQotCQlzY3NpX2FjdGl2YXRlX3RjcShzZGV2LCAzMik7CisJCXNjc2lfYWN0aXZhdGVfdGNxKHNkZXYsIGhhLT5tYXhfcV9kZXB0aCk7CiAJZWxzZQotCQlzY3NpX2RlYWN0aXZhdGVfdGNxKHNkZXYsIDMyKTsKKwkJc2NzaV9kZWFjdGl2YXRlX3RjcShzZGV2LCBoYS0+bWF4X3FfZGVwdGgpOwogCiAJcnBvcnQtPmRldl9sb3NzX3RtbyA9IGhhLT5wb3J0X2Rvd25fcmV0cnlfY291bnQgKyA1OwogCkBAIC0xNDEzLDYgKzE0MjYsMTAgQEAKIAloYS0+bGlua19kYXRhX3JhdGUgPSBQT1JUX1NQRUVEX1VOS05PV047CiAJaGEtPm9wdHJvbV9zaXplID0gT1BUUk9NX1NJWkVfMjMwMDsKIAorCWhhLT5tYXhfcV9kZXB0aCA9IE1BWF9RX0RFUFRIOworCWlmIChxbDJ4bWF4cWRlcHRoICE9IDAgJiYgcWwyeG1heHFkZXB0aCA8PSAweGZmZmZVKQorCQloYS0+bWF4X3FfZGVwdGggPSBxbDJ4bWF4cWRlcHRoOworCiAJLyogQXNzaWduIElTUCBzcGVjaWZpYyBvcGVyYXRpb25zLiAqLwogCWhhLT5pc3Bfb3BzLnBjaV9jb25maWcJCT0gcWxhMjEwMF9wY2lfY29uZmlnOwogCWhhLT5pc3Bfb3BzLnJlc2V0X2NoaXAJCT0gcWxhMngwMF9yZXNldF9jaGlwOwpAQCAtMTcxMiw4ICsxNzI5LDEwIEBACiAJaWYgKGhhLT5lZnQpCiAJCXFsYTJ4MDBfdHJhY2VfY29udHJvbChoYSwgVENfRElTQUJMRSwgMCwgMCk7CiAKKwloYS0+ZmxhZ3Mub25saW5lID0gMDsKKwogCS8qIFN0b3AgY3VycmVudGx5IGV4ZWN1dGluZyBmaXJtd2FyZS4gKi8KLQlxbGEyeDAwX3N0b3BfZmlybXdhcmUoaGEpOworCXFsYTJ4MDBfdHJ5X3RvX3N0b3BfZmlybXdhcmUoaGEpOwogCiAJLyogdHVybi1vZmYgaW50ZXJydXB0cyBvbiB0aGUgY2FyZCAqLwogCWlmIChoYS0+aW50ZXJydXB0c19vbikKQEAgLTE3MjEsOCArMTc0MCw2IEBACiAKIAlxbGEyeDAwX21lbV9mcmVlKGhhKTsKIAotCWhhLT5mbGFncy5vbmxpbmUgPSAwOwotCiAJLyogRGV0YWNoIGludGVycnVwdHMgKi8KIAlpZiAoaGEtPmhvc3QtPmlycSkKIAkJZnJlZV9pcnEoaGEtPmhvc3QtPmlycSwgaGEpOwpAQCAtMjY5Nyw3ICsyNzE0LDcgQEAKIAogCS8qIERlcml2ZSB2ZXJzaW9uIHN0cmluZy4gKi8KIAlzdHJjcHkocWxhMngwMF92ZXJzaW9uX3N0ciwgUUxBMlhYWF9WRVJTSU9OKTsKLQlpZiAocWxhMl9leHRlbmRlZF9lcnJvcl9sb2dnaW5nKQorCWlmIChxbDJ4ZXh0ZW5kZWRfZXJyb3JfbG9nZ2luZykKIAkJc3RyY2F0KHFsYTJ4MDBfdmVyc2lvbl9zdHIsICItZGVidWciKTsKIAogCXFsYTJ4eHhfdHJhbnNwb3J0X3RlbXBsYXRlID0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV92ZXJzaW9uLmggYi9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfdmVyc2lvbi5oCmluZGV4IGU1N2JmNDUuLjFmYTBiY2UgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV92ZXJzaW9uLmgKKysrIGIvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX3ZlcnNpb24uaApAQCAtNyw3ICs3LDcgQEAKIC8qCiAgKiBEcml2ZXIgdmVyc2lvbgogICovCi0jZGVmaW5lIFFMQTJYWFhfVkVSU0lPTiAgICAgICI4LjAxLjA3LWsyIgorI2RlZmluZSBRTEEyWFhYX1ZFUlNJT04gICAgICAiOC4wMS4wNy1rMyIKIAogI2RlZmluZSBRTEFfRFJJVkVSX01BSk9SX1ZFUgk4CiAjZGVmaW5lIFFMQV9EUklWRVJfTUlOT1JfVkVSCTEKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9xbGE0eHh4L0tjb25maWcgYi9kcml2ZXJzL3Njc2kvcWxhNHh4eC9LY29uZmlnCmluZGV4IDA4YTA3ZjAuLjY5Y2JmZjMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9xbGE0eHh4L0tjb25maWcKKysrIGIvZHJpdmVycy9zY3NpL3FsYTR4eHgvS2NvbmZpZwpAQCAtMSw2ICsxLDYgQEAKIGNvbmZpZyBTQ1NJX1FMQV9JU0NTSQogCXRyaXN0YXRlICJRTG9naWMgSVNQNFhYWCBob3N0IGFkYXB0ZXIgZmFtaWx5IHN1cHBvcnQiCi0JZGVwZW5kcyBvbiBQQ0kgJiYgU0NTSQorCWRlcGVuZHMgb24gUENJICYmIFNDU0kgJiYgTkVUCiAJc2VsZWN0IFNDU0lfSVNDU0lfQVRUUlMKIAktLS1oZWxwLS0tCiAJVGhpcyBkcml2ZXIgc3VwcG9ydHMgdGhlIFFMb2dpYyA0MHh4IChJU1A0WFhYKSBpU0NTSSBob3N0CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvcWxhNHh4eC9xbDRfZGJnLmggYi9kcml2ZXJzL3Njc2kvcWxhNHh4eC9xbDRfZGJnLmgKaW5kZXggM2U5OWRjZi4uZDg2MWMzYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL3FsYTR4eHgvcWw0X2RiZy5oCisrKyBiL2RyaXZlcnMvc2NzaS9xbGE0eHh4L3FsNF9kYmcuaApAQCAtMjIsMTQgKzIyLDE0IEBACiAjZW5kaWYKIAogI2lmIGRlZmluZWQoUUxfREVCVUdfTEVWRUxfMikKLSNkZWZpbmUgREVCVUcyKHgpICAgICAgZG8ge2lmKHFsYTRfZXh0ZW5kZWRfZXJyb3JfbG9nZ2luZyA9PSAyKSB4O30gd2hpbGUgKDApOworI2RlZmluZSBERUJVRzIoeCkgICAgICBkbyB7aWYocWw0eGV4dGVuZGVkX2Vycm9yX2xvZ2dpbmcgPT0gMikgeDt9IHdoaWxlICgwKTsKICNkZWZpbmUgREVCVUcyXzMoeCkgICBkbyB7eDt9IHdoaWxlICgwKTsKICNlbHNlCQkJCS8qICAqLwogI2RlZmluZSBERUJVRzIoeCkJZG8ge30gd2hpbGUgKDApOwogI2VuZGlmCQkJCS8qICAqLwogCiAjaWYgZGVmaW5lZChRTF9ERUJVR19MRVZFTF8zKQotI2RlZmluZSBERUJVRzMoeCkgICAgICBkbyB7aWYocWxhNF9leHRlbmRlZF9lcnJvcl9sb2dnaW5nID09IDMpIHg7fSB3aGlsZSAoMCk7CisjZGVmaW5lIERFQlVHMyh4KSAgICAgIGRvIHtpZihxbDR4ZXh0ZW5kZWRfZXJyb3JfbG9nZ2luZyA9PSAzKSB4O30gd2hpbGUgKDApOwogI2Vsc2UJCQkJLyogICovCiAjZGVmaW5lIERFQlVHMyh4KQlkbyB7fSB3aGlsZSAoMCk7CiAjaWYgIWRlZmluZWQoUUxfREVCVUdfTEVWRUxfMikKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9xbGE0eHh4L3FsNF9nbGJsLmggYi9kcml2ZXJzL3Njc2kvcWxhNHh4eC9xbDRfZ2xibC5oCmluZGV4IDJjODAzZWQuLmVlZWZkY2IgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9xbGE0eHh4L3FsNF9nbGJsLmgKKysrIGIvZHJpdmVycy9zY3NpL3FsYTR4eHgvcWw0X2dsYmwuaApAQCAtOCw2ICs4LDcgQEAKICNpZm5kZWYgX19RTEE0eF9HQkxfSAogI2RlZmluZQlfX1FMQTR4X0dCTF9ICiAKK2ludCBxbDR4eHhfbG9ja19kcnZyX3dhaXQoc3RydWN0IHNjc2lfcWxhX2hvc3QgKmEpOwogaW50IHFsYTR4eHhfc2VuZF90Z3RzKHN0cnVjdCBzY3NpX3FsYV9ob3N0ICpoYSwgY2hhciAqaXAsIHVpbnQxNl90IHBvcnQpOwogaW50IHFsYTR4eHhfc2VuZF9jb21tYW5kX3RvX2lzcChzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqaGEsIHN0cnVjdCBzcmIgKiBzcmIpOwogaW50IHFsYTR4eHhfaW5pdGlhbGl6ZV9hZGFwdGVyKHN0cnVjdCBzY3NpX3FsYV9ob3N0ICogaGEsCkBAIC03Miw3ICs3Myw3IEBACiBpbnQgcWxhNHh4eF9wcm9jZXNzX2RkYl9jaGFuZ2VkKHN0cnVjdCBzY3NpX3FsYV9ob3N0ICogaGEsCiAJCQkJdWludDMyX3QgZndfZGRiX2luZGV4LCB1aW50MzJfdCBzdGF0ZSk7CiAKLWV4dGVybiBpbnQgcWxhNF9leHRlbmRlZF9lcnJvcl9sb2dnaW5nOworZXh0ZXJuIGludCBxbDR4ZXh0ZW5kZWRfZXJyb3JfbG9nZ2luZzsKIGV4dGVybiBpbnQgcWw0eGRpc2NvdmVyeXdhaXQ7CiBleHRlcm4gaW50IHFsNHhkb250cmVzZXRoYmE7CiAjZW5kaWYJCQkJLyogX1FMQTR4X0dCTF9IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvcWxhNHh4eC9xbDRfaW5pdC5jIGIvZHJpdmVycy9zY3NpL3FsYTR4eHgvcWw0X2luaXQuYwppbmRleCBiYjNhMWMxLi45ZTgxYjgxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvcWxhNHh4eC9xbDRfaW5pdC5jCisrKyBiL2RyaXZlcnMvc2NzaS9xbGE0eHh4L3FsNF9pbml0LmMKQEAgLTk3OCw3ICs5NzgsNyBAQAogCXJldHVybiBzdGF0dXM7CiB9CiAKLXN0YXRpYyBpbnQgcWw0eHh4X2xvY2tfZHJ2cl93YWl0KHN0cnVjdCBzY3NpX3FsYV9ob3N0ICphKQoraW50IHFsNHh4eF9sb2NrX2RydnJfd2FpdChzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqYSkKIHsKICNkZWZpbmUgUUw0X0xPQ0tfRFJWUl9XQUlUCTMwMAogI2RlZmluZSBRTDRfTE9DS19EUlZSX1NMRUVQCTEwMApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3FsYTR4eHgvcWw0X21ieC5jIGIvZHJpdmVycy9zY3NpL3FsYTR4eHgvcWw0X21ieC5jCmluZGV4IGVmODIzOTkuLmI3MjFkYzUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9xbGE0eHh4L3FsNF9tYnguYworKysgYi9kcml2ZXJzL3Njc2kvcWxhNHh4eC9xbDRfbWJ4LmMKQEAgLTcwMSw3ICs3MDEsNyBAQAogCURFQlVHMyhwcmludGsoInNjc2klbGQ6IENvbm5lY3Rpb24gRXZlbnQgTG9nIER1bXAgKCVkIGVudHJpZXMpOlxuIiwKIAkJICAgICAgaGEtPmhvc3Rfbm8sIG51bV92YWxpZF9lbnRyaWVzKSk7CiAKLQlpZiAocWxhNF9leHRlbmRlZF9lcnJvcl9sb2dnaW5nID09IDMpIHsKKwlpZiAocWw0eGV4dGVuZGVkX2Vycm9yX2xvZ2dpbmcgPT0gMykgewogCQlpZiAob2xkZXN0X2VudHJ5ID09IDApIHsKIAkJCS8qIENpcmN1bGFyIEJ1ZmZlciBoYXMgbm90IHdyYXBwZWQgYXJvdW5kICovCiAJCQlmb3IgKGk9MDsgaSA8IG51bV92YWxpZF9lbnRyaWVzOyBpKyspIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9xbGE0eHh4L3FsNF9vcy5jIGIvZHJpdmVycy9zY3NpL3FsYTR4eHgvcWw0X29zLmMKaW5kZXggMTc4ZmNkZC4uYmFiNDM0ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL3FsYTR4eHgvcWw0X29zLmMKKysrIGIvZHJpdmVycy9zY3NpL3FsYTR4eHgvcWw0X29zLmMKQEAgLTM0LDkgKzM0LDkgQEAKIAkJICIgZGVmYXVsdCBpdCB3aWxsIHJlc2V0IGhiYSA6MCIKIAkJICIgc2V0IHRvIDEgdG8gYXZvaWQgcmVzZXR0aW5nIEhCQSIpOwogCi1pbnQgcWxhNF9leHRlbmRlZF9lcnJvcl9sb2dnaW5nID0gMDsgLyogMCA9IG9mZiwgMSA9IGxvZyBlcnJvcnMgKi8KLW1vZHVsZV9wYXJhbShxbGE0X2V4dGVuZGVkX2Vycm9yX2xvZ2dpbmcsIGludCwgU19JUlVHTyB8IFNfSVJVU1IpOwotTU9EVUxFX1BBUk1fREVTQyhxbGE0X2V4dGVuZGVkX2Vycm9yX2xvZ2dpbmcsCitpbnQgcWw0eGV4dGVuZGVkX2Vycm9yX2xvZ2dpbmcgPSAwOyAvKiAwID0gb2ZmLCAxID0gbG9nIGVycm9ycyAqLworbW9kdWxlX3BhcmFtKHFsNHhleHRlbmRlZF9lcnJvcl9sb2dnaW5nLCBpbnQsIFNfSVJVR08gfCBTX0lSVVNSKTsKK01PRFVMRV9QQVJNX0RFU0MocWw0eGV4dGVuZGVkX2Vycm9yX2xvZ2dpbmcsCiAJCSAiT3B0aW9uIHRvIGVuYWJsZSBleHRlbmRlZCBlcnJvciBsb2dnaW5nLCAiCiAJCSAiRGVmYXVsdCBpcyAwIC0gbm8gbG9nZ2luZywgMSAtIGRlYnVnIGxvZ2dpbmciKTsKIApAQCAtOTE5LDE4ICs5MTksMTEgQEAKIAlpZiAoc3RhdHVzID09IFFMQV9TVUNDRVNTKSB7CiAJCURFQlVHMihwcmludGsoInNjc2klbGQ6ICVzIC0gUGVyZm9ybWluZyBzb2Z0IHJlc2V0Li5cbiIsCiAJCQkgICAgICBoYS0+aG9zdF9ubywgX19mdW5jX18pKTsKLQkJc3RhdHVzID0gcWxhNHh4eF9zb2Z0X3Jlc2V0KGhhKTsKLQl9Ci0JLyogRklYTUVrYXJlbjogRG8gd2Ugd2FudCB0byBrZWVwIGludGVycnVwdHMgZW5hYmxlZCBhbmQgcHJvY2VzcwotCSAgIEFFTnMgYWZ0ZXIgc29mdCByZXNldCAqLwotCi0JLyogSWYgZmlybXdhcmUgKFNPRlQpIHJlc2V0IGZhaWxlZCwgb3IgaWYgYWxsIG91dHN0YW5kaW5nCi0JICogY29tbWFuZHMgaGF2ZSBub3QgcmV0dXJuZWQsIHRoZW4gZG8gYSBIQVJEIHJlc2V0LgotCSAqLwotCWlmIChzdGF0dXMgPT0gUUxBX0VSUk9SKSB7Ci0JCURFQlVHMihwcmludGsoInNjc2klbGQ6ICVzIC0gUGVyZm9ybWluZyBoYXJkIHJlc2V0Li5cbiIsCi0JCQkgICAgICBoYS0+aG9zdF9ubywgX19mdW5jX18pKTsKLQkJc3RhdHVzID0gcWxhNHh4eF9oYXJkX3Jlc2V0KGhhKTsKKwkJcWxhNHh4eF9mbHVzaF9hY3RpdmVfc3JicyhoYSk7CisJCWlmIChxbDR4eHhfbG9ja19kcnZyX3dhaXQoaGEpID09IFFMQV9TVUNDRVNTKQorCQkJc3RhdHVzID0gcWxhNHh4eF9zb2Z0X3Jlc2V0KGhhKTsKKwkJZWxzZQorCQkJc3RhdHVzID0gUUxBX0VSUk9SOwogCX0KIAogCS8qIEZsdXNoIGFueSBwZW5kaW5nIGRkYiBjaGFuZ2VkIEFFTnMgKi8KQEAgLTEwMTYsMTMgKzEwMDksOSBAQAogCXN0cnVjdCBzY3NpX3FsYV9ob3N0ICpoYSA9IChzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqKSBkYXRhOwogCXN0cnVjdCBkZGJfZW50cnkgKmRkYl9lbnRyeSwgKmR0ZW1wOwogCi0JREVCVUcyKHByaW50aygic2NzaSVsZDogJXM6IERQQyBoYW5kbGVyIHdha2luZyB1cC5cbiIsCi0JCSAgICAgIGhhLT5ob3N0X25vLCBfX2Z1bmNfXykpOwotCi0JREVCVUcyKHByaW50aygic2NzaSVsZDogJXM6IGhhLT5mbGFncyA9IDB4JTA4bHhcbiIsCi0JCSAgICAgIGhhLT5ob3N0X25vLCBfX2Z1bmNfXywgaGEtPmZsYWdzKSk7Ci0JREVCVUcyKHByaW50aygic2NzaSVsZDogJXM6IGhhLT5kcGNfZmxhZ3MgPSAweCUwOGx4XG4iLAotCQkgICAgICBoYS0+aG9zdF9ubywgX19mdW5jX18sIGhhLT5kcGNfZmxhZ3MpKTsKKwlERUJVRzIocHJpbnRrKCJzY3NpJWxkOiAlczogRFBDIGhhbmRsZXIgd2FraW5nIHVwLiIKKwkJImZsYWdzID0gMHglMDhseCwgZHBjX2ZsYWdzID0gMHglMDhseFxuIiwKKwkJaGEtPmhvc3Rfbm8sIF9fZnVuY19fLCBoYS0+ZmxhZ3MsIGhhLT5kcGNfZmxhZ3MpKTsKIAogCS8qIEluaXRpYWxpemF0aW9uIG5vdCB5ZXQgZmluaXNoZWQuIERvbid0IGRvIGFueXRoaW5nIHlldC4gKi8KIAlpZiAoIXRlc3RfYml0KEFGX0lOSVRfRE9ORSwgJmhhLT5mbGFncykpCkBAIC0xMDMyLDE2ICsxMDIxLDggQEAKIAkgICAgdGVzdF9iaXQoRFBDX1JFU0VUX0hBLCAmaGEtPmRwY19mbGFncykgfHwKIAkgICAgdGVzdF9iaXQoRFBDX1JFU0VUX0hBX0lOVFIsICZoYS0+ZHBjX2ZsYWdzKSB8fAogCSAgICB0ZXN0X2JpdChEUENfUkVTRVRfSEFfREVTVFJPWV9EREJfTElTVCwgJmhhLT5kcGNfZmxhZ3MpKSB7Ci0JCWlmICh0ZXN0X2JpdChEUENfUkVTRVRfSEFfREVTVFJPWV9EREJfTElTVCwgJmhhLT5kcGNfZmxhZ3MpKQotCQkJLyoKLQkJCSAqIGRnIDA5LzIzIE5ldmVyIGluaXRpYWxpemUgZGRiIGxpc3QKLQkJCSAqIG9uY2Ugd2UgdXAgYW5kIHJ1bm5pbmcKLQkJCSAqIHFsYTR4eHhfcmVjb3Zlcl9hZGFwdGVyKGhhLAotCQkJICogICAgUkVCVUlMRF9EREJfTElTVCk7Ci0JCQkgKi8KLQkJCXFsYTR4eHhfcmVjb3Zlcl9hZGFwdGVyKGhhLCBQUkVTRVJWRV9EREJfTElTVCk7Ci0KLQkJaWYgKHRlc3RfYml0KERQQ19SRVNFVF9IQSwgJmhhLT5kcGNfZmxhZ3MpKQorCQlpZiAodGVzdF9iaXQoRFBDX1JFU0VUX0hBX0RFU1RST1lfRERCX0xJU1QsICZoYS0+ZHBjX2ZsYWdzKSB8fAorCQkJdGVzdF9iaXQoRFBDX1JFU0VUX0hBLCAmaGEtPmRwY19mbGFncykpCiAJCQlxbGE0eHh4X3JlY292ZXJfYWRhcHRlcihoYSwgUFJFU0VSVkVfRERCX0xJU1QpOwogCiAJCWlmICh0ZXN0X2FuZF9jbGVhcl9iaXQoRFBDX1JFU0VUX0hBX0lOVFIsICZoYS0+ZHBjX2ZsYWdzKSkgewpAQCAtMTEyMiw3ICsxMTAzLDggQEAKIAkJZGVzdHJveV93b3JrcXVldWUoaGEtPmRwY190aHJlYWQpOwogCiAJLyogSXNzdWUgU29mdCBSZXNldCB0byBwdXQgZmlybXdhcmUgaW4gdW5rbm93biBzdGF0ZSAqLwotCXFsYTR4eHhfc29mdF9yZXNldChoYSk7CisJaWYgKHFsNHh4eF9sb2NrX2RydnJfd2FpdChoYSkgPT0gUUxBX1NVQ0NFU1MpCisJCXFsYTR4eHhfc29mdF9yZXNldChoYSk7CiAKIAkvKiBSZW1vdmUgdGltZXIgdGhyZWFkLCBpZiBwcmVzZW50ICovCiAJaWYgKGhhLT50aW1lcl9hY3RpdmUpCkBAIC0xNzE0LDcgKzE2OTYsNyBAQAogCiAJLyogRGVyaXZlIHZlcnNpb24gc3RyaW5nLiAqLwogCXN0cmNweShxbGE0eHh4X3ZlcnNpb25fc3RyLCBRTEE0WFhYX0RSSVZFUl9WRVJTSU9OKTsKLQlpZiAocWxhNF9leHRlbmRlZF9lcnJvcl9sb2dnaW5nKQorCWlmIChxbDR4ZXh0ZW5kZWRfZXJyb3JfbG9nZ2luZykKIAkJc3RyY2F0KHFsYTR4eHhfdmVyc2lvbl9zdHIsICItZGVidWciKTsKIAogCXFsYTR4eHhfc2NzaV90cmFuc3BvcnQgPQpAQCAtMTcyNCwxMyArMTcwNiwxMyBAQAogCQlnb3RvIHJlbGVhc2Vfc3JiX2NhY2hlOwogCX0KIAotCXByaW50ayhLRVJOX0lORk8gIlFMb2dpYyBpU0NTSSBIQkEgRHJpdmVyXG4iKTsKIAlyZXQgPSBwY2lfcmVnaXN0ZXJfZHJpdmVyKCZxbGE0eHh4X3BjaV9kcml2ZXIpOwogCWlmIChyZXQpCiAJCWdvdG8gdW5yZWdpc3Rlcl90cmFuc3BvcnQ7CiAKIAlwcmludGsoS0VSTl9JTkZPICJRTG9naWMgaVNDU0kgSEJBIERyaXZlclxuIik7CiAJcmV0dXJuIDA7CisKIHVucmVnaXN0ZXJfdHJhbnNwb3J0OgogCWlzY3NpX3VucmVnaXN0ZXJfdHJhbnNwb3J0KCZxbGE0eHh4X2lzY3NpX3RyYW5zcG9ydCk7CiByZWxlYXNlX3NyYl9jYWNoZToKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9xbGE0eHh4L3FsNF92ZXJzaW9uLmggYi9kcml2ZXJzL3Njc2kvcWxhNHh4eC9xbDRfdmVyc2lvbi5oCmluZGV4IGIzZmU3ZTYuLmQwNTA0OGIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9xbGE0eHh4L3FsNF92ZXJzaW9uLmgKKysrIGIvZHJpdmVycy9zY3NpL3FsYTR4eHgvcWw0X3ZlcnNpb24uaApAQCAtNSw5ICs1LDQgQEAKICAqIFNlZSBMSUNFTlNFLnFsYTR4eHggZm9yIGNvcHlyaWdodCBhbmQgbGljZW5zaW5nIGRldGFpbHMuCiAgKi8KIAotI2RlZmluZSBRTEE0WFhYX0RSSVZFUl9WRVJTSU9OCSI1LjAwLjA1YjktayIKLQotI2RlZmluZSBRTDRfRFJJVkVSX01BSk9SX1ZFUgk1Ci0jZGVmaW5lIFFMNF9EUklWRVJfTUlOT1JfVkVSCTAKLSNkZWZpbmUgUUw0X0RSSVZFUl9QQVRDSF9WRVIJNQotI2RlZmluZSBRTDRfRFJJVkVSX0JFVEFfVkVSCTkKKyNkZWZpbmUgUUxBNFhYWF9EUklWRVJfVkVSU0lPTgkiNS4wMC4wNi1rIgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3Fsb2dpY2ZhczQwOC5jIGIvZHJpdmVycy9zY3NpL3Fsb2dpY2ZhczQwOC5jCmluZGV4IGUwNzI1MzUuLjJlN2RiMTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9xbG9naWNmYXM0MDguYworKysgYi9kcml2ZXJzL3Njc2kvcWxvZ2ljZmFzNDA4LmMKQEAgLTIwOSw3ICsyMDksNyBAQAogICoJY2FsbGVyIG11c3QgaG9sZCBob3N0IGxvY2sKICAqLwogCi1zdGF0aWMgdm9pZCBxbF9pY21kKFNjc2lfQ21uZCAqIGNtZCkKK3N0YXRpYyB2b2lkIHFsX2ljbWQoc3RydWN0IHNjc2lfY21uZCAqY21kKQogewogCXN0cnVjdCBxbG9naWNmYXM0MDhfcHJpdiAqcHJpdiA9IGdldF9wcml2X2J5X2NtZChjbWQpOwogCWludCAJcWJhc2UgPSBwcml2LT5xYmFzZTsKQEAgLTI1Niw3ICsyNTYsNyBAQAogICoJUHJvY2VzcyBzY3NpIGNvbW1hbmQgLSB1c3VhbGx5IGFmdGVyIGludGVycnVwdCAKICAqLwogCi1zdGF0aWMgdW5zaWduZWQgaW50IHFsX3BjbWQoU2NzaV9DbW5kICogY21kKQorc3RhdGljIHVuc2lnbmVkIGludCBxbF9wY21kKHN0cnVjdCBzY3NpX2NtbmQgKmNtZCkKIHsKIAl1bnNpZ25lZCBpbnQgaSwgajsKIAl1bnNpZ25lZCBsb25nIGs7CkBAIC00MDcsNyArNDA3LDcgQEAKIAogc3RhdGljIHZvaWQgcWxfaWhhbmRsKHZvaWQgKmRldl9pZCkKIHsKLQlTY3NpX0NtbmQgKmljbWQ7CisJc3RydWN0IHNjc2lfY21uZCAqaWNtZDsKIAlzdHJ1Y3QgU2NzaV9Ib3N0ICpob3N0ID0gZGV2X2lkOwogCXN0cnVjdCBxbG9naWNmYXM0MDhfcHJpdiAqcHJpdiA9IGdldF9wcml2X2J5X2hvc3QoaG9zdCk7CiAJaW50IHFiYXNlID0gcHJpdi0+cWJhc2U7CkBAIC00NDcsNyArNDQ3LDggQEAKICAqCVF1ZXVlZCBjb21tYW5kCiAgKi8KIAotaW50IHFsb2dpY2ZhczQwOF9xdWV1ZWNvbW1hbmQoU2NzaV9DbW5kICogY21kLCB2b2lkICgqZG9uZSkgKFNjc2lfQ21uZCAqKSkKK2ludCBxbG9naWNmYXM0MDhfcXVldWVjb21tYW5kKHN0cnVjdCBzY3NpX2NtbmQgKmNtZCwKKwkJCSAgICAgIHZvaWQgKCpkb25lKSAoc3RydWN0IHNjc2lfY21uZCAqKSkKIHsKIAlzdHJ1Y3QgcWxvZ2ljZmFzNDA4X3ByaXYgKnByaXYgPSBnZXRfcHJpdl9ieV9jbWQoY21kKTsKIAlpZiAoc2NtZF9pZChjbWQpID09IHByaXYtPnFpbml0aWQpIHsKQEAgLTQ3MCw5ICs0NzEsOCBAQAogICoJUmV0dXJuIGJpb3MgcGFyYW1ldGVycyAKICAqLwogCi1pbnQgcWxvZ2ljZmFzNDA4X2Jpb3NwYXJhbShzdHJ1Y3Qgc2NzaV9kZXZpY2UgKiBkaXNrLAotCQkgICAgICAgIHN0cnVjdCBibG9ja19kZXZpY2UgKmRldiwKLQkJCXNlY3Rvcl90IGNhcGFjaXR5LCBpbnQgaXBbXSkKK2ludCBxbG9naWNmYXM0MDhfYmlvc3BhcmFtKHN0cnVjdCBzY3NpX2RldmljZSAqZGlzaywgc3RydWN0IGJsb2NrX2RldmljZSAqZGV2LAorCQkJICAgc2VjdG9yX3QgY2FwYWNpdHksIGludCBpcFtdKQogewogLyogVGhpcyBzaG91bGQgbWltaWMgdGhlIERPUyBRbG9naWMgZHJpdmVyJ3MgYmVoYXZpb3IgZXhhY3RseSAqLwogCWlwWzBdID0gMHg0MDsKQEAgLTQ5NCw3ICs0OTQsNyBAQAogICoJQWJvcnQgYSBjb21tYW5kIGluIHByb2dyZXNzCiAgKi8KICAKLWludCBxbG9naWNmYXM0MDhfYWJvcnQoU2NzaV9DbW5kICogY21kKQoraW50IHFsb2dpY2ZhczQwOF9hYm9ydChzdHJ1Y3Qgc2NzaV9jbW5kICpjbWQpCiB7CiAJc3RydWN0IHFsb2dpY2ZhczQwOF9wcml2ICpwcml2ID0gZ2V0X3ByaXZfYnlfY21kKGNtZCk7CiAJcHJpdi0+cWFib3J0ID0gMTsKQEAgLTUwOCw3ICs1MDgsNyBAQAogICoJdGhlIFBDTUNJQSBxbG9naWNfc3R1YiBjb2RlLiBUaGlzIHdhbnRzIGZpeGluZwogICovCiAKLWludCBxbG9naWNmYXM0MDhfYnVzX3Jlc2V0KFNjc2lfQ21uZCAqIGNtZCkKK2ludCBxbG9naWNmYXM0MDhfYnVzX3Jlc2V0KHN0cnVjdCBzY3NpX2NtbmQgKmNtZCkKIHsKIAlzdHJ1Y3QgcWxvZ2ljZmFzNDA4X3ByaXYgKnByaXYgPSBnZXRfcHJpdl9ieV9jbWQoY21kKTsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3Fsb2dpY2ZhczQwOC5oIGIvZHJpdmVycy9zY3NpL3Fsb2dpY2ZhczQwOC5oCmluZGV4IDhmZDU1NTUuLjI2MDYyNjQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9xbG9naWNmYXM0MDguaAorKysgYi9kcml2ZXJzL3Njc2kvcWxvZ2ljZmFzNDA4LmgKQEAgLTc1LDE1ICs3NSwxNSBAQAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIAogc3RydWN0IHFsb2dpY2ZhczQwOF9wcml2IHsKLQkgaW50CQlxYmFzZTsJCS8qIFBvcnQgKi8KLQkgaW50CQlxaW5pdGlkOwkvKiBpbml0aWF0b3IgSUQgKi8KLQkgaW50CQlxYWJvcnQ7CQkvKiBGbGFnIHRvIGNhdXNlIGFuIGFib3J0ICovCi0JIGludAkJcWxpcnE7CQkvKiBJUlEgYmVpbmcgdXNlZCAqLwotCSBpbnQJCWludF90eXBlOwkvKiB0eXBlIG9mIGlycSwgMiBmb3IgSVNBIGJvYXJkLCAwIGZvciBQQ01DSUEgKi8KLQkgY2hhcgkJcWluZm9bODBdOwkvKiBkZXNjcmlwdGlvbiAqLwotCSBTY3NpX0NtbmQgCSpxbGNtZDsJCS8qIGN1cnJlbnQgY29tbWFuZCBiZWluZyBwcm9jZXNzZWQgKi8KLQkgc3RydWN0IFNjc2lfSG9zdCAqc2hvc3Q7CS8qIHBvaW50ZXIgYmFjayB0byBob3N0ICovCi0JIHN0cnVjdCBxbG9naWNmYXM0MDhfcHJpdiAqbmV4dDsgLyogbmV4dCBwcml2YXRlIHN0cnVjdCAqLworCWludCBxYmFzZTsJCS8qIFBvcnQgKi8KKwlpbnQgcWluaXRpZDsJCS8qIGluaXRpYXRvciBJRCAqLworCWludCBxYWJvcnQ7CQkvKiBGbGFnIHRvIGNhdXNlIGFuIGFib3J0ICovCisJaW50IHFsaXJxOwkJLyogSVJRIGJlaW5nIHVzZWQgKi8KKwlpbnQgaW50X3R5cGU7CQkvKiB0eXBlIG9mIGlycSwgMiBmb3IgSVNBIGJvYXJkLCAwIGZvciBQQ01DSUEgKi8KKwljaGFyIHFpbmZvWzgwXTsJCS8qIGRlc2NyaXB0aW9uICovCisJc3RydWN0IHNjc2lfY21uZCAqcWxjbWQ7CS8qIGN1cnJlbnQgY29tbWFuZCBiZWluZyBwcm9jZXNzZWQgKi8KKwlzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdDsJLyogcG9pbnRlciBiYWNrIHRvIGhvc3QgKi8KKwlzdHJ1Y3QgcWxvZ2ljZmFzNDA4X3ByaXYgKm5leHQ7IC8qIG5leHQgcHJpdmF0ZSBzdHJ1Y3QgKi8KIH07CiAKIC8qIFRoZSBxbG9naWMgY2FyZCB1c2VzIHR3byByZWdpc3RlciBtYXBzIC0gVGhlc2UgbWFjcm9zIHNlbGVjdCB3aGljaCBvbmUgKi8KQEAgLTEwMywxMiArMTAzLDEzIEBACiAjZGVmaW5lIGdldF9wcml2X2J5X2hvc3QoeCkgKHN0cnVjdCBxbG9naWNmYXM0MDhfcHJpdiAqKSYoKHgpLT5ob3N0ZGF0YVswXSkKIAogaXJxcmV0dXJuX3QgcWxvZ2ljZmFzNDA4X2loYW5kbChpbnQgaXJxLCB2b2lkICpkZXZfaWQpOwotaW50IHFsb2dpY2ZhczQwOF9xdWV1ZWNvbW1hbmQoU2NzaV9DbW5kICogY21kLCB2b2lkICgqZG9uZSkgKFNjc2lfQ21uZCAqKSk7CitpbnQgcWxvZ2ljZmFzNDA4X3F1ZXVlY29tbWFuZChzdHJ1Y3Qgc2NzaV9jbW5kICogY21kLAorCQkJICAgICAgdm9pZCAoKmRvbmUpIChzdHJ1Y3Qgc2NzaV9jbW5kICopKTsKIGludCBxbG9naWNmYXM0MDhfYmlvc3BhcmFtKHN0cnVjdCBzY3NpX2RldmljZSAqIGRpc2ssCi0JCSAgICAgICAgc3RydWN0IGJsb2NrX2RldmljZSAqZGV2LAotCQkJc2VjdG9yX3QgY2FwYWNpdHksIGludCBpcFtdKTsKLWludCBxbG9naWNmYXM0MDhfYWJvcnQoU2NzaV9DbW5kICogY21kKTsKLWludCBxbG9naWNmYXM0MDhfYnVzX3Jlc2V0KFNjc2lfQ21uZCAqIGNtZCk7CisJCQkgICBzdHJ1Y3QgYmxvY2tfZGV2aWNlICpkZXYsCisJCQkgICBzZWN0b3JfdCBjYXBhY2l0eSwgaW50IGlwW10pOworaW50IHFsb2dpY2ZhczQwOF9hYm9ydChzdHJ1Y3Qgc2NzaV9jbW5kICogY21kKTsKK2ludCBxbG9naWNmYXM0MDhfYnVzX3Jlc2V0KHN0cnVjdCBzY3NpX2NtbmQgKiBjbWQpOwogY29uc3QgY2hhciAqcWxvZ2ljZmFzNDA4X2luZm8oc3RydWN0IFNjc2lfSG9zdCAqaG9zdCk7CiBpbnQgcWxvZ2ljZmFzNDA4X2dldF9jaGlwX3R5cGUoaW50IHFiYXNlLCBpbnQgaW50X3R5cGUpOwogdm9pZCBxbG9naWNmYXM0MDhfc2V0dXAoaW50IHFiYXNlLCBpbnQgaWQsIGludCBpbnRfdHlwZSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvcWxvZ2ljcHRpLmMgYi9kcml2ZXJzL3Njc2kvcWxvZ2ljcHRpLmMKaW5kZXggZWQ1OGJiNC4uOWI4MjdjZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL3Fsb2dpY3B0aS5jCisrKyBiL2RyaXZlcnMvc2NzaS9xbG9naWNwdGkuYwpAQCAtNDYxLDcgKzQ2MSw3IEBACiAKICNkZWZpbmUgUFRJX1JFU0VUX0xJTUlUIDQwMAogCi1zdGF0aWMgaW50IF9faW5pdCBxbG9naWNwdGlfbG9hZF9maXJtd2FyZShzdHJ1Y3QgcWxvZ2ljcHRpICpxcHRpKQorc3RhdGljIGludCBfX2RldmluaXQgcWxvZ2ljcHRpX2xvYWRfZmlybXdhcmUoc3RydWN0IHFsb2dpY3B0aSAqcXB0aSkKIHsKIAlzdHJ1Y3QgU2NzaV9Ib3N0ICpob3N0ID0gcXB0aS0+cWhvc3Q7CiAJdW5zaWduZWQgc2hvcnQgY3N1bSA9IDA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvcWxvZ2ljcHRpX2FzbS5jIGIvZHJpdmVycy9zY3NpL3Fsb2dpY3B0aV9hc20uYwppbmRleCAxNTQ1YjMwLi4xOWFhODRmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvcWxvZ2ljcHRpX2FzbS5jCisrKyBiL2RyaXZlcnMvc2NzaS9xbG9naWNwdGlfYXNtLmMKQEAgLTEsNSArMSw1IEBACiAvKiBWZXJzaW9uIDEuMzEuMDAgSVNQMTAwMCBJbml0aWF0b3IgUklTQyBmaXJtd2FyZSAqLwotdW5zaWduZWQgc2hvcnQgc2J1c19yaXNjX2NvZGUwMVtdIF9faW5pdGRhdGEgPSB7Cit1bnNpZ25lZCBzaG9ydCBzYnVzX3Jpc2NfY29kZTAxW10gX19kZXZpbml0ZGF0YSA9IHsKIAkweDAwNzgsIDB4MTAzMCwgMHgwMDAwLCAweDI0MTksIDB4MDAwMCwgMHgxMmZmLCAweDIwNDMsIDB4NGY1MCwKIAkweDU5NTIsIDB4NDk0NywgMHg0ODU0LCAweDIwMzEsIDB4MzkzOSwgMHgzMTJjLCAweDMxMzksIDB4MzkzMiwKIAkweDJjMzEsIDB4MzkzOSwgMHgzMzJjLCAweDMxMzksIDB4MzkzNCwgMHgyMDUxLCAweDRjNGYsIDB4NDc0OSwKQEAgLTExNTcsNCArMTE1Nyw0IEBACiAJMHgwMDNjLCAweDAwNDAsIDB4MzQxNSwgMHgyMDE5LCAweDI2MjYsIDB4N2IyMiwgMHg3YjI2LCAweDAwN2MsCiAJMHg5MmE3CiB9OwotdW5zaWduZWQgc2hvcnQgc2J1c19yaXNjX2NvZGVfbGVuZ3RoMDEgPSAweDI0MTk7Cit1bnNpZ25lZCBzaG9ydCBfX2RldmluaXRkYXRhIHNidXNfcmlzY19jb2RlX2xlbmd0aDAxID0gMHgyNDE5OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3Njc2lfZGVidWcuYyBiL2RyaXZlcnMvc2NzaS9zY3NpX2RlYnVnLmMKaW5kZXggOWMwZjM1OC4uMzBlZTNkNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL3Njc2lfZGVidWcuYworKysgYi9kcml2ZXJzL3Njc2kvc2NzaV9kZWJ1Zy5jCkBAIC01Miw3ICs1Miw3IEBACiAjaW5jbHVkZSAic2NzaV9kZWJ1Zy5oIgogCiAjZGVmaW5lIFNDU0lfREVCVUdfVkVSU0lPTiAiMS44MCIKLXN0YXRpYyBjb25zdCBjaGFyICogc2NzaV9kZWJ1Z192ZXJzaW9uX2RhdGUgPSAiMjAwNjA5MTQiOworc3RhdGljIGNvbnN0IGNoYXIgKiBzY3NpX2RlYnVnX3ZlcnNpb25fZGF0ZSA9ICIyMDA2MTAxOCI7CiAKIC8qIEFkZGl0aW9uYWwgU2Vuc2UgQ29kZSAoQVNDKSB1c2VkICovCiAjZGVmaW5lIE5PX0FERElUSU9OQUxfU0VOU0UgMHgwCkBAIC0yNTQsNiArMjU0LDggQEAKIAkJCSBzdHJ1Y3Qgc2RlYnVnX2Rldl9pbmZvICogZGV2aXApOwogc3RhdGljIGludCByZXNwX3N0YXJ0X3N0b3Aoc3RydWN0IHNjc2lfY21uZCAqIHNjcCwKIAkJCSAgIHN0cnVjdCBzZGVidWdfZGV2X2luZm8gKiBkZXZpcCk7CitzdGF0aWMgaW50IHJlc3BfcmVwb3J0X3RndHBncyhzdHJ1Y3Qgc2NzaV9jbW5kICogc2NwLAorCQkJICAgICAgc3RydWN0IHNkZWJ1Z19kZXZfaW5mbyAqIGRldmlwKTsKIHN0YXRpYyBpbnQgcmVzcF9yZWFkY2FwKHN0cnVjdCBzY3NpX2NtbmQgKiBTQ3BudCwKIAkJCXN0cnVjdCBzZGVidWdfZGV2X2luZm8gKiBkZXZpcCk7CiBzdGF0aWMgaW50IHJlc3BfcmVhZGNhcDE2KHN0cnVjdCBzY3NpX2NtbmQgKiBTQ3BudCwKQEAgLTI4Nyw5ICsyODksOSBAQAogc3RhdGljIHZvaWQgX19pbml0IGluaXRfYWxsX3F1ZXVlZCh2b2lkKTsKIHN0YXRpYyB2b2lkIHN0b3BfYWxsX3F1ZXVlZCh2b2lkKTsKIHN0YXRpYyBpbnQgc3RvcF9xdWV1ZWRfY21uZChzdHJ1Y3Qgc2NzaV9jbW5kICogY21uZCk7Ci1zdGF0aWMgaW50IGlucXVpcnlfZXZwZF84Myh1bnNpZ25lZCBjaGFyICogYXJyLCBpbnQgdGFyZ2V0X2Rldl9pZCwKLQkJCSAgIGludCBkZXZfaWRfbnVtLCBjb25zdCBjaGFyICogZGV2X2lkX3N0ciwKLQkJCSAgIGludCBkZXZfaWRfc3RyX2xlbik7CitzdGF0aWMgaW50IGlucXVpcnlfZXZwZF84Myh1bnNpZ25lZCBjaGFyICogYXJyLCBpbnQgcG9ydF9ncm91cF9pZCwKKwkJCSAgIGludCB0YXJnZXRfZGV2X2lkLCBpbnQgZGV2X2lkX251bSwKKwkJCSAgIGNvbnN0IGNoYXIgKiBkZXZfaWRfc3RyLCBpbnQgZGV2X2lkX3N0cl9sZW4pOwogc3RhdGljIGludCBpbnF1aXJ5X2V2cGRfODgodW5zaWduZWQgY2hhciAqIGFyciwgaW50IHRhcmdldF9kZXZfaWQpOwogc3RhdGljIGludCBkb19jcmVhdGVfZHJpdmVyZnNfZmlsZXModm9pZCk7CiBzdGF0aWMgdm9pZCBkb19yZW1vdmVfZHJpdmVyZnNfZmlsZXModm9pZCk7CkBAIC00MjIsNiArNDI0LDE1IEBACiAJCX0KIAkJZXJyc3RzID0gcmVzcF9yZWFkY2FwMTYoU0NwbnQsIGRldmlwKTsKIAkJYnJlYWs7CisJY2FzZSBNQUlOVEVOQU5DRV9JTjoKKwkJaWYgKE1JX1JFUE9SVF9UQVJHRVRfUEdTICE9IGNtZFsxXSkgeworCQkJbWtfc2Vuc2VfYnVmZmVyKGRldmlwLCBJTExFR0FMX1JFUVVFU1QsCisJCQkJCUlOVkFMSURfT1BDT0RFLCAwKTsKKwkJCWVycnN0cyA9IGNoZWNrX2NvbmRpdGlvbl9yZXN1bHQ7CisJCQlicmVhazsKKwkJfQorCQllcnJzdHMgPSByZXNwX3JlcG9ydF90Z3RwZ3MoU0NwbnQsIGRldmlwKTsKKwkJYnJlYWs7CiAJY2FzZSBSRUFEXzE2OgogCWNhc2UgUkVBRF8xMjoKIAljYXNlIFJFQURfMTA6CkBAIC02NjUsOCArNjc2LDkgQEAKIHN0YXRpYyBjb25zdCBjaGFyICogaW5xX3Byb2R1Y3RfaWQgPSAic2NzaV9kZWJ1ZyAgICAgICI7CiBzdGF0aWMgY29uc3QgY2hhciAqIGlucV9wcm9kdWN0X3JldiA9ICIwMDA0IjsKIAotc3RhdGljIGludCBpbnF1aXJ5X2V2cGRfODModW5zaWduZWQgY2hhciAqIGFyciwgaW50IHRhcmdldF9kZXZfaWQsCi0JCQkgICBpbnQgZGV2X2lkX251bSwgY29uc3QgY2hhciAqIGRldl9pZF9zdHIsCitzdGF0aWMgaW50IGlucXVpcnlfZXZwZF84Myh1bnNpZ25lZCBjaGFyICogYXJyLCBpbnQgcG9ydF9ncm91cF9pZCwKKwkJCSAgIGludCB0YXJnZXRfZGV2X2lkLCBpbnQgZGV2X2lkX251bSwKKwkJCSAgIGNvbnN0IGNoYXIgKiBkZXZfaWRfc3RyLAogCQkJICAgaW50IGRldl9pZF9zdHJfbGVuKQogewogCWludCBudW0sIHBvcnRfYTsKQEAgLTcyMCw2ICs3MzIsMTUgQEAKIAlhcnJbbnVtKytdID0gKHBvcnRfYSA+PiAxNikgJiAweGZmOwogCWFycltudW0rK10gPSAocG9ydF9hID4+IDgpICYgMHhmZjsKIAlhcnJbbnVtKytdID0gcG9ydF9hICYgMHhmZjsKKwkvKiBOQUEtNSwgVGFyZ2V0IHBvcnQgZ3JvdXAgaWRlbnRpZmllciAqLworCWFycltudW0rK10gPSAweDYxOwkvKiBwcm90bz1zYXMsIGJpbmFyeSAqLworCWFycltudW0rK10gPSAweDk1OwkvKiBwaXY9MSwgdGFyZ2V0IHBvcnQgZ3JvdXAgaWQgKi8KKwlhcnJbbnVtKytdID0gMHgwOworCWFycltudW0rK10gPSAweDQ7CisJYXJyW251bSsrXSA9IDA7CisJYXJyW251bSsrXSA9IDA7CisJYXJyW251bSsrXSA9IChwb3J0X2dyb3VwX2lkID4+IDgpICYgMHhmZjsKKwlhcnJbbnVtKytdID0gcG9ydF9ncm91cF9pZCAmIDB4ZmY7CiAJLyogTkFBLTUsIFRhcmdldCBkZXZpY2UgaWRlbnRpZmllciAqLwogCWFycltudW0rK10gPSAweDYxOwkvKiBwcm90bz1zYXMsIGJpbmFyeSAqLwogCWFycltudW0rK10gPSAweGEzOwkvKiBwaXY9MSwgdGFyZ2V0IGRldmljZSwgbmFhICovCkBAIC05MjgsMTIgKzk0OSwxMiBAQAogCQkJc3RydWN0IHNkZWJ1Z19kZXZfaW5mbyAqIGRldmlwKQogewogCXVuc2lnbmVkIGNoYXIgcHFfcGR0OwotCXVuc2lnbmVkIGNoYXIgYXJyW1NERUJVR19NQVhfSU5RX0FSUl9TWl07CisJdW5zaWduZWQgY2hhciAqIGFycjsKIAl1bnNpZ25lZCBjaGFyICpjbWQgPSAodW5zaWduZWQgY2hhciAqKXNjcC0+Y21uZDsKLQlpbnQgYWxsb2NfbGVuLCBuOworCWludCBhbGxvY19sZW4sIG4sIHJldDsKIAogCWFsbG9jX2xlbiA9IChjbWRbM10gPDwgOCkgKyBjbWRbNF07Ci0JbWVtc2V0KGFyciwgMCwgU0RFQlVHX01BWF9JTlFfQVJSX1NaKTsKKwlhcnIgPSBremFsbG9jKFNERUJVR19NQVhfSU5RX0FSUl9TWiwgR0ZQX0tFUk5FTCk7CiAJaWYgKGRldmlwLT53bHVuKQogCQlwcV9wZHQgPSAweDFlOwkvKiBwcmVzZW50LCB3bHVuICovCiAJZWxzZSBpZiAoc2NzaV9kZWJ1Z19ub19sdW5fMCAmJiAoMCA9PSBkZXZpcC0+bHVuKSkKQEAgLTk0NCwxMiArOTY1LDE1IEBACiAJaWYgKDB4MiAmIGNtZFsxXSkgeyAgLyogQ01ERFQgYml0IHNldCAqLwogCQlta19zZW5zZV9idWZmZXIoZGV2aXAsIElMTEVHQUxfUkVRVUVTVCwgSU5WQUxJRF9GSUVMRF9JTl9DREIsCiAJCQkgICAgICAgCTApOworCQlrZnJlZShhcnIpOwogCQlyZXR1cm4gY2hlY2tfY29uZGl0aW9uX3Jlc3VsdDsKIAl9IGVsc2UgaWYgKDB4MSAmIGNtZFsxXSkgeyAgLyogRVZQRCBiaXQgc2V0ICovCi0JCWludCBsdV9pZF9udW0sIHRhcmdldF9kZXZfaWQsIGxlbjsKKwkJaW50IGx1X2lkX251bSwgcG9ydF9ncm91cF9pZCwgdGFyZ2V0X2Rldl9pZCwgbGVuOwogCQljaGFyIGx1X2lkX3N0cls2XTsKIAkJaW50IGhvc3Rfbm8gPSBkZXZpcC0+c2RiZ19ob3N0LT5zaG9zdC0+aG9zdF9ubzsKIAkJCisJCXBvcnRfZ3JvdXBfaWQgPSAoKChob3N0X25vICsgMSkgJiAweDdmKSA8PCA4KSArCisJCSAgICAoZGV2aXAtPmNoYW5uZWwgJiAweDdmKTsKIAkJaWYgKDAgPT0gc2NzaV9kZWJ1Z192cGRfdXNlX2hvc3RubykKIAkJCWhvc3Rfbm8gPSAwOwogCQlsdV9pZF9udW0gPSBkZXZpcC0+d2x1biA/IC0xIDogKCgoaG9zdF9ubyArIDEpICogMjAwMCkgKwpAQCAtOTc3LDggKzEwMDEsOSBAQAogCQkJbWVtY3B5KCZhcnJbNF0sIGx1X2lkX3N0ciwgbGVuKTsKIAkJfSBlbHNlIGlmICgweDgzID09IGNtZFsyXSkgeyAvKiBkZXZpY2UgaWRlbnRpZmljYXRpb24gKi8KIAkJCWFyclsxXSA9IGNtZFsyXTsJLypzYW5pdHkgKi8KLQkJCWFyclszXSA9IGlucXVpcnlfZXZwZF84MygmYXJyWzRdLCB0YXJnZXRfZGV2X2lkLAotCQkJCQkJIGx1X2lkX251bSwgbHVfaWRfc3RyLCBsZW4pOworCQkJYXJyWzNdID0gaW5xdWlyeV9ldnBkXzgzKCZhcnJbNF0sIHBvcnRfZ3JvdXBfaWQsCisJCQkJCQkgdGFyZ2V0X2Rldl9pZCwgbHVfaWRfbnVtLAorCQkJCQkJIGx1X2lkX3N0ciwgbGVuKTsKIAkJfSBlbHNlIGlmICgweDg0ID09IGNtZFsyXSkgeyAvKiBTb2Z0d2FyZSBpbnRlcmZhY2UgaWRlbnQuICovCiAJCQlhcnJbMV0gPSBjbWRbMl07CS8qc2FuaXR5ICovCiAJCQlhcnJbM10gPSBpbnF1aXJ5X2V2cGRfODQoJmFycls0XSk7CkBAIC0xMDEyLDE3ICsxMDM3LDIyIEBACiAJCQkvKiBJbGxlZ2FsIHJlcXVlc3QsIGludmFsaWQgZmllbGQgaW4gY2RiICovCiAJCQlta19zZW5zZV9idWZmZXIoZGV2aXAsIElMTEVHQUxfUkVRVUVTVCwKIAkJCQkJSU5WQUxJRF9GSUVMRF9JTl9DREIsIDApOworCQkJa2ZyZWUoYXJyKTsKIAkJCXJldHVybiBjaGVja19jb25kaXRpb25fcmVzdWx0OwogCQl9CiAJCWxlbiA9IG1pbigoKGFyclsyXSA8PCA4KSArIGFyclszXSkgKyA0LCBhbGxvY19sZW4pOwotCQlyZXR1cm4gZmlsbF9mcm9tX2Rldl9idWZmZXIoc2NwLCBhcnIsCisJCXJldCA9IGZpbGxfZnJvbV9kZXZfYnVmZmVyKHNjcCwgYXJyLAogCQkJICAgIG1pbihsZW4sIFNERUJVR19NQVhfSU5RX0FSUl9TWikpOworCQlrZnJlZShhcnIpOworCQlyZXR1cm4gcmV0OwogCX0KIAkvKiBkcm9wcyB0aHJvdWdoIGhlcmUgZm9yIGEgc3RhbmRhcmQgaW5xdWlyeSAqLwogCWFyclsxXSA9IERFVl9SRU1PVkVBQkxFKHRhcmdldCkgPyAweDgwIDogMDsJLyogUmVtb3ZhYmxlIGRpc2sgKi8KIAlhcnJbMl0gPSBzY3NpX2RlYnVnX3Njc2lfbGV2ZWw7CiAJYXJyWzNdID0gMjsgICAgLyogcmVzcG9uc2VfZGF0YV9mb3JtYXQ9PTIgKi8KIAlhcnJbNF0gPSBTREVCVUdfTE9OR19JTlFfU1ogLSA1OworCWlmICgwID09IHNjc2lfZGVidWdfdnBkX3VzZV9ob3N0bm8pCisJCWFycls1XSA9IDB4MTA7IC8qIGNsYWltOiBpbXBsaWNpdCBUR1BTICovCiAJYXJyWzZdID0gMHgxMDsgLyogY2xhaW06IE11bHRpUCAqLwogCS8qIGFycls2XSB8PSAweDQwOyAuLi4gY2xhaW06IEVuY1NlcnYgKGVuY2xvc3VyZSBzZXJ2aWNlcykgKi8KIAlhcnJbN10gPSAweGE7IC8qIGNsYWltOiBMSU5LRUQgKyBDTURRVUUgKi8KQEAgLTEwMzksOCArMTA2OSwxMCBAQAogCQlhcnJbbisrXSA9IDB4MzsgYXJyW24rK10gPSAweDYwOyAvKiBTU0MtMiBubyB2ZXJzaW9uICovCiAJfQogCWFycltuKytdID0gMHhjOyBhcnJbbisrXSA9IDB4ZjsgIC8qIFNBUy0xLjEgcmV2IDEwICovCi0JcmV0dXJuIGZpbGxfZnJvbV9kZXZfYnVmZmVyKHNjcCwgYXJyLAorCXJldCA9IGZpbGxfZnJvbV9kZXZfYnVmZmVyKHNjcCwgYXJyLAogCQkJICAgIG1pbihhbGxvY19sZW4sIFNERUJVR19MT05HX0lOUV9TWikpOworCWtmcmVlKGFycik7CisJcmV0dXJuIHJldDsKIH0KIAogc3RhdGljIGludCByZXNwX3JlcXVlc3RzKHN0cnVjdCBzY3NpX2NtbmQgKiBzY3AsCkBAIC0xMTcxLDYgKzEyMDMsODcgQEAKIAkJCQkgICAgbWluKGFsbG9jX2xlbiwgU0RFQlVHX1JFQURDQVAxNl9BUlJfU1opKTsKIH0KIAorI2RlZmluZSBTREVCVUdfTUFYX1RHVFBHU19BUlJfU1ogMTQxMgorCitzdGF0aWMgaW50IHJlc3BfcmVwb3J0X3RndHBncyhzdHJ1Y3Qgc2NzaV9jbW5kICogc2NwLAorCQkJICAgICAgc3RydWN0IHNkZWJ1Z19kZXZfaW5mbyAqIGRldmlwKQoreworCXVuc2lnbmVkIGNoYXIgKmNtZCA9ICh1bnNpZ25lZCBjaGFyICopc2NwLT5jbW5kOworCXVuc2lnbmVkIGNoYXIgKiBhcnI7CisJaW50IGhvc3Rfbm8gPSBkZXZpcC0+c2RiZ19ob3N0LT5zaG9zdC0+aG9zdF9ubzsKKwlpbnQgbiwgcmV0LCBhbGVuLCBybGVuOworCWludCBwb3J0X2dyb3VwX2EsIHBvcnRfZ3JvdXBfYiwgcG9ydF9hLCBwb3J0X2I7CisKKwlhbGVuID0gKChjbWRbNl0gPDwgMjQpICsgKGNtZFs3XSA8PCAxNikgKyAoY21kWzhdIDw8IDgpCisJCSsgY21kWzldKTsKKworCWFyciA9IGt6YWxsb2MoU0RFQlVHX01BWF9UR1RQR1NfQVJSX1NaLCBHRlBfS0VSTkVMKTsKKwkvKgorCSAqIEVWUEQgcGFnZSAweDg4IHN0YXRlcyB3ZSBoYXZlIHR3byBwb3J0cywgb25lCisJICogcmVhbCBhbmQgYSBmYWtlIHBvcnQgd2l0aCBubyBkZXZpY2UgY29ubmVjdGVkLgorCSAqIFNvIHdlIGNyZWF0ZSB0d28gcG9ydCBncm91cHMgd2l0aCBvbmUgcG9ydCBlYWNoCisJICogYW5kIHNldCB0aGUgZ3JvdXAgd2l0aCBwb3J0IEIgdG8gdW5hdmFpbGFibGUuCisJICovCisJcG9ydF9hID0gMHgxOyAvKiByZWxhdGl2ZSBwb3J0IEEgKi8KKwlwb3J0X2IgPSAweDI7IC8qIHJlbGF0aXZlIHBvcnQgQiAqLworCXBvcnRfZ3JvdXBfYSA9ICgoKGhvc3Rfbm8gKyAxKSAmIDB4N2YpIDw8IDgpICsKKwkgICAgKGRldmlwLT5jaGFubmVsICYgMHg3Zik7CisJcG9ydF9ncm91cF9iID0gKCgoaG9zdF9ubyArIDEpICYgMHg3ZikgPDwgOCkgKworCSAgICAoZGV2aXAtPmNoYW5uZWwgJiAweDdmKSArIDB4ODA7CisKKwkvKgorCSAqIFRoZSBhc3ltbWV0cmljIGFjY2VzcyBzdGF0ZSBpcyBjeWNsZWQgYWNjb3JkaW5nIHRvIHRoZSBob3N0X2lkLgorCSAqLworCW4gPSA0OworCWlmICgwID09IHNjc2lfZGVidWdfdnBkX3VzZV9ob3N0bm8pIHsKKwkgICAgYXJyW24rK10gPSBob3N0X25vICUgMzsgLyogQXN5bW0gYWNjZXNzIHN0YXRlICovCisJICAgIGFycltuKytdID0gMHgwRjsgLyogY2xhaW06IGFsbCBzdGF0ZXMgYXJlIHN1cHBvcnRlZCAqLworCX0gZWxzZSB7CisJICAgIGFycltuKytdID0gMHgwOyAvKiBBY3RpdmUvT3B0aW1pemVkIHBhdGggKi8KKwkgICAgYXJyW24rK10gPSAweDAxOyAvKiBjbGFpbTogb25seSBzdXBwb3J0IGFjdGl2ZS9vcHRpbWl6ZWQgcGF0aHMgKi8KKwl9CisJYXJyW24rK10gPSAocG9ydF9ncm91cF9hID4+IDgpICYgMHhmZjsKKwlhcnJbbisrXSA9IHBvcnRfZ3JvdXBfYSAmIDB4ZmY7CisJYXJyW24rK10gPSAwOyAgICAvKiBSZXNlcnZlZCAqLworCWFycltuKytdID0gMDsgICAgLyogU3RhdHVzIGNvZGUgKi8KKwlhcnJbbisrXSA9IDA7ICAgIC8qIFZlbmRvciB1bmlxdWUgKi8KKwlhcnJbbisrXSA9IDB4MTsgIC8qIE9uZSBwb3J0IHBlciBncm91cCAqLworCWFycltuKytdID0gMDsgICAgLyogUmVzZXJ2ZWQgKi8KKwlhcnJbbisrXSA9IDA7ICAgIC8qIFJlc2VydmVkICovCisJYXJyW24rK10gPSAocG9ydF9hID4+IDgpICYgMHhmZjsKKwlhcnJbbisrXSA9IHBvcnRfYSAmIDB4ZmY7CisJYXJyW24rK10gPSAzOyAgICAvKiBQb3J0IHVuYXZhaWxhYmxlICovCisJYXJyW24rK10gPSAweDA4OyAvKiBjbGFpbTogb25seSB1bmF2YWlsYWxiZSBwYXRocyBhcmUgc3VwcG9ydGVkICovCisJYXJyW24rK10gPSAocG9ydF9ncm91cF9iID4+IDgpICYgMHhmZjsKKwlhcnJbbisrXSA9IHBvcnRfZ3JvdXBfYiAmIDB4ZmY7CisJYXJyW24rK10gPSAwOyAgICAvKiBSZXNlcnZlZCAqLworCWFycltuKytdID0gMDsgICAgLyogU3RhdHVzIGNvZGUgKi8KKwlhcnJbbisrXSA9IDA7ICAgIC8qIFZlbmRvciB1bmlxdWUgKi8KKwlhcnJbbisrXSA9IDB4MTsgIC8qIE9uZSBwb3J0IHBlciBncm91cCAqLworCWFycltuKytdID0gMDsgICAgLyogUmVzZXJ2ZWQgKi8KKwlhcnJbbisrXSA9IDA7ICAgIC8qIFJlc2VydmVkICovCisJYXJyW24rK10gPSAocG9ydF9iID4+IDgpICYgMHhmZjsKKwlhcnJbbisrXSA9IHBvcnRfYiAmIDB4ZmY7CisKKwlybGVuID0gbiAtIDQ7CisJYXJyWzBdID0gKHJsZW4gPj4gMjQpICYgMHhmZjsKKwlhcnJbMV0gPSAocmxlbiA+PiAxNikgJiAweGZmOworCWFyclsyXSA9IChybGVuID4+IDgpICYgMHhmZjsKKwlhcnJbM10gPSBybGVuICYgMHhmZjsKKworCS8qCisJICogUmV0dXJuIHRoZSBzbWFsbGVzdCB2YWx1ZSBvZiBlaXRoZXIKKwkgKiAtIFRoZSBhbGxvY2F0ZWQgbGVuZ3RoCisJICogLSBUaGUgY29uc3RydWN0ZWQgY29tbWFuZCBsZW5ndGgKKwkgKiAtIFRoZSBtYXhpbXVtIGFycmF5IHNpemUKKwkgKi8KKwlybGVuID0gbWluKGFsZW4sbik7CisJcmV0ID0gZmlsbF9mcm9tX2Rldl9idWZmZXIoc2NwLCBhcnIsCisJCQkJICAgbWluKHJsZW4sIFNERUJVR19NQVhfVEdUUEdTX0FSUl9TWikpOworCWtmcmVlKGFycik7CisJcmV0dXJuIHJldDsKK30KKwogLyogPDxGb2xsb3dpbmcgbW9kZSBwYWdlIGluZm8gY29waWVkIGZyb20gU1QzMTg0NTFMVz4+ICovCiAKIHN0YXRpYyBpbnQgcmVzcF9lcnJfcmVjb3ZfcGcodW5zaWduZWQgY2hhciAqIHAsIGludCBwY29udHJvbCwgaW50IHRhcmdldCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9zY3NpX2xpYi5jIGIvZHJpdmVycy9zY3NpL3Njc2lfbGliLmMKaW5kZXggZWUzNWE2Mi4uMmYxMmY5ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL3Njc2lfbGliLmMKKysrIGIvZHJpdmVycy9zY3NpL3Njc2lfbGliLmMKQEAgLTQxMCw2ICs0MTAsNyBAQAogCQlnb3RvIGZyZWVfcmVxOwogCiAJcmVxLT5jbWRfbGVuID0gY21kX2xlbjsKKwltZW1zZXQocmVxLT5jbWQsIDAsIEJMS19NQVhfQ0RCKTsgLyogQVRBUEkgaGF0ZXMgZ2FyYmFnZSBhZnRlciBDREIgKi8KIAltZW1jcHkocmVxLT5jbWQsIGNtZCwgcmVxLT5jbWRfbGVuKTsKIAlyZXEtPnNlbnNlID0gc2lvYy0+c2Vuc2U7CiAJcmVxLT5zZW5zZV9sZW4gPSAwOwpAQCAtMTExOSw3ICsxMTIwLDcgQEAKIAkJcmVxLT5idWZmZXIgPSBOVUxMOwogCX0KIAotCUJVR19PTihzaXplb2YocmVxLT5jbWQpID4gc2l6ZW9mKGNtZC0+Y21uZCkpOworCUJVSUxEX0JVR19PTihzaXplb2YocmVxLT5jbWQpID4gc2l6ZW9mKGNtZC0+Y21uZCkpOwogCW1lbWNweShjbWQtPmNtbmQsIHJlcS0+Y21kLCBzaXplb2YoY21kLT5jbW5kKSk7CiAJY21kLT5jbWRfbGVuID0gcmVxLT5jbWRfbGVuOwogCWlmICghcmVxLT5kYXRhX2xlbikKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9zY3NpX3NjYW4uYyBiL2RyaXZlcnMvc2NzaS9zY3NpX3NjYW4uYwppbmRleCAxNDhlMjRjLi5hYTFiMWUwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvc2NzaV9zY2FuLmMKKysrIGIvZHJpdmVycy9zY3NpL3Njc2lfc2Nhbi5jCkBAIC03MDAsMTIgKzcwMCwyMiBAQAogCSAqIHNjYW5uaW5nIHJ1biBhdCB0aGVpciBvd24gcmlzaywgb3Igc3VwcGx5IGEgdXNlciBsZXZlbCBwcm9ncmFtCiAJICogdGhhdCBjYW4gY29ycmVjdGx5IHNjYW4uCiAJICovCi0Jc2Rldi0+aW5xdWlyeSA9IGttYWxsb2Moc2Rldi0+aW5xdWlyeV9sZW4sIEdGUF9BVE9NSUMpOwotCWlmIChzZGV2LT5pbnF1aXJ5ID09IE5VTEwpIHsKLQkJcmV0dXJuIFNDU0lfU0NBTl9OT19SRVNQT05TRTsKLQl9CiAKLQltZW1jcHkoc2Rldi0+aW5xdWlyeSwgaW5xX3Jlc3VsdCwgc2Rldi0+aW5xdWlyeV9sZW4pOworCS8qCisJICogQ29weSBhdCBsZWFzdCAzNiBieXRlcyBvZiBJTlFVSVJZIGRhdGEsIHNvIHRoYXQgd2UgZG9uJ3QKKwkgKiBkZXJlZmVyZW5jZSB1bmFsbG9jYXRlZCBtZW1vcnkgd2hlbiBhY2Nlc3NpbmcgdGhlIFZlbmRvciwKKwkgKiBQcm9kdWN0LCBhbmQgUmV2aXNpb24gc3RyaW5ncy4gIEJhZGx5IGJlaGF2ZWQgZGV2aWNlcyBtYXkgc2V0CisJICogdGhlIElOUVVJUlkgQWRkaXRpb25hbCBMZW5ndGggYnl0ZSB0byBhIHNtYWxsIHZhbHVlLCBpbmRpY2F0aW5nCisJICogdGhlc2Ugc3RyaW5ncyBhcmUgaW52YWxpZCwgYnV0IG9mdGVuIHRoZXkgY29udGFpbiBwbGF1c2libGUgZGF0YQorCSAqIG5vbmV0aGVsZXNzLiAgSXQgZG9lc24ndCBtYXR0ZXIgaWYgdGhlIGRldmljZSBzZW50IDwgMzYgYnl0ZXMKKwkgKiB0b3RhbCwgc2luY2Ugc2NzaV9wcm9iZV9sdW4oKSBpbml0aWFsaXplcyBpbnFfcmVzdWx0IHdpdGggMHMuCisJICovCisJc2Rldi0+aW5xdWlyeSA9IGttZW1kdXAoaW5xX3Jlc3VsdCwKKwkJCQltYXhfdChzaXplX3QsIHNkZXYtPmlucXVpcnlfbGVuLCAzNiksCisJCQkJR0ZQX0FUT01JQyk7CisJaWYgKHNkZXYtPmlucXVpcnkgPT0gTlVMTCkKKwkJcmV0dXJuIFNDU0lfU0NBTl9OT19SRVNQT05TRTsKKwogCXNkZXYtPnZlbmRvciA9IChjaGFyICopIChzZGV2LT5pbnF1aXJ5ICsgOCk7CiAJc2Rldi0+bW9kZWwgPSAoY2hhciAqKSAoc2Rldi0+aW5xdWlyeSArIDE2KTsKIAlzZGV2LT5yZXYgPSAoY2hhciAqKSAoc2Rldi0+aW5xdWlyeSArIDMyKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9zY3NpX3N5c2ZzLmMgYi9kcml2ZXJzL3Njc2kvc2NzaV9zeXNmcy5jCmluZGV4IGU3ZmU1NjUuLmUxYTkxNjYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9zY3NpX3N5c2ZzLmMKKysrIGIvZHJpdmVycy9zY3NpL3Njc2lfc3lzZnMuYwpAQCAtMTkyLDYgKzE5Miw3IEBACiBzaG9zdF9yZF9hdHRyKHVuaXF1ZV9pZCwgIiV1XG4iKTsKIHNob3N0X3JkX2F0dHIoaG9zdF9idXN5LCAiJWh1XG4iKTsKIHNob3N0X3JkX2F0dHIoY21kX3Blcl9sdW4sICIlaGRcbiIpOworc2hvc3RfcmRfYXR0cihjYW5fcXVldWUsICIlaGRcbiIpOwogc2hvc3RfcmRfYXR0cihzZ190YWJsZXNpemUsICIlaHVcbiIpOwogc2hvc3RfcmRfYXR0cih1bmNoZWNrZWRfaXNhX2RtYSwgIiVkXG4iKTsKIHNob3N0X3JkX2F0dHIyKHByb2NfbmFtZSwgaG9zdHQtPnByb2NfbmFtZSwgIiVzXG4iKTsKQEAgLTIwMCw2ICsyMDEsNyBAQAogCSZjbGFzc19kZXZpY2VfYXR0cl91bmlxdWVfaWQsCiAJJmNsYXNzX2RldmljZV9hdHRyX2hvc3RfYnVzeSwKIAkmY2xhc3NfZGV2aWNlX2F0dHJfY21kX3Blcl9sdW4sCisJJmNsYXNzX2RldmljZV9hdHRyX2Nhbl9xdWV1ZSwKIAkmY2xhc3NfZGV2aWNlX2F0dHJfc2dfdGFibGVzaXplLAogCSZjbGFzc19kZXZpY2VfYXR0cl91bmNoZWNrZWRfaXNhX2RtYSwKIAkmY2xhc3NfZGV2aWNlX2F0dHJfcHJvY19uYW1lLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3Njc2lfdHJhbnNwb3J0X2lzY3NpLmMgYi9kcml2ZXJzL3Njc2kvc2NzaV90cmFuc3BvcnRfaXNjc2kuYwppbmRleCA3YjAwMTljLi45YjI1MTI0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvc2NzaV90cmFuc3BvcnRfaXNjc2kuYworKysgYi9kcml2ZXJzL3Njc2kvc2NzaV90cmFuc3BvcnRfaXNjc2kuYwpAQCAtMjEsNyArMjEsNiBAQAogICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KICAqLwogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L21lbXBvb2wuaD4KICNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgogI2luY2x1ZGUgPG5ldC90Y3AuaD4KICNpbmNsdWRlIDxzY3NpL3Njc2kuaD4KQEAgLTM0LDcgKzMzLDcgQEAKICNkZWZpbmUgSVNDU0lfU0VTU0lPTl9BVFRSUyAxMQogI2RlZmluZSBJU0NTSV9DT05OX0FUVFJTIDExCiAjZGVmaW5lIElTQ1NJX0hPU1RfQVRUUlMgMAotI2RlZmluZSBJU0NTSV9UUkFOU1BPUlRfVkVSU0lPTiAiMi4wLTY4NSIKKyNkZWZpbmUgSVNDU0lfVFJBTlNQT1JUX1ZFUlNJT04gIjIuMC03MjQiCiAKIHN0cnVjdCBpc2NzaV9pbnRlcm5hbCB7CiAJaW50IGRhZW1vbl9waWQ7CkBAIC0xNDksMzAgKzE0OCw2IEBACiBzdGF0aWMgc3RydWN0IHNvY2sgKm5sczsKIHN0YXRpYyBERUZJTkVfTVVURVgocnhfcXVldWVfbXV0ZXgpOwogCi1zdHJ1Y3QgbWVtcG9vbF96b25lIHsKLQltZW1wb29sX3QgKnBvb2w7Ci0JYXRvbWljX3QgYWxsb2NhdGVkOwotCWludCBzaXplOwotCWludCBoaXdhdDsKLQlzdHJ1Y3QgbGlzdF9oZWFkIGZyZWVxdWV1ZTsKLQlzcGlubG9ja190IGZyZWVsb2NrOwotfTsKLQotc3RhdGljIHN0cnVjdCBtZW1wb29sX3pvbmUgKnpfcmVwbHk7Ci0KLS8qCi0gKiBaX01BWF8qIC0gYWN0dWFsIG1lbXBvb2wgc2l6ZSBhbGxvY2F0ZWQgYXQgdGhlIG1lbXBvb2xfem9uZV9pbml0KCkgdGltZQotICogWl9ISVdBVF8qIC0gem9uZSdzIGhpZ2ggd2F0ZXJtYXJrIHdoZW4gaWZfZXJyb3IgYml0IHdpbGwgYmUgc2V0IHRvIC1FTk9NRU0KLSAqICAgICAgICAgICAgIHNvIGRhZW1vbiB3aWxsIG5vdGljZSBPT00gb24gTkVUTElOSyB0cmFucG9zcnQgbGV2ZWwgYW5kIHdpbGwKLSAqICAgICAgICAgICAgIGJlIGFibGUgdG8gcHJlZGljdCBvciBjaGFuZ2Ugb3BlcmF0aW9uYWwgYmVoYXZpb3IKLSAqLwotI2RlZmluZSBaX01BWF9SRVBMWQk4Ci0jZGVmaW5lIFpfSElXQVRfUkVQTFkJNgotI2RlZmluZSBaX01BWF9QRFUJOAotI2RlZmluZSBaX0hJV0FUX1BEVQk2Ci0jZGVmaW5lIFpfTUFYX0VSUk9SCTE2Ci0jZGVmaW5lIFpfSElXQVRfRVJST1IJMTIKLQogc3RhdGljIExJU1RfSEVBRChzZXNzbGlzdCk7CiBzdGF0aWMgREVGSU5FX1NQSU5MT0NLKHNlc3Nsb2NrKTsKIHN0YXRpYyBMSVNUX0hFQUQoY29ubmxpc3QpOwpAQCAtNDE0LDU5ICszODksMTEgQEAKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKGlzY3NpX2Rlc3Ryb3lfc2Vzc2lvbik7CiAKLXN0YXRpYyB2b2lkIG1lbXBvb2xfem9uZV9kZXN0cm95KHN0cnVjdCBtZW1wb29sX3pvbmUgKnpwKQotewotCW1lbXBvb2xfZGVzdHJveSh6cC0+cG9vbCk7Ci0Ja2ZyZWUoenApOwotfQotCi1zdGF0aWMgdm9pZCoKLW1lbXBvb2xfem9uZV9hbGxvY19za2IoZ2ZwX3QgZ2ZwX21hc2ssIHZvaWQgKnBvb2xfZGF0YSkKLXsKLQlzdHJ1Y3QgbWVtcG9vbF96b25lICp6b25lID0gcG9vbF9kYXRhOwotCi0JcmV0dXJuIGFsbG9jX3NrYih6b25lLT5zaXplLCBnZnBfbWFzayk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1tZW1wb29sX3pvbmVfZnJlZV9za2Iodm9pZCAqZWxlbWVudCwgdm9pZCAqcG9vbF9kYXRhKQotewotCWtmcmVlX3NrYihlbGVtZW50KTsKLX0KLQotc3RhdGljIHN0cnVjdCBtZW1wb29sX3pvbmUgKgotbWVtcG9vbF96b25lX2luaXQodW5zaWduZWQgbWF4LCB1bnNpZ25lZCBzaXplLCB1bnNpZ25lZCBoaXdhdCkKLXsKLQlzdHJ1Y3QgbWVtcG9vbF96b25lICp6cDsKLQotCXpwID0ga3phbGxvYyhzaXplb2YoKnpwKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCF6cCkKLQkJcmV0dXJuIE5VTEw7Ci0KLQl6cC0+c2l6ZSA9IHNpemU7Ci0JenAtPmhpd2F0ID0gaGl3YXQ7Ci0JSU5JVF9MSVNUX0hFQUQoJnpwLT5mcmVlcXVldWUpOwotCXNwaW5fbG9ja19pbml0KCZ6cC0+ZnJlZWxvY2spOwotCWF0b21pY19zZXQoJnpwLT5hbGxvY2F0ZWQsIDApOwotCi0JenAtPnBvb2wgPSBtZW1wb29sX2NyZWF0ZShtYXgsIG1lbXBvb2xfem9uZV9hbGxvY19za2IsCi0JCQkJICBtZW1wb29sX3pvbmVfZnJlZV9za2IsIHpwKTsKLQlpZiAoIXpwLT5wb29sKSB7Ci0JCWtmcmVlKHpwKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCi0JcmV0dXJuIHpwOwotfQotCiBzdGF0aWMgdm9pZCBpc2NzaV9jb25uX3JlbGVhc2Uoc3RydWN0IGRldmljZSAqZGV2KQogewogCXN0cnVjdCBpc2NzaV9jbHNfY29ubiAqY29ubiA9IGlzY3NpX2Rldl90b19jb25uKGRldik7CiAJc3RydWN0IGRldmljZSAqcGFyZW50ID0gY29ubi0+ZGV2LnBhcmVudDsKIAotCW1lbXBvb2xfem9uZV9kZXN0cm95KGNvbm4tPnpfcGR1KTsKLQltZW1wb29sX3pvbmVfZGVzdHJveShjb25uLT56X2Vycm9yKTsKLQogCWtmcmVlKGNvbm4pOwogCXB1dF9kZXZpY2UocGFyZW50KTsKIH0KQEAgLTQ3NiwzMSArNDAzLDYgQEAKIAlyZXR1cm4gZGV2LT5yZWxlYXNlID09IGlzY3NpX2Nvbm5fcmVsZWFzZTsKIH0KIAotc3RhdGljIGludCBpc2NzaV9jcmVhdGVfZXZlbnRfcG9vbHMoc3RydWN0IGlzY3NpX2Nsc19jb25uICpjb25uKQotewotCWNvbm4tPnpfcGR1ID0gbWVtcG9vbF96b25lX2luaXQoWl9NQVhfUERVLAotCQkJTkxNU0dfU1BBQ0Uoc2l6ZW9mKHN0cnVjdCBpc2NzaV91ZXZlbnQpICsKLQkJCQkgICAgc2l6ZW9mKHN0cnVjdCBpc2NzaV9oZHIpICsKLQkJCQkgICAgREVGQVVMVF9NQVhfUkVDVl9EQVRBX1NFR01FTlRfTEVOR1RIKSwKLQkJCVpfSElXQVRfUERVKTsKLQlpZiAoIWNvbm4tPnpfcGR1KSB7Ci0JCWRldl9wcmludGsoS0VSTl9FUlIsICZjb25uLT5kZXYsICJpc2NzaTogY2FuIG5vdCBhbGxvY2F0ZSAiCi0JCQkgICAicGR1IHpvbmUgZm9yIG5ldyBjb25uXG4iKTsKLQkJcmV0dXJuIC1FTk9NRU07Ci0JfQotCi0JY29ubi0+el9lcnJvciA9IG1lbXBvb2xfem9uZV9pbml0KFpfTUFYX0VSUk9SLAotCQkJTkxNU0dfU1BBQ0Uoc2l6ZW9mKHN0cnVjdCBpc2NzaV91ZXZlbnQpKSwKLQkJCVpfSElXQVRfRVJST1IpOwotCWlmICghY29ubi0+el9lcnJvcikgewotCQlkZXZfcHJpbnRrKEtFUk5fRVJSLCAmY29ubi0+ZGV2LCAiaXNjc2k6IGNhbiBub3QgYWxsb2NhdGUgIgotCQkJICAgImVycm9yIHpvbmUgZm9yIG5ldyBjb25uXG4iKTsKLQkJbWVtcG9vbF96b25lX2Rlc3Ryb3koY29ubi0+el9wZHUpOwotCQlyZXR1cm4gLUVOT01FTTsKLQl9Ci0JcmV0dXJuIDA7Ci19Ci0KIC8qKgogICogaXNjc2lfY3JlYXRlX2Nvbm4gLSBjcmVhdGUgaXNjc2kgY2xhc3MgY29ubmVjdGlvbgogICogQHNlc3Npb246IGlzY3NpIGNscyBzZXNzaW9uCkBAIC01MzMsMTIgKzQzNSw5IEBACiAJY29ubi0+dHJhbnNwb3J0ID0gdHJhbnNwb3J0OwogCWNvbm4tPmNpZCA9IGNpZDsKIAotCWlmIChpc2NzaV9jcmVhdGVfZXZlbnRfcG9vbHMoY29ubikpCi0JCWdvdG8gZnJlZV9jb25uOwotCiAJLyogdGhpcyBpcyByZWxlYXNlZCBpbiB0aGUgZGV2J3MgcmVsZWFzZSBmdW5jdGlvbiAqLwogCWlmICghZ2V0X2RldmljZSgmc2Vzc2lvbi0+ZGV2KSkKLQkJZ290byBmcmVlX2Nvbm5fcG9vbHM7CisJCWdvdG8gZnJlZV9jb25uOwogCiAJc25wcmludGYoY29ubi0+ZGV2LmJ1c19pZCwgQlVTX0lEX1NJWkUsICJjb25uZWN0aW9uJWQ6JXUiLAogCQkgc2Vzc2lvbi0+c2lkLCBjaWQpOwpAQCAtNTU1LDggKzQ1NCw2IEBACiAKIHJlbGVhc2VfcGFyZW50X3JlZjoKIAlwdXRfZGV2aWNlKCZzZXNzaW9uLT5kZXYpOwotZnJlZV9jb25uX3Bvb2xzOgotCiBmcmVlX2Nvbm46CiAJa2ZyZWUoY29ubik7CiAJcmV0dXJuIE5VTEw7CkBAIC01OTksODEgKzQ5NiwzMSBAQAogCXJldHVybiBOVUxMOwogfQogCi1zdGF0aWMgaW5saW5lIHN0cnVjdCBsaXN0X2hlYWQgKnNrYl90b19saChzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQotewotCXJldHVybiAoc3RydWN0IGxpc3RfaGVhZCAqKSZza2ItPmNiOwotfQotCi1zdGF0aWMgdm9pZAotbWVtcG9vbF96b25lX2NvbXBsZXRlKHN0cnVjdCBtZW1wb29sX3pvbmUgKnpvbmUpCi17Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQlzdHJ1Y3QgbGlzdF9oZWFkICpsaCwgKm47Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmem9uZS0+ZnJlZWxvY2ssIGZsYWdzKTsKLQlsaXN0X2Zvcl9lYWNoX3NhZmUobGgsIG4sICZ6b25lLT5mcmVlcXVldWUpIHsKLQkJc3RydWN0IHNrX2J1ZmYgKnNrYiA9IChzdHJ1Y3Qgc2tfYnVmZiAqKSgoY2hhciAqKWxoIC0KLQkJCQlvZmZzZXRvZihzdHJ1Y3Qgc2tfYnVmZiwgY2IpKTsKLQkJaWYgKCFza2Jfc2hhcmVkKHNrYikpIHsKLQkJCWxpc3RfZGVsKHNrYl90b19saChza2IpKTsKLQkJCW1lbXBvb2xfZnJlZShza2IsIHpvbmUtPnBvb2wpOwotCQkJYXRvbWljX2RlYygmem9uZS0+YWxsb2NhdGVkKTsKLQkJfQotCX0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ6b25lLT5mcmVlbG9jaywgZmxhZ3MpOwotfQotCi1zdGF0aWMgc3RydWN0IHNrX2J1ZmYqCi1tZW1wb29sX3pvbmVfZ2V0X3NrYihzdHJ1Y3QgbWVtcG9vbF96b25lICp6b25lKQotewotCXN0cnVjdCBza19idWZmICpza2I7Ci0KLQlza2IgPSBtZW1wb29sX2FsbG9jKHpvbmUtPnBvb2wsIEdGUF9BVE9NSUMpOwotCWlmIChza2IpCi0JCWF0b21pY19pbmMoJnpvbmUtPmFsbG9jYXRlZCk7Ci0JcmV0dXJuIHNrYjsKLX0KLQogc3RhdGljIGludAotaXNjc2lfYnJvYWRjYXN0X3NrYihzdHJ1Y3QgbWVtcG9vbF96b25lICp6b25lLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBnZnBfdCBnZnApCitpc2NzaV9icm9hZGNhc3Rfc2tiKHN0cnVjdCBza19idWZmICpza2IsIGdmcF90IGdmcCkKIHsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwogCWludCByYzsKIAotCXNrYl9nZXQoc2tiKTsKIAlyYyA9IG5ldGxpbmtfYnJvYWRjYXN0KG5scywgc2tiLCAwLCAxLCBnZnApOwogCWlmIChyYyA8IDApIHsKLQkJbWVtcG9vbF9mcmVlKHNrYiwgem9uZS0+cG9vbCk7CiAJCXByaW50ayhLRVJOX0VSUiAiaXNjc2k6IGNhbiBub3QgYnJvYWRjYXN0IHNrYiAoJWQpXG4iLCByYyk7CiAJCXJldHVybiByYzsKIAl9CiAKLQlzcGluX2xvY2tfaXJxc2F2ZSgmem9uZS0+ZnJlZWxvY2ssIGZsYWdzKTsKLQlJTklUX0xJU1RfSEVBRChza2JfdG9fbGgoc2tiKSk7Ci0JbGlzdF9hZGQoc2tiX3RvX2xoKHNrYiksICZ6b25lLT5mcmVlcXVldWUpOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnpvbmUtPmZyZWVsb2NrLCBmbGFncyk7CiAJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQKLWlzY3NpX3VuaWNhc3Rfc2tiKHN0cnVjdCBtZW1wb29sX3pvbmUgKnpvbmUsIHN0cnVjdCBza19idWZmICpza2IsIGludCBwaWQpCitpc2NzaV91bmljYXN0X3NrYihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBpbnQgcGlkKQogewotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJaW50IHJjOwogCi0Jc2tiX2dldChza2IpOwogCXJjID0gbmV0bGlua191bmljYXN0KG5scywgc2tiLCBwaWQsIE1TR19ET05UV0FJVCk7CiAJaWYgKHJjIDwgMCkgewotCQltZW1wb29sX2ZyZWUoc2tiLCB6b25lLT5wb29sKTsKIAkJcHJpbnRrKEtFUk5fRVJSICJpc2NzaTogY2FuIG5vdCB1bmljYXN0IHNrYiAoJWQpXG4iLCByYyk7CiAJCXJldHVybiByYzsKIAl9CiAKLQlzcGluX2xvY2tfaXJxc2F2ZSgmem9uZS0+ZnJlZWxvY2ssIGZsYWdzKTsKLQlJTklUX0xJU1RfSEVBRChza2JfdG9fbGgoc2tiKSk7Ci0JbGlzdF9hZGQoc2tiX3RvX2xoKHNrYiksICZ6b25lLT5mcmVlcXVldWUpOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnpvbmUtPmZyZWVsb2NrLCBmbGFncyk7Ci0KIAlyZXR1cm4gMDsKIH0KIApAQCAtNjkyLDkgKzUzOSw3IEBACiAJaWYgKCFwcml2KQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCW1lbXBvb2xfem9uZV9jb21wbGV0ZShjb25uLT56X3BkdSk7Ci0KLQlza2IgPSBtZW1wb29sX3pvbmVfZ2V0X3NrYihjb25uLT56X3BkdSk7CisJc2tiID0gYWxsb2Nfc2tiKGxlbiwgR0ZQX0FUT01JQyk7CiAJaWYgKCFza2IpIHsKIAkJaXNjc2lfY29ubl9lcnJvcihjb25uLCBJU0NTSV9FUlJfQ09OTl9GQUlMRUQpOwogCQlkZXZfcHJpbnRrKEtFUk5fRVJSLCAmY29ubi0+ZGV2LCAiaXNjc2k6IGNhbiBub3QgZGVsaXZlciAiCkBAIC03MDcsMTUgKzU1MiwxMyBAQAogCW1lbXNldChldiwgMCwgc2l6ZW9mKCpldikpOwogCWV2LT50cmFuc3BvcnRfaGFuZGxlID0gaXNjc2lfaGFuZGxlKGNvbm4tPnRyYW5zcG9ydCk7CiAJZXYtPnR5cGUgPSBJU0NTSV9LRVZFTlRfUkVDVl9QRFU7Ci0JaWYgKGF0b21pY19yZWFkKCZjb25uLT56X3BkdS0+YWxsb2NhdGVkKSA+PSBjb25uLT56X3BkdS0+aGl3YXQpCi0JCWV2LT5pZmVycm9yID0gLUVOT01FTTsKIAlldi0+ci5yZWN2X3JlcS5jaWQgPSBjb25uLT5jaWQ7CiAJZXYtPnIucmVjdl9yZXEuc2lkID0gaXNjc2lfY29ubl9nZXRfc2lkKGNvbm4pOwogCXBkdSA9IChjaGFyKilldiArIHNpemVvZigqZXYpOwogCW1lbWNweShwZHUsIGhkciwgc2l6ZW9mKHN0cnVjdCBpc2NzaV9oZHIpKTsKIAltZW1jcHkocGR1ICsgc2l6ZW9mKHN0cnVjdCBpc2NzaV9oZHIpLCBkYXRhLCBkYXRhX3NpemUpOwogCi0JcmV0dXJuIGlzY3NpX3VuaWNhc3Rfc2tiKGNvbm4tPnpfcGR1LCBza2IsIHByaXYtPmRhZW1vbl9waWQpOworCXJldHVybiBpc2NzaV91bmljYXN0X3NrYihza2IsIHByaXYtPmRhZW1vbl9waWQpOwogfQogRVhQT1JUX1NZTUJPTF9HUEwoaXNjc2lfcmVjdl9wZHUpOwogCkBAIC03MzEsOSArNTc0LDcgQEAKIAlpZiAoIXByaXYpCiAJCXJldHVybjsKIAotCW1lbXBvb2xfem9uZV9jb21wbGV0ZShjb25uLT56X2Vycm9yKTsKLQotCXNrYiA9IG1lbXBvb2xfem9uZV9nZXRfc2tiKGNvbm4tPnpfZXJyb3IpOworCXNrYiA9IGFsbG9jX3NrYihsZW4sIEdGUF9BVE9NSUMpOwogCWlmICghc2tiKSB7CiAJCWRldl9wcmludGsoS0VSTl9FUlIsICZjb25uLT5kZXYsICJpc2NzaTogZ3JhY2VmdWxseSBpZ25vcmVkICIKIAkJCSAgImNvbm4gZXJyb3IgKCVkKVxuIiwgZXJyb3IpOwpAQCAtNzQ0LDEzICs1ODUsMTEgQEAKIAlldiA9IE5MTVNHX0RBVEEobmxoKTsKIAlldi0+dHJhbnNwb3J0X2hhbmRsZSA9IGlzY3NpX2hhbmRsZShjb25uLT50cmFuc3BvcnQpOwogCWV2LT50eXBlID0gSVNDU0lfS0VWRU5UX0NPTk5fRVJST1I7Ci0JaWYgKGF0b21pY19yZWFkKCZjb25uLT56X2Vycm9yLT5hbGxvY2F0ZWQpID49IGNvbm4tPnpfZXJyb3ItPmhpd2F0KQotCQlldi0+aWZlcnJvciA9IC1FTk9NRU07CiAJZXYtPnIuY29ubmVycm9yLmVycm9yID0gZXJyb3I7CiAJZXYtPnIuY29ubmVycm9yLmNpZCA9IGNvbm4tPmNpZDsKIAlldi0+ci5jb25uZXJyb3Iuc2lkID0gaXNjc2lfY29ubl9nZXRfc2lkKGNvbm4pOwogCi0JaXNjc2lfYnJvYWRjYXN0X3NrYihjb25uLT56X2Vycm9yLCBza2IsIEdGUF9BVE9NSUMpOworCWlzY3NpX2Jyb2FkY2FzdF9za2Ioc2tiLCBHRlBfQVRPTUlDKTsKIAogCWRldl9wcmludGsoS0VSTl9JTkZPLCAmY29ubi0+ZGV2LCAiaXNjc2k6IGRldGVjdGVkIGNvbm4gZXJyb3IgKCVkKVxuIiwKIAkJICAgZXJyb3IpOwpAQCAtNzY3LDkgKzYwNiw3IEBACiAJaW50IGZsYWdzID0gbXVsdGkgPyBOTE1fRl9NVUxUSSA6IDA7CiAJaW50IHQgPSBkb25lID8gTkxNU0dfRE9ORSA6IHR5cGU7CiAKLQltZW1wb29sX3pvbmVfY29tcGxldGUoel9yZXBseSk7Ci0KLQlza2IgPSBtZW1wb29sX3pvbmVfZ2V0X3NrYih6X3JlcGx5KTsKKwlza2IgPSBhbGxvY19za2IobGVuLCBHRlBfQVRPTUlDKTsKIAkvKgogCSAqIEZJWE1FOgogCSAqIHVzZXIgaXMgc3VwcG9zZWQgdG8gcmVhY3Qgb24gaWZlcnJvciA9PSAtRU5PTUVNOwpAQCAtNzgwLDcgKzYxNyw3IEBACiAJbmxoID0gX19ubG1zZ19wdXQoc2tiLCBwaWQsIHNlcSwgdCwgKGxlbiAtIHNpemVvZigqbmxoKSksIDApOwogCW5saC0+bmxtc2dfZmxhZ3MgPSBmbGFnczsKIAltZW1jcHkoTkxNU0dfREFUQShubGgpLCBwYXlsb2FkLCBzaXplKTsKLQlyZXR1cm4gaXNjc2lfdW5pY2FzdF9za2Ioel9yZXBseSwgc2tiLCBwaWQpOworCXJldHVybiBpc2NzaV91bmljYXN0X3NrYihza2IsIHBpZCk7CiB9CiAKIHN0YXRpYyBpbnQKQEAgLTgxMCw5ICs2NDcsNyBAQAogCWRvIHsKIAkJaW50IGFjdHVhbF9zaXplOwogCi0JCW1lbXBvb2xfem9uZV9jb21wbGV0ZShjb25uLT56X3BkdSk7Ci0KLQkJc2tic3RhdCA9IG1lbXBvb2xfem9uZV9nZXRfc2tiKGNvbm4tPnpfcGR1KTsKKwkJc2tic3RhdCA9IGFsbG9jX3NrYihsZW4sIEdGUF9BVE9NSUMpOwogCQlpZiAoIXNrYnN0YXQpIHsKIAkJCWRldl9wcmludGsoS0VSTl9FUlIsICZjb25uLT5kZXYsICJpc2NzaTogY2FuIG5vdCAiCiAJCQkJICAgImRlbGl2ZXIgc3RhdHM6IE9PTVxuIik7CkBAIC04MjUsOCArNjYwLDYgQEAKIAkJbWVtc2V0KGV2c3RhdCwgMCwgc2l6ZW9mKCpldnN0YXQpKTsKIAkJZXZzdGF0LT50cmFuc3BvcnRfaGFuZGxlID0gaXNjc2lfaGFuZGxlKGNvbm4tPnRyYW5zcG9ydCk7CiAJCWV2c3RhdC0+dHlwZSA9IG5saC0+bmxtc2dfdHlwZTsKLQkJaWYgKGF0b21pY19yZWFkKCZjb25uLT56X3BkdS0+YWxsb2NhdGVkKSA+PSBjb25uLT56X3BkdS0+aGl3YXQpCi0JCQlldnN0YXQtPmlmZXJyb3IgPSAtRU5PTUVNOwogCQlldnN0YXQtPnUuZ2V0X3N0YXRzLmNpZCA9CiAJCQlldi0+dS5nZXRfc3RhdHMuY2lkOwogCQlldnN0YXQtPnUuZ2V0X3N0YXRzLnNpZCA9CkBAIC04NDUsNyArNjc4LDcgQEAKIAkJc2tiX3RyaW0oc2tic3RhdCwgTkxNU0dfQUxJR04oYWN0dWFsX3NpemUpKTsKIAkJbmxoc3RhdC0+bmxtc2dfbGVuID0gYWN0dWFsX3NpemU7CiAKLQkJZXJyID0gaXNjc2lfdW5pY2FzdF9za2IoY29ubi0+el9wZHUsIHNrYnN0YXQsIHByaXYtPmRhZW1vbl9waWQpOworCQllcnIgPSBpc2NzaV91bmljYXN0X3NrYihza2JzdGF0LCBwcml2LT5kYWVtb25fcGlkKTsKIAl9IHdoaWxlIChlcnIgPCAwICYmIGVyciAhPSAtRUNPTk5SRUZVU0VEKTsKIAogCXJldHVybiBlcnI7CkBAIC04NzYsOSArNzA5LDcgQEAKIAlzZXNzaW9uID0gaXNjc2lfZGV2X3RvX3Nlc3Npb24oY29ubi0+ZGV2LnBhcmVudCk7CiAJc2hvc3QgPSBpc2NzaV9zZXNzaW9uX3RvX3Nob3N0KHNlc3Npb24pOwogCi0JbWVtcG9vbF96b25lX2NvbXBsZXRlKGNvbm4tPnpfcGR1KTsKLQotCXNrYiA9IG1lbXBvb2xfem9uZV9nZXRfc2tiKGNvbm4tPnpfcGR1KTsKKwlza2IgPSBhbGxvY19za2IobGVuLCBHRlBfS0VSTkVMKTsKIAlpZiAoIXNrYikgewogCQlkZXZfcHJpbnRrKEtFUk5fRVJSLCAmY29ubi0+ZGV2LCAiQ2Fubm90IG5vdGlmeSB1c2Vyc3BhY2Ugb2YgIgogCQkJICAic2Vzc2lvbiBjcmVhdGlvbiBldmVudFxuIik7CkBAIC04OTYsNyArNzI3LDcgQEAKIAkgKiB0aGlzIHdpbGwgb2NjdXIgaWYgdGhlIGRhZW1vbiBpcyBub3QgdXAsIHNvIHdlIGp1c3Qgd2FybgogCSAqIHRoZSB1c2VyIGFuZCB3aGVuIHRoZSBkYWVtb24gaXMgcmVzdGFydGVkIGl0IHdpbGwgaGFuZGxlIGl0CiAJICovCi0JcmMgPSBpc2NzaV9icm9hZGNhc3Rfc2tiKGNvbm4tPnpfcGR1LCBza2IsIEdGUF9LRVJORUwpOworCXJjID0gaXNjc2lfYnJvYWRjYXN0X3NrYihza2IsIEdGUF9LRVJORUwpOwogCWlmIChyYyA8IDApCiAJCWRldl9wcmludGsoS0VSTl9FUlIsICZjb25uLT5kZXYsICJDYW5ub3Qgbm90aWZ5IHVzZXJzcGFjZSBvZiAiCiAJCQkgICJzZXNzaW9uIGRlc3RydWN0aW9uIGV2ZW50LiBDaGVjayBpc2NzaSBkYWVtb25cbiIpOwpAQCAtOTM5LDkgKzc3MCw3IEBACiAJc2Vzc2lvbiA9IGlzY3NpX2Rldl90b19zZXNzaW9uKGNvbm4tPmRldi5wYXJlbnQpOwogCXNob3N0ID0gaXNjc2lfc2Vzc2lvbl90b19zaG9zdChzZXNzaW9uKTsKIAotCW1lbXBvb2xfem9uZV9jb21wbGV0ZShjb25uLT56X3BkdSk7Ci0KLQlza2IgPSBtZW1wb29sX3pvbmVfZ2V0X3NrYihjb25uLT56X3BkdSk7CisJc2tiID0gYWxsb2Nfc2tiKGxlbiwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFza2IpIHsKIAkJZGV2X3ByaW50ayhLRVJOX0VSUiwgJmNvbm4tPmRldiwgIkNhbm5vdCBub3RpZnkgdXNlcnNwYWNlIG9mICIKIAkJCSAgInNlc3Npb24gY3JlYXRpb24gZXZlbnRcbiIpOwpAQCAtOTU5LDcgKzc4OCw3IEBACiAJICogdGhpcyB3aWxsIG9jY3VyIGlmIHRoZSBkYWVtb24gaXMgbm90IHVwLCBzbyB3ZSBqdXN0IHdhcm4KIAkgKiB0aGUgdXNlciBhbmQgd2hlbiB0aGUgZGFlbW9uIGlzIHJlc3RhcnRlZCBpdCB3aWxsIGhhbmRsZSBpdAogCSAqLwotCXJjID0gaXNjc2lfYnJvYWRjYXN0X3NrYihjb25uLT56X3BkdSwgc2tiLCBHRlBfS0VSTkVMKTsKKwlyYyA9IGlzY3NpX2Jyb2FkY2FzdF9za2Ioc2tiLCBHRlBfS0VSTkVMKTsKIAlpZiAocmMgPCAwKQogCQlkZXZfcHJpbnRrKEtFUk5fRVJSLCAmY29ubi0+ZGV2LCAiQ2Fubm90IG5vdGlmeSB1c2Vyc3BhY2Ugb2YgIgogCQkJICAic2Vzc2lvbiBjcmVhdGlvbiBldmVudC4gQ2hlY2sgaXNjc2kgZGFlbW9uXG4iKTsKQEAgLTEyNzgsOSArMTEwNyw2IEBACiAJCQkJZXJyID0gaXNjc2lfaWZfc2VuZF9yZXBseSgKIAkJCQkJTkVUTElOS19DUkVEUyhza2IpLT5waWQsIG5saC0+bmxtc2dfc2VxLAogCQkJCQlubGgtPm5sbXNnX3R5cGUsIDAsIDAsIGV2LCBzaXplb2YoKmV2KSk7Ci0JCQkJaWYgKGF0b21pY19yZWFkKCZ6X3JlcGx5LT5hbGxvY2F0ZWQpID49Ci0JCQkJCQl6X3JlcGx5LT5oaXdhdCkKLQkJCQkJZXYtPmlmZXJyb3IgPSAtRU5PTUVNOwogCQkJfSB3aGlsZSAoZXJyIDwgMCAmJiBlcnIgIT0gLUVDT05OUkVGVVNFRCk7CiAJCQlza2JfcHVsbChza2IsIHJsZW4pOwogCQl9CkBAIC0xNTg0LDMyICsxNDEwLDYgQEAKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKGlzY3NpX3VucmVnaXN0ZXJfdHJhbnNwb3J0KTsKIAotc3RhdGljIGludAotaXNjc2lfcmN2X25sX2V2ZW50KHN0cnVjdCBub3RpZmllcl9ibG9jayAqdGhpcywgdW5zaWduZWQgbG9uZyBldmVudCwgdm9pZCAqcHRyKQotewotCXN0cnVjdCBuZXRsaW5rX25vdGlmeSAqbiA9IHB0cjsKLQotCWlmIChldmVudCA9PSBORVRMSU5LX1VSRUxFQVNFICYmCi0JICAgIG4tPnByb3RvY29sID09IE5FVExJTktfSVNDU0kgJiYgbi0+cGlkKSB7Ci0JCXN0cnVjdCBpc2NzaV9jbHNfY29ubiAqY29ubjsKLQkJdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCQltZW1wb29sX3pvbmVfY29tcGxldGUoel9yZXBseSk7Ci0JCXNwaW5fbG9ja19pcnFzYXZlKCZjb25ubG9jaywgZmxhZ3MpOwotCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGNvbm4sICZjb25ubGlzdCwgY29ubl9saXN0KSB7Ci0JCQltZW1wb29sX3pvbmVfY29tcGxldGUoY29ubi0+el9lcnJvcik7Ci0JCQltZW1wb29sX3pvbmVfY29tcGxldGUoY29ubi0+el9wZHUpOwotCQl9Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNvbm5sb2NrLCBmbGFncyk7Ci0JfQotCi0JcmV0dXJuIE5PVElGWV9ET05FOwotfQotCi1zdGF0aWMgc3RydWN0IG5vdGlmaWVyX2Jsb2NrIGlzY3NpX25sX25vdGlmaWVyID0gewotCS5ub3RpZmllcl9jYWxsCT0gaXNjc2lfcmN2X25sX2V2ZW50LAotfTsKLQogc3RhdGljIF9faW5pdCBpbnQgaXNjc2lfdHJhbnNwb3J0X2luaXQodm9pZCkKIHsKIAlpbnQgZXJyOwpAQCAtMTYzMywyNSArMTQzMywxNSBAQAogCWlmIChlcnIpCiAJCWdvdG8gdW5yZWdpc3Rlcl9jb25uX2NsYXNzOwogCi0JZXJyID0gbmV0bGlua19yZWdpc3Rlcl9ub3RpZmllcigmaXNjc2lfbmxfbm90aWZpZXIpOwotCWlmIChlcnIpCi0JCWdvdG8gdW5yZWdpc3Rlcl9zZXNzaW9uX2NsYXNzOwotCiAJbmxzID0gbmV0bGlua19rZXJuZWxfY3JlYXRlKE5FVExJTktfSVNDU0ksIDEsIGlzY3NpX2lmX3J4LAogCQkJVEhJU19NT0RVTEUpOwogCWlmICghbmxzKSB7CiAJCWVyciA9IC1FTk9CVUZTOwotCQlnb3RvIHVucmVnaXN0ZXJfbm90aWZpZXI7CisJCWdvdG8gdW5yZWdpc3Rlcl9zZXNzaW9uX2NsYXNzOwogCX0KIAotCXpfcmVwbHkgPSBtZW1wb29sX3pvbmVfaW5pdChaX01BWF9SRVBMWSwKLQkJTkxNU0dfU1BBQ0Uoc2l6ZW9mKHN0cnVjdCBpc2NzaV91ZXZlbnQpKSwgWl9ISVdBVF9SRVBMWSk7Ci0JaWYgKHpfcmVwbHkpCi0JCXJldHVybiAwOworCXJldHVybiAwOwogCi0Jc29ja19yZWxlYXNlKG5scy0+c2tfc29ja2V0KTsKLXVucmVnaXN0ZXJfbm90aWZpZXI6Ci0JbmV0bGlua191bnJlZ2lzdGVyX25vdGlmaWVyKCZpc2NzaV9ubF9ub3RpZmllcik7CiB1bnJlZ2lzdGVyX3Nlc3Npb25fY2xhc3M6CiAJdHJhbnNwb3J0X2NsYXNzX3VucmVnaXN0ZXIoJmlzY3NpX3Nlc3Npb25fY2xhc3MpOwogdW5yZWdpc3Rlcl9jb25uX2NsYXNzOgpAQCAtMTY2NSw5ICsxNDU1LDcgQEAKIAogc3RhdGljIHZvaWQgX19leGl0IGlzY3NpX3RyYW5zcG9ydF9leGl0KHZvaWQpCiB7Ci0JbWVtcG9vbF96b25lX2Rlc3Ryb3koel9yZXBseSk7CiAJc29ja19yZWxlYXNlKG5scy0+c2tfc29ja2V0KTsKLQluZXRsaW5rX3VucmVnaXN0ZXJfbm90aWZpZXIoJmlzY3NpX25sX25vdGlmaWVyKTsKIAl0cmFuc3BvcnRfY2xhc3NfdW5yZWdpc3RlcigmaXNjc2lfY29ubmVjdGlvbl9jbGFzcyk7CiAJdHJhbnNwb3J0X2NsYXNzX3VucmVnaXN0ZXIoJmlzY3NpX3Nlc3Npb25fY2xhc3MpOwogCXRyYW5zcG9ydF9jbGFzc191bnJlZ2lzdGVyKCZpc2NzaV9ob3N0X2NsYXNzKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9zZWFnYXRlLmMgYi9kcml2ZXJzL3Njc2kvc2VhZ2F0ZS5jCmluZGV4IDhmZjFmMjguLjVmZmVjMjcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9zZWFnYXRlLmMKKysrIGIvZHJpdmVycy9zY3NpL3NlYWdhdGUuYwpAQCAtOTcsOCArOTcsOCBAQAogI2luY2x1ZGUgPGxpbnV4L2Jsa2Rldi5oPgogI2luY2x1ZGUgPGxpbnV4L3N0YXQuaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CiAKLSNpbmNsdWRlIDxhc20vaW8uaD4KICNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3NnLmMgYi9kcml2ZXJzL3Njc2kvc2cuYwppbmRleCAzZjhiOTMxLi44MWUzYmM3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvc2cuYworKysgYi9kcml2ZXJzL3Njc2kvc2cuYwpAQCAtNjAsNyArNjAsNyBAQAogCiAjaWZkZWYgQ09ORklHX1NDU0lfUFJPQ19GUwogI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KLXN0YXRpYyBjaGFyICpzZ192ZXJzaW9uX2RhdGUgPSAiMjAwNjA5MjAiOworc3RhdGljIGNoYXIgKnNnX3ZlcnNpb25fZGF0ZSA9ICIyMDA2MTAyNyI7CiAKIHN0YXRpYyBpbnQgc2dfcHJvY19pbml0KHZvaWQpOwogc3RhdGljIHZvaWQgc2dfcHJvY19jbGVhbnVwKHZvaWQpOwpAQCAtNzEwLDEyICs3MTAsMTIgQEAKIAkJCSAgKGludCkgY21uZFswXSwgKGludCkgaHAtPmNtZF9sZW4pKTsKIAogCWlmICgoayA9IHNnX3N0YXJ0X3JlcShzcnApKSkgewotCQlTQ1NJX0xPR19USU1FT1VUKDEsIHByaW50aygic2dfd3JpdGU6IHN0YXJ0X3JlcSBlcnI9JWRcbiIsIGspKTsKKwkJU0NTSV9MT0dfVElNRU9VVCgxLCBwcmludGsoInNnX2NvbW1vbl93cml0ZTogc3RhcnRfcmVxIGVycj0lZFxuIiwgaykpOwogCQlzZ19maW5pc2hfcmVtX3JlcShzcnApOwogCQlyZXR1cm4gazsJLyogcHJvYmFibHkgb3V0IG9mIHNwYWNlIC0tPiBFTk9NRU0gKi8KIAl9CiAJaWYgKChrID0gc2dfd3JpdGVfeGZlcihzcnApKSkgewotCQlTQ1NJX0xPR19USU1FT1VUKDEsIHByaW50aygic2dfd3JpdGU6IHdyaXRlX3hmZXIsIGJhZCBhZGRyZXNzXG4iKSk7CisJCVNDU0lfTE9HX1RJTUVPVVQoMSwgcHJpbnRrKCJzZ19jb21tb25fd3JpdGU6IHdyaXRlX3hmZXIsIGJhZCBhZGRyZXNzXG4iKSk7CiAJCXNnX2ZpbmlzaF9yZW1fcmVxKHNycCk7CiAJCXJldHVybiBrOwogCX0KQEAgLTc0Niw3ICs3NDYsNyBAQAogCQkJCWhwLT5keGZlcl9sZW4sIHNycC0+ZGF0YS5rX3VzZV9zZywgdGltZW91dCwKIAkJCQlTR19ERUZBVUxUX1JFVFJJRVMsIHNycCwgc2dfY21kX2RvbmUsCiAJCQkJR0ZQX0FUT01JQykpIHsKLQkJU0NTSV9MT0dfVElNRU9VVCgxLCBwcmludGsoInNnX3dyaXRlOiBzY3NpX2V4ZWN1dGVfYXN5bmMgZmFpbGVkXG4iKSk7CisJCVNDU0lfTE9HX1RJTUVPVVQoMSwgcHJpbnRrKCJzZ19jb21tb25fd3JpdGU6IHNjc2lfZXhlY3V0ZV9hc3luYyBmYWlsZWRcbiIpKTsKIAkJLyoKIAkJICogbW9zdCBsaWtlbHkgb3V0IG9mIG1lbSwgYnV0IGNvdWxkIGFsc28gYmUgYSBiYWQgbWFwCiAJCSAqLwpAQCAtMTI4Myw3ICsxMjgzLDcgQEAKIAkJc2dfZmluaXNoX3JlbV9yZXEoc3JwKTsKIAkJc3JwID0gTlVMTDsKIAkJaWYgKE5VTEwgPT0gc2ZwLT5oZWFkcnApIHsKLQkJCVNDU0lfTE9HX1RJTUVPVVQoMSwgcHJpbnRrKCJzZy4uLmJoOiBhbHJlYWR5IGNsb3NlZCwgZmluYWwgY2xlYW51cFxuIikpOworCQkJU0NTSV9MT0dfVElNRU9VVCgxLCBwcmludGsoInNnX2NtZF9kb25lOiBhbHJlYWR5IGNsb3NlZCwgZmluYWwgY2xlYW51cFxuIikpOwogCQkJaWYgKDAgPT0gc2dfcmVtb3ZlX3NmcChzZHAsIHNmcCkpIHsJLyogZGV2aWNlIHN0aWxsIHByZXNlbnQgKi8KIAkJCQlzY3NpX2RldmljZV9wdXQoc2RwLT5kZXZpY2UpOwogCQkJfQpAQCAtMTUxMiwxMiArMTUxMiwxMiBAQAogCQkJCQkJICAgIFBPTExfSFVQKTsKIAkJCQl9CiAJCQl9Ci0JCQlTQ1NJX0xPR19USU1FT1VUKDMsIHByaW50aygic2dfZGV0YWNoOiBkZXY9JWQsIGRpcnR5XG4iLCBrKSk7CisJCQlTQ1NJX0xPR19USU1FT1VUKDMsIHByaW50aygic2dfcmVtb3ZlOiBkZXY9JWQsIGRpcnR5XG4iLCBrKSk7CiAJCQlpZiAoTlVMTCA9PSBzZHAtPmhlYWRmcCkgewogCQkJCXNnX2Rldl9hcnJba10gPSBOVUxMOwogCQkJfQogCQl9IGVsc2UgewkvKiBub3RoaW5nIGFjdGl2ZSwgc2ltcGxlIGNhc2UgKi8KLQkJCVNDU0lfTE9HX1RJTUVPVVQoMywgcHJpbnRrKCJzZ19kZXRhY2g6IGRldj0lZFxuIiwgaykpOworCQkJU0NTSV9MT0dfVElNRU9VVCgzLCBwcmludGsoInNnX3JlbW92ZTogZGV2PSVkXG4iLCBrKSk7CiAJCQlzZ19kZXZfYXJyW2tdID0gTlVMTDsKIAkJfQogCQlzZ19ucl9kZXYtLTsKQEAgLTE4NzYsMTQgKzE4NzYsMTUgQEAKIAkJCX0KIAkJfQogCQlzZy0+cGFnZSA9IHA7Ci0JCXNnLT5sZW5ndGggPSByZXRfc3o7CisJCXNnLT5sZW5ndGggPSAocmV0X3N6ID4gbnVtKSA/IG51bSA6IHJldF9zejsKIAotCQlTQ1NJX0xPR19USU1FT1VUKDUsIHByaW50aygic2dfYnVpbGRfYnVpbGQ6IGs9JWQsIGE9MHglcCwgbGVuPSVkXG4iLAotCQkJCSAgaywgcCwgcmV0X3N6KSk7CisJCVNDU0lfTE9HX1RJTUVPVVQoNSwgcHJpbnRrKCJzZ19idWlsZF9pbmRpcmVjdDogaz0lZCwgbnVtPSVkLCAiCisJCQkJICJyZXRfc3o9JWRcbiIsIGssIG51bSwgcmV0X3N6KSk7CiAJfQkJLyogZW5kIG9mIGZvciBsb29wICovCiAKIAlzY2hwLT5rX3VzZV9zZyA9IGs7Ci0JU0NTSV9MT0dfVElNRU9VVCg1LCBwcmludGsoInNnX2J1aWxkX2luZGlyZWN0OiBrX3VzZV9zZz0lZCwgcmVtX3N6PSVkXG4iLCBrLCByZW1fc3opKTsKKwlTQ1NJX0xPR19USU1FT1VUKDUsIHByaW50aygic2dfYnVpbGRfaW5kaXJlY3Q6IGtfdXNlX3NnPSVkLCAiCisJCQkgInJlbV9zej0lZFxuIiwgaywgcmVtX3N6KSk7CiAKIAlzY2hwLT5idWZmbGVuID0gYmxrX3NpemU7CiAJaWYgKHJlbV9zeiA+IDApCS8qIG11c3QgaGF2ZSBmYWlsZWQgKi8KQEAgLTIwMTQsNyArMjAxNSw3IEBACiAJCQlmb3IgKGsgPSAwOyAoayA8IHNjaHAtPmtfdXNlX3NnKSAmJiBzZy0+cGFnZTsKIAkJCSAgICAgKytrLCArK3NnKSB7CiAJCQkJU0NTSV9MT0dfVElNRU9VVCg1LCBwcmludGsoCi0JCQkJICAgICJzZ19yZW1vdmVfc2NhdDogaz0lZCwgYT0weCVwLCBsZW49JWRcbiIsCisJCQkJICAgICJzZ19yZW1vdmVfc2NhdDogaz0lZCwgcGc9MHglcCwgbGVuPSVkXG4iLAogCQkJCSAgICBrLCBzZy0+cGFnZSwgc2ctPmxlbmd0aCkpOwogCQkJCXNnX3BhZ2VfZnJlZShzZy0+cGFnZSwgc2ctPmxlbmd0aCk7CiAJCQl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvc3QuYyBiL2RyaXZlcnMvc2NzaS9zdC5jCmluZGV4IGZlYmZhYzkuLjU4NzI3NGQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9zdC5jCisrKyBiL2RyaXZlcnMvc2NzaS9zdC5jCkBAIC0xMTc3LDcgKzExNzcsMTAgQEAKIAkJZ290byBlcnJfb3V0OwogCWlmICgoZmlscC0+Zl9mbGFncyAmIE9fTk9OQkxPQ0spID09IDAgJiYKIAkgICAgcmV0dmFsICE9IENIS1JFU19SRUFEWSkgewotCQlyZXR2YWwgPSAoLUVJTyk7CisJCWlmIChTVHAtPnJlYWR5ID09IE5PX1RBUEUpCisJCQlyZXR2YWwgPSAoLUVOT01FRElVTSk7CisJCWVsc2UKKwkJCXJldHZhbCA9ICgtRUlPKTsKIAkJZ290byBlcnJfb3V0OwogCX0KIAlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9zdW4zX05DUjUzODAuYyBiL2RyaXZlcnMvc2NzaS9zdW4zX05DUjUzODAuYwppbmRleCA1ZWM1YWY4Li4zYjNmMzA1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvc3VuM19OQ1I1MzgwLmMKKysrIGIvZHJpdmVycy9zY3NpL3N1bjNfTkNSNTM4MC5jCkBAIC0yNjYsOCArMjY2LDggQEAKIAkoc3RydWN0IE5DUjUzODBfaG9zdGRhdGEgKikoaW4pLT5ob3N0ZGF0YQogI2RlZmluZQlIT1NUREFUQShpbikgKChzdHJ1Y3QgTkNSNTM4MF9ob3N0ZGF0YSAqKShpbiktPmhvc3RkYXRhKQogCi0jZGVmaW5lCU5FWFQoY21kKQkoKFNjc2lfQ21uZCAqKSgoY21kKS0+aG9zdF9zY3JpYmJsZSkpCi0jZGVmaW5lCU5FWFRBRERSKGNtZCkJKChTY3NpX0NtbmQgKiopJigoY21kKS0+aG9zdF9zY3JpYmJsZSkpCisjZGVmaW5lCU5FWFQoY21kKQkoKHN0cnVjdCBzY3NpX2NtbmQgKikoKGNtZCktPmhvc3Rfc2NyaWJibGUpKQorI2RlZmluZQlORVhUQUREUihjbWQpCSgoc3RydWN0IHNjc2lfY21uZCAqKikmKChjbWQpLT5ob3N0X3NjcmliYmxlKSkKIAogI2RlZmluZQlIT1NUTk8JCWluc3RhbmNlLT5ob3N0X25vCiAjZGVmaW5lCUhfTk8oY21kKQkoY21kKS0+ZGV2aWNlLT5ob3N0LT5ob3N0X25vCkBAIC0zNjAsNyArMzYwLDcgQEAKICAqIGNvbmRpdGlvbnMuCiAgKi8gCiAKLXN0YXRpYyBpbnQgaXNfbHVuX2J1c3koIFNjc2lfQ21uZCAqY21kLCBpbnQgc2hvdWxkX2JlX3RhZ2dlZCApCitzdGF0aWMgaW50IGlzX2x1bl9idXN5KHN0cnVjdCBzY3NpX2NtbmQgKmNtZCwgaW50IHNob3VsZF9iZV90YWdnZWQpCiB7CiAgICAgU0VUVVBfSE9TVERBVEEoY21kLT5kZXZpY2UtPmhvc3QpOwogCkBAIC0zODQsNyArMzg0LDcgQEAKICAqIHVudGFnZ2VkLgogICovCiAKLXN0YXRpYyB2b2lkIGNtZF9nZXRfdGFnKCBTY3NpX0NtbmQgKmNtZCwgaW50IHNob3VsZF9iZV90YWdnZWQgKQorc3RhdGljIHZvaWQgY21kX2dldF90YWcoc3RydWN0IHNjc2lfY21uZCAqY21kLCBpbnQgc2hvdWxkX2JlX3RhZ2dlZCkKIHsKICAgICBTRVRVUF9IT1NUREFUQShjbWQtPmRldmljZS0+aG9zdCk7CiAKQEAgLTQxNiw3ICs0MTYsNyBAQAogICogdW5sb2NrIHRoZSBMVU4uCiAgKi8KIAotc3RhdGljIHZvaWQgY21kX2ZyZWVfdGFnKCBTY3NpX0NtbmQgKmNtZCApCitzdGF0aWMgdm9pZCBjbWRfZnJlZV90YWcoc3RydWN0IHNjc2lfY21uZCAqY21kKQogewogICAgIFNFVFVQX0hPU1REQVRBKGNtZC0+ZGV2aWNlLT5ob3N0KTsKIApAQCAtNDYwLDE4ICs0NjAsMTggQEAKIAogCiAvKgotICogRnVuY3Rpb246IHZvaWQgbWVyZ2VfY29udGlndW91c19idWZmZXJzKCBTY3NpX0NtbmQgKmNtZCApCisgKiBGdW5jdGlvbjogdm9pZCBtZXJnZV9jb250aWd1b3VzX2J1ZmZlcnMoc3RydWN0IHNjc2lfY21uZCAqY21kKQogICoKICAqIFB1cnBvc2U6IFRyeSB0byBtZXJnZSBzZXZlcmFsIHNjYXR0ZXItZ2F0aGVyIHJlcXVlc3RzIGludG8gb25lIERNQQogICogICAgdHJhbnNmZXIuIFRoaXMgaXMgcG9zc2libGUgaWYgdGhlIHNjYXR0ZXIgYnVmZmVycyBsaWUgb24KICAqICAgIHBoeXNpY2FsIGNvbnRpZ3VvdXMgYWRkcmVzc2VzLgogICoKLSAqIFBhcmFtZXRlcnM6IFNjc2lfQ21uZCAqY21kCisgKiBQYXJhbWV0ZXJzOiBzdHJ1Y3Qgc2NzaV9jbW5kICpjbWQKICAqICAgIFRoZSBjb21tYW5kIHRvIHdvcmsgb24uIFRoZSBmaXJzdCBzY2F0dGVyIGJ1ZmZlcidzIGRhdGEgYXJlCiAgKiAgICBhc3N1bWVkIHRvIGJlIGFscmVhZHkgdHJhbnNmZXJlZCBpbnRvIHB0ci90aGlzX3Jlc2lkdWFsLgogICovCiAKLXN0YXRpYyB2b2lkIG1lcmdlX2NvbnRpZ3VvdXNfYnVmZmVycyggU2NzaV9DbW5kICpjbWQgKQorc3RhdGljIHZvaWQgbWVyZ2VfY29udGlndW91c19idWZmZXJzKHN0cnVjdCBzY3NpX2NtbmQgKmNtZCkKIHsKICAgICB1bnNpZ25lZCBsb25nIGVuZGFkZHI7CiAjaWYgKE5ERUJVRyAmIE5ERUJVR19NRVJHSU5HKQpAQCAtNTAxLDE1ICs1MDEsMTUgQEAKIH0KIAogLyoKLSAqIEZ1bmN0aW9uIDogdm9pZCBpbml0aWFsaXplX1NDcChTY3NpX0NtbmQgKmNtZCkKKyAqIEZ1bmN0aW9uIDogdm9pZCBpbml0aWFsaXplX1NDcChzdHJ1Y3Qgc2NzaV9jbW5kICpjbWQpCiAgKgogICogUHVycG9zZSA6IGluaXRpYWxpemUgdGhlIHNhdmVkIGRhdGEgcG9pbnRlcnMgZm9yIGNtZCB0byBwb2ludCB0byB0aGUgCiAgKglzdGFydCBvZiB0aGUgYnVmZmVyLgogICoKLSAqIElucHV0cyA6IGNtZCAtIFNjc2lfQ21uZCBzdHJ1Y3R1cmUgdG8gaGF2ZSBwb2ludGVycyByZXNldC4KKyAqIElucHV0cyA6IGNtZCAtIHN0cnVjdCBzY3NpX2NtbmQgc3RydWN0dXJlIHRvIGhhdmUgcG9pbnRlcnMgcmVzZXQuCiAgKi8KIAotc3RhdGljIF9faW5saW5lX18gdm9pZCBpbml0aWFsaXplX1NDcChTY3NpX0NtbmQgKmNtZCkKK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgaW5pdGlhbGl6ZV9TQ3Aoc3RydWN0IHNjc2lfY21uZCAqY21kKQogewogICAgIC8qIAogICAgICAqIEluaXRpYWxpemUgdGhlIFNjc2kgUG9pbnRlciBmaWVsZCBzbyB0aGF0IGFsbCBvZiB0aGUgY29tbWFuZHMgaW4gdGhlIApAQCAtNzUzLDE0ICs3NTMsMTUgQEAKICAgZG8geyBpZiAocG9zICsgc3RybGVuKGZtdCkgKyAyMCAvKiBzbG9wICovIDwgYnVmZmVyICsgbGVuZ3RoKSBcCiAJIHBvcyArPSBzcHJpbnRmKHBvcywgZm10ICwgIyMgYXJncyk7IH0gd2hpbGUoMCkKIHN0YXRpYwotY2hhciAqbHByaW50X1Njc2lfQ21uZCAoU2NzaV9DbW5kICpjbWQsIGNoYXIgKnBvcywgY2hhciAqYnVmZmVyLCBpbnQgbGVuZ3RoKTsKK2NoYXIgKmxwcmludF9TY3NpX0NtbmQoc3RydWN0IHNjc2lfY21uZCAqY21kLCBjaGFyICpwb3MsIGNoYXIgKmJ1ZmZlciwKKwkJICAgICAgIGludCBsZW5ndGgpOwogCi1zdGF0aWMgaW50IE5DUjUzODBfcHJvY19pbmZvIChzdHJ1Y3QgU2NzaV9Ib3N0ICppbnN0YW5jZSwgY2hhciAqYnVmZmVyLCBjaGFyICoqc3RhcnQsCi0JCSAgICAgICBvZmZfdCBvZmZzZXQsIGludCBsZW5ndGgsIGludCBpbm91dCkKK3N0YXRpYyBpbnQgTkNSNTM4MF9wcm9jX2luZm8oc3RydWN0IFNjc2lfSG9zdCAqaW5zdGFuY2UsIGNoYXIgKmJ1ZmZlciwKKwkJCSAgICAgY2hhciAqKnN0YXJ0LCBvZmZfdCBvZmZzZXQsIGludCBsZW5ndGgsIGludCBpbm91dCkKIHsKICAgICBjaGFyICpwb3MgPSBidWZmZXI7CiAgICAgc3RydWN0IE5DUjUzODBfaG9zdGRhdGEgKmhvc3RkYXRhOwotICAgIFNjc2lfQ21uZCAqcHRyOworICAgIHN0cnVjdCBzY3NpX2NtbmQgKnB0cjsKICAgICB1bnNpZ25lZCBsb25nIGZsYWdzOwogICAgIG9mZl90IGJlZ2luID0gMDsKICNkZWZpbmUgY2hlY2tfb2Zmc2V0KCkJCQkJXApAQCAtNzg0LDE4ICs3ODUsMTkgQEAKICAgICBpZiAoIWhvc3RkYXRhLT5jb25uZWN0ZWQpCiAJU1BSSU5URigic2NzaSVkOiBubyBjdXJyZW50bHkgY29ubmVjdGVkIGNvbW1hbmRcbiIsIEhPU1ROTyk7CiAgICAgZWxzZQotCXBvcyA9IGxwcmludF9TY3NpX0NtbmQgKChTY3NpX0NtbmQgKikgaG9zdGRhdGEtPmNvbm5lY3RlZCwKKwlwb3MgPSBscHJpbnRfU2NzaV9DbW5kICgoc3RydWN0IHNjc2lfY21uZCAqKSBob3N0ZGF0YS0+Y29ubmVjdGVkLAogCQkJCXBvcywgYnVmZmVyLCBsZW5ndGgpOwogICAgIFNQUklOVEYoInNjc2klZDogaXNzdWVfcXVldWVcbiIsIEhPU1ROTyk7CiAgICAgY2hlY2tfb2Zmc2V0KCk7Ci0gICAgZm9yIChwdHIgPSAoU2NzaV9DbW5kICopIGhvc3RkYXRhLT5pc3N1ZV9xdWV1ZTsgcHRyOyBwdHIgPSBORVhUKHB0cikpIHsKKyAgICBmb3IgKHB0ciA9IChzdHJ1Y3Qgc2NzaV9jbW5kICopIGhvc3RkYXRhLT5pc3N1ZV9xdWV1ZTsgcHRyOyBwdHIgPSBORVhUKHB0cikpCisgICAgewogCXBvcyA9IGxwcmludF9TY3NpX0NtbmQgKHB0ciwgcG9zLCBidWZmZXIsIGxlbmd0aCk7CiAJY2hlY2tfb2Zmc2V0KCk7CiAgICAgfQogCiAgICAgU1BSSU5URigic2NzaSVkOiBkaXNjb25uZWN0ZWRfcXVldWVcbiIsIEhPU1ROTyk7CiAgICAgY2hlY2tfb2Zmc2V0KCk7Ci0gICAgZm9yIChwdHIgPSAoU2NzaV9DbW5kICopIGhvc3RkYXRhLT5kaXNjb25uZWN0ZWRfcXVldWU7IHB0cjsKKyAgICBmb3IgKHB0ciA9IChzdHJ1Y3Qgc2NzaV9jbW5kICopIGhvc3RkYXRhLT5kaXNjb25uZWN0ZWRfcXVldWU7IHB0cjsKIAkgcHRyID0gTkVYVChwdHIpKSB7CiAJcG9zID0gbHByaW50X1Njc2lfQ21uZCAocHRyLCBwb3MsIGJ1ZmZlciwgbGVuZ3RoKTsKIAljaGVja19vZmZzZXQoKTsKQEAgLTgxMCw4ICs4MTIsOCBAQAogICAgIHJldHVybiBsZW5ndGg7CiB9CiAKLXN0YXRpYyBjaGFyICoKLWxwcmludF9TY3NpX0NtbmQgKFNjc2lfQ21uZCAqY21kLCBjaGFyICpwb3MsIGNoYXIgKmJ1ZmZlciwgaW50IGxlbmd0aCkKK3N0YXRpYyBjaGFyICpscHJpbnRfU2NzaV9DbW5kKHN0cnVjdCBzY3NpX2NtbmQgKmNtZCwgY2hhciAqcG9zLCBjaGFyICpidWZmZXIsCisJCQkgICAgICBpbnQgbGVuZ3RoKQogewogICAgIGludCBpLCBzOwogICAgIHVuc2lnbmVkIGNoYXIgKmNvbW1hbmQ7CkBAIC04ODgsOCArODkwLDggQEAKIH0KIAogLyogCi0gKiBGdW5jdGlvbiA6IGludCBOQ1I1MzgwX3F1ZXVlX2NvbW1hbmQgKFNjc2lfQ21uZCAqY21kLCAKLSAqCXZvaWQgKCpkb25lKShTY3NpX0NtbmQgKikpIAorICogRnVuY3Rpb24gOiBpbnQgTkNSNTM4MF9xdWV1ZV9jb21tYW5kIChzdHJ1Y3Qgc2NzaV9jbW5kICpjbWQsCisgKgl2b2lkICgqZG9uZSkoc3RydWN0IHNjc2lfY21uZCAqKSkKICAqCiAgKiBQdXJwb3NlIDogIGVucXVldWVzIGEgU0NTSSBjb21tYW5kCiAgKgpAQCAtOTA2LDEwICs5MDgsMTEgQEAKICAqLwogCiAvKiBPbmx5IG1ha2Ugc3RhdGljIGlmIGEgd3JhcHBlciBmdW5jdGlvbiBpcyB1c2VkICovCi1zdGF0aWMgaW50IE5DUjUzODBfcXVldWVfY29tbWFuZCAoU2NzaV9DbW5kICpjbWQsIHZvaWQgKCpkb25lKShTY3NpX0NtbmQgKikpCitzdGF0aWMgaW50IE5DUjUzODBfcXVldWVfY29tbWFuZChzdHJ1Y3Qgc2NzaV9jbW5kICpjbWQsCisJCQkJIHZvaWQgKCpkb25lKShzdHJ1Y3Qgc2NzaV9jbW5kICopKQogewogICAgIFNFVFVQX0hPU1REQVRBKGNtZC0+ZGV2aWNlLT5ob3N0KTsKLSAgICBTY3NpX0NtbmQgKnRtcDsKKyAgICBzdHJ1Y3Qgc2NzaV9jbW5kICp0bXA7CiAgICAgdW5zaWduZWQgbG9uZyBmbGFnczsKIAogI2lmIChOREVCVUcgJiBOREVCVUdfTk9fV1JJVEUpCkBAIC05OTAsNyArOTkzLDcgQEAKIAlORVhUKGNtZCkgPSBob3N0ZGF0YS0+aXNzdWVfcXVldWU7CiAJaG9zdGRhdGEtPmlzc3VlX3F1ZXVlID0gY21kOwogICAgIH0gZWxzZSB7Ci0JZm9yICh0bXAgPSAoU2NzaV9DbW5kICopaG9zdGRhdGEtPmlzc3VlX3F1ZXVlOworCWZvciAodG1wID0gKHN0cnVjdCBzY3NpX2NtbmQgKilob3N0ZGF0YS0+aXNzdWVfcXVldWU7CiAJICAgICBORVhUKHRtcCk7IHRtcCA9IE5FWFQodG1wKSkKIAkgICAgOwogCUxJU1QoY21kLCB0bXApOwpAQCAtMTAzMCw3ICsxMDMzLDcgQEAKICAgICAKIHN0YXRpYyB2b2lkIE5DUjUzODBfbWFpbiAodm9pZCAqYmwpCiB7Ci0gICAgU2NzaV9DbW5kICp0bXAsICpwcmV2OworICAgIHN0cnVjdCBzY3NpX2NtbmQgKnRtcCwgKnByZXY7CiAgICAgc3RydWN0IFNjc2lfSG9zdCAqaW5zdGFuY2UgPSBmaXJzdF9pbnN0YW5jZTsKICAgICBzdHJ1Y3QgTkNSNTM4MF9ob3N0ZGF0YSAqaG9zdGRhdGEgPSBIT1NUREFUQShpbnN0YW5jZSk7CiAgICAgaW50IGRvbmU7CkBAIC0xMDczLDEyICsxMDc2LDEyIEBACiAJICAgICAqIGZvciBhIHRhcmdldCB0aGF0J3Mgbm90IGJ1c3kuCiAJICAgICAqLwogI2lmIChOREVCVUcgJiBOREVCVUdfTElTVFMpCi0JICAgIGZvciAodG1wID0gKFNjc2lfQ21uZCAqKSBob3N0ZGF0YS0+aXNzdWVfcXVldWUsIHByZXYgPSBOVUxMOworCSAgICBmb3IgKHRtcCA9IChzdHJ1Y3Qgc2NzaV9jbW5kICopIGhvc3RkYXRhLT5pc3N1ZV9xdWV1ZSwgcHJldiA9IE5VTEw7CiAJCSB0bXAgJiYgKHRtcCAhPSBwcmV2KTsgcHJldiA9IHRtcCwgdG1wID0gTkVYVCh0bXApKQogCQk7CiAJICAgIGlmICgodG1wID09IHByZXYpICYmIHRtcCkgcHJpbnRrKCIgTE9PUFxuIik7LyogZWxzZSBwcmludGsoIlxuIik7Ki8KICNlbmRpZgotCSAgICBmb3IgKHRtcCA9IChTY3NpX0NtbmQgKikgaG9zdGRhdGEtPmlzc3VlX3F1ZXVlLCAKKwkgICAgZm9yICh0bXAgPSAoc3RydWN0IHNjc2lfY21uZCAqKSBob3N0ZGF0YS0+aXNzdWVfcXVldWUsCiAJCSBwcmV2ID0gTlVMTDsgdG1wOyBwcmV2ID0gdG1wLCB0bXAgPSBORVhUKHRtcCkgKSB7CiAKICNpZiAoTkRFQlVHICYgTkRFQlVHX0xJU1RTKQpAQCAtMTMzOSw3ICsxMzQyLDggQEAKIH0KIAogI2lmZGVmIE5DUjUzODBfU1RBVFMKLXN0YXRpYyB2b2lkIGNvbGxlY3Rfc3RhdHMoc3RydWN0IE5DUjUzODBfaG9zdGRhdGEqIGhvc3RkYXRhLCBTY3NpX0NtbmQqIGNtZCkKK3N0YXRpYyB2b2lkIGNvbGxlY3Rfc3RhdHMoc3RydWN0IE5DUjUzODBfaG9zdGRhdGEgKmhvc3RkYXRhLAorCQkJICBzdHJ1Y3Qgc2NzaV9jbW5kICpjbWQpCiB7CiAjIGlmZGVmIE5DUjUzODBfU1RBVF9MSU1JVAogICAgIGlmIChjbWQtPnJlcXVlc3RfYnVmZmxlbiA+IE5DUjUzODBfU1RBVF9MSU1JVCkKQEAgLTEzNjUsOCArMTM2OSw4IEBACiAjZW5kaWYKIAogLyogCi0gKiBGdW5jdGlvbiA6IGludCBOQ1I1MzgwX3NlbGVjdCAoc3RydWN0IFNjc2lfSG9zdCAqaW5zdGFuY2UsIFNjc2lfQ21uZCAqY21kLCAKLSAqCWludCB0YWcpOworICogRnVuY3Rpb24gOiBpbnQgTkNSNTM4MF9zZWxlY3Qoc3RydWN0IFNjc2lfSG9zdCAqaW5zdGFuY2UsCisgKiAJCQkJIHN0cnVjdCBzY3NpX2NtbmQgKmNtZCwJaW50IHRhZyk7CiAgKgogICogUHVycG9zZSA6IGVzdGFibGlzaGVzIElfVF9MIG9yIElfVF9MX1EgbmV4dXMgZm9yIG5ldyBvciBleGlzdGluZyBjb21tYW5kLAogICoJaW5jbHVkaW5nIEFSQklUUkFUSU9OLCBTRUxFQ1RJT04sIGFuZCBpbml0aWFsIG1lc3NhZ2Ugb3V0IGZvciAKQEAgLTEzOTUsNyArMTM5OSw4IEBACiAgKgkJY21kLT5yZXN1bHQgaG9zdCBieXRlIHNldCB0byBESURfQkFEX1RBUkdFVC4KICAqLwogCi1zdGF0aWMgaW50IE5DUjUzODBfc2VsZWN0IChzdHJ1Y3QgU2NzaV9Ib3N0ICppbnN0YW5jZSwgU2NzaV9DbW5kICpjbWQsIGludCB0YWcpCitzdGF0aWMgaW50IE5DUjUzODBfc2VsZWN0KHN0cnVjdCBTY3NpX0hvc3QgKmluc3RhbmNlLCBzdHJ1Y3Qgc2NzaV9jbW5kICpjbWQsCisJCQkgIGludCB0YWcpCiB7CiAgICAgU0VUVVBfSE9TVERBVEEoaW5zdGFuY2UpOwogICAgIHVuc2lnbmVkIGNoYXIgdG1wWzNdLCBwaGFzZTsKQEAgLTE5ODUsNyArMTk5MCw3IEBACiAjZW5kaWYKICAgICB1bnNpZ25lZCBjaGFyICpkYXRhOwogICAgIHVuc2lnbmVkIGNoYXIgcGhhc2UsIHRtcCwgZXh0ZW5kZWRfbXNnWzEwXSwgb2xkX3BoYXNlPTB4ZmY7Ci0gICAgU2NzaV9DbW5kICpjbWQgPSAoU2NzaV9DbW5kICopIGhvc3RkYXRhLT5jb25uZWN0ZWQ7CisgICAgc3RydWN0IHNjc2lfY21uZCAqY21kID0gKHN0cnVjdCBzY3NpX2NtbmQgKikgaG9zdGRhdGEtPmNvbm5lY3RlZDsKIAogI2lmZGVmIFNVTjNfU0NTSV9WTUUKICAgICBkcmVncy0+Y3NyIHw9IENTUl9JTlRSOwpAQCAtMjI3Miw3ICsyMjc3LDcgQEAKIAkJCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKIAkJCUxJU1QoY21kLGhvc3RkYXRhLT5pc3N1ZV9xdWV1ZSk7CiAJCQlORVhUKGNtZCkgPSBob3N0ZGF0YS0+aXNzdWVfcXVldWU7Ci0JCSAgICAgICAgaG9zdGRhdGEtPmlzc3VlX3F1ZXVlID0gKFNjc2lfQ21uZCAqKSBjbWQ7CisJCSAgICAgICAgaG9zdGRhdGEtPmlzc3VlX3F1ZXVlID0gKHN0cnVjdCBzY3NpX2NtbmQgKikgY21kOwogCQkgICAgICAgIGxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKIAkJCVFVX1BSSU5USygic2NzaSVkOiBSRVFVRVNUIFNFTlNFIGFkZGVkIHRvIGhlYWQgb2YgIgogCQkJCSAgImlzc3VlIHF1ZXVlXG4iLCBIX05PKGNtZCkpOwpAQCAtMjUwMiw3ICsyNTA3LDcgQEAKICAqIEZ1bmN0aW9uIDogdm9pZCBOQ1I1MzgwX3Jlc2VsZWN0IChzdHJ1Y3QgU2NzaV9Ib3N0ICppbnN0YW5jZSkKICAqCiAgKiBQdXJwb3NlIDogZG9lcyByZXNlbGVjdGlvbiwgaW5pdGlhbGl6aW5nIHRoZSBpbnN0YW5jZS0+Y29ubmVjdGVkIAotICoJZmllbGQgdG8gcG9pbnQgdG8gdGhlIFNjc2lfQ21uZCBmb3Igd2hpY2ggdGhlIElfVF9MIG9yIElfVF9MX1EgCisgKglmaWVsZCB0byBwb2ludCB0byB0aGUgc3RydWN0IHNjc2lfY21uZCBmb3Igd2hpY2ggdGhlIElfVF9MIG9yIElfVF9MX1EKICAqCW5leHVzIGhhcyBiZWVuIHJlZXN0YWJsaXNoZWQsCiAgKgkKICAqIElucHV0cyA6IGluc3RhbmNlIC0gdGhpcyBpbnN0YW5jZSBvZiB0aGUgTkNSNTM4MC4KQEAgLTI1MjEsNyArMjUyNiw3IEBACiAgICAgdW5zaWduZWQgY2hhciB0YWc7CiAjZW5kaWYKICAgICB1bnNpZ25lZCBjaGFyIG1zZ1szXTsKLSAgICBTY3NpX0NtbmQgKnRtcCA9IE5VTEwsICpwcmV2OworICAgIHN0cnVjdCBzY3NpX2NtbmQgKnRtcCA9IE5VTEwsICpwcmV2OwogLyogICAgdW5zaWduZWQgbG9uZyBmbGFnczsgKi8KIAogICAgIC8qCkBAIC0yNTc3LDcgKzI1ODIsNyBAQAogICAgICAqIGp1c3QgcmVlc3RhYmxpc2hlZCwgYW5kIHJlbW92ZSBpdCBmcm9tIHRoZSBkaXNjb25uZWN0ZWQgcXVldWUuCiAgICAgICovCiAKLSAgICBmb3IgKHRtcCA9IChTY3NpX0NtbmQgKikgaG9zdGRhdGEtPmRpc2Nvbm5lY3RlZF9xdWV1ZSwgcHJldiA9IE5VTEw7IAorICAgIGZvciAodG1wID0gKHN0cnVjdCBzY3NpX2NtbmQgKikgaG9zdGRhdGEtPmRpc2Nvbm5lY3RlZF9xdWV1ZSwgcHJldiA9IE5VTEw7CiAJIHRtcDsgcHJldiA9IHRtcCwgdG1wID0gTkVYVCh0bXApICkgewogCWlmICgodGFyZ2V0X21hc2sgPT0gKDEgPDwgdG1wLT5kZXZpY2UtPmlkKSkgJiYgKGx1biA9PSB0bXAtPmRldmljZS0+bHVuKQogI2lmZGVmIFNVUFBPUlRfVEFHUwpAQCAtMjY2OCwxMSArMjY3MywxMSBAQAogCiAKIC8qCi0gKiBGdW5jdGlvbiA6IGludCBOQ1I1MzgwX2Fib3J0IChTY3NpX0NtbmQgKmNtZCkKKyAqIEZ1bmN0aW9uIDogaW50IE5DUjUzODBfYWJvcnQoc3RydWN0IHNjc2lfY21uZCAqY21kKQogICoKICAqIFB1cnBvc2UgOiBhYm9ydCBhIGNvbW1hbmQKICAqCi0gKiBJbnB1dHMgOiBjbWQgLSB0aGUgU2NzaV9DbW5kIHRvIGFib3J0LCBjb2RlIC0gY29kZSB0byBzZXQgdGhlIAorICogSW5wdXRzIDogY21kIC0gdGhlIHN0cnVjdCBzY3NpX2NtbmQgdG8gYWJvcnQsIGNvZGUgLSBjb2RlIHRvIHNldCB0aGUKICAqIAlob3N0IGJ5dGUgb2YgdGhlIHJlc3VsdCBmaWVsZCB0bywgaWYgemVybyBESURfQUJPUlRFRCBpcyAKICAqCXVzZWQuCiAgKgpAQCAtMjY4NCwxMSArMjY4OSwxMSBAQAogICogCSBjYWxsZWQgd2hlcmUgdGhlIGxvb3Agc3RhcnRlZCBpbiBOQ1I1MzgwX21haW4oKS4KICAqLwogCi1zdGF0aWMgaW50IE5DUjUzODBfYWJvcnQgKFNjc2lfQ21uZCAqY21kKQorc3RhdGljIGludCBOQ1I1MzgwX2Fib3J0KHN0cnVjdCBzY3NpX2NtbmQgKmNtZCkKIHsKICAgICBzdHJ1Y3QgU2NzaV9Ib3N0ICppbnN0YW5jZSA9IGNtZC0+ZGV2aWNlLT5ob3N0OwogICAgIFNFVFVQX0hPU1REQVRBKGluc3RhbmNlKTsKLSAgICBTY3NpX0NtbmQgKnRtcCwgKipwcmV2OworICAgIHN0cnVjdCBzY3NpX2NtbmQgKnRtcCwgKipwcmV2OwogICAgIHVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKICAgICBwcmludGsoS0VSTl9OT1RJQ0UgInNjc2klZDogYWJvcnRpbmcgY29tbWFuZFxuIiwgSE9TVE5PKTsKQEAgLTI3NTMsOSArMjc1OCw5IEBACiAgKiBDYXNlIDIgOiBJZiB0aGUgY29tbWFuZCBoYXNuJ3QgYmVlbiBpc3N1ZWQgeWV0LCB3ZSBzaW1wbHkgcmVtb3ZlIGl0IAogICogCSAgICBmcm9tIHRoZSBpc3N1ZSBxdWV1ZS4KICAqLwotICAgIGZvciAocHJldiA9IChTY3NpX0NtbmQgKiopICYoaG9zdGRhdGEtPmlzc3VlX3F1ZXVlKSwgCi0JdG1wID0gKFNjc2lfQ21uZCAqKSBob3N0ZGF0YS0+aXNzdWVfcXVldWU7Ci0JdG1wOyBwcmV2ID0gTkVYVEFERFIodG1wKSwgdG1wID0gTkVYVCh0bXApICkKKyAgICBmb3IgKHByZXYgPSAoc3RydWN0IHNjc2lfY21uZCAqKikgJihob3N0ZGF0YS0+aXNzdWVfcXVldWUpLAorCXRtcCA9IChzdHJ1Y3Qgc2NzaV9jbW5kICopIGhvc3RkYXRhLT5pc3N1ZV9xdWV1ZTsKKwl0bXA7IHByZXYgPSBORVhUQUREUih0bXApLCB0bXAgPSBORVhUKHRtcCkpCiAJaWYgKGNtZCA9PSB0bXApIHsKIAkgICAgUkVNT1ZFKDUsICpwcmV2LCB0bXAsIE5FWFQodG1wKSk7CiAJICAgICgqcHJldikgPSBORVhUKHRtcCk7CkBAIC0yODEyLDcgKzI4MTcsNyBAQAogICogaXQgZnJvbSB0aGUgZGlzY29ubmVjdGVkIHF1ZXVlLgogICovCiAKLSAgICBmb3IgKHRtcCA9IChTY3NpX0NtbmQgKikgaG9zdGRhdGEtPmRpc2Nvbm5lY3RlZF9xdWV1ZTsgdG1wOworICAgIGZvciAodG1wID0gKHN0cnVjdCBzY3NpX2NtbmQgKikgaG9zdGRhdGEtPmRpc2Nvbm5lY3RlZF9xdWV1ZTsgdG1wOwogCSB0bXAgPSBORVhUKHRtcCkpIAogICAgICAgICBpZiAoY21kID09IHRtcCkgewogICAgICAgICAgICAgbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwpAQCAtMjgyNiw4ICsyODMxLDggQEAKIAkgICAgZG9fYWJvcnQgKGluc3RhbmNlKTsKIAogCSAgICBsb2NhbF9pcnFfc2F2ZShmbGFncyk7Ci0JICAgIGZvciAocHJldiA9IChTY3NpX0NtbmQgKiopICYoaG9zdGRhdGEtPmRpc2Nvbm5lY3RlZF9xdWV1ZSksIAotCQl0bXAgPSAoU2NzaV9DbW5kICopIGhvc3RkYXRhLT5kaXNjb25uZWN0ZWRfcXVldWU7CisJICAgIGZvciAocHJldiA9IChzdHJ1Y3Qgc2NzaV9jbW5kICoqKSAmKGhvc3RkYXRhLT5kaXNjb25uZWN0ZWRfcXVldWUpLAorCQl0bXAgPSAoc3RydWN0IHNjc2lfY21uZCAqKSBob3N0ZGF0YS0+ZGlzY29ubmVjdGVkX3F1ZXVlOwogCQl0bXA7IHByZXYgPSBORVhUQUREUih0bXApLCB0bXAgPSBORVhUKHRtcCkgKQogCQkgICAgaWYgKGNtZCA9PSB0bXApIHsKIAkJICAgIFJFTU9WRSg1LCAqcHJldiwgdG1wLCBORVhUKHRtcCkpOwpAQCAtMjg2OCw3ICsyODczLDcgQEAKIAogCiAvKiAKLSAqIEZ1bmN0aW9uIDogaW50IE5DUjUzODBfYnVzX3Jlc2V0IChTY3NpX0NtbmQgKmNtZCkKKyAqIEZ1bmN0aW9uIDogaW50IE5DUjUzODBfYnVzX3Jlc2V0KHN0cnVjdCBzY3NpX2NtbmQgKmNtZCkKICAqIAogICogUHVycG9zZSA6IHJlc2V0IHRoZSBTQ1NJIGJ1cy4KICAqCkBAIC0yODc2LDEzICsyODgxLDEzIEBACiAgKgogICovIAogCi1zdGF0aWMgaW50IE5DUjUzODBfYnVzX3Jlc2V0KCBTY3NpX0NtbmQgKmNtZCkKK3N0YXRpYyBpbnQgTkNSNTM4MF9idXNfcmVzZXQoc3RydWN0IHNjc2lfY21uZCAqY21kKQogewogICAgIFNFVFVQX0hPU1REQVRBKGNtZC0+ZGV2aWNlLT5ob3N0KTsKICAgICBpbnQgICAgICAgICAgIGk7CiAgICAgdW5zaWduZWQgbG9uZyBmbGFnczsKICNpZiAxCi0gICAgU2NzaV9DbW5kICpjb25uZWN0ZWQsICpkaXNjb25uZWN0ZWRfcXVldWU7CisgICAgc3RydWN0IHNjc2lfY21uZCAqY29ubmVjdGVkLCAqZGlzY29ubmVjdGVkX3F1ZXVlOwogI2VuZGlmCiAKIApAQCAtMjkxNCw5ICsyOTE5LDkgQEAKICAgICAgKiByZW1lbWJlcmVkIGluIGxvY2FsIHZhcmlhYmxlcyBmaXJzdC4KICAgICAgKi8KICAgICBsb2NhbF9pcnFfc2F2ZShmbGFncyk7Ci0gICAgY29ubmVjdGVkID0gKFNjc2lfQ21uZCAqKWhvc3RkYXRhLT5jb25uZWN0ZWQ7CisgICAgY29ubmVjdGVkID0gKHN0cnVjdCBzY3NpX2NtbmQgKilob3N0ZGF0YS0+Y29ubmVjdGVkOwogICAgIGhvc3RkYXRhLT5jb25uZWN0ZWQgPSBOVUxMOwotICAgIGRpc2Nvbm5lY3RlZF9xdWV1ZSA9IChTY3NpX0NtbmQgKilob3N0ZGF0YS0+ZGlzY29ubmVjdGVkX3F1ZXVlOworICAgIGRpc2Nvbm5lY3RlZF9xdWV1ZSA9IChzdHJ1Y3Qgc2NzaV9jbW5kICopaG9zdGRhdGEtPmRpc2Nvbm5lY3RlZF9xdWV1ZTsKICAgICBob3N0ZGF0YS0+ZGlzY29ubmVjdGVkX3F1ZXVlID0gTlVMTDsKICNpZmRlZiBTVVBQT1JUX1RBR1MKICAgICBmcmVlX2FsbF90YWdzKCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvc3VuM19zY3NpLmMgYi9kcml2ZXJzL3Njc2kvc3VuM19zY3NpLmMKaW5kZXggZTYyNWI0Yy4uZDU2ZDg1ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL3N1bjNfc2NzaS5jCisrKyBiL2RyaXZlcnMvc2NzaS9zdW4zX3Njc2kuYwpAQCAtMTE5LDcgKzExOSw3IEBACiBzdGF0aWMgaW50IHNldHVwX2hvc3RpZCA9IC0xOwogbW9kdWxlX3BhcmFtKHNldHVwX2hvc3RpZCwgaW50LCAwKTsKIAotc3RhdGljIFNjc2lfQ21uZCAqc3VuM19kbWFfc2V0dXBfZG9uZSA9IE5VTEw7CitzdGF0aWMgc3RydWN0IHNjc2lfY21uZCAqc3VuM19kbWFfc2V0dXBfZG9uZSA9IE5VTEw7CiAKICNkZWZpbmUJQUZURVJfUkVTRVRfREVMQVkJKEhaLzIpCiAKQEAgLTUyMSw4ICs1MjEsOSBAQAogCXJldHVybiBsYXN0X3Jlc2lkdWFsOwogfQogCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgc3VuM3Njc2lfZG1hX3hmZXJfbGVuKHVuc2lnbmVkIGxvbmcgd2FudGVkLCBTY3NpX0NtbmQgKmNtZCwKLQkJCQkgICAgaW50IHdyaXRlX2ZsYWcpCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgc3VuM3Njc2lfZG1hX3hmZXJfbGVuKHVuc2lnbmVkIGxvbmcgd2FudGVkLAorCQkJCQkJICBzdHJ1Y3Qgc2NzaV9jbW5kICpjbWQsCisJCQkJCQkgIGludCB3cml0ZV9mbGFnKQogewogCWlmKGJsa19mc19yZXF1ZXN0KGNtZC0+cmVxdWVzdCkpCiAgCQlyZXR1cm4gd2FudGVkOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3N1bjNfc2NzaS5oIGIvZHJpdmVycy9zY3NpL3N1bjNfc2NzaS5oCmluZGV4IDgzNGRhYjQuLmExMTAzYjMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9zdW4zX3Njc2kuaAorKysgYi9kcml2ZXJzL3Njc2kvc3VuM19zY3NpLmgKQEAgLTQ3LDExICs0NywxMiBAQAogCiAjZGVmaW5lIElPQkFTRV9TVU4zX1ZNRVNDU0kgMHhmZjIwMDAwMAogCi1zdGF0aWMgaW50IHN1bjNzY3NpX2Fib3J0IChTY3NpX0NtbmQgKik7CitzdGF0aWMgaW50IHN1bjNzY3NpX2Fib3J0KHN0cnVjdCBzY3NpX2NtbmQgKik7CiBzdGF0aWMgaW50IHN1bjNzY3NpX2RldGVjdCAoc3RydWN0IHNjc2lfaG9zdF90ZW1wbGF0ZSAqKTsKIHN0YXRpYyBjb25zdCBjaGFyICpzdW4zc2NzaV9pbmZvIChzdHJ1Y3QgU2NzaV9Ib3N0ICopOwotc3RhdGljIGludCBzdW4zc2NzaV9idXNfcmVzZXQoU2NzaV9DbW5kICopOwotc3RhdGljIGludCBzdW4zc2NzaV9xdWV1ZV9jb21tYW5kIChTY3NpX0NtbmQgKiwgdm9pZCAoKmRvbmUpKFNjc2lfQ21uZCAqKSk7CitzdGF0aWMgaW50IHN1bjNzY3NpX2J1c19yZXNldChzdHJ1Y3Qgc2NzaV9jbW5kICopOworc3RhdGljIGludCBzdW4zc2NzaV9xdWV1ZV9jb21tYW5kKHN0cnVjdCBzY3NpX2NtbmQgKiwKKwkJCQkgIHZvaWQgKCpkb25lKShzdHJ1Y3Qgc2NzaV9jbW5kICopKTsKIHN0YXRpYyBpbnQgc3VuM3Njc2lfcmVsZWFzZSAoc3RydWN0IFNjc2lfSG9zdCAqKTsKIAogI2lmbmRlZiBDTURfUEVSX0xVTgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3N1bjNfc2NzaV92bWUuYyBiL2RyaXZlcnMvc2NzaS9zdW4zX3Njc2lfdm1lLmMKaW5kZXggZThmYWFiMS4uOTJkZWYzMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL3N1bjNfc2NzaV92bWUuYworKysgYi9kcml2ZXJzL3Njc2kvc3VuM19zY3NpX3ZtZS5jCkBAIC04NCw3ICs4NCw3IEBACiBzdGF0aWMgaW50IHNldHVwX2hvc3RpZCA9IC0xOwogbW9kdWxlX3BhcmFtKHNldHVwX2hvc3RpZCwgaW50LCAwKTsKIAotc3RhdGljIFNjc2lfQ21uZCAqc3VuM19kbWFfc2V0dXBfZG9uZSA9IE5VTEw7CitzdGF0aWMgc3RydWN0IHNjc2lfY21uZCAqc3VuM19kbWFfc2V0dXBfZG9uZSA9IE5VTEw7CiAKICNkZWZpbmUJQUZURVJfUkVTRVRfREVMQVkJKEhaLzIpCiAKQEAgLTQ1NSw4ICs0NTUsOSBAQAogCXJldHVybiBsYXN0X3Jlc2lkdWFsOwogfQogCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgc3VuM3Njc2lfZG1hX3hmZXJfbGVuKHVuc2lnbmVkIGxvbmcgd2FudGVkLCBTY3NpX0NtbmQgKmNtZCwKLQkJCQkgICAgaW50IHdyaXRlX2ZsYWcpCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgc3VuM3Njc2lfZG1hX3hmZXJfbGVuKHVuc2lnbmVkIGxvbmcgd2FudGVkLAorCQkJCQkJICBzdHJ1Y3Qgc2NzaV9jbW5kICpjbWQsCisJCQkJCQkgIGludCB3cml0ZV9mbGFnKQogewogCWlmKGJsa19mc19yZXF1ZXN0KGNtZC0+cmVxdWVzdCkpCiAgCQlyZXR1cm4gd2FudGVkOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3QxMjguYyBiL2RyaXZlcnMvc2NzaS90MTI4LmMKaW5kZXggMmRmNjc0Ny4uMGI3YTcwZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL3QxMjguYworKysgYi9kcml2ZXJzL3Njc2kvdDEyOC5jCkBAIC0xMDksNyArMTA5LDcgQEAKICNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CiAjaW5jbHVkZSA8bGludXgvc2lnbmFsLmg+CiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KLSNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgogI2luY2x1ZGUgPGxpbnV4L2Jsa2Rldi5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgPGxpbnV4L3N0YXQuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS90bXNjc2ltLmMgYi9kcml2ZXJzL3Njc2kvdG1zY3NpbS5jCmluZGV4IGQwM2FhNmMuLmZhNTM4MmUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS90bXNjc2ltLmMKKysrIGIvZHJpdmVycy9zY3NpL3Rtc2NzaW0uYwpAQCAtMjMwNCw2ICsyMzA0LDcgQEAKIAkuc2dfdGFibGVzaXplCQk9IFNHX0FMTCwKIAkuY21kX3Blcl9sdW4JCT0gMSwKIAkudXNlX2NsdXN0ZXJpbmcJCT0gRU5BQkxFX0NMVVNURVJJTkcsCisJLm1heF9zZWN0b3JzCQk9IDB4NDAwMCwgLyogOE1pQiA9IDE2ICogMTAyNCAqIDUxMiAqLwogfTsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvd2Q3MDAwLmMgYi9kcml2ZXJzL3Njc2kvd2Q3MDAwLmMKaW5kZXggMzMxZTFjZi4uMzBiZTc2NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL3dkNzAwMC5jCisrKyBiL2RyaXZlcnMvc2NzaS93ZDcwMDAuYwpAQCAtMTc4LDEwICsxNzgsMTAgQEAKICNpbmNsdWRlIDxsaW51eC9ibGtkZXYuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvc3RhdC5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CiAKICNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CiAjaW5jbHVkZSA8YXNtL2RtYS5oPgotI2luY2x1ZGUgPGFzbS9pby5oPgogCiAjaW5jbHVkZSA8c2NzaS9zY3NpLmg+CiAjaW5jbHVkZSA8c2NzaS9zY3NpX2NtbmQuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2VyaWFsL0tjb25maWcgYi9kcml2ZXJzL3NlcmlhbC9LY29uZmlnCmluZGV4IGIwZDUwMjYuLjBiNzFlN2QgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2VyaWFsL0tjb25maWcKKysrIGIvZHJpdmVycy9zZXJpYWwvS2NvbmZpZwpAQCAtNzY3LDM3ICs3NjcsMzcgQEAKIAlib29sICJTdXBwb3J0IGZvciBTQ0MxIHNlcmlhbCBwb3J0IgogCWRlcGVuZHMgb24gU0VSSUFMX0NQTT15CiAJaGVscAotCSAgU2VsZWN0IHRoZSBpcyBvcHRpb24gdG8gdXNlIFNDQzEgYXMgYSBzZXJpYWwgcG9ydAorCSAgU2VsZWN0IHRoaXMgb3B0aW9uIHRvIHVzZSBTQ0MxIGFzIGEgc2VyaWFsIHBvcnQKIAogY29uZmlnIFNFUklBTF9DUE1fU0NDMgogCWJvb2wgIlN1cHBvcnQgZm9yIFNDQzIgc2VyaWFsIHBvcnQiCiAJZGVwZW5kcyBvbiBTRVJJQUxfQ1BNPXkKIAloZWxwCi0JICBTZWxlY3QgdGhlIGlzIG9wdGlvbiB0byB1c2UgU0NDMiBhcyBhIHNlcmlhbCBwb3J0CisJICBTZWxlY3QgdGhpcyBvcHRpb24gdG8gdXNlIFNDQzIgYXMgYSBzZXJpYWwgcG9ydAogCiBjb25maWcgU0VSSUFMX0NQTV9TQ0MzCiAJYm9vbCAiU3VwcG9ydCBmb3IgU0NDMyBzZXJpYWwgcG9ydCIKIAlkZXBlbmRzIG9uIFNFUklBTF9DUE09eQogCWhlbHAKLQkgIFNlbGVjdCB0aGUgaXMgb3B0aW9uIHRvIHVzZSBTQ0MzIGFzIGEgc2VyaWFsIHBvcnQKKwkgIFNlbGVjdCB0aGlzIG9wdGlvbiB0byB1c2UgU0NDMyBhcyBhIHNlcmlhbCBwb3J0CiAKIGNvbmZpZyBTRVJJQUxfQ1BNX1NDQzQKIAlib29sICJTdXBwb3J0IGZvciBTQ0M0IHNlcmlhbCBwb3J0IgogCWRlcGVuZHMgb24gU0VSSUFMX0NQTT15CiAJaGVscAotCSAgU2VsZWN0IHRoZSBpcyBvcHRpb24gdG8gdXNlIFNDQzQgYXMgYSBzZXJpYWwgcG9ydAorCSAgU2VsZWN0IHRoaXMgb3B0aW9uIHRvIHVzZSBTQ0M0IGFzIGEgc2VyaWFsIHBvcnQKIAogY29uZmlnIFNFUklBTF9DUE1fU01DMQogCWJvb2wgIlN1cHBvcnQgZm9yIFNNQzEgc2VyaWFsIHBvcnQiCiAJZGVwZW5kcyBvbiBTRVJJQUxfQ1BNPXkKIAloZWxwCi0JICBTZWxlY3QgdGhlIGlzIG9wdGlvbiB0byB1c2UgU01DMSBhcyBhIHNlcmlhbCBwb3J0CisJICBTZWxlY3QgdGhpcyBvcHRpb24gdG8gdXNlIFNNQzEgYXMgYSBzZXJpYWwgcG9ydAogCiBjb25maWcgU0VSSUFMX0NQTV9TTUMyCiAJYm9vbCAiU3VwcG9ydCBmb3IgU01DMiBzZXJpYWwgcG9ydCIKIAlkZXBlbmRzIG9uIFNFUklBTF9DUE09eQogCWhlbHAKLQkgIFNlbGVjdCB0aGUgaXMgb3B0aW9uIHRvIHVzZSBTTUMyIGFzIGEgc2VyaWFsIHBvcnQKKwkgIFNlbGVjdCB0aGlzIG9wdGlvbiB0byB1c2UgU01DMiBhcyBhIHNlcmlhbCBwb3J0CiAKIGNvbmZpZyBTRVJJQUxfU0dJX0wxX0NPTlNPTEUKIAlib29sICJTR0kgQWx0aXggTDEgc2VyaWFsIGNvbnNvbGUgc3VwcG9ydCIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2VyaWFsL2NwbV91YXJ0L2NwbV91YXJ0LmggYi9kcml2ZXJzL3NlcmlhbC9jcG1fdWFydC9jcG1fdWFydC5oCmluZGV4IGE4Zjg5NGMuLjY5NzE1ZTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2VyaWFsL2NwbV91YXJ0L2NwbV91YXJ0LmgKKysrIGIvZHJpdmVycy9zZXJpYWwvY3BtX3VhcnQvY3BtX3VhcnQuaApAQCAtODgsNyArODgsNyBAQAogCiAvKiB0aGVzZSBhcmUgbG9jYXRlZCBpbiB0aGVpciByZXNwZWN0aXZlIGZpbGVzICovCiB2b2lkIGNwbV9saW5lX2NyX2NtZChpbnQgbGluZSwgaW50IGNtZCk7Ci1pbnQgY3BtX3VhcnRfaW5pdF9wb3J0ZGVzYyh2b2lkKTsKK2ludCBfX2luaXQgY3BtX3VhcnRfaW5pdF9wb3J0ZGVzYyh2b2lkKTsKIGludCBjcG1fdWFydF9hbGxvY2J1ZihzdHJ1Y3QgdWFydF9jcG1fcG9ydCAqcGluZm8sIHVuc2lnbmVkIGludCBpc19jb24pOwogdm9pZCBjcG1fdWFydF9mcmVlYnVmKHN0cnVjdCB1YXJ0X2NwbV9wb3J0ICpwaW5mbyk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2VyaWFsL2NwbV91YXJ0L2NwbV91YXJ0X2NvcmUuYyBiL2RyaXZlcnMvc2VyaWFsL2NwbV91YXJ0L2NwbV91YXJ0X2NvcmUuYwppbmRleCAwYWJiNTQ0Li43YTNiOTdmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3NlcmlhbC9jcG1fdWFydC9jcG1fdWFydF9jb3JlLmMKKysrIGIvZHJpdmVycy9zZXJpYWwvY3BtX3VhcnQvY3BtX3VhcnRfY29yZS5jCkBAIC0xOTUsMTAgKzE5NSw4IEBACiAJaWYgKGNwbV91YXJ0X3R4X3B1bXAocG9ydCkgIT0gMCkgewogCQlpZiAoSVNfU01DKHBpbmZvKSkgewogCQkJc21jcC0+c21jX3NtY20gfD0gU01DTV9UWDsKLQkJCXNtY3AtPnNtY19zbWNtciB8PSBTTUNNUl9URU47CiAJCX0gZWxzZSB7CiAJCQlzY2NwLT5zY2Nfc2NjbSB8PSBVQVJUX1NDQ01fVFg7Ci0JCQlwaW5mby0+c2NjcC0+c2NjX2dzbXJsIHw9IFNDQ19HU01STF9FTlQ7CiAJCX0KIAl9CiB9CkBAIC00MjEsOSArNDE5LDEwIEBACiAJLyogU3RhcnR1cCByeC1pbnQgKi8KIAlpZiAoSVNfU01DKHBpbmZvKSkgewogCQlwaW5mby0+c21jcC0+c21jX3NtY20gfD0gU01DTV9SWDsKLQkJcGluZm8tPnNtY3AtPnNtY19zbWNtciB8PSBTTUNNUl9SRU47CisJCXBpbmZvLT5zbWNwLT5zbWNfc21jbXIgfD0gKFNNQ01SX1JFTiB8IFNNQ01SX1RFTik7CiAJfSBlbHNlIHsKIAkJcGluZm8tPnNjY3AtPnNjY19zY2NtIHw9IFVBUlRfU0NDTV9SWDsKKwkJcGluZm8tPnNjY3AtPnNjY19nc21ybCB8PSAoU0NDX0dTTVJMX0VOUiB8IFNDQ19HU01STF9FTlQpOwogCX0KIAogCWlmICghKHBpbmZvLT5mbGFncyAmIEZMQUdfQ09OU09MRSkpCkBAIC0xMzUwLDExICsxMzQ5LDEwIEBACiAJCXByX2luZm8oImNwbV91YXJ0OiBXQVJOSU5HOiBubyBVQVJUIGRldmljZXMgZm91bmQgb24gcGxhdGZvcm0gYnVzIVxuIik7CiAJCXByX2luZm8oCiAJCSJjcG1fdWFydDogdGhlIGRyaXZlciB3aWxsIGd1ZXNzIGNvbmZpZ3VyYXRpb24sIGJ1dCB0aGlzIG1vZGUgaXMgbm8gbG9uZ2VyIHN1cHBvcnRlZC5cbiIpOwotI2lmbmRlZiBDT05GSUdfU0VSSUFMX0NQTV9DT05TT0xFCi0JCXJldCA9IGNwbV91YXJ0X2luaXRfcG9ydGRlc2MoKTsKLQkJaWYgKHJldCkKLQkJCXJldHVybiByZXQ7Ci0jZW5kaWYKKworCQkvKiBEb24ndCBydW4gdGhpcyBhZ2FpbiwgaWYgdGhlIGNvbnNvbGUgZHJpdmVyIGRpZCBpdCBhbHJlYWR5ICovCisJCWlmIChjcG1fdWFydF9uciA9PSAwKQorCQkJY3BtX3VhcnRfaW5pdF9wb3J0ZGVzYygpOwogCiAJCWNwbV9yZWcubnIgPSBjcG1fdWFydF9ucjsKIAkJcmV0ID0gdWFydF9yZWdpc3Rlcl9kcml2ZXIoJmNwbV9yZWcpOwpAQCAtMTM2Niw2ICsxMzY0LDggQEAKIAkJCWludCBjb24gPSBjcG1fdWFydF9wb3J0X21hcFtpXTsKIAkJCWNwbV91YXJ0X3BvcnRzW2Nvbl0ucG9ydC5saW5lID0gaTsKIAkJCWNwbV91YXJ0X3BvcnRzW2Nvbl0ucG9ydC5mbGFncyA9IFVQRl9CT09UX0FVVE9DT05GOworCQkJaWYgKGNwbV91YXJ0X3BvcnRzW2Nvbl0uc2V0X2xpbmVpZikKKwkJCQljcG1fdWFydF9wb3J0c1tjb25dLnNldF9saW5laWYoJmNwbV91YXJ0X3BvcnRzW2Nvbl0pOwogCQkJdWFydF9hZGRfb25lX3BvcnQoJmNwbV9yZWcsICZjcG1fdWFydF9wb3J0c1tjb25dLnBvcnQpOwogCQl9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2VyaWFsL2NwbV91YXJ0L2NwbV91YXJ0X2NwbTEuYyBiL2RyaXZlcnMvc2VyaWFsL2NwbV91YXJ0L2NwbV91YXJ0X2NwbTEuYwppbmRleCA5NWFmYzM3Li4wOGU1NWZkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3NlcmlhbC9jcG1fdWFydC9jcG1fdWFydF9jcG0xLmMKKysrIGIvZHJpdmVycy9zZXJpYWwvY3BtX3VhcnQvY3BtX3VhcnRfY3BtMS5jCkBAIC0xODQsNyArMTg0LDcgQEAKIH0KIAogLyogU2V0dXAgYW55IGR5bmFtaWMgcGFyYW1zIGluIHRoZSB1YXJ0IGRlc2MgKi8KLWludCBjcG1fdWFydF9pbml0X3BvcnRkZXNjKHZvaWQpCitpbnQgX19pbml0IGNwbV91YXJ0X2luaXRfcG9ydGRlc2Modm9pZCkKIHsKIAlwcl9kZWJ1ZygiQ1BNIHVhcnRbLV06aW5pdCBwb3J0ZGVzY1xuIik7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2VyaWFsL2lvYzRfc2VyaWFsLmMgYi9kcml2ZXJzL3NlcmlhbC9pb2M0X3NlcmlhbC5jCmluZGV4IDk4Y2U4OGQuLjcxMWJkMTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2VyaWFsL2lvYzRfc2VyaWFsLmMKKysrIGIvZHJpdmVycy9zZXJpYWwvaW9jNF9zZXJpYWwuYwpAQCAtOTIxLDcgKzkyMSw3IEBACiB7CiAJc3RydWN0IGlvYzRfcG9ydCAqcG9ydCA9IChzdHJ1Y3QgaW9jNF9wb3J0ICopYXJnOwogCXN0cnVjdCBob29rcyAqaG9va3MgPSBwb3J0LT5pcF9ob29rczsKLQl1bnNpZ25lZCBpbnQgZmxhZ3M7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZwb3J0LT5pcF9sb2NrLCBmbGFncyk7CiAKQEAgLTE4MzQsNyArMTgzNCw3IEBACiAJc3RydWN0IGlvYzRfcG9ydCAqcG9ydCA9IChzdHJ1Y3QgaW9jNF9wb3J0ICopYXJnOwogCXN0cnVjdCBob29rcyAqaG9va3MgPSBwb3J0LT5pcF9ob29rczsKIAl1bnNpZ25lZCBpbnQgcnhfaGlnaF9yZF9hYm9ydGVkID0gMDsKLQl1bnNpZ25lZCBpbnQgZmxhZ3M7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKIAlzdHJ1Y3QgdWFydF9wb3J0ICp0aGVfcG9ydDsKIAlpbnQgbG9vcF9jb3VudGVyOwogCkBAIC0yOTM1LDcgKzI5MzUsNyBAQAogCXVhcnRfdW5yZWdpc3Rlcl9kcml2ZXIoJmlvYzRfdWFydF9yczQyMik7CiB9CiAKLW1vZHVsZV9pbml0KGlvYzRfc2VyaWFsX2luaXQpOworbGF0ZV9pbml0Y2FsbChpb2M0X3NlcmlhbF9pbml0KTsgLyogQ2FsbCBvbmx5IGFmdGVyIHR0eSBpbml0IGlzIGRvbmUgKi8KIG1vZHVsZV9leGl0KGlvYzRfc2VyaWFsX2V4aXQpOwogCiBNT0RVTEVfQVVUSE9SKCJQYXQgR2VmcmUgLSBTaWxpY29uIEdyYXBoaWNzIEluYy4gKFNHSSkgPHBmZ0BzZ2kuY29tPiIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zZXJpYWwvc2gtc2NpLmMgYi9kcml2ZXJzL3NlcmlhbC9zaC1zY2kuYwppbmRleCAyNjZhYTMyLi5jZmNjM2NhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3NlcmlhbC9zaC1zY2kuYworKysgYi9kcml2ZXJzL3NlcmlhbC9zaC1zY2kuYwpAQCAtODA4LDcgKzgwOCw3IEBACiAJCX0KIAogCQlpZiAocmVxdWVzdF9pcnEocG9ydC0+aXJxc1swXSwgc2NpX21weGVkX2ludGVycnVwdCwKLQkJCQlTQV9JTlRFUlJVUFQsICJzY2kiLCBwb3J0KSkgeworCQkJCUlSUUZfRElTQUJMRUQsICJzY2kiLCBwb3J0KSkgewogCQkJcHJpbnRrKEtFUk5fRVJSICJzY2k6IENhbm5vdCBhbGxvY2F0ZSBpcnEuXG4iKTsKIAkJCXJldHVybiAtRU5PREVWOwogCQl9CkBAIC04MTcsNyArODE3LDcgQEAKIAkJCWlmICghcG9ydC0+aXJxc1tpXSkKIAkJCQljb250aW51ZTsKIAkJCWlmIChyZXF1ZXN0X2lycShwb3J0LT5pcnFzW2ldLCBoYW5kbGVyc1tpXSwKLQkJCQkJU0FfSU5URVJSVVBULCBkZXNjW2ldLCBwb3J0KSkgeworCQkJCQlJUlFGX0RJU0FCTEVELCBkZXNjW2ldLCBwb3J0KSkgewogCQkJCXByaW50ayhLRVJOX0VSUiAic2NpOiBDYW5ub3QgYWxsb2NhdGUgaXJxLlxuIik7CiAJCQkJcmV0dXJuIC1FTk9ERVY7CiAJCQl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3NlcmlhbC9zdW56aWxvZy5jIGIvZHJpdmVycy9zZXJpYWwvc3Vuemlsb2cuYwppbmRleCA3M2RkMmVlLi5iMmNjNzAzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3NlcmlhbC9zdW56aWxvZy5jCisrKyBiL2RyaXZlcnMvc2VyaWFsL3N1bnppbG9nLmMKQEAgLTExODIsNyArMTE4Miw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgY29uc29sZSBzdW56aWxvZ19jb25zb2xlID0geworc3RhdGljIHN0cnVjdCBjb25zb2xlIHN1bnppbG9nX2NvbnNvbGVfb3BzID0gewogCS5uYW1lCT0JInR0eVMiLAogCS53cml0ZQk9CXN1bnppbG9nX2NvbnNvbGVfd3JpdGUsCiAJLmRldmljZQk9CXVhcnRfY29uc29sZV9kZXZpY2UsCkBAIC0xMjA4LDEwICsxMjA4LDEwIEBACiAJaWYgKGkgPT0gTlVNX0NIQU5ORUxTKQogCQlyZXR1cm4gTlVMTDsKIAotCXN1bnppbG9nX2NvbnNvbGUuaW5kZXggPSBpOworCXN1bnppbG9nX2NvbnNvbGVfb3BzLmluZGV4ID0gaTsKIAlzdW56aWxvZ19wb3J0X3RhYmxlW2ldLmZsYWdzIHw9IFNVTlpJTE9HX0ZMQUdfSVNfQ09OUzsKIAotCXJldHVybiAmc3Vuemlsb2dfY29uc29sZTsKKwlyZXR1cm4gJnN1bnppbG9nX2NvbnNvbGVfb3BzOwogfQogCiAjZWxzZQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zbi9LY29uZmlnIGIvZHJpdmVycy9zbi9LY29uZmlnCmluZGV4IGEzNDczMTYuLmM2NmJhOWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc24vS2NvbmZpZworKysgYi9kcml2ZXJzL3NuL0tjb25maWcKQEAgLTUsMTkgKzUsNiBAQAogbWVudSAiU04gRGV2aWNlcyIKIAlkZXBlbmRzIG9uIFNHSV9TTgogCi1jb25maWcgU0dJX0lPQzQKLQl0cmlzdGF0ZSAiU0dJIElPQzQgQmFzZSBJTyBzdXBwb3J0IgotCWRlcGVuZHMgb24gTU1USU1FUgotCWRlZmF1bHQgbQotCS0tLWhlbHAtLS0KLQlUaGlzIG9wdGlvbiBlbmFibGVzIGJhc2ljIHN1cHBvcnQgZm9yIHRoZSBTR0kgSU9DNC1iYXNlZCBCYXNlIElPCi0JY29udHJvbGxlciBjYXJkLiAgVGhpcyBvcHRpb24gZG9lcyBub3QgZW5hYmxlIGFueSBzcGVjaWZpYwotCWZ1bmN0aW9ucyBvbiBzdWNoIGEgY2FyZCwgYnV0IHByb3ZpZGVzIG5lY2Vzc2FyeSBpbmZyYXN0cnVjdHVyZQotCWZvciBvdGhlciBkcml2ZXJzIHRvIHV0aWxpemUuCi0KLQlJZiB5b3UgaGF2ZSBhbiBTR0kgQWx0aXggd2l0aCBhbiBJT0M0LWJhc2VkCi0JSS9PIGNvbnRyb2xsZXIgc2F5IFkuICBPdGhlcndpc2Ugc2F5IE4uCi0KIGNvbmZpZyBTR0lfSU9DMwogCXRyaXN0YXRlICJTR0kgSU9DMyBCYXNlIElPIHN1cHBvcnQiCiAJZGVmYXVsdCBtCmRpZmYgLS1naXQgYS9kcml2ZXJzL3NuL01ha2VmaWxlIGIvZHJpdmVycy9zbi9NYWtlZmlsZQppbmRleCAyY2RhMDExLi42OTNkYjhiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3NuL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvc24vTWFrZWZpbGUKQEAgLTMsNSArMyw0IEBACiAjCiAjCiAKLW9iai0kKENPTkZJR19TR0lfSU9DNCkgKz0gaW9jNC5vCiBvYmotJChDT05GSUdfU0dJX0lPQzMpICs9IGlvYzMubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zcGkvc3BpLmMgYi9kcml2ZXJzL3NwaS9zcGkuYwppbmRleCAxNDYyOThhLi5jM2MwNjI2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3NwaS9zcGkuYworKysgYi9kcml2ZXJzL3NwaS9zcGkuYwpAQCAtMjgxLDcgKzI4MSw2IEBACiAJdXAoJmJvYXJkX2xvY2spOwogCXJldHVybiAwOwogfQotRVhQT1JUX1NZTUJPTF9HUEwoc3BpX3JlZ2lzdGVyX2JvYXJkX2luZm8pOwogCiAvKiBGSVhNRSBzb21lb25lIHNob3VsZCBhZGQgc3VwcG9ydCBmb3IgYSBfX3NldHVwKCJzcGkiLCAuLi4pIHRoYXQKICAqIGNyZWF0ZXMgYm9hcmQgaW5mbyBmcm9tIGtlcm5lbCBjb21tYW5kIGxpbmVzCmRpZmYgLS1naXQgYS9kcml2ZXJzL3RlbGVwaG9ueS9peGouYyBiL2RyaXZlcnMvdGVsZXBob255L2l4ai5jCmluZGV4IGY2YjI5NDguLjFiNjAxYjYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdGVsZXBob255L2l4ai5jCisrKyBiL2RyaXZlcnMvdGVsZXBob255L2l4ai5jCkBAIC0yODQsNiArMjg0LDE0IEBACiAKIG1vZHVsZV9wYXJhbShpeGpkZWJ1ZywgaW50LCAwKTsKIAorc3RhdGljIHN0cnVjdCBwY2lfZGV2aWNlX2lkIGl4al9wY2lfdGJsW10gX19kZXZpbml0ZGF0YSA9IHsKKwl7IFBDSV9WRU5ET1JfSURfUVVJQ0tORVQsIFBDSV9ERVZJQ0VfSURfUVVJQ0tORVRfWEosCisJICBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAwfSwKKwl7IH0KK307CisKK01PRFVMRV9ERVZJQ0VfVEFCTEUocGNpLCBpeGpfcGNpX3RibCk7CisKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoKICogaXhqZGVidWcgbWVhbmluZ3MgYXJlIG5vdyBiaXQgbWFwcGVkIGluc3RlYWQgb2YgbGV2ZWwgYmFzZWQKQEAgLTc2ODMsNyArNzY5MSw4IEBACiAJSVhKICpqID0gTlVMTDsKIAogCWZvciAoaSA9IDA7IGkgPCBJWEpNQVggLSAqY250OyBpKyspIHsKLQkJcGNpID0gcGNpX2ZpbmRfZGV2aWNlKDB4MTVFMiwgMHgwNTAwLCBwY2kpOworCQlwY2kgPSBwY2lfZmluZF9kZXZpY2UoUENJX1ZFTkRPUl9JRF9RVUlDS05FVCwKKwkJCQkgICAgICBQQ0lfREVWSUNFX0lEX1FVSUNLTkVUX1hKLCBwY2kpOwogCQlpZiAoIXBjaSkKIAkJCWJyZWFrOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3RlbGVwaG9ueS9peGouaCBiL2RyaXZlcnMvdGVsZXBob255L2l4ai5oCmluZGV4IGZiZWE0NTQuLjhkNjliY2QgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdGVsZXBob255L2l4ai5oCisrKyBiL2RyaXZlcnMvdGVsZXBob255L2l4ai5oCkBAIC0xMjk1LDcgKzEyOTUsNyBAQAogCVByb2NfSW5mb19UeXBlIEluZm9fd3JpdGU7CiAJdW5zaWduZWQgc2hvcnQgZnJhbWVfY291bnQ7CiAJdW5zaWduZWQgaW50IGZpbHRlcl9oaXN0WzRdOwotCXVuc2lnbmVkIGNoYXIgZmlsdGVyX2VuWzRdOworCXVuc2lnbmVkIGNoYXIgZmlsdGVyX2VuWzZdOwogCXVuc2lnbmVkIHNob3J0IHByb2NfbG9hZDsKIAl1bnNpZ25lZCBsb25nIGZyYW1lc3JlYWQ7CiAJdW5zaWduZWQgbG9uZyBmcmFtZXN3cml0dGVuOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvTWFrZWZpbGUgYi9kcml2ZXJzL3VzYi9NYWtlZmlsZQppbmRleCA5N2Q1N2NmLi44MjViZjg4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9NYWtlZmlsZQorKysgYi9kcml2ZXJzL3VzYi9NYWtlZmlsZQpAQCAtMzMsNyArMzMsNiBAQAogb2JqLSQoQ09ORklHX1VTQl9NT1VTRSkJCSs9IGlucHV0Lwogb2JqLSQoQ09ORklHX1VTQl9NVE9VQ0gpCSs9IGlucHV0Lwogb2JqLSQoQ09ORklHX1VTQl9QT1dFUk1BVEUpCSs9IGlucHV0Lwotb2JqLSQoQ09ORklHX1VTQl9UUkFOQ0VWSUJSQVRPUikrPSBpbnB1dC8KIG9iai0kKENPTkZJR19VU0JfV0FDT00pCQkrPSBpbnB1dC8KIG9iai0kKENPTkZJR19VU0JfWFBBRCkJCSs9IGlucHV0LwogCkBAIC02Niw2ICs2NSw3IEBACiBvYmotJChDT05GSUdfVVNCX1JJTzUwMCkJKz0gbWlzYy8KIG9iai0kKENPTkZJR19VU0JfU0lTVVNCVkdBKQkrPSBtaXNjLwogb2JqLSQoQ09ORklHX1VTQl9URVNUKQkJKz0gbWlzYy8KK29iai0kKENPTkZJR19VU0JfVFJBTkNFVklCUkFUT1IpKz0gbWlzYy8KIG9iai0kKENPTkZJR19VU0JfVVNTNzIwKQkrPSBtaXNjLwogCiBvYmotJChDT05GSUdfVVNCX0FUTSkJCSs9IGF0bS8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2F0bS9jeGFjcnUuYyBiL2RyaXZlcnMvdXNiL2F0bS9jeGFjcnUuYwppbmRleCAzODkyYTllLi5lNjU2NTYzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9hdG0vY3hhY3J1LmMKKysrIGIvZHJpdmVycy91c2IvYXRtL2N4YWNydS5jCkBAIC03OTMsNiArNzkzLDkgQEAKIAl7IC8qIFYgPSBDb25leGFudAkJCVAgPSBBRFNMIG1vZGVtCQkJCSovCiAJCVVTQl9ERVZJQ0UoMHgwNTcyLCAweGNiMDYpLAkuZHJpdmVyX2luZm8gPSAodW5zaWduZWQgbG9uZykgJmN4YWNydV9jYjAwCiAJfSwKKwl7IC8qIFYgPSBDb25leGFudAkJCVAgPSBBRFNMIG1vZGVtIChaVEUgWlhEU0wgODUyKQkJKi8KKwkJVVNCX0RFVklDRSgweDA1NzIsIDB4Y2IwNyksCS5kcml2ZXJfaW5mbyA9ICh1bnNpZ25lZCBsb25nKSAmY3hhY3J1X2NiMDAKKwl9LAogCXsgLyogViA9IE9saXRlYwkJCQlQID0gQURTTCBtb2RlbSB2ZXJzaW9uIDIJCSovCiAJCVVTQl9ERVZJQ0UoMHgwOGUzLCAweDAxMDApLAkuZHJpdmVyX2luZm8gPSAodW5zaWduZWQgbG9uZykgJmN4YWNydV9jYWZlCiAJfSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2F0bS9zcGVlZHRjaC5jIGIvZHJpdmVycy91c2IvYXRtL3NwZWVkdGNoLmMKaW5kZXggN2M3YjUwNy4uYzg3MGM4MCAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvYXRtL3NwZWVkdGNoLmMKKysrIGIvZHJpdmVycy91c2IvYXRtL3NwZWVkdGNoLmMKQEAgLTU1LDcgKzU1LDYgQEAKICNkZWZpbmUgT0ZGU0VUX2QJOQkJLyogc2l6ZSA0ICovCiAjZGVmaW5lIE9GRlNFVF9lCTEzCQkvKiBzaXplIDEgKi8KICNkZWZpbmUgT0ZGU0VUX2YJMTQJCS8qIHNpemUgMSAqLwotI2RlZmluZSBUT1RBTAkJMTUKIAogI2RlZmluZSBTSVpFXzcJCTEKICNkZWZpbmUgU0laRV9iCQk4CkBAIC03OSw2ICs3OCwxOCBAQAogc3RhdGljIGludCBlbmFibGVfaXNvYyA9IERFRkFVTFRfRU5BQkxFX0lTT0M7CiBzdGF0aWMgaW50IHN3X2J1ZmZlcmluZyA9IERFRkFVTFRfU1dfQlVGRkVSSU5HOwogCisjZGVmaW5lIERFRkFVTFRfQl9NQVhfRFNMCTgxMjgKKyNkZWZpbmUgREVGQVVMVF9NT0RFTV9NT0RFCTExCisjZGVmaW5lIE1PREVNX09QVElPTl9MRU5HVEgJMTYKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIERFRkFVTFRfTU9ERU1fT1BUSU9OW01PREVNX09QVElPTl9MRU5HVEhdID0geworCTB4MTAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MjAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAKK307CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgQk1heERTTCA9IERFRkFVTFRfQl9NQVhfRFNMOworc3RhdGljIHVuc2lnbmVkIGNoYXIgTW9kZW1Nb2RlID0gREVGQVVMVF9NT0RFTV9NT0RFOworc3RhdGljIHVuc2lnbmVkIGNoYXIgTW9kZW1PcHRpb25bTU9ERU1fT1BUSU9OX0xFTkdUSF07CitzdGF0aWMgaW50IG51bV9Nb2RlbU9wdGlvbjsKKwogbW9kdWxlX3BhcmFtKGFsdHNldHRpbmcsIHVpbnQsIFNfSVJVR08gfCBTX0lXVVNSKTsKIE1PRFVMRV9QQVJNX0RFU0MoYWx0c2V0dGluZywKIAkJIkFsdGVybmF0aXZlIHNldHRpbmcgZm9yIGRhdGEgaW50ZXJmYWNlIChidWxrX2RlZmF1bHQ6ICIKQEAgLTEwMCw2ICsxMTEsMTcgQEAKIAkJICJFbmFibGUgc29mdHdhcmUgYnVmZmVyaW5nIChkZWZhdWx0OiAiCiAJCSBfX01PRFVMRV9TVFJJTkcoREVGQVVMVF9TV19CVUZGRVJJTkcpICIpIik7CiAKK21vZHVsZV9wYXJhbShCTWF4RFNMLCB1aW50LCBTX0lSVUdPIHwgU19JV1VTUik7CitNT0RVTEVfUEFSTV9ERVNDKEJNYXhEU0wsCisJCSJkZWZhdWx0OiAiIF9fTU9EVUxFX1NUUklORyhERUZBVUxUX0JfTUFYX0RTTCkpOworCittb2R1bGVfcGFyYW0oTW9kZW1Nb2RlLCBieXRlLCBTX0lSVUdPIHwgU19JV1VTUik7CitNT0RVTEVfUEFSTV9ERVNDKE1vZGVtTW9kZSwKKwkJImRlZmF1bHQ6ICIgX19NT0RVTEVfU1RSSU5HKERFRkFVTFRfTU9ERU1fTU9ERSkpOworCittb2R1bGVfcGFyYW1fYXJyYXkoTW9kZW1PcHRpb24sIGJ5dGUsICZudW1fTW9kZW1PcHRpb24sIFNfSVJVR08pOworTU9EVUxFX1BBUk1fREVTQyhNb2RlbU9wdGlvbiwgImRlZmF1bHQ6IDB4MTAsMHgwMCwweDAwLDB4MDAsMHgyMCIpOworCiAjZGVmaW5lIElOVEVSRkFDRV9EQVRBCQkxCiAjZGVmaW5lIEVORFBPSU5UX0lOVAkJMHg4MQogI2RlZmluZSBFTkRQT0lOVF9CVUxLX0RBVEEJMHgwNwpAQCAtMTA4LDEwICsxMzAsMTcgQEAKIAogI2RlZmluZSBoZXgyaW50KGMpICggKGMgPj0gJzAnKSAmJiAoYyA8PSAnOScpID8gKGMgLSAnMCcpIDogKChjICYgMHhmKSArIDkpICkKIAorc3RydWN0IHNwZWVkdGNoX3BhcmFtcyB7CisJdW5zaWduZWQgaW50IGFsdHNldHRpbmc7CisJdW5zaWduZWQgaW50IEJNYXhEU0w7CisJdW5zaWduZWQgY2hhciBNb2RlbU1vZGU7CisJdW5zaWduZWQgY2hhciBNb2RlbU9wdGlvbltNT0RFTV9PUFRJT05fTEVOR1RIXTsKK307CisKIHN0cnVjdCBzcGVlZHRjaF9pbnN0YW5jZV9kYXRhIHsKIAlzdHJ1Y3QgdXNiYXRtX2RhdGEgKnVzYmF0bTsKIAotCXVuc2lnbmVkIGludCBhbHRzZXR0aW5nOworCXN0cnVjdCBzcGVlZHRjaF9wYXJhbXMgcGFyYW1zOyAvKiBzZXQgaW4gcHJvYmUsIGNvbnN0YW50IGFmdGVyd2FyZHMgKi8KIAogCXN0cnVjdCB3b3JrX3N0cnVjdCBzdGF0dXNfY2hlY2tlcjsKIApAQCAtMTIzLDcgKzE1Miw3IEBACiAJc3RydWN0IHVyYiAqaW50X3VyYjsKIAl1bnNpZ25lZCBjaGFyIGludF9kYXRhWzE2XTsKIAotCXVuc2lnbmVkIGNoYXIgc2NyYXRjaF9idWZmZXJbVE9UQUxdOworCXVuc2lnbmVkIGNoYXIgc2NyYXRjaF9idWZmZXJbMTZdOwogfTsKIAogLyoqKioqKioqKioqKioqKgpAQCAtMTg2LDYgKzIxNSwzNCBAQAogCQkJICAgICAgMHgwMSwgMHg0MCwgMHgwNCwgMHgwMCwgYnVmLCAzLCBDVFJMX1RJTUVPVVQpOwogCWlmIChyZXQgPCAwKQogCQl1c2Jfd2Fybih1c2JhdG0sICIlcyBmYWlsZWQgb24gVVJCMTUwOiAlZFxuIiwgX19mdW5jX18sIHJldCk7CisKKwkvKiBFeHRyYSBpbml0aWFsaXNhdGlvbiBpbiByZWNlbnQgZHJpdmVycyAtIGdpdmVzIGhpZ2hlciBzcGVlZHMgKi8KKworCS8qIFVSQmV4dDEgKi8KKwlidWZbMF0gPSBpbnN0YW5jZS0+cGFyYW1zLk1vZGVtTW9kZTsKKwlyZXQgPSB1c2JfY29udHJvbF9tc2codXNiX2RldiwgdXNiX3NuZGN0cmxwaXBlKHVzYl9kZXYsIDApLAorCQkJICAgICAgMHgwMSwgMHg0MCwgMHgxMSwgMHgwMCwgYnVmLCAxLCBDVFJMX1RJTUVPVVQpOworCWlmIChyZXQgPCAwKQorCQl1c2Jfd2Fybih1c2JhdG0sICIlcyBmYWlsZWQgb24gVVJCZXh0MTogJWRcbiIsIF9fZnVuY19fLCByZXQpOworCisJLyogVVJCZXh0MiAqLworCS8qIFRoaXMgc2VlbXMgdG8gYmUgdGhlIG9uZSB3aGljaCBhY3R1YWxseSB0cmlnZ2VycyB0aGUgaGlnaGVyIHN5bmMKKwkgICByYXRlIC0tIGl0IGRvZXMgcmVxdWlyZSB0aGUgbmV3IGZpcm13YXJlIHRvbywgYWx0aG91Z2ggaXQgd29ya3MgT0sKKwkgICB3aXRoIG9sZGVyIGZpcm13YXJlICovCisJcmV0ID0gdXNiX2NvbnRyb2xfbXNnKHVzYl9kZXYsIHVzYl9zbmRjdHJscGlwZSh1c2JfZGV2LCAwKSwKKwkJCSAgICAgIDB4MDEsIDB4NDAsIDB4MTQsIDB4MDAsCisJCQkgICAgICBpbnN0YW5jZS0+cGFyYW1zLk1vZGVtT3B0aW9uLAorCQkJICAgICAgTU9ERU1fT1BUSU9OX0xFTkdUSCwgQ1RSTF9USU1FT1VUKTsKKwlpZiAocmV0IDwgMCkKKwkJdXNiX3dhcm4odXNiYXRtLCAiJXMgZmFpbGVkIG9uIFVSQmV4dDI6ICVkXG4iLCBfX2Z1bmNfXywgcmV0KTsKKworCS8qIFVSQmV4dDMgKi8KKwlidWZbMF0gPSBpbnN0YW5jZS0+cGFyYW1zLkJNYXhEU0wgJiAweGZmOworCWJ1ZlsxXSA9IGluc3RhbmNlLT5wYXJhbXMuQk1heERTTCA+PiA4OworCXJldCA9IHVzYl9jb250cm9sX21zZyh1c2JfZGV2LCB1c2Jfc25kY3RybHBpcGUodXNiX2RldiwgMCksCisJCQkgICAgICAweDAxLCAweDQwLCAweDEyLCAweDAwLCBidWYsIDIsIENUUkxfVElNRU9VVCk7CisJaWYgKHJldCA8IDApCisJCXVzYl93YXJuKHVzYmF0bSwgIiVzIGZhaWxlZCBvbiBVUkJleHQzOiAlZFxuIiwgX19mdW5jX18sIHJldCk7CiB9CiAKIHN0YXRpYyBpbnQgc3BlZWR0Y2hfdXBsb2FkX2Zpcm13YXJlKHN0cnVjdCBzcGVlZHRjaF9pbnN0YW5jZV9kYXRhICppbnN0YW5jZSwKQEAgLTI4NSw4ICszNDIsOCBAQAogCSAgIGJlY2F1c2Ugd2UncmUgaW4gb3VyIG93biBrZXJuZWwgdGhyZWFkIGFueXdheS4gKi8KIAltc2xlZXBfaW50ZXJydXB0aWJsZSgxMDAwKTsKIAotCWlmICgocmV0ID0gdXNiX3NldF9pbnRlcmZhY2UodXNiX2RldiwgSU5URVJGQUNFX0RBVEEsIGluc3RhbmNlLT5hbHRzZXR0aW5nKSkgPCAwKSB7Ci0JCXVzYl9lcnIodXNiYXRtLCAiJXM6IHNldHRpbmcgaW50ZXJmYWNlIHRvICVkIGZhaWxlZCAoJWQpIVxuIiwgX19mdW5jX18sIGluc3RhbmNlLT5hbHRzZXR0aW5nLCByZXQpOworCWlmICgocmV0ID0gdXNiX3NldF9pbnRlcmZhY2UodXNiX2RldiwgSU5URVJGQUNFX0RBVEEsIGluc3RhbmNlLT5wYXJhbXMuYWx0c2V0dGluZykpIDwgMCkgeworCQl1c2JfZXJyKHVzYmF0bSwgIiVzOiBzZXR0aW5nIGludGVyZmFjZSB0byAlZCBmYWlsZWQgKCVkKSFcbiIsIF9fZnVuY19fLCBpbnN0YW5jZS0+cGFyYW1zLmFsdHNldHRpbmcsIHJldCk7CiAJCWdvdG8gb3V0X2ZyZWU7CiAJfQogCkBAIC0zNzIsNyArNDI5LDcgQEAKIAl1bnNpZ25lZCBjaGFyICpidWYgPSBpbnN0YW5jZS0+c2NyYXRjaF9idWZmZXI7CiAJaW50IHJldDsKIAotCW1lbXNldChidWYsIDAsIFRPVEFMKTsKKwltZW1zZXQoYnVmLCAwLCAxNik7CiAKIAlyZXQgPSB1c2JfY29udHJvbF9tc2codXNiX2RldiwgdXNiX3JjdmN0cmxwaXBlKHVzYl9kZXYsIDApLAogCQkJICAgICAgMHgxMiwgMHhjMCwgMHgwNywgMHgwMCwgYnVmICsgT0ZGU0VUXzcsIFNJWkVfNywKQEAgLTc0NiwxNyArODAzLDIxIEBACiAKIAlpbnN0YW5jZS0+dXNiYXRtID0gdXNiYXRtOwogCi0JLyogYWx0c2V0dGluZyBhbmQgZW5hYmxlX2lzb2MgbWF5IGNoYW5nZSBhdCBhbnkgbW9tZW50LCBzbyB0YWtlIGEgc25hcHNob3QgKi8KLQlpbnN0YW5jZS0+YWx0c2V0dGluZyA9IGFsdHNldHRpbmc7CisJLyogbW9kdWxlIHBhcmFtZXRlcnMgbWF5IGNoYW5nZSBhdCBhbnkgbW9tZW50LCBzbyB0YWtlIGEgc25hcHNob3QgKi8KKwlpbnN0YW5jZS0+cGFyYW1zLmFsdHNldHRpbmcgPSBhbHRzZXR0aW5nOworCWluc3RhbmNlLT5wYXJhbXMuQk1heERTTCA9IEJNYXhEU0w7CisJaW5zdGFuY2UtPnBhcmFtcy5Nb2RlbU1vZGUgPSBNb2RlbU1vZGU7CisJbWVtY3B5KGluc3RhbmNlLT5wYXJhbXMuTW9kZW1PcHRpb24sIERFRkFVTFRfTU9ERU1fT1BUSU9OLCBNT0RFTV9PUFRJT05fTEVOR1RIKTsKKwltZW1jcHkoaW5zdGFuY2UtPnBhcmFtcy5Nb2RlbU9wdGlvbiwgTW9kZW1PcHRpb24sIG51bV9Nb2RlbU9wdGlvbik7CiAJdXNlX2lzb2MgPSBlbmFibGVfaXNvYzsKIAotCWlmIChpbnN0YW5jZS0+YWx0c2V0dGluZykKLQkJaWYgKChyZXQgPSB1c2Jfc2V0X2ludGVyZmFjZSh1c2JfZGV2LCBJTlRFUkZBQ0VfREFUQSwgaW5zdGFuY2UtPmFsdHNldHRpbmcpKSA8IDApIHsKLQkJCXVzYl9lcnIodXNiYXRtLCAiJXM6IHNldHRpbmcgaW50ZXJmYWNlIHRvICUyZCBmYWlsZWQgKCVkKSFcbiIsIF9fZnVuY19fLCBpbnN0YW5jZS0+YWx0c2V0dGluZywgcmV0KTsKLQkJCWluc3RhbmNlLT5hbHRzZXR0aW5nID0gMDsgLyogZmFsbCBiYWNrIHRvIGRlZmF1bHQgKi8KKwlpZiAoaW5zdGFuY2UtPnBhcmFtcy5hbHRzZXR0aW5nKQorCQlpZiAoKHJldCA9IHVzYl9zZXRfaW50ZXJmYWNlKHVzYl9kZXYsIElOVEVSRkFDRV9EQVRBLCBpbnN0YW5jZS0+cGFyYW1zLmFsdHNldHRpbmcpKSA8IDApIHsKKwkJCXVzYl9lcnIodXNiYXRtLCAiJXM6IHNldHRpbmcgaW50ZXJmYWNlIHRvICUyZCBmYWlsZWQgKCVkKSFcbiIsIF9fZnVuY19fLCBpbnN0YW5jZS0+cGFyYW1zLmFsdHNldHRpbmcsIHJldCk7CisJCQlpbnN0YW5jZS0+cGFyYW1zLmFsdHNldHRpbmcgPSAwOyAvKiBmYWxsIGJhY2sgdG8gZGVmYXVsdCAqLwogCQl9CiAKLQlpZiAoIWluc3RhbmNlLT5hbHRzZXR0aW5nICYmIHVzZV9pc29jKQorCWlmICghaW5zdGFuY2UtPnBhcmFtcy5hbHRzZXR0aW5nICYmIHVzZV9pc29jKQogCQlpZiAoKHJldCA9IHVzYl9zZXRfaW50ZXJmYWNlKHVzYl9kZXYsIElOVEVSRkFDRV9EQVRBLCBERUZBVUxUX0lTT0NfQUxUU0VUVElORykpIDwgMCkgewogCQkJdXNiX2RiZyh1c2JhdG0sICIlczogc2V0dGluZyBpbnRlcmZhY2UgdG8gJTJkIGZhaWxlZCAoJWQpIVxuIiwgX19mdW5jX18sIERFRkFVTFRfSVNPQ19BTFRTRVRUSU5HLCByZXQpOwogCQkJdXNlX2lzb2MgPSAwOyAvKiBmYWxsIGJhY2sgdG8gYnVsayAqLwpAQCAtNzgzLDE0ICs4NDQsMTQgQEAKIAkJCXVzYl9pbmZvKHVzYmF0bSwgImlzb2Nocm9ub3VzIHRyYW5zZmVyIG5vdCBzdXBwb3J0ZWQgLSB1c2luZyBidWxrXG4iKTsKIAl9CiAKLQlpZiAoIXVzZV9pc29jICYmICFpbnN0YW5jZS0+YWx0c2V0dGluZykKKwlpZiAoIXVzZV9pc29jICYmICFpbnN0YW5jZS0+cGFyYW1zLmFsdHNldHRpbmcpCiAJCWlmICgocmV0ID0gdXNiX3NldF9pbnRlcmZhY2UodXNiX2RldiwgSU5URVJGQUNFX0RBVEEsIERFRkFVTFRfQlVMS19BTFRTRVRUSU5HKSkgPCAwKSB7CiAJCQl1c2JfZXJyKHVzYmF0bSwgIiVzOiBzZXR0aW5nIGludGVyZmFjZSB0byAlMmQgZmFpbGVkICglZCkhXG4iLCBfX2Z1bmNfXywgREVGQVVMVF9CVUxLX0FMVFNFVFRJTkcsIHJldCk7CiAJCQlnb3RvIGZhaWxfZnJlZTsKIAkJfQogCi0JaWYgKCFpbnN0YW5jZS0+YWx0c2V0dGluZykKLQkJaW5zdGFuY2UtPmFsdHNldHRpbmcgPSB1c2VfaXNvYyA/IERFRkFVTFRfSVNPQ19BTFRTRVRUSU5HIDogREVGQVVMVF9CVUxLX0FMVFNFVFRJTkc7CisJaWYgKCFpbnN0YW5jZS0+cGFyYW1zLmFsdHNldHRpbmcpCisJCWluc3RhbmNlLT5wYXJhbXMuYWx0c2V0dGluZyA9IHVzZV9pc29jID8gREVGQVVMVF9JU09DX0FMVFNFVFRJTkcgOiBERUZBVUxUX0JVTEtfQUxUU0VUVElORzsKIAogCXVzYmF0bS0+ZmxhZ3MgfD0gKHVzZV9pc29jID8gVURTTF9VU0VfSVNPQyA6IDApOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9hdG0vdWVhZ2xlLWF0bS5jIGIvZHJpdmVycy91c2IvYXRtL3VlYWdsZS1hdG0uYwppbmRleCBmNTQzNGIxLi5mNmI5ZjdlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9hdG0vdWVhZ2xlLWF0bS5jCisrKyBiL2RyaXZlcnMvdXNiL2F0bS91ZWFnbGUtYXRtLmMKQEAgLTY4LDcgKzY4LDcgQEAKIAogI2luY2x1ZGUgInVzYmF0bS5oIgogCi0jZGVmaW5lIEVBR0xFVVNCVkVSU0lPTiAidWVhZ2xlIDEuMyIKKyNkZWZpbmUgRUFHTEVVU0JWRVJTSU9OICJ1ZWFnbGUgMS40IgogCiAKIC8qCkBAIC04MCwxNCArODAsMTQgQEAKIAkJCWRldl9kYmcoJih1c2JfZGV2KS0+ZGV2LCBcCiAJCQkJIlt1ZWFnbGUtYXRtIGRiZ10gJXM6ICIgZm9ybWF0LCBcCiAJCQkJCV9fRlVOQ1RJT05fXywgIyNhcmdzKTsgXAotICAgICAgIH0gd2hpbGUgKDApCisJfSB3aGlsZSAoMCkKIAogI2RlZmluZSB1ZWFfdmRiZyh1c2JfZGV2LCBmb3JtYXQsIGFyZ3MuLi4pCVwKIAlkbyB7IFwKIAkJaWYgKGRlYnVnID49IDIpIFwKIAkJCWRldl9kYmcoJih1c2JfZGV2KS0+ZGV2LCBcCiAJCQkJIlt1ZWFnbGUtYXRtIHZkYmddICAiIGZvcm1hdCwgIyNhcmdzKTsgXAotICAgICAgIH0gd2hpbGUgKDApCisJfSB3aGlsZSAoMCkKIAogI2RlZmluZSB1ZWFfZW50ZXJzKHVzYl9kZXYpIFwKIAl1ZWFfdmRiZyh1c2JfZGV2LCAiZW50ZXJpbmcgJXNcbiIsIF9fRlVOQ1RJT05fXykKQEAgLTIxOCw4ICsyMTgsOCBAQAogI2RlZmluZSBVRUFfQ0hJUF9WRVJTSU9OKHgpIFwKIAkoKHgpLT5kcml2ZXJfaW5mbyAmIDB4ZikKIAotI2RlZmluZSBJU19JU0ROKHNjKSBcCi0JKGxlMTZfdG9fY3B1KHNjLT51c2JfZGV2LT5kZXNjcmlwdG9yLmJjZERldmljZSkgJiAweDgwKQorI2RlZmluZSBJU19JU0ROKHVzYl9kZXYpIFwKKwkobGUxNl90b19jcHUoKHVzYl9kZXYpLT5kZXNjcmlwdG9yLmJjZERldmljZSkgJiAweDgwKQogCiAjZGVmaW5lIElOU19UT19VU0JERVYoaW5zKSBpbnMtPnVzYl9kZXYKIApAQCAtNjI1LDEyICs2MjUsMTIgQEAKIAljaGFyICpkc3BfbmFtZTsKIAogCWlmIChVRUFfQ0hJUF9WRVJTSU9OKHNjKSA9PSBBREk5MzApIHsKLQkJaWYgKElTX0lTRE4oc2MpKQorCQlpZiAoSVNfSVNETihzYy0+dXNiX2RldikpCiAJCQlkc3BfbmFtZSA9IEZXX0RJUiAiRFNQOWkuYmluIjsKIAkJZWxzZQogCQkJZHNwX25hbWUgPSBGV19ESVIgIkRTUDlwLmJpbiI7CiAJfSBlbHNlIHsKLQkJaWYgKElTX0lTRE4oc2MpKQorCQlpZiAoSVNfSVNETihzYy0+dXNiX2RldikpCiAJCQlkc3BfbmFtZSA9IEZXX0RJUiAiRFNQZWkuYmluIjsKIAkJZWxzZQogCQkJZHNwX25hbWUgPSBGV19ESVIgIkRTUGVwLmJpbiI7CkBAIC03NDQsNyArNzQ0LDcgQEAKIAogc3RhdGljIGlubGluZSBpbnQgd2FpdF9jbXZfYWNrKHN0cnVjdCB1ZWFfc29mdGMgKnNjKQogewotCWludCByZXQgPSB3YWl0X2V2ZW50X3RpbWVvdXQoc2MtPmNtdl9hY2tfd2FpdCwKKwlpbnQgcmV0ID0gd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlX3RpbWVvdXQoc2MtPmNtdl9hY2tfd2FpdCwKIAkJCQkJCSAgIHNjLT5jbXZfYWNrLCBBQ0tfVElNRU9VVCk7CiAJc2MtPmNtdl9hY2sgPSAwOwogCkBAIC04ODUsNyArODg1LDggQEAKIAkJYnJlYWs7CiAKIAljYXNlIDM6CQkvKiBmYWlsIC4uLiAqLwotCQl1ZWFfaW5mbyhJTlNfVE9fVVNCREVWKHNjKSwgIm1vZGVtIHN5bmNocm9uaXphdGlvbiBmYWlsZWRcbiIpOworCQl1ZWFfaW5mbyhJTlNfVE9fVVNCREVWKHNjKSwgIm1vZGVtIHN5bmNocm9uaXphdGlvbiBmYWlsZWQiCisJCQkJIiAobWF5IGJlIHRyeSBvdGhlciBjbXYvZHNwKVxuIik7CiAJCXJldHVybiAtRUFHQUlOOwogCiAJY2FzZSA0IC4uLiA2OgkvKiB0ZXN0IHN0YXRlICovCkBAIC05MTMsMTIgKzkxNCw2IEBACiAJCQlyZWxlYXNlX2Zpcm13YXJlKHNjLT5kc3BfZmlybSk7CiAJCQlzYy0+ZHNwX2Zpcm0gPSBOVUxMOwogCQl9Ci0KLQkJcmV0ID0gdWVhX3JlYWRfY212KHNjLCBTQV9JTkZPLCAxMCwgJnNjLT5zdGF0cy5waHkuZmlybWlkKTsKLQkJaWYgKHJldCA8IDApCi0JCQlyZXR1cm4gcmV0OwotCQl1ZWFfaW5mbyhJTlNfVE9fVVNCREVWKHNjKSwgIkFUVS1SIGZpcm13YXJlIHZlcnNpb24gOiAleFxuIiwKLQkJCQlzYy0+c3RhdHMucGh5LmZpcm1pZCk7CiAJfQogCiAJLyogYWx3YXlzIHVwZGF0ZSBpdCBhcyBhdG0gbGF5ZXIgY291bGQgbm90IGJlIGluaXQgd2hlbiB3ZSBzd2l0Y2ggdG8KQEAgLTEwMzMsOSArMTAyOCw5IEBACiAKIAlpZiAoY212X2ZpbGVbc2MtPm1vZGVtX2luZGV4XSA9PSBOVUxMKSB7CiAJCWlmIChVRUFfQ0hJUF9WRVJTSU9OKHNjKSA9PSBBREk5MzApCi0JCQlmaWxlID0gKElTX0lTRE4oc2MpKSA/ICJDTVY5aS5iaW4iIDogIkNNVjlwLmJpbiI7CisJCQlmaWxlID0gKElTX0lTRE4oc2MtPnVzYl9kZXYpKSA/ICJDTVY5aS5iaW4iIDogIkNNVjlwLmJpbiI7CiAJCWVsc2UKLQkJCWZpbGUgPSAoSVNfSVNETihzYykpID8gIkNNVmVpLmJpbiIgOiAiQ01WZXAuYmluIjsKKwkJCWZpbGUgPSAoSVNfSVNETihzYy0+dXNiX2RldikpID8gIkNNVmVpLmJpbiIgOiAiQ01WZXAuYmluIjsKIAl9IGVsc2UKIAkJZmlsZSA9IGNtdl9maWxlW3NjLT5tb2RlbV9pbmRleF07CiAKQEAgLTExMzEsNiArMTEyNiwxMyBAQAogCWlmIChyZXQgPCAwKQogCQlyZXR1cm4gcmV0OwogCisJLyogRHVtcCBmaXJtd2FyZSB2ZXJzaW9uICovCisJcmV0ID0gdWVhX3JlYWRfY212KHNjLCBTQV9JTkZPLCAxMCwgJnNjLT5zdGF0cy5waHkuZmlybWlkKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKwl1ZWFfaW5mbyhJTlNfVE9fVVNCREVWKHNjKSwgIkFUVS1SIGZpcm13YXJlIHZlcnNpb24gOiAleFxuIiwKKwkJCXNjLT5zdGF0cy5waHkuZmlybWlkKTsKKwogCS8qIGdldCBvcHRpb25zICovCiAgCXJldCA9IGxlbiA9IHJlcXVlc3RfY212cyhzYywgJmNtdnMsICZjbXZzX2Z3KTsKIAlpZiAocmV0IDwgMCkKQEAgLTExNDcsNiArMTE0OSw4IEBACiAJLyogRW50ZXIgaW4gUi1BQ1QtUkVRICovCiAJcmV0ID0gdWVhX3dyaXRlX2NtdihzYywgU0FfQ05UTCwgMCwgMik7CiAJdWVhX3ZkYmcoSU5TX1RPX1VTQkRFVihzYyksICJFbnRlcmluZyBpbiBSLUFDVC1SRVEgc3RhdGVcbiIpOworCXVlYV9pbmZvKElOU19UT19VU0JERVYoc2MpLCAiTW9kZW0gc3RhcnRlZCwgIgorCQkid2FpdGluZyBzeW5jaHJvbml6YXRpb25cbiIpOwogb3V0OgogCXJlbGVhc2VfZmlybXdhcmUoY212c19mdyk7CiAJc2MtPnJlc2V0ID0gMDsKQEAgLTExNzIsNyArMTE3NiwxMCBAQAogCQlpZiAoIXJldCkKIAkJCXJldCA9IHVlYV9zdGF0KHNjKTsKIAkJaWYgKHJldCAhPSAtRUFHQUlOKQotCQkJbXNsZWVwKDEwMDApOworCQkJbXNsZWVwX2ludGVycnVwdGlibGUoMTAwMCk7CisgCQlpZiAodHJ5X3RvX2ZyZWV6ZSgpKQorCQkJdWVhX2VycihJTlNfVE9fVVNCREVWKHNjKSwgInN1c3BlbmQvcmVzdW1lIG5vdCBzdXBwb3J0ZWQsICIKKwkJCQkicGxlYXNlIHVucGx1Zy9yZXBsdWcgeW91ciBtb2RlbVxuIik7CiAJfQogCXVlYV9sZWF2ZXMoSU5TX1RPX1VTQkRFVihzYykpOwogCXJldHVybiByZXQ7CkBAIC0xNTY2LDYgKzE1NzMsNyBAQAogVUVBX0FUVFIoZHNjb3JyLCAwKTsKIFVFQV9BVFRSKHVzdW5jLCAwKTsKIFVFQV9BVFRSKGRzdW5jLCAwKTsKK1VFQV9BVFRSKGZpcm1pZCwgMCk7CiAKIC8qIFJldHJpZXZlIHRoZSBkZXZpY2UgRW5kIFN5c3RlbSBJZGVudGlmaWVyIChNQUMpICovCiAKQEAgLTE1OTcsNyArMTYwNSw3IEBACiB7CiAJc3RydWN0IHVlYV9zb2Z0YyAqc2MgPSB1c2JhdG0tPmRyaXZlcl9kYXRhOwogCi0Jd2FpdF9ldmVudChzYy0+c3luY19xLCBJU19PUEVSQVRJT05BTChzYykpOworCXdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZShzYy0+c3luY19xLCBJU19PUEVSQVRJT05BTChzYykpOwogCiAJcmV0dXJuIDA7CiAKQEAgLTE2MzksMTYgKzE2NDcsMTMgQEAKIAkmZGV2X2F0dHJfc3RhdF9kc2NvcnIuYXR0ciwKIAkmZGV2X2F0dHJfc3RhdF91c3VuYy5hdHRyLAogCSZkZXZfYXR0cl9zdGF0X2RzdW5jLmF0dHIsCisJJmRldl9hdHRyX3N0YXRfZmlybWlkLmF0dHIsCisJTlVMTCwKIH07CiBzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCBhdHRyX2dycCA9IHsKIAkuYXR0cnMgPSBhdHRycywKIH07CiAKLXN0YXRpYyBpbnQgY3JlYXRlX2ZzX2VudHJpZXMoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYpCi17Ci0JcmV0dXJuIHN5c2ZzX2NyZWF0ZV9ncm91cCgmaW50Zi0+ZGV2LmtvYmosICZhdHRyX2dycCk7Ci19Ci0KIHN0YXRpYyBpbnQgdWVhX2JpbmQoc3RydWN0IHVzYmF0bV9kYXRhICp1c2JhdG0sIHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmLAogCQkgICBjb25zdCBzdHJ1Y3QgdXNiX2RldmljZV9pZCAqaWQpCiB7CkBAIC0xNzA4LDMxICsxNzEzLDI1IEBACiAJCX0KIAl9CiAKKwlyZXQgPSBzeXNmc19jcmVhdGVfZ3JvdXAoJmludGYtPmRldi5rb2JqLCAmYXR0cl9ncnApOworCWlmIChyZXQgPCAwKQorCQlnb3RvIGVycm9yOworCiAJcmV0ID0gdWVhX2Jvb3Qoc2MpOwotCWlmIChyZXQgPCAwKSB7Ci0JCWtmcmVlKHNjKTsKLQkJcmV0dXJuIHJldDsKLQl9CisJaWYgKHJldCA8IDApCisJCWdvdG8gZXJyb3I7CiAKLQlyZXQgPSBjcmVhdGVfZnNfZW50cmllcyhpbnRmKTsKLQlpZiAocmV0KSB7Ci0JCXVlYV9zdG9wKHNjKTsKLQkJa2ZyZWUoc2MpOwotCQlyZXR1cm4gcmV0OwotCX0KIAlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQgZGVzdHJveV9mc19lbnRyaWVzKHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmKQotewotCXN5c2ZzX3JlbW92ZV9ncm91cCgmaW50Zi0+ZGV2LmtvYmosICZhdHRyX2dycCk7CitlcnJvcjoKKwlrZnJlZShzYyk7CisJcmV0dXJuIHJldDsKIH0KIAogc3RhdGljIHZvaWQgdWVhX3VuYmluZChzdHJ1Y3QgdXNiYXRtX2RhdGEgKnVzYmF0bSwgc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYpCiB7CiAJc3RydWN0IHVlYV9zb2Z0YyAqc2MgPSB1c2JhdG0tPmRyaXZlcl9kYXRhOwogCi0JZGVzdHJveV9mc19lbnRyaWVzKGludGYpOworCXN5c2ZzX3JlbW92ZV9ncm91cCgmaW50Zi0+ZGV2LmtvYmosICZhdHRyX2dycCk7CiAJdWVhX3N0b3Aoc2MpOwogCWtmcmVlKHNjKTsKIH0KQEAgLTE3NTMsMTAgKzE3NTIsMTAgQEAKIAlzdHJ1Y3QgdXNiX2RldmljZSAqdXNiID0gaW50ZXJmYWNlX3RvX3VzYmRldihpbnRmKTsKIAogCXVlYV9lbnRlcnModXNiKTsKLQl1ZWFfaW5mbyh1c2IsICJBRFNMIGRldmljZSBmb3VuZGVkIHZpZCAoJSNYKSBwaWQgKCUjWCkgOiAlc1xuIiwKKwl1ZWFfaW5mbyh1c2IsICJBRFNMIGRldmljZSBmb3VuZGVkIHZpZCAoJSNYKSBwaWQgKCUjWCkgOiAlcyAlc1xuIiwKIAkgICAgICAgbGUxNl90b19jcHUodXNiLT5kZXNjcmlwdG9yLmlkVmVuZG9yKSwKIAkgICAgICAgbGUxNl90b19jcHUodXNiLT5kZXNjcmlwdG9yLmlkUHJvZHVjdCksCi0JICAgICAgIGNoaXBfbmFtZVtVRUFfQ0hJUF9WRVJTSU9OKGlkKV0pOworCSAgICAgICBjaGlwX25hbWVbVUVBX0NISVBfVkVSU0lPTihpZCldLCBJU19JU0ROKHVzYik/ImlzZG4iOiJwb3RzIik7CiAKIAl1c2JfcmVzZXRfZGV2aWNlKHVzYik7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2F0bS91c2JhdG0uYyBiL2RyaXZlcnMvdXNiL2F0bS91c2JhdG0uYwppbmRleCAzMDkwNzNmLi5lYzYzYjBlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9hdG0vdXNiYXRtLmMKKysrIGIvZHJpdmVycy91c2IvYXRtL3VzYmF0bS5jCkBAIC0xMDAxLDYgKzEwMDEsNyBAQAogCiAJZGFlbW9uaXplKGluc3RhbmNlLT5kcml2ZXItPmRyaXZlcl9uYW1lKTsKIAlhbGxvd19zaWduYWwoU0lHVEVSTSk7CisJaW5zdGFuY2UtPnRocmVhZF9waWQgPSBjdXJyZW50LT5waWQ7CiAKIAljb21wbGV0ZSgmaW5zdGFuY2UtPnRocmVhZF9zdGFydGVkKTsKIApAQCAtMTAyNSwxMCArMTAyNiw2IEBACiAJCXJldHVybiByZXQ7CiAJfQogCi0JbXV0ZXhfbG9jaygmaW5zdGFuY2UtPnNlcmlhbGl6ZSk7Ci0JaW5zdGFuY2UtPnRocmVhZF9waWQgPSByZXQ7Ci0JbXV0ZXhfdW5sb2NrKCZpbnN0YW5jZS0+c2VyaWFsaXplKTsKLQogCXdhaXRfZm9yX2NvbXBsZXRpb24oJmluc3RhbmNlLT50aHJlYWRfc3RhcnRlZCk7CiAKIAlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2NsYXNzL2NkYy1hY20uYyBiL2RyaXZlcnMvdXNiL2NsYXNzL2NkYy1hY20uYwppbmRleCBlYzRkMWQ3Li45YTkwMTJmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9jbGFzcy9jZGMtYWNtLmMKKysrIGIvZHJpdmVycy91c2IvY2xhc3MvY2RjLWFjbS5jCkBAIC0zMjUsNyArMzI1LDcgQEAKIAlzdHJ1Y3QgYWNtX3JiICpidWY7CiAJc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSA9IGFjbS0+dHR5OwogCXN0cnVjdCBhY21fcnUgKnJjdjsKLQkvL3Vuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKIAlpbnQgaSA9IDA7CiAJZGJnKCJFbnRlcmluZyBhY21fcnhfdGFza2xldCIpOwogCkBAIC0zMzMsMTUgKzMzMywxNSBAQAogCQlyZXR1cm47CiAKIG5leHRfYnVmZmVyOgotCXNwaW5fbG9jaygmYWNtLT5yZWFkX2xvY2spOworCXNwaW5fbG9ja19pcnFzYXZlKCZhY20tPnJlYWRfbG9jaywgZmxhZ3MpOwogCWlmIChsaXN0X2VtcHR5KCZhY20tPmZpbGxlZF9yZWFkX2J1ZnMpKSB7Ci0JCXNwaW5fdW5sb2NrKCZhY20tPnJlYWRfbG9jayk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmFjbS0+cmVhZF9sb2NrLCBmbGFncyk7CiAJCWdvdG8gdXJiczsKIAl9CiAJYnVmID0gbGlzdF9lbnRyeShhY20tPmZpbGxlZF9yZWFkX2J1ZnMubmV4dCwKIAkJCSBzdHJ1Y3QgYWNtX3JiLCBsaXN0KTsKIAlsaXN0X2RlbCgmYnVmLT5saXN0KTsKLQlzcGluX3VubG9jaygmYWNtLT5yZWFkX2xvY2spOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmFjbS0+cmVhZF9sb2NrLCBmbGFncyk7CiAKIAlkYmcoImFjbV9yeF90YXNrbGV0OiBwcm9jZXNpbmcgYnVmIDB4JXAsIHNpemUgPSAlZCIsIGJ1ZiwgYnVmLT5zaXplKTsKIApAQCAtMzU2LDI5ICszNTYsMjkgQEAKIAkJbWVtbW92ZShidWYtPmJhc2UsIGJ1Zi0+YmFzZSArIGksIGJ1Zi0+c2l6ZSAtIGkpOwogCQlidWYtPnNpemUgLT0gaTsKIAkJc3Bpbl91bmxvY2soJmFjbS0+dGhyb3R0bGVfbG9jayk7Ci0JCXNwaW5fbG9jaygmYWNtLT5yZWFkX2xvY2spOworCQlzcGluX2xvY2tfaXJxc2F2ZSgmYWNtLT5yZWFkX2xvY2ssIGZsYWdzKTsKIAkJbGlzdF9hZGQoJmJ1Zi0+bGlzdCwgJmFjbS0+ZmlsbGVkX3JlYWRfYnVmcyk7Ci0JCXNwaW5fdW5sb2NrKCZhY20tPnJlYWRfbG9jayk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmFjbS0+cmVhZF9sb2NrLCBmbGFncyk7CiAJCXJldHVybjsKIAl9CiAJc3Bpbl91bmxvY2soJmFjbS0+dGhyb3R0bGVfbG9jayk7CiAKLQlzcGluX2xvY2soJmFjbS0+cmVhZF9sb2NrKTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmYWNtLT5yZWFkX2xvY2ssIGZsYWdzKTsKIAlsaXN0X2FkZCgmYnVmLT5saXN0LCAmYWNtLT5zcGFyZV9yZWFkX2J1ZnMpOwotCXNwaW5fdW5sb2NrKCZhY20tPnJlYWRfbG9jayk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYWNtLT5yZWFkX2xvY2ssIGZsYWdzKTsKIAlnb3RvIG5leHRfYnVmZmVyOwogCiB1cmJzOgogCXdoaWxlICghbGlzdF9lbXB0eSgmYWNtLT5zcGFyZV9yZWFkX2J1ZnMpKSB7Ci0JCXNwaW5fbG9jaygmYWNtLT5yZWFkX2xvY2spOworCQlzcGluX2xvY2tfaXJxc2F2ZSgmYWNtLT5yZWFkX2xvY2ssIGZsYWdzKTsKIAkJaWYgKGxpc3RfZW1wdHkoJmFjbS0+c3BhcmVfcmVhZF91cmJzKSkgewotCQkJc3Bpbl91bmxvY2soJmFjbS0+cmVhZF9sb2NrKTsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmFjbS0+cmVhZF9sb2NrLCBmbGFncyk7CiAJCQlyZXR1cm47CiAJCX0KIAkJcmN2ID0gbGlzdF9lbnRyeShhY20tPnNwYXJlX3JlYWRfdXJicy5uZXh0LAogCQkJCSBzdHJ1Y3QgYWNtX3J1LCBsaXN0KTsKIAkJbGlzdF9kZWwoJnJjdi0+bGlzdCk7Ci0JCXNwaW5fdW5sb2NrKCZhY20tPnJlYWRfbG9jayk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmFjbS0+cmVhZF9sb2NrLCBmbGFncyk7CiAKIAkJYnVmID0gbGlzdF9lbnRyeShhY20tPnNwYXJlX3JlYWRfYnVmcy5uZXh0LAogCQkJCSBzdHJ1Y3QgYWNtX3JiLCBsaXN0KTsKQEAgLTQwMCw5ICs0MDAsOSBAQAogCQkgICBmcmVlLXVyYnMtcG9vbCBhbmQgcmVzdWJtaXRlZCBBU0FQICovCiAJCWlmICh1c2Jfc3VibWl0X3VyYihyY3YtPnVyYiwgR0ZQX0FUT01JQykgPCAwKSB7CiAJCQlsaXN0X2FkZCgmYnVmLT5saXN0LCAmYWNtLT5zcGFyZV9yZWFkX2J1ZnMpOwotCQkJc3Bpbl9sb2NrKCZhY20tPnJlYWRfbG9jayk7CisJCQlzcGluX2xvY2tfaXJxc2F2ZSgmYWNtLT5yZWFkX2xvY2ssIGZsYWdzKTsKIAkJCWxpc3RfYWRkKCZyY3YtPmxpc3QsICZhY20tPnNwYXJlX3JlYWRfdXJicyk7Ci0JCQlzcGluX3VubG9jaygmYWNtLT5yZWFkX2xvY2spOworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYWNtLT5yZWFkX2xvY2ssIGZsYWdzKTsKIAkJCXJldHVybjsKIAkJfQogCX0KQEAgLTEwODMsNiArMTA4Myw5IEBACiAJeyBVU0JfREVWSUNFKDB4MDQ4MiwgMHgwMjAzKSwgLyogS1lPQ0VSQSBBSC1LMzAwMVYgKi8KIAkuZHJpdmVyX2luZm8gPSBOT19VTklPTl9OT1JNQUwsIC8qIGhhcyBubyB1bmlvbiBkZXNjcmlwdG9yICovCiAJfSwKKwl7IFVTQl9ERVZJQ0UoMHgwNzliLCAweDAwMGYpLCAvKiBCVCBPbi1BaXIgVVNCIE1PREVNICovCisJLmRyaXZlcl9pbmZvID0gTk9fVU5JT05fTk9STUFMLCAvKiBoYXMgbm8gdW5pb24gZGVzY3JpcHRvciAqLworCX0sCiAJeyBVU0JfREVWSUNFKDB4MGFjZSwgMHgxNjA4KSwgLyogWnlEQVMgNTZLIFVTQiBNT0RFTSAqLwogCS5kcml2ZXJfaW5mbyA9IFNJTkdMRV9SWF9VUkIsIC8qIGZpcm13YXJlIGJ1ZyAqLwogCX0sCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9jbGFzcy91c2JscC5jIGIvZHJpdmVycy91c2IvY2xhc3MvdXNibHAuYwppbmRleCBhMTYxZDcwLi42MzAzOTcwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9jbGFzcy91c2JscC5jCisrKyBiL2RyaXZlcnMvdXNiL2NsYXNzL3VzYmxwLmMKQEAgLTE1NCw2ICsxNTQsNyBAQAogCXVuc2lnbmVkIGNoYXIJCXVzZWQ7CQkJLyogVHJ1ZSBpZiBvcGVuICovCiAJdW5zaWduZWQgY2hhcgkJcHJlc2VudDsJCS8qIFRydWUgaWYgbm90IGRpc2Nvbm5lY3RlZCAqLwogCXVuc2lnbmVkIGNoYXIJCWJpZGlyOwkJCS8qIGludGVyZmFjZSBpcyBiaWRpcmVjdGlvbmFsICovCisJdW5zaWduZWQgY2hhcgkJc2xlZXBpbmc7CQkvKiBpbnRlcmZhY2UgaXMgc3VzcGVuZGVkICovCiAJdW5zaWduZWQgY2hhcgkJKmRldmljZV9pZF9zdHJpbmc7CS8qIElFRUUgMTI4NCBERVZJQ0UgSUQgc3RyaW5nIChwdHIpICovCiAJCQkJCQkJLyogZmlyc3QgMiBieXRlcyBhcmUgKGJpZy1lbmRpYW4pIGxlbmd0aCAqLwogfTsKQEAgLTE4Myw2ICsxODQsNyBAQAogCWRiZygicXVpcmtzPSVkIiwgdXNibHAtPnF1aXJrcyk7CiAJZGJnKCJ1c2VkPSVkIiwgdXNibHAtPnVzZWQpOwogCWRiZygiYmlkaXI9JWQiLCB1c2JscC0+YmlkaXIpOworCWRiZygic2xlZXBpbmc9JWQiLCB1c2JscC0+c2xlZXBpbmcpOwogCWRiZygiZGV2aWNlX2lkX3N0cmluZz1cIiVzXCIiLAogCQl1c2JscC0+ZGV2aWNlX2lkX3N0cmluZyA/CiAJCQl1c2JscC0+ZGV2aWNlX2lkX3N0cmluZyArIDIgOgpAQCAtMzM4LDYgKzM0MCwyMCBAQAogCXJldHVybiBuZXdlcnI7CiB9CiAKK3N0YXRpYyBpbnQgaGFuZGxlX2JpZGlyIChzdHJ1Y3QgdXNibHAgKnVzYmxwKQoreworCWlmICh1c2JscC0+YmlkaXIgJiYgdXNibHAtPnVzZWQgJiYgIXVzYmxwLT5zbGVlcGluZykgeworCQl1c2JscC0+cmVhZGNvdW50ID0gMDsKKwkJdXNibHAtPnJlYWR1cmItPmRldiA9IHVzYmxwLT5kZXY7CisJCWlmICh1c2Jfc3VibWl0X3VyYih1c2JscC0+cmVhZHVyYiwgR0ZQX0tFUk5FTCkgPCAwKSB7CisJCQl1c2JscC0+dXNlZCA9IDA7CisJCQlyZXR1cm4gLUVJTzsKKwkJfQorCX0KKworCXJldHVybiAwOworfQorCiAvKgogICogRmlsZSBvcCBmdW5jdGlvbnMuCiAgKi8KQEAgLTM5MCwxNCArNDA2LDkgQEAKIAl1c2JscC0+d3JpdGV1cmItPnN0YXR1cyA9IDA7CiAJdXNibHAtPnJlYWR1cmItPnN0YXR1cyA9IDA7CiAKLQlpZiAodXNibHAtPmJpZGlyKSB7Ci0JCXVzYmxwLT5yZWFkY291bnQgPSAwOwotCQl1c2JscC0+cmVhZHVyYi0+ZGV2ID0gdXNibHAtPmRldjsKLQkJaWYgKHVzYl9zdWJtaXRfdXJiKHVzYmxwLT5yZWFkdXJiLCBHRlBfS0VSTkVMKSA8IDApIHsKLQkJCXJldHZhbCA9IC1FSU87Ci0JCQl1c2JscC0+dXNlZCA9IDA7Ci0JCQlmaWxlLT5wcml2YXRlX2RhdGEgPSBOVUxMOwotCQl9CisJaWYgKGhhbmRsZV9iaWRpcih1c2JscCkgPCAwKSB7CisJCWZpbGUtPnByaXZhdGVfZGF0YSA9IE5VTEw7CisJCXJldHZhbCA9IC1FSU87CiAJfQogb3V0OgogCW11dGV4X3VubG9jayAoJnVzYmxwX211dGV4KTsKQEAgLTQ2MCw2ICs0NzEsMTEgQEAKIAkJZ290byBkb25lOwogCX0KIAorCWlmICh1c2JscC0+c2xlZXBpbmcpIHsKKwkJcmV0dmFsID0gLUVOT0RFVjsKKwkJZ290byBkb25lOworCX0KKwogCWRiZygidXNibHBfaW9jdGw6IGNtZD0weCV4ICglYyBucj0lZCBsZW49JWQgZGlyPSVkKSIsIGNtZCwgX0lPQ19UWVBFKGNtZCksCiAJCV9JT0NfTlIoY21kKSwgX0lPQ19TSVpFKGNtZCksIF9JT0NfRElSKGNtZCkgKTsKIApAQCAtNjU4LDYgKzY3NCwxMSBAQAogCQkJcmV0dXJuIC1FTk9ERVY7CiAJCX0KIAorCQlpZiAodXNibHAtPnNsZWVwaW5nKSB7CisJCQl1cCAoJnVzYmxwLT5zZW0pOworCQkJcmV0dXJuIHdyaXRlY291bnQgPyB3cml0ZWNvdW50IDogLUVOT0RFVjsKKwkJfQorCiAJCWlmICh1c2JscC0+d3JpdGV1cmItPnN0YXR1cyAhPSAwKSB7CiAJCQlpZiAodXNibHAtPnF1aXJrcyAmIFVTQkxQX1FVSVJLX0JJRElSKSB7CiAJCQkJaWYgKCF1c2JscC0+d2NvbXBsZXRlKQpAQCAtNzAxLDYgKzcyMiw3IEBACiAJCXVzYmxwLT53Y29tcGxldGUgPSAwOwogCQllcnIgPSB1c2Jfc3VibWl0X3VyYih1c2JscC0+d3JpdGV1cmIsIEdGUF9LRVJORUwpOwogCQlpZiAoZXJyKSB7CisJCQl1c2JscC0+d2NvbXBsZXRlID0gMTsKIAkJCWlmIChlcnIgIT0gLUVOT01FTSkKIAkJCQljb3VudCA9IC1FSU87CiAJCQllbHNlCkBAIC03NDksNiArNzcxLDExIEBACiAJCWdvdG8gZG9uZTsKIAl9CiAKKwlpZiAodXNibHAtPnNsZWVwaW5nKSB7CisJCWNvdW50ID0gLUVOT0RFVjsKKwkJZ290byBkb25lOworCX0KKwogCWlmICh1c2JscC0+cmVhZHVyYi0+c3RhdHVzKSB7CiAJCWVycigidXNibHAlZDogZXJyb3IgJWQgcmVhZGluZyBmcm9tIHByaW50ZXIiLAogCQkJdXNibHAtPm1pbm9yLCB1c2JscC0+cmVhZHVyYi0+c3RhdHVzKTsKQEAgLTExNjcsNiArMTE5NCwzOSBAQAogCW11dGV4X3VubG9jayAoJnVzYmxwX211dGV4KTsKIH0KIAorc3RhdGljIGludCB1c2JscF9zdXNwZW5kIChzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZiwgcG1fbWVzc2FnZV90IG1lc3NhZ2UpCit7CisJc3RydWN0IHVzYmxwICp1c2JscCA9IHVzYl9nZXRfaW50ZmRhdGEgKGludGYpOworCisJLyogdGhpcyByYWNlcyBhZ2FpbnN0IG5vcm1hbCBhY2Nlc3MgYW5kIG9wZW4gKi8KKwltdXRleF9sb2NrICgmdXNibHBfbXV0ZXgpOworCWRvd24gKCZ1c2JscC0+c2VtKTsKKwkvKiB3ZSB0YWtlIG5vIG1vcmUgSU8gKi8KKwl1c2JscC0+c2xlZXBpbmcgPSAxOworCXVzYmxwX3VubGlua191cmJzKHVzYmxwKTsKKwl1cCAoJnVzYmxwLT5zZW0pOworCW11dGV4X3VubG9jayAoJnVzYmxwX211dGV4KTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHVzYmxwX3Jlc3VtZSAoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYpCit7CisJc3RydWN0IHVzYmxwICp1c2JscCA9IHVzYl9nZXRfaW50ZmRhdGEgKGludGYpOworCWludCByOworCisJbXV0ZXhfbG9jayAoJnVzYmxwX211dGV4KTsKKwlkb3duICgmdXNibHAtPnNlbSk7CisKKwl1c2JscC0+c2xlZXBpbmcgPSAwOworCXIgPSBoYW5kbGVfYmlkaXIgKHVzYmxwKTsKKworCXVwICgmdXNibHAtPnNlbSk7CisJbXV0ZXhfdW5sb2NrICgmdXNibHBfbXV0ZXgpOworCisJcmV0dXJuIHI7Cit9CisKIHN0YXRpYyBzdHJ1Y3QgdXNiX2RldmljZV9pZCB1c2JscF9pZHMgW10gPSB7CiAJeyBVU0JfREVWSUNFX0lORk8oNywgMSwgMSkgfSwKIAl7IFVTQl9ERVZJQ0VfSU5GTyg3LCAxLCAyKSB9LApAQCAtMTE4Myw2ICsxMjQzLDggQEAKIAkubmFtZSA9CQkidXNibHAiLAogCS5wcm9iZSA9CXVzYmxwX3Byb2JlLAogCS5kaXNjb25uZWN0ID0JdXNibHBfZGlzY29ubmVjdCwKKwkuc3VzcGVuZCA9CXVzYmxwX3N1c3BlbmQsCisJLnJlc3VtZSA9CXVzYmxwX3Jlc3VtZSwKIAkuaWRfdGFibGUgPQl1c2JscF9pZHMsCiB9OwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9jb3JlL2RldmlvLmMgYi9kcml2ZXJzL3VzYi9jb3JlL2RldmlvLmMKaW5kZXggNzI0ODIyYy4uZmVkOTJiZSAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvY29yZS9kZXZpby5jCisrKyBiL2RyaXZlcnMvdXNiL2NvcmUvZGV2aW8uYwpAQCAtMTU4OCwxNSArMTU4OCwxOCBAQAogCS5yZWxlYXNlID0JdXNiZGV2X3JlbGVhc2UsCiB9OwogCi1zdGF0aWMgdm9pZCB1c2JkZXZfYWRkKHN0cnVjdCB1c2JfZGV2aWNlICpkZXYpCitzdGF0aWMgaW50IHVzYmRldl9hZGQoc3RydWN0IHVzYl9kZXZpY2UgKmRldikKIHsKIAlpbnQgbWlub3IgPSAoKGRldi0+YnVzLT5idXNudW0tMSkgKiAxMjgpICsgKGRldi0+ZGV2bnVtLTEpOwogCiAJZGV2LT5jbGFzc19kZXYgPSBjbGFzc19kZXZpY2VfY3JlYXRlKHVzYl9kZXZpY2VfY2xhc3MsIE5VTEwsCiAJCQkJTUtERVYoVVNCX0RFVklDRV9NQUpPUiwgbWlub3IpLCAmZGV2LT5kZXYsCiAJCQkJInVzYmRldiVkLiVkIiwgZGV2LT5idXMtPmJ1c251bSwgZGV2LT5kZXZudW0pOworCWlmIChJU19FUlIoZGV2LT5jbGFzc19kZXYpKQorCQlyZXR1cm4gUFRSX0VSUihkZXYtPmNsYXNzX2Rldik7CiAKIAlkZXYtPmNsYXNzX2Rldi0+Y2xhc3NfZGF0YSA9IGRldjsKKwlyZXR1cm4gMDsKIH0KIAogc3RhdGljIHZvaWQgdXNiZGV2X3JlbW92ZShzdHJ1Y3QgdXNiX2RldmljZSAqZGV2KQpAQCAtMTYwOSw3ICsxNjEyLDggQEAKIHsKIAlzd2l0Y2ggKGFjdGlvbikgewogCWNhc2UgVVNCX0RFVklDRV9BREQ6Ci0JCXVzYmRldl9hZGQoZGV2KTsKKwkJaWYgKHVzYmRldl9hZGQoZGV2KSkKKwkJCXJldHVybiBOT1RJRllfQkFEOwogCQlicmVhazsKIAljYXNlIFVTQl9ERVZJQ0VfUkVNT1ZFOgogCQl1c2JkZXZfcmVtb3ZlKGRldik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9jb3JlL2VuZHBvaW50LmMgYi9kcml2ZXJzL3VzYi9jb3JlL2VuZHBvaW50LmMKaW5kZXggM2ViYjkwMS4uM2IyZDEzNyAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvY29yZS9lbmRwb2ludC5jCisrKyBiL2RyaXZlcnMvdXNiL2NvcmUvZW5kcG9pbnQuYwpAQCAtMjIzLDcgKzIyMyw3IEBACiAJZXBfZGV2ID0ga3phbGxvYyhzaXplb2YoKmVwX2RldiksIEdGUF9LRVJORUwpOwogCWlmICghZXBfZGV2KSB7CiAJCXJldHZhbCA9IC1FTk9NRU07Ci0JCWdvdG8gZXhpdDsKKwkJZ290byBlcnJvcl9hbGxvYzsKIAl9CiAKIAkvKiBmdW4gY2FsY3VsYXRpb24gdG8gZGV0ZXJtaW5lIHRoZSBtaW5vciBvZiB0aGlzIGVuZHBvaW50ICovCkBAIC0yNDEsMzMgKzI0MSwzMSBAQAogCiAJcmV0dmFsID0gZGV2aWNlX3JlZ2lzdGVyKCZlcF9kZXYtPmRldik7CiAJaWYgKHJldHZhbCkKLQkJZ290byBlcnJvcjsKKwkJZ290byBlcnJvcl9yZWdpc3RlcjsKIAlyZXR2YWwgPSBzeXNmc19jcmVhdGVfZ3JvdXAoJmVwX2Rldi0+ZGV2LmtvYmosICZlcF9kZXZfYXR0cl9ncnApOwogCWlmIChyZXR2YWwpCiAJCWdvdG8gZXJyb3JfZ3JvdXA7CiAKLQllbmRwb2ludC0+ZXBfZGV2ID0gZXBfZGV2OwotCiAJLyogY3JlYXRlIHRoZSBzeW1saW5rIHRvIHRoZSBvbGQtc3R5bGUgImVwX1hYIiBkaXJlY3RvcnkgKi8KIAlzcHJpbnRmKG5hbWUsICJlcF8lMDJ4IiwgZW5kcG9pbnQtPmRlc2MuYkVuZHBvaW50QWRkcmVzcyk7Ci0JcmV0dmFsID0gc3lzZnNfY3JlYXRlX2xpbmsoJnBhcmVudC0+a29iaiwKLQkJCQkgICAmZW5kcG9pbnQtPmVwX2Rldi0+ZGV2LmtvYmosIG5hbWUpOworCXJldHZhbCA9IHN5c2ZzX2NyZWF0ZV9saW5rKCZwYXJlbnQtPmtvYmosICZlcF9kZXYtPmRldi5rb2JqLCBuYW1lKTsKIAlpZiAocmV0dmFsKQogCQlnb3RvIGVycm9yX2xpbms7Ci1leGl0OgorCWVuZHBvaW50LT5lcF9kZXYgPSBlcF9kZXY7CiAJcmV0dXJuIHJldHZhbDsKIAogZXJyb3JfbGluazoKIAlzeXNmc19yZW1vdmVfZ3JvdXAoJmVwX2Rldi0+ZGV2LmtvYmosICZlcF9kZXZfYXR0cl9ncnApOwotCiBlcnJvcl9ncm91cDoKIAlkZXZpY2VfdW5yZWdpc3RlcigmZXBfZGV2LT5kZXYpOwotCWVuZHBvaW50LT5lcF9kZXYgPSBOVUxMOwogCWRlc3Ryb3lfZW5kcG9pbnRfY2xhc3MoKTsKIAlyZXR1cm4gcmV0dmFsOwotZXJyb3I6CisKK2Vycm9yX3JlZ2lzdGVyOgogCWtmcmVlKGVwX2Rldik7CitlcnJvcl9hbGxvYzoKIAlkZXN0cm95X2VuZHBvaW50X2NsYXNzKCk7CitleGl0OgogCXJldHVybiByZXR2YWw7CiB9CiAKQEAgLTI4Miw4ICsyODAsNiBAQAogCQlzeXNmc19yZW1vdmVfZ3JvdXAoJmVuZHBvaW50LT5lcF9kZXYtPmRldi5rb2JqLCAmZXBfZGV2X2F0dHJfZ3JwKTsKIAkJZGV2aWNlX3VucmVnaXN0ZXIoJmVuZHBvaW50LT5lcF9kZXYtPmRldik7CiAJCWVuZHBvaW50LT5lcF9kZXYgPSBOVUxMOworCQlkZXN0cm95X2VuZHBvaW50X2NsYXNzKCk7CiAJfQotCWRlc3Ryb3lfZW5kcG9pbnRfY2xhc3MoKTsKIH0KLQotCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9jb3JlL2h1Yi5jIGIvZHJpdmVycy91c2IvY29yZS9odWIuYwppbmRleCA2NmJmZjE4Li5iYTE2NWFmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9jb3JlL2h1Yi5jCisrKyBiL2RyaXZlcnMvdXNiL2NvcmUvaHViLmMKQEAgLTExODgsNiArMTE4OCw3IEBACiAKICNpZmRlZglDT05GSUdfVVNCX09URwogI2luY2x1ZGUgIm90Z193aGl0ZWxpc3QuaCIKK3N0YXRpYyBpbnQgX191c2JfcG9ydF9zdXNwZW5kKHN0cnVjdCB1c2JfZGV2aWNlICosIGludCBwb3J0MSk7CiAjZW5kaWYKIAogLyoqCkBAIC0xMjg5LDggKzEyOTAsNiBAQAogCQkgKiAoSW5jbHVkZXMgSE5QIHRlc3QgZGV2aWNlLikKIAkJICovCiAJCWlmICh1ZGV2LT5idXMtPmJfaG5wX2VuYWJsZSB8fCB1ZGV2LT5idXMtPmlzX2JfaG9zdCkgewotCQkJc3RhdGljIGludCBfX3VzYl9wb3J0X3N1c3BlbmQoc3RydWN0IHVzYl9kZXZpY2UgKiwKLQkJCQkJCWludCBwb3J0MSk7CiAJCQllcnIgPSBfX3VzYl9wb3J0X3N1c3BlbmQodWRldiwgdWRldi0+YnVzLT5vdGdfcG9ydCk7CiAJCQlpZiAoZXJyIDwgMCkKIAkJCQlkZXZfZGJnKCZ1ZGV2LT5kZXYsICJITlAgZmFpbCwgJWRcbiIsIGVycik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9jb3JlL21lc3NhZ2UuYyBiL2RyaXZlcnMvdXNiL2NvcmUvbWVzc2FnZS5jCmluZGV4IGZjY2QxOTUuLjc3MjljMDcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2NvcmUvbWVzc2FnZS5jCisrKyBiL2RyaXZlcnMvdXNiL2NvcmUvbWVzc2FnZS5jCkBAIC04MjgsMTAgKzgyOCw3IEBACiAgKiBDb250ZXh0OiAhaW5faW50ZXJydXB0ICgpCiAgKgogICogVXBkYXRlcyB0aGUgY29weSBvZiB0aGUgZGV2aWNlIGRlc2NyaXB0b3Igc3RvcmVkIGluIHRoZSBkZXZpY2Ugc3RydWN0dXJlLAotICogd2hpY2ggZGVkaWNhdGVzIHNwYWNlIGZvciB0aGlzIHB1cnBvc2UuICBOb3RlIHRoYXQgc2V2ZXJhbCBmaWVsZHMgYXJlCi0gKiBjb252ZXJ0ZWQgdG8gdGhlIGhvc3QgQ1BVJ3MgYnl0ZSBvcmRlcjogIHRoZSBVU0IgdmVyc2lvbiAoYmNkVVNCKSwgYW5kCi0gKiB2ZW5kb3JzIHByb2R1Y3QgYW5kIHZlcnNpb24gZmllbGRzIChpZFZlbmRvciwgaWRQcm9kdWN0LCBhbmQgYmNkRGV2aWNlKS4KLSAqIFRoYXQgbGV0cyBkZXZpY2UgZHJpdmVycyBjb21wYXJlIGFnYWluc3Qgbm9uLWJ5dGVzd2FwcGVkIGNvbnN0YW50cy4KKyAqIHdoaWNoIGRlZGljYXRlcyBzcGFjZSBmb3IgdGhpcyBwdXJwb3NlLgogICoKICAqIE5vdCBleHBvcnRlZCwgb25seSBmb3IgdXNlIGJ5IHRoZSBjb3JlLiAgSWYgZHJpdmVycyByZWFsbHkgd2FudCB0byByZWFkCiAgKiB0aGUgZGV2aWNlIGRlc2NyaXB0b3IgZGlyZWN0bHksIHRoZXkgY2FuIGNhbGwgdXNiX2dldF9kZXNjcmlwdG9yKCkgd2l0aApkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvZ2FkZ2V0L25ldDIyODAuYyBiL2RyaXZlcnMvdXNiL2dhZGdldC9uZXQyMjgwLmMKaW5kZXggZDk1NGRhYS4uM2FjYzg5NiAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvZ2FkZ2V0L25ldDIyODAuYworKysgYi9kcml2ZXJzL3VzYi9nYWRnZXQvbmV0MjI4MC5jCkBAIC0xNzc0LDggKzE3NzQsOCBAQAogCiAjZWxzZQogCi0jZGVmaW5lIGRldmljZV9jcmVhdGVfZmlsZShhLGIpCWRvIHt9IHdoaWxlICgwKQotI2RlZmluZSBkZXZpY2VfcmVtb3ZlX2ZpbGUJZGV2aWNlX2NyZWF0ZV9maWxlCisjZGVmaW5lIGRldmljZV9jcmVhdGVfZmlsZShhLGIpCSgwKQorI2RlZmluZSBkZXZpY2VfcmVtb3ZlX2ZpbGUoYSxiKQlkbyB7IH0gd2hpbGUgKDApCiAKICNlbmRpZgogCkBAIC0yMDQ0LDggKzIwNDQsMTAgQEAKIAkJcmV0dXJuIHJldHZhbDsKIAl9CiAKLQlkZXZpY2VfY3JlYXRlX2ZpbGUgKCZkZXYtPnBkZXYtPmRldiwgJmRldl9hdHRyX2Z1bmN0aW9uKTsKLQlkZXZpY2VfY3JlYXRlX2ZpbGUgKCZkZXYtPnBkZXYtPmRldiwgJmRldl9hdHRyX3F1ZXVlcyk7CisJcmV0dmFsID0gZGV2aWNlX2NyZWF0ZV9maWxlICgmZGV2LT5wZGV2LT5kZXYsICZkZXZfYXR0cl9mdW5jdGlvbik7CisJaWYgKHJldHZhbCkgZ290byBlcnJfdW5iaW5kOworCXJldHZhbCA9IGRldmljZV9jcmVhdGVfZmlsZSAoJmRldi0+cGRldi0+ZGV2LCAmZGV2X2F0dHJfcXVldWVzKTsKKwlpZiAocmV0dmFsKSBnb3RvIGVycl9mdW5jOwogCiAJLyogLi4uIHRoZW4gZW5hYmxlIGhvc3QgZGV0ZWN0aW9uIGFuZCBlcDA7IGFuZCB3ZSdyZSByZWFkeQogCSAqIGZvciBzZXRfY29uZmlndXJhdGlvbiBhcyB3ZWxsIGFzIGV2ZW50dWFsIGRpc2Nvbm5lY3QuCkBAIC0yMDYwLDYgKzIwNjIsMTQgQEAKIAogCS8qIHBjaSB3cml0ZXMgbWF5IHN0aWxsIGJlIHBvc3RlZCAqLwogCXJldHVybiAwOworCitlcnJfZnVuYzoKKwlkZXZpY2VfcmVtb3ZlX2ZpbGUgKCZkZXYtPnBkZXYtPmRldiwgJmRldl9hdHRyX2Z1bmN0aW9uKTsKK2Vycl91bmJpbmQ6CisJZHJpdmVyLT51bmJpbmQgKCZkZXYtPmdhZGdldCk7CisJZGV2LT5nYWRnZXQuZGV2LmRyaXZlciA9IE5VTEw7CisJZGV2LT5kcml2ZXIgPSBOVUxMOworCXJldHVybiByZXR2YWw7CiB9CiBFWFBPUlRfU1lNQk9MICh1c2JfZ2FkZ2V0X3JlZ2lzdGVyX2RyaXZlcik7CiAKQEAgLTI5NzQsOCArMjk4NCwxMCBAQAogCQkJCTogImRpc2FibGVkIik7CiAJdGhlX2NvbnRyb2xsZXIgPSBkZXY7CiAKLQlkZXZpY2VfcmVnaXN0ZXIgKCZkZXYtPmdhZGdldC5kZXYpOwotCWRldmljZV9jcmVhdGVfZmlsZSAoJnBkZXYtPmRldiwgJmRldl9hdHRyX3JlZ2lzdGVycyk7CisJcmV0dmFsID0gZGV2aWNlX3JlZ2lzdGVyICgmZGV2LT5nYWRnZXQuZGV2KTsKKwlpZiAocmV0dmFsKSBnb3RvIGRvbmU7CisJcmV0dmFsID0gZGV2aWNlX2NyZWF0ZV9maWxlICgmcGRldi0+ZGV2LCAmZGV2X2F0dHJfcmVnaXN0ZXJzKTsKKwlpZiAocmV0dmFsKSBnb3RvIGRvbmU7CiAKIAlyZXR1cm4gMDsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvZ2FkZ2V0L3B4YTJ4eF91ZGMuYyBiL2RyaXZlcnMvdXNiL2dhZGdldC9weGEyeHhfdWRjLmMKaW5kZXggZjQyYzAwZS4uNjcxYzI0YiAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvZ2FkZ2V0L3B4YTJ4eF91ZGMuYworKysgYi9kcml2ZXJzL3VzYi9nYWRnZXQvcHhhMnh4X3VkYy5jCkBAIC00MywxMSArNDMsMTEgQEAKICNpbmNsdWRlIDxsaW51eC9tbS5oPgogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+CisjaW5jbHVkZSA8bGludXgvaXJxLmg+CiAKICNpbmNsdWRlIDxhc20vYnl0ZW9yZGVyLmg+CiAjaW5jbHVkZSA8YXNtL2RtYS5oPgogI2luY2x1ZGUgPGFzbS9pby5oPgotI2luY2x1ZGUgPGFzbS9pcnEuaD4KICNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CiAjaW5jbHVkZSA8YXNtL21hY2gtdHlwZXMuaD4KICNpbmNsdWRlIDxhc20vdW5hbGlnbmVkLmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9ob3N0L2VoY2ktZGJnLmMgYi9kcml2ZXJzL3VzYi9ob3N0L2VoY2ktZGJnLmMKaW5kZXggMjNiOTViMi4uMzRiN2EzMSAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvaG9zdC9laGNpLWRiZy5jCisrKyBiL2RyaXZlcnMvdXNiL2hvc3QvZWhjaS1kYmcuYwpAQCAtNzU0LDcgKzc1NCw5IEBACiAJfQogCiAJaWYgKGVoY2ktPnJlY2xhaW0pIHsKLQkJdGVtcCA9IHNjbnByaW50ZiAobmV4dCwgc2l6ZSwgInJlY2xhaW0gcWggJXBcbiIsIGVoY2ktPnJlY2xhaW0pOworCQl0ZW1wID0gc2NucHJpbnRmIChuZXh0LCBzaXplLCAicmVjbGFpbSBxaCAlcCVzXG4iLAorCQkJCWVoY2ktPnJlY2xhaW0sCisJCQkJZWhjaS0+cmVjbGFpbV9yZWFkeSA/ICIgcmVhZHkiIDogIiIpOwogCQlzaXplIC09IHRlbXA7CiAJCW5leHQgKz0gdGVtcDsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9ob3N0L2VoY2ktaGNkLmMgYi9kcml2ZXJzL3VzYi9ob3N0L2VoY2ktaGNkLmMKaW5kZXggYWFjNmVjNS4uOTAzMDk5NCAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvaG9zdC9laGNpLWhjZC5jCisrKyBiL2RyaXZlcnMvdXNiL2hvc3QvZWhjaS1oY2QuYwpAQCAtMTExLDcgKzExMSw3IEBACiAjZGVmaW5lCUVIQ0lfVFVORV9NVUxUX1RUCTEKICNkZWZpbmUJRUhDSV9UVU5FX0ZMUwkJMgkvKiAoc21hbGwpIDI1NiBmcmFtZSBzY2hlZHVsZSAqLwogCi0jZGVmaW5lIEVIQ0lfSUFBX01TRUNTCQkxMAkJLyogYXJiaXRyYXJ5ICovCisjZGVmaW5lIEVIQ0lfSUFBX0pJRkZJRVMJKEhaLzEwMCkJLyogYXJiaXRyYXJ5OyB+MTAgbXNlYyAqLwogI2RlZmluZSBFSENJX0lPX0pJRkZJRVMJCShIWi8xMCkJCS8qIGlvIHdhdGNoZG9nID4gaXJxX3RocmVzaCAqLwogI2RlZmluZSBFSENJX0FTWU5DX0pJRkZJRVMJKEhaLzIwKQkJLyogYXN5bmMgaWRsZSB0aW1lb3V0ICovCiAjZGVmaW5lIEVIQ0lfU0hSSU5LX0pJRkZJRVMJKEhaLzIwMCkJLyogYXN5bmMgcWggdW5saW5rIGRlbGF5ICovCkBAIC0yNTQsNyArMjU0LDYgQEAKIAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIAotc3RhdGljIHZvaWQgZW5kX3VubGlua19hc3luYyAoc3RydWN0IGVoY2lfaGNkICplaGNpKTsKIHN0YXRpYyB2b2lkIGVoY2lfd29yayhzdHJ1Y3QgZWhjaV9oY2QgKmVoY2kpOwogCiAjaW5jbHVkZSAiZWhjaS1odWIuYyIKQEAgLTI2NCwyOSArMjYzLDYgQEAKIAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIAotc3RhdGljIHZvaWQgZWhjaV9pYWFfd2F0Y2hkb2cgKHVuc2lnbmVkIGxvbmcgcGFyYW0pCi17Ci0Jc3RydWN0IGVoY2lfaGNkCQkqZWhjaSA9IChzdHJ1Y3QgZWhjaV9oY2QgKikgcGFyYW07Ci0JdW5zaWduZWQgbG9uZwkJZmxhZ3M7Ci0JdTMyCQkJc3RhdHVzOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUgKCZlaGNpLT5sb2NrLCBmbGFncyk7Ci0JV0FSTl9PTighZWhjaS0+cmVjbGFpbSk7Ci0KLQkvKiBsb3N0IElBQSBpcnFzIHdlZGdlIHRoaW5ncyBiYWRseTsgc2VlbiBmaXJzdCB3aXRoIGEgdnQ4MjM1ICovCi0JaWYgKGVoY2ktPnJlY2xhaW0pIHsKLQkJc3RhdHVzID0gcmVhZGwgKCZlaGNpLT5yZWdzLT5zdGF0dXMpOwotCQlpZiAoc3RhdHVzICYgU1RTX0lBQSkgewotCQkJZWhjaV92ZGJnIChlaGNpLCAibG9zdCBJQUFcbiIpOwotCQkJQ09VTlQgKGVoY2ktPnN0YXRzLmxvc3RfaWFhKTsKLQkJCXdyaXRlbCAoU1RTX0lBQSwgJmVoY2ktPnJlZ3MtPnN0YXR1cyk7Ci0JCQllbmRfdW5saW5rX2FzeW5jIChlaGNpKTsKLQkJfQotCX0KLQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUgKCZlaGNpLT5sb2NrLCBmbGFncyk7Ci19Ci0KIHN0YXRpYyB2b2lkIGVoY2lfd2F0Y2hkb2cgKHVuc2lnbmVkIGxvbmcgcGFyYW0pCiB7CiAJc3RydWN0IGVoY2lfaGNkCQkqZWhjaSA9IChzdHJ1Y3QgZWhjaV9oY2QgKikgcGFyYW07CkBAIC0yOTQsNyArMjcwLDE4IEBACiAKIAlzcGluX2xvY2tfaXJxc2F2ZSAoJmVoY2ktPmxvY2ssIGZsYWdzKTsKIAotCS8qIHN0b3AgYXN5bmMgcHJvY2Vzc2luZyBhZnRlciBpdCdzIGlkbGVkIGEgYml0ICovCisJLyogbG9zdCBJQUEgaXJxcyB3ZWRnZSB0aGluZ3MgYmFkbHk7IHNlZW4gd2l0aCBhIHZ0ODIzNSAqLworCWlmIChlaGNpLT5yZWNsYWltKSB7CisJCXUzMgkJc3RhdHVzID0gcmVhZGwgKCZlaGNpLT5yZWdzLT5zdGF0dXMpOworCQlpZiAoc3RhdHVzICYgU1RTX0lBQSkgeworCQkJZWhjaV92ZGJnIChlaGNpLCAibG9zdCBJQUFcbiIpOworCQkJQ09VTlQgKGVoY2ktPnN0YXRzLmxvc3RfaWFhKTsKKwkJCXdyaXRlbCAoU1RTX0lBQSwgJmVoY2ktPnJlZ3MtPnN0YXR1cyk7CisJCQllaGNpLT5yZWNsYWltX3JlYWR5ID0gMTsKKwkJfQorCX0KKworIAkvKiBzdG9wIGFzeW5jIHByb2Nlc3NpbmcgYWZ0ZXIgaXQncyBpZGxlZCBhIGJpdCAqLwogCWlmICh0ZXN0X2JpdCAoVElNRVJfQVNZTkNfT0ZGLCAmZWhjaS0+YWN0aW9ucykpCiAJCXN0YXJ0X3VubGlua19hc3luYyAoZWhjaSwgZWhjaS0+YXN5bmMpOwogCkBAIC0zNDUsNiArMzMyLDggQEAKIHN0YXRpYyB2b2lkIGVoY2lfd29yayAoc3RydWN0IGVoY2lfaGNkICplaGNpKQogewogCXRpbWVyX2FjdGlvbl9kb25lIChlaGNpLCBUSU1FUl9JT19XQVRDSERPRyk7CisJaWYgKGVoY2ktPnJlY2xhaW1fcmVhZHkpCisJCWVuZF91bmxpbmtfYXN5bmMgKGVoY2kpOwogCiAJLyogYW5vdGhlciBDUFUgbWF5IGRyb3AgZWhjaS0+bG9jayBkdXJpbmcgYSBzY2hlZHVsZSBzY2FuIHdoaWxlCiAJICogaXQgcmVwb3J0cyB1cmIgY29tcGxldGlvbnMuICB0aGlzIGZsYWcgZ3VhcmRzIGFnYWluc3QgYm9ndXMKQEAgLTM3OSw3ICszNjgsNiBAQAogCiAJLyogbm8gbW9yZSBpbnRlcnJ1cHRzIC4uLiAqLwogCWRlbF90aW1lcl9zeW5jICgmZWhjaS0+d2F0Y2hkb2cpOwotCWRlbF90aW1lcl9zeW5jICgmZWhjaS0+aWFhX3dhdGNoZG9nKTsKIAogCXNwaW5fbG9ja19pcnEoJmVoY2ktPmxvY2spOwogCWlmIChIQ19JU19SVU5OSU5HIChoY2QtPnN0YXRlKSkKQEAgLTQyNiwxMCArNDE0LDYgQEAKIAllaGNpLT53YXRjaGRvZy5mdW5jdGlvbiA9IGVoY2lfd2F0Y2hkb2c7CiAJZWhjaS0+d2F0Y2hkb2cuZGF0YSA9ICh1bnNpZ25lZCBsb25nKSBlaGNpOwogCi0JaW5pdF90aW1lcigmZWhjaS0+aWFhX3dhdGNoZG9nKTsKLQllaGNpLT5pYWFfd2F0Y2hkb2cuZnVuY3Rpb24gPSBlaGNpX2lhYV93YXRjaGRvZzsKLQllaGNpLT5pYWFfd2F0Y2hkb2cuZGF0YSA9ICh1bnNpZ25lZCBsb25nKSBlaGNpOwotCiAJLyoKIAkgKiBodyBkZWZhdWx0OiAxSyBwZXJpb2RpYyBsaXN0IGhlYWRzLCBvbmUgcGVyIGZyYW1lLgogCSAqIHBlcmlvZGljX3NpemUgY2FuIHNocmluayBieSBVU0JDTUQgdXBkYXRlIGlmIGhjY19wYXJhbXMgYWxsb3dzLgpAQCAtNDQ2LDYgKzQzMCw3IEBACiAJCWVoY2ktPmlfdGhyZXNoID0gMiArIEhDQ19JU09DX1RIUkVTKGhjY19wYXJhbXMpOwogCiAJZWhjaS0+cmVjbGFpbSA9IE5VTEw7CisJZWhjaS0+cmVjbGFpbV9yZWFkeSA9IDA7CiAJZWhjaS0+bmV4dF91ZnJhbWUgPSAtMTsKIAogCS8qCkBAIC02MTksNyArNjA0LDcgQEAKIAkvKiBjb21wbGV0ZSB0aGUgdW5saW5raW5nIG9mIHNvbWUgcWggWzQuMTUuMi4zXSAqLwogCWlmIChzdGF0dXMgJiBTVFNfSUFBKSB7CiAJCUNPVU5UIChlaGNpLT5zdGF0cy5yZWNsYWltKTsKLQkJZW5kX3VubGlua19hc3luYyAoZWhjaSk7CisJCWVoY2ktPnJlY2xhaW1fcmVhZHkgPSAxOwogCQliaCA9IDE7CiAJfQogCkBAIC03MjMsMTQgKzcwOCwxMCBAQAogCiBzdGF0aWMgdm9pZCB1bmxpbmtfYXN5bmMgKHN0cnVjdCBlaGNpX2hjZCAqZWhjaSwgc3RydWN0IGVoY2lfcWggKnFoKQogewotCS8vIEJVR19PTihxaC0+cWhfc3RhdGUgIT0gUUhfU1RBVEVfTElOS0VEKTsKLQotCS8qIGZhaWxmYXN0ICovCi0JaWYgKCFIQ19JU19SVU5OSU5HIChlaGNpX3RvX2hjZChlaGNpKS0+c3RhdGUpKQotCQllbmRfdW5saW5rX2FzeW5jIChlaGNpKTsKLQotCS8qIGRlZmVyIHRpbGwgbGF0ZXIgaWYgYnVzeSAqLwotCWVsc2UgaWYgKGVoY2ktPnJlY2xhaW0pIHsKKwkvKiBpZiB3ZSBuZWVkIHRvIHVzZSBJQUEgYW5kIGl0J3MgYnVzeSwgZGVmZXIgKi8KKwlpZiAocWgtPnFoX3N0YXRlID09IFFIX1NUQVRFX0xJTktFRAorCQkJJiYgZWhjaS0+cmVjbGFpbQorCQkJJiYgSENfSVNfUlVOTklORyAoZWhjaV90b19oY2QoZWhjaSktPnN0YXRlKSkgewogCQlzdHJ1Y3QgZWhjaV9xaAkJKmxhc3Q7CiAKIAkJZm9yIChsYXN0ID0gZWhjaS0+cmVjbGFpbTsKQEAgLTc0MCw4ICs3MjEsMTIgQEAKIAkJcWgtPnFoX3N0YXRlID0gUUhfU1RBVEVfVU5MSU5LX1dBSVQ7CiAJCWxhc3QtPnJlY2xhaW0gPSBxaDsKIAotCS8qIHN0YXJ0IElBQSBjeWNsZSAqLwotCX0gZWxzZQorCS8qIGJ5cGFzcyBJQUEgaWYgdGhlIGhjIGNhbid0IGNhcmUgKi8KKwl9IGVsc2UgaWYgKCFIQ19JU19SVU5OSU5HIChlaGNpX3RvX2hjZChlaGNpKS0+c3RhdGUpICYmIGVoY2ktPnJlY2xhaW0pCisJCWVuZF91bmxpbmtfYXN5bmMgKGVoY2kpOworCisJLyogc29tZXRoaW5nIGVsc2UgbWlnaHQgaGF2ZSB1bmxpbmtlZCB0aGUgcWggYnkgbm93ICovCisJaWYgKHFoLT5xaF9zdGF0ZSA9PSBRSF9TVEFURV9MSU5LRUQpCiAJCXN0YXJ0X3VubGlua19hc3luYyAoZWhjaSwgcWgpOwogfQogCkBAIC03NjMsMTkgKzc0OCw3IEBACiAJCXFoID0gKHN0cnVjdCBlaGNpX3FoICopIHVyYi0+aGNwcml2OwogCQlpZiAoIXFoKQogCQkJYnJlYWs7Ci0JCXN3aXRjaCAocWgtPnFoX3N0YXRlKSB7Ci0JCWNhc2UgUUhfU1RBVEVfTElOS0VEOgotCQljYXNlIFFIX1NUQVRFX0NPTVBMRVRJTkc6Ci0JCQl1bmxpbmtfYXN5bmMgKGVoY2ksIHFoKTsKLQkJCWJyZWFrOwotCQljYXNlIFFIX1NUQVRFX1VOTElOSzoKLQkJY2FzZSBRSF9TVEFURV9VTkxJTktfV0FJVDoKLQkJCS8qIGFscmVhZHkgc3RhcnRlZCAqLwotCQkJYnJlYWs7Ci0JCWNhc2UgUUhfU1RBVEVfSURMRToKLQkJCVdBUk5fT04oMSk7Ci0JCQlicmVhazsKLQkJfQorCQl1bmxpbmtfYXN5bmMgKGVoY2ksIHFoKTsKIAkJYnJlYWs7CiAKIAljYXNlIFBJUEVfSU5URVJSVVBUOgpAQCAtODY3LDcgKzg0MCw2IEBACiAJCXVubGlua19hc3luYyAoZWhjaSwgcWgpOwogCQkvKiBGQUxMIFRIUk9VR0ggKi8KIAljYXNlIFFIX1NUQVRFX1VOTElOSzoJCS8qIHdhaXQgZm9yIGh3IHRvIGZpbmlzaD8gKi8KLQljYXNlIFFIX1NUQVRFX1VOTElOS19XQUlUOgogaWRsZV90aW1lb3V0OgogCQlzcGluX3VubG9ja19pcnFyZXN0b3JlICgmZWhjaS0+bG9jaywgZmxhZ3MpOwogCQlzY2hlZHVsZV90aW1lb3V0X3VuaW50ZXJydXB0aWJsZSgxKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2hvc3QvZWhjaS1odWIuYyBiL2RyaXZlcnMvdXNiL2hvc3QvZWhjaS1odWIuYwppbmRleCAyMDEyMjEzLi4xYjIwNzIyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9ob3N0L2VoY2ktaHViLmMKKysrIGIvZHJpdmVycy91c2IvaG9zdC9laGNpLWh1Yi5jCkBAIC00OCw3ICs0OCw3IEBACiAJfQogCWVoY2ktPmNvbW1hbmQgPSByZWFkbCAoJmVoY2ktPnJlZ3MtPmNvbW1hbmQpOwogCWlmIChlaGNpLT5yZWNsYWltKQotCQllbmRfdW5saW5rX2FzeW5jIChlaGNpKTsKKwkJZWhjaS0+cmVjbGFpbV9yZWFkeSA9IDE7CiAJZWhjaV93b3JrKGVoY2kpOwogCiAJLyogc3VzcGVuZCBhbnkgYWN0aXZlL3Vuc3VzcGVuZGVkIHBvcnRzLCBtYXliZSBhbGxvdyB3YWtldXAgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2hvc3QvZWhjaS1wY2kuYyBiL2RyaXZlcnMvdXNiL2hvc3QvZWhjaS1wY2kuYwppbmRleCAzNWUzZmFiLi5lNTFjMWVkOCAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvaG9zdC9laGNpLXBjaS5jCisrKyBiL2RyaXZlcnMvdXNiL2hvc3QvZWhjaS1wY2kuYwpAQCAtMzAzLDcgKzMwMyw3IEBACiAJLyogZW1wdHlpbmcgdGhlIHNjaGVkdWxlIGFib3J0cyBhbnkgdXJicyAqLwogCXNwaW5fbG9ja19pcnEoJmVoY2ktPmxvY2spOwogCWlmIChlaGNpLT5yZWNsYWltKQotCQllbmRfdW5saW5rX2FzeW5jIChlaGNpKTsKKwkJZWhjaS0+cmVjbGFpbV9yZWFkeSA9IDE7CiAJZWhjaV93b3JrKGVoY2kpOwogCXNwaW5fdW5sb2NrX2lycSgmZWhjaS0+bG9jayk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2hvc3QvZWhjaS1xLmMgYi9kcml2ZXJzL3VzYi9ob3N0L2VoY2ktcS5jCmluZGV4IDQ2MzI3MjcuLjYyZTQ2ZGMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2hvc3QvZWhjaS1xLmMKKysrIGIvZHJpdmVycy91c2IvaG9zdC9laGNpLXEuYwpAQCAtOTY3LDcgKzk2Nyw3IEBACiAJc3RydWN0IGVoY2lfcWgJCSpxaCA9IGVoY2ktPnJlY2xhaW07CiAJc3RydWN0IGVoY2lfcWgJCSpuZXh0OwogCi0JaWFhX3dhdGNoZG9nX2RvbmUgKGVoY2kpOworCXRpbWVyX2FjdGlvbl9kb25lIChlaGNpLCBUSU1FUl9JQUFfV0FUQ0hET0cpOwogCiAJLy8gcWgtPmh3X25leHQgPSBjcHVfdG9fbGUzMiAocWgtPnFoX2RtYSk7CiAJcWgtPnFoX3N0YXRlID0gUUhfU1RBVEVfSURMRTsKQEAgLTk3Nyw2ICs5NzcsNyBAQAogCS8qIG90aGVyIHVubGluayhzKSBtYXkgYmUgcGVuZGluZyAoaW4gUUhfU1RBVEVfVU5MSU5LX1dBSVQpICovCiAJbmV4dCA9IHFoLT5yZWNsYWltOwogCWVoY2ktPnJlY2xhaW0gPSBuZXh0OworCWVoY2ktPnJlY2xhaW1fcmVhZHkgPSAwOwogCXFoLT5yZWNsYWltID0gTlVMTDsKIAogCXFoX2NvbXBsZXRpb25zIChlaGNpLCBxaCk7CkBAIC0xMDUxLDEwICsxMDUyLDExIEBACiAJCXJldHVybjsKIAl9CiAKKwllaGNpLT5yZWNsYWltX3JlYWR5ID0gMDsKIAljbWQgfD0gQ01EX0lBQUQ7CiAJd3JpdGVsIChjbWQsICZlaGNpLT5yZWdzLT5jb21tYW5kKTsKIAkodm9pZCkgcmVhZGwgKCZlaGNpLT5yZWdzLT5jb21tYW5kKTsKLQlpYWFfd2F0Y2hkb2dfc3RhcnQgKGVoY2kpOworCXRpbWVyX2FjdGlvbiAoZWhjaSwgVElNRVJfSUFBX1dBVENIRE9HKTsKIH0KIAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2hvc3QvZWhjaS5oIGIvZHJpdmVycy91c2IvaG9zdC9laGNpLmgKaW5kZXggNmFhYzM5Zi4uYmJjMzA4MiAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvaG9zdC9laGNpLmgKKysrIGIvZHJpdmVycy91c2IvaG9zdC9laGNpLmgKQEAgLTU4LDYgKzU4LDcgQEAKIAkvKiBhc3luYyBzY2hlZHVsZSBzdXBwb3J0ICovCiAJc3RydWN0IGVoY2lfcWgJCSphc3luYzsKIAlzdHJ1Y3QgZWhjaV9xaAkJKnJlY2xhaW07CisJdW5zaWduZWQJCXJlY2xhaW1fcmVhZHkgOiAxOwogCXVuc2lnbmVkCQlzY2FubmluZyA6IDE7CiAKIAkvKiBwZXJpb2RpYyBzY2hlZHVsZSBzdXBwb3J0ICovCkBAIC04MCw3ICs4MSw2IEBACiAJc3RydWN0IGRtYV9wb29sCQkqaXRkX3Bvb2w7CS8qIGl0ZCBwZXIgaXNvIHVyYiAqLwogCXN0cnVjdCBkbWFfcG9vbAkJKnNpdGRfcG9vbDsJLyogc2l0ZCBwZXIgc3BsaXQgaXNvIHVyYiAqLwogCi0Jc3RydWN0IHRpbWVyX2xpc3QJaWFhX3dhdGNoZG9nOwogCXN0cnVjdCB0aW1lcl9saXN0CXdhdGNoZG9nOwogCXVuc2lnbmVkIGxvbmcJCWFjdGlvbnM7CiAJdW5zaWduZWQJCXN0YW1wOwpAQCAtMTE0LDIxICsxMTQsOSBAQAogfQogCiAKLXN0YXRpYyBpbmxpbmUgdm9pZAotaWFhX3dhdGNoZG9nX3N0YXJ0IChzdHJ1Y3QgZWhjaV9oY2QgKmVoY2kpCi17Ci0JV0FSTl9PTih0aW1lcl9wZW5kaW5nKCZlaGNpLT5pYWFfd2F0Y2hkb2cpKTsKLQltb2RfdGltZXIgKCZlaGNpLT5pYWFfd2F0Y2hkb2csCi0JCQlqaWZmaWVzICsgbXNlY3NfdG9famlmZmllcyhFSENJX0lBQV9NU0VDUykpOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgaWFhX3dhdGNoZG9nX2RvbmUgKHN0cnVjdCBlaGNpX2hjZCAqZWhjaSkKLXsKLQlkZWxfdGltZXIgKCZlaGNpLT5pYWFfd2F0Y2hkb2cpOwotfQotCiBlbnVtIGVoY2lfdGltZXJfYWN0aW9uIHsKIAlUSU1FUl9JT19XQVRDSERPRywKKwlUSU1FUl9JQUFfV0FUQ0hET0csCiAJVElNRVJfQVNZTkNfU0hSSU5LLAogCVRJTUVSX0FTWU5DX09GRiwKIH07CkBAIC0xNDYsNiArMTM0LDkgQEAKIAkJdW5zaWduZWQgbG9uZyB0OwogCiAJCXN3aXRjaCAoYWN0aW9uKSB7CisJCWNhc2UgVElNRVJfSUFBX1dBVENIRE9HOgorCQkJdCA9IEVIQ0lfSUFBX0pJRkZJRVM7CisJCQlicmVhazsKIAkJY2FzZSBUSU1FUl9JT19XQVRDSERPRzoKIAkJCXQgPSBFSENJX0lPX0pJRkZJRVM7CiAJCQlicmVhazsKQEAgLTE2Miw3ICsxNTMsOCBAQAogCQkvLyBhc3luYyBxdWV1ZSBTSFJJTksgb2Z0ZW4gcHJlY2VkZXMgSUFBLiAgd2hpbGUgaXQncyByZWFkeQogCQkvLyB0byBnbyBPRkYgbmVpdGhlciBjYW4gbWF0dGVyLCBhbmQgYWZ0ZXJ3YXJkcyB0aGUgSU8KIAkJLy8gd2F0Y2hkb2cgc3RvcHMgdW5sZXNzIHRoZXJlJ3Mgc3RpbGwgcGVyaW9kaWMgdHJhZmZpYy4KLQkJaWYgKHRpbWVfYmVmb3JlX2VxKHQsIGVoY2ktPndhdGNoZG9nLmV4cGlyZXMpCisJCWlmIChhY3Rpb24gIT0gVElNRVJfSUFBX1dBVENIRE9HCisJCQkJJiYgdCA+IGVoY2ktPndhdGNoZG9nLmV4cGlyZXMKIAkJCQkmJiB0aW1lcl9wZW5kaW5nICgmZWhjaS0+d2F0Y2hkb2cpKQogCQkJcmV0dXJuOwogCQltb2RfdGltZXIgKCZlaGNpLT53YXRjaGRvZywgdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9ob3N0L29oY2ktaGNkLmMgYi9kcml2ZXJzL3VzYi9ob3N0L29oY2ktaGNkLmMKaW5kZXggOWJlNmIzMC4uZWE0NzE0ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvaG9zdC9vaGNpLWhjZC5jCisrKyBiL2RyaXZlcnMvdXNiL2hvc3Qvb2hjaS1oY2QuYwpAQCAtNzE1LDEzICs3MTUsNiBAQAogCQlyZXR1cm4gSVJRX05PVE1JTkU7CiAJfQogCi0JaWYgKGludHMgJiBPSENJX0lOVFJfUkhTQykgewotCQlvaGNpX3ZkYmcgKG9oY2ksICJyaHNjXG4iKTsKLQkJb2hjaS0+bmV4dF9zdGF0ZWNoYW5nZSA9IGppZmZpZXMgKyBTVEFURUNIQU5HRV9ERUxBWTsKLQkJb2hjaV93cml0ZWwgKG9oY2ksIE9IQ0lfSU5UUl9SSFNDLCAmcmVncy0+aW50cnN0YXR1cyk7Ci0JCXVzYl9oY2RfcG9sbF9yaF9zdGF0dXMoaGNkKTsKLQl9Ci0KIAlpZiAoaW50cyAmIE9IQ0lfSU5UUl9VRSkgewogCQlkaXNhYmxlIChvaGNpKTsKIAkJb2hjaV9lcnIgKG9oY2ksICJPSENJIFVucmVjb3ZlcmFibGUgRXJyb3IsIGRpc2FibGVkXG4iKTsKQEAgLTczMSw5ICs3MjQsMjEgQEAKIAkJb2hjaV91c2JfcmVzZXQgKG9oY2kpOwogCX0KIAotCWlmIChpbnRzICYgT0hDSV9JTlRSX1JEKSB7Ci0JCW9oY2lfdmRiZyAob2hjaSwgInJlc3VtZSBkZXRlY3RcbiIpOwotCQlvaGNpX3dyaXRlbCAob2hjaSwgT0hDSV9JTlRSX1JELCAmcmVncy0+aW50cnN0YXR1cyk7CisJaWYgKGludHMgJiBPSENJX0lOVFJfUkhTQykgeworCQlvaGNpX3ZkYmcob2hjaSwgInJoc2NcbiIpOworCQlvaGNpLT5uZXh0X3N0YXRlY2hhbmdlID0gamlmZmllcyArIFNUQVRFQ0hBTkdFX0RFTEFZOworCQlvaGNpX3dyaXRlbChvaGNpLCBPSENJX0lOVFJfUkQgfCBPSENJX0lOVFJfUkhTQywKKwkJCQkmcmVncy0+aW50cnN0YXR1cyk7CisJCXVzYl9oY2RfcG9sbF9yaF9zdGF0dXMoaGNkKTsKKwl9CisKKwkvKiBGb3IgY29ubmVjdCBhbmQgZGlzY29ubmVjdCBldmVudHMsIHdlIGV4cGVjdCB0aGUgY29udHJvbGxlcgorCSAqIHRvIHR1cm4gb24gUkhTQyBhbG9uZyB3aXRoIFJELiAgQnV0IGZvciByZW1vdGUgd2FrZXVwIGV2ZW50cworCSAqIHRoaXMgbWlnaHQgbm90IGhhcHBlbi4KKwkgKi8KKwllbHNlIGlmIChpbnRzICYgT0hDSV9JTlRSX1JEKSB7CisJCW9oY2lfdmRiZyhvaGNpLCAicmVzdW1lIGRldGVjdFxuIik7CisJCW9oY2lfd3JpdGVsKG9oY2ksIE9IQ0lfSU5UUl9SRCwgJnJlZ3MtPmludHJzdGF0dXMpOwogCQloY2QtPnBvbGxfcmggPSAxOwogCQlpZiAob2hjaS0+YXV0b3N0b3ApIHsKIAkJCXNwaW5fbG9jayAoJm9oY2ktPmxvY2spOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvaG9zdC9vaGNpLWh1Yi5jIGIvZHJpdmVycy91c2IvaG9zdC9vaGNpLWh1Yi5jCmluZGV4IDZmMTEzNTkuLjY5OTVlYTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2hvc3Qvb2hjaS1odWIuYworKysgYi9kcml2ZXJzL3VzYi9ob3N0L29oY2ktaHViLmMKQEAgLTE2OSw3ICsxNjksOCBAQAogCQlicmVhazsKIAljYXNlIE9IQ0lfVVNCX1JFU1VNRToKIAkJLyogSENGUyBjaGFuZ2VzIHNvbWV0aW1lIGFmdGVyIElOVFJfUkQgKi8KLQkJb2hjaV9pbmZvIChvaGNpLCAid2FrZXVwXG4iKTsKKwkJb2hjaV9pbmZvKG9oY2ksICIlc3dha2V1cFxuIiwKKwkJCQlhdXRvc3RvcHBlZCA/ICJhdXRvLSIgOiAiIik7CiAJCWJyZWFrOwogCWNhc2UgT0hDSV9VU0JfT1BFUjoKIAkJLyogdGhpcyBjYW4gaGFwcGVuIGFmdGVyIHJlc3VtaW5nIGEgc3dzdXNwIHNuYXBzaG90ICovCkBAIC00MjIsNyArNDIzLDggQEAKIAkJCQlvaGNpLT5hdXRvc3RvcCA9IDA7CiAJCQkJb2hjaS0+bmV4dF9zdGF0ZWNoYW5nZSA9IGppZmZpZXMgKwogCQkJCQkJU1RBVEVDSEFOR0VfREVMQVk7Ci0JCQl9IGVsc2UgaWYgKHRpbWVfYWZ0ZXJfZXEgKGppZmZpZXMsCisJCQl9IGVsc2UgaWYgKGRldmljZV9tYXlfd2FrZXVwKCZoY2QtPnNlbGYucm9vdF9odWItPmRldikKKwkJCQkJJiYgdGltZV9hZnRlcl9lcShqaWZmaWVzLAogCQkJCQkJb2hjaS0+bmV4dF9zdGF0ZWNoYW5nZSkKIAkJCQkJJiYgIW9oY2ktPmVkX3JtX2xpc3QKIAkJCQkJJiYgIShvaGNpLT5oY19jb250cm9sICYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2hvc3Qvb2hjaS1wbng0MDA4LmMgYi9kcml2ZXJzL3VzYi9ob3N0L29oY2ktcG54NDAwOC5jCmluZGV4IDgyY2IyMmYuLjJkYmI3NzQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2hvc3Qvb2hjaS1wbng0MDA4LmMKKysrIGIvZHJpdmVycy91c2IvaG9zdC9vaGNpLXBueDQwMDguYwpAQCAtMjYyLDYgKzI2Miw3IEBACiAJICovCiAJLnN0YXJ0ID0gb2hjaV9wbng0MDA4X3N0YXJ0LAogCS5zdG9wID0gb2hjaV9zdG9wLAorCS5zaHV0ZG93biA9IG9oY2lfc2h1dGRvd24sCiAKIAkvKgogCSAqIG1hbmFnaW5nIGkvbyByZXF1ZXN0cyBhbmQgYXNzb2NpYXRlZCBkZXZpY2UgcmVzb3VyY2VzCkBAIC0yODAsNyArMjgxLDExIEBACiAJICovCiAJLmh1Yl9zdGF0dXNfZGF0YSA9IG9oY2lfaHViX3N0YXR1c19kYXRhLAogCS5odWJfY29udHJvbCA9IG9oY2lfaHViX2NvbnRyb2wsCi0KKwkuaHViX2lycV9lbmFibGUgPSBvaGNpX3Joc2NfZW5hYmxlLAorI2lmZGVmCUNPTkZJR19QTQorCS5idXNfc3VzcGVuZCA9IG9oY2lfYnVzX3N1c3BlbmQsCisJLmJ1c19yZXN1bWUgPSBvaGNpX2J1c19yZXN1bWUsCisjZW5kaWYKIAkuc3RhcnRfcG9ydF9yZXNldCA9IG9oY2lfc3RhcnRfcG9ydF9yZXNldCwKIH07CiAKQEAgLTQxMCw4ICs0MTUsNiBAQAogCQlnb3RvIG91dDQ7CiAJfQogCi0JaGNkLT5zZWxmLmhjcHJpdiA9ICh2b2lkICopaGNkOwotCiAJcG54NDAwOF9zdGFydF9oYygpOwogCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIGhjZCk7CiAJb2hjaSA9IGhjZF90b19vaGNpKGhjZCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9ob3N0L3VoY2ktaGNkLmMgYi9kcml2ZXJzL3VzYi9ob3N0L3VoY2ktaGNkLmMKaW5kZXggNDVlZTY5Mi4uMjI2YmYzZCAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvaG9zdC91aGNpLWhjZC5jCisrKyBiL2RyaXZlcnMvdXNiL2hvc3QvdWhjaS1oY2QuYwpAQCAtNDAsNiArNDAsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+CiAjaW5jbHVkZSA8bGludXgvdXNiLmg+CiAjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CisjaW5jbHVkZSA8bGludXgvZG1pLmg+CiAKICNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgogI2luY2x1ZGUgPGFzbS9pby5oPgpAQCAtMTk2LDEyICsxOTcsNDIgQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIGludCByZW1vdGVfd2FrZXVwX2lzX2Jyb2tlbihzdHJ1Y3QgdWhjaV9oY2QgKnVoY2kpCit7CisJc3RhdGljIHN0cnVjdCBkbWlfc3lzdGVtX2lkIGJyb2tlbl93YWtldXBfdGFibGVbXSA9IHsKKwkJeworCQkJLmlkZW50ID0gIkFzdXMgQTdWOFgiLAorCQkJLm1hdGNoZXMgPSB7CisJCQkJRE1JX01BVENIKERNSV9CT0FSRF9WRU5ET1IsICJBU1VTVGVLIiksCisJCQkJRE1JX01BVENIKERNSV9CT0FSRF9OQU1FLCAiQTdWOFgiKSwKKwkJCQlETUlfTUFUQ0goRE1JX0JPQVJEX1ZFUlNJT04sICJSRVYgMS54eCIpLAorCQkJfQorCQl9LAorCQl7IH0KKwl9OworCWludCBwb3J0OworCisJLyogT25lIG9mIEFzdXMncyBtb3RoZXJib2FyZHMgaGFzIGEgYnVnIHdoaWNoIGNhdXNlcyBpdCB0bworCSAqIHdha2UgdXAgaW1tZWRpYXRlbHkgZnJvbSBzdXNwZW5kLXRvLVJBTSBpZiBhbnkgb2YgdGhlIHBvcnRzCisJICogYXJlIGNvbm5lY3RlZC4gIEluIHN1Y2ggY2FzZXMgd2Ugd2lsbCBub3Qgc2V0IEVHU00uCisJICovCisJaWYgKGRtaV9jaGVja19zeXN0ZW0oYnJva2VuX3dha2V1cF90YWJsZSkpIHsKKwkJZm9yIChwb3J0ID0gMDsgcG9ydCA8IHVoY2ktPnJoX251bXBvcnRzOyArK3BvcnQpIHsKKwkJCWlmIChpbncodWhjaS0+aW9fYWRkciArIFVTQlBPUlRTQzEgKyBwb3J0ICogMikgJgorCQkJCQlVU0JQT1JUU0NfQ0NTKQorCQkJCXJldHVybiAxOworCQl9CisJfQorCisJcmV0dXJuIDA7Cit9CisKIHN0YXRpYyB2b2lkIHN1c3BlbmRfcmgoc3RydWN0IHVoY2lfaGNkICp1aGNpLCBlbnVtIHVoY2lfcmhfc3RhdGUgbmV3X3N0YXRlKQogX19yZWxlYXNlcyh1aGNpLT5sb2NrKQogX19hY3F1aXJlcyh1aGNpLT5sb2NrKQogewogCWludCBhdXRvX3N0b3A7Ci0JaW50IGludF9lbmFibGU7CisJaW50IGludF9lbmFibGUsIGVnc21fZW5hYmxlOwogCiAJYXV0b19zdG9wID0gKG5ld19zdGF0ZSA9PSBVSENJX1JIX0FVVE9fU1RPUFBFRCk7CiAJZGV2X2RiZygmdWhjaV90b19oY2QodWhjaSktPnNlbGYucm9vdF9odWItPmRldiwKQEAgLTIxNywxNSArMjQ4LDE4IEBACiAJfQogCiAJLyogRW5hYmxlIHJlc3VtZS1kZXRlY3QgaW50ZXJydXB0cyBpZiB0aGV5IHdvcmsuCi0JICogVGhlbiBlbnRlciBHbG9iYWwgU3VzcGVuZCBtb2RlLCBzdGlsbCBjb25maWd1cmVkLgorCSAqIFRoZW4gZW50ZXIgR2xvYmFsIFN1c3BlbmQgbW9kZSBpZiBfaXRfIHdvcmtzLCBzdGlsbCBjb25maWd1cmVkLgogCSAqLworCWVnc21fZW5hYmxlID0gVVNCQ01EX0VHU007CiAJdWhjaS0+d29ya2luZ19SRCA9IDE7CiAJaW50X2VuYWJsZSA9IFVTQklOVFJfUkVTVU1FOwotCWlmIChyZXN1bWVfZGV0ZWN0X2ludGVycnVwdHNfYXJlX2Jyb2tlbih1aGNpKSkgeworCWlmIChyZW1vdGVfd2FrZXVwX2lzX2Jyb2tlbih1aGNpKSkKKwkJZWdzbV9lbmFibGUgPSAwOworCWlmIChyZXN1bWVfZGV0ZWN0X2ludGVycnVwdHNfYXJlX2Jyb2tlbih1aGNpKSB8fCAhZWdzbV9lbmFibGUpCiAJCXVoY2ktPndvcmtpbmdfUkQgPSBpbnRfZW5hYmxlID0gMDsKLQl9CisKIAlvdXR3KGludF9lbmFibGUsIHVoY2ktPmlvX2FkZHIgKyBVU0JJTlRSKTsKLQlvdXR3KFVTQkNNRF9FR1NNIHwgVVNCQ01EX0NGLCB1aGNpLT5pb19hZGRyICsgVVNCQ01EKTsKKwlvdXR3KGVnc21fZW5hYmxlIHwgVVNCQ01EX0NGLCB1aGNpLT5pb19hZGRyICsgVVNCQ01EKTsKIAltYigpOwogCXVkZWxheSg1KTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvaW5wdXQvS2NvbmZpZyBiL2RyaXZlcnMvdXNiL2lucHV0L0tjb25maWcKaW5kZXggMjFjZDIyNi4uMjBkYjM2NCAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvaW5wdXQvS2NvbmZpZworKysgYi9kcml2ZXJzL3VzYi9pbnB1dC9LY29uZmlnCkBAIC0zNDgsMTMgKzM0OCwzIEBACiAKIAkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZQogCSAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIGFwcGxldG91Y2guCi0KLWNvbmZpZyBVU0JfVFJBTkNFVklCUkFUT1IKLQl0cmlzdGF0ZSAiUGxheVN0YXRpb24gMiBUcmFuY2UgVmlicmF0b3IgZHJpdmVyIHN1cHBvcnQiCi0JZGVwZW5kcyBvbiBVU0IKLQloZWxwCi0JICBTYXkgWSBoZXJlIGlmIHlvdSB3YW50IHRvIGNvbm5lY3QgYSBQbGF5U3RhdGlvbiAyIFRyYW5jZSBWaWJyYXRvcgotCSAgZGV2aWNlIHRvIHlvdXIgY29tcHV0ZXIncyBVU0IgcG9ydC4KLQotCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlCi0JICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgdHJhbmNldmlicmF0b3IuCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9pbnB1dC9NYWtlZmlsZSBiL2RyaXZlcnMvdXNiL2lucHV0L01ha2VmaWxlCmluZGV4IDI5NWY0NTkuLmQ5NDZkNTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2lucHV0L01ha2VmaWxlCisrKyBiL2RyaXZlcnMvdXNiL2lucHV0L01ha2VmaWxlCkBAIC0zLDcgKzMsNyBAQAogIwogCiAjIE11bHRpcGFydCBvYmplY3RzLgotd2Fjb20tb2Jqcwk6PSB3YWNvbV9zeXMubyB3YWNvbV93YWMubword2Fjb20tb2Jqcwk6PSB3YWNvbV93YWMubyB3YWNvbV9zeXMubwogdXNiaGlkLW9ianMJOj0gaGlkLWNvcmUubwogCiAjIE9wdGlvbmFsIHBhcnRzIG9mIG11bHRpcGFydCBvYmplY3RzLgpAQCAtNDgsNyArNDgsNiBAQAogb2JqLSQoQ09ORklHX1VTQl9ZRUFMSU5LKQkrPSB5ZWFsaW5rLm8KIG9iai0kKENPTkZJR19VU0JfWFBBRCkJCSs9IHhwYWQubwogb2JqLSQoQ09ORklHX1VTQl9BUFBMRVRPVUNIKQkrPSBhcHBsZXRvdWNoLm8KLW9iai0kKENPTkZJR19VU0JfVFJBTkNFVklCUkFUT1IpCSs9IHRyYW5jZXZpYnJhdG9yLm8KIAogaWZlcSAoJChDT05GSUdfVVNCX0RFQlVHKSx5KQogRVhUUkFfQ0ZMQUdTICs9IC1EREVCVUcKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2lucHV0L2hpZC1jb3JlLmMgYi9kcml2ZXJzL3VzYi9pbnB1dC9oaWQtY29yZS5jCmluZGV4IGE2NzM4YTguLjZkMDhhM2IgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2lucHV0L2hpZC1jb3JlLmMKKysrIGIvZHJpdmVycy91c2IvaW5wdXQvaGlkLWNvcmUuYwpAQCAtMjcwLDcgKzI3MCw3IEBACiAgKiBSZWFkIGRhdGEgdmFsdWUgZnJvbSBpdGVtLgogICovCiAKLXN0YXRpYyBfX2lubGluZV9fIF9fdTMyIGl0ZW1fdWRhdGEoc3RydWN0IGhpZF9pdGVtICppdGVtKQorc3RhdGljIHUzMiBpdGVtX3VkYXRhKHN0cnVjdCBoaWRfaXRlbSAqaXRlbSkKIHsKIAlzd2l0Y2ggKGl0ZW0tPnNpemUpIHsKIAkJY2FzZSAxOiByZXR1cm4gaXRlbS0+ZGF0YS51ODsKQEAgLTI4MCw3ICsyODAsNyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgX19pbmxpbmVfXyBfX3MzMiBpdGVtX3NkYXRhKHN0cnVjdCBoaWRfaXRlbSAqaXRlbSkKK3N0YXRpYyBzMzIgaXRlbV9zZGF0YShzdHJ1Y3QgaGlkX2l0ZW0gKml0ZW0pCiB7CiAJc3dpdGNoIChpdGVtLT5zaXplKSB7CiAJCWNhc2UgMTogcmV0dXJuIGl0ZW0tPmRhdGEuczg7CkBAIC03MjcsNyArNzI3LDcgQEAKICAqIGRvbmUgYnkgaGFuZC4KICAqLwogCi1zdGF0aWMgX19pbmxpbmVfXyBfX3MzMiBzbnRvMzIoX191MzIgdmFsdWUsIHVuc2lnbmVkIG4pCitzdGF0aWMgczMyIHNudG8zMihfX3UzMiB2YWx1ZSwgdW5zaWduZWQgbikKIHsKIAlzd2l0Y2ggKG4pIHsKIAkJY2FzZSA4OiAgcmV0dXJuICgoX19zOCl2YWx1ZSk7CkBAIC03NDEsMzAgKzc0MSw2NSBAQAogICogQ29udmVydCBhIHNpZ25lZCAzMi1iaXQgaW50ZWdlciB0byBhIHNpZ25lZCBuLWJpdCBpbnRlZ2VyLgogICovCiAKLXN0YXRpYyBfX2lubGluZV9fIF9fdTMyIHMzMnRvbihfX3MzMiB2YWx1ZSwgdW5zaWduZWQgbikKK3N0YXRpYyB1MzIgczMydG9uKF9fczMyIHZhbHVlLCB1bnNpZ25lZCBuKQogewotCV9fczMyIGEgPSB2YWx1ZSA+PiAobiAtIDEpOworCXMzMiBhID0gdmFsdWUgPj4gKG4gLSAxKTsKIAlpZiAoYSAmJiBhICE9IC0xKQogCQlyZXR1cm4gdmFsdWUgPCAwID8gMSA8PCAobiAtIDEpIDogKDEgPDwgKG4gLSAxKSkgLSAxOwogCXJldHVybiB2YWx1ZSAmICgoMSA8PCBuKSAtIDEpOwogfQogCiAvKgotICogRXh0cmFjdC9pbXBsZW1lbnQgYSBkYXRhIGZpZWxkIGZyb20vdG8gYSByZXBvcnQuCisgKiBFeHRyYWN0L2ltcGxlbWVudCBhIGRhdGEgZmllbGQgZnJvbS90byBhIGxpdHRsZSBlbmRpYW4gcmVwb3J0IChiaXQgYXJyYXkpLgorICoKKyAqIENvZGUgc29ydC1vZiBmb2xsb3dzIEhJRCBzcGVjOgorICogICAgIGh0dHA6Ly93d3cudXNiLm9yZy9kZXZlbG9wZXJzL2RldmNsYXNzX2RvY3MvSElEMV8xMS5wZGYKKyAqCisgKiBXaGlsZSB0aGUgVVNCIEhJRCBzcGVjIGFsbG93cyB1bmxpbWl0ZWQgbGVuZ3RoIGJpdCBmaWVsZHMgaW4gInJlcG9ydAorICogZGVzY3JpcHRvcnMiLCBtb3N0IGRldmljZXMgbmV2ZXIgdXNlIG1vcmUgdGhhbiAxNiBiaXRzLgorICogT25lIG1vZGVsIG9mIFVQUyBpcyBjbGFpbWVkIHRvIHJlcG9ydCAiTElORVYiIGFzIGEgMzItYml0IGZpZWxkLgorICogU2VhcmNoIGxpbnV4LWtlcm5lbCBhbmQgbGludXgtdXNiLWRldmVsIGFyY2hpdmVzIGZvciAiaGlkLWNvcmUgZXh0cmFjdCIuCiAgKi8KIAogc3RhdGljIF9faW5saW5lX18gX191MzIgZXh0cmFjdChfX3U4ICpyZXBvcnQsIHVuc2lnbmVkIG9mZnNldCwgdW5zaWduZWQgbikKIHsKLQlyZXBvcnQgKz0gKG9mZnNldCA+PiA1KSA8PCAyOyBvZmZzZXQgJj0gMzE7Ci0JcmV0dXJuIChsZTY0X3RvX2NwdShnZXRfdW5hbGlnbmVkKChfX2xlNjQqKXJlcG9ydCkpID4+IG9mZnNldCkgJiAoKDFVTEwgPDwgbikgLSAxKTsKKwl1NjQgeDsKKworCVdBUk5fT04obiA+IDMyKTsKKworCXJlcG9ydCArPSBvZmZzZXQgPj4gMzsgIC8qIGFkanVzdCBieXRlIGluZGV4ICovCisJb2Zmc2V0ICY9IDc7CQkvKiBub3cgb25seSBuZWVkIGJpdCBvZmZzZXQgaW50byBvbmUgYnl0ZSAqLworCXggPSBnZXRfdW5hbGlnbmVkKCh1NjQgKikgcmVwb3J0KTsKKwl4ID0gbGU2NF90b19jcHUoeCk7CisJeCA9ICh4ID4+IG9mZnNldCkgJiAoKDFVTEwgPDwgbikgLSAxKTsJLyogZXh0cmFjdCBiaXQgZmllbGQgKi8KKwlyZXR1cm4gKHUzMikgeDsKIH0KIAorLyoKKyAqICJpbXBsZW1lbnQiIDogc2V0IGJpdHMgaW4gYSBsaXR0bGUgZW5kaWFuIGJpdCBzdHJlYW0uCisgKiBTYW1lIGNvbmNlcHRzIGFzICJleHRyYWN0IiAoc2VlIGNvbW1lbnRzIGFib3ZlKS4KKyAqIFRoZSBkYXRhIG1hbmdsZWQgaW4gdGhlIGJpdCBzdHJlYW0gcmVtYWlucyBpbiBsaXR0bGUgZW5kaWFuCisgKiBvcmRlciB0aGUgd2hvbGUgdGltZS4gSXQgbWFrZSBtb3JlIHNlbnNlIHRvIHRhbGsgYWJvdXQKKyAqIGVuZGlhbm5lc3Mgb2YgcmVnaXN0ZXIgdmFsdWVzIGJ5IGNvbnNpZGVyaW5nIGEgcmVnaXN0ZXIKKyAqIGEgImNhY2hlZCIgY29weSBvZiB0aGUgbGl0dGxlIGVuZGlhZCBiaXQgc3RyZWFtLgorICovCiBzdGF0aWMgX19pbmxpbmVfXyB2b2lkIGltcGxlbWVudChfX3U4ICpyZXBvcnQsIHVuc2lnbmVkIG9mZnNldCwgdW5zaWduZWQgbiwgX191MzIgdmFsdWUpCiB7Ci0JcmVwb3J0ICs9IChvZmZzZXQgPj4gNSkgPDwgMjsgb2Zmc2V0ICY9IDMxOwotCXB1dF91bmFsaWduZWQoKGdldF91bmFsaWduZWQoKF9fbGU2NCopcmVwb3J0KQotCQkmIGNwdV90b19sZTY0KH4oKCgoX191NjQpIDEgPDwgbikgLSAxKSA8PCBvZmZzZXQpKSkKLQkJfCBjcHVfdG9fbGU2NCgoX191NjQpdmFsdWUgPDwgb2Zmc2V0KSwgKF9fbGU2NCopcmVwb3J0KTsKKwl1NjQgeDsKKwl1NjQgbSA9ICgxVUxMIDw8IG4pIC0gMTsKKworCVdBUk5fT04obiA+IDMyKTsKKworCVdBUk5fT04odmFsdWUgPiBtKTsKKwl2YWx1ZSAmPSBtOworCisJcmVwb3J0ICs9IG9mZnNldCA+PiAzOworCW9mZnNldCAmPSA3OworCisJeCA9IGdldF91bmFsaWduZWQoKHU2NCAqKXJlcG9ydCk7CisJeCAmPSBjcHVfdG9fbGU2NCh+KG0gPDwgb2Zmc2V0KSk7CisJeCB8PSBjcHVfdG9fbGU2NCgoKHU2NCkgdmFsdWUpIDw8IG9mZnNldCk7CisJcHV0X3VuYWxpZ25lZCh4LCAodTY0ICopIHJlcG9ydCk7CiB9CiAKIC8qCkBAIC0xMzgxLDYgKzE0MTYsOSBAQAogCiAjZGVmaW5lIFVTQl9WRU5ET1JfSURfUEFOSklUCQkweDEzNGMKIAorI2RlZmluZSBVU0JfVkVORE9SX0lEX1RVUkJPWAkJMHgwNjJhCisjZGVmaW5lIFVTQl9ERVZJQ0VfSURfVFVSQk9YX0tFWUJPQVJECTB4MDIwMQorCiAvKgogICogSW5pdGlhbGl6ZSBhbGwgcmVwb3J0cwogICovCkBAIC0xNjAyLDYgKzE2NDAsOSBAQAogI2RlZmluZSBVU0JfVkVORE9SX0lEX1NVTgkJMHgwNDMwCiAjZGVmaW5lIFVTQl9ERVZJQ0VfSURfUkFSSVRBTl9LVk1fRE9OR0xFCTB4Y2RhYgogCisjZGVmaW5lIFVTQl9WRU5ET1JfSURfQUlSQ0FCTEUJCTB4MTZDQQorI2RlZmluZSBVU0JfREVWSUNFX0lEX0FJUkNBQkxFMQkJMHgxNTAyCisKIC8qCiAgKiBBbHBoYWJldGljYWxseSBzb3J0ZWQgYmxhY2tsaXN0IGJ5IHF1aXJrIHR5cGUuCiAgKi8KQEAgLTE2MTksNiArMTY2MCw3IEBACiAJeyBVU0JfVkVORE9SX0lEX0FJUFRFSywgVVNCX0RFVklDRV9JRF9BSVBURUtfMjIsIEhJRF9RVUlSS19JR05PUkUgfSwKIAl7IFVTQl9WRU5ET1JfSURfQUlQVEVLLCBVU0JfREVWSUNFX0lEX0FJUFRFS18yMywgSElEX1FVSVJLX0lHTk9SRSB9LAogCXsgVVNCX1ZFTkRPUl9JRF9BSVBURUssIFVTQl9ERVZJQ0VfSURfQUlQVEVLXzI0LCBISURfUVVJUktfSUdOT1JFIH0sCisJeyBVU0JfVkVORE9SX0lEX0FJUkNBQkxFLCBVU0JfREVWSUNFX0lEX0FJUkNBQkxFMSwgSElEX1FVSVJLX0lHTk9SRSB9LAogCXsgVVNCX1ZFTkRPUl9JRF9BTENPUiwgVVNCX0RFVklDRV9JRF9BTENPUl9VU0JSUzIzMiwgSElEX1FVSVJLX0lHTk9SRSB9LAogCXsgVVNCX1ZFTkRPUl9JRF9CRVJLU0hJUkUsIFVTQl9ERVZJQ0VfSURfQkVSS1NISVJFX1BDV0QsIEhJRF9RVUlSS19JR05PUkUgfSwKIAl7IFVTQl9WRU5ET1JfSURfQ09ERU1FUkNTLCBVU0JfREVWSUNFX0lEX0NPREVNRVJDU19JT1c0MCwgSElEX1FVSVJLX0lHTk9SRSB9LApAQCAtMTc1NSwxMSArMTc5NywxMiBAQAogCXsgVVNCX1ZFTkRPUl9JRF9BUFBMRSwgMHgwMjBFLCBISURfUVVJUktfUE9XRVJCT09LX0hBU19GTiB9LAogCXsgVVNCX1ZFTkRPUl9JRF9BUFBMRSwgMHgwMjBGLCBISURfUVVJUktfUE9XRVJCT09LX0hBU19GTiB9LAogCXsgVVNCX1ZFTkRPUl9JRF9BUFBMRSwgMHgwMjE0LCBISURfUVVJUktfUE9XRVJCT09LX0hBU19GTiB9LAotCXsgVVNCX1ZFTkRPUl9JRF9BUFBMRSwgMHgwMjE1LCBISURfUVVJUktfUE9XRVJCT09LX0hBU19GTiB9LAorCXsgVVNCX1ZFTkRPUl9JRF9BUFBMRSwgMHgwMjE1LCBISURfUVVJUktfUE9XRVJCT09LX0hBU19GTiB8IEhJRF9RVUlSS19QT1dFUkJPT0tfSVNPX0tFWUJPQVJEfSwKIAl7IFVTQl9WRU5ET1JfSURfQVBQTEUsIDB4MDIxNiwgSElEX1FVSVJLX1BPV0VSQk9PS19IQVNfRk4gfSwKIAl7IFVTQl9WRU5ET1JfSURfQVBQTEUsIDB4MDIxNywgSElEX1FVSVJLX1BPV0VSQk9PS19IQVNfRk4gfSwKLQl7IFVTQl9WRU5ET1JfSURfQVBQTEUsIDB4MDIxOCwgSElEX1FVSVJLX1BPV0VSQk9PS19IQVNfRk4gfSwKKwl7IFVTQl9WRU5ET1JfSURfQVBQTEUsIDB4MDIxOCwgSElEX1FVSVJLX1BPV0VSQk9PS19IQVNfRk4gfCBISURfUVVJUktfUE9XRVJCT09LX0lTT19LRVlCT0FSRH0sCiAJeyBVU0JfVkVORE9SX0lEX0FQUExFLCAweDAyMTksIEhJRF9RVUlSS19QT1dFUkJPT0tfSEFTX0ZOIH0sCisJeyBVU0JfVkVORE9SX0lEX0FQUExFLCAweDAyMUIsIEhJRF9RVUlSS19QT1dFUkJPT0tfSEFTX0ZOIH0sCiAJeyBVU0JfVkVORE9SX0lEX0FQUExFLCAweDAzMEEsIEhJRF9RVUlSS19QT1dFUkJPT0tfSEFTX0ZOIH0sCiAJeyBVU0JfVkVORE9SX0lEX0FQUExFLCAweDAzMEIsIEhJRF9RVUlSS19QT1dFUkJPT0tfSEFTX0ZOIH0sCiAKQEAgLTE3NjgsNiArMTgxMSw4IEBACiAJeyBVU0JfVkVORE9SX0lEX1BBTkpJVCwgMHgwMDAzLCBISURfUVVJUktfSUdOT1JFIH0sCiAJeyBVU0JfVkVORE9SX0lEX1BBTkpJVCwgMHgwMDA0LCBISURfUVVJUktfSUdOT1JFIH0sCiAKKwl7IFVTQl9WRU5ET1JfSURfVFVSQk9YLCBVU0JfREVWSUNFX0lEX1RVUkJPWF9LRVlCT0FSRCwgSElEX1FVSVJLX05PR0VUIH0sCisJCiAJeyAwLCAwIH0KIH07CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2lucHV0L2hpZC1pbnB1dC5jIGIvZHJpdmVycy91c2IvaW5wdXQvaGlkLWlucHV0LmMKaW5kZXggOWE4MDhhMy4uNjhlN2ViYiAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvaW5wdXQvaGlkLWlucHV0LmMKKysrIGIvZHJpdmVycy91c2IvaW5wdXQvaGlkLWlucHV0LmMKQEAgLTEyMSw2ICsxMjEsMTIgQEAKIAl7IH0KIH07CiAKK3N0YXRpYyBzdHJ1Y3QgaGlkaW5wdXRfa2V5X3RyYW5zbGF0aW9uIHBvd2VyYm9va19pc29fa2V5Ym9hcmRbXSA9IHsKKwl7IEtFWV9HUkFWRSwgICAgS0VZXzEwMk5EIH0sCisJeyBLRVlfMTAyTkQsICAgIEtFWV9HUkFWRSB9LAorCXsgfQorfTsKKwogc3RhdGljIGludCB1c2JoaWRfcGJfZm5tb2RlID0gMTsKIG1vZHVsZV9wYXJhbV9uYW1lZChwYl9mbm1vZGUsIHVzYmhpZF9wYl9mbm1vZGUsIGludCwgMDY0NCk7CiBNT0RVTEVfUEFSTV9ERVNDKHBiX2ZubW9kZSwKQEAgLTE5NSw2ICsyMDEsMTQgQEAKIAkJfQogCX0KIAorCWlmIChoaWQtPnF1aXJrcyAmIEhJRF9RVUlSS19QT1dFUkJPT0tfSVNPX0tFWUJPQVJEKSB7CisJCXRyYW5zID0gZmluZF90cmFuc2xhdGlvbihwb3dlcmJvb2tfaXNvX2tleWJvYXJkLCB1c2FnZS0+Y29kZSk7CisJCWlmICh0cmFucykgeworCQkJaW5wdXRfZXZlbnQoaW5wdXQsIHVzYWdlLT50eXBlLCB0cmFucy0+dG8sIHZhbHVlKTsKKwkJCXJldHVybiAxOworCQl9CisJfQorCiAJcmV0dXJuIDA7CiB9CiAKQEAgLTIxMCw2ICsyMjQsOSBAQAogCiAJZm9yICh0cmFucyA9IHBvd2VyYm9va19udW1sb2NrX2tleXM7IHRyYW5zLT5mcm9tOyB0cmFucysrKQogCQlzZXRfYml0KHRyYW5zLT50bywgaW5wdXQtPmtleWJpdCk7CisKKwlmb3IgKHRyYW5zID0gcG93ZXJib29rX2lzb19rZXlib2FyZDsgdHJhbnMtPmZyb207IHRyYW5zKyspCisJCXNldF9iaXQodHJhbnMtPnRvLCBpbnB1dC0+a2V5Yml0KTsKIH0KICNlbHNlCiBzdGF0aWMgaW5saW5lIGludCBoaWRpbnB1dF9wYl9ldmVudChzdHJ1Y3QgaGlkX2RldmljZSAqaGlkLCBzdHJ1Y3QgaW5wdXRfZGV2ICppbnB1dCwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2lucHV0L2hpZC5oIGIvZHJpdmVycy91c2IvaW5wdXQvaGlkLmgKaW5kZXggOWI1MGVmZi4uMGU3NmU2ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvaW5wdXQvaGlkLmgKKysrIGIvZHJpdmVycy91c2IvaW5wdXQvaGlkLmgKQEAgLTI2MCw2ICsyNjAsNyBAQAogI2RlZmluZSBISURfUVVJUktfUE9XRVJCT09LX0hBU19GTgkJMHgwMDAwMTAwMAogI2RlZmluZSBISURfUVVJUktfUE9XRVJCT09LX0ZOX09OCQkweDAwMDAyMDAwCiAjZGVmaW5lIEhJRF9RVUlSS19JTlZFUlRfSFdIRUVMCQkJMHgwMDAwNDAwMAorI2RlZmluZSBISURfUVVJUktfUE9XRVJCT09LX0lTT19LRVlCT0FSRAkweDAwMDA4MDAwCiAKIC8qCiAgKiBUaGlzIGlzIHRoZSBnbG9iYWwgZW52aXJvbm1lbnQgb2YgdGhlIHBhcnNlci4gVGhpcyBpbmZvcm1hdGlvbiBpcwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvaW5wdXQvdXNidG91Y2hzY3JlZW4uYyBiL2RyaXZlcnMvdXNiL2lucHV0L3VzYnRvdWNoc2NyZWVuLmMKaW5kZXggZjI2YzFjZC4uOTMzY2VkZCAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvaW5wdXQvdXNidG91Y2hzY3JlZW4uYworKysgYi9kcml2ZXJzL3VzYi9pbnB1dC91c2J0b3VjaHNjcmVlbi5jCkBAIC0yNTYsMTAgKzI1NiwxMCBAQAogewogCSp4ID0gKChwa3RbMF0gJiAweDFGKSA8PCA3KSB8IChwa3RbM10gJiAweDdGKTsKIAkqeSA9ICgocGt0WzFdICYgMHgxRikgPDwgNykgfCAocGt0WzRdICYgMHg3Rik7Ci0JKnByZXNzID0gKChwa3RbMl0gJiAweDFGKSA8PCA3KSB8IChwa3RbNV0gJiAweDdGKTsKKwkqcHJlc3MgPSAoKHBrdFsyXSAmIDB4MDEpIDw8IDcpIHwgKHBrdFs1XSAmIDB4N0YpOwogCSp0b3VjaCA9IH5wa3RbN10gJiAweDIwOwogCi0JcmV0dXJuIDE7CisJcmV0dXJuICp0b3VjaDsKIH0KICNlbmRpZgogCkBAIC02NDAsNyArNjQwLDcgQEAKIAkJICAgICAgICAgICAgICAgICAgICAgdHlwZS0+bWF4X3ByZXNzLCAwLCAwKTsKIAogCXVzYl9maWxsX2ludF91cmIodXNidG91Y2gtPmlycSwgdXNidG91Y2gtPnVkZXYsCi0JCQkgdXNiX3JjdmludHBpcGUodXNidG91Y2gtPnVkZXYsIDB4ODEpLAorCQkJIHVzYl9yY3ZpbnRwaXBlKHVzYnRvdWNoLT51ZGV2LCBlbmRwb2ludC0+YkVuZHBvaW50QWRkcmVzcyksCiAJCQkgdXNidG91Y2gtPmRhdGEsIHR5cGUtPnJlcHRfc2l6ZSwKIAkJCSB1c2J0b3VjaF9pcnEsIHVzYnRvdWNoLCBlbmRwb2ludC0+YkludGVydmFsKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvaW5wdXQvd2Fjb20uaCBiL2RyaXZlcnMvdXNiL2lucHV0L3dhY29tLmgKaW5kZXggN2IzODQwZS4uMWNmMDhmMCAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvaW5wdXQvd2Fjb20uaAorKysgYi9kcml2ZXJzL3VzYi9pbnB1dC93YWNvbS5oCkBAIC02Myw2ICs2Myw3IEBACiAgKiAgICAgIHYxLjQ2IChwYykgLSBTcGxpdCB3YWNvbS5jIGludG8gd2Fjb21fc3lzLmMgYW5kIHdhY29tX3dhYy5jLAogICoJCSAgIC0gd2hlcmUgd2Fjb21fc3lzLmMgZGVhbHMgd2l0aCBzeXN0ZW0gc3BlY2lmaWMgY29kZSwKICAqIAkJICAgLSBhbmQgd2Fjb21fd2FjLmMgZGVhbHMgd2l0aCBXYWNvbSBzcGVjaWZpYyBjb2RlCisgKgkJICAgLSBTdXBwb3J0IEludHVvczMgNHg2CiAgKi8KIAogLyoKQEAgLTExOCw2ICsxMTksNyBAQAogZXh0ZXJuIHZvaWQgd2Fjb21faW5pdF9pbnB1dF9kZXYoc3RydWN0IGlucHV0X2RldiAqaW5wdXRfZGV2LCBzdHJ1Y3Qgd2Fjb21fd2FjICp3YWNvbV93YWMpOwogZXh0ZXJuIHZvaWQgaW5wdXRfZGV2X2c0KHN0cnVjdCBpbnB1dF9kZXYgKmlucHV0X2Rldiwgc3RydWN0IHdhY29tX3dhYyAqd2Fjb21fd2FjKTsKIGV4dGVybiB2b2lkIGlucHV0X2Rldl9nKHN0cnVjdCBpbnB1dF9kZXYgKmlucHV0X2Rldiwgc3RydWN0IHdhY29tX3dhYyAqd2Fjb21fd2FjKTsKK2V4dGVybiB2b2lkIGlucHV0X2Rldl9pM3Moc3RydWN0IGlucHV0X2RldiAqaW5wdXRfZGV2LCBzdHJ1Y3Qgd2Fjb21fd2FjICp3YWNvbV93YWMpOwogZXh0ZXJuIHZvaWQgaW5wdXRfZGV2X2kzKHN0cnVjdCBpbnB1dF9kZXYgKmlucHV0X2Rldiwgc3RydWN0IHdhY29tX3dhYyAqd2Fjb21fd2FjKTsKIGV4dGVybiB2b2lkIGlucHV0X2Rldl9pKHN0cnVjdCBpbnB1dF9kZXYgKmlucHV0X2Rldiwgc3RydWN0IHdhY29tX3dhYyAqd2Fjb21fd2FjKTsKIGV4dGVybiB2b2lkIGlucHV0X2Rldl9wbChzdHJ1Y3QgaW5wdXRfZGV2ICppbnB1dF9kZXYsIHN0cnVjdCB3YWNvbV93YWMgKndhY29tX3dhYyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9pbnB1dC93YWNvbV9zeXMuYyBiL2RyaXZlcnMvdXNiL2lucHV0L3dhY29tX3N5cy5jCmluZGV4IGQyMzNjMzcuLjM0OThiODkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2lucHV0L3dhY29tX3N5cy5jCisrKyBiL2RyaXZlcnMvdXNiL2lucHV0L3dhY29tX3N5cy5jCkBAIC0xMTAsNyArMTEwLDcgQEAKIF9fdTE2IHdhY29tX2xlMTZfdG9fY3B1KHVuc2lnbmVkIGNoYXIgKmRhdGEpCiB7CiAJX191MTYgdmFsdWU7Ci0JdmFsdWUgPSBiZTE2X3RvX2NwdSgqKF9fYmUxNiAqKSBkYXRhKTsKKwl2YWx1ZSA9IGxlMTZfdG9fY3B1KCooX19sZTE2ICopIGRhdGEpOwogCXJldHVybiB2YWx1ZTsKIH0KIApAQCAtMTQzLDcgKzE0Myw3IEBACiAJaW5wdXRfZGV2LT5ldmJpdFswXSB8PSBCSVQoRVZfTVNDKTsKIAlpbnB1dF9kZXYtPm1zY2JpdFswXSB8PSBCSVQoTVNDX1NFUklBTCk7CiAJaW5wdXRfZGV2LT5rZXliaXRbTE9ORyhCVE5fRElHSSldIHw9IEJJVChCVE5fVE9PTF9GSU5HRVIpOwotCWlucHV0X2Rldi0+a2V5Yml0W0xPTkcoQlROX0xFRlQpXSB8PSBCSVQoQlROXzApIHwgQklUKEJUTl8xKSB8IEJJVChCVE5fMikgfCBCSVQoQlROXzMpIHwgQklUKEJUTl80KSB8IEJJVChCVE5fNSkgfCBCSVQoQlROXzYpIHwgQklUKEJUTl83KTsKKwlpbnB1dF9kZXYtPmtleWJpdFtMT05HKEJUTl9MRUZUKV0gfD0gQklUKEJUTl8wKSB8IEJJVChCVE5fNCk7CiB9CiAKIHZvaWQgaW5wdXRfZGV2X2coc3RydWN0IGlucHV0X2RldiAqaW5wdXRfZGV2LCBzdHJ1Y3Qgd2Fjb21fd2FjICp3YWNvbV93YWMpCkBAIC0xNTUsMTEgKzE1NSwxNiBAQAogCWlucHV0X3NldF9hYnNfcGFyYW1zKGlucHV0X2RldiwgQUJTX0RJU1RBTkNFLCAwLCB3YWNvbV93YWMtPmZlYXR1cmVzLT5kaXN0YW5jZV9tYXgsIDAsIDApOwogfQogCi12b2lkIGlucHV0X2Rldl9pMyhzdHJ1Y3QgaW5wdXRfZGV2ICppbnB1dF9kZXYsIHN0cnVjdCB3YWNvbV93YWMgKndhY29tX3dhYykKK3ZvaWQgaW5wdXRfZGV2X2kzcyhzdHJ1Y3QgaW5wdXRfZGV2ICppbnB1dF9kZXYsIHN0cnVjdCB3YWNvbV93YWMgKndhY29tX3dhYykKIHsKIAlpbnB1dF9kZXYtPmtleWJpdFtMT05HKEJUTl9ESUdJKV0gfD0gQklUKEJUTl9UT09MX0ZJTkdFUik7Ci0JaW5wdXRfZGV2LT5rZXliaXRbTE9ORyhCVE5fTEVGVCldIHw9IEJJVChCVE5fMCkgfCBCSVQoQlROXzEpIHwgQklUKEJUTl8yKSB8IEJJVChCVE5fMykgfCBCSVQoQlROXzQpIHwgQklUKEJUTl81KSB8IEJJVChCVE5fNikgfCBCSVQoQlROXzcpOworCWlucHV0X2Rldi0+a2V5Yml0W0xPTkcoQlROX0xFRlQpXSB8PSBCSVQoQlROXzApIHwgQklUKEJUTl8xKSB8IEJJVChCVE5fMikgfCBCSVQoQlROXzMpOwogCWlucHV0X3NldF9hYnNfcGFyYW1zKGlucHV0X2RldiwgQUJTX1JYLCAwLCA0MDk3LCAwLCAwKTsKK30KKwordm9pZCBpbnB1dF9kZXZfaTMoc3RydWN0IGlucHV0X2RldiAqaW5wdXRfZGV2LCBzdHJ1Y3Qgd2Fjb21fd2FjICp3YWNvbV93YWMpCit7CisJaW5wdXRfZGV2LT5rZXliaXRbTE9ORyhCVE5fTEVGVCldIHw9IEJJVChCVE5fNCkgfCBCSVQoQlROXzUpIHwgQklUKEJUTl82KSB8IEJJVChCVE5fNyk7CiAJaW5wdXRfc2V0X2Fic19wYXJhbXMoaW5wdXRfZGV2LCBBQlNfUlksIDAsIDQwOTcsIDAsIDApOwogfQogCkBAIC0yMTgsOCArMjIzLDcgQEAKIAlzdHJsY2F0KHdhY29tLT5waHlzLCAiL2lucHV0MCIsIHNpemVvZih3YWNvbS0+cGh5cykpOwogCiAJd2Fjb21fd2FjLT5mZWF0dXJlcyA9IGdldF93YWNvbV9mZWF0dXJlKGlkKTsKLQlpZiAod2Fjb21fd2FjLT5mZWF0dXJlcy0+cGt0bGVuID4gMTApCi0JCUJVRygpOworCUJVR19PTih3YWNvbV93YWMtPmZlYXR1cmVzLT5wa3RsZW4gPiAxMCk7CiAKIAlpbnB1dF9kZXYtPm5hbWUgPSB3YWNvbV93YWMtPmZlYXR1cmVzLT5uYW1lOwogCXdhY29tLT53YWNvbV93YWMgPSB3YWNvbV93YWM7CkBAIC0yNDQsNyArMjQ4LDcgQEAKIAl1c2JfZmlsbF9pbnRfdXJiKHdhY29tLT5pcnEsIGRldiwKIAkJCSB1c2JfcmN2aW50cGlwZShkZXYsIGVuZHBvaW50LT5iRW5kcG9pbnRBZGRyZXNzKSwKIAkJCSB3YWNvbV93YWMtPmRhdGEsIHdhY29tX3dhYy0+ZmVhdHVyZXMtPnBrdGxlbiwKLQkJCSB3YWNvbV93YWMtPmZlYXR1cmVzLT5pcnEsIHdhY29tLCBlbmRwb2ludC0+YkludGVydmFsKTsKKwkJCSB3YWNvbV9zeXNfaXJxLCB3YWNvbSwgZW5kcG9pbnQtPmJJbnRlcnZhbCk7CiAJd2Fjb20tPmlycS0+dHJhbnNmZXJfZG1hID0gd2Fjb20tPmRhdGFfZG1hOwogCXdhY29tLT5pcnEtPnRyYW5zZmVyX2ZsYWdzIHw9IFVSQl9OT19UUkFOU0ZFUl9ETUFfTUFQOwogCkBAIC0yNzgsOCArMjgyLDggQEAKIAkJaW5wdXRfdW5yZWdpc3Rlcl9kZXZpY2Uod2Fjb20tPmRldik7CiAJCXVzYl9mcmVlX3VyYih3YWNvbS0+aXJxKTsKIAkJdXNiX2J1ZmZlcl9mcmVlKGludGVyZmFjZV90b191c2JkZXYoaW50ZiksIDEwLCB3YWNvbS0+d2Fjb21fd2FjLT5kYXRhLCB3YWNvbS0+ZGF0YV9kbWEpOwotCQlrZnJlZSh3YWNvbSk7CiAJCWtmcmVlKHdhY29tLT53YWNvbV93YWMpOworCQlrZnJlZSh3YWNvbSk7CiAJfQogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9pbnB1dC93YWNvbV93YWMuYyBiL2RyaXZlcnMvdXNiL2lucHV0L3dhY29tX3dhYy5jCmluZGV4IGFhMzFkMjIuLjkyNzI2ZmUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2lucHV0L3dhY29tX3dhYy5jCisrKyBiL2RyaXZlcnMvdXNiL2lucHV0L3dhY29tX3dhYy5jCkBAIC0xOTEsOSArMTkxLDkgQEAKIAkJCQl3YWNvbV9yZXBvcnRfa2V5KHdjb21ibywgQlROX0xFRlQsIGRhdGFbMV0gJiAweDAxKTsKIAkJCQl3YWNvbV9yZXBvcnRfa2V5KHdjb21ibywgQlROX1JJR0hULCBkYXRhWzFdICYgMHgwMik7CiAJCQkJaWYgKHdhY29tLT5mZWF0dXJlcy0+dHlwZSA9PSBXQUNPTV9HNCkKLQkJCQkJd2Fjb21fcmVwb3J0X2Ficyh3Y29tYm8sIEFCU19ESVNUQU5DRSwgZGF0YVs2XSk7CisJCQkJCXdhY29tX3JlcG9ydF9hYnMod2NvbWJvLCBBQlNfRElTVEFOQ0UsIGRhdGFbNl0gJiAweDNmKTsKIAkJCQllbHNlCi0JCQkJCXdhY29tX3JlcG9ydF9hYnMod2NvbWJvLCBBQlNfRElTVEFOQ0UsIGRhdGFbN10pOworCQkJCQl3YWNvbV9yZXBvcnRfYWJzKHdjb21ibywgQUJTX0RJU1RBTkNFLCBkYXRhWzddICYgMHgzZik7CiAJCQkJYnJlYWs7CiAJCX0KIAl9CkBAIC0zMDMsOCArMzAzLDkgQEAKIAkJCQl3YWNvbS0+dG9vbFtpZHhdID0gQlROX1RPT0xfUEVOOwogCQl9CiAJCS8qIG9ubHkgbGFyZ2UgSTMgc3VwcG9ydCBMZW5zIEN1cnNvciAqLwotCQlpZighKCh3YWNvbS0+dG9vbFtpZHhdID09IEJUTl9UT09MX0xFTlMpICYmCi0JCQkJKHdhY29tLT5mZWF0dXJlcy0+dHlwZSA9PSBJTlRVT1MzKSkpIHsKKwkJaWYoISgod2Fjb20tPnRvb2xbaWR4XSA9PSBCVE5fVE9PTF9MRU5TKQorCQkJCSAmJiAoKHdhY29tLT5mZWF0dXJlcy0+dHlwZSA9PSBJTlRVT1MzKQorCQkJCSB8fCAod2Fjb20tPmZlYXR1cmVzLT50eXBlID09IElOVFVPUzNTKSkpKSB7CiAJCQl3YWNvbV9yZXBvcnRfYWJzKHdjb21ibywgQUJTX01JU0MsIHdhY29tLT5pZFtpZHhdKTsgLyogcmVwb3J0IHRvb2wgaWQgKi8KIAkJCXdhY29tX3JlcG9ydF9rZXkod2NvbWJvLCB3YWNvbS0+dG9vbFtpZHhdLCAxKTsKIAkJCXdhY29tX2lucHV0X2V2ZW50KHdjb21ibywgRVZfTVNDLCBNU0NfU0VSSUFMLCB3YWNvbS0+c2VyaWFsW2lkeF0pOwpAQCAtMzE1LDEwICszMTYsMTQgQEAKIAogCS8qIEV4aXQgcmVwb3J0ICovCiAJaWYgKChkYXRhWzFdICYgMHhmZSkgPT0gMHg4MCkgewotCQl3YWNvbV9yZXBvcnRfa2V5KHdjb21ibywgd2Fjb20tPnRvb2xbaWR4XSwgMCk7Ci0JCXdhY29tX3JlcG9ydF9hYnMod2NvbWJvLCBBQlNfTUlTQywgMCk7IC8qIHJlc2V0IHRvb2wgaWQgKi8KLQkJd2Fjb21faW5wdXRfZXZlbnQod2NvbWJvLCBFVl9NU0MsIE1TQ19TRVJJQUwsIHdhY29tLT5zZXJpYWxbaWR4XSk7Ci0JCXJldHVybiAyOworIAkJaWYoISgod2Fjb20tPnRvb2xbaWR4XSA9PSBCVE5fVE9PTF9MRU5TKQorCQkJCSAmJiAoKHdhY29tLT5mZWF0dXJlcy0+dHlwZSA9PSBJTlRVT1MzKQorCQkJCSB8fCAod2Fjb20tPmZlYXR1cmVzLT50eXBlID09IElOVFVPUzNTKSkpKSB7CisJCQl3YWNvbV9yZXBvcnRfa2V5KHdjb21ibywgd2Fjb20tPnRvb2xbaWR4XSwgMCk7CisJCQl3YWNvbV9yZXBvcnRfYWJzKHdjb21ibywgQUJTX01JU0MsIDApOyAvKiByZXNldCB0b29sIGlkICovCisJCQl3YWNvbV9pbnB1dF9ldmVudCh3Y29tYm8sIEVWX01TQywgTVNDX1NFUklBTCwgd2Fjb20tPnNlcmlhbFtpZHhdKTsKKwkJCXJldHVybiAyOworCQl9CiAJfQogCXJldHVybiAwOwogfQpAQCAtMzgyLDcgKzM4Nyw4IEBACiAJCXdhY29tX3JlcG9ydF9hYnMod2NvbWJvLCBBQlNfUlgsICgoZGF0YVsxXSAmIDB4MWYpIDw8IDgpIHwgZGF0YVsyXSk7CiAJCXdhY29tX3JlcG9ydF9hYnMod2NvbWJvLCBBQlNfUlksICgoZGF0YVszXSAmIDB4MWYpIDw8IDgpIHwgZGF0YVs0XSk7CiAKLQkJaWYoKGRhdGFbNV0gJiAweDBmKSB8IChkYXRhWzZdICYgMHgwZikgfCAoZGF0YVsxXSAmIDB4MWYpIHwgZGF0YVsyXSkKKwkJaWYoKGRhdGFbNV0gJiAweDBmKSB8IChkYXRhWzZdICYgMHgwZikgfCAoZGF0YVsxXSAmIDB4MWYpIHwKKwkJCWRhdGFbMl0gfCAoZGF0YVszXSAmIDB4MWYpIHwgZGF0YVs0XSkKIAkJCXdhY29tX3JlcG9ydF9rZXkod2NvbWJvLCB3YWNvbS0+dG9vbFsxXSwgMSk7CiAJCWVsc2UKIAkJCXdhY29tX3JlcG9ydF9rZXkod2NvbWJvLCB3YWNvbS0+dG9vbFsxXSwgMCk7CkBAIC00MzIsNyArNDM4LDcgQEAKIAkJCQkJKCh0IC0gMSkgLyAyKSA6IC10IC8gMik7CiAJCQl9CiAKLQkJfSBlbHNlIGlmICghKGRhdGFbMV0gJiAweDEwKSAmJiB3YWNvbS0+ZmVhdHVyZXMtPnR5cGUgPCBJTlRVT1MzKSB7CisJCX0gZWxzZSBpZiAoIShkYXRhWzFdICYgMHgxMCkgJiYgd2Fjb20tPmZlYXR1cmVzLT50eXBlIDwgSU5UVU9TM1MpIHsKIAkJCS8qIDREIG1vdXNlIHBhY2tldCAqLwogCQkJd2Fjb21fcmVwb3J0X2tleSh3Y29tYm8sIEJUTl9MRUZULCAgIGRhdGFbOF0gJiAweDAxKTsKIAkJCXdhY29tX3JlcG9ydF9rZXkod2NvbWJvLCBCVE5fTUlERExFLCBkYXRhWzhdICYgMHgwMik7CkBAIC00NTIsMTIgKzQ1OCwxMiBAQAogCQkJCQkJIC0gKChkYXRhWzhdICYgMHgwMikgPj4gMSkpOwogCiAJCQkvKiBJMyAyRCBtb3VzZSBzaWRlIGJ1dHRvbnMgKi8KLQkJCWlmICh3YWNvbS0+ZmVhdHVyZXMtPnR5cGUgPT0gSU5UVU9TMykgeworCQkJaWYgKHdhY29tLT5mZWF0dXJlcy0+dHlwZSA+PSBJTlRVT1MzUyAmJiB3YWNvbS0+ZmVhdHVyZXMtPnR5cGUgPD0gSU5UVU9TM0wpIHsKIAkJCQl3YWNvbV9yZXBvcnRfa2V5KHdjb21ibywgQlROX1NJREUsICAgZGF0YVs4XSAmIDB4NDApOwogCQkJCXdhY29tX3JlcG9ydF9rZXkod2NvbWJvLCBCVE5fRVhUUkEsICBkYXRhWzhdICYgMHgyMCk7CiAJCQl9CiAKLQkJfSBlbHNlIGlmICh3YWNvbS0+ZmVhdHVyZXMtPnR5cGUgPCBJTlRVT1MzKSB7CisJCX0gZWxzZSBpZiAod2Fjb20tPmZlYXR1cmVzLT50eXBlIDwgSU5UVU9TM1MgfHwgd2Fjb20tPmZlYXR1cmVzLT50eXBlID09IElOVFVPUzNMKSB7CiAJCQkvKiBMZW5zIGN1cnNvciBwYWNrZXRzICovCiAJCQl3YWNvbV9yZXBvcnRfa2V5KHdjb21ibywgQlROX0xFRlQsICAgZGF0YVs4XSAmIDB4MDEpOwogCQkJd2Fjb21fcmVwb3J0X2tleSh3Y29tYm8sIEJUTl9NSURETEUsIGRhdGFbOF0gJiAweDAyKTsKQEAgLTQ5MCw2ICs0OTYsNyBAQAogCQkJcmV0dXJuICh3YWNvbV9wdHVfaXJxKHdhY29tX3dhYywgd2NvbWJvKSk7CiAJCQlicmVhazsKIAkJY2FzZSBJTlRVT1M6CisJCWNhc2UgSU5UVU9TM1M6CiAJCWNhc2UgSU5UVU9TMzoKIAkJY2FzZSBJTlRVT1MzTDoKIAkJY2FzZSBDSU5USVE6CkBAIC01MTUsNiArNTIyLDggQEAKIAkJY2FzZSBDSU5USVE6CiAJCQlpbnB1dF9kZXZfaTMoaW5wdXRfZGV2LCB3YWNvbV93YWMpOwogCQkJLyogZmFsbCB0aHJvdWdoICovCisJCWNhc2UgSU5UVU9TM1M6CisJCQlpbnB1dF9kZXZfaTNzKGlucHV0X2Rldiwgd2Fjb21fd2FjKTsKIAkJY2FzZSBJTlRVT1M6CiAJCQlpbnB1dF9kZXZfaShpbnB1dF9kZXYsIHdhY29tX3dhYyk7CiAJCQlicmVhazsKQEAgLTUzMCw0OSArNTM5LDUwIEBACiB9CiAKIHN0YXRpYyBzdHJ1Y3Qgd2Fjb21fZmVhdHVyZXMgd2Fjb21fZmVhdHVyZXNbXSA9IHsKLQl7ICJXYWNvbSBQZW5wYXJ0bmVyIiwgICAgNywgICA1MDQwLCAgMzc4MCwgIDI1NSwgMzIsIFBFTlBBUlRORVIsCXdhY29tX3N5c19pcnEgfSwKLSAgICAgICAgeyAiV2Fjb20gR3JhcGhpcmUiLCAgICAgIDgsICAxMDIwNiwgIDc0MjIsICA1MTEsIDMyLCBHUkFQSElSRSwJd2Fjb21fc3lzX2lycSB9LAotCXsgIldhY29tIEdyYXBoaXJlMiA0eDUiLCA4LCAgMTAyMDYsICA3NDIyLCAgNTExLCAzMiwgR1JBUEhJUkUsCXdhY29tX3N5c19pcnEgfSwKLQl7ICJXYWNvbSBHcmFwaGlyZTIgNXg3IiwgOCwgIDEzOTE4LCAxMDIwNiwgIDUxMSwgMzIsIEdSQVBISVJFLAl3YWNvbV9zeXNfaXJxIH0sCi0JeyAiV2Fjb20gR3JhcGhpcmUzIiwgICAgIDgsICAxMDIwOCwgIDc0MjQsICA1MTEsIDMyLCBHUkFQSElSRSwJd2Fjb21fc3lzX2lycSB9LAotCXsgIldhY29tIEdyYXBoaXJlMyA2eDgiLCA4LCAgMTY3MDQsIDEyMDY0LCAgNTExLCAzMiwgR1JBUEhJUkUsCXdhY29tX3N5c19pcnEgfSwKLQl7ICJXYWNvbSBHcmFwaGlyZTQgNHg1IiwgOCwgIDEwMjA4LCAgNzQyNCwgIDUxMSwgMzIsIFdBQ09NX0c0LAl3YWNvbV9zeXNfaXJxIH0sCi0JeyAiV2Fjb20gR3JhcGhpcmU0IDZ4OCIsIDgsICAxNjcwNCwgMTIwNjQsICA1MTEsIDMyLCBXQUNPTV9HNCwJd2Fjb21fc3lzX2lycSB9LAotCXsgIldhY29tIFZvbGl0byIsICAgICAgICA4LCAgIDUxMDQsICAzNzEyLCAgNTExLCAzMiwgR1JBUEhJUkUsCXdhY29tX3N5c19pcnEgfSwKLQl7ICJXYWNvbSBQZW5TdGF0aW9uMiIsICAgOCwgICAzMjUwLCAgMjMyMCwgIDI1NSwgMzIsIEdSQVBISVJFLAl3YWNvbV9zeXNfaXJxIH0sCi0JeyAiV2Fjb20gVm9saXRvMiA0eDUiLCAgIDgsICAgNTEwNCwgIDM3MTIsICA1MTEsIDMyLCBHUkFQSElSRSwJd2Fjb21fc3lzX2lycSB9LAotCXsgIldhY29tIFZvbGl0bzIgMngzIiwgICA4LCAgIDMyNDgsICAyMzIwLCAgNTExLCAzMiwgR1JBUEhJUkUsCXdhY29tX3N5c19pcnEgfSwKLQl7ICJXYWNvbSBQZW5QYXJ0bmVyMiIsICAgOCwgICAzMjUwLCAgMjMyMCwgIDI1NSwgMzIsIEdSQVBISVJFLAl3YWNvbV9zeXNfaXJxIH0sCi0JeyAiV2Fjb20gSW50dW9zIDR4NSIsICAgMTAsICAxMjcwMCwgMTA2MDAsIDEwMjMsIDE1LCBJTlRVT1MsCXdhY29tX3N5c19pcnF9LAotCXsgIldhY29tIEludHVvcyA2eDgiLCAgIDEwLCAgMjAzMjAsIDE2MjQwLCAxMDIzLCAxNSwgSU5UVU9TLAl3YWNvbV9zeXNfaXJxIH0sCi0JeyAiV2Fjb20gSW50dW9zIDl4MTIiLCAgMTAsICAzMDQ4MCwgMjQwNjAsIDEwMjMsIDE1LCBJTlRVT1MsCXdhY29tX3N5c19pcnEgfSwKLQl7ICJXYWNvbSBJbnR1b3MgMTJ4MTIiLCAxMCwgIDMwNDgwLCAzMTY4MCwgMTAyMywgMTUsIElOVFVPUywJd2Fjb21fc3lzX2lycSB9LAotCXsgIldhY29tIEludHVvcyAxMngxOCIsIDEwLCAgNDU3MjAsIDMxNjgwLCAxMDIzLCAxNSwgSU5UVU9TLAl3YWNvbV9zeXNfaXJxfSwKLQl7ICJXYWNvbSBQTDQwMCIsICAgICAgICAgOCwgICA1NDA4LCAgNDA1NiwgIDI1NSwgMzIsIFBMLAl3YWNvbV9zeXNfaXJxIH0sCi0JeyAiV2Fjb20gUEw1MDAiLCAgICAgICAgIDgsICAgNjE0NCwgIDQ2MDgsICAyNTUsIDMyLCBQTCwJd2Fjb21fc3lzX2lycSB9LAotCXsgIldhY29tIFBMNjAwIiwgICAgICAgICA4LCAgIDYxMjYsICA0NjA0LCAgMjU1LCAzMiwgUEwsCXdhY29tX3N5c19pcnEgfSwKLQl7ICJXYWNvbSBQTDYwMFNYIiwgICAgICAgOCwgICA2MjYwLCAgNTAxNiwgIDI1NSwgMzIsIFBMLAl3YWNvbV9zeXNfaXJxIH0sCi0JeyAiV2Fjb20gUEw1NTAiLCAgICAgICAgIDgsICAgNjE0NCwgIDQ2MDgsICA1MTEsIDMyLCBQTCwJd2Fjb21fc3lzX2lycSB9LAotCXsgIldhY29tIFBMODAwIiwgICAgICAgICA4LCAgIDcyMjAsICA1NzgwLCAgNTExLCAzMiwgUEwsCXdhY29tX3N5c19pcnEgfSwKLQl7ICJXYWNvbSBQTDcwMCIsICAgICAgICAgOCwgICA2NzU4LCAgNTQwNiwgIDUxMSwgMzIsIFBMLAl3YWNvbV9zeXNfaXJxIH0sCi0JeyAiV2Fjb20gUEw1MTAiLCAgICAgICAgIDgsICAgNjI4MiwgIDQ3NjIsICA1MTEsIDMyLCBQTCwJd2Fjb21fc3lzX2lycSB9LAotCXsgIldhY29tIERUVTcxMCIsICAgICAgICA4LCAgMzQwODAsIDI3NjYwLCAgNTExLCAzMiwgUEwsCXdhY29tX3N5c19pcnEgfSwKLQl7ICJXYWNvbSBEVEY1MjEiLCAgICAgICAgOCwgICA2MjgyLCAgNDc2MiwgIDUxMSwgMzIsIFBMLAl3YWNvbV9zeXNfaXJxIH0sCi0JeyAiV2Fjb20gRFRGNzIwIiwgICAgICAgIDgsICAgNjg1OCwgIDU1MDYsICA1MTEsIDMyLCBQTCwJd2Fjb21fc3lzX2lycSB9LAotCXsgIldhY29tIENpbnRpcSBQYXJ0bmVyIiw4LCAgMjA0ODAsIDE1MzYwLCAgNTExLCAzMiwgUFRVLAl3YWNvbV9zeXNfaXJxIH0sCi0JeyAiV2Fjb20gSW50dW9zMiA0eDUiLCAgIDEwLCAxMjcwMCwgMTA2MDAsIDEwMjMsIDE1LCBJTlRVT1MsCXdhY29tX3N5c19pcnEgfSwKLQl7ICJXYWNvbSBJbnR1b3MyIDZ4OCIsICAgMTAsIDIwMzIwLCAxNjI0MCwgMTAyMywgMTUsIElOVFVPUywJd2Fjb21fc3lzX2lycSB9LAotCXsgIldhY29tIEludHVvczIgOXgxMiIsICAxMCwgMzA0ODAsIDI0MDYwLCAxMDIzLCAxNSwgSU5UVU9TLAl3YWNvbV9zeXNfaXJxIH0sCi0JeyAiV2Fjb20gSW50dW9zMiAxMngxMiIsIDEwLCAzMDQ4MCwgMzE2ODAsIDEwMjMsIDE1LCBJTlRVT1MsCXdhY29tX3N5c19pcnEgfSwKLQl7ICJXYWNvbSBJbnR1b3MyIDEyeDE4IiwgMTAsIDQ1NzIwLCAzMTY4MCwgMTAyMywgMTUsIElOVFVPUywJd2Fjb21fc3lzX2lycSB9LAotCXsgIldhY29tIEludHVvczMgNHg1IiwgICAxMCwgMjU0MDAsIDIwMzIwLCAxMDIzLCAxNSwgSU5UVU9TMywJd2Fjb21fc3lzX2lycSB9LAotCXsgIldhY29tIEludHVvczMgNng4IiwgICAxMCwgNDA2NDAsIDMwNDgwLCAxMDIzLCAxNSwgSU5UVU9TMywJd2Fjb21fc3lzX2lycSB9LAotCXsgIldhY29tIEludHVvczMgOXgxMiIsICAxMCwgNjA5NjAsIDQ1NzIwLCAxMDIzLCAxNSwgSU5UVU9TMywJd2Fjb21fc3lzX2lycSB9LAotCXsgIldhY29tIEludHVvczMgMTJ4MTIiLCAxMCwgNjA5NjAsIDYwOTYwLCAxMDIzLCAxNSwgSU5UVU9TM0wsCXdhY29tX3N5c19pcnEgfSwKLQl7ICJXYWNvbSBJbnR1b3MzIDEyeDE5IiwgMTAsIDk3NTM2LCA2MDk2MCwgMTAyMywgMTUsIElOVFVPUzNMLAl3YWNvbV9zeXNfaXJxIH0sCi0JeyAiV2Fjb20gSW50dW9zMyA2eDExIiwgIDEwLCA1NDIwNCwgMzE3NTAsIDEwMjMsIDE1LCBJTlRVT1MzLAl3YWNvbV9zeXNfaXJxIH0sCi0JeyAiV2Fjb20gQ2ludGlxIDIxVVgiLCAgIDEwLCA4NzIwMCwgNjU2MDAsIDEwMjMsIDE1LCBDSU5USVEsCXdhY29tX3N5c19pcnEgfSwKLQl7ICJXYWNvbSBJbnR1b3MyIDZ4OCIsICAgMTAsIDIwMzIwLCAxNjI0MCwgMTAyMywgMTUsIElOVFVPUywJd2Fjb21fc3lzX2lycSB9LAorCXsgIldhY29tIFBlbnBhcnRuZXIiLCAgICA3LCAgIDUwNDAsICAzNzgwLCAgMjU1LCAgMCwgUEVOUEFSVE5FUiB9LAorICAgICAgICB7ICJXYWNvbSBHcmFwaGlyZSIsICAgICAgOCwgIDEwMjA2LCAgNzQyMiwgIDUxMSwgNjMsIEdSQVBISVJFIH0sCisJeyAiV2Fjb20gR3JhcGhpcmUyIDR4NSIsIDgsICAxMDIwNiwgIDc0MjIsICA1MTEsIDYzLCBHUkFQSElSRSB9LAorCXsgIldhY29tIEdyYXBoaXJlMiA1eDciLCA4LCAgMTM5MTgsIDEwMjA2LCAgNTExLCA2MywgR1JBUEhJUkUgfSwKKwl7ICJXYWNvbSBHcmFwaGlyZTMiLCAgICAgOCwgIDEwMjA4LCAgNzQyNCwgIDUxMSwgNjMsIEdSQVBISVJFIH0sCisJeyAiV2Fjb20gR3JhcGhpcmUzIDZ4OCIsIDgsICAxNjcwNCwgMTIwNjQsICA1MTEsIDYzLCBHUkFQSElSRSB9LAorCXsgIldhY29tIEdyYXBoaXJlNCA0eDUiLCA4LCAgMTAyMDgsICA3NDI0LCAgNTExLCA2MywgV0FDT01fRzQgfSwKKwl7ICJXYWNvbSBHcmFwaGlyZTQgNng4IiwgOCwgIDE2NzA0LCAxMjA2NCwgIDUxMSwgNjMsIFdBQ09NX0c0IH0sCisJeyAiV2Fjb20gVm9saXRvIiwgICAgICAgIDgsICAgNTEwNCwgIDM3MTIsICA1MTEsICAwLCBHUkFQSElSRSB9LAorCXsgIldhY29tIFBlblN0YXRpb24yIiwgICA4LCAgIDMyNTAsICAyMzIwLCAgMjU1LCAgMCwgR1JBUEhJUkUgfSwKKwl7ICJXYWNvbSBWb2xpdG8yIDR4NSIsICAgOCwgICA1MTA0LCAgMzcxMiwgIDUxMSwgIDAsIEdSQVBISVJFIH0sCisJeyAiV2Fjb20gVm9saXRvMiAyeDMiLCAgIDgsICAgMzI0OCwgIDIzMjAsICA1MTEsICAwLCBHUkFQSElSRSB9LAorCXsgIldhY29tIFBlblBhcnRuZXIyIiwgICA4LCAgIDMyNTAsICAyMzIwLCAgMjU1LCAgMCwgR1JBUEhJUkUgfSwKKwl7ICJXYWNvbSBJbnR1b3MgNHg1IiwgICAxMCwgIDEyNzAwLCAxMDYwMCwgMTAyMywgNjMsIElOVFVPUyB9LAorCXsgIldhY29tIEludHVvcyA2eDgiLCAgIDEwLCAgMjAzMjAsIDE2MjQwLCAxMDIzLCA2MywgSU5UVU9TIH0sCisJeyAiV2Fjb20gSW50dW9zIDl4MTIiLCAgMTAsICAzMDQ4MCwgMjQwNjAsIDEwMjMsIDYzLCBJTlRVT1MgfSwKKwl7ICJXYWNvbSBJbnR1b3MgMTJ4MTIiLCAxMCwgIDMwNDgwLCAzMTY4MCwgMTAyMywgNjMsIElOVFVPUyB9LAorCXsgIldhY29tIEludHVvcyAxMngxOCIsIDEwLCAgNDU3MjAsIDMxNjgwLCAxMDIzLCA2MywgSU5UVU9TIH0sCisJeyAiV2Fjb20gUEw0MDAiLCAgICAgICAgIDgsICAgNTQwOCwgIDQwNTYsICAyNTUsICAwLCBQTCB9LAorCXsgIldhY29tIFBMNTAwIiwgICAgICAgICA4LCAgIDYxNDQsICA0NjA4LCAgMjU1LCAgMCwgUEwgfSwKKwl7ICJXYWNvbSBQTDYwMCIsICAgICAgICAgOCwgICA2MTI2LCAgNDYwNCwgIDI1NSwgIDAsIFBMIH0sCisJeyAiV2Fjb20gUEw2MDBTWCIsICAgICAgIDgsICAgNjI2MCwgIDUwMTYsICAyNTUsICAwLCBQTCB9LAorCXsgIldhY29tIFBMNTUwIiwgICAgICAgICA4LCAgIDYxNDQsICA0NjA4LCAgNTExLCAgMCwgUEwgfSwKKwl7ICJXYWNvbSBQTDgwMCIsICAgICAgICAgOCwgICA3MjIwLCAgNTc4MCwgIDUxMSwgIDAsIFBMIH0sCisJeyAiV2Fjb20gUEw3MDAiLCAgICAgICAgIDgsICAgNjc1OCwgIDU0MDYsICA1MTEsICAwLCBQTCB9LAorCXsgIldhY29tIFBMNTEwIiwgICAgICAgICA4LCAgIDYyODIsICA0NzYyLCAgNTExLCAgMCwgUEwgfSwKKwl7ICJXYWNvbSBEVFU3MTAiLCAgICAgICAgOCwgIDM0MDgwLCAyNzY2MCwgIDUxMSwgIDAsIFBMIH0sCisJeyAiV2Fjb20gRFRGNTIxIiwgICAgICAgIDgsICAgNjI4MiwgIDQ3NjIsICA1MTEsICAwLCBQTCB9LAorCXsgIldhY29tIERURjcyMCIsICAgICAgICA4LCAgIDY4NTgsICA1NTA2LCAgNTExLCAgMCwgUEwgfSwKKwl7ICJXYWNvbSBDaW50aXEgUGFydG5lciIsOCwgIDIwNDgwLCAxNTM2MCwgIDUxMSwgIDAsIFBUVSB9LAorCXsgIldhY29tIEludHVvczIgNHg1IiwgICAxMCwgMTI3MDAsIDEwNjAwLCAxMDIzLCA2MywgSU5UVU9TIH0sCisJeyAiV2Fjb20gSW50dW9zMiA2eDgiLCAgIDEwLCAyMDMyMCwgMTYyNDAsIDEwMjMsIDYzLCBJTlRVT1MgfSwKKwl7ICJXYWNvbSBJbnR1b3MyIDl4MTIiLCAgMTAsIDMwNDgwLCAyNDA2MCwgMTAyMywgNjMsIElOVFVPUyB9LAorCXsgIldhY29tIEludHVvczIgMTJ4MTIiLCAxMCwgMzA0ODAsIDMxNjgwLCAxMDIzLCA2MywgSU5UVU9TIH0sCisJeyAiV2Fjb20gSW50dW9zMiAxMngxOCIsIDEwLCA0NTcyMCwgMzE2ODAsIDEwMjMsIDYzLCBJTlRVT1MgfSwKKwl7ICJXYWNvbSBJbnR1b3MzIDR4NSIsICAgMTAsIDI1NDAwLCAyMDMyMCwgMTAyMywgNjMsIElOVFVPUzNTIH0sCisJeyAiV2Fjb20gSW50dW9zMyA2eDgiLCAgIDEwLCA0MDY0MCwgMzA0ODAsIDEwMjMsIDYzLCBJTlRVT1MzIH0sCisJeyAiV2Fjb20gSW50dW9zMyA5eDEyIiwgIDEwLCA2MDk2MCwgNDU3MjAsIDEwMjMsIDYzLCBJTlRVT1MzIH0sCisJeyAiV2Fjb20gSW50dW9zMyAxMngxMiIsIDEwLCA2MDk2MCwgNjA5NjAsIDEwMjMsIDYzLCBJTlRVT1MzTCB9LAorCXsgIldhY29tIEludHVvczMgMTJ4MTkiLCAxMCwgOTc1MzYsIDYwOTYwLCAxMDIzLCA2MywgSU5UVU9TM0wgfSwKKwl7ICJXYWNvbSBJbnR1b3MzIDZ4MTEiLCAgMTAsIDU0MjA0LCAzMTc1MCwgMTAyMywgNjMsIElOVFVPUzMgfSwKKwl7ICJXYWNvbSBJbnR1b3MzIDR4NiIsICAgMTAsIDMxNDk2LCAxOTY4NSwgMTAyMywgMTUsIElOVFVPUzNTIH0sCisJeyAiV2Fjb20gQ2ludGlxIDIxVVgiLCAgIDEwLCA4NzIwMCwgNjU2MDAsIDEwMjMsIDYzLCBDSU5USVEgfSwKKwl7ICJXYWNvbSBJbnR1b3MyIDZ4OCIsICAgMTAsIDIwMzIwLCAxNjI0MCwgMTAyMywgNjMsIElOVFVPUyB9LAogCXsgfQogfTsKIApAQCAtNjE4LDYgKzYyOCw3IEBACiAJeyBVU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfV0FDT00sIDB4QjMpIH0sCiAJeyBVU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfV0FDT00sIDB4QjQpIH0sCiAJeyBVU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfV0FDT00sIDB4QjUpIH0sCisJeyBVU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfV0FDT00sIDB4QjcpIH0sCiAJeyBVU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfV0FDT00sIDB4M0YpIH0sCiAJeyBVU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfV0FDT00sIDB4NDcpIH0sCiAJeyB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9pbnB1dC93YWNvbV93YWMuaCBiL2RyaXZlcnMvdXNiL2lucHV0L3dhY29tX3dhYy5oCmluZGV4IGNlYWU3YmYuLmExZDljZTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2lucHV0L3dhY29tX3dhYy5oCisrKyBiL2RyaXZlcnMvdXNiL2lucHV0L3dhY29tX3dhYy5oCkBAIC0yMCw2ICsyMCw3IEBACiAJUFRVLAogCVBMLAogCUlOVFVPUywKKwlJTlRVT1MzUywKIAlJTlRVT1MzLAogCUlOVFVPUzNMLAogCUNJTlRJUSwKQEAgLTM0LDcgKzM1LDYgQEAKIAlpbnQgcHJlc3N1cmVfbWF4OwogCWludCBkaXN0YW5jZV9tYXg7CiAJaW50IHR5cGU7Ci0JdXNiX2NvbXBsZXRlX3QgaXJxOwogfTsKIAogc3RydWN0IHdhY29tX3dhYyB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9pbnB1dC94cGFkLmMgYi9kcml2ZXJzL3VzYi9pbnB1dC94cGFkLmMKaW5kZXggY2ViYjZjNC4uZGY5N2U1YyAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvaW5wdXQveHBhZC5jCisrKyBiL2RyaXZlcnMvdXNiL2lucHV0L3hwYWQuYwpAQCAtMSw4ICsxLDEzIEBACiAvKgotICogWC1Cb3ggZ2FtZXBhZCAtIHYwLjAuNQorICogWC1Cb3ggZ2FtZXBhZCAtIHYwLjAuNgogICoKICAqIENvcHlyaWdodCAoYykgMjAwMiBNYXJrbyBGcmllZGVtYW5uIDxtZnJAYm14LWNoZW1uaXR6LmRlPgotICoKKyAqICAgICAgICAgICAgICAgMjAwNCBPbGl2ZXIgU2Nod2FydHogPE9saXZlci5TY2h3YXJ0ekBnbXguZGU+LAorICogICAgICAgICAgICAgICAgICAgIFN0ZXZlbiBUb3RoIDxzdGV2ZUB0b3RoLmRlbW9uLmNvLnVrPiwKKyAqICAgICAgICAgICAgICAgICAgICBGcmFueiBMZWhuZXIgPGZyYW56QGNhb3MuYXQ+LAorICogICAgICAgICAgICAgICAgICAgIEl2YW4gSGF3a2VzIDxibGFja2hhd2tAaXZhbmhhd2tlcy5jb20+CisgKiAgICAgICAgICAgICAgIDIwMDUgRG9taW5pYyBDZXJxdWV0dGkgPGJpbmFyeTEyMzBAeWFob28uY29tPgorICogICAgICAgICAgICAgICAyMDA2IEFkYW0gQnVjaGJpbmRlciA8YWRhbS5idWNoYmluZGVyQGdtYWlsLmNvbT4KICAqCiAgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiAgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwpAQCAtMjgsMTEgKzMzLDEzIEBACiAgKiAgLSBJVE8gVGFrYXl1a2kgZm9yIHByb3ZpZGluZyBlc3NlbnRpYWwgeHBhZCBpbmZvcm1hdGlvbiBvbiBoaXMgd2Vic2l0ZQogICogIC0gVm9qdGVjaCBQYXZsaWsgICAgIC0gaWZvcmNlIGRyaXZlciAvIGlucHV0IHN1YnN5c3RlbQogICogIC0gR3JlZyBLcm9haC1IYXJ0bWFuIC0gdXNiLXNrZWxldG9uIGRyaXZlcgorICogIC0gWEJPWCBMaW51eCBwcm9qZWN0IC0gZXh0cmEgVVNCIGlkJ3MKICAqCiAgKiBUT0RPOgotICogIC0gZmluZSB0dW5lIGF4ZXMKKyAqICAtIGZpbmUgdHVuZSBheGVzIChlc3BlY2lhbGx5IHRyaWdnZXIgYXhlcykKICAqICAtIGZpeCAiYW5hbG9nIiBidXR0b25zIChyZXBvcnRlZCBhcyBkaWdpdGFsIG5vdykKICAqICAtIGdldCBydW1ibGUgd29ya2luZworICogIC0gbmVlZCBVU0IgSURzIGZvciBvdGhlciBkYW5jZSBwYWRzCiAgKgogICogSGlzdG9yeToKICAqCkBAIC01MiwzMCArNTksNzkgQEAKICAqICAtIGZpeGVkIGQtcGFkIHRvIGF4ZXMgbWFwcGluZwogICoKICAqIDIwMDItMDctMTcgLSAwLjAuNSA6IHNpbXBsaWZpZWQgZC1wYWQgaGFuZGxpbmcKKyAqCisgKiAyMDA0LTEwLTAyIC0gMC4wLjYgOiBERFIgcGFkIHN1cHBvcnQKKyAqICAtIGJvcnJvd2VkIGZyb20gdGhlIFhCT1ggbGludXgga2VybmVsCisgKiAgLSBVU0IgaWQncyBmb3IgY29tbW9ubHkgdXNlZCBkYW5jZSBwYWRzIGFyZSBwcmVzZW50CisgKiAgLSBkYW5jZSBwYWRzIHdpbGwgbWFwIEQtUEFEIHRvIGJ1dHRvbnMsIG5vdCBheGVzCisgKiAgLSBwYXNzIHRoZSBtb2R1bGUgcGFyYW1hdGVyICdkcGFkX3RvX2J1dHRvbnMnIHRvIGZvcmNlCisgKiAgICB0aGUgRC1QQUQgdG8gbWFwIHRvIGJ1dHRvbnMgaWYgeW91ciBwYWQgaXMgbm90IGRldGVjdGVkCiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvc3RhdC5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+CiAjaW5jbHVkZSA8bGludXgvc21wX2xvY2suaD4KICNpbmNsdWRlIDxsaW51eC91c2IvaW5wdXQuaD4KIAotI2RlZmluZSBEUklWRVJfVkVSU0lPTiAidjAuMC41IgorI2RlZmluZSBEUklWRVJfVkVSU0lPTiAidjAuMC42IgogI2RlZmluZSBEUklWRVJfQVVUSE9SICJNYXJrbyBGcmllZGVtYW5uIDxtZnJAYm14LWNoZW1uaXR6LmRlPiIKICNkZWZpbmUgRFJJVkVSX0RFU0MgIlgtQm94IHBhZCBkcml2ZXIiCiAKICNkZWZpbmUgWFBBRF9QS1RfTEVOIDMyCiAKKy8qIHhib3ggZC1wYWRzIHNob3VsZCBtYXAgdG8gYnV0dG9ucywgYXMgaXMgcmVxdWlyZWQgZm9yIEREUiBwYWRzCisgICBidXQgd2UgbWFwIHRoZW0gdG8gYXhlcyB3aGVuIHBvc3NpYmxlIHRvIHNpbXBsaWZ5IHRoaW5ncyAqLworI2RlZmluZSBNQVBfRFBBRF9UT19CVVRUT05TICAgIDAKKyNkZWZpbmUgTUFQX0RQQURfVE9fQVhFUyAgICAgICAxCisjZGVmaW5lIE1BUF9EUEFEX1VOS05PV04gICAgICAgLTEKKworc3RhdGljIGludCBkcGFkX3RvX2J1dHRvbnM7Cittb2R1bGVfcGFyYW0oZHBhZF90b19idXR0b25zLCBib29sLCBTX0lSVUdPKTsKK01PRFVMRV9QQVJNX0RFU0MoZHBhZF90b19idXR0b25zLCAiTWFwIEQtUEFEIHRvIGJ1dHRvbnMgcmF0aGVyIHRoYW4gYXhlcyBmb3IgdW5rbm93biBwYWRzIik7CisKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgeHBhZF9kZXZpY2UgewogCXUxNiBpZFZlbmRvcjsKIAl1MTYgaWRQcm9kdWN0OwogCWNoYXIgKm5hbWU7CisJdTggZHBhZF9tYXBwaW5nOwogfSB4cGFkX2RldmljZVtdID0gewotCXsgMHgwNDVlLCAweDAyMDIsICJNaWNyb3NvZnQgWC1Cb3ggcGFkIChVUykiIH0sCi0JeyAweDA0NWUsIDB4MDI4NSwgIk1pY3Jvc29mdCBYLUJveCBwYWQgKEphcGFuKSIgfSwKLQl7IDB4MDVmZCwgMHgxMDdhLCAiSW50ZXJBY3QgJ1Bvd2VyUGFkIFBybycgWC1Cb3ggcGFkIChHZXJtYW55KSIgfSwKLQl7IDB4MDAwMCwgMHgwMDAwLCAiWC1Cb3ggcGFkIiB9CisJeyAweDA0NWUsIDB4MDIwMiwgIk1pY3Jvc29mdCBYLUJveCBwYWQgdjEgKFVTKSIsIE1BUF9EUEFEX1RPX0FYRVMgfSwKKwl7IDB4MDQ1ZSwgMHgwMjg5LCAiTWljcm9zb2Z0IFgtQm94IHBhZCB2MiAoVVMpIiwgTUFQX0RQQURfVE9fQVhFUyB9LAorCXsgMHgwNDVlLCAweDAyODUsICJNaWNyb3NvZnQgWC1Cb3ggcGFkIChKYXBhbikiLCBNQVBfRFBBRF9UT19BWEVTIH0sCisJeyAweDA0NWUsIDB4MDI4NywgIk1pY3Jvc29mdCBYYm94IENvbnRyb2xsZXIgUyIsIE1BUF9EUEFEX1RPX0FYRVMgfSwKKwl7IDB4MGMxMiwgMHg4ODA5LCAiUmVkT2N0YW5lIFhib3ggRGFuY2UgUGFkIiwgTUFQX0RQQURfVE9fQlVUVE9OUyB9LAorCXsgMHgwNDRmLCAweDBmMDcsICJUaHJ1c3RtYXN0ZXIsIEluYy4gQ29udHJvbGxlciIsIE1BUF9EUEFEX1RPX0FYRVMgfSwKKwl7IDB4MDQ2ZCwgMHhjYTg0LCAiTG9naXRlY2ggWGJveCBDb3JkbGVzcyBDb250cm9sbGVyIiwgTUFQX0RQQURfVE9fQVhFUyB9LAorCXsgMHgwNDZkLCAweGNhODgsICJMb2dpdGVjaCBDb21wYWN0IENvbnRyb2xsZXIgZm9yIFhib3giLCBNQVBfRFBBRF9UT19BWEVTIH0sCisJeyAweDA1ZmQsIDB4MTAwNywgIk1hZCBDYXR6IENvbnRyb2xsZXIgKHVudmVyaWZpZWQpIiwgTUFQX0RQQURfVE9fQVhFUyB9LAorCXsgMHgwNWZkLCAweDEwN2EsICJJbnRlckFjdCAnUG93ZXJQYWQgUHJvJyBYLUJveCBwYWQgKEdlcm1hbnkpIiwgTUFQX0RQQURfVE9fQVhFUyB9LAorCXsgMHgwNzM4LCAweDQ1MTYsICJNYWQgQ2F0eiBDb250cm9sIFBhZCIsIE1BUF9EUEFEX1RPX0FYRVMgfSwKKwl7IDB4MDczOCwgMHg0NTIyLCAiTWFkIENhdHogTHVtaUNPTiIsIE1BUF9EUEFEX1RPX0FYRVMgfSwKKwl7IDB4MDczOCwgMHg0NTI2LCAiTWFkIENhdHogQ29udHJvbCBQYWQgUHJvIiwgTUFQX0RQQURfVE9fQVhFUyB9LAorCXsgMHgwNzM4LCAweDQ1MzYsICJNYWQgQ2F0eiBNaWNyb0NPTiIsIE1BUF9EUEFEX1RPX0FYRVMgfSwKKwl7IDB4MDczOCwgMHg0NTQwLCAiTWFkIENhdHogQmVhdCBQYWQiLCBNQVBfRFBBRF9UT19CVVRUT05TIH0sCisJeyAweDA3MzgsIDB4NDU1NiwgIk1hZCBDYXR6IEx5bnggV2lyZWxlc3MgQ29udHJvbGxlciIsIE1BUF9EUEFEX1RPX0FYRVMgfSwKKwl7IDB4MDczOCwgMHg2MDQwLCAiTWFkIENhdHogQmVhdCBQYWQgUHJvIiwgTUFQX0RQQURfVE9fQlVUVE9OUyB9LAorCXsgMHgwYzEyLCAweDg4MDIsICJaZXJvcGx1cyBYYm94IENvbnRyb2xsZXIiLCBNQVBfRFBBRF9UT19BWEVTIH0sCisJeyAweDBjMTIsIDB4ODgxMCwgIlplcm9wbHVzIFhib3ggQ29udHJvbGxlciIsIE1BUF9EUEFEX1RPX0FYRVMgfSwKKwl7IDB4MGMxMiwgMHg5OTAyLCAiSEFNQSBWaWJyYVggLSAqRkFVTFRZIEhBUkRXQVJFKiIsIE1BUF9EUEFEX1RPX0FYRVMgfSwKKwl7IDB4MGU0YywgMHgxMDk3LCAiUmFkaWNhIEdhbWVzdGVyIENvbnRyb2xsZXIiLCBNQVBfRFBBRF9UT19BWEVTIH0sCisJeyAweDBlNGMsIDB4MjM5MCwgIlJhZGljYSBHYW1lcyBKdGVjaCBDb250cm9sbGVyIiwgTUFQX0RQQURfVE9fQVhFU30sCisJeyAweDBlNmYsIDB4MDAwMywgIkxvZ2ljMyBGcmVlYmlyZCB3aXJlbGVzcyBDb250cm9sbGVyIiwgTUFQX0RQQURfVE9fQVhFUyB9LAorCXsgMHgwZTZmLCAweDAwMDUsICJFY2xpcHNlIHdpcmVsZXNzIENvbnRyb2xsZXIiLCBNQVBfRFBBRF9UT19BWEVTIH0sCisJeyAweDBlNmYsIDB4MDAwNiwgIkVkZ2Ugd2lyZWxlc3MgQ29udHJvbGxlciIsIE1BUF9EUEFEX1RPX0FYRVMgfSwKKwl7IDB4MGU4ZiwgMHgwMjAxLCAiU21hcnRKb3kgRnJhZyBYcGFkL1BTMiBhZGFwdG9yIiwgTUFQX0RQQURfVE9fQVhFUyB9LAorCXsgMHgwZjMwLCAweDAyMDIsICJKb3l0ZWNoIEFkdmFuY2VkIENvbnRyb2xsZXIiLCBNQVBfRFBBRF9UT19BWEVTIH0sCisJeyAweDBmMzAsIDB4ODg4OCwgIkJpZ0JlbiBYQk1pbmlQYWQgQ29udHJvbGxlciIsIE1BUF9EUEFEX1RPX0FYRVMgfSwKKwl7IDB4MTAyYywgMHhmZjBjLCAiSm95dGVjaCBXaXJlbGVzcyBBZHZhbmNlZCBDb250cm9sbGVyIiwgTUFQX0RQQURfVE9fQVhFUyB9LAorCXsgMHgxMmFiLCAweDg4MDksICJYYm94IEREUiBkYW5jZXBhZCIsIE1BUF9EUEFEX1RPX0JVVFRPTlMgfSwKKwl7IDB4MTQzMCwgMHg4ODg4LCAiVFg2NTAwKyBEYW5jZSBQYWQgKGZpcnN0IGdlbmVyYXRpb24pIiwgTUFQX0RQQURfVE9fQlVUVE9OUyB9LAorCXsgMHhmZmZmLCAweGZmZmYsICJDaGluZXNlLW1hZGUgWGJveCBDb250cm9sbGVyIiwgTUFQX0RQQURfVE9fQVhFUyB9LAorCXsgMHgwMDAwLCAweDAwMDAsICJHZW5lcmljIFgtQm94IHBhZCIsIE1BUF9EUEFEX1VOS05PV04gfQogfTsKIAogc3RhdGljIGNvbnN0IHNpZ25lZCBzaG9ydCB4cGFkX2J0bltdID0gewpAQCAtODQsMTEgKzE0MCwyMyBAQAogCS0xCQkJCQkJLyogdGVybWluYXRpbmcgZW50cnkgKi8KIH07CiAKKy8qIG9ubHkgdXNlZCBpZiBNQVBfRFBBRF9UT19CVVRUT05TICovCitzdGF0aWMgY29uc3Qgc2lnbmVkIHNob3J0IHhwYWRfYnRuX3BhZFtdID0geworCUJUTl9MRUZULCBCVE5fUklHSFQsCQkvKiBkLXBhZCBsZWZ0LCByaWdodCAqLworCUJUTl8wLCBCVE5fMSwJCQkvKiBkLXBhZCB1cCwgZG93biAoWFhYIG5hbWVzPz8pICovCisJLTEJCQkJLyogdGVybWluYXRpbmcgZW50cnkgKi8KK307CisKIHN0YXRpYyBjb25zdCBzaWduZWQgc2hvcnQgeHBhZF9hYnNbXSA9IHsKIAlBQlNfWCwgQUJTX1ksCQkvKiBsZWZ0IHN0aWNrICovCiAJQUJTX1JYLCBBQlNfUlksCQkvKiByaWdodCBzdGljayAqLwogCUFCU19aLCBBQlNfUlosCQkvKiB0cmlnZ2VycyBsZWZ0L3JpZ2h0ICovCi0JQUJTX0hBVDBYLCBBQlNfSEFUMFksCS8qIGRpZ2l0YWwgcGFkICovCisJLTEJCQkvKiB0ZXJtaW5hdGluZyBlbnRyeSAqLworfTsKKworLyogb25seSB1c2VkIGlmIE1BUF9EUEFEX1RPX0FYRVMgKi8KK3N0YXRpYyBjb25zdCBzaWduZWQgc2hvcnQgeHBhZF9hYnNfcGFkW10gPSB7CisJQUJTX0hBVDBYLCBBQlNfSEFUMFksCS8qIGQtcGFkIGF4ZXMgKi8KIAktMQkJCS8qIHRlcm1pbmF0aW5nIGVudHJ5ICovCiB9OwogCkBAIC0xMDAsMTQgKzE2OCwxNiBAQAogTU9EVUxFX0RFVklDRV9UQUJMRSAodXNiLCB4cGFkX3RhYmxlKTsKIAogc3RydWN0IHVzYl94cGFkIHsKLQlzdHJ1Y3QgaW5wdXRfZGV2ICpkZXY7CQkJLyogaW5wdXQgZGV2aWNlIGludGVyZmFjZSAqLwotCXN0cnVjdCB1c2JfZGV2aWNlICp1ZGV2OwkJLyogdXNiIGRldmljZSAqLworCXN0cnVjdCBpbnB1dF9kZXYgKmRldjsJCS8qIGlucHV0IGRldmljZSBpbnRlcmZhY2UgKi8KKwlzdHJ1Y3QgdXNiX2RldmljZSAqdWRldjsJLyogdXNiIGRldmljZSAqLwogCi0Jc3RydWN0IHVyYiAqaXJxX2luOwkJCS8qIHVyYiBmb3IgaW50ZXJydXB0IGluIHJlcG9ydCAqLwotCXVuc2lnbmVkIGNoYXIgKmlkYXRhOwkJCS8qIGlucHV0IGRhdGEgKi8KKwlzdHJ1Y3QgdXJiICppcnFfaW47CQkvKiB1cmIgZm9yIGludGVycnVwdCBpbiByZXBvcnQgKi8KKwl1bnNpZ25lZCBjaGFyICppZGF0YTsJCS8qIGlucHV0IGRhdGEgKi8KIAlkbWFfYWRkcl90IGlkYXRhX2RtYTsKIAotCWNoYXIgcGh5c1s2NV07CQkJCS8qIHBoeXNpY2FsIGRldmljZSBwYXRoICovCisJY2hhciBwaHlzWzY1XTsJCQkvKiBwaHlzaWNhbCBkZXZpY2UgcGF0aCAqLworCisJaW50IGRwYWRfbWFwcGluZzsJCS8qIG1hcCBkLXBhZCB0byBidXR0b25zIG9yIHRvIGF4ZXMgKi8KIH07CiAKIC8qCkBAIC0xMzcsMTQgKzIwNywyMSBAQAogCWlucHV0X3JlcG9ydF9hYnMoZGV2LCBBQlNfUlosIGRhdGFbMTFdKTsKIAogCS8qIGRpZ2l0YWwgcGFkICovCi0JaW5wdXRfcmVwb3J0X2FicyhkZXYsIEFCU19IQVQwWCwgISEoZGF0YVsyXSAmIDB4MDgpIC0gISEoZGF0YVsyXSAmIDB4MDQpKTsKLQlpbnB1dF9yZXBvcnRfYWJzKGRldiwgQUJTX0hBVDBZLCAhIShkYXRhWzJdICYgMHgwMikgLSAhIShkYXRhWzJdICYgMHgwMSkpOworCWlmICh4cGFkLT5kcGFkX21hcHBpbmcgPT0gTUFQX0RQQURfVE9fQVhFUykgeworCQlpbnB1dF9yZXBvcnRfYWJzKGRldiwgQUJTX0hBVDBYLCAhIShkYXRhWzJdICYgMHgwOCkgLSAhIShkYXRhWzJdICYgMHgwNCkpOworCQlpbnB1dF9yZXBvcnRfYWJzKGRldiwgQUJTX0hBVDBZLCAhIShkYXRhWzJdICYgMHgwMikgLSAhIShkYXRhWzJdICYgMHgwMSkpOworCX0gZWxzZSAvKiB4cGFkLT5kcGFkX21hcHBpbmcgPT0gTUFQX0RQQURfVE9fQlVUVE9OUyAqLyB7CisJCWlucHV0X3JlcG9ydF9rZXkoZGV2LCBCVE5fTEVGVCwgIGRhdGFbMl0gJiAweDA0KTsKKwkJaW5wdXRfcmVwb3J0X2tleShkZXYsIEJUTl9SSUdIVCwgZGF0YVsyXSAmIDB4MDgpOworCQlpbnB1dF9yZXBvcnRfa2V5KGRldiwgQlROXzAsICAgICBkYXRhWzJdICYgMHgwMSk7IC8vIHVwCisJCWlucHV0X3JlcG9ydF9rZXkoZGV2LCBCVE5fMSwgICAgIGRhdGFbMl0gJiAweDAyKTsgLy8gZG93bgorCX0KIAogCS8qIHN0YXJ0L2JhY2sgYnV0dG9ucyBhbmQgc3RpY2sgcHJlc3MgbGVmdC9yaWdodCAqLwotCWlucHV0X3JlcG9ydF9rZXkoZGV2LCBCVE5fU1RBUlQsIChkYXRhWzJdICYgMHgxMCkgPj4gNCk7Ci0JaW5wdXRfcmVwb3J0X2tleShkZXYsIEJUTl9CQUNLLCAoZGF0YVsyXSAmIDB4MjApID4+IDUpOwotCWlucHV0X3JlcG9ydF9rZXkoZGV2LCBCVE5fVEhVTUJMLCAoZGF0YVsyXSAmIDB4NDApID4+IDYpOwotCWlucHV0X3JlcG9ydF9rZXkoZGV2LCBCVE5fVEhVTUJSLCBkYXRhWzJdID4+IDcpOworCWlucHV0X3JlcG9ydF9rZXkoZGV2LCBCVE5fU1RBUlQsICBkYXRhWzJdICYgMHgxMCk7CisJaW5wdXRfcmVwb3J0X2tleShkZXYsIEJUTl9CQUNLLCAgIGRhdGFbMl0gJiAweDIwKTsKKwlpbnB1dF9yZXBvcnRfa2V5KGRldiwgQlROX1RIVU1CTCwgZGF0YVsyXSAmIDB4NDApOworCWlucHV0X3JlcG9ydF9rZXkoZGV2LCBCVE5fVEhVTUJSLCBkYXRhWzJdICYgMHg4MCk7CiAKIAkvKiAiYW5hbG9nIiBidXR0b25zIEEsIEIsIFgsIFkgKi8KIAlpbnB1dF9yZXBvcnRfa2V5KGRldiwgQlROX0EsIGRhdGFbNF0pOwpAQCAtMjA2LDYgKzI4MywyOCBAQAogCXVzYl9raWxsX3VyYih4cGFkLT5pcnFfaW4pOwogfQogCitzdGF0aWMgdm9pZCB4cGFkX3NldF91cF9hYnMoc3RydWN0IGlucHV0X2RldiAqaW5wdXRfZGV2LCBzaWduZWQgc2hvcnQgYWJzKQoreworCXNldF9iaXQoYWJzLCBpbnB1dF9kZXYtPmFic2JpdCk7CisKKwlzd2l0Y2ggKGFicykgeworCWNhc2UgQUJTX1g6CisJY2FzZSBBQlNfWToKKwljYXNlIEFCU19SWDoKKwljYXNlIEFCU19SWToJLyogdGhlIHR3byBzdGlja3MgKi8KKwkJaW5wdXRfc2V0X2Fic19wYXJhbXMoaW5wdXRfZGV2LCBhYnMsIC0zMjc2OCwgMzI3NjcsIDE2LCAxMjgpOworCQlicmVhazsKKwljYXNlIEFCU19aOgorCWNhc2UgQUJTX1JaOgkvKiB0aGUgdHJpZ2dlcnMgKi8KKwkJaW5wdXRfc2V0X2Fic19wYXJhbXMoaW5wdXRfZGV2LCBhYnMsIDAsIDI1NSwgMCwgMCk7CisJCWJyZWFrOworCWNhc2UgQUJTX0hBVDBYOgorCWNhc2UgQUJTX0hBVDBZOgkvKiB0aGUgZC1wYWQgKG9ubHkgaWYgTUFQX0RQQURfVE9fQVhFUykgKi8KKwkJaW5wdXRfc2V0X2Fic19wYXJhbXMoaW5wdXRfZGV2LCBhYnMsIC0xLCAxLCAwLCAwKTsKKwkJYnJlYWs7CisJfQorfQorCiBzdGF0aWMgaW50IHhwYWRfcHJvYmUoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYsIGNvbnN0IHN0cnVjdCB1c2JfZGV2aWNlX2lkICppZCkKIHsKIAlzdHJ1Y3QgdXNiX2RldmljZSAqdWRldiA9IGludGVyZmFjZV90b191c2JkZXYgKGludGYpOwpAQCAtMjM1LDYgKzMzNCw5IEBACiAJCWdvdG8gZmFpbDI7CiAKIAl4cGFkLT51ZGV2ID0gdWRldjsKKwl4cGFkLT5kcGFkX21hcHBpbmcgPSB4cGFkX2RldmljZVtpXS5kcGFkX21hcHBpbmc7CisJaWYgKHhwYWQtPmRwYWRfbWFwcGluZyA9PSBNQVBfRFBBRF9VTktOT1dOKQorCQl4cGFkLT5kcGFkX21hcHBpbmcgPSBkcGFkX3RvX2J1dHRvbnM7CiAJeHBhZC0+ZGV2ID0gaW5wdXRfZGV2OwogCXVzYl9tYWtlX3BhdGgodWRldiwgeHBhZC0+cGh5cywgc2l6ZW9mKHhwYWQtPnBoeXMpKTsKIAlzdHJsY2F0KHhwYWQtPnBoeXMsICIvaW5wdXQwIiwgc2l6ZW9mKHhwYWQtPnBoeXMpKTsKQEAgLTI0OSwzMiArMzUxLDE5IEBACiAKIAlpbnB1dF9kZXYtPmV2Yml0WzBdID0gQklUKEVWX0tFWSkgfCBCSVQoRVZfQUJTKTsKIAorCS8qIHNldCB1cCBidXR0b25zICovCiAJZm9yIChpID0gMDsgeHBhZF9idG5baV0gPj0gMDsgaSsrKQogCQlzZXRfYml0KHhwYWRfYnRuW2ldLCBpbnB1dF9kZXYtPmtleWJpdCk7CisJaWYgKHhwYWQtPmRwYWRfbWFwcGluZyA9PSBNQVBfRFBBRF9UT19CVVRUT05TKQorCQlmb3IgKGkgPSAwOyB4cGFkX2J0bl9wYWRbaV0gPj0gMDsgaSsrKQorCQkJc2V0X2JpdCh4cGFkX2J0bl9wYWRbaV0sIGlucHV0X2Rldi0+a2V5Yml0KTsKIAotCWZvciAoaSA9IDA7IHhwYWRfYWJzW2ldID49IDA7IGkrKykgewotCi0JCXNpZ25lZCBzaG9ydCB0ID0geHBhZF9hYnNbaV07Ci0KLQkJc2V0X2JpdCh0LCBpbnB1dF9kZXYtPmFic2JpdCk7Ci0KLQkJc3dpdGNoICh0KSB7Ci0JCQljYXNlIEFCU19YOgotCQkJY2FzZSBBQlNfWToKLQkJCWNhc2UgQUJTX1JYOgotCQkJY2FzZSBBQlNfUlk6CS8qIHRoZSB0d28gc3RpY2tzICovCi0JCQkJaW5wdXRfc2V0X2Fic19wYXJhbXMoaW5wdXRfZGV2LCB0LCAtMzI3NjgsIDMyNzY3LCAxNiwgMTI4KTsKLQkJCQlicmVhazsKLQkJCWNhc2UgQUJTX1o6Ci0JCQljYXNlIEFCU19SWjoJLyogdGhlIHRyaWdnZXJzICovCi0JCQkJaW5wdXRfc2V0X2Fic19wYXJhbXMoaW5wdXRfZGV2LCB0LCAwLCAyNTUsIDAsIDApOwotCQkJCWJyZWFrOwotCQkJY2FzZSBBQlNfSEFUMFg6Ci0JCQljYXNlIEFCU19IQVQwWToJLyogdGhlIGQtcGFkICovCi0JCQkJaW5wdXRfc2V0X2Fic19wYXJhbXMoaW5wdXRfZGV2LCB0LCAtMSwgMSwgMCwgMCk7Ci0JCQkJYnJlYWs7Ci0JCX0KLQl9CisJLyogc2V0IHVwIGF4ZXMgKi8KKwlmb3IgKGkgPSAwOyB4cGFkX2Fic1tpXSA+PSAwOyBpKyspCisJCXhwYWRfc2V0X3VwX2FicyhpbnB1dF9kZXYsIHhwYWRfYWJzW2ldKTsKKwlpZiAoeHBhZC0+ZHBhZF9tYXBwaW5nID09IE1BUF9EUEFEX1RPX0FYRVMpCisJCWZvciAoaSA9IDA7IHhwYWRfYWJzX3BhZFtpXSA+PSAwOyBpKyspCisJCSAgICB4cGFkX3NldF91cF9hYnMoaW5wdXRfZGV2LCB4cGFkX2Fic19wYWRbaV0pOwogCiAJZXBfaXJxX2luID0gJmludGYtPmN1cl9hbHRzZXR0aW5nLT5lbmRwb2ludFswXS5kZXNjOwogCXVzYl9maWxsX2ludF91cmIoeHBhZC0+aXJxX2luLCB1ZGV2LApAQCAtMzA1LDcgKzM5NCw4IEBACiAJCXVzYl9raWxsX3VyYih4cGFkLT5pcnFfaW4pOwogCQlpbnB1dF91bnJlZ2lzdGVyX2RldmljZSh4cGFkLT5kZXYpOwogCQl1c2JfZnJlZV91cmIoeHBhZC0+aXJxX2luKTsKLQkJdXNiX2J1ZmZlcl9mcmVlKGludGVyZmFjZV90b191c2JkZXYoaW50ZiksIFhQQURfUEtUX0xFTiwgeHBhZC0+aWRhdGEsIHhwYWQtPmlkYXRhX2RtYSk7CisJCXVzYl9idWZmZXJfZnJlZShpbnRlcmZhY2VfdG9fdXNiZGV2KGludGYpLCBYUEFEX1BLVF9MRU4sCisJCQkJeHBhZC0+aWRhdGEsIHhwYWQtPmlkYXRhX2RtYSk7CiAJCWtmcmVlKHhwYWQpOwogCX0KIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL21pc2MvS2NvbmZpZyBiL2RyaXZlcnMvdXNiL21pc2MvS2NvbmZpZwppbmRleCBjMjk2NThmLi5hNzRiZjg2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9taXNjL0tjb25maWcKKysrIGIvZHJpdmVycy91c2IvbWlzYy9LY29uZmlnCkBAIC0yMjMsNiArMjIzLDE2IEBACiAJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUKIAkgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCBsZHVzYi4KIAorY29uZmlnIFVTQl9UUkFOQ0VWSUJSQVRPUgorCXRyaXN0YXRlICJQbGF5U3RhdGlvbiAyIFRyYW5jZSBWaWJyYXRvciBkcml2ZXIgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIFVTQgorCWhlbHAKKwkgIFNheSBZIGhlcmUgaWYgeW91IHdhbnQgdG8gY29ubmVjdCBhIFBsYXlTdGF0aW9uIDIgVHJhbmNlIFZpYnJhdG9yCisJICBkZXZpY2UgdG8geW91ciBjb21wdXRlcidzIFVTQiBwb3J0LgorCisJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUKKwkgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCB0cmFuY2V2aWJyYXRvci4KKwogY29uZmlnIFVTQl9URVNUCiAJdHJpc3RhdGUgIlVTQiB0ZXN0aW5nIGRyaXZlciAoREVWRUxPUE1FTlQpIgogCWRlcGVuZHMgb24gVVNCICYmIFVTQl9ERVZJQ0VGUyAmJiBFWFBFUklNRU5UQUwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL21pc2MvTWFrZWZpbGUgYi9kcml2ZXJzL3VzYi9taXNjL01ha2VmaWxlCmluZGV4IDJiZTcwZmEuLjExZGM1OTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL21pc2MvTWFrZWZpbGUKKysrIGIvZHJpdmVycy91c2IvbWlzYy9NYWtlZmlsZQpAQCAtMjEsNiArMjEsNyBAQAogb2JqLSQoQ09ORklHX1VTQl9QSElER0VUU0VSVk8pCSs9IHBoaWRnZXRzZXJ2by5vCiBvYmotJChDT05GSUdfVVNCX1JJTzUwMCkJKz0gcmlvNTAwLm8KIG9iai0kKENPTkZJR19VU0JfVEVTVCkJCSs9IHVzYnRlc3Qubworb2JqLSQoQ09ORklHX1VTQl9UUkFOQ0VWSUJSQVRPUikJKz0gdHJhbmNldmlicmF0b3Iubwogb2JqLSQoQ09ORklHX1VTQl9VU1M3MjApCSs9IHVzczcyMC5vCiAKIG9iai0kKENPTkZJR19VU0JfU0lTVVNCVkdBKQkrPSBzaXN1c2J2Z2EvCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9taXNjL2FkdXR1eC5jIGIvZHJpdmVycy91c2IvbWlzYy9hZHV0dXguYwppbmRleCBhZWNkNjMzLi5hZjI5MzRlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9taXNjL2FkdXR1eC5jCisrKyBiL2RyaXZlcnMvdXNiL21pc2MvYWR1dHV4LmMKQEAgLTM3MCw3ICszNzAsOCBAQAogCXJldHZhbCA9IGFkdV9yZWxlYXNlX2ludGVybmFsKGRldik7CiAKIGV4aXQ6Ci0JdXAoJmRldi0+c2VtKTsKKwlpZiAoZGV2KQorCQl1cCgmZGV2LT5zZW0pOwogCWRiZygyLCIgJXMgOiBsZWF2ZSwgcmV0dXJuIHZhbHVlICVkIiwgX19GVU5DVElPTl9fLCByZXR2YWwpOwogCXJldHVybiByZXR2YWw7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9taXNjL2F1ZXJzd2FsZC5jIGIvZHJpdmVycy91c2IvbWlzYy9hdWVyc3dhbGQuYwppbmRleCAwYmU5ZDYyLi5lNDk3MWQ2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9taXNjL2F1ZXJzd2FsZC5jCisrKyBiL2RyaXZlcnMvdXNiL21pc2MvYXVlcnN3YWxkLmMKQEAgLTc4MCw3ICs3ODAsNyBAQAogCiBibF9mYWlsOi8qIG5vdCBlbm91Z2ggbWVtb3J5LiBGcmVlIGFsbG9jYXRlZCBlbGVtZW50cyAqLwogICAgICAgICBkYmcgKCJhdWVyYnVmX3NldHVwOiBubyBtb3JlIG1lbW9yeSIpOwotCWtmcmVlKGJlcCk7CisJYXVlcmJ1Zl9mcmVlKGJlcCk7CiAgICAgICAgIGF1ZXJidWZfZnJlZV9idWZmZXJzIChiY3ApOwogICAgICAgICByZXR1cm4gLUVOT01FTTsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL21pc2MvZnRkaS1lbGFuLmMgYi9kcml2ZXJzL3VzYi9taXNjL2Z0ZGktZWxhbi5jCmluZGV4IDBlYjI2YTIuLjliNTkxYjggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL21pc2MvZnRkaS1lbGFuLmMKKysrIGIvZHJpdmVycy91c2IvbWlzYy9mdGRpLWVsYW4uYwpAQCAtNTEzLDggKzUxMyw2IEBACiAgICAgICAgICAgICAgICAgICAgICAgICBmdGRpLT5kaXNjb25uZWN0ZWQgKz0gMTsKICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHJldHZhbCA9PSAtRU5PREVWKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBmdGRpLT5kaXNjb25uZWN0ZWQgKz0gMTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHJldHZhbCA9PSAtRU5PREVWKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmdGRpLT5kaXNjb25uZWN0ZWQgKz0gMTsKICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHJldHZhbCA9PSAtRUlMU0VRKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBmdGRpLT5kaXNjb25uZWN0ZWQgKz0gMTsKICAgICAgICAgICAgICAgICB9IGVsc2UgewpAQCAtMTE4NiwxMSArMTE4NCw4IEBACiAgICAgICAgIGludCByZXR2YWwgPSAwOwogICAgICAgICBzdHJ1Y3QgdXJiICp1cmI7CiAgICAgICAgIGNoYXIgKmJ1ZjsKLSAgICAgICAgY2hhciBkYXRhWzMwICozICsgNF07Ci0gICAgICAgIGNoYXIgKmQgPSBkYXRhOwotICAgICAgICBjb25zdCBjaGFyIF9fdXNlciAqcyA9IHVzZXJfYnVmZmVyOwotICAgICAgICBpbnQgbSA9IChzaXplb2YoZGF0YSkgLSAxKSAvIDM7Ci0gICAgICAgIHN0cnVjdCB1c2JfZnRkaSAqZnRkaSA9IChzdHJ1Y3QgdXNiX2Z0ZGkgKilmaWxlLT5wcml2YXRlX2RhdGE7CisgICAgICAgIHN0cnVjdCB1c2JfZnRkaSAqZnRkaSA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwogICAgICAgICBpZiAoZnRkaS0+ZGlzY29ubmVjdGVkID4gMCkgewogICAgICAgICAgICAgICAgIHJldHVybiAtRU5PREVWOwogICAgICAgICB9CkBAIC0xMjIwLDI3ICsxMjE1LDE4IEBACiAgICAgICAgIGlmIChyZXR2YWwpIHsKICAgICAgICAgICAgICAgICBkZXZfZXJyKCZmdGRpLT51ZGV2LT5kZXYsICJmYWlsZWQgc3VibWl0dGluZyB3cml0ZSB1cmIsIGVycm9yICUiCiAgICAgICAgICAgICAgICAgICAgICAgICAiZFxuIiwgcmV0dmFsKTsKLSAgICAgICAgICAgICAgICBnb3RvIGVycm9yXzQ7CisgICAgICAgICAgICAgICAgZ290byBlcnJvcl8zOwogICAgICAgICB9CiAgICAgICAgIHVzYl9mcmVlX3VyYih1cmIpOwotICAgICAgZXhpdDo7Ci0gICAgICAgIGlmIChjb3VudCA+IG0pIHsKLSAgICAgICAgICAgICAgICBpbnQgSSA9IG0gLSAxOwotICAgICAgICAgICAgICAgIHdoaWxlIChJLS0gPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBkICs9IHNwcmludGYoZCwgIiAlMDJYIiwgMHgwMDAwMDBGRiAmICpzKyspOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBkICs9IHNwcmludGYoZCwgIiAuLiIpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGludCBJID0gY291bnQ7Ci0gICAgICAgICAgICAgICAgd2hpbGUgKEktLSA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGQgKz0gc3ByaW50ZihkLCAiICUwMlgiLCAweDAwMDAwMEZGICYgKnMrKyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICB9CisKK2V4aXQ6CiAgICAgICAgIHJldHVybiBjb3VudDsKLSAgICAgIGVycm9yXzQ6IGVycm9yXzM6dXNiX2J1ZmZlcl9mcmVlKGZ0ZGktPnVkZXYsIGNvdW50LCBidWYsCi0gICAgICAgICAgICAgIHVyYi0+dHJhbnNmZXJfZG1hKTsKLSAgICAgIGVycm9yXzI6dXNiX2ZyZWVfdXJiKHVyYik7Ci0gICAgICBlcnJvcl8xOnJldHVybiByZXR2YWw7CitlcnJvcl8zOgorCXVzYl9idWZmZXJfZnJlZShmdGRpLT51ZGV2LCBjb3VudCwgYnVmLCB1cmItPnRyYW5zZmVyX2RtYSk7CitlcnJvcl8yOgorCXVzYl9mcmVlX3VyYih1cmIpOworZXJyb3JfMToKKwlyZXR1cm4gcmV0dmFsOwogfQogCiBzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBmdGRpX2VsYW5fZm9wcyA9IHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2lucHV0L3RyYW5jZXZpYnJhdG9yLmMgYi9kcml2ZXJzL3VzYi9taXNjL3RyYW5jZXZpYnJhdG9yLmMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGRyaXZlcnMvdXNiL2lucHV0L3RyYW5jZXZpYnJhdG9yLmMKcmVuYW1lIHRvIGRyaXZlcnMvdXNiL21pc2MvdHJhbmNldmlicmF0b3IuYwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvbmV0L0tjb25maWcgYi9kcml2ZXJzL3VzYi9uZXQvS2NvbmZpZwppbmRleCAwNTQwNTk2Li5lMDgxODM2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9uZXQvS2NvbmZpZworKysgYi9kcml2ZXJzL3VzYi9uZXQvS2NvbmZpZwpAQCAtOTIsOCArOTIsMTMgQEAKIAkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZQogCSAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIHJ0bDgxNTAuCiAKK2NvbmZpZyBVU0JfVVNCTkVUX01JSQorCXRyaXN0YXRlCisJZGVmYXVsdCBuCisKIGNvbmZpZyBVU0JfVVNCTkVUCiAJdHJpc3RhdGUgIk11bHRpLXB1cnBvc2UgVVNCIE5ldHdvcmtpbmcgRnJhbWV3b3JrIgorCXNlbGVjdCBNSUkgaWYgVVNCTkVUX01JSSAhPSBuCiAJLS0taGVscC0tLQogCSAgVGhpcyBkcml2ZXIgc3VwcG9ydHMgc2V2ZXJhbCBraW5kcyBvZiBuZXR3b3JrIGxpbmtzIG92ZXIgVVNCLAogCSAgd2l0aCAibWluaWRyaXZlcnMiIGJ1aWx0IGFyb3VuZCBhIGNvbW1vbiBuZXR3b3JrIGRyaXZlciBjb3JlCkBAIC0xMjksNyArMTM0LDcgQEAKIAl0cmlzdGF0ZSAiQVNJWCBBWDg4eHh4IEJhc2VkIFVTQiAyLjAgRXRoZXJuZXQgQWRhcHRlcnMiCiAJZGVwZW5kcyBvbiBVU0JfVVNCTkVUICYmIE5FVF9FVEhFUk5FVAogCXNlbGVjdCBDUkMzMgotCXNlbGVjdCBNSUkKKwlzZWxlY3QgVVNCX1VTQk5FVF9NSUkKIAlkZWZhdWx0IHkKIAloZWxwCiAJICBUaGlzIG9wdGlvbiBhZGRzIHN1cHBvcnQgZm9yIEFTSVggQVg4OHh4eCBiYXNlZCBVU0IgMi4wCkBAIC0yMDcsNiArMjEyLDE1IEBACiAJICBDaG9vc2UgdGhpcyBvcHRpb24gaWYgeW91J3JlIHVzaW5nIGEgaG9zdC10by1ob3N0IGNhYmxlCiAJICB3aXRoIG9uZSBvZiB0aGVzZSBjaGlwcy4KIAorY29uZmlnIFVTQl9ORVRfTUNTNzgzMAorCXRyaXN0YXRlICJNb3NDaGlwIE1DUzc4MzAgYmFzZWQgRXRoZXJuZXQgYWRhcHRlcnMiCisJZGVwZW5kcyBvbiBVU0JfVVNCTkVUCisJc2VsZWN0IFVTQl9VU0JORVRfTUlJCisJaGVscAorCSAgQ2hvb3NlIHRoaXMgb3B0aW9uIGlmIHlvdSdyZSB1c2luZyBhIDEwLzEwMCBFdGhlcm5ldCBVU0IyCisJICBhZGFwdGVyIGJhc2VkIG9uIHRoZSBNb3NDaGlwIDc4MzAgY29udHJvbGxlci4gVGhpcyBpbmNsdWRlcworCSAgYWRhcHRlcnMgbWFya2V0ZWQgdW5kZXIgdGhlIERlTE9DSyBicmFuZC4KKwogY29uZmlnIFVTQl9ORVRfUk5ESVNfSE9TVAogCXRyaXN0YXRlICJIb3N0IGZvciBSTkRJUyBkZXZpY2VzIChFWFBFUklNRU5UQUwpIgogCWRlcGVuZHMgb24gVVNCX1VTQk5FVCAmJiBFWFBFUklNRU5UQUwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL25ldC9NYWtlZmlsZSBiL2RyaXZlcnMvdXNiL25ldC9NYWtlZmlsZQppbmRleCAxNjBmMTlkLi43YjUxOTY0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9uZXQvTWFrZWZpbGUKKysrIGIvZHJpdmVycy91c2IvbmV0L01ha2VmaWxlCkBAIC0xNCw2ICsxNCw3IEBACiBvYmotJChDT05GSUdfVVNCX05FVF9STkRJU19IT1NUKQkrPSBybmRpc19ob3N0Lm8KIG9iai0kKENPTkZJR19VU0JfTkVUX0NEQ19TVUJTRVQpCSs9IGNkY19zdWJzZXQubwogb2JqLSQoQ09ORklHX1VTQl9ORVRfWkFVUlVTKQkrPSB6YXVydXMubworb2JqLSQoQ09ORklHX1VTQl9ORVRfTUNTNzgzMCkJKz0gbWNzNzgzMC5vCiBvYmotJChDT05GSUdfVVNCX1VTQk5FVCkJKz0gdXNibmV0Lm8KIAogaWZlcSAoJChDT05GSUdfVVNCX0RFQlVHKSx5KQpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvbmV0L2FzaXguYyBiL2RyaXZlcnMvdXNiL25ldC9hc2l4LmMKaW5kZXggYzczZGQyMi4uODgxODQxZSAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvbmV0L2FzaXguYworKysgYi9kcml2ZXJzL3VzYi9uZXQvYXNpeC5jCkBAIC01NjksMTAgKzU2OSwxMiBAQAogCXN0cnVjdCB1c2JuZXQgKmRldiA9IG5ldGRldl9wcml2KG5ldGRldik7CiAJdTE2IHJlczsKIAorCW11dGV4X2xvY2soJmRldi0+cGh5X211dGV4KTsKIAlhc2l4X3NldF9zd19taWkoZGV2KTsKIAlhc2l4X3JlYWRfY21kKGRldiwgQVhfQ01EX1JFQURfTUlJX1JFRywgcGh5X2lkLAogCQkJCShfX3UxNilsb2MsIDIsICh1MTYgKikmcmVzKTsKIAlhc2l4X3NldF9od19taWkoZGV2KTsKKwltdXRleF91bmxvY2soJmRldi0+cGh5X211dGV4KTsKIAogCWRldmRiZyhkZXYsICJhc2l4X21kaW9fcmVhZCgpIHBoeV9pZD0weCUwMngsIGxvYz0weCUwMngsIHJldHVybnM9MHglMDR4IiwgcGh5X2lkLCBsb2MsIGxlMTZfdG9fY3B1KHJlcyAmIDB4ZmZmZikpOwogCkBAIC01ODYsMTAgKzU4OCwxMiBAQAogCXUxNiByZXMgPSBjcHVfdG9fbGUxNih2YWwpOwogCiAJZGV2ZGJnKGRldiwgImFzaXhfbWRpb193cml0ZSgpIHBoeV9pZD0weCUwMngsIGxvYz0weCUwMngsIHZhbD0weCUwNHgiLCBwaHlfaWQsIGxvYywgdmFsKTsKKwltdXRleF9sb2NrKCZkZXYtPnBoeV9tdXRleCk7CiAJYXNpeF9zZXRfc3dfbWlpKGRldik7CiAJYXNpeF93cml0ZV9jbWQoZGV2LCBBWF9DTURfV1JJVEVfTUlJX1JFRywgcGh5X2lkLAogCQkJCShfX3UxNilsb2MsIDIsICh1MTYgKikmcmVzKTsKIAlhc2l4X3NldF9od19taWkoZGV2KTsKKwltdXRleF91bmxvY2soJmRldi0+cGh5X211dGV4KTsKIH0KIAogLyogR2V0IHRoZSBQSFkgSWRlbnRpZmllciBmcm9tIHRoZSBQSFlTSUQxICYgUEhZU0lEMiBNSUkgcmVnaXN0ZXJzICovCkBAIC03MDAsMzIgKzcwNCw2IEBACiAJaW5mby0+ZWVkdW1wX2xlbiA9IGRhdGEtPmVlcHJvbV9sZW47CiB9CiAKLXN0YXRpYyBpbnQgYXNpeF9nZXRfc2V0dGluZ3Moc3RydWN0IG5ldF9kZXZpY2UgKm5ldCwgc3RydWN0IGV0aHRvb2xfY21kICpjbWQpCi17Ci0Jc3RydWN0IHVzYm5ldCAqZGV2ID0gbmV0ZGV2X3ByaXYobmV0KTsKLQotCXJldHVybiBtaWlfZXRodG9vbF9nc2V0KCZkZXYtPm1paSxjbWQpOwotfQotCi1zdGF0aWMgaW50IGFzaXhfc2V0X3NldHRpbmdzKHN0cnVjdCBuZXRfZGV2aWNlICpuZXQsIHN0cnVjdCBldGh0b29sX2NtZCAqY21kKQotewotCXN0cnVjdCB1c2JuZXQgKmRldiA9IG5ldGRldl9wcml2KG5ldCk7Ci0JaW50IHJlcyA9IG1paV9ldGh0b29sX3NzZXQoJmRldi0+bWlpLGNtZCk7Ci0KLQkvKiBsaW5rIHNwZWVkL2R1cGxleCBtaWdodCBoYXZlIGNoYW5nZWQgKi8KLQlpZiAoZGV2LT5kcml2ZXJfaW5mby0+bGlua19yZXNldCkKLQkJZGV2LT5kcml2ZXJfaW5mby0+bGlua19yZXNldChkZXYpOwotCi0JcmV0dXJuIHJlczsKLX0KLQotc3RhdGljIGludCBhc2l4X253YXlfcmVzZXQoc3RydWN0IG5ldF9kZXZpY2UgKm5ldCkKLXsKLQlzdHJ1Y3QgdXNibmV0ICpkZXYgPSBuZXRkZXZfcHJpdihuZXQpOwotCi0JcmV0dXJuIG1paV9ud2F5X3Jlc3RhcnQoJmRldi0+bWlpKTsKLX0KLQogc3RhdGljIHUzMiBhc2l4X2dldF9saW5rKHN0cnVjdCBuZXRfZGV2aWNlICpuZXQpCiB7CiAJc3RydWN0IHVzYm5ldCAqZGV2ID0gbmV0ZGV2X3ByaXYobmV0KTsKQEAgLTc0NiwxNSArNzI0LDE1IEBACiBzdGF0aWMgc3RydWN0IGV0aHRvb2xfb3BzIGF4ODgxNzJfZXRodG9vbF9vcHMgPSB7CiAJLmdldF9kcnZpbmZvCQk9IGFzaXhfZ2V0X2RydmluZm8sCiAJLmdldF9saW5rCQk9IGFzaXhfZ2V0X2xpbmssCi0JLm53YXlfcmVzZXQJCT0gYXNpeF9ud2F5X3Jlc2V0LAogCS5nZXRfbXNnbGV2ZWwJCT0gdXNibmV0X2dldF9tc2dsZXZlbCwKIAkuc2V0X21zZ2xldmVsCQk9IHVzYm5ldF9zZXRfbXNnbGV2ZWwsCiAJLmdldF93b2wJCT0gYXNpeF9nZXRfd29sLAogCS5zZXRfd29sCQk9IGFzaXhfc2V0X3dvbCwKIAkuZ2V0X2VlcHJvbV9sZW4JCT0gYXNpeF9nZXRfZWVwcm9tX2xlbiwKIAkuZ2V0X2VlcHJvbQkJPSBhc2l4X2dldF9lZXByb20sCi0JLmdldF9zZXR0aW5ncwkJPSBhc2l4X2dldF9zZXR0aW5ncywKLQkuc2V0X3NldHRpbmdzCQk9IGFzaXhfc2V0X3NldHRpbmdzLAorCS5nZXRfc2V0dGluZ3MJCT0gdXNibmV0X2dldF9zZXR0aW5ncywKKwkuc2V0X3NldHRpbmdzCQk9IHVzYm5ldF9zZXRfc2V0dGluZ3MsCisJLm53YXlfcmVzZXQJCT0gdXNibmV0X253YXlfcmVzZXQsCiB9OwogCiBzdGF0aWMgdm9pZCBheDg4MTcyX3NldF9tdWx0aWNhc3Qoc3RydWN0IG5ldF9kZXZpY2UgKm5ldCkKQEAgLTg4NSwxNSArODYzLDE1IEBACiBzdGF0aWMgc3RydWN0IGV0aHRvb2xfb3BzIGF4ODg3NzJfZXRodG9vbF9vcHMgPSB7CiAJLmdldF9kcnZpbmZvCQk9IGFzaXhfZ2V0X2RydmluZm8sCiAJLmdldF9saW5rCQk9IGFzaXhfZ2V0X2xpbmssCi0JLm53YXlfcmVzZXQJCT0gYXNpeF9ud2F5X3Jlc2V0LAogCS5nZXRfbXNnbGV2ZWwJCT0gdXNibmV0X2dldF9tc2dsZXZlbCwKIAkuc2V0X21zZ2xldmVsCQk9IHVzYm5ldF9zZXRfbXNnbGV2ZWwsCiAJLmdldF93b2wJCT0gYXNpeF9nZXRfd29sLAogCS5zZXRfd29sCQk9IGFzaXhfc2V0X3dvbCwKIAkuZ2V0X2VlcHJvbV9sZW4JCT0gYXNpeF9nZXRfZWVwcm9tX2xlbiwKIAkuZ2V0X2VlcHJvbQkJPSBhc2l4X2dldF9lZXByb20sCi0JLmdldF9zZXR0aW5ncwkJPSBhc2l4X2dldF9zZXR0aW5ncywKLQkuc2V0X3NldHRpbmdzCQk9IGFzaXhfc2V0X3NldHRpbmdzLAorCS5nZXRfc2V0dGluZ3MJCT0gdXNibmV0X2dldF9zZXR0aW5ncywKKwkuc2V0X3NldHRpbmdzCQk9IHVzYm5ldF9zZXRfc2V0dGluZ3MsCisJLm53YXlfcmVzZXQJCT0gdXNibmV0X253YXlfcmVzZXQsCiB9OwogCiBzdGF0aWMgaW50IGF4ODg3NzJfbGlua19yZXNldChzdHJ1Y3QgdXNibmV0ICpkZXYpCkBAIC0xMDQ2LDE1ICsxMDI0LDE1IEBACiBzdGF0aWMgc3RydWN0IGV0aHRvb2xfb3BzIGF4ODgxNzhfZXRodG9vbF9vcHMgPSB7CiAJLmdldF9kcnZpbmZvCQk9IGFzaXhfZ2V0X2RydmluZm8sCiAJLmdldF9saW5rCQk9IGFzaXhfZ2V0X2xpbmssCi0JLm53YXlfcmVzZXQJCT0gYXNpeF9ud2F5X3Jlc2V0LAogCS5nZXRfbXNnbGV2ZWwJCT0gdXNibmV0X2dldF9tc2dsZXZlbCwKIAkuc2V0X21zZ2xldmVsCQk9IHVzYm5ldF9zZXRfbXNnbGV2ZWwsCiAJLmdldF93b2wJCT0gYXNpeF9nZXRfd29sLAogCS5zZXRfd29sCQk9IGFzaXhfc2V0X3dvbCwKIAkuZ2V0X2VlcHJvbV9sZW4JCT0gYXNpeF9nZXRfZWVwcm9tX2xlbiwKIAkuZ2V0X2VlcHJvbQkJPSBhc2l4X2dldF9lZXByb20sCi0JLmdldF9zZXR0aW5ncwkJPSBhc2l4X2dldF9zZXR0aW5ncywKLQkuc2V0X3NldHRpbmdzCQk9IGFzaXhfc2V0X3NldHRpbmdzLAorCS5nZXRfc2V0dGluZ3MJCT0gdXNibmV0X2dldF9zZXR0aW5ncywKKwkuc2V0X3NldHRpbmdzCQk9IHVzYm5ldF9zZXRfc2V0dGluZ3MsCisJLm53YXlfcmVzZXQJCT0gdXNibmV0X253YXlfcmVzZXQsCiB9OwogCiBzdGF0aWMgaW50IG1hcnZlbGxfcGh5X2luaXQoc3RydWN0IHVzYm5ldCAqZGV2KQpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvbmV0L2NkY19ldGhlci5jIGIvZHJpdmVycy91c2IvbmV0L2NkY19ldGhlci5jCmluZGV4IDgyY2UwMzUuLmY2OTcxYjggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL25ldC9jZGNfZXRoZXIuYworKysgYi9kcml2ZXJzL3VzYi9uZXQvY2RjX2V0aGVyLmMKQEAgLTQ5OCw3ICs0OTgsNyBAQAogCiBzdGF0aWMgaW50IF9faW5pdCBjZGNfaW5pdCh2b2lkKQogewotCUJVR19PTigoc2l6ZW9mKCgoc3RydWN0IHVzYm5ldCAqKTApLT5kYXRhKQorCUJVSUxEX0JVR19PTigoc2l6ZW9mKCgoc3RydWN0IHVzYm5ldCAqKTApLT5kYXRhKQogCQkJPCBzaXplb2Yoc3RydWN0IGNkY19zdGF0ZSkpKTsKIAogIAlyZXR1cm4gdXNiX3JlZ2lzdGVyKCZjZGNfZHJpdmVyKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL25ldC9rYXdldGguYyBiL2RyaXZlcnMvdXNiL25ldC9rYXdldGguYwppbmRleCA5NTdkNGFkLi43YzkwNmE0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9uZXQva2F3ZXRoLmMKKysrIGIvZHJpdmVycy91c2IvbmV0L2thd2V0aC5jCkBAIC02NSwxNiArNjUsNiBAQAogCiAjdW5kZWYgREVCVUcKIAotI2lmZGVmIERFQlVHCi0jZGVmaW5lIGthd2V0aF9kYmcoZm9ybWF0LCBhcmcuLi4pIHByaW50ayhLRVJOX0RFQlVHIF9fRklMRV9fICI6ICIgZm9ybWF0ICJcbiIgLCMjYXJnKQotI2Vsc2UKLSNkZWZpbmUga2F3ZXRoX2RiZyhmb3JtYXQsIGFyZy4uLikgZG8ge30gd2hpbGUgKDApCi0jZW5kaWYKLSNkZWZpbmUga2F3ZXRoX2Vycihmb3JtYXQsIGFyZy4uLikgcHJpbnRrKEtFUk5fRVJSIF9fRklMRV9fICI6ICIgZm9ybWF0ICJcbiIgLCMjYXJnKQotI2RlZmluZSBrYXdldGhfaW5mbyhmb3JtYXQsIGFyZy4uLikgcHJpbnRrKEtFUk5fSU5GTyBfX0ZJTEVfXyAiOiAiIGZvcm1hdCAiXG4iICwgIyNhcmcpCi0jZGVmaW5lIGthd2V0aF93YXJuKGZvcm1hdCwgYXJnLi4uKSBwcmludGsoS0VSTl9XQVJOSU5HIF9fRklMRV9fICI6ICIgZm9ybWF0ICJcbiIgLCAjI2FyZykKLQotCiAjaW5jbHVkZSAia2F3ZXRoZncuaCIKIAogI2RlZmluZSBLQVdFVEhfTVRVCQkJMTUxNApAQCAtODYsNiArNzYsOSBAQAogCiAjZGVmaW5lIEtBV0VUSF9TVEFUVVNfQlJPS0VOCQkweDAwMDAwMDEKICNkZWZpbmUgS0FXRVRIX1NUQVRVU19DTE9TSU5HCQkweDAwMDAwMDIKKyNkZWZpbmUgS0FXRVRIX1NUQVRVU19TVVNQRU5ESU5HCTB4MDAwMDAwNAorCisjZGVmaW5lIEtBV0VUSF9TVEFUVVNfQkxPQ0tFRCAoS0FXRVRIX1NUQVRVU19DTE9TSU5HIHwgS0FXRVRIX1NUQVRVU19TVVNQRU5ESU5HKQogCiAjZGVmaW5lIEtBV0VUSF9QQUNLRVRfRklMVEVSX1BST01JU0NVT1VTCTB4MDEKICNkZWZpbmUgS0FXRVRIX1BBQ0tFVF9GSUxURVJfQUxMX01VTFRJQ0FTVAkweDAyCkBAIC0xMTIsNiArMTA1LDggQEAKICNkZWZpbmUgU1RBVEVfTUFTSwkJCQkweDQwCiAjZGVmaW5lCVNUQVRFX1NISUZUCQkJCTUKIAorI2RlZmluZSBJU19CTE9DS0VEKHMpIChzICYgS0FXRVRIX1NUQVRVU19CTE9DS0VEKQorCiAKIE1PRFVMRV9BVVRIT1IoIk1pY2hhZWwgWmFwcGUgPHphcG1hbkBpbnRlcmxhbi5uZXQ+LCBTdGVwaGFuZSBBbG5ldCA8c3RlcGhhbmVAdS1waWNhcmRpZS5mcj4sIEJyYWQgSGFyZHMgPGJoYXJkc0BiaWdwb25kLm5ldC5hdT4gYW5kIE9saXZlciBOZXVrdW0gPG9saXZlckBuZXVrdW0ub3JnPiIpOwogTU9EVUxFX0RFU0NSSVBUSU9OKCJLTDVVU0IxMDEgVVNCIEV0aGVybmV0IGRyaXZlciIpOwpAQCAtMTI4LDYgKzEyMyw4IEBACiAJCQkJICAgICAgIHVuc2lnbmVkIGludCBwaXBlLAogCQkJCSAgICAgICBzdHJ1Y3QgdXNiX2N0cmxyZXF1ZXN0ICpjbWQsIHZvaWQgKmRhdGEsCiAJCQkJICAgICAgIGludCBsZW4sIGludCB0aW1lb3V0KTsKK3N0YXRpYyBpbnQga2F3ZXRoX3N1c3BlbmQoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYsIHBtX21lc3NhZ2VfdCBtZXNzYWdlKTsKK3N0YXRpYyBpbnQga2F3ZXRoX3Jlc3VtZShzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50Zik7CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgdXNiX2RldmljZV9pZApAQCAtMTc5LDYgKzE3Niw4IEBACiAJLm5hbWUgPQkJZHJpdmVyX25hbWUsCiAJLnByb2JlID0Ja2F3ZXRoX3Byb2JlLAogCS5kaXNjb25uZWN0ID0Ja2F3ZXRoX2Rpc2Nvbm5lY3QsCisJLnN1c3BlbmQgPQlrYXdldGhfc3VzcGVuZCwKKwkucmVzdW1lID0Ja2F3ZXRoX3Jlc3VtZSwKIAkuaWRfdGFibGUgPSAgICAgdXNiX2tsc2lfdGFibGUsCiB9OwogCkBAIC0yMjIsNiArMjIxLDcgQEAKIAlpbnQgc3VzcGVuZF9sb3dtZW1fcng7CiAJaW50IHN1c3BlbmRfbG93bWVtX2N0cmw7CiAJaW50IGxpbmtzdGF0ZTsKKwlpbnQgb3BlbmVkOwogCXN0cnVjdCB3b3JrX3N0cnVjdCBsb3dtZW1fd29yazsKIAogCXN0cnVjdCB1c2JfZGV2aWNlICpkZXY7CkBAIC0yNjUsMTcgKzI2NSwxNyBAQAogewogCXN0cnVjdCB1c2JfY3RybHJlcXVlc3QgKmRyOwogCi0Ja2F3ZXRoX2RiZygia2F3ZXRoX2NvbnRyb2woKSIpOworCWRiZygia2F3ZXRoX2NvbnRyb2woKSIpOwogCiAJaWYoaW5faW50ZXJydXB0KCkpIHsKLQkJa2F3ZXRoX2RiZygiaW5faW50ZXJydXB0KCkiKTsKKwkJZGJnKCJpbl9pbnRlcnJ1cHQoKSIpOwogCQlyZXR1cm4gLUVCVVNZOwogCX0KIAogCWRyID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IHVzYl9jdHJscmVxdWVzdCksIEdGUF9BVE9NSUMpOwogCiAJaWYgKCFkcikgewotCQlrYXdldGhfZGJnKCJrbWFsbG9jKCkgZmFpbGVkIik7CisJCWRiZygia21hbGxvYygpIGZhaWxlZCIpOwogCQlyZXR1cm4gLUVOT01FTTsKIAl9CiAKQEAgLTMwMCw3ICszMDAsNyBAQAogewogCWludCByZXR2YWw7CiAKLQlrYXdldGhfZGJnKCJSZWFkaW5nIGthd2V0aCBjb25maWd1cmF0aW9uIik7CisJZGJnKCJSZWFkaW5nIGthd2V0aCBjb25maWd1cmF0aW9uIik7CiAKIAlyZXR2YWwgPSBrYXdldGhfY29udHJvbChrYXdldGgsCiAJCQkJdXNiX3JjdmN0cmxwaXBlKGthd2V0aC0+ZGV2LCAwKSwKQEAgLTMyMiw3ICszMjIsNyBAQAogewogCWludCByZXR2YWw7CiAKLQlrYXdldGhfZGJnKCJTZXR0aW5nIFVSQiBzaXplIHRvICVkIiwgKHVuc2lnbmVkKXVyYl9zaXplKTsKKwlkYmcoIlNldHRpbmcgVVJCIHNpemUgdG8gJWQiLCAodW5zaWduZWQpdXJiX3NpemUpOwogCiAJcmV0dmFsID0ga2F3ZXRoX2NvbnRyb2woa2F3ZXRoLAogCQkJCXVzYl9zbmRjdHJscGlwZShrYXdldGgtPmRldiwgMCksCkBAIC0zNDQsNyArMzQ0LDcgQEAKIHsKIAlpbnQgcmV0dmFsOwogCi0Ja2F3ZXRoX2RiZygiU2V0IFNPRlMgd2FpdCB0byAlZCIsICh1bnNpZ25lZClzb2ZzX3dhaXQpOworCWRiZygiU2V0IFNPRlMgd2FpdCB0byAlZCIsICh1bnNpZ25lZClzb2ZzX3dhaXQpOwogCiAJcmV0dmFsID0ga2F3ZXRoX2NvbnRyb2woa2F3ZXRoLAogCQkJCXVzYl9zbmRjdHJscGlwZShrYXdldGgtPmRldiwgMCksCkBAIC0zNjcsNyArMzY3LDcgQEAKIHsKIAlpbnQgcmV0dmFsOwogCi0Ja2F3ZXRoX2RiZygiU2V0IHJlY2VpdmUgZmlsdGVyIHRvICVkIiwgKHVuc2lnbmVkKXJlY2VpdmVfZmlsdGVyKTsKKwlkYmcoIlNldCByZWNlaXZlIGZpbHRlciB0byAlZCIsICh1bnNpZ25lZClyZWNlaXZlX2ZpbHRlcik7CiAKIAlyZXR2YWwgPSBrYXdldGhfY29udHJvbChrYXdldGgsCiAJCQkJdXNiX3NuZGN0cmxwaXBlKGthd2V0aC0+ZGV2LCAwKSwKQEAgLTM5Miw3ICszOTIsNyBAQAogCQkJCSAgICBfX3U4IHR5cGUpCiB7CiAJaWYoZGF0YV9sZW4gPiBLQVdFVEhfRklSTVdBUkVfQlVGX1NJWkUpCXsKLQkJa2F3ZXRoX2VycigiRmlybXdhcmUgdG9vIGJpZzogJWQiLCBkYXRhX2xlbik7CisJCWVycigiRmlybXdhcmUgdG9vIGJpZzogJWQiLCBkYXRhX2xlbik7CiAJCXJldHVybiAtRU5PU1BDOwogCX0KIApAQCAtNDAzLDEzICs0MDMsMTMgQEAKIAlrYXdldGgtPmZpcm13YXJlX2J1Zls0XSA9IHR5cGU7CiAJa2F3ZXRoLT5maXJtd2FyZV9idWZbNV0gPSBpbnRlcnJ1cHQ7CiAKLQlrYXdldGhfZGJnKCJIaWdoOiAlaSwgTG93OiVpIiwga2F3ZXRoLT5maXJtd2FyZV9idWZbM10sCisJZGJnKCJIaWdoOiAlaSwgTG93OiVpIiwga2F3ZXRoLT5maXJtd2FyZV9idWZbM10sCiAJCSAgIGthd2V0aC0+ZmlybXdhcmVfYnVmWzJdKTsKIAotCWthd2V0aF9kYmcoIkRvd25sb2FkaW5nIGZpcm13YXJlIGF0ICVwIHRvIGthd2V0aCBkZXZpY2UgYXQgJXAiLAorCWRiZygiRG93bmxvYWRpbmcgZmlybXdhcmUgYXQgJXAgdG8ga2F3ZXRoIGRldmljZSBhdCAlcCIsCiAJICAgIGRhdGEsCiAJICAgIGthd2V0aCk7Ci0Ja2F3ZXRoX2RiZygiRmlybXdhcmUgbGVuZ3RoOiAlZCIsIGRhdGFfbGVuKTsKKwlkYmcoIkZpcm13YXJlIGxlbmd0aDogJWQiLCBkYXRhX2xlbik7CiAKIAlyZXR1cm4ga2F3ZXRoX2NvbnRyb2woa2F3ZXRoLAogCQkgICAgICAgICAgICAgIHVzYl9zbmRjdHJscGlwZShrYXdldGgtPmRldiwgMCksCkBAIC00MzcsNyArNDM3LDcgQEAKIAlrYXdldGgtPmZpcm13YXJlX2J1Zls2XSA9IDB4MDA7CiAJa2F3ZXRoLT5maXJtd2FyZV9idWZbN10gPSAweDAwOwogCi0Ja2F3ZXRoX2RiZygiVHJpZ2dlcmluZyBmaXJtd2FyZSIpOworCWRiZygiVHJpZ2dlcmluZyBmaXJtd2FyZSIpOwogCiAJcmV0dXJuIGthd2V0aF9jb250cm9sKGthd2V0aCwKIAkJCSAgICAgIHVzYl9zbmRjdHJscGlwZShrYXdldGgtPmRldiwgMCksCkBAIC00NTcsNyArNDU3LDcgQEAKIHsKIAlpbnQgcmVzdWx0OwogCi0Ja2F3ZXRoX2RiZygia2F3ZXRoX3Jlc2V0KCVwKSIsIGthd2V0aCk7CisJZGJnKCJrYXdldGhfcmVzZXQoJXApIiwga2F3ZXRoKTsKIAlyZXN1bHQgPSBrYXdldGhfY29udHJvbChrYXdldGgsCiAJCQkJdXNiX3NuZGN0cmxwaXBlKGthd2V0aC0+ZGV2LCAwKSwKIAkJCQlVU0JfUkVRX1NFVF9DT05GSUdVUkFUSU9OLApAQCAtNDcwLDcgKzQ3MCw3IEBACiAKIAltZGVsYXkoMTApOwogCi0Ja2F3ZXRoX2RiZygia2F3ZXRoX3Jlc2V0KCkgcmV0dXJucyAlZC4iLHJlc3VsdCk7CisJZGJnKCJrYXdldGhfcmVzZXQoKSByZXR1cm5zICVkLiIscmVzdWx0KTsKIAogCXJldHVybiByZXN1bHQ7CiB9CkBAIC01MzQsNyArNTM0LDcgQEAKIHsKIAlzdHJ1Y3Qga2F3ZXRoX2RldmljZSAqa2F3ZXRoID0gKHN0cnVjdCBrYXdldGhfZGV2aWNlICopZDsKIAotCWlmIChrYXdldGgtPnN0YXR1cyB8IEtBV0VUSF9TVEFUVVNfQ0xPU0lORykKKwlpZiAoSVNfQkxPQ0tFRChrYXdldGgtPnN0YXR1cykpCiAJCXJldHVybjsKIAogCWlmIChrYXdldGgtPnN1c3BlbmRfbG93bWVtX3J4KQpAQCAtNTY4LDcgKzU2OCw3IEBACiAJCQlrYXdldGgtPnN1c3BlbmRfbG93bWVtX3J4ID0gMTsKIAkJCXNjaGVkdWxlX2RlbGF5ZWRfd29yaygma2F3ZXRoLT5sb3dtZW1fd29yaywgSFovNCk7CiAJCX0KLQkJa2F3ZXRoX2VycigicmVzdWJtaXR0aW5nIHJ4X3VyYiAlZCBmYWlsZWQiLCByZXN1bHQpOworCQllcnIoInJlc3VibWl0dGluZyByeF91cmIgJWQgZmFpbGVkIiwgcmVzdWx0KTsKIAl9IGVsc2UgewogCQlrYXdldGgtPnN1c3BlbmRfbG93bWVtX3J4ID0gMDsKIAl9CkBAIC02MDEsMTEgKzYwMSwxNSBAQAogCQlyZXR1cm47CiAJfQogCi0JaWYgKGthd2V0aC0+c3RhdHVzICYgS0FXRVRIX1NUQVRVU19DTE9TSU5HKQorCXNwaW5fbG9jaygma2F3ZXRoLT5kZXZpY2VfbG9jayk7CisJaWYgKElTX0JMT0NLRUQoa2F3ZXRoLT5zdGF0dXMpKSB7CisJCXNwaW5fdW5sb2NrKCZrYXdldGgtPmRldmljZV9sb2NrKTsKIAkJcmV0dXJuOworCX0KKwlzcGluX3VubG9jaygma2F3ZXRoLT5kZXZpY2VfbG9jayk7CiAKIAlpZih1cmItPnN0YXR1cyAmJiB1cmItPnN0YXR1cyAhPSAtRVJFTU9URUlPICYmIGNvdW50ICE9IDEpIHsKLQkJa2F3ZXRoX2VycigiJXMgUlggc3RhdHVzOiAlZCBjb3VudDogJWQgcGFja2V0X2xlbjogJWQiLAorCQllcnIoIiVzIFJYIHN0YXR1czogJWQgY291bnQ6ICVkIHBhY2tldF9sZW46ICVkIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldC0+bmFtZSwKIAkJCSAgIHVyYi0+c3RhdHVzLAogCQkJICAgY291bnQsCkBAIC02MTYsOSArNjIwLDkgQEAKIAogCWlmKGthd2V0aC0+bmV0ICYmIChjb3VudCA+IDIpKSB7CiAJCWlmKHBrdF9sZW4gPiAoY291bnQgLSAyKSkgewotCQkJa2F3ZXRoX2VycigiUGFja2V0IGxlbmd0aCB0b28gbG9uZyBmb3IgVVNCIGZyYW1lIChwa3RfbGVuOiAleCwgY291bnQ6ICV4KSIscGt0X2xlbiwgY291bnQpOwotCQkJa2F3ZXRoX2VycigiUGFja2V0IGxlbiAmIDIwNDc6ICV4IiwgcGt0X2xlbiAmIDIwNDcpOwotCQkJa2F3ZXRoX2VycigiQ291bnQgMjogJXgiLCBjb3VudDIpOworCQkJZXJyKCJQYWNrZXQgbGVuZ3RoIHRvbyBsb25nIGZvciBVU0IgZnJhbWUgKHBrdF9sZW46ICV4LCBjb3VudDogJXgpIixwa3RfbGVuLCBjb3VudCk7CisJCQllcnIoIlBhY2tldCBsZW4gJiAyMDQ3OiAleCIsIHBrdF9sZW4gJiAyMDQ3KTsKKwkJCWVycigiQ291bnQgMjogJXgiLCBjb3VudDIpOwogCQkgICAgICAgIGthd2V0aF9yZXN1Ym1pdF9yeF91cmIoa2F3ZXRoLCBHRlBfQVRPTUlDKTsKICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICB9CkBAIC02NTUsNyArNjU5LDcgQEAKIAlzdHJ1Y3Qga2F3ZXRoX2RldmljZSAqa2F3ZXRoID0gbmV0ZGV2X3ByaXYobmV0KTsKIAlpbnQgcmVzOwogCi0Ja2F3ZXRoX2RiZygiT3BlbmluZyBuZXR3b3JrIGRldmljZS4iKTsKKwlkYmcoIk9wZW5pbmcgbmV0d29yayBkZXZpY2UuIik7CiAKIAlyZXMgPSBrYXdldGhfcmVzdWJtaXRfcnhfdXJiKGthd2V0aCwgR0ZQX0tFUk5FTCk7CiAJaWYgKHJlcykKQEAgLTY3OCw2ICs2ODIsNyBAQAogCQl1c2Jfa2lsbF91cmIoa2F3ZXRoLT5yeF91cmIpOwogCQlyZXR1cm4gLUVJTzsKIAl9CisJa2F3ZXRoLT5vcGVuZWQgPSAxOwogCiAJbmV0aWZfc3RhcnRfcXVldWUobmV0KTsKIApAQCAtNjg4LDE0ICs2OTMsOCBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICAgICBrYXdldGhfY2xvc2UKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIGludCBrYXdldGhfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKm5ldCkKK3N0YXRpYyB2b2lkIGthd2V0aF9raWxsX3VyYnMoc3RydWN0IGthd2V0aF9kZXZpY2UgKmthd2V0aCkKIHsKLQlzdHJ1Y3Qga2F3ZXRoX2RldmljZSAqa2F3ZXRoID0gbmV0ZGV2X3ByaXYobmV0KTsKLQotCW5ldGlmX3N0b3BfcXVldWUobmV0KTsKLQotCWthd2V0aC0+c3RhdHVzIHw9IEtBV0VUSF9TVEFUVVNfQ0xPU0lORzsKLQogCXVzYl9raWxsX3VyYihrYXdldGgtPmlycV91cmIpOwogCXVzYl9raWxsX3VyYihrYXdldGgtPnJ4X3VyYik7CiAJdXNiX2tpbGxfdXJiKGthd2V0aC0+dHhfdXJiKTsKQEAgLTcwNiw2ICs3MDUsMjEgQEAKIAkgICB3ZSBoaXQgdGhlbSBhZ2FpbiAqLwogCXVzYl9raWxsX3VyYihrYXdldGgtPmlycV91cmIpOwogCXVzYl9raWxsX3VyYihrYXdldGgtPnJ4X3VyYik7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAga2F3ZXRoX2Nsb3NlCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBpbnQga2F3ZXRoX2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpuZXQpCit7CisJc3RydWN0IGthd2V0aF9kZXZpY2UgKmthd2V0aCA9IG5ldGRldl9wcml2KG5ldCk7CisKKwluZXRpZl9zdG9wX3F1ZXVlKG5ldCk7CisJa2F3ZXRoLT5vcGVuZWQgPSAwOworCisJa2F3ZXRoLT5zdGF0dXMgfD0gS0FXRVRIX1NUQVRVU19DTE9TSU5HOworCisJa2F3ZXRoX2tpbGxfdXJicyhrYXdldGgpOwogCiAJa2F3ZXRoLT5zdGF0dXMgJj0gfktBV0VUSF9TVEFUVVNfQ0xPU0lORzsKIApAQCAtNzMyLDcgKzc0Niw3IEBACiAKIAlpZiAodW5saWtlbHkodXJiLT5zdGF0dXMgIT0gMCkpCiAJCWlmICh1cmItPnN0YXR1cyAhPSAtRU5PRU5UKQotCQkJa2F3ZXRoX2RiZygiJXM6IFRYIHN0YXR1cyAlZC4iLCBrYXdldGgtPm5ldC0+bmFtZSwgdXJiLT5zdGF0dXMpOworCQkJZGJnKCIlczogVFggc3RhdHVzICVkLiIsIGthd2V0aC0+bmV0LT5uYW1lLCB1cmItPnN0YXR1cyk7CiAKIAluZXRpZl93YWtlX3F1ZXVlKGthd2V0aC0+bmV0KTsKIAlkZXZfa2ZyZWVfc2tiX2lycShza2IpOwpAQCAtNzUyLDYgKzc2Niw5IEBACiAKIAlrYXdldGhfYXN5bmNfc2V0X3J4X21vZGUoa2F3ZXRoKTsKIAluZXRpZl9zdG9wX3F1ZXVlKG5ldCk7CisJaWYgKElTX0JMT0NLRUQoa2F3ZXRoLT5zdGF0dXMpKSB7CisJCWdvdG8gc2tpcDsKKwl9CiAKIAkvKiBXZSBub3cgZGVjaWRlIHdoZXRoZXIgd2UgY2FuIHB1dCBvdXIgc3BlY2lhbCBoZWFkZXIgaW50byB0aGUgc2tfYnVmZiAqLwogCWlmIChza2JfY2xvbmVkKHNrYikgfHwgc2tiX2hlYWRyb29tKHNrYikgPCAyKSB7CkBAIC03ODMsNyArODAwLDggQEAKIAogCWlmKChyZXMgPSB1c2Jfc3VibWl0X3VyYihrYXdldGgtPnR4X3VyYiwgR0ZQX0FUT01JQykpKQogCXsKLQkJa2F3ZXRoX3dhcm4oImthd2V0aCBmYWlsZWQgdHhfdXJiICVkIiwgcmVzKTsKKwkJd2Fybigia2F3ZXRoIGZhaWxlZCB0eF91cmIgJWQiLCByZXMpOworc2tpcDoKIAkJa2F3ZXRoLT5zdGF0cy50eF9lcnJvcnMrKzsKIAogCQluZXRpZl9zdGFydF9xdWV1ZShuZXQpOwpAQCAtODEyLDcgKzgzMCw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgS0FXRVRIX1BBQ0tFVF9GSUxURVJfQlJPQURDQVNUIHwKIAkJICAgICAgICAgICAgICAgICAgICAgS0FXRVRIX1BBQ0tFVF9GSUxURVJfTVVMVElDQVNUOwogCi0Ja2F3ZXRoX2RiZygiU2V0dGluZyBSeCBtb2RlIHRvICVkIiwgcGFja2V0X2ZpbHRlcl9iaXRtYXApOworCWRiZygiU2V0dGluZyBSeCBtb2RlIHRvICVkIiwgcGFja2V0X2ZpbHRlcl9iaXRtYXApOwogCiAJbmV0aWZfc3RvcF9xdWV1ZShuZXQpOwogCkBAIC04NTAsMTAgKzg2OCwxMCBAQAogCQkJCUtBV0VUSF9DT05UUk9MX1RJTUVPVVQpOwogCiAJaWYocmVzdWx0IDwgMCkgewotCQlrYXdldGhfZXJyKCJGYWlsZWQgdG8gc2V0IFJ4IG1vZGU6ICVkIiwgcmVzdWx0KTsKKwkJZXJyKCJGYWlsZWQgdG8gc2V0IFJ4IG1vZGU6ICVkIiwgcmVzdWx0KTsKIAl9CiAJZWxzZSB7Ci0JCWthd2V0aF9kYmcoIlNldCBSeCBtb2RlIHRvICVkIiwgcGFja2V0X2ZpbHRlcl9iaXRtYXApOworCQlkYmcoIlNldCBSeCBtb2RlIHRvICVkIiwgcGFja2V0X2ZpbHRlcl9iaXRtYXApOwogCX0KIAl9CiB9CkBAIC04NzQsNyArODkyLDcgQEAKIHsKIAlzdHJ1Y3Qga2F3ZXRoX2RldmljZSAqa2F3ZXRoID0gbmV0ZGV2X3ByaXYobmV0KTsKIAotCWthd2V0aF93YXJuKCIlczogVHggdGltZWQgb3V0LiBSZXNldHRpbmcuIiwgbmV0LT5uYW1lKTsKKwl3YXJuKCIlczogVHggdGltZWQgb3V0LiBSZXNldHRpbmcuIiwgbmV0LT5uYW1lKTsKIAlrYXdldGgtPnN0YXRzLnR4X2Vycm9ycysrOwogCW5ldC0+dHJhbnNfc3RhcnQgPSBqaWZmaWVzOwogCkBAIC04ODIsNiArOTAwLDQyIEBACiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAga2F3ZXRoX3N1c3BlbmQKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGludCBrYXdldGhfc3VzcGVuZChzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZiwgcG1fbWVzc2FnZV90IG1lc3NhZ2UpCit7CisJc3RydWN0IGthd2V0aF9kZXZpY2UgKmthd2V0aCA9IHVzYl9nZXRfaW50ZmRhdGEoaW50Zik7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZrYXdldGgtPmRldmljZV9sb2NrLCBmbGFncyk7CisJa2F3ZXRoLT5zdGF0dXMgfD0gS0FXRVRIX1NUQVRVU19TVVNQRU5ESU5HOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmthd2V0aC0+ZGV2aWNlX2xvY2ssIGZsYWdzKTsKKworCWthd2V0aF9raWxsX3VyYnMoa2F3ZXRoKTsKKwlyZXR1cm4gMDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICBrYXdldGhfcmVzdW1lCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBpbnQga2F3ZXRoX3Jlc3VtZShzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZikKK3sKKwlzdHJ1Y3Qga2F3ZXRoX2RldmljZSAqa2F3ZXRoID0gdXNiX2dldF9pbnRmZGF0YShpbnRmKTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmthd2V0aC0+ZGV2aWNlX2xvY2ssIGZsYWdzKTsKKwlrYXdldGgtPnN0YXR1cyAmPSB+S0FXRVRIX1NUQVRVU19TVVNQRU5ESU5HOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmthd2V0aC0+ZGV2aWNlX2xvY2ssIGZsYWdzKTsKKworCWlmICgha2F3ZXRoLT5vcGVuZWQpCisJCXJldHVybiAwOworCWthd2V0aF9yZXN1Ym1pdF9yeF91cmIoa2F3ZXRoLCBHRlBfTk9JTyk7CisJa2F3ZXRoX3Jlc3VibWl0X2ludF91cmIoa2F3ZXRoLCBHRlBfTk9JTyk7CisKKwlyZXR1cm4gMDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICAgICBrYXdldGhfcHJvYmUKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogc3RhdGljIGludCBrYXdldGhfcHJvYmUoCkBAIC04OTUsMTUgKzk0OSwxNSBAQAogCWNvbnN0IGV0aF9hZGRyX3QgYmNhc3RfYWRkciA9IHsgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiB9OwogCWludCByZXN1bHQgPSAwOwogCi0Ja2F3ZXRoX2RiZygiS2F3YXNha2kgRGV2aWNlIFByb2JlIChEZXZpY2UgbnVtYmVyOiVkKTogMHglNC40eDoweCU0LjR4OjB4JTQuNHgiLAorCWRiZygiS2F3YXNha2kgRGV2aWNlIFByb2JlIChEZXZpY2UgbnVtYmVyOiVkKTogMHglNC40eDoweCU0LjR4OjB4JTQuNHgiLAogCQkgZGV2LT5kZXZudW0sCiAJCSBsZTE2X3RvX2NwdShkZXYtPmRlc2NyaXB0b3IuaWRWZW5kb3IpLAogCQkgbGUxNl90b19jcHUoZGV2LT5kZXNjcmlwdG9yLmlkUHJvZHVjdCksCiAJCSBsZTE2X3RvX2NwdShkZXYtPmRlc2NyaXB0b3IuYmNkRGV2aWNlKSk7CiAKLQlrYXdldGhfZGJnKCJEZXZpY2UgYXQgJXAiLCBkZXYpOworCWRiZygiRGV2aWNlIGF0ICVwIiwgZGV2KTsKIAotCWthd2V0aF9kYmcoIkRlc2NyaXB0b3IgbGVuZ3RoOiAleCB0eXBlOiAleCIsCisJZGJnKCJEZXNjcmlwdG9yIGxlbmd0aDogJXggdHlwZTogJXgiLAogCQkgKGludClkZXYtPmRlc2NyaXB0b3IuYkxlbmd0aCwKIAkJIChpbnQpZGV2LT5kZXNjcmlwdG9yLmJEZXNjcmlwdG9yVHlwZSk7CiAKQEAgLTkxOCw3ICs5NzIsNyBAQAogCXNwaW5fbG9ja19pbml0KCZrYXdldGgtPmRldmljZV9sb2NrKTsKIAlpbml0X3dhaXRxdWV1ZV9oZWFkKCZrYXdldGgtPnRlcm1fd2FpdCk7CiAKLQlrYXdldGhfZGJnKCJSZXNldHRpbmcuIik7CisJZGJnKCJSZXNldHRpbmcuIik7CiAKIAlrYXdldGhfcmVzZXQoa2F3ZXRoKTsKIApAQCAtOTI4LDE3ICs5ODIsMTcgQEAKIAkgKi8KIAogCWlmIChsZTE2X3RvX2NwdShkZXYtPmRlc2NyaXB0b3IuYmNkRGV2aWNlKSA+PiA4KSB7Ci0JCWthd2V0aF9pbmZvKCJGaXJtd2FyZSBwcmVzZW50IGluIGRldmljZS4iKTsKKwkJaW5mbygiRmlybXdhcmUgcHJlc2VudCBpbiBkZXZpY2UuIik7CiAJfSBlbHNlIHsKIAkJLyogRG93bmxvYWQgdGhlIGZpcm13YXJlICovCi0JCWthd2V0aF9pbmZvKCJEb3dubG9hZGluZyBmaXJtd2FyZS4uLiIpOworCQlpbmZvKCJEb3dubG9hZGluZyBmaXJtd2FyZS4uLiIpOwogCQlrYXdldGgtPmZpcm13YXJlX2J1ZiA9IChfX3U4ICopX19nZXRfZnJlZV9wYWdlKEdGUF9LRVJORUwpOwogCQlpZiAoKHJlc3VsdCA9IGthd2V0aF9kb3dubG9hZF9maXJtd2FyZShrYXdldGgsCiAJCQkJCQkgICAgICBrYXdldGhfbmV3X2NvZGUsCiAJCQkJCQkgICAgICBsZW5fa2F3ZXRoX25ld19jb2RlLAogCQkJCQkJICAgICAgMTAwLAogCQkJCQkJICAgICAgMikpIDwgMCkgewotCQkJa2F3ZXRoX2VycigiRXJyb3IgZG93bmxvYWRpbmcgZmlybXdhcmUgKCVkKSIsIHJlc3VsdCk7CisJCQllcnIoIkVycm9yIGRvd25sb2FkaW5nIGZpcm13YXJlICglZCkiLCByZXN1bHQpOwogCQkJZ290byBlcnJfZnc7CiAJCX0KIApAQCAtOTQ3LDcgKzEwMDEsNyBAQAogCQkJCQkJICAgICAgbGVuX2thd2V0aF9uZXdfY29kZV9maXgsCiAJCQkJCQkgICAgICAxMDAsCiAJCQkJCQkgICAgICAzKSkgPCAwKSB7Ci0JCQlrYXdldGhfZXJyKCJFcnJvciBkb3dubG9hZGluZyBmaXJtd2FyZSBmaXggKCVkKSIsIHJlc3VsdCk7CisJCQllcnIoIkVycm9yIGRvd25sb2FkaW5nIGZpcm13YXJlIGZpeCAoJWQpIiwgcmVzdWx0KTsKIAkJCWdvdG8gZXJyX2Z3OwogCQl9CiAKQEAgLTk1Niw3ICsxMDEwLDcgQEAKIAkJCQkJCSAgICAgIGxlbl9rYXdldGhfdHJpZ2dlcl9jb2RlLAogCQkJCQkJICAgICAgMTI2LAogCQkJCQkJICAgICAgMikpIDwgMCkgewotCQkJa2F3ZXRoX2VycigiRXJyb3IgZG93bmxvYWRpbmcgdHJpZ2dlciBjb2RlICglZCkiLCByZXN1bHQpOworCQkJZXJyKCJFcnJvciBkb3dubG9hZGluZyB0cmlnZ2VyIGNvZGUgKCVkKSIsIHJlc3VsdCk7CiAJCQlnb3RvIGVycl9mdzsKIAogCQl9CkBAIC05NjYsMTggKzEwMjAsMTggQEAKIAkJCQkJCSAgICAgIGxlbl9rYXdldGhfdHJpZ2dlcl9jb2RlX2ZpeCwKIAkJCQkJCSAgICAgIDEyNiwKIAkJCQkJCSAgICAgIDMpKSA8IDApIHsKLQkJCWthd2V0aF9lcnIoIkVycm9yIGRvd25sb2FkaW5nIHRyaWdnZXIgY29kZSBmaXggKCVkKSIsIHJlc3VsdCk7CisJCQllcnIoIkVycm9yIGRvd25sb2FkaW5nIHRyaWdnZXIgY29kZSBmaXggKCVkKSIsIHJlc3VsdCk7CiAJCQlnb3RvIGVycl9mdzsKIAkJfQogCiAKIAkJaWYgKChyZXN1bHQgPSBrYXdldGhfdHJpZ2dlcl9maXJtd2FyZShrYXdldGgsIDEyNikpIDwgMCkgewotCQkJa2F3ZXRoX2VycigiRXJyb3IgdHJpZ2dlcmluZyBmaXJtd2FyZSAoJWQpIiwgcmVzdWx0KTsKKwkJCWVycigiRXJyb3IgdHJpZ2dlcmluZyBmaXJtd2FyZSAoJWQpIiwgcmVzdWx0KTsKIAkJCWdvdG8gZXJyX2Z3OwogCQl9CiAKIAkJLyogRGV2aWNlIHdpbGwgbm93IGRpc2FwcGVhciBmb3IgYSBtb21lbnQuLi4gICovCi0JCWthd2V0aF9pbmZvKCJGaXJtd2FyZSBsb2FkZWQuICBJJ2xsIGJlIGJhY2suLi4iKTsKKwkJaW5mbygiRmlybXdhcmUgbG9hZGVkLiAgSSdsbCBiZSBiYWNrLi4uIik7CiBlcnJfZnc6CiAJCWZyZWVfcGFnZSgodW5zaWduZWQgbG9uZylrYXdldGgtPmZpcm13YXJlX2J1Zik7CiAJCWZyZWVfbmV0ZGV2KG5ldGRldik7CkBAIC05ODcsMTQgKzEwNDEsMTQgQEAKIAlyZXN1bHQgPSBrYXdldGhfcmVhZF9jb25maWd1cmF0aW9uKGthd2V0aCk7CiAKIAlpZihyZXN1bHQgPCAwKSB7Ci0JCWthd2V0aF9lcnIoIkVycm9yIHJlYWRpbmcgY29uZmlndXJhdGlvbiAoJWQpLCBubyBuZXQgZGV2aWNlIGNyZWF0ZWQiLCByZXN1bHQpOworCQllcnIoIkVycm9yIHJlYWRpbmcgY29uZmlndXJhdGlvbiAoJWQpLCBubyBuZXQgZGV2aWNlIGNyZWF0ZWQiLCByZXN1bHQpOwogCQlnb3RvIGVycl9mcmVlX25ldGRldjsKIAl9CiAKLQlrYXdldGhfaW5mbygiU3RhdGlzdGljcyBjb2xsZWN0aW9uOiAleCIsIGthd2V0aC0+Y29uZmlndXJhdGlvbi5zdGF0aXN0aWNzX21hc2spOwotCWthd2V0aF9pbmZvKCJNdWx0aWNhc3QgZmlsdGVyIGxpbWl0OiAleCIsIGthd2V0aC0+Y29uZmlndXJhdGlvbi5tYXhfbXVsdGljYXN0X2ZpbHRlcnMgJiAoKDEgPDwgMTUpIC0gMSkpOwotCWthd2V0aF9pbmZvKCJNVFU6ICVkIiwgbGUxNl90b19jcHUoa2F3ZXRoLT5jb25maWd1cmF0aW9uLnNlZ21lbnRfc2l6ZSkpOwotCWthd2V0aF9pbmZvKCJSZWFkIE1BQyBhZGRyZXNzICUyLjJ4OiUyLjJ4OiUyLjJ4OiUyLjJ4OiUyLjJ4OiUyLjJ4IiwKKwlpbmZvKCJTdGF0aXN0aWNzIGNvbGxlY3Rpb246ICV4Iiwga2F3ZXRoLT5jb25maWd1cmF0aW9uLnN0YXRpc3RpY3NfbWFzayk7CisJaW5mbygiTXVsdGljYXN0IGZpbHRlciBsaW1pdDogJXgiLCBrYXdldGgtPmNvbmZpZ3VyYXRpb24ubWF4X211bHRpY2FzdF9maWx0ZXJzICYgKCgxIDw8IDE1KSAtIDEpKTsKKwlpbmZvKCJNVFU6ICVkIiwgbGUxNl90b19jcHUoa2F3ZXRoLT5jb25maWd1cmF0aW9uLnNlZ21lbnRfc2l6ZSkpOworCWluZm8oIlJlYWQgTUFDIGFkZHJlc3MgJTIuMng6JTIuMng6JTIuMng6JTIuMng6JTIuMng6JTIuMngiLAogCQkgKGludClrYXdldGgtPmNvbmZpZ3VyYXRpb24uaHdfYWRkclswXSwKIAkJIChpbnQpa2F3ZXRoLT5jb25maWd1cmF0aW9uLmh3X2FkZHJbMV0sCiAJCSAoaW50KWthd2V0aC0+Y29uZmlndXJhdGlvbi5od19hZGRyWzJdLApAQCAtMTAwNSwxNyArMTA1OSwxNyBAQAogCWlmKCFtZW1jbXAoJmthd2V0aC0+Y29uZmlndXJhdGlvbi5od19hZGRyLAogICAgICAgICAgICAgICAgICAgICZiY2FzdF9hZGRyLAogCQkgICBzaXplb2YoYmNhc3RfYWRkcikpKSB7Ci0JCWthd2V0aF9lcnIoIkZpcm13YXJlIG5vdCBmdW5jdGlvbmluZyBwcm9wZXJseSwgbm8gbmV0IGRldmljZSBjcmVhdGVkIik7CisJCWVycigiRmlybXdhcmUgbm90IGZ1bmN0aW9uaW5nIHByb3Blcmx5LCBubyBuZXQgZGV2aWNlIGNyZWF0ZWQiKTsKIAkJZ290byBlcnJfZnJlZV9uZXRkZXY7CiAJfQogCiAJaWYoa2F3ZXRoX3NldF91cmJfc2l6ZShrYXdldGgsIEtBV0VUSF9CVUZfU0laRSkgPCAwKSB7Ci0JCWthd2V0aF9kYmcoIkVycm9yIHNldHRpbmcgVVJCIHNpemUiKTsKKwkJZGJnKCJFcnJvciBzZXR0aW5nIFVSQiBzaXplIik7CiAJCWdvdG8gZXJyX2ZyZWVfbmV0ZGV2OwogCX0KIAogCWlmKGthd2V0aF9zZXRfc29mc193YWl0KGthd2V0aCwgS0FXRVRIX1NPRlNfVE9fV0FJVCkgPCAwKSB7Ci0JCWthd2V0aF9lcnIoIkVycm9yIHNldHRpbmcgU09GUyB3YWl0Iik7CisJCWVycigiRXJyb3Igc2V0dGluZyBTT0ZTIHdhaXQiKTsKIAkJZ290byBlcnJfZnJlZV9uZXRkZXY7CiAJfQogCkBAIC0xMDI1LDExICsxMDc5LDExIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgS0FXRVRIX1BBQ0tFVF9GSUxURVJfTVVMVElDQVNUKTsKIAogCWlmKHJlc3VsdCA8IDApIHsKLQkJa2F3ZXRoX2VycigiRXJyb3Igc2V0dGluZyByZWNlaXZlIGZpbHRlciIpOworCQllcnIoIkVycm9yIHNldHRpbmcgcmVjZWl2ZSBmaWx0ZXIiKTsKIAkJZ290byBlcnJfZnJlZV9uZXRkZXY7CiAJfQogCi0Ja2F3ZXRoX2RiZygiSW5pdGlhbGl6aW5nIG5ldCBkZXZpY2UuIik7CisJZGJnKCJJbml0aWFsaXppbmcgbmV0IGRldmljZS4iKTsKIAogCWthd2V0aC0+dHhfdXJiID0gdXNiX2FsbG9jX3VyYigwLCBHRlBfS0VSTkVMKTsKIAlpZiAoIWthd2V0aC0+dHhfdXJiKQpAQCAtMTA4NiwxMyArMTE0MCwxMyBAQAogCiAJU0VUX05FVERFVl9ERVYobmV0ZGV2LCAmaW50Zi0+ZGV2KTsKIAlpZiAocmVnaXN0ZXJfbmV0ZGV2KG5ldGRldikgIT0gMCkgewotCQlrYXdldGhfZXJyKCJFcnJvciByZWdpc3RlcmluZyBuZXRkZXYuIik7CisJCWVycigiRXJyb3IgcmVnaXN0ZXJpbmcgbmV0ZGV2LiIpOwogCQlnb3RvIGVycl9pbnRmZGF0YTsKIAl9CiAKLQlrYXdldGhfaW5mbygia2F3ZXRoIGludGVyZmFjZSBjcmVhdGVkIGF0ICVzIiwga2F3ZXRoLT5uZXQtPm5hbWUpOworCWluZm8oImthd2V0aCBpbnRlcmZhY2UgY3JlYXRlZCBhdCAlcyIsIGthd2V0aC0+bmV0LT5uYW1lKTsKIAotCWthd2V0aF9kYmcoIkthd2V0aCBwcm9iZSByZXR1cm5pbmcuIik7CisJZGJnKCJLYXdldGggcHJvYmUgcmV0dXJuaW5nLiIpOwogCiAJcmV0dXJuIDA7CiAKQEAgLTExMjEsMTYgKzExNzUsMTYgQEAKIAlzdHJ1Y3Qga2F3ZXRoX2RldmljZSAqa2F3ZXRoID0gdXNiX2dldF9pbnRmZGF0YShpbnRmKTsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2OwogCi0Ja2F3ZXRoX2luZm8oIlVucmVnaXN0ZXJpbmciKTsKKwlpbmZvKCJVbnJlZ2lzdGVyaW5nIik7CiAKIAl1c2Jfc2V0X2ludGZkYXRhKGludGYsIE5VTEwpOwogCWlmICgha2F3ZXRoKSB7Ci0JCWthd2V0aF93YXJuKCJ1bnJlZ2lzdGVyaW5nIG5vbi1leGlzdGFudCBkZXZpY2UiKTsKKwkJd2FybigidW5yZWdpc3RlcmluZyBub24tZXhpc3RhbnQgZGV2aWNlIik7CiAJCXJldHVybjsKIAl9CiAJbmV0ZGV2ID0ga2F3ZXRoLT5uZXQ7CiAKLQlrYXdldGhfZGJnKCJVbnJlZ2lzdGVyaW5nIG5ldCBkZXZpY2UiKTsKKwlkYmcoIlVucmVnaXN0ZXJpbmcgbmV0IGRldmljZSIpOwogCXVucmVnaXN0ZXJfbmV0ZGV2KG5ldGRldik7CiAKIAl1c2JfZnJlZV91cmIoa2F3ZXRoLT5yeF91cmIpOwpAQCAtMTE4NSw3ICsxMjM5LDcgQEAKIAogCWlmICghd2FpdF9ldmVudF90aW1lb3V0KGF3ZC53cWgsIGF3ZC5kb25lLCB0aW1lb3V0KSkgewogICAgICAgICAgICAgICAgIC8vIHRpbWVvdXQKLSAgICAgICAgICAgICAgICBrYXdldGhfd2FybigidXNiX2NvbnRyb2wvYnVsa19tc2c6IHRpbWVvdXQiKTsKKyAgICAgICAgICAgICAgICB3YXJuKCJ1c2JfY29udHJvbC9idWxrX21zZzogdGltZW91dCIpOwogICAgICAgICAgICAgICAgIHVzYl9raWxsX3VyYih1cmIpOyAgLy8gcmVtb3ZlIHVyYiBzYWZlbHkKICAgICAgICAgICAgICAgICBzdGF0dXMgPSAtRVRJTUVET1VUOwogICAgICAgICB9CkBAIC0xMjM0LDcgKzEyODgsNyBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBzdGF0aWMgaW50IF9faW5pdCBrYXdldGhfaW5pdCh2b2lkKQogewotCWthd2V0aF9kYmcoIkRyaXZlciBsb2FkaW5nIik7CisJZGJnKCJEcml2ZXIgbG9hZGluZyIpOwogCXJldHVybiB1c2JfcmVnaXN0ZXIoJmthd2V0aF9kcml2ZXIpOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9uZXQvbWNzNzgzMC5jIGIvZHJpdmVycy91c2IvbmV0L21jczc4MzAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MjQwYjk3Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy91c2IvbmV0L21jczc4MzAuYwpAQCAtMCwwICsxLDUzNCBAQAorLyoKKyAqIE1vc0NoaXBzIE1DUzc4MzAgYmFzZWQgVVNCIDIuMCBFdGhlcm5ldCBEZXZpY2VzCisgKgorICogYmFzZWQgb24gdXNibmV0LmMsIGFzaXguYyBhbmQgdGhlIHZlbmRvciBwcm92aWRlZCBtY3M3ODMwIGRyaXZlcgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNiBBcm5kIEJlcmdtYW5uIDxhcm5kQGFybmRiLmRlPgorICogQ29weXJpZ2h0IChDKSAyMDAzLTIwMDUgRGF2aWQgSG9sbGlzIDxkaG9sbGlzQGRhdmVob2xsaXMuY29tPgorICogQ29weXJpZ2h0IChDKSAyMDA1IFBoaWwgQ2hhbmcgPHBjaGFuZzIzQHNiY2dsb2JhbC5uZXQ+CisgKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwMyBUaVZvIEluYy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2NyYzMyLmg+CisjaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9ldGh0b29sLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L21paS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3VzYi5oPgorCisjaW5jbHVkZSAidXNibmV0LmgiCisKKy8qIHJlcXVlc3RzICovCisjZGVmaW5lIE1DUzc4MzBfUkRfQk1SRVEJKFVTQl9ESVJfSU4gIHwgVVNCX1RZUEVfVkVORE9SIHwgXAorCQkJCSBVU0JfUkVDSVBfREVWSUNFKQorI2RlZmluZSBNQ1M3ODMwX1dSX0JNUkVRCShVU0JfRElSX09VVCB8IFVTQl9UWVBFX1ZFTkRPUiB8IFwKKwkJCQkgVVNCX1JFQ0lQX0RFVklDRSkKKyNkZWZpbmUgTUNTNzgzMF9SRF9CUkVRCQkweDBFCisjZGVmaW5lIE1DUzc4MzBfV1JfQlJFUQkJMHgwRAorCisjZGVmaW5lIE1DUzc4MzBfQ1RSTF9USU1FT1VUCTEwMDAKKyNkZWZpbmUgTUNTNzgzMF9NQVhfTUNBU1QJNjQKKworI2RlZmluZSBNQ1M3ODMwX1ZFTkRPUl9JRAkweDk3MTAKKyNkZWZpbmUgTUNTNzgzMF9QUk9EVUNUX0lECTB4NzgzMAorCisjZGVmaW5lIE1DUzc4MzBfTUlJX0FEVkVSVElTRQkoQURWRVJUSVNFX1BBVVNFX0NBUCB8IEFEVkVSVElTRV8xMDBGVUxMIHwgXAorCQkJCSBBRFZFUlRJU0VfMTAwSEFMRiB8IEFEVkVSVElTRV8xMEZVTEwgfCBcCisJCQkJIEFEVkVSVElTRV8xMEhBTEYgfCBBRFZFUlRJU0VfQ1NNQSkKKworLyogSElGX1JFR19YWCBjb3Jlc3Nwb25kaW5nIGluZGV4IHZhbHVlICovCitlbnVtIHsKKwlISUZfUkVHX01VTFRJQ0FTVF9IQVNICQkJPSAweDAwLAorCUhJRl9SRUdfUEFDS0VUX0dBUDEJCQk9IDB4MDgsCisJSElGX1JFR19QQUNLRVRfR0FQMgkJCT0gMHgwOSwKKwlISUZfUkVHX1BIWV9EQVRBCQkJPSAweDBhLAorCUhJRl9SRUdfUEhZX0NNRDEJCQk9IDB4MGMsCisJICAgSElGX1JFR19QSFlfQ01EMV9SRUFECQk9IDB4NDAsCisJICAgSElGX1JFR19QSFlfQ01EMV9XUklURQkJPSAweDIwLAorCSAgIEhJRl9SRUdfUEhZX0NNRDFfUEhZQUREUgkJPSAweDAxLAorCUhJRl9SRUdfUEhZX0NNRDIJCQk9IDB4MGQsCisJICAgSElGX1JFR19QSFlfQ01EMl9QRU5EX0ZMQUdfQklUCT0gMHg4MCwKKwkgICBISUZfUkVHX1BIWV9DTUQyX1JFQURZX0ZMQUdfQklUCT0gMHg0MCwKKwlISUZfUkVHX0NPTkZJRwkJCQk9IDB4MGUsCisJICAgSElGX1JFR19DT05GSUdfQ0ZHCQkJPSAweDgwLAorCSAgIEhJRl9SRUdfQ09ORklHX1NQRUVEMTAwCQk9IDB4NDAsCisJICAgSElGX1JFR19DT05GSUdfRlVMTERVUExFWF9FTkFCTEUJPSAweDIwLAorCSAgIEhJRl9SRUdfQ09ORklHX1JYRU5BQkxFCQk9IDB4MTAsCisJICAgSElGX1JFR19DT05GSUdfVFhFTkFCTEUJCT0gMHgwOCwKKwkgICBISUZfUkVHX0NPTkZJR19TTEVFUE1PREUJCT0gMHgwNCwKKwkgICBISUZfUkVHX0NPTkZJR19BTExNVUxUSUNBU1QJCT0gMHgwMiwKKwkgICBISUZfUkVHX0NPTkZJR19QUk9NSVNDSU9VUwkJPSAweDAxLAorCUhJRl9SRUdfRVRIRVJORVRfQUREUgkJCT0gMHgwZiwKKwlISUZfUkVHXzIyCQkJCT0gMHgxNSwKKwlISUZfUkVHX1BBVVNFX1RIUkVTSE9MRAkJCT0gMHgxNiwKKwkgICBISUZfUkVHX1BBVVNFX1RIUkVTSE9MRF9ERUZBVUxUCT0gMCwKK307CisKK3N0cnVjdCBtY3M3ODMwX2RhdGEgeworCXU4IG11bHRpX2ZpbHRlcls4XTsKKwl1OCBjb25maWc7Cit9OworCitzdGF0aWMgY29uc3QgY2hhciBkcml2ZXJfbmFtZVtdID0gIk1PU0NISVAgdXNiLWV0aGVybmV0IGRyaXZlciI7CisKK3N0YXRpYyBpbnQgbWNzNzgzMF9nZXRfcmVnKHN0cnVjdCB1c2JuZXQgKmRldiwgdTE2IGluZGV4LCB1MTYgc2l6ZSwgdm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgdXNiX2RldmljZSAqeGRldiA9IGRldi0+dWRldjsKKwlpbnQgcmV0OworCisJcmV0ID0gdXNiX2NvbnRyb2xfbXNnKHhkZXYsIHVzYl9yY3ZjdHJscGlwZSh4ZGV2LCAwKSwgTUNTNzgzMF9SRF9CUkVRLAorCQkJICAgICAgTUNTNzgzMF9SRF9CTVJFUSwgMHgwMDAwLCBpbmRleCwgZGF0YSwKKwkJCSAgICAgIHNpemUsIG1zZWNzX3RvX2ppZmZpZXMoTUNTNzgzMF9DVFJMX1RJTUVPVVQpKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IG1jczc4MzBfc2V0X3JlZyhzdHJ1Y3QgdXNibmV0ICpkZXYsIHUxNiBpbmRleCwgdTE2IHNpemUsIHZvaWQgKmRhdGEpCit7CisJc3RydWN0IHVzYl9kZXZpY2UgKnhkZXYgPSBkZXYtPnVkZXY7CisJaW50IHJldDsKKworCXJldCA9IHVzYl9jb250cm9sX21zZyh4ZGV2LCB1c2Jfc25kY3RybHBpcGUoeGRldiwgMCksIE1DUzc4MzBfV1JfQlJFUSwKKwkJCSAgICAgIE1DUzc4MzBfV1JfQk1SRVEsIDB4MDAwMCwgaW5kZXgsIGRhdGEsCisJCQkgICAgICBzaXplLCBtc2Vjc190b19qaWZmaWVzKE1DUzc4MzBfQ1RSTF9USU1FT1VUKSk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgbWNzNzgzMF9hc3luY19jbWRfY2FsbGJhY2soc3RydWN0IHVyYiAqdXJiKQoreworCXN0cnVjdCB1c2JfY3RybHJlcXVlc3QgKnJlcSA9IChzdHJ1Y3QgdXNiX2N0cmxyZXF1ZXN0ICopdXJiLT5jb250ZXh0OworCisJaWYgKHVyYi0+c3RhdHVzIDwgMCkKKwkJcHJpbnRrKEtFUk5fREVCVUcgIm1jczc4MzBfYXN5bmNfY21kX2NhbGxiYWNrKCkgZmFpbGVkIHdpdGggJWQiLAorCQkJdXJiLT5zdGF0dXMpOworCisJa2ZyZWUocmVxKTsKKwl1c2JfZnJlZV91cmIodXJiKTsKK30KKworc3RhdGljIHZvaWQgbWNzNzgzMF9zZXRfcmVnX2FzeW5jKHN0cnVjdCB1c2JuZXQgKmRldiwgdTE2IGluZGV4LCB1MTYgc2l6ZSwgdm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgdXNiX2N0cmxyZXF1ZXN0ICpyZXE7CisJaW50IHJldDsKKwlzdHJ1Y3QgdXJiICp1cmI7CisKKwl1cmIgPSB1c2JfYWxsb2NfdXJiKDAsIEdGUF9BVE9NSUMpOworCWlmICghdXJiKSB7CisJCWRldl9kYmcoJmRldi0+dWRldi0+ZGV2LCAiRXJyb3IgYWxsb2NhdGluZyBVUkIgIgorCQkJCSJpbiB3cml0ZV9jbWRfYXN5bmMhIik7CisJCXJldHVybjsKKwl9CisKKwlyZXEgPSBrbWFsbG9jKHNpemVvZiAqcmVxLCBHRlBfQVRPTUlDKTsKKwlpZiAoIXJlcSkgeworCQlkZXZfZXJyKCZkZXYtPnVkZXYtPmRldiwgIkZhaWxlZCB0byBhbGxvY2F0ZSBtZW1vcnkgZm9yICIKKwkJCQkiY29udHJvbCByZXF1ZXN0Iik7CisJCWdvdG8gb3V0OworCX0KKwlyZXEtPmJSZXF1ZXN0VHlwZSA9IE1DUzc4MzBfV1JfQk1SRVE7CisJcmVxLT5iUmVxdWVzdCA9IE1DUzc4MzBfV1JfQlJFUTsKKwlyZXEtPndWYWx1ZSA9IDA7CisJcmVxLT53SW5kZXggPSBjcHVfdG9fbGUxNihpbmRleCk7CisJcmVxLT53TGVuZ3RoID0gY3B1X3RvX2xlMTYoc2l6ZSk7CisKKwl1c2JfZmlsbF9jb250cm9sX3VyYih1cmIsIGRldi0+dWRldiwKKwkJCSAgICAgdXNiX3NuZGN0cmxwaXBlKGRldi0+dWRldiwgMCksCisJCQkgICAgICh2b2lkICopcmVxLCBkYXRhLCBzaXplLAorCQkJICAgICBtY3M3ODMwX2FzeW5jX2NtZF9jYWxsYmFjaywgcmVxKTsKKworCXJldCA9IHVzYl9zdWJtaXRfdXJiKHVyYiwgR0ZQX0FUT01JQyk7CisJaWYgKHJldCA8IDApIHsKKwkJZGV2X2VycigmZGV2LT51ZGV2LT5kZXYsICJFcnJvciBzdWJtaXR0aW5nIHRoZSBjb250cm9sICIKKwkJCQkibWVzc2FnZTogcmV0PSVkIiwgcmV0KTsKKwkJZ290byBvdXQ7CisJfQorCXJldHVybjsKK291dDoKKwlrZnJlZShyZXEpOworCXVzYl9mcmVlX3VyYih1cmIpOworfQorCitzdGF0aWMgaW50IG1jczc4MzBfZ2V0X2FkZHJlc3Moc3RydWN0IHVzYm5ldCAqZGV2KQoreworCWludCByZXQ7CisJcmV0ID0gbWNzNzgzMF9nZXRfcmVnKGRldiwgSElGX1JFR19FVEhFUk5FVF9BRERSLCBFVEhfQUxFTiwKKwkJCQkgICBkZXYtPm5ldC0+ZGV2X2FkZHIpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG1jczc4MzBfcmVhZF9waHkoc3RydWN0IHVzYm5ldCAqZGV2LCB1OCBpbmRleCkKK3sKKwlpbnQgcmV0OworCWludCBpOworCV9fbGUxNiB2YWw7CisKKwl1OCBjbWRbMl0gPSB7CisJCUhJRl9SRUdfUEhZX0NNRDFfUkVBRCB8IEhJRl9SRUdfUEhZX0NNRDFfUEhZQUREUiwKKwkJSElGX1JFR19QSFlfQ01EMl9QRU5EX0ZMQUdfQklUIHwgaW5kZXgsCisJfTsKKworCW11dGV4X2xvY2soJmRldi0+cGh5X211dGV4KTsKKwkvKiB3cml0ZSB0aGUgTUlJIGNvbW1hbmQgKi8KKwlyZXQgPSBtY3M3ODMwX3NldF9yZWcoZGV2LCBISUZfUkVHX1BIWV9DTUQxLCAyLCBjbWQpOworCWlmIChyZXQgPCAwKQorCQlnb3RvIG91dDsKKworCS8qIHdhaXQgZm9yIHRoZSBkYXRhIHRvIGJlY29tZSB2YWxpZCwgc2hvdWxkIGJlIHdpdGhpbiA8IDFtcyAqLworCWZvciAoaSA9IDA7IGkgPCAxMDsgaSsrKSB7CisJCXJldCA9IG1jczc4MzBfZ2V0X3JlZyhkZXYsIEhJRl9SRUdfUEhZX0NNRDEsIDIsIGNtZCk7CisJCWlmICgocmV0IDwgMCkgfHwgKGNtZFsxXSAmIEhJRl9SRUdfUEhZX0NNRDJfUkVBRFlfRkxBR19CSVQpKQorCQkJYnJlYWs7CisJCXJldCA9IC1FSU87CisJCW1zbGVlcCgxKTsKKwl9CisJaWYgKHJldCA8IDApCisJCWdvdG8gb3V0OworCisJLyogcmVhZCBhY3R1YWwgcmVnaXN0ZXIgY29udGVudHMgKi8KKwlyZXQgPSBtY3M3ODMwX2dldF9yZWcoZGV2LCBISUZfUkVHX1BIWV9EQVRBLCAyLCAmdmFsKTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBvdXQ7CisJcmV0ID0gbGUxNl90b19jcHUodmFsKTsKKwlkZXZfZGJnKCZkZXYtPnVkZXYtPmRldiwgInJlYWQgUEhZIHJlZyAlMDJ4OiAlMDR4ICglZCB0cmllcylcbiIsCisJCWluZGV4LCB2YWwsIGkpOworb3V0OgorCW11dGV4X3VubG9jaygmZGV2LT5waHlfbXV0ZXgpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgbWNzNzgzMF93cml0ZV9waHkoc3RydWN0IHVzYm5ldCAqZGV2LCB1OCBpbmRleCwgdTE2IHZhbCkKK3sKKwlpbnQgcmV0OworCWludCBpOworCV9fbGUxNiBsZV92YWw7CisKKwl1OCBjbWRbMl0gPSB7CisJCUhJRl9SRUdfUEhZX0NNRDFfV1JJVEUgfCBISUZfUkVHX1BIWV9DTUQxX1BIWUFERFIsCisJCUhJRl9SRUdfUEhZX0NNRDJfUEVORF9GTEFHX0JJVCB8IChpbmRleCAmIDB4MUYpLAorCX07CisKKwltdXRleF9sb2NrKCZkZXYtPnBoeV9tdXRleCk7CisKKwkvKiB3cml0ZSB0aGUgbmV3IHJlZ2lzdGVyIGNvbnRlbnRzICovCisJbGVfdmFsID0gY3B1X3RvX2xlMTYodmFsKTsKKwlyZXQgPSBtY3M3ODMwX3NldF9yZWcoZGV2LCBISUZfUkVHX1BIWV9EQVRBLCAyLCAmbGVfdmFsKTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBvdXQ7CisKKwkvKiB3cml0ZSB0aGUgTUlJIGNvbW1hbmQgKi8KKwlyZXQgPSBtY3M3ODMwX3NldF9yZWcoZGV2LCBISUZfUkVHX1BIWV9DTUQxLCAyLCBjbWQpOworCWlmIChyZXQgPCAwKQorCQlnb3RvIG91dDsKKworCS8qIHdhaXQgZm9yIHRoZSBjb21tYW5kIHRvIGJlIGFjY2VwdGVkIGJ5IHRoZSBQSFkgKi8KKwlmb3IgKGkgPSAwOyBpIDwgMTA7IGkrKykgeworCQlyZXQgPSBtY3M3ODMwX2dldF9yZWcoZGV2LCBISUZfUkVHX1BIWV9DTUQxLCAyLCBjbWQpOworCQlpZiAoKHJldCA8IDApIHx8IChjbWRbMV0gJiBISUZfUkVHX1BIWV9DTUQyX1JFQURZX0ZMQUdfQklUKSkKKwkJCWJyZWFrOworCQlyZXQgPSAtRUlPOworCQltc2xlZXAoMSk7CisJfQorCWlmIChyZXQgPCAwKQorCQlnb3RvIG91dDsKKworCXJldCA9IDA7CisJZGV2X2RiZygmZGV2LT51ZGV2LT5kZXYsICJ3cml0ZSBQSFkgcmVnICUwMng6ICUwNHggKCVkIHRyaWVzKVxuIiwKKwkJaW5kZXgsIHZhbCwgaSk7CitvdXQ6CisJbXV0ZXhfdW5sb2NrKCZkZXYtPnBoeV9tdXRleCk7CisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqIFRoaXMgYWxnb3JpdGhtIGNvbWVzIGZyb20gdGhlIG9yaWdpbmFsIG1jczc4MzAgdmVyc2lvbiAxLjQgZHJpdmVyLAorICogbm90IHN1cmUgaWYgaXQgaXMgbmVlZGVkLgorICovCitzdGF0aWMgaW50IG1jczc4MzBfc2V0X2F1dG9uZWcoc3RydWN0IHVzYm5ldCAqZGV2LCBpbnQgcHRyVXNlclBoeU1vZGUpCit7CisJaW50IHJldDsKKwkvKiBFbmFibGUgYWxsIG1lZGlhIHR5cGVzICovCisJcmV0ID0gbWNzNzgzMF93cml0ZV9waHkoZGV2LCBNSUlfQURWRVJUSVNFLCBNQ1M3ODMwX01JSV9BRFZFUlRJU0UpOworCisJLyogRmlyc3QgcmVzZXQgQk1DUiAqLworCWlmICghcmV0KQorCQlyZXQgPSBtY3M3ODMwX3dyaXRlX3BoeShkZXYsIE1JSV9CTUNSLCAweDAwMDApOworCS8qIEVuYWJsZSBBdXRvIE5lZyAqLworCWlmICghcmV0KQorCQlyZXQgPSBtY3M3ODMwX3dyaXRlX3BoeShkZXYsIE1JSV9CTUNSLCBCTUNSX0FORU5BQkxFKTsKKwkvKiBSZXN0YXJ0IEF1dG8gTmVnIChLZWVwIHRoZSBFbmFibGUgQXV0byBOZWcgQml0IFNldCkgKi8KKwlpZiAoIXJldCkKKwkJcmV0ID0gbWNzNzgzMF93cml0ZV9waHkoZGV2LCBNSUlfQk1DUiwKKwkJCQlCTUNSX0FORU5BQkxFIHwgQk1DUl9BTlJFU1RBUlQJKTsKKwlyZXR1cm4gcmV0IDwgMCA/IDogMDsKK30KKworCisvKgorICogaWYgd2UgY2FuIHJlYWQgcmVnaXN0ZXIgMjIsIHRoZSBjaGlwIHJldmlzaW9uIGlzIEMgb3IgaGlnaGVyCisgKi8KK3N0YXRpYyBpbnQgbWNzNzgzMF9nZXRfcmV2KHN0cnVjdCB1c2JuZXQgKmRldikKK3sKKwl1OCBkdW1teVsyXTsKKwlpbnQgcmV0OworCXJldCA9IG1jczc4MzBfZ2V0X3JlZyhkZXYsIEhJRl9SRUdfMjIsIDIsIGR1bW15KTsKKwlpZiAocmV0ID4gMCkKKwkJcmV0dXJuIDI7IC8qIFJldiBDIG9yIGxhdGVyICovCisJcmV0dXJuIDE7IC8qIGVhcmxpZXIgcmV2aXNpb24gKi8KK30KKworLyoKKyAqIE9uIHJldi4gQyB3ZSBuZWVkIHRvIHNldCB0aGUgcGF1c2UgdGhyZXNob2xkCisgKi8KK3N0YXRpYyB2b2lkIG1jczc4MzBfcmV2X0NfZml4dXAoc3RydWN0IHVzYm5ldCAqZGV2KQoreworCXU4IHBhdXNlX3RocmVzaG9sZCA9IEhJRl9SRUdfUEFVU0VfVEhSRVNIT0xEX0RFRkFVTFQ7CisJaW50IHJldHJ5OworCisJZm9yIChyZXRyeSA9IDA7IHJldHJ5IDwgMjsgcmV0cnkrKykgeworCQlpZiAobWNzNzgzMF9nZXRfcmV2KGRldikgPT0gMikgeworCQkJZGV2X2luZm8oJmRldi0+dWRldi0+ZGV2LCAiYXBwbHlpbmcgcmV2LkMgZml4dXBcbiIpOworCQkJbWNzNzgzMF9zZXRfcmVnKGRldiwgSElGX1JFR19QQVVTRV9USFJFU0hPTEQsCisJCQkJCTEsICZwYXVzZV90aHJlc2hvbGQpOworCQl9CisJCW1zbGVlcCgxKTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgbWNzNzgzMF9pbml0X2RldihzdHJ1Y3QgdXNibmV0ICpkZXYpCit7CisJaW50IHJldDsKKwlpbnQgcmV0cnk7CisKKwkvKiBSZWFkIE1BQyBhZGRyZXNzIGZyb20gRUVQUk9NICovCisJcmV0ID0gLUVJTlZBTDsKKwlmb3IgKHJldHJ5ID0gMDsgcmV0cnkgPCA1ICYmIHJldDsgcmV0cnkrKykKKwkJcmV0ID0gbWNzNzgzMF9nZXRfYWRkcmVzcyhkZXYpOworCWlmIChyZXQpIHsKKwkJZGV2X3dhcm4oJmRldi0+dWRldi0+ZGV2LCAiQ2Fubm90IHJlYWQgTUFDIGFkZHJlc3NcbiIpOworCQlnb3RvIG91dDsKKwl9CisKKwkvKiBTZXQgdXAgUEhZICovCisJcmV0ID0gbWNzNzgzMF9zZXRfYXV0b25lZyhkZXYsIDApOworCWlmIChyZXQpIHsKKwkJZGV2X2luZm8oJmRldi0+dWRldi0+ZGV2LCAiQ2Fubm90IHNldCBhdXRvbmVnXG4iKTsKKwkJZ290byBvdXQ7CisJfQorCisJbWNzNzgzMF9yZXZfQ19maXh1cChkZXYpOworCXJldCA9IDA7CitvdXQ6CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBtY3M3ODMwX21kaW9fcmVhZChzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LCBpbnQgcGh5X2lkLAorCQkJICAgICBpbnQgbG9jYXRpb24pCit7CisJc3RydWN0IHVzYm5ldCAqZGV2ID0gbmV0ZGV2LT5wcml2OworCXJldHVybiBtY3M3ODMwX3JlYWRfcGh5KGRldiwgbG9jYXRpb24pOworfQorCitzdGF0aWMgdm9pZCBtY3M3ODMwX21kaW9fd3JpdGUoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwgaW50IHBoeV9pZCwKKwkJCQlpbnQgbG9jYXRpb24sIGludCB2YWwpCit7CisJc3RydWN0IHVzYm5ldCAqZGV2ID0gbmV0ZGV2LT5wcml2OworCW1jczc4MzBfd3JpdGVfcGh5KGRldiwgbG9jYXRpb24sIHZhbCk7Cit9CisKK3N0YXRpYyBpbnQgbWNzNzgzMF9pb2N0bChzdHJ1Y3QgbmV0X2RldmljZSAqbmV0LCBzdHJ1Y3QgaWZyZXEgKnJxLCBpbnQgY21kKQoreworCXN0cnVjdCB1c2JuZXQgKmRldiA9IG5ldGRldl9wcml2KG5ldCk7CisJcmV0dXJuIGdlbmVyaWNfbWlpX2lvY3RsKCZkZXYtPm1paSwgaWZfbWlpKHJxKSwgY21kLCBOVUxMKTsKK30KKworLyogY3JlZGl0cyBnbyB0byBhc2l4X3NldF9tdWx0aWNhc3QgKi8KK3N0YXRpYyB2b2lkIG1jczc4MzBfc2V0X211bHRpY2FzdChzdHJ1Y3QgbmV0X2RldmljZSAqbmV0KQoreworCXN0cnVjdCB1c2JuZXQgKmRldiA9IG5ldGRldl9wcml2KG5ldCk7CisJc3RydWN0IG1jczc4MzBfZGF0YSAqZGF0YSA9IChzdHJ1Y3QgbWNzNzgzMF9kYXRhICopJmRldi0+ZGF0YTsKKworCWRhdGEtPmNvbmZpZyA9IEhJRl9SRUdfQ09ORklHX1RYRU5BQkxFOworCisJLyogdGhpcyBzaG91bGQgbm90IGJlIG5lZWRlZCwgYnV0IGl0IGRvZXNuJ3Qgd29yayBvdGhlcndpc2UgKi8KKwlkYXRhLT5jb25maWcgfD0gSElGX1JFR19DT05GSUdfQUxMTVVMVElDQVNUOworCisJaWYgKG5ldC0+ZmxhZ3MgJiBJRkZfUFJPTUlTQykgeworCQlkYXRhLT5jb25maWcgfD0gSElGX1JFR19DT05GSUdfUFJPTUlTQ0lPVVM7CisJfSBlbHNlIGlmIChuZXQtPmZsYWdzICYgSUZGX0FMTE1VTFRJCisJCSAgIHx8IG5ldC0+bWNfY291bnQgPiBNQ1M3ODMwX01BWF9NQ0FTVCkgeworCQlkYXRhLT5jb25maWcgfD0gSElGX1JFR19DT05GSUdfQUxMTVVMVElDQVNUOworCX0gZWxzZSBpZiAobmV0LT5tY19jb3VudCA9PSAwKSB7CisJCS8qIGp1c3QgYnJvYWRjYXN0IGFuZCBkaXJlY3RlZCAqLworCX0gZWxzZSB7CisJCS8qIFdlIHVzZSB0aGUgMjAgYnl0ZSBkZXYtPmRhdGEKKwkJICogZm9yIG91ciA4IGJ5dGUgZmlsdGVyIGJ1ZmZlcgorCQkgKiB0byBhdm9pZCBhbGxvY2F0aW5nIG1lbW9yeSB0aGF0CisJCSAqIGlzIHRyaWNreSB0byBmcmVlIGxhdGVyICovCisJCXN0cnVjdCBkZXZfbWNfbGlzdCAqbWNfbGlzdCA9IG5ldC0+bWNfbGlzdDsKKwkJdTMyIGNyY19iaXRzOworCQlpbnQgaTsKKworCQltZW1zZXQoZGF0YS0+bXVsdGlfZmlsdGVyLCAwLCBzaXplb2YgZGF0YS0+bXVsdGlfZmlsdGVyKTsKKworCQkvKiBCdWlsZCB0aGUgbXVsdGljYXN0IGhhc2ggZmlsdGVyLiAqLworCQlmb3IgKGkgPSAwOyBpIDwgbmV0LT5tY19jb3VudDsgaSsrKSB7CisJCQljcmNfYml0cyA9IGV0aGVyX2NyYyhFVEhfQUxFTiwgbWNfbGlzdC0+ZG1pX2FkZHIpID4+IDI2OworCQkJZGF0YS0+bXVsdGlfZmlsdGVyW2NyY19iaXRzID4+IDNdIHw9IDEgPDwgKGNyY19iaXRzICYgNyk7CisJCQltY19saXN0ID0gbWNfbGlzdC0+bmV4dDsKKwkJfQorCisJCW1jczc4MzBfc2V0X3JlZ19hc3luYyhkZXYsIEhJRl9SRUdfTVVMVElDQVNUX0hBU0gsCisJCQkJc2l6ZW9mIGRhdGEtPm11bHRpX2ZpbHRlciwKKwkJCQlkYXRhLT5tdWx0aV9maWx0ZXIpOworCX0KKworCW1jczc4MzBfc2V0X3JlZ19hc3luYyhkZXYsIEhJRl9SRUdfQ09ORklHLCAxLCAmZGF0YS0+Y29uZmlnKTsKK30KKworc3RhdGljIGludCBtY3M3ODMwX2dldF9yZWdzX2xlbihzdHJ1Y3QgbmV0X2RldmljZSAqbmV0KQoreworCXN0cnVjdCB1c2JuZXQgKmRldiA9IG5ldGRldl9wcml2KG5ldCk7CisKKwlzd2l0Y2ggKG1jczc4MzBfZ2V0X3JldihkZXYpKSB7CisJY2FzZSAxOgorCQlyZXR1cm4gMjE7CisJY2FzZSAyOgorCQlyZXR1cm4gMzI7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBtY3M3ODMwX2dldF9kcnZpbmZvKHN0cnVjdCBuZXRfZGV2aWNlICpuZXQsIHN0cnVjdCBldGh0b29sX2RydmluZm8gKmRydmluZm8pCit7CisJdXNibmV0X2dldF9kcnZpbmZvKG5ldCwgZHJ2aW5mbyk7CisJZHJ2aW5mby0+cmVnZHVtcF9sZW4gPSBtY3M3ODMwX2dldF9yZWdzX2xlbihuZXQpOworfQorCitzdGF0aWMgdm9pZCBtY3M3ODMwX2dldF9yZWdzKHN0cnVjdCBuZXRfZGV2aWNlICpuZXQsIHN0cnVjdCBldGh0b29sX3JlZ3MgKnJlZ3MsIHZvaWQgKmRhdGEpCit7CisJc3RydWN0IHVzYm5ldCAqZGV2ID0gbmV0ZGV2X3ByaXYobmV0KTsKKworCXJlZ3MtPnZlcnNpb24gPSBtY3M3ODMwX2dldF9yZXYoZGV2KTsKKwltY3M3ODMwX2dldF9yZWcoZGV2LCAwLCByZWdzLT5sZW4sIGRhdGEpOworfQorCitzdGF0aWMgc3RydWN0IGV0aHRvb2xfb3BzIG1jczc4MzBfZXRodG9vbF9vcHMgPSB7CisJLmdldF9kcnZpbmZvCQk9IG1jczc4MzBfZ2V0X2RydmluZm8sCisJLmdldF9yZWdzX2xlbgkJPSBtY3M3ODMwX2dldF9yZWdzX2xlbiwKKwkuZ2V0X3JlZ3MJCT0gbWNzNzgzMF9nZXRfcmVncywKKworCS8qIGNvbW1vbiB1c2JuZXQgY2FsbHMgKi8KKwkuZ2V0X2xpbmsJCT0gdXNibmV0X2dldF9saW5rLAorCS5nZXRfbXNnbGV2ZWwJCT0gdXNibmV0X2dldF9tc2dsZXZlbCwKKwkuc2V0X21zZ2xldmVsCQk9IHVzYm5ldF9zZXRfbXNnbGV2ZWwsCisJLmdldF9zZXR0aW5ncwkJPSB1c2JuZXRfZ2V0X3NldHRpbmdzLAorCS5zZXRfc2V0dGluZ3MJCT0gdXNibmV0X3NldF9zZXR0aW5ncywKKwkubndheV9yZXNldAkJPSB1c2JuZXRfbndheV9yZXNldCwKK307CisKK3N0YXRpYyBpbnQgbWNzNzgzMF9iaW5kKHN0cnVjdCB1c2JuZXQgKmRldiwgc3RydWN0IHVzYl9pbnRlcmZhY2UgKnVkZXYpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKm5ldCA9IGRldi0+bmV0OworCWludCByZXQ7CisKKwlyZXQgPSBtY3M3ODMwX2luaXRfZGV2KGRldik7CisJaWYgKHJldCkKKwkJZ290byBvdXQ7CisKKwluZXQtPmRvX2lvY3RsID0gbWNzNzgzMF9pb2N0bDsKKwluZXQtPmV0aHRvb2xfb3BzID0gJm1jczc4MzBfZXRodG9vbF9vcHM7CisJbmV0LT5zZXRfbXVsdGljYXN0X2xpc3QgPSBtY3M3ODMwX3NldF9tdWx0aWNhc3Q7CisJbWNzNzgzMF9zZXRfbXVsdGljYXN0KG5ldCk7CisKKwkvKiByZXNlcnZlIHNwYWNlIGZvciB0aGUgc3RhdHVzIGJ5dGUgb24gcnggKi8KKwlkZXYtPnJ4X3VyYl9zaXplID0gRVRIX0ZSQU1FX0xFTiArIDE7CisKKwlkZXYtPm1paS5tZGlvX3JlYWQgPSBtY3M3ODMwX21kaW9fcmVhZDsKKwlkZXYtPm1paS5tZGlvX3dyaXRlID0gbWNzNzgzMF9tZGlvX3dyaXRlOworCWRldi0+bWlpLmRldiA9IG5ldDsKKwlkZXYtPm1paS5waHlfaWRfbWFzayA9IDB4M2Y7CisJZGV2LT5taWkucmVnX251bV9tYXNrID0gMHgxZjsKKwlkZXYtPm1paS5waHlfaWQgPSAqKCh1OCAqKSBuZXQtPmRldl9hZGRyICsgMSk7CisKKwlyZXQgPSB1c2JuZXRfZ2V0X2VuZHBvaW50cyhkZXYsIHVkZXYpOworb3V0OgorCXJldHVybiByZXQ7Cit9CisKKy8qIFRoZSBjaGlwIGFsd2F5cyBhcHBlbmRzIGEgc3RhdHVzIGJ5dGVzIHRoYXQgd2UgbmVlZCB0byBzdHJpcCAqLworc3RhdGljIGludCBtY3M3ODMwX3J4X2ZpeHVwKHN0cnVjdCB1c2JuZXQgKmRldiwgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwl1OCBzdGF0dXM7CisKKwlpZiAoc2tiLT5sZW4gPT0gMCkgeworCQlkZXZfZXJyKCZkZXYtPnVkZXYtPmRldiwgInVuZXhwZWN0ZWQgZW1wdHkgcnggZnJhbWVcbiIpOworCQlyZXR1cm4gMDsKKwl9CisKKwlza2JfdHJpbShza2IsIHNrYi0+bGVuIC0gMSk7CisJc3RhdHVzID0gc2tiLT5kYXRhW3NrYi0+bGVuXTsKKworCWlmIChzdGF0dXMgIT0gMHgyMCkKKwkJZGV2X2RiZygmZGV2LT51ZGV2LT5kZXYsICJyeCBmaXh1cCBzdGF0dXMgJXhcbiIsIHN0YXR1cyk7CisKKwlyZXR1cm4gc2tiLT5sZW4gPiAwOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGRyaXZlcl9pbmZvIG1vc2NoaXBfaW5mbyA9IHsKKwkuZGVzY3JpcHRpb24JPSAiTU9TQ0hJUCA3ODMwIHVzYi1ORVQgYWRhcHRlciIsCisJLmJpbmQJCT0gbWNzNzgzMF9iaW5kLAorCS5yeF9maXh1cAk9IG1jczc4MzBfcnhfZml4dXAsCisJLmZsYWdzCQk9IEZMQUdfRVRIRVIsCisJLmluCQk9IDEsCisJLm91dAkJPSAyLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCB1c2JfZGV2aWNlX2lkIHByb2R1Y3RzW10gPSB7CisJeworCQlVU0JfREVWSUNFKE1DUzc4MzBfVkVORE9SX0lELCBNQ1M3ODMwX1BST0RVQ1RfSUQpLAorCQkuZHJpdmVyX2luZm8gPSAodW5zaWduZWQgbG9uZykgJm1vc2NoaXBfaW5mbywKKwl9LAorCXt9LAorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUodXNiLCBwcm9kdWN0cyk7CisKK3N0YXRpYyBzdHJ1Y3QgdXNiX2RyaXZlciBtY3M3ODMwX2RyaXZlciA9IHsKKwkubmFtZSA9IGRyaXZlcl9uYW1lLAorCS5pZF90YWJsZSA9IHByb2R1Y3RzLAorCS5wcm9iZSA9IHVzYm5ldF9wcm9iZSwKKwkuZGlzY29ubmVjdCA9IHVzYm5ldF9kaXNjb25uZWN0LAorCS5zdXNwZW5kID0gdXNibmV0X3N1c3BlbmQsCisJLnJlc3VtZSA9IHVzYm5ldF9yZXN1bWUsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBtY3M3ODMwX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gdXNiX3JlZ2lzdGVyKCZtY3M3ODMwX2RyaXZlcik7Cit9Cittb2R1bGVfaW5pdChtY3M3ODMwX2luaXQpOworCitzdGF0aWMgdm9pZCBfX2V4aXQgbWNzNzgzMF9leGl0KHZvaWQpCit7CisJdXNiX2RlcmVnaXN0ZXIoJm1jczc4MzBfZHJpdmVyKTsKK30KK21vZHVsZV9leGl0KG1jczc4MzBfZXhpdCk7CisKK01PRFVMRV9ERVNDUklQVElPTigiVVNCIHRvIG5ldHdvcmsgYWRhcHRlciBNQ1M3ODMwKSIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvbmV0L3VzYm5ldC5jIGIvZHJpdmVycy91c2IvbmV0L3VzYm5ldC5jCmluZGV4IDI0YmQzNDguLjc2MGI1MzIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL25ldC91c2JuZXQuYworKysgYi9kcml2ZXJzL3VzYi9uZXQvdXNibmV0LmMKQEAgLTU1NCw3ICs1NTQsNyBAQAogewogCXN0cnVjdCB1c2JuZXQJCSpkZXYgPSBuZXRkZXZfcHJpdihuZXQpOwogCWludAkJCXRlbXA7Ci0JREVDTEFSRV9XQUlUX1FVRVVFX0hFQUQgKHVubGlua193YWtldXApOyAKKwlERUNMQVJFX1dBSVRfUVVFVUVfSEVBRF9PTlNUQUNLICh1bmxpbmtfd2FrZXVwKTsKIAlERUNMQVJFX1dBSVRRVUVVRSAod2FpdCwgY3VycmVudCk7CiAKIAluZXRpZl9zdG9wX3F1ZXVlIChuZXQpOwpAQCAtNjY5LDYgKzY2OSw2OSBAQAogICogdGhleSdsbCBwcm9iYWJseSB3YW50IHRvIHVzZSB0aGlzIGJhc2Ugc2V0LgogICovCiAKKyNpZiBkZWZpbmVkKENPTkZJR19NSUkpIHx8IGRlZmluZWQoQ09ORklHX01JSV9NT0RVTEUpCisjZGVmaW5lIEhBVkVfTUlJCisKK2ludCB1c2JuZXRfZ2V0X3NldHRpbmdzIChzdHJ1Y3QgbmV0X2RldmljZSAqbmV0LCBzdHJ1Y3QgZXRodG9vbF9jbWQgKmNtZCkKK3sKKwlzdHJ1Y3QgdXNibmV0ICpkZXYgPSBuZXRkZXZfcHJpdihuZXQpOworCisJaWYgKCFkZXYtPm1paS5tZGlvX3JlYWQpCisJCXJldHVybiAtRU9QTk9UU1VQUDsKKworCXJldHVybiBtaWlfZXRodG9vbF9nc2V0KCZkZXYtPm1paSwgY21kKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHVzYm5ldF9nZXRfc2V0dGluZ3MpOworCitpbnQgdXNibmV0X3NldF9zZXR0aW5ncyAoc3RydWN0IG5ldF9kZXZpY2UgKm5ldCwgc3RydWN0IGV0aHRvb2xfY21kICpjbWQpCit7CisJc3RydWN0IHVzYm5ldCAqZGV2ID0gbmV0ZGV2X3ByaXYobmV0KTsKKwlpbnQgcmV0dmFsOworCisJaWYgKCFkZXYtPm1paS5tZGlvX3dyaXRlKQorCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisKKwlyZXR2YWwgPSBtaWlfZXRodG9vbF9zc2V0KCZkZXYtPm1paSwgY21kKTsKKworCS8qIGxpbmsgc3BlZWQvZHVwbGV4IG1pZ2h0IGhhdmUgY2hhbmdlZCAqLworCWlmIChkZXYtPmRyaXZlcl9pbmZvLT5saW5rX3Jlc2V0KQorCQlkZXYtPmRyaXZlcl9pbmZvLT5saW5rX3Jlc2V0KGRldik7CisKKwlyZXR1cm4gcmV0dmFsOworCit9CitFWFBPUlRfU1lNQk9MX0dQTCh1c2JuZXRfc2V0X3NldHRpbmdzKTsKKwordTMyIHVzYm5ldF9nZXRfbGluayAoc3RydWN0IG5ldF9kZXZpY2UgKm5ldCkKK3sKKwlzdHJ1Y3QgdXNibmV0ICpkZXYgPSBuZXRkZXZfcHJpdihuZXQpOworCisJLyogSWYgYSBjaGVja19jb25uZWN0IGlzIGRlZmluZWQsIHJldHVybiBpdHMgcmVzdWx0ICovCisJaWYgKGRldi0+ZHJpdmVyX2luZm8tPmNoZWNrX2Nvbm5lY3QpCisJCXJldHVybiBkZXYtPmRyaXZlcl9pbmZvLT5jaGVja19jb25uZWN0IChkZXYpID09IDA7CisKKwkvKiBpZiB0aGUgZGV2aWNlIGhhcyBtaWkgb3BlcmF0aW9ucywgdXNlIHRob3NlICovCisJaWYgKGRldi0+bWlpLm1kaW9fcmVhZCkKKwkJcmV0dXJuIG1paV9saW5rX29rKCZkZXYtPm1paSk7CisKKwkvKiBPdGhlcndpc2UsIHNheSB3ZSdyZSB1cCAodG8gYXZvaWQgYnJlYWtpbmcgc2NyaXB0cykgKi8KKwlyZXR1cm4gMTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHVzYm5ldF9nZXRfbGluayk7CisKK2ludCB1c2JuZXRfbndheV9yZXNldChzdHJ1Y3QgbmV0X2RldmljZSAqbmV0KQoreworCXN0cnVjdCB1c2JuZXQgKmRldiA9IG5ldGRldl9wcml2KG5ldCk7CisKKwlpZiAoIWRldi0+bWlpLm1kaW9fd3JpdGUpCisJCXJldHVybiAtRU9QTk9UU1VQUDsKKworCXJldHVybiBtaWlfbndheV9yZXN0YXJ0KCZkZXYtPm1paSk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTCh1c2JuZXRfbndheV9yZXNldCk7CisKKyNlbmRpZgkvKiBIQVZFX01JSSAqLworCiB2b2lkIHVzYm5ldF9nZXRfZHJ2aW5mbyAoc3RydWN0IG5ldF9kZXZpY2UgKm5ldCwgc3RydWN0IGV0aHRvb2xfZHJ2aW5mbyAqaW5mbykKIHsKIAlzdHJ1Y3QgdXNibmV0ICpkZXYgPSBuZXRkZXZfcHJpdihuZXQpOwpAQCAtNjgyLDE4ICs3NDUsNiBAQAogfQogRVhQT1JUX1NZTUJPTF9HUEwodXNibmV0X2dldF9kcnZpbmZvKTsKIAotc3RhdGljIHUzMiB1c2JuZXRfZ2V0X2xpbmsgKHN0cnVjdCBuZXRfZGV2aWNlICpuZXQpCi17Ci0Jc3RydWN0IHVzYm5ldCAqZGV2ID0gbmV0ZGV2X3ByaXYobmV0KTsKLQotCS8qIElmIGEgY2hlY2tfY29ubmVjdCBpcyBkZWZpbmVkLCByZXR1cm4gaXRzIHJlc3VsdCAqLwotCWlmIChkZXYtPmRyaXZlcl9pbmZvLT5jaGVja19jb25uZWN0KQotCQlyZXR1cm4gZGV2LT5kcml2ZXJfaW5mby0+Y2hlY2tfY29ubmVjdCAoZGV2KSA9PSAwOwotCi0JLyogT3RoZXJ3aXNlLCBzYXkgd2UncmUgdXAgKHRvIGF2b2lkIGJyZWFraW5nIHNjcmlwdHMpICovCi0JcmV0dXJuIDE7Ci19Ci0KIHUzMiB1c2JuZXRfZ2V0X21zZ2xldmVsIChzdHJ1Y3QgbmV0X2RldmljZSAqbmV0KQogewogCXN0cnVjdCB1c2JuZXQgKmRldiA9IG5ldGRldl9wcml2KG5ldCk7CkBAIC03MTIsOCArNzYzLDEzIEBACiAKIC8qIGRyaXZlcnMgbWF5IG92ZXJyaWRlIGRlZmF1bHQgZXRodG9vbF9vcHMgaW4gdGhlaXIgYmluZCgpIHJvdXRpbmUgKi8KIHN0YXRpYyBzdHJ1Y3QgZXRodG9vbF9vcHMgdXNibmV0X2V0aHRvb2xfb3BzID0gewotCS5nZXRfZHJ2aW5mbwkJPSB1c2JuZXRfZ2V0X2RydmluZm8sCisjaWZkZWYJSEFWRV9NSUkKKwkuZ2V0X3NldHRpbmdzCQk9IHVzYm5ldF9nZXRfc2V0dGluZ3MsCisJLnNldF9zZXR0aW5ncwkJPSB1c2JuZXRfc2V0X3NldHRpbmdzLAogCS5nZXRfbGluawkJPSB1c2JuZXRfZ2V0X2xpbmssCisJLm53YXlfcmVzZXQJCT0gdXNibmV0X253YXlfcmVzZXQsCisjZW5kaWYKKwkuZ2V0X2RydmluZm8JCT0gdXNibmV0X2dldF9kcnZpbmZvLAogCS5nZXRfbXNnbGV2ZWwJCT0gdXNibmV0X2dldF9tc2dsZXZlbCwKIAkuc2V0X21zZ2xldmVsCQk9IHVzYm5ldF9zZXRfbXNnbGV2ZWwsCiB9OwpAQCAtMTA5NCw2ICsxMTUwLDcgQEAKIAlkZXYtPmRlbGF5LmZ1bmN0aW9uID0gdXNibmV0X2JoOwogCWRldi0+ZGVsYXkuZGF0YSA9ICh1bnNpZ25lZCBsb25nKSBkZXY7CiAJaW5pdF90aW1lciAoJmRldi0+ZGVsYXkpOworCW11dGV4X2luaXQgKCZkZXYtPnBoeV9tdXRleCk7CiAKIAlTRVRfTU9EVUxFX09XTkVSIChuZXQpOwogCWRldi0+bmV0ID0gbmV0OwpAQCAtMTIyNSw3ICsxMjgyLDcgQEAKIHN0YXRpYyBpbnQgX19pbml0IHVzYm5ldF9pbml0KHZvaWQpCiB7CiAJLyogY29tcGlsZXIgc2hvdWxkIG9wdGltaXplIHRoaXMgb3V0ICovCi0JQlVHX09OIChzaXplb2YgKCgoc3RydWN0IHNrX2J1ZmYgKikwKS0+Y2IpCisJQlVJTERfQlVHX09OIChzaXplb2YgKCgoc3RydWN0IHNrX2J1ZmYgKikwKS0+Y2IpCiAJCQk8IHNpemVvZiAoc3RydWN0IHNrYl9kYXRhKSk7CiAKIAlyYW5kb21fZXRoZXJfYWRkcihub2RlX2lkKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL25ldC91c2JuZXQuaCBiL2RyaXZlcnMvdXNiL25ldC91c2JuZXQuaAppbmRleCBjMDc0NmYwLi4wN2M3MGFiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9uZXQvdXNibmV0LmgKKysrIGIvZHJpdmVycy91c2IvbmV0L3VzYm5ldC5oCkBAIC0zMCw2ICszMCw3IEBACiAJc3RydWN0IHVzYl9kZXZpY2UJKnVkZXY7CiAJc3RydWN0IGRyaXZlcl9pbmZvCSpkcml2ZXJfaW5mbzsKIAl3YWl0X3F1ZXVlX2hlYWRfdAkqd2FpdDsKKwlzdHJ1Y3QgbXV0ZXgJCXBoeV9tdXRleDsKIAogCS8qIGkvbyBpbmZvOiBwaXBlcyBldGMgKi8KIAl1bnNpZ25lZAkJaW4sIG91dDsKQEAgLTE2OCw5ICsxNjksMTMgQEAKIGV4dGVybiB2b2lkIHVzYm5ldF9za2JfcmV0dXJuIChzdHJ1Y3QgdXNibmV0ICosIHN0cnVjdCBza19idWZmICopOwogZXh0ZXJuIHZvaWQgdXNibmV0X3VubGlua19yeF91cmJzKHN0cnVjdCB1c2JuZXQgKik7CiAKK2V4dGVybiBpbnQgdXNibmV0X2dldF9zZXR0aW5ncyAoc3RydWN0IG5ldF9kZXZpY2UgKm5ldCwgc3RydWN0IGV0aHRvb2xfY21kICpjbWQpOworZXh0ZXJuIGludCB1c2JuZXRfc2V0X3NldHRpbmdzIChzdHJ1Y3QgbmV0X2RldmljZSAqbmV0LCBzdHJ1Y3QgZXRodG9vbF9jbWQgKmNtZCk7CitleHRlcm4gdTMyIHVzYm5ldF9nZXRfbGluayAoc3RydWN0IG5ldF9kZXZpY2UgKm5ldCk7CiBleHRlcm4gdTMyIHVzYm5ldF9nZXRfbXNnbGV2ZWwgKHN0cnVjdCBuZXRfZGV2aWNlICopOwogZXh0ZXJuIHZvaWQgdXNibmV0X3NldF9tc2dsZXZlbCAoc3RydWN0IG5ldF9kZXZpY2UgKiwgdTMyKTsKIGV4dGVybiB2b2lkIHVzYm5ldF9nZXRfZHJ2aW5mbyAoc3RydWN0IG5ldF9kZXZpY2UgKiwgc3RydWN0IGV0aHRvb2xfZHJ2aW5mbyAqKTsKK2V4dGVybiBpbnQgdXNibmV0X253YXlfcmVzZXQoc3RydWN0IG5ldF9kZXZpY2UgKm5ldCk7CiAKIC8qIG1lc3NhZ2luZyBzdXBwb3J0IGluY2x1ZGVzIHRoZSBpbnRlcmZhY2UgbmFtZSwgc28gaXQgbXVzdCBub3QgYmUKICAqIHVzZWQgYmVmb3JlIGl0IGhhcyBvbmUgLi4uIG5vdGFibHksIGluIG1pbmlkcml2ZXIgYmluZCgpIGNhbGxzLgpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2Ivc2VyaWFsL0tjb25maWcgYi9kcml2ZXJzL3VzYi9zZXJpYWwvS2NvbmZpZwppbmRleCA1MDc2YjlkLi4yYThkZDRjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9zZXJpYWwvS2NvbmZpZworKysgYi9kcml2ZXJzL3VzYi9zZXJpYWwvS2NvbmZpZwpAQCAtNTQsMTAgKzU0LDEwIEBACiAJICBwcm9wZXJseS4KIAogY29uZmlnIFVTQl9TRVJJQUxfQUlSQ0FCTEUKLQl0cmlzdGF0ZSAiQUlSY2FibGUgVVNCIEJsdWV0b290aCBEb25nbGUgRHJpdmVyIChFWFBFUklNRU5UQUwpIgorCXRyaXN0YXRlICJVU0IgQUlSY2FibGUgQmx1ZXRvb3RoIERvbmdsZSBEcml2ZXIgKEVYUEVSSU1FTlRBTCkiCiAJZGVwZW5kcyBvbiBVU0JfU0VSSUFMICYmIEVYUEVSSU1FTlRBTAogCWhlbHAKLQkgICAgU2F5IFkgaGVyZSBpZiB5b3Ugd2FudCB0byB1c2UgQUlSY2FibGUgVVNCIEJsdWV0b290IERvbmdsZS4KKwkgICAgU2F5IFkgaGVyZSBpZiB5b3Ugd2FudCB0byB1c2UgVVNCIEFJUmNhYmxlIEJsdWV0b290aCBEb25nbGUuCiAKIAkgICAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlIG1vZHVsZQogCSAgICB3aWxsIGJlIGNhbGxlZCBhaXJjYWJsZS4KQEAgLTQyMiw2ICs0MjIsMTYgQEAKIAkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZQogCSAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIG1jdF91MjMyLgogCitjb25maWcgVVNCX1NFUklBTF9NT1M3NzIwCisJdHJpc3RhdGUgIlVTQiBNb3NjaGlwIDc3MjAgU2luZ2xlIFBvcnQgU2VyaWFsIERyaXZlciIKKwlkZXBlbmRzIG9uIFVTQl9TRVJJQUwKKwktLS1oZWxwLS0tCisJICBTYXkgWSBoZXJlIGlmIHlvdSB3YW50IHRvIHVzZSBhIFVTQiBTZXJpYWwgc2luZ2xlIHBvcnQgYWRhcHRlciBmcm9tCisJICBNb3NjaGlwIFNlbWljb25kdWN0b3IgVGVjaC4KKworCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlCisJICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgbW9zNzcyMC4KKwogY29uZmlnIFVTQl9TRVJJQUxfTU9TNzg0MAogCXRyaXN0YXRlICJVU0IgTW9zY2hpcCA3ODQwLzc4MjAgVVNCIFNlcmlhbCBEcml2ZXIiCiAJZGVwZW5kcyBvbiBVU0JfU0VSSUFMCkBAIC01MjcsOCArNTM3LDcgQEAKIAkgIFRoZSBVU0IgYnVzIG9uIHRoZXNlIGNhcmRzIGlzIG5vdCBhY2Nlc3NpYmxlIGV4dGVybmFsbHkuCiAKIAkgIFN1cHBvcnRlZCBkZXZpY2VzIGluY2x1ZGUgKHNvbWUgb2Y/KSB0aG9zZSBtYWRlIGJ5OgotCSAgT3B0aW9uLCBIdWF3ZWksIEF1ZGlvdm94LCBTaWVycmEgV2lyZWxlc3MsIE5vdmF0ZWwgV2lyZWxlc3MsIG9yCi0JICBBbnlkYXRhLgorCSAgT3B0aW9uLCBIdWF3ZWksIEF1ZGlvdm94LCBOb3ZhdGVsIFdpcmVsZXNzLCBvciBBbnlkYXRhLgogCiAJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUKIAkgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCBvcHRpb24uCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9zZXJpYWwvTWFrZWZpbGUgYi9kcml2ZXJzL3VzYi9zZXJpYWwvTWFrZWZpbGUKaW5kZXggOGRjZTgzMy4uYTUwNDdkYyAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2Ivc2VyaWFsL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvdXNiL3NlcmlhbC9NYWtlZmlsZQpAQCAtMzQsNiArMzQsNyBAQAogb2JqLSQoQ09ORklHX1VTQl9TRVJJQUxfS0xTSSkJCQkrPSBrbDVrdXNiMTA1Lm8KIG9iai0kKENPTkZJR19VU0JfU0VSSUFMX0tPQklMX1NDVCkJCSs9IGtvYmlsX3NjdC5vCiBvYmotJChDT05GSUdfVVNCX1NFUklBTF9NQ1RfVTIzMikJCSs9IG1jdF91MjMyLm8KK29iai0kKENPTkZJR19VU0JfU0VSSUFMX01PUzc3MjApCQkrPSBtb3M3NzIwLm8KIG9iai0kKENPTkZJR19VU0JfU0VSSUFMX01PUzc4NDApCQkrPSBtb3M3ODQwLm8KIG9iai0kKENPTkZJR19VU0JfU0VSSUFMX05BVk1BTikJCQkrPSBuYXZtYW4ubwogb2JqLSQoQ09ORklHX1VTQl9TRVJJQUxfT01OSU5FVCkJCSs9IG9tbmluZXQubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2Ivc2VyaWFsL2FpcnByaW1lLmMgYi9kcml2ZXJzL3VzYi9zZXJpYWwvYWlycHJpbWUuYwppbmRleCAyYzE5ZjE5Li43ZjVkNTQ2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9zZXJpYWwvYWlycHJpbWUuYworKysgYi9kcml2ZXJzL3VzYi9zZXJpYWwvYWlycHJpbWUuYwpAQCAtMTgsMTIgKzE4LDggQEAKIAogc3RhdGljIHN0cnVjdCB1c2JfZGV2aWNlX2lkIGlkX3RhYmxlIFtdID0gewogCXsgVVNCX0RFVklDRSgweDBjODgsIDB4MTdkYSkgfSwgLyogS3lvY2VyYSBXaXJlbGVzcyBLUEM2NTAvUGFzc3BvcnQgKi8KLQl7IFVTQl9ERVZJQ0UoMHgwZjNkLCAweDAxMTIpIH0sIC8qIEFpclByaW1lIENETUEgV2lyZWxlc3MgUEMgQ2FyZCAqLwotCXsgVVNCX0RFVklDRSgweDExOTksIDB4MDAxNykgfSwgLyogU2llcnJhIFdpcmVsZXNzIEVNNTYyNSAqLwotCXsgVVNCX0RFVklDRSgweDExOTksIDB4MDAxOCkgfSwgLyogU2llcnJhIFdpcmVsZXNzIE1DNTcyMCAqLwotCXsgVVNCX0RFVklDRSgweDExOTksIDB4MDExMikgfSwgLyogU2llcnJhIFdpcmVsZXNzIEFpcmNhcmQgNTgwICovCi0JeyBVU0JfREVWSUNFKDB4MTE5OSwgMHgwMjE4KSB9LCAvKiBTaWVycmEgV2lyZWxlc3MgTUM1NzIwICovCiAJeyBVU0JfREVWSUNFKDB4MTQxMCwgMHgxMTEwKSB9LCAvKiBOb3ZhdGVsIFdpcmVsZXNzIE1lcmxpbiBDRE1BICovCisJeyBVU0JfREVWSUNFKDB4MTQxMCwgMHgxMTAwKSB9LCAvKiBFeHByZXNzQ2FyZDM0IFF1YWxjb21tIDNHIENETUEgKi8KIAl7IH0sCiB9OwogTU9EVUxFX0RFVklDRV9UQUJMRSh1c2IsIGlkX3RhYmxlKTsKQEAgLTEzMyw2ICsxMjksNyBAQAogCQl9CiAJCXVyYiA9IHVzYl9hbGxvY191cmIoMCwgR0ZQX0tFUk5FTCk7CiAJCWlmICghdXJiKSB7CisJCQlrZnJlZShidWZmZXIpOwogCQkJZGV2X2VycigmcG9ydC0+ZGV2LCAiJXMgLSBubyBtb3JlIHVyYnM/XG4iLAogCQkJCV9fRlVOQ1RJT05fXyk7CiAJCQlyZXN1bHQgPSAtRU5PTUVNOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2Ivc2VyaWFsL2NwMjEwMS5jIGIvZHJpdmVycy91c2Ivc2VyaWFsL2NwMjEwMS5jCmluZGV4IDQ4NmM3NDEuLmY5NWQ0MmMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL3NlcmlhbC9jcDIxMDEuYworKysgYi9kcml2ZXJzL3VzYi9zZXJpYWwvY3AyMTAxLmMKQEAgLTY0LDcgKzY0LDExIEBACiAJeyBVU0JfREVWSUNFKDB4MTBDNCwgMHg4MEY2KSB9LCAvKiBTdXVudG8gc3BvcnRzIGluc3RydW1lbnQgKi8KIAl7IFVTQl9ERVZJQ0UoMHgxMEM0LCAweDgxM0QpIH0sIC8qIEJ1cm5zaWRlIFRlbGVjb20gRGVza21vYmlsZSAqLwogCXsgVVNCX0RFVklDRSgweDEwQzQsIDB4ODE1RSkgfSwgLyogSGVsaWNvbW0gSVAtTGluayAxMjIwLURWTSAqLworCXsgVVNCX0RFVklDRSgweDEwQzQsIDB4ODFDOCkgfSwgLyogTGlwb3dza3kgSW5kdXN0cmllIEVsZWt0cm9uaWsgR21iSCwgQmFieS1KVEFHICovCisJeyBVU0JfREVWSUNFKDB4MTBDNCwgMHg4MUUyKSB9LCAvKiBMaXBvd3NreSBJbmR1c3RyaWUgRWxla3Ryb25payBHbWJILCBCYWJ5LUxJTiAqLworCXsgVVNCX0RFVklDRSgweDEwQzQsIDB4ODIxOCkgfSwgLyogTGlwb3dza3kgSW5kdXN0cmllIEVsZWt0cm9uaWsgR21iSCwgSEFSUC0xICovCiAJeyBVU0JfREVWSUNFKDB4MTBDNCwgMHhFQTYwKSB9LCAvKiBTaWxpY29uIExhYnMgZmFjdG9yeSBkZWZhdWx0ICovCisJeyBVU0JfREVWSUNFKDB4MTBDNCwgMHhFQTYxKSB9LCAvKiBTaWxpY29uIExhYnMgZmFjdG9yeSBkZWZhdWx0ICovCiAJeyBVU0JfREVWSUNFKDB4MTZENiwgMHgwMDAxKSB9LCAvKiBKYWJsb3Ryb24gc2VyaWFsIGludGVyZmFjZSAqLwogCXsgfSAvKiBUZXJtaW5hdGluZyBFbnRyeSAqLwogfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL3NlcmlhbC9mdGRpX3Npby5jIGIvZHJpdmVycy91c2Ivc2VyaWFsL2Z0ZGlfc2lvLmMKaW5kZXggZDNkYzFhMS4uYzE4NmI0ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2Ivc2VyaWFsL2Z0ZGlfc2lvLmMKKysrIGIvZHJpdmVycy91c2Ivc2VyaWFsL2Z0ZGlfc2lvLmMKQEAgLTEsMTYgKzEsMTYgQEAKIC8qCiAgKiBVU0IgRlRESSBTSU8gZHJpdmVyCiAgKgotICogCUNvcHlyaWdodCAoQykgMTk5OSAtIDIwMDEKLSAqIAkgICAgR3JlZyBLcm9haC1IYXJ0bWFuIChncmVnQGtyb2FoLmNvbSkKKyAqCUNvcHlyaWdodCAoQykgMTk5OSAtIDIwMDEKKyAqCSAgICBHcmVnIEtyb2FoLUhhcnRtYW4gKGdyZWdAa3JvYWguY29tKQogICogICAgICAgICAgQmlsbCBSeWRlciAoYnJ5ZGVyQHNnaS5jb20pCiAgKglDb3B5cmlnaHQgKEMpIDIwMDIKICAqCSAgICBLdWJhIE9iZXIgKGt1YmFAbWFyZWltYnJpdW0ub3JnKQogICoKLSAqIAlUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogCWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gKiAJdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAqIAkoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqCWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKgl0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICoJKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICAqCiAgKiBTZWUgRG9jdW1lbnRhdGlvbi91c2IvdXNiLXNlcmlhbC50eHQgZm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdXNpbmcgdGhpcyBkcml2ZXIKICAqCkBAIC0zMiw3ICszMiw3IEBACiAgKiAgICAgIENoYW5nZWQgZnVsbCBuYW1lIG9mIFVTQi1VSVJUIGRldmljZSB0byBhdm9pZCAiLyIgY2hhcmFjdGVyLgogICogICAgICBBZGRlZCBGVERJJ3MgYWx0ZXJuYXRlIFBJRCAoMHg2MDA2KSBmb3IgRlQyMzIvMjQ1IGRldmljZXMuCiAgKiAgICAgIEFkZGVkIFBJRCBmb3IgIkVMViBVU0IgTW9kdWxlIFVPMTAwIiBmcm9tIFN0ZWZhbiBGcmluZ3MuCi0gKiAKKyAqCiAgKiAoMjEvT2N0LzIwMDMpIElhbiBBYmJvdHQKICAqICAgICAgUmVuYW1lZCBzb21lIFZJRC9QSUQgbWFjcm9zIGZvciBNYXRyaXggT3JiaXRhbCBhbmQgUGVybGUgU3lzdGVtcwogICogICAgICBkZXZpY2VzLiAgUmVtb3ZlZCBNYXRyaXggT3JiaXRhbCBhbmQgUGVybGUgU3lzdGVtcyBkZXZpY2VzIGZyb20gdGhlCkBAIC02OSw3ICs2OSw3IEBACiAgKglkb2VzIG5vdCBpbmN1cmUgYW55IG1lYXN1cmFibGUgb3ZlcmhlYWQuICBUaGlzIGFsc28gcmVsaWVzIG9uIHRoZSBmYWN0CiAgKgl0aGF0IHdlIGhhdmUgcHJvcGVyIHJlZmVyZW5jZSBjb3VudGluZyBsb2dpYyBmb3IgdXJicy4gIEkgbmlja2VkIHRoaXMKICAqCWZyb20gR3JlZyBLSCdzIFZpc29yIGRyaXZlci4KLSAqICAgICAgCisgKgogICogKDIzL0p1bi8yMDAzKSBJYW4gQWJib3R0CiAgKiAgICAgIFJlZHVjZWQgZmxpcCBidWZmZXIgcHVzaGVzIGFuZCBjb3JyZWN0ZWQgYSBkYXRhIGxlbmd0aCB0ZXN0IGluCiAgKiAgICAgIGZ0ZGlfcmVhZF9idWxrX2NhbGxiYWNrLgpAQCAtNzcsNyArNzcsNyBAQAogICoKICAqICgyMS9KdW4vMjAwMykgRXJpayBOeWdyZW4KICAqICAgICAgQWRkZWQgc3VwcG9ydCBmb3IgSG9tZSBFbGVjdHJvbmljcyBUaXJhLTEgSVIgdHJhbnNjZWl2ZXIgdXNpbmcgRlQyMzJCTSBjaGlwLgotICogICAgICBTZWUgPGh0dHA6Ly93d3cuaG9tZS1lbGVjdHJvLmNvbS90aXJhMS5odG0+LiAgT25seSBvcGVyYXRlcyBwcm9wZXJseSAKKyAqICAgICAgU2VlIDxodHRwOi8vd3d3LmhvbWUtZWxlY3Ryby5jb20vdGlyYTEuaHRtPi4gIE9ubHkgb3BlcmF0ZXMgcHJvcGVybHkKICAqICAgICAgYXQgMTAwMDAwIGFuZCBSVFMtQ1RTLCBzbyBzZXQgY3VzdG9tIGRpdmlzb3IgbW9kZSBvbiBzdGFydHVwLgogICogICAgICBBbHNvIGZvcmNlIHRoZSBUaXJhLTEgYW5kIFVTQi1VSVJUIHRvIG9ubHkgdXNlIHRoZWlyIGN1c3RvbSBiYXVkIHJhdGVzLgogICoKQEAgLTEzNywxNyArMTM3LDE3IEBACiAgKiAoMTcvRmViLzIwMDMpIEJpbGwgUnlkZXIKICAqICAgICAgQWRkZWQgd3JpdGUgdXJiIGJ1ZmZlciBwb29sIG9uIGEgcGVyIGRldmljZSBiYXNpcwogICogICAgICBBZGRlZCBtb3JlIGNoZWNraW5nIGZvciBvcGVuIGZpbGUgb24gY2FsbGJhY2tzIChmaXhlZCBPT1BTKQotICogICAgICBBZGRlZCBDcnlzdGFsRm9udHogNjMyIGFuZCA2MzQgUElEcyAKKyAqICAgICAgQWRkZWQgQ3J5c3RhbEZvbnR6IDYzMiBhbmQgNjM0IFBJRHMKICAqICAgICAgICAgKHRoYW54IHRvIENyeXN0YWxGb250eiBmb3IgdGhlIHNhbXBsZSBkZXZpY2VzIC0gdGhleSBmbHVzaGVkIG91dAogICogICAgICAgICAgIHNvbWUgZHJpdmVyIGJ1Z3MpCiAgKiAgICAgIE1pbm9yIGRlYnVnZ2luZyBtZXNzYWdlIGNoYW5nZXMKICAqICAgICAgQWRkZWQgdGhyb3R0bGUsIHVudGhyb3R0bGUgYW5kIGNoYXJzX2luX2J1ZmZlciBmdW5jdGlvbnMKICAqICAgICAgRml4ZWQgRlRESV9TSU8gKHRoZSBvcmlnaW5hbCBkZXZpY2UpIGJ1ZwogICogICAgICBGaXhlZCBzb21lIHNodXRkb3duIGhhbmRsaW5nCi0gKiAgICAgIAotICogCi0gKiAKLSAqIAorICoKKyAqCisgKgorICoKICAqICgwNy9KdW4vMjAwMikgS3ViYSBPYmVyCiAgKglDaGFuZ2VkIEZURElfU0lPX0JBU0VfQkFVRF9UT19ESVZJU09SIG1hY3JvIGludG8gZnRkaV9iYXVkX3RvX2Rpdmlzb3IKICAqCWZ1bmN0aW9uLiBJdCB3YXMgZ2V0dGluZyB0b28gY29tcGxleC4KQEAgLTE1OCw3ICsxNTgsNyBAQAogICoKICAqICgyNS9KdWwvMjAwMikgQmlsbCBSeWRlciBpbnNlcnRlZCBEbWl0cmkncyBUSU9DTUlXQUlUIHBhdGNoCiAgKiAgICAgIE5vdCB0ZXN0ZWQgYnkgbWUgYnV0IGl0IGRvZXNuJ3QgYnJlYWsgYW55dGhpbmcgSSB1c2UuCi0gKiAKKyAqCiAgKiAoMDQvSmFuLzIwMDIpIEt1YmEgT2JlcgogICoJSW1wbGVtZW50ZWQgMzg0MDAgYmF1ZHJhdGUga2x1ZGdlLCB3aGVyZSBpdCBjYW4gYmUgc3Vic3RpdHV0ZWQgd2l0aCBvdGhlcgogICoJICB2YWx1ZXMuIFRoYXQncyB0aGUgb25seSB3YXkgdG8gc2V0IGN1c3RvbSBiYXVkcmF0ZXMuCkBAIC0xNzksNyArMTc5LDcgQEAKICAqICAgICAgICAodGhlIHByZXZpb3VzIHZlcnNpb24gY2F1c2VkIHBhbmljcykKICAqCVJlbW92ZWQgcG9ydCBpdGVyYXRpb24gY29kZSBzaW5jZSB0aGUgZGV2aWNlIG9ubHkgaGFzIG9uZSBJL08gcG9ydCBhbmQgaXQKICAqCSAgd2FzIHdyb25nIGFueXdheS4KLSAqIAorICoKICAqICgzMS9NYXkvMjAwMSkgZ2toCiAgKglTd2l0Y2hlZCBmcm9tIHVzaW5nIHNwaW5sb2NrIHRvIGEgc2VtYXBob3JlLCB3aGljaCBmaXhlcyBsb3RzIG9mIHByb2JsZW1zLgogICoKQEAgLTE4OCwxNiArMTg4LDE2IEBACiAgKglDbGVhbmVkIHVwIGNvbW1lbnRzIGZvciA4VTIzMgogICoJQWRkZWQgcGFyaXR5LCBmcmFtaW5nIGFuZCBvdmVycnVuIGVycm9yIGhhbmRsaW5nCiAgKglBZGRlZCByZWNlaXZlIGJyZWFrIGhhbmRsaW5nLgotICogCisgKgogICogKDA0LzA4LzIwMDEpIGdiCiAgKglJZGVudGlmeSB2ZXJzaW9uIG9uIG1vZHVsZSBsb2FkLgotICogICAgICAgCisgKgogICogKDE4L01hcmNoLzIwMDEpIEJpbGwgUnlkZXIKICAqCShOb3QgcmVsZWFzZWQpCiAgKglBZGRlZCBzZW5kIGJyZWFrIGhhbmRsaW5nLiAocmVxdWlyZXMga2VybmVsIHBhdGNoIHRvbykKICAqCUZpeGVkIDhVMjMyQU0gaGFyZHdhcmUgUlRTL0NUUyBldGMgc3RhdHVzIHJlcG9ydGluZy4KICAqCUFkZGVkIGZsaXBidWYgZml4IGNvcGllZCBmcm9tIGdlbmVyaWMgZGV2aWNlCi0gKiAKKyAqCiAgKiAoMTIvMy8yMDAwKSBCaWxsIFJ5ZGVyCiAgKglBZGRlZCBzdXBwb3J0IGZvciA4VTIzMkFNIGRldmljZS4KICAqCU1vdmVkIFBJRCBhbmQgVklEcyBpbnRvIGhlYWRlciBmaWxlIG9ubHkuCkBAIC0yMTEsMTQgKzIxMSwxNCBAQAogICoJQ2xlYW5lZCB1cCBjb21tZW50cy4gUmVtb3ZlZCBtdWx0aXBsZSBQSUQvVklEIGRlZmluaXRpb25zLgogICoJRmFjdG9yaXNlZCBjdHMvZHRyIGNvZGUKICAqCU1hZGUgdXNlIG9mIF9fRlVOQ1RJT05fXyBpbiBkYmcncwotICogICAgICAKKyAqCiAgKiAoMTEvMDEvMjAwMCkgQWRhbSBKLiBSaWNodGVyCiAgKgl1c2JfZGV2aWNlX2lkIHRhYmxlIHN1cHBvcnQKLSAqIAorICoKICAqICgxMC8wNS8yMDAwKSBna2gKICAqCUZpeGVkIGJ1ZyB3aXRoIHVyYi0+ZGV2IG5vdCBiZWluZyBzZXQgcHJvcGVybHksIG5vdyB0aGF0IHRoZSB1c2IKICAqCWNvcmUgbmVlZHMgaXQuCi0gKiAKKyAqCiAgKiAoMDkvMTEvMjAwMCkgZ2toCiAgKglSZW1vdmVkIERFQlVHICNpZmRlZnMgd2l0aCBjYWxsIHRvIHVzYl9zZXJpYWxfZGVidWdfZGF0YQogICoKQEAgLTIyNiwxMSArMjI2LDExIEBACiAgKglBZGRlZCBtb2R1bGVfaW5pdCBhbmQgbW9kdWxlX2V4aXQgZnVuY3Rpb25zIHRvIGhhbmRsZSB0aGUgZmFjdCB0aGF0IHRoaXMKICAqCWRyaXZlciBpcyBhIGxvYWRhYmxlIG1vZHVsZSBub3cuCiAgKgotICogKDA0LzA0LzIwMDApIEJpbGwgUnlkZXIgCisgKiAoMDQvMDQvMjAwMCkgQmlsbCBSeWRlcgogICoJRml4ZWQgYnVncyBpbiBUQ0dFVC9UQ1NFVCBpb2N0bHMgKGJ5IHJlbW92aW5nIHRoZW0gLSB0aGV5IGFyZQogICogICAgICAgIGhhbmRsZWQgZWxzZXdoZXJlIGluIHRoZSB0dHkgaW8gZHJpdmVyIGNoYWluKS4KICAqCi0gKiAoMDMvMzAvMjAwMCkgQmlsbCBSeWRlciAKKyAqICgwMy8zMC8yMDAwKSBCaWxsIFJ5ZGVyCiAgKglJbXBsZW1lbnRlZCBsb3RzIG9mIGlvY3RscwogICoJRml4ZWQgYSByYWNlIGNvbmRpdGlvbiBpbiB3cml0ZQogICoJQ2hhbmdlZCBzb21lIGRiZydzIHRvIGVycnMKQEAgLTMxMSw2ICszMTEsNyBAQAogCXsgVVNCX0RFVklDRShGVERJX1ZJRCwgRlRESV9BQ1RaV0FWRV9QSUQpIH0sCiAJeyBVU0JfREVWSUNFKEZURElfVklELCBGVERJX0lSVFJBTlNfUElEKSB9LAogCXsgVVNCX0RFVklDRShGVERJX1ZJRCwgRlRESV9JUExVU19QSUQpIH0sCisJeyBVU0JfREVWSUNFKEZURElfVklELCBGVERJX0RNWDRBTEwpIH0sCiAJeyBVU0JfREVWSUNFKEZURElfVklELCBGVERJX1NJT19QSUQpIH0sCiAJeyBVU0JfREVWSUNFKEZURElfVklELCBGVERJXzhVMjMyQU1fUElEKSB9LAogCXsgVVNCX0RFVklDRShGVERJX1ZJRCwgRlRESV84VTIzMkFNX0FMVF9QSUQpIH0sCkBAIC00NDQsMTMgKzQ0NSwxMyBAQAogCS8qIHsgVVNCX0RFVklDRShGVERJX1ZJRCwgRlRESV9FTFZfV1MzMDBQQ19QSUQpIH0sICovCiAJLyogeyBVU0JfREVWSUNFKEZURElfVklELCBGVERJX0VMVl9GSFoxMzAwUENfUElEKSB9LCAqLwogCS8qIHsgVVNCX0RFVklDRShGVERJX1ZJRCwgRlRESV9FTFZfV1M1MDBfUElEKSB9LCAqLwotIAl7IFVTQl9ERVZJQ0UoRlRESV9WSUQsIExJTlhfU0RNVVNCUVNTX1BJRCkgfSwKLSAJeyBVU0JfREVWSUNFKEZURElfVklELCBMSU5YX01BU1RFUkRFVkVMMl9QSUQpIH0sCi0gCXsgVVNCX0RFVklDRShGVERJX1ZJRCwgTElOWF9GVVRVUkVfMF9QSUQpIH0sCi0gCXsgVVNCX0RFVklDRShGVERJX1ZJRCwgTElOWF9GVVRVUkVfMV9QSUQpIH0sCi0gCXsgVVNCX0RFVklDRShGVERJX1ZJRCwgTElOWF9GVVRVUkVfMl9QSUQpIH0sCi0gCXsgVVNCX0RFVklDRShGVERJX1ZJRCwgRlRESV9DQ1NJQ0RVMjBfMF9QSUQpIH0sCi0gCXsgVVNCX0RFVklDRShGVERJX1ZJRCwgRlRESV9DQ1NJQ0RVNDBfMV9QSUQpIH0sCisJeyBVU0JfREVWSUNFKEZURElfVklELCBMSU5YX1NETVVTQlFTU19QSUQpIH0sCisJeyBVU0JfREVWSUNFKEZURElfVklELCBMSU5YX01BU1RFUkRFVkVMMl9QSUQpIH0sCisJeyBVU0JfREVWSUNFKEZURElfVklELCBMSU5YX0ZVVFVSRV8wX1BJRCkgfSwKKwl7IFVTQl9ERVZJQ0UoRlRESV9WSUQsIExJTlhfRlVUVVJFXzFfUElEKSB9LAorCXsgVVNCX0RFVklDRShGVERJX1ZJRCwgTElOWF9GVVRVUkVfMl9QSUQpIH0sCisJeyBVU0JfREVWSUNFKEZURElfVklELCBGVERJX0NDU0lDRFUyMF8wX1BJRCkgfSwKKwl7IFVTQl9ERVZJQ0UoRlRESV9WSUQsIEZURElfQ0NTSUNEVTQwXzFfUElEKSB9LAogCXsgVVNCX0RFVklDRShGVERJX1ZJRCwgSU5TSURFX0FDQ0VTU08pIH0sCiAJeyBVU0JfREVWSUNFKElOVFJFUElEX1ZJRCwgSU5UUkVQSURfVkFMVUVDQU5fUElEKSB9LAogCXsgVVNCX0RFVklDRShJTlRSRVBJRF9WSUQsIElOVFJFUElEX05FT1ZJX1BJRCkgfSwKQEAgLTUxMSw2ICs1MTIsNyBAQAogCXsgVVNCX0RFVklDRShGVERJX1ZJRCwgRlRESV9UQUNUUklYX09QRU5QT1JUXzEzTV9QSUQpIH0sCiAJeyBVU0JfREVWSUNFKEZURElfVklELCBGVERJX1RBQ1RSSVhfT1BFTlBPUlRfMTNTX1BJRCkgfSwKIAl7IFVTQl9ERVZJQ0UoRlRESV9WSUQsIEZURElfVEFDVFJJWF9PUEVOUE9SVF8xM1VfUElEKSB9LAorCXsgVVNCX0RFVklDRShFTEVLVE9SX1ZJRCwgRUxFS1RPUl9GVDMyM1JfUElEKSB9LAogCXsgfSwJCQkJCS8qIE9wdGlvbmFsIHBhcmFtZXRlciBlbnRyeSAqLwogCXsgfQkJCQkJLyogVGVybWluYXRpbmcgZW50cnkgKi8KIH07CkBAIC01MjIsNyArNTI0LDcgQEAKIAkucHJvYmUgPQl1c2Jfc2VyaWFsX3Byb2JlLAogCS5kaXNjb25uZWN0ID0JdXNiX3NlcmlhbF9kaXNjb25uZWN0LAogCS5pZF90YWJsZSA9CWlkX3RhYmxlX2NvbWJpbmVkLAotCS5ub19keW5hbWljX2lkID0gCTEsCisJLm5vX2R5bmFtaWNfaWQgPQkxLAogfTsKIAogc3RhdGljIGNvbnN0IGNoYXIgKmZ0ZGlfY2hpcF9uYW1lW10gPSB7CkBAIC01NDgsMTMgKzU1MCwxMyBAQAogCWludCBjdXN0b21fZGl2aXNvcjsJLyogY3VzdG9tX2Rpdmlzb3Iga2x1ZGdlLCB0aGlzIGlzIGZvciBiYXVkX2Jhc2UgKGRpZmZlcmVudCBmcm9tIHdoYXQgZ29lcyB0byB0aGUgY2hpcCEpICovCiAJX191MTYgbGFzdF9zZXRfZGF0YV91cmJfdmFsdWUgOwogCQkJCS8qIHRoZSBsYXN0IGRhdGEgc3RhdGUgc2V0IC0gbmVlZGVkIGZvciBkb2luZyBhIGJyZWFrICovCi0gICAgICAgIGludCB3cml0ZV9vZmZzZXQ7ICAgICAgIC8qIFRoaXMgaXMgdGhlIG9mZnNldCBpbiB0aGUgdXNiIGRhdGEgYmxvY2sgdG8gd3JpdGUgdGhlIHNlcmlhbCBkYXRhIC0gCisgICAgICAgIGludCB3cml0ZV9vZmZzZXQ7ICAgICAgIC8qIFRoaXMgaXMgdGhlIG9mZnNldCBpbiB0aGUgdXNiIGRhdGEgYmxvY2sgdG8gd3JpdGUgdGhlIHNlcmlhbCBkYXRhIC0KIAkJCQkgKiBpdCBpcyBkaWZmZXJlbnQgYmV0d2VlbiBkZXZpY2VzCiAJCQkJICovCiAJaW50IGZsYWdzOwkJLyogc29tZSBBU1lOQ194eHh4IGZsYWdzIGFyZSBzdXBwb3J0ZWQgKi8KIAl1bnNpZ25lZCBsb25nIGxhc3RfZHRyX3J0czsJLyogc2F2ZWQgbW9kZW0gY29udHJvbCBvdXRwdXRzICovCiAgICAgICAgIHdhaXRfcXVldWVfaGVhZF90IGRlbHRhX21zcl93YWl0OyAvKiBVc2VkIGZvciBUSU9DTUlXQUlUICovCi0gCWNoYXIgcHJldl9zdGF0dXMsIGRpZmZfc3RhdHVzOyAgICAgICAgLyogVXNlZCBmb3IgVElPQ01JV0FJVCAqLworCWNoYXIgcHJldl9zdGF0dXMsIGRpZmZfc3RhdHVzOyAgICAgICAgLyogVXNlZCBmb3IgVElPQ01JV0FJVCAqLwogCV9fdTggcnhfZmxhZ3M7CQkvKiByZWNlaXZlIHN0YXRlIGZsYWdzICh0aHJvdHRsaW5nKSAqLwogCXNwaW5sb2NrX3QgcnhfbG9jazsJLyogc3BpbmxvY2sgZm9yIHJlY2VpdmUgc3RhdGUgKi8KIAlzdHJ1Y3Qgd29ya19zdHJ1Y3Qgcnhfd29yazsKQEAgLTcyMSw3ICs3MjMsNyBAQAogCQl1cmJfdmFsdWUgfD0gRlRESV9TSU9fU0VUX1JUU19ISUdIOwogCXJ2ID0gdXNiX2NvbnRyb2xfbXNnKHBvcnQtPnNlcmlhbC0+ZGV2LAogCQkJICAgICAgIHVzYl9zbmRjdHJscGlwZShwb3J0LT5zZXJpYWwtPmRldiwgMCksCi0JCQkgICAgICAgRlRESV9TSU9fU0VUX01PREVNX0NUUkxfUkVRVUVTVCwgCisJCQkgICAgICAgRlRESV9TSU9fU0VUX01PREVNX0NUUkxfUkVRVUVTVCwKIAkJCSAgICAgICBGVERJX1NJT19TRVRfTU9ERU1fQ1RSTF9SRVFVRVNUX1RZUEUsCiAJCQkgICAgICAgdXJiX3ZhbHVlLCBwcml2LT5pbnRlcmZhY2UsCiAJCQkgICAgICAgYnVmLCAwLCBXRFJfVElNRU9VVCk7CkBAIC03NjgsNyArNzcwLDcgQEAKIAlpZiAocHJpdi0+aW50ZXJmYWNlKSB7CS8qIEZUMjIzMkMgKi8KIAkJdXJiX2luZGV4ID0gKF9fdTE2KSgodXJiX2luZGV4IDw8IDgpIHwgcHJpdi0+aW50ZXJmYWNlKTsKIAl9Ci0JCisKIAlydiA9IHVzYl9jb250cm9sX21zZyhwb3J0LT5zZXJpYWwtPmRldiwKIAkJCSAgICB1c2Jfc25kY3RybHBpcGUocG9ydC0+c2VyaWFsLT5kZXYsIDApLAogCQkJICAgIEZURElfU0lPX1NFVF9CQVVEUkFURV9SRVFVRVNULApAQCAtODI3LDcgKzgyOSw3IEBACiAKIAkvKiAzLiBDb252ZXJ0IGJhdWRyYXRlIHRvIGRldmljZS1zcGVjaWZpYyBkaXZpc29yICovCiAKLQlpZiAoIWJhdWQpIGJhdWQgPSA5NjAwOwkKKwlpZiAoIWJhdWQpIGJhdWQgPSA5NjAwOwogCXN3aXRjaChwcml2LT5jaGlwX3R5cGUpIHsKIAljYXNlIFNJTzogLyogU0lPIGNoaXAgKi8KIAkJc3dpdGNoKGJhdWQpIHsKQEAgLTg0Myw3ICs4NDUsNyBAQAogCQljYXNlIDExNTIwMDogZGl2X3ZhbHVlID0gZnRkaV9zaW9fYjExNTIwMDsgYnJlYWs7CiAJCX0gLyogYmF1ZCAqLwogCQlpZiAoZGl2X3ZhbHVlID09IDApIHsKLSAgCQkJZGJnKCIlcyAtIEJhdWRyYXRlICglZCkgcmVxdWVzdGVkIGlzIG5vdCBzdXBwb3J0ZWQiLCBfX0ZVTkNUSU9OX18sICBiYXVkKTsKKwkJCWRiZygiJXMgLSBCYXVkcmF0ZSAoJWQpIHJlcXVlc3RlZCBpcyBub3Qgc3VwcG9ydGVkIiwgX19GVU5DVElPTl9fLCAgYmF1ZCk7CiAJCQlkaXZfdmFsdWUgPSBmdGRpX3Npb19iOTYwMDsKIAkJCWRpdl9va2F5ID0gMDsKIAkJfQpAQCAtOTI1LDcgKzkyNyw3IEBACiAJLyogTWFrZSB0aGUgY2hhbmdlcyAtIHRoZXNlIGFyZSBwcml2aWxlZ2VkIGNoYW5nZXMhICovCiAKIAlwcml2LT5mbGFncyA9ICgocHJpdi0+ZmxhZ3MgJiB+QVNZTkNfRkxBR1MpIHwKLQkgICAgICAgICAgICAgICAobmV3X3NlcmlhbC5mbGFncyAmIEFTWU5DX0ZMQUdTKSk7CQorCSAgICAgICAgICAgICAgIChuZXdfc2VyaWFsLmZsYWdzICYgQVNZTkNfRkxBR1MpKTsKIAlwcml2LT5jdXN0b21fZGl2aXNvciA9IG5ld19zZXJpYWwuY3VzdG9tX2Rpdmlzb3I7CiAKIAlwb3J0LT50dHktPmxvd19sYXRlbmN5ID0gKHByaXYtPmZsYWdzICYgQVNZTkNfTE9XX0xBVEVOQ1kpID8gMSA6IDA7CkBAIC05NTAsNyArOTUyLDcgQEAKIAkgICAgIChvbGRfcHJpdi5jdXN0b21fZGl2aXNvciAhPSBwcml2LT5jdXN0b21fZGl2aXNvcikpKSB7CiAJCWNoYW5nZV9zcGVlZChwb3J0KTsKIAl9Ci0JCisKIAlyZXR1cm4gKDApOwogCiB9IC8qIHNldF9zZXJpYWxfaW5mbyAqLwpAQCAtMTAyMiwxOCArMTAyNCwxOCBAQAogCXN0cnVjdCB1c2JfZGV2aWNlICp1ZGV2OwogCXVuc2lnbmVkIHNob3J0IGxhdGVuY3kgPSAwOwogCWludCBydiA9IDA7Ci0JCisKIAl1ZGV2ID0gdG9fdXNiX2RldmljZShkZXYpOwotCQorCiAJZGJnKCIlcyIsX19GVU5DVElPTl9fKTsKLQkKKwogCXJ2ID0gdXNiX2NvbnRyb2xfbXNnKHVkZXYsCiAJCQkgICAgIHVzYl9yY3ZjdHJscGlwZSh1ZGV2LCAwKSwKIAkJCSAgICAgRlRESV9TSU9fR0VUX0xBVEVOQ1lfVElNRVJfUkVRVUVTVCwKIAkJCSAgICAgRlRESV9TSU9fR0VUX0xBVEVOQ1lfVElNRVJfUkVRVUVTVF9UWVBFLAotCQkJICAgICAwLCBwcml2LT5pbnRlcmZhY2UsIAorCQkJICAgICAwLCBwcml2LT5pbnRlcmZhY2UsCiAJCQkgICAgIChjaGFyKikgJmxhdGVuY3ksIDEsIFdEUl9USU1FT1VUKTsKLQkKKwogCWlmIChydiA8IDApIHsKIAkJZGV2X2VycihkZXYsICJVbmFibGUgdG8gcmVhZCBsYXRlbmN5IHRpbWVyOiAlaSIsIHJ2KTsKIAkJcmV0dXJuIC1FSU87CkBAIC0xMDUxLDIzICsxMDUzLDIzIEBACiAJY2hhciBidWZbMV07CiAJaW50IHYgPSBzaW1wbGVfc3RydG91bCh2YWxidWYsIE5VTEwsIDEwKTsKIAlpbnQgcnYgPSAwOwotCQorCiAJdWRldiA9IHRvX3VzYl9kZXZpY2UoZGV2KTsKLQkKKwogCWRiZygiJXM6IHNldHRpbmcgbGF0ZW5jeSB0aW1lciA9ICVpIiwgX19GVU5DVElPTl9fLCB2KTsKLQkKKwogCXJ2ID0gdXNiX2NvbnRyb2xfbXNnKHVkZXYsCiAJCQkgICAgIHVzYl9zbmRjdHJscGlwZSh1ZGV2LCAwKSwKIAkJCSAgICAgRlRESV9TSU9fU0VUX0xBVEVOQ1lfVElNRVJfUkVRVUVTVCwKIAkJCSAgICAgRlRESV9TSU9fU0VUX0xBVEVOQ1lfVElNRVJfUkVRVUVTVF9UWVBFLAotCQkJICAgICB2LCBwcml2LT5pbnRlcmZhY2UsIAorCQkJICAgICB2LCBwcml2LT5pbnRlcmZhY2UsCiAJCQkgICAgIGJ1ZiwgMCwgV0RSX1RJTUVPVVQpOwotCQorCiAJaWYgKHJ2IDwgMCkgewogCQlkZXZfZXJyKGRldiwgIlVuYWJsZSB0byB3cml0ZSBsYXRlbmN5IHRpbWVyOiAlaSIsIHJ2KTsKIAkJcmV0dXJuIC1FSU87CiAJfQotCQorCiAJcmV0dXJuIGNvdW50OwogfQogCkBAIC0xMDgyLDIzICsxMDg0LDIzIEBACiAJY2hhciBidWZbMV07CiAJaW50IHYgPSBzaW1wbGVfc3RydG91bCh2YWxidWYsIE5VTEwsIDEwKTsKIAlpbnQgcnYgPSAwOwotCQorCiAJdWRldiA9IHRvX3VzYl9kZXZpY2UoZGV2KTsKLQkKKwogCWRiZygiJXM6IHNldHRpbmcgZXZlbnQgY2hhciA9ICVpIiwgX19GVU5DVElPTl9fLCB2KTsKLQkKKwogCXJ2ID0gdXNiX2NvbnRyb2xfbXNnKHVkZXYsCiAJCQkgICAgIHVzYl9zbmRjdHJscGlwZSh1ZGV2LCAwKSwKIAkJCSAgICAgRlRESV9TSU9fU0VUX0VWRU5UX0NIQVJfUkVRVUVTVCwKIAkJCSAgICAgRlRESV9TSU9fU0VUX0VWRU5UX0NIQVJfUkVRVUVTVF9UWVBFLAotCQkJICAgICB2LCBwcml2LT5pbnRlcmZhY2UsIAorCQkJICAgICB2LCBwcml2LT5pbnRlcmZhY2UsCiAJCQkgICAgIGJ1ZiwgMCwgV0RSX1RJTUVPVVQpOwotCQorCiAJaWYgKHJ2IDwgMCkgewogCQlkYmcoIlVuYWJsZSB0byB3cml0ZSBldmVudCBjaGFyYWN0ZXI6ICVpIiwgcnYpOwogCQlyZXR1cm4gLUVJTzsKIAl9Ci0JCisKIAlyZXR1cm4gY291bnQ7CiB9CiAKQEAgLTExMzUsMTEgKzExMzcsMTEgQEAKIAlzdHJ1Y3QgZnRkaV9wcml2YXRlICpwcml2OwogCXN0cnVjdCB1c2JfZGV2aWNlICp1ZGV2OwogCi0JZGJnKCIlcyIsX19GVU5DVElPTl9fKTsJCisJZGJnKCIlcyIsX19GVU5DVElPTl9fKTsKIAogCXByaXYgPSB1c2JfZ2V0X3NlcmlhbF9wb3J0X2RhdGEoc2VyaWFsLT5wb3J0WzBdKTsKIAl1ZGV2ID0gc2VyaWFsLT5kZXY7Ci0JCisKIAkvKiBYWFggc2VlIGNyZWF0ZV9zeXNmc19hdHRycyAqLwogCWlmIChwcml2LT5jaGlwX3R5cGUgIT0gU0lPKSB7CiAJCWRldmljZV9yZW1vdmVfZmlsZSgmdWRldi0+ZGV2LCAmZGV2X2F0dHJfZXZlbnRfY2hhcik7CkBAIC0xMTQ3LDcgKzExNDksNyBAQAogCQkJZGV2aWNlX3JlbW92ZV9maWxlKCZ1ZGV2LT5kZXYsICZkZXZfYXR0cl9sYXRlbmN5X3RpbWVyKTsKIAkJfQogCX0KLQkKKwogfQogCiAvKgpAQCAtMTI1OCw3ICsxMjYwLDcgQEAKIH0gLyogZnRkaV9IRV9USVJBMV9zZXR1cCAqLwogCiAKLS8qIGZ0ZGlfc2h1dGRvd24gaXMgY2FsbGVkIGZyb20gdXNic2VyaWFsOnVzYl9zZXJpYWxfZGlzY29ubmVjdCAKKy8qIGZ0ZGlfc2h1dGRvd24gaXMgY2FsbGVkIGZyb20gdXNic2VyaWFsOnVzYl9zZXJpYWxfZGlzY29ubmVjdAogICogICBpdCBpcyBjYWxsZWQgd2hlbiB0aGUgdXNiIGRldmljZSBpcyBkaXNjb25uZWN0ZWQKICAqCiAgKiAgIHVzYnNlcmlhbDp1c2Jfc2VyaWFsX2Rpc2Nvbm5lY3QKQEAgLTEyNjksMTYgKzEyNzEsMTYgQEAKIAogc3RhdGljIHZvaWQgZnRkaV9zaHV0ZG93biAoc3RydWN0IHVzYl9zZXJpYWwgKnNlcmlhbCkKIHsgLyogZnRkaV9zaHV0ZG93biAqLwotCQorCiAJc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCA9IHNlcmlhbC0+cG9ydFswXTsKIAlzdHJ1Y3QgZnRkaV9wcml2YXRlICpwcml2ID0gdXNiX2dldF9zZXJpYWxfcG9ydF9kYXRhKHBvcnQpOwogCiAJZGJnKCIlcyIsIF9fRlVOQ1RJT05fXyk7CiAKIAlyZW1vdmVfc3lzZnNfYXR0cnMoc2VyaWFsKTsKLQkKLQkvKiBhbGwgb3BlbiBwb3J0cyBhcmUgY2xvc2VkIGF0IHRoaXMgcG9pbnQgCi0gICAgICAgICAqICAgIChieSB1c2JzZXJpYWwuYzpfX3NlcmlhbF9jbG9zZSwgd2hpY2ggY2FsbHMgZnRkaV9jbG9zZSkgIAorCisJLyogYWxsIG9wZW4gcG9ydHMgYXJlIGNsb3NlZCBhdCB0aGlzIHBvaW50CisgICAgICAgICAqICAgIChieSB1c2JzZXJpYWwuYzpfX3NlcmlhbF9jbG9zZSwgd2hpY2ggY2FsbHMgZnRkaV9jbG9zZSkKIAkgKi8KIAogCWlmIChwcml2KSB7CkBAIC0xMjkzLDcgKzEyOTUsNyBAQAogCXN0cnVjdCB1c2JfZGV2aWNlICpkZXYgPSBwb3J0LT5zZXJpYWwtPmRldjsKIAlzdHJ1Y3QgZnRkaV9wcml2YXRlICpwcml2ID0gdXNiX2dldF9zZXJpYWxfcG9ydF9kYXRhKHBvcnQpOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JCisKIAlpbnQgcmVzdWx0ID0gMDsKIAljaGFyIGJ1ZlsxXTsgLyogTmVlZGVkIGZvciB0aGUgdXNiX2NvbnRyb2xfbXNnIEkgdGhpbmsgKi8KIApAQCAtMTMxMiw4ICsxMzE0LDggQEAKIAkvKiBObyBlcnJvciBjaGVja2luZyBmb3IgdGhpcyAod2lsbCBnZXQgZXJyb3JzIGxhdGVyIGFueXdheSkgKi8KIAkvKiBTZWUgZnRkaV9zaW8uaCBmb3IgZGVzY3JpcHRpb24gb2Ygd2hhdCBpcyByZXNldCAqLwogCXVzYl9jb250cm9sX21zZyhkZXYsIHVzYl9zbmRjdHJscGlwZShkZXYsIDApLAotCQkJRlRESV9TSU9fUkVTRVRfUkVRVUVTVCwgRlRESV9TSU9fUkVTRVRfUkVRVUVTVF9UWVBFLCAKLQkJCUZURElfU0lPX1JFU0VUX1NJTywgCisJCQlGVERJX1NJT19SRVNFVF9SRVFVRVNULCBGVERJX1NJT19SRVNFVF9SRVFVRVNUX1RZUEUsCisJCQlGVERJX1NJT19SRVNFVF9TSU8sCiAJCQlwcml2LT5pbnRlcmZhY2UsIGJ1ZiwgMCwgV0RSX1RJTUVPVVQpOwogCiAJLyogVGVybWlvcyBkZWZhdWx0cyBhcmUgc2V0IGJ5IHVzYl9zZXJpYWxfaW5pdC4gV2UgZG9uJ3QgY2hhbmdlCkBAIC0xMzUwLDEyICsxMzUyLDEyIEBACiAKIAogCi0vKiAKKy8qCiAgKiB1c2JzZXJpYWw6X19zZXJpYWxfY2xvc2UgIG9ubHkgY2FsbHMgZnRkaV9jbG9zZSBpZiB0aGUgcG9pbnQgaXMgb3BlbgogICoKICAqICAgVGhpcyBvbmx5IGdldHMgY2FsbGVkIHdoZW4gaXQgaXMgdGhlIGxhc3QgY2xvc2UKLSAqICAgCi0gKiAgIAorICoKKyAqCiAgKi8KIAogc3RhdGljIHZvaWQgZnRkaV9jbG9zZSAoc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCwgc3RydWN0IGZpbGUgKmZpbHApCkBAIC0xMzY4LDE0ICsxMzcwLDE0IEBACiAKIAlpZiAoY19jZmxhZyAmIEhVUENMKXsKIAkJLyogRGlzYWJsZSBmbG93IGNvbnRyb2wgKi8KLQkJaWYgKHVzYl9jb250cm9sX21zZyhwb3J0LT5zZXJpYWwtPmRldiwgCisJCWlmICh1c2JfY29udHJvbF9tc2cocG9ydC0+c2VyaWFsLT5kZXYsCiAJCQkJICAgIHVzYl9zbmRjdHJscGlwZShwb3J0LT5zZXJpYWwtPmRldiwgMCksCiAJCQkJICAgIEZURElfU0lPX1NFVF9GTE9XX0NUUkxfUkVRVUVTVCwKIAkJCQkgICAgRlRESV9TSU9fU0VUX0ZMT1dfQ1RSTF9SRVFVRVNUX1RZUEUsCiAJCQkJICAgIDAsIHByaXYtPmludGVyZmFjZSwgYnVmLCAwLAogCQkJCSAgICBXRFJfVElNRU9VVCkgPCAwKSB7CiAJCQllcnIoImVycm9yIGZyb20gZmxvd2NvbnRyb2wgdXJiIik7Ci0JCX0JICAgIAorCQl9CiAKIAkJLyogZHJvcCBSVFMgYW5kIERUUiAqLwogCQljbGVhcl9tY3RybChwb3J0LCBUSU9DTV9EVFIgfCBUSU9DTV9SVFMpOwpAQCAtMTM4NCwxNCArMTM4NiwxNCBAQAogCS8qIGNhbmNlbCBhbnkgc2NoZWR1bGVkIHJlYWRpbmcgKi8KIAljYW5jZWxfZGVsYXllZF93b3JrKCZwcml2LT5yeF93b3JrKTsKIAlmbHVzaF9zY2hlZHVsZWRfd29yaygpOwotCQorCiAJLyogc2h1dGRvd24gb3VyIGJ1bGsgcmVhZCAqLwogCWlmIChwb3J0LT5yZWFkX3VyYikKIAkJdXNiX2tpbGxfdXJiKHBvcnQtPnJlYWRfdXJiKTsKIH0gLyogZnRkaV9jbG9zZSAqLwogCiAKLSAgCisKIC8qIFRoZSBTSU8gcmVxdWlyZXMgdGhlIGZpcnN0IGJ5dGUgdG8gaGF2ZToKICAqICBCMCAxCiAgKiAgQjEgMApAQCAtMTQyMyw3ICsxNDI1LDcgQEAKIAkJcmV0dXJuIDA7CiAJfQogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPnR4X2xvY2ssIGZsYWdzKTsKLQkKKwogCWRhdGFfb2Zmc2V0ID0gcHJpdi0+d3JpdGVfb2Zmc2V0OwogICAgICAgICBkYmcoImRhdGFfb2Zmc2V0IHNldCB0byAlZCIsZGF0YV9vZmZzZXQpOwogCkBAIC0xNDYyLDcgKzE0NjQsNyBAQAogCQkJCXVzZXJfcGt0c3ogPSB0b2RvOwogCQkJfQogCQkJLyogV3JpdGUgdGhlIGNvbnRyb2wgYnl0ZSBhdCB0aGUgZnJvbnQgb2YgdGhlIHBhY2tldCovCi0JCQkqZmlyc3RfYnl0ZSA9IDEgfCAoKHVzZXJfcGt0c3opIDw8IDIpOyAKKwkJCSpmaXJzdF9ieXRlID0gMSB8ICgodXNlcl9wa3RzeikgPDwgMik7CiAJCQkvKiBDb3B5IGRhdGEgZm9yIHBhY2tldCAqLwogCQkJbWVtY3B5IChmaXJzdF9ieXRlICsgZGF0YV9vZmZzZXQsCiAJCQkJY3VycmVudF9wb3NpdGlvbiwgdXNlcl9wa3Rzeik7CkBAIC0xNDc5LDcgKzE0ODEsNyBAQAogCXVzYl9zZXJpYWxfZGVidWdfZGF0YShkZWJ1ZywgJnBvcnQtPmRldiwgX19GVU5DVElPTl9fLCB0cmFuc2Zlcl9zaXplLCBidWZmZXIpOwogCiAJLyogZmlsbCB0aGUgYnVmZmVyIGFuZCBzZW5kIGl0ICovCi0JdXNiX2ZpbGxfYnVsa191cmIodXJiLCBwb3J0LT5zZXJpYWwtPmRldiwgCisJdXNiX2ZpbGxfYnVsa191cmIodXJiLCBwb3J0LT5zZXJpYWwtPmRldiwKIAkJICAgICAgdXNiX3NuZGJ1bGtwaXBlKHBvcnQtPnNlcmlhbC0+ZGV2LCBwb3J0LT5idWxrX291dF9lbmRwb2ludEFkZHJlc3MpLAogCQkgICAgICBidWZmZXIsIHRyYW5zZmVyX3NpemUsCiAJCSAgICAgIGZ0ZGlfd3JpdGVfYnVsa19jYWxsYmFjaywgcG9ydCk7CkBAIC0xNTIwLDcgKzE1MjIsNyBAQAogCWtmcmVlICh1cmItPnRyYW5zZmVyX2J1ZmZlcik7CiAKIAlkYmcoIiVzIC0gcG9ydCAlZCIsIF9fRlVOQ1RJT05fXywgcG9ydC0+bnVtYmVyKTsKLQkKKwogCWlmICh1cmItPnN0YXR1cykgewogCQlkYmcoIm5vbnplcm8gd3JpdGUgYnVsayBzdGF0dXMgcmVjZWl2ZWQ6ICVkIiwgdXJiLT5zdGF0dXMpOwogCQlyZXR1cm47CkBAIC0xNjUxLDcgKzE2NTMsNyBAQAogCXN0cnVjdCB0dHlfc3RydWN0ICp0dHk7CiAJc3RydWN0IGZ0ZGlfcHJpdmF0ZSAqcHJpdjsKIAljaGFyIGVycm9yX2ZsYWc7Ci0gICAgICAgCXVuc2lnbmVkIGNoYXIgKmRhdGE7CisJdW5zaWduZWQgY2hhciAqZGF0YTsKIAogCWludCBpOwogCWludCByZXN1bHQ7CkBAIC0xNzU5LDcgKzE3NjEsNyBAQAogCQl9CiAJCWlmIChsZW5ndGggPiAwKSB7CiAJCQlmb3IgKGkgPSAyOyBpIDwgbGVuZ3RoKzI7IGkrKykgewotCQkJCS8qIE5vdGUgdGhhdCB0aGUgZXJyb3IgZmxhZyBpcyBkdXBsaWNhdGVkIGZvciAKKwkJCQkvKiBOb3RlIHRoYXQgdGhlIGVycm9yIGZsYWcgaXMgZHVwbGljYXRlZCBmb3IKIAkJCQkgICBldmVyeSBjaGFyYWN0ZXIgcmVjZWl2ZWQgc2luY2Ugd2UgZG9uJ3Qga25vdwogCQkJCSAgIHdoaWNoIGNoYXJhY3RlciBpdCBhcHBsaWVkIHRvICovCiAJCQkJdHR5X2luc2VydF9mbGlwX2NoYXIodHR5LCBkYXRhW3BhY2tldF9vZmZzZXQraV0sIGVycm9yX2ZsYWcpOwpAQCAtMTc3Myw3ICsxNzc1LDcgQEAKIAkJICAgVGhpcyBkb2Vzbid0IHdvcmsgd2VsbCBzaW5jZSB0aGUgYXBwbGljYXRpb24gcmVjZWl2ZXMgYSBuZXZlcgogCQkgICBlbmRpbmcgc3RyZWFtIG9mIGJhZCBkYXRhIC0gZXZlbiB0aG91Z2ggbmV3IGRhdGEgaGFzbid0IGJlZW4gc2VudC4KIAkJICAgVGhlcmVmb3JlIEkgKGJpbGwpIGhhdmUgdGFrZW4gdGhpcyBvdXQuCi0JCSAgIEhvd2V2ZXIgLSB0aGlzIG1pZ2h0IG1ha2Ugc2Vuc2UgZm9yIGZyYW1pbmcgZXJyb3JzIGFuZCBzbyBvbiAKKwkJICAgSG93ZXZlciAtIHRoaXMgbWlnaHQgbWFrZSBzZW5zZSBmb3IgZnJhbWluZyBlcnJvcnMgYW5kIHNvIG9uCiAJCSAgIHNvIEkgYW0gbGVhdmluZyB0aGUgY29kZSBpbiBmb3Igbm93LgogCQkqLwogCQllbHNlIHsKQEAgLTE4MjcsNyArMTgyOSw3IEBACiAJLyogaWYgdGhlIHBvcnQgaXMgY2xvc2VkIHN0b3AgdHJ5aW5nIHRvIHJlYWQgKi8KIAlpZiAocG9ydC0+b3Blbl9jb3VudCA+IDApewogCQkvKiBDb250aW51ZSB0cnlpbmcgdG8gYWx3YXlzIHJlYWQgICovCi0JCXVzYl9maWxsX2J1bGtfdXJiKHBvcnQtPnJlYWRfdXJiLCBwb3J0LT5zZXJpYWwtPmRldiwgCisJCXVzYl9maWxsX2J1bGtfdXJiKHBvcnQtPnJlYWRfdXJiLCBwb3J0LT5zZXJpYWwtPmRldiwKIAkJCSAgICAgIHVzYl9yY3ZidWxrcGlwZShwb3J0LT5zZXJpYWwtPmRldiwgcG9ydC0+YnVsa19pbl9lbmRwb2ludEFkZHJlc3MpLAogCQkJICAgICAgcG9ydC0+cmVhZF91cmItPnRyYW5zZmVyX2J1ZmZlciwgcG9ydC0+cmVhZF91cmItPnRyYW5zZmVyX2J1ZmZlcl9sZW5ndGgsCiAJCQkgICAgICBmdGRpX3JlYWRfYnVsa19jYWxsYmFjaywgcG9ydCk7CkBAIC0xODQ0LDkgKzE4NDYsOSBAQAogc3RhdGljIHZvaWQgZnRkaV9icmVha19jdGwoIHN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQsIGludCBicmVha19zdGF0ZSApCiB7CiAJc3RydWN0IGZ0ZGlfcHJpdmF0ZSAqcHJpdiA9IHVzYl9nZXRfc2VyaWFsX3BvcnRfZGF0YShwb3J0KTsKLQlfX3UxNiB1cmJfdmFsdWUgPSAwOyAKKwlfX3UxNiB1cmJfdmFsdWUgPSAwOwogCWNoYXIgYnVmWzFdOwotCQorCiAJLyogYnJlYWtfc3RhdGUgPSAtMSB0byB0dXJuIG9uIGJyZWFrLCBhbmQgMCB0byB0dXJuIG9mZiBicmVhayAqLwogCS8qIHNlZSBkcml2ZXJzL2NoYXIvdHR5X2lvLmMgdG8gc2VlIGl0IHVzZWQgKi8KIAkvKiBsYXN0X3NldF9kYXRhX3VyYl92YWx1ZSBORVZFUiBoYXMgdGhlIGJyZWFrIGJpdCBzZXQgaW4gaXQgKi8KQEAgLTE4NTQsMjAgKzE4NTYsMjAgQEAKIAlpZiAoYnJlYWtfc3RhdGUpIHsKIAkJdXJiX3ZhbHVlID0gcHJpdi0+bGFzdF9zZXRfZGF0YV91cmJfdmFsdWUgfCBGVERJX1NJT19TRVRfQlJFQUs7CiAJfSBlbHNlIHsKLQkJdXJiX3ZhbHVlID0gcHJpdi0+bGFzdF9zZXRfZGF0YV91cmJfdmFsdWU7IAorCQl1cmJfdmFsdWUgPSBwcml2LT5sYXN0X3NldF9kYXRhX3VyYl92YWx1ZTsKIAl9CiAKLQkKKwogCWlmICh1c2JfY29udHJvbF9tc2cocG9ydC0+c2VyaWFsLT5kZXYsIHVzYl9zbmRjdHJscGlwZShwb3J0LT5zZXJpYWwtPmRldiwgMCksCi0JCQkgICAgRlRESV9TSU9fU0VUX0RBVEFfUkVRVUVTVCwgCisJCQkgICAgRlRESV9TSU9fU0VUX0RBVEFfUkVRVUVTVCwKIAkJCSAgICBGVERJX1NJT19TRVRfREFUQV9SRVFVRVNUX1RZUEUsCiAJCQkgICAgdXJiX3ZhbHVlICwgcHJpdi0+aW50ZXJmYWNlLAogCQkJICAgIGJ1ZiwgMCwgV0RSX1RJTUVPVVQpIDwgMCkgewogCQllcnIoIiVzIEZBSUxFRCB0byBlbmFibGUvZGlzYWJsZSBicmVhayBzdGF0ZSAoc3RhdGUgd2FzICVkKSIsIF9fRlVOQ1RJT05fXyxicmVha19zdGF0ZSk7Ci0JfQkgICAKKwl9CiAKIAlkYmcoIiVzIGJyZWFrIHN0YXRlIGlzICVkIC0gdXJiIGlzICVkIiwgX19GVU5DVElPTl9fLGJyZWFrX3N0YXRlLCB1cmJfdmFsdWUpOwotCQorCiB9CiAKIApAQCAtMTg4MywxMiArMTg4NSwxMiBAQAogCXN0cnVjdCBmdGRpX3ByaXZhdGUgKnByaXYgPSB1c2JfZ2V0X3NlcmlhbF9wb3J0X2RhdGEocG9ydCk7CiAJX191MTYgdXJiX3ZhbHVlOyAvKiB3aWxsIGhvbGQgdGhlIG5ldyBmbGFncyAqLwogCWNoYXIgYnVmWzFdOyAvKiBQZXJoYXBzIEkgc2hvdWxkIGR5bmFtaWNhbGx5IGFsbG9jIHRoaXM/ICovCi0JCisKIAkvLyBBZGRlZCBmb3IgeG9uL3hvZmYgc3VwcG9ydAogCXVuc2lnbmVkIGludCBpZmxhZyA9IHBvcnQtPnR0eS0+dGVybWlvcy0+Y19pZmxhZzsKIAl1bnNpZ25lZCBjaGFyIHZzdG9wOwogCXVuc2lnbmVkIGNoYXIgdnN0YXJ0OwotCQorCiAJZGJnKCIlcyIsIF9fRlVOQ1RJT05fXyk7CiAKIAkvKiBGb3JjZSBiYXVkIHJhdGUgaWYgdGhpcyBkZXZpY2UgcmVxdWlyZXMgaXQsIHVubGVzcyBpdCBpcyBzZXQgdG8gQjAuICovCkBAIC0xOTA2LDIwICsxOTA4LDIwIEBACiAKIAljZmxhZyA9IHBvcnQtPnR0eS0+dGVybWlvcy0+Y19jZmxhZzsKIAotCS8qIEZJWE1FIC1Gb3IgdGhpcyBjdXQgSSBkb24ndCBjYXJlIGlmIHRoZSBsaW5lIGlzIHJlYWxseSBjaGFuZ2luZyBvciAKLQkgICBub3QgIC0gc28ganVzdCBkbyB0aGUgY2hhbmdlIHJlZ2FyZGxlc3MgIC0gc2hvdWxkIGJlIGFibGUgdG8gCisJLyogRklYTUUgLUZvciB0aGlzIGN1dCBJIGRvbid0IGNhcmUgaWYgdGhlIGxpbmUgaXMgcmVhbGx5IGNoYW5naW5nIG9yCisJICAgbm90ICAtIHNvIGp1c3QgZG8gdGhlIGNoYW5nZSByZWdhcmRsZXNzICAtIHNob3VsZCBiZSBhYmxlIHRvCiAJICAgY29tcGFyZSBvbGRfdGVybWlvcyBhbmQgdHR5LT50ZXJtaW9zICovCi0JLyogTk9URSBUaGVzZSByb3V0aW5lcyBjYW4gZ2V0IGludGVycnVwdGVkIGJ5IAotCSAgIGZ0ZGlfc2lvX3JlYWRfYnVsa19jYWxsYmFjayAgLSBuZWVkIHRvIGV4YW1pbmUgd2hhdCB0aGlzIAorCS8qIE5PVEUgVGhlc2Ugcm91dGluZXMgY2FuIGdldCBpbnRlcnJ1cHRlZCBieQorCSAgIGZ0ZGlfc2lvX3JlYWRfYnVsa19jYWxsYmFjayAgLSBuZWVkIHRvIGV4YW1pbmUgd2hhdCB0aGlzCiAgICAgICAgICAgIG1lYW5zIC0gZG9uJ3Qgc2VlIGFueSBwcm9ibGVtcyB5ZXQgKi8KLQkKKwogCS8qIFNldCBudW1iZXIgb2YgZGF0YSBiaXRzLCBwYXJpdHksIHN0b3AgYml0cyAqLwotCQorCiAJdXJiX3ZhbHVlID0gMDsKIAl1cmJfdmFsdWUgfD0gKGNmbGFnICYgQ1NUT1BCID8gRlRESV9TSU9fU0VUX0RBVEFfU1RPUF9CSVRTXzIgOgogCQkgICAgICBGVERJX1NJT19TRVRfREFUQV9TVE9QX0JJVFNfMSk7Ci0JdXJiX3ZhbHVlIHw9IChjZmxhZyAmIFBBUkVOQiA/IAotCQkgICAgICAoY2ZsYWcgJiBQQVJPREQgPyBGVERJX1NJT19TRVRfREFUQV9QQVJJVFlfT0REIDogCisJdXJiX3ZhbHVlIHw9IChjZmxhZyAmIFBBUkVOQiA/CisJCSAgICAgIChjZmxhZyAmIFBBUk9ERCA/IEZURElfU0lPX1NFVF9EQVRBX1BBUklUWV9PREQgOgogCQkgICAgICAgRlRESV9TSU9fU0VUX0RBVEFfUEFSSVRZX0VWRU4pIDoKIAkJICAgICAgRlRESV9TSU9fU0VUX0RBVEFfUEFSSVRZX05PTkUpOwogCWlmIChjZmxhZyAmIENTSVpFKSB7CkBAIC0xOTM2LDI1ICsxOTM4LDI1IEBACiAJLyogVGhpcyBpcyBuZWVkZWQgYnkgdGhlIGJyZWFrIGNvbW1hbmQgc2luY2UgaXQgdXNlcyB0aGUgc2FtZSBjb21tYW5kIC0gYnV0IGlzCiAJICogIG9yJ2VkIHdpdGggdGhpcyB2YWx1ZSAgKi8KIAlwcml2LT5sYXN0X3NldF9kYXRhX3VyYl92YWx1ZSA9IHVyYl92YWx1ZTsKLQkKKwogCWlmICh1c2JfY29udHJvbF9tc2coZGV2LCB1c2Jfc25kY3RybHBpcGUoZGV2LCAwKSwKLQkJCSAgICBGVERJX1NJT19TRVRfREFUQV9SRVFVRVNULCAKKwkJCSAgICBGVERJX1NJT19TRVRfREFUQV9SRVFVRVNULAogCQkJICAgIEZURElfU0lPX1NFVF9EQVRBX1JFUVVFU1RfVFlQRSwKIAkJCSAgICB1cmJfdmFsdWUgLCBwcml2LT5pbnRlcmZhY2UsCiAJCQkgICAgYnVmLCAwLCBXRFJfU0hPUlRfVElNRU9VVCkgPCAwKSB7CiAJCWVycigiJXMgRkFJTEVEIHRvIHNldCBkYXRhYml0cy9zdG9wYml0cy9wYXJpdHkiLCBfX0ZVTkNUSU9OX18pOwotCX0JICAgCisJfQogCiAJLyogTm93IGRvIHRoZSBiYXVkcmF0ZSAqLwogCWlmICgoY2ZsYWcgJiBDQkFVRCkgPT0gQjAgKSB7CiAJCS8qIERpc2FibGUgZmxvdyBjb250cm9sICovCiAJCWlmICh1c2JfY29udHJvbF9tc2coZGV2LCB1c2Jfc25kY3RybHBpcGUoZGV2LCAwKSwKLQkJCQkgICAgRlRESV9TSU9fU0VUX0ZMT1dfQ1RSTF9SRVFVRVNULCAKKwkJCQkgICAgRlRESV9TSU9fU0VUX0ZMT1dfQ1RSTF9SRVFVRVNULAogCQkJCSAgICBGVERJX1NJT19TRVRfRkxPV19DVFJMX1JFUVVFU1RfVFlQRSwKLQkJCQkgICAgMCwgcHJpdi0+aW50ZXJmYWNlLCAKKwkJCQkgICAgMCwgcHJpdi0+aW50ZXJmYWNlLAogCQkJCSAgICBidWYsIDAsIFdEUl9USU1FT1VUKSA8IDApIHsKIAkJCWVycigiJXMgZXJyb3IgZnJvbSBkaXNhYmxlIGZsb3djb250cm9sIHVyYiIsIF9fRlVOQ1RJT05fXyk7Ci0JCX0JICAgIAorCQl9CiAJCS8qIERyb3AgUlRTIGFuZCBEVFIgKi8KIAkJY2xlYXJfbWN0cmwocG9ydCwgVElPQ01fRFRSIHwgVElPQ01fUlRTKTsKIAl9IGVsc2UgewpAQCAtMTk3MiwxNiArMTk3NCwxNiBAQAogCS8qIE5vdGUgZGV2aWNlIGFsc28gc3VwcG9ydHMgRFRSL0NEICh1Z2gpIGFuZCBYb24vWG9mZiBpbiBoYXJkd2FyZSAqLwogCWlmIChjZmxhZyAmIENSVFNDVFMpIHsKIAkJZGJnKCIlcyBTZXR0aW5nIHRvIENSVFNDVFMgZmxvdyBjb250cm9sIiwgX19GVU5DVElPTl9fKTsKLQkJaWYgKHVzYl9jb250cm9sX21zZyhkZXYsIAorCQlpZiAodXNiX2NvbnRyb2xfbXNnKGRldiwKIAkJCQkgICAgdXNiX3NuZGN0cmxwaXBlKGRldiwgMCksCi0JCQkJICAgIEZURElfU0lPX1NFVF9GTE9XX0NUUkxfUkVRVUVTVCwgCisJCQkJICAgIEZURElfU0lPX1NFVF9GTE9XX0NUUkxfUkVRVUVTVCwKIAkJCQkgICAgRlRESV9TSU9fU0VUX0ZMT1dfQ1RSTF9SRVFVRVNUX1RZUEUsCiAJCQkJICAgIDAgLCAoRlRESV9TSU9fUlRTX0NUU19IUyB8IHByaXYtPmludGVyZmFjZSksCiAJCQkJICAgIGJ1ZiwgMCwgV0RSX1RJTUVPVVQpIDwgMCkgewogCQkJZXJyKCJ1cmIgZmFpbGVkIHRvIHNldCB0byBydHMvY3RzIGZsb3cgY29udHJvbCIpOwotCQl9CQkKLQkJCi0JfSBlbHNlIHsgCisJCX0KKworCX0gZWxzZSB7CiAJCS8qCiAJCSAqIFhvbi9Yb2ZmIGNvZGUKIAkJICoKQEAgLTIwMTEsMTYgKzIwMTMsMTYgQEAKIAkJCS8qIGVsc2UgY2xhdXNlIHRvIG9ubHkgcnVuIGlmIGNmYWcgISBDUlRTQ1RTIGFuZCBpZmxhZyAhIFhPRkYgKi8KIAkJCS8qIENIRUNLTUUgQXNzdW1pbmcgWE9OL1hPRkYgaGFuZGxlZCBieSB0dHkgc3RhY2sgLSBub3QgYnkgZGV2aWNlICovCiAJCQlkYmcoIiVzIFR1cm5pbmcgb2ZmIGhhcmR3YXJlIGZsb3cgY29udHJvbCIsIF9fRlVOQ1RJT05fXyk7Ci0JCQlpZiAodXNiX2NvbnRyb2xfbXNnKGRldiwgCisJCQlpZiAodXNiX2NvbnRyb2xfbXNnKGRldiwKIAkJCQkJICAgIHVzYl9zbmRjdHJscGlwZShkZXYsIDApLAotCQkJCQkgICAgRlRESV9TSU9fU0VUX0ZMT1dfQ1RSTF9SRVFVRVNULCAKKwkJCQkJICAgIEZURElfU0lPX1NFVF9GTE9XX0NUUkxfUkVRVUVTVCwKIAkJCQkJICAgIEZURElfU0lPX1NFVF9GTE9XX0NUUkxfUkVRVUVTVF9UWVBFLAotCQkJCQkgICAgMCwgcHJpdi0+aW50ZXJmYWNlLCAKKwkJCQkJICAgIDAsIHByaXYtPmludGVyZmFjZSwKIAkJCQkJICAgIGJ1ZiwgMCwgV0RSX1RJTUVPVVQpIDwgMCkgewogCQkJCWVycigidXJiIGZhaWxlZCB0byBjbGVhciBmbG93IGNvbnRyb2wiKTsKLQkJCX0JCQkJCisJCQl9CiAJCX0KLQkJCisKIAl9CiAJcmV0dXJuOwogfSAvKiBmdGRpX3Rlcm1pb3MgKi8KQEAgLTIwMzYsMTEgKzIwMzgsMTEgQEAKIAlzd2l0Y2ggKHByaXYtPmNoaXBfdHlwZSkgewogCWNhc2UgU0lPOgogCQkvKiBSZXF1ZXN0IHRoZSBzdGF0dXMgZnJvbSB0aGUgZGV2aWNlICovCi0JCWlmICgocmV0ID0gdXNiX2NvbnRyb2xfbXNnKHBvcnQtPnNlcmlhbC0+ZGV2LCAKKwkJaWYgKChyZXQgPSB1c2JfY29udHJvbF9tc2cocG9ydC0+c2VyaWFsLT5kZXYsCiAJCQkJCSAgIHVzYl9yY3ZjdHJscGlwZShwb3J0LT5zZXJpYWwtPmRldiwgMCksCi0JCQkJCSAgIEZURElfU0lPX0dFVF9NT0RFTV9TVEFUVVNfUkVRVUVTVCwgCisJCQkJCSAgIEZURElfU0lPX0dFVF9NT0RFTV9TVEFUVVNfUkVRVUVTVCwKIAkJCQkJICAgRlRESV9TSU9fR0VUX01PREVNX1NUQVRVU19SRVFVRVNUX1RZUEUsCi0JCQkJCSAgIDAsIDAsIAorCQkJCQkgICAwLCAwLAogCQkJCQkgICBidWYsIDEsIFdEUl9USU1FT1VUKSkgPCAwICkgewogCQkJZXJyKCIlcyBDb3VsZCBub3QgZ2V0IG1vZGVtIHN0YXR1cyBvZiBkZXZpY2UgLSBlcnI6ICVkIiwgX19GVU5DVElPTl9fLAogCQkJICAgIHJldCk7CkBAIC0yMDUyLDExICsyMDU0LDExIEBACiAJY2FzZSBGVDIyMzJDOgogCQkvKiB0aGUgOFUyMzJBTSByZXR1cm5zIGEgdHdvIGJ5dGUgdmFsdWUgKHRoZSBzaW8gaXMgYSAxIGJ5dGUgdmFsdWUpIC0gaW4gdGhlIHNhbWUKIAkJICAgZm9ybWF0IGFzIHRoZSBkYXRhIHJldHVybmVkIGZyb20gdGhlIGluIHBvaW50ICovCi0JCWlmICgocmV0ID0gdXNiX2NvbnRyb2xfbXNnKHBvcnQtPnNlcmlhbC0+ZGV2LCAKKwkJaWYgKChyZXQgPSB1c2JfY29udHJvbF9tc2cocG9ydC0+c2VyaWFsLT5kZXYsCiAJCQkJCSAgIHVzYl9yY3ZjdHJscGlwZShwb3J0LT5zZXJpYWwtPmRldiwgMCksCi0JCQkJCSAgIEZURElfU0lPX0dFVF9NT0RFTV9TVEFUVVNfUkVRVUVTVCwgCisJCQkJCSAgIEZURElfU0lPX0dFVF9NT0RFTV9TVEFUVVNfUkVRVUVTVCwKIAkJCQkJICAgRlRESV9TSU9fR0VUX01PREVNX1NUQVRVU19SRVFVRVNUX1RZUEUsCi0JCQkJCSAgIDAsIHByaXYtPmludGVyZmFjZSwgCisJCQkJCSAgIDAsIHByaXYtPmludGVyZmFjZSwKIAkJCQkJICAgYnVmLCAyLCBXRFJfVElNRU9VVCkpIDwgMCApIHsKIAkJCWVycigiJXMgQ291bGQgbm90IGdldCBtb2RlbSBzdGF0dXMgb2YgZGV2aWNlIC0gZXJyOiAlZCIsIF9fRlVOQ1RJT05fXywKIAkJCSAgICByZXQpOwpAQCAtMjA2NywxMiArMjA2OSwxMiBAQAogCQlyZXR1cm4gLUVGQVVMVDsKIAkJYnJlYWs7CiAJfQotCQorCiAJcmV0dXJuICAoYnVmWzBdICYgRlRESV9TSU9fRFNSX01BU0sgPyBUSU9DTV9EU1IgOiAwKSB8CiAJCShidWZbMF0gJiBGVERJX1NJT19DVFNfTUFTSyA/IFRJT0NNX0NUUyA6IDApIHwKIAkJKGJ1ZlswXSAgJiBGVERJX1NJT19SSV9NQVNLICA/IFRJT0NNX1JJICA6IDApIHwKIAkJKGJ1ZlswXSAgJiBGVERJX1NJT19STFNEX01BU0sgPyBUSU9DTV9DRCAgOiAwKSB8Ci0JCXByaXYtPmxhc3RfZHRyX3J0czsJCQkKKwkJcHJpdi0+bGFzdF9kdHJfcnRzOwogfQogCiBzdGF0aWMgaW50IGZ0ZGlfdGlvY21zZXQoc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCwgc3RydWN0IGZpbGUgKiBmaWxlLCB1bnNpZ25lZCBpbnQgc2V0LCB1bnNpZ25lZCBpbnQgY2xlYXIpCkBAIC0yMTM4LDExICsyMTQwLDExIEBACiAJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCWJyZWFrOwotCQkKKwogCX0KIAogCi0JLyogVGhpcyBpcyBub3QgbmVjZXNzYXJpbHkgYW4gZXJyb3IgLSB0dXJucyBvdXQgdGhlIGhpZ2hlciBsYXllcnMgd2lsbCBkbyAKKwkvKiBUaGlzIGlzIG5vdCBuZWNlc3NhcmlseSBhbiBlcnJvciAtIHR1cm5zIG91dCB0aGUgaGlnaGVyIGxheWVycyB3aWxsIGRvCiAJICogIHNvbWUgaW9jdGxzIGl0c2VsZiAoc2VlIGNvbW1lbnQgYWJvdmUpCiAJICovCiAJZGJnKCIlcyBhcmcgbm90IHN1cHBvcnRlZCAtIGl0IHdhcyAweCUwNHggLSBjaGVjayAvdXNyL2luY2x1ZGUvYXNtL2lvY3Rscy5oIiwgX19GVU5DVElPTl9fLCBjbWQpOwpAQCAtMjE5OSw3ICsyMjAxLDcgQEAKIAlpZiAocmV0dmFsKQogCQlnb3RvIGZhaWxlZF9zaW9fcmVnaXN0ZXI7CiAJcmV0dmFsID0gdXNiX3JlZ2lzdGVyKCZmdGRpX2RyaXZlcik7Ci0JaWYgKHJldHZhbCkgCisJaWYgKHJldHZhbCkKIAkJZ290byBmYWlsZWRfdXNiX3JlZ2lzdGVyOwogCiAJaW5mbyhEUklWRVJfVkVSU0lPTiAiOiIgRFJJVkVSX0RFU0MpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2Ivc2VyaWFsL2Z0ZGlfc2lvLmggYi9kcml2ZXJzL3VzYi9zZXJpYWwvZnRkaV9zaW8uaAppbmRleCBmMGVkYjg3Li5iYWUxMTdkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9zZXJpYWwvZnRkaV9zaW8uaAorKysgYi9kcml2ZXJzL3VzYi9zZXJpYWwvZnRkaV9zaW8uaApAQCAtNTUsNiArNTUsOSBAQAogLyogaVBsdXMgZGV2aWNlICovCiAjZGVmaW5lIEZURElfSVBMVVNfUElEIDB4RDA3MCAvKiBQcm9kdWN0IElkICovCiAKKy8qIERNWDRBTEwgRE1YIEludGVyZmFjZXMgKi8KKyNkZWZpbmUgRlRESV9ETVg0QUxMIDB4Qzg1MAorCiAvKiB3d3cuY3J5c3RhbGZvbnR6LmNvbSBkZXZpY2VzIC0gdGhhbnggZm9yIHByb3ZpZGluZyBmcmVlIGRldmljZXMgZm9yIGV2YWx1YXRpb24gISAqLwogLyogdGhleSB1c2UgdGhlIGZ0ZGkgY2hpcHNldCBmb3IgdGhlIFVTQiBpbnRlcmZhY2UgYW5kIHRoZSB2ZW5kb3IgaWQgaXMgdGhlIHNhbWUgKi8KICNkZWZpbmUgRlRESV9YRl82MzJfUElEIDB4RkMwOAkvKiA2MzI6IDE2eDIgQ2hhcmFjdGVyIERpc3BsYXkgKi8KQEAgLTE3NSw5ICsxNzgsMTUgQEAKICNkZWZpbmUgRlRESV9BU0tfUkRSNDAwX1BJRAkweEM5OTEJLyogQVNLIFJEUiA0MDAgc2VyaWVzIGNhcmQgcmVhZGVyICovCiAKIC8qCisgKiBGVERJIFVTQiBVQVJUIGNoaXBzIHVzZWQgaW4gY29uc3RydWN0aW9uIHByb2plY3RzIGZyb20gdGhlCisgKiBFbGVrdG9yIEVsZWN0cm9uaWNzIG1hZ2F6aW5lIChodHRwOi8vZWxla3Rvci1lbGVjdHJvbmljcy5jby51aykKKyAqLworI2RlZmluZSBFTEVLVE9SX1ZJRAkJMHgwQzdECisjZGVmaW5lIEVMRUtUT1JfRlQzMjNSX1BJRAkweDAwMDUJLyogUkZJRC1SZWFkZXIsIGlzc3VlIDA5LTIwMDYgKi8KKworLyoKICAqIERTUy0yMCBTeW5jIFN0YXRpb24gZm9yIFNvbnkgRXJpY3Nzb24gUDgwMAogICovCi0gCiAjZGVmaW5lIEZURElfRFNTMjBfUElEICAgICAgICAgIDB4RkM4MiAgCiAKIC8qCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9zZXJpYWwvaXBhcS5jIGIvZHJpdmVycy91c2Ivc2VyaWFsL2lwYXEuYwppbmRleCA2MjM4YWZmLi5kNzJjZjhiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9zZXJpYWwvaXBhcS5jCisrKyBiL2RyaXZlcnMvdXNiL3NlcmlhbC9pcGFxLmMKQEAgLTMyMCw2ICszMjAsNyBAQAogCXsgVVNCX0RFVklDRSgweDBCMDUsIDB4OTIwMCkgfSwgLyogQVNVUyBVU0IgU3luYyAqLwogCXsgVVNCX0RFVklDRSgweDBCMDUsIDB4OTIwMikgfSwgLyogQVNVUyBVU0IgU3luYyAqLwogCXsgVVNCX0RFVklDRSgweDBCQjQsIDB4MDBDRSkgfSwgLyogSFRDIFVTQiBTeW5jICovCisJeyBVU0JfREVWSUNFKDB4MEJCNCwgMHgwMENGKSB9LCAvKiBIVEMgVVNCIE1vZGVtICovCiAJeyBVU0JfREVWSUNFKDB4MEJCNCwgMHgwQTAxKSB9LCAvKiBQb2NrZXRQQyBVU0IgU3luYyAqLwogCXsgVVNCX0RFVklDRSgweDBCQjQsIDB4MEEwMikgfSwgLyogUG9ja2V0UEMgVVNCIFN5bmMgKi8KIAl7IFVTQl9ERVZJQ0UoMHgwQkI0LCAweDBBMDMpIH0sIC8qIFBvY2tldFBDIFVTQiBTeW5jICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9zZXJpYWwvbW9zNzcyMC5jIGIvZHJpdmVycy91c2Ivc2VyaWFsL21vczc3MjAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MmNkMTViCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy91c2Ivc2VyaWFsL21vczc3MjAuYwpAQCAtMCwwICsxLDE2ODMgQEAKKy8qCisgKiBtb3M3NzIwLmMKKyAqICAgQ29udHJvbHMgdGhlIE1vc2NoaXAgNzcyMCB1c2IgdG8gZHVhbCBwb3J0IHNlcmlhbCBjb252ZXJ0b3IKKyAqCisgKiBDb3B5cmlnaHQgMjAwNiBNb3NjaGlwIFNlbWljb25kdWN0b3IgVGVjaC4gTHRkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLgorICoKKyAqIERldmVsb3BlZCBieToKKyAqIAlWaWpheWFLdW1hci5HLk4uIDx2aWpheWt1bWFyQGFzcGlyZWNvbS5uZXQ+CisgKglBamF5S3VtYXIgPGFqYXlAYXNwaXJlY29tLm5ldD4KKyAqCUd1cnVkZXZhLk4uIDxndXJ1ZGV2QGFzcGlyZWNvbS5uZXQ+CisgKgorICogQ2xlYW5lZCB1cCBmcm9tIHRoZSBvcmlnaW5hbCBieToKKyAqCUdyZWcgS3JvYWgtSGFydG1hbiA8Z3JlZ2toQHN1c2UuZGU+CisgKgorICogT3JpZ2luYWxseSBiYXNlZCBvbiBkcml2ZXJzL3VzYi9zZXJpYWwvaW9fZWRnZXBvcnQuYyB3aGljaCBpczoKKyAqCUNvcHlyaWdodCAoQykgMjAwMCBJbnNpZGUgT3V0IE5ldHdvcmtzLCBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoJQ29weXJpZ2h0IChDKSAyMDAxLTIwMDIgR3JlZyBLcm9haC1IYXJ0bWFuIDxncmVnQGtyb2FoLmNvbT4KKyAqLworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC90dHkuaD4KKyNpbmNsdWRlIDxsaW51eC90dHlfZHJpdmVyLmg+CisjaW5jbHVkZSA8bGludXgvdHR5X2ZsaXAuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L3NlcmlhbC5oPgorI2luY2x1ZGUgPGxpbnV4L3NlcmlhbF9yZWcuaD4KKyNpbmNsdWRlIDxsaW51eC91c2IuaD4KKyNpbmNsdWRlIDxsaW51eC91c2Ivc2VyaWFsLmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKworCisvKgorICogVmVyc2lvbiBJbmZvcm1hdGlvbgorICovCisjZGVmaW5lIERSSVZFUl9WRVJTSU9OICIxLjAuMC40RiIKKyNkZWZpbmUgRFJJVkVSX0FVVEhPUiAiQXNwaXJlIENvbW11bmljYXRpb25zIHB2dCBMdGQuIgorI2RlZmluZSBEUklWRVJfREVTQyAiTW9zY2hpcCBVU0IgU2VyaWFsIERyaXZlciIKKworLyogZGVmYXVsdCB1cmIgdGltZW91dCAqLworI2RlZmluZSBNT1NfV0RSX1RJTUVPVVQJKEhaICogNSkKKworI2RlZmluZSBNT1NfUE9SVDEJMHgwMjAwCisjZGVmaW5lIE1PU19QT1JUMgkweDAzMDAKKyNkZWZpbmUgTU9TX1ZFTlJFRwkweDAwMDAKKyNkZWZpbmUgTU9TX01BWF9QT1JUCTB4MDIKKyNkZWZpbmUgTU9TX1dSSVRFCTB4MEUKKyNkZWZpbmUgTU9TX1JFQUQJMHgwRAorCisvKiBJbnRlcnJ1cHQgUm90aW51ZSBEZWZpbmVzCSovCisjZGVmaW5lIFNFUklBTF9JSVJfUkxTCTB4MDYKKyNkZWZpbmUgU0VSSUFMX0lJUl9SREEJMHgwNAorI2RlZmluZSBTRVJJQUxfSUlSX0NUSQkweDBjCisjZGVmaW5lIFNFUklBTF9JSVJfVEhSCTB4MDIKKyNkZWZpbmUgU0VSSUFMX0lJUl9NUwkweDAwCisKKyNkZWZpbmUgTlVNX1VSQlMJCQkxNgkvKiBVUkIgQ291bnQgKi8KKyNkZWZpbmUgVVJCX1RSQU5TRkVSX0JVRkZFUl9TSVpFCTMyCS8qIFVSQiBTaXplICovCisKKy8qIFRoaXMgc3RydWN0dXJlIGhvbGRzIGFsbCBvZiB0aGUgbG9jYWwgcG9ydCBpbmZvcm1hdGlvbiAqLworc3RydWN0IG1vc2NoaXBfcG9ydAoreworCV9fdTgJc2hhZG93TENSOwkJLyogbGFzdCBMQ1IgdmFsdWUgcmVjZWl2ZWQgKi8KKwlfX3U4CXNoYWRvd01DUjsJCS8qIGxhc3QgTUNSIHZhbHVlIHJlY2VpdmVkICovCisJX191OAlzaGFkb3dNU1I7CQkvKiBsYXN0IE1TUiB2YWx1ZSByZWNlaXZlZCAqLworCWNoYXIJCQlvcGVuOworCXN0cnVjdCBhc3luY19pY291bnQJaWNvdW50OworCXN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQJKnBvcnQ7CS8qIGxvb3AgYmFjayB0byB0aGUgb3duZXIgKi8KKwlzdHJ1Y3QgdXJiCQkqd3JpdGVfdXJiX3Bvb2xbTlVNX1VSQlNdOworfTsKKworLyogVGhpcyBzdHJ1Y3R1cmUgaG9sZHMgYWxsIG9mIHRoZSBpbmRpdmlkdWFsIHNlcmlhbCBkZXZpY2UgaW5mb3JtYXRpb24gKi8KK3N0cnVjdCBtb3NjaGlwX3NlcmlhbAoreworCWludCBpbnRlcnJ1cHRfc3RhcnRlZDsKK307CisKK3N0YXRpYyBpbnQgZGVidWc7CisKKyNkZWZpbmUgVVNCX1ZFTkRPUl9JRF9NT1NDSElQCQkweDk3MTAKKyNkZWZpbmUgTU9TQ0hJUF9ERVZJQ0VfSURfNzcyMAkJMHg3NzIwCisjZGVmaW5lIE1PU0NISVBfREVWSUNFX0lEXzc3MTUJCTB4NzcxNQorCitzdGF0aWMgc3RydWN0IHVzYl9kZXZpY2VfaWQgbW9zY2hpcF9wb3J0X2lkX3RhYmxlIFtdID0geworCXsgVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX01PU0NISVAsTU9TQ0hJUF9ERVZJQ0VfSURfNzcyMCkgfSwKKwl7IH0gLyogdGVybWluYXRpbmcgZW50cnkgKi8KK307CitNT0RVTEVfREVWSUNFX1RBQkxFKHVzYiwgbW9zY2hpcF9wb3J0X2lkX3RhYmxlKTsKKworCisvKgorICogbW9zNzcyMF9pbnRlcnJ1cHRfY2FsbGJhY2sKKyAqCXRoaXMgaXMgdGhlIGNhbGxiYWNrIGZ1bmN0aW9uIGZvciB3aGVuIHdlIGhhdmUgcmVjZWl2ZWQgZGF0YSBvbiB0aGUKKyAqCWludGVycnVwdCBlbmRwb2ludC4KKyAqLworc3RhdGljIHZvaWQgbW9zNzcyMF9pbnRlcnJ1cHRfY2FsbGJhY2soc3RydWN0IHVyYiAqdXJiKQoreworCWludCByZXN1bHQ7CisJaW50IGxlbmd0aDsKKwlfX3UzMiAqZGF0YTsKKwl1bnNpZ25lZCBpbnQgc3RhdHVzOworCV9fdTggc3AxOworCV9fdTggc3AyOworCV9fdTggc3Q7CisKKwlkYmcoIiVzIiwiIDogRW50ZXJpbmdcbiIpOworCisJaWYgKCF1cmIpIHsKKwkJZGJnKCIlcyIsIkludmFsaWQgUG9pbnRlciAhISEhOlxuIik7CisJCXJldHVybjsKKwl9CisKKwlzd2l0Y2ggKHVyYi0+c3RhdHVzKSB7CisJY2FzZSAwOgorCQkvKiBzdWNjZXNzICovCisJCWJyZWFrOworCWNhc2UgLUVDT05OUkVTRVQ6CisJY2FzZSAtRU5PRU5UOgorCWNhc2UgLUVTSFVURE9XTjoKKwkJLyogdGhpcyB1cmIgaXMgdGVybWluYXRlZCwgY2xlYW4gdXAgKi8KKwkJZGJnKCIlcyAtIHVyYiBzaHV0dGluZyBkb3duIHdpdGggc3RhdHVzOiAlZCIsIF9fRlVOQ1RJT05fXywKKwkJICAgIHVyYi0+c3RhdHVzKTsKKwkJcmV0dXJuOworCWRlZmF1bHQ6CisJCWRiZygiJXMgLSBub256ZXJvIHVyYiBzdGF0dXMgcmVjZWl2ZWQ6ICVkIiwgX19GVU5DVElPTl9fLAorCQkgICAgdXJiLT5zdGF0dXMpOworCQlnb3RvIGV4aXQ7CisJfQorCisJbGVuZ3RoID0gdXJiLT5hY3R1YWxfbGVuZ3RoOworCWRhdGEgPSB1cmItPnRyYW5zZmVyX2J1ZmZlcjsKKworCS8qIE1vc2NoaXAgZ2V0IDQgYnl0ZXMKKwkgKiBCeXRlIDEgSUlSIFBvcnQgMSAocG9ydC5udW1iZXIgaXMgMCkKKwkgKiBCeXRlIDIgSUlSIFBvcnQgMiAocG9ydC5udW1iZXIgaXMgMSkKKwkgKiBCeXRlIDMgLS0tLS0tLS0tLS0tLS0KKwkgKiBCeXRlIDQgRklGTyBzdGF0dXMgZm9yIGJvdGggKi8KKwlpZiAobGVuZ3RoICYmIGxlbmd0aCA+IDQpIHsKKwkJZGJnKCJXcm9uZyBkYXRhICEhISIpOworCQlyZXR1cm47CisJfQorCisJc3RhdHVzID0gKmRhdGE7CisKKwlzcDEgPSAoc3RhdHVzICYgMHhmZjAwMDAwMCk+PjI0OworCXNwMiA9IChzdGF0dXMgJiAweDAwZmYwMDAwKT4+MTY7CisJc3QgPSBzdGF0dXMgJiAweDAwMDAwMGZmOworCisJaWYgKChzcDEgJiAweDAxKSB8fCAoc3AyICYgMHgwMSkpIHsKKwkJLyogTm8gSW50ZXJydXB0IFBlbmRpbmcgaW4gYm90aCB0aGUgcG9ydHMgKi8KKwkJZGJnKCJObyBJbnRlcnJ1cHQgISEhIik7CisJfSBlbHNlIHsKKwkJc3dpdGNoIChzcDEgJiAweDBmKSB7CisJCWNhc2UgU0VSSUFMX0lJUl9STFM6CisJCQlkYmcoIlNlcmlhbCBQb3J0IDE6IFJlY2VpdmVyIHN0YXR1cyBlcnJvciBvciBhZGRyZXNzICIKKwkJCSAgICAiYml0IGRldGVjdGVkIGluIDktYml0IG1vZGVcbiIpOworCQkJYnJlYWs7CisJCWNhc2UgU0VSSUFMX0lJUl9DVEk6CisJCQlkYmcoIlNlcmlhbCBQb3J0IDE6IFJlY2VpdmVyIHRpbWUgb3V0Iik7CisJCQlicmVhazsKKwkJY2FzZSBTRVJJQUxfSUlSX01TOgorCQkJZGJnKCJTZXJpYWwgUG9ydCAxOiBNb2RlbSBzdGF0dXMgY2hhbmdlIik7CisJCQlicmVhazsKKwkJfQorCisJCXN3aXRjaCAoc3AyICYgMHgwZikgeworCQljYXNlIFNFUklBTF9JSVJfUkxTOgorCQkJZGJnKCJTZXJpYWwgUG9ydCAyOiBSZWNlaXZlciBzdGF0dXMgZXJyb3Igb3IgYWRkcmVzcyAiCisJCQkgICAgImJpdCBkZXRlY3RlZCBpbiA5LWJpdCBtb2RlIik7CisJCQlicmVhazsKKwkJY2FzZSBTRVJJQUxfSUlSX0NUSToKKwkJCWRiZygiU2VyaWFsIFBvcnQgMjogUmVjZWl2ZXIgdGltZSBvdXQiKTsKKwkJCWJyZWFrOworCQljYXNlIFNFUklBTF9JSVJfTVM6CisJCQlkYmcoIlNlcmlhbCBQb3J0IDI6IE1vZGVtIHN0YXR1cyBjaGFuZ2UiKTsKKwkJCWJyZWFrOworCQl9CisJfQorCitleGl0OgorCXJlc3VsdCA9IHVzYl9zdWJtaXRfdXJiKHVyYiwgR0ZQX0FUT01JQyk7CisJaWYgKHJlc3VsdCkKKwkJZGV2X2VycigmdXJiLT5kZXYtPmRldiwKKwkJCSIlcyAtIEVycm9yICVkIHN1Ym1pdHRpbmcgY29udHJvbCB1cmJcbiIsCisJCQlfX0ZVTkNUSU9OX18sIHJlc3VsdCk7CisJcmV0dXJuOworfQorCisvKgorICogbW9zNzcyMF9idWxrX2luX2NhbGxiYWNrCisgKgl0aGlzIGlzIHRoZSBjYWxsYmFjayBmdW5jdGlvbiBmb3Igd2hlbiB3ZSBoYXZlIHJlY2VpdmVkIGRhdGEgb24gdGhlCisgKglidWxrIGluIGVuZHBvaW50LgorICovCitzdGF0aWMgdm9pZCBtb3M3NzIwX2J1bGtfaW5fY2FsbGJhY2soc3RydWN0IHVyYiAqdXJiKQoreworCWludCBzdGF0dXM7CisJdW5zaWduZWQgY2hhciAqZGF0YSA7CisJc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydDsKKwlzdHJ1Y3QgbW9zY2hpcF9wb3J0ICptb3M3NzIwX3BvcnQ7CisJc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eTsKKworCWlmICh1cmItPnN0YXR1cykgeworCQlkYmcoIm5vbnplcm8gcmVhZCBidWxrIHN0YXR1cyByZWNlaXZlZDogJWQiLHVyYi0+c3RhdHVzKTsKKwkJcmV0dXJuOworCX0KKworCW1vczc3MjBfcG9ydCA9IHVyYi0+Y29udGV4dDsKKwlpZiAoIW1vczc3MjBfcG9ydCkgeworCQlkYmcoIiVzIiwiTlVMTCBtb3M3NzIwX3BvcnQgcG9pbnRlciBcbiIpOworCQlyZXR1cm4gOworCX0KKworCXBvcnQgPSBtb3M3NzIwX3BvcnQtPnBvcnQ7CisKKwlkYmcoIkVudGVyaW5nLi4uJXMiLCBfX0ZVTkNUSU9OX18pOworCisJZGF0YSA9IHVyYi0+dHJhbnNmZXJfYnVmZmVyOworCisJdHR5ID0gcG9ydC0+dHR5OworCWlmICh0dHkgJiYgdXJiLT5hY3R1YWxfbGVuZ3RoKSB7CisJCXR0eV9idWZmZXJfcmVxdWVzdF9yb29tKHR0eSwgdXJiLT5hY3R1YWxfbGVuZ3RoKTsKKwkJdHR5X2luc2VydF9mbGlwX3N0cmluZyh0dHksIGRhdGEsIHVyYi0+YWN0dWFsX2xlbmd0aCk7CisJCXR0eV9mbGlwX2J1ZmZlcl9wdXNoKHR0eSk7CisJfQorCisJaWYgKCFwb3J0LT5yZWFkX3VyYikgeworCQlkYmcoIlVSQiBLSUxMRUQgISEhIik7CisJCXJldHVybjsKKwl9CisKKwlpZiAocG9ydC0+cmVhZF91cmItPnN0YXR1cyAhPSAtRUlOUFJPR1JFU1MpIHsKKwkJcG9ydC0+cmVhZF91cmItPmRldiA9IHBvcnQtPnNlcmlhbC0+ZGV2OworCisJCXN0YXR1cyA9IHVzYl9zdWJtaXRfdXJiKHBvcnQtPnJlYWRfdXJiLCBHRlBfQVRPTUlDKTsKKwkJaWYgKHN0YXR1cykKKwkJCWRiZygidXNiX3N1Ym1pdF91cmIocmVhZCBidWxrKSBmYWlsZWQsIHN0YXR1cyA9ICVkIiwKKwkJCSAgICBzdGF0dXMpOworCX0KK30KKworLyoKKyAqIG1vczc3MjBfYnVsa19vdXRfZGF0YV9jYWxsYmFjaworICoJdGhpcyBpcyB0aGUgY2FsbGJhY2sgZnVuY3Rpb24gZm9yIHdoZW4gd2UgaGF2ZSBmaW5pc2hlZCBzZW5kaW5nIHNlcmlhbAorICoJZGF0YSBvbiB0aGUgYnVsayBvdXQgZW5kcG9pbnQuCisgKi8KK3N0YXRpYyB2b2lkIG1vczc3MjBfYnVsa19vdXRfZGF0YV9jYWxsYmFjayhzdHJ1Y3QgdXJiICp1cmIpCit7CisJc3RydWN0IG1vc2NoaXBfcG9ydCAqbW9zNzcyMF9wb3J0OworCXN0cnVjdCB0dHlfc3RydWN0ICp0dHk7CisKKwlpZiAodXJiLT5zdGF0dXMpIHsKKwkJZGJnKCJub256ZXJvIHdyaXRlIGJ1bGsgc3RhdHVzIHJlY2VpdmVkOiVkIiwgdXJiLT5zdGF0dXMpOworCQlyZXR1cm47CisJfQorCisJbW9zNzcyMF9wb3J0ID0gdXJiLT5jb250ZXh0OworCWlmICghbW9zNzcyMF9wb3J0KSB7CisJCWRiZygiTlVMTCBtb3M3NzIwX3BvcnQgcG9pbnRlciIpOworCQlyZXR1cm4gOworCX0KKworCWRiZygiRW50ZXJpbmcgLi4uLi4uLi4uIik7CisKKwl0dHkgPSBtb3M3NzIwX3BvcnQtPnBvcnQtPnR0eTsKKworCWlmICh0dHkgJiYgbW9zNzcyMF9wb3J0LT5vcGVuKSB7CisJCS8qIGxldCB0aGUgdHR5IGRyaXZlciB3YWtldXAgaWYgaXQgaGFzIGEgc3BlY2lhbCAqCisJCSAqIHdyaXRlX3dha2V1cCBmdW5jdGlvbiAqLworCQlpZiAoKHR0eS0+ZmxhZ3MgJiAoMSA8PCBUVFlfRE9fV1JJVEVfV0FLRVVQKSkgJiYKKwkJICAgICB0dHktPmxkaXNjLndyaXRlX3dha2V1cCkKKwkJCSh0dHktPmxkaXNjLndyaXRlX3dha2V1cCkodHR5KTsKKworCQkvKiB0ZWxsIHRoZSB0dHkgZHJpdmVyIHRoYXQgc29tZXRoaW5nIGhhcyBjaGFuZ2VkICovCisJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmdHR5LT53cml0ZV93YWl0KTsKKwl9CisKKwkvKiBzY2hlZHVsZV93b3JrKCZtb3M3NzIwX3BvcnQtPnBvcnQtPndvcmspOyAqLworfQorCisvKgorICogc2VuZF9tb3NfY21kCisgKgl0aGlzIGZ1bmN0aW9uIHdpbGwgYmUgdXNlZCBmb3Igc2VuZGluZyBjb21tYW5kIHRvIGRldmljZQorICovCitzdGF0aWMgaW50IHNlbmRfbW9zX2NtZChzdHJ1Y3QgdXNiX3NlcmlhbCAqc2VyaWFsLCBfX3U4IHJlcXVlc3QsIF9fdTE2IHZhbHVlLAorCQkJX191MTYgaW5kZXgsIHZvaWQgKmRhdGEpCit7CisJaW50IHN0YXR1czsKKwl1bnNpZ25lZCBpbnQgcGlwZTsKKwl1MTYgcHJvZHVjdCA9IGxlMTZfdG9fY3B1KHNlcmlhbC0+ZGV2LT5kZXNjcmlwdG9yLmlkUHJvZHVjdCk7CisJX191OCByZXF1ZXN0dHlwZTsKKwlfX3UxNiBzaXplID0gMHgwMDAwOworCisJaWYgKHZhbHVlIDwgTU9TX01BWF9QT1JUKSB7CisJCWlmIChwcm9kdWN0ID09IE1PU0NISVBfREVWSUNFX0lEXzc3MTUpIHsKKwkJCXZhbHVlID0gdmFsdWUqMHgxMDArMHgxMDA7CisJCX0gZWxzZSB7CisJCQl2YWx1ZSA9IHZhbHVlKjB4MTAwKzB4MjAwOworCQl9CisJfSBlbHNlIHsKKwkJdmFsdWUgPSAweDAwMDA7CisJCWlmICgocHJvZHVjdCA9PSBNT1NDSElQX0RFVklDRV9JRF83NzE1KSAmJgorCQkgICAgKGluZGV4ICE9IDB4MDgpKSB7CisJCQlkYmcoInNlcmlhbC0+cHJvZHVjdD09IE1PU0NISVBfREVWSUNFX0lEXzc3MTUiKTsKKwkJCS8vaW5kZXggPSAweDAxIDsKKwkJfQorCX0KKworCWlmIChyZXF1ZXN0ID09IE1PU19XUklURSkgeworCQlyZXF1ZXN0ID0gKF9fdTgpTU9TX1dSSVRFOworCQlyZXF1ZXN0dHlwZSA9IChfX3U4KTB4NDA7CisJCXZhbHVlICA9IHZhbHVlICsgKF9fdTE2KSooKHVuc2lnbmVkIGNoYXIgKilkYXRhKTsKKwkJZGF0YSA9IE5VTEw7CisJCXBpcGUgPSB1c2Jfc25kY3RybHBpcGUoc2VyaWFsLT5kZXYsIDApOworCX0gZWxzZSB7CisJCXJlcXVlc3QgPSAoX191OClNT1NfUkVBRDsKKwkJcmVxdWVzdHR5cGUgPSAoX191OCkweEMwOworCQlzaXplID0gMHgwMTsKKwkJcGlwZSA9IHVzYl9yY3ZjdHJscGlwZShzZXJpYWwtPmRldiwwKTsKKwl9CisKKwlzdGF0dXMgPSB1c2JfY29udHJvbF9tc2coc2VyaWFsLT5kZXYsIHBpcGUsIHJlcXVlc3QsIHJlcXVlc3R0eXBlLAorCQkJCSB2YWx1ZSwgaW5kZXgsIGRhdGEsIHNpemUsIE1PU19XRFJfVElNRU9VVCk7CisKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZGJnKCJDb21tYW5kIFdyaXRlIGZhaWxlZCBWYWx1ZSAleCBpbmRleCAleFxuIix2YWx1ZSxpbmRleCk7CisKKwlyZXR1cm4gc3RhdHVzOworfQorCitzdGF0aWMgaW50IG1vczc3MjBfb3BlbihzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0LCBzdHJ1Y3QgZmlsZSAqIGZpbHApCit7CisJc3RydWN0IHVzYl9zZXJpYWwgKnNlcmlhbDsKKwlzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0MDsKKwlzdHJ1Y3QgdXJiICp1cmI7CisJc3RydWN0IG1vc2NoaXBfc2VyaWFsICptb3M3NzIwX3NlcmlhbDsKKwlzdHJ1Y3QgbW9zY2hpcF9wb3J0ICptb3M3NzIwX3BvcnQ7CisJaW50IHJlc3BvbnNlOworCWludCBwb3J0X251bWJlcjsKKwljaGFyIGRhdGE7CisJaW50IGo7CisKKwlzZXJpYWwgPSBwb3J0LT5zZXJpYWw7CisKKwltb3M3NzIwX3BvcnQgPSB1c2JfZ2V0X3NlcmlhbF9wb3J0X2RhdGEocG9ydCk7CisJaWYgKG1vczc3MjBfcG9ydCA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCXBvcnQwID0gc2VyaWFsLT5wb3J0WzBdOworCisJbW9zNzcyMF9zZXJpYWwgPSB1c2JfZ2V0X3NlcmlhbF9kYXRhKHNlcmlhbCk7CisKKwlpZiAobW9zNzcyMF9zZXJpYWwgPT0gTlVMTCB8fCBwb3J0MCA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCXVzYl9jbGVhcl9oYWx0KHNlcmlhbC0+ZGV2LCBwb3J0LT53cml0ZV91cmItPnBpcGUpOworCXVzYl9jbGVhcl9oYWx0KHNlcmlhbC0+ZGV2LCBwb3J0LT5yZWFkX3VyYi0+cGlwZSk7CisKKwkvKiBJbml0aWFsaXNpbmcgdGhlIHdyaXRlIHVyYiBwb29sICovCisJZm9yIChqID0gMDsgaiA8IE5VTV9VUkJTOyArK2opIHsKKwkJdXJiID0gdXNiX2FsbG9jX3VyYigwLFNMQUJfQVRPTUlDKTsKKwkJbW9zNzcyMF9wb3J0LT53cml0ZV91cmJfcG9vbFtqXSA9IHVyYjsKKworCQlpZiAodXJiID09IE5VTEwpIHsKKwkJCWVycigiTm8gbW9yZSB1cmJzPz8/Iik7CisJCQljb250aW51ZTsKKwkJfQorCisJCXVyYi0+dHJhbnNmZXJfYnVmZmVyID0ga21hbGxvYyhVUkJfVFJBTlNGRVJfQlVGRkVSX1NJWkUsCisJCQkJCSAgICAgICBHRlBfS0VSTkVMKTsKKwkJaWYgKCF1cmItPnRyYW5zZmVyX2J1ZmZlcikgeworCQkJZXJyKCIlcy1vdXQgb2YgbWVtb3J5IGZvciB1cmIgYnVmZmVycy4iLCBfX0ZVTkNUSU9OX18pOworCQkJY29udGludWU7CisJCX0KKwl9CisKKwkgLyogSW5pdGlhbGl6ZSBNQ1M3NzIwIC0tIFdyaXRlIEluaXQgdmFsdWVzIHRvIGNvcnJlc3BvbmRpbmcgUmVnaXN0ZXJzCisJICAqCisJICAqIFJlZ2lzdGVyIEluZGV4CisJICAqIDEgOiBJRVIKKwkgICogMiA6IEZDUgorCSAgKiAzIDogTENSCisJICAqIDQgOiBNQ1IKKwkgICoKKwkgICogMHgwOCA6IFNQMS8yIENvbnRyb2wgUmVnCisJICAqLworCXBvcnRfbnVtYmVyID0gcG9ydC0+bnVtYmVyIC0gcG9ydC0+c2VyaWFsLT5taW5vcjsKKwlzZW5kX21vc19jbWQocG9ydC0+c2VyaWFsLCBNT1NfUkVBRCwgcG9ydF9udW1iZXIsIFVBUlRfTFNSLCAmZGF0YSk7CisJZGJnKCJTUzo6JXAgTFNSOiV4XG4iLG1vczc3MjBfcG9ydCwgZGF0YSk7CisKKwlkYmcoIkNoZWNrOlNlbmRpbmcgQ29tbWFuZCAuLi4uLi4uLi4uIik7CisKKwlkYXRhID0gMHgwMjsKKwlzZW5kX21vc19jbWQoc2VyaWFsLCBNT1NfV1JJVEUsIE1PU19NQVhfUE9SVCwgMHgwMSwgJmRhdGEpOworCWRhdGEgPSAweDAyOworCXNlbmRfbW9zX2NtZChzZXJpYWwsIE1PU19XUklURSwgTU9TX01BWF9QT1JULCAweDAyLCAmZGF0YSk7CisKKwlkYXRhID0gMHgwMDsKKwlzZW5kX21vc19jbWQoc2VyaWFsLCBNT1NfV1JJVEUsIHBvcnRfbnVtYmVyLCAweDAxLCAmZGF0YSk7CisJZGF0YSA9IDB4MDA7CisJc2VuZF9tb3NfY21kKHNlcmlhbCwgTU9TX1dSSVRFLCBwb3J0X251bWJlciwgMHgwMiwgJmRhdGEpOworCisJZGF0YSA9IDB4Q0Y7CisJc2VuZF9tb3NfY21kKHNlcmlhbCwgTU9TX1dSSVRFLCBwb3J0X251bWJlciwgMHgwMiwgJmRhdGEpOworCWRhdGEgPSAweDAzOworICAgICAgICBtb3M3NzIwX3BvcnQtPnNoYWRvd0xDUiAgPSBkYXRhOworCXNlbmRfbW9zX2NtZChzZXJpYWwsIE1PU19XUklURSwgcG9ydF9udW1iZXIsIDB4MDMsICZkYXRhKTsKKwlkYXRhID0gMHgwYjsKKyAgICAgICAgbW9zNzcyMF9wb3J0LT5zaGFkb3dNQ1IgID0gZGF0YTsKKwlzZW5kX21vc19jbWQoc2VyaWFsLCBNT1NfV1JJVEUsIHBvcnRfbnVtYmVyLCAweDA0LCAmZGF0YSk7CisJZGF0YSA9IDB4MGI7CisJc2VuZF9tb3NfY21kKHNlcmlhbCwgTU9TX1dSSVRFLCBwb3J0X251bWJlciwgMHgwNCwgJmRhdGEpOworCisJZGF0YSA9IDB4MDA7CisJc2VuZF9tb3NfY21kKHNlcmlhbCwgTU9TX1JFQUQsIE1PU19NQVhfUE9SVCwgMHgwOCwgJmRhdGEpOworCWRhdGEgPSAweDAwOworCXNlbmRfbW9zX2NtZChzZXJpYWwsIE1PU19XUklURSwgTU9TX01BWF9QT1JULCAweDA4LCAmZGF0YSk7CisKKy8qCWRhdGEgPSAweDAwOworCXNlbmRfbW9zX2NtZChzZXJpYWwsIE1PU19SRUFELCBNT1NfTUFYX1BPUlQsIHBvcnRfbnVtYmVyICsgMSwgJmRhdGEpOworCWRhdGEgPSAweDAzOworCXNlbmRfbW9zX2NtZChzZXJpYWwsIE1PU19XUklURSwgTU9TX01BWF9QT1JULCBwb3J0X251bWJlciArIDEsICZkYXRhKTsKKwlkYXRhID0gMHgwMDsKKwlzZW5kX21vc19jbWQocG9ydC0+c2VyaWFsLCBNT1NfV1JJVEUsIE1PU19NQVhfUE9SVCwgcG9ydF9udW1iZXIgKyAxLCAmZGF0YSk7CisqLworCWRhdGEgPSAweDAwOworCXNlbmRfbW9zX2NtZChzZXJpYWwsIE1PU19SRUFELCBNT1NfTUFYX1BPUlQsIDB4MDgsICZkYXRhKTsKKworCWRhdGEgPSBkYXRhIHwgKHBvcnQtPm51bWJlciAtIHBvcnQtPnNlcmlhbC0+bWlub3IgKyAxKTsKKwlzZW5kX21vc19jbWQoc2VyaWFsLCBNT1NfV1JJVEUsIE1PU19NQVhfUE9SVCwgMHgwOCwgJmRhdGEpOworCisJZGF0YSA9IDB4ODM7CisgICAgICAgIG1vczc3MjBfcG9ydC0+c2hhZG93TENSICA9IGRhdGE7CisJc2VuZF9tb3NfY21kKHNlcmlhbCwgTU9TX1dSSVRFLCBwb3J0X251bWJlciwgMHgwMywgJmRhdGEpOworCWRhdGEgPSAweDBjOworCXNlbmRfbW9zX2NtZChzZXJpYWwsIE1PU19XUklURSwgcG9ydF9udW1iZXIsIDB4MDAsICZkYXRhKTsKKwlkYXRhID0gMHgwMDsKKwlzZW5kX21vc19jbWQoc2VyaWFsLCBNT1NfV1JJVEUsIHBvcnRfbnVtYmVyLCAweDAxLCAmZGF0YSk7CisJZGF0YSA9IDB4MDM7CisgICAgICAgIG1vczc3MjBfcG9ydC0+c2hhZG93TENSICA9IGRhdGE7CisJc2VuZF9tb3NfY21kKHNlcmlhbCwgTU9TX1dSSVRFLCBwb3J0X251bWJlciwgMHgwMywgJmRhdGEpOworCWRhdGEgPSAweDBjOworCXNlbmRfbW9zX2NtZChzZXJpYWwsIE1PU19XUklURSwgcG9ydF9udW1iZXIsIDB4MDEsICZkYXRhKTsKKwlkYXRhID0gMHgwYzsKKwlzZW5kX21vc19jbWQoc2VyaWFsLCBNT1NfV1JJVEUsIHBvcnRfbnVtYmVyLCAweDAxLCAmZGF0YSk7CisKKy8vTWF0cml4CisKKwkvKiBmb3JjZSBsb3dfbGF0ZW5jeSBvbiBzbyB0aGF0IG91ciB0dHlfcHVzaCBhY3R1YWxseSBmb3JjZXMgKgorCSAqIHRoZSBkYXRhIHRocm91Z2gsb3RoZXJ3aXNlIGl0IGlzIHNjaGVkdWxlZCwgYW5kIHdpdGggICAgICAqCisJICogaGlnaCBkYXRhIHJhdGVzIChsaWtlIHdpdGggT0hDSSkgZGF0YSBjYW4gZ2V0IGxvc3QuICAgICAgICovCisKKwlpZiAocG9ydC0+dHR5KQorCQlwb3J0LT50dHktPmxvd19sYXRlbmN5ID0gMTsKKworCS8qIHNlZSBpZiB3ZSd2ZSBzZXQgdXAgb3VyIGVuZHBvaW50IGluZm8geWV0ICAgKgorCSAqIChjYW4ndCBzZXQgaXQgdXAgaW4gbW9zNzcyMF9zdGFydHVwIGFzIHRoZSAgKgorCSAqIHN0cnVjdHVyZXMgd2VyZSBub3Qgc2V0IHVwIGF0IHRoYXQgdGltZS4pICAgKi8KKwlpZiAoIW1vczc3MjBfc2VyaWFsLT5pbnRlcnJ1cHRfc3RhcnRlZCkgeworCQlkYmcoIkludGVycnVwdCBidWZmZXIgTlVMTCAhISEiKTsKKworCQkvKiBub3Qgc2V0IHVwIHlldCwgc28gZG8gaXQgbm93ICovCisJCW1vczc3MjBfc2VyaWFsLT5pbnRlcnJ1cHRfc3RhcnRlZCA9IDE7CisKKwkJZGJnKCJUbyBTdWJtaXQgVVJCICEhISIpOworCisJCS8qIHNldCB1cCBvdXIgaW50ZXJydXB0IHVyYiAqLworCQl1c2JfZmlsbF9pbnRfdXJiKHBvcnQwLT5pbnRlcnJ1cHRfaW5fdXJiLCBzZXJpYWwtPmRldiwKKwkJCQkgdXNiX3JjdmludHBpcGUoc2VyaWFsLT5kZXYsCisJCQkJIAkJcG9ydC0+aW50ZXJydXB0X2luX2VuZHBvaW50QWRkcmVzcyksCisJCQkJIHBvcnQwLT5pbnRlcnJ1cHRfaW5fYnVmZmVyLAorCQkJCSBwb3J0MC0+aW50ZXJydXB0X2luX3VyYi0+dHJhbnNmZXJfYnVmZmVyX2xlbmd0aCwKKwkJCQkgbW9zNzcyMF9pbnRlcnJ1cHRfY2FsbGJhY2ssIG1vczc3MjBfcG9ydCwKKwkJCQkgcG9ydDAtPmludGVycnVwdF9pbl91cmItPmludGVydmFsKTsKKworCQkvKiBzdGFydCBpbnRlcnJ1cHQgcmVhZCBmb3IgdGhpcyBtb3M3NzIwIHRoaXMgaW50ZXJydXB0ICoKKwkgICAgICAgICAqIHdpbGwgY29udGludWUgYXMgbG9uZyBhcyB0aGUgbW9zNzcyMCBpcyBjb25uZWN0ZWQgICAgKi8KKwkJZGJnKCJTdWJtaXQgVVJCIG92ZXIgISEhIik7CisJCXJlc3BvbnNlID0gdXNiX3N1Ym1pdF91cmIocG9ydDAtPmludGVycnVwdF9pbl91cmIsIEdGUF9LRVJORUwpOworCQlpZiAocmVzcG9uc2UpCisJCQlkZXZfZXJyKCZwb3J0LT5kZXYsCisJCQkJIiVzIC0gRXJyb3IgJWQgc3VibWl0dGluZyBjb250cm9sIHVyYiIsCisJCQkJX19GVU5DVElPTl9fLCByZXNwb25zZSk7CisJfQorCisJLyogc2V0IHVwIG91ciBidWxrIGluIHVyYiAqLworCXVzYl9maWxsX2J1bGtfdXJiKHBvcnQtPnJlYWRfdXJiLCBzZXJpYWwtPmRldiwKKwkJCSAgdXNiX3JjdmJ1bGtwaXBlKHNlcmlhbC0+ZGV2LAorCQkJICAJCSAgcG9ydC0+YnVsa19pbl9lbmRwb2ludEFkZHJlc3MpLAorCQkJICBwb3J0LT5idWxrX2luX2J1ZmZlciwKKwkJCSAgcG9ydC0+cmVhZF91cmItPnRyYW5zZmVyX2J1ZmZlcl9sZW5ndGgsCisJCQkgIG1vczc3MjBfYnVsa19pbl9jYWxsYmFjaywgbW9zNzcyMF9wb3J0KTsKKwlyZXNwb25zZSA9IHVzYl9zdWJtaXRfdXJiKHBvcnQtPnJlYWRfdXJiLCBHRlBfS0VSTkVMKTsKKwlpZiAocmVzcG9uc2UpCisJCWRldl9lcnIoJnBvcnQtPmRldiwKKwkJCSIlcyAtIEVycm9yICVkIHN1Ym1pdHRpbmcgcmVhZCB1cmIiLCBfX0ZVTkNUSU9OX18sIHJlc3BvbnNlKTsKKworCS8qIGluaXRpYWxpemUgb3VyIGljb3VudCBzdHJ1Y3R1cmUgKi8KKwltZW1zZXQoJihtb3M3NzIwX3BvcnQtPmljb3VudCksIDB4MDAsIHNpemVvZihtb3M3NzIwX3BvcnQtPmljb3VudCkpOworCisJLyogaW5pdGlhbGl6ZSBvdXIgcG9ydCBzZXR0aW5ncyAqLworCW1vczc3MjBfcG9ydC0+c2hhZG93TUNSID0gVUFSVF9NQ1JfT1VUMjsgLyogTXVzdCBzZXQgdG8gZW5hYmxlIGludHMhICovCisKKwkvKiBzZW5kIGEgb3BlbiBwb3J0IGNvbW1hbmQgKi8KKwltb3M3NzIwX3BvcnQtPm9wZW4gPSAxOworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBtb3M3NzIwX2NoYXJzX2luX2J1ZmZlcgorICoJdGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYnkgdGhlIHR0eSBkcml2ZXIgd2hlbiBpdCB3YW50cyB0byBrbm93IGhvdyBtYW55CisgKglieXRlcyBvZiBkYXRhIHdlIGN1cnJlbnRseSBoYXZlIG91dHN0YW5kaW5nIGluIHRoZSBwb3J0IChkYXRhIHRoYXQgaGFzCisgKgliZWVuIHdyaXR0ZW4sIGJ1dCBoYXNuJ3QgbWFkZSBpdCBvdXQgdGhlIHBvcnQgeWV0KQorICoJSWYgc3VjY2Vzc2Z1bCwgd2UgcmV0dXJuIHRoZSBudW1iZXIgb2YgYnl0ZXMgbGVmdCB0byBiZSB3cml0dGVuIGluIHRoZQorICoJc3lzdGVtLAorICoJT3RoZXJ3aXNlIHdlIHJldHVybiBhIG5lZ2F0aXZlIGVycm9yIG51bWJlci4KKyAqLworc3RhdGljIGludCBtb3M3NzIwX2NoYXJzX2luX2J1ZmZlcihzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0KQoreworCWludCBpOworCWludCBjaGFycyA9IDA7CisJc3RydWN0IG1vc2NoaXBfcG9ydCAqbW9zNzcyMF9wb3J0OworCisJZGJnKCIlczplbnRlcmluZyAuLi4uLi4uLi4uLiIsIF9fRlVOQ1RJT05fXyk7CisKKwltb3M3NzIwX3BvcnQgPSB1c2JfZ2V0X3NlcmlhbF9wb3J0X2RhdGEocG9ydCk7CisJaWYgKG1vczc3MjBfcG9ydCA9PSBOVUxMKSB7CisJCWRiZygiJXM6bGVhdmluZyAuLi4uLi4uLi4uLiIsIF9fRlVOQ1RJT05fXyk7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCWZvciAoaSA9IDA7IGkgPCBOVU1fVVJCUzsgKytpKSB7CisJCWlmIChtb3M3NzIwX3BvcnQtPndyaXRlX3VyYl9wb29sW2ldLT5zdGF0dXMgPT0gLUVJTlBST0dSRVNTKQorCQkJY2hhcnMgKz0gVVJCX1RSQU5TRkVSX0JVRkZFUl9TSVpFOworCX0KKwlkYmcoIiVzIC0gcmV0dXJucyAlZCIsIF9fRlVOQ1RJT05fXywgY2hhcnMpOworCXJldHVybiBjaGFyczsKK30KKworc3RhdGljIHZvaWQgbW9zNzcyMF9jbG9zZShzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0LCBzdHJ1Y3QgZmlsZSAqZmlscCkKK3sKKwlzdHJ1Y3QgdXNiX3NlcmlhbCAqc2VyaWFsOworCXN0cnVjdCBtb3NjaGlwX3BvcnQgKm1vczc3MjBfcG9ydDsKKwljaGFyIGRhdGE7CisJaW50IGo7CisKKwlkYmcoIm1vczc3MjBfY2xvc2U6ZW50ZXJpbmcuLi4iKTsKKworCXNlcmlhbCA9IHBvcnQtPnNlcmlhbDsKKworCW1vczc3MjBfcG9ydCA9IHVzYl9nZXRfc2VyaWFsX3BvcnRfZGF0YShwb3J0KTsKKwlpZiAobW9zNzcyMF9wb3J0ID09IE5VTEwpCisJCXJldHVybjsKKworCWZvciAoaiA9IDA7IGogPCBOVU1fVVJCUzsgKytqKQorCQl1c2Jfa2lsbF91cmIobW9zNzcyMF9wb3J0LT53cml0ZV91cmJfcG9vbFtqXSk7CisKKwkvKiBGcmVlaW5nIFdyaXRlIFVSQnMgKi8KKwlmb3IgKGogPSAwOyBqIDwgTlVNX1VSQlM7ICsraikgeworCQlpZiAobW9zNzcyMF9wb3J0LT53cml0ZV91cmJfcG9vbFtqXSkgeworCQkJa2ZyZWUobW9zNzcyMF9wb3J0LT53cml0ZV91cmJfcG9vbFtqXS0+dHJhbnNmZXJfYnVmZmVyKTsKKwkJCXVzYl9mcmVlX3VyYihtb3M3NzIwX3BvcnQtPndyaXRlX3VyYl9wb29sW2pdKTsKKwkJfQorCX0KKworCS8qIFdoaWxlIGNsb3NpbmcgcG9ydCwgc2h1dGRvd24gYWxsIGJ1bGsgcmVhZCwgd3JpdGUgICoKKwkgKiBhbmQgaW50ZXJydXB0IHJlYWQgaWYgdGhleSBleGlzdHMgICAgICAgICAgICAgICAgICAqLworCWlmIChzZXJpYWwtPmRldikgeworCQlkYmcoIlNodXRkb3duIGJ1bGsgd3JpdGUiKTsKKwkJdXNiX2tpbGxfdXJiKHBvcnQtPndyaXRlX3VyYik7CisJCWRiZygiU2h1dGRvd24gYnVsayByZWFkIik7CisJCXVzYl9raWxsX3VyYihwb3J0LT5yZWFkX3VyYik7CisJfQorCisJZGF0YSA9IDB4MDA7CisJc2VuZF9tb3NfY21kKHNlcmlhbCwgTU9TX1dSSVRFLCBwb3J0LT5udW1iZXIgLSBwb3J0LT5zZXJpYWwtPm1pbm9yLAorCQkgICAgIDB4MDQsICZkYXRhKTsKKworCWRhdGEgPSAweDAwOworCXNlbmRfbW9zX2NtZChzZXJpYWwsIE1PU19XUklURSwgcG9ydC0+bnVtYmVyIC0gcG9ydC0+c2VyaWFsLT5taW5vciwKKwkJICAgICAweDAxLCAmZGF0YSk7CisKKwltb3M3NzIwX3BvcnQtPm9wZW4gPSAwOworCisJZGJnKCJMZWF2aW5nICVzIiwgX19GVU5DVElPTl9fKTsKK30KKworc3RhdGljIHZvaWQgbW9zNzcyMF9icmVhayhzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0LCBpbnQgYnJlYWtfc3RhdGUpCit7CisgICAgICAgIHVuc2lnbmVkIGNoYXIgZGF0YTsKKwlzdHJ1Y3QgdXNiX3NlcmlhbCAqc2VyaWFsOworCXN0cnVjdCBtb3NjaGlwX3BvcnQgKm1vczc3MjBfcG9ydDsKKworCWRiZygiRW50ZXJpbmcgJXMiLCBfX0ZVTkNUSU9OX18pOworCisJc2VyaWFsID0gcG9ydC0+c2VyaWFsOworCisJbW9zNzcyMF9wb3J0ID0gdXNiX2dldF9zZXJpYWxfcG9ydF9kYXRhKHBvcnQpOworCWlmIChtb3M3NzIwX3BvcnQgPT0gTlVMTCkKKwkJcmV0dXJuOworCisJaWYgKGJyZWFrX3N0YXRlID09IC0xKQorCQlkYXRhID0gbW9zNzcyMF9wb3J0LT5zaGFkb3dMQ1IgfCBVQVJUX0xDUl9TQkM7CisJZWxzZQorCQlkYXRhID0gbW9zNzcyMF9wb3J0LT5zaGFkb3dMQ1IgJiB+VUFSVF9MQ1JfU0JDOworCisJbW9zNzcyMF9wb3J0LT5zaGFkb3dMQ1IgID0gZGF0YTsKKwlzZW5kX21vc19jbWQoc2VyaWFsLCBNT1NfV1JJVEUsIHBvcnQtPm51bWJlciAtIHBvcnQtPnNlcmlhbC0+bWlub3IsCisJCSAgICAgMHgwMywgJmRhdGEpOworCisJcmV0dXJuOworfQorCisvKgorICogbW9zNzcyMF93cml0ZV9yb29tCisgKgl0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSB0aGUgdHR5IGRyaXZlciB3aGVuIGl0IHdhbnRzIHRvIGtub3cgaG93IG1hbnkKKyAqCWJ5dGVzIG9mIGRhdGEgd2UgY2FuIGFjY2VwdCBmb3IgYSBzcGVjaWZpYyBwb3J0LgorICoJSWYgc3VjY2Vzc2Z1bCwgd2UgcmV0dXJuIHRoZSBhbW91bnQgb2Ygcm9vbSB0aGF0IHdlIGhhdmUgZm9yIHRoaXMgcG9ydAorICoJT3RoZXJ3aXNlIHdlIHJldHVybiBhIG5lZ2F0aXZlIGVycm9yIG51bWJlci4KKyAqLworc3RhdGljIGludCBtb3M3NzIwX3dyaXRlX3Jvb20oc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCkKK3sKKwlzdHJ1Y3QgbW9zY2hpcF9wb3J0ICptb3M3NzIwX3BvcnQ7CisJaW50IHJvb20gPSAwOworCWludCBpOworCisJZGJnKCIlczplbnRlcmluZyAuLi4uLi4uLi4uLiIsIF9fRlVOQ1RJT05fXyk7CisKKwltb3M3NzIwX3BvcnQgPSB1c2JfZ2V0X3NlcmlhbF9wb3J0X2RhdGEocG9ydCk7CisJaWYgKG1vczc3MjBfcG9ydCA9PSBOVUxMKSB7CisJCWRiZygiJXM6bGVhdmluZyAuLi4uLi4uLi4uLiIsIF9fRlVOQ1RJT05fXyk7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCWZvciAoaSA9IDA7IGkgPCBOVU1fVVJCUzsgKytpKSB7CisJCWlmIChtb3M3NzIwX3BvcnQtPndyaXRlX3VyYl9wb29sW2ldLT5zdGF0dXMgIT0gLUVJTlBST0dSRVNTKQorCQkJcm9vbSArPSBVUkJfVFJBTlNGRVJfQlVGRkVSX1NJWkU7CisJfQorCisJZGJnKCIlcyAtIHJldHVybnMgJWQiLCBfX0ZVTkNUSU9OX18sIHJvb20pOworCXJldHVybiByb29tOworfQorCitzdGF0aWMgaW50IG1vczc3MjBfd3JpdGUoc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCwKKwkJCSBjb25zdCB1bnNpZ25lZCBjaGFyICpkYXRhLCBpbnQgY291bnQpCit7CisJaW50IHN0YXR1czsKKwlpbnQgaTsKKwlpbnQgYnl0ZXNfc2VudCA9IDA7CisJaW50IHRyYW5zZmVyX3NpemU7CisKKwlzdHJ1Y3QgbW9zY2hpcF9wb3J0ICptb3M3NzIwX3BvcnQ7CisJc3RydWN0IHVzYl9zZXJpYWwgKnNlcmlhbDsKKwlzdHJ1Y3QgdXJiICAgICp1cmI7CisJY29uc3QgdW5zaWduZWQgY2hhciAqY3VycmVudF9wb3NpdGlvbiA9IGRhdGE7CisKKwlkYmcoIiVzOmVudGVyaW5nIC4uLi4uLi4uLi4uIiwgX19GVU5DVElPTl9fKTsKKworCXNlcmlhbCA9IHBvcnQtPnNlcmlhbDsKKworCW1vczc3MjBfcG9ydCA9IHVzYl9nZXRfc2VyaWFsX3BvcnRfZGF0YShwb3J0KTsKKwlpZiAobW9zNzcyMF9wb3J0ID09IE5VTEwpIHsKKwkJZGJnKCJtb3M3NzIwX3BvcnQgaXMgTlVMTCIpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwkvKiB0cnkgdG8gZmluZCBhIGZyZWUgdXJiIGluIHRoZSBsaXN0ICovCisJdXJiID0gTlVMTDsKKworCWZvciAoaSA9IDA7IGkgPCBOVU1fVVJCUzsgKytpKSB7CisJCWlmIChtb3M3NzIwX3BvcnQtPndyaXRlX3VyYl9wb29sW2ldLT5zdGF0dXMgIT0gLUVJTlBST0dSRVNTKSB7CisJCQl1cmIgPSBtb3M3NzIwX3BvcnQtPndyaXRlX3VyYl9wb29sW2ldOworCQkJZGJnKCJVUkI6JWQiLGkpOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlpZiAodXJiID09IE5VTEwpIHsKKwkJZGJnKCIlcyAtIG5vIG1vcmUgZnJlZSB1cmJzIiwgX19GVU5DVElPTl9fKTsKKwkJZ290byBleGl0OworCX0KKworCWlmICh1cmItPnRyYW5zZmVyX2J1ZmZlciA9PSBOVUxMKSB7CisJCXVyYi0+dHJhbnNmZXJfYnVmZmVyID0ga21hbGxvYyhVUkJfVFJBTlNGRVJfQlVGRkVSX1NJWkUsCisJCQkJCSAgICAgICBHRlBfS0VSTkVMKTsKKwkJaWYgKHVyYi0+dHJhbnNmZXJfYnVmZmVyID09IE5VTEwpIHsKKwkJCWVycigiJXMgbm8gbW9yZSBrZXJuZWwgbWVtb3J5Li4uIiwgX19GVU5DVElPTl9fKTsKKwkJCWdvdG8gZXhpdDsKKwkJfQorCX0KKwl0cmFuc2Zlcl9zaXplID0gbWluIChjb3VudCwgVVJCX1RSQU5TRkVSX0JVRkZFUl9TSVpFKTsKKworCW1lbWNweSh1cmItPnRyYW5zZmVyX2J1ZmZlciwgY3VycmVudF9wb3NpdGlvbiwgdHJhbnNmZXJfc2l6ZSk7CisJdXNiX3NlcmlhbF9kZWJ1Z19kYXRhKGRlYnVnLCAmcG9ydC0+ZGV2LCBfX0ZVTkNUSU9OX18sIHRyYW5zZmVyX3NpemUsCisJCQkgICAgICB1cmItPnRyYW5zZmVyX2J1ZmZlcik7CisKKwkvKiBmaWxsIHVyYiB3aXRoIGRhdGEgYW5kIHN1Ym1pdCAgKi8KKwl1c2JfZmlsbF9idWxrX3VyYih1cmIsIHNlcmlhbC0+ZGV2LAorCQkJICB1c2Jfc25kYnVsa3BpcGUoc2VyaWFsLT5kZXYsCisJCQkgIAkJICBwb3J0LT5idWxrX291dF9lbmRwb2ludEFkZHJlc3MpLAorCQkJICB1cmItPnRyYW5zZmVyX2J1ZmZlciwgdHJhbnNmZXJfc2l6ZSwKKwkJCSAgbW9zNzcyMF9idWxrX291dF9kYXRhX2NhbGxiYWNrLCBtb3M3NzIwX3BvcnQpOworCisJLyogc2VuZCBpdCBkb3duIHRoZSBwaXBlICovCisJc3RhdHVzID0gdXNiX3N1Ym1pdF91cmIodXJiLEdGUF9BVE9NSUMpOworCWlmIChzdGF0dXMpIHsKKwkJZXJyKCIlcyAtIHVzYl9zdWJtaXRfdXJiKHdyaXRlIGJ1bGspIGZhaWxlZCB3aXRoIHN0YXR1cyA9ICVkIiwKKwkJICAgIF9fRlVOQ1RJT05fXywgc3RhdHVzKTsKKwkJYnl0ZXNfc2VudCA9IHN0YXR1czsKKwkJZ290byBleGl0OworCX0KKwlieXRlc19zZW50ID0gdHJhbnNmZXJfc2l6ZTsKKworZXhpdDoKKwlyZXR1cm4gYnl0ZXNfc2VudDsKK30KKworc3RhdGljIHZvaWQgbW9zNzcyMF90aHJvdHRsZShzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0KQoreworCXN0cnVjdCBtb3NjaGlwX3BvcnQgKm1vczc3MjBfcG9ydDsKKwlzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5OworCWludCBzdGF0dXM7CisKKwlkYmcoIiVzLSBwb3J0ICVkXG4iLCBfX0ZVTkNUSU9OX18sIHBvcnQtPm51bWJlcik7CisKKwltb3M3NzIwX3BvcnQgPSB1c2JfZ2V0X3NlcmlhbF9wb3J0X2RhdGEocG9ydCk7CisKKwlpZiAobW9zNzcyMF9wb3J0ID09IE5VTEwpCisJCXJldHVybjsKKworCWlmICghbW9zNzcyMF9wb3J0LT5vcGVuKSB7CisJCWRiZygicG9ydCBub3Qgb3BlbmVkIik7CisJCXJldHVybjsKKwl9CisKKwlkYmcoIiVzOiBFbnRlcmluZyAuLi4uLi4uLi4uIiwgX19GVU5DVElPTl9fKTsKKworCXR0eSA9IHBvcnQtPnR0eTsKKwlpZiAoIXR0eSkgeworCQlkYmcoIiVzIC0gbm8gdHR5IGF2YWlsYWJsZSIsIF9fRlVOQ1RJT05fXyk7CisJCXJldHVybjsKKwl9CisKKwkvKiBpZiB3ZSBhcmUgaW1wbGVtZW50aW5nIFhPTi9YT0ZGLCBzZW5kIHRoZSBzdG9wIGNoYXJhY3RlciAqLworCWlmIChJX0lYT0ZGKHR0eSkpIHsKKwkJdW5zaWduZWQgY2hhciBzdG9wX2NoYXIgPSBTVE9QX0NIQVIodHR5KTsKKwkJc3RhdHVzID0gbW9zNzcyMF93cml0ZShwb3J0LCAmc3RvcF9jaGFyLCAxKTsKKwkJaWYgKHN0YXR1cyA8PSAwKQorCQkJcmV0dXJuOworCX0KKworCS8qIGlmIHdlIGFyZSBpbXBsZW1lbnRpbmcgUlRTL0NUUywgdG9nZ2xlIHRoYXQgbGluZSAqLworCWlmICh0dHktPnRlcm1pb3MtPmNfY2ZsYWcgJiBDUlRTQ1RTKSB7CisJCW1vczc3MjBfcG9ydC0+c2hhZG93TUNSICY9IH5VQVJUX01DUl9SVFM7CisJCXN0YXR1cyA9IHNlbmRfbW9zX2NtZChwb3J0LT5zZXJpYWwsIE1PU19XUklURSwKKwkJCQkgICAgICBwb3J0LT5udW1iZXIgLSBwb3J0LT5zZXJpYWwtPm1pbm9yLAorCQkJCSAgICAgIFVBUlRfTUNSLCAmbW9zNzcyMF9wb3J0LT5zaGFkb3dNQ1IpOworCQlpZiAoc3RhdHVzICE9IDApCisJCQlyZXR1cm47CisJfQorfQorCitzdGF0aWMgdm9pZCBtb3M3NzIwX3VudGhyb3R0bGUoc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCkKK3sKKwlzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5OworCWludCBzdGF0dXM7CisJc3RydWN0IG1vc2NoaXBfcG9ydCAqbW9zNzcyMF9wb3J0ID0gdXNiX2dldF9zZXJpYWxfcG9ydF9kYXRhKHBvcnQpOworCisJaWYgKG1vczc3MjBfcG9ydCA9PSBOVUxMKQorCQlyZXR1cm47CisKKwlpZiAoIW1vczc3MjBfcG9ydC0+b3BlbikgeworCQlkYmcoIiVzIC0gcG9ydCBub3Qgb3BlbmVkIiwgX19GVU5DVElPTl9fKTsKKwkJcmV0dXJuOworCX0KKworCWRiZygiJXM6IEVudGVyaW5nIC4uLi4uLi4uLi4iLCBfX0ZVTkNUSU9OX18pOworCisJdHR5ID0gcG9ydC0+dHR5OworCWlmICghdHR5KSB7CisJCWRiZygiJXMgLSBubyB0dHkgYXZhaWxhYmxlIiwgX19GVU5DVElPTl9fKTsKKwkJcmV0dXJuOworCX0KKworCS8qIGlmIHdlIGFyZSBpbXBsZW1lbnRpbmcgWE9OL1hPRkYsIHNlbmQgdGhlIHN0YXJ0IGNoYXJhY3RlciAqLworCWlmIChJX0lYT0ZGKHR0eSkpIHsKKwkJdW5zaWduZWQgY2hhciBzdGFydF9jaGFyID0gU1RBUlRfQ0hBUih0dHkpOworCQlzdGF0dXMgPSBtb3M3NzIwX3dyaXRlKHBvcnQsICZzdGFydF9jaGFyLCAxKTsKKwkJaWYgKHN0YXR1cyA8PSAwKQorCQkJcmV0dXJuOworCX0KKworCS8qIGlmIHdlIGFyZSBpbXBsZW1lbnRpbmcgUlRTL0NUUywgdG9nZ2xlIHRoYXQgbGluZSAqLworCWlmICh0dHktPnRlcm1pb3MtPmNfY2ZsYWcgJiBDUlRTQ1RTKSB7CisJCW1vczc3MjBfcG9ydC0+c2hhZG93TUNSIHw9IFVBUlRfTUNSX1JUUzsKKwkJc3RhdHVzID0gc2VuZF9tb3NfY21kKHBvcnQtPnNlcmlhbCwgTU9TX1dSSVRFLAorCQkJCSAgICAgIHBvcnQtPm51bWJlciAtIHBvcnQtPnNlcmlhbC0+bWlub3IsCisJCQkJICAgICAgVUFSVF9NQ1IsICZtb3M3NzIwX3BvcnQtPnNoYWRvd01DUik7CisJCWlmIChzdGF0dXMgIT0gMCkKKwkJCXJldHVybjsKKwl9Cit9CisKK3N0YXRpYyBpbnQgc2V0X2hpZ2hlcl9yYXRlcyhzdHJ1Y3QgbW9zY2hpcF9wb3J0ICptb3M3NzIwX3BvcnQsCisJCQkgICAgdW5zaWduZWQgaW50IGJhdWQpCit7CisJdW5zaWduZWQgY2hhciBkYXRhOworCXN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQ7CisJc3RydWN0IHVzYl9zZXJpYWwgKnNlcmlhbDsKKwlpbnQgcG9ydF9udW1iZXI7CisKKwlpZiAobW9zNzcyMF9wb3J0ID09IE5VTEwpCisJCXJldHVybiAtRUlOVkFMOworCisJcG9ydCA9IG1vczc3MjBfcG9ydC0+cG9ydDsKKwlzZXJpYWwgPSBwb3J0LT5zZXJpYWw7CisKKyAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgICAqICAgICAgSW5pdCBTZXF1ZW5jZSBmb3IgaGlnaGVyIHJhdGVzCisgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwlkYmcoIlNlbmRpbmcgU2V0dGluZyBDb21tYW5kcyAuLi4uLi4uLi4uIik7CisJcG9ydF9udW1iZXIgPSBwb3J0LT5udW1iZXIgLSBwb3J0LT5zZXJpYWwtPm1pbm9yOworCisJZGF0YSA9IDB4MDAwOworCXNlbmRfbW9zX2NtZChzZXJpYWwsIE1PU19XUklURSwgcG9ydF9udW1iZXIsIDB4MDEsICZkYXRhKTsKKwlkYXRhID0gMHgwMDA7CisJc2VuZF9tb3NfY21kKHNlcmlhbCwgTU9TX1dSSVRFLCBwb3J0X251bWJlciwgMHgwMiwgJmRhdGEpOworCWRhdGEgPSAweDBDRjsKKwlzZW5kX21vc19jbWQoc2VyaWFsLCBNT1NfV1JJVEUsIHBvcnQtPm51bWJlciwgMHgwMiwgJmRhdGEpOworCWRhdGEgPSAweDAwYjsKKyAgICAgICAgbW9zNzcyMF9wb3J0LT5zaGFkb3dNQ1IgID0gZGF0YTsKKwlzZW5kX21vc19jbWQoc2VyaWFsLCBNT1NfV1JJVEUsIHBvcnRfbnVtYmVyLCAweDA0LCAmZGF0YSk7CisJZGF0YSA9IDB4MDBiOworCXNlbmRfbW9zX2NtZChzZXJpYWwsIE1PU19XUklURSwgcG9ydF9udW1iZXIsIDB4MDQsICZkYXRhKTsKKworCWRhdGEgPSAweDAwMDsKKwlzZW5kX21vc19jbWQoc2VyaWFsLCBNT1NfUkVBRCwgTU9TX01BWF9QT1JULCAweDA4LCAmZGF0YSk7CisJZGF0YSA9IDB4MDAwOworCXNlbmRfbW9zX2NtZChzZXJpYWwsIE1PU19XUklURSwgTU9TX01BWF9QT1JULCAweDA4LCAmZGF0YSk7CisKKworICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICAgICogICAgICAgICAgICAgIFNldCBmb3IgaGlnaGVyIHJhdGVzICAgICAgICAgICAqCisgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCWRhdGEgPSBiYXVkICogMHgxMDsKKwlzZW5kX21vc19jbWQoc2VyaWFsLCBNT1NfV1JJVEUsIE1PU19NQVhfUE9SVCwgcG9ydF9udW1iZXIgKyAxLCZkYXRhKTsKKworCWRhdGEgPSAweDAwMzsKKwlzZW5kX21vc19jbWQoc2VyaWFsLCBNT1NfUkVBRCwgTU9TX01BWF9QT1JULCAweDA4LCAmZGF0YSk7CisJZGF0YSA9IDB4MDAzOworCXNlbmRfbW9zX2NtZChzZXJpYWwsIE1PU19XUklURSwgTU9TX01BWF9QT1JULCAweDA4LCAmZGF0YSk7CisKKwlkYXRhID0gMHgwMmI7CisgICAgICAgIG1vczc3MjBfcG9ydC0+c2hhZG93TUNSICA9IGRhdGE7CisJc2VuZF9tb3NfY21kKHNlcmlhbCwgTU9TX1dSSVRFLCBwb3J0X251bWJlciwgMHgwNCwgJmRhdGEpOworCWRhdGEgPSAweDAyYjsKKwlzZW5kX21vc19jbWQoc2VyaWFsLCBNT1NfV1JJVEUsIHBvcnRfbnVtYmVyLCAweDA0LCAmZGF0YSk7CisKKyAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgICAqICAgICAgICAgICAgICBTZXQgRExML0RMTQorICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKwlkYXRhID0gbW9zNzcyMF9wb3J0LT5zaGFkb3dMQ1IgfCBVQVJUX0xDUl9ETEFCOworICAgICAgICBtb3M3NzIwX3BvcnQtPnNoYWRvd0xDUiAgPSBkYXRhOworCXNlbmRfbW9zX2NtZChzZXJpYWwsIE1PU19XUklURSwgcG9ydF9udW1iZXIsIDB4MDMsICZkYXRhKTsKKworCWRhdGEgPSAgMHgwMDE7IC8qIERMTCAqLworICAgICAgICBzZW5kX21vc19jbWQoc2VyaWFsLCBNT1NfV1JJVEUsIHBvcnRfbnVtYmVyLCAweDAwLCAmZGF0YSk7CisJZGF0YSA9ICAweDAwMDsgLyogRExNICovCisgICAgICAgIHNlbmRfbW9zX2NtZChzZXJpYWwsIE1PU19XUklURSwgcG9ydF9udW1iZXIsIDB4MDEsICZkYXRhKTsKKworCWRhdGEgPSBtb3M3NzIwX3BvcnQtPnNoYWRvd0xDUiAmIH5VQVJUX0xDUl9ETEFCOworICAgICAgICBtb3M3NzIwX3BvcnQtPnNoYWRvd0xDUiAgPSBkYXRhOworCXNlbmRfbW9zX2NtZChzZXJpYWwsIE1PU19XUklURSwgcG9ydF9udW1iZXIsIDB4MDMsICZkYXRhKTsKKworCXJldHVybiAwOworfQorCisvKiBiYXVkIHJhdGUgaW5mb3JtYXRpb24gKi8KK3N0cnVjdCBkaXZpc29yX3RhYmxlX2VudHJ5Cit7CisJX191MzIgIGJhdWRyYXRlOworCV9fdTE2ICBkaXZpc29yOworfTsKKworLyogRGVmaW5lIHRhYmxlIG9mIGRpdmlzb3JzIGZvciBtb3NjaGlwIDc3MjAgaGFyZHdhcmUJICAgKgorICogVGhlc2UgYXNzdW1lIGEgMy42ODY0TUh6IGNyeXN0YWwsIHRoZSBzdGFuZGFyZCAvMTYsIGFuZCAqCisgKiBNQ1IuNyA9IDAuCQkJCQkJICAgKi8KK3N0YXRpYyBzdHJ1Y3QgZGl2aXNvcl90YWJsZV9lbnRyeSBkaXZpc29yX3RhYmxlW10gPSB7CisJeyAgIDUwLAkJMjMwNH0sCisJeyAgIDExMCwJMTA0N30sCS8qIDIwOTQuNTQ1NDU1ID0+IDIzMDQ1MCAgID0+IC4wMjE3ICUgb3ZlciAqLworCXsgICAxMzQsCTg1N30sCS8qIDE3MTMuMDExMTUyID0+IDIzMDM5OC41ID0+IC4wMDA2NSUgdW5kZXIgKi8KKwl7ICAgMTUwLAk3Njh9LAorCXsgICAzMDAsCTM4NH0sCisJeyAgIDYwMCwJMTkyfSwKKwl7ICAgMTIwMCwJOTZ9LAorCXsgICAxODAwLAk2NH0sCisJeyAgIDI0MDAsCTQ4fSwKKwl7ICAgNDgwMCwJMjR9LAorCXsgICA3MjAwLAkxNn0sCisJeyAgIDk2MDAsCTEyfSwKKwl7ICAgMTkyMDAsCTZ9LAorCXsgICAzODQwMCwJM30sCisJeyAgIDU3NjAwLAkyfSwKKwl7ICAgMTE1MjAwLAkxfSwKK307CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogY2FsY19iYXVkX3JhdGVfZGl2aXNvcgorICoJdGhpcyBmdW5jdGlvbiBjYWxjdWxhdGVzIHRoZSBwcm9wZXIgYmF1ZCByYXRlIGRpdmlzb3IgZm9yIHRoZSBzcGVjaWZpZWQKKyAqCWJhdWQgcmF0ZS4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBpbnQgY2FsY19iYXVkX3JhdGVfZGl2aXNvcihpbnQgYmF1ZHJhdGUsIGludCAqZGl2aXNvcikKK3sKKwlpbnQgaTsKKwlfX3UxNiBjdXN0b207CisJX191MTYgcm91bmQxOworCV9fdTE2IHJvdW5kOworCisKKwlkYmcoIiVzIC0gJWQiLCBfX0ZVTkNUSU9OX18sIGJhdWRyYXRlKTsKKworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGRpdmlzb3JfdGFibGUpOyBpKyspIHsKKwkJaWYgKGRpdmlzb3JfdGFibGVbaV0uYmF1ZHJhdGUgPT0gYmF1ZHJhdGUpIHsKKwkJCSpkaXZpc29yID0gZGl2aXNvcl90YWJsZVtpXS5kaXZpc29yOworCQkJcmV0dXJuIDA7CisJCX0KKwl9CisKKyAgICAgICAgLyogQWZ0ZXIgdHJ5aW5nIGZvciBhbGwgdGhlIHN0YW5kYXJkIGJhdWQgcmF0ZXMgICAgKgorICAgICAgICAgKiBUcnkgY2FsY3VsYXRpbmcgdGhlIGRpdmlzb3IgZm9yIHRoaXMgYmF1ZCByYXRlICAqLworCWlmIChiYXVkcmF0ZSA+IDc1ICYmICBiYXVkcmF0ZSA8IDIzMDQwMCkgeworCQkvKiBnZXQgdGhlIGRpdmlzb3IgKi8KKwkJY3VzdG9tID0gKF9fdTE2KSgyMzA0MDBMICAvIGJhdWRyYXRlKTsKKworCQkvKiBDaGVjayBmb3Igcm91bmQgb2ZmICovCisJCXJvdW5kMSA9IChfX3UxNikoMjMwNDAwMEwgLyBiYXVkcmF0ZSk7CisJCXJvdW5kID0gKF9fdTE2KShyb3VuZDEgLSAoY3VzdG9tICogMTApKTsKKwkJaWYgKHJvdW5kID4gNCkKKwkJCWN1c3RvbSsrOworCQkqZGl2aXNvciA9IGN1c3RvbTsKKworCQlkYmcoIkJhdWQgJWQgPSAlZCIsYmF1ZHJhdGUsIGN1c3RvbSk7CisJCXJldHVybiAwOworCX0KKworCWRiZygiQmF1ZCBjYWxjdWxhdGlvbiBGYWlsZWQuLi4iKTsKKwlyZXR1cm4gLUVJTlZBTDsKK30KKworLyoKKyAqIHNlbmRfY21kX3dyaXRlX2JhdWRfcmF0ZQorICoJdGhpcyBmdW5jdGlvbiBzZW5kcyB0aGUgcHJvcGVyIGNvbW1hbmQgdG8gY2hhbmdlIHRoZSBiYXVkIHJhdGUgb2YgdGhlCisgKglzcGVjaWZpZWQgcG9ydC4KKyAqLworc3RhdGljIGludCBzZW5kX2NtZF93cml0ZV9iYXVkX3JhdGUoc3RydWN0IG1vc2NoaXBfcG9ydCAqbW9zNzcyMF9wb3J0LAorCQkJCSAgICBpbnQgYmF1ZHJhdGUpCit7CisJc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydDsKKwlzdHJ1Y3QgdXNiX3NlcmlhbCAqc2VyaWFsOworCWludCBkaXZpc29yOworCWludCBzdGF0dXM7CisJdW5zaWduZWQgY2hhciBkYXRhOworCXVuc2lnbmVkIGNoYXIgbnVtYmVyOworCisJaWYgKG1vczc3MjBfcG9ydCA9PSBOVUxMKQorCQlyZXR1cm4gLTE7CisKKwlwb3J0ID0gbW9zNzcyMF9wb3J0LT5wb3J0OworCXNlcmlhbCA9IHBvcnQtPnNlcmlhbDsKKworCWRiZygiJXM6IEVudGVyaW5nIC4uLi4uLi4uLi4iLCBfX0ZVTkNUSU9OX18pOworCisJbnVtYmVyID0gcG9ydC0+bnVtYmVyIC0gcG9ydC0+c2VyaWFsLT5taW5vcjsKKwlkYmcoIiVzIC0gcG9ydCA9ICVkLCBiYXVkID0gJWQiLCBfX0ZVTkNUSU9OX18sIHBvcnQtPm51bWJlciwgYmF1ZHJhdGUpOworCisgICAgICAgIC8qIENhbGN1bGF0ZSB0aGUgRGl2aXNvciAqLworCXN0YXR1cyA9IGNhbGNfYmF1ZF9yYXRlX2Rpdmlzb3IoYmF1ZHJhdGUsICZkaXZpc29yKTsKKwlpZiAoc3RhdHVzKSB7CisJCWVycigiJXMgLSBiYWQgYmF1ZCByYXRlIiwgX19GVU5DVElPTl9fKTsKKwkJcmV0dXJuIHN0YXR1czsKKwl9CisKKyAgICAgICAgLyogRW5hYmxlIGFjY2VzcyB0byBkaXZpc29yIGxhdGNoICovCisgICAgICAgIGRhdGEgPSBtb3M3NzIwX3BvcnQtPnNoYWRvd0xDUiB8IFVBUlRfTENSX0RMQUI7CisgICAgICAgIG1vczc3MjBfcG9ydC0+c2hhZG93TENSICA9IGRhdGE7CisgICAgICAgIHNlbmRfbW9zX2NtZChzZXJpYWwsIE1PU19XUklURSwgbnVtYmVyLCBVQVJUX0xDUiwgJmRhdGEpOworCisJLyogV3JpdGUgdGhlIGRpdmlzb3IgKi8KKwlkYXRhID0gKCh1bnNpZ25lZCBjaGFyKShkaXZpc29yICYgMHhmZikpOworICAgICAgICBzZW5kX21vc19jbWQoc2VyaWFsLCBNT1NfV1JJVEUsIG51bWJlciwgMHgwMCwgJmRhdGEpOworCisJZGF0YSA9ICgodW5zaWduZWQgY2hhcikoKGRpdmlzb3IgJiAweGZmMDApID4+IDgpKTsKKyAgICAgICAgc2VuZF9tb3NfY21kKHNlcmlhbCwgTU9TX1dSSVRFLCBudW1iZXIsIDB4MDEsICZkYXRhKTsKKworICAgICAgICAvKiBEaXNhYmxlIGFjY2VzcyB0byBkaXZpc29yIGxhdGNoICovCisgICAgICAgIGRhdGEgPSBtb3M3NzIwX3BvcnQtPnNoYWRvd0xDUiAmIH5VQVJUX0xDUl9ETEFCOworICAgICAgICBtb3M3NzIwX3BvcnQtPnNoYWRvd0xDUiA9IGRhdGE7CisgICAgICAgIHNlbmRfbW9zX2NtZChzZXJpYWwsIE1PU19XUklURSwgbnVtYmVyLCAweDAzLCAmZGF0YSk7CisKKwlyZXR1cm4gc3RhdHVzOworfQorCisvKgorICogY2hhbmdlX3BvcnRfc2V0dGluZ3MKKyAqCVRoaXMgcm91dGluZSBpcyBjYWxsZWQgdG8gc2V0IHRoZSBVQVJUIG9uIHRoZSBkZXZpY2UgdG8gbWF0Y2gKKyAqICAgICAgdGhlIHNwZWNpZmllZCBuZXcgc2V0dGluZ3MuCisgKi8KK3N0YXRpYyB2b2lkIGNoYW5nZV9wb3J0X3NldHRpbmdzKHN0cnVjdCBtb3NjaGlwX3BvcnQgKm1vczc3MjBfcG9ydCwKKwkJCQkgc3RydWN0IHRlcm1pb3MgKm9sZF90ZXJtaW9zKQoreworCXN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQ7CisJc3RydWN0IHVzYl9zZXJpYWwgKnNlcmlhbDsKKwlzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5OworCWludCBiYXVkOworCXVuc2lnbmVkIGNmbGFnOworCXVuc2lnbmVkIGlmbGFnOworCV9fdTggbWFzayA9IDB4ZmY7CisJX191OCBsRGF0YTsKKwlfX3U4IGxQYXJpdHk7CisJX191OCBsU3RvcDsKKwlpbnQgc3RhdHVzOworCWludCBwb3J0X251bWJlcjsKKwljaGFyIGRhdGE7CisKKwlpZiAobW9zNzcyMF9wb3J0ID09IE5VTEwpCisJCXJldHVybiA7CisKKwlwb3J0ID0gbW9zNzcyMF9wb3J0LT5wb3J0OworCXNlcmlhbCA9IHBvcnQtPnNlcmlhbDsKKwlwb3J0X251bWJlciA9IHBvcnQtPm51bWJlciAtIHBvcnQtPnNlcmlhbC0+bWlub3I7CisKKwlkYmcoIiVzIC0gcG9ydCAlZCIsIF9fRlVOQ1RJT05fXywgcG9ydC0+bnVtYmVyKTsKKworCWlmICghbW9zNzcyMF9wb3J0LT5vcGVuKSB7CisJCWRiZygiJXMgLSBwb3J0IG5vdCBvcGVuZWQiLCBfX0ZVTkNUSU9OX18pOworCQlyZXR1cm47CisJfQorCisJdHR5ID0gbW9zNzcyMF9wb3J0LT5wb3J0LT50dHk7CisKKwlpZiAoKCF0dHkpIHx8ICghdHR5LT50ZXJtaW9zKSkgeworCQlkYmcoIiVzIC0gbm8gdHR5IHN0cnVjdHVyZXMiLCBfX0ZVTkNUSU9OX18pOworCQlyZXR1cm47CisJfQorCisJZGJnKCIlczogRW50ZXJpbmcgLi4uLi4uLi4uLiIsIF9fRlVOQ1RJT05fXyk7CisKKwlsRGF0YSA9IFVBUlRfTENSX1dMRU44OworCWxTdG9wID0gMHgwMDsJLyogMSBzdG9wIGJpdCAqLworCWxQYXJpdHkgPSAweDAwOwkvKiBObyBwYXJpdHkgKi8KKworCWNmbGFnID0gdHR5LT50ZXJtaW9zLT5jX2NmbGFnOworCWlmbGFnID0gdHR5LT50ZXJtaW9zLT5jX2lmbGFnOworCisJLyogQ2hhbmdlIHRoZSBudW1iZXIgb2YgYml0cyAqLworCXN3aXRjaCAoY2ZsYWcgJiBDU0laRSkgeworCWNhc2UgQ1M1OgorCQlsRGF0YSA9IFVBUlRfTENSX1dMRU41OworCQltYXNrID0gMHgxZjsKKwkJYnJlYWs7CisKKwljYXNlIENTNjoKKwkJbERhdGEgPSBVQVJUX0xDUl9XTEVONjsKKwkJbWFzayA9IDB4M2Y7CisJCWJyZWFrOworCisJY2FzZSBDUzc6CisJCWxEYXRhID0gVUFSVF9MQ1JfV0xFTjc7CisJCW1hc2sgPSAweDdmOworCQlicmVhazsKKwlkZWZhdWx0OgorCWNhc2UgQ1M4OgorCQlsRGF0YSA9IFVBUlRfTENSX1dMRU44OworCQlicmVhazsKKwl9CisKKwkvKiBDaGFuZ2UgdGhlIFBhcml0eSBiaXQgKi8KKwlpZiAoY2ZsYWcgJiBQQVJFTkIpIHsKKwkJaWYgKGNmbGFnICYgUEFST0REKSB7CisJCQlsUGFyaXR5ID0gVUFSVF9MQ1JfUEFSSVRZOworCQkJZGJnKCIlcyAtIHBhcml0eSA9IG9kZCIsIF9fRlVOQ1RJT05fXyk7CisJCX0gZWxzZSB7CisJCQlsUGFyaXR5ID0gKFVBUlRfTENSX0VQQVIgfCBVQVJUX0xDUl9QQVJJVFkpOworCQkJZGJnKCIlcyAtIHBhcml0eSA9IGV2ZW4iLCBfX0ZVTkNUSU9OX18pOworCQl9CisKKwl9IGVsc2UgeworCQlkYmcoIiVzIC0gcGFyaXR5ID0gbm9uZSIsIF9fRlVOQ1RJT05fXyk7CisJfQorCisJaWYgKGNmbGFnICYgQ01TUEFSKQorCQlsUGFyaXR5ID0gbFBhcml0eSB8IDB4MjA7CisKKwkvKiBDaGFuZ2UgdGhlIFN0b3AgYml0ICovCisJaWYgKGNmbGFnICYgQ1NUT1BCKSB7CisJCWxTdG9wID0gVUFSVF9MQ1JfU1RPUDsKKwkJZGJnKCIlcyAtIHN0b3AgYml0cyA9IDIiLCBfX0ZVTkNUSU9OX18pOworCX0gZWxzZSB7CisJCWxTdG9wID0gMHgwMDsKKwkJZGJnKCIlcyAtIHN0b3AgYml0cyA9IDEiLCBfX0ZVTkNUSU9OX18pOworCX0KKworI2RlZmluZSBMQ1JfQklUU19NQVNLCQkweDAzCS8qIE1hc2sgZm9yIGJpdHMvY2hhciBmaWVsZCAqLworI2RlZmluZSBMQ1JfU1RPUF9NQVNLCQkweDA0CS8qIE1hc2sgZm9yIHN0b3AgYml0cyBmaWVsZCAqLworI2RlZmluZSBMQ1JfUEFSX01BU0sJCTB4MzgJLyogTWFzayBmb3IgcGFyaXR5IGZpZWxkICovCisKKwkvKiBVcGRhdGUgdGhlIExDUiB3aXRoIHRoZSBjb3JyZWN0IHZhbHVlICovCisJbW9zNzcyMF9wb3J0LT5zaGFkb3dMQ1IgJj0gfihMQ1JfQklUU19NQVNLIHwgTENSX1NUT1BfTUFTSyB8IExDUl9QQVJfTUFTSyk7CisJbW9zNzcyMF9wb3J0LT5zaGFkb3dMQ1IgfD0gKGxEYXRhIHwgbFBhcml0eSB8IGxTdG9wKTsKKworCisJLyogRGlzYWJsZSBJbnRlcnJ1cHRzICovCisJZGF0YSA9IDB4MDA7CisgICAgICAgIHNlbmRfbW9zX2NtZChzZXJpYWwsTU9TX1dSSVRFLHBvcnQtPm51bWJlciAtIHBvcnQtPnNlcmlhbC0+bWlub3IsIFVBUlRfSUVSLCAmZGF0YSk7CisKKwlkYXRhID0gMHgwMDsKKyAgICAgICAgc2VuZF9tb3NfY21kKHNlcmlhbCwgTU9TX1dSSVRFLCBwb3J0X251bWJlciwgVUFSVF9GQ1IsICZkYXRhKTsKKworCWRhdGEgPSAweGNmOworICAgICAgICBzZW5kX21vc19jbWQoc2VyaWFsLCBNT1NfV1JJVEUsIHBvcnRfbnVtYmVyLCBVQVJUX0ZDUiwgJmRhdGEpOworCisJLyogU2VuZCB0aGUgdXBkYXRlZCBMQ1IgdmFsdWUgdG8gdGhlIG1vczc3MjAgKi8KKwlkYXRhID0gbW9zNzcyMF9wb3J0LT5zaGFkb3dMQ1I7CisgICAgICAgIHNlbmRfbW9zX2NtZChzZXJpYWwsIE1PU19XUklURSwgcG9ydF9udW1iZXIsIFVBUlRfTENSLCAmZGF0YSk7CisKKyAgICAgICAgZGF0YSA9IDB4MDBiOworICAgICAgICBtb3M3NzIwX3BvcnQtPnNoYWRvd01DUiA9IGRhdGE7CisgICAgICAgIHNlbmRfbW9zX2NtZChzZXJpYWwsIE1PU19XUklURSwgcG9ydF9udW1iZXIsIDB4MDQsICZkYXRhKTsKKyAgICAgICAgZGF0YSA9IDB4MDBiOworICAgICAgICBzZW5kX21vc19jbWQoc2VyaWFsLCBNT1NfV1JJVEUsIHBvcnRfbnVtYmVyLCAweDA0LCAmZGF0YSk7CisKKwkvKiBzZXQgdXAgdGhlIE1DUiByZWdpc3RlciBhbmQgc2VuZCBpdCB0byB0aGUgbW9zNzcyMCAqLworCW1vczc3MjBfcG9ydC0+c2hhZG93TUNSID0gVUFSVF9NQ1JfT1VUMjsKKwlpZiAoY2ZsYWcgJiBDQkFVRCkKKwkJbW9zNzcyMF9wb3J0LT5zaGFkb3dNQ1IgfD0gKFVBUlRfTUNSX0RUUiB8IFVBUlRfTUNSX1JUUyk7CisKKwlpZiAoY2ZsYWcgJiBDUlRTQ1RTKSB7CisJCW1vczc3MjBfcG9ydC0+c2hhZG93TUNSIHw9IChVQVJUX01DUl9YT05BTlkpOworCisgICAgICAgICAgICAgICAgLyogVG8gc2V0IGhhcmR3YXJlIGZsb3cgY29udHJvbCB0byB0aGUgc3BlY2lmaWVkICoKKyAgICAgICAgICAgICAgICAgKiBzZXJpYWwgcG9ydCwgaW4gU1AxLzJfQ09OVFJPTF9SRUcgICAgICAgICAgICAgKi8KKwkJaWYgKHBvcnQtPm51bWJlcikgeworCQkJZGF0YSA9IDB4MDAxOworCQkJc2VuZF9tb3NfY21kKHNlcmlhbCwgTU9TX1dSSVRFLCBNT1NfTUFYX1BPUlQsCisJCQkJICAgICAweDA4LCAmZGF0YSk7CisJCX0gZWxzZSB7CisJCQlkYXRhID0gMHgwMDI7CisJCQlzZW5kX21vc19jbWQoc2VyaWFsLCBNT1NfV1JJVEUsIE1PU19NQVhfUE9SVCwKKwkJCQkgICAgIDB4MDgsICZkYXRhKTsKKwkJfQorCX0gZWxzZSB7CisJCW1vczc3MjBfcG9ydC0+c2hhZG93TUNSICY9IH4oVUFSVF9NQ1JfWE9OQU5ZKTsKKwl9CisKKwlkYXRhID0gbW9zNzcyMF9wb3J0LT5zaGFkb3dNQ1I7CisJc2VuZF9tb3NfY21kKHNlcmlhbCwgTU9TX1dSSVRFLCBwb3J0X251bWJlciwgVUFSVF9NQ1IsICZkYXRhKTsKKworCS8qIERldGVybWluZSBkaXZpc29yIGJhc2VkIG9uIGJhdWQgcmF0ZSAqLworCWJhdWQgPSB0dHlfZ2V0X2JhdWRfcmF0ZSh0dHkpOworCWlmICghYmF1ZCkgeworCQkvKiBwaWNrIGEgZGVmYXVsdCwgYW55IGRlZmF1bHQuLi4gKi8KKwkJZGJnKCJQaWNrZWQgZGVmYXVsdCBiYXVkLi4uIik7CisJCWJhdWQgPSA5NjAwOworCX0KKworCWlmIChiYXVkID49IDIzMDQwMCkgeworCQlzZXRfaGlnaGVyX3JhdGVzKG1vczc3MjBfcG9ydCwgYmF1ZCk7CisJCS8qIEVuYWJsZSBJbnRlcnJ1cHRzICovCisJCWRhdGEgPSAweDBjOworCQlzZW5kX21vc19jbWQoc2VyaWFsLCBNT1NfV1JJVEUsIHBvcnRfbnVtYmVyLCBVQVJUX0lFUiwgJmRhdGEpOworCQlyZXR1cm47CisJfQorCisJZGJnKCIlcyAtIGJhdWQgcmF0ZSA9ICVkIiwgX19GVU5DVElPTl9fLCBiYXVkKTsKKwlzdGF0dXMgPSBzZW5kX2NtZF93cml0ZV9iYXVkX3JhdGUobW9zNzcyMF9wb3J0LCBiYXVkKTsKKworCS8qIEVuYWJsZSBJbnRlcnJ1cHRzICovCisJZGF0YSA9IDB4MGM7CisJc2VuZF9tb3NfY21kKHNlcmlhbCwgTU9TX1dSSVRFLCBwb3J0X251bWJlciwgVUFSVF9JRVIsICZkYXRhKTsKKworCWlmIChwb3J0LT5yZWFkX3VyYi0+c3RhdHVzICE9IC1FSU5QUk9HUkVTUykgeworCQlwb3J0LT5yZWFkX3VyYi0+ZGV2ID0gc2VyaWFsLT5kZXY7CisKKwkJc3RhdHVzID0gdXNiX3N1Ym1pdF91cmIocG9ydC0+cmVhZF91cmIsIEdGUF9BVE9NSUMpOworCQlpZiAoc3RhdHVzKQorCQkJZGJnKCJ1c2Jfc3VibWl0X3VyYihyZWFkIGJ1bGspIGZhaWxlZCwgc3RhdHVzID0gJWQiLAorCQkJICAgIHN0YXR1cyk7CisJfQorCXJldHVybjsKK30KKworLyoKKyAqIG1vczc3MjBfc2V0X3Rlcm1pb3MKKyAqCXRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGJ5IHRoZSB0dHkgZHJpdmVyIHdoZW4gaXQgd2FudHMgdG8gY2hhbmdlIHRoZQorICoJdGVybWlvcyBzdHJ1Y3R1cmUuCisgKi8KK3N0YXRpYyB2b2lkIG1vczc3MjBfc2V0X3Rlcm1pb3Moc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCwKKwkJCQlzdHJ1Y3QgdGVybWlvcyAqb2xkX3Rlcm1pb3MpCit7CisJaW50IHN0YXR1czsKKwl1bnNpZ25lZCBpbnQgY2ZsYWc7CisJc3RydWN0IHVzYl9zZXJpYWwgKnNlcmlhbDsKKwlzdHJ1Y3QgbW9zY2hpcF9wb3J0ICptb3M3NzIwX3BvcnQ7CisJc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eTsKKworCXNlcmlhbCA9IHBvcnQtPnNlcmlhbDsKKworCW1vczc3MjBfcG9ydCA9IHVzYl9nZXRfc2VyaWFsX3BvcnRfZGF0YShwb3J0KTsKKworCWlmIChtb3M3NzIwX3BvcnQgPT0gTlVMTCkKKwkJcmV0dXJuOworCisJdHR5ID0gcG9ydC0+dHR5OworCisJaWYgKCFwb3J0LT50dHkgfHwgIXBvcnQtPnR0eS0+dGVybWlvcykgeworCQlkYmcoIiVzIC0gbm8gdHR5IG9yIHRlcm1pb3MiLCBfX0ZVTkNUSU9OX18pOworCQlyZXR1cm47CisJfQorCisJaWYgKCFtb3M3NzIwX3BvcnQtPm9wZW4pIHsKKwkJZGJnKCIlcyAtIHBvcnQgbm90IG9wZW5lZCIsIF9fRlVOQ1RJT05fXyk7CisJCXJldHVybjsKKwl9CisKKwlkYmcoIiVzXG4iLCJzZXR0aW5nIHRlcm1pb3MgLSBBU1BJUkUiKTsKKworCWNmbGFnID0gdHR5LT50ZXJtaW9zLT5jX2NmbGFnOworCisJaWYgKCFjZmxhZykgeworCQlwcmludGsoIiVzICVzXG4iLF9fRlVOQ1RJT05fXywiY2ZsYWcgaXMgTlVMTCIpOworCQlyZXR1cm47CisJfQorCisJLyogY2hlY2sgdGhhdCB0aGV5IHJlYWxseSB3YW50IHVzIHRvIGNoYW5nZSBzb21ldGhpbmcgKi8KKwlpZiAob2xkX3Rlcm1pb3MpIHsKKwkJaWYgKChjZmxhZyA9PSBvbGRfdGVybWlvcy0+Y19jZmxhZykgJiYKKwkJICAgIChSRUxFVkFOVF9JRkxBRyh0dHktPnRlcm1pb3MtPmNfaWZsYWcpID09CisJCSAgICAgUkVMRVZBTlRfSUZMQUcob2xkX3Rlcm1pb3MtPmNfaWZsYWcpKSkgeworCQkJZGJnKCJOb3RoaW5nIHRvIGNoYW5nZSIpOworCQkJcmV0dXJuOworCQl9CisJfQorCisJZGJnKCIlcyAtIGNsZmFnICUwOHggaWZsYWcgJTA4eCIsIF9fRlVOQ1RJT05fXywKKwkgICAgdHR5LT50ZXJtaW9zLT5jX2NmbGFnLAorCSAgICBSRUxFVkFOVF9JRkxBRyh0dHktPnRlcm1pb3MtPmNfaWZsYWcpKTsKKworCWlmIChvbGRfdGVybWlvcykKKwkJZGJnKCIlcyAtIG9sZCBjbGZhZyAlMDh4IG9sZCBpZmxhZyAlMDh4IiwgX19GVU5DVElPTl9fLAorCQkgICAgb2xkX3Rlcm1pb3MtPmNfY2ZsYWcsCisJCSAgICBSRUxFVkFOVF9JRkxBRyhvbGRfdGVybWlvcy0+Y19pZmxhZykpOworCisJZGJnKCIlcyAtIHBvcnQgJWQiLCBfX0ZVTkNUSU9OX18sIHBvcnQtPm51bWJlcik7CisKKwkvKiBjaGFuZ2UgdGhlIHBvcnQgc2V0dGluZ3MgdG8gdGhlIG5ldyBvbmVzIHNwZWNpZmllZCAqLworCWNoYW5nZV9wb3J0X3NldHRpbmdzKG1vczc3MjBfcG9ydCwgb2xkX3Rlcm1pb3MpOworCisJaWYoIXBvcnQtPnJlYWRfdXJiKSB7CisJCWRiZygiJXMiLCJVUkIgS0lMTEVEICEhISEhXG4iKTsKKwkJcmV0dXJuOworCX0KKworCWlmKHBvcnQtPnJlYWRfdXJiLT5zdGF0dXMgIT0gLUVJTlBST0dSRVNTKSB7CisJCXBvcnQtPnJlYWRfdXJiLT5kZXYgPSBzZXJpYWwtPmRldjsKKwkJc3RhdHVzID0gdXNiX3N1Ym1pdF91cmIocG9ydC0+cmVhZF91cmIsIEdGUF9BVE9NSUMpOworCQlpZiAoc3RhdHVzKQorCQkJZGJnKCJ1c2Jfc3VibWl0X3VyYihyZWFkIGJ1bGspIGZhaWxlZCwgc3RhdHVzID0gJWQiLAorCQkJICAgIHN0YXR1cyk7CisJfQorCXJldHVybjsKK30KKworLyoKKyAqIGdldF9sc3JfaW5mbyAtIGdldCBsaW5lIHN0YXR1cyByZWdpc3RlciBpbmZvCisgKgorICogUHVycG9zZTogTGV0IHVzZXIgY2FsbCBpb2N0bCgpIHRvIGdldCBpbmZvIHdoZW4gdGhlIFVBUlQgcGh5c2ljYWxseQorICogCSAgICBpcyBlbXB0aWVkLiAgT24gYnVzIHR5cGVzIGxpa2UgUlM0ODUsIHRoZSB0cmFuc21pdHRlciBtdXN0CisgKiAJICAgIHJlbGVhc2UgdGhlIGJ1cyBhZnRlciB0cmFuc21pdHRpbmcuIFRoaXMgbXVzdCBiZSBkb25lIHdoZW4KKyAqIAkgICAgdGhlIHRyYW5zbWl0IHNoaWZ0IHJlZ2lzdGVyIGlzIGVtcHR5LCBub3QgYmUgZG9uZSB3aGVuIHRoZQorICogCSAgICB0cmFuc21pdCBob2xkaW5nIHJlZ2lzdGVyIGlzIGVtcHR5LiAgVGhpcyBmdW5jdGlvbmFsaXR5CisgKiAJICAgIGFsbG93cyBhbiBSUzQ4NSBkcml2ZXIgdG8gYmUgd3JpdHRlbiBpbiB1c2VyIHNwYWNlLgorICovCitzdGF0aWMgaW50IGdldF9sc3JfaW5mbyhzdHJ1Y3QgbW9zY2hpcF9wb3J0ICptb3M3NzIwX3BvcnQsCisJCQl1bnNpZ25lZCBpbnQgX191c2VyICp2YWx1ZSkKK3sKKwlpbnQgY291bnQ7CisJdW5zaWduZWQgaW50IHJlc3VsdCA9IDA7CisKKwljb3VudCA9IG1vczc3MjBfY2hhcnNfaW5fYnVmZmVyKG1vczc3MjBfcG9ydC0+cG9ydCk7CisJaWYgKGNvdW50ID09IDApIHsKKwkJZGJnKCIlcyAtLSBFbXB0eSIsIF9fRlVOQ1RJT05fXyk7CisJCXJlc3VsdCA9IFRJT0NTRVJfVEVNVDsKKwl9CisKKwlpZiAoY29weV90b191c2VyKHZhbHVlLCAmcmVzdWx0LCBzaXplb2YoaW50KSkpCisJCXJldHVybiAtRUZBVUxUOworCXJldHVybiAwOworfQorCisvKgorICogZ2V0X251bWJlcl9ieXRlc19hdmFpbCAtIGdldCBudW1iZXIgb2YgYnl0ZXMgYXZhaWxhYmxlCisgKgorICogUHVycG9zZTogTGV0IHVzZXIgY2FsbCBpb2N0bCB0byBnZXQgdGhlIGNvdW50IG9mIG51bWJlciBvZiBieXRlcyBhdmFpbGFibGUuCisgKi8KK3N0YXRpYyBpbnQgZ2V0X251bWJlcl9ieXRlc19hdmFpbChzdHJ1Y3QgbW9zY2hpcF9wb3J0ICptb3M3NzIwX3BvcnQsCisJCQkJICB1bnNpZ25lZCBpbnQgX191c2VyICp2YWx1ZSkKK3sKKwl1bnNpZ25lZCBpbnQgcmVzdWx0ID0gMDsKKwlzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5ID0gbW9zNzcyMF9wb3J0LT5wb3J0LT50dHk7CisKKwlpZiAoIXR0eSkKKwkJcmV0dXJuIC1FTk9JT0NUTENNRDsKKworCXJlc3VsdCA9IHR0eS0+cmVhZF9jbnQ7CisKKwlkYmcoIiVzKCVkKSA9ICVkIiwgX19GVU5DVElPTl9fLCAgbW9zNzcyMF9wb3J0LT5wb3J0LT5udW1iZXIsIHJlc3VsdCk7CisJaWYgKGNvcHlfdG9fdXNlcih2YWx1ZSwgJnJlc3VsdCwgc2l6ZW9mKGludCkpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCXJldHVybiAtRU5PSU9DVExDTUQ7Cit9CisKK3N0YXRpYyBpbnQgc2V0X21vZGVtX2luZm8oc3RydWN0IG1vc2NoaXBfcG9ydCAqbW9zNzcyMF9wb3J0LCB1bnNpZ25lZCBpbnQgY21kLAorCQkJICB1bnNpZ25lZCBpbnQgX191c2VyICp2YWx1ZSkKK3sKKwl1bnNpZ25lZCBpbnQgbWNyIDsKKwl1bnNpZ25lZCBpbnQgYXJnOworCXVuc2lnbmVkIGNoYXIgZGF0YTsKKworCXN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQ7CisKKwlpZiAobW9zNzcyMF9wb3J0ID09IE5VTEwpCisJCXJldHVybiAtMTsKKworCXBvcnQgPSAoc3RydWN0IHVzYl9zZXJpYWxfcG9ydCopbW9zNzcyMF9wb3J0LT5wb3J0OworCW1jciA9IG1vczc3MjBfcG9ydC0+c2hhZG93TUNSOworCisJaWYgKGNvcHlfZnJvbV91c2VyKCZhcmcsIHZhbHVlLCBzaXplb2YoaW50KSkpCisJCXJldHVybiAtRUZBVUxUOworCisJc3dpdGNoIChjbWQpIHsKKwljYXNlIFRJT0NNQklTOgorCQlpZiAoYXJnICYgVElPQ01fUlRTKQorCQkJbWNyIHw9IFVBUlRfTUNSX1JUUzsKKwkJaWYgKGFyZyAmIFRJT0NNX0RUUikKKwkJCW1jciB8PSBVQVJUX01DUl9SVFM7CisJCWlmIChhcmcgJiBUSU9DTV9MT09QKQorCQkJbWNyIHw9IFVBUlRfTUNSX0xPT1A7CisJCWJyZWFrOworCisJY2FzZSBUSU9DTUJJQzoKKwkJaWYgKGFyZyAmIFRJT0NNX1JUUykKKwkJCW1jciAmPSB+VUFSVF9NQ1JfUlRTOworCQlpZiAoYXJnICYgVElPQ01fRFRSKQorCQkJbWNyICY9IH5VQVJUX01DUl9SVFM7CisJCWlmIChhcmcgJiBUSU9DTV9MT09QKQorCQkJbWNyICY9IH5VQVJUX01DUl9MT09QOworCQlicmVhazsKKworCWNhc2UgVElPQ01TRVQ6CisJCS8qIHR1cm4gb2ZmIHRoZSBSVFMgYW5kIERUUiBhbmQgTE9PUEJBQ0sKKwkJICogYW5kIHRoZW4gb25seSB0dXJuIG9uIHdoYXQgd2FzIGFza2VkIHRvICovCisJCW1jciAmPSAgfihVQVJUX01DUl9SVFMgfCBVQVJUX01DUl9EVFIgfCBVQVJUX01DUl9MT09QKTsKKwkJbWNyIHw9ICgoYXJnICYgVElPQ01fUlRTKSA/IFVBUlRfTUNSX1JUUyA6IDApOworCQltY3IgfD0gKChhcmcgJiBUSU9DTV9EVFIpID8gVUFSVF9NQ1JfRFRSIDogMCk7CisJCW1jciB8PSAoKGFyZyAmIFRJT0NNX0xPT1ApID8gVUFSVF9NQ1JfTE9PUCA6IDApOworCQlicmVhazsKKwl9CisKKwltb3M3NzIwX3BvcnQtPnNoYWRvd01DUiA9IG1jcjsKKworCWRhdGEgPSBtb3M3NzIwX3BvcnQtPnNoYWRvd01DUjsKKwlzZW5kX21vc19jbWQocG9ydC0+c2VyaWFsLCBNT1NfV1JJVEUsCisJCSAgICAgcG9ydC0+bnVtYmVyIC0gcG9ydC0+c2VyaWFsLT5taW5vciwgVUFSVF9NQ1IsICZkYXRhKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGdldF9tb2RlbV9pbmZvKHN0cnVjdCBtb3NjaGlwX3BvcnQgKm1vczc3MjBfcG9ydCwKKwkJCSAgdW5zaWduZWQgaW50IF9fdXNlciAqdmFsdWUpCit7CisJdW5zaWduZWQgaW50IHJlc3VsdCA9IDA7CisJdW5zaWduZWQgaW50IG1zciA9IG1vczc3MjBfcG9ydC0+c2hhZG93TVNSOworCXVuc2lnbmVkIGludCBtY3IgPSBtb3M3NzIwX3BvcnQtPnNoYWRvd01DUjsKKworCXJlc3VsdCA9ICgobWNyICYgVUFSVF9NQ1JfRFRSKQk/IFRJT0NNX0RUUjogMCkJICAvKiAweDAwMiAqLworCQkgIHwgKChtY3IgJiBVQVJUX01DUl9SVFMpCT8gVElPQ01fUlRTOiAwKSAgIC8qIDB4MDA0ICovCisJCSAgfCAoKG1zciAmIFVBUlRfTVNSX0NUUykJPyBUSU9DTV9DVFM6IDApICAgLyogMHgwMjAgKi8KKwkJICB8ICgobXNyICYgVUFSVF9NU1JfRENEKQk/IFRJT0NNX0NBUjogMCkgICAvKiAweDA0MCAqLworCQkgIHwgKChtc3IgJiBVQVJUX01TUl9SSSkJPyBUSU9DTV9SSTogIDApICAgLyogMHgwODAgKi8KKwkJICB8ICgobXNyICYgVUFSVF9NU1JfRFNSKQk/IFRJT0NNX0RTUjogMCk7ICAvKiAweDEwMCAqLworCisKKwlkYmcoIiVzIC0tICV4IiwgX19GVU5DVElPTl9fLCByZXN1bHQpOworCisJaWYgKGNvcHlfdG9fdXNlcih2YWx1ZSwgJnJlc3VsdCwgc2l6ZW9mKGludCkpKQorCQlyZXR1cm4gLUVGQVVMVDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBnZXRfc2VyaWFsX2luZm8oc3RydWN0IG1vc2NoaXBfcG9ydCAqbW9zNzcyMF9wb3J0LAorCQkJICAgc3RydWN0IHNlcmlhbF9zdHJ1Y3QgX191c2VyICpyZXRpbmZvKQoreworCXN0cnVjdCBzZXJpYWxfc3RydWN0IHRtcDsKKworCWlmICghcmV0aW5mbykKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwltZW1zZXQoJnRtcCwgMCwgc2l6ZW9mKHRtcCkpOworCisJdG1wLnR5cGUJCT0gUE9SVF8xNjU1MEE7CisJdG1wLmxpbmUJCT0gbW9zNzcyMF9wb3J0LT5wb3J0LT5zZXJpYWwtPm1pbm9yOworCXRtcC5wb3J0CQk9IG1vczc3MjBfcG9ydC0+cG9ydC0+bnVtYmVyOworCXRtcC5pcnEJCQk9IDA7CisJdG1wLmZsYWdzCQk9IEFTWU5DX1NLSVBfVEVTVCB8IEFTWU5DX0FVVE9fSVJROworICAgICAgICB0bXAueG1pdF9maWZvX3NpemUJPSBOVU1fVVJCUyAqIFVSQl9UUkFOU0ZFUl9CVUZGRVJfU0laRTsKKwl0bXAuYmF1ZF9iYXNlCQk9IDk2MDA7CisJdG1wLmNsb3NlX2RlbGF5CQk9IDUqSFo7CisJdG1wLmNsb3Npbmdfd2FpdAk9IDMwKkhaOworCisJaWYgKGNvcHlfdG9fdXNlcihyZXRpbmZvLCAmdG1wLCBzaXplb2YoKnJldGluZm8pKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbW9zNzcyMF9pb2N0bChzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0LCBzdHJ1Y3QgZmlsZSAqZmlsZSwKKwkJCSB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlzdHJ1Y3QgbW9zY2hpcF9wb3J0ICptb3M3NzIwX3BvcnQ7CisJc3RydWN0IGFzeW5jX2ljb3VudCBjbm93OworCXN0cnVjdCBhc3luY19pY291bnQgY3ByZXY7CisJc3RydWN0IHNlcmlhbF9pY291bnRlcl9zdHJ1Y3QgaWNvdW50OworCisJbW9zNzcyMF9wb3J0ID0gdXNiX2dldF9zZXJpYWxfcG9ydF9kYXRhKHBvcnQpOworCWlmIChtb3M3NzIwX3BvcnQgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlkYmcoIiVzIC0gcG9ydCAlZCwgY21kID0gMHgleCIsIF9fRlVOQ1RJT05fXywgcG9ydC0+bnVtYmVyLCBjbWQpOworCisJc3dpdGNoIChjbWQpIHsKKwljYXNlIFRJT0NJTlE6CisJCS8qIHJldHVybiBudW1iZXIgb2YgYnl0ZXMgYXZhaWxhYmxlICovCisJCWRiZygiJXMgKCVkKSBUSU9DSU5RIiwgX19GVU5DVElPTl9fLCAgcG9ydC0+bnVtYmVyKTsKKwkJcmV0dXJuIGdldF9udW1iZXJfYnl0ZXNfYXZhaWwobW9zNzcyMF9wb3J0LAorCQkJCQkgICAgICAodW5zaWduZWQgaW50IF9fdXNlciAqKWFyZyk7CisJCWJyZWFrOworCisJY2FzZSBUSU9DU0VSR0VUTFNSOgorCQlkYmcoIiVzICglZCkgVElPQ1NFUkdFVExTUiIsIF9fRlVOQ1RJT05fXywgIHBvcnQtPm51bWJlcik7CisJCXJldHVybiBnZXRfbHNyX2luZm8obW9zNzcyMF9wb3J0LCAodW5zaWduZWQgaW50IF9fdXNlciAqKWFyZyk7CisJCXJldHVybiAwOworCisJY2FzZSBUSU9DTUJJUzoKKwljYXNlIFRJT0NNQklDOgorCWNhc2UgVElPQ01TRVQ6CisJCWRiZygiJXMgKCVkKSBUSU9DTVNFVC9USU9DTUJJQy9USU9DTVNFVCIsIF9fRlVOQ1RJT05fXywKKwkJICAgIHBvcnQtPm51bWJlcik7CisJCXJldHVybiBzZXRfbW9kZW1faW5mbyhtb3M3NzIwX3BvcnQsIGNtZCwKKwkJCQkgICAgICAodW5zaWduZWQgaW50IF9fdXNlciAqKWFyZyk7CisKKwljYXNlIFRJT0NNR0VUOgorCQlkYmcoIiVzICglZCkgVElPQ01HRVQiLCBfX0ZVTkNUSU9OX18sICBwb3J0LT5udW1iZXIpOworCQlyZXR1cm4gZ2V0X21vZGVtX2luZm8obW9zNzcyMF9wb3J0LAorCQkJCSAgICAgICh1bnNpZ25lZCBpbnQgX191c2VyICopYXJnKTsKKworCWNhc2UgVElPQ0dTRVJJQUw6CisJCWRiZygiJXMgKCVkKSBUSU9DR1NFUklBTCIsIF9fRlVOQ1RJT05fXywgIHBvcnQtPm51bWJlcik7CisJCXJldHVybiBnZXRfc2VyaWFsX2luZm8obW9zNzcyMF9wb3J0LAorCQkJCSAgICAgICAoc3RydWN0IHNlcmlhbF9zdHJ1Y3QgX191c2VyICopYXJnKTsKKworCWNhc2UgVElPQ1NTRVJJQUw6CisJCWRiZygiJXMgKCVkKSBUSU9DU1NFUklBTCIsIF9fRlVOQ1RJT05fXywgIHBvcnQtPm51bWJlcik7CisJCWJyZWFrOworCisJY2FzZSBUSU9DTUlXQUlUOgorCQlkYmcoIiVzICglZCkgVElPQ01JV0FJVCIsIF9fRlVOQ1RJT05fXywgIHBvcnQtPm51bWJlcik7CisJCWNwcmV2ID0gbW9zNzcyMF9wb3J0LT5pY291bnQ7CisJCXdoaWxlICgxKSB7CisJCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpCisJCQkJcmV0dXJuIC1FUkVTVEFSVFNZUzsKKwkJCWNub3cgPSBtb3M3NzIwX3BvcnQtPmljb3VudDsKKwkJCWlmIChjbm93LnJuZyA9PSBjcHJldi5ybmcgJiYgY25vdy5kc3IgPT0gY3ByZXYuZHNyICYmCisJCQkgICAgY25vdy5kY2QgPT0gY3ByZXYuZGNkICYmIGNub3cuY3RzID09IGNwcmV2LmN0cykKKwkJCQlyZXR1cm4gLUVJTzsgLyogbm8gY2hhbmdlID0+IGVycm9yICovCisJCQlpZiAoKChhcmcgJiBUSU9DTV9STkcpICYmIChjbm93LnJuZyAhPSBjcHJldi5ybmcpKSB8fAorCQkJICAgICgoYXJnICYgVElPQ01fRFNSKSAmJiAoY25vdy5kc3IgIT0gY3ByZXYuZHNyKSkgfHwKKwkJCSAgICAoKGFyZyAmIFRJT0NNX0NEKSAgJiYgKGNub3cuZGNkICE9IGNwcmV2LmRjZCkpIHx8CisJCQkgICAgKChhcmcgJiBUSU9DTV9DVFMpICYmIChjbm93LmN0cyAhPSBjcHJldi5jdHMpKSApIHsKKwkJCQlyZXR1cm4gMDsKKwkJCX0KKwkJCWNwcmV2ID0gY25vdzsKKwkJfQorCQkvKiBOT1RSRUFDSEVEICovCisJCWJyZWFrOworCisJY2FzZSBUSU9DR0lDT1VOVDoKKwkJY25vdyA9IG1vczc3MjBfcG9ydC0+aWNvdW50OworCQlpY291bnQuY3RzID0gY25vdy5jdHM7CisJCWljb3VudC5kc3IgPSBjbm93LmRzcjsKKwkJaWNvdW50LnJuZyA9IGNub3cucm5nOworCQlpY291bnQuZGNkID0gY25vdy5kY2Q7CisJCWljb3VudC5yeCA9IGNub3cucng7CisJCWljb3VudC50eCA9IGNub3cudHg7CisJCWljb3VudC5mcmFtZSA9IGNub3cuZnJhbWU7CisJCWljb3VudC5vdmVycnVuID0gY25vdy5vdmVycnVuOworCQlpY291bnQucGFyaXR5ID0gY25vdy5wYXJpdHk7CisJCWljb3VudC5icmsgPSBjbm93LmJyazsKKwkJaWNvdW50LmJ1Zl9vdmVycnVuID0gY25vdy5idWZfb3ZlcnJ1bjsKKworCQlkYmcoIiVzICglZCkgVElPQ0dJQ09VTlQgUlg9JWQsIFRYPSVkIiwgX19GVU5DVElPTl9fLAorCQkgICAgcG9ydC0+bnVtYmVyLCBpY291bnQucngsIGljb3VudC50eCApOworCQlpZiAoY29weV90b191c2VyKCh2b2lkIF9fdXNlciAqKWFyZywgJmljb3VudCwgc2l6ZW9mKGljb3VudCkpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCXJldHVybiAwOworCX0KKworCXJldHVybiAtRU5PSU9DVExDTUQ7Cit9CisKK3N0YXRpYyBpbnQgbW9zNzcyMF9zdGFydHVwKHN0cnVjdCB1c2Jfc2VyaWFsICpzZXJpYWwpCit7CisJc3RydWN0IG1vc2NoaXBfc2VyaWFsICptb3M3NzIwX3NlcmlhbDsKKwlzdHJ1Y3QgbW9zY2hpcF9wb3J0ICptb3M3NzIwX3BvcnQ7CisJc3RydWN0IHVzYl9kZXZpY2UgKmRldjsKKwlpbnQgaTsKKwljaGFyIGRhdGE7CisKKwlkYmcoIiVzOiBFbnRlcmluZyAuLi4uLi4uLi4uIiwgX19GVU5DVElPTl9fKTsKKworCWlmICghc2VyaWFsKSB7CisJCWRiZygiSW52YWxpZCBIYW5kbGVyIik7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCWRldiA9IHNlcmlhbC0+ZGV2OworCisJLyogY3JlYXRlIG91ciBwcml2YXRlIHNlcmlhbCBzdHJ1Y3R1cmUgKi8KKwltb3M3NzIwX3NlcmlhbCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBtb3NjaGlwX3NlcmlhbCksIEdGUF9LRVJORUwpOworCWlmIChtb3M3NzIwX3NlcmlhbCA9PSBOVUxMKSB7CisJCWVycigiJXMgLSBPdXQgb2YgbWVtb3J5IiwgX19GVU5DVElPTl9fKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJdXNiX3NldF9zZXJpYWxfZGF0YShzZXJpYWwsIG1vczc3MjBfc2VyaWFsKTsKKworCS8qIHdlIHNldCB1cCB0aGUgcG9pbnRlcnMgdG8gdGhlIGVuZHBvaW50cyBpbiB0aGUgbW9zNzcyMF9vcGVuICoKKwkgKiBmdW5jdGlvbiwgYXMgdGhlIHN0cnVjdHVyZXMgYXJlbid0IGNyZWF0ZWQgeWV0LiAgICAgICAgICAgICAqLworCisJLyogc2V0IHVwIHBvcnQgcHJpdmF0ZSBzdHJ1Y3R1cmVzICovCisJZm9yIChpID0gMDsgaSA8IHNlcmlhbC0+bnVtX3BvcnRzOyArK2kpIHsKKwkJbW9zNzcyMF9wb3J0ID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IG1vc2NoaXBfcG9ydCksIEdGUF9LRVJORUwpOworCQlpZiAobW9zNzcyMF9wb3J0ID09IE5VTEwpIHsKKwkJCWVycigiJXMgLSBPdXQgb2YgbWVtb3J5IiwgX19GVU5DVElPTl9fKTsKKwkJCXVzYl9zZXRfc2VyaWFsX2RhdGEoc2VyaWFsLCBOVUxMKTsKKwkJCWtmcmVlKG1vczc3MjBfc2VyaWFsKTsKKwkJCXJldHVybiAtRU5PTUVNOworCQl9CisKKwkJLyogSW5pdGlhbGl6ZSBhbGwgcG9ydCBpbnRlcnJ1cHQgZW5kIHBvaW50IHRvIHBvcnQgMCBpbnQKKwkJICogZW5kcG9pbnQuICBPdXIgZGV2aWNlIGhhcyBvbmx5IG9uZSBpbnRlcnJ1cHQgZW5kcG9pbnQKKwkJICogY29tbWFuIHRvIGFsbCBwb3J0cyAqLworCQlzZXJpYWwtPnBvcnRbaV0tPmludGVycnVwdF9pbl9lbmRwb2ludEFkZHJlc3MgPSBzZXJpYWwtPnBvcnRbMF0tPmludGVycnVwdF9pbl9lbmRwb2ludEFkZHJlc3M7CisKKwkJbW9zNzcyMF9wb3J0LT5wb3J0ID0gc2VyaWFsLT5wb3J0W2ldOworCQl1c2Jfc2V0X3NlcmlhbF9wb3J0X2RhdGEoc2VyaWFsLT5wb3J0W2ldLCBtb3M3NzIwX3BvcnQpOworCisJCWRiZygicG9ydCBudW1iZXIgaXMgJWQiLCBzZXJpYWwtPnBvcnRbaV0tPm51bWJlcik7CisJCWRiZygic2VyaWFsIG51bWJlciBpcyAlZCIsIHNlcmlhbC0+bWlub3IpOworCX0KKworCisJLyogc2V0dGluZyBjb25maWd1cmF0aW9uIGZlYXR1cmUgdG8gb25lICovCisJdXNiX2NvbnRyb2xfbXNnKHNlcmlhbC0+ZGV2LCB1c2Jfc25kY3RybHBpcGUoc2VyaWFsLT5kZXYsIDApLAorCQkJKF9fdTgpMHgwMywgMHgwMCwweDAxLDB4MDAsIE5VTEwsIDB4MDAsIDUqSFopOworCisJc2VuZF9tb3NfY21kKHNlcmlhbCxNT1NfUkVBRCwweDAwLCBVQVJUX0xTUiwgJmRhdGEpOyAgLy8gTFNSIEZvciBQb3J0IDEKKwlkYmcoIkxTUjoleCIsZGF0YSk7CisKKwlzZW5kX21vc19jbWQoc2VyaWFsLE1PU19SRUFELDB4MDEsIFVBUlRfTFNSLCAmZGF0YSk7ICAvLyBMU1IgRm9yIFBvcnQgMgorCWRiZygiTFNSOiV4IixkYXRhKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBtb3M3NzIwX3NodXRkb3duKHN0cnVjdCB1c2Jfc2VyaWFsICpzZXJpYWwpCit7CisJaW50IGk7CisKKwkvKiBmcmVlIHByaXZhdGUgc3RydWN0dXJlIGFsbG9jYXRlZCBmb3Igc2VyaWFsIHBvcnQgKi8KKwlmb3IgKGk9MDsgaSA8IHNlcmlhbC0+bnVtX3BvcnRzOyArK2kpIHsKKwkJa2ZyZWUodXNiX2dldF9zZXJpYWxfcG9ydF9kYXRhKHNlcmlhbC0+cG9ydFtpXSkpOworCQl1c2Jfc2V0X3NlcmlhbF9wb3J0X2RhdGEoc2VyaWFsLT5wb3J0W2ldLCBOVUxMKTsKKwl9CisKKwkvKiBmcmVlIHByaXZhdGUgc3RydWN0dXJlIGFsbG9jYXRlZCBmb3Igc2VyaWFsIGRldmljZSAqLworCWtmcmVlKHVzYl9nZXRfc2VyaWFsX2RhdGEoc2VyaWFsKSk7CisJdXNiX3NldF9zZXJpYWxfZGF0YShzZXJpYWwsIE5VTEwpOworfQorCitzdGF0aWMgc3RydWN0IHVzYl9zZXJpYWxfZHJpdmVyIG1vc2NoaXA3NzIwXzJwb3J0X2RyaXZlciA9IHsKKwkuZHJpdmVyID0geworCQkub3duZXIgPQlUSElTX01PRFVMRSwKKwkJLm5hbWUgPQkJIm1vc2NoaXA3NzIwIiwKKwl9LAorCS5kZXNjcmlwdGlvbgkJPSAiTW9zY2hpcCAyIHBvcnQgYWRhcHRlciIsCisJLmlkX3RhYmxlCQk9IG1vc2NoaXBfcG9ydF9pZF90YWJsZSwKKwkubnVtX2ludGVycnVwdF9pbgk9IDEsCisJLm51bV9idWxrX2luCQk9IDIsCisJLm51bV9idWxrX291dAkJPSAyLAorCS5udW1fcG9ydHMJCT0gMiwKKwkub3BlbgkJCT0gbW9zNzcyMF9vcGVuLAorCS5jbG9zZQkJCT0gbW9zNzcyMF9jbG9zZSwKKwkudGhyb3R0bGUJCT0gbW9zNzcyMF90aHJvdHRsZSwKKwkudW50aHJvdHRsZQkJPSBtb3M3NzIwX3VudGhyb3R0bGUsCisJLmF0dGFjaAkJCT0gbW9zNzcyMF9zdGFydHVwLAorCS5zaHV0ZG93bgkJPSBtb3M3NzIwX3NodXRkb3duLAorCS5pb2N0bAkJCT0gbW9zNzcyMF9pb2N0bCwKKwkuc2V0X3Rlcm1pb3MJCT0gbW9zNzcyMF9zZXRfdGVybWlvcywKKwkud3JpdGUJCQk9IG1vczc3MjBfd3JpdGUsCisJLndyaXRlX3Jvb20JCT0gbW9zNzcyMF93cml0ZV9yb29tLAorCS5jaGFyc19pbl9idWZmZXIJPSBtb3M3NzIwX2NoYXJzX2luX2J1ZmZlciwKKwkuYnJlYWtfY3RsCQk9IG1vczc3MjBfYnJlYWssCisJLnJlYWRfYnVsa19jYWxsYmFjawk9IG1vczc3MjBfYnVsa19pbl9jYWxsYmFjaywKK307CisKK3N0YXRpYyBzdHJ1Y3QgdXNiX2RyaXZlciB1c2JfZHJpdmVyID0geworCS5uYW1lID0JCSJtb3NjaGlwNzcyMCIsCisJLnByb2JlID0JdXNiX3NlcmlhbF9wcm9iZSwKKwkuZGlzY29ubmVjdCA9CXVzYl9zZXJpYWxfZGlzY29ubmVjdCwKKwkuaWRfdGFibGUgPQltb3NjaGlwX3BvcnRfaWRfdGFibGUsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBtb3NjaGlwNzcyMF9pbml0KHZvaWQpCit7CisJaW50IHJldHZhbDsKKworCWRiZygiJXM6IEVudGVyaW5nIC4uLi4uLi4uLi4iLCBfX0ZVTkNUSU9OX18pOworCisJLyogUmVnaXN0ZXIgd2l0aCB0aGUgdXNiIHNlcmlhbCAqLworCXJldHZhbCA9IHVzYl9zZXJpYWxfcmVnaXN0ZXIoJm1vc2NoaXA3NzIwXzJwb3J0X2RyaXZlcik7CisJaWYgKHJldHZhbCkKKwkJZ290byBmYWlsZWRfcG9ydF9kZXZpY2VfcmVnaXN0ZXI7CisKKwlpbmZvKERSSVZFUl9ERVNDICIgIiBEUklWRVJfVkVSU0lPTik7CisKKwkvKiBSZWdpc3RlciB3aXRoIHRoZSB1c2IgKi8KKwlyZXR2YWwgPSB1c2JfcmVnaXN0ZXIoJnVzYl9kcml2ZXIpOworCWlmIChyZXR2YWwpCisJCWdvdG8gZmFpbGVkX3VzYl9yZWdpc3RlcjsKKworCXJldHVybiAwOworCitmYWlsZWRfdXNiX3JlZ2lzdGVyOgorCXVzYl9zZXJpYWxfZGVyZWdpc3RlcigmbW9zY2hpcDc3MjBfMnBvcnRfZHJpdmVyKTsKKworZmFpbGVkX3BvcnRfZGV2aWNlX3JlZ2lzdGVyOgorCXJldHVybiByZXR2YWw7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBtb3NjaGlwNzcyMF9leGl0KHZvaWQpCit7CisJdXNiX2RlcmVnaXN0ZXIoJnVzYl9kcml2ZXIpOworCXVzYl9zZXJpYWxfZGVyZWdpc3RlcigmbW9zY2hpcDc3MjBfMnBvcnRfZHJpdmVyKTsKK30KKworbW9kdWxlX2luaXQobW9zY2hpcDc3MjBfaW5pdCk7Cittb2R1bGVfZXhpdChtb3NjaGlwNzcyMF9leGl0KTsKKworLyogTW9kdWxlIGluZm9ybWF0aW9uICovCitNT0RVTEVfQVVUSE9SKCBEUklWRVJfQVVUSE9SICk7CitNT0RVTEVfREVTQ1JJUFRJT04oIERSSVZFUl9ERVNDICk7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKK21vZHVsZV9wYXJhbShkZWJ1ZywgYm9vbCwgU19JUlVHTyB8IFNfSVdVU1IpOworTU9EVUxFX1BBUk1fREVTQyhkZWJ1ZywgIkRlYnVnIGVuYWJsZWQgb3Igbm90Iik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9zZXJpYWwvbW9zNzg0MC5jIGIvZHJpdmVycy91c2Ivc2VyaWFsL21vczc4NDAuYwppbmRleCAwMjFiZTM5Li41YjcxOTYyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9zZXJpYWwvbW9zNzg0MC5jCisrKyBiL2RyaXZlcnMvdXNiL3NlcmlhbC9tb3M3ODQwLmMKQEAgLTI0MTMsMTEgKzI0MTMsMTIgQEAKIAl9CiAKIAltb3M3ODQwX3BvcnQgPSBtb3M3ODQwX2dldF9wb3J0X3ByaXZhdGUocG9ydCk7Ci0JdHR5ID0gbW9zNzg0MF9wb3J0LT5wb3J0LT50dHk7CiAKIAlpZiAobW9zNzg0MF9wb3J0ID09IE5VTEwpCiAJCXJldHVybiAtMTsKIAorCXR0eSA9IG1vczc4NDBfcG9ydC0+cG9ydC0+dHR5OworCiAJZGJnKCIlcyAtIHBvcnQgJWQsIGNtZCA9IDB4JXgiLCBfX0ZVTkNUSU9OX18sIHBvcnQtPm51bWJlciwgY21kKTsKIAogCXN3aXRjaCAoY21kKSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9zZXJpYWwvc2llcnJhLmMgYi9kcml2ZXJzL3VzYi9zZXJpYWwvc2llcnJhLmMKaW5kZXggZDI5NjM4ZC4uNGI1MDk3ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2Ivc2VyaWFsL3NpZXJyYS5jCisrKyBiL2RyaXZlcnMvdXNiL3NlcmlhbC9zaWVycmEuYwpAQCAtMSw3NSArMSw3MTMgQEAKIC8qCi0gKiBTaWVycmEgV2lyZWxlc3MgQ0RNQSBXaXJlbGVzcyBTZXJpYWwgVVNCIGRyaXZlcgotICoKLSAqIEN1cnJlbnQgQ29weSBtb2RpZmllZCBieTogS2V2aW4gTGxveWQgPGxpbnV4QHNpZXJyYXdpcmVsZXNzLmNvbT4KLSAqIE9yaWdpbmFsIENvcHlyaWdodCAoQykgMjAwNS0yMDA2IEdyZWcgS3JvYWgtSGFydG1hbiA8Z3JlZ2toQHN1c2UuZGU+Ci0gKgotICoJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICoJbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgotICoJMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqLworICBVU0IgRHJpdmVyIGZvciBTaWVycmEgV2lyZWxlc3MKKworICBDb3B5cmlnaHQgKEMpIDIwMDYgIEtldmluIExsb3lkIDxsaW51eEBzaWVycmF3aXJlbGVzcy5jb20+CisKKyAgSU1QT1JUQU5UIERJU0NMQUlNRVI6IFRoaXMgZHJpdmVyIGlzIG5vdCBjb21tZXJjaWFsbHkgc3VwcG9ydGVkIGJ5CisgIFNpZXJyYSBXaXJlbGVzcy4gVXNlIGF0IHlvdXIgb3duIHJpc2suCisKKyAgVGhpcyBkcml2ZXIgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICBpdCB1bmRlciB0aGUgdGVybXMgb2YgVmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworICBQb3J0aW9ucyBiYXNlZCBvbiB0aGUgb3B0aW9uIGRyaXZlciBieSBNYXR0aGlhcyBVcmxpY2hzIDxzbXVyZkBzbXVyZi5ub3Jpcy5kZT4KKyAgV2hvbSBiYXNlZCBoaXMgb24gdGhlIEtleXNwYW4gZHJpdmVyIGJ5IEh1Z2ggQmxlbWluZ3MgPGh1Z2hAYmxlbWluZ3Mub3JnPgorCisgIEhpc3Rvcnk6CisqLworCisjZGVmaW5lIERSSVZFUl9WRVJTSU9OICJ2LjEuMC41IgorI2RlZmluZSBEUklWRVJfQVVUSE9SICJLZXZpbiBMbG95ZCA8bGludXhAc2llcnJhd2lyZWxlc3MuY29tPiIKKyNkZWZpbmUgRFJJVkVSX0RFU0MgIlVTQiBEcml2ZXIgZm9yIFNpZXJyYSBXaXJlbGVzcyBVU0IgbW9kZW1zIgogCiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2ppZmZpZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgogI2luY2x1ZGUgPGxpbnV4L3R0eS5oPgorI2luY2x1ZGUgPGxpbnV4L3R0eV9mbGlwLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvdXNiLmg+CiAjaW5jbHVkZSA8bGludXgvdXNiL3NlcmlhbC5oPgogCisKIHN0YXRpYyBzdHJ1Y3QgdXNiX2RldmljZV9pZCBpZF90YWJsZSBbXSA9IHsKIAl7IFVTQl9ERVZJQ0UoMHgxMTk5LCAweDAwMTgpIH0sCS8qIFNpZXJyYSBXaXJlbGVzcyBNQzU3MjAgKi8KIAl7IFVTQl9ERVZJQ0UoMHgxMTk5LCAweDAwMjApIH0sCS8qIFNpZXJyYSBXaXJlbGVzcyBNQzU3MjUgKi8KIAl7IFVTQl9ERVZJQ0UoMHgxMTk5LCAweDAwMTcpIH0sCS8qIFNpZXJyYSBXaXJlbGVzcyBFTTU2MjUgKi8KIAl7IFVTQl9ERVZJQ0UoMHgxMTk5LCAweDAwMTkpIH0sCS8qIFNpZXJyYSBXaXJlbGVzcyBBaXJDYXJkIDU5NSAqLworCXsgVVNCX0RFVklDRSgweDExOTksIDB4MDIxOCkgfSwJLyogU2llcnJhIFdpcmVsZXNzIE1DNTcyMCAqLwogCXsgVVNCX0RFVklDRSgweDExOTksIDB4NjgwMikgfSwJLyogU2llcnJhIFdpcmVsZXNzIE1DODc1NSAqLwogCXsgVVNCX0RFVklDRSgweDExOTksIDB4NjgwMykgfSwJLyogU2llcnJhIFdpcmVsZXNzIE1DODc2NSAqLworCXsgVVNCX0RFVklDRSgweDExOTksIDB4NjgwNCkgfSwJLyogU2llcnJhIFdpcmVsZXNzIE1DODc1NSBmb3IgRXVyb3BlICovCiAJeyBVU0JfREVWSUNFKDB4MTE5OSwgMHg2ODEyKSB9LAkvKiBTaWVycmEgV2lyZWxlc3MgTUM4Nzc1ICovCiAJeyBVU0JfREVWSUNFKDB4MTE5OSwgMHg2ODIwKSB9LAkvKiBTaWVycmEgV2lyZWxlc3MgQWlyQ2FyZCA4NzUgKi8KLQkvKiBGb2xsb3dpbmcgZGV2aWNlcyBhcmUgc3VwcG9ydGVkIGluIHRoZSBhaXJwcmltZS5jIGRyaXZlciAqLwotCS8qIHsgVVNCX0RFVklDRSgweDExOTksIDB4MDExMikgfSwgKi8JLyogU2llcnJhIFdpcmVsZXNzIEFpckNhcmQgNTgwICovCi0JLyogeyBVU0JfREVWSUNFKDB4MEYzRCwgMHgwMTEyKSB9LCAqLwkvKiBBaXJQcmltZS9TaWVycmEgUEMgNTIyMCAqLworCisJeyBVU0JfREVWSUNFKDB4MTE5OSwgMHgwMTEyKSB9LCAvKiBTaWVycmEgV2lyZWxlc3MgQWlyQ2FyZCA1ODAgKi8KKwl7IFVTQl9ERVZJQ0UoMHgwRjNELCAweDAxMTIpIH0sIC8qIEFpclByaW1lL1NpZXJyYSBQQyA1MjIwICovCiAJeyB9CiB9OwogTU9EVUxFX0RFVklDRV9UQUJMRSh1c2IsIGlkX3RhYmxlKTsKIAorc3RhdGljIHN0cnVjdCB1c2JfZGV2aWNlX2lkIGlkX3RhYmxlXzFwb3J0IFtdID0geworCXsgVVNCX0RFVklDRSgweDExOTksIDB4MDExMikgfSwgLyogU2llcnJhIFdpcmVsZXNzIEFpckNhcmQgNTgwICovCisJeyBVU0JfREVWSUNFKDB4MEYzRCwgMHgwMTEyKSB9LCAvKiBBaXJQcmltZS9TaWVycmEgUEMgNTIyMCAqLworCXsgfQorfTsKKworc3RhdGljIHN0cnVjdCB1c2JfZGV2aWNlX2lkIGlkX3RhYmxlXzNwb3J0IFtdID0geworCXsgVVNCX0RFVklDRSgweDExOTksIDB4MDAxOCkgfSwJLyogU2llcnJhIFdpcmVsZXNzIE1DNTcyMCAqLworCXsgVVNCX0RFVklDRSgweDExOTksIDB4MDAyMCkgfSwJLyogU2llcnJhIFdpcmVsZXNzIE1DNTcyNSAqLworCXsgVVNCX0RFVklDRSgweDExOTksIDB4MDAxNykgfSwJLyogU2llcnJhIFdpcmVsZXNzIEVNNTYyNSAqLworCXsgVVNCX0RFVklDRSgweDExOTksIDB4MDAxOSkgfSwJLyogU2llcnJhIFdpcmVsZXNzIEFpckNhcmQgNTk1ICovCisJeyBVU0JfREVWSUNFKDB4MTE5OSwgMHgwMjE4KSB9LAkvKiBTaWVycmEgV2lyZWxlc3MgTUM1NzIwICovCisJeyBVU0JfREVWSUNFKDB4MTE5OSwgMHg2ODAyKSB9LAkvKiBTaWVycmEgV2lyZWxlc3MgTUM4NzU1ICovCisJeyBVU0JfREVWSUNFKDB4MTE5OSwgMHg2ODAzKSB9LAkvKiBTaWVycmEgV2lyZWxlc3MgTUM4NzY1ICovCisJeyBVU0JfREVWSUNFKDB4MTE5OSwgMHg2ODA0KSB9LAkvKiBTaWVycmEgV2lyZWxlc3MgTUM4NzU1IGZvciBFdXJvcGUgKi8KKwl7IFVTQl9ERVZJQ0UoMHgxMTk5LCAweDY4MTIpIH0sCS8qIFNpZXJyYSBXaXJlbGVzcyBNQzg3NzUgKi8KKwl7IFVTQl9ERVZJQ0UoMHgxMTk5LCAweDY4MjApIH0sCS8qIFNpZXJyYSBXaXJlbGVzcyBBaXJDYXJkIDg3NSAqLworCXsgfQorfTsKKwogc3RhdGljIHN0cnVjdCB1c2JfZHJpdmVyIHNpZXJyYV9kcml2ZXIgPSB7Ci0JLm5hbWUgPQkJInNpZXJyYV93aXJlbGVzcyIsCi0JLnByb2JlID0JdXNiX3NlcmlhbF9wcm9iZSwKLQkuZGlzY29ubmVjdCA9CXVzYl9zZXJpYWxfZGlzY29ubmVjdCwKLQkuaWRfdGFibGUgPQlpZF90YWJsZSwKKwkubmFtZSAgICAgICA9ICJzaWVycmEiLAorCS5wcm9iZSAgICAgID0gdXNiX3NlcmlhbF9wcm9iZSwKKwkuZGlzY29ubmVjdCA9IHVzYl9zZXJpYWxfZGlzY29ubmVjdCwKKwkuaWRfdGFibGUgICA9IGlkX3RhYmxlLAorCS5ub19keW5hbWljX2lkID0gCTEsCiB9OwogCi1zdGF0aWMgc3RydWN0IHVzYl9zZXJpYWxfZHJpdmVyIHNpZXJyYV9kZXZpY2UgPSB7CisKK3N0YXRpYyBpbnQgZGVidWc7CisKKy8qIHBlciBwb3J0IHByaXZhdGUgZGF0YSAqLworI2RlZmluZSBOX0lOX1VSQgk0CisjZGVmaW5lIE5fT1VUX1VSQgkxCisjZGVmaW5lIElOX0JVRkxFTgk0MDk2CisjZGVmaW5lIE9VVF9CVUZMRU4JMTI4CisKK3N0cnVjdCBzaWVycmFfcG9ydF9wcml2YXRlIHsKKwkvKiBJbnB1dCBlbmRwb2ludHMgYW5kIGJ1ZmZlciBmb3IgdGhpcyBwb3J0ICovCisJc3RydWN0IHVyYiAqaW5fdXJic1tOX0lOX1VSQl07CisJY2hhciBpbl9idWZmZXJbTl9JTl9VUkJdW0lOX0JVRkxFTl07CisJLyogT3V0cHV0IGVuZHBvaW50cyBhbmQgYnVmZmVyIGZvciB0aGlzIHBvcnQgKi8KKwlzdHJ1Y3QgdXJiICpvdXRfdXJic1tOX09VVF9VUkJdOworCWNoYXIgb3V0X2J1ZmZlcltOX09VVF9VUkJdW09VVF9CVUZMRU5dOworCisJLyogU2V0dGluZ3MgZm9yIHRoZSBwb3J0ICovCisJaW50IHJ0c19zdGF0ZTsJLyogSGFuZHNoYWtpbmcgcGlucyAob3V0cHV0cykgKi8KKwlpbnQgZHRyX3N0YXRlOworCWludCBjdHNfc3RhdGU7CS8qIEhhbmRzaGFraW5nIHBpbnMgKGlucHV0cykgKi8KKwlpbnQgZHNyX3N0YXRlOworCWludCBkY2Rfc3RhdGU7CisJaW50IHJpX3N0YXRlOworCisJdW5zaWduZWQgbG9uZyB0eF9zdGFydF90aW1lW05fT1VUX1VSQl07Cit9OworCitzdGF0aWMgaW50IHNpZXJyYV9zZW5kX3NldHVwKHN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQpCit7CisJc3RydWN0IHVzYl9zZXJpYWwgKnNlcmlhbCA9IHBvcnQtPnNlcmlhbDsKKwlzdHJ1Y3Qgc2llcnJhX3BvcnRfcHJpdmF0ZSAqcG9ydGRhdGE7CisKKwlkYmcoIiVzIiwgX19GVU5DVElPTl9fKTsKKworCXBvcnRkYXRhID0gdXNiX2dldF9zZXJpYWxfcG9ydF9kYXRhKHBvcnQpOworCisJaWYgKHBvcnQtPnR0eSkgeworCQlpbnQgdmFsID0gMDsKKwkJaWYgKHBvcnRkYXRhLT5kdHJfc3RhdGUpCisJCQl2YWwgfD0gMHgwMTsKKwkJaWYgKHBvcnRkYXRhLT5ydHNfc3RhdGUpCisJCQl2YWwgfD0gMHgwMjsKKworCQlyZXR1cm4gdXNiX2NvbnRyb2xfbXNnKHNlcmlhbC0+ZGV2LAorCQkJCXVzYl9yY3ZjdHJscGlwZShzZXJpYWwtPmRldiwgMCksCisJCQkJMHgyMiwweDIxLHZhbCwwLE5VTEwsMCxVU0JfQ1RSTF9TRVRfVElNRU9VVCk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHNpZXJyYV9yeF90aHJvdHRsZShzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0KQoreworCWRiZygiJXMiLCBfX0ZVTkNUSU9OX18pOworfQorCitzdGF0aWMgdm9pZCBzaWVycmFfcnhfdW50aHJvdHRsZShzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0KQoreworCWRiZygiJXMiLCBfX0ZVTkNUSU9OX18pOworfQorCitzdGF0aWMgdm9pZCBzaWVycmFfYnJlYWtfY3RsKHN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQsIGludCBicmVha19zdGF0ZSkKK3sKKwkvKiBVbmZvcnR1bmF0ZWx5LCBJIGRvbid0IGtub3cgaG93IHRvIHNlbmQgYSBicmVhayAqLworCWRiZygiJXMiLCBfX0ZVTkNUSU9OX18pOworfQorCitzdGF0aWMgdm9pZCBzaWVycmFfc2V0X3Rlcm1pb3Moc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCwKKwkJCXN0cnVjdCB0ZXJtaW9zICpvbGRfdGVybWlvcykKK3sKKwlkYmcoIiVzIiwgX19GVU5DVElPTl9fKTsKKworCXNpZXJyYV9zZW5kX3NldHVwKHBvcnQpOworfQorCitzdGF0aWMgaW50IHNpZXJyYV90aW9jbWdldChzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0LCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwl1bnNpZ25lZCBpbnQgdmFsdWU7CisJc3RydWN0IHNpZXJyYV9wb3J0X3ByaXZhdGUgKnBvcnRkYXRhOworCisJcG9ydGRhdGEgPSB1c2JfZ2V0X3NlcmlhbF9wb3J0X2RhdGEocG9ydCk7CisKKwl2YWx1ZSA9ICgocG9ydGRhdGEtPnJ0c19zdGF0ZSkgPyBUSU9DTV9SVFMgOiAwKSB8CisJCSgocG9ydGRhdGEtPmR0cl9zdGF0ZSkgPyBUSU9DTV9EVFIgOiAwKSB8CisJCSgocG9ydGRhdGEtPmN0c19zdGF0ZSkgPyBUSU9DTV9DVFMgOiAwKSB8CisJCSgocG9ydGRhdGEtPmRzcl9zdGF0ZSkgPyBUSU9DTV9EU1IgOiAwKSB8CisJCSgocG9ydGRhdGEtPmRjZF9zdGF0ZSkgPyBUSU9DTV9DQVIgOiAwKSB8CisJCSgocG9ydGRhdGEtPnJpX3N0YXRlKSA/IFRJT0NNX1JORyA6IDApOworCisJcmV0dXJuIHZhbHVlOworfQorCitzdGF0aWMgaW50IHNpZXJyYV90aW9jbXNldChzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0LCBzdHJ1Y3QgZmlsZSAqZmlsZSwKKwkJCXVuc2lnbmVkIGludCBzZXQsIHVuc2lnbmVkIGludCBjbGVhcikKK3sKKwlzdHJ1Y3Qgc2llcnJhX3BvcnRfcHJpdmF0ZSAqcG9ydGRhdGE7CisKKwlwb3J0ZGF0YSA9IHVzYl9nZXRfc2VyaWFsX3BvcnRfZGF0YShwb3J0KTsKKworCWlmIChzZXQgJiBUSU9DTV9SVFMpCisJCXBvcnRkYXRhLT5ydHNfc3RhdGUgPSAxOworCWlmIChzZXQgJiBUSU9DTV9EVFIpCisJCXBvcnRkYXRhLT5kdHJfc3RhdGUgPSAxOworCisJaWYgKGNsZWFyICYgVElPQ01fUlRTKQorCQlwb3J0ZGF0YS0+cnRzX3N0YXRlID0gMDsKKwlpZiAoY2xlYXIgJiBUSU9DTV9EVFIpCisJCXBvcnRkYXRhLT5kdHJfc3RhdGUgPSAwOworCXJldHVybiBzaWVycmFfc2VuZF9zZXR1cChwb3J0KTsKK30KKworc3RhdGljIGludCBzaWVycmFfaW9jdGwoc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCwgc3RydWN0IGZpbGUgKmZpbGUsCisJCQl1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlyZXR1cm4gLUVOT0lPQ1RMQ01EOworfQorCisvKiBXcml0ZSAqLworc3RhdGljIGludCBzaWVycmFfd3JpdGUoc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCwKKwkJCWNvbnN0IHVuc2lnbmVkIGNoYXIgKmJ1ZiwgaW50IGNvdW50KQoreworCXN0cnVjdCBzaWVycmFfcG9ydF9wcml2YXRlICpwb3J0ZGF0YTsKKwlpbnQgaTsKKwlpbnQgbGVmdCwgdG9kbzsKKwlzdHJ1Y3QgdXJiICp0aGlzX3VyYiA9IE5VTEw7IC8qIHNwdXJpb3VzICovCisJaW50IGVycjsKKworCXBvcnRkYXRhID0gdXNiX2dldF9zZXJpYWxfcG9ydF9kYXRhKHBvcnQpOworCisJZGJnKCIlczogd3JpdGUgKCVkIGNoYXJzKSIsIF9fRlVOQ1RJT05fXywgY291bnQpOworCisJaSA9IDA7CisJbGVmdCA9IGNvdW50OworCWZvciAoaT0wOyBsZWZ0ID4gMCAmJiBpIDwgTl9PVVRfVVJCOyBpKyspIHsKKwkJdG9kbyA9IGxlZnQ7CisJCWlmICh0b2RvID4gT1VUX0JVRkxFTikKKwkJCXRvZG8gPSBPVVRfQlVGTEVOOworCisJCXRoaXNfdXJiID0gcG9ydGRhdGEtPm91dF91cmJzW2ldOworCQlpZiAodGhpc191cmItPnN0YXR1cyA9PSAtRUlOUFJPR1JFU1MpIHsKKwkJCWlmICh0aW1lX2JlZm9yZShqaWZmaWVzLAorCQkJCQlwb3J0ZGF0YS0+dHhfc3RhcnRfdGltZVtpXSArIDEwICogSFopKQorCQkJCWNvbnRpbnVlOworCQkJdXNiX3VubGlua191cmIodGhpc191cmIpOworCQkJY29udGludWU7CisJCX0KKwkJaWYgKHRoaXNfdXJiLT5zdGF0dXMgIT0gMCkKKwkJCWRiZygidXNiX3dyaXRlICVwIGZhaWxlZCAoZXJyPSVkKSIsCisJCQkJdGhpc191cmIsIHRoaXNfdXJiLT5zdGF0dXMpOworCisJCWRiZygiJXM6IGVuZHBvaW50ICVkIGJ1ZiAlZCIsIF9fRlVOQ1RJT05fXywKKwkJCXVzYl9waXBlZW5kcG9pbnQodGhpc191cmItPnBpcGUpLCBpKTsKKworCQkvKiBzZW5kIHRoZSBkYXRhICovCisJCW1lbWNweSAodGhpc191cmItPnRyYW5zZmVyX2J1ZmZlciwgYnVmLCB0b2RvKTsKKwkJdGhpc191cmItPnRyYW5zZmVyX2J1ZmZlcl9sZW5ndGggPSB0b2RvOworCisJCXRoaXNfdXJiLT5kZXYgPSBwb3J0LT5zZXJpYWwtPmRldjsKKwkJZXJyID0gdXNiX3N1Ym1pdF91cmIodGhpc191cmIsIEdGUF9BVE9NSUMpOworCQlpZiAoZXJyKSB7CisJCQlkYmcoInVzYl9zdWJtaXRfdXJiICVwICh3cml0ZSBidWxrKSBmYWlsZWQgIgorCQkJCSIoJWQsIGhhcyAlZCkiLCB0aGlzX3VyYiwKKwkJCQllcnIsIHRoaXNfdXJiLT5zdGF0dXMpOworCQkJY29udGludWU7CisJCX0KKwkJcG9ydGRhdGEtPnR4X3N0YXJ0X3RpbWVbaV0gPSBqaWZmaWVzOworCQlidWYgKz0gdG9kbzsKKwkJbGVmdCAtPSB0b2RvOworCX0KKworCWNvdW50IC09IGxlZnQ7CisJZGJnKCIlczogd3JvdGUgKGRpZCAlZCkiLCBfX0ZVTkNUSU9OX18sIGNvdW50KTsKKwlyZXR1cm4gY291bnQ7Cit9CisKK3N0YXRpYyB2b2lkIHNpZXJyYV9pbmRhdF9jYWxsYmFjayhzdHJ1Y3QgdXJiICp1cmIpCit7CisJaW50IGVycjsKKwlpbnQgZW5kcG9pbnQ7CisJc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydDsKKwlzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5OworCXVuc2lnbmVkIGNoYXIgKmRhdGEgPSB1cmItPnRyYW5zZmVyX2J1ZmZlcjsKKworCWRiZygiJXM6ICVwIiwgX19GVU5DVElPTl9fLCB1cmIpOworCisJZW5kcG9pbnQgPSB1c2JfcGlwZWVuZHBvaW50KHVyYi0+cGlwZSk7CisJcG9ydCA9IChzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICopIHVyYi0+Y29udGV4dDsKKworCWlmICh1cmItPnN0YXR1cykgeworCQlkYmcoIiVzOiBub256ZXJvIHN0YXR1czogJWQgb24gZW5kcG9pbnQgJTAyeC4iLAorCQkgICAgX19GVU5DVElPTl9fLCB1cmItPnN0YXR1cywgZW5kcG9pbnQpOworCX0gZWxzZSB7CisJCXR0eSA9IHBvcnQtPnR0eTsKKwkJaWYgKHVyYi0+YWN0dWFsX2xlbmd0aCkgeworCQkJdHR5X2J1ZmZlcl9yZXF1ZXN0X3Jvb20odHR5LCB1cmItPmFjdHVhbF9sZW5ndGgpOworCQkJdHR5X2luc2VydF9mbGlwX3N0cmluZyh0dHksIGRhdGEsIHVyYi0+YWN0dWFsX2xlbmd0aCk7CisJCQl0dHlfZmxpcF9idWZmZXJfcHVzaCh0dHkpOworCQl9IGVsc2UgeworCQkJZGJnKCIlczogZW1wdHkgcmVhZCB1cmIgcmVjZWl2ZWQiLCBfX0ZVTkNUSU9OX18pOworCQl9CisKKwkJLyogUmVzdWJtaXQgdXJiIHNvIHdlIGNvbnRpbnVlIHJlY2VpdmluZyAqLworCQlpZiAocG9ydC0+b3Blbl9jb3VudCAmJiB1cmItPnN0YXR1cyAhPSAtRVNIVVRET1dOKSB7CisJCQllcnIgPSB1c2Jfc3VibWl0X3VyYih1cmIsIEdGUF9BVE9NSUMpOworCQkJaWYgKGVycikKKwkJCQlwcmludGsoS0VSTl9FUlIgIiVzOiByZXN1Ym1pdCByZWFkIHVyYiBmYWlsZWQuICIKKwkJCQkJIiglZCkiLCBfX0ZVTkNUSU9OX18sIGVycik7CisJCX0KKwl9CisJcmV0dXJuOworfQorCitzdGF0aWMgdm9pZCBzaWVycmFfb3V0ZGF0X2NhbGxiYWNrKHN0cnVjdCB1cmIgKnVyYikKK3sKKwlzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0OworCisJZGJnKCIlcyIsIF9fRlVOQ1RJT05fXyk7CisKKwlwb3J0ID0gKHN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKikgdXJiLT5jb250ZXh0OworCisJdXNiX3NlcmlhbF9wb3J0X3NvZnRpbnQocG9ydCk7Cit9CisKK3N0YXRpYyB2b2lkIHNpZXJyYV9pbnN0YXRfY2FsbGJhY2soc3RydWN0IHVyYiAqdXJiKQoreworCWludCBlcnI7CisJc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCA9IChzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICopIHVyYi0+Y29udGV4dDsKKwlzdHJ1Y3Qgc2llcnJhX3BvcnRfcHJpdmF0ZSAqcG9ydGRhdGEgPSB1c2JfZ2V0X3NlcmlhbF9wb3J0X2RhdGEocG9ydCk7CisJc3RydWN0IHVzYl9zZXJpYWwgKnNlcmlhbCA9IHBvcnQtPnNlcmlhbDsKKworCWRiZygiJXMiLCBfX0ZVTkNUSU9OX18pOworCWRiZygiJXM6IHVyYiAlcCBwb3J0ICVwIGhhcyBkYXRhICVwIiwgX19GVU5DVElPTl9fLHVyYixwb3J0LHBvcnRkYXRhKTsKKworCWlmICh1cmItPnN0YXR1cyA9PSAwKSB7CisJCXN0cnVjdCB1c2JfY3RybHJlcXVlc3QgKnJlcV9wa3QgPQorCQkJCShzdHJ1Y3QgdXNiX2N0cmxyZXF1ZXN0ICopdXJiLT50cmFuc2Zlcl9idWZmZXI7CisKKwkJaWYgKCFyZXFfcGt0KSB7CisJCQlkYmcoIiVzOiBOVUxMIHJlcV9wa3RcbiIsIF9fRlVOQ1RJT05fXyk7CisJCQlyZXR1cm47CisJCX0KKwkJaWYgKChyZXFfcGt0LT5iUmVxdWVzdFR5cGUgPT0gMHhBMSkgJiYKKwkJCQkocmVxX3BrdC0+YlJlcXVlc3QgPT0gMHgyMCkpIHsKKwkJCWludCBvbGRfZGNkX3N0YXRlOworCQkJdW5zaWduZWQgY2hhciBzaWduYWxzID0gKigodW5zaWduZWQgY2hhciAqKQorCQkJCQl1cmItPnRyYW5zZmVyX2J1ZmZlciArCisJCQkJCXNpemVvZihzdHJ1Y3QgdXNiX2N0cmxyZXF1ZXN0KSk7CisKKwkJCWRiZygiJXM6IHNpZ25hbCB4JXgiLCBfX0ZVTkNUSU9OX18sIHNpZ25hbHMpOworCisJCQlvbGRfZGNkX3N0YXRlID0gcG9ydGRhdGEtPmRjZF9zdGF0ZTsKKwkJCXBvcnRkYXRhLT5jdHNfc3RhdGUgPSAxOworCQkJcG9ydGRhdGEtPmRjZF9zdGF0ZSA9ICgoc2lnbmFscyAmIDB4MDEpID8gMSA6IDApOworCQkJcG9ydGRhdGEtPmRzcl9zdGF0ZSA9ICgoc2lnbmFscyAmIDB4MDIpID8gMSA6IDApOworCQkJcG9ydGRhdGEtPnJpX3N0YXRlID0gKChzaWduYWxzICYgMHgwOCkgPyAxIDogMCk7CisKKwkJCWlmIChwb3J0LT50dHkgJiYgIUNfQ0xPQ0FMKHBvcnQtPnR0eSkgJiYKKwkJCQkJb2xkX2RjZF9zdGF0ZSAmJiAhcG9ydGRhdGEtPmRjZF9zdGF0ZSkKKwkJCQl0dHlfaGFuZ3VwKHBvcnQtPnR0eSk7CisJCX0gZWxzZSB7CisJCQlkYmcoIiVzOiB0eXBlICV4IHJlcSAleCIsIF9fRlVOQ1RJT05fXywKKwkJCQlyZXFfcGt0LT5iUmVxdWVzdFR5cGUscmVxX3BrdC0+YlJlcXVlc3QpOworCQl9CisJfSBlbHNlCisJCWRiZygiJXM6IGVycm9yICVkIiwgX19GVU5DVElPTl9fLCB1cmItPnN0YXR1cyk7CisKKwkvKiBSZXN1Ym1pdCB1cmIgc28gd2UgY29udGludWUgcmVjZWl2aW5nIElSUSBkYXRhICovCisJaWYgKHVyYi0+c3RhdHVzICE9IC1FU0hVVERPV04pIHsKKwkJdXJiLT5kZXYgPSBzZXJpYWwtPmRldjsKKwkJZXJyID0gdXNiX3N1Ym1pdF91cmIodXJiLCBHRlBfQVRPTUlDKTsKKwkJaWYgKGVycikKKwkJCWRiZygiJXM6IHJlc3VibWl0IGludHIgdXJiIGZhaWxlZC4gKCVkKSIsCisJCQkJX19GVU5DVElPTl9fLCBlcnIpOworCX0KK30KKworc3RhdGljIGludCBzaWVycmFfd3JpdGVfcm9vbShzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0KQoreworCXN0cnVjdCBzaWVycmFfcG9ydF9wcml2YXRlICpwb3J0ZGF0YTsKKwlpbnQgaTsKKwlpbnQgZGF0YV9sZW4gPSAwOworCXN0cnVjdCB1cmIgKnRoaXNfdXJiOworCisJcG9ydGRhdGEgPSB1c2JfZ2V0X3NlcmlhbF9wb3J0X2RhdGEocG9ydCk7CisKKwlmb3IgKGk9MDsgaSA8IE5fT1VUX1VSQjsgaSsrKSB7CisJCXRoaXNfdXJiID0gcG9ydGRhdGEtPm91dF91cmJzW2ldOworCQlpZiAodGhpc191cmIgJiYgdGhpc191cmItPnN0YXR1cyAhPSAtRUlOUFJPR1JFU1MpCisJCQlkYXRhX2xlbiArPSBPVVRfQlVGTEVOOworCX0KKworCWRiZygiJXM6ICVkIiwgX19GVU5DVElPTl9fLCBkYXRhX2xlbik7CisJcmV0dXJuIGRhdGFfbGVuOworfQorCitzdGF0aWMgaW50IHNpZXJyYV9jaGFyc19pbl9idWZmZXIoc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCkKK3sKKwlzdHJ1Y3Qgc2llcnJhX3BvcnRfcHJpdmF0ZSAqcG9ydGRhdGE7CisJaW50IGk7CisJaW50IGRhdGFfbGVuID0gMDsKKwlzdHJ1Y3QgdXJiICp0aGlzX3VyYjsKKworCXBvcnRkYXRhID0gdXNiX2dldF9zZXJpYWxfcG9ydF9kYXRhKHBvcnQpOworCisJZm9yIChpPTA7IGkgPCBOX09VVF9VUkI7IGkrKykgeworCQl0aGlzX3VyYiA9IHBvcnRkYXRhLT5vdXRfdXJic1tpXTsKKwkJaWYgKHRoaXNfdXJiICYmIHRoaXNfdXJiLT5zdGF0dXMgPT0gLUVJTlBST0dSRVNTKQorCQkJZGF0YV9sZW4gKz0gdGhpc191cmItPnRyYW5zZmVyX2J1ZmZlcl9sZW5ndGg7CisJfQorCWRiZygiJXM6ICVkIiwgX19GVU5DVElPTl9fLCBkYXRhX2xlbik7CisJcmV0dXJuIGRhdGFfbGVuOworfQorCitzdGF0aWMgaW50IHNpZXJyYV9vcGVuKHN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQsIHN0cnVjdCBmaWxlICpmaWxwKQoreworCXN0cnVjdCBzaWVycmFfcG9ydF9wcml2YXRlICpwb3J0ZGF0YTsKKwlzdHJ1Y3QgdXNiX3NlcmlhbCAqc2VyaWFsID0gcG9ydC0+c2VyaWFsOworCWludCBpLCBlcnI7CisJc3RydWN0IHVyYiAqdXJiOworCisJcG9ydGRhdGEgPSB1c2JfZ2V0X3NlcmlhbF9wb3J0X2RhdGEocG9ydCk7CisKKwlkYmcoIiVzIiwgX19GVU5DVElPTl9fKTsKKworCS8qIFNldCBzb21lIHNhbmUgZGVmYXVsdHMgKi8KKwlwb3J0ZGF0YS0+cnRzX3N0YXRlID0gMTsKKwlwb3J0ZGF0YS0+ZHRyX3N0YXRlID0gMTsKKworCS8qIFJlc2V0IGxvdyBsZXZlbCBkYXRhIHRvZ2dsZSBhbmQgc3RhcnQgcmVhZGluZyBmcm9tIGVuZHBvaW50cyAqLworCWZvciAoaSA9IDA7IGkgPCBOX0lOX1VSQjsgaSsrKSB7CisJCXVyYiA9IHBvcnRkYXRhLT5pbl91cmJzW2ldOworCQlpZiAoISB1cmIpCisJCQljb250aW51ZTsKKwkJaWYgKHVyYi0+ZGV2ICE9IHNlcmlhbC0+ZGV2KSB7CisJCQlkYmcoIiVzOiBkZXYgJXAgIT0gJXAiLCBfX0ZVTkNUSU9OX18sCisJCQkJdXJiLT5kZXYsIHNlcmlhbC0+ZGV2KTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJLyoKKwkJICogbWFrZSBzdXJlIGVuZHBvaW50IGRhdGEgdG9nZ2xlIGlzIHN5bmNocm9uaXplZCB3aXRoIHRoZQorCQkgKiBkZXZpY2UKKwkJICovCisJCXVzYl9jbGVhcl9oYWx0KHVyYi0+ZGV2LCB1cmItPnBpcGUpOworCisJCWVyciA9IHVzYl9zdWJtaXRfdXJiKHVyYiwgR0ZQX0tFUk5FTCk7CisJCWlmIChlcnIpIHsKKwkJCWRiZygiJXM6IHN1Ym1pdCB1cmIgJWQgZmFpbGVkICglZCkgJWQiLAorCQkJCV9fRlVOQ1RJT05fXywgaSwgZXJyLAorCQkJCXVyYi0+dHJhbnNmZXJfYnVmZmVyX2xlbmd0aCk7CisJCX0KKwl9CisKKwkvKiBSZXNldCBsb3cgbGV2ZWwgZGF0YSB0b2dnbGUgb24gb3V0IGVuZHBvaW50cyAqLworCWZvciAoaSA9IDA7IGkgPCBOX09VVF9VUkI7IGkrKykgeworCQl1cmIgPSBwb3J0ZGF0YS0+b3V0X3VyYnNbaV07CisJCWlmICghIHVyYikKKwkJCWNvbnRpbnVlOworCQl1cmItPmRldiA9IHNlcmlhbC0+ZGV2OworCQkvKiB1c2Jfc2V0dG9nZ2xlKHVyYi0+ZGV2LCB1c2JfcGlwZWVuZHBvaW50KHVyYi0+cGlwZSksCisJCQkJdXNiX3BpcGVvdXQodXJiLT5waXBlKSwgMCk7ICovCisJfQorCisJcG9ydC0+dHR5LT5sb3dfbGF0ZW5jeSA9IDE7CisKKwlzaWVycmFfc2VuZF9zZXR1cChwb3J0KTsKKworCXJldHVybiAoMCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBzdG9wX3VyYihzdHJ1Y3QgdXJiICp1cmIpCit7CisJaWYgKHVyYiAmJiB1cmItPnN0YXR1cyA9PSAtRUlOUFJPR1JFU1MpCisJCXVzYl9raWxsX3VyYih1cmIpOworfQorCitzdGF0aWMgdm9pZCBzaWVycmFfY2xvc2Uoc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCwgc3RydWN0IGZpbGUgKmZpbHApCit7CisJaW50IGk7CisJc3RydWN0IHVzYl9zZXJpYWwgKnNlcmlhbCA9IHBvcnQtPnNlcmlhbDsKKwlzdHJ1Y3Qgc2llcnJhX3BvcnRfcHJpdmF0ZSAqcG9ydGRhdGE7CisKKwlkYmcoIiVzIiwgX19GVU5DVElPTl9fKTsKKwlwb3J0ZGF0YSA9IHVzYl9nZXRfc2VyaWFsX3BvcnRfZGF0YShwb3J0KTsKKworCXBvcnRkYXRhLT5ydHNfc3RhdGUgPSAwOworCXBvcnRkYXRhLT5kdHJfc3RhdGUgPSAwOworCisJaWYgKHNlcmlhbC0+ZGV2KSB7CisJCXNpZXJyYV9zZW5kX3NldHVwKHBvcnQpOworCisJCS8qIFN0b3AgcmVhZGluZy93cml0aW5nIHVyYnMgKi8KKwkJZm9yIChpID0gMDsgaSA8IE5fSU5fVVJCOyBpKyspCisJCQlzdG9wX3VyYihwb3J0ZGF0YS0+aW5fdXJic1tpXSk7CisJCWZvciAoaSA9IDA7IGkgPCBOX09VVF9VUkI7IGkrKykKKwkJCXN0b3BfdXJiKHBvcnRkYXRhLT5vdXRfdXJic1tpXSk7CisJfQorCXBvcnQtPnR0eSA9IE5VTEw7Cit9CisKKy8qIEhlbHBlciBmdW5jdGlvbnMgdXNlZCBieSBzaWVycmFfc2V0dXBfdXJicyAqLworc3RhdGljIHN0cnVjdCB1cmIgKnNpZXJyYV9zZXR1cF91cmIoc3RydWN0IHVzYl9zZXJpYWwgKnNlcmlhbCwgaW50IGVuZHBvaW50LAorCQkJCSAgICBpbnQgZGlyLCB2b2lkICpjdHgsIGNoYXIgKmJ1ZiwgaW50IGxlbiwKKwkJCQkgICAgdXNiX2NvbXBsZXRlX3QgY2FsbGJhY2spCit7CisJc3RydWN0IHVyYiAqdXJiOworCisJaWYgKGVuZHBvaW50ID09IC0xKQorCQlyZXR1cm4gTlVMTDsJCS8qIGVuZHBvaW50IG5vdCBuZWVkZWQgKi8KKworCXVyYiA9IHVzYl9hbGxvY191cmIoMCwgR0ZQX0tFUk5FTCk7CQkvKiBObyBJU08gKi8KKwlpZiAodXJiID09IE5VTEwpIHsKKwkJZGJnKCIlczogYWxsb2MgZm9yIGVuZHBvaW50ICVkIGZhaWxlZC4iLCBfX0ZVTkNUSU9OX18sIGVuZHBvaW50KTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJCS8qIEZpbGwgVVJCIHVzaW5nIHN1cHBsaWVkIGRhdGEuICovCisJdXNiX2ZpbGxfYnVsa191cmIodXJiLCBzZXJpYWwtPmRldiwKKwkJICAgICAgdXNiX3NuZGJ1bGtwaXBlKHNlcmlhbC0+ZGV2LCBlbmRwb2ludCkgfCBkaXIsCisJCSAgICAgIGJ1ZiwgbGVuLCBjYWxsYmFjaywgY3R4KTsKKworCXJldHVybiB1cmI7Cit9CisKKy8qIFNldHVwIHVyYnMgKi8KK3N0YXRpYyB2b2lkIHNpZXJyYV9zZXR1cF91cmJzKHN0cnVjdCB1c2Jfc2VyaWFsICpzZXJpYWwpCit7CisJaW50IGksajsKKwlzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0OworCXN0cnVjdCBzaWVycmFfcG9ydF9wcml2YXRlICpwb3J0ZGF0YTsKKworCWRiZygiJXMiLCBfX0ZVTkNUSU9OX18pOworCisJZm9yIChpID0gMDsgaSA8IHNlcmlhbC0+bnVtX3BvcnRzOyBpKyspIHsKKwkJcG9ydCA9IHNlcmlhbC0+cG9ydFtpXTsKKwkJcG9ydGRhdGEgPSB1c2JfZ2V0X3NlcmlhbF9wb3J0X2RhdGEocG9ydCk7CisKKwkvKiBEbyBpbmRhdCBlbmRwb2ludHMgZmlyc3QgKi8KKwkJZm9yIChqID0gMDsgaiA8IE5fSU5fVVJCOyArK2opIHsKKwkJCXBvcnRkYXRhLT5pbl91cmJzW2pdID0gc2llcnJhX3NldHVwX3VyYiAoc2VyaWFsLAorICAgICAgICAgICAgICAgICAgCXBvcnQtPmJ1bGtfaW5fZW5kcG9pbnRBZGRyZXNzLCBVU0JfRElSX0lOLCBwb3J0LAorICAgICAgICAgICAgICAgICAgCXBvcnRkYXRhLT5pbl9idWZmZXJbal0sIElOX0JVRkxFTiwgc2llcnJhX2luZGF0X2NhbGxiYWNrKTsKKwkJfQorCisJCS8qIG91dGRhdCBlbmRwb2ludHMgKi8KKwkJZm9yIChqID0gMDsgaiA8IE5fT1VUX1VSQjsgKytqKSB7CisJCQlwb3J0ZGF0YS0+b3V0X3VyYnNbal0gPSBzaWVycmFfc2V0dXBfdXJiIChzZXJpYWwsCisgICAgICAgICAgICAgICAgICAJcG9ydC0+YnVsa19vdXRfZW5kcG9pbnRBZGRyZXNzLCBVU0JfRElSX09VVCwgcG9ydCwKKyAgICAgICAgICAgICAgICAgIAlwb3J0ZGF0YS0+b3V0X2J1ZmZlcltqXSwgT1VUX0JVRkxFTiwgc2llcnJhX291dGRhdF9jYWxsYmFjayk7CisJCX0KKwl9Cit9CisKK3N0YXRpYyBpbnQgc2llcnJhX3N0YXJ0dXAoc3RydWN0IHVzYl9zZXJpYWwgKnNlcmlhbCkKK3sKKwlpbnQgaSwgZXJyOworCXN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQ7CisJc3RydWN0IHNpZXJyYV9wb3J0X3ByaXZhdGUgKnBvcnRkYXRhOworCisJZGJnKCIlcyIsIF9fRlVOQ1RJT05fXyk7CisKKwkvKiBOb3cgc2V0dXAgcGVyIHBvcnQgcHJpdmF0ZSBkYXRhICovCisJZm9yIChpID0gMDsgaSA8IHNlcmlhbC0+bnVtX3BvcnRzOyBpKyspIHsKKwkJcG9ydCA9IHNlcmlhbC0+cG9ydFtpXTsKKwkJcG9ydGRhdGEgPSBremFsbG9jKHNpemVvZigqcG9ydGRhdGEpLCBHRlBfS0VSTkVMKTsKKwkJaWYgKCFwb3J0ZGF0YSkgeworCQkJZGJnKCIlczoga21hbGxvYyBmb3Igc2llcnJhX3BvcnRfcHJpdmF0ZSAoJWQpIGZhaWxlZCEuIiwKKwkJCQkJX19GVU5DVElPTl9fLCBpKTsKKwkJCXJldHVybiAoMSk7CisJCX0KKworCQl1c2Jfc2V0X3NlcmlhbF9wb3J0X2RhdGEocG9ydCwgcG9ydGRhdGEpOworCisJCWlmICghIHBvcnQtPmludGVycnVwdF9pbl91cmIpCisJCQljb250aW51ZTsKKwkJZXJyID0gdXNiX3N1Ym1pdF91cmIocG9ydC0+aW50ZXJydXB0X2luX3VyYiwgR0ZQX0tFUk5FTCk7CisJCWlmIChlcnIpCisJCQlkYmcoIiVzOiBzdWJtaXQgaXJxX2luIHVyYiBmYWlsZWQgJWQiLAorCQkJCV9fRlVOQ1RJT05fXywgZXJyKTsKKwl9CisKKwlzaWVycmFfc2V0dXBfdXJicyhzZXJpYWwpOworCisJcmV0dXJuICgwKTsKK30KKworc3RhdGljIHZvaWQgc2llcnJhX3NodXRkb3duKHN0cnVjdCB1c2Jfc2VyaWFsICpzZXJpYWwpCit7CisJaW50IGksIGo7CisJc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydDsKKwlzdHJ1Y3Qgc2llcnJhX3BvcnRfcHJpdmF0ZSAqcG9ydGRhdGE7CisKKwlkYmcoIiVzIiwgX19GVU5DVElPTl9fKTsKKworCS8qIFN0b3AgcmVhZGluZy93cml0aW5nIHVyYnMgKi8KKwlmb3IgKGkgPSAwOyBpIDwgc2VyaWFsLT5udW1fcG9ydHM7ICsraSkgeworCQlwb3J0ID0gc2VyaWFsLT5wb3J0W2ldOworCQlwb3J0ZGF0YSA9IHVzYl9nZXRfc2VyaWFsX3BvcnRfZGF0YShwb3J0KTsKKwkJZm9yIChqID0gMDsgaiA8IE5fSU5fVVJCOyBqKyspCisJCQlzdG9wX3VyYihwb3J0ZGF0YS0+aW5fdXJic1tqXSk7CisJCWZvciAoaiA9IDA7IGogPCBOX09VVF9VUkI7IGorKykKKwkJCXN0b3BfdXJiKHBvcnRkYXRhLT5vdXRfdXJic1tqXSk7CisJfQorCisJLyogTm93IGZyZWUgdGhlbSAqLworCWZvciAoaSA9IDA7IGkgPCBzZXJpYWwtPm51bV9wb3J0czsgKytpKSB7CisJCXBvcnQgPSBzZXJpYWwtPnBvcnRbaV07CisJCXBvcnRkYXRhID0gdXNiX2dldF9zZXJpYWxfcG9ydF9kYXRhKHBvcnQpOworCisJCWZvciAoaiA9IDA7IGogPCBOX0lOX1VSQjsgaisrKSB7CisJCQlpZiAocG9ydGRhdGEtPmluX3VyYnNbal0pIHsKKwkJCQl1c2JfZnJlZV91cmIocG9ydGRhdGEtPmluX3VyYnNbal0pOworCQkJCXBvcnRkYXRhLT5pbl91cmJzW2pdID0gTlVMTDsKKwkJCX0KKwkJfQorCQlmb3IgKGogPSAwOyBqIDwgTl9PVVRfVVJCOyBqKyspIHsKKwkJCWlmIChwb3J0ZGF0YS0+b3V0X3VyYnNbal0pIHsKKwkJCQl1c2JfZnJlZV91cmIocG9ydGRhdGEtPm91dF91cmJzW2pdKTsKKwkJCQlwb3J0ZGF0YS0+b3V0X3VyYnNbal0gPSBOVUxMOworCQkJfQorCQl9CisJfQorCisJLyogTm93IGZyZWUgcGVyIHBvcnQgcHJpdmF0ZSBkYXRhICovCisJZm9yIChpID0gMDsgaSA8IHNlcmlhbC0+bnVtX3BvcnRzOyBpKyspIHsKKwkJcG9ydCA9IHNlcmlhbC0+cG9ydFtpXTsKKwkJa2ZyZWUodXNiX2dldF9zZXJpYWxfcG9ydF9kYXRhKHBvcnQpKTsKKwl9Cit9CisKK3N0YXRpYyBzdHJ1Y3QgdXNiX3NlcmlhbF9kcml2ZXIgc2llcnJhXzFwb3J0X2RldmljZSA9IHsKIAkuZHJpdmVyID0gewotCS5vd25lciA9CQlUSElTX01PRFVMRSwKLQkubmFtZSA9CQkJIlNpZXJyYV9XaXJlbGVzcyIsCisJCS5vd25lciA9CVRISVNfTU9EVUxFLAorCQkubmFtZSA9CQkic2llcnJhMSIsCiAJfSwKLQkuaWRfdGFibGUgPQkJaWRfdGFibGUsCi0JLm51bV9pbnRlcnJ1cHRfaW4gPQlOVU1fRE9OVF9DQVJFLAotCS5udW1fYnVsa19pbiA9CQlOVU1fRE9OVF9DQVJFLAotCS5udW1fYnVsa19vdXQgPQkJTlVNX0RPTlRfQ0FSRSwKLQkubnVtX3BvcnRzID0JCTMsCisJLmRlc2NyaXB0aW9uICAgICAgID0gIlNpZXJyYSBVU0IgbW9kZW0gKDEgcG9ydCkiLAorCS5pZF90YWJsZSAgICAgICAgICA9IGlkX3RhYmxlXzFwb3J0LAorCS5udW1faW50ZXJydXB0X2luICA9IE5VTV9ET05UX0NBUkUsCisJLm51bV9idWxrX2luICAgICAgID0gMSwKKwkubnVtX2J1bGtfb3V0ICAgICAgPSAxLAorCS5udW1fcG9ydHMgICAgICAgICA9IDEsCisJLm9wZW4gICAgICAgICAgICAgID0gc2llcnJhX29wZW4sCisJLmNsb3NlICAgICAgICAgICAgID0gc2llcnJhX2Nsb3NlLAorCS53cml0ZSAgICAgICAgICAgICA9IHNpZXJyYV93cml0ZSwKKwkud3JpdGVfcm9vbSAgICAgICAgPSBzaWVycmFfd3JpdGVfcm9vbSwKKwkuY2hhcnNfaW5fYnVmZmVyICAgPSBzaWVycmFfY2hhcnNfaW5fYnVmZmVyLAorCS50aHJvdHRsZSAgICAgICAgICA9IHNpZXJyYV9yeF90aHJvdHRsZSwKKwkudW50aHJvdHRsZSAgICAgICAgPSBzaWVycmFfcnhfdW50aHJvdHRsZSwKKwkuaW9jdGwgICAgICAgICAgICAgPSBzaWVycmFfaW9jdGwsCisJLnNldF90ZXJtaW9zICAgICAgID0gc2llcnJhX3NldF90ZXJtaW9zLAorCS5icmVha19jdGwgICAgICAgICA9IHNpZXJyYV9icmVha19jdGwsCisJLnRpb2NtZ2V0ICAgICAgICAgID0gc2llcnJhX3Rpb2NtZ2V0LAorCS50aW9jbXNldCAgICAgICAgICA9IHNpZXJyYV90aW9jbXNldCwKKwkuYXR0YWNoICAgICAgICAgICAgPSBzaWVycmFfc3RhcnR1cCwKKwkuc2h1dGRvd24gICAgICAgICAgPSBzaWVycmFfc2h1dGRvd24sCisJLnJlYWRfaW50X2NhbGxiYWNrID0gc2llcnJhX2luc3RhdF9jYWxsYmFjaywKIH07CiAKK3N0YXRpYyBzdHJ1Y3QgdXNiX3NlcmlhbF9kcml2ZXIgc2llcnJhXzNwb3J0X2RldmljZSA9IHsKKwkuZHJpdmVyID0geworCQkub3duZXIgPQlUSElTX01PRFVMRSwKKwkJLm5hbWUgPQkJInNpZXJyYTMiLAorCX0sCisJLmRlc2NyaXB0aW9uICAgICAgID0gIlNpZXJyYSBVU0IgbW9kZW0gKDMgcG9ydCkiLAorCS5pZF90YWJsZSAgICAgICAgICA9IGlkX3RhYmxlXzNwb3J0LAorCS5udW1faW50ZXJydXB0X2luICA9IE5VTV9ET05UX0NBUkUsCisJLm51bV9idWxrX2luICAgICAgID0gMywKKwkubnVtX2J1bGtfb3V0ICAgICAgPSAzLAorCS5udW1fcG9ydHMgICAgICAgICA9IDMsCisJLm9wZW4gICAgICAgICAgICAgID0gc2llcnJhX29wZW4sCisJLmNsb3NlICAgICAgICAgICAgID0gc2llcnJhX2Nsb3NlLAorCS53cml0ZSAgICAgICAgICAgICA9IHNpZXJyYV93cml0ZSwKKwkud3JpdGVfcm9vbSAgICAgICAgPSBzaWVycmFfd3JpdGVfcm9vbSwKKwkuY2hhcnNfaW5fYnVmZmVyICAgPSBzaWVycmFfY2hhcnNfaW5fYnVmZmVyLAorCS50aHJvdHRsZSAgICAgICAgICA9IHNpZXJyYV9yeF90aHJvdHRsZSwKKwkudW50aHJvdHRsZSAgICAgICAgPSBzaWVycmFfcnhfdW50aHJvdHRsZSwKKwkuaW9jdGwgICAgICAgICAgICAgPSBzaWVycmFfaW9jdGwsCisJLnNldF90ZXJtaW9zICAgICAgID0gc2llcnJhX3NldF90ZXJtaW9zLAorCS5icmVha19jdGwgICAgICAgICA9IHNpZXJyYV9icmVha19jdGwsCisJLnRpb2NtZ2V0ICAgICAgICAgID0gc2llcnJhX3Rpb2NtZ2V0LAorCS50aW9jbXNldCAgICAgICAgICA9IHNpZXJyYV90aW9jbXNldCwKKwkuYXR0YWNoICAgICAgICAgICAgPSBzaWVycmFfc3RhcnR1cCwKKwkuc2h1dGRvd24gICAgICAgICAgPSBzaWVycmFfc2h1dGRvd24sCisJLnJlYWRfaW50X2NhbGxiYWNrID0gc2llcnJhX2luc3RhdF9jYWxsYmFjaywKK307CisKKy8qIEZ1bmN0aW9ucyB1c2VkIGJ5IG5ldyB1c2Itc2VyaWFsIGNvZGUuICovCiBzdGF0aWMgaW50IF9faW5pdCBzaWVycmFfaW5pdCh2b2lkKQogewogCWludCByZXR2YWw7Ci0KLQlyZXR2YWwgPSB1c2Jfc2VyaWFsX3JlZ2lzdGVyKCZzaWVycmFfZGV2aWNlKTsKKwlyZXR2YWwgPSB1c2Jfc2VyaWFsX3JlZ2lzdGVyKCZzaWVycmFfMXBvcnRfZGV2aWNlKTsKIAlpZiAocmV0dmFsKQotCQlyZXR1cm4gcmV0dmFsOworCQlnb3RvIGZhaWxlZF8xcG9ydF9kZXZpY2VfcmVnaXN0ZXI7CisJcmV0dmFsID0gdXNiX3NlcmlhbF9yZWdpc3Rlcigmc2llcnJhXzNwb3J0X2RldmljZSk7CisJaWYgKHJldHZhbCkKKwkJZ290byBmYWlsZWRfM3BvcnRfZGV2aWNlX3JlZ2lzdGVyOworCisKIAlyZXR2YWwgPSB1c2JfcmVnaXN0ZXIoJnNpZXJyYV9kcml2ZXIpOwogCWlmIChyZXR2YWwpCi0JCXVzYl9zZXJpYWxfZGVyZWdpc3Rlcigmc2llcnJhX2RldmljZSk7CisJCWdvdG8gZmFpbGVkX2RyaXZlcl9yZWdpc3RlcjsKKworCWluZm8oRFJJVkVSX0RFU0MgIjogIiBEUklWRVJfVkVSU0lPTik7CisKKwlyZXR1cm4gMDsKKworZmFpbGVkX2RyaXZlcl9yZWdpc3RlcjoKKwl1c2Jfc2VyaWFsX2RlcmVnaXN0ZXIoJnNpZXJyYV8zcG9ydF9kZXZpY2UpOworZmFpbGVkXzNwb3J0X2RldmljZV9yZWdpc3RlcjoKKwl1c2Jfc2VyaWFsX2RlcmVnaXN0ZXIoJnNpZXJyYV8xcG9ydF9kZXZpY2UpOworZmFpbGVkXzFwb3J0X2RldmljZV9yZWdpc3RlcjoKIAlyZXR1cm4gcmV0dmFsOwogfQogCiBzdGF0aWMgdm9pZCBfX2V4aXQgc2llcnJhX2V4aXQodm9pZCkKIHsKLQl1c2JfZGVyZWdpc3Rlcigmc2llcnJhX2RyaXZlcik7Ci0JdXNiX3NlcmlhbF9kZXJlZ2lzdGVyKCZzaWVycmFfZGV2aWNlKTsKKwl1c2JfZGVyZWdpc3RlciAoJnNpZXJyYV9kcml2ZXIpOworCXVzYl9zZXJpYWxfZGVyZWdpc3Rlcigmc2llcnJhXzFwb3J0X2RldmljZSk7CisJdXNiX3NlcmlhbF9kZXJlZ2lzdGVyKCZzaWVycmFfM3BvcnRfZGV2aWNlKTsKIH0KIAogbW9kdWxlX2luaXQoc2llcnJhX2luaXQpOwogbW9kdWxlX2V4aXQoc2llcnJhX2V4aXQpOworCitNT0RVTEVfQVVUSE9SKERSSVZFUl9BVVRIT1IpOworTU9EVUxFX0RFU0NSSVBUSU9OKERSSVZFUl9ERVNDKTsKK01PRFVMRV9WRVJTSU9OKERSSVZFUl9WRVJTSU9OKTsKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworI2lmZGVmIENPTkZJR19VU0JfREVCVUcKK21vZHVsZV9wYXJhbShkZWJ1ZywgYm9vbCwgU19JUlVHTyB8IFNfSVdVU1IpOworTU9EVUxFX1BBUk1fREVTQyhkZWJ1ZywgIkRlYnVnIG1lc3NhZ2VzIik7CisjZW5kaWYKKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2Ivc3RvcmFnZS91bnVzdWFsX2RldnMuaCBiL2RyaXZlcnMvdXNiL3N0b3JhZ2UvdW51c3VhbF9kZXZzLmgKaW5kZXggYzlhOGQ1MC4uZWZiMDQ3ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2Ivc3RvcmFnZS91bnVzdWFsX2RldnMuaAorKysgYi9kcml2ZXJzL3VzYi9zdG9yYWdlL3VudXN1YWxfZGV2cy5oCkBAIC01NSw3ICs1NSw4IEBACiAgICAgICAgICAgICAgICAgVVNfU0NfREVWSUNFLCBVU19QUl9ERVZJQ0UsIE5VTEwsCiAgICAgICAgICAgICAgICAgVVNfRkxfSUdOT1JFX1JFU0lEVUUpLAogCi1VTlVTVUFMX0RFViggIDB4MDNlZSwgMHg2OTAxLCAweDAwMDAsIDB4MDEwMCwKKy8qIG1vZGlmaWVkIGJ5IFRvYmlhcyBMb3JlbnogPHRvYmlhcy5sb3JlbnpAZ214Lm5ldD4gKi8KK1VOVVNVQUxfREVWKCAgMHgwM2VlLCAweDY5MDEsIDB4MDAwMCwgMHgwMjAwLAogCQkiTWl0c3VtaSIsCiAJCSJVU0IgRkREIiwKIAkJVVNfU0NfREVWSUNFLCBVU19QUl9ERVZJQ0UsIE5VTEwsCkBAIC0xODIsNiArMTgzLDIwIEBACiAJCVVTX1NDX0RFVklDRSwgVVNfUFJfREVWSUNFLCBOVUxMLAogCQlVU19GTF9JR05PUkVfUkVTSURVRSB8IFVTX0ZMX0ZJWF9DQVBBQ0lUWSApLAogCisvKiBSZXBvcnRlZCBieSBCYXJkdXIgQXJhbnRzc29uIDxiYXJkdXJAc2NpZW50aWNpYW4ubmV0PiAqLworVU5VU1VBTF9ERVYoICAweDA0MjEsIDB4MDQ3YywgMHgwMzcwLCAweDAzNzAsCisJCSJOb2tpYSIsCisJCSI2MTMxIiwKKwkJVVNfU0NfREVWSUNFLCBVU19QUl9ERVZJQ0UsIE5VTEwsCisJCVVTX0ZMX01BWF9TRUNUT1JTXzY0ICksCisKKy8qIFJlcG9ydGVkIGJ5IEFsZXggQ29yY29sZXMgPGFsZXhAY29yY29sZXMubmV0PiAqLworVU5VU1VBTF9ERVYoICAweDA0MjEsIDB4MDQ5NSwgMHgwMzcwLCAweDAzNzAsCisJCSJOb2tpYSIsCisJCSI2MjM0IiwKKwkJVVNfU0NfREVWSUNFLCBVU19QUl9ERVZJQ0UsIE5VTEwsCisJCVVTX0ZMX01BWF9TRUNUT1JTXzY0ICksCisKIC8qIFJlcG9ydGVkIGJ5IE9sYWYgSGVyaW5nIDxvbGhAc3VzZS5kZT4gZnJvbSBub3ZlbGwgYnVnICMxMDU4NzggKi8KIFVOVVNVQUxfREVWKCAgMHgwNDI0LCAweDBmZGMsIDB4MDIxMCwgMHgwMjEwLAogCQkiU01TQyIsCkBAIC0xMjIxLDcgKzEyMzYsNyBAQAogCQkiQ293b24gU3lzdGVtcyIsCiAJCSJpQVVESU8gTTUiLAogCQlVU19TQ19ERVZJQ0UsIFVTX1BSX0JVTEssIE5VTEwsCi0JCTAgKSwKKwkJVVNfRkxfTkVFRF9PVkVSUklERSApLAogCiAvKiBTdWJtaXR0ZWQgYnkgQW50b2luZSBNYWlyZXNzZSA8YW50b2luZS5tYWlyZXNzZUBmcmVlLmZyPiAqLwogVU5VU1VBTF9ERVYoIDB4MGVkMSwgMHg2NjYwLCAweDAxMDAsIDB4MDMwMCwKQEAgLTEyOTQsOCArMTMwOSwxMCBAQAogLyogUmVwb3J0ZWQgYnkgS2V2aW4gQ2VybmVrZWUgPGtwYy11c2JkZXZAZ2VsYXRvLnVpdWMuZWR1PgogICogVGVzdGVkIG9uIGhhcmR3YXJlIHZlcnNpb24gMS4xMC4KICAqIEVudHJ5IGlzIG5lZWRlZCBvbmx5IGZvciB0aGUgaW5pdGlhbGl6ZXIgZnVuY3Rpb24gb3ZlcnJpZGUuCisgKiBEZXZpY2VzIHdpdGggYmNkID4gMTEwIHNlZW0gdG8gbm90IG5lZWQgaXQgd2hpbGUgdGhvc2UKKyAqIHdpdGggYmNkIDwgMTEwIGFwcGVhciB0byBuZWVkIGl0LgogICovCi1VTlVTVUFMX0RFViggIDB4MTAxOSwgMHgwYzU1LCAweDAxMTAsIDB4MDExMCwKK1VOVVNVQUxfREVWKCAgMHgxMDE5LCAweDBjNTUsIDB4MDAwMCwgMHgwMTEwLAogCQkiRGVza25vdGUiLAogCQkiVUNSLTYxUzJCIiwKIAkJVVNfU0NfREVWSUNFLCBVU19QUl9ERVZJQ0UsIHVzYl9zdG9yX3VjcjYxczJiX2luaXQsCmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL0tjb25maWcgYi9kcml2ZXJzL3ZpZGVvL0tjb25maWcKaW5kZXggZGFhYTQ4Ni4uN2E0MzAyMCAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9LY29uZmlnCisrKyBiL2RyaXZlcnMvdmlkZW8vS2NvbmZpZwpAQCAtNzAxLDcgKzcwMSw2IEBACiAJZGVwZW5kcyBvbiBGQiAmJiBQQ0kKIAlzZWxlY3QgSTJDX0FMR09CSVQgaWYgRkJfTlZJRElBX0kyQwogCXNlbGVjdCBJMkMgaWYgRkJfTlZJRElBX0kyQwotCXNlbGVjdCBGQl9EREMgaWYgRkJfTlZJRElBX0kyQwogCXNlbGVjdCBGQl9NT0RFX0hFTFBFUlMKIAlzZWxlY3QgRkJfQ0ZCX0ZJTExSRUNUCiAJc2VsZWN0IEZCX0NGQl9DT1BZQVJFQQpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9hdHkvYXR5ZmJfYmFzZS5jIGIvZHJpdmVycy92aWRlby9hdHkvYXR5ZmJfYmFzZS5jCmluZGV4IGI3N2IzMDkuLmU4MTViMzUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vYXR5L2F0eWZiX2Jhc2UuYworKysgYi9kcml2ZXJzL3ZpZGVvL2F0eS9hdHlmYl9iYXNlLmMKQEAgLTQwNiw3ICs0MDYsNyBAQAogCXsgUENJX0NISVBfTUFDSDY0TEIsICIzRCBSQUdFIExUIFBSTyAoTWFjaDY0IExCLCBBR1ApIiwgMjM2LCA3NSwgMTAwLCAxMzUsIEFUSV9DSElQXzI2NExUUFJPIH0sCiAJeyBQQ0lfQ0hJUF9NQUNINjRMRCwgIjNEIFJBR0UgTFQgUFJPIChNYWNoNjQgTEQsIEFHUCkiLCAyMzAsIDEwMCwgMTAwLCAxMzUsIEFUSV9DSElQXzI2NExUUFJPIH0sCiAJeyBQQ0lfQ0hJUF9NQUNINjRMSSwgIjNEIFJBR0UgTFQgUFJPIChNYWNoNjQgTEksIFBDSSkiLCAyMzAsIDEwMCwgMTAwLCAxMzUsIEFUSV9DSElQXzI2NExUUFJPIHwgTTY0Rl9HM19QQl8xXzEgfCBNNjRGX0czX1BCXzEwMjR4NzY4IH0sCi0JeyBQQ0lfQ0hJUF9NQUNINjRMUCwgIjNEIFJBR0UgTFQgUFJPIChNYWNoNjQgTFAsIFBDSSkiLCAyMzAsIDEwMCwgMTAwLCAxMzUsIEFUSV9DSElQXzI2NExUUFJPIH0sCisJeyBQQ0lfQ0hJUF9NQUNINjRMUCwgIjNEIFJBR0UgTFQgUFJPIChNYWNoNjQgTFAsIFBDSSkiLCAyMzAsIDEwMCwgMTAwLCAxMzUsIEFUSV9DSElQXzI2NExUUFJPIHwgTTY0Rl9HM19QQl8xMDI0eDc2OCB9LAogCXsgUENJX0NISVBfTUFDSDY0TFEsICIzRCBSQUdFIExUIFBSTyAoTWFjaDY0IExRLCBQQ0kpIiwgMjMwLCAxMDAsIDEwMCwgMTM1LCBBVElfQ0hJUF8yNjRMVFBSTyB9LAogCiAJeyBQQ0lfQ0hJUF9NQUNINjRHTSwgIjNEIFJBR0UgWEwgKE1hY2g2NCBHTSwgQUdQIDJ4KSIsIDIzMCwgODMsIDYzLCAxMzUsIEFUSV9DSElQXzI2NFhMIH0sCmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL2F0eS9yYWRlb25faTJjLmMgYi9kcml2ZXJzL3ZpZGVvL2F0eS9yYWRlb25faTJjLmMKaW5kZXggNjc2NzU0NS4uODY5NzI1YSAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9hdHkvcmFkZW9uX2kyYy5jCisrKyBiL2RyaXZlcnMvdmlkZW8vYXR5L3JhZGVvbl9pMmMuYwpAQCAtMTM5LDcgKzEzOSwxMyBAQAogaW50IHJhZGVvbl9wcm9iZV9pMmNfY29ubmVjdG9yKHN0cnVjdCByYWRlb25mYl9pbmZvICpyaW5mbywgaW50IGNvbm4sCiAJCQkgICAgICAgdTggKipvdXRfZWRpZCkKIHsKLQl1OCAqZWRpZCA9IGZiX2RkY19yZWFkKCZyaW5mby0+aTJjW2Nvbm4tMV0uYWRhcHRlcik7CisJdTMyIHJlZyA9IHJpbmZvLT5pMmNbY29ubi0xXS5kZGNfcmVnOworCXU4ICplZGlkOworCisJT1VUUkVHKHJlZywgSU5SRUcocmVnKSAmCisJCQl+KFZHQV9ERENfREFUQV9PVVRQVVQgfCBWR0FfRERDX0NMS19PVVRQVVQpKTsKKworCWVkaWQgPSBmYl9kZGNfcmVhZCgmcmluZm8tPmkyY1tjb25uLTFdLmFkYXB0ZXIpOwogCiAJaWYgKG91dF9lZGlkKQogCQkqb3V0X2VkaWQgPSBlZGlkOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9iYWNrbGlnaHQvY29yZ2lfYmwuYyBiL2RyaXZlcnMvdmlkZW8vYmFja2xpZ2h0L2NvcmdpX2JsLmMKaW5kZXggMmViYmZkOS4uZDA3ZWNiNSAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9iYWNrbGlnaHQvY29yZ2lfYmwuYworKysgYi9kcml2ZXJzL3ZpZGVvL2JhY2tsaWdodC9jb3JnaV9ibC5jCkBAIC0xMTEsNyArMTExLDcgQEAKIAkudXBkYXRlX3N0YXR1cyAgPSBjb3JnaWJsX3NldF9pbnRlbnNpdHksCiB9OwogCi1zdGF0aWMgaW50IF9faW5pdCBjb3JnaWJsX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCitzdGF0aWMgaW50IGNvcmdpYmxfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKIHsKIAlzdHJ1Y3QgY29yZ2libF9tYWNoaW5mbyAqbWFjaGluZm8gPSBwZGV2LT5kZXYucGxhdGZvcm1fZGF0YTsKIApAQCAtMTY2LDQgKzE2Niw0IEBACiAKIE1PRFVMRV9BVVRIT1IoIlJpY2hhcmQgUHVyZGllIDxycHVyZGllQHJwc3lzLm5ldD4iKTsKIE1PRFVMRV9ERVNDUklQVElPTigiQ29yZ2kgQmFja2xpZ2h0IERyaXZlciIpOwotTU9EVUxFX0xJQ0VOU0UoIkdQTHYyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL2JhY2tsaWdodC9ocDY4MF9ibC5jIGIvZHJpdmVycy92aWRlby9iYWNrbGlnaHQvaHA2ODBfYmwuYwppbmRleCBmZTE0ODgzLi5lMzk5MzIxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL2JhY2tsaWdodC9ocDY4MF9ibC5jCisrKyBiL2RyaXZlcnMvdmlkZW8vYmFja2xpZ2h0L2hwNjgwX2JsLmMKQEAgLTE5LDcgKzE5LDcgQEAKICNpbmNsdWRlIDxsaW51eC9iYWNrbGlnaHQuaD4KIAogI2luY2x1ZGUgPGFzbS9jcHUvZGFjLmg+Ci0jaW5jbHVkZSA8YXNtL2hwNnh4L2hwNnh4Lmg+CisjaW5jbHVkZSA8YXNtL2hwNnh4Lmg+CiAjaW5jbHVkZSA8YXNtL2hkNjQ0NjEuaD4KIAogI2RlZmluZSBIUDY4MF9NQVhfSU5URU5TSVRZIDI1NQpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9jb250cm9sZmIuYyBiL2RyaXZlcnMvdmlkZW8vY29udHJvbGZiLmMKaW5kZXggOGNjNmMwZS4uMDRjNmQ5MiAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9jb250cm9sZmIuYworKysgYi9kcml2ZXJzL3ZpZGVvL2NvbnRyb2xmYi5jCkBAIC00MTUsMTMgKzQxNSwxNSBAQAogCWZ1bGwgPSBwLT50b3RhbF92cmFtID09IDB4NDAwMDAwOwogCiAJLyogVHJ5IHRvIHBpY2sgYSB2aWRlbyBtb2RlIG91dCBvZiBOVlJBTSBpZiB3ZSBoYXZlIG9uZS4gKi8KKyNpZmRlZiBDT05GSUdfTlZSQU0KIAlpZiAoZGVmYXVsdF9jbW9kZSA9PSBDTU9ERV9OVlJBTSl7CiAJCWNtb2RlID0gbnZyYW1fcmVhZF9ieXRlKE5WX0NNT0RFKTsKIAkJaWYoY21vZGUgPCBDTU9ERV84IHx8IGNtb2RlID4gQ01PREVfMzIpCiAJCQljbW9kZSA9IENNT0RFXzg7CiAJfSBlbHNlCisjZW5kaWYKIAkJY21vZGU9ZGVmYXVsdF9jbW9kZTsKLQorI2lmZGVmIENPTkZJR19OVlJBTQogCWlmIChkZWZhdWx0X3Ztb2RlID09IFZNT0RFX05WUkFNKSB7CiAJCXZtb2RlID0gbnZyYW1fcmVhZF9ieXRlKE5WX1ZNT0RFKTsKIAkJaWYgKHZtb2RlIDwgMSB8fCB2bW9kZSA+IFZNT0RFX01BWCB8fApAQCAtNDMyLDcgKzQzNCw5IEBACiAJCQlpZiAoY29udHJvbF9tYWNfbW9kZXNbdm1vZGUgLSAxXS5tW2Z1bGxdIDwgY21vZGUpCiAJCQkJdm1vZGUgPSBWTU9ERV82NDBfNDgwXzYwOwogCQl9Ci0JfSBlbHNlIHsKKwl9IGVsc2UKKyNlbmRpZgorCXsKIAkJdm1vZGU9ZGVmYXVsdF92bW9kZTsKIAkJaWYgKGNvbnRyb2xfbWFjX21vZGVzW3Ztb2RlIC0gMV0ubVtmdWxsXSA8IGNtb2RlKSB7CiAJCQlpZiAoY21vZGUgPiBDTU9ERV84KQpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9mYl9kZGMuYyBiL2RyaXZlcnMvdmlkZW8vZmJfZGRjLmMKaW5kZXggM2FhNmViZi4uZjgzNjEzNyAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9mYl9kZGMuYworKysgYi9kcml2ZXJzL3ZpZGVvL2ZiX2RkYy5jCkBAIC0yMCwyNiArMjAsMjYgQEAKIHN0YXRpYyB1bnNpZ25lZCBjaGFyICpmYl9kb19wcm9iZV9kZGNfZWRpZChzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXB0ZXIpCiB7CiAJdW5zaWduZWQgY2hhciBzdGFydCA9IDB4MDsKKwl1bnNpZ25lZCBjaGFyICpidWYgPSBrbWFsbG9jKEVESURfTEVOR1RILCBHRlBfS0VSTkVMKTsKIAlzdHJ1Y3QgaTJjX21zZyBtc2dzW10gPSB7CiAJCXsKIAkJCS5hZGRyCT0gRERDX0FERFIsCisJCQkuZmxhZ3MJPSAwLAogCQkJLmxlbgk9IDEsCiAJCQkuYnVmCT0gJnN0YXJ0LAogCQl9LCB7CiAJCQkuYWRkcgk9IEREQ19BRERSLAogCQkJLmZsYWdzCT0gSTJDX01fUkQsCiAJCQkubGVuCT0gRURJRF9MRU5HVEgsCisJCQkuYnVmCT0gYnVmLAogCQl9CiAJfTsKLQl1bnNpZ25lZCBjaGFyICpidWY7CiAKLQlidWYgPSBrbWFsbG9jKEVESURfTEVOR1RILCBHRlBfS0VSTkVMKTsKIAlpZiAoIWJ1ZikgewogCQlkZXZfd2FybigmYWRhcHRlci0+ZGV2LCAidW5hYmxlIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3IgRURJRCAiCiAJCQkgImJsb2NrLlxuIik7CiAJCXJldHVybiBOVUxMOwogCX0KLQltc2dzWzFdLmJ1ZiA9IGJ1ZjsKIAogCWlmIChpMmNfdHJhbnNmZXIoYWRhcHRlciwgbXNncywgMikgPT0gMikKIAkJcmV0dXJuIGJ1ZjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vaGl0ZmIuYyBiL2RyaXZlcnMvdmlkZW8vaGl0ZmIuYwppbmRleCAzYWZiNDcyLi4zZGM0OTQyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL2hpdGZiLmMKKysrIGIvZHJpdmVycy92aWRlby9oaXRmYi5jCkBAIC0yOSw3ICsyOSw2IEBACiAjaW5jbHVkZSA8YXNtL2lvLmg+CiAjaW5jbHVkZSA8YXNtL2hkNjQ0NjEuaD4KICNpbmNsdWRlIDxhc20vY3B1L2RhYy5oPgotI2luY2x1ZGUgPGFzbS9ocDZ4eC9ocDZ4eC5oPgogCiAjZGVmaW5lCVdJRFRIIDY0MAogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL2lnYWZiLmMgYi9kcml2ZXJzL3ZpZGVvL2lnYWZiLmMKaW5kZXggNjdmMzg0Zi4uZTZkZjQ5MmMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vaWdhZmIuYworKysgYi9kcml2ZXJzL3ZpZGVvL2lnYWZiLmMKQEAgLTU3MywzICs1NzMsMTAgQEAKIAogbW9kdWxlX2luaXQoaWdhZmJfaW5pdCk7CiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CitzdGF0aWMgc3RydWN0IHBjaV9kZXZpY2VfaWQgaWdhZmJfcGNpX3RibFtdIF9fZGV2aW5pdGRhdGEgPSB7CisJeyBQQ0lfVkVORE9SX0lEX0lOVEVSRywgUENJX0RFVklDRV9JRF9JTlRFUkdfMTY4MiwKKwkgIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDB9LAorCXsgfQorfTsKKworTU9EVUxFX0RFVklDRV9UQUJMRShwY2ksIGlnYWZiX3BjaV90YmwpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9pbnRlbGZiL2ludGVsZmJody5jIGIvZHJpdmVycy92aWRlby9pbnRlbGZiL2ludGVsZmJody5jCmluZGV4IGVlZWVmZjkuLmE5NTgzNjggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vaW50ZWxmYi9pbnRlbGZiaHcuYworKysgYi9kcml2ZXJzL3ZpZGVvL2ludGVsZmIvaW50ZWxmYmh3LmMKQEAgLTE2MSw3ICsxNjEsNyBAQAogCQlyZXR1cm4gMTsKIAogCS8qIEZpbmQgdGhlIGJyaWRnZSBkZXZpY2UuICBJdCBpcyBhbHdheXMgMDowLjAgKi8KLQlpZiAoIShicmlkZ2VfZGV2ID0gcGNpX2ZpbmRfc2xvdCgwLCBQQ0lfREVWRk4oMCwgMCkpKSkgeworCWlmICghKGJyaWRnZV9kZXYgPSBwY2lfZ2V0X2J1c19hbmRfc2xvdCgwLCBQQ0lfREVWRk4oMCwgMCkpKSkgewogCQlFUlJfTVNHKCJjYW5ub3QgZmluZCBicmlkZ2UgZGV2aWNlXG4iKTsKIAkJcmV0dXJuIDE7CiAJfQpAQCAtMTY5LDYgKzE2OSw4IEBACiAJLyogR2V0IHRoZSBmYiBhcGVydHVyZSBzaXplIGFuZCAic3RvbGVuIiBtZW1vcnkgYW1vdW50LiAqLwogCXRtcCA9IDA7CiAJcGNpX3JlYWRfY29uZmlnX3dvcmQoYnJpZGdlX2RldiwgSU5URUxfR01DSF9DVFJMLCAmdG1wKTsKKwlwY2lfZGV2X3B1dChicmlkZ2VfZGV2KTsKKwogCXN3aXRjaCAocGRldi0+ZGV2aWNlKSB7CiAJY2FzZSBQQ0lfREVWSUNFX0lEX0lOVEVMXzkxNUc6CiAJY2FzZSBQQ0lfREVWSUNFX0lEX0lOVEVMXzkxNUdNOgpAQCAtNjYyLDcgKzY2NCw3IEBACiAJaW50IGluZGV4ID0gZGluZm8tPnBsbF9pbmRleDsKIAlEQkdfTVNHKCJpbnRlbGZiaHdfcHJpbnRfaHdfc3RhdGVcbiIpOwogCi0JaWYgKCFodyB8fCAhZGluZm8pCisJaWYgKCFodykKIAkJcmV0dXJuOwogCS8qIFJlYWQgaW4gYXMgbXVjaCBvZiB0aGUgSFcgc3RhdGUgYXMgcG9zc2libGUuICovCiAJcHJpbnRrKCJodyBzdGF0ZSBkdW1wIHN0YXJ0XG4iKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vbnZpZGlhL252X2h3LmMgYi9kcml2ZXJzL3ZpZGVvL252aWRpYS9udl9ody5jCmluZGV4IDllZDY0MGQuLmVhNDI2MTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vbnZpZGlhL252X2h3LmMKKysrIGIvZHJpdmVycy92aWRlby9udmlkaWEvbnZfaHcuYwpAQCAtMTQ1LDEyICsxNDUsMTggQEAKIAogCWlmIChwYXItPkFyY2hpdGVjdHVyZSA+PSBOVl9BUkNIXzQwKSB7CiAJCXBsbCA9IE5WX1JEMzIocGFyLT5QTUMsIDB4NDAyMCk7Ci0JCVAgPSAocGxsID4+IDE2KSAmIDB4MDM7CisJCVAgPSAocGxsID4+IDE2KSAmIDB4MDc7CiAJCXBsbCA9IE5WX1JEMzIocGFyLT5QTUMsIDB4NDAyNCk7CiAJCU0gPSBwbGwgJiAweEZGOwogCQlOID0gKHBsbCA+PiA4KSAmIDB4RkY7Ci0JCU1CID0gKHBsbCA+PiAxNikgJiAweEZGOwotCQlOQiA9IChwbGwgPj4gMjQpICYgMHhGRjsKKwkJaWYgKCgocGFyLT5DaGlwc2V0ICYgMHhmZmYwKSA9PSAweDAyOTApIHx8CisJCQkJKChwYXItPkNoaXBzZXQgJiAweGZmZjApID09IDB4MDM5MCkpIHsKKwkJCU1CID0gMTsKKwkJCU5CID0gMTsKKwkJfSBlbHNlIHsKKwkJCU1CID0gKHBsbCA+PiAxNikgJiAweEZGOworCQkJTkIgPSAocGxsID4+IDI0KSAmIDB4RkY7CisJCX0KIAkJKk1DbGsgPSAoKE4gKiBOQiAqIHBhci0+Q3J5c3RhbEZyZXFLSHopIC8gKE0gKiBNQikpID4+IFA7CiAKIAkJcGxsID0gTlZfUkQzMihwYXItPlBNQywgMHg0MDAwKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vbnZpZGlhL252X2kyYy5jIGIvZHJpdmVycy92aWRlby9udmlkaWEvbnZfaTJjLmMKaW5kZXggZTQ4ZGUzYy4uMTllZWYzYSAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9udmlkaWEvbnZfaTJjLmMKKysrIGIvZHJpdmVycy92aWRlby9udmlkaWEvbnZfaTJjLmMKQEAgLTE2MCwxMiArMTYwLDUxIEBACiAKIH0KIAorc3RhdGljIHU4ICpudmlkaWFfZG9fcHJvYmVfaTJjX2VkaWQoc3RydWN0IG52aWRpYV9pMmNfY2hhbiAqY2hhbikKK3sKKwl1OCBzdGFydCA9IDB4MDsKKwlzdHJ1Y3QgaTJjX21zZyBtc2dzW10gPSB7CisJCXsKKwkJIC5hZGRyID0gMHg1MCwKKwkJIC5sZW4gPSAxLAorCQkgLmJ1ZiA9ICZzdGFydCwKKwkJIH0sIHsKKwkJICAgICAuYWRkciA9IDB4NTAsCisJCSAgICAgLmZsYWdzID0gSTJDX01fUkQsCisJCSAgICAgLmxlbiA9IEVESURfTEVOR1RILAorCQkgICAgIH0sCisJfTsKKwl1OCAqYnVmOworCisJaWYgKCFjaGFuLT5wYXIpCisJCXJldHVybiBOVUxMOworCisJYnVmID0ga21hbGxvYyhFRElEX0xFTkdUSCwgR0ZQX0tFUk5FTCk7CisJaWYgKCFidWYpIHsKKwkJZGV2X3dhcm4oJmNoYW4tPnBhci0+cGNpX2Rldi0+ZGV2LCAiT3V0IG9mIG1lbW9yeSFcbiIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisJbXNnc1sxXS5idWYgPSBidWY7CisKKwlpZiAoaTJjX3RyYW5zZmVyKCZjaGFuLT5hZGFwdGVyLCBtc2dzLCAyKSA9PSAyKQorCQlyZXR1cm4gYnVmOworCWRldl9kYmcoJmNoYW4tPnBhci0+cGNpX2Rldi0+ZGV2LCAiVW5hYmxlIHRvIHJlYWQgRURJRCBibG9jay5cbiIpOworCWtmcmVlKGJ1Zik7CisJcmV0dXJuIE5VTEw7Cit9CisKIGludCBudmlkaWFfcHJvYmVfaTJjX2Nvbm5lY3RvcihzdHJ1Y3QgZmJfaW5mbyAqaW5mbywgaW50IGNvbm4sIHU4ICoqb3V0X2VkaWQpCiB7CiAJc3RydWN0IG52aWRpYV9wYXIgKnBhciA9IGluZm8tPnBhcjsKLQl1OCAqZWRpZDsKKwl1OCAqZWRpZCA9IE5VTEw7CisJaW50IGk7CiAKLQllZGlkID0gZmJfZGRjX3JlYWQoJnBhci0+Y2hhbltjb25uIC0gMV0uYWRhcHRlcik7CisJZm9yIChpID0gMDsgaSA8IDM7IGkrKykgeworCQkvKiBEbyB0aGUgcmVhbCB3b3JrICovCisJCWVkaWQgPSBudmlkaWFfZG9fcHJvYmVfaTJjX2VkaWQoJnBhci0+Y2hhbltjb25uIC0gMV0pOworCQlpZiAoZWRpZCkKKwkJCWJyZWFrOworCX0KIAogCWlmICghZWRpZCAmJiBjb25uID09IDEpIHsKIAkJLyogdHJ5IHRvIGdldCBmcm9tIGZpcm13YXJlICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL252aWRpYS9udl9zZXR1cC5jIGIvZHJpdmVycy92aWRlby9udmlkaWEvbnZfc2V0dXAuYwppbmRleCBhMThhOWFlLi5lYWIzZTI4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL252aWRpYS9udl9zZXR1cC5jCisrKyBiL2RyaXZlcnMvdmlkZW8vbnZpZGlhL252X3NldHVwLmMKQEAgLTI2Miw3ICsyNjIsNyBAQAogI2VuZGlmCiAKIAlkZXYgPSBwY2lfZmluZF9zbG90KDAsIDEpOwotCWlmICgocGFyLT5DaGlwc2V0ICYmIDB4ZmZmZikgPT0gMHgwMWEwKSB7CisJaWYgKChwYXItPkNoaXBzZXQgJiAweGZmZmYpID09IDB4MDFhMCkgewogCQlpbnQgYW10ID0gMDsKIAogCQlwY2lfcmVhZF9jb25maWdfZHdvcmQoZGV2LCAweDdjLCAmYW10KTsKQEAgLTM1OSw2ICszNTksNyBAQAogCWNhc2UgMHgwMTg2OgogCWNhc2UgMHgwMTg3OgogCWNhc2UgMHgwMThEOgorCWNhc2UgMHgwMjI4OgogCWNhc2UgMHgwMjg2OgogCWNhc2UgMHgwMjhDOgogCWNhc2UgMHgwMzE2OgpAQCAtMzgyLDYgKzM4MywxMCBAQAogCWNhc2UgMHgwMzRDOgogCWNhc2UgMHgwMTYwOgogCWNhc2UgMHgwMTY2OgorCWNhc2UgMHgwMTY5OgorCWNhc2UgMHgwMTZCOgorCWNhc2UgMHgwMTZDOgorCWNhc2UgMHgwMTZEOgogCWNhc2UgMHgwMEM4OgogCWNhc2UgMHgwMENDOgogCWNhc2UgMHgwMTQ0OgpAQCAtNjM5LDEyICs2NDQsMjMgQEAKIAkJcGFyLT5mcEhlaWdodCA9IE5WX1JEMzIocGFyLT5QUkFNREFDLCAweDA4MDApICsgMTsKIAkJcGFyLT5mcFN5bmNzID0gTlZfUkQzMihwYXItPlBSQU1EQUMsIDB4MDg0OCkgJiAweDMwMDAwMDMzOwogCi0JCXByaW50aygiUGFuZWwgc2l6ZSBpcyAlaSB4ICVpXG4iLCBwYXItPmZwV2lkdGgsIHBhci0+ZnBIZWlnaHQpOworCQlwcmludGsoIm52aWRpYWZiOiBQYW5lbCBzaXplIGlzICVpIHggJWlcbiIsIHBhci0+ZnBXaWR0aCwgcGFyLT5mcEhlaWdodCk7CiAJfQogCiAJaWYgKG1vbkEpCiAJCWluZm8tPm1vbnNwZWNzID0gKm1vbkE7CiAKKwlpZiAoIXBhci0+RmxhdFBhbmVsIHx8ICFwYXItPnR3b0hlYWRzKQorCQlwYXItPkZQRGl0aGVyID0gMDsKKworCXBhci0+TFZEUyA9IDA7CisJaWYgKHBhci0+RmxhdFBhbmVsICYmIHBhci0+dHdvSGVhZHMpIHsKKwkJTlZfV1IzMihwYXItPlBSQU1EQUMwLCAweDA4QjAsIDB4MDAwMTAwMDQpOworCQlpZiAocGFyLT5QUkFNREFDMFsweDA4YjRdICYgMSkKKwkJCXBhci0+TFZEUyA9IDE7CisJCXByaW50aygibnZpZGlhZmI6IFBhbmVsIGlzICVzXG4iLCBwYXItPkxWRFMgPyAiTFZEUyIgOiAiVE1EUyIpOworCX0KKwogCWtmcmVlKGVkaWRBKTsKIAlrZnJlZShlZGlkQik7CiBkb25lOgpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9udmlkaWEvbnZfdHlwZS5oIGIvZHJpdmVycy92aWRlby9udmlkaWEvbnZfdHlwZS5oCmluZGV4IGFjZGMyNjYuLjg2ZTY1ZGUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vbnZpZGlhL252X3R5cGUuaAorKysgYi9kcml2ZXJzL3ZpZGVvL252aWRpYS9udl90eXBlLmgKQEAgLTEyOSw2ICsxMjksNyBAQAogCWludCBmcEhlaWdodDsKIAlpbnQgUGFuZWxUd2VhazsKIAlpbnQgcGFuZWx0d2VhazsKKwlpbnQgTFZEUzsKIAlpbnQgcG1fc3RhdGU7CiAJdTMyIGNydGNTeW5jX3JlYWQ7CiAJdTMyIGZwU3luY3M7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL252aWRpYS9udmlkaWEuYyBiL2RyaXZlcnMvdmlkZW8vbnZpZGlhL252aWRpYS5jCmluZGV4IGViMjQxMDcuLjUzOGU5NDcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vbnZpZGlhL252aWRpYS5jCisrKyBiL2RyaXZlcnMvdmlkZW8vbnZpZGlhL252aWRpYS5jCkBAIC0xMTYwLDIwICsxMTYwLDIwIEBACiAJY2FzZSAweDAzNDA6CQkvKiBHZUZvcmNlRlggNTcwMCAqLwogCQlhcmNoID0gTlZfQVJDSF8zMDsKIAkJYnJlYWs7Ci0JY2FzZSAweDAwNDA6Ci0JY2FzZSAweDAwQzA6Ci0JY2FzZSAweDAxMjA6CisJY2FzZSAweDAwNDA6CQkvKiBHZUZvcmNlIDY4MDAgKi8KKwljYXNlIDB4MDBDMDoJCS8qIEdlRm9yY2UgNjgwMCAqLworCWNhc2UgMHgwMTIwOgkJLyogR2VGb3JjZSA2ODAwICovCiAJY2FzZSAweDAxMzA6Ci0JY2FzZSAweDAxNDA6Ci0JY2FzZSAweDAxNjA6Ci0JY2FzZSAweDAxRDA6Ci0JY2FzZSAweDAwOTA6Ci0JY2FzZSAweDAyMTA6Ci0JY2FzZSAweDAyMjA6CisJY2FzZSAweDAxNDA6CQkvKiBHZUZvcmNlIDY2MDAgKi8KKwljYXNlIDB4MDE2MDoJCS8qIEdlRm9yY2UgNjIwMCAqLworCWNhc2UgMHgwMUQwOgkJLyogR2VGb3JjZSA3MjAwLCA3MzAwLCA3NDAwICovCisJY2FzZSAweDAwOTA6CQkvKiBHZUZvcmNlIDc4MDAgKi8KKwljYXNlIDB4MDIxMDoJCS8qIEdlRm9yY2UgNjgwMCAqLworCWNhc2UgMHgwMjIwOgkJLyogR2VGb3JjZSA2MjAwICovCiAJY2FzZSAweDAyMzA6Ci0JY2FzZSAweDAyNDA6Ci0JY2FzZSAweDAyOTA6Ci0JY2FzZSAweDAzOTA6CisJY2FzZSAweDAyNDA6CQkvKiBHZUZvcmNlIDYxMDAgKi8KKwljYXNlIDB4MDI5MDoJCS8qIEdlRm9yY2UgNzkwMCAqLworCWNhc2UgMHgwMzkwOgkJLyogR2VGb3JjZSA3NjAwICovCiAJCWFyY2ggPSBOVl9BUkNIXzQwOwogCQlicmVhazsKIAljYXNlIDB4MDAyMDoJCS8qIFROVCwgVE5UMiAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9vZmZiLmMgYi9kcml2ZXJzL3ZpZGVvL29mZmIuYwppbmRleCBiYWQwZTk4Li45YTQwYmJlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL29mZmIuYworKysgYi9kcml2ZXJzL3ZpZGVvL29mZmIuYwpAQCAtMTU3LDcgKzE1Nyw3IEBACiAJCW91dF9sZTMyKHBhci0+Y21hcF9hZHIgKyAweGI0LCAocmVkIDw8IDE2IHwgZ3JlZW4gPDwgOCB8IGJsdWUpKTsKIAkJYnJlYWs7CiAJY2FzZSBjbWFwX2d4dDIwMDA6Ci0JCW91dF9sZTMyKCh1bnNpZ25lZCBfX2lvbWVtICopIHBhci0+Y21hcF9hZHIgKyByZWdubywKKwkJb3V0X2xlMzIoKCh1bnNpZ25lZCBfX2lvbWVtICopIHBhci0+Y21hcF9hZHIpICsgcmVnbm8sCiAJCQkgKHJlZCA8PCAxNiB8IGdyZWVuIDw8IDggfCBibHVlKSk7CiAJCWJyZWFrOwogCX0KQEAgLTIxMyw3ICsyMTMsNyBAQAogCQkJCW91dF9sZTMyKHBhci0+Y21hcF9hZHIgKyAweGI0LCAwKTsKIAkJCQlicmVhazsKIAkJCWNhc2UgY21hcF9neHQyMDAwOgotCQkJCW91dF9sZTMyKCh1bnNpZ25lZCBfX2lvbWVtICopIHBhci0+Y21hcF9hZHIgKyBpLAorCQkJCW91dF9sZTMyKCgodW5zaWduZWQgX19pb21lbSAqKSBwYXItPmNtYXBfYWRyKSArIGksCiAJCQkJCSAwKTsKIAkJCQlicmVhazsKIAkJCX0KQEAgLTIyNiwxMyArMjI2LDIzIEBACiBzdGF0aWMgdm9pZCBfX2lvbWVtICpvZmZiX21hcF9yZWcoc3RydWN0IGRldmljZV9ub2RlICpucCwgaW50IGluZGV4LAogCQkJCSAgdW5zaWduZWQgbG9uZyBvZmZzZXQsIHVuc2lnbmVkIGxvbmcgc2l6ZSkKIHsKLQlzdHJ1Y3QgcmVzb3VyY2UgcjsKKwljb25zdCB1MzIgKmFkZHJwOworCXU2NCBhc2l6ZSwgdGFkZHI7CisJdW5zaWduZWQgaW50IGZsYWdzOwogCi0JaWYgKG9mX2FkZHJlc3NfdG9fcmVzb3VyY2UobnAsIGluZGV4LCAmcikpCi0JCXJldHVybiAwOwotCWlmICgoci5zdGFydCArIG9mZnNldCArIHNpemUpID4gci5lbmQpCi0JCXJldHVybiAwOwotCXJldHVybiBpb3JlbWFwKHIuc3RhcnQgKyBvZmZzZXQsIHNpemUpOworCWFkZHJwID0gb2ZfZ2V0X3BjaV9hZGRyZXNzKG5wLCBpbmRleCwgJmFzaXplLCAmZmxhZ3MpOworCWlmIChhZGRycCA9PSBOVUxMKQorCQlhZGRycCA9IG9mX2dldF9hZGRyZXNzKG5wLCBpbmRleCwgJmFzaXplLCAmZmxhZ3MpOworCWlmIChhZGRycCA9PSBOVUxMKQorCQlyZXR1cm4gTlVMTDsKKwlpZiAoKGZsYWdzICYgKElPUkVTT1VSQ0VfSU8gfCBJT1JFU09VUkNFX01FTSkpID09IDApCisJCXJldHVybiBOVUxMOworCWlmICgob2Zmc2V0ICsgc2l6ZSkgPiBhc2l6ZSkKKwkJcmV0dXJuIE5VTEw7CisJdGFkZHIgPSBvZl90cmFuc2xhdGVfYWRkcmVzcyhucCwgYWRkcnApOworCWlmICh0YWRkciA9PSBPRl9CQURfQUREUikKKwkJcmV0dXJuIE5VTEw7CisJcmV0dXJuIGlvcmVtYXAodGFkZHIgKyBvZmZzZXQsIHNpemUpOwogfQogCiBzdGF0aWMgdm9pZCBfX2luaXQgb2ZmYl9pbml0X2ZiKGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IGNoYXIgKmZ1bGxfbmFtZSwKQEAgLTI4OSw3ICsyOTksNiBAQAogCiAJcGFyLT5jbWFwX3R5cGUgPSBjbWFwX3Vua25vd247CiAJaWYgKGRlcHRoID09IDgpIHsKLQkJLyogUGFsZXR0ZSBoYWNrcyBkaXNhYmxlZCBmb3Igbm93ICovCiAJCWlmIChkcCAmJiAhc3RybmNtcChuYW1lLCAiQVRZLFJhZ2UxMjgiLCAxMSkpIHsKIAkJCXBhci0+Y21hcF9hZHIgPSBvZmZiX21hcF9yZWcoZHAsIDIsIDAsIDB4MWZmZik7CiAJCQlpZiAocGFyLT5jbWFwX2FkcikKQEAgLTMxMyw3ICszMjIsOCBAQAogCQkJICAgIGlvcmVtYXAoYmFzZSArIDB4N2ZmMDAwLCAweDEwMDApICsgMHhjYzA7CiAJCQlwYXItPmNtYXBfZGF0YSA9IHBhci0+Y21hcF9hZHIgKyAxOwogCQkJcGFyLT5jbWFwX3R5cGUgPSBjbWFwX202NDsKLQkJfSBlbHNlIGlmIChkcCAmJiBkZXZpY2VfaXNfY29tcGF0aWJsZShkcCwgInBjaTEwMTQsYjciKSkgeworCQl9IGVsc2UgaWYgKGRwICYmIChkZXZpY2VfaXNfY29tcGF0aWJsZShkcCwgInBjaTEwMTQsYjciKSB8fAorCQkJCSAgZGV2aWNlX2lzX2NvbXBhdGlibGUoZHAsICJwY2kxMDE0LDIxYyIpKSkgewogCQkJcGFyLT5jbWFwX2FkciA9IG9mZmJfbWFwX3JlZyhkcCwgMCwgMHg2MDAwLCAweDEwMDApOwogCQkJaWYgKHBhci0+Y21hcF9hZHIpCiAJCQkJcGFyLT5jbWFwX3R5cGUgPSBjbWFwX2d4dDIwMDA7CkBAIC00MzMsNyArNDQzLDcgQEAKIAlwcCA9IGdldF9wcm9wZXJ0eShkcCwgImxpbnV4LGJvb3R4LWxpbmVieXRlcyIsICZsZW4pOwogCWlmIChwcCA9PSBOVUxMKQogCQlwcCA9IGdldF9wcm9wZXJ0eShkcCwgImxpbmVieXRlcyIsICZsZW4pOwotCWlmIChwcCAmJiBsZW4gPT0gc2l6ZW9mKHUzMikpCisJaWYgKHBwICYmIGxlbiA9PSBzaXplb2YodTMyKSAmJiAoKnBwICE9IDB4ZmZmZmZmZmZ1KSkKIAkJcGl0Y2ggPSAqcHA7CiAJZWxzZQogCQlwaXRjaCA9IHdpZHRoICogKChkZXB0aCArIDcpIC8gOCk7CkBAIC00OTYsNyArNTA2LDcgQEAKIAkJb2ZmYl9pbml0X2ZiKG5vX3JlYWxfbm9kZSA/ICJib290eCIgOiBkcC0+bmFtZSwKIAkJCSAgICAgbm9fcmVhbF9ub2RlID8gImRpc3BsYXkiIDogZHAtPmZ1bGxfbmFtZSwKIAkJCSAgICAgd2lkdGgsIGhlaWdodCwgZGVwdGgsIHBpdGNoLCBhZGRyZXNzLAotCQkJICAgICBub19yZWFsX25vZGUgPyBkcCA6IE5VTEwpOworCQkJICAgICBub19yZWFsX25vZGUgPyBOVUxMIDogZHApOwogCX0KIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9wbGF0aW51bWZiLmMgYi9kcml2ZXJzL3ZpZGVvL3BsYXRpbnVtZmIuYwppbmRleCA5ODNiZTNlLi5mZGIzM2NkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL3BsYXRpbnVtZmIuYworKysgYi9kcml2ZXJzL3ZpZGVvL3BsYXRpbnVtZmIuYwpAQCAtMzM5LDExICszMzksMTIgQEAKIAogCXNlbnNlID0gcmVhZF9wbGF0aW51bV9zZW5zZShwaW5mbyk7CiAJcHJpbnRrKEtFUk5fSU5GTyAicGxhdGludW1mYjogTW9uaXRvciBzZW5zZSB2YWx1ZSA9IDB4JXgsICIsIHNlbnNlKTsKLQogCWlmIChkZWZhdWx0X3Ztb2RlID09IFZNT0RFX05WUkFNKSB7CisjaWZkZWYgQ09ORklHX05WUkFNCiAJCWRlZmF1bHRfdm1vZGUgPSBudnJhbV9yZWFkX2J5dGUoTlZfVk1PREUpOwogCQlpZiAoZGVmYXVsdF92bW9kZSA8PSAwIHx8IGRlZmF1bHRfdm1vZGUgPiBWTU9ERV9NQVggfHwKIAkJICAgICFwbGF0aW51bV9yZWdfaW5pdFtkZWZhdWx0X3Ztb2RlLTFdKQorI2VuZGlmCiAJCQlkZWZhdWx0X3Ztb2RlID0gVk1PREVfQ0hPT1NFOwogCX0KIAlpZiAoZGVmYXVsdF92bW9kZSA9PSBWTU9ERV9DSE9PU0UpIHsKQEAgLTM1MSw4ICszNTIsMTAgQEAKIAl9CiAJaWYgKGRlZmF1bHRfdm1vZGUgPD0gMCB8fCBkZWZhdWx0X3Ztb2RlID4gVk1PREVfTUFYKQogCQlkZWZhdWx0X3Ztb2RlID0gVk1PREVfNjQwXzQ4MF82MDsKKyNpZmRlZiBDT05GSUdfTlZSQU0KIAlpZiAoZGVmYXVsdF9jbW9kZSA9PSBDTU9ERV9OVlJBTSkKIAkJZGVmYXVsdF9jbW9kZSA9IG52cmFtX3JlYWRfYnl0ZShOVl9DTU9ERSk7CisjZW5kaWYKIAlpZiAoZGVmYXVsdF9jbW9kZSA8IENNT0RFXzggfHwgZGVmYXVsdF9jbW9kZSA+IENNT0RFXzMyKQogCQlkZWZhdWx0X2Ntb2RlID0gQ01PREVfODsKIAkvKgpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9wbng0MDA4L3BueHJnYmZiLmMgYi9kcml2ZXJzL3ZpZGVvL3BueDQwMDgvcG54cmdiZmIuYwppbmRleCA3ZDk0NTNjLi5mMjllNjZlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL3BueDQwMDgvcG54cmdiZmIuYworKysgYi9kcml2ZXJzL3ZpZGVvL3BueDQwMDgvcG54cmdiZmIuYwpAQCAtMTU0LDcgKzE1NCw4IEBACiAJCQlnb3RvIGVycjE7CiAJfQogCi0JaWYgKCFmYl9nZXRfb3B0aW9ucygicG54cmdiZmIiLCAmb3B0aW9uKSAmJiAhc3RyY21wKG9wdGlvbiwgIm5vY3Vyc29yIikpCisJaWYgKCFmYl9nZXRfb3B0aW9ucygicG54cmdiZmIiLCAmb3B0aW9uKSAmJiBvcHRpb24gJiYKKwkJCSFzdHJjbXAob3B0aW9uLCAibm9jdXJzb3IiKSkKIAkJcmdiZmJfb3BzLmZiX2N1cnNvciA9IG5vX2N1cnNvcjsKIAogCWluZm8tPm5vZGUgPSAtMTsKQEAgLTE5MSw3ICsxOTIsNyBAQAogCiBzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciByZ2JmYl9kcml2ZXIgPSB7CiAJLmRyaXZlciA9IHsKLQkJLm5hbWUgPSAicmdiZmIiLAorCQkubmFtZSA9ICJwbng0MDA4LXJnYmZiIiwKIAl9LAogCS5wcm9iZSA9IHJnYmZiX3Byb2JlLAogCS5yZW1vdmUgPSByZ2JmYl9yZW1vdmUsCmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL3BueDQwMDgvc2R1bS5jIGIvZHJpdmVycy92aWRlby9wbng0MDA4L3NkdW0uYwppbmRleCA1MWYwZWNjLi5kMjNiZjBkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL3BueDQwMDgvc2R1bS5jCisrKyBiL2RyaXZlcnMvdmlkZW8vcG54NDAwOC9zZHVtLmMKQEAgLTg0OCw3ICs4NDgsNyBAQAogCiBzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBzZHVtX2RyaXZlciA9IHsKIAkuZHJpdmVyID0gewotCQkubmFtZSA9ICJzZHVtIiwKKwkJLm5hbWUgPSAicG54NDAwOC1zZHVtIiwKIAl9LAogCS5wcm9iZSA9IHNkdW1fcHJvYmUsCiAJLnJlbW92ZSA9IHNkdW1fcmVtb3ZlLApkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby92YWxreXJpZWZiLmMgYi9kcml2ZXJzL3ZpZGVvL3ZhbGt5cmllZmIuYwppbmRleCA0N2YyNzkyLi4wNmZjMTlhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL3ZhbGt5cmllZmIuYworKysgYi9kcml2ZXJzL3ZpZGVvL3ZhbGt5cmllZmIuYwpAQCAtMjg0LDcgKzI4NCw3IEBACiAJcHJpbnRrKEtFUk5fSU5GTyAiTW9uaXRvciBzZW5zZSB2YWx1ZSA9IDB4JXhcbiIsIHAtPnNlbnNlKTsKIAogCS8qIFRyeSB0byBwaWNrIGEgdmlkZW8gbW9kZSBvdXQgb2YgTlZSQU0gaWYgd2UgaGF2ZSBvbmUuICovCi0jaWZuZGVmIENPTkZJR19NQUMKKyNpZiAhZGVmaW5lZChDT05GSUdfTUFDKSAmJiBkZWZpbmVkKENPTkZJR19OVlJBTSkKIAlpZiAoZGVmYXVsdF92bW9kZSA9PSBWTU9ERV9OVlJBTSkgewogCQlkZWZhdWx0X3Ztb2RlID0gbnZyYW1fcmVhZF9ieXRlKE5WX1ZNT0RFKTsKIAkJaWYgKGRlZmF1bHRfdm1vZGUgPD0gMApAQCAtMjk3LDcgKzI5Nyw3IEBACiAJCWRlZmF1bHRfdm1vZGUgPSBtYWNfbWFwX21vbml0b3Jfc2Vuc2UocC0+c2Vuc2UpOwogCWlmICghdmFsa3lyaWVfcmVnX2luaXRbZGVmYXVsdF92bW9kZSAtIDFdKQogCQlkZWZhdWx0X3Ztb2RlID0gVk1PREVfNjQwXzQ4MF82NzsKLSNpZm5kZWYgQ09ORklHX01BQworI2lmICFkZWZpbmVkKENPTkZJR19NQUMpICYmIGRlZmluZWQoQ09ORklHX05WUkFNKQogCWlmIChkZWZhdWx0X2Ntb2RlID09IENNT0RFX05WUkFNKQogCQlkZWZhdWx0X2Ntb2RlID0gbnZyYW1fcmVhZF9ieXRlKE5WX0NNT0RFKTsKICNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy93MS9LY29uZmlnIGIvZHJpdmVycy93MS9LY29uZmlnCmluZGV4IDI3YzlkMDUuLmMyODdhOWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdzEvS2NvbmZpZworKysgYi9kcml2ZXJzL3cxL0tjb25maWcKQEAgLTIsNyArMiw2IEBACiAKIGNvbmZpZyBXMQogCXRyaXN0YXRlICJEYWxsYXMncyAxLXdpcmUgc3VwcG9ydCIKLQlkZXBlbmRzIG9uIENPTk5FQ1RPUgogCS0tLWhlbHAtLS0KIAkgIERhbGxhcycgMS13aXJlIGJ1cyBpcyB1c2VmdWwgdG8gY29ubmVjdCBzbG93IDEtcGluIGRldmljZXMKIAkgIHN1Y2ggYXMgaUJ1dHRvbnMgYW5kIHRoZXJtYWwgc2Vuc29ycy4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdzEvbWFzdGVycy9tYXRyb3hfdzEuYyBiL2RyaXZlcnMvdzEvbWFzdGVycy9tYXRyb3hfdzEuYwppbmRleCAyNzg4YjhjLi42ZjlkODgwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3cxL21hc3RlcnMvbWF0cm94X3cxLmMKKysrIGIvZHJpdmVycy93MS9tYXN0ZXJzL21hdHJveF93MS5jCkBAIC0yMTUsNiArMjE1LDggQEAKIAlyZXR1cm4gMDsKIAogZXJyX291dF9mcmVlX2RldmljZToKKwlpZiAoZGV2LT52aXJ0X2FkZHIpCisJCWlvdW5tYXAoZGV2LT52aXJ0X2FkZHIpOwogCWtmcmVlKGRldik7CiAKIAlyZXR1cm4gZXJyOwpkaWZmIC0tZ2l0IGEvZnMvS2NvbmZpZyBiL2ZzL0tjb25maWcKaW5kZXggNTk5ZGU1NC4uN2IxNTExZCAxMDA2NDQKLS0tIGEvZnMvS2NvbmZpZworKysgYi9mcy9LY29uZmlnCkBAIC0xNDAsNiArMTQwLDczIEBACiAJICBJZiB5b3UgYXJlIG5vdCB1c2luZyBhIHNlY3VyaXR5IG1vZHVsZSB0aGF0IHJlcXVpcmVzIHVzaW5nCiAJICBleHRlbmRlZCBhdHRyaWJ1dGVzIGZvciBmaWxlIHNlY3VyaXR5IGxhYmVscywgc2F5IE4uCiAKK2NvbmZpZyBFWFQ0REVWX0ZTCisJdHJpc3RhdGUgIkV4dDRkZXYvZXh0NCBleHRlbmRlZCBmcyBzdXBwb3J0IGRldmVsb3BtZW50IChFWFBFUklNRU5UQUwpIgorCWRlcGVuZHMgb24gRVhQRVJJTUVOVEFMCisJc2VsZWN0IEpCRDIKKwloZWxwCisJICBFeHQ0ZGV2IGlzIGEgcHJlZGVjZXNzb3IgZmlsZXN5c3RlbSBvZiB0aGUgbmV4dCBnZW5lcmF0aW9uCisJICBleHRlbmRlZCBmcyBleHQ0LCBiYXNlZCBvbiBleHQzIGZpbGVzeXN0ZW0gY29kZS4gSXQgd2lsbCBiZQorCSAgcmVuYW1lZCBleHQ0IGZzIGxhdGVyLCBvbmNlIGV4dDRkZXYgaXMgbWF0dXJlIGFuZCBzdGFiaWxpemVkLgorCisJICBVbmxpa2UgdGhlIGNoYW5nZSBmcm9tIGV4dDIgZmlsZXN5c3RlbSB0byBleHQzIGZpbGVzeXN0ZW0sCisJICB0aGUgb24tZGlzayBmb3JtYXQgb2YgZXh0NGRldiBpcyBub3QgdGhlIHNhbWUgYXMgZXh0MyBhbnkgbW9yZToKKwkgIGl0IGlzIGJhc2VkIG9uIGV4dGVudCBtYXBzIGFuZCBpdCBzdXBwb3J0cyA0OC1iaXQgcGh5c2ljYWwgYmxvY2sKKwkgIG51bWJlcnMuIFRoZXNlIGNvbWJpbmVkIG9uLWRpc2sgZm9ybWF0IGNoYW5nZXMgd2lsbCBhbGxvdworCSAgZXh0NGRldi9leHQ0IHRvIGhhbmRsZSBtb3JlIHRoYW4gMTYgVEIgZmlsZXN5c3RlbSB2b2x1bWVzIC0tCisJICBhIGhhcmQgbGltaXQgdGhhdCBleHQzIGNhbm5vdCBvdmVyY29tZSB3aXRob3V0IGNoYW5naW5nIHRoZQorCSAgb24tZGlzayBmb3JtYXQuCisKKwkgIE90aGVyIHRoYW4gZXh0ZW50IG1hcHMgYW5kIDQ4LWJpdCBibG9jayBudW1iZXJzLCBleHQ0ZGV2IGFsc28gaXMKKwkgIGxpa2VseSB0byBoYXZlIG90aGVyIG5ldyBmZWF0dXJlcyBzdWNoIGFzIHBlcnNpc3RlbnQgcHJlYWxsb2NhdGlvbiwKKwkgIGhpZ2ggcmVzb2x1dGlvbiB0aW1lIHN0YW1wcywgYW5kIGxhcmdlciBmaWxlIHN1cHBvcnQgZXRjLiAgVGhlc2UKKwkgIGZlYXR1cmVzIHdpbGwgYmUgYWRkZWQgdG8gZXh0NGRldiBncmFkdWFsbHkuCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBmaWxlIHN5c3RlbSBzdXBwb3J0IGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlLiBUaGUKKwkgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCBleHQ0ZGV2LiAgQmUgYXdhcmUsIGhvd2V2ZXIsIHRoYXQgdGhlIGZpbGVzeXN0ZW0KKwkgIG9mIHlvdXIgcm9vdCBwYXJ0aXRpb24gKHRoZSBvbmUgY29udGFpbmluZyB0aGUgZGlyZWN0b3J5IC8pIGNhbm5vdAorCSAgYmUgY29tcGlsZWQgYXMgYSBtb2R1bGUsIGFuZCBzbyB0aGlzIGNvdWxkIGJlIGRhbmdlcm91cy4KKworCSAgSWYgdW5zdXJlLCBzYXkgTi4KKworY29uZmlnIEVYVDRERVZfRlNfWEFUVFIKKwlib29sICJFeHQ0ZGV2IGV4dGVuZGVkIGF0dHJpYnV0ZXMiCisJZGVwZW5kcyBvbiBFWFQ0REVWX0ZTCisJZGVmYXVsdCB5CisJaGVscAorCSAgRXh0ZW5kZWQgYXR0cmlidXRlcyBhcmUgbmFtZTp2YWx1ZSBwYWlycyBhc3NvY2lhdGVkIHdpdGggaW5vZGVzIGJ5CisJICB0aGUga2VybmVsIG9yIGJ5IHVzZXJzIChzZWUgdGhlIGF0dHIoNSkgbWFudWFsIHBhZ2UsIG9yIHZpc2l0CisJICA8aHR0cDovL2FjbC5iZXN0Yml0cy5hdC8+IGZvciBkZXRhaWxzKS4KKworCSAgSWYgdW5zdXJlLCBzYXkgTi4KKworCSAgWW91IG5lZWQgdGhpcyBmb3IgUE9TSVggQUNMIHN1cHBvcnQgb24gZXh0NGRldi9leHQ0LgorCitjb25maWcgRVhUNERFVl9GU19QT1NJWF9BQ0wKKwlib29sICJFeHQ0ZGV2IFBPU0lYIEFjY2VzcyBDb250cm9sIExpc3RzIgorCWRlcGVuZHMgb24gRVhUNERFVl9GU19YQVRUUgorCXNlbGVjdCBGU19QT1NJWF9BQ0wKKwloZWxwCisJICBQT1NJWCBBY2Nlc3MgQ29udHJvbCBMaXN0cyAoQUNMcykgc3VwcG9ydCBwZXJtaXNzaW9ucyBmb3IgdXNlcnMgYW5kCisJICBncm91cHMgYmV5b25kIHRoZSBvd25lci9ncm91cC93b3JsZCBzY2hlbWUuCisKKwkgIFRvIGxlYXJuIG1vcmUgYWJvdXQgQWNjZXNzIENvbnRyb2wgTGlzdHMsIHZpc2l0IHRoZSBQT1NJWCBBQ0xzIGZvcgorCSAgTGludXggd2Vic2l0ZSA8aHR0cDovL2FjbC5iZXN0Yml0cy5hdC8+LgorCisJICBJZiB5b3UgZG9uJ3Qga25vdyB3aGF0IEFjY2VzcyBDb250cm9sIExpc3RzIGFyZSwgc2F5IE4KKworY29uZmlnIEVYVDRERVZfRlNfU0VDVVJJVFkKKwlib29sICJFeHQ0ZGV2IFNlY3VyaXR5IExhYmVscyIKKwlkZXBlbmRzIG9uIEVYVDRERVZfRlNfWEFUVFIKKwloZWxwCisJICBTZWN1cml0eSBsYWJlbHMgc3VwcG9ydCBhbHRlcm5hdGl2ZSBhY2Nlc3MgY29udHJvbCBtb2RlbHMKKwkgIGltcGxlbWVudGVkIGJ5IHNlY3VyaXR5IG1vZHVsZXMgbGlrZSBTRUxpbnV4LiAgVGhpcyBvcHRpb24KKwkgIGVuYWJsZXMgYW4gZXh0ZW5kZWQgYXR0cmlidXRlIGhhbmRsZXIgZm9yIGZpbGUgc2VjdXJpdHkKKwkgIGxhYmVscyBpbiB0aGUgZXh0NGRldi9leHQ0IGZpbGVzeXN0ZW0uCisKKwkgIElmIHlvdSBhcmUgbm90IHVzaW5nIGEgc2VjdXJpdHkgbW9kdWxlIHRoYXQgcmVxdWlyZXMgdXNpbmcKKwkgIGV4dGVuZGVkIGF0dHJpYnV0ZXMgZm9yIGZpbGUgc2VjdXJpdHkgbGFiZWxzLCBzYXkgTi4KKwogY29uZmlnIEpCRAogCXRyaXN0YXRlCiAJaGVscApAQCAtMTcyLDEyICsyMzksNDQgQEAKIAkgIGdlbmVyYXRlZC4gIFRvIHR1cm4gZGVidWdnaW5nIG9mZiBhZ2FpbiwgZG8KIAkgICJlY2hvIDAgPiAvcHJvYy9zeXMvZnMvamJkLWRlYnVnIi4KIAotY29uZmlnIEZTX01CQ0FDSEUKLSMgTWV0YSBibG9jayBjYWNoZSBmb3IgRXh0ZW5kZWQgQXR0cmlidXRlcyAoZXh0Mi9leHQzKQorY29uZmlnIEpCRDIKIAl0cmlzdGF0ZQotCWRlcGVuZHMgb24gRVhUMl9GU19YQVRUUiB8fCBFWFQzX0ZTX1hBVFRSCi0JZGVmYXVsdCB5IGlmIEVYVDJfRlM9eSB8fCBFWFQzX0ZTPXkKLQlkZWZhdWx0IG0gaWYgRVhUMl9GUz1tIHx8IEVYVDNfRlM9bQorCWhlbHAKKwkgIFRoaXMgaXMgYSBnZW5lcmljIGpvdXJuYWxpbmcgbGF5ZXIgZm9yIGJsb2NrIGRldmljZXMgdGhhdCBzdXBwb3J0CisJICBib3RoIDMyLWJpdCBhbmQgNjQtYml0IGJsb2NrIG51bWJlcnMuICBJdCBpcyBjdXJyZW50bHkgdXNlZCBieQorCSAgdGhlIGV4dDRkZXYvZXh0NCBmaWxlc3lzdGVtLCBidXQgaXQgY291bGQgYWxzbyBiZSB1c2VkIHRvIGFkZAorCSAgam91cm5hbCBzdXBwb3J0IHRvIG90aGVyIGZpbGUgc3lzdGVtcyBvciBibG9jayBkZXZpY2VzIHN1Y2gKKwkgIGFzIFJBSUQgb3IgTFZNLgorCisJICBJZiB5b3UgYXJlIHVzaW5nIGV4dDRkZXYvZXh0NCwgeW91IG5lZWQgdG8gc2F5IFkgaGVyZS4gSWYgeW91IGFyZSBub3QKKwkgIHVzaW5nIGV4dDRkZXYvZXh0NCB0aGVuIHlvdSB3aWxsIHByb2JhYmx5IHdhbnQgdG8gc2F5IE4uCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBkZXZpY2UgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmUuIFRoZSBtb2R1bGUgd2lsbCBiZQorCSAgY2FsbGVkIGpiZDIuICBJZiB5b3UgYXJlIGNvbXBpbGluZyBleHQ0ZGV2L2V4dDQgaW50byB0aGUga2VybmVsLAorCSAgeW91IGNhbm5vdCBjb21waWxlIHRoaXMgY29kZSBhcyBhIG1vZHVsZS4KKworY29uZmlnIEpCRDJfREVCVUcKKwlib29sICJKQkQyIChleHQ0ZGV2L2V4dDQpIGRlYnVnZ2luZyBzdXBwb3J0IgorCWRlcGVuZHMgb24gSkJEMgorCWhlbHAKKwkgIElmIHlvdSBhcmUgdXNpbmcgdGhlIGV4dDRkZXYvZXh0NCBqb3VybmFsZWQgZmlsZSBzeXN0ZW0gKG9yCisJICBwb3RlbnRpYWxseSBhbnkgb3RoZXIgZmlsZXN5c3RlbS9kZXZpY2UgdXNpbmcgSkJEMiksIHRoaXMgb3B0aW9uCisJICBhbGxvd3MgeW91IHRvIGVuYWJsZSBkZWJ1Z2dpbmcgb3V0cHV0IHdoaWxlIHRoZSBzeXN0ZW0gaXMgcnVubmluZywKKwkgIGluIG9yZGVyIHRvIGhlbHAgdHJhY2sgZG93biBhbnkgcHJvYmxlbXMgeW91IGFyZSBoYXZpbmcuCisJICBCeSBkZWZhdWx0LCB0aGUgZGVidWdnaW5nIG91dHB1dCB3aWxsIGJlIHR1cm5lZCBvZmYuCisKKwkgIElmIHlvdSBzZWxlY3QgWSBoZXJlLCB0aGVuIHlvdSB3aWxsIGJlIGFibGUgdG8gdHVybiBvbiBkZWJ1Z2dpbmcKKwkgIHdpdGggImVjaG8gTiA+IC9wcm9jL3N5cy9mcy9qYmQyLWRlYnVnIiwgd2hlcmUgTiBpcyBhIG51bWJlciBiZXR3ZWVuCisJICAxIGFuZCA1LiBUaGUgaGlnaGVyIHRoZSBudW1iZXIsIHRoZSBtb3JlIGRlYnVnZ2luZyBvdXRwdXQgaXMKKwkgIGdlbmVyYXRlZC4gIFRvIHR1cm4gZGVidWdnaW5nIG9mZiBhZ2FpbiwgZG8KKwkgICJlY2hvIDAgPiAvcHJvYy9zeXMvZnMvamJkMi1kZWJ1ZyIuCisKK2NvbmZpZyBGU19NQkNBQ0hFCisjIE1ldGEgYmxvY2sgY2FjaGUgZm9yIEV4dGVuZGVkIEF0dHJpYnV0ZXMgKGV4dDIvZXh0My9leHQ0KQorCXRyaXN0YXRlCisJZGVwZW5kcyBvbiBFWFQyX0ZTX1hBVFRSIHx8IEVYVDNfRlNfWEFUVFIgfHwgRVhUNERFVl9GU19YQVRUUgorCWRlZmF1bHQgeSBpZiBFWFQyX0ZTPXkgfHwgRVhUM19GUz15IHx8IEVYVDRERVZfRlM9eQorCWRlZmF1bHQgbSBpZiBFWFQyX0ZTPW0gfHwgRVhUM19GUz1tIHx8IEVYVDRERVZfRlM9bQogCiBjb25maWcgUkVJU0VSRlNfRlMKIAl0cmlzdGF0ZSAiUmVpc2VyZnMgc3VwcG9ydCIKQEAgLTUzNSw2ICs2MzQsMTAgQEAKIAkgIElmIHlvdSB3YW50IHRvIGRldmVsb3AgYSB1c2Vyc3BhY2UgRlMsIG9yIGlmIHlvdSB3YW50IHRvIHVzZQogCSAgYSBmaWxlc3lzdGVtIGJhc2VkIG9uIEZVU0UsIGFuc3dlciBZIG9yIE0uCiAKK2NvbmZpZyBHRU5FUklDX0FDTAorCWJvb2wKKwlzZWxlY3QgRlNfUE9TSVhfQUNMCisKIGlmIEJMT0NLCiBtZW51ICJDRC1ST00vRFZEIEZpbGVzeXN0ZW1zIgogCkBAIC0xNjc0LDYgKzE3NzcsNyBAQAogCXNlbGVjdCBDUllQVE8KIAlzZWxlY3QgQ1JZUFRPX01ENQogCXNlbGVjdCBDUllQVE9fREVTCisJc2VsZWN0IENSWVBUT19DQkMKIAloZWxwCiAJICBQcm92aWRlcyBmb3Igc2VjdXJlIFJQQyBjYWxscyBieSBtZWFucyBvZiBhIGdzcy1hcGkKIAkgIG1lY2hhbmlzbSBiYXNlZCBvbiBLZXJiZXJvcyBWNS4gVGhpcyBpcyByZXF1aXJlZCBmb3IKQEAgLTE2OTIsNiArMTc5Niw3IEBACiAJc2VsZWN0IENSWVBUT19NRDUKIAlzZWxlY3QgQ1JZUFRPX0RFUwogCXNlbGVjdCBDUllQVE9fQ0FTVDUKKwlzZWxlY3QgQ1JZUFRPX0NCQwogCWhlbHAKIAkgIFByb3ZpZGVzIGZvciBzZWN1cmUgUlBDIGNhbGxzIGJ5IG1lYW5zIG9mIGEgZ3NzLWFwaQogCSAgbWVjaGFuaXNtIGJhc2VkIG9uIHRoZSBTUEtNMyBwdWJsaWMta2V5IG1lY2hhbmlzbS4KQEAgLTE4ODcsNyArMTk5Miw3IEBACiBjb25maWcgQ0lGU19VUENBTEwKIAkgIGJvb2wgIktlcmJlcm9zL1NQTkVHTyBhZHZhbmNlZCBzZXNzaW9uIHNldHVwIChFWFBFUklNRU5UQUwpIgogCSAgZGVwZW5kcyBvbiBDSUZTX0VYUEVSSU1FTlRBTAotCSAgc2VsZWN0IENPTk5FQ1RPUgorCSAgZGVwZW5kcyBvbiBDT05ORUNUT1IKIAkgIGhlbHAKIAkgICAgRW5hYmxlcyBhbiB1cGNhbGwgbWVjaGFuaXNtIGZvciBDSUZTIHdoaWNoIHdpbGwgYmUgdXNlZCB0byBjb250YWN0CiAJICAgIHVzZXJzcGFjZSBoZWxwZXIgdXRpbGl0aWVzIHRvIHByb3ZpZGUgU1BORUdPIHBhY2thZ2VkIEtlcmJlcm9zCkBAIC0xOTU1LDggKzIwNjAsNyBAQAogCSAgRm9yIG1vc3QgY2FzZXMgeW91IHByb2JhYmx5IHdhbnQgdG8gc2F5IE4uCiAKIGNvbmZpZyBBRlNfRlMKLSMgZm9yIGZzL25scy9Db25maWcuaW4KLQl0cmlzdGF0ZSAiQW5kcmV3IEZpbGUgU3lzdGVtIHN1cHBvcnQgKEFGUykgKEV4cGVyaW1lbnRhbCkiCisJdHJpc3RhdGUgIkFuZHJldyBGaWxlIFN5c3RlbSBzdXBwb3J0IChBRlMpIChFWFBFUklNRU5UQUwpIgogCWRlcGVuZHMgb24gSU5FVCAmJiBFWFBFUklNRU5UQUwKIAlzZWxlY3QgUlhSUEMKIAloZWxwCkBAIC0xOTgxLDEwICsyMDg1LDYgQEAKIAogCSAgSWYgdW5zdXJlLCBzYXkgTi4KIAotY29uZmlnIEdFTkVSSUNfQUNMCi0JYm9vbAotCXNlbGVjdCBGU19QT1NJWF9BQ0wKLQogZW5kbWVudQogCiBpZiBCTE9DSwpkaWZmIC0tZ2l0IGEvZnMvTWFrZWZpbGUgYi9mcy9NYWtlZmlsZQppbmRleCBkZjYxNGVhLi45YTVjZTkzIDEwMDY0NAotLS0gYS9mcy9NYWtlZmlsZQorKysgYi9mcy9NYWtlZmlsZQpAQCAtNjIsNyArNjIsOSBAQAogIyBEbyBub3QgYWRkIGFueSBmaWxlc3lzdGVtcyBiZWZvcmUgdGhpcyBsaW5lCiBvYmotJChDT05GSUdfUkVJU0VSRlNfRlMpCSs9IHJlaXNlcmZzLwogb2JqLSQoQ09ORklHX0VYVDNfRlMpCQkrPSBleHQzLyAjIEJlZm9yZSBleHQyIHNvIHJvb3QgZnMgY2FuIGJlIGV4dDMKK29iai0kKENPTkZJR19FWFQ0REVWX0ZTKQkrPSBleHQ0LyAjIEJlZm9yZSBleHQyIHNvIHJvb3QgZnMgY2FuIGJlIGV4dDRkZXYKIG9iai0kKENPTkZJR19KQkQpCQkrPSBqYmQvCitvYmotJChDT05GSUdfSkJEMikJCSs9IGpiZDIvCiBvYmotJChDT05GSUdfRVhUMl9GUykJCSs9IGV4dDIvCiBvYmotJChDT05GSUdfQ1JBTUZTKQkJKz0gY3JhbWZzLwogb2JqLSQoQ09ORklHX1JBTUZTKQkJKz0gcmFtZnMvCmRpZmYgLS1naXQgYS9mcy9hZnMvZGlyLmMgYi9mcy9hZnMvZGlyLmMKaW5kZXggY2Y4YTJjYi4uYTZlYzc1YyAxMDA2NDQKLS0tIGEvZnMvYWZzL2Rpci5jCisrKyBiL2ZzL2Fmcy9kaXIuYwpAQCAtMjExLDggKzIxMSw4IEBACiB7CiAJX2VudGVyKCJ7JWx1fSIsIGlub2RlLT5pX2lubyk7CiAKLQlCVUdfT04oc2l6ZW9mKHVuaW9uIGFmc19kaXJfYmxvY2spICE9IDIwNDgpOwotCUJVR19PTihzaXplb2YodW5pb24gYWZzX2RpcmVudCkgIT0gMzIpOworCUJVSUxEX0JVR19PTihzaXplb2YodW5pb24gYWZzX2Rpcl9ibG9jaykgIT0gMjA0OCk7CisJQlVJTERfQlVHX09OKHNpemVvZih1bmlvbiBhZnNfZGlyZW50KSAhPSAzMik7CiAKIAlpZiAoQUZTX0ZTX0koaW5vZGUpLT5mbGFncyAmIEFGU19WTk9ERV9ERUxFVEVEKQogCQlyZXR1cm4gLUVOT0VOVDsKQEAgLTQ0Niw4ICs0NDYsOCBAQAogCV9lbnRlcigieyVsdX0sJXB7JXN9IiwgZGlyLT5pX2lubywgZGVudHJ5LCBkZW50cnktPmRfbmFtZS5uYW1lKTsKIAogCS8qIGluc2FuaXR5IGNoZWNrcyBmaXJzdCAqLwotCUJVR19PTihzaXplb2YodW5pb24gYWZzX2Rpcl9ibG9jaykgIT0gMjA0OCk7Ci0JQlVHX09OKHNpemVvZih1bmlvbiBhZnNfZGlyZW50KSAhPSAzMik7CisJQlVJTERfQlVHX09OKHNpemVvZih1bmlvbiBhZnNfZGlyX2Jsb2NrKSAhPSAyMDQ4KTsKKwlCVUlMRF9CVUdfT04oc2l6ZW9mKHVuaW9uIGFmc19kaXJlbnQpICE9IDMyKTsKIAogCWlmIChkZW50cnktPmRfbmFtZS5sZW4gPiAyNTUpIHsKIAkJX2xlYXZlKCIgPSAtRU5BTUVUT09MT05HIik7CmRpZmYgLS1naXQgYS9mcy9hdXRvZnMvYXV0b2ZzX2kuaCBiL2ZzL2F1dG9mcy9hdXRvZnNfaS5oCmluZGV4IGM3NzAwZDkuLjkwNmJhNWMgMTAwNjQ0Ci0tLSBhL2ZzL2F1dG9mcy9hdXRvZnNfaS5oCisrKyBiL2ZzL2F1dG9mcy9hdXRvZnNfaS5oCkBAIC0xNDksNiArMTQ5LDcgQEAKIC8qIEluaXRpYWxpemluZyBmdW5jdGlvbiAqLwogCiBpbnQgYXV0b2ZzX2ZpbGxfc3VwZXIoc3RydWN0IHN1cGVyX2Jsb2NrICosIHZvaWQgKiwgaW50KTsKK3ZvaWQgYXV0b2ZzX2tpbGxfc2Ioc3RydWN0IHN1cGVyX2Jsb2NrICpzYik7CiAKIC8qIFF1ZXVlIG1hbmFnZW1lbnQgZnVuY3Rpb25zICovCiAKZGlmZiAtLWdpdCBhL2ZzL2F1dG9mcy9kaXJoYXNoLmMgYi9mcy9hdXRvZnMvZGlyaGFzaC5jCmluZGV4IDNmZGVkMzguLmJmOGM4YWYgMTAwNjQ0Ci0tLSBhL2ZzL2F1dG9mcy9kaXJoYXNoLmMKKysrIGIvZnMvYXV0b2ZzL2Rpcmhhc2guYwpAQCAtMjQ2LDUgKzI0Niw0IEBACiAJCQlrZnJlZShlbnQpOwogCQl9CiAJfQotCXNocmlua19kY2FjaGVfc2Ioc2JpLT5zYik7CiB9CmRpZmYgLS1naXQgYS9mcy9hdXRvZnMvaW5pdC5jIGIvZnMvYXV0b2ZzL2luaXQuYwppbmRleCBhY2ExMjM3Li5jZWE1MjE5IDEwMDY0NAotLS0gYS9mcy9hdXRvZnMvaW5pdC5jCisrKyBiL2ZzL2F1dG9mcy9pbml0LmMKQEAgLTI0LDcgKzI0LDcgQEAKIAkub3duZXIJCT0gVEhJU19NT0RVTEUsCiAJLm5hbWUJCT0gImF1dG9mcyIsCiAJLmdldF9zYgkJPSBhdXRvZnNfZ2V0X3NiLAotCS5raWxsX3NiCT0ga2lsbF9hbm9uX3N1cGVyLAorCS5raWxsX3NiCT0gYXV0b2ZzX2tpbGxfc2IsCiB9OwogCiBzdGF0aWMgaW50IF9faW5pdCBpbml0X2F1dG9mc19mcyh2b2lkKQpkaWZmIC0tZ2l0IGEvZnMvYXV0b2ZzL2lub2RlLmMgYi9mcy9hdXRvZnMvaW5vZGUuYwppbmRleCAyYzk3NTliYS4uMzhlZGU1YyAxMDA2NDQKLS0tIGEvZnMvYXV0b2ZzL2lub2RlLmMKKysrIGIvZnMvYXV0b2ZzL2lub2RlLmMKQEAgLTIwLDExICsyMCwxOSBAQAogI2luY2x1ZGUgImF1dG9mc19pLmgiCiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAKLXN0YXRpYyB2b2lkIGF1dG9mc19wdXRfc3VwZXIoc3RydWN0IHN1cGVyX2Jsb2NrICpzYikKK3ZvaWQgYXV0b2ZzX2tpbGxfc2Ioc3RydWN0IHN1cGVyX2Jsb2NrICpzYikKIHsKIAlzdHJ1Y3QgYXV0b2ZzX3NiX2luZm8gKnNiaSA9IGF1dG9mc19zYmkoc2IpOwogCXVuc2lnbmVkIGludCBuOwogCisJLyoKKwkgKiBJbiB0aGUgZXZlbnQgb2YgYSBmYWlsdXJlIGluIGdldF9zYl9ub2RldiB0aGUgc3VwZXJibG9jaworCSAqIGluZm8gaXMgbm90IHByZXNlbnQgc28gbm90aGluZyBlbHNlIGhhcyBiZWVuIHNldHVwLCBzbworCSAqIGp1c3QgZXhpdCB3aGVuIHdlIGFyZSBjYWxsZWQgZnJvbSBkZWFjdGl2YXRlX3N1cGVyLgorCSAqLworCWlmICghc2JpKQorCQlyZXR1cm47CisKIAlpZiAoICFzYmktPmNhdGF0b25pYyApCiAJCWF1dG9mc19jYXRhdG9uaWNfbW9kZShzYmkpOyAvKiBGcmVlIHdhaXQgcXVldWVzLCBjbG9zZSBwaXBlICovCiAKQEAgLTM3LDEzICs0NSwxMyBAQAogCWtmcmVlKHNiLT5zX2ZzX2luZm8pOwogCiAJRFBSSU5USygoImF1dG9mczogc2h1dHRpbmcgZG93blxuIikpOworCWtpbGxfYW5vbl9zdXBlcihzYik7CiB9CiAKIHN0YXRpYyB2b2lkIGF1dG9mc19yZWFkX2lub2RlKHN0cnVjdCBpbm9kZSAqaW5vZGUpOwogCiBzdGF0aWMgc3RydWN0IHN1cGVyX29wZXJhdGlvbnMgYXV0b2ZzX3NvcHMgPSB7CiAJLnJlYWRfaW5vZGUJPSBhdXRvZnNfcmVhZF9pbm9kZSwKLQkucHV0X3N1cGVyCT0gYXV0b2ZzX3B1dF9zdXBlciwKIAkuc3RhdGZzCQk9IHNpbXBsZV9zdGF0ZnMsCiB9OwogCkBAIC0xMzYsNyArMTQ0LDggQEAKIAogCXMtPnNfZnNfaW5mbyA9IHNiaTsKIAlzYmktPm1hZ2ljID0gQVVUT0ZTX1NCSV9NQUdJQzsKLQlzYmktPmNhdGF0b25pYyA9IDA7CisJc2JpLT5waXBlID0gTlVMTDsKKwlzYmktPmNhdGF0b25pYyA9IDE7CiAJc2JpLT5leHBfdGltZW91dCA9IDA7CiAJc2JpLT5vel9wZ3JwID0gcHJvY2Vzc19ncm91cChjdXJyZW50KTsKIAlhdXRvZnNfaW5pdGlhbGl6ZV9oYXNoKCZzYmktPmRpcmhhc2gpOwpAQCAtMTgwLDYgKzE4OSw3IEBACiAJaWYgKCAhcGlwZS0+Zl9vcCB8fCAhcGlwZS0+Zl9vcC0+d3JpdGUgKQogCQlnb3RvIGZhaWxfZnB1dDsKIAlzYmktPnBpcGUgPSBwaXBlOworCXNiaS0+Y2F0YXRvbmljID0gMDsKIAogCS8qCiAJICogU3VjY2VzcyEgSW5zdGFsbCB0aGUgcm9vdCBkZW50cnkgbm93IHRvIGluZGljYXRlIGNvbXBsZXRpb24uCkBAIC0xOTgsNiArMjA4LDggQEAKIAlpcHV0KHJvb3RfaW5vZGUpOwogZmFpbF9mcmVlOgogCWtmcmVlKHNiaSk7CisJcy0+c19mc19pbmZvID0gTlVMTDsKKwlraWxsX2Fub25fc3VwZXIocyk7CiBmYWlsX3VubG9jazoKIAlyZXR1cm4gLUVJTlZBTDsKIH0KZGlmZiAtLWdpdCBhL2ZzL2F1dG9mcy93YWl0cS5jIGIvZnMvYXV0b2ZzL3dhaXRxLmMKaW5kZXggNjMzZjYyOC4uMTlhOWNhZiAxMDA2NDQKLS0tIGEvZnMvYXV0b2ZzL3dhaXRxLmMKKysrIGIvZnMvYXV0b2ZzL3dhaXRxLmMKQEAgLTQxLDYgKzQxLDcgQEAKIAkJd3EgPSBud3E7CiAJfQogCWZwdXQoc2JpLT5waXBlKTsJLyogQ2xvc2UgdGhlIHBpcGUgKi8KKwlzYmktPnBpcGUgPSBOVUxMOwogCWF1dG9mc19oYXNoX2RwdXRhbGwoJnNiaS0+ZGlyaGFzaCk7IC8qIFJlbW92ZSBhbGwgZGVudHJ5IHBvaW50ZXJzICovCiB9CiAKZGlmZiAtLWdpdCBhL2ZzL2F1dG9mczQvYXV0b2ZzX2kuaCBiL2ZzL2F1dG9mczQvYXV0b2ZzX2kuaAppbmRleCA0ODBhYjE3Li5iMTNmMzJjIDEwMDY0NAotLS0gYS9mcy9hdXRvZnM0L2F1dG9mc19pLmgKKysrIGIvZnMvYXV0b2ZzNC9hdXRvZnNfaS5oCkBAIC05NCw3ICs5NCw2IEBACiAKIHN0cnVjdCBhdXRvZnNfc2JfaW5mbyB7CiAJdTMyIG1hZ2ljOwotCXN0cnVjdCBkZW50cnkgKnJvb3Q7CiAJaW50IHBpcGVmZDsKIAlzdHJ1Y3QgZmlsZSAqcGlwZTsKIAlwaWRfdCBvel9wZ3JwOwpAQCAtMjI5LDQgKzIyOCw0IEBACiB9CiAKIHZvaWQgYXV0b2ZzNF9kZW50cnlfcmVsZWFzZShzdHJ1Y3QgZGVudHJ5ICopOwotCitleHRlcm4gdm9pZCBhdXRvZnM0X2tpbGxfc2Ioc3RydWN0IHN1cGVyX2Jsb2NrICopOwpkaWZmIC0tZ2l0IGEvZnMvYXV0b2ZzNC9pbml0LmMgYi9mcy9hdXRvZnM0L2luaXQuYwppbmRleCA1ZDkxOTMzLi43MjNhMWM1ZSAxMDA2NDQKLS0tIGEvZnMvYXV0b2ZzNC9pbml0LmMKKysrIGIvZnMvYXV0b2ZzNC9pbml0LmMKQEAgLTI0LDcgKzI0LDcgQEAKIAkub3duZXIJCT0gVEhJU19NT0RVTEUsCiAJLm5hbWUJCT0gImF1dG9mcyIsCiAJLmdldF9zYgkJPSBhdXRvZnNfZ2V0X3NiLAotCS5raWxsX3NiCT0ga2lsbF9hbm9uX3N1cGVyLAorCS5raWxsX3NiCT0gYXV0b2ZzNF9raWxsX3NiLAogfTsKIAogc3RhdGljIGludCBfX2luaXQgaW5pdF9hdXRvZnM0X2ZzKHZvaWQpCmRpZmYgLS1naXQgYS9mcy9hdXRvZnM0L2lub2RlLmMgYi9mcy9hdXRvZnM0L2lub2RlLmMKaW5kZXggODAwY2U4Ny4uY2U3YzBmMSAxMDA2NDQKLS0tIGEvZnMvYXV0b2ZzNC9pbm9kZS5jCisrKyBiL2ZzL2F1dG9mczQvaW5vZGUuYwpAQCAtOTYsOSArOTYsMTIgQEAKICAqLwogc3RhdGljIHZvaWQgYXV0b2ZzNF9mb3JjZV9yZWxlYXNlKHN0cnVjdCBhdXRvZnNfc2JfaW5mbyAqc2JpKQogewotCXN0cnVjdCBkZW50cnkgKnRoaXNfcGFyZW50ID0gc2JpLT5yb290OworCXN0cnVjdCBkZW50cnkgKnRoaXNfcGFyZW50ID0gc2JpLT5zYi0+c19yb290OwogCXN0cnVjdCBsaXN0X2hlYWQgKm5leHQ7CiAKKwlpZiAoIXNiaS0+c2ItPnNfcm9vdCkKKwkJcmV0dXJuOworCiAJc3Bpbl9sb2NrKCZkY2FjaGVfbG9jayk7CiByZXBlYXQ6CiAJbmV4dCA9IHRoaXNfcGFyZW50LT5kX3N1YmRpcnMubmV4dDsKQEAgLTEyNyw3ICsxMzAsNyBAQAogCQlzcGluX2xvY2soJmRjYWNoZV9sb2NrKTsKIAl9CiAKLQlpZiAodGhpc19wYXJlbnQgIT0gc2JpLT5yb290KSB7CisJaWYgKHRoaXNfcGFyZW50ICE9IHNiaS0+c2ItPnNfcm9vdCkgewogCQlzdHJ1Y3QgZGVudHJ5ICpkZW50cnkgPSB0aGlzX3BhcmVudDsKIAogCQluZXh0ID0gdGhpc19wYXJlbnQtPmRfdS5kX2NoaWxkLm5leHQ7CkBAIC0xNDAsMTggKzE0MywyMCBAQAogCQlnb3RvIHJlc3VtZTsKIAl9CiAJc3Bpbl91bmxvY2soJmRjYWNoZV9sb2NrKTsKLQotCWRwdXQoc2JpLT5yb290KTsKLQlzYmktPnJvb3QgPSBOVUxMOwotCXNocmlua19kY2FjaGVfc2Ioc2JpLT5zYik7Ci0KLQlyZXR1cm47CiB9CiAKLXN0YXRpYyB2b2lkIGF1dG9mczRfcHV0X3N1cGVyKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpCit2b2lkIGF1dG9mczRfa2lsbF9zYihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKQogewogCXN0cnVjdCBhdXRvZnNfc2JfaW5mbyAqc2JpID0gYXV0b2ZzNF9zYmkoc2IpOwogCisJLyoKKwkgKiBJbiB0aGUgZXZlbnQgb2YgYSBmYWlsdXJlIGluIGdldF9zYl9ub2RldiB0aGUgc3VwZXJibG9jaworCSAqIGluZm8gaXMgbm90IHByZXNlbnQgc28gbm90aGluZyBlbHNlIGhhcyBiZWVuIHNldHVwLCBzbworCSAqIGp1c3QgZXhpdCB3aGVuIHdlIGFyZSBjYWxsZWQgZnJvbSBkZWFjdGl2YXRlX3N1cGVyLgorCSAqLworCWlmICghc2JpKQorCQlyZXR1cm47CisKIAlzYi0+c19mc19pbmZvID0gTlVMTDsKIAogCWlmICggIXNiaS0+Y2F0YXRvbmljICkKQEAgLTE2Myw2ICsxNjgsNyBAQAogCWtmcmVlKHNiaSk7CiAKIAlEUFJJTlRLKCJzaHV0dGluZyBkb3duIik7CisJa2lsbF9hbm9uX3N1cGVyKHNiKTsKIH0KIAogc3RhdGljIGludCBhdXRvZnM0X3Nob3dfb3B0aW9ucyhzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIHN0cnVjdCB2ZnNtb3VudCAqbW50KQpAQCAtMTg5LDcgKzE5NSw2IEBACiB9CiAKIHN0YXRpYyBzdHJ1Y3Qgc3VwZXJfb3BlcmF0aW9ucyBhdXRvZnM0X3NvcHMgPSB7Ci0JLnB1dF9zdXBlcgk9IGF1dG9mczRfcHV0X3N1cGVyLAogCS5zdGF0ZnMJCT0gc2ltcGxlX3N0YXRmcywKIAkuc2hvd19vcHRpb25zCT0gYXV0b2ZzNF9zaG93X29wdGlvbnMsCiB9OwpAQCAtMzE1LDkgKzMyMCw5IEBACiAKIAlzLT5zX2ZzX2luZm8gPSBzYmk7CiAJc2JpLT5tYWdpYyA9IEFVVE9GU19TQklfTUFHSUM7Ci0Jc2JpLT5yb290ID0gTlVMTDsKIAlzYmktPnBpcGVmZCA9IC0xOwotCXNiaS0+Y2F0YXRvbmljID0gMDsKKwlzYmktPnBpcGUgPSBOVUxMOworCXNiaS0+Y2F0YXRvbmljID0gMTsKIAlzYmktPmV4cF90aW1lb3V0ID0gMDsKIAlzYmktPm96X3BncnAgPSBwcm9jZXNzX2dyb3VwKGN1cnJlbnQpOwogCXNiaS0+c2IgPSBzOwpAQCAtMzk1LDEzICs0MDAsNyBAQAogCQlnb3RvIGZhaWxfZnB1dDsKIAlzYmktPnBpcGUgPSBwaXBlOwogCXNiaS0+cGlwZWZkID0gcGlwZWZkOwotCi0JLyoKLQkgKiBUYWtlIGEgcmVmZXJlbmNlIHRvIHRoZSByb290IGRlbnRyeSBzbyB3ZSBnZXQgYSBjaGFuY2UgdG8KLQkgKiBjbGVhbiB1cCB0aGUgZGVudHJ5IHRyZWUgb24gdW1vdW50LgotCSAqIFNlZSBhdXRvZnM0X2ZvcmNlX3JlbGVhc2UuCi0JICovCi0Jc2JpLT5yb290ID0gZGdldChyb290KTsKKwlzYmktPmNhdGF0b25pYyA9IDA7CiAKIAkvKgogCSAqIFN1Y2Nlc3MhIEluc3RhbGwgdGhlIHJvb3QgZGVudHJ5IG5vdyB0byBpbmRpY2F0ZSBjb21wbGV0aW9uLgpAQCAtNDI2LDYgKzQyNSw4IEBACiAJa2ZyZWUoaW5vKTsKIGZhaWxfZnJlZToKIAlrZnJlZShzYmkpOworCXMtPnNfZnNfaW5mbyA9IE5VTEw7CisJa2lsbF9hbm9uX3N1cGVyKHMpOwogZmFpbF91bmxvY2s6CiAJcmV0dXJuIC1FSU5WQUw7CiB9CmRpZmYgLS1naXQgYS9mcy9hdXRvZnM0L3dhaXRxLmMgYi9mcy9hdXRvZnM0L3dhaXRxLmMKaW5kZXggY2UxMDNlNy4uMWU0YTUzOSAxMDA2NDQKLS0tIGEvZnMvYXV0b2ZzNC93YWl0cS5jCisrKyBiL2ZzL2F1dG9mczQvd2FpdHEuYwpAQCAtNDEsMTEgKzQxLDggQEAKIAkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZ3cS0+cXVldWUpOwogCQl3cSA9IG53cTsKIAl9Ci0JaWYgKHNiaS0+cGlwZSkgewotCQlmcHV0KHNiaS0+cGlwZSk7CS8qIENsb3NlIHRoZSBwaXBlICovCi0JCXNiaS0+cGlwZSA9IE5VTEw7Ci0JfQotCXNocmlua19kY2FjaGVfc2Ioc2JpLT5zYik7CisJZnB1dChzYmktPnBpcGUpOwkvKiBDbG9zZSB0aGUgcGlwZSAqLworCXNiaS0+cGlwZSA9IE5VTEw7CiB9CiAKIHN0YXRpYyBpbnQgYXV0b2ZzNF93cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3Qgdm9pZCAqYWRkciwgaW50IGJ5dGVzKQpkaWZmIC0tZ2l0IGEvZnMvYmluZm10X2VsZi5jIGIvZnMvYmluZm10X2VsZi5jCmluZGV4IDA2NDM1ZjM2Li43OWIwNWExIDEwMDY0NAotLS0gYS9mcy9iaW5mbXRfZWxmLmMKKysrIGIvZnMvYmluZm10X2VsZi5jCkBAIC0xMTUyLDcgKzExNTIsNyBAQAogc3RhdGljIGludCBkdW1wX3NlZWsoc3RydWN0IGZpbGUgKmZpbGUsIGxvZmZfdCBvZmYpCiB7CiAJaWYgKGZpbGUtPmZfb3AtPmxsc2VlayAmJiBmaWxlLT5mX29wLT5sbHNlZWsgIT0gbm9fbGxzZWVrKSB7Ci0JCWlmIChmaWxlLT5mX29wLT5sbHNlZWsoZmlsZSwgb2ZmLCAxKSAhPSBvZmYpCisJCWlmIChmaWxlLT5mX29wLT5sbHNlZWsoZmlsZSwgb2ZmLCBTRUVLX0NVUikgPCAwKQogCQkJcmV0dXJuIDA7CiAJfSBlbHNlIHsKIAkJY2hhciAqYnVmID0gKGNoYXIgKilnZXRfemVyb2VkX3BhZ2UoR0ZQX0tFUk5FTCk7CkBAIC0xMjIwLDcgKzEyMjAsNyBAQAogCiBzdGF0aWMgaW50IGFsaWduZmlsZShzdHJ1Y3QgZmlsZSAqZmlsZSwgbG9mZl90ICpmb2Zmc2V0KQogewotCWNoYXIgYnVmWzRdID0geyAwLCB9OworCXN0YXRpYyBjb25zdCBjaGFyIGJ1Zls0XSA9IHsgMCwgfTsKIAlEVU1QX1dSSVRFKGJ1Ziwgcm91bmR1cCgqZm9mZnNldCwgNCkgLSAqZm9mZnNldCwgZm9mZnNldCk7CiAJcmV0dXJuIDE7CiB9CkBAIC0xNTY5LDcgKzE1NjksOCBAQAogCiAJRFVNUF9XUklURShlbGYsIHNpemVvZigqZWxmKSk7CiAJb2Zmc2V0ICs9IHNpemVvZigqZWxmKTsJCQkJLyogRWxmIGhlYWRlciAqLwotCW9mZnNldCArPSAoc2VncysxKSAqIHNpemVvZihzdHJ1Y3QgZWxmX3BoZHIpOwkvKiBQcm9ncmFtIGhlYWRlcnMgKi8KKwlvZmZzZXQgKz0gKHNlZ3MgKyAxKSAqIHNpemVvZihzdHJ1Y3QgZWxmX3BoZHIpOyAvKiBQcm9ncmFtIGhlYWRlcnMgKi8KKwlmb2Zmc2V0ID0gb2Zmc2V0OwogCiAJLyogV3JpdGUgbm90ZXMgcGhkciBlbnRyeSAqLwogCXsKQEAgLTE1ODYsOCArMTU4Nyw2IEBACiAJCURVTVBfV1JJVEUoJnBoZHIsIHNpemVvZihwaGRyKSk7CiAJfQogCi0JZm9mZnNldCA9IG9mZnNldDsKLQogCWRhdGFvZmYgPSBvZmZzZXQgPSByb3VuZHVwKG9mZnNldCwgRUxGX0VYRUNfUEFHRVNJWkUpOwogCiAJLyogV3JpdGUgcHJvZ3JhbSBoZWFkZXJzIGZvciBzZWdtZW50cyBkdW1wICovCkBAIC0xNjEyLDcgKzE2MTEsNiBAQAogCQlwaGRyLnBfYWxpZ24gPSBFTEZfRVhFQ19QQUdFU0laRTsKIAogCQlEVU1QX1dSSVRFKCZwaGRyLCBzaXplb2YocGhkcikpOwotCQlmb2Zmc2V0ICs9IHNpemVvZihwaGRyKTsKIAl9CiAKICNpZmRlZiBFTEZfQ09SRV9XUklURV9FWFRSQV9QSERSUwpkaWZmIC0tZ2l0IGEvZnMvYmlvLmMgYi9mcy9iaW8uYwppbmRleCA4ZjkzZTkzLi5mOTVjODc0IDEwMDY0NAotLS0gYS9mcy9iaW8uYworKysgYi9mcy9iaW8uYwpAQCAtNzksNyArNzksNiBAQAogc3RhdGljIGlubGluZSBzdHJ1Y3QgYmlvX3ZlYyAqYnZlY19hbGxvY19icyhnZnBfdCBnZnBfbWFzaywgaW50IG5yLCB1bnNpZ25lZCBsb25nICppZHgsIHN0cnVjdCBiaW9fc2V0ICpicykKIHsKIAlzdHJ1Y3QgYmlvX3ZlYyAqYnZsOwotCXN0cnVjdCBiaW92ZWNfc2xhYiAqYnA7CiAKIAkvKgogCSAqIHNlZSBjb21tZW50IG5lYXIgYnZlY19hcnJheSBkZWZpbmUhCkBAIC05OCwxMCArOTcsMTIgQEAKIAkgKiBpZHggbm93IHBvaW50cyB0byB0aGUgcG9vbCB3ZSB3YW50IHRvIGFsbG9jYXRlIGZyb20KIAkgKi8KIAotCWJwID0gYnZlY19zbGFicyArICppZHg7CiAJYnZsID0gbWVtcG9vbF9hbGxvYyhicy0+YnZlY19wb29sc1sqaWR4XSwgZ2ZwX21hc2spOwotCWlmIChidmwpCisJaWYgKGJ2bCkgeworCQlzdHJ1Y3QgYmlvdmVjX3NsYWIgKmJwID0gYnZlY19zbGFicyArICppZHg7CisKIAkJbWVtc2V0KGJ2bCwgMCwgYnAtPm5yX3ZlY3MgKiBzaXplb2Yoc3RydWN0IGJpb192ZWMpKTsKKwl9CiAKIAlyZXR1cm4gYnZsOwogfQpAQCAtMTY2LDcgKzE2Nyw3IEBACiAKIAkJYmlvX2luaXQoYmlvKTsKIAkJaWYgKGxpa2VseShucl9pb3ZlY3MpKSB7Ci0JCQl1bnNpZ25lZCBsb25nIGlkeDsKKwkJCXVuc2lnbmVkIGxvbmcgaWR4ID0gMDsgLyogc2h1dCB1cCBnY2MgKi8KIAogCQkJYnZsID0gYnZlY19hbGxvY19icyhnZnBfbWFzaywgbnJfaW92ZWNzLCAmaWR4LCBicyk7CiAJCQlpZiAodW5saWtlbHkoIWJ2bCkpIHsKZGlmZiAtLWdpdCBhL2ZzL2Jsb2NrX2Rldi5jIGIvZnMvYmxvY2tfZGV2LmMKaW5kZXggYmM4ZjI3Yy4uMzZjMGU3YSAxMDA2NDQKLS0tIGEvZnMvYmxvY2tfZGV2LmMKKysrIGIvZnMvYmxvY2tfZGV2LmMKQEAgLTY0MiwzNCArNjQyLDQ3IEBACiB9CiAKIC8qKgorICogZmluZF9iZF9ob2xkZXIgLSBmaW5kIG1hdGNoaW5nIHN0cnVjdCBiZF9ob2xkZXIgZnJvbSB0aGUgYmxvY2sgZGV2aWNlCisgKgorICogQGJkZXY6CXN0cnVjdCBibG9jayBkZXZpY2UgdG8gYmUgc2VhcmNoZWQKKyAqIEBibzoJCXRhcmdldCBzdHJ1Y3QgYmRfaG9sZGVyCisgKgorICogUmV0dXJucyBtYXRjaGluZyBlbnRyeSB3aXRoIEBibyBpbiBAYmRldi0+YmRfaG9sZGVyX2xpc3QuCisgKiBJZiBmb3VuZCwgaW5jcmVtZW50IHRoZSByZWZlcmVuY2UgY291bnQgYW5kIHJldHVybiB0aGUgcG9pbnRlci4KKyAqIElmIG5vdCBmb3VuZCwgcmV0dXJucyBOVUxMLgorICovCitzdGF0aWMgc3RydWN0IGJkX2hvbGRlciAqZmluZF9iZF9ob2xkZXIoc3RydWN0IGJsb2NrX2RldmljZSAqYmRldiwKKwkJCQkJc3RydWN0IGJkX2hvbGRlciAqYm8pCit7CisJc3RydWN0IGJkX2hvbGRlciAqdG1wOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeSh0bXAsICZiZGV2LT5iZF9ob2xkZXJfbGlzdCwgbGlzdCkKKwkJaWYgKHRtcC0+c2RpciA9PSBiby0+c2RpcikgeworCQkJdG1wLT5jb3VudCsrOworCQkJcmV0dXJuIHRtcDsKKwkJfQorCisJcmV0dXJuIE5VTEw7Cit9CisKKy8qKgogICogYWRkX2JkX2hvbGRlciAtIGNyZWF0ZSBzeXNmcyBzeW1saW5rcyBmb3IgYmRfY2xhaW0oKSByZWxhdGlvbnNoaXAKICAqCiAgKiBAYmRldjoJYmxvY2sgZGV2aWNlIHRvIGJlIGJkX2NsYWltZWQKICAqIEBibzoJCXByZWFsbG9jYXRlZCBhbmQgaW5pdGlhbGl6ZWQgYnkgYWxsb2NfYmRfaG9sZGVyKCkKICAqCi0gKiBJZiB0aGVyZSBpcyBubyBtYXRjaGluZyBlbnRyeSB3aXRoIEBibyBpbiBAYmRldi0+YmRfaG9sZGVyX2xpc3QsCi0gKiBhZGQgQGJvIHRvIHRoZSBsaXN0LCBjcmVhdGUgc3ltbGlua3MuCisgKiBBZGQgQGJvIHRvIEBiZGV2LT5iZF9ob2xkZXJfbGlzdCwgY3JlYXRlIHN5bWxpbmtzLgogICoKLSAqIFJldHVybnMgMCBpZiBzeW1saW5rcyBhcmUgY3JlYXRlZCBvciBhbHJlYWR5IHRoZXJlLgotICogUmV0dXJucyAtdmUgaWYgc29tZXRoaW5nIGZhaWxzIGFuZCBAYm8gY2FuIGJlIGZyZWVkLgorICogUmV0dXJucyAwIGlmIHN5bWxpbmtzIGFyZSBjcmVhdGVkLgorICogUmV0dXJucyAtdmUgaWYgc29tZXRoaW5nIGZhaWxzLgogICovCiBzdGF0aWMgaW50IGFkZF9iZF9ob2xkZXIoc3RydWN0IGJsb2NrX2RldmljZSAqYmRldiwgc3RydWN0IGJkX2hvbGRlciAqYm8pCiB7Ci0Jc3RydWN0IGJkX2hvbGRlciAqdG1wOwogCWludCByZXQ7CiAKIAlpZiAoIWJvKQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCWxpc3RfZm9yX2VhY2hfZW50cnkodG1wLCAmYmRldi0+YmRfaG9sZGVyX2xpc3QsIGxpc3QpIHsKLQkJaWYgKHRtcC0+c2RpciA9PSBiby0+c2RpcikgewotCQkJdG1wLT5jb3VudCsrOwotCQkJLyogV2UndmUgYWxyZWFkeSBkb25lIHdoYXQgd2UgbmVlZCB0byBkbyBoZXJlLiAqLwotCQkJZnJlZV9iZF9ob2xkZXIoYm8pOwotCQkJcmV0dXJuIDA7Ci0JCX0KLQl9Ci0KIAlpZiAoIWJkX2hvbGRlcl9ncmFiX2RpcnMoYmRldiwgYm8pKQogCQlyZXR1cm4gLUVCVVNZOwogCkBAIC03NDAsNyArNzUzLDcgQEAKIAkJCQlzdHJ1Y3Qga29iamVjdCAqa29iaikKIHsKIAlpbnQgcmVzOwotCXN0cnVjdCBiZF9ob2xkZXIgKmJvOworCXN0cnVjdCBiZF9ob2xkZXIgKmJvLCAqZm91bmQ7CiAKIAlpZiAoIWtvYmopCiAJCXJldHVybiAtRUlOVkFMOwpAQCAtNzUxLDkgKzc2NCwxNiBAQAogCiAJbXV0ZXhfbG9ja19uZXN0ZWQoJmJkZXYtPmJkX211dGV4LCBCRF9NVVRFWF9QQVJUSVRJT04pOwogCXJlcyA9IGJkX2NsYWltKGJkZXYsIGhvbGRlcik7Ci0JaWYgKHJlcyA9PSAwKQotCQlyZXMgPSBhZGRfYmRfaG9sZGVyKGJkZXYsIGJvKTsKLQlpZiAocmVzKQorCWlmIChyZXMgPT0gMCkgeworCQlmb3VuZCA9IGZpbmRfYmRfaG9sZGVyKGJkZXYsIGJvKTsKKwkJaWYgKGZvdW5kID09IE5VTEwpIHsKKwkJCXJlcyA9IGFkZF9iZF9ob2xkZXIoYmRldiwgYm8pOworCQkJaWYgKHJlcykKKwkJCQliZF9yZWxlYXNlKGJkZXYpOworCQl9CisJfQorCisJaWYgKHJlcyB8fCBmb3VuZCkKIAkJZnJlZV9iZF9ob2xkZXIoYm8pOwogCW11dGV4X3VubG9jaygmYmRldi0+YmRfbXV0ZXgpOwogCkBAIC0xMTMxLDYgKzExNTEsOCBAQAogCWZpbHAtPmZfZmxhZ3MgfD0gT19MQVJHRUZJTEU7CiAKIAliZGV2ID0gYmRfYWNxdWlyZShpbm9kZSk7CisJaWYgKGJkZXYgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9NRU07CiAKIAlyZXMgPSBkb19vcGVuKGJkZXYsIGZpbHAsIEJEX01VVEVYX05PUk1BTCk7CiAJaWYgKHJlcykKZGlmZiAtLWdpdCBhL2ZzL2J1ZmZlci5jIGIvZnMvYnVmZmVyLmMKaW5kZXggZWViOGFjMS4uMzU1MjdkYyAxMDA2NDQKLS0tIGEvZnMvYnVmZmVyLmMKKysrIGIvZnMvYnVmZmVyLmMKQEAgLTQ1Miw2ICs0NTIsNyBAQAogCQkJICAgICAgIGJkZXZuYW1lKGJoLT5iX2JkZXYsIGIpKTsKIAkJfQogCQlzZXRfYml0KEFTX0VJTywgJnBhZ2UtPm1hcHBpbmctPmZsYWdzKTsKKwkJc2V0X2J1ZmZlcl93cml0ZV9pb19lcnJvcihiaCk7CiAJCWNsZWFyX2J1ZmZlcl91cHRvZGF0ZShiaCk7CiAJCVNldFBhZ2VFcnJvcihwYWdlKTsKIAl9CkBAIC01NzEsNiArNTcyLDEwIEBACiBzdGF0aWMgaW5saW5lIHZvaWQgX19yZW1vdmVfYXNzb2NfcXVldWUoc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCkKIHsKIAlsaXN0X2RlbF9pbml0KCZiaC0+Yl9hc3NvY19idWZmZXJzKTsKKwlXQVJOX09OKCFiaC0+Yl9hc3NvY19tYXApOworCWlmIChidWZmZXJfd3JpdGVfaW9fZXJyb3IoYmgpKQorCQlzZXRfYml0KEFTX0VJTywgJmJoLT5iX2Fzc29jX21hcC0+ZmxhZ3MpOworCWJoLT5iX2Fzc29jX21hcCA9IE5VTEw7CiB9CiAKIGludCBpbm9kZV9oYXNfYnVmZmVycyhzdHJ1Y3QgaW5vZGUgKmlub2RlKQpAQCAtNjY5LDYgKzY3NCw3IEBACiAJCXNwaW5fbG9jaygmYnVmZmVyX21hcHBpbmctPnByaXZhdGVfbG9jayk7CiAJCWxpc3RfbW92ZV90YWlsKCZiaC0+Yl9hc3NvY19idWZmZXJzLAogCQkJCSZtYXBwaW5nLT5wcml2YXRlX2xpc3QpOworCQliaC0+Yl9hc3NvY19tYXAgPSBtYXBwaW5nOwogCQlzcGluX3VubG9jaygmYnVmZmVyX21hcHBpbmctPnByaXZhdGVfbG9jayk7CiAJfQogfQpAQCAtNzY1LDcgKzc3MSw3IEBACiAJc3Bpbl9sb2NrKGxvY2spOwogCXdoaWxlICghbGlzdF9lbXB0eShsaXN0KSkgewogCQliaCA9IEJIX0VOVFJZKGxpc3QtPm5leHQpOwotCQlsaXN0X2RlbF9pbml0KCZiaC0+Yl9hc3NvY19idWZmZXJzKTsKKwkJX19yZW1vdmVfYXNzb2NfcXVldWUoYmgpOwogCQlpZiAoYnVmZmVyX2RpcnR5KGJoKSB8fCBidWZmZXJfbG9ja2VkKGJoKSkgewogCQkJbGlzdF9hZGQoJmJoLT5iX2Fzc29jX2J1ZmZlcnMsICZ0bXApOwogCQkJaWYgKGJ1ZmZlcl9kaXJ0eShiaCkpIHsKQEAgLTc4Niw3ICs3OTIsNyBAQAogCiAJd2hpbGUgKCFsaXN0X2VtcHR5KCZ0bXApKSB7CiAJCWJoID0gQkhfRU5UUlkodG1wLnByZXYpOwotCQlfX3JlbW92ZV9hc3NvY19xdWV1ZShiaCk7CisJCWxpc3RfZGVsX2luaXQoJmJoLT5iX2Fzc29jX2J1ZmZlcnMpOwogCQlnZXRfYmgoYmgpOwogCQlzcGluX3VubG9jayhsb2NrKTsKIAkJd2FpdF9vbl9idWZmZXIoYmgpOwpAQCAtMTA0Miw4ICsxMDQ4LDIxIEBACiAJfSB3aGlsZSAoKHNpemUgPDwgc2l6ZWJpdHMpIDwgUEFHRV9TSVpFKTsKIAogCWluZGV4ID0gYmxvY2sgPj4gc2l6ZWJpdHM7Ci0JYmxvY2sgPSBpbmRleCA8PCBzaXplYml0czsKIAorCS8qCisJICogQ2hlY2sgZm9yIGEgYmxvY2sgd2hpY2ggd2FudHMgdG8gbGllIG91dHNpZGUgb3VyIG1heGltdW0gcG9zc2libGUKKwkgKiBwYWdlY2FjaGUgaW5kZXguICAodGhpcyBjb21wYXJpc29uIGlzIGRvbmUgdXNpbmcgc2VjdG9yX3QgdHlwZXMpLgorCSAqLworCWlmICh1bmxpa2VseShpbmRleCAhPSBibG9jayA+PiBzaXplYml0cykpIHsKKwkJY2hhciBiW0JERVZOQU1FX1NJWkVdOworCisJCXByaW50ayhLRVJOX0VSUiAiJXM6IHJlcXVlc3RlZCBvdXQtb2YtcmFuZ2UgYmxvY2sgJWxsdSBmb3IgIgorCQkJImRldmljZSAlc1xuIiwKKwkJCV9fRlVOQ1RJT05fXywgKHVuc2lnbmVkIGxvbmcgbG9uZylibG9jaywKKwkJCWJkZXZuYW1lKGJkZXYsIGIpKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCWJsb2NrID0gaW5kZXggPDwgc2l6ZWJpdHM7CiAJLyogQ3JlYXRlIGEgcGFnZSB3aXRoIHRoZSBwcm9wZXIgc2l6ZSBidWZmZXJzLi4gKi8KIAlwYWdlID0gZ3Jvd19kZXZfcGFnZShiZGV2LCBibG9jaywgaW5kZXgsIHNpemUpOwogCWlmICghcGFnZSkKQEAgLTEwNzAsMTIgKzEwODksMTYgQEAKIAogCWZvciAoOzspIHsKIAkJc3RydWN0IGJ1ZmZlcl9oZWFkICogYmg7CisJCWludCByZXQ7CiAKIAkJYmggPSBfX2ZpbmRfZ2V0X2Jsb2NrKGJkZXYsIGJsb2NrLCBzaXplKTsKIAkJaWYgKGJoKQogCQkJcmV0dXJuIGJoOwogCi0JCWlmICghZ3Jvd19idWZmZXJzKGJkZXYsIGJsb2NrLCBzaXplKSkKKwkJcmV0ID0gZ3Jvd19idWZmZXJzKGJkZXYsIGJsb2NrLCBzaXplKTsKKwkJaWYgKHJldCA8IDApCisJCQlyZXR1cm4gTlVMTDsKKwkJaWYgKHJldCA9PSAwKQogCQkJZnJlZV9tb3JlX21lbW9yeSgpOwogCX0KIH0KQEAgLTExNTAsNiArMTE3Myw3IEBACiAKIAkJc3Bpbl9sb2NrKCZidWZmZXJfbWFwcGluZy0+cHJpdmF0ZV9sb2NrKTsKIAkJbGlzdF9kZWxfaW5pdCgmYmgtPmJfYXNzb2NfYnVmZmVycyk7CisJCWJoLT5iX2Fzc29jX21hcCA9IE5VTEw7CiAJCXNwaW5fdW5sb2NrKCZidWZmZXJfbWFwcGluZy0+cHJpdmF0ZV9sb2NrKTsKIAl9CiAJX19icmVsc2UoYmgpOwpAQCAtMTgzNyw2ICsxODYxLDcgQEAKIAkJCWNsZWFyX2J1ZmZlcl9uZXcoYmgpOwogCQkJa2FkZHIgPSBrbWFwX2F0b21pYyhwYWdlLCBLTV9VU0VSMCk7CiAJCQltZW1zZXQoa2FkZHIrYmxvY2tfc3RhcnQsIDAsIGJoLT5iX3NpemUpOworCQkJZmx1c2hfZGNhY2hlX3BhZ2UocGFnZSk7CiAJCQlrdW5tYXBfYXRvbWljKGthZGRyLCBLTV9VU0VSMCk7CiAJCQlzZXRfYnVmZmVyX3VwdG9kYXRlKGJoKTsKIAkJCW1hcmtfYnVmZmVyX2RpcnR5KGJoKTsKQEAgLTIzNDMsNiArMjM2OCw3IEBACiAJICovCiAJa2FkZHIgPSBrbWFwX2F0b21pYyhwYWdlLCBLTV9VU0VSMCk7CiAJbWVtc2V0KGthZGRyLCAwLCBQQUdFX0NBQ0hFX1NJWkUpOworCWZsdXNoX2RjYWNoZV9wYWdlKHBhZ2UpOwogCWt1bm1hcF9hdG9taWMoa2FkZHIsIEtNX1VTRVIwKTsKIAlTZXRQYWdlVXB0b2RhdGUocGFnZSk7CiAJc2V0X3BhZ2VfZGlydHkocGFnZSk7CmRpZmYgLS1naXQgYS9mcy9jaWZzL0NIQU5HRVMgYi9mcy9jaWZzL0NIQU5HRVMKaW5kZXggMWViOWEyZS4uMGIzYzM3ZSAxMDA2NDQKLS0tIGEvZnMvY2lmcy9DSEFOR0VTCisrKyBiL2ZzL2NpZnMvQ0hBTkdFUwpAQCAtMSw2ICsxLDExIEBACiBWZXJzaW9uIDEuNDYKIC0tLS0tLS0tLS0tLQogU3VwcG9ydCBkZWVwIHRyZWUgbW91bnRzLiAgQmV0dGVyIHN1cHBvcnQgT1MvMiwgV2luOXggKERPUykgdGltZSBzdGFtcHMuCitBbGxvdyBudWxsIHVzZXIgdG8gYmUgc3BlY2lmaWVkIG9uIG1vdW50ICgidXNlcm5hbWU9IikuIERvIG5vdCByZXR1cm4KK0VJTlZBTCBvbiByZWFkZGlyIHdoZW4gZmlsbGRpciBmYWlscyBkdWUgdG8gb3ZlcndyaXR0ZW4gYmxvY2tzaXplCisoZml4ZXMgRkMgcHJvYmxlbSkuICBSZXR1cm4gZXJyb3IgaW4gcmVuYW1lIDJuZCBhdHRlbXB0IHJldHJ5IChpZSByZXBvcnQKK2lmIHJlbmFtZSBieSBoYW5kbGUgYWxzbyBmYWlscywgYWZ0ZXIgcmVuYW1lIGJ5IHBhdGggZmFpbHMsIHdlIHdlcmUKK25vdCByZXBvcnRpbmcgd2hldGhlciB0aGUgcmV0cnkgd29ya2VkIG9yIG5vdCkuCiAKIFZlcnNpb24gMS40NQogLS0tLS0tLS0tLS0tCmRpZmYgLS1naXQgYS9mcy9jaWZzL2NpZnNhY2wuaCBiL2ZzL2NpZnMvY2lmc2FjbC5oCmluZGV4IGQwNzc2YWMuLjVlZmYzNWQgMTAwNjQ0Ci0tLSBhL2ZzL2NpZnMvY2lmc2FjbC5oCisrKyBiL2ZzL2NpZnMvY2lmc2FjbC5oCkBAIC0zMSw4ICszMSw4IEBACiB9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOwogCiAvKiBldmVyeW9uZSAqLwotZXh0ZXJuIGNvbnN0IHN0cnVjdCBjaWZzX3NpZCBzaWRfZXZlcnlvbmU7CisvKiBleHRlcm4gY29uc3Qgc3RydWN0IGNpZnNfc2lkIHNpZF9ldmVyeW9uZTsqLwogLyogZ3JvdXAgdXNlcnMgKi8KLWV4dGVybiBjb25zdCBzdHJ1Y3QgY2lmc19zaWQgc2lkX3VzZXI7CisvKiBleHRlcm4gY29uc3Qgc3RydWN0IGNpZnNfc2lkIHNpZF91c2VyOyovCiAKICNlbmRpZiAvKiBfQ0lGU0FDTF9IICovCmRpZmYgLS1naXQgYS9mcy9jaWZzL2NpZnNlbmNyeXB0LmggYi9mcy9jaWZzL2NpZnNlbmNyeXB0LmgKaW5kZXggMDNlMzU5Yi4uMTUyZmEyZCAxMDA2NDQKLS0tIGEvZnMvY2lmcy9jaWZzZW5jcnlwdC5oCisrKyBiL2ZzL2NpZnMvY2lmc2VuY3J5cHQuaApAQCAtMjcsOCArMjcsNiBAQAogLyogc21iZGVzLmMgKi8KIGV4dGVybiB2b2lkIEVfUDE2KHVuc2lnbmVkIGNoYXIgKnAxNCwgdW5zaWduZWQgY2hhciAqcDE2KTsKIGV4dGVybiB2b2lkIEVfUDI0KHVuc2lnbmVkIGNoYXIgKnAyMSwgdW5zaWduZWQgY2hhciAqYzgsIHVuc2lnbmVkIGNoYXIgKnAyNCk7Ci1leHRlcm4gdm9pZCBEX1AxNih1bnNpZ25lZCBjaGFyICpwMTQsIHVuc2lnbmVkIGNoYXIgKmluLCB1bnNpZ25lZCBjaGFyICpvdXQpOwotZXh0ZXJuIHZvaWQgRV9vbGRfcHdfaGFzaCh1bnNpZ25lZCBjaGFyICosIHVuc2lnbmVkIGNoYXIgKiwgdW5zaWduZWQgY2hhciAqKTsKIAogCiAKZGlmZiAtLWdpdCBhL2ZzL2NpZnMvY2lmc2ZzLmMgYi9mcy9jaWZzL2NpZnNmcy5jCmluZGV4IGMwMGM2NTQuLjg0OTc2Y2QgMTAwNjQ0Ci0tLSBhL2ZzL2NpZnMvY2lmc2ZzLmMKKysrIGIvZnMvY2lmcy9jaWZzZnMuYwpAQCAtNjMsNiArNjMsNyBAQAogc3RydWN0IHRhc2tfc3RydWN0ICogb3Bsb2NrVGhyZWFkID0gTlVMTDsKIGV4dGVybiBzdHJ1Y3QgdGFza19zdHJ1Y3QgKiBkbm90aWZ5VGhyZWFkOyAvKiByZW1vdmUgc3BhcnNlIHdhcm5pbmcgKi8KIHN0cnVjdCB0YXNrX3N0cnVjdCAqIGRub3RpZnlUaHJlYWQgPSBOVUxMOworc3RhdGljIHN0cnVjdCBzdXBlcl9vcGVyYXRpb25zIGNpZnNfc3VwZXJfb3BzOyAKIHVuc2lnbmVkIGludCBDSUZTTWF4QnVmU2l6ZSA9IENJRlNfTUFYX01TR1NJWkU7CiBtb2R1bGVfcGFyYW0oQ0lGU01heEJ1ZlNpemUsIGludCwgMCk7CiBNT0RVTEVfUEFSTV9ERVNDKENJRlNNYXhCdWZTaXplLCJOZXR3b3JrIGJ1ZmZlciBzaXplIChub3QgaW5jbHVkaW5nIGhlYWRlcikuIERlZmF1bHQ6IDE2Mzg0IFJhbmdlOiA4MTkyIHRvIDEzMDA0OCIpOwpAQCAtMTk4LDEwICsxOTksMTIgQEAKICAgICAvKiBPbmx5IG5lZWQgdG8gY2FsbCB0aGUgb2xkIFFGU0luZm8gaWYgZmFpbGVkCiAgICAgb24gbmV3ZXIgb25lICovCiAgICAgaWYocmMpCi0JcmMgPSBDSUZTU01CUUZTSW5mbyh4aWQsIHBUY29uLCBidWYpOworCWlmKHBUY29uLT5zZXMtPmNhcGFiaWxpdGllcyAmIENBUF9OVF9TTUJTKQorCQlyYyA9IENJRlNTTUJRRlNJbmZvKHhpZCwgcFRjb24sIGJ1Zik7IC8qIG5vdCBzdXBwb3J0ZWQgYnkgT1MyICovCiAKLQkvKiBPbGQgV2luZG93cyBzZXJ2ZXJzIGRvIG5vdCBzdXBwb3J0IGxldmVsIDEwMywgcmV0cnkgd2l0aCBsZXZlbCAKLQkgICBvbmUgaWYgb2xkIHNlcnZlciBmYWlsZWQgdGhlIHByZXZpb3VzIGNhbGwgKi8gCisJLyogU29tZSBvbGQgV2luZG93cyBzZXJ2ZXJzIGFsc28gZG8gbm90IHN1cHBvcnQgbGV2ZWwgMTAzLCByZXRyeSB3aXRoCisJICAgb2xkZXIgbGV2ZWwgb25lIGlmIG9sZCBzZXJ2ZXIgZmFpbGVkIHRoZSBwcmV2aW91cyBjYWxsIG9yIHdlCisJICAgYnlwYXNzZWQgaXQgYmVjYXVzZSB3ZSBkZXRlY3RlZCB0aGF0IHRoaXMgd2FzIGFuIG9sZGVyIExBTk1BTiBzZXNzICovCiAJaWYocmMpCiAJCXJjID0gU01CT2xkUUZTSW5mbyh4aWQsIHBUY29uLCBidWYpOwogCS8qICAgICAKQEAgLTQzNSwxMyArNDM4LDIxIEBACiAJcmV0dXJuOwogfQogCisjaWZkZWYgQ09ORklHX0NJRlNfU1RBVFMyCitzdGF0aWMgaW50IGNpZnNfc2hvd19zdGF0cyhzdHJ1Y3Qgc2VxX2ZpbGUgKnMsIHN0cnVjdCB2ZnNtb3VudCAqbW50KQoreworCS8qIEJCIEZJWE1FICovCisJcmV0dXJuIDA7Cit9CisjZW5kaWYKKwogc3RhdGljIGludCBjaWZzX3JlbW91bnQoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgaW50ICpmbGFncywgY2hhciAqZGF0YSkKIHsKIAkqZmxhZ3MgfD0gTVNfTk9ESVJBVElNRTsKIAlyZXR1cm4gMDsKIH0KIAotc3RydWN0IHN1cGVyX29wZXJhdGlvbnMgY2lmc19zdXBlcl9vcHMgPSB7CitzdGF0aWMgc3RydWN0IHN1cGVyX29wZXJhdGlvbnMgY2lmc19zdXBlcl9vcHMgPSB7CiAJLnJlYWRfaW5vZGUgPSBjaWZzX3JlYWRfaW5vZGUsCiAJLnB1dF9zdXBlciA9IGNpZnNfcHV0X3N1cGVyLAogCS5zdGF0ZnMgPSBjaWZzX3N0YXRmcywKQEAgLTQ1NCw2ICs0NjUsOSBAQAogCS5zaG93X29wdGlvbnMgPSBjaWZzX3Nob3dfb3B0aW9ucywKIAkudW1vdW50X2JlZ2luICAgPSBjaWZzX3Vtb3VudF9iZWdpbiwKIAkucmVtb3VudF9mcyA9IGNpZnNfcmVtb3VudCwKKyNpZmRlZiBDT05GSUdfQ0lGU19TVEFUUzIKKwkuc2hvd19zdGF0cyA9IGNpZnNfc2hvd19zdGF0cywKKyNlbmRpZgogfTsKIAogc3RhdGljIGludApAQCAtNDk1LDcgKzUwOSw3IEBACiBzdGF0aWMgbG9mZl90IGNpZnNfbGxzZWVrKHN0cnVjdCBmaWxlICpmaWxlLCBsb2ZmX3Qgb2Zmc2V0LCBpbnQgb3JpZ2luKQogewogCS8qIG9yaWdpbiA9PSBTRUVLX0VORCA9PiB3ZSBtdXN0IHJldmFsaWRhdGUgdGhlIGNhY2hlZCBmaWxlIGxlbmd0aCAqLwotCWlmIChvcmlnaW4gPT0gMikgeworCWlmIChvcmlnaW4gPT0gU0VFS19FTkQpIHsKIAkJaW50IHJldHZhbCA9IGNpZnNfcmV2YWxpZGF0ZShmaWxlLT5mX2RlbnRyeSk7CiAJCWlmIChyZXR2YWwgPCAwKQogCQkJcmV0dXJuIChsb2ZmX3QpcmV0dmFsOwpAQCAtOTAzLDcgKzkxNyw3IEBACiAjaWZkZWYgQ09ORklHX1BST0NfRlMKIAljaWZzX3Byb2NfaW5pdCgpOwogI2VuZGlmCi0JSU5JVF9MSVNUX0hFQUQoJkdsb2JhbFNlcnZlckxpc3QpOwkvKiBCQiBub3QgaW1wbGVtZW50ZWQgeWV0ICovCisvKglJTklUX0xJU1RfSEVBRCgmR2xvYmFsU2VydmVyTGlzdCk7Ki8JLyogQkIgbm90IGltcGxlbWVudGVkIHlldCAqLwogCUlOSVRfTElTVF9IRUFEKCZHbG9iYWxTTUJTZXNzaW9uTGlzdCk7CiAJSU5JVF9MSVNUX0hFQUQoJkdsb2JhbFRyZWVDb25uZWN0aW9uTGlzdCk7CiAJSU5JVF9MSVNUX0hFQUQoJkdsb2JhbE9wbG9ja19RKTsKQEAgLTkzMSw2ICs5NDUsNyBAQAogCUdsb2JhbEN1cnJlbnRYaWQgPSAwOwogCUdsb2JhbFRvdGFsQWN0aXZlWGlkID0gMDsKIAlHbG9iYWxNYXhBY3RpdmVYaWQgPSAwOworCW1lbXNldChMb2NhbF9TeXN0ZW1fTmFtZSwgMCwgMTUpOwogCXJ3bG9ja19pbml0KCZHbG9iYWxTTUJTZXNsb2NrKTsKIAlzcGluX2xvY2tfaW5pdCgmR2xvYmFsTWlkX0xvY2spOwogCmRpZmYgLS1naXQgYS9mcy9jaWZzL2NpZnNmcy5oIGIvZnMvY2lmcy9jaWZzZnMuaAppbmRleCBiZWE4NzVkLi5hMjQzZjc3OSAxMDA2NDQKLS0tIGEvZnMvY2lmcy9jaWZzZnMuaAorKysgYi9mcy9jaWZzL2NpZnNmcy5oCkBAIC0zNiw3ICszNiw3IEBACiBleHRlcm4gY29uc3Qgc3RydWN0IGFkZHJlc3Nfc3BhY2Vfb3BlcmF0aW9ucyBjaWZzX2FkZHJfb3BzX3NtYWxsYnVmOwogCiAvKiBGdW5jdGlvbnMgcmVsYXRlZCB0byBzdXBlciBibG9jayBvcGVyYXRpb25zICovCi1leHRlcm4gc3RydWN0IHN1cGVyX29wZXJhdGlvbnMgY2lmc19zdXBlcl9vcHM7CisvKiBleHRlcm4gc3RydWN0IHN1cGVyX29wZXJhdGlvbnMgY2lmc19zdXBlcl9vcHM7Ki8KIGV4dGVybiB2b2lkIGNpZnNfcmVhZF9pbm9kZShzdHJ1Y3QgaW5vZGUgKik7CiBleHRlcm4gdm9pZCBjaWZzX2RlbGV0ZV9pbm9kZShzdHJ1Y3QgaW5vZGUgKik7CiAvKiBleHRlcm4gdm9pZCBjaWZzX3dyaXRlX2lub2RlKHN0cnVjdCBpbm9kZSAqKTsgKi8vKiBCQiBub3QgbmVlZGVkIHlldCAqLwpkaWZmIC0tZ2l0IGEvZnMvY2lmcy9jaWZzZ2xvYi5oIGIvZnMvY2lmcy9jaWZzZ2xvYi5oCmluZGV4IGIyNDAwNmMuLjc0ZDNjY2IgMTAwNjQ0Ci0tLSBhL2ZzL2NpZnMvY2lmc2dsb2IuaAorKysgYi9mcy9jaWZzL2NpZnNnbG9iLmgKQEAgLTE1Myw3ICsxNTMsNyBAQAogCWNoYXIgc2Vzc2lkWzRdOwkJLyogdW5pcXVlIHRva2VuIGlkIGZvciB0aGlzIHNlc3Npb24gKi8KIAkvKiAocmV0dXJuZWQgb24gTmVnb3RpYXRlICovCiAJaW50IGNhcGFiaWxpdGllczsgLyogYWxsb3cgc2VsZWN0aXZlIGRpc2FibGluZyBvZiBjYXBzIGJ5IHNtYiBzZXNzICovCi0JX191MTYgdGltZVpvbmU7CisJaW50IHRpbWVBZGo7ICAvKiBBZGp1c3QgZm9yIGRpZmZlcmVuY2UgaW4gc2VydmVyIHRpbWUgem9uZSBpbiBzZWMgKi8KIAlfX3UxNiBDdXJyZW50TWlkOyAgICAgICAgIC8qIG11bHRpcGxleCBpZCAtIHJvdGF0aW5nIGNvdW50ZXIgKi8KIAljaGFyIGNyeXB0S2V5W0NJRlNfQ1JZUFRPX0tFWV9TSVpFXTsKIAkvKiAxNnRoIGJ5dGUgb2YgUkZDMTAwMSB3b3Jrc3RhdGlvbiBuYW1lIGlzIGFsd2F5cyBudWxsICovCkBAIC0yMDMsOSArMjAzLDE0IEBACiAJY2hhciAqIGRvbWFpbk5hbWU7CiAJY2hhciAqIHBhc3N3b3JkOwogfTsKLS8qIHNlc3Npb24gZmxhZ3MgKi8KKy8qIG5vIG1vcmUgdGhhbiBvbmUgb2YgdGhlIGZvbGxvd2luZyB0aHJlZSBzZXNzaW9uIGZsYWdzIG1heSBiZSBzZXQgKi8KICNkZWZpbmUgQ0lGU19TRVNfTlQ0IDEKLQorI2RlZmluZSBDSUZTX1NFU19PUzIgMgorI2RlZmluZSBDSUZTX1NFU19XOVggNAorLyogZm9sbG93aW5nIGZsYWcgaXMgc2V0IGZvciBvbGQgc2VydmVycyBzdWNoIGFzIE9TMiAoYW5kIFdpbjk1PykKKyAgIHdoaWNoIGRvIG5vdCBuZWdvdGlhdGUgTlRMTSBvciBQT1NJWCBkaWFsZWN0cywgYnV0IGluc3RlYWQKKyAgIG5lZ290aWF0ZSBvbmUgb2YgdGhlIG9sZGVyIExBTk1BTiBkaWFsZWN0cyAqLworI2RlZmluZSBDSUZTX1NFU19MQU5NQU4gOAogLyoKICAqIHRoZXJlIGlzIG9uZSBvZiB0aGVzZSBmb3IgZWFjaCBjb25uZWN0aW9uIHRvIGEgcmVzb3VyY2Ugb24gYSBwYXJ0aWN1bGFyCiAgKiBzZXNzaW9uIApAQCAtNTEyLDcgKzUxNyw4IEBACiAgKiBUaGlzIGxpc3QgaGVscHMgaW1wcm92ZSBwZXJmb3JtYW5jZSBhbmQgZWxpbWluYXRlIHRoZSBtZXNzYWdlcyBpbmRpY2F0aW5nCiAgKiB0aGF0IHdlIGhhZCBhIGNvbW11bmljYXRpb25zIGVycm9yIHRhbGtpbmcgdG8gdGhlIHNlcnZlciBpbiB0aGlzIGxpc3QuIAogICovCi1HTE9CQUxfRVhURVJOIHN0cnVjdCBzZXJ2ZXJzX25vdF9zdXBwb3J0ZWQgKk5vdFN1cHBMaXN0OwkvKkB6NGEgKi8KKy8qIEZlYXR1cmUgbm90IHN1cHBvcnRlZCAqLworLyogR0xPQkFMX0VYVEVSTiBzdHJ1Y3Qgc2VydmVyc19ub3Rfc3VwcG9ydGVkICpOb3RTdXBwTGlzdDsgKi8KIAogLyoKICAqIFRoZSBmb2xsb3dpbmcgaXMgYSBoYXNoIHRhYmxlIG9mIGFsbCB0aGUgdXNlcnMgd2Uga25vdyBhYm91dC4KQEAgLTU2OCw3ICs1NzQsNiBAQAogR0xPQkFMX0VYVEVSTiB1bnNpZ25lZCBpbnQgZXh0ZW5kZWRfc2VjdXJpdHk7CS8qIGlmIG9uLCBzZXNzaW9uIHNldHVwIHNlbnQgCiAJCQkJd2l0aCBtb3JlIHNlY3VyZSBudGxtc3NwMiBjaGFsbGVuZ2UvcmVzcCAqLwogR0xPQkFMX0VYVEVSTiB1bnNpZ25lZCBpbnQgc2lnbl9DSUZTX1BEVXM7ICAvKiBlbmFibGUgc21iIHBhY2tldCBzaWduaW5nICovCi1HTE9CQUxfRVhURVJOIHVuc2lnbmVkIGludCBzZWNGbGFnczsKIEdMT0JBTF9FWFRFUk4gdW5zaWduZWQgaW50IGxpbnV4RXh0RW5hYmxlZDsvKmVuYWJsZSBMaW51eC9Vbml4IENJRlMgZXh0ZW5zaW9ucyovCiBHTE9CQUxfRVhURVJOIHVuc2lnbmVkIGludCBDSUZTTWF4QnVmU2l6ZTsgIC8qIG1heCBzaXplIG5vdCBpbmNsdWRpbmcgaGRyICovCiBHTE9CQUxfRVhURVJOIHVuc2lnbmVkIGludCBjaWZzX21pbl9yY3Y7ICAgIC8qIG1pbiBzaXplIG9mIGJpZyBudHdyayBidWYgcG9vbCAqLwpkaWZmIC0tZ2l0IGEvZnMvY2lmcy9jaWZzcGR1LmggYi9mcy9jaWZzL2NpZnNwZHUuaAppbmRleCA4MWRmMmJmLi42ZGY5ZGFkIDEwMDY0NAotLS0gYS9mcy9jaWZzL2NpZnNwZHUuaAorKysgYi9mcy9jaWZzL2NpZnNwZHUuaApAQCAtMjYsNyArMjYsOCBAQAogCiAjaWZkZWYgQ09ORklHX0NJRlNfV0VBS19QV19IQVNICiAjZGVmaW5lIExBTk1BTl9QUk9UIDAKLSNkZWZpbmUgQ0lGU19QUk9UICAgMQorI2RlZmluZSBMQU5NQU4yX1BST1QgMQorI2RlZmluZSBDSUZTX1BST1QgICAyCiAjZWxzZQogI2RlZmluZSBDSUZTX1BST1QgICAwCiAjZW5kaWYKQEAgLTQwOCw2ICs0MDksOCBAQAogCiAvKiBEaWFsZWN0IGluZGV4IGlzIDEzIGZvciBMQU5NQU4gKi8KIAorI2RlZmluZSBNSU5fVFpfQURKICgxNSAqIDYwKSAvKiBtaW5pbXVtIGdyaWQgZm9yIHRpbWV6b25lcyBpbiBzZWNvbmRzICovCisKIHR5cGVkZWYgc3RydWN0IGxhbm1hbl9uZWdfcnNwIHsKIAlzdHJ1Y3Qgc21iX2hkciBoZHI7CS8qIHdjdCA9IDEzICovCiAJX19sZTE2IERpYWxlY3RJbmRleDsKQEAgLTQxNyw3ICs0MjAsMTAgQEAKIAlfX2xlMTYgTWF4TnVtYmVyVmNzOwogCV9fbGUxNiBSYXdNb2RlOwogCV9fbGUzMiBTZXNzaW9uS2V5OwotCV9fbGUzMiBTZXJ2ZXJUaW1lOworCXN0cnVjdCB7CisJCV9fbGUxNiBUaW1lOworCQlfX2xlMTYgRGF0ZTsKKwl9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpIFNydlRpbWU7CiAJX19sZTE2IFNlcnZlclRpbWVab25lOwogCV9fbGUxNiBFbmNyeXB0aW9uS2V5TGVuZ3RoOwogCV9fbGUxNiBSZXNlcnZlZDsKQEAgLTY3NCw3ICs2ODAsNyBAQAogdHlwZWRlZiBzdHJ1Y3Qgc21iX2NvbV9jbG9zZV9yZXEgewogCXN0cnVjdCBzbWJfaGRyIGhkcjsJLyogd2N0ID0gMyAqLwogCV9fdTE2IEZpbGVJRDsKLQlfX3UzMiBMYXN0V3JpdGVUaW1lOwkvKiBzaG91bGQgYmUgemVybyAqLworCV9fdTMyIExhc3RXcml0ZVRpbWU7CS8qIHNob3VsZCBiZSB6ZXJvIG9yIC0xICovCiAJX191MTYgQnl0ZUNvdW50OwkvKiAwICovCiB9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpIENMT1NFX1JFUTsKIApkaWZmIC0tZ2l0IGEvZnMvY2lmcy9jaWZzcHJvdG8uaCBiL2ZzL2NpZnMvY2lmc3Byb3RvLmgKaW5kZXggYjM1YzU1Yy4uZjFmODIyNSAxMDA2NDQKLS0tIGEvZnMvY2lmcy9jaWZzcHJvdG8uaAorKysgYi9mcy9jaWZzL2NpZnNwcm90by5oCkBAIC01MCwxMiArNTAsMTIgQEAKIGV4dGVybiBpbnQgU2VuZFJlY2VpdmUyKGNvbnN0IHVuc2lnbmVkIGludCAvKiB4aWQgKi8gLCBzdHJ1Y3QgY2lmc1Nlc0luZm8gKiwKIAkJCXN0cnVjdCBrdmVjICosIGludCAvKiBudmVjIHRvIHNlbmQgKi8sIAogCQkJaW50ICogLyogdHlwZSBvZiBidWYgcmV0dXJuZWQgKi8gLCBjb25zdCBpbnQgbG9uZ19vcCk7Ci1leHRlcm4gaW50IFNlbmRSZWNlaXZlQmxvY2tpbmdMb2NrKGNvbnN0IHVuc2lnbmVkIGludCAvKiB4aWQgKi8gLCBzdHJ1Y3QgY2lmc1Rjb25JbmZvICosCitleHRlcm4gaW50IFNlbmRSZWNlaXZlQmxvY2tpbmdMb2NrKGNvbnN0IHVuc2lnbmVkIGludCAvKiB4aWQgKi8gLCAKKwkJCQkJc3RydWN0IGNpZnNUY29uSW5mbyAqLAogCQkJCXN0cnVjdCBzbWJfaGRyICogLyogaW5wdXQgKi8gLAogCQkJCXN0cnVjdCBzbWJfaGRyICogLyogb3V0ICovICwKIAkJCQlpbnQgKiAvKiBieXRlcyByZXR1cm5lZCAqLyk7Ci1leHRlcm4gaW50IGNoZWNrU01CaGRyKHN0cnVjdCBzbWJfaGRyICpzbWIsIF9fdTE2IG1pZCk7Ci1leHRlcm4gaW50IGNoZWNrU01CKHN0cnVjdCBzbWJfaGRyICpzbWIsIF9fdTE2IG1pZCwgaW50IGxlbmd0aCk7CitleHRlcm4gaW50IGNoZWNrU01CKHN0cnVjdCBzbWJfaGRyICpzbWIsIF9fdTE2IG1pZCwgdW5zaWduZWQgaW50IGxlbmd0aCk7CiBleHRlcm4gaW50IGlzX3ZhbGlkX29wbG9ja19icmVhayhzdHJ1Y3Qgc21iX2hkciAqc21iLCBzdHJ1Y3QgVENQX1NlcnZlcl9JbmZvICopOwogZXh0ZXJuIGludCBpc19zaXplX3NhZmVfdG9fY2hhbmdlKHN0cnVjdCBjaWZzSW5vZGVJbmZvICopOwogZXh0ZXJuIHN0cnVjdCBjaWZzRmlsZUluZm8gKmZpbmRfd3JpdGFibGVfZmlsZShzdHJ1Y3QgY2lmc0lub2RlSW5mbyAqKTsKQEAgLTgwLDYgKzgwLDkgQEAKIGV4dGVybiB2b2lkIERlbGV0ZU9wbG9ja1FFbnRyeShzdHJ1Y3Qgb3Bsb2NrX3FfZW50cnkgKik7CiBleHRlcm4gc3RydWN0IHRpbWVzcGVjIGNpZnNfTlR0aW1lVG9Vbml4KHU2NCAvKiB1dGMgbmFub3NlY29uZHMgc2luY2UgMTYwMSAqLyApOwogZXh0ZXJuIHU2NCBjaWZzX1VuaXhUaW1lVG9OVChzdHJ1Y3QgdGltZXNwZWMpOworZXh0ZXJuIF9fbGU2NCBjbnZydERvc0NpZnNUbShfX3UxNiBkYXRlLCBfX3UxNiB0aW1lKTsKK2V4dGVybiBzdHJ1Y3QgdGltZXNwZWMgY252cnREb3NVbml4VG0oX191MTYgZGF0ZSwgX191MTYgdGltZSk7CisKIGV4dGVybiBpbnQgY2lmc19nZXRfaW5vZGVfaW5mbyhzdHJ1Y3QgaW5vZGUgKipwaW5vZGUsCiAJCQljb25zdCB1bnNpZ25lZCBjaGFyICpzZWFyY2hfcGF0aCwgCiAJCQlGSUxFX0FMTF9JTkZPICogcGZpbGVfaW5mbywKQEAgLTExNiw2ICsxMTksNyBAQAogZXh0ZXJuIGludCBDSUZTU01CUVBhdGhJbmZvKGNvbnN0IGludCB4aWQsIHN0cnVjdCBjaWZzVGNvbkluZm8gKnRjb24sCiAJCQljb25zdCB1bnNpZ25lZCBjaGFyICpzZWFyY2hOYW1lLAogCQkJRklMRV9BTExfSU5GTyAqIGZpbmREYXRhLAorCQkJaW50IGxlZ2FjeSAvKiB3aGV0aGVyIHRvIHVzZSBvbGQgaW5mbyBsZXZlbCAqLywKIAkJCWNvbnN0IHN0cnVjdCBubHNfdGFibGUgKm5sc19jb2RlcGFnZSwgaW50IHJlbWFwKTsKIGV4dGVybiBpbnQgU01CUXVlcnlJbmZvcm1hdGlvbihjb25zdCBpbnQgeGlkLCBzdHJ1Y3QgY2lmc1Rjb25JbmZvICp0Y29uLAogICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdW5zaWduZWQgY2hhciAqc2VhcmNoTmFtZSwKQEAgLTI3OSw4ICsyODMsNiBAQAogZXh0ZXJuIHN0cnVjdCBjaWZzVGNvbkluZm8gKnRjb25JbmZvQWxsb2Modm9pZCk7CiBleHRlcm4gdm9pZCB0Y29uSW5mb0ZyZWUoc3RydWN0IGNpZnNUY29uSW5mbyAqKTsKIAotZXh0ZXJuIGludCBjaWZzX3JlY29ubmVjdChzdHJ1Y3QgVENQX1NlcnZlcl9JbmZvICpzZXJ2ZXIpOwotCiBleHRlcm4gaW50IGNpZnNfc2lnbl9zbWIoc3RydWN0IHNtYl9oZHIgKiwgc3RydWN0IFRDUF9TZXJ2ZXJfSW5mbyAqLF9fdTMyICopOwogZXh0ZXJuIGludCBjaWZzX3NpZ25fc21iMihzdHJ1Y3Qga3ZlYyAqaW92LCBpbnQgbl92ZWMsIHN0cnVjdCBUQ1BfU2VydmVyX0luZm8gKiwKIAkJCSAgX191MzIgKik7CmRpZmYgLS1naXQgYS9mcy9jaWZzL2NpZnNzbWIuYyBiL2ZzL2NpZnMvY2lmc3NtYi5jCmluZGV4IDA3NWQ4ZmIuLjA5ODc5MGUgMTAwNjQ0Ci0tLSBhL2ZzL2NpZnMvY2lmc3NtYi5jCisrKyBiL2ZzL2NpZnMvY2lmc3NtYi5jCkBAIC00Niw2ICs0Niw3IEBACiB9IHByb3RvY29sc1tdID0gewogI2lmZGVmIENPTkZJR19DSUZTX1dFQUtfUFdfSEFTSAogCXtMQU5NQU5fUFJPVCwgIlwyTE0xLjJYMDAyIn0sCisJe0xBTk1BTjJfUFJPVCwgIlwyTEFOTUFOMi4xIn0sCiAjZW5kaWYgLyogd2VhayBwYXNzd29yZCBoYXNoaW5nIGZvciBsZWdhY3kgY2xpZW50cyAqLwogCXtDSUZTX1BST1QsICJcMk5UIExNIDAuMTIifSwgCiAJe1BPU0lYX1BST1QsICJcMlBPU0lYIDIifSwKQEAgLTU4LDYgKzU5LDcgQEAKIH0gcHJvdG9jb2xzW10gPSB7CiAjaWZkZWYgQ09ORklHX0NJRlNfV0VBS19QV19IQVNICiAJe0xBTk1BTl9QUk9ULCAiXDJMTTEuMlgwMDIifSwKKwl7TEFOTUFOMl9QUk9ULCAiXDJMQU5NQU4yLjEifSwKICNlbmRpZiAvKiB3ZWFrIHBhc3N3b3JkIGhhc2hpbmcgZm9yIGxlZ2FjeSBjbGllbnRzICovCiAJe0NJRlNfUFJPVCwgIlwyTlQgTE0gMC4xMiJ9LCAKIAl7QkFEX1BST1QsICJcMiJ9CkBAIC02NywxMyArNjksMTMgQEAKIC8qIGRlZmluZSB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBjaWZzIGRpYWxlY3QgYXJyYXkgKi8KICNpZmRlZiBDT05GSUdfQ0lGU19QT1NJWAogI2lmZGVmIENPTkZJR19DSUZTX1dFQUtfUFdfSEFTSAotI2RlZmluZSBDSUZTX05VTV9QUk9UIDMKKyNkZWZpbmUgQ0lGU19OVU1fUFJPVCA0CiAjZWxzZQogI2RlZmluZSBDSUZTX05VTV9QUk9UIDIKICNlbmRpZiAvKiBDSUZTX1dFQUtfUFdfSEFTSCAqLwogI2Vsc2UgLyogbm90IHBvc2l4ICovCiAjaWZkZWYgQ09ORklHX0NJRlNfV0VBS19QV19IQVNICi0jZGVmaW5lIENJRlNfTlVNX1BST1QgMgorI2RlZmluZSBDSUZTX05VTV9QUk9UIDMKICNlbHNlCiAjZGVmaW5lIENJRlNfTlVNX1BST1QgMQogI2VuZGlmIC8qIENPTkZJR19DSUZTX1dFQUtfUFdfSEFTSCAqLwpAQCAtMzk3LDYgKzM5OSw3IEBACiAJc3RydWN0IFRDUF9TZXJ2ZXJfSW5mbyAqIHNlcnZlcjsKIAl1MTYgY291bnQ7CiAJdW5zaWduZWQgaW50IHNlY0ZsYWdzOworCXUxNiBkaWFsZWN0OwogCiAJaWYoc2VzLT5zZXJ2ZXIpCiAJCXNlcnZlciA9IHNlcy0+c2VydmVyOwpAQCAtNDM2LDkgKzQzOSwxMCBAQAogCWlmIChyYyAhPSAwKSAKIAkJZ290byBuZWdfZXJyX2V4aXQ7CiAKLQljRllJKDEsKCJEaWFsZWN0OiAlZCIsIHBTTUJyLT5EaWFsZWN0SW5kZXgpKTsKKwlkaWFsZWN0ID0gbGUxNl90b19jcHUocFNNQnItPkRpYWxlY3RJbmRleCk7CisJY0ZZSSgxLCgiRGlhbGVjdDogJWQiLCBkaWFsZWN0KSk7CiAJLyogQ2hlY2sgd2N0ID0gMSBlcnJvciBjYXNlICovCi0JaWYoKHBTTUJyLT5oZHIuV29yZENvdW50IDwgMTMpIHx8IChwU01Cci0+RGlhbGVjdEluZGV4ID09IEJBRF9QUk9UKSkgeworCWlmKChwU01Cci0+aGRyLldvcmRDb3VudCA8IDEzKSB8fCAoZGlhbGVjdCA9PSBCQURfUFJPVCkpIHsKIAkJLyogY29yZSByZXR1cm5zIHdjdCA9IDEsIGJ1dCB3ZSBkbyBub3QgYXNrIGZvciBjb3JlIC0gb3RoZXJ3aXNlCiAJCXNtYWxsIHdjdCBqdXN0IGNvbWVzIHdoZW4gZGlhbGVjdCBpbmRleCBpcyAtMSBpbmRpY2F0aW5nIHdlIAogCQljb3VsZCBub3QgbmVnb3RpYXRlIGEgY29tbW9uIGRpYWxlY3QgKi8KQEAgLTQ0Niw3ICs0NTAsOSBAQAogCQlnb3RvIG5lZ19lcnJfZXhpdDsKICNpZmRlZiBDT05GSUdfQ0lGU19XRUFLX1BXX0hBU0ggCiAJfSBlbHNlIGlmKChwU01Cci0+aGRyLldvcmRDb3VudCA9PSAxMykKLQkJCSYmIChwU01Cci0+RGlhbGVjdEluZGV4ID09IExBTk1BTl9QUk9UKSkgeworCQkJJiYgKChkaWFsZWN0ID09IExBTk1BTl9QUk9UKQorCQkJCXx8IChkaWFsZWN0ID09IExBTk1BTjJfUFJPVCkpKSB7CisJCV9fczE2IHRtcDsKIAkJc3RydWN0IGxhbm1hbl9uZWdfcnNwICogcnNwID0gKHN0cnVjdCBsYW5tYW5fbmVnX3JzcCAqKXBTTUJyOwogCiAJCWlmKChzZWNGbGFncyAmIENJRlNTRUNfTUFZX0xBTk1BTikgfHwgCkBAIC00NzIsMTIgKzQ3OCw0NCBAQAogCQkJc2VydmVyLT5tYXhSdyA9IDA7Lyogd2UgZG8gbm90IG5lZWQgdG8gdXNlIHJhdyBhbnl3YXkgKi8KIAkJCXNlcnZlci0+Y2FwYWJpbGl0aWVzID0gQ0FQX01QWF9NT0RFOwogCQl9Ci0JCXNlcnZlci0+dGltZVpvbmUgPSBsZTE2X3RvX2NwdShyc3AtPlNlcnZlclRpbWVab25lKTsKKwkJdG1wID0gKF9fczE2KWxlMTZfdG9fY3B1KHJzcC0+U2VydmVyVGltZVpvbmUpOworCQlpZiAodG1wID09IC0xKSB7CisJCQkvKiBPUy8yIG9mdGVuIGRvZXMgbm90IHNldCB0aW1lem9uZSB0aGVyZWZvcmUKKwkJCSAqIHdlIG11c3QgdXNlIHNlcnZlciB0aW1lIHRvIGNhbGMgdGltZSB6b25lLgorCQkJICogQ291bGQgZGV2aWF0ZSBzbGlnaHRseSBmcm9tIHRoZSByaWdodCB6b25lLgorCQkJICogU21hbGxlc3QgZGVmaW5lZCB0aW1lem9uZSBkaWZmZXJlbmNlIGlzIDE1IG1pbnV0ZXMKKwkJCSAqIChpLmUuIE5lcGFsKS4gIFJvdW5kaW5nIHVwL2Rvd24gaXMgZG9uZSB0byBtYXRjaAorCQkJICogdGhpcyByZXF1aXJlbWVudC4KKwkJCSAqLworCQkJaW50IHZhbCwgc2Vjb25kcywgcmVtYWluLCByZXN1bHQ7CisJCQlzdHJ1Y3QgdGltZXNwZWMgdHMsIHV0YzsKKwkJCXV0YyA9IENVUlJFTlRfVElNRTsKKwkJCXRzID0gY252cnREb3NVbml4VG0obGUxNl90b19jcHUocnNwLT5TcnZUaW1lLkRhdGUpLAorCQkJCQkJbGUxNl90b19jcHUocnNwLT5TcnZUaW1lLlRpbWUpKTsKKwkJCWNGWUkoMSwoIlNydlRpbWU6ICVkIHNlYyBzaW5jZSAxOTcwICh1dGM6ICVkKSBkaWZmOiAlZCIsCisJCQkJKGludCl0cy50dl9zZWMsIChpbnQpdXRjLnR2X3NlYywgCisJCQkJKGludCkodXRjLnR2X3NlYyAtIHRzLnR2X3NlYykpKTsKKwkJCXZhbCA9IChpbnQpKHV0Yy50dl9zZWMgLSB0cy50dl9zZWMpOworCQkJc2Vjb25kcyA9IHZhbCA8IDAgPyAtdmFsIDogdmFsOworCQkJcmVzdWx0ID0gKHNlY29uZHMgLyBNSU5fVFpfQURKKSAqIE1JTl9UWl9BREo7CisJCQlyZW1haW4gPSBzZWNvbmRzICUgTUlOX1RaX0FESjsKKwkJCWlmKHJlbWFpbiA+PSAoTUlOX1RaX0FESiAvIDIpKQorCQkJCXJlc3VsdCArPSBNSU5fVFpfQURKOworCQkJaWYodmFsIDwgMCkKKwkJCQlyZXN1bHQgPSAtIHJlc3VsdDsKKwkJCXNlcnZlci0+dGltZUFkaiA9IHJlc3VsdDsKKwkJfSBlbHNlIHsKKwkJCXNlcnZlci0+dGltZUFkaiA9IChpbnQpdG1wOworCQkJc2VydmVyLT50aW1lQWRqICo9IDYwOyAvKiBhbHNvIGluIHNlY29uZHMgKi8KKwkJfQorCQljRllJKDEsKCJzZXJ2ZXItPnRpbWVBZGo6ICVkIHNlY29uZHMiLCBzZXJ2ZXItPnRpbWVBZGopKTsKKwogCiAJCS8qIEJCIGdldCBzZXJ2ZXIgdGltZSBmb3IgdGltZSBjb252ZXJzaW9ucyBhbmQgYWRkCiAJCWNvZGUgdG8gdXNlIGl0IGFuZCB0aW1lem9uZSBzaW5jZSB0aGlzIGlzIG5vdCBVVEMgKi8JCiAKLQkJaWYgKHJzcC0+RW5jcnlwdGlvbktleUxlbmd0aCA9PSBjcHVfdG9fbGUxNihDSUZTX0NSWVBUT19LRVlfU0laRSkpIHsKKwkJaWYgKHJzcC0+RW5jcnlwdGlvbktleUxlbmd0aCA9PSAKKwkJCQljcHVfdG9fbGUxNihDSUZTX0NSWVBUT19LRVlfU0laRSkpIHsKIAkJCW1lbWNweShzZXJ2ZXItPmNyeXB0S2V5LCByc3AtPkVuY3J5cHRpb25LZXksCiAJCQkJQ0lGU19DUllQVE9fS0VZX1NJWkUpOwogCQl9IGVsc2UgaWYgKHNlcnZlci0+c2VjTW9kZSAmIFNFQ01PREVfUFdfRU5DUllQVCkgewpAQCAtNTMxLDcgKzU2OSw4IEBACiAJY0ZZSSgwLCAoIk1heCBidWYgPSAlZCIsIHNlcy0+c2VydmVyLT5tYXhCdWYpKTsKIAlHRVRVMzIoc2VzLT5zZXJ2ZXItPnNlc3NpZCkgPSBsZTMyX3RvX2NwdShwU01Cci0+U2Vzc2lvbktleSk7CiAJc2VydmVyLT5jYXBhYmlsaXRpZXMgPSBsZTMyX3RvX2NwdShwU01Cci0+Q2FwYWJpbGl0aWVzKTsKLQlzZXJ2ZXItPnRpbWVab25lID0gbGUxNl90b19jcHUocFNNQnItPlNlcnZlclRpbWVab25lKTsJCisJc2VydmVyLT50aW1lQWRqID0gKGludCkoX19zMTYpbGUxNl90b19jcHUocFNNQnItPlNlcnZlclRpbWVab25lKTsKKwlzZXJ2ZXItPnRpbWVBZGogKj0gNjA7CiAJaWYgKHBTTUJyLT5FbmNyeXB0aW9uS2V5TGVuZ3RoID09IENJRlNfQ1JZUFRPX0tFWV9TSVpFKSB7CiAJCW1lbWNweShzZXJ2ZXItPmNyeXB0S2V5LCBwU01Cci0+dS5FbmNyeXB0aW9uS2V5LAogCQkgICAgICAgQ0lGU19DUllQVE9fS0VZX1NJWkUpOwpAQCAtMTYxNyw3ICsxNjU2LDcgQEAKIAlwU01CciA9IChDTE9TRV9SU1AgKilwU01COyAvKiBCQiByZW1vdmVtZSBCQiAqLwogCiAJcFNNQi0+RmlsZUlEID0gKF9fdTE2KSBzbWJfZmlsZV9pZDsKLQlwU01CLT5MYXN0V3JpdGVUaW1lID0gMDsKKwlwU01CLT5MYXN0V3JpdGVUaW1lID0gMHhGRkZGRkZGRjsKIAlwU01CLT5CeXRlQ291bnQgPSAwOwogCXJjID0gU2VuZFJlY2VpdmUoeGlkLCB0Y29uLT5zZXMsIChzdHJ1Y3Qgc21iX2hkciAqKSBwU01CLAogCQkJIChzdHJ1Y3Qgc21iX2hkciAqKSBwU01CciwgJmJ5dGVzX3JldHVybmVkLCAwKTsKQEAgLTI3NzMsOSArMjgxMiwxMSBAQAogCiAKIC8qIHNlY3VyaXR5IGlkIGZvciBldmVyeW9uZSAqLwotY29uc3Qgc3RydWN0IGNpZnNfc2lkIHNpZF9ldmVyeW9uZSA9IHsxLCAxLCB7MCwgMCwgMCwgMCwgMCwgMH0sIHswLCAwLCAwLCAwfX07Citjb25zdCBzdGF0aWMgc3RydWN0IGNpZnNfc2lkIHNpZF9ldmVyeW9uZSA9IAorCQl7MSwgMSwgezAsIDAsIDAsIDAsIDAsIDB9LCB7MCwgMCwgMCwgMH19OwogLyogZ3JvdXAgdXNlcnMgKi8KLWNvbnN0IHN0cnVjdCBjaWZzX3NpZCBzaWRfdXNlciA9IHsxLCAyICwgezAsIDAsIDAsIDAsIDAsIDV9LCB7MzIsIDU0NSwgMCwgMH19OworY29uc3Qgc3RhdGljIHN0cnVjdCBjaWZzX3NpZCBzaWRfdXNlciA9IAorCQl7MSwgMiAsIHswLCAwLCAwLCAwLCAwLCA1fSwgezMyLCA1NDUsIDAsIDB9fTsKIAogLyogQ29udmVydCBDSUZTIEFDTCB0byBQT1NJWCBmb3JtICovCiBzdGF0aWMgaW50IHBhcnNlX3NlY19kZXNjKHN0cnVjdCBjaWZzX3NpZCAqIHBzZWNfZGVzYywgaW50IGFjbF9sZW4pCkBAIC0yODU2LDcgKzI4OTcsNiBAQAogCXJldHVybiByYzsKIH0KIAotCiAvKiBMZWdhY3kgUXVlcnkgUGF0aCBJbmZvcm1hdGlvbiBjYWxsIGZvciBsb29rdXAgdG8gb2xkIHNlcnZlcnMgc3VjaAogICAgYXMgV2luOXgvV2luTUUgKi8KIGludCBTTUJRdWVyeUluZm9ybWF0aW9uKGNvbnN0IGludCB4aWQsIHN0cnVjdCBjaWZzVGNvbkluZm8gKnRjb24sCkBAIC0yODk4LDcgKzI5MzgsMTYgQEAKIAlpZiAocmMpIHsKIAkJY0ZZSSgxLCAoIlNlbmQgZXJyb3IgaW4gUXVlcnlJbmZvID0gJWQiLCByYykpOwogCX0gZWxzZSBpZiAocEZpbmZvKSB7ICAgICAgICAgICAgLyogZGVjb2RlIHJlc3BvbnNlICovCisJCXN0cnVjdCB0aW1lc3BlYyB0czsKKwkJX191MzIgdGltZSA9IGxlMzJfdG9fY3B1KHBTTUJyLT5sYXN0X3dyaXRlX3RpbWUpOworCQkvKiBCQiBGSVhNRSAtIGFkZCB0aW1lIHpvbmUgYWRqdXN0bWVudCBCQiAqLwogCQltZW1zZXQocEZpbmZvLCAwLCBzaXplb2YoRklMRV9BTExfSU5GTykpOworCQl0cy50dl9uc2VjID0gMDsKKwkJdHMudHZfc2VjID0gdGltZTsKKwkJLyogZGVjb2RlIHRpbWUgZmllbGRzICovCisJCXBGaW5mby0+Q2hhbmdlVGltZSA9IGNwdV90b19sZTY0KGNpZnNfVW5peFRpbWVUb05UKHRzKSk7CisJCXBGaW5mby0+TGFzdFdyaXRlVGltZSA9IHBGaW5mby0+Q2hhbmdlVGltZTsKKwkJcEZpbmZvLT5MYXN0QWNjZXNzVGltZSA9IDA7CiAJCXBGaW5mby0+QWxsb2NhdGlvblNpemUgPQogCQkJY3B1X3RvX2xlNjQobGUzMl90b19jcHUocFNNQnItPnNpemUpKTsKIAkJcEZpbmZvLT5FbmRPZkZpbGUgPSBwRmluZm8tPkFsbG9jYXRpb25TaXplOwpAQCAtMjkyMiw2ICsyOTcxLDcgQEAKIENJRlNTTUJRUGF0aEluZm8oY29uc3QgaW50IHhpZCwgc3RydWN0IGNpZnNUY29uSW5mbyAqdGNvbiwKIAkJIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNlYXJjaE5hbWUsCiAJCSBGSUxFX0FMTF9JTkZPICogcEZpbmREYXRhLAorCQkgaW50IGxlZ2FjeSAvKiBvbGQgc3R5bGUgaW5mb2xldmVsICovLAogCQkgY29uc3Qgc3RydWN0IG5sc190YWJsZSAqbmxzX2NvZGVwYWdlLCBpbnQgcmVtYXApCiB7CiAvKiBsZXZlbCAyNjMgU01CX1FVRVJZX0ZJTEVfQUxMX0lORk8gKi8KQEAgLTI5NzAsNyArMzAyMCwxMCBAQAogCWJ5dGVfY291bnQgPSBwYXJhbXMgKyAxIC8qIHBhZCAqLyA7CiAJcFNNQi0+VG90YWxQYXJhbWV0ZXJDb3VudCA9IGNwdV90b19sZTE2KHBhcmFtcyk7CiAJcFNNQi0+UGFyYW1ldGVyQ291bnQgPSBwU01CLT5Ub3RhbFBhcmFtZXRlckNvdW50OwotCXBTTUItPkluZm9ybWF0aW9uTGV2ZWwgPSBjcHVfdG9fbGUxNihTTUJfUVVFUllfRklMRV9BTExfSU5GTyk7CisJaWYobGVnYWN5KQorCQlwU01CLT5JbmZvcm1hdGlvbkxldmVsID0gY3B1X3RvX2xlMTYoU01CX0lORk9fU1RBTkRBUkQpOworCWVsc2UKKwkJcFNNQi0+SW5mb3JtYXRpb25MZXZlbCA9IGNwdV90b19sZTE2KFNNQl9RVUVSWV9GSUxFX0FMTF9JTkZPKTsKIAlwU01CLT5SZXNlcnZlZDQgPSAwOwogCXBTTUItPmhkci5zbWJfYnVmX2xlbmd0aCArPSBieXRlX2NvdW50OwogCXBTTUItPkJ5dGVDb3VudCA9IGNwdV90b19sZTE2KGJ5dGVfY291bnQpOwpAQCAtMjk4MiwxMyArMzAzNSwyNCBAQAogCX0gZWxzZSB7CQkvKiBkZWNvZGUgcmVzcG9uc2UgKi8KIAkJcmMgPSB2YWxpZGF0ZV90Migoc3RydWN0IHNtYl90Ml9yc3AgKilwU01Ccik7CiAKLQkJaWYgKHJjIHx8IChwU01Cci0+Qnl0ZUNvdW50IDwgNDApKSAKKwkJaWYgKHJjKSAvKiBCQiBhZGQgYXV0byByZXRyeSBvbiBFT1BOT1RTVVBQPyAqLworCQkJcmMgPSAtRUlPOworCQllbHNlIGlmICghbGVnYWN5ICYmIChwU01Cci0+Qnl0ZUNvdW50IDwgNDApKSAKIAkJCXJjID0gLUVJTzsJLyogYmFkIHNtYiAqLworCQllbHNlIGlmKGxlZ2FjeSAmJiAocFNNQnItPkJ5dGVDb3VudCA8IDI0KSkKKwkJCXJjID0gLUVJTzsgIC8qIDI0IG9yIDI2IGV4cGVjdGVkIGJ1dCB3ZSBkbyBub3QgcmVhZCBsYXN0IGZpZWxkICovCiAJCWVsc2UgaWYgKHBGaW5kRGF0YSl7CisJCQlpbnQgc2l6ZTsKIAkJCV9fdTE2IGRhdGFfb2Zmc2V0ID0gbGUxNl90b19jcHUocFNNQnItPnQyLkRhdGFPZmZzZXQpOworCQkJaWYobGVnYWN5KSAvKiB3ZSBkbyBub3QgcmVhZCB0aGUgbGFzdCBmaWVsZCwgRUFzaXplLCBmb3J0dW5hdGVseQorCQkJCQkgICBzaW5jZSBpdCB2YXJpZXMgYnkgc3ViZGlhbGVjdCBhbmQgb24gU2V0IHZzLiBHZXQsIGlzICAKKwkJCQkJICAgdHdvIGJ5dGVzIG9yIDQgYnl0ZXMgZGVwZW5kaW5nIGJ1dCB3ZSBkb24ndCBjYXJlIGhlcmUgKi8KKwkJCQlzaXplID0gc2l6ZW9mKEZJTEVfSU5GT19TVEFOREFSRCk7CisJCQllbHNlCisJCQkJc2l6ZSA9IHNpemVvZihGSUxFX0FMTF9JTkZPKTsKIAkJCW1lbWNweSgoY2hhciAqKSBwRmluZERhdGEsCiAJCQkgICAgICAgKGNoYXIgKikgJnBTTUJyLT5oZHIuUHJvdG9jb2wgKwotCQkJICAgICAgIGRhdGFfb2Zmc2V0LCBzaXplb2YgKEZJTEVfQUxMX0lORk8pKTsKKwkJCSAgICAgICBkYXRhX29mZnNldCwgc2l6ZSk7CiAJCX0gZWxzZQogCQkgICAgcmMgPSAtRU5PTUVNOwogCX0KQEAgLTM2MTMsNiArMzY3NywxNCBAQAogCQlzdHJuY3B5KHBTTUItPlJlcXVlc3RGaWxlTmFtZSwgc2VhcmNoTmFtZSwgbmFtZV9sZW4pOwogCX0KIAorCWlmKHNlcy0+c2VydmVyKSB7CisJCWlmKHNlcy0+c2VydmVyLT5zZWNNb2RlICYKKwkJICAgKFNFQ01PREVfU0lHTl9SRVFVSVJFRCB8IFNFQ01PREVfU0lHTl9FTkFCTEVEKSkKKwkJCXBTTUItPmhkci5GbGFnczIgfD0gU01CRkxHMl9TRUNVUklUWV9TSUdOQVRVUkU7CisJfQorCisgICAgICAgIHBTTUItPmhkci5VaWQgPSBzZXMtPlN1aWQ7CisKIAlwYXJhbXMgPSAyIC8qIGxldmVsICovICArIG5hbWVfbGVuIC8qaW5jbHVkZXMgbnVsbCAqLyA7CiAJcFNNQi0+VG90YWxEYXRhQ291bnQgPSAwOwogCXBTTUItPkRhdGFDb3VudCA9IDA7CmRpZmYgLS1naXQgYS9mcy9jaWZzL2Nvbm5lY3QuYyBiL2ZzL2NpZnMvY29ubmVjdC5jCmluZGV4IGM3ODc2MjAuLjcxZjc3OTEgMTAwNjQ0Ci0tLSBhL2ZzL2NpZnMvY29ubmVjdC5jCisrKyBiL2ZzL2NpZnMvY29ubmVjdC5jCkBAIC0xMDksNyArMTA5LDcgQEAKIAkgKiB3YWtlIHVwIHdhaXRlcnMgb24gcmVjb25uZWN0aW9uPyAtIChub3QgbmVlZGVkIGN1cnJlbnRseSkKIAkgKi8KIAotaW50CitzdGF0aWMgaW50CiBjaWZzX3JlY29ubmVjdChzdHJ1Y3QgVENQX1NlcnZlcl9JbmZvICpzZXJ2ZXIpCiB7CiAJaW50IHJjID0gMDsKQEAgLTc3MSwxMyArNzcxLDE4IEBACiAJc2VwYXJhdG9yWzBdID0gJywnOwogCXNlcGFyYXRvclsxXSA9IDA7IAogCi0JbWVtc2V0KHZvbC0+c291cmNlX3JmYzEwMDFfbmFtZSwweDIwLDE1KTsKLQlmb3IoaT0wO2kgPCBzdHJubGVuKHV0c25hbWUoKS0+bm9kZW5hbWUsMTUpO2krKykgewotCQkvKiBkb2VzIG5vdCBoYXZlIHRvIGJlIGEgcGVyZmVjdCBtYXBwaW5nIHNpbmNlIHRoZSBmaWVsZCBpcwotCQlpbmZvcm1hdGlvbmFsLCBvbmx5IHVzZWQgZm9yIHNlcnZlcnMgdGhhdCBkbyBub3Qgc3VwcG9ydAotCQlwb3J0IDQ0NSBhbmQgaXQgY2FuIGJlIG92ZXJyaWRkZW4gYXQgbW91bnQgdGltZSAqLwotCQl2b2wtPnNvdXJjZV9yZmMxMDAxX25hbWVbaV0gPSAKLQkJCXRvdXBwZXIodXRzbmFtZSgpLT5ub2RlbmFtZVtpXSk7CisJaWYgKExvY2FsX1N5c3RlbV9OYW1lWzBdICE9IDApCisJCW1lbWNweSh2b2wtPnNvdXJjZV9yZmMxMDAxX25hbWUsIExvY2FsX1N5c3RlbV9OYW1lLDE1KTsKKwllbHNlIHsKKwkJY2hhciAqbm9kZW5hbWUgPSB1dHNuYW1lKCktPm5vZGVuYW1lOworCQlpbnQgbiA9IHN0cm5sZW4obm9kZW5hbWUsMTUpOworCQltZW1zZXQodm9sLT5zb3VyY2VfcmZjMTAwMV9uYW1lLDB4MjAsMTUpOworCQlmb3IoaT0wIDsgaSA8IG4gOyBpKyspIHsKKwkJCS8qIGRvZXMgbm90IGhhdmUgdG8gYmUgcGVyZmVjdCBtYXBwaW5nIHNpbmNlIGZpZWxkIGlzCisJCQlpbmZvcm1hdGlvbmFsLCBvbmx5IHVzZWQgZm9yIHNlcnZlcnMgdGhhdCBkbyBub3Qgc3VwcG9ydAorCQkJcG9ydCA0NDUgYW5kIGl0IGNhbiBiZSBvdmVycmlkZGVuIGF0IG1vdW50IHRpbWUgKi8KKwkJCXZvbC0+c291cmNlX3JmYzEwMDFfbmFtZVtpXSA9IHRvdXBwZXIobm9kZW5hbWVbaV0pOworCQl9CiAJfQogCXZvbC0+c291cmNlX3JmYzEwMDFfbmFtZVsxNV0gPSAwOwogCS8qIG51bGwgdGFyZ2V0IG5hbWUgaW5kaWNhdGVzIHRvIHVzZSAqU01CU0VSVlIgZGVmYXVsdCBjYWxsZWQgbmFtZQpAQCAtODE3LDEwICs4MjIsMTMgQEAKIAkJfSBlbHNlIGlmIChzdHJuaWNtcChkYXRhLCAibm91c2VyX3hhdHRyIiwxMikgPT0gMCkgewogCQkJdm9sLT5ub194YXR0ciA9IDE7CiAJCX0gZWxzZSBpZiAoc3RybmljbXAoZGF0YSwgInVzZXIiLCA0KSA9PSAwKSB7Ci0JCQlpZiAoIXZhbHVlIHx8ICEqdmFsdWUpIHsKKwkJCWlmICghdmFsdWUpIHsKIAkJCQlwcmludGsoS0VSTl9XQVJOSU5HCiAJCQkJICAgICAgICJDSUZTOiBpbnZhbGlkIG9yIG1pc3NpbmcgdXNlcm5hbWVcbiIpOwogCQkJCXJldHVybiAxOwkvKiBuZWVkc19hcmc7ICovCisJCQl9IGVsc2UgaWYoISp2YWx1ZSkgeworCQkJCS8qIG51bGwgdXNlciwgaWUgYW5vbnltb3VzLCBhdXRoZW50aWNhdGlvbiAqLworCQkJCXZvbC0+bnVsbGF1dGggPSAxOwogCQkJfQogCQkJaWYgKHN0cm5sZW4odmFsdWUsIDIwMCkgPCAyMDApIHsKIAkJCQl2b2wtPnVzZXJuYW1lID0gdmFsdWU7CkBAIC0xNjM3LDYgKzE2NDUsOCBAQAogCQkvKiBCQiBmaXhtZSBwYXJzZSBmb3IgZG9tYWluIG5hbWUgaGVyZSAqLwogCQljRllJKDEsICgiVXNlcm5hbWU6ICVzICIsIHZvbHVtZV9pbmZvLnVzZXJuYW1lKSk7CiAKKwl9IGVsc2UgaWYgKHZvbHVtZV9pbmZvLm51bGxhdXRoKSB7CisJCWNGWUkoMSwoIm51bGwgdXNlciIpKTsKIAl9IGVsc2UgewogCQljaWZzZXJyb3IoIk5vIHVzZXJuYW1lIHNwZWNpZmllZCIpOwogICAgICAgICAvKiBJbiB1c2Vyc3BhY2UgbW91bnQgaGVscGVyIHdlIGNhbiBnZXQgdXNlciBuYW1lIGZyb20gYWx0ZXJuYXRlCkBAIC0zMjE1LDcgKzMyMjUsOSBAQAogCQkJfQogCQkJLyogZWxzZSBkbyBub3QgYm90aGVyIGNvcHlpbmcgdGhlc2UgaW5mb3JtYXRpb25hbCBmaWVsZHMgKi8KIAkJfQotCQlpZihzbWJfYnVmZmVyX3Jlc3BvbnNlLT5Xb3JkQ291bnQgPT0gMykKKwkJaWYoKHNtYl9idWZmZXJfcmVzcG9uc2UtPldvcmRDb3VudCA9PSAzKSB8fAorCQkJIChzbWJfYnVmZmVyX3Jlc3BvbnNlLT5Xb3JkQ291bnQgPT0gNykpCisJCQkvKiBmaWVsZCBpcyBpbiBzYW1lIGxvY2F0aW9uICovCiAJCQl0Y29uLT5GbGFncyA9IGxlMTZfdG9fY3B1KHBTTUJyLT5PcHRpb25hbFN1cHBvcnQpOwogCQllbHNlCiAJCQl0Y29uLT5GbGFncyA9IDA7CkBAIC0zMzEyLDE5ICszMzI0LDIxIEBACiAJCWZpcnN0X3RpbWUgPSAxOwogCX0KIAlpZiAoIXJjKSB7CisJCXBTZXNJbmZvLT5mbGFncyA9IDA7CiAJCXBTZXNJbmZvLT5jYXBhYmlsaXRpZXMgPSBwU2VzSW5mby0+c2VydmVyLT5jYXBhYmlsaXRpZXM7CiAJCWlmKGxpbnV4RXh0RW5hYmxlZCA9PSAwKQogCQkJcFNlc0luZm8tPmNhcGFiaWxpdGllcyAmPSAofkNBUF9VTklYKTsKIAkvKglwU2VzSW5mby0+c2VxdWVuY2VfbnVtYmVyID0gMDsqLwotCQljRllJKDEsKCJTZWN1cml0eSBNb2RlOiAweCV4IENhcGFiaWxpdGllczogMHgleCBUaW1lIFpvbmU6ICVkIiwKKwkJY0ZZSSgxLCgiU2VjdXJpdHkgTW9kZTogMHgleCBDYXBhYmlsaXRpZXM6IDB4JXggVGltZUFkanVzdDogJWQiLAogCQkJcFNlc0luZm8tPnNlcnZlci0+c2VjTW9kZSwKIAkJCXBTZXNJbmZvLT5zZXJ2ZXItPmNhcGFiaWxpdGllcywKLQkJCXBTZXNJbmZvLT5zZXJ2ZXItPnRpbWVab25lKSk7CisJCQlwU2VzSW5mby0+c2VydmVyLT50aW1lQWRqKSk7CiAJCWlmKGV4cGVyaW1FbmFibGVkIDwgMikKIAkJCXJjID0gQ0lGU19TZXNzU2V0dXAoeGlkLCBwU2VzSW5mbywKIAkJCQkJICAgIGZpcnN0X3RpbWUsIG5sc19pbmZvKTsKIAkJZWxzZSBpZiAoZXh0ZW5kZWRfc2VjdXJpdHkKLQkJCQkmJiAocFNlc0luZm8tPmNhcGFiaWxpdGllcyAmIENBUF9FWFRFTkRFRF9TRUNVUklUWSkKKwkJCQkmJiAocFNlc0luZm8tPmNhcGFiaWxpdGllcyAKKwkJCQkJJiBDQVBfRVhURU5ERURfU0VDVVJJVFkpCiAJCQkJJiYgKHBTZXNJbmZvLT5zZXJ2ZXItPnNlY1R5cGUgPT0gTlRMTVNTUCkpIHsKIAkJCXJjID0gLUVPUE5PVFNVUFA7CiAJCX0gZWxzZSBpZiAoZXh0ZW5kZWRfc2VjdXJpdHkKQEAgLTMzMzgsNyArMzM1Miw3IEBACiAJCQlpZiAoIXJjKSB7CiAJCQkJaWYobnRsbXYyX2ZsYWcpIHsKIAkJCQkJY2hhciAqIHYyX3Jlc3BvbnNlOwotCQkJCQljRllJKDEsKCJDYW4gdXNlIG1vcmUgc2VjdXJlIE5UTE0gdmVyc2lvbiAyIHBhc3N3b3JkIGhhc2giKSk7CisJCQkJCWNGWUkoMSwoIm1vcmUgc2VjdXJlIE5UTE0gdmVyMiBoYXNoIikpOwogCQkJCQlpZihDYWxjTlRMTXYyX3BhcnRpYWxfbWFjX2tleShwU2VzSW5mbywgCiAJCQkJCQlubHNfaW5mbykpIHsKIAkJCQkJCXJjID0gLUVOT01FTTsKZGlmZiAtLWdpdCBhL2ZzL2NpZnMvZmlsZS5jIGIvZnMvY2lmcy9maWxlLmMKaW5kZXggOTc2YTY5MS4uMjQzNmVkOCAxMDA2NDQKLS0tIGEvZnMvY2lmcy9maWxlLmMKKysrIGIvZnMvY2lmcy9maWxlLmMKQEAgLTQ5MiwxMCArNDkyLDE0IEBACiAJCQkJCXRoZSBzdHJ1Y3Qgd291bGQgYmUgaW4gZWFjaCBvcGVuIGZpbGUsCiAJCQkJCWJ1dCB0aGlzIHNob3VsZCBnaXZlIGVub3VnaCB0aW1lIHRvIAogCQkJCQljbGVhciB0aGUgc29ja2V0ICovCi0JCQkJCWNFUlJPUigxLCgiY2xvc2Ugd2l0aCBwZW5kaW5nIHdyaXRlcyIpKTsKKyNpZmRlZiBDT05GSUdfQ0lGU19ERUJVRzIKKwkJCQkJY0ZZSSgxLCgiY2xvc2UgZGVsYXksIHdyaXRlIHBlbmRpbmciKSk7CisjZW5kaWYgLyogREVCVUcyICovCiAJCQkJCW1zbGVlcCh0aW1lb3V0KTsKIAkJCQkJdGltZW91dCAqPSA0OwotCQkJCX0gCisJCQkJfQorCQkJCWlmKGF0b21pY19yZWFkKCZwU01CRmlsZS0+d3J0UGVuZGluZykpCisJCQkJCWNFUlJPUigxLCgiY2xvc2Ugd2l0aCBwZW5kaW5nIHdyaXRlcyIpKTsKIAkJCQlyYyA9IENJRlNTTUJDbG9zZSh4aWQsIHBUY29uLAogCQkJCQkJICBwU01CRmlsZS0+bmV0ZmlkKTsKIAkJCX0KQEAgLTE4MDYsMTMgKzE4MTAsNiBAQAogCQl9CiAJCWlmICgocmMgPCAwKSB8fCAoc21iX3JlYWRfZGF0YSA9PSBOVUxMKSkgewogCQkJY0ZZSSgxLCAoIlJlYWQgZXJyb3IgaW4gcmVhZHBhZ2VzOiAlZCIsIHJjKSk7Ci0JCQkvKiBjbGVhbiB1cCByZW1haW5nIHBhZ2VzIG9mZiBsaXN0ICovCi0JCQl3aGlsZSAoIWxpc3RfZW1wdHkocGFnZV9saXN0KSAmJiAoaSA8IG51bV9wYWdlcykpIHsKLQkJCQlwYWdlID0gbGlzdF9lbnRyeShwYWdlX2xpc3QtPnByZXYsIHN0cnVjdCBwYWdlLAotCQkJCQkJICBscnUpOwotCQkJCWxpc3RfZGVsKCZwYWdlLT5scnUpOwotCQkJCXBhZ2VfY2FjaGVfcmVsZWFzZShwYWdlKTsKLQkJCX0KIAkJCWJyZWFrOwogCQl9IGVsc2UgaWYgKGJ5dGVzX3JlYWQgPiAwKSB7CiAJCQlwU01CciA9IChzdHJ1Y3Qgc21iX2NvbV9yZWFkX3JzcCAqKXNtYl9yZWFkX2RhdGE7CkBAIC0xODMxLDEzICsxODI4LDcgQEAKIAkJCQkgICB0aGlzIGNhc2UgaXMgb2sgLSBpZiB3ZSBhcmUgYXQgc2VydmVyIEVPRiAKIAkJCQkgICB3ZSB3aWxsIGhpdCBpdCBvbiBuZXh0IHJlYWQgKi8KIAotCQkJLyogd2hpbGUgKCFsaXN0X2VtcHR5KHBhZ2VfbGlzdCkgJiYgKGkgPCBudW1fcGFnZXMpKSB7Ci0JCQkJCXBhZ2UgPSBsaXN0X2VudHJ5KHBhZ2VfbGlzdC0+cHJldiwgCi0JCQkJCQkJICBzdHJ1Y3QgcGFnZSwgbGlzdCk7Ci0JCQkJCWxpc3RfZGVsKCZwYWdlLT5saXN0KTsKLQkJCQkJcGFnZV9jYWNoZV9yZWxlYXNlKHBhZ2UpOwotCQkJCX0KLQkJCQlicmVhazsgKi8KKwkJCQkvKiBicmVhazsgKi8KIAkJCX0KIAkJfSBlbHNlIHsKIAkJCWNGWUkoMSwgKCJObyBieXRlcyByZWFkICglZCkgYXQgb2Zmc2V0ICVsbGQgLiAiCkBAIC0xODQ1LDE0ICsxODM2LDYgQEAKIAkJCQkgYnl0ZXNfcmVhZCwgb2Zmc2V0KSk7CiAJCQkvKiBCQiB0dXJuIG9mZiBjYWNoaW5nIGFuZCBkbyBuZXcgbG9va3VwIG9uIAogCQkJICAgZmlsZSBzaXplIGF0IHNlcnZlcj8gKi8KLQkJCXdoaWxlICghbGlzdF9lbXB0eShwYWdlX2xpc3QpICYmIChpIDwgbnVtX3BhZ2VzKSkgewotCQkJCXBhZ2UgPSBsaXN0X2VudHJ5KHBhZ2VfbGlzdC0+cHJldiwgc3RydWN0IHBhZ2UsCi0JCQkJCQkgIGxydSk7Ci0JCQkJbGlzdF9kZWwoJnBhZ2UtPmxydSk7Ci0KLQkJCQkvKiBCQiByZW1vdmVtZSAtIHJlcGxhY2Ugd2l0aCB6ZXJvIG9mIHBhZ2U/ICovCi0JCQkJcGFnZV9jYWNoZV9yZWxlYXNlKHBhZ2UpOwotCQkJfQogCQkJYnJlYWs7CiAJCX0KIAkJaWYgKHNtYl9yZWFkX2RhdGEpIHsKZGlmZiAtLWdpdCBhL2ZzL2NpZnMvaW5vZGUuYyBiL2ZzL2NpZnMvaW5vZGUuYwppbmRleCA2YjkwZWY5Li4xYWQ4YzlmIDEwMDY0NAotLS0gYS9mcy9jaWZzL2lub2RlLmMKKysrIGIvZnMvY2lmcy9pbm9kZS5jCkBAIC0zMzcsNiArMzM3LDcgQEAKIAkJcGZpbmREYXRhID0gKEZJTEVfQUxMX0lORk8gKilidWY7CiAJCS8qIGNvdWxkIGRvIGZpbmQgZmlyc3QgaW5zdGVhZCBidXQgdGhpcyByZXR1cm5zIG1vcmUgaW5mbyAqLwogCQlyYyA9IENJRlNTTUJRUGF0aEluZm8oeGlkLCBwVGNvbiwgc2VhcmNoX3BhdGgsIHBmaW5kRGF0YSwKKwkJCSAgICAgIDAgLyogbm90IGxlZ2FjeSAqLywKIAkJCSAgICAgIGNpZnNfc2ItPmxvY2FsX25scywgY2lmc19zYi0+bW50X2NpZnNfZmxhZ3MgJgogCQkJCUNJRlNfTU9VTlRfTUFQX1NQRUNJQUxfQ0hSKTsKIAkJLyogQkIgb3B0aW1pemUgY29kZSBzbyB3ZSBkbyBub3QgbWFrZSB0aGUgYWJvdmUgY2FsbApAQCAtMzg0LDggKzM4NSwxMCBAQAogCQkvKiBnZXQgbmV3IGlub2RlICovCiAJCWlmICgqcGlub2RlID09IE5VTEwpIHsKIAkJCSpwaW5vZGUgPSBuZXdfaW5vZGUoc2IpOwotCQkJaWYgKCpwaW5vZGUgPT0gTlVMTCkKKwkJCWlmICgqcGlub2RlID09IE5VTEwpIHsKKwkJCQlrZnJlZShidWYpOwogCQkJCXJldHVybiAtRU5PTUVNOworCQkJfQogCQkJLyogSXMgYW4gaV9pbm8gb2YgemVybyBsZWdhbD8gQ2FuIHdlIHVzZSB0aGF0IHRvIGNoZWNrCiAJCQkgICBpZiB0aGUgc2VydmVyIHN1cHBvcnRzIHJldHVybmluZyBpbm9kZSBudW1iZXJzPyAgQXJlCiAJCQkgICB0aGVyZSBvdGhlciBzYW5pdHkgY2hlY2tzIHdlIGNhbiB1c2UgdG8gZW5zdXJlIHRoYXQKQEAgLTQzMSw4ICs0MzQsMTEgQEAKIAkJKHBUY29uLT5zZXMtPnNlcnZlci0+bWF4QnVmIC0gTUFYX0NJRlNfSERSX1NJWkUpICYgMHhGRkZGRkUwMDsqLwogCiAJCS8qIExpbnV4IGNhbiBub3Qgc3RvcmUgZmlsZSBjcmVhdGlvbiB0aW1lIHNvIGlnbm9yZSBpdCAqLwotCQlpbm9kZS0+aV9hdGltZSA9Ci0JCSAgICBjaWZzX05UdGltZVRvVW5peChsZTY0X3RvX2NwdShwZmluZERhdGEtPkxhc3RBY2Nlc3NUaW1lKSk7CisJCWlmKHBmaW5kRGF0YS0+TGFzdEFjY2Vzc1RpbWUpCisJCQlpbm9kZS0+aV9hdGltZSA9IGNpZnNfTlR0aW1lVG9Vbml4CisJCQkJKGxlNjRfdG9fY3B1KHBmaW5kRGF0YS0+TGFzdEFjY2Vzc1RpbWUpKTsKKwkJZWxzZSAvKiBkbyBub3QgbmVlZCB0byB1c2UgY3VycmVudF9mc190aW1lIC0gdGltZSBub3Qgc3RvcmVkICovCisJCQlpbm9kZS0+aV9hdGltZSA9IENVUlJFTlRfVElNRTsKIAkJaW5vZGUtPmlfbXRpbWUgPQogCQkgICAgY2lmc19OVHRpbWVUb1VuaXgobGU2NF90b19jcHUocGZpbmREYXRhLT5MYXN0V3JpdGVUaW1lKSk7CiAJCWlub2RlLT5pX2N0aW1lID0KQEAgLTg3OSwxMCArODg1LDE0IEBACiAJCQlrbWFsbG9jKDIgKiBzaXplb2YoRklMRV9VTklYX0JBU0lDX0lORk8pLCBHRlBfS0VSTkVMKTsKIAkJaWYgKGluZm9fYnVmX3NvdXJjZSAhPSBOVUxMKSB7CiAJCQlpbmZvX2J1Zl90YXJnZXQgPSBpbmZvX2J1Zl9zb3VyY2UgKyAxOwotCQkJcmMgPSBDSUZTU01CVW5peFFQYXRoSW5mbyh4aWQsIHBUY29uLCBmcm9tTmFtZSwKLQkJCQlpbmZvX2J1Zl9zb3VyY2UsIGNpZnNfc2Jfc291cmNlLT5sb2NhbF9ubHMsIAotCQkJCWNpZnNfc2Jfc291cmNlLT5tbnRfY2lmc19mbGFncyAmCi0JCQkJCUNJRlNfTU9VTlRfTUFQX1NQRUNJQUxfQ0hSKTsKKwkJCWlmIChwVGNvbi0+c2VzLT5jYXBhYmlsaXRpZXMgJiBDQVBfVU5JWCkKKwkJCQlyYyA9IENJRlNTTUJVbml4UVBhdGhJbmZvKHhpZCwgcFRjb24sIGZyb21OYW1lLAorCQkJCQlpbmZvX2J1Zl9zb3VyY2UsIAorCQkJCQljaWZzX3NiX3NvdXJjZS0+bG9jYWxfbmxzLAorCQkJCQljaWZzX3NiX3NvdXJjZS0+bW50X2NpZnNfZmxhZ3MgJgorCQkJCQkJQ0lGU19NT1VOVF9NQVBfU1BFQ0lBTF9DSFIpOworCQkJLyogZWxzZSByYyBpcyBzdGlsbCBFRVhJU1Qgc28gd2lsbCBmYWxsIHRocm91Z2ggdG8KKwkJCSAgIHVubGluayB0aGUgdGFyZ2V0IGFuZCByZXRyeSByZW5hbWUgKi8KIAkJCWlmIChyYyA9PSAwKSB7CiAJCQkJcmMgPSBDSUZTU01CVW5peFFQYXRoSW5mbyh4aWQsIHBUY29uLCB0b05hbWUsCiAJCQkJCQlpbmZvX2J1Zl90YXJnZXQsCkBAIC05MzEsNyArOTQxLDcgQEAKIAkJCQkgY2lmc19zYl9zb3VyY2UtPm1udF9jaWZzX2ZsYWdzICYgCiAJCQkJCUNJRlNfTU9VTlRfTUFQX1NQRUNJQUxfQ0hSKTsKIAkJaWYgKHJjPT0wKSB7Ci0JCQlDSUZTU01CUmVuYW1lT3BlbkZpbGUoeGlkLCBwVGNvbiwgbmV0ZmlkLCB0b05hbWUsCisJCQlyYyA9IENJRlNTTUJSZW5hbWVPcGVuRmlsZSh4aWQsIHBUY29uLCBuZXRmaWQsIHRvTmFtZSwKIAkJCQkJICAgICAgY2lmc19zYl9zb3VyY2UtPmxvY2FsX25scywgCiAJCQkJCSAgICAgIGNpZnNfc2Jfc291cmNlLT5tbnRfY2lmc19mbGFncyAmCiAJCQkJCQlDSUZTX01PVU5UX01BUF9TUEVDSUFMX0NIUik7CkBAIC0xMDc5LDggKzEwODksMTAgQEAKIAlzdHJ1Y3Qga3N0YXQgKnN0YXQpCiB7CiAJaW50IGVyciA9IGNpZnNfcmV2YWxpZGF0ZShkZW50cnkpOwotCWlmICghZXJyKQorCWlmICghZXJyKSB7CiAJCWdlbmVyaWNfZmlsbGF0dHIoZGVudHJ5LT5kX2lub2RlLCBzdGF0KTsKKwkJc3RhdC0+Ymxrc2l6ZSA9IENJRlNfTUFYX01TR1NJWkU7CisJfQogCXJldHVybiBlcnI7CiB9CiAKZGlmZiAtLWdpdCBhL2ZzL2NpZnMvbGluay5jIGIvZnMvY2lmcy9saW5rLmMKaW5kZXggYTU3ZjVkNi4uMGJlZThiNyAxMDA2NDQKLS0tIGEvZnMvY2lmcy9saW5rLmMKKysrIGIvZnMvY2lmcy9saW5rLmMKQEAgLTI1NCw3ICsyNTQsMTEgQEAKIAkJCQl0bXBidWZmZXIsCiAJCQkJbGVuIC0gMSwKIAkJCQljaWZzX3NiLT5sb2NhbF9ubHMpOwotCWVsc2UgeworCWVsc2UgaWYgKGNpZnNfc2ItPm1udF9jaWZzX2ZsYWdzICYgQ0lGU19NT1VOVF9VTlhfRU1VTCkgeworCQljRVJST1IoMSwoIlNGVSBzdHlsZSBzeW1saW5rcyBub3QgaW1wbGVtZW50ZWQgeWV0IikpOworCQkvKiBhZGQgb3BlbiBhbmQgcmVhZCBhcyBpbiBmcy9jaWZzL2lub2RlLmMgKi8KKwkKKwl9IGVsc2UgewogCQlyYyA9IENJRlNTTUJPcGVuKHhpZCwgcFRjb24sIGZ1bGxfcGF0aCwgRklMRV9PUEVOLCBHRU5FUklDX1JFQUQsCiAJCQkJT1BFTl9SRVBBUlNFX1BPSU5ULCZmaWQsICZvcGxvY2ssIE5VTEwsIAogCQkJCWNpZnNfc2ItPmxvY2FsX25scywgCmRpZmYgLS1naXQgYS9mcy9jaWZzL21kNS5jIGIvZnMvY2lmcy9tZDUuYwppbmRleCA3YWEyMzQ5Li5jY2ViZjliIDEwMDY0NAotLS0gYS9mcy9jaWZzL21kNS5jCisrKyBiL2ZzL2NpZnMvbWQ1LmMKQEAgLTI1MiwxMCArMjUyLDExIEBACiAJYnVmWzNdICs9IGQ7CiB9CiAKKyNpZiAwICAgLyogY3VycmVudGx5IHVudXNlZCAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgdGhlIHJmYyAyMTA0IHZlcnNpb24gb2YgaG1hY19tZDUgaW5pdGlhbGlzYXRpb24uCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQKK3N0YXRpYyB2b2lkCiBobWFjX21kNV9pbml0X3JmYzIxMDQodW5zaWduZWQgY2hhciAqa2V5LCBpbnQga2V5X2xlbiwKIAkJICAgICAgc3RydWN0IEhNQUNNRDVDb250ZXh0ICpjdHgpCiB7CkBAIC0yODksNiArMjkwLDcgQEAKIAlNRDVJbml0KCZjdHgtPmN0eCk7CiAJTUQ1VXBkYXRlKCZjdHgtPmN0eCwgY3R4LT5rX2lwYWQsIDY0KTsKIH0KKyNlbmRpZgogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICB0aGUgbWljcm9zb2Z0IHZlcnNpb24gb2YgaG1hY19tZDUgaW5pdGlhbGlzYXRpb24uCkBAIC0zNTAsNyArMzUyLDggQEAKICBzaW5nbGUgZnVuY3Rpb24gdG8gY2FsY3VsYXRlIGFuIEhNQUMgTUQ1IGRpZ2VzdCBmcm9tIGRhdGEuCiAgdXNlIHRoZSBtaWNyb3NvZnQgaG1hY21kNSBpbml0IG1ldGhvZCBiZWNhdXNlIHRoZSBrZXkgaXMgMTYgYnl0ZXMuCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkCisjaWYgMCAvKiBjdXJyZW50bHkgdW51c2VkICovCitzdGF0aWMgdm9pZAogaG1hY19tZDUodW5zaWduZWQgY2hhciBrZXlbMTZdLCB1bnNpZ25lZCBjaGFyICpkYXRhLCBpbnQgZGF0YV9sZW4sCiAJIHVuc2lnbmVkIGNoYXIgKmRpZ2VzdCkKIHsKQEAgLTM2MSwzICszNjQsNCBAQAogCX0KIAlobWFjX21kNV9maW5hbChkaWdlc3QsICZjdHgpOwogfQorI2VuZGlmCmRpZmYgLS1naXQgYS9mcy9jaWZzL21kNS5oIGIvZnMvY2lmcy9tZDUuaAppbmRleCAwMGUxYzUzLi5mN2Q0ZjQxIDEwMDY0NAotLS0gYS9mcy9jaWZzL21kNS5oCisrKyBiL2ZzL2NpZnMvbWQ1LmgKQEAgLTI3LDEyICsyNywxMiBAQAogCiAvKiBUaGUgZm9sbG93aW5nIGRlZmluaXRpb25zIGNvbWUgZnJvbSBsaWIvaG1hY21kNS5jICAqLwogCi12b2lkIGhtYWNfbWQ1X2luaXRfcmZjMjEwNCh1bnNpZ25lZCBjaGFyICprZXksIGludCBrZXlfbGVuLAotCQkJc3RydWN0IEhNQUNNRDVDb250ZXh0ICpjdHgpOworLyogdm9pZCBobWFjX21kNV9pbml0X3JmYzIxMDQodW5zaWduZWQgY2hhciAqa2V5LCBpbnQga2V5X2xlbiwKKwkJCXN0cnVjdCBITUFDTUQ1Q29udGV4dCAqY3R4KTsqLwogdm9pZCBobWFjX21kNV9pbml0X2xpbUtfdG9fNjQoY29uc3QgdW5zaWduZWQgY2hhciAqa2V5LCBpbnQga2V5X2xlbiwKIAkJCXN0cnVjdCBITUFDTUQ1Q29udGV4dCAqY3R4KTsKIHZvaWQgaG1hY19tZDVfdXBkYXRlKGNvbnN0IHVuc2lnbmVkIGNoYXIgKnRleHQsIGludCB0ZXh0X2xlbiwKIAkJCXN0cnVjdCBITUFDTUQ1Q29udGV4dCAqY3R4KTsKIHZvaWQgaG1hY19tZDVfZmluYWwodW5zaWduZWQgY2hhciAqZGlnZXN0LCBzdHJ1Y3QgSE1BQ01ENUNvbnRleHQgKmN0eCk7Ci12b2lkIGhtYWNfbWQ1KHVuc2lnbmVkIGNoYXIga2V5WzE2XSwgdW5zaWduZWQgY2hhciAqZGF0YSwgaW50IGRhdGFfbGVuLAotCQkJdW5zaWduZWQgY2hhciAqZGlnZXN0KTsKKy8qIHZvaWQgaG1hY19tZDUodW5zaWduZWQgY2hhciBrZXlbMTZdLCB1bnNpZ25lZCBjaGFyICpkYXRhLCBpbnQgZGF0YV9sZW4sCisJCQl1bnNpZ25lZCBjaGFyICpkaWdlc3QpOyovCmRpZmYgLS1naXQgYS9mcy9jaWZzL21pc2MuYyBiL2ZzL2NpZnMvbWlzYy5jCmluZGV4IDIyYzkzN2UuLmJiYzljZDMgMTAwNjQ0Ci0tLSBhL2ZzL2NpZnMvbWlzYy5jCisrKyBiL2ZzL2NpZnMvbWlzYy5jCkBAIC0zODksNyArMzg5LDcgQEAKIAlyZXR1cm47CiB9CiAKLWludAorc3RhdGljIGludAogY2hlY2tTTUJoZHIoc3RydWN0IHNtYl9oZHIgKnNtYiwgX191MTYgbWlkKQogewogCS8qIE1ha2Ugc3VyZSB0aGF0IHRoaXMgcmVhbGx5IGlzIGFuIFNNQiwgdGhhdCBpdCBpcyBhIHJlc3BvbnNlLCAKQEAgLTQxOCwyNiArNDE4LDQyIEBACiB9CiAKIGludAotY2hlY2tTTUIoc3RydWN0IHNtYl9oZHIgKnNtYiwgX191MTYgbWlkLCBpbnQgbGVuZ3RoKQorY2hlY2tTTUIoc3RydWN0IHNtYl9oZHIgKnNtYiwgX191MTYgbWlkLCB1bnNpZ25lZCBpbnQgbGVuZ3RoKQogewogCV9fdTMyIGxlbiA9IHNtYi0+c21iX2J1Zl9sZW5ndGg7CiAJX191MzIgY2xjX2xlbjsgIC8qIGNhbGN1bGF0ZWQgbGVuZ3RoICovCiAJY0ZZSSgwLCAoImNoZWNrU01CIExlbmd0aDogMHgleCwgc21iX2J1Zl9sZW5ndGg6IDB4JXgiLCBsZW5ndGgsIGxlbikpOwotCWlmICgoKHVuc2lnbmVkIGludClsZW5ndGggPCAyICsgc2l6ZW9mIChzdHJ1Y3Qgc21iX2hkcikpIHx8Ci0JICAgIChsZW4gPiBDSUZTTWF4QnVmU2l6ZSArIE1BWF9DSUZTX0hEUl9TSVpFIC0gNCkpIHsKLQkJaWYgKCh1bnNpZ25lZCBpbnQpbGVuZ3RoIDwgMiArIHNpemVvZiAoc3RydWN0IHNtYl9oZHIpKSB7Ci0JCQlpZiAoKCh1bnNpZ25lZCBpbnQpbGVuZ3RoID49IAotCQkJCXNpemVvZiAoc3RydWN0IHNtYl9oZHIpIC0gMSkKKworCWlmIChsZW5ndGggPCAyICsgc2l6ZW9mIChzdHJ1Y3Qgc21iX2hkcikpIHsKKwkJaWYgKChsZW5ndGggPj0gc2l6ZW9mIChzdHJ1Y3Qgc21iX2hkcikgLSAxKQogCQkJICAgICYmIChzbWItPlN0YXR1cy5DaWZzRXJyb3IgIT0gMCkpIHsKLQkJCQlzbWItPldvcmRDb3VudCA9IDA7Ci0JCQkJLyogc29tZSBlcnJvciBjYXNlcyBkbyBub3QgcmV0dXJuIHdjdCBhbmQgYmNjICovCisJCQlzbWItPldvcmRDb3VudCA9IDA7CisJCQkvKiBzb21lIGVycm9yIGNhc2VzIGRvIG5vdCByZXR1cm4gd2N0IGFuZCBiY2MgKi8KKwkJCXJldHVybiAwOworCQl9IGVsc2UgaWYgKChsZW5ndGggPT0gc2l6ZW9mKHN0cnVjdCBzbWJfaGRyKSArIDEpICYmIAorCQkJCShzbWItPldvcmRDb3VudCA9PSAwKSkgeworCQkJY2hhciAqIHRtcCA9IChjaGFyICopc21iOworCQkJLyogTmVlZCB0byB3b3JrIGFyb3VuZCBhIGJ1ZyBpbiB0d28gc2VydmVycyBoZXJlICovCisJCQkvKiBGaXJzdCwgY2hlY2sgaWYgdGhlIHBhcnQgb2YgYmNjIHRoZXkgc2VudCB3YXMgemVybyAqLworCQkJaWYgKHRtcFtzaXplb2Yoc3RydWN0IHNtYl9oZHIpXSA9PSAwKSB7CisJCQkJLyogc29tZSBzZXJ2ZXJzIHJldHVybiBvbmx5IGhhbGYgb2YgYmNjCisJCQkJICogb24gc2ltcGxlIHJlc3BvbnNlcyAod2N0LCBiY2MgYm90aCB6ZXJvKQorCQkJCSAqIGluIHBhcnRpY3VsYXIgaGF2ZSBzZWVuIHRoaXMgb24KKwkJCQkgKiB1bG9nb2ZmWCBhbmQgRmluZENsb3NlLiBUaGlzIGxlYXZlcworCQkJCSAqIG9uZSBieXRlIG9mIGJjYyBwb3RlbnRpYWxseSB1bml0aWFsaXplZAorCQkJCSAqLworCQkJCS8qIHplcm8gcmVzdCBvZiBiY2MgKi8KKwkJCQl0bXBbc2l6ZW9mKHN0cnVjdCBzbWJfaGRyKSsxXSA9IDA7CiAJCQkJcmV0dXJuIDA7Ci0JCQl9IGVsc2UgewotCQkJCWNFUlJPUigxLCAoIkxlbmd0aCBsZXNzIHRoYW4gc21iIGhlYWRlciBzaXplIikpOwogCQkJfQorCQkJY0VSUk9SKDEsKCJyY3ZkIGludmFsaWQgYnl0ZSBjb3VudCAoYmNjKSIpKTsKKwkJfSBlbHNlIHsKKwkJCWNFUlJPUigxLCAoIkxlbmd0aCBsZXNzIHRoYW4gc21iIGhlYWRlciBzaXplIikpOwogCQl9Ci0JCWlmIChsZW4gPiBDSUZTTWF4QnVmU2l6ZSArIE1BWF9DSUZTX0hEUl9TSVpFIC0gNCkKLQkJCWNFUlJPUigxLCAoInNtYiBsZW5ndGggZ3JlYXRlciB0aGFuIE1heEJ1ZlNpemUsIG1pZD0lZCIsCisJCXJldHVybiAxOworCX0KKwlpZiAobGVuID4gQ0lGU01heEJ1ZlNpemUgKyBNQVhfQ0lGU19IRFJfU0laRSAtIDQpIHsKKwkJY0VSUk9SKDEsICgic21iIGxlbmd0aCBncmVhdGVyIHRoYW4gTWF4QnVmU2l6ZSwgbWlkPSVkIiwKIAkJCQkgICBzbWItPk1pZCkpOwogCQlyZXR1cm4gMTsKIAl9CkBAIC00NDYsNyArNDYyLDcgQEAKIAkJcmV0dXJuIDE7CiAJY2xjX2xlbiA9IHNtYkNhbGNTaXplX0xFKHNtYik7CiAKLQlpZig0ICsgbGVuICE9ICh1bnNpZ25lZCBpbnQpbGVuZ3RoKSB7CisJaWYoNCArIGxlbiAhPSBsZW5ndGgpIHsKIAkJY0VSUk9SKDEsICgiTGVuZ3RoIHJlYWQgZG9lcyBub3QgbWF0Y2ggUkZDMTAwMSBsZW5ndGggJWQiLGxlbikpOwogCQlyZXR1cm4gMTsKIAl9CmRpZmYgLS1naXQgYS9mcy9jaWZzL25ldG1pc2MuYyBiL2ZzL2NpZnMvbmV0bWlzYy5jCmluZGV4IGNlODc1NTAuLjk5MmU4MGUgMTAwNjQ0Ci0tLSBhL2ZzL2NpZnMvbmV0bWlzYy5jCisrKyBiL2ZzL2NpZnMvbmV0bWlzYy5jCkBAIC05MDksMyArOTA5LDYxIEBACiAJLyogQ29udmVydCB0byAxMDBucyBpbnRlcnZhbHMgYW5kIHRoZW4gYWRkIHRoZSBOVEZTIHRpbWUgb2Zmc2V0LiAqLwogCXJldHVybiAodTY0KSB0LnR2X3NlYyAqIDEwMDAwMDAwICsgdC50dl9uc2VjLzEwMCArIE5URlNfVElNRV9PRkZTRVQ7CiB9CisKK3N0YXRpYyBpbnQgdG90YWxfZGF5c19vZl9wcmV2X21vbnRoc1tdID0KK3swLCAzMSwgNTksIDkwLCAxMjAsIDE1MSwgMTgxLCAyMTIsIDI0MywgMjczLCAzMDQsIDMzNH07CisKKworX19sZTY0IGNudnJ0RG9zQ2lmc1RtKF9fdTE2IGRhdGUsIF9fdTE2IHRpbWUpCit7CisJcmV0dXJuIGNwdV90b19sZTY0KGNpZnNfVW5peFRpbWVUb05UKGNudnJ0RG9zVW5peFRtKGRhdGUsIHRpbWUpKSk7Cit9CisKK3N0cnVjdCB0aW1lc3BlYyBjbnZydERvc1VuaXhUbShfX3UxNiBkYXRlLCBfX3UxNiB0aW1lKQoreworCXN0cnVjdCB0aW1lc3BlYyB0czsKKwlpbnQgc2VjLCBtaW4sIGRheXMsIG1vbnRoLCB5ZWFyOworCVNNQl9USU1FICogc3QgPSAoU01CX1RJTUUgKikmdGltZTsKKwlTTUJfREFURSAqIHNkID0gKFNNQl9EQVRFICopJmRhdGU7CisKKwljRllJKDEsKCJkYXRlICVkIHRpbWUgJWQiLGRhdGUsIHRpbWUpKTsKKworCXNlYyA9IDIgKiBzdC0+VHdvU2Vjb25kczsKKwltaW4gPSBzdC0+TWludXRlczsKKwlpZigoc2VjID4gNTkpIHx8IChtaW4gPiA1OSkpCisJCWNFUlJPUigxLCgiaWxsZWdhbCB0aW1lIG1pbiAlZCBzZWMgJWQiLCBtaW4sIHNlYykpOworCXNlYyArPSAobWluICogNjApOworCXNlYyArPSA2MCAqIDYwICogc3QtPkhvdXJzOworCWlmKHN0LT5Ib3VycyA+IDI0KQorCQljRVJST1IoMSwoImlsbGVnYWwgaG91cnMgJWQiLHN0LT5Ib3VycykpOworCWRheXMgPSBzZC0+RGF5OworCW1vbnRoID0gc2QtPk1vbnRoOworCWlmKChkYXlzID4gMzEpIHx8IChtb250aCA+IDEyKSkKKwkJY0VSUk9SKDEsKCJpbGxlZ2FsIGRhdGUsIG1vbnRoICVkIGRheTogJWQiLCBtb250aCwgZGF5cykpOworCW1vbnRoIC09IDE7CisJZGF5cyArPSB0b3RhbF9kYXlzX29mX3ByZXZfbW9udGhzW21vbnRoXTsKKwlkYXlzICs9IDM2NTI7IC8qIGFjY291bnQgZm9yIGRpZmZlcmVuY2UgaW4gZGF5cyBiZXR3ZWVuIDE5ODAgYW5kIDE5NzAgKi8KKwl5ZWFyID0gc2QtPlllYXI7CisJZGF5cyArPSB5ZWFyICogMzY1OworCWRheXMgKz0gKHllYXIvNCk7IC8qIGxlYXAgeWVhciAqLworCS8qIGdlbmVyYWxpemVkIGxlYXAgeWVhciBjYWxjdWxhdGlvbiBpcyBtb3JlIGNvbXBsZXgsIGllIG5vIGxlYXAgeWVhcgorCWZvciB5ZWFycy8xMDAgZXhjZXB0IGZvciB5ZWFycy80MDAsIGJ1dCBzaW5jZSB0aGUgbWF4aW11bSBudW1iZXIgZm9yIERPUworCSB5ZWFyIGlzIDIqKjcsIHRoZSBsYXN0IHllYXIgaXMgMTk4MCsxMjcsIHdoaWNoIG1lYW5zIHdlIG5lZWQgb25seQorCSBjb25zaWRlciAyIHNwZWNpYWwgY2FzZSB5ZWFycywgaWUgdGhlIHllYXJzIDIwMDAgYW5kIDIxMDAsIGFuZCBvbmx5CisJIGFkanVzdCBmb3IgdGhlIGxhY2sgb2YgbGVhcCB5ZWFyIGZvciB0aGUgeWVhciAyMTAwLCBhcyAyMDAwIHdhcyBhIAorCSBsZWFwIHllYXIgKGRpdmlzYWJsZSBieSA0MDApICovCisJaWYoeWVhciA+PSAxMjApICAvKiB0aGUgeWVhciAyMTAwICovCisJCWRheXMgPSBkYXlzIC0gMTsgIC8qIGRvIG5vdCBjb3VudCBsZWFwIHllYXIgZm9yIHRoZSB5ZWFyIDIxMDAgKi8KKworCS8qIGFkanVzdCBmb3IgbGVhcCB5ZWFyIHdoZXJlIHdlIGFyZSBzdGlsbCBiZWZvcmUgbGVhcCBkYXkgKi8KKwlpZih5ZWFyICE9IDEyMCkKKwkJZGF5cyAtPSAoKHllYXIgJiAweDAzKSA9PSAwKSAmJiAobW9udGggPCAyID8gMSA6IDApOworCXNlYyArPSAyNCAqIDYwICogNjAgKiBkYXlzOyAKKworCXRzLnR2X3NlYyA9IHNlYzsKKworCS8qIGNGWUkoMSwoInNlYyBhZnRlciBjbnZydCBkb3MgdG8gdW5peCB0aW1lICVkIixzZWMpKTsgKi8KKworCXRzLnR2X25zZWMgPSAwOworCXJldHVybiB0czsKK30gCmRpZmYgLS1naXQgYS9mcy9jaWZzL3JlYWRkaXIuYyBiL2ZzL2NpZnMvcmVhZGRpci5jCmluZGV4IGIyN2IzNDUuLmVkMThjMzkgMTAwNjQ0Ci0tLSBhL2ZzL2NpZnMvcmVhZGRpci5jCisrKyBiL2ZzL2NpZnMvcmVhZGRpci5jCkBAIC0xMDYsNiArMTA2LDE3IEBACiAJcmV0dXJuIHJjOwogfQogCitzdGF0aWMgdm9pZCBBZGp1c3RGb3JUWihzdHJ1Y3QgY2lmc1Rjb25JbmZvICogdGNvbiwgc3RydWN0IGlub2RlICogaW5vZGUpCit7CisJaWYoKHRjb24pICYmICh0Y29uLT5zZXMpICYmICh0Y29uLT5zZXMtPnNlcnZlcikpIHsKKwkJaW5vZGUtPmlfY3RpbWUudHZfc2VjICs9IHRjb24tPnNlcy0+c2VydmVyLT50aW1lQWRqOworCQlpbm9kZS0+aV9tdGltZS50dl9zZWMgKz0gdGNvbi0+c2VzLT5zZXJ2ZXItPnRpbWVBZGo7CisJCWlub2RlLT5pX2F0aW1lLnR2X3NlYyArPSB0Y29uLT5zZXMtPnNlcnZlci0+dGltZUFkajsKKwl9CisJcmV0dXJuOworfQorCisKIHN0YXRpYyB2b2lkIGZpbGxfaW5faW5vZGUoc3RydWN0IGlub2RlICp0bXBfaW5vZGUsIGludCBuZXdfYnVmX3R5cGUsCiAJCWNoYXIgKiBidWYsIGludCAqcG9iamVjdF90eXBlLCBpbnQgaXNOZXdJbm9kZSkKIHsKQEAgLTEzNSwxNiArMTQ2LDIzIEBACiAJCXRtcF9pbm9kZS0+aV9jdGltZSA9CiAJCSAgICAgIGNpZnNfTlR0aW1lVG9Vbml4KGxlNjRfdG9fY3B1KHBmaW5kRGF0YS0+Q2hhbmdlVGltZSkpOwogCX0gZWxzZSB7IC8qIGxlZ2FjeSwgT1MyIGFuZCBET1Mgc3R5bGUgKi8KKy8qCQlzdHJ1Y3QgdGltZXNwZWMgdHM7Ki8KIAkJRklORF9GSUxFX1NUQU5EQVJEX0lORk8gKiBwZmluZERhdGEgPSAKIAkJCShGSU5EX0ZJTEVfU1RBTkRBUkRfSU5GTyAqKWJ1ZjsKIAorCQl0bXBfaW5vZGUtPmlfbXRpbWUgPSBjbnZydERvc1VuaXhUbSgKKwkJCQlsZTE2X3RvX2NwdShwZmluZERhdGEtPkxhc3RXcml0ZURhdGUpLAorCQkJCWxlMTZfdG9fY3B1KHBmaW5kRGF0YS0+TGFzdFdyaXRlVGltZSkpOworCQl0bXBfaW5vZGUtPmlfYXRpbWUgPSBjbnZydERvc1VuaXhUbSgKKwkJCQlsZTE2X3RvX2NwdShwZmluZERhdGEtPkxhc3RBY2Nlc3NEYXRlKSwKKwkJCQlsZTE2X3RvX2NwdShwZmluZERhdGEtPkxhc3RBY2Nlc3NUaW1lKSk7CisgICAgICAgICAgICAgICAgdG1wX2lub2RlLT5pX2N0aW1lID0gY252cnREb3NVbml4VG0oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlMTZfdG9fY3B1KHBmaW5kRGF0YS0+TGFzdFdyaXRlRGF0ZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlMTZfdG9fY3B1KHBmaW5kRGF0YS0+TGFzdFdyaXRlVGltZSkpOworCQlBZGp1c3RGb3JUWihjaWZzX3NiLT50Y29uLCB0bXBfaW5vZGUpOwogCQlhdHRyID0gbGUxNl90b19jcHUocGZpbmREYXRhLT5BdHRyaWJ1dGVzKTsKIAkJYWxsb2NhdGlvbl9zaXplID0gbGUzMl90b19jcHUocGZpbmREYXRhLT5BbGxvY2F0aW9uU2l6ZSk7CiAJCWVuZF9vZl9maWxlID0gbGUzMl90b19jcHUocGZpbmREYXRhLT5EYXRhU2l6ZSk7Ci0JCXRtcF9pbm9kZS0+aV9hdGltZSA9IENVUlJFTlRfVElNRTsKLQkJLyogdG1wX2lub2RlLT5pX210aW1lID0gIEJCIEZJWE1FIC0gYWRkIGRvcyB0aW1lIGhhbmRsaW5nCi0JCXRtcF9pbm9kZS0+aV9jdGltZSA9IDA7ICAgQkIgRklYTUUgKi8KLQogCX0KIAogCS8qIExpbnV4IGNhbiBub3Qgc3RvcmUgZmlsZSBjcmVhdGlvbiB0aW1lIHVuZm9ydHVuYXRlbHkgc28gaWdub3JlIGl0ICovCkBAIC04NzgsNiArODk2LDEwIEBACiAJCSAgICAgdG1wX2lub2RlLT5pX2lubyxvYmpfdHlwZSk7CiAJaWYocmMpIHsKIAkJY0ZZSSgxLCgiZmlsbGRpciByYyA9ICVkIixyYykpOworCQkvKiB3ZSBjYW4gbm90IHJldHVybiBmaWxsZGlyIGVycm9ycyB0byB0aGUgY2FsbGVyCisJCXNpbmNlIHRoZXkgYXJlICJub3JtYWwiIHdoZW4gdGhlIHN0YXQgYmxvY2tzaXplCisJCWlzIHRvbyBzbWFsbCAtIHdlIHJldHVybiByZW1hcHBlZCBlcnJvciBpbnN0ZWFkICovCisJCXJjID0gLUVPVkVSRkxPVzsKIAl9CiAKIAlkcHV0KHRtcF9kZW50cnkpOwpAQCAtOTM4LDYgKzk2MCw3IEBACiAJCWZpbGVuYW1lID0gJnBGaW5kRGF0YS0+RmlsZU5hbWVbMF07CiAJCS8qIG9uZSBieXRlIGxlbmd0aCwgbm8gbmFtZSBjb252ZXJzaW9uICovCiAJCWxlbiA9ICh1bnNpZ25lZCBpbnQpcEZpbmREYXRhLT5GaWxlTmFtZUxlbmd0aDsKKwkJY2lmc0ZpbGUtPnNyY2hfaW5mLnJlc3VtZV9rZXkgPSBwRmluZERhdGEtPlJlc3VtZUtleTsKIAl9IGVsc2UgewogCQljRllJKDEsKCJVbmtub3duIGZpbmRmaXJzdCBsZXZlbCAlZCIsbGV2ZWwpKTsKIAkJcmV0dXJuIC1FSU5WQUw7CkBAIC0xMDU1LDYgKzEwNzgsMTEgQEAKIAkJCXdlIHdhbnQgdG8gY2hlY2sgZm9yIHRoYXQgaGVyZT8gKi8KIAkJCXJjID0gY2lmc19maWxsZGlyKGN1cnJlbnRfZW50cnksIGZpbGUsCiAJCQkJCWZpbGxkaXIsIGRpcmVudHJ5LCB0bXBfYnVmLCBtYXhfbGVuKTsKKwkJCWlmKHJjID09IC1FT1ZFUkZMT1cpIHsKKwkJCQlyYyA9IDA7CisJCQkJYnJlYWs7CisJCQl9CisKIAkJCWZpbGUtPmZfcG9zKys7CiAJCQlpZihmaWxlLT5mX3BvcyA9PSAKIAkJCQljaWZzRmlsZS0+c3JjaF9pbmYuaW5kZXhfb2ZfbGFzdF9lbnRyeSkgewpkaWZmIC0tZ2l0IGEvZnMvY2lmcy9zZXNzLmMgYi9mcy9jaWZzL3Nlc3MuYwppbmRleCAyMmI0YzM1Li5iYmRkYTk5IDEwMDY0NAotLS0gYS9mcy9jaWZzL3Nlc3MuYworKysgYi9mcy9jaWZzL3Nlc3MuYwpAQCAtOTAsNyArOTAsOSBAQAogCX0gKi8KIAkvKiBjb3B5IHVzZXIgKi8KIAlpZihzZXMtPnVzZXJOYW1lID09IE5VTEwpIHsKLQkJLyogQkIgd2hhdCBhYm91dCBudWxsIHVzZXIgbW91bnRzIC0gY2hlY2sgdGhhdCB3ZSBkbyB0aGlzIEJCICovCisJCS8qIG51bGwgdXNlciBtb3VudCAqLworCQkqYmNjX3B0ciA9IDA7CisJCSooYmNjX3B0cisxKSA9IDA7CiAJfSBlbHNlIHsgLyogMzAwIHNob3VsZCBiZSBsb25nIGVub3VnaCBmb3IgYW55IGNvbmNlaXZhYmxlIHVzZXIgbmFtZSAqLwogCQlieXRlc19yZXQgPSBjaWZzX3N0cnRvVUNTKChfX2xlMTYgKikgYmNjX3B0ciwgc2VzLT51c2VyTmFtZSwKIAkJCQkJICAzMDAsIG5sc19jcCk7CkBAIC05OCwxMCArMTAwLDEzIEBACiAJYmNjX3B0ciArPSAyICogYnl0ZXNfcmV0OwogCWJjY19wdHIgKz0gMjsgLyogYWNjb3VudCBmb3IgbnVsbCB0ZXJtaW5hdGlvbiAqLwogCS8qIGNvcHkgZG9tYWluICovCi0JaWYoc2VzLT5kb21haW5OYW1lID09IE5VTEwpCi0JCWJ5dGVzX3JldCA9IGNpZnNfc3RydG9VQ1MoKF9fbGUxNiAqKSBiY2NfcHRyLAotCQkJCQkgICJDSUZTX0xJTlVYX0RPTSIsIDMyLCBubHNfY3ApOwotCWVsc2UKKwlpZihzZXMtPmRvbWFpbk5hbWUgPT0gTlVMTCkgeworCQkvKiBTZW5kaW5nIG51bGwgZG9tYWluIGJldHRlciB0aGFuIHVzaW5nIGEgYm9ndXMgZG9tYWluIG5hbWUgKGFzCisJCXdlIGRpZCBicmllZmx5IGluIDIuNi4xOCkgc2luY2Ugc2VydmVyIHdpbGwgdXNlIGl0cyBkZWZhdWx0ICovCisJCSpiY2NfcHRyID0gMDsKKwkJKihiY2NfcHRyKzEpID0gMDsKKwkJYnl0ZXNfcmV0ID0gMDsKKwl9IGVsc2UKIAkJYnl0ZXNfcmV0ID0gY2lmc19zdHJ0b1VDUygoX19sZTE2ICopIGJjY19wdHIsIHNlcy0+ZG9tYWluTmFtZSwgCiAJCQkJCSAgMjU2LCBubHNfY3ApOwogCWJjY19wdHIgKz0gMiAqIGJ5dGVzX3JldDsKQEAgLTE0NCwxMyArMTQ5LDExIEBACiAKICAgICAgICAgLyogY29weSBkb21haW4gKi8KIAkKLSAgICAgICAgaWYoc2VzLT5kb21haW5OYW1lID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBzdHJjcHkoYmNjX3B0ciwgIkNJRlNfTElOVVhfRE9NIik7Ci0JCWJjY19wdHIgKz0gMTQ7ICAvKiBzdHJsZW4oQ0lGU19MSU5VWF9ET00pICovCi0gCX0gZWxzZSB7CisgICAgICAgIGlmKHNlcy0+ZG9tYWluTmFtZSAhPSBOVUxMKSB7CiAgICAgICAgICAgICAgICAgc3RybmNweShiY2NfcHRyLCBzZXMtPmRvbWFpbk5hbWUsIDI1Nik7IAogCQliY2NfcHRyICs9IHN0cm5sZW4oc2VzLT5kb21haW5OYW1lLCAyNTYpOwotCX0KKwl9IC8qIGVsc2Ugd2Ugd2lsbCBzZW5kIGEgbnVsbCBkb21haW4gbmFtZSAKKwkgICAgIHNvIHRoZSBzZXJ2ZXIgd2lsbCBkZWZhdWx0IHRvIGl0cyBvd24gZG9tYWluICovCiAJKmJjY19wdHIgPSAwOwogCWJjY19wdHIrKzsKIApAQCAtMjY4LDYgKzI3MSwxMCBAQAogCXNlcy0+c2VydmVyT1MgPSBremFsbG9jKGxlbiArIDEsIEdGUF9LRVJORUwpOwogCWlmKHNlcy0+c2VydmVyT1MpCiAJCXN0cm5jcHkoc2VzLT5zZXJ2ZXJPUywgYmNjX3B0ciwgbGVuKTsKKwlpZihzdHJuY21wKHNlcy0+c2VydmVyT1MsICJPUy8yIiw0KSA9PSAwKSB7CisJCQljRllJKDEsKCJPUy8yIHNlcnZlciIpKTsKKwkJCXNlcy0+ZmxhZ3MgfD0gQ0lGU19TRVNfT1MyOworCX0KIAogCWJjY19wdHIgKz0gbGVuICsgMTsKIAlibGVmdCAtPSBsZW4gKyAxOwpAQCAtMjkwLDE2ICsyOTcsMTEgQEAKICAgICAgICAgaWYobGVuID4gYmxlZnQpCiAgICAgICAgICAgICAgICAgcmV0dXJuIHJjOwogCi0gICAgICAgIGlmKHNlcy0+c2VydmVyRG9tYWluKQotICAgICAgICAgICAgICAgIGtmcmVlKHNlcy0+c2VydmVyRG9tYWluKTsKLQotICAgICAgICBzZXMtPnNlcnZlckRvbWFpbiA9IGt6YWxsb2MobGVuICsgMSwgR0ZQX0tFUk5FTCk7Ci0gICAgICAgIGlmKHNlcy0+c2VydmVyT1MpCi0gICAgICAgICAgICAgICAgc3RybmNweShzZXMtPnNlcnZlck9TLCBiY2NfcHRyLCBsZW4pOwotCi0gICAgICAgIGJjY19wdHIgKz0gbGVuICsgMTsKLQlibGVmdCAtPSBsZW4gKyAxOwotCisJLyogTm8gZG9tYWluIGZpZWxkIGluIExBTk1BTiBjYXNlLiBEb21haW4gaXMKKwkgICByZXR1cm5lZCBieSBvbGQgc2VydmVycyBpbiB0aGUgU01CIG5lZ3Byb3QgcmVzcG9uc2UgKi8KKwkvKiBCQiBGb3IgbmV3ZXIgc2VydmVycyB3aGljaCBkbyBub3Qgc3VwcG9ydCBVbmljb2RlLAorCSAgIGJ1dCB0aHVzIGRvIHJldHVybiBkb21haW4gaGVyZSB3ZSBjb3VsZCBhZGQgcGFyc2luZworCSAgIGZvciBpdCBsYXRlciwgYnV0IGl0IGlzIG5vdCB2ZXJ5IGltcG9ydGFudCAqLwogCWNGWUkoMSwoImFzY2lpOiBieXRlcyBsZWZ0ICVkIixibGVmdCkpOwogCiAJcmV0dXJuIHJjOwpAQCAtMzY2LDYgKzM2OCw4IEBACiAJc3RyX2FyZWEgPSBrbWFsbG9jKDIwMDAsIEdGUF9LRVJORUwpOwogCWJjY19wdHIgPSBzdHJfYXJlYTsKIAorCXNlcy0+ZmxhZ3MgJj0gfkNJRlNfU0VTX0xBTk1BTjsKKwogCWlmKHR5cGUgPT0gTEFOTUFOKSB7CiAjaWZkZWYgQ09ORklHX0NJRlNfV0VBS19QV19IQVNICiAJCWNoYXIgbG5tX3Nlc3Npb25fa2V5W0NJRlNfU0VTU19LRVlfU0laRV07CkBAIC0zNzcsNyArMzgxLDcgQEAKIAkJLyogYW5kIGNvcHkgaW50byBiY2MgKi8KIAogCQljYWxjX2xhbm1hbl9oYXNoKHNlcywgbG5tX3Nlc3Npb25fa2V5KTsKLQorCQlzZXMtPmZsYWdzIHw9IENJRlNfU0VTX0xBTk1BTjsgCiAvKiAjaWZkZWYgQ09ORklHX0NJRlNfREVCVUcyCiAJCWNpZnNfZHVtcF9tZW0oImNyeXB0a2V5OiAiLHNlcy0+c2VydmVyLT5jcnlwdEtleSwKIAkJCUNJRlNfU0VTU19LRVlfU0laRSk7CmRpZmYgLS1naXQgYS9mcy9jaWZzL3NtYmRlcy5jIGIvZnMvY2lmcy9zbWJkZXMuYwppbmRleCBlZmFhMDQ0Li43YTFiMmI5IDEwMDY0NAotLS0gYS9mcy9jaWZzL3NtYmRlcy5jCisrKyBiL2ZzL2NpZnMvc21iZGVzLmMKQEAgLTM2NCwyMCArMzY0LDIwIEBACiAJc21iaGFzaChwMjQgKyAxNiwgYzgsIHAyMSArIDE0LCAxKTsKIH0KIAotdm9pZAorI2lmIDAgLyogY3VycmVudGx5IHVuc3VlZCAqLworc3RhdGljIHZvaWQKIERfUDE2KHVuc2lnbmVkIGNoYXIgKnAxNCwgdW5zaWduZWQgY2hhciAqaW4sIHVuc2lnbmVkIGNoYXIgKm91dCkKIHsKIAlzbWJoYXNoKG91dCwgaW4sIHAxNCwgMCk7CiAJc21iaGFzaChvdXQgKyA4LCBpbiArIDgsIHAxNCArIDcsIDApOwogfQogCi12b2lkCitzdGF0aWMgdm9pZAogRV9vbGRfcHdfaGFzaCh1bnNpZ25lZCBjaGFyICpwMTQsIHVuc2lnbmVkIGNoYXIgKmluLCB1bnNpZ25lZCBjaGFyICpvdXQpCiB7CiAJc21iaGFzaChvdXQsIGluLCBwMTQsIDEpOwogCXNtYmhhc2gob3V0ICsgOCwgaW4gKyA4LCBwMTQgKyA3LCAxKTsKIH0KLSNpZiAwCiAvKiB0aGVzZSByb3V0aW5lcyBhcmUgY3VycmVudGx5IHVubmVlZGVkLCBidXQgbWF5IGJlCiAJbmVlZGVkIGxhdGVyICovCiB2b2lkCmRpZmYgLS1naXQgYS9mcy9jaWZzL3NtYmVuY3J5cHQuYyBiL2ZzL2NpZnMvc21iZW5jcnlwdC5jCmluZGV4IGY1MThjNWUuLjRiMjViYTkgMTAwNjQ0Ci0tLSBhL2ZzL2NpZnMvc21iZW5jcnlwdC5jCisrKyBiL2ZzL2NpZnMvc21iZW5jcnlwdC5jCkBAIC01MSwxMSArNTEsOCBAQAogCiB2b2lkIFNNQmVuY3J5cHQodW5zaWduZWQgY2hhciAqcGFzc3dkLCB1bnNpZ25lZCBjaGFyICpjOCwgdW5zaWduZWQgY2hhciAqcDI0KTsKIHZvaWQgRV9tZDRoYXNoKGNvbnN0IHVuc2lnbmVkIGNoYXIgKnBhc3N3ZCwgdW5zaWduZWQgY2hhciAqcDE2KTsKLXZvaWQgbnRfbG1fb3dmX2dlbihjaGFyICpwd2QsIHVuc2lnbmVkIGNoYXIgbnRfcDE2WzE2XSwgdW5zaWduZWQgY2hhciBwMTZbMTZdKTsKIHN0YXRpYyB2b2lkIFNNQk9XRmVuY3J5cHQodW5zaWduZWQgY2hhciBwYXNzd2RbMTZdLCB1bnNpZ25lZCBjaGFyICpjOCwKIAkJICAgdW5zaWduZWQgY2hhciBwMjRbMjRdKTsKLXZvaWQgTlRMTVNTUE9XRmVuY3J5cHQodW5zaWduZWQgY2hhciBwYXNzd2RbOF0sCi0JCSAgICAgICB1bnNpZ25lZCBjaGFyICpudGxtY2hhbHJlc3AsIHVuc2lnbmVkIGNoYXIgcDI0WzI0XSk7CiB2b2lkIFNNQk5UZW5jcnlwdCh1bnNpZ25lZCBjaGFyICpwYXNzd2QsIHVuc2lnbmVkIGNoYXIgKmM4LCB1bnNpZ25lZCBjaGFyICpwMjQpOwogCiAvKgpAQCAtMTQ0LDggKzE0MSw5IEBACiAJbWVtc2V0KHdwd2QsMCwxMjkgKiAyKTsKIH0KIAorI2lmIDAgLyogY3VycmVudGx5IHVudXNlZCAqLwogLyogRG9lcyBib3RoIHRoZSBOVCBhbmQgTE0gb3dmcyBvZiBhIHVzZXIncyBwYXNzd29yZCAqLwotdm9pZAorc3RhdGljIHZvaWQKIG50X2xtX293Zl9nZW4oY2hhciAqcHdkLCB1bnNpZ25lZCBjaGFyIG50X3AxNlsxNl0sIHVuc2lnbmVkIGNoYXIgcDE2WzE2XSkKIHsKIAljaGFyIHBhc3N3ZFs1MTRdOwpAQCAtMTcxLDYgKzE2OSw3IEBACiAJLyogY2xlYXIgb3V0IGxvY2FsIGNvcHkgb2YgdXNlcidzIHBhc3N3b3JkIChqdXN0IGJlaW5nIHBhcmFub2lkKS4gKi8KIAltZW1zZXQocGFzc3dkLCAnXDAnLCBzaXplb2YgKHBhc3N3ZCkpOwogfQorI2VuZGlmCiAKIC8qIERvZXMgdGhlIE5UTE12MiBvd2ZzIG9mIGEgdXNlcidzIHBhc3N3b3JkICovCiAjaWYgMCAgLyogZnVuY3Rpb24gbm90IG5lZWRlZCB5ZXQgLSBidXQgd2lsbCBiZSBzb29uICovCkBAIC0yMjMsNyArMjIyLDggQEAKIH0KIAogLyogRG9lcyB0aGUgZGVzIGVuY3J5cHRpb24gZnJvbSB0aGUgRklSU1QgOCBCWVRFUyBvZiB0aGUgTlQgb3IgTE0gTUQ0IGhhc2guICovCi12b2lkCisjaWYgMCAvKiBjdXJyZW50bHkgdW51c2VkICovCitzdGF0aWMgdm9pZAogTlRMTVNTUE9XRmVuY3J5cHQodW5zaWduZWQgY2hhciBwYXNzd2RbOF0sCiAJCSAgdW5zaWduZWQgY2hhciAqbnRsbWNoYWxyZXNwLCB1bnNpZ25lZCBjaGFyIHAyNFsyNF0pCiB7CkBAIC0yMzUsNiArMjM1LDcgQEAKIAogCUVfUDI0KHAyMSwgbnRsbWNoYWxyZXNwLCBwMjQpOwogfQorI2VuZGlmCiAKIC8qIERvZXMgdGhlIE5UIE1ENCBoYXNoIHRoZW4gZGVzIGVuY3J5cHRpb24uICovCiAKZGlmZiAtLWdpdCBhL2ZzL2NvbXBhdC5jIGIvZnMvY29tcGF0LmMKaW5kZXggNTA2MjRkNC4uOGQwYTAwMSAxMDA2NDQKLS0tIGEvZnMvY29tcGF0LmMKKysrIGIvZnMvY29tcGF0LmMKQEAgLTE4MzUsOSArMTgzNSwxMiBAQAogCiAJfSB3aGlsZSAoIXJldCAmJiAhdGltZW91dCAmJiB0c3AgJiYgKHRzLnR2X3NlYyB8fCB0cy50dl9uc2VjKSk7CiAKLQlpZiAocmV0ID09IDAgJiYgdHNwICYmICEoY3VycmVudC0+cGVyc29uYWxpdHkgJiBTVElDS1lfVElNRU9VVFMpKSB7CisJaWYgKHRzcCkgewogCQlzdHJ1Y3QgY29tcGF0X3RpbWVzcGVjIHJ0czsKIAorCQlpZiAoY3VycmVudC0+cGVyc29uYWxpdHkgJiBTVElDS1lfVElNRU9VVFMpCisJCQlnb3RvIHN0aWNreTsKKwogCQlydHMudHZfc2VjID0gdGltZW91dCAvIEhaOwogCQlydHMudHZfbnNlYyA9ICh0aW1lb3V0ICUgSFopICogKE5TRUNfUEVSX1NFQy9IWik7CiAJCWlmIChydHMudHZfbnNlYyA+PSBOU0VDX1BFUl9TRUMpIHsKQEAgLTE4NDYsOCArMTg0OSwxOSBAQAogCQl9CiAJCWlmIChjb21wYXRfdGltZXNwZWNfY29tcGFyZSgmcnRzLCAmdHMpID49IDApCiAJCQlydHMgPSB0czsKLQkJaWYgKGNvcHlfdG9fdXNlcih0c3AsICZydHMsIHNpemVvZihydHMpKSkKLQkJCXJldCA9IC1FRkFVTFQ7CisJCWlmIChjb3B5X3RvX3VzZXIodHNwLCAmcnRzLCBzaXplb2YocnRzKSkpIHsKK3N0aWNreToKKwkJCS8qCisJCQkgKiBJZiBhbiBhcHBsaWNhdGlvbiBwdXRzIGl0cyB0aW1ldmFsIGluIHJlYWQtb25seQorCQkJICogbWVtb3J5LCB3ZSBkb24ndCB3YW50IHRoZSBMaW51eC1zcGVjaWZpYyB1cGRhdGUgdG8KKwkJCSAqIHRoZSB0aW1ldmFsIHRvIGNhdXNlIGEgZmF1bHQgYWZ0ZXIgdGhlIHNlbGVjdCBoYXMKKwkJCSAqIGNvbXBsZXRlZCBzdWNjZXNzZnVsbHkuIEhvd2V2ZXIsIGJlY2F1c2Ugd2UncmUgbm90CisJCQkgKiB1cGRhdGluZyB0aGUgdGltZXZhbCwgd2UgY2FuJ3QgcmVzdGFydCB0aGUgc3lzdGVtCisJCQkgKiBjYWxsLgorCQkJICovCisJCQlpZiAocmV0ID09IC1FUkVTVEFSVE5PSEFORCkKKwkJCQlyZXQgPSAtRUlOVFI7CisJCX0KIAl9CiAKIAlpZiAocmV0ID09IC1FUkVTVEFSVE5PSEFORCkgewpkaWZmIC0tZ2l0IGEvZnMvY29tcGF0X2lvY3RsLmMgYi9mcy9jb21wYXRfaW9jdGwuYwppbmRleCAyN2NhMWFhLi5hOTFmMjYyIDEwMDY0NAotLS0gYS9mcy9jb21wYXRfaW9jdGwuYworKysgYi9mcy9jb21wYXRfaW9jdGwuYwpAQCAtMjQzOCwxMyArMjQzOCwxNyBAQAogSEFORExFX0lPQ1RMKEJMS0ZSQUdFVCwgd19sb25nKQogSEFORExFX0lPQ1RMKEJMS1NFQ1RHRVQsIHdfbG9uZykKIEhBTkRMRV9JT0NUTChCTEtQRywgYmxrcGdfaW9jdGxfdHJhbnMpCi1IQU5ETEVfSU9DVEwoSERJT19HRVRfS0VFUFNFVFRJTkdTLCBoZGlvX2lvY3RsX3RyYW5zKQogSEFORExFX0lPQ1RMKEhESU9fR0VUX1VOTUFTS0lOVFIsIGhkaW9faW9jdGxfdHJhbnMpCi1IQU5ETEVfSU9DVEwoSERJT19HRVRfRE1BLCBoZGlvX2lvY3RsX3RyYW5zKQotSEFORExFX0lPQ1RMKEhESU9fR0VUXzMyQklULCBoZGlvX2lvY3RsX3RyYW5zKQogSEFORExFX0lPQ1RMKEhESU9fR0VUX01VTFRDT1VOVCwgaGRpb19pb2N0bF90cmFucykKK0hBTkRMRV9JT0NUTChIRElPX0dFVF9LRUVQU0VUVElOR1MsIGhkaW9faW9jdGxfdHJhbnMpCitIQU5ETEVfSU9DVEwoSERJT19HRVRfMzJCSVQsIGhkaW9faW9jdGxfdHJhbnMpCiBIQU5ETEVfSU9DVEwoSERJT19HRVRfTk9XRVJSLCBoZGlvX2lvY3RsX3RyYW5zKQorSEFORExFX0lPQ1RMKEhESU9fR0VUX0RNQSwgaGRpb19pb2N0bF90cmFucykKIEhBTkRMRV9JT0NUTChIRElPX0dFVF9OSUNFLCBoZGlvX2lvY3RsX3RyYW5zKQorSEFORExFX0lPQ1RMKEhESU9fR0VUX1dDQUNIRSwgaGRpb19pb2N0bF90cmFucykKK0hBTkRMRV9JT0NUTChIRElPX0dFVF9BQ09VU1RJQywgaGRpb19pb2N0bF90cmFucykKK0hBTkRMRV9JT0NUTChIRElPX0dFVF9BRERSRVNTLCBoZGlvX2lvY3RsX3RyYW5zKQorSEFORExFX0lPQ1RMKEhESU9fR0VUX0JVU1NUQVRFLCBoZGlvX2lvY3RsX3RyYW5zKQogSEFORExFX0lPQ1RMKEZEU0VUUFJNMzIsIGZkX2lvY3RsX3RyYW5zKQogSEFORExFX0lPQ1RMKEZEREVGUFJNMzIsIGZkX2lvY3RsX3RyYW5zKQogSEFORExFX0lPQ1RMKEZER0VUUFJNMzIsIGZkX2lvY3RsX3RyYW5zKQpkaWZmIC0tZ2l0IGEvZnMvY29uZmlnZnMvZmlsZS5jIGIvZnMvY29uZmlnZnMvZmlsZS5jCmluZGV4IGU2ZDU3NTQuLmNmMzNmYWMgMTAwNjQ0Ci0tLSBhL2ZzL2NvbmZpZ2ZzL2ZpbGUuYworKysgYi9mcy9jb25maWdmcy9maWxlLmMKQEAgLTI3NSwxMyArMjc1LDE0IEBACiAJICogaXQgaW4gZmlsZS0+cHJpdmF0ZV9kYXRhIGZvciBlYXN5IGFjY2Vzcy4KIAkgKi8KIAlidWZmZXIgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgY29uZmlnZnNfYnVmZmVyKSxHRlBfS0VSTkVMKTsKLQlpZiAoYnVmZmVyKSB7Ci0JCWluaXRfTVVURVgoJmJ1ZmZlci0+c2VtKTsKLQkJYnVmZmVyLT5uZWVkc19yZWFkX2ZpbGwgPSAxOwotCQlidWZmZXItPm9wcyA9IG9wczsKLQkJZmlsZS0+cHJpdmF0ZV9kYXRhID0gYnVmZmVyOwotCX0gZWxzZQorCWlmICghYnVmZmVyKSB7CiAJCWVycm9yID0gLUVOT01FTTsKKwkJZ290byBFbm9tZW07CisJfQorCWluaXRfTVVURVgoJmJ1ZmZlci0+c2VtKTsKKwlidWZmZXItPm5lZWRzX3JlYWRfZmlsbCA9IDE7CisJYnVmZmVyLT5vcHMgPSBvcHM7CisJZmlsZS0+cHJpdmF0ZV9kYXRhID0gYnVmZmVyOwogCWdvdG8gRG9uZTsKIAogIEVpbnZhbDoKQEAgLTI4OSw2ICsyOTAsNyBAQAogCWdvdG8gRG9uZTsKICBFYWNjZXNzOgogCWVycm9yID0gLUVBQ0NFUzsKKyBFbm9tZW06CiAJbW9kdWxlX3B1dChhdHRyLT5jYV9vd25lcik7CiAgRG9uZToKIAlpZiAoZXJyb3IgJiYgaXRlbSkKZGlmZiAtLWdpdCBhL2ZzL2RjYWNoZS5jIGIvZnMvZGNhY2hlLmMKaW5kZXggMjM1NWJkZC4uZmQ0YTQyOCAxMDA2NDQKLS0tIGEvZnMvZGNhY2hlLmMKKysrIGIvZnMvZGNhY2hlLmMKQEAgLTQ3OCwxMSArNDc4LDEyIEBACiAJCQl1cF9yZWFkKHNfdW1vdW50KTsKIAkJfQogCQlzcGluX3VubG9jaygmZGVudHJ5LT5kX2xvY2spOwotCQkvKiBDYW5ub3QgcmVtb3ZlIHRoZSBmaXJzdCBkZW50cnksIGFuZCBpdCBpc24ndCBhcHByb3ByaWF0ZQotCQkgKiB0byBtb3ZlIGl0IHRvIHRoZSBoZWFkIG9mIHRoZSBsaXN0LCBzbyBnaXZlIHVwLCBhbmQgdHJ5Ci0JCSAqIGxhdGVyCisJCS8qCisJCSAqIEluc2VydCBkZW50cnkgYXQgdGhlIGhlYWQgb2YgdGhlIGxpc3QgYXMgaW5zZXJ0aW5nIGF0IHRoZQorCQkgKiB0YWlsIGxlYWRzIHRvIGEgY3ljbGUuCiAJCSAqLwotCQlicmVhazsKKyAJCWxpc3RfYWRkKCZkZW50cnktPmRfbHJ1LCAmZGVudHJ5X3VudXNlZCk7CisJCWRlbnRyeV9zdGF0Lm5yX3VudXNlZCsrOwogCX0KIAlzcGluX3VubG9jaygmZGNhY2hlX2xvY2spOwogfQpAQCAtNTQ5LDYgKzU1MCwxNDIgQEAKIH0KIAogLyoKKyAqIGRlc3Ryb3kgYSBzaW5nbGUgc3VidHJlZSBvZiBkZW50cmllcyBmb3IgdW5tb3VudAorICogLSBzZWUgdGhlIGNvbW1lbnRzIG9uIHNocmlua19kY2FjaGVfZm9yX3Vtb3VudCgpIGZvciBhIGRlc2NyaXB0aW9uIG9mIHRoZQorICogICBsb2NraW5nCisgKi8KK3N0YXRpYyB2b2lkIHNocmlua19kY2FjaGVfZm9yX3Vtb3VudF9zdWJ0cmVlKHN0cnVjdCBkZW50cnkgKmRlbnRyeSkKK3sKKwlzdHJ1Y3QgZGVudHJ5ICpwYXJlbnQ7CisJdW5zaWduZWQgZGV0YWNoZWQgPSAwOworCisJQlVHX09OKCFJU19ST09UKGRlbnRyeSkpOworCisJLyogZGV0YWNoIHRoaXMgcm9vdCBmcm9tIHRoZSBzeXN0ZW0gKi8KKwlzcGluX2xvY2soJmRjYWNoZV9sb2NrKTsKKwlpZiAoIWxpc3RfZW1wdHkoJmRlbnRyeS0+ZF9scnUpKSB7CisJCWRlbnRyeV9zdGF0Lm5yX3VudXNlZC0tOworCQlsaXN0X2RlbF9pbml0KCZkZW50cnktPmRfbHJ1KTsKKwl9CisJX19kX2Ryb3AoZGVudHJ5KTsKKwlzcGluX3VubG9jaygmZGNhY2hlX2xvY2spOworCisJZm9yICg7OykgeworCQkvKiBkZXNjZW5kIHRvIHRoZSBmaXJzdCBsZWFmIGluIHRoZSBjdXJyZW50IHN1YnRyZWUgKi8KKwkJd2hpbGUgKCFsaXN0X2VtcHR5KCZkZW50cnktPmRfc3ViZGlycykpIHsKKwkJCXN0cnVjdCBkZW50cnkgKmxvb3A7CisKKwkJCS8qIHRoaXMgaXMgYSBicmFuY2ggd2l0aCBjaGlsZHJlbiAtIGRldGFjaCBhbGwgb2YgdGhlbQorCQkJICogZnJvbSB0aGUgc3lzdGVtIGluIG9uZSBnbyAqLworCQkJc3Bpbl9sb2NrKCZkY2FjaGVfbG9jayk7CisJCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGxvb3AsICZkZW50cnktPmRfc3ViZGlycywKKwkJCQkJICAgIGRfdS5kX2NoaWxkKSB7CisJCQkJaWYgKCFsaXN0X2VtcHR5KCZsb29wLT5kX2xydSkpIHsKKwkJCQkJZGVudHJ5X3N0YXQubnJfdW51c2VkLS07CisJCQkJCWxpc3RfZGVsX2luaXQoJmxvb3AtPmRfbHJ1KTsKKwkJCQl9CisKKwkJCQlfX2RfZHJvcChsb29wKTsKKwkJCQljb25kX3Jlc2NoZWRfbG9jaygmZGNhY2hlX2xvY2spOworCQkJfQorCQkJc3Bpbl91bmxvY2soJmRjYWNoZV9sb2NrKTsKKworCQkJLyogbW92ZSB0byB0aGUgZmlyc3QgY2hpbGQgKi8KKwkJCWRlbnRyeSA9IGxpc3RfZW50cnkoZGVudHJ5LT5kX3N1YmRpcnMubmV4dCwKKwkJCQkJICAgIHN0cnVjdCBkZW50cnksIGRfdS5kX2NoaWxkKTsKKwkJfQorCisJCS8qIGNvbnN1bWUgdGhlIGRlbnRyaWVzIGZyb20gdGhpcyBsZWFmIHVwIHRocm91Z2ggaXRzIHBhcmVudHMKKwkJICogdW50aWwgd2UgZmluZCBvbmUgd2l0aCBjaGlsZHJlbiBvciBydW4gb3V0IGFsdG9nZXRoZXIgKi8KKwkJZG8geworCQkJc3RydWN0IGlub2RlICppbm9kZTsKKworCQkJaWYgKGF0b21pY19yZWFkKCZkZW50cnktPmRfY291bnQpICE9IDApIHsKKwkJCQlwcmludGsoS0VSTl9FUlIKKwkJCQkgICAgICAgIkJVRzogRGVudHJ5ICVwe2k9JWx4LG49JXN9IgorCQkJCSAgICAgICAiIHN0aWxsIGluIHVzZSAoJWQpIgorCQkJCSAgICAgICAiIFt1bm1vdW50IG9mICVzICVzXVxuIiwKKwkJCQkgICAgICAgZGVudHJ5LAorCQkJCSAgICAgICBkZW50cnktPmRfaW5vZGUgPworCQkJCSAgICAgICBkZW50cnktPmRfaW5vZGUtPmlfaW5vIDogMFVMLAorCQkJCSAgICAgICBkZW50cnktPmRfbmFtZS5uYW1lLAorCQkJCSAgICAgICBhdG9taWNfcmVhZCgmZGVudHJ5LT5kX2NvdW50KSwKKwkJCQkgICAgICAgZGVudHJ5LT5kX3NiLT5zX3R5cGUtPm5hbWUsCisJCQkJICAgICAgIGRlbnRyeS0+ZF9zYi0+c19pZCk7CisJCQkJQlVHKCk7CisJCQl9CisKKwkJCXBhcmVudCA9IGRlbnRyeS0+ZF9wYXJlbnQ7CisJCQlpZiAocGFyZW50ID09IGRlbnRyeSkKKwkJCQlwYXJlbnQgPSBOVUxMOworCQkJZWxzZQorCQkJCWF0b21pY19kZWMoJnBhcmVudC0+ZF9jb3VudCk7CisKKwkJCWxpc3RfZGVsKCZkZW50cnktPmRfdS5kX2NoaWxkKTsKKwkJCWRldGFjaGVkKys7CisKKwkJCWlub2RlID0gZGVudHJ5LT5kX2lub2RlOworCQkJaWYgKGlub2RlKSB7CisJCQkJZGVudHJ5LT5kX2lub2RlID0gTlVMTDsKKwkJCQlsaXN0X2RlbF9pbml0KCZkZW50cnktPmRfYWxpYXMpOworCQkJCWlmIChkZW50cnktPmRfb3AgJiYgZGVudHJ5LT5kX29wLT5kX2lwdXQpCisJCQkJCWRlbnRyeS0+ZF9vcC0+ZF9pcHV0KGRlbnRyeSwgaW5vZGUpOworCQkJCWVsc2UKKwkJCQkJaXB1dChpbm9kZSk7CisJCQl9CisKKwkJCWRfZnJlZShkZW50cnkpOworCisJCQkvKiBmaW5pc2hlZCB3aGVuIHdlIGZhbGwgb2ZmIHRoZSB0b3Agb2YgdGhlIHRyZWUsCisJCQkgKiBvdGhlcndpc2Ugd2UgYXNjZW5kIHRvIHRoZSBwYXJlbnQgYW5kIG1vdmUgdG8gdGhlCisJCQkgKiBuZXh0IHNpYmxpbmcgaWYgdGhlcmUgaXMgb25lICovCisJCQlpZiAoIXBhcmVudCkKKwkJCQlnb3RvIG91dDsKKworCQkJZGVudHJ5ID0gcGFyZW50OworCisJCX0gd2hpbGUgKGxpc3RfZW1wdHkoJmRlbnRyeS0+ZF9zdWJkaXJzKSk7CisKKwkJZGVudHJ5ID0gbGlzdF9lbnRyeShkZW50cnktPmRfc3ViZGlycy5uZXh0LAorCQkJCSAgICBzdHJ1Y3QgZGVudHJ5LCBkX3UuZF9jaGlsZCk7CisJfQorb3V0OgorCS8qIHNldmVyYWwgZGVudHJpZXMgd2VyZSBmcmVlZCwgbmVlZCB0byBjb3JyZWN0IG5yX2RlbnRyeSAqLworCXNwaW5fbG9jaygmZGNhY2hlX2xvY2spOworCWRlbnRyeV9zdGF0Lm5yX2RlbnRyeSAtPSBkZXRhY2hlZDsKKwlzcGluX3VubG9jaygmZGNhY2hlX2xvY2spOworfQorCisvKgorICogZGVzdHJveSB0aGUgZGVudHJpZXMgYXR0YWNoZWQgdG8gYSBzdXBlcmJsb2NrIG9uIHVubW91bnRpbmcKKyAqIC0gd2UgZG9uJ3QgbmVlZCB0byB1c2UgZGVudHJ5LT5kX2xvY2ssIGFuZCBvbmx5IG5lZWQgZGNhY2hlX2xvY2sgd2hlbgorICogICByZW1vdmluZyB0aGUgZGVudHJ5IGZyb20gdGhlIHN5c3RlbSBsaXN0cyBhbmQgaGFzaGVzIGJlY2F1c2U6CisgKiAgIC0gdGhlIHN1cGVyYmxvY2sgaXMgZGV0YWNoZWQgZnJvbSBhbGwgbW91bnRpbmdzIGFuZCBvcGVuIGZpbGVzLCBzbyB0aGUKKyAqICAgICBkZW50cnkgdHJlZXMgd2lsbCBub3QgYmUgcmVhcnJhbmdlZCBieSB0aGUgVkZTCisgKiAgIC0gc191bW91bnQgaXMgd3JpdGUtbG9ja2VkLCBzbyB0aGUgbWVtb3J5IHByZXNzdXJlIHNocmlua2VyIHdpbGwgaWdub3JlCisgKiAgICAgYW55IGRlbnRyaWVzIGJlbG9uZ2luZyB0byB0aGlzIHN1cGVyYmxvY2sgdGhhdCBpdCBjb21lcyBhY3Jvc3MKKyAqICAgLSB0aGUgZmlsZXN5c3RlbSBpdHNlbGYgaXMgbm8gbG9uZ2VyIHBlcm1pdHRlZCB0byByZWFycmFuZ2UgdGhlIGRlbnRyaWVzCisgKiAgICAgaW4gdGhpcyBzdXBlcmJsb2NrCisgKi8KK3ZvaWQgc2hyaW5rX2RjYWNoZV9mb3JfdW1vdW50KHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpCit7CisJc3RydWN0IGRlbnRyeSAqZGVudHJ5OworCisJaWYgKGRvd25fcmVhZF90cnlsb2NrKCZzYi0+c191bW91bnQpKQorCQlCVUcoKTsKKworCWRlbnRyeSA9IHNiLT5zX3Jvb3Q7CisJc2ItPnNfcm9vdCA9IE5VTEw7CisJYXRvbWljX2RlYygmZGVudHJ5LT5kX2NvdW50KTsKKwlzaHJpbmtfZGNhY2hlX2Zvcl91bW91bnRfc3VidHJlZShkZW50cnkpOworCisJd2hpbGUgKCFobGlzdF9lbXB0eSgmc2ItPnNfYW5vbikpIHsKKwkJZGVudHJ5ID0gaGxpc3RfZW50cnkoc2ItPnNfYW5vbi5maXJzdCwgc3RydWN0IGRlbnRyeSwgZF9oYXNoKTsKKwkJc2hyaW5rX2RjYWNoZV9mb3JfdW1vdW50X3N1YnRyZWUoZGVudHJ5KTsKKwl9Cit9CisKKy8qCiAgKiBTZWFyY2ggZm9yIGF0IGxlYXN0IDEgbW91bnQgcG9pbnQgaW4gdGhlIGRlbnRyeSdzIHN1YmRpcnMuCiAgKiBXZSBkZXNjZW5kIHRvIHRoZSBuZXh0IGxldmVsIHdoZW5ldmVyIHRoZSBkX3N1YmRpcnMKICAqIGxpc3QgaXMgbm9uLWVtcHR5IGFuZCBjb250aW51ZSBzZWFyY2hpbmcuCkBAIC0xMzM5LDIzICsxNDc2LDIxIEBACiAgKiBkZWxldGVkIGl0LgogICovCiAgCi0vKioKLSAqIGRfbW92ZSAtIG1vdmUgYSBkZW50cnkKKy8qCisgKiBkX21vdmVfbG9ja2VkIC0gbW92ZSBhIGRlbnRyeQogICogQGRlbnRyeTogZW50cnkgdG8gbW92ZQogICogQHRhcmdldDogbmV3IGRlbnRyeQogICoKICAqIFVwZGF0ZSB0aGUgZGNhY2hlIHRvIHJlZmxlY3QgdGhlIG1vdmUgb2YgYSBmaWxlIG5hbWUuIE5lZ2F0aXZlCiAgKiBkY2FjaGUgZW50cmllcyBzaG91bGQgbm90IGJlIG1vdmVkIGluIHRoaXMgd2F5LgogICovCi0KLXZvaWQgZF9tb3ZlKHN0cnVjdCBkZW50cnkgKiBkZW50cnksIHN0cnVjdCBkZW50cnkgKiB0YXJnZXQpCitzdGF0aWMgdm9pZCBkX21vdmVfbG9ja2VkKHN0cnVjdCBkZW50cnkgKiBkZW50cnksIHN0cnVjdCBkZW50cnkgKiB0YXJnZXQpCiB7CiAJc3RydWN0IGhsaXN0X2hlYWQgKmxpc3Q7CiAKIAlpZiAoIWRlbnRyeS0+ZF9pbm9kZSkKIAkJcHJpbnRrKEtFUk5fV0FSTklORyAiVkZTOiBtb3ZpbmcgbmVnYXRpdmUgZGNhY2hlIGVudHJ5XG4iKTsKIAotCXNwaW5fbG9jaygmZGNhY2hlX2xvY2spOwogCXdyaXRlX3NlcWxvY2soJnJlbmFtZV9sb2NrKTsKIAkvKgogCSAqIFhYWFg6IGRvIHdlIHJlYWxseSBuZWVkIHRvIHRha2UgdGFyZ2V0LT5kX2xvY2s/CkBAIC0xNDA2LDEwICsxNTQxLDg0IEBACiAJZnNub3RpZnlfZF9tb3ZlKGRlbnRyeSk7CiAJc3Bpbl91bmxvY2soJmRlbnRyeS0+ZF9sb2NrKTsKIAl3cml0ZV9zZXF1bmxvY2soJnJlbmFtZV9sb2NrKTsKK30KKworLyoqCisgKiBkX21vdmUgLSBtb3ZlIGEgZGVudHJ5CisgKiBAZGVudHJ5OiBlbnRyeSB0byBtb3ZlCisgKiBAdGFyZ2V0OiBuZXcgZGVudHJ5CisgKgorICogVXBkYXRlIHRoZSBkY2FjaGUgdG8gcmVmbGVjdCB0aGUgbW92ZSBvZiBhIGZpbGUgbmFtZS4gTmVnYXRpdmUKKyAqIGRjYWNoZSBlbnRyaWVzIHNob3VsZCBub3QgYmUgbW92ZWQgaW4gdGhpcyB3YXkuCisgKi8KKwordm9pZCBkX21vdmUoc3RydWN0IGRlbnRyeSAqIGRlbnRyeSwgc3RydWN0IGRlbnRyeSAqIHRhcmdldCkKK3sKKwlzcGluX2xvY2soJmRjYWNoZV9sb2NrKTsKKwlkX21vdmVfbG9ja2VkKGRlbnRyeSwgdGFyZ2V0KTsKIAlzcGluX3VubG9jaygmZGNhY2hlX2xvY2spOwogfQogCiAvKgorICogSGVscGVyIHRoYXQgcmV0dXJucyAxIGlmIHAxIGlzIGEgcGFyZW50IG9mIHAyLCBlbHNlIDAKKyAqLworc3RhdGljIGludCBkX2lzcGFyZW50KHN0cnVjdCBkZW50cnkgKnAxLCBzdHJ1Y3QgZGVudHJ5ICpwMikKK3sKKwlzdHJ1Y3QgZGVudHJ5ICpwOworCisJZm9yIChwID0gcDI7IHAtPmRfcGFyZW50ICE9IHA7IHAgPSBwLT5kX3BhcmVudCkgeworCQlpZiAocC0+ZF9wYXJlbnQgPT0gcDEpCisJCQlyZXR1cm4gMTsKKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBUaGlzIGhlbHBlciBhdHRlbXB0cyB0byBjb3BlIHdpdGggcmVtb3RlbHkgcmVuYW1lZCBkaXJlY3RvcmllcworICoKKyAqIEl0IGFzc3VtZXMgdGhhdCB0aGUgY2FsbGVyIGlzIGFscmVhZHkgaG9sZGluZworICogZGVudHJ5LT5kX3BhcmVudC0+ZF9pbm9kZS0+aV9tdXRleCBhbmQgdGhlIGRjYWNoZV9sb2NrCisgKgorICogTm90ZTogSWYgZXZlciB0aGUgbG9ja2luZyBpbiBsb2NrX3JlbmFtZSgpIGNoYW5nZXMsIHRoZW4gcGxlYXNlCisgKiByZW1lbWJlciB0byB1cGRhdGUgdGhpcyB0b28uLi4KKyAqCisgKiBPbiByZXR1cm4sIGRjYWNoZV9sb2NrIHdpbGwgaGF2ZSBiZWVuIHVubG9ja2VkLgorICovCitzdGF0aWMgc3RydWN0IGRlbnRyeSAqX19kX3VuYWxpYXMoc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBzdHJ1Y3QgZGVudHJ5ICphbGlhcykKK3sKKwlzdHJ1Y3QgbXV0ZXggKm0xID0gTlVMTCwgKm0yID0gTlVMTDsKKwlzdHJ1Y3QgZGVudHJ5ICpyZXQ7CisKKwkvKiBJZiBhbGlhcyBhbmQgZGVudHJ5IHNoYXJlIGEgcGFyZW50LCB0aGVuIG5vIGV4dHJhIGxvY2tzIHJlcXVpcmVkICovCisJaWYgKGFsaWFzLT5kX3BhcmVudCA9PSBkZW50cnktPmRfcGFyZW50KQorCQlnb3RvIG91dF91bmFsaWFzOworCisJLyogQ2hlY2sgZm9yIGxvb3BzICovCisJcmV0ID0gRVJSX1BUUigtRUxPT1ApOworCWlmIChkX2lzcGFyZW50KGFsaWFzLCBkZW50cnkpKQorCQlnb3RvIG91dF9lcnI7CisKKwkvKiBTZWUgbG9ja19yZW5hbWUoKSAqLworCXJldCA9IEVSUl9QVFIoLUVCVVNZKTsKKwlpZiAoIW11dGV4X3RyeWxvY2soJmRlbnRyeS0+ZF9zYi0+c192ZnNfcmVuYW1lX211dGV4KSkKKwkJZ290byBvdXRfZXJyOworCW0xID0gJmRlbnRyeS0+ZF9zYi0+c192ZnNfcmVuYW1lX211dGV4OworCWlmICghbXV0ZXhfdHJ5bG9jaygmYWxpYXMtPmRfcGFyZW50LT5kX2lub2RlLT5pX211dGV4KSkKKwkJZ290byBvdXRfZXJyOworCW0yID0gJmFsaWFzLT5kX3BhcmVudC0+ZF9pbm9kZS0+aV9tdXRleDsKK291dF91bmFsaWFzOgorCWRfbW92ZV9sb2NrZWQoYWxpYXMsIGRlbnRyeSk7CisJcmV0ID0gYWxpYXM7CitvdXRfZXJyOgorCXNwaW5fdW5sb2NrKCZkY2FjaGVfbG9jayk7CisJaWYgKG0yKQorCQltdXRleF91bmxvY2sobTIpOworCWlmIChtMSkKKwkJbXV0ZXhfdW5sb2NrKG0xKTsKKwlyZXR1cm4gcmV0OworfQorCisvKgogICogUHJlcGFyZSBhbiBhbm9ueW1vdXMgZGVudHJ5IGZvciBsaWZlIGluIHRoZSBzdXBlcmJsb2NrJ3MgZGVudHJ5IHRyZWUgYXMgYQogICogbmFtZWQgZGVudHJ5IGluIHBsYWNlIG9mIHRoZSBkZW50cnkgdG8gYmUgcmVwbGFjZWQuCiAgKi8KQEAgLTE0NTEsNyArMTY2MCw3IEBACiAgKi8KIHN0cnVjdCBkZW50cnkgKmRfbWF0ZXJpYWxpc2VfdW5pcXVlKHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgc3RydWN0IGlub2RlICppbm9kZSkKIHsKLQlzdHJ1Y3QgZGVudHJ5ICphbGlhcywgKmFjdHVhbDsKKwlzdHJ1Y3QgZGVudHJ5ICphY3R1YWw7CiAKIAlCVUdfT04oIWRfdW5oYXNoZWQoZGVudHJ5KSk7CiAKQEAgLTE0NjMsMjYgKzE2NzIsMjcgQEAKIAkJZ290byBmb3VuZF9sb2NrOwogCX0KIAotCS8qIFNlZSBpZiBhIGRpc2Nvbm5lY3RlZCBkaXJlY3RvcnkgYWxyZWFkeSBleGlzdHMgYXMgYW4gYW5vbnltb3VzIHJvb3QKLQkgKiB0aGF0IHdlIHNob3VsZCBzcGxpY2UgaW50byB0aGUgdHJlZSBpbnN0ZWFkICovCi0JaWYgKFNfSVNESVIoaW5vZGUtPmlfbW9kZSkgJiYgKGFsaWFzID0gX19kX2ZpbmRfYWxpYXMoaW5vZGUsIDEpKSkgewotCQlzcGluX2xvY2soJmFsaWFzLT5kX2xvY2spOworCWlmIChTX0lTRElSKGlub2RlLT5pX21vZGUpKSB7CisJCXN0cnVjdCBkZW50cnkgKmFsaWFzOwogCi0JCS8qIElzIHRoaXMgYSBtb3VudHBvaW50IHRoYXQgd2UgY291bGQgc3BsaWNlIGludG8gb3VyIHRyZWU/ICovCi0JCWlmIChJU19ST09UKGFsaWFzKSkKLQkJCWdvdG8gY29ubmVjdF9tb3VudHBvaW50OwotCi0JCWlmIChhbGlhcy0+ZF9uYW1lLmxlbiA9PSBkZW50cnktPmRfbmFtZS5sZW4gJiYKLQkJICAgIGFsaWFzLT5kX3BhcmVudCA9PSBkZW50cnktPmRfcGFyZW50ICYmCi0JCSAgICBtZW1jbXAoYWxpYXMtPmRfbmFtZS5uYW1lLAotCQkJICAgZGVudHJ5LT5kX25hbWUubmFtZSwKLQkJCSAgIGRlbnRyeS0+ZF9uYW1lLmxlbikgPT0gMCkKLQkJCWdvdG8gcmVwbGFjZV93aXRoX2FsaWFzOwotCi0JCXNwaW5fdW5sb2NrKCZhbGlhcy0+ZF9sb2NrKTsKLQotCQkvKiBEb2ghIFNlZW0gdG8gYmUgYWxpYXNpbmcgZGlyZWN0b3JpZXMgZm9yIHNvbWUgcmVhc29uLi4uICovCi0JCWRwdXQoYWxpYXMpOworCQkvKiBEb2VzIGFuIGFsaWFzZWQgZGVudHJ5IGFscmVhZHkgZXhpc3Q/ICovCisJCWFsaWFzID0gX19kX2ZpbmRfYWxpYXMoaW5vZGUsIDApOworCQlpZiAoYWxpYXMpIHsKKwkJCWFjdHVhbCA9IGFsaWFzOworCQkJLyogSXMgdGhpcyBhbiBhbm9ueW1vdXMgbW91bnRwb2ludCB0aGF0IHdlIGNvdWxkIHNwbGljZQorCQkJICogaW50byBvdXIgdHJlZT8gKi8KKwkJCWlmIChJU19ST09UKGFsaWFzKSkgeworCQkJCXNwaW5fbG9jaygmYWxpYXMtPmRfbG9jayk7CisJCQkJX19kX21hdGVyaWFsaXNlX2RlbnRyeShkZW50cnksIGFsaWFzKTsKKwkJCQlfX2RfZHJvcChhbGlhcyk7CisJCQkJZ290byBmb3VuZDsKKwkJCX0KKwkJCS8qIE5vcGUsIGJ1dCB3ZSBtdXN0KCEpIGF2b2lkIGRpcmVjdG9yeSBhbGlhc2luZyAqLworCQkJYWN0dWFsID0gX19kX3VuYWxpYXMoZGVudHJ5LCBhbGlhcyk7CisJCQlpZiAoSVNfRVJSKGFjdHVhbCkpCisJCQkJZHB1dChhbGlhcyk7CisJCQlnb3RvIG91dF9ub2xvY2s7CisJCX0KIAl9CiAKIAkvKiBBZGQgYSB1bmlxdWUgcmVmZXJlbmNlICovCkBAIC0xNDk4LDcgKzE3MDgsNyBAQAogCV9kX3JlaGFzaChhY3R1YWwpOwogCXNwaW5fdW5sb2NrKCZhY3R1YWwtPmRfbG9jayk7CiAJc3Bpbl91bmxvY2soJmRjYWNoZV9sb2NrKTsKLQorb3V0X25vbG9jazoKIAlpZiAoYWN0dWFsID09IGRlbnRyeSkgewogCQlzZWN1cml0eV9kX2luc3RhbnRpYXRlKGRlbnRyeSwgaW5vZGUpOwogCQlyZXR1cm4gTlVMTDsKQEAgLTE1MDcsMTYgKzE3MTcsNiBAQAogCWlwdXQoaW5vZGUpOwogCXJldHVybiBhY3R1YWw7CiAKLQkvKiBDb252ZXJ0IHRoZSBhbm9ueW1vdXMvcm9vdCBhbGlhcyBpbnRvIGFuIG9yZGluYXJ5IGRlbnRyeSAqLwotY29ubmVjdF9tb3VudHBvaW50OgotCV9fZF9tYXRlcmlhbGlzZV9kZW50cnkoZGVudHJ5LCBhbGlhcyk7Ci0KLQkvKiBSZXBsYWNlIHRoZSBjYW5kaWRhdGUgZGVudHJ5IHdpdGggdGhlIGFsaWFzIGluIHRoZSB0cmVlICovCi1yZXBsYWNlX3dpdGhfYWxpYXM6Ci0JX19kX2Ryb3AoYWxpYXMpOwotCWFjdHVhbCA9IGFsaWFzOwotCWdvdG8gZm91bmQ7Ci0KIHNob3VsZG50X2JlX2hhc2hlZDoKIAlzcGluX3VubG9jaygmZGNhY2hlX2xvY2spOwogCUJVRygpOwpkaWZmIC0tZ2l0IGEvZnMvZGVidWdmcy9pbm9kZS5jIGIvZnMvZGVidWdmcy9pbm9kZS5jCmluZGV4IGU3NzY3NmQuLmE3MzZkNDQgMTAwNjQ0Ci0tLSBhL2ZzL2RlYnVnZnMvaW5vZGUuYworKysgYi9mcy9kZWJ1Z2ZzL2lub2RlLmMKQEAgLTE0NywxMyArMTQ3LDEzIEBACiAJKmRlbnRyeSA9IE5VTEw7CiAJbXV0ZXhfbG9jaygmcGFyZW50LT5kX2lub2RlLT5pX211dGV4KTsKIAkqZGVudHJ5ID0gbG9va3VwX29uZV9sZW4obmFtZSwgcGFyZW50LCBzdHJsZW4obmFtZSkpOwotCWlmICghSVNfRVJSKGRlbnRyeSkpIHsKKwlpZiAoIUlTX0VSUigqZGVudHJ5KSkgewogCQlpZiAoKG1vZGUgJiBTX0lGTVQpID09IFNfSUZESVIpCiAJCQllcnJvciA9IGRlYnVnZnNfbWtkaXIocGFyZW50LT5kX2lub2RlLCAqZGVudHJ5LCBtb2RlKTsKIAkJZWxzZSAKIAkJCWVycm9yID0gZGVidWdmc19jcmVhdGUocGFyZW50LT5kX2lub2RlLCAqZGVudHJ5LCBtb2RlKTsKIAl9IGVsc2UKLQkJZXJyb3IgPSBQVFJfRVJSKGRlbnRyeSk7CisJCWVycm9yID0gUFRSX0VSUigqZGVudHJ5KTsKIAltdXRleF91bmxvY2soJnBhcmVudC0+ZF9pbm9kZS0+aV9tdXRleCk7CiAKIAlyZXR1cm4gZXJyb3I7CmRpZmYgLS1naXQgYS9mcy9kbG0vS2NvbmZpZyBiL2ZzL2RsbS9LY29uZmlnCmluZGV4IDQ5MGY4NWIuLjgxYjJjNjQgMTAwNjQ0Ci0tLSBhL2ZzL2RsbS9LY29uZmlnCisrKyBiL2ZzL2RsbS9LY29uZmlnCkBAIC0xLDEwICsxLDkgQEAKIG1lbnUgIkRpc3RyaWJ1dGVkIExvY2sgTWFuYWdlciIKLQlkZXBlbmRzIG9uIElORVQgJiYgRVhQRVJJTUVOVEFMCisJZGVwZW5kcyBvbiBJTkVUICYmIElQX1NDVFAgJiYgRVhQRVJJTUVOVEFMCiAKIGNvbmZpZyBETE0KIAl0cmlzdGF0ZSAiRGlzdHJpYnV0ZWQgTG9jayBNYW5hZ2VyIChETE0pIgogCWRlcGVuZHMgb24gSVBWNiB8fCBJUFY2PW4KLQlkZXBlbmRzIG9uIElQX1NDVFAKIAlzZWxlY3QgQ09ORklHRlNfRlMKIAloZWxwCiAJQSBnZW5lcmFsIHB1cnBvc2UgZGlzdHJpYnV0ZWQgbG9jayBtYW5hZ2VyIGZvciBrZXJuZWwgb3IgdXNlcnNwYWNlCmRpZmYgLS1naXQgYS9mcy9kbG0vbG9ja3NwYWNlLmMgYi9mcy9kbG0vbG9ja3NwYWNlLmMKaW5kZXggMTA5MzMzYy4uZjg4NDJjYSAxMDA2NDQKLS0tIGEvZnMvZGxtL2xvY2tzcGFjZS5jCisrKyBiL2ZzL2RsbS9sb2Nrc3BhY2UuYwpAQCAtNDMsNiArNDMsMTAgQEAKIAlzc2l6ZV90IHJldCA9IGxlbjsKIAlpbnQgbiA9IHNpbXBsZV9zdHJ0b2woYnVmLCBOVUxMLCAwKTsKIAorCWxzID0gZGxtX2ZpbmRfbG9ja3NwYWNlX2xvY2FsKGxzLT5sc19sb2NhbF9oYW5kbGUpOworCWlmICghbHMpCisJCXJldHVybiAtRUlOVkFMOworCiAJc3dpdGNoIChuKSB7CiAJY2FzZSAwOgogCQlkbG1fbHNfc3RvcChscyk7CkBAIC01Myw2ICs1Nyw3IEBACiAJZGVmYXVsdDoKIAkJcmV0ID0gLUVJTlZBTDsKIAl9CisJZGxtX3B1dF9sb2Nrc3BhY2UobHMpOwogCXJldHVybiByZXQ7CiB9CiAKQEAgLTE0Myw2ICsxNDgsMTIgQEAKIAlyZXR1cm4gYS0+c3RvcmUgPyBhLT5zdG9yZShscywgYnVmLCBsZW4pIDogbGVuOwogfQogCitzdGF0aWMgdm9pZCBsb2Nrc3BhY2Vfa29ial9yZWxlYXNlKHN0cnVjdCBrb2JqZWN0ICprKQoreworCXN0cnVjdCBkbG1fbHMgKmxzICA9IGNvbnRhaW5lcl9vZihrLCBzdHJ1Y3QgZGxtX2xzLCBsc19rb2JqKTsKKwlrZnJlZShscyk7Cit9CisKIHN0YXRpYyBzdHJ1Y3Qgc3lzZnNfb3BzIGRsbV9hdHRyX29wcyA9IHsKIAkuc2hvdyAgPSBkbG1fYXR0cl9zaG93LAogCS5zdG9yZSA9IGRsbV9hdHRyX3N0b3JlLApAQCAtMTUxLDYgKzE2Miw3IEBACiBzdGF0aWMgc3RydWN0IGtvYmpfdHlwZSBkbG1fa3R5cGUgPSB7CiAJLmRlZmF1bHRfYXR0cnMgPSBkbG1fYXR0cnMsCiAJLnN5c2ZzX29wcyAgICAgPSAmZGxtX2F0dHJfb3BzLAorCS5yZWxlYXNlICAgICAgID0gbG9ja3NwYWNlX2tvYmpfcmVsZWFzZSwKIH07CiAKIHN0YXRpYyBzdHJ1Y3Qga3NldCBkbG1fa3NldCA9IHsKQEAgLTY3OCw3ICs2OTAsNyBAQAogCWRsbV9jbGVhcl9tZW1iZXJzX2dvbmUobHMpOwogCWtmcmVlKGxzLT5sc19ub2RlX2FycmF5KTsKIAlrb2JqZWN0X3VucmVnaXN0ZXIoJmxzLT5sc19rb2JqKTsKLQlrZnJlZShscyk7CisgICAgICAgIC8qIFRoZSBscyBzdHJ1Y3R1cmUgd2lsbCBiZSBmcmVlZCB3aGVuIHRoZSBrb2JqZWN0IGlzIGRvbmUgd2l0aCAqLwogCiAJbXV0ZXhfbG9jaygmbHNfbG9jayk7CiAJbHNfY291bnQtLTsKZGlmZiAtLWdpdCBhL2ZzL2RsbS9sb3djb21tcy5jIGIvZnMvZGxtL2xvd2NvbW1zLmMKaW5kZXggN2JjZWE3Yy4uNmRhNmIxNCAxMDA2NDQKLS0tIGEvZnMvZGxtL2xvd2NvbW1zLmMKKysrIGIvZnMvZGxtL2xvd2NvbW1zLmMKQEAgLTUxOSw2ICs1MTksNyBAQAogCW1zZy5tc2dfZmxhZ3MgPSAwOwogCW1zZy5tc2dfY29udHJvbCA9IGluY21zZzsKIAltc2cubXNnX2NvbnRyb2xsZW4gPSBzaXplb2YoaW5jbXNnKTsKKwltc2cubXNnX2lvdmxlbiA9IDE7CiAKIAkvKiBJIGRvbid0IHNlZSB3aHkgdGhpcyBjaXJjdWxhciBidWZmZXIgc3R1ZmYgaXMgbmVjZXNzYXJ5IGZvciBTQ1RQCiAJICogd2hpY2ggaXMgYSBwYWNrZXQtYmFzZWQgcHJvdG9jb2wsIGJ1dCB0aGUgd2hvbGUgdGhpbmcgYnJlYWtzIHVuZGVyCkBAIC01NDgsNyArNTQ5LDcgQEAKIAl9CiAJbGVuID0gaW92WzBdLmlvdl9sZW4gKyBpb3ZbMV0uaW92X2xlbjsKIAotCXIgPSByZXQgPSBrZXJuZWxfcmVjdm1zZyhzY3RwX2Nvbi5zb2NrLCAmbXNnLCBpb3YsIDEsIGxlbiwKKwlyID0gcmV0ID0ga2VybmVsX3JlY3Ztc2coc2N0cF9jb24uc29jaywgJm1zZywgaW92LCBtc2cubXNnX2lvdmxlbiwgbGVuLAogCQkJCSBNU0dfTk9TSUdOQUwgfCBNU0dfRE9OVFdBSVQpOwogCWlmIChyZXQgPD0gMCkKIAkJZ290byBvdXRfY2xvc2U7CmRpZmYgLS1naXQgYS9mcy9lY3J5cHRmcy9jcnlwdG8uYyBiL2ZzL2VjcnlwdGZzL2NyeXB0by5jCmluZGV4IGVkMzVhOTcxMi4uMTM2MTc1YSAxMDA2NDQKLS0tIGEvZnMvZWNyeXB0ZnMvY3J5cHRvLmMKKysrIGIvZnMvZWNyeXB0ZnMvY3J5cHRvLmMKQEAgLTk0LDI1ICs5NCw1MyBAQAogCQkJCSAgc3RydWN0IGVjcnlwdGZzX2NyeXB0X3N0YXQgKmNyeXB0X3N0YXQsCiAJCQkJICBjaGFyICpzcmMsIGludCBsZW4pCiB7Ci0JaW50IHJjID0gMDsKIAlzdHJ1Y3Qgc2NhdHRlcmxpc3Qgc2c7CisJc3RydWN0IGhhc2hfZGVzYyBkZXNjID0geworCQkudGZtID0gY3J5cHRfc3RhdC0+aGFzaF90Zm0sCisJCS5mbGFncyA9IENSWVBUT19URk1fUkVRX01BWV9TTEVFUAorCX07CisJaW50IHJjID0gMDsKIAotCW11dGV4X2xvY2soJmNyeXB0X3N0YXQtPmNzX21kNV90Zm1fbXV0ZXgpOworCW11dGV4X2xvY2soJmNyeXB0X3N0YXQtPmNzX2hhc2hfdGZtX211dGV4KTsKIAlzZ19pbml0X29uZSgmc2csICh1OCAqKXNyYywgbGVuKTsKLQlpZiAoIWNyeXB0X3N0YXQtPm1kNV90Zm0pIHsKLQkJY3J5cHRfc3RhdC0+bWQ1X3RmbSA9Ci0JCQljcnlwdG9fYWxsb2NfdGZtKCJtZDUiLCBDUllQVE9fVEZNX1JFUV9NQVlfU0xFRVApOwotCQlpZiAoIWNyeXB0X3N0YXQtPm1kNV90Zm0pIHsKLQkJCXJjID0gLUVOT01FTTsKKwlpZiAoIWRlc2MudGZtKSB7CisJCWRlc2MudGZtID0gY3J5cHRvX2FsbG9jX2hhc2goRUNSWVBURlNfREVGQVVMVF9IQVNILCAwLAorCQkJCQkgICAgIENSWVBUT19BTEdfQVNZTkMpOworCQlpZiAoSVNfRVJSKGRlc2MudGZtKSkgeworCQkJcmMgPSBQVFJfRVJSKGRlc2MudGZtKTsKIAkJCWVjcnlwdGZzX3ByaW50ayhLRVJOX0VSUiwgIkVycm9yIGF0dGVtcHRpbmcgdG8gIgotCQkJCQkiYWxsb2NhdGUgY3J5cHRvIGNvbnRleHRcbiIpOworCQkJCQkiYWxsb2NhdGUgY3J5cHRvIGNvbnRleHQ7IHJjID0gWyVkXVxuIiwKKwkJCQkJcmMpOwogCQkJZ290byBvdXQ7CiAJCX0KKwkJY3J5cHRfc3RhdC0+aGFzaF90Zm0gPSBkZXNjLnRmbTsKIAl9Ci0JY3J5cHRvX2RpZ2VzdF9pbml0KGNyeXB0X3N0YXQtPm1kNV90Zm0pOwotCWNyeXB0b19kaWdlc3RfdXBkYXRlKGNyeXB0X3N0YXQtPm1kNV90Zm0sICZzZywgMSk7Ci0JY3J5cHRvX2RpZ2VzdF9maW5hbChjcnlwdF9zdGF0LT5tZDVfdGZtLCBkc3QpOwotCW11dGV4X3VubG9jaygmY3J5cHRfc3RhdC0+Y3NfbWQ1X3RmbV9tdXRleCk7CisJY3J5cHRvX2hhc2hfaW5pdCgmZGVzYyk7CisJY3J5cHRvX2hhc2hfdXBkYXRlKCZkZXNjLCAmc2csIGxlbik7CisJY3J5cHRvX2hhc2hfZmluYWwoJmRlc2MsIGRzdCk7CisJbXV0ZXhfdW5sb2NrKCZjcnlwdF9zdGF0LT5jc19oYXNoX3RmbV9tdXRleCk7CitvdXQ6CisJcmV0dXJuIHJjOworfQorCitpbnQgZWNyeXB0ZnNfY3J5cHRvX2FwaV9hbGdpZnlfY2lwaGVyX25hbWUoY2hhciAqKmFsZ2lmaWVkX25hbWUsCisJCQkJCSAgIGNoYXIgKmNpcGhlcl9uYW1lLAorCQkJCQkgICBjaGFyICpjaGFpbmluZ19tb2RpZmllcikKK3sKKwlpbnQgY2lwaGVyX25hbWVfbGVuID0gc3RybGVuKGNpcGhlcl9uYW1lKTsKKwlpbnQgY2hhaW5pbmdfbW9kaWZpZXJfbGVuID0gc3RybGVuKGNoYWluaW5nX21vZGlmaWVyKTsKKwlpbnQgYWxnaWZpZWRfbmFtZV9sZW47CisJaW50IHJjOworCisJYWxnaWZpZWRfbmFtZV9sZW4gPSAoY2hhaW5pbmdfbW9kaWZpZXJfbGVuICsgY2lwaGVyX25hbWVfbGVuICsgMyk7CisJKCphbGdpZmllZF9uYW1lKSA9IGttYWxsb2MoYWxnaWZpZWRfbmFtZV9sZW4sIEdGUF9LRVJORUwpOworCWlmICghKCphbGdpZmllZF9uYW1lKSkgeworCQlyYyA9IC1FTk9NRU07CisJCWdvdG8gb3V0OworCX0KKwlzbnByaW50ZigoKmFsZ2lmaWVkX25hbWUpLCBhbGdpZmllZF9uYW1lX2xlbiwgIiVzKCVzKSIsCisJCSBjaGFpbmluZ19tb2RpZmllciwgY2lwaGVyX25hbWUpOworCXJjID0gMDsKIG91dDoKIAlyZXR1cm4gcmM7CiB9CkBAIC0xNzgsNyArMjA2LDcgQEAKIAltZW1zZXQoKHZvaWQgKiljcnlwdF9zdGF0LCAwLCBzaXplb2Yoc3RydWN0IGVjcnlwdGZzX2NyeXB0X3N0YXQpKTsKIAltdXRleF9pbml0KCZjcnlwdF9zdGF0LT5jc19tdXRleCk7CiAJbXV0ZXhfaW5pdCgmY3J5cHRfc3RhdC0+Y3NfdGZtX211dGV4KTsKLQltdXRleF9pbml0KCZjcnlwdF9zdGF0LT5jc19tZDVfdGZtX211dGV4KTsKKwltdXRleF9pbml0KCZjcnlwdF9zdGF0LT5jc19oYXNoX3RmbV9tdXRleCk7CiAJRUNSWVBURlNfU0VUX0ZMQUcoY3J5cHRfc3RhdC0+ZmxhZ3MsIEVDUllQVEZTX1NUUlVDVF9JTklUSUFMSVpFRCk7CiB9CiAKQEAgLTE5MSw5ICsyMTksOSBAQAogdm9pZCBlY3J5cHRmc19kZXN0cnVjdF9jcnlwdF9zdGF0KHN0cnVjdCBlY3J5cHRmc19jcnlwdF9zdGF0ICpjcnlwdF9zdGF0KQogewogCWlmIChjcnlwdF9zdGF0LT50Zm0pCi0JCWNyeXB0b19mcmVlX3RmbShjcnlwdF9zdGF0LT50Zm0pOwotCWlmIChjcnlwdF9zdGF0LT5tZDVfdGZtKQotCQljcnlwdG9fZnJlZV90Zm0oY3J5cHRfc3RhdC0+bWQ1X3RmbSk7CisJCWNyeXB0b19mcmVlX2Jsa2NpcGhlcihjcnlwdF9zdGF0LT50Zm0pOworCWlmIChjcnlwdF9zdGF0LT5oYXNoX3RmbSkKKwkJY3J5cHRvX2ZyZWVfaGFzaChjcnlwdF9zdGF0LT5oYXNoX3RmbSk7CiAJbWVtc2V0KGNyeXB0X3N0YXQsIDAsIHNpemVvZihzdHJ1Y3QgZWNyeXB0ZnNfY3J5cHRfc3RhdCkpOwogfQogCkBAIC0yMDMsNyArMjMxLDcgQEAKIAlpZiAobW91bnRfY3J5cHRfc3RhdC0+Z2xvYmFsX2F1dGhfdG9rX2tleSkKIAkJa2V5X3B1dChtb3VudF9jcnlwdF9zdGF0LT5nbG9iYWxfYXV0aF90b2tfa2V5KTsKIAlpZiAobW91bnRfY3J5cHRfc3RhdC0+Z2xvYmFsX2tleV90Zm0pCi0JCWNyeXB0b19mcmVlX3RmbShtb3VudF9jcnlwdF9zdGF0LT5nbG9iYWxfa2V5X3RmbSk7CisJCWNyeXB0b19mcmVlX2Jsa2NpcGhlcihtb3VudF9jcnlwdF9zdGF0LT5nbG9iYWxfa2V5X3RmbSk7CiAJbWVtc2V0KG1vdW50X2NyeXB0X3N0YXQsIDAsIHNpemVvZihzdHJ1Y3QgZWNyeXB0ZnNfbW91bnRfY3J5cHRfc3RhdCkpOwogfQogCkBAIC0yNjksNiArMjk3LDExIEBACiAJCQkgICAgICAgc3RydWN0IHNjYXR0ZXJsaXN0ICpzcmNfc2csIGludCBzaXplLAogCQkJICAgICAgIHVuc2lnbmVkIGNoYXIgKml2KQogeworCXN0cnVjdCBibGtjaXBoZXJfZGVzYyBkZXNjID0geworCQkudGZtID0gY3J5cHRfc3RhdC0+dGZtLAorCQkuaW5mbyA9IGl2LAorCQkuZmxhZ3MgPSBDUllQVE9fVEZNX1JFUV9NQVlfU0xFRVAKKwl9OwogCWludCByYyA9IDA7CiAKIAlCVUdfT04oIWNyeXB0X3N0YXQgfHwgIWNyeXB0X3N0YXQtPnRmbQpAQCAtMjgyLDggKzMxNSw4IEBACiAJfQogCS8qIENvbnNpZGVyIGRvaW5nIHRoaXMgb25jZSwgd2hlbiB0aGUgZmlsZSBpcyBvcGVuZWQgKi8KIAltdXRleF9sb2NrKCZjcnlwdF9zdGF0LT5jc190Zm1fbXV0ZXgpOwotCXJjID0gY3J5cHRvX2NpcGhlcl9zZXRrZXkoY3J5cHRfc3RhdC0+dGZtLCBjcnlwdF9zdGF0LT5rZXksCi0JCQkJICBjcnlwdF9zdGF0LT5rZXlfc2l6ZSk7CisJcmMgPSBjcnlwdG9fYmxrY2lwaGVyX3NldGtleShjcnlwdF9zdGF0LT50Zm0sIGNyeXB0X3N0YXQtPmtleSwKKwkJCQkgICAgIGNyeXB0X3N0YXQtPmtleV9zaXplKTsKIAlpZiAocmMpIHsKIAkJZWNyeXB0ZnNfcHJpbnRrKEtFUk5fRVJSLCAiRXJyb3Igc2V0dGluZyBrZXk7IHJjID0gWyVkXVxuIiwKIAkJCQlyYyk7CkBAIC0yOTIsNyArMzI1LDcgQEAKIAkJZ290byBvdXQ7CiAJfQogCWVjcnlwdGZzX3ByaW50ayhLRVJOX0RFQlVHLCAiRW5jcnlwdGluZyBbJWRdIGJ5dGVzLlxuIiwgc2l6ZSk7Ci0JY3J5cHRvX2NpcGhlcl9lbmNyeXB0X2l2KGNyeXB0X3N0YXQtPnRmbSwgZGVzdF9zZywgc3JjX3NnLCBzaXplLCBpdik7CisJY3J5cHRvX2Jsa2NpcGhlcl9lbmNyeXB0X2l2KCZkZXNjLCBkZXN0X3NnLCBzcmNfc2csIHNpemUpOwogCW11dGV4X3VubG9jaygmY3J5cHRfc3RhdC0+Y3NfdGZtX211dGV4KTsKIG91dDoKIAlyZXR1cm4gcmM7CkBAIC02NzUsMTIgKzcwOCwxNyBAQAogCQkJICAgICAgIHN0cnVjdCBzY2F0dGVybGlzdCAqc3JjX3NnLCBpbnQgc2l6ZSwKIAkJCSAgICAgICB1bnNpZ25lZCBjaGFyICppdikKIHsKKwlzdHJ1Y3QgYmxrY2lwaGVyX2Rlc2MgZGVzYyA9IHsKKwkJLnRmbSA9IGNyeXB0X3N0YXQtPnRmbSwKKwkJLmluZm8gPSBpdiwKKwkJLmZsYWdzID0gQ1JZUFRPX1RGTV9SRVFfTUFZX1NMRUVQCisJfTsKIAlpbnQgcmMgPSAwOwogCiAJLyogQ29uc2lkZXIgZG9pbmcgdGhpcyBvbmNlLCB3aGVuIHRoZSBmaWxlIGlzIG9wZW5lZCAqLwogCW11dGV4X2xvY2soJmNyeXB0X3N0YXQtPmNzX3RmbV9tdXRleCk7Ci0JcmMgPSBjcnlwdG9fY2lwaGVyX3NldGtleShjcnlwdF9zdGF0LT50Zm0sIGNyeXB0X3N0YXQtPmtleSwKLQkJCQkgIGNyeXB0X3N0YXQtPmtleV9zaXplKTsKKwlyYyA9IGNyeXB0b19ibGtjaXBoZXJfc2V0a2V5KGNyeXB0X3N0YXQtPnRmbSwgY3J5cHRfc3RhdC0+a2V5LAorCQkJCSAgICAgY3J5cHRfc3RhdC0+a2V5X3NpemUpOwogCWlmIChyYykgewogCQllY3J5cHRmc19wcmludGsoS0VSTl9FUlIsICJFcnJvciBzZXR0aW5nIGtleTsgcmMgPSBbJWRdXG4iLAogCQkJCXJjKTsKQEAgLTY4OSw4ICs3MjcsNyBAQAogCQlnb3RvIG91dDsKIAl9CiAJZWNyeXB0ZnNfcHJpbnRrKEtFUk5fREVCVUcsICJEZWNyeXB0aW5nIFslZF0gYnl0ZXMuXG4iLCBzaXplKTsKLQlyYyA9IGNyeXB0b19jaXBoZXJfZGVjcnlwdF9pdihjcnlwdF9zdGF0LT50Zm0sIGRlc3Rfc2csIHNyY19zZywgc2l6ZSwKLQkJCQkgICAgICBpdik7CisJcmMgPSBjcnlwdG9fYmxrY2lwaGVyX2RlY3J5cHRfaXYoJmRlc2MsIGRlc3Rfc2csIHNyY19zZywgc2l6ZSk7CiAJbXV0ZXhfdW5sb2NrKCZjcnlwdF9zdGF0LT5jc190Zm1fbXV0ZXgpOwogCWlmIChyYykgewogCQllY3J5cHRmc19wcmludGsoS0VSTl9FUlIsICJFcnJvciBkZWNyeXB0aW5nOyByYyA9IFslZF1cbiIsCkBAIC03NTksNiArNzk2LDcgQEAKICAqLwogaW50IGVjcnlwdGZzX2luaXRfY3J5cHRfY3R4KHN0cnVjdCBlY3J5cHRmc19jcnlwdF9zdGF0ICpjcnlwdF9zdGF0KQogeworCWNoYXIgKmZ1bGxfYWxnX25hbWU7CiAJaW50IHJjID0gLUVJTlZBTDsKIAogCWlmICghY3J5cHRfc3RhdC0+Y2lwaGVyKSB7CkBAIC03NzUsMTYgKzgxMywyNCBAQAogCQlnb3RvIG91dDsKIAl9CiAJbXV0ZXhfbG9jaygmY3J5cHRfc3RhdC0+Y3NfdGZtX211dGV4KTsKLQljcnlwdF9zdGF0LT50Zm0gPSBjcnlwdG9fYWxsb2NfdGZtKGNyeXB0X3N0YXQtPmNpcGhlciwKLQkJCQkJICAgRUNSWVBURlNfREVGQVVMVF9DSEFJTklOR19NT0RFCi0JCQkJCSAgIHwgQ1JZUFRPX1RGTV9SRVFfV0VBS19LRVkpOwotCW11dGV4X3VubG9jaygmY3J5cHRfc3RhdC0+Y3NfdGZtX211dGV4KTsKKwlyYyA9IGVjcnlwdGZzX2NyeXB0b19hcGlfYWxnaWZ5X2NpcGhlcl9uYW1lKCZmdWxsX2FsZ19uYW1lLAorCQkJCQkJICAgIGNyeXB0X3N0YXQtPmNpcGhlciwgImNiYyIpOworCWlmIChyYykKKwkJZ290byBvdXQ7CisJY3J5cHRfc3RhdC0+dGZtID0gY3J5cHRvX2FsbG9jX2Jsa2NpcGhlcihmdWxsX2FsZ19uYW1lLCAwLAorCQkJCQkJIENSWVBUT19BTEdfQVNZTkMpOworCWtmcmVlKGZ1bGxfYWxnX25hbWUpOwogCWlmICghY3J5cHRfc3RhdC0+dGZtKSB7CiAJCWVjcnlwdGZzX3ByaW50ayhLRVJOX0VSUiwgImNyeXB0ZnM6IGluaXRfY3J5cHRfY3R4KCk6ICIKIAkJCQkiRXJyb3IgaW5pdGlhbGl6aW5nIGNpcGhlciBbJXNdXG4iLAogCQkJCWNyeXB0X3N0YXQtPmNpcGhlcik7CisJCW11dGV4X3VubG9jaygmY3J5cHRfc3RhdC0+Y3NfdGZtX211dGV4KTsKIAkJZ290byBvdXQ7CiAJfQorCWNyeXB0b19ibGtjaXBoZXJfc2V0X2ZsYWdzKGNyeXB0X3N0YXQtPnRmbSwKKwkJCQkgICAoRUNSWVBURlNfREVGQVVMVF9DSEFJTklOR19NT0RFCisJCQkJICAgIHwgQ1JZUFRPX1RGTV9SRVFfV0VBS19LRVkpKTsKKwltdXRleF91bmxvY2soJmNyeXB0X3N0YXQtPmNzX3RmbV9tdXRleCk7CiAJcmMgPSAwOwogb3V0OgogCXJldHVybiByYzsKQEAgLTExNDUsMjggKzExOTEsMjggQEAKIGludCBlY3J5cHRmc19yZWFkX2hlYWRlcl9yZWdpb24oY2hhciAqZGF0YSwgc3RydWN0IGRlbnRyeSAqZGVudHJ5LAogCQkJCXN0cnVjdCB2ZnNtb3VudCAqbW50KQogewotCXN0cnVjdCBmaWxlICpmaWxlOworCXN0cnVjdCBmaWxlICpsb3dlcl9maWxlOwogCW1tX3NlZ21lbnRfdCBvbGRmczsKIAlpbnQgcmM7CiAKLQltbnQgPSBtbnRnZXQobW50KTsKLQlmaWxlID0gZGVudHJ5X29wZW4oZGVudHJ5LCBtbnQsIE9fUkRPTkxZKTsKLQlpZiAoSVNfRVJSKGZpbGUpKSB7Ci0JCWVjcnlwdGZzX3ByaW50ayhLRVJOX0RFQlVHLCAiRXJyb3Igb3BlbmluZyBmaWxlIHRvICIKLQkJCQkicmVhZCBoZWFkZXIgcmVnaW9uXG4iKTsKLQkJbW50cHV0KG1udCk7Ci0JCXJjID0gUFRSX0VSUihmaWxlKTsKKwlpZiAoKHJjID0gZWNyeXB0ZnNfb3Blbl9sb3dlcl9maWxlKCZsb3dlcl9maWxlLCBkZW50cnksIG1udCwKKwkJCQkJICAgT19SRE9OTFkpKSkgeworCQlwcmludGsoS0VSTl9FUlIKKwkJICAgICAgICJFcnJvciBvcGVuaW5nIGxvd2VyX2ZpbGUgdG8gcmVhZCBoZWFkZXIgcmVnaW9uXG4iKTsKIAkJZ290byBvdXQ7CiAJfQotCWZpbGUtPmZfcG9zID0gMDsKKwlsb3dlcl9maWxlLT5mX3BvcyA9IDA7CiAJb2xkZnMgPSBnZXRfZnMoKTsKIAlzZXRfZnMoZ2V0X2RzKCkpOwogCS8qIEZvciByZWxlYXNlcyAwLjEgYW5kIDAuMiwgYWxsIG9mIHRoZSBoZWFkZXIgaW5mb3JtYXRpb24KIAkgKiBmaXRzIGluIHRoZSBmaXJzdCBkYXRhIGV4dGVudC1zaXplZCByZWdpb24uICovCi0JcmMgPSBmaWxlLT5mX29wLT5yZWFkKGZpbGUsIChjaGFyIF9fdXNlciAqKWRhdGEsCi0JCQkgICAgICBFQ1JZUFRGU19ERUZBVUxUX0VYVEVOVF9TSVpFLCAmZmlsZS0+Zl9wb3MpOworCXJjID0gbG93ZXJfZmlsZS0+Zl9vcC0+cmVhZChsb3dlcl9maWxlLCAoY2hhciBfX3VzZXIgKilkYXRhLAorCQkJICAgICAgRUNSWVBURlNfREVGQVVMVF9FWFRFTlRfU0laRSwgJmxvd2VyX2ZpbGUtPmZfcG9zKTsKIAlzZXRfZnMob2xkZnMpOwotCWZwdXQoZmlsZSk7CisJaWYgKChyYyA9IGVjcnlwdGZzX2Nsb3NlX2xvd2VyX2ZpbGUobG93ZXJfZmlsZSkpKSB7CisJCXByaW50ayhLRVJOX0VSUiAiRXJyb3IgY2xvc2luZyBsb3dlcl9maWxlXG4iKTsKKwkJZ290byBvdXQ7CisJfQogCXJjID0gMDsKIG91dDoKIAlyZXR1cm4gcmM7CkBAIC0xNTczLDg0ICsxNjE5LDUyIEBACiAKIC8qKgogICogZWNyeXB0ZnNfcHJvY2Vzc19jaXBoZXIgLSBQZXJmb3JtIGNpcGhlciBpbml0aWFsaXphdGlvbi4KLSAqIEB0Zm06IENyeXB0byBjb250ZXh0IHNldCBieSB0aGlzIGZ1bmN0aW9uCiAgKiBAa2V5X3RmbTogQ3J5cHRvIGNvbnRleHQgZm9yIGtleSBtYXRlcmlhbCwgc2V0IGJ5IHRoaXMgZnVuY3Rpb24KLSAqIEBjaXBoZXJfbmFtZTogTmFtZSBvZiB0aGUgY2lwaGVyLgotICogQGtleV9zaXplOiBTaXplIG9mIHRoZSBrZXkgaW4gYnl0ZXMuCisgKiBAY2lwaGVyX25hbWU6IE5hbWUgb2YgdGhlIGNpcGhlcgorICogQGtleV9zaXplOiBTaXplIG9mIHRoZSBrZXkgaW4gYnl0ZXMKICAqCiAgKiBSZXR1cm5zIHplcm8gb24gc3VjY2Vzcy4gQW55IGNyeXB0b190Zm0gc3RydWN0cyBhbGxvY2F0ZWQgaGVyZQogICogc2hvdWxkIGJlIHJlbGVhc2VkIGJ5IG90aGVyIGZ1bmN0aW9ucywgc3VjaCBhcyBvbiBhIHN1cGVyYmxvY2sgcHV0CiAgKiBldmVudCwgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIHRoaXMgZnVuY3Rpb24gc3VjY2VlZHMgZm9yIGZhaWxzLgogICovCiBpbnQKLWVjcnlwdGZzX3Byb2Nlc3NfY2lwaGVyKHN0cnVjdCBjcnlwdG9fdGZtICoqdGZtLCBzdHJ1Y3QgY3J5cHRvX3RmbSAqKmtleV90Zm0sCi0JCQljaGFyICpjaXBoZXJfbmFtZSwgc2l6ZV90IGtleV9zaXplKQorZWNyeXB0ZnNfcHJvY2Vzc19jaXBoZXIoc3RydWN0IGNyeXB0b19ibGtjaXBoZXIgKiprZXlfdGZtLCBjaGFyICpjaXBoZXJfbmFtZSwKKwkJCXNpemVfdCAqa2V5X3NpemUpCiB7CiAJY2hhciBkdW1teV9rZXlbRUNSWVBURlNfTUFYX0tFWV9CWVRFU107CisJY2hhciAqZnVsbF9hbGdfbmFtZTsKIAlpbnQgcmM7CiAKLQkqdGZtID0gKmtleV90Zm0gPSBOVUxMOwotCWlmIChrZXlfc2l6ZSA+IEVDUllQVEZTX01BWF9LRVlfQllURVMpIHsKKwkqa2V5X3RmbSA9IE5VTEw7CisJaWYgKCprZXlfc2l6ZSA+IEVDUllQVEZTX01BWF9LRVlfQllURVMpIHsKIAkJcmMgPSAtRUlOVkFMOwogCQlwcmludGsoS0VSTl9FUlIgIlJlcXVlc3RlZCBrZXkgc2l6ZSBpcyBbJVpkXSBieXRlczsgbWF4aW11bSAiCi0JCSAgICAgICAiYWxsb3dhYmxlIGlzIFslZF1cbiIsIGtleV9zaXplLCBFQ1JZUFRGU19NQVhfS0VZX0JZVEVTKTsKKwkJICAgICAgImFsbG93YWJsZSBpcyBbJWRdXG4iLCAqa2V5X3NpemUsIEVDUllQVEZTX01BWF9LRVlfQllURVMpOwogCQlnb3RvIG91dDsKIAl9Ci0JKnRmbSA9IGNyeXB0b19hbGxvY190Zm0oY2lwaGVyX25hbWUsIChFQ1JZUFRGU19ERUZBVUxUX0NIQUlOSU5HX01PREUKLQkJCQkJICAgICAgfCBDUllQVE9fVEZNX1JFUV9XRUFLX0tFWSkpOwotCWlmICghKCp0Zm0pKSB7Ci0JCXJjID0gLUVJTlZBTDsKKwlyYyA9IGVjcnlwdGZzX2NyeXB0b19hcGlfYWxnaWZ5X2NpcGhlcl9uYW1lKCZmdWxsX2FsZ19uYW1lLCBjaXBoZXJfbmFtZSwKKwkJCQkJCSAgICAiZWNiIik7CisJaWYgKHJjKQorCQlnb3RvIG91dDsKKwkqa2V5X3RmbSA9IGNyeXB0b19hbGxvY19ibGtjaXBoZXIoZnVsbF9hbGdfbmFtZSwgMCwgQ1JZUFRPX0FMR19BU1lOQyk7CisJa2ZyZWUoZnVsbF9hbGdfbmFtZSk7CisJaWYgKElTX0VSUigqa2V5X3RmbSkpIHsKKwkJcmMgPSBQVFJfRVJSKCprZXlfdGZtKTsKIAkJcHJpbnRrKEtFUk5fRVJSICJVbmFibGUgdG8gYWxsb2NhdGUgY3J5cHRvIGNpcGhlciB3aXRoIG5hbWUgIgotCQkgICAgICAgIlslc11cbiIsIGNpcGhlcl9uYW1lKTsKKwkJICAgICAgICJbJXNdOyByYyA9IFslZF1cbiIsIGNpcGhlcl9uYW1lLCByYyk7CiAJCWdvdG8gb3V0OwogCX0KLQkqa2V5X3RmbSA9IGNyeXB0b19hbGxvY190Zm0oY2lwaGVyX25hbWUsIENSWVBUT19URk1fUkVRX1dFQUtfS0VZKTsKLQlpZiAoISgqa2V5X3RmbSkpIHsKLQkJcmMgPSAtRUlOVkFMOwotCQlwcmludGsoS0VSTl9FUlIgIlVuYWJsZSB0byBhbGxvY2F0ZSBjcnlwdG8gY2lwaGVyIHdpdGggbmFtZSAiCi0JCSAgICAgICAiWyVzXVxuIiwgY2lwaGVyX25hbWUpOwotCQlnb3RvIG91dDsKKwljcnlwdG9fYmxrY2lwaGVyX3NldF9mbGFncygqa2V5X3RmbSwgQ1JZUFRPX1RGTV9SRVFfV0VBS19LRVkpOworCWlmICgqa2V5X3NpemUgPT0gMCkgeworCQlzdHJ1Y3QgYmxrY2lwaGVyX2FsZyAqYWxnID0gY3J5cHRvX2Jsa2NpcGhlcl9hbGcoKmtleV90Zm0pOworCisJCSprZXlfc2l6ZSA9IGFsZy0+bWF4X2tleXNpemU7CiAJfQotCWlmIChrZXlfc2l6ZSA8IGNyeXB0b190Zm1fYWxnX21pbl9rZXlzaXplKCp0Zm0pKSB7Ci0JCXJjID0gLUVJTlZBTDsKLQkJcHJpbnRrKEtFUk5fRVJSICJSZXF1ZXN0IGtleSBzaXplIGlzIFslWmRdOyBtaW5pbXVtIGtleSBzaXplICIKLQkJICAgICAgICJzdXBwb3J0ZWQgYnkgY2lwaGVyIFslc10gaXMgWyVkXVxuIiwga2V5X3NpemUsCi0JCSAgICAgICBjaXBoZXJfbmFtZSwgY3J5cHRvX3RmbV9hbGdfbWluX2tleXNpemUoKnRmbSkpOwotCQlnb3RvIG91dDsKLQl9Ci0JaWYgKGtleV9zaXplIDwgY3J5cHRvX3RmbV9hbGdfbWluX2tleXNpemUoKmtleV90Zm0pKSB7Ci0JCXJjID0gLUVJTlZBTDsKLQkJcHJpbnRrKEtFUk5fRVJSICJSZXF1ZXN0IGtleSBzaXplIGlzIFslWmRdOyBtaW5pbXVtIGtleSBzaXplICIKLQkJICAgICAgICJzdXBwb3J0ZWQgYnkgY2lwaGVyIFslc10gaXMgWyVkXVxuIiwga2V5X3NpemUsCi0JCSAgICAgICBjaXBoZXJfbmFtZSwgY3J5cHRvX3RmbV9hbGdfbWluX2tleXNpemUoKmtleV90Zm0pKTsKLQkJZ290byBvdXQ7Ci0JfQotCWlmIChrZXlfc2l6ZSA+IGNyeXB0b190Zm1fYWxnX21heF9rZXlzaXplKCp0Zm0pKSB7Ci0JCXJjID0gLUVJTlZBTDsKLQkJcHJpbnRrKEtFUk5fRVJSICJSZXF1ZXN0IGtleSBzaXplIGlzIFslWmRdOyBtYXhpbXVtIGtleSBzaXplICIKLQkJICAgICAgICJzdXBwb3J0ZWQgYnkgY2lwaGVyIFslc10gaXMgWyVkXVxuIiwga2V5X3NpemUsCi0JCSAgICAgICBjaXBoZXJfbmFtZSwgY3J5cHRvX3RmbV9hbGdfbWluX2tleXNpemUoKnRmbSkpOwotCQlnb3RvIG91dDsKLQl9Ci0JaWYgKGtleV9zaXplID4gY3J5cHRvX3RmbV9hbGdfbWF4X2tleXNpemUoKmtleV90Zm0pKSB7Ci0JCXJjID0gLUVJTlZBTDsKLQkJcHJpbnRrKEtFUk5fRVJSICJSZXF1ZXN0IGtleSBzaXplIGlzIFslWmRdOyBtYXhpbXVtIGtleSBzaXplICIKLQkJICAgICAgICJzdXBwb3J0ZWQgYnkgY2lwaGVyIFslc10gaXMgWyVkXVxuIiwga2V5X3NpemUsCi0JCSAgICAgICBjaXBoZXJfbmFtZSwgY3J5cHRvX3RmbV9hbGdfbWluX2tleXNpemUoKmtleV90Zm0pKTsKLQkJZ290byBvdXQ7Ci0JfQotCWdldF9yYW5kb21fYnl0ZXMoZHVtbXlfa2V5LCBrZXlfc2l6ZSk7Ci0JcmMgPSBjcnlwdG9fY2lwaGVyX3NldGtleSgqdGZtLCBkdW1teV9rZXksIGtleV9zaXplKTsKKwlnZXRfcmFuZG9tX2J5dGVzKGR1bW15X2tleSwgKmtleV9zaXplKTsKKwlyYyA9IGNyeXB0b19ibGtjaXBoZXJfc2V0a2V5KCprZXlfdGZtLCBkdW1teV9rZXksICprZXlfc2l6ZSk7CiAJaWYgKHJjKSB7CiAJCXByaW50ayhLRVJOX0VSUiAiRXJyb3IgYXR0ZW1wdGluZyB0byBzZXQga2V5IG9mIHNpemUgWyVaZF0gZm9yICIKLQkJICAgICAgICJjaXBoZXIgWyVzXTsgcmMgPSBbJWRdXG4iLCBrZXlfc2l6ZSwgY2lwaGVyX25hbWUsIHJjKTsKLQkJcmMgPSAtRUlOVkFMOwotCQlnb3RvIG91dDsKLQl9Ci0JcmMgPSBjcnlwdG9fY2lwaGVyX3NldGtleSgqa2V5X3RmbSwgZHVtbXlfa2V5LCBrZXlfc2l6ZSk7Ci0JaWYgKHJjKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiRXJyb3IgYXR0ZW1wdGluZyB0byBzZXQga2V5IG9mIHNpemUgWyVaZF0gZm9yICIKLQkJICAgICAgICJjaXBoZXIgWyVzXTsgcmMgPSBbJWRdXG4iLCBrZXlfc2l6ZSwgY2lwaGVyX25hbWUsIHJjKTsKKwkJICAgICAgICJjaXBoZXIgWyVzXTsgcmMgPSBbJWRdXG4iLCAqa2V5X3NpemUsIGNpcGhlcl9uYW1lLCByYyk7CiAJCXJjID0gLUVJTlZBTDsKIAkJZ290byBvdXQ7CiAJfQpkaWZmIC0tZ2l0IGEvZnMvZWNyeXB0ZnMvZGVudHJ5LmMgYi9mcy9lY3J5cHRmcy9kZW50cnkuYwppbmRleCBmMGQyYTQzLi41MmQxZTM2IDEwMDY0NAotLS0gYS9mcy9lY3J5cHRmcy9kZW50cnkuYworKysgYi9mcy9lY3J5cHRmcy9kZW50cnkuYwpAQCAtMjQsNiArMjQsNyBAQAogCiAjaW5jbHVkZSA8bGludXgvZGNhY2hlLmg+CiAjaW5jbHVkZSA8bGludXgvbmFtZWkuaD4KKyNpbmNsdWRlIDxsaW51eC9tb3VudC5oPgogI2luY2x1ZGUgImVjcnlwdGZzX2tlcm5lbC5oIgogCiAvKioKQEAgLTU2LDYgKzU3LDEyIEBACiAJcmMgPSBsb3dlcl9kZW50cnktPmRfb3AtPmRfcmV2YWxpZGF0ZShsb3dlcl9kZW50cnksIG5kKTsKIAluZC0+ZGVudHJ5ID0gZGVudHJ5X3NhdmU7CiAJbmQtPm1udCA9IHZmc21vdW50X3NhdmU7CisJaWYgKGRlbnRyeS0+ZF9pbm9kZSkgeworCQlzdHJ1Y3QgaW5vZGUgKmxvd2VyX2lub2RlID0KKwkJCWVjcnlwdGZzX2lub2RlX3RvX2xvd2VyKGRlbnRyeS0+ZF9pbm9kZSk7CisKKwkJZWNyeXB0ZnNfY29weV9hdHRyX2FsbChkZW50cnktPmRfaW5vZGUsIGxvd2VyX2lub2RlKTsKKwl9CiBvdXQ6CiAJcmV0dXJuIHJjOwogfQpAQCAtNzYsOCArODMsMTMgQEAKIAlpZiAoZWNyeXB0ZnNfZGVudHJ5X3RvX3ByaXZhdGUoZGVudHJ5KSkKIAkJa21lbV9jYWNoZV9mcmVlKGVjcnlwdGZzX2RlbnRyeV9pbmZvX2NhY2hlLAogCQkJCWVjcnlwdGZzX2RlbnRyeV90b19wcml2YXRlKGRlbnRyeSkpOwotCWlmIChsb3dlcl9kZW50cnkpCisJaWYgKGxvd2VyX2RlbnRyeSkgeworCQlzdHJ1Y3QgdmZzbW91bnQgKmxvd2VyX21udCA9CisJCQllY3J5cHRmc19kZW50cnlfdG9fbG93ZXJfbW50KGRlbnRyeSk7CisKKwkJbW50cHV0KGxvd2VyX21udCk7CiAJCWRwdXQobG93ZXJfZGVudHJ5KTsKKwl9CiAJcmV0dXJuOwogfQogCmRpZmYgLS1naXQgYS9mcy9lY3J5cHRmcy9lY3J5cHRmc19rZXJuZWwuaCBiL2ZzL2VjcnlwdGZzL2VjcnlwdGZzX2tlcm5lbC5oCmluZGV4IDg3MmM5OTUuLmY5OTI1MzMgMTAwNjQ0Ci0tLSBhL2ZzL2VjcnlwdGZzL2VjcnlwdGZzX2tlcm5lbC5oCisrKyBiL2ZzL2VjcnlwdGZzL2VjcnlwdGZzX2tlcm5lbC5oCkBAIC0xNzUsNiArMTc1LDcgQEAKICNkZWZpbmUgRUNSWVBURlNfREVGQVVMVF9DSVBIRVIgImFlcyIKICNkZWZpbmUgRUNSWVBURlNfREVGQVVMVF9LRVlfQllURVMgMTYKICNkZWZpbmUgRUNSWVBURlNfREVGQVVMVF9DSEFJTklOR19NT0RFIENSWVBUT19URk1fTU9ERV9DQkMKKyNkZWZpbmUgRUNSWVBURlNfREVGQVVMVF9IQVNIICJtZDUiCiAjZGVmaW5lIEVDUllQVEZTX1RBR18zX1BBQ0tFVF9UWVBFIDB4OEMKICNkZWZpbmUgRUNSWVBURlNfVEFHXzExX1BBQ0tFVF9UWVBFIDB4RUQKICNkZWZpbmUgTUQ1X0RJR0VTVF9TSVpFIDE2CkBAIC0yMDQsMTUgKzIwNSwxNSBAQAogCXNpemVfdCBleHRlbnRfc2hpZnQ7CiAJdW5zaWduZWQgaW50IGV4dGVudF9tYXNrOwogCXN0cnVjdCBlY3J5cHRmc19tb3VudF9jcnlwdF9zdGF0ICptb3VudF9jcnlwdF9zdGF0OwotCXN0cnVjdCBjcnlwdG9fdGZtICp0Zm07Ci0Jc3RydWN0IGNyeXB0b190Zm0gKm1kNV90Zm07IC8qIENyeXB0byBjb250ZXh0IGZvciBnZW5lcmF0aW5nCi0JCQkJICAgICAqIHRoZSBpbml0aWFsaXphdGlvbiB2ZWN0b3JzICovCisJc3RydWN0IGNyeXB0b19ibGtjaXBoZXIgKnRmbTsKKwlzdHJ1Y3QgY3J5cHRvX2hhc2ggKmhhc2hfdGZtOyAvKiBDcnlwdG8gY29udGV4dCBmb3IgZ2VuZXJhdGluZworCQkJCSAgICAgICAqIHRoZSBpbml0aWFsaXphdGlvbiB2ZWN0b3JzICovCiAJdW5zaWduZWQgY2hhciBjaXBoZXJbRUNSWVBURlNfTUFYX0NJUEhFUl9OQU1FX1NJWkVdOwogCXVuc2lnbmVkIGNoYXIga2V5W0VDUllQVEZTX01BWF9LRVlfQllURVNdOwogCXVuc2lnbmVkIGNoYXIgcm9vdF9pdltFQ1JZUFRGU19NQVhfSVZfQllURVNdOwogCXVuc2lnbmVkIGNoYXIga2V5c2lnc1tFQ1JZUFRGU19NQVhfTlVNX0tFWVNJR1NdW0VDUllQVEZTX1NJR19TSVpFX0hFWF07CiAJc3RydWN0IG11dGV4IGNzX3RmbV9tdXRleDsKLQlzdHJ1Y3QgbXV0ZXggY3NfbWQ1X3RmbV9tdXRleDsKKwlzdHJ1Y3QgbXV0ZXggY3NfaGFzaF90Zm1fbXV0ZXg7CiAJc3RydWN0IG11dGV4IGNzX211dGV4OwogfTsKIApAQCAtMjQ0LDcgKzI0NSw3IEBACiAJc3RydWN0IGVjcnlwdGZzX2F1dGhfdG9rICpnbG9iYWxfYXV0aF90b2s7CiAJc3RydWN0IGtleSAqZ2xvYmFsX2F1dGhfdG9rX2tleTsKIAlzaXplX3QgZ2xvYmFsX2RlZmF1bHRfY2lwaGVyX2tleV9zaXplOwotCXN0cnVjdCBjcnlwdG9fdGZtICpnbG9iYWxfa2V5X3RmbTsKKwlzdHJ1Y3QgY3J5cHRvX2Jsa2NpcGhlciAqZ2xvYmFsX2tleV90Zm07CiAJc3RydWN0IG11dGV4IGdsb2JhbF9rZXlfdGZtX211dGV4OwogCXVuc2lnbmVkIGNoYXIgZ2xvYmFsX2RlZmF1bHRfY2lwaGVyX25hbWVbRUNSWVBURlNfTUFYX0NJUEhFUl9OQU1FX1NJWkUKIAkJCQkJCSArIDFdOwpAQCAtNDI1LDYgKzQyNiw5IEBACiB2b2lkIGVjcnlwdGZzX2Rlc3RydWN0X21vdW50X2NyeXB0X3N0YXQoCiAJc3RydWN0IGVjcnlwdGZzX21vdW50X2NyeXB0X3N0YXQgKm1vdW50X2NyeXB0X3N0YXQpOwogaW50IGVjcnlwdGZzX2luaXRfY3J5cHRfY3R4KHN0cnVjdCBlY3J5cHRmc19jcnlwdF9zdGF0ICpjcnlwdF9zdGF0KTsKK2ludCBlY3J5cHRmc19jcnlwdG9fYXBpX2FsZ2lmeV9jaXBoZXJfbmFtZShjaGFyICoqYWxnaWZpZWRfbmFtZSwKKwkJCQkJICAgY2hhciAqY2lwaGVyX25hbWUsCisJCQkJCSAgIGNoYXIgKmNoYWluaW5nX21vZGlmaWVyKTsKIGludCBlY3J5cHRmc193cml0ZV9pbm9kZV9zaXplX3RvX2hlYWRlcihzdHJ1Y3QgZmlsZSAqbG93ZXJfZmlsZSwKIAkJCQkJc3RydWN0IGlub2RlICpsb3dlcl9pbm9kZSwKIAkJCQkJc3RydWN0IGlub2RlICppbm9kZSk7CkBAIC00NzMsMTAgKzQ3NywxNCBAQAogCQkJICB1bnNpZ25lZCBjaGFyICpzcmMsIHN0cnVjdCBkZW50cnkgKmVjcnlwdGZzX2RlbnRyeSk7CiBpbnQgZWNyeXB0ZnNfdHJ1bmNhdGUoc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBsb2ZmX3QgbmV3X2xlbmd0aCk7CiBpbnQKLWVjcnlwdGZzX3Byb2Nlc3NfY2lwaGVyKHN0cnVjdCBjcnlwdG9fdGZtICoqdGZtLCBzdHJ1Y3QgY3J5cHRvX3RmbSAqKmtleV90Zm0sCi0JCQljaGFyICpjaXBoZXJfbmFtZSwgc2l6ZV90IGtleV9zaXplKTsKK2VjcnlwdGZzX3Byb2Nlc3NfY2lwaGVyKHN0cnVjdCBjcnlwdG9fYmxrY2lwaGVyICoqa2V5X3RmbSwgY2hhciAqY2lwaGVyX25hbWUsCisJCQlzaXplX3QgKmtleV9zaXplKTsKIGludCBlY3J5cHRmc19pbm9kZV90ZXN0KHN0cnVjdCBpbm9kZSAqaW5vZGUsIHZvaWQgKmNhbmRpZGF0ZV9sb3dlcl9pbm9kZSk7CiBpbnQgZWNyeXB0ZnNfaW5vZGVfc2V0KHN0cnVjdCBpbm9kZSAqaW5vZGUsIHZvaWQgKmxvd2VyX2lub2RlKTsKIHZvaWQgZWNyeXB0ZnNfaW5pdF9pbm9kZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgaW5vZGUgKmxvd2VyX2lub2RlKTsKK2ludCBlY3J5cHRmc19vcGVuX2xvd2VyX2ZpbGUoc3RydWN0IGZpbGUgKipsb3dlcl9maWxlLAorCQkJICAgICBzdHJ1Y3QgZGVudHJ5ICpsb3dlcl9kZW50cnksCisJCQkgICAgIHN0cnVjdCB2ZnNtb3VudCAqbG93ZXJfbW50LCBpbnQgZmxhZ3MpOworaW50IGVjcnlwdGZzX2Nsb3NlX2xvd2VyX2ZpbGUoc3RydWN0IGZpbGUgKmxvd2VyX2ZpbGUpOwogCiAjZW5kaWYgLyogI2lmbmRlZiBFQ1JZUFRGU19LRVJORUxfSCAqLwpkaWZmIC0tZ2l0IGEvZnMvZWNyeXB0ZnMvZmlsZS5jIGIvZnMvZWNyeXB0ZnMvZmlsZS5jCmluZGV4IGM4NTUwYzkuLmE5MmVmMDUgMTAwNjQ0Ci0tLSBhL2ZzL2VjcnlwdGZzL2ZpbGUuYworKysgYi9mcy9lY3J5cHRmcy9maWxlLmMKQEAgLTE5OCw2ICsxOTgsMzMgQEAKIAogc3RydWN0IGttZW1fY2FjaGUgKmVjcnlwdGZzX2ZpbGVfaW5mb19jYWNoZTsKIAoraW50IGVjcnlwdGZzX29wZW5fbG93ZXJfZmlsZShzdHJ1Y3QgZmlsZSAqKmxvd2VyX2ZpbGUsCisJCQkgICAgIHN0cnVjdCBkZW50cnkgKmxvd2VyX2RlbnRyeSwKKwkJCSAgICAgc3RydWN0IHZmc21vdW50ICpsb3dlcl9tbnQsIGludCBmbGFncykKK3sKKwlpbnQgcmMgPSAwOworCisJZGdldChsb3dlcl9kZW50cnkpOworCW1udGdldChsb3dlcl9tbnQpOworCSpsb3dlcl9maWxlID0gZGVudHJ5X29wZW4obG93ZXJfZGVudHJ5LCBsb3dlcl9tbnQsIGZsYWdzKTsKKwlpZiAoSVNfRVJSKCpsb3dlcl9maWxlKSkgeworCQlwcmludGsoS0VSTl9FUlIgIkVycm9yIG9wZW5pbmcgbG93ZXIgZmlsZSBmb3IgbG93ZXJfZGVudHJ5ICIKKwkJICAgICAgICJbMHglcF0sIGxvd2VyX21udCBbMHglcF0sIGFuZCBmbGFncyBbMHgleF1cbiIsCisJCSAgICAgICBsb3dlcl9kZW50cnksIGxvd2VyX21udCwgZmxhZ3MpOworCQlyYyA9IFBUUl9FUlIoKmxvd2VyX2ZpbGUpOworCQkqbG93ZXJfZmlsZSA9IE5VTEw7CisJCWdvdG8gb3V0OworCX0KK291dDoKKwlyZXR1cm4gcmM7Cit9CisKK2ludCBlY3J5cHRmc19jbG9zZV9sb3dlcl9maWxlKHN0cnVjdCBmaWxlICpsb3dlcl9maWxlKQoreworCWZwdXQobG93ZXJfZmlsZSk7CisJcmV0dXJuIDA7Cit9CisKIC8qKgogICogZWNyeXB0ZnNfb3BlbgogICogQGlub2RlOiBpbm9kZSBzcGVjaXlpbmcgZmlsZSB0byBvcGVuCkBAIC0yNDQsMTkgKzI3MSwxNSBAQAogCQlFQ1JZUFRGU19TRVRfRkxBRyhjcnlwdF9zdGF0LT5mbGFncywgRUNSWVBURlNfRU5DUllQVEVEKTsKIAl9CiAJbXV0ZXhfdW5sb2NrKCZjcnlwdF9zdGF0LT5jc19tdXRleCk7Ci0JLyogVGhpcyBtbnRnZXQgJiBkZ2V0IGlzIHVuZG9uZSB2aWEgZnB1dCB3aGVuIHRoZSBmaWxlIGlzIHJlbGVhc2VkICovCi0JZGdldChsb3dlcl9kZW50cnkpOwogCWxvd2VyX2ZsYWdzID0gZmlsZS0+Zl9mbGFnczsKIAlpZiAoKGxvd2VyX2ZsYWdzICYgT19BQ0NNT0RFKSA9PSBPX1dST05MWSkKIAkJbG93ZXJfZmxhZ3MgPSAobG93ZXJfZmxhZ3MgJiBPX0FDQ01PREUpIHwgT19SRFdSOwogCWlmIChmaWxlLT5mX2ZsYWdzICYgT19BUFBFTkQpCiAJCWxvd2VyX2ZsYWdzICY9IH5PX0FQUEVORDsKIAlsb3dlcl9tbnQgPSBlY3J5cHRmc19kZW50cnlfdG9fbG93ZXJfbW50KGVjcnlwdGZzX2RlbnRyeSk7Ci0JbW50Z2V0KGxvd2VyX21udCk7CiAJLyogQ29ycmVzcG9uZGluZyBmcHV0KCkgaW4gZWNyeXB0ZnNfcmVsZWFzZSgpICovCi0JbG93ZXJfZmlsZSA9IGRlbnRyeV9vcGVuKGxvd2VyX2RlbnRyeSwgbG93ZXJfbW50LCBsb3dlcl9mbGFncyk7Ci0JaWYgKElTX0VSUihsb3dlcl9maWxlKSkgewotCQlyYyA9IFBUUl9FUlIobG93ZXJfZmlsZSk7CisJaWYgKChyYyA9IGVjcnlwdGZzX29wZW5fbG93ZXJfZmlsZSgmbG93ZXJfZmlsZSwgbG93ZXJfZGVudHJ5LCBsb3dlcl9tbnQsCisJCQkJCSAgIGxvd2VyX2ZsYWdzKSkpIHsKIAkJZWNyeXB0ZnNfcHJpbnRrKEtFUk5fRVJSLCAiRXJyb3Igb3BlbmluZyBsb3dlciBmaWxlXG4iKTsKIAkJZ290byBvdXRfcHV0czsKIAl9CkBAIC0zNDEsMTEgKzM2NCwxNiBAQAogCXN0cnVjdCBmaWxlICpsb3dlcl9maWxlID0gZWNyeXB0ZnNfZmlsZV90b19sb3dlcihmaWxlKTsKIAlzdHJ1Y3QgZWNyeXB0ZnNfZmlsZV9pbmZvICpmaWxlX2luZm8gPSBlY3J5cHRmc19maWxlX3RvX3ByaXZhdGUoZmlsZSk7CiAJc3RydWN0IGlub2RlICpsb3dlcl9pbm9kZSA9IGVjcnlwdGZzX2lub2RlX3RvX2xvd2VyKGlub2RlKTsKKwlpbnQgcmM7CiAKLQlmcHV0KGxvd2VyX2ZpbGUpOworCWlmICgocmMgPSBlY3J5cHRmc19jbG9zZV9sb3dlcl9maWxlKGxvd2VyX2ZpbGUpKSkgeworCQlwcmludGsoS0VSTl9FUlIgIkVycm9yIGNsb3NpbmcgbG93ZXJfZmlsZVxuIik7CisJCWdvdG8gb3V0OworCX0KIAlpbm9kZS0+aV9ibG9ja3MgPSBsb3dlcl9pbm9kZS0+aV9ibG9ja3M7CiAJa21lbV9jYWNoZV9mcmVlKGVjcnlwdGZzX2ZpbGVfaW5mb19jYWNoZSwgZmlsZV9pbmZvKTsKLQlyZXR1cm4gMDsKK291dDoKKwlyZXR1cm4gcmM7CiB9CiAKIHN0YXRpYyBpbnQKZGlmZiAtLWdpdCBhL2ZzL2VjcnlwdGZzL2lub2RlLmMgYi9mcy9lY3J5cHRmcy9pbm9kZS5jCmluZGV4IGVmZGQyYjcuLmRmY2M2ODQgMTAwNjQ0Ci0tLSBhL2ZzL2VjcnlwdGZzL2lub2RlLmMKKysrIGIvZnMvZWNyeXB0ZnMvaW5vZGUuYwpAQCAtMjMxLDcgKzIzMSw2IEBACiAJaW50IGxvd2VyX2ZsYWdzOwogCXN0cnVjdCBlY3J5cHRmc19jcnlwdF9zdGF0ICpjcnlwdF9zdGF0OwogCXN0cnVjdCBkZW50cnkgKmxvd2VyX2RlbnRyeTsKLQlzdHJ1Y3QgZGVudHJ5ICp0bG93ZXJfZGVudHJ5ID0gTlVMTDsKIAlzdHJ1Y3QgZmlsZSAqbG93ZXJfZmlsZTsKIAlzdHJ1Y3QgaW5vZGUgKmlub2RlLCAqbG93ZXJfaW5vZGU7CiAJc3RydWN0IHZmc21vdW50ICpsb3dlcl9tbnQ7CkBAIC0yNDEsMzAgKzI0MCwxOSBAQAogCQkJbG93ZXJfZGVudHJ5LT5kX25hbWUubmFtZSk7CiAJaW5vZGUgPSBlY3J5cHRmc19kZW50cnktPmRfaW5vZGU7CiAJY3J5cHRfc3RhdCA9ICZlY3J5cHRmc19pbm9kZV90b19wcml2YXRlKGlub2RlKS0+Y3J5cHRfc3RhdDsKLQl0bG93ZXJfZGVudHJ5ID0gZGdldChsb3dlcl9kZW50cnkpOwotCWlmICghdGxvd2VyX2RlbnRyeSkgewotCQlyYyA9IC1FTk9NRU07Ci0JCWVjcnlwdGZzX3ByaW50ayhLRVJOX0VSUiwgIkVycm9yIGRnZXQnaW5nIGxvd2VyX2RlbnRyeVxuIik7Ci0JCWdvdG8gb3V0OwotCX0KIAlsb3dlcl9mbGFncyA9ICgoT19DUkVBVCB8IE9fV1JPTkxZIHwgT19UUlVOQykgJiBPX0FDQ01PREUpIHwgT19SRFdSOwogI2lmIEJJVFNfUEVSX0xPTkcgIT0gMzIKIAlsb3dlcl9mbGFncyB8PSBPX0xBUkdFRklMRTsKICNlbmRpZgogCWxvd2VyX21udCA9IGVjcnlwdGZzX2RlbnRyeV90b19sb3dlcl9tbnQoZWNyeXB0ZnNfZGVudHJ5KTsKLQltbnRnZXQobG93ZXJfbW50KTsKIAkvKiBDb3JyZXNwb25kaW5nIGZwdXQoKSBhdCBlbmQgb2YgdGhpcyBmdW5jdGlvbiAqLwotCWxvd2VyX2ZpbGUgPSBkZW50cnlfb3Blbih0bG93ZXJfZGVudHJ5LCBsb3dlcl9tbnQsIGxvd2VyX2ZsYWdzKTsKLQlpZiAoSVNfRVJSKGxvd2VyX2ZpbGUpKSB7Ci0JCXJjID0gUFRSX0VSUihsb3dlcl9maWxlKTsKKwlpZiAoKHJjID0gZWNyeXB0ZnNfb3Blbl9sb3dlcl9maWxlKCZsb3dlcl9maWxlLCBsb3dlcl9kZW50cnksIGxvd2VyX21udCwKKwkJCQkJICAgbG93ZXJfZmxhZ3MpKSkgewogCQllY3J5cHRmc19wcmludGsoS0VSTl9FUlIsCiAJCQkJIkVycm9yIG9wZW5pbmcgZGVudHJ5OyByYyA9IFslaV1cbiIsIHJjKTsKIAkJZ290byBvdXQ7CiAJfQotCS8qIGZwdXQobG93ZXJfZmlsZSkgc2hvdWxkIGhhbmRsZSB0aGUgcHV0cyBpZiB3ZSBkbyB0aGlzICovCi0JbG93ZXJfZmlsZS0+Zl9kZW50cnkgPSB0bG93ZXJfZGVudHJ5OwotCWxvd2VyX2ZpbGUtPmZfdmZzbW50ID0gbG93ZXJfbW50OwotCWxvd2VyX2lub2RlID0gdGxvd2VyX2RlbnRyeS0+ZF9pbm9kZTsKKwlsb3dlcl9pbm9kZSA9IGxvd2VyX2RlbnRyeS0+ZF9pbm9kZTsKIAlpZiAoU19JU0RJUihlY3J5cHRmc19kZW50cnktPmRfaW5vZGUtPmlfbW9kZSkpIHsKIAkJZWNyeXB0ZnNfcHJpbnRrKEtFUk5fREVCVUcsICJUaGlzIGlzIGEgZGlyZWN0b3J5XG4iKTsKIAkJRUNSWVBURlNfQ0xFQVJfRkxBRyhjcnlwdF9zdGF0LT5mbGFncywgRUNSWVBURlNfRU5DUllQVEVEKTsKQEAgLTI4NSw3ICsyNzMsOCBAQAogCX0KIAlyYyA9IGdyb3dfZmlsZShlY3J5cHRmc19kZW50cnksIGxvd2VyX2ZpbGUsIGlub2RlLCBsb3dlcl9pbm9kZSk7CiBvdXRfZnB1dDoKLQlmcHV0KGxvd2VyX2ZpbGUpOworCWlmICgocmMgPSBlY3J5cHRmc19jbG9zZV9sb3dlcl9maWxlKGxvd2VyX2ZpbGUpKSkKKwkJcHJpbnRrKEtFUk5fRVJSICJFcnJvciBjbG9zaW5nIGxvd2VyX2ZpbGVcbiIpOwogb3V0OgogCXJldHVybiByYzsKIH0KQEAgLTMzNiw3ICszMjUsNiBAQAogCXN0cnVjdCBkZW50cnkgKmxvd2VyX2Rpcl9kZW50cnk7CiAJc3RydWN0IGRlbnRyeSAqbG93ZXJfZGVudHJ5OwogCXN0cnVjdCB2ZnNtb3VudCAqbG93ZXJfbW50OwotCXN0cnVjdCBkZW50cnkgKnRsb3dlcl9kZW50cnkgPSBOVUxMOwogCWNoYXIgKmVuY29kZWRfbmFtZTsKIAl1bnNpZ25lZCBpbnQgZW5jb2RlZF9uYW1lbGVuOwogCXN0cnVjdCBlY3J5cHRmc19jcnlwdF9zdGF0ICpjcnlwdF9zdGF0ID0gTlVMTDsKQEAgLTM0NywyNyArMzM1LDMyIEBACiAJbG93ZXJfZGlyX2RlbnRyeSA9IGVjcnlwdGZzX2RlbnRyeV90b19sb3dlcihkZW50cnktPmRfcGFyZW50KTsKIAlkZW50cnktPmRfb3AgPSAmZWNyeXB0ZnNfZG9wczsKIAlpZiAoKGRlbnRyeS0+ZF9uYW1lLmxlbiA9PSAxICYmICFzdHJjbXAoZGVudHJ5LT5kX25hbWUubmFtZSwgIi4iKSkKLQkgICAgfHwgKGRlbnRyeS0+ZF9uYW1lLmxlbiA9PSAyICYmICFzdHJjbXAoZGVudHJ5LT5kX25hbWUubmFtZSwgIi4uIikpKQotCQlnb3RvIG91dF9kcm9wOworCSAgICB8fCAoZGVudHJ5LT5kX25hbWUubGVuID09IDIKKwkJJiYgIXN0cmNtcChkZW50cnktPmRfbmFtZS5uYW1lLCAiLi4iKSkpIHsKKwkJZF9kcm9wKGRlbnRyeSk7CisJCWdvdG8gb3V0OworCX0KIAllbmNvZGVkX25hbWVsZW4gPSBlY3J5cHRmc19lbmNvZGVfZmlsZW5hbWUoY3J5cHRfc3RhdCwKIAkJCQkJCSAgIGRlbnRyeS0+ZF9uYW1lLm5hbWUsCiAJCQkJCQkgICBkZW50cnktPmRfbmFtZS5sZW4sCiAJCQkJCQkgICAmZW5jb2RlZF9uYW1lKTsKIAlpZiAoZW5jb2RlZF9uYW1lbGVuIDwgMCkgewogCQlyYyA9IGVuY29kZWRfbmFtZWxlbjsKLQkJZ290byBvdXRfZHJvcDsKKwkJZF9kcm9wKGRlbnRyeSk7CisJCWdvdG8gb3V0OwogCX0KIAllY3J5cHRmc19wcmludGsoS0VSTl9ERUJVRywgImVuY29kZWRfbmFtZSA9IFslc107IGVuY29kZWRfbmFtZWxlbiAiCiAJCQkiPSBbJWRdXG4iLCBlbmNvZGVkX25hbWUsIGVuY29kZWRfbmFtZWxlbik7CiAJbG93ZXJfZGVudHJ5ID0gbG9va3VwX29uZV9sZW4oZW5jb2RlZF9uYW1lLCBsb3dlcl9kaXJfZGVudHJ5LAogCQkJCSAgICAgIGVuY29kZWRfbmFtZWxlbiAtIDEpOwogCWtmcmVlKGVuY29kZWRfbmFtZSk7Ci0JbG93ZXJfbW50ID0gbW50Z2V0KGVjcnlwdGZzX2RlbnRyeV90b19sb3dlcl9tbnQoZGVudHJ5LT5kX3BhcmVudCkpOwogCWlmIChJU19FUlIobG93ZXJfZGVudHJ5KSkgewogCQllY3J5cHRmc19wcmludGsoS0VSTl9FUlIsICJFUlIgZnJvbSBsb3dlcl9kZW50cnlcbiIpOwogCQlyYyA9IFBUUl9FUlIobG93ZXJfZGVudHJ5KTsKLQkJZ290byBvdXRfZHJvcDsKKwkJZF9kcm9wKGRlbnRyeSk7CisJCWdvdG8gb3V0OwogCX0KKwlsb3dlcl9tbnQgPSBtbnRnZXQoZWNyeXB0ZnNfZGVudHJ5X3RvX2xvd2VyX21udChkZW50cnktPmRfcGFyZW50KSk7CiAJZWNyeXB0ZnNfcHJpbnRrKEtFUk5fREVCVUcsICJsb3dlcl9kZW50cnkgPSBbJXBdOyBsb3dlcl9kZW50cnktPiIKICAgICAgICAJCSJkX25hbWUubmFtZSA9IFslc11cbiIsIGxvd2VyX2RlbnRyeSwKIAkJbG93ZXJfZGVudHJ5LT5kX25hbWUubmFtZSk7CkBAIC00MDgsMTIgKzQwMSw2IEBACiAJCQkJImFzIHdlICp0aGluayogd2UgYXJlIGFib3V0IHRvIHVubGlua1xuIik7CiAJCWdvdG8gb3V0OwogCX0KLQl0bG93ZXJfZGVudHJ5ID0gZGdldChsb3dlcl9kZW50cnkpOwotCWlmICghdGxvd2VyX2RlbnRyeSB8fCBJU19FUlIodGxvd2VyX2RlbnRyeSkpIHsKLQkJcmMgPSAtRU5PTUVNOwotCQllY3J5cHRmc19wcmludGsoS0VSTl9FUlIsICJDYW5ub3QgZGdldCBsb3dlcl9kZW50cnlcbiIpOwotCQlnb3RvIG91dF9kcHV0OwotCX0KIAkvKiBSZWxlYXNlZCBpbiB0aGlzIGZ1bmN0aW9uICovCiAJcGFnZV92aXJ0ID0KIAkgICAgKGNoYXIgKilrbWVtX2NhY2hlX2FsbG9jKGVjcnlwdGZzX2hlYWRlcl9jYWNoZV8yLApAQCAtNDI1LDcgKzQxMiw3IEBACiAJCWdvdG8gb3V0X2RwdXQ7CiAJfQogCW1lbXNldChwYWdlX3ZpcnQsIDAsIFBBR0VfQ0FDSEVfU0laRSk7Ci0JcmMgPSBlY3J5cHRmc19yZWFkX2hlYWRlcl9yZWdpb24ocGFnZV92aXJ0LCB0bG93ZXJfZGVudHJ5LCBuZC0+bW50KTsKKwlyYyA9IGVjcnlwdGZzX3JlYWRfaGVhZGVyX3JlZ2lvbihwYWdlX3ZpcnQsIGxvd2VyX2RlbnRyeSwgbmQtPm1udCk7CiAJY3J5cHRfc3RhdCA9ICZlY3J5cHRmc19pbm9kZV90b19wcml2YXRlKGRlbnRyeS0+ZF9pbm9kZSktPmNyeXB0X3N0YXQ7CiAJaWYgKCFFQ1JZUFRGU19DSEVDS19GTEFHKGNyeXB0X3N0YXQtPmZsYWdzLCBFQ1JZUFRGU19QT0xJQ1lfQVBQTElFRCkpCiAJCWVjcnlwdGZzX3NldF9kZWZhdWx0X3NpemVzKGNyeXB0X3N0YXQpOwpAQCAtNDQ4LDkgKzQzNSw2IEBACiAKIG91dF9kcHV0OgogCWRwdXQobG93ZXJfZGVudHJ5KTsKLQlpZiAodGxvd2VyX2RlbnRyeSkKLQkJZHB1dCh0bG93ZXJfZGVudHJ5KTsKLW91dF9kcm9wOgogCWRfZHJvcChkZW50cnkpOwogb3V0OgogCXJldHVybiBFUlJfUFRSKHJjKTsKQEAgLTQ4Niw4ICs0NzAsOSBAQAogCXVubG9ja19kaXIobG93ZXJfZGlyX2RlbnRyeSk7CiAJZHB1dChsb3dlcl9uZXdfZGVudHJ5KTsKIAlkcHV0KGxvd2VyX29sZF9kZW50cnkpOwotCWlmICghbmV3X2RlbnRyeS0+ZF9pbm9kZSkKLQkJZF9kcm9wKG5ld19kZW50cnkpOworCWRfZHJvcChsb3dlcl9vbGRfZGVudHJ5KTsKKwlkX2Ryb3AobmV3X2RlbnRyeSk7CisJZF9kcm9wKG9sZF9kZW50cnkpOwogCXJldHVybiByYzsKIH0KIApAQCAtNTAwLDcgKzQ4NSw3IEBACiAJbG9ja19wYXJlbnQobG93ZXJfZGVudHJ5KTsKIAlyYyA9IHZmc191bmxpbmsobG93ZXJfZGlyX2lub2RlLCBsb3dlcl9kZW50cnkpOwogCWlmIChyYykgewotCQllY3J5cHRmc19wcmludGsoS0VSTl9FUlIsICJFcnJvciBpbiB2ZnNfdW5saW5rXG4iKTsKKwkJcHJpbnRrKEtFUk5fRVJSICJFcnJvciBpbiB2ZnNfdW5saW5rOyByYyA9IFslZF1cbiIsIHJjKTsKIAkJZ290byBvdXRfdW5sb2NrOwogCX0KIAllY3J5cHRmc19jb3B5X2F0dHJfdGltZXMoZGlyLCBsb3dlcl9kaXJfaW5vZGUpOwpAQCAtNTc2LDQxICs1NjEsMjQgQEAKIAogc3RhdGljIGludCBlY3J5cHRmc19ybWRpcihzdHJ1Y3QgaW5vZGUgKmRpciwgc3RydWN0IGRlbnRyeSAqZGVudHJ5KQogewotCWludCByYyA9IDA7Ci0Jc3RydWN0IGRlbnRyeSAqdGRlbnRyeSA9IE5VTEw7CiAJc3RydWN0IGRlbnRyeSAqbG93ZXJfZGVudHJ5OwotCXN0cnVjdCBkZW50cnkgKnRsb3dlcl9kZW50cnkgPSBOVUxMOwogCXN0cnVjdCBkZW50cnkgKmxvd2VyX2Rpcl9kZW50cnk7CisJaW50IHJjOwogCiAJbG93ZXJfZGVudHJ5ID0gZWNyeXB0ZnNfZGVudHJ5X3RvX2xvd2VyKGRlbnRyeSk7Ci0JaWYgKCEodGRlbnRyeSA9IGRnZXQoZGVudHJ5KSkpIHsKLQkJcmMgPSAtRUlOVkFMOwotCQllY3J5cHRmc19wcmludGsoS0VSTl9FUlIsICJFcnJvciBkZ2V0J2luZyBkZW50cnkgWyVwXVxuIiwKLQkJCQlkZW50cnkpOwotCQlnb3RvIG91dDsKLQl9CisJZGdldChkZW50cnkpOwogCWxvd2VyX2Rpcl9kZW50cnkgPSBsb2NrX3BhcmVudChsb3dlcl9kZW50cnkpOwotCWlmICghKHRsb3dlcl9kZW50cnkgPSBkZ2V0KGxvd2VyX2RlbnRyeSkpKSB7Ci0JCXJjID0gLUVJTlZBTDsKLQkJZWNyeXB0ZnNfcHJpbnRrKEtFUk5fRVJSLCAiRXJyb3IgZGdldCdpbmcgbG93ZXJfZGVudHJ5ICIKLQkJCQkiWyVwXVxuIiwgbG93ZXJfZGVudHJ5KTsKLQkJZ290byBvdXQ7Ci0JfQorCWRnZXQobG93ZXJfZGVudHJ5KTsKIAlyYyA9IHZmc19ybWRpcihsb3dlcl9kaXJfZGVudHJ5LT5kX2lub2RlLCBsb3dlcl9kZW50cnkpOwotCWlmICghcmMpIHsKLQkJZF9kZWxldGUodGxvd2VyX2RlbnRyeSk7Ci0JCXRsb3dlcl9kZW50cnkgPSBOVUxMOwotCX0KKwlkcHV0KGxvd2VyX2RlbnRyeSk7CisJaWYgKCFyYykKKwkJZF9kZWxldGUobG93ZXJfZGVudHJ5KTsKIAllY3J5cHRmc19jb3B5X2F0dHJfdGltZXMoZGlyLCBsb3dlcl9kaXJfZGVudHJ5LT5kX2lub2RlKTsKIAlkaXItPmlfbmxpbmsgPSBsb3dlcl9kaXJfZGVudHJ5LT5kX2lub2RlLT5pX25saW5rOwogCXVubG9ja19kaXIobG93ZXJfZGlyX2RlbnRyeSk7CiAJaWYgKCFyYykKIAkJZF9kcm9wKGRlbnRyeSk7Ci1vdXQ6Ci0JaWYgKHRkZW50cnkpCi0JCWRwdXQodGRlbnRyeSk7Ci0JaWYgKHRsb3dlcl9kZW50cnkpCi0JCWRwdXQodGxvd2VyX2RlbnRyeSk7CisJZHB1dChkZW50cnkpOwogCXJldHVybiByYzsKIH0KIApAQCAtNjYzLDYgKzYzMSw4IEBACiAJCWVjcnlwdGZzX2NvcHlfYXR0cl9hbGwob2xkX2RpciwgbG93ZXJfb2xkX2Rpcl9kZW50cnktPmRfaW5vZGUpOwogb3V0X2xvY2s6CiAJdW5sb2NrX3JlbmFtZShsb3dlcl9vbGRfZGlyX2RlbnRyeSwgbG93ZXJfbmV3X2Rpcl9kZW50cnkpOworCWRwdXQobG93ZXJfbmV3X2RlbnRyeS0+ZF9wYXJlbnQpOworCWRwdXQobG93ZXJfb2xkX2RlbnRyeS0+ZF9wYXJlbnQpOwogCWRwdXQobG93ZXJfbmV3X2RlbnRyeSk7CiAJZHB1dChsb3dlcl9vbGRfZGVudHJ5KTsKIAlyZXR1cm4gcmM7CkBAIC04MzIsMTIgKzgwMiwxMSBAQAogCX0KIAlsb3dlcl9kZW50cnkgPSBlY3J5cHRmc19kZW50cnlfdG9fbG93ZXIoZGVudHJ5KTsKIAkvKiBUaGlzIGRnZXQgJiBtbnRnZXQgaXMgcmVsZWFzZWQgdGhyb3VnaCBmcHV0IGF0IG91dF9mcHV0OiAqLwotCWRnZXQobG93ZXJfZGVudHJ5KTsKIAlsb3dlcl9tbnQgPSBlY3J5cHRmc19kZW50cnlfdG9fbG93ZXJfbW50KGRlbnRyeSk7Ci0JbW50Z2V0KGxvd2VyX21udCk7Ci0JbG93ZXJfZmlsZSA9IGRlbnRyeV9vcGVuKGxvd2VyX2RlbnRyeSwgbG93ZXJfbW50LCBPX1JEV1IpOwotCWlmICh1bmxpa2VseShJU19FUlIobG93ZXJfZmlsZSkpKSB7Ci0JCXJjID0gUFRSX0VSUihsb3dlcl9maWxlKTsKKwlpZiAoKHJjID0gZWNyeXB0ZnNfb3Blbl9sb3dlcl9maWxlKCZsb3dlcl9maWxlLCBsb3dlcl9kZW50cnksIGxvd2VyX21udCwKKwkJCQkJICAgT19SRFdSKSkpIHsKKwkJZWNyeXB0ZnNfcHJpbnRrKEtFUk5fRVJSLAorCQkJCSJFcnJvciBvcGVuaW5nIGRlbnRyeTsgcmMgPSBbJWldXG4iLCByYyk7CiAJCWdvdG8gb3V0X2ZyZWU7CiAJfQogCWVjcnlwdGZzX3NldF9maWxlX2xvd2VyKCZmYWtlX2VjcnlwdGZzX2ZpbGUsIGxvd2VyX2ZpbGUpOwpAQCAtODc5LDcgKzg0OCw4IEBACiAJCT0gQ1VSUkVOVF9USU1FOwogCW1hcmtfaW5vZGVfZGlydHlfc3luYyhpbm9kZSk7CiBvdXRfZnB1dDoKLQlmcHV0KGxvd2VyX2ZpbGUpOworCWlmICgocmMgPSBlY3J5cHRmc19jbG9zZV9sb3dlcl9maWxlKGxvd2VyX2ZpbGUpKSkKKwkJcHJpbnRrKEtFUk5fRVJSICJFcnJvciBjbG9zaW5nIGxvd2VyX2ZpbGVcbiIpOwogb3V0X2ZyZWU6CiAJaWYgKGVjcnlwdGZzX2ZpbGVfdG9fcHJpdmF0ZSgmZmFrZV9lY3J5cHRmc19maWxlKSkKIAkJa21lbV9jYWNoZV9mcmVlKGVjcnlwdGZzX2ZpbGVfaW5mb19jYWNoZSwKZGlmZiAtLWdpdCBhL2ZzL2VjcnlwdGZzL2tleXN0b3JlLmMgYi9mcy9lY3J5cHRmcy9rZXlzdG9yZS5jCmluZGV4IGJhNDU0NzguLmMzNzQ2ZjUgMTAwNjQ0Ci0tLSBhL2ZzL2VjcnlwdGZzL2tleXN0b3JlLmMKKysrIGIvZnMvZWNyeXB0ZnMva2V5c3RvcmUuYwpAQCAtNDU4LDE0ICs0NTgsMTYgQEAKIHN0YXRpYyBpbnQgZGVjcnlwdF9zZXNzaW9uX2tleShzdHJ1Y3QgZWNyeXB0ZnNfYXV0aF90b2sgKmF1dGhfdG9rLAogCQkJICAgICAgIHN0cnVjdCBlY3J5cHRmc19jcnlwdF9zdGF0ICpjcnlwdF9zdGF0KQogewotCWludCByYyA9IDA7CiAJc3RydWN0IGVjcnlwdGZzX3Bhc3N3b3JkICpwYXNzd29yZF9zX3B0cjsKLQlzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtID0gTlVMTDsKIAlzdHJ1Y3Qgc2NhdHRlcmxpc3Qgc3JjX3NnWzJdLCBkc3Rfc2dbMl07CiAJc3RydWN0IG11dGV4ICp0Zm1fbXV0ZXggPSBOVUxMOwogCS8qIFRPRE86IFVzZSB2aXJ0X3RvX3NjYXR0ZXJsaXN0IGZvciB0aGVzZSAqLwogCWNoYXIgKmVuY3J5cHRlZF9zZXNzaW9uX2tleTsKIAljaGFyICpzZXNzaW9uX2tleTsKKwlzdHJ1Y3QgYmxrY2lwaGVyX2Rlc2MgZGVzYyA9IHsKKwkJLmZsYWdzID0gQ1JZUFRPX1RGTV9SRVFfTUFZX1NMRUVQCisJfTsKKwlpbnQgcmMgPSAwOwogCiAJcGFzc3dvcmRfc19wdHIgPSAmYXV0aF90b2stPnRva2VuLnBhc3N3b3JkOwogCWlmIChFQ1JZUFRGU19DSEVDS19GTEFHKHBhc3N3b3JkX3NfcHRyLT5mbGFncywKQEAgLTQ4MiwzMCArNDg0LDM3IEBACiAJaWYgKCFzdHJjbXAoY3J5cHRfc3RhdC0+Y2lwaGVyLAogCQkgICAgY3J5cHRfc3RhdC0+bW91bnRfY3J5cHRfc3RhdC0+Z2xvYmFsX2RlZmF1bHRfY2lwaGVyX25hbWUpCiAJICAgICYmIGNyeXB0X3N0YXQtPm1vdW50X2NyeXB0X3N0YXQtPmdsb2JhbF9rZXlfdGZtKSB7Ci0JCXRmbSA9IGNyeXB0X3N0YXQtPm1vdW50X2NyeXB0X3N0YXQtPmdsb2JhbF9rZXlfdGZtOworCQlkZXNjLnRmbSA9IGNyeXB0X3N0YXQtPm1vdW50X2NyeXB0X3N0YXQtPmdsb2JhbF9rZXlfdGZtOwogCQl0Zm1fbXV0ZXggPSAmY3J5cHRfc3RhdC0+bW91bnRfY3J5cHRfc3RhdC0+Z2xvYmFsX2tleV90Zm1fbXV0ZXg7CiAJfSBlbHNlIHsKLQkJdGZtID0gY3J5cHRvX2FsbG9jX3RmbShjcnlwdF9zdGF0LT5jaXBoZXIsCi0JCQkJICAgICAgIENSWVBUT19URk1fUkVRX1dFQUtfS0VZKTsKLQkJaWYgKCF0Zm0pIHsKLQkJCXByaW50ayhLRVJOX0VSUiAiRXJyb3IgYWxsb2NhdGluZyBjcnlwdG8gY29udGV4dFxuIik7Ci0JCQlyYyA9IC1FTk9NRU07CisJCWNoYXIgKmZ1bGxfYWxnX25hbWU7CisKKwkJcmMgPSBlY3J5cHRmc19jcnlwdG9fYXBpX2FsZ2lmeV9jaXBoZXJfbmFtZSgmZnVsbF9hbGdfbmFtZSwKKwkJCQkJCQkgICAgY3J5cHRfc3RhdC0+Y2lwaGVyLAorCQkJCQkJCSAgICAiZWNiIik7CisJCWlmIChyYykKKwkJCWdvdG8gb3V0OworCQlkZXNjLnRmbSA9IGNyeXB0b19hbGxvY19ibGtjaXBoZXIoZnVsbF9hbGdfbmFtZSwgMCwKKwkJCQkJCSAgQ1JZUFRPX0FMR19BU1lOQyk7CisJCWtmcmVlKGZ1bGxfYWxnX25hbWUpOworCQlpZiAoSVNfRVJSKGRlc2MudGZtKSkgeworCQkJcmMgPSBQVFJfRVJSKGRlc2MudGZtKTsKKwkJCXByaW50ayhLRVJOX0VSUiAiRXJyb3IgYWxsb2NhdGluZyBjcnlwdG8gY29udGV4dDsgIgorCQkJICAgICAgICJyYyA9IFslZF1cbiIsIHJjKTsKIAkJCWdvdG8gb3V0OwogCQl9Ci0JfQotCWlmIChwYXNzd29yZF9zX3B0ci0+c2Vzc2lvbl9rZXlfZW5jcnlwdGlvbl9rZXlfYnl0ZXMKLQkgICAgPCBjcnlwdG9fdGZtX2FsZ19taW5fa2V5c2l6ZSh0Zm0pKSB7Ci0JCXByaW50ayhLRVJOX1dBUk5JTkcgIlNlc3Npb24ga2V5IGVuY3J5cHRpb24ga2V5IGlzIFslZF0gYnl0ZXM7ICIKLQkJICAgICAgICJtaW5pbXVtIGtleXNpemUgZm9yIHNlbGVjdGVkIGNpcGhlciBpcyBbJWRdIGJ5dGVzLlxuIiwKLQkJICAgICAgIHBhc3N3b3JkX3NfcHRyLT5zZXNzaW9uX2tleV9lbmNyeXB0aW9uX2tleV9ieXRlcywKLQkJICAgICAgIGNyeXB0b190Zm1fYWxnX21pbl9rZXlzaXplKHRmbSkpOwotCQlyYyA9IC1FSU5WQUw7Ci0JCWdvdG8gb3V0OworCQljcnlwdG9fYmxrY2lwaGVyX3NldF9mbGFncyhkZXNjLnRmbSwgQ1JZUFRPX1RGTV9SRVFfV0VBS19LRVkpOwogCX0KIAlpZiAodGZtX211dGV4KQogCQltdXRleF9sb2NrKHRmbV9tdXRleCk7Ci0JY3J5cHRvX2NpcGhlcl9zZXRrZXkodGZtLCBwYXNzd29yZF9zX3B0ci0+c2Vzc2lvbl9rZXlfZW5jcnlwdGlvbl9rZXksCi0JCQkgICAgIGNyeXB0X3N0YXQtPmtleV9zaXplKTsKKwlyYyA9IGNyeXB0b19ibGtjaXBoZXJfc2V0a2V5KGRlc2MudGZtLAorCQkJCSAgICAgcGFzc3dvcmRfc19wdHItPnNlc3Npb25fa2V5X2VuY3J5cHRpb25fa2V5LAorCQkJCSAgICAgY3J5cHRfc3RhdC0+a2V5X3NpemUpOworCWlmIChyYyA8IDApIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJFcnJvciBzZXR0aW5nIGtleSBmb3IgY3J5cHRvIGNvbnRleHRcbiIpOworCQlyYyA9IC1FSU5WQUw7CisJCWdvdG8gb3V0X2ZyZWVfdGZtOworCX0KIAkvKiBUT0RPOiB2aXJ0X3RvX3NjYXR0ZXJsaXN0ICovCiAJZW5jcnlwdGVkX3Nlc3Npb25fa2V5ID0gKGNoYXIgKilfX2dldF9mcmVlX3BhZ2UoR0ZQX0tFUk5FTCk7CiAJaWYgKCFlbmNyeXB0ZWRfc2Vzc2lvbl9rZXkpIHsKQEAgLTUzMSw5ICs1NDAsMTIgQEAKIAlhdXRoX3Rvay0+c2Vzc2lvbl9rZXkuZGVjcnlwdGVkX2tleV9zaXplID0KIAkgICAgYXV0aF90b2stPnNlc3Npb25fa2V5LmVuY3J5cHRlZF9rZXlfc2l6ZTsKIAlkc3Rfc2dbMF0ubGVuZ3RoID0gYXV0aF90b2stPnNlc3Npb25fa2V5LmVuY3J5cHRlZF9rZXlfc2l6ZTsKLQkvKiBUT0RPOiBIYW5kbGUgZXJyb3IgY29uZGl0aW9uICovCi0JY3J5cHRvX2NpcGhlcl9kZWNyeXB0KHRmbSwgZHN0X3NnLCBzcmNfc2csCi0JCQkgICAgICBhdXRoX3Rvay0+c2Vzc2lvbl9rZXkuZW5jcnlwdGVkX2tleV9zaXplKTsKKwlyYyA9IGNyeXB0b19ibGtjaXBoZXJfZGVjcnlwdCgmZGVzYywgZHN0X3NnLCBzcmNfc2csCisJCQkJICAgICAgYXV0aF90b2stPnNlc3Npb25fa2V5LmVuY3J5cHRlZF9rZXlfc2l6ZSk7CisJaWYgKHJjKSB7CisJCXByaW50ayhLRVJOX0VSUiAiRXJyb3IgZGVjcnlwdGluZzsgcmMgPSBbJWRdXG4iLCByYyk7CisJCWdvdG8gb3V0X2ZyZWVfbWVtb3J5OworCX0KIAlhdXRoX3Rvay0+c2Vzc2lvbl9rZXkuZGVjcnlwdGVkX2tleV9zaXplID0KIAkgICAgYXV0aF90b2stPnNlc3Npb25fa2V5LmVuY3J5cHRlZF9rZXlfc2l6ZTsKIAltZW1jcHkoYXV0aF90b2stPnNlc3Npb25fa2V5LmRlY3J5cHRlZF9rZXksIHNlc3Npb25fa2V5LApAQCAtNTQ2LDYgKzU1OCw3IEBACiAJaWYgKGVjcnlwdGZzX3ZlcmJvc2l0eSA+IDApCiAJCWVjcnlwdGZzX2R1bXBfaGV4KGNyeXB0X3N0YXQtPmtleSwKIAkJCQkgIGNyeXB0X3N0YXQtPmtleV9zaXplKTsKK291dF9mcmVlX21lbW9yeToKIAltZW1zZXQoZW5jcnlwdGVkX3Nlc3Npb25fa2V5LCAwLCBQQUdFX0NBQ0hFX1NJWkUpOwogCWZyZWVfcGFnZSgodW5zaWduZWQgbG9uZyllbmNyeXB0ZWRfc2Vzc2lvbl9rZXkpOwogCW1lbXNldChzZXNzaW9uX2tleSwgMCwgUEFHRV9DQUNIRV9TSVpFKTsKQEAgLTU1NCw3ICs1NjcsNyBAQAogCWlmICh0Zm1fbXV0ZXgpCiAJCW11dGV4X3VubG9jayh0Zm1fbXV0ZXgpOwogCWVsc2UKLQkJY3J5cHRvX2ZyZWVfdGZtKHRmbSk7CisJCWNyeXB0b19mcmVlX2Jsa2NpcGhlcihkZXNjLnRmbSk7CiBvdXQ6CiAJcmV0dXJuIHJjOwogfQpAQCAtODAzLDE5ICs4MTYsMjEgQEAKIAkJICAgc3RydWN0IGVjcnlwdGZzX2NyeXB0X3N0YXQgKmNyeXB0X3N0YXQsCiAJCSAgIHN0cnVjdCBlY3J5cHRmc19rZXlfcmVjb3JkICprZXlfcmVjLCBzaXplX3QgKnBhY2tldF9zaXplKQogewotCWludCByYyA9IDA7Ci0KIAlzaXplX3QgaTsKIAlzaXplX3Qgc2lnbmF0dXJlX2lzX3ZhbGlkID0gMDsKIAlzaXplX3QgZW5jcnlwdGVkX3Nlc3Npb25fa2V5X3ZhbGlkID0gMDsKIAljaGFyIHNlc3Npb25fa2V5X2VuY3J5cHRpb25fa2V5W0VDUllQVEZTX01BWF9LRVlfQllURVNdOwogCXN0cnVjdCBzY2F0dGVybGlzdCBkZXN0X3NnWzJdOwogCXN0cnVjdCBzY2F0dGVybGlzdCBzcmNfc2dbMl07Ci0Jc3RydWN0IGNyeXB0b190Zm0gKnRmbSA9IE5VTEw7CiAJc3RydWN0IG11dGV4ICp0Zm1fbXV0ZXggPSBOVUxMOwogCXNpemVfdCBrZXlfcmVjX3NpemU7CiAJc2l6ZV90IHBhY2tldF9zaXplX2xlbmd0aDsKIAlzaXplX3QgY2lwaGVyX2NvZGU7CisJc3RydWN0IGJsa2NpcGhlcl9kZXNjIGRlc2MgPSB7CisJCS50Zm0gPSBOVUxMLAorCQkuZmxhZ3MgPSBDUllQVE9fVEZNX1JFUV9NQVlfU0xFRVAKKwl9OworCWludCByYyA9IDA7CiAKIAkoKnBhY2tldF9zaXplKSA9IDA7CiAJLyogQ2hlY2sgZm9yIGEgdmFsaWQgc2lnbmF0dXJlIG9uIHRoZSBhdXRoX3RvayAqLwpAQCAtODgyLDMzICs4OTcsNDggQEAKIAlpZiAoIXN0cmNtcChjcnlwdF9zdGF0LT5jaXBoZXIsCiAJCSAgICBjcnlwdF9zdGF0LT5tb3VudF9jcnlwdF9zdGF0LT5nbG9iYWxfZGVmYXVsdF9jaXBoZXJfbmFtZSkKIAkgICAgJiYgY3J5cHRfc3RhdC0+bW91bnRfY3J5cHRfc3RhdC0+Z2xvYmFsX2tleV90Zm0pIHsKLQkJdGZtID0gY3J5cHRfc3RhdC0+bW91bnRfY3J5cHRfc3RhdC0+Z2xvYmFsX2tleV90Zm07CisJCWRlc2MudGZtID0gY3J5cHRfc3RhdC0+bW91bnRfY3J5cHRfc3RhdC0+Z2xvYmFsX2tleV90Zm07CiAJCXRmbV9tdXRleCA9ICZjcnlwdF9zdGF0LT5tb3VudF9jcnlwdF9zdGF0LT5nbG9iYWxfa2V5X3RmbV9tdXRleDsKLQl9IGVsc2UKLQkJdGZtID0gY3J5cHRvX2FsbG9jX3RmbShjcnlwdF9zdGF0LT5jaXBoZXIsIDApOwotCWlmICghdGZtKSB7Ci0JCWVjcnlwdGZzX3ByaW50ayhLRVJOX0VSUiwgIkNvdWxkIG5vdCBpbml0aWFsaXplIGNyeXB0byAiCi0JCQkJImNvbnRleHQgZm9yIGNpcGhlciBbJXNdXG4iLAotCQkJCWNyeXB0X3N0YXQtPmNpcGhlcik7Ci0JCXJjID0gLUVJTlZBTDsKLQkJZ290byBvdXQ7CisJfSBlbHNlIHsKKwkJY2hhciAqZnVsbF9hbGdfbmFtZTsKKworCQlyYyA9IGVjcnlwdGZzX2NyeXB0b19hcGlfYWxnaWZ5X2NpcGhlcl9uYW1lKCZmdWxsX2FsZ19uYW1lLAorCQkJCQkJCSAgICBjcnlwdF9zdGF0LT5jaXBoZXIsCisJCQkJCQkJICAgICJlY2IiKTsKKwkJaWYgKHJjKQorCQkJZ290byBvdXQ7CisJCWRlc2MudGZtID0gY3J5cHRvX2FsbG9jX2Jsa2NpcGhlcihmdWxsX2FsZ19uYW1lLCAwLAorCQkJCQkJICBDUllQVE9fQUxHX0FTWU5DKTsKKwkJa2ZyZWUoZnVsbF9hbGdfbmFtZSk7CisJCWlmIChJU19FUlIoZGVzYy50Zm0pKSB7CisJCQlyYyA9IFBUUl9FUlIoZGVzYy50Zm0pOworCQkJZWNyeXB0ZnNfcHJpbnRrKEtFUk5fRVJSLCAiQ291bGQgbm90IGluaXRpYWxpemUgY3J5cHRvICIKKwkJCQkJImNvbnRleHQgZm9yIGNpcGhlciBbJXNdOyByYyA9IFslZF1cbiIsCisJCQkJCWNyeXB0X3N0YXQtPmNpcGhlciwgcmMpOworCQkJZ290byBvdXQ7CisJCX0KKwkJY3J5cHRvX2Jsa2NpcGhlcl9zZXRfZmxhZ3MoZGVzYy50Zm0sIENSWVBUT19URk1fUkVRX1dFQUtfS0VZKTsKIAl9CiAJaWYgKHRmbV9tdXRleCkKIAkJbXV0ZXhfbG9jayh0Zm1fbXV0ZXgpOwotCXJjID0gY3J5cHRvX2NpcGhlcl9zZXRrZXkodGZtLCBzZXNzaW9uX2tleV9lbmNyeXB0aW9uX2tleSwKLQkJCQkgIGNyeXB0X3N0YXQtPmtleV9zaXplKTsKKwlyYyA9IGNyeXB0b19ibGtjaXBoZXJfc2V0a2V5KGRlc2MudGZtLCBzZXNzaW9uX2tleV9lbmNyeXB0aW9uX2tleSwKKwkJCQkgICAgIGNyeXB0X3N0YXQtPmtleV9zaXplKTsKIAlpZiAocmMgPCAwKSB7CiAJCWlmICh0Zm1fbXV0ZXgpCiAJCQltdXRleF91bmxvY2sodGZtX211dGV4KTsKIAkJZWNyeXB0ZnNfcHJpbnRrKEtFUk5fRVJSLCAiRXJyb3Igc2V0dGluZyBrZXkgZm9yIGNyeXB0byAiCi0JCQkJImNvbnRleHRcbiIpOworCQkJCSJjb250ZXh0OyByYyA9IFslZF1cbiIsIHJjKTsKIAkJZ290byBvdXQ7CiAJfQogCXJjID0gMDsKIAllY3J5cHRmc19wcmludGsoS0VSTl9ERUJVRywgIkVuY3J5cHRpbmcgWyVkXSBieXRlcyBvZiB0aGUga2V5XG4iLAogCQkJY3J5cHRfc3RhdC0+a2V5X3NpemUpOwotCWNyeXB0b19jaXBoZXJfZW5jcnlwdCh0Zm0sIGRlc3Rfc2csIHNyY19zZywKLQkJCSAgICAgICgqa2V5X3JlYykuZW5jX2tleV9zaXplKTsKKwlyYyA9IGNyeXB0b19ibGtjaXBoZXJfZW5jcnlwdCgmZGVzYywgZGVzdF9zZywgc3JjX3NnLAorCQkJCSAgICAgICgqa2V5X3JlYykuZW5jX2tleV9zaXplKTsKKwlpZiAocmMpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJFcnJvciBlbmNyeXB0aW5nOyByYyA9IFslZF1cbiIsIHJjKTsKKwkJZ290byBvdXQ7CisJfQogCWlmICh0Zm1fbXV0ZXgpCiAJCW11dGV4X3VubG9jayh0Zm1fbXV0ZXgpOwogCWVjcnlwdGZzX3ByaW50ayhLRVJOX0RFQlVHLCAiVGhpcyBzaG91bGQgYmUgdGhlIGVuY3J5cHRlZCBrZXk6XG4iKTsKQEAgLTk3MSw4ICsxMDAxLDggQEAKIAkgICAgICAgKCprZXlfcmVjKS5lbmNfa2V5X3NpemUpOwogCSgqcGFja2V0X3NpemUpICs9ICgqa2V5X3JlYykuZW5jX2tleV9zaXplOwogb3V0OgotCWlmICh0Zm0gJiYgIXRmbV9tdXRleCkKLQkJY3J5cHRvX2ZyZWVfdGZtKHRmbSk7CisJaWYgKGRlc2MudGZtICYmICF0Zm1fbXV0ZXgpCisJCWNyeXB0b19mcmVlX2Jsa2NpcGhlcihkZXNjLnRmbSk7CiAJaWYgKHJjKQogCQkoKnBhY2tldF9zaXplKSA9IDA7CiAJcmV0dXJuIHJjOwpkaWZmIC0tZ2l0IGEvZnMvZWNyeXB0ZnMvbWFpbi5jIGIvZnMvZWNyeXB0ZnMvbWFpbi5jCmluZGV4IDdhMTFiOGEuLmE3OGQ4N2QgMTAwNjQ0Ci0tLSBhL2ZzL2VjcnlwdGZzL21haW4uYworKysgYi9mcy9lY3J5cHRmcy9tYWluLmMKQEAgLTEwNCwxMCArMTA0LDcgQEAKIAkJaW5vZGUtPmlfb3AgPSAmZWNyeXB0ZnNfZGlyX2lvcHM7CiAJaWYgKFNfSVNESVIobG93ZXJfaW5vZGUtPmlfbW9kZSkpCiAJCWlub2RlLT5pX2ZvcCA9ICZlY3J5cHRmc19kaXJfZm9wczsKLQkvKiBUT0RPOiBJcyB0aGVyZSBhIGJldHRlciB3YXkgdG8gaWRlbnRpZnkgaWYgdGhlIGlub2RlIGlzCi0JICogc3BlY2lhbD8gKi8KLQlpZiAoU19JU0JMSyhsb3dlcl9pbm9kZS0+aV9tb2RlKSB8fCBTX0lTQ0hSKGxvd2VyX2lub2RlLT5pX21vZGUpIHx8Ci0JICAgIFNfSVNGSUZPKGxvd2VyX2lub2RlLT5pX21vZGUpIHx8IFNfSVNTT0NLKGxvd2VyX2lub2RlLT5pX21vZGUpKQorCWlmIChzcGVjaWFsX2ZpbGUobG93ZXJfaW5vZGUtPmlfbW9kZSkpCiAJCWluaXRfc3BlY2lhbF9pbm9kZShpbm9kZSwgbG93ZXJfaW5vZGUtPmlfbW9kZSwKIAkJCQkgICBsb3dlcl9pbm9kZS0+aV9yZGV2KTsKIAlkZW50cnktPmRfb3AgPSAmZWNyeXB0ZnNfZG9wczsKQEAgLTIxMSw3ICsyMDgsNiBAQAogCWNoYXIgKmNpcGhlcl9uYW1lX2RzdDsKIAljaGFyICpjaXBoZXJfbmFtZV9zcmM7CiAJY2hhciAqY2lwaGVyX2tleV9ieXRlc19zcmM7Ci0Jc3RydWN0IGNyeXB0b190Zm0gKnRtcF90Zm07CiAJaW50IGNpcGhlcl9uYW1lX2xlbjsKIAogCWlmICghb3B0aW9ucykgewpAQCAtMzA4LDI1ICszMDQsMTkgQEAKIAkJICAgID0gJ1wwJzsKIAl9CiAJaWYgKCFjaXBoZXJfa2V5X2J5dGVzX3NldCkgewotCQltb3VudF9jcnlwdF9zdGF0LT5nbG9iYWxfZGVmYXVsdF9jaXBoZXJfa2V5X3NpemUgPQotCQkJRUNSWVBURlNfREVGQVVMVF9LRVlfQllURVM7Ci0JCWVjcnlwdGZzX3ByaW50ayhLRVJOX0RFQlVHLCAiQ2lwaGVyIGtleSBzaXplIHdhcyBub3QgIgotCQkJCSJzcGVjaWZpZWQuICBEZWZhdWx0aW5nIHRvIFslZF1cbiIsCi0JCQkJbW91bnRfY3J5cHRfc3RhdC0+Ci0JCQkJZ2xvYmFsX2RlZmF1bHRfY2lwaGVyX2tleV9zaXplKTsKKwkJbW91bnRfY3J5cHRfc3RhdC0+Z2xvYmFsX2RlZmF1bHRfY2lwaGVyX2tleV9zaXplID0gMDsKIAl9CiAJcmMgPSBlY3J5cHRmc19wcm9jZXNzX2NpcGhlcigKLQkJJnRtcF90Zm0sCiAJCSZtb3VudF9jcnlwdF9zdGF0LT5nbG9iYWxfa2V5X3RmbSwKIAkJbW91bnRfY3J5cHRfc3RhdC0+Z2xvYmFsX2RlZmF1bHRfY2lwaGVyX25hbWUsCi0JCW1vdW50X2NyeXB0X3N0YXQtPmdsb2JhbF9kZWZhdWx0X2NpcGhlcl9rZXlfc2l6ZSk7Ci0JaWYgKHRtcF90Zm0pCi0JCWNyeXB0b19mcmVlX3RmbSh0bXBfdGZtKTsKKwkJJm1vdW50X2NyeXB0X3N0YXQtPmdsb2JhbF9kZWZhdWx0X2NpcGhlcl9rZXlfc2l6ZSk7CiAJaWYgKHJjKSB7CiAJCXByaW50ayhLRVJOX0VSUiAiRXJyb3IgYXR0ZW1wdGluZyB0byBpbml0aWFsaXplIGNpcGhlciBbJXNdICIKIAkJICAgICAgICJ3aXRoIGtleSBzaXplIFslWmRdIGJ5dGVzOyByYyA9IFslZF1cbiIsCiAJCSAgICAgICBtb3VudF9jcnlwdF9zdGF0LT5nbG9iYWxfZGVmYXVsdF9jaXBoZXJfbmFtZSwKIAkJICAgICAgIG1vdW50X2NyeXB0X3N0YXQtPmdsb2JhbF9kZWZhdWx0X2NpcGhlcl9rZXlfc2l6ZSwgcmMpOworCQltb3VudF9jcnlwdF9zdGF0LT5nbG9iYWxfa2V5X3RmbSA9IE5VTEw7CisJCW1vdW50X2NyeXB0X3N0YXQtPmdsb2JhbF9hdXRoX3Rva19rZXkgPSBOVUxMOwogCQlyYyA9IC1FSU5WQUw7CiAJCWdvdG8gb3V0OwogCX0KZGlmZiAtLWdpdCBhL2ZzL2VjcnlwdGZzL3N1cGVyLmMgYi9mcy9lY3J5cHRmcy9zdXBlci5jCmluZGV4IGMzMzdjMDQuLjgyNTc1N2EgMTAwNjQ0Ci0tLSBhL2ZzL2VjcnlwdGZzL3N1cGVyLmMKKysrIGIvZnMvZWNyeXB0ZnMvc3VwZXIuYwpAQCAtMTM4LDIzICsxMzgsNiBAQAogfQogCiAvKioKLSAqIGVjcnlwdGZzX3Vtb3VudF9iZWdpbgotICoKLSAqIENhbGxlZCBpbiBkb191bW91bnQoKS4KLSAqLwotc3RhdGljIHZvaWQgZWNyeXB0ZnNfdW1vdW50X2JlZ2luKHN0cnVjdCB2ZnNtb3VudCAqdmZzbW50LCBpbnQgZmxhZ3MpCi17Ci0Jc3RydWN0IHZmc21vdW50ICpsb3dlcl9tbnQgPQotCQllY3J5cHRmc19kZW50cnlfdG9fbG93ZXJfbW50KHZmc21udC0+bW50X3NiLT5zX3Jvb3QpOwotCXN0cnVjdCBzdXBlcl9ibG9jayAqbG93ZXJfc2I7Ci0KLQltbnRwdXQobG93ZXJfbW50KTsKLQlsb3dlcl9zYiA9IGxvd2VyX21udC0+bW50X3NiOwotCWlmIChsb3dlcl9zYi0+c19vcC0+dW1vdW50X2JlZ2luKQotCQlsb3dlcl9zYi0+c19vcC0+dW1vdW50X2JlZ2luKGxvd2VyX21udCwgZmxhZ3MpOwotfQotCi0vKioKICAqIGVjcnlwdGZzX3Nob3dfb3B0aW9ucwogICoKICAqIFByaW50cyB0aGUgZGlyZWN0b3J5IHdlIGFyZSBjdXJyZW50bHkgbW91bnRlZCBvdmVyLgpAQCAtMTkzLDYgKzE3Niw1IEBACiAJLnN0YXRmcyA9IGVjcnlwdGZzX3N0YXRmcywKIAkucmVtb3VudF9mcyA9IE5VTEwsCiAJLmNsZWFyX2lub2RlID0gZWNyeXB0ZnNfY2xlYXJfaW5vZGUsCi0JLnVtb3VudF9iZWdpbiA9IGVjcnlwdGZzX3Vtb3VudF9iZWdpbiwKIAkuc2hvd19vcHRpb25zID0gZWNyeXB0ZnNfc2hvd19vcHRpb25zCiB9OwpkaWZmIC0tZ2l0IGEvZnMvZXZlbnRwb2xsLmMgYi9mcy9ldmVudHBvbGwuYwppbmRleCA1NTdkNWI2Li5hZTIyOGVjIDEwMDY0NAotLS0gYS9mcy9ldmVudHBvbGwuYworKysgYi9mcy9ldmVudHBvbGwuYwpAQCAtMTA1LDYgKzEwNSw4IEBACiAvKiBNYXhpbXVtIG1zZWMgdGltZW91dCB2YWx1ZSBzdG9yZWFibGUgaW4gYSBsb25nIGludCAqLwogI2RlZmluZSBFUF9NQVhfTVNUSU1FTyBtaW4oMTAwMFVMTCAqIE1BWF9TQ0hFRFVMRV9USU1FT1VUIC8gSFosIChMT05HX01BWCAtIDk5OVVMTCkgLyBIWikKIAorI2RlZmluZSBFUF9NQVhfRVZFTlRTIChJTlRfTUFYIC8gc2l6ZW9mKHN0cnVjdCBlcG9sbF9ldmVudCkpCisKIAogc3RydWN0IGVwb2xsX2ZpbGVmZCB7CiAJc3RydWN0IGZpbGUgKmZpbGU7CkBAIC00OTcsNyArNDk5LDcgQEAKICAqLwogYXNtbGlua2FnZSBsb25nIHN5c19lcG9sbF9jcmVhdGUoaW50IHNpemUpCiB7Ci0JaW50IGVycm9yLCBmZDsKKwlpbnQgZXJyb3IsIGZkID0gLTE7CiAJc3RydWN0IGV2ZW50cG9sbCAqZXA7CiAJc3RydWN0IGlub2RlICppbm9kZTsKIAlzdHJ1Y3QgZmlsZSAqZmlsZTsKQEAgLTY0MCw3ICs2NDIsNiBAQAogCXJldHVybiBlcnJvcjsKIH0KIAotI2RlZmluZSBNQVhfRVZFTlRTIChJTlRfTUFYIC8gc2l6ZW9mKHN0cnVjdCBlcG9sbF9ldmVudCkpCiAKIC8qCiAgKiBJbXBsZW1lbnQgdGhlIGV2ZW50IHdhaXQgaW50ZXJmYWNlIGZvciB0aGUgZXZlbnRwb2xsIGZpbGUuIEl0IGlzIHRoZSBrZXJuZWwKQEAgLTY1Nyw3ICs2NTgsNyBAQAogCQkgICAgIGN1cnJlbnQsIGVwZmQsIGV2ZW50cywgbWF4ZXZlbnRzLCB0aW1lb3V0KSk7CiAKIAkvKiBUaGUgbWF4aW11bSBudW1iZXIgb2YgZXZlbnQgbXVzdCBiZSBncmVhdGVyIHRoYW4gemVybyAqLwotCWlmIChtYXhldmVudHMgPD0gMCB8fCBtYXhldmVudHMgPiBNQVhfRVZFTlRTKQorCWlmIChtYXhldmVudHMgPD0gMCB8fCBtYXhldmVudHMgPiBFUF9NQVhfRVZFTlRTKQogCQlyZXR1cm4gLUVJTlZBTDsKIAogCS8qIFZlcmlmeSB0aGF0IHRoZSBhcmVhIHBhc3NlZCBieSB0aGUgdXNlciBpcyB3cml0ZWFibGUgKi8KQEAgLTY5OSw2ICs3MDAsNTUgQEAKIH0KIAogCisjaWZkZWYgVElGX1JFU1RPUkVfU0lHTUFTSworCisvKgorICogSW1wbGVtZW50IHRoZSBldmVudCB3YWl0IGludGVyZmFjZSBmb3IgdGhlIGV2ZW50cG9sbCBmaWxlLiBJdCBpcyB0aGUga2VybmVsCisgKiBwYXJ0IG9mIHRoZSB1c2VyIHNwYWNlIGVwb2xsX3B3YWl0KDIpLgorICovCithc21saW5rYWdlIGxvbmcgc3lzX2Vwb2xsX3B3YWl0KGludCBlcGZkLCBzdHJ1Y3QgZXBvbGxfZXZlbnQgX191c2VyICpldmVudHMsCisJCWludCBtYXhldmVudHMsIGludCB0aW1lb3V0LCBjb25zdCBzaWdzZXRfdCBfX3VzZXIgKnNpZ21hc2ssCisJCXNpemVfdCBzaWdzZXRzaXplKQoreworCWludCBlcnJvcjsKKwlzaWdzZXRfdCBrc2lnbWFzaywgc2lnc2F2ZWQ7CisKKwkvKgorCSAqIElmIHRoZSBjYWxsZXIgd2FudHMgYSBjZXJ0YWluIHNpZ25hbCBtYXNrIHRvIGJlIHNldCBkdXJpbmcgdGhlIHdhaXQsCisJICogd2UgYXBwbHkgaXQgaGVyZS4KKwkgKi8KKwlpZiAoc2lnbWFzaykgeworCQlpZiAoc2lnc2V0c2l6ZSAhPSBzaXplb2Yoc2lnc2V0X3QpKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCWlmIChjb3B5X2Zyb21fdXNlcigma3NpZ21hc2ssIHNpZ21hc2ssIHNpemVvZihrc2lnbWFzaykpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCXNpZ2RlbHNldG1hc2soJmtzaWdtYXNrLCBzaWdtYXNrKFNJR0tJTEwpIHwgc2lnbWFzayhTSUdTVE9QKSk7CisJCXNpZ3Byb2NtYXNrKFNJR19TRVRNQVNLLCAma3NpZ21hc2ssICZzaWdzYXZlZCk7CisJfQorCisJZXJyb3IgPSBzeXNfZXBvbGxfd2FpdChlcGZkLCBldmVudHMsIG1heGV2ZW50cywgdGltZW91dCk7CisKKwkvKgorCSAqIElmIHdlIGNoYW5nZWQgdGhlIHNpZ25hbCBtYXNrLCB3ZSBuZWVkIHRvIHJlc3RvcmUgdGhlIG9yaWdpbmFsIG9uZS4KKwkgKiBJbiBjYXNlIHdlJ3ZlIGdvdCBhIHNpZ25hbCB3aGlsZSB3YWl0aW5nLCB3ZSBkbyBub3QgcmVzdG9yZSB0aGUKKwkgKiBzaWduYWwgbWFzayB5ZXQsIGFuZCB3ZSBhbGxvdyBkb19zaWduYWwoKSB0byBkZWxpdmVyIHRoZSBzaWduYWwgb24KKwkgKiB0aGUgd2F5IGJhY2sgdG8gdXNlcnNwYWNlLCBiZWZvcmUgdGhlIHNpZ25hbCBtYXNrIGlzIHJlc3RvcmVkLgorCSAqLworCWlmIChzaWdtYXNrKSB7CisJCWlmIChlcnJvciA9PSAtRUlOVFIpIHsKKwkJCW1lbWNweSgmY3VycmVudC0+c2F2ZWRfc2lnbWFzaywgJnNpZ3NhdmVkLAorCQkJCXNpemVvZihzaWdzYXZlZCkpOworCQkJc2V0X3RocmVhZF9mbGFnKFRJRl9SRVNUT1JFX1NJR01BU0spOworCQl9IGVsc2UKKwkJCXNpZ3Byb2NtYXNrKFNJR19TRVRNQVNLLCAmc2lnc2F2ZWQsIE5VTEwpOworCX0KKworCXJldHVybiBlcnJvcjsKK30KKworI2VuZGlmIC8qICNpZmRlZiBUSUZfUkVTVE9SRV9TSUdNQVNLICovCisKKwogLyoKICAqIENyZWF0ZXMgdGhlIGZpbGUgZGVzY3JpcHRvciB0byBiZSB1c2VkIGJ5IHRoZSBlcG9sbCBpbnRlcmZhY2UuCiAgKi8KZGlmZiAtLWdpdCBhL2ZzL2V4dDIvc3VwZXIuYyBiL2ZzL2V4dDIvc3VwZXIuYwppbmRleCA1MTNjZDQyLi5kOGI5YWJkIDEwMDY0NAotLS0gYS9mcy9leHQyL3N1cGVyLmMKKysrIGIvZnMvZXh0Mi9zdXBlci5jCkBAIC0zNjQsNyArMzY0LDYgQEAKIHsKIAljaGFyICogcDsKIAlzdWJzdHJpbmdfdCBhcmdzW01BWF9PUFRfQVJHU107Ci0JdW5zaWduZWQgbG9uZyBraW5kID0gRVhUMl9NT1VOVF9FUlJPUlNfQ09OVDsKIAlpbnQgb3B0aW9uOwogCiAJaWYgKCFvcHRpb25zKQpAQCAtNDA0LDEzICs0MDMsMTkgQEAKIAkJCS8qICpzYl9ibG9jayA9IG1hdGNoX2ludCgmYXJnc1swXSk7ICovCiAJCQlicmVhazsKIAkJY2FzZSBPcHRfZXJyX3BhbmljOgotCQkJa2luZCA9IEVYVDJfTU9VTlRfRVJST1JTX1BBTklDOworCQkJY2xlYXJfb3B0IChzYmktPnNfbW91bnRfb3B0LCBFUlJPUlNfQ09OVCk7CisJCQljbGVhcl9vcHQgKHNiaS0+c19tb3VudF9vcHQsIEVSUk9SU19STyk7CisJCQlzZXRfb3B0IChzYmktPnNfbW91bnRfb3B0LCBFUlJPUlNfUEFOSUMpOwogCQkJYnJlYWs7CiAJCWNhc2UgT3B0X2Vycl9ybzoKLQkJCWtpbmQgPSBFWFQyX01PVU5UX0VSUk9SU19STzsKKwkJCWNsZWFyX29wdCAoc2JpLT5zX21vdW50X29wdCwgRVJST1JTX0NPTlQpOworCQkJY2xlYXJfb3B0IChzYmktPnNfbW91bnRfb3B0LCBFUlJPUlNfUEFOSUMpOworCQkJc2V0X29wdCAoc2JpLT5zX21vdW50X29wdCwgRVJST1JTX1JPKTsKIAkJCWJyZWFrOwogCQljYXNlIE9wdF9lcnJfY29udDoKLQkJCWtpbmQgPSBFWFQyX01PVU5UX0VSUk9SU19DT05UOworCQkJY2xlYXJfb3B0IChzYmktPnNfbW91bnRfb3B0LCBFUlJPUlNfUk8pOworCQkJY2xlYXJfb3B0IChzYmktPnNfbW91bnRfb3B0LCBFUlJPUlNfUEFOSUMpOworCQkJc2V0X29wdCAoc2JpLT5zX21vdW50X29wdCwgRVJST1JTX0NPTlQpOwogCQkJYnJlYWs7CiAJCWNhc2UgT3B0X25vdWlkMzI6CiAJCQlzZXRfb3B0IChzYmktPnNfbW91bnRfb3B0LCBOT19VSUQzMik7CkBAIC00ODksNyArNDk0LDYgQEAKIAkJCXJldHVybiAwOwogCQl9CiAJfQotCXNiaS0+c19tb3VudF9vcHQgfD0ga2luZDsKIAlyZXR1cm4gMTsKIH0KIApAQCAtNzE1LDYgKzcxOSw4IEBACiAJCXNldF9vcHQoc2JpLT5zX21vdW50X29wdCwgRVJST1JTX1BBTklDKTsKIAllbHNlIGlmIChsZTE2X3RvX2NwdShzYmktPnNfZXMtPnNfZXJyb3JzKSA9PSBFWFQyX0VSUk9SU19STykKIAkJc2V0X29wdChzYmktPnNfbW91bnRfb3B0LCBFUlJPUlNfUk8pOworCWVsc2UKKwkJc2V0X29wdChzYmktPnNfbW91bnRfb3B0LCBFUlJPUlNfQ09OVCk7CiAKIAlzYmktPnNfcmVzdWlkID0gbGUxNl90b19jcHUoZXMtPnNfZGVmX3Jlc3VpZCk7CiAJc2JpLT5zX3Jlc2dpZCA9IGxlMTZfdG9fY3B1KGVzLT5zX2RlZl9yZXNnaWQpOwpkaWZmIC0tZ2l0IGEvZnMvZXh0My9zdXBlci5jIGIvZnMvZXh0My9zdXBlci5jCmluZGV4IDhiZmQ1NmUuLmFmYzJkNGYgMTAwNjQ0Ci0tLSBhL2ZzL2V4dDMvc3VwZXIuYworKysgYi9mcy9leHQzL3N1cGVyLmMKQEAgLTE0NzAsNiArMTQ3MCw4IEBACiAJCXNldF9vcHQoc2JpLT5zX21vdW50X29wdCwgRVJST1JTX1BBTklDKTsKIAllbHNlIGlmIChsZTE2X3RvX2NwdShzYmktPnNfZXMtPnNfZXJyb3JzKSA9PSBFWFQzX0VSUk9SU19STykKIAkJc2V0X29wdChzYmktPnNfbW91bnRfb3B0LCBFUlJPUlNfUk8pOworCWVsc2UKKwkJc2V0X29wdChzYmktPnNfbW91bnRfb3B0LCBFUlJPUlNfQ09OVCk7CiAKIAlzYmktPnNfcmVzdWlkID0gbGUxNl90b19jcHUoZXMtPnNfZGVmX3Jlc3VpZCk7CiAJc2JpLT5zX3Jlc2dpZCA9IGxlMTZfdG9fY3B1KGVzLT5zX2RlZl9yZXNnaWQpOwpkaWZmIC0tZ2l0IGEvZnMvZXh0NC9NYWtlZmlsZSBiL2ZzL2V4dDQvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTZhY2I5NgotLS0gL2Rldi9udWxsCisrKyBiL2ZzL2V4dDQvTWFrZWZpbGUKQEAgLTAsMCArMSwxMiBAQAorIworIyBNYWtlZmlsZSBmb3IgdGhlIGxpbnV4IGV4dDQtZmlsZXN5c3RlbSByb3V0aW5lcy4KKyMKKworb2JqLSQoQ09ORklHX0VYVDRERVZfRlMpICs9IGV4dDRkZXYubworCitleHQ0ZGV2LXkJOj0gYmFsbG9jLm8gYml0bWFwLm8gZGlyLm8gZmlsZS5vIGZzeW5jLm8gaWFsbG9jLm8gaW5vZGUubyBcCisJICAgaW9jdGwubyBuYW1laS5vIHN1cGVyLm8gc3ltbGluay5vIGhhc2gubyByZXNpemUubyBleHRlbnRzLm8KKworZXh0NGRldi0kKENPTkZJR19FWFQ0REVWX0ZTX1hBVFRSKQkrPSB4YXR0ci5vIHhhdHRyX3VzZXIubyB4YXR0cl90cnVzdGVkLm8KK2V4dDRkZXYtJChDT05GSUdfRVhUNERFVl9GU19QT1NJWF9BQ0wpCSs9IGFjbC5vCitleHQ0ZGV2LSQoQ09ORklHX0VYVDRERVZfRlNfU0VDVVJJVFkpCSs9IHhhdHRyX3NlY3VyaXR5Lm8KZGlmZiAtLWdpdCBhL2ZzL2V4dDQvYWNsLmMgYi9mcy9leHQ0L2FjbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjllODgyNTQKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9leHQ0L2FjbC5jCkBAIC0wLDAgKzEsNTUxIEBACisvKgorICogbGludXgvZnMvZXh0NC9hY2wuYworICoKKyAqIENvcHlyaWdodCAoQykgMjAwMS0yMDAzIEFuZHJlYXMgR3J1ZW5iYWNoZXIsIDxhZ3J1ZW5Ac3VzZS5kZT4KKyAqLworCisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2NhcGFiaWxpdHkuaD4KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L2V4dDRfamJkMi5oPgorI2luY2x1ZGUgPGxpbnV4L2V4dDRfZnMuaD4KKyNpbmNsdWRlICJ4YXR0ci5oIgorI2luY2x1ZGUgImFjbC5oIgorCisvKgorICogQ29udmVydCBmcm9tIGZpbGVzeXN0ZW0gdG8gaW4tbWVtb3J5IHJlcHJlc2VudGF0aW9uLgorICovCitzdGF0aWMgc3RydWN0IHBvc2l4X2FjbCAqCitleHQ0X2FjbF9mcm9tX2Rpc2soY29uc3Qgdm9pZCAqdmFsdWUsIHNpemVfdCBzaXplKQoreworCWNvbnN0IGNoYXIgKmVuZCA9IChjaGFyICopdmFsdWUgKyBzaXplOworCWludCBuLCBjb3VudDsKKwlzdHJ1Y3QgcG9zaXhfYWNsICphY2w7CisKKwlpZiAoIXZhbHVlKQorCQlyZXR1cm4gTlVMTDsKKwlpZiAoc2l6ZSA8IHNpemVvZihleHQ0X2FjbF9oZWFkZXIpKQorCQkgcmV0dXJuIEVSUl9QVFIoLUVJTlZBTCk7CisJaWYgKCgoZXh0NF9hY2xfaGVhZGVyICopdmFsdWUpLT5hX3ZlcnNpb24gIT0KKwkgICAgY3B1X3RvX2xlMzIoRVhUNF9BQ0xfVkVSU0lPTikpCisJCXJldHVybiBFUlJfUFRSKC1FSU5WQUwpOworCXZhbHVlID0gKGNoYXIgKil2YWx1ZSArIHNpemVvZihleHQ0X2FjbF9oZWFkZXIpOworCWNvdW50ID0gZXh0NF9hY2xfY291bnQoc2l6ZSk7CisJaWYgKGNvdW50IDwgMCkKKwkJcmV0dXJuIEVSUl9QVFIoLUVJTlZBTCk7CisJaWYgKGNvdW50ID09IDApCisJCXJldHVybiBOVUxMOworCWFjbCA9IHBvc2l4X2FjbF9hbGxvYyhjb3VudCwgR0ZQX0tFUk5FTCk7CisJaWYgKCFhY2wpCisJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOworCWZvciAobj0wOyBuIDwgY291bnQ7IG4rKykgeworCQlleHQ0X2FjbF9lbnRyeSAqZW50cnkgPQorCQkJKGV4dDRfYWNsX2VudHJ5ICopdmFsdWU7CisJCWlmICgoY2hhciAqKXZhbHVlICsgc2l6ZW9mKGV4dDRfYWNsX2VudHJ5X3Nob3J0KSA+IGVuZCkKKwkJCWdvdG8gZmFpbDsKKwkJYWNsLT5hX2VudHJpZXNbbl0uZV90YWcgID0gbGUxNl90b19jcHUoZW50cnktPmVfdGFnKTsKKwkJYWNsLT5hX2VudHJpZXNbbl0uZV9wZXJtID0gbGUxNl90b19jcHUoZW50cnktPmVfcGVybSk7CisJCXN3aXRjaChhY2wtPmFfZW50cmllc1tuXS5lX3RhZykgeworCQkJY2FzZSBBQ0xfVVNFUl9PQko6CisJCQljYXNlIEFDTF9HUk9VUF9PQko6CisJCQljYXNlIEFDTF9NQVNLOgorCQkJY2FzZSBBQ0xfT1RIRVI6CisJCQkJdmFsdWUgPSAoY2hhciAqKXZhbHVlICsKKwkJCQkJc2l6ZW9mKGV4dDRfYWNsX2VudHJ5X3Nob3J0KTsKKwkJCQlhY2wtPmFfZW50cmllc1tuXS5lX2lkID0gQUNMX1VOREVGSU5FRF9JRDsKKwkJCQlicmVhazsKKworCQkJY2FzZSBBQ0xfVVNFUjoKKwkJCWNhc2UgQUNMX0dST1VQOgorCQkJCXZhbHVlID0gKGNoYXIgKil2YWx1ZSArIHNpemVvZihleHQ0X2FjbF9lbnRyeSk7CisJCQkJaWYgKChjaGFyICopdmFsdWUgPiBlbmQpCisJCQkJCWdvdG8gZmFpbDsKKwkJCQlhY2wtPmFfZW50cmllc1tuXS5lX2lkID0KKwkJCQkJbGUzMl90b19jcHUoZW50cnktPmVfaWQpOworCQkJCWJyZWFrOworCisJCQlkZWZhdWx0OgorCQkJCWdvdG8gZmFpbDsKKwkJfQorCX0KKwlpZiAodmFsdWUgIT0gZW5kKQorCQlnb3RvIGZhaWw7CisJcmV0dXJuIGFjbDsKKworZmFpbDoKKwlwb3NpeF9hY2xfcmVsZWFzZShhY2wpOworCXJldHVybiBFUlJfUFRSKC1FSU5WQUwpOworfQorCisvKgorICogQ29udmVydCBmcm9tIGluLW1lbW9yeSB0byBmaWxlc3lzdGVtIHJlcHJlc2VudGF0aW9uLgorICovCitzdGF0aWMgdm9pZCAqCitleHQ0X2FjbF90b19kaXNrKGNvbnN0IHN0cnVjdCBwb3NpeF9hY2wgKmFjbCwgc2l6ZV90ICpzaXplKQoreworCWV4dDRfYWNsX2hlYWRlciAqZXh0X2FjbDsKKwljaGFyICplOworCXNpemVfdCBuOworCisJKnNpemUgPSBleHQ0X2FjbF9zaXplKGFjbC0+YV9jb3VudCk7CisJZXh0X2FjbCA9IGttYWxsb2Moc2l6ZW9mKGV4dDRfYWNsX2hlYWRlcikgKyBhY2wtPmFfY291bnQgKgorCQkJc2l6ZW9mKGV4dDRfYWNsX2VudHJ5KSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFleHRfYWNsKQorCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKKwlleHRfYWNsLT5hX3ZlcnNpb24gPSBjcHVfdG9fbGUzMihFWFQ0X0FDTF9WRVJTSU9OKTsKKwllID0gKGNoYXIgKilleHRfYWNsICsgc2l6ZW9mKGV4dDRfYWNsX2hlYWRlcik7CisJZm9yIChuPTA7IG4gPCBhY2wtPmFfY291bnQ7IG4rKykgeworCQlleHQ0X2FjbF9lbnRyeSAqZW50cnkgPSAoZXh0NF9hY2xfZW50cnkgKillOworCQllbnRyeS0+ZV90YWcgID0gY3B1X3RvX2xlMTYoYWNsLT5hX2VudHJpZXNbbl0uZV90YWcpOworCQllbnRyeS0+ZV9wZXJtID0gY3B1X3RvX2xlMTYoYWNsLT5hX2VudHJpZXNbbl0uZV9wZXJtKTsKKwkJc3dpdGNoKGFjbC0+YV9lbnRyaWVzW25dLmVfdGFnKSB7CisJCQljYXNlIEFDTF9VU0VSOgorCQkJY2FzZSBBQ0xfR1JPVVA6CisJCQkJZW50cnktPmVfaWQgPQorCQkJCQljcHVfdG9fbGUzMihhY2wtPmFfZW50cmllc1tuXS5lX2lkKTsKKwkJCQllICs9IHNpemVvZihleHQ0X2FjbF9lbnRyeSk7CisJCQkJYnJlYWs7CisKKwkJCWNhc2UgQUNMX1VTRVJfT0JKOgorCQkJY2FzZSBBQ0xfR1JPVVBfT0JKOgorCQkJY2FzZSBBQ0xfTUFTSzoKKwkJCWNhc2UgQUNMX09USEVSOgorCQkJCWUgKz0gc2l6ZW9mKGV4dDRfYWNsX2VudHJ5X3Nob3J0KTsKKwkJCQlicmVhazsKKworCQkJZGVmYXVsdDoKKwkJCQlnb3RvIGZhaWw7CisJCX0KKwl9CisJcmV0dXJuIChjaGFyICopZXh0X2FjbDsKKworZmFpbDoKKwlrZnJlZShleHRfYWNsKTsKKwlyZXR1cm4gRVJSX1BUUigtRUlOVkFMKTsKK30KKworc3RhdGljIGlubGluZSBzdHJ1Y3QgcG9zaXhfYWNsICoKK2V4dDRfaWdldF9hY2woc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IHBvc2l4X2FjbCAqKmlfYWNsKQoreworCXN0cnVjdCBwb3NpeF9hY2wgKmFjbCA9IEVYVDRfQUNMX05PVF9DQUNIRUQ7CisKKwlzcGluX2xvY2soJmlub2RlLT5pX2xvY2spOworCWlmICgqaV9hY2wgIT0gRVhUNF9BQ0xfTk9UX0NBQ0hFRCkKKwkJYWNsID0gcG9zaXhfYWNsX2R1cCgqaV9hY2wpOworCXNwaW5fdW5sb2NrKCZpbm9kZS0+aV9sb2NrKTsKKworCXJldHVybiBhY2w7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZAorZXh0NF9pc2V0X2FjbChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgcG9zaXhfYWNsICoqaV9hY2wsCisJCXN0cnVjdCBwb3NpeF9hY2wgKmFjbCkKK3sKKwlzcGluX2xvY2soJmlub2RlLT5pX2xvY2spOworCWlmICgqaV9hY2wgIT0gRVhUNF9BQ0xfTk9UX0NBQ0hFRCkKKwkJcG9zaXhfYWNsX3JlbGVhc2UoKmlfYWNsKTsKKwkqaV9hY2wgPSBwb3NpeF9hY2xfZHVwKGFjbCk7CisJc3Bpbl91bmxvY2soJmlub2RlLT5pX2xvY2spOworfQorCisvKgorICogSW5vZGUgb3BlcmF0aW9uIGdldF9wb3NpeF9hY2woKS4KKyAqCisgKiBpbm9kZS0+aV9tdXRleDogZG9uJ3QgY2FyZQorICovCitzdGF0aWMgc3RydWN0IHBvc2l4X2FjbCAqCitleHQ0X2dldF9hY2woc3RydWN0IGlub2RlICppbm9kZSwgaW50IHR5cGUpCit7CisJc3RydWN0IGV4dDRfaW5vZGVfaW5mbyAqZWkgPSBFWFQ0X0koaW5vZGUpOworCWludCBuYW1lX2luZGV4OworCWNoYXIgKnZhbHVlID0gTlVMTDsKKwlzdHJ1Y3QgcG9zaXhfYWNsICphY2w7CisJaW50IHJldHZhbDsKKworCWlmICghdGVzdF9vcHQoaW5vZGUtPmlfc2IsIFBPU0lYX0FDTCkpCisJCXJldHVybiBOVUxMOworCisJc3dpdGNoKHR5cGUpIHsKKwkJY2FzZSBBQ0xfVFlQRV9BQ0NFU1M6CisJCQlhY2wgPSBleHQ0X2lnZXRfYWNsKGlub2RlLCAmZWktPmlfYWNsKTsKKwkJCWlmIChhY2wgIT0gRVhUNF9BQ0xfTk9UX0NBQ0hFRCkKKwkJCQlyZXR1cm4gYWNsOworCQkJbmFtZV9pbmRleCA9IEVYVDRfWEFUVFJfSU5ERVhfUE9TSVhfQUNMX0FDQ0VTUzsKKwkJCWJyZWFrOworCisJCWNhc2UgQUNMX1RZUEVfREVGQVVMVDoKKwkJCWFjbCA9IGV4dDRfaWdldF9hY2woaW5vZGUsICZlaS0+aV9kZWZhdWx0X2FjbCk7CisJCQlpZiAoYWNsICE9IEVYVDRfQUNMX05PVF9DQUNIRUQpCisJCQkJcmV0dXJuIGFjbDsKKwkJCW5hbWVfaW5kZXggPSBFWFQ0X1hBVFRSX0lOREVYX1BPU0lYX0FDTF9ERUZBVUxUOworCQkJYnJlYWs7CisKKwkJZGVmYXVsdDoKKwkJCXJldHVybiBFUlJfUFRSKC1FSU5WQUwpOworCX0KKwlyZXR2YWwgPSBleHQ0X3hhdHRyX2dldChpbm9kZSwgbmFtZV9pbmRleCwgIiIsIE5VTEwsIDApOworCWlmIChyZXR2YWwgPiAwKSB7CisJCXZhbHVlID0ga21hbGxvYyhyZXR2YWwsIEdGUF9LRVJORUwpOworCQlpZiAoIXZhbHVlKQorCQkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CisJCXJldHZhbCA9IGV4dDRfeGF0dHJfZ2V0KGlub2RlLCBuYW1lX2luZGV4LCAiIiwgdmFsdWUsIHJldHZhbCk7CisJfQorCWlmIChyZXR2YWwgPiAwKQorCQlhY2wgPSBleHQ0X2FjbF9mcm9tX2Rpc2sodmFsdWUsIHJldHZhbCk7CisJZWxzZSBpZiAocmV0dmFsID09IC1FTk9EQVRBIHx8IHJldHZhbCA9PSAtRU5PU1lTKQorCQlhY2wgPSBOVUxMOworCWVsc2UKKwkJYWNsID0gRVJSX1BUUihyZXR2YWwpOworCWtmcmVlKHZhbHVlKTsKKworCWlmICghSVNfRVJSKGFjbCkpIHsKKwkJc3dpdGNoKHR5cGUpIHsKKwkJCWNhc2UgQUNMX1RZUEVfQUNDRVNTOgorCQkJCWV4dDRfaXNldF9hY2woaW5vZGUsICZlaS0+aV9hY2wsIGFjbCk7CisJCQkJYnJlYWs7CisKKwkJCWNhc2UgQUNMX1RZUEVfREVGQVVMVDoKKwkJCQlleHQ0X2lzZXRfYWNsKGlub2RlLCAmZWktPmlfZGVmYXVsdF9hY2wsIGFjbCk7CisJCQkJYnJlYWs7CisJCX0KKwl9CisJcmV0dXJuIGFjbDsKK30KKworLyoKKyAqIFNldCB0aGUgYWNjZXNzIG9yIGRlZmF1bHQgQUNMIG9mIGFuIGlub2RlLgorICoKKyAqIGlub2RlLT5pX211dGV4OiBkb3duIHVubGVzcyBjYWxsZWQgZnJvbSBleHQ0X25ld19pbm9kZQorICovCitzdGF0aWMgaW50CitleHQ0X3NldF9hY2woaGFuZGxlX3QgKmhhbmRsZSwgc3RydWN0IGlub2RlICppbm9kZSwgaW50IHR5cGUsCisJICAgICBzdHJ1Y3QgcG9zaXhfYWNsICphY2wpCit7CisJc3RydWN0IGV4dDRfaW5vZGVfaW5mbyAqZWkgPSBFWFQ0X0koaW5vZGUpOworCWludCBuYW1lX2luZGV4OworCXZvaWQgKnZhbHVlID0gTlVMTDsKKwlzaXplX3Qgc2l6ZSA9IDA7CisJaW50IGVycm9yOworCisJaWYgKFNfSVNMTksoaW5vZGUtPmlfbW9kZSkpCisJCXJldHVybiAtRU9QTk9UU1VQUDsKKworCXN3aXRjaCh0eXBlKSB7CisJCWNhc2UgQUNMX1RZUEVfQUNDRVNTOgorCQkJbmFtZV9pbmRleCA9IEVYVDRfWEFUVFJfSU5ERVhfUE9TSVhfQUNMX0FDQ0VTUzsKKwkJCWlmIChhY2wpIHsKKwkJCQltb2RlX3QgbW9kZSA9IGlub2RlLT5pX21vZGU7CisJCQkJZXJyb3IgPSBwb3NpeF9hY2xfZXF1aXZfbW9kZShhY2wsICZtb2RlKTsKKwkJCQlpZiAoZXJyb3IgPCAwKQorCQkJCQlyZXR1cm4gZXJyb3I7CisJCQkJZWxzZSB7CisJCQkJCWlub2RlLT5pX21vZGUgPSBtb2RlOworCQkJCQlleHQ0X21hcmtfaW5vZGVfZGlydHkoaGFuZGxlLCBpbm9kZSk7CisJCQkJCWlmIChlcnJvciA9PSAwKQorCQkJCQkJYWNsID0gTlVMTDsKKwkJCQl9CisJCQl9CisJCQlicmVhazsKKworCQljYXNlIEFDTF9UWVBFX0RFRkFVTFQ6CisJCQluYW1lX2luZGV4ID0gRVhUNF9YQVRUUl9JTkRFWF9QT1NJWF9BQ0xfREVGQVVMVDsKKwkJCWlmICghU19JU0RJUihpbm9kZS0+aV9tb2RlKSkKKwkJCQlyZXR1cm4gYWNsID8gLUVBQ0NFUyA6IDA7CisJCQlicmVhazsKKworCQlkZWZhdWx0OgorCQkJcmV0dXJuIC1FSU5WQUw7CisJfQorCWlmIChhY2wpIHsKKwkJdmFsdWUgPSBleHQ0X2FjbF90b19kaXNrKGFjbCwgJnNpemUpOworCQlpZiAoSVNfRVJSKHZhbHVlKSkKKwkJCXJldHVybiAoaW50KVBUUl9FUlIodmFsdWUpOworCX0KKworCWVycm9yID0gZXh0NF94YXR0cl9zZXRfaGFuZGxlKGhhbmRsZSwgaW5vZGUsIG5hbWVfaW5kZXgsICIiLAorCQkJCSAgICAgIHZhbHVlLCBzaXplLCAwKTsKKworCWtmcmVlKHZhbHVlKTsKKwlpZiAoIWVycm9yKSB7CisJCXN3aXRjaCh0eXBlKSB7CisJCQljYXNlIEFDTF9UWVBFX0FDQ0VTUzoKKwkJCQlleHQ0X2lzZXRfYWNsKGlub2RlLCAmZWktPmlfYWNsLCBhY2wpOworCQkJCWJyZWFrOworCisJCQljYXNlIEFDTF9UWVBFX0RFRkFVTFQ6CisJCQkJZXh0NF9pc2V0X2FjbChpbm9kZSwgJmVpLT5pX2RlZmF1bHRfYWNsLCBhY2wpOworCQkJCWJyZWFrOworCQl9CisJfQorCXJldHVybiBlcnJvcjsKK30KKworc3RhdGljIGludAorZXh0NF9jaGVja19hY2woc3RydWN0IGlub2RlICppbm9kZSwgaW50IG1hc2spCit7CisJc3RydWN0IHBvc2l4X2FjbCAqYWNsID0gZXh0NF9nZXRfYWNsKGlub2RlLCBBQ0xfVFlQRV9BQ0NFU1MpOworCisJaWYgKElTX0VSUihhY2wpKQorCQlyZXR1cm4gUFRSX0VSUihhY2wpOworCWlmIChhY2wpIHsKKwkJaW50IGVycm9yID0gcG9zaXhfYWNsX3Blcm1pc3Npb24oaW5vZGUsIGFjbCwgbWFzayk7CisJCXBvc2l4X2FjbF9yZWxlYXNlKGFjbCk7CisJCXJldHVybiBlcnJvcjsKKwl9CisKKwlyZXR1cm4gLUVBR0FJTjsKK30KKworaW50CitleHQ0X3Blcm1pc3Npb24oc3RydWN0IGlub2RlICppbm9kZSwgaW50IG1hc2ssIHN0cnVjdCBuYW1laWRhdGEgKm5kKQoreworCXJldHVybiBnZW5lcmljX3Blcm1pc3Npb24oaW5vZGUsIG1hc2ssIGV4dDRfY2hlY2tfYWNsKTsKK30KKworLyoKKyAqIEluaXRpYWxpemUgdGhlIEFDTHMgb2YgYSBuZXcgaW5vZGUuIENhbGxlZCBmcm9tIGV4dDRfbmV3X2lub2RlLgorICoKKyAqIGRpci0+aV9tdXRleDogZG93bgorICogaW5vZGUtPmlfbXV0ZXg6IHVwIChhY2Nlc3MgdG8gaW5vZGUgaXMgc3RpbGwgZXhjbHVzaXZlKQorICovCitpbnQKK2V4dDRfaW5pdF9hY2woaGFuZGxlX3QgKmhhbmRsZSwgc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGlub2RlICpkaXIpCit7CisJc3RydWN0IHBvc2l4X2FjbCAqYWNsID0gTlVMTDsKKwlpbnQgZXJyb3IgPSAwOworCisJaWYgKCFTX0lTTE5LKGlub2RlLT5pX21vZGUpKSB7CisJCWlmICh0ZXN0X29wdChkaXItPmlfc2IsIFBPU0lYX0FDTCkpIHsKKwkJCWFjbCA9IGV4dDRfZ2V0X2FjbChkaXIsIEFDTF9UWVBFX0RFRkFVTFQpOworCQkJaWYgKElTX0VSUihhY2wpKQorCQkJCXJldHVybiBQVFJfRVJSKGFjbCk7CisJCX0KKwkJaWYgKCFhY2wpCisJCQlpbm9kZS0+aV9tb2RlICY9IH5jdXJyZW50LT5mcy0+dW1hc2s7CisJfQorCWlmICh0ZXN0X29wdChpbm9kZS0+aV9zYiwgUE9TSVhfQUNMKSAmJiBhY2wpIHsKKwkJc3RydWN0IHBvc2l4X2FjbCAqY2xvbmU7CisJCW1vZGVfdCBtb2RlOworCisJCWlmIChTX0lTRElSKGlub2RlLT5pX21vZGUpKSB7CisJCQllcnJvciA9IGV4dDRfc2V0X2FjbChoYW5kbGUsIGlub2RlLAorCQkJCQkgICAgIEFDTF9UWVBFX0RFRkFVTFQsIGFjbCk7CisJCQlpZiAoZXJyb3IpCisJCQkJZ290byBjbGVhbnVwOworCQl9CisJCWNsb25lID0gcG9zaXhfYWNsX2Nsb25lKGFjbCwgR0ZQX0tFUk5FTCk7CisJCWVycm9yID0gLUVOT01FTTsKKwkJaWYgKCFjbG9uZSkKKwkJCWdvdG8gY2xlYW51cDsKKworCQltb2RlID0gaW5vZGUtPmlfbW9kZTsKKwkJZXJyb3IgPSBwb3NpeF9hY2xfY3JlYXRlX21hc3EoY2xvbmUsICZtb2RlKTsKKwkJaWYgKGVycm9yID49IDApIHsKKwkJCWlub2RlLT5pX21vZGUgPSBtb2RlOworCQkJaWYgKGVycm9yID4gMCkgeworCQkJCS8qIFRoaXMgaXMgYW4gZXh0ZW5kZWQgQUNMICovCisJCQkJZXJyb3IgPSBleHQ0X3NldF9hY2woaGFuZGxlLCBpbm9kZSwKKwkJCQkJCSAgICAgQUNMX1RZUEVfQUNDRVNTLCBjbG9uZSk7CisJCQl9CisJCX0KKwkJcG9zaXhfYWNsX3JlbGVhc2UoY2xvbmUpOworCX0KK2NsZWFudXA6CisJcG9zaXhfYWNsX3JlbGVhc2UoYWNsKTsKKwlyZXR1cm4gZXJyb3I7Cit9CisKKy8qCisgKiBEb2VzIGNobW9kIGZvciBhbiBpbm9kZSB0aGF0IG1heSBoYXZlIGFuIEFjY2VzcyBDb250cm9sIExpc3QuIFRoZQorICogaW5vZGUtPmlfbW9kZSBmaWVsZCBtdXN0IGJlIHVwZGF0ZWQgdG8gdGhlIGRlc2lyZWQgdmFsdWUgYnkgdGhlIGNhbGxlcgorICogYmVmb3JlIGNhbGxpbmcgdGhpcyBmdW5jdGlvbi4KKyAqIFJldHVybnMgMCBvbiBzdWNjZXNzLCBvciBhIG5lZ2F0aXZlIGVycm9yIG51bWJlci4KKyAqCisgKiBXZSBjaGFuZ2UgdGhlIEFDTCByYXRoZXIgdGhhbiBzdG9yaW5nIHNvbWUgQUNMIGVudHJpZXMgaW4gdGhlIGZpbGUKKyAqIG1vZGUgcGVybWlzc2lvbiBiaXRzICh3aGljaCB3b3VsZCBiZSBtb3JlIGVmZmljaWVudCksIGJlY2F1c2UgdGhhdAorICogd291bGQgYnJlYWsgb25jZSBhZGRpdGlvbmFsIHBlcm1pc3Npb25zIChsaWtlICBBQ0xfQVBQRU5ELCBBQ0xfREVMRVRFCisgKiBmb3IgZGlyZWN0b3JpZXMpIGFyZSBhZGRlZC4gVGhlcmUgYXJlIG5vIG1vcmUgYml0cyBhdmFpbGFibGUgaW4gdGhlCisgKiBmaWxlIG1vZGUuCisgKgorICogaW5vZGUtPmlfbXV0ZXg6IGRvd24KKyAqLworaW50CitleHQ0X2FjbF9jaG1vZChzdHJ1Y3QgaW5vZGUgKmlub2RlKQoreworCXN0cnVjdCBwb3NpeF9hY2wgKmFjbCwgKmNsb25lOworCWludCBlcnJvcjsKKworCWlmIChTX0lTTE5LKGlub2RlLT5pX21vZGUpKQorCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisJaWYgKCF0ZXN0X29wdChpbm9kZS0+aV9zYiwgUE9TSVhfQUNMKSkKKwkJcmV0dXJuIDA7CisJYWNsID0gZXh0NF9nZXRfYWNsKGlub2RlLCBBQ0xfVFlQRV9BQ0NFU1MpOworCWlmIChJU19FUlIoYWNsKSB8fCAhYWNsKQorCQlyZXR1cm4gUFRSX0VSUihhY2wpOworCWNsb25lID0gcG9zaXhfYWNsX2Nsb25lKGFjbCwgR0ZQX0tFUk5FTCk7CisJcG9zaXhfYWNsX3JlbGVhc2UoYWNsKTsKKwlpZiAoIWNsb25lKQorCQlyZXR1cm4gLUVOT01FTTsKKwllcnJvciA9IHBvc2l4X2FjbF9jaG1vZF9tYXNxKGNsb25lLCBpbm9kZS0+aV9tb2RlKTsKKwlpZiAoIWVycm9yKSB7CisJCWhhbmRsZV90ICpoYW5kbGU7CisJCWludCByZXRyaWVzID0gMDsKKworCXJldHJ5OgorCQloYW5kbGUgPSBleHQ0X2pvdXJuYWxfc3RhcnQoaW5vZGUsCisJCQkJRVhUNF9EQVRBX1RSQU5TX0JMT0NLUyhpbm9kZS0+aV9zYikpOworCQlpZiAoSVNfRVJSKGhhbmRsZSkpIHsKKwkJCWVycm9yID0gUFRSX0VSUihoYW5kbGUpOworCQkJZXh0NF9zdGRfZXJyb3IoaW5vZGUtPmlfc2IsIGVycm9yKTsKKwkJCWdvdG8gb3V0OworCQl9CisJCWVycm9yID0gZXh0NF9zZXRfYWNsKGhhbmRsZSwgaW5vZGUsIEFDTF9UWVBFX0FDQ0VTUywgY2xvbmUpOworCQlleHQ0X2pvdXJuYWxfc3RvcChoYW5kbGUpOworCQlpZiAoZXJyb3IgPT0gLUVOT1NQQyAmJgorCQkgICAgZXh0NF9zaG91bGRfcmV0cnlfYWxsb2MoaW5vZGUtPmlfc2IsICZyZXRyaWVzKSkKKwkJCWdvdG8gcmV0cnk7CisJfQorb3V0OgorCXBvc2l4X2FjbF9yZWxlYXNlKGNsb25lKTsKKwlyZXR1cm4gZXJyb3I7Cit9CisKKy8qCisgKiBFeHRlbmRlZCBhdHRyaWJ1dGUgaGFuZGxlcnMKKyAqLworc3RhdGljIHNpemVfdAorZXh0NF94YXR0cl9saXN0X2FjbF9hY2Nlc3Moc3RydWN0IGlub2RlICppbm9kZSwgY2hhciAqbGlzdCwgc2l6ZV90IGxpc3RfbGVuLAorCQkJICAgY29uc3QgY2hhciAqbmFtZSwgc2l6ZV90IG5hbWVfbGVuKQoreworCWNvbnN0IHNpemVfdCBzaXplID0gc2l6ZW9mKFBPU0lYX0FDTF9YQVRUUl9BQ0NFU1MpOworCisJaWYgKCF0ZXN0X29wdChpbm9kZS0+aV9zYiwgUE9TSVhfQUNMKSkKKwkJcmV0dXJuIDA7CisJaWYgKGxpc3QgJiYgc2l6ZSA8PSBsaXN0X2xlbikKKwkJbWVtY3B5KGxpc3QsIFBPU0lYX0FDTF9YQVRUUl9BQ0NFU1MsIHNpemUpOworCXJldHVybiBzaXplOworfQorCitzdGF0aWMgc2l6ZV90CitleHQ0X3hhdHRyX2xpc3RfYWNsX2RlZmF1bHQoc3RydWN0IGlub2RlICppbm9kZSwgY2hhciAqbGlzdCwgc2l6ZV90IGxpc3RfbGVuLAorCQkJICAgIGNvbnN0IGNoYXIgKm5hbWUsIHNpemVfdCBuYW1lX2xlbikKK3sKKwljb25zdCBzaXplX3Qgc2l6ZSA9IHNpemVvZihQT1NJWF9BQ0xfWEFUVFJfREVGQVVMVCk7CisKKwlpZiAoIXRlc3Rfb3B0KGlub2RlLT5pX3NiLCBQT1NJWF9BQ0wpKQorCQlyZXR1cm4gMDsKKwlpZiAobGlzdCAmJiBzaXplIDw9IGxpc3RfbGVuKQorCQltZW1jcHkobGlzdCwgUE9TSVhfQUNMX1hBVFRSX0RFRkFVTFQsIHNpemUpOworCXJldHVybiBzaXplOworfQorCitzdGF0aWMgaW50CitleHQ0X3hhdHRyX2dldF9hY2woc3RydWN0IGlub2RlICppbm9kZSwgaW50IHR5cGUsIHZvaWQgKmJ1ZmZlciwgc2l6ZV90IHNpemUpCit7CisJc3RydWN0IHBvc2l4X2FjbCAqYWNsOworCWludCBlcnJvcjsKKworCWlmICghdGVzdF9vcHQoaW5vZGUtPmlfc2IsIFBPU0lYX0FDTCkpCisJCXJldHVybiAtRU9QTk9UU1VQUDsKKworCWFjbCA9IGV4dDRfZ2V0X2FjbChpbm9kZSwgdHlwZSk7CisJaWYgKElTX0VSUihhY2wpKQorCQlyZXR1cm4gUFRSX0VSUihhY2wpOworCWlmIChhY2wgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9EQVRBOworCWVycm9yID0gcG9zaXhfYWNsX3RvX3hhdHRyKGFjbCwgYnVmZmVyLCBzaXplKTsKKwlwb3NpeF9hY2xfcmVsZWFzZShhY2wpOworCisJcmV0dXJuIGVycm9yOworfQorCitzdGF0aWMgaW50CitleHQ0X3hhdHRyX2dldF9hY2xfYWNjZXNzKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGNvbnN0IGNoYXIgKm5hbWUsCisJCQkgIHZvaWQgKmJ1ZmZlciwgc2l6ZV90IHNpemUpCit7CisJaWYgKHN0cmNtcChuYW1lLCAiIikgIT0gMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisJcmV0dXJuIGV4dDRfeGF0dHJfZ2V0X2FjbChpbm9kZSwgQUNMX1RZUEVfQUNDRVNTLCBidWZmZXIsIHNpemUpOworfQorCitzdGF0aWMgaW50CitleHQ0X3hhdHRyX2dldF9hY2xfZGVmYXVsdChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBjb25zdCBjaGFyICpuYW1lLAorCQkJICAgdm9pZCAqYnVmZmVyLCBzaXplX3Qgc2l6ZSkKK3sKKwlpZiAoc3RyY21wKG5hbWUsICIiKSAhPSAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlyZXR1cm4gZXh0NF94YXR0cl9nZXRfYWNsKGlub2RlLCBBQ0xfVFlQRV9ERUZBVUxULCBidWZmZXIsIHNpemUpOworfQorCitzdGF0aWMgaW50CitleHQ0X3hhdHRyX3NldF9hY2woc3RydWN0IGlub2RlICppbm9kZSwgaW50IHR5cGUsIGNvbnN0IHZvaWQgKnZhbHVlLAorCQkgICBzaXplX3Qgc2l6ZSkKK3sKKwloYW5kbGVfdCAqaGFuZGxlOworCXN0cnVjdCBwb3NpeF9hY2wgKmFjbDsKKwlpbnQgZXJyb3IsIHJldHJpZXMgPSAwOworCisJaWYgKCF0ZXN0X29wdChpbm9kZS0+aV9zYiwgUE9TSVhfQUNMKSkKKwkJcmV0dXJuIC1FT1BOT1RTVVBQOworCWlmICgoY3VycmVudC0+ZnN1aWQgIT0gaW5vZGUtPmlfdWlkKSAmJiAhY2FwYWJsZShDQVBfRk9XTkVSKSkKKwkJcmV0dXJuIC1FUEVSTTsKKworCWlmICh2YWx1ZSkgeworCQlhY2wgPSBwb3NpeF9hY2xfZnJvbV94YXR0cih2YWx1ZSwgc2l6ZSk7CisJCWlmIChJU19FUlIoYWNsKSkKKwkJCXJldHVybiBQVFJfRVJSKGFjbCk7CisJCWVsc2UgaWYgKGFjbCkgeworCQkJZXJyb3IgPSBwb3NpeF9hY2xfdmFsaWQoYWNsKTsKKwkJCWlmIChlcnJvcikKKwkJCQlnb3RvIHJlbGVhc2VfYW5kX291dDsKKwkJfQorCX0gZWxzZQorCQlhY2wgPSBOVUxMOworCityZXRyeToKKwloYW5kbGUgPSBleHQ0X2pvdXJuYWxfc3RhcnQoaW5vZGUsIEVYVDRfREFUQV9UUkFOU19CTE9DS1MoaW5vZGUtPmlfc2IpKTsKKwlpZiAoSVNfRVJSKGhhbmRsZSkpCisJCXJldHVybiBQVFJfRVJSKGhhbmRsZSk7CisJZXJyb3IgPSBleHQ0X3NldF9hY2woaGFuZGxlLCBpbm9kZSwgdHlwZSwgYWNsKTsKKwlleHQ0X2pvdXJuYWxfc3RvcChoYW5kbGUpOworCWlmIChlcnJvciA9PSAtRU5PU1BDICYmIGV4dDRfc2hvdWxkX3JldHJ5X2FsbG9jKGlub2RlLT5pX3NiLCAmcmV0cmllcykpCisJCWdvdG8gcmV0cnk7CisKK3JlbGVhc2VfYW5kX291dDoKKwlwb3NpeF9hY2xfcmVsZWFzZShhY2wpOworCXJldHVybiBlcnJvcjsKK30KKworc3RhdGljIGludAorZXh0NF94YXR0cl9zZXRfYWNsX2FjY2VzcyhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBjb25zdCBjaGFyICpuYW1lLAorCQkJICBjb25zdCB2b2lkICp2YWx1ZSwgc2l6ZV90IHNpemUsIGludCBmbGFncykKK3sKKwlpZiAoc3RyY21wKG5hbWUsICIiKSAhPSAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlyZXR1cm4gZXh0NF94YXR0cl9zZXRfYWNsKGlub2RlLCBBQ0xfVFlQRV9BQ0NFU1MsIHZhbHVlLCBzaXplKTsKK30KKworc3RhdGljIGludAorZXh0NF94YXR0cl9zZXRfYWNsX2RlZmF1bHQoc3RydWN0IGlub2RlICppbm9kZSwgY29uc3QgY2hhciAqbmFtZSwKKwkJCSAgIGNvbnN0IHZvaWQgKnZhbHVlLCBzaXplX3Qgc2l6ZSwgaW50IGZsYWdzKQoreworCWlmIChzdHJjbXAobmFtZSwgIiIpICE9IDApCisJCXJldHVybiAtRUlOVkFMOworCXJldHVybiBleHQ0X3hhdHRyX3NldF9hY2woaW5vZGUsIEFDTF9UWVBFX0RFRkFVTFQsIHZhbHVlLCBzaXplKTsKK30KKworc3RydWN0IHhhdHRyX2hhbmRsZXIgZXh0NF94YXR0cl9hY2xfYWNjZXNzX2hhbmRsZXIgPSB7CisJLnByZWZpeAk9IFBPU0lYX0FDTF9YQVRUUl9BQ0NFU1MsCisJLmxpc3QJPSBleHQ0X3hhdHRyX2xpc3RfYWNsX2FjY2VzcywKKwkuZ2V0CT0gZXh0NF94YXR0cl9nZXRfYWNsX2FjY2VzcywKKwkuc2V0CT0gZXh0NF94YXR0cl9zZXRfYWNsX2FjY2VzcywKK307CisKK3N0cnVjdCB4YXR0cl9oYW5kbGVyIGV4dDRfeGF0dHJfYWNsX2RlZmF1bHRfaGFuZGxlciA9IHsKKwkucHJlZml4CT0gUE9TSVhfQUNMX1hBVFRSX0RFRkFVTFQsCisJLmxpc3QJPSBleHQ0X3hhdHRyX2xpc3RfYWNsX2RlZmF1bHQsCisJLmdldAk9IGV4dDRfeGF0dHJfZ2V0X2FjbF9kZWZhdWx0LAorCS5zZXQJPSBleHQ0X3hhdHRyX3NldF9hY2xfZGVmYXVsdCwKK307CmRpZmYgLS1naXQgYS9mcy9leHQ0L2FjbC5oIGIvZnMvZXh0NC9hY2wuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNmE1YzFhCi0tLSAvZGV2L251bGwKKysrIGIvZnMvZXh0NC9hY2wuaApAQCAtMCwwICsxLDgxIEBACisvKgorICBGaWxlOiBmcy9leHQ0L2FjbC5oCisKKyAgKEMpIDIwMDEgQW5kcmVhcyBHcnVlbmJhY2hlciwgPGEuZ3J1ZW5iYWNoZXJAY29tcHV0ZXIub3JnPgorKi8KKworI2luY2x1ZGUgPGxpbnV4L3Bvc2l4X2FjbF94YXR0ci5oPgorCisjZGVmaW5lIEVYVDRfQUNMX1ZFUlNJT04JMHgwMDAxCisKK3R5cGVkZWYgc3RydWN0IHsKKwlfX2xlMTYJCWVfdGFnOworCV9fbGUxNgkJZV9wZXJtOworCV9fbGUzMgkJZV9pZDsKK30gZXh0NF9hY2xfZW50cnk7CisKK3R5cGVkZWYgc3RydWN0IHsKKwlfX2xlMTYJCWVfdGFnOworCV9fbGUxNgkJZV9wZXJtOworfSBleHQ0X2FjbF9lbnRyeV9zaG9ydDsKKwordHlwZWRlZiBzdHJ1Y3QgeworCV9fbGUzMgkJYV92ZXJzaW9uOworfSBleHQ0X2FjbF9oZWFkZXI7CisKK3N0YXRpYyBpbmxpbmUgc2l6ZV90IGV4dDRfYWNsX3NpemUoaW50IGNvdW50KQoreworCWlmIChjb3VudCA8PSA0KSB7CisJCXJldHVybiBzaXplb2YoZXh0NF9hY2xfaGVhZGVyKSArCisJCSAgICAgICBjb3VudCAqIHNpemVvZihleHQ0X2FjbF9lbnRyeV9zaG9ydCk7CisJfSBlbHNlIHsKKwkJcmV0dXJuIHNpemVvZihleHQ0X2FjbF9oZWFkZXIpICsKKwkJICAgICAgIDQgKiBzaXplb2YoZXh0NF9hY2xfZW50cnlfc2hvcnQpICsKKwkJICAgICAgIChjb3VudCAtIDQpICogc2l6ZW9mKGV4dDRfYWNsX2VudHJ5KTsKKwl9Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGV4dDRfYWNsX2NvdW50KHNpemVfdCBzaXplKQoreworCXNzaXplX3QgczsKKwlzaXplIC09IHNpemVvZihleHQ0X2FjbF9oZWFkZXIpOworCXMgPSBzaXplIC0gNCAqIHNpemVvZihleHQ0X2FjbF9lbnRyeV9zaG9ydCk7CisJaWYgKHMgPCAwKSB7CisJCWlmIChzaXplICUgc2l6ZW9mKGV4dDRfYWNsX2VudHJ5X3Nob3J0KSkKKwkJCXJldHVybiAtMTsKKwkJcmV0dXJuIHNpemUgLyBzaXplb2YoZXh0NF9hY2xfZW50cnlfc2hvcnQpOworCX0gZWxzZSB7CisJCWlmIChzICUgc2l6ZW9mKGV4dDRfYWNsX2VudHJ5KSkKKwkJCXJldHVybiAtMTsKKwkJcmV0dXJuIHMgLyBzaXplb2YoZXh0NF9hY2xfZW50cnkpICsgNDsKKwl9Cit9CisKKyNpZmRlZiBDT05GSUdfRVhUNERFVl9GU19QT1NJWF9BQ0wKKworLyogVmFsdWUgZm9yIGlub2RlLT51LmV4dDRfaS5pX2FjbCBhbmQgaW5vZGUtPnUuZXh0NF9pLmlfZGVmYXVsdF9hY2wKKyAgIGlmIHRoZSBBQ0wgaGFzIG5vdCBiZWVuIGNhY2hlZCAqLworI2RlZmluZSBFWFQ0X0FDTF9OT1RfQ0FDSEVEICgodm9pZCAqKS0xKQorCisvKiBhY2wuYyAqLworZXh0ZXJuIGludCBleHQ0X3Blcm1pc3Npb24gKHN0cnVjdCBpbm9kZSAqLCBpbnQsIHN0cnVjdCBuYW1laWRhdGEgKik7CitleHRlcm4gaW50IGV4dDRfYWNsX2NobW9kIChzdHJ1Y3QgaW5vZGUgKik7CitleHRlcm4gaW50IGV4dDRfaW5pdF9hY2wgKGhhbmRsZV90ICosIHN0cnVjdCBpbm9kZSAqLCBzdHJ1Y3QgaW5vZGUgKik7CisKKyNlbHNlICAvKiBDT05GSUdfRVhUNERFVl9GU19QT1NJWF9BQ0wgKi8KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2RlZmluZSBleHQ0X3Blcm1pc3Npb24gTlVMTAorCitzdGF0aWMgaW5saW5lIGludAorZXh0NF9hY2xfY2htb2Qoc3RydWN0IGlub2RlICppbm9kZSkKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSBpbnQKK2V4dDRfaW5pdF9hY2woaGFuZGxlX3QgKmhhbmRsZSwgc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGlub2RlICpkaXIpCit7CisJcmV0dXJuIDA7Cit9CisjZW5kaWYgIC8qIENPTkZJR19FWFQ0REVWX0ZTX1BPU0lYX0FDTCAqLworCmRpZmYgLS1naXQgYS9mcy9leHQ0L2JhbGxvYy5jIGIvZnMvZXh0NC9iYWxsb2MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZDQ1NTgyCi0tLSAvZGV2L251bGwKKysrIGIvZnMvZXh0NC9iYWxsb2MuYwpAQCAtMCwwICsxLDE4MzMgQEAKKy8qCisgKiAgbGludXgvZnMvZXh0NC9iYWxsb2MuYworICoKKyAqIENvcHlyaWdodCAoQykgMTk5MiwgMTk5MywgMTk5NCwgMTk5NQorICogUmVteSBDYXJkIChjYXJkQG1hc2kuaWJwLmZyKQorICogTGFib3JhdG9pcmUgTUFTSSAtIEluc3RpdHV0IEJsYWlzZSBQYXNjYWwKKyAqIFVuaXZlcnNpdGUgUGllcnJlIGV0IE1hcmllIEN1cmllIChQYXJpcyBWSSkKKyAqCisgKiAgRW5oYW5jZWQgYmxvY2sgYWxsb2NhdGlvbiBieSBTdGVwaGVuIFR3ZWVkaWUgKHNjdEByZWRoYXQuY29tKSwgMTk5MworICogIEJpZy1lbmRpYW4gdG8gbGl0dGxlLWVuZGlhbiBieXRlLXN3YXBwaW5nL2JpdG1hcHMgYnkKKyAqICAgICAgICBEYXZpZCBTLiBNaWxsZXIgKGRhdmVtQGNhaXAucnV0Z2Vycy5lZHUpLCAxOTk1CisgKi8KKworI2luY2x1ZGUgPGxpbnV4L3RpbWUuaD4KKyNpbmNsdWRlIDxsaW51eC9jYXBhYmlsaXR5Lmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9qYmQyLmg+CisjaW5jbHVkZSA8bGludXgvZXh0NF9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L2V4dDRfamJkMi5oPgorI2luY2x1ZGUgPGxpbnV4L3F1b3Rhb3BzLmg+CisjaW5jbHVkZSA8bGludXgvYnVmZmVyX2hlYWQuaD4KKworLyoKKyAqIGJhbGxvYy5jIGNvbnRhaW5zIHRoZSBibG9ja3MgYWxsb2NhdGlvbiBhbmQgZGVhbGxvY2F0aW9uIHJvdXRpbmVzCisgKi8KKworLyoKKyAqIENhbGN1bGF0ZSB0aGUgYmxvY2sgZ3JvdXAgbnVtYmVyIGFuZCBvZmZzZXQsIGdpdmVuIGEgYmxvY2sgbnVtYmVyCisgKi8KK3ZvaWQgZXh0NF9nZXRfZ3JvdXBfbm9fYW5kX29mZnNldChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBleHQ0X2ZzYmxrX3QgYmxvY2tuciwKKwkJdW5zaWduZWQgbG9uZyAqYmxvY2tncnBwLCBleHQ0X2dycGJsa190ICpvZmZzZXRwKQoreworICAgICAgICBzdHJ1Y3QgZXh0NF9zdXBlcl9ibG9jayAqZXMgPSBFWFQ0X1NCKHNiKS0+c19lczsKKwlleHQ0X2dycGJsa190IG9mZnNldDsKKworICAgICAgICBibG9ja25yID0gYmxvY2tuciAtIGxlMzJfdG9fY3B1KGVzLT5zX2ZpcnN0X2RhdGFfYmxvY2spOworCW9mZnNldCA9IGRvX2RpdihibG9ja25yLCBFWFQ0X0JMT0NLU19QRVJfR1JPVVAoc2IpKTsKKwlpZiAob2Zmc2V0cCkKKwkJKm9mZnNldHAgPSBvZmZzZXQ7CisJaWYgKGJsb2NrZ3JwcCkKKwkgICAgICAgICpibG9ja2dycHAgPSBibG9ja25yOworCit9CisKKy8qCisgKiBUaGUgZnJlZSBibG9ja3MgYXJlIG1hbmFnZWQgYnkgYml0bWFwcy4gIEEgZmlsZSBzeXN0ZW0gY29udGFpbnMgc2V2ZXJhbAorICogYmxvY2tzIGdyb3Vwcy4gIEVhY2ggZ3JvdXAgY29udGFpbnMgMSBiaXRtYXAgYmxvY2sgZm9yIGJsb2NrcywgMSBiaXRtYXAKKyAqIGJsb2NrIGZvciBpbm9kZXMsIE4gYmxvY2tzIGZvciB0aGUgaW5vZGUgdGFibGUgYW5kIGRhdGEgYmxvY2tzLgorICoKKyAqIFRoZSBmaWxlIHN5c3RlbSBjb250YWlucyBncm91cCBkZXNjcmlwdG9ycyB3aGljaCBhcmUgbG9jYXRlZCBhZnRlciB0aGUKKyAqIHN1cGVyIGJsb2NrLiAgRWFjaCBkZXNjcmlwdG9yIGNvbnRhaW5zIHRoZSBudW1iZXIgb2YgdGhlIGJpdG1hcCBibG9jayBhbmQKKyAqIHRoZSBmcmVlIGJsb2NrcyBjb3VudCBpbiB0aGUgYmxvY2suICBUaGUgZGVzY3JpcHRvcnMgYXJlIGxvYWRlZCBpbiBtZW1vcnkKKyAqIHdoZW4gYSBmaWxlIHN5c3RlbSBpcyBtb3VudGVkIChzZWUgZXh0NF9yZWFkX3N1cGVyKS4KKyAqLworCisKKyNkZWZpbmUgaW5fcmFuZ2UoYiwgZmlyc3QsIGxlbikJKChiKSA+PSAoZmlyc3QpICYmIChiKSA8PSAoZmlyc3QpICsgKGxlbikgLSAxKQorCisvKioKKyAqIGV4dDRfZ2V0X2dyb3VwX2Rlc2MoKSAtLSBsb2FkIGdyb3VwIGRlc2NyaXB0b3IgZnJvbSBkaXNrCisgKiBAc2I6CQkJc3VwZXIgYmxvY2sKKyAqIEBibG9ja19ncm91cDoJZ2l2ZW4gYmxvY2sgZ3JvdXAKKyAqIEBiaDoJCQlwb2ludGVyIHRvIHRoZSBidWZmZXIgaGVhZCB0byBzdG9yZSB0aGUgYmxvY2sKKyAqCQkJZ3JvdXAgZGVzY3JpcHRvcgorICovCitzdHJ1Y3QgZXh0NF9ncm91cF9kZXNjICogZXh0NF9nZXRfZ3JvdXBfZGVzYyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiBzYiwKKwkJCQkJICAgICB1bnNpZ25lZCBpbnQgYmxvY2tfZ3JvdXAsCisJCQkJCSAgICAgc3RydWN0IGJ1ZmZlcl9oZWFkICoqIGJoKQoreworCXVuc2lnbmVkIGxvbmcgZ3JvdXBfZGVzYzsKKwl1bnNpZ25lZCBsb25nIG9mZnNldDsKKwlzdHJ1Y3QgZXh0NF9ncm91cF9kZXNjICogZGVzYzsKKwlzdHJ1Y3QgZXh0NF9zYl9pbmZvICpzYmkgPSBFWFQ0X1NCKHNiKTsKKworCWlmIChibG9ja19ncm91cCA+PSBzYmktPnNfZ3JvdXBzX2NvdW50KSB7CisJCWV4dDRfZXJyb3IgKHNiLCAiZXh0NF9nZXRfZ3JvdXBfZGVzYyIsCisJCQkgICAgImJsb2NrX2dyb3VwID49IGdyb3Vwc19jb3VudCAtICIKKwkJCSAgICAiYmxvY2tfZ3JvdXAgPSAlZCwgZ3JvdXBzX2NvdW50ID0gJWx1IiwKKwkJCSAgICBibG9ja19ncm91cCwgc2JpLT5zX2dyb3Vwc19jb3VudCk7CisKKwkJcmV0dXJuIE5VTEw7CisJfQorCXNtcF9ybWIoKTsKKworCWdyb3VwX2Rlc2MgPSBibG9ja19ncm91cCA+PiBFWFQ0X0RFU0NfUEVSX0JMT0NLX0JJVFMoc2IpOworCW9mZnNldCA9IGJsb2NrX2dyb3VwICYgKEVYVDRfREVTQ19QRVJfQkxPQ0soc2IpIC0gMSk7CisJaWYgKCFzYmktPnNfZ3JvdXBfZGVzY1tncm91cF9kZXNjXSkgeworCQlleHQ0X2Vycm9yIChzYiwgImV4dDRfZ2V0X2dyb3VwX2Rlc2MiLAorCQkJICAgICJHcm91cCBkZXNjcmlwdG9yIG5vdCBsb2FkZWQgLSAiCisJCQkgICAgImJsb2NrX2dyb3VwID0gJWQsIGdyb3VwX2Rlc2MgPSAlbHUsIGRlc2MgPSAlbHUiLAorCQkJICAgICBibG9ja19ncm91cCwgZ3JvdXBfZGVzYywgb2Zmc2V0KTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJZGVzYyA9IChzdHJ1Y3QgZXh0NF9ncm91cF9kZXNjICopKAorCQkoX191OCAqKXNiaS0+c19ncm91cF9kZXNjW2dyb3VwX2Rlc2NdLT5iX2RhdGEgKworCQlvZmZzZXQgKiBFWFQ0X0RFU0NfU0laRShzYikpOworCWlmIChiaCkKKwkJKmJoID0gc2JpLT5zX2dyb3VwX2Rlc2NbZ3JvdXBfZGVzY107CisJcmV0dXJuIGRlc2M7Cit9CisKKy8qKgorICogcmVhZF9ibG9ja19iaXRtYXAoKQorICogQHNiOgkJCXN1cGVyIGJsb2NrCisgKiBAYmxvY2tfZ3JvdXA6CWdpdmVuIGJsb2NrIGdyb3VwCisgKgorICogUmVhZCB0aGUgYml0bWFwIGZvciBhIGdpdmVuIGJsb2NrX2dyb3VwLCByZWFkaW5nIGludG8gdGhlIHNwZWNpZmllZAorICogc2xvdCBpbiB0aGUgc3VwZXJibG9jaydzIGJpdG1hcCBjYWNoZS4KKyAqCisgKiBSZXR1cm4gYnVmZmVyX2hlYWQgb24gc3VjY2VzcyBvciBOVUxMIGluIGNhc2Ugb2YgZmFpbHVyZS4KKyAqLworc3RhdGljIHN0cnVjdCBidWZmZXJfaGVhZCAqCityZWFkX2Jsb2NrX2JpdG1hcChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCB1bnNpZ25lZCBpbnQgYmxvY2tfZ3JvdXApCit7CisJc3RydWN0IGV4dDRfZ3JvdXBfZGVzYyAqIGRlc2M7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICogYmggPSBOVUxMOworCisJZGVzYyA9IGV4dDRfZ2V0X2dyb3VwX2Rlc2MgKHNiLCBibG9ja19ncm91cCwgTlVMTCk7CisJaWYgKCFkZXNjKQorCQlnb3RvIGVycm9yX291dDsKKwliaCA9IHNiX2JyZWFkKHNiLCBleHQ0X2Jsb2NrX2JpdG1hcChzYiwgZGVzYykpOworCWlmICghYmgpCisJCWV4dDRfZXJyb3IgKHNiLCAicmVhZF9ibG9ja19iaXRtYXAiLAorCQkJICAgICJDYW5ub3QgcmVhZCBibG9jayBiaXRtYXAgLSAiCisJCQkgICAgImJsb2NrX2dyb3VwID0gJWQsIGJsb2NrX2JpdG1hcCA9ICVsbHUiLAorCQkJICAgIGJsb2NrX2dyb3VwLAorCQkJICAgIGV4dDRfYmxvY2tfYml0bWFwKHNiLCBkZXNjKSk7CitlcnJvcl9vdXQ6CisJcmV0dXJuIGJoOworfQorLyoKKyAqIFRoZSByZXNlcnZhdGlvbiB3aW5kb3cgc3RydWN0dXJlIG9wZXJhdGlvbnMKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBPcGVyYXRpb25zIGluY2x1ZGU6CisgKiBkdW1wLCBmaW5kLCBhZGQsIHJlbW92ZSwgaXNfZW1wdHksIGZpbmRfbmV4dF9yZXNlcnZhYmxlX3dpbmRvdywgZXRjLgorICoKKyAqIFdlIHVzZSBhIHJlZC1ibGFjayB0cmVlIHRvIHJlcHJlc2VudCBwZXItZmlsZXN5c3RlbSByZXNlcnZhdGlvbgorICogd2luZG93cy4KKyAqCisgKi8KKworLyoqCisgKiBfX3Jzdl93aW5kb3dfZHVtcCgpIC0tIER1bXAgdGhlIGZpbGVzeXN0ZW0gYmxvY2sgYWxsb2NhdGlvbiByZXNlcnZhdGlvbiBtYXAKKyAqIEByYl9yb290OgkJcm9vdCBvZiBwZXItZmlsZXN5c3RlbSByZXNlcnZhdGlvbiByYiB0cmVlCisgKiBAdmVyYm9zZToJCXZlcmJvc2UgbW9kZQorICogQGZuOgkJCWZ1bmN0aW9uIHdoaWNoIHdpc2hlcyB0byBkdW1wIHRoZSByZXNlcnZhdGlvbiBtYXAKKyAqCisgKiBJZiB2ZXJib3NlIGlzIHR1cm5lZCBvbiwgaXQgd2lsbCBwcmludCB0aGUgd2hvbGUgYmxvY2sgcmVzZXJ2YXRpb24KKyAqIHdpbmRvd3Moc3RhcnQsIGVuZCkuCU90aGVyd2lzZSwgaXQgd2lsbCBvbmx5IHByaW50IG91dCB0aGUgImJhZCIgd2luZG93cywKKyAqIHRob3NlIHdpbmRvd3MgdGhhdCBvdmVybGFwIHdpdGggdGhlaXIgaW1tZWRpYXRlIG5laWdoYm9ycy4KKyAqLworI2lmIDEKK3N0YXRpYyB2b2lkIF9fcnN2X3dpbmRvd19kdW1wKHN0cnVjdCByYl9yb290ICpyb290LCBpbnQgdmVyYm9zZSwKKwkJCSAgICAgIGNvbnN0IGNoYXIgKmZuKQoreworCXN0cnVjdCByYl9ub2RlICpuOworCXN0cnVjdCBleHQ0X3Jlc2VydmVfd2luZG93X25vZGUgKnJzdiwgKnByZXY7CisJaW50IGJhZDsKKworcmVzdGFydDoKKwluID0gcmJfZmlyc3Qocm9vdCk7CisJYmFkID0gMDsKKwlwcmV2ID0gTlVMTDsKKworCXByaW50aygiQmxvY2sgQWxsb2NhdGlvbiBSZXNlcnZhdGlvbiBXaW5kb3dzIE1hcCAoJXMpOlxuIiwgZm4pOworCXdoaWxlIChuKSB7CisJCXJzdiA9IGxpc3RfZW50cnkobiwgc3RydWN0IGV4dDRfcmVzZXJ2ZV93aW5kb3dfbm9kZSwgcnN2X25vZGUpOworCQlpZiAodmVyYm9zZSkKKwkJCXByaW50aygicmVzZXJ2YXRpb24gd2luZG93IDB4JXAgIgorCQkJICAgICAgICJzdGFydDogICVsbHUsIGVuZDogICVsbHVcbiIsCisJCQkgICAgICAgcnN2LCByc3YtPnJzdl9zdGFydCwgcnN2LT5yc3ZfZW5kKTsKKwkJaWYgKHJzdi0+cnN2X3N0YXJ0ICYmIHJzdi0+cnN2X3N0YXJ0ID49IHJzdi0+cnN2X2VuZCkgeworCQkJcHJpbnRrKCJCYWQgcmVzZXJ2YXRpb24gJXAgKHN0YXJ0ID49IGVuZClcbiIsCisJCQkgICAgICAgcnN2KTsKKwkJCWJhZCA9IDE7CisJCX0KKwkJaWYgKHByZXYgJiYgcHJldi0+cnN2X2VuZCA+PSByc3YtPnJzdl9zdGFydCkgeworCQkJcHJpbnRrKCJCYWQgcmVzZXJ2YXRpb24gJXAgKHByZXYtPmVuZCA+PSBzdGFydClcbiIsCisJCQkgICAgICAgcnN2KTsKKwkJCWJhZCA9IDE7CisJCX0KKwkJaWYgKGJhZCkgeworCQkJaWYgKCF2ZXJib3NlKSB7CisJCQkJcHJpbnRrKCJSZXN0YXJ0aW5nIHJlc2VydmF0aW9uIHdhbGsgaW4gdmVyYm9zZSBtb2RlXG4iKTsKKwkJCQl2ZXJib3NlID0gMTsKKwkJCQlnb3RvIHJlc3RhcnQ7CisJCQl9CisJCX0KKwkJbiA9IHJiX25leHQobik7CisJCXByZXYgPSByc3Y7CisJfQorCXByaW50aygiV2luZG93IG1hcCBjb21wbGV0ZS5cbiIpOworCWlmIChiYWQpCisJCUJVRygpOworfQorI2RlZmluZSByc3Zfd2luZG93X2R1bXAocm9vdCwgdmVyYm9zZSkgXAorCV9fcnN2X3dpbmRvd19kdW1wKChyb290KSwgKHZlcmJvc2UpLCBfX0ZVTkNUSU9OX18pCisjZWxzZQorI2RlZmluZSByc3Zfd2luZG93X2R1bXAocm9vdCwgdmVyYm9zZSkgZG8ge30gd2hpbGUgKDApCisjZW5kaWYKKworLyoqCisgKiBnb2FsX2luX215X3Jlc2VydmF0aW9uKCkKKyAqIEByc3Y6CQlpbm9kZSdzIHJlc2VydmF0aW9uIHdpbmRvdworICogQGdycF9nb2FsOgkJZ2l2ZW4gZ29hbCBibG9jayByZWxhdGl2ZSB0byB0aGUgYWxsb2NhdGlvbiBibG9jayBncm91cAorICogQGdyb3VwOgkJdGhlIGN1cnJlbnQgYWxsb2NhdGlvbiBibG9jayBncm91cAorICogQHNiOgkJCWZpbGVzeXN0ZW0gc3VwZXIgYmxvY2sKKyAqCisgKiBUZXN0IGlmIHRoZSBnaXZlbiBnb2FsIGJsb2NrIChncm91cCByZWxhdGl2ZSkgaXMgd2l0aGluIHRoZSBmaWxlJ3MKKyAqIG93biBibG9jayByZXNlcnZhdGlvbiB3aW5kb3cgcmFuZ2UuCisgKgorICogSWYgdGhlIHJlc2VydmF0aW9uIHdpbmRvdyBpcyBvdXRzaWRlIHRoZSBnb2FsIGFsbG9jYXRpb24gZ3JvdXAsIHJldHVybiAwOworICogZ3JwX2dvYWwgKGdpdmVuIGdvYWwgYmxvY2spIGNvdWxkIGJlIC0xLCB3aGljaCBtZWFucyBubyBzcGVjaWZpYworICogZ29hbCBibG9jay4gSW4gdGhpcyBjYXNlLCBhbHdheXMgcmV0dXJuIDEuCisgKiBJZiB0aGUgZ29hbCBibG9jayBpcyB3aXRoaW4gdGhlIHJlc2VydmF0aW9uIHdpbmRvdywgcmV0dXJuIDE7CisgKiBvdGhlcndpc2UsIHJldHVybiAwOworICovCitzdGF0aWMgaW50Citnb2FsX2luX215X3Jlc2VydmF0aW9uKHN0cnVjdCBleHQ0X3Jlc2VydmVfd2luZG93ICpyc3YsIGV4dDRfZ3JwYmxrX3QgZ3JwX2dvYWwsCisJCQl1bnNpZ25lZCBpbnQgZ3JvdXAsIHN0cnVjdCBzdXBlcl9ibG9jayAqIHNiKQoreworCWV4dDRfZnNibGtfdCBncm91cF9maXJzdF9ibG9jaywgZ3JvdXBfbGFzdF9ibG9jazsKKworCWdyb3VwX2ZpcnN0X2Jsb2NrID0gZXh0NF9ncm91cF9maXJzdF9ibG9ja19ubyhzYiwgZ3JvdXApOworCWdyb3VwX2xhc3RfYmxvY2sgPSBncm91cF9maXJzdF9ibG9jayArIChFWFQ0X0JMT0NLU19QRVJfR1JPVVAoc2IpIC0gMSk7CisKKwlpZiAoKHJzdi0+X3Jzdl9zdGFydCA+IGdyb3VwX2xhc3RfYmxvY2spIHx8CisJICAgIChyc3YtPl9yc3ZfZW5kIDwgZ3JvdXBfZmlyc3RfYmxvY2spKQorCQlyZXR1cm4gMDsKKwlpZiAoKGdycF9nb2FsID49IDApICYmICgoZ3JwX2dvYWwgKyBncm91cF9maXJzdF9ibG9jayA8IHJzdi0+X3Jzdl9zdGFydCkKKwkJfHwgKGdycF9nb2FsICsgZ3JvdXBfZmlyc3RfYmxvY2sgPiByc3YtPl9yc3ZfZW5kKSkpCisJCXJldHVybiAwOworCXJldHVybiAxOworfQorCisvKioKKyAqIHNlYXJjaF9yZXNlcnZlX3dpbmRvdygpCisgKiBAcmJfcm9vdDoJCXJvb3Qgb2YgcmVzZXJ2YXRpb24gdHJlZQorICogQGdvYWw6CQl0YXJnZXQgYWxsb2NhdGlvbiBibG9jaworICoKKyAqIEZpbmQgdGhlIHJlc2VydmVkIHdpbmRvdyB3aGljaCBpbmNsdWRlcyB0aGUgZ29hbCwgb3IgdGhlIHByZXZpb3VzIG9uZQorICogaWYgdGhlIGdvYWwgaXMgbm90IGluIGFueSB3aW5kb3cuCisgKiBSZXR1cm5zIE5VTEwgaWYgdGhlcmUgYXJlIG5vIHdpbmRvd3Mgb3IgaWYgYWxsIHdpbmRvd3Mgc3RhcnQgYWZ0ZXIgdGhlIGdvYWwuCisgKi8KK3N0YXRpYyBzdHJ1Y3QgZXh0NF9yZXNlcnZlX3dpbmRvd19ub2RlICoKK3NlYXJjaF9yZXNlcnZlX3dpbmRvdyhzdHJ1Y3QgcmJfcm9vdCAqcm9vdCwgZXh0NF9mc2Jsa190IGdvYWwpCit7CisJc3RydWN0IHJiX25vZGUgKm4gPSByb290LT5yYl9ub2RlOworCXN0cnVjdCBleHQ0X3Jlc2VydmVfd2luZG93X25vZGUgKnJzdjsKKworCWlmICghbikKKwkJcmV0dXJuIE5VTEw7CisKKwlkbyB7CisJCXJzdiA9IHJiX2VudHJ5KG4sIHN0cnVjdCBleHQ0X3Jlc2VydmVfd2luZG93X25vZGUsIHJzdl9ub2RlKTsKKworCQlpZiAoZ29hbCA8IHJzdi0+cnN2X3N0YXJ0KQorCQkJbiA9IG4tPnJiX2xlZnQ7CisJCWVsc2UgaWYgKGdvYWwgPiByc3YtPnJzdl9lbmQpCisJCQluID0gbi0+cmJfcmlnaHQ7CisJCWVsc2UKKwkJCXJldHVybiByc3Y7CisJfSB3aGlsZSAobik7CisJLyoKKwkgKiBXZSd2ZSBmYWxsZW4gb2ZmIHRoZSBlbmQgb2YgdGhlIHRyZWU6IHRoZSBnb2FsIHdhc24ndCBpbnNpZGUKKwkgKiBhbnkgcGFydGljdWxhciBub2RlLiAgT0ssIHRoZSBwcmV2aW91cyBub2RlIG11c3QgYmUgdG8gb25lCisJICogc2lkZSBvZiB0aGUgaW50ZXJ2YWwgY29udGFpbmluZyB0aGUgZ29hbC4gIElmIGl0J3MgdGhlIFJIUywKKwkgKiB3ZSBuZWVkIHRvIGJhY2sgdXAgb25lLgorCSAqLworCWlmIChyc3YtPnJzdl9zdGFydCA+IGdvYWwpIHsKKwkJbiA9IHJiX3ByZXYoJnJzdi0+cnN2X25vZGUpOworCQlyc3YgPSByYl9lbnRyeShuLCBzdHJ1Y3QgZXh0NF9yZXNlcnZlX3dpbmRvd19ub2RlLCByc3Zfbm9kZSk7CisJfQorCXJldHVybiByc3Y7Cit9CisKKy8qKgorICogZXh0NF9yc3Zfd2luZG93X2FkZCgpIC0tIEluc2VydCBhIHdpbmRvdyB0byB0aGUgYmxvY2sgcmVzZXJ2YXRpb24gcmIgdHJlZS4KKyAqIEBzYjoJCQlzdXBlciBibG9jaworICogQHJzdjoJCXJlc2VydmF0aW9uIHdpbmRvdyB0byBhZGQKKyAqCisgKiBNdXN0IGJlIGNhbGxlZCB3aXRoIHJzdl9sb2NrIGhvbGQuCisgKi8KK3ZvaWQgZXh0NF9yc3Zfd2luZG93X2FkZChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLAorCQkgICAgc3RydWN0IGV4dDRfcmVzZXJ2ZV93aW5kb3dfbm9kZSAqcnN2KQoreworCXN0cnVjdCByYl9yb290ICpyb290ID0gJkVYVDRfU0Ioc2IpLT5zX3Jzdl93aW5kb3dfcm9vdDsKKwlzdHJ1Y3QgcmJfbm9kZSAqbm9kZSA9ICZyc3YtPnJzdl9ub2RlOworCWV4dDRfZnNibGtfdCBzdGFydCA9IHJzdi0+cnN2X3N0YXJ0OworCisJc3RydWN0IHJiX25vZGUgKiogcCA9ICZyb290LT5yYl9ub2RlOworCXN0cnVjdCByYl9ub2RlICogcGFyZW50ID0gTlVMTDsKKwlzdHJ1Y3QgZXh0NF9yZXNlcnZlX3dpbmRvd19ub2RlICp0aGlzOworCisJd2hpbGUgKCpwKQorCXsKKwkJcGFyZW50ID0gKnA7CisJCXRoaXMgPSByYl9lbnRyeShwYXJlbnQsIHN0cnVjdCBleHQ0X3Jlc2VydmVfd2luZG93X25vZGUsIHJzdl9ub2RlKTsKKworCQlpZiAoc3RhcnQgPCB0aGlzLT5yc3Zfc3RhcnQpCisJCQlwID0gJigqcCktPnJiX2xlZnQ7CisJCWVsc2UgaWYgKHN0YXJ0ID4gdGhpcy0+cnN2X2VuZCkKKwkJCXAgPSAmKCpwKS0+cmJfcmlnaHQ7CisJCWVsc2UgeworCQkJcnN2X3dpbmRvd19kdW1wKHJvb3QsIDEpOworCQkJQlVHKCk7CisJCX0KKwl9CisKKwlyYl9saW5rX25vZGUobm9kZSwgcGFyZW50LCBwKTsKKwlyYl9pbnNlcnRfY29sb3Iobm9kZSwgcm9vdCk7Cit9CisKKy8qKgorICogZXh0NF9yc3Zfd2luZG93X3JlbW92ZSgpIC0tIHVubGluayBhIHdpbmRvdyBmcm9tIHRoZSByZXNlcnZhdGlvbiByYiB0cmVlCisgKiBAc2I6CQkJc3VwZXIgYmxvY2sKKyAqIEByc3Y6CQlyZXNlcnZhdGlvbiB3aW5kb3cgdG8gcmVtb3ZlCisgKgorICogTWFyayB0aGUgYmxvY2sgcmVzZXJ2YXRpb24gd2luZG93IGFzIG5vdCBhbGxvY2F0ZWQsIGFuZCB1bmxpbmsgaXQKKyAqIGZyb20gdGhlIGZpbGVzeXN0ZW0gcmVzZXJ2YXRpb24gd2luZG93IHJiIHRyZWUuIE11c3QgYmUgY2FsbGVkIHdpdGgKKyAqIHJzdl9sb2NrIGhvbGQuCisgKi8KK3N0YXRpYyB2b2lkIHJzdl93aW5kb3dfcmVtb3ZlKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsCisJCQkgICAgICBzdHJ1Y3QgZXh0NF9yZXNlcnZlX3dpbmRvd19ub2RlICpyc3YpCit7CisJcnN2LT5yc3Zfc3RhcnQgPSBFWFQ0X1JFU0VSVkVfV0lORE9XX05PVF9BTExPQ0FURUQ7CisJcnN2LT5yc3ZfZW5kID0gRVhUNF9SRVNFUlZFX1dJTkRPV19OT1RfQUxMT0NBVEVEOworCXJzdi0+cnN2X2FsbG9jX2hpdCA9IDA7CisJcmJfZXJhc2UoJnJzdi0+cnN2X25vZGUsICZFWFQ0X1NCKHNiKS0+c19yc3Zfd2luZG93X3Jvb3QpOworfQorCisvKgorICogcnN2X2lzX2VtcHR5KCkgLS0gQ2hlY2sgaWYgdGhlIHJlc2VydmF0aW9uIHdpbmRvdyBpcyBhbGxvY2F0ZWQuCisgKiBAcnN2OgkJZ2l2ZW4gcmVzZXJ2YXRpb24gd2luZG93IHRvIGNoZWNrCisgKgorICogcmV0dXJucyAxIGlmIHRoZSBlbmQgYmxvY2sgaXMgRVhUNF9SRVNFUlZFX1dJTkRPV19OT1RfQUxMT0NBVEVELgorICovCitzdGF0aWMgaW5saW5lIGludCByc3ZfaXNfZW1wdHkoc3RydWN0IGV4dDRfcmVzZXJ2ZV93aW5kb3cgKnJzdikKK3sKKwkvKiBhIHZhbGlkIHJlc2VydmF0aW9uIGVuZCBibG9jayBjb3VsZCBub3QgYmUgMCAqLworCXJldHVybiByc3YtPl9yc3ZfZW5kID09IEVYVDRfUkVTRVJWRV9XSU5ET1dfTk9UX0FMTE9DQVRFRDsKK30KKworLyoqCisgKiBleHQ0X2luaXRfYmxvY2tfYWxsb2NfaW5mbygpCisgKiBAaW5vZGU6CQlmaWxlIGlub2RlIHN0cnVjdHVyZQorICoKKyAqIEFsbG9jYXRlIGFuZCBpbml0aWFsaXplIHRoZQlyZXNlcnZhdGlvbiB3aW5kb3cgc3RydWN0dXJlLCBhbmQKKyAqIGxpbmsgdGhlIHdpbmRvdyB0byB0aGUgZXh0NCBpbm9kZSBzdHJ1Y3R1cmUgYXQgbGFzdAorICoKKyAqIFRoZSByZXNlcnZhdGlvbiB3aW5kb3cgc3RydWN0dXJlIGlzIG9ubHkgZHluYW1pY2FsbHkgYWxsb2NhdGVkCisgKiBhbmQgbGlua2VkIHRvIGV4dDQgaW5vZGUgdGhlIGZpcnN0IHRpbWUgdGhlIG9wZW4gZmlsZQorICogbmVlZHMgYSBuZXcgYmxvY2suIFNvLCBiZWZvcmUgZXZlcnkgZXh0NF9uZXdfYmxvY2socykgY2FsbCwgZm9yCisgKiByZWd1bGFyIGZpbGVzLCB3ZSBzaG91bGQgY2hlY2sgd2hldGhlciB0aGUgcmVzZXJ2YXRpb24gd2luZG93CisgKiBzdHJ1Y3R1cmUgZXhpc3RzIG9yIG5vdC4gSW4gdGhlIGxhdHRlciBjYXNlLCB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZC4KKyAqIEZhaWwgdG8gZG8gc28gd2lsbCByZXN1bHQgaW4gYmxvY2sgcmVzZXJ2YXRpb24gYmVpbmcgdHVybmVkIG9mZiBmb3IgdGhhdAorICogb3BlbiBmaWxlLgorICoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGZyb20gZXh0NF9nZXRfYmxvY2tzX2hhbmRsZSgpLCBhbHNvIGNhbGxlZAorICogd2hlbiBzZXR0aW5nIHRoZSByZXNlcnZhdGlvbiB3aW5kb3cgc2l6ZSB0aHJvdWdoIGlvY3RsIGJlZm9yZSB0aGUgZmlsZQorICogaXMgb3BlbiBmb3Igd3JpdGUgKG5lZWRzIGJsb2NrIGFsbG9jYXRpb24pLgorICoKKyAqIE5lZWRzIHRydW5jYXRlX211dGV4IHByb3RlY3Rpb24gcHJpb3IgdG8gY2FsbCB0aGlzIGZ1bmN0aW9uLgorICovCit2b2lkIGV4dDRfaW5pdF9ibG9ja19hbGxvY19pbmZvKHN0cnVjdCBpbm9kZSAqaW5vZGUpCit7CisJc3RydWN0IGV4dDRfaW5vZGVfaW5mbyAqZWkgPSBFWFQ0X0koaW5vZGUpOworCXN0cnVjdCBleHQ0X2Jsb2NrX2FsbG9jX2luZm8gKmJsb2NrX2kgPSBlaS0+aV9ibG9ja19hbGxvY19pbmZvOworCXN0cnVjdCBzdXBlcl9ibG9jayAqc2IgPSBpbm9kZS0+aV9zYjsKKworCWJsb2NrX2kgPSBrbWFsbG9jKHNpemVvZigqYmxvY2tfaSksIEdGUF9OT0ZTKTsKKwlpZiAoYmxvY2tfaSkgeworCQlzdHJ1Y3QgZXh0NF9yZXNlcnZlX3dpbmRvd19ub2RlICpyc3YgPSAmYmxvY2tfaS0+cnN2X3dpbmRvd19ub2RlOworCisJCXJzdi0+cnN2X3N0YXJ0ID0gRVhUNF9SRVNFUlZFX1dJTkRPV19OT1RfQUxMT0NBVEVEOworCQlyc3YtPnJzdl9lbmQgPSBFWFQ0X1JFU0VSVkVfV0lORE9XX05PVF9BTExPQ0FURUQ7CisKKwkJLyoKKwkJICogaWYgZmlsZXN5c3RlbSBpcyBtb3VudGVkIHdpdGggTk9SRVNFUlZBVElPTiwgdGhlIGdvYWwKKwkJICogcmVzZXJ2YXRpb24gd2luZG93IHNpemUgaXMgc2V0IHRvIHplcm8gdG8gaW5kaWNhdGUKKwkJICogYmxvY2sgcmVzZXJ2YXRpb24gaXMgb2ZmCisJCSAqLworCQlpZiAoIXRlc3Rfb3B0KHNiLCBSRVNFUlZBVElPTikpCisJCQlyc3YtPnJzdl9nb2FsX3NpemUgPSAwOworCQllbHNlCisJCQlyc3YtPnJzdl9nb2FsX3NpemUgPSBFWFQ0X0RFRkFVTFRfUkVTRVJWRV9CTE9DS1M7CisJCXJzdi0+cnN2X2FsbG9jX2hpdCA9IDA7CisJCWJsb2NrX2ktPmxhc3RfYWxsb2NfbG9naWNhbF9ibG9jayA9IDA7CisJCWJsb2NrX2ktPmxhc3RfYWxsb2NfcGh5c2ljYWxfYmxvY2sgPSAwOworCX0KKwllaS0+aV9ibG9ja19hbGxvY19pbmZvID0gYmxvY2tfaTsKK30KKworLyoqCisgKiBleHQ0X2Rpc2NhcmRfcmVzZXJ2YXRpb24oKQorICogQGlub2RlOgkJaW5vZGUKKyAqCisgKiBEaXNjYXJkKGZyZWUpIGJsb2NrIHJlc2VydmF0aW9uIHdpbmRvdyBvbiBsYXN0IGZpbGUgY2xvc2UsIG9yIHRydW5jYXRlCisgKiBvciBhdCBsYXN0IGlwdXQoKS4KKyAqCisgKiBJdCBpcyBiZWluZyBjYWxsZWQgaW4gdGhyZWUgY2FzZXM6CisgKglleHQ0X3JlbGVhc2VfZmlsZSgpOiBsYXN0IHdyaXRlciBjbG9zZSB0aGUgZmlsZQorICoJZXh0NF9jbGVhcl9pbm9kZSgpOiBsYXN0IGlwdXQoKSwgd2hlbiBub2JvZHkgbGluayB0byB0aGlzIGZpbGUuCisgKglleHQ0X3RydW5jYXRlKCk6IHdoZW4gdGhlIGJsb2NrIGluZGlyZWN0IG1hcCBpcyBhYm91dCB0byBjaGFuZ2UuCisgKgorICovCit2b2lkIGV4dDRfZGlzY2FyZF9yZXNlcnZhdGlvbihzdHJ1Y3QgaW5vZGUgKmlub2RlKQoreworCXN0cnVjdCBleHQ0X2lub2RlX2luZm8gKmVpID0gRVhUNF9JKGlub2RlKTsKKwlzdHJ1Y3QgZXh0NF9ibG9ja19hbGxvY19pbmZvICpibG9ja19pID0gZWktPmlfYmxvY2tfYWxsb2NfaW5mbzsKKwlzdHJ1Y3QgZXh0NF9yZXNlcnZlX3dpbmRvd19ub2RlICpyc3Y7CisJc3BpbmxvY2tfdCAqcnN2X2xvY2sgPSAmRVhUNF9TQihpbm9kZS0+aV9zYiktPnNfcnN2X3dpbmRvd19sb2NrOworCisJaWYgKCFibG9ja19pKQorCQlyZXR1cm47CisKKwlyc3YgPSAmYmxvY2tfaS0+cnN2X3dpbmRvd19ub2RlOworCWlmICghcnN2X2lzX2VtcHR5KCZyc3YtPnJzdl93aW5kb3cpKSB7CisJCXNwaW5fbG9jayhyc3ZfbG9jayk7CisJCWlmICghcnN2X2lzX2VtcHR5KCZyc3YtPnJzdl93aW5kb3cpKQorCQkJcnN2X3dpbmRvd19yZW1vdmUoaW5vZGUtPmlfc2IsIHJzdik7CisJCXNwaW5fdW5sb2NrKHJzdl9sb2NrKTsKKwl9Cit9CisKKy8qKgorICogZXh0NF9mcmVlX2Jsb2Nrc19zYigpIC0tIEZyZWUgZ2l2ZW4gYmxvY2tzIGFuZCB1cGRhdGUgcXVvdGEKKyAqIEBoYW5kbGU6CQkJaGFuZGxlIHRvIHRoaXMgdHJhbnNhY3Rpb24KKyAqIEBzYjoJCQkJc3VwZXIgYmxvY2sKKyAqIEBibG9jazoJCQlzdGFydCBwaHlzY2lhbCBibG9jayB0byBmcmVlCisgKiBAY291bnQ6CQkJbnVtYmVyIG9mIGJsb2NrcyB0byBmcmVlCisgKiBAcGRxdW90X2ZyZWVkX2Jsb2NrczoJcG9pbnRlciB0byBxdW90YQorICovCit2b2lkIGV4dDRfZnJlZV9ibG9ja3Nfc2IoaGFuZGxlX3QgKmhhbmRsZSwgc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwKKwkJCSBleHQ0X2ZzYmxrX3QgYmxvY2ssIHVuc2lnbmVkIGxvbmcgY291bnQsCisJCQkgdW5zaWduZWQgbG9uZyAqcGRxdW90X2ZyZWVkX2Jsb2NrcykKK3sKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJpdG1hcF9iaCA9IE5VTEw7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpnZF9iaDsKKwl1bnNpZ25lZCBsb25nIGJsb2NrX2dyb3VwOworCWV4dDRfZ3JwYmxrX3QgYml0OworCXVuc2lnbmVkIGxvbmcgaTsKKwl1bnNpZ25lZCBsb25nIG92ZXJmbG93OworCXN0cnVjdCBleHQ0X2dyb3VwX2Rlc2MgKiBkZXNjOworCXN0cnVjdCBleHQ0X3N1cGVyX2Jsb2NrICogZXM7CisJc3RydWN0IGV4dDRfc2JfaW5mbyAqc2JpOworCWludCBlcnIgPSAwLCByZXQ7CisJZXh0NF9ncnBibGtfdCBncm91cF9mcmVlZDsKKworCSpwZHF1b3RfZnJlZWRfYmxvY2tzID0gMDsKKwlzYmkgPSBFWFQ0X1NCKHNiKTsKKwllcyA9IHNiaS0+c19lczsKKwlpZiAoYmxvY2sgPCBsZTMyX3RvX2NwdShlcy0+c19maXJzdF9kYXRhX2Jsb2NrKSB8fAorCSAgICBibG9jayArIGNvdW50IDwgYmxvY2sgfHwKKwkgICAgYmxvY2sgKyBjb3VudCA+IGV4dDRfYmxvY2tzX2NvdW50KGVzKSkgeworCQlleHQ0X2Vycm9yIChzYiwgImV4dDRfZnJlZV9ibG9ja3MiLAorCQkJICAgICJGcmVlaW5nIGJsb2NrcyBub3QgaW4gZGF0YXpvbmUgLSAiCisJCQkgICAgImJsb2NrID0gJWxsdSwgY291bnQgPSAlbHUiLCBibG9jaywgY291bnQpOworCQlnb3RvIGVycm9yX3JldHVybjsKKwl9CisKKwlleHQ0X2RlYnVnICgiZnJlZWluZyBibG9jayhzKSAlbGx1LSVsbHVcbiIsIGJsb2NrLCBibG9jayArIGNvdW50IC0gMSk7CisKK2RvX21vcmU6CisJb3ZlcmZsb3cgPSAwOworCWV4dDRfZ2V0X2dyb3VwX25vX2FuZF9vZmZzZXQoc2IsIGJsb2NrLCAmYmxvY2tfZ3JvdXAsICZiaXQpOworCS8qCisJICogQ2hlY2sgdG8gc2VlIGlmIHdlIGFyZSBmcmVlaW5nIGJsb2NrcyBhY3Jvc3MgYSBncm91cAorCSAqIGJvdW5kYXJ5LgorCSAqLworCWlmIChiaXQgKyBjb3VudCA+IEVYVDRfQkxPQ0tTX1BFUl9HUk9VUChzYikpIHsKKwkJb3ZlcmZsb3cgPSBiaXQgKyBjb3VudCAtIEVYVDRfQkxPQ0tTX1BFUl9HUk9VUChzYik7CisJCWNvdW50IC09IG92ZXJmbG93OworCX0KKwlicmVsc2UoYml0bWFwX2JoKTsKKwliaXRtYXBfYmggPSByZWFkX2Jsb2NrX2JpdG1hcChzYiwgYmxvY2tfZ3JvdXApOworCWlmICghYml0bWFwX2JoKQorCQlnb3RvIGVycm9yX3JldHVybjsKKwlkZXNjID0gZXh0NF9nZXRfZ3JvdXBfZGVzYyAoc2IsIGJsb2NrX2dyb3VwLCAmZ2RfYmgpOworCWlmICghZGVzYykKKwkJZ290byBlcnJvcl9yZXR1cm47CisKKwlpZiAoaW5fcmFuZ2UoZXh0NF9ibG9ja19iaXRtYXAoc2IsIGRlc2MpLCBibG9jaywgY291bnQpIHx8CisJICAgIGluX3JhbmdlKGV4dDRfaW5vZGVfYml0bWFwKHNiLCBkZXNjKSwgYmxvY2ssIGNvdW50KSB8fAorCSAgICBpbl9yYW5nZShibG9jaywgZXh0NF9pbm9kZV90YWJsZShzYiwgZGVzYyksIHNiaS0+c19pdGJfcGVyX2dyb3VwKSB8fAorCSAgICBpbl9yYW5nZShibG9jayArIGNvdW50IC0gMSwgZXh0NF9pbm9kZV90YWJsZShzYiwgZGVzYyksCisJCSAgICAgc2JpLT5zX2l0Yl9wZXJfZ3JvdXApKQorCQlleHQ0X2Vycm9yIChzYiwgImV4dDRfZnJlZV9ibG9ja3MiLAorCQkJICAgICJGcmVlaW5nIGJsb2NrcyBpbiBzeXN0ZW0gem9uZXMgLSAiCisJCQkgICAgIkJsb2NrID0gJWxsdSwgY291bnQgPSAlbHUiLAorCQkJICAgIGJsb2NrLCBjb3VudCk7CisKKwkvKgorCSAqIFdlIGFyZSBhYm91dCB0byBzdGFydCByZWxlYXNpbmcgYmxvY2tzIGluIHRoZSBiaXRtYXAsCisJICogc28gd2UgbmVlZCB1bmRvIGFjY2Vzcy4KKwkgKi8KKwkvKiBAQEAgY2hlY2sgZXJyb3JzICovCisJQlVGRkVSX1RSQUNFKGJpdG1hcF9iaCwgImdldHRpbmcgdW5kbyBhY2Nlc3MiKTsKKwllcnIgPSBleHQ0X2pvdXJuYWxfZ2V0X3VuZG9fYWNjZXNzKGhhbmRsZSwgYml0bWFwX2JoKTsKKwlpZiAoZXJyKQorCQlnb3RvIGVycm9yX3JldHVybjsKKworCS8qCisJICogV2UgYXJlIGFib3V0IHRvIG1vZGlmeSBzb21lIG1ldGFkYXRhLiAgQ2FsbCB0aGUgam91cm5hbCBBUElzCisJICogdG8gdW5zaGFyZSAtPmJfZGF0YSBpZiBhIGN1cnJlbnRseS1jb21taXR0aW5nIHRyYW5zYWN0aW9uIGlzCisJICogdXNpbmcgaXQKKwkgKi8KKwlCVUZGRVJfVFJBQ0UoZ2RfYmgsICJnZXRfd3JpdGVfYWNjZXNzIik7CisJZXJyID0gZXh0NF9qb3VybmFsX2dldF93cml0ZV9hY2Nlc3MoaGFuZGxlLCBnZF9iaCk7CisJaWYgKGVycikKKwkJZ290byBlcnJvcl9yZXR1cm47CisKKwlqYmRfbG9ja19iaF9zdGF0ZShiaXRtYXBfYmgpOworCisJZm9yIChpID0gMCwgZ3JvdXBfZnJlZWQgPSAwOyBpIDwgY291bnQ7IGkrKykgeworCQkvKgorCQkgKiBBbiBISiBzcGVjaWFsLiAgVGhpcyBpcyBleHBlbnNpdmUuLi4KKwkJICovCisjaWZkZWYgQ09ORklHX0pCRF9ERUJVRworCQlqYmRfdW5sb2NrX2JoX3N0YXRlKGJpdG1hcF9iaCk7CisJCXsKKwkJCXN0cnVjdCBidWZmZXJfaGVhZCAqZGVidWdfYmg7CisJCQlkZWJ1Z19iaCA9IHNiX2ZpbmRfZ2V0X2Jsb2NrKHNiLCBibG9jayArIGkpOworCQkJaWYgKGRlYnVnX2JoKSB7CisJCQkJQlVGRkVSX1RSQUNFKGRlYnVnX2JoLCAiRGVsZXRlZCEiKTsKKwkJCQlpZiAoIWJoMmpoKGJpdG1hcF9iaCktPmJfY29tbWl0dGVkX2RhdGEpCisJCQkJCUJVRkZFUl9UUkFDRShkZWJ1Z19iaCwKKwkJCQkJCSJObyBjb21taXRlZCBkYXRhIGluIGJpdG1hcCIpOworCQkJCUJVRkZFUl9UUkFDRTIoZGVidWdfYmgsIGJpdG1hcF9iaCwgImJpdG1hcCIpOworCQkJCV9fYnJlbHNlKGRlYnVnX2JoKTsKKwkJCX0KKwkJfQorCQlqYmRfbG9ja19iaF9zdGF0ZShiaXRtYXBfYmgpOworI2VuZGlmCisJCWlmIChuZWVkX3Jlc2NoZWQoKSkgeworCQkJamJkX3VubG9ja19iaF9zdGF0ZShiaXRtYXBfYmgpOworCQkJY29uZF9yZXNjaGVkKCk7CisJCQlqYmRfbG9ja19iaF9zdGF0ZShiaXRtYXBfYmgpOworCQl9CisJCS8qIEBAQCBUaGlzIHByZXZlbnRzIG5ld2x5LWFsbG9jYXRlZCBkYXRhIGZyb20gYmVpbmcKKwkJICogZnJlZWQgYW5kIHRoZW4gcmVhbGxvY2F0ZWQgd2l0aGluIHRoZSBzYW1lCisJCSAqIHRyYW5zYWN0aW9uLgorCQkgKgorCQkgKiBJZGVhbGx5IHdlIHdvdWxkIHdhbnQgdG8gYWxsb3cgdGhhdCB0byBoYXBwZW4sIGJ1dCB0bworCQkgKiBkbyBzbyByZXF1aXJlcyBtYWtpbmcgamJkMl9qb3VybmFsX2ZvcmdldCgpIGNhcGFibGUgb2YKKwkJICogcmV2b2tpbmcgdGhlIHF1ZXVlZCB3cml0ZSBvZiBhIGRhdGEgYmxvY2ssIHdoaWNoCisJCSAqIGltcGxpZXMgYmxvY2tpbmcgb24gdGhlIGpvdXJuYWwgbG9jay4gICpmb3JnZXQoKQorCQkgKiBjYW5ub3QgYmxvY2sgZHVlIHRvIHRydW5jYXRlIHJhY2VzLgorCQkgKgorCQkgKiBFdmVudHVhbGx5IHdlIGNhbiBmaXggdGhpcyBieSBtYWtpbmcgamJkMl9qb3VybmFsX2ZvcmdldCgpCisJCSAqIHJldHVybiBhIHN0YXR1cyBpbmRpY2F0aW5nIHdoZXRoZXIgb3Igbm90IGl0IHdhcyBhYmxlCisJCSAqIHRvIHJldm9rZSB0aGUgYnVmZmVyLiAgT24gc3VjY2Vzc2Z1bCByZXZva2UsIGl0IGlzCisJCSAqIHNhZmUgbm90IHRvIHNldCB0aGUgYWxsb2NhdGlvbiBiaXQgaW4gdGhlIGNvbW1pdHRlZAorCQkgKiBiaXRtYXAsIGJlY2F1c2Ugd2Uga25vdyB0aGF0IHRoZXJlIGlzIG5vIG91dHN0YW5kaW5nCisJCSAqIGFjdGl2aXR5IG9uIHRoZSBidWZmZXIgYW55IG1vcmUgYW5kIHNvIGl0IGlzIHNhZmUgdG8KKwkJICogcmVhbGxvY2F0ZSBpdC4KKwkJICovCisJCUJVRkZFUl9UUkFDRShiaXRtYXBfYmgsICJzZXQgaW4gYl9jb21taXR0ZWRfZGF0YSIpOworCQlKX0FTU0VSVF9CSChiaXRtYXBfYmgsCisJCQkJYmgyamgoYml0bWFwX2JoKS0+Yl9jb21taXR0ZWRfZGF0YSAhPSBOVUxMKTsKKwkJZXh0NF9zZXRfYml0X2F0b21pYyhzYl9iZ2xfbG9jayhzYmksIGJsb2NrX2dyb3VwKSwgYml0ICsgaSwKKwkJCQliaDJqaChiaXRtYXBfYmgpLT5iX2NvbW1pdHRlZF9kYXRhKTsKKworCQkvKgorCQkgKiBXZSBjbGVhciB0aGUgYml0IGluIHRoZSBiaXRtYXAgYWZ0ZXIgc2V0dGluZyB0aGUgY29tbWl0dGVkCisJCSAqIGRhdGEgYml0LCBiZWNhdXNlIHRoaXMgaXMgdGhlIHJldmVyc2Ugb3JkZXIgdG8gdGhhdCB3aGljaAorCQkgKiB0aGUgYWxsb2NhdG9yIHVzZXMuCisJCSAqLworCQlCVUZGRVJfVFJBQ0UoYml0bWFwX2JoLCAiY2xlYXIgYml0Iik7CisJCWlmICghZXh0NF9jbGVhcl9iaXRfYXRvbWljKHNiX2JnbF9sb2NrKHNiaSwgYmxvY2tfZ3JvdXApLAorCQkJCQkJYml0ICsgaSwgYml0bWFwX2JoLT5iX2RhdGEpKSB7CisJCQlqYmRfdW5sb2NrX2JoX3N0YXRlKGJpdG1hcF9iaCk7CisJCQlleHQ0X2Vycm9yKHNiLCBfX0ZVTkNUSU9OX18sCisJCQkJICAgImJpdCBhbHJlYWR5IGNsZWFyZWQgZm9yIGJsb2NrICVsbHUiLAorCQkJCSAgIChleHQ0X2ZzYmxrX3QpKGJsb2NrICsgaSkpOworCQkJamJkX2xvY2tfYmhfc3RhdGUoYml0bWFwX2JoKTsKKwkJCUJVRkZFUl9UUkFDRShiaXRtYXBfYmgsICJiaXQgYWxyZWFkeSBjbGVhcmVkIik7CisJCX0gZWxzZSB7CisJCQlncm91cF9mcmVlZCsrOworCQl9CisJfQorCWpiZF91bmxvY2tfYmhfc3RhdGUoYml0bWFwX2JoKTsKKworCXNwaW5fbG9jayhzYl9iZ2xfbG9jayhzYmksIGJsb2NrX2dyb3VwKSk7CisJZGVzYy0+YmdfZnJlZV9ibG9ja3NfY291bnQgPQorCQljcHVfdG9fbGUxNihsZTE2X3RvX2NwdShkZXNjLT5iZ19mcmVlX2Jsb2Nrc19jb3VudCkgKworCQkJZ3JvdXBfZnJlZWQpOworCXNwaW5fdW5sb2NrKHNiX2JnbF9sb2NrKHNiaSwgYmxvY2tfZ3JvdXApKTsKKwlwZXJjcHVfY291bnRlcl9tb2QoJnNiaS0+c19mcmVlYmxvY2tzX2NvdW50ZXIsIGNvdW50KTsKKworCS8qIFdlIGRpcnRpZWQgdGhlIGJpdG1hcCBibG9jayAqLworCUJVRkZFUl9UUkFDRShiaXRtYXBfYmgsICJkaXJ0aWVkIGJpdG1hcCBibG9jayIpOworCWVyciA9IGV4dDRfam91cm5hbF9kaXJ0eV9tZXRhZGF0YShoYW5kbGUsIGJpdG1hcF9iaCk7CisKKwkvKiBBbmQgdGhlIGdyb3VwIGRlc2NyaXB0b3IgYmxvY2sgKi8KKwlCVUZGRVJfVFJBQ0UoZ2RfYmgsICJkaXJ0aWVkIGdyb3VwIGRlc2NyaXB0b3IgYmxvY2siKTsKKwlyZXQgPSBleHQ0X2pvdXJuYWxfZGlydHlfbWV0YWRhdGEoaGFuZGxlLCBnZF9iaCk7CisJaWYgKCFlcnIpIGVyciA9IHJldDsKKwkqcGRxdW90X2ZyZWVkX2Jsb2NrcyArPSBncm91cF9mcmVlZDsKKworCWlmIChvdmVyZmxvdyAmJiAhZXJyKSB7CisJCWJsb2NrICs9IGNvdW50OworCQljb3VudCA9IG92ZXJmbG93OworCQlnb3RvIGRvX21vcmU7CisJfQorCXNiLT5zX2RpcnQgPSAxOworZXJyb3JfcmV0dXJuOgorCWJyZWxzZShiaXRtYXBfYmgpOworCWV4dDRfc3RkX2Vycm9yKHNiLCBlcnIpOworCXJldHVybjsKK30KKworLyoqCisgKiBleHQ0X2ZyZWVfYmxvY2tzKCkgLS0gRnJlZSBnaXZlbiBibG9ja3MgYW5kIHVwZGF0ZSBxdW90YQorICogQGhhbmRsZToJCWhhbmRsZSBmb3IgdGhpcyB0cmFuc2FjdGlvbgorICogQGlub2RlOgkJaW5vZGUKKyAqIEBibG9jazoJCXN0YXJ0IHBoeXNpY2FsIGJsb2NrIHRvIGZyZWUKKyAqIEBjb3VudDoJCW51bWJlciBvZiBibG9ja3MgdG8gY291bnQKKyAqLwordm9pZCBleHQ0X2ZyZWVfYmxvY2tzKGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBpbm9kZSAqaW5vZGUsCisJCQlleHQ0X2ZzYmxrX3QgYmxvY2ssIHVuc2lnbmVkIGxvbmcgY291bnQpCit7CisJc3RydWN0IHN1cGVyX2Jsb2NrICogc2I7CisJdW5zaWduZWQgbG9uZyBkcXVvdF9mcmVlZF9ibG9ja3M7CisKKwlzYiA9IGlub2RlLT5pX3NiOworCWlmICghc2IpIHsKKwkJcHJpbnRrICgiZXh0NF9mcmVlX2Jsb2Nrczogbm9uZXhpc3RlbnQgZGV2aWNlIik7CisJCXJldHVybjsKKwl9CisJZXh0NF9mcmVlX2Jsb2Nrc19zYihoYW5kbGUsIHNiLCBibG9jaywgY291bnQsICZkcXVvdF9mcmVlZF9ibG9ja3MpOworCWlmIChkcXVvdF9mcmVlZF9ibG9ja3MpCisJCURRVU9UX0ZSRUVfQkxPQ0soaW5vZGUsIGRxdW90X2ZyZWVkX2Jsb2Nrcyk7CisJcmV0dXJuOworfQorCisvKioKKyAqIGV4dDRfdGVzdF9hbGxvY2F0YWJsZSgpCisgKiBAbnI6CQkJZ2l2ZW4gYWxsb2NhdGlvbiBibG9jayBncm91cAorICogQGJoOgkJCWJ1ZmZlcmhlYWQgY29udGFpbnMgdGhlIGJpdG1hcCBvZiB0aGUgZ2l2ZW4gYmxvY2sgZ3JvdXAKKyAqCisgKiBGb3IgZXh0NCBhbGxvY2F0aW9ucywgd2UgbXVzdCBub3QgcmV1c2UgYW55IGJsb2NrcyB3aGljaCBhcmUKKyAqIGFsbG9jYXRlZCBpbiB0aGUgYml0bWFwIGJ1ZmZlcidzICJsYXN0IGNvbW1pdHRlZCBkYXRhIiBjb3B5LiAgVGhpcworICogcHJldmVudHMgZGVsZXRlcyBmcm9tIGZyZWVpbmcgdXAgdGhlIHBhZ2UgZm9yIHJldXNlIHVudGlsIHdlIGhhdmUKKyAqIGNvbW1pdHRlZCB0aGUgZGVsZXRlIHRyYW5zYWN0aW9uLgorICoKKyAqIElmIHdlIGRpZG4ndCBkbyB0aGlzLCB0aGVuIGRlbGV0aW5nIHNvbWV0aGluZyBhbmQgcmVhbGxvY2F0aW5nIGl0IGFzCisgKiBkYXRhIHdvdWxkIGFsbG93IHRoZSBvbGQgYmxvY2sgdG8gYmUgb3ZlcndyaXR0ZW4gYmVmb3JlIHRoZQorICogdHJhbnNhY3Rpb24gY29tbWl0dGVkIChiZWNhdXNlIHdlIGZvcmNlIGRhdGEgdG8gZGlzayBiZWZvcmUgY29tbWl0KS4KKyAqIFRoaXMgd291bGQgbGVhZCB0byBjb3JydXB0aW9uIGlmIHdlIGNyYXNoZWQgYmV0d2VlbiBvdmVyd3JpdGluZyB0aGUKKyAqIGRhdGEgYW5kIGNvbW1pdHRpbmcgdGhlIGRlbGV0ZS4KKyAqCisgKiBAQEAgV2UgbWF5IHdhbnQgdG8gbWFrZSB0aGlzIGFsbG9jYXRpb24gYmVoYXZpb3VyIGNvbmRpdGlvbmFsIG9uCisgKiBkYXRhLXdyaXRlcyBhdCBzb21lIHBvaW50LCBhbmQgZGlzYWJsZSBpdCBmb3IgbWV0YWRhdGEgYWxsb2NhdGlvbnMgb3IKKyAqIHN5bmMtZGF0YSBpbm9kZXMuCisgKi8KK3N0YXRpYyBpbnQgZXh0NF90ZXN0X2FsbG9jYXRhYmxlKGV4dDRfZ3JwYmxrX3QgbnIsIHN0cnVjdCBidWZmZXJfaGVhZCAqYmgpCit7CisJaW50IHJldDsKKwlzdHJ1Y3Qgam91cm5hbF9oZWFkICpqaCA9IGJoMmpoKGJoKTsKKworCWlmIChleHQ0X3Rlc3RfYml0KG5yLCBiaC0+Yl9kYXRhKSkKKwkJcmV0dXJuIDA7CisKKwlqYmRfbG9ja19iaF9zdGF0ZShiaCk7CisJaWYgKCFqaC0+Yl9jb21taXR0ZWRfZGF0YSkKKwkJcmV0ID0gMTsKKwllbHNlCisJCXJldCA9ICFleHQ0X3Rlc3RfYml0KG5yLCBqaC0+Yl9jb21taXR0ZWRfZGF0YSk7CisJamJkX3VubG9ja19iaF9zdGF0ZShiaCk7CisJcmV0dXJuIHJldDsKK30KKworLyoqCisgKiBiaXRtYXBfc2VhcmNoX25leHRfdXNhYmxlX2Jsb2NrKCkKKyAqIEBzdGFydDoJCXRoZSBzdGFydGluZyBibG9jayAoZ3JvdXAgcmVsYXRpdmUpIG9mIHRoZSBzZWFyY2gKKyAqIEBiaDoJCQlidWZmZXJoZWFkIGNvbnRhaW5zIHRoZSBibG9jayBncm91cCBiaXRtYXAKKyAqIEBtYXhibG9ja3M6CQl0aGUgZW5kaW5nIGJsb2NrIChncm91cCByZWxhdGl2ZSkgb2YgdGhlIHJlc2VydmF0aW9uCisgKgorICogVGhlIGJpdG1hcCBzZWFyY2ggLS0tIHNlYXJjaCBmb3J3YXJkIGFsdGVybmF0ZWx5IHRocm91Z2ggdGhlIGFjdHVhbAorICogYml0bWFwIG9uIGRpc2sgYW5kIHRoZSBsYXN0LWNvbW1pdHRlZCBjb3B5IGluIGpvdXJuYWwsIHVudGlsIHdlIGZpbmQgYQorICogYml0IGZyZWUgaW4gYm90aCBiaXRtYXBzLgorICovCitzdGF0aWMgZXh0NF9ncnBibGtfdAorYml0bWFwX3NlYXJjaF9uZXh0X3VzYWJsZV9ibG9jayhleHQ0X2dycGJsa190IHN0YXJ0LCBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoLAorCQkJCQlleHQ0X2dycGJsa190IG1heGJsb2NrcykKK3sKKwlleHQ0X2dycGJsa190IG5leHQ7CisJc3RydWN0IGpvdXJuYWxfaGVhZCAqamggPSBiaDJqaChiaCk7CisKKwl3aGlsZSAoc3RhcnQgPCBtYXhibG9ja3MpIHsKKwkJbmV4dCA9IGV4dDRfZmluZF9uZXh0X3plcm9fYml0KGJoLT5iX2RhdGEsIG1heGJsb2Nrcywgc3RhcnQpOworCQlpZiAobmV4dCA+PSBtYXhibG9ja3MpCisJCQlyZXR1cm4gLTE7CisJCWlmIChleHQ0X3Rlc3RfYWxsb2NhdGFibGUobmV4dCwgYmgpKQorCQkJcmV0dXJuIG5leHQ7CisJCWpiZF9sb2NrX2JoX3N0YXRlKGJoKTsKKwkJaWYgKGpoLT5iX2NvbW1pdHRlZF9kYXRhKQorCQkJc3RhcnQgPSBleHQ0X2ZpbmRfbmV4dF96ZXJvX2JpdChqaC0+Yl9jb21taXR0ZWRfZGF0YSwKKwkJCQkJCQltYXhibG9ja3MsIG5leHQpOworCQlqYmRfdW5sb2NrX2JoX3N0YXRlKGJoKTsKKwl9CisJcmV0dXJuIC0xOworfQorCisvKioKKyAqIGZpbmRfbmV4dF91c2FibGVfYmxvY2soKQorICogQHN0YXJ0OgkJdGhlIHN0YXJ0aW5nIGJsb2NrIChncm91cCByZWxhdGl2ZSkgdG8gZmluZCBuZXh0CisgKgkJCWFsbG9jYXRhYmxlIGJsb2NrIGluIGJpdG1hcC4KKyAqIEBiaDoJCQlidWZmZXJoZWFkIGNvbnRhaW5zIHRoZSBibG9jayBncm91cCBiaXRtYXAKKyAqIEBtYXhibG9ja3M6CQl0aGUgZW5kaW5nIGJsb2NrIChncm91cCByZWxhdGl2ZSkgZm9yIHRoZSBzZWFyY2gKKyAqCisgKiBGaW5kIGFuIGFsbG9jYXRhYmxlIGJsb2NrIGluIGEgYml0bWFwLiAgV2UgaG9ub3IgYm90aCB0aGUgYml0bWFwIGFuZAorICogaXRzIGxhc3QtY29tbWl0dGVkIGNvcHkgKGlmIHRoYXQgZXhpc3RzKSwgYW5kIHBlcmZvcm0gdGhlICJtb3N0CisgKiBhcHByb3ByaWF0ZSBhbGxvY2F0aW9uIiBhbGdvcml0aG0gb2YgbG9va2luZyBmb3IgYSBmcmVlIGJsb2NrIG5lYXIKKyAqIHRoZSBpbml0aWFsIGdvYWw7IHRoZW4gZm9yIGEgZnJlZSBieXRlIHNvbWV3aGVyZSBpbiB0aGUgYml0bWFwOyB0aGVuCisgKiBmb3IgYW55IGZyZWUgYml0IGluIHRoZSBiaXRtYXAuCisgKi8KK3N0YXRpYyBleHQ0X2dycGJsa190CitmaW5kX25leHRfdXNhYmxlX2Jsb2NrKGV4dDRfZ3JwYmxrX3Qgc3RhcnQsIHN0cnVjdCBidWZmZXJfaGVhZCAqYmgsCisJCQlleHQ0X2dycGJsa190IG1heGJsb2NrcykKK3sKKwlleHQ0X2dycGJsa190IGhlcmUsIG5leHQ7CisJY2hhciAqcCwgKnI7CisKKwlpZiAoc3RhcnQgPiAwKSB7CisJCS8qCisJCSAqIFRoZSBnb2FsIHdhcyBvY2N1cGllZDsgc2VhcmNoIGZvcndhcmQgZm9yIGEgZnJlZQorCQkgKiBibG9jayB3aXRoaW4gdGhlIG5leHQgWFggYmxvY2tzLgorCQkgKgorCQkgKiBlbmRfZ29hbCBpcyBtb3JlIG9yIGxlc3MgcmFuZG9tLCBidXQgaXQgaGFzIHRvIGJlCisJCSAqIGxlc3MgdGhhbiBFWFQ0X0JMT0NLU19QRVJfR1JPVVAuIEFsaWduaW5nIHVwIHRvIHRoZQorCQkgKiBuZXh0IDY0LWJpdCBib3VuZGFyeSBpcyBzaW1wbGUuLgorCQkgKi8KKwkJZXh0NF9ncnBibGtfdCBlbmRfZ29hbCA9IChzdGFydCArIDYzKSAmIH42MzsKKwkJaWYgKGVuZF9nb2FsID4gbWF4YmxvY2tzKQorCQkJZW5kX2dvYWwgPSBtYXhibG9ja3M7CisJCWhlcmUgPSBleHQ0X2ZpbmRfbmV4dF96ZXJvX2JpdChiaC0+Yl9kYXRhLCBlbmRfZ29hbCwgc3RhcnQpOworCQlpZiAoaGVyZSA8IGVuZF9nb2FsICYmIGV4dDRfdGVzdF9hbGxvY2F0YWJsZShoZXJlLCBiaCkpCisJCQlyZXR1cm4gaGVyZTsKKwkJZXh0NF9kZWJ1ZygiQml0IG5vdCBmb3VuZCBuZWFyIGdvYWxcbiIpOworCX0KKworCWhlcmUgPSBzdGFydDsKKwlpZiAoaGVyZSA8IDApCisJCWhlcmUgPSAwOworCisJcCA9ICgoY2hhciAqKWJoLT5iX2RhdGEpICsgKGhlcmUgPj4gMyk7CisJciA9IG1lbXNjYW4ocCwgMCwgKG1heGJsb2NrcyAtIGhlcmUgKyA3KSA+PiAzKTsKKwluZXh0ID0gKHIgLSAoKGNoYXIgKiliaC0+Yl9kYXRhKSkgPDwgMzsKKworCWlmIChuZXh0IDwgbWF4YmxvY2tzICYmIG5leHQgPj0gc3RhcnQgJiYgZXh0NF90ZXN0X2FsbG9jYXRhYmxlKG5leHQsIGJoKSkKKwkJcmV0dXJuIG5leHQ7CisKKwkvKgorCSAqIFRoZSBiaXRtYXAgc2VhcmNoIC0tLSBzZWFyY2ggZm9yd2FyZCBhbHRlcm5hdGVseSB0aHJvdWdoIHRoZSBhY3R1YWwKKwkgKiBiaXRtYXAgYW5kIHRoZSBsYXN0LWNvbW1pdHRlZCBjb3B5IHVudGlsIHdlIGZpbmQgYSBiaXQgZnJlZSBpbgorCSAqIGJvdGgKKwkgKi8KKwloZXJlID0gYml0bWFwX3NlYXJjaF9uZXh0X3VzYWJsZV9ibG9jayhoZXJlLCBiaCwgbWF4YmxvY2tzKTsKKwlyZXR1cm4gaGVyZTsKK30KKworLyoqCisgKiBjbGFpbV9ibG9jaygpCisgKiBAYmxvY2s6CQl0aGUgZnJlZSBibG9jayAoZ3JvdXAgcmVsYXRpdmUpIHRvIGFsbG9jYXRlCisgKiBAYmg6CQkJdGhlIGJ1ZmZlcmhlYWQgY29udGFpbnRzIHRoZSBibG9jayBncm91cCBiaXRtYXAKKyAqCisgKiBXZSB0aGluayB3ZSBjYW4gYWxsb2NhdGUgdGhpcyBibG9jayBpbiB0aGlzIGJpdG1hcC4gIFRyeSB0byBzZXQgdGhlIGJpdC4KKyAqIElmIHRoYXQgc3VjY2VlZHMgdGhlbiBjaGVjayB0aGF0IG5vYm9keSBoYXMgYWxsb2NhdGVkIGFuZCB0aGVuIGZyZWVkIHRoZQorICogYmxvY2sgc2luY2Ugd2Ugc2F3IHRoYXQgaXMgd2FzIG5vdCBtYXJrZWQgaW4gYl9jb21taXR0ZWRfZGF0YS4gIElmIGl0IF93YXNfCisgKiBhbGxvY2F0ZWQgYW5kIGZyZWVkIHRoZW4gY2xlYXIgdGhlIGJpdCBpbiB0aGUgYml0bWFwIGFnYWluIGFuZCByZXR1cm4KKyAqIHplcm8gKGZhaWx1cmUpLgorICovCitzdGF0aWMgaW5saW5lIGludAorY2xhaW1fYmxvY2soc3BpbmxvY2tfdCAqbG9jaywgZXh0NF9ncnBibGtfdCBibG9jaywgc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCkKK3sKKwlzdHJ1Y3Qgam91cm5hbF9oZWFkICpqaCA9IGJoMmpoKGJoKTsKKwlpbnQgcmV0OworCisJaWYgKGV4dDRfc2V0X2JpdF9hdG9taWMobG9jaywgYmxvY2ssIGJoLT5iX2RhdGEpKQorCQlyZXR1cm4gMDsKKwlqYmRfbG9ja19iaF9zdGF0ZShiaCk7CisJaWYgKGpoLT5iX2NvbW1pdHRlZF9kYXRhICYmIGV4dDRfdGVzdF9iaXQoYmxvY2ssamgtPmJfY29tbWl0dGVkX2RhdGEpKSB7CisJCWV4dDRfY2xlYXJfYml0X2F0b21pYyhsb2NrLCBibG9jaywgYmgtPmJfZGF0YSk7CisJCXJldCA9IDA7CisJfSBlbHNlIHsKKwkJcmV0ID0gMTsKKwl9CisJamJkX3VubG9ja19iaF9zdGF0ZShiaCk7CisJcmV0dXJuIHJldDsKK30KKworLyoqCisgKiBleHQ0X3RyeV90b19hbGxvY2F0ZSgpCisgKiBAc2I6CQkJc3VwZXJibG9jaworICogQGhhbmRsZToJCWhhbmRsZSB0byB0aGlzIHRyYW5zYWN0aW9uCisgKiBAZ3JvdXA6CQlnaXZlbiBhbGxvY2F0aW9uIGJsb2NrIGdyb3VwCisgKiBAYml0bWFwX2JoOgkJYnVmZmVyaGVhZCBob2xkcyB0aGUgYmxvY2sgYml0bWFwCisgKiBAZ3JwX2dvYWw6CQlnaXZlbiB0YXJnZXQgYmxvY2sgd2l0aGluIHRoZSBncm91cAorICogQGNvdW50OgkJdGFyZ2V0IG51bWJlciBvZiBibG9ja3MgdG8gYWxsb2NhdGUKKyAqIEBteV9yc3Y6CQlyZXNlcnZhdGlvbiB3aW5kb3cKKyAqCisgKiBBdHRlbXB0IHRvIGFsbG9jYXRlIGJsb2NrcyB3aXRoaW4gYSBnaXZlIHJhbmdlLiBTZXQgdGhlIHJhbmdlIG9mIGFsbG9jYXRpb24KKyAqIGZpcnN0LCB0aGVuIGZpbmQgdGhlIGZpcnN0IGZyZWUgYml0KHMpIGZyb20gdGhlIGJpdG1hcCAod2l0aGluIHRoZSByYW5nZSksCisgKiBhbmQgYXQgbGFzdCwgYWxsb2NhdGUgdGhlIGJsb2NrcyBieSBjbGFpbWluZyB0aGUgZm91bmQgZnJlZSBiaXQgYXMgYWxsb2NhdGVkLgorICoKKyAqIFRvIHNldCB0aGUgcmFuZ2Ugb2YgdGhpcyBhbGxvY2F0aW9uOgorICoJaWYgdGhlcmUgaXMgYSByZXNlcnZhdGlvbiB3aW5kb3csIG9ubHkgdHJ5IHRvIGFsbG9jYXRlIGJsb2NrKHMpIGZyb20gdGhlCisgKglmaWxlJ3Mgb3duIHJlc2VydmF0aW9uIHdpbmRvdzsKKyAqCU90aGVyd2lzZSwgdGhlIGFsbG9jYXRpb24gcmFuZ2Ugc3RhcnRzIGZyb20gdGhlIGdpdmUgZ29hbCBibG9jaywgZW5kcyBhdAorICoJdGhlIGJsb2NrIGdyb3VwJ3MgbGFzdCBibG9jay4KKyAqCisgKiBJZiB3ZSBmYWlsZWQgdG8gYWxsb2NhdGUgdGhlIGRlc2lyZWQgYmxvY2sgdGhlbiB3ZSBtYXkgZW5kIHVwIGNyb3NzaW5nIHRvIGEKKyAqIG5ldyBiaXRtYXAuICBJbiB0aGF0IGNhc2Ugd2UgbXVzdCByZWxlYXNlIHdyaXRlIGFjY2VzcyB0byB0aGUgb2xkIG9uZSB2aWEKKyAqIGV4dDRfam91cm5hbF9yZWxlYXNlX2J1ZmZlcigpLCBlbHNlIHdlJ2xsIHJ1biBvdXQgb2YgY3JlZGl0cy4KKyAqLworc3RhdGljIGV4dDRfZ3JwYmxrX3QKK2V4dDRfdHJ5X3RvX2FsbG9jYXRlKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGhhbmRsZV90ICpoYW5kbGUsIGludCBncm91cCwKKwkJCXN0cnVjdCBidWZmZXJfaGVhZCAqYml0bWFwX2JoLCBleHQ0X2dycGJsa190IGdycF9nb2FsLAorCQkJdW5zaWduZWQgbG9uZyAqY291bnQsIHN0cnVjdCBleHQ0X3Jlc2VydmVfd2luZG93ICpteV9yc3YpCit7CisJZXh0NF9mc2Jsa190IGdyb3VwX2ZpcnN0X2Jsb2NrOworCWV4dDRfZ3JwYmxrX3Qgc3RhcnQsIGVuZDsKKwl1bnNpZ25lZCBsb25nIG51bSA9IDA7CisKKwkvKiB3ZSBkbyBhbGxvY2F0aW9uIHdpdGhpbiB0aGUgcmVzZXJ2YXRpb24gd2luZG93IGlmIHdlIGhhdmUgYSB3aW5kb3cgKi8KKwlpZiAobXlfcnN2KSB7CisJCWdyb3VwX2ZpcnN0X2Jsb2NrID0gZXh0NF9ncm91cF9maXJzdF9ibG9ja19ubyhzYiwgZ3JvdXApOworCQlpZiAobXlfcnN2LT5fcnN2X3N0YXJ0ID49IGdyb3VwX2ZpcnN0X2Jsb2NrKQorCQkJc3RhcnQgPSBteV9yc3YtPl9yc3Zfc3RhcnQgLSBncm91cF9maXJzdF9ibG9jazsKKwkJZWxzZQorCQkJLyogcmVzZXJ2YXRpb24gd2luZG93IGNyb3NzIGdyb3VwIGJvdW5kYXJ5ICovCisJCQlzdGFydCA9IDA7CisJCWVuZCA9IG15X3Jzdi0+X3Jzdl9lbmQgLSBncm91cF9maXJzdF9ibG9jayArIDE7CisJCWlmIChlbmQgPiBFWFQ0X0JMT0NLU19QRVJfR1JPVVAoc2IpKQorCQkJLyogcmVzZXJ2YXRpb24gd2luZG93IGNyb3NzZXMgZ3JvdXAgYm91bmRhcnkgKi8KKwkJCWVuZCA9IEVYVDRfQkxPQ0tTX1BFUl9HUk9VUChzYik7CisJCWlmICgoc3RhcnQgPD0gZ3JwX2dvYWwpICYmIChncnBfZ29hbCA8IGVuZCkpCisJCQlzdGFydCA9IGdycF9nb2FsOworCQllbHNlCisJCQlncnBfZ29hbCA9IC0xOworCX0gZWxzZSB7CisJCWlmIChncnBfZ29hbCA+IDApCisJCQlzdGFydCA9IGdycF9nb2FsOworCQllbHNlCisJCQlzdGFydCA9IDA7CisJCWVuZCA9IEVYVDRfQkxPQ0tTX1BFUl9HUk9VUChzYik7CisJfQorCisJQlVHX09OKHN0YXJ0ID4gRVhUNF9CTE9DS1NfUEVSX0dST1VQKHNiKSk7CisKK3JlcGVhdDoKKwlpZiAoZ3JwX2dvYWwgPCAwIHx8ICFleHQ0X3Rlc3RfYWxsb2NhdGFibGUoZ3JwX2dvYWwsIGJpdG1hcF9iaCkpIHsKKwkJZ3JwX2dvYWwgPSBmaW5kX25leHRfdXNhYmxlX2Jsb2NrKHN0YXJ0LCBiaXRtYXBfYmgsIGVuZCk7CisJCWlmIChncnBfZ29hbCA8IDApCisJCQlnb3RvIGZhaWxfYWNjZXNzOworCQlpZiAoIW15X3JzdikgeworCQkJaW50IGk7CisKKwkJCWZvciAoaSA9IDA7IGkgPCA3ICYmIGdycF9nb2FsID4gc3RhcnQgJiYKKwkJCQkJZXh0NF90ZXN0X2FsbG9jYXRhYmxlKGdycF9nb2FsIC0gMSwKKwkJCQkJCQkJYml0bWFwX2JoKTsKKwkJCQkJaSsrLCBncnBfZ29hbC0tKQorCQkJCTsKKwkJfQorCX0KKwlzdGFydCA9IGdycF9nb2FsOworCisJaWYgKCFjbGFpbV9ibG9jayhzYl9iZ2xfbG9jayhFWFQ0X1NCKHNiKSwgZ3JvdXApLAorCQlncnBfZ29hbCwgYml0bWFwX2JoKSkgeworCQkvKgorCQkgKiBUaGUgYmxvY2sgd2FzIGFsbG9jYXRlZCBieSBhbm90aGVyIHRocmVhZCwgb3IgaXQgd2FzCisJCSAqIGFsbG9jYXRlZCBhbmQgdGhlbiBmcmVlZCBieSBhbm90aGVyIHRocmVhZAorCQkgKi8KKwkJc3RhcnQrKzsKKwkJZ3JwX2dvYWwrKzsKKwkJaWYgKHN0YXJ0ID49IGVuZCkKKwkJCWdvdG8gZmFpbF9hY2Nlc3M7CisJCWdvdG8gcmVwZWF0OworCX0KKwludW0rKzsKKwlncnBfZ29hbCsrOworCXdoaWxlIChudW0gPCAqY291bnQgJiYgZ3JwX2dvYWwgPCBlbmQKKwkJJiYgZXh0NF90ZXN0X2FsbG9jYXRhYmxlKGdycF9nb2FsLCBiaXRtYXBfYmgpCisJCSYmIGNsYWltX2Jsb2NrKHNiX2JnbF9sb2NrKEVYVDRfU0Ioc2IpLCBncm91cCksCisJCQkJZ3JwX2dvYWwsIGJpdG1hcF9iaCkpIHsKKwkJbnVtKys7CisJCWdycF9nb2FsKys7CisJfQorCSpjb3VudCA9IG51bTsKKwlyZXR1cm4gZ3JwX2dvYWwgLSBudW07CitmYWlsX2FjY2VzczoKKwkqY291bnQgPSBudW07CisJcmV0dXJuIC0xOworfQorCisvKioKKyAqCWZpbmRfbmV4dF9yZXNlcnZhYmxlX3dpbmRvdygpOgorICoJCWZpbmQgYSByZXNlcnZhYmxlIHNwYWNlIHdpdGhpbiB0aGUgZ2l2ZW4gcmFuZ2UuCisgKgkJSXQgZG9lcyBub3QgYWxsb2NhdGUgdGhlIHJlc2VydmF0aW9uIHdpbmRvdyBmb3Igbm93OgorICoJCWFsbG9jX25ld19yZXNlcnZhdGlvbigpIHdpbGwgZG8gdGhlIHdvcmsgbGF0ZXIuCisgKgorICoJQHNlYXJjaF9oZWFkOiB0aGUgaGVhZCBvZiB0aGUgc2VhcmNoaW5nIGxpc3Q7CisgKgkJVGhpcyBpcyBub3QgbmVjZXNzYXJpbHkgdGhlIGxpc3QgaGVhZCBvZiB0aGUgd2hvbGUgZmlsZXN5c3RlbQorICoKKyAqCQlXZSBoYXZlIGJvdGggaGVhZCBhbmQgc3RhcnRfYmxvY2sgdG8gYXNzaXN0IHRoZSBzZWFyY2gKKyAqCQlmb3IgdGhlIHJlc2VydmFibGUgc3BhY2UuIFRoZSBsaXN0IHN0YXJ0cyBmcm9tIGhlYWQsCisgKgkJYnV0IHdlIHdpbGwgc2hpZnQgdG8gdGhlIHBsYWNlIHdoZXJlIHN0YXJ0X2Jsb2NrIGlzLAorICoJCXRoZW4gc3RhcnQgZnJvbSB0aGVyZSwgd2hlbiBsb29raW5nIGZvciBhIHJlc2VydmFibGUgc3BhY2UuCisgKgorICoJQHNpemU6IHRoZSB0YXJnZXQgbmV3IHJlc2VydmF0aW9uIHdpbmRvdyBzaXplCisgKgorICoJQGdyb3VwX2ZpcnN0X2Jsb2NrOiB0aGUgZmlyc3QgYmxvY2sgd2UgY29uc2lkZXIgdG8gc3RhcnQKKyAqCQkJdGhlIHJlYWwgc2VhcmNoIGZyb20KKyAqCisgKglAbGFzdF9ibG9jazoKKyAqCQl0aGUgbWF4aW11bSBibG9jayBudW1iZXIgdGhhdCBvdXIgZ29hbCByZXNlcnZhYmxlIHNwYWNlCisgKgkJY291bGQgc3RhcnQgZnJvbS4gVGhpcyBpcyBub3JtYWxseSB0aGUgbGFzdCBibG9jayBpbiB0aGlzCisgKgkJZ3JvdXAuIFRoZSBzZWFyY2ggd2lsbCBlbmQgd2hlbiB3ZSBmb3VuZCB0aGUgc3RhcnQgb2YgbmV4dAorICoJCXBvc3NpYmxlIHJlc2VydmFibGUgc3BhY2UgaXMgb3V0IG9mIHRoaXMgYm91bmRhcnkuCisgKgkJVGhpcyBjb3VsZCBoYW5kbGUgdGhlIGNyb3NzIGJvdW5kYXJ5IHJlc2VydmF0aW9uIHdpbmRvdworICoJCXJlcXVlc3QuCisgKgorICoJYmFzaWNhbGx5IHdlIHNlYXJjaCBmcm9tIHRoZSBnaXZlbiByYW5nZSwgcmF0aGVyIHRoYW4gdGhlIHdob2xlCisgKglyZXNlcnZhdGlvbiBkb3VibGUgbGlua2VkIGxpc3QsIChzdGFydF9ibG9jaywgbGFzdF9ibG9jaykKKyAqCXRvIGZpbmQgYSBmcmVlIHJlZ2lvbiB0aGF0IGlzIG9mIG15IHNpemUgYW5kIGhhcyBub3QKKyAqCWJlZW4gcmVzZXJ2ZWQuCisgKgorICovCitzdGF0aWMgaW50IGZpbmRfbmV4dF9yZXNlcnZhYmxlX3dpbmRvdygKKwkJCQlzdHJ1Y3QgZXh0NF9yZXNlcnZlX3dpbmRvd19ub2RlICpzZWFyY2hfaGVhZCwKKwkJCQlzdHJ1Y3QgZXh0NF9yZXNlcnZlX3dpbmRvd19ub2RlICpteV9yc3YsCisJCQkJc3RydWN0IHN1cGVyX2Jsb2NrICogc2IsCisJCQkJZXh0NF9mc2Jsa190IHN0YXJ0X2Jsb2NrLAorCQkJCWV4dDRfZnNibGtfdCBsYXN0X2Jsb2NrKQoreworCXN0cnVjdCByYl9ub2RlICpuZXh0OworCXN0cnVjdCBleHQ0X3Jlc2VydmVfd2luZG93X25vZGUgKnJzdiwgKnByZXY7CisJZXh0NF9mc2Jsa190IGN1cjsKKwlpbnQgc2l6ZSA9IG15X3Jzdi0+cnN2X2dvYWxfc2l6ZTsKKworCS8qIFRPRE86IG1ha2UgdGhlIHN0YXJ0IG9mIHRoZSByZXNlcnZhdGlvbiB3aW5kb3cgYnl0ZS1hbGlnbmVkICovCisJLyogY3VyID0gKnN0YXJ0X2Jsb2NrICYgfjc7Ki8KKwljdXIgPSBzdGFydF9ibG9jazsKKwlyc3YgPSBzZWFyY2hfaGVhZDsKKwlpZiAoIXJzdikKKwkJcmV0dXJuIC0xOworCisJd2hpbGUgKDEpIHsKKwkJaWYgKGN1ciA8PSByc3YtPnJzdl9lbmQpCisJCQljdXIgPSByc3YtPnJzdl9lbmQgKyAxOworCisJCS8qIFRPRE8/CisJCSAqIGluIHRoZSBjYXNlIHdlIGNvdWxkIG5vdCBmaW5kIGEgcmVzZXJ2YWJsZSBzcGFjZQorCQkgKiB0aGF0IGlzIHdoYXQgaXMgZXhwZWN0ZWQsIGR1cmluZyB0aGUgcmUtc2VhcmNoLCB3ZSBjb3VsZAorCQkgKiByZW1lbWJlciB3aGF0J3MgdGhlIGxhcmdlc3QgcmVzZXJ2YWJsZSBzcGFjZSB3ZSBjb3VsZCBoYXZlCisJCSAqIGFuZCByZXR1cm4gdGhhdCBvbmUuCisJCSAqCisJCSAqIEZvciBub3cgaXQgd2lsbCBmYWlsIGlmIHdlIGNvdWxkIG5vdCBmaW5kIHRoZSByZXNlcnZhYmxlCisJCSAqIHNwYWNlIHdpdGggZXhwZWN0ZWQtc2l6ZSAob3IgbW9yZSkuLi4KKwkJICovCisJCWlmIChjdXIgPiBsYXN0X2Jsb2NrKQorCQkJcmV0dXJuIC0xOwkJLyogZmFpbCAqLworCisJCXByZXYgPSByc3Y7CisJCW5leHQgPSByYl9uZXh0KCZyc3YtPnJzdl9ub2RlKTsKKwkJcnN2ID0gbGlzdF9lbnRyeShuZXh0LHN0cnVjdCBleHQ0X3Jlc2VydmVfd2luZG93X25vZGUscnN2X25vZGUpOworCisJCS8qCisJCSAqIFJlYWNoZWQgdGhlIGxhc3QgcmVzZXJ2YXRpb24sIHdlIGNhbiBqdXN0IGFwcGVuZCB0byB0aGUKKwkJICogcHJldmlvdXMgb25lLgorCQkgKi8KKwkJaWYgKCFuZXh0KQorCQkJYnJlYWs7CisKKwkJaWYgKGN1ciArIHNpemUgPD0gcnN2LT5yc3Zfc3RhcnQpIHsKKwkJCS8qCisJCQkgKiBGb3VuZCBhIHJlc2VydmVhYmxlIHNwYWNlIGJpZyBlbm91Z2guICBXZSBjb3VsZAorCQkJICogaGF2ZSBhIHJlc2VydmF0aW9uIGFjcm9zcyB0aGUgZ3JvdXAgYm91bmRhcnkgaGVyZQorCQkJICovCisJCQlicmVhazsKKwkJfQorCX0KKwkvKgorCSAqIHdlIGNvbWUgaGVyZSBlaXRoZXIgOgorCSAqIHdoZW4gd2UgcmVhY2ggdGhlIGVuZCBvZiB0aGUgd2hvbGUgbGlzdCwKKwkgKiBhbmQgdGhlcmUgaXMgZW1wdHkgcmVzZXJ2YWJsZSBzcGFjZSBhZnRlciBsYXN0IGVudHJ5IGluIHRoZSBsaXN0LgorCSAqIGFwcGVuZCBpdCB0byB0aGUgZW5kIG9mIHRoZSBsaXN0LgorCSAqCisJICogb3Igd2UgZm91bmQgb25lIHJlc2VydmFibGUgc3BhY2UgaW4gdGhlIG1pZGRsZSBvZiB0aGUgbGlzdCwKKwkgKiByZXR1cm4gdGhlIHJlc2VydmF0aW9uIHdpbmRvdyB0aGF0IHdlIGNvdWxkIGFwcGVuZCB0by4KKwkgKiBzdWNjZWVkLgorCSAqLworCisJaWYgKChwcmV2ICE9IG15X3JzdikgJiYgKCFyc3ZfaXNfZW1wdHkoJm15X3Jzdi0+cnN2X3dpbmRvdykpKQorCQlyc3Zfd2luZG93X3JlbW92ZShzYiwgbXlfcnN2KTsKKworCS8qCisJICogTGV0J3MgYm9vayB0aGUgd2hvbGUgYXZhbGlhYmxlIHdpbmRvdyBmb3Igbm93LiAgV2Ugd2lsbCBjaGVjayB0aGUKKwkgKiBkaXNrIGJpdG1hcCBsYXRlciBhbmQgdGhlbiwgaWYgdGhlcmUgYXJlIGZyZWUgYmxvY2tzIHRoZW4gd2UgYWRqdXN0CisJICogdGhlIHdpbmRvdyBzaXplIGlmIGl0J3MgbGFyZ2VyIHRoYW4gcmVxdWVzdGVkLgorCSAqIE90aGVyd2lzZSwgd2Ugd2lsbCByZW1vdmUgdGhpcyBub2RlIGZyb20gdGhlIHRyZWUgbmV4dCB0aW1lCisJICogY2FsbCBmaW5kX25leHRfcmVzZXJ2YWJsZV93aW5kb3cuCisJICovCisJbXlfcnN2LT5yc3Zfc3RhcnQgPSBjdXI7CisJbXlfcnN2LT5yc3ZfZW5kID0gY3VyICsgc2l6ZSAtIDE7CisJbXlfcnN2LT5yc3ZfYWxsb2NfaGl0ID0gMDsKKworCWlmIChwcmV2ICE9IG15X3JzdikKKwkJZXh0NF9yc3Zfd2luZG93X2FkZChzYiwgbXlfcnN2KTsKKworCXJldHVybiAwOworfQorCisvKioKKyAqCWFsbG9jX25ld19yZXNlcnZhdGlvbigpLS1hbGxvY2F0ZSBhIG5ldyByZXNlcnZhdGlvbiB3aW5kb3cKKyAqCisgKgkJVG8gbWFrZSBhIG5ldyByZXNlcnZhdGlvbiwgd2Ugc2VhcmNoIHBhcnQgb2YgdGhlIGZpbGVzeXN0ZW0KKyAqCQlyZXNlcnZhdGlvbiBsaXN0ICh0aGUgbGlzdCB0aGF0IGluc2lkZSB0aGUgZ3JvdXApLiBXZSB0cnkgdG8KKyAqCQlhbGxvY2F0ZSBhIG5ldyByZXNlcnZhdGlvbiB3aW5kb3cgbmVhciB0aGUgYWxsb2NhdGlvbiBnb2FsLAorICoJCW9yIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGdyb3VwLCBpZiB0aGVyZSBpcyBubyBnb2FsLgorICoKKyAqCQlXZSBmaXJzdCBmaW5kIGEgcmVzZXJ2YWJsZSBzcGFjZSBhZnRlciB0aGUgZ29hbCwgdGhlbiBmcm9tCisgKgkJdGhlcmUsIHdlIGNoZWNrIHRoZSBiaXRtYXAgZm9yIHRoZSBmaXJzdCBmcmVlIGJsb2NrIGFmdGVyCisgKgkJaXQuIElmIHRoZXJlIGlzIG5vIGZyZWUgYmxvY2sgdW50aWwgdGhlIGVuZCBvZiBncm91cCwgdGhlbiB0aGUKKyAqCQl3aG9sZSBncm91cCBpcyBmdWxsLCB3ZSBmYWlsZWQuIE90aGVyd2lzZSwgY2hlY2sgaWYgdGhlIGZyZWUKKyAqCQlibG9jayBpcyBpbnNpZGUgdGhlIGV4cGVjdGVkIHJlc2VydmFibGUgc3BhY2UsIGlmIHNvLCB3ZQorICoJCXN1Y2NlZWQuCisgKgkJSWYgdGhlIGZpcnN0IGZyZWUgYmxvY2sgaXMgb3V0c2lkZSB0aGUgcmVzZXJ2YWJsZSBzcGFjZSwgdGhlbgorICoJCXN0YXJ0IGZyb20gdGhlIGZpcnN0IGZyZWUgYmxvY2ssIHdlIHNlYXJjaCBmb3IgbmV4dCBhdmFpbGFibGUKKyAqCQlzcGFjZSwgYW5kIGdvIG9uLgorICoKKyAqCW9uIHN1Y2NlZWQsIGEgbmV3IHJlc2VydmF0aW9uIHdpbGwgYmUgZm91bmQgYW5kIGluc2VydGVkIGludG8gdGhlIGxpc3QKKyAqCUl0IGNvbnRhaW5zIGF0IGxlYXN0IG9uZSBmcmVlIGJsb2NrLCBhbmQgaXQgZG9lcyBub3Qgb3ZlcmxhcCB3aXRoIG90aGVyCisgKglyZXNlcnZhdGlvbiB3aW5kb3dzLgorICoKKyAqCWZhaWxlZDogd2UgZmFpbGVkIHRvIGZpbmQgYSByZXNlcnZhdGlvbiB3aW5kb3cgaW4gdGhpcyBncm91cAorICoKKyAqCUByc3Y6IHRoZSByZXNlcnZhdGlvbgorICoKKyAqCUBncnBfZ29hbDogVGhlIGdvYWwgKGdyb3VwLXJlbGF0aXZlKS4gIEl0IGlzIHdoZXJlIHRoZSBzZWFyY2ggZm9yIGEKKyAqCQlmcmVlIHJlc2VydmFibGUgc3BhY2Ugc2hvdWxkIHN0YXJ0IGZyb20uCisgKgkJaWYgd2UgaGF2ZSBhIGdycF9nb2FsKGdycF9nb2FsID4wICksIHRoZW4gc3RhcnQgZnJvbSB0aGVyZSwKKyAqCQlubyBncnBfZ29hbChncnBfZ29hbCA9IC0xKSwgd2Ugc3RhcnQgZnJvbSB0aGUgZmlyc3QgYmxvY2sKKyAqCQlvZiB0aGUgZ3JvdXAuCisgKgorICoJQHNiOiB0aGUgc3VwZXIgYmxvY2sKKyAqCUBncm91cDogdGhlIGdyb3VwIHdlIGFyZSB0cnlpbmcgdG8gYWxsb2NhdGUgaW4KKyAqCUBiaXRtYXBfYmg6IHRoZSBibG9jayBncm91cCBibG9jayBiaXRtYXAKKyAqCisgKi8KK3N0YXRpYyBpbnQgYWxsb2NfbmV3X3Jlc2VydmF0aW9uKHN0cnVjdCBleHQ0X3Jlc2VydmVfd2luZG93X25vZGUgKm15X3JzdiwKKwkJZXh0NF9ncnBibGtfdCBncnBfZ29hbCwgc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwKKwkJdW5zaWduZWQgaW50IGdyb3VwLCBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJpdG1hcF9iaCkKK3sKKwlzdHJ1Y3QgZXh0NF9yZXNlcnZlX3dpbmRvd19ub2RlICpzZWFyY2hfaGVhZDsKKwlleHQ0X2ZzYmxrX3QgZ3JvdXBfZmlyc3RfYmxvY2ssIGdyb3VwX2VuZF9ibG9jaywgc3RhcnRfYmxvY2s7CisJZXh0NF9ncnBibGtfdCBmaXJzdF9mcmVlX2Jsb2NrOworCXN0cnVjdCByYl9yb290ICpmc19yc3Zfcm9vdCA9ICZFWFQ0X1NCKHNiKS0+c19yc3Zfd2luZG93X3Jvb3Q7CisJdW5zaWduZWQgbG9uZyBzaXplOworCWludCByZXQ7CisJc3BpbmxvY2tfdCAqcnN2X2xvY2sgPSAmRVhUNF9TQihzYiktPnNfcnN2X3dpbmRvd19sb2NrOworCisJZ3JvdXBfZmlyc3RfYmxvY2sgPSBleHQ0X2dyb3VwX2ZpcnN0X2Jsb2NrX25vKHNiLCBncm91cCk7CisJZ3JvdXBfZW5kX2Jsb2NrID0gZ3JvdXBfZmlyc3RfYmxvY2sgKyAoRVhUNF9CTE9DS1NfUEVSX0dST1VQKHNiKSAtIDEpOworCisJaWYgKGdycF9nb2FsIDwgMCkKKwkJc3RhcnRfYmxvY2sgPSBncm91cF9maXJzdF9ibG9jazsKKwllbHNlCisJCXN0YXJ0X2Jsb2NrID0gZ3JwX2dvYWwgKyBncm91cF9maXJzdF9ibG9jazsKKworCXNpemUgPSBteV9yc3YtPnJzdl9nb2FsX3NpemU7CisKKwlpZiAoIXJzdl9pc19lbXB0eSgmbXlfcnN2LT5yc3Zfd2luZG93KSkgeworCQkvKgorCQkgKiBpZiB0aGUgb2xkIHJlc2VydmF0aW9uIGlzIGNyb3NzIGdyb3VwIGJvdW5kYXJ5CisJCSAqIGFuZCBpZiB0aGUgZ29hbCBpcyBpbnNpZGUgdGhlIG9sZCByZXNlcnZhdGlvbiB3aW5kb3csCisJCSAqIHdlIHdpbGwgY29tZSBoZXJlIHdoZW4gd2UganVzdCBmYWlsZWQgdG8gYWxsb2NhdGUgZnJvbQorCQkgKiB0aGUgZmlyc3QgcGFydCBvZiB0aGUgd2luZG93LiBXZSBzdGlsbCBoYXZlIGFub3RoZXIgcGFydAorCQkgKiB0aGF0IGJlbG9uZ3MgdG8gdGhlIG5leHQgZ3JvdXAuIEluIHRoaXMgY2FzZSwgdGhlcmUgaXMgbm8KKwkJICogcG9pbnQgdG8gZGlzY2FyZCBvdXIgd2luZG93IGFuZCB0cnkgdG8gYWxsb2NhdGUgYSBuZXcgb25lCisJCSAqIGluIHRoaXMgZ3JvdXAod2hpY2ggd2lsbCBmYWlsKS4gd2Ugc2hvdWxkCisJCSAqIGtlZXAgdGhlIHJlc2VydmF0aW9uIHdpbmRvdywganVzdCBzaW1wbHkgbW92ZSBvbi4KKwkJICoKKwkJICogTWF5YmUgd2UgY291bGQgc2hpZnQgdGhlIHN0YXJ0IGJsb2NrIG9mIHRoZSByZXNlcnZhdGlvbgorCQkgKiB3aW5kb3cgdG8gdGhlIGZpcnN0IGJsb2NrIG9mIG5leHQgZ3JvdXAuCisJCSAqLworCisJCWlmICgobXlfcnN2LT5yc3Zfc3RhcnQgPD0gZ3JvdXBfZW5kX2Jsb2NrKSAmJgorCQkJCShteV9yc3YtPnJzdl9lbmQgPiBncm91cF9lbmRfYmxvY2spICYmCisJCQkJKHN0YXJ0X2Jsb2NrID49IG15X3Jzdi0+cnN2X3N0YXJ0KSkKKwkJCXJldHVybiAtMTsKKworCQlpZiAoKG15X3Jzdi0+cnN2X2FsbG9jX2hpdCA+CisJCSAgICAgKG15X3Jzdi0+cnN2X2VuZCAtIG15X3Jzdi0+cnN2X3N0YXJ0ICsgMSkgLyAyKSkgeworCQkJLyoKKwkJCSAqIGlmIHRoZSBwcmV2aW91c2x5IGFsbG9jYXRpb24gaGl0IHJhdGlvIGlzCisJCQkgKiBncmVhdGVyIHRoYW4gMS8yLCB0aGVuIHdlIGRvdWJsZSB0aGUgc2l6ZSBvZgorCQkJICogdGhlIHJlc2VydmF0aW9uIHdpbmRvdyB0aGUgbmV4dCB0aW1lLAorCQkJICogb3RoZXJ3aXNlIHdlIGtlZXAgdGhlIHNhbWUgc2l6ZSB3aW5kb3cKKwkJCSAqLworCQkJc2l6ZSA9IHNpemUgKiAyOworCQkJaWYgKHNpemUgPiBFWFQ0X01BWF9SRVNFUlZFX0JMT0NLUykKKwkJCQlzaXplID0gRVhUNF9NQVhfUkVTRVJWRV9CTE9DS1M7CisJCQlteV9yc3YtPnJzdl9nb2FsX3NpemU9IHNpemU7CisJCX0KKwl9CisKKwlzcGluX2xvY2socnN2X2xvY2spOworCS8qCisJICogc2hpZnQgdGhlIHNlYXJjaCBzdGFydCB0byB0aGUgd2luZG93IG5lYXIgdGhlIGdvYWwgYmxvY2sKKwkgKi8KKwlzZWFyY2hfaGVhZCA9IHNlYXJjaF9yZXNlcnZlX3dpbmRvdyhmc19yc3Zfcm9vdCwgc3RhcnRfYmxvY2spOworCisJLyoKKwkgKiBmaW5kX25leHRfcmVzZXJ2YWJsZV93aW5kb3coKSBzaW1wbHkgZmluZHMgYSByZXNlcnZhYmxlIHdpbmRvdworCSAqIGluc2lkZSB0aGUgZ2l2ZW4gcmFuZ2Uoc3RhcnRfYmxvY2ssIGdyb3VwX2VuZF9ibG9jaykuCisJICoKKwkgKiBUbyBtYWtlIHN1cmUgdGhlIHJlc2VydmF0aW9uIHdpbmRvdyBoYXMgYSBmcmVlIGJpdCBpbnNpZGUgaXQsIHdlCisJICogbmVlZCB0byBjaGVjayB0aGUgYml0bWFwIGFmdGVyIHdlIGZvdW5kIGEgcmVzZXJ2YWJsZSB3aW5kb3cuCisJICovCityZXRyeToKKwlyZXQgPSBmaW5kX25leHRfcmVzZXJ2YWJsZV93aW5kb3coc2VhcmNoX2hlYWQsIG15X3Jzdiwgc2IsCisJCQkJCQlzdGFydF9ibG9jaywgZ3JvdXBfZW5kX2Jsb2NrKTsKKworCWlmIChyZXQgPT0gLTEpIHsKKwkJaWYgKCFyc3ZfaXNfZW1wdHkoJm15X3Jzdi0+cnN2X3dpbmRvdykpCisJCQlyc3Zfd2luZG93X3JlbW92ZShzYiwgbXlfcnN2KTsKKwkJc3Bpbl91bmxvY2socnN2X2xvY2spOworCQlyZXR1cm4gLTE7CisJfQorCisJLyoKKwkgKiBPbiBzdWNjZXNzLCBmaW5kX25leHRfcmVzZXJ2YWJsZV93aW5kb3coKSByZXR1cm5zIHRoZQorCSAqIHJlc2VydmF0aW9uIHdpbmRvdyB3aGVyZSB0aGVyZSBpcyBhIHJlc2VydmFibGUgc3BhY2UgYWZ0ZXIgaXQuCisJICogQmVmb3JlIHdlIHJlc2VydmUgdGhpcyByZXNlcnZhYmxlIHNwYWNlLCB3ZSBuZWVkCisJICogdG8gbWFrZSBzdXJlIHRoZXJlIGlzIGF0IGxlYXN0IGEgZnJlZSBibG9jayBpbnNpZGUgdGhpcyByZWdpb24uCisJICoKKwkgKiBzZWFyY2hpbmcgdGhlIGZpcnN0IGZyZWUgYml0IG9uIHRoZSBibG9jayBiaXRtYXAgYW5kIGNvcHkgb2YKKwkgKiBsYXN0IGNvbW1pdHRlZCBiaXRtYXAgYWx0ZXJuYXRpdmVseSwgdW50aWwgd2UgZm91bmQgYSBhbGxvY2F0YWJsZQorCSAqIGJsb2NrLiBTZWFyY2ggc3RhcnQgZnJvbSB0aGUgc3RhcnQgYmxvY2sgb2YgdGhlIHJlc2VydmFibGUgc3BhY2UKKwkgKiB3ZSBqdXN0IGZvdW5kLgorCSAqLworCXNwaW5fdW5sb2NrKHJzdl9sb2NrKTsKKwlmaXJzdF9mcmVlX2Jsb2NrID0gYml0bWFwX3NlYXJjaF9uZXh0X3VzYWJsZV9ibG9jaygKKwkJCW15X3Jzdi0+cnN2X3N0YXJ0IC0gZ3JvdXBfZmlyc3RfYmxvY2ssCisJCQliaXRtYXBfYmgsIGdyb3VwX2VuZF9ibG9jayAtIGdyb3VwX2ZpcnN0X2Jsb2NrICsgMSk7CisKKwlpZiAoZmlyc3RfZnJlZV9ibG9jayA8IDApIHsKKwkJLyoKKwkJICogbm8gZnJlZSBibG9jayBsZWZ0IG9uIHRoZSBiaXRtYXAsIG5vIHBvaW50CisJCSAqIHRvIHJlc2VydmUgdGhlIHNwYWNlLiByZXR1cm4gZmFpbGVkLgorCQkgKi8KKwkJc3Bpbl9sb2NrKHJzdl9sb2NrKTsKKwkJaWYgKCFyc3ZfaXNfZW1wdHkoJm15X3Jzdi0+cnN2X3dpbmRvdykpCisJCQlyc3Zfd2luZG93X3JlbW92ZShzYiwgbXlfcnN2KTsKKwkJc3Bpbl91bmxvY2socnN2X2xvY2spOworCQlyZXR1cm4gLTE7CQkvKiBmYWlsZWQgKi8KKwl9CisKKwlzdGFydF9ibG9jayA9IGZpcnN0X2ZyZWVfYmxvY2sgKyBncm91cF9maXJzdF9ibG9jazsKKwkvKgorCSAqIGNoZWNrIGlmIHRoZSBmaXJzdCBmcmVlIGJsb2NrIGlzIHdpdGhpbiB0aGUKKwkgKiBmcmVlIHNwYWNlIHdlIGp1c3QgcmVzZXJ2ZWQKKwkgKi8KKwlpZiAoc3RhcnRfYmxvY2sgPj0gbXlfcnN2LT5yc3Zfc3RhcnQgJiYgc3RhcnRfYmxvY2sgPCBteV9yc3YtPnJzdl9lbmQpCisJCXJldHVybiAwOwkJLyogc3VjY2VzcyAqLworCS8qCisJICogaWYgdGhlIGZpcnN0IGZyZWUgYml0IHdlIGZvdW5kIGlzIG91dCBvZiB0aGUgcmVzZXJ2YWJsZSBzcGFjZQorCSAqIGNvbnRpbnVlIHNlYXJjaCBmb3IgbmV4dCByZXNlcnZhYmxlIHNwYWNlLAorCSAqIHN0YXJ0IGZyb20gd2hlcmUgdGhlIGZyZWUgYmxvY2sgaXMsCisJICogd2UgYWxzbyBzaGlmdCB0aGUgbGlzdCBoZWFkIHRvIHdoZXJlIHdlIHN0b3BwZWQgbGFzdCB0aW1lCisJICovCisJc2VhcmNoX2hlYWQgPSBteV9yc3Y7CisJc3Bpbl9sb2NrKHJzdl9sb2NrKTsKKwlnb3RvIHJldHJ5OworfQorCisvKioKKyAqIHRyeV90b19leHRlbmRfcmVzZXJ2YXRpb24oKQorICogQG15X3JzdjoJCWdpdmVuIHJlc2VydmF0aW9uIHdpbmRvdworICogQHNiOgkJCXN1cGVyIGJsb2NrCisgKiBAc2l6ZToJCXRoZSBkZWx0YSB0byBleHRlbmQKKyAqCisgKiBBdHRlbXB0IHRvIGV4cGFuZCB0aGUgcmVzZXJ2YXRpb24gd2luZG93IGxhcmdlIGVub3VnaCB0byBoYXZlCisgKiByZXF1aXJlZCBudW1iZXIgb2YgZnJlZSBibG9ja3MKKyAqCisgKiBTaW5jZSBleHQ0X3RyeV90b19hbGxvY2F0ZSgpIHdpbGwgYWx3YXlzIGFsbG9jYXRlIGJsb2NrcyB3aXRoaW4KKyAqIHRoZSByZXNlcnZhdGlvbiB3aW5kb3cgcmFuZ2UsIGlmIHRoZSB3aW5kb3cgc2l6ZSBpcyB0b28gc21hbGwsCisgKiBtdWx0aXBsZSBibG9ja3MgYWxsb2NhdGlvbiBoYXMgdG8gc3RvcCBhdCB0aGUgZW5kIG9mIHRoZSByZXNlcnZhdGlvbgorICogd2luZG93LiBUbyBtYWtlIHRoaXMgbW9yZSBlZmZpY2llbnQsIGdpdmVuIHRoZSB0b3RhbCBudW1iZXIgb2YKKyAqIGJsb2NrcyBuZWVkZWQgYW5kIHRoZSBjdXJyZW50IHNpemUgb2YgdGhlIHdpbmRvdywgd2UgdHJ5IHRvCisgKiBleHBhbmQgdGhlIHJlc2VydmF0aW9uIHdpbmRvdyBzaXplIGlmIG5lY2Vzc2FyeSBvbiBhIGJlc3QtZWZmb3J0CisgKiBiYXNpcyBiZWZvcmUgZXh0NF9uZXdfYmxvY2tzKCkgdHJpZXMgdG8gYWxsb2NhdGUgYmxvY2tzLAorICovCitzdGF0aWMgdm9pZCB0cnlfdG9fZXh0ZW5kX3Jlc2VydmF0aW9uKHN0cnVjdCBleHQ0X3Jlc2VydmVfd2luZG93X25vZGUgKm15X3JzdiwKKwkJCXN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGludCBzaXplKQoreworCXN0cnVjdCBleHQ0X3Jlc2VydmVfd2luZG93X25vZGUgKm5leHRfcnN2OworCXN0cnVjdCByYl9ub2RlICpuZXh0OworCXNwaW5sb2NrX3QgKnJzdl9sb2NrID0gJkVYVDRfU0Ioc2IpLT5zX3Jzdl93aW5kb3dfbG9jazsKKworCWlmICghc3Bpbl90cnlsb2NrKHJzdl9sb2NrKSkKKwkJcmV0dXJuOworCisJbmV4dCA9IHJiX25leHQoJm15X3Jzdi0+cnN2X25vZGUpOworCisJaWYgKCFuZXh0KQorCQlteV9yc3YtPnJzdl9lbmQgKz0gc2l6ZTsKKwllbHNlIHsKKwkJbmV4dF9yc3YgPSBsaXN0X2VudHJ5KG5leHQsIHN0cnVjdCBleHQ0X3Jlc2VydmVfd2luZG93X25vZGUsIHJzdl9ub2RlKTsKKworCQlpZiAoKG5leHRfcnN2LT5yc3Zfc3RhcnQgLSBteV9yc3YtPnJzdl9lbmQgLSAxKSA+PSBzaXplKQorCQkJbXlfcnN2LT5yc3ZfZW5kICs9IHNpemU7CisJCWVsc2UKKwkJCW15X3Jzdi0+cnN2X2VuZCA9IG5leHRfcnN2LT5yc3Zfc3RhcnQgLSAxOworCX0KKwlzcGluX3VubG9jayhyc3ZfbG9jayk7Cit9CisKKy8qKgorICogZXh0NF90cnlfdG9fYWxsb2NhdGVfd2l0aF9yc3YoKQorICogQHNiOgkJCXN1cGVyYmxvY2sKKyAqIEBoYW5kbGU6CQloYW5kbGUgdG8gdGhpcyB0cmFuc2FjdGlvbgorICogQGdyb3VwOgkJZ2l2ZW4gYWxsb2NhdGlvbiBibG9jayBncm91cAorICogQGJpdG1hcF9iaDoJCWJ1ZmZlcmhlYWQgaG9sZHMgdGhlIGJsb2NrIGJpdG1hcAorICogQGdycF9nb2FsOgkJZ2l2ZW4gdGFyZ2V0IGJsb2NrIHdpdGhpbiB0aGUgZ3JvdXAKKyAqIEBjb3VudDoJCXRhcmdldCBudW1iZXIgb2YgYmxvY2tzIHRvIGFsbG9jYXRlCisgKiBAbXlfcnN2OgkJcmVzZXJ2YXRpb24gd2luZG93CisgKiBAZXJycDoJCXBvaW50ZXIgdG8gc3RvcmUgdGhlIGVycm9yIGNvZGUKKyAqCisgKiBUaGlzIGlzIHRoZSBtYWluIGZ1bmN0aW9uIHVzZWQgdG8gYWxsb2NhdGUgYSBuZXcgYmxvY2sgYW5kIGl0cyByZXNlcnZhdGlvbgorICogd2luZG93LgorICoKKyAqIEVhY2ggdGltZSB3aGVuIGEgbmV3IGJsb2NrIGFsbG9jYXRpb24gaXMgbmVlZCwgZmlyc3QgdHJ5IHRvIGFsbG9jYXRlIGZyb20KKyAqIGl0cyBvd24gcmVzZXJ2YXRpb24uICBJZiBpdCBkb2VzIG5vdCBoYXZlIGEgcmVzZXJ2YXRpb24gd2luZG93LCBpbnN0ZWFkIG9mCisgKiBsb29raW5nIGZvciBhIGZyZWUgYml0IG9uIGJpdG1hcCBmaXJzdCwgdGhlbiBsb29rIHVwIHRoZSByZXNlcnZhdGlvbiBsaXN0IHRvCisgKiBzZWUgaWYgaXQgaXMgaW5zaWRlIHNvbWVib2R5IGVsc2UncyByZXNlcnZhdGlvbiB3aW5kb3csIHdlIHRyeSB0byBhbGxvY2F0ZSBhCisgKiByZXNlcnZhdGlvbiB3aW5kb3cgZm9yIGl0IHN0YXJ0aW5nIGZyb20gdGhlIGdvYWwgZmlyc3QuIFRoZW4gZG8gdGhlIGJsb2NrCisgKiBhbGxvY2F0aW9uIHdpdGhpbiB0aGUgcmVzZXJ2YXRpb24gd2luZG93LgorICoKKyAqIFRoaXMgd2lsbCBhdm9pZCBrZWVwaW5nIG9uIHNlYXJjaGluZyB0aGUgcmVzZXJ2YXRpb24gbGlzdCBhZ2FpbiBhbmQKKyAqIGFnYWluIHdoZW4gc29tZWJvZHkgaXMgbG9va2luZyBmb3IgYSBmcmVlIGJsb2NrICh3aXRob3V0CisgKiByZXNlcnZhdGlvbiksIGFuZCB0aGVyZSBhcmUgbG90cyBvZiBmcmVlIGJsb2NrcywgYnV0IHRoZXkgYXJlIGFsbAorICogYmVpbmcgcmVzZXJ2ZWQuCisgKgorICogV2UgdXNlIGEgcmVkLWJsYWNrIHRyZWUgZm9yIHRoZSBwZXItZmlsZXN5c3RlbSByZXNlcnZhdGlvbiBsaXN0LgorICoKKyAqLworc3RhdGljIGV4dDRfZ3JwYmxrX3QKK2V4dDRfdHJ5X3RvX2FsbG9jYXRlX3dpdGhfcnN2KHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGhhbmRsZV90ICpoYW5kbGUsCisJCQl1bnNpZ25lZCBpbnQgZ3JvdXAsIHN0cnVjdCBidWZmZXJfaGVhZCAqYml0bWFwX2JoLAorCQkJZXh0NF9ncnBibGtfdCBncnBfZ29hbCwKKwkJCXN0cnVjdCBleHQ0X3Jlc2VydmVfd2luZG93X25vZGUgKiBteV9yc3YsCisJCQl1bnNpZ25lZCBsb25nICpjb3VudCwgaW50ICplcnJwKQoreworCWV4dDRfZnNibGtfdCBncm91cF9maXJzdF9ibG9jaywgZ3JvdXBfbGFzdF9ibG9jazsKKwlleHQ0X2dycGJsa190IHJldCA9IDA7CisJaW50IGZhdGFsOworCXVuc2lnbmVkIGxvbmcgbnVtID0gKmNvdW50OworCisJKmVycnAgPSAwOworCisJLyoKKwkgKiBNYWtlIHN1cmUgd2UgdXNlIHVuZG8gYWNjZXNzIGZvciB0aGUgYml0bWFwLCBiZWNhdXNlIGl0IGlzIGNyaXRpY2FsCisJICogdGhhdCB3ZSBkbyB0aGUgZnJvemVuX2RhdGEgQ09XIG9uIGJpdG1hcCBidWZmZXJzIGluIGFsbCBjYXNlcyBldmVuCisJICogaWYgdGhlIGJ1ZmZlciBpcyBpbiBCSl9Gb3JnZXQgc3RhdGUgaW4gdGhlIGNvbW1pdHRpbmcgdHJhbnNhY3Rpb24uCisJICovCisJQlVGRkVSX1RSQUNFKGJpdG1hcF9iaCwgImdldCB1bmRvIGFjY2VzcyBmb3IgbmV3IGJsb2NrIik7CisJZmF0YWwgPSBleHQ0X2pvdXJuYWxfZ2V0X3VuZG9fYWNjZXNzKGhhbmRsZSwgYml0bWFwX2JoKTsKKwlpZiAoZmF0YWwpIHsKKwkJKmVycnAgPSBmYXRhbDsKKwkJcmV0dXJuIC0xOworCX0KKworCS8qCisJICogd2UgZG9uJ3QgZGVhbCB3aXRoIHJlc2VydmF0aW9uIHdoZW4KKwkgKiBmaWxlc3lzdGVtIGlzIG1vdW50ZWQgd2l0aG91dCByZXNlcnZhdGlvbgorCSAqIG9yIHRoZSBmaWxlIGlzIG5vdCBhIHJlZ3VsYXIgZmlsZQorCSAqIG9yIGxhc3QgYXR0ZW1wdCB0byBhbGxvY2F0ZSBhIGJsb2NrIHdpdGggcmVzZXJ2YXRpb24gdHVybmVkIG9uIGZhaWxlZAorCSAqLworCWlmIChteV9yc3YgPT0gTlVMTCApIHsKKwkJcmV0ID0gZXh0NF90cnlfdG9fYWxsb2NhdGUoc2IsIGhhbmRsZSwgZ3JvdXAsIGJpdG1hcF9iaCwKKwkJCQkJCWdycF9nb2FsLCBjb3VudCwgTlVMTCk7CisJCWdvdG8gb3V0OworCX0KKwkvKgorCSAqIGdycF9nb2FsIGlzIGEgZ3JvdXAgcmVsYXRpdmUgYmxvY2sgbnVtYmVyIChpZiB0aGVyZSBpcyBhIGdvYWwpCisJICogMCA8IGdycF9nb2FsIDwgRVhUNF9CTE9DS1NfUEVSX0dST1VQKHNiKQorCSAqIGZpcnN0IGJsb2NrIGlzIGEgZmlsZXN5c3RlbSB3aWRlIGJsb2NrIG51bWJlcgorCSAqIGZpcnN0IGJsb2NrIGlzIHRoZSBibG9jayBudW1iZXIgb2YgdGhlIGZpcnN0IGJsb2NrIGluIHRoaXMgZ3JvdXAKKwkgKi8KKwlncm91cF9maXJzdF9ibG9jayA9IGV4dDRfZ3JvdXBfZmlyc3RfYmxvY2tfbm8oc2IsIGdyb3VwKTsKKwlncm91cF9sYXN0X2Jsb2NrID0gZ3JvdXBfZmlyc3RfYmxvY2sgKyAoRVhUNF9CTE9DS1NfUEVSX0dST1VQKHNiKSAtIDEpOworCisJLyoKKwkgKiBCYXNpY2FsbHkgd2Ugd2lsbCBhbGxvY2F0ZSBhIG5ldyBibG9jayBmcm9tIGlub2RlJ3MgcmVzZXJ2YXRpb24KKwkgKiB3aW5kb3cuCisJICoKKwkgKiBXZSBuZWVkIHRvIGFsbG9jYXRlIGEgbmV3IHJlc2VydmF0aW9uIHdpbmRvdywgaWY6CisJICogYSkgaW5vZGUgZG9lcyBub3QgaGF2ZSBhIHJlc2VydmF0aW9uIHdpbmRvdzsgb3IKKwkgKiBiKSBsYXN0IGF0dGVtcHQgdG8gYWxsb2NhdGUgYSBibG9jayBmcm9tIGV4aXN0aW5nIHJlc2VydmF0aW9uCisJICogICAgZmFpbGVkOyBvcgorCSAqIGMpIHdlIGNvbWUgaGVyZSB3aXRoIGEgZ29hbCBhbmQgd2l0aCBhIHJlc2VydmF0aW9uIHdpbmRvdworCSAqCisJICogV2UgZG8gbm90IG5lZWQgdG8gYWxsb2NhdGUgYSBuZXcgcmVzZXJ2YXRpb24gd2luZG93IGlmIHdlIGNvbWUgaGVyZQorCSAqIGF0IHRoZSBiZWdpbm5pbmcgd2l0aCBhIGdvYWwgYW5kIHRoZSBnb2FsIGlzIGluc2lkZSB0aGUgd2luZG93LCBvcgorCSAqIHdlIGRvbid0IGhhdmUgYSBnb2FsIGJ1dCBhbHJlYWR5IGhhdmUgYSByZXNlcnZhdGlvbiB3aW5kb3cuCisJICogdGhlbiB3ZSBjb3VsZCBnbyB0byBhbGxvY2F0ZSBmcm9tIHRoZSByZXNlcnZhdGlvbiB3aW5kb3cgZGlyZWN0bHkuCisJICovCisJd2hpbGUgKDEpIHsKKwkJaWYgKHJzdl9pc19lbXB0eSgmbXlfcnN2LT5yc3Zfd2luZG93KSB8fCAocmV0IDwgMCkgfHwKKwkJCSFnb2FsX2luX215X3Jlc2VydmF0aW9uKCZteV9yc3YtPnJzdl93aW5kb3csCisJCQkJCQlncnBfZ29hbCwgZ3JvdXAsIHNiKSkgeworCQkJaWYgKG15X3Jzdi0+cnN2X2dvYWxfc2l6ZSA8ICpjb3VudCkKKwkJCQlteV9yc3YtPnJzdl9nb2FsX3NpemUgPSAqY291bnQ7CisJCQlyZXQgPSBhbGxvY19uZXdfcmVzZXJ2YXRpb24obXlfcnN2LCBncnBfZ29hbCwgc2IsCisJCQkJCQkJZ3JvdXAsIGJpdG1hcF9iaCk7CisJCQlpZiAocmV0IDwgMCkKKwkJCQlicmVhazsJCQkvKiBmYWlsZWQgKi8KKworCQkJaWYgKCFnb2FsX2luX215X3Jlc2VydmF0aW9uKCZteV9yc3YtPnJzdl93aW5kb3csCisJCQkJCQkJZ3JwX2dvYWwsIGdyb3VwLCBzYikpCisJCQkJZ3JwX2dvYWwgPSAtMTsKKwkJfSBlbHNlIGlmIChncnBfZ29hbCA+IDAgJiYKKwkJCSAgKG15X3Jzdi0+cnN2X2VuZC1ncnBfZ29hbCsxKSA8ICpjb3VudCkKKwkJCXRyeV90b19leHRlbmRfcmVzZXJ2YXRpb24obXlfcnN2LCBzYiwKKwkJCQkJKmNvdW50LW15X3Jzdi0+cnN2X2VuZCArIGdycF9nb2FsIC0gMSk7CisKKwkJaWYgKChteV9yc3YtPnJzdl9zdGFydCA+IGdyb3VwX2xhc3RfYmxvY2spIHx8CisJCQkJKG15X3Jzdi0+cnN2X2VuZCA8IGdyb3VwX2ZpcnN0X2Jsb2NrKSkgeworCQkJcnN2X3dpbmRvd19kdW1wKCZFWFQ0X1NCKHNiKS0+c19yc3Zfd2luZG93X3Jvb3QsIDEpOworCQkJQlVHKCk7CisJCX0KKwkJcmV0ID0gZXh0NF90cnlfdG9fYWxsb2NhdGUoc2IsIGhhbmRsZSwgZ3JvdXAsIGJpdG1hcF9iaCwKKwkJCQkJICAgZ3JwX2dvYWwsICZudW0sICZteV9yc3YtPnJzdl93aW5kb3cpOworCQlpZiAocmV0ID49IDApIHsKKwkJCW15X3Jzdi0+cnN2X2FsbG9jX2hpdCArPSBudW07CisJCQkqY291bnQgPSBudW07CisJCQlicmVhazsJCQkJLyogc3VjY2VlZCAqLworCQl9CisJCW51bSA9ICpjb3VudDsKKwl9CitvdXQ6CisJaWYgKHJldCA+PSAwKSB7CisJCUJVRkZFUl9UUkFDRShiaXRtYXBfYmgsICJqb3VybmFsX2RpcnR5X21ldGFkYXRhIGZvciAiCisJCQkJCSJiaXRtYXAgYmxvY2siKTsKKwkJZmF0YWwgPSBleHQ0X2pvdXJuYWxfZGlydHlfbWV0YWRhdGEoaGFuZGxlLCBiaXRtYXBfYmgpOworCQlpZiAoZmF0YWwpIHsKKwkJCSplcnJwID0gZmF0YWw7CisJCQlyZXR1cm4gLTE7CisJCX0KKwkJcmV0dXJuIHJldDsKKwl9CisKKwlCVUZGRVJfVFJBQ0UoYml0bWFwX2JoLCAiam91cm5hbF9yZWxlYXNlX2J1ZmZlciIpOworCWV4dDRfam91cm5hbF9yZWxlYXNlX2J1ZmZlcihoYW5kbGUsIGJpdG1hcF9iaCk7CisJcmV0dXJuIHJldDsKK30KKworLyoqCisgKiBleHQ0X2hhc19mcmVlX2Jsb2NrcygpCisgKiBAc2JpOgkJaW4tY29yZSBzdXBlciBibG9jayBzdHJ1Y3R1cmUuCisgKgorICogQ2hlY2sgaWYgZmlsZXN5c3RlbSBoYXMgYXQgbGVhc3QgMSBmcmVlIGJsb2NrIGF2YWlsYWJsZSBmb3IgYWxsb2NhdGlvbi4KKyAqLworc3RhdGljIGludCBleHQ0X2hhc19mcmVlX2Jsb2NrcyhzdHJ1Y3QgZXh0NF9zYl9pbmZvICpzYmkpCit7CisJZXh0NF9mc2Jsa190IGZyZWVfYmxvY2tzLCByb290X2Jsb2NrczsKKworCWZyZWVfYmxvY2tzID0gcGVyY3B1X2NvdW50ZXJfcmVhZF9wb3NpdGl2ZSgmc2JpLT5zX2ZyZWVibG9ja3NfY291bnRlcik7CisJcm9vdF9ibG9ja3MgPSBleHQ0X3JfYmxvY2tzX2NvdW50KHNiaS0+c19lcyk7CisJaWYgKGZyZWVfYmxvY2tzIDwgcm9vdF9ibG9ja3MgKyAxICYmICFjYXBhYmxlKENBUF9TWVNfUkVTT1VSQ0UpICYmCisJCXNiaS0+c19yZXN1aWQgIT0gY3VycmVudC0+ZnN1aWQgJiYKKwkJKHNiaS0+c19yZXNnaWQgPT0gMCB8fCAhaW5fZ3JvdXBfcCAoc2JpLT5zX3Jlc2dpZCkpKSB7CisJCXJldHVybiAwOworCX0KKwlyZXR1cm4gMTsKK30KKworLyoqCisgKiBleHQ0X3Nob3VsZF9yZXRyeV9hbGxvYygpCisgKiBAc2I6CQkJc3VwZXIgYmxvY2sKKyAqIEByZXRyaWVzCQludW1iZXIgb2YgYXR0ZW1wcyBoYXMgYmVlbiBtYWRlCisgKgorICogZXh0NF9zaG91bGRfcmV0cnlfYWxsb2MoKSBpcyBjYWxsZWQgd2hlbiBFTk9TUEMgaXMgcmV0dXJuZWQsIGFuZCBpZgorICogaXQgaXMgcHJvZml0YWJsZSB0byByZXRyeSB0aGUgb3BlcmF0aW9uLCB0aGlzIGZ1bmN0aW9uIHdpbGwgd2FpdAorICogZm9yIHRoZSBjdXJyZW50IG9yIGNvbW1pdGluZyB0cmFuc2FjdGlvbiB0byBjb21wbGV0ZSwgYW5kIHRoZW4KKyAqIHJldHVybiBUUlVFLgorICoKKyAqIGlmIHRoZSB0b3RhbCBudW1iZXIgb2YgcmV0cmllcyBleGNlZWQgdGhyZWUgdGltZXMsIHJldHVybiBGQUxTRS4KKyAqLworaW50IGV4dDRfc2hvdWxkX3JldHJ5X2FsbG9jKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGludCAqcmV0cmllcykKK3sKKwlpZiAoIWV4dDRfaGFzX2ZyZWVfYmxvY2tzKEVYVDRfU0Ioc2IpKSB8fCAoKnJldHJpZXMpKysgPiAzKQorCQlyZXR1cm4gMDsKKworCWpiZF9kZWJ1ZygxLCAiJXM6IHJldHJ5aW5nIG9wZXJhdGlvbiBhZnRlciBFTk9TUENcbiIsIHNiLT5zX2lkKTsKKworCXJldHVybiBqYmQyX2pvdXJuYWxfZm9yY2VfY29tbWl0X25lc3RlZChFWFQ0X1NCKHNiKS0+c19qb3VybmFsKTsKK30KKworLyoqCisgKiBleHQ0X25ld19ibG9ja3MoKSAtLSBjb3JlIGJsb2NrKHMpIGFsbG9jYXRpb24gZnVuY3Rpb24KKyAqIEBoYW5kbGU6CQloYW5kbGUgdG8gdGhpcyB0cmFuc2FjdGlvbgorICogQGlub2RlOgkJZmlsZSBpbm9kZQorICogQGdvYWw6CQlnaXZlbiB0YXJnZXQgYmxvY2soZmlsZXN5c3RlbSB3aWRlKQorICogQGNvdW50OgkJdGFyZ2V0IG51bWJlciBvZiBibG9ja3MgdG8gYWxsb2NhdGUKKyAqIEBlcnJwOgkJZXJyb3IgY29kZQorICoKKyAqIGV4dDRfbmV3X2Jsb2NrcyB1c2VzIGEgZ29hbCBibG9jayB0byBhc3Npc3QgYWxsb2NhdGlvbi4gIEl0IHRyaWVzIHRvCisgKiBhbGxvY2F0ZSBibG9jayhzKSBmcm9tIHRoZSBibG9jayBncm91cCBjb250YWlucyB0aGUgZ29hbCBibG9jayBmaXJzdC4gSWYgdGhhdAorICogZmFpbHMsIGl0IHdpbGwgdHJ5IHRvIGFsbG9jYXRlIGJsb2NrKHMpIGZyb20gb3RoZXIgYmxvY2sgZ3JvdXBzIHdpdGhvdXQKKyAqIGFueSBzcGVjaWZpYyBnb2FsIGJsb2NrLgorICoKKyAqLworZXh0NF9mc2Jsa190IGV4dDRfbmV3X2Jsb2NrcyhoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3QgaW5vZGUgKmlub2RlLAorCQkJZXh0NF9mc2Jsa190IGdvYWwsIHVuc2lnbmVkIGxvbmcgKmNvdW50LCBpbnQgKmVycnApCit7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaXRtYXBfYmggPSBOVUxMOworCXN0cnVjdCBidWZmZXJfaGVhZCAqZ2RwX2JoOworCXVuc2lnbmVkIGxvbmcgZ3JvdXBfbm87CisJaW50IGdvYWxfZ3JvdXA7CisJZXh0NF9ncnBibGtfdCBncnBfdGFyZ2V0X2JsazsJLyogYmxvY2tncm91cCByZWxhdGl2ZSBnb2FsIGJsb2NrICovCisJZXh0NF9ncnBibGtfdCBncnBfYWxsb2NfYmxrOwkvKiBibG9ja2dyb3VwLXJlbGF0aXZlIGFsbG9jYXRlZCBibG9jayovCisJZXh0NF9mc2Jsa190IHJldF9ibG9jazsJCS8qIGZpbGVzeWV0ZW0td2lkZSBhbGxvY2F0ZWQgYmxvY2sgKi8KKwlpbnQgYmdpOwkJCS8qIGJsb2NrZ3JvdXAgaXRlcmF0aW9uIGluZGV4ICovCisJaW50IGZhdGFsID0gMCwgZXJyOworCWludCBwZXJmb3JtZWRfYWxsb2NhdGlvbiA9IDA7CisJZXh0NF9ncnBibGtfdCBmcmVlX2Jsb2NrczsJLyogbnVtYmVyIG9mIGZyZWUgYmxvY2tzIGluIGEgZ3JvdXAgKi8KKwlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiOworCXN0cnVjdCBleHQ0X2dyb3VwX2Rlc2MgKmdkcDsKKwlzdHJ1Y3QgZXh0NF9zdXBlcl9ibG9jayAqZXM7CisJc3RydWN0IGV4dDRfc2JfaW5mbyAqc2JpOworCXN0cnVjdCBleHQ0X3Jlc2VydmVfd2luZG93X25vZGUgKm15X3JzdiA9IE5VTEw7CisJc3RydWN0IGV4dDRfYmxvY2tfYWxsb2NfaW5mbyAqYmxvY2tfaTsKKwl1bnNpZ25lZCBzaG9ydCB3aW5kb3dzeiA9IDA7CisjaWZkZWYgRVhUNEZTX0RFQlVHCisJc3RhdGljIGludCBnb2FsX2hpdHMsIGdvYWxfYXR0ZW1wdHM7CisjZW5kaWYKKwl1bnNpZ25lZCBsb25nIG5ncm91cHM7CisJdW5zaWduZWQgbG9uZyBudW0gPSAqY291bnQ7CisKKwkqZXJycCA9IC1FTk9TUEM7CisJc2IgPSBpbm9kZS0+aV9zYjsKKwlpZiAoIXNiKSB7CisJCXByaW50aygiZXh0NF9uZXdfYmxvY2s6IG5vbmV4aXN0ZW50IGRldmljZSIpOworCQlyZXR1cm4gMDsKKwl9CisKKwkvKgorCSAqIENoZWNrIHF1b3RhIGZvciBhbGxvY2F0aW9uIG9mIHRoaXMgYmxvY2suCisJICovCisJaWYgKERRVU9UX0FMTE9DX0JMT0NLKGlub2RlLCBudW0pKSB7CisJCSplcnJwID0gLUVEUVVPVDsKKwkJcmV0dXJuIDA7CisJfQorCisJc2JpID0gRVhUNF9TQihzYik7CisJZXMgPSBFWFQ0X1NCKHNiKS0+c19lczsKKwlleHQ0X2RlYnVnKCJnb2FsPSVsdS5cbiIsIGdvYWwpOworCS8qCisJICogQWxsb2NhdGUgYSBibG9jayBmcm9tIHJlc2VydmF0aW9uIG9ubHkgd2hlbgorCSAqIGZpbGVzeXN0ZW0gaXMgbW91bnRlZCB3aXRoIHJlc2VydmF0aW9uKGRlZmF1bHQsLW8gcmVzZXJ2YXRpb24pLCBhbmQKKwkgKiBpdCdzIGEgcmVndWxhciBmaWxlLCBhbmQKKwkgKiB0aGUgZGVzaXJlZCB3aW5kb3cgc2l6ZSBpcyBncmVhdGVyIHRoYW4gMCAoT25lIGNvdWxkIHVzZSBpb2N0bAorCSAqIGNvbW1hbmQgRVhUNF9JT0NfU0VUUlNWU1ogdG8gc2V0IHRoZSB3aW5kb3cgc2l6ZSB0byAwIHRvIHR1cm4gb2ZmCisJICogcmVzZXJ2YXRpb24gb24gdGhhdCBwYXJ0aWN1bGFyIGZpbGUpCisJICovCisJYmxvY2tfaSA9IEVYVDRfSShpbm9kZSktPmlfYmxvY2tfYWxsb2NfaW5mbzsKKwlpZiAoYmxvY2tfaSAmJiAoKHdpbmRvd3N6ID0gYmxvY2tfaS0+cnN2X3dpbmRvd19ub2RlLnJzdl9nb2FsX3NpemUpID4gMCkpCisJCW15X3JzdiA9ICZibG9ja19pLT5yc3Zfd2luZG93X25vZGU7CisKKwlpZiAoIWV4dDRfaGFzX2ZyZWVfYmxvY2tzKHNiaSkpIHsKKwkJKmVycnAgPSAtRU5PU1BDOworCQlnb3RvIG91dDsKKwl9CisKKwkvKgorCSAqIEZpcnN0LCB0ZXN0IHdoZXRoZXIgdGhlIGdvYWwgYmxvY2sgaXMgZnJlZS4KKwkgKi8KKwlpZiAoZ29hbCA8IGxlMzJfdG9fY3B1KGVzLT5zX2ZpcnN0X2RhdGFfYmxvY2spIHx8CisJICAgIGdvYWwgPj0gZXh0NF9ibG9ja3NfY291bnQoZXMpKQorCQlnb2FsID0gbGUzMl90b19jcHUoZXMtPnNfZmlyc3RfZGF0YV9ibG9jayk7CisJZXh0NF9nZXRfZ3JvdXBfbm9fYW5kX29mZnNldChzYiwgZ29hbCwgJmdyb3VwX25vLCAmZ3JwX3RhcmdldF9ibGspOworCWdvYWxfZ3JvdXAgPSBncm91cF9ubzsKK3JldHJ5X2FsbG9jOgorCWdkcCA9IGV4dDRfZ2V0X2dyb3VwX2Rlc2Moc2IsIGdyb3VwX25vLCAmZ2RwX2JoKTsKKwlpZiAoIWdkcCkKKwkJZ290byBpb19lcnJvcjsKKworCWZyZWVfYmxvY2tzID0gbGUxNl90b19jcHUoZ2RwLT5iZ19mcmVlX2Jsb2Nrc19jb3VudCk7CisJLyoKKwkgKiBpZiB0aGVyZSBpcyBub3QgZW5vdWdoIGZyZWUgYmxvY2tzIHRvIG1ha2UgYSBuZXcgcmVzZXZhdGlvbgorCSAqIHR1cm4gb2ZmIHJlc2VydmF0aW9uIGZvciB0aGlzIGFsbG9jYXRpb24KKwkgKi8KKwlpZiAobXlfcnN2ICYmIChmcmVlX2Jsb2NrcyA8IHdpbmRvd3N6KQorCQkmJiAocnN2X2lzX2VtcHR5KCZteV9yc3YtPnJzdl93aW5kb3cpKSkKKwkJbXlfcnN2ID0gTlVMTDsKKworCWlmIChmcmVlX2Jsb2NrcyA+IDApIHsKKwkJYml0bWFwX2JoID0gcmVhZF9ibG9ja19iaXRtYXAoc2IsIGdyb3VwX25vKTsKKwkJaWYgKCFiaXRtYXBfYmgpCisJCQlnb3RvIGlvX2Vycm9yOworCQlncnBfYWxsb2NfYmxrID0gZXh0NF90cnlfdG9fYWxsb2NhdGVfd2l0aF9yc3Yoc2IsIGhhbmRsZSwKKwkJCQkJZ3JvdXBfbm8sIGJpdG1hcF9iaCwgZ3JwX3RhcmdldF9ibGssCisJCQkJCW15X3JzdiwJJm51bSwgJmZhdGFsKTsKKwkJaWYgKGZhdGFsKQorCQkJZ290byBvdXQ7CisJCWlmIChncnBfYWxsb2NfYmxrID49IDApCisJCQlnb3RvIGFsbG9jYXRlZDsKKwl9CisKKwluZ3JvdXBzID0gRVhUNF9TQihzYiktPnNfZ3JvdXBzX2NvdW50OworCXNtcF9ybWIoKTsKKworCS8qCisJICogTm93IHNlYXJjaCB0aGUgcmVzdCBvZiB0aGUgZ3JvdXBzLiAgV2UgYXNzdW1lIHRoYXQKKwkgKiBpIGFuZCBnZHAgY29ycmVjdGx5IHBvaW50IHRvIHRoZSBsYXN0IGdyb3VwIHZpc2l0ZWQuCisJICovCisJZm9yIChiZ2kgPSAwOyBiZ2kgPCBuZ3JvdXBzOyBiZ2krKykgeworCQlncm91cF9ubysrOworCQlpZiAoZ3JvdXBfbm8gPj0gbmdyb3VwcykKKwkJCWdyb3VwX25vID0gMDsKKwkJZ2RwID0gZXh0NF9nZXRfZ3JvdXBfZGVzYyhzYiwgZ3JvdXBfbm8sICZnZHBfYmgpOworCQlpZiAoIWdkcCkgeworCQkJKmVycnAgPSAtRUlPOworCQkJZ290byBvdXQ7CisJCX0KKwkJZnJlZV9ibG9ja3MgPSBsZTE2X3RvX2NwdShnZHAtPmJnX2ZyZWVfYmxvY2tzX2NvdW50KTsKKwkJLyoKKwkJICogc2tpcCB0aGlzIGdyb3VwIGlmIHRoZSBudW1iZXIgb2YKKwkJICogZnJlZSBibG9ja3MgaXMgbGVzcyB0aGFuIGhhbGYgb2YgdGhlIHJlc2VydmF0aW9uCisJCSAqIHdpbmRvdyBzaXplLgorCQkgKi8KKwkJaWYgKGZyZWVfYmxvY2tzIDw9ICh3aW5kb3dzei8yKSkKKwkJCWNvbnRpbnVlOworCisJCWJyZWxzZShiaXRtYXBfYmgpOworCQliaXRtYXBfYmggPSByZWFkX2Jsb2NrX2JpdG1hcChzYiwgZ3JvdXBfbm8pOworCQlpZiAoIWJpdG1hcF9iaCkKKwkJCWdvdG8gaW9fZXJyb3I7CisJCS8qCisJCSAqIHRyeSB0byBhbGxvY2F0ZSBibG9jayhzKSBmcm9tIHRoaXMgZ3JvdXAsIHdpdGhvdXQgYSBnb2FsKC0xKS4KKwkJICovCisJCWdycF9hbGxvY19ibGsgPSBleHQ0X3RyeV90b19hbGxvY2F0ZV93aXRoX3JzdihzYiwgaGFuZGxlLAorCQkJCQlncm91cF9ubywgYml0bWFwX2JoLCAtMSwgbXlfcnN2LAorCQkJCQkmbnVtLCAmZmF0YWwpOworCQlpZiAoZmF0YWwpCisJCQlnb3RvIG91dDsKKwkJaWYgKGdycF9hbGxvY19ibGsgPj0gMCkKKwkJCWdvdG8gYWxsb2NhdGVkOworCX0KKwkvKgorCSAqIFdlIG1heSBlbmQgdXAgYSBib2d1cyBlYWxpZXIgRU5PU1BDIGVycm9yIGR1ZSB0bworCSAqIGZpbGVzeXN0ZW0gaXMgImZ1bGwiIG9mIHJlc2VydmF0aW9ucywgYnV0CisJICogdGhlcmUgbWF5YmUgaW5kZWVkIGZyZWUgYmxvY2tzIGF2YWxpYWJsZSBvbiBkaXNrCisJICogSW4gdGhpcyBjYXNlLCB3ZSBqdXN0IGZvcmdldCBhYm91dCB0aGUgcmVzZXJ2YXRpb25zCisJICoganVzdCBkbyBibG9jayBhbGxvY2F0aW9uIGFzIHdpdGhvdXQgcmVzZXJ2YXRpb25zLgorCSAqLworCWlmIChteV9yc3YpIHsKKwkJbXlfcnN2ID0gTlVMTDsKKwkJZ3JvdXBfbm8gPSBnb2FsX2dyb3VwOworCQlnb3RvIHJldHJ5X2FsbG9jOworCX0KKwkvKiBObyBzcGFjZSBsZWZ0IG9uIHRoZSBkZXZpY2UgKi8KKwkqZXJycCA9IC1FTk9TUEM7CisJZ290byBvdXQ7CisKK2FsbG9jYXRlZDoKKworCWV4dDRfZGVidWcoInVzaW5nIGJsb2NrIGdyb3VwICVkKCVkKVxuIiwKKwkJCWdyb3VwX25vLCBnZHAtPmJnX2ZyZWVfYmxvY2tzX2NvdW50KTsKKworCUJVRkZFUl9UUkFDRShnZHBfYmgsICJnZXRfd3JpdGVfYWNjZXNzIik7CisJZmF0YWwgPSBleHQ0X2pvdXJuYWxfZ2V0X3dyaXRlX2FjY2VzcyhoYW5kbGUsIGdkcF9iaCk7CisJaWYgKGZhdGFsKQorCQlnb3RvIG91dDsKKworCXJldF9ibG9jayA9IGdycF9hbGxvY19ibGsgKyBleHQ0X2dyb3VwX2ZpcnN0X2Jsb2NrX25vKHNiLCBncm91cF9ubyk7CisKKwlpZiAoaW5fcmFuZ2UoZXh0NF9ibG9ja19iaXRtYXAoc2IsIGdkcCksIHJldF9ibG9jaywgbnVtKSB8fAorCSAgICBpbl9yYW5nZShleHQ0X2Jsb2NrX2JpdG1hcChzYiwgZ2RwKSwgcmV0X2Jsb2NrLCBudW0pIHx8CisJICAgIGluX3JhbmdlKHJldF9ibG9jaywgZXh0NF9pbm9kZV90YWJsZShzYiwgZ2RwKSwKKwkJICAgICBFWFQ0X1NCKHNiKS0+c19pdGJfcGVyX2dyb3VwKSB8fAorCSAgICBpbl9yYW5nZShyZXRfYmxvY2sgKyBudW0gLSAxLCBleHQ0X2lub2RlX3RhYmxlKHNiLCBnZHApLAorCQkgICAgIEVYVDRfU0Ioc2IpLT5zX2l0Yl9wZXJfZ3JvdXApKQorCQlleHQ0X2Vycm9yKHNiLCAiZXh0NF9uZXdfYmxvY2siLAorCQkJICAgICJBbGxvY2F0aW5nIGJsb2NrIGluIHN5c3RlbSB6b25lIC0gIgorCQkJICAgICJibG9ja3MgZnJvbSAlbGx1LCBsZW5ndGggJWx1IiwKKwkJCSAgICAgcmV0X2Jsb2NrLCBudW0pOworCisJcGVyZm9ybWVkX2FsbG9jYXRpb24gPSAxOworCisjaWZkZWYgQ09ORklHX0pCRF9ERUJVRworCXsKKwkJc3RydWN0IGJ1ZmZlcl9oZWFkICpkZWJ1Z19iaDsKKworCQkvKiBSZWNvcmQgYml0bWFwIGJ1ZmZlciBzdGF0ZSBpbiB0aGUgbmV3bHkgYWxsb2NhdGVkIGJsb2NrICovCisJCWRlYnVnX2JoID0gc2JfZmluZF9nZXRfYmxvY2soc2IsIHJldF9ibG9jayk7CisJCWlmIChkZWJ1Z19iaCkgeworCQkJQlVGRkVSX1RSQUNFKGRlYnVnX2JoLCAic3RhdGUgd2hlbiBhbGxvY2F0ZWQiKTsKKwkJCUJVRkZFUl9UUkFDRTIoZGVidWdfYmgsIGJpdG1hcF9iaCwgImJpdG1hcCBzdGF0ZSIpOworCQkJYnJlbHNlKGRlYnVnX2JoKTsKKwkJfQorCX0KKwlqYmRfbG9ja19iaF9zdGF0ZShiaXRtYXBfYmgpOworCXNwaW5fbG9jayhzYl9iZ2xfbG9jayhzYmksIGdyb3VwX25vKSk7CisJaWYgKGJ1ZmZlcl9qYmQoYml0bWFwX2JoKSAmJiBiaDJqaChiaXRtYXBfYmgpLT5iX2NvbW1pdHRlZF9kYXRhKSB7CisJCWludCBpOworCisJCWZvciAoaSA9IDA7IGkgPCBudW07IGkrKykgeworCQkJaWYgKGV4dDRfdGVzdF9iaXQoZ3JwX2FsbG9jX2JsaytpLAorCQkJCQliaDJqaChiaXRtYXBfYmgpLT5iX2NvbW1pdHRlZF9kYXRhKSkgeworCQkJCXByaW50aygiJXM6IGJsb2NrIHdhcyB1bmV4cGVjdGVkbHkgc2V0IGluICIKKwkJCQkJImJfY29tbWl0dGVkX2RhdGFcbiIsIF9fRlVOQ1RJT05fXyk7CisJCQl9CisJCX0KKwl9CisJZXh0NF9kZWJ1ZygiZm91bmQgYml0ICVkXG4iLCBncnBfYWxsb2NfYmxrKTsKKwlzcGluX3VubG9jayhzYl9iZ2xfbG9jayhzYmksIGdyb3VwX25vKSk7CisJamJkX3VubG9ja19iaF9zdGF0ZShiaXRtYXBfYmgpOworI2VuZGlmCisKKwlpZiAocmV0X2Jsb2NrICsgbnVtIC0gMSA+PSBleHQ0X2Jsb2Nrc19jb3VudChlcykpIHsKKwkJZXh0NF9lcnJvcihzYiwgImV4dDRfbmV3X2Jsb2NrIiwKKwkJCSAgICAiYmxvY2soJWxsdSkgPj0gYmxvY2tzIGNvdW50KCVsbHUpIC0gIgorCQkJICAgICJibG9ja19ncm91cCA9ICVsdSwgZXMgPT0gJXAgIiwgcmV0X2Jsb2NrLAorCQkJZXh0NF9ibG9ja3NfY291bnQoZXMpLCBncm91cF9ubywgZXMpOworCQlnb3RvIG91dDsKKwl9CisKKwkvKgorCSAqIEl0IGlzIHVwIHRvIHRoZSBjYWxsZXIgdG8gYWRkIHRoZSBuZXcgYnVmZmVyIHRvIGEgam91cm5hbAorCSAqIGxpc3Qgb2Ygc29tZSBkZXNjcmlwdGlvbi4gIFdlIGRvbid0IGtub3cgaW4gYWR2YW5jZSB3aGV0aGVyCisJICogdGhlIGNhbGxlciB3YW50cyB0byB1c2UgaXQgYXMgbWV0YWRhdGEgb3IgZGF0YS4KKwkgKi8KKwlleHQ0X2RlYnVnKCJhbGxvY2F0aW5nIGJsb2NrICVsdS4gR29hbCBoaXRzICVkIG9mICVkLlxuIiwKKwkJCXJldF9ibG9jaywgZ29hbF9oaXRzLCBnb2FsX2F0dGVtcHRzKTsKKworCXNwaW5fbG9jayhzYl9iZ2xfbG9jayhzYmksIGdyb3VwX25vKSk7CisJZ2RwLT5iZ19mcmVlX2Jsb2Nrc19jb3VudCA9CisJCQljcHVfdG9fbGUxNihsZTE2X3RvX2NwdShnZHAtPmJnX2ZyZWVfYmxvY2tzX2NvdW50KS1udW0pOworCXNwaW5fdW5sb2NrKHNiX2JnbF9sb2NrKHNiaSwgZ3JvdXBfbm8pKTsKKwlwZXJjcHVfY291bnRlcl9tb2QoJnNiaS0+c19mcmVlYmxvY2tzX2NvdW50ZXIsIC1udW0pOworCisJQlVGRkVSX1RSQUNFKGdkcF9iaCwgImpvdXJuYWxfZGlydHlfbWV0YWRhdGEgZm9yIGdyb3VwIGRlc2NyaXB0b3IiKTsKKwllcnIgPSBleHQ0X2pvdXJuYWxfZGlydHlfbWV0YWRhdGEoaGFuZGxlLCBnZHBfYmgpOworCWlmICghZmF0YWwpCisJCWZhdGFsID0gZXJyOworCisJc2ItPnNfZGlydCA9IDE7CisJaWYgKGZhdGFsKQorCQlnb3RvIG91dDsKKworCSplcnJwID0gMDsKKwlicmVsc2UoYml0bWFwX2JoKTsKKwlEUVVPVF9GUkVFX0JMT0NLKGlub2RlLCAqY291bnQtbnVtKTsKKwkqY291bnQgPSBudW07CisJcmV0dXJuIHJldF9ibG9jazsKKworaW9fZXJyb3I6CisJKmVycnAgPSAtRUlPOworb3V0OgorCWlmIChmYXRhbCkgeworCQkqZXJycCA9IGZhdGFsOworCQlleHQ0X3N0ZF9lcnJvcihzYiwgZmF0YWwpOworCX0KKwkvKgorCSAqIFVuZG8gdGhlIGJsb2NrIGFsbG9jYXRpb24KKwkgKi8KKwlpZiAoIXBlcmZvcm1lZF9hbGxvY2F0aW9uKQorCQlEUVVPVF9GUkVFX0JMT0NLKGlub2RlLCAqY291bnQpOworCWJyZWxzZShiaXRtYXBfYmgpOworCXJldHVybiAwOworfQorCitleHQ0X2ZzYmxrX3QgZXh0NF9uZXdfYmxvY2soaGFuZGxlX3QgKmhhbmRsZSwgc3RydWN0IGlub2RlICppbm9kZSwKKwkJCWV4dDRfZnNibGtfdCBnb2FsLCBpbnQgKmVycnApCit7CisJdW5zaWduZWQgbG9uZyBjb3VudCA9IDE7CisKKwlyZXR1cm4gZXh0NF9uZXdfYmxvY2tzKGhhbmRsZSwgaW5vZGUsIGdvYWwsICZjb3VudCwgZXJycCk7Cit9CisKKy8qKgorICogZXh0NF9jb3VudF9mcmVlX2Jsb2NrcygpIC0tIGNvdW50IGZpbGVzeXN0ZW0gZnJlZSBibG9ja3MKKyAqIEBzYjoJCXN1cGVyYmxvY2sKKyAqCisgKiBBZGRzIHVwIHRoZSBudW1iZXIgb2YgZnJlZSBibG9ja3MgZnJvbSBlYWNoIGJsb2NrIGdyb3VwLgorICovCitleHQ0X2ZzYmxrX3QgZXh0NF9jb3VudF9mcmVlX2Jsb2NrcyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKQoreworCWV4dDRfZnNibGtfdCBkZXNjX2NvdW50OworCXN0cnVjdCBleHQ0X2dyb3VwX2Rlc2MgKmdkcDsKKwlpbnQgaTsKKwl1bnNpZ25lZCBsb25nIG5ncm91cHMgPSBFWFQ0X1NCKHNiKS0+c19ncm91cHNfY291bnQ7CisjaWZkZWYgRVhUNEZTX0RFQlVHCisJc3RydWN0IGV4dDRfc3VwZXJfYmxvY2sgKmVzOworCWV4dDRfZnNibGtfdCBiaXRtYXBfY291bnQ7CisJdW5zaWduZWQgbG9uZyB4OworCXN0cnVjdCBidWZmZXJfaGVhZCAqYml0bWFwX2JoID0gTlVMTDsKKworCWVzID0gRVhUNF9TQihzYiktPnNfZXM7CisJZGVzY19jb3VudCA9IDA7CisJYml0bWFwX2NvdW50ID0gMDsKKwlnZHAgPSBOVUxMOworCisJc21wX3JtYigpOworCWZvciAoaSA9IDA7IGkgPCBuZ3JvdXBzOyBpKyspIHsKKwkJZ2RwID0gZXh0NF9nZXRfZ3JvdXBfZGVzYyhzYiwgaSwgTlVMTCk7CisJCWlmICghZ2RwKQorCQkJY29udGludWU7CisJCWRlc2NfY291bnQgKz0gbGUxNl90b19jcHUoZ2RwLT5iZ19mcmVlX2Jsb2Nrc19jb3VudCk7CisJCWJyZWxzZShiaXRtYXBfYmgpOworCQliaXRtYXBfYmggPSByZWFkX2Jsb2NrX2JpdG1hcChzYiwgaSk7CisJCWlmIChiaXRtYXBfYmggPT0gTlVMTCkKKwkJCWNvbnRpbnVlOworCisJCXggPSBleHQ0X2NvdW50X2ZyZWUoYml0bWFwX2JoLCBzYi0+c19ibG9ja3NpemUpOworCQlwcmludGsoImdyb3VwICVkOiBzdG9yZWQgPSAlZCwgY291bnRlZCA9ICVsdVxuIiwKKwkJCWksIGxlMTZfdG9fY3B1KGdkcC0+YmdfZnJlZV9ibG9ja3NfY291bnQpLCB4KTsKKwkJYml0bWFwX2NvdW50ICs9IHg7CisJfQorCWJyZWxzZShiaXRtYXBfYmgpOworCXByaW50aygiZXh0NF9jb3VudF9mcmVlX2Jsb2Nrczogc3RvcmVkID0gJWxsdSIKKwkJIiwgY29tcHV0ZWQgPSAlbGx1LCAlbGx1XG4iLAorCSAgICAgICBFWFQ0X0ZSRUVfQkxPQ0tTX0NPVU5UKGVzKSwKKwkJZGVzY19jb3VudCwgYml0bWFwX2NvdW50KTsKKwlyZXR1cm4gYml0bWFwX2NvdW50OworI2Vsc2UKKwlkZXNjX2NvdW50ID0gMDsKKwlzbXBfcm1iKCk7CisJZm9yIChpID0gMDsgaSA8IG5ncm91cHM7IGkrKykgeworCQlnZHAgPSBleHQ0X2dldF9ncm91cF9kZXNjKHNiLCBpLCBOVUxMKTsKKwkJaWYgKCFnZHApCisJCQljb250aW51ZTsKKwkJZGVzY19jb3VudCArPSBsZTE2X3RvX2NwdShnZHAtPmJnX2ZyZWVfYmxvY2tzX2NvdW50KTsKKwl9CisKKwlyZXR1cm4gZGVzY19jb3VudDsKKyNlbmRpZgorfQorCitzdGF0aWMgaW5saW5lIGludAorYmxvY2tfaW5fdXNlKGV4dDRfZnNibGtfdCBibG9jaywgc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgdW5zaWduZWQgY2hhciAqbWFwKQoreworCWV4dDRfZ3JwYmxrX3Qgb2Zmc2V0OworCisJZXh0NF9nZXRfZ3JvdXBfbm9fYW5kX29mZnNldChzYiwgYmxvY2ssIE5VTEwsICZvZmZzZXQpOworCXJldHVybiBleHQ0X3Rlc3RfYml0IChvZmZzZXQsIG1hcCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IHRlc3Rfcm9vdChpbnQgYSwgaW50IGIpCit7CisJaW50IG51bSA9IGI7CisKKwl3aGlsZSAoYSA+IG51bSkKKwkJbnVtICo9IGI7CisJcmV0dXJuIG51bSA9PSBhOworfQorCitzdGF0aWMgaW50IGV4dDRfZ3JvdXBfc3BhcnNlKGludCBncm91cCkKK3sKKwlpZiAoZ3JvdXAgPD0gMSkKKwkJcmV0dXJuIDE7CisJaWYgKCEoZ3JvdXAgJiAxKSkKKwkJcmV0dXJuIDA7CisJcmV0dXJuICh0ZXN0X3Jvb3QoZ3JvdXAsIDcpIHx8IHRlc3Rfcm9vdChncm91cCwgNSkgfHwKKwkJdGVzdF9yb290KGdyb3VwLCAzKSk7Cit9CisKKy8qKgorICoJZXh0NF9iZ19oYXNfc3VwZXIgLSBudW1iZXIgb2YgYmxvY2tzIHVzZWQgYnkgdGhlIHN1cGVyYmxvY2sgaW4gZ3JvdXAKKyAqCUBzYjogc3VwZXJibG9jayBmb3IgZmlsZXN5c3RlbQorICoJQGdyb3VwOiBncm91cCBudW1iZXIgdG8gY2hlY2sKKyAqCisgKglSZXR1cm4gdGhlIG51bWJlciBvZiBibG9ja3MgdXNlZCBieSB0aGUgc3VwZXJibG9jayAocHJpbWFyeSBvciBiYWNrdXApCisgKglpbiB0aGlzIGdyb3VwLiAgQ3VycmVudGx5IHRoaXMgd2lsbCBiZSBvbmx5IDAgb3IgMS4KKyAqLworaW50IGV4dDRfYmdfaGFzX3N1cGVyKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGludCBncm91cCkKK3sKKwlpZiAoRVhUNF9IQVNfUk9fQ09NUEFUX0ZFQVRVUkUoc2IsCisJCQkJRVhUNF9GRUFUVVJFX1JPX0NPTVBBVF9TUEFSU0VfU1VQRVIpICYmCisJCQkhZXh0NF9ncm91cF9zcGFyc2UoZ3JvdXApKQorCQlyZXR1cm4gMDsKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIHVuc2lnbmVkIGxvbmcgZXh0NF9iZ19udW1fZ2RiX21ldGEoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgaW50IGdyb3VwKQoreworCXVuc2lnbmVkIGxvbmcgbWV0YWdyb3VwID0gZ3JvdXAgLyBFWFQ0X0RFU0NfUEVSX0JMT0NLKHNiKTsKKwl1bnNpZ25lZCBsb25nIGZpcnN0ID0gbWV0YWdyb3VwICogRVhUNF9ERVNDX1BFUl9CTE9DSyhzYik7CisJdW5zaWduZWQgbG9uZyBsYXN0ID0gZmlyc3QgKyBFWFQ0X0RFU0NfUEVSX0JMT0NLKHNiKSAtIDE7CisKKwlpZiAoZ3JvdXAgPT0gZmlyc3QgfHwgZ3JvdXAgPT0gZmlyc3QgKyAxIHx8IGdyb3VwID09IGxhc3QpCisJCXJldHVybiAxOworCXJldHVybiAwOworfQorCitzdGF0aWMgdW5zaWduZWQgbG9uZyBleHQ0X2JnX251bV9nZGJfbm9tZXRhKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGludCBncm91cCkKK3sKKwlpZiAoRVhUNF9IQVNfUk9fQ09NUEFUX0ZFQVRVUkUoc2IsCisJCQkJRVhUNF9GRUFUVVJFX1JPX0NPTVBBVF9TUEFSU0VfU1VQRVIpICYmCisJCQkhZXh0NF9ncm91cF9zcGFyc2UoZ3JvdXApKQorCQlyZXR1cm4gMDsKKwlyZXR1cm4gRVhUNF9TQihzYiktPnNfZ2RiX2NvdW50OworfQorCisvKioKKyAqCWV4dDRfYmdfbnVtX2dkYiAtIG51bWJlciBvZiBibG9ja3MgdXNlZCBieSB0aGUgZ3JvdXAgdGFibGUgaW4gZ3JvdXAKKyAqCUBzYjogc3VwZXJibG9jayBmb3IgZmlsZXN5c3RlbQorICoJQGdyb3VwOiBncm91cCBudW1iZXIgdG8gY2hlY2sKKyAqCisgKglSZXR1cm4gdGhlIG51bWJlciBvZiBibG9ja3MgdXNlZCBieSB0aGUgZ3JvdXAgZGVzY3JpcHRvciB0YWJsZQorICoJKHByaW1hcnkgb3IgYmFja3VwKSBpbiB0aGlzIGdyb3VwLiAgSW4gdGhlIGZ1dHVyZSB0aGVyZSBtYXkgYmUgYQorICoJZGlmZmVyZW50IG51bWJlciBvZiBkZXNjcmlwdG9yIGJsb2NrcyBpbiBlYWNoIGdyb3VwLgorICovCit1bnNpZ25lZCBsb25nIGV4dDRfYmdfbnVtX2dkYihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBpbnQgZ3JvdXApCit7CisJdW5zaWduZWQgbG9uZyBmaXJzdF9tZXRhX2JnID0KKwkJCWxlMzJfdG9fY3B1KEVYVDRfU0Ioc2IpLT5zX2VzLT5zX2ZpcnN0X21ldGFfYmcpOworCXVuc2lnbmVkIGxvbmcgbWV0YWdyb3VwID0gZ3JvdXAgLyBFWFQ0X0RFU0NfUEVSX0JMT0NLKHNiKTsKKworCWlmICghRVhUNF9IQVNfSU5DT01QQVRfRkVBVFVSRShzYixFWFQ0X0ZFQVRVUkVfSU5DT01QQVRfTUVUQV9CRykgfHwKKwkJCW1ldGFncm91cCA8IGZpcnN0X21ldGFfYmcpCisJCXJldHVybiBleHQ0X2JnX251bV9nZGJfbm9tZXRhKHNiLGdyb3VwKTsKKworCXJldHVybiBleHQ0X2JnX251bV9nZGJfbWV0YShzYixncm91cCk7CisKK30KZGlmZiAtLWdpdCBhL2ZzL2V4dDQvYml0bWFwLmMgYi9mcy9leHQ0L2JpdG1hcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjExZTkzYzEKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9leHQ0L2JpdG1hcC5jCkBAIC0wLDAgKzEsMzIgQEAKKy8qCisgKiAgbGludXgvZnMvZXh0NC9iaXRtYXAuYworICoKKyAqIENvcHlyaWdodCAoQykgMTk5MiwgMTk5MywgMTk5NCwgMTk5NQorICogUmVteSBDYXJkIChjYXJkQG1hc2kuaWJwLmZyKQorICogTGFib3JhdG9pcmUgTUFTSSAtIEluc3RpdHV0IEJsYWlzZSBQYXNjYWwKKyAqIFVuaXZlcnNpdGUgUGllcnJlIGV0IE1hcmllIEN1cmllIChQYXJpcyBWSSkKKyAqLworCisjaW5jbHVkZSA8bGludXgvYnVmZmVyX2hlYWQuaD4KKyNpbmNsdWRlIDxsaW51eC9qYmQyLmg+CisjaW5jbHVkZSA8bGludXgvZXh0NF9mcy5oPgorCisjaWZkZWYgRVhUNEZTX0RFQlVHCisKK3N0YXRpYyBpbnQgbmliYmxlbWFwW10gPSB7NCwgMywgMywgMiwgMywgMiwgMiwgMSwgMywgMiwgMiwgMSwgMiwgMSwgMSwgMH07CisKK3Vuc2lnbmVkIGxvbmcgZXh0NF9jb3VudF9mcmVlIChzdHJ1Y3QgYnVmZmVyX2hlYWQgKiBtYXAsIHVuc2lnbmVkIGludCBudW1jaGFycykKK3sKKwl1bnNpZ25lZCBpbnQgaTsKKwl1bnNpZ25lZCBsb25nIHN1bSA9IDA7CisKKwlpZiAoIW1hcCkKKwkJcmV0dXJuICgwKTsKKwlmb3IgKGkgPSAwOyBpIDwgbnVtY2hhcnM7IGkrKykKKwkJc3VtICs9IG5pYmJsZW1hcFttYXAtPmJfZGF0YVtpXSAmIDB4Zl0gKworCQkJbmliYmxlbWFwWyhtYXAtPmJfZGF0YVtpXSA+PiA0KSAmIDB4Zl07CisJcmV0dXJuIChzdW0pOworfQorCisjZW5kaWYgIC8qICBFWFQ0RlNfREVCVUcgICovCisKZGlmZiAtLWdpdCBhL2ZzL2V4dDQvZGlyLmMgYi9mcy9leHQ0L2Rpci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY4NTk1NzgKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9leHQ0L2Rpci5jCkBAIC0wLDAgKzEsNTE4IEBACisvKgorICogIGxpbnV4L2ZzL2V4dDQvZGlyLmMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTIsIDE5OTMsIDE5OTQsIDE5OTUKKyAqIFJlbXkgQ2FyZCAoY2FyZEBtYXNpLmlicC5mcikKKyAqIExhYm9yYXRvaXJlIE1BU0kgLSBJbnN0aXR1dCBCbGFpc2UgUGFzY2FsCisgKiBVbml2ZXJzaXRlIFBpZXJyZSBldCBNYXJpZSBDdXJpZSAoUGFyaXMgVkkpCisgKgorICogIGZyb20KKyAqCisgKiAgbGludXgvZnMvbWluaXgvZGlyLmMKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAxOTkxLCAxOTkyICBMaW51cyBUb3J2YWxkcworICoKKyAqICBleHQ0IGRpcmVjdG9yeSBoYW5kbGluZyBmdW5jdGlvbnMKKyAqCisgKiAgQmlnLWVuZGlhbiB0byBsaXR0bGUtZW5kaWFuIGJ5dGUtc3dhcHBpbmcvYml0bWFwcyBieQorICogICAgICAgIERhdmlkIFMuIE1pbGxlciAoZGF2ZW1AY2FpcC5ydXRnZXJzLmVkdSksIDE5OTUKKyAqCisgKiBIYXNoIFRyZWUgRGlyZWN0b3J5IGluZGV4aW5nIChjKSAyMDAxICBEYW5pZWwgUGhpbGxpcHMKKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvamJkMi5oPgorI2luY2x1ZGUgPGxpbnV4L2V4dDRfZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9idWZmZXJfaGVhZC5oPgorI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3JidHJlZS5oPgorCitzdGF0aWMgdW5zaWduZWQgY2hhciBleHQ0X2ZpbGV0eXBlX3RhYmxlW10gPSB7CisJRFRfVU5LTk9XTiwgRFRfUkVHLCBEVF9ESVIsIERUX0NIUiwgRFRfQkxLLCBEVF9GSUZPLCBEVF9TT0NLLCBEVF9MTksKK307CisKK3N0YXRpYyBpbnQgZXh0NF9yZWFkZGlyKHN0cnVjdCBmaWxlICosIHZvaWQgKiwgZmlsbGRpcl90KTsKK3N0YXRpYyBpbnQgZXh0NF9keF9yZWFkZGlyKHN0cnVjdCBmaWxlICogZmlscCwKKwkJCSAgIHZvaWQgKiBkaXJlbnQsIGZpbGxkaXJfdCBmaWxsZGlyKTsKK3N0YXRpYyBpbnQgZXh0NF9yZWxlYXNlX2RpciAoc3RydWN0IGlub2RlICogaW5vZGUsCisJCQkJc3RydWN0IGZpbGUgKiBmaWxwKTsKKworY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBleHQ0X2Rpcl9vcGVyYXRpb25zID0geworCS5sbHNlZWsJCT0gZ2VuZXJpY19maWxlX2xsc2VlaywKKwkucmVhZAkJPSBnZW5lcmljX3JlYWRfZGlyLAorCS5yZWFkZGlyCT0gZXh0NF9yZWFkZGlyLAkJLyogd2UgdGFrZSBCS0wuIG5lZWRlZD8qLworCS5pb2N0bAkJPSBleHQ0X2lvY3RsLAkJLyogQktMIGhlbGQgKi8KKyNpZmRlZiBDT05GSUdfQ09NUEFUCisJLmNvbXBhdF9pb2N0bAk9IGV4dDRfY29tcGF0X2lvY3RsLAorI2VuZGlmCisJLmZzeW5jCQk9IGV4dDRfc3luY19maWxlLAkvKiBCS0wgaGVsZCAqLworI2lmZGVmIENPTkZJR19FWFQ0X0lOREVYCisJLnJlbGVhc2UJPSBleHQ0X3JlbGVhc2VfZGlyLAorI2VuZGlmCit9OworCisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIGdldF9kdHlwZShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBpbnQgZmlsZXR5cGUpCit7CisJaWYgKCFFWFQ0X0hBU19JTkNPTVBBVF9GRUFUVVJFKHNiLCBFWFQ0X0ZFQVRVUkVfSU5DT01QQVRfRklMRVRZUEUpIHx8CisJICAgIChmaWxldHlwZSA+PSBFWFQ0X0ZUX01BWCkpCisJCXJldHVybiBEVF9VTktOT1dOOworCisJcmV0dXJuIChleHQ0X2ZpbGV0eXBlX3RhYmxlW2ZpbGV0eXBlXSk7Cit9CisKKworaW50IGV4dDRfY2hlY2tfZGlyX2VudHJ5IChjb25zdCBjaGFyICogZnVuY3Rpb24sIHN0cnVjdCBpbm9kZSAqIGRpciwKKwkJCSAgc3RydWN0IGV4dDRfZGlyX2VudHJ5XzIgKiBkZSwKKwkJCSAgc3RydWN0IGJ1ZmZlcl9oZWFkICogYmgsCisJCQkgIHVuc2lnbmVkIGxvbmcgb2Zmc2V0KQoreworCWNvbnN0IGNoYXIgKiBlcnJvcl9tc2cgPSBOVUxMOworCWNvbnN0IGludCBybGVuID0gbGUxNl90b19jcHUoZGUtPnJlY19sZW4pOworCisJaWYgKHJsZW4gPCBFWFQ0X0RJUl9SRUNfTEVOKDEpKQorCQllcnJvcl9tc2cgPSAicmVjX2xlbiBpcyBzbWFsbGVyIHRoYW4gbWluaW1hbCI7CisJZWxzZSBpZiAocmxlbiAlIDQgIT0gMCkKKwkJZXJyb3JfbXNnID0gInJlY19sZW4gJSA0ICE9IDAiOworCWVsc2UgaWYgKHJsZW4gPCBFWFQ0X0RJUl9SRUNfTEVOKGRlLT5uYW1lX2xlbikpCisJCWVycm9yX21zZyA9ICJyZWNfbGVuIGlzIHRvbyBzbWFsbCBmb3IgbmFtZV9sZW4iOworCWVsc2UgaWYgKCgoY2hhciAqKSBkZSAtIGJoLT5iX2RhdGEpICsgcmxlbiA+IGRpci0+aV9zYi0+c19ibG9ja3NpemUpCisJCWVycm9yX21zZyA9ICJkaXJlY3RvcnkgZW50cnkgYWNyb3NzIGJsb2NrcyI7CisJZWxzZSBpZiAobGUzMl90b19jcHUoZGUtPmlub2RlKSA+CisJCQlsZTMyX3RvX2NwdShFWFQ0X1NCKGRpci0+aV9zYiktPnNfZXMtPnNfaW5vZGVzX2NvdW50KSkKKwkJZXJyb3JfbXNnID0gImlub2RlIG91dCBvZiBib3VuZHMiOworCisJaWYgKGVycm9yX21zZyAhPSBOVUxMKQorCQlleHQ0X2Vycm9yIChkaXItPmlfc2IsIGZ1bmN0aW9uLAorCQkJImJhZCBlbnRyeSBpbiBkaXJlY3RvcnkgIyVsdTogJXMgLSAiCisJCQkib2Zmc2V0PSVsdSwgaW5vZGU9JWx1LCByZWNfbGVuPSVkLCBuYW1lX2xlbj0lZCIsCisJCQlkaXItPmlfaW5vLCBlcnJvcl9tc2csIG9mZnNldCwKKwkJCSh1bnNpZ25lZCBsb25nKSBsZTMyX3RvX2NwdShkZS0+aW5vZGUpLAorCQkJcmxlbiwgZGUtPm5hbWVfbGVuKTsKKwlyZXR1cm4gZXJyb3JfbXNnID09IE5VTEwgPyAxIDogMDsKK30KKworc3RhdGljIGludCBleHQ0X3JlYWRkaXIoc3RydWN0IGZpbGUgKiBmaWxwLAorCQkJIHZvaWQgKiBkaXJlbnQsIGZpbGxkaXJfdCBmaWxsZGlyKQoreworCWludCBlcnJvciA9IDA7CisJdW5zaWduZWQgbG9uZyBvZmZzZXQ7CisJaW50IGksIHN0b3JlZDsKKwlzdHJ1Y3QgZXh0NF9kaXJfZW50cnlfMiAqZGU7CisJc3RydWN0IHN1cGVyX2Jsb2NrICpzYjsKKwlpbnQgZXJyOworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBmaWxwLT5mX2RlbnRyeS0+ZF9pbm9kZTsKKwlpbnQgcmV0ID0gMDsKKworCXNiID0gaW5vZGUtPmlfc2I7CisKKyNpZmRlZiBDT05GSUdfRVhUNF9JTkRFWAorCWlmIChFWFQ0X0hBU19DT01QQVRfRkVBVFVSRShpbm9kZS0+aV9zYiwKKwkJCQkgICAgRVhUNF9GRUFUVVJFX0NPTVBBVF9ESVJfSU5ERVgpICYmCisJICAgICgoRVhUNF9JKGlub2RlKS0+aV9mbGFncyAmIEVYVDRfSU5ERVhfRkwpIHx8CisJICAgICAoKGlub2RlLT5pX3NpemUgPj4gc2ItPnNfYmxvY2tzaXplX2JpdHMpID09IDEpKSkgeworCQllcnIgPSBleHQ0X2R4X3JlYWRkaXIoZmlscCwgZGlyZW50LCBmaWxsZGlyKTsKKwkJaWYgKGVyciAhPSBFUlJfQkFEX0RYX0RJUikgeworCQkJcmV0ID0gZXJyOworCQkJZ290byBvdXQ7CisJCX0KKwkJLyoKKwkJICogV2UgZG9uJ3Qgc2V0IHRoZSBpbm9kZSBkaXJ0eSBmbGFnIHNpbmNlIGl0J3Mgbm90CisJCSAqIGNyaXRpY2FsIHRoYXQgaXQgZ2V0IGZsdXNoZWQgYmFjayB0byB0aGUgZGlzay4KKwkJICovCisJCUVYVDRfSShmaWxwLT5mX2RlbnRyeS0+ZF9pbm9kZSktPmlfZmxhZ3MgJj0gfkVYVDRfSU5ERVhfRkw7CisJfQorI2VuZGlmCisJc3RvcmVkID0gMDsKKwlvZmZzZXQgPSBmaWxwLT5mX3BvcyAmIChzYi0+c19ibG9ja3NpemUgLSAxKTsKKworCXdoaWxlICghZXJyb3IgJiYgIXN0b3JlZCAmJiBmaWxwLT5mX3BvcyA8IGlub2RlLT5pX3NpemUpIHsKKwkJdW5zaWduZWQgbG9uZyBibGsgPSBmaWxwLT5mX3BvcyA+PiBFWFQ0X0JMT0NLX1NJWkVfQklUUyhzYik7CisJCXN0cnVjdCBidWZmZXJfaGVhZCBtYXBfYmg7CisJCXN0cnVjdCBidWZmZXJfaGVhZCAqYmggPSBOVUxMOworCisJCW1hcF9iaC5iX3N0YXRlID0gMDsKKwkJZXJyID0gZXh0NF9nZXRfYmxvY2tzX3dyYXAoTlVMTCwgaW5vZGUsIGJsaywgMSwgJm1hcF9iaCwgMCwgMCk7CisJCWlmIChlcnIgPiAwKSB7CisJCQlwYWdlX2NhY2hlX3JlYWRhaGVhZChzYi0+c19iZGV2LT5iZF9pbm9kZS0+aV9tYXBwaW5nLAorCQkJCSZmaWxwLT5mX3JhLAorCQkJCWZpbHAsCisJCQkJbWFwX2JoLmJfYmxvY2tuciA+PgorCQkJCQkoUEFHRV9DQUNIRV9TSElGVCAtIGlub2RlLT5pX2Jsa2JpdHMpLAorCQkJCTEpOworCQkJYmggPSBleHQ0X2JyZWFkKE5VTEwsIGlub2RlLCBibGssIDAsICZlcnIpOworCQl9CisKKwkJLyoKKwkJICogV2UgaWdub3JlIEkvTyBlcnJvcnMgb24gZGlyZWN0b3JpZXMgc28gdXNlcnMgaGF2ZSBhIGNoYW5jZQorCQkgKiBvZiByZWNvdmVyaW5nIGRhdGEgd2hlbiB0aGVyZSdzIGEgYmFkIHNlY3RvcgorCQkgKi8KKwkJaWYgKCFiaCkgeworCQkJZXh0NF9lcnJvciAoc2IsICJleHQ0X3JlYWRkaXIiLAorCQkJCSJkaXJlY3RvcnkgIyVsdSBjb250YWlucyBhIGhvbGUgYXQgb2Zmc2V0ICVsdSIsCisJCQkJaW5vZGUtPmlfaW5vLCAodW5zaWduZWQgbG9uZylmaWxwLT5mX3Bvcyk7CisJCQlmaWxwLT5mX3BvcyArPSBzYi0+c19ibG9ja3NpemUgLSBvZmZzZXQ7CisJCQljb250aW51ZTsKKwkJfQorCityZXZhbGlkYXRlOgorCQkvKiBJZiB0aGUgZGlyIGJsb2NrIGhhcyBjaGFuZ2VkIHNpbmNlIHRoZSBsYXN0IGNhbGwgdG8KKwkJICogcmVhZGRpcigyKSwgdGhlbiB3ZSBtaWdodCBiZSBwb2ludGluZyB0byBhbiBpbnZhbGlkCisJCSAqIGRpcmVudCByaWdodCBub3cuICBTY2FuIGZyb20gdGhlIHN0YXJ0IG9mIHRoZSBibG9jaworCQkgKiB0byBtYWtlIHN1cmUuICovCisJCWlmIChmaWxwLT5mX3ZlcnNpb24gIT0gaW5vZGUtPmlfdmVyc2lvbikgeworCQkJZm9yIChpID0gMDsgaSA8IHNiLT5zX2Jsb2Nrc2l6ZSAmJiBpIDwgb2Zmc2V0OyApIHsKKwkJCQlkZSA9IChzdHJ1Y3QgZXh0NF9kaXJfZW50cnlfMiAqKQorCQkJCQkoYmgtPmJfZGF0YSArIGkpOworCQkJCS8qIEl0J3MgdG9vIGV4cGVuc2l2ZSB0byBkbyBhIGZ1bGwKKwkJCQkgKiBkaXJlbnQgdGVzdCBlYWNoIHRpbWUgcm91bmQgdGhpcworCQkJCSAqIGxvb3AsIGJ1dCB3ZSBkbyBoYXZlIHRvIHRlc3QgYXQKKwkJCQkgKiBsZWFzdCB0aGF0IGl0IGlzIG5vbi16ZXJvLiAgQQorCQkJCSAqIGZhaWx1cmUgd2lsbCBiZSBkZXRlY3RlZCBpbiB0aGUKKwkJCQkgKiBkaXJlbnQgdGVzdCBiZWxvdy4gKi8KKwkJCQlpZiAobGUxNl90b19jcHUoZGUtPnJlY19sZW4pIDwKKwkJCQkJCUVYVDRfRElSX1JFQ19MRU4oMSkpCisJCQkJCWJyZWFrOworCQkJCWkgKz0gbGUxNl90b19jcHUoZGUtPnJlY19sZW4pOworCQkJfQorCQkJb2Zmc2V0ID0gaTsKKwkJCWZpbHAtPmZfcG9zID0gKGZpbHAtPmZfcG9zICYgfihzYi0+c19ibG9ja3NpemUgLSAxKSkKKwkJCQl8IG9mZnNldDsKKwkJCWZpbHAtPmZfdmVyc2lvbiA9IGlub2RlLT5pX3ZlcnNpb247CisJCX0KKworCQl3aGlsZSAoIWVycm9yICYmIGZpbHAtPmZfcG9zIDwgaW5vZGUtPmlfc2l6ZQorCQkgICAgICAgJiYgb2Zmc2V0IDwgc2ItPnNfYmxvY2tzaXplKSB7CisJCQlkZSA9IChzdHJ1Y3QgZXh0NF9kaXJfZW50cnlfMiAqKSAoYmgtPmJfZGF0YSArIG9mZnNldCk7CisJCQlpZiAoIWV4dDRfY2hlY2tfZGlyX2VudHJ5ICgiZXh0NF9yZWFkZGlyIiwgaW5vZGUsIGRlLAorCQkJCQkJICAgYmgsIG9mZnNldCkpIHsKKwkJCQkvKgorCQkJCSAqIE9uIGVycm9yLCBza2lwIHRoZSBmX3BvcyB0byB0aGUgbmV4dCBibG9jaworCQkJCSAqLworCQkJCWZpbHAtPmZfcG9zID0gKGZpbHAtPmZfcG9zIHwKKwkJCQkJCShzYi0+c19ibG9ja3NpemUgLSAxKSkgKyAxOworCQkJCWJyZWxzZSAoYmgpOworCQkJCXJldCA9IHN0b3JlZDsKKwkJCQlnb3RvIG91dDsKKwkJCX0KKwkJCW9mZnNldCArPSBsZTE2X3RvX2NwdShkZS0+cmVjX2xlbik7CisJCQlpZiAobGUzMl90b19jcHUoZGUtPmlub2RlKSkgeworCQkJCS8qIFdlIG1pZ2h0IGJsb2NrIGluIHRoZSBuZXh0IHNlY3Rpb24KKwkJCQkgKiBpZiB0aGUgZGF0YSBkZXN0aW5hdGlvbiBpcworCQkJCSAqIGN1cnJlbnRseSBzd2FwcGVkIG91dC4gIFNvLCB1c2UgYQorCQkJCSAqIHZlcnNpb24gc3RhbXAgdG8gZGV0ZWN0IHdoZXRoZXIgb3IKKwkJCQkgKiBub3QgdGhlIGRpcmVjdG9yeSBoYXMgYmVlbiBtb2RpZmllZAorCQkJCSAqIGR1cmluZyB0aGUgY29weSBvcGVyYXRpb24uCisJCQkJICovCisJCQkJdW5zaWduZWQgbG9uZyB2ZXJzaW9uID0gZmlscC0+Zl92ZXJzaW9uOworCisJCQkJZXJyb3IgPSBmaWxsZGlyKGRpcmVudCwgZGUtPm5hbWUsCisJCQkJCQlkZS0+bmFtZV9sZW4sCisJCQkJCQlmaWxwLT5mX3BvcywKKwkJCQkJCWxlMzJfdG9fY3B1KGRlLT5pbm9kZSksCisJCQkJCQlnZXRfZHR5cGUoc2IsIGRlLT5maWxlX3R5cGUpKTsKKwkJCQlpZiAoZXJyb3IpCisJCQkJCWJyZWFrOworCQkJCWlmICh2ZXJzaW9uICE9IGZpbHAtPmZfdmVyc2lvbikKKwkJCQkJZ290byByZXZhbGlkYXRlOworCQkJCXN0b3JlZCArKzsKKwkJCX0KKwkJCWZpbHAtPmZfcG9zICs9IGxlMTZfdG9fY3B1KGRlLT5yZWNfbGVuKTsKKwkJfQorCQlvZmZzZXQgPSAwOworCQlicmVsc2UgKGJoKTsKKwl9CitvdXQ6CisJcmV0dXJuIHJldDsKK30KKworI2lmZGVmIENPTkZJR19FWFQ0X0lOREVYCisvKgorICogVGhlc2UgZnVuY3Rpb25zIGNvbnZlcnQgZnJvbSB0aGUgbWFqb3IvbWlub3IgaGFzaCB0byBhbiBmX3BvcworICogdmFsdWUuCisgKgorICogQ3VycmVudGx5IHdlIG9ubHkgdXNlIG1ham9yIGhhc2ggbnVtZXIuICBUaGlzIGlzIHVuZm9ydHVuYXRlLCBidXQKKyAqIG9uIDMyLWJpdCBtYWNoaW5lcywgdGhlIHNhbWUgVkZTIGludGVyZmFjZSBpcyB1c2VkIGZvciBsc2VlayBhbmQKKyAqIGxsc2Vlaywgc28gaWYgd2UgdXNlIHRoZSA2NCBiaXQgb2Zmc2V0LCB0aGVuIHRoZSAzMi1iaXQgdmVyc2lvbnMgb2YKKyAqIGxzZWVrL3RlbGxkaXIvc2Vla2RpciB3aWxsIGJsb3cgb3V0IHNwZWN0YWN1bGFybHksIGFuZCBmcm9tIHdpdGhpbgorICogdGhlIGV4dDIgbG93LWxldmVsIHJvdXRpbmUsIHdlIGRvbid0IGtub3cgaWYgd2UncmUgYmVpbmcgY2FsbGVkIGJ5CisgKiBhIDY0LWJpdCB2ZXJzaW9uIG9mIHRoZSBzeXN0ZW0gY2FsbCBvciB0aGUgMzItYml0IHZlcnNpb24gb2YgdGhlCisgKiBzeXN0ZW0gY2FsbC4gIFdvcnNlIHlldCwgTkZTdjIgb25seSBhbGxvd3MgZm9yIGEgMzItYml0IHJlYWRkaXIKKyAqIGNvb2tpZS4gIFNpZ2guCisgKi8KKyNkZWZpbmUgaGFzaDJwb3MobWFqb3IsIG1pbm9yKQkobWFqb3IgPj4gMSkKKyNkZWZpbmUgcG9zMm1hal9oYXNoKHBvcykJKChwb3MgPDwgMSkgJiAweGZmZmZmZmZmKQorI2RlZmluZSBwb3MybWluX2hhc2gocG9zKQkoMCkKKworLyoKKyAqIFRoaXMgc3RydWN0dXJlIGhvbGRzIHRoZSBub2RlcyBvZiB0aGUgcmVkLWJsYWNrIHRyZWUgdXNlZCB0byBzdG9yZQorICogdGhlIGRpcmVjdG9yeSBlbnRyeSBpbiBoYXNoIG9yZGVyLgorICovCitzdHJ1Y3QgZm5hbWUgeworCV9fdTMyCQloYXNoOworCV9fdTMyCQltaW5vcl9oYXNoOworCXN0cnVjdCByYl9ub2RlCXJiX2hhc2g7CisJc3RydWN0IGZuYW1lCSpuZXh0OworCV9fdTMyCQlpbm9kZTsKKwlfX3U4CQluYW1lX2xlbjsKKwlfX3U4CQlmaWxlX3R5cGU7CisJY2hhcgkJbmFtZVswXTsKK307CisKKy8qCisgKiBUaGlzIGZ1bmN0b2luIGltcGxlbWVudHMgYSBub24tcmVjdXJzaXZlIHdheSBvZiBmcmVlaW5nIGFsbCBvZiB0aGUKKyAqIG5vZGVzIGluIHRoZSByZWQtYmxhY2sgdHJlZS4KKyAqLworc3RhdGljIHZvaWQgZnJlZV9yYl90cmVlX2ZuYW1lKHN0cnVjdCByYl9yb290ICpyb290KQoreworCXN0cnVjdCByYl9ub2RlCSpuID0gcm9vdC0+cmJfbm9kZTsKKwlzdHJ1Y3QgcmJfbm9kZQkqcGFyZW50OworCXN0cnVjdCBmbmFtZQkqZm5hbWU7CisKKwl3aGlsZSAobikgeworCQkvKiBEbyB0aGUgbm9kZSdzIGNoaWxkcmVuIGZpcnN0ICovCisJCWlmICgobiktPnJiX2xlZnQpIHsKKwkJCW4gPSBuLT5yYl9sZWZ0OworCQkJY29udGludWU7CisJCX0KKwkJaWYgKG4tPnJiX3JpZ2h0KSB7CisJCQluID0gbi0+cmJfcmlnaHQ7CisJCQljb250aW51ZTsKKwkJfQorCQkvKgorCQkgKiBUaGUgbm9kZSBoYXMgbm8gY2hpbGRyZW47IGZyZWUgaXQsIGFuZCB0aGVuIHplcm8KKwkJICogb3V0IHBhcmVudCdzIGxpbmsgdG8gaXQuICBGaW5hbGx5IGdvIHRvIHRoZQorCQkgKiBiZWdpbm5pbmcgb2YgdGhlIGxvb3AgYW5kIHRyeSB0byBmcmVlIHRoZSBwYXJlbnQKKwkJICogbm9kZS4KKwkJICovCisJCXBhcmVudCA9IHJiX3BhcmVudChuKTsKKwkJZm5hbWUgPSByYl9lbnRyeShuLCBzdHJ1Y3QgZm5hbWUsIHJiX2hhc2gpOworCQl3aGlsZSAoZm5hbWUpIHsKKwkJCXN0cnVjdCBmbmFtZSAqIG9sZCA9IGZuYW1lOworCQkJZm5hbWUgPSBmbmFtZS0+bmV4dDsKKwkJCWtmcmVlIChvbGQpOworCQl9CisJCWlmICghcGFyZW50KQorCQkJcm9vdC0+cmJfbm9kZSA9IE5VTEw7CisJCWVsc2UgaWYgKHBhcmVudC0+cmJfbGVmdCA9PSBuKQorCQkJcGFyZW50LT5yYl9sZWZ0ID0gTlVMTDsKKwkJZWxzZSBpZiAocGFyZW50LT5yYl9yaWdodCA9PSBuKQorCQkJcGFyZW50LT5yYl9yaWdodCA9IE5VTEw7CisJCW4gPSBwYXJlbnQ7CisJfQorCXJvb3QtPnJiX25vZGUgPSBOVUxMOworfQorCisKK3N0YXRpYyBzdHJ1Y3QgZGlyX3ByaXZhdGVfaW5mbyAqY3JlYXRlX2Rpcl9pbmZvKGxvZmZfdCBwb3MpCit7CisJc3RydWN0IGRpcl9wcml2YXRlX2luZm8gKnA7CisKKwlwID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGRpcl9wcml2YXRlX2luZm8pLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXApCisJCXJldHVybiBOVUxMOworCXAtPnJvb3QucmJfbm9kZSA9IE5VTEw7CisJcC0+Y3Vycl9ub2RlID0gTlVMTDsKKwlwLT5leHRyYV9mbmFtZSA9IE5VTEw7CisJcC0+bGFzdF9wb3MgPSAwOworCXAtPmN1cnJfaGFzaCA9IHBvczJtYWpfaGFzaChwb3MpOworCXAtPmN1cnJfbWlub3JfaGFzaCA9IHBvczJtaW5faGFzaChwb3MpOworCXAtPm5leHRfaGFzaCA9IDA7CisJcmV0dXJuIHA7Cit9CisKK3ZvaWQgZXh0NF9odHJlZV9mcmVlX2Rpcl9pbmZvKHN0cnVjdCBkaXJfcHJpdmF0ZV9pbmZvICpwKQoreworCWZyZWVfcmJfdHJlZV9mbmFtZSgmcC0+cm9vdCk7CisJa2ZyZWUocCk7Cit9CisKKy8qCisgKiBHaXZlbiBhIGRpcmVjdG9yeSBlbnRyeSwgZW50ZXIgaXQgaW50byB0aGUgZm5hbWUgcmIgdHJlZS4KKyAqLworaW50IGV4dDRfaHRyZWVfc3RvcmVfZGlyZW50KHN0cnVjdCBmaWxlICpkaXJfZmlsZSwgX191MzIgaGFzaCwKKwkJCSAgICAgX191MzIgbWlub3JfaGFzaCwKKwkJCSAgICAgc3RydWN0IGV4dDRfZGlyX2VudHJ5XzIgKmRpcmVudCkKK3sKKwlzdHJ1Y3QgcmJfbm9kZSAqKnAsICpwYXJlbnQgPSBOVUxMOworCXN0cnVjdCBmbmFtZSAqIGZuYW1lLCAqbmV3X2ZuOworCXN0cnVjdCBkaXJfcHJpdmF0ZV9pbmZvICppbmZvOworCWludCBsZW47CisKKwlpbmZvID0gKHN0cnVjdCBkaXJfcHJpdmF0ZV9pbmZvICopIGRpcl9maWxlLT5wcml2YXRlX2RhdGE7CisJcCA9ICZpbmZvLT5yb290LnJiX25vZGU7CisKKwkvKiBDcmVhdGUgYW5kIGFsbG9jYXRlIHRoZSBmbmFtZSBzdHJ1Y3R1cmUgKi8KKwlsZW4gPSBzaXplb2Yoc3RydWN0IGZuYW1lKSArIGRpcmVudC0+bmFtZV9sZW4gKyAxOworCW5ld19mbiA9IGt6YWxsb2MobGVuLCBHRlBfS0VSTkVMKTsKKwlpZiAoIW5ld19mbikKKwkJcmV0dXJuIC1FTk9NRU07CisJbmV3X2ZuLT5oYXNoID0gaGFzaDsKKwluZXdfZm4tPm1pbm9yX2hhc2ggPSBtaW5vcl9oYXNoOworCW5ld19mbi0+aW5vZGUgPSBsZTMyX3RvX2NwdShkaXJlbnQtPmlub2RlKTsKKwluZXdfZm4tPm5hbWVfbGVuID0gZGlyZW50LT5uYW1lX2xlbjsKKwluZXdfZm4tPmZpbGVfdHlwZSA9IGRpcmVudC0+ZmlsZV90eXBlOworCW1lbWNweShuZXdfZm4tPm5hbWUsIGRpcmVudC0+bmFtZSwgZGlyZW50LT5uYW1lX2xlbik7CisJbmV3X2ZuLT5uYW1lW2RpcmVudC0+bmFtZV9sZW5dID0gMDsKKworCXdoaWxlICgqcCkgeworCQlwYXJlbnQgPSAqcDsKKwkJZm5hbWUgPSByYl9lbnRyeShwYXJlbnQsIHN0cnVjdCBmbmFtZSwgcmJfaGFzaCk7CisKKwkJLyoKKwkJICogSWYgdGhlIGhhc2ggYW5kIG1pbm9yIGhhc2ggbWF0Y2ggdXAsIHRoZW4gd2UgcHV0CisJCSAqIHRoZW0gb24gYSBsaW5rZWQgbGlzdC4gIFRoaXMgcmFyZWx5IGhhcHBlbnMuLi4KKwkJICovCisJCWlmICgobmV3X2ZuLT5oYXNoID09IGZuYW1lLT5oYXNoKSAmJgorCQkgICAgKG5ld19mbi0+bWlub3JfaGFzaCA9PSBmbmFtZS0+bWlub3JfaGFzaCkpIHsKKwkJCW5ld19mbi0+bmV4dCA9IGZuYW1lLT5uZXh0OworCQkJZm5hbWUtPm5leHQgPSBuZXdfZm47CisJCQlyZXR1cm4gMDsKKwkJfQorCisJCWlmIChuZXdfZm4tPmhhc2ggPCBmbmFtZS0+aGFzaCkKKwkJCXAgPSAmKCpwKS0+cmJfbGVmdDsKKwkJZWxzZSBpZiAobmV3X2ZuLT5oYXNoID4gZm5hbWUtPmhhc2gpCisJCQlwID0gJigqcCktPnJiX3JpZ2h0OworCQllbHNlIGlmIChuZXdfZm4tPm1pbm9yX2hhc2ggPCBmbmFtZS0+bWlub3JfaGFzaCkKKwkJCXAgPSAmKCpwKS0+cmJfbGVmdDsKKwkJZWxzZSAvKiBpZiAobmV3X2ZuLT5taW5vcl9oYXNoID4gZm5hbWUtPm1pbm9yX2hhc2gpICovCisJCQlwID0gJigqcCktPnJiX3JpZ2h0OworCX0KKworCXJiX2xpbmtfbm9kZSgmbmV3X2ZuLT5yYl9oYXNoLCBwYXJlbnQsIHApOworCXJiX2luc2VydF9jb2xvcigmbmV3X2ZuLT5yYl9oYXNoLCAmaW5mby0+cm9vdCk7CisJcmV0dXJuIDA7Cit9CisKKworCisvKgorICogVGhpcyBpcyBhIGhlbHBlciBmdW5jdGlvbiBmb3IgZXh0NF9keF9yZWFkZGlyLiAgSXQgY2FsbHMgZmlsbGRpcgorICogZm9yIGFsbCBlbnRyZXMgb24gdGhlIGZuYW1lIGxpbmtlZCBsaXN0LiAgKE5vcm1hbGx5IHRoZXJlIGlzIG9ubHkKKyAqIG9uZSBlbnRyeSBvbiB0aGUgbGlua2VkIGxpc3QsIHVubGVzcyB0aGVyZSBhcmUgNjIgYml0IGhhc2ggY29sbGlzaW9ucy4pCisgKi8KK3N0YXRpYyBpbnQgY2FsbF9maWxsZGlyKHN0cnVjdCBmaWxlICogZmlscCwgdm9pZCAqIGRpcmVudCwKKwkJCWZpbGxkaXJfdCBmaWxsZGlyLCBzdHJ1Y3QgZm5hbWUgKmZuYW1lKQoreworCXN0cnVjdCBkaXJfcHJpdmF0ZV9pbmZvICppbmZvID0gZmlscC0+cHJpdmF0ZV9kYXRhOworCWxvZmZfdAljdXJyX3BvczsKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZmlscC0+Zl9kZW50cnktPmRfaW5vZGU7CisJc3RydWN0IHN1cGVyX2Jsb2NrICogc2I7CisJaW50IGVycm9yOworCisJc2IgPSBpbm9kZS0+aV9zYjsKKworCWlmICghZm5hbWUpIHsKKwkJcHJpbnRrKCJjYWxsX2ZpbGxkaXI6IGNhbGxlZCB3aXRoIG51bGwgZm5hbWU/IT9cbiIpOworCQlyZXR1cm4gMDsKKwl9CisJY3Vycl9wb3MgPSBoYXNoMnBvcyhmbmFtZS0+aGFzaCwgZm5hbWUtPm1pbm9yX2hhc2gpOworCXdoaWxlIChmbmFtZSkgeworCQllcnJvciA9IGZpbGxkaXIoZGlyZW50LCBmbmFtZS0+bmFtZSwKKwkJCQlmbmFtZS0+bmFtZV9sZW4sIGN1cnJfcG9zLAorCQkJCWZuYW1lLT5pbm9kZSwKKwkJCQlnZXRfZHR5cGUoc2IsIGZuYW1lLT5maWxlX3R5cGUpKTsKKwkJaWYgKGVycm9yKSB7CisJCQlmaWxwLT5mX3BvcyA9IGN1cnJfcG9zOworCQkJaW5mby0+ZXh0cmFfZm5hbWUgPSBmbmFtZS0+bmV4dDsKKwkJCXJldHVybiBlcnJvcjsKKwkJfQorCQlmbmFtZSA9IGZuYW1lLT5uZXh0OworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBleHQ0X2R4X3JlYWRkaXIoc3RydWN0IGZpbGUgKiBmaWxwLAorCQkJIHZvaWQgKiBkaXJlbnQsIGZpbGxkaXJfdCBmaWxsZGlyKQoreworCXN0cnVjdCBkaXJfcHJpdmF0ZV9pbmZvICppbmZvID0gZmlscC0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBmaWxwLT5mX2RlbnRyeS0+ZF9pbm9kZTsKKwlzdHJ1Y3QgZm5hbWUgKmZuYW1lOworCWludAlyZXQ7CisKKwlpZiAoIWluZm8pIHsKKwkJaW5mbyA9IGNyZWF0ZV9kaXJfaW5mbyhmaWxwLT5mX3Bvcyk7CisJCWlmICghaW5mbykKKwkJCXJldHVybiAtRU5PTUVNOworCQlmaWxwLT5wcml2YXRlX2RhdGEgPSBpbmZvOworCX0KKworCWlmIChmaWxwLT5mX3BvcyA9PSBFWFQ0X0hUUkVFX0VPRikKKwkJcmV0dXJuIDA7CS8qIEVPRiAqLworCisJLyogU29tZSBvbmUgaGFzIG1lc3NlZCB3aXRoIGZfcG9zOyByZXNldCB0aGUgd29ybGQgKi8KKwlpZiAoaW5mby0+bGFzdF9wb3MgIT0gZmlscC0+Zl9wb3MpIHsKKwkJZnJlZV9yYl90cmVlX2ZuYW1lKCZpbmZvLT5yb290KTsKKwkJaW5mby0+Y3Vycl9ub2RlID0gTlVMTDsKKwkJaW5mby0+ZXh0cmFfZm5hbWUgPSBOVUxMOworCQlpbmZvLT5jdXJyX2hhc2ggPSBwb3MybWFqX2hhc2goZmlscC0+Zl9wb3MpOworCQlpbmZvLT5jdXJyX21pbm9yX2hhc2ggPSBwb3MybWluX2hhc2goZmlscC0+Zl9wb3MpOworCX0KKworCS8qCisJICogSWYgdGhlcmUgYXJlIGFueSBsZWZ0b3ZlciBuYW1lcyBvbiB0aGUgaGFzaCBjb2xsaXNpb24KKwkgKiBjaGFpbiwgcmV0dXJuIHRoZW0gZmlyc3QuCisJICovCisJaWYgKGluZm8tPmV4dHJhX2ZuYW1lICYmCisJICAgIGNhbGxfZmlsbGRpcihmaWxwLCBkaXJlbnQsIGZpbGxkaXIsIGluZm8tPmV4dHJhX2ZuYW1lKSkKKwkJZ290byBmaW5pc2hlZDsKKworCWlmICghaW5mby0+Y3Vycl9ub2RlKQorCQlpbmZvLT5jdXJyX25vZGUgPSByYl9maXJzdCgmaW5mby0+cm9vdCk7CisKKwl3aGlsZSAoMSkgeworCQkvKgorCQkgKiBGaWxsIHRoZSByYnRyZWUgaWYgd2UgaGF2ZSBubyBtb3JlIGVudHJpZXMsCisJCSAqIG9yIHRoZSBpbm9kZSBoYXMgY2hhbmdlZCBzaW5jZSB3ZSBsYXN0IHJlYWQgaW4gdGhlCisJCSAqIGNhY2hlZCBlbnRyaWVzLgorCQkgKi8KKwkJaWYgKCghaW5mby0+Y3Vycl9ub2RlKSB8fAorCQkgICAgKGZpbHAtPmZfdmVyc2lvbiAhPSBpbm9kZS0+aV92ZXJzaW9uKSkgeworCQkJaW5mby0+Y3Vycl9ub2RlID0gTlVMTDsKKwkJCWZyZWVfcmJfdHJlZV9mbmFtZSgmaW5mby0+cm9vdCk7CisJCQlmaWxwLT5mX3ZlcnNpb24gPSBpbm9kZS0+aV92ZXJzaW9uOworCQkJcmV0ID0gZXh0NF9odHJlZV9maWxsX3RyZWUoZmlscCwgaW5mby0+Y3Vycl9oYXNoLAorCQkJCQkJICAgaW5mby0+Y3Vycl9taW5vcl9oYXNoLAorCQkJCQkJICAgJmluZm8tPm5leHRfaGFzaCk7CisJCQlpZiAocmV0IDwgMCkKKwkJCQlyZXR1cm4gcmV0OworCQkJaWYgKHJldCA9PSAwKSB7CisJCQkJZmlscC0+Zl9wb3MgPSBFWFQ0X0hUUkVFX0VPRjsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWluZm8tPmN1cnJfbm9kZSA9IHJiX2ZpcnN0KCZpbmZvLT5yb290KTsKKwkJfQorCisJCWZuYW1lID0gcmJfZW50cnkoaW5mby0+Y3Vycl9ub2RlLCBzdHJ1Y3QgZm5hbWUsIHJiX2hhc2gpOworCQlpbmZvLT5jdXJyX2hhc2ggPSBmbmFtZS0+aGFzaDsKKwkJaW5mby0+Y3Vycl9taW5vcl9oYXNoID0gZm5hbWUtPm1pbm9yX2hhc2g7CisJCWlmIChjYWxsX2ZpbGxkaXIoZmlscCwgZGlyZW50LCBmaWxsZGlyLCBmbmFtZSkpCisJCQlicmVhazsKKworCQlpbmZvLT5jdXJyX25vZGUgPSByYl9uZXh0KGluZm8tPmN1cnJfbm9kZSk7CisJCWlmICghaW5mby0+Y3Vycl9ub2RlKSB7CisJCQlpZiAoaW5mby0+bmV4dF9oYXNoID09IH4wKSB7CisJCQkJZmlscC0+Zl9wb3MgPSBFWFQ0X0hUUkVFX0VPRjsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWluZm8tPmN1cnJfaGFzaCA9IGluZm8tPm5leHRfaGFzaDsKKwkJCWluZm8tPmN1cnJfbWlub3JfaGFzaCA9IDA7CisJCX0KKwl9CitmaW5pc2hlZDoKKwlpbmZvLT5sYXN0X3BvcyA9IGZpbHAtPmZfcG9zOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGV4dDRfcmVsZWFzZV9kaXIgKHN0cnVjdCBpbm9kZSAqIGlub2RlLCBzdHJ1Y3QgZmlsZSAqIGZpbHApCit7CisJaWYgKGZpbHAtPnByaXZhdGVfZGF0YSkKKwkJZXh0NF9odHJlZV9mcmVlX2Rpcl9pbmZvKGZpbHAtPnByaXZhdGVfZGF0YSk7CisKKwlyZXR1cm4gMDsKK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9mcy9leHQ0L2V4dGVudHMuYyBiL2ZzL2V4dDQvZXh0ZW50cy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI2MDhkY2UKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9leHQ0L2V4dGVudHMuYwpAQCAtMCwwICsxLDIxNTIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMtMjAwNiwgQ2x1c3RlciBGaWxlIFN5c3RlbXMsIEluYywgaW5mb0BjbHVzdGVyZnMuY29tCisgKiBXcml0dGVuIGJ5IEFsZXggVG9tYXMgPGFsZXhAY2x1c3RlcmZzLmNvbT4KKyAqCisgKiBBcmNoaXRlY3R1cmUgaW5kZXBlbmRlbmNlOgorICogICBDb3B5cmlnaHQgKGMpIDIwMDUsIEJ1bGwgUy5BLgorICogICBXcml0dGVuIGJ5IFBpZXJyZSBQZWlmZmVyIDxwaWVycmUucGVpZmZlckBidWxsLm5ldD4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2VucworICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0KKyAqLworCisvKgorICogRXh0ZW50cyBzdXBwb3J0IGZvciBFWFQ0CisgKgorICogVE9ETzoKKyAqICAgLSBleHQ0Kl9lcnJvcigpIHNob3VsZCBiZSB1c2VkIGluIHNvbWUgc2l0dWF0aW9ucworICogICAtIGFuYWx5emUgYWxsIEJVRygpL0JVR19PTigpLCB1c2UgLUVJTyB3aGVyZSBhcHByb3ByaWF0ZQorICogICAtIHNtYXJ0IHRyZWUgcmVkdWN0aW9uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvdGltZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V4dDRfamJkMi5oPgorI2luY2x1ZGUgPGxpbnV4L2piZC5oPgorI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvaGlnaHVpZC5oPgorI2luY2x1ZGUgPGxpbnV4L3BhZ2VtYXAuaD4KKyNpbmNsdWRlIDxsaW51eC9xdW90YW9wcy5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9leHQ0X2ZzX2V4dGVudHMuaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorCisKKy8qCisgKiBleHRfcGJsb2NrOgorICogY29tYmluZSBsb3cgYW5kIGhpZ2ggcGFydHMgb2YgcGh5c2ljYWwgYmxvY2sgbnVtYmVyIGludG8gZXh0NF9mc2Jsa190CisgKi8KK3N0YXRpYyBpbmxpbmUgZXh0NF9mc2Jsa190IGV4dF9wYmxvY2soc3RydWN0IGV4dDRfZXh0ZW50ICpleCkKK3sKKwlleHQ0X2ZzYmxrX3QgYmxvY2s7CisKKwlibG9jayA9IGxlMzJfdG9fY3B1KGV4LT5lZV9zdGFydCk7CisJYmxvY2sgfD0gKChleHQ0X2ZzYmxrX3QpIGxlMTZfdG9fY3B1KGV4LT5lZV9zdGFydF9oaSkgPDwgMzEpIDw8IDE7CisJcmV0dXJuIGJsb2NrOworfQorCisvKgorICogaWR4X3BibG9jazoKKyAqIGNvbWJpbmUgbG93IGFuZCBoaWdoIHBhcnRzIG9mIGEgbGVhZiBwaHlzaWNhbCBibG9jayBudW1iZXIgaW50byBleHQ0X2ZzYmxrX3QKKyAqLworc3RhdGljIGlubGluZSBleHQ0X2ZzYmxrX3QgaWR4X3BibG9jayhzdHJ1Y3QgZXh0NF9leHRlbnRfaWR4ICppeCkKK3sKKwlleHQ0X2ZzYmxrX3QgYmxvY2s7CisKKwlibG9jayA9IGxlMzJfdG9fY3B1KGl4LT5laV9sZWFmKTsKKwlibG9jayB8PSAoKGV4dDRfZnNibGtfdCkgbGUxNl90b19jcHUoaXgtPmVpX2xlYWZfaGkpIDw8IDMxKSA8PCAxOworCXJldHVybiBibG9jazsKK30KKworLyoKKyAqIGV4dDRfZXh0X3N0b3JlX3BibG9jazoKKyAqIHN0b3JlcyBhIGxhcmdlIHBoeXNpY2FsIGJsb2NrIG51bWJlciBpbnRvIGFuIGV4dGVudCBzdHJ1Y3QsCisgKiBicmVha2luZyBpdCBpbnRvIHBhcnRzCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBleHQ0X2V4dF9zdG9yZV9wYmxvY2soc3RydWN0IGV4dDRfZXh0ZW50ICpleCwgZXh0NF9mc2Jsa190IHBiKQoreworCWV4LT5lZV9zdGFydCA9IGNwdV90b19sZTMyKCh1bnNpZ25lZCBsb25nKSAocGIgJiAweGZmZmZmZmZmKSk7CisJZXgtPmVlX3N0YXJ0X2hpID0gY3B1X3RvX2xlMTYoKHVuc2lnbmVkIGxvbmcpICgocGIgPj4gMzEpID4+IDEpICYgMHhmZmZmKTsKK30KKworLyoKKyAqIGV4dDRfaWR4X3N0b3JlX3BibG9jazoKKyAqIHN0b3JlcyBhIGxhcmdlIHBoeXNpY2FsIGJsb2NrIG51bWJlciBpbnRvIGFuIGluZGV4IHN0cnVjdCwKKyAqIGJyZWFraW5nIGl0IGludG8gcGFydHMKKyAqLworc3RhdGljIGlubGluZSB2b2lkIGV4dDRfaWR4X3N0b3JlX3BibG9jayhzdHJ1Y3QgZXh0NF9leHRlbnRfaWR4ICppeCwgZXh0NF9mc2Jsa190IHBiKQoreworCWl4LT5laV9sZWFmID0gY3B1X3RvX2xlMzIoKHVuc2lnbmVkIGxvbmcpIChwYiAmIDB4ZmZmZmZmZmYpKTsKKwlpeC0+ZWlfbGVhZl9oaSA9IGNwdV90b19sZTE2KCh1bnNpZ25lZCBsb25nKSAoKHBiID4+IDMxKSA+PiAxKSAmIDB4ZmZmZik7Cit9CisKK3N0YXRpYyBpbnQgZXh0NF9leHRfY2hlY2tfaGVhZGVyKGNvbnN0IGNoYXIgKmZ1bmN0aW9uLCBzdHJ1Y3QgaW5vZGUgKmlub2RlLAorCQkJCXN0cnVjdCBleHQ0X2V4dGVudF9oZWFkZXIgKmVoKQoreworCWNvbnN0IGNoYXIgKmVycm9yX21zZyA9IE5VTEw7CisKKwlpZiAodW5saWtlbHkoZWgtPmVoX21hZ2ljICE9IEVYVDRfRVhUX01BR0lDKSkgeworCQllcnJvcl9tc2cgPSAiaW52YWxpZCBtYWdpYyI7CisJCWdvdG8gY29ycnVwdGVkOworCX0KKwlpZiAodW5saWtlbHkoZWgtPmVoX21heCA9PSAwKSkgeworCQllcnJvcl9tc2cgPSAiaW52YWxpZCBlaF9tYXgiOworCQlnb3RvIGNvcnJ1cHRlZDsKKwl9CisJaWYgKHVubGlrZWx5KGxlMTZfdG9fY3B1KGVoLT5laF9lbnRyaWVzKSA+IGxlMTZfdG9fY3B1KGVoLT5laF9tYXgpKSkgeworCQllcnJvcl9tc2cgPSAiaW52YWxpZCBlaF9lbnRyaWVzIjsKKwkJZ290byBjb3JydXB0ZWQ7CisJfQorCXJldHVybiAwOworCitjb3JydXB0ZWQ6CisJZXh0NF9lcnJvcihpbm9kZS0+aV9zYiwgZnVuY3Rpb24sCisJCQkiYmFkIGhlYWRlciBpbiBpbm9kZSAjJWx1OiAlcyAtIG1hZ2ljICV4LCAiCisJCQkiZW50cmllcyAldSwgbWF4ICV1LCBkZXB0aCAldSIsCisJCQlpbm9kZS0+aV9pbm8sIGVycm9yX21zZywgbGUxNl90b19jcHUoZWgtPmVoX21hZ2ljKSwKKwkJCWxlMTZfdG9fY3B1KGVoLT5laF9lbnRyaWVzKSwgbGUxNl90b19jcHUoZWgtPmVoX21heCksCisJCQlsZTE2X3RvX2NwdShlaC0+ZWhfZGVwdGgpKTsKKworCXJldHVybiAtRUlPOworfQorCitzdGF0aWMgaGFuZGxlX3QgKmV4dDRfZXh0X2pvdXJuYWxfcmVzdGFydChoYW5kbGVfdCAqaGFuZGxlLCBpbnQgbmVlZGVkKQoreworCWludCBlcnI7CisKKwlpZiAoaGFuZGxlLT5oX2J1ZmZlcl9jcmVkaXRzID4gbmVlZGVkKQorCQlyZXR1cm4gaGFuZGxlOworCWlmICghZXh0NF9qb3VybmFsX2V4dGVuZChoYW5kbGUsIG5lZWRlZCkpCisJCXJldHVybiBoYW5kbGU7CisJZXJyID0gZXh0NF9qb3VybmFsX3Jlc3RhcnQoaGFuZGxlLCBuZWVkZWQpOworCisJcmV0dXJuIGhhbmRsZTsKK30KKworLyoKKyAqIGNvdWxkIHJldHVybjoKKyAqICAtIEVST0ZTCisgKiAgLSBFTk9NRU0KKyAqLworc3RhdGljIGludCBleHQ0X2V4dF9nZXRfYWNjZXNzKGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBpbm9kZSAqaW5vZGUsCisJCQkJc3RydWN0IGV4dDRfZXh0X3BhdGggKnBhdGgpCit7CisJaWYgKHBhdGgtPnBfYmgpIHsKKwkJLyogcGF0aCBwb2ludHMgdG8gYmxvY2sgKi8KKwkJcmV0dXJuIGV4dDRfam91cm5hbF9nZXRfd3JpdGVfYWNjZXNzKGhhbmRsZSwgcGF0aC0+cF9iaCk7CisJfQorCS8qIHBhdGggcG9pbnRzIHRvIGxlYWYvaW5kZXggaW4gaW5vZGUgYm9keSAqLworCS8qIHdlIHVzZSBpbi1jb3JlIGRhdGEsIG5vIG5lZWQgdG8gcHJvdGVjdCB0aGVtICovCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBjb3VsZCByZXR1cm46CisgKiAgLSBFUk9GUworICogIC0gRU5PTUVNCisgKiAgLSBFSU8KKyAqLworc3RhdGljIGludCBleHQ0X2V4dF9kaXJ0eShoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3QgaW5vZGUgKmlub2RlLAorCQkJCXN0cnVjdCBleHQ0X2V4dF9wYXRoICpwYXRoKQoreworCWludCBlcnI7CisJaWYgKHBhdGgtPnBfYmgpIHsKKwkJLyogcGF0aCBwb2ludHMgdG8gYmxvY2sgKi8KKwkJZXJyID0gZXh0NF9qb3VybmFsX2RpcnR5X21ldGFkYXRhKGhhbmRsZSwgcGF0aC0+cF9iaCk7CisJfSBlbHNlIHsKKwkJLyogcGF0aCBwb2ludHMgdG8gbGVhZi9pbmRleCBpbiBpbm9kZSBib2R5ICovCisJCWVyciA9IGV4dDRfbWFya19pbm9kZV9kaXJ0eShoYW5kbGUsIGlub2RlKTsKKwl9CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGV4dDRfZnNibGtfdCBleHQ0X2V4dF9maW5kX2dvYWwoc3RydWN0IGlub2RlICppbm9kZSwKKwkJCSAgICAgIHN0cnVjdCBleHQ0X2V4dF9wYXRoICpwYXRoLAorCQkJICAgICAgZXh0NF9mc2Jsa190IGJsb2NrKQoreworCXN0cnVjdCBleHQ0X2lub2RlX2luZm8gKmVpID0gRVhUNF9JKGlub2RlKTsKKwlleHQ0X2ZzYmxrX3QgYmdfc3RhcnQ7CisJZXh0NF9ncnBibGtfdCBjb2xvdXI7CisJaW50IGRlcHRoOworCisJaWYgKHBhdGgpIHsKKwkJc3RydWN0IGV4dDRfZXh0ZW50ICpleDsKKwkJZGVwdGggPSBwYXRoLT5wX2RlcHRoOworCisJCS8qIHRyeSB0byBwcmVkaWN0IGJsb2NrIHBsYWNlbWVudCAqLworCQlpZiAoKGV4ID0gcGF0aFtkZXB0aF0ucF9leHQpKQorCQkJcmV0dXJuIGV4dF9wYmxvY2soZXgpKyhibG9jay1sZTMyX3RvX2NwdShleC0+ZWVfYmxvY2spKTsKKworCQkvKiBpdCBsb29rcyBsaWtlIGluZGV4IGlzIGVtcHR5OworCQkgKiB0cnkgdG8gZmluZCBzdGFydGluZyBibG9jayBmcm9tIGluZGV4IGl0c2VsZiAqLworCQlpZiAocGF0aFtkZXB0aF0ucF9iaCkKKwkJCXJldHVybiBwYXRoW2RlcHRoXS5wX2JoLT5iX2Jsb2NrbnI7CisJfQorCisJLyogT0suIHVzZSBpbm9kZSdzIGdyb3VwICovCisJYmdfc3RhcnQgPSAoZWktPmlfYmxvY2tfZ3JvdXAgKiBFWFQ0X0JMT0NLU19QRVJfR1JPVVAoaW5vZGUtPmlfc2IpKSArCisJCWxlMzJfdG9fY3B1KEVYVDRfU0IoaW5vZGUtPmlfc2IpLT5zX2VzLT5zX2ZpcnN0X2RhdGFfYmxvY2spOworCWNvbG91ciA9IChjdXJyZW50LT5waWQgJSAxNikgKgorCQkJKEVYVDRfQkxPQ0tTX1BFUl9HUk9VUChpbm9kZS0+aV9zYikgLyAxNik7CisJcmV0dXJuIGJnX3N0YXJ0ICsgY29sb3VyICsgYmxvY2s7Cit9CisKK3N0YXRpYyBleHQ0X2ZzYmxrX3QKK2V4dDRfZXh0X25ld19ibG9jayhoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3QgaW5vZGUgKmlub2RlLAorCQkJc3RydWN0IGV4dDRfZXh0X3BhdGggKnBhdGgsCisJCQlzdHJ1Y3QgZXh0NF9leHRlbnQgKmV4LCBpbnQgKmVycikKK3sKKwlleHQ0X2ZzYmxrX3QgZ29hbCwgbmV3YmxvY2s7CisKKwlnb2FsID0gZXh0NF9leHRfZmluZF9nb2FsKGlub2RlLCBwYXRoLCBsZTMyX3RvX2NwdShleC0+ZWVfYmxvY2spKTsKKwluZXdibG9jayA9IGV4dDRfbmV3X2Jsb2NrKGhhbmRsZSwgaW5vZGUsIGdvYWwsIGVycik7CisJcmV0dXJuIG5ld2Jsb2NrOworfQorCitzdGF0aWMgaW5saW5lIGludCBleHQ0X2V4dF9zcGFjZV9ibG9jayhzdHJ1Y3QgaW5vZGUgKmlub2RlKQoreworCWludCBzaXplOworCisJc2l6ZSA9IChpbm9kZS0+aV9zYi0+c19ibG9ja3NpemUgLSBzaXplb2Yoc3RydWN0IGV4dDRfZXh0ZW50X2hlYWRlcikpCisJCQkvIHNpemVvZihzdHJ1Y3QgZXh0NF9leHRlbnQpOworI2lmZGVmIEFHUkVTU0lWRV9URVNUCisJaWYgKHNpemUgPiA2KQorCQlzaXplID0gNjsKKyNlbmRpZgorCXJldHVybiBzaXplOworfQorCitzdGF0aWMgaW5saW5lIGludCBleHQ0X2V4dF9zcGFjZV9ibG9ja19pZHgoc3RydWN0IGlub2RlICppbm9kZSkKK3sKKwlpbnQgc2l6ZTsKKworCXNpemUgPSAoaW5vZGUtPmlfc2ItPnNfYmxvY2tzaXplIC0gc2l6ZW9mKHN0cnVjdCBleHQ0X2V4dGVudF9oZWFkZXIpKQorCQkJLyBzaXplb2Yoc3RydWN0IGV4dDRfZXh0ZW50X2lkeCk7CisjaWZkZWYgQUdSRVNTSVZFX1RFU1QKKwlpZiAoc2l6ZSA+IDUpCisJCXNpemUgPSA1OworI2VuZGlmCisJcmV0dXJuIHNpemU7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGV4dDRfZXh0X3NwYWNlX3Jvb3Qoc3RydWN0IGlub2RlICppbm9kZSkKK3sKKwlpbnQgc2l6ZTsKKworCXNpemUgPSBzaXplb2YoRVhUNF9JKGlub2RlKS0+aV9kYXRhKTsKKwlzaXplIC09IHNpemVvZihzdHJ1Y3QgZXh0NF9leHRlbnRfaGVhZGVyKTsKKwlzaXplIC89IHNpemVvZihzdHJ1Y3QgZXh0NF9leHRlbnQpOworI2lmZGVmIEFHUkVTU0lWRV9URVNUCisJaWYgKHNpemUgPiAzKQorCQlzaXplID0gMzsKKyNlbmRpZgorCXJldHVybiBzaXplOworfQorCitzdGF0aWMgaW5saW5lIGludCBleHQ0X2V4dF9zcGFjZV9yb290X2lkeChzdHJ1Y3QgaW5vZGUgKmlub2RlKQoreworCWludCBzaXplOworCisJc2l6ZSA9IHNpemVvZihFWFQ0X0koaW5vZGUpLT5pX2RhdGEpOworCXNpemUgLT0gc2l6ZW9mKHN0cnVjdCBleHQ0X2V4dGVudF9oZWFkZXIpOworCXNpemUgLz0gc2l6ZW9mKHN0cnVjdCBleHQ0X2V4dGVudF9pZHgpOworI2lmZGVmIEFHUkVTU0lWRV9URVNUCisJaWYgKHNpemUgPiA0KQorCQlzaXplID0gNDsKKyNlbmRpZgorCXJldHVybiBzaXplOworfQorCisjaWZkZWYgRVhUX0RFQlVHCitzdGF0aWMgdm9pZCBleHQ0X2V4dF9zaG93X3BhdGgoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGV4dDRfZXh0X3BhdGggKnBhdGgpCit7CisJaW50IGssIGwgPSBwYXRoLT5wX2RlcHRoOworCisJZXh0X2RlYnVnKCJwYXRoOiIpOworCWZvciAoayA9IDA7IGsgPD0gbDsgaysrLCBwYXRoKyspIHsKKwkJaWYgKHBhdGgtPnBfaWR4KSB7CisJCSAgZXh0X2RlYnVnKCIgICVkLT4lbGx1IiwgbGUzMl90b19jcHUocGF0aC0+cF9pZHgtPmVpX2Jsb2NrKSwKKwkJCSAgICBpZHhfcGJsb2NrKHBhdGgtPnBfaWR4KSk7CisJCX0gZWxzZSBpZiAocGF0aC0+cF9leHQpIHsKKwkJCWV4dF9kZWJ1ZygiICAlZDolZDolbGx1ICIsCisJCQkJICBsZTMyX3RvX2NwdShwYXRoLT5wX2V4dC0+ZWVfYmxvY2spLAorCQkJCSAgbGUxNl90b19jcHUocGF0aC0+cF9leHQtPmVlX2xlbiksCisJCQkJICBleHRfcGJsb2NrKHBhdGgtPnBfZXh0KSk7CisJCX0gZWxzZQorCQkJZXh0X2RlYnVnKCIgIFtdIik7CisJfQorCWV4dF9kZWJ1ZygiXG4iKTsKK30KKworc3RhdGljIHZvaWQgZXh0NF9leHRfc2hvd19sZWFmKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBleHQ0X2V4dF9wYXRoICpwYXRoKQoreworCWludCBkZXB0aCA9IGV4dF9kZXB0aChpbm9kZSk7CisJc3RydWN0IGV4dDRfZXh0ZW50X2hlYWRlciAqZWg7CisJc3RydWN0IGV4dDRfZXh0ZW50ICpleDsKKwlpbnQgaTsKKworCWlmICghcGF0aCkKKwkJcmV0dXJuOworCisJZWggPSBwYXRoW2RlcHRoXS5wX2hkcjsKKwlleCA9IEVYVF9GSVJTVF9FWFRFTlQoZWgpOworCisJZm9yIChpID0gMDsgaSA8IGxlMTZfdG9fY3B1KGVoLT5laF9lbnRyaWVzKTsgaSsrLCBleCsrKSB7CisJCWV4dF9kZWJ1ZygiJWQ6JWQ6JWxsdSAiLCBsZTMyX3RvX2NwdShleC0+ZWVfYmxvY2spLAorCQkJICBsZTE2X3RvX2NwdShleC0+ZWVfbGVuKSwgZXh0X3BibG9jayhleCkpOworCX0KKwlleHRfZGVidWcoIlxuIik7Cit9CisjZWxzZQorI2RlZmluZSBleHQ0X2V4dF9zaG93X3BhdGgoaW5vZGUscGF0aCkKKyNkZWZpbmUgZXh0NF9leHRfc2hvd19sZWFmKGlub2RlLHBhdGgpCisjZW5kaWYKKworc3RhdGljIHZvaWQgZXh0NF9leHRfZHJvcF9yZWZzKHN0cnVjdCBleHQ0X2V4dF9wYXRoICpwYXRoKQoreworCWludCBkZXB0aCA9IHBhdGgtPnBfZGVwdGg7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDw9IGRlcHRoOyBpKyssIHBhdGgrKykKKwkJaWYgKHBhdGgtPnBfYmgpIHsKKwkJCWJyZWxzZShwYXRoLT5wX2JoKTsKKwkJCXBhdGgtPnBfYmggPSBOVUxMOworCQl9Cit9CisKKy8qCisgKiBleHQ0X2V4dF9iaW5zZWFyY2hfaWR4OgorICogYmluYXJ5IHNlYXJjaCBmb3IgdGhlIGNsb3Nlc3QgaW5kZXggb2YgdGhlIGdpdmVuIGJsb2NrCisgKi8KK3N0YXRpYyB2b2lkCitleHQ0X2V4dF9iaW5zZWFyY2hfaWR4KHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBleHQ0X2V4dF9wYXRoICpwYXRoLCBpbnQgYmxvY2spCit7CisJc3RydWN0IGV4dDRfZXh0ZW50X2hlYWRlciAqZWggPSBwYXRoLT5wX2hkcjsKKwlzdHJ1Y3QgZXh0NF9leHRlbnRfaWR4ICpyLCAqbCwgKm07CisKKwlCVUdfT04oZWgtPmVoX21hZ2ljICE9IEVYVDRfRVhUX01BR0lDKTsKKwlCVUdfT04obGUxNl90b19jcHUoZWgtPmVoX2VudHJpZXMpID4gbGUxNl90b19jcHUoZWgtPmVoX21heCkpOworCUJVR19PTihsZTE2X3RvX2NwdShlaC0+ZWhfZW50cmllcykgPD0gMCk7CisKKwlleHRfZGVidWcoImJpbnNlYXJjaCBmb3IgJWQoaWR4KTogICIsIGJsb2NrKTsKKworCWwgPSBFWFRfRklSU1RfSU5ERVgoZWgpICsgMTsKKwlyID0gRVhUX0ZJUlNUX0lOREVYKGVoKSArIGxlMTZfdG9fY3B1KGVoLT5laF9lbnRyaWVzKSAtIDE7CisJd2hpbGUgKGwgPD0gcikgeworCQltID0gbCArIChyIC0gbCkgLyAyOworCQlpZiAoYmxvY2sgPCBsZTMyX3RvX2NwdShtLT5laV9ibG9jaykpCisJCQlyID0gbSAtIDE7CisJCWVsc2UKKwkJCWwgPSBtICsgMTsKKwkJZXh0X2RlYnVnKCIlcCgldSk6JXAoJXUpOiVwKCV1KSAiLCBsLCBsLT5laV9ibG9jaywKKwkJCQltLCBtLT5laV9ibG9jaywgciwgci0+ZWlfYmxvY2spOworCX0KKworCXBhdGgtPnBfaWR4ID0gbCAtIDE7CisJZXh0X2RlYnVnKCIgIC0+ICVkLT4lbGxkICIsIGxlMzJfdG9fY3B1KHBhdGgtPnBfaWR4LT5laV9ibG9jayksCisJCSAgaWR4X2Jsb2NrKHBhdGgtPnBfaWR4KSk7CisKKyNpZmRlZiBDSEVDS19CSU5TRUFSQ0gKKwl7CisJCXN0cnVjdCBleHQ0X2V4dGVudF9pZHggKmNoaXgsICppeDsKKwkJaW50IGs7CisKKwkJY2hpeCA9IGl4ID0gRVhUX0ZJUlNUX0lOREVYKGVoKTsKKwkJZm9yIChrID0gMDsgayA8IGxlMTZfdG9fY3B1KGVoLT5laF9lbnRyaWVzKTsgaysrLCBpeCsrKSB7CisJCSAgaWYgKGsgIT0gMCAmJgorCQkgICAgICBsZTMyX3RvX2NwdShpeC0+ZWlfYmxvY2spIDw9IGxlMzJfdG9fY3B1KGl4Wy0xXS5laV9ibG9jaykpIHsKKwkJCQlwcmludGsoIms9JWQsIGl4PTB4JXAsIGZpcnN0PTB4JXBcbiIsIGssCisJCQkJCWl4LCBFWFRfRklSU1RfSU5ERVgoZWgpKTsKKwkJCQlwcmludGsoIiV1IDw9ICV1XG4iLAorCQkJCSAgICAgICBsZTMyX3RvX2NwdShpeC0+ZWlfYmxvY2spLAorCQkJCSAgICAgICBsZTMyX3RvX2NwdShpeFstMV0uZWlfYmxvY2spKTsKKwkJCX0KKwkJCUJVR19PTihrICYmIGxlMzJfdG9fY3B1KGl4LT5laV9ibG9jaykKKwkJCQkgICAgICAgICAgIDw9IGxlMzJfdG9fY3B1KGl4Wy0xXS5laV9ibG9jaykpOworCQkJaWYgKGJsb2NrIDwgbGUzMl90b19jcHUoaXgtPmVpX2Jsb2NrKSkKKwkJCQlicmVhazsKKwkJCWNoaXggPSBpeDsKKwkJfQorCQlCVUdfT04oY2hpeCAhPSBwYXRoLT5wX2lkeCk7CisJfQorI2VuZGlmCisKK30KKworLyoKKyAqIGV4dDRfZXh0X2JpbnNlYXJjaDoKKyAqIGJpbmFyeSBzZWFyY2ggZm9yIGNsb3Nlc3QgZXh0ZW50IG9mIHRoZSBnaXZlbiBibG9jaworICovCitzdGF0aWMgdm9pZAorZXh0NF9leHRfYmluc2VhcmNoKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBleHQ0X2V4dF9wYXRoICpwYXRoLCBpbnQgYmxvY2spCit7CisJc3RydWN0IGV4dDRfZXh0ZW50X2hlYWRlciAqZWggPSBwYXRoLT5wX2hkcjsKKwlzdHJ1Y3QgZXh0NF9leHRlbnQgKnIsICpsLCAqbTsKKworCUJVR19PTihlaC0+ZWhfbWFnaWMgIT0gRVhUNF9FWFRfTUFHSUMpOworCUJVR19PTihsZTE2X3RvX2NwdShlaC0+ZWhfZW50cmllcykgPiBsZTE2X3RvX2NwdShlaC0+ZWhfbWF4KSk7CisKKwlpZiAoZWgtPmVoX2VudHJpZXMgPT0gMCkgeworCQkvKgorCQkgKiB0aGlzIGxlYWYgaXMgZW1wdHk6CisJCSAqIHdlIGdldCBzdWNoIGEgbGVhZiBpbiBzcGxpdC9hZGQgY2FzZQorCQkgKi8KKwkJcmV0dXJuOworCX0KKworCWV4dF9kZWJ1ZygiYmluc2VhcmNoIGZvciAlZDogICIsIGJsb2NrKTsKKworCWwgPSBFWFRfRklSU1RfRVhURU5UKGVoKSArIDE7CisJciA9IEVYVF9GSVJTVF9FWFRFTlQoZWgpICsgbGUxNl90b19jcHUoZWgtPmVoX2VudHJpZXMpIC0gMTsKKworCXdoaWxlIChsIDw9IHIpIHsKKwkJbSA9IGwgKyAociAtIGwpIC8gMjsKKwkJaWYgKGJsb2NrIDwgbGUzMl90b19jcHUobS0+ZWVfYmxvY2spKQorCQkJciA9IG0gLSAxOworCQllbHNlCisJCQlsID0gbSArIDE7CisJCWV4dF9kZWJ1ZygiJXAoJXUpOiVwKCV1KTolcCgldSkgIiwgbCwgbC0+ZWVfYmxvY2ssCisJCQkJbSwgbS0+ZWVfYmxvY2ssIHIsIHItPmVlX2Jsb2NrKTsKKwl9CisKKwlwYXRoLT5wX2V4dCA9IGwgLSAxOworCWV4dF9kZWJ1ZygiICAtPiAlZDolbGx1OiVkICIsCisJCSAgICAgICAgbGUzMl90b19jcHUocGF0aC0+cF9leHQtPmVlX2Jsb2NrKSwKKwkJICAgICAgICBleHRfcGJsb2NrKHBhdGgtPnBfZXh0KSwKKwkJCWxlMTZfdG9fY3B1KHBhdGgtPnBfZXh0LT5lZV9sZW4pKTsKKworI2lmZGVmIENIRUNLX0JJTlNFQVJDSAorCXsKKwkJc3RydWN0IGV4dDRfZXh0ZW50ICpjaGV4LCAqZXg7CisJCWludCBrOworCisJCWNoZXggPSBleCA9IEVYVF9GSVJTVF9FWFRFTlQoZWgpOworCQlmb3IgKGsgPSAwOyBrIDwgbGUxNl90b19jcHUoZWgtPmVoX2VudHJpZXMpOyBrKyssIGV4KyspIHsKKwkJCUJVR19PTihrICYmIGxlMzJfdG9fY3B1KGV4LT5lZV9ibG9jaykKKwkJCQkgICAgICAgICAgPD0gbGUzMl90b19jcHUoZXhbLTFdLmVlX2Jsb2NrKSk7CisJCQlpZiAoYmxvY2sgPCBsZTMyX3RvX2NwdShleC0+ZWVfYmxvY2spKQorCQkJCWJyZWFrOworCQkJY2hleCA9IGV4OworCQl9CisJCUJVR19PTihjaGV4ICE9IHBhdGgtPnBfZXh0KTsKKwl9CisjZW5kaWYKKworfQorCitpbnQgZXh0NF9leHRfdHJlZV9pbml0KGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBpbm9kZSAqaW5vZGUpCit7CisJc3RydWN0IGV4dDRfZXh0ZW50X2hlYWRlciAqZWg7CisKKwllaCA9IGV4dF9pbm9kZV9oZHIoaW5vZGUpOworCWVoLT5laF9kZXB0aCA9IDA7CisJZWgtPmVoX2VudHJpZXMgPSAwOworCWVoLT5laF9tYWdpYyA9IEVYVDRfRVhUX01BR0lDOworCWVoLT5laF9tYXggPSBjcHVfdG9fbGUxNihleHQ0X2V4dF9zcGFjZV9yb290KGlub2RlKSk7CisJZXh0NF9tYXJrX2lub2RlX2RpcnR5KGhhbmRsZSwgaW5vZGUpOworCWV4dDRfZXh0X2ludmFsaWRhdGVfY2FjaGUoaW5vZGUpOworCXJldHVybiAwOworfQorCitzdHJ1Y3QgZXh0NF9leHRfcGF0aCAqCitleHQ0X2V4dF9maW5kX2V4dGVudChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBpbnQgYmxvY2ssIHN0cnVjdCBleHQ0X2V4dF9wYXRoICpwYXRoKQoreworCXN0cnVjdCBleHQ0X2V4dGVudF9oZWFkZXIgKmVoOworCXN0cnVjdCBidWZmZXJfaGVhZCAqYmg7CisJc2hvcnQgaW50IGRlcHRoLCBpLCBwcG9zID0gMCwgYWxsb2MgPSAwOworCisJZWggPSBleHRfaW5vZGVfaGRyKGlub2RlKTsKKwlCVUdfT04oZWggPT0gTlVMTCk7CisJaWYgKGV4dDRfZXh0X2NoZWNrX2hlYWRlcihfX0ZVTkNUSU9OX18sIGlub2RlLCBlaCkpCisJCXJldHVybiBFUlJfUFRSKC1FSU8pOworCisJaSA9IGRlcHRoID0gZXh0X2RlcHRoKGlub2RlKTsKKworCS8qIGFjY291bnQgcG9zc2libGUgZGVwdGggaW5jcmVhc2UgKi8KKwlpZiAoIXBhdGgpIHsKKwkJcGF0aCA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBleHQ0X2V4dF9wYXRoKSAqIChkZXB0aCArIDIpLAorCQkJCUdGUF9OT0ZTKTsKKwkJaWYgKCFwYXRoKQorCQkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CisJCWFsbG9jID0gMTsKKwl9CisJbWVtc2V0KHBhdGgsIDAsIHNpemVvZihzdHJ1Y3QgZXh0NF9leHRfcGF0aCkgKiAoZGVwdGggKyAxKSk7CisJcGF0aFswXS5wX2hkciA9IGVoOworCisJLyogd2FsayB0aHJvdWdoIHRoZSB0cmVlICovCisJd2hpbGUgKGkpIHsKKwkJZXh0X2RlYnVnKCJkZXB0aCAlZDogbnVtICVkLCBtYXggJWRcbiIsCisJCQkgIHBwb3MsIGxlMTZfdG9fY3B1KGVoLT5laF9lbnRyaWVzKSwgbGUxNl90b19jcHUoZWgtPmVoX21heCkpOworCQlleHQ0X2V4dF9iaW5zZWFyY2hfaWR4KGlub2RlLCBwYXRoICsgcHBvcywgYmxvY2spOworCQlwYXRoW3Bwb3NdLnBfYmxvY2sgPSBpZHhfcGJsb2NrKHBhdGhbcHBvc10ucF9pZHgpOworCQlwYXRoW3Bwb3NdLnBfZGVwdGggPSBpOworCQlwYXRoW3Bwb3NdLnBfZXh0ID0gTlVMTDsKKworCQliaCA9IHNiX2JyZWFkKGlub2RlLT5pX3NiLCBwYXRoW3Bwb3NdLnBfYmxvY2spOworCQlpZiAoIWJoKQorCQkJZ290byBlcnI7CisKKwkJZWggPSBleHRfYmxvY2tfaGRyKGJoKTsKKwkJcHBvcysrOworCQlCVUdfT04ocHBvcyA+IGRlcHRoKTsKKwkJcGF0aFtwcG9zXS5wX2JoID0gYmg7CisJCXBhdGhbcHBvc10ucF9oZHIgPSBlaDsKKwkJaS0tOworCisJCWlmIChleHQ0X2V4dF9jaGVja19oZWFkZXIoX19GVU5DVElPTl9fLCBpbm9kZSwgZWgpKQorCQkJZ290byBlcnI7CisJfQorCisJcGF0aFtwcG9zXS5wX2RlcHRoID0gaTsKKwlwYXRoW3Bwb3NdLnBfaGRyID0gZWg7CisJcGF0aFtwcG9zXS5wX2V4dCA9IE5VTEw7CisJcGF0aFtwcG9zXS5wX2lkeCA9IE5VTEw7CisKKwlpZiAoZXh0NF9leHRfY2hlY2tfaGVhZGVyKF9fRlVOQ1RJT05fXywgaW5vZGUsIGVoKSkKKwkJZ290byBlcnI7CisKKwkvKiBmaW5kIGV4dGVudCAqLworCWV4dDRfZXh0X2JpbnNlYXJjaChpbm9kZSwgcGF0aCArIHBwb3MsIGJsb2NrKTsKKworCWV4dDRfZXh0X3Nob3dfcGF0aChpbm9kZSwgcGF0aCk7CisKKwlyZXR1cm4gcGF0aDsKKworZXJyOgorCWV4dDRfZXh0X2Ryb3BfcmVmcyhwYXRoKTsKKwlpZiAoYWxsb2MpCisJCWtmcmVlKHBhdGgpOworCXJldHVybiBFUlJfUFRSKC1FSU8pOworfQorCisvKgorICogZXh0NF9leHRfaW5zZXJ0X2luZGV4OgorICogaW5zZXJ0IG5ldyBpbmRleCBbQGxvZ2ljYWw7QHB0cl0gaW50byB0aGUgYmxvY2sgYXQgQGN1cnA7CisgKiBjaGVjayB3aGVyZSB0byBpbnNlcnQ6IGJlZm9yZSBAY3VycCBvciBhZnRlciBAY3VycAorICovCitzdGF0aWMgaW50IGV4dDRfZXh0X2luc2VydF9pbmRleChoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3QgaW5vZGUgKmlub2RlLAorCQkJCXN0cnVjdCBleHQ0X2V4dF9wYXRoICpjdXJwLAorCQkJCWludCBsb2dpY2FsLCBleHQ0X2ZzYmxrX3QgcHRyKQoreworCXN0cnVjdCBleHQ0X2V4dGVudF9pZHggKml4OworCWludCBsZW4sIGVycjsKKworCWlmICgoZXJyID0gZXh0NF9leHRfZ2V0X2FjY2VzcyhoYW5kbGUsIGlub2RlLCBjdXJwKSkpCisJCXJldHVybiBlcnI7CisKKwlCVUdfT04obG9naWNhbCA9PSBsZTMyX3RvX2NwdShjdXJwLT5wX2lkeC0+ZWlfYmxvY2spKTsKKwlsZW4gPSBFWFRfTUFYX0lOREVYKGN1cnAtPnBfaGRyKSAtIGN1cnAtPnBfaWR4OworCWlmIChsb2dpY2FsID4gbGUzMl90b19jcHUoY3VycC0+cF9pZHgtPmVpX2Jsb2NrKSkgeworCQkvKiBpbnNlcnQgYWZ0ZXIgKi8KKwkJaWYgKGN1cnAtPnBfaWR4ICE9IEVYVF9MQVNUX0lOREVYKGN1cnAtPnBfaGRyKSkgeworCQkJbGVuID0gKGxlbiAtIDEpICogc2l6ZW9mKHN0cnVjdCBleHQ0X2V4dGVudF9pZHgpOworCQkJbGVuID0gbGVuIDwgMCA/IDAgOiBsZW47CisJCQlleHRfZGVidWcoImluc2VydCBuZXcgaW5kZXggJWQgYWZ0ZXI6ICVkLiAiCisJCQkJCSJtb3ZlICVkIGZyb20gMHglcCB0byAweCVwXG4iLAorCQkJCQlsb2dpY2FsLCBwdHIsIGxlbiwKKwkJCQkJKGN1cnAtPnBfaWR4ICsgMSksIChjdXJwLT5wX2lkeCArIDIpKTsKKwkJCW1lbW1vdmUoY3VycC0+cF9pZHggKyAyLCBjdXJwLT5wX2lkeCArIDEsIGxlbik7CisJCX0KKwkJaXggPSBjdXJwLT5wX2lkeCArIDE7CisJfSBlbHNlIHsKKwkJLyogaW5zZXJ0IGJlZm9yZSAqLworCQlsZW4gPSBsZW4gKiBzaXplb2Yoc3RydWN0IGV4dDRfZXh0ZW50X2lkeCk7CisJCWxlbiA9IGxlbiA8IDAgPyAwIDogbGVuOworCQlleHRfZGVidWcoImluc2VydCBuZXcgaW5kZXggJWQgYmVmb3JlOiAlZC4gIgorCQkJCSJtb3ZlICVkIGZyb20gMHglcCB0byAweCVwXG4iLAorCQkJCWxvZ2ljYWwsIHB0ciwgbGVuLAorCQkJCWN1cnAtPnBfaWR4LCAoY3VycC0+cF9pZHggKyAxKSk7CisJCW1lbW1vdmUoY3VycC0+cF9pZHggKyAxLCBjdXJwLT5wX2lkeCwgbGVuKTsKKwkJaXggPSBjdXJwLT5wX2lkeDsKKwl9CisKKwlpeC0+ZWlfYmxvY2sgPSBjcHVfdG9fbGUzMihsb2dpY2FsKTsKKwlleHQ0X2lkeF9zdG9yZV9wYmxvY2soaXgsIHB0cik7CisJY3VycC0+cF9oZHItPmVoX2VudHJpZXMgPSBjcHVfdG9fbGUxNihsZTE2X3RvX2NwdShjdXJwLT5wX2hkci0+ZWhfZW50cmllcykrMSk7CisKKwlCVUdfT04obGUxNl90b19jcHUoY3VycC0+cF9oZHItPmVoX2VudHJpZXMpCisJICAgICAgICAgICAgICAgICAgICAgPiBsZTE2X3RvX2NwdShjdXJwLT5wX2hkci0+ZWhfbWF4KSk7CisJQlVHX09OKGl4ID4gRVhUX0xBU1RfSU5ERVgoY3VycC0+cF9oZHIpKTsKKworCWVyciA9IGV4dDRfZXh0X2RpcnR5KGhhbmRsZSwgaW5vZGUsIGN1cnApOworCWV4dDRfc3RkX2Vycm9yKGlub2RlLT5pX3NiLCBlcnIpOworCisJcmV0dXJuIGVycjsKK30KKworLyoKKyAqIGV4dDRfZXh0X3NwbGl0OgorICogaW5zZXJ0cyBuZXcgc3VidHJlZSBpbnRvIHRoZSBwYXRoLCB1c2luZyBmcmVlIGluZGV4IGVudHJ5CisgKiBhdCBkZXB0aCBAYXQ6CisgKiAtIGFsbG9jYXRlcyBhbGwgbmVlZGVkIGJsb2NrcyAobmV3IGxlYWYgYW5kIGFsbCBpbnRlcm1lZGlhdGUgaW5kZXggYmxvY2tzKQorICogLSBtYWtlcyBkZWNpc2lvbiB3aGVyZSB0byBzcGxpdAorICogLSBtb3ZlcyByZW1haW5pbmcgZXh0ZW50cyBhbmQgaW5kZXggZW50cmllcyAocmlnaHQgdG8gdGhlIHNwbGl0IHBvaW50KQorICogICBpbnRvIHRoZSBuZXdseSBhbGxvY2F0ZWQgYmxvY2tzCisgKiAtIGluaXRpYWxpemVzIHN1YnRyZWUKKyAqLworc3RhdGljIGludCBleHQ0X2V4dF9zcGxpdChoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3QgaW5vZGUgKmlub2RlLAorCQkJCXN0cnVjdCBleHQ0X2V4dF9wYXRoICpwYXRoLAorCQkJCXN0cnVjdCBleHQ0X2V4dGVudCAqbmV3ZXh0LCBpbnQgYXQpCit7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCA9IE5VTEw7CisJaW50IGRlcHRoID0gZXh0X2RlcHRoKGlub2RlKTsKKwlzdHJ1Y3QgZXh0NF9leHRlbnRfaGVhZGVyICpuZWg7CisJc3RydWN0IGV4dDRfZXh0ZW50X2lkeCAqZmlkeDsKKwlzdHJ1Y3QgZXh0NF9leHRlbnQgKmV4OworCWludCBpID0gYXQsIGssIG0sIGE7CisJZXh0NF9mc2Jsa190IG5ld2Jsb2NrLCBvbGRibG9jazsKKwlfX2xlMzIgYm9yZGVyOworCWV4dDRfZnNibGtfdCAqYWJsb2NrcyA9IE5VTEw7IC8qIGFycmF5IG9mIGFsbG9jYXRlZCBibG9ja3MgKi8KKwlpbnQgZXJyID0gMDsKKworCS8qIG1ha2UgZGVjaXNpb246IHdoZXJlIHRvIHNwbGl0PyAqLworCS8qIEZJWE1FOiBub3cgZGVjaXNpb24gaXMgc2ltcGxlc3Q6IGF0IGN1cnJlbnQgZXh0ZW50ICovCisKKwkvKiBpZiBjdXJyZW50IGxlYWYgd2lsbCBiZSBzcGxpdCwgdGhlbiB3ZSBzaG91bGQgdXNlCisJICogYm9yZGVyIGZyb20gc3BsaXQgcG9pbnQgKi8KKwlCVUdfT04ocGF0aFtkZXB0aF0ucF9leHQgPiBFWFRfTUFYX0VYVEVOVChwYXRoW2RlcHRoXS5wX2hkcikpOworCWlmIChwYXRoW2RlcHRoXS5wX2V4dCAhPSBFWFRfTUFYX0VYVEVOVChwYXRoW2RlcHRoXS5wX2hkcikpIHsKKwkJYm9yZGVyID0gcGF0aFtkZXB0aF0ucF9leHRbMV0uZWVfYmxvY2s7CisJCWV4dF9kZWJ1ZygibGVhZiB3aWxsIGJlIHNwbGl0LiIKKwkJCQkiIG5leHQgbGVhZiBzdGFydHMgYXQgJWRcbiIsCisJCQkgICAgICAgICAgbGUzMl90b19jcHUoYm9yZGVyKSk7CisJfSBlbHNlIHsKKwkJYm9yZGVyID0gbmV3ZXh0LT5lZV9ibG9jazsKKwkJZXh0X2RlYnVnKCJsZWFmIHdpbGwgYmUgYWRkZWQuIgorCQkJCSIgbmV4dCBsZWFmIHN0YXJ0cyBhdCAlZFxuIiwKKwkJCSAgICAgICAgbGUzMl90b19jcHUoYm9yZGVyKSk7CisJfQorCisJLyoKKwkgKiBJZiBlcnJvciBvY2N1cnMsIHRoZW4gd2UgYnJlYWsgcHJvY2Vzc2luZworCSAqIGFuZCBtYXJrIGZpbGVzeXN0ZW0gcmVhZC1vbmx5LiBpbmRleCB3b24ndAorCSAqIGJlIGluc2VydGVkIGFuZCB0cmVlIHdpbGwgYmUgaW4gY29uc2lzdGVudAorCSAqIHN0YXRlLiBOZXh0IG1vdW50IHdpbGwgcmVwYWlyIGJ1ZmZlcnMgdG9vLgorCSAqLworCisJLyoKKwkgKiBHZXQgYXJyYXkgdG8gdHJhY2sgYWxsIGFsbG9jYXRlZCBibG9ja3MuCisJICogV2UgbmVlZCB0aGlzIHRvIGhhbmRsZSBlcnJvcnMgYW5kIGZyZWUgYmxvY2tzCisJICogdXBvbiB0aGVtLgorCSAqLworCWFibG9ja3MgPSBrbWFsbG9jKHNpemVvZihleHQ0X2ZzYmxrX3QpICogZGVwdGgsIEdGUF9OT0ZTKTsKKwlpZiAoIWFibG9ja3MpCisJCXJldHVybiAtRU5PTUVNOworCW1lbXNldChhYmxvY2tzLCAwLCBzaXplb2YoZXh0NF9mc2Jsa190KSAqIGRlcHRoKTsKKworCS8qIGFsbG9jYXRlIGFsbCBuZWVkZWQgYmxvY2tzICovCisJZXh0X2RlYnVnKCJhbGxvY2F0ZSAlZCBibG9ja3MgZm9yIGluZGV4ZXMvbGVhZlxuIiwgZGVwdGggLSBhdCk7CisJZm9yIChhID0gMDsgYSA8IGRlcHRoIC0gYXQ7IGErKykgeworCQluZXdibG9jayA9IGV4dDRfZXh0X25ld19ibG9jayhoYW5kbGUsIGlub2RlLCBwYXRoLCBuZXdleHQsICZlcnIpOworCQlpZiAobmV3YmxvY2sgPT0gMCkKKwkJCWdvdG8gY2xlYW51cDsKKwkJYWJsb2Nrc1thXSA9IG5ld2Jsb2NrOworCX0KKworCS8qIGluaXRpYWxpemUgbmV3IGxlYWYgKi8KKwluZXdibG9jayA9IGFibG9ja3NbLS1hXTsKKwlCVUdfT04obmV3YmxvY2sgPT0gMCk7CisJYmggPSBzYl9nZXRibGsoaW5vZGUtPmlfc2IsIG5ld2Jsb2NrKTsKKwlpZiAoIWJoKSB7CisJCWVyciA9IC1FSU87CisJCWdvdG8gY2xlYW51cDsKKwl9CisJbG9ja19idWZmZXIoYmgpOworCisJaWYgKChlcnIgPSBleHQ0X2pvdXJuYWxfZ2V0X2NyZWF0ZV9hY2Nlc3MoaGFuZGxlLCBiaCkpKQorCQlnb3RvIGNsZWFudXA7CisKKwluZWggPSBleHRfYmxvY2tfaGRyKGJoKTsKKwluZWgtPmVoX2VudHJpZXMgPSAwOworCW5laC0+ZWhfbWF4ID0gY3B1X3RvX2xlMTYoZXh0NF9leHRfc3BhY2VfYmxvY2soaW5vZGUpKTsKKwluZWgtPmVoX21hZ2ljID0gRVhUNF9FWFRfTUFHSUM7CisJbmVoLT5laF9kZXB0aCA9IDA7CisJZXggPSBFWFRfRklSU1RfRVhURU5UKG5laCk7CisKKwkvKiBtb3ZlIHJlbWFpbmRlciBvZiBwYXRoW2RlcHRoXSB0byB0aGUgbmV3IGxlYWYgKi8KKwlCVUdfT04ocGF0aFtkZXB0aF0ucF9oZHItPmVoX2VudHJpZXMgIT0gcGF0aFtkZXB0aF0ucF9oZHItPmVoX21heCk7CisJLyogc3RhcnQgY29weSBmcm9tIG5leHQgZXh0ZW50ICovCisJLyogVE9ETzogd2UgY291bGQgZG8gaXQgYnkgc2luZ2xlIG1lbW1vdmUgKi8KKwltID0gMDsKKwlwYXRoW2RlcHRoXS5wX2V4dCsrOworCXdoaWxlIChwYXRoW2RlcHRoXS5wX2V4dCA8PQorCQkJRVhUX01BWF9FWFRFTlQocGF0aFtkZXB0aF0ucF9oZHIpKSB7CisJCWV4dF9kZWJ1ZygibW92ZSAlZDolbGx1OiVkIGluIG5ldyBsZWFmICVsbHVcbiIsCisJCQkgICAgICAgIGxlMzJfdG9fY3B1KHBhdGhbZGVwdGhdLnBfZXh0LT5lZV9ibG9jayksCisJCQkgICAgICAgIGV4dF9wYmxvY2socGF0aFtkZXB0aF0ucF9leHQpLAorCQkJICAgICAgICBsZTE2X3RvX2NwdShwYXRoW2RlcHRoXS5wX2V4dC0+ZWVfbGVuKSwKKwkJCQluZXdibG9jayk7CisJCS8qbWVtbW92ZShleCsrLCBwYXRoW2RlcHRoXS5wX2V4dCsrLAorCQkJCXNpemVvZihzdHJ1Y3QgZXh0NF9leHRlbnQpKTsKKwkJbmVoLT5laF9lbnRyaWVzKys7Ki8KKwkJcGF0aFtkZXB0aF0ucF9leHQrKzsKKwkJbSsrOworCX0KKwlpZiAobSkgeworCQltZW1tb3ZlKGV4LCBwYXRoW2RlcHRoXS5wX2V4dC1tLCBzaXplb2Yoc3RydWN0IGV4dDRfZXh0ZW50KSptKTsKKwkJbmVoLT5laF9lbnRyaWVzID0gY3B1X3RvX2xlMTYobGUxNl90b19jcHUobmVoLT5laF9lbnRyaWVzKSttKTsKKwl9CisKKwlzZXRfYnVmZmVyX3VwdG9kYXRlKGJoKTsKKwl1bmxvY2tfYnVmZmVyKGJoKTsKKworCWlmICgoZXJyID0gZXh0NF9qb3VybmFsX2RpcnR5X21ldGFkYXRhKGhhbmRsZSwgYmgpKSkKKwkJZ290byBjbGVhbnVwOworCWJyZWxzZShiaCk7CisJYmggPSBOVUxMOworCisJLyogY29ycmVjdCBvbGQgbGVhZiAqLworCWlmIChtKSB7CisJCWlmICgoZXJyID0gZXh0NF9leHRfZ2V0X2FjY2VzcyhoYW5kbGUsIGlub2RlLCBwYXRoICsgZGVwdGgpKSkKKwkJCWdvdG8gY2xlYW51cDsKKwkJcGF0aFtkZXB0aF0ucF9oZHItPmVoX2VudHJpZXMgPQorCQkgICAgIGNwdV90b19sZTE2KGxlMTZfdG9fY3B1KHBhdGhbZGVwdGhdLnBfaGRyLT5laF9lbnRyaWVzKS1tKTsKKwkJaWYgKChlcnIgPSBleHQ0X2V4dF9kaXJ0eShoYW5kbGUsIGlub2RlLCBwYXRoICsgZGVwdGgpKSkKKwkJCWdvdG8gY2xlYW51cDsKKworCX0KKworCS8qIGNyZWF0ZSBpbnRlcm1lZGlhdGUgaW5kZXhlcyAqLworCWsgPSBkZXB0aCAtIGF0IC0gMTsKKwlCVUdfT04oayA8IDApOworCWlmIChrKQorCQlleHRfZGVidWcoImNyZWF0ZSAlZCBpbnRlcm1lZGlhdGUgaW5kaWNlc1xuIiwgayk7CisJLyogaW5zZXJ0IG5ldyBpbmRleCBpbnRvIGN1cnJlbnQgaW5kZXggYmxvY2sgKi8KKwkvKiBjdXJyZW50IGRlcHRoIHN0b3JlZCBpbiBpIHZhciAqLworCWkgPSBkZXB0aCAtIDE7CisJd2hpbGUgKGstLSkgeworCQlvbGRibG9jayA9IG5ld2Jsb2NrOworCQluZXdibG9jayA9IGFibG9ja3NbLS1hXTsKKwkJYmggPSBzYl9nZXRibGsoaW5vZGUtPmlfc2IsIChleHQ0X2ZzYmxrX3QpbmV3YmxvY2spOworCQlpZiAoIWJoKSB7CisJCQllcnIgPSAtRUlPOworCQkJZ290byBjbGVhbnVwOworCQl9CisJCWxvY2tfYnVmZmVyKGJoKTsKKworCQlpZiAoKGVyciA9IGV4dDRfam91cm5hbF9nZXRfY3JlYXRlX2FjY2VzcyhoYW5kbGUsIGJoKSkpCisJCQlnb3RvIGNsZWFudXA7CisKKwkJbmVoID0gZXh0X2Jsb2NrX2hkcihiaCk7CisJCW5laC0+ZWhfZW50cmllcyA9IGNwdV90b19sZTE2KDEpOworCQluZWgtPmVoX21hZ2ljID0gRVhUNF9FWFRfTUFHSUM7CisJCW5laC0+ZWhfbWF4ID0gY3B1X3RvX2xlMTYoZXh0NF9leHRfc3BhY2VfYmxvY2tfaWR4KGlub2RlKSk7CisJCW5laC0+ZWhfZGVwdGggPSBjcHVfdG9fbGUxNihkZXB0aCAtIGkpOworCQlmaWR4ID0gRVhUX0ZJUlNUX0lOREVYKG5laCk7CisJCWZpZHgtPmVpX2Jsb2NrID0gYm9yZGVyOworCQlleHQ0X2lkeF9zdG9yZV9wYmxvY2soZmlkeCwgb2xkYmxvY2spOworCisJCWV4dF9kZWJ1ZygiaW50LmluZGV4IGF0ICVkIChibG9jayAlbGx1KTogJWx1IC0+ICVsbHVcbiIsIGksCisJCQkJbmV3YmxvY2ssICh1bnNpZ25lZCBsb25nKSBsZTMyX3RvX2NwdShib3JkZXIpLAorCQkJCW9sZGJsb2NrKTsKKwkJLyogY29weSBpbmRleGVzICovCisJCW0gPSAwOworCQlwYXRoW2ldLnBfaWR4Kys7CisKKwkJZXh0X2RlYnVnKCJjdXIgMHglcCwgbGFzdCAweCVwXG4iLCBwYXRoW2ldLnBfaWR4LAorCQkJCUVYVF9NQVhfSU5ERVgocGF0aFtpXS5wX2hkcikpOworCQlCVUdfT04oRVhUX01BWF9JTkRFWChwYXRoW2ldLnBfaGRyKSAhPQorCQkJCUVYVF9MQVNUX0lOREVYKHBhdGhbaV0ucF9oZHIpKTsKKwkJd2hpbGUgKHBhdGhbaV0ucF9pZHggPD0gRVhUX01BWF9JTkRFWChwYXRoW2ldLnBfaGRyKSkgeworCQkJZXh0X2RlYnVnKCIlZDogbW92ZSAlZDolZCBpbiBuZXcgaW5kZXggJWxsdVxuIiwgaSwKKwkJCQkgICAgICAgIGxlMzJfdG9fY3B1KHBhdGhbaV0ucF9pZHgtPmVpX2Jsb2NrKSwKKwkJCQkgICAgICAgIGlkeF9wYmxvY2socGF0aFtpXS5wX2lkeCksCisJCQkJICAgICAgICBuZXdibG9jayk7CisJCQkvKm1lbW1vdmUoKytmaWR4LCBwYXRoW2ldLnBfaWR4KyssCisJCQkJCXNpemVvZihzdHJ1Y3QgZXh0NF9leHRlbnRfaWR4KSk7CisJCQluZWgtPmVoX2VudHJpZXMrKzsKKwkJCUJVR19PTihuZWgtPmVoX2VudHJpZXMgPiBuZWgtPmVoX21heCk7Ki8KKwkJCXBhdGhbaV0ucF9pZHgrKzsKKwkJCW0rKzsKKwkJfQorCQlpZiAobSkgeworCQkJbWVtbW92ZSgrK2ZpZHgsIHBhdGhbaV0ucF9pZHggLSBtLAorCQkJCXNpemVvZihzdHJ1Y3QgZXh0NF9leHRlbnRfaWR4KSAqIG0pOworCQkJbmVoLT5laF9lbnRyaWVzID0KKwkJCQljcHVfdG9fbGUxNihsZTE2X3RvX2NwdShuZWgtPmVoX2VudHJpZXMpICsgbSk7CisJCX0KKwkJc2V0X2J1ZmZlcl91cHRvZGF0ZShiaCk7CisJCXVubG9ja19idWZmZXIoYmgpOworCisJCWlmICgoZXJyID0gZXh0NF9qb3VybmFsX2RpcnR5X21ldGFkYXRhKGhhbmRsZSwgYmgpKSkKKwkJCWdvdG8gY2xlYW51cDsKKwkJYnJlbHNlKGJoKTsKKwkJYmggPSBOVUxMOworCisJCS8qIGNvcnJlY3Qgb2xkIGluZGV4ICovCisJCWlmIChtKSB7CisJCQllcnIgPSBleHQ0X2V4dF9nZXRfYWNjZXNzKGhhbmRsZSwgaW5vZGUsIHBhdGggKyBpKTsKKwkJCWlmIChlcnIpCisJCQkJZ290byBjbGVhbnVwOworCQkJcGF0aFtpXS5wX2hkci0+ZWhfZW50cmllcyA9IGNwdV90b19sZTE2KGxlMTZfdG9fY3B1KHBhdGhbaV0ucF9oZHItPmVoX2VudHJpZXMpLW0pOworCQkJZXJyID0gZXh0NF9leHRfZGlydHkoaGFuZGxlLCBpbm9kZSwgcGF0aCArIGkpOworCQkJaWYgKGVycikKKwkJCQlnb3RvIGNsZWFudXA7CisJCX0KKworCQlpLS07CisJfQorCisJLyogaW5zZXJ0IG5ldyBpbmRleCAqLworCWlmIChlcnIpCisJCWdvdG8gY2xlYW51cDsKKworCWVyciA9IGV4dDRfZXh0X2luc2VydF9pbmRleChoYW5kbGUsIGlub2RlLCBwYXRoICsgYXQsCisJCQkJICAgIGxlMzJfdG9fY3B1KGJvcmRlciksIG5ld2Jsb2NrKTsKKworY2xlYW51cDoKKwlpZiAoYmgpIHsKKwkJaWYgKGJ1ZmZlcl9sb2NrZWQoYmgpKQorCQkJdW5sb2NrX2J1ZmZlcihiaCk7CisJCWJyZWxzZShiaCk7CisJfQorCisJaWYgKGVycikgeworCQkvKiBmcmVlIGFsbCBhbGxvY2F0ZWQgYmxvY2tzIGluIGVycm9yIGNhc2UgKi8KKwkJZm9yIChpID0gMDsgaSA8IGRlcHRoOyBpKyspIHsKKwkJCWlmICghYWJsb2Nrc1tpXSkKKwkJCQljb250aW51ZTsKKwkJCWV4dDRfZnJlZV9ibG9ja3MoaGFuZGxlLCBpbm9kZSwgYWJsb2Nrc1tpXSwgMSk7CisJCX0KKwl9CisJa2ZyZWUoYWJsb2Nrcyk7CisKKwlyZXR1cm4gZXJyOworfQorCisvKgorICogZXh0NF9leHRfZ3Jvd19pbmRlcHRoOgorICogaW1wbGVtZW50cyB0cmVlIGdyb3dpbmcgcHJvY2VkdXJlOgorICogLSBhbGxvY2F0ZXMgbmV3IGJsb2NrCisgKiAtIG1vdmVzIHRvcC1sZXZlbCBkYXRhIChpbmRleCBibG9jayBvciBsZWFmKSBpbnRvIHRoZSBuZXcgYmxvY2sKKyAqIC0gaW5pdGlhbGl6ZXMgbmV3IHRvcC1sZXZlbCwgY3JlYXRpbmcgaW5kZXggdGhhdCBwb2ludHMgdG8gdGhlCisgKiAgIGp1c3QgY3JlYXRlZCBibG9jaworICovCitzdGF0aWMgaW50IGV4dDRfZXh0X2dyb3dfaW5kZXB0aChoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3QgaW5vZGUgKmlub2RlLAorCQkJCQlzdHJ1Y3QgZXh0NF9leHRfcGF0aCAqcGF0aCwKKwkJCQkJc3RydWN0IGV4dDRfZXh0ZW50ICpuZXdleHQpCit7CisJc3RydWN0IGV4dDRfZXh0X3BhdGggKmN1cnAgPSBwYXRoOworCXN0cnVjdCBleHQ0X2V4dGVudF9oZWFkZXIgKm5laDsKKwlzdHJ1Y3QgZXh0NF9leHRlbnRfaWR4ICpmaWR4OworCXN0cnVjdCBidWZmZXJfaGVhZCAqYmg7CisJZXh0NF9mc2Jsa190IG5ld2Jsb2NrOworCWludCBlcnIgPSAwOworCisJbmV3YmxvY2sgPSBleHQ0X2V4dF9uZXdfYmxvY2soaGFuZGxlLCBpbm9kZSwgcGF0aCwgbmV3ZXh0LCAmZXJyKTsKKwlpZiAobmV3YmxvY2sgPT0gMCkKKwkJcmV0dXJuIGVycjsKKworCWJoID0gc2JfZ2V0YmxrKGlub2RlLT5pX3NiLCBuZXdibG9jayk7CisJaWYgKCFiaCkgeworCQllcnIgPSAtRUlPOworCQlleHQ0X3N0ZF9lcnJvcihpbm9kZS0+aV9zYiwgZXJyKTsKKwkJcmV0dXJuIGVycjsKKwl9CisJbG9ja19idWZmZXIoYmgpOworCisJaWYgKChlcnIgPSBleHQ0X2pvdXJuYWxfZ2V0X2NyZWF0ZV9hY2Nlc3MoaGFuZGxlLCBiaCkpKSB7CisJCXVubG9ja19idWZmZXIoYmgpOworCQlnb3RvIG91dDsKKwl9CisKKwkvKiBtb3ZlIHRvcC1sZXZlbCBpbmRleC9sZWFmIGludG8gbmV3IGJsb2NrICovCisJbWVtbW92ZShiaC0+Yl9kYXRhLCBjdXJwLT5wX2hkciwgc2l6ZW9mKEVYVDRfSShpbm9kZSktPmlfZGF0YSkpOworCisJLyogc2V0IHNpemUgb2YgbmV3IGJsb2NrICovCisJbmVoID0gZXh0X2Jsb2NrX2hkcihiaCk7CisJLyogb2xkIHJvb3QgY291bGQgaGF2ZSBpbmRleGVzIG9yIGxlYXZlcworCSAqIHNvIGNhbGN1bGF0ZSBlX21heCByaWdodCB3YXkgKi8KKwlpZiAoZXh0X2RlcHRoKGlub2RlKSkKKwkgIG5laC0+ZWhfbWF4ID0gY3B1X3RvX2xlMTYoZXh0NF9leHRfc3BhY2VfYmxvY2tfaWR4KGlub2RlKSk7CisJZWxzZQorCSAgbmVoLT5laF9tYXggPSBjcHVfdG9fbGUxNihleHQ0X2V4dF9zcGFjZV9ibG9jayhpbm9kZSkpOworCW5laC0+ZWhfbWFnaWMgPSBFWFQ0X0VYVF9NQUdJQzsKKwlzZXRfYnVmZmVyX3VwdG9kYXRlKGJoKTsKKwl1bmxvY2tfYnVmZmVyKGJoKTsKKworCWlmICgoZXJyID0gZXh0NF9qb3VybmFsX2RpcnR5X21ldGFkYXRhKGhhbmRsZSwgYmgpKSkKKwkJZ290byBvdXQ7CisKKwkvKiBjcmVhdGUgaW5kZXggaW4gbmV3IHRvcC1sZXZlbCBpbmRleDogbnVtLG1heCxwb2ludGVyICovCisJaWYgKChlcnIgPSBleHQ0X2V4dF9nZXRfYWNjZXNzKGhhbmRsZSwgaW5vZGUsIGN1cnApKSkKKwkJZ290byBvdXQ7CisKKwljdXJwLT5wX2hkci0+ZWhfbWFnaWMgPSBFWFQ0X0VYVF9NQUdJQzsKKwljdXJwLT5wX2hkci0+ZWhfbWF4ID0gY3B1X3RvX2xlMTYoZXh0NF9leHRfc3BhY2Vfcm9vdF9pZHgoaW5vZGUpKTsKKwljdXJwLT5wX2hkci0+ZWhfZW50cmllcyA9IGNwdV90b19sZTE2KDEpOworCWN1cnAtPnBfaWR4ID0gRVhUX0ZJUlNUX0lOREVYKGN1cnAtPnBfaGRyKTsKKwkvKiBGSVhNRTogaXQgd29ya3MsIGJ1dCBhY3R1YWxseSBwYXRoWzBdIGNhbiBiZSBpbmRleCAqLworCWN1cnAtPnBfaWR4LT5laV9ibG9jayA9IEVYVF9GSVJTVF9FWFRFTlQocGF0aFswXS5wX2hkciktPmVlX2Jsb2NrOworCWV4dDRfaWR4X3N0b3JlX3BibG9jayhjdXJwLT5wX2lkeCwgbmV3YmxvY2spOworCisJbmVoID0gZXh0X2lub2RlX2hkcihpbm9kZSk7CisJZmlkeCA9IEVYVF9GSVJTVF9JTkRFWChuZWgpOworCWV4dF9kZWJ1ZygibmV3IHJvb3Q6IG51bSAlZCglZCksIGxibG9jayAlZCwgcHRyICVsbHVcbiIsCisJCSAgbGUxNl90b19jcHUobmVoLT5laF9lbnRyaWVzKSwgbGUxNl90b19jcHUobmVoLT5laF9tYXgpLAorCQkgIGxlMzJfdG9fY3B1KGZpZHgtPmVpX2Jsb2NrKSwgaWR4X3BibG9jayhmaWR4KSk7CisKKwluZWgtPmVoX2RlcHRoID0gY3B1X3RvX2xlMTYocGF0aC0+cF9kZXB0aCArIDEpOworCWVyciA9IGV4dDRfZXh0X2RpcnR5KGhhbmRsZSwgaW5vZGUsIGN1cnApOworb3V0OgorCWJyZWxzZShiaCk7CisKKwlyZXR1cm4gZXJyOworfQorCisvKgorICogZXh0NF9leHRfY3JlYXRlX25ld19sZWFmOgorICogZmluZHMgZW1wdHkgaW5kZXggYW5kIGFkZHMgbmV3IGxlYWYuCisgKiBpZiBubyBmcmVlIGluZGV4IGlzIGZvdW5kLCB0aGVuIGl0IHJlcXVlc3RzIGluLWRlcHRoIGdyb3dpbmcuCisgKi8KK3N0YXRpYyBpbnQgZXh0NF9leHRfY3JlYXRlX25ld19sZWFmKGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBpbm9kZSAqaW5vZGUsCisJCQkJCXN0cnVjdCBleHQ0X2V4dF9wYXRoICpwYXRoLAorCQkJCQlzdHJ1Y3QgZXh0NF9leHRlbnQgKm5ld2V4dCkKK3sKKwlzdHJ1Y3QgZXh0NF9leHRfcGF0aCAqY3VycDsKKwlpbnQgZGVwdGgsIGksIGVyciA9IDA7CisKK3JlcGVhdDoKKwlpID0gZGVwdGggPSBleHRfZGVwdGgoaW5vZGUpOworCisJLyogd2FsayB1cCB0byB0aGUgdHJlZSBhbmQgbG9vayBmb3IgZnJlZSBpbmRleCBlbnRyeSAqLworCWN1cnAgPSBwYXRoICsgZGVwdGg7CisJd2hpbGUgKGkgPiAwICYmICFFWFRfSEFTX0ZSRUVfSU5ERVgoY3VycCkpIHsKKwkJaS0tOworCQljdXJwLS07CisJfQorCisJLyogd2UgdXNlIGFscmVhZHkgYWxsb2NhdGVkIGJsb2NrIGZvciBpbmRleCBibG9jaywKKwkgKiBzbyBzdWJzZXF1ZW50IGRhdGEgYmxvY2tzIHNob3VsZCBiZSBjb250aWd1b3VzICovCisJaWYgKEVYVF9IQVNfRlJFRV9JTkRFWChjdXJwKSkgeworCQkvKiBpZiB3ZSBmb3VuZCBpbmRleCB3aXRoIGZyZWUgZW50cnksIHRoZW4gdXNlIHRoYXQKKwkJICogZW50cnk6IGNyZWF0ZSBhbGwgbmVlZGVkIHN1YnRyZWUgYW5kIGFkZCBuZXcgbGVhZiAqLworCQllcnIgPSBleHQ0X2V4dF9zcGxpdChoYW5kbGUsIGlub2RlLCBwYXRoLCBuZXdleHQsIGkpOworCisJCS8qIHJlZmlsbCBwYXRoICovCisJCWV4dDRfZXh0X2Ryb3BfcmVmcyhwYXRoKTsKKwkJcGF0aCA9IGV4dDRfZXh0X2ZpbmRfZXh0ZW50KGlub2RlLAorCQkJCQkgICAgbGUzMl90b19jcHUobmV3ZXh0LT5lZV9ibG9jayksCisJCQkJCSAgICBwYXRoKTsKKwkJaWYgKElTX0VSUihwYXRoKSkKKwkJCWVyciA9IFBUUl9FUlIocGF0aCk7CisJfSBlbHNlIHsKKwkJLyogdHJlZSBpcyBmdWxsLCB0aW1lIHRvIGdyb3cgaW4gZGVwdGggKi8KKwkJZXJyID0gZXh0NF9leHRfZ3Jvd19pbmRlcHRoKGhhbmRsZSwgaW5vZGUsIHBhdGgsIG5ld2V4dCk7CisJCWlmIChlcnIpCisJCQlnb3RvIG91dDsKKworCQkvKiByZWZpbGwgcGF0aCAqLworCQlleHQ0X2V4dF9kcm9wX3JlZnMocGF0aCk7CisJCXBhdGggPSBleHQ0X2V4dF9maW5kX2V4dGVudChpbm9kZSwKKwkJCQkJICAgIGxlMzJfdG9fY3B1KG5ld2V4dC0+ZWVfYmxvY2spLAorCQkJCQkgICAgcGF0aCk7CisJCWlmIChJU19FUlIocGF0aCkpIHsKKwkJCWVyciA9IFBUUl9FUlIocGF0aCk7CisJCQlnb3RvIG91dDsKKwkJfQorCisJCS8qCisJCSAqIG9ubHkgZmlyc3QgKGRlcHRoIDAgLT4gMSkgcHJvZHVjZXMgZnJlZSBzcGFjZTsKKwkJICogaW4gYWxsIG90aGVyIGNhc2VzIHdlIGhhdmUgdG8gc3BsaXQgdGhlIGdyb3duIHRyZWUKKwkJICovCisJCWRlcHRoID0gZXh0X2RlcHRoKGlub2RlKTsKKwkJaWYgKHBhdGhbZGVwdGhdLnBfaGRyLT5laF9lbnRyaWVzID09IHBhdGhbZGVwdGhdLnBfaGRyLT5laF9tYXgpIHsKKwkJCS8qIG5vdyB3ZSBuZWVkIHRvIHNwbGl0ICovCisJCQlnb3RvIHJlcGVhdDsKKwkJfQorCX0KKworb3V0OgorCXJldHVybiBlcnI7Cit9CisKKy8qCisgKiBleHQ0X2V4dF9uZXh0X2FsbG9jYXRlZF9ibG9jazoKKyAqIHJldHVybnMgYWxsb2NhdGVkIGJsb2NrIGluIHN1YnNlcXVlbnQgZXh0ZW50IG9yIEVYVF9NQVhfQkxPQ0suCisgKiBOT1RFOiBpdCBjb25zaWRlcnMgYmxvY2sgbnVtYmVyIGZyb20gaW5kZXggZW50cnkgYXMKKyAqIGFsbG9jYXRlZCBibG9jay4gVGh1cywgaW5kZXggZW50cmllcyBoYXZlIHRvIGJlIGNvbnNpc3RlbnQKKyAqIHdpdGggbGVhdmVzLgorICovCitzdGF0aWMgdW5zaWduZWQgbG9uZworZXh0NF9leHRfbmV4dF9hbGxvY2F0ZWRfYmxvY2soc3RydWN0IGV4dDRfZXh0X3BhdGggKnBhdGgpCit7CisJaW50IGRlcHRoOworCisJQlVHX09OKHBhdGggPT0gTlVMTCk7CisJZGVwdGggPSBwYXRoLT5wX2RlcHRoOworCisJaWYgKGRlcHRoID09IDAgJiYgcGF0aC0+cF9leHQgPT0gTlVMTCkKKwkJcmV0dXJuIEVYVF9NQVhfQkxPQ0s7CisKKwl3aGlsZSAoZGVwdGggPj0gMCkgeworCQlpZiAoZGVwdGggPT0gcGF0aC0+cF9kZXB0aCkgeworCQkJLyogbGVhZiAqLworCQkJaWYgKHBhdGhbZGVwdGhdLnBfZXh0ICE9CisJCQkJCUVYVF9MQVNUX0VYVEVOVChwYXRoW2RlcHRoXS5wX2hkcikpCisJCQkgIHJldHVybiBsZTMyX3RvX2NwdShwYXRoW2RlcHRoXS5wX2V4dFsxXS5lZV9ibG9jayk7CisJCX0gZWxzZSB7CisJCQkvKiBpbmRleCAqLworCQkJaWYgKHBhdGhbZGVwdGhdLnBfaWR4ICE9CisJCQkJCUVYVF9MQVNUX0lOREVYKHBhdGhbZGVwdGhdLnBfaGRyKSkKKwkJCSAgcmV0dXJuIGxlMzJfdG9fY3B1KHBhdGhbZGVwdGhdLnBfaWR4WzFdLmVpX2Jsb2NrKTsKKwkJfQorCQlkZXB0aC0tOworCX0KKworCXJldHVybiBFWFRfTUFYX0JMT0NLOworfQorCisvKgorICogZXh0NF9leHRfbmV4dF9sZWFmX2Jsb2NrOgorICogcmV0dXJucyBmaXJzdCBhbGxvY2F0ZWQgYmxvY2sgZnJvbSBuZXh0IGxlYWYgb3IgRVhUX01BWF9CTE9DSworICovCitzdGF0aWMgdW5zaWduZWQgZXh0NF9leHRfbmV4dF9sZWFmX2Jsb2NrKHN0cnVjdCBpbm9kZSAqaW5vZGUsCisJCQkJCXN0cnVjdCBleHQ0X2V4dF9wYXRoICpwYXRoKQoreworCWludCBkZXB0aDsKKworCUJVR19PTihwYXRoID09IE5VTEwpOworCWRlcHRoID0gcGF0aC0+cF9kZXB0aDsKKworCS8qIHplcm8tdHJlZSBoYXMgbm8gbGVhZiBibG9ja3MgYXQgYWxsICovCisJaWYgKGRlcHRoID09IDApCisJCXJldHVybiBFWFRfTUFYX0JMT0NLOworCisJLyogZ28gdG8gaW5kZXggYmxvY2sgKi8KKwlkZXB0aC0tOworCisJd2hpbGUgKGRlcHRoID49IDApIHsKKwkJaWYgKHBhdGhbZGVwdGhdLnBfaWR4ICE9CisJCQkJRVhUX0xBU1RfSU5ERVgocGF0aFtkZXB0aF0ucF9oZHIpKQorCQkgIHJldHVybiBsZTMyX3RvX2NwdShwYXRoW2RlcHRoXS5wX2lkeFsxXS5laV9ibG9jayk7CisJCWRlcHRoLS07CisJfQorCisJcmV0dXJuIEVYVF9NQVhfQkxPQ0s7Cit9CisKKy8qCisgKiBleHQ0X2V4dF9jb3JyZWN0X2luZGV4ZXM6CisgKiBpZiBsZWFmIGdldHMgbW9kaWZpZWQgYW5kIG1vZGlmaWVkIGV4dGVudCBpcyBmaXJzdCBpbiB0aGUgbGVhZiwKKyAqIHRoZW4gd2UgaGF2ZSB0byBjb3JyZWN0IGFsbCBpbmRleGVzIGFib3ZlLgorICogVE9ETzogZG8gd2UgbmVlZCB0byBjb3JyZWN0IHRyZWUgaW4gYWxsIGNhc2VzPworICovCitpbnQgZXh0NF9leHRfY29ycmVjdF9pbmRleGVzKGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBpbm9kZSAqaW5vZGUsCisJCQkJc3RydWN0IGV4dDRfZXh0X3BhdGggKnBhdGgpCit7CisJc3RydWN0IGV4dDRfZXh0ZW50X2hlYWRlciAqZWg7CisJaW50IGRlcHRoID0gZXh0X2RlcHRoKGlub2RlKTsKKwlzdHJ1Y3QgZXh0NF9leHRlbnQgKmV4OworCV9fbGUzMiBib3JkZXI7CisJaW50IGssIGVyciA9IDA7CisKKwllaCA9IHBhdGhbZGVwdGhdLnBfaGRyOworCWV4ID0gcGF0aFtkZXB0aF0ucF9leHQ7CisJQlVHX09OKGV4ID09IE5VTEwpOworCUJVR19PTihlaCA9PSBOVUxMKTsKKworCWlmIChkZXB0aCA9PSAwKSB7CisJCS8qIHRoZXJlIGlzIG5vIHRyZWUgYXQgYWxsICovCisJCXJldHVybiAwOworCX0KKworCWlmIChleCAhPSBFWFRfRklSU1RfRVhURU5UKGVoKSkgeworCQkvKiB3ZSBjb3JyZWN0IHRyZWUgaWYgZmlyc3QgbGVhZiBnb3QgbW9kaWZpZWQgb25seSAqLworCQlyZXR1cm4gMDsKKwl9CisKKwkvKgorCSAqIFRPRE86IHdlIG5lZWQgY29ycmVjdGlvbiBpZiBib3JkZXIgaXMgc21hbGxlciB0aGFuIGN1cnJlbnQgb25lCisJICovCisJayA9IGRlcHRoIC0gMTsKKwlib3JkZXIgPSBwYXRoW2RlcHRoXS5wX2V4dC0+ZWVfYmxvY2s7CisJaWYgKChlcnIgPSBleHQ0X2V4dF9nZXRfYWNjZXNzKGhhbmRsZSwgaW5vZGUsIHBhdGggKyBrKSkpCisJCXJldHVybiBlcnI7CisJcGF0aFtrXS5wX2lkeC0+ZWlfYmxvY2sgPSBib3JkZXI7CisJaWYgKChlcnIgPSBleHQ0X2V4dF9kaXJ0eShoYW5kbGUsIGlub2RlLCBwYXRoICsgaykpKQorCQlyZXR1cm4gZXJyOworCisJd2hpbGUgKGstLSkgeworCQkvKiBjaGFuZ2UgYWxsIGxlZnQtc2lkZSBpbmRleGVzICovCisJCWlmIChwYXRoW2srMV0ucF9pZHggIT0gRVhUX0ZJUlNUX0lOREVYKHBhdGhbaysxXS5wX2hkcikpCisJCQlicmVhazsKKwkJaWYgKChlcnIgPSBleHQ0X2V4dF9nZXRfYWNjZXNzKGhhbmRsZSwgaW5vZGUsIHBhdGggKyBrKSkpCisJCQlicmVhazsKKwkJcGF0aFtrXS5wX2lkeC0+ZWlfYmxvY2sgPSBib3JkZXI7CisJCWlmICgoZXJyID0gZXh0NF9leHRfZGlydHkoaGFuZGxlLCBpbm9kZSwgcGF0aCArIGspKSkKKwkJCWJyZWFrOworCX0KKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgaW5saW5lCitleHQ0X2Nhbl9leHRlbnRzX2JlX21lcmdlZChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZXh0NF9leHRlbnQgKmV4MSwKKwkJCQlzdHJ1Y3QgZXh0NF9leHRlbnQgKmV4MikKK3sKKwlpZiAobGUzMl90b19jcHUoZXgxLT5lZV9ibG9jaykgKyBsZTE2X3RvX2NwdShleDEtPmVlX2xlbikgIT0KKwkJCWxlMzJfdG9fY3B1KGV4Mi0+ZWVfYmxvY2spKQorCQlyZXR1cm4gMDsKKworCS8qCisJICogVG8gYWxsb3cgZnV0dXJlIHN1cHBvcnQgZm9yIHByZWFsbG9jYXRlZCBleHRlbnRzIHRvIGJlIGFkZGVkCisJICogYXMgYW4gUk9fQ09NUEFUIGZlYXR1cmUsIHJlZnVzZSB0byBtZXJnZSB0byBleHRlbnRzIGlmCisJICogdGhpcyBjYW4gcmVzdWx0IGluIHRoZSB0b3AgYml0IG9mIGVlX2xlbiBiZWluZyBzZXQuCisJICovCisJaWYgKGxlMTZfdG9fY3B1KGV4MS0+ZWVfbGVuKSArIGxlMTZfdG9fY3B1KGV4Mi0+ZWVfbGVuKSA+IEVYVF9NQVhfTEVOKQorCQlyZXR1cm4gMDsKKyNpZmRlZiBBR1JFU1NJVkVfVEVTVAorCWlmIChsZTE2X3RvX2NwdShleDEtPmVlX2xlbikgPj0gNCkKKwkJcmV0dXJuIDA7CisjZW5kaWYKKworCWlmIChleHRfcGJsb2NrKGV4MSkgKyBsZTE2X3RvX2NwdShleDEtPmVlX2xlbikgPT0gZXh0X3BibG9jayhleDIpKQorCQlyZXR1cm4gMTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIGV4dDRfZXh0X2luc2VydF9leHRlbnQ6CisgKiB0cmllcyB0byBtZXJnZSByZXF1c3RlZCBleHRlbnQgaW50byB0aGUgZXhpc3RpbmcgZXh0ZW50IG9yCisgKiBpbnNlcnRzIHJlcXVlc3RlZCBleHRlbnQgYXMgbmV3IG9uZSBpbnRvIHRoZSB0cmVlLAorICogY3JlYXRpbmcgbmV3IGxlYWYgaW4gdGhlIG5vLXNwYWNlIGNhc2UuCisgKi8KK2ludCBleHQ0X2V4dF9pbnNlcnRfZXh0ZW50KGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBpbm9kZSAqaW5vZGUsCisJCQkJc3RydWN0IGV4dDRfZXh0X3BhdGggKnBhdGgsCisJCQkJc3RydWN0IGV4dDRfZXh0ZW50ICpuZXdleHQpCit7CisJc3RydWN0IGV4dDRfZXh0ZW50X2hlYWRlciAqIGVoOworCXN0cnVjdCBleHQ0X2V4dGVudCAqZXgsICpmZXg7CisJc3RydWN0IGV4dDRfZXh0ZW50ICpuZWFyZXg7IC8qIG5lYXJlc3QgZXh0ZW50ICovCisJc3RydWN0IGV4dDRfZXh0X3BhdGggKm5wYXRoID0gTlVMTDsKKwlpbnQgZGVwdGgsIGxlbiwgZXJyLCBuZXh0OworCisJQlVHX09OKG5ld2V4dC0+ZWVfbGVuID09IDApOworCWRlcHRoID0gZXh0X2RlcHRoKGlub2RlKTsKKwlleCA9IHBhdGhbZGVwdGhdLnBfZXh0OworCUJVR19PTihwYXRoW2RlcHRoXS5wX2hkciA9PSBOVUxMKTsKKworCS8qIHRyeSB0byBpbnNlcnQgYmxvY2sgaW50byBmb3VuZCBleHRlbnQgYW5kIHJldHVybiAqLworCWlmIChleCAmJiBleHQ0X2Nhbl9leHRlbnRzX2JlX21lcmdlZChpbm9kZSwgZXgsIG5ld2V4dCkpIHsKKwkJZXh0X2RlYnVnKCJhcHBlbmQgJWQgYmxvY2sgdG8gJWQ6JWQgKGZyb20gJWxsdSlcbiIsCisJCQkJbGUxNl90b19jcHUobmV3ZXh0LT5lZV9sZW4pLAorCQkJCWxlMzJfdG9fY3B1KGV4LT5lZV9ibG9jayksCisJCQkJbGUxNl90b19jcHUoZXgtPmVlX2xlbiksIGV4dF9wYmxvY2soZXgpKTsKKwkJaWYgKChlcnIgPSBleHQ0X2V4dF9nZXRfYWNjZXNzKGhhbmRsZSwgaW5vZGUsIHBhdGggKyBkZXB0aCkpKQorCQkJcmV0dXJuIGVycjsKKwkJZXgtPmVlX2xlbiA9IGNwdV90b19sZTE2KGxlMTZfdG9fY3B1KGV4LT5lZV9sZW4pCisJCQkJCSArIGxlMTZfdG9fY3B1KG5ld2V4dC0+ZWVfbGVuKSk7CisJCWVoID0gcGF0aFtkZXB0aF0ucF9oZHI7CisJCW5lYXJleCA9IGV4OworCQlnb3RvIG1lcmdlOworCX0KKworcmVwZWF0OgorCWRlcHRoID0gZXh0X2RlcHRoKGlub2RlKTsKKwllaCA9IHBhdGhbZGVwdGhdLnBfaGRyOworCWlmIChsZTE2X3RvX2NwdShlaC0+ZWhfZW50cmllcykgPCBsZTE2X3RvX2NwdShlaC0+ZWhfbWF4KSkKKwkJZ290byBoYXNfc3BhY2U7CisKKwkvKiBwcm9iYWJseSBuZXh0IGxlYWYgaGFzIHNwYWNlIGZvciB1cz8gKi8KKwlmZXggPSBFWFRfTEFTVF9FWFRFTlQoZWgpOworCW5leHQgPSBleHQ0X2V4dF9uZXh0X2xlYWZfYmxvY2soaW5vZGUsIHBhdGgpOworCWlmIChsZTMyX3RvX2NwdShuZXdleHQtPmVlX2Jsb2NrKSA+IGxlMzJfdG9fY3B1KGZleC0+ZWVfYmxvY2spCisJICAgICYmIG5leHQgIT0gRVhUX01BWF9CTE9DSykgeworCQlleHRfZGVidWcoIm5leHQgbGVhZiBibG9jayAtICVkXG4iLCBuZXh0KTsKKwkJQlVHX09OKG5wYXRoICE9IE5VTEwpOworCQlucGF0aCA9IGV4dDRfZXh0X2ZpbmRfZXh0ZW50KGlub2RlLCBuZXh0LCBOVUxMKTsKKwkJaWYgKElTX0VSUihucGF0aCkpCisJCQlyZXR1cm4gUFRSX0VSUihucGF0aCk7CisJCUJVR19PTihucGF0aC0+cF9kZXB0aCAhPSBwYXRoLT5wX2RlcHRoKTsKKwkJZWggPSBucGF0aFtkZXB0aF0ucF9oZHI7CisJCWlmIChsZTE2X3RvX2NwdShlaC0+ZWhfZW50cmllcykgPCBsZTE2X3RvX2NwdShlaC0+ZWhfbWF4KSkgeworCQkJZXh0X2RlYnVnKCJuZXh0IGxlYWYgaXNudCBmdWxsKCVkKVxuIiwKKwkJCQkgIGxlMTZfdG9fY3B1KGVoLT5laF9lbnRyaWVzKSk7CisJCQlwYXRoID0gbnBhdGg7CisJCQlnb3RvIHJlcGVhdDsKKwkJfQorCQlleHRfZGVidWcoIm5leHQgbGVhZiBoYXMgbm8gZnJlZSBzcGFjZSglZCwlZClcbiIsCisJCQkgIGxlMTZfdG9fY3B1KGVoLT5laF9lbnRyaWVzKSwgbGUxNl90b19jcHUoZWgtPmVoX21heCkpOworCX0KKworCS8qCisJICogVGhlcmUgaXMgbm8gZnJlZSBzcGFjZSBpbiB0aGUgZm91bmQgbGVhZi4KKwkgKiBXZSdyZSBnb25uYSBhZGQgYSBuZXcgbGVhZiBpbiB0aGUgdHJlZS4KKwkgKi8KKwllcnIgPSBleHQ0X2V4dF9jcmVhdGVfbmV3X2xlYWYoaGFuZGxlLCBpbm9kZSwgcGF0aCwgbmV3ZXh0KTsKKwlpZiAoZXJyKQorCQlnb3RvIGNsZWFudXA7CisJZGVwdGggPSBleHRfZGVwdGgoaW5vZGUpOworCWVoID0gcGF0aFtkZXB0aF0ucF9oZHI7CisKK2hhc19zcGFjZToKKwluZWFyZXggPSBwYXRoW2RlcHRoXS5wX2V4dDsKKworCWlmICgoZXJyID0gZXh0NF9leHRfZ2V0X2FjY2VzcyhoYW5kbGUsIGlub2RlLCBwYXRoICsgZGVwdGgpKSkKKwkJZ290byBjbGVhbnVwOworCisJaWYgKCFuZWFyZXgpIHsKKwkJLyogdGhlcmUgaXMgbm8gZXh0ZW50IGluIHRoaXMgbGVhZiwgY3JlYXRlIGZpcnN0IG9uZSAqLworCQlleHRfZGVidWcoImZpcnN0IGV4dGVudCBpbiB0aGUgbGVhZjogJWQ6JWxsdTolZFxuIiwKKwkJCSAgICAgICAgbGUzMl90b19jcHUobmV3ZXh0LT5lZV9ibG9jayksCisJCQkgICAgICAgIGV4dF9wYmxvY2sobmV3ZXh0KSwKKwkJCSAgICAgICAgbGUxNl90b19jcHUobmV3ZXh0LT5lZV9sZW4pKTsKKwkJcGF0aFtkZXB0aF0ucF9leHQgPSBFWFRfRklSU1RfRVhURU5UKGVoKTsKKwl9IGVsc2UgaWYgKGxlMzJfdG9fY3B1KG5ld2V4dC0+ZWVfYmxvY2spCisJCSAgICAgICAgICAgPiBsZTMyX3RvX2NwdShuZWFyZXgtPmVlX2Jsb2NrKSkgeworLyoJCUJVR19PTihuZXdleHQtPmVlX2Jsb2NrID09IG5lYXJleC0+ZWVfYmxvY2spOyAqLworCQlpZiAobmVhcmV4ICE9IEVYVF9MQVNUX0VYVEVOVChlaCkpIHsKKwkJCWxlbiA9IEVYVF9NQVhfRVhURU5UKGVoKSAtIG5lYXJleDsKKwkJCWxlbiA9IChsZW4gLSAxKSAqIHNpemVvZihzdHJ1Y3QgZXh0NF9leHRlbnQpOworCQkJbGVuID0gbGVuIDwgMCA/IDAgOiBsZW47CisJCQlleHRfZGVidWcoImluc2VydCAlZDolbGx1OiVkIGFmdGVyOiBuZWFyZXN0IDB4JXAsICIKKwkJCQkJIm1vdmUgJWQgZnJvbSAweCVwIHRvIDB4JXBcbiIsCisJCQkJICAgICAgICBsZTMyX3RvX2NwdShuZXdleHQtPmVlX2Jsb2NrKSwKKwkJCQkgICAgICAgIGV4dF9wYmxvY2sobmV3ZXh0KSwKKwkJCQkgICAgICAgIGxlMTZfdG9fY3B1KG5ld2V4dC0+ZWVfbGVuKSwKKwkJCQkJbmVhcmV4LCBsZW4sIG5lYXJleCArIDEsIG5lYXJleCArIDIpOworCQkJbWVtbW92ZShuZWFyZXggKyAyLCBuZWFyZXggKyAxLCBsZW4pOworCQl9CisJCXBhdGhbZGVwdGhdLnBfZXh0ID0gbmVhcmV4ICsgMTsKKwl9IGVsc2UgeworCQlCVUdfT04obmV3ZXh0LT5lZV9ibG9jayA9PSBuZWFyZXgtPmVlX2Jsb2NrKTsKKwkJbGVuID0gKEVYVF9NQVhfRVhURU5UKGVoKSAtIG5lYXJleCkgKiBzaXplb2Yoc3RydWN0IGV4dDRfZXh0ZW50KTsKKwkJbGVuID0gbGVuIDwgMCA/IDAgOiBsZW47CisJCWV4dF9kZWJ1ZygiaW5zZXJ0ICVkOiVsbHU6JWQgYmVmb3JlOiBuZWFyZXN0IDB4JXAsICIKKwkJCQkibW92ZSAlZCBmcm9tIDB4JXAgdG8gMHglcFxuIiwKKwkJCQlsZTMyX3RvX2NwdShuZXdleHQtPmVlX2Jsb2NrKSwKKwkJCQlleHRfcGJsb2NrKG5ld2V4dCksCisJCQkJbGUxNl90b19jcHUobmV3ZXh0LT5lZV9sZW4pLAorCQkJCW5lYXJleCwgbGVuLCBuZWFyZXggKyAxLCBuZWFyZXggKyAyKTsKKwkJbWVtbW92ZShuZWFyZXggKyAxLCBuZWFyZXgsIGxlbik7CisJCXBhdGhbZGVwdGhdLnBfZXh0ID0gbmVhcmV4OworCX0KKworCWVoLT5laF9lbnRyaWVzID0gY3B1X3RvX2xlMTYobGUxNl90b19jcHUoZWgtPmVoX2VudHJpZXMpKzEpOworCW5lYXJleCA9IHBhdGhbZGVwdGhdLnBfZXh0OworCW5lYXJleC0+ZWVfYmxvY2sgPSBuZXdleHQtPmVlX2Jsb2NrOworCW5lYXJleC0+ZWVfc3RhcnQgPSBuZXdleHQtPmVlX3N0YXJ0OworCW5lYXJleC0+ZWVfc3RhcnRfaGkgPSBuZXdleHQtPmVlX3N0YXJ0X2hpOworCW5lYXJleC0+ZWVfbGVuID0gbmV3ZXh0LT5lZV9sZW47CisKK21lcmdlOgorCS8qIHRyeSB0byBtZXJnZSBleHRlbnRzIHRvIHRoZSByaWdodCAqLworCXdoaWxlIChuZWFyZXggPCBFWFRfTEFTVF9FWFRFTlQoZWgpKSB7CisJCWlmICghZXh0NF9jYW5fZXh0ZW50c19iZV9tZXJnZWQoaW5vZGUsIG5lYXJleCwgbmVhcmV4ICsgMSkpCisJCQlicmVhazsKKwkJLyogbWVyZ2Ugd2l0aCBuZXh0IGV4dGVudCEgKi8KKwkJbmVhcmV4LT5lZV9sZW4gPSBjcHVfdG9fbGUxNihsZTE2X3RvX2NwdShuZWFyZXgtPmVlX2xlbikKKwkJCQkJICAgICArIGxlMTZfdG9fY3B1KG5lYXJleFsxXS5lZV9sZW4pKTsKKwkJaWYgKG5lYXJleCArIDEgPCBFWFRfTEFTVF9FWFRFTlQoZWgpKSB7CisJCQlsZW4gPSAoRVhUX0xBU1RfRVhURU5UKGVoKSAtIG5lYXJleCAtIDEpCisJCQkJCSogc2l6ZW9mKHN0cnVjdCBleHQ0X2V4dGVudCk7CisJCQltZW1tb3ZlKG5lYXJleCArIDEsIG5lYXJleCArIDIsIGxlbik7CisJCX0KKwkJZWgtPmVoX2VudHJpZXMgPSBjcHVfdG9fbGUxNihsZTE2X3RvX2NwdShlaC0+ZWhfZW50cmllcyktMSk7CisJCUJVR19PTihlaC0+ZWhfZW50cmllcyA9PSAwKTsKKwl9CisKKwkvKiB0cnkgdG8gbWVyZ2UgZXh0ZW50cyB0byB0aGUgbGVmdCAqLworCisJLyogdGltZSB0byBjb3JyZWN0IGFsbCBpbmRleGVzIGFib3ZlICovCisJZXJyID0gZXh0NF9leHRfY29ycmVjdF9pbmRleGVzKGhhbmRsZSwgaW5vZGUsIHBhdGgpOworCWlmIChlcnIpCisJCWdvdG8gY2xlYW51cDsKKworCWVyciA9IGV4dDRfZXh0X2RpcnR5KGhhbmRsZSwgaW5vZGUsIHBhdGggKyBkZXB0aCk7CisKK2NsZWFudXA6CisJaWYgKG5wYXRoKSB7CisJCWV4dDRfZXh0X2Ryb3BfcmVmcyhucGF0aCk7CisJCWtmcmVlKG5wYXRoKTsKKwl9CisJZXh0NF9leHRfdHJlZV9jaGFuZ2VkKGlub2RlKTsKKwlleHQ0X2V4dF9pbnZhbGlkYXRlX2NhY2hlKGlub2RlKTsKKwlyZXR1cm4gZXJyOworfQorCitpbnQgZXh0NF9leHRfd2Fsa19zcGFjZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCB1bnNpZ25lZCBsb25nIGJsb2NrLAorCQkJdW5zaWduZWQgbG9uZyBudW0sIGV4dF9wcmVwYXJlX2NhbGxiYWNrIGZ1bmMsCisJCQl2b2lkICpjYmRhdGEpCit7CisJc3RydWN0IGV4dDRfZXh0X3BhdGggKnBhdGggPSBOVUxMOworCXN0cnVjdCBleHQ0X2V4dF9jYWNoZSBjYmV4OworCXN0cnVjdCBleHQ0X2V4dGVudCAqZXg7CisJdW5zaWduZWQgbG9uZyBuZXh0LCBzdGFydCA9IDAsIGVuZCA9IDA7CisJdW5zaWduZWQgbG9uZyBsYXN0ID0gYmxvY2sgKyBudW07CisJaW50IGRlcHRoLCBleGlzdHMsIGVyciA9IDA7CisKKwlCVUdfT04oZnVuYyA9PSBOVUxMKTsKKwlCVUdfT04oaW5vZGUgPT0gTlVMTCk7CisKKwl3aGlsZSAoYmxvY2sgPCBsYXN0ICYmIGJsb2NrICE9IEVYVF9NQVhfQkxPQ0spIHsKKwkJbnVtID0gbGFzdCAtIGJsb2NrOworCQkvKiBmaW5kIGV4dGVudCBmb3IgdGhpcyBibG9jayAqLworCQlwYXRoID0gZXh0NF9leHRfZmluZF9leHRlbnQoaW5vZGUsIGJsb2NrLCBwYXRoKTsKKwkJaWYgKElTX0VSUihwYXRoKSkgeworCQkJZXJyID0gUFRSX0VSUihwYXRoKTsKKwkJCXBhdGggPSBOVUxMOworCQkJYnJlYWs7CisJCX0KKworCQlkZXB0aCA9IGV4dF9kZXB0aChpbm9kZSk7CisJCUJVR19PTihwYXRoW2RlcHRoXS5wX2hkciA9PSBOVUxMKTsKKwkJZXggPSBwYXRoW2RlcHRoXS5wX2V4dDsKKwkJbmV4dCA9IGV4dDRfZXh0X25leHRfYWxsb2NhdGVkX2Jsb2NrKHBhdGgpOworCisJCWV4aXN0cyA9IDA7CisJCWlmICghZXgpIHsKKwkJCS8qIHRoZXJlIGlzIG5vIGV4dGVudCB5ZXQsIHNvIHRyeSB0byBhbGxvY2F0ZQorCQkJICogYWxsIHJlcXVlc3RlZCBzcGFjZSAqLworCQkJc3RhcnQgPSBibG9jazsKKwkJCWVuZCA9IGJsb2NrICsgbnVtOworCQl9IGVsc2UgaWYgKGxlMzJfdG9fY3B1KGV4LT5lZV9ibG9jaykgPiBibG9jaykgeworCQkJLyogbmVlZCB0byBhbGxvY2F0ZSBzcGFjZSBiZWZvcmUgZm91bmQgZXh0ZW50ICovCisJCQlzdGFydCA9IGJsb2NrOworCQkJZW5kID0gbGUzMl90b19jcHUoZXgtPmVlX2Jsb2NrKTsKKwkJCWlmIChibG9jayArIG51bSA8IGVuZCkKKwkJCQllbmQgPSBibG9jayArIG51bTsKKwkJfSBlbHNlIGlmIChibG9jayA+PQorCQkJICAgICBsZTMyX3RvX2NwdShleC0+ZWVfYmxvY2spICsgbGUxNl90b19jcHUoZXgtPmVlX2xlbikpIHsKKwkJCS8qIG5lZWQgdG8gYWxsb2NhdGUgc3BhY2UgYWZ0ZXIgZm91bmQgZXh0ZW50ICovCisJCQlzdGFydCA9IGJsb2NrOworCQkJZW5kID0gYmxvY2sgKyBudW07CisJCQlpZiAoZW5kID49IG5leHQpCisJCQkJZW5kID0gbmV4dDsKKwkJfSBlbHNlIGlmIChibG9jayA+PSBsZTMyX3RvX2NwdShleC0+ZWVfYmxvY2spKSB7CisJCQkvKgorCQkJICogc29tZSBwYXJ0IG9mIHJlcXVlc3RlZCBzcGFjZSBpcyBjb3ZlcmVkCisJCQkgKiBieSBmb3VuZCBleHRlbnQKKwkJCSAqLworCQkJc3RhcnQgPSBibG9jazsKKwkJCWVuZCA9IGxlMzJfdG9fY3B1KGV4LT5lZV9ibG9jaykgKyBsZTE2X3RvX2NwdShleC0+ZWVfbGVuKTsKKwkJCWlmIChibG9jayArIG51bSA8IGVuZCkKKwkJCQllbmQgPSBibG9jayArIG51bTsKKwkJCWV4aXN0cyA9IDE7CisJCX0gZWxzZSB7CisJCQlCVUcoKTsKKwkJfQorCQlCVUdfT04oZW5kIDw9IHN0YXJ0KTsKKworCQlpZiAoIWV4aXN0cykgeworCQkJY2JleC5lY19ibG9jayA9IHN0YXJ0OworCQkJY2JleC5lY19sZW4gPSBlbmQgLSBzdGFydDsKKwkJCWNiZXguZWNfc3RhcnQgPSAwOworCQkJY2JleC5lY190eXBlID0gRVhUNF9FWFRfQ0FDSEVfR0FQOworCQl9IGVsc2UgeworCQkgICAgICAgIGNiZXguZWNfYmxvY2sgPSBsZTMyX3RvX2NwdShleC0+ZWVfYmxvY2spOworCQkgICAgICAgIGNiZXguZWNfbGVuID0gbGUxNl90b19jcHUoZXgtPmVlX2xlbik7CisJCSAgICAgICAgY2JleC5lY19zdGFydCA9IGV4dF9wYmxvY2soZXgpOworCQkJY2JleC5lY190eXBlID0gRVhUNF9FWFRfQ0FDSEVfRVhURU5UOworCQl9CisKKwkJQlVHX09OKGNiZXguZWNfbGVuID09IDApOworCQllcnIgPSBmdW5jKGlub2RlLCBwYXRoLCAmY2JleCwgY2JkYXRhKTsKKwkJZXh0NF9leHRfZHJvcF9yZWZzKHBhdGgpOworCisJCWlmIChlcnIgPCAwKQorCQkJYnJlYWs7CisJCWlmIChlcnIgPT0gRVhUX1JFUEVBVCkKKwkJCWNvbnRpbnVlOworCQllbHNlIGlmIChlcnIgPT0gRVhUX0JSRUFLKSB7CisJCQllcnIgPSAwOworCQkJYnJlYWs7CisJCX0KKworCQlpZiAoZXh0X2RlcHRoKGlub2RlKSAhPSBkZXB0aCkgeworCQkJLyogZGVwdGggd2FzIGNoYW5nZWQuIHdlIGhhdmUgdG8gcmVhbGxvYyBwYXRoICovCisJCQlrZnJlZShwYXRoKTsKKwkJCXBhdGggPSBOVUxMOworCQl9CisKKwkJYmxvY2sgPSBjYmV4LmVjX2Jsb2NrICsgY2JleC5lY19sZW47CisJfQorCisJaWYgKHBhdGgpIHsKKwkJZXh0NF9leHRfZHJvcF9yZWZzKHBhdGgpOworCQlrZnJlZShwYXRoKTsKKwl9CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQKK2V4dDRfZXh0X3B1dF9pbl9jYWNoZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBfX3UzMiBibG9jaywKKwkJCV9fdTMyIGxlbiwgX191MzIgc3RhcnQsIGludCB0eXBlKQoreworCXN0cnVjdCBleHQ0X2V4dF9jYWNoZSAqY2V4OworCUJVR19PTihsZW4gPT0gMCk7CisJY2V4ID0gJkVYVDRfSShpbm9kZSktPmlfY2FjaGVkX2V4dGVudDsKKwljZXgtPmVjX3R5cGUgPSB0eXBlOworCWNleC0+ZWNfYmxvY2sgPSBibG9jazsKKwljZXgtPmVjX2xlbiA9IGxlbjsKKwljZXgtPmVjX3N0YXJ0ID0gc3RhcnQ7Cit9CisKKy8qCisgKiBleHQ0X2V4dF9wdXRfZ2FwX2luX2NhY2hlOgorICogY2FsY3VsYXRlIGJvdW5kYXJpZXMgb2YgdGhlIGdhcCB0aGF0IHRoZSByZXF1ZXN0ZWQgYmxvY2sgZml0cyBpbnRvCisgKiBhbmQgY2FjaGUgdGhpcyBnYXAKKyAqLworc3RhdGljIGlubGluZSB2b2lkCitleHQ0X2V4dF9wdXRfZ2FwX2luX2NhY2hlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBleHQ0X2V4dF9wYXRoICpwYXRoLAorCQkJCXVuc2lnbmVkIGxvbmcgYmxvY2spCit7CisJaW50IGRlcHRoID0gZXh0X2RlcHRoKGlub2RlKTsKKwl1bnNpZ25lZCBsb25nIGxibG9jaywgbGVuOworCXN0cnVjdCBleHQ0X2V4dGVudCAqZXg7CisKKwlleCA9IHBhdGhbZGVwdGhdLnBfZXh0OworCWlmIChleCA9PSBOVUxMKSB7CisJCS8qIHRoZXJlIGlzIG5vIGV4dGVudCB5ZXQsIHNvIGdhcCBpcyBbMDstXSAqLworCQlsYmxvY2sgPSAwOworCQlsZW4gPSBFWFRfTUFYX0JMT0NLOworCQlleHRfZGVidWcoImNhY2hlIGdhcCh3aG9sZSBmaWxlKToiKTsKKwl9IGVsc2UgaWYgKGJsb2NrIDwgbGUzMl90b19jcHUoZXgtPmVlX2Jsb2NrKSkgeworCQlsYmxvY2sgPSBibG9jazsKKwkJbGVuID0gbGUzMl90b19jcHUoZXgtPmVlX2Jsb2NrKSAtIGJsb2NrOworCQlleHRfZGVidWcoImNhY2hlIGdhcChiZWZvcmUpOiAlbHUgWyVsdTolbHVdIiwKKwkJCQkodW5zaWduZWQgbG9uZykgYmxvY2ssCisJCQkgICAgICAgICh1bnNpZ25lZCBsb25nKSBsZTMyX3RvX2NwdShleC0+ZWVfYmxvY2spLAorCQkJICAgICAgICAodW5zaWduZWQgbG9uZykgbGUxNl90b19jcHUoZXgtPmVlX2xlbikpOworCX0gZWxzZSBpZiAoYmxvY2sgPj0gbGUzMl90b19jcHUoZXgtPmVlX2Jsb2NrKQorCQkgICAgICAgICAgICArIGxlMTZfdG9fY3B1KGV4LT5lZV9sZW4pKSB7CisJICAgICAgICBsYmxvY2sgPSBsZTMyX3RvX2NwdShleC0+ZWVfYmxvY2spCisJCSAgICAgICAgICsgbGUxNl90b19jcHUoZXgtPmVlX2xlbik7CisJCWxlbiA9IGV4dDRfZXh0X25leHRfYWxsb2NhdGVkX2Jsb2NrKHBhdGgpOworCQlleHRfZGVidWcoImNhY2hlIGdhcChhZnRlcik6IFslbHU6JWx1XSAlbHUiLAorCQkJICAgICAgICAodW5zaWduZWQgbG9uZykgbGUzMl90b19jcHUoZXgtPmVlX2Jsb2NrKSwKKwkJCSAgICAgICAgKHVuc2lnbmVkIGxvbmcpIGxlMTZfdG9fY3B1KGV4LT5lZV9sZW4pLAorCQkJCSh1bnNpZ25lZCBsb25nKSBibG9jayk7CisJCUJVR19PTihsZW4gPT0gbGJsb2NrKTsKKwkJbGVuID0gbGVuIC0gbGJsb2NrOworCX0gZWxzZSB7CisJCWxibG9jayA9IGxlbiA9IDA7CisJCUJVRygpOworCX0KKworCWV4dF9kZWJ1ZygiIC0+ICVsdTolbHVcbiIsICh1bnNpZ25lZCBsb25nKSBsYmxvY2ssIGxlbik7CisJZXh0NF9leHRfcHV0X2luX2NhY2hlKGlub2RlLCBsYmxvY2ssIGxlbiwgMCwgRVhUNF9FWFRfQ0FDSEVfR0FQKTsKK30KKworc3RhdGljIGlubGluZSBpbnQKK2V4dDRfZXh0X2luX2NhY2hlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHVuc2lnbmVkIGxvbmcgYmxvY2ssCisJCQlzdHJ1Y3QgZXh0NF9leHRlbnQgKmV4KQoreworCXN0cnVjdCBleHQ0X2V4dF9jYWNoZSAqY2V4OworCisJY2V4ID0gJkVYVDRfSShpbm9kZSktPmlfY2FjaGVkX2V4dGVudDsKKworCS8qIGhhcyBjYWNoZSB2YWxpZCBkYXRhPyAqLworCWlmIChjZXgtPmVjX3R5cGUgPT0gRVhUNF9FWFRfQ0FDSEVfTk8pCisJCXJldHVybiBFWFQ0X0VYVF9DQUNIRV9OTzsKKworCUJVR19PTihjZXgtPmVjX3R5cGUgIT0gRVhUNF9FWFRfQ0FDSEVfR0FQICYmCisJCQljZXgtPmVjX3R5cGUgIT0gRVhUNF9FWFRfQ0FDSEVfRVhURU5UKTsKKwlpZiAoYmxvY2sgPj0gY2V4LT5lY19ibG9jayAmJiBibG9jayA8IGNleC0+ZWNfYmxvY2sgKyBjZXgtPmVjX2xlbikgeworCSAgICAgICAgZXgtPmVlX2Jsb2NrID0gY3B1X3RvX2xlMzIoY2V4LT5lY19ibG9jayk7CisJCWV4dDRfZXh0X3N0b3JlX3BibG9jayhleCwgY2V4LT5lY19zdGFydCk7CisJICAgICAgICBleC0+ZWVfbGVuID0gY3B1X3RvX2xlMTYoY2V4LT5lY19sZW4pOworCQlleHRfZGVidWcoIiVsdSBjYWNoZWQgYnkgJWx1OiVsdTolbGx1XG4iLAorCQkJCSh1bnNpZ25lZCBsb25nKSBibG9jaywKKwkJCQkodW5zaWduZWQgbG9uZykgY2V4LT5lY19ibG9jaywKKwkJCQkodW5zaWduZWQgbG9uZykgY2V4LT5lY19sZW4sCisJCQkJY2V4LT5lY19zdGFydCk7CisJCXJldHVybiBjZXgtPmVjX3R5cGU7CisJfQorCisJLyogbm90IGluIGNhY2hlICovCisJcmV0dXJuIEVYVDRfRVhUX0NBQ0hFX05POworfQorCisvKgorICogZXh0NF9leHRfcm1faWR4OgorICogcmVtb3ZlcyBpbmRleCBmcm9tIHRoZSBpbmRleCBibG9jay4KKyAqIEl0J3MgdXNlZCBpbiB0cnVuY2F0ZSBjYXNlIG9ubHksIHRodXMgYWxsIHJlcXVlc3RzIGFyZSBmb3IKKyAqIGxhc3QgaW5kZXggaW4gdGhlIGJsb2NrIG9ubHkuCisgKi8KK2ludCBleHQ0X2V4dF9ybV9pZHgoaGFuZGxlX3QgKmhhbmRsZSwgc3RydWN0IGlub2RlICppbm9kZSwKKwkJCXN0cnVjdCBleHQ0X2V4dF9wYXRoICpwYXRoKQoreworCXN0cnVjdCBidWZmZXJfaGVhZCAqYmg7CisJaW50IGVycjsKKwlleHQ0X2ZzYmxrX3QgbGVhZjsKKworCS8qIGZyZWUgaW5kZXggYmxvY2sgKi8KKwlwYXRoLS07CisJbGVhZiA9IGlkeF9wYmxvY2socGF0aC0+cF9pZHgpOworCUJVR19PTihwYXRoLT5wX2hkci0+ZWhfZW50cmllcyA9PSAwKTsKKwlpZiAoKGVyciA9IGV4dDRfZXh0X2dldF9hY2Nlc3MoaGFuZGxlLCBpbm9kZSwgcGF0aCkpKQorCQlyZXR1cm4gZXJyOworCXBhdGgtPnBfaGRyLT5laF9lbnRyaWVzID0gY3B1X3RvX2xlMTYobGUxNl90b19jcHUocGF0aC0+cF9oZHItPmVoX2VudHJpZXMpLTEpOworCWlmICgoZXJyID0gZXh0NF9leHRfZGlydHkoaGFuZGxlLCBpbm9kZSwgcGF0aCkpKQorCQlyZXR1cm4gZXJyOworCWV4dF9kZWJ1ZygiaW5kZXggaXMgZW1wdHksIHJlbW92ZSBpdCwgZnJlZSBibG9jayAlbGx1XG4iLCBsZWFmKTsKKwliaCA9IHNiX2ZpbmRfZ2V0X2Jsb2NrKGlub2RlLT5pX3NiLCBsZWFmKTsKKwlleHQ0X2ZvcmdldChoYW5kbGUsIDEsIGlub2RlLCBiaCwgbGVhZik7CisJZXh0NF9mcmVlX2Jsb2NrcyhoYW5kbGUsIGlub2RlLCBsZWFmLCAxKTsKKwlyZXR1cm4gZXJyOworfQorCisvKgorICogZXh0NF9leHRfY2FsY19jcmVkaXRzX2Zvcl9pbnNlcnQ6CisgKiBUaGlzIHJvdXRpbmUgcmV0dXJucyBtYXguIGNyZWRpdHMgdGhhdCB0aGUgZXh0ZW50IHRyZWUgY2FuIGNvbnN1bWUuCisgKiBJdCBzaG91bGQgYmUgT0sgZm9yIGxvdy1wZXJmb3JtYW5jZSBwYXRocyBsaWtlIC0+d3JpdGVwYWdlKCkKKyAqIFRvIGFsbG93IG1hbnkgd3JpdGluZyBwcm9jZXNzZXMgdG8gZml0IGludG8gYSBzaW5nbGUgdHJhbnNhY3Rpb24sCisgKiB0aGUgY2FsbGVyIHNob3VsZCBjYWxjdWxhdGUgY3JlZGl0cyB1bmRlciB0cnVuY2F0ZV9tdXRleCBhbmQKKyAqIHBhc3MgdGhlIGFjdHVhbCBwYXRoLgorICovCitpbnQgaW5saW5lIGV4dDRfZXh0X2NhbGNfY3JlZGl0c19mb3JfaW5zZXJ0KHN0cnVjdCBpbm9kZSAqaW5vZGUsCisJCQkJCQlzdHJ1Y3QgZXh0NF9leHRfcGF0aCAqcGF0aCkKK3sKKwlpbnQgZGVwdGgsIG5lZWRlZDsKKworCWlmIChwYXRoKSB7CisJCS8qIHByb2JhYmx5IHRoZXJlIGlzIHNwYWNlIGluIGxlYWY/ICovCisJCWRlcHRoID0gZXh0X2RlcHRoKGlub2RlKTsKKwkJaWYgKGxlMTZfdG9fY3B1KHBhdGhbZGVwdGhdLnBfaGRyLT5laF9lbnRyaWVzKQorCQkJCTwgbGUxNl90b19jcHUocGF0aFtkZXB0aF0ucF9oZHItPmVoX21heCkpCisJCQlyZXR1cm4gMTsKKwl9CisKKwkvKgorCSAqIGdpdmVuIDMyLWJpdCBsb2dpY2FsIGJsb2NrICg0Mjk0OTY3Mjk2IGJsb2NrcyksIG1heC4gdHJlZQorCSAqIGNhbiBiZSA0IGxldmVscyBpbiBkZXB0aCAtLSA0ICogMzQwXjQgPT0gNTM0NTM0NDAwMDAuCisJICogTGV0J3MgYWxzbyBhZGQgb25lIG1vcmUgbGV2ZWwgZm9yIGltYmFsYW5jZS4KKwkgKi8KKwlkZXB0aCA9IDU7CisKKwkvKiBhbGxvY2F0aW9uIG9mIG5ldyBkYXRhIGJsb2NrKHMpICovCisJbmVlZGVkID0gMjsKKworCS8qCisJICogdHJlZSBjYW4gYmUgZnVsbCwgc28gaXQgd291bGQgbmVlZCB0byBncm93IGluIGRlcHRoOgorCSAqIGFsbG9jYXRpb24gKyBvbGQgcm9vdCArIG5ldyByb290CisJICovCisJbmVlZGVkICs9IDIgKyAxICsgMTsKKworCS8qCisJICogSW5kZXggc3BsaXQgY2FuIGhhcHBlbiwgd2Ugd291bGQgbmVlZDoKKwkgKiAgICBhbGxvY2F0ZSBpbnRlcm1lZGlhdGUgaW5kZXhlcyAoYml0bWFwICsgZ3JvdXApCisJICogICsgY2hhbmdlIHR3byBibG9ja3MgYXQgZWFjaCBsZXZlbCwgYnV0IHJvb3QgKGFscmVhZHkgaW5jbHVkZWQpCisJICovCisJbmVlZGVkID0gKGRlcHRoICogMikgKyAoZGVwdGggKiAyKTsKKworCS8qIGFueSBhbGxvY2F0aW9uIG1vZGlmaWVzIHN1cGVyYmxvY2sgKi8KKwluZWVkZWQgKz0gMTsKKworCXJldHVybiBuZWVkZWQ7Cit9CisKK3N0YXRpYyBpbnQgZXh0NF9yZW1vdmVfYmxvY2tzKGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBpbm9kZSAqaW5vZGUsCisJCQkJc3RydWN0IGV4dDRfZXh0ZW50ICpleCwKKwkJCQl1bnNpZ25lZCBsb25nIGZyb20sIHVuc2lnbmVkIGxvbmcgdG8pCit7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaDsKKwlpbnQgaTsKKworI2lmZGVmIEVYVEVOVFNfU1RBVFMKKwl7CisJCXN0cnVjdCBleHQ0X3NiX2luZm8gKnNiaSA9IEVYVDRfU0IoaW5vZGUtPmlfc2IpOworCQl1bnNpZ25lZCBzaG9ydCBlZV9sZW4gPSAgbGUxNl90b19jcHUoZXgtPmVlX2xlbik7CisJCXNwaW5fbG9jaygmc2JpLT5zX2V4dF9zdGF0c19sb2NrKTsKKwkJc2JpLT5zX2V4dF9ibG9ja3MgKz0gZWVfbGVuOworCQlzYmktPnNfZXh0X2V4dGVudHMrKzsKKwkJaWYgKGVlX2xlbiA8IHNiaS0+c19leHRfbWluKQorCQkJc2JpLT5zX2V4dF9taW4gPSBlZV9sZW47CisJCWlmIChlZV9sZW4gPiBzYmktPnNfZXh0X21heCkKKwkJCXNiaS0+c19leHRfbWF4ID0gZWVfbGVuOworCQlpZiAoZXh0X2RlcHRoKGlub2RlKSA+IHNiaS0+c19kZXB0aF9tYXgpCisJCQlzYmktPnNfZGVwdGhfbWF4ID0gZXh0X2RlcHRoKGlub2RlKTsKKwkJc3Bpbl91bmxvY2soJnNiaS0+c19leHRfc3RhdHNfbG9jayk7CisJfQorI2VuZGlmCisJaWYgKGZyb20gPj0gbGUzMl90b19jcHUoZXgtPmVlX2Jsb2NrKQorCSAgICAmJiB0byA9PSBsZTMyX3RvX2NwdShleC0+ZWVfYmxvY2spICsgbGUxNl90b19jcHUoZXgtPmVlX2xlbikgLSAxKSB7CisJCS8qIHRhaWwgcmVtb3ZhbCAqLworCQl1bnNpZ25lZCBsb25nIG51bTsKKwkJZXh0NF9mc2Jsa190IHN0YXJ0OworCQludW0gPSBsZTMyX3RvX2NwdShleC0+ZWVfYmxvY2spICsgbGUxNl90b19jcHUoZXgtPmVlX2xlbikgLSBmcm9tOworCQlzdGFydCA9IGV4dF9wYmxvY2soZXgpICsgbGUxNl90b19jcHUoZXgtPmVlX2xlbikgLSBudW07CisJCWV4dF9kZWJ1ZygiZnJlZSBsYXN0ICVsdSBibG9ja3Mgc3RhcnRpbmcgJWxsdVxuIiwgbnVtLCBzdGFydCk7CisJCWZvciAoaSA9IDA7IGkgPCBudW07IGkrKykgeworCQkJYmggPSBzYl9maW5kX2dldF9ibG9jayhpbm9kZS0+aV9zYiwgc3RhcnQgKyBpKTsKKwkJCWV4dDRfZm9yZ2V0KGhhbmRsZSwgMCwgaW5vZGUsIGJoLCBzdGFydCArIGkpOworCQl9CisJCWV4dDRfZnJlZV9ibG9ja3MoaGFuZGxlLCBpbm9kZSwgc3RhcnQsIG51bSk7CisJfSBlbHNlIGlmIChmcm9tID09IGxlMzJfdG9fY3B1KGV4LT5lZV9ibG9jaykKKwkJICAgJiYgdG8gPD0gbGUzMl90b19jcHUoZXgtPmVlX2Jsb2NrKSArIGxlMTZfdG9fY3B1KGV4LT5lZV9sZW4pIC0gMSkgeworCQlwcmludGsoInN0cmFuZ2UgcmVxdWVzdDogcmVtb3ZhbCAlbHUtJWx1IGZyb20gJXU6JXVcbiIsCisJCSAgICAgICBmcm9tLCB0bywgbGUzMl90b19jcHUoZXgtPmVlX2Jsb2NrKSwgbGUxNl90b19jcHUoZXgtPmVlX2xlbikpOworCX0gZWxzZSB7CisJCXByaW50aygic3RyYW5nZSByZXF1ZXN0OiByZW1vdmFsKDIpICVsdS0lbHUgZnJvbSAldToldVxuIiwKKwkJICAgICAgIGZyb20sIHRvLCBsZTMyX3RvX2NwdShleC0+ZWVfYmxvY2spLCBsZTE2X3RvX2NwdShleC0+ZWVfbGVuKSk7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50CitleHQ0X2V4dF9ybV9sZWFmKGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBpbm9kZSAqaW5vZGUsCisJCXN0cnVjdCBleHQ0X2V4dF9wYXRoICpwYXRoLCB1bnNpZ25lZCBsb25nIHN0YXJ0KQoreworCWludCBlcnIgPSAwLCBjb3JyZWN0X2luZGV4ID0gMDsKKwlpbnQgZGVwdGggPSBleHRfZGVwdGgoaW5vZGUpLCBjcmVkaXRzOworCXN0cnVjdCBleHQ0X2V4dGVudF9oZWFkZXIgKmVoOworCXVuc2lnbmVkIGEsIGIsIGJsb2NrLCBudW07CisJdW5zaWduZWQgbG9uZyBleF9lZV9ibG9jazsKKwl1bnNpZ25lZCBzaG9ydCBleF9lZV9sZW47CisJc3RydWN0IGV4dDRfZXh0ZW50ICpleDsKKworCWV4dF9kZWJ1ZygidHJ1bmNhdGUgc2luY2UgJWx1IGluIGxlYWZcbiIsIHN0YXJ0KTsKKwlpZiAoIXBhdGhbZGVwdGhdLnBfaGRyKQorCQlwYXRoW2RlcHRoXS5wX2hkciA9IGV4dF9ibG9ja19oZHIocGF0aFtkZXB0aF0ucF9iaCk7CisJZWggPSBwYXRoW2RlcHRoXS5wX2hkcjsKKwlCVUdfT04oZWggPT0gTlVMTCk7CisJQlVHX09OKGxlMTZfdG9fY3B1KGVoLT5laF9lbnRyaWVzKSA+IGxlMTZfdG9fY3B1KGVoLT5laF9tYXgpKTsKKwlCVUdfT04oZWgtPmVoX21hZ2ljICE9IEVYVDRfRVhUX01BR0lDKTsKKworCS8qIGZpbmQgd2hlcmUgdG8gc3RhcnQgcmVtb3ZpbmcgKi8KKwlleCA9IEVYVF9MQVNUX0VYVEVOVChlaCk7CisKKwlleF9lZV9ibG9jayA9IGxlMzJfdG9fY3B1KGV4LT5lZV9ibG9jayk7CisJZXhfZWVfbGVuID0gbGUxNl90b19jcHUoZXgtPmVlX2xlbik7CisKKwl3aGlsZSAoZXggPj0gRVhUX0ZJUlNUX0VYVEVOVChlaCkgJiYKKwkJCWV4X2VlX2Jsb2NrICsgZXhfZWVfbGVuID4gc3RhcnQpIHsKKwkJZXh0X2RlYnVnKCJyZW1vdmUgZXh0ICVsdToldVxuIiwgZXhfZWVfYmxvY2ssIGV4X2VlX2xlbik7CisJCXBhdGhbZGVwdGhdLnBfZXh0ID0gZXg7CisKKwkJYSA9IGV4X2VlX2Jsb2NrID4gc3RhcnQgPyBleF9lZV9ibG9jayA6IHN0YXJ0OworCQliID0gZXhfZWVfYmxvY2sgKyBleF9lZV9sZW4gLSAxIDwgRVhUX01BWF9CTE9DSyA/CisJCQlleF9lZV9ibG9jayArIGV4X2VlX2xlbiAtIDEgOiBFWFRfTUFYX0JMT0NLOworCisJCWV4dF9kZWJ1ZygiICBib3JkZXIgJXU6JXVcbiIsIGEsIGIpOworCisJCWlmIChhICE9IGV4X2VlX2Jsb2NrICYmIGIgIT0gZXhfZWVfYmxvY2sgKyBleF9lZV9sZW4gLSAxKSB7CisJCQlibG9jayA9IDA7CisJCQludW0gPSAwOworCQkJQlVHKCk7CisJCX0gZWxzZSBpZiAoYSAhPSBleF9lZV9ibG9jaykgeworCQkJLyogcmVtb3ZlIHRhaWwgb2YgdGhlIGV4dGVudCAqLworCQkJYmxvY2sgPSBleF9lZV9ibG9jazsKKwkJCW51bSA9IGEgLSBibG9jazsKKwkJfSBlbHNlIGlmIChiICE9IGV4X2VlX2Jsb2NrICsgZXhfZWVfbGVuIC0gMSkgeworCQkJLyogcmVtb3ZlIGhlYWQgb2YgdGhlIGV4dGVudCAqLworCQkJYmxvY2sgPSBhOworCQkJbnVtID0gYiAtIGE7CisJCQkvKiB0aGVyZSBpcyBubyAibWFrZSBhIGhvbGUiIEFQSSB5ZXQgKi8KKwkJCUJVRygpOworCQl9IGVsc2UgeworCQkJLyogcmVtb3ZlIHdob2xlIGV4dGVudDogZXhjZWxsZW50ISAqLworCQkJYmxvY2sgPSBleF9lZV9ibG9jazsKKwkJCW51bSA9IDA7CisJCQlCVUdfT04oYSAhPSBleF9lZV9ibG9jayk7CisJCQlCVUdfT04oYiAhPSBleF9lZV9ibG9jayArIGV4X2VlX2xlbiAtIDEpOworCQl9CisKKwkJLyogYXQgcHJlc2VudCwgZXh0ZW50IGNhbid0IGNyb3NzIGJsb2NrIGdyb3VwOiAqLworCQkvKiBsZWFmICsgYml0bWFwICsgZ3JvdXAgZGVzYyArIHNiICsgaW5vZGUgKi8KKwkJY3JlZGl0cyA9IDU7CisJCWlmIChleCA9PSBFWFRfRklSU1RfRVhURU5UKGVoKSkgeworCQkJY29ycmVjdF9pbmRleCA9IDE7CisJCQljcmVkaXRzICs9IChleHRfZGVwdGgoaW5vZGUpKSArIDE7CisJCX0KKyNpZmRlZiBDT05GSUdfUVVPVEEKKwkJY3JlZGl0cyArPSAyICogRVhUNF9RVU9UQV9UUkFOU19CTE9DS1MoaW5vZGUtPmlfc2IpOworI2VuZGlmCisKKwkJaGFuZGxlID0gZXh0NF9leHRfam91cm5hbF9yZXN0YXJ0KGhhbmRsZSwgY3JlZGl0cyk7CisJCWlmIChJU19FUlIoaGFuZGxlKSkgeworCQkJZXJyID0gUFRSX0VSUihoYW5kbGUpOworCQkJZ290byBvdXQ7CisJCX0KKworCQllcnIgPSBleHQ0X2V4dF9nZXRfYWNjZXNzKGhhbmRsZSwgaW5vZGUsIHBhdGggKyBkZXB0aCk7CisJCWlmIChlcnIpCisJCQlnb3RvIG91dDsKKworCQllcnIgPSBleHQ0X3JlbW92ZV9ibG9ja3MoaGFuZGxlLCBpbm9kZSwgZXgsIGEsIGIpOworCQlpZiAoZXJyKQorCQkJZ290byBvdXQ7CisKKwkJaWYgKG51bSA9PSAwKSB7CisJCQkvKiB0aGlzIGV4dGVudCBpcyByZW1vdmVkOyBtYXJrIHNsb3QgZW50aXJlbHkgdW51c2VkICovCisJCQlleHQ0X2V4dF9zdG9yZV9wYmxvY2soZXgsIDApOworCQkJZWgtPmVoX2VudHJpZXMgPSBjcHVfdG9fbGUxNihsZTE2X3RvX2NwdShlaC0+ZWhfZW50cmllcyktMSk7CisJCX0KKworCQlleC0+ZWVfYmxvY2sgPSBjcHVfdG9fbGUzMihibG9jayk7CisJCWV4LT5lZV9sZW4gPSBjcHVfdG9fbGUxNihudW0pOworCisJCWVyciA9IGV4dDRfZXh0X2RpcnR5KGhhbmRsZSwgaW5vZGUsIHBhdGggKyBkZXB0aCk7CisJCWlmIChlcnIpCisJCQlnb3RvIG91dDsKKworCQlleHRfZGVidWcoIm5ldyBleHRlbnQ6ICV1OiV1OiVsbHVcbiIsIGJsb2NrLCBudW0sCisJCQkJZXh0X3BibG9jayhleCkpOworCQlleC0tOworCQlleF9lZV9ibG9jayA9IGxlMzJfdG9fY3B1KGV4LT5lZV9ibG9jayk7CisJCWV4X2VlX2xlbiA9IGxlMTZfdG9fY3B1KGV4LT5lZV9sZW4pOworCX0KKworCWlmIChjb3JyZWN0X2luZGV4ICYmIGVoLT5laF9lbnRyaWVzKQorCQllcnIgPSBleHQ0X2V4dF9jb3JyZWN0X2luZGV4ZXMoaGFuZGxlLCBpbm9kZSwgcGF0aCk7CisKKwkvKiBpZiB0aGlzIGxlYWYgaXMgZnJlZSwgdGhlbiB3ZSBzaG91bGQKKwkgKiByZW1vdmUgaXQgZnJvbSBpbmRleCBibG9jayBhYm92ZSAqLworCWlmIChlcnIgPT0gMCAmJiBlaC0+ZWhfZW50cmllcyA9PSAwICYmIHBhdGhbZGVwdGhdLnBfYmggIT0gTlVMTCkKKwkJZXJyID0gZXh0NF9leHRfcm1faWR4KGhhbmRsZSwgaW5vZGUsIHBhdGggKyBkZXB0aCk7CisKK291dDoKKwlyZXR1cm4gZXJyOworfQorCisvKgorICogZXh0NF9leHRfbW9yZV90b19ybToKKyAqIHJldHVybnMgMSBpZiBjdXJyZW50IGluZGV4IGhhcyB0byBiZSBmcmVlZCAoZXZlbiBwYXJ0aWFsKQorICovCitzdGF0aWMgaW50IGlubGluZQorZXh0NF9leHRfbW9yZV90b19ybShzdHJ1Y3QgZXh0NF9leHRfcGF0aCAqcGF0aCkKK3sKKwlCVUdfT04ocGF0aC0+cF9pZHggPT0gTlVMTCk7CisKKwlpZiAocGF0aC0+cF9pZHggPCBFWFRfRklSU1RfSU5ERVgocGF0aC0+cF9oZHIpKQorCQlyZXR1cm4gMDsKKworCS8qCisJICogaWYgdHJ1bmNhdGUgb24gZGVlcGVyIGxldmVsIGhhcHBlbmVkLCBpdCB3YXNuJ3QgcGFydGlhbCwKKwkgKiBzbyB3ZSBoYXZlIHRvIGNvbnNpZGVyIGN1cnJlbnQgaW5kZXggZm9yIHRydW5jYXRpb24KKwkgKi8KKwlpZiAobGUxNl90b19jcHUocGF0aC0+cF9oZHItPmVoX2VudHJpZXMpID09IHBhdGgtPnBfYmxvY2spCisJCXJldHVybiAwOworCXJldHVybiAxOworfQorCitpbnQgZXh0NF9leHRfcmVtb3ZlX3NwYWNlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHVuc2lnbmVkIGxvbmcgc3RhcnQpCit7CisJc3RydWN0IHN1cGVyX2Jsb2NrICpzYiA9IGlub2RlLT5pX3NiOworCWludCBkZXB0aCA9IGV4dF9kZXB0aChpbm9kZSk7CisJc3RydWN0IGV4dDRfZXh0X3BhdGggKnBhdGg7CisJaGFuZGxlX3QgKmhhbmRsZTsKKwlpbnQgaSA9IDAsIGVyciA9IDA7CisKKwlleHRfZGVidWcoInRydW5jYXRlIHNpbmNlICVsdVxuIiwgc3RhcnQpOworCisJLyogcHJvYmFibHkgZmlyc3QgZXh0ZW50IHdlJ3JlIGdvbm5hIGZyZWUgd2lsbCBiZSBsYXN0IGluIGJsb2NrICovCisJaGFuZGxlID0gZXh0NF9qb3VybmFsX3N0YXJ0KGlub2RlLCBkZXB0aCArIDEpOworCWlmIChJU19FUlIoaGFuZGxlKSkKKwkJcmV0dXJuIFBUUl9FUlIoaGFuZGxlKTsKKworCWV4dDRfZXh0X2ludmFsaWRhdGVfY2FjaGUoaW5vZGUpOworCisJLyoKKwkgKiBXZSBzdGFydCBzY2FubmluZyBmcm9tIHJpZ2h0IHNpZGUsIGZyZWVpbmcgYWxsIHRoZSBibG9ja3MKKwkgKiBhZnRlciBpX3NpemUgYW5kIHdhbGtpbmcgaW50byB0aGUgdHJlZSBkZXB0aC13aXNlLgorCSAqLworCXBhdGggPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgZXh0NF9leHRfcGF0aCkgKiAoZGVwdGggKyAxKSwgR0ZQX0tFUk5FTCk7CisJaWYgKHBhdGggPT0gTlVMTCkgeworCQlleHQ0X2pvdXJuYWxfc3RvcChoYW5kbGUpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisJbWVtc2V0KHBhdGgsIDAsIHNpemVvZihzdHJ1Y3QgZXh0NF9leHRfcGF0aCkgKiAoZGVwdGggKyAxKSk7CisJcGF0aFswXS5wX2hkciA9IGV4dF9pbm9kZV9oZHIoaW5vZGUpOworCWlmIChleHQ0X2V4dF9jaGVja19oZWFkZXIoX19GVU5DVElPTl9fLCBpbm9kZSwgcGF0aFswXS5wX2hkcikpIHsKKwkJZXJyID0gLUVJTzsKKwkJZ290byBvdXQ7CisJfQorCXBhdGhbMF0ucF9kZXB0aCA9IGRlcHRoOworCisJd2hpbGUgKGkgPj0gMCAmJiBlcnIgPT0gMCkgeworCQlpZiAoaSA9PSBkZXB0aCkgeworCQkJLyogdGhpcyBpcyBsZWFmIGJsb2NrICovCisJCQllcnIgPSBleHQ0X2V4dF9ybV9sZWFmKGhhbmRsZSwgaW5vZGUsIHBhdGgsIHN0YXJ0KTsKKwkJCS8qIHJvb3QgbGV2ZWwgaGFzIHBfYmggPT0gTlVMTCwgYnJlbHNlKCkgZWF0cyB0aGlzICovCisJCQlicmVsc2UocGF0aFtpXS5wX2JoKTsKKwkJCXBhdGhbaV0ucF9iaCA9IE5VTEw7CisJCQlpLS07CisJCQljb250aW51ZTsKKwkJfQorCisJCS8qIHRoaXMgaXMgaW5kZXggYmxvY2sgKi8KKwkJaWYgKCFwYXRoW2ldLnBfaGRyKSB7CisJCQlleHRfZGVidWcoImluaXRpYWxpemUgaGVhZGVyXG4iKTsKKwkJCXBhdGhbaV0ucF9oZHIgPSBleHRfYmxvY2tfaGRyKHBhdGhbaV0ucF9iaCk7CisJCQlpZiAoZXh0NF9leHRfY2hlY2tfaGVhZGVyKF9fRlVOQ1RJT05fXywgaW5vZGUsCisJCQkJCQkJcGF0aFtpXS5wX2hkcikpIHsKKwkJCQllcnIgPSAtRUlPOworCQkJCWdvdG8gb3V0OworCQkJfQorCQl9CisKKwkJQlVHX09OKGxlMTZfdG9fY3B1KHBhdGhbaV0ucF9oZHItPmVoX2VudHJpZXMpCisJCQkgICA+IGxlMTZfdG9fY3B1KHBhdGhbaV0ucF9oZHItPmVoX21heCkpOworCQlCVUdfT04ocGF0aFtpXS5wX2hkci0+ZWhfbWFnaWMgIT0gRVhUNF9FWFRfTUFHSUMpOworCisJCWlmICghcGF0aFtpXS5wX2lkeCkgeworCQkJLyogdGhpcyBsZXZlbCBoYXNuJ3QgYmVlbiB0b3VjaGVkIHlldCAqLworCQkJcGF0aFtpXS5wX2lkeCA9IEVYVF9MQVNUX0lOREVYKHBhdGhbaV0ucF9oZHIpOworCQkJcGF0aFtpXS5wX2Jsb2NrID0gbGUxNl90b19jcHUocGF0aFtpXS5wX2hkci0+ZWhfZW50cmllcykrMTsKKwkJCWV4dF9kZWJ1ZygiaW5pdCBpbmRleCBwdHI6IGhkciAweCVwLCBudW0gJWRcbiIsCisJCQkJICBwYXRoW2ldLnBfaGRyLAorCQkJCSAgbGUxNl90b19jcHUocGF0aFtpXS5wX2hkci0+ZWhfZW50cmllcykpOworCQl9IGVsc2UgeworCQkJLyogd2Ugd2VyZSBhbHJlYWR5IGhlcmUsIHNlZSBhdCBuZXh0IGluZGV4ICovCisJCQlwYXRoW2ldLnBfaWR4LS07CisJCX0KKworCQlleHRfZGVidWcoImxldmVsICVkIC0gaW5kZXgsIGZpcnN0IDB4JXAsIGN1ciAweCVwXG4iLAorCQkJCWksIEVYVF9GSVJTVF9JTkRFWChwYXRoW2ldLnBfaGRyKSwKKwkJCQlwYXRoW2ldLnBfaWR4KTsKKwkJaWYgKGV4dDRfZXh0X21vcmVfdG9fcm0ocGF0aCArIGkpKSB7CisJCQkvKiBnbyB0byB0aGUgbmV4dCBsZXZlbCAqLworCQkJZXh0X2RlYnVnKCJtb3ZlIHRvIGxldmVsICVkIChibG9jayAlbGx1KVxuIiwKKwkJCQkgIGkgKyAxLCBpZHhfcGJsb2NrKHBhdGhbaV0ucF9pZHgpKTsKKwkJCW1lbXNldChwYXRoICsgaSArIDEsIDAsIHNpemVvZigqcGF0aCkpOworCQkJcGF0aFtpKzFdLnBfYmggPQorCQkJCXNiX2JyZWFkKHNiLCBpZHhfcGJsb2NrKHBhdGhbaV0ucF9pZHgpKTsKKwkJCWlmICghcGF0aFtpKzFdLnBfYmgpIHsKKwkJCQkvKiBzaG91bGQgd2UgcmVzZXQgaV9zaXplPyAqLworCQkJCWVyciA9IC1FSU87CisJCQkJYnJlYWs7CisJCQl9CisKKwkJCS8qIHNhdmUgYWN0dWFsIG51bWJlciBvZiBpbmRleGVzIHNpbmNlIHRoaXMKKwkJCSAqIG51bWJlciBpcyBjaGFuZ2VkIGF0IHRoZSBuZXh0IGl0ZXJhdGlvbiAqLworCQkJcGF0aFtpXS5wX2Jsb2NrID0gbGUxNl90b19jcHUocGF0aFtpXS5wX2hkci0+ZWhfZW50cmllcyk7CisJCQlpKys7CisJCX0gZWxzZSB7CisJCQkvKiB3ZSBmaW5pc2hlZCBwcm9jZXNzaW5nIHRoaXMgaW5kZXgsIGdvIHVwICovCisJCQlpZiAocGF0aFtpXS5wX2hkci0+ZWhfZW50cmllcyA9PSAwICYmIGkgPiAwKSB7CisJCQkJLyogaW5kZXggaXMgZW1wdHksIHJlbW92ZSBpdDsKKwkJCQkgKiBoYW5kbGUgbXVzdCBiZSBhbHJlYWR5IHByZXBhcmVkIGJ5IHRoZQorCQkJCSAqIHRydW5jYXRlaV9sZWFmKCkgKi8KKwkJCQllcnIgPSBleHQ0X2V4dF9ybV9pZHgoaGFuZGxlLCBpbm9kZSwgcGF0aCArIGkpOworCQkJfQorCQkJLyogcm9vdCBsZXZlbCBoYXMgcF9iaCA9PSBOVUxMLCBicmVsc2UoKSBlYXRzIHRoaXMgKi8KKwkJCWJyZWxzZShwYXRoW2ldLnBfYmgpOworCQkJcGF0aFtpXS5wX2JoID0gTlVMTDsKKwkJCWktLTsKKwkJCWV4dF9kZWJ1ZygicmV0dXJuIHRvIGxldmVsICVkXG4iLCBpKTsKKwkJfQorCX0KKworCS8qIFRPRE86IGZsZXhpYmxlIHRyZWUgcmVkdWN0aW9uIHNob3VsZCBiZSBoZXJlICovCisJaWYgKHBhdGgtPnBfaGRyLT5laF9lbnRyaWVzID09IDApIHsKKwkJLyoKKwkJICogdHJ1bmNhdGUgdG8gemVybyBmcmVlZCBhbGwgdGhlIHRyZWUsCisJCSAqIHNvIHdlIG5lZWQgdG8gY29ycmVjdCBlaF9kZXB0aAorCQkgKi8KKwkJZXJyID0gZXh0NF9leHRfZ2V0X2FjY2VzcyhoYW5kbGUsIGlub2RlLCBwYXRoKTsKKwkJaWYgKGVyciA9PSAwKSB7CisJCQlleHRfaW5vZGVfaGRyKGlub2RlKS0+ZWhfZGVwdGggPSAwOworCQkJZXh0X2lub2RlX2hkcihpbm9kZSktPmVoX21heCA9CisJCQkJY3B1X3RvX2xlMTYoZXh0NF9leHRfc3BhY2Vfcm9vdChpbm9kZSkpOworCQkJZXJyID0gZXh0NF9leHRfZGlydHkoaGFuZGxlLCBpbm9kZSwgcGF0aCk7CisJCX0KKwl9CitvdXQ6CisJZXh0NF9leHRfdHJlZV9jaGFuZ2VkKGlub2RlKTsKKwlleHQ0X2V4dF9kcm9wX3JlZnMocGF0aCk7CisJa2ZyZWUocGF0aCk7CisJZXh0NF9qb3VybmFsX3N0b3AoaGFuZGxlKTsKKworCXJldHVybiBlcnI7Cit9CisKKy8qCisgKiBjYWxsZWQgYXQgbW91bnQgdGltZQorICovCit2b2lkIGV4dDRfZXh0X2luaXQoc3RydWN0IHN1cGVyX2Jsb2NrICpzYikKK3sKKwkvKgorCSAqIHBvc3NpYmxlIGluaXRpYWxpemF0aW9uIHdvdWxkIGJlIGhlcmUKKwkgKi8KKworCWlmICh0ZXN0X29wdChzYiwgRVhURU5UUykpIHsKKwkJcHJpbnRrKCJFWFQ0LWZzOiBmaWxlIGV4dGVudHMgZW5hYmxlZCIpOworI2lmZGVmIEFHUkVTU0lWRV9URVNUCisJCXByaW50aygiLCBhZ3Jlc3NpdmUgdGVzdHMiKTsKKyNlbmRpZgorI2lmZGVmIENIRUNLX0JJTlNFQVJDSAorCQlwcmludGsoIiwgY2hlY2sgYmluc2VhcmNoIik7CisjZW5kaWYKKyNpZmRlZiBFWFRFTlRTX1NUQVRTCisJCXByaW50aygiLCBzdGF0cyIpOworI2VuZGlmCisJCXByaW50aygiXG4iKTsKKyNpZmRlZiBFWFRFTlRTX1NUQVRTCisJCXNwaW5fbG9ja19pbml0KCZFWFQ0X1NCKHNiKS0+c19leHRfc3RhdHNfbG9jayk7CisJCUVYVDRfU0Ioc2IpLT5zX2V4dF9taW4gPSAxIDw8IDMwOworCQlFWFQ0X1NCKHNiKS0+c19leHRfbWF4ID0gMDsKKyNlbmRpZgorCX0KK30KKworLyoKKyAqIGNhbGxlZCBhdCB1bW91bnQgdGltZQorICovCit2b2lkIGV4dDRfZXh0X3JlbGVhc2Uoc3RydWN0IHN1cGVyX2Jsb2NrICpzYikKK3sKKwlpZiAoIXRlc3Rfb3B0KHNiLCBFWFRFTlRTKSkKKwkJcmV0dXJuOworCisjaWZkZWYgRVhURU5UU19TVEFUUworCWlmIChFWFQ0X1NCKHNiKS0+c19leHRfYmxvY2tzICYmIEVYVDRfU0Ioc2IpLT5zX2V4dF9leHRlbnRzKSB7CisJCXN0cnVjdCBleHQ0X3NiX2luZm8gKnNiaSA9IEVYVDRfU0Ioc2IpOworCQlwcmludGsoS0VSTl9FUlIgIkVYVDQtZnM6ICVsdSBibG9ja3MgaW4gJWx1IGV4dGVudHMgKCVsdSBhdmUpXG4iLAorCQkJc2JpLT5zX2V4dF9ibG9ja3MsIHNiaS0+c19leHRfZXh0ZW50cywKKwkJCXNiaS0+c19leHRfYmxvY2tzIC8gc2JpLT5zX2V4dF9leHRlbnRzKTsKKwkJcHJpbnRrKEtFUk5fRVJSICJFWFQ0LWZzOiBleHRlbnRzOiAlbHUgbWluLCAlbHUgbWF4LCBtYXggZGVwdGggJWx1XG4iLAorCQkJc2JpLT5zX2V4dF9taW4sIHNiaS0+c19leHRfbWF4LCBzYmktPnNfZGVwdGhfbWF4KTsKKwl9CisjZW5kaWYKK30KKworaW50IGV4dDRfZXh0X2dldF9ibG9ja3MoaGFuZGxlX3QgKmhhbmRsZSwgc3RydWN0IGlub2RlICppbm9kZSwKKwkJCWV4dDRfZnNibGtfdCBpYmxvY2ssCisJCQl1bnNpZ25lZCBsb25nIG1heF9ibG9ja3MsIHN0cnVjdCBidWZmZXJfaGVhZCAqYmhfcmVzdWx0LAorCQkJaW50IGNyZWF0ZSwgaW50IGV4dGVuZF9kaXNrc2l6ZSkKK3sKKwlzdHJ1Y3QgZXh0NF9leHRfcGF0aCAqcGF0aCA9IE5VTEw7CisJc3RydWN0IGV4dDRfZXh0ZW50IG5ld2V4LCAqZXg7CisJZXh0NF9mc2Jsa190IGdvYWwsIG5ld2Jsb2NrOworCWludCBlcnIgPSAwLCBkZXB0aDsKKwl1bnNpZ25lZCBsb25nIGFsbG9jYXRlZCA9IDA7CisKKwlfX2NsZWFyX2JpdChCSF9OZXcsICZiaF9yZXN1bHQtPmJfc3RhdGUpOworCWV4dF9kZWJ1ZygiYmxvY2tzICVkLyVsdSByZXF1ZXN0ZWQgZm9yIGlub2RlICV1XG4iLCAoaW50KSBpYmxvY2ssCisJCQltYXhfYmxvY2tzLCAodW5zaWduZWQpIGlub2RlLT5pX2lubyk7CisJbXV0ZXhfbG9jaygmRVhUNF9JKGlub2RlKS0+dHJ1bmNhdGVfbXV0ZXgpOworCisJLyogY2hlY2sgaW4gY2FjaGUgKi8KKwlpZiAoKGdvYWwgPSBleHQ0X2V4dF9pbl9jYWNoZShpbm9kZSwgaWJsb2NrLCAmbmV3ZXgpKSkgeworCQlpZiAoZ29hbCA9PSBFWFQ0X0VYVF9DQUNIRV9HQVApIHsKKwkJCWlmICghY3JlYXRlKSB7CisJCQkJLyogYmxvY2sgaXNuJ3QgYWxsb2NhdGVkIHlldCBhbmQKKwkJCQkgKiB1c2VyIGRvZXNuJ3Qgd2FudCB0byBhbGxvY2F0ZSBpdCAqLworCQkJCWdvdG8gb3V0MjsKKwkJCX0KKwkJCS8qIHdlIHNob3VsZCBhbGxvY2F0ZSByZXF1ZXN0ZWQgYmxvY2sgKi8KKwkJfSBlbHNlIGlmIChnb2FsID09IEVYVDRfRVhUX0NBQ0hFX0VYVEVOVCkgeworCQkJLyogYmxvY2sgaXMgYWxyZWFkeSBhbGxvY2F0ZWQgKi8KKwkJICAgICAgICBuZXdibG9jayA9IGlibG9jaworCQkgICAgICAgICAgICAgICAgICAgLSBsZTMyX3RvX2NwdShuZXdleC5lZV9ibG9jaykKKwkJCSAgICAgICAgICAgKyBleHRfcGJsb2NrKCZuZXdleCk7CisJCQkvKiBudW1iZXIgb2YgcmVtYWluaW5nIGJsb2NrcyBpbiB0aGUgZXh0ZW50ICovCisJCQlhbGxvY2F0ZWQgPSBsZTE2X3RvX2NwdShuZXdleC5lZV9sZW4pIC0KKwkJCQkJKGlibG9jayAtIGxlMzJfdG9fY3B1KG5ld2V4LmVlX2Jsb2NrKSk7CisJCQlnb3RvIG91dDsKKwkJfSBlbHNlIHsKKwkJCUJVRygpOworCQl9CisJfQorCisJLyogZmluZCBleHRlbnQgZm9yIHRoaXMgYmxvY2sgKi8KKwlwYXRoID0gZXh0NF9leHRfZmluZF9leHRlbnQoaW5vZGUsIGlibG9jaywgTlVMTCk7CisJaWYgKElTX0VSUihwYXRoKSkgeworCQllcnIgPSBQVFJfRVJSKHBhdGgpOworCQlwYXRoID0gTlVMTDsKKwkJZ290byBvdXQyOworCX0KKworCWRlcHRoID0gZXh0X2RlcHRoKGlub2RlKTsKKworCS8qCisJICogY29uc2lzdGVudCBsZWFmIG11c3Qgbm90IGJlIGVtcHR5OworCSAqIHRoaXMgc2l0dWF0aW9uIGlzIHBvc3NpYmxlLCB0aG91Z2gsIF9kdXJpbmdfIHRyZWUgbW9kaWZpY2F0aW9uOworCSAqIHRoaXMgaXMgd2h5IGFzc2VydCBjYW4ndCBiZSBwdXQgaW4gZXh0NF9leHRfZmluZF9leHRlbnQoKQorCSAqLworCUJVR19PTihwYXRoW2RlcHRoXS5wX2V4dCA9PSBOVUxMICYmIGRlcHRoICE9IDApOworCisJaWYgKChleCA9IHBhdGhbZGVwdGhdLnBfZXh0KSkgeworCSAgICAgICAgdW5zaWduZWQgbG9uZyBlZV9ibG9jayA9IGxlMzJfdG9fY3B1KGV4LT5lZV9ibG9jayk7CisJCWV4dDRfZnNibGtfdCBlZV9zdGFydCA9IGV4dF9wYmxvY2soZXgpOworCQl1bnNpZ25lZCBzaG9ydCBlZV9sZW4gID0gbGUxNl90b19jcHUoZXgtPmVlX2xlbik7CisKKwkJLyoKKwkJICogQWxsb3cgZnV0dXJlIHN1cHBvcnQgZm9yIHByZWFsbG9jYXRlZCBleHRlbnRzIHRvIGJlIGFkZGVkCisJCSAqIGFzIGFuIFJPX0NPTVBBVCBmZWF0dXJlOgorCQkgKiBVbmluaXRpYWxpemVkIGV4dGVudHMgYXJlIHRyZWF0ZWQgYXMgaG9sZXMsIGV4Y2VwdCB0aGF0CisJCSAqIHdlIGF2b2lkIChmYWlsKSBhbGxvY2F0aW5nIG5ldyBibG9ja3MgZHVyaW5nIGEgd3JpdGUuCisJCSAqLworCQlpZiAoZWVfbGVuID4gRVhUX01BWF9MRU4pCisJCQlnb3RvIG91dDI7CisJCS8qIGlmIGZvdW5kIGV4dGVudCBjb3ZlcnMgYmxvY2ssIHNpbXBseSByZXR1cm4gaXQgKi8KKwkgICAgICAgIGlmIChpYmxvY2sgPj0gZWVfYmxvY2sgJiYgaWJsb2NrIDwgZWVfYmxvY2sgKyBlZV9sZW4pIHsKKwkJCW5ld2Jsb2NrID0gaWJsb2NrIC0gZWVfYmxvY2sgKyBlZV9zdGFydDsKKwkJCS8qIG51bWJlciBvZiByZW1haW5pbmcgYmxvY2tzIGluIHRoZSBleHRlbnQgKi8KKwkJCWFsbG9jYXRlZCA9IGVlX2xlbiAtIChpYmxvY2sgLSBlZV9ibG9jayk7CisJCQlleHRfZGVidWcoIiVkIGZpdCBpbnRvICVsdTolZCAtPiAlbGx1XG4iLCAoaW50KSBpYmxvY2ssCisJCQkJCWVlX2Jsb2NrLCBlZV9sZW4sIG5ld2Jsb2NrKTsKKwkJCWV4dDRfZXh0X3B1dF9pbl9jYWNoZShpbm9kZSwgZWVfYmxvY2ssIGVlX2xlbiwKKwkJCQkJCWVlX3N0YXJ0LCBFWFQ0X0VYVF9DQUNIRV9FWFRFTlQpOworCQkJZ290byBvdXQ7CisJCX0KKwl9CisKKwkvKgorCSAqIHJlcXVlc3RlZCBibG9jayBpc24ndCBhbGxvY2F0ZWQgeWV0OworCSAqIHdlIGNvdWxkbid0IHRyeSB0byBjcmVhdGUgYmxvY2sgaWYgY3JlYXRlIGZsYWcgaXMgemVybworCSAqLworCWlmICghY3JlYXRlKSB7CisJCS8qIHB1dCBqdXN0IGZvdW5kIGdhcCBpbnRvIGNhY2hlIHRvIHNwZWVkIHVwCisJCSAqIHN1YnNlcXVlbnQgcmVxdWVzdHMgKi8KKwkJZXh0NF9leHRfcHV0X2dhcF9pbl9jYWNoZShpbm9kZSwgcGF0aCwgaWJsb2NrKTsKKwkJZ290byBvdXQyOworCX0KKwkvKgorCSAqIE9rYXksIHdlIG5lZWQgdG8gZG8gYmxvY2sgYWxsb2NhdGlvbi4gIExhemlseSBpbml0aWFsaXplIHRoZSBibG9jaworCSAqIGFsbG9jYXRpb24gaW5mbyBoZXJlIGlmIG5lY2Vzc2FyeS4KKwkgKi8KKwlpZiAoU19JU1JFRyhpbm9kZS0+aV9tb2RlKSAmJiAoIUVYVDRfSShpbm9kZSktPmlfYmxvY2tfYWxsb2NfaW5mbykpCisJCWV4dDRfaW5pdF9ibG9ja19hbGxvY19pbmZvKGlub2RlKTsKKworCS8qIGFsbG9jYXRlIG5ldyBibG9jayAqLworCWdvYWwgPSBleHQ0X2V4dF9maW5kX2dvYWwoaW5vZGUsIHBhdGgsIGlibG9jayk7CisJYWxsb2NhdGVkID0gbWF4X2Jsb2NrczsKKwluZXdibG9jayA9IGV4dDRfbmV3X2Jsb2NrcyhoYW5kbGUsIGlub2RlLCBnb2FsLCAmYWxsb2NhdGVkLCAmZXJyKTsKKwlpZiAoIW5ld2Jsb2NrKQorCQlnb3RvIG91dDI7CisJZXh0X2RlYnVnKCJhbGxvY2F0ZSBuZXcgYmxvY2s6IGdvYWwgJWxsdSwgZm91bmQgJWxsdS8lbHVcbiIsCisJCQlnb2FsLCBuZXdibG9jaywgYWxsb2NhdGVkKTsKKworCS8qIHRyeSB0byBpbnNlcnQgbmV3IGV4dGVudCBpbnRvIGZvdW5kIGxlYWYgYW5kIHJldHVybiAqLworCW5ld2V4LmVlX2Jsb2NrID0gY3B1X3RvX2xlMzIoaWJsb2NrKTsKKwlleHQ0X2V4dF9zdG9yZV9wYmxvY2soJm5ld2V4LCBuZXdibG9jayk7CisJbmV3ZXguZWVfbGVuID0gY3B1X3RvX2xlMTYoYWxsb2NhdGVkKTsKKwllcnIgPSBleHQ0X2V4dF9pbnNlcnRfZXh0ZW50KGhhbmRsZSwgaW5vZGUsIHBhdGgsICZuZXdleCk7CisJaWYgKGVycikKKwkJZ290byBvdXQyOworCisJaWYgKGV4dGVuZF9kaXNrc2l6ZSAmJiBpbm9kZS0+aV9zaXplID4gRVhUNF9JKGlub2RlKS0+aV9kaXNrc2l6ZSkKKwkJRVhUNF9JKGlub2RlKS0+aV9kaXNrc2l6ZSA9IGlub2RlLT5pX3NpemU7CisKKwkvKiBwcmV2aW91cyByb3V0aW5lIGNvdWxkIHVzZSBibG9jayB3ZSBhbGxvY2F0ZWQgKi8KKwluZXdibG9jayA9IGV4dF9wYmxvY2soJm5ld2V4KTsKKwlfX3NldF9iaXQoQkhfTmV3LCAmYmhfcmVzdWx0LT5iX3N0YXRlKTsKKworCWV4dDRfZXh0X3B1dF9pbl9jYWNoZShpbm9kZSwgaWJsb2NrLCBhbGxvY2F0ZWQsIG5ld2Jsb2NrLAorCQkJCUVYVDRfRVhUX0NBQ0hFX0VYVEVOVCk7CitvdXQ6CisJaWYgKGFsbG9jYXRlZCA+IG1heF9ibG9ja3MpCisJCWFsbG9jYXRlZCA9IG1heF9ibG9ja3M7CisJZXh0NF9leHRfc2hvd19sZWFmKGlub2RlLCBwYXRoKTsKKwlfX3NldF9iaXQoQkhfTWFwcGVkLCAmYmhfcmVzdWx0LT5iX3N0YXRlKTsKKwliaF9yZXN1bHQtPmJfYmRldiA9IGlub2RlLT5pX3NiLT5zX2JkZXY7CisJYmhfcmVzdWx0LT5iX2Jsb2NrbnIgPSBuZXdibG9jazsKK291dDI6CisJaWYgKHBhdGgpIHsKKwkJZXh0NF9leHRfZHJvcF9yZWZzKHBhdGgpOworCQlrZnJlZShwYXRoKTsKKwl9CisJbXV0ZXhfdW5sb2NrKCZFWFQ0X0koaW5vZGUpLT50cnVuY2F0ZV9tdXRleCk7CisKKwlyZXR1cm4gZXJyID8gZXJyIDogYWxsb2NhdGVkOworfQorCit2b2lkIGV4dDRfZXh0X3RydW5jYXRlKHN0cnVjdCBpbm9kZSAqIGlub2RlLCBzdHJ1Y3QgcGFnZSAqcGFnZSkKK3sKKwlzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZyA9IGlub2RlLT5pX21hcHBpbmc7CisJc3RydWN0IHN1cGVyX2Jsb2NrICpzYiA9IGlub2RlLT5pX3NiOworCXVuc2lnbmVkIGxvbmcgbGFzdF9ibG9jazsKKwloYW5kbGVfdCAqaGFuZGxlOworCWludCBlcnIgPSAwOworCisJLyoKKwkgKiBwcm9iYWJseSBmaXJzdCBleHRlbnQgd2UncmUgZ29ubmEgZnJlZSB3aWxsIGJlIGxhc3QgaW4gYmxvY2sKKwkgKi8KKwllcnIgPSBleHQ0X3dyaXRlcGFnZV90cmFuc19ibG9ja3MoaW5vZGUpICsgMzsKKwloYW5kbGUgPSBleHQ0X2pvdXJuYWxfc3RhcnQoaW5vZGUsIGVycik7CisJaWYgKElTX0VSUihoYW5kbGUpKSB7CisJCWlmIChwYWdlKSB7CisJCQljbGVhcl9oaWdocGFnZShwYWdlKTsKKwkJCWZsdXNoX2RjYWNoZV9wYWdlKHBhZ2UpOworCQkJdW5sb2NrX3BhZ2UocGFnZSk7CisJCQlwYWdlX2NhY2hlX3JlbGVhc2UocGFnZSk7CisJCX0KKwkJcmV0dXJuOworCX0KKworCWlmIChwYWdlKQorCQlleHQ0X2Jsb2NrX3RydW5jYXRlX3BhZ2UoaGFuZGxlLCBwYWdlLCBtYXBwaW5nLCBpbm9kZS0+aV9zaXplKTsKKworCW11dGV4X2xvY2soJkVYVDRfSShpbm9kZSktPnRydW5jYXRlX211dGV4KTsKKwlleHQ0X2V4dF9pbnZhbGlkYXRlX2NhY2hlKGlub2RlKTsKKworCS8qCisJICogVE9ETzogb3B0aW1pemF0aW9uIGlzIHBvc3NpYmxlIGhlcmUuCisJICogUHJvYmFibHkgd2UgbmVlZCBub3Qgc2NhbiBhdCBhbGwsCisJICogYmVjYXVzZSBwYWdlIHRydW5jYXRpb24gaXMgZW5vdWdoLgorCSAqLworCWlmIChleHQ0X29ycGhhbl9hZGQoaGFuZGxlLCBpbm9kZSkpCisJCWdvdG8gb3V0X3N0b3A7CisKKwkvKiB3ZSBoYXZlIHRvIGtub3cgd2hlcmUgdG8gdHJ1bmNhdGUgZnJvbSBpbiBjcmFzaCBjYXNlICovCisJRVhUNF9JKGlub2RlKS0+aV9kaXNrc2l6ZSA9IGlub2RlLT5pX3NpemU7CisJZXh0NF9tYXJrX2lub2RlX2RpcnR5KGhhbmRsZSwgaW5vZGUpOworCisJbGFzdF9ibG9jayA9IChpbm9kZS0+aV9zaXplICsgc2ItPnNfYmxvY2tzaXplIC0gMSkKKwkJCT4+IEVYVDRfQkxPQ0tfU0laRV9CSVRTKHNiKTsKKwllcnIgPSBleHQ0X2V4dF9yZW1vdmVfc3BhY2UoaW5vZGUsIGxhc3RfYmxvY2spOworCisJLyogSW4gYSBtdWx0aS10cmFuc2FjdGlvbiB0cnVuY2F0ZSwgd2Ugb25seSBtYWtlIHRoZSBmaW5hbAorCSAqIHRyYW5zYWN0aW9uIHN5bmNocm9ub3VzLiAqLworCWlmIChJU19TWU5DKGlub2RlKSkKKwkJaGFuZGxlLT5oX3N5bmMgPSAxOworCitvdXRfc3RvcDoKKwkvKgorCSAqIElmIHRoaXMgd2FzIGEgc2ltcGxlIGZ0cnVuY2F0ZSgpIGFuZCB0aGUgZmlsZSB3aWxsIHJlbWFpbiBhbGl2ZSwKKwkgKiB0aGVuIHdlIG5lZWQgdG8gY2xlYXIgdXAgdGhlIG9ycGhhbiByZWNvcmQgd2hpY2ggd2UgY3JlYXRlZCBhYm92ZS4KKwkgKiBIb3dldmVyLCBpZiB0aGlzIHdhcyBhIHJlYWwgdW5saW5rIHRoZW4gd2Ugd2VyZSBjYWxsZWQgYnkKKwkgKiBleHQ0X2RlbGV0ZV9pbm9kZSgpLCBhbmQgd2UgYWxsb3cgdGhhdCBmdW5jdGlvbiB0byBjbGVhbiB1cCB0aGUKKwkgKiBvcnBoYW4gaW5mbyBmb3IgdXMuCisJICovCisJaWYgKGlub2RlLT5pX25saW5rKQorCQlleHQ0X29ycGhhbl9kZWwoaGFuZGxlLCBpbm9kZSk7CisKKwltdXRleF91bmxvY2soJkVYVDRfSShpbm9kZSktPnRydW5jYXRlX211dGV4KTsKKwlleHQ0X2pvdXJuYWxfc3RvcChoYW5kbGUpOworfQorCisvKgorICogZXh0NF9leHRfd3JpdGVwYWdlX3RyYW5zX2Jsb2NrczoKKyAqIGNhbGN1bGF0ZSBtYXggbnVtYmVyIG9mIGJsb2NrcyB3ZSBjb3VsZCBtb2RpZnkKKyAqIGluIG9yZGVyIHRvIGFsbG9jYXRlIG5ldyBibG9jayBmb3IgYW4gaW5vZGUKKyAqLworaW50IGV4dDRfZXh0X3dyaXRlcGFnZV90cmFuc19ibG9ja3Moc3RydWN0IGlub2RlICppbm9kZSwgaW50IG51bSkKK3sKKwlpbnQgbmVlZGVkOworCisJbmVlZGVkID0gZXh0NF9leHRfY2FsY19jcmVkaXRzX2Zvcl9pbnNlcnQoaW5vZGUsIE5VTEwpOworCisJLyogY2FsbGVyIHdhbnRzIHRvIGFsbG9jYXRlIG51bSBibG9ja3MsIGJ1dCBub3RlIGl0IGluY2x1ZGVzIHNiICovCisJbmVlZGVkID0gbmVlZGVkICogbnVtIC0gKG51bSAtIDEpOworCisjaWZkZWYgQ09ORklHX1FVT1RBCisJbmVlZGVkICs9IDIgKiBFWFQ0X1FVT1RBX1RSQU5TX0JMT0NLUyhpbm9kZS0+aV9zYik7CisjZW5kaWYKKworCXJldHVybiBuZWVkZWQ7Cit9CisKK0VYUE9SVF9TWU1CT0woZXh0NF9tYXJrX2lub2RlX2RpcnR5KTsKK0VYUE9SVF9TWU1CT0woZXh0NF9leHRfaW52YWxpZGF0ZV9jYWNoZSk7CitFWFBPUlRfU1lNQk9MKGV4dDRfZXh0X2luc2VydF9leHRlbnQpOworRVhQT1JUX1NZTUJPTChleHQ0X2V4dF93YWxrX3NwYWNlKTsKK0VYUE9SVF9TWU1CT0woZXh0NF9leHRfZmluZF9nb2FsKTsKK0VYUE9SVF9TWU1CT0woZXh0NF9leHRfY2FsY19jcmVkaXRzX2Zvcl9pbnNlcnQpOworCmRpZmYgLS1naXQgYS9mcy9leHQ0L2ZpbGUuYyBiL2ZzL2V4dDQvZmlsZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBiNjIyYzAKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9leHQ0L2ZpbGUuYwpAQCAtMCwwICsxLDEzOSBAQAorLyoKKyAqICBsaW51eC9mcy9leHQ0L2ZpbGUuYworICoKKyAqIENvcHlyaWdodCAoQykgMTk5MiwgMTk5MywgMTk5NCwgMTk5NQorICogUmVteSBDYXJkIChjYXJkQG1hc2kuaWJwLmZyKQorICogTGFib3JhdG9pcmUgTUFTSSAtIEluc3RpdHV0IEJsYWlzZSBQYXNjYWwKKyAqIFVuaXZlcnNpdGUgUGllcnJlIGV0IE1hcmllIEN1cmllIChQYXJpcyBWSSkKKyAqCisgKiAgZnJvbQorICoKKyAqICBsaW51eC9mcy9taW5peC9maWxlLmMKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAxOTkxLCAxOTkyICBMaW51cyBUb3J2YWxkcworICoKKyAqICBleHQ0IGZzIHJlZ3VsYXIgZmlsZSBoYW5kbGluZyBwcmltaXRpdmVzCisgKgorICogIDY0LWJpdCBmaWxlIHN1cHBvcnQgb24gNjQtYml0IHBsYXRmb3JtcyBieSBKYWt1YiBKZWxpbmVrCisgKgkoampAc3Vuc2l0ZS5tcy5tZmYuY3VuaS5jeikKKyAqLworCisjaW5jbHVkZSA8bGludXgvdGltZS5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvamJkMi5oPgorI2luY2x1ZGUgPGxpbnV4L2V4dDRfZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9leHQ0X2piZDIuaD4KKyNpbmNsdWRlICJ4YXR0ci5oIgorI2luY2x1ZGUgImFjbC5oIgorCisvKgorICogQ2FsbGVkIHdoZW4gYW4gaW5vZGUgaXMgcmVsZWFzZWQuIE5vdGUgdGhhdCB0aGlzIGlzIGRpZmZlcmVudAorICogZnJvbSBleHQ0X2ZpbGVfb3Blbjogb3BlbiBnZXRzIGNhbGxlZCBhdCBldmVyeSBvcGVuLCBidXQgcmVsZWFzZQorICogZ2V0cyBjYWxsZWQgb25seSB3aGVuIC9hbGwvIHRoZSBmaWxlcyBhcmUgY2xvc2VkLgorICovCitzdGF0aWMgaW50IGV4dDRfcmVsZWFzZV9maWxlIChzdHJ1Y3QgaW5vZGUgKiBpbm9kZSwgc3RydWN0IGZpbGUgKiBmaWxwKQoreworCS8qIGlmIHdlIGFyZSB0aGUgbGFzdCB3cml0ZXIgb24gdGhlIGlub2RlLCBkcm9wIHRoZSBibG9jayByZXNlcnZhdGlvbiAqLworCWlmICgoZmlscC0+Zl9tb2RlICYgRk1PREVfV1JJVEUpICYmCisJCQkoYXRvbWljX3JlYWQoJmlub2RlLT5pX3dyaXRlY291bnQpID09IDEpKQorCXsKKwkJbXV0ZXhfbG9jaygmRVhUNF9JKGlub2RlKS0+dHJ1bmNhdGVfbXV0ZXgpOworCQlleHQ0X2Rpc2NhcmRfcmVzZXJ2YXRpb24oaW5vZGUpOworCQltdXRleF91bmxvY2soJkVYVDRfSShpbm9kZSktPnRydW5jYXRlX211dGV4KTsKKwl9CisJaWYgKGlzX2R4KGlub2RlKSAmJiBmaWxwLT5wcml2YXRlX2RhdGEpCisJCWV4dDRfaHRyZWVfZnJlZV9kaXJfaW5mbyhmaWxwLT5wcml2YXRlX2RhdGEpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzc2l6ZV90CitleHQ0X2ZpbGVfd3JpdGUoc3RydWN0IGtpb2NiICppb2NiLCBjb25zdCBzdHJ1Y3QgaW92ZWMgKmlvdiwKKwkJdW5zaWduZWQgbG9uZyBucl9zZWdzLCBsb2ZmX3QgcG9zKQoreworCXN0cnVjdCBmaWxlICpmaWxlID0gaW9jYi0+a2lfZmlscDsKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZmlsZS0+Zl9kZW50cnktPmRfaW5vZGU7CisJc3NpemVfdCByZXQ7CisJaW50IGVycjsKKworCXJldCA9IGdlbmVyaWNfZmlsZV9haW9fd3JpdGUoaW9jYiwgaW92LCBucl9zZWdzLCBwb3MpOworCisJLyoKKwkgKiBTa2lwIGZsdXNoaW5nIGlmIHRoZXJlIHdhcyBhbiBlcnJvciwgb3IgaWYgbm90aGluZyB3YXMgd3JpdHRlbi4KKwkgKi8KKwlpZiAocmV0IDw9IDApCisJCXJldHVybiByZXQ7CisKKwkvKgorCSAqIElmIHRoZSBpbm9kZSBpcyBJU19TWU5DLCBvciBpcyBPX1NZTkMgYW5kIHdlIGFyZSBkb2luZyBkYXRhCisJICogam91cm5hbGxpbmcgdGhlbiB3ZSBuZWVkIHRvIG1ha2Ugc3VyZSB0aGF0IHdlIGZvcmNlIHRoZSB0cmFuc2FjdGlvbgorCSAqIHRvIGRpc2sgdG8ga2VlcCBhbGwgbWV0YWRhdGEgdXB0b2RhdGUgc3luY2hyb25vdXNseS4KKwkgKi8KKwlpZiAoZmlsZS0+Zl9mbGFncyAmIE9fU1lOQykgeworCQkvKgorCQkgKiBJZiB3ZSBhcmUgbm9uLWRhdGEtam91cm5hbGVkLCB0aGVuIHRoZSBkaXJ0eSBkYXRhIGhhcworCQkgKiBhbHJlYWR5IGJlZW4gZmx1c2hlZCB0byBiYWNraW5nIHN0b3JlIGJ5IGdlbmVyaWNfb3N5bmNfaW5vZGUsCisJCSAqIGFuZCB0aGUgaW5vZGUgaGFzIGJlZW4gZmx1c2hlZCB0b28gaWYgdGhlcmUgaGF2ZSBiZWVuIGFueQorCQkgKiBtb2RpZmljYXRpb25zIG90aGVyIHRoYW4gbWVyZSB0aW1lc3RhbXAgdXBkYXRlcy4KKwkJICoKKwkJICogT3BlbiBxdWVzdGlvbiAtLS0gZG8gd2UgY2FyZSBhYm91dCBmbHVzaGluZyB0aW1lc3RhbXBzIHRvbworCQkgKiBpZiB0aGUgaW5vZGUgaXMgSVNfU1lOQz8KKwkJICovCisJCWlmICghZXh0NF9zaG91bGRfam91cm5hbF9kYXRhKGlub2RlKSkKKwkJCXJldHVybiByZXQ7CisKKwkJZ290byBmb3JjZV9jb21taXQ7CisJfQorCisJLyoKKwkgKiBTbyB3ZSBrbm93IHRoYXQgdGhlcmUgaGFzIGJlZW4gbm8gZm9yY2VkIGRhdGEgZmx1c2guICBJZiB0aGUgaW5vZGUKKwkgKiBpcyBtYXJrZWQgSVNfU1lOQywgd2UgbmVlZCB0byBmb3JjZSBvbmUgb3Vyc2VsdmVzLgorCSAqLworCWlmICghSVNfU1lOQyhpbm9kZSkpCisJCXJldHVybiByZXQ7CisKKwkvKgorCSAqIE9wZW4gcXVlc3Rpb24gIzIgLS0tIHNob3VsZCB3ZSBmb3JjZSBkYXRhIHRvIGRpc2sgaGVyZSB0b28/ICBJZiB3ZQorCSAqIGRvbid0LCB0aGUgb25seSBpbXBhY3QgaXMgdGhhdCBkYXRhPXdyaXRlYmFjayBmaWxlc3lzdGVtcyB3b24ndAorCSAqIGZsdXNoIGRhdGEgdG8gZGlzayBhdXRvbWF0aWNhbGx5IG9uIElTX1NZTkMsIG9ubHkgbWV0YWRhdGEgKGJ1dAorCSAqIGhpc3RvcmljYWxseSwgdGhhdCBpcyB3aGF0IGV4dDIgaGFzIGRvbmUuKQorCSAqLworCitmb3JjZV9jb21taXQ6CisJZXJyID0gZXh0NF9mb3JjZV9jb21taXQoaW5vZGUtPmlfc2IpOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisJcmV0dXJuIHJldDsKK30KKworY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBleHQ0X2ZpbGVfb3BlcmF0aW9ucyA9IHsKKwkubGxzZWVrCQk9IGdlbmVyaWNfZmlsZV9sbHNlZWssCisJLnJlYWQJCT0gZG9fc3luY19yZWFkLAorCS53cml0ZQkJPSBkb19zeW5jX3dyaXRlLAorCS5haW9fcmVhZAk9IGdlbmVyaWNfZmlsZV9haW9fcmVhZCwKKwkuYWlvX3dyaXRlCT0gZXh0NF9maWxlX3dyaXRlLAorCS5pb2N0bAkJPSBleHQ0X2lvY3RsLAorI2lmZGVmIENPTkZJR19DT01QQVQKKwkuY29tcGF0X2lvY3RsCT0gZXh0NF9jb21wYXRfaW9jdGwsCisjZW5kaWYKKwkubW1hcAkJPSBnZW5lcmljX2ZpbGVfbW1hcCwKKwkub3BlbgkJPSBnZW5lcmljX2ZpbGVfb3BlbiwKKwkucmVsZWFzZQk9IGV4dDRfcmVsZWFzZV9maWxlLAorCS5mc3luYwkJPSBleHQ0X3N5bmNfZmlsZSwKKwkuc2VuZGZpbGUJPSBnZW5lcmljX2ZpbGVfc2VuZGZpbGUsCisJLnNwbGljZV9yZWFkCT0gZ2VuZXJpY19maWxlX3NwbGljZV9yZWFkLAorCS5zcGxpY2Vfd3JpdGUJPSBnZW5lcmljX2ZpbGVfc3BsaWNlX3dyaXRlLAorfTsKKworc3RydWN0IGlub2RlX29wZXJhdGlvbnMgZXh0NF9maWxlX2lub2RlX29wZXJhdGlvbnMgPSB7CisJLnRydW5jYXRlCT0gZXh0NF90cnVuY2F0ZSwKKwkuc2V0YXR0cgk9IGV4dDRfc2V0YXR0ciwKKyNpZmRlZiBDT05GSUdfRVhUNERFVl9GU19YQVRUUgorCS5zZXR4YXR0cgk9IGdlbmVyaWNfc2V0eGF0dHIsCisJLmdldHhhdHRyCT0gZ2VuZXJpY19nZXR4YXR0ciwKKwkubGlzdHhhdHRyCT0gZXh0NF9saXN0eGF0dHIsCisJLnJlbW92ZXhhdHRyCT0gZ2VuZXJpY19yZW1vdmV4YXR0ciwKKyNlbmRpZgorCS5wZXJtaXNzaW9uCT0gZXh0NF9wZXJtaXNzaW9uLAorfTsKKwpkaWZmIC0tZ2l0IGEvZnMvZXh0NC9mc3luYy5jIGIvZnMvZXh0NC9mc3luYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJhMTY3ZDcKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9leHQ0L2ZzeW5jLmMKQEAgLTAsMCArMSw4OCBAQAorLyoKKyAqICBsaW51eC9mcy9leHQ0L2ZzeW5jLmMKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAxOTkzICBTdGVwaGVuIFR3ZWVkaWUgKHNjdEByZWRoYXQuY29tKQorICogIGZyb20KKyAqICBDb3B5cmlnaHQgKEMpIDE5OTIgIFJlbXkgQ2FyZCAoY2FyZEBtYXNpLmlicC5mcikKKyAqICAgICAgICAgICAgICAgICAgICAgIExhYm9yYXRvaXJlIE1BU0kgLSBJbnN0aXR1dCBCbGFpc2UgUGFzY2FsCisgKiAgICAgICAgICAgICAgICAgICAgICBVbml2ZXJzaXRlIFBpZXJyZSBldCBNYXJpZSBDdXJpZSAoUGFyaXMgVkkpCisgKiAgZnJvbQorICogIGxpbnV4L2ZzL21pbml4L3RydW5jYXRlLmMgICBDb3B5cmlnaHQgKEMpIDE5OTEsIDE5OTIgIExpbnVzIFRvcnZhbGRzCisgKgorICogIGV4dDRmcyBmc3luYyBwcmltaXRpdmUKKyAqCisgKiAgQmlnLWVuZGlhbiB0byBsaXR0bGUtZW5kaWFuIGJ5dGUtc3dhcHBpbmcvYml0bWFwcyBieQorICogICAgICAgIERhdmlkIFMuIE1pbGxlciAoZGF2ZW1AY2FpcC5ydXRnZXJzLmVkdSksIDE5OTUKKyAqCisgKiAgUmVtb3ZlZCB1bm5lY2Vzc2FyeSBjb2RlIGR1cGxpY2F0aW9uIGZvciBsaXR0bGUgZW5kaWFuIG1hY2hpbmVzCisgKiAgYW5kIGV4Y2Vzc2l2ZSBfX2lubGluZV9fcy4KKyAqICAgICAgICBBbmRpIEtsZWVuLCAxOTk3CisgKgorICogTWFqb3Igc2ltcGxpY2F0aW9ucyBhbmQgY2xlYW51cCAtIHdlIG9ubHkgbmVlZCB0byBkbyB0aGUgbWV0YWRhdGEsIGJlY2F1c2UKKyAqIHdlIGNhbiBkZXBlbmQgb24gZ2VuZXJpY19ibG9ja19mZGF0YXN5bmMoKSB0byBzeW5jIHRoZSBkYXRhIGJsb2Nrcy4KKyAqLworCisjaW5jbHVkZSA8bGludXgvdGltZS5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC93cml0ZWJhY2suaD4KKyNpbmNsdWRlIDxsaW51eC9qYmQyLmg+CisjaW5jbHVkZSA8bGludXgvZXh0NF9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L2V4dDRfamJkMi5oPgorCisvKgorICogYWtwbTogQSBuZXcgZGVzaWduIGZvciBleHQ0X3N5bmNfZmlsZSgpLgorICoKKyAqIFRoaXMgaXMgb25seSBjYWxsZWQgZnJvbSBzeXNfZnN5bmMoKSwgc3lzX2ZkYXRhc3luYygpIGFuZCBzeXNfbXN5bmMoKS4KKyAqIFRoZXJlIGNhbm5vdCBiZSBhIHRyYW5zYWN0aW9uIG9wZW4gYnkgdGhpcyB0YXNrLgorICogQW5vdGhlciB0YXNrIGNvdWxkIGhhdmUgZGlydGllZCB0aGlzIGlub2RlLiAgSXRzIGRhdGEgY2FuIGJlIGluIGFueQorICogc3RhdGUgaW4gdGhlIGpvdXJuYWxsaW5nIHN5c3RlbS4KKyAqCisgKiBXaGF0IHdlIGRvIGlzIGp1c3Qga2ljayBvZmYgYSBjb21taXQgYW5kIHdhaXQgb24gaXQuICBUaGlzIHdpbGwgc25hcHNob3QgdGhlCisgKiBpbm9kZSB0byBkaXNrLgorICovCisKK2ludCBleHQ0X3N5bmNfZmlsZShzdHJ1Y3QgZmlsZSAqIGZpbGUsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgaW50IGRhdGFzeW5jKQoreworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBkZW50cnktPmRfaW5vZGU7CisJaW50IHJldCA9IDA7CisKKwlKX0FTU0VSVChleHQ0X2pvdXJuYWxfY3VycmVudF9oYW5kbGUoKSA9PSAwKTsKKworCS8qCisJICogZGF0YT13cml0ZWJhY2s6CisJICogIFRoZSBjYWxsZXIncyBmaWxlbWFwX2ZkYXRhd3JpdGUoKS93YWl0IHdpbGwgc3luYyB0aGUgZGF0YS4KKwkgKiAgc3luY19pbm9kZSgpIHdpbGwgc3luYyB0aGUgbWV0YWRhdGEKKwkgKgorCSAqIGRhdGE9b3JkZXJlZDoKKwkgKiAgVGhlIGNhbGxlcidzIGZpbGVtYXBfZmRhdGF3cml0ZSgpIHdpbGwgd3JpdGUgdGhlIGRhdGEgYW5kCisJICogIHN5bmNfaW5vZGUoKSB3aWxsIHdyaXRlIHRoZSBpbm9kZSBpZiBpdCBpcyBkaXJ0eS4gIFRoZW4gdGhlIGNhbGxlcidzCisJICogIGZpbGVtYXBfZmRhdGF3YWl0KCkgd2lsbCB3YWl0IG9uIHRoZSBwYWdlcy4KKwkgKgorCSAqIGRhdGE9am91cm5hbDoKKwkgKiAgZmlsZW1hcF9mZGF0YXdyaXRlIHdvbid0IGRvIGFueXRoaW5nICh0aGUgYnVmZmVycyBhcmUgY2xlYW4pLgorCSAqICBleHQ0X2ZvcmNlX2NvbW1pdCB3aWxsIHdyaXRlIHRoZSBmaWxlIGRhdGEgaW50byB0aGUgam91cm5hbCBhbmQKKwkgKiAgd2lsbCB3YWl0IG9uIHRoYXQuCisJICogIGZpbGVtYXBfZmRhdGF3YWl0KCkgd2lsbCBlbmNvdW50ZXIgYSB0b24gb2YgbmV3bHktZGlydGllZCBwYWdlcworCSAqICAodGhleSB3ZXJlIGRpcnRpZWQgYnkgY29tbWl0KS4gIEJ1dCB0aGF0J3MgT0sgLSB0aGUgYmxvY2tzIGFyZQorCSAqICBzYWZlIGluLWpvdXJuYWwsIHdoaWNoIGlzIGFsbCBmc3luYygpIG5lZWRzIHRvIGVuc3VyZS4KKwkgKi8KKwlpZiAoZXh0NF9zaG91bGRfam91cm5hbF9kYXRhKGlub2RlKSkgeworCQlyZXQgPSBleHQ0X2ZvcmNlX2NvbW1pdChpbm9kZS0+aV9zYik7CisJCWdvdG8gb3V0OworCX0KKworCS8qCisJICogVGhlIFZGUyBoYXMgd3JpdHRlbiB0aGUgZmlsZSBkYXRhLiAgSWYgdGhlIGlub2RlIGlzIHVuYWx0ZXJlZAorCSAqIHRoZW4gd2UgbmVlZCBub3Qgc3RhcnQgYSBjb21taXQuCisJICovCisJaWYgKGlub2RlLT5pX3N0YXRlICYgKElfRElSVFlfU1lOQ3xJX0RJUlRZX0RBVEFTWU5DKSkgeworCQlzdHJ1Y3Qgd3JpdGViYWNrX2NvbnRyb2wgd2JjID0geworCQkJLnN5bmNfbW9kZSA9IFdCX1NZTkNfQUxMLAorCQkJLm5yX3RvX3dyaXRlID0gMCwgLyogc3lzX2ZzeW5jIGRpZCB0aGlzICovCisJCX07CisJCXJldCA9IHN5bmNfaW5vZGUoaW5vZGUsICZ3YmMpOworCX0KK291dDoKKwlyZXR1cm4gcmV0OworfQpkaWZmIC0tZ2l0IGEvZnMvZXh0NC9oYXNoLmMgYi9mcy9leHQ0L2hhc2guYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNjc5NjYzCi0tLSAvZGV2L251bGwKKysrIGIvZnMvZXh0NC9oYXNoLmMKQEAgLTAsMCArMSwxNTIgQEAKKy8qCisgKiAgbGludXgvZnMvZXh0NC9oYXNoLmMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDIgYnkgVGhlb2RvcmUgVHMnbworICoKKyAqIFRoaXMgZmlsZSBpcyByZWxlYXNlZCB1bmRlciB0aGUgR1BMIHYyLgorICoKKyAqIFRoaXMgZmlsZSBtYXkgYmUgcmVkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBQdWJsaWMKKyAqIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvamJkMi5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvZXh0NF9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L2NyeXB0b2hhc2guaD4KKworI2RlZmluZSBERUxUQSAweDlFMzc3OUI5CisKK3N0YXRpYyB2b2lkIFRFQV90cmFuc2Zvcm0oX191MzIgYnVmWzRdLCBfX3UzMiBjb25zdCBpbltdKQoreworCV9fdTMyCXN1bSA9IDA7CisJX191MzIJYjAgPSBidWZbMF0sIGIxID0gYnVmWzFdOworCV9fdTMyCWEgPSBpblswXSwgYiA9IGluWzFdLCBjID0gaW5bMl0sIGQgPSBpblszXTsKKwlpbnQJbiA9IDE2OworCisJZG8geworCQlzdW0gKz0gREVMVEE7CisJCWIwICs9ICgoYjEgPDwgNCkrYSkgXiAoYjErc3VtKSBeICgoYjEgPj4gNSkrYik7CisJCWIxICs9ICgoYjAgPDwgNCkrYykgXiAoYjArc3VtKSBeICgoYjAgPj4gNSkrZCk7CisJfSB3aGlsZSgtLW4pOworCisJYnVmWzBdICs9IGIwOworCWJ1ZlsxXSArPSBiMTsKK30KKworCisvKiBUaGUgb2xkIGxlZ2FjeSBoYXNoICovCitzdGF0aWMgX191MzIgZHhfaGFja19oYXNoIChjb25zdCBjaGFyICpuYW1lLCBpbnQgbGVuKQoreworCV9fdTMyIGhhc2gwID0gMHgxMmEzZmUyZCwgaGFzaDEgPSAweDM3YWJlOGY5OworCXdoaWxlIChsZW4tLSkgeworCQlfX3UzMiBoYXNoID0gaGFzaDEgKyAoaGFzaDAgXiAoKm5hbWUrKyAqIDcxNTIzNzMpKTsKKworCQlpZiAoaGFzaCAmIDB4ODAwMDAwMDApIGhhc2ggLT0gMHg3ZmZmZmZmZjsKKwkJaGFzaDEgPSBoYXNoMDsKKwkJaGFzaDAgPSBoYXNoOworCX0KKwlyZXR1cm4gKGhhc2gwIDw8IDEpOworfQorCitzdGF0aWMgdm9pZCBzdHIyaGFzaGJ1Zihjb25zdCBjaGFyICptc2csIGludCBsZW4sIF9fdTMyICpidWYsIGludCBudW0pCit7CisJX191MzIJcGFkLCB2YWw7CisJaW50CWk7CisKKwlwYWQgPSAoX191MzIpbGVuIHwgKChfX3UzMilsZW4gPDwgOCk7CisJcGFkIHw9IHBhZCA8PCAxNjsKKworCXZhbCA9IHBhZDsKKwlpZiAobGVuID4gbnVtKjQpCisJCWxlbiA9IG51bSAqIDQ7CisJZm9yIChpPTA7IGkgPCBsZW47IGkrKykgeworCQlpZiAoKGkgJSA0KSA9PSAwKQorCQkJdmFsID0gcGFkOworCQl2YWwgPSBtc2dbaV0gKyAodmFsIDw8IDgpOworCQlpZiAoKGkgJSA0KSA9PSAzKSB7CisJCQkqYnVmKysgPSB2YWw7CisJCQl2YWwgPSBwYWQ7CisJCQludW0tLTsKKwkJfQorCX0KKwlpZiAoLS1udW0gPj0gMCkKKwkJKmJ1ZisrID0gdmFsOworCXdoaWxlICgtLW51bSA+PSAwKQorCQkqYnVmKysgPSBwYWQ7Cit9CisKKy8qCisgKiBSZXR1cm5zIHRoZSBoYXNoIG9mIGEgZmlsZW5hbWUuICBJZiBsZW4gaXMgMCBhbmQgbmFtZSBpcyBOVUxMLCB0aGVuCisgKiB0aGlzIGZ1bmN0aW9uIGNhbiBiZSB1c2VkIHRvIHRlc3Qgd2hldGhlciBvciBub3QgYSBoYXNoIHZlcnNpb24gaXMKKyAqIHN1cHBvcnRlZC4KKyAqCisgKiBUaGUgc2VlZCBpcyBhbiA0IGxvbmd3b3JkICgzMiBiaXRzKSAic2VjcmV0IiB3aGljaCBjYW4gYmUgdXNlZCB0bworICogdW5pcXVpZnkgYSBoYXNoLiAgSWYgdGhlIHNlZWQgaXMgYWxsIHplcm8ncywgdGhlbiBzb21lIGRlZmF1bHQgc2VlZAorICogbWF5IGJlIHVzZWQuCisgKgorICogQSBwYXJ0aWN1bGFyIGhhc2ggdmVyc2lvbiBzcGVjaWZpZXMgd2hldGhlciBvciBub3QgdGhlIHNlZWQgaXMKKyAqIHJlcHJlc2VudGVkLCBhbmQgd2hldGhlciBvciBub3QgdGhlIHJldHVybmVkIGhhc2ggaXMgMzIgYml0cyBvciA2NAorICogYml0cy4gIDMyIGJpdCBoYXNoZXMgd2lsbCByZXR1cm4gMCBmb3IgdGhlIG1pbm9yIGhhc2guCisgKi8KK2ludCBleHQ0ZnNfZGlyaGFzaChjb25zdCBjaGFyICpuYW1lLCBpbnQgbGVuLCBzdHJ1Y3QgZHhfaGFzaF9pbmZvICpoaW5mbykKK3sKKwlfX3UzMgloYXNoOworCV9fdTMyCW1pbm9yX2hhc2ggPSAwOworCWNvbnN0IGNoYXIJKnA7CisJaW50CQlpOworCV9fdTMyCQlpbls4XSwgYnVmWzRdOworCisJLyogSW5pdGlhbGl6ZSB0aGUgZGVmYXVsdCBzZWVkIGZvciB0aGUgaGFzaCBjaGVja3N1bSBmdW5jdGlvbnMgKi8KKwlidWZbMF0gPSAweDY3NDUyMzAxOworCWJ1ZlsxXSA9IDB4ZWZjZGFiODk7CisJYnVmWzJdID0gMHg5OGJhZGNmZTsKKwlidWZbM10gPSAweDEwMzI1NDc2OworCisJLyogQ2hlY2sgdG8gc2VlIGlmIHRoZSBzZWVkIGlzIGFsbCB6ZXJvJ3MgKi8KKwlpZiAoaGluZm8tPnNlZWQpIHsKKwkJZm9yIChpPTA7IGkgPCA0OyBpKyspIHsKKwkJCWlmIChoaW5mby0+c2VlZFtpXSkKKwkJCQlicmVhazsKKwkJfQorCQlpZiAoaSA8IDQpCisJCQltZW1jcHkoYnVmLCBoaW5mby0+c2VlZCwgc2l6ZW9mKGJ1ZikpOworCX0KKworCXN3aXRjaCAoaGluZm8tPmhhc2hfdmVyc2lvbikgeworCWNhc2UgRFhfSEFTSF9MRUdBQ1k6CisJCWhhc2ggPSBkeF9oYWNrX2hhc2gobmFtZSwgbGVuKTsKKwkJYnJlYWs7CisJY2FzZSBEWF9IQVNIX0hBTEZfTUQ0OgorCQlwID0gbmFtZTsKKwkJd2hpbGUgKGxlbiA+IDApIHsKKwkJCXN0cjJoYXNoYnVmKHAsIGxlbiwgaW4sIDgpOworCQkJaGFsZl9tZDRfdHJhbnNmb3JtKGJ1ZiwgaW4pOworCQkJbGVuIC09IDMyOworCQkJcCArPSAzMjsKKwkJfQorCQltaW5vcl9oYXNoID0gYnVmWzJdOworCQloYXNoID0gYnVmWzFdOworCQlicmVhazsKKwljYXNlIERYX0hBU0hfVEVBOgorCQlwID0gbmFtZTsKKwkJd2hpbGUgKGxlbiA+IDApIHsKKwkJCXN0cjJoYXNoYnVmKHAsIGxlbiwgaW4sIDQpOworCQkJVEVBX3RyYW5zZm9ybShidWYsIGluKTsKKwkJCWxlbiAtPSAxNjsKKwkJCXAgKz0gMTY7CisJCX0KKwkJaGFzaCA9IGJ1ZlswXTsKKwkJbWlub3JfaGFzaCA9IGJ1ZlsxXTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJaGluZm8tPmhhc2ggPSAwOworCQlyZXR1cm4gLTE7CisJfQorCWhhc2ggPSBoYXNoICYgfjE7CisJaWYgKGhhc2ggPT0gKEVYVDRfSFRSRUVfRU9GIDw8IDEpKQorCQloYXNoID0gKEVYVDRfSFRSRUVfRU9GLTEpIDw8IDE7CisJaGluZm8tPmhhc2ggPSBoYXNoOworCWhpbmZvLT5taW5vcl9oYXNoID0gbWlub3JfaGFzaDsKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2ZzL2V4dDQvaWFsbG9jLmMgYi9mcy9leHQ0L2lhbGxvYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM4OGI0MzkKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9leHQ0L2lhbGxvYy5jCkBAIC0wLDAgKzEsNzcyIEBACisvKgorICogIGxpbnV4L2ZzL2V4dDQvaWFsbG9jLmMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTIsIDE5OTMsIDE5OTQsIDE5OTUKKyAqIFJlbXkgQ2FyZCAoY2FyZEBtYXNpLmlicC5mcikKKyAqIExhYm9yYXRvaXJlIE1BU0kgLSBJbnN0aXR1dCBCbGFpc2UgUGFzY2FsCisgKiBVbml2ZXJzaXRlIFBpZXJyZSBldCBNYXJpZSBDdXJpZSAoUGFyaXMgVkkpCisgKgorICogIEJTRCB1ZnMtaW5zcGlyZWQgaW5vZGUgYW5kIGRpcmVjdG9yeSBhbGxvY2F0aW9uIGJ5CisgKiAgU3RlcGhlbiBUd2VlZGllIChzY3RAcmVkaGF0LmNvbSksIDE5OTMKKyAqICBCaWctZW5kaWFuIHRvIGxpdHRsZS1lbmRpYW4gYnl0ZS1zd2FwcGluZy9iaXRtYXBzIGJ5CisgKiAgICAgICAgRGF2aWQgUy4gTWlsbGVyIChkYXZlbUBjYWlwLnJ1dGdlcnMuZWR1KSwgMTk5NQorICovCisKKyNpbmNsdWRlIDxsaW51eC90aW1lLmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9qYmQyLmg+CisjaW5jbHVkZSA8bGludXgvZXh0NF9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L2V4dDRfamJkMi5oPgorI2luY2x1ZGUgPGxpbnV4L3N0YXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9xdW90YW9wcy5oPgorI2luY2x1ZGUgPGxpbnV4L2J1ZmZlcl9oZWFkLmg+CisjaW5jbHVkZSA8bGludXgvcmFuZG9tLmg+CisjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CisjaW5jbHVkZSA8bGludXgvYmxrZGV2Lmg+CisjaW5jbHVkZSA8YXNtL2J5dGVvcmRlci5oPgorCisjaW5jbHVkZSAieGF0dHIuaCIKKyNpbmNsdWRlICJhY2wuaCIKKworLyoKKyAqIGlhbGxvYy5jIGNvbnRhaW5zIHRoZSBpbm9kZXMgYWxsb2NhdGlvbiBhbmQgZGVhbGxvY2F0aW9uIHJvdXRpbmVzCisgKi8KKworLyoKKyAqIFRoZSBmcmVlIGlub2RlcyBhcmUgbWFuYWdlZCBieSBiaXRtYXBzLiAgQSBmaWxlIHN5c3RlbSBjb250YWlucyBzZXZlcmFsCisgKiBibG9ja3MgZ3JvdXBzLiAgRWFjaCBncm91cCBjb250YWlucyAxIGJpdG1hcCBibG9jayBmb3IgYmxvY2tzLCAxIGJpdG1hcAorICogYmxvY2sgZm9yIGlub2RlcywgTiBibG9ja3MgZm9yIHRoZSBpbm9kZSB0YWJsZSBhbmQgZGF0YSBibG9ja3MuCisgKgorICogVGhlIGZpbGUgc3lzdGVtIGNvbnRhaW5zIGdyb3VwIGRlc2NyaXB0b3JzIHdoaWNoIGFyZSBsb2NhdGVkIGFmdGVyIHRoZQorICogc3VwZXIgYmxvY2suICBFYWNoIGRlc2NyaXB0b3IgY29udGFpbnMgdGhlIG51bWJlciBvZiB0aGUgYml0bWFwIGJsb2NrIGFuZAorICogdGhlIGZyZWUgYmxvY2tzIGNvdW50IGluIHRoZSBibG9jay4KKyAqLworCisKKy8qCisgKiBSZWFkIHRoZSBpbm9kZSBhbGxvY2F0aW9uIGJpdG1hcCBmb3IgYSBnaXZlbiBibG9ja19ncm91cCwgcmVhZGluZworICogaW50byB0aGUgc3BlY2lmaWVkIHNsb3QgaW4gdGhlIHN1cGVyYmxvY2sncyBiaXRtYXAgY2FjaGUuCisgKgorICogUmV0dXJuIGJ1ZmZlcl9oZWFkIG9mIGJpdG1hcCBvbiBzdWNjZXNzIG9yIE5VTEwuCisgKi8KK3N0YXRpYyBzdHJ1Y3QgYnVmZmVyX2hlYWQgKgorcmVhZF9pbm9kZV9iaXRtYXAoc3RydWN0IHN1cGVyX2Jsb2NrICogc2IsIHVuc2lnbmVkIGxvbmcgYmxvY2tfZ3JvdXApCit7CisJc3RydWN0IGV4dDRfZ3JvdXBfZGVzYyAqZGVzYzsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoID0gTlVMTDsKKworCWRlc2MgPSBleHQ0X2dldF9ncm91cF9kZXNjKHNiLCBibG9ja19ncm91cCwgTlVMTCk7CisJaWYgKCFkZXNjKQorCQlnb3RvIGVycm9yX291dDsKKworCWJoID0gc2JfYnJlYWQoc2IsIGV4dDRfaW5vZGVfYml0bWFwKHNiLCBkZXNjKSk7CisJaWYgKCFiaCkKKwkJZXh0NF9lcnJvcihzYiwgInJlYWRfaW5vZGVfYml0bWFwIiwKKwkJCSAgICAiQ2Fubm90IHJlYWQgaW5vZGUgYml0bWFwIC0gIgorCQkJICAgICJibG9ja19ncm91cCA9ICVsdSwgaW5vZGVfYml0bWFwID0gJWxsdSIsCisJCQkgICAgYmxvY2tfZ3JvdXAsIGV4dDRfaW5vZGVfYml0bWFwKHNiLCBkZXNjKSk7CitlcnJvcl9vdXQ6CisJcmV0dXJuIGJoOworfQorCisvKgorICogTk9URSEgV2hlbiB3ZSBnZXQgdGhlIGlub2RlLCB3ZSdyZSB0aGUgb25seSBwZW9wbGUKKyAqIHRoYXQgaGF2ZSBhY2Nlc3MgdG8gaXQsIGFuZCBhcyBzdWNoIHRoZXJlIGFyZSBubworICogcmFjZSBjb25kaXRpb25zIHdlIGhhdmUgdG8gd29ycnkgYWJvdXQuIFRoZSBpbm9kZQorICogaXMgbm90IG9uIHRoZSBoYXNoLWxpc3RzLCBhbmQgaXQgY2Fubm90IGJlIHJlYWNoZWQKKyAqIHRocm91Z2ggdGhlIGZpbGVzeXN0ZW0gYmVjYXVzZSB0aGUgZGlyZWN0b3J5IGVudHJ5CisgKiBoYXMgYmVlbiBkZWxldGVkIGVhcmxpZXIuCisgKgorICogSE9XRVZFUjogd2UgbXVzdCBtYWtlIHN1cmUgdGhhdCB3ZSBnZXQgbm8gYWxpYXNlcywKKyAqIHdoaWNoIG1lYW5zIHRoYXQgd2UgaGF2ZSB0byBjYWxsICJjbGVhcl9pbm9kZSgpIgorICogX2JlZm9yZV8gd2UgbWFyayB0aGUgaW5vZGUgbm90IGluIHVzZSBpbiB0aGUgaW5vZGUKKyAqIGJpdG1hcHMuIE90aGVyd2lzZSBhIG5ld2x5IGNyZWF0ZWQgZmlsZSBtaWdodCB1c2UKKyAqIHRoZSBzYW1lIGlub2RlIG51bWJlciAobm90IGFjdHVhbGx5IHRoZSBzYW1lIHBvaW50ZXIKKyAqIHRob3VnaCksIGFuZCB0aGVuIHdlJ2QgaGF2ZSB0d28gaW5vZGVzIHNoYXJpbmcgdGhlCisgKiBzYW1lIGlub2RlIG51bWJlciBhbmQgc3BhY2Ugb24gdGhlIGhhcmRkaXNrLgorICovCit2b2lkIGV4dDRfZnJlZV9pbm9kZSAoaGFuZGxlX3QgKmhhbmRsZSwgc3RydWN0IGlub2RlICogaW5vZGUpCit7CisJc3RydWN0IHN1cGVyX2Jsb2NrICogc2IgPSBpbm9kZS0+aV9zYjsKKwlpbnQgaXNfZGlyZWN0b3J5OworCXVuc2lnbmVkIGxvbmcgaW5vOworCXN0cnVjdCBidWZmZXJfaGVhZCAqYml0bWFwX2JoID0gTlVMTDsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoMjsKKwl1bnNpZ25lZCBsb25nIGJsb2NrX2dyb3VwOworCXVuc2lnbmVkIGxvbmcgYml0OworCXN0cnVjdCBleHQ0X2dyb3VwX2Rlc2MgKiBnZHA7CisJc3RydWN0IGV4dDRfc3VwZXJfYmxvY2sgKiBlczsKKwlzdHJ1Y3QgZXh0NF9zYl9pbmZvICpzYmk7CisJaW50IGZhdGFsID0gMCwgZXJyOworCisJaWYgKGF0b21pY19yZWFkKCZpbm9kZS0+aV9jb3VudCkgPiAxKSB7CisJCXByaW50ayAoImV4dDRfZnJlZV9pbm9kZTogaW5vZGUgaGFzIGNvdW50PSVkXG4iLAorCQkJCQlhdG9taWNfcmVhZCgmaW5vZGUtPmlfY291bnQpKTsKKwkJcmV0dXJuOworCX0KKwlpZiAoaW5vZGUtPmlfbmxpbmspIHsKKwkJcHJpbnRrICgiZXh0NF9mcmVlX2lub2RlOiBpbm9kZSBoYXMgbmxpbms9JWRcbiIsCisJCQlpbm9kZS0+aV9ubGluayk7CisJCXJldHVybjsKKwl9CisJaWYgKCFzYikgeworCQlwcmludGsoImV4dDRfZnJlZV9pbm9kZTogaW5vZGUgb24gbm9uZXhpc3RlbnQgZGV2aWNlXG4iKTsKKwkJcmV0dXJuOworCX0KKwlzYmkgPSBFWFQ0X1NCKHNiKTsKKworCWlubyA9IGlub2RlLT5pX2lubzsKKwlleHQ0X2RlYnVnICgiZnJlZWluZyBpbm9kZSAlbHVcbiIsIGlubyk7CisKKwkvKgorCSAqIE5vdGU6IHdlIG11c3QgZnJlZSBhbnkgcXVvdGEgYmVmb3JlIGxvY2tpbmcgdGhlIHN1cGVyYmxvY2ssCisJICogYXMgd3JpdGluZyB0aGUgcXVvdGEgdG8gZGlzayBtYXkgbmVlZCB0aGUgbG9jayBhcyB3ZWxsLgorCSAqLworCURRVU9UX0lOSVQoaW5vZGUpOworCWV4dDRfeGF0dHJfZGVsZXRlX2lub2RlKGhhbmRsZSwgaW5vZGUpOworCURRVU9UX0ZSRUVfSU5PREUoaW5vZGUpOworCURRVU9UX0RST1AoaW5vZGUpOworCisJaXNfZGlyZWN0b3J5ID0gU19JU0RJUihpbm9kZS0+aV9tb2RlKTsKKworCS8qIERvIHRoaXMgQkVGT1JFIG1hcmtpbmcgdGhlIGlub2RlIG5vdCBpbiB1c2Ugb3IgcmV0dXJuaW5nIGFuIGVycm9yICovCisJY2xlYXJfaW5vZGUgKGlub2RlKTsKKworCWVzID0gRVhUNF9TQihzYiktPnNfZXM7CisJaWYgKGlubyA8IEVYVDRfRklSU1RfSU5PKHNiKSB8fCBpbm8gPiBsZTMyX3RvX2NwdShlcy0+c19pbm9kZXNfY291bnQpKSB7CisJCWV4dDRfZXJyb3IgKHNiLCAiZXh0NF9mcmVlX2lub2RlIiwKKwkJCSAgICAicmVzZXJ2ZWQgb3Igbm9uZXhpc3RlbnQgaW5vZGUgJWx1IiwgaW5vKTsKKwkJZ290byBlcnJvcl9yZXR1cm47CisJfQorCWJsb2NrX2dyb3VwID0gKGlubyAtIDEpIC8gRVhUNF9JTk9ERVNfUEVSX0dST1VQKHNiKTsKKwliaXQgPSAoaW5vIC0gMSkgJSBFWFQ0X0lOT0RFU19QRVJfR1JPVVAoc2IpOworCWJpdG1hcF9iaCA9IHJlYWRfaW5vZGVfYml0bWFwKHNiLCBibG9ja19ncm91cCk7CisJaWYgKCFiaXRtYXBfYmgpCisJCWdvdG8gZXJyb3JfcmV0dXJuOworCisJQlVGRkVSX1RSQUNFKGJpdG1hcF9iaCwgImdldF93cml0ZV9hY2Nlc3MiKTsKKwlmYXRhbCA9IGV4dDRfam91cm5hbF9nZXRfd3JpdGVfYWNjZXNzKGhhbmRsZSwgYml0bWFwX2JoKTsKKwlpZiAoZmF0YWwpCisJCWdvdG8gZXJyb3JfcmV0dXJuOworCisJLyogT2ssIG5vdyB3ZSBjYW4gYWN0dWFsbHkgdXBkYXRlIHRoZSBpbm9kZSBiaXRtYXBzLi4gKi8KKwlpZiAoIWV4dDRfY2xlYXJfYml0X2F0b21pYyhzYl9iZ2xfbG9jayhzYmksIGJsb2NrX2dyb3VwKSwKKwkJCQkJYml0LCBiaXRtYXBfYmgtPmJfZGF0YSkpCisJCWV4dDRfZXJyb3IgKHNiLCAiZXh0NF9mcmVlX2lub2RlIiwKKwkJCSAgICAgICJiaXQgYWxyZWFkeSBjbGVhcmVkIGZvciBpbm9kZSAlbHUiLCBpbm8pOworCWVsc2UgeworCQlnZHAgPSBleHQ0X2dldF9ncm91cF9kZXNjIChzYiwgYmxvY2tfZ3JvdXAsICZiaDIpOworCisJCUJVRkZFUl9UUkFDRShiaDIsICJnZXRfd3JpdGVfYWNjZXNzIik7CisJCWZhdGFsID0gZXh0NF9qb3VybmFsX2dldF93cml0ZV9hY2Nlc3MoaGFuZGxlLCBiaDIpOworCQlpZiAoZmF0YWwpIGdvdG8gZXJyb3JfcmV0dXJuOworCisJCWlmIChnZHApIHsKKwkJCXNwaW5fbG9jayhzYl9iZ2xfbG9jayhzYmksIGJsb2NrX2dyb3VwKSk7CisJCQlnZHAtPmJnX2ZyZWVfaW5vZGVzX2NvdW50ID0gY3B1X3RvX2xlMTYoCisJCQkJbGUxNl90b19jcHUoZ2RwLT5iZ19mcmVlX2lub2Rlc19jb3VudCkgKyAxKTsKKwkJCWlmIChpc19kaXJlY3RvcnkpCisJCQkJZ2RwLT5iZ191c2VkX2RpcnNfY291bnQgPSBjcHVfdG9fbGUxNigKKwkJCQkgIGxlMTZfdG9fY3B1KGdkcC0+YmdfdXNlZF9kaXJzX2NvdW50KSAtIDEpOworCQkJc3Bpbl91bmxvY2soc2JfYmdsX2xvY2soc2JpLCBibG9ja19ncm91cCkpOworCQkJcGVyY3B1X2NvdW50ZXJfaW5jKCZzYmktPnNfZnJlZWlub2Rlc19jb3VudGVyKTsKKwkJCWlmIChpc19kaXJlY3RvcnkpCisJCQkJcGVyY3B1X2NvdW50ZXJfZGVjKCZzYmktPnNfZGlyc19jb3VudGVyKTsKKworCQl9CisJCUJVRkZFUl9UUkFDRShiaDIsICJjYWxsIGV4dDRfam91cm5hbF9kaXJ0eV9tZXRhZGF0YSIpOworCQllcnIgPSBleHQ0X2pvdXJuYWxfZGlydHlfbWV0YWRhdGEoaGFuZGxlLCBiaDIpOworCQlpZiAoIWZhdGFsKSBmYXRhbCA9IGVycjsKKwl9CisJQlVGRkVSX1RSQUNFKGJpdG1hcF9iaCwgImNhbGwgZXh0NF9qb3VybmFsX2RpcnR5X21ldGFkYXRhIik7CisJZXJyID0gZXh0NF9qb3VybmFsX2RpcnR5X21ldGFkYXRhKGhhbmRsZSwgYml0bWFwX2JoKTsKKwlpZiAoIWZhdGFsKQorCQlmYXRhbCA9IGVycjsKKwlzYi0+c19kaXJ0ID0gMTsKK2Vycm9yX3JldHVybjoKKwlicmVsc2UoYml0bWFwX2JoKTsKKwlleHQ0X3N0ZF9lcnJvcihzYiwgZmF0YWwpOworfQorCisvKgorICogVGhlcmUgYXJlIHR3byBwb2xpY2llcyBmb3IgYWxsb2NhdGluZyBhbiBpbm9kZS4gIElmIHRoZSBuZXcgaW5vZGUgaXMKKyAqIGEgZGlyZWN0b3J5LCB0aGVuIGEgZm9yd2FyZCBzZWFyY2ggaXMgbWFkZSBmb3IgYSBibG9jayBncm91cCB3aXRoIGJvdGgKKyAqIGZyZWUgc3BhY2UgYW5kIGEgbG93IGRpcmVjdG9yeS10by1pbm9kZSByYXRpbzsgaWYgdGhhdCBmYWlscywgdGhlbiBvZgorICogdGhlIGdyb3VwcyB3aXRoIGFib3ZlLWF2ZXJhZ2UgZnJlZSBzcGFjZSwgdGhhdCBncm91cCB3aXRoIHRoZSBmZXdlc3QKKyAqIGRpcmVjdG9yaWVzIGFscmVhZHkgaXMgY2hvc2VuLgorICoKKyAqIEZvciBvdGhlciBpbm9kZXMsIHNlYXJjaCBmb3J3YXJkIGZyb20gdGhlIHBhcmVudCBkaXJlY3RvcnlcJ3MgYmxvY2sKKyAqIGdyb3VwIHRvIGZpbmQgYSBmcmVlIGlub2RlLgorICovCitzdGF0aWMgaW50IGZpbmRfZ3JvdXBfZGlyKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHN0cnVjdCBpbm9kZSAqcGFyZW50KQoreworCWludCBuZ3JvdXBzID0gRVhUNF9TQihzYiktPnNfZ3JvdXBzX2NvdW50OworCXVuc2lnbmVkIGludCBmcmVlaSwgYXZlZnJlZWk7CisJc3RydWN0IGV4dDRfZ3JvdXBfZGVzYyAqZGVzYywgKmJlc3RfZGVzYyA9IE5VTEw7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaDsKKwlpbnQgZ3JvdXAsIGJlc3RfZ3JvdXAgPSAtMTsKKworCWZyZWVpID0gcGVyY3B1X2NvdW50ZXJfcmVhZF9wb3NpdGl2ZSgmRVhUNF9TQihzYiktPnNfZnJlZWlub2Rlc19jb3VudGVyKTsKKwlhdmVmcmVlaSA9IGZyZWVpIC8gbmdyb3VwczsKKworCWZvciAoZ3JvdXAgPSAwOyBncm91cCA8IG5ncm91cHM7IGdyb3VwKyspIHsKKwkJZGVzYyA9IGV4dDRfZ2V0X2dyb3VwX2Rlc2MgKHNiLCBncm91cCwgJmJoKTsKKwkJaWYgKCFkZXNjIHx8ICFkZXNjLT5iZ19mcmVlX2lub2Rlc19jb3VudCkKKwkJCWNvbnRpbnVlOworCQlpZiAobGUxNl90b19jcHUoZGVzYy0+YmdfZnJlZV9pbm9kZXNfY291bnQpIDwgYXZlZnJlZWkpCisJCQljb250aW51ZTsKKwkJaWYgKCFiZXN0X2Rlc2MgfHwKKwkJICAgIChsZTE2X3RvX2NwdShkZXNjLT5iZ19mcmVlX2Jsb2Nrc19jb3VudCkgPgorCQkgICAgIGxlMTZfdG9fY3B1KGJlc3RfZGVzYy0+YmdfZnJlZV9ibG9ja3NfY291bnQpKSkgeworCQkJYmVzdF9ncm91cCA9IGdyb3VwOworCQkJYmVzdF9kZXNjID0gZGVzYzsKKwkJfQorCX0KKwlyZXR1cm4gYmVzdF9ncm91cDsKK30KKworLyoKKyAqIE9ybG92J3MgYWxsb2NhdG9yIGZvciBkaXJlY3Rvcmllcy4KKyAqCisgKiBXZSBhbHdheXMgdHJ5IHRvIHNwcmVhZCBmaXJzdC1sZXZlbCBkaXJlY3Rvcmllcy4KKyAqCisgKiBJZiB0aGVyZSBhcmUgYmxvY2tncm91cHMgd2l0aCBib3RoIGZyZWUgaW5vZGVzIGFuZCBmcmVlIGJsb2NrcyBjb3VudHMKKyAqIG5vdCB3b3JzZSB0aGFuIGF2ZXJhZ2Ugd2UgcmV0dXJuIG9uZSB3aXRoIHNtYWxsZXN0IGRpcmVjdG9yeSBjb3VudC4KKyAqIE90aGVyd2lzZSB3ZSBzaW1wbHkgcmV0dXJuIGEgcmFuZG9tIGdyb3VwLgorICoKKyAqIEZvciB0aGUgcmVzdCBydWxlcyBsb29rIHNvOgorICoKKyAqIEl0J3MgT0sgdG8gcHV0IGRpcmVjdG9yeSBpbnRvIGEgZ3JvdXAgdW5sZXNzCisgKiBpdCBoYXMgdG9vIG1hbnkgZGlyZWN0b3JpZXMgYWxyZWFkeSAobWF4X2RpcnMpIG9yCisgKiBpdCBoYXMgdG9vIGZldyBmcmVlIGlub2RlcyBsZWZ0IChtaW5faW5vZGVzKSBvcgorICogaXQgaGFzIHRvbyBmZXcgZnJlZSBibG9ja3MgbGVmdCAobWluX2Jsb2Nrcykgb3IKKyAqIGl0J3MgYWxyZWFkeSBydW5uaW5nIHRvbyBsYXJnZSBkZWJ0IChtYXhfZGVidCkuCisgKiBQYXJlbnQncyBncm91cCBpcyBwcmVmZXJlZCwgaWYgaXQgZG9lc24ndCBzYXRpc2Z5IHRoZXNlCisgKiBjb25kaXRpb25zIHdlIHNlYXJjaCBjeWNsaWNhbGx5IHRocm91Z2ggdGhlIHJlc3QuIElmIG5vbmUKKyAqIG9mIHRoZSBncm91cHMgbG9vayBnb29kIHdlIGp1c3QgbG9vayBmb3IgYSBncm91cCB3aXRoIG1vcmUKKyAqIGZyZWUgaW5vZGVzIHRoYW4gYXZlcmFnZSAoc3RhcnRpbmcgYXQgcGFyZW50J3MgZ3JvdXApLgorICoKKyAqIERlYnQgaXMgaW5jcmVtZW50ZWQgZWFjaCB0aW1lIHdlIGFsbG9jYXRlIGEgZGlyZWN0b3J5IGFuZCBkZWNyZW1lbnRlZAorICogd2hlbiB3ZSBhbGxvY2F0ZSBhbiBpbm9kZSwgd2l0aGluIDAtLTI1NS4KKyAqLworCisjZGVmaW5lIElOT0RFX0NPU1QgNjQKKyNkZWZpbmUgQkxPQ0tfQ09TVCAyNTYKKworc3RhdGljIGludCBmaW5kX2dyb3VwX29ybG92KHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHN0cnVjdCBpbm9kZSAqcGFyZW50KQoreworCWludCBwYXJlbnRfZ3JvdXAgPSBFWFQ0X0kocGFyZW50KS0+aV9ibG9ja19ncm91cDsKKwlzdHJ1Y3QgZXh0NF9zYl9pbmZvICpzYmkgPSBFWFQ0X1NCKHNiKTsKKwlzdHJ1Y3QgZXh0NF9zdXBlcl9ibG9jayAqZXMgPSBzYmktPnNfZXM7CisJaW50IG5ncm91cHMgPSBzYmktPnNfZ3JvdXBzX2NvdW50OworCWludCBpbm9kZXNfcGVyX2dyb3VwID0gRVhUNF9JTk9ERVNfUEVSX0dST1VQKHNiKTsKKwl1bnNpZ25lZCBpbnQgZnJlZWksIGF2ZWZyZWVpOworCWV4dDRfZnNibGtfdCBmcmVlYiwgYXZlZnJlZWI7CisJZXh0NF9mc2Jsa190IGJsb2Nrc19wZXJfZGlyOworCXVuc2lnbmVkIGludCBuZGlyczsKKwlpbnQgbWF4X2RlYnQsIG1heF9kaXJzLCBtaW5faW5vZGVzOworCWV4dDRfZ3JwYmxrX3QgbWluX2Jsb2NrczsKKwlpbnQgZ3JvdXAgPSAtMSwgaTsKKwlzdHJ1Y3QgZXh0NF9ncm91cF9kZXNjICpkZXNjOworCXN0cnVjdCBidWZmZXJfaGVhZCAqYmg7CisKKwlmcmVlaSA9IHBlcmNwdV9jb3VudGVyX3JlYWRfcG9zaXRpdmUoJnNiaS0+c19mcmVlaW5vZGVzX2NvdW50ZXIpOworCWF2ZWZyZWVpID0gZnJlZWkgLyBuZ3JvdXBzOworCWZyZWViID0gcGVyY3B1X2NvdW50ZXJfcmVhZF9wb3NpdGl2ZSgmc2JpLT5zX2ZyZWVibG9ja3NfY291bnRlcik7CisJYXZlZnJlZWIgPSBmcmVlYjsKKwlkb19kaXYoYXZlZnJlZWIsIG5ncm91cHMpOworCW5kaXJzID0gcGVyY3B1X2NvdW50ZXJfcmVhZF9wb3NpdGl2ZSgmc2JpLT5zX2RpcnNfY291bnRlcik7CisKKwlpZiAoKHBhcmVudCA9PSBzYi0+c19yb290LT5kX2lub2RlKSB8fAorCSAgICAoRVhUNF9JKHBhcmVudCktPmlfZmxhZ3MgJiBFWFQ0X1RPUERJUl9GTCkpIHsKKwkJaW50IGJlc3RfbmRpciA9IGlub2Rlc19wZXJfZ3JvdXA7CisJCWludCBiZXN0X2dyb3VwID0gLTE7CisKKwkJZ2V0X3JhbmRvbV9ieXRlcygmZ3JvdXAsIHNpemVvZihncm91cCkpOworCQlwYXJlbnRfZ3JvdXAgPSAodW5zaWduZWQpZ3JvdXAgJSBuZ3JvdXBzOworCQlmb3IgKGkgPSAwOyBpIDwgbmdyb3VwczsgaSsrKSB7CisJCQlncm91cCA9IChwYXJlbnRfZ3JvdXAgKyBpKSAlIG5ncm91cHM7CisJCQlkZXNjID0gZXh0NF9nZXRfZ3JvdXBfZGVzYyAoc2IsIGdyb3VwLCAmYmgpOworCQkJaWYgKCFkZXNjIHx8ICFkZXNjLT5iZ19mcmVlX2lub2Rlc19jb3VudCkKKwkJCQljb250aW51ZTsKKwkJCWlmIChsZTE2X3RvX2NwdShkZXNjLT5iZ191c2VkX2RpcnNfY291bnQpID49IGJlc3RfbmRpcikKKwkJCQljb250aW51ZTsKKwkJCWlmIChsZTE2X3RvX2NwdShkZXNjLT5iZ19mcmVlX2lub2Rlc19jb3VudCkgPCBhdmVmcmVlaSkKKwkJCQljb250aW51ZTsKKwkJCWlmIChsZTE2X3RvX2NwdShkZXNjLT5iZ19mcmVlX2Jsb2Nrc19jb3VudCkgPCBhdmVmcmVlYikKKwkJCQljb250aW51ZTsKKwkJCWJlc3RfZ3JvdXAgPSBncm91cDsKKwkJCWJlc3RfbmRpciA9IGxlMTZfdG9fY3B1KGRlc2MtPmJnX3VzZWRfZGlyc19jb3VudCk7CisJCX0KKwkJaWYgKGJlc3RfZ3JvdXAgPj0gMCkKKwkJCXJldHVybiBiZXN0X2dyb3VwOworCQlnb3RvIGZhbGxiYWNrOworCX0KKworCWJsb2Nrc19wZXJfZGlyID0gZXh0NF9ibG9ja3NfY291bnQoZXMpIC0gZnJlZWI7CisJZG9fZGl2KGJsb2Nrc19wZXJfZGlyLCBuZGlycyk7CisKKwltYXhfZGlycyA9IG5kaXJzIC8gbmdyb3VwcyArIGlub2Rlc19wZXJfZ3JvdXAgLyAxNjsKKwltaW5faW5vZGVzID0gYXZlZnJlZWkgLSBpbm9kZXNfcGVyX2dyb3VwIC8gNDsKKwltaW5fYmxvY2tzID0gYXZlZnJlZWIgLSBFWFQ0X0JMT0NLU19QRVJfR1JPVVAoc2IpIC8gNDsKKworCW1heF9kZWJ0ID0gRVhUNF9CTE9DS1NfUEVSX0dST1VQKHNiKTsKKwltYXhfZGVidCAvPSBtYXhfdChpbnQsIGJsb2Nrc19wZXJfZGlyLCBCTE9DS19DT1NUKTsKKwlpZiAobWF4X2RlYnQgKiBJTk9ERV9DT1NUID4gaW5vZGVzX3Blcl9ncm91cCkKKwkJbWF4X2RlYnQgPSBpbm9kZXNfcGVyX2dyb3VwIC8gSU5PREVfQ09TVDsKKwlpZiAobWF4X2RlYnQgPiAyNTUpCisJCW1heF9kZWJ0ID0gMjU1OworCWlmIChtYXhfZGVidCA9PSAwKQorCQltYXhfZGVidCA9IDE7CisKKwlmb3IgKGkgPSAwOyBpIDwgbmdyb3VwczsgaSsrKSB7CisJCWdyb3VwID0gKHBhcmVudF9ncm91cCArIGkpICUgbmdyb3VwczsKKwkJZGVzYyA9IGV4dDRfZ2V0X2dyb3VwX2Rlc2MgKHNiLCBncm91cCwgJmJoKTsKKwkJaWYgKCFkZXNjIHx8ICFkZXNjLT5iZ19mcmVlX2lub2Rlc19jb3VudCkKKwkJCWNvbnRpbnVlOworCQlpZiAobGUxNl90b19jcHUoZGVzYy0+YmdfdXNlZF9kaXJzX2NvdW50KSA+PSBtYXhfZGlycykKKwkJCWNvbnRpbnVlOworCQlpZiAobGUxNl90b19jcHUoZGVzYy0+YmdfZnJlZV9pbm9kZXNfY291bnQpIDwgbWluX2lub2RlcykKKwkJCWNvbnRpbnVlOworCQlpZiAobGUxNl90b19jcHUoZGVzYy0+YmdfZnJlZV9ibG9ja3NfY291bnQpIDwgbWluX2Jsb2NrcykKKwkJCWNvbnRpbnVlOworCQlyZXR1cm4gZ3JvdXA7CisJfQorCitmYWxsYmFjazoKKwlmb3IgKGkgPSAwOyBpIDwgbmdyb3VwczsgaSsrKSB7CisJCWdyb3VwID0gKHBhcmVudF9ncm91cCArIGkpICUgbmdyb3VwczsKKwkJZGVzYyA9IGV4dDRfZ2V0X2dyb3VwX2Rlc2MgKHNiLCBncm91cCwgJmJoKTsKKwkJaWYgKCFkZXNjIHx8ICFkZXNjLT5iZ19mcmVlX2lub2Rlc19jb3VudCkKKwkJCWNvbnRpbnVlOworCQlpZiAobGUxNl90b19jcHUoZGVzYy0+YmdfZnJlZV9pbm9kZXNfY291bnQpID49IGF2ZWZyZWVpKQorCQkJcmV0dXJuIGdyb3VwOworCX0KKworCWlmIChhdmVmcmVlaSkgeworCQkvKgorCQkgKiBUaGUgZnJlZS1pbm9kZXMgY291bnRlciBpcyBhcHByb3hpbWF0ZSwgYW5kIGZvciByZWFsbHkgc21hbGwKKwkJICogZmlsZXN5c3RlbXMgdGhlIGFib3ZlIHRlc3QgY2FuIGZhaWwgdG8gZmluZCBhbnkgYmxvY2tncm91cHMKKwkJICovCisJCWF2ZWZyZWVpID0gMDsKKwkJZ290byBmYWxsYmFjazsKKwl9CisKKwlyZXR1cm4gLTE7Cit9CisKK3N0YXRpYyBpbnQgZmluZF9ncm91cF9vdGhlcihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBzdHJ1Y3QgaW5vZGUgKnBhcmVudCkKK3sKKwlpbnQgcGFyZW50X2dyb3VwID0gRVhUNF9JKHBhcmVudCktPmlfYmxvY2tfZ3JvdXA7CisJaW50IG5ncm91cHMgPSBFWFQ0X1NCKHNiKS0+c19ncm91cHNfY291bnQ7CisJc3RydWN0IGV4dDRfZ3JvdXBfZGVzYyAqZGVzYzsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoOworCWludCBncm91cCwgaTsKKworCS8qCisJICogVHJ5IHRvIHBsYWNlIHRoZSBpbm9kZSBpbiBpdHMgcGFyZW50IGRpcmVjdG9yeQorCSAqLworCWdyb3VwID0gcGFyZW50X2dyb3VwOworCWRlc2MgPSBleHQ0X2dldF9ncm91cF9kZXNjIChzYiwgZ3JvdXAsICZiaCk7CisJaWYgKGRlc2MgJiYgbGUxNl90b19jcHUoZGVzYy0+YmdfZnJlZV9pbm9kZXNfY291bnQpICYmCisJCQlsZTE2X3RvX2NwdShkZXNjLT5iZ19mcmVlX2Jsb2Nrc19jb3VudCkpCisJCXJldHVybiBncm91cDsKKworCS8qCisJICogV2UncmUgZ29pbmcgdG8gcGxhY2UgdGhpcyBpbm9kZSBpbiBhIGRpZmZlcmVudCBibG9ja2dyb3VwIGZyb20gaXRzCisJICogcGFyZW50LiAgV2Ugd2FudCB0byBjYXVzZSBmaWxlcyBpbiBhIGNvbW1vbiBkaXJlY3RvcnkgdG8gYWxsIGxhbmQgaW4KKwkgKiB0aGUgc2FtZSBibG9ja2dyb3VwLiAgQnV0IHdlIHdhbnQgZmlsZXMgd2hpY2ggYXJlIGluIGEgZGlmZmVyZW50CisJICogZGlyZWN0b3J5IHdoaWNoIHNoYXJlcyBhIGJsb2NrZ3JvdXAgd2l0aCBvdXIgcGFyZW50IHRvIGxhbmQgaW4gYQorCSAqIGRpZmZlcmVudCBibG9ja2dyb3VwLgorCSAqCisJICogU28gYWRkIG91ciBkaXJlY3RvcnkncyBpX2lubyBpbnRvIHRoZSBzdGFydGluZyBwb2ludCBmb3IgdGhlIGhhc2guCisJICovCisJZ3JvdXAgPSAoZ3JvdXAgKyBwYXJlbnQtPmlfaW5vKSAlIG5ncm91cHM7CisKKwkvKgorCSAqIFVzZSBhIHF1YWRyYXRpYyBoYXNoIHRvIGZpbmQgYSBncm91cCB3aXRoIGEgZnJlZSBpbm9kZSBhbmQgc29tZSBmcmVlCisJICogYmxvY2tzLgorCSAqLworCWZvciAoaSA9IDE7IGkgPCBuZ3JvdXBzOyBpIDw8PSAxKSB7CisJCWdyb3VwICs9IGk7CisJCWlmIChncm91cCA+PSBuZ3JvdXBzKQorCQkJZ3JvdXAgLT0gbmdyb3VwczsKKwkJZGVzYyA9IGV4dDRfZ2V0X2dyb3VwX2Rlc2MgKHNiLCBncm91cCwgJmJoKTsKKwkJaWYgKGRlc2MgJiYgbGUxNl90b19jcHUoZGVzYy0+YmdfZnJlZV9pbm9kZXNfY291bnQpICYmCisJCQkJbGUxNl90b19jcHUoZGVzYy0+YmdfZnJlZV9ibG9ja3NfY291bnQpKQorCQkJcmV0dXJuIGdyb3VwOworCX0KKworCS8qCisJICogVGhhdCBmYWlsZWQ6IHRyeSBsaW5lYXIgc2VhcmNoIGZvciBhIGZyZWUgaW5vZGUsIGV2ZW4gaWYgdGhhdCBncm91cAorCSAqIGhhcyBubyBmcmVlIGJsb2Nrcy4KKwkgKi8KKwlncm91cCA9IHBhcmVudF9ncm91cDsKKwlmb3IgKGkgPSAwOyBpIDwgbmdyb3VwczsgaSsrKSB7CisJCWlmICgrK2dyb3VwID49IG5ncm91cHMpCisJCQlncm91cCA9IDA7CisJCWRlc2MgPSBleHQ0X2dldF9ncm91cF9kZXNjIChzYiwgZ3JvdXAsICZiaCk7CisJCWlmIChkZXNjICYmIGxlMTZfdG9fY3B1KGRlc2MtPmJnX2ZyZWVfaW5vZGVzX2NvdW50KSkKKwkJCXJldHVybiBncm91cDsKKwl9CisKKwlyZXR1cm4gLTE7Cit9CisKKy8qCisgKiBUaGVyZSBhcmUgdHdvIHBvbGljaWVzIGZvciBhbGxvY2F0aW5nIGFuIGlub2RlLiAgSWYgdGhlIG5ldyBpbm9kZSBpcworICogYSBkaXJlY3RvcnksIHRoZW4gYSBmb3J3YXJkIHNlYXJjaCBpcyBtYWRlIGZvciBhIGJsb2NrIGdyb3VwIHdpdGggYm90aAorICogZnJlZSBzcGFjZSBhbmQgYSBsb3cgZGlyZWN0b3J5LXRvLWlub2RlIHJhdGlvOyBpZiB0aGF0IGZhaWxzLCB0aGVuIG9mCisgKiB0aGUgZ3JvdXBzIHdpdGggYWJvdmUtYXZlcmFnZSBmcmVlIHNwYWNlLCB0aGF0IGdyb3VwIHdpdGggdGhlIGZld2VzdAorICogZGlyZWN0b3JpZXMgYWxyZWFkeSBpcyBjaG9zZW4uCisgKgorICogRm9yIG90aGVyIGlub2Rlcywgc2VhcmNoIGZvcndhcmQgZnJvbSB0aGUgcGFyZW50IGRpcmVjdG9yeSdzIGJsb2NrCisgKiBncm91cCB0byBmaW5kIGEgZnJlZSBpbm9kZS4KKyAqLworc3RydWN0IGlub2RlICpleHQ0X25ld19pbm9kZShoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3QgaW5vZGUgKiBkaXIsIGludCBtb2RlKQoreworCXN0cnVjdCBzdXBlcl9ibG9jayAqc2I7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaXRtYXBfYmggPSBOVUxMOworCXN0cnVjdCBidWZmZXJfaGVhZCAqYmgyOworCWludCBncm91cDsKKwl1bnNpZ25lZCBsb25nIGlubyA9IDA7CisJc3RydWN0IGlub2RlICogaW5vZGU7CisJc3RydWN0IGV4dDRfZ3JvdXBfZGVzYyAqIGdkcCA9IE5VTEw7CisJc3RydWN0IGV4dDRfc3VwZXJfYmxvY2sgKiBlczsKKwlzdHJ1Y3QgZXh0NF9pbm9kZV9pbmZvICplaTsKKwlzdHJ1Y3QgZXh0NF9zYl9pbmZvICpzYmk7CisJaW50IGVyciA9IDA7CisJc3RydWN0IGlub2RlICpyZXQ7CisJaW50IGk7CisKKwkvKiBDYW5ub3QgY3JlYXRlIGZpbGVzIGluIGEgZGVsZXRlZCBkaXJlY3RvcnkgKi8KKwlpZiAoIWRpciB8fCAhZGlyLT5pX25saW5rKQorCQlyZXR1cm4gRVJSX1BUUigtRVBFUk0pOworCisJc2IgPSBkaXItPmlfc2I7CisJaW5vZGUgPSBuZXdfaW5vZGUoc2IpOworCWlmICghaW5vZGUpCisJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOworCWVpID0gRVhUNF9JKGlub2RlKTsKKworCXNiaSA9IEVYVDRfU0Ioc2IpOworCWVzID0gc2JpLT5zX2VzOworCWlmIChTX0lTRElSKG1vZGUpKSB7CisJCWlmICh0ZXN0X29wdCAoc2IsIE9MREFMTE9DKSkKKwkJCWdyb3VwID0gZmluZF9ncm91cF9kaXIoc2IsIGRpcik7CisJCWVsc2UKKwkJCWdyb3VwID0gZmluZF9ncm91cF9vcmxvdihzYiwgZGlyKTsKKwl9IGVsc2UKKwkJZ3JvdXAgPSBmaW5kX2dyb3VwX290aGVyKHNiLCBkaXIpOworCisJZXJyID0gLUVOT1NQQzsKKwlpZiAoZ3JvdXAgPT0gLTEpCisJCWdvdG8gb3V0OworCisJZm9yIChpID0gMDsgaSA8IHNiaS0+c19ncm91cHNfY291bnQ7IGkrKykgeworCQllcnIgPSAtRUlPOworCisJCWdkcCA9IGV4dDRfZ2V0X2dyb3VwX2Rlc2Moc2IsIGdyb3VwLCAmYmgyKTsKKwkJaWYgKCFnZHApCisJCQlnb3RvIGZhaWw7CisKKwkJYnJlbHNlKGJpdG1hcF9iaCk7CisJCWJpdG1hcF9iaCA9IHJlYWRfaW5vZGVfYml0bWFwKHNiLCBncm91cCk7CisJCWlmICghYml0bWFwX2JoKQorCQkJZ290byBmYWlsOworCisJCWlubyA9IDA7CisKK3JlcGVhdF9pbl90aGlzX2dyb3VwOgorCQlpbm8gPSBleHQ0X2ZpbmRfbmV4dF96ZXJvX2JpdCgodW5zaWduZWQgbG9uZyAqKQorCQkJCWJpdG1hcF9iaC0+Yl9kYXRhLCBFWFQ0X0lOT0RFU19QRVJfR1JPVVAoc2IpLCBpbm8pOworCQlpZiAoaW5vIDwgRVhUNF9JTk9ERVNfUEVSX0dST1VQKHNiKSkgeworCisJCQlCVUZGRVJfVFJBQ0UoYml0bWFwX2JoLCAiZ2V0X3dyaXRlX2FjY2VzcyIpOworCQkJZXJyID0gZXh0NF9qb3VybmFsX2dldF93cml0ZV9hY2Nlc3MoaGFuZGxlLCBiaXRtYXBfYmgpOworCQkJaWYgKGVycikKKwkJCQlnb3RvIGZhaWw7CisKKwkJCWlmICghZXh0NF9zZXRfYml0X2F0b21pYyhzYl9iZ2xfbG9jayhzYmksIGdyb3VwKSwKKwkJCQkJCWlubywgYml0bWFwX2JoLT5iX2RhdGEpKSB7CisJCQkJLyogd2Ugd29uIGl0ICovCisJCQkJQlVGRkVSX1RSQUNFKGJpdG1hcF9iaCwKKwkJCQkJImNhbGwgZXh0NF9qb3VybmFsX2RpcnR5X21ldGFkYXRhIik7CisJCQkJZXJyID0gZXh0NF9qb3VybmFsX2RpcnR5X21ldGFkYXRhKGhhbmRsZSwKKwkJCQkJCQkJYml0bWFwX2JoKTsKKwkJCQlpZiAoZXJyKQorCQkJCQlnb3RvIGZhaWw7CisJCQkJZ290byBnb3Q7CisJCQl9CisJCQkvKiB3ZSBsb3N0IGl0ICovCisJCQlqYmQyX2pvdXJuYWxfcmVsZWFzZV9idWZmZXIoaGFuZGxlLCBiaXRtYXBfYmgpOworCisJCQlpZiAoKytpbm8gPCBFWFQ0X0lOT0RFU19QRVJfR1JPVVAoc2IpKQorCQkJCWdvdG8gcmVwZWF0X2luX3RoaXNfZ3JvdXA7CisJCX0KKworCQkvKgorCQkgKiBUaGlzIGNhc2UgaXMgcG9zc2libGUgaW4gY29uY3VycmVudCBlbnZpcm9ubWVudC4gIEl0IGlzIHZlcnkKKwkJICogcmFyZS4gIFdlIGNhbm5vdCByZXBlYXQgdGhlIGZpbmRfZ3JvdXBfeHh4KCkgY2FsbCBiZWNhdXNlCisJCSAqIHRoYXQgd2lsbCBzaW1wbHkgcmV0dXJuIHRoZSBzYW1lIGJsb2NrZ3JvdXAsIGJlY2F1c2UgdGhlCisJCSAqIGdyb3VwIGRlc2NyaXB0b3IgbWV0YWRhdGEgaGFzIG5vdCB5ZXQgYmVlbiB1cGRhdGVkLgorCQkgKiBTbyB3ZSBqdXN0IGdvIG9udG8gdGhlIG5leHQgYmxvY2tncm91cC4KKwkJICovCisJCWlmICgrK2dyb3VwID09IHNiaS0+c19ncm91cHNfY291bnQpCisJCQlncm91cCA9IDA7CisJfQorCWVyciA9IC1FTk9TUEM7CisJZ290byBvdXQ7CisKK2dvdDoKKwlpbm8gKz0gZ3JvdXAgKiBFWFQ0X0lOT0RFU19QRVJfR1JPVVAoc2IpICsgMTsKKwlpZiAoaW5vIDwgRVhUNF9GSVJTVF9JTk8oc2IpIHx8IGlubyA+IGxlMzJfdG9fY3B1KGVzLT5zX2lub2Rlc19jb3VudCkpIHsKKwkJZXh0NF9lcnJvciAoc2IsICJleHQ0X25ld19pbm9kZSIsCisJCQkgICAgInJlc2VydmVkIGlub2RlIG9yIGlub2RlID4gaW5vZGVzIGNvdW50IC0gIgorCQkJICAgICJibG9ja19ncm91cCA9ICVkLCBpbm9kZT0lbHUiLCBncm91cCwgaW5vKTsKKwkJZXJyID0gLUVJTzsKKwkJZ290byBmYWlsOworCX0KKworCUJVRkZFUl9UUkFDRShiaDIsICJnZXRfd3JpdGVfYWNjZXNzIik7CisJZXJyID0gZXh0NF9qb3VybmFsX2dldF93cml0ZV9hY2Nlc3MoaGFuZGxlLCBiaDIpOworCWlmIChlcnIpIGdvdG8gZmFpbDsKKwlzcGluX2xvY2soc2JfYmdsX2xvY2soc2JpLCBncm91cCkpOworCWdkcC0+YmdfZnJlZV9pbm9kZXNfY291bnQgPQorCQljcHVfdG9fbGUxNihsZTE2X3RvX2NwdShnZHAtPmJnX2ZyZWVfaW5vZGVzX2NvdW50KSAtIDEpOworCWlmIChTX0lTRElSKG1vZGUpKSB7CisJCWdkcC0+YmdfdXNlZF9kaXJzX2NvdW50ID0KKwkJCWNwdV90b19sZTE2KGxlMTZfdG9fY3B1KGdkcC0+YmdfdXNlZF9kaXJzX2NvdW50KSArIDEpOworCX0KKwlzcGluX3VubG9jayhzYl9iZ2xfbG9jayhzYmksIGdyb3VwKSk7CisJQlVGRkVSX1RSQUNFKGJoMiwgImNhbGwgZXh0NF9qb3VybmFsX2RpcnR5X21ldGFkYXRhIik7CisJZXJyID0gZXh0NF9qb3VybmFsX2RpcnR5X21ldGFkYXRhKGhhbmRsZSwgYmgyKTsKKwlpZiAoZXJyKSBnb3RvIGZhaWw7CisKKwlwZXJjcHVfY291bnRlcl9kZWMoJnNiaS0+c19mcmVlaW5vZGVzX2NvdW50ZXIpOworCWlmIChTX0lTRElSKG1vZGUpKQorCQlwZXJjcHVfY291bnRlcl9pbmMoJnNiaS0+c19kaXJzX2NvdW50ZXIpOworCXNiLT5zX2RpcnQgPSAxOworCisJaW5vZGUtPmlfdWlkID0gY3VycmVudC0+ZnN1aWQ7CisJaWYgKHRlc3Rfb3B0IChzYiwgR1JQSUQpKQorCQlpbm9kZS0+aV9naWQgPSBkaXItPmlfZ2lkOworCWVsc2UgaWYgKGRpci0+aV9tb2RlICYgU19JU0dJRCkgeworCQlpbm9kZS0+aV9naWQgPSBkaXItPmlfZ2lkOworCQlpZiAoU19JU0RJUihtb2RlKSkKKwkJCW1vZGUgfD0gU19JU0dJRDsKKwl9IGVsc2UKKwkJaW5vZGUtPmlfZ2lkID0gY3VycmVudC0+ZnNnaWQ7CisJaW5vZGUtPmlfbW9kZSA9IG1vZGU7CisKKwlpbm9kZS0+aV9pbm8gPSBpbm87CisJLyogVGhpcyBpcyB0aGUgb3B0aW1hbCBJTyBzaXplIChmb3Igc3RhdCksIG5vdCB0aGUgZnMgYmxvY2sgc2l6ZSAqLworCWlub2RlLT5pX2Jsb2NrcyA9IDA7CisJaW5vZGUtPmlfbXRpbWUgPSBpbm9kZS0+aV9hdGltZSA9IGlub2RlLT5pX2N0aW1lID0gQ1VSUkVOVF9USU1FX1NFQzsKKworCW1lbXNldChlaS0+aV9kYXRhLCAwLCBzaXplb2YoZWktPmlfZGF0YSkpOworCWVpLT5pX2Rpcl9zdGFydF9sb29rdXAgPSAwOworCWVpLT5pX2Rpc2tzaXplID0gMDsKKworCWVpLT5pX2ZsYWdzID0gRVhUNF9JKGRpciktPmlfZmxhZ3MgJiB+RVhUNF9JTkRFWF9GTDsKKwlpZiAoU19JU0xOSyhtb2RlKSkKKwkJZWktPmlfZmxhZ3MgJj0gfihFWFQ0X0lNTVVUQUJMRV9GTHxFWFQ0X0FQUEVORF9GTCk7CisJLyogZGlyc3luYyBvbmx5IGFwcGxpZXMgdG8gZGlyZWN0b3JpZXMgKi8KKwlpZiAoIVNfSVNESVIobW9kZSkpCisJCWVpLT5pX2ZsYWdzICY9IH5FWFQ0X0RJUlNZTkNfRkw7CisjaWZkZWYgRVhUNF9GUkFHTUVOVFMKKwllaS0+aV9mYWRkciA9IDA7CisJZWktPmlfZnJhZ19ubyA9IDA7CisJZWktPmlfZnJhZ19zaXplID0gMDsKKyNlbmRpZgorCWVpLT5pX2ZpbGVfYWNsID0gMDsKKwllaS0+aV9kaXJfYWNsID0gMDsKKwllaS0+aV9kdGltZSA9IDA7CisJZWktPmlfYmxvY2tfYWxsb2NfaW5mbyA9IE5VTEw7CisJZWktPmlfYmxvY2tfZ3JvdXAgPSBncm91cDsKKworCWV4dDRfc2V0X2lub2RlX2ZsYWdzKGlub2RlKTsKKwlpZiAoSVNfRElSU1lOQyhpbm9kZSkpCisJCWhhbmRsZS0+aF9zeW5jID0gMTsKKwlpbnNlcnRfaW5vZGVfaGFzaChpbm9kZSk7CisJc3Bpbl9sb2NrKCZzYmktPnNfbmV4dF9nZW5fbG9jayk7CisJaW5vZGUtPmlfZ2VuZXJhdGlvbiA9IHNiaS0+c19uZXh0X2dlbmVyYXRpb24rKzsKKwlzcGluX3VubG9jaygmc2JpLT5zX25leHRfZ2VuX2xvY2spOworCisJZWktPmlfc3RhdGUgPSBFWFQ0X1NUQVRFX05FVzsKKwllaS0+aV9leHRyYV9pc2l6ZSA9CisJCShFWFQ0X0lOT0RFX1NJWkUoaW5vZGUtPmlfc2IpID4gRVhUNF9HT09EX09MRF9JTk9ERV9TSVpFKSA/CisJCXNpemVvZihzdHJ1Y3QgZXh0NF9pbm9kZSkgLSBFWFQ0X0dPT0RfT0xEX0lOT0RFX1NJWkUgOiAwOworCisJcmV0ID0gaW5vZGU7CisJaWYoRFFVT1RfQUxMT0NfSU5PREUoaW5vZGUpKSB7CisJCWVyciA9IC1FRFFVT1Q7CisJCWdvdG8gZmFpbF9kcm9wOworCX0KKworCWVyciA9IGV4dDRfaW5pdF9hY2woaGFuZGxlLCBpbm9kZSwgZGlyKTsKKwlpZiAoZXJyKQorCQlnb3RvIGZhaWxfZnJlZV9kcm9wOworCisJZXJyID0gZXh0NF9pbml0X3NlY3VyaXR5KGhhbmRsZSxpbm9kZSwgZGlyKTsKKwlpZiAoZXJyKQorCQlnb3RvIGZhaWxfZnJlZV9kcm9wOworCisJZXJyID0gZXh0NF9tYXJrX2lub2RlX2RpcnR5KGhhbmRsZSwgaW5vZGUpOworCWlmIChlcnIpIHsKKwkJZXh0NF9zdGRfZXJyb3Ioc2IsIGVycik7CisJCWdvdG8gZmFpbF9mcmVlX2Ryb3A7CisJfQorCWlmICh0ZXN0X29wdChzYiwgRVhURU5UUykpIHsKKwkJRVhUNF9JKGlub2RlKS0+aV9mbGFncyB8PSBFWFQ0X0VYVEVOVFNfRkw7CisJCWV4dDRfZXh0X3RyZWVfaW5pdChoYW5kbGUsIGlub2RlKTsKKwkJaWYgKCFFWFQ0X0hBU19JTkNPTVBBVF9GRUFUVVJFKHNiLCBFWFQ0X0ZFQVRVUkVfSU5DT01QQVRfRVhURU5UUykpIHsKKwkJCWVyciA9IGV4dDRfam91cm5hbF9nZXRfd3JpdGVfYWNjZXNzKGhhbmRsZSwgRVhUNF9TQihzYiktPnNfc2JoKTsKKwkJCWlmIChlcnIpIGdvdG8gZmFpbDsKKwkJCUVYVDRfU0VUX0lOQ09NUEFUX0ZFQVRVUkUoc2IsIEVYVDRfRkVBVFVSRV9JTkNPTVBBVF9FWFRFTlRTKTsKKwkJCUJVRkZFUl9UUkFDRShFWFQ0X1NCKHNiKS0+c19zYmgsICJjYWxsIGV4dDRfam91cm5hbF9kaXJ0eV9tZXRhZGF0YSIpOworCQkJZXJyID0gZXh0NF9qb3VybmFsX2RpcnR5X21ldGFkYXRhKGhhbmRsZSwgRVhUNF9TQihzYiktPnNfc2JoKTsKKwkJfQorCX0KKworCWV4dDRfZGVidWcoImFsbG9jYXRpbmcgaW5vZGUgJWx1XG4iLCBpbm9kZS0+aV9pbm8pOworCWdvdG8gcmVhbGx5X291dDsKK2ZhaWw6CisJZXh0NF9zdGRfZXJyb3Ioc2IsIGVycik7CitvdXQ6CisJaXB1dChpbm9kZSk7CisJcmV0ID0gRVJSX1BUUihlcnIpOworcmVhbGx5X291dDoKKwlicmVsc2UoYml0bWFwX2JoKTsKKwlyZXR1cm4gcmV0OworCitmYWlsX2ZyZWVfZHJvcDoKKwlEUVVPVF9GUkVFX0lOT0RFKGlub2RlKTsKKworZmFpbF9kcm9wOgorCURRVU9UX0RST1AoaW5vZGUpOworCWlub2RlLT5pX2ZsYWdzIHw9IFNfTk9RVU9UQTsKKwlpbm9kZS0+aV9ubGluayA9IDA7CisJaXB1dChpbm9kZSk7CisJYnJlbHNlKGJpdG1hcF9iaCk7CisJcmV0dXJuIEVSUl9QVFIoZXJyKTsKK30KKworLyogVmVyaWZ5IHRoYXQgd2UgYXJlIGxvYWRpbmcgYSB2YWxpZCBvcnBoYW4gZnJvbSBkaXNrICovCitzdHJ1Y3QgaW5vZGUgKmV4dDRfb3JwaGFuX2dldChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCB1bnNpZ25lZCBsb25nIGlubykKK3sKKwl1bnNpZ25lZCBsb25nIG1heF9pbm8gPSBsZTMyX3RvX2NwdShFWFQ0X1NCKHNiKS0+c19lcy0+c19pbm9kZXNfY291bnQpOworCXVuc2lnbmVkIGxvbmcgYmxvY2tfZ3JvdXA7CisJaW50IGJpdDsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJpdG1hcF9iaCA9IE5VTEw7CisJc3RydWN0IGlub2RlICppbm9kZSA9IE5VTEw7CisKKwkvKiBFcnJvciBjYXNlcyAtIGUyZnNjayBoYXMgYWxyZWFkeSBjbGVhbmVkIHVwIGZvciB1cyAqLworCWlmIChpbm8gPiBtYXhfaW5vKSB7CisJCWV4dDRfd2FybmluZyhzYiwgX19GVU5DVElPTl9fLAorCQkJICAgICAiYmFkIG9ycGhhbiBpbm8gJWx1ISAgZTJmc2NrIHdhcyBydW4/IiwgaW5vKTsKKwkJZ290byBvdXQ7CisJfQorCisJYmxvY2tfZ3JvdXAgPSAoaW5vIC0gMSkgLyBFWFQ0X0lOT0RFU19QRVJfR1JPVVAoc2IpOworCWJpdCA9IChpbm8gLSAxKSAlIEVYVDRfSU5PREVTX1BFUl9HUk9VUChzYik7CisJYml0bWFwX2JoID0gcmVhZF9pbm9kZV9iaXRtYXAoc2IsIGJsb2NrX2dyb3VwKTsKKwlpZiAoIWJpdG1hcF9iaCkgeworCQlleHQ0X3dhcm5pbmcoc2IsIF9fRlVOQ1RJT05fXywKKwkJCSAgICAgImlub2RlIGJpdG1hcCBlcnJvciBmb3Igb3JwaGFuICVsdSIsIGlubyk7CisJCWdvdG8gb3V0OworCX0KKworCS8qIEhhdmluZyB0aGUgaW5vZGUgYml0IHNldCBzaG91bGQgYmUgYSAxMDAlIGluZGljYXRvciB0aGF0IHRoaXMKKwkgKiBpcyBhIHZhbGlkIG9ycGhhbiAobm8gZTJmc2NrIHJ1biBvbiBmcykuICBPcnBoYW5zIGFsc28gaW5jbHVkZQorCSAqIGlub2RlcyB0aGF0IHdlcmUgYmVpbmcgdHJ1bmNhdGVkLCBzbyB3ZSBjYW4ndCBjaGVjayBpX25saW5rPT0wLgorCSAqLworCWlmICghZXh0NF90ZXN0X2JpdChiaXQsIGJpdG1hcF9iaC0+Yl9kYXRhKSB8fAorCQkJIShpbm9kZSA9IGlnZXQoc2IsIGlubykpIHx8IGlzX2JhZF9pbm9kZShpbm9kZSkgfHwKKwkJCU5FWFRfT1JQSEFOKGlub2RlKSA+IG1heF9pbm8pIHsKKwkJZXh0NF93YXJuaW5nKHNiLCBfX0ZVTkNUSU9OX18sCisJCQkgICAgICJiYWQgb3JwaGFuIGlub2RlICVsdSEgIGUyZnNjayB3YXMgcnVuPyIsIGlubyk7CisJCXByaW50ayhLRVJOX05PVElDRSAiZXh0NF90ZXN0X2JpdChiaXQ9JWQsIGJsb2NrPSVsbHUpID0gJWRcbiIsCisJCSAgICAgICBiaXQsICh1bnNpZ25lZCBsb25nIGxvbmcpYml0bWFwX2JoLT5iX2Jsb2NrbnIsCisJCSAgICAgICBleHQ0X3Rlc3RfYml0KGJpdCwgYml0bWFwX2JoLT5iX2RhdGEpKTsKKwkJcHJpbnRrKEtFUk5fTk9USUNFICJpbm9kZT0lcFxuIiwgaW5vZGUpOworCQlpZiAoaW5vZGUpIHsKKwkJCXByaW50ayhLRVJOX05PVElDRSAiaXNfYmFkX2lub2RlKGlub2RlKT0lZFxuIiwKKwkJCSAgICAgICBpc19iYWRfaW5vZGUoaW5vZGUpKTsKKwkJCXByaW50ayhLRVJOX05PVElDRSAiTkVYVF9PUlBIQU4oaW5vZGUpPSV1XG4iLAorCQkJICAgICAgIE5FWFRfT1JQSEFOKGlub2RlKSk7CisJCQlwcmludGsoS0VSTl9OT1RJQ0UgIm1heF9pbm89JWx1XG4iLCBtYXhfaW5vKTsKKwkJfQorCQkvKiBBdm9pZCBmcmVlaW5nIGJsb2NrcyBpZiB3ZSBnb3QgYSBiYWQgZGVsZXRlZCBpbm9kZSAqLworCQlpZiAoaW5vZGUgJiYgaW5vZGUtPmlfbmxpbmsgPT0gMCkKKwkJCWlub2RlLT5pX2Jsb2NrcyA9IDA7CisJCWlwdXQoaW5vZGUpOworCQlpbm9kZSA9IE5VTEw7CisJfQorb3V0OgorCWJyZWxzZShiaXRtYXBfYmgpOworCXJldHVybiBpbm9kZTsKK30KKwordW5zaWduZWQgbG9uZyBleHQ0X2NvdW50X2ZyZWVfaW5vZGVzIChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiBzYikKK3sKKwl1bnNpZ25lZCBsb25nIGRlc2NfY291bnQ7CisJc3RydWN0IGV4dDRfZ3JvdXBfZGVzYyAqZ2RwOworCWludCBpOworI2lmZGVmIEVYVDRGU19ERUJVRworCXN0cnVjdCBleHQ0X3N1cGVyX2Jsb2NrICplczsKKwl1bnNpZ25lZCBsb25nIGJpdG1hcF9jb3VudCwgeDsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJpdG1hcF9iaCA9IE5VTEw7CisKKwllcyA9IEVYVDRfU0Ioc2IpLT5zX2VzOworCWRlc2NfY291bnQgPSAwOworCWJpdG1hcF9jb3VudCA9IDA7CisJZ2RwID0gTlVMTDsKKwlmb3IgKGkgPSAwOyBpIDwgRVhUNF9TQihzYiktPnNfZ3JvdXBzX2NvdW50OyBpKyspIHsKKwkJZ2RwID0gZXh0NF9nZXRfZ3JvdXBfZGVzYyAoc2IsIGksIE5VTEwpOworCQlpZiAoIWdkcCkKKwkJCWNvbnRpbnVlOworCQlkZXNjX2NvdW50ICs9IGxlMTZfdG9fY3B1KGdkcC0+YmdfZnJlZV9pbm9kZXNfY291bnQpOworCQlicmVsc2UoYml0bWFwX2JoKTsKKwkJYml0bWFwX2JoID0gcmVhZF9pbm9kZV9iaXRtYXAoc2IsIGkpOworCQlpZiAoIWJpdG1hcF9iaCkKKwkJCWNvbnRpbnVlOworCisJCXggPSBleHQ0X2NvdW50X2ZyZWUoYml0bWFwX2JoLCBFWFQ0X0lOT0RFU19QRVJfR1JPVVAoc2IpIC8gOCk7CisJCXByaW50aygiZ3JvdXAgJWQ6IHN0b3JlZCA9ICVkLCBjb3VudGVkID0gJWx1XG4iLAorCQkJaSwgbGUxNl90b19jcHUoZ2RwLT5iZ19mcmVlX2lub2Rlc19jb3VudCksIHgpOworCQliaXRtYXBfY291bnQgKz0geDsKKwl9CisJYnJlbHNlKGJpdG1hcF9iaCk7CisJcHJpbnRrKCJleHQ0X2NvdW50X2ZyZWVfaW5vZGVzOiBzdG9yZWQgPSAldSwgY29tcHV0ZWQgPSAlbHUsICVsdVxuIiwKKwkJbGUzMl90b19jcHUoZXMtPnNfZnJlZV9pbm9kZXNfY291bnQpLCBkZXNjX2NvdW50LCBiaXRtYXBfY291bnQpOworCXJldHVybiBkZXNjX2NvdW50OworI2Vsc2UKKwlkZXNjX2NvdW50ID0gMDsKKwlmb3IgKGkgPSAwOyBpIDwgRVhUNF9TQihzYiktPnNfZ3JvdXBzX2NvdW50OyBpKyspIHsKKwkJZ2RwID0gZXh0NF9nZXRfZ3JvdXBfZGVzYyAoc2IsIGksIE5VTEwpOworCQlpZiAoIWdkcCkKKwkJCWNvbnRpbnVlOworCQlkZXNjX2NvdW50ICs9IGxlMTZfdG9fY3B1KGdkcC0+YmdfZnJlZV9pbm9kZXNfY291bnQpOworCQljb25kX3Jlc2NoZWQoKTsKKwl9CisJcmV0dXJuIGRlc2NfY291bnQ7CisjZW5kaWYKK30KKworLyogQ2FsbGVkIGF0IG1vdW50LXRpbWUsIHN1cGVyLWJsb2NrIGlzIGxvY2tlZCAqLwordW5zaWduZWQgbG9uZyBleHQ0X2NvdW50X2RpcnMgKHN0cnVjdCBzdXBlcl9ibG9jayAqIHNiKQoreworCXVuc2lnbmVkIGxvbmcgY291bnQgPSAwOworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IEVYVDRfU0Ioc2IpLT5zX2dyb3Vwc19jb3VudDsgaSsrKSB7CisJCXN0cnVjdCBleHQ0X2dyb3VwX2Rlc2MgKmdkcCA9IGV4dDRfZ2V0X2dyb3VwX2Rlc2MgKHNiLCBpLCBOVUxMKTsKKwkJaWYgKCFnZHApCisJCQljb250aW51ZTsKKwkJY291bnQgKz0gbGUxNl90b19jcHUoZ2RwLT5iZ191c2VkX2RpcnNfY291bnQpOworCX0KKwlyZXR1cm4gY291bnQ7Cit9CisKZGlmZiAtLWdpdCBhL2ZzL2V4dDQvaW5vZGUuYyBiL2ZzL2V4dDQvaW5vZGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYTYwZWM1Ci0tLSAvZGV2L251bGwKKysrIGIvZnMvZXh0NC9pbm9kZS5jCkBAIC0wLDAgKzEsMzIzMyBAQAorLyoKKyAqICBsaW51eC9mcy9leHQ0L2lub2RlLmMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTIsIDE5OTMsIDE5OTQsIDE5OTUKKyAqIFJlbXkgQ2FyZCAoY2FyZEBtYXNpLmlicC5mcikKKyAqIExhYm9yYXRvaXJlIE1BU0kgLSBJbnN0aXR1dCBCbGFpc2UgUGFzY2FsCisgKiBVbml2ZXJzaXRlIFBpZXJyZSBldCBNYXJpZSBDdXJpZSAoUGFyaXMgVkkpCisgKgorICogIGZyb20KKyAqCisgKiAgbGludXgvZnMvbWluaXgvaW5vZGUuYworICoKKyAqICBDb3B5cmlnaHQgKEMpIDE5OTEsIDE5OTIgIExpbnVzIFRvcnZhbGRzCisgKgorICogIEdvYWwtZGlyZWN0ZWQgYmxvY2sgYWxsb2NhdGlvbiBieSBTdGVwaGVuIFR3ZWVkaWUKKyAqCShzY3RAcmVkaGF0LmNvbSksIDE5OTMsIDE5OTgKKyAqICBCaWctZW5kaWFuIHRvIGxpdHRsZS1lbmRpYW4gYnl0ZS1zd2FwcGluZy9iaXRtYXBzIGJ5CisgKiAgICAgICAgRGF2aWQgUy4gTWlsbGVyIChkYXZlbUBjYWlwLnJ1dGdlcnMuZWR1KSwgMTk5NQorICogIDY0LWJpdCBmaWxlIHN1cHBvcnQgb24gNjQtYml0IHBsYXRmb3JtcyBieSBKYWt1YiBKZWxpbmVrCisgKgkoampAc3Vuc2l0ZS5tcy5tZmYuY3VuaS5jeikKKyAqCisgKiAgQXNzb3J0ZWQgcmFjZSBmaXhlcywgcmV3cml0ZSBvZiBleHQ0X2dldF9ibG9jaygpIGJ5IEFsIFZpcm8sIDIwMDAKKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lLmg+CisjaW5jbHVkZSA8bGludXgvZXh0NF9qYmQyLmg+CisjaW5jbHVkZSA8bGludXgvamJkMi5oPgorI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvaGlnaHVpZC5oPgorI2luY2x1ZGUgPGxpbnV4L3BhZ2VtYXAuaD4KKyNpbmNsdWRlIDxsaW51eC9xdW90YW9wcy5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L2J1ZmZlcl9oZWFkLmg+CisjaW5jbHVkZSA8bGludXgvd3JpdGViYWNrLmg+CisjaW5jbHVkZSA8bGludXgvbXBhZ2UuaD4KKyNpbmNsdWRlIDxsaW51eC91aW8uaD4KKyNpbmNsdWRlIDxsaW51eC9iaW8uaD4KKyNpbmNsdWRlICJ4YXR0ci5oIgorI2luY2x1ZGUgImFjbC5oIgorCisvKgorICogVGVzdCB3aGV0aGVyIGFuIGlub2RlIGlzIGEgZmFzdCBzeW1saW5rLgorICovCitzdGF0aWMgaW50IGV4dDRfaW5vZGVfaXNfZmFzdF9zeW1saW5rKHN0cnVjdCBpbm9kZSAqaW5vZGUpCit7CisJaW50IGVhX2Jsb2NrcyA9IEVYVDRfSShpbm9kZSktPmlfZmlsZV9hY2wgPworCQkoaW5vZGUtPmlfc2ItPnNfYmxvY2tzaXplID4+IDkpIDogMDsKKworCXJldHVybiAoU19JU0xOSyhpbm9kZS0+aV9tb2RlKSAmJiBpbm9kZS0+aV9ibG9ja3MgLSBlYV9ibG9ja3MgPT0gMCk7Cit9CisKKy8qCisgKiBUaGUgZXh0NCBmb3JnZXQgZnVuY3Rpb24gbXVzdCBwZXJmb3JtIGEgcmV2b2tlIGlmIHdlIGFyZSBmcmVlaW5nIGRhdGEKKyAqIHdoaWNoIGhhcyBiZWVuIGpvdXJuYWxlZC4gIE1ldGFkYXRhIChlZy4gaW5kaXJlY3QgYmxvY2tzKSBtdXN0IGJlCisgKiByZXZva2VkIGluIGFsbCBjYXNlcy4KKyAqCisgKiAiYmgiIG1heSBiZSBOVUxMOiBhIG1ldGFkYXRhIGJsb2NrIG1heSBoYXZlIGJlZW4gZnJlZWQgZnJvbSBtZW1vcnkKKyAqIGJ1dCB0aGVyZSBtYXkgc3RpbGwgYmUgYSByZWNvcmQgb2YgaXQgaW4gdGhlIGpvdXJuYWwsIGFuZCB0aGF0IHJlY29yZAorICogc3RpbGwgbmVlZHMgdG8gYmUgcmV2b2tlZC4KKyAqLworaW50IGV4dDRfZm9yZ2V0KGhhbmRsZV90ICpoYW5kbGUsIGludCBpc19tZXRhZGF0YSwgc3RydWN0IGlub2RlICppbm9kZSwKKwkJCXN0cnVjdCBidWZmZXJfaGVhZCAqYmgsIGV4dDRfZnNibGtfdCBibG9ja25yKQoreworCWludCBlcnI7CisKKwltaWdodF9zbGVlcCgpOworCisJQlVGRkVSX1RSQUNFKGJoLCAiZW50ZXIiKTsKKworCWpiZF9kZWJ1Zyg0LCAiZm9yZ2V0dGluZyBiaCAlcDogaXNfbWV0YWRhdGEgPSAlZCwgbW9kZSAlbywgIgorCQkgICJkYXRhIG1vZGUgJWx4XG4iLAorCQkgIGJoLCBpc19tZXRhZGF0YSwgaW5vZGUtPmlfbW9kZSwKKwkJICB0ZXN0X29wdChpbm9kZS0+aV9zYiwgREFUQV9GTEFHUykpOworCisJLyogTmV2ZXIgdXNlIHRoZSByZXZva2UgZnVuY3Rpb24gaWYgd2UgYXJlIGRvaW5nIGZ1bGwgZGF0YQorCSAqIGpvdXJuYWxpbmc6IHRoZXJlIGlzIG5vIG5lZWQgdG8sIGFuZCBhIFYxIHN1cGVyYmxvY2sgd29uJ3QKKwkgKiBzdXBwb3J0IGl0LiAgT3RoZXJ3aXNlLCBvbmx5IHNraXAgdGhlIHJldm9rZSBvbiB1bi1qb3VybmFsZWQKKwkgKiBkYXRhIGJsb2Nrcy4gKi8KKworCWlmICh0ZXN0X29wdChpbm9kZS0+aV9zYiwgREFUQV9GTEFHUykgPT0gRVhUNF9NT1VOVF9KT1VSTkFMX0RBVEEgfHwKKwkgICAgKCFpc19tZXRhZGF0YSAmJiAhZXh0NF9zaG91bGRfam91cm5hbF9kYXRhKGlub2RlKSkpIHsKKwkJaWYgKGJoKSB7CisJCQlCVUZGRVJfVFJBQ0UoYmgsICJjYWxsIGpiZDJfam91cm5hbF9mb3JnZXQiKTsKKwkJCXJldHVybiBleHQ0X2pvdXJuYWxfZm9yZ2V0KGhhbmRsZSwgYmgpOworCQl9CisJCXJldHVybiAwOworCX0KKworCS8qCisJICogZGF0YSE9am91cm5hbCAmJiAoaXNfbWV0YWRhdGEgfHwgc2hvdWxkX2pvdXJuYWxfZGF0YShpbm9kZSkpCisJICovCisJQlVGRkVSX1RSQUNFKGJoLCAiY2FsbCBleHQ0X2pvdXJuYWxfcmV2b2tlIik7CisJZXJyID0gZXh0NF9qb3VybmFsX3Jldm9rZShoYW5kbGUsIGJsb2NrbnIsIGJoKTsKKwlpZiAoZXJyKQorCQlleHQ0X2Fib3J0KGlub2RlLT5pX3NiLCBfX0ZVTkNUSU9OX18sCisJCQkgICAiZXJyb3IgJWQgd2hlbiBhdHRlbXB0aW5nIHJldm9rZSIsIGVycik7CisJQlVGRkVSX1RSQUNFKGJoLCAiZXhpdCIpOworCXJldHVybiBlcnI7Cit9CisKKy8qCisgKiBXb3JrIG91dCBob3cgbWFueSBibG9ja3Mgd2UgbmVlZCB0byBwcm9jZWVkIHdpdGggdGhlIG5leHQgY2h1bmsgb2YgYQorICogdHJ1bmNhdGUgdHJhbnNhY3Rpb24uCisgKi8KK3N0YXRpYyB1bnNpZ25lZCBsb25nIGJsb2Nrc19mb3JfdHJ1bmNhdGUoc3RydWN0IGlub2RlICppbm9kZSkKK3sKKwl1bnNpZ25lZCBsb25nIG5lZWRlZDsKKworCW5lZWRlZCA9IGlub2RlLT5pX2Jsb2NrcyA+PiAoaW5vZGUtPmlfc2ItPnNfYmxvY2tzaXplX2JpdHMgLSA5KTsKKworCS8qIEdpdmUgb3Vyc2VsdmVzIGp1c3QgZW5vdWdoIHJvb20gdG8gY29wZSB3aXRoIGlub2RlcyBpbiB3aGljaAorCSAqIGlfYmxvY2tzIGlzIGNvcnJ1cHQ6IHdlJ3ZlIHNlZW4gZGlzayBjb3JydXB0aW9ucyBpbiB0aGUgcGFzdAorCSAqIHdoaWNoIHJlc3VsdGVkIGluIHJhbmRvbSBkYXRhIGluIGFuIGlub2RlIHdoaWNoIGxvb2tlZCBlbm91Z2gKKwkgKiBsaWtlIGEgcmVndWxhciBmaWxlIGZvciBleHQ0IHRvIHRyeSB0byBkZWxldGUgaXQuICBUaGluZ3MKKwkgKiB3aWxsIGdvIGEgYml0IGNyYXp5IGlmIHRoYXQgaGFwcGVucywgYnV0IGF0IGxlYXN0IHdlIHNob3VsZAorCSAqIHRyeSBub3QgdG8gcGFuaWMgdGhlIHdob2xlIGtlcm5lbC4gKi8KKwlpZiAobmVlZGVkIDwgMikKKwkJbmVlZGVkID0gMjsKKworCS8qIEJ1dCB3ZSBuZWVkIHRvIGJvdW5kIHRoZSB0cmFuc2FjdGlvbiBzbyB3ZSBkb24ndCBvdmVyZmxvdyB0aGUKKwkgKiBqb3VybmFsLiAqLworCWlmIChuZWVkZWQgPiBFWFQ0X01BWF9UUkFOU19EQVRBKQorCQluZWVkZWQgPSBFWFQ0X01BWF9UUkFOU19EQVRBOworCisJcmV0dXJuIEVYVDRfREFUQV9UUkFOU19CTE9DS1MoaW5vZGUtPmlfc2IpICsgbmVlZGVkOworfQorCisvKgorICogVHJ1bmNhdGUgdHJhbnNhY3Rpb25zIGNhbiBiZSBjb21wbGV4IGFuZCBhYnNvbHV0ZWx5IGh1Z2UuICBTbyB3ZSBuZWVkIHRvCisgKiBiZSBhYmxlIHRvIHJlc3RhcnQgdGhlIHRyYW5zYWN0aW9uIGF0IGEgY29udmVudGllbnQgY2hlY2twb2ludCB0byBtYWtlCisgKiBzdXJlIHdlIGRvbid0IG92ZXJmbG93IHRoZSBqb3VybmFsLgorICoKKyAqIHN0YXJ0X3RyYW5zYWN0aW9uIGdldHMgdXMgYSBuZXcgaGFuZGxlIGZvciBhIHRydW5jYXRlIHRyYW5zYWN0aW9uLAorICogYW5kIGV4dGVuZF90cmFuc2FjdGlvbiB0cmllcyB0byBleHRlbmQgdGhlIGV4aXN0aW5nIG9uZSBhIGJpdC4gIElmCisgKiBleHRlbmQgZmFpbHMsIHdlIG5lZWQgdG8gcHJvcGFnYXRlIHRoZSBmYWlsdXJlIHVwIGFuZCByZXN0YXJ0IHRoZQorICogdHJhbnNhY3Rpb24gaW4gdGhlIHRvcC1sZXZlbCB0cnVuY2F0ZSBsb29wLiAtLXNjdAorICovCitzdGF0aWMgaGFuZGxlX3QgKnN0YXJ0X3RyYW5zYWN0aW9uKHN0cnVjdCBpbm9kZSAqaW5vZGUpCit7CisJaGFuZGxlX3QgKnJlc3VsdDsKKworCXJlc3VsdCA9IGV4dDRfam91cm5hbF9zdGFydChpbm9kZSwgYmxvY2tzX2Zvcl90cnVuY2F0ZShpbm9kZSkpOworCWlmICghSVNfRVJSKHJlc3VsdCkpCisJCXJldHVybiByZXN1bHQ7CisKKwlleHQ0X3N0ZF9lcnJvcihpbm9kZS0+aV9zYiwgUFRSX0VSUihyZXN1bHQpKTsKKwlyZXR1cm4gcmVzdWx0OworfQorCisvKgorICogVHJ5IHRvIGV4dGVuZCB0aGlzIHRyYW5zYWN0aW9uIGZvciB0aGUgcHVycG9zZXMgb2YgdHJ1bmNhdGlvbi4KKyAqCisgKiBSZXR1cm5zIDAgaWYgd2UgbWFuYWdlZCB0byBjcmVhdGUgbW9yZSByb29tLiAgSWYgd2UgY2FuJ3QgY3JlYXRlIG1vcmUKKyAqIHJvb20sIGFuZCB0aGUgdHJhbnNhY3Rpb24gbXVzdCBiZSByZXN0YXJ0ZWQgd2UgcmV0dXJuIDEuCisgKi8KK3N0YXRpYyBpbnQgdHJ5X3RvX2V4dGVuZF90cmFuc2FjdGlvbihoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3QgaW5vZGUgKmlub2RlKQoreworCWlmIChoYW5kbGUtPmhfYnVmZmVyX2NyZWRpdHMgPiBFWFQ0X1JFU0VSVkVfVFJBTlNfQkxPQ0tTKQorCQlyZXR1cm4gMDsKKwlpZiAoIWV4dDRfam91cm5hbF9leHRlbmQoaGFuZGxlLCBibG9ja3NfZm9yX3RydW5jYXRlKGlub2RlKSkpCisJCXJldHVybiAwOworCXJldHVybiAxOworfQorCisvKgorICogUmVzdGFydCB0aGUgdHJhbnNhY3Rpb24gYXNzb2NpYXRlZCB3aXRoICpoYW5kbGUuICBUaGlzIGRvZXMgYSBjb21taXQsCisgKiBzbyBiZWZvcmUgd2UgY2FsbCBoZXJlIGV2ZXJ5dGhpbmcgbXVzdCBiZSBjb25zaXN0ZW50bHkgZGlydGllZCBhZ2FpbnN0CisgKiB0aGlzIHRyYW5zYWN0aW9uLgorICovCitzdGF0aWMgaW50IGV4dDRfam91cm5hbF90ZXN0X3Jlc3RhcnQoaGFuZGxlX3QgKmhhbmRsZSwgc3RydWN0IGlub2RlICppbm9kZSkKK3sKKwlqYmRfZGVidWcoMiwgInJlc3RhcnRpbmcgaGFuZGxlICVwXG4iLCBoYW5kbGUpOworCXJldHVybiBleHQ0X2pvdXJuYWxfcmVzdGFydChoYW5kbGUsIGJsb2Nrc19mb3JfdHJ1bmNhdGUoaW5vZGUpKTsKK30KKworLyoKKyAqIENhbGxlZCBhdCB0aGUgbGFzdCBpcHV0KCkgaWYgaV9ubGluayBpcyB6ZXJvLgorICovCit2b2lkIGV4dDRfZGVsZXRlX2lub2RlIChzdHJ1Y3QgaW5vZGUgKiBpbm9kZSkKK3sKKwloYW5kbGVfdCAqaGFuZGxlOworCisJdHJ1bmNhdGVfaW5vZGVfcGFnZXMoJmlub2RlLT5pX2RhdGEsIDApOworCisJaWYgKGlzX2JhZF9pbm9kZShpbm9kZSkpCisJCWdvdG8gbm9fZGVsZXRlOworCisJaGFuZGxlID0gc3RhcnRfdHJhbnNhY3Rpb24oaW5vZGUpOworCWlmIChJU19FUlIoaGFuZGxlKSkgeworCQkvKgorCQkgKiBJZiB3ZSdyZSBnb2luZyB0byBza2lwIHRoZSBub3JtYWwgY2xlYW51cCwgd2Ugc3RpbGwgbmVlZCB0bworCQkgKiBtYWtlIHN1cmUgdGhhdCB0aGUgaW4tY29yZSBvcnBoYW4gbGlua2VkIGxpc3QgaXMgcHJvcGVybHkKKwkJICogY2xlYW5lZCB1cC4KKwkJICovCisJCWV4dDRfb3JwaGFuX2RlbChOVUxMLCBpbm9kZSk7CisJCWdvdG8gbm9fZGVsZXRlOworCX0KKworCWlmIChJU19TWU5DKGlub2RlKSkKKwkJaGFuZGxlLT5oX3N5bmMgPSAxOworCWlub2RlLT5pX3NpemUgPSAwOworCWlmIChpbm9kZS0+aV9ibG9ja3MpCisJCWV4dDRfdHJ1bmNhdGUoaW5vZGUpOworCS8qCisJICogS2lsbCBvZmYgdGhlIG9ycGhhbiByZWNvcmQgd2hpY2ggZXh0NF90cnVuY2F0ZSBjcmVhdGVkLgorCSAqIEFLUE06IEkgdGhpbmsgdGhpcyBjYW4gYmUgaW5zaWRlIHRoZSBhYm92ZSBgaWYnLgorCSAqIE5vdGUgdGhhdCBleHQ0X29ycGhhbl9kZWwoKSBoYXMgdG8gYmUgYWJsZSB0byBjb3BlIHdpdGggdGhlCisJICogZGVsZXRpb24gb2YgYSBub24tZXhpc3RlbnQgb3JwaGFuIC0gdGhpcyBpcyBiZWNhdXNlIHdlIGRvbid0CisJICoga25vdyBpZiBleHQ0X3RydW5jYXRlKCkgYWN0dWFsbHkgY3JlYXRlZCBhbiBvcnBoYW4gcmVjb3JkLgorCSAqIChXZWxsLCB3ZSBjb3VsZCBkbyB0aGlzIGlmIHdlIG5lZWQgdG8sIGJ1dCBoZWNrIC0gaXQgd29ya3MpCisJICovCisJZXh0NF9vcnBoYW5fZGVsKGhhbmRsZSwgaW5vZGUpOworCUVYVDRfSShpbm9kZSktPmlfZHRpbWUJPSBnZXRfc2Vjb25kcygpOworCisJLyoKKwkgKiBPbmUgc3VidGxlIG9yZGVyaW5nIHJlcXVpcmVtZW50OiBpZiBhbnl0aGluZyBoYXMgZ29uZSB3cm9uZworCSAqICh0cmFuc2FjdGlvbiBhYm9ydCwgSU8gZXJyb3JzLCB3aGF0ZXZlciksIHRoZW4gd2UgY2FuIHN0aWxsCisJICogZG8gdGhlc2UgbmV4dCBzdGVwcyAodGhlIGZzIHdpbGwgYWxyZWFkeSBoYXZlIGJlZW4gbWFya2VkIGFzCisJICogaGF2aW5nIGVycm9ycyksIGJ1dCB3ZSBjYW4ndCBmcmVlIHRoZSBpbm9kZSBpZiB0aGUgbWFya19kaXJ0eQorCSAqIGZhaWxzLgorCSAqLworCWlmIChleHQ0X21hcmtfaW5vZGVfZGlydHkoaGFuZGxlLCBpbm9kZSkpCisJCS8qIElmIHRoYXQgZmFpbGVkLCBqdXN0IGRvIHRoZSByZXF1aXJlZCBpbi1jb3JlIGlub2RlIGNsZWFyLiAqLworCQljbGVhcl9pbm9kZShpbm9kZSk7CisJZWxzZQorCQlleHQ0X2ZyZWVfaW5vZGUoaGFuZGxlLCBpbm9kZSk7CisJZXh0NF9qb3VybmFsX3N0b3AoaGFuZGxlKTsKKwlyZXR1cm47Citub19kZWxldGU6CisJY2xlYXJfaW5vZGUoaW5vZGUpOwkvKiBXZSBtdXN0IGd1YXJhbnRlZSBjbGVhcmluZyBvZiBpbm9kZS4uLiAqLworfQorCit0eXBlZGVmIHN0cnVjdCB7CisJX19sZTMyCSpwOworCV9fbGUzMglrZXk7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaDsKK30gSW5kaXJlY3Q7CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBhZGRfY2hhaW4oSW5kaXJlY3QgKnAsIHN0cnVjdCBidWZmZXJfaGVhZCAqYmgsIF9fbGUzMiAqdikKK3sKKwlwLT5rZXkgPSAqKHAtPnAgPSB2KTsKKwlwLT5iaCA9IGJoOworfQorCitzdGF0aWMgaW50IHZlcmlmeV9jaGFpbihJbmRpcmVjdCAqZnJvbSwgSW5kaXJlY3QgKnRvKQoreworCXdoaWxlIChmcm9tIDw9IHRvICYmIGZyb20tPmtleSA9PSAqZnJvbS0+cCkKKwkJZnJvbSsrOworCXJldHVybiAoZnJvbSA+IHRvKTsKK30KKworLyoqCisgKglleHQ0X2Jsb2NrX3RvX3BhdGggLSBwYXJzZSB0aGUgYmxvY2sgbnVtYmVyIGludG8gYXJyYXkgb2Ygb2Zmc2V0cworICoJQGlub2RlOiBpbm9kZSBpbiBxdWVzdGlvbiAod2UgYXJlIG9ubHkgaW50ZXJlc3RlZCBpbiBpdHMgc3VwZXJibG9jaykKKyAqCUBpX2Jsb2NrOiBibG9jayBudW1iZXIgdG8gYmUgcGFyc2VkCisgKglAb2Zmc2V0czogYXJyYXkgdG8gc3RvcmUgdGhlIG9mZnNldHMgaW4KKyAqICAgICAgQGJvdW5kYXJ5OiBzZXQgdGhpcyBub24temVybyBpZiB0aGUgcmVmZXJyZWQtdG8gYmxvY2sgaXMgbGlrZWx5IHRvIGJlCisgKiAgICAgICAgICAgICBmb2xsb3dlZCAob24gZGlzaykgYnkgYW4gaW5kaXJlY3QgYmxvY2suCisgKgorICoJVG8gc3RvcmUgdGhlIGxvY2F0aW9ucyBvZiBmaWxlJ3MgZGF0YSBleHQ0IHVzZXMgYSBkYXRhIHN0cnVjdHVyZSBjb21tb24KKyAqCWZvciBVTklYIGZpbGVzeXN0ZW1zIC0gdHJlZSBvZiBwb2ludGVycyBhbmNob3JlZCBpbiB0aGUgaW5vZGUsIHdpdGgKKyAqCWRhdGEgYmxvY2tzIGF0IGxlYXZlcyBhbmQgaW5kaXJlY3QgYmxvY2tzIGluIGludGVybWVkaWF0ZSBub2Rlcy4KKyAqCVRoaXMgZnVuY3Rpb24gdHJhbnNsYXRlcyB0aGUgYmxvY2sgbnVtYmVyIGludG8gcGF0aCBpbiB0aGF0IHRyZWUgLQorICoJcmV0dXJuIHZhbHVlIGlzIHRoZSBwYXRoIGxlbmd0aCBhbmQgQG9mZnNldHNbbl0gaXMgdGhlIG9mZnNldCBvZgorICoJcG9pbnRlciB0byAobisxKXRoIG5vZGUgaW4gdGhlIG50aCBvbmUuIElmIEBibG9jayBpcyBvdXQgb2YgcmFuZ2UKKyAqCShuZWdhdGl2ZSBvciB0b28gbGFyZ2UpIHdhcm5pbmcgaXMgcHJpbnRlZCBhbmQgemVybyByZXR1cm5lZC4KKyAqCisgKglOb3RlOiBmdW5jdGlvbiBkb2Vzbid0IGZpbmQgbm9kZSBhZGRyZXNzZXMsIHNvIG5vIElPIGlzIG5lZWRlZC4gQWxsCisgKgl3ZSBuZWVkIHRvIGtub3cgaXMgdGhlIGNhcGFjaXR5IG9mIGluZGlyZWN0IGJsb2NrcyAodGFrZW4gZnJvbSB0aGUKKyAqCWlub2RlLT5pX3NiKS4KKyAqLworCisvKgorICogUG9ydGFiaWxpdHkgbm90ZTogdGhlIGxhc3QgY29tcGFyaXNvbiAoY2hlY2sgdGhhdCB3ZSBmaXQgaW50byB0cmlwbGUKKyAqIGluZGlyZWN0IGJsb2NrKSBpcyBzcGVsbGVkIGRpZmZlcmVudGx5LCBiZWNhdXNlIG90aGVyd2lzZSBvbiBhbgorICogYXJjaGl0ZWN0dXJlIHdpdGggMzItYml0IGxvbmdzIGFuZCA4S2IgcGFnZXMgd2UgbWlnaHQgZ2V0IGludG8gdHJvdWJsZQorICogaWYgb3VyIGZpbGVzeXN0ZW0gaGFkIDhLYiBibG9ja3MuIFdlIG1pZ2h0IHVzZSBsb25nIGxvbmcsIGJ1dCB0aGF0IHdvdWxkCisgKiBraWxsIHVzIG9uIHg4Ni4gT2gsIHdlbGwsIGF0IGxlYXN0IHRoZSBzaWduIHByb3BhZ2F0aW9uIGRvZXMgbm90IG1hdHRlciAtCisgKiBpX2Jsb2NrIHdvdWxkIGhhdmUgdG8gYmUgbmVnYXRpdmUgaW4gdGhlIHZlcnkgYmVnaW5uaW5nLCBzbyB3ZSB3b3VsZCBub3QKKyAqIGdldCB0aGVyZSBhdCBhbGwuCisgKi8KKworc3RhdGljIGludCBleHQ0X2Jsb2NrX3RvX3BhdGgoc3RydWN0IGlub2RlICppbm9kZSwKKwkJCWxvbmcgaV9ibG9jaywgaW50IG9mZnNldHNbNF0sIGludCAqYm91bmRhcnkpCit7CisJaW50IHB0cnMgPSBFWFQ0X0FERFJfUEVSX0JMT0NLKGlub2RlLT5pX3NiKTsKKwlpbnQgcHRyc19iaXRzID0gRVhUNF9BRERSX1BFUl9CTE9DS19CSVRTKGlub2RlLT5pX3NiKTsKKwljb25zdCBsb25nIGRpcmVjdF9ibG9ja3MgPSBFWFQ0X05ESVJfQkxPQ0tTLAorCQlpbmRpcmVjdF9ibG9ja3MgPSBwdHJzLAorCQlkb3VibGVfYmxvY2tzID0gKDEgPDwgKHB0cnNfYml0cyAqIDIpKTsKKwlpbnQgbiA9IDA7CisJaW50IGZpbmFsID0gMDsKKworCWlmIChpX2Jsb2NrIDwgMCkgeworCQlleHQ0X3dhcm5pbmcgKGlub2RlLT5pX3NiLCAiZXh0NF9ibG9ja190b19wYXRoIiwgImJsb2NrIDwgMCIpOworCX0gZWxzZSBpZiAoaV9ibG9jayA8IGRpcmVjdF9ibG9ja3MpIHsKKwkJb2Zmc2V0c1tuKytdID0gaV9ibG9jazsKKwkJZmluYWwgPSBkaXJlY3RfYmxvY2tzOworCX0gZWxzZSBpZiAoIChpX2Jsb2NrIC09IGRpcmVjdF9ibG9ja3MpIDwgaW5kaXJlY3RfYmxvY2tzKSB7CisJCW9mZnNldHNbbisrXSA9IEVYVDRfSU5EX0JMT0NLOworCQlvZmZzZXRzW24rK10gPSBpX2Jsb2NrOworCQlmaW5hbCA9IHB0cnM7CisJfSBlbHNlIGlmICgoaV9ibG9jayAtPSBpbmRpcmVjdF9ibG9ja3MpIDwgZG91YmxlX2Jsb2NrcykgeworCQlvZmZzZXRzW24rK10gPSBFWFQ0X0RJTkRfQkxPQ0s7CisJCW9mZnNldHNbbisrXSA9IGlfYmxvY2sgPj4gcHRyc19iaXRzOworCQlvZmZzZXRzW24rK10gPSBpX2Jsb2NrICYgKHB0cnMgLSAxKTsKKwkJZmluYWwgPSBwdHJzOworCX0gZWxzZSBpZiAoKChpX2Jsb2NrIC09IGRvdWJsZV9ibG9ja3MpID4+IChwdHJzX2JpdHMgKiAyKSkgPCBwdHJzKSB7CisJCW9mZnNldHNbbisrXSA9IEVYVDRfVElORF9CTE9DSzsKKwkJb2Zmc2V0c1tuKytdID0gaV9ibG9jayA+PiAocHRyc19iaXRzICogMik7CisJCW9mZnNldHNbbisrXSA9IChpX2Jsb2NrID4+IHB0cnNfYml0cykgJiAocHRycyAtIDEpOworCQlvZmZzZXRzW24rK10gPSBpX2Jsb2NrICYgKHB0cnMgLSAxKTsKKwkJZmluYWwgPSBwdHJzOworCX0gZWxzZSB7CisJCWV4dDRfd2FybmluZyhpbm9kZS0+aV9zYiwgImV4dDRfYmxvY2tfdG9fcGF0aCIsICJibG9jayA+IGJpZyIpOworCX0KKwlpZiAoYm91bmRhcnkpCisJCSpib3VuZGFyeSA9IGZpbmFsIC0gMSAtIChpX2Jsb2NrICYgKHB0cnMgLSAxKSk7CisJcmV0dXJuIG47Cit9CisKKy8qKgorICoJZXh0NF9nZXRfYnJhbmNoIC0gcmVhZCB0aGUgY2hhaW4gb2YgaW5kaXJlY3QgYmxvY2tzIGxlYWRpbmcgdG8gZGF0YQorICoJQGlub2RlOiBpbm9kZSBpbiBxdWVzdGlvbgorICoJQGRlcHRoOiBkZXB0aCBvZiB0aGUgY2hhaW4gKDEgLSBkaXJlY3QgcG9pbnRlciwgZXRjLikKKyAqCUBvZmZzZXRzOiBvZmZzZXRzIG9mIHBvaW50ZXJzIGluIGlub2RlL2luZGlyZWN0IGJsb2NrcworICoJQGNoYWluOiBwbGFjZSB0byBzdG9yZSB0aGUgcmVzdWx0CisgKglAZXJyOiBoZXJlIHdlIHN0b3JlIHRoZSBlcnJvciB2YWx1ZQorICoKKyAqCUZ1bmN0aW9uIGZpbGxzIHRoZSBhcnJheSBvZiB0cmlwbGVzIDxrZXksIHAsIGJoPiBhbmQgcmV0dXJucyAlTlVMTAorICoJaWYgZXZlcnl0aGluZyB3ZW50IE9LIG9yIHRoZSBwb2ludGVyIHRvIHRoZSBsYXN0IGZpbGxlZCB0cmlwbGUKKyAqCShpbmNvbXBsZXRlIG9uZSkgb3RoZXJ3aXNlLiBVcG9uIHRoZSByZXR1cm4gY2hhaW5baV0ua2V5IGNvbnRhaW5zCisgKgl0aGUgbnVtYmVyIG9mIChpKzEpLXRoIGJsb2NrIGluIHRoZSBjaGFpbiAoYXMgaXQgaXMgc3RvcmVkIGluIG1lbW9yeSwKKyAqCWkuZS4gbGl0dGxlLWVuZGlhbiAzMi1iaXQpLCBjaGFpbltpXS5wIGNvbnRhaW5zIHRoZSBhZGRyZXNzIG9mIHRoYXQKKyAqCW51bWJlciAoaXQgcG9pbnRzIGludG8gc3RydWN0IGlub2RlIGZvciBpPT0wIGFuZCBpbnRvIHRoZSBiaC0+Yl9kYXRhCisgKglmb3IgaT4wKSBhbmQgY2hhaW5baV0uYmggcG9pbnRzIHRvIHRoZSBidWZmZXJfaGVhZCBvZiBpLXRoIGluZGlyZWN0CisgKglibG9jayBmb3IgaT4wIGFuZCBOVUxMIGZvciBpPT0wLiBJbiBvdGhlciB3b3JkcywgaXQgaG9sZHMgdGhlIGJsb2NrCisgKgludW1iZXJzIG9mIHRoZSBjaGFpbiwgYWRkcmVzc2VzIHRoZXkgd2VyZSB0YWtlbiBmcm9tIChhbmQgd2hlcmUgd2UgY2FuCisgKgl2ZXJpZnkgdGhhdCBjaGFpbiBkaWQgbm90IGNoYW5nZSkgYW5kIGJ1ZmZlcl9oZWFkcyBob3N0aW5nIHRoZXNlCisgKgludW1iZXJzLgorICoKKyAqCUZ1bmN0aW9uIHN0b3BzIHdoZW4gaXQgc3R1bWJsZXMgdXBvbiB6ZXJvIHBvaW50ZXIgKGFic2VudCBibG9jaykKKyAqCQkocG9pbnRlciB0byBsYXN0IHRyaXBsZSByZXR1cm5lZCwgKkBlcnIgPT0gMCkKKyAqCW9yIHdoZW4gaXQgZ2V0cyBhbiBJTyBlcnJvciByZWFkaW5nIGFuIGluZGlyZWN0IGJsb2NrCisgKgkJKGRpdHRvLCAqQGVyciA9PSAtRUlPKQorICoJb3Igd2hlbiBpdCBub3RpY2VzIHRoYXQgY2hhaW4gaGFkIGJlZW4gY2hhbmdlZCB3aGlsZSBpdCB3YXMgcmVhZGluZworICoJCShkaXR0bywgKkBlcnIgPT0gLUVBR0FJTikKKyAqCW9yIHdoZW4gaXQgcmVhZHMgYWxsIEBkZXB0aC0xIGluZGlyZWN0IGJsb2NrcyBzdWNjZXNzZnVsbHkgYW5kIGZpbmRzCisgKgl0aGUgd2hvbGUgY2hhaW4sIGFsbCB3YXkgdG8gdGhlIGRhdGEgKHJldHVybnMgJU5VTEwsICplcnIgPT0gMCkuCisgKi8KK3N0YXRpYyBJbmRpcmVjdCAqZXh0NF9nZXRfYnJhbmNoKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGludCBkZXB0aCwgaW50ICpvZmZzZXRzLAorCQkJCSBJbmRpcmVjdCBjaGFpbls0XSwgaW50ICplcnIpCit7CisJc3RydWN0IHN1cGVyX2Jsb2NrICpzYiA9IGlub2RlLT5pX3NiOworCUluZGlyZWN0ICpwID0gY2hhaW47CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaDsKKworCSplcnIgPSAwOworCS8qIGlfZGF0YSBpcyBub3QgZ29pbmcgYXdheSwgbm8gbG9jayBuZWVkZWQgKi8KKwlhZGRfY2hhaW4gKGNoYWluLCBOVUxMLCBFWFQ0X0koaW5vZGUpLT5pX2RhdGEgKyAqb2Zmc2V0cyk7CisJaWYgKCFwLT5rZXkpCisJCWdvdG8gbm9fYmxvY2s7CisJd2hpbGUgKC0tZGVwdGgpIHsKKwkJYmggPSBzYl9icmVhZChzYiwgbGUzMl90b19jcHUocC0+a2V5KSk7CisJCWlmICghYmgpCisJCQlnb3RvIGZhaWx1cmU7CisJCS8qIFJlYWRlcjogcG9pbnRlcnMgKi8KKwkJaWYgKCF2ZXJpZnlfY2hhaW4oY2hhaW4sIHApKQorCQkJZ290byBjaGFuZ2VkOworCQlhZGRfY2hhaW4oKytwLCBiaCwgKF9fbGUzMiopYmgtPmJfZGF0YSArICorK29mZnNldHMpOworCQkvKiBSZWFkZXI6IGVuZCAqLworCQlpZiAoIXAtPmtleSkKKwkJCWdvdG8gbm9fYmxvY2s7CisJfQorCXJldHVybiBOVUxMOworCitjaGFuZ2VkOgorCWJyZWxzZShiaCk7CisJKmVyciA9IC1FQUdBSU47CisJZ290byBub19ibG9jazsKK2ZhaWx1cmU6CisJKmVyciA9IC1FSU87Citub19ibG9jazoKKwlyZXR1cm4gcDsKK30KKworLyoqCisgKglleHQ0X2ZpbmRfbmVhciAtIGZpbmQgYSBwbGFjZSBmb3IgYWxsb2NhdGlvbiB3aXRoIHN1ZmZpY2llbnQgbG9jYWxpdHkKKyAqCUBpbm9kZTogb3duZXIKKyAqCUBpbmQ6IGRlc2NyaXB0b3Igb2YgaW5kaXJlY3QgYmxvY2suCisgKgorICoJVGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZSBwcmVmZXJlZCBwbGFjZSBmb3IgYmxvY2sgYWxsb2NhdGlvbi4KKyAqCUl0IGlzIHVzZWQgd2hlbiBoZXVyaXN0aWMgZm9yIHNlcXVlbnRpYWwgYWxsb2NhdGlvbiBmYWlscy4KKyAqCVJ1bGVzIGFyZToKKyAqCSAgKyBpZiB0aGVyZSBpcyBhIGJsb2NrIHRvIHRoZSBsZWZ0IG9mIG91ciBwb3NpdGlvbiAtIGFsbG9jYXRlIG5lYXIgaXQuCisgKgkgICsgaWYgcG9pbnRlciB3aWxsIGxpdmUgaW4gaW5kaXJlY3QgYmxvY2sgLSBhbGxvY2F0ZSBuZWFyIHRoYXQgYmxvY2suCisgKgkgICsgaWYgcG9pbnRlciB3aWxsIGxpdmUgaW4gaW5vZGUgLSBhbGxvY2F0ZSBpbiB0aGUgc2FtZQorICoJICAgIGN5bGluZGVyIGdyb3VwLgorICoKKyAqIEluIHRoZSBsYXR0ZXIgY2FzZSB3ZSBjb2xvdXIgdGhlIHN0YXJ0aW5nIGJsb2NrIGJ5IHRoZSBjYWxsZXJzIFBJRCB0bworICogcHJldmVudCBpdCBmcm9tIGNsYXNoaW5nIHdpdGggY29uY3VycmVudCBhbGxvY2F0aW9ucyBmb3IgYSBkaWZmZXJlbnQgaW5vZGUKKyAqIGluIHRoZSBzYW1lIGJsb2NrIGdyb3VwLiAgIFRoZSBQSUQgaXMgdXNlZCBoZXJlIHNvIHRoYXQgZnVuY3Rpb25hbGx5IHJlbGF0ZWQKKyAqIGZpbGVzIHdpbGwgYmUgY2xvc2UtYnkgb24tZGlzay4KKyAqCisgKglDYWxsZXIgbXVzdCBtYWtlIHN1cmUgdGhhdCBAaW5kIGlzIHZhbGlkIGFuZCB3aWxsIHN0YXkgdGhhdCB3YXkuCisgKi8KK3N0YXRpYyBleHQ0X2ZzYmxrX3QgZXh0NF9maW5kX25lYXIoc3RydWN0IGlub2RlICppbm9kZSwgSW5kaXJlY3QgKmluZCkKK3sKKwlzdHJ1Y3QgZXh0NF9pbm9kZV9pbmZvICplaSA9IEVYVDRfSShpbm9kZSk7CisJX19sZTMyICpzdGFydCA9IGluZC0+YmggPyAoX19sZTMyKikgaW5kLT5iaC0+Yl9kYXRhIDogZWktPmlfZGF0YTsKKwlfX2xlMzIgKnA7CisJZXh0NF9mc2Jsa190IGJnX3N0YXJ0OworCWV4dDRfZ3JwYmxrX3QgY29sb3VyOworCisJLyogVHJ5IHRvIGZpbmQgcHJldmlvdXMgYmxvY2sgKi8KKwlmb3IgKHAgPSBpbmQtPnAgLSAxOyBwID49IHN0YXJ0OyBwLS0pIHsKKwkJaWYgKCpwKQorCQkJcmV0dXJuIGxlMzJfdG9fY3B1KCpwKTsKKwl9CisKKwkvKiBObyBzdWNoIHRoaW5nLCBzbyBsZXQncyB0cnkgbG9jYXRpb24gb2YgaW5kaXJlY3QgYmxvY2sgKi8KKwlpZiAoaW5kLT5iaCkKKwkJcmV0dXJuIGluZC0+YmgtPmJfYmxvY2tucjsKKworCS8qCisJICogSXQgaXMgZ29pbmcgdG8gYmUgcmVmZXJyZWQgdG8gZnJvbSB0aGUgaW5vZGUgaXRzZWxmPyBPSywganVzdCBwdXQgaXQKKwkgKiBpbnRvIHRoZSBzYW1lIGN5bGluZGVyIGdyb3VwIHRoZW4uCisJICovCisJYmdfc3RhcnQgPSBleHQ0X2dyb3VwX2ZpcnN0X2Jsb2NrX25vKGlub2RlLT5pX3NiLCBlaS0+aV9ibG9ja19ncm91cCk7CisJY29sb3VyID0gKGN1cnJlbnQtPnBpZCAlIDE2KSAqCisJCQkoRVhUNF9CTE9DS1NfUEVSX0dST1VQKGlub2RlLT5pX3NiKSAvIDE2KTsKKwlyZXR1cm4gYmdfc3RhcnQgKyBjb2xvdXI7Cit9CisKKy8qKgorICoJZXh0NF9maW5kX2dvYWwgLSBmaW5kIGEgcHJlZmVyZWQgcGxhY2UgZm9yIGFsbG9jYXRpb24uCisgKglAaW5vZGU6IG93bmVyCisgKglAYmxvY2s6ICBibG9jayB3ZSB3YW50CisgKglAY2hhaW46ICBjaGFpbiBvZiBpbmRpcmVjdCBibG9ja3MKKyAqCUBwYXJ0aWFsOiBwb2ludGVyIHRvIHRoZSBsYXN0IHRyaXBsZSB3aXRoaW4gYSBjaGFpbgorICoJQGdvYWw6CXBsYWNlIHRvIHN0b3JlIHRoZSByZXN1bHQuCisgKgorICoJTm9ybWFsbHkgdGhpcyBmdW5jdGlvbiBmaW5kIHRoZSBwcmVmZXJlZCBwbGFjZSBmb3IgYmxvY2sgYWxsb2NhdGlvbiwKKyAqCXN0b3JlcyBpdCBpbiAqQGdvYWwgYW5kIHJldHVybnMgemVyby4KKyAqLworCitzdGF0aWMgZXh0NF9mc2Jsa190IGV4dDRfZmluZF9nb2FsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGxvbmcgYmxvY2ssCisJCUluZGlyZWN0IGNoYWluWzRdLCBJbmRpcmVjdCAqcGFydGlhbCkKK3sKKwlzdHJ1Y3QgZXh0NF9ibG9ja19hbGxvY19pbmZvICpibG9ja19pOworCisJYmxvY2tfaSA9ICBFWFQ0X0koaW5vZGUpLT5pX2Jsb2NrX2FsbG9jX2luZm87CisKKwkvKgorCSAqIHRyeSB0aGUgaGV1cmlzdGljIGZvciBzZXF1ZW50aWFsIGFsbG9jYXRpb24sCisJICogZmFpbGluZyB0aGF0IGF0IGxlYXN0IHRyeSB0byBnZXQgZGVjZW50IGxvY2FsaXR5LgorCSAqLworCWlmIChibG9ja19pICYmIChibG9jayA9PSBibG9ja19pLT5sYXN0X2FsbG9jX2xvZ2ljYWxfYmxvY2sgKyAxKQorCQkmJiAoYmxvY2tfaS0+bGFzdF9hbGxvY19waHlzaWNhbF9ibG9jayAhPSAwKSkgeworCQlyZXR1cm4gYmxvY2tfaS0+bGFzdF9hbGxvY19waHlzaWNhbF9ibG9jayArIDE7CisJfQorCisJcmV0dXJuIGV4dDRfZmluZF9uZWFyKGlub2RlLCBwYXJ0aWFsKTsKK30KKworLyoqCisgKglleHQ0X2Jsa3NfdG9fYWxsb2NhdGU6IExvb2sgdXAgdGhlIGJsb2NrIG1hcCBhbmQgY291bnQgdGhlIG51bWJlcgorICoJb2YgZGlyZWN0IGJsb2NrcyBuZWVkIHRvIGJlIGFsbG9jYXRlZCBmb3IgdGhlIGdpdmVuIGJyYW5jaC4KKyAqCisgKglAYnJhbmNoOiBjaGFpbiBvZiBpbmRpcmVjdCBibG9ja3MKKyAqCUBrOiBudW1iZXIgb2YgYmxvY2tzIG5lZWQgZm9yIGluZGlyZWN0IGJsb2NrcworICoJQGJsa3M6IG51bWJlciBvZiBkYXRhIGJsb2NrcyB0byBiZSBtYXBwZWQuCisgKglAYmxvY2tzX3RvX2JvdW5kYXJ5OiAgdGhlIG9mZnNldCBpbiB0aGUgaW5kaXJlY3QgYmxvY2sKKyAqCisgKglyZXR1cm4gdGhlIHRvdGFsIG51bWJlciBvZiBibG9ja3MgdG8gYmUgYWxsb2NhdGUsIGluY2x1ZGluZyB0aGUKKyAqCWRpcmVjdCBhbmQgaW5kaXJlY3QgYmxvY2tzLgorICovCitzdGF0aWMgaW50IGV4dDRfYmxrc190b19hbGxvY2F0ZShJbmRpcmVjdCAqYnJhbmNoLCBpbnQgaywgdW5zaWduZWQgbG9uZyBibGtzLAorCQlpbnQgYmxvY2tzX3RvX2JvdW5kYXJ5KQoreworCXVuc2lnbmVkIGxvbmcgY291bnQgPSAwOworCisJLyoKKwkgKiBTaW1wbGUgY2FzZSwgW3QsZF1JbmRpcmVjdCBibG9jayhzKSBoYXMgbm90IGFsbG9jYXRlZCB5ZXQKKwkgKiB0aGVuIGl0J3MgY2xlYXIgYmxvY2tzIG9uIHRoYXQgcGF0aCBoYXZlIG5vdCBhbGxvY2F0ZWQKKwkgKi8KKwlpZiAoayA+IDApIHsKKwkJLyogcmlnaHQgbm93IHdlIGRvbid0IGhhbmRsZSBjcm9zcyBib3VuZGFyeSBhbGxvY2F0aW9uICovCisJCWlmIChibGtzIDwgYmxvY2tzX3RvX2JvdW5kYXJ5ICsgMSkKKwkJCWNvdW50ICs9IGJsa3M7CisJCWVsc2UKKwkJCWNvdW50ICs9IGJsb2Nrc190b19ib3VuZGFyeSArIDE7CisJCXJldHVybiBjb3VudDsKKwl9CisKKwljb3VudCsrOworCXdoaWxlIChjb3VudCA8IGJsa3MgJiYgY291bnQgPD0gYmxvY2tzX3RvX2JvdW5kYXJ5ICYmCisJCWxlMzJfdG9fY3B1KCooYnJhbmNoWzBdLnAgKyBjb3VudCkpID09IDApIHsKKwkJY291bnQrKzsKKwl9CisJcmV0dXJuIGNvdW50OworfQorCisvKioKKyAqCWV4dDRfYWxsb2NfYmxvY2tzOiBtdWx0aXBsZSBhbGxvY2F0ZSBibG9ja3MgbmVlZGVkIGZvciBhIGJyYW5jaAorICoJQGluZGlyZWN0X2Jsa3M6IHRoZSBudW1iZXIgb2YgYmxvY2tzIG5lZWQgdG8gYWxsb2NhdGUgZm9yIGluZGlyZWN0CisgKgkJCWJsb2NrcworICoKKyAqCUBuZXdfYmxvY2tzOiBvbiByZXR1cm4gaXQgd2lsbCBzdG9yZSB0aGUgbmV3IGJsb2NrIG51bWJlcnMgZm9yCisgKgl0aGUgaW5kaXJlY3QgYmxvY2tzKGlmIG5lZWRlZCkgYW5kIHRoZSBmaXJzdCBkaXJlY3QgYmxvY2ssCisgKglAYmxrczoJb24gcmV0dXJuIGl0IHdpbGwgc3RvcmUgdGhlIHRvdGFsIG51bWJlciBvZiBhbGxvY2F0ZWQKKyAqCQlkaXJlY3QgYmxvY2tzCisgKi8KK3N0YXRpYyBpbnQgZXh0NF9hbGxvY19ibG9ja3MoaGFuZGxlX3QgKmhhbmRsZSwgc3RydWN0IGlub2RlICppbm9kZSwKKwkJCWV4dDRfZnNibGtfdCBnb2FsLCBpbnQgaW5kaXJlY3RfYmxrcywgaW50IGJsa3MsCisJCQlleHQ0X2ZzYmxrX3QgbmV3X2Jsb2Nrc1s0XSwgaW50ICplcnIpCit7CisJaW50IHRhcmdldCwgaTsKKwl1bnNpZ25lZCBsb25nIGNvdW50ID0gMDsKKwlpbnQgaW5kZXggPSAwOworCWV4dDRfZnNibGtfdCBjdXJyZW50X2Jsb2NrID0gMDsKKwlpbnQgcmV0ID0gMDsKKworCS8qCisJICogSGVyZSB3ZSB0cnkgdG8gYWxsb2NhdGUgdGhlIHJlcXVlc3RlZCBtdWx0aXBsZSBibG9ja3MgYXQgb25jZSwKKwkgKiBvbiBhIGJlc3QtZWZmb3J0IGJhc2lzLgorCSAqIFRvIGJ1aWxkIGEgYnJhbmNoLCB3ZSBzaG91bGQgYWxsb2NhdGUgYmxvY2tzIGZvcgorCSAqIHRoZSBpbmRpcmVjdCBibG9ja3MoaWYgbm90IGFsbG9jYXRlZCB5ZXQpLCBhbmQgYXQgbGVhc3QKKwkgKiB0aGUgZmlyc3QgZGlyZWN0IGJsb2NrIG9mIHRoaXMgYnJhbmNoLiAgVGhhdCdzIHRoZQorCSAqIG1pbmltdW0gbnVtYmVyIG9mIGJsb2NrcyBuZWVkIHRvIGFsbG9jYXRlKHJlcXVpcmVkKQorCSAqLworCXRhcmdldCA9IGJsa3MgKyBpbmRpcmVjdF9ibGtzOworCisJd2hpbGUgKDEpIHsKKwkJY291bnQgPSB0YXJnZXQ7CisJCS8qIGFsbG9jYXRpbmcgYmxvY2tzIGZvciBpbmRpcmVjdCBibG9ja3MgYW5kIGRpcmVjdCBibG9ja3MgKi8KKwkJY3VycmVudF9ibG9jayA9IGV4dDRfbmV3X2Jsb2NrcyhoYW5kbGUsaW5vZGUsZ29hbCwmY291bnQsZXJyKTsKKwkJaWYgKCplcnIpCisJCQlnb3RvIGZhaWxlZF9vdXQ7CisKKwkJdGFyZ2V0IC09IGNvdW50OworCQkvKiBhbGxvY2F0ZSBibG9ja3MgZm9yIGluZGlyZWN0IGJsb2NrcyAqLworCQl3aGlsZSAoaW5kZXggPCBpbmRpcmVjdF9ibGtzICYmIGNvdW50KSB7CisJCQluZXdfYmxvY2tzW2luZGV4KytdID0gY3VycmVudF9ibG9jaysrOworCQkJY291bnQtLTsKKwkJfQorCisJCWlmIChjb3VudCA+IDApCisJCQlicmVhazsKKwl9CisKKwkvKiBzYXZlIHRoZSBuZXcgYmxvY2sgbnVtYmVyIGZvciB0aGUgZmlyc3QgZGlyZWN0IGJsb2NrICovCisJbmV3X2Jsb2Nrc1tpbmRleF0gPSBjdXJyZW50X2Jsb2NrOworCisJLyogdG90YWwgbnVtYmVyIG9mIGJsb2NrcyBhbGxvY2F0ZWQgZm9yIGRpcmVjdCBibG9ja3MgKi8KKwlyZXQgPSBjb3VudDsKKwkqZXJyID0gMDsKKwlyZXR1cm4gcmV0OworZmFpbGVkX291dDoKKwlmb3IgKGkgPSAwOyBpIDxpbmRleDsgaSsrKQorCQlleHQ0X2ZyZWVfYmxvY2tzKGhhbmRsZSwgaW5vZGUsIG5ld19ibG9ja3NbaV0sIDEpOworCXJldHVybiByZXQ7Cit9CisKKy8qKgorICoJZXh0NF9hbGxvY19icmFuY2ggLSBhbGxvY2F0ZSBhbmQgc2V0IHVwIGEgY2hhaW4gb2YgYmxvY2tzLgorICoJQGlub2RlOiBvd25lcgorICoJQGluZGlyZWN0X2Jsa3M6IG51bWJlciBvZiBhbGxvY2F0ZWQgaW5kaXJlY3QgYmxvY2tzCisgKglAYmxrczogbnVtYmVyIG9mIGFsbG9jYXRlZCBkaXJlY3QgYmxvY2tzCisgKglAb2Zmc2V0czogb2Zmc2V0cyAoaW4gdGhlIGJsb2NrcykgdG8gc3RvcmUgdGhlIHBvaW50ZXJzIHRvIG5leHQuCisgKglAYnJhbmNoOiBwbGFjZSB0byBzdG9yZSB0aGUgY2hhaW4gaW4uCisgKgorICoJVGhpcyBmdW5jdGlvbiBhbGxvY2F0ZXMgYmxvY2tzLCB6ZXJvZXMgb3V0IGFsbCBidXQgdGhlIGxhc3Qgb25lLAorICoJbGlua3MgdGhlbSBpbnRvIGNoYWluIGFuZCAoaWYgd2UgYXJlIHN5bmNocm9ub3VzKSB3cml0ZXMgdGhlbSB0byBkaXNrLgorICoJSW4gb3RoZXIgd29yZHMsIGl0IHByZXBhcmVzIGEgYnJhbmNoIHRoYXQgY2FuIGJlIHNwbGljZWQgb250byB0aGUKKyAqCWlub2RlLiBJdCBzdG9yZXMgdGhlIGluZm9ybWF0aW9uIGFib3V0IHRoYXQgY2hhaW4gaW4gdGhlIGJyYW5jaFtdLCBpbgorICoJdGhlIHNhbWUgZm9ybWF0IGFzIGV4dDRfZ2V0X2JyYW5jaCgpIHdvdWxkIGRvLiBXZSBhcmUgY2FsbGluZyBpdCBhZnRlcgorICoJd2UgaGFkIHJlYWQgdGhlIGV4aXN0aW5nIHBhcnQgb2YgY2hhaW4gYW5kIHBhcnRpYWwgcG9pbnRzIHRvIHRoZSBsYXN0CisgKgl0cmlwbGUgb2YgdGhhdCAob25lIHdpdGggemVybyAtPmtleSkuIFVwb24gdGhlIGV4aXQgd2UgaGF2ZSB0aGUgc2FtZQorICoJcGljdHVyZSBhcyBhZnRlciB0aGUgc3VjY2Vzc2Z1bCBleHQ0X2dldF9ibG9jaygpLCBleGNlcHQgdGhhdCBpbiBvbmUKKyAqCXBsYWNlIGNoYWluIGlzIGRpc2Nvbm5lY3RlZCAtICpicmFuY2gtPnAgaXMgc3RpbGwgemVybyAod2UgZGlkIG5vdAorICoJc2V0IHRoZSBsYXN0IGxpbmspLCBidXQgYnJhbmNoLT5rZXkgY29udGFpbnMgdGhlIG51bWJlciB0aGF0IHNob3VsZAorICoJYmUgcGxhY2VkIGludG8gKmJyYW5jaC0+cCB0byBmaWxsIHRoYXQgZ2FwLgorICoKKyAqCUlmIGFsbG9jYXRpb24gZmFpbHMgd2UgZnJlZSBhbGwgYmxvY2tzIHdlJ3ZlIGFsbG9jYXRlZCAoYW5kIGZvcmdldAorICoJdGhlaXIgYnVmZmVyX2hlYWRzKSBhbmQgcmV0dXJuIHRoZSBlcnJvciB2YWx1ZSB0aGUgZnJvbSBmYWlsZWQKKyAqCWV4dDRfYWxsb2NfYmxvY2soKSAobm9ybWFsbHkgLUVOT1NQQykuIE90aGVyd2lzZSB3ZSBzZXQgdGhlIGNoYWluCisgKglhcyBkZXNjcmliZWQgYWJvdmUgYW5kIHJldHVybiAwLgorICovCitzdGF0aWMgaW50IGV4dDRfYWxsb2NfYnJhbmNoKGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBpbm9kZSAqaW5vZGUsCisJCQlpbnQgaW5kaXJlY3RfYmxrcywgaW50ICpibGtzLCBleHQ0X2ZzYmxrX3QgZ29hbCwKKwkJCWludCAqb2Zmc2V0cywgSW5kaXJlY3QgKmJyYW5jaCkKK3sKKwlpbnQgYmxvY2tzaXplID0gaW5vZGUtPmlfc2ItPnNfYmxvY2tzaXplOworCWludCBpLCBuID0gMDsKKwlpbnQgZXJyID0gMDsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoOworCWludCBudW07CisJZXh0NF9mc2Jsa190IG5ld19ibG9ja3NbNF07CisJZXh0NF9mc2Jsa190IGN1cnJlbnRfYmxvY2s7CisKKwludW0gPSBleHQ0X2FsbG9jX2Jsb2NrcyhoYW5kbGUsIGlub2RlLCBnb2FsLCBpbmRpcmVjdF9ibGtzLAorCQkJCSpibGtzLCBuZXdfYmxvY2tzLCAmZXJyKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCisJYnJhbmNoWzBdLmtleSA9IGNwdV90b19sZTMyKG5ld19ibG9ja3NbMF0pOworCS8qCisJICogbWV0YWRhdGEgYmxvY2tzIGFuZCBkYXRhIGJsb2NrcyBhcmUgYWxsb2NhdGVkLgorCSAqLworCWZvciAobiA9IDE7IG4gPD0gaW5kaXJlY3RfYmxrczsgIG4rKykgeworCQkvKgorCQkgKiBHZXQgYnVmZmVyX2hlYWQgZm9yIHBhcmVudCBibG9jaywgemVybyBpdCBvdXQKKwkJICogYW5kIHNldCB0aGUgcG9pbnRlciB0byBuZXcgb25lLCB0aGVuIHNlbmQKKwkJICogcGFyZW50IHRvIGRpc2suCisJCSAqLworCQliaCA9IHNiX2dldGJsayhpbm9kZS0+aV9zYiwgbmV3X2Jsb2Nrc1tuLTFdKTsKKwkJYnJhbmNoW25dLmJoID0gYmg7CisJCWxvY2tfYnVmZmVyKGJoKTsKKwkJQlVGRkVSX1RSQUNFKGJoLCAiY2FsbCBnZXRfY3JlYXRlX2FjY2VzcyIpOworCQllcnIgPSBleHQ0X2pvdXJuYWxfZ2V0X2NyZWF0ZV9hY2Nlc3MoaGFuZGxlLCBiaCk7CisJCWlmIChlcnIpIHsKKwkJCXVubG9ja19idWZmZXIoYmgpOworCQkJYnJlbHNlKGJoKTsKKwkJCWdvdG8gZmFpbGVkOworCQl9CisKKwkJbWVtc2V0KGJoLT5iX2RhdGEsIDAsIGJsb2Nrc2l6ZSk7CisJCWJyYW5jaFtuXS5wID0gKF9fbGUzMiAqKSBiaC0+Yl9kYXRhICsgb2Zmc2V0c1tuXTsKKwkJYnJhbmNoW25dLmtleSA9IGNwdV90b19sZTMyKG5ld19ibG9ja3Nbbl0pOworCQkqYnJhbmNoW25dLnAgPSBicmFuY2hbbl0ua2V5OworCQlpZiAoIG4gPT0gaW5kaXJlY3RfYmxrcykgeworCQkJY3VycmVudF9ibG9jayA9IG5ld19ibG9ja3Nbbl07CisJCQkvKgorCQkJICogRW5kIG9mIGNoYWluLCB1cGRhdGUgdGhlIGxhc3QgbmV3IG1ldGFibG9jayBvZgorCQkJICogdGhlIGNoYWluIHRvIHBvaW50IHRvIHRoZSBuZXcgYWxsb2NhdGVkCisJCQkgKiBkYXRhIGJsb2NrcyBudW1iZXJzCisJCQkgKi8KKwkJCWZvciAoaT0xOyBpIDwgbnVtOyBpKyspCisJCQkJKihicmFuY2hbbl0ucCArIGkpID0gY3B1X3RvX2xlMzIoKytjdXJyZW50X2Jsb2NrKTsKKwkJfQorCQlCVUZGRVJfVFJBQ0UoYmgsICJtYXJraW5nIHVwdG9kYXRlIik7CisJCXNldF9idWZmZXJfdXB0b2RhdGUoYmgpOworCQl1bmxvY2tfYnVmZmVyKGJoKTsKKworCQlCVUZGRVJfVFJBQ0UoYmgsICJjYWxsIGV4dDRfam91cm5hbF9kaXJ0eV9tZXRhZGF0YSIpOworCQllcnIgPSBleHQ0X2pvdXJuYWxfZGlydHlfbWV0YWRhdGEoaGFuZGxlLCBiaCk7CisJCWlmIChlcnIpCisJCQlnb3RvIGZhaWxlZDsKKwl9CisJKmJsa3MgPSBudW07CisJcmV0dXJuIGVycjsKK2ZhaWxlZDoKKwkvKiBBbGxvY2F0aW9uIGZhaWxlZCwgZnJlZSB3aGF0IHdlIGFscmVhZHkgYWxsb2NhdGVkICovCisJZm9yIChpID0gMTsgaSA8PSBuIDsgaSsrKSB7CisJCUJVRkZFUl9UUkFDRShicmFuY2hbaV0uYmgsICJjYWxsIGpiZDJfam91cm5hbF9mb3JnZXQiKTsKKwkJZXh0NF9qb3VybmFsX2ZvcmdldChoYW5kbGUsIGJyYW5jaFtpXS5iaCk7CisJfQorCWZvciAoaSA9IDA7IGkgPGluZGlyZWN0X2Jsa3M7IGkrKykKKwkJZXh0NF9mcmVlX2Jsb2NrcyhoYW5kbGUsIGlub2RlLCBuZXdfYmxvY2tzW2ldLCAxKTsKKworCWV4dDRfZnJlZV9ibG9ja3MoaGFuZGxlLCBpbm9kZSwgbmV3X2Jsb2Nrc1tpXSwgbnVtKTsKKworCXJldHVybiBlcnI7Cit9CisKKy8qKgorICogZXh0NF9zcGxpY2VfYnJhbmNoIC0gc3BsaWNlIHRoZSBhbGxvY2F0ZWQgYnJhbmNoIG9udG8gaW5vZGUuCisgKiBAaW5vZGU6IG93bmVyCisgKiBAYmxvY2s6IChsb2dpY2FsKSBudW1iZXIgb2YgYmxvY2sgd2UgYXJlIGFkZGluZworICogQGNoYWluOiBjaGFpbiBvZiBpbmRpcmVjdCBibG9ja3MgKHdpdGggYSBtaXNzaW5nIGxpbmsgLSBzZWUKKyAqCWV4dDRfYWxsb2NfYnJhbmNoKQorICogQHdoZXJlOiBsb2NhdGlvbiBvZiBtaXNzaW5nIGxpbmsKKyAqIEBudW06ICAgbnVtYmVyIG9mIGluZGlyZWN0IGJsb2NrcyB3ZSBhcmUgYWRkaW5nCisgKiBAYmxrczogIG51bWJlciBvZiBkaXJlY3QgYmxvY2tzIHdlIGFyZSBhZGRpbmcKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGZpbGxzIHRoZSBtaXNzaW5nIGxpbmsgYW5kIGRvZXMgYWxsIGhvdXNla2VlcGluZyBuZWVkZWQgaW4KKyAqIGlub2RlICgtPmlfYmxvY2tzLCBldGMuKS4gSW4gY2FzZSBvZiBzdWNjZXNzIHdlIGVuZCB1cCB3aXRoIHRoZSBmdWxsCisgKiBjaGFpbiB0byBuZXcgYmxvY2sgYW5kIHJldHVybiAwLgorICovCitzdGF0aWMgaW50IGV4dDRfc3BsaWNlX2JyYW5jaChoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3QgaW5vZGUgKmlub2RlLAorCQkJbG9uZyBibG9jaywgSW5kaXJlY3QgKndoZXJlLCBpbnQgbnVtLCBpbnQgYmxrcykKK3sKKwlpbnQgaTsKKwlpbnQgZXJyID0gMDsKKwlzdHJ1Y3QgZXh0NF9ibG9ja19hbGxvY19pbmZvICpibG9ja19pOworCWV4dDRfZnNibGtfdCBjdXJyZW50X2Jsb2NrOworCisJYmxvY2tfaSA9IEVYVDRfSShpbm9kZSktPmlfYmxvY2tfYWxsb2NfaW5mbzsKKwkvKgorCSAqIElmIHdlJ3JlIHNwbGljaW5nIGludG8gYSBbdGRdaW5kaXJlY3QgYmxvY2sgKGFzIG9wcG9zZWQgdG8gdGhlCisJICogaW5vZGUpIHRoZW4gd2UgbmVlZCB0byBnZXQgd3JpdGUgYWNjZXNzIHRvIHRoZSBbdGRdaW5kaXJlY3QgYmxvY2sKKwkgKiBiZWZvcmUgdGhlIHNwbGljZS4KKwkgKi8KKwlpZiAod2hlcmUtPmJoKSB7CisJCUJVRkZFUl9UUkFDRSh3aGVyZS0+YmgsICJnZXRfd3JpdGVfYWNjZXNzIik7CisJCWVyciA9IGV4dDRfam91cm5hbF9nZXRfd3JpdGVfYWNjZXNzKGhhbmRsZSwgd2hlcmUtPmJoKTsKKwkJaWYgKGVycikKKwkJCWdvdG8gZXJyX291dDsKKwl9CisJLyogVGhhdCdzIGl0ICovCisKKwkqd2hlcmUtPnAgPSB3aGVyZS0+a2V5OworCisJLyoKKwkgKiBVcGRhdGUgdGhlIGhvc3QgYnVmZmVyX2hlYWQgb3IgaW5vZGUgdG8gcG9pbnQgdG8gbW9yZSBqdXN0IGFsbG9jYXRlZAorCSAqIGRpcmVjdCBibG9ja3MgYmxvY2tzCisJICovCisJaWYgKG51bSA9PSAwICYmIGJsa3MgPiAxKSB7CisJCWN1cnJlbnRfYmxvY2sgPSBsZTMyX3RvX2NwdSh3aGVyZS0+a2V5KSArIDE7CisJCWZvciAoaSA9IDE7IGkgPCBibGtzOyBpKyspCisJCQkqKHdoZXJlLT5wICsgaSApID0gY3B1X3RvX2xlMzIoY3VycmVudF9ibG9jaysrKTsKKwl9CisKKwkvKgorCSAqIHVwZGF0ZSB0aGUgbW9zdCByZWNlbnRseSBhbGxvY2F0ZWQgbG9naWNhbCAmIHBoeXNpY2FsIGJsb2NrCisJICogaW4gaV9ibG9ja19hbGxvY19pbmZvLCB0byBhc3Npc3QgZmluZCB0aGUgcHJvcGVyIGdvYWwgYmxvY2sgZm9yIG5leHQKKwkgKiBhbGxvY2F0aW9uCisJICovCisJaWYgKGJsb2NrX2kpIHsKKwkJYmxvY2tfaS0+bGFzdF9hbGxvY19sb2dpY2FsX2Jsb2NrID0gYmxvY2sgKyBibGtzIC0gMTsKKwkJYmxvY2tfaS0+bGFzdF9hbGxvY19waHlzaWNhbF9ibG9jayA9CisJCQkJbGUzMl90b19jcHUod2hlcmVbbnVtXS5rZXkpICsgYmxrcyAtIDE7CisJfQorCisJLyogV2UgYXJlIGRvbmUgd2l0aCBhdG9taWMgc3R1ZmYsIG5vdyBkbyB0aGUgcmVzdCBvZiBob3VzZWtlZXBpbmcgKi8KKworCWlub2RlLT5pX2N0aW1lID0gQ1VSUkVOVF9USU1FX1NFQzsKKwlleHQ0X21hcmtfaW5vZGVfZGlydHkoaGFuZGxlLCBpbm9kZSk7CisKKwkvKiBoYWQgd2Ugc3BsaWNlZCBpdCBvbnRvIGluZGlyZWN0IGJsb2NrPyAqLworCWlmICh3aGVyZS0+YmgpIHsKKwkJLyoKKwkJICogSWYgd2Ugc3BsaWNlZCBpdCBvbnRvIGFuIGluZGlyZWN0IGJsb2NrLCB3ZSBoYXZlbid0CisJCSAqIGFsdGVyZWQgdGhlIGlub2RlLiAgTm90ZSBob3dldmVyIHRoYXQgaWYgaXQgaXMgYmVpbmcgc3BsaWNlZAorCQkgKiBvbnRvIGFuIGluZGlyZWN0IGJsb2NrIGF0IHRoZSB2ZXJ5IGVuZCBvZiB0aGUgZmlsZSAodGhlCisJCSAqIGZpbGUgaXMgZ3Jvd2luZykgdGhlbiB3ZSAqd2lsbCogYWx0ZXIgdGhlIGlub2RlIHRvIHJlZmxlY3QKKwkJICogdGhlIG5ldyBpX3NpemUuICBCdXQgdGhhdCBpcyBub3QgZG9uZSBoZXJlIC0gaXQgaXMgZG9uZSBpbgorCQkgKiBnZW5lcmljX2NvbW1pdF93cml0ZS0+X19tYXJrX2lub2RlX2RpcnR5LT5leHQ0X2RpcnR5X2lub2RlLgorCQkgKi8KKwkJamJkX2RlYnVnKDUsICJzcGxpY2luZyBpbmRpcmVjdCBvbmx5XG4iKTsKKwkJQlVGRkVSX1RSQUNFKHdoZXJlLT5iaCwgImNhbGwgZXh0NF9qb3VybmFsX2RpcnR5X21ldGFkYXRhIik7CisJCWVyciA9IGV4dDRfam91cm5hbF9kaXJ0eV9tZXRhZGF0YShoYW5kbGUsIHdoZXJlLT5iaCk7CisJCWlmIChlcnIpCisJCQlnb3RvIGVycl9vdXQ7CisJfSBlbHNlIHsKKwkJLyoKKwkJICogT0ssIHdlIHNwbGljZWQgaXQgaW50byB0aGUgaW5vZGUgaXRzZWxmIG9uIGEgZGlyZWN0IGJsb2NrLgorCQkgKiBJbm9kZSB3YXMgZGlydGllZCBhYm92ZS4KKwkJICovCisJCWpiZF9kZWJ1Zyg1LCAic3BsaWNpbmcgZGlyZWN0XG4iKTsKKwl9CisJcmV0dXJuIGVycjsKKworZXJyX291dDoKKwlmb3IgKGkgPSAxOyBpIDw9IG51bTsgaSsrKSB7CisJCUJVRkZFUl9UUkFDRSh3aGVyZVtpXS5iaCwgImNhbGwgamJkMl9qb3VybmFsX2ZvcmdldCIpOworCQlleHQ0X2pvdXJuYWxfZm9yZ2V0KGhhbmRsZSwgd2hlcmVbaV0uYmgpOworCQlleHQ0X2ZyZWVfYmxvY2tzKGhhbmRsZSxpbm9kZSxsZTMyX3RvX2NwdSh3aGVyZVtpLTFdLmtleSksMSk7CisJfQorCWV4dDRfZnJlZV9ibG9ja3MoaGFuZGxlLCBpbm9kZSwgbGUzMl90b19jcHUod2hlcmVbbnVtXS5rZXkpLCBibGtzKTsKKworCXJldHVybiBlcnI7Cit9CisKKy8qCisgKiBBbGxvY2F0aW9uIHN0cmF0ZWd5IGlzIHNpbXBsZTogaWYgd2UgaGF2ZSB0byBhbGxvY2F0ZSBzb21ldGhpbmcsIHdlIHdpbGwKKyAqIGhhdmUgdG8gZ28gdGhlIHdob2xlIHdheSB0byBsZWFmLiBTbyBsZXQncyBkbyBpdCBiZWZvcmUgYXR0YWNoaW5nIGFueXRoaW5nCisgKiB0byB0cmVlLCBzZXQgbGlua2FnZSBiZXR3ZWVuIHRoZSBuZXdib3JuIGJsb2Nrcywgd3JpdGUgdGhlbSBpZiBzeW5jIGlzCisgKiByZXF1aXJlZCwgcmVjaGVjayB0aGUgcGF0aCwgZnJlZSBhbmQgcmVwZWF0IGlmIGNoZWNrIGZhaWxzLCBvdGhlcndpc2UKKyAqIHNldCB0aGUgbGFzdCBtaXNzaW5nIGxpbmsgKHRoYXQgd2lsbCBwcm90ZWN0IHVzIGZyb20gYW55IHRydW5jYXRlLWdlbmVyYXRlZAorICogcmVtb3ZhbHMgLSBhbGwgYmxvY2tzIG9uIHRoZSBwYXRoIGFyZSBpbW11bmUgbm93KSBhbmQgcG9zc2libHkgZm9yY2UgdGhlCisgKiB3cml0ZSBvbiB0aGUgcGFyZW50IGJsb2NrLgorICogVGhhdCBoYXMgYSBuaWNlIGFkZGl0aW9uYWwgcHJvcGVydHk6IG5vIHNwZWNpYWwgcmVjb3ZlcnkgZnJvbSB0aGUgZmFpbGVkCisgKiBhbGxvY2F0aW9ucyBpcyBuZWVkZWQgLSB3ZSBzaW1wbHkgcmVsZWFzZSBibG9ja3MgYW5kIGRvIG5vdCB0b3VjaCBhbnl0aGluZworICogcmVhY2hhYmxlIGZyb20gaW5vZGUuCisgKgorICogYGhhbmRsZScgY2FuIGJlIE5VTEwgaWYgY3JlYXRlID09IDAuCisgKgorICogVGhlIEJLTCBtYXkgbm90IGJlIGhlbGQgb24gZW50cnkgaGVyZS4gIEJlIHN1cmUgdG8gdGFrZSBpdCBlYXJseS4KKyAqIHJldHVybiA+IDAsICMgb2YgYmxvY2tzIG1hcHBlZCBvciBhbGxvY2F0ZWQuCisgKiByZXR1cm4gPSAwLCBpZiBwbGFpbiBsb29rdXAgZmFpbGVkLgorICogcmV0dXJuIDwgMCwgZXJyb3IgY2FzZS4KKyAqLworaW50IGV4dDRfZ2V0X2Jsb2Nrc19oYW5kbGUoaGFuZGxlX3QgKmhhbmRsZSwgc3RydWN0IGlub2RlICppbm9kZSwKKwkJc2VjdG9yX3QgaWJsb2NrLCB1bnNpZ25lZCBsb25nIG1heGJsb2NrcywKKwkJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaF9yZXN1bHQsCisJCWludCBjcmVhdGUsIGludCBleHRlbmRfZGlza3NpemUpCit7CisJaW50IGVyciA9IC1FSU87CisJaW50IG9mZnNldHNbNF07CisJSW5kaXJlY3QgY2hhaW5bNF07CisJSW5kaXJlY3QgKnBhcnRpYWw7CisJZXh0NF9mc2Jsa190IGdvYWw7CisJaW50IGluZGlyZWN0X2Jsa3M7CisJaW50IGJsb2Nrc190b19ib3VuZGFyeSA9IDA7CisJaW50IGRlcHRoOworCXN0cnVjdCBleHQ0X2lub2RlX2luZm8gKmVpID0gRVhUNF9JKGlub2RlKTsKKwlpbnQgY291bnQgPSAwOworCWV4dDRfZnNibGtfdCBmaXJzdF9ibG9jayA9IDA7CisKKworCUpfQVNTRVJUKCEoRVhUNF9JKGlub2RlKS0+aV9mbGFncyAmIEVYVDRfRVhURU5UU19GTCkpOworCUpfQVNTRVJUKGhhbmRsZSAhPSBOVUxMIHx8IGNyZWF0ZSA9PSAwKTsKKwlkZXB0aCA9IGV4dDRfYmxvY2tfdG9fcGF0aChpbm9kZSxpYmxvY2ssb2Zmc2V0cywmYmxvY2tzX3RvX2JvdW5kYXJ5KTsKKworCWlmIChkZXB0aCA9PSAwKQorCQlnb3RvIG91dDsKKworCXBhcnRpYWwgPSBleHQ0X2dldF9icmFuY2goaW5vZGUsIGRlcHRoLCBvZmZzZXRzLCBjaGFpbiwgJmVycik7CisKKwkvKiBTaW1wbGVzdCBjYXNlIC0gYmxvY2sgZm91bmQsIG5vIGFsbG9jYXRpb24gbmVlZGVkICovCisJaWYgKCFwYXJ0aWFsKSB7CisJCWZpcnN0X2Jsb2NrID0gbGUzMl90b19jcHUoY2hhaW5bZGVwdGggLSAxXS5rZXkpOworCQljbGVhcl9idWZmZXJfbmV3KGJoX3Jlc3VsdCk7CisJCWNvdW50Kys7CisJCS8qbWFwIG1vcmUgYmxvY2tzKi8KKwkJd2hpbGUgKGNvdW50IDwgbWF4YmxvY2tzICYmIGNvdW50IDw9IGJsb2Nrc190b19ib3VuZGFyeSkgeworCQkJZXh0NF9mc2Jsa190IGJsazsKKworCQkJaWYgKCF2ZXJpZnlfY2hhaW4oY2hhaW4sIHBhcnRpYWwpKSB7CisJCQkJLyoKKwkJCQkgKiBJbmRpcmVjdCBibG9jayBtaWdodCBiZSByZW1vdmVkIGJ5CisJCQkJICogdHJ1bmNhdGUgd2hpbGUgd2Ugd2VyZSByZWFkaW5nIGl0LgorCQkJCSAqIEhhbmRsaW5nIG9mIHRoYXQgY2FzZTogZm9yZ2V0IHdoYXQgd2UndmUKKwkJCQkgKiBnb3Qgbm93LiBGbGFnIHRoZSBlcnIgYXMgRUFHQUlOLCBzbyBpdAorCQkJCSAqIHdpbGwgcmVyZWFkLgorCQkJCSAqLworCQkJCWVyciA9IC1FQUdBSU47CisJCQkJY291bnQgPSAwOworCQkJCWJyZWFrOworCQkJfQorCQkJYmxrID0gbGUzMl90b19jcHUoKihjaGFpbltkZXB0aC0xXS5wICsgY291bnQpKTsKKworCQkJaWYgKGJsayA9PSBmaXJzdF9ibG9jayArIGNvdW50KQorCQkJCWNvdW50Kys7CisJCQllbHNlCisJCQkJYnJlYWs7CisJCX0KKwkJaWYgKGVyciAhPSAtRUFHQUlOKQorCQkJZ290byBnb3RfaXQ7CisJfQorCisJLyogTmV4dCBzaW1wbGUgY2FzZSAtIHBsYWluIGxvb2t1cCBvciBmYWlsZWQgcmVhZCBvZiBpbmRpcmVjdCBibG9jayAqLworCWlmICghY3JlYXRlIHx8IGVyciA9PSAtRUlPKQorCQlnb3RvIGNsZWFudXA7CisKKwltdXRleF9sb2NrKCZlaS0+dHJ1bmNhdGVfbXV0ZXgpOworCisJLyoKKwkgKiBJZiB0aGUgaW5kaXJlY3QgYmxvY2sgaXMgbWlzc2luZyB3aGlsZSB3ZSBhcmUgcmVhZGluZworCSAqIHRoZSBjaGFpbihleHQ0X2dldF9icmFuY2goKSByZXR1cm5zIC1FQUdBSU4gZXJyKSwgb3IKKwkgKiBpZiB0aGUgY2hhaW4gaGFzIGJlZW4gY2hhbmdlZCBhZnRlciB3ZSBncmFiIHRoZSBzZW1hcGhvcmUsCisJICogKGVpdGhlciBiZWNhdXNlIGFub3RoZXIgcHJvY2VzcyB0cnVuY2F0ZWQgdGhpcyBicmFuY2gsIG9yCisJICogYW5vdGhlciBnZXRfYmxvY2sgYWxsb2NhdGVkIHRoaXMgYnJhbmNoKSByZS1ncmFiIHRoZSBjaGFpbiB0byBzZWUgaWYKKwkgKiB0aGUgcmVxdWVzdCBibG9jayBoYXMgYmVlbiBhbGxvY2F0ZWQgb3Igbm90LgorCSAqCisJICogU2luY2Ugd2UgYWxyZWFkeSBibG9jayB0aGUgdHJ1bmNhdGUvb3RoZXIgZ2V0X2Jsb2NrCisJICogYXQgdGhpcyBwb2ludCwgd2Ugd2lsbCBoYXZlIHRoZSBjdXJyZW50IGNvcHkgb2YgdGhlIGNoYWluIHdoZW4gd2UKKwkgKiBzcGxpY2UgdGhlIGJyYW5jaCBpbnRvIHRoZSB0cmVlLgorCSAqLworCWlmIChlcnIgPT0gLUVBR0FJTiB8fCAhdmVyaWZ5X2NoYWluKGNoYWluLCBwYXJ0aWFsKSkgeworCQl3aGlsZSAocGFydGlhbCA+IGNoYWluKSB7CisJCQlicmVsc2UocGFydGlhbC0+YmgpOworCQkJcGFydGlhbC0tOworCQl9CisJCXBhcnRpYWwgPSBleHQ0X2dldF9icmFuY2goaW5vZGUsIGRlcHRoLCBvZmZzZXRzLCBjaGFpbiwgJmVycik7CisJCWlmICghcGFydGlhbCkgeworCQkJY291bnQrKzsKKwkJCW11dGV4X3VubG9jaygmZWktPnRydW5jYXRlX211dGV4KTsKKwkJCWlmIChlcnIpCisJCQkJZ290byBjbGVhbnVwOworCQkJY2xlYXJfYnVmZmVyX25ldyhiaF9yZXN1bHQpOworCQkJZ290byBnb3RfaXQ7CisJCX0KKwl9CisKKwkvKgorCSAqIE9rYXksIHdlIG5lZWQgdG8gZG8gYmxvY2sgYWxsb2NhdGlvbi4gIExhemlseSBpbml0aWFsaXplIHRoZSBibG9jaworCSAqIGFsbG9jYXRpb24gaW5mbyBoZXJlIGlmIG5lY2Vzc2FyeQorCSovCisJaWYgKFNfSVNSRUcoaW5vZGUtPmlfbW9kZSkgJiYgKCFlaS0+aV9ibG9ja19hbGxvY19pbmZvKSkKKwkJZXh0NF9pbml0X2Jsb2NrX2FsbG9jX2luZm8oaW5vZGUpOworCisJZ29hbCA9IGV4dDRfZmluZF9nb2FsKGlub2RlLCBpYmxvY2ssIGNoYWluLCBwYXJ0aWFsKTsKKworCS8qIHRoZSBudW1iZXIgb2YgYmxvY2tzIG5lZWQgdG8gYWxsb2NhdGUgZm9yIFtkLHRdaW5kaXJlY3QgYmxvY2tzICovCisJaW5kaXJlY3RfYmxrcyA9IChjaGFpbiArIGRlcHRoKSAtIHBhcnRpYWwgLSAxOworCisJLyoKKwkgKiBOZXh0IGxvb2sgdXAgdGhlIGluZGlyZWN0IG1hcCB0byBjb3VudCB0aGUgdG90b2FsIG51bWJlciBvZgorCSAqIGRpcmVjdCBibG9ja3MgdG8gYWxsb2NhdGUgZm9yIHRoaXMgYnJhbmNoLgorCSAqLworCWNvdW50ID0gZXh0NF9ibGtzX3RvX2FsbG9jYXRlKHBhcnRpYWwsIGluZGlyZWN0X2Jsa3MsCisJCQkJCW1heGJsb2NrcywgYmxvY2tzX3RvX2JvdW5kYXJ5KTsKKwkvKgorCSAqIEJsb2NrIG91dCBleHQ0X3RydW5jYXRlIHdoaWxlIHdlIGFsdGVyIHRoZSB0cmVlCisJICovCisJZXJyID0gZXh0NF9hbGxvY19icmFuY2goaGFuZGxlLCBpbm9kZSwgaW5kaXJlY3RfYmxrcywgJmNvdW50LCBnb2FsLAorCQkJCW9mZnNldHMgKyAocGFydGlhbCAtIGNoYWluKSwgcGFydGlhbCk7CisKKwkvKgorCSAqIFRoZSBleHQ0X3NwbGljZV9icmFuY2ggY2FsbCB3aWxsIGZyZWUgYW5kIGZvcmdldCBhbnkgYnVmZmVycworCSAqIG9uIHRoZSBuZXcgY2hhaW4gaWYgdGhlcmUgaXMgYSBmYWlsdXJlLCBidXQgdGhhdCByaXNrcyB1c2luZworCSAqIHVwIHRyYW5zYWN0aW9uIGNyZWRpdHMsIGVzcGVjaWFsbHkgZm9yIGJpdG1hcHMgd2hlcmUgdGhlCisJICogY3JlZGl0cyBjYW5ub3QgYmUgcmV0dXJuZWQuICBDYW4gd2UgaGFuZGxlIHRoaXMgc29tZWhvdz8gIFdlCisJICogbWF5IG5lZWQgdG8gcmV0dXJuIC1FQUdBSU4gdXB3YXJkcyBpbiB0aGUgd29yc3QgY2FzZS4gIC0tc2N0CisJICovCisJaWYgKCFlcnIpCisJCWVyciA9IGV4dDRfc3BsaWNlX2JyYW5jaChoYW5kbGUsIGlub2RlLCBpYmxvY2ssCisJCQkJCXBhcnRpYWwsIGluZGlyZWN0X2Jsa3MsIGNvdW50KTsKKwkvKgorCSAqIGlfZGlza3NpemUgZ3Jvd2luZyBpcyBwcm90ZWN0ZWQgYnkgdHJ1bmNhdGVfbXV0ZXguICBEb24ndCBmb3JnZXQgdG8KKwkgKiBwcm90ZWN0IGl0IGlmIHlvdSdyZSBhYm91dCB0byBpbXBsZW1lbnQgY29uY3VycmVudAorCSAqIGV4dDRfZ2V0X2Jsb2NrKCkgLWJ6enoKKwkqLworCWlmICghZXJyICYmIGV4dGVuZF9kaXNrc2l6ZSAmJiBpbm9kZS0+aV9zaXplID4gZWktPmlfZGlza3NpemUpCisJCWVpLT5pX2Rpc2tzaXplID0gaW5vZGUtPmlfc2l6ZTsKKwltdXRleF91bmxvY2soJmVpLT50cnVuY2F0ZV9tdXRleCk7CisJaWYgKGVycikKKwkJZ290byBjbGVhbnVwOworCisJc2V0X2J1ZmZlcl9uZXcoYmhfcmVzdWx0KTsKK2dvdF9pdDoKKwltYXBfYmgoYmhfcmVzdWx0LCBpbm9kZS0+aV9zYiwgbGUzMl90b19jcHUoY2hhaW5bZGVwdGgtMV0ua2V5KSk7CisJaWYgKGNvdW50ID4gYmxvY2tzX3RvX2JvdW5kYXJ5KQorCQlzZXRfYnVmZmVyX2JvdW5kYXJ5KGJoX3Jlc3VsdCk7CisJZXJyID0gY291bnQ7CisJLyogQ2xlYW4gdXAgYW5kIGV4aXQgKi8KKwlwYXJ0aWFsID0gY2hhaW4gKyBkZXB0aCAtIDE7CS8qIHRoZSB3aG9sZSBjaGFpbiAqLworY2xlYW51cDoKKwl3aGlsZSAocGFydGlhbCA+IGNoYWluKSB7CisJCUJVRkZFUl9UUkFDRShwYXJ0aWFsLT5iaCwgImNhbGwgYnJlbHNlIik7CisJCWJyZWxzZShwYXJ0aWFsLT5iaCk7CisJCXBhcnRpYWwtLTsKKwl9CisJQlVGRkVSX1RSQUNFKGJoX3Jlc3VsdCwgInJldHVybmVkIik7CitvdXQ6CisJcmV0dXJuIGVycjsKK30KKworI2RlZmluZSBESU9fQ1JFRElUUyAoRVhUNF9SRVNFUlZFX1RSQU5TX0JMT0NLUyArIDMyKQorCitzdGF0aWMgaW50IGV4dDRfZ2V0X2Jsb2NrKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHNlY3Rvcl90IGlibG9jaywKKwkJCXN0cnVjdCBidWZmZXJfaGVhZCAqYmhfcmVzdWx0LCBpbnQgY3JlYXRlKQoreworCWhhbmRsZV90ICpoYW5kbGUgPSBqb3VybmFsX2N1cnJlbnRfaGFuZGxlKCk7CisJaW50IHJldCA9IDA7CisJdW5zaWduZWQgbWF4X2Jsb2NrcyA9IGJoX3Jlc3VsdC0+Yl9zaXplID4+IGlub2RlLT5pX2Jsa2JpdHM7CisKKwlpZiAoIWNyZWF0ZSkKKwkJZ290byBnZXRfYmxvY2s7CQkvKiBBIHJlYWQgKi8KKworCWlmIChtYXhfYmxvY2tzID09IDEpCisJCWdvdG8gZ2V0X2Jsb2NrOwkJLyogQSBzaW5nbGUgYmxvY2sgZ2V0ICovCisKKwlpZiAoaGFuZGxlLT5oX3RyYW5zYWN0aW9uLT50X3N0YXRlID09IFRfTE9DS0VEKSB7CisJCS8qCisJCSAqIEh1Z2UgZGlyZWN0LWlvIHdyaXRlcyBjYW4gaG9sZCBvZmYgY29tbWl0cyBmb3IgbG9uZworCQkgKiBwZXJpb2RzIG9mIHRpbWUuICBMZXQgdGhpcyBjb21taXQgcnVuLgorCQkgKi8KKwkJZXh0NF9qb3VybmFsX3N0b3AoaGFuZGxlKTsKKwkJaGFuZGxlID0gZXh0NF9qb3VybmFsX3N0YXJ0KGlub2RlLCBESU9fQ1JFRElUUyk7CisJCWlmIChJU19FUlIoaGFuZGxlKSkKKwkJCXJldCA9IFBUUl9FUlIoaGFuZGxlKTsKKwkJZ290byBnZXRfYmxvY2s7CisJfQorCisJaWYgKGhhbmRsZS0+aF9idWZmZXJfY3JlZGl0cyA8PSBFWFQ0X1JFU0VSVkVfVFJBTlNfQkxPQ0tTKSB7CisJCS8qCisJCSAqIEdldHRpbmcgbG93IG9uIGJ1ZmZlciBjcmVkaXRzLi4uCisJCSAqLworCQlyZXQgPSBleHQ0X2pvdXJuYWxfZXh0ZW5kKGhhbmRsZSwgRElPX0NSRURJVFMpOworCQlpZiAocmV0ID4gMCkgeworCQkJLyoKKwkJCSAqIENvdWxkbid0IGV4dGVuZCB0aGUgdHJhbnNhY3Rpb24uICBTdGFydCBhIG5ldyBvbmUuCisJCQkgKi8KKwkJCXJldCA9IGV4dDRfam91cm5hbF9yZXN0YXJ0KGhhbmRsZSwgRElPX0NSRURJVFMpOworCQl9CisJfQorCitnZXRfYmxvY2s6CisJaWYgKHJldCA9PSAwKSB7CisJCXJldCA9IGV4dDRfZ2V0X2Jsb2Nrc193cmFwKGhhbmRsZSwgaW5vZGUsIGlibG9jaywKKwkJCQkJbWF4X2Jsb2NrcywgYmhfcmVzdWx0LCBjcmVhdGUsIDApOworCQlpZiAocmV0ID4gMCkgeworCQkJYmhfcmVzdWx0LT5iX3NpemUgPSAocmV0IDw8IGlub2RlLT5pX2Jsa2JpdHMpOworCQkJcmV0ID0gMDsKKwkJfQorCX0KKwlyZXR1cm4gcmV0OworfQorCisvKgorICogYGhhbmRsZScgY2FuIGJlIE5VTEwgaWYgY3JlYXRlIGlzIHplcm8KKyAqLworc3RydWN0IGJ1ZmZlcl9oZWFkICpleHQ0X2dldGJsayhoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3QgaW5vZGUgKmlub2RlLAorCQkJCWxvbmcgYmxvY2ssIGludCBjcmVhdGUsIGludCAqZXJycCkKK3sKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgZHVtbXk7CisJaW50IGZhdGFsID0gMCwgZXJyOworCisJSl9BU1NFUlQoaGFuZGxlICE9IE5VTEwgfHwgY3JlYXRlID09IDApOworCisJZHVtbXkuYl9zdGF0ZSA9IDA7CisJZHVtbXkuYl9ibG9ja25yID0gLTEwMDA7CisJYnVmZmVyX3RyYWNlX2luaXQoJmR1bW15LmJfaGlzdG9yeSk7CisJZXJyID0gZXh0NF9nZXRfYmxvY2tzX3dyYXAoaGFuZGxlLCBpbm9kZSwgYmxvY2ssIDEsCisJCQkJCSZkdW1teSwgY3JlYXRlLCAxKTsKKwkvKgorCSAqIGV4dDRfZ2V0X2Jsb2Nrc19oYW5kbGUoKSByZXR1cm5zIG51bWJlciBvZiBibG9ja3MKKwkgKiBtYXBwZWQuIDAgaW4gY2FzZSBvZiBhIEhPTEUuCisJICovCisJaWYgKGVyciA+IDApIHsKKwkJaWYgKGVyciA+IDEpCisJCQlXQVJOX09OKDEpOworCQllcnIgPSAwOworCX0KKwkqZXJycCA9IGVycjsKKwlpZiAoIWVyciAmJiBidWZmZXJfbWFwcGVkKCZkdW1teSkpIHsKKwkJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaDsKKwkJYmggPSBzYl9nZXRibGsoaW5vZGUtPmlfc2IsIGR1bW15LmJfYmxvY2tucik7CisJCWlmICghYmgpIHsKKwkJCSplcnJwID0gLUVJTzsKKwkJCWdvdG8gZXJyOworCQl9CisJCWlmIChidWZmZXJfbmV3KCZkdW1teSkpIHsKKwkJCUpfQVNTRVJUKGNyZWF0ZSAhPSAwKTsKKwkJCUpfQVNTRVJUKGhhbmRsZSAhPSAwKTsKKworCQkJLyoKKwkJCSAqIE5vdyB0aGF0IHdlIGRvIG5vdCBhbHdheXMgam91cm5hbCBkYXRhLCB3ZSBzaG91bGQKKwkJCSAqIGtlZXAgaW4gbWluZCB3aGV0aGVyIHRoaXMgc2hvdWxkIGFsd2F5cyBqb3VybmFsIHRoZQorCQkJICogbmV3IGJ1ZmZlciBhcyBtZXRhZGF0YS4gIEZvciBub3csIHJlZ3VsYXIgZmlsZQorCQkJICogd3JpdGVzIHVzZSBleHQ0X2dldF9ibG9jayBpbnN0ZWFkLCBzbyBpdCdzIG5vdCBhCisJCQkgKiBwcm9ibGVtLgorCQkJICovCisJCQlsb2NrX2J1ZmZlcihiaCk7CisJCQlCVUZGRVJfVFJBQ0UoYmgsICJjYWxsIGdldF9jcmVhdGVfYWNjZXNzIik7CisJCQlmYXRhbCA9IGV4dDRfam91cm5hbF9nZXRfY3JlYXRlX2FjY2VzcyhoYW5kbGUsIGJoKTsKKwkJCWlmICghZmF0YWwgJiYgIWJ1ZmZlcl91cHRvZGF0ZShiaCkpIHsKKwkJCQltZW1zZXQoYmgtPmJfZGF0YSwwLGlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZSk7CisJCQkJc2V0X2J1ZmZlcl91cHRvZGF0ZShiaCk7CisJCQl9CisJCQl1bmxvY2tfYnVmZmVyKGJoKTsKKwkJCUJVRkZFUl9UUkFDRShiaCwgImNhbGwgZXh0NF9qb3VybmFsX2RpcnR5X21ldGFkYXRhIik7CisJCQllcnIgPSBleHQ0X2pvdXJuYWxfZGlydHlfbWV0YWRhdGEoaGFuZGxlLCBiaCk7CisJCQlpZiAoIWZhdGFsKQorCQkJCWZhdGFsID0gZXJyOworCQl9IGVsc2UgeworCQkJQlVGRkVSX1RSQUNFKGJoLCAibm90IGEgbmV3IGJ1ZmZlciIpOworCQl9CisJCWlmIChmYXRhbCkgeworCQkJKmVycnAgPSBmYXRhbDsKKwkJCWJyZWxzZShiaCk7CisJCQliaCA9IE5VTEw7CisJCX0KKwkJcmV0dXJuIGJoOworCX0KK2VycjoKKwlyZXR1cm4gTlVMTDsKK30KKworc3RydWN0IGJ1ZmZlcl9oZWFkICpleHQ0X2JyZWFkKGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBpbm9kZSAqaW5vZGUsCisJCQkgICAgICAgaW50IGJsb2NrLCBpbnQgY3JlYXRlLCBpbnQgKmVycikKK3sKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKiBiaDsKKworCWJoID0gZXh0NF9nZXRibGsoaGFuZGxlLCBpbm9kZSwgYmxvY2ssIGNyZWF0ZSwgZXJyKTsKKwlpZiAoIWJoKQorCQlyZXR1cm4gYmg7CisJaWYgKGJ1ZmZlcl91cHRvZGF0ZShiaCkpCisJCXJldHVybiBiaDsKKwlsbF9yd19ibG9jayhSRUFEX01FVEEsIDEsICZiaCk7CisJd2FpdF9vbl9idWZmZXIoYmgpOworCWlmIChidWZmZXJfdXB0b2RhdGUoYmgpKQorCQlyZXR1cm4gYmg7CisJcHV0X2JoKGJoKTsKKwkqZXJyID0gLUVJTzsKKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIGludCB3YWxrX3BhZ2VfYnVmZmVycygJaGFuZGxlX3QgKmhhbmRsZSwKKwkJCQlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmhlYWQsCisJCQkJdW5zaWduZWQgZnJvbSwKKwkJCQl1bnNpZ25lZCB0bywKKwkJCQlpbnQgKnBhcnRpYWwsCisJCQkJaW50ICgqZm4pKAloYW5kbGVfdCAqaGFuZGxlLAorCQkJCQkJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCkpCit7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaDsKKwl1bnNpZ25lZCBibG9ja19zdGFydCwgYmxvY2tfZW5kOworCXVuc2lnbmVkIGJsb2Nrc2l6ZSA9IGhlYWQtPmJfc2l6ZTsKKwlpbnQgZXJyLCByZXQgPSAwOworCXN0cnVjdCBidWZmZXJfaGVhZCAqbmV4dDsKKworCWZvciAoCWJoID0gaGVhZCwgYmxvY2tfc3RhcnQgPSAwOworCQlyZXQgPT0gMCAmJiAoYmggIT0gaGVhZCB8fCAhYmxvY2tfc3RhcnQpOworCQlibG9ja19zdGFydCA9IGJsb2NrX2VuZCwgYmggPSBuZXh0KQorCXsKKwkJbmV4dCA9IGJoLT5iX3RoaXNfcGFnZTsKKwkJYmxvY2tfZW5kID0gYmxvY2tfc3RhcnQgKyBibG9ja3NpemU7CisJCWlmIChibG9ja19lbmQgPD0gZnJvbSB8fCBibG9ja19zdGFydCA+PSB0bykgeworCQkJaWYgKHBhcnRpYWwgJiYgIWJ1ZmZlcl91cHRvZGF0ZShiaCkpCisJCQkJKnBhcnRpYWwgPSAxOworCQkJY29udGludWU7CisJCX0KKwkJZXJyID0gKCpmbikoaGFuZGxlLCBiaCk7CisJCWlmICghcmV0KQorCQkJcmV0ID0gZXJyOworCX0KKwlyZXR1cm4gcmV0OworfQorCisvKgorICogVG8gcHJlc2VydmUgb3JkZXJpbmcsIGl0IGlzIGVzc2VudGlhbCB0aGF0IHRoZSBob2xlIGluc3RhbnRpYXRpb24gYW5kCisgKiB0aGUgZGF0YSB3cml0ZSBiZSBlbmNhcHN1bGF0ZWQgaW4gYSBzaW5nbGUgdHJhbnNhY3Rpb24uICBXZSBjYW5ub3QKKyAqIGNsb3NlIG9mZiBhIHRyYW5zYWN0aW9uIGFuZCBzdGFydCBhIG5ldyBvbmUgYmV0d2VlbiB0aGUgZXh0NF9nZXRfYmxvY2soKQorICogYW5kIHRoZSBjb21taXRfd3JpdGUoKS4gIFNvIGRvaW5nIHRoZSBqYmQyX2pvdXJuYWxfc3RhcnQgYXQgdGhlIHN0YXJ0IG9mCisgKiBwcmVwYXJlX3dyaXRlKCkgaXMgdGhlIHJpZ2h0IHBsYWNlLgorICoKKyAqIEFsc28sIHRoaXMgZnVuY3Rpb24gY2FuIG5lc3QgaW5zaWRlIGV4dDRfd3JpdGVwYWdlKCkgLT4KKyAqIGJsb2NrX3dyaXRlX2Z1bGxfcGFnZSgpLiBJbiB0aGF0IGNhc2UsIHdlICprbm93KiB0aGF0IGV4dDRfd3JpdGVwYWdlKCkKKyAqIGhhcyBnZW5lcmF0ZWQgZW5vdWdoIGJ1ZmZlciBjcmVkaXRzIHRvIGRvIHRoZSB3aG9sZSBwYWdlLiAgU28gd2Ugd29uJ3QKKyAqIGJsb2NrIG9uIHRoZSBqb3VybmFsIGluIHRoYXQgY2FzZSwgd2hpY2ggaXMgZ29vZCwgYmVjYXVzZSB0aGUgY2FsbGVyIG1heQorICogYmUgUEZfTUVNQUxMT0MuCisgKgorICogQnkgYWNjaWRlbnQsIGV4dDQgY2FuIGJlIHJlZW50ZXJlZCB3aGVuIGEgdHJhbnNhY3Rpb24gaXMgb3BlbiB2aWEKKyAqIHF1b3RhIGZpbGUgd3JpdGVzLiAgSWYgd2Ugd2VyZSB0byBjb21taXQgdGhlIHRyYW5zYWN0aW9uIHdoaWxlIHRodXMKKyAqIHJlZW50ZXJlZCwgdGhlcmUgY2FuIGJlIGEgZGVhZGxvY2sgLSB3ZSB3b3VsZCBiZSBob2xkaW5nIGEgcXVvdGEKKyAqIGxvY2ssIGFuZCB0aGUgY29tbWl0IHdvdWxkIG5ldmVyIGNvbXBsZXRlIGlmIGFub3RoZXIgdGhyZWFkIGhhZCBhCisgKiB0cmFuc2FjdGlvbiBvcGVuIGFuZCB3YXMgYmxvY2tpbmcgb24gdGhlIHF1b3RhIGxvY2sgLSBhIHJhbmtpbmcKKyAqIHZpb2xhdGlvbi4KKyAqCisgKiBTbyB3aGF0IHdlIGRvIGlzIHRvIHJlbHkgb24gdGhlIGZhY3QgdGhhdCBqYmQyX2pvdXJuYWxfc3RvcC9qb3VybmFsX3N0YXJ0CisgKiB3aWxsIF9ub3RfIHJ1biBjb21taXQgdW5kZXIgdGhlc2UgY2lyY3Vtc3RhbmNlcyBiZWNhdXNlIGhhbmRsZS0+aF9yZWYKKyAqIGlzIGVsZXZhdGVkLiAgV2UnbGwgc3RpbGwgaGF2ZSBlbm91Z2ggY3JlZGl0cyBmb3IgdGhlIHRpbnkgcXVvdGFmaWxlCisgKiB3cml0ZS4KKyAqLworc3RhdGljIGludCBkb19qb3VybmFsX2dldF93cml0ZV9hY2Nlc3MoaGFuZGxlX3QgKmhhbmRsZSwKKwkJCQkJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCkKK3sKKwlpZiAoIWJ1ZmZlcl9tYXBwZWQoYmgpIHx8IGJ1ZmZlcl9mcmVlZChiaCkpCisJCXJldHVybiAwOworCXJldHVybiBleHQ0X2pvdXJuYWxfZ2V0X3dyaXRlX2FjY2VzcyhoYW5kbGUsIGJoKTsKK30KKworc3RhdGljIGludCBleHQ0X3ByZXBhcmVfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCBwYWdlICpwYWdlLAorCQkJICAgICAgdW5zaWduZWQgZnJvbSwgdW5zaWduZWQgdG8pCit7CisJc3RydWN0IGlub2RlICppbm9kZSA9IHBhZ2UtPm1hcHBpbmctPmhvc3Q7CisJaW50IHJldCwgbmVlZGVkX2Jsb2NrcyA9IGV4dDRfd3JpdGVwYWdlX3RyYW5zX2Jsb2Nrcyhpbm9kZSk7CisJaGFuZGxlX3QgKmhhbmRsZTsKKwlpbnQgcmV0cmllcyA9IDA7CisKK3JldHJ5OgorCWhhbmRsZSA9IGV4dDRfam91cm5hbF9zdGFydChpbm9kZSwgbmVlZGVkX2Jsb2Nrcyk7CisJaWYgKElTX0VSUihoYW5kbGUpKSB7CisJCXJldCA9IFBUUl9FUlIoaGFuZGxlKTsKKwkJZ290byBvdXQ7CisJfQorCWlmICh0ZXN0X29wdChpbm9kZS0+aV9zYiwgTk9CSCkgJiYgZXh0NF9zaG91bGRfd3JpdGViYWNrX2RhdGEoaW5vZGUpKQorCQlyZXQgPSBub2JoX3ByZXBhcmVfd3JpdGUocGFnZSwgZnJvbSwgdG8sIGV4dDRfZ2V0X2Jsb2NrKTsKKwllbHNlCisJCXJldCA9IGJsb2NrX3ByZXBhcmVfd3JpdGUocGFnZSwgZnJvbSwgdG8sIGV4dDRfZ2V0X2Jsb2NrKTsKKwlpZiAocmV0KQorCQlnb3RvIHByZXBhcmVfd3JpdGVfZmFpbGVkOworCisJaWYgKGV4dDRfc2hvdWxkX2pvdXJuYWxfZGF0YShpbm9kZSkpIHsKKwkJcmV0ID0gd2Fsa19wYWdlX2J1ZmZlcnMoaGFuZGxlLCBwYWdlX2J1ZmZlcnMocGFnZSksCisJCQkJZnJvbSwgdG8sIE5VTEwsIGRvX2pvdXJuYWxfZ2V0X3dyaXRlX2FjY2Vzcyk7CisJfQorcHJlcGFyZV93cml0ZV9mYWlsZWQ6CisJaWYgKHJldCkKKwkJZXh0NF9qb3VybmFsX3N0b3AoaGFuZGxlKTsKKwlpZiAocmV0ID09IC1FTk9TUEMgJiYgZXh0NF9zaG91bGRfcmV0cnlfYWxsb2MoaW5vZGUtPmlfc2IsICZyZXRyaWVzKSkKKwkJZ290byByZXRyeTsKK291dDoKKwlyZXR1cm4gcmV0OworfQorCitpbnQgZXh0NF9qb3VybmFsX2RpcnR5X2RhdGEoaGFuZGxlX3QgKmhhbmRsZSwgc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCkKK3sKKwlpbnQgZXJyID0gamJkMl9qb3VybmFsX2RpcnR5X2RhdGEoaGFuZGxlLCBiaCk7CisJaWYgKGVycikKKwkJZXh0NF9qb3VybmFsX2Fib3J0X2hhbmRsZShfX0ZVTkNUSU9OX18sIF9fRlVOQ1RJT05fXywKKwkJCQkJCWJoLCBoYW5kbGUsZXJyKTsKKwlyZXR1cm4gZXJyOworfQorCisvKiBGb3IgY29tbWl0X3dyaXRlKCkgaW4gZGF0YT1qb3VybmFsIG1vZGUgKi8KK3N0YXRpYyBpbnQgY29tbWl0X3dyaXRlX2ZuKGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBidWZmZXJfaGVhZCAqYmgpCit7CisJaWYgKCFidWZmZXJfbWFwcGVkKGJoKSB8fCBidWZmZXJfZnJlZWQoYmgpKQorCQlyZXR1cm4gMDsKKwlzZXRfYnVmZmVyX3VwdG9kYXRlKGJoKTsKKwlyZXR1cm4gZXh0NF9qb3VybmFsX2RpcnR5X21ldGFkYXRhKGhhbmRsZSwgYmgpOworfQorCisvKgorICogV2UgbmVlZCB0byBwaWNrIHVwIHRoZSBuZXcgaW5vZGUgc2l6ZSB3aGljaCBnZW5lcmljX2NvbW1pdF93cml0ZSBnYXZlIHVzCisgKiBgZmlsZScgY2FuIGJlIE5VTEwgLSBlZywgd2hlbiBjYWxsZWQgZnJvbSBwYWdlX3N5bWxpbmsoKS4KKyAqCisgKiBleHQ0IG5ldmVyIHBsYWNlcyBidWZmZXJzIG9uIGlub2RlLT5pX21hcHBpbmctPnByaXZhdGVfbGlzdC4gIG1ldGFkYXRhCisgKiBidWZmZXJzIGFyZSBtYW5hZ2VkIGludGVybmFsbHkuCisgKi8KK3N0YXRpYyBpbnQgZXh0NF9vcmRlcmVkX2NvbW1pdF93cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IHBhZ2UgKnBhZ2UsCisJCQkgICAgIHVuc2lnbmVkIGZyb20sIHVuc2lnbmVkIHRvKQoreworCWhhbmRsZV90ICpoYW5kbGUgPSBleHQ0X2pvdXJuYWxfY3VycmVudF9oYW5kbGUoKTsKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gcGFnZS0+bWFwcGluZy0+aG9zdDsKKwlpbnQgcmV0ID0gMCwgcmV0MjsKKworCXJldCA9IHdhbGtfcGFnZV9idWZmZXJzKGhhbmRsZSwgcGFnZV9idWZmZXJzKHBhZ2UpLAorCQlmcm9tLCB0bywgTlVMTCwgZXh0NF9qb3VybmFsX2RpcnR5X2RhdGEpOworCisJaWYgKHJldCA9PSAwKSB7CisJCS8qCisJCSAqIGdlbmVyaWNfY29tbWl0X3dyaXRlKCkgd2lsbCBydW4gbWFya19pbm9kZV9kaXJ0eSgpIGlmIGlfc2l6ZQorCQkgKiBjaGFuZ2VzLiAgU28gbGV0J3MgcGlnZ3liYWNrIHRoZSBpX2Rpc2tzaXplIG1hcmtfaW5vZGVfZGlydHkKKwkJICogaW50byB0aGF0LgorCQkgKi8KKwkJbG9mZl90IG5ld19pX3NpemU7CisKKwkJbmV3X2lfc2l6ZSA9ICgobG9mZl90KXBhZ2UtPmluZGV4IDw8IFBBR0VfQ0FDSEVfU0hJRlQpICsgdG87CisJCWlmIChuZXdfaV9zaXplID4gRVhUNF9JKGlub2RlKS0+aV9kaXNrc2l6ZSkKKwkJCUVYVDRfSShpbm9kZSktPmlfZGlza3NpemUgPSBuZXdfaV9zaXplOworCQlyZXQgPSBnZW5lcmljX2NvbW1pdF93cml0ZShmaWxlLCBwYWdlLCBmcm9tLCB0byk7CisJfQorCXJldDIgPSBleHQ0X2pvdXJuYWxfc3RvcChoYW5kbGUpOworCWlmICghcmV0KQorCQlyZXQgPSByZXQyOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgZXh0NF93cml0ZWJhY2tfY29tbWl0X3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3QgcGFnZSAqcGFnZSwKKwkJCSAgICAgdW5zaWduZWQgZnJvbSwgdW5zaWduZWQgdG8pCit7CisJaGFuZGxlX3QgKmhhbmRsZSA9IGV4dDRfam91cm5hbF9jdXJyZW50X2hhbmRsZSgpOworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBwYWdlLT5tYXBwaW5nLT5ob3N0OworCWludCByZXQgPSAwLCByZXQyOworCWxvZmZfdCBuZXdfaV9zaXplOworCisJbmV3X2lfc2l6ZSA9ICgobG9mZl90KXBhZ2UtPmluZGV4IDw8IFBBR0VfQ0FDSEVfU0hJRlQpICsgdG87CisJaWYgKG5ld19pX3NpemUgPiBFWFQ0X0koaW5vZGUpLT5pX2Rpc2tzaXplKQorCQlFWFQ0X0koaW5vZGUpLT5pX2Rpc2tzaXplID0gbmV3X2lfc2l6ZTsKKworCWlmICh0ZXN0X29wdChpbm9kZS0+aV9zYiwgTk9CSCkgJiYgZXh0NF9zaG91bGRfd3JpdGViYWNrX2RhdGEoaW5vZGUpKQorCQlyZXQgPSBub2JoX2NvbW1pdF93cml0ZShmaWxlLCBwYWdlLCBmcm9tLCB0byk7CisJZWxzZQorCQlyZXQgPSBnZW5lcmljX2NvbW1pdF93cml0ZShmaWxlLCBwYWdlLCBmcm9tLCB0byk7CisKKwlyZXQyID0gZXh0NF9qb3VybmFsX3N0b3AoaGFuZGxlKTsKKwlpZiAoIXJldCkKKwkJcmV0ID0gcmV0MjsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGV4dDRfam91cm5hbGxlZF9jb21taXRfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsCisJCQlzdHJ1Y3QgcGFnZSAqcGFnZSwgdW5zaWduZWQgZnJvbSwgdW5zaWduZWQgdG8pCit7CisJaGFuZGxlX3QgKmhhbmRsZSA9IGV4dDRfam91cm5hbF9jdXJyZW50X2hhbmRsZSgpOworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBwYWdlLT5tYXBwaW5nLT5ob3N0OworCWludCByZXQgPSAwLCByZXQyOworCWludCBwYXJ0aWFsID0gMDsKKwlsb2ZmX3QgcG9zOworCisJLyoKKwkgKiBIZXJlIHdlIGR1cGxpY2F0ZSB0aGUgZ2VuZXJpY19jb21taXRfd3JpdGUoKSBmdW5jdGlvbmFsaXR5CisJICovCisJcG9zID0gKChsb2ZmX3QpcGFnZS0+aW5kZXggPDwgUEFHRV9DQUNIRV9TSElGVCkgKyB0bzsKKworCXJldCA9IHdhbGtfcGFnZV9idWZmZXJzKGhhbmRsZSwgcGFnZV9idWZmZXJzKHBhZ2UpLCBmcm9tLAorCQkJCXRvLCAmcGFydGlhbCwgY29tbWl0X3dyaXRlX2ZuKTsKKwlpZiAoIXBhcnRpYWwpCisJCVNldFBhZ2VVcHRvZGF0ZShwYWdlKTsKKwlpZiAocG9zID4gaW5vZGUtPmlfc2l6ZSkKKwkJaV9zaXplX3dyaXRlKGlub2RlLCBwb3MpOworCUVYVDRfSShpbm9kZSktPmlfc3RhdGUgfD0gRVhUNF9TVEFURV9KREFUQTsKKwlpZiAoaW5vZGUtPmlfc2l6ZSA+IEVYVDRfSShpbm9kZSktPmlfZGlza3NpemUpIHsKKwkJRVhUNF9JKGlub2RlKS0+aV9kaXNrc2l6ZSA9IGlub2RlLT5pX3NpemU7CisJCXJldDIgPSBleHQ0X21hcmtfaW5vZGVfZGlydHkoaGFuZGxlLCBpbm9kZSk7CisJCWlmICghcmV0KQorCQkJcmV0ID0gcmV0MjsKKwl9CisJcmV0MiA9IGV4dDRfam91cm5hbF9zdG9wKGhhbmRsZSk7CisJaWYgKCFyZXQpCisJCXJldCA9IHJldDI7CisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqIGJtYXAoKSBpcyBzcGVjaWFsLiAgSXQgZ2V0cyB1c2VkIGJ5IGFwcGxpY2F0aW9ucyBzdWNoIGFzIGxpbG8gYW5kIGJ5CisgKiB0aGUgc3dhcHBlciB0byBmaW5kIHRoZSBvbi1kaXNrIGJsb2NrIG9mIGEgc3BlY2lmaWMgcGllY2Ugb2YgZGF0YS4KKyAqCisgKiBOYXR1cmFsbHksIHRoaXMgaXMgZGFuZ2Vyb3VzIGlmIHRoZSBibG9jayBjb25jZXJuZWQgaXMgc3RpbGwgaW4gdGhlCisgKiBqb3VybmFsLiAgSWYgc29tZWJvZHkgbWFrZXMgYSBzd2FwZmlsZSBvbiBhbiBleHQ0IGRhdGEtam91cm5hbGluZworICogZmlsZXN5c3RlbSBhbmQgZW5hYmxlcyBzd2FwLCB0aGVuIHRoZXkgbWF5IGdldCBhIG5hc3R5IHNob2NrIHdoZW4gdGhlCisgKiBkYXRhIGdldHRpbmcgc3dhcHBlZCB0byB0aGF0IHN3YXBmaWxlIHN1ZGRlbmx5IGdldHMgb3ZlcndyaXR0ZW4gYnkKKyAqIHRoZSBvcmlnaW5hbCB6ZXJvJ3Mgd3JpdHRlbiBvdXQgcHJldmlvdXNseSB0byB0aGUgam91cm5hbCBhbmQKKyAqIGF3YWl0aW5nIHdyaXRlYmFjayBpbiB0aGUga2VybmVsJ3MgYnVmZmVyIGNhY2hlLgorICoKKyAqIFNvLCBpZiB3ZSBzZWUgYW55IGJtYXAgY2FsbHMgaGVyZSBvbiBhIG1vZGlmaWVkLCBkYXRhLWpvdXJuYWxlZCBmaWxlLAorICogdGFrZSBleHRyYSBzdGVwcyB0byBmbHVzaCBhbnkgYmxvY2tzIHdoaWNoIG1pZ2h0IGJlIGluIHRoZSBjYWNoZS4KKyAqLworc3RhdGljIHNlY3Rvcl90IGV4dDRfYm1hcChzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZywgc2VjdG9yX3QgYmxvY2spCit7CisJc3RydWN0IGlub2RlICppbm9kZSA9IG1hcHBpbmctPmhvc3Q7CisJam91cm5hbF90ICpqb3VybmFsOworCWludCBlcnI7CisKKwlpZiAoRVhUNF9JKGlub2RlKS0+aV9zdGF0ZSAmIEVYVDRfU1RBVEVfSkRBVEEpIHsKKwkJLyoKKwkJICogVGhpcyBpcyBhIFJFQUxMWSBoZWF2eXdlaWdodCBhcHByb2FjaCwgYnV0IHRoZSB1c2Ugb2YKKwkJICogYm1hcCBvbiBkaXJ0eSBmaWxlcyBpcyBleHBlY3RlZCB0byBiZSBleHRyZW1lbHkgcmFyZToKKwkJICogb25seSBpZiB3ZSBydW4gbGlsbyBvciBzd2Fwb24gb24gYSBmcmVzaGx5IG1hZGUgZmlsZQorCQkgKiBkbyB3ZSBleHBlY3QgdGhpcyB0byBoYXBwZW4uCisJCSAqCisJCSAqIChibWFwIHJlcXVpcmVzIENBUF9TWVNfUkFXSU8gc28gdGhpcyBkb2VzIG5vdAorCQkgKiByZXByZXNlbnQgYW4gdW5wcml2aWxlZ2VkIHVzZXIgRE9TIGF0dGFjayAtLS0gd2UnZCBiZQorCQkgKiBpbiB0cm91YmxlIGlmIG1vcnRhbCB1c2VycyBjb3VsZCB0cmlnZ2VyIHRoaXMgcGF0aCBhdAorCQkgKiB3aWxsLikKKwkJICoKKwkJICogTkIuIEVYVDRfU1RBVEVfSkRBVEEgaXMgbm90IHNldCBvbiBmaWxlcyBvdGhlciB0aGFuCisJCSAqIHJlZ3VsYXIgZmlsZXMuICBJZiBzb21lYm9keSB3YW50cyB0byBibWFwIGEgZGlyZWN0b3J5CisJCSAqIG9yIHN5bWxpbmsgYW5kIGdldHMgY29uZnVzZWQgYmVjYXVzZSB0aGUgYnVmZmVyCisJCSAqIGhhc24ndCB5ZXQgYmVlbiBmbHVzaGVkIHRvIGRpc2ssIHRoZXkgZGVzZXJ2ZQorCQkgKiBldmVyeXRoaW5nIHRoZXkgZ2V0LgorCQkgKi8KKworCQlFWFQ0X0koaW5vZGUpLT5pX3N0YXRlICY9IH5FWFQ0X1NUQVRFX0pEQVRBOworCQlqb3VybmFsID0gRVhUNF9KT1VSTkFMKGlub2RlKTsKKwkJamJkMl9qb3VybmFsX2xvY2tfdXBkYXRlcyhqb3VybmFsKTsKKwkJZXJyID0gamJkMl9qb3VybmFsX2ZsdXNoKGpvdXJuYWwpOworCQlqYmQyX2pvdXJuYWxfdW5sb2NrX3VwZGF0ZXMoam91cm5hbCk7CisKKwkJaWYgKGVycikKKwkJCXJldHVybiAwOworCX0KKworCXJldHVybiBnZW5lcmljX2Jsb2NrX2JtYXAobWFwcGluZyxibG9jayxleHQ0X2dldF9ibG9jayk7Cit9CisKK3N0YXRpYyBpbnQgYmdldF9vbmUoaGFuZGxlX3QgKmhhbmRsZSwgc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCkKK3sKKwlnZXRfYmgoYmgpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGJwdXRfb25lKGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBidWZmZXJfaGVhZCAqYmgpCit7CisJcHV0X2JoKGJoKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBqYmQyX2pvdXJuYWxfZGlydHlfZGF0YV9mbihoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoKQoreworCWlmIChidWZmZXJfbWFwcGVkKGJoKSkKKwkJcmV0dXJuIGV4dDRfam91cm5hbF9kaXJ0eV9kYXRhKGhhbmRsZSwgYmgpOworCXJldHVybiAwOworfQorCisvKgorICogTm90ZSB0aGF0IHdlIGFsd2F5cyBzdGFydCBhIHRyYW5zYWN0aW9uIGV2ZW4gaWYgd2UncmUgbm90IGpvdXJuYWxsaW5nCisgKiBkYXRhLiAgVGhpcyBpcyB0byBwcmVzZXJ2ZSBvcmRlcmluZzogYW55IGhvbGUgaW5zdGFudGlhdGlvbiB3aXRoaW4KKyAqIF9fYmxvY2tfd3JpdGVfZnVsbF9wYWdlIC0+IGV4dDRfZ2V0X2Jsb2NrKCkgc2hvdWxkIGJlIGpvdXJuYWxsZWQKKyAqIGFsb25nIHdpdGggdGhlIGRhdGEgc28gd2UgZG9uJ3QgY3Jhc2ggYW5kIHRoZW4gZ2V0IG1ldGFkYXRhIHdoaWNoCisgKiByZWZlcnMgdG8gb2xkIGRhdGEuCisgKgorICogSW4gYWxsIGpvdXJuYWxsaW5nIG1vZGVzIGJsb2NrX3dyaXRlX2Z1bGxfcGFnZSgpIHdpbGwgc3RhcnQgdGhlIEkvTy4KKyAqCisgKiBQcm9ibGVtOgorICoKKyAqCWV4dDRfd3JpdGVwYWdlKCkgLT4ga21hbGxvYygpIC0+IF9fYWxsb2NfcGFnZXMoKSAtPiBwYWdlX2xhdW5kZXIoKSAtPgorICoJCWV4dDRfd3JpdGVwYWdlKCkKKyAqCisgKiBTaW1pbGFyIGZvcjoKKyAqCisgKglleHQ0X2ZpbGVfd3JpdGUoKSAtPiBnZW5lcmljX2ZpbGVfd3JpdGUoKSAtPiBfX2FsbG9jX3BhZ2VzKCkgLT4gLi4uCisgKgorICogU2FtZSBhcHBsaWVzIHRvIGV4dDRfZ2V0X2Jsb2NrKCkuICBXZSB3aWxsIGRlYWRsb2NrIG9uIHZhcmlvdXMgdGhpbmdzIGxpa2UKKyAqIGxvY2tfam91cm5hbCBhbmQgaV90cnVuY2F0ZV9tdXRleC4KKyAqCisgKiBTZXR0aW5nIFBGX01FTUFMTE9DIGhlcmUgZG9lc24ndCB3b3JrIC0gdG9vIG1hbnkgaW50ZXJuYWwgbWVtb3J5CisgKiBhbGxvY2F0aW9ucyBmYWlsLgorICoKKyAqIDE2TWF5MDE6IElmIHdlJ3JlIHJlZW50ZXJlZCB0aGVuIGpvdXJuYWxfY3VycmVudF9oYW5kbGUoKSB3aWxsIGJlCisgKgkgICAgbm9uLXplcm8uIFdlIHNpbXBseSAqcmV0dXJuKi4KKyAqCisgKiAxIEp1bHkgMjAwMTogQEBAIEZJWE1FOgorICogICBJbiBqb3VybmFsbGVkIGRhdGEgbW9kZSwgYSBkYXRhIGJ1ZmZlciBtYXkgYmUgbWV0YWRhdGEgYWdhaW5zdCB0aGUKKyAqICAgY3VycmVudCB0cmFuc2FjdGlvbi4gIEJ1dCB0aGUgc2FtZSBmaWxlIGlzIHBhcnQgb2YgYSBzaGFyZWQgbWFwcGluZworICogICBhbmQgc29tZW9uZSBkb2VzIGEgd3JpdGVwYWdlKCkgb24gaXQuCisgKgorICogICBXZSB3aWxsIG1vdmUgdGhlIGJ1ZmZlciBvbnRvIHRoZSBhc3luY19kYXRhIGxpc3QsIGJ1dCAqYWZ0ZXIqIGl0IGhhcworICogICBiZWVuIGRpcnRpZWQuIFNvIHRoZXJlJ3MgYSBzbWFsbCB3aW5kb3cgd2hlcmUgd2UgaGF2ZSBkaXJ0eSBkYXRhIG9uCisgKiAgIEJKX01ldGFkYXRhLgorICoKKyAqICAgTm90ZSB0aGF0IHRoaXMgb25seSBhcHBsaWVzIHRvIHRoZSBsYXN0IHBhcnRpYWwgcGFnZSBpbiB0aGUgZmlsZS4gIFRoZQorICogICBiaXQgd2hpY2ggYmxvY2tfd3JpdGVfZnVsbF9wYWdlKCkgdXNlcyBwcmVwYXJlL2NvbW1pdCBmb3IuICAoVGhhdCdzCisgKiAgIGJyb2tlbiBjb2RlIGFueXdheTogaXQncyB3cm9uZyBmb3IgbXN5bmMoKSkuCisgKgorICogICBJdCdzIGEgcmFyZSBjYXNlOiBhZmZlY3RzIHRoZSBmaW5hbCBwYXJ0aWFsIHBhZ2UsIGZvciBqb3VybmFsbGVkIGRhdGEKKyAqICAgd2hlcmUgdGhlIGZpbGUgaXMgc3ViamVjdCB0byBiaXRoIHdyaXRlKCkgYW5kIHdyaXRlcGFnZSgpIGluIHRoZSBzYW1lCisgKiAgIHRyYW5zY3Rpb24uICBUbyBmaXggaXQgd2UnbGwgbmVlZCBhIGN1c3RvbSBibG9ja193cml0ZV9mdWxsX3BhZ2UoKS4KKyAqICAgV2UnbGwgcHJvYmFibHkgbmVlZCB0aGF0IGFueXdheSBmb3Igam91cm5hbGxpbmcgd3JpdGVwYWdlKCkgb3V0cHV0LgorICoKKyAqIFdlIGRvbid0IGhvbm91ciBzeW5jaHJvbm91cyBtb3VudHMgZm9yIHdyaXRlcGFnZSgpLiAgVGhhdCB3b3VsZCBiZQorICogZGlzYXN0cm91cy4gIEFueSB3cml0ZSgpIG9yIG1ldGFkYXRhIG9wZXJhdGlvbiB3aWxsIHN5bmMgdGhlIGZzIGZvcgorICogdXMuCisgKgorICogQUtQTTI6IGlmIGFsbCB0aGUgcGFnZSdzIGJ1ZmZlcnMgYXJlIG1hcHBlZCB0byBkaXNrIGFuZCAhZGF0YT1qb3VybmFsLAorICogd2UgZG9uJ3QgbmVlZCB0byBvcGVuIGEgdHJhbnNhY3Rpb24gaGVyZS4KKyAqLworc3RhdGljIGludCBleHQ0X29yZGVyZWRfd3JpdGVwYWdlKHN0cnVjdCBwYWdlICpwYWdlLAorCQkJCXN0cnVjdCB3cml0ZWJhY2tfY29udHJvbCAqd2JjKQoreworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBwYWdlLT5tYXBwaW5nLT5ob3N0OworCXN0cnVjdCBidWZmZXJfaGVhZCAqcGFnZV9idWZzOworCWhhbmRsZV90ICpoYW5kbGUgPSBOVUxMOworCWludCByZXQgPSAwOworCWludCBlcnI7CisKKwlKX0FTU0VSVChQYWdlTG9ja2VkKHBhZ2UpKTsKKworCS8qCisJICogV2UgZ2l2ZSB1cCBoZXJlIGlmIHdlJ3JlIHJlZW50ZXJlZCwgYmVjYXVzZSBpdCBtaWdodCBiZSBmb3IgYQorCSAqIGRpZmZlcmVudCBmaWxlc3lzdGVtLgorCSAqLworCWlmIChleHQ0X2pvdXJuYWxfY3VycmVudF9oYW5kbGUoKSkKKwkJZ290byBvdXRfZmFpbDsKKworCWhhbmRsZSA9IGV4dDRfam91cm5hbF9zdGFydChpbm9kZSwgZXh0NF93cml0ZXBhZ2VfdHJhbnNfYmxvY2tzKGlub2RlKSk7CisKKwlpZiAoSVNfRVJSKGhhbmRsZSkpIHsKKwkJcmV0ID0gUFRSX0VSUihoYW5kbGUpOworCQlnb3RvIG91dF9mYWlsOworCX0KKworCWlmICghcGFnZV9oYXNfYnVmZmVycyhwYWdlKSkgeworCQljcmVhdGVfZW1wdHlfYnVmZmVycyhwYWdlLCBpbm9kZS0+aV9zYi0+c19ibG9ja3NpemUsCisJCQkJKDEgPDwgQkhfRGlydHkpfCgxIDw8IEJIX1VwdG9kYXRlKSk7CisJfQorCXBhZ2VfYnVmcyA9IHBhZ2VfYnVmZmVycyhwYWdlKTsKKwl3YWxrX3BhZ2VfYnVmZmVycyhoYW5kbGUsIHBhZ2VfYnVmcywgMCwKKwkJCVBBR0VfQ0FDSEVfU0laRSwgTlVMTCwgYmdldF9vbmUpOworCisJcmV0ID0gYmxvY2tfd3JpdGVfZnVsbF9wYWdlKHBhZ2UsIGV4dDRfZ2V0X2Jsb2NrLCB3YmMpOworCisJLyoKKwkgKiBUaGUgcGFnZSBjYW4gYmVjb21lIHVubG9ja2VkIGF0IGFueSBwb2ludCBub3csIGFuZAorCSAqIHRydW5jYXRlIGNhbiB0aGVuIGNvbWUgaW4gYW5kIGNoYW5nZSB0aGluZ3MuICBTbyB3ZQorCSAqIGNhbid0IHRvdWNoICpwYWdlIGZyb20gbm93IG9uLiAgQnV0ICpwYWdlX2J1ZnMgaXMKKwkgKiBzYWZlIGR1ZSB0byBlbGV2YXRlZCByZWZjb3VudC4KKwkgKi8KKworCS8qCisJICogQW5kIGF0dGFjaCB0aGVtIHRvIHRoZSBjdXJyZW50IHRyYW5zYWN0aW9uLiAgQnV0IG9ubHkgaWYKKwkgKiBibG9ja193cml0ZV9mdWxsX3BhZ2UoKSBzdWNjZWVkZWQuICBPdGhlcndpc2UgdGhleSBhcmUgdW5tYXBwZWQsCisJICogYW5kIGdlbmVyYWxseSBqdW5rLgorCSAqLworCWlmIChyZXQgPT0gMCkgeworCQllcnIgPSB3YWxrX3BhZ2VfYnVmZmVycyhoYW5kbGUsIHBhZ2VfYnVmcywgMCwgUEFHRV9DQUNIRV9TSVpFLAorCQkJCQlOVUxMLCBqYmQyX2pvdXJuYWxfZGlydHlfZGF0YV9mbik7CisJCWlmICghcmV0KQorCQkJcmV0ID0gZXJyOworCX0KKwl3YWxrX3BhZ2VfYnVmZmVycyhoYW5kbGUsIHBhZ2VfYnVmcywgMCwKKwkJCVBBR0VfQ0FDSEVfU0laRSwgTlVMTCwgYnB1dF9vbmUpOworCWVyciA9IGV4dDRfam91cm5hbF9zdG9wKGhhbmRsZSk7CisJaWYgKCFyZXQpCisJCXJldCA9IGVycjsKKwlyZXR1cm4gcmV0OworCitvdXRfZmFpbDoKKwlyZWRpcnR5X3BhZ2VfZm9yX3dyaXRlcGFnZSh3YmMsIHBhZ2UpOworCXVubG9ja19wYWdlKHBhZ2UpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgZXh0NF93cml0ZWJhY2tfd3JpdGVwYWdlKHN0cnVjdCBwYWdlICpwYWdlLAorCQkJCXN0cnVjdCB3cml0ZWJhY2tfY29udHJvbCAqd2JjKQoreworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBwYWdlLT5tYXBwaW5nLT5ob3N0OworCWhhbmRsZV90ICpoYW5kbGUgPSBOVUxMOworCWludCByZXQgPSAwOworCWludCBlcnI7CisKKwlpZiAoZXh0NF9qb3VybmFsX2N1cnJlbnRfaGFuZGxlKCkpCisJCWdvdG8gb3V0X2ZhaWw7CisKKwloYW5kbGUgPSBleHQ0X2pvdXJuYWxfc3RhcnQoaW5vZGUsIGV4dDRfd3JpdGVwYWdlX3RyYW5zX2Jsb2Nrcyhpbm9kZSkpOworCWlmIChJU19FUlIoaGFuZGxlKSkgeworCQlyZXQgPSBQVFJfRVJSKGhhbmRsZSk7CisJCWdvdG8gb3V0X2ZhaWw7CisJfQorCisJaWYgKHRlc3Rfb3B0KGlub2RlLT5pX3NiLCBOT0JIKSAmJiBleHQ0X3Nob3VsZF93cml0ZWJhY2tfZGF0YShpbm9kZSkpCisJCXJldCA9IG5vYmhfd3JpdGVwYWdlKHBhZ2UsIGV4dDRfZ2V0X2Jsb2NrLCB3YmMpOworCWVsc2UKKwkJcmV0ID0gYmxvY2tfd3JpdGVfZnVsbF9wYWdlKHBhZ2UsIGV4dDRfZ2V0X2Jsb2NrLCB3YmMpOworCisJZXJyID0gZXh0NF9qb3VybmFsX3N0b3AoaGFuZGxlKTsKKwlpZiAoIXJldCkKKwkJcmV0ID0gZXJyOworCXJldHVybiByZXQ7CisKK291dF9mYWlsOgorCXJlZGlydHlfcGFnZV9mb3Jfd3JpdGVwYWdlKHdiYywgcGFnZSk7CisJdW5sb2NrX3BhZ2UocGFnZSk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBleHQ0X2pvdXJuYWxsZWRfd3JpdGVwYWdlKHN0cnVjdCBwYWdlICpwYWdlLAorCQkJCXN0cnVjdCB3cml0ZWJhY2tfY29udHJvbCAqd2JjKQoreworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBwYWdlLT5tYXBwaW5nLT5ob3N0OworCWhhbmRsZV90ICpoYW5kbGUgPSBOVUxMOworCWludCByZXQgPSAwOworCWludCBlcnI7CisKKwlpZiAoZXh0NF9qb3VybmFsX2N1cnJlbnRfaGFuZGxlKCkpCisJCWdvdG8gbm9fd3JpdGU7CisKKwloYW5kbGUgPSBleHQ0X2pvdXJuYWxfc3RhcnQoaW5vZGUsIGV4dDRfd3JpdGVwYWdlX3RyYW5zX2Jsb2Nrcyhpbm9kZSkpOworCWlmIChJU19FUlIoaGFuZGxlKSkgeworCQlyZXQgPSBQVFJfRVJSKGhhbmRsZSk7CisJCWdvdG8gbm9fd3JpdGU7CisJfQorCisJaWYgKCFwYWdlX2hhc19idWZmZXJzKHBhZ2UpIHx8IFBhZ2VDaGVja2VkKHBhZ2UpKSB7CisJCS8qCisJCSAqIEl0J3MgbW1hcHBlZCBwYWdlY2FjaGUuICBBZGQgYnVmZmVycyBhbmQgam91cm5hbCBpdC4gIFRoZXJlCisJCSAqIGRvZXNuJ3Qgc2VlbSBtdWNoIHBvaW50IGluIHJlZGlydHlpbmcgdGhlIHBhZ2UgaGVyZS4KKwkJICovCisJCUNsZWFyUGFnZUNoZWNrZWQocGFnZSk7CisJCXJldCA9IGJsb2NrX3ByZXBhcmVfd3JpdGUocGFnZSwgMCwgUEFHRV9DQUNIRV9TSVpFLAorCQkJCQlleHQ0X2dldF9ibG9jayk7CisJCWlmIChyZXQgIT0gMCkgeworCQkJZXh0NF9qb3VybmFsX3N0b3AoaGFuZGxlKTsKKwkJCWdvdG8gb3V0X3VubG9jazsKKwkJfQorCQlyZXQgPSB3YWxrX3BhZ2VfYnVmZmVycyhoYW5kbGUsIHBhZ2VfYnVmZmVycyhwYWdlKSwgMCwKKwkJCVBBR0VfQ0FDSEVfU0laRSwgTlVMTCwgZG9fam91cm5hbF9nZXRfd3JpdGVfYWNjZXNzKTsKKworCQllcnIgPSB3YWxrX3BhZ2VfYnVmZmVycyhoYW5kbGUsIHBhZ2VfYnVmZmVycyhwYWdlKSwgMCwKKwkJCQlQQUdFX0NBQ0hFX1NJWkUsIE5VTEwsIGNvbW1pdF93cml0ZV9mbik7CisJCWlmIChyZXQgPT0gMCkKKwkJCXJldCA9IGVycjsKKwkJRVhUNF9JKGlub2RlKS0+aV9zdGF0ZSB8PSBFWFQ0X1NUQVRFX0pEQVRBOworCQl1bmxvY2tfcGFnZShwYWdlKTsKKwl9IGVsc2UgeworCQkvKgorCQkgKiBJdCBtYXkgYmUgYSBwYWdlIGZ1bGwgb2YgY2hlY2twb2ludC1tb2RlIGJ1ZmZlcnMuICBXZSBkb24ndAorCQkgKiByZWFsbHkga25vdyB1bmxlc3Mgd2UgZ28gcG9rZSBhcm91bmQgaW4gdGhlIGJ1ZmZlcl9oZWFkcy4KKwkJICogQnV0IGJsb2NrX3dyaXRlX2Z1bGxfcGFnZSB3aWxsIGRvIHRoZSByaWdodCB0aGluZy4KKwkJICovCisJCXJldCA9IGJsb2NrX3dyaXRlX2Z1bGxfcGFnZShwYWdlLCBleHQ0X2dldF9ibG9jaywgd2JjKTsKKwl9CisJZXJyID0gZXh0NF9qb3VybmFsX3N0b3AoaGFuZGxlKTsKKwlpZiAoIXJldCkKKwkJcmV0ID0gZXJyOworb3V0OgorCXJldHVybiByZXQ7CisKK25vX3dyaXRlOgorCXJlZGlydHlfcGFnZV9mb3Jfd3JpdGVwYWdlKHdiYywgcGFnZSk7CitvdXRfdW5sb2NrOgorCXVubG9ja19wYWdlKHBhZ2UpOworCWdvdG8gb3V0OworfQorCitzdGF0aWMgaW50IGV4dDRfcmVhZHBhZ2Uoc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCBwYWdlICpwYWdlKQoreworCXJldHVybiBtcGFnZV9yZWFkcGFnZShwYWdlLCBleHQ0X2dldF9ibG9jayk7Cit9CisKK3N0YXRpYyBpbnQKK2V4dDRfcmVhZHBhZ2VzKHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZywKKwkJc3RydWN0IGxpc3RfaGVhZCAqcGFnZXMsIHVuc2lnbmVkIG5yX3BhZ2VzKQoreworCXJldHVybiBtcGFnZV9yZWFkcGFnZXMobWFwcGluZywgcGFnZXMsIG5yX3BhZ2VzLCBleHQ0X2dldF9ibG9jayk7Cit9CisKK3N0YXRpYyB2b2lkIGV4dDRfaW52YWxpZGF0ZXBhZ2Uoc3RydWN0IHBhZ2UgKnBhZ2UsIHVuc2lnbmVkIGxvbmcgb2Zmc2V0KQoreworCWpvdXJuYWxfdCAqam91cm5hbCA9IEVYVDRfSk9VUk5BTChwYWdlLT5tYXBwaW5nLT5ob3N0KTsKKworCS8qCisJICogSWYgaXQncyBhIGZ1bGwgdHJ1bmNhdGUgd2UganVzdCBmb3JnZXQgYWJvdXQgdGhlIHBlbmRpbmcgZGlydHlpbmcKKwkgKi8KKwlpZiAob2Zmc2V0ID09IDApCisJCUNsZWFyUGFnZUNoZWNrZWQocGFnZSk7CisKKwlqYmQyX2pvdXJuYWxfaW52YWxpZGF0ZXBhZ2Uoam91cm5hbCwgcGFnZSwgb2Zmc2V0KTsKK30KKworc3RhdGljIGludCBleHQ0X3JlbGVhc2VwYWdlKHN0cnVjdCBwYWdlICpwYWdlLCBnZnBfdCB3YWl0KQoreworCWpvdXJuYWxfdCAqam91cm5hbCA9IEVYVDRfSk9VUk5BTChwYWdlLT5tYXBwaW5nLT5ob3N0KTsKKworCVdBUk5fT04oUGFnZUNoZWNrZWQocGFnZSkpOworCWlmICghcGFnZV9oYXNfYnVmZmVycyhwYWdlKSkKKwkJcmV0dXJuIDA7CisJcmV0dXJuIGpiZDJfam91cm5hbF90cnlfdG9fZnJlZV9idWZmZXJzKGpvdXJuYWwsIHBhZ2UsIHdhaXQpOworfQorCisvKgorICogSWYgdGhlIE9fRElSRUNUIHdyaXRlIHdpbGwgZXh0ZW5kIHRoZSBmaWxlIHRoZW4gYWRkIHRoaXMgaW5vZGUgdG8gdGhlCisgKiBvcnBoYW4gbGlzdC4gIFNvIHJlY292ZXJ5IHdpbGwgdHJ1bmNhdGUgaXQgYmFjayB0byB0aGUgb3JpZ2luYWwgc2l6ZQorICogaWYgdGhlIG1hY2hpbmUgY3Jhc2hlcyBkdXJpbmcgdGhlIHdyaXRlLgorICoKKyAqIElmIHRoZSBPX0RJUkVDVCB3cml0ZSBpcyBpbnRhbnRpYXRpbmcgaG9sZXMgaW5zaWRlIGlfc2l6ZSBhbmQgdGhlIG1hY2hpbmUKKyAqIGNyYXNoZXMgdGhlbiBzdGFsZSBkaXNrIGRhdGEgX21heV8gYmUgZXhwb3NlZCBpbnNpZGUgdGhlIGZpbGUuCisgKi8KK3N0YXRpYyBzc2l6ZV90IGV4dDRfZGlyZWN0X0lPKGludCBydywgc3RydWN0IGtpb2NiICppb2NiLAorCQkJY29uc3Qgc3RydWN0IGlvdmVjICppb3YsIGxvZmZfdCBvZmZzZXQsCisJCQl1bnNpZ25lZCBsb25nIG5yX3NlZ3MpCit7CisJc3RydWN0IGZpbGUgKmZpbGUgPSBpb2NiLT5raV9maWxwOworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBmaWxlLT5mX21hcHBpbmctPmhvc3Q7CisJc3RydWN0IGV4dDRfaW5vZGVfaW5mbyAqZWkgPSBFWFQ0X0koaW5vZGUpOworCWhhbmRsZV90ICpoYW5kbGUgPSBOVUxMOworCXNzaXplX3QgcmV0OworCWludCBvcnBoYW4gPSAwOworCXNpemVfdCBjb3VudCA9IGlvdl9sZW5ndGgoaW92LCBucl9zZWdzKTsKKworCWlmIChydyA9PSBXUklURSkgeworCQlsb2ZmX3QgZmluYWxfc2l6ZSA9IG9mZnNldCArIGNvdW50OworCisJCWhhbmRsZSA9IGV4dDRfam91cm5hbF9zdGFydChpbm9kZSwgRElPX0NSRURJVFMpOworCQlpZiAoSVNfRVJSKGhhbmRsZSkpIHsKKwkJCXJldCA9IFBUUl9FUlIoaGFuZGxlKTsKKwkJCWdvdG8gb3V0OworCQl9CisJCWlmIChmaW5hbF9zaXplID4gaW5vZGUtPmlfc2l6ZSkgeworCQkJcmV0ID0gZXh0NF9vcnBoYW5fYWRkKGhhbmRsZSwgaW5vZGUpOworCQkJaWYgKHJldCkKKwkJCQlnb3RvIG91dF9zdG9wOworCQkJb3JwaGFuID0gMTsKKwkJCWVpLT5pX2Rpc2tzaXplID0gaW5vZGUtPmlfc2l6ZTsKKwkJfQorCX0KKworCXJldCA9IGJsb2NrZGV2X2RpcmVjdF9JTyhydywgaW9jYiwgaW5vZGUsIGlub2RlLT5pX3NiLT5zX2JkZXYsIGlvdiwKKwkJCQkgb2Zmc2V0LCBucl9zZWdzLAorCQkJCSBleHQ0X2dldF9ibG9jaywgTlVMTCk7CisKKwkvKgorCSAqIFJlYWNxdWlyZSB0aGUgaGFuZGxlOiBleHQ0X2dldF9ibG9jaygpIGNhbiByZXN0YXJ0IHRoZSB0cmFuc2FjdGlvbgorCSAqLworCWhhbmRsZSA9IGpvdXJuYWxfY3VycmVudF9oYW5kbGUoKTsKKworb3V0X3N0b3A6CisJaWYgKGhhbmRsZSkgeworCQlpbnQgZXJyOworCisJCWlmIChvcnBoYW4gJiYgaW5vZGUtPmlfbmxpbmspCisJCQlleHQ0X29ycGhhbl9kZWwoaGFuZGxlLCBpbm9kZSk7CisJCWlmIChvcnBoYW4gJiYgcmV0ID4gMCkgeworCQkJbG9mZl90IGVuZCA9IG9mZnNldCArIHJldDsKKwkJCWlmIChlbmQgPiBpbm9kZS0+aV9zaXplKSB7CisJCQkJZWktPmlfZGlza3NpemUgPSBlbmQ7CisJCQkJaV9zaXplX3dyaXRlKGlub2RlLCBlbmQpOworCQkJCS8qCisJCQkJICogV2UncmUgZ29pbmcgdG8gcmV0dXJuIGEgcG9zaXRpdmUgYHJldCcKKwkJCQkgKiBoZXJlIGR1ZSB0byBub24temVyby1sZW5ndGggSS9PLCBzbyB0aGVyZSdzCisJCQkJICogbm8gd2F5IG9mIHJlcG9ydGluZyBlcnJvciByZXR1cm5zIGZyb20KKwkJCQkgKiBleHQ0X21hcmtfaW5vZGVfZGlydHkoKSB0byB1c2Vyc3BhY2UuICBTbworCQkJCSAqIGlnbm9yZSBpdC4KKwkJCQkgKi8KKwkJCQlleHQ0X21hcmtfaW5vZGVfZGlydHkoaGFuZGxlLCBpbm9kZSk7CisJCQl9CisJCX0KKwkJZXJyID0gZXh0NF9qb3VybmFsX3N0b3AoaGFuZGxlKTsKKwkJaWYgKHJldCA9PSAwKQorCQkJcmV0ID0gZXJyOworCX0KK291dDoKKwlyZXR1cm4gcmV0OworfQorCisvKgorICogUGFnZXMgY2FuIGJlIG1hcmtlZCBkaXJ0eSBjb21wbGV0ZWx5IGFzeW5jaHJvbm91c2x5IGZyb20gZXh0NCdzIGpvdXJuYWxsaW5nCisgKiBhY3Rpdml0eS4gIEJ5IGZpbGVtYXBfc3luY19wdGUoKSwgdHJ5X3RvX3VubWFwX29uZSgpLCBldGMuICBXZSBjYW5ub3QgZG8KKyAqIG11Y2ggaGVyZSBiZWNhdXNlIC0+c2V0X3BhZ2VfZGlydHkgaXMgY2FsbGVkIHVuZGVyIFZGUyBsb2Nrcy4gIFRoZSBwYWdlIGlzCisgKiBub3QgbmVjZXNzYXJpbHkgbG9ja2VkLgorICoKKyAqIFdlIGNhbm5vdCBqdXN0IGRpcnR5IHRoZSBwYWdlIGFuZCBsZWF2ZSBhdHRhY2hlZCBidWZmZXJzIGNsZWFuLCBiZWNhdXNlIHRoZQorICogYnVmZmVycycgZGlydHkgc3RhdGUgaXMgImRlZmluaXRpdmUiLiAgV2UgY2Fubm90IGp1c3Qgc2V0IHRoZSBidWZmZXJzIGRpcnR5CisgKiBvciBqYmRkaXJ0eSBiZWNhdXNlIGFsbCB0aGUgam91cm5hbGxpbmcgY29kZSB3aWxsIGV4cGxvZGUuCisgKgorICogU28gd2hhdCB3ZSBkbyBpcyB0byBtYXJrIHRoZSBwYWdlICJwZW5kaW5nIGRpcnR5IiBhbmQgbmV4dCB0aW1lIHdyaXRlcGFnZQorICogaXMgY2FsbGVkLCBwcm9wYWdhdGUgdGhhdCBpbnRvIHRoZSBidWZmZXJzIGFwcHJvcHJpYXRlbHkuCisgKi8KK3N0YXRpYyBpbnQgZXh0NF9qb3VybmFsbGVkX3NldF9wYWdlX2RpcnR5KHN0cnVjdCBwYWdlICpwYWdlKQoreworCVNldFBhZ2VDaGVja2VkKHBhZ2UpOworCXJldHVybiBfX3NldF9wYWdlX2RpcnR5X25vYnVmZmVycyhwYWdlKTsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBhZGRyZXNzX3NwYWNlX29wZXJhdGlvbnMgZXh0NF9vcmRlcmVkX2FvcHMgPSB7CisJLnJlYWRwYWdlCT0gZXh0NF9yZWFkcGFnZSwKKwkucmVhZHBhZ2VzCT0gZXh0NF9yZWFkcGFnZXMsCisJLndyaXRlcGFnZQk9IGV4dDRfb3JkZXJlZF93cml0ZXBhZ2UsCisJLnN5bmNfcGFnZQk9IGJsb2NrX3N5bmNfcGFnZSwKKwkucHJlcGFyZV93cml0ZQk9IGV4dDRfcHJlcGFyZV93cml0ZSwKKwkuY29tbWl0X3dyaXRlCT0gZXh0NF9vcmRlcmVkX2NvbW1pdF93cml0ZSwKKwkuYm1hcAkJPSBleHQ0X2JtYXAsCisJLmludmFsaWRhdGVwYWdlCT0gZXh0NF9pbnZhbGlkYXRlcGFnZSwKKwkucmVsZWFzZXBhZ2UJPSBleHQ0X3JlbGVhc2VwYWdlLAorCS5kaXJlY3RfSU8JPSBleHQ0X2RpcmVjdF9JTywKKwkubWlncmF0ZXBhZ2UJPSBidWZmZXJfbWlncmF0ZV9wYWdlLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBhZGRyZXNzX3NwYWNlX29wZXJhdGlvbnMgZXh0NF93cml0ZWJhY2tfYW9wcyA9IHsKKwkucmVhZHBhZ2UJPSBleHQ0X3JlYWRwYWdlLAorCS5yZWFkcGFnZXMJPSBleHQ0X3JlYWRwYWdlcywKKwkud3JpdGVwYWdlCT0gZXh0NF93cml0ZWJhY2tfd3JpdGVwYWdlLAorCS5zeW5jX3BhZ2UJPSBibG9ja19zeW5jX3BhZ2UsCisJLnByZXBhcmVfd3JpdGUJPSBleHQ0X3ByZXBhcmVfd3JpdGUsCisJLmNvbW1pdF93cml0ZQk9IGV4dDRfd3JpdGViYWNrX2NvbW1pdF93cml0ZSwKKwkuYm1hcAkJPSBleHQ0X2JtYXAsCisJLmludmFsaWRhdGVwYWdlCT0gZXh0NF9pbnZhbGlkYXRlcGFnZSwKKwkucmVsZWFzZXBhZ2UJPSBleHQ0X3JlbGVhc2VwYWdlLAorCS5kaXJlY3RfSU8JPSBleHQ0X2RpcmVjdF9JTywKKwkubWlncmF0ZXBhZ2UJPSBidWZmZXJfbWlncmF0ZV9wYWdlLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBhZGRyZXNzX3NwYWNlX29wZXJhdGlvbnMgZXh0NF9qb3VybmFsbGVkX2FvcHMgPSB7CisJLnJlYWRwYWdlCT0gZXh0NF9yZWFkcGFnZSwKKwkucmVhZHBhZ2VzCT0gZXh0NF9yZWFkcGFnZXMsCisJLndyaXRlcGFnZQk9IGV4dDRfam91cm5hbGxlZF93cml0ZXBhZ2UsCisJLnN5bmNfcGFnZQk9IGJsb2NrX3N5bmNfcGFnZSwKKwkucHJlcGFyZV93cml0ZQk9IGV4dDRfcHJlcGFyZV93cml0ZSwKKwkuY29tbWl0X3dyaXRlCT0gZXh0NF9qb3VybmFsbGVkX2NvbW1pdF93cml0ZSwKKwkuc2V0X3BhZ2VfZGlydHkJPSBleHQ0X2pvdXJuYWxsZWRfc2V0X3BhZ2VfZGlydHksCisJLmJtYXAJCT0gZXh0NF9ibWFwLAorCS5pbnZhbGlkYXRlcGFnZQk9IGV4dDRfaW52YWxpZGF0ZXBhZ2UsCisJLnJlbGVhc2VwYWdlCT0gZXh0NF9yZWxlYXNlcGFnZSwKK307CisKK3ZvaWQgZXh0NF9zZXRfYW9wcyhzdHJ1Y3QgaW5vZGUgKmlub2RlKQoreworCWlmIChleHQ0X3Nob3VsZF9vcmRlcl9kYXRhKGlub2RlKSkKKwkJaW5vZGUtPmlfbWFwcGluZy0+YV9vcHMgPSAmZXh0NF9vcmRlcmVkX2FvcHM7CisJZWxzZSBpZiAoZXh0NF9zaG91bGRfd3JpdGViYWNrX2RhdGEoaW5vZGUpKQorCQlpbm9kZS0+aV9tYXBwaW5nLT5hX29wcyA9ICZleHQ0X3dyaXRlYmFja19hb3BzOworCWVsc2UKKwkJaW5vZGUtPmlfbWFwcGluZy0+YV9vcHMgPSAmZXh0NF9qb3VybmFsbGVkX2FvcHM7Cit9CisKKy8qCisgKiBleHQ0X2Jsb2NrX3RydW5jYXRlX3BhZ2UoKSB6ZXJvZXMgb3V0IGEgbWFwcGluZyBmcm9tIGZpbGUgb2Zmc2V0IGBmcm9tJworICogdXAgdG8gdGhlIGVuZCBvZiB0aGUgYmxvY2sgd2hpY2ggY29ycmVzcG9uZHMgdG8gYGZyb20nLgorICogVGhpcyByZXF1aXJlZCBkdXJpbmcgdHJ1bmNhdGUuIFdlIG5lZWQgdG8gcGh5c2ljYWxseSB6ZXJvIHRoZSB0YWlsIGVuZAorICogb2YgdGhhdCBibG9jayBzbyBpdCBkb2Vzbid0IHlpZWxkIG9sZCBkYXRhIGlmIHRoZSBmaWxlIGlzIGxhdGVyIGdyb3duLgorICovCitpbnQgZXh0NF9ibG9ja190cnVuY2F0ZV9wYWdlKGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBwYWdlICpwYWdlLAorCQlzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZywgbG9mZl90IGZyb20pCit7CisJZXh0NF9mc2Jsa190IGluZGV4ID0gZnJvbSA+PiBQQUdFX0NBQ0hFX1NISUZUOworCXVuc2lnbmVkIG9mZnNldCA9IGZyb20gJiAoUEFHRV9DQUNIRV9TSVpFLTEpOworCXVuc2lnbmVkIGJsb2Nrc2l6ZSwgaWJsb2NrLCBsZW5ndGgsIHBvczsKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gbWFwcGluZy0+aG9zdDsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoOworCWludCBlcnIgPSAwOworCXZvaWQgKmthZGRyOworCisJYmxvY2tzaXplID0gaW5vZGUtPmlfc2ItPnNfYmxvY2tzaXplOworCWxlbmd0aCA9IGJsb2Nrc2l6ZSAtIChvZmZzZXQgJiAoYmxvY2tzaXplIC0gMSkpOworCWlibG9jayA9IGluZGV4IDw8IChQQUdFX0NBQ0hFX1NISUZUIC0gaW5vZGUtPmlfc2ItPnNfYmxvY2tzaXplX2JpdHMpOworCisJLyoKKwkgKiBGb3IgIm5vYmgiIG9wdGlvbiwgIHdlIGNhbiBvbmx5IHdvcmsgaWYgd2UgZG9uJ3QgbmVlZCB0bworCSAqIHJlYWQtaW4gdGhlIHBhZ2UgLSBvdGhlcndpc2Ugd2UgY3JlYXRlIGJ1ZmZlcnMgdG8gZG8gdGhlIElPLgorCSAqLworCWlmICghcGFnZV9oYXNfYnVmZmVycyhwYWdlKSAmJiB0ZXN0X29wdChpbm9kZS0+aV9zYiwgTk9CSCkgJiYKKwkgICAgIGV4dDRfc2hvdWxkX3dyaXRlYmFja19kYXRhKGlub2RlKSAmJiBQYWdlVXB0b2RhdGUocGFnZSkpIHsKKwkJa2FkZHIgPSBrbWFwX2F0b21pYyhwYWdlLCBLTV9VU0VSMCk7CisJCW1lbXNldChrYWRkciArIG9mZnNldCwgMCwgbGVuZ3RoKTsKKwkJZmx1c2hfZGNhY2hlX3BhZ2UocGFnZSk7CisJCWt1bm1hcF9hdG9taWMoa2FkZHIsIEtNX1VTRVIwKTsKKwkJc2V0X3BhZ2VfZGlydHkocGFnZSk7CisJCWdvdG8gdW5sb2NrOworCX0KKworCWlmICghcGFnZV9oYXNfYnVmZmVycyhwYWdlKSkKKwkJY3JlYXRlX2VtcHR5X2J1ZmZlcnMocGFnZSwgYmxvY2tzaXplLCAwKTsKKworCS8qIEZpbmQgdGhlIGJ1ZmZlciB0aGF0IGNvbnRhaW5zICJvZmZzZXQiICovCisJYmggPSBwYWdlX2J1ZmZlcnMocGFnZSk7CisJcG9zID0gYmxvY2tzaXplOworCXdoaWxlIChvZmZzZXQgPj0gcG9zKSB7CisJCWJoID0gYmgtPmJfdGhpc19wYWdlOworCQlpYmxvY2srKzsKKwkJcG9zICs9IGJsb2Nrc2l6ZTsKKwl9CisKKwllcnIgPSAwOworCWlmIChidWZmZXJfZnJlZWQoYmgpKSB7CisJCUJVRkZFUl9UUkFDRShiaCwgImZyZWVkOiBza2lwIik7CisJCWdvdG8gdW5sb2NrOworCX0KKworCWlmICghYnVmZmVyX21hcHBlZChiaCkpIHsKKwkJQlVGRkVSX1RSQUNFKGJoLCAidW5tYXBwZWQiKTsKKwkJZXh0NF9nZXRfYmxvY2soaW5vZGUsIGlibG9jaywgYmgsIDApOworCQkvKiB1bm1hcHBlZD8gSXQncyBhIGhvbGUgLSBub3RoaW5nIHRvIGRvICovCisJCWlmICghYnVmZmVyX21hcHBlZChiaCkpIHsKKwkJCUJVRkZFUl9UUkFDRShiaCwgInN0aWxsIHVubWFwcGVkIik7CisJCQlnb3RvIHVubG9jazsKKwkJfQorCX0KKworCS8qIE9rLCBpdCdzIG1hcHBlZC4gTWFrZSBzdXJlIGl0J3MgdXAtdG8tZGF0ZSAqLworCWlmIChQYWdlVXB0b2RhdGUocGFnZSkpCisJCXNldF9idWZmZXJfdXB0b2RhdGUoYmgpOworCisJaWYgKCFidWZmZXJfdXB0b2RhdGUoYmgpKSB7CisJCWVyciA9IC1FSU87CisJCWxsX3J3X2Jsb2NrKFJFQUQsIDEsICZiaCk7CisJCXdhaXRfb25fYnVmZmVyKGJoKTsKKwkJLyogVWhodWguIFJlYWQgZXJyb3IuIENvbXBsYWluIGFuZCBwdW50LiAqLworCQlpZiAoIWJ1ZmZlcl91cHRvZGF0ZShiaCkpCisJCQlnb3RvIHVubG9jazsKKwl9CisKKwlpZiAoZXh0NF9zaG91bGRfam91cm5hbF9kYXRhKGlub2RlKSkgeworCQlCVUZGRVJfVFJBQ0UoYmgsICJnZXQgd3JpdGUgYWNjZXNzIik7CisJCWVyciA9IGV4dDRfam91cm5hbF9nZXRfd3JpdGVfYWNjZXNzKGhhbmRsZSwgYmgpOworCQlpZiAoZXJyKQorCQkJZ290byB1bmxvY2s7CisJfQorCisJa2FkZHIgPSBrbWFwX2F0b21pYyhwYWdlLCBLTV9VU0VSMCk7CisJbWVtc2V0KGthZGRyICsgb2Zmc2V0LCAwLCBsZW5ndGgpOworCWZsdXNoX2RjYWNoZV9wYWdlKHBhZ2UpOworCWt1bm1hcF9hdG9taWMoa2FkZHIsIEtNX1VTRVIwKTsKKworCUJVRkZFUl9UUkFDRShiaCwgInplcm9lZCBlbmQgb2YgYmxvY2siKTsKKworCWVyciA9IDA7CisJaWYgKGV4dDRfc2hvdWxkX2pvdXJuYWxfZGF0YShpbm9kZSkpIHsKKwkJZXJyID0gZXh0NF9qb3VybmFsX2RpcnR5X21ldGFkYXRhKGhhbmRsZSwgYmgpOworCX0gZWxzZSB7CisJCWlmIChleHQ0X3Nob3VsZF9vcmRlcl9kYXRhKGlub2RlKSkKKwkJCWVyciA9IGV4dDRfam91cm5hbF9kaXJ0eV9kYXRhKGhhbmRsZSwgYmgpOworCQltYXJrX2J1ZmZlcl9kaXJ0eShiaCk7CisJfQorCit1bmxvY2s6CisJdW5sb2NrX3BhZ2UocGFnZSk7CisJcGFnZV9jYWNoZV9yZWxlYXNlKHBhZ2UpOworCXJldHVybiBlcnI7Cit9CisKKy8qCisgKiBQcm9iYWJseSBpdCBzaG91bGQgYmUgYSBsaWJyYXJ5IGZ1bmN0aW9uLi4uIHNlYXJjaCBmb3IgZmlyc3Qgbm9uLXplcm8gd29yZAorICogb3IgbWVtY21wIHdpdGggemVyb19wYWdlLCB3aGF0ZXZlciBpcyBiZXR0ZXIgZm9yIHBhcnRpY3VsYXIgYXJjaGl0ZWN0dXJlLgorICogTGludXM/CisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IGFsbF96ZXJvZXMoX19sZTMyICpwLCBfX2xlMzIgKnEpCit7CisJd2hpbGUgKHAgPCBxKQorCQlpZiAoKnArKykKKwkJCXJldHVybiAwOworCXJldHVybiAxOworfQorCisvKioKKyAqCWV4dDRfZmluZF9zaGFyZWQgLSBmaW5kIHRoZSBpbmRpcmVjdCBibG9ja3MgZm9yIHBhcnRpYWwgdHJ1bmNhdGlvbi4KKyAqCUBpbm9kZToJICBpbm9kZSBpbiBxdWVzdGlvbgorICoJQGRlcHRoOgkgIGRlcHRoIG9mIHRoZSBhZmZlY3RlZCBicmFuY2gKKyAqCUBvZmZzZXRzOiBvZmZzZXRzIG9mIHBvaW50ZXJzIGluIHRoYXQgYnJhbmNoIChzZWUgZXh0NF9ibG9ja190b19wYXRoKQorICoJQGNoYWluOgkgIHBsYWNlIHRvIHN0b3JlIHRoZSBwb2ludGVycyB0byBwYXJ0aWFsIGluZGlyZWN0IGJsb2NrcworICoJQHRvcDoJICBwbGFjZSB0byB0aGUgKGRldGFjaGVkKSB0b3Agb2YgYnJhbmNoCisgKgorICoJVGhpcyBpcyBhIGhlbHBlciBmdW5jdGlvbiB1c2VkIGJ5IGV4dDRfdHJ1bmNhdGUoKS4KKyAqCisgKglXaGVuIHdlIGRvIHRydW5jYXRlKCkgd2UgbWF5IGhhdmUgdG8gY2xlYW4gdGhlIGVuZHMgb2Ygc2V2ZXJhbAorICoJaW5kaXJlY3QgYmxvY2tzIGJ1dCBsZWF2ZSB0aGUgYmxvY2tzIHRoZW1zZWx2ZXMgYWxpdmUuIEJsb2NrIGlzCisgKglwYXJ0aWFsbHkgdHJ1bmNhdGVkIGlmIHNvbWUgZGF0YSBiZWxvdyB0aGUgbmV3IGlfc2l6ZSBpcyByZWZlcmVkCisgKglmcm9tIGl0IChhbmQgaXQgaXMgb24gdGhlIHBhdGggdG8gdGhlIGZpcnN0IGNvbXBsZXRlbHkgdHJ1bmNhdGVkCisgKglkYXRhIGJsb2NrLCBpbmRlZWQpLiAgV2UgaGF2ZSB0byBmcmVlIHRoZSB0b3Agb2YgdGhhdCBwYXRoIGFsb25nCisgKgl3aXRoIGV2ZXJ5dGhpbmcgdG8gdGhlIHJpZ2h0IG9mIHRoZSBwYXRoLiBTaW5jZSBubyBhbGxvY2F0aW9uCisgKglwYXN0IHRoZSB0cnVuY2F0aW9uIHBvaW50IGlzIHBvc3NpYmxlIHVudGlsIGV4dDRfdHJ1bmNhdGUoKQorICoJZmluaXNoZXMsIHdlIG1heSBzYWZlbHkgZG8gdGhlIGxhdHRlciwgYnV0IHRvcCBvZiBicmFuY2ggbWF5CisgKglyZXF1aXJlIHNwZWNpYWwgYXR0ZW50aW9uIC0gcGFnZW91dCBiZWxvdyB0aGUgdHJ1bmNhdGlvbiBwb2ludAorICoJbWlnaHQgdHJ5IHRvIHBvcHVsYXRlIGl0LgorICoKKyAqCVdlIGF0b21pY2FsbHkgZGV0YWNoIHRoZSB0b3Agb2YgYnJhbmNoIGZyb20gdGhlIHRyZWUsIHN0b3JlIHRoZQorICoJYmxvY2sgbnVtYmVyIG9mIGl0cyByb290IGluICpAdG9wLCBwb2ludGVycyB0byBidWZmZXJfaGVhZHMgb2YKKyAqCXBhcnRpYWxseSB0cnVuY2F0ZWQgYmxvY2tzIC0gaW4gQGNoYWluW10uYmggYW5kIHBvaW50ZXJzIHRvCisgKgl0aGVpciBsYXN0IGVsZW1lbnRzIHRoYXQgc2hvdWxkIG5vdCBiZSByZW1vdmVkIC0gaW4KKyAqCUBjaGFpbltdLnAuIFJldHVybiB2YWx1ZSBpcyB0aGUgcG9pbnRlciB0byBsYXN0IGZpbGxlZCBlbGVtZW50CisgKglvZiBAY2hhaW4uCisgKgorICoJVGhlIHdvcmsgbGVmdCB0byBjYWxsZXIgdG8gZG8gdGhlIGFjdHVhbCBmcmVlaW5nIG9mIHN1YnRyZWVzOgorICoJCWEpIGZyZWUgdGhlIHN1YnRyZWUgc3RhcnRpbmcgZnJvbSAqQHRvcAorICoJCWIpIGZyZWUgdGhlIHN1YnRyZWVzIHdob3NlIHJvb3RzIGFyZSBzdG9yZWQgaW4KKyAqCQkJKEBjaGFpbltpXS5wKzEgLi4gZW5kIG9mIEBjaGFpbltpXS5iaC0+Yl9kYXRhKQorICoJCWMpIGZyZWUgdGhlIHN1YnRyZWVzIGdyb3dpbmcgZnJvbSB0aGUgaW5vZGUgcGFzdCB0aGUgQGNoYWluWzBdLgorICoJCQkobm8gcGFydGlhbGx5IHRydW5jYXRlZCBzdHVmZiB0aGVyZSkuICAqLworCitzdGF0aWMgSW5kaXJlY3QgKmV4dDRfZmluZF9zaGFyZWQoc3RydWN0IGlub2RlICppbm9kZSwgaW50IGRlcHRoLAorCQkJaW50IG9mZnNldHNbNF0sIEluZGlyZWN0IGNoYWluWzRdLCBfX2xlMzIgKnRvcCkKK3sKKwlJbmRpcmVjdCAqcGFydGlhbCwgKnA7CisJaW50IGssIGVycjsKKworCSp0b3AgPSAwOworCS8qIE1ha2UgayBpbmRleCB0aGUgZGVlcGVzdCBub24tbnVsbCBvZmZlc3QgKyAxICovCisJZm9yIChrID0gZGVwdGg7IGsgPiAxICYmICFvZmZzZXRzW2stMV07IGstLSkKKwkJOworCXBhcnRpYWwgPSBleHQ0X2dldF9icmFuY2goaW5vZGUsIGssIG9mZnNldHMsIGNoYWluLCAmZXJyKTsKKwkvKiBXcml0ZXI6IHBvaW50ZXJzICovCisJaWYgKCFwYXJ0aWFsKQorCQlwYXJ0aWFsID0gY2hhaW4gKyBrLTE7CisJLyoKKwkgKiBJZiB0aGUgYnJhbmNoIGFjcXVpcmVkIGNvbnRpbnVhdGlvbiBzaW5jZSB3ZSd2ZSBsb29rZWQgYXQgaXQgLQorCSAqIGZpbmUsIGl0IHNob3VsZCBhbGwgc3Vydml2ZSBhbmQgKG5ldykgdG9wIGRvZXNuJ3QgYmVsb25nIHRvIHVzLgorCSAqLworCWlmICghcGFydGlhbC0+a2V5ICYmICpwYXJ0aWFsLT5wKQorCQkvKiBXcml0ZXI6IGVuZCAqLworCQlnb3RvIG5vX3RvcDsKKwlmb3IgKHA9cGFydGlhbDsgcD5jaGFpbiAmJiBhbGxfemVyb2VzKChfX2xlMzIqKXAtPmJoLT5iX2RhdGEscC0+cCk7IHAtLSkKKwkJOworCS8qCisJICogT0ssIHdlJ3ZlIGZvdW5kIHRoZSBsYXN0IGJsb2NrIHRoYXQgbXVzdCBzdXJ2aXZlLiBUaGUgcmVzdCBvZiBvdXIKKwkgKiBicmFuY2ggc2hvdWxkIGJlIGRldGFjaGVkIGJlZm9yZSB1bmxvY2tpbmcuIEhvd2V2ZXIsIGlmIHRoYXQgcmVzdAorCSAqIG9mIGJyYW5jaCBpcyBhbGwgb3VycyBhbmQgZG9lcyBub3QgZ3JvdyBpbW1lZGlhdGVseSBmcm9tIHRoZSBpbm9kZQorCSAqIGl0J3MgZWFzaWVyIHRvIGNoZWF0IGFuZCBqdXN0IGRlY3JlbWVudCBwYXJ0aWFsLT5wLgorCSAqLworCWlmIChwID09IGNoYWluICsgayAtIDEgJiYgcCA+IGNoYWluKSB7CisJCXAtPnAtLTsKKwl9IGVsc2UgeworCQkqdG9wID0gKnAtPnA7CisJCS8qIE5vcGUsIGRvbid0IGRvIHRoaXMgaW4gZXh0NC4gIE11c3QgbGVhdmUgdGhlIHRyZWUgaW50YWN0ICovCisjaWYgMAorCQkqcC0+cCA9IDA7CisjZW5kaWYKKwl9CisJLyogV3JpdGVyOiBlbmQgKi8KKworCXdoaWxlKHBhcnRpYWwgPiBwKSB7CisJCWJyZWxzZShwYXJ0aWFsLT5iaCk7CisJCXBhcnRpYWwtLTsKKwl9Citub190b3A6CisJcmV0dXJuIHBhcnRpYWw7Cit9CisKKy8qCisgKiBaZXJvIGEgbnVtYmVyIG9mIGJsb2NrIHBvaW50ZXJzIGluIGVpdGhlciBhbiBpbm9kZSBvciBhbiBpbmRpcmVjdCBibG9jay4KKyAqIElmIHdlIHJlc3RhcnQgdGhlIHRyYW5zYWN0aW9uIHdlIG11c3QgYWdhaW4gZ2V0IHdyaXRlIGFjY2VzcyB0byB0aGUKKyAqIGluZGlyZWN0IGJsb2NrIGZvciBmdXJ0aGVyIG1vZGlmaWNhdGlvbi4KKyAqCisgKiBXZSByZWxlYXNlIGBjb3VudCcgYmxvY2tzIG9uIGRpc2ssIGJ1dCAobGFzdCAtIGZpcnN0KSBtYXkgYmUgZ3JlYXRlcgorICogdGhhbiBgY291bnQnIGJlY2F1c2UgdGhlcmUgY2FuIGJlIGhvbGVzIGluIHRoZXJlLgorICovCitzdGF0aWMgdm9pZCBleHQ0X2NsZWFyX2Jsb2NrcyhoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3QgaW5vZGUgKmlub2RlLAorCQlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoLCBleHQ0X2ZzYmxrX3QgYmxvY2tfdG9fZnJlZSwKKwkJdW5zaWduZWQgbG9uZyBjb3VudCwgX19sZTMyICpmaXJzdCwgX19sZTMyICpsYXN0KQoreworCV9fbGUzMiAqcDsKKwlpZiAodHJ5X3RvX2V4dGVuZF90cmFuc2FjdGlvbihoYW5kbGUsIGlub2RlKSkgeworCQlpZiAoYmgpIHsKKwkJCUJVRkZFUl9UUkFDRShiaCwgImNhbGwgZXh0NF9qb3VybmFsX2RpcnR5X21ldGFkYXRhIik7CisJCQlleHQ0X2pvdXJuYWxfZGlydHlfbWV0YWRhdGEoaGFuZGxlLCBiaCk7CisJCX0KKwkJZXh0NF9tYXJrX2lub2RlX2RpcnR5KGhhbmRsZSwgaW5vZGUpOworCQlleHQ0X2pvdXJuYWxfdGVzdF9yZXN0YXJ0KGhhbmRsZSwgaW5vZGUpOworCQlpZiAoYmgpIHsKKwkJCUJVRkZFUl9UUkFDRShiaCwgInJldGFraW5nIHdyaXRlIGFjY2VzcyIpOworCQkJZXh0NF9qb3VybmFsX2dldF93cml0ZV9hY2Nlc3MoaGFuZGxlLCBiaCk7CisJCX0KKwl9CisKKwkvKgorCSAqIEFueSBidWZmZXJzIHdoaWNoIGFyZSBvbiB0aGUgam91cm5hbCB3aWxsIGJlIGluIG1lbW9yeS4gV2UgZmluZAorCSAqIHRoZW0gb24gdGhlIGhhc2ggdGFibGUgc28gamJkMl9qb3VybmFsX3Jldm9rZSgpIHdpbGwgcnVuIGpiZDJfam91cm5hbF9mb3JnZXQoKQorCSAqIG9uIHRoZW0uICBXZSd2ZSBhbHJlYWR5IGRldGFjaGVkIGVhY2ggYmxvY2sgZnJvbSB0aGUgZmlsZSwgc28KKwkgKiBiZm9yZ2V0KCkgaW4gamJkMl9qb3VybmFsX2ZvcmdldCgpIHNob3VsZCBiZSBzYWZlLgorCSAqCisJICogQUtQTTogdHVybiBvbiBiZm9yZ2V0IGluIGpiZDJfam91cm5hbF9mb3JnZXQoKSEhIQorCSAqLworCWZvciAocCA9IGZpcnN0OyBwIDwgbGFzdDsgcCsrKSB7CisJCXUzMiBuciA9IGxlMzJfdG9fY3B1KCpwKTsKKwkJaWYgKG5yKSB7CisJCQlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoOworCisJCQkqcCA9IDA7CisJCQliaCA9IHNiX2ZpbmRfZ2V0X2Jsb2NrKGlub2RlLT5pX3NiLCBucik7CisJCQlleHQ0X2ZvcmdldChoYW5kbGUsIDAsIGlub2RlLCBiaCwgbnIpOworCQl9CisJfQorCisJZXh0NF9mcmVlX2Jsb2NrcyhoYW5kbGUsIGlub2RlLCBibG9ja190b19mcmVlLCBjb3VudCk7Cit9CisKKy8qKgorICogZXh0NF9mcmVlX2RhdGEgLSBmcmVlIGEgbGlzdCBvZiBkYXRhIGJsb2NrcworICogQGhhbmRsZToJaGFuZGxlIGZvciB0aGlzIHRyYW5zYWN0aW9uCisgKiBAaW5vZGU6CWlub2RlIHdlIGFyZSBkZWFsaW5nIHdpdGgKKyAqIEB0aGlzX2JoOglpbmRpcmVjdCBidWZmZXJfaGVhZCB3aGljaCBjb250YWlucyAqQGZpcnN0IGFuZCAqQGxhc3QKKyAqIEBmaXJzdDoJYXJyYXkgb2YgYmxvY2sgbnVtYmVycworICogQGxhc3Q6CXBvaW50cyBpbW1lZGlhdGVseSBwYXN0IHRoZSBlbmQgb2YgYXJyYXkKKyAqCisgKiBXZSBhcmUgZnJlZWluZyBhbGwgYmxvY2tzIHJlZmVyZWQgZnJvbSB0aGF0IGFycmF5IChudW1iZXJzIGFyZSBzdG9yZWQgYXMKKyAqIGxpdHRsZS1lbmRpYW4gMzItYml0KSBhbmQgdXBkYXRpbmcgQGlub2RlLT5pX2Jsb2NrcyBhcHByb3ByaWF0ZWx5LgorICoKKyAqIFdlIGFjY3VtdWxhdGUgY29udGlndW91cyBydW5zIG9mIGJsb2NrcyB0byBmcmVlLiAgQ29udmVuaWVudGx5LCBpZiB0aGVzZQorICogYmxvY2tzIGFyZSBjb250aWd1b3VzIHRoZW4gcmVsZWFzaW5nIHRoZW0gYXQgb25lIHRpbWUgd2lsbCBvbmx5IGFmZmVjdCBvbmUKKyAqIG9yIHR3byBiaXRtYXAgYmxvY2tzICgrIGdyb3VwIGRlc2NyaXB0b3IocykgYW5kIHN1cGVyYmxvY2spIGFuZCB3ZSB3b24ndAorICogYWN0dWFsbHkgdXNlIGEgbG90IG9mIGpvdXJuYWwgc3BhY2UuCisgKgorICogQHRoaXNfYmggd2lsbCBiZSAlTlVMTCBpZiBAZmlyc3QgYW5kIEBsYXN0IHBvaW50IGludG8gdGhlIGlub2RlJ3MgZGlyZWN0CisgKiBibG9jayBwb2ludGVycy4KKyAqLworc3RhdGljIHZvaWQgZXh0NF9mcmVlX2RhdGEoaGFuZGxlX3QgKmhhbmRsZSwgc3RydWN0IGlub2RlICppbm9kZSwKKwkJCSAgIHN0cnVjdCBidWZmZXJfaGVhZCAqdGhpc19iaCwKKwkJCSAgIF9fbGUzMiAqZmlyc3QsIF9fbGUzMiAqbGFzdCkKK3sKKwlleHQ0X2ZzYmxrX3QgYmxvY2tfdG9fZnJlZSA9IDA7ICAgIC8qIFN0YXJ0aW5nIGJsb2NrICMgb2YgYSBydW4gKi8KKwl1bnNpZ25lZCBsb25nIGNvdW50ID0gMDsJICAgIC8qIE51bWJlciBvZiBibG9ja3MgaW4gdGhlIHJ1biAqLworCV9fbGUzMiAqYmxvY2tfdG9fZnJlZV9wID0gTlVMTDsJICAgIC8qIFBvaW50ZXIgaW50byBpbm9kZS9pbmQKKwkJCQkJICAgICAgIGNvcnJlc3BvbmRpbmcgdG8KKwkJCQkJICAgICAgIGJsb2NrX3RvX2ZyZWUgKi8KKwlleHQ0X2ZzYmxrX3QgbnI7CQkgICAgLyogQ3VycmVudCBibG9jayAjICovCisJX19sZTMyICpwOwkJCSAgICAvKiBQb2ludGVyIGludG8gaW5vZGUvaW5kCisJCQkJCSAgICAgICBmb3IgY3VycmVudCBibG9jayAqLworCWludCBlcnI7CisKKwlpZiAodGhpc19iaCkgewkJCQkvKiBGb3IgaW5kaXJlY3QgYmxvY2sgKi8KKwkJQlVGRkVSX1RSQUNFKHRoaXNfYmgsICJnZXRfd3JpdGVfYWNjZXNzIik7CisJCWVyciA9IGV4dDRfam91cm5hbF9nZXRfd3JpdGVfYWNjZXNzKGhhbmRsZSwgdGhpc19iaCk7CisJCS8qIEltcG9ydGFudDogaWYgd2UgY2FuJ3QgdXBkYXRlIHRoZSBpbmRpcmVjdCBwb2ludGVycworCQkgKiB0byB0aGUgYmxvY2tzLCB3ZSBjYW4ndCBmcmVlIHRoZW0uICovCisJCWlmIChlcnIpCisJCQlyZXR1cm47CisJfQorCisJZm9yIChwID0gZmlyc3Q7IHAgPCBsYXN0OyBwKyspIHsKKwkJbnIgPSBsZTMyX3RvX2NwdSgqcCk7CisJCWlmIChucikgeworCQkJLyogYWNjdW11bGF0ZSBibG9ja3MgdG8gZnJlZSBpZiB0aGV5J3JlIGNvbnRpZ3VvdXMgKi8KKwkJCWlmIChjb3VudCA9PSAwKSB7CisJCQkJYmxvY2tfdG9fZnJlZSA9IG5yOworCQkJCWJsb2NrX3RvX2ZyZWVfcCA9IHA7CisJCQkJY291bnQgPSAxOworCQkJfSBlbHNlIGlmIChuciA9PSBibG9ja190b19mcmVlICsgY291bnQpIHsKKwkJCQljb3VudCsrOworCQkJfSBlbHNlIHsKKwkJCQlleHQ0X2NsZWFyX2Jsb2NrcyhoYW5kbGUsIGlub2RlLCB0aGlzX2JoLAorCQkJCQkJICBibG9ja190b19mcmVlLAorCQkJCQkJICBjb3VudCwgYmxvY2tfdG9fZnJlZV9wLCBwKTsKKwkJCQlibG9ja190b19mcmVlID0gbnI7CisJCQkJYmxvY2tfdG9fZnJlZV9wID0gcDsKKwkJCQljb3VudCA9IDE7CisJCQl9CisJCX0KKwl9CisKKwlpZiAoY291bnQgPiAwKQorCQlleHQ0X2NsZWFyX2Jsb2NrcyhoYW5kbGUsIGlub2RlLCB0aGlzX2JoLCBibG9ja190b19mcmVlLAorCQkJCSAgY291bnQsIGJsb2NrX3RvX2ZyZWVfcCwgcCk7CisKKwlpZiAodGhpc19iaCkgeworCQlCVUZGRVJfVFJBQ0UodGhpc19iaCwgImNhbGwgZXh0NF9qb3VybmFsX2RpcnR5X21ldGFkYXRhIik7CisJCWV4dDRfam91cm5hbF9kaXJ0eV9tZXRhZGF0YShoYW5kbGUsIHRoaXNfYmgpOworCX0KK30KKworLyoqCisgKglleHQ0X2ZyZWVfYnJhbmNoZXMgLSBmcmVlIGFuIGFycmF5IG9mIGJyYW5jaGVzCisgKglAaGFuZGxlOiBKQkQgaGFuZGxlIGZvciB0aGlzIHRyYW5zYWN0aW9uCisgKglAaW5vZGU6CWlub2RlIHdlIGFyZSBkZWFsaW5nIHdpdGgKKyAqCUBwYXJlbnRfYmg6IHRoZSBidWZmZXJfaGVhZCB3aGljaCBjb250YWlucyAqQGZpcnN0IGFuZCAqQGxhc3QKKyAqCUBmaXJzdDoJYXJyYXkgb2YgYmxvY2sgbnVtYmVycworICoJQGxhc3Q6CXBvaW50ZXIgaW1tZWRpYXRlbHkgcGFzdCB0aGUgZW5kIG9mIGFycmF5CisgKglAZGVwdGg6CWRlcHRoIG9mIHRoZSBicmFuY2hlcyB0byBmcmVlCisgKgorICoJV2UgYXJlIGZyZWVpbmcgYWxsIGJsb2NrcyByZWZlcmVkIGZyb20gdGhlc2UgYnJhbmNoZXMgKG51bWJlcnMgYXJlCisgKglzdG9yZWQgYXMgbGl0dGxlLWVuZGlhbiAzMi1iaXQpIGFuZCB1cGRhdGluZyBAaW5vZGUtPmlfYmxvY2tzCisgKglhcHByb3ByaWF0ZWx5LgorICovCitzdGF0aWMgdm9pZCBleHQ0X2ZyZWVfYnJhbmNoZXMoaGFuZGxlX3QgKmhhbmRsZSwgc3RydWN0IGlub2RlICppbm9kZSwKKwkJCSAgICAgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKnBhcmVudF9iaCwKKwkJCSAgICAgICBfX2xlMzIgKmZpcnN0LCBfX2xlMzIgKmxhc3QsIGludCBkZXB0aCkKK3sKKwlleHQ0X2ZzYmxrX3QgbnI7CisJX19sZTMyICpwOworCisJaWYgKGlzX2hhbmRsZV9hYm9ydGVkKGhhbmRsZSkpCisJCXJldHVybjsKKworCWlmIChkZXB0aC0tKSB7CisJCXN0cnVjdCBidWZmZXJfaGVhZCAqYmg7CisJCWludCBhZGRyX3Blcl9ibG9jayA9IEVYVDRfQUREUl9QRVJfQkxPQ0soaW5vZGUtPmlfc2IpOworCQlwID0gbGFzdDsKKwkJd2hpbGUgKC0tcCA+PSBmaXJzdCkgeworCQkJbnIgPSBsZTMyX3RvX2NwdSgqcCk7CisJCQlpZiAoIW5yKQorCQkJCWNvbnRpbnVlOwkJLyogQSBob2xlICovCisKKwkJCS8qIEdvIHJlYWQgdGhlIGJ1ZmZlciBmb3IgdGhlIG5leHQgbGV2ZWwgZG93biAqLworCQkJYmggPSBzYl9icmVhZChpbm9kZS0+aV9zYiwgbnIpOworCisJCQkvKgorCQkJICogQSByZWFkIGZhaWx1cmU/IFJlcG9ydCBlcnJvciBhbmQgY2xlYXIgc2xvdAorCQkJICogKHNob3VsZCBiZSByYXJlKS4KKwkJCSAqLworCQkJaWYgKCFiaCkgeworCQkJCWV4dDRfZXJyb3IoaW5vZGUtPmlfc2IsICJleHQ0X2ZyZWVfYnJhbmNoZXMiLAorCQkJCQkgICAiUmVhZCBmYWlsdXJlLCBpbm9kZT0lbHUsIGJsb2NrPSVsbHUiLAorCQkJCQkgICBpbm9kZS0+aV9pbm8sIG5yKTsKKwkJCQljb250aW51ZTsKKwkJCX0KKworCQkJLyogVGhpcyB6YXBzIHRoZSBlbnRpcmUgYmxvY2suICBCb3R0b20gdXAuICovCisJCQlCVUZGRVJfVFJBQ0UoYmgsICJmcmVlIGNoaWxkIGJyYW5jaGVzIik7CisJCQlleHQ0X2ZyZWVfYnJhbmNoZXMoaGFuZGxlLCBpbm9kZSwgYmgsCisJCQkJCSAgIChfX2xlMzIqKWJoLT5iX2RhdGEsCisJCQkJCSAgIChfX2xlMzIqKWJoLT5iX2RhdGEgKyBhZGRyX3Blcl9ibG9jaywKKwkJCQkJICAgZGVwdGgpOworCisJCQkvKgorCQkJICogV2UndmUgcHJvYmFibHkgam91cm5hbGxlZCB0aGUgaW5kaXJlY3QgYmxvY2sgc2V2ZXJhbAorCQkJICogdGltZXMgZHVyaW5nIHRoZSB0cnVuY2F0ZS4gIEJ1dCBpdCdzIG5vIGxvbmdlcgorCQkJICogbmVlZGVkIGFuZCB3ZSBub3cgZHJvcCBpdCBmcm9tIHRoZSB0cmFuc2FjdGlvbiB2aWEKKwkJCSAqIGpiZDJfam91cm5hbF9yZXZva2UoKS4KKwkJCSAqCisJCQkgKiBUaGF0J3MgZWFzeSBpZiBpdCdzIGV4Y2x1c2l2ZWx5IHBhcnQgb2YgdGhpcworCQkJICogdHJhbnNhY3Rpb24uICBCdXQgaWYgaXQncyBwYXJ0IG9mIHRoZSBjb21taXR0aW5nCisJCQkgKiB0cmFuc2FjdGlvbiB0aGVuIGpiZDJfam91cm5hbF9mb3JnZXQoKSB3aWxsIHNpbXBseQorCQkJICogYnJlbHNlKCkgaXQuICBUaGF0IG1lYW5zIHRoYXQgaWYgdGhlIHVuZGVybHlpbmcKKwkJCSAqIGJsb2NrIGlzIHJlYWxsb2NhdGVkIGluIGV4dDRfZ2V0X2Jsb2NrKCksCisJCQkgKiB1bm1hcF91bmRlcmx5aW5nX21ldGFkYXRhKCkgd2lsbCBmaW5kIHRoaXMgYmxvY2sKKwkJCSAqIGFuZCB3aWxsIHRyeSB0byBnZXQgcmlkIG9mIGl0LiAgZGFtbiwgZGFtbi4KKwkJCSAqCisJCQkgKiBJZiB0aGlzIGJsb2NrIGhhcyBhbHJlYWR5IGJlZW4gY29tbWl0dGVkIHRvIHRoZQorCQkJICogam91cm5hbCwgYSByZXZva2UgcmVjb3JkIHdpbGwgYmUgd3JpdHRlbi4gIEFuZAorCQkJICogcmV2b2tlIHJlY29yZHMgbXVzdCBiZSBlbWl0dGVkICpiZWZvcmUqIGNsZWFyaW5nCisJCQkgKiB0aGlzIGJsb2NrJ3MgYml0IGluIHRoZSBiaXRtYXBzLgorCQkJICovCisJCQlleHQ0X2ZvcmdldChoYW5kbGUsIDEsIGlub2RlLCBiaCwgYmgtPmJfYmxvY2tucik7CisKKwkJCS8qCisJCQkgKiBFdmVyeXRoaW5nIGJlbG93IHRoaXMgdGhpcyBwb2ludGVyIGhhcyBiZWVuCisJCQkgKiByZWxlYXNlZC4gIE5vdyBsZXQgdGhpcyB0b3Atb2Ytc3VidHJlZSBnby4KKwkJCSAqCisJCQkgKiBXZSB3YW50IHRoZSBmcmVlaW5nIG9mIHRoaXMgaW5kaXJlY3QgYmxvY2sgdG8gYmUKKwkJCSAqIGF0b21pYyBpbiB0aGUgam91cm5hbCB3aXRoIHRoZSB1cGRhdGluZyBvZiB0aGUKKwkJCSAqIGJpdG1hcCBibG9jayB3aGljaCBvd25zIGl0LiAgU28gbWFrZSBzb21lIHJvb20gaW4KKwkJCSAqIHRoZSBqb3VybmFsLgorCQkJICoKKwkJCSAqIFdlIHplcm8gdGhlIHBhcmVudCBwb2ludGVyICphZnRlciogZnJlZWluZyBpdHMKKwkJCSAqIHBvaW50ZWUgaW4gdGhlIGJpdG1hcHMsIHNvIGlmIGV4dGVuZF90cmFuc2FjdGlvbigpCisJCQkgKiBmb3Igc29tZSByZWFzb24gZmFpbHMgdG8gcHV0IHRoZSBiaXRtYXAgY2hhbmdlcyBhbmQKKwkJCSAqIHRoZSByZWxlYXNlIGludG8gdGhlIHNhbWUgdHJhbnNhY3Rpb24sIHJlY292ZXJ5CisJCQkgKiB3aWxsIG1lcmVseSBjb21wbGFpbiBhYm91dCByZWxlYXNpbmcgYSBmcmVlIGJsb2NrLAorCQkJICogcmF0aGVyIHRoYW4gbGVha2luZyBibG9ja3MuCisJCQkgKi8KKwkJCWlmIChpc19oYW5kbGVfYWJvcnRlZChoYW5kbGUpKQorCQkJCXJldHVybjsKKwkJCWlmICh0cnlfdG9fZXh0ZW5kX3RyYW5zYWN0aW9uKGhhbmRsZSwgaW5vZGUpKSB7CisJCQkJZXh0NF9tYXJrX2lub2RlX2RpcnR5KGhhbmRsZSwgaW5vZGUpOworCQkJCWV4dDRfam91cm5hbF90ZXN0X3Jlc3RhcnQoaGFuZGxlLCBpbm9kZSk7CisJCQl9CisKKwkJCWV4dDRfZnJlZV9ibG9ja3MoaGFuZGxlLCBpbm9kZSwgbnIsIDEpOworCisJCQlpZiAocGFyZW50X2JoKSB7CisJCQkJLyoKKwkJCQkgKiBUaGUgYmxvY2sgd2hpY2ggd2UgaGF2ZSBqdXN0IGZyZWVkIGlzCisJCQkJICogcG9pbnRlZCB0byBieSBhbiBpbmRpcmVjdCBibG9jazogam91cm5hbCBpdAorCQkJCSAqLworCQkJCUJVRkZFUl9UUkFDRShwYXJlbnRfYmgsICJnZXRfd3JpdGVfYWNjZXNzIik7CisJCQkJaWYgKCFleHQ0X2pvdXJuYWxfZ2V0X3dyaXRlX2FjY2VzcyhoYW5kbGUsCisJCQkJCQkJCSAgIHBhcmVudF9iaCkpeworCQkJCQkqcCA9IDA7CisJCQkJCUJVRkZFUl9UUkFDRShwYXJlbnRfYmgsCisJCQkJCSJjYWxsIGV4dDRfam91cm5hbF9kaXJ0eV9tZXRhZGF0YSIpOworCQkJCQlleHQ0X2pvdXJuYWxfZGlydHlfbWV0YWRhdGEoaGFuZGxlLAorCQkJCQkJCQkgICAgcGFyZW50X2JoKTsKKwkJCQl9CisJCQl9CisJCX0KKwl9IGVsc2UgeworCQkvKiBXZSBoYXZlIHJlYWNoZWQgdGhlIGJvdHRvbSBvZiB0aGUgdHJlZS4gKi8KKwkJQlVGRkVSX1RSQUNFKHBhcmVudF9iaCwgImZyZWUgZGF0YSBibG9ja3MiKTsKKwkJZXh0NF9mcmVlX2RhdGEoaGFuZGxlLCBpbm9kZSwgcGFyZW50X2JoLCBmaXJzdCwgbGFzdCk7CisJfQorfQorCisvKgorICogZXh0NF90cnVuY2F0ZSgpCisgKgorICogV2UgYmxvY2sgb3V0IGV4dDRfZ2V0X2Jsb2NrKCkgYmxvY2sgaW5zdGFudGlhdGlvbnMgYWNyb3NzIHRoZSBlbnRpcmUKKyAqIHRyYW5zYWN0aW9uLCBhbmQgVkZTL1ZNIGVuc3VyZXMgdGhhdCBleHQ0X3RydW5jYXRlKCkgY2Fubm90IHJ1bgorICogc2ltdWx0YW5lb3VzbHkgb24gYmVoYWxmIG9mIHRoZSBzYW1lIGlub2RlLgorICoKKyAqIEFzIHdlIHdvcmsgdGhyb3VnaCB0aGUgdHJ1bmNhdGUgYW5kIGNvbW1taXQgYml0cyBvZiBpdCB0byB0aGUgam91cm5hbCB0aGVyZQorICogaXMgb25lIGNvcmUsIGd1aWRpbmcgcHJpbmNpcGxlOiB0aGUgZmlsZSdzIHRyZWUgbXVzdCBhbHdheXMgYmUgY29uc2lzdGVudCBvbgorICogZGlzay4gIFdlIG11c3QgYmUgYWJsZSB0byByZXN0YXJ0IHRoZSB0cnVuY2F0ZSBhZnRlciBhIGNyYXNoLgorICoKKyAqIFRoZSBmaWxlJ3MgdHJlZSBtYXkgYmUgdHJhbnNpZW50bHkgaW5jb25zaXN0ZW50IGluIG1lbW9yeSAoYWx0aG91Z2ggaXQKKyAqIHByb2JhYmx5IGlzbid0KSwgYnV0IHdoZW5ldmVyIHdlIGNsb3NlIG9mZiBhbmQgY29tbWl0IGEgam91cm5hbCB0cmFuc2FjdGlvbiwKKyAqIHRoZSBjb250ZW50cyBvZiAodGhlIGZpbGVzeXN0ZW0gKyB0aGUgam91cm5hbCkgbXVzdCBiZSBjb25zaXN0ZW50IGFuZAorICogcmVzdGFydGFibGUuICBJdCdzIHByZXR0eSBzaW1wbGUsIHJlYWxseTogYm90dG9tIHVwLCByaWdodCB0byBsZWZ0IChhbHRob3VnaAorICogbGVmdC10by1yaWdodCB3b3JrcyBPSyB0b28pLgorICoKKyAqIE5vdGUgdGhhdCBhdCByZWNvdmVyeSB0aW1lLCBqb3VybmFsIHJlcGxheSBvY2N1cnMgKmJlZm9yZSogdGhlIHJlc3RhcnQgb2YKKyAqIHRydW5jYXRlIGFnYWluc3QgdGhlIG9ycGhhbiBpbm9kZSBsaXN0LgorICoKKyAqIFRoZSBjb21taXR0ZWQgaW5vZGUgaGFzIHRoZSBuZXcsIGRlc2lyZWQgaV9zaXplICh3aGljaCBpcyB0aGUgc2FtZSBhcworICogaV9kaXNrc2l6ZSBpbiB0aGlzIGNhc2UpLiAgQWZ0ZXIgYSBjcmFzaCwgZXh0NF9vcnBoYW5fY2xlYW51cCgpIHdpbGwgc2VlCisgKiB0aGF0IHRoaXMgaW5vZGUncyB0cnVuY2F0ZSBkaWQgbm90IGNvbXBsZXRlIGFuZCBpdCB3aWxsIGFnYWluIGNhbGwKKyAqIGV4dDRfdHJ1bmNhdGUoKSB0byBoYXZlIGFub3RoZXIgZ28uICBTbyB0aGVyZSB3aWxsIGJlIGluc3RhbnRpYXRlZCBibG9ja3MKKyAqIHRvIHRoZSByaWdodCBvZiB0aGUgdHJ1bmNhdGlvbiBwb2ludCBpbiBhIGNyYXNoZWQgZXh0NCBmaWxlc3lzdGVtLiAgQnV0CisgKiB0aGF0J3MgZmluZSAtIGFzIGxvbmcgYXMgdGhleSBhcmUgbGlua2VkIGZyb20gdGhlIGlub2RlLCB0aGUgcG9zdC1jcmFzaAorICogZXh0NF90cnVuY2F0ZSgpIHJ1biB3aWxsIGZpbmQgdGhlbSBhbmQgcmVsZWFzZSB0aGVtLgorICovCit2b2lkIGV4dDRfdHJ1bmNhdGUoc3RydWN0IGlub2RlICppbm9kZSkKK3sKKwloYW5kbGVfdCAqaGFuZGxlOworCXN0cnVjdCBleHQ0X2lub2RlX2luZm8gKmVpID0gRVhUNF9JKGlub2RlKTsKKwlfX2xlMzIgKmlfZGF0YSA9IGVpLT5pX2RhdGE7CisJaW50IGFkZHJfcGVyX2Jsb2NrID0gRVhUNF9BRERSX1BFUl9CTE9DSyhpbm9kZS0+aV9zYik7CisJc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcgPSBpbm9kZS0+aV9tYXBwaW5nOworCWludCBvZmZzZXRzWzRdOworCUluZGlyZWN0IGNoYWluWzRdOworCUluZGlyZWN0ICpwYXJ0aWFsOworCV9fbGUzMiBuciA9IDA7CisJaW50IG47CisJbG9uZyBsYXN0X2Jsb2NrOworCXVuc2lnbmVkIGJsb2Nrc2l6ZSA9IGlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZTsKKwlzdHJ1Y3QgcGFnZSAqcGFnZTsKKworCWlmICghKFNfSVNSRUcoaW5vZGUtPmlfbW9kZSkgfHwgU19JU0RJUihpbm9kZS0+aV9tb2RlKSB8fAorCSAgICBTX0lTTE5LKGlub2RlLT5pX21vZGUpKSkKKwkJcmV0dXJuOworCWlmIChleHQ0X2lub2RlX2lzX2Zhc3Rfc3ltbGluayhpbm9kZSkpCisJCXJldHVybjsKKwlpZiAoSVNfQVBQRU5EKGlub2RlKSB8fCBJU19JTU1VVEFCTEUoaW5vZGUpKQorCQlyZXR1cm47CisKKwkvKgorCSAqIFdlIGhhdmUgdG8gbG9jayB0aGUgRU9GIHBhZ2UgaGVyZSwgYmVjYXVzZSBsb2NrX3BhZ2UoKSBuZXN0cworCSAqIG91dHNpZGUgamJkMl9qb3VybmFsX3N0YXJ0KCkuCisJICovCisJaWYgKChpbm9kZS0+aV9zaXplICYgKGJsb2Nrc2l6ZSAtIDEpKSA9PSAwKSB7CisJCS8qIEJsb2NrIGJvdW5kYXJ5PyBOb3RoaW5nIHRvIGRvICovCisJCXBhZ2UgPSBOVUxMOworCX0gZWxzZSB7CisJCXBhZ2UgPSBncmFiX2NhY2hlX3BhZ2UobWFwcGluZywKKwkJCQlpbm9kZS0+aV9zaXplID4+IFBBR0VfQ0FDSEVfU0hJRlQpOworCQlpZiAoIXBhZ2UpCisJCQlyZXR1cm47CisJfQorCisJaWYgKEVYVDRfSShpbm9kZSktPmlfZmxhZ3MgJiBFWFQ0X0VYVEVOVFNfRkwpCisJCXJldHVybiBleHQ0X2V4dF90cnVuY2F0ZShpbm9kZSwgcGFnZSk7CisKKwloYW5kbGUgPSBzdGFydF90cmFuc2FjdGlvbihpbm9kZSk7CisJaWYgKElTX0VSUihoYW5kbGUpKSB7CisJCWlmIChwYWdlKSB7CisJCQljbGVhcl9oaWdocGFnZShwYWdlKTsKKwkJCWZsdXNoX2RjYWNoZV9wYWdlKHBhZ2UpOworCQkJdW5sb2NrX3BhZ2UocGFnZSk7CisJCQlwYWdlX2NhY2hlX3JlbGVhc2UocGFnZSk7CisJCX0KKwkJcmV0dXJuOwkJLyogQUtQTTogcmV0dXJuIHdoYXQ/ICovCisJfQorCisJbGFzdF9ibG9jayA9IChpbm9kZS0+aV9zaXplICsgYmxvY2tzaXplLTEpCisJCQkJCT4+IEVYVDRfQkxPQ0tfU0laRV9CSVRTKGlub2RlLT5pX3NiKTsKKworCWlmIChwYWdlKQorCQlleHQ0X2Jsb2NrX3RydW5jYXRlX3BhZ2UoaGFuZGxlLCBwYWdlLCBtYXBwaW5nLCBpbm9kZS0+aV9zaXplKTsKKworCW4gPSBleHQ0X2Jsb2NrX3RvX3BhdGgoaW5vZGUsIGxhc3RfYmxvY2ssIG9mZnNldHMsIE5VTEwpOworCWlmIChuID09IDApCisJCWdvdG8gb3V0X3N0b3A7CS8qIGVycm9yICovCisKKwkvKgorCSAqIE9LLiAgVGhpcyB0cnVuY2F0ZSBpcyBnb2luZyB0byBoYXBwZW4uICBXZSBhZGQgdGhlIGlub2RlIHRvIHRoZQorCSAqIG9ycGhhbiBsaXN0LCBzbyB0aGF0IGlmIHRoaXMgdHJ1bmNhdGUgc3BhbnMgbXVsdGlwbGUgdHJhbnNhY3Rpb25zLAorCSAqIGFuZCB3ZSBjcmFzaCwgd2Ugd2lsbCByZXN1bWUgdGhlIHRydW5jYXRlIHdoZW4gdGhlIGZpbGVzeXN0ZW0KKwkgKiByZWNvdmVycy4gIEl0IGFsc28gbWFya3MgdGhlIGlub2RlIGRpcnR5LCB0byBjYXRjaCB0aGUgbmV3IHNpemUuCisJICoKKwkgKiBJbXBsaWNhdGlvbjogdGhlIGZpbGUgbXVzdCBhbHdheXMgYmUgaW4gYSBzYW5lLCBjb25zaXN0ZW50CisJICogdHJ1bmNhdGFibGUgc3RhdGUgd2hpbGUgZWFjaCB0cmFuc2FjdGlvbiBjb21taXRzLgorCSAqLworCWlmIChleHQ0X29ycGhhbl9hZGQoaGFuZGxlLCBpbm9kZSkpCisJCWdvdG8gb3V0X3N0b3A7CisKKwkvKgorCSAqIFRoZSBvcnBoYW4gbGlzdCBlbnRyeSB3aWxsIG5vdyBwcm90ZWN0IHVzIGZyb20gYW55IGNyYXNoIHdoaWNoCisJICogb2NjdXJzIGJlZm9yZSB0aGUgdHJ1bmNhdGUgY29tcGxldGVzLCBzbyBpdCBpcyBub3cgc2FmZSB0byBwcm9wYWdhdGUKKwkgKiB0aGUgbmV3LCBzaG9ydGVyIGlub2RlIHNpemUgKGhlbGQgZm9yIG5vdyBpbiBpX3NpemUpIGludG8gdGhlCisJICogb24tZGlzayBpbm9kZS4gV2UgZG8gdGhpcyB2aWEgaV9kaXNrc2l6ZSwgd2hpY2ggaXMgdGhlIHZhbHVlIHdoaWNoCisJICogZXh0NCAqcmVhbGx5KiB3cml0ZXMgb250byB0aGUgZGlzayBpbm9kZS4KKwkgKi8KKwllaS0+aV9kaXNrc2l6ZSA9IGlub2RlLT5pX3NpemU7CisKKwkvKgorCSAqIEZyb20gaGVyZSB3ZSBibG9jayBvdXQgYWxsIGV4dDRfZ2V0X2Jsb2NrKCkgY2FsbGVycyB3aG8gd2FudCB0bworCSAqIG1vZGlmeSB0aGUgYmxvY2sgYWxsb2NhdGlvbiB0cmVlLgorCSAqLworCW11dGV4X2xvY2soJmVpLT50cnVuY2F0ZV9tdXRleCk7CisKKwlpZiAobiA9PSAxKSB7CQkvKiBkaXJlY3QgYmxvY2tzICovCisJCWV4dDRfZnJlZV9kYXRhKGhhbmRsZSwgaW5vZGUsIE5VTEwsIGlfZGF0YStvZmZzZXRzWzBdLAorCQkJICAgICAgIGlfZGF0YSArIEVYVDRfTkRJUl9CTE9DS1MpOworCQlnb3RvIGRvX2luZGlyZWN0czsKKwl9CisKKwlwYXJ0aWFsID0gZXh0NF9maW5kX3NoYXJlZChpbm9kZSwgbiwgb2Zmc2V0cywgY2hhaW4sICZucik7CisJLyogS2lsbCB0aGUgdG9wIG9mIHNoYXJlZCBicmFuY2ggKG5vdCBkZXRhY2hlZCkgKi8KKwlpZiAobnIpIHsKKwkJaWYgKHBhcnRpYWwgPT0gY2hhaW4pIHsKKwkJCS8qIFNoYXJlZCBicmFuY2ggZ3Jvd3MgZnJvbSB0aGUgaW5vZGUgKi8KKwkJCWV4dDRfZnJlZV9icmFuY2hlcyhoYW5kbGUsIGlub2RlLCBOVUxMLAorCQkJCQkgICAmbnIsICZucisxLCAoY2hhaW4rbi0xKSAtIHBhcnRpYWwpOworCQkJKnBhcnRpYWwtPnAgPSAwOworCQkJLyoKKwkJCSAqIFdlIG1hcmsgdGhlIGlub2RlIGRpcnR5IHByaW9yIHRvIHJlc3RhcnQsCisJCQkgKiBhbmQgcHJpb3IgdG8gc3RvcC4gIE5vIG5lZWQgZm9yIGl0IGhlcmUuCisJCQkgKi8KKwkJfSBlbHNlIHsKKwkJCS8qIFNoYXJlZCBicmFuY2ggZ3Jvd3MgZnJvbSBhbiBpbmRpcmVjdCBibG9jayAqLworCQkJQlVGRkVSX1RSQUNFKHBhcnRpYWwtPmJoLCAiZ2V0X3dyaXRlX2FjY2VzcyIpOworCQkJZXh0NF9mcmVlX2JyYW5jaGVzKGhhbmRsZSwgaW5vZGUsIHBhcnRpYWwtPmJoLAorCQkJCQlwYXJ0aWFsLT5wLAorCQkJCQlwYXJ0aWFsLT5wKzEsIChjaGFpbituLTEpIC0gcGFydGlhbCk7CisJCX0KKwl9CisJLyogQ2xlYXIgdGhlIGVuZHMgb2YgaW5kaXJlY3QgYmxvY2tzIG9uIHRoZSBzaGFyZWQgYnJhbmNoICovCisJd2hpbGUgKHBhcnRpYWwgPiBjaGFpbikgeworCQlleHQ0X2ZyZWVfYnJhbmNoZXMoaGFuZGxlLCBpbm9kZSwgcGFydGlhbC0+YmgsIHBhcnRpYWwtPnAgKyAxLAorCQkJCSAgIChfX2xlMzIqKXBhcnRpYWwtPmJoLT5iX2RhdGErYWRkcl9wZXJfYmxvY2ssCisJCQkJICAgKGNoYWluK24tMSkgLSBwYXJ0aWFsKTsKKwkJQlVGRkVSX1RSQUNFKHBhcnRpYWwtPmJoLCAiY2FsbCBicmVsc2UiKTsKKwkJYnJlbHNlIChwYXJ0aWFsLT5iaCk7CisJCXBhcnRpYWwtLTsKKwl9Citkb19pbmRpcmVjdHM6CisJLyogS2lsbCB0aGUgcmVtYWluaW5nICh3aG9sZSkgc3VidHJlZXMgKi8KKwlzd2l0Y2ggKG9mZnNldHNbMF0pIHsKKwlkZWZhdWx0OgorCQluciA9IGlfZGF0YVtFWFQ0X0lORF9CTE9DS107CisJCWlmIChucikgeworCQkJZXh0NF9mcmVlX2JyYW5jaGVzKGhhbmRsZSwgaW5vZGUsIE5VTEwsICZuciwgJm5yKzEsIDEpOworCQkJaV9kYXRhW0VYVDRfSU5EX0JMT0NLXSA9IDA7CisJCX0KKwljYXNlIEVYVDRfSU5EX0JMT0NLOgorCQluciA9IGlfZGF0YVtFWFQ0X0RJTkRfQkxPQ0tdOworCQlpZiAobnIpIHsKKwkJCWV4dDRfZnJlZV9icmFuY2hlcyhoYW5kbGUsIGlub2RlLCBOVUxMLCAmbnIsICZucisxLCAyKTsKKwkJCWlfZGF0YVtFWFQ0X0RJTkRfQkxPQ0tdID0gMDsKKwkJfQorCWNhc2UgRVhUNF9ESU5EX0JMT0NLOgorCQluciA9IGlfZGF0YVtFWFQ0X1RJTkRfQkxPQ0tdOworCQlpZiAobnIpIHsKKwkJCWV4dDRfZnJlZV9icmFuY2hlcyhoYW5kbGUsIGlub2RlLCBOVUxMLCAmbnIsICZucisxLCAzKTsKKwkJCWlfZGF0YVtFWFQ0X1RJTkRfQkxPQ0tdID0gMDsKKwkJfQorCWNhc2UgRVhUNF9USU5EX0JMT0NLOgorCQk7CisJfQorCisJZXh0NF9kaXNjYXJkX3Jlc2VydmF0aW9uKGlub2RlKTsKKworCW11dGV4X3VubG9jaygmZWktPnRydW5jYXRlX211dGV4KTsKKwlpbm9kZS0+aV9tdGltZSA9IGlub2RlLT5pX2N0aW1lID0gQ1VSUkVOVF9USU1FX1NFQzsKKwlleHQ0X21hcmtfaW5vZGVfZGlydHkoaGFuZGxlLCBpbm9kZSk7CisKKwkvKgorCSAqIEluIGEgbXVsdGktdHJhbnNhY3Rpb24gdHJ1bmNhdGUsIHdlIG9ubHkgbWFrZSB0aGUgZmluYWwgdHJhbnNhY3Rpb24KKwkgKiBzeW5jaHJvbm91cworCSAqLworCWlmIChJU19TWU5DKGlub2RlKSkKKwkJaGFuZGxlLT5oX3N5bmMgPSAxOworb3V0X3N0b3A6CisJLyoKKwkgKiBJZiB0aGlzIHdhcyBhIHNpbXBsZSBmdHJ1bmNhdGUoKSwgYW5kIHRoZSBmaWxlIHdpbGwgcmVtYWluIGFsaXZlCisJICogdGhlbiB3ZSBuZWVkIHRvIGNsZWFyIHVwIHRoZSBvcnBoYW4gcmVjb3JkIHdoaWNoIHdlIGNyZWF0ZWQgYWJvdmUuCisJICogSG93ZXZlciwgaWYgdGhpcyB3YXMgYSByZWFsIHVubGluayB0aGVuIHdlIHdlcmUgY2FsbGVkIGJ5CisJICogZXh0NF9kZWxldGVfaW5vZGUoKSwgYW5kIHdlIGFsbG93IHRoYXQgZnVuY3Rpb24gdG8gY2xlYW4gdXAgdGhlCisJICogb3JwaGFuIGluZm8gZm9yIHVzLgorCSAqLworCWlmIChpbm9kZS0+aV9ubGluaykKKwkJZXh0NF9vcnBoYW5fZGVsKGhhbmRsZSwgaW5vZGUpOworCisJZXh0NF9qb3VybmFsX3N0b3AoaGFuZGxlKTsKK30KKworc3RhdGljIGV4dDRfZnNibGtfdCBleHQ0X2dldF9pbm9kZV9ibG9jayhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLAorCQl1bnNpZ25lZCBsb25nIGlubywgc3RydWN0IGV4dDRfaWxvYyAqaWxvYykKK3sKKwl1bnNpZ25lZCBsb25nIGRlc2MsIGdyb3VwX2Rlc2MsIGJsb2NrX2dyb3VwOworCXVuc2lnbmVkIGxvbmcgb2Zmc2V0OworCWV4dDRfZnNibGtfdCBibG9jazsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoOworCXN0cnVjdCBleHQ0X2dyb3VwX2Rlc2MgKiBnZHA7CisKKwlpZiAoIWV4dDRfdmFsaWRfaW51bShzYiwgaW5vKSkgeworCQkvKgorCQkgKiBUaGlzIGVycm9yIGlzIGFscmVhZHkgY2hlY2tlZCBmb3IgaW4gbmFtZWkuYyB1bmxlc3Mgd2UgYXJlCisJCSAqIGxvb2tpbmcgYXQgYW4gTkZTIGZpbGVoYW5kbGUsIGluIHdoaWNoIGNhc2Ugbm8gZXJyb3IKKwkJICogcmVwb3J0IGlzIG5lZWRlZAorCQkgKi8KKwkJcmV0dXJuIDA7CisJfQorCisJYmxvY2tfZ3JvdXAgPSAoaW5vIC0gMSkgLyBFWFQ0X0lOT0RFU19QRVJfR1JPVVAoc2IpOworCWlmIChibG9ja19ncm91cCA+PSBFWFQ0X1NCKHNiKS0+c19ncm91cHNfY291bnQpIHsKKwkJZXh0NF9lcnJvcihzYiwiZXh0NF9nZXRfaW5vZGVfYmxvY2siLCJncm91cCA+PSBncm91cHMgY291bnQiKTsKKwkJcmV0dXJuIDA7CisJfQorCXNtcF9ybWIoKTsKKwlncm91cF9kZXNjID0gYmxvY2tfZ3JvdXAgPj4gRVhUNF9ERVNDX1BFUl9CTE9DS19CSVRTKHNiKTsKKwlkZXNjID0gYmxvY2tfZ3JvdXAgJiAoRVhUNF9ERVNDX1BFUl9CTE9DSyhzYikgLSAxKTsKKwliaCA9IEVYVDRfU0Ioc2IpLT5zX2dyb3VwX2Rlc2NbZ3JvdXBfZGVzY107CisJaWYgKCFiaCkgeworCQlleHQ0X2Vycm9yIChzYiwgImV4dDRfZ2V0X2lub2RlX2Jsb2NrIiwKKwkJCSAgICAiRGVzY3JpcHRvciBub3QgbG9hZGVkIik7CisJCXJldHVybiAwOworCX0KKworCWdkcCA9IChzdHJ1Y3QgZXh0NF9ncm91cF9kZXNjICopKChfX3U4ICopYmgtPmJfZGF0YSArCisJCWRlc2MgKiBFWFQ0X0RFU0NfU0laRShzYikpOworCS8qCisJICogRmlndXJlIG91dCB0aGUgb2Zmc2V0IHdpdGhpbiB0aGUgYmxvY2sgZ3JvdXAgaW5vZGUgdGFibGUKKwkgKi8KKwlvZmZzZXQgPSAoKGlubyAtIDEpICUgRVhUNF9JTk9ERVNfUEVSX0dST1VQKHNiKSkgKgorCQlFWFQ0X0lOT0RFX1NJWkUoc2IpOworCWJsb2NrID0gZXh0NF9pbm9kZV90YWJsZShzYiwgZ2RwKSArCisJCShvZmZzZXQgPj4gRVhUNF9CTE9DS19TSVpFX0JJVFMoc2IpKTsKKworCWlsb2MtPmJsb2NrX2dyb3VwID0gYmxvY2tfZ3JvdXA7CisJaWxvYy0+b2Zmc2V0ID0gb2Zmc2V0ICYgKEVYVDRfQkxPQ0tfU0laRShzYikgLSAxKTsKKwlyZXR1cm4gYmxvY2s7Cit9CisKKy8qCisgKiBleHQ0X2dldF9pbm9kZV9sb2MgcmV0dXJucyB3aXRoIGFuIGV4dHJhIHJlZmNvdW50IGFnYWluc3QgdGhlIGlub2RlJ3MKKyAqIHVuZGVybHlpbmcgYnVmZmVyX2hlYWQgb24gc3VjY2Vzcy4gSWYgJ2luX21lbScgaXMgdHJ1ZSwgd2UgaGF2ZSBhbGwKKyAqIGRhdGEgaW4gbWVtb3J5IHRoYXQgaXMgbmVlZGVkIHRvIHJlY3JlYXRlIHRoZSBvbi1kaXNrIHZlcnNpb24gb2YgdGhpcworICogaW5vZGUuCisgKi8KK3N0YXRpYyBpbnQgX19leHQ0X2dldF9pbm9kZV9sb2Moc3RydWN0IGlub2RlICppbm9kZSwKKwkJCQlzdHJ1Y3QgZXh0NF9pbG9jICppbG9jLCBpbnQgaW5fbWVtKQoreworCWV4dDRfZnNibGtfdCBibG9jazsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoOworCisJYmxvY2sgPSBleHQ0X2dldF9pbm9kZV9ibG9jayhpbm9kZS0+aV9zYiwgaW5vZGUtPmlfaW5vLCBpbG9jKTsKKwlpZiAoIWJsb2NrKQorCQlyZXR1cm4gLUVJTzsKKworCWJoID0gc2JfZ2V0YmxrKGlub2RlLT5pX3NiLCBibG9jayk7CisJaWYgKCFiaCkgeworCQlleHQ0X2Vycm9yIChpbm9kZS0+aV9zYiwgImV4dDRfZ2V0X2lub2RlX2xvYyIsCisJCQkJInVuYWJsZSB0byByZWFkIGlub2RlIGJsb2NrIC0gIgorCQkJCSJpbm9kZT0lbHUsIGJsb2NrPSVsbHUiLAorCQkJCSBpbm9kZS0+aV9pbm8sIGJsb2NrKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCWlmICghYnVmZmVyX3VwdG9kYXRlKGJoKSkgeworCQlsb2NrX2J1ZmZlcihiaCk7CisJCWlmIChidWZmZXJfdXB0b2RhdGUoYmgpKSB7CisJCQkvKiBzb21lb25lIGJyb3VnaHQgaXQgdXB0b2RhdGUgd2hpbGUgd2Ugd2FpdGVkICovCisJCQl1bmxvY2tfYnVmZmVyKGJoKTsKKwkJCWdvdG8gaGFzX2J1ZmZlcjsKKwkJfQorCisJCS8qCisJCSAqIElmIHdlIGhhdmUgYWxsIGluZm9ybWF0aW9uIG9mIHRoZSBpbm9kZSBpbiBtZW1vcnkgYW5kIHRoaXMKKwkJICogaXMgdGhlIG9ubHkgdmFsaWQgaW5vZGUgaW4gdGhlIGJsb2NrLCB3ZSBuZWVkIG5vdCByZWFkIHRoZQorCQkgKiBibG9jay4KKwkJICovCisJCWlmIChpbl9tZW0pIHsKKwkJCXN0cnVjdCBidWZmZXJfaGVhZCAqYml0bWFwX2JoOworCQkJc3RydWN0IGV4dDRfZ3JvdXBfZGVzYyAqZGVzYzsKKwkJCWludCBpbm9kZXNfcGVyX2J1ZmZlcjsKKwkJCWludCBpbm9kZV9vZmZzZXQsIGk7CisJCQlpbnQgYmxvY2tfZ3JvdXA7CisJCQlpbnQgc3RhcnQ7CisKKwkJCWJsb2NrX2dyb3VwID0gKGlub2RlLT5pX2lubyAtIDEpIC8KKwkJCQkJRVhUNF9JTk9ERVNfUEVSX0dST1VQKGlub2RlLT5pX3NiKTsKKwkJCWlub2Rlc19wZXJfYnVmZmVyID0gYmgtPmJfc2l6ZSAvCisJCQkJRVhUNF9JTk9ERV9TSVpFKGlub2RlLT5pX3NiKTsKKwkJCWlub2RlX29mZnNldCA9ICgoaW5vZGUtPmlfaW5vIC0gMSkgJQorCQkJCQlFWFQ0X0lOT0RFU19QRVJfR1JPVVAoaW5vZGUtPmlfc2IpKTsKKwkJCXN0YXJ0ID0gaW5vZGVfb2Zmc2V0ICYgfihpbm9kZXNfcGVyX2J1ZmZlciAtIDEpOworCisJCQkvKiBJcyB0aGUgaW5vZGUgYml0bWFwIGluIGNhY2hlPyAqLworCQkJZGVzYyA9IGV4dDRfZ2V0X2dyb3VwX2Rlc2MoaW5vZGUtPmlfc2IsCisJCQkJCQlibG9ja19ncm91cCwgTlVMTCk7CisJCQlpZiAoIWRlc2MpCisJCQkJZ290byBtYWtlX2lvOworCisJCQliaXRtYXBfYmggPSBzYl9nZXRibGsoaW5vZGUtPmlfc2IsCisJCQkJZXh0NF9pbm9kZV9iaXRtYXAoaW5vZGUtPmlfc2IsIGRlc2MpKTsKKwkJCWlmICghYml0bWFwX2JoKQorCQkJCWdvdG8gbWFrZV9pbzsKKworCQkJLyoKKwkJCSAqIElmIHRoZSBpbm9kZSBiaXRtYXAgaXNuJ3QgaW4gY2FjaGUgdGhlbiB0aGUKKwkJCSAqIG9wdGltaXNhdGlvbiBtYXkgZW5kIHVwIHBlcmZvcm1pbmcgdHdvIHJlYWRzIGluc3RlYWQKKwkJCSAqIG9mIG9uZSwgc28gc2tpcCBpdC4KKwkJCSAqLworCQkJaWYgKCFidWZmZXJfdXB0b2RhdGUoYml0bWFwX2JoKSkgeworCQkJCWJyZWxzZShiaXRtYXBfYmgpOworCQkJCWdvdG8gbWFrZV9pbzsKKwkJCX0KKwkJCWZvciAoaSA9IHN0YXJ0OyBpIDwgc3RhcnQgKyBpbm9kZXNfcGVyX2J1ZmZlcjsgaSsrKSB7CisJCQkJaWYgKGkgPT0gaW5vZGVfb2Zmc2V0KQorCQkJCQljb250aW51ZTsKKwkJCQlpZiAoZXh0NF90ZXN0X2JpdChpLCBiaXRtYXBfYmgtPmJfZGF0YSkpCisJCQkJCWJyZWFrOworCQkJfQorCQkJYnJlbHNlKGJpdG1hcF9iaCk7CisJCQlpZiAoaSA9PSBzdGFydCArIGlub2Rlc19wZXJfYnVmZmVyKSB7CisJCQkJLyogYWxsIG90aGVyIGlub2RlcyBhcmUgZnJlZSwgc28gc2tpcCBJL08gKi8KKwkJCQltZW1zZXQoYmgtPmJfZGF0YSwgMCwgYmgtPmJfc2l6ZSk7CisJCQkJc2V0X2J1ZmZlcl91cHRvZGF0ZShiaCk7CisJCQkJdW5sb2NrX2J1ZmZlcihiaCk7CisJCQkJZ290byBoYXNfYnVmZmVyOworCQkJfQorCQl9CisKK21ha2VfaW86CisJCS8qCisJCSAqIFRoZXJlIGFyZSBvdGhlciB2YWxpZCBpbm9kZXMgaW4gdGhlIGJ1ZmZlciwgdGhpcyBpbm9kZQorCQkgKiBoYXMgaW4taW5vZGUgeGF0dHJzLCBvciB3ZSBkb24ndCBoYXZlIHRoaXMgaW5vZGUgaW4gbWVtb3J5LgorCQkgKiBSZWFkIHRoZSBibG9jayBmcm9tIGRpc2suCisJCSAqLworCQlnZXRfYmgoYmgpOworCQliaC0+Yl9lbmRfaW8gPSBlbmRfYnVmZmVyX3JlYWRfc3luYzsKKwkJc3VibWl0X2JoKFJFQURfTUVUQSwgYmgpOworCQl3YWl0X29uX2J1ZmZlcihiaCk7CisJCWlmICghYnVmZmVyX3VwdG9kYXRlKGJoKSkgeworCQkJZXh0NF9lcnJvcihpbm9kZS0+aV9zYiwgImV4dDRfZ2V0X2lub2RlX2xvYyIsCisJCQkJCSJ1bmFibGUgdG8gcmVhZCBpbm9kZSBibG9jayAtICIKKwkJCQkJImlub2RlPSVsdSwgYmxvY2s9JWxsdSIsCisJCQkJCWlub2RlLT5pX2lubywgYmxvY2spOworCQkJYnJlbHNlKGJoKTsKKwkJCXJldHVybiAtRUlPOworCQl9CisJfQoraGFzX2J1ZmZlcjoKKwlpbG9jLT5iaCA9IGJoOworCXJldHVybiAwOworfQorCitpbnQgZXh0NF9nZXRfaW5vZGVfbG9jKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBleHQ0X2lsb2MgKmlsb2MpCit7CisJLyogV2UgaGF2ZSBhbGwgaW5vZGUgZGF0YSBleGNlcHQgeGF0dHJzIGluIG1lbW9yeSBoZXJlLiAqLworCXJldHVybiBfX2V4dDRfZ2V0X2lub2RlX2xvYyhpbm9kZSwgaWxvYywKKwkJIShFWFQ0X0koaW5vZGUpLT5pX3N0YXRlICYgRVhUNF9TVEFURV9YQVRUUikpOworfQorCit2b2lkIGV4dDRfc2V0X2lub2RlX2ZsYWdzKHN0cnVjdCBpbm9kZSAqaW5vZGUpCit7CisJdW5zaWduZWQgaW50IGZsYWdzID0gRVhUNF9JKGlub2RlKS0+aV9mbGFnczsKKworCWlub2RlLT5pX2ZsYWdzICY9IH4oU19TWU5DfFNfQVBQRU5EfFNfSU1NVVRBQkxFfFNfTk9BVElNRXxTX0RJUlNZTkMpOworCWlmIChmbGFncyAmIEVYVDRfU1lOQ19GTCkKKwkJaW5vZGUtPmlfZmxhZ3MgfD0gU19TWU5DOworCWlmIChmbGFncyAmIEVYVDRfQVBQRU5EX0ZMKQorCQlpbm9kZS0+aV9mbGFncyB8PSBTX0FQUEVORDsKKwlpZiAoZmxhZ3MgJiBFWFQ0X0lNTVVUQUJMRV9GTCkKKwkJaW5vZGUtPmlfZmxhZ3MgfD0gU19JTU1VVEFCTEU7CisJaWYgKGZsYWdzICYgRVhUNF9OT0FUSU1FX0ZMKQorCQlpbm9kZS0+aV9mbGFncyB8PSBTX05PQVRJTUU7CisJaWYgKGZsYWdzICYgRVhUNF9ESVJTWU5DX0ZMKQorCQlpbm9kZS0+aV9mbGFncyB8PSBTX0RJUlNZTkM7Cit9CisKK3ZvaWQgZXh0NF9yZWFkX2lub2RlKHN0cnVjdCBpbm9kZSAqIGlub2RlKQoreworCXN0cnVjdCBleHQ0X2lsb2MgaWxvYzsKKwlzdHJ1Y3QgZXh0NF9pbm9kZSAqcmF3X2lub2RlOworCXN0cnVjdCBleHQ0X2lub2RlX2luZm8gKmVpID0gRVhUNF9JKGlub2RlKTsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoOworCWludCBibG9jazsKKworI2lmZGVmIENPTkZJR19FWFQ0REVWX0ZTX1BPU0lYX0FDTAorCWVpLT5pX2FjbCA9IEVYVDRfQUNMX05PVF9DQUNIRUQ7CisJZWktPmlfZGVmYXVsdF9hY2wgPSBFWFQ0X0FDTF9OT1RfQ0FDSEVEOworI2VuZGlmCisJZWktPmlfYmxvY2tfYWxsb2NfaW5mbyA9IE5VTEw7CisKKwlpZiAoX19leHQ0X2dldF9pbm9kZV9sb2MoaW5vZGUsICZpbG9jLCAwKSkKKwkJZ290byBiYWRfaW5vZGU7CisJYmggPSBpbG9jLmJoOworCXJhd19pbm9kZSA9IGV4dDRfcmF3X2lub2RlKCZpbG9jKTsKKwlpbm9kZS0+aV9tb2RlID0gbGUxNl90b19jcHUocmF3X2lub2RlLT5pX21vZGUpOworCWlub2RlLT5pX3VpZCA9ICh1aWRfdClsZTE2X3RvX2NwdShyYXdfaW5vZGUtPmlfdWlkX2xvdyk7CisJaW5vZGUtPmlfZ2lkID0gKGdpZF90KWxlMTZfdG9fY3B1KHJhd19pbm9kZS0+aV9naWRfbG93KTsKKwlpZighKHRlc3Rfb3B0IChpbm9kZS0+aV9zYiwgTk9fVUlEMzIpKSkgeworCQlpbm9kZS0+aV91aWQgfD0gbGUxNl90b19jcHUocmF3X2lub2RlLT5pX3VpZF9oaWdoKSA8PCAxNjsKKwkJaW5vZGUtPmlfZ2lkIHw9IGxlMTZfdG9fY3B1KHJhd19pbm9kZS0+aV9naWRfaGlnaCkgPDwgMTY7CisJfQorCWlub2RlLT5pX25saW5rID0gbGUxNl90b19jcHUocmF3X2lub2RlLT5pX2xpbmtzX2NvdW50KTsKKwlpbm9kZS0+aV9zaXplID0gbGUzMl90b19jcHUocmF3X2lub2RlLT5pX3NpemUpOworCWlub2RlLT5pX2F0aW1lLnR2X3NlYyA9IGxlMzJfdG9fY3B1KHJhd19pbm9kZS0+aV9hdGltZSk7CisJaW5vZGUtPmlfY3RpbWUudHZfc2VjID0gbGUzMl90b19jcHUocmF3X2lub2RlLT5pX2N0aW1lKTsKKwlpbm9kZS0+aV9tdGltZS50dl9zZWMgPSBsZTMyX3RvX2NwdShyYXdfaW5vZGUtPmlfbXRpbWUpOworCWlub2RlLT5pX2F0aW1lLnR2X25zZWMgPSBpbm9kZS0+aV9jdGltZS50dl9uc2VjID0gaW5vZGUtPmlfbXRpbWUudHZfbnNlYyA9IDA7CisKKwllaS0+aV9zdGF0ZSA9IDA7CisJZWktPmlfZGlyX3N0YXJ0X2xvb2t1cCA9IDA7CisJZWktPmlfZHRpbWUgPSBsZTMyX3RvX2NwdShyYXdfaW5vZGUtPmlfZHRpbWUpOworCS8qIFdlIG5vdyBoYXZlIGVub3VnaCBmaWVsZHMgdG8gY2hlY2sgaWYgdGhlIGlub2RlIHdhcyBhY3RpdmUgb3Igbm90LgorCSAqIFRoaXMgaXMgbmVlZGVkIGJlY2F1c2UgbmZzZCBtaWdodCB0cnkgdG8gYWNjZXNzIGRlYWQgaW5vZGVzCisJICogdGhlIHRlc3QgaXMgdGhhdCBzYW1lIG9uZSB0aGF0IGUyZnNjayB1c2VzCisJICogTmVpbEJyb3duIDE5OTlvY3QxNQorCSAqLworCWlmIChpbm9kZS0+aV9ubGluayA9PSAwKSB7CisJCWlmIChpbm9kZS0+aV9tb2RlID09IDAgfHwKKwkJICAgICEoRVhUNF9TQihpbm9kZS0+aV9zYiktPnNfbW91bnRfc3RhdGUgJiBFWFQ0X09SUEhBTl9GUykpIHsKKwkJCS8qIHRoaXMgaW5vZGUgaXMgZGVsZXRlZCAqLworCQkJYnJlbHNlIChiaCk7CisJCQlnb3RvIGJhZF9pbm9kZTsKKwkJfQorCQkvKiBUaGUgb25seSB1bmxpbmtlZCBpbm9kZXMgd2UgbGV0IHRocm91Z2ggaGVyZSBoYXZlCisJCSAqIHZhbGlkIGlfbW9kZSBhbmQgYXJlIGJlaW5nIHJlYWQgYnkgdGhlIG9ycGhhbgorCQkgKiByZWNvdmVyeSBjb2RlOiB0aGF0J3MgZmluZSwgd2UncmUgYWJvdXQgdG8gY29tcGxldGUKKwkJICogdGhlIHByb2Nlc3Mgb2YgZGVsZXRpbmcgdGhvc2UuICovCisJfQorCWlub2RlLT5pX2Jsb2NrcyA9IGxlMzJfdG9fY3B1KHJhd19pbm9kZS0+aV9ibG9ja3MpOworCWVpLT5pX2ZsYWdzID0gbGUzMl90b19jcHUocmF3X2lub2RlLT5pX2ZsYWdzKTsKKyNpZmRlZiBFWFQ0X0ZSQUdNRU5UUworCWVpLT5pX2ZhZGRyID0gbGUzMl90b19jcHUocmF3X2lub2RlLT5pX2ZhZGRyKTsKKwllaS0+aV9mcmFnX25vID0gcmF3X2lub2RlLT5pX2ZyYWc7CisJZWktPmlfZnJhZ19zaXplID0gcmF3X2lub2RlLT5pX2ZzaXplOworI2VuZGlmCisJZWktPmlfZmlsZV9hY2wgPSBsZTMyX3RvX2NwdShyYXdfaW5vZGUtPmlfZmlsZV9hY2wpOworCWlmIChFWFQ0X1NCKGlub2RlLT5pX3NiKS0+c19lcy0+c19jcmVhdG9yX29zICE9CisJICAgIGNwdV90b19sZTMyKEVYVDRfT1NfSFVSRCkpCisJCWVpLT5pX2ZpbGVfYWNsIHw9CisJCQkoKF9fdTY0KWxlMTZfdG9fY3B1KHJhd19pbm9kZS0+aV9maWxlX2FjbF9oaWdoKSkgPDwgMzI7CisJaWYgKCFTX0lTUkVHKGlub2RlLT5pX21vZGUpKSB7CisJCWVpLT5pX2Rpcl9hY2wgPSBsZTMyX3RvX2NwdShyYXdfaW5vZGUtPmlfZGlyX2FjbCk7CisJfSBlbHNlIHsKKwkJaW5vZGUtPmlfc2l6ZSB8PQorCQkJKChfX3U2NClsZTMyX3RvX2NwdShyYXdfaW5vZGUtPmlfc2l6ZV9oaWdoKSkgPDwgMzI7CisJfQorCWVpLT5pX2Rpc2tzaXplID0gaW5vZGUtPmlfc2l6ZTsKKwlpbm9kZS0+aV9nZW5lcmF0aW9uID0gbGUzMl90b19jcHUocmF3X2lub2RlLT5pX2dlbmVyYXRpb24pOworCWVpLT5pX2Jsb2NrX2dyb3VwID0gaWxvYy5ibG9ja19ncm91cDsKKwkvKgorCSAqIE5PVEUhIFRoZSBpbi1tZW1vcnkgaW5vZGUgaV9kYXRhIGFycmF5IGlzIGluIGxpdHRsZS1lbmRpYW4gb3JkZXIKKwkgKiBldmVuIG9uIGJpZy1lbmRpYW4gbWFjaGluZXM6IHdlIGRvIE5PVCBieXRlc3dhcCB0aGUgYmxvY2sgbnVtYmVycyEKKwkgKi8KKwlmb3IgKGJsb2NrID0gMDsgYmxvY2sgPCBFWFQ0X05fQkxPQ0tTOyBibG9jaysrKQorCQllaS0+aV9kYXRhW2Jsb2NrXSA9IHJhd19pbm9kZS0+aV9ibG9ja1tibG9ja107CisJSU5JVF9MSVNUX0hFQUQoJmVpLT5pX29ycGhhbik7CisKKwlpZiAoaW5vZGUtPmlfaW5vID49IEVYVDRfRklSU1RfSU5PKGlub2RlLT5pX3NiKSArIDEgJiYKKwkgICAgRVhUNF9JTk9ERV9TSVpFKGlub2RlLT5pX3NiKSA+IEVYVDRfR09PRF9PTERfSU5PREVfU0laRSkgeworCQkvKgorCQkgKiBXaGVuIG1rZTJmcyBjcmVhdGVzIGJpZyBpbm9kZXMgaXQgZG9lcyBub3QgemVybyBvdXQKKwkJICogdGhlIHVudXNlZCBieXRlcyBhYm92ZSBFWFQ0X0dPT0RfT0xEX0lOT0RFX1NJWkUsCisJCSAqIHNvIGlnbm9yZSB0aG9zZSBmaXJzdCBmZXcgaW5vZGVzLgorCQkgKi8KKwkJZWktPmlfZXh0cmFfaXNpemUgPSBsZTE2X3RvX2NwdShyYXdfaW5vZGUtPmlfZXh0cmFfaXNpemUpOworCQlpZiAoRVhUNF9HT09EX09MRF9JTk9ERV9TSVpFICsgZWktPmlfZXh0cmFfaXNpemUgPgorCQkgICAgRVhUNF9JTk9ERV9TSVpFKGlub2RlLT5pX3NiKSkKKwkJCWdvdG8gYmFkX2lub2RlOworCQlpZiAoZWktPmlfZXh0cmFfaXNpemUgPT0gMCkgeworCQkJLyogVGhlIGV4dHJhIHNwYWNlIGlzIGN1cnJlbnRseSB1bnVzZWQuIFVzZSBpdC4gKi8KKwkJCWVpLT5pX2V4dHJhX2lzaXplID0gc2l6ZW9mKHN0cnVjdCBleHQ0X2lub2RlKSAtCisJCQkJCSAgICBFWFQ0X0dPT0RfT0xEX0lOT0RFX1NJWkU7CisJCX0gZWxzZSB7CisJCQlfX2xlMzIgKm1hZ2ljID0gKHZvaWQgKilyYXdfaW5vZGUgKworCQkJCQlFWFQ0X0dPT0RfT0xEX0lOT0RFX1NJWkUgKworCQkJCQllaS0+aV9leHRyYV9pc2l6ZTsKKwkJCWlmICgqbWFnaWMgPT0gY3B1X3RvX2xlMzIoRVhUNF9YQVRUUl9NQUdJQykpCisJCQkJIGVpLT5pX3N0YXRlIHw9IEVYVDRfU1RBVEVfWEFUVFI7CisJCX0KKwl9IGVsc2UKKwkJZWktPmlfZXh0cmFfaXNpemUgPSAwOworCisJaWYgKFNfSVNSRUcoaW5vZGUtPmlfbW9kZSkpIHsKKwkJaW5vZGUtPmlfb3AgPSAmZXh0NF9maWxlX2lub2RlX29wZXJhdGlvbnM7CisJCWlub2RlLT5pX2ZvcCA9ICZleHQ0X2ZpbGVfb3BlcmF0aW9uczsKKwkJZXh0NF9zZXRfYW9wcyhpbm9kZSk7CisJfSBlbHNlIGlmIChTX0lTRElSKGlub2RlLT5pX21vZGUpKSB7CisJCWlub2RlLT5pX29wID0gJmV4dDRfZGlyX2lub2RlX29wZXJhdGlvbnM7CisJCWlub2RlLT5pX2ZvcCA9ICZleHQ0X2Rpcl9vcGVyYXRpb25zOworCX0gZWxzZSBpZiAoU19JU0xOSyhpbm9kZS0+aV9tb2RlKSkgeworCQlpZiAoZXh0NF9pbm9kZV9pc19mYXN0X3N5bWxpbmsoaW5vZGUpKQorCQkJaW5vZGUtPmlfb3AgPSAmZXh0NF9mYXN0X3N5bWxpbmtfaW5vZGVfb3BlcmF0aW9uczsKKwkJZWxzZSB7CisJCQlpbm9kZS0+aV9vcCA9ICZleHQ0X3N5bWxpbmtfaW5vZGVfb3BlcmF0aW9uczsKKwkJCWV4dDRfc2V0X2FvcHMoaW5vZGUpOworCQl9CisJfSBlbHNlIHsKKwkJaW5vZGUtPmlfb3AgPSAmZXh0NF9zcGVjaWFsX2lub2RlX29wZXJhdGlvbnM7CisJCWlmIChyYXdfaW5vZGUtPmlfYmxvY2tbMF0pCisJCQlpbml0X3NwZWNpYWxfaW5vZGUoaW5vZGUsIGlub2RlLT5pX21vZGUsCisJCQkgICBvbGRfZGVjb2RlX2RldihsZTMyX3RvX2NwdShyYXdfaW5vZGUtPmlfYmxvY2tbMF0pKSk7CisJCWVsc2UKKwkJCWluaXRfc3BlY2lhbF9pbm9kZShpbm9kZSwgaW5vZGUtPmlfbW9kZSwKKwkJCSAgIG5ld19kZWNvZGVfZGV2KGxlMzJfdG9fY3B1KHJhd19pbm9kZS0+aV9ibG9ja1sxXSkpKTsKKwl9CisJYnJlbHNlIChpbG9jLmJoKTsKKwlleHQ0X3NldF9pbm9kZV9mbGFncyhpbm9kZSk7CisJcmV0dXJuOworCitiYWRfaW5vZGU6CisJbWFrZV9iYWRfaW5vZGUoaW5vZGUpOworCXJldHVybjsKK30KKworLyoKKyAqIFBvc3QgdGhlIHN0cnVjdCBpbm9kZSBpbmZvIGludG8gYW4gb24tZGlzayBpbm9kZSBsb2NhdGlvbiBpbiB0aGUKKyAqIGJ1ZmZlci1jYWNoZS4gIFRoaXMgZ29iYmxlcyB0aGUgY2FsbGVyJ3MgcmVmZXJlbmNlIHRvIHRoZQorICogYnVmZmVyX2hlYWQgaW4gdGhlIGlub2RlIGxvY2F0aW9uIHN0cnVjdC4KKyAqCisgKiBUaGUgY2FsbGVyIG11c3QgaGF2ZSB3cml0ZSBhY2Nlc3MgdG8gaWxvYy0+YmguCisgKi8KK3N0YXRpYyBpbnQgZXh0NF9kb191cGRhdGVfaW5vZGUoaGFuZGxlX3QgKmhhbmRsZSwKKwkJCQlzdHJ1Y3QgaW5vZGUgKmlub2RlLAorCQkJCXN0cnVjdCBleHQ0X2lsb2MgKmlsb2MpCit7CisJc3RydWN0IGV4dDRfaW5vZGUgKnJhd19pbm9kZSA9IGV4dDRfcmF3X2lub2RlKGlsb2MpOworCXN0cnVjdCBleHQ0X2lub2RlX2luZm8gKmVpID0gRVhUNF9JKGlub2RlKTsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoID0gaWxvYy0+Ymg7CisJaW50IGVyciA9IDAsIHJjLCBibG9jazsKKworCS8qIEZvciBmaWVsZHMgbm90IG5vdCB0cmFja2luZyBpbiB0aGUgaW4tbWVtb3J5IGlub2RlLAorCSAqIGluaXRpYWxpc2UgdGhlbSB0byB6ZXJvIGZvciBuZXcgaW5vZGVzLiAqLworCWlmIChlaS0+aV9zdGF0ZSAmIEVYVDRfU1RBVEVfTkVXKQorCQltZW1zZXQocmF3X2lub2RlLCAwLCBFWFQ0X1NCKGlub2RlLT5pX3NiKS0+c19pbm9kZV9zaXplKTsKKworCXJhd19pbm9kZS0+aV9tb2RlID0gY3B1X3RvX2xlMTYoaW5vZGUtPmlfbW9kZSk7CisJaWYoISh0ZXN0X29wdChpbm9kZS0+aV9zYiwgTk9fVUlEMzIpKSkgeworCQlyYXdfaW5vZGUtPmlfdWlkX2xvdyA9IGNwdV90b19sZTE2KGxvd18xNl9iaXRzKGlub2RlLT5pX3VpZCkpOworCQlyYXdfaW5vZGUtPmlfZ2lkX2xvdyA9IGNwdV90b19sZTE2KGxvd18xNl9iaXRzKGlub2RlLT5pX2dpZCkpOworLyoKKyAqIEZpeCB1cCBpbnRlcm9wZXJhYmlsaXR5IHdpdGggb2xkIGtlcm5lbHMuIE90aGVyd2lzZSwgb2xkIGlub2RlcyBnZXQKKyAqIHJlLXVzZWQgd2l0aCB0aGUgdXBwZXIgMTYgYml0cyBvZiB0aGUgdWlkL2dpZCBpbnRhY3QKKyAqLworCQlpZighZWktPmlfZHRpbWUpIHsKKwkJCXJhd19pbm9kZS0+aV91aWRfaGlnaCA9CisJCQkJY3B1X3RvX2xlMTYoaGlnaF8xNl9iaXRzKGlub2RlLT5pX3VpZCkpOworCQkJcmF3X2lub2RlLT5pX2dpZF9oaWdoID0KKwkJCQljcHVfdG9fbGUxNihoaWdoXzE2X2JpdHMoaW5vZGUtPmlfZ2lkKSk7CisJCX0gZWxzZSB7CisJCQlyYXdfaW5vZGUtPmlfdWlkX2hpZ2ggPSAwOworCQkJcmF3X2lub2RlLT5pX2dpZF9oaWdoID0gMDsKKwkJfQorCX0gZWxzZSB7CisJCXJhd19pbm9kZS0+aV91aWRfbG93ID0KKwkJCWNwdV90b19sZTE2KGZzX2hpZ2gybG93dWlkKGlub2RlLT5pX3VpZCkpOworCQlyYXdfaW5vZGUtPmlfZ2lkX2xvdyA9CisJCQljcHVfdG9fbGUxNihmc19oaWdoMmxvd2dpZChpbm9kZS0+aV9naWQpKTsKKwkJcmF3X2lub2RlLT5pX3VpZF9oaWdoID0gMDsKKwkJcmF3X2lub2RlLT5pX2dpZF9oaWdoID0gMDsKKwl9CisJcmF3X2lub2RlLT5pX2xpbmtzX2NvdW50ID0gY3B1X3RvX2xlMTYoaW5vZGUtPmlfbmxpbmspOworCXJhd19pbm9kZS0+aV9zaXplID0gY3B1X3RvX2xlMzIoZWktPmlfZGlza3NpemUpOworCXJhd19pbm9kZS0+aV9hdGltZSA9IGNwdV90b19sZTMyKGlub2RlLT5pX2F0aW1lLnR2X3NlYyk7CisJcmF3X2lub2RlLT5pX2N0aW1lID0gY3B1X3RvX2xlMzIoaW5vZGUtPmlfY3RpbWUudHZfc2VjKTsKKwlyYXdfaW5vZGUtPmlfbXRpbWUgPSBjcHVfdG9fbGUzMihpbm9kZS0+aV9tdGltZS50dl9zZWMpOworCXJhd19pbm9kZS0+aV9ibG9ja3MgPSBjcHVfdG9fbGUzMihpbm9kZS0+aV9ibG9ja3MpOworCXJhd19pbm9kZS0+aV9kdGltZSA9IGNwdV90b19sZTMyKGVpLT5pX2R0aW1lKTsKKwlyYXdfaW5vZGUtPmlfZmxhZ3MgPSBjcHVfdG9fbGUzMihlaS0+aV9mbGFncyk7CisjaWZkZWYgRVhUNF9GUkFHTUVOVFMKKwlyYXdfaW5vZGUtPmlfZmFkZHIgPSBjcHVfdG9fbGUzMihlaS0+aV9mYWRkcik7CisJcmF3X2lub2RlLT5pX2ZyYWcgPSBlaS0+aV9mcmFnX25vOworCXJhd19pbm9kZS0+aV9mc2l6ZSA9IGVpLT5pX2ZyYWdfc2l6ZTsKKyNlbmRpZgorCWlmIChFWFQ0X1NCKGlub2RlLT5pX3NiKS0+c19lcy0+c19jcmVhdG9yX29zICE9CisJICAgIGNwdV90b19sZTMyKEVYVDRfT1NfSFVSRCkpCisJCXJhd19pbm9kZS0+aV9maWxlX2FjbF9oaWdoID0KKwkJCWNwdV90b19sZTE2KGVpLT5pX2ZpbGVfYWNsID4+IDMyKTsKKwlyYXdfaW5vZGUtPmlfZmlsZV9hY2wgPSBjcHVfdG9fbGUzMihlaS0+aV9maWxlX2FjbCk7CisJaWYgKCFTX0lTUkVHKGlub2RlLT5pX21vZGUpKSB7CisJCXJhd19pbm9kZS0+aV9kaXJfYWNsID0gY3B1X3RvX2xlMzIoZWktPmlfZGlyX2FjbCk7CisJfSBlbHNlIHsKKwkJcmF3X2lub2RlLT5pX3NpemVfaGlnaCA9CisJCQljcHVfdG9fbGUzMihlaS0+aV9kaXNrc2l6ZSA+PiAzMik7CisJCWlmIChlaS0+aV9kaXNrc2l6ZSA+IDB4N2ZmZmZmZmZVTEwpIHsKKwkJCXN0cnVjdCBzdXBlcl9ibG9jayAqc2IgPSBpbm9kZS0+aV9zYjsKKwkJCWlmICghRVhUNF9IQVNfUk9fQ09NUEFUX0ZFQVRVUkUoc2IsCisJCQkJCUVYVDRfRkVBVFVSRV9ST19DT01QQVRfTEFSR0VfRklMRSkgfHwKKwkJCSAgICBFWFQ0X1NCKHNiKS0+c19lcy0+c19yZXZfbGV2ZWwgPT0KKwkJCQkJY3B1X3RvX2xlMzIoRVhUNF9HT09EX09MRF9SRVYpKSB7CisJCQkgICAgICAgLyogSWYgdGhpcyBpcyB0aGUgZmlyc3QgbGFyZ2UgZmlsZQorCQkJCSogY3JlYXRlZCwgYWRkIGEgZmxhZyB0byB0aGUgc3VwZXJibG9jay4KKwkJCQkqLworCQkJCWVyciA9IGV4dDRfam91cm5hbF9nZXRfd3JpdGVfYWNjZXNzKGhhbmRsZSwKKwkJCQkJCUVYVDRfU0Ioc2IpLT5zX3NiaCk7CisJCQkJaWYgKGVycikKKwkJCQkJZ290byBvdXRfYnJlbHNlOworCQkJCWV4dDRfdXBkYXRlX2R5bmFtaWNfcmV2KHNiKTsKKwkJCQlFWFQ0X1NFVF9ST19DT01QQVRfRkVBVFVSRShzYiwKKwkJCQkJRVhUNF9GRUFUVVJFX1JPX0NPTVBBVF9MQVJHRV9GSUxFKTsKKwkJCQlzYi0+c19kaXJ0ID0gMTsKKwkJCQloYW5kbGUtPmhfc3luYyA9IDE7CisJCQkJZXJyID0gZXh0NF9qb3VybmFsX2RpcnR5X21ldGFkYXRhKGhhbmRsZSwKKwkJCQkJCUVYVDRfU0Ioc2IpLT5zX3NiaCk7CisJCQl9CisJCX0KKwl9CisJcmF3X2lub2RlLT5pX2dlbmVyYXRpb24gPSBjcHVfdG9fbGUzMihpbm9kZS0+aV9nZW5lcmF0aW9uKTsKKwlpZiAoU19JU0NIUihpbm9kZS0+aV9tb2RlKSB8fCBTX0lTQkxLKGlub2RlLT5pX21vZGUpKSB7CisJCWlmIChvbGRfdmFsaWRfZGV2KGlub2RlLT5pX3JkZXYpKSB7CisJCQlyYXdfaW5vZGUtPmlfYmxvY2tbMF0gPQorCQkJCWNwdV90b19sZTMyKG9sZF9lbmNvZGVfZGV2KGlub2RlLT5pX3JkZXYpKTsKKwkJCXJhd19pbm9kZS0+aV9ibG9ja1sxXSA9IDA7CisJCX0gZWxzZSB7CisJCQlyYXdfaW5vZGUtPmlfYmxvY2tbMF0gPSAwOworCQkJcmF3X2lub2RlLT5pX2Jsb2NrWzFdID0KKwkJCQljcHVfdG9fbGUzMihuZXdfZW5jb2RlX2Rldihpbm9kZS0+aV9yZGV2KSk7CisJCQlyYXdfaW5vZGUtPmlfYmxvY2tbMl0gPSAwOworCQl9CisJfSBlbHNlIGZvciAoYmxvY2sgPSAwOyBibG9jayA8IEVYVDRfTl9CTE9DS1M7IGJsb2NrKyspCisJCXJhd19pbm9kZS0+aV9ibG9ja1tibG9ja10gPSBlaS0+aV9kYXRhW2Jsb2NrXTsKKworCWlmIChlaS0+aV9leHRyYV9pc2l6ZSkKKwkJcmF3X2lub2RlLT5pX2V4dHJhX2lzaXplID0gY3B1X3RvX2xlMTYoZWktPmlfZXh0cmFfaXNpemUpOworCisJQlVGRkVSX1RSQUNFKGJoLCAiY2FsbCBleHQ0X2pvdXJuYWxfZGlydHlfbWV0YWRhdGEiKTsKKwlyYyA9IGV4dDRfam91cm5hbF9kaXJ0eV9tZXRhZGF0YShoYW5kbGUsIGJoKTsKKwlpZiAoIWVycikKKwkJZXJyID0gcmM7CisJZWktPmlfc3RhdGUgJj0gfkVYVDRfU1RBVEVfTkVXOworCitvdXRfYnJlbHNlOgorCWJyZWxzZSAoYmgpOworCWV4dDRfc3RkX2Vycm9yKGlub2RlLT5pX3NiLCBlcnIpOworCXJldHVybiBlcnI7Cit9CisKKy8qCisgKiBleHQ0X3dyaXRlX2lub2RlKCkKKyAqCisgKiBXZSBhcmUgY2FsbGVkIGZyb20gYSBmZXcgcGxhY2VzOgorICoKKyAqIC0gV2l0aGluIGdlbmVyaWNfZmlsZV93cml0ZSgpIGZvciBPX1NZTkMgZmlsZXMuCisgKiAgIEhlcmUsIHRoZXJlIHdpbGwgYmUgbm8gdHJhbnNhY3Rpb24gcnVubmluZy4gV2Ugd2FpdCBmb3IgYW55IHJ1bm5pbmcKKyAqICAgdHJhc25hY3Rpb24gdG8gY29tbWl0LgorICoKKyAqIC0gV2l0aGluIHN5c19zeW5jKCksIGt1cGRhdGUgYW5kIHN1Y2guCisgKiAgIFdlIHdhaXQgb24gY29tbWl0LCBpZiB0b2wgdG8uCisgKgorICogLSBXaXRoaW4gcHJ1bmVfaWNhY2hlKCkgKFBGX01FTUFMTE9DID09IHRydWUpCisgKiAgIEhlcmUgd2Ugc2ltcGx5IHJldHVybi4gIFdlIGNhbid0IGFmZm9yZCB0byBibG9jayBrc3dhcGQgb24gdGhlCisgKiAgIGpvdXJuYWwgY29tbWl0LgorICoKKyAqIEluIGFsbCBjYXNlcyBpdCBpcyBhY3R1YWxseSBzYWZlIGZvciB1cyB0byByZXR1cm4gd2l0aG91dCBkb2luZyBhbnl0aGluZywKKyAqIGJlY2F1c2UgdGhlIGlub2RlIGhhcyBiZWVuIGNvcGllZCBpbnRvIGEgcmF3IGlub2RlIGJ1ZmZlciBpbgorICogZXh0NF9tYXJrX2lub2RlX2RpcnR5KCkuICBUaGlzIGlzIGEgY29ycmVjdG5lc3MgdGhpbmcgZm9yIE9fU1lOQyBhbmQgZm9yCisgKiBrbmZzZC4KKyAqCisgKiBOb3RlIHRoYXQgd2UgYXJlIGFic29sdXRlbHkgZGVwZW5kZW50IHVwb24gYWxsIGlub2RlIGRpcnRpZXJzIGRvaW5nIHRoZQorICogcmlnaHQgdGhpbmc6IHRoZXkgKm11c3QqIGNhbGwgbWFya19pbm9kZV9kaXJ0eSgpIGFmdGVyIGRpcnR5aW5nIGluZm8gaW4KKyAqIHdoaWNoIHdlIGFyZSBpbnRlcmVzdGVkLgorICoKKyAqIEl0IHdvdWxkIGJlIGEgYnVnIGZvciB0aGVtIHRvIG5vdCBkbyB0aGlzLiAgVGhlIGNvZGU6CisgKgorICoJbWFya19pbm9kZV9kaXJ0eShpbm9kZSkKKyAqCXN0dWZmKCk7CisgKglpbm9kZS0+aV9zaXplID0gZXhwcjsKKyAqCisgKiBpcyBpbiBlcnJvciBiZWNhdXNlIGEga3N3YXBkLWRyaXZlbiB3cml0ZV9pbm9kZSgpIGNvdWxkIG9jY3VyIHdoaWxlCisgKiBgc3R1ZmYoKScgaXMgcnVubmluZywgYW5kIHRoZSBuZXcgaV9zaXplIHdpbGwgYmUgbG9zdC4gIFBsdXMgdGhlIGlub2RlCisgKiB3aWxsIG5vIGxvbmdlciBiZSBvbiB0aGUgc3VwZXJibG9jaydzIGRpcnR5IGlub2RlIGxpc3QuCisgKi8KK2ludCBleHQ0X3dyaXRlX2lub2RlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGludCB3YWl0KQoreworCWlmIChjdXJyZW50LT5mbGFncyAmIFBGX01FTUFMTE9DKQorCQlyZXR1cm4gMDsKKworCWlmIChleHQ0X2pvdXJuYWxfY3VycmVudF9oYW5kbGUoKSkgeworCQlqYmRfZGVidWcoMCwgImNhbGxlZCByZWN1cnNpdmVseSwgbm9uLVBGX01FTUFMTE9DIVxuIik7CisJCWR1bXBfc3RhY2soKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCisJaWYgKCF3YWl0KQorCQlyZXR1cm4gMDsKKworCXJldHVybiBleHQ0X2ZvcmNlX2NvbW1pdChpbm9kZS0+aV9zYik7Cit9CisKKy8qCisgKiBleHQ0X3NldGF0dHIoKQorICoKKyAqIENhbGxlZCBmcm9tIG5vdGlmeV9jaGFuZ2UuCisgKgorICogV2Ugd2FudCB0byB0cmFwIFZGUyBhdHRlbXB0cyB0byB0cnVuY2F0ZSB0aGUgZmlsZSBhcyBzb29uIGFzCisgKiBwb3NzaWJsZS4gIEluIHBhcnRpY3VsYXIsIHdlIHdhbnQgdG8gbWFrZSBzdXJlIHRoYXQgd2hlbiB0aGUgVkZTCisgKiBzaHJpbmtzIGlfc2l6ZSwgd2UgcHV0IHRoZSBpbm9kZSBvbiB0aGUgb3JwaGFuIGxpc3QgYW5kIG1vZGlmeQorICogaV9kaXNrc2l6ZSBpbW1lZGlhdGVseSwgc28gdGhhdCBkdXJpbmcgdGhlIHN1YnNlcXVlbnQgZmx1c2hpbmcgb2YKKyAqIGRpcnR5IHBhZ2VzIGFuZCBmcmVlaW5nIG9mIGRpc2sgYmxvY2tzLCB3ZSBjYW4gZ3VhcmFudGVlIHRoYXQgYW55CisgKiBjb21taXQgd2lsbCBsZWF2ZSB0aGUgYmxvY2tzIGJlaW5nIGZsdXNoZWQgaW4gYW4gdW51c2VkIHN0YXRlIG9uCisgKiBkaXNrLiAgKE9uIHJlY292ZXJ5LCB0aGUgaW5vZGUgd2lsbCBnZXQgdHJ1bmNhdGVkIGFuZCB0aGUgYmxvY2tzIHdpbGwKKyAqIGJlIGZyZWVkLCBzbyB3ZSBoYXZlIGEgc3Ryb25nIGd1YXJhbnRlZSB0aGF0IG5vIGZ1dHVyZSBjb21taXQgd2lsbAorICogbGVhdmUgdGhlc2UgYmxvY2tzIHZpc2libGUgdG8gdGhlIHVzZXIuKQorICoKKyAqIENhbGxlZCB3aXRoIGlub2RlLT5zZW0gZG93bi4KKyAqLworaW50IGV4dDRfc2V0YXR0cihzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIHN0cnVjdCBpYXR0ciAqYXR0cikKK3sKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZGVudHJ5LT5kX2lub2RlOworCWludCBlcnJvciwgcmMgPSAwOworCWNvbnN0IHVuc2lnbmVkIGludCBpYV92YWxpZCA9IGF0dHItPmlhX3ZhbGlkOworCisJZXJyb3IgPSBpbm9kZV9jaGFuZ2Vfb2soaW5vZGUsIGF0dHIpOworCWlmIChlcnJvcikKKwkJcmV0dXJuIGVycm9yOworCisJaWYgKChpYV92YWxpZCAmIEFUVFJfVUlEICYmIGF0dHItPmlhX3VpZCAhPSBpbm9kZS0+aV91aWQpIHx8CisJCShpYV92YWxpZCAmIEFUVFJfR0lEICYmIGF0dHItPmlhX2dpZCAhPSBpbm9kZS0+aV9naWQpKSB7CisJCWhhbmRsZV90ICpoYW5kbGU7CisKKwkJLyogKHVzZXIrZ3JvdXApKihvbGQrbmV3KSBzdHJ1Y3R1cmUsIGlub2RlIHdyaXRlIChzYiwKKwkJICogaW5vZGUgYmxvY2ssID8gLSBidXQgdHJ1bmNhdGUgaW5vZGUgdXBkYXRlIGhhcyBpdCkgKi8KKwkJaGFuZGxlID0gZXh0NF9qb3VybmFsX3N0YXJ0KGlub2RlLCAyKihFWFQ0X1FVT1RBX0lOSVRfQkxPQ0tTKGlub2RlLT5pX3NiKSsKKwkJCQkJRVhUNF9RVU9UQV9ERUxfQkxPQ0tTKGlub2RlLT5pX3NiKSkrMyk7CisJCWlmIChJU19FUlIoaGFuZGxlKSkgeworCQkJZXJyb3IgPSBQVFJfRVJSKGhhbmRsZSk7CisJCQlnb3RvIGVycl9vdXQ7CisJCX0KKwkJZXJyb3IgPSBEUVVPVF9UUkFOU0ZFUihpbm9kZSwgYXR0cikgPyAtRURRVU9UIDogMDsKKwkJaWYgKGVycm9yKSB7CisJCQlleHQ0X2pvdXJuYWxfc3RvcChoYW5kbGUpOworCQkJcmV0dXJuIGVycm9yOworCQl9CisJCS8qIFVwZGF0ZSBjb3JyZXNwb25kaW5nIGluZm8gaW4gaW5vZGUgc28gdGhhdCBldmVyeXRoaW5nIGlzIGluCisJCSAqIG9uZSB0cmFuc2FjdGlvbiAqLworCQlpZiAoYXR0ci0+aWFfdmFsaWQgJiBBVFRSX1VJRCkKKwkJCWlub2RlLT5pX3VpZCA9IGF0dHItPmlhX3VpZDsKKwkJaWYgKGF0dHItPmlhX3ZhbGlkICYgQVRUUl9HSUQpCisJCQlpbm9kZS0+aV9naWQgPSBhdHRyLT5pYV9naWQ7CisJCWVycm9yID0gZXh0NF9tYXJrX2lub2RlX2RpcnR5KGhhbmRsZSwgaW5vZGUpOworCQlleHQ0X2pvdXJuYWxfc3RvcChoYW5kbGUpOworCX0KKworCWlmIChTX0lTUkVHKGlub2RlLT5pX21vZGUpICYmCisJICAgIGF0dHItPmlhX3ZhbGlkICYgQVRUUl9TSVpFICYmIGF0dHItPmlhX3NpemUgPCBpbm9kZS0+aV9zaXplKSB7CisJCWhhbmRsZV90ICpoYW5kbGU7CisKKwkJaGFuZGxlID0gZXh0NF9qb3VybmFsX3N0YXJ0KGlub2RlLCAzKTsKKwkJaWYgKElTX0VSUihoYW5kbGUpKSB7CisJCQllcnJvciA9IFBUUl9FUlIoaGFuZGxlKTsKKwkJCWdvdG8gZXJyX291dDsKKwkJfQorCisJCWVycm9yID0gZXh0NF9vcnBoYW5fYWRkKGhhbmRsZSwgaW5vZGUpOworCQlFWFQ0X0koaW5vZGUpLT5pX2Rpc2tzaXplID0gYXR0ci0+aWFfc2l6ZTsKKwkJcmMgPSBleHQ0X21hcmtfaW5vZGVfZGlydHkoaGFuZGxlLCBpbm9kZSk7CisJCWlmICghZXJyb3IpCisJCQllcnJvciA9IHJjOworCQlleHQ0X2pvdXJuYWxfc3RvcChoYW5kbGUpOworCX0KKworCXJjID0gaW5vZGVfc2V0YXR0cihpbm9kZSwgYXR0cik7CisKKwkvKiBJZiBpbm9kZV9zZXRhdHRyJ3MgY2FsbCB0byBleHQ0X3RydW5jYXRlIGZhaWxlZCB0byBnZXQgYQorCSAqIHRyYW5zYWN0aW9uIGhhbmRsZSBhdCBhbGwsIHdlIG5lZWQgdG8gY2xlYW4gdXAgdGhlIGluLWNvcmUKKwkgKiBvcnBoYW4gbGlzdCBtYW51YWxseS4gKi8KKwlpZiAoaW5vZGUtPmlfbmxpbmspCisJCWV4dDRfb3JwaGFuX2RlbChOVUxMLCBpbm9kZSk7CisKKwlpZiAoIXJjICYmIChpYV92YWxpZCAmIEFUVFJfTU9ERSkpCisJCXJjID0gZXh0NF9hY2xfY2htb2QoaW5vZGUpOworCitlcnJfb3V0OgorCWV4dDRfc3RkX2Vycm9yKGlub2RlLT5pX3NiLCBlcnJvcik7CisJaWYgKCFlcnJvcikKKwkJZXJyb3IgPSByYzsKKwlyZXR1cm4gZXJyb3I7Cit9CisKKworLyoKKyAqIEhvdyBtYW55IGJsb2NrcyBkb3RoIG1ha2UgYSB3cml0ZXBhZ2UoKT8KKyAqCisgKiBXaXRoIE4gYmxvY2tzIHBlciBwYWdlLCBpdCBtYXkgYmU6CisgKiBOIGRhdGEgYmxvY2tzCisgKiAyIGluZGlyZWN0IGJsb2NrCisgKiAyIGRpbmRpcmVjdAorICogMSB0aW5kaXJlY3QKKyAqIE4rNSBiaXRtYXAgYmxvY2tzIChmcm9tIHRoZSBhYm92ZSkKKyAqIE4rNSBncm91cCBkZXNjcmlwdG9yIHN1bW1hcnkgYmxvY2tzCisgKiAxIGlub2RlIGJsb2NrCisgKiAxIHN1cGVyYmxvY2suCisgKiAyICogRVhUNF9TSU5HTEVEQVRBX1RSQU5TX0JMT0NLUyBmb3IgdGhlIHF1b3RlIGZpbGVzCisgKgorICogMyAqIChOICsgNSkgKyAyICsgMiAqIEVYVDRfU0lOR0xFREFUQV9UUkFOU19CTE9DS1MKKyAqCisgKiBXaXRoIG9yZGVyZWQgb3Igd3JpdGViYWNrIGRhdGEgaXQncyB0aGUgc2FtZSwgbGVzcyB0aGUgTiBkYXRhIGJsb2Nrcy4KKyAqCisgKiBJZiB0aGUgaW5vZGUncyBkaXJlY3QgYmxvY2tzIGNhbiBob2xkIGFuIGludGVncmFsIG51bWJlciBvZiBwYWdlcyB0aGVuIGEKKyAqIHBhZ2UgY2Fubm90IHN0cmFkZGxlIHR3byBpbmRpcmVjdCBibG9ja3MsIGFuZCB3ZSBjYW4gb25seSB0b3VjaCBvbmUgaW5kaXJlY3QKKyAqIGFuZCBkaW5kaXJlY3QgYmxvY2ssIGFuZCB0aGUgIjUiIGFib3ZlIGJlY29tZXMgIjMiLgorICoKKyAqIFRoaXMgc3RpbGwgb3ZlcmVzdGltYXRlcyB1bmRlciBtb3N0IGNpcmN1bXN0YW5jZXMuICBJZiB3ZSB3ZXJlIHRvIHBhc3MgdGhlCisgKiBzdGFydCBhbmQgZW5kIG9mZnNldHMgaW4gaGVyZSBhcyB3ZWxsIHdlIGNvdWxkIGRvIGJsb2NrX3RvX3BhdGgoKSBvbiBlYWNoCisgKiBibG9jayBhbmQgd29yayBvdXQgdGhlIGV4YWN0IG51bWJlciBvZiBpbmRpcmVjdHMgd2hpY2ggYXJlIHRvdWNoZWQuICBQYWguCisgKi8KKworaW50IGV4dDRfd3JpdGVwYWdlX3RyYW5zX2Jsb2NrcyhzdHJ1Y3QgaW5vZGUgKmlub2RlKQoreworCWludCBicHAgPSBleHQ0X2pvdXJuYWxfYmxvY2tzX3Blcl9wYWdlKGlub2RlKTsKKwlpbnQgaW5kaXJlY3RzID0gKEVYVDRfTkRJUl9CTE9DS1MgJSBicHApID8gNSA6IDM7CisJaW50IHJldDsKKworCWlmIChFWFQ0X0koaW5vZGUpLT5pX2ZsYWdzICYgRVhUNF9FWFRFTlRTX0ZMKQorCQlyZXR1cm4gZXh0NF9leHRfd3JpdGVwYWdlX3RyYW5zX2Jsb2Nrcyhpbm9kZSwgYnBwKTsKKworCWlmIChleHQ0X3Nob3VsZF9qb3VybmFsX2RhdGEoaW5vZGUpKQorCQlyZXQgPSAzICogKGJwcCArIGluZGlyZWN0cykgKyAyOworCWVsc2UKKwkJcmV0ID0gMiAqIChicHAgKyBpbmRpcmVjdHMpICsgMjsKKworI2lmZGVmIENPTkZJR19RVU9UQQorCS8qIFdlIGtub3cgdGhhdCBzdHJ1Y3R1cmUgd2FzIGFscmVhZHkgYWxsb2NhdGVkIGR1cmluZyBEUVVPVF9JTklUIHNvCisJICogd2Ugd2lsbCBiZSB1cGRhdGluZyBvbmx5IHRoZSBkYXRhIGJsb2NrcyArIGlub2RlcyAqLworCXJldCArPSAyKkVYVDRfUVVPVEFfVFJBTlNfQkxPQ0tTKGlub2RlLT5pX3NiKTsKKyNlbmRpZgorCisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqIFRoZSBjYWxsZXIgbXVzdCBoYXZlIHByZXZpb3VzbHkgY2FsbGVkIGV4dDRfcmVzZXJ2ZV9pbm9kZV93cml0ZSgpLgorICogR2l2ZSB0aGlzLCB3ZSBrbm93IHRoYXQgdGhlIGNhbGxlciBhbHJlYWR5IGhhcyB3cml0ZSBhY2Nlc3MgdG8gaWxvYy0+YmguCisgKi8KK2ludCBleHQ0X21hcmtfaWxvY19kaXJ0eShoYW5kbGVfdCAqaGFuZGxlLAorCQlzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZXh0NF9pbG9jICppbG9jKQoreworCWludCBlcnIgPSAwOworCisJLyogdGhlIGRvX3VwZGF0ZV9pbm9kZSBjb25zdW1lcyBvbmUgYmgtPmJfY291bnQgKi8KKwlnZXRfYmgoaWxvYy0+YmgpOworCisJLyogZXh0NF9kb191cGRhdGVfaW5vZGUoKSBkb2VzIGpiZDJfam91cm5hbF9kaXJ0eV9tZXRhZGF0YSAqLworCWVyciA9IGV4dDRfZG9fdXBkYXRlX2lub2RlKGhhbmRsZSwgaW5vZGUsIGlsb2MpOworCXB1dF9iaChpbG9jLT5iaCk7CisJcmV0dXJuIGVycjsKK30KKworLyoKKyAqIE9uIHN1Y2Nlc3MsIFdlIGVuZCB1cCB3aXRoIGFuIG91dHN0YW5kaW5nIHJlZmVyZW5jZSBjb3VudCBhZ2FpbnN0CisgKiBpbG9jLT5iaC4gIFRoaXMgX211c3RfIGJlIGNsZWFuZWQgdXAgbGF0ZXIuCisgKi8KKworaW50CitleHQ0X3Jlc2VydmVfaW5vZGVfd3JpdGUoaGFuZGxlX3QgKmhhbmRsZSwgc3RydWN0IGlub2RlICppbm9kZSwKKwkJCSBzdHJ1Y3QgZXh0NF9pbG9jICppbG9jKQoreworCWludCBlcnIgPSAwOworCWlmIChoYW5kbGUpIHsKKwkJZXJyID0gZXh0NF9nZXRfaW5vZGVfbG9jKGlub2RlLCBpbG9jKTsKKwkJaWYgKCFlcnIpIHsKKwkJCUJVRkZFUl9UUkFDRShpbG9jLT5iaCwgImdldF93cml0ZV9hY2Nlc3MiKTsKKwkJCWVyciA9IGV4dDRfam91cm5hbF9nZXRfd3JpdGVfYWNjZXNzKGhhbmRsZSwgaWxvYy0+YmgpOworCQkJaWYgKGVycikgeworCQkJCWJyZWxzZShpbG9jLT5iaCk7CisJCQkJaWxvYy0+YmggPSBOVUxMOworCQkJfQorCQl9CisJfQorCWV4dDRfc3RkX2Vycm9yKGlub2RlLT5pX3NiLCBlcnIpOworCXJldHVybiBlcnI7Cit9CisKKy8qCisgKiBXaGF0IHdlIGRvIGhlcmUgaXMgdG8gbWFyayB0aGUgaW4tY29yZSBpbm9kZSBhcyBjbGVhbiB3aXRoIHJlc3BlY3QgdG8gaW5vZGUKKyAqIGRpcnRpbmVzcyAoaXQgbWF5IHN0aWxsIGJlIGRhdGEtZGlydHkpLgorICogVGhpcyBtZWFucyB0aGF0IHRoZSBpbi1jb3JlIGlub2RlIG1heSBiZSByZWFwZWQgYnkgcHJ1bmVfaWNhY2hlCisgKiB3aXRob3V0IGhhdmluZyB0byBwZXJmb3JtIGFueSBJL08uICBUaGlzIGlzIGEgdmVyeSBnb29kIHRoaW5nLAorICogYmVjYXVzZSAqYW55KiB0YXNrIG1heSBjYWxsIHBydW5lX2ljYWNoZSAtIGV2ZW4gb25lcyB3aGljaAorICogaGF2ZSBhIHRyYW5zYWN0aW9uIG9wZW4gYWdhaW5zdCBhIGRpZmZlcmVudCBqb3VybmFsLgorICoKKyAqIElzIHRoaXMgY2hlYXRpbmc/ICBOb3QgcmVhbGx5LiAgU3VyZSwgd2UgaGF2ZW4ndCB3cml0dGVuIHRoZQorICogaW5vZGUgb3V0LCBidXQgcHJ1bmVfaWNhY2hlIGlzbid0IGEgdXNlci12aXNpYmxlIHN5bmNpbmcgZnVuY3Rpb24uCisgKiBXaGVuZXZlciB0aGUgdXNlciB3YW50cyBzdHVmZiBzeW5jZWQgKHN5c19zeW5jLCBzeXNfbXN5bmMsIHN5c19mc3luYykKKyAqIHdlIHN0YXJ0IGFuZCB3YWl0IG9uIGNvbW1pdHMuCisgKgorICogSXMgdGhpcyBlZmZpY2llbnQvZWZmZWN0aXZlPyAgV2VsbCwgd2UncmUgYmVpbmcgbmljZSB0byB0aGUgc3lzdGVtCisgKiBieSBjbGVhbmluZyB1cCBvdXIgaW5vZGVzIHByb2FjdGl2ZWx5IHNvIHRoZXkgY2FuIGJlIHJlYXBlZAorICogd2l0aG91dCBJL08uICBCdXQgd2UgYXJlIHBvdGVudGlhbGx5IGxlYXZpbmcgdXAgdG8gZml2ZSBzZWNvbmRzJworICogd29ydGggb2YgaW5vZGVzIGZsb2F0aW5nIGFib3V0IHdoaWNoIHBydW5lX2ljYWNoZSB3YW50cyB1cyB0bworICogd3JpdGUgb3V0LiAgT25lIHdheSB0byBmaXggdGhhdCB3b3VsZCBiZSB0byBnZXQgcHJ1bmVfaWNhY2hlKCkKKyAqIHRvIGRvIGEgd3JpdGVfc3VwZXIoKSB0byBmcmVlIHVwIHNvbWUgbWVtb3J5LiAgSXQgaGFzIHRoZSBkZXNpcmVkCisgKiBlZmZlY3QuCisgKi8KK2ludCBleHQ0X21hcmtfaW5vZGVfZGlydHkoaGFuZGxlX3QgKmhhbmRsZSwgc3RydWN0IGlub2RlICppbm9kZSkKK3sKKwlzdHJ1Y3QgZXh0NF9pbG9jIGlsb2M7CisJaW50IGVycjsKKworCW1pZ2h0X3NsZWVwKCk7CisJZXJyID0gZXh0NF9yZXNlcnZlX2lub2RlX3dyaXRlKGhhbmRsZSwgaW5vZGUsICZpbG9jKTsKKwlpZiAoIWVycikKKwkJZXJyID0gZXh0NF9tYXJrX2lsb2NfZGlydHkoaGFuZGxlLCBpbm9kZSwgJmlsb2MpOworCXJldHVybiBlcnI7Cit9CisKKy8qCisgKiBleHQ0X2RpcnR5X2lub2RlKCkgaXMgY2FsbGVkIGZyb20gX19tYXJrX2lub2RlX2RpcnR5KCkKKyAqCisgKiBXZSdyZSByZWFsbHkgaW50ZXJlc3RlZCBpbiB0aGUgY2FzZSB3aGVyZSBhIGZpbGUgaXMgYmVpbmcgZXh0ZW5kZWQuCisgKiBpX3NpemUgaGFzIGJlZW4gY2hhbmdlZCBieSBnZW5lcmljX2NvbW1pdF93cml0ZSgpIGFuZCB3ZSB0aHVzIG5lZWQKKyAqIHRvIGluY2x1ZGUgdGhlIHVwZGF0ZWQgaW5vZGUgaW4gdGhlIGN1cnJlbnQgdHJhbnNhY3Rpb24uCisgKgorICogQWxzbywgRFFVT1RfQUxMT0NfU1BBQ0UoKSB3aWxsIGFsd2F5cyBkaXJ0eSB0aGUgaW5vZGUgd2hlbiBibG9ja3MKKyAqIGFyZSBhbGxvY2F0ZWQgdG8gdGhlIGZpbGUuCisgKgorICogSWYgdGhlIGlub2RlIGlzIG1hcmtlZCBzeW5jaHJvbm91cywgd2UgZG9uJ3QgaG9ub3VyIHRoYXQgaGVyZSAtIGRvaW5nCisgKiBzbyB3b3VsZCBjYXVzZSBhIGNvbW1pdCBvbiBhdGltZSB1cGRhdGVzLCB3aGljaCB3ZSBkb24ndCBib3RoZXIgZG9pbmcuCisgKiBXZSBoYW5kbGUgc3luY2hyb25vdXMgaW5vZGVzIGF0IHRoZSBoaWdoZXN0IHBvc3NpYmxlIGxldmVsLgorICovCit2b2lkIGV4dDRfZGlydHlfaW5vZGUoc3RydWN0IGlub2RlICppbm9kZSkKK3sKKwloYW5kbGVfdCAqY3VycmVudF9oYW5kbGUgPSBleHQ0X2pvdXJuYWxfY3VycmVudF9oYW5kbGUoKTsKKwloYW5kbGVfdCAqaGFuZGxlOworCisJaGFuZGxlID0gZXh0NF9qb3VybmFsX3N0YXJ0KGlub2RlLCAyKTsKKwlpZiAoSVNfRVJSKGhhbmRsZSkpCisJCWdvdG8gb3V0OworCWlmIChjdXJyZW50X2hhbmRsZSAmJgorCQljdXJyZW50X2hhbmRsZS0+aF90cmFuc2FjdGlvbiAhPSBoYW5kbGUtPmhfdHJhbnNhY3Rpb24pIHsKKwkJLyogVGhpcyB0YXNrIGhhcyBhIHRyYW5zYWN0aW9uIG9wZW4gYWdhaW5zdCBhIGRpZmZlcmVudCBmcyAqLworCQlwcmludGsoS0VSTl9FTUVSRyAiJXM6IHRyYW5zYWN0aW9ucyBkbyBub3QgbWF0Y2ghXG4iLAorCQkgICAgICAgX19GVU5DVElPTl9fKTsKKwl9IGVsc2UgeworCQlqYmRfZGVidWcoNSwgIm1hcmtpbmcgZGlydHkuICBvdXRlciBoYW5kbGU9JXBcbiIsCisJCQkJY3VycmVudF9oYW5kbGUpOworCQlleHQ0X21hcmtfaW5vZGVfZGlydHkoaGFuZGxlLCBpbm9kZSk7CisJfQorCWV4dDRfam91cm5hbF9zdG9wKGhhbmRsZSk7CitvdXQ6CisJcmV0dXJuOworfQorCisjaWYgMAorLyoKKyAqIEJpbmQgYW4gaW5vZGUncyBiYWNraW5nIGJ1ZmZlcl9oZWFkIGludG8gdGhpcyB0cmFuc2FjdGlvbiwgdG8gcHJldmVudAorICogaXQgZnJvbSBiZWluZyBmbHVzaGVkIHRvIGRpc2sgZWFybHkuICBVbmxpa2UKKyAqIGV4dDRfcmVzZXJ2ZV9pbm9kZV93cml0ZSwgdGhpcyBsZWF2ZXMgYmVoaW5kIG5vIGJoIHJlZmVyZW5jZSBhbmQKKyAqIHJldHVybnMgbm8gaWxvYyBzdHJ1Y3R1cmUsIHNvIHRoZSBjYWxsZXIgbmVlZHMgdG8gcmVwZWF0IHRoZSBpbG9jCisgKiBsb29rdXAgdG8gbWFyayB0aGUgaW5vZGUgZGlydHkgbGF0ZXIuCisgKi8KK3N0YXRpYyBpbnQgZXh0NF9waW5faW5vZGUoaGFuZGxlX3QgKmhhbmRsZSwgc3RydWN0IGlub2RlICppbm9kZSkKK3sKKwlzdHJ1Y3QgZXh0NF9pbG9jIGlsb2M7CisKKwlpbnQgZXJyID0gMDsKKwlpZiAoaGFuZGxlKSB7CisJCWVyciA9IGV4dDRfZ2V0X2lub2RlX2xvYyhpbm9kZSwgJmlsb2MpOworCQlpZiAoIWVycikgeworCQkJQlVGRkVSX1RSQUNFKGlsb2MuYmgsICJnZXRfd3JpdGVfYWNjZXNzIik7CisJCQllcnIgPSBqYmQyX2pvdXJuYWxfZ2V0X3dyaXRlX2FjY2VzcyhoYW5kbGUsIGlsb2MuYmgpOworCQkJaWYgKCFlcnIpCisJCQkJZXJyID0gZXh0NF9qb3VybmFsX2RpcnR5X21ldGFkYXRhKGhhbmRsZSwKKwkJCQkJCQkJICBpbG9jLmJoKTsKKwkJCWJyZWxzZShpbG9jLmJoKTsKKwkJfQorCX0KKwlleHQ0X3N0ZF9lcnJvcihpbm9kZS0+aV9zYiwgZXJyKTsKKwlyZXR1cm4gZXJyOworfQorI2VuZGlmCisKK2ludCBleHQ0X2NoYW5nZV9pbm9kZV9qb3VybmFsX2ZsYWcoc3RydWN0IGlub2RlICppbm9kZSwgaW50IHZhbCkKK3sKKwlqb3VybmFsX3QgKmpvdXJuYWw7CisJaGFuZGxlX3QgKmhhbmRsZTsKKwlpbnQgZXJyOworCisJLyoKKwkgKiBXZSBoYXZlIHRvIGJlIHZlcnkgY2FyZWZ1bCBoZXJlOiBjaGFuZ2luZyBhIGRhdGEgYmxvY2sncworCSAqIGpvdXJuYWxpbmcgc3RhdHVzIGR5bmFtaWNhbGx5IGlzIGRhbmdlcm91cy4gIElmIHdlIHdyaXRlIGEKKwkgKiBkYXRhIGJsb2NrIHRvIHRoZSBqb3VybmFsLCBjaGFuZ2UgdGhlIHN0YXR1cyBhbmQgdGhlbiBkZWxldGUKKwkgKiB0aGF0IGJsb2NrLCB3ZSByaXNrIGZvcmdldHRpbmcgdG8gcmV2b2tlIHRoZSBvbGQgbG9nIHJlY29yZAorCSAqIGZyb20gdGhlIGpvdXJuYWwgYW5kIHNvIGEgc3Vic2VxdWVudCByZXBsYXkgY2FuIGNvcnJ1cHQgZGF0YS4KKwkgKiBTbywgZmlyc3Qgd2UgbWFrZSBzdXJlIHRoYXQgdGhlIGpvdXJuYWwgaXMgZW1wdHkgYW5kIHRoYXQKKwkgKiBub2JvZHkgaXMgY2hhbmdpbmcgYW55dGhpbmcuCisJICovCisKKwlqb3VybmFsID0gRVhUNF9KT1VSTkFMKGlub2RlKTsKKwlpZiAoaXNfam91cm5hbF9hYm9ydGVkKGpvdXJuYWwpIHx8IElTX1JET05MWShpbm9kZSkpCisJCXJldHVybiAtRVJPRlM7CisKKwlqYmQyX2pvdXJuYWxfbG9ja191cGRhdGVzKGpvdXJuYWwpOworCWpiZDJfam91cm5hbF9mbHVzaChqb3VybmFsKTsKKworCS8qCisJICogT0ssIHRoZXJlIGFyZSBubyB1cGRhdGVzIHJ1bm5pbmcgbm93LCBhbmQgYWxsIGNhY2hlZCBkYXRhIGlzCisJICogc3luY2VkIHRvIGRpc2suICBXZSBhcmUgbm93IGluIGEgY29tcGxldGVseSBjb25zaXN0ZW50IHN0YXRlCisJICogd2hpY2ggZG9lc24ndCBoYXZlIGFueXRoaW5nIGluIHRoZSBqb3VybmFsLCBhbmQgd2Uga25vdyB0aGF0CisJICogbm8gZmlsZXN5c3RlbSB1cGRhdGVzIGFyZSBydW5uaW5nLCBzbyBpdCBpcyBzYWZlIHRvIG1vZGlmeQorCSAqIHRoZSBpbm9kZSdzIGluLWNvcmUgZGF0YS1qb3VybmFsaW5nIHN0YXRlIGZsYWcgbm93LgorCSAqLworCisJaWYgKHZhbCkKKwkJRVhUNF9JKGlub2RlKS0+aV9mbGFncyB8PSBFWFQ0X0pPVVJOQUxfREFUQV9GTDsKKwllbHNlCisJCUVYVDRfSShpbm9kZSktPmlfZmxhZ3MgJj0gfkVYVDRfSk9VUk5BTF9EQVRBX0ZMOworCWV4dDRfc2V0X2FvcHMoaW5vZGUpOworCisJamJkMl9qb3VybmFsX3VubG9ja191cGRhdGVzKGpvdXJuYWwpOworCisJLyogRmluYWxseSB3ZSBjYW4gbWFyayB0aGUgaW5vZGUgYXMgZGlydHkuICovCisKKwloYW5kbGUgPSBleHQ0X2pvdXJuYWxfc3RhcnQoaW5vZGUsIDEpOworCWlmIChJU19FUlIoaGFuZGxlKSkKKwkJcmV0dXJuIFBUUl9FUlIoaGFuZGxlKTsKKworCWVyciA9IGV4dDRfbWFya19pbm9kZV9kaXJ0eShoYW5kbGUsIGlub2RlKTsKKwloYW5kbGUtPmhfc3luYyA9IDE7CisJZXh0NF9qb3VybmFsX3N0b3AoaGFuZGxlKTsKKwlleHQ0X3N0ZF9lcnJvcihpbm9kZS0+aV9zYiwgZXJyKTsKKworCXJldHVybiBlcnI7Cit9CmRpZmYgLS1naXQgYS9mcy9leHQ0L2lvY3RsLmMgYi9mcy9leHQ0L2lvY3RsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjJhNzM3YwotLS0gL2Rldi9udWxsCisrKyBiL2ZzL2V4dDQvaW9jdGwuYwpAQCAtMCwwICsxLDMwNiBAQAorLyoKKyAqIGxpbnV4L2ZzL2V4dDQvaW9jdGwuYworICoKKyAqIENvcHlyaWdodCAoQykgMTk5MywgMTk5NCwgMTk5NQorICogUmVteSBDYXJkIChjYXJkQG1hc2kuaWJwLmZyKQorICogTGFib3JhdG9pcmUgTUFTSSAtIEluc3RpdHV0IEJsYWlzZSBQYXNjYWwKKyAqIFVuaXZlcnNpdGUgUGllcnJlIGV0IE1hcmllIEN1cmllIChQYXJpcyBWSSkKKyAqLworCisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9qYmQyLmg+CisjaW5jbHVkZSA8bGludXgvY2FwYWJpbGl0eS5oPgorI2luY2x1ZGUgPGxpbnV4L2V4dDRfZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9leHQ0X2piZDIuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lLmg+CisjaW5jbHVkZSA8bGludXgvY29tcGF0Lmg+CisjaW5jbHVkZSA8bGludXgvc21wX2xvY2suaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorCitpbnQgZXh0NF9pb2N0bCAoc3RydWN0IGlub2RlICogaW5vZGUsIHN0cnVjdCBmaWxlICogZmlscCwgdW5zaWduZWQgaW50IGNtZCwKKwkJdW5zaWduZWQgbG9uZyBhcmcpCit7CisJc3RydWN0IGV4dDRfaW5vZGVfaW5mbyAqZWkgPSBFWFQ0X0koaW5vZGUpOworCXVuc2lnbmVkIGludCBmbGFnczsKKwl1bnNpZ25lZCBzaG9ydCByc3Zfd2luZG93X3NpemU7CisKKwlleHQ0X2RlYnVnICgiY21kID0gJXUsIGFyZyA9ICVsdVxuIiwgY21kLCBhcmcpOworCisJc3dpdGNoIChjbWQpIHsKKwljYXNlIEVYVDRfSU9DX0dFVEZMQUdTOgorCQlmbGFncyA9IGVpLT5pX2ZsYWdzICYgRVhUNF9GTF9VU0VSX1ZJU0lCTEU7CisJCXJldHVybiBwdXRfdXNlcihmbGFncywgKGludCBfX3VzZXIgKikgYXJnKTsKKwljYXNlIEVYVDRfSU9DX1NFVEZMQUdTOiB7CisJCWhhbmRsZV90ICpoYW5kbGUgPSBOVUxMOworCQlpbnQgZXJyOworCQlzdHJ1Y3QgZXh0NF9pbG9jIGlsb2M7CisJCXVuc2lnbmVkIGludCBvbGRmbGFnczsKKwkJdW5zaWduZWQgaW50IGpmbGFnOworCisJCWlmIChJU19SRE9OTFkoaW5vZGUpKQorCQkJcmV0dXJuIC1FUk9GUzsKKworCQlpZiAoKGN1cnJlbnQtPmZzdWlkICE9IGlub2RlLT5pX3VpZCkgJiYgIWNhcGFibGUoQ0FQX0ZPV05FUikpCisJCQlyZXR1cm4gLUVBQ0NFUzsKKworCQlpZiAoZ2V0X3VzZXIoZmxhZ3MsIChpbnQgX191c2VyICopIGFyZykpCisJCQlyZXR1cm4gLUVGQVVMVDsKKworCQlpZiAoIVNfSVNESVIoaW5vZGUtPmlfbW9kZSkpCisJCQlmbGFncyAmPSB+RVhUNF9ESVJTWU5DX0ZMOworCisJCW11dGV4X2xvY2soJmlub2RlLT5pX211dGV4KTsKKwkJb2xkZmxhZ3MgPSBlaS0+aV9mbGFnczsKKworCQkvKiBUaGUgSk9VUk5BTF9EQVRBIGZsYWcgaXMgbW9kaWZpYWJsZSBvbmx5IGJ5IHJvb3QgKi8KKwkJamZsYWcgPSBmbGFncyAmIEVYVDRfSk9VUk5BTF9EQVRBX0ZMOworCisJCS8qCisJCSAqIFRoZSBJTU1VVEFCTEUgYW5kIEFQUEVORF9PTkxZIGZsYWdzIGNhbiBvbmx5IGJlIGNoYW5nZWQgYnkKKwkJICogdGhlIHJlbGV2YW50IGNhcGFiaWxpdHkuCisJCSAqCisJCSAqIFRoaXMgdGVzdCBsb29rcyBuaWNlci4gVGhhbmtzIHRvIFBhdWxpbmUgTWlkZGVsaW5rCisJCSAqLworCQlpZiAoKGZsYWdzIF4gb2xkZmxhZ3MpICYgKEVYVDRfQVBQRU5EX0ZMIHwgRVhUNF9JTU1VVEFCTEVfRkwpKSB7CisJCQlpZiAoIWNhcGFibGUoQ0FQX0xJTlVYX0lNTVVUQUJMRSkpIHsKKwkJCQltdXRleF91bmxvY2soJmlub2RlLT5pX211dGV4KTsKKwkJCQlyZXR1cm4gLUVQRVJNOworCQkJfQorCQl9CisKKwkJLyoKKwkJICogVGhlIEpPVVJOQUxfREFUQSBmbGFnIGNhbiBvbmx5IGJlIGNoYW5nZWQgYnkKKwkJICogdGhlIHJlbGV2YW50IGNhcGFiaWxpdHkuCisJCSAqLworCQlpZiAoKGpmbGFnIF4gb2xkZmxhZ3MpICYgKEVYVDRfSk9VUk5BTF9EQVRBX0ZMKSkgeworCQkJaWYgKCFjYXBhYmxlKENBUF9TWVNfUkVTT1VSQ0UpKSB7CisJCQkJbXV0ZXhfdW5sb2NrKCZpbm9kZS0+aV9tdXRleCk7CisJCQkJcmV0dXJuIC1FUEVSTTsKKwkJCX0KKwkJfQorCisKKwkJaGFuZGxlID0gZXh0NF9qb3VybmFsX3N0YXJ0KGlub2RlLCAxKTsKKwkJaWYgKElTX0VSUihoYW5kbGUpKSB7CisJCQltdXRleF91bmxvY2soJmlub2RlLT5pX211dGV4KTsKKwkJCXJldHVybiBQVFJfRVJSKGhhbmRsZSk7CisJCX0KKwkJaWYgKElTX1NZTkMoaW5vZGUpKQorCQkJaGFuZGxlLT5oX3N5bmMgPSAxOworCQllcnIgPSBleHQ0X3Jlc2VydmVfaW5vZGVfd3JpdGUoaGFuZGxlLCBpbm9kZSwgJmlsb2MpOworCQlpZiAoZXJyKQorCQkJZ290byBmbGFnc19lcnI7CisKKwkJZmxhZ3MgPSBmbGFncyAmIEVYVDRfRkxfVVNFUl9NT0RJRklBQkxFOworCQlmbGFncyB8PSBvbGRmbGFncyAmIH5FWFQ0X0ZMX1VTRVJfTU9ESUZJQUJMRTsKKwkJZWktPmlfZmxhZ3MgPSBmbGFnczsKKworCQlleHQ0X3NldF9pbm9kZV9mbGFncyhpbm9kZSk7CisJCWlub2RlLT5pX2N0aW1lID0gQ1VSUkVOVF9USU1FX1NFQzsKKworCQllcnIgPSBleHQ0X21hcmtfaWxvY19kaXJ0eShoYW5kbGUsIGlub2RlLCAmaWxvYyk7CitmbGFnc19lcnI6CisJCWV4dDRfam91cm5hbF9zdG9wKGhhbmRsZSk7CisJCWlmIChlcnIpIHsKKwkJCW11dGV4X3VubG9jaygmaW5vZGUtPmlfbXV0ZXgpOworCQkJcmV0dXJuIGVycjsKKwkJfQorCisJCWlmICgoamZsYWcgXiBvbGRmbGFncykgJiAoRVhUNF9KT1VSTkFMX0RBVEFfRkwpKQorCQkJZXJyID0gZXh0NF9jaGFuZ2VfaW5vZGVfam91cm5hbF9mbGFnKGlub2RlLCBqZmxhZyk7CisJCW11dGV4X3VubG9jaygmaW5vZGUtPmlfbXV0ZXgpOworCQlyZXR1cm4gZXJyOworCX0KKwljYXNlIEVYVDRfSU9DX0dFVFZFUlNJT046CisJY2FzZSBFWFQ0X0lPQ19HRVRWRVJTSU9OX09MRDoKKwkJcmV0dXJuIHB1dF91c2VyKGlub2RlLT5pX2dlbmVyYXRpb24sIChpbnQgX191c2VyICopIGFyZyk7CisJY2FzZSBFWFQ0X0lPQ19TRVRWRVJTSU9OOgorCWNhc2UgRVhUNF9JT0NfU0VUVkVSU0lPTl9PTEQ6IHsKKwkJaGFuZGxlX3QgKmhhbmRsZTsKKwkJc3RydWN0IGV4dDRfaWxvYyBpbG9jOworCQlfX3UzMiBnZW5lcmF0aW9uOworCQlpbnQgZXJyOworCisJCWlmICgoY3VycmVudC0+ZnN1aWQgIT0gaW5vZGUtPmlfdWlkKSAmJiAhY2FwYWJsZShDQVBfRk9XTkVSKSkKKwkJCXJldHVybiAtRVBFUk07CisJCWlmIChJU19SRE9OTFkoaW5vZGUpKQorCQkJcmV0dXJuIC1FUk9GUzsKKwkJaWYgKGdldF91c2VyKGdlbmVyYXRpb24sIChpbnQgX191c2VyICopIGFyZykpCisJCQlyZXR1cm4gLUVGQVVMVDsKKworCQloYW5kbGUgPSBleHQ0X2pvdXJuYWxfc3RhcnQoaW5vZGUsIDEpOworCQlpZiAoSVNfRVJSKGhhbmRsZSkpCisJCQlyZXR1cm4gUFRSX0VSUihoYW5kbGUpOworCQllcnIgPSBleHQ0X3Jlc2VydmVfaW5vZGVfd3JpdGUoaGFuZGxlLCBpbm9kZSwgJmlsb2MpOworCQlpZiAoZXJyID09IDApIHsKKwkJCWlub2RlLT5pX2N0aW1lID0gQ1VSUkVOVF9USU1FX1NFQzsKKwkJCWlub2RlLT5pX2dlbmVyYXRpb24gPSBnZW5lcmF0aW9uOworCQkJZXJyID0gZXh0NF9tYXJrX2lsb2NfZGlydHkoaGFuZGxlLCBpbm9kZSwgJmlsb2MpOworCQl9CisJCWV4dDRfam91cm5hbF9zdG9wKGhhbmRsZSk7CisJCXJldHVybiBlcnI7CisJfQorI2lmZGVmIENPTkZJR19KQkRfREVCVUcKKwljYXNlIEVYVDRfSU9DX1dBSVRfRk9SX1JFQURPTkxZOgorCQkvKgorCQkgKiBUaGlzIGlzIHJhY3kgLSBieSB0aGUgdGltZSB3ZSdyZSB3b2tlbiB1cCBhbmQgcnVubmluZywKKwkJICogdGhlIHN1cGVyYmxvY2sgY291bGQgYmUgcmVsZWFzZWQuICBBbmQgdGhlIG1vZHVsZSBjb3VsZAorCQkgKiBoYXZlIGJlZW4gdW5sb2FkZWQuICBTbyBzdWUgbWUuCisJCSAqCisJCSAqIFJldHVybnMgMSBpZiBpdCBzbGVwdCwgZWxzZSB6ZXJvLgorCQkgKi8KKwkJeworCQkJc3RydWN0IHN1cGVyX2Jsb2NrICpzYiA9IGlub2RlLT5pX3NiOworCQkJREVDTEFSRV9XQUlUUVVFVUUod2FpdCwgY3VycmVudCk7CisJCQlpbnQgcmV0ID0gMDsKKworCQkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKKwkJCWFkZF93YWl0X3F1ZXVlKCZFWFQ0X1NCKHNiKS0+cm9fd2FpdF9xdWV1ZSwgJndhaXQpOworCQkJaWYgKHRpbWVyX3BlbmRpbmcoJkVYVDRfU0Ioc2IpLT50dXJuX3JvX3RpbWVyKSkgeworCQkJCXNjaGVkdWxlKCk7CisJCQkJcmV0ID0gMTsKKwkJCX0KKwkJCXJlbW92ZV93YWl0X3F1ZXVlKCZFWFQ0X1NCKHNiKS0+cm9fd2FpdF9xdWV1ZSwgJndhaXQpOworCQkJcmV0dXJuIHJldDsKKwkJfQorI2VuZGlmCisJY2FzZSBFWFQ0X0lPQ19HRVRSU1ZTWjoKKwkJaWYgKHRlc3Rfb3B0KGlub2RlLT5pX3NiLCBSRVNFUlZBVElPTikKKwkJCSYmIFNfSVNSRUcoaW5vZGUtPmlfbW9kZSkKKwkJCSYmIGVpLT5pX2Jsb2NrX2FsbG9jX2luZm8pIHsKKwkJCXJzdl93aW5kb3dfc2l6ZSA9IGVpLT5pX2Jsb2NrX2FsbG9jX2luZm8tPnJzdl93aW5kb3dfbm9kZS5yc3ZfZ29hbF9zaXplOworCQkJcmV0dXJuIHB1dF91c2VyKHJzdl93aW5kb3dfc2l6ZSwgKGludCBfX3VzZXIgKilhcmcpOworCQl9CisJCXJldHVybiAtRU5PVFRZOworCWNhc2UgRVhUNF9JT0NfU0VUUlNWU1o6IHsKKworCQlpZiAoIXRlc3Rfb3B0KGlub2RlLT5pX3NiLCBSRVNFUlZBVElPTikgfHwhU19JU1JFRyhpbm9kZS0+aV9tb2RlKSkKKwkJCXJldHVybiAtRU5PVFRZOworCisJCWlmIChJU19SRE9OTFkoaW5vZGUpKQorCQkJcmV0dXJuIC1FUk9GUzsKKworCQlpZiAoKGN1cnJlbnQtPmZzdWlkICE9IGlub2RlLT5pX3VpZCkgJiYgIWNhcGFibGUoQ0FQX0ZPV05FUikpCisJCQlyZXR1cm4gLUVBQ0NFUzsKKworCQlpZiAoZ2V0X3VzZXIocnN2X3dpbmRvd19zaXplLCAoaW50IF9fdXNlciAqKWFyZykpCisJCQlyZXR1cm4gLUVGQVVMVDsKKworCQlpZiAocnN2X3dpbmRvd19zaXplID4gRVhUNF9NQVhfUkVTRVJWRV9CTE9DS1MpCisJCQlyc3Zfd2luZG93X3NpemUgPSBFWFQ0X01BWF9SRVNFUlZFX0JMT0NLUzsKKworCQkvKgorCQkgKiBuZWVkIHRvIGFsbG9jYXRlIHJlc2VydmF0aW9uIHN0cnVjdHVyZSBmb3IgdGhpcyBpbm9kZQorCQkgKiBiZWZvcmUgc2V0IHRoZSB3aW5kb3cgc2l6ZQorCQkgKi8KKwkJbXV0ZXhfbG9jaygmZWktPnRydW5jYXRlX211dGV4KTsKKwkJaWYgKCFlaS0+aV9ibG9ja19hbGxvY19pbmZvKQorCQkJZXh0NF9pbml0X2Jsb2NrX2FsbG9jX2luZm8oaW5vZGUpOworCisJCWlmIChlaS0+aV9ibG9ja19hbGxvY19pbmZvKXsKKwkJCXN0cnVjdCBleHQ0X3Jlc2VydmVfd2luZG93X25vZGUgKnJzdiA9ICZlaS0+aV9ibG9ja19hbGxvY19pbmZvLT5yc3Zfd2luZG93X25vZGU7CisJCQlyc3YtPnJzdl9nb2FsX3NpemUgPSByc3Zfd2luZG93X3NpemU7CisJCX0KKwkJbXV0ZXhfdW5sb2NrKCZlaS0+dHJ1bmNhdGVfbXV0ZXgpOworCQlyZXR1cm4gMDsKKwl9CisJY2FzZSBFWFQ0X0lPQ19HUk9VUF9FWFRFTkQ6IHsKKwkJZXh0NF9mc2Jsa190IG5fYmxvY2tzX2NvdW50OworCQlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiID0gaW5vZGUtPmlfc2I7CisJCWludCBlcnI7CisKKwkJaWYgKCFjYXBhYmxlKENBUF9TWVNfUkVTT1VSQ0UpKQorCQkJcmV0dXJuIC1FUEVSTTsKKworCQlpZiAoSVNfUkRPTkxZKGlub2RlKSkKKwkJCXJldHVybiAtRVJPRlM7CisKKwkJaWYgKGdldF91c2VyKG5fYmxvY2tzX2NvdW50LCAoX191MzIgX191c2VyICopYXJnKSkKKwkJCXJldHVybiAtRUZBVUxUOworCisJCWVyciA9IGV4dDRfZ3JvdXBfZXh0ZW5kKHNiLCBFWFQ0X1NCKHNiKS0+c19lcywgbl9ibG9ja3NfY291bnQpOworCQlqYmQyX2pvdXJuYWxfbG9ja191cGRhdGVzKEVYVDRfU0Ioc2IpLT5zX2pvdXJuYWwpOworCQlqYmQyX2pvdXJuYWxfZmx1c2goRVhUNF9TQihzYiktPnNfam91cm5hbCk7CisJCWpiZDJfam91cm5hbF91bmxvY2tfdXBkYXRlcyhFWFQ0X1NCKHNiKS0+c19qb3VybmFsKTsKKworCQlyZXR1cm4gZXJyOworCX0KKwljYXNlIEVYVDRfSU9DX0dST1VQX0FERDogeworCQlzdHJ1Y3QgZXh0NF9uZXdfZ3JvdXBfZGF0YSBpbnB1dDsKKwkJc3RydWN0IHN1cGVyX2Jsb2NrICpzYiA9IGlub2RlLT5pX3NiOworCQlpbnQgZXJyOworCisJCWlmICghY2FwYWJsZShDQVBfU1lTX1JFU09VUkNFKSkKKwkJCXJldHVybiAtRVBFUk07CisKKwkJaWYgKElTX1JET05MWShpbm9kZSkpCisJCQlyZXR1cm4gLUVST0ZTOworCisJCWlmIChjb3B5X2Zyb21fdXNlcigmaW5wdXQsIChzdHJ1Y3QgZXh0NF9uZXdfZ3JvdXBfaW5wdXQgX191c2VyICopYXJnLAorCQkJCXNpemVvZihpbnB1dCkpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisKKwkJZXJyID0gZXh0NF9ncm91cF9hZGQoc2IsICZpbnB1dCk7CisJCWpiZDJfam91cm5hbF9sb2NrX3VwZGF0ZXMoRVhUNF9TQihzYiktPnNfam91cm5hbCk7CisJCWpiZDJfam91cm5hbF9mbHVzaChFWFQ0X1NCKHNiKS0+c19qb3VybmFsKTsKKwkJamJkMl9qb3VybmFsX3VubG9ja191cGRhdGVzKEVYVDRfU0Ioc2IpLT5zX2pvdXJuYWwpOworCisJCXJldHVybiBlcnI7CisJfQorCisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FTk9UVFk7CisJfQorfQorCisjaWZkZWYgQ09ORklHX0NPTVBBVAorbG9uZyBleHQ0X2NvbXBhdF9pb2N0bChzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJc3RydWN0IGlub2RlICppbm9kZSA9IGZpbGUtPmZfZGVudHJ5LT5kX2lub2RlOworCWludCByZXQ7CisKKwkvKiBUaGVzZSBhcmUganVzdCBtaXNuYW1lZCwgdGhleSBhY3R1YWxseSBnZXQvcHV0IGZyb20vdG8gdXNlciBhbiBpbnQgKi8KKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgRVhUNF9JT0MzMl9HRVRGTEFHUzoKKwkJY21kID0gRVhUNF9JT0NfR0VURkxBR1M7CisJCWJyZWFrOworCWNhc2UgRVhUNF9JT0MzMl9TRVRGTEFHUzoKKwkJY21kID0gRVhUNF9JT0NfU0VURkxBR1M7CisJCWJyZWFrOworCWNhc2UgRVhUNF9JT0MzMl9HRVRWRVJTSU9OOgorCQljbWQgPSBFWFQ0X0lPQ19HRVRWRVJTSU9OOworCQlicmVhazsKKwljYXNlIEVYVDRfSU9DMzJfU0VUVkVSU0lPTjoKKwkJY21kID0gRVhUNF9JT0NfU0VUVkVSU0lPTjsKKwkJYnJlYWs7CisJY2FzZSBFWFQ0X0lPQzMyX0dST1VQX0VYVEVORDoKKwkJY21kID0gRVhUNF9JT0NfR1JPVVBfRVhURU5EOworCQlicmVhazsKKwljYXNlIEVYVDRfSU9DMzJfR0VUVkVSU0lPTl9PTEQ6CisJCWNtZCA9IEVYVDRfSU9DX0dFVFZFUlNJT05fT0xEOworCQlicmVhazsKKwljYXNlIEVYVDRfSU9DMzJfU0VUVkVSU0lPTl9PTEQ6CisJCWNtZCA9IEVYVDRfSU9DX1NFVFZFUlNJT05fT0xEOworCQlicmVhazsKKyNpZmRlZiBDT05GSUdfSkJEX0RFQlVHCisJY2FzZSBFWFQ0X0lPQzMyX1dBSVRfRk9SX1JFQURPTkxZOgorCQljbWQgPSBFWFQ0X0lPQ19XQUlUX0ZPUl9SRUFET05MWTsKKwkJYnJlYWs7CisjZW5kaWYKKwljYXNlIEVYVDRfSU9DMzJfR0VUUlNWU1o6CisJCWNtZCA9IEVYVDRfSU9DX0dFVFJTVlNaOworCQlicmVhazsKKwljYXNlIEVYVDRfSU9DMzJfU0VUUlNWU1o6CisJCWNtZCA9IEVYVDRfSU9DX1NFVFJTVlNaOworCQlicmVhazsKKwljYXNlIEVYVDRfSU9DX0dST1VQX0FERDoKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FTk9JT0NUTENNRDsKKwl9CisJbG9ja19rZXJuZWwoKTsKKwlyZXQgPSBleHQ0X2lvY3RsKGlub2RlLCBmaWxlLCBjbWQsICh1bnNpZ25lZCBsb25nKSBjb21wYXRfcHRyKGFyZykpOworCXVubG9ja19rZXJuZWwoKTsKKwlyZXR1cm4gcmV0OworfQorI2VuZGlmCmRpZmYgLS1naXQgYS9mcy9leHQ0L25hbWVpLmMgYi9mcy9leHQ0L25hbWVpLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGIxYmQwMwotLS0gL2Rldi9udWxsCisrKyBiL2ZzL2V4dDQvbmFtZWkuYwpAQCAtMCwwICsxLDIzOTUgQEAKKy8qCisgKiAgbGludXgvZnMvZXh0NC9uYW1laS5jCisgKgorICogQ29weXJpZ2h0IChDKSAxOTkyLCAxOTkzLCAxOTk0LCAxOTk1CisgKiBSZW15IENhcmQgKGNhcmRAbWFzaS5pYnAuZnIpCisgKiBMYWJvcmF0b2lyZSBNQVNJIC0gSW5zdGl0dXQgQmxhaXNlIFBhc2NhbAorICogVW5pdmVyc2l0ZSBQaWVycmUgZXQgTWFyaWUgQ3VyaWUgKFBhcmlzIFZJKQorICoKKyAqICBmcm9tCisgKgorICogIGxpbnV4L2ZzL21pbml4L25hbWVpLmMKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAxOTkxLCAxOTkyICBMaW51cyBUb3J2YWxkcworICoKKyAqICBCaWctZW5kaWFuIHRvIGxpdHRsZS1lbmRpYW4gYnl0ZS1zd2FwcGluZy9iaXRtYXBzIGJ5CisgKiAgICAgICAgRGF2aWQgUy4gTWlsbGVyIChkYXZlbUBjYWlwLnJ1dGdlcnMuZWR1KSwgMTk5NQorICogIERpcmVjdG9yeSBlbnRyeSBmaWxlIHR5cGUgc3VwcG9ydCBhbmQgZm9yd2FyZCBjb21wYXRpYmlsaXR5IGhvb2tzCisgKglmb3IgQi10cmVlIGRpcmVjdG9yaWVzIGJ5IFRoZW9kb3JlIFRzJ28gKHR5dHNvQG1pdC5lZHUpLCAxOTk4CisgKiAgSGFzaCBUcmVlIERpcmVjdG9yeSBpbmRleGluZyAoYykKKyAqCURhbmllbCBQaGlsbGlwcywgMjAwMQorICogIEhhc2ggVHJlZSBEaXJlY3RvcnkgaW5kZXhpbmcgcG9ydGluZworICoJQ2hyaXN0b3BoZXIgTGksIDIwMDIKKyAqICBIYXNoIFRyZWUgRGlyZWN0b3J5IGluZGV4aW5nIGNsZWFudXAKKyAqCVRoZW9kb3JlIFRzJ28sIDIwMDIKKyAqLworCisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9wYWdlbWFwLmg+CisjaW5jbHVkZSA8bGludXgvamJkMi5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWUuaD4KKyNpbmNsdWRlIDxsaW51eC9leHQ0X2ZzLmg+CisjaW5jbHVkZSA8bGludXgvZXh0NF9qYmQyLmg+CisjaW5jbHVkZSA8bGludXgvZmNudGwuaD4KKyNpbmNsdWRlIDxsaW51eC9zdGF0Lmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvcXVvdGFvcHMuaD4KKyNpbmNsdWRlIDxsaW51eC9idWZmZXJfaGVhZC5oPgorI2luY2x1ZGUgPGxpbnV4L2Jpby5oPgorI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+CisKKyNpbmNsdWRlICJuYW1laS5oIgorI2luY2x1ZGUgInhhdHRyLmgiCisjaW5jbHVkZSAiYWNsLmgiCisKKy8qCisgKiBkZWZpbmUgaG93IGZhciBhaGVhZCB0byByZWFkIGRpcmVjdG9yaWVzIHdoaWxlIHNlYXJjaGluZyB0aGVtLgorICovCisjZGVmaW5lIE5BTUVJX1JBX0NIVU5LUyAgMgorI2RlZmluZSBOQU1FSV9SQV9CTE9DS1MgIDQKKyNkZWZpbmUgTkFNRUlfUkFfU0laRSAgICAgICAgKE5BTUVJX1JBX0NIVU5LUyAqIE5BTUVJX1JBX0JMT0NLUykKKyNkZWZpbmUgTkFNRUlfUkFfSU5ERVgoYyxiKSAgKCgoYykgKiBOQU1FSV9SQV9CTE9DS1MpICsgKGIpKQorCitzdGF0aWMgc3RydWN0IGJ1ZmZlcl9oZWFkICpleHQ0X2FwcGVuZChoYW5kbGVfdCAqaGFuZGxlLAorCQkJCQlzdHJ1Y3QgaW5vZGUgKmlub2RlLAorCQkJCQl1MzIgKmJsb2NrLCBpbnQgKmVycikKK3sKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoOworCisJKmJsb2NrID0gaW5vZGUtPmlfc2l6ZSA+PiBpbm9kZS0+aV9zYi0+c19ibG9ja3NpemVfYml0czsKKworCWlmICgoYmggPSBleHQ0X2JyZWFkKGhhbmRsZSwgaW5vZGUsICpibG9jaywgMSwgZXJyKSkpIHsKKwkJaW5vZGUtPmlfc2l6ZSArPSBpbm9kZS0+aV9zYi0+c19ibG9ja3NpemU7CisJCUVYVDRfSShpbm9kZSktPmlfZGlza3NpemUgPSBpbm9kZS0+aV9zaXplOworCQlleHQ0X2pvdXJuYWxfZ2V0X3dyaXRlX2FjY2VzcyhoYW5kbGUsYmgpOworCX0KKwlyZXR1cm4gYmg7Cit9CisKKyNpZm5kZWYgYXNzZXJ0CisjZGVmaW5lIGFzc2VydCh0ZXN0KSBKX0FTU0VSVCh0ZXN0KQorI2VuZGlmCisKKyNpZm5kZWYgc3dhcAorI2RlZmluZSBzd2FwKHgsIHkpIGRvIHsgdHlwZW9mKHgpIHogPSB4OyB4ID0geTsgeSA9IHo7IH0gd2hpbGUgKDApCisjZW5kaWYKKworI2lmZGVmIERYX0RFQlVHCisjZGVmaW5lIGR4dHJhY2UoY29tbWFuZCkgY29tbWFuZAorI2Vsc2UKKyNkZWZpbmUgZHh0cmFjZShjb21tYW5kKQorI2VuZGlmCisKK3N0cnVjdCBmYWtlX2RpcmVudAoreworCV9fbGUzMiBpbm9kZTsKKwlfX2xlMTYgcmVjX2xlbjsKKwl1OCBuYW1lX2xlbjsKKwl1OCBmaWxlX3R5cGU7Cit9OworCitzdHJ1Y3QgZHhfY291bnRsaW1pdAoreworCV9fbGUxNiBsaW1pdDsKKwlfX2xlMTYgY291bnQ7Cit9OworCitzdHJ1Y3QgZHhfZW50cnkKK3sKKwlfX2xlMzIgaGFzaDsKKwlfX2xlMzIgYmxvY2s7Cit9OworCisvKgorICogZHhfcm9vdF9pbmZvIGlzIGxhaWQgb3V0IHNvIHRoYXQgaWYgaXQgc2hvdWxkIHNvbWVob3cgZ2V0IG92ZXJsYWlkIGJ5IGEKKyAqIGRpcmVudCB0aGUgdHdvIGxvdyBiaXRzIG9mIHRoZSBoYXNoIHZlcnNpb24gd2lsbCBiZSB6ZXJvLiAgVGhlcmVmb3JlLCB0aGUKKyAqIGhhc2ggdmVyc2lvbiBtb2QgNCBzaG91bGQgbmV2ZXIgYmUgMC4gIFNpbmNlcmVseSwgdGhlIHBhcmFub2lhIGRlcGFydG1lbnQuCisgKi8KKworc3RydWN0IGR4X3Jvb3QKK3sKKwlzdHJ1Y3QgZmFrZV9kaXJlbnQgZG90OworCWNoYXIgZG90X25hbWVbNF07CisJc3RydWN0IGZha2VfZGlyZW50IGRvdGRvdDsKKwljaGFyIGRvdGRvdF9uYW1lWzRdOworCXN0cnVjdCBkeF9yb290X2luZm8KKwl7CisJCV9fbGUzMiByZXNlcnZlZF96ZXJvOworCQl1OCBoYXNoX3ZlcnNpb247CisJCXU4IGluZm9fbGVuZ3RoOyAvKiA4ICovCisJCXU4IGluZGlyZWN0X2xldmVsczsKKwkJdTggdW51c2VkX2ZsYWdzOworCX0KKwlpbmZvOworCXN0cnVjdCBkeF9lbnRyeQllbnRyaWVzWzBdOworfTsKKworc3RydWN0IGR4X25vZGUKK3sKKwlzdHJ1Y3QgZmFrZV9kaXJlbnQgZmFrZTsKKwlzdHJ1Y3QgZHhfZW50cnkJZW50cmllc1swXTsKK307CisKKworc3RydWN0IGR4X2ZyYW1lCit7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaDsKKwlzdHJ1Y3QgZHhfZW50cnkgKmVudHJpZXM7CisJc3RydWN0IGR4X2VudHJ5ICphdDsKK307CisKK3N0cnVjdCBkeF9tYXBfZW50cnkKK3sKKwl1MzIgaGFzaDsKKwl1MzIgb2ZmczsKK307CisKKyNpZmRlZiBDT05GSUdfRVhUNF9JTkRFWAorc3RhdGljIGlubGluZSB1bnNpZ25lZCBkeF9nZXRfYmxvY2sgKHN0cnVjdCBkeF9lbnRyeSAqZW50cnkpOworc3RhdGljIHZvaWQgZHhfc2V0X2Jsb2NrIChzdHJ1Y3QgZHhfZW50cnkgKmVudHJ5LCB1bnNpZ25lZCB2YWx1ZSk7CitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGR4X2dldF9oYXNoIChzdHJ1Y3QgZHhfZW50cnkgKmVudHJ5KTsKK3N0YXRpYyB2b2lkIGR4X3NldF9oYXNoIChzdHJ1Y3QgZHhfZW50cnkgKmVudHJ5LCB1bnNpZ25lZCB2YWx1ZSk7CitzdGF0aWMgdW5zaWduZWQgZHhfZ2V0X2NvdW50IChzdHJ1Y3QgZHhfZW50cnkgKmVudHJpZXMpOworc3RhdGljIHVuc2lnbmVkIGR4X2dldF9saW1pdCAoc3RydWN0IGR4X2VudHJ5ICplbnRyaWVzKTsKK3N0YXRpYyB2b2lkIGR4X3NldF9jb3VudCAoc3RydWN0IGR4X2VudHJ5ICplbnRyaWVzLCB1bnNpZ25lZCB2YWx1ZSk7CitzdGF0aWMgdm9pZCBkeF9zZXRfbGltaXQgKHN0cnVjdCBkeF9lbnRyeSAqZW50cmllcywgdW5zaWduZWQgdmFsdWUpOworc3RhdGljIHVuc2lnbmVkIGR4X3Jvb3RfbGltaXQgKHN0cnVjdCBpbm9kZSAqZGlyLCB1bnNpZ25lZCBpbmZvc2l6ZSk7CitzdGF0aWMgdW5zaWduZWQgZHhfbm9kZV9saW1pdCAoc3RydWN0IGlub2RlICpkaXIpOworc3RhdGljIHN0cnVjdCBkeF9mcmFtZSAqZHhfcHJvYmUoc3RydWN0IGRlbnRyeSAqZGVudHJ5LAorCQkJCSBzdHJ1Y3QgaW5vZGUgKmRpciwKKwkJCQkgc3RydWN0IGR4X2hhc2hfaW5mbyAqaGluZm8sCisJCQkJIHN0cnVjdCBkeF9mcmFtZSAqZnJhbWUsCisJCQkJIGludCAqZXJyKTsKK3N0YXRpYyB2b2lkIGR4X3JlbGVhc2UgKHN0cnVjdCBkeF9mcmFtZSAqZnJhbWVzKTsKK3N0YXRpYyBpbnQgZHhfbWFrZV9tYXAgKHN0cnVjdCBleHQ0X2Rpcl9lbnRyeV8yICpkZSwgaW50IHNpemUsCisJCQlzdHJ1Y3QgZHhfaGFzaF9pbmZvICpoaW5mbywgc3RydWN0IGR4X21hcF9lbnRyeSBtYXBbXSk7CitzdGF0aWMgdm9pZCBkeF9zb3J0X21hcChzdHJ1Y3QgZHhfbWFwX2VudHJ5ICptYXAsIHVuc2lnbmVkIGNvdW50KTsKK3N0YXRpYyBzdHJ1Y3QgZXh0NF9kaXJfZW50cnlfMiAqZHhfbW92ZV9kaXJlbnRzIChjaGFyICpmcm9tLCBjaGFyICp0bywKKwkJc3RydWN0IGR4X21hcF9lbnRyeSAqb2Zmc2V0cywgaW50IGNvdW50KTsKK3N0YXRpYyBzdHJ1Y3QgZXh0NF9kaXJfZW50cnlfMiogZHhfcGFja19kaXJlbnRzIChjaGFyICpiYXNlLCBpbnQgc2l6ZSk7CitzdGF0aWMgdm9pZCBkeF9pbnNlcnRfYmxvY2sgKHN0cnVjdCBkeF9mcmFtZSAqZnJhbWUsIHUzMiBoYXNoLCB1MzIgYmxvY2spOworc3RhdGljIGludCBleHQ0X2h0cmVlX25leHRfYmxvY2soc3RydWN0IGlub2RlICpkaXIsIF9fdTMyIGhhc2gsCisJCQkJIHN0cnVjdCBkeF9mcmFtZSAqZnJhbWUsCisJCQkJIHN0cnVjdCBkeF9mcmFtZSAqZnJhbWVzLAorCQkJCSBfX3UzMiAqc3RhcnRfaGFzaCk7CitzdGF0aWMgc3RydWN0IGJ1ZmZlcl9oZWFkICogZXh0NF9keF9maW5kX2VudHJ5KHN0cnVjdCBkZW50cnkgKmRlbnRyeSwKKwkJICAgICAgIHN0cnVjdCBleHQ0X2Rpcl9lbnRyeV8yICoqcmVzX2RpciwgaW50ICplcnIpOworc3RhdGljIGludCBleHQ0X2R4X2FkZF9lbnRyeShoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnksCisJCQkgICAgIHN0cnVjdCBpbm9kZSAqaW5vZGUpOworCisvKgorICogRnV0dXJlOiB1c2UgaGlnaCBmb3VyIGJpdHMgb2YgYmxvY2sgZm9yIGNvYWxlc2NlLW9uLWRlbGV0ZSBmbGFncworICogTWFzayB0aGVtIG9mZiBmb3Igbm93LgorICovCisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgZHhfZ2V0X2Jsb2NrIChzdHJ1Y3QgZHhfZW50cnkgKmVudHJ5KQoreworCXJldHVybiBsZTMyX3RvX2NwdShlbnRyeS0+YmxvY2spICYgMHgwMGZmZmZmZjsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGR4X3NldF9ibG9jayAoc3RydWN0IGR4X2VudHJ5ICplbnRyeSwgdW5zaWduZWQgdmFsdWUpCit7CisJZW50cnktPmJsb2NrID0gY3B1X3RvX2xlMzIodmFsdWUpOworfQorCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGR4X2dldF9oYXNoIChzdHJ1Y3QgZHhfZW50cnkgKmVudHJ5KQoreworCXJldHVybiBsZTMyX3RvX2NwdShlbnRyeS0+aGFzaCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBkeF9zZXRfaGFzaCAoc3RydWN0IGR4X2VudHJ5ICplbnRyeSwgdW5zaWduZWQgdmFsdWUpCit7CisJZW50cnktPmhhc2ggPSBjcHVfdG9fbGUzMih2YWx1ZSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgZHhfZ2V0X2NvdW50IChzdHJ1Y3QgZHhfZW50cnkgKmVudHJpZXMpCit7CisJcmV0dXJuIGxlMTZfdG9fY3B1KCgoc3RydWN0IGR4X2NvdW50bGltaXQgKikgZW50cmllcyktPmNvdW50KTsKK30KKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBkeF9nZXRfbGltaXQgKHN0cnVjdCBkeF9lbnRyeSAqZW50cmllcykKK3sKKwlyZXR1cm4gbGUxNl90b19jcHUoKChzdHJ1Y3QgZHhfY291bnRsaW1pdCAqKSBlbnRyaWVzKS0+bGltaXQpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgZHhfc2V0X2NvdW50IChzdHJ1Y3QgZHhfZW50cnkgKmVudHJpZXMsIHVuc2lnbmVkIHZhbHVlKQoreworCSgoc3RydWN0IGR4X2NvdW50bGltaXQgKikgZW50cmllcyktPmNvdW50ID0gY3B1X3RvX2xlMTYodmFsdWUpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgZHhfc2V0X2xpbWl0IChzdHJ1Y3QgZHhfZW50cnkgKmVudHJpZXMsIHVuc2lnbmVkIHZhbHVlKQoreworCSgoc3RydWN0IGR4X2NvdW50bGltaXQgKikgZW50cmllcyktPmxpbWl0ID0gY3B1X3RvX2xlMTYodmFsdWUpOworfQorCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGR4X3Jvb3RfbGltaXQgKHN0cnVjdCBpbm9kZSAqZGlyLCB1bnNpZ25lZCBpbmZvc2l6ZSkKK3sKKwl1bnNpZ25lZCBlbnRyeV9zcGFjZSA9IGRpci0+aV9zYi0+c19ibG9ja3NpemUgLSBFWFQ0X0RJUl9SRUNfTEVOKDEpIC0KKwkJRVhUNF9ESVJfUkVDX0xFTigyKSAtIGluZm9zaXplOworCXJldHVybiAwPyAyMDogZW50cnlfc3BhY2UgLyBzaXplb2Yoc3RydWN0IGR4X2VudHJ5KTsKK30KKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBkeF9ub2RlX2xpbWl0IChzdHJ1Y3QgaW5vZGUgKmRpcikKK3sKKwl1bnNpZ25lZCBlbnRyeV9zcGFjZSA9IGRpci0+aV9zYi0+c19ibG9ja3NpemUgLSBFWFQ0X0RJUl9SRUNfTEVOKDApOworCXJldHVybiAwPyAyMjogZW50cnlfc3BhY2UgLyBzaXplb2Yoc3RydWN0IGR4X2VudHJ5KTsKK30KKworLyoKKyAqIERlYnVnCisgKi8KKyNpZmRlZiBEWF9ERUJVRworc3RhdGljIHZvaWQgZHhfc2hvd19pbmRleCAoY2hhciAqIGxhYmVsLCBzdHJ1Y3QgZHhfZW50cnkgKmVudHJpZXMpCit7CisJaW50IGksIG4gPSBkeF9nZXRfY291bnQgKGVudHJpZXMpOworICAgICAgICBwcmludGsoIiVzIGluZGV4ICIsIGxhYmVsKTsKKwlmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7CisJCXByaW50aygiJXgtPiV1ICIsIGk/IGR4X2dldF9oYXNoKGVudHJpZXMgKyBpKSA6CisJCQkJMCwgZHhfZ2V0X2Jsb2NrKGVudHJpZXMgKyBpKSk7CisJfQorCXByaW50aygiXG4iKTsKK30KKworc3RydWN0IHN0YXRzCit7CisJdW5zaWduZWQgbmFtZXM7CisJdW5zaWduZWQgc3BhY2U7CisJdW5zaWduZWQgYmNvdW50OworfTsKKworc3RhdGljIHN0cnVjdCBzdGF0cyBkeF9zaG93X2xlYWYoc3RydWN0IGR4X2hhc2hfaW5mbyAqaGluZm8sIHN0cnVjdCBleHQ0X2Rpcl9lbnRyeV8yICpkZSwKKwkJCQkgaW50IHNpemUsIGludCBzaG93X25hbWVzKQoreworCXVuc2lnbmVkIG5hbWVzID0gMCwgc3BhY2UgPSAwOworCWNoYXIgKmJhc2UgPSAoY2hhciAqKSBkZTsKKwlzdHJ1Y3QgZHhfaGFzaF9pbmZvIGggPSAqaGluZm87CisKKwlwcmludGsoIm5hbWVzOiAiKTsKKwl3aGlsZSAoKGNoYXIgKikgZGUgPCBiYXNlICsgc2l6ZSkKKwl7CisJCWlmIChkZS0+aW5vZGUpCisJCXsKKwkJCWlmIChzaG93X25hbWVzKQorCQkJeworCQkJCWludCBsZW4gPSBkZS0+bmFtZV9sZW47CisJCQkJY2hhciAqbmFtZSA9IGRlLT5uYW1lOworCQkJCXdoaWxlIChsZW4tLSkgcHJpbnRrKCIlYyIsICpuYW1lKyspOworCQkJCWV4dDRmc19kaXJoYXNoKGRlLT5uYW1lLCBkZS0+bmFtZV9sZW4sICZoKTsKKwkJCQlwcmludGsoIjoleC4ldSAiLCBoLmhhc2gsCisJCQkJICAgICAgICgoY2hhciAqKSBkZSAtIGJhc2UpKTsKKwkJCX0KKwkJCXNwYWNlICs9IEVYVDRfRElSX1JFQ19MRU4oZGUtPm5hbWVfbGVuKTsKKwkJCW5hbWVzKys7CisJCX0KKwkJZGUgPSAoc3RydWN0IGV4dDRfZGlyX2VudHJ5XzIgKikgKChjaGFyICopIGRlICsgbGUxNl90b19jcHUoZGUtPnJlY19sZW4pKTsKKwl9CisJcHJpbnRrKCIoJWkpXG4iLCBuYW1lcyk7CisJcmV0dXJuIChzdHJ1Y3Qgc3RhdHMpIHsgbmFtZXMsIHNwYWNlLCAxIH07Cit9CisKK3N0cnVjdCBzdGF0cyBkeF9zaG93X2VudHJpZXMoc3RydWN0IGR4X2hhc2hfaW5mbyAqaGluZm8sIHN0cnVjdCBpbm9kZSAqZGlyLAorCQkJICAgICBzdHJ1Y3QgZHhfZW50cnkgKmVudHJpZXMsIGludCBsZXZlbHMpCit7CisJdW5zaWduZWQgYmxvY2tzaXplID0gZGlyLT5pX3NiLT5zX2Jsb2Nrc2l6ZTsKKwl1bnNpZ25lZCBjb3VudCA9IGR4X2dldF9jb3VudCAoZW50cmllcyksIG5hbWVzID0gMCwgc3BhY2UgPSAwLCBpOworCXVuc2lnbmVkIGJjb3VudCA9IDA7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaDsKKwlpbnQgZXJyOworCXByaW50aygiJWkgaW5kZXhlZCBibG9ja3MuLi5cbiIsIGNvdW50KTsKKwlmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKywgZW50cmllcysrKQorCXsKKwkJdTMyIGJsb2NrID0gZHhfZ2V0X2Jsb2NrKGVudHJpZXMpLCBoYXNoID0gaT8gZHhfZ2V0X2hhc2goZW50cmllcyk6IDA7CisJCXUzMiByYW5nZSA9IGkgPCBjb3VudCAtIDE/IChkeF9nZXRfaGFzaChlbnRyaWVzICsgMSkgLSBoYXNoKTogfmhhc2g7CisJCXN0cnVjdCBzdGF0cyBzdGF0czsKKwkJcHJpbnRrKCIlcyUzdTolMDN1IGhhc2ggJTh4LyU4eCAiLGxldmVscz8iIjoiICAgIiwgaSwgYmxvY2ssIGhhc2gsIHJhbmdlKTsKKwkJaWYgKCEoYmggPSBleHQ0X2JyZWFkIChOVUxMLGRpciwgYmxvY2ssIDAsJmVycikpKSBjb250aW51ZTsKKwkJc3RhdHMgPSBsZXZlbHM/CisJCSAgIGR4X3Nob3dfZW50cmllcyhoaW5mbywgZGlyLCAoKHN0cnVjdCBkeF9ub2RlICopIGJoLT5iX2RhdGEpLT5lbnRyaWVzLCBsZXZlbHMgLSAxKToKKwkJICAgZHhfc2hvd19sZWFmKGhpbmZvLCAoc3RydWN0IGV4dDRfZGlyX2VudHJ5XzIgKikgYmgtPmJfZGF0YSwgYmxvY2tzaXplLCAwKTsKKwkJbmFtZXMgKz0gc3RhdHMubmFtZXM7CisJCXNwYWNlICs9IHN0YXRzLnNwYWNlOworCQliY291bnQgKz0gc3RhdHMuYmNvdW50OworCQlicmVsc2UgKGJoKTsKKwl9CisJaWYgKGJjb3VudCkKKwkJcHJpbnRrKCIlc25hbWVzICV1LCBmdWxsbmVzcyAldSAoJXUlJSlcbiIsIGxldmVscz8iIjoiICAgIiwKKwkJCW5hbWVzLCBzcGFjZS9iY291bnQsKHNwYWNlL2Jjb3VudCkqMTAwL2Jsb2Nrc2l6ZSk7CisJcmV0dXJuIChzdHJ1Y3Qgc3RhdHMpIHsgbmFtZXMsIHNwYWNlLCBiY291bnR9OworfQorI2VuZGlmIC8qIERYX0RFQlVHICovCisKKy8qCisgKiBQcm9iZSBmb3IgYSBkaXJlY3RvcnkgbGVhZiBibG9jayB0byBzZWFyY2guCisgKgorICogZHhfcHJvYmUgY2FuIHJldHVybiBFUlJfQkFEX0RYX0RJUiwgd2hpY2ggbWVhbnMgdGhlcmUgd2FzIGEgZm9ybWF0CisgKiBlcnJvciBpbiB0aGUgZGlyZWN0b3J5IGluZGV4LCBhbmQgdGhlIGNhbGxlciBzaG91bGQgZmFsbCBiYWNrIHRvCisgKiBzZWFyY2hpbmcgdGhlIGRpcmVjdG9yeSBub3JtYWxseS4gIFRoZSBjYWxsZXJzIG9mIGR4X3Byb2JlICoqTVVTVCoqCisgKiBjaGVjayBmb3IgdGhpcyBlcnJvciBjb2RlLCBhbmQgbWFrZSBzdXJlIGl0IG5ldmVyIGdldHMgcmVmbGVjdGVkCisgKiBiYWNrIHRvIHVzZXJzcGFjZS4KKyAqLworc3RhdGljIHN0cnVjdCBkeF9mcmFtZSAqCitkeF9wcm9iZShzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIHN0cnVjdCBpbm9kZSAqZGlyLAorCSBzdHJ1Y3QgZHhfaGFzaF9pbmZvICpoaW5mbywgc3RydWN0IGR4X2ZyYW1lICpmcmFtZV9pbiwgaW50ICplcnIpCit7CisJdW5zaWduZWQgY291bnQsIGluZGlyZWN0OworCXN0cnVjdCBkeF9lbnRyeSAqYXQsICplbnRyaWVzLCAqcCwgKnEsICptOworCXN0cnVjdCBkeF9yb290ICpyb290OworCXN0cnVjdCBidWZmZXJfaGVhZCAqYmg7CisJc3RydWN0IGR4X2ZyYW1lICpmcmFtZSA9IGZyYW1lX2luOworCXUzMiBoYXNoOworCisJZnJhbWUtPmJoID0gTlVMTDsKKwlpZiAoZGVudHJ5KQorCQlkaXIgPSBkZW50cnktPmRfcGFyZW50LT5kX2lub2RlOworCWlmICghKGJoID0gZXh0NF9icmVhZCAoTlVMTCxkaXIsIDAsIDAsIGVycikpKQorCQlnb3RvIGZhaWw7CisJcm9vdCA9IChzdHJ1Y3QgZHhfcm9vdCAqKSBiaC0+Yl9kYXRhOworCWlmIChyb290LT5pbmZvLmhhc2hfdmVyc2lvbiAhPSBEWF9IQVNIX1RFQSAmJgorCSAgICByb290LT5pbmZvLmhhc2hfdmVyc2lvbiAhPSBEWF9IQVNIX0hBTEZfTUQ0ICYmCisJICAgIHJvb3QtPmluZm8uaGFzaF92ZXJzaW9uICE9IERYX0hBU0hfTEVHQUNZKSB7CisJCWV4dDRfd2FybmluZyhkaXItPmlfc2IsIF9fRlVOQ1RJT05fXywKKwkJCSAgICAgIlVucmVjb2duaXNlZCBpbm9kZSBoYXNoIGNvZGUgJWQiLAorCQkJICAgICByb290LT5pbmZvLmhhc2hfdmVyc2lvbik7CisJCWJyZWxzZShiaCk7CisJCSplcnIgPSBFUlJfQkFEX0RYX0RJUjsKKwkJZ290byBmYWlsOworCX0KKwloaW5mby0+aGFzaF92ZXJzaW9uID0gcm9vdC0+aW5mby5oYXNoX3ZlcnNpb247CisJaGluZm8tPnNlZWQgPSBFWFQ0X1NCKGRpci0+aV9zYiktPnNfaGFzaF9zZWVkOworCWlmIChkZW50cnkpCisJCWV4dDRmc19kaXJoYXNoKGRlbnRyeS0+ZF9uYW1lLm5hbWUsIGRlbnRyeS0+ZF9uYW1lLmxlbiwgaGluZm8pOworCWhhc2ggPSBoaW5mby0+aGFzaDsKKworCWlmIChyb290LT5pbmZvLnVudXNlZF9mbGFncyAmIDEpIHsKKwkJZXh0NF93YXJuaW5nKGRpci0+aV9zYiwgX19GVU5DVElPTl9fLAorCQkJICAgICAiVW5pbXBsZW1lbnRlZCBpbm9kZSBoYXNoIGZsYWdzOiAlIzA2eCIsCisJCQkgICAgIHJvb3QtPmluZm8udW51c2VkX2ZsYWdzKTsKKwkJYnJlbHNlKGJoKTsKKwkJKmVyciA9IEVSUl9CQURfRFhfRElSOworCQlnb3RvIGZhaWw7CisJfQorCisJaWYgKChpbmRpcmVjdCA9IHJvb3QtPmluZm8uaW5kaXJlY3RfbGV2ZWxzKSA+IDEpIHsKKwkJZXh0NF93YXJuaW5nKGRpci0+aV9zYiwgX19GVU5DVElPTl9fLAorCQkJICAgICAiVW5pbXBsZW1lbnRlZCBpbm9kZSBoYXNoIGRlcHRoOiAlIzA2eCIsCisJCQkgICAgIHJvb3QtPmluZm8uaW5kaXJlY3RfbGV2ZWxzKTsKKwkJYnJlbHNlKGJoKTsKKwkJKmVyciA9IEVSUl9CQURfRFhfRElSOworCQlnb3RvIGZhaWw7CisJfQorCisJZW50cmllcyA9IChzdHJ1Y3QgZHhfZW50cnkgKikgKCgoY2hhciAqKSZyb290LT5pbmZvKSArCisJCQkJICAgICAgIHJvb3QtPmluZm8uaW5mb19sZW5ndGgpOworCWFzc2VydChkeF9nZXRfbGltaXQoZW50cmllcykgPT0gZHhfcm9vdF9saW1pdChkaXIsCisJCQkJCQkgICAgICByb290LT5pbmZvLmluZm9fbGVuZ3RoKSk7CisJZHh0cmFjZSAocHJpbnRrKCJMb29rIHVwICV4IiwgaGFzaCkpOworCXdoaWxlICgxKQorCXsKKwkJY291bnQgPSBkeF9nZXRfY291bnQoZW50cmllcyk7CisJCWFzc2VydCAoY291bnQgJiYgY291bnQgPD0gZHhfZ2V0X2xpbWl0KGVudHJpZXMpKTsKKwkJcCA9IGVudHJpZXMgKyAxOworCQlxID0gZW50cmllcyArIGNvdW50IC0gMTsKKwkJd2hpbGUgKHAgPD0gcSkKKwkJeworCQkJbSA9IHAgKyAocSAtIHApLzI7CisJCQlkeHRyYWNlKHByaW50aygiLiIpKTsKKwkJCWlmIChkeF9nZXRfaGFzaChtKSA+IGhhc2gpCisJCQkJcSA9IG0gLSAxOworCQkJZWxzZQorCQkJCXAgPSBtICsgMTsKKwkJfQorCisJCWlmICgwKSAvLyBsaW5lYXIgc2VhcmNoIGNyb3NzIGNoZWNrCisJCXsKKwkJCXVuc2lnbmVkIG4gPSBjb3VudCAtIDE7CisJCQlhdCA9IGVudHJpZXM7CisJCQl3aGlsZSAobi0tKQorCQkJeworCQkJCWR4dHJhY2UocHJpbnRrKCIsIikpOworCQkJCWlmIChkeF9nZXRfaGFzaCgrK2F0KSA+IGhhc2gpCisJCQkJeworCQkJCQlhdC0tOworCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisJCQlhc3NlcnQgKGF0ID09IHAgLSAxKTsKKwkJfQorCisJCWF0ID0gcCAtIDE7CisJCWR4dHJhY2UocHJpbnRrKCIgJXgtPiV1XG4iLCBhdCA9PSBlbnRyaWVzPyAwOiBkeF9nZXRfaGFzaChhdCksIGR4X2dldF9ibG9jayhhdCkpKTsKKwkJZnJhbWUtPmJoID0gYmg7CisJCWZyYW1lLT5lbnRyaWVzID0gZW50cmllczsKKwkJZnJhbWUtPmF0ID0gYXQ7CisJCWlmICghaW5kaXJlY3QtLSkgcmV0dXJuIGZyYW1lOworCQlpZiAoIShiaCA9IGV4dDRfYnJlYWQgKE5VTEwsZGlyLCBkeF9nZXRfYmxvY2soYXQpLCAwLCBlcnIpKSkKKwkJCWdvdG8gZmFpbDI7CisJCWF0ID0gZW50cmllcyA9ICgoc3RydWN0IGR4X25vZGUgKikgYmgtPmJfZGF0YSktPmVudHJpZXM7CisJCWFzc2VydCAoZHhfZ2V0X2xpbWl0KGVudHJpZXMpID09IGR4X25vZGVfbGltaXQgKGRpcikpOworCQlmcmFtZSsrOworCX0KK2ZhaWwyOgorCXdoaWxlIChmcmFtZSA+PSBmcmFtZV9pbikgeworCQlicmVsc2UoZnJhbWUtPmJoKTsKKwkJZnJhbWUtLTsKKwl9CitmYWlsOgorCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgdm9pZCBkeF9yZWxlYXNlIChzdHJ1Y3QgZHhfZnJhbWUgKmZyYW1lcykKK3sKKwlpZiAoZnJhbWVzWzBdLmJoID09IE5VTEwpCisJCXJldHVybjsKKworCWlmICgoKHN0cnVjdCBkeF9yb290ICopIGZyYW1lc1swXS5iaC0+Yl9kYXRhKS0+aW5mby5pbmRpcmVjdF9sZXZlbHMpCisJCWJyZWxzZShmcmFtZXNbMV0uYmgpOworCWJyZWxzZShmcmFtZXNbMF0uYmgpOworfQorCisvKgorICogVGhpcyBmdW5jdGlvbiBpbmNyZW1lbnRzIHRoZSBmcmFtZSBwb2ludGVyIHRvIHNlYXJjaCB0aGUgbmV4dCBsZWFmCisgKiBibG9jaywgYW5kIHJlYWRzIGluIHRoZSBuZWNlc3NhcnkgaW50ZXJ2ZW5pbmcgbm9kZXMgaWYgdGhlIHNlYXJjaAorICogc2hvdWxkIGJlIG5lY2Vzc2FyeS4gIFdoZXRoZXIgb3Igbm90IHRoZSBzZWFyY2ggaXMgbmVjZXNzYXJ5IGlzCisgKiBjb250cm9sbGVkIGJ5IHRoZSBoYXNoIHBhcmFtZXRlci4gIElmIHRoZSBoYXNoIHZhbHVlIGlzIGV2ZW4sIHRoZW4KKyAqIHRoZSBzZWFyY2ggaXMgb25seSBjb250aW51ZWQgaWYgdGhlIG5leHQgYmxvY2sgc3RhcnRzIHdpdGggdGhhdAorICogaGFzaCB2YWx1ZS4gIFRoaXMgaXMgdXNlZCBpZiB3ZSBhcmUgc2VhcmNoaW5nIGZvciBhIHNwZWNpZmljIGZpbGUuCisgKgorICogSWYgdGhlIGhhc2ggdmFsdWUgaXMgSEFTSF9OQl9BTFdBWVMsIHRoZW4gYWx3YXlzIGdvIHRvIHRoZSBuZXh0IGJsb2NrLgorICoKKyAqIFRoaXMgZnVuY3Rpb24gcmV0dXJucyAxIGlmIHRoZSBjYWxsZXIgc2hvdWxkIGNvbnRpbnVlIHRvIHNlYXJjaCwKKyAqIG9yIDAgaWYgaXQgc2hvdWxkIG5vdC4gIElmIHRoZXJlIGlzIGFuIGVycm9yIHJlYWRpbmcgb25lIG9mIHRoZQorICogaW5kZXggYmxvY2tzLCBpdCB3aWxsIGEgbmVnYXRpdmUgZXJyb3IgY29kZS4KKyAqCisgKiBJZiBzdGFydF9oYXNoIGlzIG5vbi1udWxsLCBpdCB3aWxsIGJlIGZpbGxlZCBpbiB3aXRoIHRoZSBzdGFydGluZworICogaGFzaCBvZiB0aGUgbmV4dCBwYWdlLgorICovCitzdGF0aWMgaW50IGV4dDRfaHRyZWVfbmV4dF9ibG9jayhzdHJ1Y3QgaW5vZGUgKmRpciwgX191MzIgaGFzaCwKKwkJCQkgc3RydWN0IGR4X2ZyYW1lICpmcmFtZSwKKwkJCQkgc3RydWN0IGR4X2ZyYW1lICpmcmFtZXMsCisJCQkJIF9fdTMyICpzdGFydF9oYXNoKQoreworCXN0cnVjdCBkeF9mcmFtZSAqcDsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoOworCWludCBlcnIsIG51bV9mcmFtZXMgPSAwOworCV9fdTMyIGJoYXNoOworCisJcCA9IGZyYW1lOworCS8qCisJICogRmluZCB0aGUgbmV4dCBsZWFmIHBhZ2UgYnkgaW5jcmVtZW50aW5nIHRoZSBmcmFtZSBwb2ludGVyLgorCSAqIElmIHdlIHJ1biBvdXQgb2YgZW50cmllcyBpbiB0aGUgaW50ZXJpb3Igbm9kZSwgbG9vcCBhcm91bmQgYW5kCisJICogaW5jcmVtZW50IHBvaW50ZXIgaW4gdGhlIHBhcmVudCBub2RlLiAgV2hlbiB3ZSBicmVhayBvdXQgb2YKKwkgKiB0aGlzIGxvb3AsIG51bV9mcmFtZXMgaW5kaWNhdGVzIHRoZSBudW1iZXIgb2YgaW50ZXJpb3IKKwkgKiBub2RlcyBuZWVkIHRvIGJlIHJlYWQuCisJICovCisJd2hpbGUgKDEpIHsKKwkJaWYgKCsrKHAtPmF0KSA8IHAtPmVudHJpZXMgKyBkeF9nZXRfY291bnQocC0+ZW50cmllcykpCisJCQlicmVhazsKKwkJaWYgKHAgPT0gZnJhbWVzKQorCQkJcmV0dXJuIDA7CisJCW51bV9mcmFtZXMrKzsKKwkJcC0tOworCX0KKworCS8qCisJICogSWYgdGhlIGhhc2ggaXMgMSwgdGhlbiBjb250aW51ZSBvbmx5IGlmIHRoZSBuZXh0IHBhZ2UgaGFzIGEKKwkgKiBjb250aW51YXRpb24gaGFzaCBvZiBhbnkgdmFsdWUuICBUaGlzIGlzIHVzZWQgZm9yIHJlYWRkaXIKKwkgKiBoYW5kbGluZy4gIE90aGVyd2lzZSwgY2hlY2sgdG8gc2VlIGlmIHRoZSBoYXNoIG1hdGNoZXMgdGhlCisJICogZGVzaXJlZCBjb250aXVhdGlvbiBoYXNoLiAgSWYgaXQgZG9lc24ndCwgcmV0dXJuIHNpbmNlCisJICogdGhlcmUncyBubyBwb2ludCB0byByZWFkIGluIHRoZSBzdWNjZXNzaXZlIGluZGV4IHBhZ2VzLgorCSAqLworCWJoYXNoID0gZHhfZ2V0X2hhc2gocC0+YXQpOworCWlmIChzdGFydF9oYXNoKQorCQkqc3RhcnRfaGFzaCA9IGJoYXNoOworCWlmICgoaGFzaCAmIDEpID09IDApIHsKKwkJaWYgKChiaGFzaCAmIH4xKSAhPSBoYXNoKQorCQkJcmV0dXJuIDA7CisJfQorCS8qCisJICogSWYgdGhlIGhhc2ggaXMgSEFTSF9OQl9BTFdBWVMsIHdlIGFsd2F5cyBnbyB0byB0aGUgbmV4dAorCSAqIGJsb2NrIHNvIG5vIGNoZWNrIGlzIG5lY2Vzc2FyeQorCSAqLworCXdoaWxlIChudW1fZnJhbWVzLS0pIHsKKwkJaWYgKCEoYmggPSBleHQ0X2JyZWFkKE5VTEwsIGRpciwgZHhfZ2V0X2Jsb2NrKHAtPmF0KSwKKwkJCQkgICAgICAwLCAmZXJyKSkpCisJCQlyZXR1cm4gZXJyOyAvKiBGYWlsdXJlICovCisJCXArKzsKKwkJYnJlbHNlIChwLT5iaCk7CisJCXAtPmJoID0gYmg7CisJCXAtPmF0ID0gcC0+ZW50cmllcyA9ICgoc3RydWN0IGR4X25vZGUgKikgYmgtPmJfZGF0YSktPmVudHJpZXM7CisJfQorCXJldHVybiAxOworfQorCisKKy8qCisgKiBwIGlzIGF0IGxlYXN0IDYgYnl0ZXMgYmVmb3JlIHRoZSBlbmQgb2YgcGFnZQorICovCitzdGF0aWMgaW5saW5lIHN0cnVjdCBleHQ0X2Rpcl9lbnRyeV8yICpleHQ0X25leHRfZW50cnkoc3RydWN0IGV4dDRfZGlyX2VudHJ5XzIgKnApCit7CisJcmV0dXJuIChzdHJ1Y3QgZXh0NF9kaXJfZW50cnlfMiAqKSgoY2hhciopcCArIGxlMTZfdG9fY3B1KHAtPnJlY19sZW4pKTsKK30KKworLyoKKyAqIFRoaXMgZnVuY3Rpb24gZmlsbHMgYSByZWQtYmxhY2sgdHJlZSB3aXRoIGluZm9ybWF0aW9uIGZyb20gYQorICogZGlyZWN0b3J5IGJsb2NrLiAgSXQgcmV0dXJucyB0aGUgbnVtYmVyIGRpcmVjdG9yeSBlbnRyaWVzIGxvYWRlZAorICogaW50byB0aGUgdHJlZS4gIElmIHRoZXJlIGlzIGFuIGVycm9yIGl0IGlzIHJldHVybmVkIGluIGVyci4KKyAqLworc3RhdGljIGludCBodHJlZV9kaXJibG9ja190b190cmVlKHN0cnVjdCBmaWxlICpkaXJfZmlsZSwKKwkJCQkgIHN0cnVjdCBpbm9kZSAqZGlyLCBpbnQgYmxvY2ssCisJCQkJICBzdHJ1Y3QgZHhfaGFzaF9pbmZvICpoaW5mbywKKwkJCQkgIF9fdTMyIHN0YXJ0X2hhc2gsIF9fdTMyIHN0YXJ0X21pbm9yX2hhc2gpCit7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaDsKKwlzdHJ1Y3QgZXh0NF9kaXJfZW50cnlfMiAqZGUsICp0b3A7CisJaW50IGVyciwgY291bnQgPSAwOworCisJZHh0cmFjZShwcmludGsoIkluIGh0cmVlIGRpcmJsb2NrX3RvX3RyZWU6IGJsb2NrICVkXG4iLCBibG9jaykpOworCWlmICghKGJoID0gZXh0NF9icmVhZCAoTlVMTCwgZGlyLCBibG9jaywgMCwgJmVycikpKQorCQlyZXR1cm4gZXJyOworCisJZGUgPSAoc3RydWN0IGV4dDRfZGlyX2VudHJ5XzIgKikgYmgtPmJfZGF0YTsKKwl0b3AgPSAoc3RydWN0IGV4dDRfZGlyX2VudHJ5XzIgKikgKChjaGFyICopIGRlICsKKwkJCQkJICAgZGlyLT5pX3NiLT5zX2Jsb2Nrc2l6ZSAtCisJCQkJCSAgIEVYVDRfRElSX1JFQ19MRU4oMCkpOworCWZvciAoOyBkZSA8IHRvcDsgZGUgPSBleHQ0X25leHRfZW50cnkoZGUpKSB7CisJCWV4dDRmc19kaXJoYXNoKGRlLT5uYW1lLCBkZS0+bmFtZV9sZW4sIGhpbmZvKTsKKwkJaWYgKChoaW5mby0+aGFzaCA8IHN0YXJ0X2hhc2gpIHx8CisJCSAgICAoKGhpbmZvLT5oYXNoID09IHN0YXJ0X2hhc2gpICYmCisJCSAgICAgKGhpbmZvLT5taW5vcl9oYXNoIDwgc3RhcnRfbWlub3JfaGFzaCkpKQorCQkJY29udGludWU7CisJCWlmIChkZS0+aW5vZGUgPT0gMCkKKwkJCWNvbnRpbnVlOworCQlpZiAoKGVyciA9IGV4dDRfaHRyZWVfc3RvcmVfZGlyZW50KGRpcl9maWxlLAorCQkJCSAgIGhpbmZvLT5oYXNoLCBoaW5mby0+bWlub3JfaGFzaCwgZGUpKSAhPSAwKSB7CisJCQlicmVsc2UoYmgpOworCQkJcmV0dXJuIGVycjsKKwkJfQorCQljb3VudCsrOworCX0KKwlicmVsc2UoYmgpOworCXJldHVybiBjb3VudDsKK30KKworCisvKgorICogVGhpcyBmdW5jdGlvbiBmaWxscyBhIHJlZC1ibGFjayB0cmVlIHdpdGggaW5mb3JtYXRpb24gZnJvbSBhCisgKiBkaXJlY3RvcnkuICBXZSBzdGFydCBzY2FubmluZyB0aGUgZGlyZWN0b3J5IGluIGhhc2ggb3JkZXIsIHN0YXJ0aW5nCisgKiBhdCBzdGFydF9oYXNoIGFuZCBzdGFydF9taW5vcl9oYXNoLgorICoKKyAqIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGUgbnVtYmVyIG9mIGVudHJpZXMgaW5zZXJ0ZWQgaW50byB0aGUgdHJlZSwKKyAqIG9yIGEgbmVnYXRpdmUgZXJyb3IgY29kZS4KKyAqLworaW50IGV4dDRfaHRyZWVfZmlsbF90cmVlKHN0cnVjdCBmaWxlICpkaXJfZmlsZSwgX191MzIgc3RhcnRfaGFzaCwKKwkJCSBfX3UzMiBzdGFydF9taW5vcl9oYXNoLCBfX3UzMiAqbmV4dF9oYXNoKQoreworCXN0cnVjdCBkeF9oYXNoX2luZm8gaGluZm87CisJc3RydWN0IGV4dDRfZGlyX2VudHJ5XzIgKmRlOworCXN0cnVjdCBkeF9mcmFtZSBmcmFtZXNbMl0sICpmcmFtZTsKKwlzdHJ1Y3QgaW5vZGUgKmRpcjsKKwlpbnQgYmxvY2ssIGVycjsKKwlpbnQgY291bnQgPSAwOworCWludCByZXQ7CisJX191MzIgaGFzaHZhbDsKKworCWR4dHJhY2UocHJpbnRrKCJJbiBodHJlZV9maWxsX3RyZWUsIHN0YXJ0IGhhc2g6ICV4OiV4XG4iLCBzdGFydF9oYXNoLAorCQkgICAgICAgc3RhcnRfbWlub3JfaGFzaCkpOworCWRpciA9IGRpcl9maWxlLT5mX2RlbnRyeS0+ZF9pbm9kZTsKKwlpZiAoIShFWFQ0X0koZGlyKS0+aV9mbGFncyAmIEVYVDRfSU5ERVhfRkwpKSB7CisJCWhpbmZvLmhhc2hfdmVyc2lvbiA9IEVYVDRfU0IoZGlyLT5pX3NiKS0+c19kZWZfaGFzaF92ZXJzaW9uOworCQloaW5mby5zZWVkID0gRVhUNF9TQihkaXItPmlfc2IpLT5zX2hhc2hfc2VlZDsKKwkJY291bnQgPSBodHJlZV9kaXJibG9ja190b190cmVlKGRpcl9maWxlLCBkaXIsIDAsICZoaW5mbywKKwkJCQkJICAgICAgIHN0YXJ0X2hhc2gsIHN0YXJ0X21pbm9yX2hhc2gpOworCQkqbmV4dF9oYXNoID0gfjA7CisJCXJldHVybiBjb3VudDsKKwl9CisJaGluZm8uaGFzaCA9IHN0YXJ0X2hhc2g7CisJaGluZm8ubWlub3JfaGFzaCA9IDA7CisJZnJhbWUgPSBkeF9wcm9iZShOVUxMLCBkaXJfZmlsZS0+Zl9kZW50cnktPmRfaW5vZGUsICZoaW5mbywgZnJhbWVzLCAmZXJyKTsKKwlpZiAoIWZyYW1lKQorCQlyZXR1cm4gZXJyOworCisJLyogQWRkICcuJyBhbmQgJy4uJyBmcm9tIHRoZSBodHJlZSBoZWFkZXIgKi8KKwlpZiAoIXN0YXJ0X2hhc2ggJiYgIXN0YXJ0X21pbm9yX2hhc2gpIHsKKwkJZGUgPSAoc3RydWN0IGV4dDRfZGlyX2VudHJ5XzIgKikgZnJhbWVzWzBdLmJoLT5iX2RhdGE7CisJCWlmICgoZXJyID0gZXh0NF9odHJlZV9zdG9yZV9kaXJlbnQoZGlyX2ZpbGUsIDAsIDAsIGRlKSkgIT0gMCkKKwkJCWdvdG8gZXJyb3V0OworCQljb3VudCsrOworCX0KKwlpZiAoc3RhcnRfaGFzaCA8IDIgfHwgKHN0YXJ0X2hhc2ggPT0yICYmIHN0YXJ0X21pbm9yX2hhc2g9PTApKSB7CisJCWRlID0gKHN0cnVjdCBleHQ0X2Rpcl9lbnRyeV8yICopIGZyYW1lc1swXS5iaC0+Yl9kYXRhOworCQlkZSA9IGV4dDRfbmV4dF9lbnRyeShkZSk7CisJCWlmICgoZXJyID0gZXh0NF9odHJlZV9zdG9yZV9kaXJlbnQoZGlyX2ZpbGUsIDIsIDAsIGRlKSkgIT0gMCkKKwkJCWdvdG8gZXJyb3V0OworCQljb3VudCsrOworCX0KKworCXdoaWxlICgxKSB7CisJCWJsb2NrID0gZHhfZ2V0X2Jsb2NrKGZyYW1lLT5hdCk7CisJCXJldCA9IGh0cmVlX2RpcmJsb2NrX3RvX3RyZWUoZGlyX2ZpbGUsIGRpciwgYmxvY2ssICZoaW5mbywKKwkJCQkJICAgICBzdGFydF9oYXNoLCBzdGFydF9taW5vcl9oYXNoKTsKKwkJaWYgKHJldCA8IDApIHsKKwkJCWVyciA9IHJldDsKKwkJCWdvdG8gZXJyb3V0OworCQl9CisJCWNvdW50ICs9IHJldDsKKwkJaGFzaHZhbCA9IH4wOworCQlyZXQgPSBleHQ0X2h0cmVlX25leHRfYmxvY2soZGlyLCBIQVNIX05CX0FMV0FZUywKKwkJCQkJICAgIGZyYW1lLCBmcmFtZXMsICZoYXNodmFsKTsKKwkJKm5leHRfaGFzaCA9IGhhc2h2YWw7CisJCWlmIChyZXQgPCAwKSB7CisJCQllcnIgPSByZXQ7CisJCQlnb3RvIGVycm91dDsKKwkJfQorCQkvKgorCQkgKiBTdG9wIGlmOiAgKGEpIHRoZXJlIGFyZSBubyBtb3JlIGVudHJpZXMsIG9yCisJCSAqIChiKSB3ZSBoYXZlIGluc2VydGVkIGF0IGxlYXN0IG9uZSBlbnRyeSBhbmQgdGhlCisJCSAqIG5leHQgaGFzaCB2YWx1ZSBpcyBub3QgYSBjb250aW51YXRpb24KKwkJICovCisJCWlmICgocmV0ID09IDApIHx8CisJCSAgICAoY291bnQgJiYgKChoYXNodmFsICYgMSkgPT0gMCkpKQorCQkJYnJlYWs7CisJfQorCWR4X3JlbGVhc2UoZnJhbWVzKTsKKwlkeHRyYWNlKHByaW50aygiRmlsbCB0cmVlOiByZXR1cm5lZCAlZCBlbnRyaWVzLCBuZXh0IGhhc2g6ICV4XG4iLAorCQkgICAgICAgY291bnQsICpuZXh0X2hhc2gpKTsKKwlyZXR1cm4gY291bnQ7CitlcnJvdXQ6CisJZHhfcmVsZWFzZShmcmFtZXMpOworCXJldHVybiAoZXJyKTsKK30KKworCisvKgorICogRGlyZWN0b3J5IGJsb2NrIHNwbGl0dGluZywgY29tcGFjdGluZworICovCisKK3N0YXRpYyBpbnQgZHhfbWFrZV9tYXAgKHN0cnVjdCBleHQ0X2Rpcl9lbnRyeV8yICpkZSwgaW50IHNpemUsCisJCQlzdHJ1Y3QgZHhfaGFzaF9pbmZvICpoaW5mbywgc3RydWN0IGR4X21hcF9lbnRyeSAqbWFwX3RhaWwpCit7CisJaW50IGNvdW50ID0gMDsKKwljaGFyICpiYXNlID0gKGNoYXIgKikgZGU7CisJc3RydWN0IGR4X2hhc2hfaW5mbyBoID0gKmhpbmZvOworCisJd2hpbGUgKChjaGFyICopIGRlIDwgYmFzZSArIHNpemUpCisJeworCQlpZiAoZGUtPm5hbWVfbGVuICYmIGRlLT5pbm9kZSkgeworCQkJZXh0NGZzX2Rpcmhhc2goZGUtPm5hbWUsIGRlLT5uYW1lX2xlbiwgJmgpOworCQkJbWFwX3RhaWwtLTsKKwkJCW1hcF90YWlsLT5oYXNoID0gaC5oYXNoOworCQkJbWFwX3RhaWwtPm9mZnMgPSAodTMyKSAoKGNoYXIgKikgZGUgLSBiYXNlKTsKKwkJCWNvdW50Kys7CisJCQljb25kX3Jlc2NoZWQoKTsKKwkJfQorCQkvKiBYWFg6IGRvIHdlIG5lZWQgdG8gY2hlY2sgcmVjX2xlbiA9PSAwIGNhc2U/IC1DaHJpcyAqLworCQlkZSA9IChzdHJ1Y3QgZXh0NF9kaXJfZW50cnlfMiAqKSAoKGNoYXIgKikgZGUgKyBsZTE2X3RvX2NwdShkZS0+cmVjX2xlbikpOworCX0KKwlyZXR1cm4gY291bnQ7Cit9CisKK3N0YXRpYyB2b2lkIGR4X3NvcnRfbWFwIChzdHJ1Y3QgZHhfbWFwX2VudHJ5ICptYXAsIHVuc2lnbmVkIGNvdW50KQoreworCXN0cnVjdCBkeF9tYXBfZW50cnkgKnAsICpxLCAqdG9wID0gbWFwICsgY291bnQgLSAxOworCWludCBtb3JlOworCS8qIENvbWJzb3J0IHVudGlsIGJ1YmJsZSBzb3J0IGRvZXNuJ3Qgc3VjayAqLworCXdoaWxlIChjb3VudCA+IDIpIHsKKwkJY291bnQgPSBjb3VudCoxMC8xMzsKKwkJaWYgKGNvdW50IC0gOSA8IDIpIC8qIDksIDEwIC0+IDExICovCisJCQljb3VudCA9IDExOworCQlmb3IgKHAgPSB0b3AsIHEgPSBwIC0gY291bnQ7IHEgPj0gbWFwOyBwLS0sIHEtLSkKKwkJCWlmIChwLT5oYXNoIDwgcS0+aGFzaCkKKwkJCQlzd2FwKCpwLCAqcSk7CisJfQorCS8qIEdhcmRlbiB2YXJpZXR5IGJ1YmJsZSBzb3J0ICovCisJZG8geworCQltb3JlID0gMDsKKwkJcSA9IHRvcDsKKwkJd2hpbGUgKHEtLSA+IG1hcCkgeworCQkJaWYgKHFbMV0uaGFzaCA+PSBxWzBdLmhhc2gpCisJCQkJY29udGludWU7CisJCQlzd2FwKCoocSsxKSwgKnEpOworCQkJbW9yZSA9IDE7CisJCX0KKwl9IHdoaWxlKG1vcmUpOworfQorCitzdGF0aWMgdm9pZCBkeF9pbnNlcnRfYmxvY2soc3RydWN0IGR4X2ZyYW1lICpmcmFtZSwgdTMyIGhhc2gsIHUzMiBibG9jaykKK3sKKwlzdHJ1Y3QgZHhfZW50cnkgKmVudHJpZXMgPSBmcmFtZS0+ZW50cmllczsKKwlzdHJ1Y3QgZHhfZW50cnkgKm9sZCA9IGZyYW1lLT5hdCwgKm5ldyA9IG9sZCArIDE7CisJaW50IGNvdW50ID0gZHhfZ2V0X2NvdW50KGVudHJpZXMpOworCisJYXNzZXJ0KGNvdW50IDwgZHhfZ2V0X2xpbWl0KGVudHJpZXMpKTsKKwlhc3NlcnQob2xkIDwgZW50cmllcyArIGNvdW50KTsKKwltZW1tb3ZlKG5ldyArIDEsIG5ldywgKGNoYXIgKikoZW50cmllcyArIGNvdW50KSAtIChjaGFyICopKG5ldykpOworCWR4X3NldF9oYXNoKG5ldywgaGFzaCk7CisJZHhfc2V0X2Jsb2NrKG5ldywgYmxvY2spOworCWR4X3NldF9jb3VudChlbnRyaWVzLCBjb3VudCArIDEpOworfQorI2VuZGlmCisKKworc3RhdGljIHZvaWQgZXh0NF91cGRhdGVfZHhfZmxhZyhzdHJ1Y3QgaW5vZGUgKmlub2RlKQoreworCWlmICghRVhUNF9IQVNfQ09NUEFUX0ZFQVRVUkUoaW5vZGUtPmlfc2IsCisJCQkJICAgICBFWFQ0X0ZFQVRVUkVfQ09NUEFUX0RJUl9JTkRFWCkpCisJCUVYVDRfSShpbm9kZSktPmlfZmxhZ3MgJj0gfkVYVDRfSU5ERVhfRkw7Cit9CisKKy8qCisgKiBOT1RFISB1bmxpa2Ugc3RybmNtcCwgZXh0NF9tYXRjaCByZXR1cm5zIDEgZm9yIHN1Y2Nlc3MsIDAgZm9yIGZhaWx1cmUuCisgKgorICogYGxlbiA8PSBFWFQ0X05BTUVfTEVOJyBpcyBndWFyYW50ZWVkIGJ5IGNhbGxlci4KKyAqIGBkZSAhPSBOVUxMJyBpcyBndWFyYW50ZWVkIGJ5IGNhbGxlci4KKyAqLworc3RhdGljIGlubGluZSBpbnQgZXh0NF9tYXRjaCAoaW50IGxlbiwgY29uc3QgY2hhciAqIGNvbnN0IG5hbWUsCisJCQkgICAgICBzdHJ1Y3QgZXh0NF9kaXJfZW50cnlfMiAqIGRlKQoreworCWlmIChsZW4gIT0gZGUtPm5hbWVfbGVuKQorCQlyZXR1cm4gMDsKKwlpZiAoIWRlLT5pbm9kZSkKKwkJcmV0dXJuIDA7CisJcmV0dXJuICFtZW1jbXAobmFtZSwgZGUtPm5hbWUsIGxlbik7Cit9CisKKy8qCisgKiBSZXR1cm5zIDAgaWYgbm90IGZvdW5kLCAtMSBvbiBmYWlsdXJlLCBhbmQgMSBvbiBzdWNjZXNzCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IHNlYXJjaF9kaXJibG9jayhzdHJ1Y3QgYnVmZmVyX2hlYWQgKiBiaCwKKwkJCQkgIHN0cnVjdCBpbm9kZSAqZGlyLAorCQkJCSAgc3RydWN0IGRlbnRyeSAqZGVudHJ5LAorCQkJCSAgdW5zaWduZWQgbG9uZyBvZmZzZXQsCisJCQkJICBzdHJ1Y3QgZXh0NF9kaXJfZW50cnlfMiAqKiByZXNfZGlyKQoreworCXN0cnVjdCBleHQ0X2Rpcl9lbnRyeV8yICogZGU7CisJY2hhciAqIGRsaW1pdDsKKwlpbnQgZGVfbGVuOworCWNvbnN0IGNoYXIgKm5hbWUgPSBkZW50cnktPmRfbmFtZS5uYW1lOworCWludCBuYW1lbGVuID0gZGVudHJ5LT5kX25hbWUubGVuOworCisJZGUgPSAoc3RydWN0IGV4dDRfZGlyX2VudHJ5XzIgKikgYmgtPmJfZGF0YTsKKwlkbGltaXQgPSBiaC0+Yl9kYXRhICsgZGlyLT5pX3NiLT5zX2Jsb2Nrc2l6ZTsKKwl3aGlsZSAoKGNoYXIgKikgZGUgPCBkbGltaXQpIHsKKwkJLyogdGhpcyBjb2RlIGlzIGV4ZWN1dGVkIHF1YWRyYXRpY2FsbHkgb2Z0ZW4gKi8KKwkJLyogZG8gbWluaW1hbCBjaGVja2luZyBgYnkgaGFuZCcgKi8KKworCQlpZiAoKGNoYXIgKikgZGUgKyBuYW1lbGVuIDw9IGRsaW1pdCAmJgorCQkgICAgZXh0NF9tYXRjaCAobmFtZWxlbiwgbmFtZSwgZGUpKSB7CisJCQkvKiBmb3VuZCBhIG1hdGNoIC0ganVzdCB0byBiZSBzdXJlLCBkbyBhIGZ1bGwgY2hlY2sgKi8KKwkJCWlmICghZXh0NF9jaGVja19kaXJfZW50cnkoImV4dDRfZmluZF9lbnRyeSIsCisJCQkJCQkgIGRpciwgZGUsIGJoLCBvZmZzZXQpKQorCQkJCXJldHVybiAtMTsKKwkJCSpyZXNfZGlyID0gZGU7CisJCQlyZXR1cm4gMTsKKwkJfQorCQkvKiBwcmV2ZW50IGxvb3Bpbmcgb24gYSBiYWQgYmxvY2sgKi8KKwkJZGVfbGVuID0gbGUxNl90b19jcHUoZGUtPnJlY19sZW4pOworCQlpZiAoZGVfbGVuIDw9IDApCisJCQlyZXR1cm4gLTE7CisJCW9mZnNldCArPSBkZV9sZW47CisJCWRlID0gKHN0cnVjdCBleHQ0X2Rpcl9lbnRyeV8yICopICgoY2hhciAqKSBkZSArIGRlX2xlbik7CisJfQorCXJldHVybiAwOworfQorCisKKy8qCisgKglleHQ0X2ZpbmRfZW50cnkoKQorICoKKyAqIGZpbmRzIGFuIGVudHJ5IGluIHRoZSBzcGVjaWZpZWQgZGlyZWN0b3J5IHdpdGggdGhlIHdhbnRlZCBuYW1lLiBJdAorICogcmV0dXJucyB0aGUgY2FjaGUgYnVmZmVyIGluIHdoaWNoIHRoZSBlbnRyeSB3YXMgZm91bmQsIGFuZCB0aGUgZW50cnkKKyAqIGl0c2VsZiAoYXMgYSBwYXJhbWV0ZXIgLSByZXNfZGlyKS4gSXQgZG9lcyBOT1QgcmVhZCB0aGUgaW5vZGUgb2YgdGhlCisgKiBlbnRyeSAtIHlvdSdsbCBoYXZlIHRvIGRvIHRoYXQgeW91cnNlbGYgaWYgeW91IHdhbnQgdG8uCisgKgorICogVGhlIHJldHVybmVkIGJ1ZmZlcl9oZWFkIGhhcyAtPmJfY291bnQgZWxldmF0ZWQuICBUaGUgY2FsbGVyIGlzIGV4cGVjdGVkCisgKiB0byBicmVsc2UoKSBpdCB3aGVuIGFwcHJvcHJpYXRlLgorICovCitzdGF0aWMgc3RydWN0IGJ1ZmZlcl9oZWFkICogZXh0NF9maW5kX2VudHJ5IChzdHJ1Y3QgZGVudHJ5ICpkZW50cnksCisJCQkJCXN0cnVjdCBleHQ0X2Rpcl9lbnRyeV8yICoqIHJlc19kaXIpCit7CisJc3RydWN0IHN1cGVyX2Jsb2NrICogc2I7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICogYmhfdXNlW05BTUVJX1JBX1NJWkVdOworCXN0cnVjdCBidWZmZXJfaGVhZCAqIGJoLCAqcmV0ID0gTlVMTDsKKwl1bnNpZ25lZCBsb25nIHN0YXJ0LCBibG9jaywgYjsKKwlpbnQgcmFfbWF4ID0gMDsJCS8qIE51bWJlciBvZiBiaCdzIGluIHRoZSByZWFkYWhlYWQKKwkJCQkgICBidWZmZXIsIGJoX3VzZVtdICovCisJaW50IHJhX3B0ciA9IDA7CQkvKiBDdXJyZW50IGluZGV4IGludG8gcmVhZGFoZWFkCisJCQkJICAgYnVmZmVyICovCisJaW50IG51bSA9IDA7CisJaW50IG5ibG9ja3MsIGksIGVycjsKKwlzdHJ1Y3QgaW5vZGUgKmRpciA9IGRlbnRyeS0+ZF9wYXJlbnQtPmRfaW5vZGU7CisJaW50IG5hbWVsZW47CisJY29uc3QgdTggKm5hbWU7CisJdW5zaWduZWQgYmxvY2tzaXplOworCisJKnJlc19kaXIgPSBOVUxMOworCXNiID0gZGlyLT5pX3NiOworCWJsb2Nrc2l6ZSA9IHNiLT5zX2Jsb2Nrc2l6ZTsKKwluYW1lbGVuID0gZGVudHJ5LT5kX25hbWUubGVuOworCW5hbWUgPSBkZW50cnktPmRfbmFtZS5uYW1lOworCWlmIChuYW1lbGVuID4gRVhUNF9OQU1FX0xFTikKKwkJcmV0dXJuIE5VTEw7CisjaWZkZWYgQ09ORklHX0VYVDRfSU5ERVgKKwlpZiAoaXNfZHgoZGlyKSkgeworCQliaCA9IGV4dDRfZHhfZmluZF9lbnRyeShkZW50cnksIHJlc19kaXIsICZlcnIpOworCQkvKgorCQkgKiBPbiBzdWNjZXNzLCBvciBpZiB0aGUgZXJyb3Igd2FzIGZpbGUgbm90IGZvdW5kLAorCQkgKiByZXR1cm4uICBPdGhlcndpc2UsIGZhbGwgYmFjayB0byBkb2luZyBhIHNlYXJjaCB0aGUKKwkJICogb2xkIGZhc2hpb25lZCB3YXkuCisJCSAqLworCQlpZiAoYmggfHwgKGVyciAhPSBFUlJfQkFEX0RYX0RJUikpCisJCQlyZXR1cm4gYmg7CisJCWR4dHJhY2UocHJpbnRrKCJleHQ0X2ZpbmRfZW50cnk6IGR4IGZhaWxlZCwgZmFsbGluZyBiYWNrXG4iKSk7CisJfQorI2VuZGlmCisJbmJsb2NrcyA9IGRpci0+aV9zaXplID4+IEVYVDRfQkxPQ0tfU0laRV9CSVRTKHNiKTsKKwlzdGFydCA9IEVYVDRfSShkaXIpLT5pX2Rpcl9zdGFydF9sb29rdXA7CisJaWYgKHN0YXJ0ID49IG5ibG9ja3MpCisJCXN0YXJ0ID0gMDsKKwlibG9jayA9IHN0YXJ0OworcmVzdGFydDoKKwlkbyB7CisJCS8qCisJCSAqIFdlIGRlYWwgd2l0aCB0aGUgcmVhZC1haGVhZCBsb2dpYyBoZXJlLgorCQkgKi8KKwkJaWYgKHJhX3B0ciA+PSByYV9tYXgpIHsKKwkJCS8qIFJlZmlsbCB0aGUgcmVhZGFoZWFkIGJ1ZmZlciAqLworCQkJcmFfcHRyID0gMDsKKwkJCWIgPSBibG9jazsKKwkJCWZvciAocmFfbWF4ID0gMDsgcmFfbWF4IDwgTkFNRUlfUkFfU0laRTsgcmFfbWF4KyspIHsKKwkJCQkvKgorCQkJCSAqIFRlcm1pbmF0ZSBpZiB3ZSByZWFjaCB0aGUgZW5kIG9mIHRoZQorCQkJCSAqIGRpcmVjdG9yeSBhbmQgbXVzdCB3cmFwLCBvciBpZiBvdXIKKwkJCQkgKiBzZWFyY2ggaGFzIGZpbmlzaGVkIGF0IHRoaXMgYmxvY2suCisJCQkJICovCisJCQkJaWYgKGIgPj0gbmJsb2NrcyB8fCAobnVtICYmIGJsb2NrID09IHN0YXJ0KSkgeworCQkJCQliaF91c2VbcmFfbWF4XSA9IE5VTEw7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCQludW0rKzsKKwkJCQliaCA9IGV4dDRfZ2V0YmxrKE5VTEwsIGRpciwgYisrLCAwLCAmZXJyKTsKKwkJCQliaF91c2VbcmFfbWF4XSA9IGJoOworCQkJCWlmIChiaCkKKwkJCQkJbGxfcndfYmxvY2soUkVBRF9NRVRBLCAxLCAmYmgpOworCQkJfQorCQl9CisJCWlmICgoYmggPSBiaF91c2VbcmFfcHRyKytdKSA9PSBOVUxMKQorCQkJZ290byBuZXh0OworCQl3YWl0X29uX2J1ZmZlcihiaCk7CisJCWlmICghYnVmZmVyX3VwdG9kYXRlKGJoKSkgeworCQkJLyogcmVhZCBlcnJvciwgc2tpcCBibG9jayAmIGhvcGUgZm9yIHRoZSBiZXN0ICovCisJCQlleHQ0X2Vycm9yKHNiLCBfX0ZVTkNUSU9OX18sICJyZWFkaW5nIGRpcmVjdG9yeSAjJWx1ICIKKwkJCQkgICAib2Zmc2V0ICVsdSIsIGRpci0+aV9pbm8sIGJsb2NrKTsKKwkJCWJyZWxzZShiaCk7CisJCQlnb3RvIG5leHQ7CisJCX0KKwkJaSA9IHNlYXJjaF9kaXJibG9jayhiaCwgZGlyLCBkZW50cnksCisJCQkgICAgYmxvY2sgPDwgRVhUNF9CTE9DS19TSVpFX0JJVFMoc2IpLCByZXNfZGlyKTsKKwkJaWYgKGkgPT0gMSkgeworCQkJRVhUNF9JKGRpciktPmlfZGlyX3N0YXJ0X2xvb2t1cCA9IGJsb2NrOworCQkJcmV0ID0gYmg7CisJCQlnb3RvIGNsZWFudXBfYW5kX2V4aXQ7CisJCX0gZWxzZSB7CisJCQlicmVsc2UoYmgpOworCQkJaWYgKGkgPCAwKQorCQkJCWdvdG8gY2xlYW51cF9hbmRfZXhpdDsKKwkJfQorCW5leHQ6CisJCWlmICgrK2Jsb2NrID49IG5ibG9ja3MpCisJCQlibG9jayA9IDA7CisJfSB3aGlsZSAoYmxvY2sgIT0gc3RhcnQpOworCisJLyoKKwkgKiBJZiB0aGUgZGlyZWN0b3J5IGhhcyBncm93biB3aGlsZSB3ZSB3ZXJlIHNlYXJjaGluZywgdGhlbgorCSAqIHNlYXJjaCB0aGUgbGFzdCBwYXJ0IG9mIHRoZSBkaXJlY3RvcnkgYmVmb3JlIGdpdmluZyB1cC4KKwkgKi8KKwlibG9jayA9IG5ibG9ja3M7CisJbmJsb2NrcyA9IGRpci0+aV9zaXplID4+IEVYVDRfQkxPQ0tfU0laRV9CSVRTKHNiKTsKKwlpZiAoYmxvY2sgPCBuYmxvY2tzKSB7CisJCXN0YXJ0ID0gMDsKKwkJZ290byByZXN0YXJ0OworCX0KKworY2xlYW51cF9hbmRfZXhpdDoKKwkvKiBDbGVhbiB1cCB0aGUgcmVhZC1haGVhZCBibG9ja3MgKi8KKwlmb3IgKDsgcmFfcHRyIDwgcmFfbWF4OyByYV9wdHIrKykKKwkJYnJlbHNlIChiaF91c2VbcmFfcHRyXSk7CisJcmV0dXJuIHJldDsKK30KKworI2lmZGVmIENPTkZJR19FWFQ0X0lOREVYCitzdGF0aWMgc3RydWN0IGJ1ZmZlcl9oZWFkICogZXh0NF9keF9maW5kX2VudHJ5KHN0cnVjdCBkZW50cnkgKmRlbnRyeSwKKwkJICAgICAgIHN0cnVjdCBleHQ0X2Rpcl9lbnRyeV8yICoqcmVzX2RpciwgaW50ICplcnIpCit7CisJc3RydWN0IHN1cGVyX2Jsb2NrICogc2I7CisJc3RydWN0IGR4X2hhc2hfaW5mbwloaW5mbzsKKwl1MzIgaGFzaDsKKwlzdHJ1Y3QgZHhfZnJhbWUgZnJhbWVzWzJdLCAqZnJhbWU7CisJc3RydWN0IGV4dDRfZGlyX2VudHJ5XzIgKmRlLCAqdG9wOworCXN0cnVjdCBidWZmZXJfaGVhZCAqYmg7CisJdW5zaWduZWQgbG9uZyBibG9jazsKKwlpbnQgcmV0dmFsOworCWludCBuYW1lbGVuID0gZGVudHJ5LT5kX25hbWUubGVuOworCWNvbnN0IHU4ICpuYW1lID0gZGVudHJ5LT5kX25hbWUubmFtZTsKKwlzdHJ1Y3QgaW5vZGUgKmRpciA9IGRlbnRyeS0+ZF9wYXJlbnQtPmRfaW5vZGU7CisKKwlzYiA9IGRpci0+aV9zYjsKKwkvKiBORlMgbWF5IGxvb2sgdXAgIi4uIiAtIGxvb2sgYXQgZHhfcm9vdCBkaXJlY3RvcnkgYmxvY2sgKi8KKwlpZiAobmFtZWxlbiA+IDIgfHwgbmFtZVswXSAhPSAnLid8fChuYW1lWzFdICE9ICcuJyAmJiBuYW1lWzFdICE9ICdcMCcpKXsKKwkJaWYgKCEoZnJhbWUgPSBkeF9wcm9iZShkZW50cnksIE5VTEwsICZoaW5mbywgZnJhbWVzLCBlcnIpKSkKKwkJCXJldHVybiBOVUxMOworCX0gZWxzZSB7CisJCWZyYW1lID0gZnJhbWVzOworCQlmcmFtZS0+YmggPSBOVUxMOwkJCS8qIGZvciBkeF9yZWxlYXNlKCkgKi8KKwkJZnJhbWUtPmF0ID0gKHN0cnVjdCBkeF9lbnRyeSAqKWZyYW1lczsJLyogaGFjayBmb3IgemVybyBlbnRyeSovCisJCWR4X3NldF9ibG9jayhmcmFtZS0+YXQsIDApOwkJLyogZHhfcm9vdCBibG9jayBpcyAwICovCisJfQorCWhhc2ggPSBoaW5mby5oYXNoOworCWRvIHsKKwkJYmxvY2sgPSBkeF9nZXRfYmxvY2soZnJhbWUtPmF0KTsKKwkJaWYgKCEoYmggPSBleHQ0X2JyZWFkIChOVUxMLGRpciwgYmxvY2ssIDAsIGVycikpKQorCQkJZ290byBlcnJvdXQ7CisJCWRlID0gKHN0cnVjdCBleHQ0X2Rpcl9lbnRyeV8yICopIGJoLT5iX2RhdGE7CisJCXRvcCA9IChzdHJ1Y3QgZXh0NF9kaXJfZW50cnlfMiAqKSAoKGNoYXIgKikgZGUgKyBzYi0+c19ibG9ja3NpemUgLQorCQkJCSAgICAgICBFWFQ0X0RJUl9SRUNfTEVOKDApKTsKKwkJZm9yICg7IGRlIDwgdG9wOyBkZSA9IGV4dDRfbmV4dF9lbnRyeShkZSkpCisJCWlmIChleHQ0X21hdGNoIChuYW1lbGVuLCBuYW1lLCBkZSkpIHsKKwkJCWlmICghZXh0NF9jaGVja19kaXJfZW50cnkoImV4dDRfZmluZF9lbnRyeSIsCisJCQkJCQkgIGRpciwgZGUsIGJoLAorCQkJCSAgKGJsb2NrPDxFWFQ0X0JMT0NLX1NJWkVfQklUUyhzYikpCisJCQkJCSAgKygoY2hhciAqKWRlIC0gYmgtPmJfZGF0YSkpKSB7CisJCQkJYnJlbHNlIChiaCk7CisJCQkJZ290byBlcnJvdXQ7CisJCQl9CisJCQkqcmVzX2RpciA9IGRlOworCQkJZHhfcmVsZWFzZSAoZnJhbWVzKTsKKwkJCXJldHVybiBiaDsKKwkJfQorCQlicmVsc2UgKGJoKTsKKwkJLyogQ2hlY2sgdG8gc2VlIGlmIHdlIHNob3VsZCBjb250aW51ZSB0byBzZWFyY2ggKi8KKwkJcmV0dmFsID0gZXh0NF9odHJlZV9uZXh0X2Jsb2NrKGRpciwgaGFzaCwgZnJhbWUsCisJCQkJCSAgICAgICBmcmFtZXMsIE5VTEwpOworCQlpZiAocmV0dmFsIDwgMCkgeworCQkJZXh0NF93YXJuaW5nKHNiLCBfX0ZVTkNUSU9OX18sCisJCQkgICAgICJlcnJvciByZWFkaW5nIGluZGV4IHBhZ2UgaW4gZGlyZWN0b3J5ICMlbHUiLAorCQkJICAgICBkaXItPmlfaW5vKTsKKwkJCSplcnIgPSByZXR2YWw7CisJCQlnb3RvIGVycm91dDsKKwkJfQorCX0gd2hpbGUgKHJldHZhbCA9PSAxKTsKKworCSplcnIgPSAtRU5PRU5UOworZXJyb3V0OgorCWR4dHJhY2UocHJpbnRrKCIlcyBub3QgZm91bmRcbiIsIG5hbWUpKTsKKwlkeF9yZWxlYXNlIChmcmFtZXMpOworCXJldHVybiBOVUxMOworfQorI2VuZGlmCisKK3N0YXRpYyBzdHJ1Y3QgZGVudHJ5ICpleHQ0X2xvb2t1cChzdHJ1Y3QgaW5vZGUgKiBkaXIsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgc3RydWN0IG5hbWVpZGF0YSAqbmQpCit7CisJc3RydWN0IGlub2RlICogaW5vZGU7CisJc3RydWN0IGV4dDRfZGlyX2VudHJ5XzIgKiBkZTsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKiBiaDsKKworCWlmIChkZW50cnktPmRfbmFtZS5sZW4gPiBFWFQ0X05BTUVfTEVOKQorCQlyZXR1cm4gRVJSX1BUUigtRU5BTUVUT09MT05HKTsKKworCWJoID0gZXh0NF9maW5kX2VudHJ5KGRlbnRyeSwgJmRlKTsKKwlpbm9kZSA9IE5VTEw7CisJaWYgKGJoKSB7CisJCXVuc2lnbmVkIGxvbmcgaW5vID0gbGUzMl90b19jcHUoZGUtPmlub2RlKTsKKwkJYnJlbHNlIChiaCk7CisJCWlmICghZXh0NF92YWxpZF9pbnVtKGRpci0+aV9zYiwgaW5vKSkgeworCQkJZXh0NF9lcnJvcihkaXItPmlfc2IsICJleHQ0X2xvb2t1cCIsCisJCQkJICAgImJhZCBpbm9kZSBudW1iZXI6ICVsdSIsIGlubyk7CisJCQlpbm9kZSA9IE5VTEw7CisJCX0gZWxzZQorCQkJaW5vZGUgPSBpZ2V0KGRpci0+aV9zYiwgaW5vKTsKKworCQlpZiAoIWlub2RlKQorCQkJcmV0dXJuIEVSUl9QVFIoLUVBQ0NFUyk7CisJfQorCXJldHVybiBkX3NwbGljZV9hbGlhcyhpbm9kZSwgZGVudHJ5KTsKK30KKworCitzdHJ1Y3QgZGVudHJ5ICpleHQ0X2dldF9wYXJlbnQoc3RydWN0IGRlbnRyeSAqY2hpbGQpCit7CisJdW5zaWduZWQgbG9uZyBpbm87CisJc3RydWN0IGRlbnRyeSAqcGFyZW50OworCXN0cnVjdCBpbm9kZSAqaW5vZGU7CisJc3RydWN0IGRlbnRyeSBkb3Rkb3Q7CisJc3RydWN0IGV4dDRfZGlyX2VudHJ5XzIgKiBkZTsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoOworCisJZG90ZG90LmRfbmFtZS5uYW1lID0gIi4uIjsKKwlkb3Rkb3QuZF9uYW1lLmxlbiA9IDI7CisJZG90ZG90LmRfcGFyZW50ID0gY2hpbGQ7IC8qIGNvbmZ1c2luZywgaXNuJ3QgaXQhICovCisKKwliaCA9IGV4dDRfZmluZF9lbnRyeSgmZG90ZG90LCAmZGUpOworCWlub2RlID0gTlVMTDsKKwlpZiAoIWJoKQorCQlyZXR1cm4gRVJSX1BUUigtRU5PRU5UKTsKKwlpbm8gPSBsZTMyX3RvX2NwdShkZS0+aW5vZGUpOworCWJyZWxzZShiaCk7CisKKwlpZiAoIWV4dDRfdmFsaWRfaW51bShjaGlsZC0+ZF9pbm9kZS0+aV9zYiwgaW5vKSkgeworCQlleHQ0X2Vycm9yKGNoaWxkLT5kX2lub2RlLT5pX3NiLCAiZXh0NF9nZXRfcGFyZW50IiwKKwkJCSAgICJiYWQgaW5vZGUgbnVtYmVyOiAlbHUiLCBpbm8pOworCQlpbm9kZSA9IE5VTEw7CisJfSBlbHNlCisJCWlub2RlID0gaWdldChjaGlsZC0+ZF9pbm9kZS0+aV9zYiwgaW5vKTsKKworCWlmICghaW5vZGUpCisJCXJldHVybiBFUlJfUFRSKC1FQUNDRVMpOworCisJcGFyZW50ID0gZF9hbGxvY19hbm9uKGlub2RlKTsKKwlpZiAoIXBhcmVudCkgeworCQlpcHV0KGlub2RlKTsKKwkJcGFyZW50ID0gRVJSX1BUUigtRU5PTUVNKTsKKwl9CisJcmV0dXJuIHBhcmVudDsKK30KKworI2RlZmluZSBTX1NISUZUIDEyCitzdGF0aWMgdW5zaWduZWQgY2hhciBleHQ0X3R5cGVfYnlfbW9kZVtTX0lGTVQgPj4gU19TSElGVF0gPSB7CisJW1NfSUZSRUcgPj4gU19TSElGVF0JPSBFWFQ0X0ZUX1JFR19GSUxFLAorCVtTX0lGRElSID4+IFNfU0hJRlRdCT0gRVhUNF9GVF9ESVIsCisJW1NfSUZDSFIgPj4gU19TSElGVF0JPSBFWFQ0X0ZUX0NIUkRFViwKKwlbU19JRkJMSyA+PiBTX1NISUZUXQk9IEVYVDRfRlRfQkxLREVWLAorCVtTX0lGSUZPID4+IFNfU0hJRlRdCT0gRVhUNF9GVF9GSUZPLAorCVtTX0lGU09DSyA+PiBTX1NISUZUXQk9IEVYVDRfRlRfU09DSywKKwlbU19JRkxOSyA+PiBTX1NISUZUXQk9IEVYVDRfRlRfU1lNTElOSywKK307CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBleHQ0X3NldF9kZV90eXBlKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsCisJCQkJc3RydWN0IGV4dDRfZGlyX2VudHJ5XzIgKmRlLAorCQkJCXVtb2RlX3QgbW9kZSkgeworCWlmIChFWFQ0X0hBU19JTkNPTVBBVF9GRUFUVVJFKHNiLCBFWFQ0X0ZFQVRVUkVfSU5DT01QQVRfRklMRVRZUEUpKQorCQlkZS0+ZmlsZV90eXBlID0gZXh0NF90eXBlX2J5X21vZGVbKG1vZGUgJiBTX0lGTVQpPj5TX1NISUZUXTsKK30KKworI2lmZGVmIENPTkZJR19FWFQ0X0lOREVYCitzdGF0aWMgc3RydWN0IGV4dDRfZGlyX2VudHJ5XzIgKgorZHhfbW92ZV9kaXJlbnRzKGNoYXIgKmZyb20sIGNoYXIgKnRvLCBzdHJ1Y3QgZHhfbWFwX2VudHJ5ICptYXAsIGludCBjb3VudCkKK3sKKwl1bnNpZ25lZCByZWNfbGVuID0gMDsKKworCXdoaWxlIChjb3VudC0tKSB7CisJCXN0cnVjdCBleHQ0X2Rpcl9lbnRyeV8yICpkZSA9IChzdHJ1Y3QgZXh0NF9kaXJfZW50cnlfMiAqKSAoZnJvbSArIG1hcC0+b2Zmcyk7CisJCXJlY19sZW4gPSBFWFQ0X0RJUl9SRUNfTEVOKGRlLT5uYW1lX2xlbik7CisJCW1lbWNweSAodG8sIGRlLCByZWNfbGVuKTsKKwkJKChzdHJ1Y3QgZXh0NF9kaXJfZW50cnlfMiAqKSB0byktPnJlY19sZW4gPQorCQkJCWNwdV90b19sZTE2KHJlY19sZW4pOworCQlkZS0+aW5vZGUgPSAwOworCQltYXArKzsKKwkJdG8gKz0gcmVjX2xlbjsKKwl9CisJcmV0dXJuIChzdHJ1Y3QgZXh0NF9kaXJfZW50cnlfMiAqKSAodG8gLSByZWNfbGVuKTsKK30KKworc3RhdGljIHN0cnVjdCBleHQ0X2Rpcl9lbnRyeV8yKiBkeF9wYWNrX2RpcmVudHMoY2hhciAqYmFzZSwgaW50IHNpemUpCit7CisJc3RydWN0IGV4dDRfZGlyX2VudHJ5XzIgKm5leHQsICp0bywgKnByZXYsICpkZSA9IChzdHJ1Y3QgZXh0NF9kaXJfZW50cnlfMiAqKSBiYXNlOworCXVuc2lnbmVkIHJlY19sZW4gPSAwOworCisJcHJldiA9IHRvID0gZGU7CisJd2hpbGUgKChjaGFyKilkZSA8IGJhc2UgKyBzaXplKSB7CisJCW5leHQgPSAoc3RydWN0IGV4dDRfZGlyX2VudHJ5XzIgKikgKChjaGFyICopIGRlICsKKwkJCQkJCSAgICBsZTE2X3RvX2NwdShkZS0+cmVjX2xlbikpOworCQlpZiAoZGUtPmlub2RlICYmIGRlLT5uYW1lX2xlbikgeworCQkJcmVjX2xlbiA9IEVYVDRfRElSX1JFQ19MRU4oZGUtPm5hbWVfbGVuKTsKKwkJCWlmIChkZSA+IHRvKQorCQkJCW1lbW1vdmUodG8sIGRlLCByZWNfbGVuKTsKKwkJCXRvLT5yZWNfbGVuID0gY3B1X3RvX2xlMTYocmVjX2xlbik7CisJCQlwcmV2ID0gdG87CisJCQl0byA9IChzdHJ1Y3QgZXh0NF9kaXJfZW50cnlfMiAqKSAoKChjaGFyICopIHRvKSArIHJlY19sZW4pOworCQl9CisJCWRlID0gbmV4dDsKKwl9CisJcmV0dXJuIHByZXY7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZXh0NF9kaXJfZW50cnlfMiAqZG9fc3BsaXQoaGFuZGxlX3QgKmhhbmRsZSwgc3RydWN0IGlub2RlICpkaXIsCisJCQlzdHJ1Y3QgYnVmZmVyX2hlYWQgKipiaCxzdHJ1Y3QgZHhfZnJhbWUgKmZyYW1lLAorCQkJc3RydWN0IGR4X2hhc2hfaW5mbyAqaGluZm8sIGludCAqZXJyb3IpCit7CisJdW5zaWduZWQgYmxvY2tzaXplID0gZGlyLT5pX3NiLT5zX2Jsb2Nrc2l6ZTsKKwl1bnNpZ25lZCBjb3VudCwgY29udGludWVkOworCXN0cnVjdCBidWZmZXJfaGVhZCAqYmgyOworCXUzMiBuZXdibG9jazsKKwl1MzIgaGFzaDI7CisJc3RydWN0IGR4X21hcF9lbnRyeSAqbWFwOworCWNoYXIgKmRhdGExID0gKCpiaCktPmJfZGF0YSwgKmRhdGEyOworCXVuc2lnbmVkIHNwbGl0OworCXN0cnVjdCBleHQ0X2Rpcl9lbnRyeV8yICpkZSA9IE5VTEwsICpkZTI7CisJaW50CWVycjsKKworCWJoMiA9IGV4dDRfYXBwZW5kIChoYW5kbGUsIGRpciwgJm5ld2Jsb2NrLCBlcnJvcik7CisJaWYgKCEoYmgyKSkgeworCQlicmVsc2UoKmJoKTsKKwkJKmJoID0gTlVMTDsKKwkJZ290byBlcnJvdXQ7CisJfQorCisJQlVGRkVSX1RSQUNFKCpiaCwgImdldF93cml0ZV9hY2Nlc3MiKTsKKwllcnIgPSBleHQ0X2pvdXJuYWxfZ2V0X3dyaXRlX2FjY2VzcyhoYW5kbGUsICpiaCk7CisJaWYgKGVycikgeworCWpvdXJuYWxfZXJyb3I6CisJCWJyZWxzZSgqYmgpOworCQlicmVsc2UoYmgyKTsKKwkJKmJoID0gTlVMTDsKKwkJZXh0NF9zdGRfZXJyb3IoZGlyLT5pX3NiLCBlcnIpOworCQlnb3RvIGVycm91dDsKKwl9CisJQlVGRkVSX1RSQUNFKGZyYW1lLT5iaCwgImdldF93cml0ZV9hY2Nlc3MiKTsKKwllcnIgPSBleHQ0X2pvdXJuYWxfZ2V0X3dyaXRlX2FjY2VzcyhoYW5kbGUsIGZyYW1lLT5iaCk7CisJaWYgKGVycikKKwkJZ290byBqb3VybmFsX2Vycm9yOworCisJZGF0YTIgPSBiaDItPmJfZGF0YTsKKworCS8qIGNyZWF0ZSBtYXAgaW4gdGhlIGVuZCBvZiBkYXRhMiBibG9jayAqLworCW1hcCA9IChzdHJ1Y3QgZHhfbWFwX2VudHJ5ICopIChkYXRhMiArIGJsb2Nrc2l6ZSk7CisJY291bnQgPSBkeF9tYWtlX21hcCAoKHN0cnVjdCBleHQ0X2Rpcl9lbnRyeV8yICopIGRhdGExLAorCQkJICAgICBibG9ja3NpemUsIGhpbmZvLCBtYXApOworCW1hcCAtPSBjb3VudDsKKwlzcGxpdCA9IGNvdW50LzI7IC8vIG5lZWQgdG8gYWRqdXN0IHRvIGFjdHVhbCBtaWRkbGUKKwlkeF9zb3J0X21hcCAobWFwLCBjb3VudCk7CisJaGFzaDIgPSBtYXBbc3BsaXRdLmhhc2g7CisJY29udGludWVkID0gaGFzaDIgPT0gbWFwW3NwbGl0IC0gMV0uaGFzaDsKKwlkeHRyYWNlKHByaW50aygiU3BsaXQgYmxvY2sgJWkgYXQgJXgsICVpLyVpXG4iLAorCQlkeF9nZXRfYmxvY2soZnJhbWUtPmF0KSwgaGFzaDIsIHNwbGl0LCBjb3VudC1zcGxpdCkpOworCisJLyogRmFuY3kgZGFuY2UgdG8gc3RheSB3aXRoaW4gdHdvIGJ1ZmZlcnMgKi8KKwlkZTIgPSBkeF9tb3ZlX2RpcmVudHMoZGF0YTEsIGRhdGEyLCBtYXAgKyBzcGxpdCwgY291bnQgLSBzcGxpdCk7CisJZGUgPSBkeF9wYWNrX2RpcmVudHMoZGF0YTEsYmxvY2tzaXplKTsKKwlkZS0+cmVjX2xlbiA9IGNwdV90b19sZTE2KGRhdGExICsgYmxvY2tzaXplIC0gKGNoYXIgKikgZGUpOworCWRlMi0+cmVjX2xlbiA9IGNwdV90b19sZTE2KGRhdGEyICsgYmxvY2tzaXplIC0gKGNoYXIgKikgZGUyKTsKKwlkeHRyYWNlKGR4X3Nob3dfbGVhZiAoaGluZm8sIChzdHJ1Y3QgZXh0NF9kaXJfZW50cnlfMiAqKSBkYXRhMSwgYmxvY2tzaXplLCAxKSk7CisJZHh0cmFjZShkeF9zaG93X2xlYWYgKGhpbmZvLCAoc3RydWN0IGV4dDRfZGlyX2VudHJ5XzIgKikgZGF0YTIsIGJsb2Nrc2l6ZSwgMSkpOworCisJLyogV2hpY2ggYmxvY2sgZ2V0cyB0aGUgbmV3IGVudHJ5PyAqLworCWlmIChoaW5mby0+aGFzaCA+PSBoYXNoMikKKwl7CisJCXN3YXAoKmJoLCBiaDIpOworCQlkZSA9IGRlMjsKKwl9CisJZHhfaW5zZXJ0X2Jsb2NrIChmcmFtZSwgaGFzaDIgKyBjb250aW51ZWQsIG5ld2Jsb2NrKTsKKwllcnIgPSBleHQ0X2pvdXJuYWxfZGlydHlfbWV0YWRhdGEgKGhhbmRsZSwgYmgyKTsKKwlpZiAoZXJyKQorCQlnb3RvIGpvdXJuYWxfZXJyb3I7CisJZXJyID0gZXh0NF9qb3VybmFsX2RpcnR5X21ldGFkYXRhIChoYW5kbGUsIGZyYW1lLT5iaCk7CisJaWYgKGVycikKKwkJZ290byBqb3VybmFsX2Vycm9yOworCWJyZWxzZSAoYmgyKTsKKwlkeHRyYWNlKGR4X3Nob3dfaW5kZXggKCJmcmFtZSIsIGZyYW1lLT5lbnRyaWVzKSk7CitlcnJvdXQ6CisJcmV0dXJuIGRlOworfQorI2VuZGlmCisKKworLyoKKyAqIEFkZCBhIG5ldyBlbnRyeSBpbnRvIGEgZGlyZWN0b3J5IChsZWFmKSBibG9jay4gIElmIGRlIGlzIG5vbi1OVUxMLAorICogaXQgcG9pbnRzIHRvIGEgZGlyZWN0b3J5IGVudHJ5IHdoaWNoIGlzIGd1YXJhbnRlZWQgdG8gYmUgbGFyZ2UKKyAqIGVub3VnaCBmb3IgbmV3IGRpcmVjdG9yeSBlbnRyeS4gIElmIGRlIGlzIE5VTEwsIHRoZW4KKyAqIGFkZF9kaXJlbnRfdG9fYnVmIHdpbGwgYXR0ZW1wdCBzZWFyY2ggdGhlIGRpcmVjdG9yeSBibG9jayBmb3IKKyAqIHNwYWNlLiAgSXQgd2lsbCByZXR1cm4gLUVOT1NQQyBpZiBubyBzcGFjZSBpcyBhdmFpbGFibGUsIGFuZCAtRUlPCisgKiBhbmQgLUVFWElTVCBpZiBkaXJlY3RvcnkgZW50cnkgYWxyZWFkeSBleGlzdHMuCisgKgorICogTk9URSEgIGJoIGlzIE5PVCByZWxlYXNlZCBpbiB0aGUgY2FzZSB3aGVyZSBFTk9TUEMgaXMgcmV0dXJuZWQuICBJbgorICogYWxsIG90aGVyIGNhc2VzIGJoIGlzIHJlbGVhc2VkLgorICovCitzdGF0aWMgaW50IGFkZF9kaXJlbnRfdG9fYnVmKGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSwKKwkJCSAgICAgc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGV4dDRfZGlyX2VudHJ5XzIgKmRlLAorCQkJICAgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKiBiaCkKK3sKKwlzdHJ1Y3QgaW5vZGUJKmRpciA9IGRlbnRyeS0+ZF9wYXJlbnQtPmRfaW5vZGU7CisJY29uc3QgY2hhcgkqbmFtZSA9IGRlbnRyeS0+ZF9uYW1lLm5hbWU7CisJaW50CQluYW1lbGVuID0gZGVudHJ5LT5kX25hbWUubGVuOworCXVuc2lnbmVkIGxvbmcJb2Zmc2V0ID0gMDsKKwl1bnNpZ25lZCBzaG9ydAlyZWNsZW47CisJaW50CQlubGVuLCBybGVuLCBlcnI7CisJY2hhcgkJKnRvcDsKKworCXJlY2xlbiA9IEVYVDRfRElSX1JFQ19MRU4obmFtZWxlbik7CisJaWYgKCFkZSkgeworCQlkZSA9IChzdHJ1Y3QgZXh0NF9kaXJfZW50cnlfMiAqKWJoLT5iX2RhdGE7CisJCXRvcCA9IGJoLT5iX2RhdGEgKyBkaXItPmlfc2ItPnNfYmxvY2tzaXplIC0gcmVjbGVuOworCQl3aGlsZSAoKGNoYXIgKikgZGUgPD0gdG9wKSB7CisJCQlpZiAoIWV4dDRfY2hlY2tfZGlyX2VudHJ5KCJleHQ0X2FkZF9lbnRyeSIsIGRpciwgZGUsCisJCQkJCQkgIGJoLCBvZmZzZXQpKSB7CisJCQkJYnJlbHNlIChiaCk7CisJCQkJcmV0dXJuIC1FSU87CisJCQl9CisJCQlpZiAoZXh0NF9tYXRjaCAobmFtZWxlbiwgbmFtZSwgZGUpKSB7CisJCQkJYnJlbHNlIChiaCk7CisJCQkJcmV0dXJuIC1FRVhJU1Q7CisJCQl9CisJCQlubGVuID0gRVhUNF9ESVJfUkVDX0xFTihkZS0+bmFtZV9sZW4pOworCQkJcmxlbiA9IGxlMTZfdG9fY3B1KGRlLT5yZWNfbGVuKTsKKwkJCWlmICgoZGUtPmlub2RlPyBybGVuIC0gbmxlbjogcmxlbikgPj0gcmVjbGVuKQorCQkJCWJyZWFrOworCQkJZGUgPSAoc3RydWN0IGV4dDRfZGlyX2VudHJ5XzIgKikoKGNoYXIgKilkZSArIHJsZW4pOworCQkJb2Zmc2V0ICs9IHJsZW47CisJCX0KKwkJaWYgKChjaGFyICopIGRlID4gdG9wKQorCQkJcmV0dXJuIC1FTk9TUEM7CisJfQorCUJVRkZFUl9UUkFDRShiaCwgImdldF93cml0ZV9hY2Nlc3MiKTsKKwllcnIgPSBleHQ0X2pvdXJuYWxfZ2V0X3dyaXRlX2FjY2VzcyhoYW5kbGUsIGJoKTsKKwlpZiAoZXJyKSB7CisJCWV4dDRfc3RkX2Vycm9yKGRpci0+aV9zYiwgZXJyKTsKKwkJYnJlbHNlKGJoKTsKKwkJcmV0dXJuIGVycjsKKwl9CisKKwkvKiBCeSBub3cgdGhlIGJ1ZmZlciBpcyBtYXJrZWQgZm9yIGpvdXJuYWxpbmcgKi8KKwlubGVuID0gRVhUNF9ESVJfUkVDX0xFTihkZS0+bmFtZV9sZW4pOworCXJsZW4gPSBsZTE2X3RvX2NwdShkZS0+cmVjX2xlbik7CisJaWYgKGRlLT5pbm9kZSkgeworCQlzdHJ1Y3QgZXh0NF9kaXJfZW50cnlfMiAqZGUxID0gKHN0cnVjdCBleHQ0X2Rpcl9lbnRyeV8yICopKChjaGFyICopZGUgKyBubGVuKTsKKwkJZGUxLT5yZWNfbGVuID0gY3B1X3RvX2xlMTYocmxlbiAtIG5sZW4pOworCQlkZS0+cmVjX2xlbiA9IGNwdV90b19sZTE2KG5sZW4pOworCQlkZSA9IGRlMTsKKwl9CisJZGUtPmZpbGVfdHlwZSA9IEVYVDRfRlRfVU5LTk9XTjsKKwlpZiAoaW5vZGUpIHsKKwkJZGUtPmlub2RlID0gY3B1X3RvX2xlMzIoaW5vZGUtPmlfaW5vKTsKKwkJZXh0NF9zZXRfZGVfdHlwZShkaXItPmlfc2IsIGRlLCBpbm9kZS0+aV9tb2RlKTsKKwl9IGVsc2UKKwkJZGUtPmlub2RlID0gMDsKKwlkZS0+bmFtZV9sZW4gPSBuYW1lbGVuOworCW1lbWNweSAoZGUtPm5hbWUsIG5hbWUsIG5hbWVsZW4pOworCS8qCisJICogWFhYIHNob3VsZG4ndCB1cGRhdGUgYW55IHRpbWVzIHVudGlsIHN1Y2Nlc3NmdWwKKwkgKiBjb21wbGV0aW9uIG9mIHN5c2NhbGwsIGJ1dCB0b28gbWFueSBjYWxsZXJzIGRlcGVuZAorCSAqIG9uIHRoaXMuCisJICoKKwkgKiBYWFggc2ltaWxhcmx5LCB0b28gbWFueSBjYWxsZXJzIGRlcGVuZCBvbgorCSAqIGV4dDRfbmV3X2lub2RlKCkgc2V0dGluZyB0aGUgdGltZXMsIGJ1dCBlcnJvcgorCSAqIHJlY292ZXJ5IGRlbGV0ZXMgdGhlIGlub2RlLCBzbyB0aGUgd29yc3QgdGhhdCBjYW4KKwkgKiBoYXBwZW4gaXMgdGhhdCB0aGUgdGltZXMgYXJlIHNsaWdodGx5IG91dCBvZiBkYXRlCisJICogYW5kL29yIGRpZmZlcmVudCBmcm9tIHRoZSBkaXJlY3RvcnkgY2hhbmdlIHRpbWUuCisJICovCisJZGlyLT5pX210aW1lID0gZGlyLT5pX2N0aW1lID0gQ1VSUkVOVF9USU1FX1NFQzsKKwlleHQ0X3VwZGF0ZV9keF9mbGFnKGRpcik7CisJZGlyLT5pX3ZlcnNpb24rKzsKKwlleHQ0X21hcmtfaW5vZGVfZGlydHkoaGFuZGxlLCBkaXIpOworCUJVRkZFUl9UUkFDRShiaCwgImNhbGwgZXh0NF9qb3VybmFsX2RpcnR5X21ldGFkYXRhIik7CisJZXJyID0gZXh0NF9qb3VybmFsX2RpcnR5X21ldGFkYXRhKGhhbmRsZSwgYmgpOworCWlmIChlcnIpCisJCWV4dDRfc3RkX2Vycm9yKGRpci0+aV9zYiwgZXJyKTsKKwlicmVsc2UoYmgpOworCXJldHVybiAwOworfQorCisjaWZkZWYgQ09ORklHX0VYVDRfSU5ERVgKKy8qCisgKiBUaGlzIGNvbnZlcnRzIGEgb25lIGJsb2NrIHVuaW5kZXhlZCBkaXJlY3RvcnkgdG8gYSAzIGJsb2NrIGluZGV4ZWQKKyAqIGRpcmVjdG9yeSwgYW5kIGFkZHMgdGhlIGRlbnRyeSB0byB0aGUgaW5kZXhlZCBkaXJlY3RvcnkuCisgKi8KK3N0YXRpYyBpbnQgbWFrZV9pbmRleGVkX2RpcihoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnksCisJCQkgICAgc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCkKK3sKKwlzdHJ1Y3QgaW5vZGUJKmRpciA9IGRlbnRyeS0+ZF9wYXJlbnQtPmRfaW5vZGU7CisJY29uc3QgY2hhcgkqbmFtZSA9IGRlbnRyeS0+ZF9uYW1lLm5hbWU7CisJaW50CQluYW1lbGVuID0gZGVudHJ5LT5kX25hbWUubGVuOworCXN0cnVjdCBidWZmZXJfaGVhZCAqYmgyOworCXN0cnVjdCBkeF9yb290CSpyb290OworCXN0cnVjdCBkeF9mcmFtZQlmcmFtZXNbMl0sICpmcmFtZTsKKwlzdHJ1Y3QgZHhfZW50cnkgKmVudHJpZXM7CisJc3RydWN0IGV4dDRfZGlyX2VudHJ5XzIJKmRlLCAqZGUyOworCWNoYXIJCSpkYXRhMSwgKnRvcDsKKwl1bnNpZ25lZAlsZW47CisJaW50CQlyZXR2YWw7CisJdW5zaWduZWQJYmxvY2tzaXplOworCXN0cnVjdCBkeF9oYXNoX2luZm8gaGluZm87CisJdTMyCQlibG9jazsKKwlzdHJ1Y3QgZmFrZV9kaXJlbnQgKmZkZTsKKworCWJsb2Nrc2l6ZSA9ICBkaXItPmlfc2ItPnNfYmxvY2tzaXplOworCWR4dHJhY2UocHJpbnRrKCJDcmVhdGluZyBpbmRleFxuIikpOworCXJldHZhbCA9IGV4dDRfam91cm5hbF9nZXRfd3JpdGVfYWNjZXNzKGhhbmRsZSwgYmgpOworCWlmIChyZXR2YWwpIHsKKwkJZXh0NF9zdGRfZXJyb3IoZGlyLT5pX3NiLCByZXR2YWwpOworCQlicmVsc2UoYmgpOworCQlyZXR1cm4gcmV0dmFsOworCX0KKwlyb290ID0gKHN0cnVjdCBkeF9yb290ICopIGJoLT5iX2RhdGE7CisKKwliaDIgPSBleHQ0X2FwcGVuZCAoaGFuZGxlLCBkaXIsICZibG9jaywgJnJldHZhbCk7CisJaWYgKCEoYmgyKSkgeworCQlicmVsc2UoYmgpOworCQlyZXR1cm4gcmV0dmFsOworCX0KKwlFWFQ0X0koZGlyKS0+aV9mbGFncyB8PSBFWFQ0X0lOREVYX0ZMOworCWRhdGExID0gYmgyLT5iX2RhdGE7CisKKwkvKiBUaGUgMHRoIGJsb2NrIGJlY29tZXMgdGhlIHJvb3QsIG1vdmUgdGhlIGRpcmVudHMgb3V0ICovCisJZmRlID0gJnJvb3QtPmRvdGRvdDsKKwlkZSA9IChzdHJ1Y3QgZXh0NF9kaXJfZW50cnlfMiAqKSgoY2hhciAqKWZkZSArIGxlMTZfdG9fY3B1KGZkZS0+cmVjX2xlbikpOworCWxlbiA9ICgoY2hhciAqKSByb290KSArIGJsb2Nrc2l6ZSAtIChjaGFyICopIGRlOworCW1lbWNweSAoZGF0YTEsIGRlLCBsZW4pOworCWRlID0gKHN0cnVjdCBleHQ0X2Rpcl9lbnRyeV8yICopIGRhdGExOworCXRvcCA9IGRhdGExICsgbGVuOworCXdoaWxlICgoY2hhciAqKShkZTI9KHZvaWQqKWRlK2xlMTZfdG9fY3B1KGRlLT5yZWNfbGVuKSkgPCB0b3ApCisJCWRlID0gZGUyOworCWRlLT5yZWNfbGVuID0gY3B1X3RvX2xlMTYoZGF0YTEgKyBibG9ja3NpemUgLSAoY2hhciAqKSBkZSk7CisJLyogSW5pdGlhbGl6ZSB0aGUgcm9vdDsgdGhlIGRvdCBkaXJlbnRzIGFscmVhZHkgZXhpc3QgKi8KKwlkZSA9IChzdHJ1Y3QgZXh0NF9kaXJfZW50cnlfMiAqKSAoJnJvb3QtPmRvdGRvdCk7CisJZGUtPnJlY19sZW4gPSBjcHVfdG9fbGUxNihibG9ja3NpemUgLSBFWFQ0X0RJUl9SRUNfTEVOKDIpKTsKKwltZW1zZXQgKCZyb290LT5pbmZvLCAwLCBzaXplb2Yocm9vdC0+aW5mbykpOworCXJvb3QtPmluZm8uaW5mb19sZW5ndGggPSBzaXplb2Yocm9vdC0+aW5mbyk7CisJcm9vdC0+aW5mby5oYXNoX3ZlcnNpb24gPSBFWFQ0X1NCKGRpci0+aV9zYiktPnNfZGVmX2hhc2hfdmVyc2lvbjsKKwllbnRyaWVzID0gcm9vdC0+ZW50cmllczsKKwlkeF9zZXRfYmxvY2sgKGVudHJpZXMsIDEpOworCWR4X3NldF9jb3VudCAoZW50cmllcywgMSk7CisJZHhfc2V0X2xpbWl0IChlbnRyaWVzLCBkeF9yb290X2xpbWl0KGRpciwgc2l6ZW9mKHJvb3QtPmluZm8pKSk7CisKKwkvKiBJbml0aWFsaXplIGFzIGZvciBkeF9wcm9iZSAqLworCWhpbmZvLmhhc2hfdmVyc2lvbiA9IHJvb3QtPmluZm8uaGFzaF92ZXJzaW9uOworCWhpbmZvLnNlZWQgPSBFWFQ0X1NCKGRpci0+aV9zYiktPnNfaGFzaF9zZWVkOworCWV4dDRmc19kaXJoYXNoKG5hbWUsIG5hbWVsZW4sICZoaW5mbyk7CisJZnJhbWUgPSBmcmFtZXM7CisJZnJhbWUtPmVudHJpZXMgPSBlbnRyaWVzOworCWZyYW1lLT5hdCA9IGVudHJpZXM7CisJZnJhbWUtPmJoID0gYmg7CisJYmggPSBiaDI7CisJZGUgPSBkb19zcGxpdChoYW5kbGUsZGlyLCAmYmgsIGZyYW1lLCAmaGluZm8sICZyZXR2YWwpOworCWR4X3JlbGVhc2UgKGZyYW1lcyk7CisJaWYgKCEoZGUpKQorCQlyZXR1cm4gcmV0dmFsOworCisJcmV0dXJuIGFkZF9kaXJlbnRfdG9fYnVmKGhhbmRsZSwgZGVudHJ5LCBpbm9kZSwgZGUsIGJoKTsKK30KKyNlbmRpZgorCisvKgorICoJZXh0NF9hZGRfZW50cnkoKQorICoKKyAqIGFkZHMgYSBmaWxlIGVudHJ5IHRvIHRoZSBzcGVjaWZpZWQgZGlyZWN0b3J5LCB1c2luZyB0aGUgc2FtZQorICogc2VtYW50aWNzIGFzIGV4dDRfZmluZF9lbnRyeSgpLiBJdCByZXR1cm5zIE5VTEwgaWYgaXQgZmFpbGVkLgorICoKKyAqIE5PVEUhISBUaGUgaW5vZGUgcGFydCBvZiAnZGUnIGlzIGxlZnQgYXQgMCAtIHdoaWNoIG1lYW5zIHlvdQorICogbWF5IG5vdCBzbGVlcCBiZXR3ZWVuIGNhbGxpbmcgdGhpcyBhbmQgcHV0dGluZyBzb21ldGhpbmcgaW50bworICogdGhlIGVudHJ5LCBhcyBzb21lb25lIGVsc2UgbWlnaHQgaGF2ZSB1c2VkIGl0IHdoaWxlIHlvdSBzbGVwdC4KKyAqLworc3RhdGljIGludCBleHQ0X2FkZF9lbnRyeSAoaGFuZGxlX3QgKmhhbmRsZSwgc3RydWN0IGRlbnRyeSAqZGVudHJ5LAorCXN0cnVjdCBpbm9kZSAqaW5vZGUpCit7CisJc3RydWN0IGlub2RlICpkaXIgPSBkZW50cnktPmRfcGFyZW50LT5kX2lub2RlOworCXVuc2lnbmVkIGxvbmcgb2Zmc2V0OworCXN0cnVjdCBidWZmZXJfaGVhZCAqIGJoOworCXN0cnVjdCBleHQ0X2Rpcl9lbnRyeV8yICpkZTsKKwlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiBzYjsKKwlpbnQJcmV0dmFsOworI2lmZGVmIENPTkZJR19FWFQ0X0lOREVYCisJaW50CWR4X2ZhbGxiYWNrPTA7CisjZW5kaWYKKwl1bnNpZ25lZCBibG9ja3NpemU7CisJdTMyIGJsb2NrLCBibG9ja3M7CisKKwlzYiA9IGRpci0+aV9zYjsKKwlibG9ja3NpemUgPSBzYi0+c19ibG9ja3NpemU7CisJaWYgKCFkZW50cnktPmRfbmFtZS5sZW4pCisJCXJldHVybiAtRUlOVkFMOworI2lmZGVmIENPTkZJR19FWFQ0X0lOREVYCisJaWYgKGlzX2R4KGRpcikpIHsKKwkJcmV0dmFsID0gZXh0NF9keF9hZGRfZW50cnkoaGFuZGxlLCBkZW50cnksIGlub2RlKTsKKwkJaWYgKCFyZXR2YWwgfHwgKHJldHZhbCAhPSBFUlJfQkFEX0RYX0RJUikpCisJCQlyZXR1cm4gcmV0dmFsOworCQlFWFQ0X0koZGlyKS0+aV9mbGFncyAmPSB+RVhUNF9JTkRFWF9GTDsKKwkJZHhfZmFsbGJhY2srKzsKKwkJZXh0NF9tYXJrX2lub2RlX2RpcnR5KGhhbmRsZSwgZGlyKTsKKwl9CisjZW5kaWYKKwlibG9ja3MgPSBkaXItPmlfc2l6ZSA+PiBzYi0+c19ibG9ja3NpemVfYml0czsKKwlmb3IgKGJsb2NrID0gMCwgb2Zmc2V0ID0gMDsgYmxvY2sgPCBibG9ja3M7IGJsb2NrKyspIHsKKwkJYmggPSBleHQ0X2JyZWFkKGhhbmRsZSwgZGlyLCBibG9jaywgMCwgJnJldHZhbCk7CisJCWlmKCFiaCkKKwkJCXJldHVybiByZXR2YWw7CisJCXJldHZhbCA9IGFkZF9kaXJlbnRfdG9fYnVmKGhhbmRsZSwgZGVudHJ5LCBpbm9kZSwgTlVMTCwgYmgpOworCQlpZiAocmV0dmFsICE9IC1FTk9TUEMpCisJCQlyZXR1cm4gcmV0dmFsOworCisjaWZkZWYgQ09ORklHX0VYVDRfSU5ERVgKKwkJaWYgKGJsb2NrcyA9PSAxICYmICFkeF9mYWxsYmFjayAmJgorCQkgICAgRVhUNF9IQVNfQ09NUEFUX0ZFQVRVUkUoc2IsIEVYVDRfRkVBVFVSRV9DT01QQVRfRElSX0lOREVYKSkKKwkJCXJldHVybiBtYWtlX2luZGV4ZWRfZGlyKGhhbmRsZSwgZGVudHJ5LCBpbm9kZSwgYmgpOworI2VuZGlmCisJCWJyZWxzZShiaCk7CisJfQorCWJoID0gZXh0NF9hcHBlbmQoaGFuZGxlLCBkaXIsICZibG9jaywgJnJldHZhbCk7CisJaWYgKCFiaCkKKwkJcmV0dXJuIHJldHZhbDsKKwlkZSA9IChzdHJ1Y3QgZXh0NF9kaXJfZW50cnlfMiAqKSBiaC0+Yl9kYXRhOworCWRlLT5pbm9kZSA9IDA7CisJZGUtPnJlY19sZW4gPSBjcHVfdG9fbGUxNihibG9ja3NpemUpOworCXJldHVybiBhZGRfZGlyZW50X3RvX2J1ZihoYW5kbGUsIGRlbnRyeSwgaW5vZGUsIGRlLCBiaCk7Cit9CisKKyNpZmRlZiBDT05GSUdfRVhUNF9JTkRFWAorLyoKKyAqIFJldHVybnMgMCBmb3Igc3VjY2Vzcywgb3IgYSBuZWdhdGl2ZSBlcnJvciB2YWx1ZQorICovCitzdGF0aWMgaW50IGV4dDRfZHhfYWRkX2VudHJ5KGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSwKKwkJCSAgICAgc3RydWN0IGlub2RlICppbm9kZSkKK3sKKwlzdHJ1Y3QgZHhfZnJhbWUgZnJhbWVzWzJdLCAqZnJhbWU7CisJc3RydWN0IGR4X2VudHJ5ICplbnRyaWVzLCAqYXQ7CisJc3RydWN0IGR4X2hhc2hfaW5mbyBoaW5mbzsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKiBiaDsKKwlzdHJ1Y3QgaW5vZGUgKmRpciA9IGRlbnRyeS0+ZF9wYXJlbnQtPmRfaW5vZGU7CisJc3RydWN0IHN1cGVyX2Jsb2NrICogc2IgPSBkaXItPmlfc2I7CisJc3RydWN0IGV4dDRfZGlyX2VudHJ5XzIgKmRlOworCWludCBlcnI7CisKKwlmcmFtZSA9IGR4X3Byb2JlKGRlbnRyeSwgTlVMTCwgJmhpbmZvLCBmcmFtZXMsICZlcnIpOworCWlmICghZnJhbWUpCisJCXJldHVybiBlcnI7CisJZW50cmllcyA9IGZyYW1lLT5lbnRyaWVzOworCWF0ID0gZnJhbWUtPmF0OworCisJaWYgKCEoYmggPSBleHQ0X2JyZWFkKGhhbmRsZSxkaXIsIGR4X2dldF9ibG9jayhmcmFtZS0+YXQpLCAwLCAmZXJyKSkpCisJCWdvdG8gY2xlYW51cDsKKworCUJVRkZFUl9UUkFDRShiaCwgImdldF93cml0ZV9hY2Nlc3MiKTsKKwllcnIgPSBleHQ0X2pvdXJuYWxfZ2V0X3dyaXRlX2FjY2VzcyhoYW5kbGUsIGJoKTsKKwlpZiAoZXJyKQorCQlnb3RvIGpvdXJuYWxfZXJyb3I7CisKKwllcnIgPSBhZGRfZGlyZW50X3RvX2J1ZihoYW5kbGUsIGRlbnRyeSwgaW5vZGUsIE5VTEwsIGJoKTsKKwlpZiAoZXJyICE9IC1FTk9TUEMpIHsKKwkJYmggPSBOVUxMOworCQlnb3RvIGNsZWFudXA7CisJfQorCisJLyogQmxvY2sgZnVsbCwgc2hvdWxkIGNvbXByZXNzIGJ1dCBmb3Igbm93IGp1c3Qgc3BsaXQgKi8KKwlkeHRyYWNlKHByaW50aygidXNpbmcgJXUgb2YgJXUgbm9kZSBlbnRyaWVzXG4iLAorCQkgICAgICAgZHhfZ2V0X2NvdW50KGVudHJpZXMpLCBkeF9nZXRfbGltaXQoZW50cmllcykpKTsKKwkvKiBOZWVkIHRvIHNwbGl0IGluZGV4PyAqLworCWlmIChkeF9nZXRfY291bnQoZW50cmllcykgPT0gZHhfZ2V0X2xpbWl0KGVudHJpZXMpKSB7CisJCXUzMiBuZXdibG9jazsKKwkJdW5zaWduZWQgaWNvdW50ID0gZHhfZ2V0X2NvdW50KGVudHJpZXMpOworCQlpbnQgbGV2ZWxzID0gZnJhbWUgLSBmcmFtZXM7CisJCXN0cnVjdCBkeF9lbnRyeSAqZW50cmllczI7CisJCXN0cnVjdCBkeF9ub2RlICpub2RlMjsKKwkJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaDI7CisKKwkJaWYgKGxldmVscyAmJiAoZHhfZ2V0X2NvdW50KGZyYW1lcy0+ZW50cmllcykgPT0KKwkJCSAgICAgICBkeF9nZXRfbGltaXQoZnJhbWVzLT5lbnRyaWVzKSkpIHsKKwkJCWV4dDRfd2FybmluZyhzYiwgX19GVU5DVElPTl9fLAorCQkJCSAgICAgIkRpcmVjdG9yeSBpbmRleCBmdWxsISIpOworCQkJZXJyID0gLUVOT1NQQzsKKwkJCWdvdG8gY2xlYW51cDsKKwkJfQorCQliaDIgPSBleHQ0X2FwcGVuZCAoaGFuZGxlLCBkaXIsICZuZXdibG9jaywgJmVycik7CisJCWlmICghKGJoMikpCisJCQlnb3RvIGNsZWFudXA7CisJCW5vZGUyID0gKHN0cnVjdCBkeF9ub2RlICopKGJoMi0+Yl9kYXRhKTsKKwkJZW50cmllczIgPSBub2RlMi0+ZW50cmllczsKKwkJbm9kZTItPmZha2UucmVjX2xlbiA9IGNwdV90b19sZTE2KHNiLT5zX2Jsb2Nrc2l6ZSk7CisJCW5vZGUyLT5mYWtlLmlub2RlID0gMDsKKwkJQlVGRkVSX1RSQUNFKGZyYW1lLT5iaCwgImdldF93cml0ZV9hY2Nlc3MiKTsKKwkJZXJyID0gZXh0NF9qb3VybmFsX2dldF93cml0ZV9hY2Nlc3MoaGFuZGxlLCBmcmFtZS0+YmgpOworCQlpZiAoZXJyKQorCQkJZ290byBqb3VybmFsX2Vycm9yOworCQlpZiAobGV2ZWxzKSB7CisJCQl1bnNpZ25lZCBpY291bnQxID0gaWNvdW50LzIsIGljb3VudDIgPSBpY291bnQgLSBpY291bnQxOworCQkJdW5zaWduZWQgaGFzaDIgPSBkeF9nZXRfaGFzaChlbnRyaWVzICsgaWNvdW50MSk7CisJCQlkeHRyYWNlKHByaW50aygiU3BsaXQgaW5kZXggJWkvJWlcbiIsIGljb3VudDEsIGljb3VudDIpKTsKKworCQkJQlVGRkVSX1RSQUNFKGZyYW1lLT5iaCwgImdldF93cml0ZV9hY2Nlc3MiKTsgLyogaW5kZXggcm9vdCAqLworCQkJZXJyID0gZXh0NF9qb3VybmFsX2dldF93cml0ZV9hY2Nlc3MoaGFuZGxlLAorCQkJCQkJCSAgICAgZnJhbWVzWzBdLmJoKTsKKwkJCWlmIChlcnIpCisJCQkJZ290byBqb3VybmFsX2Vycm9yOworCisJCQltZW1jcHkgKChjaGFyICopIGVudHJpZXMyLCAoY2hhciAqKSAoZW50cmllcyArIGljb3VudDEpLAorCQkJCWljb3VudDIgKiBzaXplb2Yoc3RydWN0IGR4X2VudHJ5KSk7CisJCQlkeF9zZXRfY291bnQgKGVudHJpZXMsIGljb3VudDEpOworCQkJZHhfc2V0X2NvdW50IChlbnRyaWVzMiwgaWNvdW50Mik7CisJCQlkeF9zZXRfbGltaXQgKGVudHJpZXMyLCBkeF9ub2RlX2xpbWl0KGRpcikpOworCisJCQkvKiBXaGljaCBpbmRleCBibG9jayBnZXRzIHRoZSBuZXcgZW50cnk/ICovCisJCQlpZiAoYXQgLSBlbnRyaWVzID49IGljb3VudDEpIHsKKwkJCQlmcmFtZS0+YXQgPSBhdCA9IGF0IC0gZW50cmllcyAtIGljb3VudDEgKyBlbnRyaWVzMjsKKwkJCQlmcmFtZS0+ZW50cmllcyA9IGVudHJpZXMgPSBlbnRyaWVzMjsKKwkJCQlzd2FwKGZyYW1lLT5iaCwgYmgyKTsKKwkJCX0KKwkJCWR4X2luc2VydF9ibG9jayAoZnJhbWVzICsgMCwgaGFzaDIsIG5ld2Jsb2NrKTsKKwkJCWR4dHJhY2UoZHhfc2hvd19pbmRleCAoIm5vZGUiLCBmcmFtZXNbMV0uZW50cmllcykpOworCQkJZHh0cmFjZShkeF9zaG93X2luZGV4ICgibm9kZSIsCisJCQkgICAgICAgKChzdHJ1Y3QgZHhfbm9kZSAqKSBiaDItPmJfZGF0YSktPmVudHJpZXMpKTsKKwkJCWVyciA9IGV4dDRfam91cm5hbF9kaXJ0eV9tZXRhZGF0YShoYW5kbGUsIGJoMik7CisJCQlpZiAoZXJyKQorCQkJCWdvdG8gam91cm5hbF9lcnJvcjsKKwkJCWJyZWxzZSAoYmgyKTsKKwkJfSBlbHNlIHsKKwkJCWR4dHJhY2UocHJpbnRrKCJDcmVhdGluZyBzZWNvbmQgbGV2ZWwgaW5kZXguLi5cbiIpKTsKKwkJCW1lbWNweSgoY2hhciAqKSBlbnRyaWVzMiwgKGNoYXIgKikgZW50cmllcywKKwkJCSAgICAgICBpY291bnQgKiBzaXplb2Yoc3RydWN0IGR4X2VudHJ5KSk7CisJCQlkeF9zZXRfbGltaXQoZW50cmllczIsIGR4X25vZGVfbGltaXQoZGlyKSk7CisKKwkJCS8qIFNldCB1cCByb290ICovCisJCQlkeF9zZXRfY291bnQoZW50cmllcywgMSk7CisJCQlkeF9zZXRfYmxvY2soZW50cmllcyArIDAsIG5ld2Jsb2NrKTsKKwkJCSgoc3RydWN0IGR4X3Jvb3QgKikgZnJhbWVzWzBdLmJoLT5iX2RhdGEpLT5pbmZvLmluZGlyZWN0X2xldmVscyA9IDE7CisKKwkJCS8qIEFkZCBuZXcgYWNjZXNzIHBhdGggZnJhbWUgKi8KKwkJCWZyYW1lID0gZnJhbWVzICsgMTsKKwkJCWZyYW1lLT5hdCA9IGF0ID0gYXQgLSBlbnRyaWVzICsgZW50cmllczI7CisJCQlmcmFtZS0+ZW50cmllcyA9IGVudHJpZXMgPSBlbnRyaWVzMjsKKwkJCWZyYW1lLT5iaCA9IGJoMjsKKwkJCWVyciA9IGV4dDRfam91cm5hbF9nZXRfd3JpdGVfYWNjZXNzKGhhbmRsZSwKKwkJCQkJCQkgICAgIGZyYW1lLT5iaCk7CisJCQlpZiAoZXJyKQorCQkJCWdvdG8gam91cm5hbF9lcnJvcjsKKwkJfQorCQlleHQ0X2pvdXJuYWxfZGlydHlfbWV0YWRhdGEoaGFuZGxlLCBmcmFtZXNbMF0uYmgpOworCX0KKwlkZSA9IGRvX3NwbGl0KGhhbmRsZSwgZGlyLCAmYmgsIGZyYW1lLCAmaGluZm8sICZlcnIpOworCWlmICghZGUpCisJCWdvdG8gY2xlYW51cDsKKwllcnIgPSBhZGRfZGlyZW50X3RvX2J1ZihoYW5kbGUsIGRlbnRyeSwgaW5vZGUsIGRlLCBiaCk7CisJYmggPSBOVUxMOworCWdvdG8gY2xlYW51cDsKKworam91cm5hbF9lcnJvcjoKKwlleHQ0X3N0ZF9lcnJvcihkaXItPmlfc2IsIGVycik7CitjbGVhbnVwOgorCWlmIChiaCkKKwkJYnJlbHNlKGJoKTsKKwlkeF9yZWxlYXNlKGZyYW1lcyk7CisJcmV0dXJuIGVycjsKK30KKyNlbmRpZgorCisvKgorICogZXh0NF9kZWxldGVfZW50cnkgZGVsZXRlcyBhIGRpcmVjdG9yeSBlbnRyeSBieSBtZXJnaW5nIGl0IHdpdGggdGhlCisgKiBwcmV2aW91cyBlbnRyeQorICovCitzdGF0aWMgaW50IGV4dDRfZGVsZXRlX2VudHJ5IChoYW5kbGVfdCAqaGFuZGxlLAorCQkJICAgICAgc3RydWN0IGlub2RlICogZGlyLAorCQkJICAgICAgc3RydWN0IGV4dDRfZGlyX2VudHJ5XzIgKiBkZV9kZWwsCisJCQkgICAgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKiBiaCkKK3sKKwlzdHJ1Y3QgZXh0NF9kaXJfZW50cnlfMiAqIGRlLCAqIHBkZTsKKwlpbnQgaTsKKworCWkgPSAwOworCXBkZSA9IE5VTEw7CisJZGUgPSAoc3RydWN0IGV4dDRfZGlyX2VudHJ5XzIgKikgYmgtPmJfZGF0YTsKKwl3aGlsZSAoaSA8IGJoLT5iX3NpemUpIHsKKwkJaWYgKCFleHQ0X2NoZWNrX2Rpcl9lbnRyeSgiZXh0NF9kZWxldGVfZW50cnkiLCBkaXIsIGRlLCBiaCwgaSkpCisJCQlyZXR1cm4gLUVJTzsKKwkJaWYgKGRlID09IGRlX2RlbCkgIHsKKwkJCUJVRkZFUl9UUkFDRShiaCwgImdldF93cml0ZV9hY2Nlc3MiKTsKKwkJCWV4dDRfam91cm5hbF9nZXRfd3JpdGVfYWNjZXNzKGhhbmRsZSwgYmgpOworCQkJaWYgKHBkZSkKKwkJCQlwZGUtPnJlY19sZW4gPQorCQkJCQljcHVfdG9fbGUxNihsZTE2X3RvX2NwdShwZGUtPnJlY19sZW4pICsKKwkJCQkJCSAgICBsZTE2X3RvX2NwdShkZS0+cmVjX2xlbikpOworCQkJZWxzZQorCQkJCWRlLT5pbm9kZSA9IDA7CisJCQlkaXItPmlfdmVyc2lvbisrOworCQkJQlVGRkVSX1RSQUNFKGJoLCAiY2FsbCBleHQ0X2pvdXJuYWxfZGlydHlfbWV0YWRhdGEiKTsKKwkJCWV4dDRfam91cm5hbF9kaXJ0eV9tZXRhZGF0YShoYW5kbGUsIGJoKTsKKwkJCXJldHVybiAwOworCQl9CisJCWkgKz0gbGUxNl90b19jcHUoZGUtPnJlY19sZW4pOworCQlwZGUgPSBkZTsKKwkJZGUgPSAoc3RydWN0IGV4dDRfZGlyX2VudHJ5XzIgKikKKwkJCSgoY2hhciAqKSBkZSArIGxlMTZfdG9fY3B1KGRlLT5yZWNfbGVuKSk7CisJfQorCXJldHVybiAtRU5PRU5UOworfQorCisvKgorICogZXh0NF9tYXJrX2lub2RlX2RpcnR5IGlzIHNvbWV3aGF0IGV4cGVuc2l2ZSwgc28gdW5saWtlIGV4dDIgd2UKKyAqIGRvIG5vdCBwZXJmb3JtIGl0IGluIHRoZXNlIGZ1bmN0aW9ucy4gIFdlIHBlcmZvcm0gaXQgYXQgdGhlIGNhbGwgc2l0ZSwKKyAqIGlmIGl0IGlzIG5lZWRlZC4KKyAqLworc3RhdGljIGlubGluZSB2b2lkIGV4dDRfaW5jX2NvdW50KGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBpbm9kZSAqaW5vZGUpCit7CisJaW5jX25saW5rKGlub2RlKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGV4dDRfZGVjX2NvdW50KGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBpbm9kZSAqaW5vZGUpCit7CisJZHJvcF9ubGluayhpbm9kZSk7Cit9CisKK3N0YXRpYyBpbnQgZXh0NF9hZGRfbm9uZGlyKGhhbmRsZV90ICpoYW5kbGUsCisJCXN0cnVjdCBkZW50cnkgKmRlbnRyeSwgc3RydWN0IGlub2RlICppbm9kZSkKK3sKKwlpbnQgZXJyID0gZXh0NF9hZGRfZW50cnkoaGFuZGxlLCBkZW50cnksIGlub2RlKTsKKwlpZiAoIWVycikgeworCQlleHQ0X21hcmtfaW5vZGVfZGlydHkoaGFuZGxlLCBpbm9kZSk7CisJCWRfaW5zdGFudGlhdGUoZGVudHJ5LCBpbm9kZSk7CisJCXJldHVybiAwOworCX0KKwlleHQ0X2RlY19jb3VudChoYW5kbGUsIGlub2RlKTsKKwlpcHV0KGlub2RlKTsKKwlyZXR1cm4gZXJyOworfQorCisvKgorICogQnkgdGhlIHRpbWUgdGhpcyBpcyBjYWxsZWQsIHdlIGFscmVhZHkgaGF2ZSBjcmVhdGVkCisgKiB0aGUgZGlyZWN0b3J5IGNhY2hlIGVudHJ5IGZvciB0aGUgbmV3IGZpbGUsIGJ1dCBpdAorICogaXMgc28gZmFyIG5lZ2F0aXZlIC0gaXQgaGFzIG5vIGlub2RlLgorICoKKyAqIElmIHRoZSBjcmVhdGUgc3VjY2VlZHMsIHdlIGZpbGwgaW4gdGhlIGlub2RlIGluZm9ybWF0aW9uCisgKiB3aXRoIGRfaW5zdGFudGlhdGUoKS4KKyAqLworc3RhdGljIGludCBleHQ0X2NyZWF0ZSAoc3RydWN0IGlub2RlICogZGlyLCBzdHJ1Y3QgZGVudHJ5ICogZGVudHJ5LCBpbnQgbW9kZSwKKwkJc3RydWN0IG5hbWVpZGF0YSAqbmQpCit7CisJaGFuZGxlX3QgKmhhbmRsZTsKKwlzdHJ1Y3QgaW5vZGUgKiBpbm9kZTsKKwlpbnQgZXJyLCByZXRyaWVzID0gMDsKKworcmV0cnk6CisJaGFuZGxlID0gZXh0NF9qb3VybmFsX3N0YXJ0KGRpciwgRVhUNF9EQVRBX1RSQU5TX0JMT0NLUyhkaXItPmlfc2IpICsKKwkJCQkJRVhUNF9JTkRFWF9FWFRSQV9UUkFOU19CTE9DS1MgKyAzICsKKwkJCQkJMipFWFQ0X1FVT1RBX0lOSVRfQkxPQ0tTKGRpci0+aV9zYikpOworCWlmIChJU19FUlIoaGFuZGxlKSkKKwkJcmV0dXJuIFBUUl9FUlIoaGFuZGxlKTsKKworCWlmIChJU19ESVJTWU5DKGRpcikpCisJCWhhbmRsZS0+aF9zeW5jID0gMTsKKworCWlub2RlID0gZXh0NF9uZXdfaW5vZGUgKGhhbmRsZSwgZGlyLCBtb2RlKTsKKwllcnIgPSBQVFJfRVJSKGlub2RlKTsKKwlpZiAoIUlTX0VSUihpbm9kZSkpIHsKKwkJaW5vZGUtPmlfb3AgPSAmZXh0NF9maWxlX2lub2RlX29wZXJhdGlvbnM7CisJCWlub2RlLT5pX2ZvcCA9ICZleHQ0X2ZpbGVfb3BlcmF0aW9uczsKKwkJZXh0NF9zZXRfYW9wcyhpbm9kZSk7CisJCWVyciA9IGV4dDRfYWRkX25vbmRpcihoYW5kbGUsIGRlbnRyeSwgaW5vZGUpOworCX0KKwlleHQ0X2pvdXJuYWxfc3RvcChoYW5kbGUpOworCWlmIChlcnIgPT0gLUVOT1NQQyAmJiBleHQ0X3Nob3VsZF9yZXRyeV9hbGxvYyhkaXItPmlfc2IsICZyZXRyaWVzKSkKKwkJZ290byByZXRyeTsKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IGV4dDRfbWtub2QgKHN0cnVjdCBpbm9kZSAqIGRpciwgc3RydWN0IGRlbnRyeSAqZGVudHJ5LAorCQkJaW50IG1vZGUsIGRldl90IHJkZXYpCit7CisJaGFuZGxlX3QgKmhhbmRsZTsKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlOworCWludCBlcnIsIHJldHJpZXMgPSAwOworCisJaWYgKCFuZXdfdmFsaWRfZGV2KHJkZXYpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworcmV0cnk6CisJaGFuZGxlID0gZXh0NF9qb3VybmFsX3N0YXJ0KGRpciwgRVhUNF9EQVRBX1RSQU5TX0JMT0NLUyhkaXItPmlfc2IpICsKKwkJCQkJRVhUNF9JTkRFWF9FWFRSQV9UUkFOU19CTE9DS1MgKyAzICsKKwkJCQkJMipFWFQ0X1FVT1RBX0lOSVRfQkxPQ0tTKGRpci0+aV9zYikpOworCWlmIChJU19FUlIoaGFuZGxlKSkKKwkJcmV0dXJuIFBUUl9FUlIoaGFuZGxlKTsKKworCWlmIChJU19ESVJTWU5DKGRpcikpCisJCWhhbmRsZS0+aF9zeW5jID0gMTsKKworCWlub2RlID0gZXh0NF9uZXdfaW5vZGUgKGhhbmRsZSwgZGlyLCBtb2RlKTsKKwllcnIgPSBQVFJfRVJSKGlub2RlKTsKKwlpZiAoIUlTX0VSUihpbm9kZSkpIHsKKwkJaW5pdF9zcGVjaWFsX2lub2RlKGlub2RlLCBpbm9kZS0+aV9tb2RlLCByZGV2KTsKKyNpZmRlZiBDT05GSUdfRVhUNERFVl9GU19YQVRUUgorCQlpbm9kZS0+aV9vcCA9ICZleHQ0X3NwZWNpYWxfaW5vZGVfb3BlcmF0aW9uczsKKyNlbmRpZgorCQllcnIgPSBleHQ0X2FkZF9ub25kaXIoaGFuZGxlLCBkZW50cnksIGlub2RlKTsKKwl9CisJZXh0NF9qb3VybmFsX3N0b3AoaGFuZGxlKTsKKwlpZiAoZXJyID09IC1FTk9TUEMgJiYgZXh0NF9zaG91bGRfcmV0cnlfYWxsb2MoZGlyLT5pX3NiLCAmcmV0cmllcykpCisJCWdvdG8gcmV0cnk7CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBleHQ0X21rZGlyKHN0cnVjdCBpbm9kZSAqIGRpciwgc3RydWN0IGRlbnRyeSAqIGRlbnRyeSwgaW50IG1vZGUpCit7CisJaGFuZGxlX3QgKmhhbmRsZTsKKwlzdHJ1Y3QgaW5vZGUgKiBpbm9kZTsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKiBkaXJfYmxvY2s7CisJc3RydWN0IGV4dDRfZGlyX2VudHJ5XzIgKiBkZTsKKwlpbnQgZXJyLCByZXRyaWVzID0gMDsKKworCWlmIChkaXItPmlfbmxpbmsgPj0gRVhUNF9MSU5LX01BWCkKKwkJcmV0dXJuIC1FTUxJTks7CisKK3JldHJ5OgorCWhhbmRsZSA9IGV4dDRfam91cm5hbF9zdGFydChkaXIsIEVYVDRfREFUQV9UUkFOU19CTE9DS1MoZGlyLT5pX3NiKSArCisJCQkJCUVYVDRfSU5ERVhfRVhUUkFfVFJBTlNfQkxPQ0tTICsgMyArCisJCQkJCTIqRVhUNF9RVU9UQV9JTklUX0JMT0NLUyhkaXItPmlfc2IpKTsKKwlpZiAoSVNfRVJSKGhhbmRsZSkpCisJCXJldHVybiBQVFJfRVJSKGhhbmRsZSk7CisKKwlpZiAoSVNfRElSU1lOQyhkaXIpKQorCQloYW5kbGUtPmhfc3luYyA9IDE7CisKKwlpbm9kZSA9IGV4dDRfbmV3X2lub2RlIChoYW5kbGUsIGRpciwgU19JRkRJUiB8IG1vZGUpOworCWVyciA9IFBUUl9FUlIoaW5vZGUpOworCWlmIChJU19FUlIoaW5vZGUpKQorCQlnb3RvIG91dF9zdG9wOworCisJaW5vZGUtPmlfb3AgPSAmZXh0NF9kaXJfaW5vZGVfb3BlcmF0aW9uczsKKwlpbm9kZS0+aV9mb3AgPSAmZXh0NF9kaXJfb3BlcmF0aW9uczsKKwlpbm9kZS0+aV9zaXplID0gRVhUNF9JKGlub2RlKS0+aV9kaXNrc2l6ZSA9IGlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZTsKKwlkaXJfYmxvY2sgPSBleHQ0X2JyZWFkIChoYW5kbGUsIGlub2RlLCAwLCAxLCAmZXJyKTsKKwlpZiAoIWRpcl9ibG9jaykgeworCQlkcm9wX25saW5rKGlub2RlKTsgLyogaXMgdGhpcyBubGluayA9PSAwPyAqLworCQlleHQ0X21hcmtfaW5vZGVfZGlydHkoaGFuZGxlLCBpbm9kZSk7CisJCWlwdXQgKGlub2RlKTsKKwkJZ290byBvdXRfc3RvcDsKKwl9CisJQlVGRkVSX1RSQUNFKGRpcl9ibG9jaywgImdldF93cml0ZV9hY2Nlc3MiKTsKKwlleHQ0X2pvdXJuYWxfZ2V0X3dyaXRlX2FjY2VzcyhoYW5kbGUsIGRpcl9ibG9jayk7CisJZGUgPSAoc3RydWN0IGV4dDRfZGlyX2VudHJ5XzIgKikgZGlyX2Jsb2NrLT5iX2RhdGE7CisJZGUtPmlub2RlID0gY3B1X3RvX2xlMzIoaW5vZGUtPmlfaW5vKTsKKwlkZS0+bmFtZV9sZW4gPSAxOworCWRlLT5yZWNfbGVuID0gY3B1X3RvX2xlMTYoRVhUNF9ESVJfUkVDX0xFTihkZS0+bmFtZV9sZW4pKTsKKwlzdHJjcHkgKGRlLT5uYW1lLCAiLiIpOworCWV4dDRfc2V0X2RlX3R5cGUoZGlyLT5pX3NiLCBkZSwgU19JRkRJUik7CisJZGUgPSAoc3RydWN0IGV4dDRfZGlyX2VudHJ5XzIgKikKKwkJCSgoY2hhciAqKSBkZSArIGxlMTZfdG9fY3B1KGRlLT5yZWNfbGVuKSk7CisJZGUtPmlub2RlID0gY3B1X3RvX2xlMzIoZGlyLT5pX2lubyk7CisJZGUtPnJlY19sZW4gPSBjcHVfdG9fbGUxNihpbm9kZS0+aV9zYi0+c19ibG9ja3NpemUtRVhUNF9ESVJfUkVDX0xFTigxKSk7CisJZGUtPm5hbWVfbGVuID0gMjsKKwlzdHJjcHkgKGRlLT5uYW1lLCAiLi4iKTsKKwlleHQ0X3NldF9kZV90eXBlKGRpci0+aV9zYiwgZGUsIFNfSUZESVIpOworCWlub2RlLT5pX25saW5rID0gMjsKKwlCVUZGRVJfVFJBQ0UoZGlyX2Jsb2NrLCAiY2FsbCBleHQ0X2pvdXJuYWxfZGlydHlfbWV0YWRhdGEiKTsKKwlleHQ0X2pvdXJuYWxfZGlydHlfbWV0YWRhdGEoaGFuZGxlLCBkaXJfYmxvY2spOworCWJyZWxzZSAoZGlyX2Jsb2NrKTsKKwlleHQ0X21hcmtfaW5vZGVfZGlydHkoaGFuZGxlLCBpbm9kZSk7CisJZXJyID0gZXh0NF9hZGRfZW50cnkgKGhhbmRsZSwgZGVudHJ5LCBpbm9kZSk7CisJaWYgKGVycikgeworCQlpbm9kZS0+aV9ubGluayA9IDA7CisJCWV4dDRfbWFya19pbm9kZV9kaXJ0eShoYW5kbGUsIGlub2RlKTsKKwkJaXB1dCAoaW5vZGUpOworCQlnb3RvIG91dF9zdG9wOworCX0KKwlpbmNfbmxpbmsoZGlyKTsKKwlleHQ0X3VwZGF0ZV9keF9mbGFnKGRpcik7CisJZXh0NF9tYXJrX2lub2RlX2RpcnR5KGhhbmRsZSwgZGlyKTsKKwlkX2luc3RhbnRpYXRlKGRlbnRyeSwgaW5vZGUpOworb3V0X3N0b3A6CisJZXh0NF9qb3VybmFsX3N0b3AoaGFuZGxlKTsKKwlpZiAoZXJyID09IC1FTk9TUEMgJiYgZXh0NF9zaG91bGRfcmV0cnlfYWxsb2MoZGlyLT5pX3NiLCAmcmV0cmllcykpCisJCWdvdG8gcmV0cnk7CisJcmV0dXJuIGVycjsKK30KKworLyoKKyAqIHJvdXRpbmUgdG8gY2hlY2sgdGhhdCB0aGUgc3BlY2lmaWVkIGRpcmVjdG9yeSBpcyBlbXB0eSAoZm9yIHJtZGlyKQorICovCitzdGF0aWMgaW50IGVtcHR5X2RpciAoc3RydWN0IGlub2RlICogaW5vZGUpCit7CisJdW5zaWduZWQgbG9uZyBvZmZzZXQ7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICogYmg7CisJc3RydWN0IGV4dDRfZGlyX2VudHJ5XzIgKiBkZSwgKiBkZTE7CisJc3RydWN0IHN1cGVyX2Jsb2NrICogc2I7CisJaW50IGVyciA9IDA7CisKKwlzYiA9IGlub2RlLT5pX3NiOworCWlmIChpbm9kZS0+aV9zaXplIDwgRVhUNF9ESVJfUkVDX0xFTigxKSArIEVYVDRfRElSX1JFQ19MRU4oMikgfHwKKwkgICAgIShiaCA9IGV4dDRfYnJlYWQgKE5VTEwsIGlub2RlLCAwLCAwLCAmZXJyKSkpIHsKKwkJaWYgKGVycikKKwkJCWV4dDRfZXJyb3IoaW5vZGUtPmlfc2IsIF9fRlVOQ1RJT05fXywKKwkJCQkgICAiZXJyb3IgJWQgcmVhZGluZyBkaXJlY3RvcnkgIyVsdSBvZmZzZXQgMCIsCisJCQkJICAgZXJyLCBpbm9kZS0+aV9pbm8pOworCQllbHNlCisJCQlleHQ0X3dhcm5pbmcoaW5vZGUtPmlfc2IsIF9fRlVOQ1RJT05fXywKKwkJCQkgICAgICJiYWQgZGlyZWN0b3J5IChkaXIgIyVsdSkgLSBubyBkYXRhIGJsb2NrIiwKKwkJCQkgICAgIGlub2RlLT5pX2lubyk7CisJCXJldHVybiAxOworCX0KKwlkZSA9IChzdHJ1Y3QgZXh0NF9kaXJfZW50cnlfMiAqKSBiaC0+Yl9kYXRhOworCWRlMSA9IChzdHJ1Y3QgZXh0NF9kaXJfZW50cnlfMiAqKQorCQkJKChjaGFyICopIGRlICsgbGUxNl90b19jcHUoZGUtPnJlY19sZW4pKTsKKwlpZiAobGUzMl90b19jcHUoZGUtPmlub2RlKSAhPSBpbm9kZS0+aV9pbm8gfHwKKwkJCSFsZTMyX3RvX2NwdShkZTEtPmlub2RlKSB8fAorCQkJc3RyY21wICgiLiIsIGRlLT5uYW1lKSB8fAorCQkJc3RyY21wICgiLi4iLCBkZTEtPm5hbWUpKSB7CisJCWV4dDRfd2FybmluZyAoaW5vZGUtPmlfc2IsICJlbXB0eV9kaXIiLAorCQkJICAgICAgImJhZCBkaXJlY3RvcnkgKGRpciAjJWx1KSAtIG5vIGAuJyBvciBgLi4nIiwKKwkJCSAgICAgIGlub2RlLT5pX2lubyk7CisJCWJyZWxzZSAoYmgpOworCQlyZXR1cm4gMTsKKwl9CisJb2Zmc2V0ID0gbGUxNl90b19jcHUoZGUtPnJlY19sZW4pICsgbGUxNl90b19jcHUoZGUxLT5yZWNfbGVuKTsKKwlkZSA9IChzdHJ1Y3QgZXh0NF9kaXJfZW50cnlfMiAqKQorCQkJKChjaGFyICopIGRlMSArIGxlMTZfdG9fY3B1KGRlMS0+cmVjX2xlbikpOworCXdoaWxlIChvZmZzZXQgPCBpbm9kZS0+aV9zaXplICkgeworCQlpZiAoIWJoIHx8CisJCQkodm9pZCAqKSBkZSA+PSAodm9pZCAqKSAoYmgtPmJfZGF0YStzYi0+c19ibG9ja3NpemUpKSB7CisJCQllcnIgPSAwOworCQkJYnJlbHNlIChiaCk7CisJCQliaCA9IGV4dDRfYnJlYWQgKE5VTEwsIGlub2RlLAorCQkJCW9mZnNldCA+PiBFWFQ0X0JMT0NLX1NJWkVfQklUUyhzYiksIDAsICZlcnIpOworCQkJaWYgKCFiaCkgeworCQkJCWlmIChlcnIpCisJCQkJCWV4dDRfZXJyb3Ioc2IsIF9fRlVOQ1RJT05fXywKKwkJCQkJCSAgICJlcnJvciAlZCByZWFkaW5nIGRpcmVjdG9yeSIKKwkJCQkJCSAgICIgIyVsdSBvZmZzZXQgJWx1IiwKKwkJCQkJCSAgIGVyciwgaW5vZGUtPmlfaW5vLCBvZmZzZXQpOworCQkJCW9mZnNldCArPSBzYi0+c19ibG9ja3NpemU7CisJCQkJY29udGludWU7CisJCQl9CisJCQlkZSA9IChzdHJ1Y3QgZXh0NF9kaXJfZW50cnlfMiAqKSBiaC0+Yl9kYXRhOworCQl9CisJCWlmICghZXh0NF9jaGVja19kaXJfZW50cnkoImVtcHR5X2RpciIsIGlub2RlLCBkZSwgYmgsIG9mZnNldCkpIHsKKwkJCWRlID0gKHN0cnVjdCBleHQ0X2Rpcl9lbnRyeV8yICopKGJoLT5iX2RhdGEgKworCQkJCQkJCSBzYi0+c19ibG9ja3NpemUpOworCQkJb2Zmc2V0ID0gKG9mZnNldCB8IChzYi0+c19ibG9ja3NpemUgLSAxKSkgKyAxOworCQkJY29udGludWU7CisJCX0KKwkJaWYgKGxlMzJfdG9fY3B1KGRlLT5pbm9kZSkpIHsKKwkJCWJyZWxzZSAoYmgpOworCQkJcmV0dXJuIDA7CisJCX0KKwkJb2Zmc2V0ICs9IGxlMTZfdG9fY3B1KGRlLT5yZWNfbGVuKTsKKwkJZGUgPSAoc3RydWN0IGV4dDRfZGlyX2VudHJ5XzIgKikKKwkJCQkoKGNoYXIgKikgZGUgKyBsZTE2X3RvX2NwdShkZS0+cmVjX2xlbikpOworCX0KKwlicmVsc2UgKGJoKTsKKwlyZXR1cm4gMTsKK30KKworLyogZXh0NF9vcnBoYW5fYWRkKCkgbGlua3MgYW4gdW5saW5rZWQgb3IgdHJ1bmNhdGVkIGlub2RlIGludG8gYSBsaXN0IG9mCisgKiBzdWNoIGlub2Rlcywgc3RhcnRpbmcgYXQgdGhlIHN1cGVyYmxvY2ssIGluIGNhc2Ugd2UgY3Jhc2ggYmVmb3JlIHRoZQorICogZmlsZSBpcyBjbG9zZWQvZGVsZXRlZCwgb3IgaW4gY2FzZSB0aGUgaW5vZGUgdHJ1bmNhdGUgc3BhbnMgbXVsdGlwbGUKKyAqIHRyYW5zYWN0aW9ucyBhbmQgdGhlIGxhc3QgdHJhbnNhY3Rpb24gaXMgbm90IHJlY292ZXJlZCBhZnRlciBhIGNyYXNoLgorICoKKyAqIEF0IGZpbGVzeXN0ZW0gcmVjb3ZlcnkgdGltZSwgd2Ugd2FsayB0aGlzIGxpc3QgZGVsZXRpbmcgdW5saW5rZWQKKyAqIGlub2RlcyBhbmQgdHJ1bmNhdGluZyBsaW5rZWQgaW5vZGVzIGluIGV4dDRfb3JwaGFuX2NsZWFudXAoKS4KKyAqLworaW50IGV4dDRfb3JwaGFuX2FkZChoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3QgaW5vZGUgKmlub2RlKQoreworCXN0cnVjdCBzdXBlcl9ibG9jayAqc2IgPSBpbm9kZS0+aV9zYjsKKwlzdHJ1Y3QgZXh0NF9pbG9jIGlsb2M7CisJaW50IGVyciA9IDAsIHJjOworCisJbG9ja19zdXBlcihzYik7CisJaWYgKCFsaXN0X2VtcHR5KCZFWFQ0X0koaW5vZGUpLT5pX29ycGhhbikpCisJCWdvdG8gb3V0X3VubG9jazsKKworCS8qIE9ycGhhbiBoYW5kbGluZyBpcyBvbmx5IHZhbGlkIGZvciBmaWxlcyB3aXRoIGRhdGEgYmxvY2tzCisJICogYmVpbmcgdHJ1bmNhdGVkLCBvciBmaWxlcyBiZWluZyB1bmxpbmtlZC4gKi8KKworCS8qIEBAQCBGSVhNRTogT2JzZXJ2YXRpb24gZnJvbSBhdmlybzoKKwkgKiBJIHRoaW5rIEkgY2FuIHRyaWdnZXIgSl9BU1NFUlQgaW4gZXh0NF9vcnBoYW5fYWRkKCkuICBXZSBibG9jaworCSAqIGhlcmUgKG9uIGxvY2tfc3VwZXIoKSksIHNvIHJhY2Ugd2l0aCBleHQ0X2xpbmsoKSB3aGljaCBtaWdodCBidW1wCisJICogLT5pX25saW5rLiBGb3IsIHNheSBpdCwgY2hhcmFjdGVyIGRldmljZS4gTm90IGEgcmVndWxhciBmaWxlLAorCSAqIG5vdCBhIGRpcmVjdG9yeSwgbm90IGEgc3ltbGluayBhbmQgLT5pX25saW5rID4gMC4KKwkgKi8KKwlKX0FTU0VSVCAoKFNfSVNSRUcoaW5vZGUtPmlfbW9kZSkgfHwgU19JU0RJUihpbm9kZS0+aV9tb2RlKSB8fAorCQlTX0lTTE5LKGlub2RlLT5pX21vZGUpKSB8fCBpbm9kZS0+aV9ubGluayA9PSAwKTsKKworCUJVRkZFUl9UUkFDRShFWFQ0X1NCKHNiKS0+c19zYmgsICJnZXRfd3JpdGVfYWNjZXNzIik7CisJZXJyID0gZXh0NF9qb3VybmFsX2dldF93cml0ZV9hY2Nlc3MoaGFuZGxlLCBFWFQ0X1NCKHNiKS0+c19zYmgpOworCWlmIChlcnIpCisJCWdvdG8gb3V0X3VubG9jazsKKworCWVyciA9IGV4dDRfcmVzZXJ2ZV9pbm9kZV93cml0ZShoYW5kbGUsIGlub2RlLCAmaWxvYyk7CisJaWYgKGVycikKKwkJZ290byBvdXRfdW5sb2NrOworCisJLyogSW5zZXJ0IHRoaXMgaW5vZGUgYXQgdGhlIGhlYWQgb2YgdGhlIG9uLWRpc2sgb3JwaGFuIGxpc3QuLi4gKi8KKwlORVhUX09SUEhBTihpbm9kZSkgPSBsZTMyX3RvX2NwdShFWFQ0X1NCKHNiKS0+c19lcy0+c19sYXN0X29ycGhhbik7CisJRVhUNF9TQihzYiktPnNfZXMtPnNfbGFzdF9vcnBoYW4gPSBjcHVfdG9fbGUzMihpbm9kZS0+aV9pbm8pOworCWVyciA9IGV4dDRfam91cm5hbF9kaXJ0eV9tZXRhZGF0YShoYW5kbGUsIEVYVDRfU0Ioc2IpLT5zX3NiaCk7CisJcmMgPSBleHQ0X21hcmtfaWxvY19kaXJ0eShoYW5kbGUsIGlub2RlLCAmaWxvYyk7CisJaWYgKCFlcnIpCisJCWVyciA9IHJjOworCisJLyogT25seSBhZGQgdG8gdGhlIGhlYWQgb2YgdGhlIGluLW1lbW9yeSBsaXN0IGlmIGFsbCB0aGUKKwkgKiBwcmV2aW91cyBvcGVyYXRpb25zIHN1Y2NlZWRlZC4gIElmIHRoZSBvcnBoYW5fYWRkIGlzIGdvaW5nIHRvCisJICogZmFpbCAocG9zc2libHkgdGFraW5nIHRoZSBqb3VybmFsIG9mZmxpbmUpLCB3ZSBjYW4ndCByaXNrCisJICogbGVhdmluZyB0aGUgaW5vZGUgb24gdGhlIG9ycGhhbiBsaXN0OiBzdHJheSBvcnBoYW4tbGlzdAorCSAqIGVudHJpZXMgY2FuIGNhdXNlIHBhbmljcyBhdCB1bm1vdW50IHRpbWUuCisJICoKKwkgKiBUaGlzIGlzIHNhZmU6IG9uIGVycm9yIHdlJ3JlIGdvaW5nIHRvIGlnbm9yZSB0aGUgb3JwaGFuIGxpc3QKKwkgKiBhbnl3YXkgb24gdGhlIG5leHQgcmVjb3ZlcnkuICovCisJaWYgKCFlcnIpCisJCWxpc3RfYWRkKCZFWFQ0X0koaW5vZGUpLT5pX29ycGhhbiwgJkVYVDRfU0Ioc2IpLT5zX29ycGhhbik7CisKKwlqYmRfZGVidWcoNCwgInN1cGVyYmxvY2sgd2lsbCBwb2ludCB0byAlbHVcbiIsIGlub2RlLT5pX2lubyk7CisJamJkX2RlYnVnKDQsICJvcnBoYW4gaW5vZGUgJWx1IHdpbGwgcG9pbnQgdG8gJWRcbiIsCisJCQlpbm9kZS0+aV9pbm8sIE5FWFRfT1JQSEFOKGlub2RlKSk7CitvdXRfdW5sb2NrOgorCXVubG9ja19zdXBlcihzYik7CisJZXh0NF9zdGRfZXJyb3IoaW5vZGUtPmlfc2IsIGVycik7CisJcmV0dXJuIGVycjsKK30KKworLyoKKyAqIGV4dDRfb3JwaGFuX2RlbCgpIHJlbW92ZXMgYW4gdW5saW5rZWQgb3IgdHJ1bmNhdGVkIGlub2RlIGZyb20gdGhlIGxpc3QKKyAqIG9mIHN1Y2ggaW5vZGVzIHN0b3JlZCBvbiBkaXNrLCBiZWNhdXNlIGl0IGlzIGZpbmFsbHkgYmVpbmcgY2xlYW5lZCB1cC4KKyAqLworaW50IGV4dDRfb3JwaGFuX2RlbChoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3QgaW5vZGUgKmlub2RlKQoreworCXN0cnVjdCBsaXN0X2hlYWQgKnByZXY7CisJc3RydWN0IGV4dDRfaW5vZGVfaW5mbyAqZWkgPSBFWFQ0X0koaW5vZGUpOworCXN0cnVjdCBleHQ0X3NiX2luZm8gKnNiaTsKKwl1bnNpZ25lZCBsb25nIGlub19uZXh0OworCXN0cnVjdCBleHQ0X2lsb2MgaWxvYzsKKwlpbnQgZXJyID0gMDsKKworCWxvY2tfc3VwZXIoaW5vZGUtPmlfc2IpOworCWlmIChsaXN0X2VtcHR5KCZlaS0+aV9vcnBoYW4pKSB7CisJCXVubG9ja19zdXBlcihpbm9kZS0+aV9zYik7CisJCXJldHVybiAwOworCX0KKworCWlub19uZXh0ID0gTkVYVF9PUlBIQU4oaW5vZGUpOworCXByZXYgPSBlaS0+aV9vcnBoYW4ucHJldjsKKwlzYmkgPSBFWFQ0X1NCKGlub2RlLT5pX3NiKTsKKworCWpiZF9kZWJ1Zyg0LCAicmVtb3ZlIGlub2RlICVsdSBmcm9tIG9ycGhhbiBsaXN0XG4iLCBpbm9kZS0+aV9pbm8pOworCisJbGlzdF9kZWxfaW5pdCgmZWktPmlfb3JwaGFuKTsKKworCS8qIElmIHdlJ3JlIG9uIGFuIGVycm9yIHBhdGgsIHdlIG1heSBub3QgaGF2ZSBhIHZhbGlkCisJICogdHJhbnNhY3Rpb24gaGFuZGxlIHdpdGggd2hpY2ggdG8gdXBkYXRlIHRoZSBvcnBoYW4gbGlzdCBvbgorCSAqIGRpc2ssIGJ1dCB3ZSBzdGlsbCBuZWVkIHRvIHJlbW92ZSB0aGUgaW5vZGUgZnJvbSB0aGUgbGlua2VkCisJICogbGlzdCBpbiBtZW1vcnkuICovCisJaWYgKCFoYW5kbGUpCisJCWdvdG8gb3V0OworCisJZXJyID0gZXh0NF9yZXNlcnZlX2lub2RlX3dyaXRlKGhhbmRsZSwgaW5vZGUsICZpbG9jKTsKKwlpZiAoZXJyKQorCQlnb3RvIG91dF9lcnI7CisKKwlpZiAocHJldiA9PSAmc2JpLT5zX29ycGhhbikgeworCQlqYmRfZGVidWcoNCwgInN1cGVyYmxvY2sgd2lsbCBwb2ludCB0byAlbHVcbiIsIGlub19uZXh0KTsKKwkJQlVGRkVSX1RSQUNFKHNiaS0+c19zYmgsICJnZXRfd3JpdGVfYWNjZXNzIik7CisJCWVyciA9IGV4dDRfam91cm5hbF9nZXRfd3JpdGVfYWNjZXNzKGhhbmRsZSwgc2JpLT5zX3NiaCk7CisJCWlmIChlcnIpCisJCQlnb3RvIG91dF9icmVsc2U7CisJCXNiaS0+c19lcy0+c19sYXN0X29ycGhhbiA9IGNwdV90b19sZTMyKGlub19uZXh0KTsKKwkJZXJyID0gZXh0NF9qb3VybmFsX2RpcnR5X21ldGFkYXRhKGhhbmRsZSwgc2JpLT5zX3NiaCk7CisJfSBlbHNlIHsKKwkJc3RydWN0IGV4dDRfaWxvYyBpbG9jMjsKKwkJc3RydWN0IGlub2RlICppX3ByZXYgPQorCQkJJmxpc3RfZW50cnkocHJldiwgc3RydWN0IGV4dDRfaW5vZGVfaW5mbywgaV9vcnBoYW4pLT52ZnNfaW5vZGU7CisKKwkJamJkX2RlYnVnKDQsICJvcnBoYW4gaW5vZGUgJWx1IHdpbGwgcG9pbnQgdG8gJWx1XG4iLAorCQkJICBpX3ByZXYtPmlfaW5vLCBpbm9fbmV4dCk7CisJCWVyciA9IGV4dDRfcmVzZXJ2ZV9pbm9kZV93cml0ZShoYW5kbGUsIGlfcHJldiwgJmlsb2MyKTsKKwkJaWYgKGVycikKKwkJCWdvdG8gb3V0X2JyZWxzZTsKKwkJTkVYVF9PUlBIQU4oaV9wcmV2KSA9IGlub19uZXh0OworCQllcnIgPSBleHQ0X21hcmtfaWxvY19kaXJ0eShoYW5kbGUsIGlfcHJldiwgJmlsb2MyKTsKKwl9CisJaWYgKGVycikKKwkJZ290byBvdXRfYnJlbHNlOworCU5FWFRfT1JQSEFOKGlub2RlKSA9IDA7CisJZXJyID0gZXh0NF9tYXJrX2lsb2NfZGlydHkoaGFuZGxlLCBpbm9kZSwgJmlsb2MpOworCitvdXRfZXJyOgorCWV4dDRfc3RkX2Vycm9yKGlub2RlLT5pX3NiLCBlcnIpOworb3V0OgorCXVubG9ja19zdXBlcihpbm9kZS0+aV9zYik7CisJcmV0dXJuIGVycjsKKworb3V0X2JyZWxzZToKKwlicmVsc2UoaWxvYy5iaCk7CisJZ290byBvdXRfZXJyOworfQorCitzdGF0aWMgaW50IGV4dDRfcm1kaXIgKHN0cnVjdCBpbm9kZSAqIGRpciwgc3RydWN0IGRlbnRyeSAqZGVudHJ5KQoreworCWludCByZXR2YWw7CisJc3RydWN0IGlub2RlICogaW5vZGU7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICogYmg7CisJc3RydWN0IGV4dDRfZGlyX2VudHJ5XzIgKiBkZTsKKwloYW5kbGVfdCAqaGFuZGxlOworCisJLyogSW5pdGlhbGl6ZSBxdW90YXMgYmVmb3JlIHNvIHRoYXQgZXZlbnR1YWwgd3JpdGVzIGdvIGluCisJICogc2VwYXJhdGUgdHJhbnNhY3Rpb24gKi8KKwlEUVVPVF9JTklUKGRlbnRyeS0+ZF9pbm9kZSk7CisJaGFuZGxlID0gZXh0NF9qb3VybmFsX3N0YXJ0KGRpciwgRVhUNF9ERUxFVEVfVFJBTlNfQkxPQ0tTKGRpci0+aV9zYikpOworCWlmIChJU19FUlIoaGFuZGxlKSkKKwkJcmV0dXJuIFBUUl9FUlIoaGFuZGxlKTsKKworCXJldHZhbCA9IC1FTk9FTlQ7CisJYmggPSBleHQ0X2ZpbmRfZW50cnkgKGRlbnRyeSwgJmRlKTsKKwlpZiAoIWJoKQorCQlnb3RvIGVuZF9ybWRpcjsKKworCWlmIChJU19ESVJTWU5DKGRpcikpCisJCWhhbmRsZS0+aF9zeW5jID0gMTsKKworCWlub2RlID0gZGVudHJ5LT5kX2lub2RlOworCisJcmV0dmFsID0gLUVJTzsKKwlpZiAobGUzMl90b19jcHUoZGUtPmlub2RlKSAhPSBpbm9kZS0+aV9pbm8pCisJCWdvdG8gZW5kX3JtZGlyOworCisJcmV0dmFsID0gLUVOT1RFTVBUWTsKKwlpZiAoIWVtcHR5X2RpciAoaW5vZGUpKQorCQlnb3RvIGVuZF9ybWRpcjsKKworCXJldHZhbCA9IGV4dDRfZGVsZXRlX2VudHJ5KGhhbmRsZSwgZGlyLCBkZSwgYmgpOworCWlmIChyZXR2YWwpCisJCWdvdG8gZW5kX3JtZGlyOworCWlmIChpbm9kZS0+aV9ubGluayAhPSAyKQorCQlleHQ0X3dhcm5pbmcgKGlub2RlLT5pX3NiLCAiZXh0NF9ybWRpciIsCisJCQkgICAgICAiZW1wdHkgZGlyZWN0b3J5IGhhcyBubGluayE9MiAoJWQpIiwKKwkJCSAgICAgIGlub2RlLT5pX25saW5rKTsKKwlpbm9kZS0+aV92ZXJzaW9uKys7CisJY2xlYXJfbmxpbmsoaW5vZGUpOworCS8qIFRoZXJlJ3Mgbm8gbmVlZCB0byBzZXQgaV9kaXNrc2l6ZTogdGhlIGZhY3QgdGhhdCBpX25saW5rIGlzCisJICogemVybyB3aWxsIGVuc3VyZSB0aGF0IHRoZSByaWdodCB0aGluZyBoYXBwZW5zIGR1cmluZyBhbnkKKwkgKiByZWNvdmVyeS4gKi8KKwlpbm9kZS0+aV9zaXplID0gMDsKKwlleHQ0X29ycGhhbl9hZGQoaGFuZGxlLCBpbm9kZSk7CisJaW5vZGUtPmlfY3RpbWUgPSBkaXItPmlfY3RpbWUgPSBkaXItPmlfbXRpbWUgPSBDVVJSRU5UX1RJTUVfU0VDOworCWV4dDRfbWFya19pbm9kZV9kaXJ0eShoYW5kbGUsIGlub2RlKTsKKwlkcm9wX25saW5rKGRpcik7CisJZXh0NF91cGRhdGVfZHhfZmxhZyhkaXIpOworCWV4dDRfbWFya19pbm9kZV9kaXJ0eShoYW5kbGUsIGRpcik7CisKK2VuZF9ybWRpcjoKKwlleHQ0X2pvdXJuYWxfc3RvcChoYW5kbGUpOworCWJyZWxzZSAoYmgpOworCXJldHVybiByZXR2YWw7Cit9CisKK3N0YXRpYyBpbnQgZXh0NF91bmxpbmsoc3RydWN0IGlub2RlICogZGlyLCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnkpCit7CisJaW50IHJldHZhbDsKKwlzdHJ1Y3QgaW5vZGUgKiBpbm9kZTsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKiBiaDsKKwlzdHJ1Y3QgZXh0NF9kaXJfZW50cnlfMiAqIGRlOworCWhhbmRsZV90ICpoYW5kbGU7CisKKwkvKiBJbml0aWFsaXplIHF1b3RhcyBiZWZvcmUgc28gdGhhdCBldmVudHVhbCB3cml0ZXMgZ28KKwkgKiBpbiBzZXBhcmF0ZSB0cmFuc2FjdGlvbiAqLworCURRVU9UX0lOSVQoZGVudHJ5LT5kX2lub2RlKTsKKwloYW5kbGUgPSBleHQ0X2pvdXJuYWxfc3RhcnQoZGlyLCBFWFQ0X0RFTEVURV9UUkFOU19CTE9DS1MoZGlyLT5pX3NiKSk7CisJaWYgKElTX0VSUihoYW5kbGUpKQorCQlyZXR1cm4gUFRSX0VSUihoYW5kbGUpOworCisJaWYgKElTX0RJUlNZTkMoZGlyKSkKKwkJaGFuZGxlLT5oX3N5bmMgPSAxOworCisJcmV0dmFsID0gLUVOT0VOVDsKKwliaCA9IGV4dDRfZmluZF9lbnRyeSAoZGVudHJ5LCAmZGUpOworCWlmICghYmgpCisJCWdvdG8gZW5kX3VubGluazsKKworCWlub2RlID0gZGVudHJ5LT5kX2lub2RlOworCisJcmV0dmFsID0gLUVJTzsKKwlpZiAobGUzMl90b19jcHUoZGUtPmlub2RlKSAhPSBpbm9kZS0+aV9pbm8pCisJCWdvdG8gZW5kX3VubGluazsKKworCWlmICghaW5vZGUtPmlfbmxpbmspIHsKKwkJZXh0NF93YXJuaW5nIChpbm9kZS0+aV9zYiwgImV4dDRfdW5saW5rIiwKKwkJCSAgICAgICJEZWxldGluZyBub25leGlzdGVudCBmaWxlICglbHUpLCAlZCIsCisJCQkgICAgICBpbm9kZS0+aV9pbm8sIGlub2RlLT5pX25saW5rKTsKKwkJaW5vZGUtPmlfbmxpbmsgPSAxOworCX0KKwlyZXR2YWwgPSBleHQ0X2RlbGV0ZV9lbnRyeShoYW5kbGUsIGRpciwgZGUsIGJoKTsKKwlpZiAocmV0dmFsKQorCQlnb3RvIGVuZF91bmxpbms7CisJZGlyLT5pX2N0aW1lID0gZGlyLT5pX210aW1lID0gQ1VSUkVOVF9USU1FX1NFQzsKKwlleHQ0X3VwZGF0ZV9keF9mbGFnKGRpcik7CisJZXh0NF9tYXJrX2lub2RlX2RpcnR5KGhhbmRsZSwgZGlyKTsKKwlkcm9wX25saW5rKGlub2RlKTsKKwlpZiAoIWlub2RlLT5pX25saW5rKQorCQlleHQ0X29ycGhhbl9hZGQoaGFuZGxlLCBpbm9kZSk7CisJaW5vZGUtPmlfY3RpbWUgPSBkaXItPmlfY3RpbWU7CisJZXh0NF9tYXJrX2lub2RlX2RpcnR5KGhhbmRsZSwgaW5vZGUpOworCXJldHZhbCA9IDA7CisKK2VuZF91bmxpbms6CisJZXh0NF9qb3VybmFsX3N0b3AoaGFuZGxlKTsKKwlicmVsc2UgKGJoKTsKKwlyZXR1cm4gcmV0dmFsOworfQorCitzdGF0aWMgaW50IGV4dDRfc3ltbGluayAoc3RydWN0IGlub2RlICogZGlyLAorCQlzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIGNvbnN0IGNoYXIgKiBzeW1uYW1lKQoreworCWhhbmRsZV90ICpoYW5kbGU7CisJc3RydWN0IGlub2RlICogaW5vZGU7CisJaW50IGwsIGVyciwgcmV0cmllcyA9IDA7CisKKwlsID0gc3RybGVuKHN5bW5hbWUpKzE7CisJaWYgKGwgPiBkaXItPmlfc2ItPnNfYmxvY2tzaXplKQorCQlyZXR1cm4gLUVOQU1FVE9PTE9ORzsKKworcmV0cnk6CisJaGFuZGxlID0gZXh0NF9qb3VybmFsX3N0YXJ0KGRpciwgRVhUNF9EQVRBX1RSQU5TX0JMT0NLUyhkaXItPmlfc2IpICsKKwkJCQkJRVhUNF9JTkRFWF9FWFRSQV9UUkFOU19CTE9DS1MgKyA1ICsKKwkJCQkJMipFWFQ0X1FVT1RBX0lOSVRfQkxPQ0tTKGRpci0+aV9zYikpOworCWlmIChJU19FUlIoaGFuZGxlKSkKKwkJcmV0dXJuIFBUUl9FUlIoaGFuZGxlKTsKKworCWlmIChJU19ESVJTWU5DKGRpcikpCisJCWhhbmRsZS0+aF9zeW5jID0gMTsKKworCWlub2RlID0gZXh0NF9uZXdfaW5vZGUgKGhhbmRsZSwgZGlyLCBTX0lGTE5LfFNfSVJXWFVHTyk7CisJZXJyID0gUFRSX0VSUihpbm9kZSk7CisJaWYgKElTX0VSUihpbm9kZSkpCisJCWdvdG8gb3V0X3N0b3A7CisKKwlpZiAobCA+IHNpemVvZiAoRVhUNF9JKGlub2RlKS0+aV9kYXRhKSkgeworCQlpbm9kZS0+aV9vcCA9ICZleHQ0X3N5bWxpbmtfaW5vZGVfb3BlcmF0aW9uczsKKwkJZXh0NF9zZXRfYW9wcyhpbm9kZSk7CisJCS8qCisJCSAqIHBhZ2Vfc3ltbGluaygpIGNhbGxzIGludG8gZXh0NF9wcmVwYXJlL2NvbW1pdF93cml0ZS4KKwkJICogV2UgaGF2ZSBhIHRyYW5zYWN0aW9uIG9wZW4uICBBbGwgaXMgc3dlZXRuZXNzLiAgSXQgYWxzbyBzZXRzCisJCSAqIGlfc2l6ZSBpbiBnZW5lcmljX2NvbW1pdF93cml0ZSgpLgorCQkgKi8KKwkJZXJyID0gX19wYWdlX3N5bWxpbmsoaW5vZGUsIHN5bW5hbWUsIGwsCisJCQkJbWFwcGluZ19nZnBfbWFzayhpbm9kZS0+aV9tYXBwaW5nKSAmIH5fX0dGUF9GUyk7CisJCWlmIChlcnIpIHsKKwkJCWV4dDRfZGVjX2NvdW50KGhhbmRsZSwgaW5vZGUpOworCQkJZXh0NF9tYXJrX2lub2RlX2RpcnR5KGhhbmRsZSwgaW5vZGUpOworCQkJaXB1dCAoaW5vZGUpOworCQkJZ290byBvdXRfc3RvcDsKKwkJfQorCX0gZWxzZSB7CisJCWlub2RlLT5pX29wID0gJmV4dDRfZmFzdF9zeW1saW5rX2lub2RlX29wZXJhdGlvbnM7CisJCW1lbWNweSgoY2hhciopJkVYVDRfSShpbm9kZSktPmlfZGF0YSxzeW1uYW1lLGwpOworCQlpbm9kZS0+aV9zaXplID0gbC0xOworCX0KKwlFWFQ0X0koaW5vZGUpLT5pX2Rpc2tzaXplID0gaW5vZGUtPmlfc2l6ZTsKKwllcnIgPSBleHQ0X2FkZF9ub25kaXIoaGFuZGxlLCBkZW50cnksIGlub2RlKTsKK291dF9zdG9wOgorCWV4dDRfam91cm5hbF9zdG9wKGhhbmRsZSk7CisJaWYgKGVyciA9PSAtRU5PU1BDICYmIGV4dDRfc2hvdWxkX3JldHJ5X2FsbG9jKGRpci0+aV9zYiwgJnJldHJpZXMpKQorCQlnb3RvIHJldHJ5OworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgZXh0NF9saW5rIChzdHJ1Y3QgZGVudHJ5ICogb2xkX2RlbnRyeSwKKwkJc3RydWN0IGlub2RlICogZGlyLCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnkpCit7CisJaGFuZGxlX3QgKmhhbmRsZTsKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gb2xkX2RlbnRyeS0+ZF9pbm9kZTsKKwlpbnQgZXJyLCByZXRyaWVzID0gMDsKKworCWlmIChpbm9kZS0+aV9ubGluayA+PSBFWFQ0X0xJTktfTUFYKQorCQlyZXR1cm4gLUVNTElOSzsKKworcmV0cnk6CisJaGFuZGxlID0gZXh0NF9qb3VybmFsX3N0YXJ0KGRpciwgRVhUNF9EQVRBX1RSQU5TX0JMT0NLUyhkaXItPmlfc2IpICsKKwkJCQkJRVhUNF9JTkRFWF9FWFRSQV9UUkFOU19CTE9DS1MpOworCWlmIChJU19FUlIoaGFuZGxlKSkKKwkJcmV0dXJuIFBUUl9FUlIoaGFuZGxlKTsKKworCWlmIChJU19ESVJTWU5DKGRpcikpCisJCWhhbmRsZS0+aF9zeW5jID0gMTsKKworCWlub2RlLT5pX2N0aW1lID0gQ1VSUkVOVF9USU1FX1NFQzsKKwlleHQ0X2luY19jb3VudChoYW5kbGUsIGlub2RlKTsKKwlhdG9taWNfaW5jKCZpbm9kZS0+aV9jb3VudCk7CisKKwllcnIgPSBleHQ0X2FkZF9ub25kaXIoaGFuZGxlLCBkZW50cnksIGlub2RlKTsKKwlleHQ0X2pvdXJuYWxfc3RvcChoYW5kbGUpOworCWlmIChlcnIgPT0gLUVOT1NQQyAmJiBleHQ0X3Nob3VsZF9yZXRyeV9hbGxvYyhkaXItPmlfc2IsICZyZXRyaWVzKSkKKwkJZ290byByZXRyeTsKKwlyZXR1cm4gZXJyOworfQorCisjZGVmaW5lIFBBUkVOVF9JTk8oYnVmZmVyKSBcCisJKChzdHJ1Y3QgZXh0NF9kaXJfZW50cnlfMiAqKSAoKGNoYXIgKikgYnVmZmVyICsgXAorCWxlMTZfdG9fY3B1KCgoc3RydWN0IGV4dDRfZGlyX2VudHJ5XzIgKikgYnVmZmVyKS0+cmVjX2xlbikpKS0+aW5vZGUKKworLyoKKyAqIEFueWJvZHkgY2FuIHJlbmFtZSBhbnl0aGluZyB3aXRoIHRoaXM6IHRoZSBwZXJtaXNzaW9uIGNoZWNrcyBhcmUgbGVmdCB0byB0aGUKKyAqIGhpZ2hlci1sZXZlbCByb3V0aW5lcy4KKyAqLworc3RhdGljIGludCBleHQ0X3JlbmFtZSAoc3RydWN0IGlub2RlICogb2xkX2Rpciwgc3RydWN0IGRlbnRyeSAqb2xkX2RlbnRyeSwKKwkJCSAgIHN0cnVjdCBpbm9kZSAqIG5ld19kaXIsc3RydWN0IGRlbnRyeSAqbmV3X2RlbnRyeSkKK3sKKwloYW5kbGVfdCAqaGFuZGxlOworCXN0cnVjdCBpbm9kZSAqIG9sZF9pbm9kZSwgKiBuZXdfaW5vZGU7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICogb2xkX2JoLCAqIG5ld19iaCwgKiBkaXJfYmg7CisJc3RydWN0IGV4dDRfZGlyX2VudHJ5XzIgKiBvbGRfZGUsICogbmV3X2RlOworCWludCByZXR2YWw7CisKKwlvbGRfYmggPSBuZXdfYmggPSBkaXJfYmggPSBOVUxMOworCisJLyogSW5pdGlhbGl6ZSBxdW90YXMgYmVmb3JlIHNvIHRoYXQgZXZlbnR1YWwgd3JpdGVzIGdvCisJICogaW4gc2VwYXJhdGUgdHJhbnNhY3Rpb24gKi8KKwlpZiAobmV3X2RlbnRyeS0+ZF9pbm9kZSkKKwkJRFFVT1RfSU5JVChuZXdfZGVudHJ5LT5kX2lub2RlKTsKKwloYW5kbGUgPSBleHQ0X2pvdXJuYWxfc3RhcnQob2xkX2RpciwgMiAqCisJCQkJCUVYVDRfREFUQV9UUkFOU19CTE9DS1Mob2xkX2Rpci0+aV9zYikgKworCQkJCQlFWFQ0X0lOREVYX0VYVFJBX1RSQU5TX0JMT0NLUyArIDIpOworCWlmIChJU19FUlIoaGFuZGxlKSkKKwkJcmV0dXJuIFBUUl9FUlIoaGFuZGxlKTsKKworCWlmIChJU19ESVJTWU5DKG9sZF9kaXIpIHx8IElTX0RJUlNZTkMobmV3X2RpcikpCisJCWhhbmRsZS0+aF9zeW5jID0gMTsKKworCW9sZF9iaCA9IGV4dDRfZmluZF9lbnRyeSAob2xkX2RlbnRyeSwgJm9sZF9kZSk7CisJLyoKKwkgKiAgQ2hlY2sgZm9yIGlub2RlIG51bWJlciBpcyBfbm90XyBkdWUgdG8gcG9zc2libGUgSU8gZXJyb3JzLgorCSAqICBXZSBtaWdodCBybWRpciB0aGUgc291cmNlLCBrZWVwIGl0IGFzIHB3ZCBvZiBzb21lIHByb2Nlc3MKKwkgKiAgYW5kIG1lcnJpbHkga2lsbCB0aGUgbGluayB0byB3aGF0ZXZlciB3YXMgY3JlYXRlZCB1bmRlciB0aGUKKwkgKiAgc2FtZSBuYW1lLiBHb29kYnllIHN0aWNreSBiaXQgOy08CisJICovCisJb2xkX2lub2RlID0gb2xkX2RlbnRyeS0+ZF9pbm9kZTsKKwlyZXR2YWwgPSAtRU5PRU5UOworCWlmICghb2xkX2JoIHx8IGxlMzJfdG9fY3B1KG9sZF9kZS0+aW5vZGUpICE9IG9sZF9pbm9kZS0+aV9pbm8pCisJCWdvdG8gZW5kX3JlbmFtZTsKKworCW5ld19pbm9kZSA9IG5ld19kZW50cnktPmRfaW5vZGU7CisJbmV3X2JoID0gZXh0NF9maW5kX2VudHJ5IChuZXdfZGVudHJ5LCAmbmV3X2RlKTsKKwlpZiAobmV3X2JoKSB7CisJCWlmICghbmV3X2lub2RlKSB7CisJCQlicmVsc2UgKG5ld19iaCk7CisJCQluZXdfYmggPSBOVUxMOworCQl9CisJfQorCWlmIChTX0lTRElSKG9sZF9pbm9kZS0+aV9tb2RlKSkgeworCQlpZiAobmV3X2lub2RlKSB7CisJCQlyZXR2YWwgPSAtRU5PVEVNUFRZOworCQkJaWYgKCFlbXB0eV9kaXIgKG5ld19pbm9kZSkpCisJCQkJZ290byBlbmRfcmVuYW1lOworCQl9CisJCXJldHZhbCA9IC1FSU87CisJCWRpcl9iaCA9IGV4dDRfYnJlYWQgKGhhbmRsZSwgb2xkX2lub2RlLCAwLCAwLCAmcmV0dmFsKTsKKwkJaWYgKCFkaXJfYmgpCisJCQlnb3RvIGVuZF9yZW5hbWU7CisJCWlmIChsZTMyX3RvX2NwdShQQVJFTlRfSU5PKGRpcl9iaC0+Yl9kYXRhKSkgIT0gb2xkX2Rpci0+aV9pbm8pCisJCQlnb3RvIGVuZF9yZW5hbWU7CisJCXJldHZhbCA9IC1FTUxJTks7CisJCWlmICghbmV3X2lub2RlICYmIG5ld19kaXIhPW9sZF9kaXIgJiYKKwkJCQluZXdfZGlyLT5pX25saW5rID49IEVYVDRfTElOS19NQVgpCisJCQlnb3RvIGVuZF9yZW5hbWU7CisJfQorCWlmICghbmV3X2JoKSB7CisJCXJldHZhbCA9IGV4dDRfYWRkX2VudHJ5IChoYW5kbGUsIG5ld19kZW50cnksIG9sZF9pbm9kZSk7CisJCWlmIChyZXR2YWwpCisJCQlnb3RvIGVuZF9yZW5hbWU7CisJfSBlbHNlIHsKKwkJQlVGRkVSX1RSQUNFKG5ld19iaCwgImdldCB3cml0ZSBhY2Nlc3MiKTsKKwkJZXh0NF9qb3VybmFsX2dldF93cml0ZV9hY2Nlc3MoaGFuZGxlLCBuZXdfYmgpOworCQluZXdfZGUtPmlub2RlID0gY3B1X3RvX2xlMzIob2xkX2lub2RlLT5pX2lubyk7CisJCWlmIChFWFQ0X0hBU19JTkNPTVBBVF9GRUFUVVJFKG5ld19kaXItPmlfc2IsCisJCQkJCSAgICAgIEVYVDRfRkVBVFVSRV9JTkNPTVBBVF9GSUxFVFlQRSkpCisJCQluZXdfZGUtPmZpbGVfdHlwZSA9IG9sZF9kZS0+ZmlsZV90eXBlOworCQluZXdfZGlyLT5pX3ZlcnNpb24rKzsKKwkJQlVGRkVSX1RSQUNFKG5ld19iaCwgImNhbGwgZXh0NF9qb3VybmFsX2RpcnR5X21ldGFkYXRhIik7CisJCWV4dDRfam91cm5hbF9kaXJ0eV9tZXRhZGF0YShoYW5kbGUsIG5ld19iaCk7CisJCWJyZWxzZShuZXdfYmgpOworCQluZXdfYmggPSBOVUxMOworCX0KKworCS8qCisJICogTGlrZSBtb3N0IG90aGVyIFVuaXggc3lzdGVtcywgc2V0IHRoZSBjdGltZSBmb3IgaW5vZGVzIG9uIGEKKwkgKiByZW5hbWUuCisJICovCisJb2xkX2lub2RlLT5pX2N0aW1lID0gQ1VSUkVOVF9USU1FX1NFQzsKKwlleHQ0X21hcmtfaW5vZGVfZGlydHkoaGFuZGxlLCBvbGRfaW5vZGUpOworCisJLyoKKwkgKiBvaywgdGhhdCdzIGl0CisJICovCisJaWYgKGxlMzJfdG9fY3B1KG9sZF9kZS0+aW5vZGUpICE9IG9sZF9pbm9kZS0+aV9pbm8gfHwKKwkgICAgb2xkX2RlLT5uYW1lX2xlbiAhPSBvbGRfZGVudHJ5LT5kX25hbWUubGVuIHx8CisJICAgIHN0cm5jbXAob2xkX2RlLT5uYW1lLCBvbGRfZGVudHJ5LT5kX25hbWUubmFtZSwgb2xkX2RlLT5uYW1lX2xlbikgfHwKKwkgICAgKHJldHZhbCA9IGV4dDRfZGVsZXRlX2VudHJ5KGhhbmRsZSwgb2xkX2RpciwKKwkJCQkJb2xkX2RlLCBvbGRfYmgpKSA9PSAtRU5PRU5UKSB7CisJCS8qIG9sZF9kZSBjb3VsZCBoYXZlIG1vdmVkIGZyb20gdW5kZXIgdXMgZHVyaW5nIGh0cmVlIHNwbGl0LCBzbworCQkgKiBtYWtlIHN1cmUgdGhhdCB3ZSBhcmUgZGVsZXRpbmcgdGhlIHJpZ2h0IGVudHJ5LiAgV2UgbWlnaHQKKwkJICogYWxzbyBiZSBwb2ludGluZyB0byBhIHN0YWxlIGVudHJ5IGluIHRoZSB1bnVzZWQgcGFydCBvZgorCQkgKiBvbGRfYmggc28ganVzdCBjaGVja2luZyBpbnVtIGFuZCB0aGUgbmFtZSBpc24ndCBlbm91Z2guICovCisJCXN0cnVjdCBidWZmZXJfaGVhZCAqb2xkX2JoMjsKKwkJc3RydWN0IGV4dDRfZGlyX2VudHJ5XzIgKm9sZF9kZTI7CisKKwkJb2xkX2JoMiA9IGV4dDRfZmluZF9lbnRyeShvbGRfZGVudHJ5LCAmb2xkX2RlMik7CisJCWlmIChvbGRfYmgyKSB7CisJCQlyZXR2YWwgPSBleHQ0X2RlbGV0ZV9lbnRyeShoYW5kbGUsIG9sZF9kaXIsCisJCQkJCQkgICBvbGRfZGUyLCBvbGRfYmgyKTsKKwkJCWJyZWxzZShvbGRfYmgyKTsKKwkJfQorCX0KKwlpZiAocmV0dmFsKSB7CisJCWV4dDRfd2FybmluZyhvbGRfZGlyLT5pX3NiLCAiZXh0NF9yZW5hbWUiLAorCQkJCSJEZWxldGluZyBvbGQgZmlsZSAoJWx1KSwgJWQsIGVycm9yPSVkIiwKKwkJCQlvbGRfZGlyLT5pX2lubywgb2xkX2Rpci0+aV9ubGluaywgcmV0dmFsKTsKKwl9CisKKwlpZiAobmV3X2lub2RlKSB7CisJCWRyb3BfbmxpbmsobmV3X2lub2RlKTsKKwkJbmV3X2lub2RlLT5pX2N0aW1lID0gQ1VSUkVOVF9USU1FX1NFQzsKKwl9CisJb2xkX2Rpci0+aV9jdGltZSA9IG9sZF9kaXItPmlfbXRpbWUgPSBDVVJSRU5UX1RJTUVfU0VDOworCWV4dDRfdXBkYXRlX2R4X2ZsYWcob2xkX2Rpcik7CisJaWYgKGRpcl9iaCkgeworCQlCVUZGRVJfVFJBQ0UoZGlyX2JoLCAiZ2V0X3dyaXRlX2FjY2VzcyIpOworCQlleHQ0X2pvdXJuYWxfZ2V0X3dyaXRlX2FjY2VzcyhoYW5kbGUsIGRpcl9iaCk7CisJCVBBUkVOVF9JTk8oZGlyX2JoLT5iX2RhdGEpID0gY3B1X3RvX2xlMzIobmV3X2Rpci0+aV9pbm8pOworCQlCVUZGRVJfVFJBQ0UoZGlyX2JoLCAiY2FsbCBleHQ0X2pvdXJuYWxfZGlydHlfbWV0YWRhdGEiKTsKKwkJZXh0NF9qb3VybmFsX2RpcnR5X21ldGFkYXRhKGhhbmRsZSwgZGlyX2JoKTsKKwkJZHJvcF9ubGluayhvbGRfZGlyKTsKKwkJaWYgKG5ld19pbm9kZSkgeworCQkJZHJvcF9ubGluayhuZXdfaW5vZGUpOworCQl9IGVsc2UgeworCQkJaW5jX25saW5rKG5ld19kaXIpOworCQkJZXh0NF91cGRhdGVfZHhfZmxhZyhuZXdfZGlyKTsKKwkJCWV4dDRfbWFya19pbm9kZV9kaXJ0eShoYW5kbGUsIG5ld19kaXIpOworCQl9CisJfQorCWV4dDRfbWFya19pbm9kZV9kaXJ0eShoYW5kbGUsIG9sZF9kaXIpOworCWlmIChuZXdfaW5vZGUpIHsKKwkJZXh0NF9tYXJrX2lub2RlX2RpcnR5KGhhbmRsZSwgbmV3X2lub2RlKTsKKwkJaWYgKCFuZXdfaW5vZGUtPmlfbmxpbmspCisJCQlleHQ0X29ycGhhbl9hZGQoaGFuZGxlLCBuZXdfaW5vZGUpOworCX0KKwlyZXR2YWwgPSAwOworCitlbmRfcmVuYW1lOgorCWJyZWxzZSAoZGlyX2JoKTsKKwlicmVsc2UgKG9sZF9iaCk7CisJYnJlbHNlIChuZXdfYmgpOworCWV4dDRfam91cm5hbF9zdG9wKGhhbmRsZSk7CisJcmV0dXJuIHJldHZhbDsKK30KKworLyoKKyAqIGRpcmVjdG9yaWVzIGNhbiBoYW5kbGUgbW9zdCBvcGVyYXRpb25zLi4uCisgKi8KK3N0cnVjdCBpbm9kZV9vcGVyYXRpb25zIGV4dDRfZGlyX2lub2RlX29wZXJhdGlvbnMgPSB7CisJLmNyZWF0ZQkJPSBleHQ0X2NyZWF0ZSwKKwkubG9va3VwCQk9IGV4dDRfbG9va3VwLAorCS5saW5rCQk9IGV4dDRfbGluaywKKwkudW5saW5rCQk9IGV4dDRfdW5saW5rLAorCS5zeW1saW5rCT0gZXh0NF9zeW1saW5rLAorCS5ta2RpcgkJPSBleHQ0X21rZGlyLAorCS5ybWRpcgkJPSBleHQ0X3JtZGlyLAorCS5ta25vZAkJPSBleHQ0X21rbm9kLAorCS5yZW5hbWUJCT0gZXh0NF9yZW5hbWUsCisJLnNldGF0dHIJPSBleHQ0X3NldGF0dHIsCisjaWZkZWYgQ09ORklHX0VYVDRERVZfRlNfWEFUVFIKKwkuc2V0eGF0dHIJPSBnZW5lcmljX3NldHhhdHRyLAorCS5nZXR4YXR0cgk9IGdlbmVyaWNfZ2V0eGF0dHIsCisJLmxpc3R4YXR0cgk9IGV4dDRfbGlzdHhhdHRyLAorCS5yZW1vdmV4YXR0cgk9IGdlbmVyaWNfcmVtb3ZleGF0dHIsCisjZW5kaWYKKwkucGVybWlzc2lvbgk9IGV4dDRfcGVybWlzc2lvbiwKK307CisKK3N0cnVjdCBpbm9kZV9vcGVyYXRpb25zIGV4dDRfc3BlY2lhbF9pbm9kZV9vcGVyYXRpb25zID0geworCS5zZXRhdHRyCT0gZXh0NF9zZXRhdHRyLAorI2lmZGVmIENPTkZJR19FWFQ0REVWX0ZTX1hBVFRSCisJLnNldHhhdHRyCT0gZ2VuZXJpY19zZXR4YXR0ciwKKwkuZ2V0eGF0dHIJPSBnZW5lcmljX2dldHhhdHRyLAorCS5saXN0eGF0dHIJPSBleHQ0X2xpc3R4YXR0ciwKKwkucmVtb3ZleGF0dHIJPSBnZW5lcmljX3JlbW92ZXhhdHRyLAorI2VuZGlmCisJLnBlcm1pc3Npb24JPSBleHQ0X3Blcm1pc3Npb24sCit9OwpkaWZmIC0tZ2l0IGEvZnMvZXh0NC9uYW1laS5oIGIvZnMvZXh0NC9uYW1laS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVlNGRmZmYKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9leHQ0L25hbWVpLmgKQEAgLTAsMCArMSw4IEBACisvKiAgbGludXgvZnMvZXh0NC9uYW1laS5oCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA1IFNpbXRlYyBFbGVjdHJvbmljcworICoJQmVuIERvb2tzIDxiZW5Ac2ltdGVjLmNvLnVrPgorICoKKyovCisKK2V4dGVybiBzdHJ1Y3QgZGVudHJ5ICpleHQ0X2dldF9wYXJlbnQoc3RydWN0IGRlbnRyeSAqY2hpbGQpOwpkaWZmIC0tZ2l0IGEvZnMvZXh0NC9yZXNpemUuYyBiL2ZzL2V4dDQvcmVzaXplLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGZlNDljMwotLS0gL2Rldi9udWxsCisrKyBiL2ZzL2V4dDQvcmVzaXplLmMKQEAgLTAsMCArMSwxMDUwIEBACisvKgorICogIGxpbnV4L2ZzL2V4dDQvcmVzaXplLmMKKyAqCisgKiBTdXBwb3J0IGZvciByZXNpemluZyBhbiBleHQ0IGZpbGVzeXN0ZW0gd2hpbGUgaXQgaXMgbW91bnRlZC4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDEsIDIwMDIgQW5kcmVhcyBEaWxnZXIgPGFkaWxnZXJAY2x1c3RlcmZzLmNvbT4KKyAqCisgKiBUaGlzIGNvdWxkIHByb2JhYmx5IGJlIG1hZGUgaW50byBhIG1vZHVsZSwgYmVjYXVzZSBpdCBpcyBub3Qgb2Z0ZW4gaW4gdXNlLgorICovCisKKworI2RlZmluZSBFWFQ0RlNfREVCVUcKKworI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvc21wX2xvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9leHQ0X2piZDIuaD4KKworI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorCisKKyNkZWZpbmUgb3V0c2lkZShiLCBmaXJzdCwgbGFzdCkJKChiKSA8IChmaXJzdCkgfHwgKGIpID49IChsYXN0KSkKKyNkZWZpbmUgaW5zaWRlKGIsIGZpcnN0LCBsYXN0KQkoKGIpID49IChmaXJzdCkgJiYgKGIpIDwgKGxhc3QpKQorCitzdGF0aWMgaW50IHZlcmlmeV9ncm91cF9pbnB1dChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLAorCQkJICAgICAgc3RydWN0IGV4dDRfbmV3X2dyb3VwX2RhdGEgKmlucHV0KQoreworCXN0cnVjdCBleHQ0X3NiX2luZm8gKnNiaSA9IEVYVDRfU0Ioc2IpOworCXN0cnVjdCBleHQ0X3N1cGVyX2Jsb2NrICplcyA9IHNiaS0+c19lczsKKwlleHQ0X2ZzYmxrX3Qgc3RhcnQgPSBleHQ0X2Jsb2Nrc19jb3VudChlcyk7CisJZXh0NF9mc2Jsa190IGVuZCA9IHN0YXJ0ICsgaW5wdXQtPmJsb2Nrc19jb3VudDsKKwl1bnNpZ25lZCBncm91cCA9IGlucHV0LT5ncm91cDsKKwlleHQ0X2ZzYmxrX3QgaXRlbmQgPSBpbnB1dC0+aW5vZGVfdGFibGUgKyBzYmktPnNfaXRiX3Blcl9ncm91cDsKKwl1bnNpZ25lZCBvdmVyaGVhZCA9IGV4dDRfYmdfaGFzX3N1cGVyKHNiLCBncm91cCkgPworCQkoMSArIGV4dDRfYmdfbnVtX2dkYihzYiwgZ3JvdXApICsKKwkJIGxlMTZfdG9fY3B1KGVzLT5zX3Jlc2VydmVkX2dkdF9ibG9ja3MpKSA6IDA7CisJZXh0NF9mc2Jsa190IG1ldGFlbmQgPSBzdGFydCArIG92ZXJoZWFkOworCXN0cnVjdCBidWZmZXJfaGVhZCAqYmggPSBOVUxMOworCWV4dDRfZ3JwYmxrX3QgZnJlZV9ibG9ja3NfY291bnQsIG9mZnNldDsKKwlpbnQgZXJyID0gLUVJTlZBTDsKKworCWlucHV0LT5mcmVlX2Jsb2Nrc19jb3VudCA9IGZyZWVfYmxvY2tzX2NvdW50ID0KKwkJaW5wdXQtPmJsb2Nrc19jb3VudCAtIDIgLSBvdmVyaGVhZCAtIHNiaS0+c19pdGJfcGVyX2dyb3VwOworCisJaWYgKHRlc3Rfb3B0KHNiLCBERUJVRykpCisJCXByaW50ayhLRVJOX0RFQlVHICJFWFQ0LWZzOiBhZGRpbmcgJXMgZ3JvdXAgJXU6ICV1IGJsb2NrcyAiCisJCSAgICAgICAiKCVkIGZyZWUsICV1IHJlc2VydmVkKVxuIiwKKwkJICAgICAgIGV4dDRfYmdfaGFzX3N1cGVyKHNiLCBpbnB1dC0+Z3JvdXApID8gIm5vcm1hbCIgOgorCQkgICAgICAgIm5vLXN1cGVyIiwgaW5wdXQtPmdyb3VwLCBpbnB1dC0+YmxvY2tzX2NvdW50LAorCQkgICAgICAgZnJlZV9ibG9ja3NfY291bnQsIGlucHV0LT5yZXNlcnZlZF9ibG9ja3MpOworCisJZXh0NF9nZXRfZ3JvdXBfbm9fYW5kX29mZnNldChzYiwgc3RhcnQsIE5VTEwsICZvZmZzZXQpOworCWlmIChncm91cCAhPSBzYmktPnNfZ3JvdXBzX2NvdW50KQorCQlleHQ0X3dhcm5pbmcoc2IsIF9fRlVOQ1RJT05fXywKKwkJCSAgICAgIkNhbm5vdCBhZGQgYXQgZ3JvdXAgJXUgKG9ubHkgJWx1IGdyb3VwcykiLAorCQkJICAgICBpbnB1dC0+Z3JvdXAsIHNiaS0+c19ncm91cHNfY291bnQpOworCWVsc2UgaWYgKG9mZnNldCAhPSAwKQorCQkJZXh0NF93YXJuaW5nKHNiLCBfX0ZVTkNUSU9OX18sICJMYXN0IGdyb3VwIG5vdCBmdWxsIik7CisJZWxzZSBpZiAoaW5wdXQtPnJlc2VydmVkX2Jsb2NrcyA+IGlucHV0LT5ibG9ja3NfY291bnQgLyA1KQorCQlleHQ0X3dhcm5pbmcoc2IsIF9fRlVOQ1RJT05fXywgIlJlc2VydmVkIGJsb2NrcyB0b28gaGlnaCAoJXUpIiwKKwkJCSAgICAgaW5wdXQtPnJlc2VydmVkX2Jsb2Nrcyk7CisJZWxzZSBpZiAoZnJlZV9ibG9ja3NfY291bnQgPCAwKQorCQlleHQ0X3dhcm5pbmcoc2IsIF9fRlVOQ1RJT05fXywgIkJhZCBibG9ja3MgY291bnQgJXUiLAorCQkJICAgICBpbnB1dC0+YmxvY2tzX2NvdW50KTsKKwllbHNlIGlmICghKGJoID0gc2JfYnJlYWQoc2IsIGVuZCAtIDEpKSkKKwkJZXh0NF93YXJuaW5nKHNiLCBfX0ZVTkNUSU9OX18sCisJCQkgICAgICJDYW5ub3QgcmVhZCBsYXN0IGJsb2NrICglbGx1KSIsCisJCQkgICAgIGVuZCAtIDEpOworCWVsc2UgaWYgKG91dHNpZGUoaW5wdXQtPmJsb2NrX2JpdG1hcCwgc3RhcnQsIGVuZCkpCisJCWV4dDRfd2FybmluZyhzYiwgX19GVU5DVElPTl9fLAorCQkJICAgICAiQmxvY2sgYml0bWFwIG5vdCBpbiBncm91cCAoYmxvY2sgJWxsdSkiLAorCQkJICAgICAodW5zaWduZWQgbG9uZyBsb25nKWlucHV0LT5ibG9ja19iaXRtYXApOworCWVsc2UgaWYgKG91dHNpZGUoaW5wdXQtPmlub2RlX2JpdG1hcCwgc3RhcnQsIGVuZCkpCisJCWV4dDRfd2FybmluZyhzYiwgX19GVU5DVElPTl9fLAorCQkJICAgICAiSW5vZGUgYml0bWFwIG5vdCBpbiBncm91cCAoYmxvY2sgJWxsdSkiLAorCQkJICAgICAodW5zaWduZWQgbG9uZyBsb25nKWlucHV0LT5pbm9kZV9iaXRtYXApOworCWVsc2UgaWYgKG91dHNpZGUoaW5wdXQtPmlub2RlX3RhYmxlLCBzdGFydCwgZW5kKSB8fAorCSAgICAgICAgIG91dHNpZGUoaXRlbmQgLSAxLCBzdGFydCwgZW5kKSkKKwkJZXh0NF93YXJuaW5nKHNiLCBfX0ZVTkNUSU9OX18sCisJCQkgICAgICJJbm9kZSB0YWJsZSBub3QgaW4gZ3JvdXAgKGJsb2NrcyAlbGx1LSVsbHUpIiwKKwkJCSAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylpbnB1dC0+aW5vZGVfdGFibGUsIGl0ZW5kIC0gMSk7CisJZWxzZSBpZiAoaW5wdXQtPmlub2RlX2JpdG1hcCA9PSBpbnB1dC0+YmxvY2tfYml0bWFwKQorCQlleHQ0X3dhcm5pbmcoc2IsIF9fRlVOQ1RJT05fXywKKwkJCSAgICAgIkJsb2NrIGJpdG1hcCBzYW1lIGFzIGlub2RlIGJpdG1hcCAoJWxsdSkiLAorCQkJICAgICAodW5zaWduZWQgbG9uZyBsb25nKWlucHV0LT5ibG9ja19iaXRtYXApOworCWVsc2UgaWYgKGluc2lkZShpbnB1dC0+YmxvY2tfYml0bWFwLCBpbnB1dC0+aW5vZGVfdGFibGUsIGl0ZW5kKSkKKwkJZXh0NF93YXJuaW5nKHNiLCBfX0ZVTkNUSU9OX18sCisJCQkgICAgICJCbG9jayBiaXRtYXAgKCVsbHUpIGluIGlub2RlIHRhYmxlICglbGx1LSVsbHUpIiwKKwkJCSAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylpbnB1dC0+YmxvY2tfYml0bWFwLAorCQkJICAgICAodW5zaWduZWQgbG9uZyBsb25nKWlucHV0LT5pbm9kZV90YWJsZSwgaXRlbmQgLSAxKTsKKwllbHNlIGlmIChpbnNpZGUoaW5wdXQtPmlub2RlX2JpdG1hcCwgaW5wdXQtPmlub2RlX3RhYmxlLCBpdGVuZCkpCisJCWV4dDRfd2FybmluZyhzYiwgX19GVU5DVElPTl9fLAorCQkJICAgICAiSW5vZGUgYml0bWFwICglbGx1KSBpbiBpbm9kZSB0YWJsZSAoJWxsdS0lbGx1KSIsCisJCQkgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpaW5wdXQtPmlub2RlX2JpdG1hcCwKKwkJCSAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylpbnB1dC0+aW5vZGVfdGFibGUsIGl0ZW5kIC0gMSk7CisJZWxzZSBpZiAoaW5zaWRlKGlucHV0LT5ibG9ja19iaXRtYXAsIHN0YXJ0LCBtZXRhZW5kKSkKKwkJZXh0NF93YXJuaW5nKHNiLCBfX0ZVTkNUSU9OX18sCisJCQkgICAgICJCbG9jayBiaXRtYXAgKCVsbHUpIGluIEdEVCB0YWJsZSIKKwkJCSAgICAgIiAoJWxsdS0lbGx1KSIsCisJCQkgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpaW5wdXQtPmJsb2NrX2JpdG1hcCwKKwkJCSAgICAgc3RhcnQsIG1ldGFlbmQgLSAxKTsKKwllbHNlIGlmIChpbnNpZGUoaW5wdXQtPmlub2RlX2JpdG1hcCwgc3RhcnQsIG1ldGFlbmQpKQorCQlleHQ0X3dhcm5pbmcoc2IsIF9fRlVOQ1RJT05fXywKKwkJCSAgICAgIklub2RlIGJpdG1hcCAoJWxsdSkgaW4gR0RUIHRhYmxlIgorCQkJICAgICAiICglbGx1LSVsbHUpIiwKKwkJCSAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylpbnB1dC0+aW5vZGVfYml0bWFwLAorCQkJICAgICBzdGFydCwgbWV0YWVuZCAtIDEpOworCWVsc2UgaWYgKGluc2lkZShpbnB1dC0+aW5vZGVfdGFibGUsIHN0YXJ0LCBtZXRhZW5kKSB8fAorCSAgICAgICAgIGluc2lkZShpdGVuZCAtIDEsIHN0YXJ0LCBtZXRhZW5kKSkKKwkJZXh0NF93YXJuaW5nKHNiLCBfX0ZVTkNUSU9OX18sCisJCQkgICAgICJJbm9kZSB0YWJsZSAoJWxsdS0lbGx1KSBvdmVybGFwcyIKKwkJCSAgICAgIkdEVCB0YWJsZSAoJWxsdS0lbGx1KSIsCisJCQkgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpaW5wdXQtPmlub2RlX3RhYmxlLAorCQkJICAgICBpdGVuZCAtIDEsIHN0YXJ0LCBtZXRhZW5kIC0gMSk7CisJZWxzZQorCQllcnIgPSAwOworCWJyZWxzZShiaCk7CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgc3RydWN0IGJ1ZmZlcl9oZWFkICpiY2xlYW4oaGFuZGxlX3QgKmhhbmRsZSwgc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwKKwkJCQkgIGV4dDRfZnNibGtfdCBibGspCit7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaDsKKwlpbnQgZXJyOworCisJYmggPSBzYl9nZXRibGsoc2IsIGJsayk7CisJaWYgKCFiaCkKKwkJcmV0dXJuIEVSUl9QVFIoLUVJTyk7CisJaWYgKChlcnIgPSBleHQ0X2pvdXJuYWxfZ2V0X3dyaXRlX2FjY2VzcyhoYW5kbGUsIGJoKSkpIHsKKwkJYnJlbHNlKGJoKTsKKwkJYmggPSBFUlJfUFRSKGVycik7CisJfSBlbHNlIHsKKwkJbG9ja19idWZmZXIoYmgpOworCQltZW1zZXQoYmgtPmJfZGF0YSwgMCwgc2ItPnNfYmxvY2tzaXplKTsKKwkJc2V0X2J1ZmZlcl91cHRvZGF0ZShiaCk7CisJCXVubG9ja19idWZmZXIoYmgpOworCX0KKworCXJldHVybiBiaDsKK30KKworLyoKKyAqIFRvIGF2b2lkIGNhbGxpbmcgdGhlIGF0b21pYyBzZXRiaXQgaHVuZHJlZHMgb3IgdGhvdXNhbmRzIG9mIHRpbWVzLCB3ZSBvbmx5CisgKiBuZWVkIHRvIHVzZSBpdCB3aXRoaW4gYSBzaW5nbGUgYnl0ZSAodG8gZW5zdXJlIHdlIGdldCBlbmRpYW5uZXNzIHJpZ2h0KS4KKyAqIFdlIGNhbiB1c2UgbWVtc2V0IGZvciB0aGUgcmVzdCBvZiB0aGUgYml0bWFwIGFzIHRoZXJlIGFyZSBubyBvdGhlciB1c2Vycy4KKyAqLworc3RhdGljIHZvaWQgbWFya19iaXRtYXBfZW5kKGludCBzdGFydF9iaXQsIGludCBlbmRfYml0LCBjaGFyICpiaXRtYXApCit7CisJaW50IGk7CisKKwlpZiAoc3RhcnRfYml0ID49IGVuZF9iaXQpCisJCXJldHVybjsKKworCWV4dDRfZGVidWcoIm1hcmsgZW5kIGJpdHMgKyVkIHRocm91Z2ggKyVkIHVzZWRcbiIsIHN0YXJ0X2JpdCwgZW5kX2JpdCk7CisJZm9yIChpID0gc3RhcnRfYml0OyBpIDwgKChzdGFydF9iaXQgKyA3KSAmIH43VUwpOyBpKyspCisJCWV4dDRfc2V0X2JpdChpLCBiaXRtYXApOworCWlmIChpIDwgZW5kX2JpdCkKKwkJbWVtc2V0KGJpdG1hcCArIChpID4+IDMpLCAweGZmLCAoZW5kX2JpdCAtIGkpID4+IDMpOworfQorCisvKgorICogU2V0IHVwIHRoZSBibG9jayBhbmQgaW5vZGUgYml0bWFwcywgYW5kIHRoZSBpbm9kZSB0YWJsZSBmb3IgdGhlIG5ldyBncm91cC4KKyAqIFRoaXMgZG9lc24ndCBuZWVkIHRvIGJlIHBhcnQgb2YgdGhlIG1haW4gdHJhbnNhY3Rpb24sIHNpbmNlIHdlIGFyZSBvbmx5CisgKiBjaGFuZ2luZyBibG9ja3Mgb3V0c2lkZSB0aGUgYWN0dWFsIGZpbGVzeXN0ZW0uICBXZSBzdGlsbCBkbyBqb3VybmFsaW5nIHRvCisgKiBlbnN1cmUgdGhlIHJlY292ZXJ5IGlzIGNvcnJlY3QgaW4gY2FzZSBvZiBhIGZhaWx1cmUganVzdCBhZnRlciByZXNpemUuCisgKiBJZiBhbnkgcGFydCBvZiB0aGlzIGZhaWxzLCB3ZSBzaW1wbHkgYWJvcnQgdGhlIHJlc2l6ZS4KKyAqLworc3RhdGljIGludCBzZXR1cF9uZXdfZ3JvdXBfYmxvY2tzKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsCisJCQkJICBzdHJ1Y3QgZXh0NF9uZXdfZ3JvdXBfZGF0YSAqaW5wdXQpCit7CisJc3RydWN0IGV4dDRfc2JfaW5mbyAqc2JpID0gRVhUNF9TQihzYik7CisJZXh0NF9mc2Jsa190IHN0YXJ0ID0gZXh0NF9ncm91cF9maXJzdF9ibG9ja19ubyhzYiwgaW5wdXQtPmdyb3VwKTsKKwlpbnQgcmVzZXJ2ZWRfZ2RiID0gZXh0NF9iZ19oYXNfc3VwZXIoc2IsIGlucHV0LT5ncm91cCkgPworCQlsZTE2X3RvX2NwdShzYmktPnNfZXMtPnNfcmVzZXJ2ZWRfZ2R0X2Jsb2NrcykgOiAwOworCXVuc2lnbmVkIGxvbmcgZ2RibG9ja3MgPSBleHQ0X2JnX251bV9nZGIoc2IsIGlucHV0LT5ncm91cCk7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaDsKKwloYW5kbGVfdCAqaGFuZGxlOworCWV4dDRfZnNibGtfdCBibG9jazsKKwlleHQ0X2dycGJsa190IGJpdDsKKwlpbnQgaTsKKwlpbnQgZXJyID0gMCwgZXJyMjsKKworCWhhbmRsZSA9IGV4dDRfam91cm5hbF9zdGFydF9zYihzYiwgcmVzZXJ2ZWRfZ2RiICsgZ2RibG9ja3MgKworCQkJCSAgICAgICAyICsgc2JpLT5zX2l0Yl9wZXJfZ3JvdXApOworCWlmIChJU19FUlIoaGFuZGxlKSkKKwkJcmV0dXJuIFBUUl9FUlIoaGFuZGxlKTsKKworCWxvY2tfc3VwZXIoc2IpOworCWlmIChpbnB1dC0+Z3JvdXAgIT0gc2JpLT5zX2dyb3Vwc19jb3VudCkgeworCQllcnIgPSAtRUJVU1k7CisJCWdvdG8gZXhpdF9qb3VybmFsOworCX0KKworCWlmIChJU19FUlIoYmggPSBiY2xlYW4oaGFuZGxlLCBzYiwgaW5wdXQtPmJsb2NrX2JpdG1hcCkpKSB7CisJCWVyciA9IFBUUl9FUlIoYmgpOworCQlnb3RvIGV4aXRfam91cm5hbDsKKwl9CisKKwlpZiAoZXh0NF9iZ19oYXNfc3VwZXIoc2IsIGlucHV0LT5ncm91cCkpIHsKKwkJZXh0NF9kZWJ1ZygibWFyayBiYWNrdXAgc3VwZXJibG9jayAlIzA0bHggKCswKVxuIiwgc3RhcnQpOworCQlleHQ0X3NldF9iaXQoMCwgYmgtPmJfZGF0YSk7CisJfQorCisJLyogQ29weSBhbGwgb2YgdGhlIEdEVCBibG9ja3MgaW50byB0aGUgYmFja3VwIGluIHRoaXMgZ3JvdXAgKi8KKwlmb3IgKGkgPSAwLCBiaXQgPSAxLCBibG9jayA9IHN0YXJ0ICsgMTsKKwkgICAgIGkgPCBnZGJsb2NrczsgaSsrLCBibG9jaysrLCBiaXQrKykgeworCQlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmdkYjsKKworCQlleHQ0X2RlYnVnKCJ1cGRhdGUgYmFja3VwIGdyb3VwICUjMDRseCAoKyVkKVxuIiwgYmxvY2ssIGJpdCk7CisKKwkJZ2RiID0gc2JfZ2V0YmxrKHNiLCBibG9jayk7CisJCWlmICghZ2RiKSB7CisJCQllcnIgPSAtRUlPOworCQkJZ290byBleGl0X2JoOworCQl9CisJCWlmICgoZXJyID0gZXh0NF9qb3VybmFsX2dldF93cml0ZV9hY2Nlc3MoaGFuZGxlLCBnZGIpKSkgeworCQkJYnJlbHNlKGdkYik7CisJCQlnb3RvIGV4aXRfYmg7CisJCX0KKwkJbG9ja19idWZmZXIoYmgpOworCQltZW1jcHkoZ2RiLT5iX2RhdGEsIHNiaS0+c19ncm91cF9kZXNjW2ldLT5iX2RhdGEsIGJoLT5iX3NpemUpOworCQlzZXRfYnVmZmVyX3VwdG9kYXRlKGdkYik7CisJCXVubG9ja19idWZmZXIoYmgpOworCQlleHQ0X2pvdXJuYWxfZGlydHlfbWV0YWRhdGEoaGFuZGxlLCBnZGIpOworCQlleHQ0X3NldF9iaXQoYml0LCBiaC0+Yl9kYXRhKTsKKwkJYnJlbHNlKGdkYik7CisJfQorCisJLyogWmVybyBvdXQgYWxsIG9mIHRoZSByZXNlcnZlZCBiYWNrdXAgZ3JvdXAgZGVzY3JpcHRvciB0YWJsZSBibG9ja3MgKi8KKwlmb3IgKGkgPSAwLCBiaXQgPSBnZGJsb2NrcyArIDEsIGJsb2NrID0gc3RhcnQgKyBiaXQ7CisJICAgICBpIDwgcmVzZXJ2ZWRfZ2RiOyBpKyssIGJsb2NrKyssIGJpdCsrKSB7CisJCXN0cnVjdCBidWZmZXJfaGVhZCAqZ2RiOworCisJCWV4dDRfZGVidWcoImNsZWFyIHJlc2VydmVkIGJsb2NrICUjMDRseCAoKyVkKVxuIiwgYmxvY2ssIGJpdCk7CisKKwkJaWYgKElTX0VSUihnZGIgPSBiY2xlYW4oaGFuZGxlLCBzYiwgYmxvY2spKSkgeworCQkJZXJyID0gUFRSX0VSUihiaCk7CisJCQlnb3RvIGV4aXRfYmg7CisJCX0KKwkJZXh0NF9qb3VybmFsX2RpcnR5X21ldGFkYXRhKGhhbmRsZSwgZ2RiKTsKKwkJZXh0NF9zZXRfYml0KGJpdCwgYmgtPmJfZGF0YSk7CisJCWJyZWxzZShnZGIpOworCX0KKwlleHQ0X2RlYnVnKCJtYXJrIGJsb2NrIGJpdG1hcCAlIzA0eCAoKyVsZClcbiIsIGlucHV0LT5ibG9ja19iaXRtYXAsCisJCSAgIGlucHV0LT5ibG9ja19iaXRtYXAgLSBzdGFydCk7CisJZXh0NF9zZXRfYml0KGlucHV0LT5ibG9ja19iaXRtYXAgLSBzdGFydCwgYmgtPmJfZGF0YSk7CisJZXh0NF9kZWJ1ZygibWFyayBpbm9kZSBiaXRtYXAgJSMwNHggKCslbGQpXG4iLCBpbnB1dC0+aW5vZGVfYml0bWFwLAorCQkgICBpbnB1dC0+aW5vZGVfYml0bWFwIC0gc3RhcnQpOworCWV4dDRfc2V0X2JpdChpbnB1dC0+aW5vZGVfYml0bWFwIC0gc3RhcnQsIGJoLT5iX2RhdGEpOworCisJLyogWmVybyBvdXQgYWxsIG9mIHRoZSBpbm9kZSB0YWJsZSBibG9ja3MgKi8KKwlmb3IgKGkgPSAwLCBibG9jayA9IGlucHV0LT5pbm9kZV90YWJsZSwgYml0ID0gYmxvY2sgLSBzdGFydDsKKwkgICAgIGkgPCBzYmktPnNfaXRiX3Blcl9ncm91cDsgaSsrLCBiaXQrKywgYmxvY2srKykgeworCQlzdHJ1Y3QgYnVmZmVyX2hlYWQgKml0OworCisJCWV4dDRfZGVidWcoImNsZWFyIGlub2RlIGJsb2NrICUjMDRseCAoKyVkKVxuIiwgYmxvY2ssIGJpdCk7CisJCWlmIChJU19FUlIoaXQgPSBiY2xlYW4oaGFuZGxlLCBzYiwgYmxvY2spKSkgeworCQkJZXJyID0gUFRSX0VSUihpdCk7CisJCQlnb3RvIGV4aXRfYmg7CisJCX0KKwkJZXh0NF9qb3VybmFsX2RpcnR5X21ldGFkYXRhKGhhbmRsZSwgaXQpOworCQlicmVsc2UoaXQpOworCQlleHQ0X3NldF9iaXQoYml0LCBiaC0+Yl9kYXRhKTsKKwl9CisJbWFya19iaXRtYXBfZW5kKGlucHV0LT5ibG9ja3NfY291bnQsIEVYVDRfQkxPQ0tTX1BFUl9HUk9VUChzYiksCisJCQliaC0+Yl9kYXRhKTsKKwlleHQ0X2pvdXJuYWxfZGlydHlfbWV0YWRhdGEoaGFuZGxlLCBiaCk7CisJYnJlbHNlKGJoKTsKKworCS8qIE1hcmsgdW51c2VkIGVudHJpZXMgaW4gaW5vZGUgYml0bWFwIHVzZWQgKi8KKwlleHQ0X2RlYnVnKCJjbGVhciBpbm9kZSBiaXRtYXAgJSMwNHggKCslbGQpXG4iLAorCQkgICBpbnB1dC0+aW5vZGVfYml0bWFwLCBpbnB1dC0+aW5vZGVfYml0bWFwIC0gc3RhcnQpOworCWlmIChJU19FUlIoYmggPSBiY2xlYW4oaGFuZGxlLCBzYiwgaW5wdXQtPmlub2RlX2JpdG1hcCkpKSB7CisJCWVyciA9IFBUUl9FUlIoYmgpOworCQlnb3RvIGV4aXRfam91cm5hbDsKKwl9CisKKwltYXJrX2JpdG1hcF9lbmQoRVhUNF9JTk9ERVNfUEVSX0dST1VQKHNiKSwgRVhUNF9CTE9DS1NfUEVSX0dST1VQKHNiKSwKKwkJCWJoLT5iX2RhdGEpOworCWV4dDRfam91cm5hbF9kaXJ0eV9tZXRhZGF0YShoYW5kbGUsIGJoKTsKK2V4aXRfYmg6CisJYnJlbHNlKGJoKTsKKworZXhpdF9qb3VybmFsOgorCXVubG9ja19zdXBlcihzYik7CisJaWYgKChlcnIyID0gZXh0NF9qb3VybmFsX3N0b3AoaGFuZGxlKSkgJiYgIWVycikKKwkJZXJyID0gZXJyMjsKKworCXJldHVybiBlcnI7Cit9CisKKworLyoKKyAqIEl0ZXJhdGUgdGhyb3VnaCB0aGUgZ3JvdXBzIHdoaWNoIGhvbGQgQkFDS1VQIHN1cGVyYmxvY2svR0RUIGNvcGllcyBpbiBhbgorICogZXh0NCBmaWxlc3lzdGVtLiAgVGhlIGNvdW50ZXJzIHNob3VsZCBiZSBpbml0aWFsaXplZCB0byAxLCA1LCBhbmQgNyBiZWZvcmUKKyAqIGNhbGxpbmcgdGhpcyBmb3IgdGhlIGZpcnN0IHRpbWUuICBJbiBhIHNwYXJzZSBmaWxlc3lzdGVtIGl0IHdpbGwgYmUgdGhlCisgKiBzZXF1ZW5jZSBvZiBwb3dlcnMgb2YgMywgNSwgYW5kIDc6IDEsIDMsIDUsIDcsIDksIDI1LCAyNywgNDksIDgxLCAuLi4KKyAqIEZvciBhIG5vbi1zcGFyc2UgZmlsZXN5c3RlbSBpdCB3aWxsIGJlIGV2ZXJ5IGdyb3VwOiAxLCAyLCAzLCA0LCAuLi4KKyAqLworc3RhdGljIHVuc2lnbmVkIGV4dDRfbGlzdF9iYWNrdXBzKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHVuc2lnbmVkICp0aHJlZSwKKwkJCQkgIHVuc2lnbmVkICpmaXZlLCB1bnNpZ25lZCAqc2V2ZW4pCit7CisJdW5zaWduZWQgKm1pbiA9IHRocmVlOworCWludCBtdWx0ID0gMzsKKwl1bnNpZ25lZCByZXQ7CisKKwlpZiAoIUVYVDRfSEFTX1JPX0NPTVBBVF9GRUFUVVJFKHNiLAorCQkJCQlFWFQ0X0ZFQVRVUkVfUk9fQ09NUEFUX1NQQVJTRV9TVVBFUikpIHsKKwkJcmV0ID0gKm1pbjsKKwkJKm1pbiArPSAxOworCQlyZXR1cm4gcmV0OworCX0KKworCWlmICgqZml2ZSA8ICptaW4pIHsKKwkJbWluID0gZml2ZTsKKwkJbXVsdCA9IDU7CisJfQorCWlmICgqc2V2ZW4gPCAqbWluKSB7CisJCW1pbiA9IHNldmVuOworCQltdWx0ID0gNzsKKwl9CisKKwlyZXQgPSAqbWluOworCSptaW4gKj0gbXVsdDsKKworCXJldHVybiByZXQ7Cit9CisKKy8qCisgKiBDaGVjayB0aGF0IGFsbCBvZiB0aGUgYmFja3VwIEdEVCBibG9ja3MgYXJlIGhlbGQgaW4gdGhlIHByaW1hcnkgR0RUIGJsb2NrLgorICogSXQgaXMgYXNzdW1lZCB0aGF0IHRoZXkgYXJlIHN0b3JlZCBpbiBncm91cCBvcmRlci4gIFJldHVybnMgdGhlIG51bWJlciBvZgorICogZ3JvdXBzIGluIGN1cnJlbnQgZmlsZXN5c3RlbSB0aGF0IGhhdmUgQkFDS1VQUywgb3IgLXZlIGVycm9yIGNvZGUuCisgKi8KK3N0YXRpYyBpbnQgdmVyaWZ5X3Jlc2VydmVkX2dkYihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLAorCQkJICAgICAgIHN0cnVjdCBidWZmZXJfaGVhZCAqcHJpbWFyeSkKK3sKKwljb25zdCBleHQ0X2ZzYmxrX3QgYmxrID0gcHJpbWFyeS0+Yl9ibG9ja25yOworCWNvbnN0IHVuc2lnbmVkIGxvbmcgZW5kID0gRVhUNF9TQihzYiktPnNfZ3JvdXBzX2NvdW50OworCXVuc2lnbmVkIHRocmVlID0gMTsKKwl1bnNpZ25lZCBmaXZlID0gNTsKKwl1bnNpZ25lZCBzZXZlbiA9IDc7CisJdW5zaWduZWQgZ3JwOworCV9fbGUzMiAqcCA9IChfX2xlMzIgKilwcmltYXJ5LT5iX2RhdGE7CisJaW50IGdkYmFja3VwcyA9IDA7CisKKwl3aGlsZSAoKGdycCA9IGV4dDRfbGlzdF9iYWNrdXBzKHNiLCAmdGhyZWUsICZmaXZlLCAmc2V2ZW4pKSA8IGVuZCkgeworCQlpZiAobGUzMl90b19jcHUoKnArKykgIT0KKwkJICAgIGdycCAqIEVYVDRfQkxPQ0tTX1BFUl9HUk9VUChzYikgKyBibGspeworCQkJZXh0NF93YXJuaW5nKHNiLCBfX0ZVTkNUSU9OX18sCisJCQkJICAgICAicmVzZXJ2ZWQgR0RUICVsbHUiCisJCQkJICAgICAiIG1pc3NpbmcgZ3JwICVkICglbGx1KSIsCisJCQkJICAgICBibGssIGdycCwKKwkJCQkgICAgIGdycCAqCisJCQkJICAgICAoZXh0NF9mc2Jsa190KUVYVDRfQkxPQ0tTX1BFUl9HUk9VUChzYikgKworCQkJCSAgICAgYmxrKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJCWlmICgrK2dkYmFja3VwcyA+IEVYVDRfQUREUl9QRVJfQkxPQ0soc2IpKQorCQkJcmV0dXJuIC1FRkJJRzsKKwl9CisKKwlyZXR1cm4gZ2RiYWNrdXBzOworfQorCisvKgorICogQ2FsbGVkIHdoZW4gd2UgbmVlZCB0byBicmluZyBhIHJlc2VydmVkIGdyb3VwIGRlc2NyaXB0b3IgdGFibGUgYmxvY2sgaW50bworICogdXNlIGZyb20gdGhlIHJlc2l6ZSBpbm9kZS4gIFRoZSBwcmltYXJ5IGNvcHkgb2YgdGhlIG5ldyBHRFQgYmxvY2sgY3VycmVudGx5CisgKiBpcyBhbiBpbmRpcmVjdCBibG9jayAodW5kZXIgdGhlIGRvdWJsZSBpbmRpcmVjdCBibG9jayBpbiB0aGUgcmVzaXplIGlub2RlKS4KKyAqIFRoZSBuZXcgYmFja3VwIEdEVCBibG9ja3Mgd2lsbCBiZSBzdG9yZWQgYXMgbGVhZiBibG9ja3MgaW4gdGhpcyBpbmRpcmVjdAorICogYmxvY2ssIGluIGdyb3VwIG9yZGVyLiAgRXZlbiB0aG91Z2ggd2Uga25vdyBhbGwgdGhlIGJsb2NrIG51bWJlcnMgd2UgbmVlZCwKKyAqIHdlIGNoZWNrIHRvIGVuc3VyZSB0aGF0IHRoZSByZXNpemUgaW5vZGUgaGFzIGFjdHVhbGx5IHJlc2VydmVkIHRoZXNlIGJsb2Nrcy4KKyAqCisgKiBEb24ndCBuZWVkIHRvIHVwZGF0ZSB0aGUgYmxvY2sgYml0bWFwcyBiZWNhdXNlIHRoZSBibG9ja3MgYXJlIHN0aWxsIGluIHVzZS4KKyAqCisgKiBXZSBnZXQgYWxsIG9mIHRoZSBlcnJvciBjYXNlcyBvdXQgb2YgdGhlIHdheSwgc28gdGhhdCB3ZSBhcmUgc3VyZSB0byBub3QKKyAqIGZhaWwgb25jZSB3ZSBzdGFydCBtb2RpZnlpbmcgdGhlIGRhdGEgb24gZGlzaywgYmVjYXVzZSBKQkQgaGFzIG5vIHJvbGxiYWNrLgorICovCitzdGF0aWMgaW50IGFkZF9uZXdfZ2RiKGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBpbm9kZSAqaW5vZGUsCisJCSAgICAgICBzdHJ1Y3QgZXh0NF9uZXdfZ3JvdXBfZGF0YSAqaW5wdXQsCisJCSAgICAgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKipwcmltYXJ5KQoreworCXN0cnVjdCBzdXBlcl9ibG9jayAqc2IgPSBpbm9kZS0+aV9zYjsKKwlzdHJ1Y3QgZXh0NF9zdXBlcl9ibG9jayAqZXMgPSBFWFQ0X1NCKHNiKS0+c19lczsKKwl1bnNpZ25lZCBsb25nIGdkYl9udW0gPSBpbnB1dC0+Z3JvdXAgLyBFWFQ0X0RFU0NfUEVSX0JMT0NLKHNiKTsKKwlleHQ0X2ZzYmxrX3QgZ2RibG9jayA9IEVYVDRfU0Ioc2IpLT5zX3NiaC0+Yl9ibG9ja25yICsgMSArIGdkYl9udW07CisJc3RydWN0IGJ1ZmZlcl9oZWFkICoqb19ncm91cF9kZXNjLCAqKm5fZ3JvdXBfZGVzYzsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmRpbmQ7CisJaW50IGdkYmFja3VwczsKKwlzdHJ1Y3QgZXh0NF9pbG9jIGlsb2M7CisJX19sZTMyICpkYXRhOworCWludCBlcnI7CisKKwlpZiAodGVzdF9vcHQoc2IsIERFQlVHKSkKKwkJcHJpbnRrKEtFUk5fREVCVUcKKwkJICAgICAgICJFWFQ0LWZzOiBleHQ0X2FkZF9uZXdfZ2RiOiBhZGRpbmcgZ3JvdXAgYmxvY2sgJWx1XG4iLAorCQkgICAgICAgZ2RiX251bSk7CisKKwkvKgorCSAqIElmIHdlIGFyZSBub3QgdXNpbmcgdGhlIHByaW1hcnkgc3VwZXJibG9jay9HRFQgY29weSBkb24ndCByZXNpemUsCisJICogYmVjYXVzZSB0aGUgdXNlciB0b29scyBoYXZlIG5vIHdheSBvZiBoYW5kbGluZyB0aGlzLiAgUHJvYmFibHkgYQorCSAqIGJhZCB0aW1lIHRvIGRvIGl0IGFueXdheXMuCisJICovCisJaWYgKEVYVDRfU0Ioc2IpLT5zX3NiaC0+Yl9ibG9ja25yICE9CisJICAgIGxlMzJfdG9fY3B1KEVYVDRfU0Ioc2IpLT5zX2VzLT5zX2ZpcnN0X2RhdGFfYmxvY2spKSB7CisJCWV4dDRfd2FybmluZyhzYiwgX19GVU5DVElPTl9fLAorCQkJIndvbid0IHJlc2l6ZSB1c2luZyBiYWNrdXAgc3VwZXJibG9jayBhdCAlbGx1IiwKKwkJCSh1bnNpZ25lZCBsb25nIGxvbmcpRVhUNF9TQihzYiktPnNfc2JoLT5iX2Jsb2NrbnIpOworCQlyZXR1cm4gLUVQRVJNOworCX0KKworCSpwcmltYXJ5ID0gc2JfYnJlYWQoc2IsIGdkYmxvY2spOworCWlmICghKnByaW1hcnkpCisJCXJldHVybiAtRUlPOworCisJaWYgKChnZGJhY2t1cHMgPSB2ZXJpZnlfcmVzZXJ2ZWRfZ2RiKHNiLCAqcHJpbWFyeSkpIDwgMCkgeworCQllcnIgPSBnZGJhY2t1cHM7CisJCWdvdG8gZXhpdF9iaDsKKwl9CisKKwlkYXRhID0gRVhUNF9JKGlub2RlKS0+aV9kYXRhICsgRVhUNF9ESU5EX0JMT0NLOworCWRpbmQgPSBzYl9icmVhZChzYiwgbGUzMl90b19jcHUoKmRhdGEpKTsKKwlpZiAoIWRpbmQpIHsKKwkJZXJyID0gLUVJTzsKKwkJZ290byBleGl0X2JoOworCX0KKworCWRhdGEgPSAoX19sZTMyICopZGluZC0+Yl9kYXRhOworCWlmIChsZTMyX3RvX2NwdShkYXRhW2dkYl9udW0gJSBFWFQ0X0FERFJfUEVSX0JMT0NLKHNiKV0pICE9IGdkYmxvY2spIHsKKwkJZXh0NF93YXJuaW5nKHNiLCBfX0ZVTkNUSU9OX18sCisJCQkgICAgICJuZXcgZ3JvdXAgJXUgR0RUIGJsb2NrICVsbHUgbm90IHJlc2VydmVkIiwKKwkJCSAgICAgaW5wdXQtPmdyb3VwLCBnZGJsb2NrKTsKKwkJZXJyID0gLUVJTlZBTDsKKwkJZ290byBleGl0X2RpbmQ7CisJfQorCisJaWYgKChlcnIgPSBleHQ0X2pvdXJuYWxfZ2V0X3dyaXRlX2FjY2VzcyhoYW5kbGUsIEVYVDRfU0Ioc2IpLT5zX3NiaCkpKQorCQlnb3RvIGV4aXRfZGluZDsKKworCWlmICgoZXJyID0gZXh0NF9qb3VybmFsX2dldF93cml0ZV9hY2Nlc3MoaGFuZGxlLCAqcHJpbWFyeSkpKQorCQlnb3RvIGV4aXRfc2JoOworCisJaWYgKChlcnIgPSBleHQ0X2pvdXJuYWxfZ2V0X3dyaXRlX2FjY2VzcyhoYW5kbGUsIGRpbmQpKSkKKwkJZ290byBleGl0X3ByaW1hcnk7CisKKwkvKiBleHQ0X3Jlc2VydmVfaW5vZGVfd3JpdGUoKSBnZXRzIGEgcmVmZXJlbmNlIG9uIHRoZSBpbG9jICovCisJaWYgKChlcnIgPSBleHQ0X3Jlc2VydmVfaW5vZGVfd3JpdGUoaGFuZGxlLCBpbm9kZSwgJmlsb2MpKSkKKwkJZ290byBleGl0X2RpbmRqOworCisJbl9ncm91cF9kZXNjID0ga21hbGxvYygoZ2RiX251bSArIDEpICogc2l6ZW9mKHN0cnVjdCBidWZmZXJfaGVhZCAqKSwKKwkJCUdGUF9LRVJORUwpOworCWlmICghbl9ncm91cF9kZXNjKSB7CisJCWVyciA9IC1FTk9NRU07CisJCWV4dDRfd2FybmluZyAoc2IsIF9fRlVOQ1RJT05fXywKKwkJCSAgICAgICJub3QgZW5vdWdoIG1lbW9yeSBmb3IgJWx1IGdyb3VwcyIsIGdkYl9udW0gKyAxKTsKKwkJZ290byBleGl0X2lub2RlOworCX0KKworCS8qCisJICogRmluYWxseSwgd2UgaGF2ZSBhbGwgb2YgdGhlIHBvc3NpYmxlIGZhaWx1cmVzIGJlaGluZCB1cy4uLgorCSAqCisJICogUmVtb3ZlIG5ldyBHRFQgYmxvY2sgZnJvbSBpbm9kZSBkb3VibGUtaW5kaXJlY3QgYmxvY2sgYW5kIGNsZWFyIG91dAorCSAqIHRoZSBuZXcgR0RUIGJsb2NrIGZvciB1c2UgKHdoaWNoIGFsc28gImZyZWVzIiB0aGUgYmFja3VwIEdEVCBibG9ja3MKKwkgKiBmcm9tIHRoZSByZXNlcnZlZCBpbm9kZSkuICBXZSBkb24ndCBuZWVkIHRvIGNoYW5nZSB0aGUgYml0bWFwcyBmb3IKKwkgKiB0aGVzZSBibG9ja3MsIGJlY2F1c2UgdGhleSBhcmUgbWFya2VkIGFzIGluLXVzZSBmcm9tIGJlaW5nIGluIHRoZQorCSAqIHJlc2VydmVkIGlub2RlLCBhbmQgd2lsbCBiZWNvbWUgR0RUIGJsb2NrcyAocHJpbWFyeSBhbmQgYmFja3VwKS4KKwkgKi8KKwlkYXRhW2dkYl9udW0gJSBFWFQ0X0FERFJfUEVSX0JMT0NLKHNiKV0gPSAwOworCWV4dDRfam91cm5hbF9kaXJ0eV9tZXRhZGF0YShoYW5kbGUsIGRpbmQpOworCWJyZWxzZShkaW5kKTsKKwlpbm9kZS0+aV9ibG9ja3MgLT0gKGdkYmFja3VwcyArIDEpICogc2ItPnNfYmxvY2tzaXplID4+IDk7CisJZXh0NF9tYXJrX2lsb2NfZGlydHkoaGFuZGxlLCBpbm9kZSwgJmlsb2MpOworCW1lbXNldCgoKnByaW1hcnkpLT5iX2RhdGEsIDAsIHNiLT5zX2Jsb2Nrc2l6ZSk7CisJZXh0NF9qb3VybmFsX2RpcnR5X21ldGFkYXRhKGhhbmRsZSwgKnByaW1hcnkpOworCisJb19ncm91cF9kZXNjID0gRVhUNF9TQihzYiktPnNfZ3JvdXBfZGVzYzsKKwltZW1jcHkobl9ncm91cF9kZXNjLCBvX2dyb3VwX2Rlc2MsCisJICAgICAgIEVYVDRfU0Ioc2IpLT5zX2dkYl9jb3VudCAqIHNpemVvZihzdHJ1Y3QgYnVmZmVyX2hlYWQgKikpOworCW5fZ3JvdXBfZGVzY1tnZGJfbnVtXSA9ICpwcmltYXJ5OworCUVYVDRfU0Ioc2IpLT5zX2dyb3VwX2Rlc2MgPSBuX2dyb3VwX2Rlc2M7CisJRVhUNF9TQihzYiktPnNfZ2RiX2NvdW50Kys7CisJa2ZyZWUob19ncm91cF9kZXNjKTsKKworCWVzLT5zX3Jlc2VydmVkX2dkdF9ibG9ja3MgPQorCQljcHVfdG9fbGUxNihsZTE2X3RvX2NwdShlcy0+c19yZXNlcnZlZF9nZHRfYmxvY2tzKSAtIDEpOworCWV4dDRfam91cm5hbF9kaXJ0eV9tZXRhZGF0YShoYW5kbGUsIEVYVDRfU0Ioc2IpLT5zX3NiaCk7CisKKwlyZXR1cm4gMDsKKworZXhpdF9pbm9kZToKKwkvL2V4dDRfam91cm5hbF9yZWxlYXNlX2J1ZmZlcihoYW5kbGUsIGlsb2MuYmgpOworCWJyZWxzZShpbG9jLmJoKTsKK2V4aXRfZGluZGo6CisJLy9leHQ0X2pvdXJuYWxfcmVsZWFzZV9idWZmZXIoaGFuZGxlLCBkaW5kKTsKK2V4aXRfcHJpbWFyeToKKwkvL2V4dDRfam91cm5hbF9yZWxlYXNlX2J1ZmZlcihoYW5kbGUsICpwcmltYXJ5KTsKK2V4aXRfc2JoOgorCS8vZXh0NF9qb3VybmFsX3JlbGVhc2VfYnVmZmVyKGhhbmRsZSwgKnByaW1hcnkpOworZXhpdF9kaW5kOgorCWJyZWxzZShkaW5kKTsKK2V4aXRfYmg6CisJYnJlbHNlKCpwcmltYXJ5KTsKKworCWV4dDRfZGVidWcoImxlYXZpbmcgd2l0aCBlcnJvciAlZFxuIiwgZXJyKTsKKwlyZXR1cm4gZXJyOworfQorCisvKgorICogQ2FsbGVkIHdoZW4gd2UgYXJlIGFkZGluZyBhIG5ldyBncm91cCB3aGljaCBoYXMgYSBiYWNrdXAgY29weSBvZiBlYWNoIG9mCisgKiB0aGUgR0RUIGJsb2NrcyAoaS5lLiBzcGFyc2UgZ3JvdXApIGFuZCB0aGVyZSBhcmUgcmVzZXJ2ZWQgR0RUIGJsb2Nrcy4KKyAqIFdlIG5lZWQgdG8gYWRkIHRoZXNlIHJlc2VydmVkIGJhY2t1cCBHRFQgYmxvY2tzIHRvIHRoZSByZXNpemUgaW5vZGUsIHNvCisgKiB0aGF0IHRoZXkgYXJlIGtlcHQgZm9yIGZ1dHVyZSByZXNpemluZyBhbmQgbm90IGFsbG9jYXRlZCB0byBmaWxlcy4KKyAqCisgKiBFYWNoIHJlc2VydmVkIGJhY2t1cCBHRFQgYmxvY2sgd2lsbCBnbyBpbnRvIGEgZGlmZmVyZW50IGluZGlyZWN0IGJsb2NrLgorICogVGhlIGluZGlyZWN0IGJsb2NrcyBhcmUgYWN0dWFsbHkgdGhlIHByaW1hcnkgcmVzZXJ2ZWQgR0RUIGJsb2NrcywKKyAqIHNvIHdlIGtub3cgaW4gYWR2YW5jZSB3aGF0IHRoZWlyIGJsb2NrIG51bWJlcnMgYXJlLiAgV2Ugb25seSBnZXQgdGhlCisgKiBkb3VibGUtaW5kaXJlY3QgYmxvY2sgdG8gdmVyaWZ5IGl0IGlzIHBvaW50aW5nIHRvIHRoZSBwcmltYXJ5IHJlc2VydmVkCisgKiBHRFQgYmxvY2tzIHNvIHdlIGRvbid0IG92ZXJ3cml0ZSBhIGRhdGEgYmxvY2sgYnkgYWNjaWRlbnQuICBUaGUgcmVzZXJ2ZWQKKyAqIGJhY2t1cCBHRFQgYmxvY2tzIGFyZSBzdG9yZWQgaW4gdGhlaXIgcmVzZXJ2ZWQgcHJpbWFyeSBHRFQgYmxvY2suCisgKi8KK3N0YXRpYyBpbnQgcmVzZXJ2ZV9iYWNrdXBfZ2RiKGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBpbm9kZSAqaW5vZGUsCisJCQkgICAgICBzdHJ1Y3QgZXh0NF9uZXdfZ3JvdXBfZGF0YSAqaW5wdXQpCit7CisJc3RydWN0IHN1cGVyX2Jsb2NrICpzYiA9IGlub2RlLT5pX3NiOworCWludCByZXNlcnZlZF9nZGIgPWxlMTZfdG9fY3B1KEVYVDRfU0Ioc2IpLT5zX2VzLT5zX3Jlc2VydmVkX2dkdF9ibG9ja3MpOworCXN0cnVjdCBidWZmZXJfaGVhZCAqKnByaW1hcnk7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpkaW5kOworCXN0cnVjdCBleHQ0X2lsb2MgaWxvYzsKKwlleHQ0X2ZzYmxrX3QgYmxrOworCV9fbGUzMiAqZGF0YSwgKmVuZDsKKwlpbnQgZ2RiYWNrdXBzID0gMDsKKwlpbnQgcmVzLCBpOworCWludCBlcnI7CisKKwlwcmltYXJ5ID0ga21hbGxvYyhyZXNlcnZlZF9nZGIgKiBzaXplb2YoKnByaW1hcnkpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXByaW1hcnkpCisJCXJldHVybiAtRU5PTUVNOworCisJZGF0YSA9IEVYVDRfSShpbm9kZSktPmlfZGF0YSArIEVYVDRfRElORF9CTE9DSzsKKwlkaW5kID0gc2JfYnJlYWQoc2IsIGxlMzJfdG9fY3B1KCpkYXRhKSk7CisJaWYgKCFkaW5kKSB7CisJCWVyciA9IC1FSU87CisJCWdvdG8gZXhpdF9mcmVlOworCX0KKworCWJsayA9IEVYVDRfU0Ioc2IpLT5zX3NiaC0+Yl9ibG9ja25yICsgMSArIEVYVDRfU0Ioc2IpLT5zX2dkYl9jb3VudDsKKwlkYXRhID0gKF9fbGUzMiAqKWRpbmQtPmJfZGF0YSArIEVYVDRfU0Ioc2IpLT5zX2dkYl9jb3VudDsKKwllbmQgPSAoX19sZTMyICopZGluZC0+Yl9kYXRhICsgRVhUNF9BRERSX1BFUl9CTE9DSyhzYik7CisKKwkvKiBHZXQgZWFjaCByZXNlcnZlZCBwcmltYXJ5IEdEVCBibG9jayBhbmQgdmVyaWZ5IGl0IGhvbGRzIGJhY2t1cHMgKi8KKwlmb3IgKHJlcyA9IDA7IHJlcyA8IHJlc2VydmVkX2dkYjsgcmVzKyssIGJsaysrKSB7CisJCWlmIChsZTMyX3RvX2NwdSgqZGF0YSkgIT0gYmxrKSB7CisJCQlleHQ0X3dhcm5pbmcoc2IsIF9fRlVOQ1RJT05fXywKKwkJCQkgICAgICJyZXNlcnZlZCBibG9jayAlbGx1IgorCQkJCSAgICAgIiBub3QgYXQgb2Zmc2V0ICVsZCIsCisJCQkJICAgICBibGssCisJCQkJICAgICAobG9uZykoZGF0YSAtIChfX2xlMzIgKilkaW5kLT5iX2RhdGEpKTsKKwkJCWVyciA9IC1FSU5WQUw7CisJCQlnb3RvIGV4aXRfYmg7CisJCX0KKwkJcHJpbWFyeVtyZXNdID0gc2JfYnJlYWQoc2IsIGJsayk7CisJCWlmICghcHJpbWFyeVtyZXNdKSB7CisJCQllcnIgPSAtRUlPOworCQkJZ290byBleGl0X2JoOworCQl9CisJCWlmICgoZ2RiYWNrdXBzID0gdmVyaWZ5X3Jlc2VydmVkX2dkYihzYiwgcHJpbWFyeVtyZXNdKSkgPCAwKSB7CisJCQlicmVsc2UocHJpbWFyeVtyZXNdKTsKKwkJCWVyciA9IGdkYmFja3VwczsKKwkJCWdvdG8gZXhpdF9iaDsKKwkJfQorCQlpZiAoKytkYXRhID49IGVuZCkKKwkJCWRhdGEgPSAoX19sZTMyICopZGluZC0+Yl9kYXRhOworCX0KKworCWZvciAoaSA9IDA7IGkgPCByZXNlcnZlZF9nZGI7IGkrKykgeworCQlpZiAoKGVyciA9IGV4dDRfam91cm5hbF9nZXRfd3JpdGVfYWNjZXNzKGhhbmRsZSwgcHJpbWFyeVtpXSkpKSB7CisJCQkvKgorCQkJaW50IGo7CisJCQlmb3IgKGogPSAwOyBqIDwgaTsgaisrKQorCQkJCWV4dDRfam91cm5hbF9yZWxlYXNlX2J1ZmZlcihoYW5kbGUsIHByaW1hcnlbal0pOworCQkJICovCisJCQlnb3RvIGV4aXRfYmg7CisJCX0KKwl9CisKKwlpZiAoKGVyciA9IGV4dDRfcmVzZXJ2ZV9pbm9kZV93cml0ZShoYW5kbGUsIGlub2RlLCAmaWxvYykpKQorCQlnb3RvIGV4aXRfYmg7CisKKwkvKgorCSAqIEZpbmFsbHkgd2UgY2FuIGFkZCBlYWNoIG9mIHRoZSByZXNlcnZlZCBiYWNrdXAgR0RUIGJsb2NrcyBmcm9tCisJICogdGhlIG5ldyBncm91cCB0byBpdHMgcmVzZXJ2ZWQgcHJpbWFyeSBHRFQgYmxvY2suCisJICovCisJYmxrID0gaW5wdXQtPmdyb3VwICogRVhUNF9CTE9DS1NfUEVSX0dST1VQKHNiKTsKKwlmb3IgKGkgPSAwOyBpIDwgcmVzZXJ2ZWRfZ2RiOyBpKyspIHsKKwkJaW50IGVycjI7CisJCWRhdGEgPSAoX19sZTMyICopcHJpbWFyeVtpXS0+Yl9kYXRhOworCQkvKiBwcmludGsoInJlc2VydmluZyBiYWNrdXAgJWx1WyV1XSA9ICVsdVxuIiwKKwkJICAgICAgIHByaW1hcnlbaV0tPmJfYmxvY2tuciwgZ2RiYWNrdXBzLAorCQkgICAgICAgYmxrICsgcHJpbWFyeVtpXS0+Yl9ibG9ja25yKTsgKi8KKwkJZGF0YVtnZGJhY2t1cHNdID0gY3B1X3RvX2xlMzIoYmxrICsgcHJpbWFyeVtpXS0+Yl9ibG9ja25yKTsKKwkJZXJyMiA9IGV4dDRfam91cm5hbF9kaXJ0eV9tZXRhZGF0YShoYW5kbGUsIHByaW1hcnlbaV0pOworCQlpZiAoIWVycikKKwkJCWVyciA9IGVycjI7CisJfQorCWlub2RlLT5pX2Jsb2NrcyArPSByZXNlcnZlZF9nZGIgKiBzYi0+c19ibG9ja3NpemUgPj4gOTsKKwlleHQ0X21hcmtfaWxvY19kaXJ0eShoYW5kbGUsIGlub2RlLCAmaWxvYyk7CisKK2V4aXRfYmg6CisJd2hpbGUgKC0tcmVzID49IDApCisJCWJyZWxzZShwcmltYXJ5W3Jlc10pOworCWJyZWxzZShkaW5kKTsKKworZXhpdF9mcmVlOgorCWtmcmVlKHByaW1hcnkpOworCisJcmV0dXJuIGVycjsKK30KKworLyoKKyAqIFVwZGF0ZSB0aGUgYmFja3VwIGNvcGllcyBvZiB0aGUgZXh0NCBtZXRhZGF0YS4gIFRoZXNlIGRvbid0IG5lZWQgdG8gYmUgcGFydAorICogb2YgdGhlIG1haW4gcmVzaXplIHRyYW5zYWN0aW9uLCBiZWNhdXNlIGUyZnNjayB3aWxsIHJlLXdyaXRlIHRoZW0gaWYgdGhlcmUKKyAqIGlzIGEgcHJvYmxlbSAoYmFzaWNhbGx5IG9ubHkgT09NIHdpbGwgY2F1c2UgYSBwcm9ibGVtKS4gIEhvd2V2ZXIsIHdlCisgKiBfc2hvdWxkXyB1cGRhdGUgdGhlIGJhY2t1cHMgaWYgcG9zc2libGUsIGluIGNhc2UgdGhlIHByaW1hcnkgZ2V0cyB0cmFzaGVkCisgKiBmb3Igc29tZSByZWFzb24gYW5kIHdlIG5lZWQgdG8gcnVuIGUyZnNjayBmcm9tIGEgYmFja3VwIHN1cGVyYmxvY2suICBUaGUKKyAqIGltcG9ydGFudCBwYXJ0IGlzIHRoYXQgdGhlIG5ldyBibG9jayBhbmQgaW5vZGUgY291bnRzIGFyZSBpbiB0aGUgYmFja3VwCisgKiBzdXBlcmJsb2NrcywgYW5kIHRoZSBsb2NhdGlvbiBvZiB0aGUgbmV3IGdyb3VwIG1ldGFkYXRhIGluIHRoZSBHRFQgYmFja3Vwcy4KKyAqCisgKiBXZSBkbyBub3QgbmVlZCBsb2NrX3N1cGVyKCkgZm9yIHRoaXMsIGJlY2F1c2UgdGhlc2UgYmxvY2tzIGFyZSBub3QKKyAqIG90aGVyd2lzZSB0b3VjaGVkIGJ5IHRoZSBmaWxlc3lzdGVtIGNvZGUgd2hlbiBpdCBpcyBtb3VudGVkLiAgV2UgZG9uJ3QKKyAqIG5lZWQgdG8gd29ycnkgYWJvdXQgbGFzdCBjaGFuZ2luZyBmcm9tIHNiaS0+c19ncm91cHNfY291bnQsIGJlY2F1c2UgdGhlCisgKiB3b3JzdCB0aGF0IGNhbiBoYXBwZW4gaXMgdGhhdCB3ZSBkbyBub3QgY29weSB0aGUgZnVsbCBudW1iZXIgb2YgYmFja3VwcworICogYXQgdGhpcyB0aW1lLiAgVGhlIHJlc2l6ZSB3aGljaCBjaGFuZ2VkIHNfZ3JvdXBzX2NvdW50IHdpbGwgYmFja3VwIGFnYWluLgorICovCitzdGF0aWMgdm9pZCB1cGRhdGVfYmFja3VwcyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLAorCQkJICAgaW50IGJsa19vZmYsIGNoYXIgKmRhdGEsIGludCBzaXplKQoreworCXN0cnVjdCBleHQ0X3NiX2luZm8gKnNiaSA9IEVYVDRfU0Ioc2IpOworCWNvbnN0IHVuc2lnbmVkIGxvbmcgbGFzdCA9IHNiaS0+c19ncm91cHNfY291bnQ7CisJY29uc3QgaW50IGJwZyA9IEVYVDRfQkxPQ0tTX1BFUl9HUk9VUChzYik7CisJdW5zaWduZWQgdGhyZWUgPSAxOworCXVuc2lnbmVkIGZpdmUgPSA1OworCXVuc2lnbmVkIHNldmVuID0gNzsKKwl1bnNpZ25lZCBncm91cDsKKwlpbnQgcmVzdCA9IHNiLT5zX2Jsb2Nrc2l6ZSAtIHNpemU7CisJaGFuZGxlX3QgKmhhbmRsZTsKKwlpbnQgZXJyID0gMCwgZXJyMjsKKworCWhhbmRsZSA9IGV4dDRfam91cm5hbF9zdGFydF9zYihzYiwgRVhUNF9NQVhfVFJBTlNfREFUQSk7CisJaWYgKElTX0VSUihoYW5kbGUpKSB7CisJCWdyb3VwID0gMTsKKwkJZXJyID0gUFRSX0VSUihoYW5kbGUpOworCQlnb3RvIGV4aXRfZXJyOworCX0KKworCXdoaWxlICgoZ3JvdXAgPSBleHQ0X2xpc3RfYmFja3VwcyhzYiwgJnRocmVlLCAmZml2ZSwgJnNldmVuKSkgPCBsYXN0KSB7CisJCXN0cnVjdCBidWZmZXJfaGVhZCAqYmg7CisKKwkJLyogT3V0IG9mIGpvdXJuYWwgc3BhY2UsIGFuZCBjYW4ndCBnZXQgbW9yZSAtIGFib3J0IC0gc28gc2FkICovCisJCWlmIChoYW5kbGUtPmhfYnVmZmVyX2NyZWRpdHMgPT0gMCAmJgorCQkgICAgZXh0NF9qb3VybmFsX2V4dGVuZChoYW5kbGUsIEVYVDRfTUFYX1RSQU5TX0RBVEEpICYmCisJCSAgICAoZXJyID0gZXh0NF9qb3VybmFsX3Jlc3RhcnQoaGFuZGxlLCBFWFQ0X01BWF9UUkFOU19EQVRBKSkpCisJCQlicmVhazsKKworCQliaCA9IHNiX2dldGJsayhzYiwgZ3JvdXAgKiBicGcgKyBibGtfb2ZmKTsKKwkJaWYgKCFiaCkgeworCQkJZXJyID0gLUVJTzsKKwkJCWJyZWFrOworCQl9CisJCWV4dDRfZGVidWcoInVwZGF0ZSBtZXRhZGF0YSBiYWNrdXAgJSMwNGx4XG4iLAorCQkJICAodW5zaWduZWQgbG9uZyliaC0+Yl9ibG9ja25yKTsKKwkJaWYgKChlcnIgPSBleHQ0X2pvdXJuYWxfZ2V0X3dyaXRlX2FjY2VzcyhoYW5kbGUsIGJoKSkpCisJCQlicmVhazsKKwkJbG9ja19idWZmZXIoYmgpOworCQltZW1jcHkoYmgtPmJfZGF0YSwgZGF0YSwgc2l6ZSk7CisJCWlmIChyZXN0KQorCQkJbWVtc2V0KGJoLT5iX2RhdGEgKyBzaXplLCAwLCByZXN0KTsKKwkJc2V0X2J1ZmZlcl91cHRvZGF0ZShiaCk7CisJCXVubG9ja19idWZmZXIoYmgpOworCQlleHQ0X2pvdXJuYWxfZGlydHlfbWV0YWRhdGEoaGFuZGxlLCBiaCk7CisJCWJyZWxzZShiaCk7CisJfQorCWlmICgoZXJyMiA9IGV4dDRfam91cm5hbF9zdG9wKGhhbmRsZSkpICYmICFlcnIpCisJCWVyciA9IGVycjI7CisKKwkvKgorCSAqIFVnaCEgTmVlZCB0byBoYXZlIGUyZnNjayB3cml0ZSB0aGUgYmFja3VwIGNvcGllcy4gIEl0IGlzIHRvbworCSAqIGxhdGUgdG8gcmV2ZXJ0IHRoZSByZXNpemUsIHdlIHNob3VsZG4ndCBmYWlsIGp1c3QgYmVjYXVzZSBvZgorCSAqIHRoZSBiYWNrdXAgY29waWVzICh0aGV5IGFyZSBvbmx5IG5lZWRlZCBpbiBjYXNlIG9mIGNvcnJ1cHRpb24pLgorCSAqCisJICogSG93ZXZlciwgaWYgd2UgZ290IGhlcmUgd2UgaGF2ZSBhIGpvdXJuYWwgcHJvYmxlbSB0b28sIHNvIHdlCisJICogY2FuJ3QgcmVhbGx5IHN0YXJ0IGEgdHJhbnNhY3Rpb24gdG8gbWFyayB0aGUgc3VwZXJibG9jay4KKwkgKiBDaGlja2VuIG91dCBhbmQganVzdCBzZXQgdGhlIGZsYWcgb24gdGhlIGhvcGUgaXQgd2lsbCBiZSB3cml0dGVuCisJICogdG8gZGlzaywgYW5kIGlmIG5vdCAtIHdlIHdpbGwgc2ltcGx5IHdhaXQgdW50aWwgbmV4dCBmc2NrLgorCSAqLworZXhpdF9lcnI6CisJaWYgKGVycikgeworCQlleHQ0X3dhcm5pbmcoc2IsIF9fRlVOQ1RJT05fXywKKwkJCSAgICAgImNhbid0IHVwZGF0ZSBiYWNrdXAgZm9yIGdyb3VwICVkIChlcnIgJWQpLCAiCisJCQkgICAgICJmb3JjaW5nIGZzY2sgb24gbmV4dCByZWJvb3QiLCBncm91cCwgZXJyKTsKKwkJc2JpLT5zX21vdW50X3N0YXRlICY9IH5FWFQ0X1ZBTElEX0ZTOworCQlzYmktPnNfZXMtPnNfc3RhdGUgJj0gY3B1X3RvX2xlMTYofkVYVDRfVkFMSURfRlMpOworCQltYXJrX2J1ZmZlcl9kaXJ0eShzYmktPnNfc2JoKTsKKwl9Cit9CisKKy8qIEFkZCBncm91cCBkZXNjcmlwdG9yIGRhdGEgdG8gYW4gZXhpc3Rpbmcgb3IgbmV3IGdyb3VwIGRlc2NyaXB0b3IgYmxvY2suCisgKiBFbnN1cmUgd2UgaGFuZGxlIGFsbCBwb3NzaWJsZSBlcnJvciBjb25kaXRpb25zIF9iZWZvcmVfIHdlIHN0YXJ0IG1vZGlmeWluZworICogdGhlIGZpbGVzeXN0ZW0sIGJlY2F1c2Ugd2UgY2Fubm90IGFib3J0IHRoZSB0cmFuc2FjdGlvbiBhbmQgbm90IGhhdmUgaXQKKyAqIHdyaXRlIHRoZSBkYXRhIHRvIGRpc2suCisgKgorICogSWYgd2UgYXJlIG9uIGEgR0RUIGJsb2NrIGJvdW5kYXJ5LCB3ZSBuZWVkIHRvIGdldCB0aGUgcmVzZXJ2ZWQgR0RUIGJsb2NrLgorICogT3RoZXJ3aXNlLCB3ZSBtYXkgbmVlZCB0byBhZGQgYmFja3VwIEdEVCBibG9ja3MgZm9yIGEgc3BhcnNlIGdyb3VwLgorICoKKyAqIFdlIG9ubHkgbmVlZCB0byBob2xkIHRoZSBzdXBlcmJsb2NrIGxvY2sgd2hpbGUgd2UgYXJlIGFjdHVhbGx5IGFkZGluZworICogaW4gdGhlIG5ldyBncm91cCdzIGNvdW50cyB0byB0aGUgc3VwZXJibG9jay4gIFByaW9yIHRvIHRoYXQgd2UgaGF2ZQorICogbm90IHJlYWxseSAiYWRkZWQiIHRoZSBncm91cCBhdCBhbGwuICBXZSByZS1jaGVjayB0aGF0IHdlIGFyZSBzdGlsbAorICogYWRkaW5nIGluIHRoZSBsYXN0IGdyb3VwIGluIGNhc2UgdGhpbmdzIGhhdmUgY2hhbmdlZCBzaW5jZSB2ZXJpZnlpbmcuCisgKi8KK2ludCBleHQ0X2dyb3VwX2FkZChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBzdHJ1Y3QgZXh0NF9uZXdfZ3JvdXBfZGF0YSAqaW5wdXQpCit7CisJc3RydWN0IGV4dDRfc2JfaW5mbyAqc2JpID0gRVhUNF9TQihzYik7CisJc3RydWN0IGV4dDRfc3VwZXJfYmxvY2sgKmVzID0gc2JpLT5zX2VzOworCWludCByZXNlcnZlZF9nZGIgPSBleHQ0X2JnX2hhc19zdXBlcihzYiwgaW5wdXQtPmdyb3VwKSA/CisJCWxlMTZfdG9fY3B1KGVzLT5zX3Jlc2VydmVkX2dkdF9ibG9ja3MpIDogMDsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKnByaW1hcnkgPSBOVUxMOworCXN0cnVjdCBleHQ0X2dyb3VwX2Rlc2MgKmdkcDsKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gTlVMTDsKKwloYW5kbGVfdCAqaGFuZGxlOworCWludCBnZGJfb2ZmLCBnZGJfbnVtOworCWludCBlcnIsIGVycjI7CisKKwlnZGJfbnVtID0gaW5wdXQtPmdyb3VwIC8gRVhUNF9ERVNDX1BFUl9CTE9DSyhzYik7CisJZ2RiX29mZiA9IGlucHV0LT5ncm91cCAlIEVYVDRfREVTQ19QRVJfQkxPQ0soc2IpOworCisJaWYgKGdkYl9vZmYgPT0gMCAmJiAhRVhUNF9IQVNfUk9fQ09NUEFUX0ZFQVRVUkUoc2IsCisJCQkJCUVYVDRfRkVBVFVSRV9ST19DT01QQVRfU1BBUlNFX1NVUEVSKSkgeworCQlleHQ0X3dhcm5pbmcoc2IsIF9fRlVOQ1RJT05fXywKKwkJCSAgICAgIkNhbid0IHJlc2l6ZSBub24tc3BhcnNlIGZpbGVzeXN0ZW0gZnVydGhlciIpOworCQlyZXR1cm4gLUVQRVJNOworCX0KKworCWlmIChleHQ0X2Jsb2Nrc19jb3VudChlcykgKyBpbnB1dC0+YmxvY2tzX2NvdW50IDwKKwkgICAgZXh0NF9ibG9ja3NfY291bnQoZXMpKSB7CisJCWV4dDRfd2FybmluZyhzYiwgX19GVU5DVElPTl9fLCAiYmxvY2tzX2NvdW50IG92ZXJmbG93XG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKGxlMzJfdG9fY3B1KGVzLT5zX2lub2Rlc19jb3VudCkgKyBFWFQ0X0lOT0RFU19QRVJfR1JPVVAoc2IpIDwKKwkgICAgbGUzMl90b19jcHUoZXMtPnNfaW5vZGVzX2NvdW50KSkgeworCQlleHQ0X3dhcm5pbmcoc2IsIF9fRlVOQ1RJT05fXywgImlub2Rlc19jb3VudCBvdmVyZmxvd1xuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmIChyZXNlcnZlZF9nZGIgfHwgZ2RiX29mZiA9PSAwKSB7CisJCWlmICghRVhUNF9IQVNfQ09NUEFUX0ZFQVRVUkUoc2IsCisJCQkJCSAgICAgRVhUNF9GRUFUVVJFX0NPTVBBVF9SRVNJWkVfSU5PREUpKXsKKwkJCWV4dDRfd2FybmluZyhzYiwgX19GVU5DVElPTl9fLAorCQkJCSAgICAgIk5vIHJlc2VydmVkIEdEVCBibG9ja3MsIGNhbid0IHJlc2l6ZSIpOworCQkJcmV0dXJuIC1FUEVSTTsKKwkJfQorCQlpbm9kZSA9IGlnZXQoc2IsIEVYVDRfUkVTSVpFX0lOTyk7CisJCWlmICghaW5vZGUgfHwgaXNfYmFkX2lub2RlKGlub2RlKSkgeworCQkJZXh0NF93YXJuaW5nKHNiLCBfX0ZVTkNUSU9OX18sCisJCQkJICAgICAiRXJyb3Igb3BlbmluZyByZXNpemUgaW5vZGUiKTsKKwkJCWlwdXQoaW5vZGUpOworCQkJcmV0dXJuIC1FTk9FTlQ7CisJCX0KKwl9CisKKwlpZiAoKGVyciA9IHZlcmlmeV9ncm91cF9pbnB1dChzYiwgaW5wdXQpKSkKKwkJZ290byBleGl0X3B1dDsKKworCWlmICgoZXJyID0gc2V0dXBfbmV3X2dyb3VwX2Jsb2NrcyhzYiwgaW5wdXQpKSkKKwkJZ290byBleGl0X3B1dDsKKworCS8qCisJICogV2Ugd2lsbCBhbHdheXMgYmUgbW9kaWZ5aW5nIGF0IGxlYXN0IHRoZSBzdXBlcmJsb2NrIGFuZCBhIEdEVAorCSAqIGJsb2NrLiAgSWYgd2UgYXJlIGFkZGluZyBhIGdyb3VwIHBhc3QgdGhlIGxhc3QgY3VycmVudCBHRFQgYmxvY2ssCisJICogd2Ugd2lsbCBhbHNvIG1vZGlmeSB0aGUgaW5vZGUgYW5kIHRoZSBkaW5kaXJlY3QgYmxvY2suICBJZiB3ZQorCSAqIGFyZSBhZGRpbmcgYSBncm91cCB3aXRoIHN1cGVyYmxvY2svR0RUIGJhY2t1cHMgIHdlIHdpbGwgYWxzbworCSAqIG1vZGlmeSBlYWNoIG9mIHRoZSByZXNlcnZlZCBHRFQgZGluZGlyZWN0IGJsb2Nrcy4KKwkgKi8KKwloYW5kbGUgPSBleHQ0X2pvdXJuYWxfc3RhcnRfc2Ioc2IsCisJCQkJICAgICAgIGV4dDRfYmdfaGFzX3N1cGVyKHNiLCBpbnB1dC0+Z3JvdXApID8KKwkJCQkgICAgICAgMyArIHJlc2VydmVkX2dkYiA6IDQpOworCWlmIChJU19FUlIoaGFuZGxlKSkgeworCQllcnIgPSBQVFJfRVJSKGhhbmRsZSk7CisJCWdvdG8gZXhpdF9wdXQ7CisJfQorCisJbG9ja19zdXBlcihzYik7CisJaWYgKGlucHV0LT5ncm91cCAhPSBzYmktPnNfZ3JvdXBzX2NvdW50KSB7CisJCWV4dDRfd2FybmluZyhzYiwgX19GVU5DVElPTl9fLAorCQkJICAgICAibXVsdGlwbGUgcmVzaXplcnMgcnVuIG9uIGZpbGVzeXN0ZW0hIik7CisJCWVyciA9IC1FQlVTWTsKKwkJZ290byBleGl0X2pvdXJuYWw7CisJfQorCisJaWYgKChlcnIgPSBleHQ0X2pvdXJuYWxfZ2V0X3dyaXRlX2FjY2VzcyhoYW5kbGUsIHNiaS0+c19zYmgpKSkKKwkJZ290byBleGl0X2pvdXJuYWw7CisKKwkvKgorCSAqIFdlIHdpbGwgb25seSBlaXRoZXIgYWRkIHJlc2VydmVkIGdyb3VwIGJsb2NrcyB0byBhIGJhY2t1cCBncm91cAorCSAqIG9yIHJlbW92ZSByZXNlcnZlZCBibG9ja3MgZm9yIHRoZSBmaXJzdCBncm91cCBpbiBhIG5ldyBncm91cCBibG9jay4KKwkgKiBEb2luZyBib3RoIHdvdWxkIGJlIG1lYW4gbW9yZSBjb21wbGV4IGNvZGUsIGFuZCBzYW5lIHBlb3BsZSBkb24ndAorCSAqIHVzZSBub24tc3BhcnNlIGZpbGVzeXN0ZW1zIGFueW1vcmUuICBUaGlzIGlzIGFscmVhZHkgY2hlY2tlZCBhYm92ZS4KKwkgKi8KKwlpZiAoZ2RiX29mZikgeworCQlwcmltYXJ5ID0gc2JpLT5zX2dyb3VwX2Rlc2NbZ2RiX251bV07CisJCWlmICgoZXJyID0gZXh0NF9qb3VybmFsX2dldF93cml0ZV9hY2Nlc3MoaGFuZGxlLCBwcmltYXJ5KSkpCisJCQlnb3RvIGV4aXRfam91cm5hbDsKKworCQlpZiAocmVzZXJ2ZWRfZ2RiICYmIGV4dDRfYmdfbnVtX2dkYihzYiwgaW5wdXQtPmdyb3VwKSAmJgorCQkgICAgKGVyciA9IHJlc2VydmVfYmFja3VwX2dkYihoYW5kbGUsIGlub2RlLCBpbnB1dCkpKQorCQkJZ290byBleGl0X2pvdXJuYWw7CisJfSBlbHNlIGlmICgoZXJyID0gYWRkX25ld19nZGIoaGFuZGxlLCBpbm9kZSwgaW5wdXQsICZwcmltYXJ5KSkpCisJCWdvdG8gZXhpdF9qb3VybmFsOworCisJLyoKKwkgKiBPSywgbm93IHdlJ3ZlIHNldCB1cCB0aGUgbmV3IGdyb3VwLiAgVGltZSB0byBtYWtlIGl0IGFjdGl2ZS4KKwkgKgorCSAqIEN1cnJlbnQga2VybmVscyBkb24ndCBsb2NrIGFsbCBhbGxvY2F0aW9ucyB2aWEgbG9ja19zdXBlcigpLAorCSAqIHNvIHdlIGhhdmUgdG8gYmUgc2FmZSB3cnQuIGNvbmN1cnJlbnQgYWNjZXNzZXMgdGhlIGdyb3VwCisJICogZGF0YS4gIFNvIHdlIG5lZWQgdG8gYmUgY2FyZWZ1bCB0byBzZXQgYWxsIG9mIHRoZSByZWxldmFudAorCSAqIGdyb3VwIGRlc2NyaXB0b3IgZGF0YSBldGMuICpiZWZvcmUqIHdlIGVuYWJsZSB0aGUgZ3JvdXAuCisJICoKKwkgKiBUaGUga2V5IGZpZWxkIGhlcmUgaXMgc2JpLT5zX2dyb3Vwc19jb3VudDogYXMgbG9uZyBhcworCSAqIHRoYXQgcmV0YWlucyBpdHMgb2xkIHZhbHVlLCBub2JvZHkgaXMgZ29pbmcgdG8gYWNjZXNzIHRoZSBuZXcKKwkgKiBncm91cC4KKwkgKgorCSAqIFNvIGZpcnN0IHdlIHVwZGF0ZSBhbGwgdGhlIGRlc2NyaXB0b3IgbWV0YWRhdGEgZm9yIHRoZSBuZXcKKwkgKiBncm91cDsgdGhlbiB3ZSB1cGRhdGUgdGhlIHRvdGFsIGRpc2sgYmxvY2tzIGNvdW50OyB0aGVuIHdlCisJICogdXBkYXRlIHRoZSBncm91cHMgY291bnQgdG8gZW5hYmxlIHRoZSBncm91cDsgdGhlbiBmaW5hbGx5IHdlCisJICogdXBkYXRlIHRoZSBmcmVlIHNwYWNlIGNvdW50cyBzbyB0aGF0IHRoZSBzeXN0ZW0gY2FuIHN0YXJ0CisJICogdXNpbmcgdGhlIG5ldyBkaXNrIGJsb2Nrcy4KKwkgKi8KKworCS8qIFVwZGF0ZSBncm91cCBkZXNjcmlwdG9yIGJsb2NrIGZvciBuZXcgZ3JvdXAgKi8KKwlnZHAgPSAoc3RydWN0IGV4dDRfZ3JvdXBfZGVzYyAqKXByaW1hcnktPmJfZGF0YSArIGdkYl9vZmY7CisKKwlleHQ0X2Jsb2NrX2JpdG1hcF9zZXQoc2IsIGdkcCwgaW5wdXQtPmJsb2NrX2JpdG1hcCk7IC8qIExWIEZJWE1FICovCisJZXh0NF9pbm9kZV9iaXRtYXBfc2V0KHNiLCBnZHAsIGlucHV0LT5pbm9kZV9iaXRtYXApOyAvKiBMViBGSVhNRSAqLworCWV4dDRfaW5vZGVfdGFibGVfc2V0KHNiLCBnZHAsIGlucHV0LT5pbm9kZV90YWJsZSk7IC8qIExWIEZJWE1FICovCisJZ2RwLT5iZ19mcmVlX2Jsb2Nrc19jb3VudCA9IGNwdV90b19sZTE2KGlucHV0LT5mcmVlX2Jsb2Nrc19jb3VudCk7CisJZ2RwLT5iZ19mcmVlX2lub2Rlc19jb3VudCA9IGNwdV90b19sZTE2KEVYVDRfSU5PREVTX1BFUl9HUk9VUChzYikpOworCisJLyoKKwkgKiBNYWtlIHRoZSBuZXcgYmxvY2tzIGFuZCBpbm9kZXMgdmFsaWQgbmV4dC4gIFdlIGRvIHRoaXMgYmVmb3JlCisJICogaW5jcmVhc2luZyB0aGUgZ3JvdXAgY291bnQgc28gdGhhdCBvbmNlIHRoZSBncm91cCBpcyBlbmFibGVkLAorCSAqIGFsbCBvZiBpdHMgYmxvY2tzIGFuZCBpbm9kZXMgYXJlIGFscmVhZHkgdmFsaWQuCisJICoKKwkgKiBXZSBhbHdheXMgYWxsb2NhdGUgZ3JvdXAtYnktZ3JvdXAsIHRoZW4gYmxvY2stYnktYmxvY2sgb3IKKwkgKiBpbm9kZS1ieS1pbm9kZSB3aXRoaW4gYSBncm91cCwgc28gZW5hYmxpbmcgdGhlc2UKKwkgKiBibG9ja3MvaW5vZGVzIGJlZm9yZSB0aGUgZ3JvdXAgaXMgbGl2ZSB3b24ndCBhY3R1YWxseSBsZXQgdXMKKwkgKiBhbGxvY2F0ZSB0aGUgbmV3IHNwYWNlIHlldC4KKwkgKi8KKwlleHQ0X2Jsb2Nrc19jb3VudF9zZXQoZXMsIGV4dDRfYmxvY2tzX2NvdW50KGVzKSArCisJCWlucHV0LT5ibG9ja3NfY291bnQpOworCWVzLT5zX2lub2Rlc19jb3VudCA9IGNwdV90b19sZTMyKGxlMzJfdG9fY3B1KGVzLT5zX2lub2Rlc19jb3VudCkgKworCQlFWFQ0X0lOT0RFU19QRVJfR1JPVVAoc2IpKTsKKworCS8qCisJICogV2UgbmVlZCB0byBwcm90ZWN0IHNfZ3JvdXBzX2NvdW50IGFnYWluc3Qgb3RoZXIgQ1BVcyBzZWVpbmcKKwkgKiBpbmNvbnNpc3RlbnQgc3RhdGUgaW4gdGhlIHN1cGVyYmxvY2suCisJICoKKwkgKiBUaGUgcHJlY2lzZSBydWxlcyB3ZSB1c2UgYXJlOgorCSAqCisJICogKiBXcml0ZXJzIG9mIHNfZ3JvdXBzX2NvdW50ICptdXN0KiBob2xkIGxvY2tfc3VwZXIKKwkgKiBBTkQKKwkgKiAqIFdyaXRlcnMgbXVzdCBwZXJmb3JtIGEgc21wX3dtYigpIGFmdGVyIHVwZGF0aW5nIGFsbCBkZXBlbmRlbnQKKwkgKiAgIGRhdGEgYW5kIGJlZm9yZSBtb2RpZnlpbmcgdGhlIGdyb3VwcyBjb3VudAorCSAqCisJICogKiBSZWFkZXJzIG11c3QgaG9sZCBsb2NrX3N1cGVyKCkgb3ZlciB0aGUgYWNjZXNzCisJICogT1IKKwkgKiAqIFJlYWRlcnMgbXVzdCBwZXJmb3JtIGFuIHNtcF9ybWIoKSBhZnRlciByZWFkaW5nIHRoZSBncm91cHMgY291bnQKKwkgKiAgIGFuZCBiZWZvcmUgcmVhZGluZyBhbnkgZGVwZW5kZW50IGRhdGEuCisJICoKKwkgKiBOQi4gVGhlc2UgcnVsZXMgY2FuIGJlIHJlbGF4ZWQgd2hlbiBjaGVja2luZyB0aGUgZ3JvdXAgY291bnQKKwkgKiB3aGlsZSBmcmVlaW5nIGRhdGEsIGFzIHdlIGNhbiBvbmx5IGFsbG9jYXRlIGZyb20gYSBibG9jaworCSAqIGdyb3VwIGFmdGVyIHNlcmlhbGlzaW5nIGFnYWluc3QgdGhlIGdyb3VwIGNvdW50LCBhbmQgd2UgY2FuCisJICogb25seSB0aGVuIGZyZWUgYWZ0ZXIgc2VyaWFsaXNpbmcgaW4gdHVybiBhZ2FpbnN0IHRoYXQKKwkgKiBhbGxvY2F0aW9uLgorCSAqLworCXNtcF93bWIoKTsKKworCS8qIFVwZGF0ZSB0aGUgZ2xvYmFsIGZzIHNpemUgZmllbGRzICovCisJc2JpLT5zX2dyb3Vwc19jb3VudCsrOworCisJZXh0NF9qb3VybmFsX2RpcnR5X21ldGFkYXRhKGhhbmRsZSwgcHJpbWFyeSk7CisKKwkvKiBVcGRhdGUgdGhlIHJlc2VydmVkIGJsb2NrIGNvdW50cyBvbmx5IG9uY2UgdGhlIG5ldyBncm91cCBpcworCSAqIGFjdGl2ZS4gKi8KKwlleHQ0X3JfYmxvY2tzX2NvdW50X3NldChlcywgZXh0NF9yX2Jsb2Nrc19jb3VudChlcykgKworCQlpbnB1dC0+cmVzZXJ2ZWRfYmxvY2tzKTsKKworCS8qIFVwZGF0ZSB0aGUgZnJlZSBzcGFjZSBjb3VudHMgKi8KKwlwZXJjcHVfY291bnRlcl9tb2QoJnNiaS0+c19mcmVlYmxvY2tzX2NvdW50ZXIsCisJCQkgICBpbnB1dC0+ZnJlZV9ibG9ja3NfY291bnQpOworCXBlcmNwdV9jb3VudGVyX21vZCgmc2JpLT5zX2ZyZWVpbm9kZXNfY291bnRlciwKKwkJCSAgIEVYVDRfSU5PREVTX1BFUl9HUk9VUChzYikpOworCisJZXh0NF9qb3VybmFsX2RpcnR5X21ldGFkYXRhKGhhbmRsZSwgc2JpLT5zX3NiaCk7CisJc2ItPnNfZGlydCA9IDE7CisKK2V4aXRfam91cm5hbDoKKwl1bmxvY2tfc3VwZXIoc2IpOworCWlmICgoZXJyMiA9IGV4dDRfam91cm5hbF9zdG9wKGhhbmRsZSkpICYmICFlcnIpCisJCWVyciA9IGVycjI7CisJaWYgKCFlcnIpIHsKKwkJdXBkYXRlX2JhY2t1cHMoc2IsIHNiaS0+c19zYmgtPmJfYmxvY2tuciwgKGNoYXIgKillcywKKwkJCSAgICAgICBzaXplb2Yoc3RydWN0IGV4dDRfc3VwZXJfYmxvY2spKTsKKwkJdXBkYXRlX2JhY2t1cHMoc2IsIHByaW1hcnktPmJfYmxvY2tuciwgcHJpbWFyeS0+Yl9kYXRhLAorCQkJICAgICAgIHByaW1hcnktPmJfc2l6ZSk7CisJfQorZXhpdF9wdXQ6CisJaXB1dChpbm9kZSk7CisJcmV0dXJuIGVycjsKK30gLyogZXh0NF9ncm91cF9hZGQgKi8KKworLyogRXh0ZW5kIHRoZSBmaWxlc3lzdGVtIHRvIHRoZSBuZXcgbnVtYmVyIG9mIGJsb2NrcyBzcGVjaWZpZWQuICBUaGlzIGVudHJ5CisgKiBwb2ludCBpcyBvbmx5IHVzZWQgdG8gZXh0ZW5kIHRoZSBjdXJyZW50IGZpbGVzeXN0ZW0gdG8gdGhlIGVuZCBvZiB0aGUgbGFzdAorICogZXhpc3RpbmcgZ3JvdXAuICBJdCBjYW4gYmUgYWNjZXNzZWQgdmlhIGlvY3RsLCBvciBieSAicmVtb3VudCxyZXNpemU9PHNpemU+IgorICogZm9yIGVtZXJnZW5jaWVzIChiZWNhdXNlIGl0IGhhcyBubyBkZXBlbmRlbmNpZXMgb24gcmVzZXJ2ZWQgYmxvY2tzKS4KKyAqCisgKiBJZiB3ZSBfcmVhbGx5XyB3YW50ZWQsIHdlIGNvdWxkIHVzZSBkZWZhdWx0IHZhbHVlcyB0byBjYWxsIGV4dDRfZ3JvdXBfYWRkKCkKKyAqIGFsbG93IHRoZSAicmVtb3VudCIgdHJpY2sgdG8gd29yayBmb3IgYXJiaXRyYXJ5IHJlc2l6aW5nLCBhc3N1bWluZyBlbm91Z2gKKyAqIEdEVCBibG9ja3MgYXJlIHJlc2VydmVkIHRvIGdyb3cgdG8gdGhlIGRlc2lyZWQgc2l6ZS4KKyAqLworaW50IGV4dDRfZ3JvdXBfZXh0ZW5kKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHN0cnVjdCBleHQ0X3N1cGVyX2Jsb2NrICplcywKKwkJICAgICAgZXh0NF9mc2Jsa190IG5fYmxvY2tzX2NvdW50KQoreworCWV4dDRfZnNibGtfdCBvX2Jsb2Nrc19jb3VudDsKKwl1bnNpZ25lZCBsb25nIG9fZ3JvdXBzX2NvdW50OworCWV4dDRfZ3JwYmxrX3QgbGFzdDsKKwlleHQ0X2dycGJsa190IGFkZDsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKiBiaDsKKwloYW5kbGVfdCAqaGFuZGxlOworCWludCBlcnI7CisJdW5zaWduZWQgbG9uZyBmcmVlZF9ibG9ja3M7CisKKwkvKiBXZSBkb24ndCBuZWVkIHRvIHdvcnJ5IGFib3V0IGxvY2tpbmcgd3J0IG90aGVyIHJlc2l6ZXJzIGp1c3QKKwkgKiB5ZXQ6IHdlJ3JlIGdvaW5nIHRvIHJldmFsaWRhdGUgZXMtPnNfYmxvY2tzX2NvdW50IGFmdGVyCisJICogdGFraW5nIGxvY2tfc3VwZXIoKSBiZWxvdy4gKi8KKwlvX2Jsb2Nrc19jb3VudCA9IGV4dDRfYmxvY2tzX2NvdW50KGVzKTsKKwlvX2dyb3Vwc19jb3VudCA9IEVYVDRfU0Ioc2IpLT5zX2dyb3Vwc19jb3VudDsKKworCWlmICh0ZXN0X29wdChzYiwgREVCVUcpKQorCQlwcmludGsoS0VSTl9ERUJVRyAiRVhUNC1mczogZXh0ZW5kaW5nIGxhc3QgZ3JvdXAgZnJvbSAlbGx1IHV0byAlbGx1IGJsb2Nrc1xuIiwKKwkJICAgICAgIG9fYmxvY2tzX2NvdW50LCBuX2Jsb2Nrc19jb3VudCk7CisKKwlpZiAobl9ibG9ja3NfY291bnQgPT0gMCB8fCBuX2Jsb2Nrc19jb3VudCA9PSBvX2Jsb2Nrc19jb3VudCkKKwkJcmV0dXJuIDA7CisKKwlpZiAobl9ibG9ja3NfY291bnQgPiAoc2VjdG9yX3QpKH4wVUxMKSA+PiAoc2ItPnNfYmxvY2tzaXplX2JpdHMgLSA5KSkgeworCQlwcmludGsoS0VSTl9FUlIgIkVYVDQtZnM6IGZpbGVzeXN0ZW0gb24gJXM6IgorCQkJIiB0b28gbGFyZ2UgdG8gcmVzaXplIHRvICVsbHUgYmxvY2tzIHNhZmVseVxuIiwKKwkJCXNiLT5zX2lkLCBuX2Jsb2Nrc19jb3VudCk7CisJCWlmIChzaXplb2Yoc2VjdG9yX3QpIDwgOCkKKwkJCWV4dDRfd2FybmluZyhzYiwgX19GVU5DVElPTl9fLAorCQkJIkNPTkZJR19MQkQgbm90IGVuYWJsZWRcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAobl9ibG9ja3NfY291bnQgPCBvX2Jsb2Nrc19jb3VudCkgeworCQlleHQ0X3dhcm5pbmcoc2IsIF9fRlVOQ1RJT05fXywKKwkJCSAgICAgImNhbid0IHNocmluayBGUyAtIHJlc2l6ZSBhYm9ydGVkIik7CisJCXJldHVybiAtRUJVU1k7CisJfQorCisJLyogSGFuZGxlIHRoZSByZW1haW5pbmcgYmxvY2tzIGluIHRoZSBsYXN0IGdyb3VwIG9ubHkuICovCisJZXh0NF9nZXRfZ3JvdXBfbm9fYW5kX29mZnNldChzYiwgb19ibG9ja3NfY291bnQsIE5VTEwsICZsYXN0KTsKKworCWlmIChsYXN0ID09IDApIHsKKwkJZXh0NF93YXJuaW5nKHNiLCBfX0ZVTkNUSU9OX18sCisJCQkgICAgICJuZWVkIHRvIHVzZSBleHQyb25saW5lIHRvIHJlc2l6ZSBmdXJ0aGVyIik7CisJCXJldHVybiAtRVBFUk07CisJfQorCisJYWRkID0gRVhUNF9CTE9DS1NfUEVSX0dST1VQKHNiKSAtIGxhc3Q7CisKKwlpZiAob19ibG9ja3NfY291bnQgKyBhZGQgPCBvX2Jsb2Nrc19jb3VudCkgeworCQlleHQ0X3dhcm5pbmcoc2IsIF9fRlVOQ1RJT05fXywgImJsb2Nrc19jb3VudCBvdmVyZmxvdyIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAob19ibG9ja3NfY291bnQgKyBhZGQgPiBuX2Jsb2Nrc19jb3VudCkKKwkJYWRkID0gbl9ibG9ja3NfY291bnQgLSBvX2Jsb2Nrc19jb3VudDsKKworCWlmIChvX2Jsb2Nrc19jb3VudCArIGFkZCA8IG5fYmxvY2tzX2NvdW50KQorCQlleHQ0X3dhcm5pbmcoc2IsIF9fRlVOQ1RJT05fXywKKwkJCSAgICAgIndpbGwgb25seSBmaW5pc2ggZ3JvdXAgKCVsbHUiCisJCQkgICAgICIgYmxvY2tzLCAldSBuZXcpIiwKKwkJCSAgICAgb19ibG9ja3NfY291bnQgKyBhZGQsIGFkZCk7CisKKwkvKiBTZWUgaWYgdGhlIGRldmljZSBpcyBhY3R1YWxseSBhcyBiaWcgYXMgd2hhdCB3YXMgcmVxdWVzdGVkICovCisJYmggPSBzYl9icmVhZChzYiwgb19ibG9ja3NfY291bnQgKyBhZGQgLTEpOworCWlmICghYmgpIHsKKwkJZXh0NF93YXJuaW5nKHNiLCBfX0ZVTkNUSU9OX18sCisJCQkgICAgICJjYW4ndCByZWFkIGxhc3QgYmxvY2ssIHJlc2l6ZSBhYm9ydGVkIik7CisJCXJldHVybiAtRU5PU1BDOworCX0KKwlicmVsc2UoYmgpOworCisJLyogV2Ugd2lsbCB1cGRhdGUgdGhlIHN1cGVyYmxvY2ssIG9uZSBibG9jayBiaXRtYXAsIGFuZAorCSAqIG9uZSBncm91cCBkZXNjcmlwdG9yIHZpYSBleHQ0X2ZyZWVfYmxvY2tzKCkuCisJICovCisJaGFuZGxlID0gZXh0NF9qb3VybmFsX3N0YXJ0X3NiKHNiLCAzKTsKKwlpZiAoSVNfRVJSKGhhbmRsZSkpIHsKKwkJZXJyID0gUFRSX0VSUihoYW5kbGUpOworCQlleHQ0X3dhcm5pbmcoc2IsIF9fRlVOQ1RJT05fXywgImVycm9yICVkIG9uIGpvdXJuYWwgc3RhcnQiLGVycik7CisJCWdvdG8gZXhpdF9wdXQ7CisJfQorCisJbG9ja19zdXBlcihzYik7CisJaWYgKG9fYmxvY2tzX2NvdW50ICE9IGV4dDRfYmxvY2tzX2NvdW50KGVzKSkgeworCQlleHQ0X3dhcm5pbmcoc2IsIF9fRlVOQ1RJT05fXywKKwkJCSAgICAgIm11bHRpcGxlIHJlc2l6ZXJzIHJ1biBvbiBmaWxlc3lzdGVtISIpOworCQl1bmxvY2tfc3VwZXIoc2IpOworCQllcnIgPSAtRUJVU1k7CisJCWdvdG8gZXhpdF9wdXQ7CisJfQorCisJaWYgKChlcnIgPSBleHQ0X2pvdXJuYWxfZ2V0X3dyaXRlX2FjY2VzcyhoYW5kbGUsCisJCQkJCQkgRVhUNF9TQihzYiktPnNfc2JoKSkpIHsKKwkJZXh0NF93YXJuaW5nKHNiLCBfX0ZVTkNUSU9OX18sCisJCQkgICAgICJlcnJvciAlZCBvbiBqb3VybmFsIHdyaXRlIGFjY2VzcyIsIGVycik7CisJCXVubG9ja19zdXBlcihzYik7CisJCWV4dDRfam91cm5hbF9zdG9wKGhhbmRsZSk7CisJCWdvdG8gZXhpdF9wdXQ7CisJfQorCWV4dDRfYmxvY2tzX2NvdW50X3NldChlcywgb19ibG9ja3NfY291bnQgKyBhZGQpOworCWV4dDRfam91cm5hbF9kaXJ0eV9tZXRhZGF0YShoYW5kbGUsIEVYVDRfU0Ioc2IpLT5zX3NiaCk7CisJc2ItPnNfZGlydCA9IDE7CisJdW5sb2NrX3N1cGVyKHNiKTsKKwlleHQ0X2RlYnVnKCJmcmVlaW5nIGJsb2NrcyAlbHUgdGhyb3VnaCAlbGx1XG4iLCBvX2Jsb2Nrc19jb3VudCwKKwkJICAgb19ibG9ja3NfY291bnQgKyBhZGQpOworCWV4dDRfZnJlZV9ibG9ja3Nfc2IoaGFuZGxlLCBzYiwgb19ibG9ja3NfY291bnQsIGFkZCwgJmZyZWVkX2Jsb2Nrcyk7CisJZXh0NF9kZWJ1ZygiZnJlZWQgYmxvY2tzICVsbHUgdGhyb3VnaCAlbGx1XG4iLCBvX2Jsb2Nrc19jb3VudCwKKwkJICAgb19ibG9ja3NfY291bnQgKyBhZGQpOworCWlmICgoZXJyID0gZXh0NF9qb3VybmFsX3N0b3AoaGFuZGxlKSkpCisJCWdvdG8gZXhpdF9wdXQ7CisJaWYgKHRlc3Rfb3B0KHNiLCBERUJVRykpCisJCXByaW50ayhLRVJOX0RFQlVHICJFWFQ0LWZzOiBleHRlbmRlZCBncm91cCB0byAlbGx1IGJsb2Nrc1xuIiwKKwkJICAgICAgIGV4dDRfYmxvY2tzX2NvdW50KGVzKSk7CisJdXBkYXRlX2JhY2t1cHMoc2IsIEVYVDRfU0Ioc2IpLT5zX3NiaC0+Yl9ibG9ja25yLCAoY2hhciAqKWVzLAorCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBleHQ0X3N1cGVyX2Jsb2NrKSk7CitleGl0X3B1dDoKKwlyZXR1cm4gZXJyOworfSAvKiBleHQ0X2dyb3VwX2V4dGVuZCAqLwpkaWZmIC0tZ2l0IGEvZnMvZXh0NC9zdXBlci5jIGIvZnMvZXh0NC9zdXBlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI0YjAyMmEKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9leHQ0L3N1cGVyLmMKQEAgLTAsMCArMSwyODI5IEBACisvKgorICogIGxpbnV4L2ZzL2V4dDQvc3VwZXIuYworICoKKyAqIENvcHlyaWdodCAoQykgMTk5MiwgMTk5MywgMTk5NCwgMTk5NQorICogUmVteSBDYXJkIChjYXJkQG1hc2kuaWJwLmZyKQorICogTGFib3JhdG9pcmUgTUFTSSAtIEluc3RpdHV0IEJsYWlzZSBQYXNjYWwKKyAqIFVuaXZlcnNpdGUgUGllcnJlIGV0IE1hcmllIEN1cmllIChQYXJpcyBWSSkKKyAqCisgKiAgZnJvbQorICoKKyAqICBsaW51eC9mcy9taW5peC9pbm9kZS5jCisgKgorICogIENvcHlyaWdodCAoQykgMTk5MSwgMTk5MiAgTGludXMgVG9ydmFsZHMKKyAqCisgKiAgQmlnLWVuZGlhbiB0byBsaXR0bGUtZW5kaWFuIGJ5dGUtc3dhcHBpbmcvYml0bWFwcyBieQorICogICAgICAgIERhdmlkIFMuIE1pbGxlciAoZGF2ZW1AY2FpcC5ydXRnZXJzLmVkdSksIDE5OTUKKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lLmg+CisjaW5jbHVkZSA8bGludXgvamJkMi5oPgorI2luY2x1ZGUgPGxpbnV4L2V4dDRfZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9leHQ0X2piZDIuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2Jsa2Rldi5oPgorI2luY2x1ZGUgPGxpbnV4L3BhcnNlci5oPgorI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvYnVmZmVyX2hlYWQuaD4KKyNpbmNsdWRlIDxsaW51eC92ZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9yYW5kb20uaD4KKyNpbmNsdWRlIDxsaW51eC9tb3VudC5oPgorI2luY2x1ZGUgPGxpbnV4L25hbWVpLmg+CisjaW5jbHVkZSA8bGludXgvcXVvdGFvcHMuaD4KKyNpbmNsdWRlIDxsaW51eC9zZXFfZmlsZS5oPgorCisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKworI2luY2x1ZGUgInhhdHRyLmgiCisjaW5jbHVkZSAiYWNsLmgiCisjaW5jbHVkZSAibmFtZWkuaCIKKworc3RhdGljIGludCBleHQ0X2xvYWRfam91cm5hbChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiwgc3RydWN0IGV4dDRfc3VwZXJfYmxvY2sgKiwKKwkJCSAgICAgdW5zaWduZWQgbG9uZyBqb3VybmFsX2Rldm51bSk7CitzdGF0aWMgaW50IGV4dDRfY3JlYXRlX2pvdXJuYWwoc3RydWN0IHN1cGVyX2Jsb2NrICosIHN0cnVjdCBleHQ0X3N1cGVyX2Jsb2NrICosCisJCQkgICAgICAgdW5zaWduZWQgaW50KTsKK3N0YXRpYyB2b2lkIGV4dDRfY29tbWl0X3N1cGVyIChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiBzYiwKKwkJCSAgICAgICBzdHJ1Y3QgZXh0NF9zdXBlcl9ibG9jayAqIGVzLAorCQkJICAgICAgIGludCBzeW5jKTsKK3N0YXRpYyB2b2lkIGV4dDRfbWFya19yZWNvdmVyeV9jb21wbGV0ZShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiBzYiwKKwkJCQkJc3RydWN0IGV4dDRfc3VwZXJfYmxvY2sgKiBlcyk7CitzdGF0aWMgdm9pZCBleHQ0X2NsZWFyX2pvdXJuYWxfZXJyKHN0cnVjdCBzdXBlcl9ibG9jayAqIHNiLAorCQkJCSAgIHN0cnVjdCBleHQ0X3N1cGVyX2Jsb2NrICogZXMpOworc3RhdGljIGludCBleHQ0X3N5bmNfZnMoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgaW50IHdhaXQpOworc3RhdGljIGNvbnN0IGNoYXIgKmV4dDRfZGVjb2RlX2Vycm9yKHN0cnVjdCBzdXBlcl9ibG9jayAqIHNiLCBpbnQgZXJybm8sCisJCQkJICAgICBjaGFyIG5idWZbMTZdKTsKK3N0YXRpYyBpbnQgZXh0NF9yZW1vdW50IChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiBzYiwgaW50ICogZmxhZ3MsIGNoYXIgKiBkYXRhKTsKK3N0YXRpYyBpbnQgZXh0NF9zdGF0ZnMgKHN0cnVjdCBkZW50cnkgKiBkZW50cnksIHN0cnVjdCBrc3RhdGZzICogYnVmKTsKK3N0YXRpYyB2b2lkIGV4dDRfdW5sb2NrZnMoc3RydWN0IHN1cGVyX2Jsb2NrICpzYik7CitzdGF0aWMgdm9pZCBleHQ0X3dyaXRlX3N1cGVyIChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiBzYik7CitzdGF0aWMgdm9pZCBleHQ0X3dyaXRlX3N1cGVyX2xvY2tmcyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKTsKKworCitleHQ0X2ZzYmxrX3QgZXh0NF9ibG9ja19iaXRtYXAoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwKKwkJCSAgICAgICBzdHJ1Y3QgZXh0NF9ncm91cF9kZXNjICpiZykKK3sKKwlyZXR1cm4gbGUzMl90b19jcHUoYmctPmJnX2Jsb2NrX2JpdG1hcCkgfAorCQkoRVhUNF9ERVNDX1NJWkUoc2IpID49IEVYVDRfTUlOX0RFU0NfU0laRV82NEJJVCA/CisJCSAoZXh0NF9mc2Jsa190KWxlMzJfdG9fY3B1KGJnLT5iZ19ibG9ja19iaXRtYXBfaGkpIDw8IDMyIDogMCk7Cit9CisKK2V4dDRfZnNibGtfdCBleHQ0X2lub2RlX2JpdG1hcChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLAorCQkJICAgICAgIHN0cnVjdCBleHQ0X2dyb3VwX2Rlc2MgKmJnKQoreworCXJldHVybiBsZTMyX3RvX2NwdShiZy0+YmdfaW5vZGVfYml0bWFwKSB8CisJCShFWFQ0X0RFU0NfU0laRShzYikgPj0gRVhUNF9NSU5fREVTQ19TSVpFXzY0QklUID8KKwkJIChleHQ0X2ZzYmxrX3QpbGUzMl90b19jcHUoYmctPmJnX2lub2RlX2JpdG1hcF9oaSkgPDwgMzIgOiAwKTsKK30KKworZXh0NF9mc2Jsa190IGV4dDRfaW5vZGVfdGFibGUoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwKKwkJCSAgICAgIHN0cnVjdCBleHQ0X2dyb3VwX2Rlc2MgKmJnKQoreworCXJldHVybiBsZTMyX3RvX2NwdShiZy0+YmdfaW5vZGVfdGFibGUpIHwKKwkJKEVYVDRfREVTQ19TSVpFKHNiKSA+PSBFWFQ0X01JTl9ERVNDX1NJWkVfNjRCSVQgPworCQkgKGV4dDRfZnNibGtfdClsZTMyX3RvX2NwdShiZy0+YmdfaW5vZGVfdGFibGVfaGkpIDw8IDMyIDogMCk7Cit9CisKK3ZvaWQgZXh0NF9ibG9ja19iaXRtYXBfc2V0KHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsCisJCQkgICBzdHJ1Y3QgZXh0NF9ncm91cF9kZXNjICpiZywgZXh0NF9mc2Jsa190IGJsaykKK3sKKwliZy0+YmdfYmxvY2tfYml0bWFwID0gY3B1X3RvX2xlMzIoKHUzMilibGspOworCWlmIChFWFQ0X0RFU0NfU0laRShzYikgPj0gRVhUNF9NSU5fREVTQ19TSVpFXzY0QklUKQorCQliZy0+YmdfYmxvY2tfYml0bWFwX2hpID0gY3B1X3RvX2xlMzIoYmxrID4+IDMyKTsKK30KKwordm9pZCBleHQ0X2lub2RlX2JpdG1hcF9zZXQoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwKKwkJCSAgIHN0cnVjdCBleHQ0X2dyb3VwX2Rlc2MgKmJnLCBleHQ0X2ZzYmxrX3QgYmxrKQoreworCWJnLT5iZ19pbm9kZV9iaXRtYXAgID0gY3B1X3RvX2xlMzIoKHUzMilibGspOworCWlmIChFWFQ0X0RFU0NfU0laRShzYikgPj0gRVhUNF9NSU5fREVTQ19TSVpFXzY0QklUKQorCQliZy0+YmdfaW5vZGVfYml0bWFwX2hpID0gY3B1X3RvX2xlMzIoYmxrID4+IDMyKTsKK30KKwordm9pZCBleHQ0X2lub2RlX3RhYmxlX3NldChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLAorCQkJICBzdHJ1Y3QgZXh0NF9ncm91cF9kZXNjICpiZywgZXh0NF9mc2Jsa190IGJsaykKK3sKKwliZy0+YmdfaW5vZGVfdGFibGUgPSBjcHVfdG9fbGUzMigodTMyKWJsayk7CisJaWYgKEVYVDRfREVTQ19TSVpFKHNiKSA+PSBFWFQ0X01JTl9ERVNDX1NJWkVfNjRCSVQpCisJCWJnLT5iZ19pbm9kZV90YWJsZV9oaSA9IGNwdV90b19sZTMyKGJsayA+PiAzMik7Cit9CisKKy8qCisgKiBXcmFwcGVycyBmb3IgamJkMl9qb3VybmFsX3N0YXJ0L2VuZC4KKyAqCisgKiBUaGUgb25seSBzcGVjaWFsIHRoaW5nIHdlIG5lZWQgdG8gZG8gaGVyZSBpcyB0byBtYWtlIHN1cmUgdGhhdCBhbGwKKyAqIGpvdXJuYWxfZW5kIGNhbGxzIHJlc3VsdCBpbiB0aGUgc3VwZXJibG9jayBiZWluZyBtYXJrZWQgZGlydHksIHNvCisgKiB0aGF0IHN5bmMoKSB3aWxsIGNhbGwgdGhlIGZpbGVzeXN0ZW0ncyB3cml0ZV9zdXBlciBjYWxsYmFjayBpZgorICogYXBwcm9wcmlhdGUuCisgKi8KK2hhbmRsZV90ICpleHQ0X2pvdXJuYWxfc3RhcnRfc2Ioc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgaW50IG5ibG9ja3MpCit7CisJam91cm5hbF90ICpqb3VybmFsOworCisJaWYgKHNiLT5zX2ZsYWdzICYgTVNfUkRPTkxZKQorCQlyZXR1cm4gRVJSX1BUUigtRVJPRlMpOworCisJLyogU3BlY2lhbCBjYXNlIGhlcmU6IGlmIHRoZSBqb3VybmFsIGhhcyBhYm9ydGVkIGJlaGluZCBvdXIKKwkgKiBiYWNrcyAoZWcuIEVJTyBpbiB0aGUgY29tbWl0IHRocmVhZCksIHRoZW4gd2Ugc3RpbGwgbmVlZCB0bworCSAqIHRha2UgdGhlIEZTIGl0c2VsZiByZWFkb25seSBjbGVhbmx5LiAqLworCWpvdXJuYWwgPSBFWFQ0X1NCKHNiKS0+c19qb3VybmFsOworCWlmIChpc19qb3VybmFsX2Fib3J0ZWQoam91cm5hbCkpIHsKKwkJZXh0NF9hYm9ydChzYiwgX19GVU5DVElPTl9fLAorCQkJICAgIkRldGVjdGVkIGFib3J0ZWQgam91cm5hbCIpOworCQlyZXR1cm4gRVJSX1BUUigtRVJPRlMpOworCX0KKworCXJldHVybiBqYmQyX2pvdXJuYWxfc3RhcnQoam91cm5hbCwgbmJsb2Nrcyk7Cit9CisKKy8qCisgKiBUaGUgb25seSBzcGVjaWFsIHRoaW5nIHdlIG5lZWQgdG8gZG8gaGVyZSBpcyB0byBtYWtlIHN1cmUgdGhhdCBhbGwKKyAqIGpiZDJfam91cm5hbF9zdG9wIGNhbGxzIHJlc3VsdCBpbiB0aGUgc3VwZXJibG9jayBiZWluZyBtYXJrZWQgZGlydHksIHNvCisgKiB0aGF0IHN5bmMoKSB3aWxsIGNhbGwgdGhlIGZpbGVzeXN0ZW0ncyB3cml0ZV9zdXBlciBjYWxsYmFjayBpZgorICogYXBwcm9wcmlhdGUuCisgKi8KK2ludCBfX2V4dDRfam91cm5hbF9zdG9wKGNvbnN0IGNoYXIgKndoZXJlLCBoYW5kbGVfdCAqaGFuZGxlKQoreworCXN0cnVjdCBzdXBlcl9ibG9jayAqc2I7CisJaW50IGVycjsKKwlpbnQgcmM7CisKKwlzYiA9IGhhbmRsZS0+aF90cmFuc2FjdGlvbi0+dF9qb3VybmFsLT5qX3ByaXZhdGU7CisJZXJyID0gaGFuZGxlLT5oX2VycjsKKwlyYyA9IGpiZDJfam91cm5hbF9zdG9wKGhhbmRsZSk7CisKKwlpZiAoIWVycikKKwkJZXJyID0gcmM7CisJaWYgKGVycikKKwkJX19leHQ0X3N0ZF9lcnJvcihzYiwgd2hlcmUsIGVycik7CisJcmV0dXJuIGVycjsKK30KKwordm9pZCBleHQ0X2pvdXJuYWxfYWJvcnRfaGFuZGxlKGNvbnN0IGNoYXIgKmNhbGxlciwgY29uc3QgY2hhciAqZXJyX2ZuLAorCQlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoLCBoYW5kbGVfdCAqaGFuZGxlLCBpbnQgZXJyKQoreworCWNoYXIgbmJ1ZlsxNl07CisJY29uc3QgY2hhciAqZXJyc3RyID0gZXh0NF9kZWNvZGVfZXJyb3IoTlVMTCwgZXJyLCBuYnVmKTsKKworCWlmIChiaCkKKwkJQlVGRkVSX1RSQUNFKGJoLCAiYWJvcnQiKTsKKworCWlmICghaGFuZGxlLT5oX2VycikKKwkJaGFuZGxlLT5oX2VyciA9IGVycjsKKworCWlmIChpc19oYW5kbGVfYWJvcnRlZChoYW5kbGUpKQorCQlyZXR1cm47CisKKwlwcmludGsoS0VSTl9FUlIgIiVzOiBhYm9ydGluZyB0cmFuc2FjdGlvbjogJXMgaW4gJXNcbiIsCisJICAgICAgIGNhbGxlciwgZXJyc3RyLCBlcnJfZm4pOworCisJamJkMl9qb3VybmFsX2Fib3J0X2hhbmRsZShoYW5kbGUpOworfQorCisvKiBEZWFsIHdpdGggdGhlIHJlcG9ydGluZyBvZiBmYWlsdXJlIGNvbmRpdGlvbnMgb24gYSBmaWxlc3lzdGVtIHN1Y2ggYXMKKyAqIGluY29uc2lzdGVuY2llcyBkZXRlY3RlZCBvciByZWFkIElPIGZhaWx1cmVzLgorICoKKyAqIE9uIGV4dDIsIHdlIGNhbiBzdG9yZSB0aGUgZXJyb3Igc3RhdGUgb2YgdGhlIGZpbGVzeXN0ZW0gaW4gdGhlCisgKiBzdXBlcmJsb2NrLiAgVGhhdCBpcyBub3QgcG9zc2libGUgb24gZXh0NCwgYmVjYXVzZSB3ZSBtYXkgaGF2ZSBvdGhlcgorICogd3JpdGUgb3JkZXJpbmcgY29uc3RyYWludHMgb24gdGhlIHN1cGVyYmxvY2sgd2hpY2ggcHJldmVudCB1cyBmcm9tCisgKiB3cml0aW5nIGl0IG91dCBzdHJhaWdodCBhd2F5OyBhbmQgZ2l2ZW4gdGhhdCB0aGUgam91cm5hbCBpcyBhYm91dCB0bworICogYmUgYWJvcnRlZCwgd2UgY2FuJ3QgcmVseSBvbiB0aGUgY3VycmVudCwgb3IgZnV0dXJlLCB0cmFuc2FjdGlvbnMgdG8KKyAqIHdyaXRlIG91dCB0aGUgc3VwZXJibG9jayBzYWZlbHkuCisgKgorICogV2UnbGwganVzdCB1c2UgdGhlIGpiZDJfam91cm5hbF9hYm9ydCgpIGVycm9yIGNvZGUgdG8gcmVjb3JkIGFuIGVycm9yIGluCisgKiB0aGUgam91cm5hbCBpbnN0ZWFkLiAgT24gcmVjb3ZlcnksIHRoZSBqb3VybmFsIHdpbGwgY29tcGFpbiBhYm91dAorICogdGhhdCBlcnJvciB1bnRpbCB3ZSd2ZSBub3RlZCBpdCBkb3duIGFuZCBjbGVhcmVkIGl0LgorICovCisKK3N0YXRpYyB2b2lkIGV4dDRfaGFuZGxlX2Vycm9yKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpCit7CisJc3RydWN0IGV4dDRfc3VwZXJfYmxvY2sgKmVzID0gRVhUNF9TQihzYiktPnNfZXM7CisKKwlFWFQ0X1NCKHNiKS0+c19tb3VudF9zdGF0ZSB8PSBFWFQ0X0VSUk9SX0ZTOworCWVzLT5zX3N0YXRlIHw9IGNwdV90b19sZTE2KEVYVDRfRVJST1JfRlMpOworCisJaWYgKHNiLT5zX2ZsYWdzICYgTVNfUkRPTkxZKQorCQlyZXR1cm47CisKKwlpZiAoIXRlc3Rfb3B0IChzYiwgRVJST1JTX0NPTlQpKSB7CisJCWpvdXJuYWxfdCAqam91cm5hbCA9IEVYVDRfU0Ioc2IpLT5zX2pvdXJuYWw7CisKKwkJRVhUNF9TQihzYiktPnNfbW91bnRfb3B0IHw9IEVYVDRfTU9VTlRfQUJPUlQ7CisJCWlmIChqb3VybmFsKQorCQkJamJkMl9qb3VybmFsX2Fib3J0KGpvdXJuYWwsIC1FSU8pOworCX0KKwlpZiAodGVzdF9vcHQgKHNiLCBFUlJPUlNfUk8pKSB7CisJCXByaW50ayAoS0VSTl9DUklUICJSZW1vdW50aW5nIGZpbGVzeXN0ZW0gcmVhZC1vbmx5XG4iKTsKKwkJc2ItPnNfZmxhZ3MgfD0gTVNfUkRPTkxZOworCX0KKwlleHQ0X2NvbW1pdF9zdXBlcihzYiwgZXMsIDEpOworCWlmICh0ZXN0X29wdChzYiwgRVJST1JTX1BBTklDKSkKKwkJcGFuaWMoIkVYVDQtZnMgKGRldmljZSAlcyk6IHBhbmljIGZvcmNlZCBhZnRlciBlcnJvclxuIiwKKwkJCXNiLT5zX2lkKTsKK30KKwordm9pZCBleHQ0X2Vycm9yIChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiBzYiwgY29uc3QgY2hhciAqIGZ1bmN0aW9uLAorCQkgY29uc3QgY2hhciAqIGZtdCwgLi4uKQoreworCXZhX2xpc3QgYXJnczsKKworCXZhX3N0YXJ0KGFyZ3MsIGZtdCk7CisJcHJpbnRrKEtFUk5fQ1JJVCAiRVhUNC1mcyBlcnJvciAoZGV2aWNlICVzKTogJXM6ICIsc2ItPnNfaWQsIGZ1bmN0aW9uKTsKKwl2cHJpbnRrKGZtdCwgYXJncyk7CisJcHJpbnRrKCJcbiIpOworCXZhX2VuZChhcmdzKTsKKworCWV4dDRfaGFuZGxlX2Vycm9yKHNiKTsKK30KKworc3RhdGljIGNvbnN0IGNoYXIgKmV4dDRfZGVjb2RlX2Vycm9yKHN0cnVjdCBzdXBlcl9ibG9jayAqIHNiLCBpbnQgZXJybm8sCisJCQkJICAgICBjaGFyIG5idWZbMTZdKQoreworCWNoYXIgKmVycnN0ciA9IE5VTEw7CisKKwlzd2l0Y2ggKGVycm5vKSB7CisJY2FzZSAtRUlPOgorCQllcnJzdHIgPSAiSU8gZmFpbHVyZSI7CisJCWJyZWFrOworCWNhc2UgLUVOT01FTToKKwkJZXJyc3RyID0gIk91dCBvZiBtZW1vcnkiOworCQlicmVhazsKKwljYXNlIC1FUk9GUzoKKwkJaWYgKCFzYiB8fCBFWFQ0X1NCKHNiKS0+c19qb3VybmFsLT5qX2ZsYWdzICYgSkJEMl9BQk9SVCkKKwkJCWVycnN0ciA9ICJKb3VybmFsIGhhcyBhYm9ydGVkIjsKKwkJZWxzZQorCQkJZXJyc3RyID0gIlJlYWRvbmx5IGZpbGVzeXN0ZW0iOworCQlicmVhazsKKwlkZWZhdWx0OgorCQkvKiBJZiB0aGUgY2FsbGVyIHBhc3NlZCBpbiBhbiBleHRyYSBidWZmZXIgZm9yIHVua25vd24KKwkJICogZXJyb3JzLCB0ZXh0dWFsaXNlIHRoZW0gbm93LiAgRWxzZSB3ZSBqdXN0IHJldHVybgorCQkgKiBOVUxMLiAqLworCQlpZiAobmJ1ZikgeworCQkJLyogQ2hlY2sgZm9yIHRydW5jYXRlZCBlcnJvciBjb2Rlcy4uLiAqLworCQkJaWYgKHNucHJpbnRmKG5idWYsIDE2LCAiZXJyb3IgJWQiLCAtZXJybm8pID49IDApCisJCQkJZXJyc3RyID0gbmJ1ZjsKKwkJfQorCQlicmVhazsKKwl9CisKKwlyZXR1cm4gZXJyc3RyOworfQorCisvKiBfX2V4dDRfc3RkX2Vycm9yIGRlY29kZXMgZXhwZWN0ZWQgZXJyb3JzIGZyb20gam91cm5hbGluZyBmdW5jdGlvbnMKKyAqIGF1dG9tYXRpY2FsbHkgYW5kIGludm9rZXMgdGhlIGFwcHJvcHJpYXRlIGVycm9yIHJlc3BvbnNlLiAgKi8KKwordm9pZCBfX2V4dDRfc3RkX2Vycm9yIChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiBzYiwgY29uc3QgY2hhciAqIGZ1bmN0aW9uLAorCQkgICAgICAgaW50IGVycm5vKQoreworCWNoYXIgbmJ1ZlsxNl07CisJY29uc3QgY2hhciAqZXJyc3RyOworCisJLyogU3BlY2lhbCBjYXNlOiBpZiB0aGUgZXJyb3IgaXMgRVJPRlMsIGFuZCB3ZSdyZSBub3QgYWxyZWFkeQorCSAqIGluc2lkZSBhIHRyYW5zYWN0aW9uLCB0aGVuIHRoZXJlJ3MgcmVhbGx5IG5vIHBvaW50IGluIGxvZ2dpbmcKKwkgKiBhbiBlcnJvci4gKi8KKwlpZiAoZXJybm8gPT0gLUVST0ZTICYmIGpvdXJuYWxfY3VycmVudF9oYW5kbGUoKSA9PSBOVUxMICYmCisJICAgIChzYi0+c19mbGFncyAmIE1TX1JET05MWSkpCisJCXJldHVybjsKKworCWVycnN0ciA9IGV4dDRfZGVjb2RlX2Vycm9yKHNiLCBlcnJubywgbmJ1Zik7CisJcHJpbnRrIChLRVJOX0NSSVQgIkVYVDQtZnMgZXJyb3IgKGRldmljZSAlcykgaW4gJXM6ICVzXG4iLAorCQlzYi0+c19pZCwgZnVuY3Rpb24sIGVycnN0cik7CisKKwlleHQ0X2hhbmRsZV9lcnJvcihzYik7Cit9CisKKy8qCisgKiBleHQ0X2Fib3J0IGlzIGEgbXVjaCBzdHJvbmdlciBmYWlsdXJlIGhhbmRsZXIgdGhhbiBleHQ0X2Vycm9yLiAgVGhlCisgKiBhYm9ydCBmdW5jdGlvbiBtYXkgYmUgdXNlZCB0byBkZWFsIHdpdGggdW5yZWNvdmVyYWJsZSBmYWlsdXJlcyBzdWNoCisgKiBhcyBqb3VybmFsIElPIGVycm9ycyBvciBFTk9NRU0gYXQgYSBjcml0aWNhbCBtb21lbnQgaW4gbG9nIG1hbmFnZW1lbnQuCisgKgorICogV2UgdW5jb25kaXRpb25hbGx5IGZvcmNlIHRoZSBmaWxlc3lzdGVtIGludG8gYW4gQUJPUlR8UkVBRE9OTFkgc3RhdGUsCisgKiB1bmxlc3MgdGhlIGVycm9yIHJlc3BvbnNlIG9uIHRoZSBmcyBoYXMgYmVlbiBzZXQgdG8gcGFuaWMgaW4gd2hpY2gKKyAqIGNhc2Ugd2UgdGFrZSB0aGUgZWFzeSB3YXkgb3V0IGFuZCBwYW5pYyBpbW1lZGlhdGVseS4KKyAqLworCit2b2lkIGV4dDRfYWJvcnQgKHN0cnVjdCBzdXBlcl9ibG9jayAqIHNiLCBjb25zdCBjaGFyICogZnVuY3Rpb24sCisJCSBjb25zdCBjaGFyICogZm10LCAuLi4pCit7CisJdmFfbGlzdCBhcmdzOworCisJcHJpbnRrIChLRVJOX0NSSVQgImV4dDRfYWJvcnQgY2FsbGVkLlxuIik7CisKKwl2YV9zdGFydChhcmdzLCBmbXQpOworCXByaW50ayhLRVJOX0NSSVQgIkVYVDQtZnMgZXJyb3IgKGRldmljZSAlcyk6ICVzOiAiLHNiLT5zX2lkLCBmdW5jdGlvbik7CisJdnByaW50ayhmbXQsIGFyZ3MpOworCXByaW50aygiXG4iKTsKKwl2YV9lbmQoYXJncyk7CisKKwlpZiAodGVzdF9vcHQoc2IsIEVSUk9SU19QQU5JQykpCisJCXBhbmljKCJFWFQ0LWZzIHBhbmljIGZyb20gcHJldmlvdXMgZXJyb3JcbiIpOworCisJaWYgKHNiLT5zX2ZsYWdzICYgTVNfUkRPTkxZKQorCQlyZXR1cm47CisKKwlwcmludGsoS0VSTl9DUklUICJSZW1vdW50aW5nIGZpbGVzeXN0ZW0gcmVhZC1vbmx5XG4iKTsKKwlFWFQ0X1NCKHNiKS0+c19tb3VudF9zdGF0ZSB8PSBFWFQ0X0VSUk9SX0ZTOworCXNiLT5zX2ZsYWdzIHw9IE1TX1JET05MWTsKKwlFWFQ0X1NCKHNiKS0+c19tb3VudF9vcHQgfD0gRVhUNF9NT1VOVF9BQk9SVDsKKwlqYmQyX2pvdXJuYWxfYWJvcnQoRVhUNF9TQihzYiktPnNfam91cm5hbCwgLUVJTyk7Cit9CisKK3ZvaWQgZXh0NF93YXJuaW5nIChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiBzYiwgY29uc3QgY2hhciAqIGZ1bmN0aW9uLAorCQkgICBjb25zdCBjaGFyICogZm10LCAuLi4pCit7CisJdmFfbGlzdCBhcmdzOworCisJdmFfc3RhcnQoYXJncywgZm10KTsKKwlwcmludGsoS0VSTl9XQVJOSU5HICJFWFQ0LWZzIHdhcm5pbmcgKGRldmljZSAlcyk6ICVzOiAiLAorCSAgICAgICBzYi0+c19pZCwgZnVuY3Rpb24pOworCXZwcmludGsoZm10LCBhcmdzKTsKKwlwcmludGsoIlxuIik7CisJdmFfZW5kKGFyZ3MpOworfQorCit2b2lkIGV4dDRfdXBkYXRlX2R5bmFtaWNfcmV2KHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpCit7CisJc3RydWN0IGV4dDRfc3VwZXJfYmxvY2sgKmVzID0gRVhUNF9TQihzYiktPnNfZXM7CisKKwlpZiAobGUzMl90b19jcHUoZXMtPnNfcmV2X2xldmVsKSA+IEVYVDRfR09PRF9PTERfUkVWKQorCQlyZXR1cm47CisKKwlleHQ0X3dhcm5pbmcoc2IsIF9fRlVOQ1RJT05fXywKKwkJICAgICAidXBkYXRpbmcgdG8gcmV2ICVkIGJlY2F1c2Ugb2YgbmV3IGZlYXR1cmUgZmxhZywgIgorCQkgICAgICJydW5uaW5nIGUyZnNjayBpcyByZWNvbW1lbmRlZCIsCisJCSAgICAgRVhUNF9EWU5BTUlDX1JFVik7CisKKwllcy0+c19maXJzdF9pbm8gPSBjcHVfdG9fbGUzMihFWFQ0X0dPT0RfT0xEX0ZJUlNUX0lOTyk7CisJZXMtPnNfaW5vZGVfc2l6ZSA9IGNwdV90b19sZTE2KEVYVDRfR09PRF9PTERfSU5PREVfU0laRSk7CisJZXMtPnNfcmV2X2xldmVsID0gY3B1X3RvX2xlMzIoRVhUNF9EWU5BTUlDX1JFVik7CisJLyogbGVhdmUgZXMtPnNfZmVhdHVyZV8qY29tcGF0IGZsYWdzIGFsb25lICovCisJLyogZXMtPnNfdXVpZCB3aWxsIGJlIHNldCBieSBlMmZzY2sgaWYgZW1wdHkgKi8KKworCS8qCisJICogVGhlIHJlc3Qgb2YgdGhlIHN1cGVyYmxvY2sgZmllbGRzIHNob3VsZCBiZSB6ZXJvLCBhbmQgaWYgbm90IGl0CisJICogbWVhbnMgdGhleSBhcmUgbGlrZWx5IGFscmVhZHkgaW4gdXNlLCBzbyBsZWF2ZSB0aGVtIGFsb25lLiAgV2UKKwkgKiBjYW4gbGVhdmUgaXQgdXAgdG8gZTJmc2NrIHRvIGNsZWFuIHVwIGFueSBpbmNvbnNpc3RlbmNpZXMgdGhlcmUuCisJICovCit9CisKKy8qCisgKiBPcGVuIHRoZSBleHRlcm5hbCBqb3VybmFsIGRldmljZQorICovCitzdGF0aWMgc3RydWN0IGJsb2NrX2RldmljZSAqZXh0NF9ibGtkZXZfZ2V0KGRldl90IGRldikKK3sKKwlzdHJ1Y3QgYmxvY2tfZGV2aWNlICpiZGV2OworCWNoYXIgYltCREVWTkFNRV9TSVpFXTsKKworCWJkZXYgPSBvcGVuX2J5X2Rldm51bShkZXYsIEZNT0RFX1JFQUR8Rk1PREVfV1JJVEUpOworCWlmIChJU19FUlIoYmRldikpCisJCWdvdG8gZmFpbDsKKwlyZXR1cm4gYmRldjsKKworZmFpbDoKKwlwcmludGsoS0VSTl9FUlIgIkVYVDQ6IGZhaWxlZCB0byBvcGVuIGpvdXJuYWwgZGV2aWNlICVzOiAlbGRcbiIsCisJCQlfX2JkZXZuYW1lKGRldiwgYiksIFBUUl9FUlIoYmRldikpOworCXJldHVybiBOVUxMOworfQorCisvKgorICogUmVsZWFzZSB0aGUgam91cm5hbCBkZXZpY2UKKyAqLworc3RhdGljIGludCBleHQ0X2Jsa2Rldl9wdXQoc3RydWN0IGJsb2NrX2RldmljZSAqYmRldikKK3sKKwliZF9yZWxlYXNlKGJkZXYpOworCXJldHVybiBibGtkZXZfcHV0KGJkZXYpOworfQorCitzdGF0aWMgaW50IGV4dDRfYmxrZGV2X3JlbW92ZShzdHJ1Y3QgZXh0NF9zYl9pbmZvICpzYmkpCit7CisJc3RydWN0IGJsb2NrX2RldmljZSAqYmRldjsKKwlpbnQgcmV0ID0gLUVOT0RFVjsKKworCWJkZXYgPSBzYmktPmpvdXJuYWxfYmRldjsKKwlpZiAoYmRldikgeworCQlyZXQgPSBleHQ0X2Jsa2Rldl9wdXQoYmRldik7CisJCXNiaS0+am91cm5hbF9iZGV2ID0gTlVMTDsKKwl9CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGlubGluZSBzdHJ1Y3QgaW5vZGUgKm9ycGhhbl9saXN0X2VudHJ5KHN0cnVjdCBsaXN0X2hlYWQgKmwpCit7CisJcmV0dXJuICZsaXN0X2VudHJ5KGwsIHN0cnVjdCBleHQ0X2lub2RlX2luZm8sIGlfb3JwaGFuKS0+dmZzX2lub2RlOworfQorCitzdGF0aWMgdm9pZCBkdW1wX29ycGhhbl9saXN0KHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHN0cnVjdCBleHQ0X3NiX2luZm8gKnNiaSkKK3sKKwlzdHJ1Y3QgbGlzdF9oZWFkICpsOworCisJcHJpbnRrKEtFUk5fRVJSICJzYiBvcnBoYW4gaGVhZCBpcyAlZFxuIiwKKwkgICAgICAgbGUzMl90b19jcHUoc2JpLT5zX2VzLT5zX2xhc3Rfb3JwaGFuKSk7CisKKwlwcmludGsoS0VSTl9FUlIgInNiX2luZm8gb3JwaGFuIGxpc3Q6XG4iKTsKKwlsaXN0X2Zvcl9lYWNoKGwsICZzYmktPnNfb3JwaGFuKSB7CisJCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBvcnBoYW5fbGlzdF9lbnRyeShsKTsKKwkJcHJpbnRrKEtFUk5fRVJSICIgICIKKwkJICAgICAgICJpbm9kZSAlczolbHUgYXQgJXA6IG1vZGUgJW8sIG5saW5rICVkLCBuZXh0ICVkXG4iLAorCQkgICAgICAgaW5vZGUtPmlfc2ItPnNfaWQsIGlub2RlLT5pX2lubywgaW5vZGUsCisJCSAgICAgICBpbm9kZS0+aV9tb2RlLCBpbm9kZS0+aV9ubGluaywKKwkJICAgICAgIE5FWFRfT1JQSEFOKGlub2RlKSk7CisJfQorfQorCitzdGF0aWMgdm9pZCBleHQ0X3B1dF9zdXBlciAoc3RydWN0IHN1cGVyX2Jsb2NrICogc2IpCit7CisJc3RydWN0IGV4dDRfc2JfaW5mbyAqc2JpID0gRVhUNF9TQihzYik7CisJc3RydWN0IGV4dDRfc3VwZXJfYmxvY2sgKmVzID0gc2JpLT5zX2VzOworCWludCBpOworCisJZXh0NF9leHRfcmVsZWFzZShzYik7CisJZXh0NF94YXR0cl9wdXRfc3VwZXIoc2IpOworCWpiZDJfam91cm5hbF9kZXN0cm95KHNiaS0+c19qb3VybmFsKTsKKwlpZiAoIShzYi0+c19mbGFncyAmIE1TX1JET05MWSkpIHsKKwkJRVhUNF9DTEVBUl9JTkNPTVBBVF9GRUFUVVJFKHNiLCBFWFQ0X0ZFQVRVUkVfSU5DT01QQVRfUkVDT1ZFUik7CisJCWVzLT5zX3N0YXRlID0gY3B1X3RvX2xlMTYoc2JpLT5zX21vdW50X3N0YXRlKTsKKwkJQlVGRkVSX1RSQUNFKHNiaS0+c19zYmgsICJtYXJraW5nIGRpcnR5Iik7CisJCW1hcmtfYnVmZmVyX2RpcnR5KHNiaS0+c19zYmgpOworCQlleHQ0X2NvbW1pdF9zdXBlcihzYiwgZXMsIDEpOworCX0KKworCWZvciAoaSA9IDA7IGkgPCBzYmktPnNfZ2RiX2NvdW50OyBpKyspCisJCWJyZWxzZShzYmktPnNfZ3JvdXBfZGVzY1tpXSk7CisJa2ZyZWUoc2JpLT5zX2dyb3VwX2Rlc2MpOworCXBlcmNwdV9jb3VudGVyX2Rlc3Ryb3koJnNiaS0+c19mcmVlYmxvY2tzX2NvdW50ZXIpOworCXBlcmNwdV9jb3VudGVyX2Rlc3Ryb3koJnNiaS0+c19mcmVlaW5vZGVzX2NvdW50ZXIpOworCXBlcmNwdV9jb3VudGVyX2Rlc3Ryb3koJnNiaS0+c19kaXJzX2NvdW50ZXIpOworCWJyZWxzZShzYmktPnNfc2JoKTsKKyNpZmRlZiBDT05GSUdfUVVPVEEKKwlmb3IgKGkgPSAwOyBpIDwgTUFYUVVPVEFTOyBpKyspCisJCWtmcmVlKHNiaS0+c19xZl9uYW1lc1tpXSk7CisjZW5kaWYKKworCS8qIERlYnVnZ2luZyBjb2RlIGp1c3QgaW4gY2FzZSB0aGUgaW4tbWVtb3J5IGlub2RlIG9ycGhhbiBsaXN0CisJICogaXNuJ3QgZW1wdHkuICBUaGUgb24tZGlzayBvbmUgY2FuIGJlIG5vbi1lbXB0eSBpZiB3ZSd2ZQorCSAqIGRldGVjdGVkIGFuIGVycm9yIGFuZCB0YWtlbiB0aGUgZnMgcmVhZG9ubHksIGJ1dCB0aGUKKwkgKiBpbi1tZW1vcnkgbGlzdCBoYWQgYmV0dGVyIGJlIGNsZWFuIGJ5IHRoaXMgcG9pbnQuICovCisJaWYgKCFsaXN0X2VtcHR5KCZzYmktPnNfb3JwaGFuKSkKKwkJZHVtcF9vcnBoYW5fbGlzdChzYiwgc2JpKTsKKwlKX0FTU0VSVChsaXN0X2VtcHR5KCZzYmktPnNfb3JwaGFuKSk7CisKKwlpbnZhbGlkYXRlX2JkZXYoc2ItPnNfYmRldiwgMCk7CisJaWYgKHNiaS0+am91cm5hbF9iZGV2ICYmIHNiaS0+am91cm5hbF9iZGV2ICE9IHNiLT5zX2JkZXYpIHsKKwkJLyoKKwkJICogSW52YWxpZGF0ZSB0aGUgam91cm5hbCBkZXZpY2UncyBidWZmZXJzLiAgV2UgZG9uJ3Qgd2FudCB0aGVtCisJCSAqIGZsb2F0aW5nIGFib3V0IGluIG1lbW9yeSAtIHRoZSBwaHlzaWNhbCBqb3VybmFsIGRldmljZSBtYXkKKwkJICogaG90c3dhcHBlZCwgYW5kIGl0IGJyZWFrcyB0aGUgYHJvLWFmdGVyJyB0ZXN0aW5nIGNvZGUuCisJCSAqLworCQlzeW5jX2Jsb2NrZGV2KHNiaS0+am91cm5hbF9iZGV2KTsKKwkJaW52YWxpZGF0ZV9iZGV2KHNiaS0+am91cm5hbF9iZGV2LCAwKTsKKwkJZXh0NF9ibGtkZXZfcmVtb3ZlKHNiaSk7CisJfQorCXNiLT5zX2ZzX2luZm8gPSBOVUxMOworCWtmcmVlKHNiaSk7CisJcmV0dXJuOworfQorCitzdGF0aWMga21lbV9jYWNoZV90ICpleHQ0X2lub2RlX2NhY2hlcDsKKworLyoKKyAqIENhbGxlZCBpbnNpZGUgdHJhbnNhY3Rpb24sIHNvIHVzZSBHRlBfTk9GUworICovCitzdGF0aWMgc3RydWN0IGlub2RlICpleHQ0X2FsbG9jX2lub2RlKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpCit7CisJc3RydWN0IGV4dDRfaW5vZGVfaW5mbyAqZWk7CisKKwllaSA9IGttZW1fY2FjaGVfYWxsb2MoZXh0NF9pbm9kZV9jYWNoZXAsIFNMQUJfTk9GUyk7CisJaWYgKCFlaSkKKwkJcmV0dXJuIE5VTEw7CisjaWZkZWYgQ09ORklHX0VYVDRERVZfRlNfUE9TSVhfQUNMCisJZWktPmlfYWNsID0gRVhUNF9BQ0xfTk9UX0NBQ0hFRDsKKwllaS0+aV9kZWZhdWx0X2FjbCA9IEVYVDRfQUNMX05PVF9DQUNIRUQ7CisjZW5kaWYKKwllaS0+aV9ibG9ja19hbGxvY19pbmZvID0gTlVMTDsKKwllaS0+dmZzX2lub2RlLmlfdmVyc2lvbiA9IDE7CisJbWVtc2V0KCZlaS0+aV9jYWNoZWRfZXh0ZW50LCAwLCBzaXplb2Yoc3RydWN0IGV4dDRfZXh0X2NhY2hlKSk7CisJcmV0dXJuICZlaS0+dmZzX2lub2RlOworfQorCitzdGF0aWMgdm9pZCBleHQ0X2Rlc3Ryb3lfaW5vZGUoc3RydWN0IGlub2RlICppbm9kZSkKK3sKKwlrbWVtX2NhY2hlX2ZyZWUoZXh0NF9pbm9kZV9jYWNoZXAsIEVYVDRfSShpbm9kZSkpOworfQorCitzdGF0aWMgdm9pZCBpbml0X29uY2Uodm9pZCAqIGZvbywga21lbV9jYWNoZV90ICogY2FjaGVwLCB1bnNpZ25lZCBsb25nIGZsYWdzKQoreworCXN0cnVjdCBleHQ0X2lub2RlX2luZm8gKmVpID0gKHN0cnVjdCBleHQ0X2lub2RlX2luZm8gKikgZm9vOworCisJaWYgKChmbGFncyAmIChTTEFCX0NUT1JfVkVSSUZZfFNMQUJfQ1RPUl9DT05TVFJVQ1RPUikpID09CisJICAgIFNMQUJfQ1RPUl9DT05TVFJVQ1RPUikgeworCQlJTklUX0xJU1RfSEVBRCgmZWktPmlfb3JwaGFuKTsKKyNpZmRlZiBDT05GSUdfRVhUNERFVl9GU19YQVRUUgorCQlpbml0X3J3c2VtKCZlaS0+eGF0dHJfc2VtKTsKKyNlbmRpZgorCQltdXRleF9pbml0KCZlaS0+dHJ1bmNhdGVfbXV0ZXgpOworCQlpbm9kZV9pbml0X29uY2UoJmVpLT52ZnNfaW5vZGUpOworCX0KK30KKworc3RhdGljIGludCBpbml0X2lub2RlY2FjaGUodm9pZCkKK3sKKwlleHQ0X2lub2RlX2NhY2hlcCA9IGttZW1fY2FjaGVfY3JlYXRlKCJleHQ0X2lub2RlX2NhY2hlIiwKKwkJCQkJICAgICBzaXplb2Yoc3RydWN0IGV4dDRfaW5vZGVfaW5mbyksCisJCQkJCSAgICAgMCwgKFNMQUJfUkVDTEFJTV9BQ0NPVU5UfAorCQkJCQkJU0xBQl9NRU1fU1BSRUFEKSwKKwkJCQkJICAgICBpbml0X29uY2UsIE5VTEwpOworCWlmIChleHQ0X2lub2RlX2NhY2hlcCA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgZGVzdHJveV9pbm9kZWNhY2hlKHZvaWQpCit7CisJa21lbV9jYWNoZV9kZXN0cm95KGV4dDRfaW5vZGVfY2FjaGVwKTsKK30KKworc3RhdGljIHZvaWQgZXh0NF9jbGVhcl9pbm9kZShzdHJ1Y3QgaW5vZGUgKmlub2RlKQoreworCXN0cnVjdCBleHQ0X2Jsb2NrX2FsbG9jX2luZm8gKnJzdiA9IEVYVDRfSShpbm9kZSktPmlfYmxvY2tfYWxsb2NfaW5mbzsKKyNpZmRlZiBDT05GSUdfRVhUNERFVl9GU19QT1NJWF9BQ0wKKwlpZiAoRVhUNF9JKGlub2RlKS0+aV9hY2wgJiYKKwkJCUVYVDRfSShpbm9kZSktPmlfYWNsICE9IEVYVDRfQUNMX05PVF9DQUNIRUQpIHsKKwkJcG9zaXhfYWNsX3JlbGVhc2UoRVhUNF9JKGlub2RlKS0+aV9hY2wpOworCQlFWFQ0X0koaW5vZGUpLT5pX2FjbCA9IEVYVDRfQUNMX05PVF9DQUNIRUQ7CisJfQorCWlmIChFWFQ0X0koaW5vZGUpLT5pX2RlZmF1bHRfYWNsICYmCisJCQlFWFQ0X0koaW5vZGUpLT5pX2RlZmF1bHRfYWNsICE9IEVYVDRfQUNMX05PVF9DQUNIRUQpIHsKKwkJcG9zaXhfYWNsX3JlbGVhc2UoRVhUNF9JKGlub2RlKS0+aV9kZWZhdWx0X2FjbCk7CisJCUVYVDRfSShpbm9kZSktPmlfZGVmYXVsdF9hY2wgPSBFWFQ0X0FDTF9OT1RfQ0FDSEVEOworCX0KKyNlbmRpZgorCWV4dDRfZGlzY2FyZF9yZXNlcnZhdGlvbihpbm9kZSk7CisJRVhUNF9JKGlub2RlKS0+aV9ibG9ja19hbGxvY19pbmZvID0gTlVMTDsKKwlpZiAodW5saWtlbHkocnN2KSkKKwkJa2ZyZWUocnN2KTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGV4dDRfc2hvd19xdW90YV9vcHRpb25zKHN0cnVjdCBzZXFfZmlsZSAqc2VxLCBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKQoreworI2lmIGRlZmluZWQoQ09ORklHX1FVT1RBKQorCXN0cnVjdCBleHQ0X3NiX2luZm8gKnNiaSA9IEVYVDRfU0Ioc2IpOworCisJaWYgKHNiaS0+c19qcXVvdGFfZm10KQorCQlzZXFfcHJpbnRmKHNlcSwgIixqcWZtdD0lcyIsCisJCShzYmktPnNfanF1b3RhX2ZtdCA9PSBRRk1UX1ZGU19PTEQpID8gInZmc29sZCI6ICJ2ZnN2MCIpOworCisJaWYgKHNiaS0+c19xZl9uYW1lc1tVU1JRVU9UQV0pCisJCXNlcV9wcmludGYoc2VxLCAiLHVzcmpxdW90YT0lcyIsIHNiaS0+c19xZl9uYW1lc1tVU1JRVU9UQV0pOworCisJaWYgKHNiaS0+c19xZl9uYW1lc1tHUlBRVU9UQV0pCisJCXNlcV9wcmludGYoc2VxLCAiLGdycGpxdW90YT0lcyIsIHNiaS0+c19xZl9uYW1lc1tHUlBRVU9UQV0pOworCisJaWYgKHNiaS0+c19tb3VudF9vcHQgJiBFWFQ0X01PVU5UX1VTUlFVT1RBKQorCQlzZXFfcHV0cyhzZXEsICIsdXNycXVvdGEiKTsKKworCWlmIChzYmktPnNfbW91bnRfb3B0ICYgRVhUNF9NT1VOVF9HUlBRVU9UQSkKKwkJc2VxX3B1dHMoc2VxLCAiLGdycHF1b3RhIik7CisjZW5kaWYKK30KKworc3RhdGljIGludCBleHQ0X3Nob3dfb3B0aW9ucyhzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgc3RydWN0IHZmc21vdW50ICp2ZnMpCit7CisJc3RydWN0IHN1cGVyX2Jsb2NrICpzYiA9IHZmcy0+bW50X3NiOworCisJaWYgKHRlc3Rfb3B0KHNiLCBEQVRBX0ZMQUdTKSA9PSBFWFQ0X01PVU5UX0pPVVJOQUxfREFUQSkKKwkJc2VxX3B1dHMoc2VxLCAiLGRhdGE9am91cm5hbCIpOworCWVsc2UgaWYgKHRlc3Rfb3B0KHNiLCBEQVRBX0ZMQUdTKSA9PSBFWFQ0X01PVU5UX09SREVSRURfREFUQSkKKwkJc2VxX3B1dHMoc2VxLCAiLGRhdGE9b3JkZXJlZCIpOworCWVsc2UgaWYgKHRlc3Rfb3B0KHNiLCBEQVRBX0ZMQUdTKSA9PSBFWFQ0X01PVU5UX1dSSVRFQkFDS19EQVRBKQorCQlzZXFfcHV0cyhzZXEsICIsZGF0YT13cml0ZWJhY2siKTsKKworCWV4dDRfc2hvd19xdW90YV9vcHRpb25zKHNlcSwgc2IpOworCisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIHN0cnVjdCBkZW50cnkgKmV4dDRfZ2V0X2RlbnRyeShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCB2b2lkICp2b2JqcCkKK3sKKwlfX3UzMiAqb2JqcCA9IHZvYmpwOworCXVuc2lnbmVkIGxvbmcgaW5vID0gb2JqcFswXTsKKwlfX3UzMiBnZW5lcmF0aW9uID0gb2JqcFsxXTsKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlOworCXN0cnVjdCBkZW50cnkgKnJlc3VsdDsKKworCWlmIChpbm8gPCBFWFQ0X0ZJUlNUX0lOTyhzYikgJiYgaW5vICE9IEVYVDRfUk9PVF9JTk8pCisJCXJldHVybiBFUlJfUFRSKC1FU1RBTEUpOworCWlmIChpbm8gPiBsZTMyX3RvX2NwdShFWFQ0X1NCKHNiKS0+c19lcy0+c19pbm9kZXNfY291bnQpKQorCQlyZXR1cm4gRVJSX1BUUigtRVNUQUxFKTsKKworCS8qIGlnZXQgaXNuJ3QgcmVhbGx5IHJpZ2h0IGlmIHRoZSBpbm9kZSBpcyBjdXJyZW50bHkgdW5hbGxvY2F0ZWQhIQorCSAqCisJICogZXh0NF9yZWFkX2lub2RlIHdpbGwgcmV0dXJuIGEgYmFkX2lub2RlIGlmIHRoZSBpbm9kZSBoYWQgYmVlbgorCSAqIGRlbGV0ZWQsIHNvIHdlIHNob3VsZCBiZSBzYWZlLgorCSAqCisJICogQ3VycmVudGx5IHdlIGRvbid0IGtub3cgdGhlIGdlbmVyYXRpb24gZm9yIHBhcmVudCBkaXJlY3RvcnksIHNvCisJICogYSBnZW5lcmF0aW9uIG9mIDAgbWVhbnMgImFjY2VwdCBhbnkiCisJICovCisJaW5vZGUgPSBpZ2V0KHNiLCBpbm8pOworCWlmIChpbm9kZSA9PSBOVUxMKQorCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKKwlpZiAoaXNfYmFkX2lub2RlKGlub2RlKSB8fAorCSAgICAoZ2VuZXJhdGlvbiAmJiBpbm9kZS0+aV9nZW5lcmF0aW9uICE9IGdlbmVyYXRpb24pKSB7CisJCWlwdXQoaW5vZGUpOworCQlyZXR1cm4gRVJSX1BUUigtRVNUQUxFKTsKKwl9CisJLyogbm93IHRvIGZpbmQgYSBkZW50cnkuCisJICogSWYgcG9zc2libGUsIGdldCBhIHdlbGwtY29ubmVjdGVkIG9uZQorCSAqLworCXJlc3VsdCA9IGRfYWxsb2NfYW5vbihpbm9kZSk7CisJaWYgKCFyZXN1bHQpIHsKKwkJaXB1dChpbm9kZSk7CisJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOworCX0KKwlyZXR1cm4gcmVzdWx0OworfQorCisjaWZkZWYgQ09ORklHX1FVT1RBCisjZGVmaW5lIFFUWVBFMk5BTUUodCkgKCh0KT09VVNSUVVPVEE/InVzZXIiOiJncm91cCIpCisjZGVmaW5lIFFUWVBFMk1PUFQob24sIHQpICgodCk9PVVTUlFVT1RBPygob24pIyNVU1JKUVVPVEEpOigob24pIyNHUlBKUVVPVEEpKQorCitzdGF0aWMgaW50IGV4dDRfZHF1b3RfaW5pdGlhbGl6ZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBpbnQgdHlwZSk7CitzdGF0aWMgaW50IGV4dDRfZHF1b3RfZHJvcChzdHJ1Y3QgaW5vZGUgKmlub2RlKTsKK3N0YXRpYyBpbnQgZXh0NF93cml0ZV9kcXVvdChzdHJ1Y3QgZHF1b3QgKmRxdW90KTsKK3N0YXRpYyBpbnQgZXh0NF9hY3F1aXJlX2RxdW90KHN0cnVjdCBkcXVvdCAqZHF1b3QpOworc3RhdGljIGludCBleHQ0X3JlbGVhc2VfZHF1b3Qoc3RydWN0IGRxdW90ICpkcXVvdCk7CitzdGF0aWMgaW50IGV4dDRfbWFya19kcXVvdF9kaXJ0eShzdHJ1Y3QgZHF1b3QgKmRxdW90KTsKK3N0YXRpYyBpbnQgZXh0NF93cml0ZV9pbmZvKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGludCB0eXBlKTsKK3N0YXRpYyBpbnQgZXh0NF9xdW90YV9vbihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBpbnQgdHlwZSwgaW50IGZvcm1hdF9pZCwgY2hhciAqcGF0aCk7CitzdGF0aWMgaW50IGV4dDRfcXVvdGFfb25fbW91bnQoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgaW50IHR5cGUpOworc3RhdGljIHNzaXplX3QgZXh0NF9xdW90YV9yZWFkKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGludCB0eXBlLCBjaGFyICpkYXRhLAorCQkJICAgICAgIHNpemVfdCBsZW4sIGxvZmZfdCBvZmYpOworc3RhdGljIHNzaXplX3QgZXh0NF9xdW90YV93cml0ZShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBpbnQgdHlwZSwKKwkJCQljb25zdCBjaGFyICpkYXRhLCBzaXplX3QgbGVuLCBsb2ZmX3Qgb2ZmKTsKKworc3RhdGljIHN0cnVjdCBkcXVvdF9vcGVyYXRpb25zIGV4dDRfcXVvdGFfb3BlcmF0aW9ucyA9IHsKKwkuaW5pdGlhbGl6ZQk9IGV4dDRfZHF1b3RfaW5pdGlhbGl6ZSwKKwkuZHJvcAkJPSBleHQ0X2RxdW90X2Ryb3AsCisJLmFsbG9jX3NwYWNlCT0gZHF1b3RfYWxsb2Nfc3BhY2UsCisJLmFsbG9jX2lub2RlCT0gZHF1b3RfYWxsb2NfaW5vZGUsCisJLmZyZWVfc3BhY2UJPSBkcXVvdF9mcmVlX3NwYWNlLAorCS5mcmVlX2lub2RlCT0gZHF1b3RfZnJlZV9pbm9kZSwKKwkudHJhbnNmZXIJPSBkcXVvdF90cmFuc2ZlciwKKwkud3JpdGVfZHF1b3QJPSBleHQ0X3dyaXRlX2RxdW90LAorCS5hY3F1aXJlX2RxdW90CT0gZXh0NF9hY3F1aXJlX2RxdW90LAorCS5yZWxlYXNlX2RxdW90CT0gZXh0NF9yZWxlYXNlX2RxdW90LAorCS5tYXJrX2RpcnR5CT0gZXh0NF9tYXJrX2RxdW90X2RpcnR5LAorCS53cml0ZV9pbmZvCT0gZXh0NF93cml0ZV9pbmZvCit9OworCitzdGF0aWMgc3RydWN0IHF1b3RhY3RsX29wcyBleHQ0X3FjdGxfb3BlcmF0aW9ucyA9IHsKKwkucXVvdGFfb24JPSBleHQ0X3F1b3RhX29uLAorCS5xdW90YV9vZmYJPSB2ZnNfcXVvdGFfb2ZmLAorCS5xdW90YV9zeW5jCT0gdmZzX3F1b3RhX3N5bmMsCisJLmdldF9pbmZvCT0gdmZzX2dldF9kcWluZm8sCisJLnNldF9pbmZvCT0gdmZzX3NldF9kcWluZm8sCisJLmdldF9kcWJsawk9IHZmc19nZXRfZHFibGssCisJLnNldF9kcWJsawk9IHZmc19zZXRfZHFibGsKK307CisjZW5kaWYKKworc3RhdGljIHN0cnVjdCBzdXBlcl9vcGVyYXRpb25zIGV4dDRfc29wcyA9IHsKKwkuYWxsb2NfaW5vZGUJPSBleHQ0X2FsbG9jX2lub2RlLAorCS5kZXN0cm95X2lub2RlCT0gZXh0NF9kZXN0cm95X2lub2RlLAorCS5yZWFkX2lub2RlCT0gZXh0NF9yZWFkX2lub2RlLAorCS53cml0ZV9pbm9kZQk9IGV4dDRfd3JpdGVfaW5vZGUsCisJLmRpcnR5X2lub2RlCT0gZXh0NF9kaXJ0eV9pbm9kZSwKKwkuZGVsZXRlX2lub2RlCT0gZXh0NF9kZWxldGVfaW5vZGUsCisJLnB1dF9zdXBlcgk9IGV4dDRfcHV0X3N1cGVyLAorCS53cml0ZV9zdXBlcgk9IGV4dDRfd3JpdGVfc3VwZXIsCisJLnN5bmNfZnMJPSBleHQ0X3N5bmNfZnMsCisJLndyaXRlX3N1cGVyX2xvY2tmcyA9IGV4dDRfd3JpdGVfc3VwZXJfbG9ja2ZzLAorCS51bmxvY2tmcwk9IGV4dDRfdW5sb2NrZnMsCisJLnN0YXRmcwkJPSBleHQ0X3N0YXRmcywKKwkucmVtb3VudF9mcwk9IGV4dDRfcmVtb3VudCwKKwkuY2xlYXJfaW5vZGUJPSBleHQ0X2NsZWFyX2lub2RlLAorCS5zaG93X29wdGlvbnMJPSBleHQ0X3Nob3dfb3B0aW9ucywKKyNpZmRlZiBDT05GSUdfUVVPVEEKKwkucXVvdGFfcmVhZAk9IGV4dDRfcXVvdGFfcmVhZCwKKwkucXVvdGFfd3JpdGUJPSBleHQ0X3F1b3RhX3dyaXRlLAorI2VuZGlmCit9OworCitzdGF0aWMgc3RydWN0IGV4cG9ydF9vcGVyYXRpb25zIGV4dDRfZXhwb3J0X29wcyA9IHsKKwkuZ2V0X3BhcmVudCA9IGV4dDRfZ2V0X3BhcmVudCwKKwkuZ2V0X2RlbnRyeSA9IGV4dDRfZ2V0X2RlbnRyeSwKK307CisKK2VudW0geworCU9wdF9ic2RfZGYsIE9wdF9taW5peF9kZiwgT3B0X2dycGlkLCBPcHRfbm9ncnBpZCwKKwlPcHRfcmVzZ2lkLCBPcHRfcmVzdWlkLCBPcHRfc2IsIE9wdF9lcnJfY29udCwgT3B0X2Vycl9wYW5pYywgT3B0X2Vycl9ybywKKwlPcHRfbm91aWQzMiwgT3B0X25vY2hlY2ssIE9wdF9kZWJ1ZywgT3B0X29sZGFsbG9jLCBPcHRfb3Jsb3YsCisJT3B0X3VzZXJfeGF0dHIsIE9wdF9ub3VzZXJfeGF0dHIsIE9wdF9hY2wsIE9wdF9ub2FjbCwKKwlPcHRfcmVzZXJ2YXRpb24sIE9wdF9ub3Jlc2VydmF0aW9uLCBPcHRfbm9sb2FkLCBPcHRfbm9iaCwgT3B0X2JoLAorCU9wdF9jb21taXQsIE9wdF9qb3VybmFsX3VwZGF0ZSwgT3B0X2pvdXJuYWxfaW51bSwgT3B0X2pvdXJuYWxfZGV2LAorCU9wdF9hYm9ydCwgT3B0X2RhdGFfam91cm5hbCwgT3B0X2RhdGFfb3JkZXJlZCwgT3B0X2RhdGFfd3JpdGViYWNrLAorCU9wdF91c3JqcXVvdGEsIE9wdF9ncnBqcXVvdGEsIE9wdF9vZmZ1c3JqcXVvdGEsIE9wdF9vZmZncnBqcXVvdGEsCisJT3B0X2pxZm10X3Zmc29sZCwgT3B0X2pxZm10X3Zmc3YwLCBPcHRfcXVvdGEsIE9wdF9ub3F1b3RhLAorCU9wdF9pZ25vcmUsIE9wdF9iYXJyaWVyLCBPcHRfZXJyLCBPcHRfcmVzaXplLCBPcHRfdXNycXVvdGEsCisJT3B0X2dycHF1b3RhLCBPcHRfZXh0ZW50cywKK307CisKK3N0YXRpYyBtYXRjaF90YWJsZV90IHRva2VucyA9IHsKKwl7T3B0X2JzZF9kZiwgImJzZGRmIn0sCisJe09wdF9taW5peF9kZiwgIm1pbml4ZGYifSwKKwl7T3B0X2dycGlkLCAiZ3JwaWQifSwKKwl7T3B0X2dycGlkLCAiYnNkZ3JvdXBzIn0sCisJe09wdF9ub2dycGlkLCAibm9ncnBpZCJ9LAorCXtPcHRfbm9ncnBpZCwgInN5c3Zncm91cHMifSwKKwl7T3B0X3Jlc2dpZCwgInJlc2dpZD0ldSJ9LAorCXtPcHRfcmVzdWlkLCAicmVzdWlkPSV1In0sCisJe09wdF9zYiwgInNiPSV1In0sCisJe09wdF9lcnJfY29udCwgImVycm9ycz1jb250aW51ZSJ9LAorCXtPcHRfZXJyX3BhbmljLCAiZXJyb3JzPXBhbmljIn0sCisJe09wdF9lcnJfcm8sICJlcnJvcnM9cmVtb3VudC1ybyJ9LAorCXtPcHRfbm91aWQzMiwgIm5vdWlkMzIifSwKKwl7T3B0X25vY2hlY2ssICJub2NoZWNrIn0sCisJe09wdF9ub2NoZWNrLCAiY2hlY2s9bm9uZSJ9LAorCXtPcHRfZGVidWcsICJkZWJ1ZyJ9LAorCXtPcHRfb2xkYWxsb2MsICJvbGRhbGxvYyJ9LAorCXtPcHRfb3Jsb3YsICJvcmxvdiJ9LAorCXtPcHRfdXNlcl94YXR0ciwgInVzZXJfeGF0dHIifSwKKwl7T3B0X25vdXNlcl94YXR0ciwgIm5vdXNlcl94YXR0ciJ9LAorCXtPcHRfYWNsLCAiYWNsIn0sCisJe09wdF9ub2FjbCwgIm5vYWNsIn0sCisJe09wdF9yZXNlcnZhdGlvbiwgInJlc2VydmF0aW9uIn0sCisJe09wdF9ub3Jlc2VydmF0aW9uLCAibm9yZXNlcnZhdGlvbiJ9LAorCXtPcHRfbm9sb2FkLCAibm9sb2FkIn0sCisJe09wdF9ub2JoLCAibm9iaCJ9LAorCXtPcHRfYmgsICJiaCJ9LAorCXtPcHRfY29tbWl0LCAiY29tbWl0PSV1In0sCisJe09wdF9qb3VybmFsX3VwZGF0ZSwgImpvdXJuYWw9dXBkYXRlIn0sCisJe09wdF9qb3VybmFsX2ludW0sICJqb3VybmFsPSV1In0sCisJe09wdF9qb3VybmFsX2RldiwgImpvdXJuYWxfZGV2PSV1In0sCisJe09wdF9hYm9ydCwgImFib3J0In0sCisJe09wdF9kYXRhX2pvdXJuYWwsICJkYXRhPWpvdXJuYWwifSwKKwl7T3B0X2RhdGFfb3JkZXJlZCwgImRhdGE9b3JkZXJlZCJ9LAorCXtPcHRfZGF0YV93cml0ZWJhY2ssICJkYXRhPXdyaXRlYmFjayJ9LAorCXtPcHRfb2ZmdXNyanF1b3RhLCAidXNyanF1b3RhPSJ9LAorCXtPcHRfdXNyanF1b3RhLCAidXNyanF1b3RhPSVzIn0sCisJe09wdF9vZmZncnBqcXVvdGEsICJncnBqcXVvdGE9In0sCisJe09wdF9ncnBqcXVvdGEsICJncnBqcXVvdGE9JXMifSwKKwl7T3B0X2pxZm10X3Zmc29sZCwgImpxZm10PXZmc29sZCJ9LAorCXtPcHRfanFmbXRfdmZzdjAsICJqcWZtdD12ZnN2MCJ9LAorCXtPcHRfZ3JwcXVvdGEsICJncnBxdW90YSJ9LAorCXtPcHRfbm9xdW90YSwgIm5vcXVvdGEifSwKKwl7T3B0X3F1b3RhLCAicXVvdGEifSwKKwl7T3B0X3VzcnF1b3RhLCAidXNycXVvdGEifSwKKwl7T3B0X2JhcnJpZXIsICJiYXJyaWVyPSV1In0sCisJe09wdF9leHRlbnRzLCAiZXh0ZW50cyJ9LAorCXtPcHRfZXJyLCBOVUxMfSwKKwl7T3B0X3Jlc2l6ZSwgInJlc2l6ZSJ9LAorfTsKKworc3RhdGljIGV4dDRfZnNibGtfdCBnZXRfc2JfYmxvY2sodm9pZCAqKmRhdGEpCit7CisJZXh0NF9mc2Jsa190CXNiX2Jsb2NrOworCWNoYXIJCSpvcHRpb25zID0gKGNoYXIgKikgKmRhdGE7CisKKwlpZiAoIW9wdGlvbnMgfHwgc3RybmNtcChvcHRpb25zLCAic2I9IiwgMykgIT0gMCkKKwkJcmV0dXJuIDE7CS8qIERlZmF1bHQgbG9jYXRpb24gKi8KKwlvcHRpb25zICs9IDM7CisJLyp0b2RvOiB1c2Ugc2ltcGxlX3N0cnRvbGwgd2l0aCA+MzJiaXQgZXh0NCAqLworCXNiX2Jsb2NrID0gc2ltcGxlX3N0cnRvdWwob3B0aW9ucywgJm9wdGlvbnMsIDApOworCWlmICgqb3B0aW9ucyAmJiAqb3B0aW9ucyAhPSAnLCcpIHsKKwkJcHJpbnRrKCJFWFQ0LWZzOiBJbnZhbGlkIHNiIHNwZWNpZmljYXRpb246ICVzXG4iLAorCQkgICAgICAgKGNoYXIgKikgKmRhdGEpOworCQlyZXR1cm4gMTsKKwl9CisJaWYgKCpvcHRpb25zID09ICcsJykKKwkJb3B0aW9ucysrOworCSpkYXRhID0gKHZvaWQgKikgb3B0aW9uczsKKwlyZXR1cm4gc2JfYmxvY2s7Cit9CisKK3N0YXRpYyBpbnQgcGFyc2Vfb3B0aW9ucyAoY2hhciAqb3B0aW9ucywgc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwKKwkJCSAgdW5zaWduZWQgaW50ICppbnVtLCB1bnNpZ25lZCBsb25nICpqb3VybmFsX2Rldm51bSwKKwkJCSAgZXh0NF9mc2Jsa190ICpuX2Jsb2Nrc19jb3VudCwgaW50IGlzX3JlbW91bnQpCit7CisJc3RydWN0IGV4dDRfc2JfaW5mbyAqc2JpID0gRVhUNF9TQihzYik7CisJY2hhciAqIHA7CisJc3Vic3RyaW5nX3QgYXJnc1tNQVhfT1BUX0FSR1NdOworCWludCBkYXRhX29wdCA9IDA7CisJaW50IG9wdGlvbjsKKyNpZmRlZiBDT05GSUdfUVVPVEEKKwlpbnQgcXR5cGU7CisJY2hhciAqcW5hbWU7CisjZW5kaWYKKworCWlmICghb3B0aW9ucykKKwkJcmV0dXJuIDE7CisKKwl3aGlsZSAoKHAgPSBzdHJzZXAgKCZvcHRpb25zLCAiLCIpKSAhPSBOVUxMKSB7CisJCWludCB0b2tlbjsKKwkJaWYgKCEqcCkKKwkJCWNvbnRpbnVlOworCisJCXRva2VuID0gbWF0Y2hfdG9rZW4ocCwgdG9rZW5zLCBhcmdzKTsKKwkJc3dpdGNoICh0b2tlbikgeworCQljYXNlIE9wdF9ic2RfZGY6CisJCQljbGVhcl9vcHQgKHNiaS0+c19tb3VudF9vcHQsIE1JTklYX0RGKTsKKwkJCWJyZWFrOworCQljYXNlIE9wdF9taW5peF9kZjoKKwkJCXNldF9vcHQgKHNiaS0+c19tb3VudF9vcHQsIE1JTklYX0RGKTsKKwkJCWJyZWFrOworCQljYXNlIE9wdF9ncnBpZDoKKwkJCXNldF9vcHQgKHNiaS0+c19tb3VudF9vcHQsIEdSUElEKTsKKwkJCWJyZWFrOworCQljYXNlIE9wdF9ub2dycGlkOgorCQkJY2xlYXJfb3B0IChzYmktPnNfbW91bnRfb3B0LCBHUlBJRCk7CisJCQlicmVhazsKKwkJY2FzZSBPcHRfcmVzdWlkOgorCQkJaWYgKG1hdGNoX2ludCgmYXJnc1swXSwgJm9wdGlvbikpCisJCQkJcmV0dXJuIDA7CisJCQlzYmktPnNfcmVzdWlkID0gb3B0aW9uOworCQkJYnJlYWs7CisJCWNhc2UgT3B0X3Jlc2dpZDoKKwkJCWlmIChtYXRjaF9pbnQoJmFyZ3NbMF0sICZvcHRpb24pKQorCQkJCXJldHVybiAwOworCQkJc2JpLT5zX3Jlc2dpZCA9IG9wdGlvbjsKKwkJCWJyZWFrOworCQljYXNlIE9wdF9zYjoKKwkJCS8qIGhhbmRsZWQgYnkgZ2V0X3NiX2Jsb2NrKCkgaW5zdGVhZCBvZiBoZXJlICovCisJCQkvKiAqc2JfYmxvY2sgPSBtYXRjaF9pbnQoJmFyZ3NbMF0pOyAqLworCQkJYnJlYWs7CisJCWNhc2UgT3B0X2Vycl9wYW5pYzoKKwkJCWNsZWFyX29wdCAoc2JpLT5zX21vdW50X29wdCwgRVJST1JTX0NPTlQpOworCQkJY2xlYXJfb3B0IChzYmktPnNfbW91bnRfb3B0LCBFUlJPUlNfUk8pOworCQkJc2V0X29wdCAoc2JpLT5zX21vdW50X29wdCwgRVJST1JTX1BBTklDKTsKKwkJCWJyZWFrOworCQljYXNlIE9wdF9lcnJfcm86CisJCQljbGVhcl9vcHQgKHNiaS0+c19tb3VudF9vcHQsIEVSUk9SU19DT05UKTsKKwkJCWNsZWFyX29wdCAoc2JpLT5zX21vdW50X29wdCwgRVJST1JTX1BBTklDKTsKKwkJCXNldF9vcHQgKHNiaS0+c19tb3VudF9vcHQsIEVSUk9SU19STyk7CisJCQlicmVhazsKKwkJY2FzZSBPcHRfZXJyX2NvbnQ6CisJCQljbGVhcl9vcHQgKHNiaS0+c19tb3VudF9vcHQsIEVSUk9SU19STyk7CisJCQljbGVhcl9vcHQgKHNiaS0+c19tb3VudF9vcHQsIEVSUk9SU19QQU5JQyk7CisJCQlzZXRfb3B0IChzYmktPnNfbW91bnRfb3B0LCBFUlJPUlNfQ09OVCk7CisJCQlicmVhazsKKwkJY2FzZSBPcHRfbm91aWQzMjoKKwkJCXNldF9vcHQgKHNiaS0+c19tb3VudF9vcHQsIE5PX1VJRDMyKTsKKwkJCWJyZWFrOworCQljYXNlIE9wdF9ub2NoZWNrOgorCQkJY2xlYXJfb3B0IChzYmktPnNfbW91bnRfb3B0LCBDSEVDSyk7CisJCQlicmVhazsKKwkJY2FzZSBPcHRfZGVidWc6CisJCQlzZXRfb3B0IChzYmktPnNfbW91bnRfb3B0LCBERUJVRyk7CisJCQlicmVhazsKKwkJY2FzZSBPcHRfb2xkYWxsb2M6CisJCQlzZXRfb3B0IChzYmktPnNfbW91bnRfb3B0LCBPTERBTExPQyk7CisJCQlicmVhazsKKwkJY2FzZSBPcHRfb3Jsb3Y6CisJCQljbGVhcl9vcHQgKHNiaS0+c19tb3VudF9vcHQsIE9MREFMTE9DKTsKKwkJCWJyZWFrOworI2lmZGVmIENPTkZJR19FWFQ0REVWX0ZTX1hBVFRSCisJCWNhc2UgT3B0X3VzZXJfeGF0dHI6CisJCQlzZXRfb3B0IChzYmktPnNfbW91bnRfb3B0LCBYQVRUUl9VU0VSKTsKKwkJCWJyZWFrOworCQljYXNlIE9wdF9ub3VzZXJfeGF0dHI6CisJCQljbGVhcl9vcHQgKHNiaS0+c19tb3VudF9vcHQsIFhBVFRSX1VTRVIpOworCQkJYnJlYWs7CisjZWxzZQorCQljYXNlIE9wdF91c2VyX3hhdHRyOgorCQljYXNlIE9wdF9ub3VzZXJfeGF0dHI6CisJCQlwcmludGsoIkVYVDQgKG5vKXVzZXJfeGF0dHIgb3B0aW9ucyBub3Qgc3VwcG9ydGVkXG4iKTsKKwkJCWJyZWFrOworI2VuZGlmCisjaWZkZWYgQ09ORklHX0VYVDRERVZfRlNfUE9TSVhfQUNMCisJCWNhc2UgT3B0X2FjbDoKKwkJCXNldF9vcHQoc2JpLT5zX21vdW50X29wdCwgUE9TSVhfQUNMKTsKKwkJCWJyZWFrOworCQljYXNlIE9wdF9ub2FjbDoKKwkJCWNsZWFyX29wdChzYmktPnNfbW91bnRfb3B0LCBQT1NJWF9BQ0wpOworCQkJYnJlYWs7CisjZWxzZQorCQljYXNlIE9wdF9hY2w6CisJCWNhc2UgT3B0X25vYWNsOgorCQkJcHJpbnRrKCJFWFQ0IChubylhY2wgb3B0aW9ucyBub3Qgc3VwcG9ydGVkXG4iKTsKKwkJCWJyZWFrOworI2VuZGlmCisJCWNhc2UgT3B0X3Jlc2VydmF0aW9uOgorCQkJc2V0X29wdChzYmktPnNfbW91bnRfb3B0LCBSRVNFUlZBVElPTik7CisJCQlicmVhazsKKwkJY2FzZSBPcHRfbm9yZXNlcnZhdGlvbjoKKwkJCWNsZWFyX29wdChzYmktPnNfbW91bnRfb3B0LCBSRVNFUlZBVElPTik7CisJCQlicmVhazsKKwkJY2FzZSBPcHRfam91cm5hbF91cGRhdGU6CisJCQkvKiBAQEAgRklYTUUgKi8KKwkJCS8qIEV2ZW50dWFsbHkgd2Ugd2lsbCB3YW50IHRvIGJlIGFibGUgdG8gY3JlYXRlCisJCQkgICBhIGpvdXJuYWwgZmlsZSBoZXJlLiAgRm9yIG5vdywgb25seSBhbGxvdyB0aGUKKwkJCSAgIHVzZXIgdG8gc3BlY2lmeSBhbiBleGlzdGluZyBpbm9kZSB0byBiZSB0aGUKKwkJCSAgIGpvdXJuYWwgZmlsZS4gKi8KKwkJCWlmIChpc19yZW1vdW50KSB7CisJCQkJcHJpbnRrKEtFUk5fRVJSICJFWFQ0LWZzOiBjYW5ub3Qgc3BlY2lmeSAiCisJCQkJICAgICAgICJqb3VybmFsIG9uIHJlbW91bnRcbiIpOworCQkJCXJldHVybiAwOworCQkJfQorCQkJc2V0X29wdCAoc2JpLT5zX21vdW50X29wdCwgVVBEQVRFX0pPVVJOQUwpOworCQkJYnJlYWs7CisJCWNhc2UgT3B0X2pvdXJuYWxfaW51bToKKwkJCWlmIChpc19yZW1vdW50KSB7CisJCQkJcHJpbnRrKEtFUk5fRVJSICJFWFQ0LWZzOiBjYW5ub3Qgc3BlY2lmeSAiCisJCQkJICAgICAgICJqb3VybmFsIG9uIHJlbW91bnRcbiIpOworCQkJCXJldHVybiAwOworCQkJfQorCQkJaWYgKG1hdGNoX2ludCgmYXJnc1swXSwgJm9wdGlvbikpCisJCQkJcmV0dXJuIDA7CisJCQkqaW51bSA9IG9wdGlvbjsKKwkJCWJyZWFrOworCQljYXNlIE9wdF9qb3VybmFsX2RldjoKKwkJCWlmIChpc19yZW1vdW50KSB7CisJCQkJcHJpbnRrKEtFUk5fRVJSICJFWFQ0LWZzOiBjYW5ub3Qgc3BlY2lmeSAiCisJCQkJICAgICAgICJqb3VybmFsIG9uIHJlbW91bnRcbiIpOworCQkJCXJldHVybiAwOworCQkJfQorCQkJaWYgKG1hdGNoX2ludCgmYXJnc1swXSwgJm9wdGlvbikpCisJCQkJcmV0dXJuIDA7CisJCQkqam91cm5hbF9kZXZudW0gPSBvcHRpb247CisJCQlicmVhazsKKwkJY2FzZSBPcHRfbm9sb2FkOgorCQkJc2V0X29wdCAoc2JpLT5zX21vdW50X29wdCwgTk9MT0FEKTsKKwkJCWJyZWFrOworCQljYXNlIE9wdF9jb21taXQ6CisJCQlpZiAobWF0Y2hfaW50KCZhcmdzWzBdLCAmb3B0aW9uKSkKKwkJCQlyZXR1cm4gMDsKKwkJCWlmIChvcHRpb24gPCAwKQorCQkJCXJldHVybiAwOworCQkJaWYgKG9wdGlvbiA9PSAwKQorCQkJCW9wdGlvbiA9IEpCRF9ERUZBVUxUX01BWF9DT01NSVRfQUdFOworCQkJc2JpLT5zX2NvbW1pdF9pbnRlcnZhbCA9IEhaICogb3B0aW9uOworCQkJYnJlYWs7CisJCWNhc2UgT3B0X2RhdGFfam91cm5hbDoKKwkJCWRhdGFfb3B0ID0gRVhUNF9NT1VOVF9KT1VSTkFMX0RBVEE7CisJCQlnb3RvIGRhdGFjaGVjazsKKwkJY2FzZSBPcHRfZGF0YV9vcmRlcmVkOgorCQkJZGF0YV9vcHQgPSBFWFQ0X01PVU5UX09SREVSRURfREFUQTsKKwkJCWdvdG8gZGF0YWNoZWNrOworCQljYXNlIE9wdF9kYXRhX3dyaXRlYmFjazoKKwkJCWRhdGFfb3B0ID0gRVhUNF9NT1VOVF9XUklURUJBQ0tfREFUQTsKKwkJZGF0YWNoZWNrOgorCQkJaWYgKGlzX3JlbW91bnQpIHsKKwkJCQlpZiAoKHNiaS0+c19tb3VudF9vcHQgJiBFWFQ0X01PVU5UX0RBVEFfRkxBR1MpCisJCQkJCQkhPSBkYXRhX29wdCkgeworCQkJCQlwcmludGsoS0VSTl9FUlIKKwkJCQkJCSJFWFQ0LWZzOiBjYW5ub3QgY2hhbmdlIGRhdGEgIgorCQkJCQkJIm1vZGUgb24gcmVtb3VudFxuIik7CisJCQkJCXJldHVybiAwOworCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJc2JpLT5zX21vdW50X29wdCAmPSB+RVhUNF9NT1VOVF9EQVRBX0ZMQUdTOworCQkJCXNiaS0+c19tb3VudF9vcHQgfD0gZGF0YV9vcHQ7CisJCQl9CisJCQlicmVhazsKKyNpZmRlZiBDT05GSUdfUVVPVEEKKwkJY2FzZSBPcHRfdXNyanF1b3RhOgorCQkJcXR5cGUgPSBVU1JRVU9UQTsKKwkJCWdvdG8gc2V0X3FmX25hbWU7CisJCWNhc2UgT3B0X2dycGpxdW90YToKKwkJCXF0eXBlID0gR1JQUVVPVEE7CitzZXRfcWZfbmFtZToKKwkJCWlmIChzYl9hbnlfcXVvdGFfZW5hYmxlZChzYikpIHsKKwkJCQlwcmludGsoS0VSTl9FUlIKKwkJCQkJIkVYVDQtZnM6IENhbm5vdCBjaGFuZ2Ugam91cm5hbGxlZCAiCisJCQkJCSJxdW90YSBvcHRpb25zIHdoZW4gcXVvdGEgdHVybmVkIG9uLlxuIik7CisJCQkJcmV0dXJuIDA7CisJCQl9CisJCQlxbmFtZSA9IG1hdGNoX3N0cmR1cCgmYXJnc1swXSk7CisJCQlpZiAoIXFuYW1lKSB7CisJCQkJcHJpbnRrKEtFUk5fRVJSCisJCQkJCSJFWFQ0LWZzOiBub3QgZW5vdWdoIG1lbW9yeSBmb3IgIgorCQkJCQkic3RvcmluZyBxdW90YWZpbGUgbmFtZS5cbiIpOworCQkJCXJldHVybiAwOworCQkJfQorCQkJaWYgKHNiaS0+c19xZl9uYW1lc1txdHlwZV0gJiYKKwkJCSAgICBzdHJjbXAoc2JpLT5zX3FmX25hbWVzW3F0eXBlXSwgcW5hbWUpKSB7CisJCQkJcHJpbnRrKEtFUk5fRVJSCisJCQkJCSJFWFQ0LWZzOiAlcyBxdW90YSBmaWxlIGFscmVhZHkgIgorCQkJCQkic3BlY2lmaWVkLlxuIiwgUVRZUEUyTkFNRShxdHlwZSkpOworCQkJCWtmcmVlKHFuYW1lKTsKKwkJCQlyZXR1cm4gMDsKKwkJCX0KKwkJCXNiaS0+c19xZl9uYW1lc1txdHlwZV0gPSBxbmFtZTsKKwkJCWlmIChzdHJjaHIoc2JpLT5zX3FmX25hbWVzW3F0eXBlXSwgJy8nKSkgeworCQkJCXByaW50ayhLRVJOX0VSUgorCQkJCQkiRVhUNC1mczogcXVvdGFmaWxlIG11c3QgYmUgb24gIgorCQkJCQkiZmlsZXN5c3RlbSByb290LlxuIik7CisJCQkJa2ZyZWUoc2JpLT5zX3FmX25hbWVzW3F0eXBlXSk7CisJCQkJc2JpLT5zX3FmX25hbWVzW3F0eXBlXSA9IE5VTEw7CisJCQkJcmV0dXJuIDA7CisJCQl9CisJCQlzZXRfb3B0KHNiaS0+c19tb3VudF9vcHQsIFFVT1RBKTsKKwkJCWJyZWFrOworCQljYXNlIE9wdF9vZmZ1c3JqcXVvdGE6CisJCQlxdHlwZSA9IFVTUlFVT1RBOworCQkJZ290byBjbGVhcl9xZl9uYW1lOworCQljYXNlIE9wdF9vZmZncnBqcXVvdGE6CisJCQlxdHlwZSA9IEdSUFFVT1RBOworY2xlYXJfcWZfbmFtZToKKwkJCWlmIChzYl9hbnlfcXVvdGFfZW5hYmxlZChzYikpIHsKKwkJCQlwcmludGsoS0VSTl9FUlIgIkVYVDQtZnM6IENhbm5vdCBjaGFuZ2UgIgorCQkJCQkiam91cm5hbGxlZCBxdW90YSBvcHRpb25zIHdoZW4gIgorCQkJCQkicXVvdGEgdHVybmVkIG9uLlxuIik7CisJCQkJcmV0dXJuIDA7CisJCQl9CisJCQkvKgorCQkJICogVGhlIHNwYWNlIHdpbGwgYmUgcmVsZWFzZWQgbGF0ZXIgd2hlbiBhbGwgb3B0aW9ucworCQkJICogYXJlIGNvbmZpcm1lZCB0byBiZSBjb3JyZWN0CisJCQkgKi8KKwkJCXNiaS0+c19xZl9uYW1lc1txdHlwZV0gPSBOVUxMOworCQkJYnJlYWs7CisJCWNhc2UgT3B0X2pxZm10X3Zmc29sZDoKKwkJCXNiaS0+c19qcXVvdGFfZm10ID0gUUZNVF9WRlNfT0xEOworCQkJYnJlYWs7CisJCWNhc2UgT3B0X2pxZm10X3Zmc3YwOgorCQkJc2JpLT5zX2pxdW90YV9mbXQgPSBRRk1UX1ZGU19WMDsKKwkJCWJyZWFrOworCQljYXNlIE9wdF9xdW90YToKKwkJY2FzZSBPcHRfdXNycXVvdGE6CisJCQlzZXRfb3B0KHNiaS0+c19tb3VudF9vcHQsIFFVT1RBKTsKKwkJCXNldF9vcHQoc2JpLT5zX21vdW50X29wdCwgVVNSUVVPVEEpOworCQkJYnJlYWs7CisJCWNhc2UgT3B0X2dycHF1b3RhOgorCQkJc2V0X29wdChzYmktPnNfbW91bnRfb3B0LCBRVU9UQSk7CisJCQlzZXRfb3B0KHNiaS0+c19tb3VudF9vcHQsIEdSUFFVT1RBKTsKKwkJCWJyZWFrOworCQljYXNlIE9wdF9ub3F1b3RhOgorCQkJaWYgKHNiX2FueV9xdW90YV9lbmFibGVkKHNiKSkgeworCQkJCXByaW50ayhLRVJOX0VSUiAiRVhUNC1mczogQ2Fubm90IGNoYW5nZSBxdW90YSAiCisJCQkJCSJvcHRpb25zIHdoZW4gcXVvdGEgdHVybmVkIG9uLlxuIik7CisJCQkJcmV0dXJuIDA7CisJCQl9CisJCQljbGVhcl9vcHQoc2JpLT5zX21vdW50X29wdCwgUVVPVEEpOworCQkJY2xlYXJfb3B0KHNiaS0+c19tb3VudF9vcHQsIFVTUlFVT1RBKTsKKwkJCWNsZWFyX29wdChzYmktPnNfbW91bnRfb3B0LCBHUlBRVU9UQSk7CisJCQlicmVhazsKKyNlbHNlCisJCWNhc2UgT3B0X3F1b3RhOgorCQljYXNlIE9wdF91c3JxdW90YToKKwkJY2FzZSBPcHRfZ3JwcXVvdGE6CisJCWNhc2UgT3B0X3VzcmpxdW90YToKKwkJY2FzZSBPcHRfZ3JwanF1b3RhOgorCQljYXNlIE9wdF9vZmZ1c3JqcXVvdGE6CisJCWNhc2UgT3B0X29mZmdycGpxdW90YToKKwkJY2FzZSBPcHRfanFmbXRfdmZzb2xkOgorCQljYXNlIE9wdF9qcWZtdF92ZnN2MDoKKwkJCXByaW50ayhLRVJOX0VSUgorCQkJCSJFWFQ0LWZzOiBqb3VybmFsbGVkIHF1b3RhIG9wdGlvbnMgbm90ICIKKwkJCQkic3VwcG9ydGVkLlxuIik7CisJCQlicmVhazsKKwkJY2FzZSBPcHRfbm9xdW90YToKKwkJCWJyZWFrOworI2VuZGlmCisJCWNhc2UgT3B0X2Fib3J0OgorCQkJc2V0X29wdChzYmktPnNfbW91bnRfb3B0LCBBQk9SVCk7CisJCQlicmVhazsKKwkJY2FzZSBPcHRfYmFycmllcjoKKwkJCWlmIChtYXRjaF9pbnQoJmFyZ3NbMF0sICZvcHRpb24pKQorCQkJCXJldHVybiAwOworCQkJaWYgKG9wdGlvbikKKwkJCQlzZXRfb3B0KHNiaS0+c19tb3VudF9vcHQsIEJBUlJJRVIpOworCQkJZWxzZQorCQkJCWNsZWFyX29wdChzYmktPnNfbW91bnRfb3B0LCBCQVJSSUVSKTsKKwkJCWJyZWFrOworCQljYXNlIE9wdF9pZ25vcmU6CisJCQlicmVhazsKKwkJY2FzZSBPcHRfcmVzaXplOgorCQkJaWYgKCFpc19yZW1vdW50KSB7CisJCQkJcHJpbnRrKCJFWFQ0LWZzOiByZXNpemUgb3B0aW9uIG9ubHkgYXZhaWxhYmxlICIKKwkJCQkJImZvciByZW1vdW50XG4iKTsKKwkJCQlyZXR1cm4gMDsKKwkJCX0KKwkJCWlmIChtYXRjaF9pbnQoJmFyZ3NbMF0sICZvcHRpb24pICE9IDApCisJCQkJcmV0dXJuIDA7CisJCQkqbl9ibG9ja3NfY291bnQgPSBvcHRpb247CisJCQlicmVhazsKKwkJY2FzZSBPcHRfbm9iaDoKKwkJCXNldF9vcHQoc2JpLT5zX21vdW50X29wdCwgTk9CSCk7CisJCQlicmVhazsKKwkJY2FzZSBPcHRfYmg6CisJCQljbGVhcl9vcHQoc2JpLT5zX21vdW50X29wdCwgTk9CSCk7CisJCQlicmVhazsKKwkJY2FzZSBPcHRfZXh0ZW50czoKKwkJCXNldF9vcHQgKHNiaS0+c19tb3VudF9vcHQsIEVYVEVOVFMpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlwcmludGsgKEtFUk5fRVJSCisJCQkJIkVYVDQtZnM6IFVucmVjb2duaXplZCBtb3VudCBvcHRpb24gXCIlc1wiICIKKwkJCQkib3IgbWlzc2luZyB2YWx1ZVxuIiwgcCk7CisJCQlyZXR1cm4gMDsKKwkJfQorCX0KKyNpZmRlZiBDT05GSUdfUVVPVEEKKwlpZiAoc2JpLT5zX3FmX25hbWVzW1VTUlFVT1RBXSB8fCBzYmktPnNfcWZfbmFtZXNbR1JQUVVPVEFdKSB7CisJCWlmICgoc2JpLT5zX21vdW50X29wdCAmIEVYVDRfTU9VTlRfVVNSUVVPVEEpICYmCisJCSAgICAgc2JpLT5zX3FmX25hbWVzW1VTUlFVT1RBXSkKKwkJCWNsZWFyX29wdChzYmktPnNfbW91bnRfb3B0LCBVU1JRVU9UQSk7CisKKwkJaWYgKChzYmktPnNfbW91bnRfb3B0ICYgRVhUNF9NT1VOVF9HUlBRVU9UQSkgJiYKKwkJICAgICBzYmktPnNfcWZfbmFtZXNbR1JQUVVPVEFdKQorCQkJY2xlYXJfb3B0KHNiaS0+c19tb3VudF9vcHQsIEdSUFFVT1RBKTsKKworCQlpZiAoKHNiaS0+c19xZl9uYW1lc1tVU1JRVU9UQV0gJiYKKwkJCQkoc2JpLT5zX21vdW50X29wdCAmIEVYVDRfTU9VTlRfR1JQUVVPVEEpKSB8fAorCQkgICAgKHNiaS0+c19xZl9uYW1lc1tHUlBRVU9UQV0gJiYKKwkJCQkoc2JpLT5zX21vdW50X29wdCAmIEVYVDRfTU9VTlRfVVNSUVVPVEEpKSkgeworCQkJcHJpbnRrKEtFUk5fRVJSICJFWFQ0LWZzOiBvbGQgYW5kIG5ldyBxdW90YSAiCisJCQkJCSJmb3JtYXQgbWl4aW5nLlxuIik7CisJCQlyZXR1cm4gMDsKKwkJfQorCisJCWlmICghc2JpLT5zX2pxdW90YV9mbXQpIHsKKwkJCXByaW50ayhLRVJOX0VSUiAiRVhUNC1mczogam91cm5hbGxlZCBxdW90YSBmb3JtYXQgIgorCQkJCQkibm90IHNwZWNpZmllZC5cbiIpOworCQkJcmV0dXJuIDA7CisJCX0KKwl9IGVsc2UgeworCQlpZiAoc2JpLT5zX2pxdW90YV9mbXQpIHsKKwkJCXByaW50ayhLRVJOX0VSUiAiRVhUNC1mczogam91cm5hbGxlZCBxdW90YSBmb3JtYXQgIgorCQkJCQkic3BlY2lmaWVkIHdpdGggbm8gam91cm5hbGxpbmcgIgorCQkJCQkiZW5hYmxlZC5cbiIpOworCQkJcmV0dXJuIDA7CisJCX0KKwl9CisjZW5kaWYKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCBleHQ0X3NldHVwX3N1cGVyKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHN0cnVjdCBleHQ0X3N1cGVyX2Jsb2NrICplcywKKwkJCSAgICBpbnQgcmVhZF9vbmx5KQoreworCXN0cnVjdCBleHQ0X3NiX2luZm8gKnNiaSA9IEVYVDRfU0Ioc2IpOworCWludCByZXMgPSAwOworCisJaWYgKGxlMzJfdG9fY3B1KGVzLT5zX3Jldl9sZXZlbCkgPiBFWFQ0X01BWF9TVVBQX1JFVikgeworCQlwcmludGsgKEtFUk5fRVJSICJFWFQ0LWZzIHdhcm5pbmc6IHJldmlzaW9uIGxldmVsIHRvbyBoaWdoLCAiCisJCQkiZm9yY2luZyByZWFkLW9ubHkgbW9kZVxuIik7CisJCXJlcyA9IE1TX1JET05MWTsKKwl9CisJaWYgKHJlYWRfb25seSkKKwkJcmV0dXJuIHJlczsKKwlpZiAoIShzYmktPnNfbW91bnRfc3RhdGUgJiBFWFQ0X1ZBTElEX0ZTKSkKKwkJcHJpbnRrIChLRVJOX1dBUk5JTkcgIkVYVDQtZnMgd2FybmluZzogbW91bnRpbmcgdW5jaGVja2VkIGZzLCAiCisJCQkicnVubmluZyBlMmZzY2sgaXMgcmVjb21tZW5kZWRcbiIpOworCWVsc2UgaWYgKChzYmktPnNfbW91bnRfc3RhdGUgJiBFWFQ0X0VSUk9SX0ZTKSkKKwkJcHJpbnRrIChLRVJOX1dBUk5JTkcKKwkJCSJFWFQ0LWZzIHdhcm5pbmc6IG1vdW50aW5nIGZzIHdpdGggZXJyb3JzLCAiCisJCQkicnVubmluZyBlMmZzY2sgaXMgcmVjb21tZW5kZWRcbiIpOworCWVsc2UgaWYgKChfX3MxNikgbGUxNl90b19jcHUoZXMtPnNfbWF4X21udF9jb3VudCkgPj0gMCAmJgorCQkgbGUxNl90b19jcHUoZXMtPnNfbW50X2NvdW50KSA+PQorCQkgKHVuc2lnbmVkIHNob3J0KSAoX19zMTYpIGxlMTZfdG9fY3B1KGVzLT5zX21heF9tbnRfY291bnQpKQorCQlwcmludGsgKEtFUk5fV0FSTklORworCQkJIkVYVDQtZnMgd2FybmluZzogbWF4aW1hbCBtb3VudCBjb3VudCByZWFjaGVkLCAiCisJCQkicnVubmluZyBlMmZzY2sgaXMgcmVjb21tZW5kZWRcbiIpOworCWVsc2UgaWYgKGxlMzJfdG9fY3B1KGVzLT5zX2NoZWNraW50ZXJ2YWwpICYmCisJCShsZTMyX3RvX2NwdShlcy0+c19sYXN0Y2hlY2spICsKKwkJCWxlMzJfdG9fY3B1KGVzLT5zX2NoZWNraW50ZXJ2YWwpIDw9IGdldF9zZWNvbmRzKCkpKQorCQlwcmludGsgKEtFUk5fV0FSTklORworCQkJIkVYVDQtZnMgd2FybmluZzogY2hlY2t0aW1lIHJlYWNoZWQsICIKKwkJCSJydW5uaW5nIGUyZnNjayBpcyByZWNvbW1lbmRlZFxuIik7CisjaWYgMAorCQkvKiBAQEAgV2UgX3dpbGxfIHdhbnQgdG8gY2xlYXIgdGhlIHZhbGlkIGJpdCBpZiB3ZSBmaW5kCisJCSAqIGluY29uc2lzdGVuY2llcywgdG8gZm9yY2UgYSBmc2NrIGF0IHJlYm9vdC4gIEJ1dCBmb3IKKwkJICogYSBwbGFpbiBqb3VybmFsZWQgZmlsZXN5c3RlbSB3ZSBjYW4ga2VlcCBpdCBzZXQgYXMKKwkJICogdmFsaWQgZm9yZXZlciEgOikKKwkJICovCisJZXMtPnNfc3RhdGUgPSBjcHVfdG9fbGUxNihsZTE2X3RvX2NwdShlcy0+c19zdGF0ZSkgJiB+RVhUNF9WQUxJRF9GUyk7CisjZW5kaWYKKwlpZiAoIShfX3MxNikgbGUxNl90b19jcHUoZXMtPnNfbWF4X21udF9jb3VudCkpCisJCWVzLT5zX21heF9tbnRfY291bnQgPSBjcHVfdG9fbGUxNihFWFQ0X0RGTF9NQVhfTU5UX0NPVU5UKTsKKwllcy0+c19tbnRfY291bnQ9Y3B1X3RvX2xlMTYobGUxNl90b19jcHUoZXMtPnNfbW50X2NvdW50KSArIDEpOworCWVzLT5zX210aW1lID0gY3B1X3RvX2xlMzIoZ2V0X3NlY29uZHMoKSk7CisJZXh0NF91cGRhdGVfZHluYW1pY19yZXYoc2IpOworCUVYVDRfU0VUX0lOQ09NUEFUX0ZFQVRVUkUoc2IsIEVYVDRfRkVBVFVSRV9JTkNPTVBBVF9SRUNPVkVSKTsKKworCWV4dDRfY29tbWl0X3N1cGVyKHNiLCBlcywgMSk7CisJaWYgKHRlc3Rfb3B0KHNiLCBERUJVRykpCisJCXByaW50ayhLRVJOX0lORk8gIltFWFQ0IEZTIGJzPSVsdSwgZ2M9JWx1LCAiCisJCQkJImJwZz0lbHUsIGlwZz0lbHUsIG1vPSUwNGx4XVxuIiwKKwkJCXNiLT5zX2Jsb2Nrc2l6ZSwKKwkJCXNiaS0+c19ncm91cHNfY291bnQsCisJCQlFWFQ0X0JMT0NLU19QRVJfR1JPVVAoc2IpLAorCQkJRVhUNF9JTk9ERVNfUEVSX0dST1VQKHNiKSwKKwkJCXNiaS0+c19tb3VudF9vcHQpOworCisJcHJpbnRrKEtFUk5fSU5GTyAiRVhUNCBGUyBvbiAlcywgIiwgc2ItPnNfaWQpOworCWlmIChFWFQ0X1NCKHNiKS0+c19qb3VybmFsLT5qX2lub2RlID09IE5VTEwpIHsKKwkJY2hhciBiW0JERVZOQU1FX1NJWkVdOworCisJCXByaW50aygiZXh0ZXJuYWwgam91cm5hbCBvbiAlc1xuIiwKKwkJCWJkZXZuYW1lKEVYVDRfU0Ioc2IpLT5zX2pvdXJuYWwtPmpfZGV2LCBiKSk7CisJfSBlbHNlIHsKKwkJcHJpbnRrKCJpbnRlcm5hbCBqb3VybmFsXG4iKTsKKwl9CisJcmV0dXJuIHJlczsKK30KKworLyogQ2FsbGVkIGF0IG1vdW50LXRpbWUsIHN1cGVyLWJsb2NrIGlzIGxvY2tlZCAqLworc3RhdGljIGludCBleHQ0X2NoZWNrX2Rlc2NyaXB0b3JzIChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiBzYikKK3sKKwlzdHJ1Y3QgZXh0NF9zYl9pbmZvICpzYmkgPSBFWFQ0X1NCKHNiKTsKKwlleHQ0X2ZzYmxrX3QgZmlyc3RfYmxvY2sgPSBsZTMyX3RvX2NwdShzYmktPnNfZXMtPnNfZmlyc3RfZGF0YV9ibG9jayk7CisJZXh0NF9mc2Jsa190IGxhc3RfYmxvY2s7CisJZXh0NF9mc2Jsa190IGJsb2NrX2JpdG1hcDsKKwlleHQ0X2ZzYmxrX3QgaW5vZGVfYml0bWFwOworCWV4dDRfZnNibGtfdCBpbm9kZV90YWJsZTsKKwlzdHJ1Y3QgZXh0NF9ncm91cF9kZXNjICogZ2RwID0gTlVMTDsKKwlpbnQgZGVzY19ibG9jayA9IDA7CisJaW50IGk7CisKKwlleHQ0X2RlYnVnICgiQ2hlY2tpbmcgZ3JvdXAgZGVzY3JpcHRvcnMiKTsKKworCWZvciAoaSA9IDA7IGkgPCBzYmktPnNfZ3JvdXBzX2NvdW50OyBpKyspCisJeworCQlpZiAoaSA9PSBzYmktPnNfZ3JvdXBzX2NvdW50IC0gMSkKKwkJCWxhc3RfYmxvY2sgPSBleHQ0X2Jsb2Nrc19jb3VudChzYmktPnNfZXMpIC0gMTsKKwkJZWxzZQorCQkJbGFzdF9ibG9jayA9IGZpcnN0X2Jsb2NrICsKKwkJCQkoRVhUNF9CTE9DS1NfUEVSX0dST1VQKHNiKSAtIDEpOworCisJCWlmICgoaSAlIEVYVDRfREVTQ19QRVJfQkxPQ0soc2IpKSA9PSAwKQorCQkJZ2RwID0gKHN0cnVjdCBleHQ0X2dyb3VwX2Rlc2MgKikKKwkJCQkJc2JpLT5zX2dyb3VwX2Rlc2NbZGVzY19ibG9jaysrXS0+Yl9kYXRhOworCQlibG9ja19iaXRtYXAgPSBleHQ0X2Jsb2NrX2JpdG1hcChzYiwgZ2RwKTsKKwkJaWYgKGJsb2NrX2JpdG1hcCA8IGZpcnN0X2Jsb2NrIHx8IGJsb2NrX2JpdG1hcCA+IGxhc3RfYmxvY2spCisJCXsKKwkJCWV4dDRfZXJyb3IgKHNiLCAiZXh0NF9jaGVja19kZXNjcmlwdG9ycyIsCisJCQkJICAgICJCbG9jayBiaXRtYXAgZm9yIGdyb3VwICVkIgorCQkJCSAgICAiIG5vdCBpbiBncm91cCAoYmxvY2sgJWxsdSkhIiwKKwkJCQkgICAgaSwgYmxvY2tfYml0bWFwKTsKKwkJCXJldHVybiAwOworCQl9CisJCWlub2RlX2JpdG1hcCA9IGV4dDRfaW5vZGVfYml0bWFwKHNiLCBnZHApOworCQlpZiAoaW5vZGVfYml0bWFwIDwgZmlyc3RfYmxvY2sgfHwgaW5vZGVfYml0bWFwID4gbGFzdF9ibG9jaykKKwkJeworCQkJZXh0NF9lcnJvciAoc2IsICJleHQ0X2NoZWNrX2Rlc2NyaXB0b3JzIiwKKwkJCQkgICAgIklub2RlIGJpdG1hcCBmb3IgZ3JvdXAgJWQiCisJCQkJICAgICIgbm90IGluIGdyb3VwIChibG9jayAlbGx1KSEiLAorCQkJCSAgICBpLCBpbm9kZV9iaXRtYXApOworCQkJcmV0dXJuIDA7CisJCX0KKwkJaW5vZGVfdGFibGUgPSBleHQ0X2lub2RlX3RhYmxlKHNiLCBnZHApOworCQlpZiAoaW5vZGVfdGFibGUgPCBmaXJzdF9ibG9jayB8fAorCQkgICAgaW5vZGVfdGFibGUgKyBzYmktPnNfaXRiX3Blcl9ncm91cCA+IGxhc3RfYmxvY2spCisJCXsKKwkJCWV4dDRfZXJyb3IgKHNiLCAiZXh0NF9jaGVja19kZXNjcmlwdG9ycyIsCisJCQkJICAgICJJbm9kZSB0YWJsZSBmb3IgZ3JvdXAgJWQiCisJCQkJICAgICIgbm90IGluIGdyb3VwIChibG9jayAlbGx1KSEiLAorCQkJCSAgICBpLCBpbm9kZV90YWJsZSk7CisJCQlyZXR1cm4gMDsKKwkJfQorCQlmaXJzdF9ibG9jayArPSBFWFQ0X0JMT0NLU19QRVJfR1JPVVAoc2IpOworCQlnZHAgPSAoc3RydWN0IGV4dDRfZ3JvdXBfZGVzYyAqKQorCQkJKChfX3U4ICopZ2RwICsgRVhUNF9ERVNDX1NJWkUoc2IpKTsKKwl9CisKKwlleHQ0X2ZyZWVfYmxvY2tzX2NvdW50X3NldChzYmktPnNfZXMsIGV4dDRfY291bnRfZnJlZV9ibG9ja3Moc2IpKTsKKwlzYmktPnNfZXMtPnNfZnJlZV9pbm9kZXNfY291bnQ9Y3B1X3RvX2xlMzIoZXh0NF9jb3VudF9mcmVlX2lub2RlcyhzYikpOworCXJldHVybiAxOworfQorCisKKy8qIGV4dDRfb3JwaGFuX2NsZWFudXAoKSB3YWxrcyBhIHNpbmdseS1saW5rZWQgbGlzdCBvZiBpbm9kZXMgKHN0YXJ0aW5nIGF0CisgKiB0aGUgc3VwZXJibG9jaykgd2hpY2ggd2VyZSBkZWxldGVkIGZyb20gYWxsIGRpcmVjdG9yaWVzLCBidXQgaGVsZCBvcGVuIGJ5CisgKiBhIHByb2Nlc3MgYXQgdGhlIHRpbWUgb2YgYSBjcmFzaC4gIFdlIHdhbGsgdGhlIGxpc3QgYW5kIHRyeSB0byBkZWxldGUgdGhlc2UKKyAqIGlub2RlcyBhdCByZWNvdmVyeSB0aW1lIChvbmx5IHdpdGggYSByZWFkLXdyaXRlIGZpbGVzeXN0ZW0pLgorICoKKyAqIEluIG9yZGVyIHRvIGtlZXAgdGhlIG9ycGhhbiBpbm9kZSBjaGFpbiBjb25zaXN0ZW50IGR1cmluZyB0cmF2ZXJzYWwgKGluCisgKiBjYXNlIG9mIGNyYXNoIGR1cmluZyByZWNvdmVyeSksIHdlIGxpbmsgZWFjaCBpbm9kZSBpbnRvIHRoZSBzdXBlcmJsb2NrCisgKiBvcnBoYW4gbGlzdF9oZWFkIGFuZCBoYW5kbGUgaXQgdGhlIHNhbWUgd2F5IGFzIGFuIGlub2RlIGRlbGV0aW9uIGR1cmluZworICogbm9ybWFsIG9wZXJhdGlvbiAod2hpY2ggam91cm5hbHMgdGhlIG9wZXJhdGlvbnMgZm9yIHVzKS4KKyAqCisgKiBXZSBvbmx5IGRvIGFuIGlnZXQoKSBhbmQgYW4gaXB1dCgpIG9uIGVhY2ggaW5vZGUsIHdoaWNoIGlzIHZlcnkgc2FmZSBpZiB3ZQorICogYWNjaWRlbnRhbGx5IHBvaW50IGF0IGFuIGluLXVzZSBvciBhbHJlYWR5IGRlbGV0ZWQgaW5vZGUuICBUaGUgd29yc3QgdGhhdAorICogY2FuIGhhcHBlbiBpbiB0aGlzIGNhc2UgaXMgdGhhdCB3ZSBnZXQgYSAiYml0IGFscmVhZHkgY2xlYXJlZCIgbWVzc2FnZSBmcm9tCisgKiBleHQ0X2ZyZWVfaW5vZGUoKS4gIFRoZSBvbmx5IHJlYXNvbiB3ZSB3b3VsZCBwb2ludCBhdCBhIHdyb25nIGlub2RlIGlzIGlmCisgKiBlMmZzY2sgd2FzIHJ1biBvbiB0aGlzIGZpbGVzeXN0ZW0sIGFuZCBpdCBtdXN0IGhhdmUgYWxyZWFkeSBkb25lIHRoZSBvcnBoYW4KKyAqIGlub2RlIGNsZWFudXAgZm9yIHVzLCBzbyB3ZSBjYW4gc2FmZWx5IGFib3J0IHdpdGhvdXQgYW55IGZ1cnRoZXIgYWN0aW9uLgorICovCitzdGF0aWMgdm9pZCBleHQ0X29ycGhhbl9jbGVhbnVwIChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiBzYiwKKwkJCQkgc3RydWN0IGV4dDRfc3VwZXJfYmxvY2sgKiBlcykKK3sKKwl1bnNpZ25lZCBpbnQgc19mbGFncyA9IHNiLT5zX2ZsYWdzOworCWludCBucl9vcnBoYW5zID0gMCwgbnJfdHJ1bmNhdGVzID0gMDsKKyNpZmRlZiBDT05GSUdfUVVPVEEKKwlpbnQgaTsKKyNlbmRpZgorCWlmICghZXMtPnNfbGFzdF9vcnBoYW4pIHsKKwkJamJkX2RlYnVnKDQsICJubyBvcnBoYW4gaW5vZGVzIHRvIGNsZWFuIHVwXG4iKTsKKwkJcmV0dXJuOworCX0KKworCWlmIChFWFQ0X1NCKHNiKS0+c19tb3VudF9zdGF0ZSAmIEVYVDRfRVJST1JfRlMpIHsKKwkJaWYgKGVzLT5zX2xhc3Rfb3JwaGFuKQorCQkJamJkX2RlYnVnKDEsICJFcnJvcnMgb24gZmlsZXN5c3RlbSwgIgorCQkJCSAgImNsZWFyaW5nIG9ycGhhbiBsaXN0LlxuIik7CisJCWVzLT5zX2xhc3Rfb3JwaGFuID0gMDsKKwkJamJkX2RlYnVnKDEsICJTa2lwcGluZyBvcnBoYW4gcmVjb3Zlcnkgb24gZnMgd2l0aCBlcnJvcnMuXG4iKTsKKwkJcmV0dXJuOworCX0KKworCWlmIChzX2ZsYWdzICYgTVNfUkRPTkxZKSB7CisJCXByaW50ayhLRVJOX0lORk8gIkVYVDQtZnM6ICVzOiBvcnBoYW4gY2xlYW51cCBvbiByZWFkb25seSBmc1xuIiwKKwkJICAgICAgIHNiLT5zX2lkKTsKKwkJc2ItPnNfZmxhZ3MgJj0gfk1TX1JET05MWTsKKwl9CisjaWZkZWYgQ09ORklHX1FVT1RBCisJLyogTmVlZGVkIGZvciBpcHV0KCkgdG8gd29yayBjb3JyZWN0bHkgYW5kIG5vdCB0cmFzaCBkYXRhICovCisJc2ItPnNfZmxhZ3MgfD0gTVNfQUNUSVZFOworCS8qIFR1cm4gb24gcXVvdGFzIHNvIHRoYXQgdGhleSBhcmUgdXBkYXRlZCBjb3JyZWN0bHkgKi8KKwlmb3IgKGkgPSAwOyBpIDwgTUFYUVVPVEFTOyBpKyspIHsKKwkJaWYgKEVYVDRfU0Ioc2IpLT5zX3FmX25hbWVzW2ldKSB7CisJCQlpbnQgcmV0ID0gZXh0NF9xdW90YV9vbl9tb3VudChzYiwgaSk7CisJCQlpZiAocmV0IDwgMCkKKwkJCQlwcmludGsoS0VSTl9FUlIKKwkJCQkJIkVYVDQtZnM6IENhbm5vdCB0dXJuIG9uIGpvdXJuYWxsZWQgIgorCQkJCQkicXVvdGE6IGVycm9yICVkXG4iLCByZXQpOworCQl9CisJfQorI2VuZGlmCisKKwl3aGlsZSAoZXMtPnNfbGFzdF9vcnBoYW4pIHsKKwkJc3RydWN0IGlub2RlICppbm9kZTsKKworCQlpZiAoIShpbm9kZSA9CisJCSAgICAgIGV4dDRfb3JwaGFuX2dldChzYiwgbGUzMl90b19jcHUoZXMtPnNfbGFzdF9vcnBoYW4pKSkpIHsKKwkJCWVzLT5zX2xhc3Rfb3JwaGFuID0gMDsKKwkJCWJyZWFrOworCQl9CisKKwkJbGlzdF9hZGQoJkVYVDRfSShpbm9kZSktPmlfb3JwaGFuLCAmRVhUNF9TQihzYiktPnNfb3JwaGFuKTsKKwkJRFFVT1RfSU5JVChpbm9kZSk7CisJCWlmIChpbm9kZS0+aV9ubGluaykgeworCQkJcHJpbnRrKEtFUk5fREVCVUcKKwkJCQkiJXM6IHRydW5jYXRpbmcgaW5vZGUgJWx1IHRvICVMZCBieXRlc1xuIiwKKwkJCQlfX0ZVTkNUSU9OX18sIGlub2RlLT5pX2lubywgaW5vZGUtPmlfc2l6ZSk7CisJCQlqYmRfZGVidWcoMiwgInRydW5jYXRpbmcgaW5vZGUgJWx1IHRvICVMZCBieXRlc1xuIiwKKwkJCQkgIGlub2RlLT5pX2lubywgaW5vZGUtPmlfc2l6ZSk7CisJCQlleHQ0X3RydW5jYXRlKGlub2RlKTsKKwkJCW5yX3RydW5jYXRlcysrOworCQl9IGVsc2UgeworCQkJcHJpbnRrKEtFUk5fREVCVUcKKwkJCQkiJXM6IGRlbGV0aW5nIHVucmVmZXJlbmNlZCBpbm9kZSAlbHVcbiIsCisJCQkJX19GVU5DVElPTl9fLCBpbm9kZS0+aV9pbm8pOworCQkJamJkX2RlYnVnKDIsICJkZWxldGluZyB1bnJlZmVyZW5jZWQgaW5vZGUgJWx1XG4iLAorCQkJCSAgaW5vZGUtPmlfaW5vKTsKKwkJCW5yX29ycGhhbnMrKzsKKwkJfQorCQlpcHV0KGlub2RlKTsgIC8qIFRoZSBkZWxldGUgbWFnaWMgaGFwcGVucyBoZXJlISAqLworCX0KKworI2RlZmluZSBQTFVSQUwoeCkgKHgpLCAoKHgpPT0xKSA/ICIiIDogInMiCisKKwlpZiAobnJfb3JwaGFucykKKwkJcHJpbnRrKEtFUk5fSU5GTyAiRVhUNC1mczogJXM6ICVkIG9ycGhhbiBpbm9kZSVzIGRlbGV0ZWRcbiIsCisJCSAgICAgICBzYi0+c19pZCwgUExVUkFMKG5yX29ycGhhbnMpKTsKKwlpZiAobnJfdHJ1bmNhdGVzKQorCQlwcmludGsoS0VSTl9JTkZPICJFWFQ0LWZzOiAlczogJWQgdHJ1bmNhdGUlcyBjbGVhbmVkIHVwXG4iLAorCQkgICAgICAgc2ItPnNfaWQsIFBMVVJBTChucl90cnVuY2F0ZXMpKTsKKyNpZmRlZiBDT05GSUdfUVVPVEEKKwkvKiBUdXJuIHF1b3RhcyBvZmYgKi8KKwlmb3IgKGkgPSAwOyBpIDwgTUFYUVVPVEFTOyBpKyspIHsKKwkJaWYgKHNiX2Rxb3B0KHNiKS0+ZmlsZXNbaV0pCisJCQl2ZnNfcXVvdGFfb2ZmKHNiLCBpKTsKKwl9CisjZW5kaWYKKwlzYi0+c19mbGFncyA9IHNfZmxhZ3M7IC8qIFJlc3RvcmUgTVNfUkRPTkxZIHN0YXR1cyAqLworfQorCisjZGVmaW5lIGxvZzIobikgZmZ6KH4obikpCisKKy8qCisgKiBNYXhpbWFsIGZpbGUgc2l6ZS4gIFRoZXJlIGlzIGEgZGlyZWN0LCBhbmQgeyxkb3VibGUtLHRyaXBsZS19aW5kaXJlY3QKKyAqIGJsb2NrIGxpbWl0LCBhbmQgYWxzbyBhIGxpbWl0IG9mICgyXjMyIC0gMSkgNTEyLWJ5dGUgc2VjdG9ycyBpbiBpX2Jsb2Nrcy4KKyAqIFdlIG5lZWQgdG8gYmUgMSBmaWxlc3lzdGVtIGJsb2NrIGxlc3MgdGhhbiB0aGUgMl4zMiBzZWN0b3IgbGltaXQuCisgKi8KK3N0YXRpYyBsb2ZmX3QgZXh0NF9tYXhfc2l6ZShpbnQgYml0cykKK3sKKwlsb2ZmX3QgcmVzID0gRVhUNF9ORElSX0JMT0NLUzsKKwkvKiBUaGlzIGNvbnN0YW50IGlzIGNhbGN1bGF0ZWQgdG8gYmUgdGhlIGxhcmdlc3QgZmlsZSBzaXplIGZvciBhCisJICogZGVuc2UsIDRrLWJsb2Nrc2l6ZSBmaWxlIHN1Y2ggdGhhdCB0aGUgdG90YWwgbnVtYmVyIG9mCisJICogc2VjdG9ycyBpbiB0aGUgZmlsZSwgaW5jbHVkaW5nIGRhdGEgYW5kIGFsbCBpbmRpcmVjdCBibG9ja3MsCisJICogZG9lcyBub3QgZXhjZWVkIDJeMzIuICovCisJY29uc3QgbG9mZl90IHVwcGVyX2xpbWl0ID0gMHgxZmY3ZmZmZDAwMExMOworCisJcmVzICs9IDFMTCA8PCAoYml0cy0yKTsKKwlyZXMgKz0gMUxMIDw8ICgyKihiaXRzLTIpKTsKKwlyZXMgKz0gMUxMIDw8ICgzKihiaXRzLTIpKTsKKwlyZXMgPDw9IGJpdHM7CisJaWYgKHJlcyA+IHVwcGVyX2xpbWl0KQorCQlyZXMgPSB1cHBlcl9saW1pdDsKKwlyZXR1cm4gcmVzOworfQorCitzdGF0aWMgZXh0NF9mc2Jsa190IGRlc2NyaXB0b3JfbG9jKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsCisJCQkJZXh0NF9mc2Jsa190IGxvZ2ljYWxfc2JfYmxvY2ssIGludCBucikKK3sKKwlzdHJ1Y3QgZXh0NF9zYl9pbmZvICpzYmkgPSBFWFQ0X1NCKHNiKTsKKwl1bnNpZ25lZCBsb25nIGJnLCBmaXJzdF9tZXRhX2JnOworCWludCBoYXNfc3VwZXIgPSAwOworCisJZmlyc3RfbWV0YV9iZyA9IGxlMzJfdG9fY3B1KHNiaS0+c19lcy0+c19maXJzdF9tZXRhX2JnKTsKKworCWlmICghRVhUNF9IQVNfSU5DT01QQVRfRkVBVFVSRShzYiwgRVhUNF9GRUFUVVJFX0lOQ09NUEFUX01FVEFfQkcpIHx8CisJICAgIG5yIDwgZmlyc3RfbWV0YV9iZykKKwkJcmV0dXJuIGxvZ2ljYWxfc2JfYmxvY2sgKyBuciArIDE7CisJYmcgPSBzYmktPnNfZGVzY19wZXJfYmxvY2sgKiBucjsKKwlpZiAoZXh0NF9iZ19oYXNfc3VwZXIoc2IsIGJnKSkKKwkJaGFzX3N1cGVyID0gMTsKKwlyZXR1cm4gKGhhc19zdXBlciArIGV4dDRfZ3JvdXBfZmlyc3RfYmxvY2tfbm8oc2IsIGJnKSk7Cit9CisKKworc3RhdGljIGludCBleHQ0X2ZpbGxfc3VwZXIgKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHZvaWQgKmRhdGEsIGludCBzaWxlbnQpCit7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICogYmg7CisJc3RydWN0IGV4dDRfc3VwZXJfYmxvY2sgKmVzID0gTlVMTDsKKwlzdHJ1Y3QgZXh0NF9zYl9pbmZvICpzYmk7CisJZXh0NF9mc2Jsa190IGJsb2NrOworCWV4dDRfZnNibGtfdCBzYl9ibG9jayA9IGdldF9zYl9ibG9jaygmZGF0YSk7CisJZXh0NF9mc2Jsa190IGxvZ2ljYWxfc2JfYmxvY2s7CisJdW5zaWduZWQgbG9uZyBvZmZzZXQgPSAwOworCXVuc2lnbmVkIGludCBqb3VybmFsX2ludW0gPSAwOworCXVuc2lnbmVkIGxvbmcgam91cm5hbF9kZXZudW0gPSAwOworCXVuc2lnbmVkIGxvbmcgZGVmX21vdW50X29wdHM7CisJc3RydWN0IGlub2RlICpyb290OworCWludCBibG9ja3NpemU7CisJaW50IGhibG9jazsKKwlpbnQgZGJfY291bnQ7CisJaW50IGk7CisJaW50IG5lZWRzX3JlY292ZXJ5OworCV9fbGUzMiBmZWF0dXJlczsKKwlfX3U2NCBibG9ja3NfY291bnQ7CisKKwlzYmkgPSBremFsbG9jKHNpemVvZigqc2JpKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFzYmkpCisJCXJldHVybiAtRU5PTUVNOworCXNiLT5zX2ZzX2luZm8gPSBzYmk7CisJc2JpLT5zX21vdW50X29wdCA9IDA7CisJc2JpLT5zX3Jlc3VpZCA9IEVYVDRfREVGX1JFU1VJRDsKKwlzYmktPnNfcmVzZ2lkID0gRVhUNF9ERUZfUkVTR0lEOworCisJdW5sb2NrX2tlcm5lbCgpOworCisJYmxvY2tzaXplID0gc2JfbWluX2Jsb2Nrc2l6ZShzYiwgRVhUNF9NSU5fQkxPQ0tfU0laRSk7CisJaWYgKCFibG9ja3NpemUpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJFWFQ0LWZzOiB1bmFibGUgdG8gc2V0IGJsb2Nrc2l6ZVxuIik7CisJCWdvdG8gb3V0X2ZhaWw7CisJfQorCisJLyoKKwkgKiBUaGUgZXh0NCBzdXBlcmJsb2NrIHdpbGwgbm90IGJlIGJ1ZmZlciBhbGlnbmVkIGZvciBvdGhlciB0aGFuIDFrQgorCSAqIGJsb2NrIHNpemVzLiAgV2UgbmVlZCB0byBjYWxjdWxhdGUgdGhlIG9mZnNldCBmcm9tIGJ1ZmZlciBzdGFydC4KKwkgKi8KKwlpZiAoYmxvY2tzaXplICE9IEVYVDRfTUlOX0JMT0NLX1NJWkUpIHsKKwkJbG9naWNhbF9zYl9ibG9jayA9IHNiX2Jsb2NrICogRVhUNF9NSU5fQkxPQ0tfU0laRTsKKwkJb2Zmc2V0ID0gZG9fZGl2KGxvZ2ljYWxfc2JfYmxvY2ssIGJsb2Nrc2l6ZSk7CisJfSBlbHNlIHsKKwkJbG9naWNhbF9zYl9ibG9jayA9IHNiX2Jsb2NrOworCX0KKworCWlmICghKGJoID0gc2JfYnJlYWQoc2IsIGxvZ2ljYWxfc2JfYmxvY2spKSkgeworCQlwcmludGsgKEtFUk5fRVJSICJFWFQ0LWZzOiB1bmFibGUgdG8gcmVhZCBzdXBlcmJsb2NrXG4iKTsKKwkJZ290byBvdXRfZmFpbDsKKwl9CisJLyoKKwkgKiBOb3RlOiBzX2VzIG11c3QgYmUgaW5pdGlhbGl6ZWQgYXMgc29vbiBhcyBwb3NzaWJsZSBiZWNhdXNlCisJICogICAgICAgc29tZSBleHQ0IG1hY3JvLWluc3RydWN0aW9ucyBkZXBlbmQgb24gaXRzIHZhbHVlCisJICovCisJZXMgPSAoc3RydWN0IGV4dDRfc3VwZXJfYmxvY2sgKikgKCgoY2hhciAqKWJoLT5iX2RhdGEpICsgb2Zmc2V0KTsKKwlzYmktPnNfZXMgPSBlczsKKwlzYi0+c19tYWdpYyA9IGxlMTZfdG9fY3B1KGVzLT5zX21hZ2ljKTsKKwlpZiAoc2ItPnNfbWFnaWMgIT0gRVhUNF9TVVBFUl9NQUdJQykKKwkJZ290byBjYW50ZmluZF9leHQ0OworCisJLyogU2V0IGRlZmF1bHRzIGJlZm9yZSB3ZSBwYXJzZSB0aGUgbW91bnQgb3B0aW9ucyAqLworCWRlZl9tb3VudF9vcHRzID0gbGUzMl90b19jcHUoZXMtPnNfZGVmYXVsdF9tb3VudF9vcHRzKTsKKwlpZiAoZGVmX21vdW50X29wdHMgJiBFWFQ0X0RFRk1fREVCVUcpCisJCXNldF9vcHQoc2JpLT5zX21vdW50X29wdCwgREVCVUcpOworCWlmIChkZWZfbW91bnRfb3B0cyAmIEVYVDRfREVGTV9CU0RHUk9VUFMpCisJCXNldF9vcHQoc2JpLT5zX21vdW50X29wdCwgR1JQSUQpOworCWlmIChkZWZfbW91bnRfb3B0cyAmIEVYVDRfREVGTV9VSUQxNikKKwkJc2V0X29wdChzYmktPnNfbW91bnRfb3B0LCBOT19VSUQzMik7CisJaWYgKGRlZl9tb3VudF9vcHRzICYgRVhUNF9ERUZNX1hBVFRSX1VTRVIpCisJCXNldF9vcHQoc2JpLT5zX21vdW50X29wdCwgWEFUVFJfVVNFUik7CisJaWYgKGRlZl9tb3VudF9vcHRzICYgRVhUNF9ERUZNX0FDTCkKKwkJc2V0X29wdChzYmktPnNfbW91bnRfb3B0LCBQT1NJWF9BQ0wpOworCWlmICgoZGVmX21vdW50X29wdHMgJiBFWFQ0X0RFRk1fSk1PREUpID09IEVYVDRfREVGTV9KTU9ERV9EQVRBKQorCQlzYmktPnNfbW91bnRfb3B0IHw9IEVYVDRfTU9VTlRfSk9VUk5BTF9EQVRBOworCWVsc2UgaWYgKChkZWZfbW91bnRfb3B0cyAmIEVYVDRfREVGTV9KTU9ERSkgPT0gRVhUNF9ERUZNX0pNT0RFX09SREVSRUQpCisJCXNiaS0+c19tb3VudF9vcHQgfD0gRVhUNF9NT1VOVF9PUkRFUkVEX0RBVEE7CisJZWxzZSBpZiAoKGRlZl9tb3VudF9vcHRzICYgRVhUNF9ERUZNX0pNT0RFKSA9PSBFWFQ0X0RFRk1fSk1PREVfV0JBQ0spCisJCXNiaS0+c19tb3VudF9vcHQgfD0gRVhUNF9NT1VOVF9XUklURUJBQ0tfREFUQTsKKworCWlmIChsZTE2X3RvX2NwdShzYmktPnNfZXMtPnNfZXJyb3JzKSA9PSBFWFQ0X0VSUk9SU19QQU5JQykKKwkJc2V0X29wdChzYmktPnNfbW91bnRfb3B0LCBFUlJPUlNfUEFOSUMpOworCWVsc2UgaWYgKGxlMTZfdG9fY3B1KHNiaS0+c19lcy0+c19lcnJvcnMpID09IEVYVDRfRVJST1JTX1JPKQorCQlzZXRfb3B0KHNiaS0+c19tb3VudF9vcHQsIEVSUk9SU19STyk7CisJZWxzZQorCQlzZXRfb3B0KHNiaS0+c19tb3VudF9vcHQsIEVSUk9SU19DT05UKTsKKworCXNiaS0+c19yZXN1aWQgPSBsZTE2X3RvX2NwdShlcy0+c19kZWZfcmVzdWlkKTsKKwlzYmktPnNfcmVzZ2lkID0gbGUxNl90b19jcHUoZXMtPnNfZGVmX3Jlc2dpZCk7CisKKwlzZXRfb3B0KHNiaS0+c19tb3VudF9vcHQsIFJFU0VSVkFUSU9OKTsKKworCWlmICghcGFyc2Vfb3B0aW9ucyAoKGNoYXIgKikgZGF0YSwgc2IsICZqb3VybmFsX2ludW0sICZqb3VybmFsX2Rldm51bSwKKwkJCSAgICBOVUxMLCAwKSkKKwkJZ290byBmYWlsZWRfbW91bnQ7CisKKwlzYi0+c19mbGFncyA9IChzYi0+c19mbGFncyAmIH5NU19QT1NJWEFDTCkgfAorCQkoKHNiaS0+c19tb3VudF9vcHQgJiBFWFQ0X01PVU5UX1BPU0lYX0FDTCkgPyBNU19QT1NJWEFDTCA6IDApOworCisJaWYgKGxlMzJfdG9fY3B1KGVzLT5zX3Jldl9sZXZlbCkgPT0gRVhUNF9HT09EX09MRF9SRVYgJiYKKwkgICAgKEVYVDRfSEFTX0NPTVBBVF9GRUFUVVJFKHNiLCB+MFUpIHx8CisJICAgICBFWFQ0X0hBU19ST19DT01QQVRfRkVBVFVSRShzYiwgfjBVKSB8fAorCSAgICAgRVhUNF9IQVNfSU5DT01QQVRfRkVBVFVSRShzYiwgfjBVKSkpCisJCXByaW50ayhLRVJOX1dBUk5JTkcKKwkJICAgICAgICJFWFQ0LWZzIHdhcm5pbmc6IGZlYXR1cmUgZmxhZ3Mgc2V0IG9uIHJldiAwIGZzLCAiCisJCSAgICAgICAicnVubmluZyBlMmZzY2sgaXMgcmVjb21tZW5kZWRcbiIpOworCS8qCisJICogQ2hlY2sgZmVhdHVyZSBmbGFncyByZWdhcmRsZXNzIG9mIHRoZSByZXZpc2lvbiBsZXZlbCwgc2luY2Ugd2UKKwkgKiBwcmV2aW91c2x5IGRpZG4ndCBjaGFuZ2UgdGhlIHJldmlzaW9uIGxldmVsIHdoZW4gc2V0dGluZyB0aGUgZmxhZ3MsCisJICogc28gdGhlcmUgaXMgYSBjaGFuY2UgaW5jb21wYXQgZmxhZ3MgYXJlIHNldCBvbiBhIHJldiAwIGZpbGVzeXN0ZW0uCisJICovCisJZmVhdHVyZXMgPSBFWFQ0X0hBU19JTkNPTVBBVF9GRUFUVVJFKHNiLCB+RVhUNF9GRUFUVVJFX0lOQ09NUEFUX1NVUFApOworCWlmIChmZWF0dXJlcykgeworCQlwcmludGsoS0VSTl9FUlIgIkVYVDQtZnM6ICVzOiBjb3VsZG4ndCBtb3VudCBiZWNhdXNlIG9mICIKKwkJICAgICAgICJ1bnN1cHBvcnRlZCBvcHRpb25hbCBmZWF0dXJlcyAoJXgpLlxuIiwKKwkJICAgICAgIHNiLT5zX2lkLCBsZTMyX3RvX2NwdShmZWF0dXJlcykpOworCQlnb3RvIGZhaWxlZF9tb3VudDsKKwl9CisJZmVhdHVyZXMgPSBFWFQ0X0hBU19ST19DT01QQVRfRkVBVFVSRShzYiwgfkVYVDRfRkVBVFVSRV9ST19DT01QQVRfU1VQUCk7CisJaWYgKCEoc2ItPnNfZmxhZ3MgJiBNU19SRE9OTFkpICYmIGZlYXR1cmVzKSB7CisJCXByaW50ayhLRVJOX0VSUiAiRVhUNC1mczogJXM6IGNvdWxkbid0IG1vdW50IFJEV1IgYmVjYXVzZSBvZiAiCisJCSAgICAgICAidW5zdXBwb3J0ZWQgb3B0aW9uYWwgZmVhdHVyZXMgKCV4KS5cbiIsCisJCSAgICAgICBzYi0+c19pZCwgbGUzMl90b19jcHUoZmVhdHVyZXMpKTsKKwkJZ290byBmYWlsZWRfbW91bnQ7CisJfQorCWJsb2Nrc2l6ZSA9IEJMT0NLX1NJWkUgPDwgbGUzMl90b19jcHUoZXMtPnNfbG9nX2Jsb2NrX3NpemUpOworCisJaWYgKGJsb2Nrc2l6ZSA8IEVYVDRfTUlOX0JMT0NLX1NJWkUgfHwKKwkgICAgYmxvY2tzaXplID4gRVhUNF9NQVhfQkxPQ0tfU0laRSkgeworCQlwcmludGsoS0VSTl9FUlIKKwkJICAgICAgICJFWFQ0LWZzOiBVbnN1cHBvcnRlZCBmaWxlc3lzdGVtIGJsb2Nrc2l6ZSAlZCBvbiAlcy5cbiIsCisJCSAgICAgICBibG9ja3NpemUsIHNiLT5zX2lkKTsKKwkJZ290byBmYWlsZWRfbW91bnQ7CisJfQorCisJaGJsb2NrID0gYmRldl9oYXJkc2VjdF9zaXplKHNiLT5zX2JkZXYpOworCWlmIChzYi0+c19ibG9ja3NpemUgIT0gYmxvY2tzaXplKSB7CisJCS8qCisJCSAqIE1ha2Ugc3VyZSB0aGUgYmxvY2tzaXplIGZvciB0aGUgZmlsZXN5c3RlbSBpcyBsYXJnZXIKKwkJICogdGhhbiB0aGUgaGFyZHdhcmUgc2VjdG9yc2l6ZSBmb3IgdGhlIG1hY2hpbmUuCisJCSAqLworCQlpZiAoYmxvY2tzaXplIDwgaGJsb2NrKSB7CisJCQlwcmludGsoS0VSTl9FUlIgIkVYVDQtZnM6IGJsb2Nrc2l6ZSAlZCB0b28gc21hbGwgZm9yICIKKwkJCSAgICAgICAiZGV2aWNlIGJsb2Nrc2l6ZSAlZC5cbiIsIGJsb2Nrc2l6ZSwgaGJsb2NrKTsKKwkJCWdvdG8gZmFpbGVkX21vdW50OworCQl9CisKKwkJYnJlbHNlIChiaCk7CisJCXNiX3NldF9ibG9ja3NpemUoc2IsIGJsb2Nrc2l6ZSk7CisJCWxvZ2ljYWxfc2JfYmxvY2sgPSBzYl9ibG9jayAqIEVYVDRfTUlOX0JMT0NLX1NJWkU7CisJCW9mZnNldCA9IGRvX2Rpdihsb2dpY2FsX3NiX2Jsb2NrLCBibG9ja3NpemUpOworCQliaCA9IHNiX2JyZWFkKHNiLCBsb2dpY2FsX3NiX2Jsb2NrKTsKKwkJaWYgKCFiaCkgeworCQkJcHJpbnRrKEtFUk5fRVJSCisJCQkgICAgICAgIkVYVDQtZnM6IENhbid0IHJlYWQgc3VwZXJibG9jayBvbiAybmQgdHJ5LlxuIik7CisJCQlnb3RvIGZhaWxlZF9tb3VudDsKKwkJfQorCQllcyA9IChzdHJ1Y3QgZXh0NF9zdXBlcl9ibG9jayAqKSgoKGNoYXIgKiliaC0+Yl9kYXRhKSArIG9mZnNldCk7CisJCXNiaS0+c19lcyA9IGVzOworCQlpZiAoZXMtPnNfbWFnaWMgIT0gY3B1X3RvX2xlMTYoRVhUNF9TVVBFUl9NQUdJQykpIHsKKwkJCXByaW50ayAoS0VSTl9FUlIKKwkJCQkiRVhUNC1mczogTWFnaWMgbWlzbWF0Y2gsIHZlcnkgd2VpcmQgIVxuIik7CisJCQlnb3RvIGZhaWxlZF9tb3VudDsKKwkJfQorCX0KKworCXNiLT5zX21heGJ5dGVzID0gZXh0NF9tYXhfc2l6ZShzYi0+c19ibG9ja3NpemVfYml0cyk7CisKKwlpZiAobGUzMl90b19jcHUoZXMtPnNfcmV2X2xldmVsKSA9PSBFWFQ0X0dPT0RfT0xEX1JFVikgeworCQlzYmktPnNfaW5vZGVfc2l6ZSA9IEVYVDRfR09PRF9PTERfSU5PREVfU0laRTsKKwkJc2JpLT5zX2ZpcnN0X2lubyA9IEVYVDRfR09PRF9PTERfRklSU1RfSU5POworCX0gZWxzZSB7CisJCXNiaS0+c19pbm9kZV9zaXplID0gbGUxNl90b19jcHUoZXMtPnNfaW5vZGVfc2l6ZSk7CisJCXNiaS0+c19maXJzdF9pbm8gPSBsZTMyX3RvX2NwdShlcy0+c19maXJzdF9pbm8pOworCQlpZiAoKHNiaS0+c19pbm9kZV9zaXplIDwgRVhUNF9HT09EX09MRF9JTk9ERV9TSVpFKSB8fAorCQkgICAgKHNiaS0+c19pbm9kZV9zaXplICYgKHNiaS0+c19pbm9kZV9zaXplIC0gMSkpIHx8CisJCSAgICAoc2JpLT5zX2lub2RlX3NpemUgPiBibG9ja3NpemUpKSB7CisJCQlwcmludGsgKEtFUk5fRVJSCisJCQkJIkVYVDQtZnM6IHVuc3VwcG9ydGVkIGlub2RlIHNpemU6ICVkXG4iLAorCQkJCXNiaS0+c19pbm9kZV9zaXplKTsKKwkJCWdvdG8gZmFpbGVkX21vdW50OworCQl9CisJfQorCXNiaS0+c19mcmFnX3NpemUgPSBFWFQ0X01JTl9GUkFHX1NJWkUgPDwKKwkJCQkgICBsZTMyX3RvX2NwdShlcy0+c19sb2dfZnJhZ19zaXplKTsKKwlpZiAoYmxvY2tzaXplICE9IHNiaS0+c19mcmFnX3NpemUpIHsKKwkJcHJpbnRrKEtFUk5fRVJSCisJCSAgICAgICAiRVhUNC1mczogZnJhZ3NpemUgJWx1ICE9IGJsb2Nrc2l6ZSAldSAodW5zdXBwb3J0ZWQpXG4iLAorCQkgICAgICAgc2JpLT5zX2ZyYWdfc2l6ZSwgYmxvY2tzaXplKTsKKwkJZ290byBmYWlsZWRfbW91bnQ7CisJfQorCXNiaS0+c19kZXNjX3NpemUgPSBsZTE2X3RvX2NwdShlcy0+c19kZXNjX3NpemUpOworCWlmIChFWFQ0X0hBU19JTkNPTVBBVF9GRUFUVVJFKHNiLCBFWFQ0X0ZFQVRVUkVfSU5DT01QQVRfNjRCSVQpKSB7CisJCWlmIChzYmktPnNfZGVzY19zaXplIDwgRVhUNF9NSU5fREVTQ19TSVpFXzY0QklUIHx8CisJCSAgICBzYmktPnNfZGVzY19zaXplID4gRVhUNF9NQVhfREVTQ19TSVpFIHx8CisJCSAgICBzYmktPnNfZGVzY19zaXplICYgKHNiaS0+c19kZXNjX3NpemUgLSAxKSkgeworCQkJcHJpbnRrKEtFUk5fRVJSCisJCQkgICAgICAgIkVYVDQtZnM6IHVuc3VwcG9ydGVkIGRlc2NyaXB0b3Igc2l6ZSAlbHVcbiIsCisJCQkgICAgICAgc2JpLT5zX2Rlc2Nfc2l6ZSk7CisJCQlnb3RvIGZhaWxlZF9tb3VudDsKKwkJfQorCX0gZWxzZQorCQlzYmktPnNfZGVzY19zaXplID0gRVhUNF9NSU5fREVTQ19TSVpFOworCXNiaS0+c19ibG9ja3NfcGVyX2dyb3VwID0gbGUzMl90b19jcHUoZXMtPnNfYmxvY2tzX3Blcl9ncm91cCk7CisJc2JpLT5zX2ZyYWdzX3Blcl9ncm91cCA9IGxlMzJfdG9fY3B1KGVzLT5zX2ZyYWdzX3Blcl9ncm91cCk7CisJc2JpLT5zX2lub2Rlc19wZXJfZ3JvdXAgPSBsZTMyX3RvX2NwdShlcy0+c19pbm9kZXNfcGVyX2dyb3VwKTsKKwlpZiAoRVhUNF9JTk9ERV9TSVpFKHNiKSA9PSAwKQorCQlnb3RvIGNhbnRmaW5kX2V4dDQ7CisJc2JpLT5zX2lub2Rlc19wZXJfYmxvY2sgPSBibG9ja3NpemUgLyBFWFQ0X0lOT0RFX1NJWkUoc2IpOworCWlmIChzYmktPnNfaW5vZGVzX3Blcl9ibG9jayA9PSAwKQorCQlnb3RvIGNhbnRmaW5kX2V4dDQ7CisJc2JpLT5zX2l0Yl9wZXJfZ3JvdXAgPSBzYmktPnNfaW5vZGVzX3Blcl9ncm91cCAvCisJCQkJCXNiaS0+c19pbm9kZXNfcGVyX2Jsb2NrOworCXNiaS0+c19kZXNjX3Blcl9ibG9jayA9IGJsb2Nrc2l6ZSAvIEVYVDRfREVTQ19TSVpFKHNiKTsKKwlzYmktPnNfc2JoID0gYmg7CisJc2JpLT5zX21vdW50X3N0YXRlID0gbGUxNl90b19jcHUoZXMtPnNfc3RhdGUpOworCXNiaS0+c19hZGRyX3Blcl9ibG9ja19iaXRzID0gbG9nMihFWFQ0X0FERFJfUEVSX0JMT0NLKHNiKSk7CisJc2JpLT5zX2Rlc2NfcGVyX2Jsb2NrX2JpdHMgPSBsb2cyKEVYVDRfREVTQ19QRVJfQkxPQ0soc2IpKTsKKwlmb3IgKGk9MDsgaSA8IDQ7IGkrKykKKwkJc2JpLT5zX2hhc2hfc2VlZFtpXSA9IGxlMzJfdG9fY3B1KGVzLT5zX2hhc2hfc2VlZFtpXSk7CisJc2JpLT5zX2RlZl9oYXNoX3ZlcnNpb24gPSBlcy0+c19kZWZfaGFzaF92ZXJzaW9uOworCisJaWYgKHNiaS0+c19ibG9ja3NfcGVyX2dyb3VwID4gYmxvY2tzaXplICogOCkgeworCQlwcmludGsgKEtFUk5fRVJSCisJCQkiRVhUNC1mczogI2Jsb2NrcyBwZXIgZ3JvdXAgdG9vIGJpZzogJWx1XG4iLAorCQkJc2JpLT5zX2Jsb2Nrc19wZXJfZ3JvdXApOworCQlnb3RvIGZhaWxlZF9tb3VudDsKKwl9CisJaWYgKHNiaS0+c19mcmFnc19wZXJfZ3JvdXAgPiBibG9ja3NpemUgKiA4KSB7CisJCXByaW50ayAoS0VSTl9FUlIKKwkJCSJFWFQ0LWZzOiAjZnJhZ21lbnRzIHBlciBncm91cCB0b28gYmlnOiAlbHVcbiIsCisJCQlzYmktPnNfZnJhZ3NfcGVyX2dyb3VwKTsKKwkJZ290byBmYWlsZWRfbW91bnQ7CisJfQorCWlmIChzYmktPnNfaW5vZGVzX3Blcl9ncm91cCA+IGJsb2Nrc2l6ZSAqIDgpIHsKKwkJcHJpbnRrIChLRVJOX0VSUgorCQkJIkVYVDQtZnM6ICNpbm9kZXMgcGVyIGdyb3VwIHRvbyBiaWc6ICVsdVxuIiwKKwkJCXNiaS0+c19pbm9kZXNfcGVyX2dyb3VwKTsKKwkJZ290byBmYWlsZWRfbW91bnQ7CisJfQorCisJaWYgKGV4dDRfYmxvY2tzX2NvdW50KGVzKSA+CisJCSAgICAoc2VjdG9yX3QpKH4wVUxMKSA+PiAoc2ItPnNfYmxvY2tzaXplX2JpdHMgLSA5KSkgeworCQlwcmludGsoS0VSTl9FUlIgIkVYVDQtZnM6IGZpbGVzeXN0ZW0gb24gJXM6IgorCQkJIiB0b28gbGFyZ2UgdG8gbW91bnQgc2FmZWx5XG4iLCBzYi0+c19pZCk7CisJCWlmIChzaXplb2Yoc2VjdG9yX3QpIDwgOCkKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgIkVYVDQtZnM6IENPTkZJR19MQkQgbm90ICIKKwkJCQkJImVuYWJsZWRcbiIpOworCQlnb3RvIGZhaWxlZF9tb3VudDsKKwl9CisKKwlpZiAoRVhUNF9CTE9DS1NfUEVSX0dST1VQKHNiKSA9PSAwKQorCQlnb3RvIGNhbnRmaW5kX2V4dDQ7CisJYmxvY2tzX2NvdW50ID0gKGV4dDRfYmxvY2tzX2NvdW50KGVzKSAtCisJCQlsZTMyX3RvX2NwdShlcy0+c19maXJzdF9kYXRhX2Jsb2NrKSArCisJCQlFWFQ0X0JMT0NLU19QRVJfR1JPVVAoc2IpIC0gMSk7CisJZG9fZGl2KGJsb2Nrc19jb3VudCwgRVhUNF9CTE9DS1NfUEVSX0dST1VQKHNiKSk7CisJc2JpLT5zX2dyb3Vwc19jb3VudCA9IGJsb2Nrc19jb3VudDsKKwlkYl9jb3VudCA9IChzYmktPnNfZ3JvdXBzX2NvdW50ICsgRVhUNF9ERVNDX1BFUl9CTE9DSyhzYikgLSAxKSAvCisJCSAgIEVYVDRfREVTQ19QRVJfQkxPQ0soc2IpOworCXNiaS0+c19ncm91cF9kZXNjID0ga21hbGxvYyhkYl9jb3VudCAqIHNpemVvZiAoc3RydWN0IGJ1ZmZlcl9oZWFkICopLAorCQkJCSAgICBHRlBfS0VSTkVMKTsKKwlpZiAoc2JpLT5zX2dyb3VwX2Rlc2MgPT0gTlVMTCkgeworCQlwcmludGsgKEtFUk5fRVJSICJFWFQ0LWZzOiBub3QgZW5vdWdoIG1lbW9yeVxuIik7CisJCWdvdG8gZmFpbGVkX21vdW50OworCX0KKworCWJnbF9sb2NrX2luaXQoJnNiaS0+c19ibG9ja2dyb3VwX2xvY2spOworCisJZm9yIChpID0gMDsgaSA8IGRiX2NvdW50OyBpKyspIHsKKwkJYmxvY2sgPSBkZXNjcmlwdG9yX2xvYyhzYiwgbG9naWNhbF9zYl9ibG9jaywgaSk7CisJCXNiaS0+c19ncm91cF9kZXNjW2ldID0gc2JfYnJlYWQoc2IsIGJsb2NrKTsKKwkJaWYgKCFzYmktPnNfZ3JvdXBfZGVzY1tpXSkgeworCQkJcHJpbnRrIChLRVJOX0VSUiAiRVhUNC1mczogIgorCQkJCSJjYW4ndCByZWFkIGdyb3VwIGRlc2NyaXB0b3IgJWRcbiIsIGkpOworCQkJZGJfY291bnQgPSBpOworCQkJZ290byBmYWlsZWRfbW91bnQyOworCQl9CisJfQorCWlmICghZXh0NF9jaGVja19kZXNjcmlwdG9ycyAoc2IpKSB7CisJCXByaW50ayhLRVJOX0VSUiAiRVhUNC1mczogZ3JvdXAgZGVzY3JpcHRvcnMgY29ycnVwdGVkIVxuIik7CisJCWdvdG8gZmFpbGVkX21vdW50MjsKKwl9CisJc2JpLT5zX2dkYl9jb3VudCA9IGRiX2NvdW50OworCWdldF9yYW5kb21fYnl0ZXMoJnNiaS0+c19uZXh0X2dlbmVyYXRpb24sIHNpemVvZih1MzIpKTsKKwlzcGluX2xvY2tfaW5pdCgmc2JpLT5zX25leHRfZ2VuX2xvY2spOworCisJcGVyY3B1X2NvdW50ZXJfaW5pdCgmc2JpLT5zX2ZyZWVibG9ja3NfY291bnRlciwKKwkJZXh0NF9jb3VudF9mcmVlX2Jsb2NrcyhzYikpOworCXBlcmNwdV9jb3VudGVyX2luaXQoJnNiaS0+c19mcmVlaW5vZGVzX2NvdW50ZXIsCisJCWV4dDRfY291bnRfZnJlZV9pbm9kZXMoc2IpKTsKKwlwZXJjcHVfY291bnRlcl9pbml0KCZzYmktPnNfZGlyc19jb3VudGVyLAorCQlleHQ0X2NvdW50X2RpcnMoc2IpKTsKKworCS8qIHBlciBmaWxleXN0ZW0gcmVzZXJ2YXRpb24gbGlzdCBoZWFkICYgbG9jayAqLworCXNwaW5fbG9ja19pbml0KCZzYmktPnNfcnN2X3dpbmRvd19sb2NrKTsKKwlzYmktPnNfcnN2X3dpbmRvd19yb290ID0gUkJfUk9PVDsKKwkvKiBBZGQgYSBzaW5nbGUsIHN0YXRpYyBkdW1teSByZXNlcnZhdGlvbiB0byB0aGUgc3RhcnQgb2YgdGhlCisJICogcmVzZXJ2YXRpb24gd2luZG93IGxpc3QgLS0tIGl0IGdpdmVzIHVzIGEgcGxhY2Vob2xkZXIgZm9yCisJICogYXBwZW5kLWF0LXN0YXJ0LW9mLWxpc3Qgd2hpY2ggbWFrZXMgdGhlIGFsbG9jYXRpb24gbG9naWMKKwkgKiBfbXVjaF8gc2ltcGxlci4gKi8KKwlzYmktPnNfcnN2X3dpbmRvd19oZWFkLnJzdl9zdGFydCA9IEVYVDRfUkVTRVJWRV9XSU5ET1dfTk9UX0FMTE9DQVRFRDsKKwlzYmktPnNfcnN2X3dpbmRvd19oZWFkLnJzdl9lbmQgPSBFWFQ0X1JFU0VSVkVfV0lORE9XX05PVF9BTExPQ0FURUQ7CisJc2JpLT5zX3Jzdl93aW5kb3dfaGVhZC5yc3ZfYWxsb2NfaGl0ID0gMDsKKwlzYmktPnNfcnN2X3dpbmRvd19oZWFkLnJzdl9nb2FsX3NpemUgPSAwOworCWV4dDRfcnN2X3dpbmRvd19hZGQoc2IsICZzYmktPnNfcnN2X3dpbmRvd19oZWFkKTsKKworCS8qCisJICogc2V0IHVwIGVub3VnaCBzbyB0aGF0IGl0IGNhbiByZWFkIGFuIGlub2RlCisJICovCisJc2ItPnNfb3AgPSAmZXh0NF9zb3BzOworCXNiLT5zX2V4cG9ydF9vcCA9ICZleHQ0X2V4cG9ydF9vcHM7CisJc2ItPnNfeGF0dHIgPSBleHQ0X3hhdHRyX2hhbmRsZXJzOworI2lmZGVmIENPTkZJR19RVU9UQQorCXNiLT5zX3Fjb3AgPSAmZXh0NF9xY3RsX29wZXJhdGlvbnM7CisJc2ItPmRxX29wID0gJmV4dDRfcXVvdGFfb3BlcmF0aW9uczsKKyNlbmRpZgorCUlOSVRfTElTVF9IRUFEKCZzYmktPnNfb3JwaGFuKTsgLyogdW5saW5rZWQgYnV0IG9wZW4gZmlsZXMgKi8KKworCXNiLT5zX3Jvb3QgPSBOVUxMOworCisJbmVlZHNfcmVjb3ZlcnkgPSAoZXMtPnNfbGFzdF9vcnBoYW4gIT0gMCB8fAorCQkJICBFWFQ0X0hBU19JTkNPTVBBVF9GRUFUVVJFKHNiLAorCQkJCSAgICBFWFQ0X0ZFQVRVUkVfSU5DT01QQVRfUkVDT1ZFUikpOworCisJLyoKKwkgKiBUaGUgZmlyc3QgaW5vZGUgd2UgbG9vayBhdCBpcyB0aGUgam91cm5hbCBpbm9kZS4gIERvbid0IHRyeQorCSAqIHJvb3QgZmlyc3Q6IGl0IG1heSBiZSBtb2RpZmllZCBpbiB0aGUgam91cm5hbCEKKwkgKi8KKwlpZiAoIXRlc3Rfb3B0KHNiLCBOT0xPQUQpICYmCisJICAgIEVYVDRfSEFTX0NPTVBBVF9GRUFUVVJFKHNiLCBFWFQ0X0ZFQVRVUkVfQ09NUEFUX0hBU19KT1VSTkFMKSkgeworCQlpZiAoZXh0NF9sb2FkX2pvdXJuYWwoc2IsIGVzLCBqb3VybmFsX2Rldm51bSkpCisJCQlnb3RvIGZhaWxlZF9tb3VudDM7CisJfSBlbHNlIGlmIChqb3VybmFsX2ludW0pIHsKKwkJaWYgKGV4dDRfY3JlYXRlX2pvdXJuYWwoc2IsIGVzLCBqb3VybmFsX2ludW0pKQorCQkJZ290byBmYWlsZWRfbW91bnQzOworCX0gZWxzZSB7CisJCWlmICghc2lsZW50KQorCQkJcHJpbnRrIChLRVJOX0VSUgorCQkJCSJleHQ0OiBObyBqb3VybmFsIG9uIGZpbGVzeXN0ZW0gb24gJXNcbiIsCisJCQkJc2ItPnNfaWQpOworCQlnb3RvIGZhaWxlZF9tb3VudDM7CisJfQorCisJLyogV2UgaGF2ZSBub3cgdXBkYXRlZCB0aGUgam91cm5hbCBpZiByZXF1aXJlZCwgc28gd2UgY2FuCisJICogdmFsaWRhdGUgdGhlIGRhdGEgam91cm5hbGluZyBtb2RlLiAqLworCXN3aXRjaCAodGVzdF9vcHQoc2IsIERBVEFfRkxBR1MpKSB7CisJY2FzZSAwOgorCQkvKiBObyBtb2RlIHNldCwgYXNzdW1lIGEgZGVmYXVsdCBiYXNlZCBvbiB0aGUgam91cm5hbAorCQkgKiBjYXBhYmlsaXRpZXM6IE9SREVSRURfREFUQSBpZiB0aGUgam91cm5hbCBjYW4KKwkJICogY29wZSwgZWxzZSBKT1VSTkFMX0RBVEEKKwkJICovCisJCWlmIChqYmQyX2pvdXJuYWxfY2hlY2tfYXZhaWxhYmxlX2ZlYXR1cmVzCisJCSAgICAoc2JpLT5zX2pvdXJuYWwsIDAsIDAsIEpCRDJfRkVBVFVSRV9JTkNPTVBBVF9SRVZPS0UpKQorCQkJc2V0X29wdChzYmktPnNfbW91bnRfb3B0LCBPUkRFUkVEX0RBVEEpOworCQllbHNlCisJCQlzZXRfb3B0KHNiaS0+c19tb3VudF9vcHQsIEpPVVJOQUxfREFUQSk7CisJCWJyZWFrOworCisJY2FzZSBFWFQ0X01PVU5UX09SREVSRURfREFUQToKKwljYXNlIEVYVDRfTU9VTlRfV1JJVEVCQUNLX0RBVEE6CisJCWlmICghamJkMl9qb3VybmFsX2NoZWNrX2F2YWlsYWJsZV9mZWF0dXJlcworCQkgICAgKHNiaS0+c19qb3VybmFsLCAwLCAwLCBKQkQyX0ZFQVRVUkVfSU5DT01QQVRfUkVWT0tFKSkgeworCQkJcHJpbnRrKEtFUk5fRVJSICJFWFQ0LWZzOiBKb3VybmFsIGRvZXMgbm90IHN1cHBvcnQgIgorCQkJICAgICAgICJyZXF1ZXN0ZWQgZGF0YSBqb3VybmFsaW5nIG1vZGVcbiIpOworCQkJZ290byBmYWlsZWRfbW91bnQ0OworCQl9CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCisJaWYgKHRlc3Rfb3B0KHNiLCBOT0JIKSkgeworCQlpZiAoISh0ZXN0X29wdChzYiwgREFUQV9GTEFHUykgPT0gRVhUNF9NT1VOVF9XUklURUJBQ0tfREFUQSkpIHsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgIkVYVDQtZnM6IElnbm9yaW5nIG5vYmggb3B0aW9uIC0gIgorCQkJCSJpdHMgc3VwcG9ydGVkIG9ubHkgd2l0aCB3cml0ZWJhY2sgbW9kZVxuIik7CisJCQljbGVhcl9vcHQoc2JpLT5zX21vdW50X29wdCwgTk9CSCk7CisJCX0KKwl9CisJLyoKKwkgKiBUaGUgamJkMl9qb3VybmFsX2xvYWQgd2lsbCBoYXZlIGRvbmUgYW55IG5lY2Vzc2FyeSBsb2cgcmVjb3ZlcnksCisJICogc28gd2UgY2FuIHNhZmVseSBtb3VudCB0aGUgcmVzdCBvZiB0aGUgZmlsZXN5c3RlbSBub3cuCisJICovCisKKwlyb290ID0gaWdldChzYiwgRVhUNF9ST09UX0lOTyk7CisJc2ItPnNfcm9vdCA9IGRfYWxsb2Nfcm9vdChyb290KTsKKwlpZiAoIXNiLT5zX3Jvb3QpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJFWFQ0LWZzOiBnZXQgcm9vdCBpbm9kZSBmYWlsZWRcbiIpOworCQlpcHV0KHJvb3QpOworCQlnb3RvIGZhaWxlZF9tb3VudDQ7CisJfQorCWlmICghU19JU0RJUihyb290LT5pX21vZGUpIHx8ICFyb290LT5pX2Jsb2NrcyB8fCAhcm9vdC0+aV9zaXplKSB7CisJCWRwdXQoc2ItPnNfcm9vdCk7CisJCXNiLT5zX3Jvb3QgPSBOVUxMOworCQlwcmludGsoS0VSTl9FUlIgIkVYVDQtZnM6IGNvcnJ1cHQgcm9vdCBpbm9kZSwgcnVuIGUyZnNja1xuIik7CisJCWdvdG8gZmFpbGVkX21vdW50NDsKKwl9CisKKwlleHQ0X3NldHVwX3N1cGVyIChzYiwgZXMsIHNiLT5zX2ZsYWdzICYgTVNfUkRPTkxZKTsKKwkvKgorCSAqIGFrcG06IGNvcmUgcmVhZF9zdXBlcigpIGNhbGxzIGluIGhlcmUgd2l0aCB0aGUgc3VwZXJibG9jayBsb2NrZWQuCisJICogVGhhdCBkZWFkbG9ja3MsIGJlY2F1c2Ugb3JwaGFuIGNsZWFudXAgbmVlZHMgdG8gbG9jayB0aGUgc3VwZXJibG9jaworCSAqIGluIG51bWVyb3VzIHBsYWNlcy4gIEhlcmUgd2UganVzdCBwb3AgdGhlIGxvY2sgLSBpdCdzIHJlbGF0aXZlbHkKKwkgKiBoYXJtbGVzcywgYmVjYXVzZSB3ZSBhcmUgbm93IHJlYWR5IHRvIGFjY2VwdCB3cml0ZV9zdXBlcigpIHJlcXVlc3RzLAorCSAqIGFuZCBhdmlybyBzYXlzIHRoYXQncyB0aGUgb25seSByZWFzb24gZm9yIGhhbmdpbmcgb250byB0aGUKKwkgKiBzdXBlcmJsb2NrIGxvY2suCisJICovCisJRVhUNF9TQihzYiktPnNfbW91bnRfc3RhdGUgfD0gRVhUNF9PUlBIQU5fRlM7CisJZXh0NF9vcnBoYW5fY2xlYW51cChzYiwgZXMpOworCUVYVDRfU0Ioc2IpLT5zX21vdW50X3N0YXRlICY9IH5FWFQ0X09SUEhBTl9GUzsKKwlpZiAobmVlZHNfcmVjb3ZlcnkpCisJCXByaW50ayAoS0VSTl9JTkZPICJFWFQ0LWZzOiByZWNvdmVyeSBjb21wbGV0ZS5cbiIpOworCWV4dDRfbWFya19yZWNvdmVyeV9jb21wbGV0ZShzYiwgZXMpOworCXByaW50ayAoS0VSTl9JTkZPICJFWFQ0LWZzOiBtb3VudGVkIGZpbGVzeXN0ZW0gd2l0aCAlcyBkYXRhIG1vZGUuXG4iLAorCQl0ZXN0X29wdChzYixEQVRBX0ZMQUdTKSA9PSBFWFQ0X01PVU5UX0pPVVJOQUxfREFUQSA/ICJqb3VybmFsIjoKKwkJdGVzdF9vcHQoc2IsREFUQV9GTEFHUykgPT0gRVhUNF9NT1VOVF9PUkRFUkVEX0RBVEEgPyAib3JkZXJlZCI6CisJCSJ3cml0ZWJhY2siKTsKKworCWV4dDRfZXh0X2luaXQoc2IpOworCisJbG9ja19rZXJuZWwoKTsKKwlyZXR1cm4gMDsKKworY2FudGZpbmRfZXh0NDoKKwlpZiAoIXNpbGVudCkKKwkJcHJpbnRrKEtFUk5fRVJSICJWRlM6IENhbid0IGZpbmQgZXh0NCBmaWxlc3lzdGVtIG9uIGRldiAlcy5cbiIsCisJCSAgICAgICBzYi0+c19pZCk7CisJZ290byBmYWlsZWRfbW91bnQ7CisKK2ZhaWxlZF9tb3VudDQ6CisJamJkMl9qb3VybmFsX2Rlc3Ryb3koc2JpLT5zX2pvdXJuYWwpOworZmFpbGVkX21vdW50MzoKKwlwZXJjcHVfY291bnRlcl9kZXN0cm95KCZzYmktPnNfZnJlZWJsb2Nrc19jb3VudGVyKTsKKwlwZXJjcHVfY291bnRlcl9kZXN0cm95KCZzYmktPnNfZnJlZWlub2Rlc19jb3VudGVyKTsKKwlwZXJjcHVfY291bnRlcl9kZXN0cm95KCZzYmktPnNfZGlyc19jb3VudGVyKTsKK2ZhaWxlZF9tb3VudDI6CisJZm9yIChpID0gMDsgaSA8IGRiX2NvdW50OyBpKyspCisJCWJyZWxzZShzYmktPnNfZ3JvdXBfZGVzY1tpXSk7CisJa2ZyZWUoc2JpLT5zX2dyb3VwX2Rlc2MpOworZmFpbGVkX21vdW50OgorI2lmZGVmIENPTkZJR19RVU9UQQorCWZvciAoaSA9IDA7IGkgPCBNQVhRVU9UQVM7IGkrKykKKwkJa2ZyZWUoc2JpLT5zX3FmX25hbWVzW2ldKTsKKyNlbmRpZgorCWV4dDRfYmxrZGV2X3JlbW92ZShzYmkpOworCWJyZWxzZShiaCk7CitvdXRfZmFpbDoKKwlzYi0+c19mc19pbmZvID0gTlVMTDsKKwlrZnJlZShzYmkpOworCWxvY2tfa2VybmVsKCk7CisJcmV0dXJuIC1FSU5WQUw7Cit9CisKKy8qCisgKiBTZXR1cCBhbnkgcGVyLWZzIGpvdXJuYWwgcGFyYW1ldGVycyBub3cuICBXZSdsbCBkbyB0aGlzIGJvdGggb24KKyAqIGluaXRpYWwgbW91bnQsIG9uY2UgdGhlIGpvdXJuYWwgaGFzIGJlZW4gaW5pdGlhbGlzZWQgYnV0IGJlZm9yZSB3ZSd2ZQorICogZG9uZSBhbnkgcmVjb3Zlcnk7IGFuZCBhZ2FpbiBvbiBhbnkgc3Vic2VxdWVudCByZW1vdW50LgorICovCitzdGF0aWMgdm9pZCBleHQ0X2luaXRfam91cm5hbF9wYXJhbXMoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgam91cm5hbF90ICpqb3VybmFsKQoreworCXN0cnVjdCBleHQ0X3NiX2luZm8gKnNiaSA9IEVYVDRfU0Ioc2IpOworCisJaWYgKHNiaS0+c19jb21taXRfaW50ZXJ2YWwpCisJCWpvdXJuYWwtPmpfY29tbWl0X2ludGVydmFsID0gc2JpLT5zX2NvbW1pdF9pbnRlcnZhbDsKKwkvKiBXZSBjb3VsZCBhbHNvIHNldCB1cCBhbiBleHQ0LXNwZWNpZmljIGRlZmF1bHQgZm9yIHRoZSBjb21taXQKKwkgKiBpbnRlcnZhbCBoZXJlLCBidXQgZm9yIG5vdyB3ZSdsbCBqdXN0IGZhbGwgYmFjayB0byB0aGUgamJkCisJICogZGVmYXVsdC4gKi8KKworCXNwaW5fbG9jaygmam91cm5hbC0+al9zdGF0ZV9sb2NrKTsKKwlpZiAodGVzdF9vcHQoc2IsIEJBUlJJRVIpKQorCQlqb3VybmFsLT5qX2ZsYWdzIHw9IEpCRDJfQkFSUklFUjsKKwllbHNlCisJCWpvdXJuYWwtPmpfZmxhZ3MgJj0gfkpCRDJfQkFSUklFUjsKKwlzcGluX3VubG9jaygmam91cm5hbC0+al9zdGF0ZV9sb2NrKTsKK30KKworc3RhdGljIGpvdXJuYWxfdCAqZXh0NF9nZXRfam91cm5hbChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLAorCQkJCSAgIHVuc2lnbmVkIGludCBqb3VybmFsX2ludW0pCit7CisJc3RydWN0IGlub2RlICpqb3VybmFsX2lub2RlOworCWpvdXJuYWxfdCAqam91cm5hbDsKKworCS8qIEZpcnN0LCB0ZXN0IGZvciB0aGUgZXhpc3RlbmNlIG9mIGEgdmFsaWQgaW5vZGUgb24gZGlzay4gIEJhZAorCSAqIHRoaW5ncyBoYXBwZW4gaWYgd2UgaWdldCgpIGFuIHVudXNlZCBpbm9kZSwgYXMgdGhlIHN1YnNlcXVlbnQKKwkgKiBpcHV0KCkgd2lsbCB0cnkgdG8gZGVsZXRlIGl0LiAqLworCisJam91cm5hbF9pbm9kZSA9IGlnZXQoc2IsIGpvdXJuYWxfaW51bSk7CisJaWYgKCFqb3VybmFsX2lub2RlKSB7CisJCXByaW50ayhLRVJOX0VSUiAiRVhUNC1mczogbm8gam91cm5hbCBmb3VuZC5cbiIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisJaWYgKCFqb3VybmFsX2lub2RlLT5pX25saW5rKSB7CisJCW1ha2VfYmFkX2lub2RlKGpvdXJuYWxfaW5vZGUpOworCQlpcHV0KGpvdXJuYWxfaW5vZGUpOworCQlwcmludGsoS0VSTl9FUlIgIkVYVDQtZnM6IGpvdXJuYWwgaW5vZGUgaXMgZGVsZXRlZC5cbiIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlqYmRfZGVidWcoMiwgIkpvdXJuYWwgaW5vZGUgZm91bmQgYXQgJXA6ICVMZCBieXRlc1xuIiwKKwkJICBqb3VybmFsX2lub2RlLCBqb3VybmFsX2lub2RlLT5pX3NpemUpOworCWlmIChpc19iYWRfaW5vZGUoam91cm5hbF9pbm9kZSkgfHwgIVNfSVNSRUcoam91cm5hbF9pbm9kZS0+aV9tb2RlKSkgeworCQlwcmludGsoS0VSTl9FUlIgIkVYVDQtZnM6IGludmFsaWQgam91cm5hbCBpbm9kZS5cbiIpOworCQlpcHV0KGpvdXJuYWxfaW5vZGUpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlqb3VybmFsID0gamJkMl9qb3VybmFsX2luaXRfaW5vZGUoam91cm5hbF9pbm9kZSk7CisJaWYgKCFqb3VybmFsKSB7CisJCXByaW50ayhLRVJOX0VSUiAiRVhUNC1mczogQ291bGQgbm90IGxvYWQgam91cm5hbCBpbm9kZVxuIik7CisJCWlwdXQoam91cm5hbF9pbm9kZSk7CisJCXJldHVybiBOVUxMOworCX0KKwlqb3VybmFsLT5qX3ByaXZhdGUgPSBzYjsKKwlleHQ0X2luaXRfam91cm5hbF9wYXJhbXMoc2IsIGpvdXJuYWwpOworCXJldHVybiBqb3VybmFsOworfQorCitzdGF0aWMgam91cm5hbF90ICpleHQ0X2dldF9kZXZfam91cm5hbChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLAorCQkJCSAgICAgICBkZXZfdCBqX2RldikKK3sKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKiBiaDsKKwlqb3VybmFsX3QgKmpvdXJuYWw7CisJZXh0NF9mc2Jsa190IHN0YXJ0OworCWV4dDRfZnNibGtfdCBsZW47CisJaW50IGhibG9jaywgYmxvY2tzaXplOworCWV4dDRfZnNibGtfdCBzYl9ibG9jazsKKwl1bnNpZ25lZCBsb25nIG9mZnNldDsKKwlzdHJ1Y3QgZXh0NF9zdXBlcl9ibG9jayAqIGVzOworCXN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXY7CisKKwliZGV2ID0gZXh0NF9ibGtkZXZfZ2V0KGpfZGV2KTsKKwlpZiAoYmRldiA9PSBOVUxMKQorCQlyZXR1cm4gTlVMTDsKKworCWlmIChiZF9jbGFpbShiZGV2LCBzYikpIHsKKwkJcHJpbnRrKEtFUk5fRVJSCisJCSAgICAgICAgIkVYVDQ6IGZhaWxlZCB0byBjbGFpbSBleHRlcm5hbCBqb3VybmFsIGRldmljZS5cbiIpOworCQlibGtkZXZfcHV0KGJkZXYpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlibG9ja3NpemUgPSBzYi0+c19ibG9ja3NpemU7CisJaGJsb2NrID0gYmRldl9oYXJkc2VjdF9zaXplKGJkZXYpOworCWlmIChibG9ja3NpemUgPCBoYmxvY2spIHsKKwkJcHJpbnRrKEtFUk5fRVJSCisJCQkiRVhUNC1mczogYmxvY2tzaXplIHRvbyBzbWFsbCBmb3Igam91cm5hbCBkZXZpY2UuXG4iKTsKKwkJZ290byBvdXRfYmRldjsKKwl9CisKKwlzYl9ibG9jayA9IEVYVDRfTUlOX0JMT0NLX1NJWkUgLyBibG9ja3NpemU7CisJb2Zmc2V0ID0gRVhUNF9NSU5fQkxPQ0tfU0laRSAlIGJsb2Nrc2l6ZTsKKwlzZXRfYmxvY2tzaXplKGJkZXYsIGJsb2Nrc2l6ZSk7CisJaWYgKCEoYmggPSBfX2JyZWFkKGJkZXYsIHNiX2Jsb2NrLCBibG9ja3NpemUpKSkgeworCQlwcmludGsoS0VSTl9FUlIgIkVYVDQtZnM6IGNvdWxkbid0IHJlYWQgc3VwZXJibG9jayBvZiAiCisJCSAgICAgICAiZXh0ZXJuYWwgam91cm5hbFxuIik7CisJCWdvdG8gb3V0X2JkZXY7CisJfQorCisJZXMgPSAoc3RydWN0IGV4dDRfc3VwZXJfYmxvY2sgKikgKCgoY2hhciAqKWJoLT5iX2RhdGEpICsgb2Zmc2V0KTsKKwlpZiAoKGxlMTZfdG9fY3B1KGVzLT5zX21hZ2ljKSAhPSBFWFQ0X1NVUEVSX01BR0lDKSB8fAorCSAgICAhKGxlMzJfdG9fY3B1KGVzLT5zX2ZlYXR1cmVfaW5jb21wYXQpICYKKwkgICAgICBFWFQ0X0ZFQVRVUkVfSU5DT01QQVRfSk9VUk5BTF9ERVYpKSB7CisJCXByaW50ayhLRVJOX0VSUiAiRVhUNC1mczogZXh0ZXJuYWwgam91cm5hbCBoYXMgIgorCQkJCQkiYmFkIHN1cGVyYmxvY2tcbiIpOworCQlicmVsc2UoYmgpOworCQlnb3RvIG91dF9iZGV2OworCX0KKworCWlmIChtZW1jbXAoRVhUNF9TQihzYiktPnNfZXMtPnNfam91cm5hbF91dWlkLCBlcy0+c191dWlkLCAxNikpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJFWFQ0LWZzOiBqb3VybmFsIFVVSUQgZG9lcyBub3QgbWF0Y2hcbiIpOworCQlicmVsc2UoYmgpOworCQlnb3RvIG91dF9iZGV2OworCX0KKworCWxlbiA9IGV4dDRfYmxvY2tzX2NvdW50KGVzKTsKKwlzdGFydCA9IHNiX2Jsb2NrICsgMTsKKwlicmVsc2UoYmgpOwkvKiB3ZSdyZSBkb25lIHdpdGggdGhlIHN1cGVyYmxvY2sgKi8KKworCWpvdXJuYWwgPSBqYmQyX2pvdXJuYWxfaW5pdF9kZXYoYmRldiwgc2ItPnNfYmRldiwKKwkJCQkJc3RhcnQsIGxlbiwgYmxvY2tzaXplKTsKKwlpZiAoIWpvdXJuYWwpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJFWFQ0LWZzOiBmYWlsZWQgdG8gY3JlYXRlIGRldmljZSBqb3VybmFsXG4iKTsKKwkJZ290byBvdXRfYmRldjsKKwl9CisJam91cm5hbC0+al9wcml2YXRlID0gc2I7CisJbGxfcndfYmxvY2soUkVBRCwgMSwgJmpvdXJuYWwtPmpfc2JfYnVmZmVyKTsKKwl3YWl0X29uX2J1ZmZlcihqb3VybmFsLT5qX3NiX2J1ZmZlcik7CisJaWYgKCFidWZmZXJfdXB0b2RhdGUoam91cm5hbC0+al9zYl9idWZmZXIpKSB7CisJCXByaW50ayhLRVJOX0VSUiAiRVhUNC1mczogSS9PIGVycm9yIG9uIGpvdXJuYWwgZGV2aWNlXG4iKTsKKwkJZ290byBvdXRfam91cm5hbDsKKwl9CisJaWYgKGJlMzJfdG9fY3B1KGpvdXJuYWwtPmpfc3VwZXJibG9jay0+c19ucl91c2VycykgIT0gMSkgeworCQlwcmludGsoS0VSTl9FUlIgIkVYVDQtZnM6IEV4dGVybmFsIGpvdXJuYWwgaGFzIG1vcmUgdGhhbiBvbmUgIgorCQkJCQkidXNlciAodW5zdXBwb3J0ZWQpIC0gJWRcbiIsCisJCQliZTMyX3RvX2NwdShqb3VybmFsLT5qX3N1cGVyYmxvY2stPnNfbnJfdXNlcnMpKTsKKwkJZ290byBvdXRfam91cm5hbDsKKwl9CisJRVhUNF9TQihzYiktPmpvdXJuYWxfYmRldiA9IGJkZXY7CisJZXh0NF9pbml0X2pvdXJuYWxfcGFyYW1zKHNiLCBqb3VybmFsKTsKKwlyZXR1cm4gam91cm5hbDsKK291dF9qb3VybmFsOgorCWpiZDJfam91cm5hbF9kZXN0cm95KGpvdXJuYWwpOworb3V0X2JkZXY6CisJZXh0NF9ibGtkZXZfcHV0KGJkZXYpOworCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgaW50IGV4dDRfbG9hZF9qb3VybmFsKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsCisJCQkgICAgIHN0cnVjdCBleHQ0X3N1cGVyX2Jsb2NrICplcywKKwkJCSAgICAgdW5zaWduZWQgbG9uZyBqb3VybmFsX2Rldm51bSkKK3sKKwlqb3VybmFsX3QgKmpvdXJuYWw7CisJdW5zaWduZWQgaW50IGpvdXJuYWxfaW51bSA9IGxlMzJfdG9fY3B1KGVzLT5zX2pvdXJuYWxfaW51bSk7CisJZGV2X3Qgam91cm5hbF9kZXY7CisJaW50IGVyciA9IDA7CisJaW50IHJlYWxseV9yZWFkX29ubHk7CisKKwlpZiAoam91cm5hbF9kZXZudW0gJiYKKwkgICAgam91cm5hbF9kZXZudW0gIT0gbGUzMl90b19jcHUoZXMtPnNfam91cm5hbF9kZXYpKSB7CisJCXByaW50ayhLRVJOX0lORk8gIkVYVDQtZnM6IGV4dGVybmFsIGpvdXJuYWwgZGV2aWNlIG1ham9yL21pbm9yICIKKwkJCSJudW1iZXJzIGhhdmUgY2hhbmdlZFxuIik7CisJCWpvdXJuYWxfZGV2ID0gbmV3X2RlY29kZV9kZXYoam91cm5hbF9kZXZudW0pOworCX0gZWxzZQorCQlqb3VybmFsX2RldiA9IG5ld19kZWNvZGVfZGV2KGxlMzJfdG9fY3B1KGVzLT5zX2pvdXJuYWxfZGV2KSk7CisKKwlyZWFsbHlfcmVhZF9vbmx5ID0gYmRldl9yZWFkX29ubHkoc2ItPnNfYmRldik7CisKKwkvKgorCSAqIEFyZSB3ZSBsb2FkaW5nIGEgYmxhbmsgam91cm5hbCBvciBwZXJmb3JtaW5nIHJlY292ZXJ5IGFmdGVyIGEKKwkgKiBjcmFzaD8gIEZvciByZWNvdmVyeSwgd2UgbmVlZCB0byBjaGVjayBpbiBhZHZhbmNlIHdoZXRoZXIgd2UKKwkgKiBjYW4gZ2V0IHJlYWQtd3JpdGUgYWNjZXNzIHRvIHRoZSBkZXZpY2UuCisJICovCisKKwlpZiAoRVhUNF9IQVNfSU5DT01QQVRfRkVBVFVSRShzYiwgRVhUNF9GRUFUVVJFX0lOQ09NUEFUX1JFQ09WRVIpKSB7CisJCWlmIChzYi0+c19mbGFncyAmIE1TX1JET05MWSkgeworCQkJcHJpbnRrKEtFUk5fSU5GTyAiRVhUNC1mczogSU5GTzogcmVjb3ZlcnkgIgorCQkJCQkicmVxdWlyZWQgb24gcmVhZG9ubHkgZmlsZXN5c3RlbS5cbiIpOworCQkJaWYgKHJlYWxseV9yZWFkX29ubHkpIHsKKwkJCQlwcmludGsoS0VSTl9FUlIgIkVYVDQtZnM6IHdyaXRlIGFjY2VzcyAiCisJCQkJCSJ1bmF2YWlsYWJsZSwgY2Fubm90IHByb2NlZWQuXG4iKTsKKwkJCQlyZXR1cm4gLUVST0ZTOworCQkJfQorCQkJcHJpbnRrIChLRVJOX0lORk8gIkVYVDQtZnM6IHdyaXRlIGFjY2VzcyB3aWxsICIKKwkJCQkJImJlIGVuYWJsZWQgZHVyaW5nIHJlY292ZXJ5LlxuIik7CisJCX0KKwl9CisKKwlpZiAoam91cm5hbF9pbnVtICYmIGpvdXJuYWxfZGV2KSB7CisJCXByaW50ayhLRVJOX0VSUiAiRVhUNC1mczogZmlsZXN5c3RlbSBoYXMgYm90aCBqb3VybmFsICIKKwkJICAgICAgICJhbmQgaW5vZGUgam91cm5hbHMhXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKGpvdXJuYWxfaW51bSkgeworCQlpZiAoIShqb3VybmFsID0gZXh0NF9nZXRfam91cm5hbChzYiwgam91cm5hbF9pbnVtKSkpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwl9IGVsc2UgeworCQlpZiAoIShqb3VybmFsID0gZXh0NF9nZXRfZGV2X2pvdXJuYWwoc2IsIGpvdXJuYWxfZGV2KSkpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAoIXJlYWxseV9yZWFkX29ubHkgJiYgdGVzdF9vcHQoc2IsIFVQREFURV9KT1VSTkFMKSkgeworCQllcnIgPSBqYmQyX2pvdXJuYWxfdXBkYXRlX2Zvcm1hdChqb3VybmFsKTsKKwkJaWYgKGVycikgIHsKKwkJCXByaW50ayhLRVJOX0VSUiAiRVhUNC1mczogZXJyb3IgdXBkYXRpbmcgam91cm5hbC5cbiIpOworCQkJamJkMl9qb3VybmFsX2Rlc3Ryb3koam91cm5hbCk7CisJCQlyZXR1cm4gZXJyOworCQl9CisJfQorCisJaWYgKCFFWFQ0X0hBU19JTkNPTVBBVF9GRUFUVVJFKHNiLCBFWFQ0X0ZFQVRVUkVfSU5DT01QQVRfUkVDT1ZFUikpCisJCWVyciA9IGpiZDJfam91cm5hbF93aXBlKGpvdXJuYWwsICFyZWFsbHlfcmVhZF9vbmx5KTsKKwlpZiAoIWVycikKKwkJZXJyID0gamJkMl9qb3VybmFsX2xvYWQoam91cm5hbCk7CisKKwlpZiAoZXJyKSB7CisJCXByaW50ayhLRVJOX0VSUiAiRVhUNC1mczogZXJyb3IgbG9hZGluZyBqb3VybmFsLlxuIik7CisJCWpiZDJfam91cm5hbF9kZXN0cm95KGpvdXJuYWwpOworCQlyZXR1cm4gZXJyOworCX0KKworCUVYVDRfU0Ioc2IpLT5zX2pvdXJuYWwgPSBqb3VybmFsOworCWV4dDRfY2xlYXJfam91cm5hbF9lcnIoc2IsIGVzKTsKKworCWlmIChqb3VybmFsX2Rldm51bSAmJgorCSAgICBqb3VybmFsX2Rldm51bSAhPSBsZTMyX3RvX2NwdShlcy0+c19qb3VybmFsX2RldikpIHsKKwkJZXMtPnNfam91cm5hbF9kZXYgPSBjcHVfdG9fbGUzMihqb3VybmFsX2Rldm51bSk7CisJCXNiLT5zX2RpcnQgPSAxOworCisJCS8qIE1ha2Ugc3VyZSB3ZSBmbHVzaCB0aGUgcmVjb3ZlcnkgZmxhZyB0byBkaXNrLiAqLworCQlleHQ0X2NvbW1pdF9zdXBlcihzYiwgZXMsIDEpOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGV4dDRfY3JlYXRlX2pvdXJuYWwoc3RydWN0IHN1cGVyX2Jsb2NrICogc2IsCisJCQkgICAgICAgc3RydWN0IGV4dDRfc3VwZXJfYmxvY2sgKiBlcywKKwkJCSAgICAgICB1bnNpZ25lZCBpbnQgam91cm5hbF9pbnVtKQoreworCWpvdXJuYWxfdCAqam91cm5hbDsKKworCWlmIChzYi0+c19mbGFncyAmIE1TX1JET05MWSkgeworCQlwcmludGsoS0VSTl9FUlIgIkVYVDQtZnM6IHJlYWRvbmx5IGZpbGVzeXN0ZW0gd2hlbiB0cnlpbmcgdG8gIgorCQkJCSJjcmVhdGUgam91cm5hbC5cbiIpOworCQlyZXR1cm4gLUVST0ZTOworCX0KKworCWlmICghKGpvdXJuYWwgPSBleHQ0X2dldF9qb3VybmFsKHNiLCBqb3VybmFsX2ludW0pKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlwcmludGsoS0VSTl9JTkZPICJFWFQ0LWZzOiBjcmVhdGluZyBuZXcgam91cm5hbCBvbiBpbm9kZSAldVxuIiwKKwkgICAgICAgam91cm5hbF9pbnVtKTsKKworCWlmIChqYmQyX2pvdXJuYWxfY3JlYXRlKGpvdXJuYWwpKSB7CisJCXByaW50ayhLRVJOX0VSUiAiRVhUNC1mczogZXJyb3IgY3JlYXRpbmcgam91cm5hbC5cbiIpOworCQlqYmQyX2pvdXJuYWxfZGVzdHJveShqb3VybmFsKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCisJRVhUNF9TQihzYiktPnNfam91cm5hbCA9IGpvdXJuYWw7CisKKwlleHQ0X3VwZGF0ZV9keW5hbWljX3JldihzYik7CisJRVhUNF9TRVRfSU5DT01QQVRfRkVBVFVSRShzYiwgRVhUNF9GRUFUVVJFX0lOQ09NUEFUX1JFQ09WRVIpOworCUVYVDRfU0VUX0NPTVBBVF9GRUFUVVJFKHNiLCBFWFQ0X0ZFQVRVUkVfQ09NUEFUX0hBU19KT1VSTkFMKTsKKworCWVzLT5zX2pvdXJuYWxfaW51bSA9IGNwdV90b19sZTMyKGpvdXJuYWxfaW51bSk7CisJc2ItPnNfZGlydCA9IDE7CisKKwkvKiBNYWtlIHN1cmUgd2UgZmx1c2ggdGhlIHJlY292ZXJ5IGZsYWcgdG8gZGlzay4gKi8KKwlleHQ0X2NvbW1pdF9zdXBlcihzYiwgZXMsIDEpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGV4dDRfY29tbWl0X3N1cGVyIChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiBzYiwKKwkJCSAgICAgICBzdHJ1Y3QgZXh0NF9zdXBlcl9ibG9jayAqIGVzLAorCQkJICAgICAgIGludCBzeW5jKQoreworCXN0cnVjdCBidWZmZXJfaGVhZCAqc2JoID0gRVhUNF9TQihzYiktPnNfc2JoOworCisJaWYgKCFzYmgpCisJCXJldHVybjsKKwllcy0+c193dGltZSA9IGNwdV90b19sZTMyKGdldF9zZWNvbmRzKCkpOworCWV4dDRfZnJlZV9ibG9ja3NfY291bnRfc2V0KGVzLCBleHQ0X2NvdW50X2ZyZWVfYmxvY2tzKHNiKSk7CisJZXMtPnNfZnJlZV9pbm9kZXNfY291bnQgPSBjcHVfdG9fbGUzMihleHQ0X2NvdW50X2ZyZWVfaW5vZGVzKHNiKSk7CisJQlVGRkVSX1RSQUNFKHNiaCwgIm1hcmtpbmcgZGlydHkiKTsKKwltYXJrX2J1ZmZlcl9kaXJ0eShzYmgpOworCWlmIChzeW5jKQorCQlzeW5jX2RpcnR5X2J1ZmZlcihzYmgpOworfQorCisKKy8qCisgKiBIYXZlIHdlIGp1c3QgZmluaXNoZWQgcmVjb3Zlcnk/ICBJZiBzbywgYW5kIGlmIHdlIGFyZSBtb3VudGluZyAob3IKKyAqIHJlbW91bnRpbmcpIHRoZSBmaWxlc3lzdGVtIHJlYWRvbmx5LCB0aGVuIHdlIHdpbGwgZW5kIHVwIHdpdGggYQorICogY29uc2lzdGVudCBmcyBvbiBkaXNrLiAgUmVjb3JkIHRoYXQgZmFjdC4KKyAqLworc3RhdGljIHZvaWQgZXh0NF9tYXJrX3JlY292ZXJ5X2NvbXBsZXRlKHN0cnVjdCBzdXBlcl9ibG9jayAqIHNiLAorCQkJCQlzdHJ1Y3QgZXh0NF9zdXBlcl9ibG9jayAqIGVzKQoreworCWpvdXJuYWxfdCAqam91cm5hbCA9IEVYVDRfU0Ioc2IpLT5zX2pvdXJuYWw7CisKKwlqYmQyX2pvdXJuYWxfbG9ja191cGRhdGVzKGpvdXJuYWwpOworCWpiZDJfam91cm5hbF9mbHVzaChqb3VybmFsKTsKKwlpZiAoRVhUNF9IQVNfSU5DT01QQVRfRkVBVFVSRShzYiwgRVhUNF9GRUFUVVJFX0lOQ09NUEFUX1JFQ09WRVIpICYmCisJICAgIHNiLT5zX2ZsYWdzICYgTVNfUkRPTkxZKSB7CisJCUVYVDRfQ0xFQVJfSU5DT01QQVRfRkVBVFVSRShzYiwgRVhUNF9GRUFUVVJFX0lOQ09NUEFUX1JFQ09WRVIpOworCQlzYi0+c19kaXJ0ID0gMDsKKwkJZXh0NF9jb21taXRfc3VwZXIoc2IsIGVzLCAxKTsKKwl9CisJamJkMl9qb3VybmFsX3VubG9ja191cGRhdGVzKGpvdXJuYWwpOworfQorCisvKgorICogSWYgd2UgYXJlIG1vdW50aW5nIChvciByZWFkLXdyaXRlIHJlbW91bnRpbmcpIGEgZmlsZXN5c3RlbSB3aG9zZSBqb3VybmFsCisgKiBoYXMgcmVjb3JkZWQgYW4gZXJyb3IgZnJvbSBhIHByZXZpb3VzIGxpZmV0aW1lLCBtb3ZlIHRoYXQgZXJyb3IgdG8gdGhlCisgKiBtYWluIGZpbGVzeXN0ZW0gbm93LgorICovCitzdGF0aWMgdm9pZCBleHQ0X2NsZWFyX2pvdXJuYWxfZXJyKHN0cnVjdCBzdXBlcl9ibG9jayAqIHNiLAorCQkJCSAgIHN0cnVjdCBleHQ0X3N1cGVyX2Jsb2NrICogZXMpCit7CisJam91cm5hbF90ICpqb3VybmFsOworCWludCBqX2Vycm5vOworCWNvbnN0IGNoYXIgKmVycnN0cjsKKworCWpvdXJuYWwgPSBFWFQ0X1NCKHNiKS0+c19qb3VybmFsOworCisJLyoKKwkgKiBOb3cgY2hlY2sgZm9yIGFueSBlcnJvciBzdGF0dXMgd2hpY2ggbWF5IGhhdmUgYmVlbiByZWNvcmRlZCBpbiB0aGUKKwkgKiBqb3VybmFsIGJ5IGEgcHJpb3IgZXh0NF9lcnJvcigpIG9yIGV4dDRfYWJvcnQoKQorCSAqLworCisJal9lcnJubyA9IGpiZDJfam91cm5hbF9lcnJubyhqb3VybmFsKTsKKwlpZiAoal9lcnJubykgeworCQljaGFyIG5idWZbMTZdOworCisJCWVycnN0ciA9IGV4dDRfZGVjb2RlX2Vycm9yKHNiLCBqX2Vycm5vLCBuYnVmKTsKKwkJZXh0NF93YXJuaW5nKHNiLCBfX0ZVTkNUSU9OX18sICJGaWxlc3lzdGVtIGVycm9yIHJlY29yZGVkICIKKwkJCSAgICAgImZyb20gcHJldmlvdXMgbW91bnQ6ICVzIiwgZXJyc3RyKTsKKwkJZXh0NF93YXJuaW5nKHNiLCBfX0ZVTkNUSU9OX18sICJNYXJraW5nIGZzIGluIG5lZWQgb2YgIgorCQkJICAgICAiZmlsZXN5c3RlbSBjaGVjay4iKTsKKworCQlFWFQ0X1NCKHNiKS0+c19tb3VudF9zdGF0ZSB8PSBFWFQ0X0VSUk9SX0ZTOworCQllcy0+c19zdGF0ZSB8PSBjcHVfdG9fbGUxNihFWFQ0X0VSUk9SX0ZTKTsKKwkJZXh0NF9jb21taXRfc3VwZXIgKHNiLCBlcywgMSk7CisKKwkJamJkMl9qb3VybmFsX2NsZWFyX2Vycihqb3VybmFsKTsKKwl9Cit9CisKKy8qCisgKiBGb3JjZSB0aGUgcnVubmluZyBhbmQgY29tbWl0dGluZyB0cmFuc2FjdGlvbnMgdG8gY29tbWl0LAorICogYW5kIHdhaXQgb24gdGhlIGNvbW1pdC4KKyAqLworaW50IGV4dDRfZm9yY2VfY29tbWl0KHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpCit7CisJam91cm5hbF90ICpqb3VybmFsOworCWludCByZXQ7CisKKwlpZiAoc2ItPnNfZmxhZ3MgJiBNU19SRE9OTFkpCisJCXJldHVybiAwOworCisJam91cm5hbCA9IEVYVDRfU0Ioc2IpLT5zX2pvdXJuYWw7CisJc2ItPnNfZGlydCA9IDA7CisJcmV0ID0gZXh0NF9qb3VybmFsX2ZvcmNlX2NvbW1pdChqb3VybmFsKTsKKwlyZXR1cm4gcmV0OworfQorCisvKgorICogRXh0NCBhbHdheXMgam91cm5hbHMgdXBkYXRlcyB0byB0aGUgc3VwZXJibG9jayBpdHNlbGYsIHNvIHdlIGRvbid0CisgKiBoYXZlIHRvIHByb3BhZ2F0ZSBhbnkgb3RoZXIgdXBkYXRlcyB0byB0aGUgc3VwZXJibG9jayBvbiBkaXNrIGF0IHRoaXMKKyAqIHBvaW50LiAgSnVzdCBzdGFydCBhbiBhc3luYyB3cml0ZWJhY2sgdG8gZ2V0IHRoZSBidWZmZXJzIG9uIHRoZWlyIHdheQorICogdG8gdGhlIGRpc2suCisgKgorICogVGhpcyBpbXBsaWNpdGx5IHRyaWdnZXJzIHRoZSB3cml0ZWJlaGluZCBvbiBzeW5jKCkuCisgKi8KKworc3RhdGljIHZvaWQgZXh0NF93cml0ZV9zdXBlciAoc3RydWN0IHN1cGVyX2Jsb2NrICogc2IpCit7CisJaWYgKG11dGV4X3RyeWxvY2soJnNiLT5zX2xvY2spICE9IDApCisJCUJVRygpOworCXNiLT5zX2RpcnQgPSAwOworfQorCitzdGF0aWMgaW50IGV4dDRfc3luY19mcyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBpbnQgd2FpdCkKK3sKKwl0aWRfdCB0YXJnZXQ7CisKKwlzYi0+c19kaXJ0ID0gMDsKKwlpZiAoamJkMl9qb3VybmFsX3N0YXJ0X2NvbW1pdChFWFQ0X1NCKHNiKS0+c19qb3VybmFsLCAmdGFyZ2V0KSkgeworCQlpZiAod2FpdCkKKwkJCWpiZDJfbG9nX3dhaXRfY29tbWl0KEVYVDRfU0Ioc2IpLT5zX2pvdXJuYWwsIHRhcmdldCk7CisJfQorCXJldHVybiAwOworfQorCisvKgorICogTFZNIGNhbGxzIHRoaXMgZnVuY3Rpb24gYmVmb3JlIGEgKHJlYWQtb25seSkgc25hcHNob3QgaXMgY3JlYXRlZC4gIFRoaXMKKyAqIGdpdmVzIHVzIGEgY2hhbmNlIHRvIGZsdXNoIHRoZSBqb3VybmFsIGNvbXBsZXRlbHkgYW5kIG1hcmsgdGhlIGZzIGNsZWFuLgorICovCitzdGF0aWMgdm9pZCBleHQ0X3dyaXRlX3N1cGVyX2xvY2tmcyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKQoreworCXNiLT5zX2RpcnQgPSAwOworCisJaWYgKCEoc2ItPnNfZmxhZ3MgJiBNU19SRE9OTFkpKSB7CisJCWpvdXJuYWxfdCAqam91cm5hbCA9IEVYVDRfU0Ioc2IpLT5zX2pvdXJuYWw7CisKKwkJLyogTm93IHdlIHNldCB1cCB0aGUgam91cm5hbCBiYXJyaWVyLiAqLworCQlqYmQyX2pvdXJuYWxfbG9ja191cGRhdGVzKGpvdXJuYWwpOworCQlqYmQyX2pvdXJuYWxfZmx1c2goam91cm5hbCk7CisKKwkJLyogSm91cm5hbCBibG9ja2VkIGFuZCBmbHVzaGVkLCBjbGVhciBuZWVkc19yZWNvdmVyeSBmbGFnLiAqLworCQlFWFQ0X0NMRUFSX0lOQ09NUEFUX0ZFQVRVUkUoc2IsIEVYVDRfRkVBVFVSRV9JTkNPTVBBVF9SRUNPVkVSKTsKKwkJZXh0NF9jb21taXRfc3VwZXIoc2IsIEVYVDRfU0Ioc2IpLT5zX2VzLCAxKTsKKwl9Cit9CisKKy8qCisgKiBDYWxsZWQgYnkgTFZNIGFmdGVyIHRoZSBzbmFwc2hvdCBpcyBkb25lLiAgV2UgbmVlZCB0byByZXNldCB0aGUgUkVDT1ZFUgorICogZmxhZyBoZXJlLCBldmVuIHRob3VnaCB0aGUgZmlsZXN5c3RlbSBpcyBub3QgdGVjaG5pY2FsbHkgZGlydHkgeWV0LgorICovCitzdGF0aWMgdm9pZCBleHQ0X3VubG9ja2ZzKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpCit7CisJaWYgKCEoc2ItPnNfZmxhZ3MgJiBNU19SRE9OTFkpKSB7CisJCWxvY2tfc3VwZXIoc2IpOworCQkvKiBSZXNlciB0aGUgbmVlZHNfcmVjb3ZlcnkgZmxhZyBiZWZvcmUgdGhlIGZzIGlzIHVubG9ja2VkLiAqLworCQlFWFQ0X1NFVF9JTkNPTVBBVF9GRUFUVVJFKHNiLCBFWFQ0X0ZFQVRVUkVfSU5DT01QQVRfUkVDT1ZFUik7CisJCWV4dDRfY29tbWl0X3N1cGVyKHNiLCBFWFQ0X1NCKHNiKS0+c19lcywgMSk7CisJCXVubG9ja19zdXBlcihzYik7CisJCWpiZDJfam91cm5hbF91bmxvY2tfdXBkYXRlcyhFWFQ0X1NCKHNiKS0+c19qb3VybmFsKTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgZXh0NF9yZW1vdW50IChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiBzYiwgaW50ICogZmxhZ3MsIGNoYXIgKiBkYXRhKQoreworCXN0cnVjdCBleHQ0X3N1cGVyX2Jsb2NrICogZXM7CisJc3RydWN0IGV4dDRfc2JfaW5mbyAqc2JpID0gRVhUNF9TQihzYik7CisJZXh0NF9mc2Jsa190IG5fYmxvY2tzX2NvdW50ID0gMDsKKwl1bnNpZ25lZCBsb25nIG9sZF9zYl9mbGFnczsKKwlzdHJ1Y3QgZXh0NF9tb3VudF9vcHRpb25zIG9sZF9vcHRzOworCWludCBlcnI7CisjaWZkZWYgQ09ORklHX1FVT1RBCisJaW50IGk7CisjZW5kaWYKKworCS8qIFN0b3JlIHRoZSBvcmlnaW5hbCBvcHRpb25zICovCisJb2xkX3NiX2ZsYWdzID0gc2ItPnNfZmxhZ3M7CisJb2xkX29wdHMuc19tb3VudF9vcHQgPSBzYmktPnNfbW91bnRfb3B0OworCW9sZF9vcHRzLnNfcmVzdWlkID0gc2JpLT5zX3Jlc3VpZDsKKwlvbGRfb3B0cy5zX3Jlc2dpZCA9IHNiaS0+c19yZXNnaWQ7CisJb2xkX29wdHMuc19jb21taXRfaW50ZXJ2YWwgPSBzYmktPnNfY29tbWl0X2ludGVydmFsOworI2lmZGVmIENPTkZJR19RVU9UQQorCW9sZF9vcHRzLnNfanF1b3RhX2ZtdCA9IHNiaS0+c19qcXVvdGFfZm10OworCWZvciAoaSA9IDA7IGkgPCBNQVhRVU9UQVM7IGkrKykKKwkJb2xkX29wdHMuc19xZl9uYW1lc1tpXSA9IHNiaS0+c19xZl9uYW1lc1tpXTsKKyNlbmRpZgorCisJLyoKKwkgKiBBbGxvdyB0aGUgImNoZWNrIiBvcHRpb24gdG8gYmUgcGFzc2VkIGFzIGEgcmVtb3VudCBvcHRpb24uCisJICovCisJaWYgKCFwYXJzZV9vcHRpb25zKGRhdGEsIHNiLCBOVUxMLCBOVUxMLCAmbl9ibG9ja3NfY291bnQsIDEpKSB7CisJCWVyciA9IC1FSU5WQUw7CisJCWdvdG8gcmVzdG9yZV9vcHRzOworCX0KKworCWlmIChzYmktPnNfbW91bnRfb3B0ICYgRVhUNF9NT1VOVF9BQk9SVCkKKwkJZXh0NF9hYm9ydChzYiwgX19GVU5DVElPTl9fLCAiQWJvcnQgZm9yY2VkIGJ5IHVzZXIiKTsKKworCXNiLT5zX2ZsYWdzID0gKHNiLT5zX2ZsYWdzICYgfk1TX1BPU0lYQUNMKSB8CisJCSgoc2JpLT5zX21vdW50X29wdCAmIEVYVDRfTU9VTlRfUE9TSVhfQUNMKSA/IE1TX1BPU0lYQUNMIDogMCk7CisKKwllcyA9IHNiaS0+c19lczsKKworCWV4dDRfaW5pdF9qb3VybmFsX3BhcmFtcyhzYiwgc2JpLT5zX2pvdXJuYWwpOworCisJaWYgKCgqZmxhZ3MgJiBNU19SRE9OTFkpICE9IChzYi0+c19mbGFncyAmIE1TX1JET05MWSkgfHwKKwkJbl9ibG9ja3NfY291bnQgPiBleHQ0X2Jsb2Nrc19jb3VudChlcykpIHsKKwkJaWYgKHNiaS0+c19tb3VudF9vcHQgJiBFWFQ0X01PVU5UX0FCT1JUKSB7CisJCQllcnIgPSAtRVJPRlM7CisJCQlnb3RvIHJlc3RvcmVfb3B0czsKKwkJfQorCisJCWlmICgqZmxhZ3MgJiBNU19SRE9OTFkpIHsKKwkJCS8qCisJCQkgKiBGaXJzdCBvZiBhbGwsIHRoZSB1bmNvbmRpdGlvbmFsIHN0dWZmIHdlIGhhdmUgdG8gZG8KKwkJCSAqIHRvIGRpc2FibGUgcmVwbGF5IG9mIHRoZSBqb3VybmFsIHdoZW4gd2UgbmV4dCByZW1vdW50CisJCQkgKi8KKwkJCXNiLT5zX2ZsYWdzIHw9IE1TX1JET05MWTsKKworCQkJLyoKKwkJCSAqIE9LLCB0ZXN0IGlmIHdlIGFyZSByZW1vdW50aW5nIGEgdmFsaWQgcncgcGFydGl0aW9uCisJCQkgKiByZWFkb25seSwgYW5kIGlmIHNvIHNldCB0aGUgcmRvbmx5IGZsYWcgYW5kIHRoZW4KKwkJCSAqIG1hcmsgdGhlIHBhcnRpdGlvbiBhcyB2YWxpZCBhZ2Fpbi4KKwkJCSAqLworCQkJaWYgKCEoZXMtPnNfc3RhdGUgJiBjcHVfdG9fbGUxNihFWFQ0X1ZBTElEX0ZTKSkgJiYKKwkJCSAgICAoc2JpLT5zX21vdW50X3N0YXRlICYgRVhUNF9WQUxJRF9GUykpCisJCQkJZXMtPnNfc3RhdGUgPSBjcHVfdG9fbGUxNihzYmktPnNfbW91bnRfc3RhdGUpOworCisJCQlleHQ0X21hcmtfcmVjb3ZlcnlfY29tcGxldGUoc2IsIGVzKTsKKwkJfSBlbHNlIHsKKwkJCV9fbGUzMiByZXQ7CisJCQlpZiAoKHJldCA9IEVYVDRfSEFTX1JPX0NPTVBBVF9GRUFUVVJFKHNiLAorCQkJCQl+RVhUNF9GRUFUVVJFX1JPX0NPTVBBVF9TVVBQKSkpIHsKKwkJCQlwcmludGsoS0VSTl9XQVJOSU5HICJFWFQ0LWZzOiAlczogY291bGRuJ3QgIgorCQkJCSAgICAgICAicmVtb3VudCBSRFdSIGJlY2F1c2Ugb2YgdW5zdXBwb3J0ZWQgIgorCQkJCSAgICAgICAib3B0aW9uYWwgZmVhdHVyZXMgKCV4KS5cbiIsCisJCQkJICAgICAgIHNiLT5zX2lkLCBsZTMyX3RvX2NwdShyZXQpKTsKKwkJCQllcnIgPSAtRVJPRlM7CisJCQkJZ290byByZXN0b3JlX29wdHM7CisJCQl9CisJCQkvKgorCQkJICogTW91bnRpbmcgYSBSRE9OTFkgcGFydGl0aW9uIHJlYWQtd3JpdGUsIHNvIHJlcmVhZAorCQkJICogYW5kIHN0b3JlIHRoZSBjdXJyZW50IHZhbGlkIGZsYWcuICAoSXQgbWF5IGhhdmUKKwkJCSAqIGJlZW4gY2hhbmdlZCBieSBlMmZzY2sgc2luY2Ugd2Ugb3JpZ2luYWxseSBtb3VudGVkCisJCQkgKiB0aGUgcGFydGl0aW9uLikKKwkJCSAqLworCQkJZXh0NF9jbGVhcl9qb3VybmFsX2VycihzYiwgZXMpOworCQkJc2JpLT5zX21vdW50X3N0YXRlID0gbGUxNl90b19jcHUoZXMtPnNfc3RhdGUpOworCQkJaWYgKChlcnIgPSBleHQ0X2dyb3VwX2V4dGVuZChzYiwgZXMsIG5fYmxvY2tzX2NvdW50KSkpCisJCQkJZ290byByZXN0b3JlX29wdHM7CisJCQlpZiAoIWV4dDRfc2V0dXBfc3VwZXIgKHNiLCBlcywgMCkpCisJCQkJc2ItPnNfZmxhZ3MgJj0gfk1TX1JET05MWTsKKwkJfQorCX0KKyNpZmRlZiBDT05GSUdfUVVPVEEKKwkvKiBSZWxlYXNlIG9sZCBxdW90YSBmaWxlIG5hbWVzICovCisJZm9yIChpID0gMDsgaSA8IE1BWFFVT1RBUzsgaSsrKQorCQlpZiAob2xkX29wdHMuc19xZl9uYW1lc1tpXSAmJgorCQkgICAgb2xkX29wdHMuc19xZl9uYW1lc1tpXSAhPSBzYmktPnNfcWZfbmFtZXNbaV0pCisJCQlrZnJlZShvbGRfb3B0cy5zX3FmX25hbWVzW2ldKTsKKyNlbmRpZgorCXJldHVybiAwOworcmVzdG9yZV9vcHRzOgorCXNiLT5zX2ZsYWdzID0gb2xkX3NiX2ZsYWdzOworCXNiaS0+c19tb3VudF9vcHQgPSBvbGRfb3B0cy5zX21vdW50X29wdDsKKwlzYmktPnNfcmVzdWlkID0gb2xkX29wdHMuc19yZXN1aWQ7CisJc2JpLT5zX3Jlc2dpZCA9IG9sZF9vcHRzLnNfcmVzZ2lkOworCXNiaS0+c19jb21taXRfaW50ZXJ2YWwgPSBvbGRfb3B0cy5zX2NvbW1pdF9pbnRlcnZhbDsKKyNpZmRlZiBDT05GSUdfUVVPVEEKKwlzYmktPnNfanF1b3RhX2ZtdCA9IG9sZF9vcHRzLnNfanF1b3RhX2ZtdDsKKwlmb3IgKGkgPSAwOyBpIDwgTUFYUVVPVEFTOyBpKyspIHsKKwkJaWYgKHNiaS0+c19xZl9uYW1lc1tpXSAmJgorCQkgICAgb2xkX29wdHMuc19xZl9uYW1lc1tpXSAhPSBzYmktPnNfcWZfbmFtZXNbaV0pCisJCQlrZnJlZShzYmktPnNfcWZfbmFtZXNbaV0pOworCQlzYmktPnNfcWZfbmFtZXNbaV0gPSBvbGRfb3B0cy5zX3FmX25hbWVzW2ldOworCX0KKyNlbmRpZgorCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgZXh0NF9zdGF0ZnMgKHN0cnVjdCBkZW50cnkgKiBkZW50cnksIHN0cnVjdCBrc3RhdGZzICogYnVmKQoreworCXN0cnVjdCBzdXBlcl9ibG9jayAqc2IgPSBkZW50cnktPmRfc2I7CisJc3RydWN0IGV4dDRfc2JfaW5mbyAqc2JpID0gRVhUNF9TQihzYik7CisJc3RydWN0IGV4dDRfc3VwZXJfYmxvY2sgKmVzID0gc2JpLT5zX2VzOworCWV4dDRfZnNibGtfdCBvdmVyaGVhZDsKKwlpbnQgaTsKKworCWlmICh0ZXN0X29wdCAoc2IsIE1JTklYX0RGKSkKKwkJb3ZlcmhlYWQgPSAwOworCWVsc2UgeworCQl1bnNpZ25lZCBsb25nIG5ncm91cHM7CisJCW5ncm91cHMgPSBFWFQ0X1NCKHNiKS0+c19ncm91cHNfY291bnQ7CisJCXNtcF9ybWIoKTsKKworCQkvKgorCQkgKiBDb21wdXRlIHRoZSBvdmVyaGVhZCAoRlMgc3RydWN0dXJlcykKKwkJICovCisKKwkJLyoKKwkJICogQWxsIG9mIHRoZSBibG9ja3MgYmVmb3JlIGZpcnN0X2RhdGFfYmxvY2sgYXJlCisJCSAqIG92ZXJoZWFkCisJCSAqLworCQlvdmVyaGVhZCA9IGxlMzJfdG9fY3B1KGVzLT5zX2ZpcnN0X2RhdGFfYmxvY2spOworCisJCS8qCisJCSAqIEFkZCB0aGUgb3ZlcmhlYWQgYXR0cmlidXRlZCB0byB0aGUgc3VwZXJibG9jayBhbmQKKwkJICogYmxvY2sgZ3JvdXAgZGVzY3JpcHRvcnMuICBJZiB0aGUgc3BhcnNlIHN1cGVyYmxvY2tzCisJCSAqIGZlYXR1cmUgaXMgdHVybmVkIG9uLCB0aGVuIG5vdCBhbGwgZ3JvdXBzIGhhdmUgdGhpcy4KKwkJICovCisJCWZvciAoaSA9IDA7IGkgPCBuZ3JvdXBzOyBpKyspIHsKKwkJCW92ZXJoZWFkICs9IGV4dDRfYmdfaGFzX3N1cGVyKHNiLCBpKSArCisJCQkJZXh0NF9iZ19udW1fZ2RiKHNiLCBpKTsKKwkJCWNvbmRfcmVzY2hlZCgpOworCQl9CisKKwkJLyoKKwkJICogRXZlcnkgYmxvY2sgZ3JvdXAgaGFzIGFuIGlub2RlIGJpdG1hcCwgYSBibG9jaworCQkgKiBiaXRtYXAsIGFuZCBhbiBpbm9kZSB0YWJsZS4KKwkJICovCisJCW92ZXJoZWFkICs9IChuZ3JvdXBzICogKDIgKyBFWFQ0X1NCKHNiKS0+c19pdGJfcGVyX2dyb3VwKSk7CisJfQorCisJYnVmLT5mX3R5cGUgPSBFWFQ0X1NVUEVSX01BR0lDOworCWJ1Zi0+Zl9ic2l6ZSA9IHNiLT5zX2Jsb2Nrc2l6ZTsKKwlidWYtPmZfYmxvY2tzID0gZXh0NF9ibG9ja3NfY291bnQoZXMpIC0gb3ZlcmhlYWQ7CisJYnVmLT5mX2JmcmVlID0gcGVyY3B1X2NvdW50ZXJfc3VtKCZzYmktPnNfZnJlZWJsb2Nrc19jb3VudGVyKTsKKwlidWYtPmZfYmF2YWlsID0gYnVmLT5mX2JmcmVlIC0gZXh0NF9yX2Jsb2Nrc19jb3VudChlcyk7CisJaWYgKGJ1Zi0+Zl9iZnJlZSA8IGV4dDRfcl9ibG9ja3NfY291bnQoZXMpKQorCQlidWYtPmZfYmF2YWlsID0gMDsKKwlidWYtPmZfZmlsZXMgPSBsZTMyX3RvX2NwdShlcy0+c19pbm9kZXNfY291bnQpOworCWJ1Zi0+Zl9mZnJlZSA9IHBlcmNwdV9jb3VudGVyX3N1bSgmc2JpLT5zX2ZyZWVpbm9kZXNfY291bnRlcik7CisJYnVmLT5mX25hbWVsZW4gPSBFWFQ0X05BTUVfTEVOOworCXJldHVybiAwOworfQorCisvKiBIZWxwZXIgZnVuY3Rpb24gZm9yIHdyaXRpbmcgcXVvdGFzIG9uIHN5bmMgLSB3ZSBuZWVkIHRvIHN0YXJ0IHRyYW5zYWN0aW9uIGJlZm9yZSBxdW90YSBmaWxlCisgKiBpcyBsb2NrZWQgZm9yIHdyaXRlLiBPdGhlcndpc2UgdGhlIGFyZSBwb3NzaWJsZSBkZWFkbG9ja3M6CisgKiBQcm9jZXNzIDEgICAgICAgICAgICAgICAgICAgICAgICAgUHJvY2VzcyAyCisgKiBleHQ0X2NyZWF0ZSgpICAgICAgICAgICAgICAgICAgICAgcXVvdGFfc3luYygpCisgKiAgIGpiZDJfam91cm5hbF9zdGFydCgpICAgICAgICAgICAgICAgICAgIHdyaXRlX2RxdW90KCkKKyAqICAgRFFVT1RfSU5JVCgpICAgICAgICAgICAgICAgICAgICAgICAgZG93bihkcWlvX211dGV4KQorICogICAgIGRvd24oZHFpb19tdXRleCkgICAgICAgICAgICAgICAgICAgIGpiZDJfam91cm5hbF9zdGFydCgpCisgKgorICovCisKKyNpZmRlZiBDT05GSUdfUVVPVEEKKworc3RhdGljIGlubGluZSBzdHJ1Y3QgaW5vZGUgKmRxdW90X3RvX2lub2RlKHN0cnVjdCBkcXVvdCAqZHF1b3QpCit7CisJcmV0dXJuIHNiX2Rxb3B0KGRxdW90LT5kcV9zYiktPmZpbGVzW2RxdW90LT5kcV90eXBlXTsKK30KKworc3RhdGljIGludCBleHQ0X2RxdW90X2luaXRpYWxpemUoc3RydWN0IGlub2RlICppbm9kZSwgaW50IHR5cGUpCit7CisJaGFuZGxlX3QgKmhhbmRsZTsKKwlpbnQgcmV0LCBlcnI7CisKKwkvKiBXZSBtYXkgY3JlYXRlIHF1b3RhIHN0cnVjdHVyZSBzbyB3ZSBuZWVkIHRvIHJlc2VydmUgZW5vdWdoIGJsb2NrcyAqLworCWhhbmRsZSA9IGV4dDRfam91cm5hbF9zdGFydChpbm9kZSwgMipFWFQ0X1FVT1RBX0lOSVRfQkxPQ0tTKGlub2RlLT5pX3NiKSk7CisJaWYgKElTX0VSUihoYW5kbGUpKQorCQlyZXR1cm4gUFRSX0VSUihoYW5kbGUpOworCXJldCA9IGRxdW90X2luaXRpYWxpemUoaW5vZGUsIHR5cGUpOworCWVyciA9IGV4dDRfam91cm5hbF9zdG9wKGhhbmRsZSk7CisJaWYgKCFyZXQpCisJCXJldCA9IGVycjsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGV4dDRfZHF1b3RfZHJvcChzdHJ1Y3QgaW5vZGUgKmlub2RlKQoreworCWhhbmRsZV90ICpoYW5kbGU7CisJaW50IHJldCwgZXJyOworCisJLyogV2UgbWF5IGRlbGV0ZSBxdW90YSBzdHJ1Y3R1cmUgc28gd2UgbmVlZCB0byByZXNlcnZlIGVub3VnaCBibG9ja3MgKi8KKwloYW5kbGUgPSBleHQ0X2pvdXJuYWxfc3RhcnQoaW5vZGUsIDIqRVhUNF9RVU9UQV9ERUxfQkxPQ0tTKGlub2RlLT5pX3NiKSk7CisJaWYgKElTX0VSUihoYW5kbGUpKQorCQlyZXR1cm4gUFRSX0VSUihoYW5kbGUpOworCXJldCA9IGRxdW90X2Ryb3AoaW5vZGUpOworCWVyciA9IGV4dDRfam91cm5hbF9zdG9wKGhhbmRsZSk7CisJaWYgKCFyZXQpCisJCXJldCA9IGVycjsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGV4dDRfd3JpdGVfZHF1b3Qoc3RydWN0IGRxdW90ICpkcXVvdCkKK3sKKwlpbnQgcmV0LCBlcnI7CisJaGFuZGxlX3QgKmhhbmRsZTsKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlOworCisJaW5vZGUgPSBkcXVvdF90b19pbm9kZShkcXVvdCk7CisJaGFuZGxlID0gZXh0NF9qb3VybmFsX3N0YXJ0KGlub2RlLAorCQkJCQlFWFQ0X1FVT1RBX1RSQU5TX0JMT0NLUyhkcXVvdC0+ZHFfc2IpKTsKKwlpZiAoSVNfRVJSKGhhbmRsZSkpCisJCXJldHVybiBQVFJfRVJSKGhhbmRsZSk7CisJcmV0ID0gZHF1b3RfY29tbWl0KGRxdW90KTsKKwllcnIgPSBleHQ0X2pvdXJuYWxfc3RvcChoYW5kbGUpOworCWlmICghcmV0KQorCQlyZXQgPSBlcnI7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBleHQ0X2FjcXVpcmVfZHF1b3Qoc3RydWN0IGRxdW90ICpkcXVvdCkKK3sKKwlpbnQgcmV0LCBlcnI7CisJaGFuZGxlX3QgKmhhbmRsZTsKKworCWhhbmRsZSA9IGV4dDRfam91cm5hbF9zdGFydChkcXVvdF90b19pbm9kZShkcXVvdCksCisJCQkJCUVYVDRfUVVPVEFfSU5JVF9CTE9DS1MoZHF1b3QtPmRxX3NiKSk7CisJaWYgKElTX0VSUihoYW5kbGUpKQorCQlyZXR1cm4gUFRSX0VSUihoYW5kbGUpOworCXJldCA9IGRxdW90X2FjcXVpcmUoZHF1b3QpOworCWVyciA9IGV4dDRfam91cm5hbF9zdG9wKGhhbmRsZSk7CisJaWYgKCFyZXQpCisJCXJldCA9IGVycjsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGV4dDRfcmVsZWFzZV9kcXVvdChzdHJ1Y3QgZHF1b3QgKmRxdW90KQoreworCWludCByZXQsIGVycjsKKwloYW5kbGVfdCAqaGFuZGxlOworCisJaGFuZGxlID0gZXh0NF9qb3VybmFsX3N0YXJ0KGRxdW90X3RvX2lub2RlKGRxdW90KSwKKwkJCQkJRVhUNF9RVU9UQV9ERUxfQkxPQ0tTKGRxdW90LT5kcV9zYikpOworCWlmIChJU19FUlIoaGFuZGxlKSkKKwkJcmV0dXJuIFBUUl9FUlIoaGFuZGxlKTsKKwlyZXQgPSBkcXVvdF9yZWxlYXNlKGRxdW90KTsKKwllcnIgPSBleHQ0X2pvdXJuYWxfc3RvcChoYW5kbGUpOworCWlmICghcmV0KQorCQlyZXQgPSBlcnI7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBleHQ0X21hcmtfZHF1b3RfZGlydHkoc3RydWN0IGRxdW90ICpkcXVvdCkKK3sKKwkvKiBBcmUgd2Ugam91cm5hbGxpbmcgcXVvdGFzPyAqLworCWlmIChFWFQ0X1NCKGRxdW90LT5kcV9zYiktPnNfcWZfbmFtZXNbVVNSUVVPVEFdIHx8CisJICAgIEVYVDRfU0IoZHF1b3QtPmRxX3NiKS0+c19xZl9uYW1lc1tHUlBRVU9UQV0pIHsKKwkJZHF1b3RfbWFya19kcXVvdF9kaXJ0eShkcXVvdCk7CisJCXJldHVybiBleHQ0X3dyaXRlX2RxdW90KGRxdW90KTsKKwl9IGVsc2UgeworCQlyZXR1cm4gZHF1b3RfbWFya19kcXVvdF9kaXJ0eShkcXVvdCk7CisJfQorfQorCitzdGF0aWMgaW50IGV4dDRfd3JpdGVfaW5mbyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBpbnQgdHlwZSkKK3sKKwlpbnQgcmV0LCBlcnI7CisJaGFuZGxlX3QgKmhhbmRsZTsKKworCS8qIERhdGEgYmxvY2sgKyBpbm9kZSBibG9jayAqLworCWhhbmRsZSA9IGV4dDRfam91cm5hbF9zdGFydChzYi0+c19yb290LT5kX2lub2RlLCAyKTsKKwlpZiAoSVNfRVJSKGhhbmRsZSkpCisJCXJldHVybiBQVFJfRVJSKGhhbmRsZSk7CisJcmV0ID0gZHF1b3RfY29tbWl0X2luZm8oc2IsIHR5cGUpOworCWVyciA9IGV4dDRfam91cm5hbF9zdG9wKGhhbmRsZSk7CisJaWYgKCFyZXQpCisJCXJldCA9IGVycjsKKwlyZXR1cm4gcmV0OworfQorCisvKgorICogVHVybiBvbiBxdW90YXMgZHVyaW5nIG1vdW50IHRpbWUgLSB3ZSBuZWVkIHRvIGZpbmQKKyAqIHRoZSBxdW90YSBmaWxlIGFuZCBzdWNoLi4uCisgKi8KK3N0YXRpYyBpbnQgZXh0NF9xdW90YV9vbl9tb3VudChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBpbnQgdHlwZSkKK3sKKwlyZXR1cm4gdmZzX3F1b3RhX29uX21vdW50KHNiLCBFWFQ0X1NCKHNiKS0+c19xZl9uYW1lc1t0eXBlXSwKKwkJCUVYVDRfU0Ioc2IpLT5zX2pxdW90YV9mbXQsIHR5cGUpOworfQorCisvKgorICogU3RhbmRhcmQgZnVuY3Rpb24gdG8gYmUgY2FsbGVkIG9uIHF1b3RhX29uCisgKi8KK3N0YXRpYyBpbnQgZXh0NF9xdW90YV9vbihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBpbnQgdHlwZSwgaW50IGZvcm1hdF9pZCwKKwkJCSBjaGFyICpwYXRoKQoreworCWludCBlcnI7CisJc3RydWN0IG5hbWVpZGF0YSBuZDsKKworCWlmICghdGVzdF9vcHQoc2IsIFFVT1RBKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJLyogTm90IGpvdXJuYWxsaW5nIHF1b3RhPyAqLworCWlmICghRVhUNF9TQihzYiktPnNfcWZfbmFtZXNbVVNSUVVPVEFdICYmCisJICAgICFFWFQ0X1NCKHNiKS0+c19xZl9uYW1lc1tHUlBRVU9UQV0pCisJCXJldHVybiB2ZnNfcXVvdGFfb24oc2IsIHR5cGUsIGZvcm1hdF9pZCwgcGF0aCk7CisJZXJyID0gcGF0aF9sb29rdXAocGF0aCwgTE9PS1VQX0ZPTExPVywgJm5kKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCS8qIFF1b3RhZmlsZSBub3Qgb24gdGhlIHNhbWUgZmlsZXN5c3RlbT8gKi8KKwlpZiAobmQubW50LT5tbnRfc2IgIT0gc2IpIHsKKwkJcGF0aF9yZWxlYXNlKCZuZCk7CisJCXJldHVybiAtRVhERVY7CisJfQorCS8qIFF1b3RhZmlsZSBub3Qgb2YgZnMgcm9vdD8gKi8KKwlpZiAobmQuZGVudHJ5LT5kX3BhcmVudC0+ZF9pbm9kZSAhPSBzYi0+c19yb290LT5kX2lub2RlKQorCQlwcmludGsoS0VSTl9XQVJOSU5HCisJCQkiRVhUNC1mczogUXVvdGEgZmlsZSBub3Qgb24gZmlsZXN5c3RlbSByb290LiAiCisJCQkiSm91cm5hbGxlZCBxdW90YSB3aWxsIG5vdCB3b3JrLlxuIik7CisJcGF0aF9yZWxlYXNlKCZuZCk7CisJcmV0dXJuIHZmc19xdW90YV9vbihzYiwgdHlwZSwgZm9ybWF0X2lkLCBwYXRoKTsKK30KKworLyogUmVhZCBkYXRhIGZyb20gcXVvdGFmaWxlIC0gYXZvaWQgcGFnZWNhY2hlIGFuZCBzdWNoIGJlY2F1c2Ugd2UgY2Fubm90IGFmZm9yZAorICogYWNxdWlyaW5nIHRoZSBsb2Nrcy4uLiBBcyBxdW90YSBmaWxlcyBhcmUgbmV2ZXIgdHJ1bmNhdGVkIGFuZCBxdW90YSBjb2RlCisgKiBpdHNlbGYgc2VyaWFsaXplcyB0aGUgb3BlcmF0aW9ucyAoYW5kIG5vb25lIGVsc2Ugc2hvdWxkIHRvdWNoIHRoZSBmaWxlcykKKyAqIHdlIGRvbid0IGhhdmUgdG8gYmUgYWZyYWlkIG9mIHJhY2VzICovCitzdGF0aWMgc3NpemVfdCBleHQ0X3F1b3RhX3JlYWQoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgaW50IHR5cGUsIGNoYXIgKmRhdGEsCisJCQkgICAgICAgc2l6ZV90IGxlbiwgbG9mZl90IG9mZikKK3sKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gc2JfZHFvcHQoc2IpLT5maWxlc1t0eXBlXTsKKwlzZWN0b3JfdCBibGsgPSBvZmYgPj4gRVhUNF9CTE9DS19TSVpFX0JJVFMoc2IpOworCWludCBlcnIgPSAwOworCWludCBvZmZzZXQgPSBvZmYgJiAoc2ItPnNfYmxvY2tzaXplIC0gMSk7CisJaW50IHRvY29weTsKKwlzaXplX3QgdG9yZWFkOworCXN0cnVjdCBidWZmZXJfaGVhZCAqYmg7CisJbG9mZl90IGlfc2l6ZSA9IGlfc2l6ZV9yZWFkKGlub2RlKTsKKworCWlmIChvZmYgPiBpX3NpemUpCisJCXJldHVybiAwOworCWlmIChvZmYrbGVuID4gaV9zaXplKQorCQlsZW4gPSBpX3NpemUtb2ZmOworCXRvcmVhZCA9IGxlbjsKKwl3aGlsZSAodG9yZWFkID4gMCkgeworCQl0b2NvcHkgPSBzYi0+c19ibG9ja3NpemUgLSBvZmZzZXQgPCB0b3JlYWQgPworCQkJCXNiLT5zX2Jsb2Nrc2l6ZSAtIG9mZnNldCA6IHRvcmVhZDsKKwkJYmggPSBleHQ0X2JyZWFkKE5VTEwsIGlub2RlLCBibGssIDAsICZlcnIpOworCQlpZiAoZXJyKQorCQkJcmV0dXJuIGVycjsKKwkJaWYgKCFiaCkJLyogQSBob2xlPyAqLworCQkJbWVtc2V0KGRhdGEsIDAsIHRvY29weSk7CisJCWVsc2UKKwkJCW1lbWNweShkYXRhLCBiaC0+Yl9kYXRhK29mZnNldCwgdG9jb3B5KTsKKwkJYnJlbHNlKGJoKTsKKwkJb2Zmc2V0ID0gMDsKKwkJdG9yZWFkIC09IHRvY29weTsKKwkJZGF0YSArPSB0b2NvcHk7CisJCWJsaysrOworCX0KKwlyZXR1cm4gbGVuOworfQorCisvKiBXcml0ZSB0byBxdW90YWZpbGUgKHdlIGtub3cgdGhlIHRyYW5zYWN0aW9uIGlzIGFscmVhZHkgc3RhcnRlZCBhbmQgaGFzCisgKiBlbm91Z2ggY3JlZGl0cykgKi8KK3N0YXRpYyBzc2l6ZV90IGV4dDRfcXVvdGFfd3JpdGUoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgaW50IHR5cGUsCisJCQkJY29uc3QgY2hhciAqZGF0YSwgc2l6ZV90IGxlbiwgbG9mZl90IG9mZikKK3sKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gc2JfZHFvcHQoc2IpLT5maWxlc1t0eXBlXTsKKwlzZWN0b3JfdCBibGsgPSBvZmYgPj4gRVhUNF9CTE9DS19TSVpFX0JJVFMoc2IpOworCWludCBlcnIgPSAwOworCWludCBvZmZzZXQgPSBvZmYgJiAoc2ItPnNfYmxvY2tzaXplIC0gMSk7CisJaW50IHRvY29weTsKKwlpbnQgam91cm5hbF9xdW90YSA9IEVYVDRfU0Ioc2IpLT5zX3FmX25hbWVzW3R5cGVdICE9IE5VTEw7CisJc2l6ZV90IHRvd3JpdGUgPSBsZW47CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaDsKKwloYW5kbGVfdCAqaGFuZGxlID0gam91cm5hbF9jdXJyZW50X2hhbmRsZSgpOworCisJbXV0ZXhfbG9ja19uZXN0ZWQoJmlub2RlLT5pX211dGV4LCBJX01VVEVYX1FVT1RBKTsKKwl3aGlsZSAodG93cml0ZSA+IDApIHsKKwkJdG9jb3B5ID0gc2ItPnNfYmxvY2tzaXplIC0gb2Zmc2V0IDwgdG93cml0ZSA/CisJCQkJc2ItPnNfYmxvY2tzaXplIC0gb2Zmc2V0IDogdG93cml0ZTsKKwkJYmggPSBleHQ0X2JyZWFkKGhhbmRsZSwgaW5vZGUsIGJsaywgMSwgJmVycik7CisJCWlmICghYmgpCisJCQlnb3RvIG91dDsKKwkJaWYgKGpvdXJuYWxfcXVvdGEpIHsKKwkJCWVyciA9IGV4dDRfam91cm5hbF9nZXRfd3JpdGVfYWNjZXNzKGhhbmRsZSwgYmgpOworCQkJaWYgKGVycikgeworCQkJCWJyZWxzZShiaCk7CisJCQkJZ290byBvdXQ7CisJCQl9CisJCX0KKwkJbG9ja19idWZmZXIoYmgpOworCQltZW1jcHkoYmgtPmJfZGF0YStvZmZzZXQsIGRhdGEsIHRvY29weSk7CisJCWZsdXNoX2RjYWNoZV9wYWdlKGJoLT5iX3BhZ2UpOworCQl1bmxvY2tfYnVmZmVyKGJoKTsKKwkJaWYgKGpvdXJuYWxfcXVvdGEpCisJCQllcnIgPSBleHQ0X2pvdXJuYWxfZGlydHlfbWV0YWRhdGEoaGFuZGxlLCBiaCk7CisJCWVsc2UgeworCQkJLyogQWx3YXlzIGRvIGF0IGxlYXN0IG9yZGVyZWQgd3JpdGVzIGZvciBxdW90YXMgKi8KKwkJCWVyciA9IGV4dDRfam91cm5hbF9kaXJ0eV9kYXRhKGhhbmRsZSwgYmgpOworCQkJbWFya19idWZmZXJfZGlydHkoYmgpOworCQl9CisJCWJyZWxzZShiaCk7CisJCWlmIChlcnIpCisJCQlnb3RvIG91dDsKKwkJb2Zmc2V0ID0gMDsKKwkJdG93cml0ZSAtPSB0b2NvcHk7CisJCWRhdGEgKz0gdG9jb3B5OworCQlibGsrKzsKKwl9CitvdXQ6CisJaWYgKGxlbiA9PSB0b3dyaXRlKQorCQlyZXR1cm4gZXJyOworCWlmIChpbm9kZS0+aV9zaXplIDwgb2ZmK2xlbi10b3dyaXRlKSB7CisJCWlfc2l6ZV93cml0ZShpbm9kZSwgb2ZmK2xlbi10b3dyaXRlKTsKKwkJRVhUNF9JKGlub2RlKS0+aV9kaXNrc2l6ZSA9IGlub2RlLT5pX3NpemU7CisJfQorCWlub2RlLT5pX3ZlcnNpb24rKzsKKwlpbm9kZS0+aV9tdGltZSA9IGlub2RlLT5pX2N0aW1lID0gQ1VSUkVOVF9USU1FOworCWV4dDRfbWFya19pbm9kZV9kaXJ0eShoYW5kbGUsIGlub2RlKTsKKwltdXRleF91bmxvY2soJmlub2RlLT5pX211dGV4KTsKKwlyZXR1cm4gbGVuIC0gdG93cml0ZTsKK30KKworI2VuZGlmCisKK3N0YXRpYyBpbnQgZXh0NF9nZXRfc2Ioc3RydWN0IGZpbGVfc3lzdGVtX3R5cGUgKmZzX3R5cGUsCisJaW50IGZsYWdzLCBjb25zdCBjaGFyICpkZXZfbmFtZSwgdm9pZCAqZGF0YSwgc3RydWN0IHZmc21vdW50ICptbnQpCit7CisJcmV0dXJuIGdldF9zYl9iZGV2KGZzX3R5cGUsIGZsYWdzLCBkZXZfbmFtZSwgZGF0YSwgZXh0NF9maWxsX3N1cGVyLCBtbnQpOworfQorCitzdGF0aWMgc3RydWN0IGZpbGVfc3lzdGVtX3R5cGUgZXh0NGRldl9mc190eXBlID0geworCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwkubmFtZQkJPSAiZXh0NGRldiIsCisJLmdldF9zYgkJPSBleHQ0X2dldF9zYiwKKwkua2lsbF9zYgk9IGtpbGxfYmxvY2tfc3VwZXIsCisJLmZzX2ZsYWdzCT0gRlNfUkVRVUlSRVNfREVWLAorfTsKKworc3RhdGljIGludCBfX2luaXQgaW5pdF9leHQ0X2ZzKHZvaWQpCit7CisJaW50IGVyciA9IGluaXRfZXh0NF94YXR0cigpOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisJZXJyID0gaW5pdF9pbm9kZWNhY2hlKCk7CisJaWYgKGVycikKKwkJZ290byBvdXQxOworCWVyciA9IHJlZ2lzdGVyX2ZpbGVzeXN0ZW0oJmV4dDRkZXZfZnNfdHlwZSk7CisJaWYgKGVycikKKwkJZ290byBvdXQ7CisJcmV0dXJuIDA7CitvdXQ6CisJZGVzdHJveV9pbm9kZWNhY2hlKCk7CitvdXQxOgorCWV4aXRfZXh0NF94YXR0cigpOworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBleGl0X2V4dDRfZnModm9pZCkKK3sKKwl1bnJlZ2lzdGVyX2ZpbGVzeXN0ZW0oJmV4dDRkZXZfZnNfdHlwZSk7CisJZGVzdHJveV9pbm9kZWNhY2hlKCk7CisJZXhpdF9leHQ0X3hhdHRyKCk7Cit9CisKK01PRFVMRV9BVVRIT1IoIlJlbXkgQ2FyZCwgU3RlcGhlbiBUd2VlZGllLCBBbmRyZXcgTW9ydG9uLCBBbmRyZWFzIERpbGdlciwgVGhlb2RvcmUgVHMnbyBhbmQgb3RoZXJzIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkZvdXJ0aCBFeHRlbmRlZCBGaWxlc3lzdGVtIHdpdGggZXh0ZW50cyIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworbW9kdWxlX2luaXQoaW5pdF9leHQ0X2ZzKQorbW9kdWxlX2V4aXQoZXhpdF9leHQ0X2ZzKQpkaWZmIC0tZ2l0IGEvZnMvZXh0NC9zeW1saW5rLmMgYi9mcy9leHQ0L3N5bWxpbmsuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mY2Y1MjcyCi0tLSAvZGV2L251bGwKKysrIGIvZnMvZXh0NC9zeW1saW5rLmMKQEAgLTAsMCArMSw1NCBAQAorLyoKKyAqICBsaW51eC9mcy9leHQ0L3N5bWxpbmsuYworICoKKyAqIE9ubHkgZmFzdCBzeW1saW5rcyBsZWZ0IGhlcmUgLSB0aGUgcmVzdCBpcyBkb25lIGJ5IGdlbmVyaWMgY29kZS4gQVYsIDE5OTkKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTIsIDE5OTMsIDE5OTQsIDE5OTUKKyAqIFJlbXkgQ2FyZCAoY2FyZEBtYXNpLmlicC5mcikKKyAqIExhYm9yYXRvaXJlIE1BU0kgLSBJbnN0aXR1dCBCbGFpc2UgUGFzY2FsCisgKiBVbml2ZXJzaXRlIFBpZXJyZSBldCBNYXJpZSBDdXJpZSAoUGFyaXMgVkkpCisgKgorICogIGZyb20KKyAqCisgKiAgbGludXgvZnMvbWluaXgvc3ltbGluay5jCisgKgorICogIENvcHlyaWdodCAoQykgMTk5MSwgMTk5MiAgTGludXMgVG9ydmFsZHMKKyAqCisgKiAgZXh0NCBzeW1saW5rIGhhbmRsaW5nIGNvZGUKKyAqLworCisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9qYmQyLmg+CisjaW5jbHVkZSA8bGludXgvZXh0NF9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L25hbWVpLmg+CisjaW5jbHVkZSAieGF0dHIuaCIKKworc3RhdGljIHZvaWQgKiBleHQ0X2ZvbGxvd19saW5rKHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgc3RydWN0IG5hbWVpZGF0YSAqbmQpCit7CisJc3RydWN0IGV4dDRfaW5vZGVfaW5mbyAqZWkgPSBFWFQ0X0koZGVudHJ5LT5kX2lub2RlKTsKKwluZF9zZXRfbGluayhuZCwgKGNoYXIqKWVpLT5pX2RhdGEpOworCXJldHVybiBOVUxMOworfQorCitzdHJ1Y3QgaW5vZGVfb3BlcmF0aW9ucyBleHQ0X3N5bWxpbmtfaW5vZGVfb3BlcmF0aW9ucyA9IHsKKwkucmVhZGxpbmsJPSBnZW5lcmljX3JlYWRsaW5rLAorCS5mb2xsb3dfbGluawk9IHBhZ2VfZm9sbG93X2xpbmtfbGlnaHQsCisJLnB1dF9saW5rCT0gcGFnZV9wdXRfbGluaywKKyNpZmRlZiBDT05GSUdfRVhUNERFVl9GU19YQVRUUgorCS5zZXR4YXR0cgk9IGdlbmVyaWNfc2V0eGF0dHIsCisJLmdldHhhdHRyCT0gZ2VuZXJpY19nZXR4YXR0ciwKKwkubGlzdHhhdHRyCT0gZXh0NF9saXN0eGF0dHIsCisJLnJlbW92ZXhhdHRyCT0gZ2VuZXJpY19yZW1vdmV4YXR0ciwKKyNlbmRpZgorfTsKKworc3RydWN0IGlub2RlX29wZXJhdGlvbnMgZXh0NF9mYXN0X3N5bWxpbmtfaW5vZGVfb3BlcmF0aW9ucyA9IHsKKwkucmVhZGxpbmsJPSBnZW5lcmljX3JlYWRsaW5rLAorCS5mb2xsb3dfbGluawk9IGV4dDRfZm9sbG93X2xpbmssCisjaWZkZWYgQ09ORklHX0VYVDRERVZfRlNfWEFUVFIKKwkuc2V0eGF0dHIJPSBnZW5lcmljX3NldHhhdHRyLAorCS5nZXR4YXR0cgk9IGdlbmVyaWNfZ2V0eGF0dHIsCisJLmxpc3R4YXR0cgk9IGV4dDRfbGlzdHhhdHRyLAorCS5yZW1vdmV4YXR0cgk9IGdlbmVyaWNfcmVtb3ZleGF0dHIsCisjZW5kaWYKK307CmRpZmYgLS1naXQgYS9mcy9leHQ0L3hhdHRyLmMgYi9mcy9leHQ0L3hhdHRyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjMyMzNjZAotLS0gL2Rldi9udWxsCisrKyBiL2ZzL2V4dDQveGF0dHIuYwpAQCAtMCwwICsxLDEzMTcgQEAKKy8qCisgKiBsaW51eC9mcy9leHQ0L3hhdHRyLmMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwMyBBbmRyZWFzIEdydWVuYmFjaGVyLCA8YWdydWVuQHN1c2UuZGU+CisgKgorICogRml4IGJ5IEhhcnJpc29uIFhpbmcgPGhhcnJpc29uQG1vdW50YWludmlld2RhdGEuY29tPi4KKyAqIEV4dDQgY29kZSB3aXRoIGEgbG90IG9mIGhlbHAgZnJvbSBFcmljIEphcm1hbiA8ZWphcm1hbkBhY20ub3JnPi4KKyAqIEV4dGVuZGVkIGF0dHJpYnV0ZXMgZm9yIHN5bWxpbmtzIGFuZCBzcGVjaWFsIGZpbGVzIGFkZGVkIHBlcgorICogIHN1Z2dlc3Rpb24gb2YgTHVrYSBSZW5rbyA8bHVrYS5yZW5rb0BoZXJtZXMuc2k+LgorICogeGF0dHIgY29uc29saWRhdGlvbiBDb3B5cmlnaHQgKGMpIDIwMDQgSmFtZXMgTW9ycmlzIDxqbW9ycmlzQHJlZGhhdC5jb20+LAorICogIFJlZCBIYXQgSW5jLgorICogZWEtaW4taW5vZGUgc3VwcG9ydCBieSBBbGV4IFRvbWFzIDxhbGV4QGNsdXN0ZXJmcy5jb20+IGFrYSBienp6CisgKiAgYW5kIEFuZHJlYXMgR3J1ZW5iYWNoZXIgPGFncnVlbkBzdXNlLmRlPi4KKyAqLworCisvKgorICogRXh0ZW5kZWQgYXR0cmlidXRlcyBhcmUgc3RvcmVkIGRpcmVjdGx5IGluIGlub2RlcyAob24gZmlsZSBzeXN0ZW1zIHdpdGgKKyAqIGlub2RlcyBiaWdnZXIgdGhhbiAxMjggYnl0ZXMpIGFuZCBvbiBhZGRpdGlvbmFsIGRpc2sgYmxvY2tzLiBUaGUgaV9maWxlX2FjbAorICogZmllbGQgY29udGFpbnMgdGhlIGJsb2NrIG51bWJlciBpZiBhbiBpbm9kZSB1c2VzIGFuIGFkZGl0aW9uYWwgYmxvY2suIEFsbAorICogYXR0cmlidXRlcyBtdXN0IGZpdCBpbiB0aGUgaW5vZGUgYW5kIG9uZSBhZGRpdGlvbmFsIGJsb2NrLiBCbG9ja3MgdGhhdAorICogY29udGFpbiB0aGUgaWRlbnRpY2FsIHNldCBvZiBhdHRyaWJ1dGVzIG1heSBiZSBzaGFyZWQgYW1vbmcgc2V2ZXJhbCBpbm9kZXMuCisgKiBJZGVudGljYWwgYmxvY2tzIGFyZSBkZXRlY3RlZCBieSBrZWVwaW5nIGEgY2FjaGUgb2YgYmxvY2tzIHRoYXQgaGF2ZQorICogcmVjZW50bHkgYmVlbiBhY2Nlc3NlZC4KKyAqCisgKiBUaGUgYXR0cmlidXRlcyBpbiBpbm9kZXMgYW5kIG9uIGJsb2NrcyBoYXZlIGEgZGlmZmVyZW50IGhlYWRlcjsgdGhlIGVudHJpZXMKKyAqIGFyZSBzdG9yZWQgaW4gdGhlIHNhbWUgZm9ybWF0OgorICoKKyAqICAgKy0tLS0tLS0tLS0tLS0tLS0tLSsKKyAqICAgfCBoZWFkZXIgICAgICAgICAgIHwKKyAqICAgfCBlbnRyeSAxICAgICAgICAgIHwgfAorICogICB8IGVudHJ5IDIgICAgICAgICAgfCB8IGdyb3dpbmcgZG93bndhcmRzCisgKiAgIHwgZW50cnkgMyAgICAgICAgICB8IHYKKyAqICAgfCBmb3VyIG51bGwgYnl0ZXMgIHwKKyAqICAgfCAuIC4gLiAgICAgICAgICAgIHwKKyAqICAgfCB2YWx1ZSAxICAgICAgICAgIHwgXgorICogICB8IHZhbHVlIDMgICAgICAgICAgfCB8IGdyb3dpbmcgdXB3YXJkcworICogICB8IHZhbHVlIDIgICAgICAgICAgfCB8CisgKiAgICstLS0tLS0tLS0tLS0tLS0tLS0rCisgKgorICogVGhlIGhlYWRlciBpcyBmb2xsb3dlZCBieSBtdWx0aXBsZSBlbnRyeSBkZXNjcmlwdG9ycy4gSW4gZGlzayBibG9ja3MsIHRoZQorICogZW50cnkgZGVzY3JpcHRvcnMgYXJlIGtlcHQgc29ydGVkLiBJbiBpbm9kZXMsIHRoZXkgYXJlIHVuc29ydGVkLiBUaGUKKyAqIGF0dHJpYnV0ZSB2YWx1ZXMgYXJlIGFsaWduZWQgdG8gdGhlIGVuZCBvZiB0aGUgYmxvY2sgaW4gbm8gc3BlY2lmaWMgb3JkZXIuCisgKgorICogTG9ja2luZyBzdHJhdGVneQorICogLS0tLS0tLS0tLS0tLS0tLQorICogRVhUNF9JKGlub2RlKS0+aV9maWxlX2FjbCBpcyBwcm90ZWN0ZWQgYnkgRVhUNF9JKGlub2RlKS0+eGF0dHJfc2VtLgorICogRUEgYmxvY2tzIGFyZSBvbmx5IGNoYW5nZWQgaWYgdGhleSBhcmUgZXhjbHVzaXZlIHRvIGFuIGlub2RlLCBzbworICogaG9sZGluZyB4YXR0cl9zZW0gYWxzbyBtZWFucyB0aGF0IG5vdGhpbmcgYnV0IHRoZSBFQSBibG9jaydzIHJlZmVyZW5jZQorICogY291bnQgY2FuIGNoYW5nZS4gTXVsdGlwbGUgd3JpdGVycyB0byB0aGUgc2FtZSBibG9jayBhcmUgc3luY2hyb25pemVkCisgKiBieSB0aGUgYnVmZmVyIGxvY2suCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9leHQ0X2piZDIuaD4KKyNpbmNsdWRlIDxsaW51eC9leHQ0X2ZzLmg+CisjaW5jbHVkZSA8bGludXgvbWJjYWNoZS5oPgorI2luY2x1ZGUgPGxpbnV4L3F1b3Rhb3BzLmg+CisjaW5jbHVkZSA8bGludXgvcndzZW0uaD4KKyNpbmNsdWRlICJ4YXR0ci5oIgorI2luY2x1ZGUgImFjbC5oIgorCisjZGVmaW5lIEJIRFIoYmgpICgoc3RydWN0IGV4dDRfeGF0dHJfaGVhZGVyICopKChiaCktPmJfZGF0YSkpCisjZGVmaW5lIEVOVFJZKHB0cikgKChzdHJ1Y3QgZXh0NF94YXR0cl9lbnRyeSAqKShwdHIpKQorI2RlZmluZSBCRklSU1QoYmgpIEVOVFJZKEJIRFIoYmgpKzEpCisjZGVmaW5lIElTX0xBU1RfRU5UUlkoZW50cnkpICgqKF9fdTMyICopKGVudHJ5KSA9PSAwKQorCisjZGVmaW5lIElIRFIoaW5vZGUsIHJhd19pbm9kZSkgXAorCSgoc3RydWN0IGV4dDRfeGF0dHJfaWJvZHlfaGVhZGVyICopIFwKKwkJKCh2b2lkICopcmF3X2lub2RlICsgXAorCQkgRVhUNF9HT09EX09MRF9JTk9ERV9TSVpFICsgXAorCQkgRVhUNF9JKGlub2RlKS0+aV9leHRyYV9pc2l6ZSkpCisjZGVmaW5lIElGSVJTVChoZHIpICgoc3RydWN0IGV4dDRfeGF0dHJfZW50cnkgKikoKGhkcikrMSkpCisKKyNpZmRlZiBFWFQ0X1hBVFRSX0RFQlVHCisjIGRlZmluZSBlYV9pZGVidWcoaW5vZGUsIGYuLi4pIGRvIHsgXAorCQlwcmludGsoS0VSTl9ERUJVRyAiaW5vZGUgJXM6JWx1OiAiLCBcCisJCQlpbm9kZS0+aV9zYi0+c19pZCwgaW5vZGUtPmlfaW5vKTsgXAorCQlwcmludGsoZik7IFwKKwkJcHJpbnRrKCJcbiIpOyBcCisJfSB3aGlsZSAoMCkKKyMgZGVmaW5lIGVhX2JkZWJ1ZyhiaCwgZi4uLikgZG8geyBcCisJCWNoYXIgYltCREVWTkFNRV9TSVpFXTsgXAorCQlwcmludGsoS0VSTl9ERUJVRyAiYmxvY2sgJXM6JWx1OiAiLCBcCisJCQliZGV2bmFtZShiaC0+Yl9iZGV2LCBiKSwgXAorCQkJKHVuc2lnbmVkIGxvbmcpIGJoLT5iX2Jsb2NrbnIpOyBcCisJCXByaW50ayhmKTsgXAorCQlwcmludGsoIlxuIik7IFwKKwl9IHdoaWxlICgwKQorI2Vsc2UKKyMgZGVmaW5lIGVhX2lkZWJ1ZyhmLi4uKQorIyBkZWZpbmUgZWFfYmRlYnVnKGYuLi4pCisjZW5kaWYKKworc3RhdGljIHZvaWQgZXh0NF94YXR0cl9jYWNoZV9pbnNlcnQoc3RydWN0IGJ1ZmZlcl9oZWFkICopOworc3RhdGljIHN0cnVjdCBidWZmZXJfaGVhZCAqZXh0NF94YXR0cl9jYWNoZV9maW5kKHN0cnVjdCBpbm9kZSAqLAorCQkJCQkJIHN0cnVjdCBleHQ0X3hhdHRyX2hlYWRlciAqLAorCQkJCQkJIHN0cnVjdCBtYl9jYWNoZV9lbnRyeSAqKik7CitzdGF0aWMgdm9pZCBleHQ0X3hhdHRyX3JlaGFzaChzdHJ1Y3QgZXh0NF94YXR0cl9oZWFkZXIgKiwKKwkJCSAgICAgIHN0cnVjdCBleHQ0X3hhdHRyX2VudHJ5ICopOworCitzdGF0aWMgc3RydWN0IG1iX2NhY2hlICpleHQ0X3hhdHRyX2NhY2hlOworCitzdGF0aWMgc3RydWN0IHhhdHRyX2hhbmRsZXIgKmV4dDRfeGF0dHJfaGFuZGxlcl9tYXBbXSA9IHsKKwlbRVhUNF9YQVRUUl9JTkRFWF9VU0VSXQkJICAgICA9ICZleHQ0X3hhdHRyX3VzZXJfaGFuZGxlciwKKyNpZmRlZiBDT05GSUdfRVhUNERFVl9GU19QT1NJWF9BQ0wKKwlbRVhUNF9YQVRUUl9JTkRFWF9QT1NJWF9BQ0xfQUNDRVNTXSAgPSAmZXh0NF94YXR0cl9hY2xfYWNjZXNzX2hhbmRsZXIsCisJW0VYVDRfWEFUVFJfSU5ERVhfUE9TSVhfQUNMX0RFRkFVTFRdID0gJmV4dDRfeGF0dHJfYWNsX2RlZmF1bHRfaGFuZGxlciwKKyNlbmRpZgorCVtFWFQ0X1hBVFRSX0lOREVYX1RSVVNURURdCSAgICAgPSAmZXh0NF94YXR0cl90cnVzdGVkX2hhbmRsZXIsCisjaWZkZWYgQ09ORklHX0VYVDRERVZfRlNfU0VDVVJJVFkKKwlbRVhUNF9YQVRUUl9JTkRFWF9TRUNVUklUWV0JICAgICA9ICZleHQ0X3hhdHRyX3NlY3VyaXR5X2hhbmRsZXIsCisjZW5kaWYKK307CisKK3N0cnVjdCB4YXR0cl9oYW5kbGVyICpleHQ0X3hhdHRyX2hhbmRsZXJzW10gPSB7CisJJmV4dDRfeGF0dHJfdXNlcl9oYW5kbGVyLAorCSZleHQ0X3hhdHRyX3RydXN0ZWRfaGFuZGxlciwKKyNpZmRlZiBDT05GSUdfRVhUNERFVl9GU19QT1NJWF9BQ0wKKwkmZXh0NF94YXR0cl9hY2xfYWNjZXNzX2hhbmRsZXIsCisJJmV4dDRfeGF0dHJfYWNsX2RlZmF1bHRfaGFuZGxlciwKKyNlbmRpZgorI2lmZGVmIENPTkZJR19FWFQ0REVWX0ZTX1NFQ1VSSVRZCisJJmV4dDRfeGF0dHJfc2VjdXJpdHlfaGFuZGxlciwKKyNlbmRpZgorCU5VTEwKK307CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IHhhdHRyX2hhbmRsZXIgKgorZXh0NF94YXR0cl9oYW5kbGVyKGludCBuYW1lX2luZGV4KQoreworCXN0cnVjdCB4YXR0cl9oYW5kbGVyICpoYW5kbGVyID0gTlVMTDsKKworCWlmIChuYW1lX2luZGV4ID4gMCAmJiBuYW1lX2luZGV4IDwgQVJSQVlfU0laRShleHQ0X3hhdHRyX2hhbmRsZXJfbWFwKSkKKwkJaGFuZGxlciA9IGV4dDRfeGF0dHJfaGFuZGxlcl9tYXBbbmFtZV9pbmRleF07CisJcmV0dXJuIGhhbmRsZXI7Cit9CisKKy8qCisgKiBJbm9kZSBvcGVyYXRpb24gbGlzdHhhdHRyKCkKKyAqCisgKiBkZW50cnktPmRfaW5vZGUtPmlfbXV0ZXg6IGRvbid0IGNhcmUKKyAqLworc3NpemVfdAorZXh0NF9saXN0eGF0dHIoc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBjaGFyICpidWZmZXIsIHNpemVfdCBzaXplKQoreworCXJldHVybiBleHQ0X3hhdHRyX2xpc3QoZGVudHJ5LT5kX2lub2RlLCBidWZmZXIsIHNpemUpOworfQorCitzdGF0aWMgaW50CitleHQ0X3hhdHRyX2NoZWNrX25hbWVzKHN0cnVjdCBleHQ0X3hhdHRyX2VudHJ5ICplbnRyeSwgdm9pZCAqZW5kKQoreworCXdoaWxlICghSVNfTEFTVF9FTlRSWShlbnRyeSkpIHsKKwkJc3RydWN0IGV4dDRfeGF0dHJfZW50cnkgKm5leHQgPSBFWFQ0X1hBVFRSX05FWFQoZW50cnkpOworCQlpZiAoKHZvaWQgKiluZXh0ID49IGVuZCkKKwkJCXJldHVybiAtRUlPOworCQllbnRyeSA9IG5leHQ7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIGludAorZXh0NF94YXR0cl9jaGVja19ibG9jayhzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoKQoreworCWludCBlcnJvcjsKKworCWlmIChCSERSKGJoKS0+aF9tYWdpYyAhPSBjcHVfdG9fbGUzMihFWFQ0X1hBVFRSX01BR0lDKSB8fAorCSAgICBCSERSKGJoKS0+aF9ibG9ja3MgIT0gY3B1X3RvX2xlMzIoMSkpCisJCXJldHVybiAtRUlPOworCWVycm9yID0gZXh0NF94YXR0cl9jaGVja19uYW1lcyhCRklSU1QoYmgpLCBiaC0+Yl9kYXRhICsgYmgtPmJfc2l6ZSk7CisJcmV0dXJuIGVycm9yOworfQorCitzdGF0aWMgaW5saW5lIGludAorZXh0NF94YXR0cl9jaGVja19lbnRyeShzdHJ1Y3QgZXh0NF94YXR0cl9lbnRyeSAqZW50cnksIHNpemVfdCBzaXplKQoreworCXNpemVfdCB2YWx1ZV9zaXplID0gbGUzMl90b19jcHUoZW50cnktPmVfdmFsdWVfc2l6ZSk7CisKKwlpZiAoZW50cnktPmVfdmFsdWVfYmxvY2sgIT0gMCB8fCB2YWx1ZV9zaXplID4gc2l6ZSB8fAorCSAgICBsZTE2X3RvX2NwdShlbnRyeS0+ZV92YWx1ZV9vZmZzKSArIHZhbHVlX3NpemUgPiBzaXplKQorCQlyZXR1cm4gLUVJTzsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAorZXh0NF94YXR0cl9maW5kX2VudHJ5KHN0cnVjdCBleHQ0X3hhdHRyX2VudHJ5ICoqcGVudHJ5LCBpbnQgbmFtZV9pbmRleCwKKwkJICAgICAgY29uc3QgY2hhciAqbmFtZSwgc2l6ZV90IHNpemUsIGludCBzb3J0ZWQpCit7CisJc3RydWN0IGV4dDRfeGF0dHJfZW50cnkgKmVudHJ5OworCXNpemVfdCBuYW1lX2xlbjsKKwlpbnQgY21wID0gMTsKKworCWlmIChuYW1lID09IE5VTEwpCisJCXJldHVybiAtRUlOVkFMOworCW5hbWVfbGVuID0gc3RybGVuKG5hbWUpOworCWVudHJ5ID0gKnBlbnRyeTsKKwlmb3IgKDsgIUlTX0xBU1RfRU5UUlkoZW50cnkpOyBlbnRyeSA9IEVYVDRfWEFUVFJfTkVYVChlbnRyeSkpIHsKKwkJY21wID0gbmFtZV9pbmRleCAtIGVudHJ5LT5lX25hbWVfaW5kZXg7CisJCWlmICghY21wKQorCQkJY21wID0gbmFtZV9sZW4gLSBlbnRyeS0+ZV9uYW1lX2xlbjsKKwkJaWYgKCFjbXApCisJCQljbXAgPSBtZW1jbXAobmFtZSwgZW50cnktPmVfbmFtZSwgbmFtZV9sZW4pOworCQlpZiAoY21wIDw9IDAgJiYgKHNvcnRlZCB8fCBjbXAgPT0gMCkpCisJCQlicmVhazsKKwl9CisJKnBlbnRyeSA9IGVudHJ5OworCWlmICghY21wICYmIGV4dDRfeGF0dHJfY2hlY2tfZW50cnkoZW50cnksIHNpemUpKQorCQkJcmV0dXJuIC1FSU87CisJcmV0dXJuIGNtcCA/IC1FTk9EQVRBIDogMDsKK30KKworc3RhdGljIGludAorZXh0NF94YXR0cl9ibG9ja19nZXQoc3RydWN0IGlub2RlICppbm9kZSwgaW50IG5hbWVfaW5kZXgsIGNvbnN0IGNoYXIgKm5hbWUsCisJCSAgICAgdm9pZCAqYnVmZmVyLCBzaXplX3QgYnVmZmVyX3NpemUpCit7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCA9IE5VTEw7CisJc3RydWN0IGV4dDRfeGF0dHJfZW50cnkgKmVudHJ5OworCXNpemVfdCBzaXplOworCWludCBlcnJvcjsKKworCWVhX2lkZWJ1Zyhpbm9kZSwgIm5hbWU9JWQuJXMsIGJ1ZmZlcj0lcCwgYnVmZmVyX3NpemU9JWxkIiwKKwkJICBuYW1lX2luZGV4LCBuYW1lLCBidWZmZXIsIChsb25nKWJ1ZmZlcl9zaXplKTsKKworCWVycm9yID0gLUVOT0RBVEE7CisJaWYgKCFFWFQ0X0koaW5vZGUpLT5pX2ZpbGVfYWNsKQorCQlnb3RvIGNsZWFudXA7CisJZWFfaWRlYnVnKGlub2RlLCAicmVhZGluZyBibG9jayAldSIsIEVYVDRfSShpbm9kZSktPmlfZmlsZV9hY2wpOworCWJoID0gc2JfYnJlYWQoaW5vZGUtPmlfc2IsIEVYVDRfSShpbm9kZSktPmlfZmlsZV9hY2wpOworCWlmICghYmgpCisJCWdvdG8gY2xlYW51cDsKKwllYV9iZGVidWcoYmgsICJiX2NvdW50PSVkLCByZWZjb3VudD0lZCIsCisJCWF0b21pY19yZWFkKCYoYmgtPmJfY291bnQpKSwgbGUzMl90b19jcHUoQkhEUihiaCktPmhfcmVmY291bnQpKTsKKwlpZiAoZXh0NF94YXR0cl9jaGVja19ibG9jayhiaCkpIHsKK2JhZF9ibG9jazoJZXh0NF9lcnJvcihpbm9kZS0+aV9zYiwgX19GVU5DVElPTl9fLAorCQkJICAgImlub2RlICVsdTogYmFkIGJsb2NrICVsbHUiLCBpbm9kZS0+aV9pbm8sCisJCQkgICBFWFQ0X0koaW5vZGUpLT5pX2ZpbGVfYWNsKTsKKwkJZXJyb3IgPSAtRUlPOworCQlnb3RvIGNsZWFudXA7CisJfQorCWV4dDRfeGF0dHJfY2FjaGVfaW5zZXJ0KGJoKTsKKwllbnRyeSA9IEJGSVJTVChiaCk7CisJZXJyb3IgPSBleHQ0X3hhdHRyX2ZpbmRfZW50cnkoJmVudHJ5LCBuYW1lX2luZGV4LCBuYW1lLCBiaC0+Yl9zaXplLCAxKTsKKwlpZiAoZXJyb3IgPT0gLUVJTykKKwkJZ290byBiYWRfYmxvY2s7CisJaWYgKGVycm9yKQorCQlnb3RvIGNsZWFudXA7CisJc2l6ZSA9IGxlMzJfdG9fY3B1KGVudHJ5LT5lX3ZhbHVlX3NpemUpOworCWlmIChidWZmZXIpIHsKKwkJZXJyb3IgPSAtRVJBTkdFOworCQlpZiAoc2l6ZSA+IGJ1ZmZlcl9zaXplKQorCQkJZ290byBjbGVhbnVwOworCQltZW1jcHkoYnVmZmVyLCBiaC0+Yl9kYXRhICsgbGUxNl90b19jcHUoZW50cnktPmVfdmFsdWVfb2ZmcyksCisJCSAgICAgICBzaXplKTsKKwl9CisJZXJyb3IgPSBzaXplOworCitjbGVhbnVwOgorCWJyZWxzZShiaCk7CisJcmV0dXJuIGVycm9yOworfQorCitzdGF0aWMgaW50CitleHQ0X3hhdHRyX2lib2R5X2dldChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBpbnQgbmFtZV9pbmRleCwgY29uc3QgY2hhciAqbmFtZSwKKwkJICAgICB2b2lkICpidWZmZXIsIHNpemVfdCBidWZmZXJfc2l6ZSkKK3sKKwlzdHJ1Y3QgZXh0NF94YXR0cl9pYm9keV9oZWFkZXIgKmhlYWRlcjsKKwlzdHJ1Y3QgZXh0NF94YXR0cl9lbnRyeSAqZW50cnk7CisJc3RydWN0IGV4dDRfaW5vZGUgKnJhd19pbm9kZTsKKwlzdHJ1Y3QgZXh0NF9pbG9jIGlsb2M7CisJc2l6ZV90IHNpemU7CisJdm9pZCAqZW5kOworCWludCBlcnJvcjsKKworCWlmICghKEVYVDRfSShpbm9kZSktPmlfc3RhdGUgJiBFWFQ0X1NUQVRFX1hBVFRSKSkKKwkJcmV0dXJuIC1FTk9EQVRBOworCWVycm9yID0gZXh0NF9nZXRfaW5vZGVfbG9jKGlub2RlLCAmaWxvYyk7CisJaWYgKGVycm9yKQorCQlyZXR1cm4gZXJyb3I7CisJcmF3X2lub2RlID0gZXh0NF9yYXdfaW5vZGUoJmlsb2MpOworCWhlYWRlciA9IElIRFIoaW5vZGUsIHJhd19pbm9kZSk7CisJZW50cnkgPSBJRklSU1QoaGVhZGVyKTsKKwllbmQgPSAodm9pZCAqKXJhd19pbm9kZSArIEVYVDRfU0IoaW5vZGUtPmlfc2IpLT5zX2lub2RlX3NpemU7CisJZXJyb3IgPSBleHQ0X3hhdHRyX2NoZWNrX25hbWVzKGVudHJ5LCBlbmQpOworCWlmIChlcnJvcikKKwkJZ290byBjbGVhbnVwOworCWVycm9yID0gZXh0NF94YXR0cl9maW5kX2VudHJ5KCZlbnRyeSwgbmFtZV9pbmRleCwgbmFtZSwKKwkJCQkgICAgICBlbmQgLSAodm9pZCAqKWVudHJ5LCAwKTsKKwlpZiAoZXJyb3IpCisJCWdvdG8gY2xlYW51cDsKKwlzaXplID0gbGUzMl90b19jcHUoZW50cnktPmVfdmFsdWVfc2l6ZSk7CisJaWYgKGJ1ZmZlcikgeworCQllcnJvciA9IC1FUkFOR0U7CisJCWlmIChzaXplID4gYnVmZmVyX3NpemUpCisJCQlnb3RvIGNsZWFudXA7CisJCW1lbWNweShidWZmZXIsICh2b2lkICopSUZJUlNUKGhlYWRlcikgKworCQkgICAgICAgbGUxNl90b19jcHUoZW50cnktPmVfdmFsdWVfb2ZmcyksIHNpemUpOworCX0KKwllcnJvciA9IHNpemU7CisKK2NsZWFudXA6CisJYnJlbHNlKGlsb2MuYmgpOworCXJldHVybiBlcnJvcjsKK30KKworLyoKKyAqIGV4dDRfeGF0dHJfZ2V0KCkKKyAqCisgKiBDb3B5IGFuIGV4dGVuZGVkIGF0dHJpYnV0ZSBpbnRvIHRoZSBidWZmZXIKKyAqIHByb3ZpZGVkLCBvciBjb21wdXRlIHRoZSBidWZmZXIgc2l6ZSByZXF1aXJlZC4KKyAqIEJ1ZmZlciBpcyBOVUxMIHRvIGNvbXB1dGUgdGhlIHNpemUgb2YgdGhlIGJ1ZmZlciByZXF1aXJlZC4KKyAqCisgKiBSZXR1cm5zIGEgbmVnYXRpdmUgZXJyb3IgbnVtYmVyIG9uIGZhaWx1cmUsIG9yIHRoZSBudW1iZXIgb2YgYnl0ZXMKKyAqIHVzZWQgLyByZXF1aXJlZCBvbiBzdWNjZXNzLgorICovCitpbnQKK2V4dDRfeGF0dHJfZ2V0KHN0cnVjdCBpbm9kZSAqaW5vZGUsIGludCBuYW1lX2luZGV4LCBjb25zdCBjaGFyICpuYW1lLAorCSAgICAgICB2b2lkICpidWZmZXIsIHNpemVfdCBidWZmZXJfc2l6ZSkKK3sKKwlpbnQgZXJyb3I7CisKKwlkb3duX3JlYWQoJkVYVDRfSShpbm9kZSktPnhhdHRyX3NlbSk7CisJZXJyb3IgPSBleHQ0X3hhdHRyX2lib2R5X2dldChpbm9kZSwgbmFtZV9pbmRleCwgbmFtZSwgYnVmZmVyLAorCQkJCSAgICAgYnVmZmVyX3NpemUpOworCWlmIChlcnJvciA9PSAtRU5PREFUQSkKKwkJZXJyb3IgPSBleHQ0X3hhdHRyX2Jsb2NrX2dldChpbm9kZSwgbmFtZV9pbmRleCwgbmFtZSwgYnVmZmVyLAorCQkJCQkgICAgIGJ1ZmZlcl9zaXplKTsKKwl1cF9yZWFkKCZFWFQ0X0koaW5vZGUpLT54YXR0cl9zZW0pOworCXJldHVybiBlcnJvcjsKK30KKworc3RhdGljIGludAorZXh0NF94YXR0cl9saXN0X2VudHJpZXMoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGV4dDRfeGF0dHJfZW50cnkgKmVudHJ5LAorCQkJY2hhciAqYnVmZmVyLCBzaXplX3QgYnVmZmVyX3NpemUpCit7CisJc2l6ZV90IHJlc3QgPSBidWZmZXJfc2l6ZTsKKworCWZvciAoOyAhSVNfTEFTVF9FTlRSWShlbnRyeSk7IGVudHJ5ID0gRVhUNF9YQVRUUl9ORVhUKGVudHJ5KSkgeworCQlzdHJ1Y3QgeGF0dHJfaGFuZGxlciAqaGFuZGxlciA9CisJCQlleHQ0X3hhdHRyX2hhbmRsZXIoZW50cnktPmVfbmFtZV9pbmRleCk7CisKKwkJaWYgKGhhbmRsZXIpIHsKKwkJCXNpemVfdCBzaXplID0gaGFuZGxlci0+bGlzdChpbm9kZSwgYnVmZmVyLCByZXN0LAorCQkJCQkJICAgIGVudHJ5LT5lX25hbWUsCisJCQkJCQkgICAgZW50cnktPmVfbmFtZV9sZW4pOworCQkJaWYgKGJ1ZmZlcikgeworCQkJCWlmIChzaXplID4gcmVzdCkKKwkJCQkJcmV0dXJuIC1FUkFOR0U7CisJCQkJYnVmZmVyICs9IHNpemU7CisJCQl9CisJCQlyZXN0IC09IHNpemU7CisJCX0KKwl9CisJcmV0dXJuIGJ1ZmZlcl9zaXplIC0gcmVzdDsKK30KKworc3RhdGljIGludAorZXh0NF94YXR0cl9ibG9ja19saXN0KHN0cnVjdCBpbm9kZSAqaW5vZGUsIGNoYXIgKmJ1ZmZlciwgc2l6ZV90IGJ1ZmZlcl9zaXplKQoreworCXN0cnVjdCBidWZmZXJfaGVhZCAqYmggPSBOVUxMOworCWludCBlcnJvcjsKKworCWVhX2lkZWJ1Zyhpbm9kZSwgImJ1ZmZlcj0lcCwgYnVmZmVyX3NpemU9JWxkIiwKKwkJICBidWZmZXIsIChsb25nKWJ1ZmZlcl9zaXplKTsKKworCWVycm9yID0gMDsKKwlpZiAoIUVYVDRfSShpbm9kZSktPmlfZmlsZV9hY2wpCisJCWdvdG8gY2xlYW51cDsKKwllYV9pZGVidWcoaW5vZGUsICJyZWFkaW5nIGJsb2NrICV1IiwgRVhUNF9JKGlub2RlKS0+aV9maWxlX2FjbCk7CisJYmggPSBzYl9icmVhZChpbm9kZS0+aV9zYiwgRVhUNF9JKGlub2RlKS0+aV9maWxlX2FjbCk7CisJZXJyb3IgPSAtRUlPOworCWlmICghYmgpCisJCWdvdG8gY2xlYW51cDsKKwllYV9iZGVidWcoYmgsICJiX2NvdW50PSVkLCByZWZjb3VudD0lZCIsCisJCWF0b21pY19yZWFkKCYoYmgtPmJfY291bnQpKSwgbGUzMl90b19jcHUoQkhEUihiaCktPmhfcmVmY291bnQpKTsKKwlpZiAoZXh0NF94YXR0cl9jaGVja19ibG9jayhiaCkpIHsKKwkJZXh0NF9lcnJvcihpbm9kZS0+aV9zYiwgX19GVU5DVElPTl9fLAorCQkJICAgImlub2RlICVsdTogYmFkIGJsb2NrICVsbHUiLCBpbm9kZS0+aV9pbm8sCisJCQkgICBFWFQ0X0koaW5vZGUpLT5pX2ZpbGVfYWNsKTsKKwkJZXJyb3IgPSAtRUlPOworCQlnb3RvIGNsZWFudXA7CisJfQorCWV4dDRfeGF0dHJfY2FjaGVfaW5zZXJ0KGJoKTsKKwllcnJvciA9IGV4dDRfeGF0dHJfbGlzdF9lbnRyaWVzKGlub2RlLCBCRklSU1QoYmgpLCBidWZmZXIsIGJ1ZmZlcl9zaXplKTsKKworY2xlYW51cDoKKwlicmVsc2UoYmgpOworCisJcmV0dXJuIGVycm9yOworfQorCitzdGF0aWMgaW50CitleHQ0X3hhdHRyX2lib2R5X2xpc3Qoc3RydWN0IGlub2RlICppbm9kZSwgY2hhciAqYnVmZmVyLCBzaXplX3QgYnVmZmVyX3NpemUpCit7CisJc3RydWN0IGV4dDRfeGF0dHJfaWJvZHlfaGVhZGVyICpoZWFkZXI7CisJc3RydWN0IGV4dDRfaW5vZGUgKnJhd19pbm9kZTsKKwlzdHJ1Y3QgZXh0NF9pbG9jIGlsb2M7CisJdm9pZCAqZW5kOworCWludCBlcnJvcjsKKworCWlmICghKEVYVDRfSShpbm9kZSktPmlfc3RhdGUgJiBFWFQ0X1NUQVRFX1hBVFRSKSkKKwkJcmV0dXJuIDA7CisJZXJyb3IgPSBleHQ0X2dldF9pbm9kZV9sb2MoaW5vZGUsICZpbG9jKTsKKwlpZiAoZXJyb3IpCisJCXJldHVybiBlcnJvcjsKKwlyYXdfaW5vZGUgPSBleHQ0X3Jhd19pbm9kZSgmaWxvYyk7CisJaGVhZGVyID0gSUhEUihpbm9kZSwgcmF3X2lub2RlKTsKKwllbmQgPSAodm9pZCAqKXJhd19pbm9kZSArIEVYVDRfU0IoaW5vZGUtPmlfc2IpLT5zX2lub2RlX3NpemU7CisJZXJyb3IgPSBleHQ0X3hhdHRyX2NoZWNrX25hbWVzKElGSVJTVChoZWFkZXIpLCBlbmQpOworCWlmIChlcnJvcikKKwkJZ290byBjbGVhbnVwOworCWVycm9yID0gZXh0NF94YXR0cl9saXN0X2VudHJpZXMoaW5vZGUsIElGSVJTVChoZWFkZXIpLAorCQkJCQlidWZmZXIsIGJ1ZmZlcl9zaXplKTsKKworY2xlYW51cDoKKwlicmVsc2UoaWxvYy5iaCk7CisJcmV0dXJuIGVycm9yOworfQorCisvKgorICogZXh0NF94YXR0cl9saXN0KCkKKyAqCisgKiBDb3B5IGEgbGlzdCBvZiBhdHRyaWJ1dGUgbmFtZXMgaW50byB0aGUgYnVmZmVyCisgKiBwcm92aWRlZCwgb3IgY29tcHV0ZSB0aGUgYnVmZmVyIHNpemUgcmVxdWlyZWQuCisgKiBCdWZmZXIgaXMgTlVMTCB0byBjb21wdXRlIHRoZSBzaXplIG9mIHRoZSBidWZmZXIgcmVxdWlyZWQuCisgKgorICogUmV0dXJucyBhIG5lZ2F0aXZlIGVycm9yIG51bWJlciBvbiBmYWlsdXJlLCBvciB0aGUgbnVtYmVyIG9mIGJ5dGVzCisgKiB1c2VkIC8gcmVxdWlyZWQgb24gc3VjY2Vzcy4KKyAqLworaW50CitleHQ0X3hhdHRyX2xpc3Qoc3RydWN0IGlub2RlICppbm9kZSwgY2hhciAqYnVmZmVyLCBzaXplX3QgYnVmZmVyX3NpemUpCit7CisJaW50IGlfZXJyb3IsIGJfZXJyb3I7CisKKwlkb3duX3JlYWQoJkVYVDRfSShpbm9kZSktPnhhdHRyX3NlbSk7CisJaV9lcnJvciA9IGV4dDRfeGF0dHJfaWJvZHlfbGlzdChpbm9kZSwgYnVmZmVyLCBidWZmZXJfc2l6ZSk7CisJaWYgKGlfZXJyb3IgPCAwKSB7CisJCWJfZXJyb3IgPSAwOworCX0gZWxzZSB7CisJCWlmIChidWZmZXIpIHsKKwkJCWJ1ZmZlciArPSBpX2Vycm9yOworCQkJYnVmZmVyX3NpemUgLT0gaV9lcnJvcjsKKwkJfQorCQliX2Vycm9yID0gZXh0NF94YXR0cl9ibG9ja19saXN0KGlub2RlLCBidWZmZXIsIGJ1ZmZlcl9zaXplKTsKKwkJaWYgKGJfZXJyb3IgPCAwKQorCQkJaV9lcnJvciA9IDA7CisJfQorCXVwX3JlYWQoJkVYVDRfSShpbm9kZSktPnhhdHRyX3NlbSk7CisJcmV0dXJuIGlfZXJyb3IgKyBiX2Vycm9yOworfQorCisvKgorICogSWYgdGhlIEVYVDRfRkVBVFVSRV9DT01QQVRfRVhUX0FUVFIgZmVhdHVyZSBvZiB0aGlzIGZpbGUgc3lzdGVtIGlzCisgKiBub3Qgc2V0LCBzZXQgaXQuCisgKi8KK3N0YXRpYyB2b2lkIGV4dDRfeGF0dHJfdXBkYXRlX3N1cGVyX2Jsb2NrKGhhbmRsZV90ICpoYW5kbGUsCisJCQkJCSAgc3RydWN0IHN1cGVyX2Jsb2NrICpzYikKK3sKKwlpZiAoRVhUNF9IQVNfQ09NUEFUX0ZFQVRVUkUoc2IsIEVYVDRfRkVBVFVSRV9DT01QQVRfRVhUX0FUVFIpKQorCQlyZXR1cm47CisKKwlsb2NrX3N1cGVyKHNiKTsKKwlpZiAoZXh0NF9qb3VybmFsX2dldF93cml0ZV9hY2Nlc3MoaGFuZGxlLCBFWFQ0X1NCKHNiKS0+c19zYmgpID09IDApIHsKKwkJRVhUNF9TQihzYiktPnNfZXMtPnNfZmVhdHVyZV9jb21wYXQgfD0KKwkJCWNwdV90b19sZTMyKEVYVDRfRkVBVFVSRV9DT01QQVRfRVhUX0FUVFIpOworCQlzYi0+c19kaXJ0ID0gMTsKKwkJZXh0NF9qb3VybmFsX2RpcnR5X21ldGFkYXRhKGhhbmRsZSwgRVhUNF9TQihzYiktPnNfc2JoKTsKKwl9CisJdW5sb2NrX3N1cGVyKHNiKTsKK30KKworLyoKKyAqIFJlbGVhc2UgdGhlIHhhdHRyIGJsb2NrIEJIOiBJZiB0aGUgcmVmZXJlbmNlIGNvdW50IGlzID4gMSwgZGVjcmVtZW50CisgKiBpdDsgb3RoZXJ3aXNlIGZyZWUgdGhlIGJsb2NrLgorICovCitzdGF0aWMgdm9pZAorZXh0NF94YXR0cl9yZWxlYXNlX2Jsb2NrKGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBpbm9kZSAqaW5vZGUsCisJCQkgc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCkKK3sKKwlzdHJ1Y3QgbWJfY2FjaGVfZW50cnkgKmNlID0gTlVMTDsKKworCWNlID0gbWJfY2FjaGVfZW50cnlfZ2V0KGV4dDRfeGF0dHJfY2FjaGUsIGJoLT5iX2JkZXYsIGJoLT5iX2Jsb2NrbnIpOworCWlmIChCSERSKGJoKS0+aF9yZWZjb3VudCA9PSBjcHVfdG9fbGUzMigxKSkgeworCQllYV9iZGVidWcoYmgsICJyZWZjb3VudCBub3c9MDsgZnJlZWluZyIpOworCQlpZiAoY2UpCisJCQltYl9jYWNoZV9lbnRyeV9mcmVlKGNlKTsKKwkJZXh0NF9mcmVlX2Jsb2NrcyhoYW5kbGUsIGlub2RlLCBiaC0+Yl9ibG9ja25yLCAxKTsKKwkJZ2V0X2JoKGJoKTsKKwkJZXh0NF9mb3JnZXQoaGFuZGxlLCAxLCBpbm9kZSwgYmgsIGJoLT5iX2Jsb2NrbnIpOworCX0gZWxzZSB7CisJCWlmIChleHQ0X2pvdXJuYWxfZ2V0X3dyaXRlX2FjY2VzcyhoYW5kbGUsIGJoKSA9PSAwKSB7CisJCQlsb2NrX2J1ZmZlcihiaCk7CisJCQlCSERSKGJoKS0+aF9yZWZjb3VudCA9IGNwdV90b19sZTMyKAorCQkJCWxlMzJfdG9fY3B1KEJIRFIoYmgpLT5oX3JlZmNvdW50KSAtIDEpOworCQkJZXh0NF9qb3VybmFsX2RpcnR5X21ldGFkYXRhKGhhbmRsZSwgYmgpOworCQkJaWYgKElTX1NZTkMoaW5vZGUpKQorCQkJCWhhbmRsZS0+aF9zeW5jID0gMTsKKwkJCURRVU9UX0ZSRUVfQkxPQ0soaW5vZGUsIDEpOworCQkJdW5sb2NrX2J1ZmZlcihiaCk7CisJCQllYV9iZGVidWcoYmgsICJyZWZjb3VudCBub3c9JWQ7IHJlbGVhc2luZyIsCisJCQkJICBsZTMyX3RvX2NwdShCSERSKGJoKS0+aF9yZWZjb3VudCkpOworCQl9CisJCWlmIChjZSkKKwkJCW1iX2NhY2hlX2VudHJ5X3JlbGVhc2UoY2UpOworCX0KK30KKworc3RydWN0IGV4dDRfeGF0dHJfaW5mbyB7CisJaW50IG5hbWVfaW5kZXg7CisJY29uc3QgY2hhciAqbmFtZTsKKwljb25zdCB2b2lkICp2YWx1ZTsKKwlzaXplX3QgdmFsdWVfbGVuOworfTsKKworc3RydWN0IGV4dDRfeGF0dHJfc2VhcmNoIHsKKwlzdHJ1Y3QgZXh0NF94YXR0cl9lbnRyeSAqZmlyc3Q7CisJdm9pZCAqYmFzZTsKKwl2b2lkICplbmQ7CisJc3RydWN0IGV4dDRfeGF0dHJfZW50cnkgKmhlcmU7CisJaW50IG5vdF9mb3VuZDsKK307CisKK3N0YXRpYyBpbnQKK2V4dDRfeGF0dHJfc2V0X2VudHJ5KHN0cnVjdCBleHQ0X3hhdHRyX2luZm8gKmksIHN0cnVjdCBleHQ0X3hhdHRyX3NlYXJjaCAqcykKK3sKKwlzdHJ1Y3QgZXh0NF94YXR0cl9lbnRyeSAqbGFzdDsKKwlzaXplX3QgZnJlZSwgbWluX29mZnMgPSBzLT5lbmQgLSBzLT5iYXNlLCBuYW1lX2xlbiA9IHN0cmxlbihpLT5uYW1lKTsKKworCS8qIENvbXB1dGUgbWluX29mZnMgYW5kIGxhc3QuICovCisJbGFzdCA9IHMtPmZpcnN0OworCWZvciAoOyAhSVNfTEFTVF9FTlRSWShsYXN0KTsgbGFzdCA9IEVYVDRfWEFUVFJfTkVYVChsYXN0KSkgeworCQlpZiAoIWxhc3QtPmVfdmFsdWVfYmxvY2sgJiYgbGFzdC0+ZV92YWx1ZV9zaXplKSB7CisJCQlzaXplX3Qgb2ZmcyA9IGxlMTZfdG9fY3B1KGxhc3QtPmVfdmFsdWVfb2Zmcyk7CisJCQlpZiAob2ZmcyA8IG1pbl9vZmZzKQorCQkJCW1pbl9vZmZzID0gb2ZmczsKKwkJfQorCX0KKwlmcmVlID0gbWluX29mZnMgLSAoKHZvaWQgKilsYXN0IC0gcy0+YmFzZSkgLSBzaXplb2YoX191MzIpOworCWlmICghcy0+bm90X2ZvdW5kKSB7CisJCWlmICghcy0+aGVyZS0+ZV92YWx1ZV9ibG9jayAmJiBzLT5oZXJlLT5lX3ZhbHVlX3NpemUpIHsKKwkJCXNpemVfdCBzaXplID0gbGUzMl90b19jcHUocy0+aGVyZS0+ZV92YWx1ZV9zaXplKTsKKwkJCWZyZWUgKz0gRVhUNF9YQVRUUl9TSVpFKHNpemUpOworCQl9CisJCWZyZWUgKz0gRVhUNF9YQVRUUl9MRU4obmFtZV9sZW4pOworCX0KKwlpZiAoaS0+dmFsdWUpIHsKKwkJaWYgKGZyZWUgPCBFWFQ0X1hBVFRSX1NJWkUoaS0+dmFsdWVfbGVuKSB8fAorCQkgICAgZnJlZSA8IEVYVDRfWEFUVFJfTEVOKG5hbWVfbGVuKSArCisJCQkgICBFWFQ0X1hBVFRSX1NJWkUoaS0+dmFsdWVfbGVuKSkKKwkJCXJldHVybiAtRU5PU1BDOworCX0KKworCWlmIChpLT52YWx1ZSAmJiBzLT5ub3RfZm91bmQpIHsKKwkJLyogSW5zZXJ0IHRoZSBuZXcgbmFtZS4gKi8KKwkJc2l6ZV90IHNpemUgPSBFWFQ0X1hBVFRSX0xFTihuYW1lX2xlbik7CisJCXNpemVfdCByZXN0ID0gKHZvaWQgKilsYXN0IC0gKHZvaWQgKilzLT5oZXJlICsgc2l6ZW9mKF9fdTMyKTsKKwkJbWVtbW92ZSgodm9pZCAqKXMtPmhlcmUgKyBzaXplLCBzLT5oZXJlLCByZXN0KTsKKwkJbWVtc2V0KHMtPmhlcmUsIDAsIHNpemUpOworCQlzLT5oZXJlLT5lX25hbWVfaW5kZXggPSBpLT5uYW1lX2luZGV4OworCQlzLT5oZXJlLT5lX25hbWVfbGVuID0gbmFtZV9sZW47CisJCW1lbWNweShzLT5oZXJlLT5lX25hbWUsIGktPm5hbWUsIG5hbWVfbGVuKTsKKwl9IGVsc2UgeworCQlpZiAoIXMtPmhlcmUtPmVfdmFsdWVfYmxvY2sgJiYgcy0+aGVyZS0+ZV92YWx1ZV9zaXplKSB7CisJCQl2b2lkICpmaXJzdF92YWwgPSBzLT5iYXNlICsgbWluX29mZnM7CisJCQlzaXplX3Qgb2ZmcyA9IGxlMTZfdG9fY3B1KHMtPmhlcmUtPmVfdmFsdWVfb2Zmcyk7CisJCQl2b2lkICp2YWwgPSBzLT5iYXNlICsgb2ZmczsKKwkJCXNpemVfdCBzaXplID0gRVhUNF9YQVRUUl9TSVpFKAorCQkJCWxlMzJfdG9fY3B1KHMtPmhlcmUtPmVfdmFsdWVfc2l6ZSkpOworCisJCQlpZiAoaS0+dmFsdWUgJiYgc2l6ZSA9PSBFWFQ0X1hBVFRSX1NJWkUoaS0+dmFsdWVfbGVuKSkgeworCQkJCS8qIFRoZSBvbGQgYW5kIHRoZSBuZXcgdmFsdWUgaGF2ZSB0aGUgc2FtZQorCQkJCSAgIHNpemUuIEp1c3QgcmVwbGFjZS4gKi8KKwkJCQlzLT5oZXJlLT5lX3ZhbHVlX3NpemUgPQorCQkJCQljcHVfdG9fbGUzMihpLT52YWx1ZV9sZW4pOworCQkJCW1lbXNldCh2YWwgKyBzaXplIC0gRVhUNF9YQVRUUl9QQUQsIDAsCisJCQkJICAgICAgIEVYVDRfWEFUVFJfUEFEKTsgLyogQ2xlYXIgcGFkIGJ5dGVzLiAqLworCQkJCW1lbWNweSh2YWwsIGktPnZhbHVlLCBpLT52YWx1ZV9sZW4pOworCQkJCXJldHVybiAwOworCQkJfQorCisJCQkvKiBSZW1vdmUgdGhlIG9sZCB2YWx1ZS4gKi8KKwkJCW1lbW1vdmUoZmlyc3RfdmFsICsgc2l6ZSwgZmlyc3RfdmFsLCB2YWwgLSBmaXJzdF92YWwpOworCQkJbWVtc2V0KGZpcnN0X3ZhbCwgMCwgc2l6ZSk7CisJCQlzLT5oZXJlLT5lX3ZhbHVlX3NpemUgPSAwOworCQkJcy0+aGVyZS0+ZV92YWx1ZV9vZmZzID0gMDsKKwkJCW1pbl9vZmZzICs9IHNpemU7CisKKwkJCS8qIEFkanVzdCBhbGwgdmFsdWUgb2Zmc2V0cy4gKi8KKwkJCWxhc3QgPSBzLT5maXJzdDsKKwkJCXdoaWxlICghSVNfTEFTVF9FTlRSWShsYXN0KSkgeworCQkJCXNpemVfdCBvID0gbGUxNl90b19jcHUobGFzdC0+ZV92YWx1ZV9vZmZzKTsKKwkJCQlpZiAoIWxhc3QtPmVfdmFsdWVfYmxvY2sgJiYKKwkJCQkgICAgbGFzdC0+ZV92YWx1ZV9zaXplICYmIG8gPCBvZmZzKQorCQkJCQlsYXN0LT5lX3ZhbHVlX29mZnMgPQorCQkJCQkJY3B1X3RvX2xlMTYobyArIHNpemUpOworCQkJCWxhc3QgPSBFWFQ0X1hBVFRSX05FWFQobGFzdCk7CisJCQl9CisJCX0KKwkJaWYgKCFpLT52YWx1ZSkgeworCQkJLyogUmVtb3ZlIHRoZSBvbGQgbmFtZS4gKi8KKwkJCXNpemVfdCBzaXplID0gRVhUNF9YQVRUUl9MRU4obmFtZV9sZW4pOworCQkJbGFzdCA9IEVOVFJZKCh2b2lkICopbGFzdCAtIHNpemUpOworCQkJbWVtbW92ZShzLT5oZXJlLCAodm9pZCAqKXMtPmhlcmUgKyBzaXplLAorCQkJCSh2b2lkICopbGFzdCAtICh2b2lkICopcy0+aGVyZSArIHNpemVvZihfX3UzMikpOworCQkJbWVtc2V0KGxhc3QsIDAsIHNpemUpOworCQl9CisJfQorCisJaWYgKGktPnZhbHVlKSB7CisJCS8qIEluc2VydCB0aGUgbmV3IHZhbHVlLiAqLworCQlzLT5oZXJlLT5lX3ZhbHVlX3NpemUgPSBjcHVfdG9fbGUzMihpLT52YWx1ZV9sZW4pOworCQlpZiAoaS0+dmFsdWVfbGVuKSB7CisJCQlzaXplX3Qgc2l6ZSA9IEVYVDRfWEFUVFJfU0laRShpLT52YWx1ZV9sZW4pOworCQkJdm9pZCAqdmFsID0gcy0+YmFzZSArIG1pbl9vZmZzIC0gc2l6ZTsKKwkJCXMtPmhlcmUtPmVfdmFsdWVfb2ZmcyA9IGNwdV90b19sZTE2KG1pbl9vZmZzIC0gc2l6ZSk7CisJCQltZW1zZXQodmFsICsgc2l6ZSAtIEVYVDRfWEFUVFJfUEFELCAwLAorCQkJICAgICAgIEVYVDRfWEFUVFJfUEFEKTsgLyogQ2xlYXIgdGhlIHBhZCBieXRlcy4gKi8KKwkJCW1lbWNweSh2YWwsIGktPnZhbHVlLCBpLT52YWx1ZV9sZW4pOworCQl9CisJfQorCXJldHVybiAwOworfQorCitzdHJ1Y3QgZXh0NF94YXR0cl9ibG9ja19maW5kIHsKKwlzdHJ1Y3QgZXh0NF94YXR0cl9zZWFyY2ggczsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoOworfTsKKworc3RhdGljIGludAorZXh0NF94YXR0cl9ibG9ja19maW5kKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBleHQ0X3hhdHRyX2luZm8gKmksCisJCSAgICAgIHN0cnVjdCBleHQ0X3hhdHRyX2Jsb2NrX2ZpbmQgKmJzKQoreworCXN0cnVjdCBzdXBlcl9ibG9jayAqc2IgPSBpbm9kZS0+aV9zYjsKKwlpbnQgZXJyb3I7CisKKwllYV9pZGVidWcoaW5vZGUsICJuYW1lPSVkLiVzLCB2YWx1ZT0lcCwgdmFsdWVfbGVuPSVsZCIsCisJCSAgaS0+bmFtZV9pbmRleCwgaS0+bmFtZSwgaS0+dmFsdWUsIChsb25nKWktPnZhbHVlX2xlbik7CisKKwlpZiAoRVhUNF9JKGlub2RlKS0+aV9maWxlX2FjbCkgeworCQkvKiBUaGUgaW5vZGUgYWxyZWFkeSBoYXMgYW4gZXh0ZW5kZWQgYXR0cmlidXRlIGJsb2NrLiAqLworCQlicy0+YmggPSBzYl9icmVhZChzYiwgRVhUNF9JKGlub2RlKS0+aV9maWxlX2FjbCk7CisJCWVycm9yID0gLUVJTzsKKwkJaWYgKCFicy0+YmgpCisJCQlnb3RvIGNsZWFudXA7CisJCWVhX2JkZWJ1Zyhicy0+YmgsICJiX2NvdW50PSVkLCByZWZjb3VudD0lZCIsCisJCQlhdG9taWNfcmVhZCgmKGJzLT5iaC0+Yl9jb3VudCkpLAorCQkJbGUzMl90b19jcHUoQkhEUihicy0+YmgpLT5oX3JlZmNvdW50KSk7CisJCWlmIChleHQ0X3hhdHRyX2NoZWNrX2Jsb2NrKGJzLT5iaCkpIHsKKwkJCWV4dDRfZXJyb3Ioc2IsIF9fRlVOQ1RJT05fXywKKwkJCQkiaW5vZGUgJWx1OiBiYWQgYmxvY2sgJWxsdSIsIGlub2RlLT5pX2lubywKKwkJCQlFWFQ0X0koaW5vZGUpLT5pX2ZpbGVfYWNsKTsKKwkJCWVycm9yID0gLUVJTzsKKwkJCWdvdG8gY2xlYW51cDsKKwkJfQorCQkvKiBGaW5kIHRoZSBuYW1lZCBhdHRyaWJ1dGUuICovCisJCWJzLT5zLmJhc2UgPSBCSERSKGJzLT5iaCk7CisJCWJzLT5zLmZpcnN0ID0gQkZJUlNUKGJzLT5iaCk7CisJCWJzLT5zLmVuZCA9IGJzLT5iaC0+Yl9kYXRhICsgYnMtPmJoLT5iX3NpemU7CisJCWJzLT5zLmhlcmUgPSBicy0+cy5maXJzdDsKKwkJZXJyb3IgPSBleHQ0X3hhdHRyX2ZpbmRfZW50cnkoJmJzLT5zLmhlcmUsIGktPm5hbWVfaW5kZXgsCisJCQkJCSAgICAgIGktPm5hbWUsIGJzLT5iaC0+Yl9zaXplLCAxKTsKKwkJaWYgKGVycm9yICYmIGVycm9yICE9IC1FTk9EQVRBKQorCQkJZ290byBjbGVhbnVwOworCQlicy0+cy5ub3RfZm91bmQgPSBlcnJvcjsKKwl9CisJZXJyb3IgPSAwOworCitjbGVhbnVwOgorCXJldHVybiBlcnJvcjsKK30KKworc3RhdGljIGludAorZXh0NF94YXR0cl9ibG9ja19zZXQoaGFuZGxlX3QgKmhhbmRsZSwgc3RydWN0IGlub2RlICppbm9kZSwKKwkJICAgICBzdHJ1Y3QgZXh0NF94YXR0cl9pbmZvICppLAorCQkgICAgIHN0cnVjdCBleHQ0X3hhdHRyX2Jsb2NrX2ZpbmQgKmJzKQoreworCXN0cnVjdCBzdXBlcl9ibG9jayAqc2IgPSBpbm9kZS0+aV9zYjsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKm5ld19iaCA9IE5VTEw7CisJc3RydWN0IGV4dDRfeGF0dHJfc2VhcmNoICpzID0gJmJzLT5zOworCXN0cnVjdCBtYl9jYWNoZV9lbnRyeSAqY2UgPSBOVUxMOworCWludCBlcnJvcjsKKworI2RlZmluZSBoZWFkZXIoeCkgKChzdHJ1Y3QgZXh0NF94YXR0cl9oZWFkZXIgKikoeCkpCisKKwlpZiAoaS0+dmFsdWUgJiYgaS0+dmFsdWVfbGVuID4gc2ItPnNfYmxvY2tzaXplKQorCQlyZXR1cm4gLUVOT1NQQzsKKwlpZiAocy0+YmFzZSkgeworCQljZSA9IG1iX2NhY2hlX2VudHJ5X2dldChleHQ0X3hhdHRyX2NhY2hlLCBicy0+YmgtPmJfYmRldiwKKwkJCQkJYnMtPmJoLT5iX2Jsb2NrbnIpOworCQlpZiAoaGVhZGVyKHMtPmJhc2UpLT5oX3JlZmNvdW50ID09IGNwdV90b19sZTMyKDEpKSB7CisJCQlpZiAoY2UpIHsKKwkJCQltYl9jYWNoZV9lbnRyeV9mcmVlKGNlKTsKKwkJCQljZSA9IE5VTEw7CisJCQl9CisJCQllYV9iZGVidWcoYnMtPmJoLCAibW9kaWZ5aW5nIGluLXBsYWNlIik7CisJCQllcnJvciA9IGV4dDRfam91cm5hbF9nZXRfd3JpdGVfYWNjZXNzKGhhbmRsZSwgYnMtPmJoKTsKKwkJCWlmIChlcnJvcikKKwkJCQlnb3RvIGNsZWFudXA7CisJCQlsb2NrX2J1ZmZlcihicy0+YmgpOworCQkJZXJyb3IgPSBleHQ0X3hhdHRyX3NldF9lbnRyeShpLCBzKTsKKwkJCWlmICghZXJyb3IpIHsKKwkJCQlpZiAoIUlTX0xBU1RfRU5UUlkocy0+Zmlyc3QpKQorCQkJCQlleHQ0X3hhdHRyX3JlaGFzaChoZWFkZXIocy0+YmFzZSksCisJCQkJCQkJICBzLT5oZXJlKTsKKwkJCQlleHQ0X3hhdHRyX2NhY2hlX2luc2VydChicy0+YmgpOworCQkJfQorCQkJdW5sb2NrX2J1ZmZlcihicy0+YmgpOworCQkJaWYgKGVycm9yID09IC1FSU8pCisJCQkJZ290byBiYWRfYmxvY2s7CisJCQlpZiAoIWVycm9yKQorCQkJCWVycm9yID0gZXh0NF9qb3VybmFsX2RpcnR5X21ldGFkYXRhKGhhbmRsZSwKKwkJCQkJCQkJICAgIGJzLT5iaCk7CisJCQlpZiAoZXJyb3IpCisJCQkJZ290byBjbGVhbnVwOworCQkJZ290byBpbnNlcnRlZDsKKwkJfSBlbHNlIHsKKwkJCWludCBvZmZzZXQgPSAoY2hhciAqKXMtPmhlcmUgLSBicy0+YmgtPmJfZGF0YTsKKworCQkJaWYgKGNlKSB7CisJCQkJbWJfY2FjaGVfZW50cnlfcmVsZWFzZShjZSk7CisJCQkJY2UgPSBOVUxMOworCQkJfQorCQkJZWFfYmRlYnVnKGJzLT5iaCwgImNsb25pbmciKTsKKwkJCXMtPmJhc2UgPSBrbWFsbG9jKGJzLT5iaC0+Yl9zaXplLCBHRlBfS0VSTkVMKTsKKwkJCWVycm9yID0gLUVOT01FTTsKKwkJCWlmIChzLT5iYXNlID09IE5VTEwpCisJCQkJZ290byBjbGVhbnVwOworCQkJbWVtY3B5KHMtPmJhc2UsIEJIRFIoYnMtPmJoKSwgYnMtPmJoLT5iX3NpemUpOworCQkJcy0+Zmlyc3QgPSBFTlRSWShoZWFkZXIocy0+YmFzZSkrMSk7CisJCQloZWFkZXIocy0+YmFzZSktPmhfcmVmY291bnQgPSBjcHVfdG9fbGUzMigxKTsKKwkJCXMtPmhlcmUgPSBFTlRSWShzLT5iYXNlICsgb2Zmc2V0KTsKKwkJCXMtPmVuZCA9IHMtPmJhc2UgKyBicy0+YmgtPmJfc2l6ZTsKKwkJfQorCX0gZWxzZSB7CisJCS8qIEFsbG9jYXRlIGEgYnVmZmVyIHdoZXJlIHdlIGNvbnN0cnVjdCB0aGUgbmV3IGJsb2NrLiAqLworCQlzLT5iYXNlID0ga21hbGxvYyhzYi0+c19ibG9ja3NpemUsIEdGUF9LRVJORUwpOworCQkvKiBhc3NlcnQoaGVhZGVyID09IHMtPmJhc2UpICovCisJCWVycm9yID0gLUVOT01FTTsKKwkJaWYgKHMtPmJhc2UgPT0gTlVMTCkKKwkJCWdvdG8gY2xlYW51cDsKKwkJbWVtc2V0KHMtPmJhc2UsIDAsIHNiLT5zX2Jsb2Nrc2l6ZSk7CisJCWhlYWRlcihzLT5iYXNlKS0+aF9tYWdpYyA9IGNwdV90b19sZTMyKEVYVDRfWEFUVFJfTUFHSUMpOworCQloZWFkZXIocy0+YmFzZSktPmhfYmxvY2tzID0gY3B1X3RvX2xlMzIoMSk7CisJCWhlYWRlcihzLT5iYXNlKS0+aF9yZWZjb3VudCA9IGNwdV90b19sZTMyKDEpOworCQlzLT5maXJzdCA9IEVOVFJZKGhlYWRlcihzLT5iYXNlKSsxKTsKKwkJcy0+aGVyZSA9IEVOVFJZKGhlYWRlcihzLT5iYXNlKSsxKTsKKwkJcy0+ZW5kID0gcy0+YmFzZSArIHNiLT5zX2Jsb2Nrc2l6ZTsKKwl9CisKKwllcnJvciA9IGV4dDRfeGF0dHJfc2V0X2VudHJ5KGksIHMpOworCWlmIChlcnJvciA9PSAtRUlPKQorCQlnb3RvIGJhZF9ibG9jazsKKwlpZiAoZXJyb3IpCisJCWdvdG8gY2xlYW51cDsKKwlpZiAoIUlTX0xBU1RfRU5UUlkocy0+Zmlyc3QpKQorCQlleHQ0X3hhdHRyX3JlaGFzaChoZWFkZXIocy0+YmFzZSksIHMtPmhlcmUpOworCitpbnNlcnRlZDoKKwlpZiAoIUlTX0xBU1RfRU5UUlkocy0+Zmlyc3QpKSB7CisJCW5ld19iaCA9IGV4dDRfeGF0dHJfY2FjaGVfZmluZChpbm9kZSwgaGVhZGVyKHMtPmJhc2UpLCAmY2UpOworCQlpZiAobmV3X2JoKSB7CisJCQkvKiBXZSBmb3VuZCBhbiBpZGVudGljYWwgYmxvY2sgaW4gdGhlIGNhY2hlLiAqLworCQkJaWYgKG5ld19iaCA9PSBicy0+YmgpCisJCQkJZWFfYmRlYnVnKG5ld19iaCwgImtlZXBpbmciKTsKKwkJCWVsc2UgeworCQkJCS8qIFRoZSBvbGQgYmxvY2sgaXMgcmVsZWFzZWQgYWZ0ZXIgdXBkYXRpbmcKKwkJCQkgICB0aGUgaW5vZGUuICovCisJCQkJZXJyb3IgPSAtRURRVU9UOworCQkJCWlmIChEUVVPVF9BTExPQ19CTE9DSyhpbm9kZSwgMSkpCisJCQkJCWdvdG8gY2xlYW51cDsKKwkJCQllcnJvciA9IGV4dDRfam91cm5hbF9nZXRfd3JpdGVfYWNjZXNzKGhhbmRsZSwKKwkJCQkJCQkJICAgICAgbmV3X2JoKTsKKwkJCQlpZiAoZXJyb3IpCisJCQkJCWdvdG8gY2xlYW51cF9kcXVvdDsKKwkJCQlsb2NrX2J1ZmZlcihuZXdfYmgpOworCQkJCUJIRFIobmV3X2JoKS0+aF9yZWZjb3VudCA9IGNwdV90b19sZTMyKDEgKworCQkJCQlsZTMyX3RvX2NwdShCSERSKG5ld19iaCktPmhfcmVmY291bnQpKTsKKwkJCQllYV9iZGVidWcobmV3X2JoLCAicmV1c2luZzsgcmVmY291bnQgbm93PSVkIiwKKwkJCQkJbGUzMl90b19jcHUoQkhEUihuZXdfYmgpLT5oX3JlZmNvdW50KSk7CisJCQkJdW5sb2NrX2J1ZmZlcihuZXdfYmgpOworCQkJCWVycm9yID0gZXh0NF9qb3VybmFsX2RpcnR5X21ldGFkYXRhKGhhbmRsZSwKKwkJCQkJCQkJICAgIG5ld19iaCk7CisJCQkJaWYgKGVycm9yKQorCQkJCQlnb3RvIGNsZWFudXBfZHF1b3Q7CisJCQl9CisJCQltYl9jYWNoZV9lbnRyeV9yZWxlYXNlKGNlKTsKKwkJCWNlID0gTlVMTDsKKwkJfSBlbHNlIGlmIChicy0+YmggJiYgcy0+YmFzZSA9PSBicy0+YmgtPmJfZGF0YSkgeworCQkJLyogV2Ugd2VyZSBtb2RpZnlpbmcgdGhpcyBibG9jayBpbi1wbGFjZS4gKi8KKwkJCWVhX2JkZWJ1Zyhicy0+YmgsICJrZWVwaW5nIHRoaXMgYmxvY2siKTsKKwkJCW5ld19iaCA9IGJzLT5iaDsKKwkJCWdldF9iaChuZXdfYmgpOworCQl9IGVsc2UgeworCQkJLyogV2UgbmVlZCB0byBhbGxvY2F0ZSBhIG5ldyBibG9jayAqLworCQkJZXh0NF9mc2Jsa190IGdvYWwgPSBsZTMyX3RvX2NwdSgKKwkJCQkJRVhUNF9TQihzYiktPnNfZXMtPnNfZmlyc3RfZGF0YV9ibG9jaykgKworCQkJCShleHQ0X2ZzYmxrX3QpRVhUNF9JKGlub2RlKS0+aV9ibG9ja19ncm91cCAqCisJCQkJRVhUNF9CTE9DS1NfUEVSX0dST1VQKHNiKTsKKwkJCWV4dDRfZnNibGtfdCBibG9jayA9IGV4dDRfbmV3X2Jsb2NrKGhhbmRsZSwgaW5vZGUsCisJCQkJCQkJZ29hbCwgJmVycm9yKTsKKwkJCWlmIChlcnJvcikKKwkJCQlnb3RvIGNsZWFudXA7CisJCQllYV9pZGVidWcoaW5vZGUsICJjcmVhdGluZyBibG9jayAlZCIsIGJsb2NrKTsKKworCQkJbmV3X2JoID0gc2JfZ2V0YmxrKHNiLCBibG9jayk7CisJCQlpZiAoIW5ld19iaCkgeworZ2V0YmxrX2ZhaWxlZDoKKwkJCQlleHQ0X2ZyZWVfYmxvY2tzKGhhbmRsZSwgaW5vZGUsIGJsb2NrLCAxKTsKKwkJCQllcnJvciA9IC1FSU87CisJCQkJZ290byBjbGVhbnVwOworCQkJfQorCQkJbG9ja19idWZmZXIobmV3X2JoKTsKKwkJCWVycm9yID0gZXh0NF9qb3VybmFsX2dldF9jcmVhdGVfYWNjZXNzKGhhbmRsZSwgbmV3X2JoKTsKKwkJCWlmIChlcnJvcikgeworCQkJCXVubG9ja19idWZmZXIobmV3X2JoKTsKKwkJCQlnb3RvIGdldGJsa19mYWlsZWQ7CisJCQl9CisJCQltZW1jcHkobmV3X2JoLT5iX2RhdGEsIHMtPmJhc2UsIG5ld19iaC0+Yl9zaXplKTsKKwkJCXNldF9idWZmZXJfdXB0b2RhdGUobmV3X2JoKTsKKwkJCXVubG9ja19idWZmZXIobmV3X2JoKTsKKwkJCWV4dDRfeGF0dHJfY2FjaGVfaW5zZXJ0KG5ld19iaCk7CisJCQllcnJvciA9IGV4dDRfam91cm5hbF9kaXJ0eV9tZXRhZGF0YShoYW5kbGUsIG5ld19iaCk7CisJCQlpZiAoZXJyb3IpCisJCQkJZ290byBjbGVhbnVwOworCQl9CisJfQorCisJLyogVXBkYXRlIHRoZSBpbm9kZS4gKi8KKwlFWFQ0X0koaW5vZGUpLT5pX2ZpbGVfYWNsID0gbmV3X2JoID8gbmV3X2JoLT5iX2Jsb2NrbnIgOiAwOworCisJLyogRHJvcCB0aGUgcHJldmlvdXMgeGF0dHIgYmxvY2suICovCisJaWYgKGJzLT5iaCAmJiBicy0+YmggIT0gbmV3X2JoKQorCQlleHQ0X3hhdHRyX3JlbGVhc2VfYmxvY2soaGFuZGxlLCBpbm9kZSwgYnMtPmJoKTsKKwllcnJvciA9IDA7CisKK2NsZWFudXA6CisJaWYgKGNlKQorCQltYl9jYWNoZV9lbnRyeV9yZWxlYXNlKGNlKTsKKwlicmVsc2UobmV3X2JoKTsKKwlpZiAoIShicy0+YmggJiYgcy0+YmFzZSA9PSBicy0+YmgtPmJfZGF0YSkpCisJCWtmcmVlKHMtPmJhc2UpOworCisJcmV0dXJuIGVycm9yOworCitjbGVhbnVwX2RxdW90OgorCURRVU9UX0ZSRUVfQkxPQ0soaW5vZGUsIDEpOworCWdvdG8gY2xlYW51cDsKKworYmFkX2Jsb2NrOgorCWV4dDRfZXJyb3IoaW5vZGUtPmlfc2IsIF9fRlVOQ1RJT05fXywKKwkJICAgImlub2RlICVsdTogYmFkIGJsb2NrICVsbHUiLCBpbm9kZS0+aV9pbm8sCisJCSAgIEVYVDRfSShpbm9kZSktPmlfZmlsZV9hY2wpOworCWdvdG8gY2xlYW51cDsKKworI3VuZGVmIGhlYWRlcgorfQorCitzdHJ1Y3QgZXh0NF94YXR0cl9pYm9keV9maW5kIHsKKwlzdHJ1Y3QgZXh0NF94YXR0cl9zZWFyY2ggczsKKwlzdHJ1Y3QgZXh0NF9pbG9jIGlsb2M7Cit9OworCitzdGF0aWMgaW50CitleHQ0X3hhdHRyX2lib2R5X2ZpbmQoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGV4dDRfeGF0dHJfaW5mbyAqaSwKKwkJICAgICAgc3RydWN0IGV4dDRfeGF0dHJfaWJvZHlfZmluZCAqaXMpCit7CisJc3RydWN0IGV4dDRfeGF0dHJfaWJvZHlfaGVhZGVyICpoZWFkZXI7CisJc3RydWN0IGV4dDRfaW5vZGUgKnJhd19pbm9kZTsKKwlpbnQgZXJyb3I7CisKKwlpZiAoRVhUNF9JKGlub2RlKS0+aV9leHRyYV9pc2l6ZSA9PSAwKQorCQlyZXR1cm4gMDsKKwlyYXdfaW5vZGUgPSBleHQ0X3Jhd19pbm9kZSgmaXMtPmlsb2MpOworCWhlYWRlciA9IElIRFIoaW5vZGUsIHJhd19pbm9kZSk7CisJaXMtPnMuYmFzZSA9IGlzLT5zLmZpcnN0ID0gSUZJUlNUKGhlYWRlcik7CisJaXMtPnMuaGVyZSA9IGlzLT5zLmZpcnN0OworCWlzLT5zLmVuZCA9ICh2b2lkICopcmF3X2lub2RlICsgRVhUNF9TQihpbm9kZS0+aV9zYiktPnNfaW5vZGVfc2l6ZTsKKwlpZiAoRVhUNF9JKGlub2RlKS0+aV9zdGF0ZSAmIEVYVDRfU1RBVEVfWEFUVFIpIHsKKwkJZXJyb3IgPSBleHQ0X3hhdHRyX2NoZWNrX25hbWVzKElGSVJTVChoZWFkZXIpLCBpcy0+cy5lbmQpOworCQlpZiAoZXJyb3IpCisJCQlyZXR1cm4gZXJyb3I7CisJCS8qIEZpbmQgdGhlIG5hbWVkIGF0dHJpYnV0ZS4gKi8KKwkJZXJyb3IgPSBleHQ0X3hhdHRyX2ZpbmRfZW50cnkoJmlzLT5zLmhlcmUsIGktPm5hbWVfaW5kZXgsCisJCQkJCSAgICAgIGktPm5hbWUsIGlzLT5zLmVuZCAtCisJCQkJCSAgICAgICh2b2lkICopaXMtPnMuYmFzZSwgMCk7CisJCWlmIChlcnJvciAmJiBlcnJvciAhPSAtRU5PREFUQSkKKwkJCXJldHVybiBlcnJvcjsKKwkJaXMtPnMubm90X2ZvdW5kID0gZXJyb3I7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50CitleHQ0X3hhdHRyX2lib2R5X3NldChoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3QgaW5vZGUgKmlub2RlLAorCQkgICAgIHN0cnVjdCBleHQ0X3hhdHRyX2luZm8gKmksCisJCSAgICAgc3RydWN0IGV4dDRfeGF0dHJfaWJvZHlfZmluZCAqaXMpCit7CisJc3RydWN0IGV4dDRfeGF0dHJfaWJvZHlfaGVhZGVyICpoZWFkZXI7CisJc3RydWN0IGV4dDRfeGF0dHJfc2VhcmNoICpzID0gJmlzLT5zOworCWludCBlcnJvcjsKKworCWlmIChFWFQ0X0koaW5vZGUpLT5pX2V4dHJhX2lzaXplID09IDApCisJCXJldHVybiAtRU5PU1BDOworCWVycm9yID0gZXh0NF94YXR0cl9zZXRfZW50cnkoaSwgcyk7CisJaWYgKGVycm9yKQorCQlyZXR1cm4gZXJyb3I7CisJaGVhZGVyID0gSUhEUihpbm9kZSwgZXh0NF9yYXdfaW5vZGUoJmlzLT5pbG9jKSk7CisJaWYgKCFJU19MQVNUX0VOVFJZKHMtPmZpcnN0KSkgeworCQloZWFkZXItPmhfbWFnaWMgPSBjcHVfdG9fbGUzMihFWFQ0X1hBVFRSX01BR0lDKTsKKwkJRVhUNF9JKGlub2RlKS0+aV9zdGF0ZSB8PSBFWFQ0X1NUQVRFX1hBVFRSOworCX0gZWxzZSB7CisJCWhlYWRlci0+aF9tYWdpYyA9IGNwdV90b19sZTMyKDApOworCQlFWFQ0X0koaW5vZGUpLT5pX3N0YXRlICY9IH5FWFQ0X1NUQVRFX1hBVFRSOworCX0KKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIGV4dDRfeGF0dHJfc2V0X2hhbmRsZSgpCisgKgorICogQ3JlYXRlLCByZXBsYWNlIG9yIHJlbW92ZSBhbiBleHRlbmRlZCBhdHRyaWJ1dGUgZm9yIHRoaXMgaW5vZGUuIEJ1ZmZlcgorICogaXMgTlVMTCB0byByZW1vdmUgYW4gZXhpc3RpbmcgZXh0ZW5kZWQgYXR0cmlidXRlLCBhbmQgbm9uLU5VTEwgdG8KKyAqIGVpdGhlciByZXBsYWNlIGFuIGV4aXN0aW5nIGV4dGVuZGVkIGF0dHJpYnV0ZSwgb3IgY3JlYXRlIGEgbmV3IGV4dGVuZGVkCisgKiBhdHRyaWJ1dGUuIFRoZSBmbGFncyBYQVRUUl9SRVBMQUNFIGFuZCBYQVRUUl9DUkVBVEUKKyAqIHNwZWNpZnkgdGhhdCBhbiBleHRlbmRlZCBhdHRyaWJ1dGUgbXVzdCBleGlzdCBhbmQgbXVzdCBub3QgZXhpc3QKKyAqIHByZXZpb3VzIHRvIHRoZSBjYWxsLCByZXNwZWN0aXZlbHkuCisgKgorICogUmV0dXJucyAwLCBvciBhIG5lZ2F0aXZlIGVycm9yIG51bWJlciBvbiBmYWlsdXJlLgorICovCitpbnQKK2V4dDRfeGF0dHJfc2V0X2hhbmRsZShoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3QgaW5vZGUgKmlub2RlLCBpbnQgbmFtZV9pbmRleCwKKwkJICAgICAgY29uc3QgY2hhciAqbmFtZSwgY29uc3Qgdm9pZCAqdmFsdWUsIHNpemVfdCB2YWx1ZV9sZW4sCisJCSAgICAgIGludCBmbGFncykKK3sKKwlzdHJ1Y3QgZXh0NF94YXR0cl9pbmZvIGkgPSB7CisJCS5uYW1lX2luZGV4ID0gbmFtZV9pbmRleCwKKwkJLm5hbWUgPSBuYW1lLAorCQkudmFsdWUgPSB2YWx1ZSwKKwkJLnZhbHVlX2xlbiA9IHZhbHVlX2xlbiwKKworCX07CisJc3RydWN0IGV4dDRfeGF0dHJfaWJvZHlfZmluZCBpcyA9IHsKKwkJLnMgPSB7IC5ub3RfZm91bmQgPSAtRU5PREFUQSwgfSwKKwl9OworCXN0cnVjdCBleHQ0X3hhdHRyX2Jsb2NrX2ZpbmQgYnMgPSB7CisJCS5zID0geyAubm90X2ZvdW5kID0gLUVOT0RBVEEsIH0sCisJfTsKKwlpbnQgZXJyb3I7CisKKwlpZiAoIW5hbWUpCisJCXJldHVybiAtRUlOVkFMOworCWlmIChzdHJsZW4obmFtZSkgPiAyNTUpCisJCXJldHVybiAtRVJBTkdFOworCWRvd25fd3JpdGUoJkVYVDRfSShpbm9kZSktPnhhdHRyX3NlbSk7CisJZXJyb3IgPSBleHQ0X2dldF9pbm9kZV9sb2MoaW5vZGUsICZpcy5pbG9jKTsKKwlpZiAoZXJyb3IpCisJCWdvdG8gY2xlYW51cDsKKworCWlmIChFWFQ0X0koaW5vZGUpLT5pX3N0YXRlICYgRVhUNF9TVEFURV9ORVcpIHsKKwkJc3RydWN0IGV4dDRfaW5vZGUgKnJhd19pbm9kZSA9IGV4dDRfcmF3X2lub2RlKCZpcy5pbG9jKTsKKwkJbWVtc2V0KHJhd19pbm9kZSwgMCwgRVhUNF9TQihpbm9kZS0+aV9zYiktPnNfaW5vZGVfc2l6ZSk7CisJCUVYVDRfSShpbm9kZSktPmlfc3RhdGUgJj0gfkVYVDRfU1RBVEVfTkVXOworCX0KKworCWVycm9yID0gZXh0NF94YXR0cl9pYm9keV9maW5kKGlub2RlLCAmaSwgJmlzKTsKKwlpZiAoZXJyb3IpCisJCWdvdG8gY2xlYW51cDsKKwlpZiAoaXMucy5ub3RfZm91bmQpCisJCWVycm9yID0gZXh0NF94YXR0cl9ibG9ja19maW5kKGlub2RlLCAmaSwgJmJzKTsKKwlpZiAoZXJyb3IpCisJCWdvdG8gY2xlYW51cDsKKwlpZiAoaXMucy5ub3RfZm91bmQgJiYgYnMucy5ub3RfZm91bmQpIHsKKwkJZXJyb3IgPSAtRU5PREFUQTsKKwkJaWYgKGZsYWdzICYgWEFUVFJfUkVQTEFDRSkKKwkJCWdvdG8gY2xlYW51cDsKKwkJZXJyb3IgPSAwOworCQlpZiAoIXZhbHVlKQorCQkJZ290byBjbGVhbnVwOworCX0gZWxzZSB7CisJCWVycm9yID0gLUVFWElTVDsKKwkJaWYgKGZsYWdzICYgWEFUVFJfQ1JFQVRFKQorCQkJZ290byBjbGVhbnVwOworCX0KKwllcnJvciA9IGV4dDRfam91cm5hbF9nZXRfd3JpdGVfYWNjZXNzKGhhbmRsZSwgaXMuaWxvYy5iaCk7CisJaWYgKGVycm9yKQorCQlnb3RvIGNsZWFudXA7CisJaWYgKCF2YWx1ZSkgeworCQlpZiAoIWlzLnMubm90X2ZvdW5kKQorCQkJZXJyb3IgPSBleHQ0X3hhdHRyX2lib2R5X3NldChoYW5kbGUsIGlub2RlLCAmaSwgJmlzKTsKKwkJZWxzZSBpZiAoIWJzLnMubm90X2ZvdW5kKQorCQkJZXJyb3IgPSBleHQ0X3hhdHRyX2Jsb2NrX3NldChoYW5kbGUsIGlub2RlLCAmaSwgJmJzKTsKKwl9IGVsc2UgeworCQllcnJvciA9IGV4dDRfeGF0dHJfaWJvZHlfc2V0KGhhbmRsZSwgaW5vZGUsICZpLCAmaXMpOworCQlpZiAoIWVycm9yICYmICFicy5zLm5vdF9mb3VuZCkgeworCQkJaS52YWx1ZSA9IE5VTEw7CisJCQllcnJvciA9IGV4dDRfeGF0dHJfYmxvY2tfc2V0KGhhbmRsZSwgaW5vZGUsICZpLCAmYnMpOworCQl9IGVsc2UgaWYgKGVycm9yID09IC1FTk9TUEMpIHsKKwkJCWVycm9yID0gZXh0NF94YXR0cl9ibG9ja19zZXQoaGFuZGxlLCBpbm9kZSwgJmksICZicyk7CisJCQlpZiAoZXJyb3IpCisJCQkJZ290byBjbGVhbnVwOworCQkJaWYgKCFpcy5zLm5vdF9mb3VuZCkgeworCQkJCWkudmFsdWUgPSBOVUxMOworCQkJCWVycm9yID0gZXh0NF94YXR0cl9pYm9keV9zZXQoaGFuZGxlLCBpbm9kZSwgJmksCisJCQkJCQkJICAgICAmaXMpOworCQkJfQorCQl9CisJfQorCWlmICghZXJyb3IpIHsKKwkJZXh0NF94YXR0cl91cGRhdGVfc3VwZXJfYmxvY2soaGFuZGxlLCBpbm9kZS0+aV9zYik7CisJCWlub2RlLT5pX2N0aW1lID0gQ1VSUkVOVF9USU1FX1NFQzsKKwkJZXJyb3IgPSBleHQ0X21hcmtfaWxvY19kaXJ0eShoYW5kbGUsIGlub2RlLCAmaXMuaWxvYyk7CisJCS8qCisJCSAqIFRoZSBiaCBpcyBjb25zdW1lZCBieSBleHQ0X21hcmtfaWxvY19kaXJ0eSwgZXZlbiB3aXRoCisJCSAqIGVycm9yICE9IDAuCisJCSAqLworCQlpcy5pbG9jLmJoID0gTlVMTDsKKwkJaWYgKElTX1NZTkMoaW5vZGUpKQorCQkJaGFuZGxlLT5oX3N5bmMgPSAxOworCX0KKworY2xlYW51cDoKKwlicmVsc2UoaXMuaWxvYy5iaCk7CisJYnJlbHNlKGJzLmJoKTsKKwl1cF93cml0ZSgmRVhUNF9JKGlub2RlKS0+eGF0dHJfc2VtKTsKKwlyZXR1cm4gZXJyb3I7Cit9CisKKy8qCisgKiBleHQ0X3hhdHRyX3NldCgpCisgKgorICogTGlrZSBleHQ0X3hhdHRyX3NldF9oYW5kbGUsIGJ1dCBzdGFydCBmcm9tIGFuIGlub2RlLiBUaGlzIGV4dGVuZGVkCisgKiBhdHRyaWJ1dGUgbW9kaWZpY2F0aW9uIGlzIGEgZmlsZXN5c3RlbSB0cmFuc2FjdGlvbiBieSBpdHNlbGYuCisgKgorICogUmV0dXJucyAwLCBvciBhIG5lZ2F0aXZlIGVycm9yIG51bWJlciBvbiBmYWlsdXJlLgorICovCitpbnQKK2V4dDRfeGF0dHJfc2V0KHN0cnVjdCBpbm9kZSAqaW5vZGUsIGludCBuYW1lX2luZGV4LCBjb25zdCBjaGFyICpuYW1lLAorCSAgICAgICBjb25zdCB2b2lkICp2YWx1ZSwgc2l6ZV90IHZhbHVlX2xlbiwgaW50IGZsYWdzKQoreworCWhhbmRsZV90ICpoYW5kbGU7CisJaW50IGVycm9yLCByZXRyaWVzID0gMDsKKworcmV0cnk6CisJaGFuZGxlID0gZXh0NF9qb3VybmFsX3N0YXJ0KGlub2RlLCBFWFQ0X0RBVEFfVFJBTlNfQkxPQ0tTKGlub2RlLT5pX3NiKSk7CisJaWYgKElTX0VSUihoYW5kbGUpKSB7CisJCWVycm9yID0gUFRSX0VSUihoYW5kbGUpOworCX0gZWxzZSB7CisJCWludCBlcnJvcjI7CisKKwkJZXJyb3IgPSBleHQ0X3hhdHRyX3NldF9oYW5kbGUoaGFuZGxlLCBpbm9kZSwgbmFtZV9pbmRleCwgbmFtZSwKKwkJCQkJICAgICAgdmFsdWUsIHZhbHVlX2xlbiwgZmxhZ3MpOworCQllcnJvcjIgPSBleHQ0X2pvdXJuYWxfc3RvcChoYW5kbGUpOworCQlpZiAoZXJyb3IgPT0gLUVOT1NQQyAmJgorCQkgICAgZXh0NF9zaG91bGRfcmV0cnlfYWxsb2MoaW5vZGUtPmlfc2IsICZyZXRyaWVzKSkKKwkJCWdvdG8gcmV0cnk7CisJCWlmIChlcnJvciA9PSAwKQorCQkJZXJyb3IgPSBlcnJvcjI7CisJfQorCisJcmV0dXJuIGVycm9yOworfQorCisvKgorICogZXh0NF94YXR0cl9kZWxldGVfaW5vZGUoKQorICoKKyAqIEZyZWUgZXh0ZW5kZWQgYXR0cmlidXRlIHJlc291cmNlcyBhc3NvY2lhdGVkIHdpdGggdGhpcyBpbm9kZS4gVGhpcworICogaXMgY2FsbGVkIGltbWVkaWF0ZWx5IGJlZm9yZSBhbiBpbm9kZSBpcyBmcmVlZC4gV2UgaGF2ZSBleGNsdXNpdmUKKyAqIGFjY2VzcyB0byB0aGUgaW5vZGUuCisgKi8KK3ZvaWQKK2V4dDRfeGF0dHJfZGVsZXRlX2lub2RlKGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBpbm9kZSAqaW5vZGUpCit7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCA9IE5VTEw7CisKKwlpZiAoIUVYVDRfSShpbm9kZSktPmlfZmlsZV9hY2wpCisJCWdvdG8gY2xlYW51cDsKKwliaCA9IHNiX2JyZWFkKGlub2RlLT5pX3NiLCBFWFQ0X0koaW5vZGUpLT5pX2ZpbGVfYWNsKTsKKwlpZiAoIWJoKSB7CisJCWV4dDRfZXJyb3IoaW5vZGUtPmlfc2IsIF9fRlVOQ1RJT05fXywKKwkJCSJpbm9kZSAlbHU6IGJsb2NrICVsbHUgcmVhZCBlcnJvciIsIGlub2RlLT5pX2lubywKKwkJCUVYVDRfSShpbm9kZSktPmlfZmlsZV9hY2wpOworCQlnb3RvIGNsZWFudXA7CisJfQorCWlmIChCSERSKGJoKS0+aF9tYWdpYyAhPSBjcHVfdG9fbGUzMihFWFQ0X1hBVFRSX01BR0lDKSB8fAorCSAgICBCSERSKGJoKS0+aF9ibG9ja3MgIT0gY3B1X3RvX2xlMzIoMSkpIHsKKwkJZXh0NF9lcnJvcihpbm9kZS0+aV9zYiwgX19GVU5DVElPTl9fLAorCQkJImlub2RlICVsdTogYmFkIGJsb2NrICVsbHUiLCBpbm9kZS0+aV9pbm8sCisJCQlFWFQ0X0koaW5vZGUpLT5pX2ZpbGVfYWNsKTsKKwkJZ290byBjbGVhbnVwOworCX0KKwlleHQ0X3hhdHRyX3JlbGVhc2VfYmxvY2soaGFuZGxlLCBpbm9kZSwgYmgpOworCUVYVDRfSShpbm9kZSktPmlfZmlsZV9hY2wgPSAwOworCitjbGVhbnVwOgorCWJyZWxzZShiaCk7Cit9CisKKy8qCisgKiBleHQ0X3hhdHRyX3B1dF9zdXBlcigpCisgKgorICogVGhpcyBpcyBjYWxsZWQgd2hlbiBhIGZpbGUgc3lzdGVtIGlzIHVubW91bnRlZC4KKyAqLwordm9pZAorZXh0NF94YXR0cl9wdXRfc3VwZXIoc3RydWN0IHN1cGVyX2Jsb2NrICpzYikKK3sKKwltYl9jYWNoZV9zaHJpbmsoc2ItPnNfYmRldik7Cit9CisKKy8qCisgKiBleHQ0X3hhdHRyX2NhY2hlX2luc2VydCgpCisgKgorICogQ3JlYXRlIGEgbmV3IGVudHJ5IGluIHRoZSBleHRlbmRlZCBhdHRyaWJ1dGUgY2FjaGUsIGFuZCBpbnNlcnQKKyAqIGl0IHVubGVzcyBzdWNoIGFuIGVudHJ5IGlzIGFscmVhZHkgaW4gdGhlIGNhY2hlLgorICoKKyAqIFJldHVybnMgMCwgb3IgYSBuZWdhdGl2ZSBlcnJvciBudW1iZXIgb24gZmFpbHVyZS4KKyAqLworc3RhdGljIHZvaWQKK2V4dDRfeGF0dHJfY2FjaGVfaW5zZXJ0KHN0cnVjdCBidWZmZXJfaGVhZCAqYmgpCit7CisJX191MzIgaGFzaCA9IGxlMzJfdG9fY3B1KEJIRFIoYmgpLT5oX2hhc2gpOworCXN0cnVjdCBtYl9jYWNoZV9lbnRyeSAqY2U7CisJaW50IGVycm9yOworCisJY2UgPSBtYl9jYWNoZV9lbnRyeV9hbGxvYyhleHQ0X3hhdHRyX2NhY2hlKTsKKwlpZiAoIWNlKSB7CisJCWVhX2JkZWJ1ZyhiaCwgIm91dCBvZiBtZW1vcnkiKTsKKwkJcmV0dXJuOworCX0KKwllcnJvciA9IG1iX2NhY2hlX2VudHJ5X2luc2VydChjZSwgYmgtPmJfYmRldiwgYmgtPmJfYmxvY2tuciwgJmhhc2gpOworCWlmIChlcnJvcikgeworCQltYl9jYWNoZV9lbnRyeV9mcmVlKGNlKTsKKwkJaWYgKGVycm9yID09IC1FQlVTWSkgeworCQkJZWFfYmRlYnVnKGJoLCAiYWxyZWFkeSBpbiBjYWNoZSIpOworCQkJZXJyb3IgPSAwOworCQl9CisJfSBlbHNlIHsKKwkJZWFfYmRlYnVnKGJoLCAiaW5zZXJ0aW5nIFsleF0iLCAoaW50KWhhc2gpOworCQltYl9jYWNoZV9lbnRyeV9yZWxlYXNlKGNlKTsKKwl9Cit9CisKKy8qCisgKiBleHQ0X3hhdHRyX2NtcCgpCisgKgorICogQ29tcGFyZSB0d28gZXh0ZW5kZWQgYXR0cmlidXRlIGJsb2NrcyBmb3IgZXF1YWxpdHkuCisgKgorICogUmV0dXJucyAwIGlmIHRoZSBibG9ja3MgYXJlIGVxdWFsLCAxIGlmIHRoZXkgZGlmZmVyLCBhbmQKKyAqIGEgbmVnYXRpdmUgZXJyb3IgbnVtYmVyIG9uIGVycm9ycy4KKyAqLworc3RhdGljIGludAorZXh0NF94YXR0cl9jbXAoc3RydWN0IGV4dDRfeGF0dHJfaGVhZGVyICpoZWFkZXIxLAorCSAgICAgICBzdHJ1Y3QgZXh0NF94YXR0cl9oZWFkZXIgKmhlYWRlcjIpCit7CisJc3RydWN0IGV4dDRfeGF0dHJfZW50cnkgKmVudHJ5MSwgKmVudHJ5MjsKKworCWVudHJ5MSA9IEVOVFJZKGhlYWRlcjErMSk7CisJZW50cnkyID0gRU5UUlkoaGVhZGVyMisxKTsKKwl3aGlsZSAoIUlTX0xBU1RfRU5UUlkoZW50cnkxKSkgeworCQlpZiAoSVNfTEFTVF9FTlRSWShlbnRyeTIpKQorCQkJcmV0dXJuIDE7CisJCWlmIChlbnRyeTEtPmVfaGFzaCAhPSBlbnRyeTItPmVfaGFzaCB8fAorCQkgICAgZW50cnkxLT5lX25hbWVfaW5kZXggIT0gZW50cnkyLT5lX25hbWVfaW5kZXggfHwKKwkJICAgIGVudHJ5MS0+ZV9uYW1lX2xlbiAhPSBlbnRyeTItPmVfbmFtZV9sZW4gfHwKKwkJICAgIGVudHJ5MS0+ZV92YWx1ZV9zaXplICE9IGVudHJ5Mi0+ZV92YWx1ZV9zaXplIHx8CisJCSAgICBtZW1jbXAoZW50cnkxLT5lX25hbWUsIGVudHJ5Mi0+ZV9uYW1lLCBlbnRyeTEtPmVfbmFtZV9sZW4pKQorCQkJcmV0dXJuIDE7CisJCWlmIChlbnRyeTEtPmVfdmFsdWVfYmxvY2sgIT0gMCB8fCBlbnRyeTItPmVfdmFsdWVfYmxvY2sgIT0gMCkKKwkJCXJldHVybiAtRUlPOworCQlpZiAobWVtY21wKChjaGFyICopaGVhZGVyMSArIGxlMTZfdG9fY3B1KGVudHJ5MS0+ZV92YWx1ZV9vZmZzKSwKKwkJCSAgIChjaGFyICopaGVhZGVyMiArIGxlMTZfdG9fY3B1KGVudHJ5Mi0+ZV92YWx1ZV9vZmZzKSwKKwkJCSAgIGxlMzJfdG9fY3B1KGVudHJ5MS0+ZV92YWx1ZV9zaXplKSkpCisJCQlyZXR1cm4gMTsKKworCQllbnRyeTEgPSBFWFQ0X1hBVFRSX05FWFQoZW50cnkxKTsKKwkJZW50cnkyID0gRVhUNF9YQVRUUl9ORVhUKGVudHJ5Mik7CisJfQorCWlmICghSVNfTEFTVF9FTlRSWShlbnRyeTIpKQorCQlyZXR1cm4gMTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIGV4dDRfeGF0dHJfY2FjaGVfZmluZCgpCisgKgorICogRmluZCBhbiBpZGVudGljYWwgZXh0ZW5kZWQgYXR0cmlidXRlIGJsb2NrLgorICoKKyAqIFJldHVybnMgYSBwb2ludGVyIHRvIHRoZSBibG9jayBmb3VuZCwgb3IgTlVMTCBpZiBzdWNoIGEgYmxvY2sgd2FzCisgKiBub3QgZm91bmQgb3IgYW4gZXJyb3Igb2NjdXJyZWQuCisgKi8KK3N0YXRpYyBzdHJ1Y3QgYnVmZmVyX2hlYWQgKgorZXh0NF94YXR0cl9jYWNoZV9maW5kKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBleHQ0X3hhdHRyX2hlYWRlciAqaGVhZGVyLAorCQkgICAgICBzdHJ1Y3QgbWJfY2FjaGVfZW50cnkgKipwY2UpCit7CisJX191MzIgaGFzaCA9IGxlMzJfdG9fY3B1KGhlYWRlci0+aF9oYXNoKTsKKwlzdHJ1Y3QgbWJfY2FjaGVfZW50cnkgKmNlOworCisJaWYgKCFoZWFkZXItPmhfaGFzaCkKKwkJcmV0dXJuIE5VTEw7ICAvKiBuZXZlciBzaGFyZSAqLworCWVhX2lkZWJ1Zyhpbm9kZSwgImxvb2tpbmcgZm9yIGNhY2hlZCBibG9ja3MgWyV4XSIsIChpbnQpaGFzaCk7CithZ2FpbjoKKwljZSA9IG1iX2NhY2hlX2VudHJ5X2ZpbmRfZmlyc3QoZXh0NF94YXR0cl9jYWNoZSwgMCwKKwkJCQkgICAgICAgaW5vZGUtPmlfc2ItPnNfYmRldiwgaGFzaCk7CisJd2hpbGUgKGNlKSB7CisJCXN0cnVjdCBidWZmZXJfaGVhZCAqYmg7CisKKwkJaWYgKElTX0VSUihjZSkpIHsKKwkJCWlmIChQVFJfRVJSKGNlKSA9PSAtRUFHQUlOKQorCQkJCWdvdG8gYWdhaW47CisJCQlicmVhazsKKwkJfQorCQliaCA9IHNiX2JyZWFkKGlub2RlLT5pX3NiLCBjZS0+ZV9ibG9jayk7CisJCWlmICghYmgpIHsKKwkJCWV4dDRfZXJyb3IoaW5vZGUtPmlfc2IsIF9fRlVOQ1RJT05fXywKKwkJCQkiaW5vZGUgJWx1OiBibG9jayAlbHUgcmVhZCBlcnJvciIsCisJCQkJaW5vZGUtPmlfaW5vLCAodW5zaWduZWQgbG9uZykgY2UtPmVfYmxvY2spOworCQl9IGVsc2UgaWYgKGxlMzJfdG9fY3B1KEJIRFIoYmgpLT5oX3JlZmNvdW50KSA+PQorCQkJCUVYVDRfWEFUVFJfUkVGQ09VTlRfTUFYKSB7CisJCQllYV9pZGVidWcoaW5vZGUsICJibG9jayAlbHUgcmVmY291bnQgJWQ+PSVkIiwKKwkJCQkgICh1bnNpZ25lZCBsb25nKSBjZS0+ZV9ibG9jaywKKwkJCQkgIGxlMzJfdG9fY3B1KEJIRFIoYmgpLT5oX3JlZmNvdW50KSwKKwkJCQkJICBFWFQ0X1hBVFRSX1JFRkNPVU5UX01BWCk7CisJCX0gZWxzZSBpZiAoZXh0NF94YXR0cl9jbXAoaGVhZGVyLCBCSERSKGJoKSkgPT0gMCkgeworCQkJKnBjZSA9IGNlOworCQkJcmV0dXJuIGJoOworCQl9CisJCWJyZWxzZShiaCk7CisJCWNlID0gbWJfY2FjaGVfZW50cnlfZmluZF9uZXh0KGNlLCAwLCBpbm9kZS0+aV9zYi0+c19iZGV2LCBoYXNoKTsKKwl9CisJcmV0dXJuIE5VTEw7Cit9CisKKyNkZWZpbmUgTkFNRV9IQVNIX1NISUZUIDUKKyNkZWZpbmUgVkFMVUVfSEFTSF9TSElGVCAxNgorCisvKgorICogZXh0NF94YXR0cl9oYXNoX2VudHJ5KCkKKyAqCisgKiBDb21wdXRlIHRoZSBoYXNoIG9mIGFuIGV4dGVuZGVkIGF0dHJpYnV0ZS4KKyAqLworc3RhdGljIGlubGluZSB2b2lkIGV4dDRfeGF0dHJfaGFzaF9lbnRyeShzdHJ1Y3QgZXh0NF94YXR0cl9oZWFkZXIgKmhlYWRlciwKKwkJCQkJIHN0cnVjdCBleHQ0X3hhdHRyX2VudHJ5ICplbnRyeSkKK3sKKwlfX3UzMiBoYXNoID0gMDsKKwljaGFyICpuYW1lID0gZW50cnktPmVfbmFtZTsKKwlpbnQgbjsKKworCWZvciAobj0wOyBuIDwgZW50cnktPmVfbmFtZV9sZW47IG4rKykgeworCQloYXNoID0gKGhhc2ggPDwgTkFNRV9IQVNIX1NISUZUKSBeCisJCSAgICAgICAoaGFzaCA+PiAoOCpzaXplb2YoaGFzaCkgLSBOQU1FX0hBU0hfU0hJRlQpKSBeCisJCSAgICAgICAqbmFtZSsrOworCX0KKworCWlmIChlbnRyeS0+ZV92YWx1ZV9ibG9jayA9PSAwICYmIGVudHJ5LT5lX3ZhbHVlX3NpemUgIT0gMCkgeworCQlfX2xlMzIgKnZhbHVlID0gKF9fbGUzMiAqKSgoY2hhciAqKWhlYWRlciArCisJCQlsZTE2X3RvX2NwdShlbnRyeS0+ZV92YWx1ZV9vZmZzKSk7CisJCWZvciAobiA9IChsZTMyX3RvX2NwdShlbnRyeS0+ZV92YWx1ZV9zaXplKSArCisJCSAgICAgRVhUNF9YQVRUUl9ST1VORCkgPj4gRVhUNF9YQVRUUl9QQURfQklUUzsgbjsgbi0tKSB7CisJCQloYXNoID0gKGhhc2ggPDwgVkFMVUVfSEFTSF9TSElGVCkgXgorCQkJICAgICAgIChoYXNoID4+ICg4KnNpemVvZihoYXNoKSAtIFZBTFVFX0hBU0hfU0hJRlQpKSBeCisJCQkgICAgICAgbGUzMl90b19jcHUoKnZhbHVlKyspOworCQl9CisJfQorCWVudHJ5LT5lX2hhc2ggPSBjcHVfdG9fbGUzMihoYXNoKTsKK30KKworI3VuZGVmIE5BTUVfSEFTSF9TSElGVAorI3VuZGVmIFZBTFVFX0hBU0hfU0hJRlQKKworI2RlZmluZSBCTE9DS19IQVNIX1NISUZUIDE2CisKKy8qCisgKiBleHQ0X3hhdHRyX3JlaGFzaCgpCisgKgorICogUmUtY29tcHV0ZSB0aGUgZXh0ZW5kZWQgYXR0cmlidXRlIGhhc2ggdmFsdWUgYWZ0ZXIgYW4gZW50cnkgaGFzIGNoYW5nZWQuCisgKi8KK3N0YXRpYyB2b2lkIGV4dDRfeGF0dHJfcmVoYXNoKHN0cnVjdCBleHQ0X3hhdHRyX2hlYWRlciAqaGVhZGVyLAorCQkJICAgICAgc3RydWN0IGV4dDRfeGF0dHJfZW50cnkgKmVudHJ5KQoreworCXN0cnVjdCBleHQ0X3hhdHRyX2VudHJ5ICpoZXJlOworCV9fdTMyIGhhc2ggPSAwOworCisJZXh0NF94YXR0cl9oYXNoX2VudHJ5KGhlYWRlciwgZW50cnkpOworCWhlcmUgPSBFTlRSWShoZWFkZXIrMSk7CisJd2hpbGUgKCFJU19MQVNUX0VOVFJZKGhlcmUpKSB7CisJCWlmICghaGVyZS0+ZV9oYXNoKSB7CisJCQkvKiBCbG9jayBpcyBub3Qgc2hhcmVkIGlmIGFuIGVudHJ5J3MgaGFzaCB2YWx1ZSA9PSAwICovCisJCQloYXNoID0gMDsKKwkJCWJyZWFrOworCQl9CisJCWhhc2ggPSAoaGFzaCA8PCBCTE9DS19IQVNIX1NISUZUKSBeCisJCSAgICAgICAoaGFzaCA+PiAoOCpzaXplb2YoaGFzaCkgLSBCTE9DS19IQVNIX1NISUZUKSkgXgorCQkgICAgICAgbGUzMl90b19jcHUoaGVyZS0+ZV9oYXNoKTsKKwkJaGVyZSA9IEVYVDRfWEFUVFJfTkVYVChoZXJlKTsKKwl9CisJaGVhZGVyLT5oX2hhc2ggPSBjcHVfdG9fbGUzMihoYXNoKTsKK30KKworI3VuZGVmIEJMT0NLX0hBU0hfU0hJRlQKKworaW50IF9faW5pdAoraW5pdF9leHQ0X3hhdHRyKHZvaWQpCit7CisJZXh0NF94YXR0cl9jYWNoZSA9IG1iX2NhY2hlX2NyZWF0ZSgiZXh0NF94YXR0ciIsIE5VTEwsCisJCXNpemVvZihzdHJ1Y3QgbWJfY2FjaGVfZW50cnkpICsKKwkJc2l6ZW9mKCgoc3RydWN0IG1iX2NhY2hlX2VudHJ5ICopIDApLT5lX2luZGV4ZXNbMF0pLCAxLCA2KTsKKwlpZiAoIWV4dDRfeGF0dHJfY2FjaGUpCisJCXJldHVybiAtRU5PTUVNOworCXJldHVybiAwOworfQorCit2b2lkCitleGl0X2V4dDRfeGF0dHIodm9pZCkKK3sKKwlpZiAoZXh0NF94YXR0cl9jYWNoZSkKKwkJbWJfY2FjaGVfZGVzdHJveShleHQ0X3hhdHRyX2NhY2hlKTsKKwlleHQ0X3hhdHRyX2NhY2hlID0gTlVMTDsKK30KZGlmZiAtLWdpdCBhL2ZzL2V4dDQveGF0dHIuaCBiL2ZzL2V4dDQveGF0dHIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OTQzMmIzCi0tLSAvZGV2L251bGwKKysrIGIvZnMvZXh0NC94YXR0ci5oCkBAIC0wLDAgKzEsMTQ1IEBACisvKgorICBGaWxlOiBmcy9leHQ0L3hhdHRyLmgKKworICBPbi1kaXNrIGZvcm1hdCBvZiBleHRlbmRlZCBhdHRyaWJ1dGVzIGZvciB0aGUgZXh0NCBmaWxlc3lzdGVtLgorCisgIChDKSAyMDAxIEFuZHJlYXMgR3J1ZW5iYWNoZXIsIDxhLmdydWVuYmFjaGVyQGNvbXB1dGVyLm9yZz4KKyovCisKKyNpbmNsdWRlIDxsaW51eC94YXR0ci5oPgorCisvKiBNYWdpYyB2YWx1ZSBpbiBhdHRyaWJ1dGUgYmxvY2tzICovCisjZGVmaW5lIEVYVDRfWEFUVFJfTUFHSUMJCTB4RUEwMjAwMDAKKworLyogTWF4aW11bSBudW1iZXIgb2YgcmVmZXJlbmNlcyB0byBvbmUgYXR0cmlidXRlIGJsb2NrICovCisjZGVmaW5lIEVYVDRfWEFUVFJfUkVGQ09VTlRfTUFYCQkxMDI0CisKKy8qIE5hbWUgaW5kZXhlcyAqLworI2RlZmluZSBFWFQ0X1hBVFRSX0lOREVYX1VTRVIJCQkxCisjZGVmaW5lIEVYVDRfWEFUVFJfSU5ERVhfUE9TSVhfQUNMX0FDQ0VTUwkyCisjZGVmaW5lIEVYVDRfWEFUVFJfSU5ERVhfUE9TSVhfQUNMX0RFRkFVTFQJMworI2RlZmluZSBFWFQ0X1hBVFRSX0lOREVYX1RSVVNURUQJCTQKKyNkZWZpbmUJRVhUNF9YQVRUUl9JTkRFWF9MVVNUUkUJCQk1CisjZGVmaW5lIEVYVDRfWEFUVFJfSU5ERVhfU0VDVVJJVFkJICAgICAgICA2CisKK3N0cnVjdCBleHQ0X3hhdHRyX2hlYWRlciB7CisJX19sZTMyCWhfbWFnaWM7CS8qIG1hZ2ljIG51bWJlciBmb3IgaWRlbnRpZmljYXRpb24gKi8KKwlfX2xlMzIJaF9yZWZjb3VudDsJLyogcmVmZXJlbmNlIGNvdW50ICovCisJX19sZTMyCWhfYmxvY2tzOwkvKiBudW1iZXIgb2YgZGlzayBibG9ja3MgdXNlZCAqLworCV9fbGUzMgloX2hhc2g7CQkvKiBoYXNoIHZhbHVlIG9mIGFsbCBhdHRyaWJ1dGVzICovCisJX191MzIJaF9yZXNlcnZlZFs0XTsJLyogemVybyByaWdodCBub3cgKi8KK307CisKK3N0cnVjdCBleHQ0X3hhdHRyX2lib2R5X2hlYWRlciB7CisJX19sZTMyCWhfbWFnaWM7CS8qIG1hZ2ljIG51bWJlciBmb3IgaWRlbnRpZmljYXRpb24gKi8KK307CisKK3N0cnVjdCBleHQ0X3hhdHRyX2VudHJ5IHsKKwlfX3U4CWVfbmFtZV9sZW47CS8qIGxlbmd0aCBvZiBuYW1lICovCisJX191OAllX25hbWVfaW5kZXg7CS8qIGF0dHJpYnV0ZSBuYW1lIGluZGV4ICovCisJX19sZTE2CWVfdmFsdWVfb2ZmczsJLyogb2Zmc2V0IGluIGRpc2sgYmxvY2sgb2YgdmFsdWUgKi8KKwlfX2xlMzIJZV92YWx1ZV9ibG9jazsJLyogZGlzayBibG9jayBhdHRyaWJ1dGUgaXMgc3RvcmVkIG9uIChuL2kpICovCisJX19sZTMyCWVfdmFsdWVfc2l6ZTsJLyogc2l6ZSBvZiBhdHRyaWJ1dGUgdmFsdWUgKi8KKwlfX2xlMzIJZV9oYXNoOwkJLyogaGFzaCB2YWx1ZSBvZiBuYW1lIGFuZCB2YWx1ZSAqLworCWNoYXIJZV9uYW1lWzBdOwkvKiBhdHRyaWJ1dGUgbmFtZSAqLworfTsKKworI2RlZmluZSBFWFQ0X1hBVFRSX1BBRF9CSVRTCQkyCisjZGVmaW5lIEVYVDRfWEFUVFJfUEFECQkoMTw8RVhUNF9YQVRUUl9QQURfQklUUykKKyNkZWZpbmUgRVhUNF9YQVRUUl9ST1VORAkJKEVYVDRfWEFUVFJfUEFELTEpCisjZGVmaW5lIEVYVDRfWEFUVFJfTEVOKG5hbWVfbGVuKSBcCisJKCgobmFtZV9sZW4pICsgRVhUNF9YQVRUUl9ST1VORCArIFwKKwlzaXplb2Yoc3RydWN0IGV4dDRfeGF0dHJfZW50cnkpKSAmIH5FWFQ0X1hBVFRSX1JPVU5EKQorI2RlZmluZSBFWFQ0X1hBVFRSX05FWFQoZW50cnkpIFwKKwkoIChzdHJ1Y3QgZXh0NF94YXR0cl9lbnRyeSAqKSggXAorCSAgKGNoYXIgKikoZW50cnkpICsgRVhUNF9YQVRUUl9MRU4oKGVudHJ5KS0+ZV9uYW1lX2xlbikpICkKKyNkZWZpbmUgRVhUNF9YQVRUUl9TSVpFKHNpemUpIFwKKwkoKChzaXplKSArIEVYVDRfWEFUVFJfUk9VTkQpICYgfkVYVDRfWEFUVFJfUk9VTkQpCisKKyMgaWZkZWYgQ09ORklHX0VYVDRERVZfRlNfWEFUVFIKKworZXh0ZXJuIHN0cnVjdCB4YXR0cl9oYW5kbGVyIGV4dDRfeGF0dHJfdXNlcl9oYW5kbGVyOworZXh0ZXJuIHN0cnVjdCB4YXR0cl9oYW5kbGVyIGV4dDRfeGF0dHJfdHJ1c3RlZF9oYW5kbGVyOworZXh0ZXJuIHN0cnVjdCB4YXR0cl9oYW5kbGVyIGV4dDRfeGF0dHJfYWNsX2FjY2Vzc19oYW5kbGVyOworZXh0ZXJuIHN0cnVjdCB4YXR0cl9oYW5kbGVyIGV4dDRfeGF0dHJfYWNsX2RlZmF1bHRfaGFuZGxlcjsKK2V4dGVybiBzdHJ1Y3QgeGF0dHJfaGFuZGxlciBleHQ0X3hhdHRyX3NlY3VyaXR5X2hhbmRsZXI7CisKK2V4dGVybiBzc2l6ZV90IGV4dDRfbGlzdHhhdHRyKHN0cnVjdCBkZW50cnkgKiwgY2hhciAqLCBzaXplX3QpOworCitleHRlcm4gaW50IGV4dDRfeGF0dHJfZ2V0KHN0cnVjdCBpbm9kZSAqLCBpbnQsIGNvbnN0IGNoYXIgKiwgdm9pZCAqLCBzaXplX3QpOworZXh0ZXJuIGludCBleHQ0X3hhdHRyX2xpc3Qoc3RydWN0IGlub2RlICosIGNoYXIgKiwgc2l6ZV90KTsKK2V4dGVybiBpbnQgZXh0NF94YXR0cl9zZXQoc3RydWN0IGlub2RlICosIGludCwgY29uc3QgY2hhciAqLCBjb25zdCB2b2lkICosIHNpemVfdCwgaW50KTsKK2V4dGVybiBpbnQgZXh0NF94YXR0cl9zZXRfaGFuZGxlKGhhbmRsZV90ICosIHN0cnVjdCBpbm9kZSAqLCBpbnQsIGNvbnN0IGNoYXIgKiwgY29uc3Qgdm9pZCAqLCBzaXplX3QsIGludCk7CisKK2V4dGVybiB2b2lkIGV4dDRfeGF0dHJfZGVsZXRlX2lub2RlKGhhbmRsZV90ICosIHN0cnVjdCBpbm9kZSAqKTsKK2V4dGVybiB2b2lkIGV4dDRfeGF0dHJfcHV0X3N1cGVyKHN0cnVjdCBzdXBlcl9ibG9jayAqKTsKKworZXh0ZXJuIGludCBpbml0X2V4dDRfeGF0dHIodm9pZCk7CitleHRlcm4gdm9pZCBleGl0X2V4dDRfeGF0dHIodm9pZCk7CisKK2V4dGVybiBzdHJ1Y3QgeGF0dHJfaGFuZGxlciAqZXh0NF94YXR0cl9oYW5kbGVyc1tdOworCisjIGVsc2UgIC8qIENPTkZJR19FWFQ0REVWX0ZTX1hBVFRSICovCisKK3N0YXRpYyBpbmxpbmUgaW50CitleHQ0X3hhdHRyX2dldChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBpbnQgbmFtZV9pbmRleCwgY29uc3QgY2hhciAqbmFtZSwKKwkgICAgICAgdm9pZCAqYnVmZmVyLCBzaXplX3Qgc2l6ZSwgaW50IGZsYWdzKQoreworCXJldHVybiAtRU9QTk9UU1VQUDsKK30KKworc3RhdGljIGlubGluZSBpbnQKK2V4dDRfeGF0dHJfbGlzdChzdHJ1Y3QgaW5vZGUgKmlub2RlLCB2b2lkICpidWZmZXIsIHNpemVfdCBzaXplKQoreworCXJldHVybiAtRU9QTk9UU1VQUDsKK30KKworc3RhdGljIGlubGluZSBpbnQKK2V4dDRfeGF0dHJfc2V0KHN0cnVjdCBpbm9kZSAqaW5vZGUsIGludCBuYW1lX2luZGV4LCBjb25zdCBjaGFyICpuYW1lLAorCSAgICAgICBjb25zdCB2b2lkICp2YWx1ZSwgc2l6ZV90IHNpemUsIGludCBmbGFncykKK3sKKwlyZXR1cm4gLUVPUE5PVFNVUFA7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50CitleHQ0X3hhdHRyX3NldF9oYW5kbGUoaGFuZGxlX3QgKmhhbmRsZSwgc3RydWN0IGlub2RlICppbm9kZSwgaW50IG5hbWVfaW5kZXgsCisJICAgICAgIGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IHZvaWQgKnZhbHVlLCBzaXplX3Qgc2l6ZSwgaW50IGZsYWdzKQoreworCXJldHVybiAtRU9QTk9UU1VQUDsKK30KKworc3RhdGljIGlubGluZSB2b2lkCitleHQ0X3hhdHRyX2RlbGV0ZV9pbm9kZShoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3QgaW5vZGUgKmlub2RlKQoreworfQorCitzdGF0aWMgaW5saW5lIHZvaWQKK2V4dDRfeGF0dHJfcHV0X3N1cGVyKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpCit7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50Citpbml0X2V4dDRfeGF0dHIodm9pZCkKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSB2b2lkCitleGl0X2V4dDRfeGF0dHIodm9pZCkKK3sKK30KKworI2RlZmluZSBleHQ0X3hhdHRyX2hhbmRsZXJzCU5VTEwKKworIyBlbmRpZiAgLyogQ09ORklHX0VYVDRERVZfRlNfWEFUVFIgKi8KKworI2lmZGVmIENPTkZJR19FWFQ0REVWX0ZTX1NFQ1VSSVRZCitleHRlcm4gaW50IGV4dDRfaW5pdF9zZWN1cml0eShoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3QgaW5vZGUgKmlub2RlLAorCQkJCXN0cnVjdCBpbm9kZSAqZGlyKTsKKyNlbHNlCitzdGF0aWMgaW5saW5lIGludCBleHQ0X2luaXRfc2VjdXJpdHkoaGFuZGxlX3QgKmhhbmRsZSwgc3RydWN0IGlub2RlICppbm9kZSwKKwkJCQlzdHJ1Y3QgaW5vZGUgKmRpcikKK3sKKwlyZXR1cm4gMDsKK30KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZnMvZXh0NC94YXR0cl9zZWN1cml0eS5jIGIvZnMvZXh0NC94YXR0cl9zZWN1cml0eS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI2YTY4NjEKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9leHQ0L3hhdHRyX3NlY3VyaXR5LmMKQEAgLTAsMCArMSw3NyBAQAorLyoKKyAqIGxpbnV4L2ZzL2V4dDQveGF0dHJfc2VjdXJpdHkuYworICogSGFuZGxlciBmb3Igc3RvcmluZyBzZWN1cml0eSBsYWJlbHMgYXMgZXh0ZW5kZWQgYXR0cmlidXRlcy4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9zbXBfbG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L2V4dDRfamJkMi5oPgorI2luY2x1ZGUgPGxpbnV4L2V4dDRfZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9zZWN1cml0eS5oPgorI2luY2x1ZGUgInhhdHRyLmgiCisKK3N0YXRpYyBzaXplX3QKK2V4dDRfeGF0dHJfc2VjdXJpdHlfbGlzdChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBjaGFyICpsaXN0LCBzaXplX3QgbGlzdF9zaXplLAorCQkJIGNvbnN0IGNoYXIgKm5hbWUsIHNpemVfdCBuYW1lX2xlbikKK3sKKwljb25zdCBzaXplX3QgcHJlZml4X2xlbiA9IHNpemVvZihYQVRUUl9TRUNVUklUWV9QUkVGSVgpLTE7CisJY29uc3Qgc2l6ZV90IHRvdGFsX2xlbiA9IHByZWZpeF9sZW4gKyBuYW1lX2xlbiArIDE7CisKKworCWlmIChsaXN0ICYmIHRvdGFsX2xlbiA8PSBsaXN0X3NpemUpIHsKKwkJbWVtY3B5KGxpc3QsIFhBVFRSX1NFQ1VSSVRZX1BSRUZJWCwgcHJlZml4X2xlbik7CisJCW1lbWNweShsaXN0K3ByZWZpeF9sZW4sIG5hbWUsIG5hbWVfbGVuKTsKKwkJbGlzdFtwcmVmaXhfbGVuICsgbmFtZV9sZW5dID0gJ1wwJzsKKwl9CisJcmV0dXJuIHRvdGFsX2xlbjsKK30KKworc3RhdGljIGludAorZXh0NF94YXR0cl9zZWN1cml0eV9nZXQoc3RydWN0IGlub2RlICppbm9kZSwgY29uc3QgY2hhciAqbmFtZSwKKwkJICAgICAgIHZvaWQgKmJ1ZmZlciwgc2l6ZV90IHNpemUpCit7CisJaWYgKHN0cmNtcChuYW1lLCAiIikgPT0gMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisJcmV0dXJuIGV4dDRfeGF0dHJfZ2V0KGlub2RlLCBFWFQ0X1hBVFRSX0lOREVYX1NFQ1VSSVRZLCBuYW1lLAorCQkJICAgICAgYnVmZmVyLCBzaXplKTsKK30KKworc3RhdGljIGludAorZXh0NF94YXR0cl9zZWN1cml0eV9zZXQoc3RydWN0IGlub2RlICppbm9kZSwgY29uc3QgY2hhciAqbmFtZSwKKwkJICAgICAgIGNvbnN0IHZvaWQgKnZhbHVlLCBzaXplX3Qgc2l6ZSwgaW50IGZsYWdzKQoreworCWlmIChzdHJjbXAobmFtZSwgIiIpID09IDApCisJCXJldHVybiAtRUlOVkFMOworCXJldHVybiBleHQ0X3hhdHRyX3NldChpbm9kZSwgRVhUNF9YQVRUUl9JTkRFWF9TRUNVUklUWSwgbmFtZSwKKwkJCSAgICAgIHZhbHVlLCBzaXplLCBmbGFncyk7Cit9CisKK2ludAorZXh0NF9pbml0X3NlY3VyaXR5KGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBpbm9kZSAqZGlyKQoreworCWludCBlcnI7CisJc2l6ZV90IGxlbjsKKwl2b2lkICp2YWx1ZTsKKwljaGFyICpuYW1lOworCisJZXJyID0gc2VjdXJpdHlfaW5vZGVfaW5pdF9zZWN1cml0eShpbm9kZSwgZGlyLCAmbmFtZSwgJnZhbHVlLCAmbGVuKTsKKwlpZiAoZXJyKSB7CisJCWlmIChlcnIgPT0gLUVPUE5PVFNVUFApCisJCQlyZXR1cm4gMDsKKwkJcmV0dXJuIGVycjsKKwl9CisJZXJyID0gZXh0NF94YXR0cl9zZXRfaGFuZGxlKGhhbmRsZSwgaW5vZGUsIEVYVDRfWEFUVFJfSU5ERVhfU0VDVVJJVFksCisJCQkJICAgIG5hbWUsIHZhbHVlLCBsZW4sIDApOworCWtmcmVlKG5hbWUpOworCWtmcmVlKHZhbHVlKTsKKwlyZXR1cm4gZXJyOworfQorCitzdHJ1Y3QgeGF0dHJfaGFuZGxlciBleHQ0X3hhdHRyX3NlY3VyaXR5X2hhbmRsZXIgPSB7CisJLnByZWZpeAk9IFhBVFRSX1NFQ1VSSVRZX1BSRUZJWCwKKwkubGlzdAk9IGV4dDRfeGF0dHJfc2VjdXJpdHlfbGlzdCwKKwkuZ2V0CT0gZXh0NF94YXR0cl9zZWN1cml0eV9nZXQsCisJLnNldAk9IGV4dDRfeGF0dHJfc2VjdXJpdHlfc2V0LAorfTsKZGlmZiAtLWdpdCBhL2ZzL2V4dDQveGF0dHJfdHJ1c3RlZC5jIGIvZnMvZXh0NC94YXR0cl90cnVzdGVkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjc2ZjJkYgotLS0gL2Rldi9udWxsCisrKyBiL2ZzL2V4dDQveGF0dHJfdHJ1c3RlZC5jCkBAIC0wLDAgKzEsNjIgQEAKKy8qCisgKiBsaW51eC9mcy9leHQ0L3hhdHRyX3RydXN0ZWQuYworICogSGFuZGxlciBmb3IgdHJ1c3RlZCBleHRlbmRlZCBhdHRyaWJ1dGVzLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMyBieSBBbmRyZWFzIEdydWVuYmFjaGVyLCA8YS5ncnVlbmJhY2hlckBjb21wdXRlci5vcmc+CisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L2NhcGFiaWxpdHkuaD4KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvZXh0NF9qYmQyLmg+CisjaW5jbHVkZSA8bGludXgvZXh0NF9mcy5oPgorI2luY2x1ZGUgInhhdHRyLmgiCisKKyNkZWZpbmUgWEFUVFJfVFJVU1RFRF9QUkVGSVggInRydXN0ZWQuIgorCitzdGF0aWMgc2l6ZV90CitleHQ0X3hhdHRyX3RydXN0ZWRfbGlzdChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBjaGFyICpsaXN0LCBzaXplX3QgbGlzdF9zaXplLAorCQkJY29uc3QgY2hhciAqbmFtZSwgc2l6ZV90IG5hbWVfbGVuKQoreworCWNvbnN0IHNpemVfdCBwcmVmaXhfbGVuID0gc2l6ZW9mKFhBVFRSX1RSVVNURURfUFJFRklYKS0xOworCWNvbnN0IHNpemVfdCB0b3RhbF9sZW4gPSBwcmVmaXhfbGVuICsgbmFtZV9sZW4gKyAxOworCisJaWYgKCFjYXBhYmxlKENBUF9TWVNfQURNSU4pKQorCQlyZXR1cm4gMDsKKworCWlmIChsaXN0ICYmIHRvdGFsX2xlbiA8PSBsaXN0X3NpemUpIHsKKwkJbWVtY3B5KGxpc3QsIFhBVFRSX1RSVVNURURfUFJFRklYLCBwcmVmaXhfbGVuKTsKKwkJbWVtY3B5KGxpc3QrcHJlZml4X2xlbiwgbmFtZSwgbmFtZV9sZW4pOworCQlsaXN0W3ByZWZpeF9sZW4gKyBuYW1lX2xlbl0gPSAnXDAnOworCX0KKwlyZXR1cm4gdG90YWxfbGVuOworfQorCitzdGF0aWMgaW50CitleHQ0X3hhdHRyX3RydXN0ZWRfZ2V0KHN0cnVjdCBpbm9kZSAqaW5vZGUsIGNvbnN0IGNoYXIgKm5hbWUsCisJCSAgICAgICB2b2lkICpidWZmZXIsIHNpemVfdCBzaXplKQoreworCWlmIChzdHJjbXAobmFtZSwgIiIpID09IDApCisJCXJldHVybiAtRUlOVkFMOworCXJldHVybiBleHQ0X3hhdHRyX2dldChpbm9kZSwgRVhUNF9YQVRUUl9JTkRFWF9UUlVTVEVELCBuYW1lLAorCQkJICAgICAgYnVmZmVyLCBzaXplKTsKK30KKworc3RhdGljIGludAorZXh0NF94YXR0cl90cnVzdGVkX3NldChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBjb25zdCBjaGFyICpuYW1lLAorCQkgICAgICAgY29uc3Qgdm9pZCAqdmFsdWUsIHNpemVfdCBzaXplLCBpbnQgZmxhZ3MpCit7CisJaWYgKHN0cmNtcChuYW1lLCAiIikgPT0gMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisJcmV0dXJuIGV4dDRfeGF0dHJfc2V0KGlub2RlLCBFWFQ0X1hBVFRSX0lOREVYX1RSVVNURUQsIG5hbWUsCisJCQkgICAgICB2YWx1ZSwgc2l6ZSwgZmxhZ3MpOworfQorCitzdHJ1Y3QgeGF0dHJfaGFuZGxlciBleHQ0X3hhdHRyX3RydXN0ZWRfaGFuZGxlciA9IHsKKwkucHJlZml4CT0gWEFUVFJfVFJVU1RFRF9QUkVGSVgsCisJLmxpc3QJPSBleHQ0X3hhdHRyX3RydXN0ZWRfbGlzdCwKKwkuZ2V0CT0gZXh0NF94YXR0cl90cnVzdGVkX2dldCwKKwkuc2V0CT0gZXh0NF94YXR0cl90cnVzdGVkX3NldCwKK307CmRpZmYgLS1naXQgYS9mcy9leHQ0L3hhdHRyX3VzZXIuYyBiL2ZzL2V4dDQveGF0dHJfdXNlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM1M2NkZWQKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9leHQ0L3hhdHRyX3VzZXIuYwpAQCAtMCwwICsxLDY0IEBACisvKgorICogbGludXgvZnMvZXh0NC94YXR0cl91c2VyLmMKKyAqIEhhbmRsZXIgZm9yIGV4dGVuZGVkIHVzZXIgYXR0cmlidXRlcy4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDEgYnkgQW5kcmVhcyBHcnVlbmJhY2hlciwgPGEuZ3J1ZW5iYWNoZXJAY29tcHV0ZXIub3JnPgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvZXh0NF9qYmQyLmg+CisjaW5jbHVkZSA8bGludXgvZXh0NF9mcy5oPgorI2luY2x1ZGUgInhhdHRyLmgiCisKKyNkZWZpbmUgWEFUVFJfVVNFUl9QUkVGSVggInVzZXIuIgorCitzdGF0aWMgc2l6ZV90CitleHQ0X3hhdHRyX3VzZXJfbGlzdChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBjaGFyICpsaXN0LCBzaXplX3QgbGlzdF9zaXplLAorCQkgICAgIGNvbnN0IGNoYXIgKm5hbWUsIHNpemVfdCBuYW1lX2xlbikKK3sKKwljb25zdCBzaXplX3QgcHJlZml4X2xlbiA9IHNpemVvZihYQVRUUl9VU0VSX1BSRUZJWCktMTsKKwljb25zdCBzaXplX3QgdG90YWxfbGVuID0gcHJlZml4X2xlbiArIG5hbWVfbGVuICsgMTsKKworCWlmICghdGVzdF9vcHQoaW5vZGUtPmlfc2IsIFhBVFRSX1VTRVIpKQorCQlyZXR1cm4gMDsKKworCWlmIChsaXN0ICYmIHRvdGFsX2xlbiA8PSBsaXN0X3NpemUpIHsKKwkJbWVtY3B5KGxpc3QsIFhBVFRSX1VTRVJfUFJFRklYLCBwcmVmaXhfbGVuKTsKKwkJbWVtY3B5KGxpc3QrcHJlZml4X2xlbiwgbmFtZSwgbmFtZV9sZW4pOworCQlsaXN0W3ByZWZpeF9sZW4gKyBuYW1lX2xlbl0gPSAnXDAnOworCX0KKwlyZXR1cm4gdG90YWxfbGVuOworfQorCitzdGF0aWMgaW50CitleHQ0X3hhdHRyX3VzZXJfZ2V0KHN0cnVjdCBpbm9kZSAqaW5vZGUsIGNvbnN0IGNoYXIgKm5hbWUsCisJCSAgICB2b2lkICpidWZmZXIsIHNpemVfdCBzaXplKQoreworCWlmIChzdHJjbXAobmFtZSwgIiIpID09IDApCisJCXJldHVybiAtRUlOVkFMOworCWlmICghdGVzdF9vcHQoaW5vZGUtPmlfc2IsIFhBVFRSX1VTRVIpKQorCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisJcmV0dXJuIGV4dDRfeGF0dHJfZ2V0KGlub2RlLCBFWFQ0X1hBVFRSX0lOREVYX1VTRVIsIG5hbWUsIGJ1ZmZlciwgc2l6ZSk7Cit9CisKK3N0YXRpYyBpbnQKK2V4dDRfeGF0dHJfdXNlcl9zZXQoc3RydWN0IGlub2RlICppbm9kZSwgY29uc3QgY2hhciAqbmFtZSwKKwkJICAgIGNvbnN0IHZvaWQgKnZhbHVlLCBzaXplX3Qgc2l6ZSwgaW50IGZsYWdzKQoreworCWlmIChzdHJjbXAobmFtZSwgIiIpID09IDApCisJCXJldHVybiAtRUlOVkFMOworCWlmICghdGVzdF9vcHQoaW5vZGUtPmlfc2IsIFhBVFRSX1VTRVIpKQorCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisJcmV0dXJuIGV4dDRfeGF0dHJfc2V0KGlub2RlLCBFWFQ0X1hBVFRSX0lOREVYX1VTRVIsIG5hbWUsCisJCQkgICAgICB2YWx1ZSwgc2l6ZSwgZmxhZ3MpOworfQorCitzdHJ1Y3QgeGF0dHJfaGFuZGxlciBleHQ0X3hhdHRyX3VzZXJfaGFuZGxlciA9IHsKKwkucHJlZml4CT0gWEFUVFJfVVNFUl9QUkVGSVgsCisJLmxpc3QJPSBleHQ0X3hhdHRyX3VzZXJfbGlzdCwKKwkuZ2V0CT0gZXh0NF94YXR0cl91c2VyX2dldCwKKwkuc2V0CT0gZXh0NF94YXR0cl91c2VyX3NldCwKK307CmRpZmYgLS1naXQgYS9mcy9mYXQvZmlsZS5jIGIvZnMvZmF0L2ZpbGUuYwppbmRleCBmNGI4ZjhiLi4wYWE4MTNkIDEwMDY0NAotLS0gYS9mcy9mYXQvZmlsZS5jCisrKyBiL2ZzL2ZhdC9maWxlLmMKQEAgLTEzLDYgKzEzLDcgQEAKICNpbmNsdWRlIDxsaW51eC9zbXBfbG9jay5oPgogI2luY2x1ZGUgPGxpbnV4L2J1ZmZlcl9oZWFkLmg+CiAjaW5jbHVkZSA8bGludXgvd3JpdGViYWNrLmg+CisjaW5jbHVkZSA8bGludXgvYmFja2luZy1kZXYuaD4KICNpbmNsdWRlIDxsaW51eC9ibGtkZXYuaD4KIAogaW50IGZhdF9nZW5lcmljX2lvY3RsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwLApAQCAtMTE4LDcgKzExOSw3IEBACiAJaWYgKChmaWxwLT5mX21vZGUgJiBGTU9ERV9XUklURSkgJiYKIAkgICAgIE1TRE9TX1NCKGlub2RlLT5pX3NiKS0+b3B0aW9ucy5mbHVzaCkgewogCQlmYXRfZmx1c2hfaW5vZGVzKGlub2RlLT5pX3NiLCBpbm9kZSwgTlVMTCk7Ci0JCWJsa19jb25nZXN0aW9uX3dhaXQoV1JJVEUsIEhaLzEwKTsKKwkJY29uZ2VzdGlvbl93YWl0KFdSSVRFLCBIWi8xMCk7CiAJfQogCXJldHVybiAwOwogfQpAQCAtMzAyLDcgKzMwMywxNyBAQAogCWZhdF9mbHVzaF9pbm9kZXMoaW5vZGUtPmlfc2IsIGlub2RlLCBOVUxMKTsKIH0KIAoraW50IGZhdF9nZXRhdHRyKHN0cnVjdCB2ZnNtb3VudCAqbW50LCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIHN0cnVjdCBrc3RhdCAqc3RhdCkKK3sKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZGVudHJ5LT5kX2lub2RlOworCWdlbmVyaWNfZmlsbGF0dHIoaW5vZGUsIHN0YXQpOworCXN0YXQtPmJsa3NpemUgPSBNU0RPU19TQihpbm9kZS0+aV9zYiktPmNsdXN0ZXJfc2l6ZTsKKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGZhdF9nZXRhdHRyKTsKKwogc3RydWN0IGlub2RlX29wZXJhdGlvbnMgZmF0X2ZpbGVfaW5vZGVfb3BlcmF0aW9ucyA9IHsKIAkudHJ1bmNhdGUJPSBmYXRfdHJ1bmNhdGUsCiAJLnNldGF0dHIJPSBmYXRfbm90aWZ5X2NoYW5nZSwKKwkuZ2V0YXR0cgk9IGZhdF9nZXRhdHRyLAogfTsKZGlmZiAtLWdpdCBhL2ZzL2ZhdC9pbm9kZS5jIGIvZnMvZmF0L2lub2RlLmMKaW5kZXggNDYxM2NiMi4uNzg5NDViNSAxMDA2NDQKLS0tIGEvZnMvZmF0L2lub2RlLmMKKysrIGIvZnMvZmF0L2lub2RlLmMKQEAgLTE0NzIsNyArMTQ3Miw3IEBACiAJCXJldCA9IHdyaXRlYmFja19pbm9kZShpMSk7CiAJaWYgKCFyZXQgJiYgaTIpCiAJCXJldCA9IHdyaXRlYmFja19pbm9kZShpMik7Ci0JaWYgKCFyZXQgJiYgc2IpIHsKKwlpZiAoIXJldCkgewogCQlzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZyA9IHNiLT5zX2JkZXYtPmJkX2lub2RlLT5pX21hcHBpbmc7CiAJCXJldCA9IGZpbGVtYXBfZmx1c2gobWFwcGluZyk7CiAJfQpkaWZmIC0tZ2l0IGEvZnMvZnVzZS9kaXIuYyBiL2ZzL2Z1c2UvZGlyLmMKaW5kZXggODYwNTE1NS4uY2ZjOGY4MSAxMDA2NDQKLS0tIGEvZnMvZnVzZS9kaXIuYworKysgYi9mcy9mdXNlL2Rpci5jCkBAIC0xMzgsNiArMTM4LDcgQEAKIAkJc3RydWN0IGZ1c2VfZW50cnlfb3V0IG91dGFyZzsKIAkJc3RydWN0IGZ1c2VfY29ubiAqZmM7CiAJCXN0cnVjdCBmdXNlX3JlcSAqcmVxOworCQlzdHJ1Y3QgZGVudHJ5ICpwYXJlbnQ7CiAKIAkJLyogRG9lc24ndCBodXJ0IHRvICJyZXNldCIgdGhlIHZhbGlkaXR5IHRpbWVvdXQgKi8KIAkJZnVzZV9pbnZhbGlkYXRlX2VudHJ5X2NhY2hlKGVudHJ5KTsKQEAgLTE1MSw4ICsxNTIsMTAgQEAKIAkJaWYgKElTX0VSUihyZXEpKQogCQkJcmV0dXJuIDA7CiAKLQkJZnVzZV9sb29rdXBfaW5pdChyZXEsIGVudHJ5LT5kX3BhcmVudC0+ZF9pbm9kZSwgZW50cnksICZvdXRhcmcpOworCQlwYXJlbnQgPSBkZ2V0X3BhcmVudChlbnRyeSk7CisJCWZ1c2VfbG9va3VwX2luaXQocmVxLCBwYXJlbnQtPmRfaW5vZGUsIGVudHJ5LCAmb3V0YXJnKTsKIAkJcmVxdWVzdF9zZW5kKGZjLCByZXEpOworCQlkcHV0KHBhcmVudCk7CiAJCWVyciA9IHJlcS0+b3V0LmguZXJyb3I7CiAJCS8qIFplcm8gbm9kZWlkIGlzIHNhbWUgYXMgLUVOT0VOVCAqLwogCQlpZiAoIWVyciAmJiAhb3V0YXJnLm5vZGVpZCkKQEAgLTE2Myw3ICsxNjYsOSBAQAogCQkJCWZ1c2Vfc2VuZF9mb3JnZXQoZmMsIHJlcSwgb3V0YXJnLm5vZGVpZCwgMSk7CiAJCQkJcmV0dXJuIDA7CiAJCQl9CisJCQlzcGluX2xvY2soJmZjLT5sb2NrKTsKIAkJCWZpLT5ubG9va3VwICsrOworCQkJc3Bpbl91bmxvY2soJmZjLT5sb2NrKTsKIAkJfQogCQlmdXNlX3B1dF9yZXF1ZXN0KGZjLCByZXEpOwogCQlpZiAoZXJyIHx8IChvdXRhcmcuYXR0ci5tb2RlIF4gaW5vZGUtPmlfbW9kZSkgJiBTX0lGTVQpCkBAIC0xNzUsMjIgKzE4MCw2IEBACiAJcmV0dXJuIDE7CiB9CiAKLS8qCi0gKiBDaGVjayBpZiB0aGVyZSdzIGFscmVhZHkgYSBoYXNoZWQgYWxpYXMgb2YgdGhpcyBkaXJlY3RvcnkgaW5vZGUuCi0gKiBJZiB5ZXMsIHRoZW4gbG9va3VwIGFuZCBta2RpciBtdXN0IG5vdCBjcmVhdGUgYSBuZXcgYWxpYXMuCi0gKi8KLXN0YXRpYyBpbnQgZGlyX2FsaWFzKHN0cnVjdCBpbm9kZSAqaW5vZGUpCi17Ci0JaWYgKFNfSVNESVIoaW5vZGUtPmlfbW9kZSkpIHsKLQkJc3RydWN0IGRlbnRyeSAqYWxpYXMgPSBkX2ZpbmRfYWxpYXMoaW5vZGUpOwotCQlpZiAoYWxpYXMpIHsKLQkJCWRwdXQoYWxpYXMpOwotCQkJcmV0dXJuIDE7Ci0JCX0KLQl9Ci0JcmV0dXJuIDA7Ci19Ci0KIHN0YXRpYyBpbnQgaW52YWxpZF9ub2RlaWQodTY0IG5vZGVpZCkKIHsKIAlyZXR1cm4gIW5vZGVpZCB8fCBub2RlaWQgPT0gRlVTRV9ST09UX0lEOwpAQCAtMjA2LDYgKzE5NSwyNCBAQAogCQlTX0lTQkxLKG0pIHx8IFNfSVNGSUZPKG0pIHx8IFNfSVNTT0NLKG0pOwogfQogCisvKgorICogQWRkIGEgZGlyZWN0b3J5IGlub2RlIHRvIGEgZGVudHJ5LCBlbnN1cmluZyB0aGF0IG5vIG90aGVyIGRlbnRyeQorICogcmVmZXJzIHRvIHRoaXMgaW5vZGUuICBDYWxsZWQgd2l0aCBmYy0+aW5zdF9tdXRleC4KKyAqLworc3RhdGljIGludCBmdXNlX2RfYWRkX2RpcmVjdG9yeShzdHJ1Y3QgZGVudHJ5ICplbnRyeSwgc3RydWN0IGlub2RlICppbm9kZSkKK3sKKwlzdHJ1Y3QgZGVudHJ5ICphbGlhcyA9IGRfZmluZF9hbGlhcyhpbm9kZSk7CisJaWYgKGFsaWFzKSB7CisJCS8qIFRoaXMgdHJpZXMgdG8gc2hyaW5rIHRoZSBzdWJ0cmVlIGJlbG93IGFsaWFzICovCisJCWZ1c2VfaW52YWxpZGF0ZV9lbnRyeShhbGlhcyk7CisJCWRwdXQoYWxpYXMpOworCQlpZiAoIWxpc3RfZW1wdHkoJmlub2RlLT5pX2RlbnRyeSkpCisJCQlyZXR1cm4gLUVCVVNZOworCX0KKwlkX2FkZChlbnRyeSwgaW5vZGUpOworCXJldHVybiAwOworfQorCiBzdGF0aWMgc3RydWN0IGRlbnRyeSAqZnVzZV9sb29rdXAoc3RydWN0IGlub2RlICpkaXIsIHN0cnVjdCBkZW50cnkgKmVudHJ5LAogCQkJCSAgc3RydWN0IG5hbWVpZGF0YSAqbmQpCiB7CkBAIC0yNDEsMTEgKzI0OCwxNyBAQAogCWlmIChlcnIgJiYgZXJyICE9IC1FTk9FTlQpCiAJCXJldHVybiBFUlJfUFRSKGVycik7CiAKLQlpZiAoaW5vZGUgJiYgZGlyX2FsaWFzKGlub2RlKSkgewotCQlpcHV0KGlub2RlKTsKLQkJcmV0dXJuIEVSUl9QVFIoLUVJTyk7Ci0JfQotCWRfYWRkKGVudHJ5LCBpbm9kZSk7CisJaWYgKGlub2RlICYmIFNfSVNESVIoaW5vZGUtPmlfbW9kZSkpIHsKKwkJbXV0ZXhfbG9jaygmZmMtPmluc3RfbXV0ZXgpOworCQllcnIgPSBmdXNlX2RfYWRkX2RpcmVjdG9yeShlbnRyeSwgaW5vZGUpOworCQltdXRleF91bmxvY2soJmZjLT5pbnN0X211dGV4KTsKKwkJaWYgKGVycikgeworCQkJaXB1dChpbm9kZSk7CisJCQlyZXR1cm4gRVJSX1BUUihlcnIpOworCQl9CisJfSBlbHNlCisJCWRfYWRkKGVudHJ5LCBpbm9kZSk7CisKIAllbnRyeS0+ZF9vcCA9ICZmdXNlX2RlbnRyeV9vcGVyYXRpb25zOwogCWlmICghZXJyKQogCQlmdXNlX2NoYW5nZV90aW1lb3V0KGVudHJ5LCAmb3V0YXJnKTsKQEAgLTQwMSwxMiArNDE0LDIyIEBACiAJfQogCWZ1c2VfcHV0X3JlcXVlc3QoZmMsIHJlcSk7CiAKLQlpZiAoZGlyX2FsaWFzKGlub2RlKSkgewotCQlpcHV0KGlub2RlKTsKLQkJcmV0dXJuIC1FSU87Ci0JfQorCWlmIChTX0lTRElSKGlub2RlLT5pX21vZGUpKSB7CisJCXN0cnVjdCBkZW50cnkgKmFsaWFzOworCQltdXRleF9sb2NrKCZmYy0+aW5zdF9tdXRleCk7CisJCWFsaWFzID0gZF9maW5kX2FsaWFzKGlub2RlKTsKKwkJaWYgKGFsaWFzKSB7CisJCQkvKiBOZXcgZGlyZWN0b3J5IG11c3QgaGF2ZSBtb3ZlZCBzaW5jZSBta2RpciAqLworCQkJbXV0ZXhfdW5sb2NrKCZmYy0+aW5zdF9tdXRleCk7CisJCQlkcHV0KGFsaWFzKTsKKwkJCWlwdXQoaW5vZGUpOworCQkJcmV0dXJuIC1FQlVTWTsKKwkJfQorCQlkX2luc3RhbnRpYXRlKGVudHJ5LCBpbm9kZSk7CisJCW11dGV4X3VubG9jaygmZmMtPmluc3RfbXV0ZXgpOworCX0gZWxzZQorCQlkX2luc3RhbnRpYXRlKGVudHJ5LCBpbm9kZSk7CiAKLQlkX2luc3RhbnRpYXRlKGVudHJ5LCBpbm9kZSk7CiAJZnVzZV9jaGFuZ2VfdGltZW91dChlbnRyeSwgJm91dGFyZyk7CiAJZnVzZV9pbnZhbGlkYXRlX2F0dHIoZGlyKTsKIAlyZXR1cm4gMDsKQEAgLTkzNSwxNCArOTU4LDMwIEBACiAJfQogfQogCitzdGF0aWMgdm9pZCBmdXNlX3ZtdHJ1bmNhdGUoc3RydWN0IGlub2RlICppbm9kZSwgbG9mZl90IG9mZnNldCkKK3sKKwlzdHJ1Y3QgZnVzZV9jb25uICpmYyA9IGdldF9mdXNlX2Nvbm4oaW5vZGUpOworCWludCBuZWVkX3RydW5jOworCisJc3Bpbl9sb2NrKCZmYy0+bG9jayk7CisJbmVlZF90cnVuYyA9IGlub2RlLT5pX3NpemUgPiBvZmZzZXQ7CisJaV9zaXplX3dyaXRlKGlub2RlLCBvZmZzZXQpOworCXNwaW5fdW5sb2NrKCZmYy0+bG9jayk7CisKKwlpZiAobmVlZF90cnVuYykgeworCQlzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZyA9IGlub2RlLT5pX21hcHBpbmc7CisJCXVubWFwX21hcHBpbmdfcmFuZ2UobWFwcGluZywgb2Zmc2V0ICsgUEFHRV9TSVpFIC0gMSwgMCwgMSk7CisJCXRydW5jYXRlX2lub2RlX3BhZ2VzKG1hcHBpbmcsIG9mZnNldCk7CisJfQorfQorCiAvKgogICogU2V0IGF0dHJpYnV0ZXMsIGFuZCBhdCB0aGUgc2FtZSB0aW1lIHJlZnJlc2ggdGhlbS4KICAqCiAgKiBUcnVuY2F0aW9uIGlzIHNsaWdodGx5IGNvbXBsaWNhdGVkLCBiZWNhdXNlIHRoZSAndHJ1bmNhdGUnIHJlcXVlc3QKICAqIG1heSBmYWlsLCBpbiB3aGljaCBjYXNlIHdlIGRvbid0IHdhbnQgdG8gdG91Y2ggdGhlIG1hcHBpbmcuCi0gKiB2bXRydW5jYXRlKCkgZG9lc24ndCBhbGxvdyBmb3IgdGhpcyBjYXNlLiAgU28gZG8gdGhlIHJsaW1pdAotICogY2hlY2tpbmcgYnkgaGFuZCBhbmQgY2FsbCB2bXRydW5jYXRlKCkgb25seSBhZnRlciB0aGUgZmlsZSBoYXMKLSAqIGFjdHVhbGx5IGJlZW4gdHJ1bmNhdGVkLgorICogdm10cnVuY2F0ZSgpIGRvZXNuJ3QgYWxsb3cgZm9yIHRoaXMgY2FzZSwgc28gZG8gdGhlIHJsaW1pdCBjaGVja2luZworICogYW5kIHRoZSBhY3R1YWwgdHJ1bmNhdGlvbiBieSBoYW5kLgogICovCiBzdGF0aWMgaW50IGZ1c2Vfc2V0YXR0cihzdHJ1Y3QgZGVudHJ5ICplbnRyeSwgc3RydWN0IGlhdHRyICphdHRyKQogewpAQCAtOTkzLDEyICsxMDMyLDggQEAKIAkJCW1ha2VfYmFkX2lub2RlKGlub2RlKTsKIAkJCWVyciA9IC1FSU87CiAJCX0gZWxzZSB7Ci0JCQlpZiAoaXNfdHJ1bmNhdGUpIHsKLQkJCQlsb2ZmX3Qgb3JpZ3NpemUgPSBpX3NpemVfcmVhZChpbm9kZSk7Ci0JCQkJaV9zaXplX3dyaXRlKGlub2RlLCBvdXRhcmcuYXR0ci5zaXplKTsKLQkJCQlpZiAob3JpZ3NpemUgPiBvdXRhcmcuYXR0ci5zaXplKQotCQkJCQl2bXRydW5jYXRlKGlub2RlLCBvdXRhcmcuYXR0ci5zaXplKTsKLQkJCX0KKwkJCWlmIChpc190cnVuY2F0ZSkKKwkJCQlmdXNlX3ZtdHJ1bmNhdGUoaW5vZGUsIG91dGFyZy5hdHRyLnNpemUpOwogCQkJZnVzZV9jaGFuZ2VfYXR0cmlidXRlcyhpbm9kZSwgJm91dGFyZy5hdHRyKTsKIAkJCWZpLT5pX3RpbWUgPSB0aW1lX3RvX2ppZmZpZXMob3V0YXJnLmF0dHJfdmFsaWQsCiAJCQkJCQkgICAgIG91dGFyZy5hdHRyX3ZhbGlkX25zZWMpOwpkaWZmIC0tZ2l0IGEvZnMvZnVzZS9maWxlLmMgYi9mcy9mdXNlL2ZpbGUuYwppbmRleCAxODM2MjY4Li43NjNhNTBkIDEwMDY0NAotLS0gYS9mcy9mdXNlL2ZpbGUuYworKysgYi9mcy9mdXNlL2ZpbGUuYwpAQCAtMzk3LDE0ICszOTcsMTQgQEAKIAogCWVyciA9IC1FSU87CiAJaWYgKGlzX2JhZF9pbm9kZShpbm9kZSkpCi0JCWdvdG8gY2xlYW5fcGFnZXNfdXA7CisJCWdvdG8gb3V0OwogCiAJZGF0YS5maWxlID0gZmlsZTsKIAlkYXRhLmlub2RlID0gaW5vZGU7CiAJZGF0YS5yZXEgPSBmdXNlX2dldF9yZXEoZmMpOwogCWVyciA9IFBUUl9FUlIoZGF0YS5yZXEpOwogCWlmIChJU19FUlIoZGF0YS5yZXEpKQotCQlnb3RvIGNsZWFuX3BhZ2VzX3VwOworCQlnb3RvIG91dDsKIAogCWVyciA9IHJlYWRfY2FjaGVfcGFnZXMobWFwcGluZywgcGFnZXMsIGZ1c2VfcmVhZHBhZ2VzX2ZpbGwsICZkYXRhKTsKIAlpZiAoIWVycikgewpAQCAtNDEzLDEwICs0MTMsNyBAQAogCQllbHNlCiAJCQlmdXNlX3B1dF9yZXF1ZXN0KGZjLCBkYXRhLnJlcSk7CiAJfQotCXJldHVybiBlcnI7Ci0KLWNsZWFuX3BhZ2VzX3VwOgotCXB1dF9wYWdlc19saXN0KHBhZ2VzKTsKK291dDoKIAlyZXR1cm4gZXJyOwogfQogCkBAIC00ODEsOCArNDc4LDEwIEBACiAJCWVyciA9IC1FSU87CiAJaWYgKCFlcnIpIHsKIAkJcG9zICs9IGNvdW50OwotCQlpZiAocG9zID4gaV9zaXplX3JlYWQoaW5vZGUpKQorCQlzcGluX2xvY2soJmZjLT5sb2NrKTsKKwkJaWYgKHBvcyA+IGlub2RlLT5pX3NpemUpCiAJCQlpX3NpemVfd3JpdGUoaW5vZGUsIHBvcyk7CisJCXNwaW5fdW5sb2NrKCZmYy0+bG9jayk7CiAKIAkJaWYgKG9mZnNldCA9PSAwICYmIHRvID09IFBBR0VfQ0FDSEVfU0laRSkgewogCQkJY2xlYXJfcGFnZV9kaXJ0eShwYWdlKTsKQEAgLTU4Niw4ICs1ODUsMTIgQEAKIAl9CiAJZnVzZV9wdXRfcmVxdWVzdChmYywgcmVxKTsKIAlpZiAocmVzID4gMCkgewotCQlpZiAod3JpdGUgJiYgcG9zID4gaV9zaXplX3JlYWQoaW5vZGUpKQotCQkJaV9zaXplX3dyaXRlKGlub2RlLCBwb3MpOworCQlpZiAod3JpdGUpIHsKKwkJCXNwaW5fbG9jaygmZmMtPmxvY2spOworCQkJaWYgKHBvcyA+IGlub2RlLT5pX3NpemUpCisJCQkJaV9zaXplX3dyaXRlKGlub2RlLCBwb3MpOworCQkJc3Bpbl91bmxvY2soJmZjLT5sb2NrKTsKKwkJfQogCQkqcHBvcyA9IHBvczsKIAl9CiAJZnVzZV9pbnZhbGlkYXRlX2F0dHIoaW5vZGUpOwpkaWZmIC0tZ2l0IGEvZnMvZnVzZS9mdXNlX2kuaCBiL2ZzL2Z1c2UvZnVzZV9pLmgKaW5kZXggNjljNzc1MC4uOTFlZGI4OSAxMDA2NDQKLS0tIGEvZnMvZnVzZS9mdXNlX2kuaAorKysgYi9mcy9mdXNlL2Z1c2VfaS5oCkBAIC0yMzksNiArMjM5LDkgQEAKIAkvKiogTG9jayBwcm90ZWN0aW5nIGFjY2Vzc2VzcyB0byAgbWVtYmVycyBvZiB0aGlzIHN0cnVjdHVyZSAqLwogCXNwaW5sb2NrX3QgbG9jazsKIAorCS8qKiBNdXRleCBwcm90ZWN0aW5nIGFnYWluc3QgZGlyZWN0b3J5IGFsaWFzIGNyZWF0aW9uICovCisJc3RydWN0IG11dGV4IGluc3RfbXV0ZXg7CisKIAkvKiogUmVmY291bnQgKi8KIAlhdG9taWNfdCBjb3VudDsKIApkaWZmIC0tZ2l0IGEvZnMvZnVzZS9pbm9kZS5jIGIvZnMvZnVzZS9pbm9kZS5jCmluZGV4IDdkMGE5YWUuLmZjNDIwMzUgMTAwNjQ0Ci0tLSBhL2ZzL2Z1c2UvaW5vZGUuYworKysgYi9mcy9mdXNlL2lub2RlLmMKQEAgLTEwOSw2ICsxMDksNyBAQAogCiB2b2lkIGZ1c2VfY2hhbmdlX2F0dHJpYnV0ZXMoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZ1c2VfYXR0ciAqYXR0cikKIHsKKwlzdHJ1Y3QgZnVzZV9jb25uICpmYyA9IGdldF9mdXNlX2Nvbm4oaW5vZGUpOwogCWlmIChTX0lTUkVHKGlub2RlLT5pX21vZGUpICYmIGlfc2l6ZV9yZWFkKGlub2RlKSAhPSBhdHRyLT5zaXplKQogCQlpbnZhbGlkYXRlX2lub2RlX3BhZ2VzKGlub2RlLT5pX21hcHBpbmcpOwogCkBAIC0xMTcsNyArMTE4LDkgQEAKIAlpbm9kZS0+aV9ubGluayAgID0gYXR0ci0+bmxpbms7CiAJaW5vZGUtPmlfdWlkICAgICA9IGF0dHItPnVpZDsKIAlpbm9kZS0+aV9naWQgICAgID0gYXR0ci0+Z2lkOworCXNwaW5fbG9jaygmZmMtPmxvY2spOwogCWlfc2l6ZV93cml0ZShpbm9kZSwgYXR0ci0+c2l6ZSk7CisJc3Bpbl91bmxvY2soJmZjLT5sb2NrKTsKIAlpbm9kZS0+aV9ibG9ja3MgID0gYXR0ci0+YmxvY2tzOwogCWlub2RlLT5pX2F0aW1lLnR2X3NlYyAgID0gYXR0ci0+YXRpbWU7CiAJaW5vZGUtPmlfYXRpbWUudHZfbnNlYyAgPSBhdHRyLT5hdGltZW5zZWM7CkBAIC0xMzAsNyArMTMzLDcgQEAKIHN0YXRpYyB2b2lkIGZ1c2VfaW5pdF9pbm9kZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZnVzZV9hdHRyICphdHRyKQogewogCWlub2RlLT5pX21vZGUgPSBhdHRyLT5tb2RlICYgU19JRk1UOwotCWlfc2l6ZV93cml0ZShpbm9kZSwgYXR0ci0+c2l6ZSk7CisJaW5vZGUtPmlfc2l6ZSA9IGF0dHItPnNpemU7CiAJaWYgKFNfSVNSRUcoaW5vZGUtPmlfbW9kZSkpIHsKIAkJZnVzZV9pbml0X2NvbW1vbihpbm9kZSk7CiAJCWZ1c2VfaW5pdF9maWxlX2lub2RlKGlub2RlKTsKQEAgLTE2OSw3ICsxNzIsNiBAQAogCXN0cnVjdCBpbm9kZSAqaW5vZGU7CiAJc3RydWN0IGZ1c2VfaW5vZGUgKmZpOwogCXN0cnVjdCBmdXNlX2Nvbm4gKmZjID0gZ2V0X2Z1c2VfY29ubl9zdXBlcihzYik7Ci0JaW50IHJldHJpZWQgPSAwOwogCiAgcmV0cnk6CiAJaW5vZGUgPSBpZ2V0NV9sb2NrZWQoc2IsIG5vZGVpZCwgZnVzZV9pbm9kZV9lcSwgZnVzZV9pbm9kZV9zZXQsICZub2RlaWQpOwpAQCAtMTgzLDE2ICsxODUsMTYgQEAKIAkJZnVzZV9pbml0X2lub2RlKGlub2RlLCBhdHRyKTsKIAkJdW5sb2NrX25ld19pbm9kZShpbm9kZSk7CiAJfSBlbHNlIGlmICgoaW5vZGUtPmlfbW9kZSBeIGF0dHItPm1vZGUpICYgU19JRk1UKSB7Ci0JCUJVR19PTihyZXRyaWVkKTsKIAkJLyogSW5vZGUgaGFzIGNoYW5nZWQgdHlwZSwgYW55IEkvTyBvbiB0aGUgb2xkIHNob3VsZCBmYWlsICovCiAJCW1ha2VfYmFkX2lub2RlKGlub2RlKTsKIAkJaXB1dChpbm9kZSk7Ci0JCXJldHJpZWQgPSAxOwogCQlnb3RvIHJldHJ5OwogCX0KIAogCWZpID0gZ2V0X2Z1c2VfaW5vZGUoaW5vZGUpOworCXNwaW5fbG9jaygmZmMtPmxvY2spOwogCWZpLT5ubG9va3VwICsrOworCXNwaW5fdW5sb2NrKCZmYy0+bG9jayk7CiAJZnVzZV9jaGFuZ2VfYXR0cmlidXRlcyhpbm9kZSwgYXR0cik7CiAJcmV0dXJuIGlub2RlOwogfQpAQCAtMzc3LDYgKzM3OSw3IEBACiAJZmMgPSBremFsbG9jKHNpemVvZigqZmMpLCBHRlBfS0VSTkVMKTsKIAlpZiAoZmMpIHsKIAkJc3Bpbl9sb2NrX2luaXQoJmZjLT5sb2NrKTsKKwkJbXV0ZXhfaW5pdCgmZmMtPmluc3RfbXV0ZXgpOwogCQlhdG9taWNfc2V0KCZmYy0+Y291bnQsIDEpOwogCQlpbml0X3dhaXRxdWV1ZV9oZWFkKCZmYy0+d2FpdHEpOwogCQlpbml0X3dhaXRxdWV1ZV9oZWFkKCZmYy0+YmxvY2tlZF93YWl0cSk7CkBAIC0zOTYsOCArMzk5LDEwIEBACiAKIHZvaWQgZnVzZV9jb25uX3B1dChzdHJ1Y3QgZnVzZV9jb25uICpmYykKIHsKLQlpZiAoYXRvbWljX2RlY19hbmRfdGVzdCgmZmMtPmNvdW50KSkKKwlpZiAoYXRvbWljX2RlY19hbmRfdGVzdCgmZmMtPmNvdW50KSkgeworCQltdXRleF9kZXN0cm95KCZmYy0+aW5zdF9tdXRleCk7CiAJCWtmcmVlKGZjKTsKKwl9CiB9CiAKIHN0cnVjdCBmdXNlX2Nvbm4gKmZ1c2VfY29ubl9nZXQoc3RydWN0IGZ1c2VfY29ubiAqZmMpCmRpZmYgLS1naXQgYS9mcy9nZnMyL2JtYXAuYyBiL2ZzL2dmczIvYm1hcC5jCmluZGV4IGNjNTdmMmUuLjA2ZTlhOGMgMTAwNjQ0Ci0tLSBhL2ZzL2dmczIvYm1hcC5jCisrKyBiL2ZzL2dmczIvYm1hcC5jCkBAIC00MzQsOCArNDM0LDcgQEAKICAqLwogCiBzdGF0aWMgaW50IGdmczJfYmxvY2tfcG9pbnRlcnMoc3RydWN0IGlub2RlICppbm9kZSwgdTY0IGxibG9jaywgaW50IGNyZWF0ZSwKLQkJCSAgICAgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoX21hcCwgc3RydWN0IG1ldGFwYXRoICptcCwKLQkJCSAgICAgICB1bnNpZ25lZCBpbnQgbWF4bGVuKQorCQkJICAgICAgIHN0cnVjdCBidWZmZXJfaGVhZCAqYmhfbWFwLCBzdHJ1Y3QgbWV0YXBhdGggKm1wKQogewogCXN0cnVjdCBnZnMyX2lub2RlICppcCA9IEdGUzJfSShpbm9kZSk7CiAJc3RydWN0IGdmczJfc2JkICpzZHAgPSBHRlMyX1NCKGlub2RlKTsKQEAgLTQ0OCw2ICs0NDcsNyBAQAogCWludCBuZXcgPSAwOwogCXU2NCBkYmxvY2sgPSAwOwogCWludCBib3VuZGFyeTsKKwl1bnNpZ25lZCBpbnQgbWF4bGVuID0gYmhfbWFwLT5iX3NpemUgPj4gaW5vZGUtPmlfYmxrYml0czsKIAogCUJVR19PTihtYXhsZW4gPT0gMCk7CiAKQEAgLTU0MSwxMyArNTQxLDEzIEBACiB9CiAKIGludCBnZnMyX2Jsb2NrX21hcChzdHJ1Y3QgaW5vZGUgKmlub2RlLCB1NjQgbGJsb2NrLCBpbnQgY3JlYXRlLAotCQkgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoLCB1bnNpZ25lZCBpbnQgbWF4bGVuKQorCQkgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoKQogewogCXN0cnVjdCBtZXRhcGF0aCBtcDsKIAlpbnQgcmV0OwogCiAJYm1hcF9sb2NrKGlub2RlLCBjcmVhdGUpOwotCXJldCA9IGdmczJfYmxvY2tfcG9pbnRlcnMoaW5vZGUsIGxibG9jaywgY3JlYXRlLCBiaCwgJm1wLCBtYXhsZW4pOworCXJldCA9IGdmczJfYmxvY2tfcG9pbnRlcnMoaW5vZGUsIGxibG9jaywgY3JlYXRlLCBiaCwgJm1wKTsKIAlibWFwX3VubG9jayhpbm9kZSwgY3JlYXRlKTsKIAlyZXR1cm4gcmV0OwogfQpAQCAtNTU1LDcgKzU1NSw3IEBACiBpbnQgZ2ZzMl9leHRlbnRfbWFwKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHU2NCBsYmxvY2ssIGludCAqbmV3LCB1NjQgKmRibG9jaywgdW5zaWduZWQgKmV4dGxlbikKIHsKIAlzdHJ1Y3QgbWV0YXBhdGggbXA7Ci0Jc3RydWN0IGJ1ZmZlcl9oZWFkIGJoID0geyAuYl9zdGF0ZSA9IDAsIC5iX2Jsb2NrbnIgPSAwLCAuYl9zaXplID0gMCB9OworCXN0cnVjdCBidWZmZXJfaGVhZCBiaCA9IHsgLmJfc3RhdGUgPSAwLCAuYl9ibG9ja25yID0gMCB9OwogCWludCByZXQ7CiAJaW50IGNyZWF0ZSA9ICpuZXc7CiAKQEAgLTU2Myw4ICs1NjMsOSBAQAogCUJVR19PTighZGJsb2NrKTsKIAlCVUdfT04oIW5ldyk7CiAKKwliaC5iX3NpemUgPSAxIDw8IChpbm9kZS0+aV9ibGtiaXRzICsgNSk7CiAJYm1hcF9sb2NrKGlub2RlLCBjcmVhdGUpOwotCXJldCA9IGdmczJfYmxvY2tfcG9pbnRlcnMoaW5vZGUsIGxibG9jaywgY3JlYXRlLCAmYmgsICZtcCwgMzIpOworCXJldCA9IGdmczJfYmxvY2tfcG9pbnRlcnMoaW5vZGUsIGxibG9jaywgY3JlYXRlLCAmYmgsICZtcCk7CiAJYm1hcF91bmxvY2soaW5vZGUsIGNyZWF0ZSk7CiAJKmV4dGxlbiA9IGJoLmJfc2l6ZSA+PiBpbm9kZS0+aV9ibGtiaXRzOwogCSpkYmxvY2sgPSBiaC5iX2Jsb2NrbnI7CmRpZmYgLS1naXQgYS9mcy9nZnMyL2JtYXAuaCBiL2ZzL2dmczIvYm1hcC5oCmluZGV4IDBmZDM3OWIuLmFjMmZkMDQgMTAwNjQ0Ci0tLSBhL2ZzL2dmczIvYm1hcC5oCisrKyBiL2ZzL2dmczIvYm1hcC5oCkBAIC0xNSw3ICsxNSw3IEBACiBzdHJ1Y3QgcGFnZTsKIAogaW50IGdmczJfdW5zdHVmZl9kaW5vZGUoc3RydWN0IGdmczJfaW5vZGUgKmlwLCBzdHJ1Y3QgcGFnZSAqcGFnZSk7Ci1pbnQgZ2ZzMl9ibG9ja19tYXAoc3RydWN0IGlub2RlICppbm9kZSwgdTY0IGxibG9jaywgaW50IGNyZWF0ZSwgc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCwgdW5zaWduZWQgaW50IG1heGxlbik7CitpbnQgZ2ZzMl9ibG9ja19tYXAoc3RydWN0IGlub2RlICppbm9kZSwgdTY0IGxibG9jaywgaW50IGNyZWF0ZSwgc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCk7CiBpbnQgZ2ZzMl9leHRlbnRfbWFwKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHU2NCBsYmxvY2ssIGludCAqbmV3LCB1NjQgKmRibG9jaywgdW5zaWduZWQgKmV4dGxlbik7CiAKIGludCBnZnMyX3RydW5jYXRlaShzdHJ1Y3QgZ2ZzMl9pbm9kZSAqaXAsIHU2NCBzaXplKTsKZGlmZiAtLWdpdCBhL2ZzL2dmczIvZGlyLmMgYi9mcy9nZnMyL2Rpci5jCmluZGV4IDQ1OTQ5OGMuLmUyNGFmMjhiMSAxMDA2NDQKLS0tIGEvZnMvZ2ZzMi9kaXIuYworKysgYi9mcy9nZnMyL2Rpci5jCkBAIC0xODQsNyArMTg0LDcgQEAKIAl3aGlsZSAoY29waWVkIDwgc2l6ZSkgewogCQl1bnNpZ25lZCBpbnQgYW1vdW50OwogCQlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoOwotCQlpbnQgbmV3OworCQlpbnQgbmV3ID0gMDsKIAogCQlhbW91bnQgPSBzaXplIC0gY29waWVkOwogCQlpZiAoYW1vdW50ID4gc2RwLT5zZF9zYi5zYl9ic2l6ZSAtIG8pCkBAIC0yMTIsOCArMjEyLDYgQEAKIAkJZ2ZzMl90cmFuc19hZGRfYmgoaXAtPmlfZ2wsIGJoLCAxKTsKIAkJbWVtY3B5KGJoLT5iX2RhdGEgKyBvLCBidWYsIGFtb3VudCk7CiAJCWJyZWxzZShiaCk7Ci0JCWlmIChlcnJvcikKLQkJCWdvdG8gZmFpbDsKIAogCQlidWYgKz0gYW1vdW50OwogCQljb3BpZWQgKz0gYW1vdW50OwpAQCAtMzE3LDggKzMxNSw3IEBACiAJCQlpZiAoIXJhKQogCQkJCWV4dGxlbiA9IDE7CiAJCQliaCA9IGdmczJfbWV0YV9yYShpcC0+aV9nbCwgZGJsb2NrLCBleHRsZW4pOwotCQl9Ci0JCWlmICghYmgpIHsKKwkJfSBlbHNlIHsKIAkJCWVycm9yID0gZ2ZzMl9tZXRhX3JlYWQoaXAtPmlfZ2wsIGRibG9jaywgRElPX1dBSVQsICZiaCk7CiAJCQlpZiAoZXJyb3IpCiAJCQkJZ290byBmYWlsOwpAQCAtMzMyLDcgKzMyOSw2IEBACiAJCWV4dGxlbi0tOwogCQltZW1jcHkoYnVmLCBiaC0+Yl9kYXRhICsgbywgYW1vdW50KTsKIAkJYnJlbHNlKGJoKTsKLQkJYmggPSBOVUxMOwogCQlidWYgKz0gYW1vdW50OwogCQljb3BpZWQgKz0gYW1vdW50OwogCQlsYmxvY2srKzsKQEAgLTgxNSw3ICs4MTEsNyBAQAogCWxlYWYgPSAoc3RydWN0IGdmczJfbGVhZiAqKWJoLT5iX2RhdGE7CiAJbGVhZi0+bGZfZGVwdGggPSBjcHVfdG9fYmUxNihkZXB0aCk7CiAJbGVhZi0+bGZfZW50cmllcyA9IDA7Ci0JbGVhZi0+bGZfZGlyZW50X2Zvcm1hdCA9IGNwdV90b19iZTE2KEdGUzJfRk9STUFUX0RFKTsKKwlsZWFmLT5sZl9kaXJlbnRfZm9ybWF0ID0gY3B1X3RvX2JlMzIoR0ZTMl9GT1JNQVRfREUpOwogCWxlYWYtPmxmX25leHQgPSAwOwogCW1lbXNldChsZWFmLT5sZl9yZXNlcnZlZCwgMCwgc2l6ZW9mKGxlYWYtPmxmX3Jlc2VydmVkKSk7CiAJZGVudCA9IChzdHJ1Y3QgZ2ZzMl9kaXJlbnQgKikobGVhZisxKTsKZGlmZiAtLWdpdCBhL2ZzL2dmczIvaW5vZGUuYyBiL2ZzL2dmczIvaW5vZGUuYwppbmRleCA1N2M0M2FjLi5kNDcwZTUyIDEwMDY0NAotLS0gYS9mcy9nZnMyL2lub2RlLmMKKysrIGIvZnMvZ2ZzMi9pbm9kZS5jCkBAIC0xNTcsNiArMTU3LDkgQEAKIAlzdHJ1Y3QgZ2ZzMl9nbG9jayAqaW9fZ2w7CiAJaW50IGVycm9yOwogCisJaWYgKCFpbm9kZSkKKwkJcmV0dXJuIEVSUl9QVFIoLUVOT0JVRlMpOworCiAJaWYgKGlub2RlLT5pX3N0YXRlICYgSV9ORVcpIHsKIAkJc3RydWN0IGdmczJfc2JkICpzZHAgPSBHRlMyX1NCKGlub2RlKTsKIAkJdW1vZGVfdCBtb2RlID0gRFQySUYodHlwZSk7CmRpZmYgLS1naXQgYS9mcy9nZnMyL2xvY2tpbmcvZGxtL21vdW50LmMgYi9mcy9nZnMyL2xvY2tpbmcvZGxtL21vdW50LmMKaW5kZXggMWY5NGRkMy4uY2RkMTY5NCAxMDA2NDQKLS0tIGEvZnMvZ2ZzMi9sb2NraW5nL2RsbS9tb3VudC5jCisrKyBiL2ZzL2dmczIvbG9ja2luZy9kbG0vbW91bnQuYwpAQCAtNDUsNyArNDUsNyBAQAogCXN0cm5jcHkoYnVmLCB0YWJsZV9uYW1lLCAyNTYpOwogCWJ1ZlsyNTVdID0gJ1wwJzsKIAotCXAgPSBzdHJzdHIoYnVmLCAiOiIpOworCXAgPSBzdHJjaHIoYnVmLCAnOicpOwogCWlmICghcCkgewogCQlsb2dfaW5mbygiaW52YWxpZCB0YWJsZV9uYW1lIFwiJXNcIiIsIHRhYmxlX25hbWUpOwogCQlrZnJlZShscyk7CmRpZmYgLS1naXQgYS9mcy9nZnMyL2xvZy5jIGIvZnMvZ2ZzMi9sb2cuYwppbmRleCA1NTRmZTViLi4wY2FjZTNkIDEwMDY0NAotLS0gYS9mcy9nZnMyL2xvZy5jCisrKyBiL2ZzL2dmczIvbG9nLmMKQEAgLTMxMiwxMCArMzEyLDEyIEBACiAKIHN0YXRpYyB1NjQgbG9nX2JtYXAoc3RydWN0IGdmczJfc2JkICpzZHAsIHVuc2lnbmVkIGludCBsYm4pCiB7CisJc3RydWN0IGlub2RlICppbm9kZSA9IHNkcC0+c2RfamRlc2MtPmpkX2lub2RlOwogCWludCBlcnJvcjsKLQlzdHJ1Y3QgYnVmZmVyX2hlYWQgYmhfbWFwOworCXN0cnVjdCBidWZmZXJfaGVhZCBiaF9tYXAgPSB7IC5iX3N0YXRlID0gMCwgLmJfYmxvY2tuciA9IDAgfTsKIAotCWVycm9yID0gZ2ZzMl9ibG9ja19tYXAoc2RwLT5zZF9qZGVzYy0+amRfaW5vZGUsIGxibiwgMCwgJmJoX21hcCwgMSk7CisJYmhfbWFwLmJfc2l6ZSA9IDEgPDwgaW5vZGUtPmlfYmxrYml0czsKKwllcnJvciA9IGdmczJfYmxvY2tfbWFwKGlub2RlLCBsYm4sIDAsICZiaF9tYXApOwogCWlmIChlcnJvciB8fCAhYmhfbWFwLmJfYmxvY2tucikKIAkJcHJpbnRrKEtFUk5fSU5GTyAiZXJyb3I9JWQsIGRibj0lbGx1IGxibj0ldSIsIGVycm9yLCBiaF9tYXAuYl9ibG9ja25yLCBsYm4pOwogCWdmczJfYXNzZXJ0X3dpdGhkcmF3KHNkcCwgIWVycm9yICYmIGJoX21hcC5iX2Jsb2NrbnIpOwpAQCAtNTY5LDE2ICs1NzEsMTUgQEAKIAllbHNlIGlmIChzZHAtPnNkX2xvZ190YWlsICE9IGN1cnJlbnRfdGFpbChzZHApICYmICFzZHAtPnNkX2xvZ19pZGxlKQogCQlsb2dfd3JpdGVfaGVhZGVyKHNkcCwgMCwgUFVMTCk7CiAJbG9wc19hZnRlcl9jb21taXQoc2RwLCBhaSk7CisKKwlnZnMyX2xvZ19sb2NrKHNkcCk7CiAJc2RwLT5zZF9sb2dfaGVhZCA9IHNkcC0+c2RfbG9nX2ZsdXNoX2hlYWQ7Ci0KIAlzZHAtPnNkX2xvZ19ibGtzX2ZyZWUgLT0gc2RwLT5zZF9sb2dfbnVtX2hkcnM7Ci0KIAlzZHAtPnNkX2xvZ19ibGtzX3Jlc2VydmVkID0gMDsKIAlzZHAtPnNkX2xvZ19jb21taXRlZF9idWYgPSAwOwogCXNkcC0+c2RfbG9nX251bV9oZHJzID0gMDsKIAlzZHAtPnNkX2xvZ19jb21taXRlZF9yZXZva2UgPSAwOwogCi0JZ2ZzMl9sb2dfbG9jayhzZHApOwogCWlmICghbGlzdF9lbXB0eSgmYWktPmFpX2FpbDFfbGlzdCkpIHsKIAkJbGlzdF9hZGQoJmFpLT5haV9saXN0LCAmc2RwLT5zZF9haWwxX2xpc3QpOwogCQlhaSA9IE5VTEw7CmRpZmYgLS1naXQgYS9mcy9nZnMyL2xvcHMuYyBiL2ZzL2dmczIvbG9wcy5jCmluZGV4IDg4MWUzMzcuLmFiNmQxMTEgMTAwNjQ0Ci0tLSBhL2ZzL2dmczIvbG9wcy5jCisrKyBiL2ZzL2dmczIvbG9wcy5jCkBAIC00OTIsNyArNDkyLDcgQEAKIAlwdHIgPSBrYWRkciArIGJoX29mZnNldChiaCk7CiAJaWYgKCpwdHIgPT0gY3B1X3RvX2JlMzIoR0ZTMl9NQUdJQykpCiAJCXJ2ID0gMTsKLQlrdW5tYXBfYXRvbWljKHBhZ2UsIEtNX1VTRVIwKTsKKwlrdW5tYXBfYXRvbWljKGthZGRyLCBLTV9VU0VSMCk7CiAKIAlyZXR1cm4gcnY7CiB9CkBAIC02MjYsNyArNjI2LDcgQEAKIAkJCQltZW1jcHkoYmgtPmJfZGF0YSwKIAkJCQkgICAgICAga2FkZHIgKyBiaF9vZmZzZXQoYmQyLT5iZF9iaCksCiAJCQkJICAgICAgIHNkcC0+c2Rfc2Iuc2JfYnNpemUpOwotCQkJCWt1bm1hcF9hdG9taWMocGFnZSwgS01fVVNFUjApOworCQkJCWt1bm1hcF9hdG9taWMoa2FkZHIsIEtNX1VTRVIwKTsKIAkJCQkqKF9fYmUzMiAqKWJoLT5iX2RhdGEgPSAwOwogCQkJfSBlbHNlIHsKIAkJCQliaCA9IGdmczJfbG9nX2Zha2VfYnVmKHNkcCwgYmQyLT5iZF9iaCk7CmRpZmYgLS1naXQgYS9mcy9nZnMyL21haW4uYyBiL2ZzL2dmczIvbWFpbi5jCmluZGV4IDIxNTA4YTEuLjk4ODljMWUgMTAwNjQ0Ci0tLSBhL2ZzL2dmczIvbWFpbi5jCisrKyBiL2ZzL2dmczIvbWFpbi5jCkBAIC04NCw4ICs4NCw4IEBACiAKIAlnZnMyX2lub2RlX2NhY2hlcCA9IGttZW1fY2FjaGVfY3JlYXRlKCJnZnMyX2lub2RlIiwKIAkJCQkJICAgICAgc2l6ZW9mKHN0cnVjdCBnZnMyX2lub2RlKSwKLQkJCQkJICAgICAgMCwgKFNMQUJfUkVDTEFJTV9BQ0NPVU5UfAotCQkJCQkgICAgICBTTEFCX1BBTklDfFNMQUJfTUVNX1NQUkVBRCksCisJCQkJCSAgICAgIDAsICBTTEFCX1JFQ0xBSU1fQUNDT1VOVHwKKwkJCQkJICAgICAgICAgIFNMQUJfTUVNX1NQUkVBRCwKIAkJCQkJICAgICAgZ2ZzMl9pbml0X2lub2RlX29uY2UsIE5VTEwpOwogCWlmICghZ2ZzMl9pbm9kZV9jYWNoZXApCiAJCWdvdG8gZmFpbDsKZGlmZiAtLWdpdCBhL2ZzL2dmczIvb3BzX2FkZHJlc3MuYyBiL2ZzL2dmczIvb3BzX2FkZHJlc3MuYwppbmRleCA0ZmI3NDNmLi4wMTU2NDBiIDEwMDY0NAotLS0gYS9mcy9nZnMyL29wc19hZGRyZXNzLmMKKysrIGIvZnMvZ2ZzMi9vcHNfYWRkcmVzcy5jCkBAIC02NSw3ICs2NSw3IEBACiBpbnQgZ2ZzMl9nZXRfYmxvY2soc3RydWN0IGlub2RlICppbm9kZSwgc2VjdG9yX3QgbGJsb2NrLAogCSAgICAgICAgICAgc3RydWN0IGJ1ZmZlcl9oZWFkICpiaF9yZXN1bHQsIGludCBjcmVhdGUpCiB7Ci0JcmV0dXJuIGdmczJfYmxvY2tfbWFwKGlub2RlLCBsYmxvY2ssIGNyZWF0ZSwgYmhfcmVzdWx0LCAzMik7CisJcmV0dXJuIGdmczJfYmxvY2tfbWFwKGlub2RlLCBsYmxvY2ssIGNyZWF0ZSwgYmhfcmVzdWx0KTsKIH0KIAogLyoqCkBAIC04Myw3ICs4Myw3IEBACiB7CiAJaW50IGVycm9yOwogCi0JZXJyb3IgPSBnZnMyX2Jsb2NrX21hcChpbm9kZSwgbGJsb2NrLCAwLCBiaF9yZXN1bHQsIDEpOworCWVycm9yID0gZ2ZzMl9ibG9ja19tYXAoaW5vZGUsIGxibG9jaywgMCwgYmhfcmVzdWx0KTsKIAlpZiAoZXJyb3IpCiAJCXJldHVybiBlcnJvcjsKIAlpZiAoYmhfcmVzdWx0LT5iX2Jsb2NrbnIgPT0gMCkKQEAgLTk0LDcgKzk0LDcgQEAKIHN0YXRpYyBpbnQgZ2ZzMl9nZXRfYmxvY2tfZGlyZWN0KHN0cnVjdCBpbm9kZSAqaW5vZGUsIHNlY3Rvcl90IGxibG9jaywKIAkJCQkgc3RydWN0IGJ1ZmZlcl9oZWFkICpiaF9yZXN1bHQsIGludCBjcmVhdGUpCiB7Ci0JcmV0dXJuIGdmczJfYmxvY2tfbWFwKGlub2RlLCBsYmxvY2ssIDAsIGJoX3Jlc3VsdCwgMzIpOworCXJldHVybiBnZnMyX2Jsb2NrX21hcChpbm9kZSwgbGJsb2NrLCAwLCBiaF9yZXN1bHQpOwogfQogCiAvKioKQEAgLTE2Miw3ICsxNjIsNyBAQAogCiAJa2FkZHIgPSBrbWFwX2F0b21pYyhwYWdlLCBLTV9VU0VSMCk7CiAJbWVtc2V0KGthZGRyLCAwLCBQQUdFX0NBQ0hFX1NJWkUpOwotCWt1bm1hcF9hdG9taWMocGFnZSwgS01fVVNFUjApOworCWt1bm1hcF9hdG9taWMoa2FkZHIsIEtNX1VTRVIwKTsKIAogCVNldFBhZ2VVcHRvZGF0ZShwYWdlKTsKIApAQCAtMTk1LDcgKzE5NSw3IEBACiAJbWVtY3B5KGthZGRyLCBkaWJoLT5iX2RhdGEgKyBzaXplb2Yoc3RydWN0IGdmczJfZGlub2RlKSwKIAkgICAgICAgaXAtPmlfZGkuZGlfc2l6ZSk7CiAJbWVtc2V0KGthZGRyICsgaXAtPmlfZGkuZGlfc2l6ZSwgMCwgUEFHRV9DQUNIRV9TSVpFIC0gaXAtPmlfZGkuZGlfc2l6ZSk7Ci0Ja3VubWFwX2F0b21pYyhwYWdlLCBLTV9VU0VSMCk7CisJa3VubWFwX2F0b21pYyhrYWRkciwgS01fVVNFUjApOwogCiAJYnJlbHNlKGRpYmgpOwogCkBAIC0zMzcsMTMgKzMzNyw2IEBACiBvdXRfbm9lcnJvcjoKIAlyZXQgPSAwOwogb3V0X3VubG9jazoKLQkvKiB1bmxvY2sgYWxsIHBhZ2VzLCB3ZSBjYW4ndCBkbyBhbnkgSS9PIHJpZ2h0IG5vdyAqLwotCWZvciAocGFnZV9pZHggPSAwOyBwYWdlX2lkeCA8IG5yX3BhZ2VzOyBwYWdlX2lkeCsrKSB7Ci0JCXN0cnVjdCBwYWdlICpwYWdlID0gbGlzdF9lbnRyeShwYWdlcy0+cHJldiwgc3RydWN0IHBhZ2UsIGxydSk7Ci0JCWxpc3RfZGVsKCZwYWdlLT5scnUpOwotCQl1bmxvY2tfcGFnZShwYWdlKTsKLQkJcGFnZV9jYWNoZV9yZWxlYXNlKHBhZ2UpOwotCX0KIAlpZiAoZG9fdW5sb2NrKQogCQlnZnMyX2hvbGRlcl91bmluaXQoJmdoKTsKIAlnb3RvIG91dDsKQEAgLTM3MCwxOSArMzYzLDIyIEBACiAJbG9mZl90IHBvcyA9ICgobG9mZl90KXBhZ2UtPmluZGV4IDw8IFBBR0VfQ0FDSEVfU0hJRlQpICsgZnJvbTsKIAlsb2ZmX3QgZW5kID0gKChsb2ZmX3QpcGFnZS0+aW5kZXggPDwgUEFHRV9DQUNIRV9TSElGVCkgKyB0bzsKIAlzdHJ1Y3QgZ2ZzMl9hbGxvYyAqYWw7CisJdW5zaWduZWQgaW50IHdyaXRlX2xlbiA9IHRvIC0gZnJvbTsKKwogCiAJZ2ZzMl9ob2xkZXJfaW5pdChpcC0+aV9nbCwgTE1fU1RfRVhDTFVTSVZFLCBHTF9BVElNRXxHTF9BT1AsICZpcC0+aV9naCk7CiAJZXJyb3IgPSBnZnMyX2dsb2NrX25xX21fYXRpbWUoMSwgJmlwLT5pX2doKTsKIAlpZiAoZXJyb3IpCiAJCWdvdG8gb3V0X3VuaW5pdDsKIAotCWdmczJfd3JpdGVfY2FsY19yZXNlcnYoaXAsIHRvIC0gZnJvbSwgJmRhdGFfYmxvY2tzLCAmaW5kX2Jsb2Nrcyk7CisJZ2ZzMl93cml0ZV9jYWxjX3Jlc2VydihpcCwgd3JpdGVfbGVuLCAmZGF0YV9ibG9ja3MsICZpbmRfYmxvY2tzKTsKIAotCWVycm9yID0gZ2ZzMl93cml0ZV9hbGxvY19yZXF1aXJlZChpcCwgcG9zLCBmcm9tIC0gdG8sICZhbGxvY19yZXF1aXJlZCk7CisJZXJyb3IgPSBnZnMyX3dyaXRlX2FsbG9jX3JlcXVpcmVkKGlwLCBwb3MsIHdyaXRlX2xlbiwgJmFsbG9jX3JlcXVpcmVkKTsKIAlpZiAoZXJyb3IpCiAJCWdvdG8gb3V0X3VubG9jazsKIAogCisJaXAtPmlfYWxsb2MuYWxfcmVxdWVzdGVkID0gMDsKIAlpZiAoYWxsb2NfcmVxdWlyZWQpIHsKIAkJYWwgPSBnZnMyX2FsbG9jX2dldChpcCk7CiAKQEAgLTQ4Miw3ICs0NzgsNyBAQAogCQlrYWRkciA9IGttYXBfYXRvbWljKHBhZ2UsIEtNX1VTRVIwKTsKIAkJbWVtY3B5KGRpYmgtPmJfZGF0YSArIHNpemVvZihzdHJ1Y3QgZ2ZzMl9kaW5vZGUpICsgZnJvbSwKIAkJICAgICAgIGthZGRyICsgZnJvbSwgdG8gLSBmcm9tKTsKLQkJa3VubWFwX2F0b21pYyhwYWdlLCBLTV9VU0VSMCk7CisJCWt1bm1hcF9hdG9taWMoa2FkZHIsIEtNX1VTRVIwKTsKIAogCQlTZXRQYWdlVXB0b2RhdGUocGFnZSk7CiAKZGlmZiAtLWdpdCBhL2ZzL2dmczIvb3BzX2ZzdHlwZS5jIGIvZnMvZ2ZzMi9vcHNfZnN0eXBlLmMKaW5kZXggMTc4YjMzOS4uODgyODczYSAxMDA2NDQKLS0tIGEvZnMvZ2ZzMi9vcHNfZnN0eXBlLmMKKysrIGIvZnMvZ2ZzMi9vcHNfZnN0eXBlLmMKQEAgLTc5NCw4ICs3OTQsOCBAQAogCQlmc19lcnIoc2RwLCAiY2FuJ3QgZ2V0IHJvb3QgZGVudHJ5XG4iKTsKIAkJZXJyb3IgPSAtRU5PTUVNOwogCQlpcHV0KGlub2RlKTsKLQl9Ci0JbmV3LT5zX3Jvb3QtPmRfb3AgPSAmZ2ZzMl9kb3BzOworCX0gZWxzZQorCQluZXctPnNfcm9vdC0+ZF9vcCA9ICZnZnMyX2RvcHM7CiAKIAlyZXR1cm4gZXJyb3I7CiB9CkBAIC04NTQsNyArODU0LDYgQEAKIAlpbnQgZXJyb3IgPSAwOwogCXN0cnVjdCBzdXBlcl9ibG9jayAqc2IgPSBOVUxMLCAqbmV3OwogCXN0cnVjdCBnZnMyX3NiZCAqc2RwOwotCWNoYXIgKmdmczJtbnQgPSBOVUxMOwogCiAJc2IgPSBnZXRfZ2ZzMl9zYihkZXZfbmFtZSk7CiAJaWYgKCFzYikgewpAQCAtODkyLDggKzg5MSw2IEBACiAJYXRvbWljX2luYygmc2RwLT5zZF9nZnMybW50LT5tbnRfY291bnQpOwogCXJldHVybiBzaW1wbGVfc2V0X21udChtbnQsIG5ldyk7CiBlcnJvcjoKLQlpZiAoZ2ZzMm1udCkKLQkJa2ZyZWUoZ2ZzMm1udCk7CiAJcmV0dXJuIGVycm9yOwogfQogCmRpZmYgLS1naXQgYS9mcy9nZnMyL29wc19zdXBlci5jIGIvZnMvZ2ZzMi9vcHNfc3VwZXIuYwppbmRleCAwNmYwNmY3Li5iNDdkOTU5IDEwMDY0NAotLS0gYS9mcy9nZnMyL29wc19zdXBlci5jCisrKyBiL2ZzL2dmczIvb3BzX3N1cGVyLmMKQEAgLTEzOCwxNiArMTM4LDI3IEBACiB9CiAKIC8qKgotICogZ2ZzMl93cml0ZV9zdXBlciAtIGRpc2sgY29tbWl0IGFsbCBpbmNvcmUgdHJhbnNhY3Rpb25zCi0gKiBAc2I6IHRoZSBmaWxlc3lzdGVtCisgKiBnZnMyX3dyaXRlX3N1cGVyCisgKiBAc2I6IHRoZSBzdXBlcmJsb2NrCiAgKgotICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgZXZlcnkgdGltZSBzeW5jKDIpIGlzIGNhbGxlZC4KLSAqIEFmdGVyIHRoaXMgZXhpdHMsIGFsbCBkaXJ0eSBidWZmZXJzIGFyZSBzeW5jZWQuCiAgKi8KIAogc3RhdGljIHZvaWQgZ2ZzMl93cml0ZV9zdXBlcihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKQogeworCXNiLT5zX2RpcnQgPSAwOworfQorCisvKioKKyAqIGdmczJfc3luY19mcyAtIHN5bmMgdGhlIGZpbGVzeXN0ZW0KKyAqIEBzYjogdGhlIHN1cGVyYmxvY2sKKyAqCisgKiBGbHVzaGVzIHRoZSBsb2cgdG8gZGlzay4KKyAqLworc3RhdGljIGludCBnZnMyX3N5bmNfZnMoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgaW50IHdhaXQpCit7CisJc2ItPnNfZGlydCA9IDA7CiAJZ2ZzMl9sb2dfZmx1c2goc2ItPnNfZnNfaW5mbywgTlVMTCk7CisJcmV0dXJuIDA7CiB9CiAKIC8qKgpAQCAtNDUyLDE3ICs0NjMsMTggQEAKIH0KIAogc3RydWN0IHN1cGVyX29wZXJhdGlvbnMgZ2ZzMl9zdXBlcl9vcHMgPSB7Ci0JLmFsbG9jX2lub2RlID0gZ2ZzMl9hbGxvY19pbm9kZSwKLQkuZGVzdHJveV9pbm9kZSA9IGdmczJfZGVzdHJveV9pbm9kZSwKLQkud3JpdGVfaW5vZGUgPSBnZnMyX3dyaXRlX2lub2RlLAotCS5kZWxldGVfaW5vZGUgPSBnZnMyX2RlbGV0ZV9pbm9kZSwKLQkucHV0X3N1cGVyID0gZ2ZzMl9wdXRfc3VwZXIsCi0JLndyaXRlX3N1cGVyID0gZ2ZzMl93cml0ZV9zdXBlciwKLQkud3JpdGVfc3VwZXJfbG9ja2ZzID0gZ2ZzMl93cml0ZV9zdXBlcl9sb2NrZnMsCi0JLnVubG9ja2ZzID0gZ2ZzMl91bmxvY2tmcywKLQkuc3RhdGZzID0gZ2ZzMl9zdGF0ZnMsCi0JLnJlbW91bnRfZnMgPSBnZnMyX3JlbW91bnRfZnMsCi0JLmNsZWFyX2lub2RlID0gZ2ZzMl9jbGVhcl9pbm9kZSwKLQkuc2hvd19vcHRpb25zID0gZ2ZzMl9zaG93X29wdGlvbnMsCisJLmFsbG9jX2lub2RlCQk9IGdmczJfYWxsb2NfaW5vZGUsCisJLmRlc3Ryb3lfaW5vZGUJCT0gZ2ZzMl9kZXN0cm95X2lub2RlLAorCS53cml0ZV9pbm9kZQkJPSBnZnMyX3dyaXRlX2lub2RlLAorCS5kZWxldGVfaW5vZGUJCT0gZ2ZzMl9kZWxldGVfaW5vZGUsCisJLnB1dF9zdXBlcgkJPSBnZnMyX3B1dF9zdXBlciwKKwkud3JpdGVfc3VwZXIJCT0gZ2ZzMl93cml0ZV9zdXBlciwKKwkuc3luY19mcwkJPSBnZnMyX3N5bmNfZnMsCisJLndyaXRlX3N1cGVyX2xvY2tmcyAJPSBnZnMyX3dyaXRlX3N1cGVyX2xvY2tmcywKKwkudW5sb2NrZnMJCT0gZ2ZzMl91bmxvY2tmcywKKwkuc3RhdGZzCQkJPSBnZnMyX3N0YXRmcywKKwkucmVtb3VudF9mcwkJPSBnZnMyX3JlbW91bnRfZnMsCisJLmNsZWFyX2lub2RlCQk9IGdmczJfY2xlYXJfaW5vZGUsCisJLnNob3dfb3B0aW9ucwkJPSBnZnMyX3Nob3dfb3B0aW9ucywKIH07CiAKZGlmZiAtLWdpdCBhL2ZzL2dmczIvcXVvdGEuYyBiL2ZzL2dmczIvcXVvdGEuYwppbmRleCBjNjliOTRhLi5hM2RlYWU3IDEwMDY0NAotLS0gYS9mcy9nZnMyL3F1b3RhLmMKKysrIGIvZnMvZ2ZzMi9xdW90YS5jCkBAIC0yNTEsNyArMjUxLDcgQEAKIAl1bnNpZ25lZCBpbnQgYmxvY2ssIG9mZnNldDsKIAlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoOwogCWludCBlcnJvcjsKLQlzdHJ1Y3QgYnVmZmVyX2hlYWQgYmhfbWFwOworCXN0cnVjdCBidWZmZXJfaGVhZCBiaF9tYXAgPSB7IC5iX3N0YXRlID0gMCwgLmJfYmxvY2tuciA9IDAgfTsKIAogCW11dGV4X2xvY2soJnNkcC0+c2RfcXVvdGFfbXV0ZXgpOwogCkBAIC0yNjMsNyArMjYzLDggQEAKIAlibG9jayA9IHFkLT5xZF9zbG90IC8gc2RwLT5zZF9xY19wZXJfYmxvY2s7CiAJb2Zmc2V0ID0gcWQtPnFkX3Nsb3QgJSBzZHAtPnNkX3FjX3Blcl9ibG9jazs7CiAKLQllcnJvciA9IGdmczJfYmxvY2tfbWFwKCZpcC0+aV9pbm9kZSwgYmxvY2ssIDAsICZiaF9tYXAsIDEpOworCWJoX21hcC5iX3NpemUgPSAxIDw8IGlwLT5pX2lub2RlLmlfYmxrYml0czsKKwllcnJvciA9IGdmczJfYmxvY2tfbWFwKCZpcC0+aV9pbm9kZSwgYmxvY2ssIDAsICZiaF9tYXApOwogCWlmIChlcnJvcikKIAkJZ290byBmYWlsOwogCWVycm9yID0gZ2ZzMl9tZXRhX3JlYWQoaXAtPmlfZ2wsIGJoX21hcC5iX2Jsb2NrbnIsIERJT19XQUlULCAmYmgpOwpkaWZmIC0tZ2l0IGEvZnMvZ2ZzMi9yZWNvdmVyeS5jIGIvZnMvZ2ZzMi9yZWNvdmVyeS5jCmluZGV4IDBhOGE0YjguLjYyY2QyMjMgMTAwNjQ0Ci0tLSBhL2ZzL2dmczIvcmVjb3ZlcnkuYworKysgYi9mcy9nZnMyL3JlY292ZXJ5LmMKQEAgLTM3MiwxMSArMzcyLDEyIEBACiAJdTMyIGhhc2g7CiAJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaDsKIAlpbnQgZXJyb3I7Ci0Jc3RydWN0IGJ1ZmZlcl9oZWFkIGJoX21hcDsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgYmhfbWFwID0geyAuYl9zdGF0ZSA9IDAsIC5iX2Jsb2NrbnIgPSAwIH07CiAKIAlsYmxvY2sgPSBoZWFkLT5saF9ibGtubzsKIAlnZnMyX3JlcGxheV9pbmNyX2JsayhzZHAsICZsYmxvY2spOwotCWVycm9yID0gZ2ZzMl9ibG9ja19tYXAoJmlwLT5pX2lub2RlLCBsYmxvY2ssIDAsICZiaF9tYXAsIDEpOworCWJoX21hcC5iX3NpemUgPSAxIDw8IGlwLT5pX2lub2RlLmlfYmxrYml0czsKKwllcnJvciA9IGdmczJfYmxvY2tfbWFwKCZpcC0+aV9pbm9kZSwgbGJsb2NrLCAwLCAmYmhfbWFwKTsKIAlpZiAoZXJyb3IpCiAJCXJldHVybiBlcnJvcjsKIAlpZiAoIWJoX21hcC5iX2Jsb2NrbnIpIHsKZGlmZiAtLWdpdCBhL2ZzL2dmczIvcmdycC5oIGIvZnMvZ2ZzMi9yZ3JwLmgKaW5kZXggOWVlZGZkMS4uYjAxZTBjZiAxMDA2NDQKLS0tIGEvZnMvZ2ZzMi9yZ3JwLmgKKysrIGIvZnMvZ2ZzMi9yZ3JwLmgKQEAgLTMyLDcgKzMyLDcgQEAKIHN0cnVjdCBnZnMyX2FsbG9jICpnZnMyX2FsbG9jX2dldChzdHJ1Y3QgZ2ZzMl9pbm9kZSAqaXApOwogc3RhdGljIGlubGluZSB2b2lkIGdmczJfYWxsb2NfcHV0KHN0cnVjdCBnZnMyX2lub2RlICppcCkKIHsKLQlyZXR1cm47IC8qIFNlIHdlIGNhbiBzZWUgd2hlcmUgaXAtPmlfYWxsb2MgaXMgdXNlZCAqLworCXJldHVybjsgLyogU28gd2UgY2FuIHNlZSB3aGVyZSBpcC0+aV9hbGxvYyBpcyB1c2VkICovCiB9CiAKIGludCBnZnMyX2lucGxhY2VfcmVzZXJ2ZV9pKHN0cnVjdCBnZnMyX2lub2RlICppcCwKZGlmZiAtLWdpdCBhL2ZzL2hmcy9zdXBlci5jIGIvZnMvaGZzL3N1cGVyLmMKaW5kZXggZDQzYjRmYy4uODViMTdiMyAxMDA2NDQKLS0tIGEvZnMvaGZzL3N1cGVyLmMKKysrIGIvZnMvaGZzL3N1cGVyLmMKQEAgLTM5MCwxMSArMzkwLDEzIEBACiAJCWhmc19maW5kX2V4aXQoJmZkKTsKIAkJZ290byBiYWlsX25vX3Jvb3Q7CiAJfQorCXJlcyA9IC1FSU5WQUw7CiAJcm9vdF9pbm9kZSA9IGhmc19pZ2V0KHNiLCAmZmQuc2VhcmNoX2tleS0+Y2F0LCAmcmVjKTsKIAloZnNfZmluZF9leGl0KCZmZCk7CiAJaWYgKCFyb290X2lub2RlKQogCQlnb3RvIGJhaWxfbm9fcm9vdDsKIAorCXJlcyA9IC1FTk9NRU07CiAJc2ItPnNfcm9vdCA9IGRfYWxsb2Nfcm9vdChyb290X2lub2RlKTsKIAlpZiAoIXNiLT5zX3Jvb3QpCiAJCWdvdG8gYmFpbF9pcHV0OwpkaWZmIC0tZ2l0IGEvZnMvaHVnZXRsYmZzL2lub2RlLmMgYi9mcy9odWdldGxiZnMvaW5vZGUuYwppbmRleCA1ZTAzYjJmLi43ZjQ3NTY5IDEwMDY0NAotLS0gYS9mcy9odWdldGxiZnMvaW5vZGUuYworKysgYi9mcy9odWdldGxiZnMvaW5vZGUuYwpAQCAtNjIsMjQgKzYyLDE5IEBACiAJbG9mZl90IGxlbiwgdm1hX2xlbjsKIAlpbnQgcmV0OwogCi0JaWYgKHZtYS0+dm1fcGdvZmYgJiAoSFBBR0VfU0laRSAvIFBBR0VfU0laRSAtIDEpKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCWlmICh2bWEtPnZtX3N0YXJ0ICYgfkhQQUdFX01BU0spCi0JCXJldHVybiAtRUlOVkFMOwotCi0JaWYgKHZtYS0+dm1fZW5kICYgfkhQQUdFX01BU0spCi0JCXJldHVybiAtRUlOVkFMOwotCi0JaWYgKHZtYS0+dm1fZW5kIC0gdm1hLT52bV9zdGFydCA8IEhQQUdFX1NJWkUpCi0JCXJldHVybiAtRUlOVkFMOworCS8qCisJICogdm1hIGFsaWdubWVudCBoYXMgYWxyZWFkeSBiZWVuIGNoZWNrZWQgYnkgcHJlcGFyZV9odWdlcGFnZV9yYW5nZS4KKwkgKiBJZiB5b3UgYWRkIGFueSBlcnJvciByZXR1cm5zIGhlcmUsIGRvIHNvIGFmdGVyIHNldHRpbmcgVk1fSFVHRVRMQiwKKwkgKiBzbyBpc192bV9odWdldGxiX3BhZ2UgdGVzdHMgYmVsb3cgdW5tYXBfcmVnaW9uIGdvIHRoZSByaWdodCB3YXkKKwkgKiB3aGVuIGRvX21tYXBfcGdvZmYgdW53aW5kcyAobWF5IGJlIGltcG9ydGFudCBvbiBwb3dlcnBjIGFuZCBpYTY0KS4KKwkgKi8KKwl2bWEtPnZtX2ZsYWdzIHw9IFZNX0hVR0VUTEIgfCBWTV9SRVNFUlZFRDsKKwl2bWEtPnZtX29wcyA9ICZodWdldGxiX3ZtX29wczsKIAogCXZtYV9sZW4gPSAobG9mZl90KSh2bWEtPnZtX2VuZCAtIHZtYS0+dm1fc3RhcnQpOwogCiAJbXV0ZXhfbG9jaygmaW5vZGUtPmlfbXV0ZXgpOwogCWZpbGVfYWNjZXNzZWQoZmlsZSk7Ci0Jdm1hLT52bV9mbGFncyB8PSBWTV9IVUdFVExCIHwgVk1fUkVTRVJWRUQ7Ci0Jdm1hLT52bV9vcHMgPSAmaHVnZXRsYl92bV9vcHM7CiAKIAlyZXQgPSAtRU5PTUVNOwogCWxlbiA9IHZtYV9sZW4gKyAoKGxvZmZfdCl2bWEtPnZtX3Bnb2ZmIDw8IFBBR0VfU0hJRlQpOwpAQCAtMjcxLDI5ICsyNjYsMjcgQEAKIAkJaHVnZXRsYmZzX2ZvcmdldF9pbm9kZShpbm9kZSk7CiB9CiAKLS8qCi0gKiBoX3Bnb2ZmIGlzIGluIEhQQUdFX1NJWkUgdW5pdHMuCi0gKiB2bWEtPnZtX3Bnb2ZmIGlzIGluIFBBR0VfU0laRSB1bml0cy4KLSAqLwogc3RhdGljIGlubGluZSB2b2lkCi1odWdldGxiX3ZtdHJ1bmNhdGVfbGlzdChzdHJ1Y3QgcHJpb190cmVlX3Jvb3QgKnJvb3QsIHVuc2lnbmVkIGxvbmcgaF9wZ29mZikKK2h1Z2V0bGJfdm10cnVuY2F0ZV9saXN0KHN0cnVjdCBwcmlvX3RyZWVfcm9vdCAqcm9vdCwgcGdvZmZfdCBwZ29mZikKIHsKIAlzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYTsKIAlzdHJ1Y3QgcHJpb190cmVlX2l0ZXIgaXRlcjsKIAotCXZtYV9wcmlvX3RyZWVfZm9yZWFjaCh2bWEsICZpdGVyLCByb290LCBoX3Bnb2ZmLCBVTE9OR19NQVgpIHsKLQkJdW5zaWduZWQgbG9uZyBoX3ZtX3Bnb2ZmOworCXZtYV9wcmlvX3RyZWVfZm9yZWFjaCh2bWEsICZpdGVyLCByb290LCBwZ29mZiwgVUxPTkdfTUFYKSB7CiAJCXVuc2lnbmVkIGxvbmcgdl9vZmZzZXQ7CiAKLQkJaF92bV9wZ29mZiA9IHZtYS0+dm1fcGdvZmYgPj4gKEhQQUdFX1NISUZUIC0gUEFHRV9TSElGVCk7Ci0JCXZfb2Zmc2V0ID0gKGhfcGdvZmYgLSBoX3ZtX3Bnb2ZmKSA8PCBIUEFHRV9TSElGVDsKIAkJLyoKLQkJICogSXMgdGhpcyBWTUEgZnVsbHkgb3V0c2lkZSB0aGUgdHJ1bmNhdGlvbiBwb2ludD8KKwkJICogQ2FuIHRoZSBleHByZXNzaW9uIGJlbG93IG92ZXJmbG93IG9uIDMyLWJpdCBhcmNoZXM/CisJCSAqIE5vLCBiZWNhdXNlIHRoZSBwcmlvX3RyZWUgcmV0dXJucyB1cyBvbmx5IHRob3NlIHZtYXMKKwkJICogd2hpY2ggb3ZlcmxhcCB0aGUgdHJ1bmNhdGVkIGFyZWEgc3RhcnRpbmcgYXQgcGdvZmYsCisJCSAqIGFuZCBubyB2bWEgb24gYSAzMi1iaXQgYXJjaCBjYW4gc3BhbiBiZXlvbmQgdGhlIDRHQi4KIAkJICovCi0JCWlmIChoX3ZtX3Bnb2ZmID49IGhfcGdvZmYpCisJCWlmICh2bWEtPnZtX3Bnb2ZmIDwgcGdvZmYpCisJCQl2X29mZnNldCA9IChwZ29mZiAtIHZtYS0+dm1fcGdvZmYpIDw8IFBBR0VfU0hJRlQ7CisJCWVsc2UKIAkJCXZfb2Zmc2V0ID0gMDsKIAotCQl1bm1hcF9odWdlcGFnZV9yYW5nZSh2bWEsCisJCV9fdW5tYXBfaHVnZXBhZ2VfcmFuZ2Uodm1hLAogCQkJCXZtYS0+dm1fc3RhcnQgKyB2X29mZnNldCwgdm1hLT52bV9lbmQpOwogCX0KIH0KQEAgLTMwMywxNCArMjk2LDE0IEBACiAgKi8KIHN0YXRpYyBpbnQgaHVnZXRsYl92bXRydW5jYXRlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGxvZmZfdCBvZmZzZXQpCiB7Ci0JdW5zaWduZWQgbG9uZyBwZ29mZjsKKwlwZ29mZl90IHBnb2ZmOwogCXN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nID0gaW5vZGUtPmlfbWFwcGluZzsKIAogCWlmIChvZmZzZXQgPiBpbm9kZS0+aV9zaXplKQogCQlyZXR1cm4gLUVJTlZBTDsKIAogCUJVR19PTihvZmZzZXQgJiB+SFBBR0VfTUFTSyk7Ci0JcGdvZmYgPSBvZmZzZXQgPj4gSFBBR0VfU0hJRlQ7CisJcGdvZmYgPSBvZmZzZXQgPj4gUEFHRV9TSElGVDsKIAogCWlub2RlLT5pX3NpemUgPSBvZmZzZXQ7CiAJc3Bpbl9sb2NrKCZtYXBwaW5nLT5pX21tYXBfbG9jayk7CkBAIC02MjQsNyArNjE3LDYgQEAKIAkJCQlkb19kaXYoc2l6ZSwgMTAwKTsKIAkJCQlyZXN0Kys7CiAJCQl9Ci0JCQlzaXplICY9IEhQQUdFX01BU0s7CiAJCQlwY29uZmlnLT5ucl9ibG9ja3MgPSAoc2l6ZSA+PiBIUEFHRV9TSElGVCk7CiAJCQl2YWx1ZSA9IHJlc3Q7CiAJCX0gZWxzZSBpZiAoIXN0cmNtcChvcHQsIm5yX2lub2RlcyIpKSB7CmRpZmYgLS1naXQgYS9mcy9pbm9kZS5jIGIvZnMvaW5vZGUuYwppbmRleCBkOWEyMWQxLi4yNmNkYjExIDEwMDY0NAotLS0gYS9mcy9pbm9kZS5jCisrKyBiL2ZzL2lub2RlLmMKQEAgLTEzMDYsNiArMTMwNiw0MiBAQAogCXdha2VfdXBfYml0KCZpbm9kZS0+aV9zdGF0ZSwgX19JX0xPQ0spOwogfQogCisvKgorICogV2UgcmFyZWx5IHdhbnQgdG8gbG9jayB0d28gaW5vZGVzIHRoYXQgZG8gbm90IGhhdmUgYSBwYXJlbnQvY2hpbGQKKyAqIHJlbGF0aW9uc2hpcCAoc3VjaCBhcyBkaXJlY3RvcnksIGNoaWxkIGlub2RlKSBzaW11bHRhbmVvdXNseS4gVGhlCisgKiB2YXN0IG1ham9yaXR5IG9mIGZpbGUgc3lzdGVtcyBzaG91bGQgYmUgYWJsZSB0byBnZXQgYWxvbmcgZmluZQorICogd2l0aG91dCB0aGlzLiBEbyBub3QgdXNlIHRoZXNlIGZ1bmN0aW9ucyBleGNlcHQgYXMgYSBsYXN0IHJlc29ydC4KKyAqLwordm9pZCBpbm9kZV9kb3VibGVfbG9jayhzdHJ1Y3QgaW5vZGUgKmlub2RlMSwgc3RydWN0IGlub2RlICppbm9kZTIpCit7CisJaWYgKGlub2RlMSA9PSBOVUxMIHx8IGlub2RlMiA9PSBOVUxMIHx8IGlub2RlMSA9PSBpbm9kZTIpIHsKKwkJaWYgKGlub2RlMSkKKwkJCW11dGV4X2xvY2soJmlub2RlMS0+aV9tdXRleCk7CisJCWVsc2UgaWYgKGlub2RlMikKKwkJCW11dGV4X2xvY2soJmlub2RlMi0+aV9tdXRleCk7CisJCXJldHVybjsKKwl9CisKKwlpZiAoaW5vZGUxIDwgaW5vZGUyKSB7CisJCW11dGV4X2xvY2tfbmVzdGVkKCZpbm9kZTEtPmlfbXV0ZXgsIElfTVVURVhfUEFSRU5UKTsKKwkJbXV0ZXhfbG9ja19uZXN0ZWQoJmlub2RlMi0+aV9tdXRleCwgSV9NVVRFWF9DSElMRCk7CisJfSBlbHNlIHsKKwkJbXV0ZXhfbG9ja19uZXN0ZWQoJmlub2RlMi0+aV9tdXRleCwgSV9NVVRFWF9QQVJFTlQpOworCQltdXRleF9sb2NrX25lc3RlZCgmaW5vZGUxLT5pX211dGV4LCBJX01VVEVYX0NISUxEKTsKKwl9Cit9CitFWFBPUlRfU1lNQk9MKGlub2RlX2RvdWJsZV9sb2NrKTsKKwordm9pZCBpbm9kZV9kb3VibGVfdW5sb2NrKHN0cnVjdCBpbm9kZSAqaW5vZGUxLCBzdHJ1Y3QgaW5vZGUgKmlub2RlMikKK3sKKwlpZiAoaW5vZGUxKQorCQltdXRleF91bmxvY2soJmlub2RlMS0+aV9tdXRleCk7CisKKwlpZiAoaW5vZGUyICYmIGlub2RlMiAhPSBpbm9kZTEpCisJCW11dGV4X3VubG9jaygmaW5vZGUyLT5pX211dGV4KTsKK30KK0VYUE9SVF9TWU1CT0woaW5vZGVfZG91YmxlX3VubG9jayk7CisKIHN0YXRpYyBfX2luaXRkYXRhIHVuc2lnbmVkIGxvbmcgaWhhc2hfZW50cmllczsKIHN0YXRpYyBpbnQgX19pbml0IHNldF9paGFzaF9lbnRyaWVzKGNoYXIgKnN0cikKIHsKZGlmZiAtLWdpdCBhL2ZzL2lvcHJpby5jIGIvZnMvaW9wcmlvLmMKaW5kZXggNmRjNjcyMS4uODllOGRhMSAxMDA2NDQKLS0tIGEvZnMvaW9wcmlvLmMKKysrIGIvZnMvaW9wcmlvLmMKQEAgLTE1MCwxMSArMTUwLDYgQEAKIAl1bnNpZ25lZCBzaG9ydCBhY2xhc3MgPSBJT1BSSU9fUFJJT19DTEFTUyhhcHJpbyk7CiAJdW5zaWduZWQgc2hvcnQgYmNsYXNzID0gSU9QUklPX1BSSU9fQ0xBU1MoYnByaW8pOwogCi0JaWYgKCFpb3ByaW9fdmFsaWQoYXByaW8pKQotCQlyZXR1cm4gYnByaW87Ci0JaWYgKCFpb3ByaW9fdmFsaWQoYnByaW8pKQotCQlyZXR1cm4gYXByaW87Ci0KIAlpZiAoYWNsYXNzID09IElPUFJJT19DTEFTU19OT05FKQogCQlhY2xhc3MgPSBJT1BSSU9fQ0xBU1NfQkU7CiAJaWYgKGJjbGFzcyA9PSBJT1BSSU9fQ0xBU1NfTk9ORSkKZGlmZiAtLWdpdCBhL2ZzL2piZC9qb3VybmFsLmMgYi9mcy9qYmQvam91cm5hbC5jCmluZGV4IGM1MThkZDguLmI4NWM2ODYgMTAwNjQ0Ci0tLSBhL2ZzL2piZC9qb3VybmFsLmMKKysrIGIvZnMvamJkL2pvdXJuYWwuYwpAQCAtNzI1LDYgKzcyNSw3IEBACiAJCQlfX0ZVTkNUSU9OX18pOwogCQlrZnJlZShqb3VybmFsKTsKIAkJam91cm5hbCA9IE5VTEw7CisJCWdvdG8gb3V0OwogCX0KIAlqb3VybmFsLT5qX2RldiA9IGJkZXY7CiAJam91cm5hbC0+al9mc19kZXYgPSBmc19kZXY7CkBAIC03MzUsNyArNzM2LDcgQEAKIAlKX0FTU0VSVChiaCAhPSBOVUxMKTsKIAlqb3VybmFsLT5qX3NiX2J1ZmZlciA9IGJoOwogCWpvdXJuYWwtPmpfc3VwZXJibG9jayA9IChqb3VybmFsX3N1cGVyYmxvY2tfdCAqKWJoLT5iX2RhdGE7Ci0KK291dDoKIAlyZXR1cm4gam91cm5hbDsKIH0KIApkaWZmIC0tZ2l0IGEvZnMvamJkL3RyYW5zYWN0aW9uLmMgYi9mcy9qYmQvdHJhbnNhY3Rpb24uYwppbmRleCBlMWIzYzhhLi40ZjgyYmNkNiAxMDA2NDQKLS0tIGEvZnMvamJkL3RyYW5zYWN0aW9uLmMKKysrIGIvZnMvamJkL3RyYW5zYWN0aW9uLmMKQEAgLTk2Nyw2ICs5NjcsMTMgQEAKIAkgKi8KIAlqYmRfbG9ja19iaF9zdGF0ZShiaCk7CiAJc3Bpbl9sb2NrKCZqb3VybmFsLT5qX2xpc3RfbG9jayk7CisKKwkvKiBOb3cgdGhhdCB3ZSBoYXZlIGJoX3N0YXRlIGxvY2tlZCwgYXJlIHdlIHJlYWxseSBzdGlsbCBtYXBwZWQ/ICovCisJaWYgKCFidWZmZXJfbWFwcGVkKGJoKSkgeworCQlKQlVGRkVSX1RSQUNFKGpoLCAidW5tYXBwZWQgYnVmZmVyLCBiYWlsaW5nIG91dCIpOworCQlnb3RvIG5vX2pvdXJuYWw7CisJfQorCiAJaWYgKGpoLT5iX3RyYW5zYWN0aW9uKSB7CiAJCUpCVUZGRVJfVFJBQ0UoamgsICJoYXMgdHJhbnNhY3Rpb24iKTsKIAkJaWYgKGpoLT5iX3RyYW5zYWN0aW9uICE9IGhhbmRsZS0+aF90cmFuc2FjdGlvbikgewpAQCAtMTAyOCw2ICsxMDM1LDExIEBACiAJCQkJc3luY19kaXJ0eV9idWZmZXIoYmgpOwogCQkJCWpiZF9sb2NrX2JoX3N0YXRlKGJoKTsKIAkJCQlzcGluX2xvY2soJmpvdXJuYWwtPmpfbGlzdF9sb2NrKTsKKwkJCQkvKiBTaW5jZSB3ZSBkcm9wcGVkIHRoZSBsb2NrLi4uICovCisJCQkJaWYgKCFidWZmZXJfbWFwcGVkKGJoKSkgeworCQkJCQlKQlVGRkVSX1RSQUNFKGpoLCAiYnVmZmVyIGdvdCB1bm1hcHBlZCIpOworCQkJCQlnb3RvIG5vX2pvdXJuYWw7CisJCQkJfQogCQkJCS8qIFRoZSBidWZmZXIgbWF5IGJlY29tZSBsb2NrZWQgYWdhaW4gYXQgYW55CiAJCQkJICAgdGltZSBpZiBpdCBpcyByZWRpcnRpZWQgKi8KIAkJCX0KQEAgLTEzMTQsMTMgKzEzMjYsMTQgQEAKIAlpbnQgb2xkX2hhbmRsZV9jb3VudCwgZXJyOwogCXBpZF90IHBpZDsKIAotCUpfQVNTRVJUKHRyYW5zYWN0aW9uLT50X3VwZGF0ZXMgPiAwKTsKIAlKX0FTU0VSVChqb3VybmFsX2N1cnJlbnRfaGFuZGxlKCkgPT0gaGFuZGxlKTsKIAogCWlmIChpc19oYW5kbGVfYWJvcnRlZChoYW5kbGUpKQogCQllcnIgPSAtRUlPOwotCWVsc2UKKwllbHNlIHsKKwkJSl9BU1NFUlQodHJhbnNhY3Rpb24tPnRfdXBkYXRlcyA+IDApOwogCQllcnIgPSAwOworCX0KIAogCWlmICgtLWhhbmRsZS0+aF9yZWYgPiAwKSB7CiAJCWpiZF9kZWJ1Zyg0LCAiaF9yZWYgJWQgLT4gJWRcbiIsIGhhbmRsZS0+aF9yZWYgKyAxLApAQCAtMTgyMyw2ICsxODM2LDcgQEAKIAkJCX0KIAkJfQogCX0gZWxzZSBpZiAodHJhbnNhY3Rpb24gPT0gam91cm5hbC0+al9jb21taXR0aW5nX3RyYW5zYWN0aW9uKSB7CisJCUpCVUZGRVJfVFJBQ0UoamgsICJvbiBjb21taXR0aW5nIHRyYW5zYWN0aW9uIik7CiAJCWlmIChqaC0+Yl9qbGlzdCA9PSBCSl9Mb2NrZWQpIHsKIAkJCS8qCiAJCQkgKiBUaGUgYnVmZmVyIGlzIG9uIHRoZSBjb21taXR0aW5nIHRyYW5zYWN0aW9uJ3MgbG9ja2VkCkBAIC0xODM3LDcgKzE4NTEsNiBAQAogCQkgKiBjYW4gcmVtb3ZlIGl0J3MgbmV4dF90cmFuc2FjdGlvbiBwb2ludGVyIGZyb20gdGhlCiAJCSAqIHJ1bm5pbmcgdHJhbnNhY3Rpb24gaWYgdGhhdCBpcyBzZXQsIGJ1dCBub3RoaW5nCiAJCSAqIGVsc2UuICovCi0JCUpCVUZGRVJfVFJBQ0UoamgsICJvbiBjb21taXR0aW5nIHRyYW5zYWN0aW9uIik7CiAJCXNldF9idWZmZXJfZnJlZWQoYmgpOwogCQlpZiAoamgtPmJfbmV4dF90cmFuc2FjdGlvbikgewogCQkJSl9BU1NFUlQoamgtPmJfbmV4dF90cmFuc2FjdGlvbiA9PQpAQCAtMTg1Nyw2ICsxODcwLDcgQEAKIAkJICogaV9zaXplIGFscmVhZHkgZm9yIHRoaXMgdHJ1bmNhdGUgc28gcmVjb3Zlcnkgd2lsbCBub3QKIAkJICogZXhwb3NlIHRoZSBkaXNrIGJsb2NrcyB3ZSBhcmUgZGlzY2FyZGluZyBoZXJlLikgKi8KIAkJSl9BU1NFUlRfSkgoamgsIHRyYW5zYWN0aW9uID09IGpvdXJuYWwtPmpfcnVubmluZ190cmFuc2FjdGlvbik7CisJCUpCVUZGRVJfVFJBQ0UoamgsICJvbiBydW5uaW5nIHRyYW5zYWN0aW9uIik7CiAJCW1heV9mcmVlID0gX19kaXNwb3NlX2J1ZmZlcihqaCwgdHJhbnNhY3Rpb24pOwogCX0KIApkaWZmIC0tZ2l0IGEvZnMvamJkMi9NYWtlZmlsZSBiL2ZzL2piZDIvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODAyYTM0MQotLS0gL2Rldi9udWxsCisrKyBiL2ZzL2piZDIvTWFrZWZpbGUKQEAgLTAsMCArMSw3IEBACisjCisjIE1ha2VmaWxlIGZvciB0aGUgbGludXggam91cm5hbGluZyByb3V0aW5lcy4KKyMKKworb2JqLSQoQ09ORklHX0pCRDIpICs9IGpiZDIubworCitqYmQyLW9ianMgOj0gdHJhbnNhY3Rpb24ubyBjb21taXQubyByZWNvdmVyeS5vIGNoZWNrcG9pbnQubyByZXZva2UubyBqb3VybmFsLm8KZGlmZiAtLWdpdCBhL2ZzL2piZDIvY2hlY2twb2ludC5jIGIvZnMvamJkMi9jaGVja3BvaW50LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjgwMzlmYQotLS0gL2Rldi9udWxsCisrKyBiL2ZzL2piZDIvY2hlY2twb2ludC5jCkBAIC0wLDAgKzEsNjk3IEBACisvKgorICogbGludXgvZnMvY2hlY2twb2ludC5jCisgKgorICogV3JpdHRlbiBieSBTdGVwaGVuIEMuIFR3ZWVkaWUgPHNjdEByZWRoYXQuY29tPiwgMTk5OQorICoKKyAqIENvcHlyaWdodCAxOTk5IFJlZCBIYXQgU29mdHdhcmUgLS0tIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgTGludXgga2VybmVsIGFuZCBpcyBtYWRlIGF2YWlsYWJsZSB1bmRlcgorICogdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgdmVyc2lvbiAyLCBvciBhdCB5b3VyCisgKiBvcHRpb24sIGFueSBsYXRlciB2ZXJzaW9uLCBpbmNvcnBvcmF0ZWQgaGVyZWluIGJ5IHJlZmVyZW5jZS4KKyAqCisgKiBDaGVja3BvaW50IHJvdXRpbmVzIGZvciB0aGUgZ2VuZXJpYyBmaWxlc3lzdGVtIGpvdXJuYWxpbmcgY29kZS4KKyAqIFBhcnQgb2YgdGhlIGV4dDJmcyBqb3VybmFsaW5nIHN5c3RlbS4KKyAqCisgKiBDaGVja3BvaW50aW5nIGlzIHRoZSBwcm9jZXNzIG9mIGVuc3VyaW5nIHRoYXQgYSBzZWN0aW9uIG9mIHRoZSBsb2cgaXMKKyAqIGNvbW1pdHRlZCBmdWxseSB0byBkaXNrLCBzbyB0aGF0IHRoYXQgcG9ydGlvbiBvZiB0aGUgbG9nIGNhbiBiZQorICogcmV1c2VkLgorICovCisKKyNpbmNsdWRlIDxsaW51eC90aW1lLmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9qYmQyLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisKKy8qCisgKiBVbmxpbmsgYSBidWZmZXIgZnJvbSBhIHRyYW5zYWN0aW9uIGNoZWNrcG9pbnQgbGlzdC4KKyAqCisgKiBDYWxsZWQgd2l0aCBqX2xpc3RfbG9jayBoZWxkLgorICovCitzdGF0aWMgaW5saW5lIHZvaWQgX19idWZmZXJfdW5saW5rX2ZpcnN0KHN0cnVjdCBqb3VybmFsX2hlYWQgKmpoKQoreworCXRyYW5zYWN0aW9uX3QgKnRyYW5zYWN0aW9uID0gamgtPmJfY3BfdHJhbnNhY3Rpb247CisKKwlqaC0+Yl9jcG5leHQtPmJfY3BwcmV2ID0gamgtPmJfY3BwcmV2OworCWpoLT5iX2NwcHJldi0+Yl9jcG5leHQgPSBqaC0+Yl9jcG5leHQ7CisJaWYgKHRyYW5zYWN0aW9uLT50X2NoZWNrcG9pbnRfbGlzdCA9PSBqaCkgeworCQl0cmFuc2FjdGlvbi0+dF9jaGVja3BvaW50X2xpc3QgPSBqaC0+Yl9jcG5leHQ7CisJCWlmICh0cmFuc2FjdGlvbi0+dF9jaGVja3BvaW50X2xpc3QgPT0gamgpCisJCQl0cmFuc2FjdGlvbi0+dF9jaGVja3BvaW50X2xpc3QgPSBOVUxMOworCX0KK30KKworLyoKKyAqIFVubGluayBhIGJ1ZmZlciBmcm9tIGEgdHJhbnNhY3Rpb24gY2hlY2twb2ludChpbykgbGlzdC4KKyAqCisgKiBDYWxsZWQgd2l0aCBqX2xpc3RfbG9jayBoZWxkLgorICovCitzdGF0aWMgaW5saW5lIHZvaWQgX19idWZmZXJfdW5saW5rKHN0cnVjdCBqb3VybmFsX2hlYWQgKmpoKQoreworCXRyYW5zYWN0aW9uX3QgKnRyYW5zYWN0aW9uID0gamgtPmJfY3BfdHJhbnNhY3Rpb247CisKKwlfX2J1ZmZlcl91bmxpbmtfZmlyc3QoamgpOworCWlmICh0cmFuc2FjdGlvbi0+dF9jaGVja3BvaW50X2lvX2xpc3QgPT0gamgpIHsKKwkJdHJhbnNhY3Rpb24tPnRfY2hlY2twb2ludF9pb19saXN0ID0gamgtPmJfY3BuZXh0OworCQlpZiAodHJhbnNhY3Rpb24tPnRfY2hlY2twb2ludF9pb19saXN0ID09IGpoKQorCQkJdHJhbnNhY3Rpb24tPnRfY2hlY2twb2ludF9pb19saXN0ID0gTlVMTDsKKwl9Cit9CisKKy8qCisgKiBNb3ZlIGEgYnVmZmVyIGZyb20gdGhlIGNoZWNrcG9pbnQgbGlzdCB0byB0aGUgY2hlY2twb2ludCBpbyBsaXN0CisgKgorICogQ2FsbGVkIHdpdGggal9saXN0X2xvY2sgaGVsZAorICovCitzdGF0aWMgaW5saW5lIHZvaWQgX19idWZmZXJfcmVsaW5rX2lvKHN0cnVjdCBqb3VybmFsX2hlYWQgKmpoKQoreworCXRyYW5zYWN0aW9uX3QgKnRyYW5zYWN0aW9uID0gamgtPmJfY3BfdHJhbnNhY3Rpb247CisKKwlfX2J1ZmZlcl91bmxpbmtfZmlyc3QoamgpOworCisJaWYgKCF0cmFuc2FjdGlvbi0+dF9jaGVja3BvaW50X2lvX2xpc3QpIHsKKwkJamgtPmJfY3BuZXh0ID0gamgtPmJfY3BwcmV2ID0gamg7CisJfSBlbHNlIHsKKwkJamgtPmJfY3BuZXh0ID0gdHJhbnNhY3Rpb24tPnRfY2hlY2twb2ludF9pb19saXN0OworCQlqaC0+Yl9jcHByZXYgPSB0cmFuc2FjdGlvbi0+dF9jaGVja3BvaW50X2lvX2xpc3QtPmJfY3BwcmV2OworCQlqaC0+Yl9jcHByZXYtPmJfY3BuZXh0ID0gamg7CisJCWpoLT5iX2NwbmV4dC0+Yl9jcHByZXYgPSBqaDsKKwl9CisJdHJhbnNhY3Rpb24tPnRfY2hlY2twb2ludF9pb19saXN0ID0gamg7Cit9CisKKy8qCisgKiBUcnkgdG8gcmVsZWFzZSBhIGNoZWNrcG9pbnRlZCBidWZmZXIgZnJvbSBpdHMgdHJhbnNhY3Rpb24uCisgKiBSZXR1cm5zIDEgaWYgd2UgcmVsZWFzZWQgaXQgYW5kIDIgaWYgd2UgYWxzbyByZWxlYXNlZCB0aGUKKyAqIHdob2xlIHRyYW5zYWN0aW9uLgorICoKKyAqIFJlcXVpcmVzIGpfbGlzdF9sb2NrCisgKiBDYWxsZWQgdW5kZXIgamJkX2xvY2tfYmhfc3RhdGUoamgyYmgoamgpKSwgYW5kIGRyb3BzIGl0CisgKi8KK3N0YXRpYyBpbnQgX190cnlfdG9fZnJlZV9jcF9idWYoc3RydWN0IGpvdXJuYWxfaGVhZCAqamgpCit7CisJaW50IHJldCA9IDA7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCA9IGpoMmJoKGpoKTsKKworCWlmIChqaC0+Yl9qbGlzdCA9PSBCSl9Ob25lICYmICFidWZmZXJfbG9ja2VkKGJoKSAmJiAhYnVmZmVyX2RpcnR5KGJoKSkgeworCQlKQlVGRkVSX1RSQUNFKGpoLCAicmVtb3ZlIGZyb20gY2hlY2twb2ludCBsaXN0Iik7CisJCXJldCA9IF9famJkMl9qb3VybmFsX3JlbW92ZV9jaGVja3BvaW50KGpoKSArIDE7CisJCWpiZF91bmxvY2tfYmhfc3RhdGUoYmgpOworCQlqYmQyX2pvdXJuYWxfcmVtb3ZlX2pvdXJuYWxfaGVhZChiaCk7CisJCUJVRkZFUl9UUkFDRShiaCwgInJlbGVhc2UiKTsKKwkJX19icmVsc2UoYmgpOworCX0gZWxzZSB7CisJCWpiZF91bmxvY2tfYmhfc3RhdGUoYmgpOworCX0KKwlyZXR1cm4gcmV0OworfQorCisvKgorICogX19qYmQyX2xvZ193YWl0X2Zvcl9zcGFjZTogd2FpdCB1bnRpbCB0aGVyZSBpcyBzcGFjZSBpbiB0aGUgam91cm5hbC4KKyAqCisgKiBDYWxsZWQgdW5kZXIgai1zdGF0ZV9sb2NrICpvbmx5Ki4gIEl0IHdpbGwgYmUgdW5sb2NrZWQgaWYgd2UgaGF2ZSB0byB3YWl0CisgKiBmb3IgYSBjaGVja3BvaW50IHRvIGZyZWUgdXAgc29tZSBzcGFjZSBpbiB0aGUgbG9nLgorICovCit2b2lkIF9famJkMl9sb2dfd2FpdF9mb3Jfc3BhY2Uoam91cm5hbF90ICpqb3VybmFsKQoreworCWludCBuYmxvY2tzOworCWFzc2VydF9zcGluX2xvY2tlZCgmam91cm5hbC0+al9zdGF0ZV9sb2NrKTsKKworCW5ibG9ja3MgPSBqYmRfc3BhY2VfbmVlZGVkKGpvdXJuYWwpOworCXdoaWxlIChfX2piZDJfbG9nX3NwYWNlX2xlZnQoam91cm5hbCkgPCBuYmxvY2tzKSB7CisJCWlmIChqb3VybmFsLT5qX2ZsYWdzICYgSkJEMl9BQk9SVCkKKwkJCXJldHVybjsKKwkJc3Bpbl91bmxvY2soJmpvdXJuYWwtPmpfc3RhdGVfbG9jayk7CisJCW11dGV4X2xvY2soJmpvdXJuYWwtPmpfY2hlY2twb2ludF9tdXRleCk7CisKKwkJLyoKKwkJICogVGVzdCBhZ2FpbiwgYW5vdGhlciBwcm9jZXNzIG1heSBoYXZlIGNoZWNrcG9pbnRlZCB3aGlsZSB3ZQorCQkgKiB3ZXJlIHdhaXRpbmcgZm9yIHRoZSBjaGVja3BvaW50IGxvY2sKKwkJICovCisJCXNwaW5fbG9jaygmam91cm5hbC0+al9zdGF0ZV9sb2NrKTsKKwkJbmJsb2NrcyA9IGpiZF9zcGFjZV9uZWVkZWQoam91cm5hbCk7CisJCWlmIChfX2piZDJfbG9nX3NwYWNlX2xlZnQoam91cm5hbCkgPCBuYmxvY2tzKSB7CisJCQlzcGluX3VubG9jaygmam91cm5hbC0+al9zdGF0ZV9sb2NrKTsKKwkJCWpiZDJfbG9nX2RvX2NoZWNrcG9pbnQoam91cm5hbCk7CisJCQlzcGluX2xvY2soJmpvdXJuYWwtPmpfc3RhdGVfbG9jayk7CisJCX0KKwkJbXV0ZXhfdW5sb2NrKCZqb3VybmFsLT5qX2NoZWNrcG9pbnRfbXV0ZXgpOworCX0KK30KKworLyoKKyAqIFdlIHdlcmUgdW5hYmxlIHRvIHBlcmZvcm0gamJkX3RyeWxvY2tfYmhfc3RhdGUoKSBpbnNpZGUgal9saXN0X2xvY2suCisgKiBUaGUgY2FsbGVyIG11c3QgcmVzdGFydCBhIGxpc3Qgd2Fsay4gIFdhaXQgZm9yIHNvbWVvbmUgZWxzZSB0byBydW4KKyAqIGpiZF91bmxvY2tfYmhfc3RhdGUoKS4KKyAqLworc3RhdGljIHZvaWQgamJkX3N5bmNfYmgoam91cm5hbF90ICpqb3VybmFsLCBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoKQorCV9fcmVsZWFzZXMoam91cm5hbC0+al9saXN0X2xvY2spCit7CisJZ2V0X2JoKGJoKTsKKwlzcGluX3VubG9jaygmam91cm5hbC0+al9saXN0X2xvY2spOworCWpiZF9sb2NrX2JoX3N0YXRlKGJoKTsKKwlqYmRfdW5sb2NrX2JoX3N0YXRlKGJoKTsKKwlwdXRfYmgoYmgpOworfQorCisvKgorICogQ2xlYW4gdXAgdHJhbnNhY3Rpb24ncyBsaXN0IG9mIGJ1ZmZlcnMgc3VibWl0dGVkIGZvciBpby4KKyAqIFdlIHdhaXQgZm9yIGFueSBwZW5kaW5nIElPIHRvIGNvbXBsZXRlIGFuZCByZW1vdmUgYW55IGNsZWFuCisgKiBidWZmZXJzLiBOb3RlIHRoYXQgd2UgdGFrZSB0aGUgYnVmZmVycyBpbiB0aGUgb3Bwb3NpdGUgb3JkZXJpbmcKKyAqIGZyb20gdGhlIG9uZSBpbiB3aGljaCB0aGV5IHdlcmUgc3VibWl0dGVkIGZvciBJTy4KKyAqCisgKiBDYWxsZWQgd2l0aCBqX2xpc3RfbG9jayBoZWxkLgorICovCitzdGF0aWMgdm9pZCBfX3dhaXRfY3BfaW8oam91cm5hbF90ICpqb3VybmFsLCB0cmFuc2FjdGlvbl90ICp0cmFuc2FjdGlvbikKK3sKKwlzdHJ1Y3Qgam91cm5hbF9oZWFkICpqaDsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoOworCXRpZF90IHRoaXNfdGlkOworCWludCByZWxlYXNlZCA9IDA7CisKKwl0aGlzX3RpZCA9IHRyYW5zYWN0aW9uLT50X3RpZDsKK3Jlc3RhcnQ6CisJLyogRGlkIHNvbWVib2R5IGNsZWFuIHVwIHRoZSB0cmFuc2FjdGlvbiBpbiB0aGUgbWVhbndoaWxlPyAqLworCWlmIChqb3VybmFsLT5qX2NoZWNrcG9pbnRfdHJhbnNhY3Rpb25zICE9IHRyYW5zYWN0aW9uIHx8CisJCQl0cmFuc2FjdGlvbi0+dF90aWQgIT0gdGhpc190aWQpCisJCXJldHVybjsKKwl3aGlsZSAoIXJlbGVhc2VkICYmIHRyYW5zYWN0aW9uLT50X2NoZWNrcG9pbnRfaW9fbGlzdCkgeworCQlqaCA9IHRyYW5zYWN0aW9uLT50X2NoZWNrcG9pbnRfaW9fbGlzdDsKKwkJYmggPSBqaDJiaChqaCk7CisJCWlmICghamJkX3RyeWxvY2tfYmhfc3RhdGUoYmgpKSB7CisJCQlqYmRfc3luY19iaChqb3VybmFsLCBiaCk7CisJCQlzcGluX2xvY2soJmpvdXJuYWwtPmpfbGlzdF9sb2NrKTsKKwkJCWdvdG8gcmVzdGFydDsKKwkJfQorCQlpZiAoYnVmZmVyX2xvY2tlZChiaCkpIHsKKwkJCWF0b21pY19pbmMoJmJoLT5iX2NvdW50KTsKKwkJCXNwaW5fdW5sb2NrKCZqb3VybmFsLT5qX2xpc3RfbG9jayk7CisJCQlqYmRfdW5sb2NrX2JoX3N0YXRlKGJoKTsKKwkJCXdhaXRfb25fYnVmZmVyKGJoKTsKKwkJCS8qIHRoZSBqb3VybmFsX2hlYWQgbWF5IGhhdmUgZ29uZSBieSBub3cgKi8KKwkJCUJVRkZFUl9UUkFDRShiaCwgImJyZWxzZSIpOworCQkJX19icmVsc2UoYmgpOworCQkJc3Bpbl9sb2NrKCZqb3VybmFsLT5qX2xpc3RfbG9jayk7CisJCQlnb3RvIHJlc3RhcnQ7CisJCX0KKwkJLyoKKwkJICogTm93IGluIHdoYXRldmVyIHN0YXRlIHRoZSBidWZmZXIgY3VycmVudGx5IGlzLCB3ZSBrbm93IHRoYXQKKwkJICogaXQgaGFzIGJlZW4gd3JpdHRlbiBvdXQgYW5kIHNvIHdlIGNhbiBkcm9wIGl0IGZyb20gdGhlIGxpc3QKKwkJICovCisJCXJlbGVhc2VkID0gX19qYmQyX2pvdXJuYWxfcmVtb3ZlX2NoZWNrcG9pbnQoamgpOworCQlqYmRfdW5sb2NrX2JoX3N0YXRlKGJoKTsKKwkJamJkMl9qb3VybmFsX3JlbW92ZV9qb3VybmFsX2hlYWQoYmgpOworCQlfX2JyZWxzZShiaCk7CisJfQorfQorCisjZGVmaW5lIE5SX0JBVENICTY0CisKK3N0YXRpYyB2b2lkCitfX2ZsdXNoX2JhdGNoKGpvdXJuYWxfdCAqam91cm5hbCwgc3RydWN0IGJ1ZmZlcl9oZWFkICoqYmhzLCBpbnQgKmJhdGNoX2NvdW50KQoreworCWludCBpOworCisJbGxfcndfYmxvY2soU1dSSVRFLCAqYmF0Y2hfY291bnQsIGJocyk7CisJZm9yIChpID0gMDsgaSA8ICpiYXRjaF9jb3VudDsgaSsrKSB7CisJCXN0cnVjdCBidWZmZXJfaGVhZCAqYmggPSBiaHNbaV07CisJCWNsZWFyX2J1ZmZlcl9qd3JpdGUoYmgpOworCQlCVUZGRVJfVFJBQ0UoYmgsICJicmVsc2UiKTsKKwkJX19icmVsc2UoYmgpOworCX0KKwkqYmF0Y2hfY291bnQgPSAwOworfQorCisvKgorICogVHJ5IHRvIGZsdXNoIG9uZSBidWZmZXIgZnJvbSB0aGUgY2hlY2twb2ludCBsaXN0IHRvIGRpc2suCisgKgorICogUmV0dXJuIDEgaWYgc29tZXRoaW5nIGhhcHBlbmVkIHdoaWNoIHJlcXVpcmVzIHVzIHRvIGFib3J0IHRoZSBjdXJyZW50CisgKiBzY2FuIG9mIHRoZSBjaGVja3BvaW50IGxpc3QuCisgKgorICogQ2FsbGVkIHdpdGggal9saXN0X2xvY2sgaGVsZCBhbmQgZHJvcHMgaXQgaWYgMSBpcyByZXR1cm5lZAorICogQ2FsbGVkIHVuZGVyIGpiZF9sb2NrX2JoX3N0YXRlKGpoMmJoKGpoKSksIGFuZCBkcm9wcyBpdAorICovCitzdGF0aWMgaW50IF9fcHJvY2Vzc19idWZmZXIoam91cm5hbF90ICpqb3VybmFsLCBzdHJ1Y3Qgam91cm5hbF9oZWFkICpqaCwKKwkJCXN0cnVjdCBidWZmZXJfaGVhZCAqKmJocywgaW50ICpiYXRjaF9jb3VudCkKK3sKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoID0gamgyYmgoamgpOworCWludCByZXQgPSAwOworCisJaWYgKGJ1ZmZlcl9sb2NrZWQoYmgpKSB7CisJCWF0b21pY19pbmMoJmJoLT5iX2NvdW50KTsKKwkJc3Bpbl91bmxvY2soJmpvdXJuYWwtPmpfbGlzdF9sb2NrKTsKKwkJamJkX3VubG9ja19iaF9zdGF0ZShiaCk7CisJCXdhaXRfb25fYnVmZmVyKGJoKTsKKwkJLyogdGhlIGpvdXJuYWxfaGVhZCBtYXkgaGF2ZSBnb25lIGJ5IG5vdyAqLworCQlCVUZGRVJfVFJBQ0UoYmgsICJicmVsc2UiKTsKKwkJX19icmVsc2UoYmgpOworCQlyZXQgPSAxOworCX0gZWxzZSBpZiAoamgtPmJfdHJhbnNhY3Rpb24gIT0gTlVMTCkgeworCQl0cmFuc2FjdGlvbl90ICp0ID0gamgtPmJfdHJhbnNhY3Rpb247CisJCXRpZF90IHRpZCA9IHQtPnRfdGlkOworCisJCXNwaW5fdW5sb2NrKCZqb3VybmFsLT5qX2xpc3RfbG9jayk7CisJCWpiZF91bmxvY2tfYmhfc3RhdGUoYmgpOworCQlqYmQyX2xvZ19zdGFydF9jb21taXQoam91cm5hbCwgdGlkKTsKKwkJamJkMl9sb2dfd2FpdF9jb21taXQoam91cm5hbCwgdGlkKTsKKwkJcmV0ID0gMTsKKwl9IGVsc2UgaWYgKCFidWZmZXJfZGlydHkoYmgpKSB7CisJCUpfQVNTRVJUX0pIKGpoLCAhYnVmZmVyX2piZGRpcnR5KGJoKSk7CisJCUJVRkZFUl9UUkFDRShiaCwgInJlbW92ZSBmcm9tIGNoZWNrcG9pbnQiKTsKKwkJX19qYmQyX2pvdXJuYWxfcmVtb3ZlX2NoZWNrcG9pbnQoamgpOworCQlzcGluX3VubG9jaygmam91cm5hbC0+al9saXN0X2xvY2spOworCQlqYmRfdW5sb2NrX2JoX3N0YXRlKGJoKTsKKwkJamJkMl9qb3VybmFsX3JlbW92ZV9qb3VybmFsX2hlYWQoYmgpOworCQlfX2JyZWxzZShiaCk7CisJCXJldCA9IDE7CisJfSBlbHNlIHsKKwkJLyoKKwkJICogSW1wb3J0YW50OiB3ZSBhcmUgYWJvdXQgdG8gd3JpdGUgdGhlIGJ1ZmZlciwgYW5kCisJCSAqIHBvc3NpYmx5IGJsb2NrLCB3aGlsZSBzdGlsbCBob2xkaW5nIHRoZSBqb3VybmFsIGxvY2suCisJCSAqIFdlIGNhbm5vdCBhZmZvcmQgdG8gbGV0IHRoZSB0cmFuc2FjdGlvbiBsb2dpYyBzdGFydAorCQkgKiBtZXNzaW5nIGFyb3VuZCB3aXRoIHRoaXMgYnVmZmVyIGJlZm9yZSB3ZSB3cml0ZSBpdCB0bworCQkgKiBkaXNrLCBhcyB0aGF0IHdvdWxkIGJyZWFrIHJlY292ZXJhYmlsaXR5LgorCQkgKi8KKwkJQlVGRkVSX1RSQUNFKGJoLCAicXVldWUiKTsKKwkJZ2V0X2JoKGJoKTsKKwkJSl9BU1NFUlRfQkgoYmgsICFidWZmZXJfandyaXRlKGJoKSk7CisJCXNldF9idWZmZXJfandyaXRlKGJoKTsKKwkJYmhzWypiYXRjaF9jb3VudF0gPSBiaDsKKwkJX19idWZmZXJfcmVsaW5rX2lvKGpoKTsKKwkJamJkX3VubG9ja19iaF9zdGF0ZShiaCk7CisJCSgqYmF0Y2hfY291bnQpKys7CisJCWlmICgqYmF0Y2hfY291bnQgPT0gTlJfQkFUQ0gpIHsKKwkJCXNwaW5fdW5sb2NrKCZqb3VybmFsLT5qX2xpc3RfbG9jayk7CisJCQlfX2ZsdXNoX2JhdGNoKGpvdXJuYWwsIGJocywgYmF0Y2hfY291bnQpOworCQkJcmV0ID0gMTsKKwkJfQorCX0KKwlyZXR1cm4gcmV0OworfQorCisvKgorICogUGVyZm9ybSBhbiBhY3R1YWwgY2hlY2twb2ludC4gV2UgdGFrZSB0aGUgZmlyc3QgdHJhbnNhY3Rpb24gb24gdGhlCisgKiBsaXN0IG9mIHRyYW5zYWN0aW9ucyB0byBiZSBjaGVja3BvaW50ZWQgYW5kIHNlbmQgYWxsIGl0cyBidWZmZXJzCisgKiB0byBkaXNrLiBXZSBzdWJtaXQgbGFyZ2VyIGNodW5rcyBvZiBkYXRhIGF0IG9uY2UuCisgKgorICogVGhlIGpvdXJuYWwgc2hvdWxkIGJlIGxvY2tlZCBiZWZvcmUgY2FsbGluZyB0aGlzIGZ1bmN0aW9uLgorICovCitpbnQgamJkMl9sb2dfZG9fY2hlY2twb2ludChqb3VybmFsX3QgKmpvdXJuYWwpCit7CisJdHJhbnNhY3Rpb25fdCAqdHJhbnNhY3Rpb247CisJdGlkX3QgdGhpc190aWQ7CisJaW50IHJlc3VsdDsKKworCWpiZF9kZWJ1ZygxLCAiU3RhcnQgY2hlY2twb2ludFxuIik7CisKKwkvKgorCSAqIEZpcnN0IHRoaW5nOiBpZiB0aGVyZSBhcmUgYW55IHRyYW5zYWN0aW9ucyBpbiB0aGUgbG9nIHdoaWNoCisJICogZG9uJ3QgbmVlZCBjaGVja3BvaW50aW5nLCBqdXN0IGVsaW1pbmF0ZSB0aGVtIGZyb20gdGhlCisJICogam91cm5hbCBzdHJhaWdodCBhd2F5LgorCSAqLworCXJlc3VsdCA9IGpiZDJfY2xlYW51cF9qb3VybmFsX3RhaWwoam91cm5hbCk7CisJamJkX2RlYnVnKDEsICJjbGVhbnVwX2pvdXJuYWxfdGFpbCByZXR1cm5lZCAlZFxuIiwgcmVzdWx0KTsKKwlpZiAocmVzdWx0IDw9IDApCisJCXJldHVybiByZXN1bHQ7CisKKwkvKgorCSAqIE9LLCB3ZSBuZWVkIHRvIHN0YXJ0IHdyaXRpbmcgZGlzayBibG9ja3MuICBUYWtlIG9uZSB0cmFuc2FjdGlvbgorCSAqIGFuZCB3cml0ZSBpdC4KKwkgKi8KKwlzcGluX2xvY2soJmpvdXJuYWwtPmpfbGlzdF9sb2NrKTsKKwlpZiAoIWpvdXJuYWwtPmpfY2hlY2twb2ludF90cmFuc2FjdGlvbnMpCisJCWdvdG8gb3V0OworCXRyYW5zYWN0aW9uID0gam91cm5hbC0+al9jaGVja3BvaW50X3RyYW5zYWN0aW9uczsKKwl0aGlzX3RpZCA9IHRyYW5zYWN0aW9uLT50X3RpZDsKK3Jlc3RhcnQ6CisJLyoKKwkgKiBJZiBzb21lb25lIGNsZWFuZWQgdXAgdGhpcyB0cmFuc2FjdGlvbiB3aGlsZSB3ZSBzbGVwdCwgd2UncmUKKwkgKiBkb25lIChtYXliZSBpdCdzIGEgbmV3IHRyYW5zYWN0aW9uLCBidXQgaXQgZmVsbCBhdCB0aGUgc2FtZQorCSAqIGFkZHJlc3MpLgorCSAqLworCWlmIChqb3VybmFsLT5qX2NoZWNrcG9pbnRfdHJhbnNhY3Rpb25zID09IHRyYW5zYWN0aW9uICYmCisJCQl0cmFuc2FjdGlvbi0+dF90aWQgPT0gdGhpc190aWQpIHsKKwkJaW50IGJhdGNoX2NvdW50ID0gMDsKKwkJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaHNbTlJfQkFUQ0hdOworCQlzdHJ1Y3Qgam91cm5hbF9oZWFkICpqaDsKKwkJaW50IHJldHJ5ID0gMDsKKworCQl3aGlsZSAoIXJldHJ5ICYmIHRyYW5zYWN0aW9uLT50X2NoZWNrcG9pbnRfbGlzdCkgeworCQkJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaDsKKworCQkJamggPSB0cmFuc2FjdGlvbi0+dF9jaGVja3BvaW50X2xpc3Q7CisJCQliaCA9IGpoMmJoKGpoKTsKKwkJCWlmICghamJkX3RyeWxvY2tfYmhfc3RhdGUoYmgpKSB7CisJCQkJamJkX3N5bmNfYmgoam91cm5hbCwgYmgpOworCQkJCXJldHJ5ID0gMTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCXJldHJ5ID0gX19wcm9jZXNzX2J1ZmZlcihqb3VybmFsLCBqaCwgYmhzLCZiYXRjaF9jb3VudCk7CisJCQlpZiAoIXJldHJ5ICYmIGxvY2tfbmVlZF9yZXNjaGVkKCZqb3VybmFsLT5qX2xpc3RfbG9jaykpeworCQkJCXNwaW5fdW5sb2NrKCZqb3VybmFsLT5qX2xpc3RfbG9jayk7CisJCQkJcmV0cnkgPSAxOworCQkJCWJyZWFrOworCQkJfQorCQl9CisKKwkJaWYgKGJhdGNoX2NvdW50KSB7CisJCQlpZiAoIXJldHJ5KSB7CisJCQkJc3Bpbl91bmxvY2soJmpvdXJuYWwtPmpfbGlzdF9sb2NrKTsKKwkJCQlyZXRyeSA9IDE7CisJCQl9CisJCQlfX2ZsdXNoX2JhdGNoKGpvdXJuYWwsIGJocywgJmJhdGNoX2NvdW50KTsKKwkJfQorCisJCWlmIChyZXRyeSkgeworCQkJc3Bpbl9sb2NrKCZqb3VybmFsLT5qX2xpc3RfbG9jayk7CisJCQlnb3RvIHJlc3RhcnQ7CisJCX0KKwkJLyoKKwkJICogTm93IHdlIGhhdmUgY2xlYW5lZCB1cCB0aGUgZmlyc3QgdHJhbnNhY3Rpb24ncyBjaGVja3BvaW50CisJCSAqIGxpc3QuIExldCdzIGNsZWFuIHVwIHRoZSBzZWNvbmQgb25lCisJCSAqLworCQlfX3dhaXRfY3BfaW8oam91cm5hbCwgdHJhbnNhY3Rpb24pOworCX0KK291dDoKKwlzcGluX3VubG9jaygmam91cm5hbC0+al9saXN0X2xvY2spOworCXJlc3VsdCA9IGpiZDJfY2xlYW51cF9qb3VybmFsX3RhaWwoam91cm5hbCk7CisJaWYgKHJlc3VsdCA8IDApCisJCXJldHVybiByZXN1bHQ7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBDaGVjayB0aGUgbGlzdCBvZiBjaGVja3BvaW50IHRyYW5zYWN0aW9ucyBmb3IgdGhlIGpvdXJuYWwgdG8gc2VlIGlmCisgKiB3ZSBoYXZlIGFscmVhZHkgZ290IHJpZCBvZiBhbnkgc2luY2UgdGhlIGxhc3QgdXBkYXRlIG9mIHRoZSBsb2cgdGFpbAorICogaW4gdGhlIGpvdXJuYWwgc3VwZXJibG9jay4gIElmIHNvLCB3ZSBjYW4gaW5zdGFudGx5IHJvbGwgdGhlCisgKiBzdXBlcmJsb2NrIGZvcndhcmQgdG8gcmVtb3ZlIHRob3NlIHRyYW5zYWN0aW9ucyBmcm9tIHRoZSBsb2cuCisgKgorICogUmV0dXJuIDwwIG9uIGVycm9yLCAwIG9uIHN1Y2Nlc3MsIDEgaWYgdGhlcmUgd2FzIG5vdGhpbmcgdG8gY2xlYW4gdXAuCisgKgorICogQ2FsbGVkIHdpdGggdGhlIGpvdXJuYWwgbG9jayBoZWxkLgorICoKKyAqIFRoaXMgaXMgdGhlIG9ubHkgcGFydCBvZiB0aGUgam91cm5hbGluZyBjb2RlIHdoaWNoIHJlYWxseSBuZWVkcyB0byBiZQorICogYXdhcmUgb2YgdHJhbnNhY3Rpb24gYWJvcnRzLiAgQ2hlY2twb2ludGluZyBpbnZvbHZlcyB3cml0aW5nIHRvIHRoZQorICogbWFpbiBmaWxlc3lzdGVtIGFyZWEgcmF0aGVyIHRoYW4gdG8gdGhlIGpvdXJuYWwsIHNvIGl0IGNhbiBwcm9jZWVkCisgKiBldmVuIGluIGFib3J0IHN0YXRlLCBidXQgd2UgbXVzdCBub3QgdXBkYXRlIHRoZSBqb3VybmFsIHN1cGVyYmxvY2sgaWYKKyAqIHdlIGhhdmUgYW4gYWJvcnQgZXJyb3Igb3V0c3RhbmRpbmcuCisgKi8KKworaW50IGpiZDJfY2xlYW51cF9qb3VybmFsX3RhaWwoam91cm5hbF90ICpqb3VybmFsKQoreworCXRyYW5zYWN0aW9uX3QgKiB0cmFuc2FjdGlvbjsKKwl0aWRfdAkJZmlyc3RfdGlkOworCXVuc2lnbmVkIGxvbmcJYmxvY2tuciwgZnJlZWQ7CisKKwkvKiBPSywgd29yayBvdXQgdGhlIG9sZGVzdCB0cmFuc2FjdGlvbiByZW1haW5pbmcgaW4gdGhlIGxvZywgYW5kCisJICogdGhlIGxvZyBibG9jayBpdCBzdGFydHMgYXQuCisJICoKKwkgKiBJZiB0aGUgbG9nIGlzIG5vdyBlbXB0eSwgd2UgbmVlZCB0byB3b3JrIG91dCB3aGljaCBpcyB0aGUKKwkgKiBuZXh0IHRyYW5zYWN0aW9uIElEIHdlIHdpbGwgd3JpdGUsIGFuZCB3aGVyZSBpdCB3aWxsCisJICogc3RhcnQuICovCisKKwlzcGluX2xvY2soJmpvdXJuYWwtPmpfc3RhdGVfbG9jayk7CisJc3Bpbl9sb2NrKCZqb3VybmFsLT5qX2xpc3RfbG9jayk7CisJdHJhbnNhY3Rpb24gPSBqb3VybmFsLT5qX2NoZWNrcG9pbnRfdHJhbnNhY3Rpb25zOworCWlmICh0cmFuc2FjdGlvbikgeworCQlmaXJzdF90aWQgPSB0cmFuc2FjdGlvbi0+dF90aWQ7CisJCWJsb2NrbnIgPSB0cmFuc2FjdGlvbi0+dF9sb2dfc3RhcnQ7CisJfSBlbHNlIGlmICgodHJhbnNhY3Rpb24gPSBqb3VybmFsLT5qX2NvbW1pdHRpbmdfdHJhbnNhY3Rpb24pICE9IE5VTEwpIHsKKwkJZmlyc3RfdGlkID0gdHJhbnNhY3Rpb24tPnRfdGlkOworCQlibG9ja25yID0gdHJhbnNhY3Rpb24tPnRfbG9nX3N0YXJ0OworCX0gZWxzZSBpZiAoKHRyYW5zYWN0aW9uID0gam91cm5hbC0+al9ydW5uaW5nX3RyYW5zYWN0aW9uKSAhPSBOVUxMKSB7CisJCWZpcnN0X3RpZCA9IHRyYW5zYWN0aW9uLT50X3RpZDsKKwkJYmxvY2tuciA9IGpvdXJuYWwtPmpfaGVhZDsKKwl9IGVsc2UgeworCQlmaXJzdF90aWQgPSBqb3VybmFsLT5qX3RyYW5zYWN0aW9uX3NlcXVlbmNlOworCQlibG9ja25yID0gam91cm5hbC0+al9oZWFkOworCX0KKwlzcGluX3VubG9jaygmam91cm5hbC0+al9saXN0X2xvY2spOworCUpfQVNTRVJUKGJsb2NrbnIgIT0gMCk7CisKKwkvKiBJZiB0aGUgb2xkZXN0IHBpbm5lZCB0cmFuc2FjdGlvbiBpcyBhdCB0aGUgdGFpbCBvZiB0aGUgbG9nCisgICAgICAgICAgIGFscmVhZHkgdGhlbiB0aGVyZSdzIG5vdCBtdWNoIHdlIGNhbiBkbyByaWdodCBub3cuICovCisJaWYgKGpvdXJuYWwtPmpfdGFpbF9zZXF1ZW5jZSA9PSBmaXJzdF90aWQpIHsKKwkJc3Bpbl91bmxvY2soJmpvdXJuYWwtPmpfc3RhdGVfbG9jayk7CisJCXJldHVybiAxOworCX0KKworCS8qIE9LLCB1cGRhdGUgdGhlIHN1cGVyYmxvY2sgdG8gcmVjb3ZlciB0aGUgZnJlZWQgc3BhY2UuCisJICogUGh5c2ljYWwgYmxvY2tzIGNvbWUgZmlyc3Q6IGhhdmUgd2Ugd3JhcHBlZCBiZXlvbmQgdGhlIGVuZCBvZgorCSAqIHRoZSBsb2c/ICAqLworCWZyZWVkID0gYmxvY2tuciAtIGpvdXJuYWwtPmpfdGFpbDsKKwlpZiAoYmxvY2tuciA8IGpvdXJuYWwtPmpfdGFpbCkKKwkJZnJlZWQgPSBmcmVlZCArIGpvdXJuYWwtPmpfbGFzdCAtIGpvdXJuYWwtPmpfZmlyc3Q7CisKKwlqYmRfZGVidWcoMSwKKwkJICAiQ2xlYW5pbmcgam91cm5hbCB0YWlsIGZyb20gJWQgdG8gJWQgKG9mZnNldCAlbHUpLCAiCisJCSAgImZyZWVpbmcgJWx1XG4iLAorCQkgIGpvdXJuYWwtPmpfdGFpbF9zZXF1ZW5jZSwgZmlyc3RfdGlkLCBibG9ja25yLCBmcmVlZCk7CisKKwlqb3VybmFsLT5qX2ZyZWUgKz0gZnJlZWQ7CisJam91cm5hbC0+al90YWlsX3NlcXVlbmNlID0gZmlyc3RfdGlkOworCWpvdXJuYWwtPmpfdGFpbCA9IGJsb2NrbnI7CisJc3Bpbl91bmxvY2soJmpvdXJuYWwtPmpfc3RhdGVfbG9jayk7CisJaWYgKCEoam91cm5hbC0+al9mbGFncyAmIEpCRDJfQUJPUlQpKQorCQlqYmQyX2pvdXJuYWxfdXBkYXRlX3N1cGVyYmxvY2soam91cm5hbCwgMSk7CisJcmV0dXJuIDA7Cit9CisKKworLyogQ2hlY2twb2ludCBsaXN0IG1hbmFnZW1lbnQgKi8KKworLyoKKyAqIGpvdXJuYWxfY2xlYW5fb25lX2NwX2xpc3QKKyAqCisgKiBGaW5kIGFsbCB0aGUgd3JpdHRlbi1iYWNrIGNoZWNrcG9pbnQgYnVmZmVycyBpbiB0aGUgZ2l2ZW4gbGlzdCBhbmQgcmVsZWFzZSB0aGVtLgorICoKKyAqIENhbGxlZCB3aXRoIHRoZSBqb3VybmFsIGxvY2tlZC4KKyAqIENhbGxlZCB3aXRoIGpfbGlzdF9sb2NrIGhlbGQuCisgKiBSZXR1cm5zIG51bWJlciBvZiBidWZlcnMgcmVhcGVkIChmb3IgZGVidWcpCisgKi8KKworc3RhdGljIGludCBqb3VybmFsX2NsZWFuX29uZV9jcF9saXN0KHN0cnVjdCBqb3VybmFsX2hlYWQgKmpoLCBpbnQgKnJlbGVhc2VkKQoreworCXN0cnVjdCBqb3VybmFsX2hlYWQgKmxhc3Rfamg7CisJc3RydWN0IGpvdXJuYWxfaGVhZCAqbmV4dF9qaCA9IGpoOworCWludCByZXQsIGZyZWVkID0gMDsKKworCSpyZWxlYXNlZCA9IDA7CisJaWYgKCFqaCkKKwkJcmV0dXJuIDA7CisKKwlsYXN0X2poID0gamgtPmJfY3BwcmV2OworCWRvIHsKKwkJamggPSBuZXh0X2poOworCQluZXh0X2poID0gamgtPmJfY3BuZXh0OworCQkvKiBVc2UgdHJ5bG9jayBiZWNhdXNlIG9mIHRoZSByYW5raW5nICovCisJCWlmIChqYmRfdHJ5bG9ja19iaF9zdGF0ZShqaDJiaChqaCkpKSB7CisJCQlyZXQgPSBfX3RyeV90b19mcmVlX2NwX2J1ZihqaCk7CisJCQlpZiAocmV0KSB7CisJCQkJZnJlZWQrKzsKKwkJCQlpZiAocmV0ID09IDIpIHsKKwkJCQkJKnJlbGVhc2VkID0gMTsKKwkJCQkJcmV0dXJuIGZyZWVkOworCQkJCX0KKwkJCX0KKwkJfQorCQkvKgorCQkgKiBUaGlzIGZ1bmN0aW9uIG9ubHkgZnJlZXMgdXAgc29tZSBtZW1vcnkKKwkJICogaWYgcG9zc2libGUgc28gd2UgZG9udCBoYXZlIGFuIG9ibGlnYXRpb24KKwkJICogdG8gZmluaXNoIHByb2Nlc3NpbmcuIEJhaWwgb3V0IGlmIHByZWVtcHRpb24KKwkJICogcmVxdWVzdGVkOgorCQkgKi8KKwkJaWYgKG5lZWRfcmVzY2hlZCgpKQorCQkJcmV0dXJuIGZyZWVkOworCX0gd2hpbGUgKGpoICE9IGxhc3RfamgpOworCisJcmV0dXJuIGZyZWVkOworfQorCisvKgorICogam91cm5hbF9jbGVhbl9jaGVja3BvaW50X2xpc3QKKyAqCisgKiBGaW5kIGFsbCB0aGUgd3JpdHRlbi1iYWNrIGNoZWNrcG9pbnQgYnVmZmVycyBpbiB0aGUgam91cm5hbCBhbmQgcmVsZWFzZSB0aGVtLgorICoKKyAqIENhbGxlZCB3aXRoIHRoZSBqb3VybmFsIGxvY2tlZC4KKyAqIENhbGxlZCB3aXRoIGpfbGlzdF9sb2NrIGhlbGQuCisgKiBSZXR1cm5zIG51bWJlciBvZiBidWZmZXJzIHJlYXBlZCAoZm9yIGRlYnVnKQorICovCisKK2ludCBfX2piZDJfam91cm5hbF9jbGVhbl9jaGVja3BvaW50X2xpc3Qoam91cm5hbF90ICpqb3VybmFsKQoreworCXRyYW5zYWN0aW9uX3QgKnRyYW5zYWN0aW9uLCAqbGFzdF90cmFuc2FjdGlvbiwgKm5leHRfdHJhbnNhY3Rpb247CisJaW50IHJldCA9IDA7CisJaW50IHJlbGVhc2VkOworCisJdHJhbnNhY3Rpb24gPSBqb3VybmFsLT5qX2NoZWNrcG9pbnRfdHJhbnNhY3Rpb25zOworCWlmICghdHJhbnNhY3Rpb24pCisJCWdvdG8gb3V0OworCisJbGFzdF90cmFuc2FjdGlvbiA9IHRyYW5zYWN0aW9uLT50X2NwcHJldjsKKwluZXh0X3RyYW5zYWN0aW9uID0gdHJhbnNhY3Rpb247CisJZG8geworCQl0cmFuc2FjdGlvbiA9IG5leHRfdHJhbnNhY3Rpb247CisJCW5leHRfdHJhbnNhY3Rpb24gPSB0cmFuc2FjdGlvbi0+dF9jcG5leHQ7CisJCXJldCArPSBqb3VybmFsX2NsZWFuX29uZV9jcF9saXN0KHRyYW5zYWN0aW9uLT4KKwkJCQl0X2NoZWNrcG9pbnRfbGlzdCwgJnJlbGVhc2VkKTsKKwkJLyoKKwkJICogVGhpcyBmdW5jdGlvbiBvbmx5IGZyZWVzIHVwIHNvbWUgbWVtb3J5IGlmIHBvc3NpYmxlIHNvIHdlCisJCSAqIGRvbnQgaGF2ZSBhbiBvYmxpZ2F0aW9uIHRvIGZpbmlzaCBwcm9jZXNzaW5nLiBCYWlsIG91dCBpZgorCQkgKiBwcmVlbXB0aW9uIHJlcXVlc3RlZDoKKwkJICovCisJCWlmIChuZWVkX3Jlc2NoZWQoKSkKKwkJCWdvdG8gb3V0OworCQlpZiAocmVsZWFzZWQpCisJCQljb250aW51ZTsKKwkJLyoKKwkJICogSXQgaXMgZXNzZW50aWFsIHRoYXQgd2UgYXJlIGFzIGNhcmVmdWwgYXMgaW4gdGhlIGNhc2Ugb2YKKwkJICogdF9jaGVja3BvaW50X2xpc3Qgd2l0aCByZW1vdmluZyB0aGUgYnVmZmVyIGZyb20gdGhlIGxpc3QgYXMKKwkJICogd2UgY2FuIHBvc3NpYmx5IHNlZSBub3QgeWV0IHN1Ym1pdHRlZCBidWZmZXJzIG9uIGlvX2xpc3QKKwkJICovCisJCXJldCArPSBqb3VybmFsX2NsZWFuX29uZV9jcF9saXN0KHRyYW5zYWN0aW9uLT4KKwkJCQl0X2NoZWNrcG9pbnRfaW9fbGlzdCwgJnJlbGVhc2VkKTsKKwkJaWYgKG5lZWRfcmVzY2hlZCgpKQorCQkJZ290byBvdXQ7CisJfSB3aGlsZSAodHJhbnNhY3Rpb24gIT0gbGFzdF90cmFuc2FjdGlvbik7CitvdXQ6CisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqIGpvdXJuYWxfcmVtb3ZlX2NoZWNrcG9pbnQ6IGNhbGxlZCBhZnRlciBhIGJ1ZmZlciBoYXMgYmVlbiBjb21taXR0ZWQKKyAqIHRvIGRpc2sgKGVpdGhlciBieSBiZWluZyB3cml0ZS1iYWNrIGZsdXNoZWQgdG8gZGlzaywgb3IgYmVpbmcKKyAqIGNvbW1pdHRlZCB0byB0aGUgbG9nKS4KKyAqCisgKiBXZSBjYW5ub3Qgc2FmZWx5IGNsZWFuIGEgdHJhbnNhY3Rpb24gb3V0IG9mIHRoZSBsb2cgdW50aWwgYWxsIG9mIHRoZQorICogYnVmZmVyIHVwZGF0ZXMgY29tbWl0dGVkIGluIHRoYXQgdHJhbnNhY3Rpb24gaGF2ZSBzYWZlbHkgYmVlbiBzdG9yZWQKKyAqIGVsc2V3aGVyZSBvbiBkaXNrLiAgVG8gYWNoaWV2ZSB0aGlzLCBhbGwgb2YgdGhlIGJ1ZmZlcnMgaW4gYQorICogdHJhbnNhY3Rpb24gbmVlZCB0byBiZSBtYWludGFpbmVkIG9uIHRoZSB0cmFuc2FjdGlvbidzIGNoZWNrcG9pbnQKKyAqIGxpc3RzIHVudGlsIHRoZXkgaGF2ZSBiZWVuIHJld3JpdHRlbiwgYXQgd2hpY2ggcG9pbnQgdGhpcyBmdW5jdGlvbiBpcworICogY2FsbGVkIHRvIHJlbW92ZSB0aGUgYnVmZmVyIGZyb20gdGhlIGV4aXN0aW5nIHRyYW5zYWN0aW9uJ3MKKyAqIGNoZWNrcG9pbnQgbGlzdHMuCisgKgorICogVGhlIGZ1bmN0aW9uIHJldHVybnMgMSBpZiBpdCBmcmVlcyB0aGUgdHJhbnNhY3Rpb24sIDAgb3RoZXJ3aXNlLgorICoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHdpdGggdGhlIGpvdXJuYWwgbG9ja2VkLgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgd2l0aCBqX2xpc3RfbG9jayBoZWxkLgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgd2l0aCBqYmRfbG9ja19iaF9zdGF0ZShqaDJiaChqaCkpCisgKi8KKworaW50IF9famJkMl9qb3VybmFsX3JlbW92ZV9jaGVja3BvaW50KHN0cnVjdCBqb3VybmFsX2hlYWQgKmpoKQoreworCXRyYW5zYWN0aW9uX3QgKnRyYW5zYWN0aW9uOworCWpvdXJuYWxfdCAqam91cm5hbDsKKwlpbnQgcmV0ID0gMDsKKworCUpCVUZGRVJfVFJBQ0UoamgsICJlbnRyeSIpOworCisJaWYgKCh0cmFuc2FjdGlvbiA9IGpoLT5iX2NwX3RyYW5zYWN0aW9uKSA9PSBOVUxMKSB7CisJCUpCVUZGRVJfVFJBQ0UoamgsICJub3Qgb24gdHJhbnNhY3Rpb24iKTsKKwkJZ290byBvdXQ7CisJfQorCWpvdXJuYWwgPSB0cmFuc2FjdGlvbi0+dF9qb3VybmFsOworCisJX19idWZmZXJfdW5saW5rKGpoKTsKKwlqaC0+Yl9jcF90cmFuc2FjdGlvbiA9IE5VTEw7CisKKwlpZiAodHJhbnNhY3Rpb24tPnRfY2hlY2twb2ludF9saXN0ICE9IE5VTEwgfHwKKwkgICAgdHJhbnNhY3Rpb24tPnRfY2hlY2twb2ludF9pb19saXN0ICE9IE5VTEwpCisJCWdvdG8gb3V0OworCUpCVUZGRVJfVFJBQ0UoamgsICJ0cmFuc2FjdGlvbiBoYXMgbm8gbW9yZSBidWZmZXJzIik7CisKKwkvKgorCSAqIFRoZXJlIGlzIG9uZSBzcGVjaWFsIGNhc2UgdG8gd29ycnkgYWJvdXQ6IGlmIHdlIGhhdmUganVzdCBwdWxsZWQgdGhlCisJICogYnVmZmVyIG9mZiBhIGNvbW1pdHRpbmcgdHJhbnNhY3Rpb24ncyBmb3JnZXQgbGlzdCwgdGhlbiBldmVuIGlmIHRoZQorCSAqIGNoZWNrcG9pbnQgbGlzdCBpcyBlbXB0eSwgdGhlIHRyYW5zYWN0aW9uIG9idmlvdXNseSBjYW5ub3QgYmUKKwkgKiBkcm9wcGVkIQorCSAqCisJICogVGhlIGxvY2tpbmcgaGVyZSBhcm91bmQgal9jb21taXR0aW5nX3RyYW5zYWN0aW9uIGlzIGEgYml0IHNsZWF6eS4KKwkgKiBTZWUgdGhlIGNvbW1lbnQgYXQgdGhlIGVuZCBvZiBqYmQyX2pvdXJuYWxfY29tbWl0X3RyYW5zYWN0aW9uKCkuCisJICovCisJaWYgKHRyYW5zYWN0aW9uID09IGpvdXJuYWwtPmpfY29tbWl0dGluZ190cmFuc2FjdGlvbikgeworCQlKQlVGRkVSX1RSQUNFKGpoLCAiYmVsb25ncyB0byBjb21taXR0aW5nIHRyYW5zYWN0aW9uIik7CisJCWdvdG8gb3V0OworCX0KKworCS8qIE9LLCB0aGF0IHdhcyB0aGUgbGFzdCBidWZmZXIgZm9yIHRoZSB0cmFuc2FjdGlvbjogd2UgY2FuIG5vdworCSAgIHNhZmVseSByZW1vdmUgdGhpcyB0cmFuc2FjdGlvbiBmcm9tIHRoZSBsb2cgKi8KKworCV9famJkMl9qb3VybmFsX2Ryb3BfdHJhbnNhY3Rpb24oam91cm5hbCwgdHJhbnNhY3Rpb24pOworCisJLyogSnVzdCBpbiBjYXNlIGFueWJvZHkgd2FzIHdhaXRpbmcgZm9yIG1vcmUgdHJhbnNhY3Rpb25zIHRvIGJlCisgICAgICAgICAgIGNoZWNrcG9pbnRlZC4uLiAqLworCXdha2VfdXAoJmpvdXJuYWwtPmpfd2FpdF9sb2dzcGFjZSk7CisJcmV0ID0gMTsKK291dDoKKwlKQlVGRkVSX1RSQUNFKGpoLCAiZXhpdCIpOworCXJldHVybiByZXQ7Cit9CisKKy8qCisgKiBqb3VybmFsX2luc2VydF9jaGVja3BvaW50OiBwdXQgYSBjb21taXR0ZWQgYnVmZmVyIG9udG8gYSBjaGVja3BvaW50CisgKiBsaXN0IHNvIHRoYXQgd2Uga25vdyB3aGVuIGl0IGlzIHNhZmUgdG8gY2xlYW4gdGhlIHRyYW5zYWN0aW9uIG91dCBvZgorICogdGhlIGxvZy4KKyAqCisgKiBDYWxsZWQgd2l0aCB0aGUgam91cm5hbCBsb2NrZWQuCisgKiBDYWxsZWQgd2l0aCBqX2xpc3RfbG9jayBoZWxkLgorICovCit2b2lkIF9famJkMl9qb3VybmFsX2luc2VydF9jaGVja3BvaW50KHN0cnVjdCBqb3VybmFsX2hlYWQgKmpoLAorCQkJICAgICAgIHRyYW5zYWN0aW9uX3QgKnRyYW5zYWN0aW9uKQoreworCUpCVUZGRVJfVFJBQ0UoamgsICJlbnRyeSIpOworCUpfQVNTRVJUX0pIKGpoLCBidWZmZXJfZGlydHkoamgyYmgoamgpKSB8fCBidWZmZXJfamJkZGlydHkoamgyYmgoamgpKSk7CisJSl9BU1NFUlRfSkgoamgsIGpoLT5iX2NwX3RyYW5zYWN0aW9uID09IE5VTEwpOworCisJamgtPmJfY3BfdHJhbnNhY3Rpb24gPSB0cmFuc2FjdGlvbjsKKworCWlmICghdHJhbnNhY3Rpb24tPnRfY2hlY2twb2ludF9saXN0KSB7CisJCWpoLT5iX2NwbmV4dCA9IGpoLT5iX2NwcHJldiA9IGpoOworCX0gZWxzZSB7CisJCWpoLT5iX2NwbmV4dCA9IHRyYW5zYWN0aW9uLT50X2NoZWNrcG9pbnRfbGlzdDsKKwkJamgtPmJfY3BwcmV2ID0gdHJhbnNhY3Rpb24tPnRfY2hlY2twb2ludF9saXN0LT5iX2NwcHJldjsKKwkJamgtPmJfY3BwcmV2LT5iX2NwbmV4dCA9IGpoOworCQlqaC0+Yl9jcG5leHQtPmJfY3BwcmV2ID0gamg7CisJfQorCXRyYW5zYWN0aW9uLT50X2NoZWNrcG9pbnRfbGlzdCA9IGpoOworfQorCisvKgorICogV2UndmUgZmluaXNoZWQgd2l0aCB0aGlzIHRyYW5zYWN0aW9uIHN0cnVjdHVyZTogYWRpb3MuLi4KKyAqCisgKiBUaGUgdHJhbnNhY3Rpb24gbXVzdCBoYXZlIG5vIGxpbmtzIGV4Y2VwdCBmb3IgdGhlIGNoZWNrcG9pbnQgYnkgdGhpcworICogcG9pbnQuCisgKgorICogQ2FsbGVkIHdpdGggdGhlIGpvdXJuYWwgbG9ja2VkLgorICogQ2FsbGVkIHdpdGggal9saXN0X2xvY2sgaGVsZC4KKyAqLworCit2b2lkIF9famJkMl9qb3VybmFsX2Ryb3BfdHJhbnNhY3Rpb24oam91cm5hbF90ICpqb3VybmFsLCB0cmFuc2FjdGlvbl90ICp0cmFuc2FjdGlvbikKK3sKKwlhc3NlcnRfc3Bpbl9sb2NrZWQoJmpvdXJuYWwtPmpfbGlzdF9sb2NrKTsKKwlpZiAodHJhbnNhY3Rpb24tPnRfY3BuZXh0KSB7CisJCXRyYW5zYWN0aW9uLT50X2NwbmV4dC0+dF9jcHByZXYgPSB0cmFuc2FjdGlvbi0+dF9jcHByZXY7CisJCXRyYW5zYWN0aW9uLT50X2NwcHJldi0+dF9jcG5leHQgPSB0cmFuc2FjdGlvbi0+dF9jcG5leHQ7CisJCWlmIChqb3VybmFsLT5qX2NoZWNrcG9pbnRfdHJhbnNhY3Rpb25zID09IHRyYW5zYWN0aW9uKQorCQkJam91cm5hbC0+al9jaGVja3BvaW50X3RyYW5zYWN0aW9ucyA9CisJCQkJdHJhbnNhY3Rpb24tPnRfY3BuZXh0OworCQlpZiAoam91cm5hbC0+al9jaGVja3BvaW50X3RyYW5zYWN0aW9ucyA9PSB0cmFuc2FjdGlvbikKKwkJCWpvdXJuYWwtPmpfY2hlY2twb2ludF90cmFuc2FjdGlvbnMgPSBOVUxMOworCX0KKworCUpfQVNTRVJUKHRyYW5zYWN0aW9uLT50X3N0YXRlID09IFRfRklOSVNIRUQpOworCUpfQVNTRVJUKHRyYW5zYWN0aW9uLT50X2J1ZmZlcnMgPT0gTlVMTCk7CisJSl9BU1NFUlQodHJhbnNhY3Rpb24tPnRfc3luY19kYXRhbGlzdCA9PSBOVUxMKTsKKwlKX0FTU0VSVCh0cmFuc2FjdGlvbi0+dF9mb3JnZXQgPT0gTlVMTCk7CisJSl9BU1NFUlQodHJhbnNhY3Rpb24tPnRfaW9idWZfbGlzdCA9PSBOVUxMKTsKKwlKX0FTU0VSVCh0cmFuc2FjdGlvbi0+dF9zaGFkb3dfbGlzdCA9PSBOVUxMKTsKKwlKX0FTU0VSVCh0cmFuc2FjdGlvbi0+dF9sb2dfbGlzdCA9PSBOVUxMKTsKKwlKX0FTU0VSVCh0cmFuc2FjdGlvbi0+dF9jaGVja3BvaW50X2xpc3QgPT0gTlVMTCk7CisJSl9BU1NFUlQodHJhbnNhY3Rpb24tPnRfY2hlY2twb2ludF9pb19saXN0ID09IE5VTEwpOworCUpfQVNTRVJUKHRyYW5zYWN0aW9uLT50X3VwZGF0ZXMgPT0gMCk7CisJSl9BU1NFUlQoam91cm5hbC0+al9jb21taXR0aW5nX3RyYW5zYWN0aW9uICE9IHRyYW5zYWN0aW9uKTsKKwlKX0FTU0VSVChqb3VybmFsLT5qX3J1bm5pbmdfdHJhbnNhY3Rpb24gIT0gdHJhbnNhY3Rpb24pOworCisJamJkX2RlYnVnKDEsICJEcm9wcGluZyB0cmFuc2FjdGlvbiAlZCwgYWxsIGRvbmVcbiIsIHRyYW5zYWN0aW9uLT50X3RpZCk7CisJa2ZyZWUodHJhbnNhY3Rpb24pOworfQpkaWZmIC0tZ2l0IGEvZnMvamJkMi9jb21taXQuYyBiL2ZzL2piZDIvY29tbWl0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzBiMmFlMQotLS0gL2Rldi9udWxsCisrKyBiL2ZzL2piZDIvY29tbWl0LmMKQEAgLTAsMCArMSw5MjAgQEAKKy8qCisgKiBsaW51eC9mcy9qYmQyL2NvbW1pdC5jCisgKgorICogV3JpdHRlbiBieSBTdGVwaGVuIEMuIFR3ZWVkaWUgPHNjdEByZWRoYXQuY29tPiwgMTk5OAorICoKKyAqIENvcHlyaWdodCAxOTk4IFJlZCBIYXQgY29ycCAtLS0gQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBMaW51eCBrZXJuZWwgYW5kIGlzIG1hZGUgYXZhaWxhYmxlIHVuZGVyCisgKiB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCB2ZXJzaW9uIDIsIG9yIGF0IHlvdXIKKyAqIG9wdGlvbiwgYW55IGxhdGVyIHZlcnNpb24sIGluY29ycG9yYXRlZCBoZXJlaW4gYnkgcmVmZXJlbmNlLgorICoKKyAqIEpvdXJuYWwgY29tbWl0IHJvdXRpbmVzIGZvciB0aGUgZ2VuZXJpYyBmaWxlc3lzdGVtIGpvdXJuYWxpbmcgY29kZTsKKyAqIHBhcnQgb2YgdGhlIGV4dDJmcyBqb3VybmFsaW5nIHN5c3RlbS4KKyAqLworCisjaW5jbHVkZSA8bGludXgvdGltZS5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvamJkMi5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvcGFnZW1hcC5oPgorI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+CisKKy8qCisgKiBEZWZhdWx0IElPIGVuZCBoYW5kbGVyIGZvciB0ZW1wb3JhcnkgQkpfSU8gYnVmZmVyX2hlYWRzLgorICovCitzdGF0aWMgdm9pZCBqb3VybmFsX2VuZF9idWZmZXJfaW9fc3luYyhzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoLCBpbnQgdXB0b2RhdGUpCit7CisJQlVGRkVSX1RSQUNFKGJoLCAiIik7CisJaWYgKHVwdG9kYXRlKQorCQlzZXRfYnVmZmVyX3VwdG9kYXRlKGJoKTsKKwllbHNlCisJCWNsZWFyX2J1ZmZlcl91cHRvZGF0ZShiaCk7CisJdW5sb2NrX2J1ZmZlcihiaCk7Cit9CisKKy8qCisgKiBXaGVuIGFuIGV4dDMtb3JkZXJlZCBmaWxlIGlzIHRydW5jYXRlZCwgaXQgaXMgcG9zc2libGUgdGhhdCBtYW55IHBhZ2VzIGFyZQorICogbm90IHN1Y2Vzc2Z1bGx5IGZyZWVkLCBiZWNhdXNlIHRoZXkgYXJlIGF0dGFjaGVkIHRvIGEgY29tbWl0dGluZyB0cmFuc2FjdGlvbi4KKyAqIEFmdGVyIHRoZSB0cmFuc2FjdGlvbiBjb21taXRzLCB0aGVzZSBwYWdlcyBhcmUgbGVmdCBvbiB0aGUgTFJVLCB3aXRoIG5vCisgKiAtPm1hcHBpbmcsIGFuZCB3aXRoIGF0dGFjaGVkIGJ1ZmZlcnMuICBUaGVzZSBwYWdlcyBhcmUgdHJpdmlhbGx5IHJlY2xhaW1hYmxlCisgKiBieSB0aGUgVk0sIGJ1dCB0aGVpciBhcHBhcmVudCBhYnNlbmNlIHVwc2V0cyB0aGUgVk0gYWNjb3VudGluZywgYW5kIGl0IG1ha2VzCisgKiB0aGUgbnVtYmVycyBpbiAvcHJvYy9tZW1pbmZvIGxvb2sgb2RkLgorICoKKyAqIFNvIGhlcmUsIHdlIGhhdmUgYSBidWZmZXIgd2hpY2ggaGFzIGp1c3QgY29tZSBvZmYgdGhlIGZvcmdldCBsaXN0LiAgTG9vayB0bworICogc2VlIGlmIHdlIGNhbiBzdHJpcCBhbGwgYnVmZmVycyBmcm9tIHRoZSBiYWNraW5nIHBhZ2UuCisgKgorICogQ2FsbGVkIHVuZGVyIGxvY2tfam91cm5hbCgpLCBhbmQgcG9zc2libHkgdW5kZXIgam91cm5hbF9kYXRhbGlzdF9sb2NrLiAgVGhlCisgKiBjYWxsZXIgcHJvdmlkZWQgdXMgd2l0aCBhIHJlZiBhZ2FpbnN0IHRoZSBidWZmZXIsIGFuZCB3ZSBkcm9wIHRoYXQgaGVyZS4KKyAqLworc3RhdGljIHZvaWQgcmVsZWFzZV9idWZmZXJfcGFnZShzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoKQoreworCXN0cnVjdCBwYWdlICpwYWdlOworCisJaWYgKGJ1ZmZlcl9kaXJ0eShiaCkpCisJCWdvdG8gbm9wZTsKKwlpZiAoYXRvbWljX3JlYWQoJmJoLT5iX2NvdW50KSAhPSAxKQorCQlnb3RvIG5vcGU7CisJcGFnZSA9IGJoLT5iX3BhZ2U7CisJaWYgKCFwYWdlKQorCQlnb3RvIG5vcGU7CisJaWYgKHBhZ2UtPm1hcHBpbmcpCisJCWdvdG8gbm9wZTsKKworCS8qIE9LLCBpdCdzIGEgdHJ1bmNhdGVkIHBhZ2UgKi8KKwlpZiAoVGVzdFNldFBhZ2VMb2NrZWQocGFnZSkpCisJCWdvdG8gbm9wZTsKKworCXBhZ2VfY2FjaGVfZ2V0KHBhZ2UpOworCV9fYnJlbHNlKGJoKTsKKwl0cnlfdG9fZnJlZV9idWZmZXJzKHBhZ2UpOworCXVubG9ja19wYWdlKHBhZ2UpOworCXBhZ2VfY2FjaGVfcmVsZWFzZShwYWdlKTsKKwlyZXR1cm47CisKK25vcGU6CisJX19icmVsc2UoYmgpOworfQorCisvKgorICogVHJ5IHRvIGFjcXVpcmUgamJkX2xvY2tfYmhfc3RhdGUoKSBhZ2FpbnN0IHRoZSBidWZmZXIsIHdoZW4gal9saXN0X2xvY2sgaXMKKyAqIGhlbGQuICBGb3IgcmFua2luZyByZWFzb25zIHdlIG11c3QgdHJ5bG9jay4gIElmIHdlIGxvc2UsIHNjaGVkdWxlIGF3YXkgYW5kCisgKiByZXR1cm4gMC4gIGpfbGlzdF9sb2NrIGlzIGRyb3BwZWQgaW4gdGhpcyBjYXNlLgorICovCitzdGF0aWMgaW50IGludmVydGVkX2xvY2soam91cm5hbF90ICpqb3VybmFsLCBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoKQoreworCWlmICghamJkX3RyeWxvY2tfYmhfc3RhdGUoYmgpKSB7CisJCXNwaW5fdW5sb2NrKCZqb3VybmFsLT5qX2xpc3RfbG9jayk7CisJCXNjaGVkdWxlKCk7CisJCXJldHVybiAwOworCX0KKwlyZXR1cm4gMTsKK30KKworLyogRG9uZSBpdCBhbGw6IG5vdyB3cml0ZSB0aGUgY29tbWl0IHJlY29yZC4gIFdlIHNob3VsZCBoYXZlCisgKiBjbGVhbmVkIHVwIG91ciBwcmV2aW91cyBidWZmZXJzIGJ5IG5vdywgc28gaWYgd2UgYXJlIGluIGFib3J0CisgKiBtb2RlIHdlIGNhbiBub3cganVzdCBza2lwIHRoZSByZXN0IG9mIHRoZSBqb3VybmFsIHdyaXRlCisgKiBlbnRpcmVseS4KKyAqCisgKiBSZXR1cm5zIDEgaWYgdGhlIGpvdXJuYWwgbmVlZHMgdG8gYmUgYWJvcnRlZCBvciAwIG9uIHN1Y2Nlc3MKKyAqLworc3RhdGljIGludCBqb3VybmFsX3dyaXRlX2NvbW1pdF9yZWNvcmQoam91cm5hbF90ICpqb3VybmFsLAorCQkJCQl0cmFuc2FjdGlvbl90ICpjb21taXRfdHJhbnNhY3Rpb24pCit7CisJc3RydWN0IGpvdXJuYWxfaGVhZCAqZGVzY3JpcHRvcjsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoOworCWludCBpLCByZXQ7CisJaW50IGJhcnJpZXJfZG9uZSA9IDA7CisKKwlpZiAoaXNfam91cm5hbF9hYm9ydGVkKGpvdXJuYWwpKQorCQlyZXR1cm4gMDsKKworCWRlc2NyaXB0b3IgPSBqYmQyX2pvdXJuYWxfZ2V0X2Rlc2NyaXB0b3JfYnVmZmVyKGpvdXJuYWwpOworCWlmICghZGVzY3JpcHRvcikKKwkJcmV0dXJuIDE7CisKKwliaCA9IGpoMmJoKGRlc2NyaXB0b3IpOworCisJLyogQUtQTTogYnVnbGV0IC0gYWRkIGBpJyB0byB0bXAhICovCisJZm9yIChpID0gMDsgaSA8IGJoLT5iX3NpemU7IGkgKz0gNTEyKSB7CisJCWpvdXJuYWxfaGVhZGVyX3QgKnRtcCA9IChqb3VybmFsX2hlYWRlcl90KiliaC0+Yl9kYXRhOworCQl0bXAtPmhfbWFnaWMgPSBjcHVfdG9fYmUzMihKQkQyX01BR0lDX05VTUJFUik7CisJCXRtcC0+aF9ibG9ja3R5cGUgPSBjcHVfdG9fYmUzMihKQkQyX0NPTU1JVF9CTE9DSyk7CisJCXRtcC0+aF9zZXF1ZW5jZSA9IGNwdV90b19iZTMyKGNvbW1pdF90cmFuc2FjdGlvbi0+dF90aWQpOworCX0KKworCUpCVUZGRVJfVFJBQ0UoZGVzY3JpcHRvciwgIndyaXRlIGNvbW1pdCBibG9jayIpOworCXNldF9idWZmZXJfZGlydHkoYmgpOworCWlmIChqb3VybmFsLT5qX2ZsYWdzICYgSkJEMl9CQVJSSUVSKSB7CisJCXNldF9idWZmZXJfb3JkZXJlZChiaCk7CisJCWJhcnJpZXJfZG9uZSA9IDE7CisJfQorCXJldCA9IHN5bmNfZGlydHlfYnVmZmVyKGJoKTsKKwkvKiBpcyBpdCBwb3NzaWJsZSBmb3IgYW5vdGhlciBjb21taXQgdG8gZmFpbCBhdCByb3VnaGx5CisJICogdGhlIHNhbWUgdGltZSBhcyB0aGlzIG9uZT8gIElmIHNvLCB3ZSBkb24ndCB3YW50IHRvCisJICogdHJ1c3QgdGhlIGJhcnJpZXIgZmxhZyBpbiB0aGUgc3VwZXIsIGJ1dCBpbnN0ZWFkIHdhbnQKKwkgKiB0byByZW1lbWJlciBpZiB3ZSBzZW50IGEgYmFycmllciByZXF1ZXN0CisJICovCisJaWYgKHJldCA9PSAtRU9QTk9UU1VQUCAmJiBiYXJyaWVyX2RvbmUpIHsKKwkJY2hhciBiW0JERVZOQU1FX1NJWkVdOworCisJCXByaW50ayhLRVJOX1dBUk5JTkcKKwkJCSJKQkQ6IGJhcnJpZXItYmFzZWQgc3luYyBmYWlsZWQgb24gJXMgLSAiCisJCQkiZGlzYWJsaW5nIGJhcnJpZXJzXG4iLAorCQkJYmRldm5hbWUoam91cm5hbC0+al9kZXYsIGIpKTsKKwkJc3Bpbl9sb2NrKCZqb3VybmFsLT5qX3N0YXRlX2xvY2spOworCQlqb3VybmFsLT5qX2ZsYWdzICY9IH5KQkQyX0JBUlJJRVI7CisJCXNwaW5fdW5sb2NrKCZqb3VybmFsLT5qX3N0YXRlX2xvY2spOworCisJCS8qIEFuZCB0cnkgYWdhaW4sIHdpdGhvdXQgdGhlIGJhcnJpZXIgKi8KKwkJY2xlYXJfYnVmZmVyX29yZGVyZWQoYmgpOworCQlzZXRfYnVmZmVyX3VwdG9kYXRlKGJoKTsKKwkJc2V0X2J1ZmZlcl9kaXJ0eShiaCk7CisJCXJldCA9IHN5bmNfZGlydHlfYnVmZmVyKGJoKTsKKwl9CisJcHV0X2JoKGJoKTsJCS8qIE9uZSBmb3IgZ2V0YmxrKCkgKi8KKwlqYmQyX2pvdXJuYWxfcHV0X2pvdXJuYWxfaGVhZChkZXNjcmlwdG9yKTsKKworCXJldHVybiAocmV0ID09IC1FSU8pOworfQorCitzdGF0aWMgdm9pZCBqb3VybmFsX2RvX3N1Ym1pdF9kYXRhKHN0cnVjdCBidWZmZXJfaGVhZCAqKndidWYsIGludCBidWZzKQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IGJ1ZnM7IGkrKykgeworCQl3YnVmW2ldLT5iX2VuZF9pbyA9IGVuZF9idWZmZXJfd3JpdGVfc3luYzsKKwkJLyogV2UgdXNlLXVwIG91ciBzYWZldHkgcmVmZXJlbmNlIGluIHN1Ym1pdF9iaCgpICovCisJCXN1Ym1pdF9iaChXUklURSwgd2J1ZltpXSk7CisJfQorfQorCisvKgorICogIFN1Ym1pdCBhbGwgdGhlIGRhdGEgYnVmZmVycyB0byBkaXNrCisgKi8KK3N0YXRpYyB2b2lkIGpvdXJuYWxfc3VibWl0X2RhdGFfYnVmZmVycyhqb3VybmFsX3QgKmpvdXJuYWwsCisJCQkJdHJhbnNhY3Rpb25fdCAqY29tbWl0X3RyYW5zYWN0aW9uKQoreworCXN0cnVjdCBqb3VybmFsX2hlYWQgKmpoOworCXN0cnVjdCBidWZmZXJfaGVhZCAqYmg7CisJaW50IGxvY2tlZDsKKwlpbnQgYnVmcyA9IDA7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICoqd2J1ZiA9IGpvdXJuYWwtPmpfd2J1ZjsKKworCS8qCisJICogV2hlbmV2ZXIgd2UgdW5sb2NrIHRoZSBqb3VybmFsIGFuZCBzbGVlcCwgdGhpbmdzIGNhbiBnZXQgYWRkZWQKKwkgKiBvbnRvIC0+dF9zeW5jX2RhdGFsaXN0LCBzbyB3ZSBoYXZlIHRvIGtlZXAgbG9vcGluZyBiYWNrIHRvCisJICogd3JpdGVfb3V0X2RhdGEgdW50aWwgd2UgKmtub3cqIHRoYXQgdGhlIGxpc3QgaXMgZW1wdHkuCisJICoKKwkgKiBDbGVhbnVwIGFueSBmbHVzaGVkIGRhdGEgYnVmZmVycyBmcm9tIHRoZSBkYXRhIGxpc3QuICBFdmVuIGluCisJICogYWJvcnQgbW9kZSwgd2Ugd2FudCB0byBmbHVzaCB0aGlzIG91dCBhcyBzb29uIGFzIHBvc3NpYmxlLgorCSAqLword3JpdGVfb3V0X2RhdGE6CisJY29uZF9yZXNjaGVkKCk7CisJc3Bpbl9sb2NrKCZqb3VybmFsLT5qX2xpc3RfbG9jayk7CisKKwl3aGlsZSAoY29tbWl0X3RyYW5zYWN0aW9uLT50X3N5bmNfZGF0YWxpc3QpIHsKKwkJamggPSBjb21taXRfdHJhbnNhY3Rpb24tPnRfc3luY19kYXRhbGlzdDsKKwkJYmggPSBqaDJiaChqaCk7CisJCWxvY2tlZCA9IDA7CisKKwkJLyogR2V0IHJlZmVyZW5jZSBqdXN0IHRvIG1ha2Ugc3VyZSBidWZmZXIgZG9lcyBub3QgZGlzYXBwZWFyCisJCSAqIHdoZW4gd2UgYXJlIGZvcmNlZCB0byBkcm9wIHZhcmlvdXMgbG9ja3MgKi8KKwkJZ2V0X2JoKGJoKTsKKwkJLyogSWYgdGhlIGJ1ZmZlciBpcyBkaXJ0eSwgd2UgbmVlZCB0byBzdWJtaXQgSU8gYW5kIGhlbmNlCisJCSAqIHdlIG5lZWQgdGhlIGJ1ZmZlciBsb2NrLiBXZSB0cnkgdG8gbG9jayB0aGUgYnVmZmVyIHdpdGhvdXQKKwkJICogYmxvY2tpbmcuIElmIHdlIGZhaWwsIHdlIG5lZWQgdG8gZHJvcCBqX2xpc3RfbG9jayBhbmQgZG8KKwkJICogYmxvY2tpbmcgbG9ja19idWZmZXIoKS4KKwkJICovCisJCWlmIChidWZmZXJfZGlydHkoYmgpKSB7CisJCQlpZiAodGVzdF9zZXRfYnVmZmVyX2xvY2tlZChiaCkpIHsKKwkJCQlCVUZGRVJfVFJBQ0UoYmgsICJuZWVkcyBibG9ja2luZyBsb2NrIik7CisJCQkJc3Bpbl91bmxvY2soJmpvdXJuYWwtPmpfbGlzdF9sb2NrKTsKKwkJCQkvKiBXcml0ZSBvdXQgYWxsIGRhdGEgdG8gcHJldmVudCBkZWFkbG9ja3MgKi8KKwkJCQlqb3VybmFsX2RvX3N1Ym1pdF9kYXRhKHdidWYsIGJ1ZnMpOworCQkJCWJ1ZnMgPSAwOworCQkJCWxvY2tfYnVmZmVyKGJoKTsKKwkJCQlzcGluX2xvY2soJmpvdXJuYWwtPmpfbGlzdF9sb2NrKTsKKwkJCX0KKwkJCWxvY2tlZCA9IDE7CisJCX0KKwkJLyogV2UgaGF2ZSB0byBnZXQgYmhfc3RhdGUgbG9jay4gQWdhaW4gb3V0IG9mIG9yZGVyLCBzaWdoLiAqLworCQlpZiAoIWludmVydGVkX2xvY2soam91cm5hbCwgYmgpKSB7CisJCQlqYmRfbG9ja19iaF9zdGF0ZShiaCk7CisJCQlzcGluX2xvY2soJmpvdXJuYWwtPmpfbGlzdF9sb2NrKTsKKwkJfQorCQkvKiBTb21lb25lIGFscmVhZHkgY2xlYW5lZCB1cCB0aGUgYnVmZmVyPyAqLworCQlpZiAoIWJ1ZmZlcl9qYmQoYmgpCisJCQl8fCBqaC0+Yl90cmFuc2FjdGlvbiAhPSBjb21taXRfdHJhbnNhY3Rpb24KKwkJCXx8IGpoLT5iX2psaXN0ICE9IEJKX1N5bmNEYXRhKSB7CisJCQlqYmRfdW5sb2NrX2JoX3N0YXRlKGJoKTsKKwkJCWlmIChsb2NrZWQpCisJCQkJdW5sb2NrX2J1ZmZlcihiaCk7CisJCQlCVUZGRVJfVFJBQ0UoYmgsICJhbHJlYWR5IGNsZWFuZWQgdXAiKTsKKwkJCXB1dF9iaChiaCk7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAobG9ja2VkICYmIHRlc3RfY2xlYXJfYnVmZmVyX2RpcnR5KGJoKSkgeworCQkJQlVGRkVSX1RSQUNFKGJoLCAibmVlZHMgd3JpdGVvdXQsIGFkZGluZyB0byBhcnJheSIpOworCQkJd2J1ZltidWZzKytdID0gYmg7CisJCQlfX2piZDJfam91cm5hbF9maWxlX2J1ZmZlcihqaCwgY29tbWl0X3RyYW5zYWN0aW9uLAorCQkJCQkJQkpfTG9ja2VkKTsKKwkJCWpiZF91bmxvY2tfYmhfc3RhdGUoYmgpOworCQkJaWYgKGJ1ZnMgPT0gam91cm5hbC0+al93YnVmc2l6ZSkgeworCQkJCXNwaW5fdW5sb2NrKCZqb3VybmFsLT5qX2xpc3RfbG9jayk7CisJCQkJam91cm5hbF9kb19zdWJtaXRfZGF0YSh3YnVmLCBidWZzKTsKKwkJCQlidWZzID0gMDsKKwkJCQlnb3RvIHdyaXRlX291dF9kYXRhOworCQkJfQorCQl9CisJCWVsc2UgeworCQkJQlVGRkVSX1RSQUNFKGJoLCAid3JpdGVvdXQgY29tcGxldGU6IHVuZmlsZSIpOworCQkJX19qYmQyX2pvdXJuYWxfdW5maWxlX2J1ZmZlcihqaCk7CisJCQlqYmRfdW5sb2NrX2JoX3N0YXRlKGJoKTsKKwkJCWlmIChsb2NrZWQpCisJCQkJdW5sb2NrX2J1ZmZlcihiaCk7CisJCQlqYmQyX2pvdXJuYWxfcmVtb3ZlX2pvdXJuYWxfaGVhZChiaCk7CisJCQkvKiBPbmNlIGZvciBvdXIgc2FmZXR5IHJlZmVyZW5jZSwgb25jZSBmb3IKKwkJCSAqIGpiZDJfam91cm5hbF9yZW1vdmVfam91cm5hbF9oZWFkKCkgKi8KKwkJCXB1dF9iaChiaCk7CisJCQlwdXRfYmgoYmgpOworCQl9CisKKwkJaWYgKGxvY2tfbmVlZF9yZXNjaGVkKCZqb3VybmFsLT5qX2xpc3RfbG9jaykpIHsKKwkJCXNwaW5fdW5sb2NrKCZqb3VybmFsLT5qX2xpc3RfbG9jayk7CisJCQlnb3RvIHdyaXRlX291dF9kYXRhOworCQl9CisJfQorCXNwaW5fdW5sb2NrKCZqb3VybmFsLT5qX2xpc3RfbG9jayk7CisJam91cm5hbF9kb19zdWJtaXRfZGF0YSh3YnVmLCBidWZzKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHdyaXRlX3RhZ19ibG9jayhpbnQgdGFnX2J5dGVzLCBqb3VybmFsX2Jsb2NrX3RhZ190ICp0YWcsCisJCQkJICAgdW5zaWduZWQgbG9uZyBsb25nIGJsb2NrKQoreworCXRhZy0+dF9ibG9ja25yID0gY3B1X3RvX2JlMzIoYmxvY2sgJiAodTMyKX4wKTsKKwlpZiAodGFnX2J5dGVzID4gSkJEX1RBR19TSVpFMzIpCisJCXRhZy0+dF9ibG9ja25yX2hpZ2ggPSBjcHVfdG9fYmUzMigoYmxvY2sgPj4gMzEpID4+IDEpOworfQorCisvKgorICogamJkMl9qb3VybmFsX2NvbW1pdF90cmFuc2FjdGlvbgorICoKKyAqIFRoZSBwcmltYXJ5IGZ1bmN0aW9uIGZvciBjb21taXR0aW5nIGEgdHJhbnNhY3Rpb24gdG8gdGhlIGxvZy4gIFRoaXMKKyAqIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSB0aGUgam91cm5hbCB0aHJlYWQgdG8gYmVnaW4gYSBjb21wbGV0ZSBjb21taXQuCisgKi8KK3ZvaWQgamJkMl9qb3VybmFsX2NvbW1pdF90cmFuc2FjdGlvbihqb3VybmFsX3QgKmpvdXJuYWwpCit7CisJdHJhbnNhY3Rpb25fdCAqY29tbWl0X3RyYW5zYWN0aW9uOworCXN0cnVjdCBqb3VybmFsX2hlYWQgKmpoLCAqbmV3X2poLCAqZGVzY3JpcHRvcjsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKip3YnVmID0gam91cm5hbC0+al93YnVmOworCWludCBidWZzOworCWludCBmbGFnczsKKwlpbnQgZXJyOworCXVuc2lnbmVkIGxvbmcgbG9uZyBibG9ja25yOworCWNoYXIgKnRhZ3AgPSBOVUxMOworCWpvdXJuYWxfaGVhZGVyX3QgKmhlYWRlcjsKKwlqb3VybmFsX2Jsb2NrX3RhZ190ICp0YWcgPSBOVUxMOworCWludCBzcGFjZV9sZWZ0ID0gMDsKKwlpbnQgZmlyc3RfdGFnID0gMDsKKwlpbnQgdGFnX2ZsYWc7CisJaW50IGk7CisJaW50IHRhZ19ieXRlcyA9IGpvdXJuYWxfdGFnX2J5dGVzKGpvdXJuYWwpOworCisJLyoKKwkgKiBGaXJzdCBqb2I6IGxvY2sgZG93biB0aGUgY3VycmVudCB0cmFuc2FjdGlvbiBhbmQgd2FpdCBmb3IKKwkgKiBhbGwgb3V0c3RhbmRpbmcgdXBkYXRlcyB0byBjb21wbGV0ZS4KKwkgKi8KKworI2lmZGVmIENPTU1JVF9TVEFUUworCXNwaW5fbG9jaygmam91cm5hbC0+al9saXN0X2xvY2spOworCXN1bW1hcmlzZV9qb3VybmFsX3VzYWdlKGpvdXJuYWwpOworCXNwaW5fdW5sb2NrKCZqb3VybmFsLT5qX2xpc3RfbG9jayk7CisjZW5kaWYKKworCS8qIERvIHdlIG5lZWQgdG8gZXJhc2UgdGhlIGVmZmVjdHMgb2YgYSBwcmlvciBqYmQyX2pvdXJuYWxfZmx1c2g/ICovCisJaWYgKGpvdXJuYWwtPmpfZmxhZ3MgJiBKQkQyX0ZMVVNIRUQpIHsKKwkJamJkX2RlYnVnKDMsICJzdXBlciBibG9jayB1cGRhdGVkXG4iKTsKKwkJamJkMl9qb3VybmFsX3VwZGF0ZV9zdXBlcmJsb2NrKGpvdXJuYWwsIDEpOworCX0gZWxzZSB7CisJCWpiZF9kZWJ1ZygzLCAic3VwZXJibG9jayBub3QgdXBkYXRlZFxuIik7CisJfQorCisJSl9BU1NFUlQoam91cm5hbC0+al9ydW5uaW5nX3RyYW5zYWN0aW9uICE9IE5VTEwpOworCUpfQVNTRVJUKGpvdXJuYWwtPmpfY29tbWl0dGluZ190cmFuc2FjdGlvbiA9PSBOVUxMKTsKKworCWNvbW1pdF90cmFuc2FjdGlvbiA9IGpvdXJuYWwtPmpfcnVubmluZ190cmFuc2FjdGlvbjsKKwlKX0FTU0VSVChjb21taXRfdHJhbnNhY3Rpb24tPnRfc3RhdGUgPT0gVF9SVU5OSU5HKTsKKworCWpiZF9kZWJ1ZygxLCAiSkJEOiBzdGFydGluZyBjb21taXQgb2YgdHJhbnNhY3Rpb24gJWRcbiIsCisJCQljb21taXRfdHJhbnNhY3Rpb24tPnRfdGlkKTsKKworCXNwaW5fbG9jaygmam91cm5hbC0+al9zdGF0ZV9sb2NrKTsKKwljb21taXRfdHJhbnNhY3Rpb24tPnRfc3RhdGUgPSBUX0xPQ0tFRDsKKworCXNwaW5fbG9jaygmY29tbWl0X3RyYW5zYWN0aW9uLT50X2hhbmRsZV9sb2NrKTsKKwl3aGlsZSAoY29tbWl0X3RyYW5zYWN0aW9uLT50X3VwZGF0ZXMpIHsKKwkJREVGSU5FX1dBSVQod2FpdCk7CisKKwkJcHJlcGFyZV90b193YWl0KCZqb3VybmFsLT5qX3dhaXRfdXBkYXRlcywgJndhaXQsCisJCQkJCVRBU0tfVU5JTlRFUlJVUFRJQkxFKTsKKwkJaWYgKGNvbW1pdF90cmFuc2FjdGlvbi0+dF91cGRhdGVzKSB7CisJCQlzcGluX3VubG9jaygmY29tbWl0X3RyYW5zYWN0aW9uLT50X2hhbmRsZV9sb2NrKTsKKwkJCXNwaW5fdW5sb2NrKCZqb3VybmFsLT5qX3N0YXRlX2xvY2spOworCQkJc2NoZWR1bGUoKTsKKwkJCXNwaW5fbG9jaygmam91cm5hbC0+al9zdGF0ZV9sb2NrKTsKKwkJCXNwaW5fbG9jaygmY29tbWl0X3RyYW5zYWN0aW9uLT50X2hhbmRsZV9sb2NrKTsKKwkJfQorCQlmaW5pc2hfd2FpdCgmam91cm5hbC0+al93YWl0X3VwZGF0ZXMsICZ3YWl0KTsKKwl9CisJc3Bpbl91bmxvY2soJmNvbW1pdF90cmFuc2FjdGlvbi0+dF9oYW5kbGVfbG9jayk7CisKKwlKX0FTU0VSVCAoY29tbWl0X3RyYW5zYWN0aW9uLT50X291dHN0YW5kaW5nX2NyZWRpdHMgPD0KKwkJCWpvdXJuYWwtPmpfbWF4X3RyYW5zYWN0aW9uX2J1ZmZlcnMpOworCisJLyoKKwkgKiBGaXJzdCB0aGluZyB3ZSBhcmUgYWxsb3dlZCB0byBkbyBpcyB0byBkaXNjYXJkIGFueSByZW1haW5pbmcKKwkgKiBCSl9SZXNlcnZlZCBidWZmZXJzLiAgTm90ZSwgaXQgaXMgX25vdF8gcGVybWlzc2libGUgdG8gYXNzdW1lCisJICogdGhhdCB0aGVyZSBhcmUgbm8gc3VjaCBidWZmZXJzOiBpZiBhIGxhcmdlIGZpbGVzeXN0ZW0KKwkgKiBvcGVyYXRpb24gbGlrZSBhIHRydW5jYXRlIG5lZWRzIHRvIHNwbGl0IGl0c2VsZiBvdmVyIG11bHRpcGxlCisJICogdHJhbnNhY3Rpb25zLCB0aGVuIGl0IG1heSB0cnkgdG8gZG8gYSBqYmQyX2pvdXJuYWxfcmVzdGFydCgpIHdoaWxlCisJICogdGhlcmUgYXJlIHN0aWxsIEJKX1Jlc2VydmVkIGJ1ZmZlcnMgb3V0c3RhbmRpbmcuICBUaGVzZSBtdXN0CisJICogYmUgcmVsZWFzZWQgY2xlYW5seSBmcm9tIHRoZSBjdXJyZW50IHRyYW5zYWN0aW9uLgorCSAqCisJICogSW4gdGhpcyBjYXNlLCB0aGUgZmlsZXN5c3RlbSBtdXN0IHN0aWxsIHJlc2VydmUgd3JpdGUgYWNjZXNzCisJICogYWdhaW4gYmVmb3JlIG1vZGlmeWluZyB0aGUgYnVmZmVyIGluIHRoZSBuZXcgdHJhbnNhY3Rpb24sIGJ1dAorCSAqIHdlIGRvIG5vdCByZXF1aXJlIGl0IHRvIHJlbWVtYmVyIGV4YWN0bHkgd2hpY2ggb2xkIGJ1ZmZlcnMgaXQKKwkgKiBoYXMgcmVzZXJ2ZWQuICBUaGlzIGlzIGNvbnNpc3RlbnQgd2l0aCB0aGUgZXhpc3RpbmcgYmVoYXZpb3VyCisJICogdGhhdCBtdWx0aXBsZSBqYmQyX2pvdXJuYWxfZ2V0X3dyaXRlX2FjY2VzcygpIGNhbGxzIHRvIHRoZSBzYW1lCisJICogYnVmZmVyIGFyZSBwZXJmZWN0bHkgcGVybWlzc2FibGUuCisJICovCisJd2hpbGUgKGNvbW1pdF90cmFuc2FjdGlvbi0+dF9yZXNlcnZlZF9saXN0KSB7CisJCWpoID0gY29tbWl0X3RyYW5zYWN0aW9uLT50X3Jlc2VydmVkX2xpc3Q7CisJCUpCVUZGRVJfVFJBQ0UoamgsICJyZXNlcnZlZCwgdW51c2VkOiByZWZpbGUiKTsKKwkJLyoKKwkJICogQSBqYmQyX2pvdXJuYWxfZ2V0X3VuZG9fYWNjZXNzKCkramJkMl9qb3VybmFsX3JlbGVhc2VfYnVmZmVyKCkgbWF5CisJCSAqIGxlYXZlIHVuZG8tY29tbWl0dGVkIGRhdGEuCisJCSAqLworCQlpZiAoamgtPmJfY29tbWl0dGVkX2RhdGEpIHsKKwkJCXN0cnVjdCBidWZmZXJfaGVhZCAqYmggPSBqaDJiaChqaCk7CisKKwkJCWpiZF9sb2NrX2JoX3N0YXRlKGJoKTsKKwkJCWpiZDJfc2xhYl9mcmVlKGpoLT5iX2NvbW1pdHRlZF9kYXRhLCBiaC0+Yl9zaXplKTsKKwkJCWpoLT5iX2NvbW1pdHRlZF9kYXRhID0gTlVMTDsKKwkJCWpiZF91bmxvY2tfYmhfc3RhdGUoYmgpOworCQl9CisJCWpiZDJfam91cm5hbF9yZWZpbGVfYnVmZmVyKGpvdXJuYWwsIGpoKTsKKwl9CisKKwkvKgorCSAqIE5vdyB0cnkgdG8gZHJvcCBhbnkgd3JpdHRlbi1iYWNrIGJ1ZmZlcnMgZnJvbSB0aGUgam91cm5hbCdzCisJICogY2hlY2twb2ludCBsaXN0cy4gIFdlIGRvIHRoaXMgKmJlZm9yZSogY29tbWl0IGJlY2F1c2UgaXQgcG90ZW50aWFsbHkKKwkgKiBmcmVlcyBzb21lIG1lbW9yeQorCSAqLworCXNwaW5fbG9jaygmam91cm5hbC0+al9saXN0X2xvY2spOworCV9famJkMl9qb3VybmFsX2NsZWFuX2NoZWNrcG9pbnRfbGlzdChqb3VybmFsKTsKKwlzcGluX3VubG9jaygmam91cm5hbC0+al9saXN0X2xvY2spOworCisJamJkX2RlYnVnICgzLCAiSkJEOiBjb21taXQgcGhhc2UgMVxuIik7CisKKwkvKgorCSAqIFN3aXRjaCB0byBhIG5ldyByZXZva2UgdGFibGUuCisJICovCisJamJkMl9qb3VybmFsX3N3aXRjaF9yZXZva2VfdGFibGUoam91cm5hbCk7CisKKwljb21taXRfdHJhbnNhY3Rpb24tPnRfc3RhdGUgPSBUX0ZMVVNIOworCWpvdXJuYWwtPmpfY29tbWl0dGluZ190cmFuc2FjdGlvbiA9IGNvbW1pdF90cmFuc2FjdGlvbjsKKwlqb3VybmFsLT5qX3J1bm5pbmdfdHJhbnNhY3Rpb24gPSBOVUxMOworCWNvbW1pdF90cmFuc2FjdGlvbi0+dF9sb2dfc3RhcnQgPSBqb3VybmFsLT5qX2hlYWQ7CisJd2FrZV91cCgmam91cm5hbC0+al93YWl0X3RyYW5zYWN0aW9uX2xvY2tlZCk7CisJc3Bpbl91bmxvY2soJmpvdXJuYWwtPmpfc3RhdGVfbG9jayk7CisKKwlqYmRfZGVidWcgKDMsICJKQkQ6IGNvbW1pdCBwaGFzZSAyXG4iKTsKKworCS8qCisJICogRmlyc3QsIGRyb3AgbW9kaWZpZWQgZmxhZzogYWxsIGFjY2Vzc2VzIHRvIHRoZSBidWZmZXJzCisJICogd2lsbCBiZSB0cmFja2VkIGZvciBhIG5ldyB0cmFzYWN0aW9uIG9ubHkgLWJ6enoKKwkgKi8KKwlzcGluX2xvY2soJmpvdXJuYWwtPmpfbGlzdF9sb2NrKTsKKwlpZiAoY29tbWl0X3RyYW5zYWN0aW9uLT50X2J1ZmZlcnMpIHsKKwkJbmV3X2poID0gamggPSBjb21taXRfdHJhbnNhY3Rpb24tPnRfYnVmZmVycy0+Yl90bmV4dDsKKwkJZG8geworCQkJSl9BU1NFUlRfSkgobmV3X2poLCBuZXdfamgtPmJfbW9kaWZpZWQgPT0gMSB8fAorCQkJCQluZXdfamgtPmJfbW9kaWZpZWQgPT0gMCk7CisJCQluZXdfamgtPmJfbW9kaWZpZWQgPSAwOworCQkJbmV3X2poID0gbmV3X2poLT5iX3RuZXh0OworCQl9IHdoaWxlIChuZXdfamggIT0gamgpOworCX0KKwlzcGluX3VubG9jaygmam91cm5hbC0+al9saXN0X2xvY2spOworCisJLyoKKwkgKiBOb3cgc3RhcnQgZmx1c2hpbmcgdGhpbmdzIHRvIGRpc2ssIGluIHRoZSBvcmRlciB0aGV5IGFwcGVhcgorCSAqIG9uIHRoZSB0cmFuc2FjdGlvbiBsaXN0cy4gIERhdGEgYmxvY2tzIGdvIGZpcnN0LgorCSAqLworCWVyciA9IDA7CisJam91cm5hbF9zdWJtaXRfZGF0YV9idWZmZXJzKGpvdXJuYWwsIGNvbW1pdF90cmFuc2FjdGlvbik7CisKKwkvKgorCSAqIFdhaXQgZm9yIGFsbCBwcmV2aW91c2x5IHN1Ym1pdHRlZCBJTyB0byBjb21wbGV0ZS4KKwkgKi8KKwlzcGluX2xvY2soJmpvdXJuYWwtPmpfbGlzdF9sb2NrKTsKKwl3aGlsZSAoY29tbWl0X3RyYW5zYWN0aW9uLT50X2xvY2tlZF9saXN0KSB7CisJCXN0cnVjdCBidWZmZXJfaGVhZCAqYmg7CisKKwkJamggPSBjb21taXRfdHJhbnNhY3Rpb24tPnRfbG9ja2VkX2xpc3QtPmJfdHByZXY7CisJCWJoID0gamgyYmgoamgpOworCQlnZXRfYmgoYmgpOworCQlpZiAoYnVmZmVyX2xvY2tlZChiaCkpIHsKKwkJCXNwaW5fdW5sb2NrKCZqb3VybmFsLT5qX2xpc3RfbG9jayk7CisJCQl3YWl0X29uX2J1ZmZlcihiaCk7CisJCQlpZiAodW5saWtlbHkoIWJ1ZmZlcl91cHRvZGF0ZShiaCkpKQorCQkJCWVyciA9IC1FSU87CisJCQlzcGluX2xvY2soJmpvdXJuYWwtPmpfbGlzdF9sb2NrKTsKKwkJfQorCQlpZiAoIWludmVydGVkX2xvY2soam91cm5hbCwgYmgpKSB7CisJCQlwdXRfYmgoYmgpOworCQkJc3Bpbl9sb2NrKCZqb3VybmFsLT5qX2xpc3RfbG9jayk7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAoYnVmZmVyX2piZChiaCkgJiYgamgtPmJfamxpc3QgPT0gQkpfTG9ja2VkKSB7CisJCQlfX2piZDJfam91cm5hbF91bmZpbGVfYnVmZmVyKGpoKTsKKwkJCWpiZF91bmxvY2tfYmhfc3RhdGUoYmgpOworCQkJamJkMl9qb3VybmFsX3JlbW92ZV9qb3VybmFsX2hlYWQoYmgpOworCQkJcHV0X2JoKGJoKTsKKwkJfSBlbHNlIHsKKwkJCWpiZF91bmxvY2tfYmhfc3RhdGUoYmgpOworCQl9CisJCXB1dF9iaChiaCk7CisJCWNvbmRfcmVzY2hlZF9sb2NrKCZqb3VybmFsLT5qX2xpc3RfbG9jayk7CisJfQorCXNwaW5fdW5sb2NrKCZqb3VybmFsLT5qX2xpc3RfbG9jayk7CisKKwlpZiAoZXJyKQorCQlfX2piZDJfam91cm5hbF9hYm9ydF9oYXJkKGpvdXJuYWwpOworCisJamJkMl9qb3VybmFsX3dyaXRlX3Jldm9rZV9yZWNvcmRzKGpvdXJuYWwsIGNvbW1pdF90cmFuc2FjdGlvbik7CisKKwlqYmRfZGVidWcoMywgIkpCRDogY29tbWl0IHBoYXNlIDJcbiIpOworCisJLyoKKwkgKiBJZiB3ZSBmb3VuZCBhbnkgZGlydHkgb3IgbG9ja2VkIGJ1ZmZlcnMsIHRoZW4gd2Ugc2hvdWxkIGhhdmUKKwkgKiBsb29wZWQgYmFjayB1cCB0byB0aGUgd3JpdGVfb3V0X2RhdGEgbGFiZWwuICBJZiB0aGVyZSB3ZXJlbid0CisJICogYW55IHRoZW4gam91cm5hbF9jbGVhbl9kYXRhX2xpc3Qgc2hvdWxkIGhhdmUgd2lwZWQgdGhlIGxpc3QKKwkgKiBjbGVhbiBieSBub3csIHNvIGNoZWNrIHRoYXQgaXQgaXMgaW4gZmFjdCBlbXB0eS4KKwkgKi8KKwlKX0FTU0VSVCAoY29tbWl0X3RyYW5zYWN0aW9uLT50X3N5bmNfZGF0YWxpc3QgPT0gTlVMTCk7CisKKwlqYmRfZGVidWcgKDMsICJKQkQ6IGNvbW1pdCBwaGFzZSAzXG4iKTsKKworCS8qCisJICogV2F5IHRvIGdvOiB3ZSBoYXZlIG5vdyB3cml0dGVuIG91dCBhbGwgb2YgdGhlIGRhdGEgZm9yIGEKKwkgKiB0cmFuc2FjdGlvbiEgIE5vdyBjb21lcyB0aGUgdHJpY2t5IHBhcnQ6IHdlIG5lZWQgdG8gd3JpdGUgb3V0CisJICogbWV0YWRhdGEuICBMb29wIG92ZXIgdGhlIHRyYW5zYWN0aW9uJ3MgZW50aXJlIGJ1ZmZlciBsaXN0OgorCSAqLworCWNvbW1pdF90cmFuc2FjdGlvbi0+dF9zdGF0ZSA9IFRfQ09NTUlUOworCisJZGVzY3JpcHRvciA9IE5VTEw7CisJYnVmcyA9IDA7CisJd2hpbGUgKGNvbW1pdF90cmFuc2FjdGlvbi0+dF9idWZmZXJzKSB7CisKKwkJLyogRmluZCB0aGUgbmV4dCBidWZmZXIgdG8gYmUgam91cm5hbGVkLi4uICovCisKKwkJamggPSBjb21taXRfdHJhbnNhY3Rpb24tPnRfYnVmZmVyczsKKworCQkvKiBJZiB3ZSdyZSBpbiBhYm9ydCBtb2RlLCB3ZSBqdXN0IHVuLWpvdXJuYWwgdGhlIGJ1ZmZlciBhbmQKKwkJICAgcmVsZWFzZSBpdCBmb3IgYmFja2dyb3VuZCB3cml0aW5nLiAqLworCisJCWlmIChpc19qb3VybmFsX2Fib3J0ZWQoam91cm5hbCkpIHsKKwkJCUpCVUZGRVJfVFJBQ0UoamgsICJqb3VybmFsIGlzIGFib3J0aW5nOiByZWZpbGUiKTsKKwkJCWpiZDJfam91cm5hbF9yZWZpbGVfYnVmZmVyKGpvdXJuYWwsIGpoKTsKKwkJCS8qIElmIHRoYXQgd2FzIHRoZSBsYXN0IG9uZSwgd2UgbmVlZCB0byBjbGVhbiB1cAorCQkJICogYW55IGRlc2NyaXB0b3IgYnVmZmVycyB3aGljaCBtYXkgaGF2ZSBiZWVuCisJCQkgKiBhbHJlYWR5IGFsbG9jYXRlZCwgZXZlbiBpZiB3ZSBhcmUgbm93CisJCQkgKiBhYm9ydGluZy4gKi8KKwkJCWlmICghY29tbWl0X3RyYW5zYWN0aW9uLT50X2J1ZmZlcnMpCisJCQkJZ290byBzdGFydF9qb3VybmFsX2lvOworCQkJY29udGludWU7CisJCX0KKworCQkvKiBNYWtlIHN1cmUgd2UgaGF2ZSBhIGRlc2NyaXB0b3IgYmxvY2sgaW4gd2hpY2ggdG8KKwkJICAgcmVjb3JkIHRoZSBtZXRhZGF0YSBidWZmZXIuICovCisKKwkJaWYgKCFkZXNjcmlwdG9yKSB7CisJCQlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoOworCisJCQlKX0FTU0VSVCAoYnVmcyA9PSAwKTsKKworCQkJamJkX2RlYnVnKDQsICJKQkQ6IGdldCBkZXNjcmlwdG9yXG4iKTsKKworCQkJZGVzY3JpcHRvciA9IGpiZDJfam91cm5hbF9nZXRfZGVzY3JpcHRvcl9idWZmZXIoam91cm5hbCk7CisJCQlpZiAoIWRlc2NyaXB0b3IpIHsKKwkJCQlfX2piZDJfam91cm5hbF9hYm9ydF9oYXJkKGpvdXJuYWwpOworCQkJCWNvbnRpbnVlOworCQkJfQorCisJCQliaCA9IGpoMmJoKGRlc2NyaXB0b3IpOworCQkJamJkX2RlYnVnKDQsICJKQkQ6IGdvdCBidWZmZXIgJWxsdSAoJXApXG4iLAorCQkJCSh1bnNpZ25lZCBsb25nIGxvbmcpYmgtPmJfYmxvY2tuciwgYmgtPmJfZGF0YSk7CisJCQloZWFkZXIgPSAoam91cm5hbF9oZWFkZXJfdCAqKSZiaC0+Yl9kYXRhWzBdOworCQkJaGVhZGVyLT5oX21hZ2ljICAgICA9IGNwdV90b19iZTMyKEpCRDJfTUFHSUNfTlVNQkVSKTsKKwkJCWhlYWRlci0+aF9ibG9ja3R5cGUgPSBjcHVfdG9fYmUzMihKQkQyX0RFU0NSSVBUT1JfQkxPQ0spOworCQkJaGVhZGVyLT5oX3NlcXVlbmNlICA9IGNwdV90b19iZTMyKGNvbW1pdF90cmFuc2FjdGlvbi0+dF90aWQpOworCisJCQl0YWdwID0gJmJoLT5iX2RhdGFbc2l6ZW9mKGpvdXJuYWxfaGVhZGVyX3QpXTsKKwkJCXNwYWNlX2xlZnQgPSBiaC0+Yl9zaXplIC0gc2l6ZW9mKGpvdXJuYWxfaGVhZGVyX3QpOworCQkJZmlyc3RfdGFnID0gMTsKKwkJCXNldF9idWZmZXJfandyaXRlKGJoKTsKKwkJCXNldF9idWZmZXJfZGlydHkoYmgpOworCQkJd2J1ZltidWZzKytdID0gYmg7CisKKwkJCS8qIFJlY29yZCBpdCBzbyB0aGF0IHdlIGNhbiB3YWl0IGZvciBJTworICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcGxldGlvbiBsYXRlciAqLworCQkJQlVGRkVSX1RSQUNFKGJoLCAicGgzOiBmaWxlIGFzIGRlc2NyaXB0b3IiKTsKKwkJCWpiZDJfam91cm5hbF9maWxlX2J1ZmZlcihkZXNjcmlwdG9yLCBjb21taXRfdHJhbnNhY3Rpb24sCisJCQkJCUJKX0xvZ0N0bCk7CisJCX0KKworCQkvKiBXaGVyZSBpcyB0aGUgYnVmZmVyIHRvIGJlIHdyaXR0ZW4/ICovCisKKwkJZXJyID0gamJkMl9qb3VybmFsX25leHRfbG9nX2Jsb2NrKGpvdXJuYWwsICZibG9ja25yKTsKKwkJLyogSWYgdGhlIGJsb2NrIG1hcHBpbmcgZmFpbGVkLCBqdXN0IGFiYW5kb24gdGhlIGJ1ZmZlcgorCQkgICBhbmQgcmVwZWF0IHRoaXMgbG9vcDogd2UnbGwgZmFsbCBpbnRvIHRoZQorCQkgICByZWZpbGUtb24tYWJvcnQgY29uZGl0aW9uIGFib3ZlLiAqLworCQlpZiAoZXJyKSB7CisJCQlfX2piZDJfam91cm5hbF9hYm9ydF9oYXJkKGpvdXJuYWwpOworCQkJY29udGludWU7CisJCX0KKworCQkvKgorCQkgKiBzdGFydF90aGlzX2hhbmRsZSgpIHVzZXMgdF9vdXRzdGFuZGluZ19jcmVkaXRzIHRvIGRldGVybWluZQorCQkgKiB0aGUgZnJlZSBzcGFjZSBpbiB0aGUgbG9nLCBidXQgdGhpcyBjb3VudGVyIGlzIGNoYW5nZWQKKwkJICogYnkgamJkMl9qb3VybmFsX25leHRfbG9nX2Jsb2NrKCkgYWxzby4KKwkJICovCisJCWNvbW1pdF90cmFuc2FjdGlvbi0+dF9vdXRzdGFuZGluZ19jcmVkaXRzLS07CisKKwkJLyogQnVtcCBiX2NvdW50IHRvIHByZXZlbnQgdHJ1bmNhdGUgZnJvbSBzdHVtYmxpbmcgb3ZlcgorICAgICAgICAgICAgICAgICAgIHRoZSBzaGFkb3dlZCBidWZmZXIhICBAQEAgVGhpcyBjYW4gZ28gaWYgd2UgZXZlciBnZXQKKyAgICAgICAgICAgICAgICAgICByaWQgb2YgdGhlIEJKX0lPL0JKX1NoYWRvdyBwYWlyaW5nIG9mIGJ1ZmZlcnMuICovCisJCWF0b21pY19pbmMoJmpoMmJoKGpoKS0+Yl9jb3VudCk7CisKKwkJLyogTWFrZSBhIHRlbXBvcmFyeSBJTyBidWZmZXIgd2l0aCB3aGljaCB0byB3cml0ZSBpdCBvdXQKKyAgICAgICAgICAgICAgICAgICAodGhpcyB3aWxsIHJlcXVldWUgYm90aCB0aGUgbWV0YWRhdGEgYnVmZmVyIGFuZCB0aGUKKyAgICAgICAgICAgICAgICAgICB0ZW1wb3JhcnkgSU8gYnVmZmVyKS4gbmV3X2JoIGdvZXMgb24gQkpfSU8qLworCisJCXNldF9iaXQoQkhfSldyaXRlLCAmamgyYmgoamgpLT5iX3N0YXRlKTsKKwkJLyoKKwkJICogYWtwbTogamJkMl9qb3VybmFsX3dyaXRlX21ldGFkYXRhX2J1ZmZlcigpIHNldHMKKwkJICogbmV3X2JoLT5iX3RyYW5zYWN0aW9uIHRvIGNvbW1pdF90cmFuc2FjdGlvbi4KKwkJICogV2UgbmVlZCB0byBjbGVhbiB0aGlzIHVwIGJlZm9yZSB3ZSByZWxlYXNlIG5ld19iaAorCQkgKiAod2hpY2ggaXMgb2YgdHlwZSBCSl9JTykKKwkJICovCisJCUpCVUZGRVJfVFJBQ0UoamgsICJwaDM6IHdyaXRlIG1ldGFkYXRhIik7CisJCWZsYWdzID0gamJkMl9qb3VybmFsX3dyaXRlX21ldGFkYXRhX2J1ZmZlcihjb21taXRfdHJhbnNhY3Rpb24sCisJCQkJCQkgICAgICBqaCwgJm5ld19qaCwgYmxvY2tucik7CisJCXNldF9iaXQoQkhfSldyaXRlLCAmamgyYmgobmV3X2poKS0+Yl9zdGF0ZSk7CisJCXdidWZbYnVmcysrXSA9IGpoMmJoKG5ld19qaCk7CisKKwkJLyogUmVjb3JkIHRoZSBuZXcgYmxvY2sncyB0YWcgaW4gdGhlIGN1cnJlbnQgZGVzY3JpcHRvcgorICAgICAgICAgICAgICAgICAgIGJ1ZmZlciAqLworCisJCXRhZ19mbGFnID0gMDsKKwkJaWYgKGZsYWdzICYgMSkKKwkJCXRhZ19mbGFnIHw9IEpCRDJfRkxBR19FU0NBUEU7CisJCWlmICghZmlyc3RfdGFnKQorCQkJdGFnX2ZsYWcgfD0gSkJEMl9GTEFHX1NBTUVfVVVJRDsKKworCQl0YWcgPSAoam91cm5hbF9ibG9ja190YWdfdCAqKSB0YWdwOworCQl3cml0ZV90YWdfYmxvY2sodGFnX2J5dGVzLCB0YWcsIGpoMmJoKGpoKS0+Yl9ibG9ja25yKTsKKwkJdGFnLT50X2ZsYWdzID0gY3B1X3RvX2JlMzIodGFnX2ZsYWcpOworCQl0YWdwICs9IHRhZ19ieXRlczsKKwkJc3BhY2VfbGVmdCAtPSB0YWdfYnl0ZXM7CisKKwkJaWYgKGZpcnN0X3RhZykgeworCQkJbWVtY3B5ICh0YWdwLCBqb3VybmFsLT5qX3V1aWQsIDE2KTsKKwkJCXRhZ3AgKz0gMTY7CisJCQlzcGFjZV9sZWZ0IC09IDE2OworCQkJZmlyc3RfdGFnID0gMDsKKwkJfQorCisJCS8qIElmIHRoZXJlJ3Mgbm8gbW9yZSB0byBkbywgb3IgaWYgdGhlIGRlc2NyaXB0b3IgaXMgZnVsbCwKKwkJICAgbGV0IHRoZSBJTyByaXAhICovCisKKwkJaWYgKGJ1ZnMgPT0gam91cm5hbC0+al93YnVmc2l6ZSB8fAorCQkgICAgY29tbWl0X3RyYW5zYWN0aW9uLT50X2J1ZmZlcnMgPT0gTlVMTCB8fAorCQkgICAgc3BhY2VfbGVmdCA8IHRhZ19ieXRlcyArIDE2KSB7CisKKwkJCWpiZF9kZWJ1Zyg0LCAiSkJEOiBTdWJtaXQgJWQgSU9zXG4iLCBidWZzKTsKKworCQkJLyogV3JpdGUgYW4gZW5kLW9mLWRlc2NyaXB0b3IgbWFya2VyIGJlZm9yZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VibWl0dGluZyB0aGUgSU9zLiAgInRhZyIgc3RpbGwgcG9pbnRzIHRvCisgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgbGFzdCB0YWcgd2Ugc2V0IHVwLiAqLworCisJCQl0YWctPnRfZmxhZ3MgfD0gY3B1X3RvX2JlMzIoSkJEMl9GTEFHX0xBU1RfVEFHKTsKKworc3RhcnRfam91cm5hbF9pbzoKKwkJCWZvciAoaSA9IDA7IGkgPCBidWZzOyBpKyspIHsKKwkJCQlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoID0gd2J1ZltpXTsKKwkJCQlsb2NrX2J1ZmZlcihiaCk7CisJCQkJY2xlYXJfYnVmZmVyX2RpcnR5KGJoKTsKKwkJCQlzZXRfYnVmZmVyX3VwdG9kYXRlKGJoKTsKKwkJCQliaC0+Yl9lbmRfaW8gPSBqb3VybmFsX2VuZF9idWZmZXJfaW9fc3luYzsKKwkJCQlzdWJtaXRfYmgoV1JJVEUsIGJoKTsKKwkJCX0KKwkJCWNvbmRfcmVzY2hlZCgpOworCisJCQkvKiBGb3JjZSBhIG5ldyBkZXNjcmlwdG9yIHRvIGJlIGdlbmVyYXRlZCBuZXh0CisgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lIHJvdW5kIHRoZSBsb29wLiAqLworCQkJZGVzY3JpcHRvciA9IE5VTEw7CisJCQlidWZzID0gMDsKKwkJfQorCX0KKworCS8qIExvIGFuZCBiZWhvbGQ6IHdlIGhhdmUganVzdCBtYW5hZ2VkIHRvIHNlbmQgYSB0cmFuc2FjdGlvbiB0bworICAgICAgICAgICB0aGUgbG9nLiAgQmVmb3JlIHdlIGNhbiBjb21taXQgaXQsIHdhaXQgZm9yIHRoZSBJTyBzbyBmYXIgdG8KKyAgICAgICAgICAgY29tcGxldGUuICBDb250cm9sIGJ1ZmZlcnMgYmVpbmcgd3JpdHRlbiBhcmUgb24gdGhlCisgICAgICAgICAgIHRyYW5zYWN0aW9uJ3MgdF9sb2dfbGlzdCBxdWV1ZSwgYW5kIG1ldGFkYXRhIGJ1ZmZlcnMgYXJlIG9uCisgICAgICAgICAgIHRoZSB0X2lvYnVmX2xpc3QgcXVldWUuCisKKwkgICBXYWl0IGZvciB0aGUgYnVmZmVycyBpbiByZXZlcnNlIG9yZGVyLiAgVGhhdCB3YXkgd2UgYXJlCisJICAgbGVzcyBsaWtlbHkgdG8gYmUgd29rZW4gdXAgdW50aWwgYWxsIElPcyBoYXZlIGNvbXBsZXRlZCwgYW5kCisJICAgc28gd2UgaW5jdXIgbGVzcyBzY2hlZHVsaW5nIGxvYWQuCisJKi8KKworCWpiZF9kZWJ1ZygzLCAiSkJEOiBjb21taXQgcGhhc2UgNFxuIik7CisKKwkvKgorCSAqIGFrcG06IHRoZXNlIGFyZSBCSl9JTywgYW5kIGpfbGlzdF9sb2NrIGlzIG5vdCBuZWVkZWQuCisJICogU2VlIF9fam91cm5hbF90cnlfdG9fZnJlZV9idWZmZXIuCisJICovCit3YWl0X2Zvcl9pb2J1ZjoKKwl3aGlsZSAoY29tbWl0X3RyYW5zYWN0aW9uLT50X2lvYnVmX2xpc3QgIT0gTlVMTCkgeworCQlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoOworCisJCWpoID0gY29tbWl0X3RyYW5zYWN0aW9uLT50X2lvYnVmX2xpc3QtPmJfdHByZXY7CisJCWJoID0gamgyYmgoamgpOworCQlpZiAoYnVmZmVyX2xvY2tlZChiaCkpIHsKKwkJCXdhaXRfb25fYnVmZmVyKGJoKTsKKwkJCWdvdG8gd2FpdF9mb3JfaW9idWY7CisJCX0KKwkJaWYgKGNvbmRfcmVzY2hlZCgpKQorCQkJZ290byB3YWl0X2Zvcl9pb2J1ZjsKKworCQlpZiAodW5saWtlbHkoIWJ1ZmZlcl91cHRvZGF0ZShiaCkpKQorCQkJZXJyID0gLUVJTzsKKworCQljbGVhcl9idWZmZXJfandyaXRlKGJoKTsKKworCQlKQlVGRkVSX1RSQUNFKGpoLCAicGg0OiB1bmZpbGUgYWZ0ZXIgam91cm5hbCB3cml0ZSIpOworCQlqYmQyX2pvdXJuYWxfdW5maWxlX2J1ZmZlcihqb3VybmFsLCBqaCk7CisKKwkJLyoKKwkJICogLT50X2lvYnVmX2xpc3Qgc2hvdWxkIGNvbnRhaW4gb25seSBkdW1teSBidWZmZXJfaGVhZHMKKwkJICogd2hpY2ggd2VyZSBjcmVhdGVkIGJ5IGpiZDJfam91cm5hbF93cml0ZV9tZXRhZGF0YV9idWZmZXIoKS4KKwkJICovCisJCUJVRkZFUl9UUkFDRShiaCwgImR1bXBpbmcgdGVtcG9yYXJ5IGJoIik7CisJCWpiZDJfam91cm5hbF9wdXRfam91cm5hbF9oZWFkKGpoKTsKKwkJX19icmVsc2UoYmgpOworCQlKX0FTU0VSVF9CSChiaCwgYXRvbWljX3JlYWQoJmJoLT5iX2NvdW50KSA9PSAwKTsKKwkJZnJlZV9idWZmZXJfaGVhZChiaCk7CisKKwkJLyogV2UgYWxzbyBoYXZlIHRvIHVubG9jayBhbmQgZnJlZSB0aGUgY29ycmVzcG9uZGluZworICAgICAgICAgICAgICAgICAgIHNoYWRvd2VkIGJ1ZmZlciAqLworCQlqaCA9IGNvbW1pdF90cmFuc2FjdGlvbi0+dF9zaGFkb3dfbGlzdC0+Yl90cHJldjsKKwkJYmggPSBqaDJiaChqaCk7CisJCWNsZWFyX2JpdChCSF9KV3JpdGUsICZiaC0+Yl9zdGF0ZSk7CisJCUpfQVNTRVJUX0JIKGJoLCBidWZmZXJfamJkZGlydHkoYmgpKTsKKworCQkvKiBUaGUgbWV0YWRhdGEgaXMgbm93IHJlbGVhc2VkIGZvciByZXVzZSwgYnV0IHdlIG5lZWQKKyAgICAgICAgICAgICAgICAgICB0byByZW1lbWJlciBpdCBhZ2FpbnN0IHRoaXMgdHJhbnNhY3Rpb24gc28gdGhhdCB3aGVuCisgICAgICAgICAgICAgICAgICAgd2UgZmluYWxseSBjb21taXQsIHdlIGNhbiBkbyBhbnkgY2hlY2twb2ludGluZworICAgICAgICAgICAgICAgICAgIHJlcXVpcmVkLiAqLworCQlKQlVGRkVSX1RSQUNFKGpoLCAiZmlsZSBhcyBCSl9Gb3JnZXQiKTsKKwkJamJkMl9qb3VybmFsX2ZpbGVfYnVmZmVyKGpoLCBjb21taXRfdHJhbnNhY3Rpb24sIEJKX0ZvcmdldCk7CisJCS8qIFdha2UgdXAgYW55IHRyYW5zYWN0aW9ucyB3aGljaCB3ZXJlIHdhaXRpbmcgZm9yIHRoaXMKKwkJICAgSU8gdG8gY29tcGxldGUgKi8KKwkJd2FrZV91cF9iaXQoJmJoLT5iX3N0YXRlLCBCSF9VbnNoYWRvdyk7CisJCUpCVUZGRVJfVFJBQ0UoamgsICJicmVsc2Ugc2hhZG93ZWQgYnVmZmVyIik7CisJCV9fYnJlbHNlKGJoKTsKKwl9CisKKwlKX0FTU0VSVCAoY29tbWl0X3RyYW5zYWN0aW9uLT50X3NoYWRvd19saXN0ID09IE5VTEwpOworCisJamJkX2RlYnVnKDMsICJKQkQ6IGNvbW1pdCBwaGFzZSA1XG4iKTsKKworCS8qIEhlcmUgd2Ugd2FpdCBmb3IgdGhlIHJldm9rZSByZWNvcmQgYW5kIGRlc2NyaXB0b3IgcmVjb3JkIGJ1ZmZlcnMgKi8KKyB3YWl0X2Zvcl9jdGxidWY6CisJd2hpbGUgKGNvbW1pdF90cmFuc2FjdGlvbi0+dF9sb2dfbGlzdCAhPSBOVUxMKSB7CisJCXN0cnVjdCBidWZmZXJfaGVhZCAqYmg7CisKKwkJamggPSBjb21taXRfdHJhbnNhY3Rpb24tPnRfbG9nX2xpc3QtPmJfdHByZXY7CisJCWJoID0gamgyYmgoamgpOworCQlpZiAoYnVmZmVyX2xvY2tlZChiaCkpIHsKKwkJCXdhaXRfb25fYnVmZmVyKGJoKTsKKwkJCWdvdG8gd2FpdF9mb3JfY3RsYnVmOworCQl9CisJCWlmIChjb25kX3Jlc2NoZWQoKSkKKwkJCWdvdG8gd2FpdF9mb3JfY3RsYnVmOworCisJCWlmICh1bmxpa2VseSghYnVmZmVyX3VwdG9kYXRlKGJoKSkpCisJCQllcnIgPSAtRUlPOworCisJCUJVRkZFUl9UUkFDRShiaCwgInBoNTogY29udHJvbCBidWZmZXIgd3JpdGVvdXQgZG9uZTogdW5maWxlIik7CisJCWNsZWFyX2J1ZmZlcl9qd3JpdGUoYmgpOworCQlqYmQyX2pvdXJuYWxfdW5maWxlX2J1ZmZlcihqb3VybmFsLCBqaCk7CisJCWpiZDJfam91cm5hbF9wdXRfam91cm5hbF9oZWFkKGpoKTsKKwkJX19icmVsc2UoYmgpOwkJLyogT25lIGZvciBnZXRibGsgKi8KKwkJLyogQUtQTTogYmZvcmdldCBoZXJlICovCisJfQorCisJamJkX2RlYnVnKDMsICJKQkQ6IGNvbW1pdCBwaGFzZSA2XG4iKTsKKworCWlmIChqb3VybmFsX3dyaXRlX2NvbW1pdF9yZWNvcmQoam91cm5hbCwgY29tbWl0X3RyYW5zYWN0aW9uKSkKKwkJZXJyID0gLUVJTzsKKworCWlmIChlcnIpCisJCV9famJkMl9qb3VybmFsX2Fib3J0X2hhcmQoam91cm5hbCk7CisKKwkvKiBFbmQgb2YgYSB0cmFuc2FjdGlvbiEgIEZpbmFsbHksIHdlIGNhbiBkbyBjaGVja3BvaW50CisgICAgICAgICAgIHByb2Nlc3Npbmc6IGFueSBidWZmZXJzIGNvbW1pdHRlZCBhcyBhIHJlc3VsdCBvZiB0aGlzCisgICAgICAgICAgIHRyYW5zYWN0aW9uIGNhbiBiZSByZW1vdmVkIGZyb20gYW55IGNoZWNrcG9pbnQgbGlzdCBpdCB3YXMgb24KKyAgICAgICAgICAgYmVmb3JlLiAqLworCisJamJkX2RlYnVnKDMsICJKQkQ6IGNvbW1pdCBwaGFzZSA3XG4iKTsKKworCUpfQVNTRVJUKGNvbW1pdF90cmFuc2FjdGlvbi0+dF9zeW5jX2RhdGFsaXN0ID09IE5VTEwpOworCUpfQVNTRVJUKGNvbW1pdF90cmFuc2FjdGlvbi0+dF9idWZmZXJzID09IE5VTEwpOworCUpfQVNTRVJUKGNvbW1pdF90cmFuc2FjdGlvbi0+dF9jaGVja3BvaW50X2xpc3QgPT0gTlVMTCk7CisJSl9BU1NFUlQoY29tbWl0X3RyYW5zYWN0aW9uLT50X2lvYnVmX2xpc3QgPT0gTlVMTCk7CisJSl9BU1NFUlQoY29tbWl0X3RyYW5zYWN0aW9uLT50X3NoYWRvd19saXN0ID09IE5VTEwpOworCUpfQVNTRVJUKGNvbW1pdF90cmFuc2FjdGlvbi0+dF9sb2dfbGlzdCA9PSBOVUxMKTsKKworcmVzdGFydF9sb29wOgorCS8qCisJICogQXMgdGhlcmUgYXJlIG90aGVyIHBsYWNlcyAoam91cm5hbF91bm1hcF9idWZmZXIoKSkgYWRkaW5nIGJ1ZmZlcnMKKwkgKiB0byB0aGlzIGxpc3Qgd2UgaGF2ZSB0byBiZSBjYXJlZnVsIGFuZCBob2xkIHRoZSBqX2xpc3RfbG9jay4KKwkgKi8KKwlzcGluX2xvY2soJmpvdXJuYWwtPmpfbGlzdF9sb2NrKTsKKwl3aGlsZSAoY29tbWl0X3RyYW5zYWN0aW9uLT50X2ZvcmdldCkgeworCQl0cmFuc2FjdGlvbl90ICpjcF90cmFuc2FjdGlvbjsKKwkJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaDsKKworCQlqaCA9IGNvbW1pdF90cmFuc2FjdGlvbi0+dF9mb3JnZXQ7CisJCXNwaW5fdW5sb2NrKCZqb3VybmFsLT5qX2xpc3RfbG9jayk7CisJCWJoID0gamgyYmgoamgpOworCQlqYmRfbG9ja19iaF9zdGF0ZShiaCk7CisJCUpfQVNTRVJUX0pIKGpoLAlqaC0+Yl90cmFuc2FjdGlvbiA9PSBjb21taXRfdHJhbnNhY3Rpb24gfHwKKwkJCWpoLT5iX3RyYW5zYWN0aW9uID09IGpvdXJuYWwtPmpfcnVubmluZ190cmFuc2FjdGlvbik7CisKKwkJLyoKKwkJICogSWYgdGhlcmUgaXMgdW5kby1wcm90ZWN0ZWQgY29tbWl0dGVkIGRhdGEgYWdhaW5zdAorCQkgKiB0aGlzIGJ1ZmZlciwgdGhlbiB3ZSBjYW4gcmVtb3ZlIGl0IG5vdy4gIElmIGl0IGlzIGEKKwkJICogYnVmZmVyIG5lZWRpbmcgc3VjaCBwcm90ZWN0aW9uLCB0aGUgb2xkIGZyb3plbl9kYXRhCisJCSAqIGZpZWxkIG5vdyBwb2ludHMgdG8gYSBjb21taXR0ZWQgdmVyc2lvbiBvZiB0aGUKKwkJICogYnVmZmVyLCBzbyByb3RhdGUgdGhhdCBmaWVsZCB0byB0aGUgbmV3IGNvbW1pdHRlZAorCQkgKiBkYXRhLgorCQkgKgorCQkgKiBPdGhlcndpc2UsIHdlIGNhbiBqdXN0IHRocm93IGF3YXkgdGhlIGZyb3plbiBkYXRhIG5vdy4KKwkJICovCisJCWlmIChqaC0+Yl9jb21taXR0ZWRfZGF0YSkgeworCQkJamJkMl9zbGFiX2ZyZWUoamgtPmJfY29tbWl0dGVkX2RhdGEsIGJoLT5iX3NpemUpOworCQkJamgtPmJfY29tbWl0dGVkX2RhdGEgPSBOVUxMOworCQkJaWYgKGpoLT5iX2Zyb3plbl9kYXRhKSB7CisJCQkJamgtPmJfY29tbWl0dGVkX2RhdGEgPSBqaC0+Yl9mcm96ZW5fZGF0YTsKKwkJCQlqaC0+Yl9mcm96ZW5fZGF0YSA9IE5VTEw7CisJCQl9CisJCX0gZWxzZSBpZiAoamgtPmJfZnJvemVuX2RhdGEpIHsKKwkJCWpiZDJfc2xhYl9mcmVlKGpoLT5iX2Zyb3plbl9kYXRhLCBiaC0+Yl9zaXplKTsKKwkJCWpoLT5iX2Zyb3plbl9kYXRhID0gTlVMTDsKKwkJfQorCisJCXNwaW5fbG9jaygmam91cm5hbC0+al9saXN0X2xvY2spOworCQljcF90cmFuc2FjdGlvbiA9IGpoLT5iX2NwX3RyYW5zYWN0aW9uOworCQlpZiAoY3BfdHJhbnNhY3Rpb24pIHsKKwkJCUpCVUZGRVJfVFJBQ0UoamgsICJyZW1vdmUgZnJvbSBvbGQgY3AgdHJhbnNhY3Rpb24iKTsKKwkJCV9famJkMl9qb3VybmFsX3JlbW92ZV9jaGVja3BvaW50KGpoKTsKKwkJfQorCisJCS8qIE9ubHkgcmUtY2hlY2twb2ludCB0aGUgYnVmZmVyX2hlYWQgaWYgaXQgaXMgbWFya2VkCisJCSAqIGRpcnR5LiAgSWYgdGhlIGJ1ZmZlciB3YXMgYWRkZWQgdG8gdGhlIEJKX0ZvcmdldCBsaXN0CisJCSAqIGJ5IGpiZDJfam91cm5hbF9mb3JnZXQsIGl0IG1heSBubyBsb25nZXIgYmUgZGlydHkgYW5kCisJCSAqIHRoZXJlJ3Mgbm8gcG9pbnQgaW4ga2VlcGluZyBhIGNoZWNrcG9pbnQgcmVjb3JkIGZvcgorCQkgKiBpdC4gKi8KKworCQkvKiBBIGJ1ZmZlciB3aGljaCBoYXMgYmVlbiBmcmVlZCB3aGlsZSBzdGlsbCBiZWluZworCQkgKiBqb3VybmFsZWQgYnkgYSBwcmV2aW91cyB0cmFuc2FjdGlvbiBtYXkgZW5kIHVwIHN0aWxsCisJCSAqIGJlaW5nIGRpcnR5IGhlcmUsIGJ1dCB3ZSB3YW50IHRvIGF2b2lkIHdyaXRpbmcgYmFjaworCQkgKiB0aGF0IGJ1ZmZlciBpbiB0aGUgZnV0dXJlIG5vdyB0aGF0IHRoZSBsYXN0IHVzZSBoYXMKKwkJICogYmVlbiBjb21taXR0ZWQuICBUaGF0J3Mgbm90IG9ubHkgYSBwZXJmb3JtYW5jZSBnYWluLAorCQkgKiBpdCBhbHNvIHN0b3BzIGFsaWFzaW5nIHByb2JsZW1zIGlmIHRoZSBidWZmZXIgaXMgbGVmdAorCQkgKiBiZWhpbmQgZm9yIHdyaXRlYmFjayBhbmQgZ2V0cyByZWFsbG9jYXRlZCBmb3IgYW5vdGhlcgorCQkgKiB1c2UgaW4gYSBkaWZmZXJlbnQgcGFnZS4gKi8KKwkJaWYgKGJ1ZmZlcl9mcmVlZChiaCkpIHsKKwkJCWNsZWFyX2J1ZmZlcl9mcmVlZChiaCk7CisJCQljbGVhcl9idWZmZXJfamJkZGlydHkoYmgpOworCQl9CisKKwkJaWYgKGJ1ZmZlcl9qYmRkaXJ0eShiaCkpIHsKKwkJCUpCVUZGRVJfVFJBQ0UoamgsICJhZGQgdG8gbmV3IGNoZWNrcG9pbnRpbmcgdHJhbnMiKTsKKwkJCV9famJkMl9qb3VybmFsX2luc2VydF9jaGVja3BvaW50KGpoLCBjb21taXRfdHJhbnNhY3Rpb24pOworCQkJSkJVRkZFUl9UUkFDRShqaCwgInJlZmlsZSBmb3IgY2hlY2twb2ludCB3cml0ZWJhY2siKTsKKwkJCV9famJkMl9qb3VybmFsX3JlZmlsZV9idWZmZXIoamgpOworCQkJamJkX3VubG9ja19iaF9zdGF0ZShiaCk7CisJCX0gZWxzZSB7CisJCQlKX0FTU0VSVF9CSChiaCwgIWJ1ZmZlcl9kaXJ0eShiaCkpOworCQkJLyogVGhlIGJ1ZmZlciBvbiBCSl9Gb3JnZXQgbGlzdCBhbmQgbm90IGpiZGRpcnR5IG1lYW5zCisJCQkgKiBpdCBoYXMgYmVlbiBmcmVlZCBieSB0aGlzIHRyYW5zYWN0aW9uIGFuZCBoZW5jZSBpdAorCQkJICogY291bGQgbm90IGhhdmUgYmVlbiByZWFsbG9jYXRlZCB1bnRpbCB0aGlzCisJCQkgKiB0cmFuc2FjdGlvbiBoYXMgY29tbWl0dGVkLiAqQlVUKiBpdCBjb3VsZCBiZQorCQkJICogcmVhbGxvY2F0ZWQgb25jZSB3ZSBoYXZlIHdyaXR0ZW4gYWxsIHRoZSBkYXRhIHRvCisJCQkgKiBkaXNrIGFuZCBiZWZvcmUgd2UgcHJvY2VzcyB0aGUgYnVmZmVyIG9uIEJKX0ZvcmdldAorCQkJICogbGlzdC4gKi8KKwkJCUpCVUZGRVJfVFJBQ0UoamgsICJyZWZpbGUgb3IgdW5maWxlIGZyZWVkIGJ1ZmZlciIpOworCQkJX19qYmQyX2pvdXJuYWxfcmVmaWxlX2J1ZmZlcihqaCk7CisJCQlpZiAoIWpoLT5iX3RyYW5zYWN0aW9uKSB7CisJCQkJamJkX3VubG9ja19iaF9zdGF0ZShiaCk7CisJCQkJIC8qIG5lZWRzIGEgYnJlbHNlICovCisJCQkJamJkMl9qb3VybmFsX3JlbW92ZV9qb3VybmFsX2hlYWQoYmgpOworCQkJCXJlbGVhc2VfYnVmZmVyX3BhZ2UoYmgpOworCQkJfSBlbHNlCisJCQkJamJkX3VubG9ja19iaF9zdGF0ZShiaCk7CisJCX0KKwkJY29uZF9yZXNjaGVkX2xvY2soJmpvdXJuYWwtPmpfbGlzdF9sb2NrKTsKKwl9CisJc3Bpbl91bmxvY2soJmpvdXJuYWwtPmpfbGlzdF9sb2NrKTsKKwkvKgorCSAqIFRoaXMgaXMgYSBiaXQgc2xlYXp5LiAgV2UgYm9ycm93IGpfbGlzdF9sb2NrIHRvIHByb3RlY3QKKwkgKiBqb3VybmFsLT5qX2NvbW1pdHRpbmdfdHJhbnNhY3Rpb24gaW4gX19qYmQyX2pvdXJuYWxfcmVtb3ZlX2NoZWNrcG9pbnQuCisJICogUmVhbGx5LCBfX2piZDJfam91cm5hbF9yZW1vdmVfY2hlY2twb2ludCBzaG91bGQgYmUgdXNpbmcgal9zdGF0ZV9sb2NrIGJ1dAorCSAqIGl0J3MgYSBiaXQgaGFzc2xlIHRvIGhvbGQgdGhhdCBhY3Jvc3MgX19qYmQyX2pvdXJuYWxfcmVtb3ZlX2NoZWNrcG9pbnQKKwkgKi8KKwlzcGluX2xvY2soJmpvdXJuYWwtPmpfc3RhdGVfbG9jayk7CisJc3Bpbl9sb2NrKCZqb3VybmFsLT5qX2xpc3RfbG9jayk7CisJLyoKKwkgKiBOb3cgcmVjaGVjayBpZiBzb21lIGJ1ZmZlcnMgZGlkIG5vdCBnZXQgYXR0YWNoZWQgdG8gdGhlIHRyYW5zYWN0aW9uCisJICogd2hpbGUgdGhlIGxvY2sgd2FzIGRyb3BwZWQuLi4KKwkgKi8KKwlpZiAoY29tbWl0X3RyYW5zYWN0aW9uLT50X2ZvcmdldCkgeworCQlzcGluX3VubG9jaygmam91cm5hbC0+al9saXN0X2xvY2spOworCQlzcGluX3VubG9jaygmam91cm5hbC0+al9zdGF0ZV9sb2NrKTsKKwkJZ290byByZXN0YXJ0X2xvb3A7CisJfQorCisJLyogRG9uZSB3aXRoIHRoaXMgdHJhbnNhY3Rpb24hICovCisKKwlqYmRfZGVidWcoMywgIkpCRDogY29tbWl0IHBoYXNlIDhcbiIpOworCisJSl9BU1NFUlQoY29tbWl0X3RyYW5zYWN0aW9uLT50X3N0YXRlID09IFRfQ09NTUlUKTsKKworCWNvbW1pdF90cmFuc2FjdGlvbi0+dF9zdGF0ZSA9IFRfRklOSVNIRUQ7CisJSl9BU1NFUlQoY29tbWl0X3RyYW5zYWN0aW9uID09IGpvdXJuYWwtPmpfY29tbWl0dGluZ190cmFuc2FjdGlvbik7CisJam91cm5hbC0+al9jb21taXRfc2VxdWVuY2UgPSBjb21taXRfdHJhbnNhY3Rpb24tPnRfdGlkOworCWpvdXJuYWwtPmpfY29tbWl0dGluZ190cmFuc2FjdGlvbiA9IE5VTEw7CisJc3Bpbl91bmxvY2soJmpvdXJuYWwtPmpfc3RhdGVfbG9jayk7CisKKwlpZiAoY29tbWl0X3RyYW5zYWN0aW9uLT50X2NoZWNrcG9pbnRfbGlzdCA9PSBOVUxMKSB7CisJCV9famJkMl9qb3VybmFsX2Ryb3BfdHJhbnNhY3Rpb24oam91cm5hbCwgY29tbWl0X3RyYW5zYWN0aW9uKTsKKwl9IGVsc2UgeworCQlpZiAoam91cm5hbC0+al9jaGVja3BvaW50X3RyYW5zYWN0aW9ucyA9PSBOVUxMKSB7CisJCQlqb3VybmFsLT5qX2NoZWNrcG9pbnRfdHJhbnNhY3Rpb25zID0gY29tbWl0X3RyYW5zYWN0aW9uOworCQkJY29tbWl0X3RyYW5zYWN0aW9uLT50X2NwbmV4dCA9IGNvbW1pdF90cmFuc2FjdGlvbjsKKwkJCWNvbW1pdF90cmFuc2FjdGlvbi0+dF9jcHByZXYgPSBjb21taXRfdHJhbnNhY3Rpb247CisJCX0gZWxzZSB7CisJCQljb21taXRfdHJhbnNhY3Rpb24tPnRfY3BuZXh0ID0KKwkJCQlqb3VybmFsLT5qX2NoZWNrcG9pbnRfdHJhbnNhY3Rpb25zOworCQkJY29tbWl0X3RyYW5zYWN0aW9uLT50X2NwcHJldiA9CisJCQkJY29tbWl0X3RyYW5zYWN0aW9uLT50X2NwbmV4dC0+dF9jcHByZXY7CisJCQljb21taXRfdHJhbnNhY3Rpb24tPnRfY3BuZXh0LT50X2NwcHJldiA9CisJCQkJY29tbWl0X3RyYW5zYWN0aW9uOworCQkJY29tbWl0X3RyYW5zYWN0aW9uLT50X2NwcHJldi0+dF9jcG5leHQgPQorCQkJCWNvbW1pdF90cmFuc2FjdGlvbjsKKwkJfQorCX0KKwlzcGluX3VubG9jaygmam91cm5hbC0+al9saXN0X2xvY2spOworCisJamJkX2RlYnVnKDEsICJKQkQ6IGNvbW1pdCAlZCBjb21wbGV0ZSwgaGVhZCAlZFxuIiwKKwkJICBqb3VybmFsLT5qX2NvbW1pdF9zZXF1ZW5jZSwgam91cm5hbC0+al90YWlsX3NlcXVlbmNlKTsKKworCXdha2VfdXAoJmpvdXJuYWwtPmpfd2FpdF9kb25lX2NvbW1pdCk7Cit9CmRpZmYgLS1naXQgYS9mcy9qYmQyL2pvdXJuYWwuYyBiL2ZzL2piZDIvam91cm5hbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM2MGYzNzgKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9qYmQyL2pvdXJuYWwuYwpAQCAtMCwwICsxLDIwODQgQEAKKy8qCisgKiBsaW51eC9mcy9qYmQyL2pvdXJuYWwuYworICoKKyAqIFdyaXR0ZW4gYnkgU3RlcGhlbiBDLiBUd2VlZGllIDxzY3RAcmVkaGF0LmNvbT4sIDE5OTgKKyAqCisgKiBDb3B5cmlnaHQgMTk5OCBSZWQgSGF0IGNvcnAgLS0tIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgTGludXgga2VybmVsIGFuZCBpcyBtYWRlIGF2YWlsYWJsZSB1bmRlcgorICogdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgdmVyc2lvbiAyLCBvciBhdCB5b3VyCisgKiBvcHRpb24sIGFueSBsYXRlciB2ZXJzaW9uLCBpbmNvcnBvcmF0ZWQgaGVyZWluIGJ5IHJlZmVyZW5jZS4KKyAqCisgKiBHZW5lcmljIGZpbGVzeXN0ZW0gam91cm5hbC13cml0aW5nIGNvZGU7IHBhcnQgb2YgdGhlIGV4dDJmcworICogam91cm5hbGluZyBzeXN0ZW0uCisgKgorICogVGhpcyBmaWxlIG1hbmFnZXMgam91cm5hbHM6IGFyZWFzIG9mIGRpc2sgcmVzZXJ2ZWQgZm9yIGxvZ2dpbmcKKyAqIHRyYW5zYWN0aW9uYWwgdXBkYXRlcy4gIFRoaXMgaW5jbHVkZXMgdGhlIGtlcm5lbCBqb3VybmFsaW5nIHRocmVhZAorICogd2hpY2ggaXMgcmVzcG9uc2libGUgZm9yIHNjaGVkdWxpbmcgdXBkYXRlcyB0byB0aGUgbG9nLgorICoKKyAqIFdlIGRvIG5vdCBhY3R1YWxseSBtYW5hZ2UgdGhlIHBoeXNpY2FsIHN0b3JhZ2Ugb2YgdGhlIGpvdXJuYWwgaW4gdGhpcworICogZmlsZTogdGhhdCBpcyBsZWZ0IHRvIGEgcGVyLWpvdXJuYWwgcG9saWN5IGZ1bmN0aW9uLCB3aGljaCBhbGxvd3MgdXMKKyAqIHRvIHN0b3JlIHRoZSBqb3VybmFsIHdpdGhpbiBhIGZpbGVzeXN0ZW0tc3BlY2lmaWVkIGFyZWEgZm9yIGV4dDIKKyAqIGpvdXJuYWxpbmcgKGV4dDIgY2FuIHVzZSBhIHJlc2VydmVkIGlub2RlIGZvciBzdG9yaW5nIHRoZSBsb2cpLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lLmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9qYmQyLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvc21wX2xvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9zdXNwZW5kLmg+CisjaW5jbHVkZSA8bGludXgvcGFnZW1hcC5oPgorI2luY2x1ZGUgPGxpbnV4L2t0aHJlYWQuaD4KKyNpbmNsdWRlIDxsaW51eC9wb2lzb24uaD4KKyNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CisKKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGFzbS9wYWdlLmg+CisKK0VYUE9SVF9TWU1CT0woamJkMl9qb3VybmFsX3N0YXJ0KTsKK0VYUE9SVF9TWU1CT0woamJkMl9qb3VybmFsX3Jlc3RhcnQpOworRVhQT1JUX1NZTUJPTChqYmQyX2pvdXJuYWxfZXh0ZW5kKTsKK0VYUE9SVF9TWU1CT0woamJkMl9qb3VybmFsX3N0b3ApOworRVhQT1JUX1NZTUJPTChqYmQyX2pvdXJuYWxfbG9ja191cGRhdGVzKTsKK0VYUE9SVF9TWU1CT0woamJkMl9qb3VybmFsX3VubG9ja191cGRhdGVzKTsKK0VYUE9SVF9TWU1CT0woamJkMl9qb3VybmFsX2dldF93cml0ZV9hY2Nlc3MpOworRVhQT1JUX1NZTUJPTChqYmQyX2pvdXJuYWxfZ2V0X2NyZWF0ZV9hY2Nlc3MpOworRVhQT1JUX1NZTUJPTChqYmQyX2pvdXJuYWxfZ2V0X3VuZG9fYWNjZXNzKTsKK0VYUE9SVF9TWU1CT0woamJkMl9qb3VybmFsX2RpcnR5X2RhdGEpOworRVhQT1JUX1NZTUJPTChqYmQyX2pvdXJuYWxfZGlydHlfbWV0YWRhdGEpOworRVhQT1JUX1NZTUJPTChqYmQyX2pvdXJuYWxfcmVsZWFzZV9idWZmZXIpOworRVhQT1JUX1NZTUJPTChqYmQyX2pvdXJuYWxfZm9yZ2V0KTsKKyNpZiAwCitFWFBPUlRfU1lNQk9MKGpvdXJuYWxfc3luY19idWZmZXIpOworI2VuZGlmCitFWFBPUlRfU1lNQk9MKGpiZDJfam91cm5hbF9mbHVzaCk7CitFWFBPUlRfU1lNQk9MKGpiZDJfam91cm5hbF9yZXZva2UpOworCitFWFBPUlRfU1lNQk9MKGpiZDJfam91cm5hbF9pbml0X2Rldik7CitFWFBPUlRfU1lNQk9MKGpiZDJfam91cm5hbF9pbml0X2lub2RlKTsKK0VYUE9SVF9TWU1CT0woamJkMl9qb3VybmFsX3VwZGF0ZV9mb3JtYXQpOworRVhQT1JUX1NZTUJPTChqYmQyX2pvdXJuYWxfY2hlY2tfdXNlZF9mZWF0dXJlcyk7CitFWFBPUlRfU1lNQk9MKGpiZDJfam91cm5hbF9jaGVja19hdmFpbGFibGVfZmVhdHVyZXMpOworRVhQT1JUX1NZTUJPTChqYmQyX2pvdXJuYWxfc2V0X2ZlYXR1cmVzKTsKK0VYUE9SVF9TWU1CT0woamJkMl9qb3VybmFsX2NyZWF0ZSk7CitFWFBPUlRfU1lNQk9MKGpiZDJfam91cm5hbF9sb2FkKTsKK0VYUE9SVF9TWU1CT0woamJkMl9qb3VybmFsX2Rlc3Ryb3kpOworRVhQT1JUX1NZTUJPTChqYmQyX2pvdXJuYWxfdXBkYXRlX3N1cGVyYmxvY2spOworRVhQT1JUX1NZTUJPTChqYmQyX2pvdXJuYWxfYWJvcnQpOworRVhQT1JUX1NZTUJPTChqYmQyX2pvdXJuYWxfZXJybm8pOworRVhQT1JUX1NZTUJPTChqYmQyX2pvdXJuYWxfYWNrX2Vycik7CitFWFBPUlRfU1lNQk9MKGpiZDJfam91cm5hbF9jbGVhcl9lcnIpOworRVhQT1JUX1NZTUJPTChqYmQyX2xvZ193YWl0X2NvbW1pdCk7CitFWFBPUlRfU1lNQk9MKGpiZDJfam91cm5hbF9zdGFydF9jb21taXQpOworRVhQT1JUX1NZTUJPTChqYmQyX2pvdXJuYWxfZm9yY2VfY29tbWl0X25lc3RlZCk7CitFWFBPUlRfU1lNQk9MKGpiZDJfam91cm5hbF93aXBlKTsKK0VYUE9SVF9TWU1CT0woamJkMl9qb3VybmFsX2Jsb2Nrc19wZXJfcGFnZSk7CitFWFBPUlRfU1lNQk9MKGpiZDJfam91cm5hbF9pbnZhbGlkYXRlcGFnZSk7CitFWFBPUlRfU1lNQk9MKGpiZDJfam91cm5hbF90cnlfdG9fZnJlZV9idWZmZXJzKTsKK0VYUE9SVF9TWU1CT0woamJkMl9qb3VybmFsX2ZvcmNlX2NvbW1pdCk7CisKK3N0YXRpYyBpbnQgam91cm5hbF9jb252ZXJ0X3N1cGVyYmxvY2tfdjEoam91cm5hbF90ICosIGpvdXJuYWxfc3VwZXJibG9ja190ICopOworc3RhdGljIHZvaWQgX19qb3VybmFsX2Fib3J0X3NvZnQgKGpvdXJuYWxfdCAqam91cm5hbCwgaW50IGVycm5vKTsKK3N0YXRpYyBpbnQgamJkMl9qb3VybmFsX2NyZWF0ZV9qYmRfc2xhYihzaXplX3Qgc2xhYl9zaXplKTsKKworLyoKKyAqIEhlbHBlciBmdW5jdGlvbiB1c2VkIHRvIG1hbmFnZSBjb21taXQgdGltZW91dHMKKyAqLworCitzdGF0aWMgdm9pZCBjb21taXRfdGltZW91dCh1bnNpZ25lZCBsb25nIF9fZGF0YSkKK3sKKwlzdHJ1Y3QgdGFza19zdHJ1Y3QgKiBwID0gKHN0cnVjdCB0YXNrX3N0cnVjdCAqKSBfX2RhdGE7CisKKwl3YWtlX3VwX3Byb2Nlc3MocCk7Cit9CisKKy8qCisgKiBram91cm5hbGQyOiBUaGUgbWFpbiB0aHJlYWQgZnVuY3Rpb24gdXNlZCB0byBtYW5hZ2UgYSBsb2dnaW5nIGRldmljZQorICogam91cm5hbC4KKyAqCisgKiBUaGlzIGtlcm5lbCB0aHJlYWQgaXMgcmVzcG9uc2libGUgZm9yIHR3byB0aGluZ3M6CisgKgorICogMSkgQ09NTUlUOiAgRXZlcnkgc28gb2Z0ZW4gd2UgbmVlZCB0byBjb21taXQgdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlCisgKiAgICBmaWxlc3lzdGVtIHRvIGRpc2suICBUaGUgam91cm5hbCB0aHJlYWQgaXMgcmVzcG9uc2libGUgZm9yIHdyaXRpbmcKKyAqICAgIGFsbCBvZiB0aGUgbWV0YWRhdGEgYnVmZmVycyB0byBkaXNrLgorICoKKyAqIDIpIENIRUNLUE9JTlQ6IFdlIGNhbm5vdCByZXVzZSBhIHVzZWQgc2VjdGlvbiBvZiB0aGUgbG9nIGZpbGUgdW50aWwgYWxsCisgKiAgICBvZiB0aGUgZGF0YSBpbiB0aGF0IHBhcnQgb2YgdGhlIGxvZyBoYXMgYmVlbiByZXdyaXR0ZW4gZWxzZXdoZXJlIG9uCisgKiAgICB0aGUgZGlzay4gIEZsdXNoaW5nIHRoZXNlIG9sZCBidWZmZXJzIHRvIHJlY2xhaW0gc3BhY2UgaW4gdGhlIGxvZyBpcworICogICAga25vd24gYXMgY2hlY2twb2ludGluZywgYW5kIHRoaXMgdGhyZWFkIGlzIHJlc3BvbnNpYmxlIGZvciB0aGF0IGpvYi4KKyAqLworCitzdGF0aWMgaW50IGtqb3VybmFsZDIodm9pZCAqYXJnKQoreworCWpvdXJuYWxfdCAqam91cm5hbCA9IGFyZzsKKwl0cmFuc2FjdGlvbl90ICp0cmFuc2FjdGlvbjsKKworCS8qCisJICogU2V0IHVwIGFuIGludGVydmFsIHRpbWVyIHdoaWNoIGNhbiBiZSB1c2VkIHRvIHRyaWdnZXIgYSBjb21taXQgd2FrZXVwCisJICogYWZ0ZXIgdGhlIGNvbW1pdCBpbnRlcnZhbCBleHBpcmVzCisJICovCisJc2V0dXBfdGltZXIoJmpvdXJuYWwtPmpfY29tbWl0X3RpbWVyLCBjb21taXRfdGltZW91dCwKKwkJCSh1bnNpZ25lZCBsb25nKWN1cnJlbnQpOworCisJLyogUmVjb3JkIHRoYXQgdGhlIGpvdXJuYWwgdGhyZWFkIGlzIHJ1bm5pbmcgKi8KKwlqb3VybmFsLT5qX3Rhc2sgPSBjdXJyZW50OworCXdha2VfdXAoJmpvdXJuYWwtPmpfd2FpdF9kb25lX2NvbW1pdCk7CisKKwlwcmludGsoS0VSTl9JTkZPICJram91cm5hbGQyIHN0YXJ0aW5nLiAgQ29tbWl0IGludGVydmFsICVsZCBzZWNvbmRzXG4iLAorCQkJam91cm5hbC0+al9jb21taXRfaW50ZXJ2YWwgLyBIWik7CisKKwkvKgorCSAqIEFuZCBub3csIHdhaXQgZm9yZXZlciBmb3IgY29tbWl0IHdha2V1cCBldmVudHMuCisJICovCisJc3Bpbl9sb2NrKCZqb3VybmFsLT5qX3N0YXRlX2xvY2spOworCitsb29wOgorCWlmIChqb3VybmFsLT5qX2ZsYWdzICYgSkJEMl9VTk1PVU5UKQorCQlnb3RvIGVuZF9sb29wOworCisJamJkX2RlYnVnKDEsICJjb21taXRfc2VxdWVuY2U9JWQsIGNvbW1pdF9yZXF1ZXN0PSVkXG4iLAorCQlqb3VybmFsLT5qX2NvbW1pdF9zZXF1ZW5jZSwgam91cm5hbC0+al9jb21taXRfcmVxdWVzdCk7CisKKwlpZiAoam91cm5hbC0+al9jb21taXRfc2VxdWVuY2UgIT0gam91cm5hbC0+al9jb21taXRfcmVxdWVzdCkgeworCQlqYmRfZGVidWcoMSwgIk9LLCByZXF1ZXN0cyBkaWZmZXJcbiIpOworCQlzcGluX3VubG9jaygmam91cm5hbC0+al9zdGF0ZV9sb2NrKTsKKwkJZGVsX3RpbWVyX3N5bmMoJmpvdXJuYWwtPmpfY29tbWl0X3RpbWVyKTsKKwkJamJkMl9qb3VybmFsX2NvbW1pdF90cmFuc2FjdGlvbihqb3VybmFsKTsKKwkJc3Bpbl9sb2NrKCZqb3VybmFsLT5qX3N0YXRlX2xvY2spOworCQlnb3RvIGxvb3A7CisJfQorCisJd2FrZV91cCgmam91cm5hbC0+al93YWl0X2RvbmVfY29tbWl0KTsKKwlpZiAoZnJlZXppbmcoY3VycmVudCkpIHsKKwkJLyoKKwkJICogVGhlIHNpbXBsZXIgdGhlIGJldHRlci4gRmx1c2hpbmcgam91cm5hbCBpc24ndCBhCisJCSAqIGdvb2QgaWRlYSwgYmVjYXVzZSB0aGF0IGRlcGVuZHMgb24gdGhyZWFkcyB0aGF0IG1heQorCQkgKiBiZSBhbHJlYWR5IHN0b3BwZWQuCisJCSAqLworCQlqYmRfZGVidWcoMSwgIk5vdyBzdXNwZW5kaW5nIGtqb3VybmFsZDJcbiIpOworCQlzcGluX3VubG9jaygmam91cm5hbC0+al9zdGF0ZV9sb2NrKTsKKwkJcmVmcmlnZXJhdG9yKCk7CisJCXNwaW5fbG9jaygmam91cm5hbC0+al9zdGF0ZV9sb2NrKTsKKwl9IGVsc2UgeworCQkvKgorCQkgKiBXZSBhc3N1bWUgb24gcmVzdW1lIHRoYXQgY29tbWl0cyBhcmUgYWxyZWFkeSB0aGVyZSwKKwkJICogc28gd2UgZG9uJ3Qgc2xlZXAKKwkJICovCisJCURFRklORV9XQUlUKHdhaXQpOworCQlpbnQgc2hvdWxkX3NsZWVwID0gMTsKKworCQlwcmVwYXJlX3RvX3dhaXQoJmpvdXJuYWwtPmpfd2FpdF9jb21taXQsICZ3YWl0LAorCQkJCVRBU0tfSU5URVJSVVBUSUJMRSk7CisJCWlmIChqb3VybmFsLT5qX2NvbW1pdF9zZXF1ZW5jZSAhPSBqb3VybmFsLT5qX2NvbW1pdF9yZXF1ZXN0KQorCQkJc2hvdWxkX3NsZWVwID0gMDsKKwkJdHJhbnNhY3Rpb24gPSBqb3VybmFsLT5qX3J1bm5pbmdfdHJhbnNhY3Rpb247CisJCWlmICh0cmFuc2FjdGlvbiAmJiB0aW1lX2FmdGVyX2VxKGppZmZpZXMsCisJCQkJCQl0cmFuc2FjdGlvbi0+dF9leHBpcmVzKSkKKwkJCXNob3VsZF9zbGVlcCA9IDA7CisJCWlmIChqb3VybmFsLT5qX2ZsYWdzICYgSkJEMl9VTk1PVU5UKQorCQkJc2hvdWxkX3NsZWVwID0gMDsKKwkJaWYgKHNob3VsZF9zbGVlcCkgeworCQkJc3Bpbl91bmxvY2soJmpvdXJuYWwtPmpfc3RhdGVfbG9jayk7CisJCQlzY2hlZHVsZSgpOworCQkJc3Bpbl9sb2NrKCZqb3VybmFsLT5qX3N0YXRlX2xvY2spOworCQl9CisJCWZpbmlzaF93YWl0KCZqb3VybmFsLT5qX3dhaXRfY29tbWl0LCAmd2FpdCk7CisJfQorCisJamJkX2RlYnVnKDEsICJram91cm5hbGQyIHdha2VzXG4iKTsKKworCS8qCisJICogV2VyZSB3ZSB3b2tlbiB1cCBieSBhIGNvbW1pdCB3YWtldXAgZXZlbnQ/CisJICovCisJdHJhbnNhY3Rpb24gPSBqb3VybmFsLT5qX3J1bm5pbmdfdHJhbnNhY3Rpb247CisJaWYgKHRyYW5zYWN0aW9uICYmIHRpbWVfYWZ0ZXJfZXEoamlmZmllcywgdHJhbnNhY3Rpb24tPnRfZXhwaXJlcykpIHsKKwkJam91cm5hbC0+al9jb21taXRfcmVxdWVzdCA9IHRyYW5zYWN0aW9uLT50X3RpZDsKKwkJamJkX2RlYnVnKDEsICJ3b2tlIGJlY2F1c2Ugb2YgdGltZW91dFxuIik7CisJfQorCWdvdG8gbG9vcDsKKworZW5kX2xvb3A6CisJc3Bpbl91bmxvY2soJmpvdXJuYWwtPmpfc3RhdGVfbG9jayk7CisJZGVsX3RpbWVyX3N5bmMoJmpvdXJuYWwtPmpfY29tbWl0X3RpbWVyKTsKKwlqb3VybmFsLT5qX3Rhc2sgPSBOVUxMOworCXdha2VfdXAoJmpvdXJuYWwtPmpfd2FpdF9kb25lX2NvbW1pdCk7CisJamJkX2RlYnVnKDEsICJKb3VybmFsIHRocmVhZCBleGl0aW5nLlxuIik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGpiZDJfam91cm5hbF9zdGFydF90aHJlYWQoam91cm5hbF90ICpqb3VybmFsKQoreworCWt0aHJlYWRfcnVuKGtqb3VybmFsZDIsIGpvdXJuYWwsICJram91cm5hbGQyIik7CisJd2FpdF9ldmVudChqb3VybmFsLT5qX3dhaXRfZG9uZV9jb21taXQsIGpvdXJuYWwtPmpfdGFzayAhPSAwKTsKK30KKworc3RhdGljIHZvaWQgam91cm5hbF9raWxsX3RocmVhZChqb3VybmFsX3QgKmpvdXJuYWwpCit7CisJc3Bpbl9sb2NrKCZqb3VybmFsLT5qX3N0YXRlX2xvY2spOworCWpvdXJuYWwtPmpfZmxhZ3MgfD0gSkJEMl9VTk1PVU5UOworCisJd2hpbGUgKGpvdXJuYWwtPmpfdGFzaykgeworCQl3YWtlX3VwKCZqb3VybmFsLT5qX3dhaXRfY29tbWl0KTsKKwkJc3Bpbl91bmxvY2soJmpvdXJuYWwtPmpfc3RhdGVfbG9jayk7CisJCXdhaXRfZXZlbnQoam91cm5hbC0+al93YWl0X2RvbmVfY29tbWl0LCBqb3VybmFsLT5qX3Rhc2sgPT0gMCk7CisJCXNwaW5fbG9jaygmam91cm5hbC0+al9zdGF0ZV9sb2NrKTsKKwl9CisJc3Bpbl91bmxvY2soJmpvdXJuYWwtPmpfc3RhdGVfbG9jayk7Cit9CisKKy8qCisgKiBqYmQyX2pvdXJuYWxfd3JpdGVfbWV0YWRhdGFfYnVmZmVyOiB3cml0ZSBhIG1ldGFkYXRhIGJ1ZmZlciB0byB0aGUgam91cm5hbC4KKyAqCisgKiBXcml0ZXMgYSBtZXRhZGF0YSBidWZmZXIgdG8gYSBnaXZlbiBkaXNrIGJsb2NrLiAgVGhlIGFjdHVhbCBJTyBpcyBub3QKKyAqIHBlcmZvcm1lZCBidXQgYSBuZXcgYnVmZmVyX2hlYWQgaXMgY29uc3RydWN0ZWQgd2hpY2ggbGFiZWxzIHRoZSBkYXRhCisgKiB0byBiZSB3cml0dGVuIHdpdGggdGhlIGNvcnJlY3QgZGVzdGluYXRpb24gZGlzayBibG9jay4KKyAqCisgKiBBbnkgbWFnaWMtbnVtYmVyIGVzY2FwaW5nIHdoaWNoIG5lZWRzIHRvIGJlIGRvbmUgd2lsbCBjYXVzZSBhCisgKiBjb3B5LW91dCBoZXJlLiAgSWYgdGhlIGJ1ZmZlciBoYXBwZW5zIHRvIHN0YXJ0IHdpdGggdGhlCisgKiBKQkQyX01BR0lDX05VTUJFUiwgdGhlbiB3ZSBjYW4ndCB3cml0ZSBpdCB0byB0aGUgbG9nIGRpcmVjdGx5OiB0aGUKKyAqIG1hZ2ljIG51bWJlciBpcyBvbmx5IHdyaXR0ZW4gdG8gdGhlIGxvZyBmb3IgZGVzY3JpcHRlciBibG9ja3MuICBJbgorICogdGhpcyBjYXNlLCB3ZSBjb3B5IHRoZSBkYXRhIGFuZCByZXBsYWNlIHRoZSBmaXJzdCB3b3JkIHdpdGggMCwgYW5kIHdlCisgKiByZXR1cm4gYSByZXN1bHQgY29kZSB3aGljaCBpbmRpY2F0ZXMgdGhhdCB0aGlzIGJ1ZmZlciBuZWVkcyB0byBiZQorICogbWFya2VkIGFzIGFuIGVzY2FwZWQgYnVmZmVyIGluIHRoZSBjb3JyZXNwb25kaW5nIGxvZyBkZXNjcmlwdG9yCisgKiBibG9jay4gIFRoZSBtaXNzaW5nIHdvcmQgY2FuIHRoZW4gYmUgcmVzdG9yZWQgd2hlbiB0aGUgYmxvY2sgaXMgcmVhZAorICogZHVyaW5nIHJlY292ZXJ5LgorICoKKyAqIElmIHRoZSBzb3VyY2UgYnVmZmVyIGhhcyBhbHJlYWR5IGJlZW4gbW9kaWZpZWQgYnkgYSBuZXcgdHJhbnNhY3Rpb24KKyAqIHNpbmNlIHdlIHRvb2sgdGhlIGxhc3QgY29tbWl0IHNuYXBzaG90LCB3ZSB1c2UgdGhlIGZyb3plbiBjb3B5IG9mCisgKiB0aGF0IGRhdGEgZm9yIElPLiAgSWYgd2UgZW5kIHVwIHVzaW5nIHRoZSBleGlzdGluZyBidWZmZXJfaGVhZCdzIGRhdGEKKyAqIGZvciB0aGUgd3JpdGUsIHRoZW4gd2UgKmhhdmUqIHRvIGxvY2sgdGhlIGJ1ZmZlciB0byBwcmV2ZW50IGFueW9uZQorICogZWxzZSBmcm9tIHVzaW5nIGFuZCBwb3NzaWJseSBtb2RpZnlpbmcgaXQgd2hpbGUgdGhlIElPIGlzIGluCisgKiBwcm9ncmVzcy4KKyAqCisgKiBUaGUgZnVuY3Rpb24gcmV0dXJucyBhIHBvaW50ZXIgdG8gdGhlIGJ1ZmZlcl9oZWFkcyB0byBiZSB1c2VkIGZvciBJTy4KKyAqCisgKiBXZSBhc3N1bWUgdGhhdCB0aGUgam91cm5hbCBoYXMgYWxyZWFkeSBiZWVuIGxvY2tlZCBpbiB0aGlzIGZ1bmN0aW9uLgorICoKKyAqIFJldHVybiB2YWx1ZToKKyAqICA8MDogRXJyb3IKKyAqID49MDogRmluaXNoZWQgT0sKKyAqCisgKiBPbiBzdWNjZXNzOgorICogQml0IDAgc2V0ID09IGVzY2FwZSBwZXJmb3JtZWQgb24gdGhlIGRhdGEKKyAqIEJpdCAxIHNldCA9PSBidWZmZXIgY29weS1vdXQgcGVyZm9ybWVkIChrZnJlZSB0aGUgZGF0YSBhZnRlciBJTykKKyAqLworCitpbnQgamJkMl9qb3VybmFsX3dyaXRlX21ldGFkYXRhX2J1ZmZlcih0cmFuc2FjdGlvbl90ICp0cmFuc2FjdGlvbiwKKwkJCQkgIHN0cnVjdCBqb3VybmFsX2hlYWQgICpqaF9pbiwKKwkJCQkgIHN0cnVjdCBqb3VybmFsX2hlYWQgKipqaF9vdXQsCisJCQkJICB1bnNpZ25lZCBsb25nIGxvbmcgYmxvY2tucikKK3sKKwlpbnQgbmVlZF9jb3B5X291dCA9IDA7CisJaW50IGRvbmVfY29weV9vdXQgPSAwOworCWludCBkb19lc2NhcGUgPSAwOworCWNoYXIgKm1hcHBlZF9kYXRhOworCXN0cnVjdCBidWZmZXJfaGVhZCAqbmV3X2JoOworCXN0cnVjdCBqb3VybmFsX2hlYWQgKm5ld19qaDsKKwlzdHJ1Y3QgcGFnZSAqbmV3X3BhZ2U7CisJdW5zaWduZWQgaW50IG5ld19vZmZzZXQ7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaF9pbiA9IGpoMmJoKGpoX2luKTsKKworCS8qCisJICogVGhlIGJ1ZmZlciByZWFsbHkgc2hvdWxkbid0IGJlIGxvY2tlZDogb25seSB0aGUgY3VycmVudCBjb21taXR0aW5nCisJICogdHJhbnNhY3Rpb24gaXMgYWxsb3dlZCB0byB3cml0ZSBpdCwgc28gbm9ib2R5IGVsc2UgaXMgYWxsb3dlZAorCSAqIHRvIGRvIGFueSBJTy4KKwkgKgorCSAqIGFrcG06IGV4Y2VwdCBpZiB3ZSdyZSBqb3VybmFsbGluZyBkYXRhLCBhbmQgd3JpdGUoKSBvdXRwdXQgaXMKKwkgKiBhbHNvIHBhcnQgb2YgYSBzaGFyZWQgbWFwcGluZywgYW5kIGFub3RoZXIgdGhyZWFkIGhhcworCSAqIGRlY2lkZWQgdG8gbGF1bmNoIGEgd3JpdGVwYWdlKCkgYWdhaW5zdCB0aGlzIGJ1ZmZlci4KKwkgKi8KKwlKX0FTU0VSVF9CSChiaF9pbiwgYnVmZmVyX2piZGRpcnR5KGJoX2luKSk7CisKKwluZXdfYmggPSBhbGxvY19idWZmZXJfaGVhZChHRlBfTk9GU3xfX0dGUF9OT0ZBSUwpOworCisJLyoKKwkgKiBJZiBhIG5ldyB0cmFuc2FjdGlvbiBoYXMgYWxyZWFkeSBkb25lIGEgYnVmZmVyIGNvcHktb3V0LCB0aGVuCisJICogd2UgdXNlIHRoYXQgdmVyc2lvbiBvZiB0aGUgZGF0YSBmb3IgdGhlIGNvbW1pdC4KKwkgKi8KKwlqYmRfbG9ja19iaF9zdGF0ZShiaF9pbik7CityZXBlYXQ6CisJaWYgKGpoX2luLT5iX2Zyb3plbl9kYXRhKSB7CisJCWRvbmVfY29weV9vdXQgPSAxOworCQluZXdfcGFnZSA9IHZpcnRfdG9fcGFnZShqaF9pbi0+Yl9mcm96ZW5fZGF0YSk7CisJCW5ld19vZmZzZXQgPSBvZmZzZXRfaW5fcGFnZShqaF9pbi0+Yl9mcm96ZW5fZGF0YSk7CisJfSBlbHNlIHsKKwkJbmV3X3BhZ2UgPSBqaDJiaChqaF9pbiktPmJfcGFnZTsKKwkJbmV3X29mZnNldCA9IG9mZnNldF9pbl9wYWdlKGpoMmJoKGpoX2luKS0+Yl9kYXRhKTsKKwl9CisKKwltYXBwZWRfZGF0YSA9IGttYXBfYXRvbWljKG5ld19wYWdlLCBLTV9VU0VSMCk7CisJLyoKKwkgKiBDaGVjayBmb3IgZXNjYXBpbmcKKwkgKi8KKwlpZiAoKigoX19iZTMyICopKG1hcHBlZF9kYXRhICsgbmV3X29mZnNldCkpID09CisJCQkJY3B1X3RvX2JlMzIoSkJEMl9NQUdJQ19OVU1CRVIpKSB7CisJCW5lZWRfY29weV9vdXQgPSAxOworCQlkb19lc2NhcGUgPSAxOworCX0KKwlrdW5tYXBfYXRvbWljKG1hcHBlZF9kYXRhLCBLTV9VU0VSMCk7CisKKwkvKgorCSAqIERvIHdlIG5lZWQgdG8gZG8gYSBkYXRhIGNvcHk/CisJICovCisJaWYgKG5lZWRfY29weV9vdXQgJiYgIWRvbmVfY29weV9vdXQpIHsKKwkJY2hhciAqdG1wOworCisJCWpiZF91bmxvY2tfYmhfc3RhdGUoYmhfaW4pOworCQl0bXAgPSBqYmQyX3NsYWJfYWxsb2MoYmhfaW4tPmJfc2l6ZSwgR0ZQX05PRlMpOworCQlqYmRfbG9ja19iaF9zdGF0ZShiaF9pbik7CisJCWlmIChqaF9pbi0+Yl9mcm96ZW5fZGF0YSkgeworCQkJamJkMl9zbGFiX2ZyZWUodG1wLCBiaF9pbi0+Yl9zaXplKTsKKwkJCWdvdG8gcmVwZWF0OworCQl9CisKKwkJamhfaW4tPmJfZnJvemVuX2RhdGEgPSB0bXA7CisJCW1hcHBlZF9kYXRhID0ga21hcF9hdG9taWMobmV3X3BhZ2UsIEtNX1VTRVIwKTsKKwkJbWVtY3B5KHRtcCwgbWFwcGVkX2RhdGEgKyBuZXdfb2Zmc2V0LCBqaDJiaChqaF9pbiktPmJfc2l6ZSk7CisJCWt1bm1hcF9hdG9taWMobWFwcGVkX2RhdGEsIEtNX1VTRVIwKTsKKworCQluZXdfcGFnZSA9IHZpcnRfdG9fcGFnZSh0bXApOworCQluZXdfb2Zmc2V0ID0gb2Zmc2V0X2luX3BhZ2UodG1wKTsKKwkJZG9uZV9jb3B5X291dCA9IDE7CisJfQorCisJLyoKKwkgKiBEaWQgd2UgbmVlZCB0byBkbyBhbiBlc2NhcGluZz8gIE5vdyB3ZSd2ZSBkb25lIGFsbCB0aGUKKwkgKiBjb3B5aW5nLCB3ZSBjYW4gZmluYWxseSBkbyBzby4KKwkgKi8KKwlpZiAoZG9fZXNjYXBlKSB7CisJCW1hcHBlZF9kYXRhID0ga21hcF9hdG9taWMobmV3X3BhZ2UsIEtNX1VTRVIwKTsKKwkJKigodW5zaWduZWQgaW50ICopKG1hcHBlZF9kYXRhICsgbmV3X29mZnNldCkpID0gMDsKKwkJa3VubWFwX2F0b21pYyhtYXBwZWRfZGF0YSwgS01fVVNFUjApOworCX0KKworCS8qIGtlZXAgc3Vic2VxdWVudCBhc3NlcnRpb25zIHNhbmUgKi8KKwluZXdfYmgtPmJfc3RhdGUgPSAwOworCWluaXRfYnVmZmVyKG5ld19iaCwgTlVMTCwgTlVMTCk7CisJYXRvbWljX3NldCgmbmV3X2JoLT5iX2NvdW50LCAxKTsKKwlqYmRfdW5sb2NrX2JoX3N0YXRlKGJoX2luKTsKKworCW5ld19qaCA9IGpiZDJfam91cm5hbF9hZGRfam91cm5hbF9oZWFkKG5ld19iaCk7CS8qIFRoaXMgc2xlZXBzICovCisKKwlzZXRfYmhfcGFnZShuZXdfYmgsIG5ld19wYWdlLCBuZXdfb2Zmc2V0KTsKKwluZXdfamgtPmJfdHJhbnNhY3Rpb24gPSBOVUxMOworCW5ld19iaC0+Yl9zaXplID0gamgyYmgoamhfaW4pLT5iX3NpemU7CisJbmV3X2JoLT5iX2JkZXYgPSB0cmFuc2FjdGlvbi0+dF9qb3VybmFsLT5qX2RldjsKKwluZXdfYmgtPmJfYmxvY2tuciA9IGJsb2NrbnI7CisJc2V0X2J1ZmZlcl9tYXBwZWQobmV3X2JoKTsKKwlzZXRfYnVmZmVyX2RpcnR5KG5ld19iaCk7CisKKwkqamhfb3V0ID0gbmV3X2poOworCisJLyoKKwkgKiBUaGUgdG8tYmUtd3JpdHRlbiBidWZmZXIgbmVlZHMgdG8gZ2V0IG1vdmVkIHRvIHRoZSBpbyBxdWV1ZSwKKwkgKiBhbmQgdGhlIG9yaWdpbmFsIGJ1ZmZlciB3aG9zZSBjb250ZW50cyB3ZSBhcmUgc2hhZG93aW5nIG9yCisJICogY29weWluZyBpcyBtb3ZlZCB0byB0aGUgdHJhbnNhY3Rpb24ncyBzaGFkb3cgcXVldWUuCisJICovCisJSkJVRkZFUl9UUkFDRShqaF9pbiwgImZpbGUgYXMgQkpfU2hhZG93Iik7CisJamJkMl9qb3VybmFsX2ZpbGVfYnVmZmVyKGpoX2luLCB0cmFuc2FjdGlvbiwgQkpfU2hhZG93KTsKKwlKQlVGRkVSX1RSQUNFKG5ld19qaCwgImZpbGUgYXMgQkpfSU8iKTsKKwlqYmQyX2pvdXJuYWxfZmlsZV9idWZmZXIobmV3X2poLCB0cmFuc2FjdGlvbiwgQkpfSU8pOworCisJcmV0dXJuIGRvX2VzY2FwZSB8IChkb25lX2NvcHlfb3V0IDw8IDEpOworfQorCisvKgorICogQWxsb2NhdGlvbiBjb2RlIGZvciB0aGUgam91cm5hbCBmaWxlLiAgTWFuYWdlIHRoZSBzcGFjZSBsZWZ0IGluIHRoZQorICogam91cm5hbCwgc28gdGhhdCB3ZSBjYW4gYmVnaW4gY2hlY2twb2ludGluZyB3aGVuIGFwcHJvcHJpYXRlLgorICovCisKKy8qCisgKiBfX2piZDJfbG9nX3NwYWNlX2xlZnQ6IFJldHVybiB0aGUgbnVtYmVyIG9mIGZyZWUgYmxvY2tzIGxlZnQgaW4gdGhlIGpvdXJuYWwuCisgKgorICogQ2FsbGVkIHdpdGggdGhlIGpvdXJuYWwgYWxyZWFkeSBsb2NrZWQuCisgKgorICogQ2FsbGVkIHVuZGVyIGpfc3RhdGVfbG9jaworICovCisKK2ludCBfX2piZDJfbG9nX3NwYWNlX2xlZnQoam91cm5hbF90ICpqb3VybmFsKQoreworCWludCBsZWZ0ID0gam91cm5hbC0+al9mcmVlOworCisJYXNzZXJ0X3NwaW5fbG9ja2VkKCZqb3VybmFsLT5qX3N0YXRlX2xvY2spOworCisJLyoKKwkgKiBCZSBwZXNzaW1pc3RpYyBoZXJlIGFib3V0IHRoZSBudW1iZXIgb2YgdGhvc2UgZnJlZSBibG9ja3Mgd2hpY2gKKwkgKiBtaWdodCBiZSByZXF1aXJlZCBmb3IgbG9nIGRlc2NyaXB0b3IgY29udHJvbCBibG9ja3MuCisJICovCisKKyNkZWZpbmUgTUlOX0xPR19SRVNFUlZFRF9CTE9DS1MgMzIgLyogQWxsb3cgZm9yIHJvdW5kaW5nIGVycm9ycyAqLworCisJbGVmdCAtPSBNSU5fTE9HX1JFU0VSVkVEX0JMT0NLUzsKKworCWlmIChsZWZ0IDw9IDApCisJCXJldHVybiAwOworCWxlZnQgLT0gKGxlZnQgPj4gMyk7CisJcmV0dXJuIGxlZnQ7Cit9CisKKy8qCisgKiBDYWxsZWQgdW5kZXIgal9zdGF0ZV9sb2NrLiAgUmV0dXJucyB0cnVlIGlmIGEgdHJhbnNhY3Rpb24gd2FzIHN0YXJ0ZWQuCisgKi8KK2ludCBfX2piZDJfbG9nX3N0YXJ0X2NvbW1pdChqb3VybmFsX3QgKmpvdXJuYWwsIHRpZF90IHRhcmdldCkKK3sKKwkvKgorCSAqIEFyZSB3ZSBhbHJlYWR5IGRvaW5nIGEgcmVjZW50IGVub3VnaCBjb21taXQ/CisJICovCisJaWYgKCF0aWRfZ2VxKGpvdXJuYWwtPmpfY29tbWl0X3JlcXVlc3QsIHRhcmdldCkpIHsKKwkJLyoKKwkJICogV2Ugd2FudCBhIG5ldyBjb21taXQ6IE9LLCBtYXJrIHRoZSByZXF1ZXN0IGFuZCB3YWt1cCB0aGUKKwkJICogY29tbWl0IHRocmVhZC4gIFdlIGRvIF9ub3RfIGRvIHRoZSBjb21taXQgb3Vyc2VsdmVzLgorCQkgKi8KKworCQlqb3VybmFsLT5qX2NvbW1pdF9yZXF1ZXN0ID0gdGFyZ2V0OworCQlqYmRfZGVidWcoMSwgIkpCRDogcmVxdWVzdGluZyBjb21taXQgJWQvJWRcbiIsCisJCQkgIGpvdXJuYWwtPmpfY29tbWl0X3JlcXVlc3QsCisJCQkgIGpvdXJuYWwtPmpfY29tbWl0X3NlcXVlbmNlKTsKKwkJd2FrZV91cCgmam91cm5hbC0+al93YWl0X2NvbW1pdCk7CisJCXJldHVybiAxOworCX0KKwlyZXR1cm4gMDsKK30KKworaW50IGpiZDJfbG9nX3N0YXJ0X2NvbW1pdChqb3VybmFsX3QgKmpvdXJuYWwsIHRpZF90IHRpZCkKK3sKKwlpbnQgcmV0OworCisJc3Bpbl9sb2NrKCZqb3VybmFsLT5qX3N0YXRlX2xvY2spOworCXJldCA9IF9famJkMl9sb2dfc3RhcnRfY29tbWl0KGpvdXJuYWwsIHRpZCk7CisJc3Bpbl91bmxvY2soJmpvdXJuYWwtPmpfc3RhdGVfbG9jayk7CisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqIEZvcmNlIGFuZCB3YWl0IHVwb24gYSBjb21taXQgaWYgdGhlIGNhbGxpbmcgcHJvY2VzcyBpcyBub3Qgd2l0aGluCisgKiB0cmFuc2FjdGlvbi4gIFRoaXMgaXMgdXNlZCBmb3IgZm9yY2luZyBvdXQgdW5kby1wcm90ZWN0ZWQgZGF0YSB3aGljaCBjb250YWlucworICogYml0bWFwcywgd2hlbiB0aGUgZnMgaXMgcnVubmluZyBvdXQgb2Ygc3BhY2UuCisgKgorICogV2UgY2FuIG9ubHkgZm9yY2UgdGhlIHJ1bm5pbmcgdHJhbnNhY3Rpb24gaWYgd2UgZG9uJ3QgaGF2ZSBhbiBhY3RpdmUgaGFuZGxlOworICogb3RoZXJ3aXNlLCB3ZSB3aWxsIGRlYWRsb2NrLgorICoKKyAqIFJldHVybnMgdHJ1ZSBpZiBhIHRyYW5zYWN0aW9uIHdhcyBzdGFydGVkLgorICovCitpbnQgamJkMl9qb3VybmFsX2ZvcmNlX2NvbW1pdF9uZXN0ZWQoam91cm5hbF90ICpqb3VybmFsKQoreworCXRyYW5zYWN0aW9uX3QgKnRyYW5zYWN0aW9uID0gTlVMTDsKKwl0aWRfdCB0aWQ7CisKKwlzcGluX2xvY2soJmpvdXJuYWwtPmpfc3RhdGVfbG9jayk7CisJaWYgKGpvdXJuYWwtPmpfcnVubmluZ190cmFuc2FjdGlvbiAmJiAhY3VycmVudC0+am91cm5hbF9pbmZvKSB7CisJCXRyYW5zYWN0aW9uID0gam91cm5hbC0+al9ydW5uaW5nX3RyYW5zYWN0aW9uOworCQlfX2piZDJfbG9nX3N0YXJ0X2NvbW1pdChqb3VybmFsLCB0cmFuc2FjdGlvbi0+dF90aWQpOworCX0gZWxzZSBpZiAoam91cm5hbC0+al9jb21taXR0aW5nX3RyYW5zYWN0aW9uKQorCQl0cmFuc2FjdGlvbiA9IGpvdXJuYWwtPmpfY29tbWl0dGluZ190cmFuc2FjdGlvbjsKKworCWlmICghdHJhbnNhY3Rpb24pIHsKKwkJc3Bpbl91bmxvY2soJmpvdXJuYWwtPmpfc3RhdGVfbG9jayk7CisJCXJldHVybiAwOwkvKiBOb3RoaW5nIHRvIHJldHJ5ICovCisJfQorCisJdGlkID0gdHJhbnNhY3Rpb24tPnRfdGlkOworCXNwaW5fdW5sb2NrKCZqb3VybmFsLT5qX3N0YXRlX2xvY2spOworCWpiZDJfbG9nX3dhaXRfY29tbWl0KGpvdXJuYWwsIHRpZCk7CisJcmV0dXJuIDE7Cit9CisKKy8qCisgKiBTdGFydCBhIGNvbW1pdCBvZiB0aGUgY3VycmVudCBydW5uaW5nIHRyYW5zYWN0aW9uIChpZiBhbnkpLiAgUmV0dXJucyB0cnVlCisgKiBpZiBhIHRyYW5zYWN0aW9uIHdhcyBzdGFydGVkLCBhbmQgZmlsbHMgaXRzIHRpZCBpbiBhdCAqcHRpZAorICovCitpbnQgamJkMl9qb3VybmFsX3N0YXJ0X2NvbW1pdChqb3VybmFsX3QgKmpvdXJuYWwsIHRpZF90ICpwdGlkKQoreworCWludCByZXQgPSAwOworCisJc3Bpbl9sb2NrKCZqb3VybmFsLT5qX3N0YXRlX2xvY2spOworCWlmIChqb3VybmFsLT5qX3J1bm5pbmdfdHJhbnNhY3Rpb24pIHsKKwkJdGlkX3QgdGlkID0gam91cm5hbC0+al9ydW5uaW5nX3RyYW5zYWN0aW9uLT50X3RpZDsKKworCQlyZXQgPSBfX2piZDJfbG9nX3N0YXJ0X2NvbW1pdChqb3VybmFsLCB0aWQpOworCQlpZiAocmV0ICYmIHB0aWQpCisJCQkqcHRpZCA9IHRpZDsKKwl9IGVsc2UgaWYgKGpvdXJuYWwtPmpfY29tbWl0dGluZ190cmFuc2FjdGlvbiAmJiBwdGlkKSB7CisJCS8qCisJCSAqIElmIGV4dDNfd3JpdGVfc3VwZXIoKSByZWNlbnRseSBzdGFydGVkIGEgY29tbWl0LCB0aGVuIHdlCisJCSAqIGhhdmUgdG8gd2FpdCBmb3IgY29tcGxldGlvbiBvZiB0aGF0IHRyYW5zYWN0aW9uCisJCSAqLworCQkqcHRpZCA9IGpvdXJuYWwtPmpfY29tbWl0dGluZ190cmFuc2FjdGlvbi0+dF90aWQ7CisJCXJldCA9IDE7CisJfQorCXNwaW5fdW5sb2NrKCZqb3VybmFsLT5qX3N0YXRlX2xvY2spOworCXJldHVybiByZXQ7Cit9CisKKy8qCisgKiBXYWl0IGZvciBhIHNwZWNpZmllZCBjb21taXQgdG8gY29tcGxldGUuCisgKiBUaGUgY2FsbGVyIG1heSBub3QgaG9sZCB0aGUgam91cm5hbCBsb2NrLgorICovCitpbnQgamJkMl9sb2dfd2FpdF9jb21taXQoam91cm5hbF90ICpqb3VybmFsLCB0aWRfdCB0aWQpCit7CisJaW50IGVyciA9IDA7CisKKyNpZmRlZiBDT05GSUdfSkJEX0RFQlVHCisJc3Bpbl9sb2NrKCZqb3VybmFsLT5qX3N0YXRlX2xvY2spOworCWlmICghdGlkX2dlcShqb3VybmFsLT5qX2NvbW1pdF9yZXF1ZXN0LCB0aWQpKSB7CisJCXByaW50ayhLRVJOX0VNRVJHCisJCSAgICAgICAiJXM6IGVycm9yOiBqX2NvbW1pdF9yZXF1ZXN0PSVkLCB0aWQ9JWRcbiIsCisJCSAgICAgICBfX0ZVTkNUSU9OX18sIGpvdXJuYWwtPmpfY29tbWl0X3JlcXVlc3QsIHRpZCk7CisJfQorCXNwaW5fdW5sb2NrKCZqb3VybmFsLT5qX3N0YXRlX2xvY2spOworI2VuZGlmCisJc3Bpbl9sb2NrKCZqb3VybmFsLT5qX3N0YXRlX2xvY2spOworCXdoaWxlICh0aWRfZ3QodGlkLCBqb3VybmFsLT5qX2NvbW1pdF9zZXF1ZW5jZSkpIHsKKwkJamJkX2RlYnVnKDEsICJKQkQ6IHdhbnQgJWQsIGpfY29tbWl0X3NlcXVlbmNlPSVkXG4iLAorCQkJCSAgdGlkLCBqb3VybmFsLT5qX2NvbW1pdF9zZXF1ZW5jZSk7CisJCXdha2VfdXAoJmpvdXJuYWwtPmpfd2FpdF9jb21taXQpOworCQlzcGluX3VubG9jaygmam91cm5hbC0+al9zdGF0ZV9sb2NrKTsKKwkJd2FpdF9ldmVudChqb3VybmFsLT5qX3dhaXRfZG9uZV9jb21taXQsCisJCQkJIXRpZF9ndCh0aWQsIGpvdXJuYWwtPmpfY29tbWl0X3NlcXVlbmNlKSk7CisJCXNwaW5fbG9jaygmam91cm5hbC0+al9zdGF0ZV9sb2NrKTsKKwl9CisJc3Bpbl91bmxvY2soJmpvdXJuYWwtPmpfc3RhdGVfbG9jayk7CisKKwlpZiAodW5saWtlbHkoaXNfam91cm5hbF9hYm9ydGVkKGpvdXJuYWwpKSkgeworCQlwcmludGsoS0VSTl9FTUVSRyAiam91cm5hbCBjb21taXQgSS9PIGVycm9yXG4iKTsKKwkJZXJyID0gLUVJTzsKKwl9CisJcmV0dXJuIGVycjsKK30KKworLyoKKyAqIExvZyBidWZmZXIgYWxsb2NhdGlvbiByb3V0aW5lczoKKyAqLworCitpbnQgamJkMl9qb3VybmFsX25leHRfbG9nX2Jsb2NrKGpvdXJuYWxfdCAqam91cm5hbCwgdW5zaWduZWQgbG9uZyBsb25nICpyZXRwKQoreworCXVuc2lnbmVkIGxvbmcgYmxvY2tucjsKKworCXNwaW5fbG9jaygmam91cm5hbC0+al9zdGF0ZV9sb2NrKTsKKwlKX0FTU0VSVChqb3VybmFsLT5qX2ZyZWUgPiAxKTsKKworCWJsb2NrbnIgPSBqb3VybmFsLT5qX2hlYWQ7CisJam91cm5hbC0+al9oZWFkKys7CisJam91cm5hbC0+al9mcmVlLS07CisJaWYgKGpvdXJuYWwtPmpfaGVhZCA9PSBqb3VybmFsLT5qX2xhc3QpCisJCWpvdXJuYWwtPmpfaGVhZCA9IGpvdXJuYWwtPmpfZmlyc3Q7CisJc3Bpbl91bmxvY2soJmpvdXJuYWwtPmpfc3RhdGVfbG9jayk7CisJcmV0dXJuIGpiZDJfam91cm5hbF9ibWFwKGpvdXJuYWwsIGJsb2NrbnIsIHJldHApOworfQorCisvKgorICogQ29udmVyc2lvbiBvZiBsb2dpY2FsIHRvIHBoeXNpY2FsIGJsb2NrIG51bWJlcnMgZm9yIHRoZSBqb3VybmFsCisgKgorICogT24gZXh0ZXJuYWwgam91cm5hbHMgdGhlIGpvdXJuYWwgYmxvY2tzIGFyZSBpZGVudGl0eS1tYXBwZWQsIHNvCisgKiB0aGlzIGlzIGEgbm8tb3AuICBJZiBuZWVkZWQsIHdlIGNhbiB1c2Ugal9ibGtfb2Zmc2V0IC0gZXZlcnl0aGluZyBpcworICogcmVhZHkuCisgKi8KK2ludCBqYmQyX2pvdXJuYWxfYm1hcChqb3VybmFsX3QgKmpvdXJuYWwsIHVuc2lnbmVkIGxvbmcgYmxvY2tuciwKKwkJIHVuc2lnbmVkIGxvbmcgbG9uZyAqcmV0cCkKK3sKKwlpbnQgZXJyID0gMDsKKwl1bnNpZ25lZCBsb25nIGxvbmcgcmV0OworCisJaWYgKGpvdXJuYWwtPmpfaW5vZGUpIHsKKwkJcmV0ID0gYm1hcChqb3VybmFsLT5qX2lub2RlLCBibG9ja25yKTsKKwkJaWYgKHJldCkKKwkJCSpyZXRwID0gcmV0OworCQllbHNlIHsKKwkJCWNoYXIgYltCREVWTkFNRV9TSVpFXTsKKworCQkJcHJpbnRrKEtFUk5fQUxFUlQgIiVzOiBqb3VybmFsIGJsb2NrIG5vdCBmb3VuZCAiCisJCQkJCSJhdCBvZmZzZXQgJWx1IG9uICVzXG4iLAorCQkJCV9fRlVOQ1RJT05fXywKKwkJCQlibG9ja25yLAorCQkJCWJkZXZuYW1lKGpvdXJuYWwtPmpfZGV2LCBiKSk7CisJCQllcnIgPSAtRUlPOworCQkJX19qb3VybmFsX2Fib3J0X3NvZnQoam91cm5hbCwgZXJyKTsKKwkJfQorCX0gZWxzZSB7CisJCSpyZXRwID0gYmxvY2tucjsgLyogK2pvdXJuYWwtPmpfYmxrX29mZnNldCAqLworCX0KKwlyZXR1cm4gZXJyOworfQorCisvKgorICogV2UgcGxheSBidWZmZXJfaGVhZCBhbGlhc2luZyB0cmlja3MgdG8gd3JpdGUgZGF0YS9tZXRhZGF0YSBibG9ja3MgdG8KKyAqIHRoZSBqb3VybmFsIHdpdGhvdXQgY29weWluZyB0aGVpciBjb250ZW50cywgYnV0IGZvciBqb3VybmFsCisgKiBkZXNjcmlwdG9yIGJsb2NrcyB3ZSBkbyBuZWVkIHRvIGdlbmVyYXRlIGJvbmEgZmlkZSBidWZmZXJzLgorICoKKyAqIEFmdGVyIHRoZSBjYWxsZXIgb2YgamJkMl9qb3VybmFsX2dldF9kZXNjcmlwdG9yX2J1ZmZlcigpIGhhcyBmaW5pc2hlZCBtb2RpZnlpbmcKKyAqIHRoZSBidWZmZXIncyBjb250ZW50cyB0aGV5IHJlYWxseSBzaG91bGQgcnVuIGZsdXNoX2RjYWNoZV9wYWdlKGJoLT5iX3BhZ2UpLgorICogQnV0IHdlIGRvbid0IGJvdGhlciBkb2luZyB0aGF0LCBzbyB0aGVyZSB3aWxsIGJlIGNvaGVyZW5jeSBwcm9ibGVtcyB3aXRoCisgKiBtbWFwcyBvZiBibG9ja2RldnMgd2hpY2ggaG9sZCBsaXZlIEpCRC1jb250cm9sbGVkIGZpbGVzeXN0ZW1zLgorICovCitzdHJ1Y3Qgam91cm5hbF9oZWFkICpqYmQyX2pvdXJuYWxfZ2V0X2Rlc2NyaXB0b3JfYnVmZmVyKGpvdXJuYWxfdCAqam91cm5hbCkKK3sKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoOworCXVuc2lnbmVkIGxvbmcgbG9uZyBibG9ja25yOworCWludCBlcnI7CisKKwllcnIgPSBqYmQyX2pvdXJuYWxfbmV4dF9sb2dfYmxvY2soam91cm5hbCwgJmJsb2NrbnIpOworCisJaWYgKGVycikKKwkJcmV0dXJuIE5VTEw7CisKKwliaCA9IF9fZ2V0YmxrKGpvdXJuYWwtPmpfZGV2LCBibG9ja25yLCBqb3VybmFsLT5qX2Jsb2Nrc2l6ZSk7CisJbG9ja19idWZmZXIoYmgpOworCW1lbXNldChiaC0+Yl9kYXRhLCAwLCBqb3VybmFsLT5qX2Jsb2Nrc2l6ZSk7CisJc2V0X2J1ZmZlcl91cHRvZGF0ZShiaCk7CisJdW5sb2NrX2J1ZmZlcihiaCk7CisJQlVGRkVSX1RSQUNFKGJoLCAicmV0dXJuIHRoaXMgYnVmZmVyIik7CisJcmV0dXJuIGpiZDJfam91cm5hbF9hZGRfam91cm5hbF9oZWFkKGJoKTsKK30KKworLyoKKyAqIE1hbmFnZW1lbnQgZm9yIGpvdXJuYWwgY29udHJvbCBibG9ja3M6IGZ1bmN0aW9ucyB0byBjcmVhdGUgYW5kCisgKiBkZXN0cm95IGpvdXJuYWxfdCBzdHJ1Y3R1cmVzLCBhbmQgdG8gaW5pdGlhbGlzZSBhbmQgcmVhZCBleGlzdGluZworICogam91cm5hbCBibG9ja3MgZnJvbSBkaXNrLiAgKi8KKworLyogRmlyc3Q6IGNyZWF0ZSBhbmQgc2V0dXAgYSBqb3VybmFsX3Qgb2JqZWN0IGluIG1lbW9yeS4gIFdlIGluaXRpYWxpc2UKKyAqIHZlcnkgZmV3IGZpZWxkcyB5ZXQ6IHRoYXQgaGFzIHRvIHdhaXQgdW50aWwgd2UgaGF2ZSBjcmVhdGVkIHRoZQorICogam91cm5hbCBzdHJ1Y3R1cmVzIGZyb20gZnJvbSBzY3JhdGNoLCBvciBsb2FkZWQgdGhlbSBmcm9tIGRpc2suICovCisKK3N0YXRpYyBqb3VybmFsX3QgKiBqb3VybmFsX2luaXRfY29tbW9uICh2b2lkKQoreworCWpvdXJuYWxfdCAqam91cm5hbDsKKwlpbnQgZXJyOworCisJam91cm5hbCA9IGpiZF9rbWFsbG9jKHNpemVvZigqam91cm5hbCksIEdGUF9LRVJORUwpOworCWlmICgham91cm5hbCkKKwkJZ290byBmYWlsOworCW1lbXNldChqb3VybmFsLCAwLCBzaXplb2YoKmpvdXJuYWwpKTsKKworCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmpvdXJuYWwtPmpfd2FpdF90cmFuc2FjdGlvbl9sb2NrZWQpOworCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmpvdXJuYWwtPmpfd2FpdF9sb2dzcGFjZSk7CisJaW5pdF93YWl0cXVldWVfaGVhZCgmam91cm5hbC0+al93YWl0X2RvbmVfY29tbWl0KTsKKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZqb3VybmFsLT5qX3dhaXRfY2hlY2twb2ludCk7CisJaW5pdF93YWl0cXVldWVfaGVhZCgmam91cm5hbC0+al93YWl0X2NvbW1pdCk7CisJaW5pdF93YWl0cXVldWVfaGVhZCgmam91cm5hbC0+al93YWl0X3VwZGF0ZXMpOworCW11dGV4X2luaXQoJmpvdXJuYWwtPmpfYmFycmllcik7CisJbXV0ZXhfaW5pdCgmam91cm5hbC0+al9jaGVja3BvaW50X211dGV4KTsKKwlzcGluX2xvY2tfaW5pdCgmam91cm5hbC0+al9yZXZva2VfbG9jayk7CisJc3Bpbl9sb2NrX2luaXQoJmpvdXJuYWwtPmpfbGlzdF9sb2NrKTsKKwlzcGluX2xvY2tfaW5pdCgmam91cm5hbC0+al9zdGF0ZV9sb2NrKTsKKworCWpvdXJuYWwtPmpfY29tbWl0X2ludGVydmFsID0gKEhaICogSkJEX0RFRkFVTFRfTUFYX0NPTU1JVF9BR0UpOworCisJLyogVGhlIGpvdXJuYWwgaXMgbWFya2VkIGZvciBlcnJvciB1bnRpbCB3ZSBzdWNjZWVkIHdpdGggcmVjb3ZlcnkhICovCisJam91cm5hbC0+al9mbGFncyA9IEpCRDJfQUJPUlQ7CisKKwkvKiBTZXQgdXAgYSBkZWZhdWx0LXNpemVkIHJldm9rZSB0YWJsZSBmb3IgdGhlIG5ldyBtb3VudC4gKi8KKwllcnIgPSBqYmQyX2pvdXJuYWxfaW5pdF9yZXZva2Uoam91cm5hbCwgSk9VUk5BTF9SRVZPS0VfREVGQVVMVF9IQVNIKTsKKwlpZiAoZXJyKSB7CisJCWtmcmVlKGpvdXJuYWwpOworCQlnb3RvIGZhaWw7CisJfQorCXJldHVybiBqb3VybmFsOworZmFpbDoKKwlyZXR1cm4gTlVMTDsKK30KKworLyogamJkMl9qb3VybmFsX2luaXRfZGV2IGFuZCBqYmQyX2pvdXJuYWxfaW5pdF9pbm9kZToKKyAqCisgKiBDcmVhdGUgYSBqb3VybmFsIHN0cnVjdHVyZSBhc3NpZ25lZCBzb21lIGZpeGVkIHNldCBvZiBkaXNrIGJsb2NrcyB0bworICogdGhlIGpvdXJuYWwuICBXZSBkb24ndCBhY3R1YWxseSB0b3VjaCB0aG9zZSBkaXNrIGJsb2NrcyB5ZXQsIGJ1dCB3ZQorICogbmVlZCB0byBzZXQgdXAgYWxsIG9mIHRoZSBtYXBwaW5nIGluZm9ybWF0aW9uIHRvIHRlbGwgdGhlIGpvdXJuYWxpbmcKKyAqIHN5c3RlbSB3aGVyZSB0aGUgam91cm5hbCBibG9ja3MgYXJlLgorICoKKyAqLworCisvKioKKyAqICBqb3VybmFsX3QgKiBqYmQyX2pvdXJuYWxfaW5pdF9kZXYoKSAtIGNyZWF0ZXMgYW4gaW5pdGlhbGlzZXMgYSBqb3VybmFsIHN0cnVjdHVyZQorICogIEBiZGV2OiBCbG9jayBkZXZpY2Ugb24gd2hpY2ggdG8gY3JlYXRlIHRoZSBqb3VybmFsCisgKiAgQGZzX2RldjogRGV2aWNlIHdoaWNoIGhvbGQgam91cm5hbGxlZCBmaWxlc3lzdGVtIGZvciB0aGlzIGpvdXJuYWwuCisgKiAgQHN0YXJ0OiBCbG9jayBuciBTdGFydCBvZiBqb3VybmFsLgorICogIEBsZW46ICBMZW5ndGggb2YgdGhlIGpvdXJuYWwgaW4gYmxvY2tzLgorICogIEBibG9ja3NpemU6IGJsb2Nrc2l6ZSBvZiBqb3VybmFsbGluZyBkZXZpY2UKKyAqICBAcmV0dXJuczogYSBuZXdseSBjcmVhdGVkIGpvdXJuYWxfdCAqCisgKgorICogIGpiZDJfam91cm5hbF9pbml0X2RldiBjcmVhdGVzIGEgam91cm5hbCB3aGljaCBtYXBzIGEgZml4ZWQgY29udGlndW91cworICogIHJhbmdlIG9mIGJsb2NrcyBvbiBhbiBhcmJpdHJhcnkgYmxvY2sgZGV2aWNlLgorICoKKyAqLworam91cm5hbF90ICogamJkMl9qb3VybmFsX2luaXRfZGV2KHN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXYsCisJCQlzdHJ1Y3QgYmxvY2tfZGV2aWNlICpmc19kZXYsCisJCQl1bnNpZ25lZCBsb25nIGxvbmcgc3RhcnQsIGludCBsZW4sIGludCBibG9ja3NpemUpCit7CisJam91cm5hbF90ICpqb3VybmFsID0gam91cm5hbF9pbml0X2NvbW1vbigpOworCXN0cnVjdCBidWZmZXJfaGVhZCAqYmg7CisJaW50IG47CisKKwlpZiAoIWpvdXJuYWwpCisJCXJldHVybiBOVUxMOworCisJLyogam91cm5hbCBkZXNjcmlwdG9yIGNhbiBzdG9yZSB1cCB0byBuIGJsb2NrcyAtYnp6eiAqLworCWpvdXJuYWwtPmpfYmxvY2tzaXplID0gYmxvY2tzaXplOworCW4gPSBqb3VybmFsLT5qX2Jsb2Nrc2l6ZSAvIHNpemVvZihqb3VybmFsX2Jsb2NrX3RhZ190KTsKKwlqb3VybmFsLT5qX3didWZzaXplID0gbjsKKwlqb3VybmFsLT5qX3didWYgPSBrbWFsbG9jKG4gKiBzaXplb2Yoc3RydWN0IGJ1ZmZlcl9oZWFkKiksIEdGUF9LRVJORUwpOworCWlmICgham91cm5hbC0+al93YnVmKSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IENhbnQgYWxsb2NhdGUgYmhzIGZvciBjb21taXQgdGhyZWFkXG4iLAorCQkJX19GVU5DVElPTl9fKTsKKwkJa2ZyZWUoam91cm5hbCk7CisJCWpvdXJuYWwgPSBOVUxMOworCQlnb3RvIG91dDsKKwl9CisJam91cm5hbC0+al9kZXYgPSBiZGV2OworCWpvdXJuYWwtPmpfZnNfZGV2ID0gZnNfZGV2OworCWpvdXJuYWwtPmpfYmxrX29mZnNldCA9IHN0YXJ0OworCWpvdXJuYWwtPmpfbWF4bGVuID0gbGVuOworCisJYmggPSBfX2dldGJsayhqb3VybmFsLT5qX2Rldiwgc3RhcnQsIGpvdXJuYWwtPmpfYmxvY2tzaXplKTsKKwlKX0FTU0VSVChiaCAhPSBOVUxMKTsKKwlqb3VybmFsLT5qX3NiX2J1ZmZlciA9IGJoOworCWpvdXJuYWwtPmpfc3VwZXJibG9jayA9IChqb3VybmFsX3N1cGVyYmxvY2tfdCAqKWJoLT5iX2RhdGE7CitvdXQ6CisJcmV0dXJuIGpvdXJuYWw7Cit9CisKKy8qKgorICogIGpvdXJuYWxfdCAqIGpiZDJfam91cm5hbF9pbml0X2lub2RlICgpIC0gY3JlYXRlcyBhIGpvdXJuYWwgd2hpY2ggbWFwcyB0byBhIGlub2RlLgorICogIEBpbm9kZTogQW4gaW5vZGUgdG8gY3JlYXRlIHRoZSBqb3VybmFsIGluCisgKgorICogamJkMl9qb3VybmFsX2luaXRfaW5vZGUgY3JlYXRlcyBhIGpvdXJuYWwgd2hpY2ggbWFwcyBhbiBvbi1kaXNrIGlub2RlIGFzCisgKiB0aGUgam91cm5hbC4gIFRoZSBpbm9kZSBtdXN0IGV4aXN0IGFscmVhZHksIG11c3Qgc3VwcG9ydCBibWFwKCkgYW5kCisgKiBtdXN0IGhhdmUgYWxsIGRhdGEgYmxvY2tzIHByZWFsbG9jYXRlZC4KKyAqLworam91cm5hbF90ICogamJkMl9qb3VybmFsX2luaXRfaW5vZGUgKHN0cnVjdCBpbm9kZSAqaW5vZGUpCit7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaDsKKwlqb3VybmFsX3QgKmpvdXJuYWwgPSBqb3VybmFsX2luaXRfY29tbW9uKCk7CisJaW50IGVycjsKKwlpbnQgbjsKKwl1bnNpZ25lZCBsb25nIGxvbmcgYmxvY2tucjsKKworCWlmICgham91cm5hbCkKKwkJcmV0dXJuIE5VTEw7CisKKwlqb3VybmFsLT5qX2RldiA9IGpvdXJuYWwtPmpfZnNfZGV2ID0gaW5vZGUtPmlfc2ItPnNfYmRldjsKKwlqb3VybmFsLT5qX2lub2RlID0gaW5vZGU7CisJamJkX2RlYnVnKDEsCisJCSAgImpvdXJuYWwgJXA6IGlub2RlICVzLyVsZCwgc2l6ZSAlTGQsIGJpdHMgJWQsIGJsa3NpemUgJWxkXG4iLAorCQkgIGpvdXJuYWwsIGlub2RlLT5pX3NiLT5zX2lkLCBpbm9kZS0+aV9pbm8sCisJCSAgKGxvbmcgbG9uZykgaW5vZGUtPmlfc2l6ZSwKKwkJICBpbm9kZS0+aV9zYi0+c19ibG9ja3NpemVfYml0cywgaW5vZGUtPmlfc2ItPnNfYmxvY2tzaXplKTsKKworCWpvdXJuYWwtPmpfbWF4bGVuID0gaW5vZGUtPmlfc2l6ZSA+PiBpbm9kZS0+aV9zYi0+c19ibG9ja3NpemVfYml0czsKKwlqb3VybmFsLT5qX2Jsb2Nrc2l6ZSA9IGlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZTsKKworCS8qIGpvdXJuYWwgZGVzY3JpcHRvciBjYW4gc3RvcmUgdXAgdG8gbiBibG9ja3MgLWJ6enogKi8KKwluID0gam91cm5hbC0+al9ibG9ja3NpemUgLyBzaXplb2Yoam91cm5hbF9ibG9ja190YWdfdCk7CisJam91cm5hbC0+al93YnVmc2l6ZSA9IG47CisJam91cm5hbC0+al93YnVmID0ga21hbGxvYyhuICogc2l6ZW9mKHN0cnVjdCBidWZmZXJfaGVhZCopLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWpvdXJuYWwtPmpfd2J1ZikgeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiBDYW50IGFsbG9jYXRlIGJocyBmb3IgY29tbWl0IHRocmVhZFxuIiwKKwkJCV9fRlVOQ1RJT05fXyk7CisJCWtmcmVlKGpvdXJuYWwpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwllcnIgPSBqYmQyX2pvdXJuYWxfYm1hcChqb3VybmFsLCAwLCAmYmxvY2tucik7CisJLyogSWYgdGhhdCBmYWlsZWQsIGdpdmUgdXAgKi8KKwlpZiAoZXJyKSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IENhbm5ub3QgbG9jYXRlIGpvdXJuYWwgc3VwZXJibG9ja1xuIiwKKwkJICAgICAgIF9fRlVOQ1RJT05fXyk7CisJCWtmcmVlKGpvdXJuYWwpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwliaCA9IF9fZ2V0YmxrKGpvdXJuYWwtPmpfZGV2LCBibG9ja25yLCBqb3VybmFsLT5qX2Jsb2Nrc2l6ZSk7CisJSl9BU1NFUlQoYmggIT0gTlVMTCk7CisJam91cm5hbC0+al9zYl9idWZmZXIgPSBiaDsKKwlqb3VybmFsLT5qX3N1cGVyYmxvY2sgPSAoam91cm5hbF9zdXBlcmJsb2NrX3QgKiliaC0+Yl9kYXRhOworCisJcmV0dXJuIGpvdXJuYWw7Cit9CisKKy8qCisgKiBJZiB0aGUgam91cm5hbCBpbml0IG9yIGNyZWF0ZSBhYm9ydHMsIHdlIG5lZWQgdG8gbWFyayB0aGUgam91cm5hbAorICogc3VwZXJibG9jayBhcyBiZWluZyBOVUxMIHRvIHByZXZlbnQgdGhlIGpvdXJuYWwgZGVzdHJveSBmcm9tIHdyaXRpbmcKKyAqIGJhY2sgYSBib2d1cyBzdXBlcmJsb2NrLgorICovCitzdGF0aWMgdm9pZCBqb3VybmFsX2ZhaWxfc3VwZXJibG9jayAoam91cm5hbF90ICpqb3VybmFsKQoreworCXN0cnVjdCBidWZmZXJfaGVhZCAqYmggPSBqb3VybmFsLT5qX3NiX2J1ZmZlcjsKKwlicmVsc2UoYmgpOworCWpvdXJuYWwtPmpfc2JfYnVmZmVyID0gTlVMTDsKK30KKworLyoKKyAqIEdpdmVuIGEgam91cm5hbF90IHN0cnVjdHVyZSwgaW5pdGlhbGlzZSB0aGUgdmFyaW91cyBmaWVsZHMgZm9yCisgKiBzdGFydHVwIG9mIGEgbmV3IGpvdXJuYWxpbmcgc2Vzc2lvbi4gIFdlIHVzZSB0aGlzIGJvdGggd2hlbiBjcmVhdGluZworICogYSBqb3VybmFsLCBhbmQgYWZ0ZXIgcmVjb3ZlcmluZyBhbiBvbGQgam91cm5hbCB0byByZXNldCBpdCBmb3IKKyAqIHN1YnNlcXVlbnQgdXNlLgorICovCisKK3N0YXRpYyBpbnQgam91cm5hbF9yZXNldChqb3VybmFsX3QgKmpvdXJuYWwpCit7CisJam91cm5hbF9zdXBlcmJsb2NrX3QgKnNiID0gam91cm5hbC0+al9zdXBlcmJsb2NrOworCXVuc2lnbmVkIGxvbmcgbG9uZyBmaXJzdCwgbGFzdDsKKworCWZpcnN0ID0gYmUzMl90b19jcHUoc2ItPnNfZmlyc3QpOworCWxhc3QgPSBiZTMyX3RvX2NwdShzYi0+c19tYXhsZW4pOworCisJam91cm5hbC0+al9maXJzdCA9IGZpcnN0OworCWpvdXJuYWwtPmpfbGFzdCA9IGxhc3Q7CisKKwlqb3VybmFsLT5qX2hlYWQgPSBmaXJzdDsKKwlqb3VybmFsLT5qX3RhaWwgPSBmaXJzdDsKKwlqb3VybmFsLT5qX2ZyZWUgPSBsYXN0IC0gZmlyc3Q7CisKKwlqb3VybmFsLT5qX3RhaWxfc2VxdWVuY2UgPSBqb3VybmFsLT5qX3RyYW5zYWN0aW9uX3NlcXVlbmNlOworCWpvdXJuYWwtPmpfY29tbWl0X3NlcXVlbmNlID0gam91cm5hbC0+al90cmFuc2FjdGlvbl9zZXF1ZW5jZSAtIDE7CisJam91cm5hbC0+al9jb21taXRfcmVxdWVzdCA9IGpvdXJuYWwtPmpfY29tbWl0X3NlcXVlbmNlOworCisJam91cm5hbC0+al9tYXhfdHJhbnNhY3Rpb25fYnVmZmVycyA9IGpvdXJuYWwtPmpfbWF4bGVuIC8gNDsKKworCS8qIEFkZCB0aGUgZHluYW1pYyBmaWVsZHMgYW5kIHdyaXRlIGl0IHRvIGRpc2suICovCisJamJkMl9qb3VybmFsX3VwZGF0ZV9zdXBlcmJsb2NrKGpvdXJuYWwsIDEpOworCWpiZDJfam91cm5hbF9zdGFydF90aHJlYWQoam91cm5hbCk7CisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogaW50IGpiZDJfam91cm5hbF9jcmVhdGUoKSAtIEluaXRpYWxpc2UgdGhlIG5ldyBqb3VybmFsIGZpbGUKKyAqIEBqb3VybmFsOiBKb3VybmFsIHRvIGNyZWF0ZS4gVGhpcyBzdHJ1Y3R1cmUgbXVzdCBoYXZlIGJlZW4gaW5pdGlhbGlzZWQKKyAqCisgKiBHaXZlbiBhIGpvdXJuYWxfdCBzdHJ1Y3R1cmUgd2hpY2ggdGVsbHMgdXMgd2hpY2ggZGlzayBibG9ja3Mgd2UgY2FuCisgKiB1c2UsIGNyZWF0ZSBhIG5ldyBqb3VybmFsIHN1cGVyYmxvY2sgYW5kIGluaXRpYWxpc2UgYWxsIG9mIHRoZQorICogam91cm5hbCBmaWVsZHMgZnJvbSBzY3JhdGNoLgorICoqLworaW50IGpiZDJfam91cm5hbF9jcmVhdGUoam91cm5hbF90ICpqb3VybmFsKQoreworCXVuc2lnbmVkIGxvbmcgbG9uZyBibG9ja25yOworCXN0cnVjdCBidWZmZXJfaGVhZCAqYmg7CisJam91cm5hbF9zdXBlcmJsb2NrX3QgKnNiOworCWludCBpLCBlcnI7CisKKwlpZiAoam91cm5hbC0+al9tYXhsZW4gPCBKQkQyX01JTl9KT1VSTkFMX0JMT0NLUykgeworCQlwcmludGsgKEtFUk5fRVJSICJKb3VybmFsIGxlbmd0aCAoJWQgYmxvY2tzKSB0b28gc2hvcnQuXG4iLAorCQkJam91cm5hbC0+al9tYXhsZW4pOworCQlqb3VybmFsX2ZhaWxfc3VwZXJibG9jayhqb3VybmFsKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKGpvdXJuYWwtPmpfaW5vZGUgPT0gTlVMTCkgeworCQkvKgorCQkgKiBXZSBkb24ndCBrbm93IHdoYXQgYmxvY2sgdG8gc3RhcnQgYXQhCisJCSAqLworCQlwcmludGsoS0VSTl9FTUVSRworCQkgICAgICAgIiVzOiBjcmVhdGlvbiBvZiBqb3VybmFsIG9uIGV4dGVybmFsIGRldmljZSFcbiIsCisJCSAgICAgICBfX0ZVTkNUSU9OX18pOworCQlCVUcoKTsKKwl9CisKKwkvKiBaZXJvIG91dCB0aGUgZW50aXJlIGpvdXJuYWwgb24gZGlzay4gIFdlIGNhbm5vdCBhZmZvcmQgdG8KKwkgICBoYXZlIGFueSBibG9ja3Mgb24gZGlzayBiZWdpbm5pbmcgd2l0aCBKQkQyX01BR0lDX05VTUJFUi4gKi8KKwlqYmRfZGVidWcoMSwgIkpCRDogWmVyb2luZyBvdXQgam91cm5hbCBibG9ja3MuLi5cbiIpOworCWZvciAoaSA9IDA7IGkgPCBqb3VybmFsLT5qX21heGxlbjsgaSsrKSB7CisJCWVyciA9IGpiZDJfam91cm5hbF9ibWFwKGpvdXJuYWwsIGksICZibG9ja25yKTsKKwkJaWYgKGVycikKKwkJCXJldHVybiBlcnI7CisJCWJoID0gX19nZXRibGsoam91cm5hbC0+al9kZXYsIGJsb2NrbnIsIGpvdXJuYWwtPmpfYmxvY2tzaXplKTsKKwkJbG9ja19idWZmZXIoYmgpOworCQltZW1zZXQgKGJoLT5iX2RhdGEsIDAsIGpvdXJuYWwtPmpfYmxvY2tzaXplKTsKKwkJQlVGRkVSX1RSQUNFKGJoLCAibWFya2luZyBkaXJ0eSIpOworCQltYXJrX2J1ZmZlcl9kaXJ0eShiaCk7CisJCUJVRkZFUl9UUkFDRShiaCwgIm1hcmtpbmcgdXB0b2RhdGUiKTsKKwkJc2V0X2J1ZmZlcl91cHRvZGF0ZShiaCk7CisJCXVubG9ja19idWZmZXIoYmgpOworCQlfX2JyZWxzZShiaCk7CisJfQorCisJc3luY19ibG9ja2Rldihqb3VybmFsLT5qX2Rldik7CisJamJkX2RlYnVnKDEsICJKQkQ6IGpvdXJuYWwgY2xlYXJlZC5cbiIpOworCisJLyogT0ssIGZpbGwgaW4gdGhlIGluaXRpYWwgc3RhdGljIGZpZWxkcyBpbiB0aGUgbmV3IHN1cGVyYmxvY2sgKi8KKwlzYiA9IGpvdXJuYWwtPmpfc3VwZXJibG9jazsKKworCXNiLT5zX2hlYWRlci5oX21hZ2ljCSA9IGNwdV90b19iZTMyKEpCRDJfTUFHSUNfTlVNQkVSKTsKKwlzYi0+c19oZWFkZXIuaF9ibG9ja3R5cGUgPSBjcHVfdG9fYmUzMihKQkQyX1NVUEVSQkxPQ0tfVjIpOworCisJc2ItPnNfYmxvY2tzaXplCT0gY3B1X3RvX2JlMzIoam91cm5hbC0+al9ibG9ja3NpemUpOworCXNiLT5zX21heGxlbgk9IGNwdV90b19iZTMyKGpvdXJuYWwtPmpfbWF4bGVuKTsKKwlzYi0+c19maXJzdAk9IGNwdV90b19iZTMyKDEpOworCisJam91cm5hbC0+al90cmFuc2FjdGlvbl9zZXF1ZW5jZSA9IDE7CisKKwlqb3VybmFsLT5qX2ZsYWdzICY9IH5KQkQyX0FCT1JUOworCWpvdXJuYWwtPmpfZm9ybWF0X3ZlcnNpb24gPSAyOworCisJcmV0dXJuIGpvdXJuYWxfcmVzZXQoam91cm5hbCk7Cit9CisKKy8qKgorICogdm9pZCBqYmQyX2pvdXJuYWxfdXBkYXRlX3N1cGVyYmxvY2soKSAtIFVwZGF0ZSBqb3VybmFsIHNiIG9uIGRpc2suCisgKiBAam91cm5hbDogVGhlIGpvdXJuYWwgdG8gdXBkYXRlLgorICogQHdhaXQ6IFNldCB0byAnMCcgaWYgeW91IGRvbid0IHdhbnQgdG8gd2FpdCBmb3IgSU8gY29tcGxldGlvbi4KKyAqCisgKiBVcGRhdGUgYSBqb3VybmFsJ3MgZHluYW1pYyBzdXBlcmJsb2NrIGZpZWxkcyBhbmQgd3JpdGUgaXQgdG8gZGlzaywKKyAqIG9wdGlvbmFsbHkgd2FpdGluZyBmb3IgdGhlIElPIHRvIGNvbXBsZXRlLgorICovCit2b2lkIGpiZDJfam91cm5hbF91cGRhdGVfc3VwZXJibG9jayhqb3VybmFsX3QgKmpvdXJuYWwsIGludCB3YWl0KQoreworCWpvdXJuYWxfc3VwZXJibG9ja190ICpzYiA9IGpvdXJuYWwtPmpfc3VwZXJibG9jazsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoID0gam91cm5hbC0+al9zYl9idWZmZXI7CisKKwkvKgorCSAqIEFzIGEgc3BlY2lhbCBjYXNlLCBpZiB0aGUgb24tZGlzayBjb3B5IGlzIGFscmVhZHkgbWFya2VkIGFzIG5lZWRpbmcKKwkgKiBubyByZWNvdmVyeSAoc19zdGFydCA9PSAwKSBhbmQgdGhlcmUgYXJlIG5vIG91dHN0YW5kaW5nIHRyYW5zYWN0aW9ucworCSAqIGluIHRoZSBmaWxlc3lzdGVtLCB0aGVuIHdlIGNhbiBzYWZlbHkgZGVmZXIgdGhlIHN1cGVyYmxvY2sgdXBkYXRlCisJICogdW50aWwgdGhlIG5leHQgY29tbWl0IGJ5IHNldHRpbmcgSkJEMl9GTFVTSEVELiAgVGhpcyBhdm9pZHMKKwkgKiBhdHRlbXB0aW5nIGEgd3JpdGUgdG8gYSBwb3RlbnRpYWwtcmVhZG9ubHkgZGV2aWNlLgorCSAqLworCWlmIChzYi0+c19zdGFydCA9PSAwICYmIGpvdXJuYWwtPmpfdGFpbF9zZXF1ZW5jZSA9PQorCQkJCWpvdXJuYWwtPmpfdHJhbnNhY3Rpb25fc2VxdWVuY2UpIHsKKwkJamJkX2RlYnVnKDEsIkpCRDogU2tpcHBpbmcgc3VwZXJibG9jayB1cGRhdGUgb24gcmVjb3ZlcmVkIHNiICIKKwkJCSIoc3RhcnQgJWxkLCBzZXEgJWQsIGVycm5vICVkKVxuIiwKKwkJCWpvdXJuYWwtPmpfdGFpbCwgam91cm5hbC0+al90YWlsX3NlcXVlbmNlLAorCQkJam91cm5hbC0+al9lcnJubyk7CisJCWdvdG8gb3V0OworCX0KKworCXNwaW5fbG9jaygmam91cm5hbC0+al9zdGF0ZV9sb2NrKTsKKwlqYmRfZGVidWcoMSwiSkJEOiB1cGRhdGluZyBzdXBlcmJsb2NrIChzdGFydCAlbGQsIHNlcSAlZCwgZXJybm8gJWQpXG4iLAorCQkgIGpvdXJuYWwtPmpfdGFpbCwgam91cm5hbC0+al90YWlsX3NlcXVlbmNlLCBqb3VybmFsLT5qX2Vycm5vKTsKKworCXNiLT5zX3NlcXVlbmNlID0gY3B1X3RvX2JlMzIoam91cm5hbC0+al90YWlsX3NlcXVlbmNlKTsKKwlzYi0+c19zdGFydCAgICA9IGNwdV90b19iZTMyKGpvdXJuYWwtPmpfdGFpbCk7CisJc2ItPnNfZXJybm8gICAgPSBjcHVfdG9fYmUzMihqb3VybmFsLT5qX2Vycm5vKTsKKwlzcGluX3VubG9jaygmam91cm5hbC0+al9zdGF0ZV9sb2NrKTsKKworCUJVRkZFUl9UUkFDRShiaCwgIm1hcmtpbmcgZGlydHkiKTsKKwltYXJrX2J1ZmZlcl9kaXJ0eShiaCk7CisJaWYgKHdhaXQpCisJCXN5bmNfZGlydHlfYnVmZmVyKGJoKTsKKwllbHNlCisJCWxsX3J3X2Jsb2NrKFNXUklURSwgMSwgJmJoKTsKKworb3V0OgorCS8qIElmIHdlIGhhdmUganVzdCBmbHVzaGVkIHRoZSBsb2cgKGJ5IG1hcmtpbmcgc19zdGFydD09MCksIHRoZW4KKwkgKiBhbnkgZnV0dXJlIGNvbW1pdCB3aWxsIGhhdmUgdG8gYmUgY2FyZWZ1bCB0byB1cGRhdGUgdGhlCisJICogc3VwZXJibG9jayBhZ2FpbiB0byByZS1yZWNvcmQgdGhlIHRydWUgc3RhcnQgb2YgdGhlIGxvZy4gKi8KKworCXNwaW5fbG9jaygmam91cm5hbC0+al9zdGF0ZV9sb2NrKTsKKwlpZiAoc2ItPnNfc3RhcnQpCisJCWpvdXJuYWwtPmpfZmxhZ3MgJj0gfkpCRDJfRkxVU0hFRDsKKwllbHNlCisJCWpvdXJuYWwtPmpfZmxhZ3MgfD0gSkJEMl9GTFVTSEVEOworCXNwaW5fdW5sb2NrKCZqb3VybmFsLT5qX3N0YXRlX2xvY2spOworfQorCisvKgorICogUmVhZCB0aGUgc3VwZXJibG9jayBmb3IgYSBnaXZlbiBqb3VybmFsLCBwZXJmb3JtaW5nIGluaXRpYWwKKyAqIHZhbGlkYXRpb24gb2YgdGhlIGZvcm1hdC4KKyAqLworCitzdGF0aWMgaW50IGpvdXJuYWxfZ2V0X3N1cGVyYmxvY2soam91cm5hbF90ICpqb3VybmFsKQoreworCXN0cnVjdCBidWZmZXJfaGVhZCAqYmg7CisJam91cm5hbF9zdXBlcmJsb2NrX3QgKnNiOworCWludCBlcnIgPSAtRUlPOworCisJYmggPSBqb3VybmFsLT5qX3NiX2J1ZmZlcjsKKworCUpfQVNTRVJUKGJoICE9IE5VTEwpOworCWlmICghYnVmZmVyX3VwdG9kYXRlKGJoKSkgeworCQlsbF9yd19ibG9jayhSRUFELCAxLCAmYmgpOworCQl3YWl0X29uX2J1ZmZlcihiaCk7CisJCWlmICghYnVmZmVyX3VwdG9kYXRlKGJoKSkgeworCQkJcHJpbnRrIChLRVJOX0VSUgorCQkJCSJKQkQ6IElPIGVycm9yIHJlYWRpbmcgam91cm5hbCBzdXBlcmJsb2NrXG4iKTsKKwkJCWdvdG8gb3V0OworCQl9CisJfQorCisJc2IgPSBqb3VybmFsLT5qX3N1cGVyYmxvY2s7CisKKwllcnIgPSAtRUlOVkFMOworCisJaWYgKHNiLT5zX2hlYWRlci5oX21hZ2ljICE9IGNwdV90b19iZTMyKEpCRDJfTUFHSUNfTlVNQkVSKSB8fAorCSAgICBzYi0+c19ibG9ja3NpemUgIT0gY3B1X3RvX2JlMzIoam91cm5hbC0+al9ibG9ja3NpemUpKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIkpCRDogbm8gdmFsaWQgam91cm5hbCBzdXBlcmJsb2NrIGZvdW5kXG4iKTsKKwkJZ290byBvdXQ7CisJfQorCisJc3dpdGNoKGJlMzJfdG9fY3B1KHNiLT5zX2hlYWRlci5oX2Jsb2NrdHlwZSkpIHsKKwljYXNlIEpCRDJfU1VQRVJCTE9DS19WMToKKwkJam91cm5hbC0+al9mb3JtYXRfdmVyc2lvbiA9IDE7CisJCWJyZWFrOworCWNhc2UgSkJEMl9TVVBFUkJMT0NLX1YyOgorCQlqb3VybmFsLT5qX2Zvcm1hdF92ZXJzaW9uID0gMjsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiSkJEOiB1bnJlY29nbmlzZWQgc3VwZXJibG9jayBmb3JtYXQgSURcbiIpOworCQlnb3RvIG91dDsKKwl9CisKKwlpZiAoYmUzMl90b19jcHUoc2ItPnNfbWF4bGVuKSA8IGpvdXJuYWwtPmpfbWF4bGVuKQorCQlqb3VybmFsLT5qX21heGxlbiA9IGJlMzJfdG9fY3B1KHNiLT5zX21heGxlbik7CisJZWxzZSBpZiAoYmUzMl90b19jcHUoc2ItPnNfbWF4bGVuKSA+IGpvdXJuYWwtPmpfbWF4bGVuKSB7CisJCXByaW50ayAoS0VSTl9XQVJOSU5HICJKQkQ6IGpvdXJuYWwgZmlsZSB0b28gc2hvcnRcbiIpOworCQlnb3RvIG91dDsKKwl9CisKKwlyZXR1cm4gMDsKKworb3V0OgorCWpvdXJuYWxfZmFpbF9zdXBlcmJsb2NrKGpvdXJuYWwpOworCXJldHVybiBlcnI7Cit9CisKKy8qCisgKiBMb2FkIHRoZSBvbi1kaXNrIGpvdXJuYWwgc3VwZXJibG9jayBhbmQgcmVhZCB0aGUga2V5IGZpZWxkcyBpbnRvIHRoZQorICogam91cm5hbF90LgorICovCisKK3N0YXRpYyBpbnQgbG9hZF9zdXBlcmJsb2NrKGpvdXJuYWxfdCAqam91cm5hbCkKK3sKKwlpbnQgZXJyOworCWpvdXJuYWxfc3VwZXJibG9ja190ICpzYjsKKworCWVyciA9IGpvdXJuYWxfZ2V0X3N1cGVyYmxvY2soam91cm5hbCk7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKworCXNiID0gam91cm5hbC0+al9zdXBlcmJsb2NrOworCisJam91cm5hbC0+al90YWlsX3NlcXVlbmNlID0gYmUzMl90b19jcHUoc2ItPnNfc2VxdWVuY2UpOworCWpvdXJuYWwtPmpfdGFpbCA9IGJlMzJfdG9fY3B1KHNiLT5zX3N0YXJ0KTsKKwlqb3VybmFsLT5qX2ZpcnN0ID0gYmUzMl90b19jcHUoc2ItPnNfZmlyc3QpOworCWpvdXJuYWwtPmpfbGFzdCA9IGJlMzJfdG9fY3B1KHNiLT5zX21heGxlbik7CisJam91cm5hbC0+al9lcnJubyA9IGJlMzJfdG9fY3B1KHNiLT5zX2Vycm5vKTsKKworCXJldHVybiAwOworfQorCisKKy8qKgorICogaW50IGpiZDJfam91cm5hbF9sb2FkKCkgLSBSZWFkIGpvdXJuYWwgZnJvbSBkaXNrLgorICogQGpvdXJuYWw6IEpvdXJuYWwgdG8gYWN0IG9uLgorICoKKyAqIEdpdmVuIGEgam91cm5hbF90IHN0cnVjdHVyZSB3aGljaCB0ZWxscyB1cyB3aGljaCBkaXNrIGJsb2NrcyBjb250YWluCisgKiBhIGpvdXJuYWwsIHJlYWQgdGhlIGpvdXJuYWwgZnJvbSBkaXNrIHRvIGluaXRpYWxpc2UgdGhlIGluLW1lbW9yeQorICogc3RydWN0dXJlcy4KKyAqLworaW50IGpiZDJfam91cm5hbF9sb2FkKGpvdXJuYWxfdCAqam91cm5hbCkKK3sKKwlpbnQgZXJyOworCWpvdXJuYWxfc3VwZXJibG9ja190ICpzYjsKKworCWVyciA9IGxvYWRfc3VwZXJibG9jayhqb3VybmFsKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCisJc2IgPSBqb3VybmFsLT5qX3N1cGVyYmxvY2s7CisJLyogSWYgdGhpcyBpcyBhIFYyIHN1cGVyYmxvY2ssIHRoZW4gd2UgaGF2ZSB0byBjaGVjayB0aGUKKwkgKiBmZWF0dXJlcyBmbGFncyBvbiBpdC4gKi8KKworCWlmIChqb3VybmFsLT5qX2Zvcm1hdF92ZXJzaW9uID49IDIpIHsKKwkJaWYgKChzYi0+c19mZWF0dXJlX3JvX2NvbXBhdCAmCisJCSAgICAgfmNwdV90b19iZTMyKEpCRDJfS05PV05fUk9DT01QQVRfRkVBVFVSRVMpKSB8fAorCQkgICAgKHNiLT5zX2ZlYXR1cmVfaW5jb21wYXQgJgorCQkgICAgIH5jcHVfdG9fYmUzMihKQkQyX0tOT1dOX0lOQ09NUEFUX0ZFQVRVUkVTKSkpIHsKKwkJCXByaW50ayAoS0VSTl9XQVJOSU5HCisJCQkJIkpCRDogVW5yZWNvZ25pc2VkIGZlYXR1cmVzIG9uIGpvdXJuYWxcbiIpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwl9CisKKwkvKgorCSAqIENyZWF0ZSBhIHNsYWIgZm9yIHRoaXMgYmxvY2tzaXplCisJICovCisJZXJyID0gamJkMl9qb3VybmFsX2NyZWF0ZV9qYmRfc2xhYihiZTMyX3RvX2NwdShzYi0+c19ibG9ja3NpemUpKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCisJLyogTGV0IHRoZSByZWNvdmVyeSBjb2RlIGNoZWNrIHdoZXRoZXIgaXQgbmVlZHMgdG8gcmVjb3ZlciBhbnkKKwkgKiBkYXRhIGZyb20gdGhlIGpvdXJuYWwuICovCisJaWYgKGpiZDJfam91cm5hbF9yZWNvdmVyKGpvdXJuYWwpKQorCQlnb3RvIHJlY292ZXJ5X2Vycm9yOworCisJLyogT0ssIHdlJ3ZlIGZpbmlzaGVkIHdpdGggdGhlIGR5bmFtaWMgam91cm5hbCBiaXRzOgorCSAqIHJlaW5pdGlhbGlzZSB0aGUgZHluYW1pYyBjb250ZW50cyBvZiB0aGUgc3VwZXJibG9jayBpbiBtZW1vcnkKKwkgKiBhbmQgcmVzZXQgdGhlbSBvbiBkaXNrLiAqLworCWlmIChqb3VybmFsX3Jlc2V0KGpvdXJuYWwpKQorCQlnb3RvIHJlY292ZXJ5X2Vycm9yOworCisJam91cm5hbC0+al9mbGFncyAmPSB+SkJEMl9BQk9SVDsKKwlqb3VybmFsLT5qX2ZsYWdzIHw9IEpCRDJfTE9BREVEOworCXJldHVybiAwOworCityZWNvdmVyeV9lcnJvcjoKKwlwcmludGsgKEtFUk5fV0FSTklORyAiSkJEOiByZWNvdmVyeSBmYWlsZWRcbiIpOworCXJldHVybiAtRUlPOworfQorCisvKioKKyAqIHZvaWQgamJkMl9qb3VybmFsX2Rlc3Ryb3koKSAtIFJlbGVhc2UgYSBqb3VybmFsX3Qgc3RydWN0dXJlLgorICogQGpvdXJuYWw6IEpvdXJuYWwgdG8gYWN0IG9uLgorICoKKyAqIFJlbGVhc2UgYSBqb3VybmFsX3Qgc3RydWN0dXJlIG9uY2UgaXQgaXMgbm8gbG9uZ2VyIGluIHVzZSBieSB0aGUKKyAqIGpvdXJuYWxlZCBvYmplY3QuCisgKi8KK3ZvaWQgamJkMl9qb3VybmFsX2Rlc3Ryb3koam91cm5hbF90ICpqb3VybmFsKQoreworCS8qIFdhaXQgZm9yIHRoZSBjb21taXQgdGhyZWFkIHRvIHdha2UgdXAgYW5kIGRpZS4gKi8KKwlqb3VybmFsX2tpbGxfdGhyZWFkKGpvdXJuYWwpOworCisJLyogRm9yY2UgYSBmaW5hbCBsb2cgY29tbWl0ICovCisJaWYgKGpvdXJuYWwtPmpfcnVubmluZ190cmFuc2FjdGlvbikKKwkJamJkMl9qb3VybmFsX2NvbW1pdF90cmFuc2FjdGlvbihqb3VybmFsKTsKKworCS8qIEZvcmNlIGFueSBvbGQgdHJhbnNhY3Rpb25zIHRvIGRpc2sgKi8KKworCS8qIFRvdGFsbHkgYW5hbCBsb2NraW5nIGhlcmUuLi4gKi8KKwlzcGluX2xvY2soJmpvdXJuYWwtPmpfbGlzdF9sb2NrKTsKKwl3aGlsZSAoam91cm5hbC0+al9jaGVja3BvaW50X3RyYW5zYWN0aW9ucyAhPSBOVUxMKSB7CisJCXNwaW5fdW5sb2NrKCZqb3VybmFsLT5qX2xpc3RfbG9jayk7CisJCWpiZDJfbG9nX2RvX2NoZWNrcG9pbnQoam91cm5hbCk7CisJCXNwaW5fbG9jaygmam91cm5hbC0+al9saXN0X2xvY2spOworCX0KKworCUpfQVNTRVJUKGpvdXJuYWwtPmpfcnVubmluZ190cmFuc2FjdGlvbiA9PSBOVUxMKTsKKwlKX0FTU0VSVChqb3VybmFsLT5qX2NvbW1pdHRpbmdfdHJhbnNhY3Rpb24gPT0gTlVMTCk7CisJSl9BU1NFUlQoam91cm5hbC0+al9jaGVja3BvaW50X3RyYW5zYWN0aW9ucyA9PSBOVUxMKTsKKwlzcGluX3VubG9jaygmam91cm5hbC0+al9saXN0X2xvY2spOworCisJLyogV2UgY2FuIG5vdyBtYXJrIHRoZSBqb3VybmFsIGFzIGVtcHR5LiAqLworCWpvdXJuYWwtPmpfdGFpbCA9IDA7CisJam91cm5hbC0+al90YWlsX3NlcXVlbmNlID0gKytqb3VybmFsLT5qX3RyYW5zYWN0aW9uX3NlcXVlbmNlOworCWlmIChqb3VybmFsLT5qX3NiX2J1ZmZlcikgeworCQlqYmQyX2pvdXJuYWxfdXBkYXRlX3N1cGVyYmxvY2soam91cm5hbCwgMSk7CisJCWJyZWxzZShqb3VybmFsLT5qX3NiX2J1ZmZlcik7CisJfQorCisJaWYgKGpvdXJuYWwtPmpfaW5vZGUpCisJCWlwdXQoam91cm5hbC0+al9pbm9kZSk7CisJaWYgKGpvdXJuYWwtPmpfcmV2b2tlKQorCQlqYmQyX2pvdXJuYWxfZGVzdHJveV9yZXZva2Uoam91cm5hbCk7CisJa2ZyZWUoam91cm5hbC0+al93YnVmKTsKKwlrZnJlZShqb3VybmFsKTsKK30KKworCisvKioKKyAqaW50IGpiZDJfam91cm5hbF9jaGVja191c2VkX2ZlYXR1cmVzICgpIC0gQ2hlY2sgaWYgZmVhdHVyZXMgc3BlY2lmaWVkIGFyZSB1c2VkLgorICogQGpvdXJuYWw6IEpvdXJuYWwgdG8gY2hlY2suCisgKiBAY29tcGF0OiBiaXRtYXNrIG9mIGNvbXBhdGlibGUgZmVhdHVyZXMKKyAqIEBybzogYml0bWFzayBvZiBmZWF0dXJlcyB0aGF0IGZvcmNlIHJlYWQtb25seSBtb3VudAorICogQGluY29tcGF0OiBiaXRtYXNrIG9mIGluY29tcGF0aWJsZSBmZWF0dXJlcworICoKKyAqIENoZWNrIHdoZXRoZXIgdGhlIGpvdXJuYWwgdXNlcyBhbGwgb2YgYSBnaXZlbiBzZXQgb2YKKyAqIGZlYXR1cmVzLiAgUmV0dXJuIHRydWUgKG5vbi16ZXJvKSBpZiBpdCBkb2VzLgorICoqLworCitpbnQgamJkMl9qb3VybmFsX2NoZWNrX3VzZWRfZmVhdHVyZXMgKGpvdXJuYWxfdCAqam91cm5hbCwgdW5zaWduZWQgbG9uZyBjb21wYXQsCisJCQkJIHVuc2lnbmVkIGxvbmcgcm8sIHVuc2lnbmVkIGxvbmcgaW5jb21wYXQpCit7CisJam91cm5hbF9zdXBlcmJsb2NrX3QgKnNiOworCisJaWYgKCFjb21wYXQgJiYgIXJvICYmICFpbmNvbXBhdCkKKwkJcmV0dXJuIDE7CisJaWYgKGpvdXJuYWwtPmpfZm9ybWF0X3ZlcnNpb24gPT0gMSkKKwkJcmV0dXJuIDA7CisKKwlzYiA9IGpvdXJuYWwtPmpfc3VwZXJibG9jazsKKworCWlmICgoKGJlMzJfdG9fY3B1KHNiLT5zX2ZlYXR1cmVfY29tcGF0KSAmIGNvbXBhdCkgPT0gY29tcGF0KSAmJgorCSAgICAoKGJlMzJfdG9fY3B1KHNiLT5zX2ZlYXR1cmVfcm9fY29tcGF0KSAmIHJvKSA9PSBybykgJiYKKwkgICAgKChiZTMyX3RvX2NwdShzYi0+c19mZWF0dXJlX2luY29tcGF0KSAmIGluY29tcGF0KSA9PSBpbmNvbXBhdCkpCisJCXJldHVybiAxOworCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogaW50IGpiZDJfam91cm5hbF9jaGVja19hdmFpbGFibGVfZmVhdHVyZXMoKSAtIENoZWNrIGZlYXR1cmUgc2V0IGluIGpvdXJuYWxsaW5nIGxheWVyCisgKiBAam91cm5hbDogSm91cm5hbCB0byBjaGVjay4KKyAqIEBjb21wYXQ6IGJpdG1hc2sgb2YgY29tcGF0aWJsZSBmZWF0dXJlcworICogQHJvOiBiaXRtYXNrIG9mIGZlYXR1cmVzIHRoYXQgZm9yY2UgcmVhZC1vbmx5IG1vdW50CisgKiBAaW5jb21wYXQ6IGJpdG1hc2sgb2YgaW5jb21wYXRpYmxlIGZlYXR1cmVzCisgKgorICogQ2hlY2sgd2hldGhlciB0aGUgam91cm5hbGluZyBjb2RlIHN1cHBvcnRzIHRoZSB1c2Ugb2YKKyAqIGFsbCBvZiBhIGdpdmVuIHNldCBvZiBmZWF0dXJlcyBvbiB0aGlzIGpvdXJuYWwuICBSZXR1cm4gdHJ1ZQorICogKG5vbi16ZXJvKSBpZiBpdCBjYW4uICovCisKK2ludCBqYmQyX2pvdXJuYWxfY2hlY2tfYXZhaWxhYmxlX2ZlYXR1cmVzIChqb3VybmFsX3QgKmpvdXJuYWwsIHVuc2lnbmVkIGxvbmcgY29tcGF0LAorCQkJCSAgICAgIHVuc2lnbmVkIGxvbmcgcm8sIHVuc2lnbmVkIGxvbmcgaW5jb21wYXQpCit7CisJam91cm5hbF9zdXBlcmJsb2NrX3QgKnNiOworCisJaWYgKCFjb21wYXQgJiYgIXJvICYmICFpbmNvbXBhdCkKKwkJcmV0dXJuIDE7CisKKwlzYiA9IGpvdXJuYWwtPmpfc3VwZXJibG9jazsKKworCS8qIFdlIGNhbiBzdXBwb3J0IGFueSBrbm93biByZXF1ZXN0ZWQgZmVhdHVyZXMgaWZmIHRoZQorCSAqIHN1cGVyYmxvY2sgaXMgaW4gdmVyc2lvbiAyLiAgT3RoZXJ3aXNlIHdlIGZhaWwgdG8gc3VwcG9ydCBhbnkKKwkgKiBleHRlbmRlZCBzYiBmZWF0dXJlcy4gKi8KKworCWlmIChqb3VybmFsLT5qX2Zvcm1hdF92ZXJzaW9uICE9IDIpCisJCXJldHVybiAwOworCisJaWYgKChjb21wYXQgICAmIEpCRDJfS05PV05fQ09NUEFUX0ZFQVRVUkVTKSA9PSBjb21wYXQgJiYKKwkgICAgKHJvICAgICAgICYgSkJEMl9LTk9XTl9ST0NPTVBBVF9GRUFUVVJFUykgPT0gcm8gJiYKKwkgICAgKGluY29tcGF0ICYgSkJEMl9LTk9XTl9JTkNPTVBBVF9GRUFUVVJFUykgPT0gaW5jb21wYXQpCisJCXJldHVybiAxOworCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogaW50IGpiZDJfam91cm5hbF9zZXRfZmVhdHVyZXMgKCkgLSBNYXJrIGEgZ2l2ZW4gam91cm5hbCBmZWF0dXJlIGluIHRoZSBzdXBlcmJsb2NrCisgKiBAam91cm5hbDogSm91cm5hbCB0byBhY3Qgb24uCisgKiBAY29tcGF0OiBiaXRtYXNrIG9mIGNvbXBhdGlibGUgZmVhdHVyZXMKKyAqIEBybzogYml0bWFzayBvZiBmZWF0dXJlcyB0aGF0IGZvcmNlIHJlYWQtb25seSBtb3VudAorICogQGluY29tcGF0OiBiaXRtYXNrIG9mIGluY29tcGF0aWJsZSBmZWF0dXJlcworICoKKyAqIE1hcmsgYSBnaXZlbiBqb3VybmFsIGZlYXR1cmUgYXMgcHJlc2VudCBvbiB0aGUKKyAqIHN1cGVyYmxvY2suICBSZXR1cm5zIHRydWUgaWYgdGhlIHJlcXVlc3RlZCBmZWF0dXJlcyBjb3VsZCBiZSBzZXQuCisgKgorICovCisKK2ludCBqYmQyX2pvdXJuYWxfc2V0X2ZlYXR1cmVzIChqb3VybmFsX3QgKmpvdXJuYWwsIHVuc2lnbmVkIGxvbmcgY29tcGF0LAorCQkJICB1bnNpZ25lZCBsb25nIHJvLCB1bnNpZ25lZCBsb25nIGluY29tcGF0KQoreworCWpvdXJuYWxfc3VwZXJibG9ja190ICpzYjsKKworCWlmIChqYmQyX2pvdXJuYWxfY2hlY2tfdXNlZF9mZWF0dXJlcyhqb3VybmFsLCBjb21wYXQsIHJvLCBpbmNvbXBhdCkpCisJCXJldHVybiAxOworCisJaWYgKCFqYmQyX2pvdXJuYWxfY2hlY2tfYXZhaWxhYmxlX2ZlYXR1cmVzKGpvdXJuYWwsIGNvbXBhdCwgcm8sIGluY29tcGF0KSkKKwkJcmV0dXJuIDA7CisKKwlqYmRfZGVidWcoMSwgIlNldHRpbmcgbmV3IGZlYXR1cmVzIDB4JWx4LzB4JWx4LzB4JWx4XG4iLAorCQkgIGNvbXBhdCwgcm8sIGluY29tcGF0KTsKKworCXNiID0gam91cm5hbC0+al9zdXBlcmJsb2NrOworCisJc2ItPnNfZmVhdHVyZV9jb21wYXQgICAgfD0gY3B1X3RvX2JlMzIoY29tcGF0KTsKKwlzYi0+c19mZWF0dXJlX3JvX2NvbXBhdCB8PSBjcHVfdG9fYmUzMihybyk7CisJc2ItPnNfZmVhdHVyZV9pbmNvbXBhdCAgfD0gY3B1X3RvX2JlMzIoaW5jb21wYXQpOworCisJcmV0dXJuIDE7Cit9CisKKworLyoqCisgKiBpbnQgamJkMl9qb3VybmFsX3VwZGF0ZV9mb3JtYXQgKCkgLSBVcGRhdGUgb24tZGlzayBqb3VybmFsIHN0cnVjdHVyZS4KKyAqIEBqb3VybmFsOiBKb3VybmFsIHRvIGFjdCBvbi4KKyAqCisgKiBHaXZlbiBhbiBpbml0aWFsaXNlZCBidXQgdW5sb2FkZWQgam91cm5hbCBzdHJ1Y3QsIHBva2UgYWJvdXQgaW4gdGhlCisgKiBvbi1kaXNrIHN0cnVjdHVyZSB0byB1cGRhdGUgaXQgdG8gdGhlIG1vc3QgcmVjZW50IHN1cHBvcnRlZCB2ZXJzaW9uLgorICovCitpbnQgamJkMl9qb3VybmFsX3VwZGF0ZV9mb3JtYXQgKGpvdXJuYWxfdCAqam91cm5hbCkKK3sKKwlqb3VybmFsX3N1cGVyYmxvY2tfdCAqc2I7CisJaW50IGVycjsKKworCWVyciA9IGpvdXJuYWxfZ2V0X3N1cGVyYmxvY2soam91cm5hbCk7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKworCXNiID0gam91cm5hbC0+al9zdXBlcmJsb2NrOworCisJc3dpdGNoIChiZTMyX3RvX2NwdShzYi0+c19oZWFkZXIuaF9ibG9ja3R5cGUpKSB7CisJY2FzZSBKQkQyX1NVUEVSQkxPQ0tfVjI6CisJCXJldHVybiAwOworCWNhc2UgSkJEMl9TVVBFUkJMT0NLX1YxOgorCQlyZXR1cm4gam91cm5hbF9jb252ZXJ0X3N1cGVyYmxvY2tfdjEoam91cm5hbCwgc2IpOworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKwlyZXR1cm4gLUVJTlZBTDsKK30KKworc3RhdGljIGludCBqb3VybmFsX2NvbnZlcnRfc3VwZXJibG9ja192MShqb3VybmFsX3QgKmpvdXJuYWwsCisJCQkJCSBqb3VybmFsX3N1cGVyYmxvY2tfdCAqc2IpCit7CisJaW50IG9mZnNldCwgYmxvY2tzaXplOworCXN0cnVjdCBidWZmZXJfaGVhZCAqYmg7CisKKwlwcmludGsoS0VSTl9XQVJOSU5HCisJCSJKQkQ6IENvbnZlcnRpbmcgc3VwZXJibG9jayBmcm9tIHZlcnNpb24gMSB0byAyLlxuIik7CisKKwkvKiBQcmUtaW5pdGlhbGlzZSBuZXcgZmllbGRzIHRvIHplcm8gKi8KKwlvZmZzZXQgPSAoKGNoYXIgKikgJihzYi0+c19mZWF0dXJlX2NvbXBhdCkpIC0gKChjaGFyICopIHNiKTsKKwlibG9ja3NpemUgPSBiZTMyX3RvX2NwdShzYi0+c19ibG9ja3NpemUpOworCW1lbXNldCgmc2ItPnNfZmVhdHVyZV9jb21wYXQsIDAsIGJsb2Nrc2l6ZS1vZmZzZXQpOworCisJc2ItPnNfbnJfdXNlcnMgPSBjcHVfdG9fYmUzMigxKTsKKwlzYi0+c19oZWFkZXIuaF9ibG9ja3R5cGUgPSBjcHVfdG9fYmUzMihKQkQyX1NVUEVSQkxPQ0tfVjIpOworCWpvdXJuYWwtPmpfZm9ybWF0X3ZlcnNpb24gPSAyOworCisJYmggPSBqb3VybmFsLT5qX3NiX2J1ZmZlcjsKKwlCVUZGRVJfVFJBQ0UoYmgsICJtYXJraW5nIGRpcnR5Iik7CisJbWFya19idWZmZXJfZGlydHkoYmgpOworCXN5bmNfZGlydHlfYnVmZmVyKGJoKTsKKwlyZXR1cm4gMDsKK30KKworCisvKioKKyAqIGludCBqYmQyX2pvdXJuYWxfZmx1c2ggKCkgLSBGbHVzaCBqb3VybmFsCisgKiBAam91cm5hbDogSm91cm5hbCB0byBhY3Qgb24uCisgKgorICogRmx1c2ggYWxsIGRhdGEgZm9yIGEgZ2l2ZW4gam91cm5hbCB0byBkaXNrIGFuZCBlbXB0eSB0aGUgam91cm5hbC4KKyAqIEZpbGVzeXN0ZW1zIGNhbiB1c2UgdGhpcyB3aGVuIHJlbW91bnRpbmcgcmVhZG9ubHkgdG8gZW5zdXJlIHRoYXQKKyAqIHJlY292ZXJ5IGRvZXMgbm90IG5lZWQgdG8gaGFwcGVuIG9uIHJlbW91bnQuCisgKi8KKworaW50IGpiZDJfam91cm5hbF9mbHVzaChqb3VybmFsX3QgKmpvdXJuYWwpCit7CisJaW50IGVyciA9IDA7CisJdHJhbnNhY3Rpb25fdCAqdHJhbnNhY3Rpb24gPSBOVUxMOworCXVuc2lnbmVkIGxvbmcgb2xkX3RhaWw7CisKKwlzcGluX2xvY2soJmpvdXJuYWwtPmpfc3RhdGVfbG9jayk7CisKKwkvKiBGb3JjZSBldmVyeXRoaW5nIGJ1ZmZlcmVkIHRvIHRoZSBsb2cuLi4gKi8KKwlpZiAoam91cm5hbC0+al9ydW5uaW5nX3RyYW5zYWN0aW9uKSB7CisJCXRyYW5zYWN0aW9uID0gam91cm5hbC0+al9ydW5uaW5nX3RyYW5zYWN0aW9uOworCQlfX2piZDJfbG9nX3N0YXJ0X2NvbW1pdChqb3VybmFsLCB0cmFuc2FjdGlvbi0+dF90aWQpOworCX0gZWxzZSBpZiAoam91cm5hbC0+al9jb21taXR0aW5nX3RyYW5zYWN0aW9uKQorCQl0cmFuc2FjdGlvbiA9IGpvdXJuYWwtPmpfY29tbWl0dGluZ190cmFuc2FjdGlvbjsKKworCS8qIFdhaXQgZm9yIHRoZSBsb2cgY29tbWl0IHRvIGNvbXBsZXRlLi4uICovCisJaWYgKHRyYW5zYWN0aW9uKSB7CisJCXRpZF90IHRpZCA9IHRyYW5zYWN0aW9uLT50X3RpZDsKKworCQlzcGluX3VubG9jaygmam91cm5hbC0+al9zdGF0ZV9sb2NrKTsKKwkJamJkMl9sb2dfd2FpdF9jb21taXQoam91cm5hbCwgdGlkKTsKKwl9IGVsc2UgeworCQlzcGluX3VubG9jaygmam91cm5hbC0+al9zdGF0ZV9sb2NrKTsKKwl9CisKKwkvKiAuLi5hbmQgZmx1c2ggZXZlcnl0aGluZyBpbiB0aGUgbG9nIG91dCB0byBkaXNrLiAqLworCXNwaW5fbG9jaygmam91cm5hbC0+al9saXN0X2xvY2spOworCXdoaWxlICghZXJyICYmIGpvdXJuYWwtPmpfY2hlY2twb2ludF90cmFuc2FjdGlvbnMgIT0gTlVMTCkgeworCQlzcGluX3VubG9jaygmam91cm5hbC0+al9saXN0X2xvY2spOworCQllcnIgPSBqYmQyX2xvZ19kb19jaGVja3BvaW50KGpvdXJuYWwpOworCQlzcGluX2xvY2soJmpvdXJuYWwtPmpfbGlzdF9sb2NrKTsKKwl9CisJc3Bpbl91bmxvY2soJmpvdXJuYWwtPmpfbGlzdF9sb2NrKTsKKwlqYmQyX2NsZWFudXBfam91cm5hbF90YWlsKGpvdXJuYWwpOworCisJLyogRmluYWxseSwgbWFyayB0aGUgam91cm5hbCBhcyByZWFsbHkgbmVlZGluZyBubyByZWNvdmVyeS4KKwkgKiBUaGlzIHNldHMgc19zdGFydD09MCBpbiB0aGUgdW5kZXJseWluZyBzdXBlcmJsb2NrLCB3aGljaCBpcworCSAqIHRoZSBtYWdpYyBjb2RlIGZvciBhIGZ1bGx5LXJlY292ZXJlZCBzdXBlcmJsb2NrLiAgQW55IGZ1dHVyZQorCSAqIGNvbW1pdHMgb2YgZGF0YSB0byB0aGUgam91cm5hbCB3aWxsIHJlc3RvcmUgdGhlIGN1cnJlbnQKKwkgKiBzX3N0YXJ0IHZhbHVlLiAqLworCXNwaW5fbG9jaygmam91cm5hbC0+al9zdGF0ZV9sb2NrKTsKKwlvbGRfdGFpbCA9IGpvdXJuYWwtPmpfdGFpbDsKKwlqb3VybmFsLT5qX3RhaWwgPSAwOworCXNwaW5fdW5sb2NrKCZqb3VybmFsLT5qX3N0YXRlX2xvY2spOworCWpiZDJfam91cm5hbF91cGRhdGVfc3VwZXJibG9jayhqb3VybmFsLCAxKTsKKwlzcGluX2xvY2soJmpvdXJuYWwtPmpfc3RhdGVfbG9jayk7CisJam91cm5hbC0+al90YWlsID0gb2xkX3RhaWw7CisKKwlKX0FTU0VSVCgham91cm5hbC0+al9ydW5uaW5nX3RyYW5zYWN0aW9uKTsKKwlKX0FTU0VSVCgham91cm5hbC0+al9jb21taXR0aW5nX3RyYW5zYWN0aW9uKTsKKwlKX0FTU0VSVCgham91cm5hbC0+al9jaGVja3BvaW50X3RyYW5zYWN0aW9ucyk7CisJSl9BU1NFUlQoam91cm5hbC0+al9oZWFkID09IGpvdXJuYWwtPmpfdGFpbCk7CisJSl9BU1NFUlQoam91cm5hbC0+al90YWlsX3NlcXVlbmNlID09IGpvdXJuYWwtPmpfdHJhbnNhY3Rpb25fc2VxdWVuY2UpOworCXNwaW5fdW5sb2NrKCZqb3VybmFsLT5qX3N0YXRlX2xvY2spOworCXJldHVybiBlcnI7Cit9CisKKy8qKgorICogaW50IGpiZDJfam91cm5hbF93aXBlKCkgLSBXaXBlIGpvdXJuYWwgY29udGVudHMKKyAqIEBqb3VybmFsOiBKb3VybmFsIHRvIGFjdCBvbi4KKyAqIEB3cml0ZTogZmxhZyAoc2VlIGJlbG93KQorICoKKyAqIFdpcGUgb3V0IGFsbCBvZiB0aGUgY29udGVudHMgb2YgYSBqb3VybmFsLCBzYWZlbHkuICBUaGlzIHdpbGwgcHJvZHVjZQorICogYSB3YXJuaW5nIGlmIHRoZSBqb3VybmFsIGNvbnRhaW5zIGFueSB2YWxpZCByZWNvdmVyeSBpbmZvcm1hdGlvbi4KKyAqIE11c3QgYmUgY2FsbGVkIGJldHdlZW4gam91cm5hbF9pbml0XyooKSBhbmQgamJkMl9qb3VybmFsX2xvYWQoKS4KKyAqCisgKiBJZiAnd3JpdGUnIGlzIG5vbi16ZXJvLCB0aGVuIHdlIHdpcGUgb3V0IHRoZSBqb3VybmFsIG9uIGRpc2s7IG90aGVyd2lzZQorICogd2UgbWVyZWx5IHN1cHByZXNzIHJlY292ZXJ5LgorICovCisKK2ludCBqYmQyX2pvdXJuYWxfd2lwZShqb3VybmFsX3QgKmpvdXJuYWwsIGludCB3cml0ZSkKK3sKKwlqb3VybmFsX3N1cGVyYmxvY2tfdCAqc2I7CisJaW50IGVyciA9IDA7CisKKwlKX0FTU0VSVCAoIShqb3VybmFsLT5qX2ZsYWdzICYgSkJEMl9MT0FERUQpKTsKKworCWVyciA9IGxvYWRfc3VwZXJibG9jayhqb3VybmFsKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCisJc2IgPSBqb3VybmFsLT5qX3N1cGVyYmxvY2s7CisKKwlpZiAoIWpvdXJuYWwtPmpfdGFpbCkKKwkJZ290byBub19yZWNvdmVyeTsKKworCXByaW50ayAoS0VSTl9XQVJOSU5HICJKQkQ6ICVzIHJlY292ZXJ5IGluZm9ybWF0aW9uIG9uIGpvdXJuYWxcbiIsCisJCXdyaXRlID8gIkNsZWFyaW5nIiA6ICJJZ25vcmluZyIpOworCisJZXJyID0gamJkMl9qb3VybmFsX3NraXBfcmVjb3Zlcnkoam91cm5hbCk7CisJaWYgKHdyaXRlKQorCQlqYmQyX2pvdXJuYWxfdXBkYXRlX3N1cGVyYmxvY2soam91cm5hbCwgMSk7CisKKyBub19yZWNvdmVyeToKKwlyZXR1cm4gZXJyOworfQorCisvKgorICogam91cm5hbF9kZXZfbmFtZTogZm9ybWF0IGEgY2hhcmFjdGVyIHN0cmluZyB0byBkZXNjcmliZSBvbiB3aGF0CisgKiBkZXZpY2UgdGhpcyBqb3VybmFsIGlzIHByZXNlbnQuCisgKi8KKworc3RhdGljIGNvbnN0IGNoYXIgKmpvdXJuYWxfZGV2X25hbWUoam91cm5hbF90ICpqb3VybmFsLCBjaGFyICpidWZmZXIpCit7CisJc3RydWN0IGJsb2NrX2RldmljZSAqYmRldjsKKworCWlmIChqb3VybmFsLT5qX2lub2RlKQorCQliZGV2ID0gam91cm5hbC0+al9pbm9kZS0+aV9zYi0+c19iZGV2OworCWVsc2UKKwkJYmRldiA9IGpvdXJuYWwtPmpfZGV2OworCisJcmV0dXJuIGJkZXZuYW1lKGJkZXYsIGJ1ZmZlcik7Cit9CisKKy8qCisgKiBKb3VybmFsIGFib3J0IGhhcyB2ZXJ5IHNwZWNpZmljIHNlbWFudGljcywgd2hpY2ggd2UgZGVzY3JpYmUKKyAqIGZvciBqb3VybmFsIGFib3J0LgorICoKKyAqIFR3byBpbnRlcm5hbCBmdW5jdGlvbiwgd2hpY2ggcHJvdmlkZSBhYm9ydCB0byB0ZSBqYmQgbGF5ZXIKKyAqIGl0c2VsZiBhcmUgaGVyZS4KKyAqLworCisvKgorICogUXVpY2sgdmVyc2lvbiBmb3IgaW50ZXJuYWwgam91cm5hbCB1c2UgKGRvZXNuJ3QgbG9jayB0aGUgam91cm5hbCkuCisgKiBBYm9ydHMgaGFyZCAtLS0gd2UgbWFyayB0aGUgYWJvcnQgYXMgb2NjdXJyZWQsIGJ1dCBkbyBfbm90aGluZ18gZWxzZSwKKyAqIGFuZCBkb24ndCBhdHRlbXB0IHRvIG1ha2UgYW55IG90aGVyIGpvdXJuYWwgdXBkYXRlcy4KKyAqLwordm9pZCBfX2piZDJfam91cm5hbF9hYm9ydF9oYXJkKGpvdXJuYWxfdCAqam91cm5hbCkKK3sKKwl0cmFuc2FjdGlvbl90ICp0cmFuc2FjdGlvbjsKKwljaGFyIGJbQkRFVk5BTUVfU0laRV07CisKKwlpZiAoam91cm5hbC0+al9mbGFncyAmIEpCRDJfQUJPUlQpCisJCXJldHVybjsKKworCXByaW50ayhLRVJOX0VSUiAiQWJvcnRpbmcgam91cm5hbCBvbiBkZXZpY2UgJXMuXG4iLAorCQlqb3VybmFsX2Rldl9uYW1lKGpvdXJuYWwsIGIpKTsKKworCXNwaW5fbG9jaygmam91cm5hbC0+al9zdGF0ZV9sb2NrKTsKKwlqb3VybmFsLT5qX2ZsYWdzIHw9IEpCRDJfQUJPUlQ7CisJdHJhbnNhY3Rpb24gPSBqb3VybmFsLT5qX3J1bm5pbmdfdHJhbnNhY3Rpb247CisJaWYgKHRyYW5zYWN0aW9uKQorCQlfX2piZDJfbG9nX3N0YXJ0X2NvbW1pdChqb3VybmFsLCB0cmFuc2FjdGlvbi0+dF90aWQpOworCXNwaW5fdW5sb2NrKCZqb3VybmFsLT5qX3N0YXRlX2xvY2spOworfQorCisvKiBTb2Z0IGFib3J0OiByZWNvcmQgdGhlIGFib3J0IGVycm9yIHN0YXR1cyBpbiB0aGUgam91cm5hbCBzdXBlcmJsb2NrLAorICogYnV0IGRvbid0IGRvIGFueSBvdGhlciBJTy4gKi8KK3N0YXRpYyB2b2lkIF9fam91cm5hbF9hYm9ydF9zb2Z0IChqb3VybmFsX3QgKmpvdXJuYWwsIGludCBlcnJubykKK3sKKwlpZiAoam91cm5hbC0+al9mbGFncyAmIEpCRDJfQUJPUlQpCisJCXJldHVybjsKKworCWlmICgham91cm5hbC0+al9lcnJubykKKwkJam91cm5hbC0+al9lcnJubyA9IGVycm5vOworCisJX19qYmQyX2pvdXJuYWxfYWJvcnRfaGFyZChqb3VybmFsKTsKKworCWlmIChlcnJubykKKwkJamJkMl9qb3VybmFsX3VwZGF0ZV9zdXBlcmJsb2NrKGpvdXJuYWwsIDEpOworfQorCisvKioKKyAqIHZvaWQgamJkMl9qb3VybmFsX2Fib3J0ICgpIC0gU2h1dGRvd24gdGhlIGpvdXJuYWwgaW1tZWRpYXRlbHkuCisgKiBAam91cm5hbDogdGhlIGpvdXJuYWwgdG8gc2h1dGRvd24uCisgKiBAZXJybm86ICAgYW4gZXJyb3IgbnVtYmVyIHRvIHJlY29yZCBpbiB0aGUgam91cm5hbCBpbmRpY2F0aW5nCisgKiAgICAgICAgICAgdGhlIHJlYXNvbiBmb3IgdGhlIHNodXRkb3duLgorICoKKyAqIFBlcmZvcm0gYSBjb21wbGV0ZSwgaW1tZWRpYXRlIHNodXRkb3duIG9mIHRoZSBFTlRJUkUKKyAqIGpvdXJuYWwgKG5vdCBvZiBhIHNpbmdsZSB0cmFuc2FjdGlvbikuICBUaGlzIG9wZXJhdGlvbiBjYW5ub3QgYmUKKyAqIHVuZG9uZSB3aXRob3V0IGNsb3NpbmcgYW5kIHJlb3BlbmluZyB0aGUgam91cm5hbC4KKyAqCisgKiBUaGUgamJkMl9qb3VybmFsX2Fib3J0IGZ1bmN0aW9uIGlzIGludGVuZGVkIHRvIHN1cHBvcnQgaGlnaGVyIGxldmVsIGVycm9yCisgKiByZWNvdmVyeSBtZWNoYW5pc21zIHN1Y2ggYXMgdGhlIGV4dDIvZXh0MyByZW1vdW50LXJlYWRvbmx5IGVycm9yCisgKiBtb2RlLgorICoKKyAqIEpvdXJuYWwgYWJvcnQgaGFzIHZlcnkgc3BlY2lmaWMgc2VtYW50aWNzLiAgQW55IGV4aXN0aW5nIGRpcnR5LAorICogdW5qb3VybmFsZWQgYnVmZmVycyBpbiB0aGUgbWFpbiBmaWxlc3lzdGVtIHdpbGwgc3RpbGwgYmUgd3JpdHRlbiB0bworICogZGlzayBieSBiZGZsdXNoLCBidXQgdGhlIGpvdXJuYWxpbmcgbWVjaGFuaXNtIHdpbGwgYmUgc3VzcGVuZGVkCisgKiBpbW1lZGlhdGVseSBhbmQgbm8gZnVydGhlciB0cmFuc2FjdGlvbiBjb21taXRzIHdpbGwgYmUgaG9ub3VyZWQuCisgKgorICogQW55IGRpcnR5LCBqb3VybmFsZWQgYnVmZmVycyB3aWxsIGJlIHdyaXR0ZW4gYmFjayB0byBkaXNrIHdpdGhvdXQKKyAqIGhpdHRpbmcgdGhlIGpvdXJuYWwuICBBdG9taWNpdHkgY2Fubm90IGJlIGd1YXJhbnRlZWQgb24gYW4gYWJvcnRlZAorICogZmlsZXN5c3RlbSwgYnV0IHdlIF9kb18gYXR0ZW1wdCB0byBsZWF2ZSBhcyBtdWNoIGRhdGEgYXMgcG9zc2libGUKKyAqIGJlaGluZCBmb3IgZnNjayB0byB1c2UgZm9yIGNsZWFudXAuCisgKgorICogQW55IGF0dGVtcHQgdG8gZ2V0IGEgbmV3IHRyYW5zYWN0aW9uIGhhbmRsZSBvbiBhIGpvdXJuYWwgd2hpY2ggaXMgaW4KKyAqIEFCT1JUIHN0YXRlIHdpbGwganVzdCByZXN1bHQgaW4gYW4gLUVST0ZTIGVycm9yIHJldHVybi4gIEEKKyAqIGpiZDJfam91cm5hbF9zdG9wIG9uIGFuIGV4aXN0aW5nIGhhbmRsZSB3aWxsIHJldHVybiAtRUlPIGlmIHdlIGhhdmUKKyAqIGVudGVyZWQgYWJvcnQgc3RhdGUgZHVyaW5nIHRoZSB1cGRhdGUuCisgKgorICogUmVjdXJzaXZlIHRyYW5zYWN0aW9ucyBhcmUgbm90IGRpc3R1cmJlZCBieSBqb3VybmFsIGFib3J0IHVudGlsIHRoZQorICogZmluYWwgamJkMl9qb3VybmFsX3N0b3AsIHdoaWNoIHdpbGwgcmVjZWl2ZSB0aGUgLUVJTyBlcnJvci4KKyAqCisgKiBGaW5hbGx5LCB0aGUgamJkMl9qb3VybmFsX2Fib3J0IGNhbGwgYWxsb3dzIHRoZSBjYWxsZXIgdG8gc3VwcGx5IGFuIGVycm5vCisgKiB3aGljaCB3aWxsIGJlIHJlY29yZGVkIChpZiBwb3NzaWJsZSkgaW4gdGhlIGpvdXJuYWwgc3VwZXJibG9jay4gIFRoaXMKKyAqIGFsbG93cyBhIGNsaWVudCB0byByZWNvcmQgZmFpbHVyZSBjb25kaXRpb25zIGluIHRoZSBtaWRkbGUgb2YgYQorICogdHJhbnNhY3Rpb24gd2l0aG91dCBoYXZpbmcgdG8gY29tcGxldGUgdGhlIHRyYW5zYWN0aW9uIHRvIHJlY29yZCB0aGUKKyAqIGZhaWx1cmUgdG8gZGlzay4gIGV4dDNfZXJyb3IsIGZvciBleGFtcGxlLCBub3cgdXNlcyB0aGlzCisgKiBmdW5jdGlvbmFsaXR5LgorICoKKyAqIEVycm9ycyB3aGljaCBvcmlnaW5hdGUgZnJvbSB3aXRoaW4gdGhlIGpvdXJuYWxpbmcgbGF5ZXIgd2lsbCBOT1QKKyAqIHN1cHBseSBhbiBlcnJubzsgYSBudWxsIGVycm5vIGltcGxpZXMgdGhhdCBhYnNvbHV0ZWx5IG5vIGZ1cnRoZXIKKyAqIHdyaXRlcyBhcmUgZG9uZSB0byB0aGUgam91cm5hbCAodW5sZXNzIHRoZXJlIGFyZSBhbnkgYWxyZWFkeSBpbgorICogcHJvZ3Jlc3MpLgorICoKKyAqLworCit2b2lkIGpiZDJfam91cm5hbF9hYm9ydChqb3VybmFsX3QgKmpvdXJuYWwsIGludCBlcnJubykKK3sKKwlfX2pvdXJuYWxfYWJvcnRfc29mdChqb3VybmFsLCBlcnJubyk7Cit9CisKKy8qKgorICogaW50IGpiZDJfam91cm5hbF9lcnJubyAoKSAtIHJldHVybnMgdGhlIGpvdXJuYWwncyBlcnJvciBzdGF0ZS4KKyAqIEBqb3VybmFsOiBqb3VybmFsIHRvIGV4YW1pbmUuCisgKgorICogVGhpcyBpcyB0aGUgZXJybm8gbnVtYmV0IHNldCB3aXRoIGpiZDJfam91cm5hbF9hYm9ydCgpLCB0aGUgbGFzdAorICogdGltZSB0aGUgam91cm5hbCB3YXMgbW91bnRlZCAtIGlmIHRoZSBqb3VybmFsIHdhcyBzdG9wcGVkCisgKiB3aXRob3V0IGNhbGxpbmcgYWJvcnQgdGhpcyB3aWxsIGJlIDAuCisgKgorICogSWYgdGhlIGpvdXJuYWwgaGFzIGJlZW4gYWJvcnRlZCBvbiB0aGlzIG1vdW50IHRpbWUgLUVST0ZTIHdpbGwKKyAqIGJlIHJldHVybmVkLgorICovCitpbnQgamJkMl9qb3VybmFsX2Vycm5vKGpvdXJuYWxfdCAqam91cm5hbCkKK3sKKwlpbnQgZXJyOworCisJc3Bpbl9sb2NrKCZqb3VybmFsLT5qX3N0YXRlX2xvY2spOworCWlmIChqb3VybmFsLT5qX2ZsYWdzICYgSkJEMl9BQk9SVCkKKwkJZXJyID0gLUVST0ZTOworCWVsc2UKKwkJZXJyID0gam91cm5hbC0+al9lcnJubzsKKwlzcGluX3VubG9jaygmam91cm5hbC0+al9zdGF0ZV9sb2NrKTsKKwlyZXR1cm4gZXJyOworfQorCisvKioKKyAqIGludCBqYmQyX2pvdXJuYWxfY2xlYXJfZXJyICgpIC0gY2xlYXJzIHRoZSBqb3VybmFsJ3MgZXJyb3Igc3RhdGUKKyAqIEBqb3VybmFsOiBqb3VybmFsIHRvIGFjdCBvbi4KKyAqCisgKiBBbiBlcnJvciBtdXN0IGJlIGNsZWFyZWQgb3IgQWNrZWQgdG8gdGFrZSBhIEZTIG91dCBvZiByZWFkb25seQorICogbW9kZS4KKyAqLworaW50IGpiZDJfam91cm5hbF9jbGVhcl9lcnIoam91cm5hbF90ICpqb3VybmFsKQoreworCWludCBlcnIgPSAwOworCisJc3Bpbl9sb2NrKCZqb3VybmFsLT5qX3N0YXRlX2xvY2spOworCWlmIChqb3VybmFsLT5qX2ZsYWdzICYgSkJEMl9BQk9SVCkKKwkJZXJyID0gLUVST0ZTOworCWVsc2UKKwkJam91cm5hbC0+al9lcnJubyA9IDA7CisJc3Bpbl91bmxvY2soJmpvdXJuYWwtPmpfc3RhdGVfbG9jayk7CisJcmV0dXJuIGVycjsKK30KKworLyoqCisgKiB2b2lkIGpiZDJfam91cm5hbF9hY2tfZXJyKCkgLSBBY2sgam91cm5hbCBlcnIuCisgKiBAam91cm5hbDogam91cm5hbCB0byBhY3Qgb24uCisgKgorICogQW4gZXJyb3IgbXVzdCBiZSBjbGVhcmVkIG9yIEFja2VkIHRvIHRha2UgYSBGUyBvdXQgb2YgcmVhZG9ubHkKKyAqIG1vZGUuCisgKi8KK3ZvaWQgamJkMl9qb3VybmFsX2Fja19lcnIoam91cm5hbF90ICpqb3VybmFsKQoreworCXNwaW5fbG9jaygmam91cm5hbC0+al9zdGF0ZV9sb2NrKTsKKwlpZiAoam91cm5hbC0+al9lcnJubykKKwkJam91cm5hbC0+al9mbGFncyB8PSBKQkQyX0FDS19FUlI7CisJc3Bpbl91bmxvY2soJmpvdXJuYWwtPmpfc3RhdGVfbG9jayk7Cit9CisKK2ludCBqYmQyX2pvdXJuYWxfYmxvY2tzX3Blcl9wYWdlKHN0cnVjdCBpbm9kZSAqaW5vZGUpCit7CisJcmV0dXJuIDEgPDwgKFBBR0VfQ0FDSEVfU0hJRlQgLSBpbm9kZS0+aV9zYi0+c19ibG9ja3NpemVfYml0cyk7Cit9CisKKy8qCisgKiBoZWxwZXIgZnVuY3Rpb25zIHRvIGRlYWwgd2l0aCAzMiBvciA2NGJpdCBibG9jayBudW1iZXJzLgorICovCitzaXplX3Qgam91cm5hbF90YWdfYnl0ZXMoam91cm5hbF90ICpqb3VybmFsKQoreworCWlmIChKQkQyX0hBU19JTkNPTVBBVF9GRUFUVVJFKGpvdXJuYWwsIEpCRDJfRkVBVFVSRV9JTkNPTVBBVF82NEJJVCkpCisJCXJldHVybiBKQkRfVEFHX1NJWkU2NDsKKwllbHNlCisJCXJldHVybiBKQkRfVEFHX1NJWkUzMjsKK30KKworLyoKKyAqIFNpbXBsZSBzdXBwb3J0IGZvciByZXRyeWluZyBtZW1vcnkgYWxsb2NhdGlvbnMuICBJbnRyb2R1Y2VkIHRvIGhlbHAgdG8KKyAqIGRlYnVnIGRpZmZlcmVudCBWTSBkZWFkbG9jayBhdm9pZGFuY2Ugc3RyYXRlZ2llcy4KKyAqLwordm9pZCAqIF9famJkMl9rbWFsbG9jIChjb25zdCBjaGFyICp3aGVyZSwgc2l6ZV90IHNpemUsIGdmcF90IGZsYWdzLCBpbnQgcmV0cnkpCit7CisJcmV0dXJuIGttYWxsb2Moc2l6ZSwgZmxhZ3MgfCAocmV0cnkgPyBfX0dGUF9OT0ZBSUwgOiAwKSk7Cit9CisKKy8qCisgKiBqYmQgc2xhYiBtYW5hZ2VtZW50OiBjcmVhdGUgMWssIDJrLCA0aywgOGsgc2xhYnMgYXMgbmVlZGVkCisgKiBhbmQgYWxsb2NhdGUgZnJvemVuIGFuZCBjb21taXQgYnVmZmVycyBmcm9tIHRoZXNlIHNsYWJzLgorICoKKyAqIFJlYXNvbiBmb3IgZG9pbmcgdGhpcyBpcyB0byBhdm9pZCwgU0xBQl9ERUJVRyAtIHNpbmNlIGl0IGNvdWxkCisgKiBjYXVzZSBiaCB0byBjcm9zcyBwYWdlIGJvdW5kYXJ5LgorICovCisKKyNkZWZpbmUgSkJEX01BWF9TTEFCUyA1CisjZGVmaW5lIEpCRF9TTEFCX0lOREVYKHNpemUpICAoc2l6ZSA+PiAxMSkKKworc3RhdGljIGttZW1fY2FjaGVfdCAqamJkX3NsYWJbSkJEX01BWF9TTEFCU107CitzdGF0aWMgY29uc3QgY2hhciAqamJkX3NsYWJfbmFtZXNbSkJEX01BWF9TTEFCU10gPSB7CisJImpiZDJfMWsiLCAiamJkMl8yayIsICJqYmQyXzRrIiwgTlVMTCwgImpiZDJfOGsiCit9OworCitzdGF0aWMgdm9pZCBqYmQyX2pvdXJuYWxfZGVzdHJveV9qYmRfc2xhYnModm9pZCkKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBKQkRfTUFYX1NMQUJTOyBpKyspIHsKKwkJaWYgKGpiZF9zbGFiW2ldKQorCQkJa21lbV9jYWNoZV9kZXN0cm95KGpiZF9zbGFiW2ldKTsKKwkJamJkX3NsYWJbaV0gPSBOVUxMOworCX0KK30KKworc3RhdGljIGludCBqYmQyX2pvdXJuYWxfY3JlYXRlX2piZF9zbGFiKHNpemVfdCBzbGFiX3NpemUpCit7CisJaW50IGkgPSBKQkRfU0xBQl9JTkRFWChzbGFiX3NpemUpOworCisJQlVHX09OKGkgPj0gSkJEX01BWF9TTEFCUyk7CisKKwkvKgorCSAqIENoZWNrIGlmIHdlIGFscmVhZHkgaGF2ZSBhIHNsYWIgY3JlYXRlZCBmb3IgdGhpcyBzaXplCisJICovCisJaWYgKGpiZF9zbGFiW2ldKQorCQlyZXR1cm4gMDsKKworCS8qCisJICogQ3JlYXRlIGEgc2xhYiBhbmQgZm9yY2UgYWxpZ25tZW50IHRvIGJlIHNhbWUgYXMgc2xhYnNpemUgLQorCSAqIHRoaXMgd2lsbCBtYWtlIHN1cmUgdGhhdCBhbGxvY2F0aW9ucyB3b24ndCBjcm9zcyB0aGUgcGFnZQorCSAqIGJvdW5kYXJ5LgorCSAqLworCWpiZF9zbGFiW2ldID0ga21lbV9jYWNoZV9jcmVhdGUoamJkX3NsYWJfbmFtZXNbaV0sCisJCQkJc2xhYl9zaXplLCBzbGFiX3NpemUsIDAsIE5VTEwsIE5VTEwpOworCWlmICghamJkX3NsYWJbaV0pIHsKKwkJcHJpbnRrKEtFUk5fRU1FUkcgIkpCRDogbm8gbWVtb3J5IGZvciBqYmRfc2xhYiBjYWNoZVxuIik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwlyZXR1cm4gMDsKK30KKwordm9pZCAqIGpiZDJfc2xhYl9hbGxvYyhzaXplX3Qgc2l6ZSwgZ2ZwX3QgZmxhZ3MpCit7CisJaW50IGlkeDsKKworCWlkeCA9IEpCRF9TTEFCX0lOREVYKHNpemUpOworCUJVR19PTihqYmRfc2xhYltpZHhdID09IE5VTEwpOworCXJldHVybiBrbWVtX2NhY2hlX2FsbG9jKGpiZF9zbGFiW2lkeF0sIGZsYWdzIHwgX19HRlBfTk9GQUlMKTsKK30KKwordm9pZCBqYmQyX3NsYWJfZnJlZSh2b2lkICpwdHIsICBzaXplX3Qgc2l6ZSkKK3sKKwlpbnQgaWR4OworCisJaWR4ID0gSkJEX1NMQUJfSU5ERVgoc2l6ZSk7CisJQlVHX09OKGpiZF9zbGFiW2lkeF0gPT0gTlVMTCk7CisJa21lbV9jYWNoZV9mcmVlKGpiZF9zbGFiW2lkeF0sIHB0cik7Cit9CisKKy8qCisgKiBKb3VybmFsX2hlYWQgc3RvcmFnZSBtYW5hZ2VtZW50CisgKi8KK3N0YXRpYyBrbWVtX2NhY2hlX3QgKmpiZDJfam91cm5hbF9oZWFkX2NhY2hlOworI2lmZGVmIENPTkZJR19KQkRfREVCVUcKK3N0YXRpYyBhdG9taWNfdCBucl9qb3VybmFsX2hlYWRzID0gQVRPTUlDX0lOSVQoMCk7CisjZW5kaWYKKworc3RhdGljIGludCBqb3VybmFsX2luaXRfamJkMl9qb3VybmFsX2hlYWRfY2FjaGUodm9pZCkKK3sKKwlpbnQgcmV0dmFsOworCisJSl9BU1NFUlQoamJkMl9qb3VybmFsX2hlYWRfY2FjaGUgPT0gMCk7CisJamJkMl9qb3VybmFsX2hlYWRfY2FjaGUgPSBrbWVtX2NhY2hlX2NyZWF0ZSgiamJkMl9qb3VybmFsX2hlYWQiLAorCQkJCXNpemVvZihzdHJ1Y3Qgam91cm5hbF9oZWFkKSwKKwkJCQkwLAkJLyogb2Zmc2V0ICovCisJCQkJMCwJCS8qIGZsYWdzICovCisJCQkJTlVMTCwJCS8qIGN0b3IgKi8KKwkJCQlOVUxMKTsJCS8qIGR0b3IgKi8KKwlyZXR2YWwgPSAwOworCWlmIChqYmQyX2pvdXJuYWxfaGVhZF9jYWNoZSA9PSAwKSB7CisJCXJldHZhbCA9IC1FTk9NRU07CisJCXByaW50ayhLRVJOX0VNRVJHICJKQkQ6IG5vIG1lbW9yeSBmb3Igam91cm5hbF9oZWFkIGNhY2hlXG4iKTsKKwl9CisJcmV0dXJuIHJldHZhbDsKK30KKworc3RhdGljIHZvaWQgamJkMl9qb3VybmFsX2Rlc3Ryb3lfamJkMl9qb3VybmFsX2hlYWRfY2FjaGUodm9pZCkKK3sKKwlKX0FTU0VSVChqYmQyX2pvdXJuYWxfaGVhZF9jYWNoZSAhPSBOVUxMKTsKKwlrbWVtX2NhY2hlX2Rlc3Ryb3koamJkMl9qb3VybmFsX2hlYWRfY2FjaGUpOworCWpiZDJfam91cm5hbF9oZWFkX2NhY2hlID0gTlVMTDsKK30KKworLyoKKyAqIGpvdXJuYWxfaGVhZCBzcGxpY2luZyBhbmQgZGljaW5nCisgKi8KK3N0YXRpYyBzdHJ1Y3Qgam91cm5hbF9oZWFkICpqb3VybmFsX2FsbG9jX2pvdXJuYWxfaGVhZCh2b2lkKQoreworCXN0cnVjdCBqb3VybmFsX2hlYWQgKnJldDsKKwlzdGF0aWMgdW5zaWduZWQgbG9uZyBsYXN0X3dhcm5pbmc7CisKKyNpZmRlZiBDT05GSUdfSkJEX0RFQlVHCisJYXRvbWljX2luYygmbnJfam91cm5hbF9oZWFkcyk7CisjZW5kaWYKKwlyZXQgPSBrbWVtX2NhY2hlX2FsbG9jKGpiZDJfam91cm5hbF9oZWFkX2NhY2hlLCBHRlBfTk9GUyk7CisJaWYgKHJldCA9PSAwKSB7CisJCWpiZF9kZWJ1ZygxLCAib3V0IG9mIG1lbW9yeSBmb3Igam91cm5hbF9oZWFkXG4iKTsKKwkJaWYgKHRpbWVfYWZ0ZXIoamlmZmllcywgbGFzdF93YXJuaW5nICsgNSpIWikpIHsKKwkJCXByaW50ayhLRVJOX05PVElDRSAiRU5PTUVNIGluICVzLCByZXRyeWluZy5cbiIsCisJCQkgICAgICAgX19GVU5DVElPTl9fKTsKKwkJCWxhc3Rfd2FybmluZyA9IGppZmZpZXM7CisJCX0KKwkJd2hpbGUgKHJldCA9PSAwKSB7CisJCQl5aWVsZCgpOworCQkJcmV0ID0ga21lbV9jYWNoZV9hbGxvYyhqYmQyX2pvdXJuYWxfaGVhZF9jYWNoZSwgR0ZQX05PRlMpOworCQl9CisJfQorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIGpvdXJuYWxfZnJlZV9qb3VybmFsX2hlYWQoc3RydWN0IGpvdXJuYWxfaGVhZCAqamgpCit7CisjaWZkZWYgQ09ORklHX0pCRF9ERUJVRworCWF0b21pY19kZWMoJm5yX2pvdXJuYWxfaGVhZHMpOworCW1lbXNldChqaCwgSkJEX1BPSVNPTl9GUkVFLCBzaXplb2YoKmpoKSk7CisjZW5kaWYKKwlrbWVtX2NhY2hlX2ZyZWUoamJkMl9qb3VybmFsX2hlYWRfY2FjaGUsIGpoKTsKK30KKworLyoKKyAqIEEgam91cm5hbF9oZWFkIGlzIGF0dGFjaGVkIHRvIGEgYnVmZmVyX2hlYWQgd2hlbmV2ZXIgSkJEIGhhcyBhbgorICogaW50ZXJlc3QgaW4gdGhlIGJ1ZmZlci4KKyAqCisgKiBXaGVuZXZlciBhIGJ1ZmZlciBoYXMgYW4gYXR0YWNoZWQgam91cm5hbF9oZWFkLCBpdHMgLT5iX3N0YXRlOkJIX0pCRCBiaXQKKyAqIGlzIHNldC4gIFRoaXMgYml0IGlzIHRlc3RlZCBpbiBjb3JlIGtlcm5lbCBjb2RlIHdoZXJlIHdlIG5lZWQgdG8gdGFrZQorICogSkJELXNwZWNpZmljIGFjdGlvbnMuICBUZXN0aW5nIHRoZSB6ZXJvbmVzcyBvZiAtPmJfcHJpdmF0ZSBpcyBub3QgcmVsaWFibGUKKyAqIHRoZXJlLgorICoKKyAqIFdoZW4gYSBidWZmZXIgaGFzIGl0cyBCSF9KQkQgYml0IHNldCwgaXRzIC0+Yl9jb3VudCBpcyBlbGV2YXRlZCBieSBvbmUuCisgKgorICogV2hlbiBhIGJ1ZmZlciBoYXMgaXRzIEJIX0pCRCBiaXQgc2V0IGl0IGlzIGltbXVuZSBmcm9tIGJlaW5nIHJlbGVhc2VkIGJ5CisgKiBjb3JlIGtlcm5lbCBjb2RlLCBtYWlubHkgdmlhIC0+Yl9jb3VudC4KKyAqCisgKiBBIGpvdXJuYWxfaGVhZCBtYXkgYmUgZGV0YWNoZWQgZnJvbSBpdHMgYnVmZmVyX2hlYWQgd2hlbiB0aGUgam91cm5hbF9oZWFkJ3MKKyAqIGJfdHJhbnNhY3Rpb24sIGJfY3BfdHJhbnNhY3Rpb24gYW5kIGJfbmV4dF90cmFuc2FjdGlvbiBwb2ludGVycyBhcmUgTlVMTC4KKyAqIFZhcmlvdXMgcGxhY2VzIGluIEpCRCBjYWxsIGpiZDJfam91cm5hbF9yZW1vdmVfam91cm5hbF9oZWFkKCkgdG8gaW5kaWNhdGUgdGhhdCB0aGUKKyAqIGpvdXJuYWxfaGVhZCBjYW4gYmUgZHJvcHBlZCBpZiBuZWVkZWQuCisgKgorICogVmFyaW91cyBwbGFjZXMgaW4gdGhlIGtlcm5lbCB3YW50IHRvIGF0dGFjaCBhIGpvdXJuYWxfaGVhZCB0byBhIGJ1ZmZlcl9oZWFkCisgKiBfYmVmb3JlXyBhdHRhY2hpbmcgdGhlIGpvdXJuYWxfaGVhZCB0byBhIHRyYW5zYWN0aW9uLiAgVG8gcHJvdGVjdCB0aGUKKyAqIGpvdXJuYWxfaGVhZCBpbiB0aGlzIHNpdHVhdGlvbiwgamJkMl9qb3VybmFsX2FkZF9qb3VybmFsX2hlYWQgZWxldmF0ZXMgdGhlCisgKiBqb3VybmFsX2hlYWQncyBiX2pjb3VudCByZWZjb3VudCBieSBvbmUuICBUaGUgY2FsbGVyIG11c3QgY2FsbAorICogamJkMl9qb3VybmFsX3B1dF9qb3VybmFsX2hlYWQoKSB0byB1bmRvIHRoaXMuCisgKgorICogU28gdGhlIHR5cGljYWwgdXNhZ2Ugd291bGQgYmU6CisgKgorICoJKEF0dGFjaCBhIGpvdXJuYWxfaGVhZCBpZiBuZWVkZWQuICBJbmNyZW1lbnRzIGJfamNvdW50KQorICoJc3RydWN0IGpvdXJuYWxfaGVhZCAqamggPSBqYmQyX2pvdXJuYWxfYWRkX2pvdXJuYWxfaGVhZChiaCk7CisgKgkuLi4KKyAqCWpoLT5iX3RyYW5zYWN0aW9uID0geHh4OworICoJamJkMl9qb3VybmFsX3B1dF9qb3VybmFsX2hlYWQoamgpOworICoKKyAqIE5vdywgdGhlIGpvdXJuYWxfaGVhZCdzIGJfamNvdW50IGlzIHplcm8sIGJ1dCBpdCBpcyBzYWZlIGZyb20gYmVpbmcgcmVsZWFzZWQKKyAqIGJlY2F1c2UgaXQgaGFzIGEgbm9uLXplcm8gYl90cmFuc2FjdGlvbi4KKyAqLworCisvKgorICogR2l2ZSBhIGJ1ZmZlcl9oZWFkIGEgam91cm5hbF9oZWFkLgorICoKKyAqIERvZXNuJ3QgbmVlZCB0aGUgam91cm5hbCBsb2NrLgorICogTWF5IHNsZWVwLgorICovCitzdHJ1Y3Qgam91cm5hbF9oZWFkICpqYmQyX2pvdXJuYWxfYWRkX2pvdXJuYWxfaGVhZChzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoKQoreworCXN0cnVjdCBqb3VybmFsX2hlYWQgKmpoOworCXN0cnVjdCBqb3VybmFsX2hlYWQgKm5ld19qaCA9IE5VTEw7CisKK3JlcGVhdDoKKwlpZiAoIWJ1ZmZlcl9qYmQoYmgpKSB7CisJCW5ld19qaCA9IGpvdXJuYWxfYWxsb2Nfam91cm5hbF9oZWFkKCk7CisJCW1lbXNldChuZXdfamgsIDAsIHNpemVvZigqbmV3X2poKSk7CisJfQorCisJamJkX2xvY2tfYmhfam91cm5hbF9oZWFkKGJoKTsKKwlpZiAoYnVmZmVyX2piZChiaCkpIHsKKwkJamggPSBiaDJqaChiaCk7CisJfSBlbHNlIHsKKwkJSl9BU1NFUlRfQkgoYmgsCisJCQkoYXRvbWljX3JlYWQoJmJoLT5iX2NvdW50KSA+IDApIHx8CisJCQkoYmgtPmJfcGFnZSAmJiBiaC0+Yl9wYWdlLT5tYXBwaW5nKSk7CisKKwkJaWYgKCFuZXdfamgpIHsKKwkJCWpiZF91bmxvY2tfYmhfam91cm5hbF9oZWFkKGJoKTsKKwkJCWdvdG8gcmVwZWF0OworCQl9CisKKwkJamggPSBuZXdfamg7CisJCW5ld19qaCA9IE5VTEw7CQkvKiBXZSBjb25zdW1lZCBpdCAqLworCQlzZXRfYnVmZmVyX2piZChiaCk7CisJCWJoLT5iX3ByaXZhdGUgPSBqaDsKKwkJamgtPmJfYmggPSBiaDsKKwkJZ2V0X2JoKGJoKTsKKwkJQlVGRkVSX1RSQUNFKGJoLCAiYWRkZWQgam91cm5hbF9oZWFkIik7CisJfQorCWpoLT5iX2pjb3VudCsrOworCWpiZF91bmxvY2tfYmhfam91cm5hbF9oZWFkKGJoKTsKKwlpZiAobmV3X2poKQorCQlqb3VybmFsX2ZyZWVfam91cm5hbF9oZWFkKG5ld19qaCk7CisJcmV0dXJuIGJoLT5iX3ByaXZhdGU7Cit9CisKKy8qCisgKiBHcmFiIGEgcmVmIGFnYWluc3QgdGhpcyBidWZmZXJfaGVhZCdzIGpvdXJuYWxfaGVhZC4gIElmIGl0IGVuZGVkIHVwIG5vdAorICogaGF2aW5nIGEgam91cm5hbF9oZWFkLCByZXR1cm4gTlVMTAorICovCitzdHJ1Y3Qgam91cm5hbF9oZWFkICpqYmQyX2pvdXJuYWxfZ3JhYl9qb3VybmFsX2hlYWQoc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCkKK3sKKwlzdHJ1Y3Qgam91cm5hbF9oZWFkICpqaCA9IE5VTEw7CisKKwlqYmRfbG9ja19iaF9qb3VybmFsX2hlYWQoYmgpOworCWlmIChidWZmZXJfamJkKGJoKSkgeworCQlqaCA9IGJoMmpoKGJoKTsKKwkJamgtPmJfamNvdW50Kys7CisJfQorCWpiZF91bmxvY2tfYmhfam91cm5hbF9oZWFkKGJoKTsKKwlyZXR1cm4gamg7Cit9CisKK3N0YXRpYyB2b2lkIF9fam91cm5hbF9yZW1vdmVfam91cm5hbF9oZWFkKHN0cnVjdCBidWZmZXJfaGVhZCAqYmgpCit7CisJc3RydWN0IGpvdXJuYWxfaGVhZCAqamggPSBiaDJqaChiaCk7CisKKwlKX0FTU0VSVF9KSChqaCwgamgtPmJfamNvdW50ID49IDApOworCisJZ2V0X2JoKGJoKTsKKwlpZiAoamgtPmJfamNvdW50ID09IDApIHsKKwkJaWYgKGpoLT5iX3RyYW5zYWN0aW9uID09IE5VTEwgJiYKKwkJCQlqaC0+Yl9uZXh0X3RyYW5zYWN0aW9uID09IE5VTEwgJiYKKwkJCQlqaC0+Yl9jcF90cmFuc2FjdGlvbiA9PSBOVUxMKSB7CisJCQlKX0FTU0VSVF9KSChqaCwgamgtPmJfamxpc3QgPT0gQkpfTm9uZSk7CisJCQlKX0FTU0VSVF9CSChiaCwgYnVmZmVyX2piZChiaCkpOworCQkJSl9BU1NFUlRfQkgoYmgsIGpoMmJoKGpoKSA9PSBiaCk7CisJCQlCVUZGRVJfVFJBQ0UoYmgsICJyZW1vdmUgam91cm5hbF9oZWFkIik7CisJCQlpZiAoamgtPmJfZnJvemVuX2RhdGEpIHsKKwkJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogZnJlZWluZyAiCisJCQkJCQkiYl9mcm96ZW5fZGF0YVxuIiwKKwkJCQkJCV9fRlVOQ1RJT05fXyk7CisJCQkJamJkMl9zbGFiX2ZyZWUoamgtPmJfZnJvemVuX2RhdGEsIGJoLT5iX3NpemUpOworCQkJfQorCQkJaWYgKGpoLT5iX2NvbW1pdHRlZF9kYXRhKSB7CisJCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IGZyZWVpbmcgIgorCQkJCQkJImJfY29tbWl0dGVkX2RhdGFcbiIsCisJCQkJCQlfX0ZVTkNUSU9OX18pOworCQkJCWpiZDJfc2xhYl9mcmVlKGpoLT5iX2NvbW1pdHRlZF9kYXRhLCBiaC0+Yl9zaXplKTsKKwkJCX0KKwkJCWJoLT5iX3ByaXZhdGUgPSBOVUxMOworCQkJamgtPmJfYmggPSBOVUxMOwkvKiBkZWJ1ZywgcmVhbGx5ICovCisJCQljbGVhcl9idWZmZXJfamJkKGJoKTsKKwkJCV9fYnJlbHNlKGJoKTsKKwkJCWpvdXJuYWxfZnJlZV9qb3VybmFsX2hlYWQoamgpOworCQl9IGVsc2UgeworCQkJQlVGRkVSX1RSQUNFKGJoLCAiam91cm5hbF9oZWFkIHdhcyBsb2NrZWQiKTsKKwkJfQorCX0KK30KKworLyoKKyAqIGpiZDJfam91cm5hbF9yZW1vdmVfam91cm5hbF9oZWFkKCk6IGlmIHRoZSBidWZmZXIgaXNuJ3QgYXR0YWNoZWQgdG8gYSB0cmFuc2FjdGlvbgorICogYW5kIGhhcyBhIHplcm8gYl9qY291bnQgdGhlbiByZW1vdmUgYW5kIHJlbGVhc2UgaXRzIGpvdXJuYWxfaGVhZC4gICBJZiB3ZSBkaWQKKyAqIHNlZSB0aGF0IHRoZSBidWZmZXIgaXMgbm90IHVzZWQgYnkgYW55IHRyYW5zYWN0aW9uIHdlIGFsc28gImxvZ2ljYWxseSIKKyAqIGRlY3JlbWVudCAtPmJfY291bnQuCisgKgorICogV2UgaW4gZmFjdCB0YWtlIGFuIGFkZGl0aW9uYWwgaW5jcmVtZW50IG9uIC0+Yl9jb3VudCBhcyBhIGNvbnZlbmllbmNlLAorICogYmVjYXVzZSB0aGUgY2FsbGVyIHVzdWFsbHkgd2FudHMgdG8gZG8gYWRkaXRpb25hbCB0aGluZ3Mgd2l0aCB0aGUgYmgKKyAqIGFmdGVyIGNhbGxpbmcgaGVyZS4KKyAqIFRoZSBjYWxsZXIgb2YgamJkMl9qb3VybmFsX3JlbW92ZV9qb3VybmFsX2hlYWQoKSAqbXVzdCogcnVuIF9fYnJlbHNlKGJoKSBhdCBzb21lCisgKiB0aW1lLiAgT25jZSB0aGUgY2FsbGVyIGhhcyBydW4gX19icmVsc2UoKSwgdGhlIGJ1ZmZlciBpcyBlbGlnaWJsZSBmb3IKKyAqIHJlYXBpbmcgYnkgdHJ5X3RvX2ZyZWVfYnVmZmVycygpLgorICovCit2b2lkIGpiZDJfam91cm5hbF9yZW1vdmVfam91cm5hbF9oZWFkKHN0cnVjdCBidWZmZXJfaGVhZCAqYmgpCit7CisJamJkX2xvY2tfYmhfam91cm5hbF9oZWFkKGJoKTsKKwlfX2pvdXJuYWxfcmVtb3ZlX2pvdXJuYWxfaGVhZChiaCk7CisJamJkX3VubG9ja19iaF9qb3VybmFsX2hlYWQoYmgpOworfQorCisvKgorICogRHJvcCBhIHJlZmVyZW5jZSBvbiB0aGUgcGFzc2VkIGpvdXJuYWxfaGVhZC4gIElmIGl0IGZlbGwgdG8gemVybyB0aGVuIHRyeSB0bworICogcmVsZWFzZSB0aGUgam91cm5hbF9oZWFkIGZyb20gdGhlIGJ1ZmZlcl9oZWFkLgorICovCit2b2lkIGpiZDJfam91cm5hbF9wdXRfam91cm5hbF9oZWFkKHN0cnVjdCBqb3VybmFsX2hlYWQgKmpoKQoreworCXN0cnVjdCBidWZmZXJfaGVhZCAqYmggPSBqaDJiaChqaCk7CisKKwlqYmRfbG9ja19iaF9qb3VybmFsX2hlYWQoYmgpOworCUpfQVNTRVJUX0pIKGpoLCBqaC0+Yl9qY291bnQgPiAwKTsKKwktLWpoLT5iX2pjb3VudDsKKwlpZiAoIWpoLT5iX2pjb3VudCAmJiAhamgtPmJfdHJhbnNhY3Rpb24pIHsKKwkJX19qb3VybmFsX3JlbW92ZV9qb3VybmFsX2hlYWQoYmgpOworCQlfX2JyZWxzZShiaCk7CisJfQorCWpiZF91bmxvY2tfYmhfam91cm5hbF9oZWFkKGJoKTsKK30KKworLyoKKyAqIC9wcm9jIHR1bmFibGVzCisgKi8KKyNpZiBkZWZpbmVkKENPTkZJR19KQkRfREVCVUcpCitpbnQgamJkMl9qb3VybmFsX2VuYWJsZV9kZWJ1ZzsKK0VYUE9SVF9TWU1CT0woamJkMl9qb3VybmFsX2VuYWJsZV9kZWJ1Zyk7CisjZW5kaWYKKworI2lmIGRlZmluZWQoQ09ORklHX0pCRF9ERUJVRykgJiYgZGVmaW5lZChDT05GSUdfUFJPQ19GUykKKworc3RhdGljIHN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqcHJvY19qYmRfZGVidWc7CisKK3N0YXRpYyBpbnQgcmVhZF9qYmRfZGVidWcoY2hhciAqcGFnZSwgY2hhciAqKnN0YXJ0LCBvZmZfdCBvZmYsCisJCQkgIGludCBjb3VudCwgaW50ICplb2YsIHZvaWQgKmRhdGEpCit7CisJaW50IHJldDsKKworCXJldCA9IHNwcmludGYocGFnZSArIG9mZiwgIiVkXG4iLCBqYmQyX2pvdXJuYWxfZW5hYmxlX2RlYnVnKTsKKwkqZW9mID0gMTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHdyaXRlX2piZF9kZWJ1ZyhzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKmJ1ZmZlciwKKwkJCSAgIHVuc2lnbmVkIGxvbmcgY291bnQsIHZvaWQgKmRhdGEpCit7CisJY2hhciBidWZbMzJdOworCisJaWYgKGNvdW50ID4gQVJSQVlfU0laRShidWYpIC0gMSkKKwkJY291bnQgPSBBUlJBWV9TSVpFKGJ1ZikgLSAxOworCWlmIChjb3B5X2Zyb21fdXNlcihidWYsIGJ1ZmZlciwgY291bnQpKQorCQlyZXR1cm4gLUVGQVVMVDsKKwlidWZbQVJSQVlfU0laRShidWYpIC0gMV0gPSAnXDAnOworCWpiZDJfam91cm5hbF9lbmFibGVfZGVidWcgPSBzaW1wbGVfc3RydG91bChidWYsIE5VTEwsIDEwKTsKKwlyZXR1cm4gY291bnQ7Cit9CisKKyNkZWZpbmUgSkJEX1BST0NfTkFNRSAic3lzL2ZzL2piZDItZGVidWciCisKK3N0YXRpYyB2b2lkIF9faW5pdCBjcmVhdGVfamJkX3Byb2NfZW50cnkodm9pZCkKK3sKKwlwcm9jX2piZF9kZWJ1ZyA9IGNyZWF0ZV9wcm9jX2VudHJ5KEpCRF9QUk9DX05BTUUsIDA2NDQsIE5VTEwpOworCWlmIChwcm9jX2piZF9kZWJ1ZykgeworCQkvKiBXaHkgaXMgdGhpcyBzbyBoYXJkPyAqLworCQlwcm9jX2piZF9kZWJ1Zy0+cmVhZF9wcm9jID0gcmVhZF9qYmRfZGVidWc7CisJCXByb2NfamJkX2RlYnVnLT53cml0ZV9wcm9jID0gd3JpdGVfamJkX2RlYnVnOworCX0KK30KKworc3RhdGljIHZvaWQgX19leGl0IGpiZDJfcmVtb3ZlX2piZF9wcm9jX2VudHJ5KHZvaWQpCit7CisJaWYgKHByb2NfamJkX2RlYnVnKQorCQlyZW1vdmVfcHJvY19lbnRyeShKQkRfUFJPQ19OQU1FLCBOVUxMKTsKK30KKworI2Vsc2UKKworI2RlZmluZSBjcmVhdGVfamJkX3Byb2NfZW50cnkoKSBkbyB7fSB3aGlsZSAoMCkKKyNkZWZpbmUgamJkMl9yZW1vdmVfamJkX3Byb2NfZW50cnkoKSBkbyB7fSB3aGlsZSAoMCkKKworI2VuZGlmCisKK2ttZW1fY2FjaGVfdCAqamJkMl9oYW5kbGVfY2FjaGU7CisKK3N0YXRpYyBpbnQgX19pbml0IGpvdXJuYWxfaW5pdF9oYW5kbGVfY2FjaGUodm9pZCkKK3sKKwlqYmQyX2hhbmRsZV9jYWNoZSA9IGttZW1fY2FjaGVfY3JlYXRlKCJqYmQyX2pvdXJuYWxfaGFuZGxlIiwKKwkJCQlzaXplb2YoaGFuZGxlX3QpLAorCQkJCTAsCQkvKiBvZmZzZXQgKi8KKwkJCQkwLAkJLyogZmxhZ3MgKi8KKwkJCQlOVUxMLAkJLyogY3RvciAqLworCQkJCU5VTEwpOwkJLyogZHRvciAqLworCWlmIChqYmQyX2hhbmRsZV9jYWNoZSA9PSBOVUxMKSB7CisJCXByaW50ayhLRVJOX0VNRVJHICJKQkQ6IGZhaWxlZCB0byBjcmVhdGUgaGFuZGxlIGNhY2hlXG4iKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBqYmQyX2pvdXJuYWxfZGVzdHJveV9oYW5kbGVfY2FjaGUodm9pZCkKK3sKKwlpZiAoamJkMl9oYW5kbGVfY2FjaGUpCisJCWttZW1fY2FjaGVfZGVzdHJveShqYmQyX2hhbmRsZV9jYWNoZSk7Cit9CisKKy8qCisgKiBNb2R1bGUgc3RhcnR1cCBhbmQgc2h1dGRvd24KKyAqLworCitzdGF0aWMgaW50IF9faW5pdCBqb3VybmFsX2luaXRfY2FjaGVzKHZvaWQpCit7CisJaW50IHJldDsKKworCXJldCA9IGpiZDJfam91cm5hbF9pbml0X3Jldm9rZV9jYWNoZXMoKTsKKwlpZiAocmV0ID09IDApCisJCXJldCA9IGpvdXJuYWxfaW5pdF9qYmQyX2pvdXJuYWxfaGVhZF9jYWNoZSgpOworCWlmIChyZXQgPT0gMCkKKwkJcmV0ID0gam91cm5hbF9pbml0X2hhbmRsZV9jYWNoZSgpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIGpiZDJfam91cm5hbF9kZXN0cm95X2NhY2hlcyh2b2lkKQoreworCWpiZDJfam91cm5hbF9kZXN0cm95X3Jldm9rZV9jYWNoZXMoKTsKKwlqYmQyX2pvdXJuYWxfZGVzdHJveV9qYmQyX2pvdXJuYWxfaGVhZF9jYWNoZSgpOworCWpiZDJfam91cm5hbF9kZXN0cm95X2hhbmRsZV9jYWNoZSgpOworCWpiZDJfam91cm5hbF9kZXN0cm95X2piZF9zbGFicygpOworfQorCitzdGF0aWMgaW50IF9faW5pdCBqb3VybmFsX2luaXQodm9pZCkKK3sKKwlpbnQgcmV0OworCisJQlVJTERfQlVHX09OKHNpemVvZihzdHJ1Y3Qgam91cm5hbF9zdXBlcmJsb2NrX3MpICE9IDEwMjQpOworCisJcmV0ID0gam91cm5hbF9pbml0X2NhY2hlcygpOworCWlmIChyZXQgIT0gMCkKKwkJamJkMl9qb3VybmFsX2Rlc3Ryb3lfY2FjaGVzKCk7CisJY3JlYXRlX2piZF9wcm9jX2VudHJ5KCk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGpvdXJuYWxfZXhpdCh2b2lkKQoreworI2lmZGVmIENPTkZJR19KQkRfREVCVUcKKwlpbnQgbiA9IGF0b21pY19yZWFkKCZucl9qb3VybmFsX2hlYWRzKTsKKwlpZiAobikKKwkJcHJpbnRrKEtFUk5fRU1FUkcgIkpCRDogbGVha2VkICVkIGpvdXJuYWxfaGVhZHMhXG4iLCBuKTsKKyNlbmRpZgorCWpiZDJfcmVtb3ZlX2piZF9wcm9jX2VudHJ5KCk7CisJamJkMl9qb3VybmFsX2Rlc3Ryb3lfY2FjaGVzKCk7Cit9CisKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK21vZHVsZV9pbml0KGpvdXJuYWxfaW5pdCk7Cittb2R1bGVfZXhpdChqb3VybmFsX2V4aXQpOworCmRpZmYgLS1naXQgYS9mcy9qYmQyL3JlY292ZXJ5LmMgYi9mcy9qYmQyL3JlY292ZXJ5LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWYxMGFjYQotLS0gL2Rldi9udWxsCisrKyBiL2ZzL2piZDIvcmVjb3ZlcnkuYwpAQCAtMCwwICsxLDYwOSBAQAorLyoKKyAqIGxpbnV4L2ZzL3JlY292ZXJ5LmMKKyAqCisgKiBXcml0dGVuIGJ5IFN0ZXBoZW4gQy4gVHdlZWRpZSA8c2N0QHJlZGhhdC5jb20+LCAxOTk5CisgKgorICogQ29weXJpZ2h0IDE5OTktMjAwMCBSZWQgSGF0IFNvZnR3YXJlIC0tLSBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIExpbnV4IGtlcm5lbCBhbmQgaXMgbWFkZSBhdmFpbGFibGUgdW5kZXIKKyAqIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIHZlcnNpb24gMiwgb3IgYXQgeW91cgorICogb3B0aW9uLCBhbnkgbGF0ZXIgdmVyc2lvbiwgaW5jb3Jwb3JhdGVkIGhlcmVpbiBieSByZWZlcmVuY2UuCisgKgorICogSm91cm5hbCByZWNvdmVyeSByb3V0aW5lcyBmb3IgdGhlIGdlbmVyaWMgZmlsZXN5c3RlbSBqb3VybmFsaW5nIGNvZGU7CisgKiBwYXJ0IG9mIHRoZSBleHQyZnMgam91cm5hbGluZyBzeXN0ZW0uCisgKi8KKworI2lmbmRlZiBfX0tFUk5FTF9fCisjaW5jbHVkZSAiamZzX3VzZXIuaCIKKyNlbHNlCisjaW5jbHVkZSA8bGludXgvdGltZS5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvamJkMi5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2VuZGlmCisKKy8qCisgKiBNYWludGFpbiBpbmZvcm1hdGlvbiBhYm91dCB0aGUgcHJvZ3Jlc3Mgb2YgdGhlIHJlY292ZXJ5IGpvYiwgc28gdGhhdAorICogdGhlIGRpZmZlcmVudCBwYXNzZXMgY2FuIGNhcnJ5IGluZm9ybWF0aW9uIGJldHdlZW4gdGhlbS4KKyAqLworc3RydWN0IHJlY292ZXJ5X2luZm8KK3sKKwl0aWRfdAkJc3RhcnRfdHJhbnNhY3Rpb247CisJdGlkX3QJCWVuZF90cmFuc2FjdGlvbjsKKworCWludAkJbnJfcmVwbGF5czsKKwlpbnQJCW5yX3Jldm9rZXM7CisJaW50CQlucl9yZXZva2VfaGl0czsKK307CisKK2VudW0gcGFzc3R5cGUge1BBU1NfU0NBTiwgUEFTU19SRVZPS0UsIFBBU1NfUkVQTEFZfTsKK3N0YXRpYyBpbnQgZG9fb25lX3Bhc3Moam91cm5hbF90ICpqb3VybmFsLAorCQkJCXN0cnVjdCByZWNvdmVyeV9pbmZvICppbmZvLCBlbnVtIHBhc3N0eXBlIHBhc3MpOworc3RhdGljIGludCBzY2FuX3Jldm9rZV9yZWNvcmRzKGpvdXJuYWxfdCAqLCBzdHJ1Y3QgYnVmZmVyX2hlYWQgKiwKKwkJCQl0aWRfdCwgc3RydWN0IHJlY292ZXJ5X2luZm8gKik7CisKKyNpZmRlZiBfX0tFUk5FTF9fCisKKy8qIFJlbGVhc2UgcmVhZGFoZWFkIGJ1ZmZlcnMgYWZ0ZXIgdXNlICovCitzdGF0aWMgdm9pZCBqb3VybmFsX2JyZWxzZV9hcnJheShzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJbXSwgaW50IG4pCit7CisJd2hpbGUgKC0tbiA+PSAwKQorCQlicmVsc2UgKGJbbl0pOworfQorCisKKy8qCisgKiBXaGVuIHJlYWRpbmcgZnJvbSB0aGUgam91cm5hbCwgd2UgYXJlIGdvaW5nIHRocm91Z2ggdGhlIGJsb2NrIGRldmljZQorICogbGF5ZXIgZGlyZWN0bHkgYW5kIHNvIHRoZXJlIGlzIG5vIHJlYWRhaGVhZCBiZWluZyBkb25lIGZvciB1cy4gIFdlCisgKiBuZWVkIHRvIGltcGxlbWVudCBhbnkgcmVhZGFoZWFkIG91cnNlbHZlcyBpZiB3ZSB3YW50IGl0IHRvIGhhcHBlbiBhdAorICogYWxsLiAgUmVjb3ZlcnkgaXMgYmFzaWNhbGx5IG9uZSBsb25nIHNlcXVlbnRpYWwgcmVhZCwgc28gbWFrZSBzdXJlIHdlCisgKiBkbyB0aGUgSU8gaW4gcmVhc29uYWJseSBsYXJnZSBjaHVua3MuCisgKgorICogVGhpcyBpcyBub3Qgc28gY3JpdGljYWwgdGhhdCB3ZSBuZWVkIHRvIGJlIGVub3Jtb3VzbHkgY2xldmVyIGFib3V0CisgKiB0aGUgcmVhZGFoZWFkIHNpemUsIHRob3VnaC4gIDEyOEsgaXMgYSBwdXJlbHkgYXJiaXRyYXJ5LCBnb29kLWVub3VnaAorICogZml4ZWQgdmFsdWUuCisgKi8KKworI2RlZmluZSBNQVhCVUYgOAorc3RhdGljIGludCBkb19yZWFkYWhlYWQoam91cm5hbF90ICpqb3VybmFsLCB1bnNpZ25lZCBpbnQgc3RhcnQpCit7CisJaW50IGVycjsKKwl1bnNpZ25lZCBpbnQgbWF4LCBuYnVmcywgbmV4dDsKKwl1bnNpZ25lZCBsb25nIGxvbmcgYmxvY2tucjsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoOworCisJc3RydWN0IGJ1ZmZlcl9oZWFkICogYnVmc1tNQVhCVUZdOworCisJLyogRG8gdXAgdG8gMTI4SyBvZiByZWFkYWhlYWQgKi8KKwltYXggPSBzdGFydCArICgxMjggKiAxMDI0IC8gam91cm5hbC0+al9ibG9ja3NpemUpOworCWlmIChtYXggPiBqb3VybmFsLT5qX21heGxlbikKKwkJbWF4ID0gam91cm5hbC0+al9tYXhsZW47CisKKwkvKiBEbyB0aGUgcmVhZGFoZWFkIGl0c2VsZi4gIFdlJ2xsIHN1Ym1pdCBNQVhCVUYgYnVmZmVyX2hlYWRzIGF0CisJICogYSB0aW1lIHRvIHRoZSBibG9jayBkZXZpY2UgSU8gbGF5ZXIuICovCisKKwluYnVmcyA9IDA7CisKKwlmb3IgKG5leHQgPSBzdGFydDsgbmV4dCA8IG1heDsgbmV4dCsrKSB7CisJCWVyciA9IGpiZDJfam91cm5hbF9ibWFwKGpvdXJuYWwsIG5leHQsICZibG9ja25yKTsKKworCQlpZiAoZXJyKSB7CisJCQlwcmludGsgKEtFUk5fRVJSICJKQkQ6IGJhZCBibG9jayBhdCBvZmZzZXQgJXVcbiIsCisJCQkJbmV4dCk7CisJCQlnb3RvIGZhaWxlZDsKKwkJfQorCisJCWJoID0gX19nZXRibGsoam91cm5hbC0+al9kZXYsIGJsb2NrbnIsIGpvdXJuYWwtPmpfYmxvY2tzaXplKTsKKwkJaWYgKCFiaCkgeworCQkJZXJyID0gLUVOT01FTTsKKwkJCWdvdG8gZmFpbGVkOworCQl9CisKKwkJaWYgKCFidWZmZXJfdXB0b2RhdGUoYmgpICYmICFidWZmZXJfbG9ja2VkKGJoKSkgeworCQkJYnVmc1tuYnVmcysrXSA9IGJoOworCQkJaWYgKG5idWZzID09IE1BWEJVRikgeworCQkJCWxsX3J3X2Jsb2NrKFJFQUQsIG5idWZzLCBidWZzKTsKKwkJCQlqb3VybmFsX2JyZWxzZV9hcnJheShidWZzLCBuYnVmcyk7CisJCQkJbmJ1ZnMgPSAwOworCQkJfQorCQl9IGVsc2UKKwkJCWJyZWxzZShiaCk7CisJfQorCisJaWYgKG5idWZzKQorCQlsbF9yd19ibG9jayhSRUFELCBuYnVmcywgYnVmcyk7CisJZXJyID0gMDsKKworZmFpbGVkOgorCWlmIChuYnVmcykKKwkJam91cm5hbF9icmVsc2VfYXJyYXkoYnVmcywgbmJ1ZnMpOworCXJldHVybiBlcnI7Cit9CisKKyNlbmRpZiAvKiBfX0tFUk5FTF9fICovCisKKworLyoKKyAqIFJlYWQgYSBibG9jayBmcm9tIHRoZSBqb3VybmFsCisgKi8KKworc3RhdGljIGludCBqcmVhZChzdHJ1Y3QgYnVmZmVyX2hlYWQgKipiaHAsIGpvdXJuYWxfdCAqam91cm5hbCwKKwkJIHVuc2lnbmVkIGludCBvZmZzZXQpCit7CisJaW50IGVycjsKKwl1bnNpZ25lZCBsb25nIGxvbmcgYmxvY2tucjsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoOworCisJKmJocCA9IE5VTEw7CisKKwlpZiAob2Zmc2V0ID49IGpvdXJuYWwtPmpfbWF4bGVuKSB7CisJCXByaW50ayhLRVJOX0VSUiAiSkJEOiBjb3JydXB0ZWQgam91cm5hbCBzdXBlcmJsb2NrXG4iKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCisJZXJyID0gamJkMl9qb3VybmFsX2JtYXAoam91cm5hbCwgb2Zmc2V0LCAmYmxvY2tucik7CisKKwlpZiAoZXJyKSB7CisJCXByaW50ayAoS0VSTl9FUlIgIkpCRDogYmFkIGJsb2NrIGF0IG9mZnNldCAldVxuIiwKKwkJCW9mZnNldCk7CisJCXJldHVybiBlcnI7CisJfQorCisJYmggPSBfX2dldGJsayhqb3VybmFsLT5qX2RldiwgYmxvY2tuciwgam91cm5hbC0+al9ibG9ja3NpemUpOworCWlmICghYmgpCisJCXJldHVybiAtRU5PTUVNOworCisJaWYgKCFidWZmZXJfdXB0b2RhdGUoYmgpKSB7CisJCS8qIElmIHRoaXMgaXMgYSBicmFuZCBuZXcgYnVmZmVyLCBzdGFydCByZWFkYWhlYWQuCisgICAgICAgICAgICAgICAgICAgT3RoZXJ3aXNlLCB3ZSBhc3N1bWUgd2UgYXJlIGFscmVhZHkgcmVhZGluZyBpdC4gICovCisJCWlmICghYnVmZmVyX3JlcShiaCkpCisJCQlkb19yZWFkYWhlYWQoam91cm5hbCwgb2Zmc2V0KTsKKwkJd2FpdF9vbl9idWZmZXIoYmgpOworCX0KKworCWlmICghYnVmZmVyX3VwdG9kYXRlKGJoKSkgeworCQlwcmludGsgKEtFUk5fRVJSICJKQkQ6IEZhaWxlZCB0byByZWFkIGJsb2NrIGF0IG9mZnNldCAldVxuIiwKKwkJCW9mZnNldCk7CisJCWJyZWxzZShiaCk7CisJCXJldHVybiAtRUlPOworCX0KKworCSpiaHAgPSBiaDsKKwlyZXR1cm4gMDsKK30KKworCisvKgorICogQ291bnQgdGhlIG51bWJlciBvZiBpbi11c2UgdGFncyBpbiBhIGpvdXJuYWwgZGVzY3JpcHRvciBibG9jay4KKyAqLworCitzdGF0aWMgaW50IGNvdW50X3RhZ3Moam91cm5hbF90ICpqb3VybmFsLCBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoKQoreworCWNoYXIgKgkJCXRhZ3A7CisJam91cm5hbF9ibG9ja190YWdfdCAqCXRhZzsKKwlpbnQJCQluciA9IDAsIHNpemUgPSBqb3VybmFsLT5qX2Jsb2Nrc2l6ZTsKKwlpbnQJCQl0YWdfYnl0ZXMgPSBqb3VybmFsX3RhZ19ieXRlcyhqb3VybmFsKTsKKworCXRhZ3AgPSAmYmgtPmJfZGF0YVtzaXplb2Yoam91cm5hbF9oZWFkZXJfdCldOworCisJd2hpbGUgKCh0YWdwIC0gYmgtPmJfZGF0YSArIHRhZ19ieXRlcykgPD0gc2l6ZSkgeworCQl0YWcgPSAoam91cm5hbF9ibG9ja190YWdfdCAqKSB0YWdwOworCisJCW5yKys7CisJCXRhZ3AgKz0gdGFnX2J5dGVzOworCQlpZiAoISh0YWctPnRfZmxhZ3MgJiBjcHVfdG9fYmUzMihKQkQyX0ZMQUdfU0FNRV9VVUlEKSkpCisJCQl0YWdwICs9IDE2OworCisJCWlmICh0YWctPnRfZmxhZ3MgJiBjcHVfdG9fYmUzMihKQkQyX0ZMQUdfTEFTVF9UQUcpKQorCQkJYnJlYWs7CisJfQorCisJcmV0dXJuIG5yOworfQorCisKKy8qIE1ha2Ugc3VyZSB3ZSB3cmFwIGFyb3VuZCB0aGUgbG9nIGNvcnJlY3RseSEgKi8KKyNkZWZpbmUgd3JhcChqb3VybmFsLCB2YXIpCQkJCQkJXAorZG8gewkJCQkJCQkJCVwKKwlpZiAodmFyID49IChqb3VybmFsKS0+al9sYXN0KQkJCQkJXAorCQl2YXIgLT0gKChqb3VybmFsKS0+al9sYXN0IC0gKGpvdXJuYWwpLT5qX2ZpcnN0KTsJXAorfSB3aGlsZSAoMCkKKworLyoqCisgKiBqYmQyX2pvdXJuYWxfcmVjb3ZlciAtIHJlY292ZXJzIGEgb24tZGlzayBqb3VybmFsCisgKiBAam91cm5hbDogdGhlIGpvdXJuYWwgdG8gcmVjb3ZlcgorICoKKyAqIFRoZSBwcmltYXJ5IGZ1bmN0aW9uIGZvciByZWNvdmVyaW5nIHRoZSBsb2cgY29udGVudHMgd2hlbiBtb3VudGluZyBhCisgKiBqb3VybmFsZWQgZGV2aWNlLgorICoKKyAqIFJlY292ZXJ5IGlzIGRvbmUgaW4gdGhyZWUgcGFzc2VzLiAgSW4gdGhlIGZpcnN0IHBhc3MsIHdlIGxvb2sgZm9yIHRoZQorICogZW5kIG9mIHRoZSBsb2cuICBJbiB0aGUgc2Vjb25kLCB3ZSBhc3NlbWJsZSB0aGUgbGlzdCBvZiByZXZva2UKKyAqIGJsb2Nrcy4gIEluIHRoZSB0aGlyZCBhbmQgZmluYWwgcGFzcywgd2UgcmVwbGF5IGFueSB1bi1yZXZva2VkIGJsb2NrcworICogaW4gdGhlIGxvZy4KKyAqLworaW50IGpiZDJfam91cm5hbF9yZWNvdmVyKGpvdXJuYWxfdCAqam91cm5hbCkKK3sKKwlpbnQJCQllcnI7CisJam91cm5hbF9zdXBlcmJsb2NrX3QgKglzYjsKKworCXN0cnVjdCByZWNvdmVyeV9pbmZvCWluZm87CisKKwltZW1zZXQoJmluZm8sIDAsIHNpemVvZihpbmZvKSk7CisJc2IgPSBqb3VybmFsLT5qX3N1cGVyYmxvY2s7CisKKwkvKgorCSAqIFRoZSBqb3VybmFsIHN1cGVyYmxvY2sncyBzX3N0YXJ0IGZpZWxkICh0aGUgY3VycmVudCBsb2cgaGVhZCkKKwkgKiBpcyBhbHdheXMgemVybyBpZiwgYW5kIG9ubHkgaWYsIHRoZSBqb3VybmFsIHdhcyBjbGVhbmx5CisJICogdW5tb3VudGVkLgorCSAqLworCisJaWYgKCFzYi0+c19zdGFydCkgeworCQlqYmRfZGVidWcoMSwgIk5vIHJlY292ZXJ5IHJlcXVpcmVkLCBsYXN0IHRyYW5zYWN0aW9uICVkXG4iLAorCQkJICBiZTMyX3RvX2NwdShzYi0+c19zZXF1ZW5jZSkpOworCQlqb3VybmFsLT5qX3RyYW5zYWN0aW9uX3NlcXVlbmNlID0gYmUzMl90b19jcHUoc2ItPnNfc2VxdWVuY2UpICsgMTsKKwkJcmV0dXJuIDA7CisJfQorCisJZXJyID0gZG9fb25lX3Bhc3Moam91cm5hbCwgJmluZm8sIFBBU1NfU0NBTik7CisJaWYgKCFlcnIpCisJCWVyciA9IGRvX29uZV9wYXNzKGpvdXJuYWwsICZpbmZvLCBQQVNTX1JFVk9LRSk7CisJaWYgKCFlcnIpCisJCWVyciA9IGRvX29uZV9wYXNzKGpvdXJuYWwsICZpbmZvLCBQQVNTX1JFUExBWSk7CisKKwlqYmRfZGVidWcoMCwgIkpCRDogcmVjb3ZlcnksIGV4aXQgc3RhdHVzICVkLCAiCisJCSAgInJlY292ZXJlZCB0cmFuc2FjdGlvbnMgJXUgdG8gJXVcbiIsCisJCSAgZXJyLCBpbmZvLnN0YXJ0X3RyYW5zYWN0aW9uLCBpbmZvLmVuZF90cmFuc2FjdGlvbik7CisJamJkX2RlYnVnKDAsICJKQkQ6IFJlcGxheWVkICVkIGFuZCByZXZva2VkICVkLyVkIGJsb2Nrc1xuIiwKKwkJICBpbmZvLm5yX3JlcGxheXMsIGluZm8ubnJfcmV2b2tlX2hpdHMsIGluZm8ubnJfcmV2b2tlcyk7CisKKwkvKiBSZXN0YXJ0IHRoZSBsb2cgYXQgdGhlIG5leHQgdHJhbnNhY3Rpb24gSUQsIHRodXMgaW52YWxpZGF0aW5nCisJICogYW55IGV4aXN0aW5nIGNvbW1pdCByZWNvcmRzIGluIHRoZSBsb2cuICovCisJam91cm5hbC0+al90cmFuc2FjdGlvbl9zZXF1ZW5jZSA9ICsraW5mby5lbmRfdHJhbnNhY3Rpb247CisKKwlqYmQyX2pvdXJuYWxfY2xlYXJfcmV2b2tlKGpvdXJuYWwpOworCXN5bmNfYmxvY2tkZXYoam91cm5hbC0+al9mc19kZXYpOworCXJldHVybiBlcnI7Cit9CisKKy8qKgorICogamJkMl9qb3VybmFsX3NraXBfcmVjb3ZlcnkgLSBTdGFydCBqb3VybmFsIGFuZCB3aXBlIGV4aXRpbmcgcmVjb3JkcworICogQGpvdXJuYWw6IGpvdXJuYWwgdG8gc3RhcnR1cAorICoKKyAqIExvY2F0ZSBhbnkgdmFsaWQgcmVjb3ZlcnkgaW5mb3JtYXRpb24gZnJvbSB0aGUgam91cm5hbCBhbmQgc2V0IHVwIHRoZQorICogam91cm5hbCBzdHJ1Y3R1cmVzIGluIG1lbW9yeSB0byBpZ25vcmUgaXQgKHByZXN1bWFibHkgYmVjYXVzZSB0aGUKKyAqIGNhbGxlciBoYXMgZXZpZGVuY2UgdGhhdCBpdCBpcyBvdXQgb2YgZGF0ZSkuCisgKiBUaGlzIGZ1bmN0aW9uIGRvZXMnbnQgYXBwZWFyIHRvIGJlIGV4b3J0ZWQuLgorICoKKyAqIFdlIHBlcmZvcm0gb25lIHBhc3Mgb3ZlciB0aGUgam91cm5hbCB0byBhbGxvdyB1cyB0byB0ZWxsIHRoZSB1c2VyIGhvdworICogbXVjaCByZWNvdmVyeSBpbmZvcm1hdGlvbiBpcyBiZWluZyBlcmFzZWQsIGFuZCB0byBsZXQgdXMgaW5pdGlhbGlzZQorICogdGhlIGpvdXJuYWwgdHJhbnNhY3Rpb24gc2VxdWVuY2UgbnVtYmVycyB0byB0aGUgbmV4dCB1bnVzZWQgSUQuCisgKi8KK2ludCBqYmQyX2pvdXJuYWxfc2tpcF9yZWNvdmVyeShqb3VybmFsX3QgKmpvdXJuYWwpCit7CisJaW50CQkJZXJyOworCWpvdXJuYWxfc3VwZXJibG9ja190ICoJc2I7CisKKwlzdHJ1Y3QgcmVjb3ZlcnlfaW5mbwlpbmZvOworCisJbWVtc2V0ICgmaW5mbywgMCwgc2l6ZW9mKGluZm8pKTsKKwlzYiA9IGpvdXJuYWwtPmpfc3VwZXJibG9jazsKKworCWVyciA9IGRvX29uZV9wYXNzKGpvdXJuYWwsICZpbmZvLCBQQVNTX1NDQU4pOworCisJaWYgKGVycikgeworCQlwcmludGsoS0VSTl9FUlIgIkpCRDogZXJyb3IgJWQgc2Nhbm5pbmcgam91cm5hbFxuIiwgZXJyKTsKKwkJKytqb3VybmFsLT5qX3RyYW5zYWN0aW9uX3NlcXVlbmNlOworCX0gZWxzZSB7CisjaWZkZWYgQ09ORklHX0pCRF9ERUJVRworCQlpbnQgZHJvcHBlZCA9IGluZm8uZW5kX3RyYW5zYWN0aW9uIC0gYmUzMl90b19jcHUoc2ItPnNfc2VxdWVuY2UpOworI2VuZGlmCisJCWpiZF9kZWJ1ZygwLAorCQkJICAiSkJEOiBpZ25vcmluZyAlZCB0cmFuc2FjdGlvbiVzIGZyb20gdGhlIGpvdXJuYWwuXG4iLAorCQkJICBkcm9wcGVkLCAoZHJvcHBlZCA9PSAxKSA/ICIiIDogInMiKTsKKwkJam91cm5hbC0+al90cmFuc2FjdGlvbl9zZXF1ZW5jZSA9ICsraW5mby5lbmRfdHJhbnNhY3Rpb247CisJfQorCisJam91cm5hbC0+al90YWlsID0gMDsKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgbG9uZyByZWFkX3RhZ19ibG9jayhpbnQgdGFnX2J5dGVzLCBqb3VybmFsX2Jsb2NrX3RhZ190ICp0YWcpCit7CisJdW5zaWduZWQgbG9uZyBsb25nIGJsb2NrID0gYmUzMl90b19jcHUodGFnLT50X2Jsb2NrbnIpOworCWlmICh0YWdfYnl0ZXMgPiBKQkRfVEFHX1NJWkUzMikKKwkJYmxvY2sgfD0gKHU2NCliZTMyX3RvX2NwdSh0YWctPnRfYmxvY2tucl9oaWdoKSA8PCAzMjsKKwlyZXR1cm4gYmxvY2s7Cit9CisKK3N0YXRpYyBpbnQgZG9fb25lX3Bhc3Moam91cm5hbF90ICpqb3VybmFsLAorCQkJc3RydWN0IHJlY292ZXJ5X2luZm8gKmluZm8sIGVudW0gcGFzc3R5cGUgcGFzcykKK3sKKwl1bnNpZ25lZCBpbnQJCWZpcnN0X2NvbW1pdF9JRCwgbmV4dF9jb21taXRfSUQ7CisJdW5zaWduZWQgbG9uZwkJbmV4dF9sb2dfYmxvY2s7CisJaW50CQkJZXJyLCBzdWNjZXNzID0gMDsKKwlqb3VybmFsX3N1cGVyYmxvY2tfdCAqCXNiOworCWpvdXJuYWxfaGVhZGVyX3QgKgl0bXA7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICoJYmg7CisJdW5zaWduZWQgaW50CQlzZXF1ZW5jZTsKKwlpbnQJCQlibG9ja3R5cGU7CisJaW50CQkJdGFnX2J5dGVzID0gam91cm5hbF90YWdfYnl0ZXMoam91cm5hbCk7CisKKwkvKiBQcmVjb21wdXRlIHRoZSBtYXhpbXVtIG1ldGFkYXRhIGRlc2NyaXB0b3JzIGluIGEgZGVzY3JpcHRvciBibG9jayAqLworCWludAkJCU1BWF9CTE9DS1NfUEVSX0RFU0M7CisJTUFYX0JMT0NLU19QRVJfREVTQyA9ICgoam91cm5hbC0+al9ibG9ja3NpemUtc2l6ZW9mKGpvdXJuYWxfaGVhZGVyX3QpKQorCQkJICAgICAgIC8gdGFnX2J5dGVzKTsKKworCS8qCisJICogRmlyc3QgdGhpbmcgaXMgdG8gZXN0YWJsaXNoIHdoYXQgd2UgZXhwZWN0IHRvIGZpbmQgaW4gdGhlIGxvZworCSAqIChpbiB0ZXJtcyBvZiB0cmFuc2FjdGlvbiBJRHMpLCBhbmQgd2hlcmUgKGluIHRlcm1zIG9mIGxvZworCSAqIGJsb2NrIG9mZnNldHMpOiBxdWVyeSB0aGUgc3VwZXJibG9jay4KKwkgKi8KKworCXNiID0gam91cm5hbC0+al9zdXBlcmJsb2NrOworCW5leHRfY29tbWl0X0lEID0gYmUzMl90b19jcHUoc2ItPnNfc2VxdWVuY2UpOworCW5leHRfbG9nX2Jsb2NrID0gYmUzMl90b19jcHUoc2ItPnNfc3RhcnQpOworCisJZmlyc3RfY29tbWl0X0lEID0gbmV4dF9jb21taXRfSUQ7CisJaWYgKHBhc3MgPT0gUEFTU19TQ0FOKQorCQlpbmZvLT5zdGFydF90cmFuc2FjdGlvbiA9IGZpcnN0X2NvbW1pdF9JRDsKKworCWpiZF9kZWJ1ZygxLCAiU3RhcnRpbmcgcmVjb3ZlcnkgcGFzcyAlZFxuIiwgcGFzcyk7CisKKwkvKgorCSAqIE5vdyB3ZSB3YWxrIHRocm91Z2ggdGhlIGxvZywgdHJhbnNhY3Rpb24gYnkgdHJhbnNhY3Rpb24sCisJICogbWFraW5nIHN1cmUgdGhhdCBlYWNoIHRyYW5zYWN0aW9uIGhhcyBhIGNvbW1pdCBibG9jayBpbiB0aGUKKwkgKiBleHBlY3RlZCBwbGFjZS4gIEVhY2ggY29tcGxldGUgdHJhbnNhY3Rpb24gZ2V0cyByZXBsYXllZCBiYWNrCisJICogaW50byB0aGUgbWFpbiBmaWxlc3lzdGVtLgorCSAqLworCisJd2hpbGUgKDEpIHsKKwkJaW50CQkJZmxhZ3M7CisJCWNoYXIgKgkJCXRhZ3A7CisJCWpvdXJuYWxfYmxvY2tfdGFnX3QgKgl0YWc7CisJCXN0cnVjdCBidWZmZXJfaGVhZCAqCW9iaDsKKwkJc3RydWN0IGJ1ZmZlcl9oZWFkICoJbmJoOworCisJCWNvbmRfcmVzY2hlZCgpOwkJLyogV2UncmUgdW5kZXIgbG9ja19rZXJuZWwoKSAqLworCisJCS8qIElmIHdlIGFscmVhZHkga25vdyB3aGVyZSB0byBzdG9wIHRoZSBsb2cgdHJhdmVyc2FsLAorCQkgKiBjaGVjayByaWdodCBub3cgdGhhdCB3ZSBoYXZlbid0IGdvbmUgcGFzdCB0aGUgZW5kIG9mCisJCSAqIHRoZSBsb2cuICovCisKKwkJaWYgKHBhc3MgIT0gUEFTU19TQ0FOKQorCQkJaWYgKHRpZF9nZXEobmV4dF9jb21taXRfSUQsIGluZm8tPmVuZF90cmFuc2FjdGlvbikpCisJCQkJYnJlYWs7CisKKwkJamJkX2RlYnVnKDIsICJTY2FubmluZyBmb3Igc2VxdWVuY2UgSUQgJXUgYXQgJWx1LyVsdVxuIiwKKwkJCSAgbmV4dF9jb21taXRfSUQsIG5leHRfbG9nX2Jsb2NrLCBqb3VybmFsLT5qX2xhc3QpOworCisJCS8qIFNraXAgb3ZlciBlYWNoIGNodW5rIG9mIHRoZSB0cmFuc2FjdGlvbiBsb29raW5nCisJCSAqIGVpdGhlciB0aGUgbmV4dCBkZXNjcmlwdG9yIGJsb2NrIG9yIHRoZSBmaW5hbCBjb21taXQKKwkJICogcmVjb3JkLiAqLworCisJCWpiZF9kZWJ1ZygzLCAiSkJEOiBjaGVja2luZyBibG9jayAlbGRcbiIsIG5leHRfbG9nX2Jsb2NrKTsKKwkJZXJyID0ganJlYWQoJmJoLCBqb3VybmFsLCBuZXh0X2xvZ19ibG9jayk7CisJCWlmIChlcnIpCisJCQlnb3RvIGZhaWxlZDsKKworCQluZXh0X2xvZ19ibG9jaysrOworCQl3cmFwKGpvdXJuYWwsIG5leHRfbG9nX2Jsb2NrKTsKKworCQkvKiBXaGF0IGtpbmQgb2YgYnVmZmVyIGlzIGl0PworCQkgKgorCQkgKiBJZiBpdCBpcyBhIGRlc2NyaXB0b3IgYmxvY2ssIGNoZWNrIHRoYXQgaXQgaGFzIHRoZQorCQkgKiBleHBlY3RlZCBzZXF1ZW5jZSBudW1iZXIuICBPdGhlcndpc2UsIHdlJ3JlIGFsbCBkb25lCisJCSAqIGhlcmUuICovCisKKwkJdG1wID0gKGpvdXJuYWxfaGVhZGVyX3QgKiliaC0+Yl9kYXRhOworCisJCWlmICh0bXAtPmhfbWFnaWMgIT0gY3B1X3RvX2JlMzIoSkJEMl9NQUdJQ19OVU1CRVIpKSB7CisJCQlicmVsc2UoYmgpOworCQkJYnJlYWs7CisJCX0KKworCQlibG9ja3R5cGUgPSBiZTMyX3RvX2NwdSh0bXAtPmhfYmxvY2t0eXBlKTsKKwkJc2VxdWVuY2UgPSBiZTMyX3RvX2NwdSh0bXAtPmhfc2VxdWVuY2UpOworCQlqYmRfZGVidWcoMywgIkZvdW5kIG1hZ2ljICVkLCBzZXF1ZW5jZSAlZFxuIiwKKwkJCSAgYmxvY2t0eXBlLCBzZXF1ZW5jZSk7CisKKwkJaWYgKHNlcXVlbmNlICE9IG5leHRfY29tbWl0X0lEKSB7CisJCQlicmVsc2UoYmgpOworCQkJYnJlYWs7CisJCX0KKworCQkvKiBPSywgd2UgaGF2ZSBhIHZhbGlkIGRlc2NyaXB0b3IgYmxvY2sgd2hpY2ggbWF0Y2hlcworCQkgKiBhbGwgb2YgdGhlIHNlcXVlbmNlIG51bWJlciBjaGVja3MuICBXaGF0IGFyZSB3ZSBnb2luZworCQkgKiB0byBkbyB3aXRoIGl0PyAgVGhhdCBkZXBlbmRzIG9uIHRoZSBwYXNzLi4uICovCisKKwkJc3dpdGNoKGJsb2NrdHlwZSkgeworCQljYXNlIEpCRDJfREVTQ1JJUFRPUl9CTE9DSzoKKwkJCS8qIElmIGl0IGlzIGEgdmFsaWQgZGVzY3JpcHRvciBibG9jaywgcmVwbGF5IGl0CisJCQkgKiBpbiBwYXNzIFJFUExBWTsgb3RoZXJ3aXNlLCBqdXN0IHNraXAgb3ZlciB0aGUKKwkJCSAqIGJsb2NrcyBpdCBkZXNjcmliZXMuICovCisJCQlpZiAocGFzcyAhPSBQQVNTX1JFUExBWSkgeworCQkJCW5leHRfbG9nX2Jsb2NrICs9IGNvdW50X3RhZ3Moam91cm5hbCwgYmgpOworCQkJCXdyYXAoam91cm5hbCwgbmV4dF9sb2dfYmxvY2spOworCQkJCWJyZWxzZShiaCk7CisJCQkJY29udGludWU7CisJCQl9CisKKwkJCS8qIEEgZGVzY3JpcHRvciBibG9jazogd2UgY2FuIG5vdyB3cml0ZSBhbGwgb2YKKwkJCSAqIHRoZSBkYXRhIGJsb2Nrcy4gIFlheSwgdXNlZnVsIHdvcmsgaXMgZmluYWxseQorCQkJICogZ2V0dGluZyBkb25lIGhlcmUhICovCisKKwkJCXRhZ3AgPSAmYmgtPmJfZGF0YVtzaXplb2Yoam91cm5hbF9oZWFkZXJfdCldOworCQkJd2hpbGUgKCh0YWdwIC0gYmgtPmJfZGF0YSArIHRhZ19ieXRlcykKKwkJCSAgICAgICA8PSBqb3VybmFsLT5qX2Jsb2Nrc2l6ZSkgeworCQkJCXVuc2lnbmVkIGxvbmcgaW9fYmxvY2s7CisKKwkJCQl0YWcgPSAoam91cm5hbF9ibG9ja190YWdfdCAqKSB0YWdwOworCQkJCWZsYWdzID0gYmUzMl90b19jcHUodGFnLT50X2ZsYWdzKTsKKworCQkJCWlvX2Jsb2NrID0gbmV4dF9sb2dfYmxvY2srKzsKKwkJCQl3cmFwKGpvdXJuYWwsIG5leHRfbG9nX2Jsb2NrKTsKKwkJCQllcnIgPSBqcmVhZCgmb2JoLCBqb3VybmFsLCBpb19ibG9jayk7CisJCQkJaWYgKGVycikgeworCQkJCQkvKiBSZWNvdmVyIHdoYXQgd2UgY2FuLCBidXQKKwkJCQkJICogcmVwb3J0IGZhaWx1cmUgYXQgdGhlIGVuZC4gKi8KKwkJCQkJc3VjY2VzcyA9IGVycjsKKwkJCQkJcHJpbnRrIChLRVJOX0VSUgorCQkJCQkJIkpCRDogSU8gZXJyb3IgJWQgcmVjb3ZlcmluZyAiCisJCQkJCQkiYmxvY2sgJWxkIGluIGxvZ1xuIiwKKwkJCQkJCWVyciwgaW9fYmxvY2spOworCQkJCX0gZWxzZSB7CisJCQkJCXVuc2lnbmVkIGxvbmcgbG9uZyBibG9ja25yOworCisJCQkJCUpfQVNTRVJUKG9iaCAhPSBOVUxMKTsKKwkJCQkJYmxvY2tuciA9IHJlYWRfdGFnX2Jsb2NrKHRhZ19ieXRlcywKKwkJCQkJCQkJIHRhZyk7CisKKwkJCQkJLyogSWYgdGhlIGJsb2NrIGhhcyBiZWVuCisJCQkJCSAqIHJldm9rZWQsIHRoZW4gd2UncmUgYWxsIGRvbmUKKwkJCQkJICogaGVyZS4gKi8KKwkJCQkJaWYgKGpiZDJfam91cm5hbF90ZXN0X3Jldm9rZQorCQkJCQkgICAgKGpvdXJuYWwsIGJsb2NrbnIsCisJCQkJCSAgICAgbmV4dF9jb21taXRfSUQpKSB7CisJCQkJCQlicmVsc2Uob2JoKTsKKwkJCQkJCSsraW5mby0+bnJfcmV2b2tlX2hpdHM7CisJCQkJCQlnb3RvIHNraXBfd3JpdGU7CisJCQkJCX0KKworCQkJCQkvKiBGaW5kIGEgYnVmZmVyIGZvciB0aGUgbmV3CisJCQkJCSAqIGRhdGEgYmVpbmcgcmVzdG9yZWQgKi8KKwkJCQkJbmJoID0gX19nZXRibGsoam91cm5hbC0+al9mc19kZXYsCisJCQkJCQkJYmxvY2tuciwKKwkJCQkJCQlqb3VybmFsLT5qX2Jsb2Nrc2l6ZSk7CisJCQkJCWlmIChuYmggPT0gTlVMTCkgeworCQkJCQkJcHJpbnRrKEtFUk5fRVJSCisJCQkJCQkgICAgICAgIkpCRDogT3V0IG9mIG1lbW9yeSAiCisJCQkJCQkgICAgICAgImR1cmluZyByZWNvdmVyeS5cbiIpOworCQkJCQkJZXJyID0gLUVOT01FTTsKKwkJCQkJCWJyZWxzZShiaCk7CisJCQkJCQlicmVsc2Uob2JoKTsKKwkJCQkJCWdvdG8gZmFpbGVkOworCQkJCQl9CisKKwkJCQkJbG9ja19idWZmZXIobmJoKTsKKwkJCQkJbWVtY3B5KG5iaC0+Yl9kYXRhLCBvYmgtPmJfZGF0YSwKKwkJCQkJCQlqb3VybmFsLT5qX2Jsb2Nrc2l6ZSk7CisJCQkJCWlmIChmbGFncyAmIEpCRDJfRkxBR19FU0NBUEUpIHsKKwkJCQkJCSooKF9fYmUzMiAqKWJoLT5iX2RhdGEpID0KKwkJCQkJCWNwdV90b19iZTMyKEpCRDJfTUFHSUNfTlVNQkVSKTsKKwkJCQkJfQorCisJCQkJCUJVRkZFUl9UUkFDRShuYmgsICJtYXJraW5nIGRpcnR5Iik7CisJCQkJCXNldF9idWZmZXJfdXB0b2RhdGUobmJoKTsKKwkJCQkJbWFya19idWZmZXJfZGlydHkobmJoKTsKKwkJCQkJQlVGRkVSX1RSQUNFKG5iaCwgIm1hcmtpbmcgdXB0b2RhdGUiKTsKKwkJCQkJKytpbmZvLT5ucl9yZXBsYXlzOworCQkJCQkvKiBsbF9yd19ibG9jayhXUklURSwgMSwgJm5iaCk7ICovCisJCQkJCXVubG9ja19idWZmZXIobmJoKTsKKwkJCQkJYnJlbHNlKG9iaCk7CisJCQkJCWJyZWxzZShuYmgpOworCQkJCX0KKworCQkJc2tpcF93cml0ZToKKwkJCQl0YWdwICs9IHRhZ19ieXRlczsKKwkJCQlpZiAoIShmbGFncyAmIEpCRDJfRkxBR19TQU1FX1VVSUQpKQorCQkJCQl0YWdwICs9IDE2OworCisJCQkJaWYgKGZsYWdzICYgSkJEMl9GTEFHX0xBU1RfVEFHKQorCQkJCQlicmVhazsKKwkJCX0KKworCQkJYnJlbHNlKGJoKTsKKwkJCWNvbnRpbnVlOworCisJCWNhc2UgSkJEMl9DT01NSVRfQkxPQ0s6CisJCQkvKiBGb3VuZCBhbiBleHBlY3RlZCBjb21taXQgYmxvY2s6IG5vdCBtdWNoIHRvCisJCQkgKiBkbyBvdGhlciB0aGFuIG1vdmUgb24gdG8gdGhlIG5leHQgc2VxdWVuY2UKKwkJCSAqIG51bWJlci4gKi8KKwkJCWJyZWxzZShiaCk7CisJCQluZXh0X2NvbW1pdF9JRCsrOworCQkJY29udGludWU7CisKKwkJY2FzZSBKQkQyX1JFVk9LRV9CTE9DSzoKKwkJCS8qIElmIHdlIGFyZW4ndCBpbiB0aGUgUkVWT0tFIHBhc3MsIHRoZW4gd2UgY2FuCisJCQkgKiBqdXN0IHNraXAgb3ZlciB0aGlzIGJsb2NrLiAqLworCQkJaWYgKHBhc3MgIT0gUEFTU19SRVZPS0UpIHsKKwkJCQlicmVsc2UoYmgpOworCQkJCWNvbnRpbnVlOworCQkJfQorCisJCQllcnIgPSBzY2FuX3Jldm9rZV9yZWNvcmRzKGpvdXJuYWwsIGJoLAorCQkJCQkJICBuZXh0X2NvbW1pdF9JRCwgaW5mbyk7CisJCQlicmVsc2UoYmgpOworCQkJaWYgKGVycikKKwkJCQlnb3RvIGZhaWxlZDsKKwkJCWNvbnRpbnVlOworCisJCWRlZmF1bHQ6CisJCQlqYmRfZGVidWcoMywgIlVucmVjb2duaXNlZCBtYWdpYyAlZCwgZW5kIG9mIHNjYW4uXG4iLAorCQkJCSAgYmxvY2t0eXBlKTsKKwkJCWJyZWxzZShiaCk7CisJCQlnb3RvIGRvbmU7CisJCX0KKwl9CisKKyBkb25lOgorCS8qCisJICogV2UgYnJva2Ugb3V0IG9mIHRoZSBsb2cgc2NhbiBsb29wOiBlaXRoZXIgd2UgY2FtZSB0byB0aGUKKwkgKiBrbm93biBlbmQgb2YgdGhlIGxvZyBvciB3ZSBmb3VuZCBhbiB1bmV4cGVjdGVkIGJsb2NrIGluIHRoZQorCSAqIGxvZy4gIElmIHRoZSBsYXR0ZXIgaGFwcGVuZWQsIHRoZW4gd2Uga25vdyB0aGF0IHRoZSAiY3VycmVudCIKKwkgKiB0cmFuc2FjdGlvbiBtYXJrcyB0aGUgZW5kIG9mIHRoZSB2YWxpZCBsb2cuCisJICovCisKKwlpZiAocGFzcyA9PSBQQVNTX1NDQU4pCisJCWluZm8tPmVuZF90cmFuc2FjdGlvbiA9IG5leHRfY29tbWl0X0lEOworCWVsc2UgeworCQkvKiBJdCdzIHJlYWxseSBiYWQgbmV3cyBpZiBkaWZmZXJlbnQgcGFzc2VzIGVuZCB1cCBhdAorCQkgKiBkaWZmZXJlbnQgcGxhY2VzIChidXQgcG9zc2libGUgZHVlIHRvIElPIGVycm9ycykuICovCisJCWlmIChpbmZvLT5lbmRfdHJhbnNhY3Rpb24gIT0gbmV4dF9jb21taXRfSUQpIHsKKwkJCXByaW50ayAoS0VSTl9FUlIgIkpCRDogcmVjb3ZlcnkgcGFzcyAlZCBlbmRlZCBhdCAiCisJCQkJInRyYW5zYWN0aW9uICV1LCBleHBlY3RlZCAldVxuIiwKKwkJCQlwYXNzLCBuZXh0X2NvbW1pdF9JRCwgaW5mby0+ZW5kX3RyYW5zYWN0aW9uKTsKKwkJCWlmICghc3VjY2VzcykKKwkJCQlzdWNjZXNzID0gLUVJTzsKKwkJfQorCX0KKworCXJldHVybiBzdWNjZXNzOworCisgZmFpbGVkOgorCXJldHVybiBlcnI7Cit9CisKKworLyogU2NhbiBhIHJldm9rZSByZWNvcmQsIG1hcmtpbmcgYWxsIGJsb2NrcyBtZW50aW9uZWQgYXMgcmV2b2tlZC4gKi8KKworc3RhdGljIGludCBzY2FuX3Jldm9rZV9yZWNvcmRzKGpvdXJuYWxfdCAqam91cm5hbCwgc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCwKKwkJCSAgICAgICB0aWRfdCBzZXF1ZW5jZSwgc3RydWN0IHJlY292ZXJ5X2luZm8gKmluZm8pCit7CisJamJkMl9qb3VybmFsX3Jldm9rZV9oZWFkZXJfdCAqaGVhZGVyOworCWludCBvZmZzZXQsIG1heDsKKwlpbnQgcmVjb3JkX2xlbiA9IDQ7CisKKwloZWFkZXIgPSAoamJkMl9qb3VybmFsX3Jldm9rZV9oZWFkZXJfdCAqKSBiaC0+Yl9kYXRhOworCW9mZnNldCA9IHNpemVvZihqYmQyX2pvdXJuYWxfcmV2b2tlX2hlYWRlcl90KTsKKwltYXggPSBiZTMyX3RvX2NwdShoZWFkZXItPnJfY291bnQpOworCisJaWYgKEpCRDJfSEFTX0lOQ09NUEFUX0ZFQVRVUkUoam91cm5hbCwgSkJEMl9GRUFUVVJFX0lOQ09NUEFUXzY0QklUKSkKKwkJcmVjb3JkX2xlbiA9IDg7CisKKwl3aGlsZSAob2Zmc2V0ICsgcmVjb3JkX2xlbiA8PSBtYXgpIHsKKwkJdW5zaWduZWQgbG9uZyBsb25nIGJsb2NrbnI7CisJCWludCBlcnI7CisKKwkJaWYgKHJlY29yZF9sZW4gPT0gNCkKKwkJCWJsb2NrbnIgPSBiZTMyX3RvX2NwdSgqICgoX19iZTMyICopIChiaC0+Yl9kYXRhK29mZnNldCkpKTsKKwkJZWxzZQorCQkJYmxvY2tuciA9IGJlNjRfdG9fY3B1KCogKChfX2JlNjQgKikgKGJoLT5iX2RhdGErb2Zmc2V0KSkpOworCQlvZmZzZXQgKz0gcmVjb3JkX2xlbjsKKwkJZXJyID0gamJkMl9qb3VybmFsX3NldF9yZXZva2Uoam91cm5hbCwgYmxvY2tuciwgc2VxdWVuY2UpOworCQlpZiAoZXJyKQorCQkJcmV0dXJuIGVycjsKKwkJKytpbmZvLT5ucl9yZXZva2VzOworCX0KKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2ZzL2piZDIvcmV2b2tlLmMgYi9mcy9qYmQyL3Jldm9rZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM4MGQxOTkKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9qYmQyL3Jldm9rZS5jCkBAIC0wLDAgKzEsNzEyIEBACisvKgorICogbGludXgvZnMvcmV2b2tlLmMKKyAqCisgKiBXcml0dGVuIGJ5IFN0ZXBoZW4gQy4gVHdlZWRpZSA8c2N0QHJlZGhhdC5jb20+LCAyMDAwCisgKgorICogQ29weXJpZ2h0IDIwMDAgUmVkIEhhdCBjb3JwIC0tLSBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIExpbnV4IGtlcm5lbCBhbmQgaXMgbWFkZSBhdmFpbGFibGUgdW5kZXIKKyAqIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIHZlcnNpb24gMiwgb3IgYXQgeW91cgorICogb3B0aW9uLCBhbnkgbGF0ZXIgdmVyc2lvbiwgaW5jb3Jwb3JhdGVkIGhlcmVpbiBieSByZWZlcmVuY2UuCisgKgorICogSm91cm5hbCByZXZva2Ugcm91dGluZXMgZm9yIHRoZSBnZW5lcmljIGZpbGVzeXN0ZW0gam91cm5hbGluZyBjb2RlOworICogcGFydCBvZiB0aGUgZXh0MmZzIGpvdXJuYWxpbmcgc3lzdGVtLgorICoKKyAqIFJldm9rZSBpcyB0aGUgbWVjaGFuaXNtIHVzZWQgdG8gcHJldmVudCBvbGQgbG9nIHJlY29yZHMgZm9yIGRlbGV0ZWQKKyAqIG1ldGFkYXRhIGZyb20gYmVpbmcgcmVwbGF5ZWQgb24gdG9wIG9mIG5ld2VyIGRhdGEgdXNpbmcgdGhlIHNhbWUKKyAqIGJsb2Nrcy4gIFRoZSByZXZva2UgbWVjaGFuaXNtIGlzIHVzZWQgaW4gdHdvIHNlcGFyYXRlIHBsYWNlczoKKyAqCisgKiArIENvbW1pdDogZHVyaW5nIGNvbW1pdCB3ZSB3cml0ZSB0aGUgZW50aXJlIGxpc3Qgb2YgdGhlIGN1cnJlbnQKKyAqICAgdHJhbnNhY3Rpb24ncyByZXZva2VkIGJsb2NrcyB0byB0aGUgam91cm5hbAorICoKKyAqICsgUmVjb3Zlcnk6IGR1cmluZyByZWNvdmVyeSB3ZSByZWNvcmQgdGhlIHRyYW5zYWN0aW9uIElEIG9mIGFsbAorICogICByZXZva2VkIGJsb2Nrcy4gIElmIHRoZXJlIGFyZSBtdWx0aXBsZSByZXZva2UgcmVjb3JkcyBpbiB0aGUgbG9nCisgKiAgIGZvciBhIHNpbmdsZSBibG9jaywgb25seSB0aGUgbGFzdCBvbmUgY291bnRzLCBhbmQgaWYgdGhlcmUgaXMgYSBsb2cKKyAqICAgZW50cnkgZm9yIGEgYmxvY2sgYmV5b25kIHRoZSBsYXN0IHJldm9rZSwgdGhlbiB0aGF0IGxvZyBlbnRyeSBzdGlsbAorICogICBnZXRzIHJlcGxheWVkLgorICoKKyAqIFdlIGNhbiBnZXQgaW50ZXJhY3Rpb25zIGJldHdlZW4gcmV2b2tlcyBhbmQgbmV3IGxvZyBkYXRhIHdpdGhpbiBhCisgKiBzaW5nbGUgdHJhbnNhY3Rpb246CisgKgorICogQmxvY2sgaXMgcmV2b2tlZCBhbmQgdGhlbiBqb3VybmFsZWQ6CisgKiAgIFRoZSBkZXNpcmVkIGVuZCByZXN1bHQgaXMgdGhlIGpvdXJuYWxpbmcgb2YgdGhlIG5ldyBibG9jaywgc28gd2UKKyAqICAgY2FuY2VsIHRoZSByZXZva2UgYmVmb3JlIHRoZSB0cmFuc2FjdGlvbiBjb21taXRzLgorICoKKyAqIEJsb2NrIGlzIGpvdXJuYWxlZCBhbmQgdGhlbiByZXZva2VkOgorICogICBUaGUgcmV2b2tlIG11c3QgdGFrZSBwcmVjZWRlbmNlIG92ZXIgdGhlIHdyaXRlIG9mIHRoZSBibG9jaywgc28gd2UKKyAqICAgbmVlZCBlaXRoZXIgdG8gY2FuY2VsIHRoZSBqb3VybmFsIGVudHJ5IG9yIHRvIHdyaXRlIHRoZSByZXZva2UKKyAqICAgbGF0ZXIgaW4gdGhlIGxvZyB0aGFuIHRoZSBsb2cgYmxvY2suICBJbiB0aGlzIGNhc2UsIHdlIGNob29zZSB0aGUKKyAqICAgbGF0dGVyOiBqb3VybmFsaW5nIGEgYmxvY2sgY2FuY2VscyBhbnkgcmV2b2tlIHJlY29yZCBmb3IgdGhhdCBibG9jaworICogICBpbiB0aGUgY3VycmVudCB0cmFuc2FjdGlvbiwgc28gYW55IHJldm9rZSBmb3IgdGhhdCBibG9jayBpbiB0aGUKKyAqICAgdHJhbnNhY3Rpb24gbXVzdCBoYXZlIGhhcHBlbmVkIGFmdGVyIHRoZSBibG9jayB3YXMgam91cm5hbGVkIGFuZCBzbworICogICB0aGUgcmV2b2tlIG11c3QgdGFrZSBwcmVjZWRlbmNlLgorICoKKyAqIEJsb2NrIGlzIHJldm9rZWQgYW5kIHRoZW4gd3JpdHRlbiBhcyBkYXRhOgorICogICBUaGUgZGF0YSB3cml0ZSBpcyBhbGxvd2VkIHRvIHN1Y2NlZWQsIGJ1dCB0aGUgcmV2b2tlIGlzIF9ub3RfCisgKiAgIGNhbmNlbGxlZC4gIFdlIHN0aWxsIG5lZWQgdG8gcHJldmVudCBvbGQgbG9nIHJlY29yZHMgZnJvbQorICogICBvdmVyd3JpdGluZyB0aGUgbmV3IGRhdGEuICBXZSBkb24ndCBldmVuIG5lZWQgdG8gY2xlYXIgdGhlIHJldm9rZQorICogICBiaXQgaGVyZS4KKyAqCisgKiBSZXZva2UgaW5mb3JtYXRpb24gb24gYnVmZmVycyBpcyBhIHRyaS1zdGF0ZSB2YWx1ZToKKyAqCisgKiBSZXZva2VWYWxpZCBjbGVhcjoJbm8gY2FjaGVkIHJldm9rZSBzdGF0dXMsIG5lZWQgdG8gbG9vayBpdCB1cAorICogUmV2b2tlVmFsaWQgc2V0LCBSZXZva2VkIGNsZWFyOgorICoJCQlidWZmZXIgaGFzIG5vdCBiZWVuIHJldm9rZWQsIGFuZCBjYW5jZWxfcmV2b2tlCisgKgkJCW5lZWQgZG8gbm90aGluZy4KKyAqIFJldm9rZVZhbGlkIHNldCwgUmV2b2tlZCBzZXQ6CisgKgkJCWJ1ZmZlciBoYXMgYmVlbiByZXZva2VkLgorICovCisKKyNpZm5kZWYgX19LRVJORUxfXworI2luY2x1ZGUgImpmc191c2VyLmgiCisjZWxzZQorI2luY2x1ZGUgPGxpbnV4L3RpbWUuaD4KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L2piZDIuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CisjaW5jbHVkZSA8bGludXgvc21wX2xvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjZW5kaWYKKworc3RhdGljIGttZW1fY2FjaGVfdCAqamJkMl9yZXZva2VfcmVjb3JkX2NhY2hlOworc3RhdGljIGttZW1fY2FjaGVfdCAqamJkMl9yZXZva2VfdGFibGVfY2FjaGU7CisKKy8qIEVhY2ggcmV2b2tlIHJlY29yZCByZXByZXNlbnRzIG9uZSBzaW5nbGUgcmV2b2tlZCBibG9jay4gIER1cmluZworICAgam91cm5hbCByZXBsYXksIHRoaXMgaW52b2x2ZXMgcmVjb3JkaW5nIHRoZSB0cmFuc2FjdGlvbiBJRCBvZiB0aGUKKyAgIGxhc3QgdHJhbnNhY3Rpb24gdG8gcmV2b2tlIHRoaXMgYmxvY2suICovCisKK3N0cnVjdCBqYmQyX3Jldm9rZV9yZWNvcmRfcworeworCXN0cnVjdCBsaXN0X2hlYWQgIGhhc2g7CisJdGlkX3QJCSAgc2VxdWVuY2U7CS8qIFVzZWQgZm9yIHJlY292ZXJ5IG9ubHkgKi8KKwl1bnNpZ25lZCBsb25nIGxvbmcJICBibG9ja25yOworfTsKKworCisvKiBUaGUgcmV2b2tlIHRhYmxlIGlzIGp1c3QgYSBzaW1wbGUgaGFzaCB0YWJsZSBvZiByZXZva2UgcmVjb3Jkcy4gKi8KK3N0cnVjdCBqYmQyX3Jldm9rZV90YWJsZV9zCit7CisJLyogSXQgaXMgY29uY2VpdmFibGUgdGhhdCB3ZSBtaWdodCB3YW50IGEgbGFyZ2VyIGhhc2ggdGFibGUKKwkgKiBmb3IgcmVjb3ZlcnkuICBNdXN0IGJlIGEgcG93ZXIgb2YgdHdvLiAqLworCWludAkJICBoYXNoX3NpemU7CisJaW50CQkgIGhhc2hfc2hpZnQ7CisJc3RydWN0IGxpc3RfaGVhZCAqaGFzaF90YWJsZTsKK307CisKKworI2lmZGVmIF9fS0VSTkVMX18KK3N0YXRpYyB2b2lkIHdyaXRlX29uZV9yZXZva2VfcmVjb3JkKGpvdXJuYWxfdCAqLCB0cmFuc2FjdGlvbl90ICosCisJCQkJICAgIHN0cnVjdCBqb3VybmFsX2hlYWQgKiosIGludCAqLAorCQkJCSAgICBzdHJ1Y3QgamJkMl9yZXZva2VfcmVjb3JkX3MgKik7CitzdGF0aWMgdm9pZCBmbHVzaF9kZXNjcmlwdG9yKGpvdXJuYWxfdCAqLCBzdHJ1Y3Qgam91cm5hbF9oZWFkICosIGludCk7CisjZW5kaWYKKworLyogVXRpbGl0eSBmdW5jdGlvbnMgdG8gbWFpbnRhaW4gdGhlIHJldm9rZSB0YWJsZSAqLworCisvKiBCb3Jyb3dlZCBmcm9tIGJ1ZmZlci5jOiB0aGlzIGlzIGEgdHJpZWQgYW5kIHRlc3RlZCBibG9jayBoYXNoIGZ1bmN0aW9uICovCitzdGF0aWMgaW5saW5lIGludCBoYXNoKGpvdXJuYWxfdCAqam91cm5hbCwgdW5zaWduZWQgbG9uZyBsb25nIGJsb2NrKQoreworCXN0cnVjdCBqYmQyX3Jldm9rZV90YWJsZV9zICp0YWJsZSA9IGpvdXJuYWwtPmpfcmV2b2tlOworCWludCBoYXNoX3NoaWZ0ID0gdGFibGUtPmhhc2hfc2hpZnQ7CisJaW50IGhhc2ggPSAoaW50KWJsb2NrIF4gKGludCkoKGJsb2NrID4+IDMxKSA+PiAxKTsKKworCXJldHVybiAoKGhhc2ggPDwgKGhhc2hfc2hpZnQgLSA2KSkgXgorCQkoaGFzaCA+PiAxMykgXgorCQkoaGFzaCA8PCAoaGFzaF9zaGlmdCAtIDEyKSkpICYgKHRhYmxlLT5oYXNoX3NpemUgLSAxKTsKK30KKworc3RhdGljIGludCBpbnNlcnRfcmV2b2tlX2hhc2goam91cm5hbF90ICpqb3VybmFsLCB1bnNpZ25lZCBsb25nIGxvbmcgYmxvY2tuciwKKwkJCSAgICAgIHRpZF90IHNlcSkKK3sKKwlzdHJ1Y3QgbGlzdF9oZWFkICpoYXNoX2xpc3Q7CisJc3RydWN0IGpiZDJfcmV2b2tlX3JlY29yZF9zICpyZWNvcmQ7CisKK3JlcGVhdDoKKwlyZWNvcmQgPSBrbWVtX2NhY2hlX2FsbG9jKGpiZDJfcmV2b2tlX3JlY29yZF9jYWNoZSwgR0ZQX05PRlMpOworCWlmICghcmVjb3JkKQorCQlnb3RvIG9vbTsKKworCXJlY29yZC0+c2VxdWVuY2UgPSBzZXE7CisJcmVjb3JkLT5ibG9ja25yID0gYmxvY2tucjsKKwloYXNoX2xpc3QgPSAmam91cm5hbC0+al9yZXZva2UtPmhhc2hfdGFibGVbaGFzaChqb3VybmFsLCBibG9ja25yKV07CisJc3Bpbl9sb2NrKCZqb3VybmFsLT5qX3Jldm9rZV9sb2NrKTsKKwlsaXN0X2FkZCgmcmVjb3JkLT5oYXNoLCBoYXNoX2xpc3QpOworCXNwaW5fdW5sb2NrKCZqb3VybmFsLT5qX3Jldm9rZV9sb2NrKTsKKwlyZXR1cm4gMDsKKworb29tOgorCWlmICgham91cm5hbF9vb21fcmV0cnkpCisJCXJldHVybiAtRU5PTUVNOworCWpiZF9kZWJ1ZygxLCAiRU5PTUVNIGluICVzLCByZXRyeWluZ1xuIiwgX19GVU5DVElPTl9fKTsKKwl5aWVsZCgpOworCWdvdG8gcmVwZWF0OworfQorCisvKiBGaW5kIGEgcmV2b2tlIHJlY29yZCBpbiB0aGUgam91cm5hbCdzIGhhc2ggdGFibGUuICovCisKK3N0YXRpYyBzdHJ1Y3QgamJkMl9yZXZva2VfcmVjb3JkX3MgKmZpbmRfcmV2b2tlX3JlY29yZChqb3VybmFsX3QgKmpvdXJuYWwsCisJCQkJCQkgICAgICB1bnNpZ25lZCBsb25nIGxvbmcgYmxvY2tucikKK3sKKwlzdHJ1Y3QgbGlzdF9oZWFkICpoYXNoX2xpc3Q7CisJc3RydWN0IGpiZDJfcmV2b2tlX3JlY29yZF9zICpyZWNvcmQ7CisKKwloYXNoX2xpc3QgPSAmam91cm5hbC0+al9yZXZva2UtPmhhc2hfdGFibGVbaGFzaChqb3VybmFsLCBibG9ja25yKV07CisKKwlzcGluX2xvY2soJmpvdXJuYWwtPmpfcmV2b2tlX2xvY2spOworCXJlY29yZCA9IChzdHJ1Y3QgamJkMl9yZXZva2VfcmVjb3JkX3MgKikgaGFzaF9saXN0LT5uZXh0OworCXdoaWxlICgmKHJlY29yZC0+aGFzaCkgIT0gaGFzaF9saXN0KSB7CisJCWlmIChyZWNvcmQtPmJsb2NrbnIgPT0gYmxvY2tucikgeworCQkJc3Bpbl91bmxvY2soJmpvdXJuYWwtPmpfcmV2b2tlX2xvY2spOworCQkJcmV0dXJuIHJlY29yZDsKKwkJfQorCQlyZWNvcmQgPSAoc3RydWN0IGpiZDJfcmV2b2tlX3JlY29yZF9zICopIHJlY29yZC0+aGFzaC5uZXh0OworCX0KKwlzcGluX3VubG9jaygmam91cm5hbC0+al9yZXZva2VfbG9jayk7CisJcmV0dXJuIE5VTEw7Cit9CisKK2ludCBfX2luaXQgamJkMl9qb3VybmFsX2luaXRfcmV2b2tlX2NhY2hlcyh2b2lkKQoreworCWpiZDJfcmV2b2tlX3JlY29yZF9jYWNoZSA9IGttZW1fY2FjaGVfY3JlYXRlKCJqYmQyX3Jldm9rZV9yZWNvcmQiLAorCQkJCQkgICBzaXplb2Yoc3RydWN0IGpiZDJfcmV2b2tlX3JlY29yZF9zKSwKKwkJCQkJICAgMCwgU0xBQl9IV0NBQ0hFX0FMSUdOLCBOVUxMLCBOVUxMKTsKKwlpZiAoamJkMl9yZXZva2VfcmVjb3JkX2NhY2hlID09IDApCisJCXJldHVybiAtRU5PTUVNOworCisJamJkMl9yZXZva2VfdGFibGVfY2FjaGUgPSBrbWVtX2NhY2hlX2NyZWF0ZSgiamJkMl9yZXZva2VfdGFibGUiLAorCQkJCQkgICBzaXplb2Yoc3RydWN0IGpiZDJfcmV2b2tlX3RhYmxlX3MpLAorCQkJCQkgICAwLCAwLCBOVUxMLCBOVUxMKTsKKwlpZiAoamJkMl9yZXZva2VfdGFibGVfY2FjaGUgPT0gMCkgeworCQlrbWVtX2NhY2hlX2Rlc3Ryb3koamJkMl9yZXZva2VfcmVjb3JkX2NhY2hlKTsKKwkJamJkMl9yZXZva2VfcmVjb3JkX2NhY2hlID0gTlVMTDsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCXJldHVybiAwOworfQorCit2b2lkIGpiZDJfam91cm5hbF9kZXN0cm95X3Jldm9rZV9jYWNoZXModm9pZCkKK3sKKwlrbWVtX2NhY2hlX2Rlc3Ryb3koamJkMl9yZXZva2VfcmVjb3JkX2NhY2hlKTsKKwlqYmQyX3Jldm9rZV9yZWNvcmRfY2FjaGUgPSBOVUxMOworCWttZW1fY2FjaGVfZGVzdHJveShqYmQyX3Jldm9rZV90YWJsZV9jYWNoZSk7CisJamJkMl9yZXZva2VfdGFibGVfY2FjaGUgPSBOVUxMOworfQorCisvKiBJbml0aWFsaXNlIHRoZSByZXZva2UgdGFibGUgZm9yIGEgZ2l2ZW4gam91cm5hbCB0byBhIGdpdmVuIHNpemUuICovCisKK2ludCBqYmQyX2pvdXJuYWxfaW5pdF9yZXZva2Uoam91cm5hbF90ICpqb3VybmFsLCBpbnQgaGFzaF9zaXplKQoreworCWludCBzaGlmdCwgdG1wOworCisJSl9BU1NFUlQgKGpvdXJuYWwtPmpfcmV2b2tlX3RhYmxlWzBdID09IE5VTEwpOworCisJc2hpZnQgPSAwOworCXRtcCA9IGhhc2hfc2l6ZTsKKwl3aGlsZSgodG1wID4+PSAxVUwpICE9IDBVTCkKKwkJc2hpZnQrKzsKKworCWpvdXJuYWwtPmpfcmV2b2tlX3RhYmxlWzBdID0ga21lbV9jYWNoZV9hbGxvYyhqYmQyX3Jldm9rZV90YWJsZV9jYWNoZSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFqb3VybmFsLT5qX3Jldm9rZV90YWJsZVswXSkKKwkJcmV0dXJuIC1FTk9NRU07CisJam91cm5hbC0+al9yZXZva2UgPSBqb3VybmFsLT5qX3Jldm9rZV90YWJsZVswXTsKKworCS8qIENoZWNrIHRoYXQgdGhlIGhhc2hfc2l6ZSBpcyBhIHBvd2VyIG9mIHR3byAqLworCUpfQVNTRVJUICgoaGFzaF9zaXplICYgKGhhc2hfc2l6ZS0xKSkgPT0gMCk7CisKKwlqb3VybmFsLT5qX3Jldm9rZS0+aGFzaF9zaXplID0gaGFzaF9zaXplOworCisJam91cm5hbC0+al9yZXZva2UtPmhhc2hfc2hpZnQgPSBzaGlmdDsKKworCWpvdXJuYWwtPmpfcmV2b2tlLT5oYXNoX3RhYmxlID0KKwkJa21hbGxvYyhoYXNoX3NpemUgKiBzaXplb2Yoc3RydWN0IGxpc3RfaGVhZCksIEdGUF9LRVJORUwpOworCWlmICgham91cm5hbC0+al9yZXZva2UtPmhhc2hfdGFibGUpIHsKKwkJa21lbV9jYWNoZV9mcmVlKGpiZDJfcmV2b2tlX3RhYmxlX2NhY2hlLCBqb3VybmFsLT5qX3Jldm9rZV90YWJsZVswXSk7CisJCWpvdXJuYWwtPmpfcmV2b2tlID0gTlVMTDsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJZm9yICh0bXAgPSAwOyB0bXAgPCBoYXNoX3NpemU7IHRtcCsrKQorCQlJTklUX0xJU1RfSEVBRCgmam91cm5hbC0+al9yZXZva2UtPmhhc2hfdGFibGVbdG1wXSk7CisKKwlqb3VybmFsLT5qX3Jldm9rZV90YWJsZVsxXSA9IGttZW1fY2FjaGVfYWxsb2MoamJkMl9yZXZva2VfdGFibGVfY2FjaGUsIEdGUF9LRVJORUwpOworCWlmICgham91cm5hbC0+al9yZXZva2VfdGFibGVbMV0pIHsKKwkJa2ZyZWUoam91cm5hbC0+al9yZXZva2VfdGFibGVbMF0tPmhhc2hfdGFibGUpOworCQlrbWVtX2NhY2hlX2ZyZWUoamJkMl9yZXZva2VfdGFibGVfY2FjaGUsIGpvdXJuYWwtPmpfcmV2b2tlX3RhYmxlWzBdKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJam91cm5hbC0+al9yZXZva2UgPSBqb3VybmFsLT5qX3Jldm9rZV90YWJsZVsxXTsKKworCS8qIENoZWNrIHRoYXQgdGhlIGhhc2hfc2l6ZSBpcyBhIHBvd2VyIG9mIHR3byAqLworCUpfQVNTRVJUICgoaGFzaF9zaXplICYgKGhhc2hfc2l6ZS0xKSkgPT0gMCk7CisKKwlqb3VybmFsLT5qX3Jldm9rZS0+aGFzaF9zaXplID0gaGFzaF9zaXplOworCisJam91cm5hbC0+al9yZXZva2UtPmhhc2hfc2hpZnQgPSBzaGlmdDsKKworCWpvdXJuYWwtPmpfcmV2b2tlLT5oYXNoX3RhYmxlID0KKwkJa21hbGxvYyhoYXNoX3NpemUgKiBzaXplb2Yoc3RydWN0IGxpc3RfaGVhZCksIEdGUF9LRVJORUwpOworCWlmICgham91cm5hbC0+al9yZXZva2UtPmhhc2hfdGFibGUpIHsKKwkJa2ZyZWUoam91cm5hbC0+al9yZXZva2VfdGFibGVbMF0tPmhhc2hfdGFibGUpOworCQlrbWVtX2NhY2hlX2ZyZWUoamJkMl9yZXZva2VfdGFibGVfY2FjaGUsIGpvdXJuYWwtPmpfcmV2b2tlX3RhYmxlWzBdKTsKKwkJa21lbV9jYWNoZV9mcmVlKGpiZDJfcmV2b2tlX3RhYmxlX2NhY2hlLCBqb3VybmFsLT5qX3Jldm9rZV90YWJsZVsxXSk7CisJCWpvdXJuYWwtPmpfcmV2b2tlID0gTlVMTDsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJZm9yICh0bXAgPSAwOyB0bXAgPCBoYXNoX3NpemU7IHRtcCsrKQorCQlJTklUX0xJU1RfSEVBRCgmam91cm5hbC0+al9yZXZva2UtPmhhc2hfdGFibGVbdG1wXSk7CisKKwlzcGluX2xvY2tfaW5pdCgmam91cm5hbC0+al9yZXZva2VfbG9jayk7CisKKwlyZXR1cm4gMDsKK30KKworLyogRGVzdG95IGEgam91cm5hbCdzIHJldm9rZSB0YWJsZS4gIFRoZSB0YWJsZSBtdXN0IGFscmVhZHkgYmUgZW1wdHkhICovCisKK3ZvaWQgamJkMl9qb3VybmFsX2Rlc3Ryb3lfcmV2b2tlKGpvdXJuYWxfdCAqam91cm5hbCkKK3sKKwlzdHJ1Y3QgamJkMl9yZXZva2VfdGFibGVfcyAqdGFibGU7CisJc3RydWN0IGxpc3RfaGVhZCAqaGFzaF9saXN0OworCWludCBpOworCisJdGFibGUgPSBqb3VybmFsLT5qX3Jldm9rZV90YWJsZVswXTsKKwlpZiAoIXRhYmxlKQorCQlyZXR1cm47CisKKwlmb3IgKGk9MDsgaTx0YWJsZS0+aGFzaF9zaXplOyBpKyspIHsKKwkJaGFzaF9saXN0ID0gJnRhYmxlLT5oYXNoX3RhYmxlW2ldOworCQlKX0FTU0VSVCAobGlzdF9lbXB0eShoYXNoX2xpc3QpKTsKKwl9CisKKwlrZnJlZSh0YWJsZS0+aGFzaF90YWJsZSk7CisJa21lbV9jYWNoZV9mcmVlKGpiZDJfcmV2b2tlX3RhYmxlX2NhY2hlLCB0YWJsZSk7CisJam91cm5hbC0+al9yZXZva2UgPSBOVUxMOworCisJdGFibGUgPSBqb3VybmFsLT5qX3Jldm9rZV90YWJsZVsxXTsKKwlpZiAoIXRhYmxlKQorCQlyZXR1cm47CisKKwlmb3IgKGk9MDsgaTx0YWJsZS0+aGFzaF9zaXplOyBpKyspIHsKKwkJaGFzaF9saXN0ID0gJnRhYmxlLT5oYXNoX3RhYmxlW2ldOworCQlKX0FTU0VSVCAobGlzdF9lbXB0eShoYXNoX2xpc3QpKTsKKwl9CisKKwlrZnJlZSh0YWJsZS0+aGFzaF90YWJsZSk7CisJa21lbV9jYWNoZV9mcmVlKGpiZDJfcmV2b2tlX3RhYmxlX2NhY2hlLCB0YWJsZSk7CisJam91cm5hbC0+al9yZXZva2UgPSBOVUxMOworfQorCisKKyNpZmRlZiBfX0tFUk5FTF9fCisKKy8qCisgKiBqYmQyX2pvdXJuYWxfcmV2b2tlOiByZXZva2UgYSBnaXZlbiBidWZmZXJfaGVhZCBmcm9tIHRoZSBqb3VybmFsLiAgVGhpcworICogcHJldmVudHMgdGhlIGJsb2NrIGZyb20gYmVpbmcgcmVwbGF5ZWQgZHVyaW5nIHJlY292ZXJ5IGlmIHdlIHRha2UgYQorICogY3Jhc2ggYWZ0ZXIgdGhpcyBjdXJyZW50IHRyYW5zYWN0aW9uIGNvbW1pdHMuICBBbnkgc3Vic2VxdWVudAorICogbWV0YWRhdGEgd3JpdGVzIG9mIHRoZSBidWZmZXIgaW4gdGhpcyB0cmFuc2FjdGlvbiBjYW5jZWwgdGhlCisgKiByZXZva2UuCisgKgorICogTm90ZSB0aGF0IHRoaXMgY2FsbCBtYXkgYmxvY2sgLS0tIGl0IGlzIHVwIHRvIHRoZSBjYWxsZXIgdG8gbWFrZQorICogc3VyZSB0aGF0IHRoZXJlIGFyZSBubyBmdXJ0aGVyIGNhbGxzIHRvIGpvdXJuYWxfd3JpdGVfbWV0YWRhdGEKKyAqIGJlZm9yZSB0aGUgcmV2b2tlIGlzIGNvbXBsZXRlLiAgSW4gZXh0MywgdGhpcyBpbXBsaWVzIGNhbGxpbmcgdGhlCisgKiByZXZva2UgYmVmb3JlIGNsZWFyaW5nIHRoZSBibG9jayBiaXRtYXAgd2hlbiB3ZSBhcmUgZGVsZXRpbmcKKyAqIG1ldGFkYXRhLgorICoKKyAqIFJldm9rZSBwZXJmb3JtcyBhIGpiZDJfam91cm5hbF9mb3JnZXQgb24gYW55IGJ1ZmZlcl9oZWFkIHBhc3NlZCBpbiBhcyBhCisgKiBwYXJhbWV0ZXIsIGJ1dCBkb2VzIF9ub3RfIGZvcmdldCB0aGUgYnVmZmVyX2hlYWQgaWYgdGhlIGJoIHdhcyBvbmx5CisgKiBmb3VuZCBpbXBsaWNpdGx5LgorICoKKyAqIGJoX2luIG1heSBub3QgYmUgYSBqb3VybmFsbGVkIGJ1ZmZlciAtIGl0IG1heSBoYXZlIGNvbWUgb2ZmCisgKiB0aGUgaGFzaCB0YWJsZXMgd2l0aG91dCBhbiBhdHRhY2hlZCBqb3VybmFsX2hlYWQuCisgKgorICogSWYgYmhfaW4gaXMgbm9uLXplcm8sIGpiZDJfam91cm5hbF9yZXZva2UoKSB3aWxsIGRlY3JlbWVudCBpdHMgYl9jb3VudAorICogYnkgb25lLgorICovCisKK2ludCBqYmQyX2pvdXJuYWxfcmV2b2tlKGhhbmRsZV90ICpoYW5kbGUsIHVuc2lnbmVkIGxvbmcgbG9uZyBibG9ja25yLAorCQkgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoX2luKQoreworCXN0cnVjdCBidWZmZXJfaGVhZCAqYmggPSBOVUxMOworCWpvdXJuYWxfdCAqam91cm5hbDsKKwlzdHJ1Y3QgYmxvY2tfZGV2aWNlICpiZGV2OworCWludCBlcnI7CisKKwltaWdodF9zbGVlcCgpOworCWlmIChiaF9pbikKKwkJQlVGRkVSX1RSQUNFKGJoX2luLCAiZW50ZXIiKTsKKworCWpvdXJuYWwgPSBoYW5kbGUtPmhfdHJhbnNhY3Rpb24tPnRfam91cm5hbDsKKwlpZiAoIWpiZDJfam91cm5hbF9zZXRfZmVhdHVyZXMoam91cm5hbCwgMCwgMCwgSkJEMl9GRUFUVVJFX0lOQ09NUEFUX1JFVk9LRSkpeworCQlKX0FTU0VSVCAoISJDYW5ub3Qgc2V0IHJldm9rZSBmZWF0dXJlISIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwliZGV2ID0gam91cm5hbC0+al9mc19kZXY7CisJYmggPSBiaF9pbjsKKworCWlmICghYmgpIHsKKwkJYmggPSBfX2ZpbmRfZ2V0X2Jsb2NrKGJkZXYsIGJsb2NrbnIsIGpvdXJuYWwtPmpfYmxvY2tzaXplKTsKKwkJaWYgKGJoKQorCQkJQlVGRkVSX1RSQUNFKGJoLCAiZm91bmQgb24gaGFzaCIpOworCX0KKyNpZmRlZiBKQkRfRVhQRU5TSVZFX0NIRUNLSU5HCisJZWxzZSB7CisJCXN0cnVjdCBidWZmZXJfaGVhZCAqYmgyOworCisJCS8qIElmIHRoZXJlIGlzIGEgZGlmZmVyZW50IGJ1ZmZlcl9oZWFkIGx5aW5nIGFyb3VuZCBpbgorCQkgKiBtZW1vcnkgYW55d2hlcmUuLi4gKi8KKwkJYmgyID0gX19maW5kX2dldF9ibG9jayhiZGV2LCBibG9ja25yLCBqb3VybmFsLT5qX2Jsb2Nrc2l6ZSk7CisJCWlmIChiaDIpIHsKKwkJCS8qIC4uLiBhbmQgaXQgaGFzIFJldm9rZVZhbGlkIHN0YXR1cy4uLiAqLworCQkJaWYgKGJoMiAhPSBiaCAmJiBidWZmZXJfcmV2b2tldmFsaWQoYmgyKSkKKwkJCQkvKiAuLi50aGVuIGl0IGJldHRlciBiZSByZXZva2VkIHRvbywKKwkJCQkgKiBzaW5jZSBpdCdzIGlsbGVnYWwgdG8gY3JlYXRlIGEgcmV2b2tlCisJCQkJICogcmVjb3JkIGFnYWluc3QgYSBidWZmZXJfaGVhZCB3aGljaCBpcworCQkJCSAqIG5vdCBtYXJrZWQgcmV2b2tlZCAtLS0gdGhhdCB3b3VsZAorCQkJCSAqIHJpc2sgbWlzc2luZyBhIHN1YnNlcXVlbnQgcmV2b2tlCisJCQkJICogY2FuY2VsLiAqLworCQkJCUpfQVNTRVJUX0JIKGJoMiwgYnVmZmVyX3Jldm9rZWQoYmgyKSk7CisJCQlwdXRfYmgoYmgyKTsKKwkJfQorCX0KKyNlbmRpZgorCisJLyogV2UgcmVhbGx5IG91Z2h0IG5vdCBldmVyIHRvIHJldm9rZSB0d2ljZSBpbiBhIHJvdyB3aXRob3V0CisgICAgICAgICAgIGZpcnN0IGhhdmluZyB0aGUgcmV2b2tlIGNhbmNlbGxlZDogaXQncyBpbGxlZ2FsIHRvIGZyZWUgYQorICAgICAgICAgICBibG9jayB0d2ljZSB3aXRob3V0IGFsbG9jYXRpbmcgaXQgaW4gYmV0d2VlbiEgKi8KKwlpZiAoYmgpIHsKKwkJaWYgKCFKX0VYUEVDVF9CSChiaCwgIWJ1ZmZlcl9yZXZva2VkKGJoKSwKKwkJCQkgImluY29uc2lzdGVudCBkYXRhIG9uIGRpc2siKSkgeworCQkJaWYgKCFiaF9pbikKKwkJCQlicmVsc2UoYmgpOworCQkJcmV0dXJuIC1FSU87CisJCX0KKwkJc2V0X2J1ZmZlcl9yZXZva2VkKGJoKTsKKwkJc2V0X2J1ZmZlcl9yZXZva2V2YWxpZChiaCk7CisJCWlmIChiaF9pbikgeworCQkJQlVGRkVSX1RSQUNFKGJoX2luLCAiY2FsbCBqYmQyX2pvdXJuYWxfZm9yZ2V0Iik7CisJCQlqYmQyX2pvdXJuYWxfZm9yZ2V0KGhhbmRsZSwgYmhfaW4pOworCQl9IGVsc2UgeworCQkJQlVGRkVSX1RSQUNFKGJoLCAiY2FsbCBicmVsc2UiKTsKKwkJCV9fYnJlbHNlKGJoKTsKKwkJfQorCX0KKworCWpiZF9kZWJ1ZygyLCAiaW5zZXJ0IHJldm9rZSBmb3IgYmxvY2sgJWxsdSwgYmhfaW49JXBcbiIsYmxvY2tuciwgYmhfaW4pOworCWVyciA9IGluc2VydF9yZXZva2VfaGFzaChqb3VybmFsLCBibG9ja25yLAorCQkJCWhhbmRsZS0+aF90cmFuc2FjdGlvbi0+dF90aWQpOworCUJVRkZFUl9UUkFDRShiaF9pbiwgImV4aXQiKTsKKwlyZXR1cm4gZXJyOworfQorCisvKgorICogQ2FuY2VsIGFuIG91dHN0YW5kaW5nIHJldm9rZS4gIEZvciB1c2Ugb25seSBpbnRlcm5hbGx5IGJ5IHRoZQorICogam91cm5hbGluZyBjb2RlIChjYWxsZWQgZnJvbSBqYmQyX2pvdXJuYWxfZ2V0X3dyaXRlX2FjY2VzcykuCisgKgorICogV2UgdHJ1c3QgYnVmZmVyX3Jldm9rZWQoKSBvbiB0aGUgYnVmZmVyIGlmIHRoZSBidWZmZXIgaXMgYWxyZWFkeQorICogYmVpbmcgam91cm5hbGVkOiBpZiB0aGVyZSBpcyBubyByZXZva2UgcGVuZGluZyBvbiB0aGUgYnVmZmVyLCB0aGVuIHdlCisgKiBkb24ndCBkbyBhbnl0aGluZyBoZXJlLgorICoKKyAqIFRoaXMgd291bGQgYnJlYWsgaWYgaXQgd2VyZSBwb3NzaWJsZSBmb3IgYSBidWZmZXIgdG8gYmUgcmV2b2tlZCBhbmQKKyAqIGRpc2NhcmRlZCwgYW5kIHRoZW4gcmVhbGxvY2F0ZWQgd2l0aGluIHRoZSBzYW1lIHRyYW5zYWN0aW9uLiAgSW4gc3VjaAorICogYSBjYXNlIHdlIHdvdWxkIGhhdmUgbG9zdCB0aGUgcmV2b2tlZCBiaXQsIGJ1dCB3aGVuIHdlIGFycml2ZWQgaGVyZQorICogdGhlIHNlY29uZCB0aW1lIHdlIHdvdWxkIHN0aWxsIGhhdmUgYSBwZW5kaW5nIHJldm9rZSB0byBjYW5jZWwuICBTbywKKyAqIGRvIG5vdCB0cnVzdCB0aGUgUmV2b2tlZCBiaXQgb24gYnVmZmVycyB1bmxlc3MgUmV2b2tlVmFsaWQgaXMgYWxzbworICogc2V0LgorICoKKyAqIFRoZSBjYWxsZXIgbXVzdCBoYXZlIHRoZSBqb3VybmFsIGxvY2tlZC4KKyAqLworaW50IGpiZDJfam91cm5hbF9jYW5jZWxfcmV2b2tlKGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBqb3VybmFsX2hlYWQgKmpoKQoreworCXN0cnVjdCBqYmQyX3Jldm9rZV9yZWNvcmRfcyAqcmVjb3JkOworCWpvdXJuYWxfdCAqam91cm5hbCA9IGhhbmRsZS0+aF90cmFuc2FjdGlvbi0+dF9qb3VybmFsOworCWludCBuZWVkX2NhbmNlbDsKKwlpbnQgZGlkX3Jldm9rZSA9IDA7CS8qIGFrcG06IGRlYnVnICovCisJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCA9IGpoMmJoKGpoKTsKKworCWpiZF9kZWJ1Zyg0LCAiam91cm5hbF9oZWFkICVwLCBjYW5jZWxsaW5nIHJldm9rZVxuIiwgamgpOworCisJLyogSXMgdGhlIGV4aXN0aW5nIFJldm9rZSBiaXQgdmFsaWQ/ICBJZiBzbywgd2UgdHJ1c3QgaXQsIGFuZAorCSAqIG9ubHkgcGVyZm9ybSB0aGUgZnVsbCBjYW5jZWwgaWYgdGhlIHJldm9rZSBiaXQgaXMgc2V0LiAgSWYKKwkgKiBub3QsIHdlIGNhbid0IHRydXN0IHRoZSByZXZva2UgYml0LCBhbmQgd2UgbmVlZCB0byBkbyB0aGUKKwkgKiBmdWxsIHNlYXJjaCBmb3IgYSByZXZva2UgcmVjb3JkLiAqLworCWlmICh0ZXN0X3NldF9idWZmZXJfcmV2b2tldmFsaWQoYmgpKSB7CisJCW5lZWRfY2FuY2VsID0gdGVzdF9jbGVhcl9idWZmZXJfcmV2b2tlZChiaCk7CisJfSBlbHNlIHsKKwkJbmVlZF9jYW5jZWwgPSAxOworCQljbGVhcl9idWZmZXJfcmV2b2tlZChiaCk7CisJfQorCisJaWYgKG5lZWRfY2FuY2VsKSB7CisJCXJlY29yZCA9IGZpbmRfcmV2b2tlX3JlY29yZChqb3VybmFsLCBiaC0+Yl9ibG9ja25yKTsKKwkJaWYgKHJlY29yZCkgeworCQkJamJkX2RlYnVnKDQsICJjYW5jZWxsZWQgZXhpc3RpbmcgcmV2b2tlIG9uICIKKwkJCQkgICJibG9ja25yICVsbHVcbiIsICh1bnNpZ25lZCBsb25nIGxvbmcpYmgtPmJfYmxvY2tucik7CisJCQlzcGluX2xvY2soJmpvdXJuYWwtPmpfcmV2b2tlX2xvY2spOworCQkJbGlzdF9kZWwoJnJlY29yZC0+aGFzaCk7CisJCQlzcGluX3VubG9jaygmam91cm5hbC0+al9yZXZva2VfbG9jayk7CisJCQlrbWVtX2NhY2hlX2ZyZWUoamJkMl9yZXZva2VfcmVjb3JkX2NhY2hlLCByZWNvcmQpOworCQkJZGlkX3Jldm9rZSA9IDE7CisJCX0KKwl9CisKKyNpZmRlZiBKQkRfRVhQRU5TSVZFX0NIRUNLSU5HCisJLyogVGhlcmUgYmV0dGVyIG5vdCBiZSBvbmUgbGVmdCBiZWhpbmQgYnkgbm93ISAqLworCXJlY29yZCA9IGZpbmRfcmV2b2tlX3JlY29yZChqb3VybmFsLCBiaC0+Yl9ibG9ja25yKTsKKwlKX0FTU0VSVF9KSChqaCwgcmVjb3JkID09IE5VTEwpOworI2VuZGlmCisKKwkvKiBGaW5hbGx5LCBoYXZlIHdlIGp1c3QgY2xlYXJlZCByZXZva2Ugb24gYW4gdW5oYXNoZWQKKwkgKiBidWZmZXJfaGVhZD8gIElmIHNvLCB3ZSdkIGJldHRlciBtYWtlIHN1cmUgd2UgY2xlYXIgdGhlCisJICogcmV2b2tlZCBzdGF0dXMgb24gYW55IGhhc2hlZCBhbGlhcyB0b28sIG90aGVyd2lzZSB0aGUgcmV2b2tlCisJICogc3RhdGUgbWFjaGluZSB3aWxsIGdldCB2ZXJ5IHVwc2V0IGxhdGVyIG9uLiAqLworCWlmIChuZWVkX2NhbmNlbCkgeworCQlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoMjsKKwkJYmgyID0gX19maW5kX2dldF9ibG9jayhiaC0+Yl9iZGV2LCBiaC0+Yl9ibG9ja25yLCBiaC0+Yl9zaXplKTsKKwkJaWYgKGJoMikgeworCQkJaWYgKGJoMiAhPSBiaCkKKwkJCQljbGVhcl9idWZmZXJfcmV2b2tlZChiaDIpOworCQkJX19icmVsc2UoYmgyKTsKKwkJfQorCX0KKwlyZXR1cm4gZGlkX3Jldm9rZTsKK30KKworLyogam91cm5hbF9zd2l0Y2hfcmV2b2tlIHRhYmxlIHNlbGVjdCBqX3Jldm9rZSBmb3IgbmV4dCB0cmFuc2FjdGlvbgorICogd2UgZG8gbm90IHdhbnQgdG8gc3VzcGVuZCBhbnkgcHJvY2Vzc2luZyB1bnRpbCBhbGwgcmV2b2tlcyBhcmUKKyAqIHdyaXR0ZW4gLWJ6enoKKyAqLwordm9pZCBqYmQyX2pvdXJuYWxfc3dpdGNoX3Jldm9rZV90YWJsZShqb3VybmFsX3QgKmpvdXJuYWwpCit7CisJaW50IGk7CisKKwlpZiAoam91cm5hbC0+al9yZXZva2UgPT0gam91cm5hbC0+al9yZXZva2VfdGFibGVbMF0pCisJCWpvdXJuYWwtPmpfcmV2b2tlID0gam91cm5hbC0+al9yZXZva2VfdGFibGVbMV07CisJZWxzZQorCQlqb3VybmFsLT5qX3Jldm9rZSA9IGpvdXJuYWwtPmpfcmV2b2tlX3RhYmxlWzBdOworCisJZm9yIChpID0gMDsgaSA8IGpvdXJuYWwtPmpfcmV2b2tlLT5oYXNoX3NpemU7IGkrKykKKwkJSU5JVF9MSVNUX0hFQUQoJmpvdXJuYWwtPmpfcmV2b2tlLT5oYXNoX3RhYmxlW2ldKTsKK30KKworLyoKKyAqIFdyaXRlIHJldm9rZSByZWNvcmRzIHRvIHRoZSBqb3VybmFsIGZvciBhbGwgZW50cmllcyBpbiB0aGUgY3VycmVudAorICogcmV2b2tlIGhhc2gsIGRlbGV0aW5nIHRoZSBlbnRyaWVzIGFzIHdlIGdvLgorICoKKyAqIENhbGxlZCB3aXRoIHRoZSBqb3VybmFsIGxvY2sgaGVsZC4KKyAqLworCit2b2lkIGpiZDJfam91cm5hbF93cml0ZV9yZXZva2VfcmVjb3Jkcyhqb3VybmFsX3QgKmpvdXJuYWwsCisJCQkJICB0cmFuc2FjdGlvbl90ICp0cmFuc2FjdGlvbikKK3sKKwlzdHJ1Y3Qgam91cm5hbF9oZWFkICpkZXNjcmlwdG9yOworCXN0cnVjdCBqYmQyX3Jldm9rZV9yZWNvcmRfcyAqcmVjb3JkOworCXN0cnVjdCBqYmQyX3Jldm9rZV90YWJsZV9zICpyZXZva2U7CisJc3RydWN0IGxpc3RfaGVhZCAqaGFzaF9saXN0OworCWludCBpLCBvZmZzZXQsIGNvdW50OworCisJZGVzY3JpcHRvciA9IE5VTEw7CisJb2Zmc2V0ID0gMDsKKwljb3VudCA9IDA7CisKKwkvKiBzZWxlY3QgcmV2b2tlIHRhYmxlIGZvciBjb21taXR0aW5nIHRyYW5zYWN0aW9uICovCisJcmV2b2tlID0gam91cm5hbC0+al9yZXZva2UgPT0gam91cm5hbC0+al9yZXZva2VfdGFibGVbMF0gPworCQlqb3VybmFsLT5qX3Jldm9rZV90YWJsZVsxXSA6IGpvdXJuYWwtPmpfcmV2b2tlX3RhYmxlWzBdOworCisJZm9yIChpID0gMDsgaSA8IHJldm9rZS0+aGFzaF9zaXplOyBpKyspIHsKKwkJaGFzaF9saXN0ID0gJnJldm9rZS0+aGFzaF90YWJsZVtpXTsKKworCQl3aGlsZSAoIWxpc3RfZW1wdHkoaGFzaF9saXN0KSkgeworCQkJcmVjb3JkID0gKHN0cnVjdCBqYmQyX3Jldm9rZV9yZWNvcmRfcyAqKQorCQkJCWhhc2hfbGlzdC0+bmV4dDsKKwkJCXdyaXRlX29uZV9yZXZva2VfcmVjb3JkKGpvdXJuYWwsIHRyYW5zYWN0aW9uLAorCQkJCQkJJmRlc2NyaXB0b3IsICZvZmZzZXQsCisJCQkJCQlyZWNvcmQpOworCQkJY291bnQrKzsKKwkJCWxpc3RfZGVsKCZyZWNvcmQtPmhhc2gpOworCQkJa21lbV9jYWNoZV9mcmVlKGpiZDJfcmV2b2tlX3JlY29yZF9jYWNoZSwgcmVjb3JkKTsKKwkJfQorCX0KKwlpZiAoZGVzY3JpcHRvcikKKwkJZmx1c2hfZGVzY3JpcHRvcihqb3VybmFsLCBkZXNjcmlwdG9yLCBvZmZzZXQpOworCWpiZF9kZWJ1ZygxLCAiV3JvdGUgJWQgcmV2b2tlIHJlY29yZHNcbiIsIGNvdW50KTsKK30KKworLyoKKyAqIFdyaXRlIG91dCBvbmUgcmV2b2tlIHJlY29yZC4gIFdlIG5lZWQgdG8gY3JlYXRlIGEgbmV3IGRlc2NyaXB0b3IKKyAqIGJsb2NrIGlmIHRoZSBvbGQgb25lIGlzIGZ1bGwgb3IgaWYgd2UgaGF2ZSBub3QgYWxyZWFkeSBjcmVhdGVkIG9uZS4KKyAqLworCitzdGF0aWMgdm9pZCB3cml0ZV9vbmVfcmV2b2tlX3JlY29yZChqb3VybmFsX3QgKmpvdXJuYWwsCisJCQkJICAgIHRyYW5zYWN0aW9uX3QgKnRyYW5zYWN0aW9uLAorCQkJCSAgICBzdHJ1Y3Qgam91cm5hbF9oZWFkICoqZGVzY3JpcHRvcnAsCisJCQkJICAgIGludCAqb2Zmc2V0cCwKKwkJCQkgICAgc3RydWN0IGpiZDJfcmV2b2tlX3JlY29yZF9zICpyZWNvcmQpCit7CisJc3RydWN0IGpvdXJuYWxfaGVhZCAqZGVzY3JpcHRvcjsKKwlpbnQgb2Zmc2V0OworCWpvdXJuYWxfaGVhZGVyX3QgKmhlYWRlcjsKKworCS8qIElmIHdlIGFyZSBhbHJlYWR5IGFib3J0aW5nLCB0aGlzIGFsbCBiZWNvbWVzIGEgbm9vcC4gIFdlCisgICAgICAgICAgIHN0aWxsIG5lZWQgdG8gZ28gcm91bmQgdGhlIGxvb3AgaW4KKyAgICAgICAgICAgamJkMl9qb3VybmFsX3dyaXRlX3Jldm9rZV9yZWNvcmRzIGluIG9yZGVyIHRvIGZyZWUgYWxsIG9mIHRoZQorICAgICAgICAgICByZXZva2UgcmVjb3Jkczogb25seSB0aGUgSU8gdG8gdGhlIGpvdXJuYWwgaXMgb21pdHRlZC4gKi8KKwlpZiAoaXNfam91cm5hbF9hYm9ydGVkKGpvdXJuYWwpKQorCQlyZXR1cm47CisKKwlkZXNjcmlwdG9yID0gKmRlc2NyaXB0b3JwOworCW9mZnNldCA9ICpvZmZzZXRwOworCisJLyogTWFrZSBzdXJlIHdlIGhhdmUgYSBkZXNjcmlwdG9yIHdpdGggc3BhY2UgbGVmdCBmb3IgdGhlIHJlY29yZCAqLworCWlmIChkZXNjcmlwdG9yKSB7CisJCWlmIChvZmZzZXQgPT0gam91cm5hbC0+al9ibG9ja3NpemUpIHsKKwkJCWZsdXNoX2Rlc2NyaXB0b3Ioam91cm5hbCwgZGVzY3JpcHRvciwgb2Zmc2V0KTsKKwkJCWRlc2NyaXB0b3IgPSBOVUxMOworCQl9CisJfQorCisJaWYgKCFkZXNjcmlwdG9yKSB7CisJCWRlc2NyaXB0b3IgPSBqYmQyX2pvdXJuYWxfZ2V0X2Rlc2NyaXB0b3JfYnVmZmVyKGpvdXJuYWwpOworCQlpZiAoIWRlc2NyaXB0b3IpCisJCQlyZXR1cm47CisJCWhlYWRlciA9IChqb3VybmFsX2hlYWRlcl90ICopICZqaDJiaChkZXNjcmlwdG9yKS0+Yl9kYXRhWzBdOworCQloZWFkZXItPmhfbWFnaWMgICAgID0gY3B1X3RvX2JlMzIoSkJEMl9NQUdJQ19OVU1CRVIpOworCQloZWFkZXItPmhfYmxvY2t0eXBlID0gY3B1X3RvX2JlMzIoSkJEMl9SRVZPS0VfQkxPQ0spOworCQloZWFkZXItPmhfc2VxdWVuY2UgID0gY3B1X3RvX2JlMzIodHJhbnNhY3Rpb24tPnRfdGlkKTsKKworCQkvKiBSZWNvcmQgaXQgc28gdGhhdCB3ZSBjYW4gd2FpdCBmb3IgSU8gY29tcGxldGlvbiBsYXRlciAqLworCQlKQlVGRkVSX1RSQUNFKGRlc2NyaXB0b3IsICJmaWxlIGFzIEJKX0xvZ0N0bCIpOworCQlqYmQyX2pvdXJuYWxfZmlsZV9idWZmZXIoZGVzY3JpcHRvciwgdHJhbnNhY3Rpb24sIEJKX0xvZ0N0bCk7CisKKwkJb2Zmc2V0ID0gc2l6ZW9mKGpiZDJfam91cm5hbF9yZXZva2VfaGVhZGVyX3QpOworCQkqZGVzY3JpcHRvcnAgPSBkZXNjcmlwdG9yOworCX0KKworCWlmIChKQkQyX0hBU19JTkNPTVBBVF9GRUFUVVJFKGpvdXJuYWwsIEpCRDJfRkVBVFVSRV9JTkNPTVBBVF82NEJJVCkpIHsKKwkJKiAoKF9fYmU2NCAqKSgmamgyYmgoZGVzY3JpcHRvciktPmJfZGF0YVtvZmZzZXRdKSkgPQorCQkJY3B1X3RvX2JlNjQocmVjb3JkLT5ibG9ja25yKTsKKwkJb2Zmc2V0ICs9IDg7CisKKwl9IGVsc2UgeworCQkqICgoX19iZTMyICopKCZqaDJiaChkZXNjcmlwdG9yKS0+Yl9kYXRhW29mZnNldF0pKSA9CisJCQljcHVfdG9fYmUzMihyZWNvcmQtPmJsb2NrbnIpOworCQlvZmZzZXQgKz0gNDsKKwl9CisKKwkqb2Zmc2V0cCA9IG9mZnNldDsKK30KKworLyoKKyAqIEZsdXNoIGEgcmV2b2tlIGRlc2NyaXB0b3Igb3V0IHRvIHRoZSBqb3VybmFsLiAgSWYgd2UgYXJlIGFib3J0aW5nLAorICogdGhpcyBpcyBhIG5vb3A7IG90aGVyd2lzZSB3ZSBhcmUgZ2VuZXJhdGluZyBhIGJ1ZmZlciB3aGljaCBuZWVkcyB0bworICogYmUgd2FpdGVkIGZvciBkdXJpbmcgY29tbWl0LCBzbyBpdCBoYXMgdG8gZ28gb250byB0aGUgYXBwcm9wcmlhdGUKKyAqIGpvdXJuYWwgYnVmZmVyIGxpc3QuCisgKi8KKworc3RhdGljIHZvaWQgZmx1c2hfZGVzY3JpcHRvcihqb3VybmFsX3QgKmpvdXJuYWwsCisJCQkgICAgIHN0cnVjdCBqb3VybmFsX2hlYWQgKmRlc2NyaXB0b3IsCisJCQkgICAgIGludCBvZmZzZXQpCit7CisJamJkMl9qb3VybmFsX3Jldm9rZV9oZWFkZXJfdCAqaGVhZGVyOworCXN0cnVjdCBidWZmZXJfaGVhZCAqYmggPSBqaDJiaChkZXNjcmlwdG9yKTsKKworCWlmIChpc19qb3VybmFsX2Fib3J0ZWQoam91cm5hbCkpIHsKKwkJcHV0X2JoKGJoKTsKKwkJcmV0dXJuOworCX0KKworCWhlYWRlciA9IChqYmQyX2pvdXJuYWxfcmV2b2tlX2hlYWRlcl90ICopIGpoMmJoKGRlc2NyaXB0b3IpLT5iX2RhdGE7CisJaGVhZGVyLT5yX2NvdW50ID0gY3B1X3RvX2JlMzIob2Zmc2V0KTsKKwlzZXRfYnVmZmVyX2p3cml0ZShiaCk7CisJQlVGRkVSX1RSQUNFKGJoLCAid3JpdGUiKTsKKwlzZXRfYnVmZmVyX2RpcnR5KGJoKTsKKwlsbF9yd19ibG9jayhTV1JJVEUsIDEsICZiaCk7Cit9CisjZW5kaWYKKworLyoKKyAqIFJldm9rZSBzdXBwb3J0IGZvciByZWNvdmVyeS4KKyAqCisgKiBSZWNvdmVyeSBuZWVkcyB0byBiZSBhYmxlIHRvOgorICoKKyAqICByZWNvcmQgYWxsIHJldm9rZSByZWNvcmRzLCBpbmNsdWRpbmcgdGhlIHRpZCBvZiB0aGUgbGF0ZXN0IGluc3RhbmNlCisgKiAgb2YgZWFjaCByZXZva2UgaW4gdGhlIGpvdXJuYWwKKyAqCisgKiAgY2hlY2sgd2hldGhlciBhIGdpdmVuIGJsb2NrIGluIGEgZ2l2ZW4gdHJhbnNhY3Rpb24gc2hvdWxkIGJlIHJlcGxheWVkCisgKiAgKGllLiBoYXMgbm90IGJlZW4gcmV2b2tlZCBieSBhIHJldm9rZSByZWNvcmQgaW4gdGhhdCBvciBhIHN1YnNlcXVlbnQKKyAqICB0cmFuc2FjdGlvbikKKyAqCisgKiAgZW1wdHkgdGhlIHJldm9rZSB0YWJsZSBhZnRlciByZWNvdmVyeS4KKyAqLworCisvKgorICogRmlyc3QsIHNldHRpbmcgcmV2b2tlIHJlY29yZHMuICBXZSBjcmVhdGUgYSBuZXcgcmV2b2tlIHJlY29yZCBmb3IKKyAqIGV2ZXJ5IGJsb2NrIGV2ZXIgcmV2b2tlZCBpbiB0aGUgbG9nIGFzIHdlIHNjYW4gaXQgZm9yIHJlY292ZXJ5LCBhbmQKKyAqIHdlIHVwZGF0ZSB0aGUgZXhpc3RpbmcgcmVjb3JkcyBpZiB3ZSBmaW5kIG11bHRpcGxlIHJldm9rZXMgZm9yIGEKKyAqIHNpbmdsZSBibG9jay4KKyAqLworCitpbnQgamJkMl9qb3VybmFsX3NldF9yZXZva2Uoam91cm5hbF90ICpqb3VybmFsLAorCQkgICAgICAgdW5zaWduZWQgbG9uZyBsb25nIGJsb2NrbnIsCisJCSAgICAgICB0aWRfdCBzZXF1ZW5jZSkKK3sKKwlzdHJ1Y3QgamJkMl9yZXZva2VfcmVjb3JkX3MgKnJlY29yZDsKKworCXJlY29yZCA9IGZpbmRfcmV2b2tlX3JlY29yZChqb3VybmFsLCBibG9ja25yKTsKKwlpZiAocmVjb3JkKSB7CisJCS8qIElmIHdlIGhhdmUgbXVsdGlwbGUgb2NjdXJyZW5jZXMsIG9ubHkgcmVjb3JkIHRoZQorCQkgKiBsYXRlc3Qgc2VxdWVuY2UgbnVtYmVyIGluIHRoZSBoYXNoZWQgcmVjb3JkICovCisJCWlmICh0aWRfZ3Qoc2VxdWVuY2UsIHJlY29yZC0+c2VxdWVuY2UpKQorCQkJcmVjb3JkLT5zZXF1ZW5jZSA9IHNlcXVlbmNlOworCQlyZXR1cm4gMDsKKwl9CisJcmV0dXJuIGluc2VydF9yZXZva2VfaGFzaChqb3VybmFsLCBibG9ja25yLCBzZXF1ZW5jZSk7Cit9CisKKy8qCisgKiBUZXN0IHJldm9rZSByZWNvcmRzLiAgRm9yIGEgZ2l2ZW4gYmxvY2sgcmVmZXJlbmNlZCBpbiB0aGUgbG9nLCBoYXMKKyAqIHRoYXQgYmxvY2sgYmVlbiByZXZva2VkPyAgQSByZXZva2UgcmVjb3JkIHdpdGggYSBnaXZlbiB0cmFuc2FjdGlvbgorICogc2VxdWVuY2UgbnVtYmVyIHJldm9rZXMgYWxsIGJsb2NrcyBpbiB0aGF0IHRyYW5zYWN0aW9uIGFuZCBlYXJsaWVyCisgKiBvbmVzLCBidXQgbGF0ZXIgdHJhbnNhY3Rpb25zIHN0aWxsIG5lZWQgcmVwbGF5ZWQuCisgKi8KKworaW50IGpiZDJfam91cm5hbF90ZXN0X3Jldm9rZShqb3VybmFsX3QgKmpvdXJuYWwsCisJCQl1bnNpZ25lZCBsb25nIGxvbmcgYmxvY2tuciwKKwkJCXRpZF90IHNlcXVlbmNlKQoreworCXN0cnVjdCBqYmQyX3Jldm9rZV9yZWNvcmRfcyAqcmVjb3JkOworCisJcmVjb3JkID0gZmluZF9yZXZva2VfcmVjb3JkKGpvdXJuYWwsIGJsb2NrbnIpOworCWlmICghcmVjb3JkKQorCQlyZXR1cm4gMDsKKwlpZiAodGlkX2d0KHNlcXVlbmNlLCByZWNvcmQtPnNlcXVlbmNlKSkKKwkJcmV0dXJuIDA7CisJcmV0dXJuIDE7Cit9CisKKy8qCisgKiBGaW5hbGx5LCBvbmNlIHJlY292ZXJ5IGlzIG92ZXIsIHdlIG5lZWQgdG8gY2xlYXIgdGhlIHJldm9rZSB0YWJsZSBzbworICogdGhhdCBpdCBjYW4gYmUgcmV1c2VkIGJ5IHRoZSBydW5uaW5nIGZpbGVzeXN0ZW0uCisgKi8KKwordm9pZCBqYmQyX2pvdXJuYWxfY2xlYXJfcmV2b2tlKGpvdXJuYWxfdCAqam91cm5hbCkKK3sKKwlpbnQgaTsKKwlzdHJ1Y3QgbGlzdF9oZWFkICpoYXNoX2xpc3Q7CisJc3RydWN0IGpiZDJfcmV2b2tlX3JlY29yZF9zICpyZWNvcmQ7CisJc3RydWN0IGpiZDJfcmV2b2tlX3RhYmxlX3MgKnJldm9rZTsKKworCXJldm9rZSA9IGpvdXJuYWwtPmpfcmV2b2tlOworCisJZm9yIChpID0gMDsgaSA8IHJldm9rZS0+aGFzaF9zaXplOyBpKyspIHsKKwkJaGFzaF9saXN0ID0gJnJldm9rZS0+aGFzaF90YWJsZVtpXTsKKwkJd2hpbGUgKCFsaXN0X2VtcHR5KGhhc2hfbGlzdCkpIHsKKwkJCXJlY29yZCA9IChzdHJ1Y3QgamJkMl9yZXZva2VfcmVjb3JkX3MqKSBoYXNoX2xpc3QtPm5leHQ7CisJCQlsaXN0X2RlbCgmcmVjb3JkLT5oYXNoKTsKKwkJCWttZW1fY2FjaGVfZnJlZShqYmQyX3Jldm9rZV9yZWNvcmRfY2FjaGUsIHJlY29yZCk7CisJCX0KKwl9Cit9CmRpZmYgLS1naXQgYS9mcy9qYmQyL3RyYW5zYWN0aW9uLmMgYi9mcy9qYmQyL3RyYW5zYWN0aW9uLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzA1MWE5NAotLS0gL2Rldi9udWxsCisrKyBiL2ZzL2piZDIvdHJhbnNhY3Rpb24uYwpAQCAtMCwwICsxLDIwOTQgQEAKKy8qCisgKiBsaW51eC9mcy90cmFuc2FjdGlvbi5jCisgKgorICogV3JpdHRlbiBieSBTdGVwaGVuIEMuIFR3ZWVkaWUgPHNjdEByZWRoYXQuY29tPiwgMTk5OAorICoKKyAqIENvcHlyaWdodCAxOTk4IFJlZCBIYXQgY29ycCAtLS0gQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBMaW51eCBrZXJuZWwgYW5kIGlzIG1hZGUgYXZhaWxhYmxlIHVuZGVyCisgKiB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCB2ZXJzaW9uIDIsIG9yIGF0IHlvdXIKKyAqIG9wdGlvbiwgYW55IGxhdGVyIHZlcnNpb24sIGluY29ycG9yYXRlZCBoZXJlaW4gYnkgcmVmZXJlbmNlLgorICoKKyAqIEdlbmVyaWMgZmlsZXN5c3RlbSB0cmFuc2FjdGlvbiBoYW5kbGluZyBjb2RlOyBwYXJ0IG9mIHRoZSBleHQyZnMKKyAqIGpvdXJuYWxpbmcgc3lzdGVtLgorICoKKyAqIFRoaXMgZmlsZSBtYW5hZ2VzIHRyYW5zYWN0aW9ucyAoY29tcG91bmQgY29tbWl0cyBtYW5hZ2VkIGJ5IHRoZQorICogam91cm5hbGluZyBjb2RlKSBhbmQgaGFuZGxlcyAoaW5kaXZpZHVhbCBhdG9taWMgb3BlcmF0aW9ucyBieSB0aGUKKyAqIGZpbGVzeXN0ZW0pLgorICovCisKKyNpbmNsdWRlIDxsaW51eC90aW1lLmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9qYmQyLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvdGltZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9zbXBfbG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvaGlnaG1lbS5oPgorCisvKgorICogamJkMl9nZXRfdHJhbnNhY3Rpb246IG9idGFpbiBhIG5ldyB0cmFuc2FjdGlvbl90IG9iamVjdC4KKyAqCisgKiBTaW1wbHkgYWxsb2NhdGUgYW5kIGluaXRpYWxpc2UgYSBuZXcgdHJhbnNhY3Rpb24uICBDcmVhdGUgaXQgaW4KKyAqIFJVTk5JTkcgc3RhdGUgYW5kIGFkZCBpdCB0byB0aGUgY3VycmVudCBqb3VybmFsICh3aGljaCBzaG91bGQgbm90CisgKiBoYXZlIGFuIGV4aXN0aW5nIHJ1bm5pbmcgdHJhbnNhY3Rpb246IHdlIG9ubHkgbWFrZSBhIG5ldyB0cmFuc2FjdGlvbgorICogb25jZSB3ZSBoYXZlIHN0YXJ0ZWQgdG8gY29tbWl0IHRoZSBvbGQgb25lKS4KKyAqCisgKiBQcmVjb25kaXRpb25zOgorICoJVGhlIGpvdXJuYWwgTVVTVCBiZSBsb2NrZWQuICBXZSBkb24ndCBwZXJmb3JtIGF0b21pYyBtYWxsb2NzIG9uIHRoZQorICoJbmV3IHRyYW5zYWN0aW9uCWFuZCB3ZSBjYW4ndCBibG9jayB3aXRob3V0IHByb3RlY3RpbmcgYWdhaW5zdCBvdGhlcgorICoJcHJvY2Vzc2VzIHRyeWluZyB0byB0b3VjaCB0aGUgam91cm5hbCB3aGlsZSBpdCBpcyBpbiB0cmFuc2l0aW9uLgorICoKKyAqIENhbGxlZCB1bmRlciBqX3N0YXRlX2xvY2sKKyAqLworCitzdGF0aWMgdHJhbnNhY3Rpb25fdCAqCitqYmQyX2dldF90cmFuc2FjdGlvbihqb3VybmFsX3QgKmpvdXJuYWwsIHRyYW5zYWN0aW9uX3QgKnRyYW5zYWN0aW9uKQoreworCXRyYW5zYWN0aW9uLT50X2pvdXJuYWwgPSBqb3VybmFsOworCXRyYW5zYWN0aW9uLT50X3N0YXRlID0gVF9SVU5OSU5HOworCXRyYW5zYWN0aW9uLT50X3RpZCA9IGpvdXJuYWwtPmpfdHJhbnNhY3Rpb25fc2VxdWVuY2UrKzsKKwl0cmFuc2FjdGlvbi0+dF9leHBpcmVzID0gamlmZmllcyArIGpvdXJuYWwtPmpfY29tbWl0X2ludGVydmFsOworCXNwaW5fbG9ja19pbml0KCZ0cmFuc2FjdGlvbi0+dF9oYW5kbGVfbG9jayk7CisKKwkvKiBTZXQgdXAgdGhlIGNvbW1pdCB0aW1lciBmb3IgdGhlIG5ldyB0cmFuc2FjdGlvbi4gKi8KKwlqb3VybmFsLT5qX2NvbW1pdF90aW1lci5leHBpcmVzID0gdHJhbnNhY3Rpb24tPnRfZXhwaXJlczsKKwlhZGRfdGltZXIoJmpvdXJuYWwtPmpfY29tbWl0X3RpbWVyKTsKKworCUpfQVNTRVJUKGpvdXJuYWwtPmpfcnVubmluZ190cmFuc2FjdGlvbiA9PSBOVUxMKTsKKwlqb3VybmFsLT5qX3J1bm5pbmdfdHJhbnNhY3Rpb24gPSB0cmFuc2FjdGlvbjsKKworCXJldHVybiB0cmFuc2FjdGlvbjsKK30KKworLyoKKyAqIEhhbmRsZSBtYW5hZ2VtZW50LgorICoKKyAqIEEgaGFuZGxlX3QgaXMgYW4gb2JqZWN0IHdoaWNoIHJlcHJlc2VudHMgYSBzaW5nbGUgYXRvbWljIHVwZGF0ZSB0byBhCisgKiBmaWxlc3lzdGVtLCBhbmQgd2hpY2ggdHJhY2tzIGFsbCBvZiB0aGUgbW9kaWZpY2F0aW9ucyB3aGljaCBmb3JtIHBhcnQKKyAqIG9mIHRoYXQgb25lIHVwZGF0ZS4KKyAqLworCisvKgorICogc3RhcnRfdGhpc19oYW5kbGU6IEdpdmVuIGEgaGFuZGxlLCBkZWFsIHdpdGggYW55IGxvY2tpbmcgb3Igc3RhbGxpbmcKKyAqIG5lZWRlZCB0byBtYWtlIHN1cmUgdGhhdCB0aGVyZSBpcyBlbm91Z2ggam91cm5hbCBzcGFjZSBmb3IgdGhlIGhhbmRsZQorICogdG8gYmVnaW4uICBBdHRhY2ggdGhlIGhhbmRsZSB0byBhIHRyYW5zYWN0aW9uIGFuZCBzZXQgdXAgdGhlCisgKiB0cmFuc2FjdGlvbidzIGJ1ZmZlciBjcmVkaXRzLgorICovCisKK3N0YXRpYyBpbnQgc3RhcnRfdGhpc19oYW5kbGUoam91cm5hbF90ICpqb3VybmFsLCBoYW5kbGVfdCAqaGFuZGxlKQoreworCXRyYW5zYWN0aW9uX3QgKnRyYW5zYWN0aW9uOworCWludCBuZWVkZWQ7CisJaW50IG5ibG9ja3MgPSBoYW5kbGUtPmhfYnVmZmVyX2NyZWRpdHM7CisJdHJhbnNhY3Rpb25fdCAqbmV3X3RyYW5zYWN0aW9uID0gTlVMTDsKKwlpbnQgcmV0ID0gMDsKKworCWlmIChuYmxvY2tzID4gam91cm5hbC0+al9tYXhfdHJhbnNhY3Rpb25fYnVmZmVycykgeworCQlwcmludGsoS0VSTl9FUlIgIkpCRDogJXMgd2FudHMgdG9vIG1hbnkgY3JlZGl0cyAoJWQgPiAlZClcbiIsCisJCSAgICAgICBjdXJyZW50LT5jb21tLCBuYmxvY2tzLAorCQkgICAgICAgam91cm5hbC0+al9tYXhfdHJhbnNhY3Rpb25fYnVmZmVycyk7CisJCXJldCA9IC1FTk9TUEM7CisJCWdvdG8gb3V0OworCX0KKworYWxsb2NfdHJhbnNhY3Rpb246CisJaWYgKCFqb3VybmFsLT5qX3J1bm5pbmdfdHJhbnNhY3Rpb24pIHsKKwkJbmV3X3RyYW5zYWN0aW9uID0gamJkX2ttYWxsb2Moc2l6ZW9mKCpuZXdfdHJhbnNhY3Rpb24pLAorCQkJCQkJR0ZQX05PRlMpOworCQlpZiAoIW5ld190cmFuc2FjdGlvbikgeworCQkJcmV0ID0gLUVOT01FTTsKKwkJCWdvdG8gb3V0OworCQl9CisJCW1lbXNldChuZXdfdHJhbnNhY3Rpb24sIDAsIHNpemVvZigqbmV3X3RyYW5zYWN0aW9uKSk7CisJfQorCisJamJkX2RlYnVnKDMsICJOZXcgaGFuZGxlICVwIGdvaW5nIGxpdmUuXG4iLCBoYW5kbGUpOworCityZXBlYXQ6CisKKwkvKgorCSAqIFdlIG5lZWQgdG8gaG9sZCBqX3N0YXRlX2xvY2sgdW50aWwgdF91cGRhdGVzIGhhcyBiZWVuIGluY3JlbWVudGVkLAorCSAqIGZvciBwcm9wZXIgam91cm5hbCBiYXJyaWVyIGhhbmRsaW5nCisJICovCisJc3Bpbl9sb2NrKCZqb3VybmFsLT5qX3N0YXRlX2xvY2spOworcmVwZWF0X2xvY2tlZDoKKwlpZiAoaXNfam91cm5hbF9hYm9ydGVkKGpvdXJuYWwpIHx8CisJICAgIChqb3VybmFsLT5qX2Vycm5vICE9IDAgJiYgIShqb3VybmFsLT5qX2ZsYWdzICYgSkJEMl9BQ0tfRVJSKSkpIHsKKwkJc3Bpbl91bmxvY2soJmpvdXJuYWwtPmpfc3RhdGVfbG9jayk7CisJCXJldCA9IC1FUk9GUzsKKwkJZ290byBvdXQ7CisJfQorCisJLyogV2FpdCBvbiB0aGUgam91cm5hbCdzIHRyYW5zYWN0aW9uIGJhcnJpZXIgaWYgbmVjZXNzYXJ5ICovCisJaWYgKGpvdXJuYWwtPmpfYmFycmllcl9jb3VudCkgeworCQlzcGluX3VubG9jaygmam91cm5hbC0+al9zdGF0ZV9sb2NrKTsKKwkJd2FpdF9ldmVudChqb3VybmFsLT5qX3dhaXRfdHJhbnNhY3Rpb25fbG9ja2VkLAorCQkJCWpvdXJuYWwtPmpfYmFycmllcl9jb3VudCA9PSAwKTsKKwkJZ290byByZXBlYXQ7CisJfQorCisJaWYgKCFqb3VybmFsLT5qX3J1bm5pbmdfdHJhbnNhY3Rpb24pIHsKKwkJaWYgKCFuZXdfdHJhbnNhY3Rpb24pIHsKKwkJCXNwaW5fdW5sb2NrKCZqb3VybmFsLT5qX3N0YXRlX2xvY2spOworCQkJZ290byBhbGxvY190cmFuc2FjdGlvbjsKKwkJfQorCQlqYmQyX2dldF90cmFuc2FjdGlvbihqb3VybmFsLCBuZXdfdHJhbnNhY3Rpb24pOworCQluZXdfdHJhbnNhY3Rpb24gPSBOVUxMOworCX0KKworCXRyYW5zYWN0aW9uID0gam91cm5hbC0+al9ydW5uaW5nX3RyYW5zYWN0aW9uOworCisJLyoKKwkgKiBJZiB0aGUgY3VycmVudCB0cmFuc2FjdGlvbiBpcyBsb2NrZWQgZG93biBmb3IgY29tbWl0LCB3YWl0IGZvciB0aGUKKwkgKiBsb2NrIHRvIGJlIHJlbGVhc2VkLgorCSAqLworCWlmICh0cmFuc2FjdGlvbi0+dF9zdGF0ZSA9PSBUX0xPQ0tFRCkgeworCQlERUZJTkVfV0FJVCh3YWl0KTsKKworCQlwcmVwYXJlX3RvX3dhaXQoJmpvdXJuYWwtPmpfd2FpdF90cmFuc2FjdGlvbl9sb2NrZWQsCisJCQkJCSZ3YWl0LCBUQVNLX1VOSU5URVJSVVBUSUJMRSk7CisJCXNwaW5fdW5sb2NrKCZqb3VybmFsLT5qX3N0YXRlX2xvY2spOworCQlzY2hlZHVsZSgpOworCQlmaW5pc2hfd2FpdCgmam91cm5hbC0+al93YWl0X3RyYW5zYWN0aW9uX2xvY2tlZCwgJndhaXQpOworCQlnb3RvIHJlcGVhdDsKKwl9CisKKwkvKgorCSAqIElmIHRoZXJlIGlzIG5vdCBlbm91Z2ggc3BhY2UgbGVmdCBpbiB0aGUgbG9nIHRvIHdyaXRlIGFsbCBwb3RlbnRpYWwKKwkgKiBidWZmZXJzIHJlcXVlc3RlZCBieSB0aGlzIG9wZXJhdGlvbiwgd2UgbmVlZCB0byBzdGFsbCBwZW5kaW5nIGEgbG9nCisJICogY2hlY2twb2ludCB0byBmcmVlIHNvbWUgbW9yZSBsb2cgc3BhY2UuCisJICovCisJc3Bpbl9sb2NrKCZ0cmFuc2FjdGlvbi0+dF9oYW5kbGVfbG9jayk7CisJbmVlZGVkID0gdHJhbnNhY3Rpb24tPnRfb3V0c3RhbmRpbmdfY3JlZGl0cyArIG5ibG9ja3M7CisKKwlpZiAobmVlZGVkID4gam91cm5hbC0+al9tYXhfdHJhbnNhY3Rpb25fYnVmZmVycykgeworCQkvKgorCQkgKiBJZiB0aGUgY3VycmVudCB0cmFuc2FjdGlvbiBpcyBhbHJlYWR5IHRvbyBsYXJnZSwgdGhlbiBzdGFydAorCQkgKiB0byBjb21taXQgaXQ6IHdlIGNhbiB0aGVuIGdvIGJhY2sgYW5kIGF0dGFjaCB0aGlzIGhhbmRsZSB0bworCQkgKiBhIG5ldyB0cmFuc2FjdGlvbi4KKwkJICovCisJCURFRklORV9XQUlUKHdhaXQpOworCisJCWpiZF9kZWJ1ZygyLCAiSGFuZGxlICVwIHN0YXJ0aW5nIG5ldyBjb21taXQuLi5cbiIsIGhhbmRsZSk7CisJCXNwaW5fdW5sb2NrKCZ0cmFuc2FjdGlvbi0+dF9oYW5kbGVfbG9jayk7CisJCXByZXBhcmVfdG9fd2FpdCgmam91cm5hbC0+al93YWl0X3RyYW5zYWN0aW9uX2xvY2tlZCwgJndhaXQsCisJCQkJVEFTS19VTklOVEVSUlVQVElCTEUpOworCQlfX2piZDJfbG9nX3N0YXJ0X2NvbW1pdChqb3VybmFsLCB0cmFuc2FjdGlvbi0+dF90aWQpOworCQlzcGluX3VubG9jaygmam91cm5hbC0+al9zdGF0ZV9sb2NrKTsKKwkJc2NoZWR1bGUoKTsKKwkJZmluaXNoX3dhaXQoJmpvdXJuYWwtPmpfd2FpdF90cmFuc2FjdGlvbl9sb2NrZWQsICZ3YWl0KTsKKwkJZ290byByZXBlYXQ7CisJfQorCisJLyoKKwkgKiBUaGUgY29tbWl0IGNvZGUgYXNzdW1lcyB0aGF0IGl0IGNhbiBnZXQgZW5vdWdoIGxvZyBzcGFjZQorCSAqIHdpdGhvdXQgZm9yY2luZyBhIGNoZWNrcG9pbnQuICBUaGlzIGlzICpjcml0aWNhbCogZm9yCisJICogY29ycmVjdG5lc3M6IGEgY2hlY2twb2ludCBvZiBhIGJ1ZmZlciB3aGljaCBpcyBhbHNvCisJICogYXNzb2NpYXRlZCB3aXRoIGEgY29tbWl0dGluZyB0cmFuc2FjdGlvbiBjcmVhdGVzIGEgZGVhZGxvY2ssCisJICogc28gY29tbWl0IHNpbXBseSBjYW5ub3QgZm9yY2UgdGhyb3VnaCBjaGVja3BvaW50cy4KKwkgKgorCSAqIFdlIG11c3QgdGhlcmVmb3JlIGVuc3VyZSB0aGUgbmVjZXNzYXJ5IHNwYWNlIGluIHRoZSBqb3VybmFsCisJICogKmJlZm9yZSogc3RhcnRpbmcgdG8gZGlydHkgcG90ZW50aWFsbHkgY2hlY2twb2ludGVkIGJ1ZmZlcnMKKwkgKiBpbiB0aGUgbmV3IHRyYW5zYWN0aW9uLgorCSAqCisJICogVGhlIHdvcnN0IHBhcnQgaXMsIGFueSB0cmFuc2FjdGlvbiBjdXJyZW50bHkgY29tbWl0dGluZyBjYW4KKwkgKiByZWR1Y2UgdGhlIGZyZWUgc3BhY2UgYXJiaXRyYXJpbHkuICBCZSBjYXJlZnVsIHRvIGFjY291bnQgZm9yCisJICogdGhvc2UgYnVmZmVycyB3aGVuIGNoZWNrcG9pbnRpbmcuCisJICovCisKKwkvKgorCSAqIEBAQCBBS1BNOiBUaGlzIHNlZW1zIHJhdGhlciBvdmVyLWRlZmVuc2l2ZS4gIFdlJ3JlIGdpdmluZyBjb21taXQKKwkgKiBhIF9sb3RfIG9mIGhlYWRyb29tOiAxLzQgb2YgdGhlIGpvdXJuYWwgcGx1cyB0aGUgc2l6ZSBvZgorCSAqIHRoZSBjb21taXR0aW5nIHRyYW5zYWN0aW9uLiAgUmVhbGx5LCB3ZSBvbmx5IG5lZWQgdG8gZ2l2ZSBpdAorCSAqIGNvbW1pdHRpbmdfdHJhbnNhY3Rpb24tPnRfb3V0c3RhbmRpbmdfY3JlZGl0cyBwbHVzICJlbm91Z2giIGZvcgorCSAqIHRoZSBsb2cgY29udHJvbCBibG9ja3MuCisJICogQWxzbywgdGhpcyB0ZXN0IGlzIGluY29uc2l0ZW50IHdpdGggdGhlIG1hdGNoaW5nIG9uZSBpbgorCSAqIGpiZDJfam91cm5hbF9leHRlbmQoKS4KKwkgKi8KKwlpZiAoX19qYmQyX2xvZ19zcGFjZV9sZWZ0KGpvdXJuYWwpIDwgamJkX3NwYWNlX25lZWRlZChqb3VybmFsKSkgeworCQlqYmRfZGVidWcoMiwgIkhhbmRsZSAlcCB3YWl0aW5nIGZvciBjaGVja3BvaW50Li4uXG4iLCBoYW5kbGUpOworCQlzcGluX3VubG9jaygmdHJhbnNhY3Rpb24tPnRfaGFuZGxlX2xvY2spOworCQlfX2piZDJfbG9nX3dhaXRfZm9yX3NwYWNlKGpvdXJuYWwpOworCQlnb3RvIHJlcGVhdF9sb2NrZWQ7CisJfQorCisJLyogT0ssIGFjY291bnQgZm9yIHRoZSBidWZmZXJzIHRoYXQgdGhpcyBvcGVyYXRpb24gZXhwZWN0cyB0bworCSAqIHVzZSBhbmQgYWRkIHRoZSBoYW5kbGUgdG8gdGhlIHJ1bm5pbmcgdHJhbnNhY3Rpb24uICovCisKKwloYW5kbGUtPmhfdHJhbnNhY3Rpb24gPSB0cmFuc2FjdGlvbjsKKwl0cmFuc2FjdGlvbi0+dF9vdXRzdGFuZGluZ19jcmVkaXRzICs9IG5ibG9ja3M7CisJdHJhbnNhY3Rpb24tPnRfdXBkYXRlcysrOworCXRyYW5zYWN0aW9uLT50X2hhbmRsZV9jb3VudCsrOworCWpiZF9kZWJ1Zyg0LCAiSGFuZGxlICVwIGdpdmVuICVkIGNyZWRpdHMgKHRvdGFsICVkLCBmcmVlICVkKVxuIiwKKwkJICBoYW5kbGUsIG5ibG9ja3MsIHRyYW5zYWN0aW9uLT50X291dHN0YW5kaW5nX2NyZWRpdHMsCisJCSAgX19qYmQyX2xvZ19zcGFjZV9sZWZ0KGpvdXJuYWwpKTsKKwlzcGluX3VubG9jaygmdHJhbnNhY3Rpb24tPnRfaGFuZGxlX2xvY2spOworCXNwaW5fdW5sb2NrKCZqb3VybmFsLT5qX3N0YXRlX2xvY2spOworb3V0OgorCWlmICh1bmxpa2VseShuZXdfdHJhbnNhY3Rpb24pKQkJLyogSXQncyB1c3VhbGx5IE5VTEwgKi8KKwkJa2ZyZWUobmV3X3RyYW5zYWN0aW9uKTsKKwlyZXR1cm4gcmV0OworfQorCisvKiBBbGxvY2F0ZSBhIG5ldyBoYW5kbGUuICBUaGlzIHNob3VsZCBwcm9iYWJseSBiZSBpbiBhIHNsYWIuLi4gKi8KK3N0YXRpYyBoYW5kbGVfdCAqbmV3X2hhbmRsZShpbnQgbmJsb2NrcykKK3sKKwloYW5kbGVfdCAqaGFuZGxlID0gamJkX2FsbG9jX2hhbmRsZShHRlBfTk9GUyk7CisJaWYgKCFoYW5kbGUpCisJCXJldHVybiBOVUxMOworCW1lbXNldChoYW5kbGUsIDAsIHNpemVvZigqaGFuZGxlKSk7CisJaGFuZGxlLT5oX2J1ZmZlcl9jcmVkaXRzID0gbmJsb2NrczsKKwloYW5kbGUtPmhfcmVmID0gMTsKKworCXJldHVybiBoYW5kbGU7Cit9CisKKy8qKgorICogaGFuZGxlX3QgKmpiZDJfam91cm5hbF9zdGFydCgpIC0gT2J0YWluIGEgbmV3IGhhbmRsZS4KKyAqIEBqb3VybmFsOiBKb3VybmFsIHRvIHN0YXJ0IHRyYW5zYWN0aW9uIG9uLgorICogQG5ibG9ja3M6IG51bWJlciBvZiBibG9jayBidWZmZXIgd2UgbWlnaHQgbW9kaWZ5CisgKgorICogV2UgbWFrZSBzdXJlIHRoYXQgdGhlIHRyYW5zYWN0aW9uIGNhbiBndWFyYW50ZWUgYXQgbGVhc3QgbmJsb2NrcyBvZgorICogbW9kaWZpZWQgYnVmZmVycyBpbiB0aGUgbG9nLiAgV2UgYmxvY2sgdW50aWwgdGhlIGxvZyBjYW4gZ3VhcmFudGVlCisgKiB0aGF0IG11Y2ggc3BhY2UuCisgKgorICogVGhpcyBmdW5jdGlvbiBpcyB2aXNpYmxlIHRvIGpvdXJuYWwgdXNlcnMgKGxpa2UgZXh0M2ZzKSwgc28gaXMgbm90CisgKiBjYWxsZWQgd2l0aCB0aGUgam91cm5hbCBhbHJlYWR5IGxvY2tlZC4KKyAqCisgKiBSZXR1cm4gYSBwb2ludGVyIHRvIGEgbmV3bHkgYWxsb2NhdGVkIGhhbmRsZSwgb3IgTlVMTCBvbiBmYWlsdXJlCisgKi8KK2hhbmRsZV90ICpqYmQyX2pvdXJuYWxfc3RhcnQoam91cm5hbF90ICpqb3VybmFsLCBpbnQgbmJsb2NrcykKK3sKKwloYW5kbGVfdCAqaGFuZGxlID0gam91cm5hbF9jdXJyZW50X2hhbmRsZSgpOworCWludCBlcnI7CisKKwlpZiAoIWpvdXJuYWwpCisJCXJldHVybiBFUlJfUFRSKC1FUk9GUyk7CisKKwlpZiAoaGFuZGxlKSB7CisJCUpfQVNTRVJUKGhhbmRsZS0+aF90cmFuc2FjdGlvbi0+dF9qb3VybmFsID09IGpvdXJuYWwpOworCQloYW5kbGUtPmhfcmVmKys7CisJCXJldHVybiBoYW5kbGU7CisJfQorCisJaGFuZGxlID0gbmV3X2hhbmRsZShuYmxvY2tzKTsKKwlpZiAoIWhhbmRsZSkKKwkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CisKKwljdXJyZW50LT5qb3VybmFsX2luZm8gPSBoYW5kbGU7CisKKwllcnIgPSBzdGFydF90aGlzX2hhbmRsZShqb3VybmFsLCBoYW5kbGUpOworCWlmIChlcnIgPCAwKSB7CisJCWpiZF9mcmVlX2hhbmRsZShoYW5kbGUpOworCQljdXJyZW50LT5qb3VybmFsX2luZm8gPSBOVUxMOworCQloYW5kbGUgPSBFUlJfUFRSKGVycik7CisJfQorCXJldHVybiBoYW5kbGU7Cit9CisKKy8qKgorICogaW50IGpiZDJfam91cm5hbF9leHRlbmQoKSAtIGV4dGVuZCBidWZmZXIgY3JlZGl0cy4KKyAqIEBoYW5kbGU6ICBoYW5kbGUgdG8gJ2V4dGVuZCcKKyAqIEBuYmxvY2tzOiBuciBibG9ja3MgdG8gdHJ5IHRvIGV4dGVuZCBieS4KKyAqCisgKiBTb21lIHRyYW5zYWN0aW9ucywgc3VjaCBhcyBsYXJnZSBleHRlbmRzIGFuZCB0cnVuY2F0ZXMsIGNhbiBiZSBkb25lCisgKiBhdG9taWNhbGx5IGFsbCBhdCBvbmNlIG9yIGluIHNldmVyYWwgc3RhZ2VzLiAgVGhlIG9wZXJhdGlvbiByZXF1ZXN0cworICogYSBjcmVkaXQgZm9yIGEgbnVtYmVyIG9mIGJ1ZmZlciBtb2RpY2F0aW9ucyBpbiBhZHZhbmNlLCBidXQgY2FuCisgKiBleHRlbmQgaXRzIGNyZWRpdCBpZiBpdCBuZWVkcyBtb3JlLgorICoKKyAqIGpiZDJfam91cm5hbF9leHRlbmQgdHJpZXMgdG8gZ2l2ZSB0aGUgcnVubmluZyBoYW5kbGUgbW9yZSBidWZmZXIgY3JlZGl0cy4KKyAqIEl0IGRvZXMgbm90IGd1YXJhbnRlZSB0aGF0IGFsbG9jYXRpb24gLSB0aGlzIGlzIGEgYmVzdC1lZmZvcnQgb25seS4KKyAqIFRoZSBjYWxsaW5nIHByb2Nlc3MgTVVTVCBiZSBhYmxlIHRvIGRlYWwgY2xlYW5seSB3aXRoIGEgZmFpbHVyZSB0bworICogZXh0ZW5kIGhlcmUuCisgKgorICogUmV0dXJuIDAgb24gc3VjY2Vzcywgbm9uLXplcm8gb24gZmFpbHVyZS4KKyAqCisgKiByZXR1cm4gY29kZSA8IDAgaW1wbGllcyBhbiBlcnJvcgorICogcmV0dXJuIGNvZGUgPiAwIGltcGxpZXMgbm9ybWFsIHRyYW5zYWN0aW9uLWZ1bGwgc3RhdHVzLgorICovCitpbnQgamJkMl9qb3VybmFsX2V4dGVuZChoYW5kbGVfdCAqaGFuZGxlLCBpbnQgbmJsb2NrcykKK3sKKwl0cmFuc2FjdGlvbl90ICp0cmFuc2FjdGlvbiA9IGhhbmRsZS0+aF90cmFuc2FjdGlvbjsKKwlqb3VybmFsX3QgKmpvdXJuYWwgPSB0cmFuc2FjdGlvbi0+dF9qb3VybmFsOworCWludCByZXN1bHQ7CisJaW50IHdhbnRlZDsKKworCXJlc3VsdCA9IC1FSU87CisJaWYgKGlzX2hhbmRsZV9hYm9ydGVkKGhhbmRsZSkpCisJCWdvdG8gb3V0OworCisJcmVzdWx0ID0gMTsKKworCXNwaW5fbG9jaygmam91cm5hbC0+al9zdGF0ZV9sb2NrKTsKKworCS8qIERvbid0IGV4dGVuZCBhIGxvY2tlZC1kb3duIHRyYW5zYWN0aW9uISAqLworCWlmIChoYW5kbGUtPmhfdHJhbnNhY3Rpb24tPnRfc3RhdGUgIT0gVF9SVU5OSU5HKSB7CisJCWpiZF9kZWJ1ZygzLCAiZGVuaWVkIGhhbmRsZSAlcCAlZCBibG9ja3M6ICIKKwkJCSAgInRyYW5zYWN0aW9uIG5vdCBydW5uaW5nXG4iLCBoYW5kbGUsIG5ibG9ja3MpOworCQlnb3RvIGVycm9yX291dDsKKwl9CisKKwlzcGluX2xvY2soJnRyYW5zYWN0aW9uLT50X2hhbmRsZV9sb2NrKTsKKwl3YW50ZWQgPSB0cmFuc2FjdGlvbi0+dF9vdXRzdGFuZGluZ19jcmVkaXRzICsgbmJsb2NrczsKKworCWlmICh3YW50ZWQgPiBqb3VybmFsLT5qX21heF90cmFuc2FjdGlvbl9idWZmZXJzKSB7CisJCWpiZF9kZWJ1ZygzLCAiZGVuaWVkIGhhbmRsZSAlcCAlZCBibG9ja3M6ICIKKwkJCSAgInRyYW5zYWN0aW9uIHRvbyBsYXJnZVxuIiwgaGFuZGxlLCBuYmxvY2tzKTsKKwkJZ290byB1bmxvY2s7CisJfQorCisJaWYgKHdhbnRlZCA+IF9famJkMl9sb2dfc3BhY2VfbGVmdChqb3VybmFsKSkgeworCQlqYmRfZGVidWcoMywgImRlbmllZCBoYW5kbGUgJXAgJWQgYmxvY2tzOiAiCisJCQkgICJpbnN1ZmZpY2llbnQgbG9nIHNwYWNlXG4iLCBoYW5kbGUsIG5ibG9ja3MpOworCQlnb3RvIHVubG9jazsKKwl9CisKKwloYW5kbGUtPmhfYnVmZmVyX2NyZWRpdHMgKz0gbmJsb2NrczsKKwl0cmFuc2FjdGlvbi0+dF9vdXRzdGFuZGluZ19jcmVkaXRzICs9IG5ibG9ja3M7CisJcmVzdWx0ID0gMDsKKworCWpiZF9kZWJ1ZygzLCAiZXh0ZW5kZWQgaGFuZGxlICVwIGJ5ICVkXG4iLCBoYW5kbGUsIG5ibG9ja3MpOwordW5sb2NrOgorCXNwaW5fdW5sb2NrKCZ0cmFuc2FjdGlvbi0+dF9oYW5kbGVfbG9jayk7CitlcnJvcl9vdXQ6CisJc3Bpbl91bmxvY2soJmpvdXJuYWwtPmpfc3RhdGVfbG9jayk7CitvdXQ6CisJcmV0dXJuIHJlc3VsdDsKK30KKworCisvKioKKyAqIGludCBqYmQyX2pvdXJuYWxfcmVzdGFydCgpIC0gcmVzdGFydCBhIGhhbmRsZSAuCisgKiBAaGFuZGxlOiAgaGFuZGxlIHRvIHJlc3RhcnQKKyAqIEBuYmxvY2tzOiBuciBjcmVkaXRzIHJlcXVlc3RlZAorICoKKyAqIFJlc3RhcnQgYSBoYW5kbGUgZm9yIGEgbXVsdGktdHJhbnNhY3Rpb24gZmlsZXN5c3RlbQorICogb3BlcmF0aW9uLgorICoKKyAqIElmIHRoZSBqYmQyX2pvdXJuYWxfZXh0ZW5kKCkgY2FsbCBhYm92ZSBmYWlscyB0byBncmFudCBuZXcgYnVmZmVyIGNyZWRpdHMKKyAqIHRvIGEgcnVubmluZyBoYW5kbGUsIGEgY2FsbCB0byBqYmQyX2pvdXJuYWxfcmVzdGFydCB3aWxsIGNvbW1pdCB0aGUKKyAqIGhhbmRsZSdzIHRyYW5zYWN0aW9uIHNvIGZhciBhbmQgcmVhdHRhY2ggdGhlIGhhbmRsZSB0byBhIG5ldworICogdHJhbnNhY3Rpb24gY2FwYWJhYmxlIG9mIGd1YXJhbnRlZWluZyB0aGUgcmVxdWVzdGVkIG51bWJlciBvZgorICogY3JlZGl0cy4KKyAqLworCitpbnQgamJkMl9qb3VybmFsX3Jlc3RhcnQoaGFuZGxlX3QgKmhhbmRsZSwgaW50IG5ibG9ja3MpCit7CisJdHJhbnNhY3Rpb25fdCAqdHJhbnNhY3Rpb24gPSBoYW5kbGUtPmhfdHJhbnNhY3Rpb247CisJam91cm5hbF90ICpqb3VybmFsID0gdHJhbnNhY3Rpb24tPnRfam91cm5hbDsKKwlpbnQgcmV0OworCisJLyogSWYgd2UndmUgaGFkIGFuIGFib3J0IG9mIGFueSB0eXBlLCBkb24ndCBldmVuIHRoaW5rIGFib3V0CisJICogYWN0dWFsbHkgZG9pbmcgdGhlIHJlc3RhcnQhICovCisJaWYgKGlzX2hhbmRsZV9hYm9ydGVkKGhhbmRsZSkpCisJCXJldHVybiAwOworCisJLyoKKwkgKiBGaXJzdCB1bmxpbmsgdGhlIGhhbmRsZSBmcm9tIGl0cyBjdXJyZW50IHRyYW5zYWN0aW9uLCBhbmQgc3RhcnQgdGhlCisJICogY29tbWl0IG9uIHRoYXQuCisJICovCisJSl9BU1NFUlQodHJhbnNhY3Rpb24tPnRfdXBkYXRlcyA+IDApOworCUpfQVNTRVJUKGpvdXJuYWxfY3VycmVudF9oYW5kbGUoKSA9PSBoYW5kbGUpOworCisJc3Bpbl9sb2NrKCZqb3VybmFsLT5qX3N0YXRlX2xvY2spOworCXNwaW5fbG9jaygmdHJhbnNhY3Rpb24tPnRfaGFuZGxlX2xvY2spOworCXRyYW5zYWN0aW9uLT50X291dHN0YW5kaW5nX2NyZWRpdHMgLT0gaGFuZGxlLT5oX2J1ZmZlcl9jcmVkaXRzOworCXRyYW5zYWN0aW9uLT50X3VwZGF0ZXMtLTsKKworCWlmICghdHJhbnNhY3Rpb24tPnRfdXBkYXRlcykKKwkJd2FrZV91cCgmam91cm5hbC0+al93YWl0X3VwZGF0ZXMpOworCXNwaW5fdW5sb2NrKCZ0cmFuc2FjdGlvbi0+dF9oYW5kbGVfbG9jayk7CisKKwlqYmRfZGVidWcoMiwgInJlc3RhcnRpbmcgaGFuZGxlICVwXG4iLCBoYW5kbGUpOworCV9famJkMl9sb2dfc3RhcnRfY29tbWl0KGpvdXJuYWwsIHRyYW5zYWN0aW9uLT50X3RpZCk7CisJc3Bpbl91bmxvY2soJmpvdXJuYWwtPmpfc3RhdGVfbG9jayk7CisKKwloYW5kbGUtPmhfYnVmZmVyX2NyZWRpdHMgPSBuYmxvY2tzOworCXJldCA9IHN0YXJ0X3RoaXNfaGFuZGxlKGpvdXJuYWwsIGhhbmRsZSk7CisJcmV0dXJuIHJldDsKK30KKworCisvKioKKyAqIHZvaWQgamJkMl9qb3VybmFsX2xvY2tfdXBkYXRlcyAoKSAtIGVzdGFibGlzaCBhIHRyYW5zYWN0aW9uIGJhcnJpZXIuCisgKiBAam91cm5hbDogIEpvdXJuYWwgdG8gZXN0YWJsaXNoIGEgYmFycmllciBvbi4KKyAqCisgKiBUaGlzIGxvY2tzIG91dCBhbnkgZnVydGhlciB1cGRhdGVzIGZyb20gYmVpbmcgc3RhcnRlZCwgYW5kIGJsb2NrcworICogdW50aWwgYWxsIGV4aXN0aW5nIHVwZGF0ZXMgaGF2ZSBjb21wbGV0ZWQsIHJldHVybmluZyBvbmx5IG9uY2UgdGhlCisgKiBqb3VybmFsIGlzIGluIGEgcXVpZXNjZW50IHN0YXRlIHdpdGggbm8gdXBkYXRlcyBydW5uaW5nLgorICoKKyAqIFRoZSBqb3VybmFsIGxvY2sgc2hvdWxkIG5vdCBiZSBoZWxkIG9uIGVudHJ5LgorICovCit2b2lkIGpiZDJfam91cm5hbF9sb2NrX3VwZGF0ZXMoam91cm5hbF90ICpqb3VybmFsKQoreworCURFRklORV9XQUlUKHdhaXQpOworCisJc3Bpbl9sb2NrKCZqb3VybmFsLT5qX3N0YXRlX2xvY2spOworCSsram91cm5hbC0+al9iYXJyaWVyX2NvdW50OworCisJLyogV2FpdCB1bnRpbCB0aGVyZSBhcmUgbm8gcnVubmluZyB1cGRhdGVzICovCisJd2hpbGUgKDEpIHsKKwkJdHJhbnNhY3Rpb25fdCAqdHJhbnNhY3Rpb24gPSBqb3VybmFsLT5qX3J1bm5pbmdfdHJhbnNhY3Rpb247CisKKwkJaWYgKCF0cmFuc2FjdGlvbikKKwkJCWJyZWFrOworCisJCXNwaW5fbG9jaygmdHJhbnNhY3Rpb24tPnRfaGFuZGxlX2xvY2spOworCQlpZiAoIXRyYW5zYWN0aW9uLT50X3VwZGF0ZXMpIHsKKwkJCXNwaW5fdW5sb2NrKCZ0cmFuc2FjdGlvbi0+dF9oYW5kbGVfbG9jayk7CisJCQlicmVhazsKKwkJfQorCQlwcmVwYXJlX3RvX3dhaXQoJmpvdXJuYWwtPmpfd2FpdF91cGRhdGVzLCAmd2FpdCwKKwkJCQlUQVNLX1VOSU5URVJSVVBUSUJMRSk7CisJCXNwaW5fdW5sb2NrKCZ0cmFuc2FjdGlvbi0+dF9oYW5kbGVfbG9jayk7CisJCXNwaW5fdW5sb2NrKCZqb3VybmFsLT5qX3N0YXRlX2xvY2spOworCQlzY2hlZHVsZSgpOworCQlmaW5pc2hfd2FpdCgmam91cm5hbC0+al93YWl0X3VwZGF0ZXMsICZ3YWl0KTsKKwkJc3Bpbl9sb2NrKCZqb3VybmFsLT5qX3N0YXRlX2xvY2spOworCX0KKwlzcGluX3VubG9jaygmam91cm5hbC0+al9zdGF0ZV9sb2NrKTsKKworCS8qCisJICogV2UgaGF2ZSBub3cgZXN0YWJsaXNoZWQgYSBiYXJyaWVyIGFnYWluc3Qgb3RoZXIgbm9ybWFsIHVwZGF0ZXMsIGJ1dAorCSAqIHdlIGFsc28gbmVlZCB0byBiYXJyaWVyIGFnYWluc3Qgb3RoZXIgamJkMl9qb3VybmFsX2xvY2tfdXBkYXRlcygpIGNhbGxzCisJICogdG8gbWFrZSBzdXJlIHRoYXQgd2Ugc2VyaWFsaXNlIHNwZWNpYWwgam91cm5hbC1sb2NrZWQgb3BlcmF0aW9ucworCSAqIHRvby4KKwkgKi8KKwltdXRleF9sb2NrKCZqb3VybmFsLT5qX2JhcnJpZXIpOworfQorCisvKioKKyAqIHZvaWQgamJkMl9qb3VybmFsX3VubG9ja191cGRhdGVzIChqb3VybmFsX3QqIGpvdXJuYWwpIC0gcmVsZWFzZSBiYXJyaWVyCisgKiBAam91cm5hbDogIEpvdXJuYWwgdG8gcmVsZWFzZSB0aGUgYmFycmllciBvbi4KKyAqCisgKiBSZWxlYXNlIGEgdHJhbnNhY3Rpb24gYmFycmllciBvYnRhaW5lZCB3aXRoIGpiZDJfam91cm5hbF9sb2NrX3VwZGF0ZXMoKS4KKyAqCisgKiBTaG91bGQgYmUgY2FsbGVkIHdpdGhvdXQgdGhlIGpvdXJuYWwgbG9jayBoZWxkLgorICovCit2b2lkIGpiZDJfam91cm5hbF91bmxvY2tfdXBkYXRlcyAoam91cm5hbF90ICpqb3VybmFsKQoreworCUpfQVNTRVJUKGpvdXJuYWwtPmpfYmFycmllcl9jb3VudCAhPSAwKTsKKworCW11dGV4X3VubG9jaygmam91cm5hbC0+al9iYXJyaWVyKTsKKwlzcGluX2xvY2soJmpvdXJuYWwtPmpfc3RhdGVfbG9jayk7CisJLS1qb3VybmFsLT5qX2JhcnJpZXJfY291bnQ7CisJc3Bpbl91bmxvY2soJmpvdXJuYWwtPmpfc3RhdGVfbG9jayk7CisJd2FrZV91cCgmam91cm5hbC0+al93YWl0X3RyYW5zYWN0aW9uX2xvY2tlZCk7Cit9CisKKy8qCisgKiBSZXBvcnQgYW55IHVuZXhwZWN0ZWQgZGlydHkgYnVmZmVycyB3aGljaCB0dXJuIHVwLiAgTm9ybWFsbHkgdGhvc2UKKyAqIGluZGljYXRlIGFuIGVycm9yLCBidXQgdGhleSBjYW4gb2NjdXIgaWYgdGhlIHVzZXIgaXMgcnVubmluZyAoc2F5KQorICogdHVuZTJmcyB0byBtb2RpZnkgdGhlIGxpdmUgZmlsZXN5c3RlbSwgc28gd2UgbmVlZCB0aGUgb3B0aW9uIG9mCisgKiBjb250aW51aW5nIGFzIGdyYWNlZnVsbHkgYXMgcG9zc2libGUuICAjCisgKgorICogVGhlIGNhbGxlciBzaG91bGQgYWxyZWFkeSBob2xkIHRoZSBqb3VybmFsIGxvY2sgYW5kCisgKiBqX2xpc3RfbG9jayBzcGlubG9jazogbW9zdCBjYWxsZXJzIHdpbGwgbmVlZCB0aG9zZSBhbnl3YXkKKyAqIGluIG9yZGVyIHRvIHByb2JlIHRoZSBidWZmZXIncyBqb3VybmFsaW5nIHN0YXRlIHNhZmVseS4KKyAqLworc3RhdGljIHZvaWQgamJkX3VuZXhwZWN0ZWRfZGlydHlfYnVmZmVyKHN0cnVjdCBqb3VybmFsX2hlYWQgKmpoKQoreworCWludCBqbGlzdDsKKworCS8qIElmIHRoaXMgYnVmZmVyIGlzIG9uZSB3aGljaCBtaWdodCByZWFzb25hYmx5IGJlIGRpcnR5CisJICogLS0tIGllLiBkYXRhLCBvciBub3QgcGFydCBvZiB0aGlzIGpvdXJuYWwgLS0tIHRoZW4KKwkgKiB3ZSdyZSBPSyB0byBsZWF2ZSBpdCBhbG9uZSwgYnV0IG90aGVyd2lzZSB3ZSBuZWVkIHRvCisJICogbW92ZSB0aGUgZGlydHkgYml0IHRvIHRoZSBqb3VybmFsJ3Mgb3duIGludGVybmFsCisJICogSkJERGlydHkgYml0LiAqLworCWpsaXN0ID0gamgtPmJfamxpc3Q7CisKKwlpZiAoamxpc3QgPT0gQkpfTWV0YWRhdGEgfHwgamxpc3QgPT0gQkpfUmVzZXJ2ZWQgfHwKKwkgICAgamxpc3QgPT0gQkpfU2hhZG93IHx8IGpsaXN0ID09IEJKX0ZvcmdldCkgeworCQlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoID0gamgyYmgoamgpOworCisJCWlmICh0ZXN0X2NsZWFyX2J1ZmZlcl9kaXJ0eShiaCkpCisJCQlzZXRfYnVmZmVyX2piZGRpcnR5KGJoKTsKKwl9Cit9CisKKy8qCisgKiBJZiB0aGUgYnVmZmVyIGlzIGFscmVhZHkgcGFydCBvZiB0aGUgY3VycmVudCB0cmFuc2FjdGlvbiwgdGhlbiB0aGVyZQorICogaXMgbm90aGluZyB3ZSBuZWVkIHRvIGRvLiAgSWYgaXQgaXMgYWxyZWFkeSBwYXJ0IG9mIGEgcHJpb3IKKyAqIHRyYW5zYWN0aW9uIHdoaWNoIHdlIGFyZSBzdGlsbCBjb21taXR0aW5nIHRvIGRpc2ssIHRoZW4gd2UgbmVlZCB0bworICogbWFrZSBzdXJlIHRoYXQgd2UgZG8gbm90IG92ZXJ3cml0ZSB0aGUgb2xkIGNvcHk6IHdlIGRvIGNvcHktb3V0IHRvCisgKiBwcmVzZXJ2ZSB0aGUgY29weSBnb2luZyB0byBkaXNrLiAgV2UgYWxzbyBhY2NvdW50IHRoZSBidWZmZXIgYWdhaW5zdAorICogdGhlIGhhbmRsZSdzIG1ldGFkYXRhIGJ1ZmZlciBjcmVkaXRzICh1bmxlc3MgdGhlIGJ1ZmZlciBpcyBhbHJlYWR5CisgKiBwYXJ0IG9mIHRoZSB0cmFuc2FjdGlvbiwgdGhhdCBpcykuCisgKgorICovCitzdGF0aWMgaW50Citkb19nZXRfd3JpdGVfYWNjZXNzKGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBqb3VybmFsX2hlYWQgKmpoLAorCQkJaW50IGZvcmNlX2NvcHkpCit7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaDsKKwl0cmFuc2FjdGlvbl90ICp0cmFuc2FjdGlvbjsKKwlqb3VybmFsX3QgKmpvdXJuYWw7CisJaW50IGVycm9yOworCWNoYXIgKmZyb3plbl9idWZmZXIgPSBOVUxMOworCWludCBuZWVkX2NvcHkgPSAwOworCisJaWYgKGlzX2hhbmRsZV9hYm9ydGVkKGhhbmRsZSkpCisJCXJldHVybiAtRVJPRlM7CisKKwl0cmFuc2FjdGlvbiA9IGhhbmRsZS0+aF90cmFuc2FjdGlvbjsKKwlqb3VybmFsID0gdHJhbnNhY3Rpb24tPnRfam91cm5hbDsKKworCWpiZF9kZWJ1Zyg1LCAiYnVmZmVyX2hlYWQgJXAsIGZvcmNlX2NvcHkgJWRcbiIsIGpoLCBmb3JjZV9jb3B5KTsKKworCUpCVUZGRVJfVFJBQ0UoamgsICJlbnRyeSIpOworcmVwZWF0OgorCWJoID0gamgyYmgoamgpOworCisJLyogQEBAIE5lZWQgdG8gY2hlY2sgZm9yIGVycm9ycyBoZXJlIGF0IHNvbWUgcG9pbnQuICovCisKKwlsb2NrX2J1ZmZlcihiaCk7CisJamJkX2xvY2tfYmhfc3RhdGUoYmgpOworCisJLyogV2Ugbm93IGhvbGQgdGhlIGJ1ZmZlciBsb2NrIHNvIGl0IGlzIHNhZmUgdG8gcXVlcnkgdGhlIGJ1ZmZlcgorCSAqIHN0YXRlLiAgSXMgdGhlIGJ1ZmZlciBkaXJ0eT8KKwkgKgorCSAqIElmIHNvLCB0aGVyZSBhcmUgdHdvIHBvc3NpYmlsaXRpZXMuICBUaGUgYnVmZmVyIG1heSBiZQorCSAqIG5vbi1qb3VybmFsZWQsIGFuZCB1bmRlcmdvaW5nIGEgcXVpdGUgbGVnaXRpbWF0ZSB3cml0ZWJhY2suCisJICogT3RoZXJ3aXNlLCBpdCBpcyBqb3VybmFsZWQsIGFuZCB3ZSBkb24ndCBleHBlY3QgZGlydHkgYnVmZmVycworCSAqIGluIHRoYXQgc3RhdGUgKHRoZSBidWZmZXJzIHNob3VsZCBiZSBtYXJrZWQgSkJEX0RpcnR5CisJICogaW5zdGVhZC4pICBTbyBlaXRoZXIgdGhlIElPIGlzIGJlaW5nIGRvbmUgdW5kZXIgb3VyIG93bgorCSAqIGNvbnRyb2wgYW5kIHRoaXMgaXMgYSBidWcsIG9yIGl0J3MgYSB0aGlyZCBwYXJ0eSBJTyBzdWNoIGFzCisJICogZHVtcCg4KSAod2hpY2ggbWF5IGxlYXZlIHRoZSBidWZmZXIgc2NoZWR1bGVkIGZvciByZWFkIC0tLQorCSAqIGllLiBsb2NrZWQgYnV0IG5vdCBkaXJ0eSkgb3IgdHVuZTJmcyAod2hpY2ggbWF5IGFjdHVhbGx5IGhhdmUKKwkgKiB0aGUgYnVmZmVyIGRpcnRpZWQsIHVnaC4pICAqLworCisJaWYgKGJ1ZmZlcl9kaXJ0eShiaCkpIHsKKwkJLyoKKwkJICogRmlyc3QgcXVlc3Rpb246IGlzIHRoaXMgYnVmZmVyIGFscmVhZHkgcGFydCBvZiB0aGUgY3VycmVudAorCQkgKiB0cmFuc2FjdGlvbiBvciB0aGUgZXhpc3RpbmcgY29tbWl0dGluZyB0cmFuc2FjdGlvbj8KKwkJICovCisJCWlmIChqaC0+Yl90cmFuc2FjdGlvbikgeworCQkJSl9BU1NFUlRfSkgoamgsCisJCQkJamgtPmJfdHJhbnNhY3Rpb24gPT0gdHJhbnNhY3Rpb24gfHwKKwkJCQlqaC0+Yl90cmFuc2FjdGlvbiA9PQorCQkJCQlqb3VybmFsLT5qX2NvbW1pdHRpbmdfdHJhbnNhY3Rpb24pOworCQkJaWYgKGpoLT5iX25leHRfdHJhbnNhY3Rpb24pCisJCQkJSl9BU1NFUlRfSkgoamgsIGpoLT5iX25leHRfdHJhbnNhY3Rpb24gPT0KKwkJCQkJCQl0cmFuc2FjdGlvbik7CisJCX0KKwkJLyoKKwkJICogSW4gYW55IGNhc2Ugd2UgbmVlZCB0byBjbGVhbiB0aGUgZGlydHkgZmxhZyBhbmQgd2UgbXVzdAorCQkgKiBkbyBpdCB1bmRlciB0aGUgYnVmZmVyIGxvY2sgdG8gYmUgc3VyZSB3ZSBkb24ndCByYWNlCisJCSAqIHdpdGggcnVubmluZyB3cml0ZS1vdXQuCisJCSAqLworCQlKQlVGRkVSX1RSQUNFKGpoLCAiVW5leHBlY3RlZCBkaXJ0eSBidWZmZXIiKTsKKwkJamJkX3VuZXhwZWN0ZWRfZGlydHlfYnVmZmVyKGpoKTsKKwl9CisKKwl1bmxvY2tfYnVmZmVyKGJoKTsKKworCWVycm9yID0gLUVST0ZTOworCWlmIChpc19oYW5kbGVfYWJvcnRlZChoYW5kbGUpKSB7CisJCWpiZF91bmxvY2tfYmhfc3RhdGUoYmgpOworCQlnb3RvIG91dDsKKwl9CisJZXJyb3IgPSAwOworCisJLyoKKwkgKiBUaGUgYnVmZmVyIGlzIGFscmVhZHkgcGFydCBvZiB0aGlzIHRyYW5zYWN0aW9uIGlmIGJfdHJhbnNhY3Rpb24gb3IKKwkgKiBiX25leHRfdHJhbnNhY3Rpb24gcG9pbnRzIHRvIGl0CisJICovCisJaWYgKGpoLT5iX3RyYW5zYWN0aW9uID09IHRyYW5zYWN0aW9uIHx8CisJICAgIGpoLT5iX25leHRfdHJhbnNhY3Rpb24gPT0gdHJhbnNhY3Rpb24pCisJCWdvdG8gZG9uZTsKKworCS8qCisJICogSWYgdGhlcmUgaXMgYWxyZWFkeSBhIGNvcHktb3V0IHZlcnNpb24gb2YgdGhpcyBidWZmZXIsIHRoZW4gd2UgZG9uJ3QKKwkgKiBuZWVkIHRvIG1ha2UgYW5vdGhlciBvbmUKKwkgKi8KKwlpZiAoamgtPmJfZnJvemVuX2RhdGEpIHsKKwkJSkJVRkZFUl9UUkFDRShqaCwgImhhcyBmcm96ZW4gZGF0YSIpOworCQlKX0FTU0VSVF9KSChqaCwgamgtPmJfbmV4dF90cmFuc2FjdGlvbiA9PSBOVUxMKTsKKwkJamgtPmJfbmV4dF90cmFuc2FjdGlvbiA9IHRyYW5zYWN0aW9uOworCQlnb3RvIGRvbmU7CisJfQorCisJLyogSXMgdGhlcmUgZGF0YSBoZXJlIHdlIG5lZWQgdG8gcHJlc2VydmU/ICovCisKKwlpZiAoamgtPmJfdHJhbnNhY3Rpb24gJiYgamgtPmJfdHJhbnNhY3Rpb24gIT0gdHJhbnNhY3Rpb24pIHsKKwkJSkJVRkZFUl9UUkFDRShqaCwgIm93bmVkIGJ5IG9sZGVyIHRyYW5zYWN0aW9uIik7CisJCUpfQVNTRVJUX0pIKGpoLCBqaC0+Yl9uZXh0X3RyYW5zYWN0aW9uID09IE5VTEwpOworCQlKX0FTU0VSVF9KSChqaCwgamgtPmJfdHJhbnNhY3Rpb24gPT0KKwkJCQkJam91cm5hbC0+al9jb21taXR0aW5nX3RyYW5zYWN0aW9uKTsKKworCQkvKiBUaGVyZSBpcyBvbmUgY2FzZSB3ZSBoYXZlIHRvIGJlIHZlcnkgY2FyZWZ1bCBhYm91dC4KKwkJICogSWYgdGhlIGNvbW1pdHRpbmcgdHJhbnNhY3Rpb24gaXMgY3VycmVudGx5IHdyaXRpbmcKKwkJICogdGhpcyBidWZmZXIgb3V0IHRvIGRpc2sgYW5kIGhhcyBOT1QgbWFkZSBhIGNvcHktb3V0LAorCQkgKiB0aGVuIHdlIGNhbm5vdCBtb2RpZnkgdGhlIGJ1ZmZlciBjb250ZW50cyBhdCBhbGwKKwkJICogcmlnaHQgbm93LiAgVGhlIGVzc2VuY2Ugb2YgY29weS1vdXQgaXMgdGhhdCBpdCBpcyB0aGUKKwkJICogZXh0cmEgY29weSwgbm90IHRoZSBwcmltYXJ5IGNvcHksIHdoaWNoIGdldHMKKwkJICogam91cm5hbGVkLiAgSWYgdGhlIHByaW1hcnkgY29weSBpcyBhbHJlYWR5IGdvaW5nIHRvCisJCSAqIGRpc2sgdGhlbiB3ZSBjYW5ub3QgZG8gY29weS1vdXQgaGVyZS4gKi8KKworCQlpZiAoamgtPmJfamxpc3QgPT0gQkpfU2hhZG93KSB7CisJCQlERUZJTkVfV0FJVF9CSVQod2FpdCwgJmJoLT5iX3N0YXRlLCBCSF9VbnNoYWRvdyk7CisJCQl3YWl0X3F1ZXVlX2hlYWRfdCAqd3FoOworCisJCQl3cWggPSBiaXRfd2FpdHF1ZXVlKCZiaC0+Yl9zdGF0ZSwgQkhfVW5zaGFkb3cpOworCisJCQlKQlVGRkVSX1RSQUNFKGpoLCAib24gc2hhZG93OiBzbGVlcCIpOworCQkJamJkX3VubG9ja19iaF9zdGF0ZShiaCk7CisJCQkvKiBjb21taXQgd2FrZXMgdXAgYWxsIHNoYWRvdyBidWZmZXJzIGFmdGVyIElPICovCisJCQlmb3IgKCA7IDsgKSB7CisJCQkJcHJlcGFyZV90b193YWl0KHdxaCwgJndhaXQud2FpdCwKKwkJCQkJCVRBU0tfVU5JTlRFUlJVUFRJQkxFKTsKKwkJCQlpZiAoamgtPmJfamxpc3QgIT0gQkpfU2hhZG93KQorCQkJCQlicmVhazsKKwkJCQlzY2hlZHVsZSgpOworCQkJfQorCQkJZmluaXNoX3dhaXQod3FoLCAmd2FpdC53YWl0KTsKKwkJCWdvdG8gcmVwZWF0OworCQl9CisKKwkJLyogT25seSBkbyB0aGUgY29weSBpZiB0aGUgY3VycmVudGx5LW93bmluZyB0cmFuc2FjdGlvbgorCQkgKiBzdGlsbCBuZWVkcyBpdC4gIElmIGl0IGlzIG9uIHRoZSBGb3JnZXQgbGlzdCwgdGhlCisJCSAqIGNvbW1pdHRpbmcgdHJhbnNhY3Rpb24gaXMgcGFzdCB0aGF0IHN0YWdlLiAgVGhlCisJCSAqIGJ1ZmZlciBoYWQgYmV0dGVyIHJlbWFpbiBsb2NrZWQgZHVyaW5nIHRoZSBrbWFsbG9jLAorCQkgKiBidXQgdGhhdCBzaG91bGQgYmUgdHJ1ZSAtLS0gd2UgaG9sZCB0aGUgam91cm5hbCBsb2NrCisJCSAqIHN0aWxsIGFuZCB0aGUgYnVmZmVyIGlzIGFscmVhZHkgb24gdGhlIEJVRl9KT1VSTkFMCisJCSAqIGxpc3Qgc28gd29uJ3QgYmUgZmx1c2hlZC4KKwkJICoKKwkJICogU3VidGxlIHBvaW50LCB0aG91Z2g6IGlmIHRoaXMgaXMgYSBnZXRfdW5kb19hY2Nlc3MsCisJCSAqIHRoZW4gd2Ugd2lsbCBiZSByZWx5aW5nIG9uIHRoZSBmcm96ZW5fZGF0YSB0byBjb250YWluCisJCSAqIHRoZSBuZXcgdmFsdWUgb2YgdGhlIGNvbW1pdHRlZF9kYXRhIHJlY29yZCBhZnRlciB0aGUKKwkJICogdHJhbnNhY3Rpb24sIHNvIHdlIEhBVkUgdG8gZm9yY2UgdGhlIGZyb3plbl9kYXRhIGNvcHkKKwkJICogaW4gdGhhdCBjYXNlLiAqLworCisJCWlmIChqaC0+Yl9qbGlzdCAhPSBCSl9Gb3JnZXQgfHwgZm9yY2VfY29weSkgeworCQkJSkJVRkZFUl9UUkFDRShqaCwgImdlbmVyYXRlIGZyb3plbiBkYXRhIik7CisJCQlpZiAoIWZyb3plbl9idWZmZXIpIHsKKwkJCQlKQlVGRkVSX1RSQUNFKGpoLCAiYWxsb2NhdGUgbWVtb3J5IGZvciBidWZmZXIiKTsKKwkJCQlqYmRfdW5sb2NrX2JoX3N0YXRlKGJoKTsKKwkJCQlmcm96ZW5fYnVmZmVyID0KKwkJCQkJamJkMl9zbGFiX2FsbG9jKGpoMmJoKGpoKS0+Yl9zaXplLAorCQkJCQkJCSBHRlBfTk9GUyk7CisJCQkJaWYgKCFmcm96ZW5fYnVmZmVyKSB7CisJCQkJCXByaW50ayhLRVJOX0VNRVJHCisJCQkJCSAgICAgICAiJXM6IE9PTSBmb3IgZnJvemVuX2J1ZmZlclxuIiwKKwkJCQkJICAgICAgIF9fRlVOQ1RJT05fXyk7CisJCQkJCUpCVUZGRVJfVFJBQ0UoamgsICJvb20hIik7CisJCQkJCWVycm9yID0gLUVOT01FTTsKKwkJCQkJamJkX2xvY2tfYmhfc3RhdGUoYmgpOworCQkJCQlnb3RvIGRvbmU7CisJCQkJfQorCQkJCWdvdG8gcmVwZWF0OworCQkJfQorCQkJamgtPmJfZnJvemVuX2RhdGEgPSBmcm96ZW5fYnVmZmVyOworCQkJZnJvemVuX2J1ZmZlciA9IE5VTEw7CisJCQluZWVkX2NvcHkgPSAxOworCQl9CisJCWpoLT5iX25leHRfdHJhbnNhY3Rpb24gPSB0cmFuc2FjdGlvbjsKKwl9CisKKworCS8qCisJICogRmluYWxseSwgaWYgdGhlIGJ1ZmZlciBpcyBub3Qgam91cm5hbGVkIHJpZ2h0IG5vdywgd2UgbmVlZCB0byBtYWtlCisJICogc3VyZSBpdCBkb2Vzbid0IGdldCB3cml0dGVuIHRvIGRpc2sgYmVmb3JlIHRoZSBjYWxsZXIgYWN0dWFsbHkKKwkgKiBjb21taXRzIHRoZSBuZXcgZGF0YQorCSAqLworCWlmICghamgtPmJfdHJhbnNhY3Rpb24pIHsKKwkJSkJVRkZFUl9UUkFDRShqaCwgIm5vIHRyYW5zYWN0aW9uIik7CisJCUpfQVNTRVJUX0pIKGpoLCAhamgtPmJfbmV4dF90cmFuc2FjdGlvbik7CisJCWpoLT5iX3RyYW5zYWN0aW9uID0gdHJhbnNhY3Rpb247CisJCUpCVUZGRVJfVFJBQ0UoamgsICJmaWxlIGFzIEJKX1Jlc2VydmVkIik7CisJCXNwaW5fbG9jaygmam91cm5hbC0+al9saXN0X2xvY2spOworCQlfX2piZDJfam91cm5hbF9maWxlX2J1ZmZlcihqaCwgdHJhbnNhY3Rpb24sIEJKX1Jlc2VydmVkKTsKKwkJc3Bpbl91bmxvY2soJmpvdXJuYWwtPmpfbGlzdF9sb2NrKTsKKwl9CisKK2RvbmU6CisJaWYgKG5lZWRfY29weSkgeworCQlzdHJ1Y3QgcGFnZSAqcGFnZTsKKwkJaW50IG9mZnNldDsKKwkJY2hhciAqc291cmNlOworCisJCUpfRVhQRUNUX0pIKGpoLCBidWZmZXJfdXB0b2RhdGUoamgyYmgoamgpKSwKKwkJCSAgICAiUG9zc2libGUgSU8gZmFpbHVyZS5cbiIpOworCQlwYWdlID0gamgyYmgoamgpLT5iX3BhZ2U7CisJCW9mZnNldCA9ICgodW5zaWduZWQgbG9uZykgamgyYmgoamgpLT5iX2RhdGEpICYgflBBR0VfTUFTSzsKKwkJc291cmNlID0ga21hcF9hdG9taWMocGFnZSwgS01fVVNFUjApOworCQltZW1jcHkoamgtPmJfZnJvemVuX2RhdGEsIHNvdXJjZStvZmZzZXQsIGpoMmJoKGpoKS0+Yl9zaXplKTsKKwkJa3VubWFwX2F0b21pYyhzb3VyY2UsIEtNX1VTRVIwKTsKKwl9CisJamJkX3VubG9ja19iaF9zdGF0ZShiaCk7CisKKwkvKgorCSAqIElmIHdlIGFyZSBhYm91dCB0byBqb3VybmFsIGEgYnVmZmVyLCB0aGVuIGFueSByZXZva2UgcGVuZGluZyBvbiBpdCBpcworCSAqIG5vIGxvbmdlciB2YWxpZAorCSAqLworCWpiZDJfam91cm5hbF9jYW5jZWxfcmV2b2tlKGhhbmRsZSwgamgpOworCitvdXQ6CisJaWYgKHVubGlrZWx5KGZyb3plbl9idWZmZXIpKQkvKiBJdCdzIHVzdWFsbHkgTlVMTCAqLworCQlqYmQyX3NsYWJfZnJlZShmcm96ZW5fYnVmZmVyLCBiaC0+Yl9zaXplKTsKKworCUpCVUZGRVJfVFJBQ0UoamgsICJleGl0Iik7CisJcmV0dXJuIGVycm9yOworfQorCisvKioKKyAqIGludCBqYmQyX2pvdXJuYWxfZ2V0X3dyaXRlX2FjY2VzcygpIC0gbm90aWZ5IGludGVudCB0byBtb2RpZnkgYSBidWZmZXIgZm9yIG1ldGFkYXRhIChub3QgZGF0YSkgdXBkYXRlLgorICogQGhhbmRsZTogdHJhbnNhY3Rpb24gdG8gYWRkIGJ1ZmZlciBtb2RpZmljYXRpb25zIHRvCisgKiBAYmg6ICAgICBiaCB0byBiZSB1c2VkIGZvciBtZXRhZGF0YSB3cml0ZXMKKyAqIEBjcmVkaXRzOiB2YXJpYWJsZSB0aGF0IHdpbGwgcmVjZWl2ZSBjcmVkaXRzIGZvciB0aGUgYnVmZmVyCisgKgorICogUmV0dXJucyBhbiBlcnJvciBjb2RlIG9yIDAgb24gc3VjY2Vzcy4KKyAqCisgKiBJbiBmdWxsIGRhdGEgam91cm5hbGxpbmcgbW9kZSB0aGUgYnVmZmVyIG1heSBiZSBvZiB0eXBlIEJKX0FzeW5jRGF0YSwKKyAqIGJlY2F1c2Ugd2UncmUgd3JpdGUoKWluZyBhIGJ1ZmZlciB3aGljaCBpcyBhbHNvIHBhcnQgb2YgYSBzaGFyZWQgbWFwcGluZy4KKyAqLworCitpbnQgamJkMl9qb3VybmFsX2dldF93cml0ZV9hY2Nlc3MoaGFuZGxlX3QgKmhhbmRsZSwgc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCkKK3sKKwlzdHJ1Y3Qgam91cm5hbF9oZWFkICpqaCA9IGpiZDJfam91cm5hbF9hZGRfam91cm5hbF9oZWFkKGJoKTsKKwlpbnQgcmM7CisKKwkvKiBXZSBkbyBub3Qgd2FudCB0byBnZXQgY2F1Z2h0IHBsYXlpbmcgd2l0aCBmaWVsZHMgd2hpY2ggdGhlCisJICogbG9nIHRocmVhZCBhbHNvIG1hbmlwdWxhdGVzLiAgTWFrZSBzdXJlIHRoYXQgdGhlIGJ1ZmZlcgorCSAqIGNvbXBsZXRlcyBhbnkgb3V0c3RhbmRpbmcgSU8gYmVmb3JlIHByb2NlZWRpbmcuICovCisJcmMgPSBkb19nZXRfd3JpdGVfYWNjZXNzKGhhbmRsZSwgamgsIDApOworCWpiZDJfam91cm5hbF9wdXRfam91cm5hbF9oZWFkKGpoKTsKKwlyZXR1cm4gcmM7Cit9CisKKworLyoKKyAqIFdoZW4gdGhlIHVzZXIgd2FudHMgdG8gam91cm5hbCBhIG5ld2x5IGNyZWF0ZWQgYnVmZmVyX2hlYWQKKyAqIChpZS4gZ2V0YmxrKCkgcmV0dXJuZWQgYSBuZXcgYnVmZmVyIGFuZCB3ZSBhcmUgZ29pbmcgdG8gcG9wdWxhdGUgaXQKKyAqIG1hbnVhbGx5IHJhdGhlciB0aGFuIHJlYWRpbmcgb2ZmIGRpc2spLCB0aGVuIHdlIG5lZWQgdG8ga2VlcCB0aGUKKyAqIGJ1ZmZlcl9oZWFkIGxvY2tlZCB1bnRpbCBpdCBoYXMgYmVlbiBjb21wbGV0ZWx5IGZpbGxlZCB3aXRoIG5ldworICogZGF0YS4gIEluIHRoaXMgY2FzZSwgd2Ugc2hvdWxkIGJlIGFibGUgdG8gbWFrZSB0aGUgYXNzZXJ0aW9uIHRoYXQKKyAqIHRoZSBiaCBpcyBub3QgYWxyZWFkeSBwYXJ0IG9mIGFuIGV4aXN0aW5nIHRyYW5zYWN0aW9uLgorICoKKyAqIFRoZSBidWZmZXIgc2hvdWxkIGFscmVhZHkgYmUgbG9ja2VkIGJ5IHRoZSBjYWxsZXIgYnkgdGhpcyBwb2ludC4KKyAqIFRoZXJlIGlzIG5vIGxvY2sgcmFua2luZyB2aW9sYXRpb246IGl0IHdhcyBhIG5ld2x5IGNyZWF0ZWQsCisgKiB1bmxvY2tlZCBidWZmZXIgYmVmb3JlaGFuZC4gKi8KKworLyoqCisgKiBpbnQgamJkMl9qb3VybmFsX2dldF9jcmVhdGVfYWNjZXNzICgpIC0gbm90aWZ5IGludGVudCB0byB1c2UgbmV3bHkgY3JlYXRlZCBiaAorICogQGhhbmRsZTogdHJhbnNhY3Rpb24gdG8gbmV3IGJ1ZmZlciB0bworICogQGJoOiBuZXcgYnVmZmVyLgorICoKKyAqIENhbGwgdGhpcyBpZiB5b3UgY3JlYXRlIGEgbmV3IGJoLgorICovCitpbnQgamJkMl9qb3VybmFsX2dldF9jcmVhdGVfYWNjZXNzKGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBidWZmZXJfaGVhZCAqYmgpCit7CisJdHJhbnNhY3Rpb25fdCAqdHJhbnNhY3Rpb24gPSBoYW5kbGUtPmhfdHJhbnNhY3Rpb247CisJam91cm5hbF90ICpqb3VybmFsID0gdHJhbnNhY3Rpb24tPnRfam91cm5hbDsKKwlzdHJ1Y3Qgam91cm5hbF9oZWFkICpqaCA9IGpiZDJfam91cm5hbF9hZGRfam91cm5hbF9oZWFkKGJoKTsKKwlpbnQgZXJyOworCisJamJkX2RlYnVnKDUsICJqb3VybmFsX2hlYWQgJXBcbiIsIGpoKTsKKwllcnIgPSAtRVJPRlM7CisJaWYgKGlzX2hhbmRsZV9hYm9ydGVkKGhhbmRsZSkpCisJCWdvdG8gb3V0OworCWVyciA9IDA7CisKKwlKQlVGRkVSX1RSQUNFKGpoLCAiZW50cnkiKTsKKwkvKgorCSAqIFRoZSBidWZmZXIgbWF5IGFscmVhZHkgYmVsb25nIHRvIHRoaXMgdHJhbnNhY3Rpb24gZHVlIHRvIHByZS16ZXJvaW5nCisJICogaW4gdGhlIGZpbGVzeXN0ZW0ncyBuZXdfYmxvY2sgY29kZS4gIEl0IG1heSBhbHNvIGJlIG9uIHRoZSBwcmV2aW91cywKKwkgKiBjb21taXR0aW5nIHRyYW5zYWN0aW9uJ3MgbGlzdHMsIGJ1dCBpdCBIQVMgdG8gYmUgaW4gRm9yZ2V0IHN0YXRlIGluCisJICogdGhhdCBjYXNlOiB0aGUgdHJhbnNhY3Rpb24gbXVzdCBoYXZlIGRlbGV0ZWQgdGhlIGJ1ZmZlciBmb3IgaXQgdG8gYmUKKwkgKiByZXVzZWQgaGVyZS4KKwkgKi8KKwlqYmRfbG9ja19iaF9zdGF0ZShiaCk7CisJc3Bpbl9sb2NrKCZqb3VybmFsLT5qX2xpc3RfbG9jayk7CisJSl9BU1NFUlRfSkgoamgsIChqaC0+Yl90cmFuc2FjdGlvbiA9PSB0cmFuc2FjdGlvbiB8fAorCQlqaC0+Yl90cmFuc2FjdGlvbiA9PSBOVUxMIHx8CisJCShqaC0+Yl90cmFuc2FjdGlvbiA9PSBqb3VybmFsLT5qX2NvbW1pdHRpbmdfdHJhbnNhY3Rpb24gJiYKKwkJCSAgamgtPmJfamxpc3QgPT0gQkpfRm9yZ2V0KSkpOworCisJSl9BU1NFUlRfSkgoamgsIGpoLT5iX25leHRfdHJhbnNhY3Rpb24gPT0gTlVMTCk7CisJSl9BU1NFUlRfSkgoamgsIGJ1ZmZlcl9sb2NrZWQoamgyYmgoamgpKSk7CisKKwlpZiAoamgtPmJfdHJhbnNhY3Rpb24gPT0gTlVMTCkgeworCQlqaC0+Yl90cmFuc2FjdGlvbiA9IHRyYW5zYWN0aW9uOworCQlKQlVGRkVSX1RSQUNFKGpoLCAiZmlsZSBhcyBCSl9SZXNlcnZlZCIpOworCQlfX2piZDJfam91cm5hbF9maWxlX2J1ZmZlcihqaCwgdHJhbnNhY3Rpb24sIEJKX1Jlc2VydmVkKTsKKwl9IGVsc2UgaWYgKGpoLT5iX3RyYW5zYWN0aW9uID09IGpvdXJuYWwtPmpfY29tbWl0dGluZ190cmFuc2FjdGlvbikgeworCQlKQlVGRkVSX1RSQUNFKGpoLCAic2V0IG5leHQgdHJhbnNhY3Rpb24iKTsKKwkJamgtPmJfbmV4dF90cmFuc2FjdGlvbiA9IHRyYW5zYWN0aW9uOworCX0KKwlzcGluX3VubG9jaygmam91cm5hbC0+al9saXN0X2xvY2spOworCWpiZF91bmxvY2tfYmhfc3RhdGUoYmgpOworCisJLyoKKwkgKiBha3BtOiBJIGFkZGVkIHRoaXMuICBleHQzX2FsbG9jX2JyYW5jaCBjYW4gcGljayB1cCBuZXcgaW5kaXJlY3QKKwkgKiBibG9ja3Mgd2hpY2ggY29udGFpbiBmcmVlZCBidXQgdGhlbiByZXZva2VkIG1ldGFkYXRhLiAgV2UgbmVlZAorCSAqIHRvIGNhbmNlbCB0aGUgcmV2b2tlIGluIGNhc2Ugd2UgZW5kIHVwIGZyZWVpbmcgaXQgeWV0IGFnYWluCisJICogYW5kIHRoZSByZWFsbG9jYXRpbmcgYXMgZGF0YSAtIHRoaXMgd291bGQgY2F1c2UgYSBzZWNvbmQgcmV2b2tlLAorCSAqIHdoaWNoIGhpdHMgYW4gYXNzZXJ0aW9uIGVycm9yLgorCSAqLworCUpCVUZGRVJfVFJBQ0UoamgsICJjYW5jZWxsaW5nIHJldm9rZSIpOworCWpiZDJfam91cm5hbF9jYW5jZWxfcmV2b2tlKGhhbmRsZSwgamgpOworCWpiZDJfam91cm5hbF9wdXRfam91cm5hbF9oZWFkKGpoKTsKK291dDoKKwlyZXR1cm4gZXJyOworfQorCisvKioKKyAqIGludCBqYmQyX2pvdXJuYWxfZ2V0X3VuZG9fYWNjZXNzKCkgLSAgTm90aWZ5IGludGVudCB0byBtb2RpZnkgbWV0YWRhdGEgd2l0aAorICogICAgIG5vbi1yZXdpbmRhYmxlIGNvbnNlcXVlbmNlcworICogQGhhbmRsZTogdHJhbnNhY3Rpb24KKyAqIEBiaDogYnVmZmVyIHRvIHVuZG8KKyAqIEBjcmVkaXRzOiBzdG9yZSB0aGUgbnVtYmVyIG9mIHRha2VuIGNyZWRpdHMgaGVyZSAoaWYgbm90IE5VTEwpCisgKgorICogU29tZXRpbWVzIHRoZXJlIGlzIGEgbmVlZCB0byBkaXN0aW5ndWlzaCBiZXR3ZWVuIG1ldGFkYXRhIHdoaWNoIGhhcworICogYmVlbiBjb21taXR0ZWQgdG8gZGlzayBhbmQgdGhhdCB3aGljaCBoYXMgbm90LiAgVGhlIGV4dDNmcyBjb2RlIHVzZXMKKyAqIHRoaXMgZm9yIGZyZWVpbmcgYW5kIGFsbG9jYXRpbmcgc3BhY2UsIHdlIGhhdmUgdG8gbWFrZSBzdXJlIHRoYXQgd2UKKyAqIGRvIG5vdCByZXVzZSBmcmVlZCBzcGFjZSB1bnRpbCB0aGUgZGVhbGxvY2F0aW9uIGhhcyBiZWVuIGNvbW1pdHRlZCwKKyAqIHNpbmNlIGlmIHdlIG92ZXJ3cm90ZSB0aGF0IHNwYWNlIHdlIHdvdWxkIG1ha2UgdGhlIGRlbGV0ZQorICogdW4tcmV3aW5kYWJsZSBpbiBjYXNlIG9mIGEgY3Jhc2guCisgKgorICogVG8gZGVhbCB3aXRoIHRoYXQsIGpiZDJfam91cm5hbF9nZXRfdW5kb19hY2Nlc3MgcmVxdWVzdHMgd3JpdGUgYWNjZXNzIHRvIGEKKyAqIGJ1ZmZlciBmb3IgcGFydHMgb2Ygbm9uLXJld2luZGFibGUgb3BlcmF0aW9ucyBzdWNoIGFzIGRlbGV0ZQorICogb3BlcmF0aW9ucyBvbiB0aGUgYml0bWFwcy4gIFRoZSBqb3VybmFsaW5nIGNvZGUgbXVzdCBrZWVwIGEgY29weSBvZgorICogdGhlIGJ1ZmZlcidzIGNvbnRlbnRzIHByaW9yIHRvIHRoZSB1bmRvX2FjY2VzcyBjYWxsIHVudGlsIHN1Y2ggdGltZQorICogYXMgd2Uga25vdyB0aGF0IHRoZSBidWZmZXIgaGFzIGRlZmluaXRlbHkgYmVlbiBjb21taXR0ZWQgdG8gZGlzay4KKyAqCisgKiBXZSBuZXZlciBuZWVkIHRvIGtub3cgd2hpY2ggdHJhbnNhY3Rpb24gdGhlIGNvbW1pdHRlZCBkYXRhIGlzIHBhcnQKKyAqIG9mLCBidWZmZXJzIHRvdWNoZWQgaGVyZSBhcmUgZ3VhcmFudGVlZCB0byBiZSBkaXJ0aWVkIGxhdGVyIGFuZCBzbworICogd2lsbCBiZSBjb21taXR0ZWQgdG8gYSBuZXcgdHJhbnNhY3Rpb24gaW4gZHVlIGNvdXJzZSwgYXQgd2hpY2ggcG9pbnQKKyAqIHdlIGNhbiBkaXNjYXJkIHRoZSBvbGQgY29tbWl0dGVkIGRhdGEgcG9pbnRlci4KKyAqCisgKiBSZXR1cm5zIGVycm9yIG51bWJlciBvciAwIG9uIHN1Y2Nlc3MuCisgKi8KK2ludCBqYmQyX2pvdXJuYWxfZ2V0X3VuZG9fYWNjZXNzKGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBidWZmZXJfaGVhZCAqYmgpCit7CisJaW50IGVycjsKKwlzdHJ1Y3Qgam91cm5hbF9oZWFkICpqaCA9IGpiZDJfam91cm5hbF9hZGRfam91cm5hbF9oZWFkKGJoKTsKKwljaGFyICpjb21taXR0ZWRfZGF0YSA9IE5VTEw7CisKKwlKQlVGRkVSX1RSQUNFKGpoLCAiZW50cnkiKTsKKworCS8qCisJICogRG8gdGhpcyBmaXJzdCAtLS0gaXQgY2FuIGRyb3AgdGhlIGpvdXJuYWwgbG9jaywgc28gd2Ugd2FudCB0bworCSAqIG1ha2Ugc3VyZSB0aGF0IG9idGFpbmluZyB0aGUgY29tbWl0dGVkX2RhdGEgaXMgZG9uZQorCSAqIGF0b21pY2FsbHkgd3J0LiBjb21wbGV0aW9uIG9mIGFueSBvdXRzdGFuZGluZyBjb21taXRzLgorCSAqLworCWVyciA9IGRvX2dldF93cml0ZV9hY2Nlc3MoaGFuZGxlLCBqaCwgMSk7CisJaWYgKGVycikKKwkJZ290byBvdXQ7CisKK3JlcGVhdDoKKwlpZiAoIWpoLT5iX2NvbW1pdHRlZF9kYXRhKSB7CisJCWNvbW1pdHRlZF9kYXRhID0gamJkMl9zbGFiX2FsbG9jKGpoMmJoKGpoKS0+Yl9zaXplLCBHRlBfTk9GUyk7CisJCWlmICghY29tbWl0dGVkX2RhdGEpIHsKKwkJCXByaW50ayhLRVJOX0VNRVJHICIlczogTm8gbWVtb3J5IGZvciBjb21taXR0ZWQgZGF0YVxuIiwKKwkJCQlfX0ZVTkNUSU9OX18pOworCQkJZXJyID0gLUVOT01FTTsKKwkJCWdvdG8gb3V0OworCQl9CisJfQorCisJamJkX2xvY2tfYmhfc3RhdGUoYmgpOworCWlmICghamgtPmJfY29tbWl0dGVkX2RhdGEpIHsKKwkJLyogQ29weSBvdXQgdGhlIGN1cnJlbnQgYnVmZmVyIGNvbnRlbnRzIGludG8gdGhlCisJCSAqIHByZXNlcnZlZCwgY29tbWl0dGVkIGNvcHkuICovCisJCUpCVUZGRVJfVFJBQ0UoamgsICJnZW5lcmF0ZSBiX2NvbW1pdHRlZCBkYXRhIik7CisJCWlmICghY29tbWl0dGVkX2RhdGEpIHsKKwkJCWpiZF91bmxvY2tfYmhfc3RhdGUoYmgpOworCQkJZ290byByZXBlYXQ7CisJCX0KKworCQlqaC0+Yl9jb21taXR0ZWRfZGF0YSA9IGNvbW1pdHRlZF9kYXRhOworCQljb21taXR0ZWRfZGF0YSA9IE5VTEw7CisJCW1lbWNweShqaC0+Yl9jb21taXR0ZWRfZGF0YSwgYmgtPmJfZGF0YSwgYmgtPmJfc2l6ZSk7CisJfQorCWpiZF91bmxvY2tfYmhfc3RhdGUoYmgpOworb3V0OgorCWpiZDJfam91cm5hbF9wdXRfam91cm5hbF9oZWFkKGpoKTsKKwlpZiAodW5saWtlbHkoY29tbWl0dGVkX2RhdGEpKQorCQlqYmQyX3NsYWJfZnJlZShjb21taXR0ZWRfZGF0YSwgYmgtPmJfc2l6ZSk7CisJcmV0dXJuIGVycjsKK30KKworLyoqCisgKiBpbnQgamJkMl9qb3VybmFsX2RpcnR5X2RhdGEoKSAtICBtYXJrIGEgYnVmZmVyIGFzIGNvbnRhaW5pbmcgZGlydHkgZGF0YSB3aGljaAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5lZWRzIHRvIGJlIGZsdXNoZWQgYmVmb3JlIHdlIGNhbiBjb21taXQgdGhlCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudCB0cmFuc2FjdGlvbi4KKyAqIEBoYW5kbGU6IHRyYW5zYWN0aW9uCisgKiBAYmg6IGJ1ZmZlcmhlYWQgdG8gbWFyaworICoKKyAqIFRoZSBidWZmZXIgaXMgcGxhY2VkIG9uIHRoZSB0cmFuc2FjdGlvbidzIGRhdGEgbGlzdCBhbmQgaXMgbWFya2VkIGFzCisgKiBiZWxvbmdpbmcgdG8gdGhlIHRyYW5zYWN0aW9uLgorICoKKyAqIFJldHVybnMgZXJyb3IgbnVtYmVyIG9yIDAgb24gc3VjY2Vzcy4KKyAqCisgKiBqYmQyX2pvdXJuYWxfZGlydHlfZGF0YSgpIGNhbiBiZSBjYWxsZWQgdmlhIHBhZ2VfbGF1bmRlci0+ZXh0M193cml0ZXBhZ2UKKyAqIGJ5IGtzd2FwZC4KKyAqLworaW50IGpiZDJfam91cm5hbF9kaXJ0eV9kYXRhKGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBidWZmZXJfaGVhZCAqYmgpCit7CisJam91cm5hbF90ICpqb3VybmFsID0gaGFuZGxlLT5oX3RyYW5zYWN0aW9uLT50X2pvdXJuYWw7CisJaW50IG5lZWRfYnJlbHNlID0gMDsKKwlzdHJ1Y3Qgam91cm5hbF9oZWFkICpqaDsKKworCWlmIChpc19oYW5kbGVfYWJvcnRlZChoYW5kbGUpKQorCQlyZXR1cm4gMDsKKworCWpoID0gamJkMl9qb3VybmFsX2FkZF9qb3VybmFsX2hlYWQoYmgpOworCUpCVUZGRVJfVFJBQ0UoamgsICJlbnRyeSIpOworCisJLyoKKwkgKiBUaGUgYnVmZmVyIGNvdWxkICphbHJlYWR5KiBiZSBkaXJ0eS4gIFdyaXRlb3V0IGNhbiBzdGFydAorCSAqIGF0IGFueSB0aW1lLgorCSAqLworCWpiZF9kZWJ1Zyg0LCAiamg6ICVwLCB0aWQ6JWRcbiIsIGpoLCBoYW5kbGUtPmhfdHJhbnNhY3Rpb24tPnRfdGlkKTsKKworCS8qCisJICogV2hhdCBpZiB0aGUgYnVmZmVyIGlzIGFscmVhZHkgcGFydCBvZiBhIHJ1bm5pbmcgdHJhbnNhY3Rpb24/CisJICoKKwkgKiBUaGVyZSBhcmUgdHdvIGNhc2VzOgorCSAqIDEpIEl0IGlzIHBhcnQgb2YgdGhlIGN1cnJlbnQgcnVubmluZyB0cmFuc2FjdGlvbi4gIFJlZmlsZSBpdCwKKwkgKiAgICBqdXN0IGluIGNhc2Ugd2UgaGF2ZSBhbGxvY2F0ZWQgaXQgYXMgbWV0YWRhdGEsIGRlYWxsb2NhdGVkCisJICogICAgaXQsIHRoZW4gcmVhbGxvY2F0ZWQgaXQgYXMgZGF0YS4KKwkgKiAyKSBJdCBpcyBwYXJ0IG9mIHRoZSBwcmV2aW91cywgc3RpbGwtY29tbWl0dGluZyB0cmFuc2FjdGlvbi4KKwkgKiAgICBJZiBhbGwgd2Ugd2FudCB0byBkbyBpcyB0byBndWFyYW50ZWUgdGhhdCB0aGUgYnVmZmVyIHdpbGwgYmUKKwkgKiAgICB3cml0dGVuIHRvIGRpc2sgYmVmb3JlIHRoaXMgbmV3IHRyYW5zYWN0aW9uIGNvbW1pdHMsIHRoZW4KKwkgKiAgICBiZWluZyBzdXJlIHRoYXQgdGhlICpwcmV2aW91cyogdHJhbnNhY3Rpb24gaGFzIHRoaXMgc2FtZQorCSAqICAgIHByb3BlcnR5IGlzIHN1ZmZpY2llbnQgZm9yIHVzISAgSnVzdCBsZWF2ZSBpdCBvbiBpdHMgb2xkCisJICogICAgdHJhbnNhY3Rpb24uCisJICoKKwkgKiBJbiBjYXNlICgyKSwgdGhlIGJ1ZmZlciBtdXN0IG5vdCBhbHJlYWR5IGV4aXN0IGFzIG1ldGFkYXRhCisJICogLS0tIHRoYXQgd291bGQgdmlvbGF0ZSB3cml0ZSBvcmRlcmluZyAoYSB0cmFuc2FjdGlvbiBpcyBmcmVlCisJICogdG8gd3JpdGUgaXRzIGRhdGEgYXQgYW55IHBvaW50LCBldmVuIGJlZm9yZSB0aGUgcHJldmlvdXMKKwkgKiBjb21taXR0aW5nIHRyYW5zYWN0aW9uIGhhcyBjb21taXR0ZWQpLiAgVGhlIGNhbGxlciBtdXN0CisJICogbmV2ZXIsIGV2ZXIgYWxsb3cgdGhpcyB0byBoYXBwZW46IHRoZXJlJ3Mgbm90aGluZyB3ZSBjYW4gZG8KKwkgKiBhYm91dCBpdCBpbiB0aGlzIGxheWVyLgorCSAqLworCWpiZF9sb2NrX2JoX3N0YXRlKGJoKTsKKwlzcGluX2xvY2soJmpvdXJuYWwtPmpfbGlzdF9sb2NrKTsKKworCS8qIE5vdyB0aGF0IHdlIGhhdmUgYmhfc3RhdGUgbG9ja2VkLCBhcmUgd2UgcmVhbGx5IHN0aWxsIG1hcHBlZD8gKi8KKwlpZiAoIWJ1ZmZlcl9tYXBwZWQoYmgpKSB7CisJCUpCVUZGRVJfVFJBQ0UoamgsICJ1bm1hcHBlZCBidWZmZXIsIGJhaWxpbmcgb3V0Iik7CisJCWdvdG8gbm9fam91cm5hbDsKKwl9CisKKwlpZiAoamgtPmJfdHJhbnNhY3Rpb24pIHsKKwkJSkJVRkZFUl9UUkFDRShqaCwgImhhcyB0cmFuc2FjdGlvbiIpOworCQlpZiAoamgtPmJfdHJhbnNhY3Rpb24gIT0gaGFuZGxlLT5oX3RyYW5zYWN0aW9uKSB7CisJCQlKQlVGRkVSX1RSQUNFKGpoLCAiYmVsb25ncyB0byBvbGRlciB0cmFuc2FjdGlvbiIpOworCQkJSl9BU1NFUlRfSkgoamgsIGpoLT5iX3RyYW5zYWN0aW9uID09CisJCQkJCWpvdXJuYWwtPmpfY29tbWl0dGluZ190cmFuc2FjdGlvbik7CisKKwkJCS8qIEBAQCBJUyBUSElTIFRSVUUgID8gKi8KKwkJCS8qCisJCQkgKiBOb3QgYW55IG1vcmUuICBTY2VuYXJpbzogc29tZW9uZSBkb2VzIGEgd3JpdGUoKQorCQkJICogaW4gZGF0YT1qb3VybmFsIG1vZGUuICBUaGUgYnVmZmVyJ3MgdHJhbnNhY3Rpb24gaGFzCisJCQkgKiBtb3ZlZCBpbnRvIGNvbW1pdC4gIFRoZW4gc29tZW9uZSBkb2VzIGFub3RoZXIKKwkJCSAqIHdyaXRlKCkgdG8gdGhlIGZpbGUuICBXZSBkbyB0aGUgZnJvemVuIGRhdGEgY29weW91dAorCQkJICogYW5kIHNldCBiX25leHRfdHJhbnNhY3Rpb24gdG8gcG9pbnQgdG8gal9ydW5uaW5nX3QuCisJCQkgKiBBbmQgd2hpbGUgd2UncmUgaW4gdGhhdCBzdGF0ZSwgc29tZW9uZSBkb2VzIGEKKwkJCSAqIHdyaXRlcGFnZSgpIGluIGFuIGF0dGVtcHQgdG8gcGFnZW91dCB0aGUgc2FtZSBhcmVhCisJCQkgKiBvZiB0aGUgZmlsZSB2aWEgYSBzaGFyZWQgbWFwcGluZy4gIEF0IHByZXNlbnQgdGhhdAorCQkJICogY2FsbHMgamJkMl9qb3VybmFsX2RpcnR5X2RhdGEoKSwgYW5kIHdlIGdldCByaWdodCBoZXJlLgorCQkJICogSXQgbWF5IGJlIHRvbyBsYXRlIHRvIGpvdXJuYWwgdGhlIGRhdGEuICBTaW1wbHkKKwkJCSAqIGZhbGxpbmcgdGhyb3VnaCB0byB0aGUgbmV4dCB0ZXN0IHdpbGwgc3VmZmljZTogdGhlCisJCQkgKiBkYXRhIHdpbGwgYmUgZGlydHkgYW5kIHdpbCBiZSBjaGVja3BvaW50ZWQuICBUaGUKKwkJCSAqIG9yZGVyaW5nIGNvbW1lbnRzIGluIHRoZSBuZXh0IGNvbW1lbnQgYmxvY2sgc3RpbGwKKwkJCSAqIGFwcGx5LgorCQkJICovCisJCQkvL0pfQVNTRVJUX0pIKGpoLCBqaC0+Yl9uZXh0X3RyYW5zYWN0aW9uID09IE5VTEwpOworCisJCQkvKgorCQkJICogSWYgd2UncmUgam91cm5hbGxpbmcgZGF0YSwgYW5kIHRoaXMgYnVmZmVyIHdhcworCQkJICogc3ViamVjdCB0byBhIHdyaXRlKCksIGl0IGNvdWxkIGJlIG1ldGFkYXRhLCBmb3JnZXQKKwkJCSAqIG9yIHNoYWRvdyBhZ2FpbnN0IHRoZSBjb21taXR0aW5nIHRyYW5zYWN0aW9uLiAgTm93LAorCQkJICogc29tZW9uZSBoYXMgZGlydGllZCB0aGUgc2FtZSBkYXJuIHBhZ2UgdmlhIGEgbWFwcGluZworCQkJICogYW5kIGl0IGlzIGJlaW5nIHdyaXRlcGFnZSgpJ2QuCisJCQkgKiBXZSAqY291bGQqIGp1c3Qgc3RlYWwgdGhlIHBhZ2UgZnJvbSBjb21taXQsIHdpdGggc29tZQorCQkJICogZmFuY3kgbG9ja2luZyB0aGVyZS4gIEluc3RlYWQsIHdlIGp1c3Qgc2tpcCBpdCAtCisJCQkgKiBkb24ndCB0aWUgdGhlIHBhZ2UncyBidWZmZXJzIHRvIHRoZSBuZXcgdHJhbnNhY3Rpb24KKwkJCSAqIGF0IGFsbC4KKwkJCSAqIEltcGxpY2F0aW9uOiBpZiB3ZSBjcmFzaCBiZWZvcmUgdGhlIHdyaXRlcGFnZSgpIGRhdGEKKwkJCSAqIGlzIHdyaXR0ZW4gaW50byB0aGUgZmlsZXN5c3RlbSwgcmVjb3Zlcnkgd2lsbCByZXBsYXkKKwkJCSAqIHRoZSB3cml0ZSgpIGRhdGEuCisJCQkgKi8KKwkJCWlmIChqaC0+Yl9qbGlzdCAhPSBCSl9Ob25lICYmCisJCQkJCWpoLT5iX2psaXN0ICE9IEJKX1N5bmNEYXRhICYmCisJCQkJCWpoLT5iX2psaXN0ICE9IEJKX0xvY2tlZCkgeworCQkJCUpCVUZGRVJfVFJBQ0UoamgsICJOb3Qgc3RlYWxpbmciKTsKKwkJCQlnb3RvIG5vX2pvdXJuYWw7CisJCQl9CisKKwkJCS8qCisJCQkgKiBUaGlzIGJ1ZmZlciBtYXkgYmUgdW5kZXJnb2luZyB3cml0ZW91dCBpbiBjb21taXQuICBXZQorCQkJICogY2FuJ3QgcmV0dXJuIGZyb20gaGVyZSBhbmQgbGV0IHRoZSBjYWxsZXIgZGlydHkgaXQKKwkJCSAqIGFnYWluIGJlY2F1c2UgdGhhdCBjYW4gY2F1c2UgdGhlIHdyaXRlLW91dCBsb29wIGluCisJCQkgKiBjb21taXQgdG8gbmV2ZXIgdGVybWluYXRlLgorCQkJICovCisJCQlpZiAoYnVmZmVyX2RpcnR5KGJoKSkgeworCQkJCWdldF9iaChiaCk7CisJCQkJc3Bpbl91bmxvY2soJmpvdXJuYWwtPmpfbGlzdF9sb2NrKTsKKwkJCQlqYmRfdW5sb2NrX2JoX3N0YXRlKGJoKTsKKwkJCQluZWVkX2JyZWxzZSA9IDE7CisJCQkJc3luY19kaXJ0eV9idWZmZXIoYmgpOworCQkJCWpiZF9sb2NrX2JoX3N0YXRlKGJoKTsKKwkJCQlzcGluX2xvY2soJmpvdXJuYWwtPmpfbGlzdF9sb2NrKTsKKwkJCQkvKiBTaW5jZSB3ZSBkcm9wcGVkIHRoZSBsb2NrLi4uICovCisJCQkJaWYgKCFidWZmZXJfbWFwcGVkKGJoKSkgeworCQkJCQlKQlVGRkVSX1RSQUNFKGpoLCAiYnVmZmVyIGdvdCB1bm1hcHBlZCIpOworCQkJCQlnb3RvIG5vX2pvdXJuYWw7CisJCQkJfQorCQkJCS8qIFRoZSBidWZmZXIgbWF5IGJlY29tZSBsb2NrZWQgYWdhaW4gYXQgYW55CisJCQkJICAgdGltZSBpZiBpdCBpcyByZWRpcnRpZWQgKi8KKwkJCX0KKworCQkJLyogam91cm5hbF9jbGVhbl9kYXRhX2xpc3QoKSBtYXkgaGF2ZSBnb3QgdGhlcmUgZmlyc3QgKi8KKwkJCWlmIChqaC0+Yl90cmFuc2FjdGlvbiAhPSBOVUxMKSB7CisJCQkJSkJVRkZFUl9UUkFDRShqaCwgInVuZmlsZSBmcm9tIGNvbW1pdCIpOworCQkJCV9famJkMl9qb3VybmFsX3RlbXBfdW5saW5rX2J1ZmZlcihqaCk7CisJCQkJLyogSXQgc3RpbGwgcG9pbnRzIHRvIHRoZSBjb21taXR0aW5nCisJCQkJICogdHJhbnNhY3Rpb247IG1vdmUgaXQgdG8gdGhpcyBvbmUgc28KKwkJCQkgKiB0aGF0IHRoZSByZWZpbGUgYXNzZXJ0IGNoZWNrcyBhcmUKKwkJCQkgKiBoYXBweS4gKi8KKwkJCQlqaC0+Yl90cmFuc2FjdGlvbiA9IGhhbmRsZS0+aF90cmFuc2FjdGlvbjsKKwkJCX0KKwkJCS8qIFRoZSBidWZmZXIgd2lsbCBiZSByZWZpbGVkIGJlbG93ICovCisKKwkJfQorCQkvKgorCQkgKiBTcGVjaWFsIGNhc2UgLS0tIHRoZSBidWZmZXIgbWlnaHQgYWN0dWFsbHkgaGF2ZSBiZWVuCisJCSAqIGFsbG9jYXRlZCBhbmQgdGhlbiBpbW1lZGlhdGVseSBkZWFsbG9jYXRlZCBpbiB0aGUgcHJldmlvdXMsCisJCSAqIGNvbW1pdHRpbmcgdHJhbnNhY3Rpb24sIHNvIG1pZ2h0IHN0aWxsIGJlIGxlZnQgb24gdGhhdAorCQkgKiB0cmFuc2FjdGlvbidzIG1ldGFkYXRhIGxpc3RzLgorCQkgKi8KKwkJaWYgKGpoLT5iX2psaXN0ICE9IEJKX1N5bmNEYXRhICYmIGpoLT5iX2psaXN0ICE9IEJKX0xvY2tlZCkgeworCQkJSkJVRkZFUl9UUkFDRShqaCwgIm5vdCBvbiBjb3JyZWN0IGRhdGEgbGlzdDogdW5maWxlIik7CisJCQlKX0FTU0VSVF9KSChqaCwgamgtPmJfamxpc3QgIT0gQkpfU2hhZG93KTsKKwkJCV9famJkMl9qb3VybmFsX3RlbXBfdW5saW5rX2J1ZmZlcihqaCk7CisJCQlqaC0+Yl90cmFuc2FjdGlvbiA9IGhhbmRsZS0+aF90cmFuc2FjdGlvbjsKKwkJCUpCVUZGRVJfVFJBQ0UoamgsICJmaWxlIGFzIGRhdGEiKTsKKwkJCV9famJkMl9qb3VybmFsX2ZpbGVfYnVmZmVyKGpoLCBoYW5kbGUtPmhfdHJhbnNhY3Rpb24sCisJCQkJCQlCSl9TeW5jRGF0YSk7CisJCX0KKwl9IGVsc2UgeworCQlKQlVGRkVSX1RSQUNFKGpoLCAibm90IG9uIGEgdHJhbnNhY3Rpb24iKTsKKwkJX19qYmQyX2pvdXJuYWxfZmlsZV9idWZmZXIoamgsIGhhbmRsZS0+aF90cmFuc2FjdGlvbiwgQkpfU3luY0RhdGEpOworCX0KK25vX2pvdXJuYWw6CisJc3Bpbl91bmxvY2soJmpvdXJuYWwtPmpfbGlzdF9sb2NrKTsKKwlqYmRfdW5sb2NrX2JoX3N0YXRlKGJoKTsKKwlpZiAobmVlZF9icmVsc2UpIHsKKwkJQlVGRkVSX1RSQUNFKGJoLCAiYnJlbHNlIik7CisJCV9fYnJlbHNlKGJoKTsKKwl9CisJSkJVRkZFUl9UUkFDRShqaCwgImV4aXQiKTsKKwlqYmQyX2pvdXJuYWxfcHV0X2pvdXJuYWxfaGVhZChqaCk7CisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogaW50IGpiZDJfam91cm5hbF9kaXJ0eV9tZXRhZGF0YSgpIC0gIG1hcmsgYSBidWZmZXIgYXMgY29udGFpbmluZyBkaXJ0eSBtZXRhZGF0YQorICogQGhhbmRsZTogdHJhbnNhY3Rpb24gdG8gYWRkIGJ1ZmZlciB0by4KKyAqIEBiaDogYnVmZmVyIHRvIG1hcmsKKyAqCisgKiBtYXJrIGRpcnR5IG1ldGFkYXRhIHdoaWNoIG5lZWRzIHRvIGJlIGpvdXJuYWxlZCBhcyBwYXJ0IG9mIHRoZSBjdXJyZW50CisgKiB0cmFuc2FjdGlvbi4KKyAqCisgKiBUaGUgYnVmZmVyIGlzIHBsYWNlZCBvbiB0aGUgdHJhbnNhY3Rpb24ncyBtZXRhZGF0YSBsaXN0IGFuZCBpcyBtYXJrZWQKKyAqIGFzIGJlbG9uZ2luZyB0byB0aGUgdHJhbnNhY3Rpb24uCisgKgorICogUmV0dXJucyBlcnJvciBudW1iZXIgb3IgMCBvbiBzdWNjZXNzLgorICoKKyAqIFNwZWNpYWwgY2FyZSBuZWVkcyB0byBiZSB0YWtlbiBpZiB0aGUgYnVmZmVyIGFscmVhZHkgYmVsb25ncyB0byB0aGUKKyAqIGN1cnJlbnQgY29tbWl0dGluZyB0cmFuc2FjdGlvbiAoaW4gd2hpY2ggY2FzZSB3ZSBzaG91bGQgaGF2ZSBmcm96ZW4KKyAqIGRhdGEgcHJlc2VudCBmb3IgdGhhdCBjb21taXQpLiAgSW4gdGhhdCBjYXNlLCB3ZSBkb24ndCByZWxpbmsgdGhlCisgKiBidWZmZXI6IHRoYXQgb25seSBnZXRzIGRvbmUgd2hlbiB0aGUgb2xkIHRyYW5zYWN0aW9uIGZpbmFsbHkKKyAqIGNvbXBsZXRlcyBpdHMgY29tbWl0LgorICovCitpbnQgamJkMl9qb3VybmFsX2RpcnR5X21ldGFkYXRhKGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBidWZmZXJfaGVhZCAqYmgpCit7CisJdHJhbnNhY3Rpb25fdCAqdHJhbnNhY3Rpb24gPSBoYW5kbGUtPmhfdHJhbnNhY3Rpb247CisJam91cm5hbF90ICpqb3VybmFsID0gdHJhbnNhY3Rpb24tPnRfam91cm5hbDsKKwlzdHJ1Y3Qgam91cm5hbF9oZWFkICpqaCA9IGJoMmpoKGJoKTsKKworCWpiZF9kZWJ1Zyg1LCAiam91cm5hbF9oZWFkICVwXG4iLCBqaCk7CisJSkJVRkZFUl9UUkFDRShqaCwgImVudHJ5Iik7CisJaWYgKGlzX2hhbmRsZV9hYm9ydGVkKGhhbmRsZSkpCisJCWdvdG8gb3V0OworCisJamJkX2xvY2tfYmhfc3RhdGUoYmgpOworCisJaWYgKGpoLT5iX21vZGlmaWVkID09IDApIHsKKwkJLyoKKwkJICogVGhpcyBidWZmZXIncyBnb3QgbW9kaWZpZWQgYW5kIGJlY29taW5nIHBhcnQKKwkJICogb2YgdGhlIHRyYW5zYWN0aW9uLiBUaGlzIG5lZWRzIHRvIGJlIGRvbmUKKwkJICogb25jZSBhIHRyYW5zYWN0aW9uIC1ienp6CisJCSAqLworCQlqaC0+Yl9tb2RpZmllZCA9IDE7CisJCUpfQVNTRVJUX0pIKGpoLCBoYW5kbGUtPmhfYnVmZmVyX2NyZWRpdHMgPiAwKTsKKwkJaGFuZGxlLT5oX2J1ZmZlcl9jcmVkaXRzLS07CisJfQorCisJLyoKKwkgKiBmYXN0cGF0aCwgdG8gYXZvaWQgZXhwZW5zaXZlIGxvY2tpbmcuICBJZiB0aGlzIGJ1ZmZlciBpcyBhbHJlYWR5CisJICogb24gdGhlIHJ1bm5pbmcgdHJhbnNhY3Rpb24ncyBtZXRhZGF0YSBsaXN0IHRoZXJlIGlzIG5vdGhpbmcgdG8gZG8uCisJICogTm9ib2R5IGNhbiB0YWtlIGl0IG9mZiBhZ2FpbiBiZWNhdXNlIHRoZXJlIGlzIGEgaGFuZGxlIG9wZW4uCisJICogSSBfdGhpbmtfIHdlJ3JlIE9LIGhlcmUgd2l0aCBTTVAgYmFycmllcnMgLSBhIG1pc3Rha2VuIGRlY2lzaW9uIHdpbGwKKwkgKiByZXN1bHQgaW4gdGhpcyB0ZXN0IGJlaW5nIGZhbHNlLCBzbyB3ZSBnbyBpbiBhbmQgdGFrZSB0aGUgbG9ja3MuCisJICovCisJaWYgKGpoLT5iX3RyYW5zYWN0aW9uID09IHRyYW5zYWN0aW9uICYmIGpoLT5iX2psaXN0ID09IEJKX01ldGFkYXRhKSB7CisJCUpCVUZGRVJfVFJBQ0UoamgsICJmYXN0cGF0aCIpOworCQlKX0FTU0VSVF9KSChqaCwgamgtPmJfdHJhbnNhY3Rpb24gPT0KKwkJCQkJam91cm5hbC0+al9ydW5uaW5nX3RyYW5zYWN0aW9uKTsKKwkJZ290byBvdXRfdW5sb2NrX2JoOworCX0KKworCXNldF9idWZmZXJfamJkZGlydHkoYmgpOworCisJLyoKKwkgKiBNZXRhZGF0YSBhbHJlYWR5IG9uIHRoZSBjdXJyZW50IHRyYW5zYWN0aW9uIGxpc3QgZG9lc24ndAorCSAqIG5lZWQgdG8gYmUgZmlsZWQuICBNZXRhZGF0YSBvbiBhbm90aGVyIHRyYW5zYWN0aW9uJ3MgbGlzdCBtdXN0CisJICogYmUgY29tbWl0dGluZywgYW5kIHdpbGwgYmUgcmVmaWxlZCBvbmNlIHRoZSBjb21taXQgY29tcGxldGVzOgorCSAqIGxlYXZlIGl0IGFsb25lIGZvciBub3cuCisJICovCisJaWYgKGpoLT5iX3RyYW5zYWN0aW9uICE9IHRyYW5zYWN0aW9uKSB7CisJCUpCVUZGRVJfVFJBQ0UoamgsICJhbHJlYWR5IG9uIG90aGVyIHRyYW5zYWN0aW9uIik7CisJCUpfQVNTRVJUX0pIKGpoLCBqaC0+Yl90cmFuc2FjdGlvbiA9PQorCQkJCQlqb3VybmFsLT5qX2NvbW1pdHRpbmdfdHJhbnNhY3Rpb24pOworCQlKX0FTU0VSVF9KSChqaCwgamgtPmJfbmV4dF90cmFuc2FjdGlvbiA9PSB0cmFuc2FjdGlvbik7CisJCS8qIEFuZCB0aGlzIGNhc2UgaXMgaWxsZWdhbDogd2UgY2FuJ3QgcmV1c2UgYW5vdGhlcgorCQkgKiB0cmFuc2FjdGlvbidzIGRhdGEgYnVmZmVyLCBldmVyLiAqLworCQlnb3RvIG91dF91bmxvY2tfYmg7CisJfQorCisJLyogVGhhdCB0ZXN0IHNob3VsZCBoYXZlIGVsaW1pbmF0ZWQgdGhlIGZvbGxvd2luZyBjYXNlOiAqLworCUpfQVNTRVJUX0pIKGpoLCBqaC0+Yl9mcm96ZW5fZGF0YSA9PSAwKTsKKworCUpCVUZGRVJfVFJBQ0UoamgsICJmaWxlIGFzIEJKX01ldGFkYXRhIik7CisJc3Bpbl9sb2NrKCZqb3VybmFsLT5qX2xpc3RfbG9jayk7CisJX19qYmQyX2pvdXJuYWxfZmlsZV9idWZmZXIoamgsIGhhbmRsZS0+aF90cmFuc2FjdGlvbiwgQkpfTWV0YWRhdGEpOworCXNwaW5fdW5sb2NrKCZqb3VybmFsLT5qX2xpc3RfbG9jayk7CitvdXRfdW5sb2NrX2JoOgorCWpiZF91bmxvY2tfYmhfc3RhdGUoYmgpOworb3V0OgorCUpCVUZGRVJfVFJBQ0UoamgsICJleGl0Iik7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBqYmQyX2pvdXJuYWxfcmVsZWFzZV9idWZmZXI6IHVuZG8gYSBnZXRfd3JpdGVfYWNjZXNzIHdpdGhvdXQgYW55IGJ1ZmZlcgorICogdXBkYXRlcywgaWYgdGhlIHVwZGF0ZSBkZWNpZGVkIGluIHRoZSBlbmQgdGhhdCBpdCBkaWRuJ3QgbmVlZCBhY2Nlc3MuCisgKgorICovCit2b2lkCitqYmQyX2pvdXJuYWxfcmVsZWFzZV9idWZmZXIoaGFuZGxlX3QgKmhhbmRsZSwgc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCkKK3sKKwlCVUZGRVJfVFJBQ0UoYmgsICJlbnRyeSIpOworfQorCisvKioKKyAqIHZvaWQgamJkMl9qb3VybmFsX2ZvcmdldCgpIC0gYmZvcmdldCgpIGZvciBwb3RlbnRpYWxseS1qb3VybmFsZWQgYnVmZmVycy4KKyAqIEBoYW5kbGU6IHRyYW5zYWN0aW9uIGhhbmRsZQorICogQGJoOiAgICAgYmggdG8gJ2ZvcmdldCcKKyAqCisgKiBXZSBjYW4gb25seSBkbyB0aGUgYmZvcmdldCBpZiB0aGVyZSBhcmUgbm8gY29tbWl0cyBwZW5kaW5nIGFnYWluc3QgdGhlCisgKiBidWZmZXIuICBJZiB0aGUgYnVmZmVyIGlzIGRpcnR5IGluIHRoZSBjdXJyZW50IHJ1bm5pbmcgdHJhbnNhY3Rpb24gd2UKKyAqIGNhbiBzYWZlbHkgdW5saW5rIGl0LgorICoKKyAqIGJoIG1heSBub3QgYmUgYSBqb3VybmFsbGVkIGJ1ZmZlciBhdCBhbGwgLSBpdCBtYXkgYmUgYSBub24tSkJECisgKiBidWZmZXIgd2hpY2ggY2FtZSBvZmYgdGhlIGhhc2h0YWJsZS4gIENoZWNrIGZvciB0aGlzLgorICoKKyAqIERlY3JlbWVudHMgYmgtPmJfY291bnQgYnkgb25lLgorICoKKyAqIEFsbG93IHRoaXMgY2FsbCBldmVuIGlmIHRoZSBoYW5kbGUgaGFzIGFib3J0ZWQgLS0tIGl0IG1heSBiZSBwYXJ0IG9mCisgKiB0aGUgY2FsbGVyJ3MgY2xlYW51cCBhZnRlciBhbiBhYm9ydC4KKyAqLworaW50IGpiZDJfam91cm5hbF9mb3JnZXQgKGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBidWZmZXJfaGVhZCAqYmgpCit7CisJdHJhbnNhY3Rpb25fdCAqdHJhbnNhY3Rpb24gPSBoYW5kbGUtPmhfdHJhbnNhY3Rpb247CisJam91cm5hbF90ICpqb3VybmFsID0gdHJhbnNhY3Rpb24tPnRfam91cm5hbDsKKwlzdHJ1Y3Qgam91cm5hbF9oZWFkICpqaDsKKwlpbnQgZHJvcF9yZXNlcnZlID0gMDsKKwlpbnQgZXJyID0gMDsKKworCUJVRkZFUl9UUkFDRShiaCwgImVudHJ5Iik7CisKKwlqYmRfbG9ja19iaF9zdGF0ZShiaCk7CisJc3Bpbl9sb2NrKCZqb3VybmFsLT5qX2xpc3RfbG9jayk7CisKKwlpZiAoIWJ1ZmZlcl9qYmQoYmgpKQorCQlnb3RvIG5vdF9qYmQ7CisJamggPSBiaDJqaChiaCk7CisKKwkvKiBDcml0aWNhbCBlcnJvcjogYXR0ZW1wdGluZyB0byBkZWxldGUgYSBiaXRtYXAgYnVmZmVyLCBtYXliZT8KKwkgKiBEb24ndCBkbyBhbnkgamJkIG9wZXJhdGlvbnMsIGFuZCByZXR1cm4gYW4gZXJyb3IuICovCisJaWYgKCFKX0VYUEVDVF9KSChqaCwgIWpoLT5iX2NvbW1pdHRlZF9kYXRhLAorCQkJICJpbmNvbnNpc3RlbnQgZGF0YSBvbiBkaXNrIikpIHsKKwkJZXJyID0gLUVJTzsKKwkJZ290byBub3RfamJkOworCX0KKworCS8qCisJICogVGhlIGJ1ZmZlcidzIGdvaW5nIGZyb20gdGhlIHRyYW5zYWN0aW9uLCB3ZSBtdXN0IGRyb3AKKwkgKiBhbGwgcmVmZXJlbmNlcyAtYnp6egorCSAqLworCWpoLT5iX21vZGlmaWVkID0gMDsKKworCWlmIChqaC0+Yl90cmFuc2FjdGlvbiA9PSBoYW5kbGUtPmhfdHJhbnNhY3Rpb24pIHsKKwkJSl9BU1NFUlRfSkgoamgsICFqaC0+Yl9mcm96ZW5fZGF0YSk7CisKKwkJLyogSWYgd2UgYXJlIGZvcmdldHRpbmcgYSBidWZmZXIgd2hpY2ggaXMgYWxyZWFkeSBwYXJ0CisJCSAqIG9mIHRoaXMgdHJhbnNhY3Rpb24sIHRoZW4gd2UgY2FuIGp1c3QgZHJvcCBpdCBmcm9tCisJCSAqIHRoZSB0cmFuc2FjdGlvbiBpbW1lZGlhdGVseS4gKi8KKwkJY2xlYXJfYnVmZmVyX2RpcnR5KGJoKTsKKwkJY2xlYXJfYnVmZmVyX2piZGRpcnR5KGJoKTsKKworCQlKQlVGRkVSX1RSQUNFKGpoLCAiYmVsb25ncyB0byBjdXJyZW50IHRyYW5zYWN0aW9uOiB1bmZpbGUiKTsKKworCQlkcm9wX3Jlc2VydmUgPSAxOworCisJCS8qCisJCSAqIFdlIGFyZSBubyBsb25nZXIgZ29pbmcgdG8gam91cm5hbCB0aGlzIGJ1ZmZlci4KKwkJICogSG93ZXZlciwgdGhlIGNvbW1pdCBvZiB0aGlzIHRyYW5zYWN0aW9uIGlzIHN0aWxsCisJCSAqIGltcG9ydGFudCB0byB0aGUgYnVmZmVyOiB0aGUgZGVsZXRlIHRoYXQgd2UgYXJlIG5vdworCQkgKiBwcm9jZXNzaW5nIG1pZ2h0IG9ic29sZXRlIGFuIG9sZCBsb2cgZW50cnksIHNvIGJ5CisJCSAqIGNvbW1pdHRpbmcsIHdlIGNhbiBzYXRpc2Z5IHRoZSBidWZmZXIncyBjaGVja3BvaW50LgorCQkgKgorCQkgKiBTbywgaWYgd2UgaGF2ZSBhIGNoZWNrcG9pbnQgb24gdGhlIGJ1ZmZlciwgd2Ugc2hvdWxkCisJCSAqIG5vdyByZWZpbGUgdGhlIGJ1ZmZlciBvbiBvdXIgQkpfRm9yZ2V0IGxpc3Qgc28gdGhhdAorCQkgKiB3ZSBrbm93IHRvIHJlbW92ZSB0aGUgY2hlY2twb2ludCBhZnRlciB3ZSBjb21taXQuCisJCSAqLworCisJCWlmIChqaC0+Yl9jcF90cmFuc2FjdGlvbikgeworCQkJX19qYmQyX2pvdXJuYWxfdGVtcF91bmxpbmtfYnVmZmVyKGpoKTsKKwkJCV9famJkMl9qb3VybmFsX2ZpbGVfYnVmZmVyKGpoLCB0cmFuc2FjdGlvbiwgQkpfRm9yZ2V0KTsKKwkJfSBlbHNlIHsKKwkJCV9famJkMl9qb3VybmFsX3VuZmlsZV9idWZmZXIoamgpOworCQkJamJkMl9qb3VybmFsX3JlbW92ZV9qb3VybmFsX2hlYWQoYmgpOworCQkJX19icmVsc2UoYmgpOworCQkJaWYgKCFidWZmZXJfamJkKGJoKSkgeworCQkJCXNwaW5fdW5sb2NrKCZqb3VybmFsLT5qX2xpc3RfbG9jayk7CisJCQkJamJkX3VubG9ja19iaF9zdGF0ZShiaCk7CisJCQkJX19iZm9yZ2V0KGJoKTsKKwkJCQlnb3RvIGRyb3A7CisJCQl9CisJCX0KKwl9IGVsc2UgaWYgKGpoLT5iX3RyYW5zYWN0aW9uKSB7CisJCUpfQVNTRVJUX0pIKGpoLCAoamgtPmJfdHJhbnNhY3Rpb24gPT0KKwkJCQkgam91cm5hbC0+al9jb21taXR0aW5nX3RyYW5zYWN0aW9uKSk7CisJCS8qIEhvd2V2ZXIsIGlmIHRoZSBidWZmZXIgaXMgc3RpbGwgb3duZWQgYnkgYSBwcmlvcgorCQkgKiAoY29tbWl0dGluZykgdHJhbnNhY3Rpb24sIHdlIGNhbid0IGRyb3AgaXQgeWV0Li4uICovCisJCUpCVUZGRVJfVFJBQ0UoamgsICJiZWxvbmdzIHRvIG9sZGVyIHRyYW5zYWN0aW9uIik7CisJCS8qIC4uLiBidXQgd2UgQ0FOIGRyb3AgaXQgZnJvbSB0aGUgbmV3IHRyYW5zYWN0aW9uIGlmIHdlCisJCSAqIGhhdmUgYWxzbyBtb2RpZmllZCBpdCBzaW5jZSB0aGUgb3JpZ2luYWwgY29tbWl0LiAqLworCisJCWlmIChqaC0+Yl9uZXh0X3RyYW5zYWN0aW9uKSB7CisJCQlKX0FTU0VSVChqaC0+Yl9uZXh0X3RyYW5zYWN0aW9uID09IHRyYW5zYWN0aW9uKTsKKwkJCWpoLT5iX25leHRfdHJhbnNhY3Rpb24gPSBOVUxMOworCQkJZHJvcF9yZXNlcnZlID0gMTsKKwkJfQorCX0KKworbm90X2piZDoKKwlzcGluX3VubG9jaygmam91cm5hbC0+al9saXN0X2xvY2spOworCWpiZF91bmxvY2tfYmhfc3RhdGUoYmgpOworCV9fYnJlbHNlKGJoKTsKK2Ryb3A6CisJaWYgKGRyb3BfcmVzZXJ2ZSkgeworCQkvKiBubyBuZWVkIHRvIHJlc2VydmUgbG9nIHNwYWNlIGZvciB0aGlzIGJsb2NrIC1ienp6ICovCisJCWhhbmRsZS0+aF9idWZmZXJfY3JlZGl0cysrOworCX0KKwlyZXR1cm4gZXJyOworfQorCisvKioKKyAqIGludCBqYmQyX2pvdXJuYWxfc3RvcCgpIC0gY29tcGxldGUgYSB0cmFuc2FjdGlvbgorICogQGhhbmRsZTogdHJhbmFjdGlvbiB0byBjb21wbGV0ZS4KKyAqCisgKiBBbGwgZG9uZSBmb3IgYSBwYXJ0aWN1bGFyIGhhbmRsZS4KKyAqCisgKiBUaGVyZSBpcyBub3QgbXVjaCBhY3Rpb24gbmVlZGVkIGhlcmUuICBXZSBqdXN0IHJldHVybiBhbnkgcmVtYWluaW5nCisgKiBidWZmZXIgY3JlZGl0cyB0byB0aGUgdHJhbnNhY3Rpb24gYW5kIHJlbW92ZSB0aGUgaGFuZGxlLiAgVGhlIG9ubHkKKyAqIGNvbXBsaWNhdGlvbiBpcyB0aGF0IHdlIG5lZWQgdG8gc3RhcnQgYSBjb21taXQgb3BlcmF0aW9uIGlmIHRoZQorICogZmlsZXN5c3RlbSBpcyBtYXJrZWQgZm9yIHN5bmNocm9ub3VzIHVwZGF0ZS4KKyAqCisgKiBqYmQyX2pvdXJuYWxfc3RvcCBpdHNlbGYgd2lsbCBub3QgdXN1YWxseSByZXR1cm4gYW4gZXJyb3IsIGJ1dCBpdCBtYXkKKyAqIGRvIHNvIGluIHVudXN1YWwgY2lyY3Vtc3RhbmNlcy4gIEluIHBhcnRpY3VsYXIsIGV4cGVjdCBpdCB0bworICogcmV0dXJuIC1FSU8gaWYgYSBqYmQyX2pvdXJuYWxfYWJvcnQgaGFzIGJlZW4gZXhlY3V0ZWQgc2luY2UgdGhlCisgKiB0cmFuc2FjdGlvbiBiZWdhbi4KKyAqLworaW50IGpiZDJfam91cm5hbF9zdG9wKGhhbmRsZV90ICpoYW5kbGUpCit7CisJdHJhbnNhY3Rpb25fdCAqdHJhbnNhY3Rpb24gPSBoYW5kbGUtPmhfdHJhbnNhY3Rpb247CisJam91cm5hbF90ICpqb3VybmFsID0gdHJhbnNhY3Rpb24tPnRfam91cm5hbDsKKwlpbnQgb2xkX2hhbmRsZV9jb3VudCwgZXJyOworCXBpZF90IHBpZDsKKworCUpfQVNTRVJUKGpvdXJuYWxfY3VycmVudF9oYW5kbGUoKSA9PSBoYW5kbGUpOworCisJaWYgKGlzX2hhbmRsZV9hYm9ydGVkKGhhbmRsZSkpCisJCWVyciA9IC1FSU87CisJZWxzZSB7CisJCUpfQVNTRVJUKHRyYW5zYWN0aW9uLT50X3VwZGF0ZXMgPiAwKTsKKwkJZXJyID0gMDsKKwl9CisKKwlpZiAoLS1oYW5kbGUtPmhfcmVmID4gMCkgeworCQlqYmRfZGVidWcoNCwgImhfcmVmICVkIC0+ICVkXG4iLCBoYW5kbGUtPmhfcmVmICsgMSwKKwkJCSAgaGFuZGxlLT5oX3JlZik7CisJCXJldHVybiBlcnI7CisJfQorCisJamJkX2RlYnVnKDQsICJIYW5kbGUgJXAgZ29pbmcgZG93blxuIiwgaGFuZGxlKTsKKworCS8qCisJICogSW1wbGVtZW50IHN5bmNocm9ub3VzIHRyYW5zYWN0aW9uIGJhdGNoaW5nLiAgSWYgdGhlIGhhbmRsZQorCSAqIHdhcyBzeW5jaHJvbm91cywgZG9uJ3QgZm9yY2UgYSBjb21taXQgaW1tZWRpYXRlbHkuICBMZXQncworCSAqIHlpZWxkIGFuZCBsZXQgYW5vdGhlciB0aHJlYWQgcGlnZ3liYWNrIG9udG8gdGhpcyB0cmFuc2FjdGlvbi4KKwkgKiBLZWVwIGRvaW5nIHRoYXQgd2hpbGUgbmV3IHRocmVhZHMgY29udGludWUgdG8gYXJyaXZlLgorCSAqIEl0IGRvZXNuJ3QgY29zdCBtdWNoIC0gd2UncmUgYWJvdXQgdG8gcnVuIGEgY29tbWl0IGFuZCBzbGVlcAorCSAqIG9uIElPIGFueXdheS4gIFNwZWVkcyB1cCBtYW55LXRocmVhZGVkLCBtYW55LWRpciBvcGVyYXRpb25zCisJICogYnkgMzB4IG9yIG1vcmUuLi4KKwkgKgorCSAqIEJ1dCBkb24ndCBkbyB0aGlzIGlmIHRoaXMgcHJvY2VzcyB3YXMgdGhlIG1vc3QgcmVjZW50IG9uZSB0bworCSAqIHBlcmZvcm0gYSBzeW5jaHJvbm91cyB3cml0ZS4gIFdlIGRvIHRoaXMgdG8gZGV0ZWN0IHRoZSBjYXNlIHdoZXJlIGEKKwkgKiBzaW5nbGUgcHJvY2VzcyBpcyBkb2luZyBhIHN0cmVhbSBvZiBzeW5jIHdyaXRlcy4gIE5vIHBvaW50IGluIHdhaXRpbmcKKwkgKiBmb3Igam9pbmVycyBpbiB0aGF0IGNhc2UuCisJICovCisJcGlkID0gY3VycmVudC0+cGlkOworCWlmIChoYW5kbGUtPmhfc3luYyAmJiBqb3VybmFsLT5qX2xhc3Rfc3luY193cml0ZXIgIT0gcGlkKSB7CisJCWpvdXJuYWwtPmpfbGFzdF9zeW5jX3dyaXRlciA9IHBpZDsKKwkJZG8geworCQkJb2xkX2hhbmRsZV9jb3VudCA9IHRyYW5zYWN0aW9uLT50X2hhbmRsZV9jb3VudDsKKwkJCXNjaGVkdWxlX3RpbWVvdXRfdW5pbnRlcnJ1cHRpYmxlKDEpOworCQl9IHdoaWxlIChvbGRfaGFuZGxlX2NvdW50ICE9IHRyYW5zYWN0aW9uLT50X2hhbmRsZV9jb3VudCk7CisJfQorCisJY3VycmVudC0+am91cm5hbF9pbmZvID0gTlVMTDsKKwlzcGluX2xvY2soJmpvdXJuYWwtPmpfc3RhdGVfbG9jayk7CisJc3Bpbl9sb2NrKCZ0cmFuc2FjdGlvbi0+dF9oYW5kbGVfbG9jayk7CisJdHJhbnNhY3Rpb24tPnRfb3V0c3RhbmRpbmdfY3JlZGl0cyAtPSBoYW5kbGUtPmhfYnVmZmVyX2NyZWRpdHM7CisJdHJhbnNhY3Rpb24tPnRfdXBkYXRlcy0tOworCWlmICghdHJhbnNhY3Rpb24tPnRfdXBkYXRlcykgeworCQl3YWtlX3VwKCZqb3VybmFsLT5qX3dhaXRfdXBkYXRlcyk7CisJCWlmIChqb3VybmFsLT5qX2JhcnJpZXJfY291bnQpCisJCQl3YWtlX3VwKCZqb3VybmFsLT5qX3dhaXRfdHJhbnNhY3Rpb25fbG9ja2VkKTsKKwl9CisKKwkvKgorCSAqIElmIHRoZSBoYW5kbGUgaXMgbWFya2VkIFNZTkMsIHdlIG5lZWQgdG8gc2V0IGFub3RoZXIgY29tbWl0CisJICogZ29pbmchICBXZSBhbHNvIHdhbnQgdG8gZm9yY2UgYSBjb21taXQgaWYgdGhlIGN1cnJlbnQKKwkgKiB0cmFuc2FjdGlvbiBpcyBvY2N1cHlpbmcgdG9vIG11Y2ggb2YgdGhlIGxvZywgb3IgaWYgdGhlCisJICogdHJhbnNhY3Rpb24gaXMgdG9vIG9sZCBub3cuCisJICovCisJaWYgKGhhbmRsZS0+aF9zeW5jIHx8CisJCQl0cmFuc2FjdGlvbi0+dF9vdXRzdGFuZGluZ19jcmVkaXRzID4KKwkJCQlqb3VybmFsLT5qX21heF90cmFuc2FjdGlvbl9idWZmZXJzIHx8CisJCQl0aW1lX2FmdGVyX2VxKGppZmZpZXMsIHRyYW5zYWN0aW9uLT50X2V4cGlyZXMpKSB7CisJCS8qIERvIHRoaXMgZXZlbiBmb3IgYWJvcnRlZCBqb3VybmFsczogYW4gYWJvcnQgc3RpbGwKKwkJICogY29tcGxldGVzIHRoZSBjb21taXQgdGhyZWFkLCBpdCBqdXN0IGRvZXNuJ3Qgd3JpdGUKKwkJICogYW55dGhpbmcgdG8gZGlzay4gKi8KKwkJdGlkX3QgdGlkID0gdHJhbnNhY3Rpb24tPnRfdGlkOworCisJCXNwaW5fdW5sb2NrKCZ0cmFuc2FjdGlvbi0+dF9oYW5kbGVfbG9jayk7CisJCWpiZF9kZWJ1ZygyLCAidHJhbnNhY3Rpb24gdG9vIG9sZCwgcmVxdWVzdGluZyBjb21taXQgZm9yICIKKwkJCQkJImhhbmRsZSAlcFxuIiwgaGFuZGxlKTsKKwkJLyogVGhpcyBpcyBub24tYmxvY2tpbmcgKi8KKwkJX19qYmQyX2xvZ19zdGFydF9jb21taXQoam91cm5hbCwgdHJhbnNhY3Rpb24tPnRfdGlkKTsKKwkJc3Bpbl91bmxvY2soJmpvdXJuYWwtPmpfc3RhdGVfbG9jayk7CisKKwkJLyoKKwkJICogU3BlY2lhbCBjYXNlOiBKQkQyX1NZTkMgc3luY2hyb25vdXMgdXBkYXRlcyByZXF1aXJlIHVzCisJCSAqIHRvIHdhaXQgZm9yIHRoZSBjb21taXQgdG8gY29tcGxldGUuCisJCSAqLworCQlpZiAoaGFuZGxlLT5oX3N5bmMgJiYgIShjdXJyZW50LT5mbGFncyAmIFBGX01FTUFMTE9DKSkKKwkJCWVyciA9IGpiZDJfbG9nX3dhaXRfY29tbWl0KGpvdXJuYWwsIHRpZCk7CisJfSBlbHNlIHsKKwkJc3Bpbl91bmxvY2soJnRyYW5zYWN0aW9uLT50X2hhbmRsZV9sb2NrKTsKKwkJc3Bpbl91bmxvY2soJmpvdXJuYWwtPmpfc3RhdGVfbG9jayk7CisJfQorCisJamJkX2ZyZWVfaGFuZGxlKGhhbmRsZSk7CisJcmV0dXJuIGVycjsKK30KKworLyoqaW50IGpiZDJfam91cm5hbF9mb3JjZV9jb21taXQoKSAtIGZvcmNlIGFueSB1bmNvbW1pdHRlZCB0cmFuc2FjdGlvbnMKKyAqIEBqb3VybmFsOiBqb3VybmFsIHRvIGZvcmNlCisgKgorICogRm9yIHN5bmNocm9ub3VzIG9wZXJhdGlvbnM6IGZvcmNlIGFueSB1bmNvbW1pdHRlZCB0cmFuc2FjdGlvbnMKKyAqIHRvIGRpc2suICBNYXkgc2VlbSBrbHVkZ3ksIGJ1dCBpdCByZXVzZXMgYWxsIHRoZSBoYW5kbGUgYmF0Y2hpbmcKKyAqIGNvZGUgaW4gYSB2ZXJ5IHNpbXBsZSBtYW5uZXIuCisgKi8KK2ludCBqYmQyX2pvdXJuYWxfZm9yY2VfY29tbWl0KGpvdXJuYWxfdCAqam91cm5hbCkKK3sKKwloYW5kbGVfdCAqaGFuZGxlOworCWludCByZXQ7CisKKwloYW5kbGUgPSBqYmQyX2pvdXJuYWxfc3RhcnQoam91cm5hbCwgMSk7CisJaWYgKElTX0VSUihoYW5kbGUpKSB7CisJCXJldCA9IFBUUl9FUlIoaGFuZGxlKTsKKwl9IGVsc2UgeworCQloYW5kbGUtPmhfc3luYyA9IDE7CisJCXJldCA9IGpiZDJfam91cm5hbF9zdG9wKGhhbmRsZSk7CisJfQorCXJldHVybiByZXQ7Cit9CisKKy8qCisgKgorICogTGlzdCBtYW5hZ2VtZW50IGNvZGUgc25pcHBldHM6IHZhcmlvdXMgZnVuY3Rpb25zIGZvciBtYW5pcHVsYXRpbmcgdGhlCisgKiB0cmFuc2FjdGlvbiBidWZmZXIgbGlzdHMuCisgKgorICovCisKKy8qCisgKiBBcHBlbmQgYSBidWZmZXIgdG8gYSB0cmFuc2FjdGlvbiBsaXN0LCBnaXZlbiB0aGUgdHJhbnNhY3Rpb24ncyBsaXN0IGhlYWQKKyAqIHBvaW50ZXIuCisgKgorICogal9saXN0X2xvY2sgaXMgaGVsZC4KKyAqCisgKiBqYmRfbG9ja19iaF9zdGF0ZShqaDJiaChqaCkpIGlzIGhlbGQuCisgKi8KKworc3RhdGljIGlubGluZSB2b2lkCitfX2JsaXN0X2FkZF9idWZmZXIoc3RydWN0IGpvdXJuYWxfaGVhZCAqKmxpc3QsIHN0cnVjdCBqb3VybmFsX2hlYWQgKmpoKQoreworCWlmICghKmxpc3QpIHsKKwkJamgtPmJfdG5leHQgPSBqaC0+Yl90cHJldiA9IGpoOworCQkqbGlzdCA9IGpoOworCX0gZWxzZSB7CisJCS8qIEluc2VydCBhdCB0aGUgdGFpbCBvZiB0aGUgbGlzdCB0byBwcmVzZXJ2ZSBvcmRlciAqLworCQlzdHJ1Y3Qgam91cm5hbF9oZWFkICpmaXJzdCA9ICpsaXN0LCAqbGFzdCA9IGZpcnN0LT5iX3RwcmV2OworCQlqaC0+Yl90cHJldiA9IGxhc3Q7CisJCWpoLT5iX3RuZXh0ID0gZmlyc3Q7CisJCWxhc3QtPmJfdG5leHQgPSBmaXJzdC0+Yl90cHJldiA9IGpoOworCX0KK30KKworLyoKKyAqIFJlbW92ZSBhIGJ1ZmZlciBmcm9tIGEgdHJhbnNhY3Rpb24gbGlzdCwgZ2l2ZW4gdGhlIHRyYW5zYWN0aW9uJ3MgbGlzdAorICogaGVhZCBwb2ludGVyLgorICoKKyAqIENhbGxlZCB3aXRoIGpfbGlzdF9sb2NrIGhlbGQsIGFuZCB0aGUgam91cm5hbCBtYXkgbm90IGJlIGxvY2tlZC4KKyAqCisgKiBqYmRfbG9ja19iaF9zdGF0ZShqaDJiaChqaCkpIGlzIGhlbGQuCisgKi8KKworc3RhdGljIGlubGluZSB2b2lkCitfX2JsaXN0X2RlbF9idWZmZXIoc3RydWN0IGpvdXJuYWxfaGVhZCAqKmxpc3QsIHN0cnVjdCBqb3VybmFsX2hlYWQgKmpoKQoreworCWlmICgqbGlzdCA9PSBqaCkgeworCQkqbGlzdCA9IGpoLT5iX3RuZXh0OworCQlpZiAoKmxpc3QgPT0gamgpCisJCQkqbGlzdCA9IE5VTEw7CisJfQorCWpoLT5iX3RwcmV2LT5iX3RuZXh0ID0gamgtPmJfdG5leHQ7CisJamgtPmJfdG5leHQtPmJfdHByZXYgPSBqaC0+Yl90cHJldjsKK30KKworLyoKKyAqIFJlbW92ZSBhIGJ1ZmZlciBmcm9tIHRoZSBhcHByb3ByaWF0ZSB0cmFuc2FjdGlvbiBsaXN0LgorICoKKyAqIE5vdGUgdGhhdCB0aGlzIGZ1bmN0aW9uIGNhbiAqY2hhbmdlKiB0aGUgdmFsdWUgb2YKKyAqIGJoLT5iX3RyYW5zYWN0aW9uLT50X3N5bmNfZGF0YWxpc3QsIHRfYnVmZmVycywgdF9mb3JnZXQsCisgKiB0X2lvYnVmX2xpc3QsIHRfc2hhZG93X2xpc3QsIHRfbG9nX2xpc3Qgb3IgdF9yZXNlcnZlZF9saXN0LiAgSWYgdGhlIGNhbGxlcgorICogaXMgaG9sZGluZyBvbnRvIGEgY29weSBvZiBvbmUgb2YgdGhlZSBwb2ludGVycywgaXQgY291bGQgZ28gYmFkLgorICogR2VuZXJhbGx5IHRoZSBjYWxsZXIgbmVlZHMgdG8gcmUtcmVhZCB0aGUgcG9pbnRlciBmcm9tIHRoZSB0cmFuc2FjdGlvbl90LgorICoKKyAqIENhbGxlZCB1bmRlciBqX2xpc3RfbG9jay4gIFRoZSBqb3VybmFsIG1heSBub3QgYmUgbG9ja2VkLgorICovCit2b2lkIF9famJkMl9qb3VybmFsX3RlbXBfdW5saW5rX2J1ZmZlcihzdHJ1Y3Qgam91cm5hbF9oZWFkICpqaCkKK3sKKwlzdHJ1Y3Qgam91cm5hbF9oZWFkICoqbGlzdCA9IE5VTEw7CisJdHJhbnNhY3Rpb25fdCAqdHJhbnNhY3Rpb247CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCA9IGpoMmJoKGpoKTsKKworCUpfQVNTRVJUX0pIKGpoLCBqYmRfaXNfbG9ja2VkX2JoX3N0YXRlKGJoKSk7CisJdHJhbnNhY3Rpb24gPSBqaC0+Yl90cmFuc2FjdGlvbjsKKwlpZiAodHJhbnNhY3Rpb24pCisJCWFzc2VydF9zcGluX2xvY2tlZCgmdHJhbnNhY3Rpb24tPnRfam91cm5hbC0+al9saXN0X2xvY2spOworCisJSl9BU1NFUlRfSkgoamgsIGpoLT5iX2psaXN0IDwgQkpfVHlwZXMpOworCWlmIChqaC0+Yl9qbGlzdCAhPSBCSl9Ob25lKQorCQlKX0FTU0VSVF9KSChqaCwgdHJhbnNhY3Rpb24gIT0gMCk7CisKKwlzd2l0Y2ggKGpoLT5iX2psaXN0KSB7CisJY2FzZSBCSl9Ob25lOgorCQlyZXR1cm47CisJY2FzZSBCSl9TeW5jRGF0YToKKwkJbGlzdCA9ICZ0cmFuc2FjdGlvbi0+dF9zeW5jX2RhdGFsaXN0OworCQlicmVhazsKKwljYXNlIEJKX01ldGFkYXRhOgorCQl0cmFuc2FjdGlvbi0+dF9ucl9idWZmZXJzLS07CisJCUpfQVNTRVJUX0pIKGpoLCB0cmFuc2FjdGlvbi0+dF9ucl9idWZmZXJzID49IDApOworCQlsaXN0ID0gJnRyYW5zYWN0aW9uLT50X2J1ZmZlcnM7CisJCWJyZWFrOworCWNhc2UgQkpfRm9yZ2V0OgorCQlsaXN0ID0gJnRyYW5zYWN0aW9uLT50X2ZvcmdldDsKKwkJYnJlYWs7CisJY2FzZSBCSl9JTzoKKwkJbGlzdCA9ICZ0cmFuc2FjdGlvbi0+dF9pb2J1Zl9saXN0OworCQlicmVhazsKKwljYXNlIEJKX1NoYWRvdzoKKwkJbGlzdCA9ICZ0cmFuc2FjdGlvbi0+dF9zaGFkb3dfbGlzdDsKKwkJYnJlYWs7CisJY2FzZSBCSl9Mb2dDdGw6CisJCWxpc3QgPSAmdHJhbnNhY3Rpb24tPnRfbG9nX2xpc3Q7CisJCWJyZWFrOworCWNhc2UgQkpfUmVzZXJ2ZWQ6CisJCWxpc3QgPSAmdHJhbnNhY3Rpb24tPnRfcmVzZXJ2ZWRfbGlzdDsKKwkJYnJlYWs7CisJY2FzZSBCSl9Mb2NrZWQ6CisJCWxpc3QgPSAmdHJhbnNhY3Rpb24tPnRfbG9ja2VkX2xpc3Q7CisJCWJyZWFrOworCX0KKworCV9fYmxpc3RfZGVsX2J1ZmZlcihsaXN0LCBqaCk7CisJamgtPmJfamxpc3QgPSBCSl9Ob25lOworCWlmICh0ZXN0X2NsZWFyX2J1ZmZlcl9qYmRkaXJ0eShiaCkpCisJCW1hcmtfYnVmZmVyX2RpcnR5KGJoKTsJLyogRXhwb3NlIGl0IHRvIHRoZSBWTSAqLworfQorCit2b2lkIF9famJkMl9qb3VybmFsX3VuZmlsZV9idWZmZXIoc3RydWN0IGpvdXJuYWxfaGVhZCAqamgpCit7CisJX19qYmQyX2pvdXJuYWxfdGVtcF91bmxpbmtfYnVmZmVyKGpoKTsKKwlqaC0+Yl90cmFuc2FjdGlvbiA9IE5VTEw7Cit9CisKK3ZvaWQgamJkMl9qb3VybmFsX3VuZmlsZV9idWZmZXIoam91cm5hbF90ICpqb3VybmFsLCBzdHJ1Y3Qgam91cm5hbF9oZWFkICpqaCkKK3sKKwlqYmRfbG9ja19iaF9zdGF0ZShqaDJiaChqaCkpOworCXNwaW5fbG9jaygmam91cm5hbC0+al9saXN0X2xvY2spOworCV9famJkMl9qb3VybmFsX3VuZmlsZV9idWZmZXIoamgpOworCXNwaW5fdW5sb2NrKCZqb3VybmFsLT5qX2xpc3RfbG9jayk7CisJamJkX3VubG9ja19iaF9zdGF0ZShqaDJiaChqaCkpOworfQorCisvKgorICogQ2FsbGVkIGZyb20gamJkMl9qb3VybmFsX3RyeV90b19mcmVlX2J1ZmZlcnMoKS4KKyAqCisgKiBDYWxsZWQgdW5kZXIgamJkX2xvY2tfYmhfc3RhdGUoYmgpCisgKi8KK3N0YXRpYyB2b2lkCitfX2pvdXJuYWxfdHJ5X3RvX2ZyZWVfYnVmZmVyKGpvdXJuYWxfdCAqam91cm5hbCwgc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCkKK3sKKwlzdHJ1Y3Qgam91cm5hbF9oZWFkICpqaDsKKworCWpoID0gYmgyamgoYmgpOworCisJaWYgKGJ1ZmZlcl9sb2NrZWQoYmgpIHx8IGJ1ZmZlcl9kaXJ0eShiaCkpCisJCWdvdG8gb3V0OworCisJaWYgKGpoLT5iX25leHRfdHJhbnNhY3Rpb24gIT0gMCkKKwkJZ290byBvdXQ7CisKKwlzcGluX2xvY2soJmpvdXJuYWwtPmpfbGlzdF9sb2NrKTsKKwlpZiAoamgtPmJfdHJhbnNhY3Rpb24gIT0gMCAmJiBqaC0+Yl9jcF90cmFuc2FjdGlvbiA9PSAwKSB7CisJCWlmIChqaC0+Yl9qbGlzdCA9PSBCSl9TeW5jRGF0YSB8fCBqaC0+Yl9qbGlzdCA9PSBCSl9Mb2NrZWQpIHsKKwkJCS8qIEEgd3JpdHRlbi1iYWNrIG9yZGVyZWQgZGF0YSBidWZmZXIgKi8KKwkJCUpCVUZGRVJfVFJBQ0UoamgsICJyZWxlYXNlIGRhdGEiKTsKKwkJCV9famJkMl9qb3VybmFsX3VuZmlsZV9idWZmZXIoamgpOworCQkJamJkMl9qb3VybmFsX3JlbW92ZV9qb3VybmFsX2hlYWQoYmgpOworCQkJX19icmVsc2UoYmgpOworCQl9CisJfSBlbHNlIGlmIChqaC0+Yl9jcF90cmFuc2FjdGlvbiAhPSAwICYmIGpoLT5iX3RyYW5zYWN0aW9uID09IDApIHsKKwkJLyogd3JpdHRlbi1iYWNrIGNoZWNrcG9pbnRlZCBtZXRhZGF0YSBidWZmZXIgKi8KKwkJaWYgKGpoLT5iX2psaXN0ID09IEJKX05vbmUpIHsKKwkJCUpCVUZGRVJfVFJBQ0UoamgsICJyZW1vdmUgZnJvbSBjaGVja3BvaW50IGxpc3QiKTsKKwkJCV9famJkMl9qb3VybmFsX3JlbW92ZV9jaGVja3BvaW50KGpoKTsKKwkJCWpiZDJfam91cm5hbF9yZW1vdmVfam91cm5hbF9oZWFkKGJoKTsKKwkJCV9fYnJlbHNlKGJoKTsKKwkJfQorCX0KKwlzcGluX3VubG9jaygmam91cm5hbC0+al9saXN0X2xvY2spOworb3V0OgorCXJldHVybjsKK30KKworCisvKioKKyAqIGludCBqYmQyX2pvdXJuYWxfdHJ5X3RvX2ZyZWVfYnVmZmVycygpIC0gdHJ5IHRvIGZyZWUgcGFnZSBidWZmZXJzLgorICogQGpvdXJuYWw6IGpvdXJuYWwgZm9yIG9wZXJhdGlvbgorICogQHBhZ2U6IHRvIHRyeSBhbmQgZnJlZQorICogQHVudXNlZF9nZnBfbWFzazogdW51c2VkCisgKgorICoKKyAqIEZvciBhbGwgdGhlIGJ1ZmZlcnMgb24gdGhpcyBwYWdlLAorICogaWYgdGhleSBhcmUgZnVsbHkgd3JpdHRlbiBvdXQgb3JkZXJlZCBkYXRhLCBtb3ZlIHRoZW0gb250byBCVUZfQ0xFQU4KKyAqIHNvIHRyeV90b19mcmVlX2J1ZmZlcnMoKSBjYW4gcmVhcCB0aGVtLgorICoKKyAqIFRoaXMgZnVuY3Rpb24gcmV0dXJucyBub24temVybyBpZiB3ZSB3aXNoIHRyeV90b19mcmVlX2J1ZmZlcnMoKQorICogdG8gYmUgY2FsbGVkLiBXZSBkbyB0aGlzIGlmIHRoZSBwYWdlIGlzIHJlbGVhc2FibGUgYnkgdHJ5X3RvX2ZyZWVfYnVmZmVycygpLgorICogV2UgYWxzbyBkbyBpdCBpZiB0aGUgcGFnZSBoYXMgbG9ja2VkIG9yIGRpcnR5IGJ1ZmZlcnMgYW5kIHRoZSBjYWxsZXIgd2FudHMKKyAqIHVzIHRvIHBlcmZvcm0gc3luYyBvciBhc3luYyB3cml0ZW91dC4KKyAqCisgKiBUaGlzIGNvbXBsaWNhdGVzIEpCRCBsb2NraW5nIHNvbWV3aGF0LiAgV2UgYXJlbid0IHByb3RlY3RlZCBieSB0aGUKKyAqIEJLTCBoZXJlLiAgV2Ugd2lzaCB0byByZW1vdmUgdGhlIGJ1ZmZlciBmcm9tIGl0cyBjb21taXR0aW5nIG9yCisgKiBydW5uaW5nIHRyYW5zYWN0aW9uJ3MgLT50X2RhdGFsaXN0IHZpYSBfX2piZDJfam91cm5hbF91bmZpbGVfYnVmZmVyLgorICoKKyAqIFRoaXMgbWF5ICpjaGFuZ2UqIHRoZSB2YWx1ZSBvZiB0cmFuc2FjdGlvbl90LT50X2RhdGFsaXN0LCBzbyBhbnlvbmUKKyAqIHdobyBsb29rcyBhdCB0X2RhdGFsaXN0IG5lZWRzIHRvIGxvY2sgYWdhaW5zdCB0aGlzIGZ1bmN0aW9uLgorICoKKyAqIEV2ZW4gd29yc2UsIHNvbWVvbmUgbWF5IGJlIGRvaW5nIGEgamJkMl9qb3VybmFsX2RpcnR5X2RhdGEgb24gdGhpcworICogYnVmZmVyLiAgU28gd2UgbmVlZCB0byBsb2NrIGFnYWluc3QgdGhhdC4gIGpiZDJfam91cm5hbF9kaXJ0eV9kYXRhKCkKKyAqIHdpbGwgY29tZSBvdXQgb2YgdGhlIGxvY2sgd2l0aCB0aGUgYnVmZmVyIGRpcnR5LCB3aGljaCBtYWtlcyBpdAorICogaW5lbGlnaWJsZSBmb3IgcmVsZWFzZSBoZXJlLgorICoKKyAqIFdobyBlbHNlIGlzIGFmZmVjdGVkIGJ5IHRoaXM/ICBobW0uLi4gIFJlYWxseSB0aGUgb25seSBjb250ZW5kZXIKKyAqIGlzIGRvX2dldF93cml0ZV9hY2Nlc3MoKSAtIGl0IGNvdWxkIGJlIGxvb2tpbmcgYXQgdGhlIGJ1ZmZlciB3aGlsZQorICogam91cm5hbF90cnlfdG9fZnJlZV9idWZmZXIoKSBpcyBjaGFuZ2luZyBpdHMgc3RhdGUuICBCdXQgdGhhdAorICogY2Fubm90IGhhcHBlbiBiZWNhdXNlIHdlIG5ldmVyIHJlYWxsb2NhdGUgZnJlZWQgZGF0YSBhcyBtZXRhZGF0YQorICogd2hpbGUgdGhlIGRhdGEgaXMgcGFydCBvZiBhIHRyYW5zYWN0aW9uLiAgWWVzPworICovCitpbnQgamJkMl9qb3VybmFsX3RyeV90b19mcmVlX2J1ZmZlcnMoam91cm5hbF90ICpqb3VybmFsLAorCQkJCXN0cnVjdCBwYWdlICpwYWdlLCBnZnBfdCB1bnVzZWRfZ2ZwX21hc2spCit7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpoZWFkOworCXN0cnVjdCBidWZmZXJfaGVhZCAqYmg7CisJaW50IHJldCA9IDA7CisKKwlKX0FTU0VSVChQYWdlTG9ja2VkKHBhZ2UpKTsKKworCWhlYWQgPSBwYWdlX2J1ZmZlcnMocGFnZSk7CisJYmggPSBoZWFkOworCWRvIHsKKwkJc3RydWN0IGpvdXJuYWxfaGVhZCAqamg7CisKKwkJLyoKKwkJICogV2UgdGFrZSBvdXIgb3duIHJlZiBhZ2FpbnN0IHRoZSBqb3VybmFsX2hlYWQgaGVyZSB0byBhdm9pZAorCQkgKiBoYXZpbmcgdG8gYWRkIHRvbnMgb2YgbG9ja2luZyBhcm91bmQgZWFjaCBpbnN0YW5jZSBvZgorCQkgKiBqYmQyX2pvdXJuYWxfcmVtb3ZlX2pvdXJuYWxfaGVhZCgpIGFuZCBqYmQyX2pvdXJuYWxfcHV0X2pvdXJuYWxfaGVhZCgpLgorCQkgKi8KKwkJamggPSBqYmQyX2pvdXJuYWxfZ3JhYl9qb3VybmFsX2hlYWQoYmgpOworCQlpZiAoIWpoKQorCQkJY29udGludWU7CisKKwkJamJkX2xvY2tfYmhfc3RhdGUoYmgpOworCQlfX2pvdXJuYWxfdHJ5X3RvX2ZyZWVfYnVmZmVyKGpvdXJuYWwsIGJoKTsKKwkJamJkMl9qb3VybmFsX3B1dF9qb3VybmFsX2hlYWQoamgpOworCQlqYmRfdW5sb2NrX2JoX3N0YXRlKGJoKTsKKwkJaWYgKGJ1ZmZlcl9qYmQoYmgpKQorCQkJZ290byBidXN5OworCX0gd2hpbGUgKChiaCA9IGJoLT5iX3RoaXNfcGFnZSkgIT0gaGVhZCk7CisJcmV0ID0gdHJ5X3RvX2ZyZWVfYnVmZmVycyhwYWdlKTsKK2J1c3k6CisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqIFRoaXMgYnVmZmVyIGlzIG5vIGxvbmdlciBuZWVkZWQuICBJZiBpdCBpcyBvbiBhbiBvbGRlciB0cmFuc2FjdGlvbidzCisgKiBjaGVja3BvaW50IGxpc3Qgd2UgbmVlZCB0byByZWNvcmQgaXQgb24gdGhpcyB0cmFuc2FjdGlvbidzIGZvcmdldCBsaXN0CisgKiB0byBwaW4gdGhpcyBidWZmZXIgKGFuZCBoZW5jZSBpdHMgY2hlY2twb2ludGluZyB0cmFuc2FjdGlvbikgZG93biB1bnRpbAorICogdGhpcyB0cmFuc2FjdGlvbiBjb21taXRzLiAgSWYgdGhlIGJ1ZmZlciBpc24ndCBvbiBhIGNoZWNrcG9pbnQgbGlzdCwgd2UKKyAqIHJlbGVhc2UgaXQuCisgKiBSZXR1cm5zIG5vbi16ZXJvIGlmIEpCRCBubyBsb25nZXIgaGFzIGFuIGludGVyZXN0IGluIHRoZSBidWZmZXIuCisgKgorICogQ2FsbGVkIHVuZGVyIGpfbGlzdF9sb2NrLgorICoKKyAqIENhbGxlZCB1bmRlciBqYmRfbG9ja19iaF9zdGF0ZShiaCkuCisgKi8KK3N0YXRpYyBpbnQgX19kaXNwb3NlX2J1ZmZlcihzdHJ1Y3Qgam91cm5hbF9oZWFkICpqaCwgdHJhbnNhY3Rpb25fdCAqdHJhbnNhY3Rpb24pCit7CisJaW50IG1heV9mcmVlID0gMTsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoID0gamgyYmgoamgpOworCisJX19qYmQyX2pvdXJuYWxfdW5maWxlX2J1ZmZlcihqaCk7CisKKwlpZiAoamgtPmJfY3BfdHJhbnNhY3Rpb24pIHsKKwkJSkJVRkZFUl9UUkFDRShqaCwgIm9uIHJ1bm5pbmcrY3AgdHJhbnNhY3Rpb24iKTsKKwkJX19qYmQyX2pvdXJuYWxfZmlsZV9idWZmZXIoamgsIHRyYW5zYWN0aW9uLCBCSl9Gb3JnZXQpOworCQljbGVhcl9idWZmZXJfamJkZGlydHkoYmgpOworCQltYXlfZnJlZSA9IDA7CisJfSBlbHNlIHsKKwkJSkJVRkZFUl9UUkFDRShqaCwgIm9uIHJ1bm5pbmcgdHJhbnNhY3Rpb24iKTsKKwkJamJkMl9qb3VybmFsX3JlbW92ZV9qb3VybmFsX2hlYWQoYmgpOworCQlfX2JyZWxzZShiaCk7CisJfQorCXJldHVybiBtYXlfZnJlZTsKK30KKworLyoKKyAqIGpiZDJfam91cm5hbF9pbnZhbGlkYXRlcGFnZQorICoKKyAqIFRoaXMgY29kZSBpcyB0cmlja3kuICBJdCBoYXMgYSBudW1iZXIgb2YgY2FzZXMgdG8gZGVhbCB3aXRoLgorICoKKyAqIFRoZXJlIGFyZSB0d28gaW52YXJpYW50cyB3aGljaCB0aGlzIGNvZGUgcmVsaWVzIG9uOgorICoKKyAqIGlfc2l6ZSBtdXN0IGJlIHVwZGF0ZWQgb24gZGlzayBiZWZvcmUgd2Ugc3RhcnQgY2FsbGluZyBpbnZhbGlkYXRlcGFnZSBvbiB0aGUKKyAqIGRhdGEuCisgKgorICogIFRoaXMgaXMgZG9uZSBpbiBleHQzIGJ5IGRlZmluaW5nIGFuIGV4dDNfc2V0YXR0ciBtZXRob2Qgd2hpY2gKKyAqICB1cGRhdGVzIGlfc2l6ZSBiZWZvcmUgdHJ1bmNhdGUgZ2V0cyBnb2luZy4gIEJ5IG1haW50YWluaW5nIHRoaXMKKyAqICBpbnZhcmlhbnQsIHdlIGNhbiBiZSBzdXJlIHRoYXQgaXQgaXMgc2FmZSB0byB0aHJvdyBhd2F5IGFueSBidWZmZXJzCisgKiAgYXR0YWNoZWQgdG8gdGhlIGN1cnJlbnQgdHJhbnNhY3Rpb246IG9uY2UgdGhlIHRyYW5zYWN0aW9uIGNvbW1pdHMsCisgKiAgd2Uga25vdyB0aGF0IHRoZSBkYXRhIHdpbGwgbm90IGJlIG5lZWRlZC4KKyAqCisgKiAgTm90ZSBob3dldmVyIHRoYXQgd2UgY2FuICpub3QqIHRocm93IGF3YXkgZGF0YSBiZWxvbmdpbmcgdG8gdGhlCisgKiAgcHJldmlvdXMsIGNvbW1pdHRpbmcgdHJhbnNhY3Rpb24hCisgKgorICogQW55IGRpc2sgYmxvY2tzIHdoaWNoICphcmUqIHBhcnQgb2YgdGhlIHByZXZpb3VzLCBjb21taXR0aW5nCisgKiB0cmFuc2FjdGlvbiAoYW5kIHdoaWNoIHRoZXJlZm9yZSBjYW5ub3QgYmUgZGlzY2FyZGVkIGltbWVkaWF0ZWx5KSBhcmUKKyAqIG5vdCBnb2luZyB0byBiZSByZXVzZWQgaW4gdGhlIG5ldyBydW5uaW5nIHRyYW5zYWN0aW9uCisgKgorICogIFRoZSBiaXRtYXAgY29tbWl0dGVkX2RhdGEgaW1hZ2VzIGd1YXJhbnRlZSB0aGlzOiBhbnkgYmxvY2sgd2hpY2ggaXMKKyAqICBhbGxvY2F0ZWQgaW4gb25lIHRyYW5zYWN0aW9uIGFuZCByZW1vdmVkIGluIHRoZSBuZXh0IHdpbGwgYmUgbWFya2VkCisgKiAgYXMgaW4tdXNlIGluIHRoZSBjb21taXR0ZWRfZGF0YSBiaXRtYXAsIHNvIGNhbm5vdCBiZSByZXVzZWQgdW50aWwKKyAqICB0aGUgbmV4dCB0cmFuc2FjdGlvbiB0byBkZWxldGUgdGhlIGJsb2NrIGNvbW1pdHMuICBUaGlzIG1lYW5zIHRoYXQKKyAqICBsZWF2aW5nIGNvbW1pdHRpbmcgYnVmZmVycyBkaXJ0eSBpcyBxdWl0ZSBzYWZlOiB0aGUgZGlzayBibG9ja3MKKyAqICBjYW5ub3QgYmUgcmVhbGxvY2F0ZWQgdG8gYSBkaWZmZXJlbnQgZmlsZSBhbmQgc28gYnVmZmVyIGFsaWFzaW5nIGlzCisgKiAgbm90IHBvc3NpYmxlLgorICoKKyAqCisgKiBUaGUgYWJvdmUgYXBwbGllcyBtYWlubHkgdG8gb3JkZXJlZCBkYXRhIG1vZGUuICBJbiB3cml0ZWJhY2sgbW9kZSB3ZQorICogZG9uJ3QgbWFrZSBndWFyYW50ZWVzIGFib3V0IHRoZSBvcmRlciBpbiB3aGljaCBkYXRhIGhpdHMgZGlzayAtLS0gaW4KKyAqIHBhcnRpY3VsYXIgd2UgZG9uJ3QgZ3VhcmFudGVlIHRoYXQgbmV3IGRpcnR5IGRhdGEgaXMgZmx1c2hlZCBiZWZvcmUKKyAqIHRyYW5zYWN0aW9uIGNvbW1pdCAtLS0gc28gaXQgaXMgYWx3YXlzIHNhZmUganVzdCB0byBkaXNjYXJkIGRhdGEKKyAqIGltbWVkaWF0ZWx5IGluIHRoYXQgbW9kZS4gIC0tc2N0CisgKi8KKworLyoKKyAqIFRoZSBqb3VybmFsX3VubWFwX2J1ZmZlciBoZWxwZXIgZnVuY3Rpb24gcmV0dXJucyB6ZXJvIGlmIHRoZSBidWZmZXIKKyAqIGNvbmNlcm5lZCByZW1haW5zIHBpbm5lZCBhcyBhbiBhbm9ueW1vdXMgYnVmZmVyIGJlbG9uZ2luZyB0byBhbiBvbGRlcgorICogdHJhbnNhY3Rpb24uCisgKgorICogV2UncmUgb3V0c2lkZS10cmFuc2FjdGlvbiBoZXJlLiAgRWl0aGVyIG9yIGJvdGggb2Ygal9ydW5uaW5nX3RyYW5zYWN0aW9uCisgKiBhbmQgal9jb21taXR0aW5nX3RyYW5zYWN0aW9uIG1heSBiZSBOVUxMLgorICovCitzdGF0aWMgaW50IGpvdXJuYWxfdW5tYXBfYnVmZmVyKGpvdXJuYWxfdCAqam91cm5hbCwgc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCkKK3sKKwl0cmFuc2FjdGlvbl90ICp0cmFuc2FjdGlvbjsKKwlzdHJ1Y3Qgam91cm5hbF9oZWFkICpqaDsKKwlpbnQgbWF5X2ZyZWUgPSAxOworCWludCByZXQ7CisKKwlCVUZGRVJfVFJBQ0UoYmgsICJlbnRyeSIpOworCisJLyoKKwkgKiBJdCBpcyBzYWZlIHRvIHByb2NlZWQgaGVyZSB3aXRob3V0IHRoZSBqX2xpc3RfbG9jayBiZWNhdXNlIHRoZQorCSAqIGJ1ZmZlcnMgY2Fubm90IGJlIHN0b2xlbiBieSB0cnlfdG9fZnJlZV9idWZmZXJzIGFzIGxvbmcgYXMgd2UgYXJlCisJICogaG9sZGluZyB0aGUgcGFnZSBsb2NrLiAtLXNjdAorCSAqLworCisJaWYgKCFidWZmZXJfamJkKGJoKSkKKwkJZ290byB6YXBfYnVmZmVyX3VubG9ja2VkOworCisJc3Bpbl9sb2NrKCZqb3VybmFsLT5qX3N0YXRlX2xvY2spOworCWpiZF9sb2NrX2JoX3N0YXRlKGJoKTsKKwlzcGluX2xvY2soJmpvdXJuYWwtPmpfbGlzdF9sb2NrKTsKKworCWpoID0gamJkMl9qb3VybmFsX2dyYWJfam91cm5hbF9oZWFkKGJoKTsKKwlpZiAoIWpoKQorCQlnb3RvIHphcF9idWZmZXJfbm9famg7CisKKwl0cmFuc2FjdGlvbiA9IGpoLT5iX3RyYW5zYWN0aW9uOworCWlmICh0cmFuc2FjdGlvbiA9PSBOVUxMKSB7CisJCS8qIEZpcnN0IGNhc2U6IG5vdCBvbiBhbnkgdHJhbnNhY3Rpb24uICBJZiBpdAorCQkgKiBoYXMgbm8gY2hlY2twb2ludCBsaW5rLCB0aGVuIHdlIGNhbiB6YXAgaXQ6CisJCSAqIGl0J3MgYSB3cml0ZWJhY2stbW9kZSBidWZmZXIgc28gd2UgZG9uJ3QgY2FyZQorCQkgKiBpZiBpdCBoaXRzIGRpc2sgc2FmZWx5LiAqLworCQlpZiAoIWpoLT5iX2NwX3RyYW5zYWN0aW9uKSB7CisJCQlKQlVGRkVSX1RSQUNFKGpoLCAibm90IG9uIGFueSB0cmFuc2FjdGlvbjogemFwIik7CisJCQlnb3RvIHphcF9idWZmZXI7CisJCX0KKworCQlpZiAoIWJ1ZmZlcl9kaXJ0eShiaCkpIHsKKwkJCS8qIGJkZmx1c2ggaGFzIHdyaXR0ZW4gaXQuICBXZSBjYW4gZHJvcCBpdCBub3cgKi8KKwkJCWdvdG8gemFwX2J1ZmZlcjsKKwkJfQorCisJCS8qIE9LLCBpdCBtdXN0IGJlIGluIHRoZSBqb3VybmFsIGJ1dCBzdGlsbCBub3QKKwkJICogd3JpdHRlbiBmdWxseSB0byBkaXNrOiBpdCdzIG1ldGFkYXRhIG9yCisJCSAqIGpvdXJuYWxlZCBkYXRhLi4uICovCisKKwkJaWYgKGpvdXJuYWwtPmpfcnVubmluZ190cmFuc2FjdGlvbikgeworCQkJLyogLi4uIGFuZCBvbmNlIHRoZSBjdXJyZW50IHRyYW5zYWN0aW9uIGhhcworCQkJICogY29tbWl0dGVkLCB0aGUgYnVmZmVyIHdvbid0IGJlIG5lZWRlZCBhbnkKKwkJCSAqIGxvbmdlci4gKi8KKwkJCUpCVUZGRVJfVFJBQ0UoamgsICJjaGVja3BvaW50ZWQ6IGFkZCB0byBCSl9Gb3JnZXQiKTsKKwkJCXJldCA9IF9fZGlzcG9zZV9idWZmZXIoamgsCisJCQkJCWpvdXJuYWwtPmpfcnVubmluZ190cmFuc2FjdGlvbik7CisJCQlqYmQyX2pvdXJuYWxfcHV0X2pvdXJuYWxfaGVhZChqaCk7CisJCQlzcGluX3VubG9jaygmam91cm5hbC0+al9saXN0X2xvY2spOworCQkJamJkX3VubG9ja19iaF9zdGF0ZShiaCk7CisJCQlzcGluX3VubG9jaygmam91cm5hbC0+al9zdGF0ZV9sb2NrKTsKKwkJCXJldHVybiByZXQ7CisJCX0gZWxzZSB7CisJCQkvKiBUaGVyZSBpcyBubyBjdXJyZW50bHktcnVubmluZyB0cmFuc2FjdGlvbi4gU28gdGhlCisJCQkgKiBvcnBoYW4gcmVjb3JkIHdoaWNoIHdlIHdyb3RlIGZvciB0aGlzIGZpbGUgbXVzdCBoYXZlCisJCQkgKiBwYXNzZWQgaW50byBjb21taXQuICBXZSBtdXN0IGF0dGFjaCB0aGlzIGJ1ZmZlciB0bworCQkJICogdGhlIGNvbW1pdHRpbmcgdHJhbnNhY3Rpb24sIGlmIGl0IGV4aXN0cy4gKi8KKwkJCWlmIChqb3VybmFsLT5qX2NvbW1pdHRpbmdfdHJhbnNhY3Rpb24pIHsKKwkJCQlKQlVGRkVSX1RSQUNFKGpoLCAiZ2l2ZSB0byBjb21taXR0aW5nIHRyYW5zIik7CisJCQkJcmV0ID0gX19kaXNwb3NlX2J1ZmZlcihqaCwKKwkJCQkJam91cm5hbC0+al9jb21taXR0aW5nX3RyYW5zYWN0aW9uKTsKKwkJCQlqYmQyX2pvdXJuYWxfcHV0X2pvdXJuYWxfaGVhZChqaCk7CisJCQkJc3Bpbl91bmxvY2soJmpvdXJuYWwtPmpfbGlzdF9sb2NrKTsKKwkJCQlqYmRfdW5sb2NrX2JoX3N0YXRlKGJoKTsKKwkJCQlzcGluX3VubG9jaygmam91cm5hbC0+al9zdGF0ZV9sb2NrKTsKKwkJCQlyZXR1cm4gcmV0OworCQkJfSBlbHNlIHsKKwkJCQkvKiBUaGUgb3JwaGFuIHJlY29yZCdzIHRyYW5zYWN0aW9uIGhhcworCQkJCSAqIGNvbW1pdHRlZC4gIFdlIGNhbiBjbGVhbnNlIHRoaXMgYnVmZmVyICovCisJCQkJY2xlYXJfYnVmZmVyX2piZGRpcnR5KGJoKTsKKwkJCQlnb3RvIHphcF9idWZmZXI7CisJCQl9CisJCX0KKwl9IGVsc2UgaWYgKHRyYW5zYWN0aW9uID09IGpvdXJuYWwtPmpfY29tbWl0dGluZ190cmFuc2FjdGlvbikgeworCQlKQlVGRkVSX1RSQUNFKGpoLCAib24gY29tbWl0dGluZyB0cmFuc2FjdGlvbiIpOworCQlpZiAoamgtPmJfamxpc3QgPT0gQkpfTG9ja2VkKSB7CisJCQkvKgorCQkJICogVGhlIGJ1ZmZlciBpcyBvbiB0aGUgY29tbWl0dGluZyB0cmFuc2FjdGlvbidzIGxvY2tlZAorCQkJICogbGlzdC4gIFdlIGhhdmUgdGhlIGJ1ZmZlciBsb2NrZWQsIHNvIEkvTyBoYXMKKwkJCSAqIGNvbXBsZXRlZC4gIFNvIHdlIGNhbiBuYWlsIHRoZSBidWZmZXIgbm93LgorCQkJICovCisJCQltYXlfZnJlZSA9IF9fZGlzcG9zZV9idWZmZXIoamgsIHRyYW5zYWN0aW9uKTsKKwkJCWdvdG8gemFwX2J1ZmZlcjsKKwkJfQorCQkvKgorCQkgKiBJZiBpdCBpcyBjb21taXR0aW5nLCB3ZSBzaW1wbHkgY2Fubm90IHRvdWNoIGl0LiAgV2UKKwkJICogY2FuIHJlbW92ZSBpdCdzIG5leHRfdHJhbnNhY3Rpb24gcG9pbnRlciBmcm9tIHRoZQorCQkgKiBydW5uaW5nIHRyYW5zYWN0aW9uIGlmIHRoYXQgaXMgc2V0LCBidXQgbm90aGluZworCQkgKiBlbHNlLiAqLworCQlzZXRfYnVmZmVyX2ZyZWVkKGJoKTsKKwkJaWYgKGpoLT5iX25leHRfdHJhbnNhY3Rpb24pIHsKKwkJCUpfQVNTRVJUKGpoLT5iX25leHRfdHJhbnNhY3Rpb24gPT0KKwkJCQkJam91cm5hbC0+al9ydW5uaW5nX3RyYW5zYWN0aW9uKTsKKwkJCWpoLT5iX25leHRfdHJhbnNhY3Rpb24gPSBOVUxMOworCQl9CisJCWpiZDJfam91cm5hbF9wdXRfam91cm5hbF9oZWFkKGpoKTsKKwkJc3Bpbl91bmxvY2soJmpvdXJuYWwtPmpfbGlzdF9sb2NrKTsKKwkJamJkX3VubG9ja19iaF9zdGF0ZShiaCk7CisJCXNwaW5fdW5sb2NrKCZqb3VybmFsLT5qX3N0YXRlX2xvY2spOworCQlyZXR1cm4gMDsKKwl9IGVsc2UgeworCQkvKiBHb29kLCB0aGUgYnVmZmVyIGJlbG9uZ3MgdG8gdGhlIHJ1bm5pbmcgdHJhbnNhY3Rpb24uCisJCSAqIFdlIGFyZSB3cml0aW5nIG91ciBvd24gdHJhbnNhY3Rpb24ncyBkYXRhLCBub3QgYW55CisJCSAqIHByZXZpb3VzIG9uZSdzLCBzbyBpdCBpcyBzYWZlIHRvIHRocm93IGl0IGF3YXkKKwkJICogKHJlbWVtYmVyIHRoYXQgd2UgZXhwZWN0IHRoZSBmaWxlc3lzdGVtIHRvIGhhdmUgc2V0CisJCSAqIGlfc2l6ZSBhbHJlYWR5IGZvciB0aGlzIHRydW5jYXRlIHNvIHJlY292ZXJ5IHdpbGwgbm90CisJCSAqIGV4cG9zZSB0aGUgZGlzayBibG9ja3Mgd2UgYXJlIGRpc2NhcmRpbmcgaGVyZS4pICovCisJCUpfQVNTRVJUX0pIKGpoLCB0cmFuc2FjdGlvbiA9PSBqb3VybmFsLT5qX3J1bm5pbmdfdHJhbnNhY3Rpb24pOworCQlKQlVGRkVSX1RSQUNFKGpoLCAib24gcnVubmluZyB0cmFuc2FjdGlvbiIpOworCQltYXlfZnJlZSA9IF9fZGlzcG9zZV9idWZmZXIoamgsIHRyYW5zYWN0aW9uKTsKKwl9CisKK3phcF9idWZmZXI6CisJamJkMl9qb3VybmFsX3B1dF9qb3VybmFsX2hlYWQoamgpOworemFwX2J1ZmZlcl9ub19qaDoKKwlzcGluX3VubG9jaygmam91cm5hbC0+al9saXN0X2xvY2spOworCWpiZF91bmxvY2tfYmhfc3RhdGUoYmgpOworCXNwaW5fdW5sb2NrKCZqb3VybmFsLT5qX3N0YXRlX2xvY2spOworemFwX2J1ZmZlcl91bmxvY2tlZDoKKwljbGVhcl9idWZmZXJfZGlydHkoYmgpOworCUpfQVNTRVJUX0JIKGJoLCAhYnVmZmVyX2piZGRpcnR5KGJoKSk7CisJY2xlYXJfYnVmZmVyX21hcHBlZChiaCk7CisJY2xlYXJfYnVmZmVyX3JlcShiaCk7CisJY2xlYXJfYnVmZmVyX25ldyhiaCk7CisJYmgtPmJfYmRldiA9IE5VTEw7CisJcmV0dXJuIG1heV9mcmVlOworfQorCisvKioKKyAqIHZvaWQgamJkMl9qb3VybmFsX2ludmFsaWRhdGVwYWdlKCkKKyAqIEBqb3VybmFsOiBqb3VybmFsIHRvIHVzZSBmb3IgZmx1c2guLi4KKyAqIEBwYWdlOiAgICBwYWdlIHRvIGZsdXNoCisgKiBAb2Zmc2V0OiAgbGVuZ3RoIG9mIHBhZ2UgdG8gaW52YWxpZGF0ZS4KKyAqCisgKiBSZWFwIHBhZ2UgYnVmZmVycyBjb250YWluaW5nIGRhdGEgYWZ0ZXIgb2Zmc2V0IGluIHBhZ2UuCisgKgorICovCit2b2lkIGpiZDJfam91cm5hbF9pbnZhbGlkYXRlcGFnZShqb3VybmFsX3QgKmpvdXJuYWwsCisJCSAgICAgIHN0cnVjdCBwYWdlICpwYWdlLAorCQkgICAgICB1bnNpZ25lZCBsb25nIG9mZnNldCkKK3sKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmhlYWQsICpiaCwgKm5leHQ7CisJdW5zaWduZWQgaW50IGN1cnJfb2ZmID0gMDsKKwlpbnQgbWF5X2ZyZWUgPSAxOworCisJaWYgKCFQYWdlTG9ja2VkKHBhZ2UpKQorCQlCVUcoKTsKKwlpZiAoIXBhZ2VfaGFzX2J1ZmZlcnMocGFnZSkpCisJCXJldHVybjsKKworCS8qIFdlIHdpbGwgcG90ZW50aWFsbHkgYmUgcGxheWluZyB3aXRoIGxpc3RzIG90aGVyIHRoYW4ganVzdCB0aGUKKwkgKiBkYXRhIGxpc3RzIChlc3BlY2lhbGx5IGZvciBqb3VybmFsZWQgZGF0YSBtb2RlKSwgc28gYmUKKwkgKiBjYXV0aW91cyBpbiBvdXIgbG9ja2luZy4gKi8KKworCWhlYWQgPSBiaCA9IHBhZ2VfYnVmZmVycyhwYWdlKTsKKwlkbyB7CisJCXVuc2lnbmVkIGludCBuZXh0X29mZiA9IGN1cnJfb2ZmICsgYmgtPmJfc2l6ZTsKKwkJbmV4dCA9IGJoLT5iX3RoaXNfcGFnZTsKKworCQlpZiAob2Zmc2V0IDw9IGN1cnJfb2ZmKSB7CisJCQkvKiBUaGlzIGJsb2NrIGlzIHdob2xseSBvdXRzaWRlIHRoZSB0cnVuY2F0aW9uIHBvaW50ICovCisJCQlsb2NrX2J1ZmZlcihiaCk7CisJCQltYXlfZnJlZSAmPSBqb3VybmFsX3VubWFwX2J1ZmZlcihqb3VybmFsLCBiaCk7CisJCQl1bmxvY2tfYnVmZmVyKGJoKTsKKwkJfQorCQljdXJyX29mZiA9IG5leHRfb2ZmOworCQliaCA9IG5leHQ7CisKKwl9IHdoaWxlIChiaCAhPSBoZWFkKTsKKworCWlmICghb2Zmc2V0KSB7CisJCWlmIChtYXlfZnJlZSAmJiB0cnlfdG9fZnJlZV9idWZmZXJzKHBhZ2UpKQorCQkJSl9BU1NFUlQoIXBhZ2VfaGFzX2J1ZmZlcnMocGFnZSkpOworCX0KK30KKworLyoKKyAqIEZpbGUgYSBidWZmZXIgb24gdGhlIGdpdmVuIHRyYW5zYWN0aW9uIGxpc3QuCisgKi8KK3ZvaWQgX19qYmQyX2pvdXJuYWxfZmlsZV9idWZmZXIoc3RydWN0IGpvdXJuYWxfaGVhZCAqamgsCisJCQl0cmFuc2FjdGlvbl90ICp0cmFuc2FjdGlvbiwgaW50IGpsaXN0KQoreworCXN0cnVjdCBqb3VybmFsX2hlYWQgKipsaXN0ID0gTlVMTDsKKwlpbnQgd2FzX2RpcnR5ID0gMDsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoID0gamgyYmgoamgpOworCisJSl9BU1NFUlRfSkgoamgsIGpiZF9pc19sb2NrZWRfYmhfc3RhdGUoYmgpKTsKKwlhc3NlcnRfc3Bpbl9sb2NrZWQoJnRyYW5zYWN0aW9uLT50X2pvdXJuYWwtPmpfbGlzdF9sb2NrKTsKKworCUpfQVNTRVJUX0pIKGpoLCBqaC0+Yl9qbGlzdCA8IEJKX1R5cGVzKTsKKwlKX0FTU0VSVF9KSChqaCwgamgtPmJfdHJhbnNhY3Rpb24gPT0gdHJhbnNhY3Rpb24gfHwKKwkJCQlqaC0+Yl90cmFuc2FjdGlvbiA9PSAwKTsKKworCWlmIChqaC0+Yl90cmFuc2FjdGlvbiAmJiBqaC0+Yl9qbGlzdCA9PSBqbGlzdCkKKwkJcmV0dXJuOworCisJLyogVGhlIGZvbGxvd2luZyBsaXN0IG9mIGJ1ZmZlciBzdGF0ZXMgbmVlZHMgdG8gYmUgY29uc2lzdGVudAorCSAqIHdpdGggX19qYmRfdW5leHBlY3RlZF9kaXJ0eV9idWZmZXIoKSdzIGhhbmRsaW5nIG9mIGRpcnR5CisJICogc3RhdGUuICovCisKKwlpZiAoamxpc3QgPT0gQkpfTWV0YWRhdGEgfHwgamxpc3QgPT0gQkpfUmVzZXJ2ZWQgfHwKKwkgICAgamxpc3QgPT0gQkpfU2hhZG93IHx8IGpsaXN0ID09IEJKX0ZvcmdldCkgeworCQlpZiAodGVzdF9jbGVhcl9idWZmZXJfZGlydHkoYmgpIHx8CisJCSAgICB0ZXN0X2NsZWFyX2J1ZmZlcl9qYmRkaXJ0eShiaCkpCisJCQl3YXNfZGlydHkgPSAxOworCX0KKworCWlmIChqaC0+Yl90cmFuc2FjdGlvbikKKwkJX19qYmQyX2pvdXJuYWxfdGVtcF91bmxpbmtfYnVmZmVyKGpoKTsKKwlqaC0+Yl90cmFuc2FjdGlvbiA9IHRyYW5zYWN0aW9uOworCisJc3dpdGNoIChqbGlzdCkgeworCWNhc2UgQkpfTm9uZToKKwkJSl9BU1NFUlRfSkgoamgsICFqaC0+Yl9jb21taXR0ZWRfZGF0YSk7CisJCUpfQVNTRVJUX0pIKGpoLCAhamgtPmJfZnJvemVuX2RhdGEpOworCQlyZXR1cm47CisJY2FzZSBCSl9TeW5jRGF0YToKKwkJbGlzdCA9ICZ0cmFuc2FjdGlvbi0+dF9zeW5jX2RhdGFsaXN0OworCQlicmVhazsKKwljYXNlIEJKX01ldGFkYXRhOgorCQl0cmFuc2FjdGlvbi0+dF9ucl9idWZmZXJzKys7CisJCWxpc3QgPSAmdHJhbnNhY3Rpb24tPnRfYnVmZmVyczsKKwkJYnJlYWs7CisJY2FzZSBCSl9Gb3JnZXQ6CisJCWxpc3QgPSAmdHJhbnNhY3Rpb24tPnRfZm9yZ2V0OworCQlicmVhazsKKwljYXNlIEJKX0lPOgorCQlsaXN0ID0gJnRyYW5zYWN0aW9uLT50X2lvYnVmX2xpc3Q7CisJCWJyZWFrOworCWNhc2UgQkpfU2hhZG93OgorCQlsaXN0ID0gJnRyYW5zYWN0aW9uLT50X3NoYWRvd19saXN0OworCQlicmVhazsKKwljYXNlIEJKX0xvZ0N0bDoKKwkJbGlzdCA9ICZ0cmFuc2FjdGlvbi0+dF9sb2dfbGlzdDsKKwkJYnJlYWs7CisJY2FzZSBCSl9SZXNlcnZlZDoKKwkJbGlzdCA9ICZ0cmFuc2FjdGlvbi0+dF9yZXNlcnZlZF9saXN0OworCQlicmVhazsKKwljYXNlIEJKX0xvY2tlZDoKKwkJbGlzdCA9ICAmdHJhbnNhY3Rpb24tPnRfbG9ja2VkX2xpc3Q7CisJCWJyZWFrOworCX0KKworCV9fYmxpc3RfYWRkX2J1ZmZlcihsaXN0LCBqaCk7CisJamgtPmJfamxpc3QgPSBqbGlzdDsKKworCWlmICh3YXNfZGlydHkpCisJCXNldF9idWZmZXJfamJkZGlydHkoYmgpOworfQorCit2b2lkIGpiZDJfam91cm5hbF9maWxlX2J1ZmZlcihzdHJ1Y3Qgam91cm5hbF9oZWFkICpqaCwKKwkJCQl0cmFuc2FjdGlvbl90ICp0cmFuc2FjdGlvbiwgaW50IGpsaXN0KQoreworCWpiZF9sb2NrX2JoX3N0YXRlKGpoMmJoKGpoKSk7CisJc3Bpbl9sb2NrKCZ0cmFuc2FjdGlvbi0+dF9qb3VybmFsLT5qX2xpc3RfbG9jayk7CisJX19qYmQyX2pvdXJuYWxfZmlsZV9idWZmZXIoamgsIHRyYW5zYWN0aW9uLCBqbGlzdCk7CisJc3Bpbl91bmxvY2soJnRyYW5zYWN0aW9uLT50X2pvdXJuYWwtPmpfbGlzdF9sb2NrKTsKKwlqYmRfdW5sb2NrX2JoX3N0YXRlKGpoMmJoKGpoKSk7Cit9CisKKy8qCisgKiBSZW1vdmUgYSBidWZmZXIgZnJvbSBpdHMgY3VycmVudCBidWZmZXIgbGlzdCBpbiBwcmVwYXJhdGlvbiBmb3IKKyAqIGRyb3BwaW5nIGl0IGZyb20gaXRzIGN1cnJlbnQgdHJhbnNhY3Rpb24gZW50aXJlbHkuICBJZiB0aGUgYnVmZmVyIGhhcworICogYWxyZWFkeSBzdGFydGVkIHRvIGJlIHVzZWQgYnkgYSBzdWJzZXF1ZW50IHRyYW5zYWN0aW9uLCByZWZpbGUgdGhlCisgKiBidWZmZXIgb24gdGhhdCB0cmFuc2FjdGlvbidzIG1ldGFkYXRhIGxpc3QuCisgKgorICogQ2FsbGVkIHVuZGVyIGpvdXJuYWwtPmpfbGlzdF9sb2NrCisgKgorICogQ2FsbGVkIHVuZGVyIGpiZF9sb2NrX2JoX3N0YXRlKGpoMmJoKGpoKSkKKyAqLwordm9pZCBfX2piZDJfam91cm5hbF9yZWZpbGVfYnVmZmVyKHN0cnVjdCBqb3VybmFsX2hlYWQgKmpoKQoreworCWludCB3YXNfZGlydHk7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCA9IGpoMmJoKGpoKTsKKworCUpfQVNTRVJUX0pIKGpoLCBqYmRfaXNfbG9ja2VkX2JoX3N0YXRlKGJoKSk7CisJaWYgKGpoLT5iX3RyYW5zYWN0aW9uKQorCQlhc3NlcnRfc3Bpbl9sb2NrZWQoJmpoLT5iX3RyYW5zYWN0aW9uLT50X2pvdXJuYWwtPmpfbGlzdF9sb2NrKTsKKworCS8qIElmIHRoZSBidWZmZXIgaXMgbm93IHVudXNlZCwganVzdCBkcm9wIGl0LiAqLworCWlmIChqaC0+Yl9uZXh0X3RyYW5zYWN0aW9uID09IE5VTEwpIHsKKwkJX19qYmQyX2pvdXJuYWxfdW5maWxlX2J1ZmZlcihqaCk7CisJCXJldHVybjsKKwl9CisKKwkvKgorCSAqIEl0IGhhcyBiZWVuIG1vZGlmaWVkIGJ5IGEgbGF0ZXIgdHJhbnNhY3Rpb246IGFkZCBpdCB0byB0aGUgbmV3CisJICogdHJhbnNhY3Rpb24ncyBtZXRhZGF0YSBsaXN0LgorCSAqLworCisJd2FzX2RpcnR5ID0gdGVzdF9jbGVhcl9idWZmZXJfamJkZGlydHkoYmgpOworCV9famJkMl9qb3VybmFsX3RlbXBfdW5saW5rX2J1ZmZlcihqaCk7CisJamgtPmJfdHJhbnNhY3Rpb24gPSBqaC0+Yl9uZXh0X3RyYW5zYWN0aW9uOworCWpoLT5iX25leHRfdHJhbnNhY3Rpb24gPSBOVUxMOworCV9famJkMl9qb3VybmFsX2ZpbGVfYnVmZmVyKGpoLCBqaC0+Yl90cmFuc2FjdGlvbiwKKwkJCQl3YXNfZGlydHkgPyBCSl9NZXRhZGF0YSA6IEJKX1Jlc2VydmVkKTsKKwlKX0FTU0VSVF9KSChqaCwgamgtPmJfdHJhbnNhY3Rpb24tPnRfc3RhdGUgPT0gVF9SVU5OSU5HKTsKKworCWlmICh3YXNfZGlydHkpCisJCXNldF9idWZmZXJfamJkZGlydHkoYmgpOworfQorCisvKgorICogRm9yIHRoZSB1bmxvY2tlZCB2ZXJzaW9uIG9mIHRoaXMgY2FsbCwgYWxzbyBtYWtlIHN1cmUgdGhhdCBhbnkKKyAqIGhhbmdpbmcgam91cm5hbF9oZWFkIGlzIGNsZWFuZWQgdXAgaWYgbmVjZXNzYXJ5LgorICoKKyAqIF9famJkMl9qb3VybmFsX3JlZmlsZV9idWZmZXIgaXMgdXN1YWxseSBjYWxsZWQgYXMgcGFydCBvZiBhIHNpbmdsZSBsb2NrZWQKKyAqIG9wZXJhdGlvbiBvbiBhIGJ1ZmZlcl9oZWFkLCBpbiB3aGljaCB0aGUgY2FsbGVyIGlzIHByb2JhYmx5IGdvaW5nIHRvCisgKiBiZSBob29raW5nIHRoZSBqb3VybmFsX2hlYWQgb250byBvdGhlciBsaXN0cy4gIEluIHRoYXQgY2FzZSBpdCBpcyB1cAorICogdG8gdGhlIGNhbGxlciB0byByZW1vdmUgdGhlIGpvdXJuYWxfaGVhZCBpZiBuZWNlc3NhcnkuICBGb3IgdGhlCisgKiB1bmxvY2tlZCBqYmQyX2pvdXJuYWxfcmVmaWxlX2J1ZmZlciBjYWxsLCB0aGUgY2FsbGVyIGlzbid0IGdvaW5nIHRvIGJlCisgKiBkb2luZyBhbnl0aGluZyBlbHNlIHRvIHRoZSBidWZmZXIgc28gd2UgbmVlZCB0byBkbyB0aGUgY2xlYW51cAorICogb3Vyc2VsdmVzIHRvIGF2b2lkIGEgamggbGVhay4KKyAqCisgKiAqKiogVGhlIGpvdXJuYWxfaGVhZCBtYXkgYmUgZnJlZWQgYnkgdGhpcyBjYWxsISAqKioKKyAqLwordm9pZCBqYmQyX2pvdXJuYWxfcmVmaWxlX2J1ZmZlcihqb3VybmFsX3QgKmpvdXJuYWwsIHN0cnVjdCBqb3VybmFsX2hlYWQgKmpoKQoreworCXN0cnVjdCBidWZmZXJfaGVhZCAqYmggPSBqaDJiaChqaCk7CisKKwlqYmRfbG9ja19iaF9zdGF0ZShiaCk7CisJc3Bpbl9sb2NrKCZqb3VybmFsLT5qX2xpc3RfbG9jayk7CisKKwlfX2piZDJfam91cm5hbF9yZWZpbGVfYnVmZmVyKGpoKTsKKwlqYmRfdW5sb2NrX2JoX3N0YXRlKGJoKTsKKwlqYmQyX2pvdXJuYWxfcmVtb3ZlX2pvdXJuYWxfaGVhZChiaCk7CisKKwlzcGluX3VubG9jaygmam91cm5hbC0+al9saXN0X2xvY2spOworCV9fYnJlbHNlKGJoKTsKK30KZGlmZiAtLWdpdCBhL2ZzL2pmZnMyL3N1cGVyLmMgYi9mcy9qZmZzMi9zdXBlci5jCmluZGV4IDZkZTM3NDUuLmJjNGI4MTAgMTAwNjQ0Ci0tLSBhL2ZzL2pmZnMyL3N1cGVyLmMKKysrIGIvZnMvamZmczIvc3VwZXIuYwpAQCAtMzM0LDEwICszMzQsMTAgQEAKIAkgICB3aGljaCBtZWFucyBqdXN0ICdubyBwYWRkaW5nJywgd2l0aG91dCB0aGUgYWxpZ25tZW50CiAJICAgdGhpbmcuIEJ1dCBHQ0MgZG9lc24ndCBoYXZlIHRoYXQgLS0gd2UgaGF2ZSB0byBqdXN0CiAJICAgaG9wZSB0aGUgc3RydWN0cyBhcmUgdGhlIHJpZ2h0IHNpemVzLCBpbnN0ZWFkLiAqLwotCUJVR19PTihzaXplb2Yoc3RydWN0IGpmZnMyX3Vua25vd25fbm9kZSkgIT0gMTIpOwotCUJVR19PTihzaXplb2Yoc3RydWN0IGpmZnMyX3Jhd19kaXJlbnQpICE9IDQwKTsKLQlCVUdfT04oc2l6ZW9mKHN0cnVjdCBqZmZzMl9yYXdfaW5vZGUpICE9IDY4KTsKLQlCVUdfT04oc2l6ZW9mKHN0cnVjdCBqZmZzMl9yYXdfc3VtbWFyeSkgIT0gMzIpOworCUJVSUxEX0JVR19PTihzaXplb2Yoc3RydWN0IGpmZnMyX3Vua25vd25fbm9kZSkgIT0gMTIpOworCUJVSUxEX0JVR19PTihzaXplb2Yoc3RydWN0IGpmZnMyX3Jhd19kaXJlbnQpICE9IDQwKTsKKwlCVUlMRF9CVUdfT04oc2l6ZW9mKHN0cnVjdCBqZmZzMl9yYXdfaW5vZGUpICE9IDY4KTsKKwlCVUlMRF9CVUdfT04oc2l6ZW9mKHN0cnVjdCBqZmZzMl9yYXdfc3VtbWFyeSkgIT0gMzIpOwogCiAJcHJpbnRrKEtFUk5fSU5GTyAiSkZGUzIgdmVyc2lvbiAyLjIuIgogI2lmZGVmIENPTkZJR19KRkZTMl9GU19XUklURUJVRkZFUgpkaWZmIC0tZ2l0IGEvZnMvamZzL2ZpbGUuYyBiL2ZzL2pmcy9maWxlLmMKaW5kZXggMzQxODFiOC4uYWE5MTMyZCAxMDA2NDQKLS0tIGEvZnMvamZzL2ZpbGUuYworKysgYi9mcy9qZnMvZmlsZS5jCkBAIC0xMDksNiArMTA5LDggQEAKIAkuYWlvX3dyaXRlCT0gZ2VuZXJpY19maWxlX2Fpb193cml0ZSwKIAkubW1hcAkJPSBnZW5lcmljX2ZpbGVfbW1hcCwKIAkuc2VuZGZpbGUJPSBnZW5lcmljX2ZpbGVfc2VuZGZpbGUsCisJLnNwbGljZV9yZWFkCT0gZ2VuZXJpY19maWxlX3NwbGljZV9yZWFkLAorCS5zcGxpY2Vfd3JpdGUJPSBnZW5lcmljX2ZpbGVfc3BsaWNlX3dyaXRlLAogCS5mc3luYwkJPSBqZnNfZnN5bmMsCiAJLnJlbGVhc2UJPSBqZnNfcmVsZWFzZSwKIAkuaW9jdGwJCT0gamZzX2lvY3RsLApkaWZmIC0tZ2l0IGEvZnMvamZzL2pmc19pbWFwLmMgYi9mcy9qZnMvamZzX2ltYXAuYwppbmRleCA0ODlhM2Q2Li5lZTliNDczIDEwMDY0NAotLS0gYS9mcy9qZnMvamZzX2ltYXAuYworKysgYi9mcy9qZnMvamZzX2ltYXAuYwpAQCAtMzE4LDcgKzMxOCw3IEBACiAJc3RydWN0IGlub21hcCAqaW1hcDsKIAlpbnQgYmxvY2tfb2Zmc2V0OwogCWludCBpbm9kZXNfbGVmdDsKLQl1aW50IHBhZ2VubzsKKwl1bnNpZ25lZCBsb25nIHBhZ2VubzsKIAlpbnQgcmVsX2lub2RlOwogCiAJamZzX2luZm8oImRpUmVhZDogaW5vID0gJWxkIiwgaXAtPmlfaW5vKTsKQEAgLTYwNiw3ICs2MDYsNyBAQAogCWludCBibG9ja19vZmZzZXQ7CiAJaW50IGlub2Rlc19sZWZ0OwogCXN0cnVjdCBtZXRhcGFnZSAqbXA7Ci0JdWludCBwYWdlbm87CisJdW5zaWduZWQgbG9uZyBwYWdlbm87CiAJaW50IHJlbF9pbm9kZTsKIAlpbnQgZGlvZmZzZXQ7CiAJc3RydWN0IGlub2RlICppcGltYXA7CmRpZmYgLS1naXQgYS9mcy9qZnMveGF0dHIuYyBiL2ZzL2pmcy94YXR0ci5jCmluZGV4IDRjNzk4NWUuLmI3NTNiYTIgMTAwNjQ0Ci0tLSBhL2ZzL2pmcy94YXR0ci5jCisrKyBiL2ZzL2pmcy94YXR0ci5jCkBAIC03NTYsNiArNzU2LDExIEBACiAJcmV0dXJuIC1FT1BOT1RTVVBQOwogfQogCisvKgorICogTW9zdCBvZiB0aGUgcGVybWlzc2lvbiBjaGVja2luZyBpcyBkb25lIGJ5IHhhdHRyX3Blcm1pc3Npb24gaW4gdGhlIHZmcy4KKyAqIFRoZSBsb2NhbCBmaWxlIHN5c3RlbSBpcyByZXNwb25zaWJsZSBmb3IgaGFuZGxpbmcgdGhlIHN5c3RlbS4qIG5hbWVzcGFjZS4KKyAqIFdlIGFsc28gbmVlZCB0byB2ZXJpZnkgdGhhdCB0aGlzIGlzIGEgbmFtZXNwYWNlIHRoYXQgd2UgcmVjb2duaXplLgorICovCiBzdGF0aWMgaW50IGNhbl9zZXRfeGF0dHIoc3RydWN0IGlub2RlICppbm9kZSwgY29uc3QgY2hhciAqbmFtZSwKIAkJCSBjb25zdCB2b2lkICp2YWx1ZSwgc2l6ZV90IHZhbHVlX2xlbikKIHsKQEAgLTc3MSwxMCArNzc2LDYgQEAKIAkgICAgc3RybmNtcChuYW1lLCBYQVRUUl9PUzJfUFJFRklYLCBYQVRUUl9PUzJfUFJFRklYX0xFTikpCiAJCXJldHVybiAtRU9QTk9UU1VQUDsKIAotCWlmICghU19JU1JFRyhpbm9kZS0+aV9tb2RlKSAmJgotCSAgICAoIVNfSVNESVIoaW5vZGUtPmlfbW9kZSkgfHwgaW5vZGUtPmlfbW9kZSAmU19JU1ZUWCkpCi0JCXJldHVybiAtRVBFUk07Ci0KIAlyZXR1cm4gMDsKIH0KIApkaWZmIC0tZ2l0IGEvZnMvbG9ja2QvY2xudGxvY2suYyBiL2ZzL2xvY2tkL2NsbnRsb2NrLmMKaW5kZXggZThjNzc2NS4uYjg1YTBhZCAxMDA2NDQKLS0tIGEvZnMvbG9ja2QvY2xudGxvY2suYworKysgYi9mcy9sb2NrZC9jbG50bG9jay5jCkBAIC0xMDAsMTIgKzEwMCwxMiBAQAogLyoKICAqIFRoZSBzZXJ2ZXIgbG9ja2QgaGFzIGNhbGxlZCB1cyBiYWNrIHRvIHRlbGwgdXMgdGhlIGxvY2sgd2FzIGdyYW50ZWQKICAqLwotdTMyIG5sbWNsbnRfZ3JhbnQoY29uc3Qgc3RydWN0IHNvY2thZGRyX2luICphZGRyLCBjb25zdCBzdHJ1Y3QgbmxtX2xvY2sgKmxvY2spCitfX2JlMzIgbmxtY2xudF9ncmFudChjb25zdCBzdHJ1Y3Qgc29ja2FkZHJfaW4gKmFkZHIsIGNvbnN0IHN0cnVjdCBubG1fbG9jayAqbG9jaykKIHsKIAljb25zdCBzdHJ1Y3QgZmlsZV9sb2NrICpmbCA9ICZsb2NrLT5mbDsKIAljb25zdCBzdHJ1Y3QgbmZzX2ZoICpmaCA9ICZsb2NrLT5maDsKIAlzdHJ1Y3QgbmxtX3dhaXQJKmJsb2NrOwotCXUzMiByZXMgPSBubG1fbGNrX2RlbmllZDsKKwlfX2JlMzIgcmVzID0gbmxtX2xja19kZW5pZWQ7CiAKIAkvKgogCSAqIExvb2sgdXAgYmxvY2tlZCByZXF1ZXN0IGJhc2VkIG9uIGFyZ3VtZW50cy4gCmRpZmYgLS1naXQgYS9mcy9sb2NrZC9tb24uYyBiL2ZzL2xvY2tkL21vbi5jCmluZGV4IGUwMTc5ZjguLmViMjQzZWQgMTAwNjQ0Ci0tLSBhL2ZzL2xvY2tkL21vbi5jCisrKyBiL2ZzL2xvY2tkL21vbi5jCkBAIC0xNDgsOCArMTQ4LDggQEAKICAqIFhEUiBmdW5jdGlvbnMgZm9yIE5TTS4KICAqLwogCi1zdGF0aWMgdTMyICoKLXhkcl9lbmNvZGVfY29tbW9uKHN0cnVjdCBycGNfcnFzdCAqcnFzdHAsIHUzMiAqcCwgc3RydWN0IG5zbV9hcmdzICphcmdwKQorc3RhdGljIF9fYmUzMiAqCit4ZHJfZW5jb2RlX2NvbW1vbihzdHJ1Y3QgcnBjX3Jxc3QgKnJxc3RwLCBfX2JlMzIgKnAsIHN0cnVjdCBuc21fYXJncyAqYXJncCkKIHsKIAljaGFyCWJ1ZmZlclsyMF0sICpuYW1lOwogCkBAIC0xNzYsNyArMTc2LDcgQEAKIH0KIAogc3RhdGljIGludAoteGRyX2VuY29kZV9tb24oc3RydWN0IHJwY19ycXN0ICpycXN0cCwgdTMyICpwLCBzdHJ1Y3QgbnNtX2FyZ3MgKmFyZ3ApCit4ZHJfZW5jb2RlX21vbihzdHJ1Y3QgcnBjX3Jxc3QgKnJxc3RwLCBfX2JlMzIgKnAsIHN0cnVjdCBuc21fYXJncyAqYXJncCkKIHsKIAlwID0geGRyX2VuY29kZV9jb21tb24ocnFzdHAsIHAsIGFyZ3ApOwogCWlmIChJU19FUlIocCkpCkBAIC0xOTIsNyArMTkyLDcgQEAKIH0KIAogc3RhdGljIGludAoteGRyX2VuY29kZV91bm1vbihzdHJ1Y3QgcnBjX3Jxc3QgKnJxc3RwLCB1MzIgKnAsIHN0cnVjdCBuc21fYXJncyAqYXJncCkKK3hkcl9lbmNvZGVfdW5tb24oc3RydWN0IHJwY19ycXN0ICpycXN0cCwgX19iZTMyICpwLCBzdHJ1Y3QgbnNtX2FyZ3MgKmFyZ3ApCiB7CiAJcCA9IHhkcl9lbmNvZGVfY29tbW9uKHJxc3RwLCBwLCBhcmdwKTsKIAlpZiAoSVNfRVJSKHApKQpAQCAtMjAyLDcgKzIwMiw3IEBACiB9CiAKIHN0YXRpYyBpbnQKLXhkcl9kZWNvZGVfc3RhdF9yZXMoc3RydWN0IHJwY19ycXN0ICpycXN0cCwgdTMyICpwLCBzdHJ1Y3QgbnNtX3JlcyAqcmVzcCkKK3hkcl9kZWNvZGVfc3RhdF9yZXMoc3RydWN0IHJwY19ycXN0ICpycXN0cCwgX19iZTMyICpwLCBzdHJ1Y3QgbnNtX3JlcyAqcmVzcCkKIHsKIAlyZXNwLT5zdGF0dXMgPSBudG9obCgqcCsrKTsKIAlyZXNwLT5zdGF0ZSA9IG50b2hsKCpwKyspOwpAQCAtMjEyLDcgKzIxMiw3IEBACiB9CiAKIHN0YXRpYyBpbnQKLXhkcl9kZWNvZGVfc3RhdChzdHJ1Y3QgcnBjX3Jxc3QgKnJxc3RwLCB1MzIgKnAsIHN0cnVjdCBuc21fcmVzICpyZXNwKQoreGRyX2RlY29kZV9zdGF0KHN0cnVjdCBycGNfcnFzdCAqcnFzdHAsIF9fYmUzMiAqcCwgc3RydWN0IG5zbV9yZXMgKnJlc3ApCiB7CiAJcmVzcC0+c3RhdGUgPSBudG9obCgqcCsrKTsKIAlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL2ZzL2xvY2tkL3N2Yy5jIGIvZnMvbG9ja2Qvc3ZjLmMKaW5kZXggNjM0MTM5Mi4uOGNhMTgwOCAxMDA2NDQKLS0tIGEvZnMvbG9ja2Qvc3ZjLmMKKysrIGIvZnMvbG9ja2Qvc3ZjLmMKQEAgLTM1Myw5ICszNTMsNiBAQAogICogU3lzY3RsIHBhcmFtZXRlcnMgKHNhbWUgYXMgbW9kdWxlIHBhcmFtZXRlcnMsIGRpZmZlcmVudCBpbnRlcmZhY2UpLgogICovCiAKLS8qIFNvbWV0aGluZyB0aGF0IGlzbid0IENUTF9BTlksIENUTF9OT05FIG9yIGEgdmFsdWUgdGhhdCBtYXkgY2xhc2guICovCi0jZGVmaW5lIENUTF9VTk5VTUJFUkVECQktMgotCiBzdGF0aWMgY3RsX3RhYmxlIG5sbV9zeXNjdGxzW10gPSB7CiAJewogCQkuY3RsX25hbWUJPSBDVExfVU5OVU1CRVJFRCwKZGlmZiAtLWdpdCBhL2ZzL2xvY2tkL3N2YzRwcm9jLmMgYi9mcy9sb2NrZC9zdmM0cHJvYy5jCmluZGV4IGZhMzcwZjYuLjBjZTVjODEgMTAwNjQ0Ci0tLSBhL2ZzL2xvY2tkL3N2YzRwcm9jLmMKKysrIGIvZnMvbG9ja2Qvc3ZjNHByb2MuYwpAQCAtMjQsMTQgKzI0LDE0IEBACiAvKgogICogT2J0YWluIGNsaWVudCBhbmQgZmlsZSBmcm9tIGFyZ3VtZW50cwogICovCi1zdGF0aWMgdTMyCitzdGF0aWMgX19iZTMyCiBubG00c3ZjX3JldHJpZXZlX2FyZ3Moc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgc3RydWN0IG5sbV9hcmdzICphcmdwLAogCQkJc3RydWN0IG5sbV9ob3N0ICoqaG9zdHAsIHN0cnVjdCBubG1fZmlsZSAqKmZpbHApCiB7CiAJc3RydWN0IG5sbV9ob3N0CQkqaG9zdCA9IE5VTEw7CiAJc3RydWN0IG5sbV9maWxlCQkqZmlsZSA9IE5VTEw7CiAJc3RydWN0IG5sbV9sb2NrCQkqbG9jayA9ICZhcmdwLT5sb2NrOwotCXUzMgkJCWVycm9yID0gMDsKKwlfX2JlMzIJCQllcnJvciA9IDA7CiAKIAkvKiBuZnNkIGNhbGxiYWNrcyBtdXN0IGhhdmUgYmVlbiBpbnN0YWxsZWQgZm9yIHRoaXMgcHJvY2VkdXJlICovCiAJaWYgKCFubG1zdmNfb3BzKQpAQCAtNjgsNyArNjgsNyBAQAogLyoKICAqIE5VTEw6IFRlc3QgZm9yIHByZXNlbmNlIG9mIHNlcnZpY2UKICAqLwotc3RhdGljIGludAorc3RhdGljIF9fYmUzMgogbmxtNHN2Y19wcm9jX251bGwoc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgdm9pZCAqYXJncCwgdm9pZCAqcmVzcCkKIHsKIAlkcHJpbnRrKCJsb2NrZDogTlVMTCAgICAgICAgICBjYWxsZWRcbiIpOwpAQCAtNzgsNyArNzgsNyBAQAogLyoKICAqIFRFU1Q6IENoZWNrIGZvciBjb25mbGljdGluZyBsb2NrCiAgKi8KLXN0YXRpYyBpbnQKK3N0YXRpYyBfX2JlMzIKIG5sbTRzdmNfcHJvY190ZXN0KHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHN0cnVjdCBubG1fYXJncyAqYXJncCwKIAkJCQkgICAgICAgICBzdHJ1Y3QgbmxtX3JlcyAgKnJlc3ApCiB7CkBAIC05Niw3ICs5Niw3IEBACiAKIAkvKiBPYnRhaW4gY2xpZW50IGFuZCBmaWxlICovCiAJaWYgKChyZXNwLT5zdGF0dXMgPSBubG00c3ZjX3JldHJpZXZlX2FyZ3MocnFzdHAsIGFyZ3AsICZob3N0LCAmZmlsZSkpKQotCQlyZXR1cm4gcnBjX3N1Y2Nlc3M7CisJCXJldHVybiByZXNwLT5zdGF0dXMgPT0gbmxtX2Ryb3BfcmVwbHkgPyBycGNfZHJvcF9yZXBseSA6cnBjX3N1Y2Nlc3M7CiAKIAkvKiBOb3cgY2hlY2sgZm9yIGNvbmZsaWN0aW5nIGxvY2tzICovCiAJcmVzcC0+c3RhdHVzID0gbmxtc3ZjX3Rlc3Rsb2NrKGZpbGUsICZhcmdwLT5sb2NrLCAmcmVzcC0+bG9jayk7CkBAIC0xMDcsNyArMTA3LDcgQEAKIAlyZXR1cm4gcnBjX3N1Y2Nlc3M7CiB9CiAKLXN0YXRpYyBpbnQKK3N0YXRpYyBfX2JlMzIKIG5sbTRzdmNfcHJvY19sb2NrKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHN0cnVjdCBubG1fYXJncyAqYXJncCwKIAkJCQkgICAgICAgICBzdHJ1Y3QgbmxtX3JlcyAgKnJlc3ApCiB7CkBAIC0xMjYsNyArMTI2LDcgQEAKIAogCS8qIE9idGFpbiBjbGllbnQgYW5kIGZpbGUgKi8KIAlpZiAoKHJlc3AtPnN0YXR1cyA9IG5sbTRzdmNfcmV0cmlldmVfYXJncyhycXN0cCwgYXJncCwgJmhvc3QsICZmaWxlKSkpCi0JCXJldHVybiBycGNfc3VjY2VzczsKKwkJcmV0dXJuIHJlc3AtPnN0YXR1cyA9PSBubG1fZHJvcF9yZXBseSA/IHJwY19kcm9wX3JlcGx5IDpycGNfc3VjY2VzczsKIAogI2lmIDAKIAkvKiBJZiBzdXBwbGllZCBzdGF0ZSBkb2Vzbid0IG1hdGNoIGN1cnJlbnQgc3RhdGUsIHdlIGFzc3VtZSBpdCdzCkBAIC0xNTAsNyArMTUwLDcgQEAKIAlyZXR1cm4gcnBjX3N1Y2Nlc3M7CiB9CiAKLXN0YXRpYyBpbnQKK3N0YXRpYyBfX2JlMzIKIG5sbTRzdmNfcHJvY19jYW5jZWwoc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgc3RydWN0IG5sbV9hcmdzICphcmdwLAogCQkJCSAgICAgICAgICAgc3RydWN0IG5sbV9yZXMgICpyZXNwKQogewpAQCAtMTY5LDcgKzE2OSw3IEBACiAKIAkvKiBPYnRhaW4gY2xpZW50IGFuZCBmaWxlICovCiAJaWYgKChyZXNwLT5zdGF0dXMgPSBubG00c3ZjX3JldHJpZXZlX2FyZ3MocnFzdHAsIGFyZ3AsICZob3N0LCAmZmlsZSkpKQotCQlyZXR1cm4gcnBjX3N1Y2Nlc3M7CisJCXJldHVybiByZXNwLT5zdGF0dXMgPT0gbmxtX2Ryb3BfcmVwbHkgPyBycGNfZHJvcF9yZXBseSA6cnBjX3N1Y2Nlc3M7CiAKIAkvKiBUcnkgdG8gY2FuY2VsIHJlcXVlc3QuICovCiAJcmVzcC0+c3RhdHVzID0gbmxtc3ZjX2NhbmNlbF9ibG9ja2VkKGZpbGUsICZhcmdwLT5sb2NrKTsKQEAgLTE4Myw3ICsxODMsNyBAQAogLyoKICAqIFVOTE9DSzogcmVsZWFzZSBhIGxvY2sKICAqLwotc3RhdGljIGludAorc3RhdGljIF9fYmUzMgogbmxtNHN2Y19wcm9jX3VubG9jayhzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCBzdHJ1Y3QgbmxtX2FyZ3MgKmFyZ3AsCiAJCQkJICAgICAgICAgICBzdHJ1Y3QgbmxtX3JlcyAgKnJlc3ApCiB7CkBAIC0yMDIsNyArMjAyLDcgQEAKIAogCS8qIE9idGFpbiBjbGllbnQgYW5kIGZpbGUgKi8KIAlpZiAoKHJlc3AtPnN0YXR1cyA9IG5sbTRzdmNfcmV0cmlldmVfYXJncyhycXN0cCwgYXJncCwgJmhvc3QsICZmaWxlKSkpCi0JCXJldHVybiBycGNfc3VjY2VzczsKKwkJcmV0dXJuIHJlc3AtPnN0YXR1cyA9PSBubG1fZHJvcF9yZXBseSA/IHJwY19kcm9wX3JlcGx5IDpycGNfc3VjY2VzczsKIAogCS8qIE5vdyB0cnkgdG8gcmVtb3ZlIHRoZSBsb2NrICovCiAJcmVzcC0+c3RhdHVzID0gbmxtc3ZjX3VubG9jayhmaWxlLCAmYXJncC0+bG9jayk7CkBAIC0yMTcsNyArMjE3LDcgQEAKICAqIEdSQU5URUQ6IEEgc2VydmVyIGNhbGxzIHVzIHRvIHRlbGwgdGhhdCBhIHByb2Nlc3MnIGxvY2sgcmVxdWVzdAogICogd2FzIGdyYW50ZWQKICAqLwotc3RhdGljIGludAorc3RhdGljIF9fYmUzMgogbmxtNHN2Y19wcm9jX2dyYW50ZWQoc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgc3RydWN0IG5sbV9hcmdzICphcmdwLAogCQkJCSAgICAgICAgICAgIHN0cnVjdCBubG1fcmVzICAqcmVzcCkKIHsKQEAgLTI1MywxMiArMjUzLDEyIEBACiAgKiBiZWNhdXNlIHdlIHNlbmQgdGhlIGNhbGxiYWNrIGJlZm9yZSB0aGUgcmVwbHkgcHJvcGVyLiBJIGhvcGUgdGhpcwogICogZG9lc24ndCBicmVhayBhbnkgY2xpZW50cy4KICAqLwotc3RhdGljIGludCBubG00c3ZjX2NhbGxiYWNrKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHUzMiBwcm9jLCBzdHJ1Y3QgbmxtX2FyZ3MgKmFyZ3AsCi0JCWludCAoKmZ1bmMpKHN0cnVjdCBzdmNfcnFzdCAqLCBzdHJ1Y3QgbmxtX2FyZ3MgKiwgc3RydWN0IG5sbV9yZXMgICopKQorc3RhdGljIF9fYmUzMiBubG00c3ZjX2NhbGxiYWNrKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHUzMiBwcm9jLCBzdHJ1Y3QgbmxtX2FyZ3MgKmFyZ3AsCisJCV9fYmUzMiAoKmZ1bmMpKHN0cnVjdCBzdmNfcnFzdCAqLCBzdHJ1Y3QgbmxtX2FyZ3MgKiwgc3RydWN0IG5sbV9yZXMgICopKQogewogCXN0cnVjdCBubG1faG9zdAkqaG9zdDsKIAlzdHJ1Y3QgbmxtX3Jxc3QJKmNhbGw7Ci0JaW50IHN0YXQ7CisJX19iZTMyIHN0YXQ7CiAKIAlob3N0ID0gbmxtc3ZjX2xvb2t1cF9ob3N0KHJxc3RwLAogCQkJCSAgYXJncC0+bG9jay5jYWxsZXIsCkBAIC0yODIsMzUgKzI4MiwzNSBAQAogCXJldHVybiBycGNfc3VjY2VzczsKIH0KIAotc3RhdGljIGludCBubG00c3ZjX3Byb2NfdGVzdF9tc2coc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgc3RydWN0IG5sbV9hcmdzICphcmdwLAorc3RhdGljIF9fYmUzMiBubG00c3ZjX3Byb2NfdGVzdF9tc2coc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgc3RydWN0IG5sbV9hcmdzICphcmdwLAogCQkJCQkgICAgIHZvaWQJICAgICAqcmVzcCkKIHsKIAlkcHJpbnRrKCJsb2NrZDogVEVTVF9NU0cgICAgICBjYWxsZWRcbiIpOwogCXJldHVybiBubG00c3ZjX2NhbGxiYWNrKHJxc3RwLCBOTE1QUk9DX1RFU1RfUkVTLCBhcmdwLCBubG00c3ZjX3Byb2NfdGVzdCk7CiB9CiAKLXN0YXRpYyBpbnQgbmxtNHN2Y19wcm9jX2xvY2tfbXNnKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHN0cnVjdCBubG1fYXJncyAqYXJncCwKK3N0YXRpYyBfX2JlMzIgbmxtNHN2Y19wcm9jX2xvY2tfbXNnKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHN0cnVjdCBubG1fYXJncyAqYXJncCwKIAkJCQkJICAgICB2b2lkCSAgICAgKnJlc3ApCiB7CiAJZHByaW50aygibG9ja2Q6IExPQ0tfTVNHICAgICAgY2FsbGVkXG4iKTsKIAlyZXR1cm4gbmxtNHN2Y19jYWxsYmFjayhycXN0cCwgTkxNUFJPQ19MT0NLX1JFUywgYXJncCwgbmxtNHN2Y19wcm9jX2xvY2spOwogfQogCi1zdGF0aWMgaW50IG5sbTRzdmNfcHJvY19jYW5jZWxfbXNnKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHN0cnVjdCBubG1fYXJncyAqYXJncCwKK3N0YXRpYyBfX2JlMzIgbmxtNHN2Y19wcm9jX2NhbmNlbF9tc2coc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgc3RydWN0IG5sbV9hcmdzICphcmdwLAogCQkJCQkgICAgICAgdm9pZAkgICAgICAgKnJlc3ApCiB7CiAJZHByaW50aygibG9ja2Q6IENBTkNFTF9NU0cgICAgY2FsbGVkXG4iKTsKIAlyZXR1cm4gbmxtNHN2Y19jYWxsYmFjayhycXN0cCwgTkxNUFJPQ19DQU5DRUxfUkVTLCBhcmdwLCBubG00c3ZjX3Byb2NfY2FuY2VsKTsKIH0KIAotc3RhdGljIGludCBubG00c3ZjX3Byb2NfdW5sb2NrX21zZyhzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCBzdHJ1Y3QgbmxtX2FyZ3MgKmFyZ3AsCitzdGF0aWMgX19iZTMyIG5sbTRzdmNfcHJvY191bmxvY2tfbXNnKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHN0cnVjdCBubG1fYXJncyAqYXJncCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAgICpyZXNwKQogewogCWRwcmludGsoImxvY2tkOiBVTkxPQ0tfTVNHICAgIGNhbGxlZFxuIik7CiAJcmV0dXJuIG5sbTRzdmNfY2FsbGJhY2socnFzdHAsIE5MTVBST0NfVU5MT0NLX1JFUywgYXJncCwgbmxtNHN2Y19wcm9jX3VubG9jayk7CiB9CiAKLXN0YXRpYyBpbnQgbmxtNHN2Y19wcm9jX2dyYW50ZWRfbXNnKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHN0cnVjdCBubG1fYXJncyAqYXJncCwKK3N0YXRpYyBfX2JlMzIgbmxtNHN2Y19wcm9jX2dyYW50ZWRfbXNnKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHN0cnVjdCBubG1fYXJncyAqYXJncCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICAqcmVzcCkKIHsKIAlkcHJpbnRrKCJsb2NrZDogR1JBTlRFRF9NU0cgICBjYWxsZWRcbiIpOwpAQCAtMzIwLDcgKzMyMCw3IEBACiAvKgogICogU0hBUkU6IGNyZWF0ZSBhIERPUyBzaGFyZSBvciBhbHRlciBleGlzdGluZyBzaGFyZS4KICAqLwotc3RhdGljIGludAorc3RhdGljIF9fYmUzMgogbmxtNHN2Y19wcm9jX3NoYXJlKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHN0cnVjdCBubG1fYXJncyAqYXJncCwKIAkJCQkgICAgICAgICAgc3RydWN0IG5sbV9yZXMgICpyZXNwKQogewpAQCAtMzM5LDcgKzMzOSw3IEBACiAKIAkvKiBPYnRhaW4gY2xpZW50IGFuZCBmaWxlICovCiAJaWYgKChyZXNwLT5zdGF0dXMgPSBubG00c3ZjX3JldHJpZXZlX2FyZ3MocnFzdHAsIGFyZ3AsICZob3N0LCAmZmlsZSkpKQotCQlyZXR1cm4gcnBjX3N1Y2Nlc3M7CisJCXJldHVybiByZXNwLT5zdGF0dXMgPT0gbmxtX2Ryb3BfcmVwbHkgPyBycGNfZHJvcF9yZXBseSA6cnBjX3N1Y2Nlc3M7CiAKIAkvKiBOb3cgdHJ5IHRvIGNyZWF0ZSB0aGUgc2hhcmUgKi8KIAlyZXNwLT5zdGF0dXMgPSBubG1zdmNfc2hhcmVfZmlsZShob3N0LCBmaWxlLCBhcmdwKTsKQEAgLTM1Myw3ICszNTMsNyBAQAogLyoKICAqIFVOU0hBUkU6IFJlbGVhc2UgYSBET1Mgc2hhcmUuCiAgKi8KLXN0YXRpYyBpbnQKK3N0YXRpYyBfX2JlMzIKIG5sbTRzdmNfcHJvY191bnNoYXJlKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHN0cnVjdCBubG1fYXJncyAqYXJncCwKIAkJCQkgICAgICAgICAgICBzdHJ1Y3QgbmxtX3JlcyAgKnJlc3ApCiB7CkBAIC0zNzIsNyArMzcyLDcgQEAKIAogCS8qIE9idGFpbiBjbGllbnQgYW5kIGZpbGUgKi8KIAlpZiAoKHJlc3AtPnN0YXR1cyA9IG5sbTRzdmNfcmV0cmlldmVfYXJncyhycXN0cCwgYXJncCwgJmhvc3QsICZmaWxlKSkpCi0JCXJldHVybiBycGNfc3VjY2VzczsKKwkJcmV0dXJuIHJlc3AtPnN0YXR1cyA9PSBubG1fZHJvcF9yZXBseSA/IHJwY19kcm9wX3JlcGx5IDpycGNfc3VjY2VzczsKIAogCS8qIE5vdyB0cnkgdG8gbG9jayB0aGUgZmlsZSAqLwogCXJlc3AtPnN0YXR1cyA9IG5sbXN2Y191bnNoYXJlX2ZpbGUoaG9zdCwgZmlsZSwgYXJncCk7CkBAIC0zODYsNyArMzg2LDcgQEAKIC8qCiAgKiBOTV9MT0NLOiBDcmVhdGUgYW4gdW5tb25pdG9yZWQgbG9jawogICovCi1zdGF0aWMgaW50CitzdGF0aWMgX19iZTMyCiBubG00c3ZjX3Byb2Nfbm1fbG9jayhzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCBzdHJ1Y3QgbmxtX2FyZ3MgKmFyZ3AsCiAJCQkJICAgICAgICAgICAgc3RydWN0IG5sbV9yZXMgICpyZXNwKQogewpAQCAtMzk5LDcgKzM5OSw3IEBACiAvKgogICogRlJFRV9BTEw6IFJlbGVhc2UgYWxsIGxvY2tzIGFuZCBzaGFyZXMgaGVsZCBieSBjbGllbnQKICAqLwotc3RhdGljIGludAorc3RhdGljIF9fYmUzMgogbmxtNHN2Y19wcm9jX2ZyZWVfYWxsKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHN0cnVjdCBubG1fYXJncyAqYXJncCwKIAkJCQkJICAgICB2b2lkICAgICAgICAgICAgKnJlc3ApCiB7CkBAIC00MTcsNyArNDE3LDcgQEAKIC8qCiAgKiBTTV9OT1RJRlk6IHByaXZhdGUgY2FsbGJhY2sgZnJvbSBzdGF0ZCAobm90IHBhcnQgb2Ygb2ZmaWNpYWwgTkxNIHByb3RvKQogICovCi1zdGF0aWMgaW50CitzdGF0aWMgX19iZTMyCiBubG00c3ZjX3Byb2Nfc21fbm90aWZ5KHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHN0cnVjdCBubG1fcmVib290ICphcmdwLAogCQkJCQkgICAgICB2b2lkCSAgICAgICAgKnJlc3ApCiB7CkBAIC00NDYsNyArNDQ2LDcgQEAKIC8qCiAgKiBjbGllbnQgc2VudCBhIEdSQU5URURfUkVTLCBsZXQncyByZW1vdmUgdGhlIGFzc29jaWF0ZWQgYmxvY2sKICAqLwotc3RhdGljIGludAorc3RhdGljIF9fYmUzMgogbmxtNHN2Y19wcm9jX2dyYW50ZWRfcmVzKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHN0cnVjdCBubG1fcmVzICAqYXJncCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICAqcmVzcCkKIHsKZGlmZiAtLWdpdCBhL2ZzL2xvY2tkL3N2Y2xvY2suYyBiL2ZzL2xvY2tkL3N2Y2xvY2suYwppbmRleCA4MTRjNjA2Li43ZTIxOWI5IDEwMDY0NAotLS0gYS9mcy9sb2NrZC9zdmNsb2NrLmMKKysrIGIvZnMvbG9ja2Qvc3ZjbG9jay5jCkBAIC0zMzQsMTMgKzMzNCwxMyBAQAogICogQXR0ZW1wdCB0byBlc3RhYmxpc2ggYSBsb2NrLCBhbmQgaWYgaXQgY2FuJ3QgYmUgZ3JhbnRlZCwgYmxvY2sgaXQKICAqIGlmIHJlcXVpcmVkLgogICovCi11MzIKK19fYmUzMgogbmxtc3ZjX2xvY2soc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgc3RydWN0IG5sbV9maWxlICpmaWxlLAogCQkJc3RydWN0IG5sbV9sb2NrICpsb2NrLCBpbnQgd2FpdCwgc3RydWN0IG5sbV9jb29raWUgKmNvb2tpZSkKIHsKIAlzdHJ1Y3QgbmxtX2Jsb2NrCSpibG9jaywgKm5ld2Jsb2NrID0gTlVMTDsKIAlpbnQJCQllcnJvcjsKLQl1MzIJCQlyZXQ7CisJX19iZTMyCQkJcmV0OwogCiAJZHByaW50aygibG9ja2Q6IG5sbXN2Y19sb2NrKCVzLyVsZCwgdHk9JWQsIHBpPSVkLCAlTGQtJUxkLCBibD0lZClcbiIsCiAJCQkJZmlsZS0+Zl9maWxlLT5mX2RlbnRyeS0+ZF9pbm9kZS0+aV9zYi0+c19pZCwKQEAgLTQxNSw3ICs0MTUsNyBAQAogLyoKICAqIFRlc3QgZm9yIHByZXNlbmNlIG9mIGEgY29uZmxpY3RpbmcgbG9jay4KICAqLwotdTMyCitfX2JlMzIKIG5sbXN2Y190ZXN0bG9jayhzdHJ1Y3QgbmxtX2ZpbGUgKmZpbGUsIHN0cnVjdCBubG1fbG9jayAqbG9jaywKIAkJCQkgICAgICAgc3RydWN0IG5sbV9sb2NrICpjb25mbG9jaykKIHsKQEAgLTQ0OCw3ICs0NDgsNyBAQAogICogYWZ0ZXJ3YXJkcy4gSW4gdGhpcyBjYXNlIHRoZSBibG9jayB3aWxsIHN0aWxsIGJlIHRoZXJlLCBhbmQgaGVuY2UKICAqIG11c3QgYmUgcmVtb3ZlZC4KICAqLwotdTMyCitfX2JlMzIKIG5sbXN2Y191bmxvY2soc3RydWN0IG5sbV9maWxlICpmaWxlLCBzdHJ1Y3QgbmxtX2xvY2sgKmxvY2spCiB7CiAJaW50CWVycm9yOwpAQCAtNDc2LDcgKzQ3Niw3IEBACiAgKiBiZSBpbiBwcm9ncmVzcy4KICAqIFRoZSBjYWxsaW5nIHByb2NlZHVyZSBtdXN0IGNoZWNrIHdoZXRoZXIgdGhlIGZpbGUgY2FuIGJlIGNsb3NlZC4KICAqLwotdTMyCitfX2JlMzIKIG5sbXN2Y19jYW5jZWxfYmxvY2tlZChzdHJ1Y3QgbmxtX2ZpbGUgKmZpbGUsIHN0cnVjdCBubG1fbG9jayAqbG9jaykKIHsKIAlzdHJ1Y3QgbmxtX2Jsb2NrCSpibG9jazsKZGlmZiAtLWdpdCBhL2ZzL2xvY2tkL3N2Y3Byb2MuYyBiL2ZzL2xvY2tkL3N2Y3Byb2MuYwppbmRleCA3NWIyYzgxLi4zMmU5OWE2IDEwMDY0NAotLS0gYS9mcy9sb2NrZC9zdmNwcm9jLmMKKysrIGIvZnMvbG9ja2Qvc3ZjcHJvYy5jCkBAIC0yMiw4ICsyMiw4IEBACiAjZGVmaW5lIE5MTURCR19GQUNJTElUWQkJTkxNREJHX0NMSUVOVAogCiAjaWZkZWYgQ09ORklHX0xPQ0tEX1Y0Ci1zdGF0aWMgdTMyCi1jYXN0X3RvX25sbSh1MzIgc3RhdHVzLCB1MzIgdmVycykKK3N0YXRpYyBfX2JlMzIKK2Nhc3RfdG9fbmxtKF9fYmUzMiBzdGF0dXMsIHUzMiB2ZXJzKQogewogCS8qIE5vdGU6IHN0YXR1cyBpcyBhc3N1bWVkIHRvIGJlIGluIG5ldHdvcmsgYnl0ZSBvcmRlciAhISEgKi8KIAlpZiAodmVycyAhPSA0KXsKQEAgLTUyLDE0ICs1MiwxNCBAQAogLyoKICAqIE9idGFpbiBjbGllbnQgYW5kIGZpbGUgZnJvbSBhcmd1bWVudHMKICAqLwotc3RhdGljIHUzMgorc3RhdGljIF9fYmUzMgogbmxtc3ZjX3JldHJpZXZlX2FyZ3Moc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgc3RydWN0IG5sbV9hcmdzICphcmdwLAogCQkJc3RydWN0IG5sbV9ob3N0ICoqaG9zdHAsIHN0cnVjdCBubG1fZmlsZSAqKmZpbHApCiB7CiAJc3RydWN0IG5sbV9ob3N0CQkqaG9zdCA9IE5VTEw7CiAJc3RydWN0IG5sbV9maWxlCQkqZmlsZSA9IE5VTEw7CiAJc3RydWN0IG5sbV9sb2NrCQkqbG9jayA9ICZhcmdwLT5sb2NrOwotCXUzMgkJCWVycm9yOworCV9fYmUzMgkJCWVycm9yID0gMDsKIAogCS8qIG5mc2QgY2FsbGJhY2tzIG11c3QgaGF2ZSBiZWVuIGluc3RhbGxlZCBmb3IgdGhpcyBwcm9jZWR1cmUgKi8KIAlpZiAoIW5sbXN2Y19vcHMpCkBAIC04OCwxMyArODgsMTUgQEAKIG5vX2xvY2tzOgogCWlmIChob3N0KQogCQlubG1fcmVsZWFzZV9ob3N0KGhvc3QpOworCWlmIChlcnJvcikKKwkJcmV0dXJuIGVycm9yOwogCXJldHVybiBubG1fbGNrX2RlbmllZF9ub2xvY2tzOwogfQogCiAvKgogICogTlVMTDogVGVzdCBmb3IgcHJlc2VuY2Ugb2Ygc2VydmljZQogICovCi1zdGF0aWMgaW50CitzdGF0aWMgX19iZTMyCiBubG1zdmNfcHJvY19udWxsKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHZvaWQgKmFyZ3AsIHZvaWQgKnJlc3ApCiB7CiAJZHByaW50aygibG9ja2Q6IE5VTEwgICAgICAgICAgY2FsbGVkXG4iKTsKQEAgLTEwNCw3ICsxMDYsNyBAQAogLyoKICAqIFRFU1Q6IENoZWNrIGZvciBjb25mbGljdGluZyBsb2NrCiAgKi8KLXN0YXRpYyBpbnQKK3N0YXRpYyBfX2JlMzIKIG5sbXN2Y19wcm9jX3Rlc3Qoc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgc3RydWN0IG5sbV9hcmdzICphcmdwLAogCQkJCSAgICAgICAgIHN0cnVjdCBubG1fcmVzICAqcmVzcCkKIHsKQEAgLTEyMiw3ICsxMjQsNyBAQAogCiAJLyogT2J0YWluIGNsaWVudCBhbmQgZmlsZSAqLwogCWlmICgocmVzcC0+c3RhdHVzID0gbmxtc3ZjX3JldHJpZXZlX2FyZ3MocnFzdHAsIGFyZ3AsICZob3N0LCAmZmlsZSkpKQotCQlyZXR1cm4gcnBjX3N1Y2Nlc3M7CisJCXJldHVybiByZXNwLT5zdGF0dXMgPT0gbmxtX2Ryb3BfcmVwbHkgPyBycGNfZHJvcF9yZXBseSA6cnBjX3N1Y2Nlc3M7CiAKIAkvKiBOb3cgY2hlY2sgZm9yIGNvbmZsaWN0aW5nIGxvY2tzICovCiAJcmVzcC0+c3RhdHVzID0gY2FzdF9zdGF0dXMobmxtc3ZjX3Rlc3Rsb2NrKGZpbGUsICZhcmdwLT5sb2NrLCAmcmVzcC0+bG9jaykpOwpAQCAtMTM0LDcgKzEzNiw3IEBACiAJcmV0dXJuIHJwY19zdWNjZXNzOwogfQogCi1zdGF0aWMgaW50CitzdGF0aWMgX19iZTMyCiBubG1zdmNfcHJvY19sb2NrKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHN0cnVjdCBubG1fYXJncyAqYXJncCwKIAkJCQkgICAgICAgICBzdHJ1Y3QgbmxtX3JlcyAgKnJlc3ApCiB7CkBAIC0xNTMsNyArMTU1LDcgQEAKIAogCS8qIE9idGFpbiBjbGllbnQgYW5kIGZpbGUgKi8KIAlpZiAoKHJlc3AtPnN0YXR1cyA9IG5sbXN2Y19yZXRyaWV2ZV9hcmdzKHJxc3RwLCBhcmdwLCAmaG9zdCwgJmZpbGUpKSkKLQkJcmV0dXJuIHJwY19zdWNjZXNzOworCQlyZXR1cm4gcmVzcC0+c3RhdHVzID09IG5sbV9kcm9wX3JlcGx5ID8gcnBjX2Ryb3BfcmVwbHkgOnJwY19zdWNjZXNzOwogCiAjaWYgMAogCS8qIElmIHN1cHBsaWVkIHN0YXRlIGRvZXNuJ3QgbWF0Y2ggY3VycmVudCBzdGF0ZSwgd2UgYXNzdW1lIGl0J3MKQEAgLTE3Nyw3ICsxNzksNyBAQAogCXJldHVybiBycGNfc3VjY2VzczsKIH0KIAotc3RhdGljIGludAorc3RhdGljIF9fYmUzMgogbmxtc3ZjX3Byb2NfY2FuY2VsKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHN0cnVjdCBubG1fYXJncyAqYXJncCwKIAkJCQkgICAgICAgICAgIHN0cnVjdCBubG1fcmVzICAqcmVzcCkKIHsKQEAgLTE5Niw3ICsxOTgsNyBAQAogCiAJLyogT2J0YWluIGNsaWVudCBhbmQgZmlsZSAqLwogCWlmICgocmVzcC0+c3RhdHVzID0gbmxtc3ZjX3JldHJpZXZlX2FyZ3MocnFzdHAsIGFyZ3AsICZob3N0LCAmZmlsZSkpKQotCQlyZXR1cm4gcnBjX3N1Y2Nlc3M7CisJCXJldHVybiByZXNwLT5zdGF0dXMgPT0gbmxtX2Ryb3BfcmVwbHkgPyBycGNfZHJvcF9yZXBseSA6cnBjX3N1Y2Nlc3M7CiAKIAkvKiBUcnkgdG8gY2FuY2VsIHJlcXVlc3QuICovCiAJcmVzcC0+c3RhdHVzID0gY2FzdF9zdGF0dXMobmxtc3ZjX2NhbmNlbF9ibG9ja2VkKGZpbGUsICZhcmdwLT5sb2NrKSk7CkBAIC0yMTAsNyArMjEyLDcgQEAKIC8qCiAgKiBVTkxPQ0s6IHJlbGVhc2UgYSBsb2NrCiAgKi8KLXN0YXRpYyBpbnQKK3N0YXRpYyBfX2JlMzIKIG5sbXN2Y19wcm9jX3VubG9jayhzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCBzdHJ1Y3QgbmxtX2FyZ3MgKmFyZ3AsCiAJCQkJICAgICAgICAgICBzdHJ1Y3QgbmxtX3JlcyAgKnJlc3ApCiB7CkBAIC0yMjksNyArMjMxLDcgQEAKIAogCS8qIE9idGFpbiBjbGllbnQgYW5kIGZpbGUgKi8KIAlpZiAoKHJlc3AtPnN0YXR1cyA9IG5sbXN2Y19yZXRyaWV2ZV9hcmdzKHJxc3RwLCBhcmdwLCAmaG9zdCwgJmZpbGUpKSkKLQkJcmV0dXJuIHJwY19zdWNjZXNzOworCQlyZXR1cm4gcmVzcC0+c3RhdHVzID09IG5sbV9kcm9wX3JlcGx5ID8gcnBjX2Ryb3BfcmVwbHkgOnJwY19zdWNjZXNzOwogCiAJLyogTm93IHRyeSB0byByZW1vdmUgdGhlIGxvY2sgKi8KIAlyZXNwLT5zdGF0dXMgPSBjYXN0X3N0YXR1cyhubG1zdmNfdW5sb2NrKGZpbGUsICZhcmdwLT5sb2NrKSk7CkBAIC0yNDQsNyArMjQ2LDcgQEAKICAqIEdSQU5URUQ6IEEgc2VydmVyIGNhbGxzIHVzIHRvIHRlbGwgdGhhdCBhIHByb2Nlc3MnIGxvY2sgcmVxdWVzdAogICogd2FzIGdyYW50ZWQKICAqLwotc3RhdGljIGludAorc3RhdGljIF9fYmUzMgogbmxtc3ZjX3Byb2NfZ3JhbnRlZChzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCBzdHJ1Y3QgbmxtX2FyZ3MgKmFyZ3AsCiAJCQkJICAgICAgICAgICAgc3RydWN0IG5sbV9yZXMgICpyZXNwKQogewpAQCAtMjgwLDEyICsyODIsMTIgQEAKICAqIGJlY2F1c2Ugd2Ugc2VuZCB0aGUgY2FsbGJhY2sgYmVmb3JlIHRoZSByZXBseSBwcm9wZXIuIEkgaG9wZSB0aGlzCiAgKiBkb2Vzbid0IGJyZWFrIGFueSBjbGllbnRzLgogICovCi1zdGF0aWMgaW50IG5sbXN2Y19jYWxsYmFjayhzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCB1MzIgcHJvYywgc3RydWN0IG5sbV9hcmdzICphcmdwLAotCQlpbnQgKCpmdW5jKShzdHJ1Y3Qgc3ZjX3Jxc3QgKiwgc3RydWN0IG5sbV9hcmdzICosIHN0cnVjdCBubG1fcmVzICAqKSkKK3N0YXRpYyBfX2JlMzIgbmxtc3ZjX2NhbGxiYWNrKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHUzMiBwcm9jLCBzdHJ1Y3QgbmxtX2FyZ3MgKmFyZ3AsCisJCV9fYmUzMiAoKmZ1bmMpKHN0cnVjdCBzdmNfcnFzdCAqLCBzdHJ1Y3QgbmxtX2FyZ3MgKiwgc3RydWN0IG5sbV9yZXMgICopKQogewogCXN0cnVjdCBubG1faG9zdAkqaG9zdDsKIAlzdHJ1Y3QgbmxtX3Jxc3QJKmNhbGw7Ci0JaW50IHN0YXQ7CisJX19iZTMyIHN0YXQ7CiAKIAlob3N0ID0gbmxtc3ZjX2xvb2t1cF9ob3N0KHJxc3RwLAogCQkJCSAgYXJncC0+bG9jay5jYWxsZXIsCkBAIC0zMDksMjggKzMxMSwyOCBAQAogCXJldHVybiBycGNfc3VjY2VzczsKIH0KIAotc3RhdGljIGludCBubG1zdmNfcHJvY190ZXN0X21zZyhzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCBzdHJ1Y3QgbmxtX2FyZ3MgKmFyZ3AsCitzdGF0aWMgX19iZTMyIG5sbXN2Y19wcm9jX3Rlc3RfbXNnKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHN0cnVjdCBubG1fYXJncyAqYXJncCwKIAkJCQkJICAgICB2b2lkCSAgICAgKnJlc3ApCiB7CiAJZHByaW50aygibG9ja2Q6IFRFU1RfTVNHICAgICAgY2FsbGVkXG4iKTsKIAlyZXR1cm4gbmxtc3ZjX2NhbGxiYWNrKHJxc3RwLCBOTE1QUk9DX1RFU1RfUkVTLCBhcmdwLCBubG1zdmNfcHJvY190ZXN0KTsKIH0KIAotc3RhdGljIGludCBubG1zdmNfcHJvY19sb2NrX21zZyhzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCBzdHJ1Y3QgbmxtX2FyZ3MgKmFyZ3AsCitzdGF0aWMgX19iZTMyIG5sbXN2Y19wcm9jX2xvY2tfbXNnKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHN0cnVjdCBubG1fYXJncyAqYXJncCwKIAkJCQkJICAgICB2b2lkCSAgICAgKnJlc3ApCiB7CiAJZHByaW50aygibG9ja2Q6IExPQ0tfTVNHICAgICAgY2FsbGVkXG4iKTsKIAlyZXR1cm4gbmxtc3ZjX2NhbGxiYWNrKHJxc3RwLCBOTE1QUk9DX0xPQ0tfUkVTLCBhcmdwLCBubG1zdmNfcHJvY19sb2NrKTsKIH0KIAotc3RhdGljIGludCBubG1zdmNfcHJvY19jYW5jZWxfbXNnKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHN0cnVjdCBubG1fYXJncyAqYXJncCwKK3N0YXRpYyBfX2JlMzIgbmxtc3ZjX3Byb2NfY2FuY2VsX21zZyhzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCBzdHJ1Y3QgbmxtX2FyZ3MgKmFyZ3AsCiAJCQkJCSAgICAgICB2b2lkCSAgICAgICAqcmVzcCkKIHsKIAlkcHJpbnRrKCJsb2NrZDogQ0FOQ0VMX01TRyAgICBjYWxsZWRcbiIpOwogCXJldHVybiBubG1zdmNfY2FsbGJhY2socnFzdHAsIE5MTVBST0NfQ0FOQ0VMX1JFUywgYXJncCwgbmxtc3ZjX3Byb2NfY2FuY2VsKTsKIH0KIAotc3RhdGljIGludAorc3RhdGljIF9fYmUzMgogbmxtc3ZjX3Byb2NfdW5sb2NrX21zZyhzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCBzdHJ1Y3QgbmxtX2FyZ3MgKmFyZ3AsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICAqcmVzcCkKIHsKQEAgLTMzOCw3ICszNDAsNyBAQAogCXJldHVybiBubG1zdmNfY2FsbGJhY2socnFzdHAsIE5MTVBST0NfVU5MT0NLX1JFUywgYXJncCwgbmxtc3ZjX3Byb2NfdW5sb2NrKTsKIH0KIAotc3RhdGljIGludAorc3RhdGljIF9fYmUzMgogbmxtc3ZjX3Byb2NfZ3JhbnRlZF9tc2coc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgc3RydWN0IG5sbV9hcmdzICphcmdwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAgICpyZXNwKQogewpAQCAtMzQ5LDcgKzM1MSw3IEBACiAvKgogICogU0hBUkU6IGNyZWF0ZSBhIERPUyBzaGFyZSBvciBhbHRlciBleGlzdGluZyBzaGFyZS4KICAqLwotc3RhdGljIGludAorc3RhdGljIF9fYmUzMgogbmxtc3ZjX3Byb2Nfc2hhcmUoc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgc3RydWN0IG5sbV9hcmdzICphcmdwLAogCQkJCSAgICAgICAgICBzdHJ1Y3QgbmxtX3JlcyAgKnJlc3ApCiB7CkBAIC0zNjgsNyArMzcwLDcgQEAKIAogCS8qIE9idGFpbiBjbGllbnQgYW5kIGZpbGUgKi8KIAlpZiAoKHJlc3AtPnN0YXR1cyA9IG5sbXN2Y19yZXRyaWV2ZV9hcmdzKHJxc3RwLCBhcmdwLCAmaG9zdCwgJmZpbGUpKSkKLQkJcmV0dXJuIHJwY19zdWNjZXNzOworCQlyZXR1cm4gcmVzcC0+c3RhdHVzID09IG5sbV9kcm9wX3JlcGx5ID8gcnBjX2Ryb3BfcmVwbHkgOnJwY19zdWNjZXNzOwogCiAJLyogTm93IHRyeSB0byBjcmVhdGUgdGhlIHNoYXJlICovCiAJcmVzcC0+c3RhdHVzID0gY2FzdF9zdGF0dXMobmxtc3ZjX3NoYXJlX2ZpbGUoaG9zdCwgZmlsZSwgYXJncCkpOwpAQCAtMzgyLDcgKzM4NCw3IEBACiAvKgogICogVU5TSEFSRTogUmVsZWFzZSBhIERPUyBzaGFyZS4KICAqLwotc3RhdGljIGludAorc3RhdGljIF9fYmUzMgogbmxtc3ZjX3Byb2NfdW5zaGFyZShzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCBzdHJ1Y3QgbmxtX2FyZ3MgKmFyZ3AsCiAJCQkJICAgICAgICAgICAgc3RydWN0IG5sbV9yZXMgICpyZXNwKQogewpAQCAtNDAxLDcgKzQwMyw3IEBACiAKIAkvKiBPYnRhaW4gY2xpZW50IGFuZCBmaWxlICovCiAJaWYgKChyZXNwLT5zdGF0dXMgPSBubG1zdmNfcmV0cmlldmVfYXJncyhycXN0cCwgYXJncCwgJmhvc3QsICZmaWxlKSkpCi0JCXJldHVybiBycGNfc3VjY2VzczsKKwkJcmV0dXJuIHJlc3AtPnN0YXR1cyA9PSBubG1fZHJvcF9yZXBseSA/IHJwY19kcm9wX3JlcGx5IDpycGNfc3VjY2VzczsKIAogCS8qIE5vdyB0cnkgdG8gdW5zaGFyZSB0aGUgZmlsZSAqLwogCXJlc3AtPnN0YXR1cyA9IGNhc3Rfc3RhdHVzKG5sbXN2Y191bnNoYXJlX2ZpbGUoaG9zdCwgZmlsZSwgYXJncCkpOwpAQCAtNDE1LDcgKzQxNyw3IEBACiAvKgogICogTk1fTE9DSzogQ3JlYXRlIGFuIHVubW9uaXRvcmVkIGxvY2sKICAqLwotc3RhdGljIGludAorc3RhdGljIF9fYmUzMgogbmxtc3ZjX3Byb2Nfbm1fbG9jayhzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCBzdHJ1Y3QgbmxtX2FyZ3MgKmFyZ3AsCiAJCQkJICAgICAgICAgICAgc3RydWN0IG5sbV9yZXMgICpyZXNwKQogewpAQCAtNDI4LDcgKzQzMCw3IEBACiAvKgogICogRlJFRV9BTEw6IFJlbGVhc2UgYWxsIGxvY2tzIGFuZCBzaGFyZXMgaGVsZCBieSBjbGllbnQKICAqLwotc3RhdGljIGludAorc3RhdGljIF9fYmUzMgogbmxtc3ZjX3Byb2NfZnJlZV9hbGwoc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgc3RydWN0IG5sbV9hcmdzICphcmdwLAogCQkJCQkgICAgIHZvaWQgICAgICAgICAgICAqcmVzcCkKIHsKQEAgLTQ0Niw3ICs0NDgsNyBAQAogLyoKICAqIFNNX05PVElGWTogcHJpdmF0ZSBjYWxsYmFjayBmcm9tIHN0YXRkIChub3QgcGFydCBvZiBvZmZpY2lhbCBOTE0gcHJvdG8pCiAgKi8KLXN0YXRpYyBpbnQKK3N0YXRpYyBfX2JlMzIKIG5sbXN2Y19wcm9jX3NtX25vdGlmeShzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCBzdHJ1Y3QgbmxtX3JlYm9vdCAqYXJncCwKIAkJCQkJICAgICAgdm9pZAkgICAgICAgICpyZXNwKQogewpAQCAtNDc1LDcgKzQ3Nyw3IEBACiAvKgogICogY2xpZW50IHNlbnQgYSBHUkFOVEVEX1JFUywgbGV0J3MgcmVtb3ZlIHRoZSBhc3NvY2lhdGVkIGJsb2NrCiAgKi8KLXN0YXRpYyBpbnQKK3N0YXRpYyBfX2JlMzIKIG5sbXN2Y19wcm9jX2dyYW50ZWRfcmVzKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHN0cnVjdCBubG1fcmVzICAqYXJncCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICAqcmVzcCkKIHsKZGlmZiAtLWdpdCBhL2ZzL2xvY2tkL3N2Y3NoYXJlLmMgYi9mcy9sb2NrZC9zdmNzaGFyZS5jCmluZGV4IGI5OTI2Y2UuLjYyMjBkYzJhIDEwMDY0NAotLS0gYS9mcy9sb2NrZC9zdmNzaGFyZS5jCisrKyBiL2ZzL2xvY2tkL3N2Y3NoYXJlLmMKQEAgLTIzLDcgKzIzLDcgQEAKIAkgICAgJiYgIW1lbWNtcChzaGFyZS0+c19vd25lci5kYXRhLCBvaC0+ZGF0YSwgb2gtPmxlbik7CiB9CiAKLXUzMgorX19iZTMyCiBubG1zdmNfc2hhcmVfZmlsZShzdHJ1Y3QgbmxtX2hvc3QgKmhvc3QsIHN0cnVjdCBubG1fZmlsZSAqZmlsZSwKIAkJCXN0cnVjdCBubG1fYXJncyAqYXJncCkKIHsKQEAgLTY0LDcgKzY0LDcgQEAKIC8qCiAgKiBEZWxldGUgYSBzaGFyZS4KICAqLwotdTMyCitfX2JlMzIKIG5sbXN2Y191bnNoYXJlX2ZpbGUoc3RydWN0IG5sbV9ob3N0ICpob3N0LCBzdHJ1Y3QgbmxtX2ZpbGUgKmZpbGUsCiAJCQlzdHJ1Y3QgbmxtX2FyZ3MgKmFyZ3ApCiB7CmRpZmYgLS1naXQgYS9mcy9sb2NrZC9zdmNzdWJzLmMgYi9mcy9sb2NrZC9zdmNzdWJzLmMKaW5kZXggNTE0ZjVmMi4uZTgzMDI0ZSAxMDA2NDQKLS0tIGEvZnMvbG9ja2Qvc3Zjc3Vicy5jCisrKyBiL2ZzL2xvY2tkL3N2Y3N1YnMuYwpAQCAtNzgsMTQgKzc4LDE0IEBACiAgKiBUaGlzIGlzIG5vdCBxdWl0ZSByaWdodCwgYnV0IGZvciBub3csIHdlIGFzc3VtZSB0aGUgY2xpZW50IHBlcmZvcm1zCiAgKiB0aGUgcHJvcGVyIFIvVyBjaGVja2luZy4KICAqLwotdTMyCitfX2JlMzIKIG5sbV9sb29rdXBfZmlsZShzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCBzdHJ1Y3QgbmxtX2ZpbGUgKipyZXN1bHQsCiAJCQkJCXN0cnVjdCBuZnNfZmggKmYpCiB7CiAJc3RydWN0IGhsaXN0X25vZGUgKnBvczsKIAlzdHJ1Y3QgbmxtX2ZpbGUJKmZpbGU7CiAJdW5zaWduZWQgaW50CWhhc2g7Ci0JdTMyCQluZnNlcnI7CisJX19iZTMyCQluZnNlcnI7CiAKIAlubG1fZGVidWdfcHJpbnRfZmgoIm5sbV9maWxlX2xvb2t1cCIsIGYpOwogCkBAIC0xMzUsMTIgKzEzNSw2IEBACiAKIG91dF9mcmVlOgogCWtmcmVlKGZpbGUpOwotI2lmZGVmIENPTkZJR19MT0NLRF9WNAotCWlmIChuZnNlcnIgPT0gMSkKLQkJbmZzZXJyID0gbmxtNF9zdGFsZV9maDsKLQllbHNlCi0jZW5kaWYKLQluZnNlcnIgPSBubG1fbGNrX2RlbmllZDsKIAlnb3RvIG91dF91bmxvY2s7CiB9CiAKQEAgLTMyNCw3ICszMTgsMTYgQEAKIHN0YXRpYyBpbnQKIG5sbXN2Y19pc19jbGllbnQoc3RydWN0IG5sbV9ob3N0ICpob3N0LCBzdHJ1Y3QgbmxtX2hvc3QgKmR1bW15KQogewotCXJldHVybiBob3N0LT5oX3NlcnZlcjsKKwlpZiAoaG9zdC0+aF9zZXJ2ZXIpIHsKKwkJLyogd2UgYXJlIGRlc3Ryb3lpbmcgbG9ja3MgZXZlbiB0aG91Z2ggdGhlIGNsaWVudAorCQkgKiBoYXNuJ3QgYXNrZWQgdXMgdG9vLCBzbyBkb24ndCB1bm1vbml0b3IgdGhlCisJCSAqIGNsaWVudAorCQkgKi8KKwkJaWYgKGhvc3QtPmhfbnNtaGFuZGxlKQorCQkJaG9zdC0+aF9uc21oYW5kbGUtPnNtX3N0aWNreSA9IDE7CisJCXJldHVybiAxOworCX0gZWxzZQorCQlyZXR1cm4gMDsKIH0KIAogLyoKZGlmZiAtLWdpdCBhL2ZzL2xvY2tkL3hkci5jIGIvZnMvbG9ja2QveGRyLmMKaW5kZXggNjFjNDZmYS4uYjdjOTQ5MiAxMDA2NDQKLS0tIGEvZnMvbG9ja2QveGRyLmMKKysrIGIvZnMvbG9ja2QveGRyLmMKQEAgLTQzLDcgKzQzLDcgQEAKIC8qCiAgKiBYRFIgZnVuY3Rpb25zIGZvciBiYXNpYyBOTE0gdHlwZXMKICAqLwotc3RhdGljIHUzMiAqbmxtX2RlY29kZV9jb29raWUodTMyICpwLCBzdHJ1Y3QgbmxtX2Nvb2tpZSAqYykKK3N0YXRpYyBfX2JlMzIgKm5sbV9kZWNvZGVfY29va2llKF9fYmUzMiAqcCwgc3RydWN0IG5sbV9jb29raWUgKmMpCiB7CiAJdW5zaWduZWQgaW50CWxlbjsKIApAQCAtNjksOCArNjksOCBAQAogCXJldHVybiBwOwogfQogCi1zdGF0aWMgaW5saW5lIHUzMiAqCi1ubG1fZW5jb2RlX2Nvb2tpZSh1MzIgKnAsIHN0cnVjdCBubG1fY29va2llICpjKQorc3RhdGljIGlubGluZSBfX2JlMzIgKgorbmxtX2VuY29kZV9jb29raWUoX19iZTMyICpwLCBzdHJ1Y3QgbmxtX2Nvb2tpZSAqYykKIHsKIAkqcCsrID0gaHRvbmwoYy0+bGVuKTsKIAltZW1jcHkocCwgYy0+ZGF0YSwgYy0+bGVuKTsKQEAgLTc4LDggKzc4LDggQEAKIAlyZXR1cm4gcDsKIH0KIAotc3RhdGljIHUzMiAqCi1ubG1fZGVjb2RlX2ZoKHUzMiAqcCwgc3RydWN0IG5mc19maCAqZikKK3N0YXRpYyBfX2JlMzIgKgorbmxtX2RlY29kZV9maChfX2JlMzIgKnAsIHN0cnVjdCBuZnNfZmggKmYpCiB7CiAJdW5zaWduZWQgaW50CWxlbjsKIApAQCAtOTUsOCArOTUsOCBAQAogCXJldHVybiBwICsgWERSX1FVQURMRU4oTkZTMl9GSFNJWkUpOwogfQogCi1zdGF0aWMgaW5saW5lIHUzMiAqCi1ubG1fZW5jb2RlX2ZoKHUzMiAqcCwgc3RydWN0IG5mc19maCAqZikKK3N0YXRpYyBpbmxpbmUgX19iZTMyICoKK25sbV9lbmNvZGVfZmgoX19iZTMyICpwLCBzdHJ1Y3QgbmZzX2ZoICpmKQogewogCSpwKysgPSBodG9ubChORlMyX0ZIU0laRSk7CiAJbWVtY3B5KHAsIGYtPmRhdGEsIE5GUzJfRkhTSVpFKTsKQEAgLTEwNiwyMCArMTA2LDIwIEBACiAvKgogICogRW5jb2RlIGFuZCBkZWNvZGUgb3duZXIgaGFuZGxlCiAgKi8KLXN0YXRpYyBpbmxpbmUgdTMyICoKLW5sbV9kZWNvZGVfb2godTMyICpwLCBzdHJ1Y3QgeGRyX25ldG9iaiAqb2gpCitzdGF0aWMgaW5saW5lIF9fYmUzMiAqCitubG1fZGVjb2RlX29oKF9fYmUzMiAqcCwgc3RydWN0IHhkcl9uZXRvYmogKm9oKQogewogCXJldHVybiB4ZHJfZGVjb2RlX25ldG9iaihwLCBvaCk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdTMyICoKLW5sbV9lbmNvZGVfb2godTMyICpwLCBzdHJ1Y3QgeGRyX25ldG9iaiAqb2gpCitzdGF0aWMgaW5saW5lIF9fYmUzMiAqCitubG1fZW5jb2RlX29oKF9fYmUzMiAqcCwgc3RydWN0IHhkcl9uZXRvYmogKm9oKQogewogCXJldHVybiB4ZHJfZW5jb2RlX25ldG9iaihwLCBvaCk7CiB9CiAKLXN0YXRpYyB1MzIgKgotbmxtX2RlY29kZV9sb2NrKHUzMiAqcCwgc3RydWN0IG5sbV9sb2NrICpsb2NrKQorc3RhdGljIF9fYmUzMiAqCitubG1fZGVjb2RlX2xvY2soX19iZTMyICpwLCBzdHJ1Y3QgbmxtX2xvY2sgKmxvY2spCiB7CiAJc3RydWN0IGZpbGVfbG9jawkqZmwgPSAmbG9jay0+Zmw7CiAJczMyCQkJc3RhcnQsIGxlbiwgZW5kOwpAQCAtMTUzLDggKzE1Myw4IEBACiAvKgogICogRW5jb2RlIGEgbG9jayBhcyBwYXJ0IG9mIGFuIE5MTSBjYWxsCiAgKi8KLXN0YXRpYyB1MzIgKgotbmxtX2VuY29kZV9sb2NrKHUzMiAqcCwgc3RydWN0IG5sbV9sb2NrICpsb2NrKQorc3RhdGljIF9fYmUzMiAqCitubG1fZW5jb2RlX2xvY2soX19iZTMyICpwLCBzdHJ1Y3QgbmxtX2xvY2sgKmxvY2spCiB7CiAJc3RydWN0IGZpbGVfbG9jawkqZmwgPSAmbG9jay0+Zmw7CiAJX19zMzIJCQlzdGFydCwgbGVuOwpAQCAtMTg0LDggKzE4NCw4IEBACiAvKgogICogRW5jb2RlIHJlc3VsdCBvZiBhIFRFU1QvVEVTVF9NU0cgY2FsbAogICovCi1zdGF0aWMgdTMyICoKLW5sbV9lbmNvZGVfdGVzdHJlcyh1MzIgKnAsIHN0cnVjdCBubG1fcmVzICpyZXNwKQorc3RhdGljIF9fYmUzMiAqCitubG1fZW5jb2RlX3Rlc3RyZXMoX19iZTMyICpwLCBzdHJ1Y3QgbmxtX3JlcyAqcmVzcCkKIHsKIAlzMzIJCXN0YXJ0LCBsZW47CiAKQEAgLTIyMSw3ICsyMjEsNyBAQAogICogRmlyc3QsIHRoZSBzZXJ2ZXIgc2lkZSBYRFIgZnVuY3Rpb25zCiAgKi8KIGludAotbmxtc3ZjX2RlY29kZV90ZXN0YXJncyhzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCB1MzIgKnAsIG5sbV9hcmdzICphcmdwKQorbmxtc3ZjX2RlY29kZV90ZXN0YXJncyhzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCBfX2JlMzIgKnAsIG5sbV9hcmdzICphcmdwKQogewogCXUzMglleGNsdXNpdmU7CiAKQEAgLTIzOCw3ICsyMzgsNyBAQAogfQogCiBpbnQKLW5sbXN2Y19lbmNvZGVfdGVzdHJlcyhzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCB1MzIgKnAsIHN0cnVjdCBubG1fcmVzICpyZXNwKQorbmxtc3ZjX2VuY29kZV90ZXN0cmVzKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIF9fYmUzMiAqcCwgc3RydWN0IG5sbV9yZXMgKnJlc3ApCiB7CiAJaWYgKCEocCA9IG5sbV9lbmNvZGVfdGVzdHJlcyhwLCByZXNwKSkpCiAJCXJldHVybiAwOwpAQCAtMjQ2LDcgKzI0Niw3IEBACiB9CiAKIGludAotbmxtc3ZjX2RlY29kZV9sb2NrYXJncyhzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCB1MzIgKnAsIG5sbV9hcmdzICphcmdwKQorbmxtc3ZjX2RlY29kZV9sb2NrYXJncyhzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCBfX2JlMzIgKnAsIG5sbV9hcmdzICphcmdwKQogewogCXUzMglleGNsdXNpdmU7CiAKQEAgLTI2Niw3ICsyNjYsNyBAQAogfQogCiBpbnQKLW5sbXN2Y19kZWNvZGVfY2FuY2FyZ3Moc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgdTMyICpwLCBubG1fYXJncyAqYXJncCkKK25sbXN2Y19kZWNvZGVfY2FuY2FyZ3Moc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgX19iZTMyICpwLCBubG1fYXJncyAqYXJncCkKIHsKIAl1MzIJZXhjbHVzaXZlOwogCkBAIC0yODIsNyArMjgyLDcgQEAKIH0KIAogaW50Ci1ubG1zdmNfZGVjb2RlX3VubG9ja2FyZ3Moc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgdTMyICpwLCBubG1fYXJncyAqYXJncCkKK25sbXN2Y19kZWNvZGVfdW5sb2NrYXJncyhzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCBfX2JlMzIgKnAsIG5sbV9hcmdzICphcmdwKQogewogCWlmICghKHAgPSBubG1fZGVjb2RlX2Nvb2tpZShwLCAmYXJncC0+Y29va2llKSkKIAkgfHwgIShwID0gbmxtX2RlY29kZV9sb2NrKHAsICZhcmdwLT5sb2NrKSkpCkBAIC0yOTIsNyArMjkyLDcgQEAKIH0KIAogaW50Ci1ubG1zdmNfZGVjb2RlX3NoYXJlYXJncyhzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCB1MzIgKnAsIG5sbV9hcmdzICphcmdwKQorbmxtc3ZjX2RlY29kZV9zaGFyZWFyZ3Moc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgX19iZTMyICpwLCBubG1fYXJncyAqYXJncCkKIHsKIAlzdHJ1Y3QgbmxtX2xvY2sJKmxvY2sgPSAmYXJncC0+bG9jazsKIApAQCAtMzEzLDcgKzMxMyw3IEBACiB9CiAKIGludAotbmxtc3ZjX2VuY29kZV9zaGFyZXJlcyhzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCB1MzIgKnAsIHN0cnVjdCBubG1fcmVzICpyZXNwKQorbmxtc3ZjX2VuY29kZV9zaGFyZXJlcyhzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCBfX2JlMzIgKnAsIHN0cnVjdCBubG1fcmVzICpyZXNwKQogewogCWlmICghKHAgPSBubG1fZW5jb2RlX2Nvb2tpZShwLCAmcmVzcC0+Y29va2llKSkpCiAJCXJldHVybiAwOwpAQCAtMzIzLDcgKzMyMyw3IEBACiB9CiAKIGludAotbmxtc3ZjX2VuY29kZV9yZXMoc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgdTMyICpwLCBzdHJ1Y3QgbmxtX3JlcyAqcmVzcCkKK25sbXN2Y19lbmNvZGVfcmVzKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIF9fYmUzMiAqcCwgc3RydWN0IG5sbV9yZXMgKnJlc3ApCiB7CiAJaWYgKCEocCA9IG5sbV9lbmNvZGVfY29va2llKHAsICZyZXNwLT5jb29raWUpKSkKIAkJcmV0dXJuIDA7CkBAIC0zMzIsNyArMzMyLDcgQEAKIH0KIAogaW50Ci1ubG1zdmNfZGVjb2RlX25vdGlmeShzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCB1MzIgKnAsIHN0cnVjdCBubG1fYXJncyAqYXJncCkKK25sbXN2Y19kZWNvZGVfbm90aWZ5KHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIF9fYmUzMiAqcCwgc3RydWN0IG5sbV9hcmdzICphcmdwKQogewogCXN0cnVjdCBubG1fbG9jawkqbG9jayA9ICZhcmdwLT5sb2NrOwogCkBAIC0zNDQsNyArMzQ0LDcgQEAKIH0KIAogaW50Ci1ubG1zdmNfZGVjb2RlX3JlYm9vdChzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCB1MzIgKnAsIHN0cnVjdCBubG1fcmVib290ICphcmdwKQorbmxtc3ZjX2RlY29kZV9yZWJvb3Qoc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgX19iZTMyICpwLCBzdHJ1Y3QgbmxtX3JlYm9vdCAqYXJncCkKIHsKIAlpZiAoIShwID0geGRyX2RlY29kZV9zdHJpbmdfaW5wbGFjZShwLCAmYXJncC0+bW9uLCAmYXJncC0+bGVuLCBTTV9NQVhTVFJMRU4pKSkKIAkJcmV0dXJuIDA7CkBAIC0zNTcsNyArMzU3LDcgQEAKIH0KIAogaW50Ci1ubG1zdmNfZGVjb2RlX3JlcyhzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCB1MzIgKnAsIHN0cnVjdCBubG1fcmVzICpyZXNwKQorbmxtc3ZjX2RlY29kZV9yZXMoc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgX19iZTMyICpwLCBzdHJ1Y3QgbmxtX3JlcyAqcmVzcCkKIHsKIAlpZiAoIShwID0gbmxtX2RlY29kZV9jb29raWUocCwgJnJlc3AtPmNvb2tpZSkpKQogCQlyZXR1cm4gMDsKQEAgLTM2NiwxMyArMzY2LDEzIEBACiB9CiAKIGludAotbmxtc3ZjX2RlY29kZV92b2lkKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHUzMiAqcCwgdm9pZCAqZHVtbXkpCitubG1zdmNfZGVjb2RlX3ZvaWQoc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgX19iZTMyICpwLCB2b2lkICpkdW1teSkKIHsKIAlyZXR1cm4geGRyX2FyZ3NpemVfY2hlY2socnFzdHAsIHApOwogfQogCiBpbnQKLW5sbXN2Y19lbmNvZGVfdm9pZChzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCB1MzIgKnAsIHZvaWQgKmR1bW15KQorbmxtc3ZjX2VuY29kZV92b2lkKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIF9fYmUzMiAqcCwgdm9pZCAqZHVtbXkpCiB7CiAJcmV0dXJuIHhkcl9yZXNzaXplX2NoZWNrKHJxc3RwLCBwKTsKIH0KQEAgLTM4OSw3ICszODksNyBAQAogI2VuZGlmCiAKIHN0YXRpYyBpbnQKLW5sbWNsdF9lbmNvZGVfdGVzdGFyZ3Moc3RydWN0IHJwY19ycXN0ICpyZXEsIHUzMiAqcCwgbmxtX2FyZ3MgKmFyZ3ApCitubG1jbHRfZW5jb2RlX3Rlc3RhcmdzKHN0cnVjdCBycGNfcnFzdCAqcmVxLCBfX2JlMzIgKnAsIG5sbV9hcmdzICphcmdwKQogewogCXN0cnVjdCBubG1fbG9jawkqbG9jayA9ICZhcmdwLT5sb2NrOwogCkBAIC00MDMsNyArNDAzLDcgQEAKIH0KIAogc3RhdGljIGludAotbmxtY2x0X2RlY29kZV90ZXN0cmVzKHN0cnVjdCBycGNfcnFzdCAqcmVxLCB1MzIgKnAsIHN0cnVjdCBubG1fcmVzICpyZXNwKQorbmxtY2x0X2RlY29kZV90ZXN0cmVzKHN0cnVjdCBycGNfcnFzdCAqcmVxLCBfX2JlMzIgKnAsIHN0cnVjdCBubG1fcmVzICpyZXNwKQogewogCWlmICghKHAgPSBubG1fZGVjb2RlX2Nvb2tpZShwLCAmcmVzcC0+Y29va2llKSkpCiAJCXJldHVybiAtRUlPOwpAQCAtNDM4LDcgKzQzOCw3IEBACiAKIAogc3RhdGljIGludAotbmxtY2x0X2VuY29kZV9sb2NrYXJncyhzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwgdTMyICpwLCBubG1fYXJncyAqYXJncCkKK25sbWNsdF9lbmNvZGVfbG9ja2FyZ3Moc3RydWN0IHJwY19ycXN0ICpyZXEsIF9fYmUzMiAqcCwgbmxtX2FyZ3MgKmFyZ3ApCiB7CiAJc3RydWN0IG5sbV9sb2NrCSpsb2NrID0gJmFyZ3AtPmxvY2s7CiAKQEAgLTQ1NSw3ICs0NTUsNyBAQAogfQogCiBzdGF0aWMgaW50Ci1ubG1jbHRfZW5jb2RlX2NhbmNhcmdzKHN0cnVjdCBycGNfcnFzdCAqcmVxLCB1MzIgKnAsIG5sbV9hcmdzICphcmdwKQorbmxtY2x0X2VuY29kZV9jYW5jYXJncyhzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwgX19iZTMyICpwLCBubG1fYXJncyAqYXJncCkKIHsKIAlzdHJ1Y3QgbmxtX2xvY2sJKmxvY2sgPSAmYXJncC0+bG9jazsKIApAQCAtNDcwLDcgKzQ3MCw3IEBACiB9CiAKIHN0YXRpYyBpbnQKLW5sbWNsdF9lbmNvZGVfdW5sb2NrYXJncyhzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwgdTMyICpwLCBubG1fYXJncyAqYXJncCkKK25sbWNsdF9lbmNvZGVfdW5sb2NrYXJncyhzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwgX19iZTMyICpwLCBubG1fYXJncyAqYXJncCkKIHsKIAlzdHJ1Y3QgbmxtX2xvY2sJKmxvY2sgPSAmYXJncC0+bG9jazsKIApAQCAtNDgzLDcgKzQ4Myw3IEBACiB9CiAKIHN0YXRpYyBpbnQKLW5sbWNsdF9lbmNvZGVfcmVzKHN0cnVjdCBycGNfcnFzdCAqcmVxLCB1MzIgKnAsIHN0cnVjdCBubG1fcmVzICpyZXNwKQorbmxtY2x0X2VuY29kZV9yZXMoc3RydWN0IHJwY19ycXN0ICpyZXEsIF9fYmUzMiAqcCwgc3RydWN0IG5sbV9yZXMgKnJlc3ApCiB7CiAJaWYgKCEocCA9IG5sbV9lbmNvZGVfY29va2llKHAsICZyZXNwLT5jb29raWUpKSkKIAkJcmV0dXJuIC1FSU87CkBAIC00OTMsNyArNDkzLDcgQEAKIH0KIAogc3RhdGljIGludAotbmxtY2x0X2VuY29kZV90ZXN0cmVzKHN0cnVjdCBycGNfcnFzdCAqcmVxLCB1MzIgKnAsIHN0cnVjdCBubG1fcmVzICpyZXNwKQorbmxtY2x0X2VuY29kZV90ZXN0cmVzKHN0cnVjdCBycGNfcnFzdCAqcmVxLCBfX2JlMzIgKnAsIHN0cnVjdCBubG1fcmVzICpyZXNwKQogewogCWlmICghKHAgPSBubG1fZW5jb2RlX3Rlc3RyZXMocCwgcmVzcCkpKQogCQlyZXR1cm4gLUVJTzsKQEAgLTUwMiw3ICs1MDIsNyBAQAogfQogCiBzdGF0aWMgaW50Ci1ubG1jbHRfZGVjb2RlX3JlcyhzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwgdTMyICpwLCBzdHJ1Y3QgbmxtX3JlcyAqcmVzcCkKK25sbWNsdF9kZWNvZGVfcmVzKHN0cnVjdCBycGNfcnFzdCAqcmVxLCBfX2JlMzIgKnAsIHN0cnVjdCBubG1fcmVzICpyZXNwKQogewogCWlmICghKHAgPSBubG1fZGVjb2RlX2Nvb2tpZShwLCAmcmVzcC0+Y29va2llKSkpCiAJCXJldHVybiAtRUlPOwpkaWZmIC0tZ2l0IGEvZnMvbG9ja2QveGRyNC5jIGIvZnMvbG9ja2QveGRyNC5jCmluZGV4IDM2ZWIxNzUuLmY0YzBiMmIgMTAwNjQ0Ci0tLSBhL2ZzL2xvY2tkL3hkcjQuYworKysgYi9mcy9sb2NrZC94ZHI0LmMKQEAgLTQ0LDggKzQ0LDggQEAKIC8qCiAgKiBYRFIgZnVuY3Rpb25zIGZvciBiYXNpYyBOTE0gdHlwZXMKICAqLwotc3RhdGljIHUzMiAqCi1ubG00X2RlY29kZV9jb29raWUodTMyICpwLCBzdHJ1Y3QgbmxtX2Nvb2tpZSAqYykKK3N0YXRpYyBfX2JlMzIgKgorbmxtNF9kZWNvZGVfY29va2llKF9fYmUzMiAqcCwgc3RydWN0IG5sbV9jb29raWUgKmMpCiB7CiAJdW5zaWduZWQgaW50CWxlbjsKIApAQCAtNzEsOCArNzEsOCBAQAogCXJldHVybiBwOwogfQogCi1zdGF0aWMgdTMyICoKLW5sbTRfZW5jb2RlX2Nvb2tpZSh1MzIgKnAsIHN0cnVjdCBubG1fY29va2llICpjKQorc3RhdGljIF9fYmUzMiAqCitubG00X2VuY29kZV9jb29raWUoX19iZTMyICpwLCBzdHJ1Y3QgbmxtX2Nvb2tpZSAqYykKIHsKIAkqcCsrID0gaHRvbmwoYy0+bGVuKTsKIAltZW1jcHkocCwgYy0+ZGF0YSwgYy0+bGVuKTsKQEAgLTgwLDggKzgwLDggQEAKIAlyZXR1cm4gcDsKIH0KIAotc3RhdGljIHUzMiAqCi1ubG00X2RlY29kZV9maCh1MzIgKnAsIHN0cnVjdCBuZnNfZmggKmYpCitzdGF0aWMgX19iZTMyICoKK25sbTRfZGVjb2RlX2ZoKF9fYmUzMiAqcCwgc3RydWN0IG5mc19maCAqZikKIHsKIAltZW1zZXQoZi0+ZGF0YSwgMCwgc2l6ZW9mKGYtPmRhdGEpKTsKIAlmLT5zaXplID0gbnRvaGwoKnArKyk7CkBAIC05NSw4ICs5NSw4IEBACiAJcmV0dXJuIHAgKyBYRFJfUVVBRExFTihmLT5zaXplKTsKIH0KIAotc3RhdGljIHUzMiAqCi1ubG00X2VuY29kZV9maCh1MzIgKnAsIHN0cnVjdCBuZnNfZmggKmYpCitzdGF0aWMgX19iZTMyICoKK25sbTRfZW5jb2RlX2ZoKF9fYmUzMiAqcCwgc3RydWN0IG5mc19maCAqZikKIHsKIAkqcCsrID0gaHRvbmwoZi0+c2l6ZSk7CiAJaWYgKGYtPnNpemUpIHBbWERSX1FVQURMRU4oZi0+c2l6ZSktMV0gPSAwOyAvKiBkb24ndCBsZWFrIGFueXRoaW5nICovCkBAIC0xMDcsMjAgKzEwNywyMCBAQAogLyoKICAqIEVuY29kZSBhbmQgZGVjb2RlIG93bmVyIGhhbmRsZQogICovCi1zdGF0aWMgdTMyICoKLW5sbTRfZGVjb2RlX29oKHUzMiAqcCwgc3RydWN0IHhkcl9uZXRvYmogKm9oKQorc3RhdGljIF9fYmUzMiAqCitubG00X2RlY29kZV9vaChfX2JlMzIgKnAsIHN0cnVjdCB4ZHJfbmV0b2JqICpvaCkKIHsKIAlyZXR1cm4geGRyX2RlY29kZV9uZXRvYmoocCwgb2gpOwogfQogCi1zdGF0aWMgdTMyICoKLW5sbTRfZW5jb2RlX29oKHUzMiAqcCwgc3RydWN0IHhkcl9uZXRvYmogKm9oKQorc3RhdGljIF9fYmUzMiAqCitubG00X2VuY29kZV9vaChfX2JlMzIgKnAsIHN0cnVjdCB4ZHJfbmV0b2JqICpvaCkKIHsKIAlyZXR1cm4geGRyX2VuY29kZV9uZXRvYmoocCwgb2gpOwogfQogCi1zdGF0aWMgdTMyICoKLW5sbTRfZGVjb2RlX2xvY2sodTMyICpwLCBzdHJ1Y3QgbmxtX2xvY2sgKmxvY2spCitzdGF0aWMgX19iZTMyICoKK25sbTRfZGVjb2RlX2xvY2soX19iZTMyICpwLCBzdHJ1Y3QgbmxtX2xvY2sgKmxvY2spCiB7CiAJc3RydWN0IGZpbGVfbG9jawkqZmwgPSAmbG9jay0+Zmw7CiAJX19zNjQJCQlsZW4sIHN0YXJ0LCBlbmQ7CkBAIC0xNTMsOCArMTUzLDggQEAKIC8qCiAgKiBFbmNvZGUgYSBsb2NrIGFzIHBhcnQgb2YgYW4gTkxNIGNhbGwKICAqLwotc3RhdGljIHUzMiAqCi1ubG00X2VuY29kZV9sb2NrKHUzMiAqcCwgc3RydWN0IG5sbV9sb2NrICpsb2NrKQorc3RhdGljIF9fYmUzMiAqCitubG00X2VuY29kZV9sb2NrKF9fYmUzMiAqcCwgc3RydWN0IG5sbV9sb2NrICpsb2NrKQogewogCXN0cnVjdCBmaWxlX2xvY2sJKmZsID0gJmxvY2stPmZsOwogCV9fczY0CQkJc3RhcnQsIGxlbjsKQEAgLTE4NSw4ICsxODUsOCBAQAogLyoKICAqIEVuY29kZSByZXN1bHQgb2YgYSBURVNUL1RFU1RfTVNHIGNhbGwKICAqLwotc3RhdGljIHUzMiAqCi1ubG00X2VuY29kZV90ZXN0cmVzKHUzMiAqcCwgc3RydWN0IG5sbV9yZXMgKnJlc3ApCitzdGF0aWMgX19iZTMyICoKK25sbTRfZW5jb2RlX3Rlc3RyZXMoX19iZTMyICpwLCBzdHJ1Y3QgbmxtX3JlcyAqcmVzcCkKIHsKIAlzNjQJCXN0YXJ0LCBsZW47CiAKQEAgLTIyNyw3ICsyMjcsNyBAQAogICogRmlyc3QsIHRoZSBzZXJ2ZXIgc2lkZSBYRFIgZnVuY3Rpb25zCiAgKi8KIGludAotbmxtNHN2Y19kZWNvZGVfdGVzdGFyZ3Moc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgdTMyICpwLCBubG1fYXJncyAqYXJncCkKK25sbTRzdmNfZGVjb2RlX3Rlc3RhcmdzKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIF9fYmUzMiAqcCwgbmxtX2FyZ3MgKmFyZ3ApCiB7CiAJdTMyCWV4Y2x1c2l2ZTsKIApAQCAtMjQ0LDcgKzI0NCw3IEBACiB9CiAKIGludAotbmxtNHN2Y19lbmNvZGVfdGVzdHJlcyhzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCB1MzIgKnAsIHN0cnVjdCBubG1fcmVzICpyZXNwKQorbmxtNHN2Y19lbmNvZGVfdGVzdHJlcyhzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCBfX2JlMzIgKnAsIHN0cnVjdCBubG1fcmVzICpyZXNwKQogewogCWlmICghKHAgPSBubG00X2VuY29kZV90ZXN0cmVzKHAsIHJlc3ApKSkKIAkJcmV0dXJuIDA7CkBAIC0yNTIsNyArMjUyLDcgQEAKIH0KIAogaW50Ci1ubG00c3ZjX2RlY29kZV9sb2NrYXJncyhzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCB1MzIgKnAsIG5sbV9hcmdzICphcmdwKQorbmxtNHN2Y19kZWNvZGVfbG9ja2FyZ3Moc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgX19iZTMyICpwLCBubG1fYXJncyAqYXJncCkKIHsKIAl1MzIJZXhjbHVzaXZlOwogCkBAIC0yNzIsNyArMjcyLDcgQEAKIH0KIAogaW50Ci1ubG00c3ZjX2RlY29kZV9jYW5jYXJncyhzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCB1MzIgKnAsIG5sbV9hcmdzICphcmdwKQorbmxtNHN2Y19kZWNvZGVfY2FuY2FyZ3Moc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgX19iZTMyICpwLCBubG1fYXJncyAqYXJncCkKIHsKIAl1MzIJZXhjbHVzaXZlOwogCkBAIC0yODgsNyArMjg4LDcgQEAKIH0KIAogaW50Ci1ubG00c3ZjX2RlY29kZV91bmxvY2thcmdzKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHUzMiAqcCwgbmxtX2FyZ3MgKmFyZ3ApCitubG00c3ZjX2RlY29kZV91bmxvY2thcmdzKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIF9fYmUzMiAqcCwgbmxtX2FyZ3MgKmFyZ3ApCiB7CiAJaWYgKCEocCA9IG5sbTRfZGVjb2RlX2Nvb2tpZShwLCAmYXJncC0+Y29va2llKSkKIAkgfHwgIShwID0gbmxtNF9kZWNvZGVfbG9jayhwLCAmYXJncC0+bG9jaykpKQpAQCAtMjk4LDcgKzI5OCw3IEBACiB9CiAKIGludAotbmxtNHN2Y19kZWNvZGVfc2hhcmVhcmdzKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHUzMiAqcCwgbmxtX2FyZ3MgKmFyZ3ApCitubG00c3ZjX2RlY29kZV9zaGFyZWFyZ3Moc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgX19iZTMyICpwLCBubG1fYXJncyAqYXJncCkKIHsKIAlzdHJ1Y3QgbmxtX2xvY2sJKmxvY2sgPSAmYXJncC0+bG9jazsKIApAQCAtMzE5LDcgKzMxOSw3IEBACiB9CiAKIGludAotbmxtNHN2Y19lbmNvZGVfc2hhcmVyZXMoc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgdTMyICpwLCBzdHJ1Y3QgbmxtX3JlcyAqcmVzcCkKK25sbTRzdmNfZW5jb2RlX3NoYXJlcmVzKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIF9fYmUzMiAqcCwgc3RydWN0IG5sbV9yZXMgKnJlc3ApCiB7CiAJaWYgKCEocCA9IG5sbTRfZW5jb2RlX2Nvb2tpZShwLCAmcmVzcC0+Y29va2llKSkpCiAJCXJldHVybiAwOwpAQCAtMzI5LDcgKzMyOSw3IEBACiB9CiAKIGludAotbmxtNHN2Y19lbmNvZGVfcmVzKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHUzMiAqcCwgc3RydWN0IG5sbV9yZXMgKnJlc3ApCitubG00c3ZjX2VuY29kZV9yZXMoc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgX19iZTMyICpwLCBzdHJ1Y3QgbmxtX3JlcyAqcmVzcCkKIHsKIAlpZiAoIShwID0gbmxtNF9lbmNvZGVfY29va2llKHAsICZyZXNwLT5jb29raWUpKSkKIAkJcmV0dXJuIDA7CkBAIC0zMzgsNyArMzM4LDcgQEAKIH0KIAogaW50Ci1ubG00c3ZjX2RlY29kZV9ub3RpZnkoc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgdTMyICpwLCBzdHJ1Y3QgbmxtX2FyZ3MgKmFyZ3ApCitubG00c3ZjX2RlY29kZV9ub3RpZnkoc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgX19iZTMyICpwLCBzdHJ1Y3QgbmxtX2FyZ3MgKmFyZ3ApCiB7CiAJc3RydWN0IG5sbV9sb2NrCSpsb2NrID0gJmFyZ3AtPmxvY2s7CiAKQEAgLTM1MCw3ICszNTAsNyBAQAogfQogCiBpbnQKLW5sbTRzdmNfZGVjb2RlX3JlYm9vdChzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCB1MzIgKnAsIHN0cnVjdCBubG1fcmVib290ICphcmdwKQorbmxtNHN2Y19kZWNvZGVfcmVib290KHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIF9fYmUzMiAqcCwgc3RydWN0IG5sbV9yZWJvb3QgKmFyZ3ApCiB7CiAJaWYgKCEocCA9IHhkcl9kZWNvZGVfc3RyaW5nX2lucGxhY2UocCwgJmFyZ3AtPm1vbiwgJmFyZ3AtPmxlbiwgU01fTUFYU1RSTEVOKSkpCiAJCXJldHVybiAwOwpAQCAtMzYzLDcgKzM2Myw3IEBACiB9CiAKIGludAotbmxtNHN2Y19kZWNvZGVfcmVzKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHUzMiAqcCwgc3RydWN0IG5sbV9yZXMgKnJlc3ApCitubG00c3ZjX2RlY29kZV9yZXMoc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgX19iZTMyICpwLCBzdHJ1Y3QgbmxtX3JlcyAqcmVzcCkKIHsKIAlpZiAoIShwID0gbmxtNF9kZWNvZGVfY29va2llKHAsICZyZXNwLT5jb29raWUpKSkKIAkJcmV0dXJuIDA7CkBAIC0zNzIsMTMgKzM3MiwxMyBAQAogfQogCiBpbnQKLW5sbTRzdmNfZGVjb2RlX3ZvaWQoc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgdTMyICpwLCB2b2lkICpkdW1teSkKK25sbTRzdmNfZGVjb2RlX3ZvaWQoc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgX19iZTMyICpwLCB2b2lkICpkdW1teSkKIHsKIAlyZXR1cm4geGRyX2FyZ3NpemVfY2hlY2socnFzdHAsIHApOwogfQogCiBpbnQKLW5sbTRzdmNfZW5jb2RlX3ZvaWQoc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgdTMyICpwLCB2b2lkICpkdW1teSkKK25sbTRzdmNfZW5jb2RlX3ZvaWQoc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgX19iZTMyICpwLCB2b2lkICpkdW1teSkKIHsKIAlyZXR1cm4geGRyX3Jlc3NpemVfY2hlY2socnFzdHAsIHApOwogfQpAQCAtMzg4LDE0ICszODgsMTQgQEAKICAqLwogI2lmZGVmIE5MTUNMTlRfU1VQUE9SVF9TSEFSRVMKIHN0YXRpYyBpbnQKLW5sbTRjbHRfZGVjb2RlX3ZvaWQoc3RydWN0IHJwY19ycXN0ICpyZXEsIHUzMiAqcCwgdm9pZCAqcHRyKQorbmxtNGNsdF9kZWNvZGVfdm9pZChzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwgX19iZTMyICpwLCB2b2lkICpwdHIpCiB7CiAJcmV0dXJuIDA7CiB9CiAjZW5kaWYKIAogc3RhdGljIGludAotbmxtNGNsdF9lbmNvZGVfdGVzdGFyZ3Moc3RydWN0IHJwY19ycXN0ICpyZXEsIHUzMiAqcCwgbmxtX2FyZ3MgKmFyZ3ApCitubG00Y2x0X2VuY29kZV90ZXN0YXJncyhzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwgX19iZTMyICpwLCBubG1fYXJncyAqYXJncCkKIHsKIAlzdHJ1Y3QgbmxtX2xvY2sJKmxvY2sgPSAmYXJncC0+bG9jazsKIApAQCAtNDA5LDcgKzQwOSw3IEBACiB9CiAKIHN0YXRpYyBpbnQKLW5sbTRjbHRfZGVjb2RlX3Rlc3RyZXMoc3RydWN0IHJwY19ycXN0ICpyZXEsIHUzMiAqcCwgc3RydWN0IG5sbV9yZXMgKnJlc3ApCitubG00Y2x0X2RlY29kZV90ZXN0cmVzKHN0cnVjdCBycGNfcnFzdCAqcmVxLCBfX2JlMzIgKnAsIHN0cnVjdCBubG1fcmVzICpyZXNwKQogewogCWlmICghKHAgPSBubG00X2RlY29kZV9jb29raWUocCwgJnJlc3AtPmNvb2tpZSkpKQogCQlyZXR1cm4gLUVJTzsKQEAgLTQ0NCw3ICs0NDQsNyBAQAogCiAKIHN0YXRpYyBpbnQKLW5sbTRjbHRfZW5jb2RlX2xvY2thcmdzKHN0cnVjdCBycGNfcnFzdCAqcmVxLCB1MzIgKnAsIG5sbV9hcmdzICphcmdwKQorbmxtNGNsdF9lbmNvZGVfbG9ja2FyZ3Moc3RydWN0IHJwY19ycXN0ICpyZXEsIF9fYmUzMiAqcCwgbmxtX2FyZ3MgKmFyZ3ApCiB7CiAJc3RydWN0IG5sbV9sb2NrCSpsb2NrID0gJmFyZ3AtPmxvY2s7CiAKQEAgLTQ2MSw3ICs0NjEsNyBAQAogfQogCiBzdGF0aWMgaW50Ci1ubG00Y2x0X2VuY29kZV9jYW5jYXJncyhzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwgdTMyICpwLCBubG1fYXJncyAqYXJncCkKK25sbTRjbHRfZW5jb2RlX2NhbmNhcmdzKHN0cnVjdCBycGNfcnFzdCAqcmVxLCBfX2JlMzIgKnAsIG5sbV9hcmdzICphcmdwKQogewogCXN0cnVjdCBubG1fbG9jawkqbG9jayA9ICZhcmdwLT5sb2NrOwogCkBAIC00NzYsNyArNDc2LDcgQEAKIH0KIAogc3RhdGljIGludAotbmxtNGNsdF9lbmNvZGVfdW5sb2NrYXJncyhzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwgdTMyICpwLCBubG1fYXJncyAqYXJncCkKK25sbTRjbHRfZW5jb2RlX3VubG9ja2FyZ3Moc3RydWN0IHJwY19ycXN0ICpyZXEsIF9fYmUzMiAqcCwgbmxtX2FyZ3MgKmFyZ3ApCiB7CiAJc3RydWN0IG5sbV9sb2NrCSpsb2NrID0gJmFyZ3AtPmxvY2s7CiAKQEAgLTQ4OSw3ICs0ODksNyBAQAogfQogCiBzdGF0aWMgaW50Ci1ubG00Y2x0X2VuY29kZV9yZXMoc3RydWN0IHJwY19ycXN0ICpyZXEsIHUzMiAqcCwgc3RydWN0IG5sbV9yZXMgKnJlc3ApCitubG00Y2x0X2VuY29kZV9yZXMoc3RydWN0IHJwY19ycXN0ICpyZXEsIF9fYmUzMiAqcCwgc3RydWN0IG5sbV9yZXMgKnJlc3ApCiB7CiAJaWYgKCEocCA9IG5sbTRfZW5jb2RlX2Nvb2tpZShwLCAmcmVzcC0+Y29va2llKSkpCiAJCXJldHVybiAtRUlPOwpAQCAtNDk5LDcgKzQ5OSw3IEBACiB9CiAKIHN0YXRpYyBpbnQKLW5sbTRjbHRfZW5jb2RlX3Rlc3RyZXMoc3RydWN0IHJwY19ycXN0ICpyZXEsIHUzMiAqcCwgc3RydWN0IG5sbV9yZXMgKnJlc3ApCitubG00Y2x0X2VuY29kZV90ZXN0cmVzKHN0cnVjdCBycGNfcnFzdCAqcmVxLCBfX2JlMzIgKnAsIHN0cnVjdCBubG1fcmVzICpyZXNwKQogewogCWlmICghKHAgPSBubG00X2VuY29kZV90ZXN0cmVzKHAsIHJlc3ApKSkKIAkJcmV0dXJuIC1FSU87CkBAIC01MDgsNyArNTA4LDcgQEAKIH0KIAogc3RhdGljIGludAotbmxtNGNsdF9kZWNvZGVfcmVzKHN0cnVjdCBycGNfcnFzdCAqcmVxLCB1MzIgKnAsIHN0cnVjdCBubG1fcmVzICpyZXNwKQorbmxtNGNsdF9kZWNvZGVfcmVzKHN0cnVjdCBycGNfcnFzdCAqcmVxLCBfX2JlMzIgKnAsIHN0cnVjdCBubG1fcmVzICpyZXNwKQogewogCWlmICghKHAgPSBubG00X2RlY29kZV9jb29raWUocCwgJnJlc3AtPmNvb2tpZSkpKQogCQlyZXR1cm4gLUVJTzsKZGlmZiAtLWdpdCBhL2ZzL21pbml4L2lub2RlLmMgYi9mcy9taW5peC9pbm9kZS5jCmluZGV4IGMxMWE0YjkuLjFlMzZiYWUgMTAwNjQ0Ci0tLSBhL2ZzL21pbml4L2lub2RlLmMKKysrIGIvZnMvbWluaXgvaW5vZGUuYwpAQCAtMTQ5LDEyICsxNDksOCBAQAogCQlyZXR1cm4gLUVOT01FTTsKIAlzLT5zX2ZzX2luZm8gPSBzYmk7CiAKLQkvKiBOLkIuIFRoZXNlIHNob3VsZCBiZSBjb21waWxlLXRpbWUgdGVzdHMuCi0JICAgVW5mb3J0dW5hdGVseSB0aGF0IGlzIGltcG9zc2libGUuICovCi0JaWYgKDMyICE9IHNpemVvZiAoc3RydWN0IG1pbml4X2lub2RlKSkKLQkJcGFuaWMoImJhZCBWMSBpLW5vZGUgc2l6ZSIpOwotCWlmICg2NCAhPSBzaXplb2Yoc3RydWN0IG1pbml4Ml9pbm9kZSkpCi0JCXBhbmljKCJiYWQgVjIgaS1ub2RlIHNpemUiKTsKKwlCVUlMRF9CVUdfT04oMzIgIT0gc2l6ZW9mIChzdHJ1Y3QgbWluaXhfaW5vZGUpKTsKKwlCVUlMRF9CVUdfT04oNjQgIT0gc2l6ZW9mKHN0cnVjdCBtaW5peDJfaW5vZGUpKTsKIAogCWlmICghc2Jfc2V0X2Jsb2Nrc2l6ZShzLCBCTE9DS19TSVpFKSkKIAkJZ290byBvdXRfYmFkX2hibG9jazsKZGlmZiAtLWdpdCBhL2ZzL21zZG9zL25hbWVpLmMgYi9mcy9tc2Rvcy9uYW1laS5jCmluZGV4IGIwZjAxYjMuLjQ1MjQ2MTkgMTAwNjQ0Ci0tLSBhL2ZzL21zZG9zL25hbWVpLmMKKysrIGIvZnMvbXNkb3MvbmFtZWkuYwpAQCAtNjU0LDYgKzY1NCw3IEBACiAJLnJtZGlyCQk9IG1zZG9zX3JtZGlyLAogCS5yZW5hbWUJCT0gbXNkb3NfcmVuYW1lLAogCS5zZXRhdHRyCT0gZmF0X25vdGlmeV9jaGFuZ2UsCisJLmdldGF0dHIJPSBmYXRfZ2V0YXR0ciwKIH07CiAKIHN0YXRpYyBpbnQgbXNkb3NfZmlsbF9zdXBlcihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCB2b2lkICpkYXRhLCBpbnQgc2lsZW50KQpkaWZmIC0tZ2l0IGEvZnMvbmZzL2NhbGxiYWNrLmggYi9mcy9uZnMvY2FsbGJhY2suaAppbmRleCA1Njc2MTYzZC4uZGIzZDc5MSAxMDA2NDQKLS0tIGEvZnMvbmZzL2NhbGxiYWNrLmgKKysrIGIvZnMvbmZzL2NhbGxiYWNrLmgKQEAgLTMxLDEwICszMSwxMCBAQAogfTsKIAogc3RydWN0IGNiX2NvbXBvdW5kX2hkcl9yZXMgewotCXVpbnQzMl90ICpzdGF0dXM7CisJX19iZTMyICpzdGF0dXM7CiAJaW50IHRhZ2xlbjsKIAljb25zdCBjaGFyICp0YWc7Ci0JdWludDMyX3QgKm5vcHM7CisJX19iZTMyICpub3BzOwogfTsKIAogc3RydWN0IGNiX2dldGF0dHJhcmdzIHsKQEAgLTQ0LDcgKzQ0LDcgQEAKIH07CiAKIHN0cnVjdCBjYl9nZXRhdHRycmVzIHsKLQl1aW50MzJfdCBzdGF0dXM7CisJX19iZTMyIHN0YXR1czsKIAl1aW50MzJfdCBiaXRtYXBbMl07CiAJdWludDY0X3Qgc2l6ZTsKIAl1aW50NjRfdCBjaGFuZ2VfYXR0cjsKQEAgLTU5LDggKzU5LDggQEAKIAl1aW50MzJfdCB0cnVuY2F0ZTsKIH07CiAKLWV4dGVybiB1bnNpZ25lZCBuZnM0X2NhbGxiYWNrX2dldGF0dHIoc3RydWN0IGNiX2dldGF0dHJhcmdzICphcmdzLCBzdHJ1Y3QgY2JfZ2V0YXR0cnJlcyAqcmVzKTsKLWV4dGVybiB1bnNpZ25lZCBuZnM0X2NhbGxiYWNrX3JlY2FsbChzdHJ1Y3QgY2JfcmVjYWxsYXJncyAqYXJncywgdm9pZCAqZHVtbXkpOworZXh0ZXJuIF9fYmUzMiBuZnM0X2NhbGxiYWNrX2dldGF0dHIoc3RydWN0IGNiX2dldGF0dHJhcmdzICphcmdzLCBzdHJ1Y3QgY2JfZ2V0YXR0cnJlcyAqcmVzKTsKK2V4dGVybiBfX2JlMzIgbmZzNF9jYWxsYmFja19yZWNhbGwoc3RydWN0IGNiX3JlY2FsbGFyZ3MgKmFyZ3MsIHZvaWQgKmR1bW15KTsKIAogI2lmZGVmIENPTkZJR19ORlNfVjQKIGV4dGVybiBpbnQgbmZzX2NhbGxiYWNrX3VwKHZvaWQpOwpkaWZmIC0tZ2l0IGEvZnMvbmZzL2NhbGxiYWNrX3Byb2MuYyBiL2ZzL25mcy9jYWxsYmFja19wcm9jLmMKaW5kZXggOTdjZjhmNy4uNzJlNTVkOCAxMDA2NDQKLS0tIGEvZnMvbmZzL2NhbGxiYWNrX3Byb2MuYworKysgYi9mcy9uZnMvY2FsbGJhY2tfcHJvYy5jCkBAIC0xNCw3ICsxNCw3IEBACiAKICNkZWZpbmUgTkZTREJHX0ZBQ0lMSVRZIE5GU0RCR19DQUxMQkFDSwogIAotdW5zaWduZWQgbmZzNF9jYWxsYmFja19nZXRhdHRyKHN0cnVjdCBjYl9nZXRhdHRyYXJncyAqYXJncywgc3RydWN0IGNiX2dldGF0dHJyZXMgKnJlcykKK19fYmUzMiBuZnM0X2NhbGxiYWNrX2dldGF0dHIoc3RydWN0IGNiX2dldGF0dHJhcmdzICphcmdzLCBzdHJ1Y3QgY2JfZ2V0YXR0cnJlcyAqcmVzKQogewogCXN0cnVjdCBuZnNfY2xpZW50ICpjbHA7CiAJc3RydWN0IG5mc19kZWxlZ2F0aW9uICpkZWxlZ2F0aW9uOwpAQCAtNTUsMTEgKzU1LDExIEBACiAJcmV0dXJuIHJlcy0+c3RhdHVzOwogfQogCi11bnNpZ25lZCBuZnM0X2NhbGxiYWNrX3JlY2FsbChzdHJ1Y3QgY2JfcmVjYWxsYXJncyAqYXJncywgdm9pZCAqZHVtbXkpCitfX2JlMzIgbmZzNF9jYWxsYmFja19yZWNhbGwoc3RydWN0IGNiX3JlY2FsbGFyZ3MgKmFyZ3MsIHZvaWQgKmR1bW15KQogewogCXN0cnVjdCBuZnNfY2xpZW50ICpjbHA7CiAJc3RydWN0IGlub2RlICppbm9kZTsKLQl1bnNpZ25lZCByZXM7CisJX19iZTMyIHJlczsKIAkKIAlyZXMgPSBodG9ubChORlM0RVJSX0JBREhBTkRMRSk7CiAJY2xwID0gbmZzX2ZpbmRfY2xpZW50KGFyZ3MtPmFkZHIsIDQpOwpkaWZmIC0tZ2l0IGEvZnMvbmZzL2NhbGxiYWNrX3hkci5jIGIvZnMvbmZzL2NhbGxiYWNrX3hkci5jCmluZGV4IDI5ZjkzMjEuLmY4ZWExZjUgMTAwNjQ0Ci0tLSBhL2ZzL25mcy9jYWxsYmFja194ZHIuYworKysgYi9mcy9uZnMvY2FsbGJhY2tfeGRyLmMKQEAgLTIyLDkgKzIyLDkgQEAKIAogI2RlZmluZSBORlNEQkdfRkFDSUxJVFkgTkZTREJHX0NBTExCQUNLCiAKLXR5cGVkZWYgdW5zaWduZWQgKCpjYWxsYmFja19wcm9jZXNzX29wX3QpKHZvaWQgKiwgdm9pZCAqKTsKLXR5cGVkZWYgdW5zaWduZWQgKCpjYWxsYmFja19kZWNvZGVfYXJnX3QpKHN0cnVjdCBzdmNfcnFzdCAqLCBzdHJ1Y3QgeGRyX3N0cmVhbSAqLCB2b2lkICopOwotdHlwZWRlZiB1bnNpZ25lZCAoKmNhbGxiYWNrX2VuY29kZV9yZXNfdCkoc3RydWN0IHN2Y19ycXN0ICosIHN0cnVjdCB4ZHJfc3RyZWFtICosIHZvaWQgKik7Cit0eXBlZGVmIF9fYmUzMiAoKmNhbGxiYWNrX3Byb2Nlc3Nfb3BfdCkodm9pZCAqLCB2b2lkICopOwordHlwZWRlZiBfX2JlMzIgKCpjYWxsYmFja19kZWNvZGVfYXJnX3QpKHN0cnVjdCBzdmNfcnFzdCAqLCBzdHJ1Y3QgeGRyX3N0cmVhbSAqLCB2b2lkICopOwordHlwZWRlZiBfX2JlMzIgKCpjYWxsYmFja19lbmNvZGVfcmVzX3QpKHN0cnVjdCBzdmNfcnFzdCAqLCBzdHJ1Y3QgeGRyX3N0cmVhbSAqLCB2b2lkICopOwogCiAKIHN0cnVjdCBjYWxsYmFja19vcCB7CkBAIC0zNiwyNCArMzYsMjQgQEAKIAogc3RhdGljIHN0cnVjdCBjYWxsYmFja19vcCBjYWxsYmFja19vcHNbXTsKIAotc3RhdGljIGludCBuZnM0X2NhbGxiYWNrX251bGwoc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgdm9pZCAqYXJncCwgdm9pZCAqcmVzcCkKK3N0YXRpYyBfX2JlMzIgbmZzNF9jYWxsYmFja19udWxsKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHZvaWQgKmFyZ3AsIHZvaWQgKnJlc3ApCiB7CiAJcmV0dXJuIGh0b25sKE5GUzRfT0spOwogfQogCi1zdGF0aWMgaW50IG5mczRfZGVjb2RlX3ZvaWQoc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgdWludDMyX3QgKnAsIHZvaWQgKmR1bW15KQorc3RhdGljIGludCBuZnM0X2RlY29kZV92b2lkKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIF9fYmUzMiAqcCwgdm9pZCAqZHVtbXkpCiB7CiAJcmV0dXJuIHhkcl9hcmdzaXplX2NoZWNrKHJxc3RwLCBwKTsKIH0KIAotc3RhdGljIGludCBuZnM0X2VuY29kZV92b2lkKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHVpbnQzMl90ICpwLCB2b2lkICpkdW1teSkKK3N0YXRpYyBpbnQgbmZzNF9lbmNvZGVfdm9pZChzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCBfX2JlMzIgKnAsIHZvaWQgKmR1bW15KQogewogCXJldHVybiB4ZHJfcmVzc2l6ZV9jaGVjayhycXN0cCwgcCk7CiB9CiAKLXN0YXRpYyB1aW50MzJfdCAqcmVhZF9idWYoc3RydWN0IHhkcl9zdHJlYW0gKnhkciwgaW50IG5ieXRlcykKK3N0YXRpYyBfX2JlMzIgKnJlYWRfYnVmKHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsIGludCBuYnl0ZXMpCiB7Ci0JdWludDMyX3QgKnA7CisJX19iZTMyICpwOwogCiAJcCA9IHhkcl9pbmxpbmVfZGVjb2RlKHhkciwgbmJ5dGVzKTsKIAlpZiAodW5saWtlbHkocCA9PSBOVUxMKSkKQEAgLTYxLDkgKzYxLDkgQEAKIAlyZXR1cm4gcDsKIH0KIAotc3RhdGljIHVuc2lnbmVkIGRlY29kZV9zdHJpbmcoc3RydWN0IHhkcl9zdHJlYW0gKnhkciwgdW5zaWduZWQgaW50ICpsZW4sIGNvbnN0IGNoYXIgKipzdHIpCitzdGF0aWMgX19iZTMyIGRlY29kZV9zdHJpbmcoc3RydWN0IHhkcl9zdHJlYW0gKnhkciwgdW5zaWduZWQgaW50ICpsZW4sIGNvbnN0IGNoYXIgKipzdHIpCiB7Ci0JdWludDMyX3QgKnA7CisJX19iZTMyICpwOwogCiAJcCA9IHJlYWRfYnVmKHhkciwgNCk7CiAJaWYgKHVubGlrZWx5KHAgPT0gTlVMTCkpCkBAIC04MSw5ICs4MSw5IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyB1bnNpZ25lZCBkZWNvZGVfZmgoc3RydWN0IHhkcl9zdHJlYW0gKnhkciwgc3RydWN0IG5mc19maCAqZmgpCitzdGF0aWMgX19iZTMyIGRlY29kZV9maChzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLCBzdHJ1Y3QgbmZzX2ZoICpmaCkKIHsKLQl1aW50MzJfdCAqcDsKKwlfX2JlMzIgKnA7CiAKIAlwID0gcmVhZF9idWYoeGRyLCA0KTsKIAlpZiAodW5saWtlbHkocCA9PSBOVUxMKSkKQEAgLTk5LDkgKzk5LDkgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHVuc2lnbmVkIGRlY29kZV9iaXRtYXAoc3RydWN0IHhkcl9zdHJlYW0gKnhkciwgdWludDMyX3QgKmJpdG1hcCkKK3N0YXRpYyBfX2JlMzIgZGVjb2RlX2JpdG1hcChzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLCB1aW50MzJfdCAqYml0bWFwKQogewotCXVpbnQzMl90ICpwOworCV9fYmUzMiAqcDsKIAl1bnNpZ25lZCBpbnQgYXR0cmxlbjsKIAogCXAgPSByZWFkX2J1Zih4ZHIsIDQpOwpAQCAtMTE4LDkgKzExOCw5IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyB1bnNpZ25lZCBkZWNvZGVfc3RhdGVpZChzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLCBuZnM0X3N0YXRlaWQgKnN0YXRlaWQpCitzdGF0aWMgX19iZTMyIGRlY29kZV9zdGF0ZWlkKHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsIG5mczRfc3RhdGVpZCAqc3RhdGVpZCkKIHsKLQl1aW50MzJfdCAqcDsKKwlfX2JlMzIgKnA7CiAKIAlwID0gcmVhZF9idWYoeGRyLCAxNik7CiAJaWYgKHVubGlrZWx5KHAgPT0gTlVMTCkpCkBAIC0xMjksMTEgKzEyOSwxMSBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgdW5zaWduZWQgZGVjb2RlX2NvbXBvdW5kX2hkcl9hcmcoc3RydWN0IHhkcl9zdHJlYW0gKnhkciwgc3RydWN0IGNiX2NvbXBvdW5kX2hkcl9hcmcgKmhkcikKK3N0YXRpYyBfX2JlMzIgZGVjb2RlX2NvbXBvdW5kX2hkcl9hcmcoc3RydWN0IHhkcl9zdHJlYW0gKnhkciwgc3RydWN0IGNiX2NvbXBvdW5kX2hkcl9hcmcgKmhkcikKIHsKLQl1aW50MzJfdCAqcDsKKwlfX2JlMzIgKnA7CiAJdW5zaWduZWQgaW50IG1pbm9yX3ZlcnNpb247Ci0JdW5zaWduZWQgc3RhdHVzOworCV9fYmUzMiBzdGF0dXM7CiAKIAlzdGF0dXMgPSBkZWNvZGVfc3RyaW5nKHhkciwgJmhkci0+dGFnbGVuLCAmaGRyLT50YWcpOwogCWlmICh1bmxpa2VseShzdGF0dXMgIT0gMCkpCkBAIC0xNTksOSArMTU5LDkgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHVuc2lnbmVkIGRlY29kZV9vcF9oZHIoc3RydWN0IHhkcl9zdHJlYW0gKnhkciwgdW5zaWduZWQgaW50ICpvcCkKK3N0YXRpYyBfX2JlMzIgZGVjb2RlX29wX2hkcihzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLCB1bnNpZ25lZCBpbnQgKm9wKQogewotCXVpbnQzMl90ICpwOworCV9fYmUzMiAqcDsKIAlwID0gcmVhZF9idWYoeGRyLCA0KTsKIAlpZiAodW5saWtlbHkocCA9PSBOVUxMKSkKIAkJcmV0dXJuIGh0b25sKE5GUzRFUlJfUkVTT1VSQ0UpOwpAQCAtMTY5LDkgKzE2OSw5IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyB1bnNpZ25lZCBkZWNvZGVfZ2V0YXR0cl9hcmdzKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsIHN0cnVjdCBjYl9nZXRhdHRyYXJncyAqYXJncykKK3N0YXRpYyBfX2JlMzIgZGVjb2RlX2dldGF0dHJfYXJncyhzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCBzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLCBzdHJ1Y3QgY2JfZ2V0YXR0cmFyZ3MgKmFyZ3MpCiB7Ci0JdW5zaWduZWQgc3RhdHVzOworCV9fYmUzMiBzdGF0dXM7CiAKIAlzdGF0dXMgPSBkZWNvZGVfZmgoeGRyLCAmYXJncy0+ZmgpOwogCWlmICh1bmxpa2VseShzdGF0dXMgIT0gMCkpCkBAIC0xODMsMTAgKzE4MywxMCBAQAogCXJldHVybiBzdGF0dXM7CiB9CiAKLXN0YXRpYyB1bnNpZ25lZCBkZWNvZGVfcmVjYWxsX2FyZ3Moc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgc3RydWN0IHhkcl9zdHJlYW0gKnhkciwgc3RydWN0IGNiX3JlY2FsbGFyZ3MgKmFyZ3MpCitzdGF0aWMgX19iZTMyIGRlY29kZV9yZWNhbGxfYXJncyhzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCBzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLCBzdHJ1Y3QgY2JfcmVjYWxsYXJncyAqYXJncykKIHsKLQl1aW50MzJfdCAqcDsKLQl1bnNpZ25lZCBzdGF0dXM7CisJX19iZTMyICpwOworCV9fYmUzMiBzdGF0dXM7CiAKIAlhcmdzLT5hZGRyID0gJnJxc3RwLT5ycV9hZGRyOwogCXN0YXR1cyA9IGRlY29kZV9zdGF0ZWlkKHhkciwgJmFyZ3MtPnN0YXRlaWQpOwpAQCAtMjA0LDkgKzIwNCw5IEBACiAJcmV0dXJuIHN0YXR1czsKIH0KIAotc3RhdGljIHVuc2lnbmVkIGVuY29kZV9zdHJpbmcoc3RydWN0IHhkcl9zdHJlYW0gKnhkciwgdW5zaWduZWQgaW50IGxlbiwgY29uc3QgY2hhciAqc3RyKQorc3RhdGljIF9fYmUzMiBlbmNvZGVfc3RyaW5nKHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsIHVuc2lnbmVkIGludCBsZW4sIGNvbnN0IGNoYXIgKnN0cikKIHsKLQl1aW50MzJfdCAqcDsKKwlfX2JlMzIgKnA7CiAKIAlwID0geGRyX3Jlc2VydmVfc3BhY2UoeGRyLCA0ICsgbGVuKTsKIAlpZiAodW5saWtlbHkocCA9PSBOVUxMKSkKQEAgLTIxNywxMCArMjE3LDEwIEBACiAKICNkZWZpbmUgQ0JfU1VQUE9SVEVEX0FUVFIwIChGQVRUUjRfV09SRDBfQ0hBTkdFfEZBVFRSNF9XT1JEMF9TSVpFKQogI2RlZmluZSBDQl9TVVBQT1JURURfQVRUUjEgKEZBVFRSNF9XT1JEMV9USU1FX01FVEFEQVRBfEZBVFRSNF9XT1JEMV9USU1FX01PRElGWSkKLXN0YXRpYyB1bnNpZ25lZCBlbmNvZGVfYXR0cl9iaXRtYXAoc3RydWN0IHhkcl9zdHJlYW0gKnhkciwgY29uc3QgdWludDMyX3QgKmJpdG1hcCwgdWludDMyX3QgKipzYXZlcCkKK3N0YXRpYyBfX2JlMzIgZW5jb2RlX2F0dHJfYml0bWFwKHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsIGNvbnN0IHVpbnQzMl90ICpiaXRtYXAsIF9fYmUzMiAqKnNhdmVwKQogewotCXVpbnQzMl90IGJtWzJdOwotCXVpbnQzMl90ICpwOworCV9fYmUzMiBibVsyXTsKKwlfX2JlMzIgKnA7CiAKIAlibVswXSA9IGh0b25sKGJpdG1hcFswXSAmIENCX1NVUFBPUlRFRF9BVFRSMCk7CiAJYm1bMV0gPSBodG9ubChiaXRtYXBbMV0gJiBDQl9TVVBQT1JURURfQVRUUjEpOwpAQCAtMjQ3LDkgKzI0Nyw5IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyB1bnNpZ25lZCBlbmNvZGVfYXR0cl9jaGFuZ2Uoc3RydWN0IHhkcl9zdHJlYW0gKnhkciwgY29uc3QgdWludDMyX3QgKmJpdG1hcCwgdWludDY0X3QgY2hhbmdlKQorc3RhdGljIF9fYmUzMiBlbmNvZGVfYXR0cl9jaGFuZ2Uoc3RydWN0IHhkcl9zdHJlYW0gKnhkciwgY29uc3QgdWludDMyX3QgKmJpdG1hcCwgdWludDY0X3QgY2hhbmdlKQogewotCXVpbnQzMl90ICpwOworCV9fYmUzMiAqcDsKIAogCWlmICghKGJpdG1hcFswXSAmIEZBVFRSNF9XT1JEMF9DSEFOR0UpKQogCQlyZXR1cm4gMDsKQEAgLTI2MCw5ICsyNjAsOSBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgdW5zaWduZWQgZW5jb2RlX2F0dHJfc2l6ZShzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLCBjb25zdCB1aW50MzJfdCAqYml0bWFwLCB1aW50NjRfdCBzaXplKQorc3RhdGljIF9fYmUzMiBlbmNvZGVfYXR0cl9zaXplKHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsIGNvbnN0IHVpbnQzMl90ICpiaXRtYXAsIHVpbnQ2NF90IHNpemUpCiB7Ci0JdWludDMyX3QgKnA7CisJX19iZTMyICpwOwogCiAJaWYgKCEoYml0bWFwWzBdICYgRkFUVFI0X1dPUkQwX1NJWkUpKQogCQlyZXR1cm4gMDsKQEAgLTI3Myw5ICsyNzMsOSBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgdW5zaWduZWQgZW5jb2RlX2F0dHJfdGltZShzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLCBjb25zdCBzdHJ1Y3QgdGltZXNwZWMgKnRpbWUpCitzdGF0aWMgX19iZTMyIGVuY29kZV9hdHRyX3RpbWUoc3RydWN0IHhkcl9zdHJlYW0gKnhkciwgY29uc3Qgc3RydWN0IHRpbWVzcGVjICp0aW1lKQogewotCXVpbnQzMl90ICpwOworCV9fYmUzMiAqcDsKIAogCXAgPSB4ZHJfcmVzZXJ2ZV9zcGFjZSh4ZHIsIDEyKTsKIAlpZiAodW5saWtlbHkocCA9PSAwKSkKQEAgLTI4NSwyMyArMjg1LDIzIEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyB1bnNpZ25lZCBlbmNvZGVfYXR0cl9jdGltZShzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLCBjb25zdCB1aW50MzJfdCAqYml0bWFwLCBjb25zdCBzdHJ1Y3QgdGltZXNwZWMgKnRpbWUpCitzdGF0aWMgX19iZTMyIGVuY29kZV9hdHRyX2N0aW1lKHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsIGNvbnN0IHVpbnQzMl90ICpiaXRtYXAsIGNvbnN0IHN0cnVjdCB0aW1lc3BlYyAqdGltZSkKIHsKIAlpZiAoIShiaXRtYXBbMV0gJiBGQVRUUjRfV09SRDFfVElNRV9NRVRBREFUQSkpCiAJCXJldHVybiAwOwogCXJldHVybiBlbmNvZGVfYXR0cl90aW1lKHhkcix0aW1lKTsKIH0KIAotc3RhdGljIHVuc2lnbmVkIGVuY29kZV9hdHRyX210aW1lKHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsIGNvbnN0IHVpbnQzMl90ICpiaXRtYXAsIGNvbnN0IHN0cnVjdCB0aW1lc3BlYyAqdGltZSkKK3N0YXRpYyBfX2JlMzIgZW5jb2RlX2F0dHJfbXRpbWUoc3RydWN0IHhkcl9zdHJlYW0gKnhkciwgY29uc3QgdWludDMyX3QgKmJpdG1hcCwgY29uc3Qgc3RydWN0IHRpbWVzcGVjICp0aW1lKQogewogCWlmICghKGJpdG1hcFsxXSAmIEZBVFRSNF9XT1JEMV9USU1FX01PRElGWSkpCiAJCXJldHVybiAwOwogCXJldHVybiBlbmNvZGVfYXR0cl90aW1lKHhkcix0aW1lKTsKIH0KIAotc3RhdGljIHVuc2lnbmVkIGVuY29kZV9jb21wb3VuZF9oZHJfcmVzKHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsIHN0cnVjdCBjYl9jb21wb3VuZF9oZHJfcmVzICpoZHIpCitzdGF0aWMgX19iZTMyIGVuY29kZV9jb21wb3VuZF9oZHJfcmVzKHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsIHN0cnVjdCBjYl9jb21wb3VuZF9oZHJfcmVzICpoZHIpCiB7Ci0JdW5zaWduZWQgc3RhdHVzOworCV9fYmUzMiBzdGF0dXM7CiAKIAloZHItPnN0YXR1cyA9IHhkcl9yZXNlcnZlX3NwYWNlKHhkciwgNCk7CiAJaWYgKHVubGlrZWx5KGhkci0+c3RhdHVzID09IE5VTEwpKQpAQCAtMzE1LDkgKzMxNSw5IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyB1bnNpZ25lZCBlbmNvZGVfb3BfaGRyKHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsIHVpbnQzMl90IG9wLCB1aW50MzJfdCByZXMpCitzdGF0aWMgX19iZTMyIGVuY29kZV9vcF9oZHIoc3RydWN0IHhkcl9zdHJlYW0gKnhkciwgdWludDMyX3Qgb3AsIF9fYmUzMiByZXMpCiB7Ci0JdWludDMyX3QgKnA7CisJX19iZTMyICpwOwogCQogCXAgPSB4ZHJfcmVzZXJ2ZV9zcGFjZSh4ZHIsIDgpOwogCWlmICh1bmxpa2VseShwID09IE5VTEwpKQpAQCAtMzI3LDEwICszMjcsMTAgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHVuc2lnbmVkIGVuY29kZV9nZXRhdHRyX3JlcyhzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCBzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLCBjb25zdCBzdHJ1Y3QgY2JfZ2V0YXR0cnJlcyAqcmVzKQorc3RhdGljIF9fYmUzMiBlbmNvZGVfZ2V0YXR0cl9yZXMoc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgc3RydWN0IHhkcl9zdHJlYW0gKnhkciwgY29uc3Qgc3RydWN0IGNiX2dldGF0dHJyZXMgKnJlcykKIHsKLQl1aW50MzJfdCAqc2F2ZXAgPSBOVUxMOwotCXVuc2lnbmVkIHN0YXR1cyA9IHJlcy0+c3RhdHVzOworCV9fYmUzMiAqc2F2ZXAgPSBOVUxMOworCV9fYmUzMiBzdGF0dXMgPSByZXMtPnN0YXR1czsKIAkKIAlpZiAodW5saWtlbHkoc3RhdHVzICE9IDApKQogCQlnb3RvIG91dDsKQEAgLTM1MywxNSArMzUzLDE1IEBACiAJcmV0dXJuIHN0YXR1czsKIH0KIAotc3RhdGljIHVuc2lnbmVkIHByb2Nlc3Nfb3Aoc3RydWN0IHN2Y19ycXN0ICpycXN0cCwKK3N0YXRpYyBfX2JlMzIgcHJvY2Vzc19vcChzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLAogCQlzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyX2luLCB2b2lkICphcmdwLAogCQlzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyX291dCwgdm9pZCAqcmVzcCkKIHsKIAlzdHJ1Y3QgY2FsbGJhY2tfb3AgKm9wID0gJmNhbGxiYWNrX29wc1swXTsKIAl1bnNpZ25lZCBpbnQgb3BfbnIgPSBPUF9DQl9JTExFR0FMOwotCXVuc2lnbmVkIGludCBzdGF0dXMgPSAwOworCV9fYmUzMiBzdGF0dXMgPSAwOwogCWxvbmcgbWF4bGVuOwotCXVuc2lnbmVkIHJlczsKKwlfX2JlMzIgcmVzOwogCiAJZHByaW50aygiJXM6IHN0YXJ0XG4iLCBfX0ZVTkNUSU9OX18pOwogCXN0YXR1cyA9IGRlY29kZV9vcF9oZHIoeGRyX2luLCAmb3BfbnIpOwpAQCAtMzk5LDIwICszOTksMjAgQEAKIC8qCiAgKiBEZWNvZGUsIHByb2Nlc3MgYW5kIGVuY29kZSBhIENPTVBPVU5ECiAgKi8KLXN0YXRpYyBpbnQgbmZzNF9jYWxsYmFja19jb21wb3VuZChzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCB2b2lkICphcmdwLCB2b2lkICpyZXNwKQorc3RhdGljIF9fYmUzMiBuZnM0X2NhbGxiYWNrX2NvbXBvdW5kKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHZvaWQgKmFyZ3AsIHZvaWQgKnJlc3ApCiB7CiAJc3RydWN0IGNiX2NvbXBvdW5kX2hkcl9hcmcgaGRyX2FyZzsKIAlzdHJ1Y3QgY2JfY29tcG91bmRfaGRyX3JlcyBoZHJfcmVzOwogCXN0cnVjdCB4ZHJfc3RyZWFtIHhkcl9pbiwgeGRyX291dDsKLQl1aW50MzJfdCAqcDsKLQl1bnNpZ25lZCBpbnQgc3RhdHVzOworCV9fYmUzMiAqcDsKKwlfX2JlMzIgc3RhdHVzOwogCXVuc2lnbmVkIGludCBub3BzID0gMTsKIAogCWRwcmludGsoIiVzOiBzdGFydFxuIiwgX19GVU5DVElPTl9fKTsKIAogCXhkcl9pbml0X2RlY29kZSgmeGRyX2luLCAmcnFzdHAtPnJxX2FyZywgcnFzdHAtPnJxX2FyZy5oZWFkWzBdLmlvdl9iYXNlKTsKIAotCXAgPSAodWludDMyX3QqKSgoY2hhciAqKXJxc3RwLT5ycV9yZXMuaGVhZFswXS5pb3ZfYmFzZSArIHJxc3RwLT5ycV9yZXMuaGVhZFswXS5pb3ZfbGVuKTsKKwlwID0gKF9fYmUzMiopKChjaGFyICopcnFzdHAtPnJxX3Jlcy5oZWFkWzBdLmlvdl9iYXNlICsgcnFzdHAtPnJxX3Jlcy5oZWFkWzBdLmlvdl9sZW4pOwogCXhkcl9pbml0X2VuY29kZSgmeGRyX291dCwgJnJxc3RwLT5ycV9yZXMsIHApOwogCiAJZGVjb2RlX2NvbXBvdW5kX2hkcl9hcmcoJnhkcl9pbiwgJmhkcl9hcmcpOwpkaWZmIC0tZ2l0IGEvZnMvbmZzL2NsaWVudC5jIGIvZnMvbmZzL2NsaWVudC5jCmluZGV4IDM0YzM5OTYuLjVmZWE2MzggMTAwNjQ0Ci0tLSBhL2ZzL25mcy9jbGllbnQuYworKysgYi9mcy9uZnMvY2xpZW50LmMKQEAgLTIzMiwxMSArMjMyLDE1IEBACiAgKiBGaW5kIGEgY2xpZW50IGJ5IGFkZHJlc3MKICAqIC0gY2FsbGVyIG11c3QgaG9sZCBuZnNfY2xpZW50X2xvY2sKICAqLwotc3RhdGljIHN0cnVjdCBuZnNfY2xpZW50ICpfX25mc19maW5kX2NsaWVudChjb25zdCBzdHJ1Y3Qgc29ja2FkZHJfaW4gKmFkZHIsIGludCBuZnN2ZXJzaW9uKQorc3RhdGljIHN0cnVjdCBuZnNfY2xpZW50ICpfX25mc19maW5kX2NsaWVudChjb25zdCBzdHJ1Y3Qgc29ja2FkZHJfaW4gKmFkZHIsIGludCBuZnN2ZXJzaW9uLCBpbnQgbWF0Y2hfcG9ydCkKIHsKIAlzdHJ1Y3QgbmZzX2NsaWVudCAqY2xwOwogCiAJbGlzdF9mb3JfZWFjaF9lbnRyeShjbHAsICZuZnNfY2xpZW50X2xpc3QsIGNsX3NoYXJlX2xpbmspIHsKKwkJLyogRG9uJ3QgbWF0Y2ggY2xpZW50cyB0aGF0IGZhaWxlZCB0byBpbml0aWFsaXNlIHByb3Blcmx5ICovCisJCWlmIChjbHAtPmNsX2NvbnNfc3RhdGUgPCAwKQorCQkJY29udGludWU7CisKIAkJLyogRGlmZmVyZW50IE5GUyB2ZXJzaW9ucyBjYW5ub3Qgc2hhcmUgdGhlIHNhbWUgbmZzX2NsaWVudCAqLwogCQlpZiAoY2xwLT5jbF9uZnN2ZXJzaW9uICE9IG5mc3ZlcnNpb24pCiAJCQljb250aW51ZTsKQEAgLTI0NSw3ICsyNDksNyBAQAogCQkJICAgc2l6ZW9mKGNscC0+Y2xfYWRkci5zaW5fYWRkcikpICE9IDApCiAJCQljb250aW51ZTsKIAotCQlpZiAoY2xwLT5jbF9hZGRyLnNpbl9wb3J0ID09IGFkZHItPnNpbl9wb3J0KQorCQlpZiAoIW1hdGNoX3BvcnQgfHwgY2xwLT5jbF9hZGRyLnNpbl9wb3J0ID09IGFkZHItPnNpbl9wb3J0KQogCQkJZ290byBmb3VuZDsKIAl9CiAKQEAgLTI2NSwxMSArMjY5LDEyIEBACiAJc3RydWN0IG5mc19jbGllbnQgKmNscDsKIAogCXNwaW5fbG9jaygmbmZzX2NsaWVudF9sb2NrKTsKLQljbHAgPSBfX25mc19maW5kX2NsaWVudChhZGRyLCBuZnN2ZXJzaW9uKTsKKwljbHAgPSBfX25mc19maW5kX2NsaWVudChhZGRyLCBuZnN2ZXJzaW9uLCAwKTsKIAlzcGluX3VubG9jaygmbmZzX2NsaWVudF9sb2NrKTsKLQotCUJVR19PTihjbHAgJiYgY2xwLT5jbF9jb25zX3N0YXRlID09IDApOwotCisJaWYgKGNscCAhPSBOVUxMICYmIGNscC0+Y2xfY29uc19zdGF0ZSAhPSBORlNfQ1NfUkVBRFkpIHsKKwkJbmZzX3B1dF9jbGllbnQoY2xwKTsKKwkJY2xwID0gTlVMTDsKKwl9CiAJcmV0dXJuIGNscDsKIH0KIApAQCAtMjkyLDcgKzI5Nyw3IEBACiAJZG8gewogCQlzcGluX2xvY2soJm5mc19jbGllbnRfbG9jayk7CiAKLQkJY2xwID0gX19uZnNfZmluZF9jbGllbnQoYWRkciwgbmZzdmVyc2lvbik7CisJCWNscCA9IF9fbmZzX2ZpbmRfY2xpZW50KGFkZHIsIG5mc3ZlcnNpb24sIDEpOwogCQlpZiAoY2xwKQogCQkJZ290byBmb3VuZF9jbGllbnQ7CiAJCWlmIChuZXcpCkBAIC04NDksNiArODU0LDcgQEAKICAqLwogc3RhdGljIGludCBuZnM0X2luaXRfY2xpZW50KHN0cnVjdCBuZnNfY2xpZW50ICpjbHAsCiAJCWludCBwcm90bywgaW50IHRpbWVvLCBpbnQgcmV0cmFucywKKwkJY29uc3QgY2hhciAqaXBfYWRkciwKIAkJcnBjX2F1dGhmbGF2b3JfdCBhdXRoZmxhdm91cikKIHsKIAlpbnQgZXJyb3I7CkBAIC04NjUsNiArODcxLDcgQEAKIAllcnJvciA9IG5mc19jcmVhdGVfcnBjX2NsaWVudChjbHAsIHByb3RvLCB0aW1lbywgcmV0cmFucywgYXV0aGZsYXZvdXIpOwogCWlmIChlcnJvciA8IDApCiAJCWdvdG8gZXJyb3I7CisJbWVtY3B5KGNscC0+Y2xfaXBhZGRyLCBpcF9hZGRyLCBzaXplb2YoY2xwLT5jbF9pcGFkZHIpKTsKIAogCWVycm9yID0gbmZzX2lkbWFwX25ldyhjbHApOwogCWlmIChlcnJvciA8IDApIHsKQEAgLTg4OCw2ICs4OTUsNyBAQAogICovCiBzdGF0aWMgaW50IG5mczRfc2V0X2NsaWVudChzdHJ1Y3QgbmZzX3NlcnZlciAqc2VydmVyLAogCQljb25zdCBjaGFyICpob3N0bmFtZSwgY29uc3Qgc3RydWN0IHNvY2thZGRyX2luICphZGRyLAorCQljb25zdCBjaGFyICppcF9hZGRyLAogCQlycGNfYXV0aGZsYXZvcl90IGF1dGhmbGF2b3VyLAogCQlpbnQgcHJvdG8sIGludCB0aW1lbywgaW50IHJldHJhbnMpCiB7CkBAIC05MDIsNyArOTEwLDcgQEAKIAkJZXJyb3IgPSBQVFJfRVJSKGNscCk7CiAJCWdvdG8gZXJyb3I7CiAJfQotCWVycm9yID0gbmZzNF9pbml0X2NsaWVudChjbHAsIHByb3RvLCB0aW1lbywgcmV0cmFucywgYXV0aGZsYXZvdXIpOworCWVycm9yID0gbmZzNF9pbml0X2NsaWVudChjbHAsIHByb3RvLCB0aW1lbywgcmV0cmFucywgaXBfYWRkciwgYXV0aGZsYXZvdXIpOwogCWlmIChlcnJvciA8IDApCiAJCWdvdG8gZXJyb3JfcHV0OwogCkBAIC05NzEsNyArOTc5LDcgQEAKIAkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CiAKIAkvKiBHZXQgYSBjbGllbnQgcmVjb3JkICovCi0JZXJyb3IgPSBuZnM0X3NldF9jbGllbnQoc2VydmVyLCBob3N0bmFtZSwgYWRkciwgYXV0aGZsYXZvdXIsCisJZXJyb3IgPSBuZnM0X3NldF9jbGllbnQoc2VydmVyLCBob3N0bmFtZSwgYWRkciwgaXBfYWRkciwgYXV0aGZsYXZvdXIsCiAJCQlkYXRhLT5wcm90bywgZGF0YS0+dGltZW8sIGRhdGEtPnJldHJhbnMpOwogCWlmIChlcnJvciA8IDApCiAJCWdvdG8gZXJyb3I7CkBAIC0xMDQxLDYgKzEwNDksNyBAQAogCS8qIEdldCBhIGNsaWVudCByZXByZXNlbnRhdGlvbi4KIAkgKiBOb3RlOiBORlN2NCBhbHdheXMgdXNlcyBUQ1AsICovCiAJZXJyb3IgPSBuZnM0X3NldF9jbGllbnQoc2VydmVyLCBkYXRhLT5ob3N0bmFtZSwgZGF0YS0+YWRkciwKKwkJCXBhcmVudF9jbGllbnQtPmNsX2lwYWRkciwKIAkJCWRhdGEtPmF1dGhmbGF2b3IsCiAJCQlwYXJlbnRfc2VydmVyLT5jbGllbnQtPmNsX3hwcnQtPnByb3QsCiAJCQlwYXJlbnRfY2xpZW50LT5yZXRyYW5zX3RpbWVvLApkaWZmIC0tZ2l0IGEvZnMvbmZzL2Rpci5jIGIvZnMvbmZzL2Rpci5jCmluZGV4IDQ4MWY4ODkuLmIzNGNkMTYgMTAwNjQ0Ci0tLSBhL2ZzL25mcy9kaXIuYworKysgYi9mcy9uZnMvZGlyLmMKQEAgLTE0MiwxMiArMTQyLDEyIEBACiAJcmV0dXJuIHJlczsKIH0KIAotdHlwZWRlZiB1MzIgKiAoKmRlY29kZV9kaXJlbnRfdCkodTMyICosIHN0cnVjdCBuZnNfZW50cnkgKiwgaW50KTsKK3R5cGVkZWYgX19iZTMyICogKCpkZWNvZGVfZGlyZW50X3QpKF9fYmUzMiAqLCBzdHJ1Y3QgbmZzX2VudHJ5ICosIGludCk7CiB0eXBlZGVmIHN0cnVjdCB7CiAJc3RydWN0IGZpbGUJKmZpbGU7CiAJc3RydWN0IHBhZ2UJKnBhZ2U7CiAJdW5zaWduZWQgbG9uZwlwYWdlX2luZGV4OwotCXUzMgkJKnB0cjsKKwlfX2JlMzIJCSpwdHI7CiAJdTY0CQkqZGlyX2Nvb2tpZTsKIAlsb2ZmX3QJCWN1cnJlbnRfaW5kZXg7CiAJc3RydWN0IG5mc19lbnRyeSAqZW50cnk7CkBAIC0yMDMsOCArMjAzLDEwIEBACiAJICogTm90ZTogYXNzdW1lcyB3ZSBoYXZlIGV4Y2x1c2l2ZSBhY2Nlc3MgdG8gdGhpcyBtYXBwaW5nIGVpdGhlcgogCSAqCSB0aHJvdWdoIGlub2RlLT5pX211dGV4IG9yIHNvbWUgb3RoZXIgbWVjaGFuaXNtLgogCSAqLwotCWlmIChwYWdlLT5pbmRleCA9PSAwKQotCQlpbnZhbGlkYXRlX2lub2RlX3BhZ2VzMl9yYW5nZShpbm9kZS0+aV9tYXBwaW5nLCBQQUdFX0NBQ0hFX1NJWkUsIC0xKTsKKwlpZiAocGFnZS0+aW5kZXggPT0gMCAmJiBpbnZhbGlkYXRlX2lub2RlX3BhZ2VzMl9yYW5nZShpbm9kZS0+aV9tYXBwaW5nLCBQQUdFX0NBQ0hFX1NJWkUsIC0xKSA8IDApIHsKKwkJLyogU2hvdWxkIG5ldmVyIGhhcHBlbiAqLworCQluZnNfemFwX21hcHBpbmcoaW5vZGUsIGlub2RlLT5pX21hcHBpbmcpOworCX0KIAl1bmxvY2tfcGFnZShwYWdlKTsKIAlyZXR1cm4gMDsKICBlcnJvcjoKQEAgLTIxOCw3ICsyMjAsNyBAQAogc3RhdGljIGlubGluZQogaW50IGRpcl9kZWNvZGUobmZzX3JlYWRkaXJfZGVzY3JpcHRvcl90ICpkZXNjKQogewotCXUzMgkqcCA9IGRlc2MtPnB0cjsKKwlfX2JlMzIJKnAgPSBkZXNjLT5wdHI7CiAJcCA9IGRlc2MtPmRlY29kZShwLCBkZXNjLT5lbnRyeSwgZGVzYy0+cGx1cyk7CiAJaWYgKElTX0VSUihwKSkKIAkJcmV0dXJuIFBUUl9FUlIocCk7CkBAIC05MzMsOCArOTM1LDE3IEBACiAKIG5vX2VudHJ5OgogCXJlcyA9IGRfbWF0ZXJpYWxpc2VfdW5pcXVlKGRlbnRyeSwgaW5vZGUpOwotCWlmIChyZXMgIT0gTlVMTCkKKwlpZiAocmVzICE9IE5VTEwpIHsKKwkJc3RydWN0IGRlbnRyeSAqcGFyZW50OworCQlpZiAoSVNfRVJSKHJlcykpCisJCQlnb3RvIG91dF91bmxvY2s7CisJCS8qIFdhcyBhIGRpcmVjdG9yeSByZW5hbWVkISAqLworCQlwYXJlbnQgPSBkZ2V0X3BhcmVudChyZXMpOworCQlpZiAoIUlTX1JPT1QocGFyZW50KSkKKwkJCW5mc19tYXJrX2Zvcl9yZXZhbGlkYXRlKHBhcmVudC0+ZF9pbm9kZSk7CisJCWRwdXQocGFyZW50KTsKIAkJZGVudHJ5ID0gcmVzOworCX0KIAluZnNfcmVuZXdfdGltZXMoZGVudHJ5KTsKIAluZnNfc2V0X3ZlcmlmaWVyKGRlbnRyeSwgbmZzX3NhdmVfY2hhbmdlX2F0dHJpYnV0ZShkaXIpKTsKIG91dF91bmxvY2s6CkBAIC0xMTMwLDYgKzExNDEsOCBAQAogCWFsaWFzID0gZF9tYXRlcmlhbGlzZV91bmlxdWUoZGVudHJ5LCBpbm9kZSk7CiAJaWYgKGFsaWFzICE9IE5VTEwpIHsKIAkJZHB1dChkZW50cnkpOworCQlpZiAoSVNfRVJSKGFsaWFzKSkKKwkJCXJldHVybiBOVUxMOwogCQlkZW50cnkgPSBhbGlhczsKIAl9CiAKQEAgLTE1MTcsOCArMTUzMCw4IEBACiAJcGFnZXZlY19pbml0KCZscnVfcHZlYywgMCk7CiAJaWYgKCFhZGRfdG9fcGFnZV9jYWNoZShwYWdlLCBkZW50cnktPmRfaW5vZGUtPmlfbWFwcGluZywgMCwKIAkJCQkJCQlHRlBfS0VSTkVMKSkgewotCQlpZiAoIXBhZ2V2ZWNfYWRkKCZscnVfcHZlYywgcGFnZSkpCi0JCQlfX3BhZ2V2ZWNfbHJ1X2FkZCgmbHJ1X3B2ZWMpOworCQlwYWdldmVjX2FkZCgmbHJ1X3B2ZWMsIHBhZ2UpOworCQlwYWdldmVjX2xydV9hZGQoJmxydV9wdmVjKTsKIAkJU2V0UGFnZVVwdG9kYXRlKHBhZ2UpOwogCQl1bmxvY2tfcGFnZShwYWdlKTsKIAl9IGVsc2UKZGlmZiAtLWdpdCBhL2ZzL25mcy9kaXJlY3QuYyBiL2ZzL25mcy9kaXJlY3QuYwppbmRleCA5ZjdmOGI5Li5iZGZhYmY4IDEwMDY0NAotLS0gYS9mcy9uZnMvZGlyZWN0LmMKKysrIGIvZnMvbmZzL2RpcmVjdC5jCkBAIC00OTcsNiArNDk3LDcgQEAKIAkJCWlmIChkcmVxLT5jb21taXRfZGF0YSAhPSBOVUxMKQogCQkJCW5mc19jb21taXRfZnJlZShkcmVxLT5jb21taXRfZGF0YSk7CiAJCQluZnNfZGlyZWN0X2ZyZWVfd3JpdGVkYXRhKGRyZXEpOworCQkJbmZzX3phcF9tYXBwaW5nKGlub2RlLCBpbm9kZS0+aV9tYXBwaW5nKTsKIAkJCW5mc19kaXJlY3RfY29tcGxldGUoZHJlcSk7CiAJfQogfQpAQCAtNTE3LDYgKzUxOCw3IEBACiB7CiAJbmZzX2VuZF9kYXRhX3VwZGF0ZShpbm9kZSk7CiAJbmZzX2RpcmVjdF9mcmVlX3dyaXRlZGF0YShkcmVxKTsKKwluZnNfemFwX21hcHBpbmcoaW5vZGUsIGlub2RlLT5pX21hcHBpbmcpOwogCW5mc19kaXJlY3RfY29tcGxldGUoZHJlcSk7CiB9CiAjZW5kaWYKQEAgLTUzMiwxMCArNTM0LDEyIEBACiAKIAlzcGluX2xvY2soJmRyZXEtPmxvY2spOwogCi0JaWYgKGxpa2VseShzdGF0dXMgPj0gMCkpCi0JCWRyZXEtPmNvdW50ICs9IGRhdGEtPnJlcy5jb3VudDsKLQllbHNlCi0JCWRyZXEtPmVycm9yID0gdGFzay0+dGtfc3RhdHVzOworCWlmICh1bmxpa2VseShzdGF0dXMgPCAwKSkgeworCQlkcmVxLT5lcnJvciA9IHN0YXR1czsKKwkJZ290byBvdXRfdW5sb2NrOworCX0KKworCWRyZXEtPmNvdW50ICs9IGRhdGEtPnJlcy5jb3VudDsKIAogCWlmIChkYXRhLT5yZXMudmVyZi0+Y29tbWl0dGVkICE9IE5GU19GSUxFX1NZTkMpIHsKIAkJc3dpdGNoIChkcmVxLT5mbGFncykgewpAQCAtNTUwLDcgKzU1NCw3IEBACiAJCQkJfQogCQl9CiAJfQotCitvdXRfdW5sb2NrOgogCXNwaW5fdW5sb2NrKCZkcmVxLT5sb2NrKTsKIH0KIApAQCAtODI4LDE3ICs4MzIsNiBAQAogCiAJcmV0dmFsID0gbmZzX2RpcmVjdF93cml0ZShpb2NiLCAodW5zaWduZWQgbG9uZykgYnVmLCBjb3VudCwgcG9zKTsKIAotCS8qCi0JICogWFhYOiBuZnNfZW5kX2RhdGFfdXBkYXRlKCkgYWxyZWFkeSBlbnN1cmVzIHRoaXMgZmlsZSdzCi0JICogICAgICBjYWNoZWQgZGF0YSBpcyBzdWJzZXF1ZW50bHkgaW52YWxpZGF0ZWQuICBEbyB3ZSByZWFsbHkKLQkgKiAgICAgIG5lZWQgdG8gY2FsbCBpbnZhbGlkYXRlX2lub2RlX3BhZ2VzMigpIGFnYWluIGhlcmU/Ci0JICoKLQkgKiAgICAgIEZvciBhaW8gd3JpdGVzLCB0aGlzIGludmFsaWRhdGlvbiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkKLQkgKiAgICAgIG9jY3VyIGJlZm9yZSB0aGUgd3JpdGVzIGNvbXBsZXRlLiAgS2luZCBvZiByYWNleS4KLQkgKi8KLQlpZiAobWFwcGluZy0+bnJwYWdlcykKLQkJaW52YWxpZGF0ZV9pbm9kZV9wYWdlczIobWFwcGluZyk7Ci0KIAlpZiAocmV0dmFsID4gMCkKIAkJaW9jYi0+a2lfcG9zID0gcG9zICsgcmV0dmFsOwogCmRpZmYgLS1naXQgYS9mcy9uZnMvaW5vZGUuYyBiL2ZzL25mcy9pbm9kZS5jCmluZGV4IGJjOTM3NmMuLjA4Y2M0YzUgMTAwNjQ0Ci0tLSBhL2ZzL25mcy9pbm9kZS5jCisrKyBiL2ZzL25mcy9pbm9kZS5jCkBAIC0xMzEsNiArMTMxLDE1IEBACiAJc3Bpbl91bmxvY2soJmlub2RlLT5pX2xvY2spOwogfQogCit2b2lkIG5mc196YXBfbWFwcGluZyhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZykKK3sKKwlpZiAobWFwcGluZy0+bnJwYWdlcyAhPSAwKSB7CisJCXNwaW5fbG9jaygmaW5vZGUtPmlfbG9jayk7CisJCU5GU19JKGlub2RlKS0+Y2FjaGVfdmFsaWRpdHkgfD0gTkZTX0lOT19JTlZBTElEX0RBVEE7CisJCXNwaW5fdW5sb2NrKCZpbm9kZS0+aV9sb2NrKTsKKwl9Cit9CisKIHN0YXRpYyB2b2lkIG5mc196YXBfYWNsX2NhY2hlKHN0cnVjdCBpbm9kZSAqaW5vZGUpCiB7CiAJdm9pZCAoKmNsZWFyX2FjbF9jYWNoZSkoc3RydWN0IGlub2RlICopOwpAQCAtNTc0LDcgKzU4Myw3IEBACiAKIAluZnNfaW5jX3N0YXRzKGlub2RlLCBORlNJT1NfSU5PREVSRVZBTElEQVRFKTsKIAlsb2NrX2tlcm5lbCgpOwotCWlmICghaW5vZGUgfHwgaXNfYmFkX2lub2RlKGlub2RlKSkKKwlpZiAoaXNfYmFkX2lub2RlKGlub2RlKSkKICAJCWdvdG8gb3V0X25vd2FpdDsKIAlpZiAoTkZTX1NUQUxFKGlub2RlKSkKICAJCWdvdG8gb3V0X25vd2FpdDsKQEAgLTY3MSwxMyArNjgwLDIwIEBACiAJaWYgKChuZnNpLT5jYWNoZV92YWxpZGl0eSAmIE5GU19JTk9fUkVWQUxfUEFHRUNBQ0hFKQogCQkJfHwgbmZzX2F0dHJpYnV0ZV90aW1lb3V0KGlub2RlKSkKIAkJcmV0ID0gX19uZnNfcmV2YWxpZGF0ZV9pbm9kZShORlNfU0VSVkVSKGlub2RlKSwgaW5vZGUpOworCWlmIChyZXQgPCAwKQorCQlnb3RvIG91dDsKIAogCWlmIChuZnNpLT5jYWNoZV92YWxpZGl0eSAmIE5GU19JTk9fSU5WQUxJRF9EQVRBKSB7Ci0JCW5mc19pbmNfc3RhdHMoaW5vZGUsIE5GU0lPU19EQVRBSU5WQUxJREFURSk7Ci0JCWlmIChTX0lTUkVHKGlub2RlLT5pX21vZGUpKQotCQkJbmZzX3N5bmNfbWFwcGluZyhtYXBwaW5nKTsKLQkJaW52YWxpZGF0ZV9pbm9kZV9wYWdlczIobWFwcGluZyk7Ci0KKwkJaWYgKG1hcHBpbmctPm5ycGFnZXMgIT0gMCkgeworCQkJaWYgKFNfSVNSRUcoaW5vZGUtPmlfbW9kZSkpIHsKKwkJCQlyZXQgPSBuZnNfc3luY19tYXBwaW5nKG1hcHBpbmcpOworCQkJCWlmIChyZXQgPCAwKQorCQkJCQlnb3RvIG91dDsKKwkJCX0KKwkJCXJldCA9IGludmFsaWRhdGVfaW5vZGVfcGFnZXMyKG1hcHBpbmcpOworCQkJaWYgKHJldCA8IDApCisJCQkJZ290byBvdXQ7CisJCX0KIAkJc3Bpbl9sb2NrKCZpbm9kZS0+aV9sb2NrKTsKIAkJbmZzaS0+Y2FjaGVfdmFsaWRpdHkgJj0gfk5GU19JTk9fSU5WQUxJRF9EQVRBOwogCQlpZiAoU19JU0RJUihpbm9kZS0+aV9tb2RlKSkgewpAQCAtNjg3LDEwICs3MDMsMTIgQEAKIAkJfQogCQlzcGluX3VubG9jaygmaW5vZGUtPmlfbG9jayk7CiAKKwkJbmZzX2luY19zdGF0cyhpbm9kZSwgTkZTSU9TX0RBVEFJTlZBTElEQVRFKTsKIAkJZGZwcmludGsoUEFHRUNBQ0hFLCAiTkZTOiAoJXMvJUxkKSBkYXRhIGNhY2hlIGludmFsaWRhdGVkXG4iLAogCQkJCWlub2RlLT5pX3NiLT5zX2lkLAogCQkJCShsb25nIGxvbmcpTkZTX0ZJTEVJRChpbm9kZSkpOwogCX0KK291dDoKIAlyZXR1cm4gcmV0OwogfQogCmRpZmYgLS1naXQgYS9mcy9uZnMvaW50ZXJuYWwuaCBiL2ZzL25mcy9pbnRlcm5hbC5oCmluZGV4IGJlYTBiMDEuLmQyMDU0NjYgMTAwNjQ0Ci0tLSBhL2ZzL25mcy9pbnRlcm5hbC5oCisrKyBiL2ZzL25mcy9pbnRlcm5hbC5oCkBAIC05MywxNSArOTMsMTUgQEAKIC8qIG5mczJ4ZHIuYyAqLwogZXh0ZXJuIGludCBuZnNfc3RhdF90b19lcnJubyhpbnQpOwogZXh0ZXJuIHN0cnVjdCBycGNfcHJvY2luZm8gbmZzX3Byb2NlZHVyZXNbXTsKLWV4dGVybiB1MzIgKiBuZnNfZGVjb2RlX2RpcmVudCh1MzIgKiwgc3RydWN0IG5mc19lbnRyeSAqLCBpbnQpOworZXh0ZXJuIF9fYmUzMiAqIG5mc19kZWNvZGVfZGlyZW50KF9fYmUzMiAqLCBzdHJ1Y3QgbmZzX2VudHJ5ICosIGludCk7CiAKIC8qIG5mczN4ZHIuYyAqLwogZXh0ZXJuIHN0cnVjdCBycGNfcHJvY2luZm8gbmZzM19wcm9jZWR1cmVzW107Ci1leHRlcm4gdTMyICpuZnMzX2RlY29kZV9kaXJlbnQodTMyICosIHN0cnVjdCBuZnNfZW50cnkgKiwgaW50KTsKK2V4dGVybiBfX2JlMzIgKm5mczNfZGVjb2RlX2RpcmVudChfX2JlMzIgKiwgc3RydWN0IG5mc19lbnRyeSAqLCBpbnQpOwogCiAvKiBuZnM0eGRyLmMgKi8KICNpZmRlZiBDT05GSUdfTkZTX1Y0Ci1leHRlcm4gdTMyICpuZnM0X2RlY29kZV9kaXJlbnQodTMyICpwLCBzdHJ1Y3QgbmZzX2VudHJ5ICplbnRyeSwgaW50IHBsdXMpOworZXh0ZXJuIF9fYmUzMiAqbmZzNF9kZWNvZGVfZGlyZW50KF9fYmUzMiAqcCwgc3RydWN0IG5mc19lbnRyeSAqZW50cnksIGludCBwbHVzKTsKICNlbmRpZgogCiAvKiBuZnM0cHJvYy5jICovCmRpZmYgLS1naXQgYS9mcy9uZnMvbW91bnRfY2xudC5jIGIvZnMvbmZzL21vdW50X2NsbnQuYwppbmRleCBkNTA3YjAyLi5mNzVmZTcyIDEwMDY0NAotLS0gYS9mcy9uZnMvbW91bnRfY2xudC5jCisrKyBiL2ZzL25mcy9tb3VudF9jbG50LmMKQEAgLTk1LDcgKzk1LDcgQEAKICAqIFhEUiBlbmNvZGUvZGVjb2RlIGZ1bmN0aW9ucyBmb3IgTU9VTlQKICAqLwogc3RhdGljIGludAoteGRyX2VuY29kZV9kaXJwYXRoKHN0cnVjdCBycGNfcnFzdCAqcmVxLCB1MzIgKnAsIGNvbnN0IGNoYXIgKnBhdGgpCit4ZHJfZW5jb2RlX2RpcnBhdGgoc3RydWN0IHJwY19ycXN0ICpyZXEsIF9fYmUzMiAqcCwgY29uc3QgY2hhciAqcGF0aCkKIHsKIAlwID0geGRyX2VuY29kZV9zdHJpbmcocCwgcGF0aCk7CiAKQEAgLTEwNCw3ICsxMDQsNyBAQAogfQogCiBzdGF0aWMgaW50Ci14ZHJfZGVjb2RlX2Zoc3RhdHVzKHN0cnVjdCBycGNfcnFzdCAqcmVxLCB1MzIgKnAsIHN0cnVjdCBtbnRfZmhzdGF0dXMgKnJlcykKK3hkcl9kZWNvZGVfZmhzdGF0dXMoc3RydWN0IHJwY19ycXN0ICpyZXEsIF9fYmUzMiAqcCwgc3RydWN0IG1udF9maHN0YXR1cyAqcmVzKQogewogCXN0cnVjdCBuZnNfZmggKmZoID0gcmVzLT5maDsKIApAQCAtMTE2LDcgKzExNiw3IEBACiB9CiAKIHN0YXRpYyBpbnQKLXhkcl9kZWNvZGVfZmhzdGF0dXMzKHN0cnVjdCBycGNfcnFzdCAqcmVxLCB1MzIgKnAsIHN0cnVjdCBtbnRfZmhzdGF0dXMgKnJlcykKK3hkcl9kZWNvZGVfZmhzdGF0dXMzKHN0cnVjdCBycGNfcnFzdCAqcmVxLCBfX2JlMzIgKnAsIHN0cnVjdCBtbnRfZmhzdGF0dXMgKnJlcykKIHsKIAlzdHJ1Y3QgbmZzX2ZoICpmaCA9IHJlcy0+Zmg7CiAKZGlmZiAtLWdpdCBhL2ZzL25mcy9uZnMyeGRyLmMgYi9mcy9uZnMvbmZzMnhkci5jCmluZGV4IGI0OTUwMWYuLjNiZTRlNzIgMTAwNjQ0Ci0tLSBhL2ZzL25mcy9uZnMyeGRyLmMKKysrIGIvZnMvbmZzL25mczJ4ZHIuYwpAQCAtNjYsMTUgKzY2LDE1IEBACiAvKgogICogQ29tbW9uIE5GUyBYRFIgZnVuY3Rpb25zIGFzIGlubGluZXMKICAqLwotc3RhdGljIGlubGluZSB1MzIgKgoteGRyX2VuY29kZV9maGFuZGxlKHUzMiAqcCwgc3RydWN0IG5mc19maCAqZmhhbmRsZSkKK3N0YXRpYyBpbmxpbmUgX19iZTMyICoKK3hkcl9lbmNvZGVfZmhhbmRsZShfX2JlMzIgKnAsIHN0cnVjdCBuZnNfZmggKmZoYW5kbGUpCiB7CiAJbWVtY3B5KHAsIGZoYW5kbGUtPmRhdGEsIE5GUzJfRkhTSVpFKTsKIAlyZXR1cm4gcCArIFhEUl9RVUFETEVOKE5GUzJfRkhTSVpFKTsKIH0KIAotc3RhdGljIGlubGluZSB1MzIgKgoteGRyX2RlY29kZV9maGFuZGxlKHUzMiAqcCwgc3RydWN0IG5mc19maCAqZmhhbmRsZSkKK3N0YXRpYyBpbmxpbmUgX19iZTMyICoKK3hkcl9kZWNvZGVfZmhhbmRsZShfX2JlMzIgKnAsIHN0cnVjdCBuZnNfZmggKmZoYW5kbGUpCiB7CiAJLyogTkZTdjIgaGFuZGxlcyBoYXZlIGEgZml4ZWQgbGVuZ3RoICovCiAJZmhhbmRsZS0+c2l6ZSA9IE5GUzJfRkhTSVpFOwpAQCAtODIsOCArODIsOCBAQAogCXJldHVybiBwICsgWERSX1FVQURMRU4oTkZTMl9GSFNJWkUpOwogfQogCi1zdGF0aWMgaW5saW5lIHUzMioKLXhkcl9lbmNvZGVfdGltZSh1MzIgKnAsIHN0cnVjdCB0aW1lc3BlYyAqdGltZXApCitzdGF0aWMgaW5saW5lIF9fYmUzMioKK3hkcl9lbmNvZGVfdGltZShfX2JlMzIgKnAsIHN0cnVjdCB0aW1lc3BlYyAqdGltZXApCiB7CiAJKnArKyA9IGh0b25sKHRpbWVwLT50dl9zZWMpOwogCS8qIENvbnZlcnQgbmFub3NlY29uZHMgaW50byBtaWNyb3NlY29uZHMgKi8KQEAgLTkxLDggKzkxLDggQEAKIAlyZXR1cm4gcDsKIH0KIAotc3RhdGljIGlubGluZSB1MzIqCi14ZHJfZW5jb2RlX2N1cnJlbnRfc2VydmVyX3RpbWUodTMyICpwLCBzdHJ1Y3QgdGltZXNwZWMgKnRpbWVwKQorc3RhdGljIGlubGluZSBfX2JlMzIqCit4ZHJfZW5jb2RlX2N1cnJlbnRfc2VydmVyX3RpbWUoX19iZTMyICpwLCBzdHJ1Y3QgdGltZXNwZWMgKnRpbWVwKQogewogCS8qCiAJICogUGFzc2luZyB0aGUgaW52YWxpZCB2YWx1ZSB1c2Vjb25kcz0xMDAwMDAwIGlzIGEKQEAgLTEwOCw4ICsxMDgsOCBAQAogCXJldHVybiBwOwogfQogCi1zdGF0aWMgaW5saW5lIHUzMioKLXhkcl9kZWNvZGVfdGltZSh1MzIgKnAsIHN0cnVjdCB0aW1lc3BlYyAqdGltZXApCitzdGF0aWMgaW5saW5lIF9fYmUzMioKK3hkcl9kZWNvZGVfdGltZShfX2JlMzIgKnAsIHN0cnVjdCB0aW1lc3BlYyAqdGltZXApCiB7CiAJdGltZXAtPnR2X3NlYyA9IG50b2hsKCpwKyspOwogCS8qIENvbnZlcnQgbWljcm9zZWNvbmRzIGludG8gbmFub3NlY29uZHMgKi8KQEAgLTExNyw4ICsxMTcsOCBAQAogCXJldHVybiBwOwogfQogCi1zdGF0aWMgdTMyICoKLXhkcl9kZWNvZGVfZmF0dHIodTMyICpwLCBzdHJ1Y3QgbmZzX2ZhdHRyICpmYXR0cikKK3N0YXRpYyBfX2JlMzIgKgoreGRyX2RlY29kZV9mYXR0cihfX2JlMzIgKnAsIHN0cnVjdCBuZnNfZmF0dHIgKmZhdHRyKQogewogCXUzMiByZGV2OwogCWZhdHRyLT50eXBlID0gKGVudW0gbmZzX2Z0eXBlKSBudG9obCgqcCsrKTsKQEAgLTE0NiwxMCArMTQ2LDEwIEBACiAJcmV0dXJuIHA7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdTMyICoKLXhkcl9lbmNvZGVfc2F0dHIodTMyICpwLCBzdHJ1Y3QgaWF0dHIgKmF0dHIpCitzdGF0aWMgaW5saW5lIF9fYmUzMiAqCit4ZHJfZW5jb2RlX3NhdHRyKF9fYmUzMiAqcCwgc3RydWN0IGlhdHRyICphdHRyKQogewotCWNvbnN0IHUzMiBub3Rfc2V0ID0gX19jb25zdGFudF9odG9ubCgweEZGRkZGRkZGKTsKKwljb25zdCBfX2JlMzIgbm90X3NldCA9IF9fY29uc3RhbnRfaHRvbmwoMHhGRkZGRkZGRik7CiAKIAkqcCsrID0gKGF0dHItPmlhX3ZhbGlkICYgQVRUUl9NT0RFKSA/IGh0b25sKGF0dHItPmlhX21vZGUpIDogbm90X3NldDsKIAkqcCsrID0gKGF0dHItPmlhX3ZhbGlkICYgQVRUUl9VSUQpID8gaHRvbmwoYXR0ci0+aWFfdWlkKSA6IG5vdF9zZXQ7CkBAIC0xODQsNyArMTg0LDcgQEAKICAqIEdFVEFUVFIsIFJFQURMSU5LLCBTVEFURlMKICAqLwogc3RhdGljIGludAotbmZzX3hkcl9maGFuZGxlKHN0cnVjdCBycGNfcnFzdCAqcmVxLCB1MzIgKnAsIHN0cnVjdCBuZnNfZmggKmZoKQorbmZzX3hkcl9maGFuZGxlKHN0cnVjdCBycGNfcnFzdCAqcmVxLCBfX2JlMzIgKnAsIHN0cnVjdCBuZnNfZmggKmZoKQogewogCXAgPSB4ZHJfZW5jb2RlX2ZoYW5kbGUocCwgZmgpOwogCXJlcS0+cnFfc2xlbiA9IHhkcl9hZGp1c3RfaW92ZWMocmVxLT5ycV9zdmVjLCBwKTsKQEAgLTE5NSw3ICsxOTUsNyBAQAogICogRW5jb2RlIFNFVEFUVFIgYXJndW1lbnRzCiAgKi8KIHN0YXRpYyBpbnQKLW5mc194ZHJfc2F0dHJhcmdzKHN0cnVjdCBycGNfcnFzdCAqcmVxLCB1MzIgKnAsIHN0cnVjdCBuZnNfc2F0dHJhcmdzICphcmdzKQorbmZzX3hkcl9zYXR0cmFyZ3Moc3RydWN0IHJwY19ycXN0ICpyZXEsIF9fYmUzMiAqcCwgc3RydWN0IG5mc19zYXR0cmFyZ3MgKmFyZ3MpCiB7CiAJcCA9IHhkcl9lbmNvZGVfZmhhbmRsZShwLCBhcmdzLT5maCk7CiAJcCA9IHhkcl9lbmNvZGVfc2F0dHIocCwgYXJncy0+c2F0dHIpOwpAQCAtMjA4LDcgKzIwOCw3IEBACiAgKiBMT09LVVAsIFJFTU9WRSwgUk1ESVIKICAqLwogc3RhdGljIGludAotbmZzX3hkcl9kaXJvcGFyZ3Moc3RydWN0IHJwY19ycXN0ICpyZXEsIHUzMiAqcCwgc3RydWN0IG5mc19kaXJvcGFyZ3MgKmFyZ3MpCituZnNfeGRyX2Rpcm9wYXJncyhzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwgX19iZTMyICpwLCBzdHJ1Y3QgbmZzX2Rpcm9wYXJncyAqYXJncykKIHsKIAlwID0geGRyX2VuY29kZV9maGFuZGxlKHAsIGFyZ3MtPmZoKTsKIAlwID0geGRyX2VuY29kZV9hcnJheShwLCBhcmdzLT5uYW1lLCBhcmdzLT5sZW4pOwpAQCAtMjIyLDcgKzIyMiw3IEBACiAgKiBleGFjdGx5IHRvIHRoZSBwYWdlIHdlIHdhbnQgdG8gZmV0Y2guCiAgKi8KIHN0YXRpYyBpbnQKLW5mc194ZHJfcmVhZGFyZ3Moc3RydWN0IHJwY19ycXN0ICpyZXEsIHUzMiAqcCwgc3RydWN0IG5mc19yZWFkYXJncyAqYXJncykKK25mc194ZHJfcmVhZGFyZ3Moc3RydWN0IHJwY19ycXN0ICpyZXEsIF9fYmUzMiAqcCwgc3RydWN0IG5mc19yZWFkYXJncyAqYXJncykKIHsKIAlzdHJ1Y3QgcnBjX2F1dGgJKmF1dGggPSByZXEtPnJxX3Rhc2stPnRrX2F1dGg7CiAJdW5zaWduZWQgaW50IHJlcGxlbjsKQEAgLTI0Niw3ICsyNDYsNyBAQAogICogRGVjb2RlIFJFQUQgcmVwbHkKICAqLwogc3RhdGljIGludAotbmZzX3hkcl9yZWFkcmVzKHN0cnVjdCBycGNfcnFzdCAqcmVxLCB1MzIgKnAsIHN0cnVjdCBuZnNfcmVhZHJlcyAqcmVzKQorbmZzX3hkcl9yZWFkcmVzKHN0cnVjdCBycGNfcnFzdCAqcmVxLCBfX2JlMzIgKnAsIHN0cnVjdCBuZnNfcmVhZHJlcyAqcmVzKQogewogCXN0cnVjdCBrdmVjICppb3YgPSByZXEtPnJxX3Jjdl9idWYuaGVhZDsKIAlpbnQJc3RhdHVzLCBjb3VudCwgcmVjdmQsIGhkcmxlbjsKQEAgLTI4Niw3ICsyODYsNyBAQAogICogV3JpdGUgYXJndW1lbnRzLiBTcGxpY2UgdGhlIGJ1ZmZlciB0byBiZSB3cml0dGVuIGludG8gdGhlIGlvdmVjLgogICovCiBzdGF0aWMgaW50Ci1uZnNfeGRyX3dyaXRlYXJncyhzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwgdTMyICpwLCBzdHJ1Y3QgbmZzX3dyaXRlYXJncyAqYXJncykKK25mc194ZHJfd3JpdGVhcmdzKHN0cnVjdCBycGNfcnFzdCAqcmVxLCBfX2JlMzIgKnAsIHN0cnVjdCBuZnNfd3JpdGVhcmdzICphcmdzKQogewogCXN0cnVjdCB4ZHJfYnVmICpzbmRidWYgPSAmcmVxLT5ycV9zbmRfYnVmOwogCXUzMiBvZmZzZXQgPSAodTMyKWFyZ3MtPm9mZnNldDsKQEAgLTMwOSw3ICszMDksNyBAQAogICogQ1JFQVRFLCBNS0RJUgogICovCiBzdGF0aWMgaW50Ci1uZnNfeGRyX2NyZWF0ZWFyZ3Moc3RydWN0IHJwY19ycXN0ICpyZXEsIHUzMiAqcCwgc3RydWN0IG5mc19jcmVhdGVhcmdzICphcmdzKQorbmZzX3hkcl9jcmVhdGVhcmdzKHN0cnVjdCBycGNfcnFzdCAqcmVxLCBfX2JlMzIgKnAsIHN0cnVjdCBuZnNfY3JlYXRlYXJncyAqYXJncykKIHsKIAlwID0geGRyX2VuY29kZV9maGFuZGxlKHAsIGFyZ3MtPmZoKTsKIAlwID0geGRyX2VuY29kZV9hcnJheShwLCBhcmdzLT5uYW1lLCBhcmdzLT5sZW4pOwpAQCAtMzIyLDcgKzMyMiw3IEBACiAgKiBFbmNvZGUgUkVOQU1FIGFyZ3VtZW50cwogICovCiBzdGF0aWMgaW50Ci1uZnNfeGRyX3JlbmFtZWFyZ3Moc3RydWN0IHJwY19ycXN0ICpyZXEsIHUzMiAqcCwgc3RydWN0IG5mc19yZW5hbWVhcmdzICphcmdzKQorbmZzX3hkcl9yZW5hbWVhcmdzKHN0cnVjdCBycGNfcnFzdCAqcmVxLCBfX2JlMzIgKnAsIHN0cnVjdCBuZnNfcmVuYW1lYXJncyAqYXJncykKIHsKIAlwID0geGRyX2VuY29kZV9maGFuZGxlKHAsIGFyZ3MtPmZyb21maCk7CiAJcCA9IHhkcl9lbmNvZGVfYXJyYXkocCwgYXJncy0+ZnJvbW5hbWUsIGFyZ3MtPmZyb21sZW4pOwpAQCAtMzM2LDcgKzMzNiw3IEBACiAgKiBFbmNvZGUgTElOSyBhcmd1bWVudHMKICAqLwogc3RhdGljIGludAotbmZzX3hkcl9saW5rYXJncyhzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwgdTMyICpwLCBzdHJ1Y3QgbmZzX2xpbmthcmdzICphcmdzKQorbmZzX3hkcl9saW5rYXJncyhzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwgX19iZTMyICpwLCBzdHJ1Y3QgbmZzX2xpbmthcmdzICphcmdzKQogewogCXAgPSB4ZHJfZW5jb2RlX2ZoYW5kbGUocCwgYXJncy0+ZnJvbWZoKTsKIAlwID0geGRyX2VuY29kZV9maGFuZGxlKHAsIGFyZ3MtPnRvZmgpOwpAQCAtMzQ5LDcgKzM0OSw3IEBACiAgKiBFbmNvZGUgU1lNTElOSyBhcmd1bWVudHMKICAqLwogc3RhdGljIGludAotbmZzX3hkcl9zeW1saW5rYXJncyhzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwgdTMyICpwLCBzdHJ1Y3QgbmZzX3N5bWxpbmthcmdzICphcmdzKQorbmZzX3hkcl9zeW1saW5rYXJncyhzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwgX19iZTMyICpwLCBzdHJ1Y3QgbmZzX3N5bWxpbmthcmdzICphcmdzKQogewogCXN0cnVjdCB4ZHJfYnVmICpzbmRidWYgPSAmcmVxLT5ycV9zbmRfYnVmOwogCXNpemVfdCBwYWQ7CkBAIC0zNzgsNyArMzc4LDcgQEAKICAqIEVuY29kZSBhcmd1bWVudHMgdG8gcmVhZGRpciBjYWxsCiAgKi8KIHN0YXRpYyBpbnQKLW5mc194ZHJfcmVhZGRpcmFyZ3Moc3RydWN0IHJwY19ycXN0ICpyZXEsIHUzMiAqcCwgc3RydWN0IG5mc19yZWFkZGlyYXJncyAqYXJncykKK25mc194ZHJfcmVhZGRpcmFyZ3Moc3RydWN0IHJwY19ycXN0ICpyZXEsIF9fYmUzMiAqcCwgc3RydWN0IG5mc19yZWFkZGlyYXJncyAqYXJncykKIHsKIAlzdHJ1Y3QgcnBjX3Rhc2sJKnRhc2sgPSByZXEtPnJxX3Rhc2s7CiAJc3RydWN0IHJwY19hdXRoCSphdXRoID0gdGFzay0+dGtfYXV0aDsKQEAgLTQwNCw3ICs0MDQsNyBAQAogICogZnJvbSBuZnNfcmVhZGRpciBmb3IgZWFjaCBlbnRyeS4KICAqLwogc3RhdGljIGludAotbmZzX3hkcl9yZWFkZGlycmVzKHN0cnVjdCBycGNfcnFzdCAqcmVxLCB1MzIgKnAsIHZvaWQgKmR1bW15KQorbmZzX3hkcl9yZWFkZGlycmVzKHN0cnVjdCBycGNfcnFzdCAqcmVxLCBfX2JlMzIgKnAsIHZvaWQgKmR1bW15KQogewogCXN0cnVjdCB4ZHJfYnVmICpyY3ZidWYgPSAmcmVxLT5ycV9yY3ZfYnVmOwogCXN0cnVjdCBrdmVjICppb3YgPSByY3ZidWYtPmhlYWQ7CkBAIC00MTIsNyArNDEyLDcgQEAKIAlpbnQgaGRybGVuLCByZWN2ZDsKIAlpbnQgc3RhdHVzLCBucjsKIAl1bnNpZ25lZCBpbnQgbGVuLCBwZ2xlbjsKLQl1MzIgKmVuZCwgKmVudHJ5LCAqa2FkZHI7CisJX19iZTMyICplbmQsICplbnRyeSwgKmthZGRyOwogCiAJaWYgKChzdGF0dXMgPSBudG9obCgqcCsrKSkpCiAJCXJldHVybiAtbmZzX3N0YXRfdG9fZXJybm8oc3RhdHVzKTsKQEAgLTQzMiw4ICs0MzIsOCBAQAogCWlmIChwZ2xlbiA+IHJlY3ZkKQogCQlwZ2xlbiA9IHJlY3ZkOwogCXBhZ2UgPSByY3ZidWYtPnBhZ2VzOwotCWthZGRyID0gcCA9ICh1MzIgKilrbWFwX2F0b21pYygqcGFnZSwgS01fVVNFUjApOwotCWVuZCA9ICh1MzIgKikoKGNoYXIgKilwICsgcGdsZW4pOworCWthZGRyID0gcCA9IGttYXBfYXRvbWljKCpwYWdlLCBLTV9VU0VSMCk7CisJZW5kID0gKF9fYmUzMiAqKSgoY2hhciAqKXAgKyBwZ2xlbik7CiAJZW50cnkgPSBwOwogCWZvciAobnIgPSAwOyAqcCsrOyBucisrKSB7CiAJCWlmIChwICsgMiA+IGVuZCkKQEAgLTQ2OCw4ICs0NjgsOCBAQAogCWdvdG8gb3V0OwogfQogCi11MzIgKgotbmZzX2RlY29kZV9kaXJlbnQodTMyICpwLCBzdHJ1Y3QgbmZzX2VudHJ5ICplbnRyeSwgaW50IHBsdXMpCitfX2JlMzIgKgorbmZzX2RlY29kZV9kaXJlbnQoX19iZTMyICpwLCBzdHJ1Y3QgbmZzX2VudHJ5ICplbnRyeSwgaW50IHBsdXMpCiB7CiAJaWYgKCEqcCsrKSB7CiAJCWlmICghKnApCkBAIC00OTYsNyArNDk2LDcgQEAKICAqIERlY29kZSBzaW1wbGUgc3RhdHVzIHJlcGx5CiAgKi8KIHN0YXRpYyBpbnQKLW5mc194ZHJfc3RhdChzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwgdTMyICpwLCB2b2lkICpkdW1teSkKK25mc194ZHJfc3RhdChzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwgX19iZTMyICpwLCB2b2lkICpkdW1teSkKIHsKIAlpbnQJc3RhdHVzOwogCkBAIC01MTAsNyArNTEwLDcgQEAKICAqIEdFVEFUVFIsIFNFVEFUVFIsIFdSSVRFCiAgKi8KIHN0YXRpYyBpbnQKLW5mc194ZHJfYXR0cnN0YXQoc3RydWN0IHJwY19ycXN0ICpyZXEsIHUzMiAqcCwgc3RydWN0IG5mc19mYXR0ciAqZmF0dHIpCituZnNfeGRyX2F0dHJzdGF0KHN0cnVjdCBycGNfcnFzdCAqcmVxLCBfX2JlMzIgKnAsIHN0cnVjdCBuZnNfZmF0dHIgKmZhdHRyKQogewogCWludAlzdGF0dXM7CiAKQEAgLTUyNSw3ICs1MjUsNyBAQAogICogTE9PS1VQLCBDUkVBVEUsIE1LRElSCiAgKi8KIHN0YXRpYyBpbnQKLW5mc194ZHJfZGlyb3ByZXMoc3RydWN0IHJwY19ycXN0ICpyZXEsIHUzMiAqcCwgc3RydWN0IG5mc19kaXJvcG9rICpyZXMpCituZnNfeGRyX2Rpcm9wcmVzKHN0cnVjdCBycGNfcnFzdCAqcmVxLCBfX2JlMzIgKnAsIHN0cnVjdCBuZnNfZGlyb3BvayAqcmVzKQogewogCWludAlzdGF0dXM7CiAKQEAgLTU0MCw3ICs1NDAsNyBAQAogICogRW5jb2RlIFJFQURMSU5LIGFyZ3MKICAqLwogc3RhdGljIGludAotbmZzX3hkcl9yZWFkbGlua2FyZ3Moc3RydWN0IHJwY19ycXN0ICpyZXEsIHUzMiAqcCwgc3RydWN0IG5mc19yZWFkbGlua2FyZ3MgKmFyZ3MpCituZnNfeGRyX3JlYWRsaW5rYXJncyhzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwgX19iZTMyICpwLCBzdHJ1Y3QgbmZzX3JlYWRsaW5rYXJncyAqYXJncykKIHsKIAlzdHJ1Y3QgcnBjX2F1dGggKmF1dGggPSByZXEtPnJxX3Rhc2stPnRrX2F1dGg7CiAJdW5zaWduZWQgaW50IHJlcGxlbjsKQEAgLTU1OCw3ICs1NTgsNyBAQAogICogRGVjb2RlIFJFQURMSU5LIHJlcGx5CiAgKi8KIHN0YXRpYyBpbnQKLW5mc194ZHJfcmVhZGxpbmtyZXMoc3RydWN0IHJwY19ycXN0ICpyZXEsIHUzMiAqcCwgdm9pZCAqZHVtbXkpCituZnNfeGRyX3JlYWRsaW5rcmVzKHN0cnVjdCBycGNfcnFzdCAqcmVxLCBfX2JlMzIgKnAsIHZvaWQgKmR1bW15KQogewogCXN0cnVjdCB4ZHJfYnVmICpyY3ZidWYgPSAmcmVxLT5ycV9yY3ZfYnVmOwogCXN0cnVjdCBrdmVjICppb3YgPSByY3ZidWYtPmhlYWQ7CkBAIC02MDEsNyArNjAxLDcgQEAKICAqIERlY29kZSBXUklURSByZXBseQogICovCiBzdGF0aWMgaW50Ci1uZnNfeGRyX3dyaXRlcmVzKHN0cnVjdCBycGNfcnFzdCAqcmVxLCB1MzIgKnAsIHN0cnVjdCBuZnNfd3JpdGVyZXMgKnJlcykKK25mc194ZHJfd3JpdGVyZXMoc3RydWN0IHJwY19ycXN0ICpyZXEsIF9fYmUzMiAqcCwgc3RydWN0IG5mc193cml0ZXJlcyAqcmVzKQogewogCXJlcy0+dmVyZi0+Y29tbWl0dGVkID0gTkZTX0ZJTEVfU1lOQzsKIAlyZXR1cm4gbmZzX3hkcl9hdHRyc3RhdChyZXEsIHAsIHJlcy0+ZmF0dHIpOwpAQCAtNjExLDcgKzYxMSw3IEBACiAgKiBEZWNvZGUgU1RBVEZTIHJlcGx5CiAgKi8KIHN0YXRpYyBpbnQKLW5mc194ZHJfc3RhdGZzcmVzKHN0cnVjdCBycGNfcnFzdCAqcmVxLCB1MzIgKnAsIHN0cnVjdCBuZnMyX2Zzc3RhdCAqcmVzKQorbmZzX3hkcl9zdGF0ZnNyZXMoc3RydWN0IHJwY19ycXN0ICpyZXEsIF9fYmUzMiAqcCwgc3RydWN0IG5mczJfZnNzdGF0ICpyZXMpCiB7CiAJaW50CXN0YXR1czsKIApkaWZmIC0tZ2l0IGEvZnMvbmZzL25mczNwcm9jLmMgYi9mcy9uZnMvbmZzM3Byb2MuYwppbmRleCAzYjIzNGQ0Li5lNWYxMjhmIDEwMDY0NAotLS0gYS9mcy9uZnMvbmZzM3Byb2MuYworKysgYi9mcy9uZnMvbmZzM3Byb2MuYwpAQCAtNjY4LDcgKzY2OCw3IEBACiB7CiAJc3RydWN0IGlub2RlCQkqZGlyID0gZGVudHJ5LT5kX2lub2RlOwogCXN0cnVjdCBuZnNfZmF0dHIJZGlyX2F0dHI7Ci0JdTMyCQkJKnZlcmYgPSBORlNfQ09PS0lFVkVSRihkaXIpOworCV9fYmUzMgkJCSp2ZXJmID0gTkZTX0NPT0tJRVZFUkYoZGlyKTsKIAlzdHJ1Y3QgbmZzM19yZWFkZGlyYXJncwlhcmcgPSB7CiAJCS5maAkJPSBORlNfRkgoZGlyKSwKIAkJLmNvb2tpZQkJPSBjb29raWUsCmRpZmYgLS1naXQgYS9mcy9uZnMvbmZzM3hkci5jIGIvZnMvbmZzL25mczN4ZHIuYwppbmRleCAxNjU1NmZhLi4wYWNlMDkyIDEwMDY0NAotLS0gYS9mcy9uZnMvbmZzM3hkci5jCisrKyBiL2ZzL25mcy9uZnMzeGRyLmMKQEAgLTEwNSwxNCArMTA1LDE0IEBACiAvKgogICogQ29tbW9uIE5GUyBYRFIgZnVuY3Rpb25zIGFzIGlubGluZXMKICAqLwotc3RhdGljIGlubGluZSB1MzIgKgoteGRyX2VuY29kZV9maGFuZGxlKHUzMiAqcCwgc3RydWN0IG5mc19maCAqZmgpCitzdGF0aWMgaW5saW5lIF9fYmUzMiAqCit4ZHJfZW5jb2RlX2ZoYW5kbGUoX19iZTMyICpwLCBzdHJ1Y3QgbmZzX2ZoICpmaCkKIHsKIAlyZXR1cm4geGRyX2VuY29kZV9hcnJheShwLCBmaC0+ZGF0YSwgZmgtPnNpemUpOwogfQogCi1zdGF0aWMgaW5saW5lIHUzMiAqCi14ZHJfZGVjb2RlX2ZoYW5kbGUodTMyICpwLCBzdHJ1Y3QgbmZzX2ZoICpmaCkKK3N0YXRpYyBpbmxpbmUgX19iZTMyICoKK3hkcl9kZWNvZGVfZmhhbmRsZShfX2JlMzIgKnAsIHN0cnVjdCBuZnNfZmggKmZoKQogewogCWlmICgoZmgtPnNpemUgPSBudG9obCgqcCsrKSkgPD0gTkZTM19GSFNJWkUpIHsKIAkJbWVtY3B5KGZoLT5kYXRhLCBwLCBmaC0+c2l6ZSk7CkBAIC0xMjQsMjQgKzEyNCwyNCBAQAogLyoKICAqIEVuY29kZS9kZWNvZGUgdGltZS4KICAqLwotc3RhdGljIGlubGluZSB1MzIgKgoteGRyX2VuY29kZV90aW1lMyh1MzIgKnAsIHN0cnVjdCB0aW1lc3BlYyAqdGltZXApCitzdGF0aWMgaW5saW5lIF9fYmUzMiAqCit4ZHJfZW5jb2RlX3RpbWUzKF9fYmUzMiAqcCwgc3RydWN0IHRpbWVzcGVjICp0aW1lcCkKIHsKIAkqcCsrID0gaHRvbmwodGltZXAtPnR2X3NlYyk7CiAJKnArKyA9IGh0b25sKHRpbWVwLT50dl9uc2VjKTsKIAlyZXR1cm4gcDsKIH0KIAotc3RhdGljIGlubGluZSB1MzIgKgoteGRyX2RlY29kZV90aW1lMyh1MzIgKnAsIHN0cnVjdCB0aW1lc3BlYyAqdGltZXApCitzdGF0aWMgaW5saW5lIF9fYmUzMiAqCit4ZHJfZGVjb2RlX3RpbWUzKF9fYmUzMiAqcCwgc3RydWN0IHRpbWVzcGVjICp0aW1lcCkKIHsKIAl0aW1lcC0+dHZfc2VjID0gbnRvaGwoKnArKyk7CiAJdGltZXAtPnR2X25zZWMgPSBudG9obCgqcCsrKTsKIAlyZXR1cm4gcDsKIH0KIAotc3RhdGljIHUzMiAqCi14ZHJfZGVjb2RlX2ZhdHRyKHUzMiAqcCwgc3RydWN0IG5mc19mYXR0ciAqZmF0dHIpCitzdGF0aWMgX19iZTMyICoKK3hkcl9kZWNvZGVfZmF0dHIoX19iZTMyICpwLCBzdHJ1Y3QgbmZzX2ZhdHRyICpmYXR0cikKIHsKIAl1bnNpZ25lZCBpbnQJdHlwZSwgbWFqb3IsIG1pbm9yOwogCWludAkJZm1vZGU7CkBAIC0xNzcsOCArMTc3LDggQEAKIAlyZXR1cm4gcDsKIH0KIAotc3RhdGljIGlubGluZSB1MzIgKgoteGRyX2VuY29kZV9zYXR0cih1MzIgKnAsIHN0cnVjdCBpYXR0ciAqYXR0cikKK3N0YXRpYyBpbmxpbmUgX19iZTMyICoKK3hkcl9lbmNvZGVfc2F0dHIoX19iZTMyICpwLCBzdHJ1Y3QgaWF0dHIgKmF0dHIpCiB7CiAJaWYgKGF0dHItPmlhX3ZhbGlkICYgQVRUUl9NT0RFKSB7CiAJCSpwKysgPSB4ZHJfb25lOwpAQCAtMjIzLDggKzIyMyw4IEBACiAJcmV0dXJuIHA7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdTMyICoKLXhkcl9kZWNvZGVfd2NjX2F0dHIodTMyICpwLCBzdHJ1Y3QgbmZzX2ZhdHRyICpmYXR0cikKK3N0YXRpYyBpbmxpbmUgX19iZTMyICoKK3hkcl9kZWNvZGVfd2NjX2F0dHIoX19iZTMyICpwLCBzdHJ1Y3QgbmZzX2ZhdHRyICpmYXR0cikKIHsKIAlwID0geGRyX2RlY29kZV9oeXBlcihwLCAmZmF0dHItPnByZV9zaXplKTsKIAlwID0geGRyX2RlY29kZV90aW1lMyhwLCAmZmF0dHItPnByZV9tdGltZSk7CkBAIC0yMzMsMTYgKzIzMywxNiBAQAogCXJldHVybiBwOwogfQogCi1zdGF0aWMgaW5saW5lIHUzMiAqCi14ZHJfZGVjb2RlX3Bvc3Rfb3BfYXR0cih1MzIgKnAsIHN0cnVjdCBuZnNfZmF0dHIgKmZhdHRyKQorc3RhdGljIGlubGluZSBfX2JlMzIgKgoreGRyX2RlY29kZV9wb3N0X29wX2F0dHIoX19iZTMyICpwLCBzdHJ1Y3QgbmZzX2ZhdHRyICpmYXR0cikKIHsKIAlpZiAoKnArKykKIAkJcCA9IHhkcl9kZWNvZGVfZmF0dHIocCwgZmF0dHIpOwogCXJldHVybiBwOwogfQogCi1zdGF0aWMgaW5saW5lIHUzMiAqCi14ZHJfZGVjb2RlX3ByZV9vcF9hdHRyKHUzMiAqcCwgc3RydWN0IG5mc19mYXR0ciAqZmF0dHIpCitzdGF0aWMgaW5saW5lIF9fYmUzMiAqCit4ZHJfZGVjb2RlX3ByZV9vcF9hdHRyKF9fYmUzMiAqcCwgc3RydWN0IG5mc19mYXR0ciAqZmF0dHIpCiB7CiAJaWYgKCpwKyspCiAJCXJldHVybiB4ZHJfZGVjb2RlX3djY19hdHRyKHAsIGZhdHRyKTsKQEAgLTI1MCw4ICsyNTAsOCBAQAogfQogCiAKLXN0YXRpYyBpbmxpbmUgdTMyICoKLXhkcl9kZWNvZGVfd2NjX2RhdGEodTMyICpwLCBzdHJ1Y3QgbmZzX2ZhdHRyICpmYXR0cikKK3N0YXRpYyBpbmxpbmUgX19iZTMyICoKK3hkcl9kZWNvZGVfd2NjX2RhdGEoX19iZTMyICpwLCBzdHJ1Y3QgbmZzX2ZhdHRyICpmYXR0cikKIHsKIAlwID0geGRyX2RlY29kZV9wcmVfb3BfYXR0cihwLCBmYXR0cik7CiAJcmV0dXJuIHhkcl9kZWNvZGVfcG9zdF9vcF9hdHRyKHAsIGZhdHRyKTsKQEAgLTI2NSw3ICsyNjUsNyBAQAogICogRW5jb2RlIGZpbGUgaGFuZGxlIGFyZ3VtZW50CiAgKi8KIHN0YXRpYyBpbnQKLW5mczNfeGRyX2ZoYW5kbGUoc3RydWN0IHJwY19ycXN0ICpyZXEsIHUzMiAqcCwgc3RydWN0IG5mc19maCAqZmgpCituZnMzX3hkcl9maGFuZGxlKHN0cnVjdCBycGNfcnFzdCAqcmVxLCBfX2JlMzIgKnAsIHN0cnVjdCBuZnNfZmggKmZoKQogewogCXAgPSB4ZHJfZW5jb2RlX2ZoYW5kbGUocCwgZmgpOwogCXJlcS0+cnFfc2xlbiA9IHhkcl9hZGp1c3RfaW92ZWMocmVxLT5ycV9zdmVjLCBwKTsKQEAgLTI3Niw3ICsyNzYsNyBAQAogICogRW5jb2RlIFNFVEFUVFIgYXJndW1lbnRzCiAgKi8KIHN0YXRpYyBpbnQKLW5mczNfeGRyX3NhdHRyYXJncyhzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwgdTMyICpwLCBzdHJ1Y3QgbmZzM19zYXR0cmFyZ3MgKmFyZ3MpCituZnMzX3hkcl9zYXR0cmFyZ3Moc3RydWN0IHJwY19ycXN0ICpyZXEsIF9fYmUzMiAqcCwgc3RydWN0IG5mczNfc2F0dHJhcmdzICphcmdzKQogewogCXAgPSB4ZHJfZW5jb2RlX2ZoYW5kbGUocCwgYXJncy0+ZmgpOwogCXAgPSB4ZHJfZW5jb2RlX3NhdHRyKHAsIGFyZ3MtPnNhdHRyKTsKQEAgLTI5MSw3ICsyOTEsNyBAQAogICogRW5jb2RlIGRpcmVjdG9yeSBvcHMgYXJndW1lbnQKICAqLwogc3RhdGljIGludAotbmZzM194ZHJfZGlyb3BhcmdzKHN0cnVjdCBycGNfcnFzdCAqcmVxLCB1MzIgKnAsIHN0cnVjdCBuZnMzX2Rpcm9wYXJncyAqYXJncykKK25mczNfeGRyX2Rpcm9wYXJncyhzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwgX19iZTMyICpwLCBzdHJ1Y3QgbmZzM19kaXJvcGFyZ3MgKmFyZ3MpCiB7CiAJcCA9IHhkcl9lbmNvZGVfZmhhbmRsZShwLCBhcmdzLT5maCk7CiAJcCA9IHhkcl9lbmNvZGVfYXJyYXkocCwgYXJncy0+bmFtZSwgYXJncy0+bGVuKTsKQEAgLTMwMyw3ICszMDMsNyBAQAogICogRW5jb2RlIGFjY2VzcygpIGFyZ3VtZW50CiAgKi8KIHN0YXRpYyBpbnQKLW5mczNfeGRyX2FjY2Vzc2FyZ3Moc3RydWN0IHJwY19ycXN0ICpyZXEsIHUzMiAqcCwgc3RydWN0IG5mczNfYWNjZXNzYXJncyAqYXJncykKK25mczNfeGRyX2FjY2Vzc2FyZ3Moc3RydWN0IHJwY19ycXN0ICpyZXEsIF9fYmUzMiAqcCwgc3RydWN0IG5mczNfYWNjZXNzYXJncyAqYXJncykKIHsKIAlwID0geGRyX2VuY29kZV9maGFuZGxlKHAsIGFyZ3MtPmZoKTsKIAkqcCsrID0gaHRvbmwoYXJncy0+YWNjZXNzKTsKQEAgLTMxNyw3ICszMTcsNyBAQAogICogZXhhY3RseSB0byB0aGUgcGFnZSB3ZSB3YW50IHRvIGZldGNoLgogICovCiBzdGF0aWMgaW50Ci1uZnMzX3hkcl9yZWFkYXJncyhzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwgdTMyICpwLCBzdHJ1Y3QgbmZzX3JlYWRhcmdzICphcmdzKQorbmZzM194ZHJfcmVhZGFyZ3Moc3RydWN0IHJwY19ycXN0ICpyZXEsIF9fYmUzMiAqcCwgc3RydWN0IG5mc19yZWFkYXJncyAqYXJncykKIHsKIAlzdHJ1Y3QgcnBjX2F1dGgJKmF1dGggPSByZXEtPnJxX3Rhc2stPnRrX2F1dGg7CiAJdW5zaWduZWQgaW50IHJlcGxlbjsKQEAgLTMzOSw3ICszMzksNyBAQAogICogV3JpdGUgYXJndW1lbnRzLiBTcGxpY2UgdGhlIGJ1ZmZlciB0byBiZSB3cml0dGVuIGludG8gdGhlIGlvdmVjLgogICovCiBzdGF0aWMgaW50Ci1uZnMzX3hkcl93cml0ZWFyZ3Moc3RydWN0IHJwY19ycXN0ICpyZXEsIHUzMiAqcCwgc3RydWN0IG5mc193cml0ZWFyZ3MgKmFyZ3MpCituZnMzX3hkcl93cml0ZWFyZ3Moc3RydWN0IHJwY19ycXN0ICpyZXEsIF9fYmUzMiAqcCwgc3RydWN0IG5mc193cml0ZWFyZ3MgKmFyZ3MpCiB7CiAJc3RydWN0IHhkcl9idWYgKnNuZGJ1ZiA9ICZyZXEtPnJxX3NuZF9idWY7CiAJdTMyIGNvdW50ID0gYXJncy0+Y291bnQ7CkBAIC0zNjAsNyArMzYwLDcgQEAKICAqIEVuY29kZSBDUkVBVEUgYXJndW1lbnRzCiAgKi8KIHN0YXRpYyBpbnQKLW5mczNfeGRyX2NyZWF0ZWFyZ3Moc3RydWN0IHJwY19ycXN0ICpyZXEsIHUzMiAqcCwgc3RydWN0IG5mczNfY3JlYXRlYXJncyAqYXJncykKK25mczNfeGRyX2NyZWF0ZWFyZ3Moc3RydWN0IHJwY19ycXN0ICpyZXEsIF9fYmUzMiAqcCwgc3RydWN0IG5mczNfY3JlYXRlYXJncyAqYXJncykKIHsKIAlwID0geGRyX2VuY29kZV9maGFuZGxlKHAsIGFyZ3MtPmZoKTsKIAlwID0geGRyX2VuY29kZV9hcnJheShwLCBhcmdzLT5uYW1lLCBhcmdzLT5sZW4pOwpAQCAtMzgwLDcgKzM4MCw3IEBACiAgKiBFbmNvZGUgTUtESVIgYXJndW1lbnRzCiAgKi8KIHN0YXRpYyBpbnQKLW5mczNfeGRyX21rZGlyYXJncyhzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwgdTMyICpwLCBzdHJ1Y3QgbmZzM19ta2RpcmFyZ3MgKmFyZ3MpCituZnMzX3hkcl9ta2RpcmFyZ3Moc3RydWN0IHJwY19ycXN0ICpyZXEsIF9fYmUzMiAqcCwgc3RydWN0IG5mczNfbWtkaXJhcmdzICphcmdzKQogewogCXAgPSB4ZHJfZW5jb2RlX2ZoYW5kbGUocCwgYXJncy0+ZmgpOwogCXAgPSB4ZHJfZW5jb2RlX2FycmF5KHAsIGFyZ3MtPm5hbWUsIGFyZ3MtPmxlbik7CkBAIC0zOTMsNyArMzkzLDcgQEAKICAqIEVuY29kZSBTWU1MSU5LIGFyZ3VtZW50cwogICovCiBzdGF0aWMgaW50Ci1uZnMzX3hkcl9zeW1saW5rYXJncyhzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwgdTMyICpwLCBzdHJ1Y3QgbmZzM19zeW1saW5rYXJncyAqYXJncykKK25mczNfeGRyX3N5bWxpbmthcmdzKHN0cnVjdCBycGNfcnFzdCAqcmVxLCBfX2JlMzIgKnAsIHN0cnVjdCBuZnMzX3N5bWxpbmthcmdzICphcmdzKQogewogCXAgPSB4ZHJfZW5jb2RlX2ZoYW5kbGUocCwgYXJncy0+ZnJvbWZoKTsKIAlwID0geGRyX2VuY29kZV9hcnJheShwLCBhcmdzLT5mcm9tbmFtZSwgYXJncy0+ZnJvbWxlbik7CkBAIC00MTAsNyArNDEwLDcgQEAKICAqIEVuY29kZSBNS05PRCBhcmd1bWVudHMKICAqLwogc3RhdGljIGludAotbmZzM194ZHJfbWtub2RhcmdzKHN0cnVjdCBycGNfcnFzdCAqcmVxLCB1MzIgKnAsIHN0cnVjdCBuZnMzX21rbm9kYXJncyAqYXJncykKK25mczNfeGRyX21rbm9kYXJncyhzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwgX19iZTMyICpwLCBzdHJ1Y3QgbmZzM19ta25vZGFyZ3MgKmFyZ3MpCiB7CiAJcCA9IHhkcl9lbmNvZGVfZmhhbmRsZShwLCBhcmdzLT5maCk7CiAJcCA9IHhkcl9lbmNvZGVfYXJyYXkocCwgYXJncy0+bmFtZSwgYXJncy0+bGVuKTsKQEAgLTQyOSw3ICs0MjksNyBAQAogICogRW5jb2RlIFJFTkFNRSBhcmd1bWVudHMKICAqLwogc3RhdGljIGludAotbmZzM194ZHJfcmVuYW1lYXJncyhzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwgdTMyICpwLCBzdHJ1Y3QgbmZzM19yZW5hbWVhcmdzICphcmdzKQorbmZzM194ZHJfcmVuYW1lYXJncyhzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwgX19iZTMyICpwLCBzdHJ1Y3QgbmZzM19yZW5hbWVhcmdzICphcmdzKQogewogCXAgPSB4ZHJfZW5jb2RlX2ZoYW5kbGUocCwgYXJncy0+ZnJvbWZoKTsKIAlwID0geGRyX2VuY29kZV9hcnJheShwLCBhcmdzLT5mcm9tbmFtZSwgYXJncy0+ZnJvbWxlbik7CkBAIC00NDMsNyArNDQzLDcgQEAKICAqIEVuY29kZSBMSU5LIGFyZ3VtZW50cwogICovCiBzdGF0aWMgaW50Ci1uZnMzX3hkcl9saW5rYXJncyhzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwgdTMyICpwLCBzdHJ1Y3QgbmZzM19saW5rYXJncyAqYXJncykKK25mczNfeGRyX2xpbmthcmdzKHN0cnVjdCBycGNfcnFzdCAqcmVxLCBfX2JlMzIgKnAsIHN0cnVjdCBuZnMzX2xpbmthcmdzICphcmdzKQogewogCXAgPSB4ZHJfZW5jb2RlX2ZoYW5kbGUocCwgYXJncy0+ZnJvbWZoKTsKIAlwID0geGRyX2VuY29kZV9maGFuZGxlKHAsIGFyZ3MtPnRvZmgpOwpAQCAtNDU2LDcgKzQ1Niw3IEBACiAgKiBFbmNvZGUgYXJndW1lbnRzIHRvIHJlYWRkaXIgY2FsbAogICovCiBzdGF0aWMgaW50Ci1uZnMzX3hkcl9yZWFkZGlyYXJncyhzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwgdTMyICpwLCBzdHJ1Y3QgbmZzM19yZWFkZGlyYXJncyAqYXJncykKK25mczNfeGRyX3JlYWRkaXJhcmdzKHN0cnVjdCBycGNfcnFzdCAqcmVxLCBfX2JlMzIgKnAsIHN0cnVjdCBuZnMzX3JlYWRkaXJhcmdzICphcmdzKQogewogCXN0cnVjdCBycGNfYXV0aAkqYXV0aCA9IHJlcS0+cnFfdGFzay0+dGtfYXV0aDsKIAl1bnNpZ25lZCBpbnQgcmVwbGVuOwpAQCAtNDg1LDcgKzQ4NSw3IEBACiAgKiBXZSBqdXN0IGNoZWNrIGZvciBzeW50YWN0aWNhbCBjb3JyZWN0bmVzcy4KICAqLwogc3RhdGljIGludAotbmZzM194ZHJfcmVhZGRpcnJlcyhzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwgdTMyICpwLCBzdHJ1Y3QgbmZzM19yZWFkZGlycmVzICpyZXMpCituZnMzX3hkcl9yZWFkZGlycmVzKHN0cnVjdCBycGNfcnFzdCAqcmVxLCBfX2JlMzIgKnAsIHN0cnVjdCBuZnMzX3JlYWRkaXJyZXMgKnJlcykKIHsKIAlzdHJ1Y3QgeGRyX2J1ZiAqcmN2YnVmID0gJnJlcS0+cnFfcmN2X2J1ZjsKIAlzdHJ1Y3Qga3ZlYyAqaW92ID0gcmN2YnVmLT5oZWFkOwpAQCAtNDkzLDcgKzQ5Myw3IEBACiAJaW50IGhkcmxlbiwgcmVjdmQ7CiAJaW50IHN0YXR1cywgbnI7CiAJdW5zaWduZWQgaW50IGxlbiwgcGdsZW47Ci0JdTMyICplbnRyeSwgKmVuZCwgKmthZGRyOworCV9fYmUzMiAqZW50cnksICplbmQsICprYWRkcjsKIAogCXN0YXR1cyA9IG50b2hsKCpwKyspOwogCS8qIERlY29kZSBwb3N0X29wX2F0dHJzICovCkBAIC01MjMsOCArNTIzLDggQEAKIAlpZiAocGdsZW4gPiByZWN2ZCkKIAkJcGdsZW4gPSByZWN2ZDsKIAlwYWdlID0gcmN2YnVmLT5wYWdlczsKLQlrYWRkciA9IHAgPSAodTMyICopa21hcF9hdG9taWMoKnBhZ2UsIEtNX1VTRVIwKTsKLQllbmQgPSAodTMyICopKChjaGFyICopcCArIHBnbGVuKTsKKwlrYWRkciA9IHAgPSBrbWFwX2F0b21pYygqcGFnZSwgS01fVVNFUjApOworCWVuZCA9IChfX2JlMzIgKikoKGNoYXIgKilwICsgcGdsZW4pOwogCWVudHJ5ID0gcDsKIAlmb3IgKG5yID0gMDsgKnArKzsgbnIrKykgewogCQlpZiAocCArIDMgPiBlbmQpCkBAIC01ODMsOCArNTgzLDggQEAKIAlnb3RvIG91dDsKIH0KIAotdTMyICoKLW5mczNfZGVjb2RlX2RpcmVudCh1MzIgKnAsIHN0cnVjdCBuZnNfZW50cnkgKmVudHJ5LCBpbnQgcGx1cykKK19fYmUzMiAqCituZnMzX2RlY29kZV9kaXJlbnQoX19iZTMyICpwLCBzdHJ1Y3QgbmZzX2VudHJ5ICplbnRyeSwgaW50IHBsdXMpCiB7CiAJc3RydWN0IG5mc19lbnRyeSBvbGQgPSAqZW50cnk7CiAKQEAgLTYyNiw3ICs2MjYsNyBAQAogICogRW5jb2RlIENPTU1JVCBhcmd1bWVudHMKICAqLwogc3RhdGljIGludAotbmZzM194ZHJfY29tbWl0YXJncyhzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwgdTMyICpwLCBzdHJ1Y3QgbmZzX3dyaXRlYXJncyAqYXJncykKK25mczNfeGRyX2NvbW1pdGFyZ3Moc3RydWN0IHJwY19ycXN0ICpyZXEsIF9fYmUzMiAqcCwgc3RydWN0IG5mc193cml0ZWFyZ3MgKmFyZ3MpCiB7CiAJcCA9IHhkcl9lbmNvZGVfZmhhbmRsZShwLCBhcmdzLT5maCk7CiAJcCA9IHhkcl9lbmNvZGVfaHlwZXIocCwgYXJncy0+b2Zmc2V0KTsKQEAgLTY0MCw3ICs2NDAsNyBAQAogICogRW5jb2RlIEdFVEFDTCBhcmd1bWVudHMKICAqLwogc3RhdGljIGludAotbmZzM194ZHJfZ2V0YWNsYXJncyhzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwgdTMyICpwLAorbmZzM194ZHJfZ2V0YWNsYXJncyhzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwgX19iZTMyICpwLAogCQkgICAgc3RydWN0IG5mczNfZ2V0YWNsYXJncyAqYXJncykKIHsKIAlzdHJ1Y3QgcnBjX2F1dGggKmF1dGggPSByZXEtPnJxX3Rhc2stPnRrX2F1dGg7CkBAIC02NjQsNyArNjY0LDcgQEAKICAqIEVuY29kZSBTRVRBQ0wgYXJndW1lbnRzCiAgKi8KIHN0YXRpYyBpbnQKLW5mczNfeGRyX3NldGFjbGFyZ3Moc3RydWN0IHJwY19ycXN0ICpyZXEsIHUzMiAqcCwKK25mczNfeGRyX3NldGFjbGFyZ3Moc3RydWN0IHJwY19ycXN0ICpyZXEsIF9fYmUzMiAqcCwKICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgbmZzM19zZXRhY2xhcmdzICphcmdzKQogewogCXN0cnVjdCB4ZHJfYnVmICpidWYgPSAmcmVxLT5ycV9zbmRfYnVmOwpAQCAtNzExLDcgKzcxMSw3IEBACiAgKiBEZWNvZGUgYXR0cnN0YXQgcmVwbHkuCiAgKi8KIHN0YXRpYyBpbnQKLW5mczNfeGRyX2F0dHJzdGF0KHN0cnVjdCBycGNfcnFzdCAqcmVxLCB1MzIgKnAsIHN0cnVjdCBuZnNfZmF0dHIgKmZhdHRyKQorbmZzM194ZHJfYXR0cnN0YXQoc3RydWN0IHJwY19ycXN0ICpyZXEsIF9fYmUzMiAqcCwgc3RydWN0IG5mc19mYXR0ciAqZmF0dHIpCiB7CiAJaW50CXN0YXR1czsKIApAQCAtNzI2LDcgKzcyNiw3IEBACiAgKiBTQVRUUiwgUkVNT1ZFLCBSTURJUgogICovCiBzdGF0aWMgaW50Ci1uZnMzX3hkcl93Y2NzdGF0KHN0cnVjdCBycGNfcnFzdCAqcmVxLCB1MzIgKnAsIHN0cnVjdCBuZnNfZmF0dHIgKmZhdHRyKQorbmZzM194ZHJfd2Njc3RhdChzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwgX19iZTMyICpwLCBzdHJ1Y3QgbmZzX2ZhdHRyICpmYXR0cikKIHsKIAlpbnQJc3RhdHVzOwogCkBAIC03NDAsNyArNzQwLDcgQEAKICAqIERlY29kZSBMT09LVVAgcmVwbHkKICAqLwogc3RhdGljIGludAotbmZzM194ZHJfbG9va3VwcmVzKHN0cnVjdCBycGNfcnFzdCAqcmVxLCB1MzIgKnAsIHN0cnVjdCBuZnMzX2Rpcm9wcmVzICpyZXMpCituZnMzX3hkcl9sb29rdXByZXMoc3RydWN0IHJwY19ycXN0ICpyZXEsIF9fYmUzMiAqcCwgc3RydWN0IG5mczNfZGlyb3ByZXMgKnJlcykKIHsKIAlpbnQJc3RhdHVzOwogCkBAIC03NTksNyArNzU5LDcgQEAKICAqIERlY29kZSBBQ0NFU1MgcmVwbHkKICAqLwogc3RhdGljIGludAotbmZzM194ZHJfYWNjZXNzcmVzKHN0cnVjdCBycGNfcnFzdCAqcmVxLCB1MzIgKnAsIHN0cnVjdCBuZnMzX2FjY2Vzc3JlcyAqcmVzKQorbmZzM194ZHJfYWNjZXNzcmVzKHN0cnVjdCBycGNfcnFzdCAqcmVxLCBfX2JlMzIgKnAsIHN0cnVjdCBuZnMzX2FjY2Vzc3JlcyAqcmVzKQogewogCWludAlzdGF0dXMgPSBudG9obCgqcCsrKTsKIApAQCAtNzcxLDcgKzc3MSw3IEBACiB9CiAKIHN0YXRpYyBpbnQKLW5mczNfeGRyX3JlYWRsaW5rYXJncyhzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwgdTMyICpwLCBzdHJ1Y3QgbmZzM19yZWFkbGlua2FyZ3MgKmFyZ3MpCituZnMzX3hkcl9yZWFkbGlua2FyZ3Moc3RydWN0IHJwY19ycXN0ICpyZXEsIF9fYmUzMiAqcCwgc3RydWN0IG5mczNfcmVhZGxpbmthcmdzICphcmdzKQogewogCXN0cnVjdCBycGNfYXV0aCAqYXV0aCA9IHJlcS0+cnFfdGFzay0+dGtfYXV0aDsKIAl1bnNpZ25lZCBpbnQgcmVwbGVuOwpAQCAtNzg5LDcgKzc4OSw3IEBACiAgKiBEZWNvZGUgUkVBRExJTksgcmVwbHkKICAqLwogc3RhdGljIGludAotbmZzM194ZHJfcmVhZGxpbmtyZXMoc3RydWN0IHJwY19ycXN0ICpyZXEsIHUzMiAqcCwgc3RydWN0IG5mc19mYXR0ciAqZmF0dHIpCituZnMzX3hkcl9yZWFkbGlua3JlcyhzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwgX19iZTMyICpwLCBzdHJ1Y3QgbmZzX2ZhdHRyICpmYXR0cikKIHsKIAlzdHJ1Y3QgeGRyX2J1ZiAqcmN2YnVmID0gJnJlcS0+cnFfcmN2X2J1ZjsKIAlzdHJ1Y3Qga3ZlYyAqaW92ID0gcmN2YnVmLT5oZWFkOwpAQCAtODM3LDcgKzgzNyw3IEBACiAgKiBEZWNvZGUgUkVBRCByZXBseQogICovCiBzdGF0aWMgaW50Ci1uZnMzX3hkcl9yZWFkcmVzKHN0cnVjdCBycGNfcnFzdCAqcmVxLCB1MzIgKnAsIHN0cnVjdCBuZnNfcmVhZHJlcyAqcmVzKQorbmZzM194ZHJfcmVhZHJlcyhzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwgX19iZTMyICpwLCBzdHJ1Y3QgbmZzX3JlYWRyZXMgKnJlcykKIHsKIAlzdHJ1Y3Qga3ZlYyAqaW92ID0gcmVxLT5ycV9yY3ZfYnVmLmhlYWQ7CiAJaW50CXN0YXR1cywgY291bnQsIG9jb3VudCwgcmVjdmQsIGhkcmxlbjsKQEAgLTg4OCw3ICs4ODgsNyBAQAogICogRGVjb2RlIFdSSVRFIHJlc3BvbnNlCiAgKi8KIHN0YXRpYyBpbnQKLW5mczNfeGRyX3dyaXRlcmVzKHN0cnVjdCBycGNfcnFzdCAqcmVxLCB1MzIgKnAsIHN0cnVjdCBuZnNfd3JpdGVyZXMgKnJlcykKK25mczNfeGRyX3dyaXRlcmVzKHN0cnVjdCBycGNfcnFzdCAqcmVxLCBfX2JlMzIgKnAsIHN0cnVjdCBuZnNfd3JpdGVyZXMgKnJlcykKIHsKIAlpbnQJc3RhdHVzOwogCkBAIC05MTAsNyArOTEwLDcgQEAKICAqIERlY29kZSBhIENSRUFURSByZXNwb25zZQogICovCiBzdGF0aWMgaW50Ci1uZnMzX3hkcl9jcmVhdGVyZXMoc3RydWN0IHJwY19ycXN0ICpyZXEsIHUzMiAqcCwgc3RydWN0IG5mczNfZGlyb3ByZXMgKnJlcykKK25mczNfeGRyX2NyZWF0ZXJlcyhzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwgX19iZTMyICpwLCBzdHJ1Y3QgbmZzM19kaXJvcHJlcyAqcmVzKQogewogCWludAlzdGF0dXM7CiAKQEAgLTkzNyw3ICs5MzcsNyBAQAogICogRGVjb2RlIFJFTkFNRSByZXBseQogICovCiBzdGF0aWMgaW50Ci1uZnMzX3hkcl9yZW5hbWVyZXMoc3RydWN0IHJwY19ycXN0ICpyZXEsIHUzMiAqcCwgc3RydWN0IG5mczNfcmVuYW1lcmVzICpyZXMpCituZnMzX3hkcl9yZW5hbWVyZXMoc3RydWN0IHJwY19ycXN0ICpyZXEsIF9fYmUzMiAqcCwgc3RydWN0IG5mczNfcmVuYW1lcmVzICpyZXMpCiB7CiAJaW50CXN0YXR1czsKIApAQCAtOTUyLDcgKzk1Miw3IEBACiAgKiBEZWNvZGUgTElOSyByZXBseQogICovCiBzdGF0aWMgaW50Ci1uZnMzX3hkcl9saW5rcmVzKHN0cnVjdCBycGNfcnFzdCAqcmVxLCB1MzIgKnAsIHN0cnVjdCBuZnMzX2xpbmtyZXMgKnJlcykKK25mczNfeGRyX2xpbmtyZXMoc3RydWN0IHJwY19ycXN0ICpyZXEsIF9fYmUzMiAqcCwgc3RydWN0IG5mczNfbGlua3JlcyAqcmVzKQogewogCWludAlzdGF0dXM7CiAKQEAgLTk2Nyw3ICs5NjcsNyBAQAogICogRGVjb2RlIEZTU1RBVCByZXBseQogICovCiBzdGF0aWMgaW50Ci1uZnMzX3hkcl9mc3N0YXRyZXMoc3RydWN0IHJwY19ycXN0ICpyZXEsIHUzMiAqcCwgc3RydWN0IG5mc19mc3N0YXQgKnJlcykKK25mczNfeGRyX2Zzc3RhdHJlcyhzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwgX19iZTMyICpwLCBzdHJ1Y3QgbmZzX2Zzc3RhdCAqcmVzKQogewogCWludAkJc3RhdHVzOwogCkBAIC05OTIsNyArOTkyLDcgQEAKICAqIERlY29kZSBGU0lORk8gcmVwbHkKICAqLwogc3RhdGljIGludAotbmZzM194ZHJfZnNpbmZvcmVzKHN0cnVjdCBycGNfcnFzdCAqcmVxLCB1MzIgKnAsIHN0cnVjdCBuZnNfZnNpbmZvICpyZXMpCituZnMzX3hkcl9mc2luZm9yZXMoc3RydWN0IHJwY19ycXN0ICpyZXEsIF9fYmUzMiAqcCwgc3RydWN0IG5mc19mc2luZm8gKnJlcykKIHsKIAlpbnQJCXN0YXR1czsKIApAQCAtMTAyMCw3ICsxMDIwLDcgQEAKICAqIERlY29kZSBQQVRIQ09ORiByZXBseQogICovCiBzdGF0aWMgaW50Ci1uZnMzX3hkcl9wYXRoY29uZnJlcyhzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwgdTMyICpwLCBzdHJ1Y3QgbmZzX3BhdGhjb25mICpyZXMpCituZnMzX3hkcl9wYXRoY29uZnJlcyhzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwgX19iZTMyICpwLCBzdHJ1Y3QgbmZzX3BhdGhjb25mICpyZXMpCiB7CiAJaW50CQlzdGF0dXM7CiAKQEAgLTEwNDAsNyArMTA0MCw3IEBACiAgKiBEZWNvZGUgQ09NTUlUIHJlcGx5CiAgKi8KIHN0YXRpYyBpbnQKLW5mczNfeGRyX2NvbW1pdHJlcyhzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwgdTMyICpwLCBzdHJ1Y3QgbmZzX3dyaXRlcmVzICpyZXMpCituZnMzX3hkcl9jb21taXRyZXMoc3RydWN0IHJwY19ycXN0ICpyZXEsIF9fYmUzMiAqcCwgc3RydWN0IG5mc193cml0ZXJlcyAqcmVzKQogewogCWludAkJc3RhdHVzOwogCkBAIC0xMDU5LDcgKzEwNTksNyBAQAogICogRGVjb2RlIEdFVEFDTCByZXBseQogICovCiBzdGF0aWMgaW50Ci1uZnMzX3hkcl9nZXRhY2xyZXMoc3RydWN0IHJwY19ycXN0ICpyZXEsIHUzMiAqcCwKK25mczNfeGRyX2dldGFjbHJlcyhzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwgX19iZTMyICpwLAogCQkgICBzdHJ1Y3QgbmZzM19nZXRhY2xyZXMgKnJlcykKIHsKIAlzdHJ1Y3QgeGRyX2J1ZiAqYnVmID0gJnJlcS0+cnFfcmN2X2J1ZjsKQEAgLTEwOTEsNyArMTA5MSw3IEBACiAgKiBEZWNvZGUgc2V0YWNsIHJlcGx5LgogICovCiBzdGF0aWMgaW50Ci1uZnMzX3hkcl9zZXRhY2xyZXMoc3RydWN0IHJwY19ycXN0ICpyZXEsIHUzMiAqcCwgc3RydWN0IG5mc19mYXR0ciAqZmF0dHIpCituZnMzX3hkcl9zZXRhY2xyZXMoc3RydWN0IHJwY19ycXN0ICpyZXEsIF9fYmUzMiAqcCwgc3RydWN0IG5mc19mYXR0ciAqZmF0dHIpCiB7CiAJaW50IHN0YXR1cyA9IG50b2hsKCpwKyspOwogCmRpZmYgLS1naXQgYS9mcy9uZnMvbmZzNF9mcy5oIGIvZnMvbmZzL25mczRfZnMuaAppbmRleCA2MTA5NWZlLi42ZjM0NjY3IDEwMDY0NAotLS0gYS9mcy9uZnMvbmZzNF9mcy5oCisrKyBiL2ZzL25mcy9uZnM0X2ZzLmgKQEAgLTIxMiw3ICsyMTIsNyBAQAogZXh0ZXJuIGNvbnN0IG5mczRfc3RhdGVpZCB6ZXJvX3N0YXRlaWQ7CiAKIC8qIG5mczR4ZHIuYyAqLwotZXh0ZXJuIHVpbnQzMl90ICpuZnM0X2RlY29kZV9kaXJlbnQodWludDMyX3QgKnAsIHN0cnVjdCBuZnNfZW50cnkgKmVudHJ5LCBpbnQgcGx1cyk7CitleHRlcm4gX19iZTMyICpuZnM0X2RlY29kZV9kaXJlbnQoX19iZTMyICpwLCBzdHJ1Y3QgbmZzX2VudHJ5ICplbnRyeSwgaW50IHBsdXMpOwogZXh0ZXJuIHN0cnVjdCBycGNfcHJvY2luZm8gbmZzNF9wcm9jZWR1cmVzW107CiAKIHN0cnVjdCBuZnM0X21vdW50X2RhdGE7CmRpZmYgLS1naXQgYS9mcy9uZnMvbmZzNHByb2MuYyBiL2ZzL25mcy9uZnM0cHJvYy5jCmluZGV4IDQ3YzdlNmUuLjgxMTgwMzYgMTAwNjQ0Ci0tLSBhL2ZzL25mcy9uZnM0cHJvYy5jCisrKyBiL2ZzL25mcy9uZnM0cHJvYy5jCkBAIC0xMzgsMTAgKzEzOCwxMCBAQAogCXwgRkFUVFI0X1dPUkQxX01PVU5URURfT05fRklMRUlECiB9OwogCi1zdGF0aWMgdm9pZCBuZnM0X3NldHVwX3JlYWRkaXIodTY0IGNvb2tpZSwgdTMyICp2ZXJpZmllciwgc3RydWN0IGRlbnRyeSAqZGVudHJ5LAorc3RhdGljIHZvaWQgbmZzNF9zZXR1cF9yZWFkZGlyKHU2NCBjb29raWUsIF9fYmUzMiAqdmVyaWZpZXIsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSwKIAkJc3RydWN0IG5mczRfcmVhZGRpcl9hcmcgKnJlYWRkaXIpCiB7Ci0JdTMyICpzdGFydCwgKnA7CisJX19iZTMyICpzdGFydCwgKnA7CiAKIAlCVUdfT04ocmVhZGRpci0+Y291bnQgPCA4MCk7CiAJaWYgKGNvb2tpZSA+IDIpIHsKQEAgLTE2Miw3ICsxNjIsNyBAQAogCSAqIHdoZW4gdGFsa2luZyB0byB0aGUgc2VydmVyLCB3ZSBhbHdheXMgc2VuZCBjb29raWUgMAogCSAqIGluc3RlYWQgb2YgMSBvciAyLgogCSAqLwotCXN0YXJ0ID0gcCA9ICh1MzIgKilrbWFwX2F0b21pYygqcmVhZGRpci0+cGFnZXMsIEtNX1VTRVIwKTsKKwlzdGFydCA9IHAgPSBrbWFwX2F0b21pYygqcmVhZGRpci0+cGFnZXMsIEtNX1VTRVIwKTsKIAkKIAlpZiAoY29va2llID09IDApIHsKIAkJKnArKyA9IHhkcl9vbmU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG5leHQgKi8KQEAgLTEzMTQsMTEgKzEzMTQsOSBAQAogCQkJY2FzZSAtRVJPRlM6CiAJCQkJbG9va3VwX2luc3RhbnRpYXRlX2ZpbHAobmQsIChzdHJ1Y3QgZGVudHJ5ICopc3RhdGUsIE5VTEwpOwogCQkJCXJldHVybiAxOwotCQkJY2FzZSAtRU5PRU5UOgotCQkJCWlmIChkZW50cnktPmRfaW5vZGUgPT0gTlVMTCkKLQkJCQkJcmV0dXJuIDE7CisJCQlkZWZhdWx0OgorCQkJCWdvdG8gb3V0X2Ryb3A7CiAJCX0KLQkJZ290byBvdXRfZHJvcDsKIAl9CiAJaWYgKHN0YXRlLT5pbm9kZSA9PSBkZW50cnktPmRfaW5vZGUpIHsKIAkJbmZzNF9pbnRlbnRfc2V0X2ZpbGUobmQsIGRlbnRyeSwgc3RhdGUpOwpAQCAtMjkxNywxMSArMjkxNSwxMSBAQAogCQkucnBjX3Jlc3AgPSBjbHAsCiAJCS5ycGNfY3JlZCA9IGNyZWQsCiAJfTsKLQl1MzIgKnA7CisJX19iZTMyICpwOwogCWludCBsb29wID0gMDsKIAlpbnQgc3RhdHVzOwogCi0JcCA9ICh1MzIqKXNjX3ZlcmlmaWVyLmRhdGE7CisJcCA9IChfX2JlMzIqKXNjX3ZlcmlmaWVyLmRhdGE7CiAJKnArKyA9IGh0b25sKCh1MzIpY2xwLT5jbF9ib290X3RpbWUudHZfc2VjKTsKIAkqcCA9IGh0b25sKCh1MzIpY2xwLT5jbF9ib290X3RpbWUudHZfbnNlYyk7CiAKZGlmZiAtLWdpdCBhL2ZzL25mcy9uZnM0eGRyLmMgYi9mcy9uZnMvbmZzNHhkci5jCmluZGV4IDNkZDQxM2YuLjBjZjNmYTMgMTAwNjQ0Ci0tLSBhL2ZzL25mcy9uZnM0eGRyLmMKKysrIGIvZnMvbmZzL25mczR4ZHIuYwpAQCAtNDcxLDcgKzQ3MSw3IEBACiAKIHN0YXRpYyB2b2lkIGVuY29kZV9zdHJpbmcoc3RydWN0IHhkcl9zdHJlYW0gKnhkciwgdW5zaWduZWQgaW50IGxlbiwgY29uc3QgY2hhciAqc3RyKQogewotCXVpbnQzMl90ICpwOworCV9fYmUzMiAqcDsKIAogCXAgPSB4ZHJfcmVzZXJ2ZV9zcGFjZSh4ZHIsIDQgKyBsZW4pOwogCUJVR19PTihwID09IE5VTEwpOwpAQCAtNDgwLDcgKzQ4MCw3IEBACiAKIHN0YXRpYyBpbnQgZW5jb2RlX2NvbXBvdW5kX2hkcihzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLCBzdHJ1Y3QgY29tcG91bmRfaGRyICpoZHIpCiB7Ci0JdWludDMyX3QgKnA7CisJX19iZTMyICpwOwogCiAJZHByaW50aygiZW5jb2RlX2NvbXBvdW5kOiB0YWc9JS4qc1xuIiwgKGludCloZHItPnRhZ2xlbiwgaGRyLT50YWcpOwogCUJVR19PTihoZHItPnRhZ2xlbiA+IE5GUzRfTUFYVEFHTEVOKTsKQEAgLTQ5NCw3ICs0OTQsNyBAQAogCiBzdGF0aWMgdm9pZCBlbmNvZGVfbmZzNF92ZXJpZmllcihzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLCBjb25zdCBuZnM0X3ZlcmlmaWVyICp2ZXJmKQogewotCXVpbnQzMl90ICpwOworCV9fYmUzMiAqcDsKIAogCXAgPSB4ZHJfcmVzZXJ2ZV9zcGFjZSh4ZHIsIE5GUzRfVkVSSUZJRVJfU0laRSk7CiAJQlVHX09OKHAgPT0gTlVMTCk7CkBAIC01MDcsOCArNTA3LDggQEAKIAljaGFyIG93bmVyX2dyb3VwW0lETUFQX05BTUVTWl07CiAJaW50IG93bmVyX25hbWVsZW4gPSAwOwogCWludCBvd25lcl9ncm91cGxlbiA9IDA7Ci0JdWludDMyX3QgKnA7Ci0JdWludDMyX3QgKnE7CisJX19iZTMyICpwOworCV9fYmUzMiAqcTsKIAlpbnQgbGVuOwogCXVpbnQzMl90IGJtdmFsMCA9IDA7CiAJdWludDMyX3QgYm12YWwxID0gMDsKQEAgLTYzMCw3ICs2MzAsNyBAQAogCiBzdGF0aWMgaW50IGVuY29kZV9hY2Nlc3Moc3RydWN0IHhkcl9zdHJlYW0gKnhkciwgdTMyIGFjY2VzcykKIHsKLQl1aW50MzJfdCAqcDsKKwlfX2JlMzIgKnA7CiAKIAlSRVNFUlZFX1NQQUNFKDgpOwogCVdSSVRFMzIoT1BfQUNDRVNTKTsKQEAgLTY0MSw3ICs2NDEsNyBAQAogCiBzdGF0aWMgaW50IGVuY29kZV9jbG9zZShzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLCBjb25zdCBzdHJ1Y3QgbmZzX2Nsb3NlYXJncyAqYXJnKQogewotCXVpbnQzMl90ICpwOworCV9fYmUzMiAqcDsKIAogCVJFU0VSVkVfU1BBQ0UoOCtzaXplb2YoYXJnLT5zdGF0ZWlkLT5kYXRhKSk7CiAJV1JJVEUzMihPUF9DTE9TRSk7CkBAIC02NTMsNyArNjUzLDcgQEAKIAogc3RhdGljIGludCBlbmNvZGVfY29tbWl0KHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsIGNvbnN0IHN0cnVjdCBuZnNfd3JpdGVhcmdzICphcmdzKQogewotCXVpbnQzMl90ICpwOworCV9fYmUzMiAqcDsKICAgICAgICAgCiAgICAgICAgIFJFU0VSVkVfU1BBQ0UoMTYpOwogICAgICAgICBXUklURTMyKE9QX0NPTU1JVCk7CkBAIC02NjUsNyArNjY1LDcgQEAKIAogc3RhdGljIGludCBlbmNvZGVfY3JlYXRlKHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsIGNvbnN0IHN0cnVjdCBuZnM0X2NyZWF0ZV9hcmcgKmNyZWF0ZSkKIHsKLQl1aW50MzJfdCAqcDsKKwlfX2JlMzIgKnA7CiAJCiAJUkVTRVJWRV9TUEFDRSg4KTsKIAlXUklURTMyKE9QX0NSRUFURSk7CkBAIC02OTcsNyArNjk3LDcgQEAKIAogc3RhdGljIGludCBlbmNvZGVfZ2V0YXR0cl9vbmUoc3RydWN0IHhkcl9zdHJlYW0gKnhkciwgdWludDMyX3QgYml0bWFwKQogewotICAgICAgICB1aW50MzJfdCAqcDsKKyAgICAgICAgX19iZTMyICpwOwogCiAgICAgICAgIFJFU0VSVkVfU1BBQ0UoMTIpOwogICAgICAgICBXUklURTMyKE9QX0dFVEFUVFIpOwpAQCAtNzA4LDcgKzcwOCw3IEBACiAKIHN0YXRpYyBpbnQgZW5jb2RlX2dldGF0dHJfdHdvKHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsIHVpbnQzMl90IGJtMCwgdWludDMyX3QgYm0xKQogewotICAgICAgICB1aW50MzJfdCAqcDsKKyAgICAgICAgX19iZTMyICpwOwogCiAgICAgICAgIFJFU0VSVkVfU1BBQ0UoMTYpOwogICAgICAgICBXUklURTMyKE9QX0dFVEFUVFIpOwpAQCAtNzQwLDcgKzc0MCw3IEBACiAKIHN0YXRpYyBpbnQgZW5jb2RlX2dldGZoKHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIpCiB7Ci0JdWludDMyX3QgKnA7CisJX19iZTMyICpwOwogCiAJUkVTRVJWRV9TUEFDRSg0KTsKIAlXUklURTMyKE9QX0dFVEZIKTsKQEAgLTc1MCw3ICs3NTAsNyBAQAogCiBzdGF0aWMgaW50IGVuY29kZV9saW5rKHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsIGNvbnN0IHN0cnVjdCBxc3RyICpuYW1lKQogewotCXVpbnQzMl90ICpwOworCV9fYmUzMiAqcDsKIAogCVJFU0VSVkVfU1BBQ0UoOCArIG5hbWUtPmxlbik7CiAJV1JJVEUzMihPUF9MSU5LKTsKQEAgLTc4MCw3ICs3ODAsNyBAQAogICovCiBzdGF0aWMgaW50IGVuY29kZV9sb2NrKHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsIGNvbnN0IHN0cnVjdCBuZnNfbG9ja19hcmdzICphcmdzKQogewotCXVpbnQzMl90ICpwOworCV9fYmUzMiAqcDsKIAogCVJFU0VSVkVfU1BBQ0UoMzIpOwogCVdSSVRFMzIoT1BfTE9DSyk7CkBAIC04MDksNyArODA5LDcgQEAKIAogc3RhdGljIGludCBlbmNvZGVfbG9ja3Qoc3RydWN0IHhkcl9zdHJlYW0gKnhkciwgY29uc3Qgc3RydWN0IG5mc19sb2NrdF9hcmdzICphcmdzKQogewotCXVpbnQzMl90ICpwOworCV9fYmUzMiAqcDsKIAogCVJFU0VSVkVfU1BBQ0UoNDApOwogCVdSSVRFMzIoT1BfTE9DS1QpOwpAQCAtODI1LDcgKzgyNSw3IEBACiAKIHN0YXRpYyBpbnQgZW5jb2RlX2xvY2t1KHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsIGNvbnN0IHN0cnVjdCBuZnNfbG9ja3VfYXJncyAqYXJncykKIHsKLQl1aW50MzJfdCAqcDsKKwlfX2JlMzIgKnA7CiAKIAlSRVNFUlZFX1NQQUNFKDQ0KTsKIAlXUklURTMyKE9QX0xPQ0tVKTsKQEAgLTg0MSw3ICs4NDEsNyBAQAogc3RhdGljIGludCBlbmNvZGVfbG9va3VwKHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsIGNvbnN0IHN0cnVjdCBxc3RyICpuYW1lKQogewogCWludCBsZW4gPSBuYW1lLT5sZW47Ci0JdWludDMyX3QgKnA7CisJX19iZTMyICpwOwogCiAJUkVTRVJWRV9TUEFDRSg4ICsgbGVuKTsKIAlXUklURTMyKE9QX0xPT0tVUCk7CkBAIC04NTMsNyArODUzLDcgQEAKIAogc3RhdGljIHZvaWQgZW5jb2RlX3NoYXJlX2FjY2VzcyhzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLCBpbnQgb3Blbl9mbGFncykKIHsKLQl1aW50MzJfdCAqcDsKKwlfX2JlMzIgKnA7CiAKIAlSRVNFUlZFX1NQQUNFKDgpOwogCXN3aXRjaCAob3Blbl9mbGFncyAmIChGTU9ERV9SRUFEfEZNT0RFX1dSSVRFKSkgewpAQCAtODc0LDcgKzg3NCw3IEBACiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBlbmNvZGVfb3BlbmhkcihzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLCBjb25zdCBzdHJ1Y3QgbmZzX29wZW5hcmdzICphcmcpCiB7Ci0JdWludDMyX3QgKnA7CisJX19iZTMyICpwOwogIC8qCiAgKiBvcGNvZGUgNCwgc2VxaWQgNCwgc2hhcmVfYWNjZXNzIDQsIHNoYXJlX2RlbnkgNCwgY2xpZW50aWQgOCwgb3duZXJsZW4gNCwKICAqIG93bmVyIDQgPSAzMgpAQCAtODkxLDcgKzg5MSw3IEBACiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBlbmNvZGVfY3JlYXRlbW9kZShzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLCBjb25zdCBzdHJ1Y3QgbmZzX29wZW5hcmdzICphcmcpCiB7Ci0JdWludDMyX3QgKnA7CisJX19iZTMyICpwOwogCiAJUkVTRVJWRV9TUEFDRSg0KTsKIAlzd2l0Y2goYXJnLT5vcGVuX2ZsYWdzICYgT19FWENMKSB7CkBAIC05MDcsNyArOTA3LDcgQEAKIAogc3RhdGljIHZvaWQgZW5jb2RlX29wZW50eXBlKHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsIGNvbnN0IHN0cnVjdCBuZnNfb3BlbmFyZ3MgKmFyZykKIHsKLQl1aW50MzJfdCAqcDsKKwlfX2JlMzIgKnA7CiAKIAlSRVNFUlZFX1NQQUNFKDQpOwogCXN3aXRjaCAoYXJnLT5vcGVuX2ZsYWdzICYgT19DUkVBVCkgewpAQCAtOTIzLDcgKzkyMyw3IEBACiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBlbmNvZGVfZGVsZWdhdGlvbl90eXBlKHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsIGludCBkZWxlZ2F0aW9uX3R5cGUpCiB7Ci0JdWludDMyX3QgKnA7CisJX19iZTMyICpwOwogCiAJUkVTRVJWRV9TUEFDRSg0KTsKIAlzd2l0Y2ggKGRlbGVnYXRpb25fdHlwZSkgewpAQCAtOTQzLDcgKzk0Myw3IEBACiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBlbmNvZGVfY2xhaW1fbnVsbChzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLCBjb25zdCBzdHJ1Y3QgcXN0ciAqbmFtZSkKIHsKLQl1aW50MzJfdCAqcDsKKwlfX2JlMzIgKnA7CiAKIAlSRVNFUlZFX1NQQUNFKDQpOwogCVdSSVRFMzIoTkZTNF9PUEVOX0NMQUlNX05VTEwpOwpAQCAtOTUyLDcgKzk1Miw3IEBACiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBlbmNvZGVfY2xhaW1fcHJldmlvdXMoc3RydWN0IHhkcl9zdHJlYW0gKnhkciwgaW50IHR5cGUpCiB7Ci0JdWludDMyX3QgKnA7CisJX19iZTMyICpwOwogCiAJUkVTRVJWRV9TUEFDRSg0KTsKIAlXUklURTMyKE5GUzRfT1BFTl9DTEFJTV9QUkVWSU9VUyk7CkBAIC05NjEsNyArOTYxLDcgQEAKIAogc3RhdGljIGlubGluZSB2b2lkIGVuY29kZV9jbGFpbV9kZWxlZ2F0ZV9jdXIoc3RydWN0IHhkcl9zdHJlYW0gKnhkciwgY29uc3Qgc3RydWN0IHFzdHIgKm5hbWUsIGNvbnN0IG5mczRfc3RhdGVpZCAqc3RhdGVpZCkKIHsKLQl1aW50MzJfdCAqcDsKKwlfX2JlMzIgKnA7CiAKIAlSRVNFUlZFX1NQQUNFKDQrc2l6ZW9mKHN0YXRlaWQtPmRhdGEpKTsKIAlXUklURTMyKE5GUzRfT1BFTl9DTEFJTV9ERUxFR0FURV9DVVIpOwpAQCAtOTkxLDcgKzk5MSw3IEBACiAKIHN0YXRpYyBpbnQgZW5jb2RlX29wZW5fY29uZmlybShzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLCBjb25zdCBzdHJ1Y3QgbmZzX29wZW5fY29uZmlybWFyZ3MgKmFyZykKIHsKLQl1aW50MzJfdCAqcDsKKwlfX2JlMzIgKnA7CiAKIAlSRVNFUlZFX1NQQUNFKDgrc2l6ZW9mKGFyZy0+c3RhdGVpZC0+ZGF0YSkpOwogCVdSSVRFMzIoT1BfT1BFTl9DT05GSVJNKTsKQEAgLTEwMDMsNyArMTAwMyw3IEBACiAKIHN0YXRpYyBpbnQgZW5jb2RlX29wZW5fZG93bmdyYWRlKHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsIGNvbnN0IHN0cnVjdCBuZnNfY2xvc2VhcmdzICphcmcpCiB7Ci0JdWludDMyX3QgKnA7CisJX19iZTMyICpwOwogCiAJUkVTRVJWRV9TUEFDRSg4K3NpemVvZihhcmctPnN0YXRlaWQtPmRhdGEpKTsKIAlXUklURTMyKE9QX09QRU5fRE9XTkdSQURFKTsKQEAgLTEwMTcsNyArMTAxNyw3IEBACiBlbmNvZGVfcHV0Zmgoc3RydWN0IHhkcl9zdHJlYW0gKnhkciwgY29uc3Qgc3RydWN0IG5mc19maCAqZmgpCiB7CiAJaW50IGxlbiA9IGZoLT5zaXplOwotCXVpbnQzMl90ICpwOworCV9fYmUzMiAqcDsKIAogCVJFU0VSVkVfU1BBQ0UoOCArIGxlbik7CiAJV1JJVEUzMihPUF9QVVRGSCk7CkBAIC0xMDI5LDcgKzEwMjksNyBAQAogCiBzdGF0aWMgaW50IGVuY29kZV9wdXRyb290Zmgoc3RydWN0IHhkcl9zdHJlYW0gKnhkcikKIHsKLSAgICAgICAgdWludDMyX3QgKnA7CisgICAgICAgIF9fYmUzMiAqcDsKICAgICAgICAgCiAgICAgICAgIFJFU0VSVkVfU1BBQ0UoNCk7CiAgICAgICAgIFdSSVRFMzIoT1BfUFVUUk9PVEZIKTsKQEAgLTEwNDAsNyArMTA0MCw3IEBACiBzdGF0aWMgdm9pZCBlbmNvZGVfc3RhdGVpZChzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLCBjb25zdCBzdHJ1Y3QgbmZzX29wZW5fY29udGV4dCAqY3R4KQogewogCW5mczRfc3RhdGVpZCBzdGF0ZWlkOwotCXVpbnQzMl90ICpwOworCV9fYmUzMiAqcDsKIAogCVJFU0VSVkVfU1BBQ0UoMTYpOwogCWlmIChjdHgtPnN0YXRlICE9IE5VTEwpIHsKQEAgLTEwNTIsNyArMTA1Miw3IEBACiAKIHN0YXRpYyBpbnQgZW5jb2RlX3JlYWQoc3RydWN0IHhkcl9zdHJlYW0gKnhkciwgY29uc3Qgc3RydWN0IG5mc19yZWFkYXJncyAqYXJncykKIHsKLQl1aW50MzJfdCAqcDsKKwlfX2JlMzIgKnA7CiAKIAlSRVNFUlZFX1NQQUNFKDQpOwogCVdSSVRFMzIoT1BfUkVBRCk7CkBAIC0xMDc0LDcgKzEwNzQsNyBAQAogCQlGQVRUUjRfV09SRDFfTU9VTlRFRF9PTl9GSUxFSUQsCiAJfTsKIAlpbnQgcmVwbGVuOwotCXVpbnQzMl90ICpwOworCV9fYmUzMiAqcDsKIAogCVJFU0VSVkVfU1BBQ0UoMzIrc2l6ZW9mKG5mczRfdmVyaWZpZXIpKTsKIAlXUklURTMyKE9QX1JFQURESVIpOwpAQCAtMTExNiw3ICsxMTE2LDcgQEAKIHsKIAlzdHJ1Y3QgcnBjX2F1dGggKmF1dGggPSByZXEtPnJxX3Rhc2stPnRrX2F1dGg7CiAJdW5zaWduZWQgaW50IHJlcGxlbjsKLQl1aW50MzJfdCAqcDsKKwlfX2JlMzIgKnA7CiAKIAlSRVNFUlZFX1NQQUNFKDQpOwogCVdSSVRFMzIoT1BfUkVBRExJTkspOwpAQCAtMTEzNCw3ICsxMTM0LDcgQEAKIAogc3RhdGljIGludCBlbmNvZGVfcmVtb3ZlKHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsIGNvbnN0IHN0cnVjdCBxc3RyICpuYW1lKQogewotCXVpbnQzMl90ICpwOworCV9fYmUzMiAqcDsKIAogCVJFU0VSVkVfU1BBQ0UoOCArIG5hbWUtPmxlbik7CiAJV1JJVEUzMihPUF9SRU1PVkUpOwpAQCAtMTE0Niw3ICsxMTQ2LDcgQEAKIAogc3RhdGljIGludCBlbmNvZGVfcmVuYW1lKHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsIGNvbnN0IHN0cnVjdCBxc3RyICpvbGRuYW1lLCBjb25zdCBzdHJ1Y3QgcXN0ciAqbmV3bmFtZSkKIHsKLQl1aW50MzJfdCAqcDsKKwlfX2JlMzIgKnA7CiAKIAlSRVNFUlZFX1NQQUNFKDggKyBvbGRuYW1lLT5sZW4pOwogCVdSSVRFMzIoT1BfUkVOQU1FKTsKQEAgLTExNjIsNyArMTE2Miw3IEBACiAKIHN0YXRpYyBpbnQgZW5jb2RlX3JlbmV3KHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsIGNvbnN0IHN0cnVjdCBuZnNfY2xpZW50ICpjbGllbnRfc3RhdGVpZCkKIHsKLQl1aW50MzJfdCAqcDsKKwlfX2JlMzIgKnA7CiAKIAlSRVNFUlZFX1NQQUNFKDEyKTsKIAlXUklURTMyKE9QX1JFTkVXKTsKQEAgLTExNzQsNyArMTE3NCw3IEBACiBzdGF0aWMgaW50CiBlbmNvZGVfcmVzdG9yZWZoKHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIpCiB7Ci0JdWludDMyX3QgKnA7CisJX19iZTMyICpwOwogCiAJUkVTRVJWRV9TUEFDRSg0KTsKIAlXUklURTMyKE9QX1JFU1RPUkVGSCk7CkBAIC0xMTg1LDcgKzExODUsNyBAQAogc3RhdGljIGludAogZW5jb2RlX3NldGFjbChzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLCBzdHJ1Y3QgbmZzX3NldGFjbGFyZ3MgKmFyZykKIHsKLQl1aW50MzJfdCAqcDsKKwlfX2JlMzIgKnA7CiAKIAlSRVNFUlZFX1NQQUNFKDQrc2l6ZW9mKHplcm9fc3RhdGVpZC5kYXRhKSk7CiAJV1JJVEUzMihPUF9TRVRBVFRSKTsKQEAgLTEyMDQsNyArMTIwNCw3IEBACiBzdGF0aWMgaW50CiBlbmNvZGVfc2F2ZWZoKHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIpCiB7Ci0JdWludDMyX3QgKnA7CisJX19iZTMyICpwOwogCiAJUkVTRVJWRV9TUEFDRSg0KTsKIAlXUklURTMyKE9QX1NBVkVGSCk7CkBAIC0xMjE1LDcgKzEyMTUsNyBAQAogc3RhdGljIGludCBlbmNvZGVfc2V0YXR0cihzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLCBjb25zdCBzdHJ1Y3QgbmZzX3NldGF0dHJhcmdzICphcmcsIGNvbnN0IHN0cnVjdCBuZnNfc2VydmVyICpzZXJ2ZXIpCiB7CiAJaW50IHN0YXR1czsKLQl1aW50MzJfdCAqcDsKKwlfX2JlMzIgKnA7CiAJCiAgICAgICAgIFJFU0VSVkVfU1BBQ0UoNCtzaXplb2YoYXJnLT5zdGF0ZWlkLmRhdGEpKTsKICAgICAgICAgV1JJVEUzMihPUF9TRVRBVFRSKTsKQEAgLTEyMjksNyArMTIyOSw3IEBACiAKIHN0YXRpYyBpbnQgZW5jb2RlX3NldGNsaWVudGlkKHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsIGNvbnN0IHN0cnVjdCBuZnM0X3NldGNsaWVudGlkICpzZXRjbGllbnRpZCkKIHsKLQl1aW50MzJfdCAqcDsKKwlfX2JlMzIgKnA7CiAKIAlSRVNFUlZFX1NQQUNFKDQgKyBzaXplb2Yoc2V0Y2xpZW50aWQtPnNjX3ZlcmlmaWVyLT5kYXRhKSk7CiAJV1JJVEUzMihPUF9TRVRDTElFTlRJRCk7CkBAIC0xMjQ4LDcgKzEyNDgsNyBAQAogCiBzdGF0aWMgaW50IGVuY29kZV9zZXRjbGllbnRpZF9jb25maXJtKHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsIGNvbnN0IHN0cnVjdCBuZnNfY2xpZW50ICpjbGllbnRfc3RhdGUpCiB7Ci0gICAgICAgIHVpbnQzMl90ICpwOworICAgICAgICBfX2JlMzIgKnA7CiAKICAgICAgICAgUkVTRVJWRV9TUEFDRSgxMiArIHNpemVvZihjbGllbnRfc3RhdGUtPmNsX2NvbmZpcm0uZGF0YSkpOwogICAgICAgICBXUklURTMyKE9QX1NFVENMSUVOVElEX0NPTkZJUk0pOwpAQCAtMTI2MCw3ICsxMjYwLDcgQEAKIAogc3RhdGljIGludCBlbmNvZGVfd3JpdGUoc3RydWN0IHhkcl9zdHJlYW0gKnhkciwgY29uc3Qgc3RydWN0IG5mc193cml0ZWFyZ3MgKmFyZ3MpCiB7Ci0JdWludDMyX3QgKnA7CisJX19iZTMyICpwOwogCiAJUkVTRVJWRV9TUEFDRSg0KTsKIAlXUklURTMyKE9QX1dSSVRFKTsKQEAgLTEyNzksNyArMTI3OSw3IEBACiAKIHN0YXRpYyBpbnQgZW5jb2RlX2RlbGVncmV0dXJuKHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsIGNvbnN0IG5mczRfc3RhdGVpZCAqc3RhdGVpZCkKIHsKLQl1aW50MzJfdCAqcDsKKwlfX2JlMzIgKnA7CiAKIAlSRVNFUlZFX1NQQUNFKDIwKTsKIApAQCAtMTI5NSw3ICsxMjk1LDcgQEAKIC8qCiAgKiBFbmNvZGUgYW4gQUNDRVNTIHJlcXVlc3QKICAqLwotc3RhdGljIGludCBuZnM0X3hkcl9lbmNfYWNjZXNzKHN0cnVjdCBycGNfcnFzdCAqcmVxLCB1aW50MzJfdCAqcCwgY29uc3Qgc3RydWN0IG5mczRfYWNjZXNzYXJncyAqYXJncykKK3N0YXRpYyBpbnQgbmZzNF94ZHJfZW5jX2FjY2VzcyhzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwgX19iZTMyICpwLCBjb25zdCBzdHJ1Y3QgbmZzNF9hY2Nlc3NhcmdzICphcmdzKQogewogCXN0cnVjdCB4ZHJfc3RyZWFtIHhkcjsKIAlzdHJ1Y3QgY29tcG91bmRfaGRyIGhkciA9IHsKQEAgLTEzMTMsNyArMTMxMyw3IEBACiAvKgogICogRW5jb2RlIExPT0tVUCByZXF1ZXN0CiAgKi8KLXN0YXRpYyBpbnQgbmZzNF94ZHJfZW5jX2xvb2t1cChzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwgdWludDMyX3QgKnAsIGNvbnN0IHN0cnVjdCBuZnM0X2xvb2t1cF9hcmcgKmFyZ3MpCitzdGF0aWMgaW50IG5mczRfeGRyX2VuY19sb29rdXAoc3RydWN0IHJwY19ycXN0ICpyZXEsIF9fYmUzMiAqcCwgY29uc3Qgc3RydWN0IG5mczRfbG9va3VwX2FyZyAqYXJncykKIHsKIAlzdHJ1Y3QgeGRyX3N0cmVhbSB4ZHI7CiAJc3RydWN0IGNvbXBvdW5kX2hkciBoZHIgPSB7CkBAIC0xMzM3LDcgKzEzMzcsNyBAQAogLyoKICAqIEVuY29kZSBMT09LVVBfUk9PVCByZXF1ZXN0CiAgKi8KLXN0YXRpYyBpbnQgbmZzNF94ZHJfZW5jX2xvb2t1cF9yb290KHN0cnVjdCBycGNfcnFzdCAqcmVxLCB1aW50MzJfdCAqcCwgY29uc3Qgc3RydWN0IG5mczRfbG9va3VwX3Jvb3RfYXJnICphcmdzKQorc3RhdGljIGludCBuZnM0X3hkcl9lbmNfbG9va3VwX3Jvb3Qoc3RydWN0IHJwY19ycXN0ICpyZXEsIF9fYmUzMiAqcCwgY29uc3Qgc3RydWN0IG5mczRfbG9va3VwX3Jvb3RfYXJnICphcmdzKQogewogCXN0cnVjdCB4ZHJfc3RyZWFtIHhkcjsKIAlzdHJ1Y3QgY29tcG91bmRfaGRyIGhkciA9IHsKQEAgLTEzNTgsNyArMTM1OCw3IEBACiAvKgogICogRW5jb2RlIFJFTU9WRSByZXF1ZXN0CiAgKi8KLXN0YXRpYyBpbnQgbmZzNF94ZHJfZW5jX3JlbW92ZShzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwgdWludDMyX3QgKnAsIGNvbnN0IHN0cnVjdCBuZnM0X3JlbW92ZV9hcmcgKmFyZ3MpCitzdGF0aWMgaW50IG5mczRfeGRyX2VuY19yZW1vdmUoc3RydWN0IHJwY19ycXN0ICpyZXEsIF9fYmUzMiAqcCwgY29uc3Qgc3RydWN0IG5mczRfcmVtb3ZlX2FyZyAqYXJncykKIHsKIAlzdHJ1Y3QgeGRyX3N0cmVhbSB4ZHI7CiAJc3RydWN0IGNvbXBvdW5kX2hkciBoZHIgPSB7CkBAIC0xMzgwLDcgKzEzODAsNyBAQAogLyoKICAqIEVuY29kZSBSRU5BTUUgcmVxdWVzdAogICovCi1zdGF0aWMgaW50IG5mczRfeGRyX2VuY19yZW5hbWUoc3RydWN0IHJwY19ycXN0ICpyZXEsIHVpbnQzMl90ICpwLCBjb25zdCBzdHJ1Y3QgbmZzNF9yZW5hbWVfYXJnICphcmdzKQorc3RhdGljIGludCBuZnM0X3hkcl9lbmNfcmVuYW1lKHN0cnVjdCBycGNfcnFzdCAqcmVxLCBfX2JlMzIgKnAsIGNvbnN0IHN0cnVjdCBuZnM0X3JlbmFtZV9hcmcgKmFyZ3MpCiB7CiAJc3RydWN0IHhkcl9zdHJlYW0geGRyOwogCXN0cnVjdCBjb21wb3VuZF9oZHIgaGRyID0gewpAQCAtMTQxMCw3ICsxNDEwLDcgQEAKIC8qCiAgKiBFbmNvZGUgTElOSyByZXF1ZXN0CiAgKi8KLXN0YXRpYyBpbnQgbmZzNF94ZHJfZW5jX2xpbmsoc3RydWN0IHJwY19ycXN0ICpyZXEsIHVpbnQzMl90ICpwLCBjb25zdCBzdHJ1Y3QgbmZzNF9saW5rX2FyZyAqYXJncykKK3N0YXRpYyBpbnQgbmZzNF94ZHJfZW5jX2xpbmsoc3RydWN0IHJwY19ycXN0ICpyZXEsIF9fYmUzMiAqcCwgY29uc3Qgc3RydWN0IG5mczRfbGlua19hcmcgKmFyZ3MpCiB7CiAJc3RydWN0IHhkcl9zdHJlYW0geGRyOwogCXN0cnVjdCBjb21wb3VuZF9oZHIgaGRyID0gewpAQCAtMTQ0MCw3ICsxNDQwLDcgQEAKIC8qCiAgKiBFbmNvZGUgQ1JFQVRFIHJlcXVlc3QKICAqLwotc3RhdGljIGludCBuZnM0X3hkcl9lbmNfY3JlYXRlKHN0cnVjdCBycGNfcnFzdCAqcmVxLCB1aW50MzJfdCAqcCwgY29uc3Qgc3RydWN0IG5mczRfY3JlYXRlX2FyZyAqYXJncykKK3N0YXRpYyBpbnQgbmZzNF94ZHJfZW5jX2NyZWF0ZShzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwgX19iZTMyICpwLCBjb25zdCBzdHJ1Y3QgbmZzNF9jcmVhdGVfYXJnICphcmdzKQogewogCXN0cnVjdCB4ZHJfc3RyZWFtIHhkcjsKIAlzdHJ1Y3QgY29tcG91bmRfaGRyIGhkciA9IHsKQEAgLTE0NzAsNyArMTQ3MCw3IEBACiAvKgogICogRW5jb2RlIFNZTUxJTksgcmVxdWVzdAogICovCi1zdGF0aWMgaW50IG5mczRfeGRyX2VuY19zeW1saW5rKHN0cnVjdCBycGNfcnFzdCAqcmVxLCB1aW50MzJfdCAqcCwgY29uc3Qgc3RydWN0IG5mczRfY3JlYXRlX2FyZyAqYXJncykKK3N0YXRpYyBpbnQgbmZzNF94ZHJfZW5jX3N5bWxpbmsoc3RydWN0IHJwY19ycXN0ICpyZXEsIF9fYmUzMiAqcCwgY29uc3Qgc3RydWN0IG5mczRfY3JlYXRlX2FyZyAqYXJncykKIHsKIAlyZXR1cm4gbmZzNF94ZHJfZW5jX2NyZWF0ZShyZXEsIHAsIGFyZ3MpOwogfQpAQCAtMTQ3OCw3ICsxNDc4LDcgQEAKIC8qCiAgKiBFbmNvZGUgR0VUQVRUUiByZXF1ZXN0CiAgKi8KLXN0YXRpYyBpbnQgbmZzNF94ZHJfZW5jX2dldGF0dHIoc3RydWN0IHJwY19ycXN0ICpyZXEsIHVpbnQzMl90ICpwLCBjb25zdCBzdHJ1Y3QgbmZzNF9nZXRhdHRyX2FyZyAqYXJncykKK3N0YXRpYyBpbnQgbmZzNF94ZHJfZW5jX2dldGF0dHIoc3RydWN0IHJwY19ycXN0ICpyZXEsIF9fYmUzMiAqcCwgY29uc3Qgc3RydWN0IG5mczRfZ2V0YXR0cl9hcmcgKmFyZ3MpCiB7CiAJc3RydWN0IHhkcl9zdHJlYW0geGRyOwogCXN0cnVjdCBjb21wb3VuZF9oZHIgaGRyID0gewpAQCAtMTQ5Niw3ICsxNDk2LDcgQEAKIC8qCiAgKiBFbmNvZGUgYSBDTE9TRSByZXF1ZXN0CiAgKi8KLXN0YXRpYyBpbnQgbmZzNF94ZHJfZW5jX2Nsb3NlKHN0cnVjdCBycGNfcnFzdCAqcmVxLCB1aW50MzJfdCAqcCwgc3RydWN0IG5mc19jbG9zZWFyZ3MgKmFyZ3MpCitzdGF0aWMgaW50IG5mczRfeGRyX2VuY19jbG9zZShzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwgX19iZTMyICpwLCBzdHJ1Y3QgbmZzX2Nsb3NlYXJncyAqYXJncykKIHsKICAgICAgICAgc3RydWN0IHhkcl9zdHJlYW0geGRyOwogICAgICAgICBzdHJ1Y3QgY29tcG91bmRfaGRyIGhkciA9IHsKQEAgLTE1MjAsNyArMTUyMCw3IEBACiAvKgogICogRW5jb2RlIGFuIE9QRU4gcmVxdWVzdAogICovCi1zdGF0aWMgaW50IG5mczRfeGRyX2VuY19vcGVuKHN0cnVjdCBycGNfcnFzdCAqcmVxLCB1aW50MzJfdCAqcCwgc3RydWN0IG5mc19vcGVuYXJncyAqYXJncykKK3N0YXRpYyBpbnQgbmZzNF94ZHJfZW5jX29wZW4oc3RydWN0IHJwY19ycXN0ICpyZXEsIF9fYmUzMiAqcCwgc3RydWN0IG5mc19vcGVuYXJncyAqYXJncykKIHsKIAlzdHJ1Y3QgeGRyX3N0cmVhbSB4ZHI7CiAJc3RydWN0IGNvbXBvdW5kX2hkciBoZHIgPSB7CkBAIC0xNTU2LDcgKzE1NTYsNyBAQAogLyoKICAqIEVuY29kZSBhbiBPUEVOX0NPTkZJUk0gcmVxdWVzdAogICovCi1zdGF0aWMgaW50IG5mczRfeGRyX2VuY19vcGVuX2NvbmZpcm0oc3RydWN0IHJwY19ycXN0ICpyZXEsIHVpbnQzMl90ICpwLCBzdHJ1Y3QgbmZzX29wZW5fY29uZmlybWFyZ3MgKmFyZ3MpCitzdGF0aWMgaW50IG5mczRfeGRyX2VuY19vcGVuX2NvbmZpcm0oc3RydWN0IHJwY19ycXN0ICpyZXEsIF9fYmUzMiAqcCwgc3RydWN0IG5mc19vcGVuX2NvbmZpcm1hcmdzICphcmdzKQogewogCXN0cnVjdCB4ZHJfc3RyZWFtIHhkcjsKIAlzdHJ1Y3QgY29tcG91bmRfaGRyIGhkciA9IHsKQEAgLTE1NzcsNyArMTU3Nyw3IEBACiAvKgogICogRW5jb2RlIGFuIE9QRU4gcmVxdWVzdCB3aXRoIG5vIGF0dHJpYnV0ZXMuCiAgKi8KLXN0YXRpYyBpbnQgbmZzNF94ZHJfZW5jX29wZW5fbm9hdHRyKHN0cnVjdCBycGNfcnFzdCAqcmVxLCB1aW50MzJfdCAqcCwgc3RydWN0IG5mc19vcGVuYXJncyAqYXJncykKK3N0YXRpYyBpbnQgbmZzNF94ZHJfZW5jX29wZW5fbm9hdHRyKHN0cnVjdCBycGNfcnFzdCAqcmVxLCBfX2JlMzIgKnAsIHN0cnVjdCBuZnNfb3BlbmFyZ3MgKmFyZ3MpCiB7CiAJc3RydWN0IHhkcl9zdHJlYW0geGRyOwogCXN0cnVjdCBjb21wb3VuZF9oZHIgaGRyID0gewpAQCAtMTYwMSw3ICsxNjAxLDcgQEAKIC8qCiAgKiBFbmNvZGUgYW4gT1BFTl9ET1dOR1JBREUgcmVxdWVzdAogICovCi1zdGF0aWMgaW50IG5mczRfeGRyX2VuY19vcGVuX2Rvd25ncmFkZShzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwgdWludDMyX3QgKnAsIHN0cnVjdCBuZnNfY2xvc2VhcmdzICphcmdzKQorc3RhdGljIGludCBuZnM0X3hkcl9lbmNfb3Blbl9kb3duZ3JhZGUoc3RydWN0IHJwY19ycXN0ICpyZXEsIF9fYmUzMiAqcCwgc3RydWN0IG5mc19jbG9zZWFyZ3MgKmFyZ3MpCiB7CiAJc3RydWN0IHhkcl9zdHJlYW0geGRyOwogCXN0cnVjdCBjb21wb3VuZF9oZHIgaGRyID0gewpAQCAtMTYyNSw3ICsxNjI1LDcgQEAKIC8qCiAgKiBFbmNvZGUgYSBMT0NLIHJlcXVlc3QKICAqLwotc3RhdGljIGludCBuZnM0X3hkcl9lbmNfbG9jayhzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwgdWludDMyX3QgKnAsIHN0cnVjdCBuZnNfbG9ja19hcmdzICphcmdzKQorc3RhdGljIGludCBuZnM0X3hkcl9lbmNfbG9jayhzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwgX19iZTMyICpwLCBzdHJ1Y3QgbmZzX2xvY2tfYXJncyAqYXJncykKIHsKIAlzdHJ1Y3QgeGRyX3N0cmVhbSB4ZHI7CiAJc3RydWN0IGNvbXBvdW5kX2hkciBoZHIgPSB7CkBAIC0xNjQ2LDcgKzE2NDYsNyBAQAogLyoKICAqIEVuY29kZSBhIExPQ0tUIHJlcXVlc3QKICAqLwotc3RhdGljIGludCBuZnM0X3hkcl9lbmNfbG9ja3Qoc3RydWN0IHJwY19ycXN0ICpyZXEsIHVpbnQzMl90ICpwLCBzdHJ1Y3QgbmZzX2xvY2t0X2FyZ3MgKmFyZ3MpCitzdGF0aWMgaW50IG5mczRfeGRyX2VuY19sb2NrdChzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwgX19iZTMyICpwLCBzdHJ1Y3QgbmZzX2xvY2t0X2FyZ3MgKmFyZ3MpCiB7CiAJc3RydWN0IHhkcl9zdHJlYW0geGRyOwogCXN0cnVjdCBjb21wb3VuZF9oZHIgaGRyID0gewpAQCAtMTY2Nyw3ICsxNjY3LDcgQEAKIC8qCiAgKiBFbmNvZGUgYSBMT0NLVSByZXF1ZXN0CiAgKi8KLXN0YXRpYyBpbnQgbmZzNF94ZHJfZW5jX2xvY2t1KHN0cnVjdCBycGNfcnFzdCAqcmVxLCB1aW50MzJfdCAqcCwgc3RydWN0IG5mc19sb2NrdV9hcmdzICphcmdzKQorc3RhdGljIGludCBuZnM0X3hkcl9lbmNfbG9ja3Uoc3RydWN0IHJwY19ycXN0ICpyZXEsIF9fYmUzMiAqcCwgc3RydWN0IG5mc19sb2NrdV9hcmdzICphcmdzKQogewogCXN0cnVjdCB4ZHJfc3RyZWFtIHhkcjsKIAlzdHJ1Y3QgY29tcG91bmRfaGRyIGhkciA9IHsKQEAgLTE2ODgsNyArMTY4OCw3IEBACiAvKgogICogRW5jb2RlIGEgUkVBRExJTksgcmVxdWVzdAogICovCi1zdGF0aWMgaW50IG5mczRfeGRyX2VuY19yZWFkbGluayhzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwgdWludDMyX3QgKnAsIGNvbnN0IHN0cnVjdCBuZnM0X3JlYWRsaW5rICphcmdzKQorc3RhdGljIGludCBuZnM0X3hkcl9lbmNfcmVhZGxpbmsoc3RydWN0IHJwY19ycXN0ICpyZXEsIF9fYmUzMiAqcCwgY29uc3Qgc3RydWN0IG5mczRfcmVhZGxpbmsgKmFyZ3MpCiB7CiAJc3RydWN0IHhkcl9zdHJlYW0geGRyOwogCXN0cnVjdCBjb21wb3VuZF9oZHIgaGRyID0gewpAQCAtMTcwOSw3ICsxNzA5LDcgQEAKIC8qCiAgKiBFbmNvZGUgYSBSRUFERElSIHJlcXVlc3QKICAqLwotc3RhdGljIGludCBuZnM0X3hkcl9lbmNfcmVhZGRpcihzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwgdWludDMyX3QgKnAsIGNvbnN0IHN0cnVjdCBuZnM0X3JlYWRkaXJfYXJnICphcmdzKQorc3RhdGljIGludCBuZnM0X3hkcl9lbmNfcmVhZGRpcihzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwgX19iZTMyICpwLCBjb25zdCBzdHJ1Y3QgbmZzNF9yZWFkZGlyX2FyZyAqYXJncykKIHsKIAlzdHJ1Y3QgeGRyX3N0cmVhbSB4ZHI7CiAJc3RydWN0IGNvbXBvdW5kX2hkciBoZHIgPSB7CkBAIC0xNzMwLDcgKzE3MzAsNyBAQAogLyoKICAqIEVuY29kZSBhIFJFQUQgcmVxdWVzdAogICovCi1zdGF0aWMgaW50IG5mczRfeGRyX2VuY19yZWFkKHN0cnVjdCBycGNfcnFzdCAqcmVxLCB1aW50MzJfdCAqcCwgc3RydWN0IG5mc19yZWFkYXJncyAqYXJncykKK3N0YXRpYyBpbnQgbmZzNF94ZHJfZW5jX3JlYWQoc3RydWN0IHJwY19ycXN0ICpyZXEsIF9fYmUzMiAqcCwgc3RydWN0IG5mc19yZWFkYXJncyAqYXJncykKIHsKIAlzdHJ1Y3QgcnBjX2F1dGgJKmF1dGggPSByZXEtPnJxX3Rhc2stPnRrX2F1dGg7CiAJc3RydWN0IHhkcl9zdHJlYW0geGRyOwpAQCAtMTc2Miw3ICsxNzYyLDcgQEAKIC8qCiAgKiBFbmNvZGUgYW4gU0VUQVRUUiByZXF1ZXN0CiAgKi8KLXN0YXRpYyBpbnQgbmZzNF94ZHJfZW5jX3NldGF0dHIoc3RydWN0IHJwY19ycXN0ICpyZXEsIHVpbnQzMl90ICpwLCBzdHJ1Y3QgbmZzX3NldGF0dHJhcmdzICphcmdzKQorc3RhdGljIGludCBuZnM0X3hkcl9lbmNfc2V0YXR0cihzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwgX19iZTMyICpwLCBzdHJ1Y3QgbmZzX3NldGF0dHJhcmdzICphcmdzKQogCiB7CiAgICAgICAgIHN0cnVjdCB4ZHJfc3RyZWFtIHhkcjsKQEAgLTE3ODgsNyArMTc4OCw3IEBACiAgKiBFbmNvZGUgYSBHRVRBQ0wgcmVxdWVzdAogICovCiBzdGF0aWMgaW50Ci1uZnM0X3hkcl9lbmNfZ2V0YWNsKHN0cnVjdCBycGNfcnFzdCAqcmVxLCB1aW50MzJfdCAqcCwKK25mczRfeGRyX2VuY19nZXRhY2woc3RydWN0IHJwY19ycXN0ICpyZXEsIF9fYmUzMiAqcCwKIAkJc3RydWN0IG5mc19nZXRhY2xhcmdzICphcmdzKQogewogCXN0cnVjdCB4ZHJfc3RyZWFtIHhkcjsKQEAgLTE4MTUsNyArMTgxNSw3IEBACiAvKgogICogRW5jb2RlIGEgV1JJVEUgcmVxdWVzdAogICovCi1zdGF0aWMgaW50IG5mczRfeGRyX2VuY193cml0ZShzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwgdWludDMyX3QgKnAsIHN0cnVjdCBuZnNfd3JpdGVhcmdzICphcmdzKQorc3RhdGljIGludCBuZnM0X3hkcl9lbmNfd3JpdGUoc3RydWN0IHJwY19ycXN0ICpyZXEsIF9fYmUzMiAqcCwgc3RydWN0IG5mc193cml0ZWFyZ3MgKmFyZ3MpCiB7CiAJc3RydWN0IHhkcl9zdHJlYW0geGRyOwogCXN0cnVjdCBjb21wb3VuZF9oZHIgaGRyID0gewpAQCAtMTgzOSw3ICsxODM5LDcgQEAKIC8qCiAgKiAgYSBDT01NSVQgcmVxdWVzdAogICovCi1zdGF0aWMgaW50IG5mczRfeGRyX2VuY19jb21taXQoc3RydWN0IHJwY19ycXN0ICpyZXEsIHVpbnQzMl90ICpwLCBzdHJ1Y3QgbmZzX3dyaXRlYXJncyAqYXJncykKK3N0YXRpYyBpbnQgbmZzNF94ZHJfZW5jX2NvbW1pdChzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwgX19iZTMyICpwLCBzdHJ1Y3QgbmZzX3dyaXRlYXJncyAqYXJncykKIHsKIAlzdHJ1Y3QgeGRyX3N0cmVhbSB4ZHI7CiAJc3RydWN0IGNvbXBvdW5kX2hkciBoZHIgPSB7CkBAIC0xODYzLDcgKzE4NjMsNyBAQAogLyoKICAqIEZTSU5GTyByZXF1ZXN0CiAgKi8KLXN0YXRpYyBpbnQgbmZzNF94ZHJfZW5jX2ZzaW5mbyhzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwgdWludDMyX3QgKnAsIHN0cnVjdCBuZnM0X2ZzaW5mb19hcmcgKmFyZ3MpCitzdGF0aWMgaW50IG5mczRfeGRyX2VuY19mc2luZm8oc3RydWN0IHJwY19ycXN0ICpyZXEsIF9fYmUzMiAqcCwgc3RydWN0IG5mczRfZnNpbmZvX2FyZyAqYXJncykKIHsKIAlzdHJ1Y3QgeGRyX3N0cmVhbSB4ZHI7CiAJc3RydWN0IGNvbXBvdW5kX2hkciBoZHIgPSB7CkBAIC0xODgyLDcgKzE4ODIsNyBAQAogLyoKICAqIGEgUEFUSENPTkYgcmVxdWVzdAogICovCi1zdGF0aWMgaW50IG5mczRfeGRyX2VuY19wYXRoY29uZihzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwgdWludDMyX3QgKnAsIGNvbnN0IHN0cnVjdCBuZnM0X3BhdGhjb25mX2FyZyAqYXJncykKK3N0YXRpYyBpbnQgbmZzNF94ZHJfZW5jX3BhdGhjb25mKHN0cnVjdCBycGNfcnFzdCAqcmVxLCBfX2JlMzIgKnAsIGNvbnN0IHN0cnVjdCBuZnM0X3BhdGhjb25mX2FyZyAqYXJncykKIHsKIAlzdHJ1Y3QgeGRyX3N0cmVhbSB4ZHI7CiAJc3RydWN0IGNvbXBvdW5kX2hkciBoZHIgPSB7CkBAIC0xOTAyLDcgKzE5MDIsNyBAQAogLyoKICAqIGEgU1RBVEZTIHJlcXVlc3QKICAqLwotc3RhdGljIGludCBuZnM0X3hkcl9lbmNfc3RhdGZzKHN0cnVjdCBycGNfcnFzdCAqcmVxLCB1aW50MzJfdCAqcCwgY29uc3Qgc3RydWN0IG5mczRfc3RhdGZzX2FyZyAqYXJncykKK3N0YXRpYyBpbnQgbmZzNF94ZHJfZW5jX3N0YXRmcyhzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwgX19iZTMyICpwLCBjb25zdCBzdHJ1Y3QgbmZzNF9zdGF0ZnNfYXJnICphcmdzKQogewogCXN0cnVjdCB4ZHJfc3RyZWFtIHhkcjsKIAlzdHJ1Y3QgY29tcG91bmRfaGRyIGhkciA9IHsKQEAgLTE5MjMsNyArMTkyMyw3IEBACiAvKgogICogR0VUQVRUUl9CSVRNQVAgcmVxdWVzdAogICovCi1zdGF0aWMgaW50IG5mczRfeGRyX2VuY19zZXJ2ZXJfY2FwcyhzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwgdWludDMyX3QgKnAsIGNvbnN0IHN0cnVjdCBuZnNfZmggKmZoYW5kbGUpCitzdGF0aWMgaW50IG5mczRfeGRyX2VuY19zZXJ2ZXJfY2FwcyhzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwgX19iZTMyICpwLCBjb25zdCBzdHJ1Y3QgbmZzX2ZoICpmaGFuZGxlKQogewogCXN0cnVjdCB4ZHJfc3RyZWFtIHhkcjsKIAlzdHJ1Y3QgY29tcG91bmRfaGRyIGhkciA9IHsKQEAgLTE5NDUsNyArMTk0NSw3IEBACiAvKgogICogYSBSRU5FVyByZXF1ZXN0CiAgKi8KLXN0YXRpYyBpbnQgbmZzNF94ZHJfZW5jX3JlbmV3KHN0cnVjdCBycGNfcnFzdCAqcmVxLCB1aW50MzJfdCAqcCwgc3RydWN0IG5mc19jbGllbnQgKmNscCkKK3N0YXRpYyBpbnQgbmZzNF94ZHJfZW5jX3JlbmV3KHN0cnVjdCBycGNfcnFzdCAqcmVxLCBfX2JlMzIgKnAsIHN0cnVjdCBuZnNfY2xpZW50ICpjbHApCiB7CiAJc3RydWN0IHhkcl9zdHJlYW0geGRyOwogCXN0cnVjdCBjb21wb3VuZF9oZHIgaGRyID0gewpAQCAtMTk2MCw3ICsxOTYwLDcgQEAKIC8qCiAgKiBhIFNFVENMSUVOVElEIHJlcXVlc3QKICAqLwotc3RhdGljIGludCBuZnM0X3hkcl9lbmNfc2V0Y2xpZW50aWQoc3RydWN0IHJwY19ycXN0ICpyZXEsIHVpbnQzMl90ICpwLCBzdHJ1Y3QgbmZzNF9zZXRjbGllbnRpZCAqc2MpCitzdGF0aWMgaW50IG5mczRfeGRyX2VuY19zZXRjbGllbnRpZChzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwgX19iZTMyICpwLCBzdHJ1Y3QgbmZzNF9zZXRjbGllbnRpZCAqc2MpCiB7CiAJc3RydWN0IHhkcl9zdHJlYW0geGRyOwogCXN0cnVjdCBjb21wb3VuZF9oZHIgaGRyID0gewpAQCAtMTk3NSw3ICsxOTc1LDcgQEAKIC8qCiAgKiBhIFNFVENMSUVOVElEX0NPTkZJUk0gcmVxdWVzdAogICovCi1zdGF0aWMgaW50IG5mczRfeGRyX2VuY19zZXRjbGllbnRpZF9jb25maXJtKHN0cnVjdCBycGNfcnFzdCAqcmVxLCB1aW50MzJfdCAqcCwgc3RydWN0IG5mc19jbGllbnQgKmNscCkKK3N0YXRpYyBpbnQgbmZzNF94ZHJfZW5jX3NldGNsaWVudGlkX2NvbmZpcm0oc3RydWN0IHJwY19ycXN0ICpyZXEsIF9fYmUzMiAqcCwgc3RydWN0IG5mc19jbGllbnQgKmNscCkKIHsKIAlzdHJ1Y3QgeGRyX3N0cmVhbSB4ZHI7CiAJc3RydWN0IGNvbXBvdW5kX2hkciBoZHIgPSB7CkBAIC0xOTk3LDcgKzE5OTcsNyBAQAogLyoKICAqIERFTEVHUkVUVVJOIHJlcXVlc3QKICAqLwotc3RhdGljIGludCBuZnM0X3hkcl9lbmNfZGVsZWdyZXR1cm4oc3RydWN0IHJwY19ycXN0ICpyZXEsIHVpbnQzMl90ICpwLCBjb25zdCBzdHJ1Y3QgbmZzNF9kZWxlZ3JldHVybmFyZ3MgKmFyZ3MpCitzdGF0aWMgaW50IG5mczRfeGRyX2VuY19kZWxlZ3JldHVybihzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwgX19iZTMyICpwLCBjb25zdCBzdHJ1Y3QgbmZzNF9kZWxlZ3JldHVybmFyZ3MgKmFyZ3MpCiB7CiAJc3RydWN0IHhkcl9zdHJlYW0geGRyOwogCXN0cnVjdCBjb21wb3VuZF9oZHIgaGRyID0gewpAQCAtMjAyMSw3ICsyMDIxLDcgQEAKIC8qCiAgKiBFbmNvZGUgRlNfTE9DQVRJT05TIHJlcXVlc3QKICAqLwotc3RhdGljIGludCBuZnM0X3hkcl9lbmNfZnNfbG9jYXRpb25zKHN0cnVjdCBycGNfcnFzdCAqcmVxLCB1aW50MzJfdCAqcCwgc3RydWN0IG5mczRfZnNfbG9jYXRpb25zX2FyZyAqYXJncykKK3N0YXRpYyBpbnQgbmZzNF94ZHJfZW5jX2ZzX2xvY2F0aW9ucyhzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwgX19iZTMyICpwLCBzdHJ1Y3QgbmZzNF9mc19sb2NhdGlvbnNfYXJnICphcmdzKQogewogCXN0cnVjdCB4ZHJfc3RyZWFtIHhkcjsKIAlzdHJ1Y3QgY29tcG91bmRfaGRyIGhkciA9IHsKQEAgLTIwODYsNyArMjA4Niw3IEBACiAKIHN0YXRpYyBpbnQgZGVjb2RlX29wYXF1ZV9pbmxpbmUoc3RydWN0IHhkcl9zdHJlYW0gKnhkciwgdW5zaWduZWQgaW50ICpsZW4sIGNoYXIgKipzdHJpbmcpCiB7Ci0JdWludDMyX3QgKnA7CisJX19iZTMyICpwOwogCiAJUkVBRF9CVUYoNCk7CiAJUkVBRDMyKCpsZW4pOwpAQCAtMjA5Nyw3ICsyMDk3LDcgQEAKIAogc3RhdGljIGludCBkZWNvZGVfY29tcG91bmRfaGRyKHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsIHN0cnVjdCBjb21wb3VuZF9oZHIgKmhkcikKIHsKLQl1aW50MzJfdCAqcDsKKwlfX2JlMzIgKnA7CiAKIAlSRUFEX0JVRig4KTsKIAlSRUFEMzIoaGRyLT5zdGF0dXMpOwpAQCAtMjExMiw3ICsyMTEyLDcgQEAKIAogc3RhdGljIGludCBkZWNvZGVfb3BfaGRyKHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsIGVudW0gbmZzX29wbnVtNCBleHBlY3RlZCkKIHsKLQl1aW50MzJfdCAqcDsKKwlfX2JlMzIgKnA7CiAJdWludDMyX3Qgb3BudW07CiAJaW50MzJfdCBuZnNlcnI7CiAKQEAgLTIxMzQsNyArMjEzNCw3IEBACiAvKiBEdW1teSByb3V0aW5lICovCiBzdGF0aWMgaW50IGRlY29kZV9hY2Uoc3RydWN0IHhkcl9zdHJlYW0gKnhkciwgdm9pZCAqYWNlLCBzdHJ1Y3QgbmZzX2NsaWVudCAqY2xwKQogewotCXVpbnQzMl90ICpwOworCV9fYmUzMiAqcDsKIAl1bnNpZ25lZCBpbnQgc3RybGVuOwogCWNoYXIgKnN0cjsKIApAQCAtMjE0NCw3ICsyMTQ0LDggQEAKIAogc3RhdGljIGludCBkZWNvZGVfYXR0cl9iaXRtYXAoc3RydWN0IHhkcl9zdHJlYW0gKnhkciwgdWludDMyX3QgKmJpdG1hcCkKIHsKLQl1aW50MzJfdCBibWxlbiwgKnA7CisJdWludDMyX3QgYm1sZW47CisJX19iZTMyICpwOwogCiAJUkVBRF9CVUYoNCk7CiAJUkVBRDMyKGJtbGVuKTsKQEAgLTIxNTksOSArMjE2MCw5IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbmxpbmUgaW50IGRlY29kZV9hdHRyX2xlbmd0aChzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLCB1aW50MzJfdCAqYXR0cmxlbiwgdWludDMyX3QgKipzYXZlcCkKK3N0YXRpYyBpbmxpbmUgaW50IGRlY29kZV9hdHRyX2xlbmd0aChzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLCB1aW50MzJfdCAqYXR0cmxlbiwgX19iZTMyICoqc2F2ZXApCiB7Ci0JdWludDMyX3QgKnA7CisJX19iZTMyICpwOwogCiAJUkVBRF9CVUYoNCk7CiAJUkVBRDMyKCphdHRybGVuKTsKQEAgLTIxODIsNyArMjE4Myw3IEBACiAKIHN0YXRpYyBpbnQgZGVjb2RlX2F0dHJfdHlwZShzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLCB1aW50MzJfdCAqYml0bWFwLCB1aW50MzJfdCAqdHlwZSkKIHsKLQl1aW50MzJfdCAqcDsKKwlfX2JlMzIgKnA7CiAKIAkqdHlwZSA9IDA7CiAJaWYgKHVubGlrZWx5KGJpdG1hcFswXSAmIChGQVRUUjRfV09SRDBfVFlQRSAtIDFVKSkpCkBAIC0yMjAyLDcgKzIyMDMsNyBAQAogCiBzdGF0aWMgaW50IGRlY29kZV9hdHRyX2NoYW5nZShzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLCB1aW50MzJfdCAqYml0bWFwLCB1aW50NjRfdCAqY2hhbmdlKQogewotCXVpbnQzMl90ICpwOworCV9fYmUzMiAqcDsKIAogCSpjaGFuZ2UgPSAwOwogCWlmICh1bmxpa2VseShiaXRtYXBbMF0gJiAoRkFUVFI0X1dPUkQwX0NIQU5HRSAtIDFVKSkpCkBAIC0yMjE5LDcgKzIyMjAsNyBAQAogCiBzdGF0aWMgaW50IGRlY29kZV9hdHRyX3NpemUoc3RydWN0IHhkcl9zdHJlYW0gKnhkciwgdWludDMyX3QgKmJpdG1hcCwgdWludDY0X3QgKnNpemUpCiB7Ci0JdWludDMyX3QgKnA7CisJX19iZTMyICpwOwogCiAJKnNpemUgPSAwOwogCWlmICh1bmxpa2VseShiaXRtYXBbMF0gJiAoRkFUVFI0X1dPUkQwX1NJWkUgLSAxVSkpKQpAQCAtMjIzNSw3ICsyMjM2LDcgQEAKIAogc3RhdGljIGludCBkZWNvZGVfYXR0cl9saW5rX3N1cHBvcnQoc3RydWN0IHhkcl9zdHJlYW0gKnhkciwgdWludDMyX3QgKmJpdG1hcCwgdWludDMyX3QgKnJlcykKIHsKLQl1aW50MzJfdCAqcDsKKwlfX2JlMzIgKnA7CiAKIAkqcmVzID0gMDsKIAlpZiAodW5saWtlbHkoYml0bWFwWzBdICYgKEZBVFRSNF9XT1JEMF9MSU5LX1NVUFBPUlQgLSAxVSkpKQpAQCAtMjI1MSw3ICsyMjUyLDcgQEAKIAogc3RhdGljIGludCBkZWNvZGVfYXR0cl9zeW1saW5rX3N1cHBvcnQoc3RydWN0IHhkcl9zdHJlYW0gKnhkciwgdWludDMyX3QgKmJpdG1hcCwgdWludDMyX3QgKnJlcykKIHsKLQl1aW50MzJfdCAqcDsKKwlfX2JlMzIgKnA7CiAKIAkqcmVzID0gMDsKIAlpZiAodW5saWtlbHkoYml0bWFwWzBdICYgKEZBVFRSNF9XT1JEMF9TWU1MSU5LX1NVUFBPUlQgLSAxVSkpKQpAQCAtMjI2Nyw3ICsyMjY4LDcgQEAKIAogc3RhdGljIGludCBkZWNvZGVfYXR0cl9mc2lkKHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsIHVpbnQzMl90ICpiaXRtYXAsIHN0cnVjdCBuZnNfZnNpZCAqZnNpZCkKIHsKLQl1aW50MzJfdCAqcDsKKwlfX2JlMzIgKnA7CiAKIAlmc2lkLT5tYWpvciA9IDA7CiAJZnNpZC0+bWlub3IgPSAwOwpAQCAtMjI4Nyw3ICsyMjg4LDcgQEAKIAogc3RhdGljIGludCBkZWNvZGVfYXR0cl9sZWFzZV90aW1lKHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsIHVpbnQzMl90ICpiaXRtYXAsIHVpbnQzMl90ICpyZXMpCiB7Ci0JdWludDMyX3QgKnA7CisJX19iZTMyICpwOwogCiAJKnJlcyA9IDYwOwogCWlmICh1bmxpa2VseShiaXRtYXBbMF0gJiAoRkFUVFI0X1dPUkQwX0xFQVNFX1RJTUUgLSAxVSkpKQpAQCAtMjMwMyw3ICsyMzA0LDcgQEAKIAogc3RhdGljIGludCBkZWNvZGVfYXR0cl9hY2xzdXBwb3J0KHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsIHVpbnQzMl90ICpiaXRtYXAsIHVpbnQzMl90ICpyZXMpCiB7Ci0JdWludDMyX3QgKnA7CisJX19iZTMyICpwOwogCiAJKnJlcyA9IEFDTDRfU1VQUE9SVF9BTExPV19BQ0x8QUNMNF9TVVBQT1JUX0RFTllfQUNMOwogCWlmICh1bmxpa2VseShiaXRtYXBbMF0gJiAoRkFUVFI0X1dPUkQwX0FDTFNVUFBPUlQgLSAxVSkpKQpAQCAtMjMxOSw3ICsyMzIwLDcgQEAKIAogc3RhdGljIGludCBkZWNvZGVfYXR0cl9maWxlaWQoc3RydWN0IHhkcl9zdHJlYW0gKnhkciwgdWludDMyX3QgKmJpdG1hcCwgdWludDY0X3QgKmZpbGVpZCkKIHsKLQl1aW50MzJfdCAqcDsKKwlfX2JlMzIgKnA7CiAKIAkqZmlsZWlkID0gMDsKIAlpZiAodW5saWtlbHkoYml0bWFwWzBdICYgKEZBVFRSNF9XT1JEMF9GSUxFSUQgLSAxVSkpKQpAQCAtMjMzNSw3ICsyMzM2LDcgQEAKIAogc3RhdGljIGludCBkZWNvZGVfYXR0cl9tb3VudGVkX29uX2ZpbGVpZChzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLCB1aW50MzJfdCAqYml0bWFwLCB1aW50NjRfdCAqZmlsZWlkKQogewotCXVpbnQzMl90ICpwOworCV9fYmUzMiAqcDsKIAogCSpmaWxlaWQgPSAwOwogCWlmICh1bmxpa2VseShiaXRtYXBbMV0gJiAoRkFUVFI0X1dPUkQxX01PVU5URURfT05fRklMRUlEIC0gMVUpKSkKQEAgLTIzNTEsNyArMjM1Miw3IEBACiAKIHN0YXRpYyBpbnQgZGVjb2RlX2F0dHJfZmlsZXNfYXZhaWwoc3RydWN0IHhkcl9zdHJlYW0gKnhkciwgdWludDMyX3QgKmJpdG1hcCwgdWludDY0X3QgKnJlcykKIHsKLQl1aW50MzJfdCAqcDsKKwlfX2JlMzIgKnA7CiAJaW50IHN0YXR1cyA9IDA7CiAKIAkqcmVzID0gMDsKQEAgLTIzNjgsNyArMjM2OSw3IEBACiAKIHN0YXRpYyBpbnQgZGVjb2RlX2F0dHJfZmlsZXNfZnJlZShzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLCB1aW50MzJfdCAqYml0bWFwLCB1aW50NjRfdCAqcmVzKQogewotCXVpbnQzMl90ICpwOworCV9fYmUzMiAqcDsKIAlpbnQgc3RhdHVzID0gMDsKIAogCSpyZXMgPSAwOwpAQCAtMjM4NSw3ICsyMzg2LDcgQEAKIAogc3RhdGljIGludCBkZWNvZGVfYXR0cl9maWxlc190b3RhbChzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLCB1aW50MzJfdCAqYml0bWFwLCB1aW50NjRfdCAqcmVzKQogewotCXVpbnQzMl90ICpwOworCV9fYmUzMiAqcDsKIAlpbnQgc3RhdHVzID0gMDsKIAogCSpyZXMgPSAwOwpAQCAtMjQwMyw3ICsyNDA0LDcgQEAKIHN0YXRpYyBpbnQgZGVjb2RlX3BhdGhuYW1lKHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsIHN0cnVjdCBuZnM0X3BhdGhuYW1lICpwYXRoKQogewogCWludCBuOwotCXVpbnQzMl90ICpwOworCV9fYmUzMiAqcDsKIAlpbnQgc3RhdHVzID0gMDsKIAogCVJFQURfQlVGKDQpOwpAQCAtMjQ0OCw3ICsyNDQ5LDcgQEAKIHN0YXRpYyBpbnQgZGVjb2RlX2F0dHJfZnNfbG9jYXRpb25zKHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsIHVpbnQzMl90ICpiaXRtYXAsIHN0cnVjdCBuZnM0X2ZzX2xvY2F0aW9ucyAqcmVzKQogewogCWludCBuOwotCXVpbnQzMl90ICpwOworCV9fYmUzMiAqcDsKIAlpbnQgc3RhdHVzID0gLUVJTzsKIAogCWlmICh1bmxpa2VseShiaXRtYXBbMF0gJiAoRkFUVFI0X1dPUkQwX0ZTX0xPQ0FUSU9OUyAtMVUpKSkKQEAgLTI1MTIsNyArMjUxMyw3IEBACiAKIHN0YXRpYyBpbnQgZGVjb2RlX2F0dHJfbWF4ZmlsZXNpemUoc3RydWN0IHhkcl9zdHJlYW0gKnhkciwgdWludDMyX3QgKmJpdG1hcCwgdWludDY0X3QgKnJlcykKIHsKLQl1aW50MzJfdCAqcDsKKwlfX2JlMzIgKnA7CiAJaW50IHN0YXR1cyA9IDA7CiAKIAkqcmVzID0gMDsKQEAgLTI1MjksNyArMjUzMCw3IEBACiAKIHN0YXRpYyBpbnQgZGVjb2RlX2F0dHJfbWF4bGluayhzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLCB1aW50MzJfdCAqYml0bWFwLCB1aW50MzJfdCAqbWF4bGluaykKIHsKLQl1aW50MzJfdCAqcDsKKwlfX2JlMzIgKnA7CiAJaW50IHN0YXR1cyA9IDA7CiAKIAkqbWF4bGluayA9IDE7CkBAIC0yNTQ2LDcgKzI1NDcsNyBAQAogCiBzdGF0aWMgaW50IGRlY29kZV9hdHRyX21heG5hbWUoc3RydWN0IHhkcl9zdHJlYW0gKnhkciwgdWludDMyX3QgKmJpdG1hcCwgdWludDMyX3QgKm1heG5hbWUpCiB7Ci0JdWludDMyX3QgKnA7CisJX19iZTMyICpwOwogCWludCBzdGF0dXMgPSAwOwogCiAJKm1heG5hbWUgPSAxMDI0OwpAQCAtMjU2Myw3ICsyNTY0LDcgQEAKIAogc3RhdGljIGludCBkZWNvZGVfYXR0cl9tYXhyZWFkKHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsIHVpbnQzMl90ICpiaXRtYXAsIHVpbnQzMl90ICpyZXMpCiB7Ci0JdWludDMyX3QgKnA7CisJX19iZTMyICpwOwogCWludCBzdGF0dXMgPSAwOwogCiAJKnJlcyA9IDEwMjQ7CkBAIC0yNTg0LDcgKzI1ODUsNyBAQAogCiBzdGF0aWMgaW50IGRlY29kZV9hdHRyX21heHdyaXRlKHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsIHVpbnQzMl90ICpiaXRtYXAsIHVpbnQzMl90ICpyZXMpCiB7Ci0JdWludDMyX3QgKnA7CisJX19iZTMyICpwOwogCWludCBzdGF0dXMgPSAwOwogCiAJKnJlcyA9IDEwMjQ7CkBAIC0yNjA1LDcgKzI2MDYsNyBAQAogCiBzdGF0aWMgaW50IGRlY29kZV9hdHRyX21vZGUoc3RydWN0IHhkcl9zdHJlYW0gKnhkciwgdWludDMyX3QgKmJpdG1hcCwgdWludDMyX3QgKm1vZGUpCiB7Ci0JdWludDMyX3QgKnA7CisJX19iZTMyICpwOwogCiAJKm1vZGUgPSAwOwogCWlmICh1bmxpa2VseShiaXRtYXBbMV0gJiAoRkFUVFI0X1dPUkQxX01PREUgLSAxVSkpKQpAQCAtMjYyMiw3ICsyNjIzLDcgQEAKIAogc3RhdGljIGludCBkZWNvZGVfYXR0cl9ubGluayhzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLCB1aW50MzJfdCAqYml0bWFwLCB1aW50MzJfdCAqbmxpbmspCiB7Ci0JdWludDMyX3QgKnA7CisJX19iZTMyICpwOwogCiAJKm5saW5rID0gMTsKIAlpZiAodW5saWtlbHkoYml0bWFwWzFdICYgKEZBVFRSNF9XT1JEMV9OVU1MSU5LUyAtIDFVKSkpCkBAIC0yNjM4LDcgKzI2MzksOCBAQAogCiBzdGF0aWMgaW50IGRlY29kZV9hdHRyX293bmVyKHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsIHVpbnQzMl90ICpiaXRtYXAsIHN0cnVjdCBuZnNfY2xpZW50ICpjbHAsIGludDMyX3QgKnVpZCkKIHsKLQl1aW50MzJfdCBsZW4sICpwOworCXVpbnQzMl90IGxlbjsKKwlfX2JlMzIgKnA7CiAKIAkqdWlkID0gLTI7CiAJaWYgKHVubGlrZWx5KGJpdG1hcFsxXSAmIChGQVRUUjRfV09SRDFfT1dORVIgLSAxVSkpKQpAQCAtMjY2Miw3ICsyNjY0LDggQEAKIAogc3RhdGljIGludCBkZWNvZGVfYXR0cl9ncm91cChzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLCB1aW50MzJfdCAqYml0bWFwLCBzdHJ1Y3QgbmZzX2NsaWVudCAqY2xwLCBpbnQzMl90ICpnaWQpCiB7Ci0JdWludDMyX3QgbGVuLCAqcDsKKwl1aW50MzJfdCBsZW47CisJX19iZTMyICpwOwogCiAJKmdpZCA9IC0yOwogCWlmICh1bmxpa2VseShiaXRtYXBbMV0gJiAoRkFUVFI0X1dPUkQxX09XTkVSX0dST1VQIC0gMVUpKSkKQEAgLTI2ODYsNyArMjY4OSw4IEBACiAKIHN0YXRpYyBpbnQgZGVjb2RlX2F0dHJfcmRldihzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLCB1aW50MzJfdCAqYml0bWFwLCBkZXZfdCAqcmRldikKIHsKLQl1aW50MzJfdCBtYWpvciA9IDAsIG1pbm9yID0gMCwgKnA7CisJdWludDMyX3QgbWFqb3IgPSAwLCBtaW5vciA9IDA7CisJX19iZTMyICpwOwogCiAJKnJkZXYgPSBNS0RFVigwLDApOwogCWlmICh1bmxpa2VseShiaXRtYXBbMV0gJiAoRkFUVFI0X1dPUkQxX1JBV0RFViAtIDFVKSkpCkBAIC0yNzA4LDcgKzI3MTIsNyBAQAogCiBzdGF0aWMgaW50IGRlY29kZV9hdHRyX3NwYWNlX2F2YWlsKHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsIHVpbnQzMl90ICpiaXRtYXAsIHVpbnQ2NF90ICpyZXMpCiB7Ci0JdWludDMyX3QgKnA7CisJX19iZTMyICpwOwogCWludCBzdGF0dXMgPSAwOwogCiAJKnJlcyA9IDA7CkBAIC0yNzI1LDcgKzI3MjksNyBAQAogCiBzdGF0aWMgaW50IGRlY29kZV9hdHRyX3NwYWNlX2ZyZWUoc3RydWN0IHhkcl9zdHJlYW0gKnhkciwgdWludDMyX3QgKmJpdG1hcCwgdWludDY0X3QgKnJlcykKIHsKLQl1aW50MzJfdCAqcDsKKwlfX2JlMzIgKnA7CiAJaW50IHN0YXR1cyA9IDA7CiAKIAkqcmVzID0gMDsKQEAgLTI3NDIsNyArMjc0Niw3IEBACiAKIHN0YXRpYyBpbnQgZGVjb2RlX2F0dHJfc3BhY2VfdG90YWwoc3RydWN0IHhkcl9zdHJlYW0gKnhkciwgdWludDMyX3QgKmJpdG1hcCwgdWludDY0X3QgKnJlcykKIHsKLQl1aW50MzJfdCAqcDsKKwlfX2JlMzIgKnA7CiAJaW50IHN0YXR1cyA9IDA7CiAKIAkqcmVzID0gMDsKQEAgLTI3NTksNyArMjc2Myw3IEBACiAKIHN0YXRpYyBpbnQgZGVjb2RlX2F0dHJfc3BhY2VfdXNlZChzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLCB1aW50MzJfdCAqYml0bWFwLCB1aW50NjRfdCAqdXNlZCkKIHsKLQl1aW50MzJfdCAqcDsKKwlfX2JlMzIgKnA7CiAKIAkqdXNlZCA9IDA7CiAJaWYgKHVubGlrZWx5KGJpdG1hcFsxXSAmIChGQVRUUjRfV09SRDFfU1BBQ0VfVVNFRCAtIDFVKSkpCkBAIC0yNzc2LDcgKzI3ODAsNyBAQAogCiBzdGF0aWMgaW50IGRlY29kZV9hdHRyX3RpbWUoc3RydWN0IHhkcl9zdHJlYW0gKnhkciwgc3RydWN0IHRpbWVzcGVjICp0aW1lKQogewotCXVpbnQzMl90ICpwOworCV9fYmUzMiAqcDsKIAl1aW50NjRfdCBzZWM7CiAJdWludDMyX3QgbnNlYzsKIApAQCAtMjgzNiw3ICsyODQwLDcgQEAKIAlyZXR1cm4gc3RhdHVzOwogfQogCi1zdGF0aWMgaW50IHZlcmlmeV9hdHRyX2xlbihzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLCB1aW50MzJfdCAqc2F2ZXAsIHVpbnQzMl90IGF0dHJsZW4pCitzdGF0aWMgaW50IHZlcmlmeV9hdHRyX2xlbihzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLCBfX2JlMzIgKnNhdmVwLCB1aW50MzJfdCBhdHRybGVuKQogewogCXVuc2lnbmVkIGludCBhdHRyd29yZHMgPSBYRFJfUVVBRExFTihhdHRybGVuKTsKIAl1bnNpZ25lZCBpbnQgbndvcmRzID0geGRyLT5wIC0gc2F2ZXA7CkBAIC0yODU0LDcgKzI4NTgsNyBAQAogCiBzdGF0aWMgaW50IGRlY29kZV9jaGFuZ2VfaW5mbyhzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLCBzdHJ1Y3QgbmZzNF9jaGFuZ2VfaW5mbyAqY2luZm8pCiB7Ci0JdWludDMyX3QgKnA7CisJX19iZTMyICpwOwogCiAJUkVBRF9CVUYoMjApOwogCVJFQUQzMihjaW5mby0+YXRvbWljKTsKQEAgLTI4NjUsNyArMjg2OSw3IEBACiAKIHN0YXRpYyBpbnQgZGVjb2RlX2FjY2VzcyhzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLCBzdHJ1Y3QgbmZzNF9hY2Nlc3NyZXMgKmFjY2VzcykKIHsKLQl1aW50MzJfdCAqcDsKKwlfX2JlMzIgKnA7CiAJdWludDMyX3Qgc3VwcCwgYWNjOwogCWludCBzdGF0dXM7CiAKQEAgLTI4ODIsNyArMjg4Niw3IEBACiAKIHN0YXRpYyBpbnQgZGVjb2RlX2Nsb3NlKHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsIHN0cnVjdCBuZnNfY2xvc2VyZXMgKnJlcykKIHsKLQl1aW50MzJfdCAqcDsKKwlfX2JlMzIgKnA7CiAJaW50IHN0YXR1czsKIAogCXN0YXR1cyA9IGRlY29kZV9vcF9oZHIoeGRyLCBPUF9DTE9TRSk7CkBAIC0yODk1LDcgKzI4OTksNyBAQAogCiBzdGF0aWMgaW50IGRlY29kZV9jb21taXQoc3RydWN0IHhkcl9zdHJlYW0gKnhkciwgc3RydWN0IG5mc193cml0ZXJlcyAqcmVzKQogewotCXVpbnQzMl90ICpwOworCV9fYmUzMiAqcDsKIAlpbnQgc3RhdHVzOwogCiAJc3RhdHVzID0gZGVjb2RlX29wX2hkcih4ZHIsIE9QX0NPTU1JVCk7CkBAIC0yOTA4LDcgKzI5MTIsNyBAQAogCiBzdGF0aWMgaW50IGRlY29kZV9jcmVhdGUoc3RydWN0IHhkcl9zdHJlYW0gKnhkciwgc3RydWN0IG5mczRfY2hhbmdlX2luZm8gKmNpbmZvKQogewotCXVpbnQzMl90ICpwOworCV9fYmUzMiAqcDsKIAl1aW50MzJfdCBibWxlbjsKIAlpbnQgc3RhdHVzOwogCkBAIC0yOTI1LDcgKzI5MjksNyBAQAogCiBzdGF0aWMgaW50IGRlY29kZV9zZXJ2ZXJfY2FwcyhzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLCBzdHJ1Y3QgbmZzNF9zZXJ2ZXJfY2Fwc19yZXMgKnJlcykKIHsKLQl1aW50MzJfdCAqc2F2ZXA7CisJX19iZTMyICpzYXZlcDsKIAl1aW50MzJfdCBhdHRybGVuLCAKIAkJIGJpdG1hcFsyXSA9IHswfTsKIAlpbnQgc3RhdHVzOwpAQCAtMjk1Miw3ICsyOTU2LDcgQEAKIAkKIHN0YXRpYyBpbnQgZGVjb2RlX3N0YXRmcyhzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLCBzdHJ1Y3QgbmZzX2Zzc3RhdCAqZnNzdGF0KQogewotCXVpbnQzMl90ICpzYXZlcDsKKwlfX2JlMzIgKnNhdmVwOwogCXVpbnQzMl90IGF0dHJsZW4sIAogCQkgYml0bWFwWzJdID0gezB9OwogCWludCBzdGF0dXM7CkBAIC0yOTg1LDcgKzI5ODksNyBAQAogCiBzdGF0aWMgaW50IGRlY29kZV9wYXRoY29uZihzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLCBzdHJ1Y3QgbmZzX3BhdGhjb25mICpwYXRoY29uZikKIHsKLQl1aW50MzJfdCAqc2F2ZXA7CisJX19iZTMyICpzYXZlcDsKIAl1aW50MzJfdCBhdHRybGVuLCAKIAkJIGJpdG1hcFsyXSA9IHswfTsKIAlpbnQgc3RhdHVzOwpAQCAtMzAxMCw3ICszMDE0LDcgQEAKIAogc3RhdGljIGludCBkZWNvZGVfZ2V0ZmF0dHIoc3RydWN0IHhkcl9zdHJlYW0gKnhkciwgc3RydWN0IG5mc19mYXR0ciAqZmF0dHIsIGNvbnN0IHN0cnVjdCBuZnNfc2VydmVyICpzZXJ2ZXIpCiB7Ci0JdWludDMyX3QgKnNhdmVwOworCV9fYmUzMiAqc2F2ZXA7CiAJdWludDMyX3QgYXR0cmxlbiwKIAkJIGJpdG1hcFsyXSA9IHswfSwKIAkJIHR5cGU7CkBAIC0zMDc5LDcgKzMwODMsNyBAQAogCiBzdGF0aWMgaW50IGRlY29kZV9mc2luZm8oc3RydWN0IHhkcl9zdHJlYW0gKnhkciwgc3RydWN0IG5mc19mc2luZm8gKmZzaW5mbykKIHsKLQl1aW50MzJfdCAqc2F2ZXA7CisJX19iZTMyICpzYXZlcDsKIAl1aW50MzJfdCBhdHRybGVuLCBiaXRtYXBbMl07CiAJaW50IHN0YXR1czsKIApAQCAtMzExMSw3ICszMTE1LDcgQEAKIAogc3RhdGljIGludCBkZWNvZGVfZ2V0Zmgoc3RydWN0IHhkcl9zdHJlYW0gKnhkciwgc3RydWN0IG5mc19maCAqZmgpCiB7Ci0JdWludDMyX3QgKnA7CisJX19iZTMyICpwOwogCXVpbnQzMl90IGxlbjsKIAlpbnQgc3RhdHVzOwogCkBAIC0zMTQ3LDcgKzMxNTEsNyBAQAogc3RhdGljIGludCBkZWNvZGVfbG9ja19kZW5pZWQgKHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsIHN0cnVjdCBmaWxlX2xvY2sgKmZsKQogewogCXVpbnQ2NF90IG9mZnNldCwgbGVuZ3RoLCBjbGllbnRpZDsKLQl1aW50MzJfdCAqcDsKKwlfX2JlMzIgKnA7CiAJdWludDMyX3QgbmFtZWxlbiwgdHlwZTsKIAogCVJFQURfQlVGKDMyKTsKQEAgLTMxNzIsNyArMzE3Niw3IEBACiAKIHN0YXRpYyBpbnQgZGVjb2RlX2xvY2soc3RydWN0IHhkcl9zdHJlYW0gKnhkciwgc3RydWN0IG5mc19sb2NrX3JlcyAqcmVzKQogewotCXVpbnQzMl90ICpwOworCV9fYmUzMiAqcDsKIAlpbnQgc3RhdHVzOwogCiAJc3RhdHVzID0gZGVjb2RlX29wX2hkcih4ZHIsIE9QX0xPQ0spOwpAQCAtMzE5NSw3ICszMTk5LDcgQEAKIAogc3RhdGljIGludCBkZWNvZGVfbG9ja3Uoc3RydWN0IHhkcl9zdHJlYW0gKnhkciwgc3RydWN0IG5mc19sb2NrdV9yZXMgKnJlcykKIHsKLQl1aW50MzJfdCAqcDsKKwlfX2JlMzIgKnA7CiAJaW50IHN0YXR1czsKIAogCXN0YXR1cyA9IGRlY29kZV9vcF9oZHIoeGRyLCBPUF9MT0NLVSk7CkBAIC0zMjE0LDcgKzMyMTgsNyBAQAogLyogVGhpcyBpcyB0b28gc2ljayEgKi8KIHN0YXRpYyBpbnQgZGVjb2RlX3NwYWNlX2xpbWl0KHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsIHU2NCAqbWF4c2l6ZSkKIHsKLSAgICAgICAgdWludDMyX3QgKnA7CisgICAgICAgIF9fYmUzMiAqcDsKIAl1aW50MzJfdCBsaW1pdF90eXBlLCBuYmxvY2tzLCBibG9ja3NpemU7CiAKIAlSRUFEX0JVRigxMik7CkBAIC0zMjMzLDcgKzMyMzcsNyBAQAogCiBzdGF0aWMgaW50IGRlY29kZV9kZWxlZ2F0aW9uKHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsIHN0cnVjdCBuZnNfb3BlbnJlcyAqcmVzKQogewotICAgICAgICB1aW50MzJfdCAqcDsKKyAgICAgICAgX19iZTMyICpwOwogICAgICAgICB1aW50MzJfdCBkZWxlZ2F0aW9uX3R5cGU7CiAKIAlSRUFEX0JVRig0KTsKQEAgLTMyNTksNyArMzI2Myw3IEBACiAKIHN0YXRpYyBpbnQgZGVjb2RlX29wZW4oc3RydWN0IHhkcl9zdHJlYW0gKnhkciwgc3RydWN0IG5mc19vcGVucmVzICpyZXMpCiB7Ci0gICAgICAgIHVpbnQzMl90ICpwOworICAgICAgICBfX2JlMzIgKnA7CiAgICAgICAgIHVpbnQzMl90IGJtbGVuOwogICAgICAgICBpbnQgc3RhdHVzOwogCkBAIC0zMjg3LDcgKzMyOTEsNyBAQAogCiBzdGF0aWMgaW50IGRlY29kZV9vcGVuX2NvbmZpcm0oc3RydWN0IHhkcl9zdHJlYW0gKnhkciwgc3RydWN0IG5mc19vcGVuX2NvbmZpcm1yZXMgKnJlcykKIHsKLSAgICAgICAgdWludDMyX3QgKnA7CisgICAgICAgIF9fYmUzMiAqcDsKIAlpbnQgc3RhdHVzOwogCiAgICAgICAgIHN0YXR1cyA9IGRlY29kZV9vcF9oZHIoeGRyLCBPUF9PUEVOX0NPTkZJUk0pOwpAQCAtMzMwMCw3ICszMzA0LDcgQEAKIAogc3RhdGljIGludCBkZWNvZGVfb3Blbl9kb3duZ3JhZGUoc3RydWN0IHhkcl9zdHJlYW0gKnhkciwgc3RydWN0IG5mc19jbG9zZXJlcyAqcmVzKQogewotCXVpbnQzMl90ICpwOworCV9fYmUzMiAqcDsKIAlpbnQgc3RhdHVzOwogCiAJc3RhdHVzID0gZGVjb2RlX29wX2hkcih4ZHIsIE9QX09QRU5fRE9XTkdSQURFKTsKQEAgLTMzMjQsNyArMzMyOCw3IEBACiBzdGF0aWMgaW50IGRlY29kZV9yZWFkKHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsIHN0cnVjdCBycGNfcnFzdCAqcmVxLCBzdHJ1Y3QgbmZzX3JlYWRyZXMgKnJlcykKIHsKIAlzdHJ1Y3Qga3ZlYyAqaW92ID0gcmVxLT5ycV9yY3ZfYnVmLmhlYWQ7Ci0JdWludDMyX3QgKnA7CisJX19iZTMyICpwOwogCXVpbnQzMl90IGNvdW50LCBlb2YsIHJlY3ZkLCBoZHJsZW47CiAJaW50IHN0YXR1czsKIApAQCAtMzM1NCw3ICszMzU4LDcgQEAKIAlzdHJ1Y3QgcGFnZQkqcGFnZSA9ICpyY3ZidWYtPnBhZ2VzOwogCXN0cnVjdCBrdmVjCSppb3YgPSByY3ZidWYtPmhlYWQ7CiAJdW5zaWduZWQgaW50CW5yLCBwZ2xlbiA9IHJjdmJ1Zi0+cGFnZV9sZW47Ci0JdWludDMyX3QJKmVuZCwgKmVudHJ5LCAqcCwgKmthZGRyOworCV9fYmUzMgkJKmVuZCwgKmVudHJ5LCAqcCwgKmthZGRyOwogCXVpbnQzMl90CWxlbiwgYXR0cmxlbiwgeGxlbjsKIAlpbnQgCQloZHJsZW4sIHJlY3ZkLCBzdGF0dXM7CiAKQEAgLTMzNzYsNyArMzM4MCw3IEBACiAJeGRyX3JlYWRfcGFnZXMoeGRyLCBwZ2xlbik7CiAKIAlCVUdfT04ocGdsZW4gKyByZWFkZGlyLT5wZ2Jhc2UgPiBQQUdFX0NBQ0hFX1NJWkUpOwotCWthZGRyID0gcCA9ICh1aW50MzJfdCAqKSBrbWFwX2F0b21pYyhwYWdlLCBLTV9VU0VSMCk7CisJa2FkZHIgPSBwID0ga21hcF9hdG9taWMocGFnZSwgS01fVVNFUjApOwogCWVuZCA9IHAgKyAoKHBnbGVuICsgcmVhZGRpci0+cGdiYXNlKSA+PiAyKTsKIAllbnRyeSA9IHA7CiAJZm9yIChuciA9IDA7ICpwKys7IG5yKyspIHsKQEAgLTM0MjgsNyArMzQzMiw3IEBACiAJc3RydWN0IHhkcl9idWYgKnJjdmJ1ZiA9ICZyZXEtPnJxX3Jjdl9idWY7CiAJc3RydWN0IGt2ZWMgKmlvdiA9IHJjdmJ1Zi0+aGVhZDsKIAlpbnQgaGRybGVuLCBsZW4sIHJlY3ZkOwotCXVpbnQzMl90ICpwOworCV9fYmUzMiAqcDsKIAljaGFyICprYWRkcjsKIAlpbnQgc3RhdHVzOwogCkBAIC0zNTA1LDcgKzM1MDksNyBAQAogc3RhdGljIGludCBkZWNvZGVfZ2V0YWNsKHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsIHN0cnVjdCBycGNfcnFzdCAqcmVxLAogCQlzaXplX3QgKmFjbF9sZW4pCiB7Ci0JdWludDMyX3QgKnNhdmVwOworCV9fYmUzMiAqc2F2ZXA7CiAJdWludDMyX3QgYXR0cmxlbiwKIAkJIGJpdG1hcFsyXSA9IHswfTsKIAlzdHJ1Y3Qga3ZlYyAqaW92ID0gcmVxLT5ycV9yY3ZfYnVmLmhlYWQ7CkBAIC0zNTUxLDcgKzM1NTUsNyBAQAogCiBzdGF0aWMgaW50IGRlY29kZV9zZXRhdHRyKHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsIHN0cnVjdCBuZnNfc2V0YXR0cnJlcyAqcmVzKQogewotCXVpbnQzMl90ICpwOworCV9fYmUzMiAqcDsKIAl1aW50MzJfdCBibWxlbjsKIAlpbnQgc3RhdHVzOwogCkBAIC0zNTY3LDcgKzM1NzEsNyBAQAogCiBzdGF0aWMgaW50IGRlY29kZV9zZXRjbGllbnRpZChzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLCBzdHJ1Y3QgbmZzX2NsaWVudCAqY2xwKQogewotCXVpbnQzMl90ICpwOworCV9fYmUzMiAqcDsKIAl1aW50MzJfdCBvcG51bTsKIAlpbnQzMl90IG5mc2VycjsKIApAQCAtMzYxMCw3ICszNjE0LDcgQEAKIAogc3RhdGljIGludCBkZWNvZGVfd3JpdGUoc3RydWN0IHhkcl9zdHJlYW0gKnhkciwgc3RydWN0IG5mc193cml0ZXJlcyAqcmVzKQogewotCXVpbnQzMl90ICpwOworCV9fYmUzMiAqcDsKIAlpbnQgc3RhdHVzOwogCiAJc3RhdHVzID0gZGVjb2RlX29wX2hkcih4ZHIsIE9QX1dSSVRFKTsKQEAgLTM2MzIsNyArMzYzNiw3IEBACiAvKgogICogRGVjb2RlIE9QRU5fRE9XTkdSQURFIHJlc3BvbnNlCiAgKi8KLXN0YXRpYyBpbnQgbmZzNF94ZHJfZGVjX29wZW5fZG93bmdyYWRlKHN0cnVjdCBycGNfcnFzdCAqcnFzdHAsIHVpbnQzMl90ICpwLCBzdHJ1Y3QgbmZzX2Nsb3NlcmVzICpyZXMpCitzdGF0aWMgaW50IG5mczRfeGRyX2RlY19vcGVuX2Rvd25ncmFkZShzdHJ1Y3QgcnBjX3Jxc3QgKnJxc3RwLCBfX2JlMzIgKnAsIHN0cnVjdCBuZnNfY2xvc2VyZXMgKnJlcykKIHsKICAgICAgICAgc3RydWN0IHhkcl9zdHJlYW0geGRyOwogICAgICAgICBzdHJ1Y3QgY29tcG91bmRfaGRyIGhkcjsKQEAgLTM2NjAsNyArMzY2NCw3IEBACiAvKgogICogRGVjb2RlIEFDQ0VTUyByZXNwb25zZQogICovCi1zdGF0aWMgaW50IG5mczRfeGRyX2RlY19hY2Nlc3Moc3RydWN0IHJwY19ycXN0ICpycXN0cCwgdWludDMyX3QgKnAsIHN0cnVjdCBuZnM0X2FjY2Vzc3JlcyAqcmVzKQorc3RhdGljIGludCBuZnM0X3hkcl9kZWNfYWNjZXNzKHN0cnVjdCBycGNfcnFzdCAqcnFzdHAsIF9fYmUzMiAqcCwgc3RydWN0IG5mczRfYWNjZXNzcmVzICpyZXMpCiB7CiAJc3RydWN0IHhkcl9zdHJlYW0geGRyOwogCXN0cnVjdCBjb21wb3VuZF9oZHIgaGRyOwpAQCAtMzY3OCw3ICszNjgyLDcgQEAKIC8qCiAgKiBEZWNvZGUgTE9PS1VQIHJlc3BvbnNlCiAgKi8KLXN0YXRpYyBpbnQgbmZzNF94ZHJfZGVjX2xvb2t1cChzdHJ1Y3QgcnBjX3Jxc3QgKnJxc3RwLCB1aW50MzJfdCAqcCwgc3RydWN0IG5mczRfbG9va3VwX3JlcyAqcmVzKQorc3RhdGljIGludCBuZnM0X3hkcl9kZWNfbG9va3VwKHN0cnVjdCBycGNfcnFzdCAqcnFzdHAsIF9fYmUzMiAqcCwgc3RydWN0IG5mczRfbG9va3VwX3JlcyAqcmVzKQogewogCXN0cnVjdCB4ZHJfc3RyZWFtIHhkcjsKIAlzdHJ1Y3QgY29tcG91bmRfaGRyIGhkcjsKQEAgLTM3MDEsNyArMzcwNSw3IEBACiAvKgogICogRGVjb2RlIExPT0tVUF9ST09UIHJlc3BvbnNlCiAgKi8KLXN0YXRpYyBpbnQgbmZzNF94ZHJfZGVjX2xvb2t1cF9yb290KHN0cnVjdCBycGNfcnFzdCAqcnFzdHAsIHVpbnQzMl90ICpwLCBzdHJ1Y3QgbmZzNF9sb29rdXBfcmVzICpyZXMpCitzdGF0aWMgaW50IG5mczRfeGRyX2RlY19sb29rdXBfcm9vdChzdHJ1Y3QgcnBjX3Jxc3QgKnJxc3RwLCBfX2JlMzIgKnAsIHN0cnVjdCBuZnM0X2xvb2t1cF9yZXMgKnJlcykKIHsKIAlzdHJ1Y3QgeGRyX3N0cmVhbSB4ZHI7CiAJc3RydWN0IGNvbXBvdW5kX2hkciBoZHI7CkBAIC0zNzIxLDcgKzM3MjUsNyBAQAogLyoKICAqIERlY29kZSBSRU1PVkUgcmVzcG9uc2UKICAqLwotc3RhdGljIGludCBuZnM0X3hkcl9kZWNfcmVtb3ZlKHN0cnVjdCBycGNfcnFzdCAqcnFzdHAsIHVpbnQzMl90ICpwLCBzdHJ1Y3QgbmZzNF9yZW1vdmVfcmVzICpyZXMpCitzdGF0aWMgaW50IG5mczRfeGRyX2RlY19yZW1vdmUoc3RydWN0IHJwY19ycXN0ICpycXN0cCwgX19iZTMyICpwLCBzdHJ1Y3QgbmZzNF9yZW1vdmVfcmVzICpyZXMpCiB7CiAJc3RydWN0IHhkcl9zdHJlYW0geGRyOwogCXN0cnVjdCBjb21wb3VuZF9oZHIgaGRyOwpAQCAtMzc0Miw3ICszNzQ2LDcgQEAKIC8qCiAgKiBEZWNvZGUgUkVOQU1FIHJlc3BvbnNlCiAgKi8KLXN0YXRpYyBpbnQgbmZzNF94ZHJfZGVjX3JlbmFtZShzdHJ1Y3QgcnBjX3Jxc3QgKnJxc3RwLCB1aW50MzJfdCAqcCwgc3RydWN0IG5mczRfcmVuYW1lX3JlcyAqcmVzKQorc3RhdGljIGludCBuZnM0X3hkcl9kZWNfcmVuYW1lKHN0cnVjdCBycGNfcnFzdCAqcnFzdHAsIF9fYmUzMiAqcCwgc3RydWN0IG5mczRfcmVuYW1lX3JlcyAqcmVzKQogewogCXN0cnVjdCB4ZHJfc3RyZWFtIHhkcjsKIAlzdHJ1Y3QgY29tcG91bmRfaGRyIGhkcjsKQEAgLTM3NzIsNyArMzc3Niw3IEBACiAvKgogICogRGVjb2RlIExJTksgcmVzcG9uc2UKICAqLwotc3RhdGljIGludCBuZnM0X3hkcl9kZWNfbGluayhzdHJ1Y3QgcnBjX3Jxc3QgKnJxc3RwLCB1aW50MzJfdCAqcCwgc3RydWN0IG5mczRfbGlua19yZXMgKnJlcykKK3N0YXRpYyBpbnQgbmZzNF94ZHJfZGVjX2xpbmsoc3RydWN0IHJwY19ycXN0ICpycXN0cCwgX19iZTMyICpwLCBzdHJ1Y3QgbmZzNF9saW5rX3JlcyAqcmVzKQogewogCXN0cnVjdCB4ZHJfc3RyZWFtIHhkcjsKIAlzdHJ1Y3QgY29tcG91bmRfaGRyIGhkcjsKQEAgLTM4MDUsNyArMzgwOSw3IEBACiAvKgogICogRGVjb2RlIENSRUFURSByZXNwb25zZQogICovCi1zdGF0aWMgaW50IG5mczRfeGRyX2RlY19jcmVhdGUoc3RydWN0IHJwY19ycXN0ICpycXN0cCwgdWludDMyX3QgKnAsIHN0cnVjdCBuZnM0X2NyZWF0ZV9yZXMgKnJlcykKK3N0YXRpYyBpbnQgbmZzNF94ZHJfZGVjX2NyZWF0ZShzdHJ1Y3QgcnBjX3Jxc3QgKnJxc3RwLCBfX2JlMzIgKnAsIHN0cnVjdCBuZnM0X2NyZWF0ZV9yZXMgKnJlcykKIHsKIAlzdHJ1Y3QgeGRyX3N0cmVhbSB4ZHI7CiAJc3RydWN0IGNvbXBvdW5kX2hkciBoZHI7CkBAIC0zODM0LDcgKzM4MzgsNyBAQAogLyoKICAqIERlY29kZSBTWU1MSU5LIHJlc3BvbnNlCiAgKi8KLXN0YXRpYyBpbnQgbmZzNF94ZHJfZGVjX3N5bWxpbmsoc3RydWN0IHJwY19ycXN0ICpycXN0cCwgdWludDMyX3QgKnAsIHN0cnVjdCBuZnM0X2NyZWF0ZV9yZXMgKnJlcykKK3N0YXRpYyBpbnQgbmZzNF94ZHJfZGVjX3N5bWxpbmsoc3RydWN0IHJwY19ycXN0ICpycXN0cCwgX19iZTMyICpwLCBzdHJ1Y3QgbmZzNF9jcmVhdGVfcmVzICpyZXMpCiB7CiAJcmV0dXJuIG5mczRfeGRyX2RlY19jcmVhdGUocnFzdHAsIHAsIHJlcyk7CiB9CkBAIC0zODQyLDcgKzM4NDYsNyBAQAogLyoKICAqIERlY29kZSBHRVRBVFRSIHJlc3BvbnNlCiAgKi8KLXN0YXRpYyBpbnQgbmZzNF94ZHJfZGVjX2dldGF0dHIoc3RydWN0IHJwY19ycXN0ICpycXN0cCwgdWludDMyX3QgKnAsIHN0cnVjdCBuZnM0X2dldGF0dHJfcmVzICpyZXMpCitzdGF0aWMgaW50IG5mczRfeGRyX2RlY19nZXRhdHRyKHN0cnVjdCBycGNfcnFzdCAqcnFzdHAsIF9fYmUzMiAqcCwgc3RydWN0IG5mczRfZ2V0YXR0cl9yZXMgKnJlcykKIHsKIAlzdHJ1Y3QgeGRyX3N0cmVhbSB4ZHI7CiAJc3RydWN0IGNvbXBvdW5kX2hkciBoZHI7CkBAIC0zODY1LDcgKzM4NjksNyBAQAogICogRW5jb2RlIGFuIFNFVEFDTCByZXF1ZXN0CiAgKi8KIHN0YXRpYyBpbnQKLW5mczRfeGRyX2VuY19zZXRhY2woc3RydWN0IHJwY19ycXN0ICpyZXEsIHVpbnQzMl90ICpwLCBzdHJ1Y3QgbmZzX3NldGFjbGFyZ3MgKmFyZ3MpCituZnM0X3hkcl9lbmNfc2V0YWNsKHN0cnVjdCBycGNfcnFzdCAqcmVxLCBfX2JlMzIgKnAsIHN0cnVjdCBuZnNfc2V0YWNsYXJncyAqYXJncykKIHsKICAgICAgICAgc3RydWN0IHhkcl9zdHJlYW0geGRyOwogICAgICAgICBzdHJ1Y3QgY29tcG91bmRfaGRyIGhkciA9IHsKQEAgLTM4ODYsNyArMzg5MCw3IEBACiAgKiBEZWNvZGUgU0VUQUNMIHJlc3BvbnNlCiAgKi8KIHN0YXRpYyBpbnQKLW5mczRfeGRyX2RlY19zZXRhY2woc3RydWN0IHJwY19ycXN0ICpycXN0cCwgdWludDMyX3QgKnAsIHZvaWQgKnJlcykKK25mczRfeGRyX2RlY19zZXRhY2woc3RydWN0IHJwY19ycXN0ICpycXN0cCwgX19iZTMyICpwLCB2b2lkICpyZXMpCiB7CiAJc3RydWN0IHhkcl9zdHJlYW0geGRyOwogCXN0cnVjdCBjb21wb3VuZF9oZHIgaGRyOwpAQCAtMzkwOCw3ICszOTEyLDcgQEAKICAqIERlY29kZSBHRVRBQ0wgcmVzcG9uc2UKICAqLwogc3RhdGljIGludAotbmZzNF94ZHJfZGVjX2dldGFjbChzdHJ1Y3QgcnBjX3Jxc3QgKnJxc3RwLCB1aW50MzJfdCAqcCwgc2l6ZV90ICphY2xfbGVuKQorbmZzNF94ZHJfZGVjX2dldGFjbChzdHJ1Y3QgcnBjX3Jxc3QgKnJxc3RwLCBfX2JlMzIgKnAsIHNpemVfdCAqYWNsX2xlbikKIHsKIAlzdHJ1Y3QgeGRyX3N0cmVhbSB4ZHI7CiAJc3RydWN0IGNvbXBvdW5kX2hkciBoZHI7CkBAIC0zOTMwLDcgKzM5MzQsNyBAQAogLyoKICAqIERlY29kZSBDTE9TRSByZXNwb25zZQogICovCi1zdGF0aWMgaW50IG5mczRfeGRyX2RlY19jbG9zZShzdHJ1Y3QgcnBjX3Jxc3QgKnJxc3RwLCB1aW50MzJfdCAqcCwgc3RydWN0IG5mc19jbG9zZXJlcyAqcmVzKQorc3RhdGljIGludCBuZnM0X3hkcl9kZWNfY2xvc2Uoc3RydWN0IHJwY19ycXN0ICpycXN0cCwgX19iZTMyICpwLCBzdHJ1Y3QgbmZzX2Nsb3NlcmVzICpyZXMpCiB7CiAgICAgICAgIHN0cnVjdCB4ZHJfc3RyZWFtIHhkcjsKICAgICAgICAgc3RydWN0IGNvbXBvdW5kX2hkciBoZHI7CkBAIC0zOTYwLDcgKzM5NjQsNyBAQAogLyoKICAqIERlY29kZSBPUEVOIHJlc3BvbnNlCiAgKi8KLXN0YXRpYyBpbnQgbmZzNF94ZHJfZGVjX29wZW4oc3RydWN0IHJwY19ycXN0ICpycXN0cCwgdWludDMyX3QgKnAsIHN0cnVjdCBuZnNfb3BlbnJlcyAqcmVzKQorc3RhdGljIGludCBuZnM0X3hkcl9kZWNfb3BlbihzdHJ1Y3QgcnBjX3Jxc3QgKnJxc3RwLCBfX2JlMzIgKnAsIHN0cnVjdCBuZnNfb3BlbnJlcyAqcmVzKQogewogICAgICAgICBzdHJ1Y3QgeGRyX3N0cmVhbSB4ZHI7CiAgICAgICAgIHN0cnVjdCBjb21wb3VuZF9oZHIgaGRyOwpAQCAtMzk5NCw3ICszOTk4LDcgQEAKIC8qCiAgKiBEZWNvZGUgT1BFTl9DT05GSVJNIHJlc3BvbnNlCiAgKi8KLXN0YXRpYyBpbnQgbmZzNF94ZHJfZGVjX29wZW5fY29uZmlybShzdHJ1Y3QgcnBjX3Jxc3QgKnJxc3RwLCB1aW50MzJfdCAqcCwgc3RydWN0IG5mc19vcGVuX2NvbmZpcm1yZXMgKnJlcykKK3N0YXRpYyBpbnQgbmZzNF94ZHJfZGVjX29wZW5fY29uZmlybShzdHJ1Y3QgcnBjX3Jxc3QgKnJxc3RwLCBfX2JlMzIgKnAsIHN0cnVjdCBuZnNfb3Blbl9jb25maXJtcmVzICpyZXMpCiB7CiAgICAgICAgIHN0cnVjdCB4ZHJfc3RyZWFtIHhkcjsKICAgICAgICAgc3RydWN0IGNvbXBvdW5kX2hkciBoZHI7CkBAIC00MDE1LDcgKzQwMTksNyBAQAogLyoKICAqIERlY29kZSBPUEVOIHJlc3BvbnNlCiAgKi8KLXN0YXRpYyBpbnQgbmZzNF94ZHJfZGVjX29wZW5fbm9hdHRyKHN0cnVjdCBycGNfcnFzdCAqcnFzdHAsIHVpbnQzMl90ICpwLCBzdHJ1Y3QgbmZzX29wZW5yZXMgKnJlcykKK3N0YXRpYyBpbnQgbmZzNF94ZHJfZGVjX29wZW5fbm9hdHRyKHN0cnVjdCBycGNfcnFzdCAqcnFzdHAsIF9fYmUzMiAqcCwgc3RydWN0IG5mc19vcGVucmVzICpyZXMpCiB7CiAgICAgICAgIHN0cnVjdCB4ZHJfc3RyZWFtIHhkcjsKICAgICAgICAgc3RydWN0IGNvbXBvdW5kX2hkciBoZHI7CkBAIC00MDM5LDcgKzQwNDMsNyBAQAogLyoKICAqIERlY29kZSBTRVRBVFRSIHJlc3BvbnNlCiAgKi8KLXN0YXRpYyBpbnQgbmZzNF94ZHJfZGVjX3NldGF0dHIoc3RydWN0IHJwY19ycXN0ICpycXN0cCwgdWludDMyX3QgKnAsIHN0cnVjdCBuZnNfc2V0YXR0cnJlcyAqcmVzKQorc3RhdGljIGludCBuZnM0X3hkcl9kZWNfc2V0YXR0cihzdHJ1Y3QgcnBjX3Jxc3QgKnJxc3RwLCBfX2JlMzIgKnAsIHN0cnVjdCBuZnNfc2V0YXR0cnJlcyAqcmVzKQogewogICAgICAgICBzdHJ1Y3QgeGRyX3N0cmVhbSB4ZHI7CiAgICAgICAgIHN0cnVjdCBjb21wb3VuZF9oZHIgaGRyOwpAQCAtNDA2NSw3ICs0MDY5LDcgQEAKIC8qCiAgKiBEZWNvZGUgTE9DSyByZXNwb25zZQogICovCi1zdGF0aWMgaW50IG5mczRfeGRyX2RlY19sb2NrKHN0cnVjdCBycGNfcnFzdCAqcnFzdHAsIHVpbnQzMl90ICpwLCBzdHJ1Y3QgbmZzX2xvY2tfcmVzICpyZXMpCitzdGF0aWMgaW50IG5mczRfeGRyX2RlY19sb2NrKHN0cnVjdCBycGNfcnFzdCAqcnFzdHAsIF9fYmUzMiAqcCwgc3RydWN0IG5mc19sb2NrX3JlcyAqcmVzKQogewogCXN0cnVjdCB4ZHJfc3RyZWFtIHhkcjsKIAlzdHJ1Y3QgY29tcG91bmRfaGRyIGhkcjsKQEAgLTQwODYsNyArNDA5MCw3IEBACiAvKgogICogRGVjb2RlIExPQ0tUIHJlc3BvbnNlCiAgKi8KLXN0YXRpYyBpbnQgbmZzNF94ZHJfZGVjX2xvY2t0KHN0cnVjdCBycGNfcnFzdCAqcnFzdHAsIHVpbnQzMl90ICpwLCBzdHJ1Y3QgbmZzX2xvY2t0X3JlcyAqcmVzKQorc3RhdGljIGludCBuZnM0X3hkcl9kZWNfbG9ja3Qoc3RydWN0IHJwY19ycXN0ICpycXN0cCwgX19iZTMyICpwLCBzdHJ1Y3QgbmZzX2xvY2t0X3JlcyAqcmVzKQogewogCXN0cnVjdCB4ZHJfc3RyZWFtIHhkcjsKIAlzdHJ1Y3QgY29tcG91bmRfaGRyIGhkcjsKQEAgLTQxMDcsNyArNDExMSw3IEBACiAvKgogICogRGVjb2RlIExPQ0tVIHJlc3BvbnNlCiAgKi8KLXN0YXRpYyBpbnQgbmZzNF94ZHJfZGVjX2xvY2t1KHN0cnVjdCBycGNfcnFzdCAqcnFzdHAsIHVpbnQzMl90ICpwLCBzdHJ1Y3QgbmZzX2xvY2t1X3JlcyAqcmVzKQorc3RhdGljIGludCBuZnM0X3hkcl9kZWNfbG9ja3Uoc3RydWN0IHJwY19ycXN0ICpycXN0cCwgX19iZTMyICpwLCBzdHJ1Y3QgbmZzX2xvY2t1X3JlcyAqcmVzKQogewogCXN0cnVjdCB4ZHJfc3RyZWFtIHhkcjsKIAlzdHJ1Y3QgY29tcG91bmRfaGRyIGhkcjsKQEAgLTQxMjgsNyArNDEzMiw3IEBACiAvKgogICogRGVjb2RlIFJFQURMSU5LIHJlc3BvbnNlCiAgKi8KLXN0YXRpYyBpbnQgbmZzNF94ZHJfZGVjX3JlYWRsaW5rKHN0cnVjdCBycGNfcnFzdCAqcnFzdHAsIHVpbnQzMl90ICpwLCB2b2lkICpyZXMpCitzdGF0aWMgaW50IG5mczRfeGRyX2RlY19yZWFkbGluayhzdHJ1Y3QgcnBjX3Jxc3QgKnJxc3RwLCBfX2JlMzIgKnAsIHZvaWQgKnJlcykKIHsKIAlzdHJ1Y3QgeGRyX3N0cmVhbSB4ZHI7CiAJc3RydWN0IGNvbXBvdW5kX2hkciBoZHI7CkBAIC00MTQ5LDcgKzQxNTMsNyBAQAogLyoKICAqIERlY29kZSBSRUFERElSIHJlc3BvbnNlCiAgKi8KLXN0YXRpYyBpbnQgbmZzNF94ZHJfZGVjX3JlYWRkaXIoc3RydWN0IHJwY19ycXN0ICpycXN0cCwgdWludDMyX3QgKnAsIHN0cnVjdCBuZnM0X3JlYWRkaXJfcmVzICpyZXMpCitzdGF0aWMgaW50IG5mczRfeGRyX2RlY19yZWFkZGlyKHN0cnVjdCBycGNfcnFzdCAqcnFzdHAsIF9fYmUzMiAqcCwgc3RydWN0IG5mczRfcmVhZGRpcl9yZXMgKnJlcykKIHsKIAlzdHJ1Y3QgeGRyX3N0cmVhbSB4ZHI7CiAJc3RydWN0IGNvbXBvdW5kX2hkciBoZHI7CkBAIC00MTcwLDcgKzQxNzQsNyBAQAogLyoKICAqIERlY29kZSBSZWFkIHJlc3BvbnNlCiAgKi8KLXN0YXRpYyBpbnQgbmZzNF94ZHJfZGVjX3JlYWQoc3RydWN0IHJwY19ycXN0ICpycXN0cCwgdWludDMyX3QgKnAsIHN0cnVjdCBuZnNfcmVhZHJlcyAqcmVzKQorc3RhdGljIGludCBuZnM0X3hkcl9kZWNfcmVhZChzdHJ1Y3QgcnBjX3Jxc3QgKnJxc3RwLCBfX2JlMzIgKnAsIHN0cnVjdCBuZnNfcmVhZHJlcyAqcmVzKQogewogCXN0cnVjdCB4ZHJfc3RyZWFtIHhkcjsKIAlzdHJ1Y3QgY29tcG91bmRfaGRyIGhkcjsKQEAgLTQxOTMsNyArNDE5Nyw3IEBACiAvKgogICogRGVjb2RlIFdSSVRFIHJlc3BvbnNlCiAgKi8KLXN0YXRpYyBpbnQgbmZzNF94ZHJfZGVjX3dyaXRlKHN0cnVjdCBycGNfcnFzdCAqcnFzdHAsIHVpbnQzMl90ICpwLCBzdHJ1Y3QgbmZzX3dyaXRlcmVzICpyZXMpCitzdGF0aWMgaW50IG5mczRfeGRyX2RlY193cml0ZShzdHJ1Y3QgcnBjX3Jxc3QgKnJxc3RwLCBfX2JlMzIgKnAsIHN0cnVjdCBuZnNfd3JpdGVyZXMgKnJlcykKIHsKIAlzdHJ1Y3QgeGRyX3N0cmVhbSB4ZHI7CiAJc3RydWN0IGNvbXBvdW5kX2hkciBoZHI7CkBAIC00MjE5LDcgKzQyMjMsNyBAQAogLyoKICAqIERlY29kZSBDT01NSVQgcmVzcG9uc2UKICAqLwotc3RhdGljIGludCBuZnM0X3hkcl9kZWNfY29tbWl0KHN0cnVjdCBycGNfcnFzdCAqcnFzdHAsIHVpbnQzMl90ICpwLCBzdHJ1Y3QgbmZzX3dyaXRlcmVzICpyZXMpCitzdGF0aWMgaW50IG5mczRfeGRyX2RlY19jb21taXQoc3RydWN0IHJwY19ycXN0ICpycXN0cCwgX19iZTMyICpwLCBzdHJ1Y3QgbmZzX3dyaXRlcmVzICpyZXMpCiB7CiAJc3RydWN0IHhkcl9zdHJlYW0geGRyOwogCXN0cnVjdCBjb21wb3VuZF9oZHIgaGRyOwpAQCAtNDI0Myw3ICs0MjQ3LDcgQEAKIC8qCiAgKiBGU0lORk8gcmVxdWVzdAogICovCi1zdGF0aWMgaW50IG5mczRfeGRyX2RlY19mc2luZm8oc3RydWN0IHJwY19ycXN0ICpyZXEsIHVpbnQzMl90ICpwLCBzdHJ1Y3QgbmZzX2ZzaW5mbyAqZnNpbmZvKQorc3RhdGljIGludCBuZnM0X3hkcl9kZWNfZnNpbmZvKHN0cnVjdCBycGNfcnFzdCAqcmVxLCBfX2JlMzIgKnAsIHN0cnVjdCBuZnNfZnNpbmZvICpmc2luZm8pCiB7CiAJc3RydWN0IHhkcl9zdHJlYW0geGRyOwogCXN0cnVjdCBjb21wb3VuZF9oZHIgaGRyOwpAQCAtNDI2Myw3ICs0MjY3LDcgQEAKIC8qCiAgKiBQQVRIQ09ORiByZXF1ZXN0CiAgKi8KLXN0YXRpYyBpbnQgbmZzNF94ZHJfZGVjX3BhdGhjb25mKHN0cnVjdCBycGNfcnFzdCAqcmVxLCB1aW50MzJfdCAqcCwgc3RydWN0IG5mc19wYXRoY29uZiAqcGF0aGNvbmYpCitzdGF0aWMgaW50IG5mczRfeGRyX2RlY19wYXRoY29uZihzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwgX19iZTMyICpwLCBzdHJ1Y3QgbmZzX3BhdGhjb25mICpwYXRoY29uZikKIHsKIAlzdHJ1Y3QgeGRyX3N0cmVhbSB4ZHI7CiAJc3RydWN0IGNvbXBvdW5kX2hkciBoZHI7CkBAIC00MjgxLDcgKzQyODUsNyBAQAogLyoKICAqIFNUQVRGUyByZXF1ZXN0CiAgKi8KLXN0YXRpYyBpbnQgbmZzNF94ZHJfZGVjX3N0YXRmcyhzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwgdWludDMyX3QgKnAsIHN0cnVjdCBuZnNfZnNzdGF0ICpmc3N0YXQpCitzdGF0aWMgaW50IG5mczRfeGRyX2RlY19zdGF0ZnMoc3RydWN0IHJwY19ycXN0ICpyZXEsIF9fYmUzMiAqcCwgc3RydWN0IG5mc19mc3N0YXQgKmZzc3RhdCkKIHsKIAlzdHJ1Y3QgeGRyX3N0cmVhbSB4ZHI7CiAJc3RydWN0IGNvbXBvdW5kX2hkciBoZHI7CkBAIC00Mjk5LDcgKzQzMDMsNyBAQAogLyoKICAqIEdFVEFUVFJfQklUTUFQIHJlcXVlc3QKICAqLwotc3RhdGljIGludCBuZnM0X3hkcl9kZWNfc2VydmVyX2NhcHMoc3RydWN0IHJwY19ycXN0ICpyZXEsIHVpbnQzMl90ICpwLCBzdHJ1Y3QgbmZzNF9zZXJ2ZXJfY2Fwc19yZXMgKnJlcykKK3N0YXRpYyBpbnQgbmZzNF94ZHJfZGVjX3NlcnZlcl9jYXBzKHN0cnVjdCBycGNfcnFzdCAqcmVxLCBfX2JlMzIgKnAsIHN0cnVjdCBuZnM0X3NlcnZlcl9jYXBzX3JlcyAqcmVzKQogewogCXN0cnVjdCB4ZHJfc3RyZWFtIHhkcjsKIAlzdHJ1Y3QgY29tcG91bmRfaGRyIGhkcjsKQEAgLTQzMTgsNyArNDMyMiw3IEBACiAvKgogICogRGVjb2RlIFJFTkVXIHJlc3BvbnNlCiAgKi8KLXN0YXRpYyBpbnQgbmZzNF94ZHJfZGVjX3JlbmV3KHN0cnVjdCBycGNfcnFzdCAqcnFzdHAsIHVpbnQzMl90ICpwLCB2b2lkICpkdW1teSkKK3N0YXRpYyBpbnQgbmZzNF94ZHJfZGVjX3JlbmV3KHN0cnVjdCBycGNfcnFzdCAqcnFzdHAsIF9fYmUzMiAqcCwgdm9pZCAqZHVtbXkpCiB7CiAJc3RydWN0IHhkcl9zdHJlYW0geGRyOwogCXN0cnVjdCBjb21wb3VuZF9oZHIgaGRyOwpAQCAtNDMzNCw3ICs0MzM4LDcgQEAKIC8qCiAgKiBhIFNFVENMSUVOVElEIHJlcXVlc3QKICAqLwotc3RhdGljIGludCBuZnM0X3hkcl9kZWNfc2V0Y2xpZW50aWQoc3RydWN0IHJwY19ycXN0ICpyZXEsIHVpbnQzMl90ICpwLAorc3RhdGljIGludCBuZnM0X3hkcl9kZWNfc2V0Y2xpZW50aWQoc3RydWN0IHJwY19ycXN0ICpyZXEsIF9fYmUzMiAqcCwKIAkJc3RydWN0IG5mc19jbGllbnQgKmNscCkKIHsKIAlzdHJ1Y3QgeGRyX3N0cmVhbSB4ZHI7CkBAIC00MzUzLDcgKzQzNTcsNyBAQAogLyoKICAqIGEgU0VUQ0xJRU5USURfQ09ORklSTSByZXF1ZXN0CiAgKi8KLXN0YXRpYyBpbnQgbmZzNF94ZHJfZGVjX3NldGNsaWVudGlkX2NvbmZpcm0oc3RydWN0IHJwY19ycXN0ICpyZXEsIHVpbnQzMl90ICpwLCBzdHJ1Y3QgbmZzX2ZzaW5mbyAqZnNpbmZvKQorc3RhdGljIGludCBuZnM0X3hkcl9kZWNfc2V0Y2xpZW50aWRfY29uZmlybShzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwgX19iZTMyICpwLCBzdHJ1Y3QgbmZzX2ZzaW5mbyAqZnNpbmZvKQogewogCXN0cnVjdCB4ZHJfc3RyZWFtIHhkcjsKIAlzdHJ1Y3QgY29tcG91bmRfaGRyIGhkcjsKQEAgLTQzNzUsNyArNDM3OSw3IEBACiAvKgogICogREVMRUdSRVRVUk4gcmVxdWVzdAogICovCi1zdGF0aWMgaW50IG5mczRfeGRyX2RlY19kZWxlZ3JldHVybihzdHJ1Y3QgcnBjX3Jxc3QgKnJxc3RwLCB1aW50MzJfdCAqcCwgc3RydWN0IG5mczRfZGVsZWdyZXR1cm5yZXMgKnJlcykKK3N0YXRpYyBpbnQgbmZzNF94ZHJfZGVjX2RlbGVncmV0dXJuKHN0cnVjdCBycGNfcnFzdCAqcnFzdHAsIF9fYmUzMiAqcCwgc3RydWN0IG5mczRfZGVsZWdyZXR1cm5yZXMgKnJlcykKIHsKIAlzdHJ1Y3QgeGRyX3N0cmVhbSB4ZHI7CiAJc3RydWN0IGNvbXBvdW5kX2hkciBoZHI7CkBAIC00Mzk3LDcgKzQ0MDEsNyBAQAogLyoKICAqIEZTX0xPQ0FUSU9OUyByZXF1ZXN0CiAgKi8KLXN0YXRpYyBpbnQgbmZzNF94ZHJfZGVjX2ZzX2xvY2F0aW9ucyhzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwgdWludDMyX3QgKnAsIHN0cnVjdCBuZnM0X2ZzX2xvY2F0aW9ucyAqcmVzKQorc3RhdGljIGludCBuZnM0X3hkcl9kZWNfZnNfbG9jYXRpb25zKHN0cnVjdCBycGNfcnFzdCAqcmVxLCBfX2JlMzIgKnAsIHN0cnVjdCBuZnM0X2ZzX2xvY2F0aW9ucyAqcmVzKQogewogCXN0cnVjdCB4ZHJfc3RyZWFtIHhkcjsKIAlzdHJ1Y3QgY29tcG91bmRfaGRyIGhkcjsKQEAgLTQ0MTcsNyArNDQyMSw3IEBACiAJcmV0dXJuIHN0YXR1czsKIH0KIAotdWludDMyX3QgKm5mczRfZGVjb2RlX2RpcmVudCh1aW50MzJfdCAqcCwgc3RydWN0IG5mc19lbnRyeSAqZW50cnksIGludCBwbHVzKQorX19iZTMyICpuZnM0X2RlY29kZV9kaXJlbnQoX19iZTMyICpwLCBzdHJ1Y3QgbmZzX2VudHJ5ICplbnRyeSwgaW50IHBsdXMpCiB7CiAJdWludDMyX3QgYml0bWFwWzJdID0gezB9OwogCXVpbnQzMl90IGxlbjsKZGlmZiAtLWdpdCBhL2ZzL25mcy9zdXBlci5jIGIvZnMvbmZzL3N1cGVyLmMKaW5kZXggMjg2NTlhOS4uMjgxMDhjOCAxMDA2NDQKLS0tIGEvZnMvbmZzL3N1cGVyLmMKKysrIGIvZnMvbmZzL3N1cGVyLmMKQEAgLTgzNCw3ICs4MzQsNyBAQAogCX0KIAkvKiBSRkMzNTMwOiBUaGUgZGVmYXVsdCBwb3J0IGZvciBORlMgaXMgMjA0OSAqLwogCWlmIChhZGRyLnNpbl9wb3J0ID09IDApCi0JCWFkZHIuc2luX3BvcnQgPSBORlNfUE9SVDsKKwkJYWRkci5zaW5fcG9ydCA9IGh0b25zKE5GU19QT1JUKTsKIAogCS8qIEdyYWIgdGhlIGF1dGhlbnRpY2F0aW9uIHR5cGUgKi8KIAlhdXRoZmxhdm91ciA9IFJQQ19BVVRIX1VOSVg7CmRpZmYgLS1naXQgYS9mcy9uZnMvc3lzY3RsLmMgYi9mcy9uZnMvc3lzY3RsLmMKaW5kZXggMmZlMzQwMy4uM2VhNTBhYyAxMDA2NDQKLS0tIGEvZnMvbmZzL3N5c2N0bC5jCisrKyBiL2ZzL25mcy9zeXNjdGwuYwpAQCAtMTgsMTEgKzE4LDYgQEAKIHN0YXRpYyBjb25zdCBpbnQgbmZzX3NldF9wb3J0X21pbiA9IDA7CiBzdGF0aWMgY29uc3QgaW50IG5mc19zZXRfcG9ydF9tYXggPSA2NTUzNTsKIHN0YXRpYyBzdHJ1Y3QgY3RsX3RhYmxlX2hlYWRlciAqbmZzX2NhbGxiYWNrX3N5c2N0bF90YWJsZTsKLS8qCi0gKiBTb21ldGhpbmcgdGhhdCBpc24ndCBDVExfQU5ZLCBDVExfTk9ORSBvciBhIHZhbHVlIHRoYXQgbWF5IGNsYXNoLgotICogVXNlIHRoZSBzYW1lIHZhbHVlcyBhcyBmcy9sb2NrZC9zdmMuYwotICovCi0jZGVmaW5lIENUTF9VTk5VTUJFUkVEIC0yCiAKIHN0YXRpYyBjdGxfdGFibGUgbmZzX2NiX3N5c2N0bHNbXSA9IHsKICNpZmRlZiBDT05GSUdfTkZTX1Y0CmRpZmYgLS1naXQgYS9mcy9uZnMvd3JpdGUuYyBiL2ZzL25mcy93cml0ZS5jCmluZGV4IGY2Njc1ZDIuLjg4M2RkNGEgMTAwNjQ0Ci0tLSBhL2ZzL25mcy93cml0ZS5jCisrKyBiL2ZzL25mcy93cml0ZS5jCkBAIC01Nyw2ICs1Nyw4IEBACiAjaW5jbHVkZSA8bGludXgvbmZzX2ZzLmg+CiAjaW5jbHVkZSA8bGludXgvbmZzX21vdW50Lmg+CiAjaW5jbHVkZSA8bGludXgvbmZzX3BhZ2UuaD4KKyNpbmNsdWRlIDxsaW51eC9iYWNraW5nLWRldi5oPgorCiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KICNpbmNsdWRlIDxsaW51eC9zbXBfbG9jay5oPgogCkBAIC0zOTUsNyArMzk3LDcgQEAKIG91dDoKIAljbGVhcl9iaXQoQkRJX3dyaXRlX2Nvbmdlc3RlZCwgJmJkaS0+c3RhdGUpOwogCXdha2VfdXBfYWxsKCZuZnNfd3JpdGVfY29uZ2VzdGlvbik7Ci0Jd3JpdGViYWNrX2Nvbmdlc3Rpb25fZW5kKCk7CisJY29uZ2VzdGlvbl9lbmQoV1JJVEUpOwogCXJldHVybiBlcnI7CiB9CiAKQEAgLTU4OCwxMCArNTkwLDEwIEBACiAKIAl3aGlsZSghbGlzdF9lbXB0eShoZWFkKSkgewogCQlyZXEgPSBuZnNfbGlzdF9lbnRyeShoZWFkLT5uZXh0KTsKKwkJZGVjX3pvbmVfcGFnZV9zdGF0ZShyZXEtPndiX3BhZ2UsIE5SX1VOU1RBQkxFX05GUyk7CiAJCW5mc19saXN0X3JlbW92ZV9yZXF1ZXN0KHJlcSk7CiAJCW5mc19pbm9kZV9yZW1vdmVfcmVxdWVzdChyZXEpOwotCQlkZWNfem9uZV9wYWdlX3N0YXRlKHJlcS0+d2JfcGFnZSwgTlJfVU5TVEFCTEVfTkZTKTsKLQkJbmZzX2NsZWFyX3BhZ2Vfd3JpdGViYWNrKHJlcSk7CisJCW5mc191bmxvY2tfcmVxdWVzdChyZXEpOwogCX0KIH0KIApkaWZmIC0tZ2l0IGEvZnMvbmZzX2NvbW1vbi9uZnNhY2wuYyBiL2ZzL25mc19jb21tb24vbmZzYWNsLmMKaW5kZXggMGMyYmU4Yy4uYzExZjUzNyAxMDA2NDQKLS0tIGEvZnMvbmZzX2NvbW1vbi9uZnNhY2wuYworKysgYi9mcy9uZnNfY29tbW9uL25mc2FjbC5jCkBAIC00Niw3ICs0Niw3IEBACiB7CiAJc3RydWN0IG5mc2FjbF9lbmNvZGVfZGVzYyAqbmZzYWNsX2Rlc2MgPQogCQkoc3RydWN0IG5mc2FjbF9lbmNvZGVfZGVzYyAqKSBkZXNjOwotCXUzMiAqcCA9ICh1MzIgKikgZWxlbTsKKwlfX2JlMzIgKnAgPSBlbGVtOwogCiAJc3RydWN0IHBvc2l4X2FjbF9lbnRyeSAqZW50cnkgPQogCQkmbmZzYWNsX2Rlc2MtPmFjbC0+YV9lbnRyaWVzW25mc2FjbF9kZXNjLT5jb3VudCsrXTsKQEAgLTEyNyw3ICsxMjcsNyBAQAogewogCXN0cnVjdCBuZnNhY2xfZGVjb2RlX2Rlc2MgKm5mc2FjbF9kZXNjID0KIAkJKHN0cnVjdCBuZnNhY2xfZGVjb2RlX2Rlc2MgKikgZGVzYzsKLQl1MzIgKnAgPSAodTMyICopIGVsZW07CisJX19iZTMyICpwID0gZWxlbTsKIAlzdHJ1Y3QgcG9zaXhfYWNsX2VudHJ5ICplbnRyeTsKIAogCWlmICghbmZzYWNsX2Rlc2MtPmFjbCkgewpkaWZmIC0tZ2l0IGEvZnMvbmZzZC9leHBvcnQuYyBiL2ZzL25mc2QvZXhwb3J0LmMKaW5kZXggZTEzZmEyMy4uZjM3ZGY0NiAxMDA2NDQKLS0tIGEvZnMvbmZzZC9leHBvcnQuYworKysgYi9mcy9uZnNkL2V4cG9ydC5jCkBAIC0xMTQ4LDEyICsxMTQ4LDEyIEBACiAgKiBmb3IgYSBnaXZlbiBORlN2NCBjbGllbnQuICAgVGhlIHJvb3QgaXMgZGVmaW5lZCB0byBiZSB0aGUKICAqIGV4cG9ydCBwb2ludCB3aXRoIGZzaWQ9PTAKICAqLwotaW50CitfX2JlMzIKIGV4cF9wc2V1ZG9yb290KHN0cnVjdCBhdXRoX2RvbWFpbiAqY2xwLCBzdHJ1Y3Qgc3ZjX2ZoICpmaHAsCiAJICAgICAgIHN0cnVjdCBjYWNoZV9yZXEgKmNyZXEpCiB7CiAJc3RydWN0IHN2Y19leHBvcnQgKmV4cDsKLQlpbnQgcnY7CisJX19iZTMyIHJ2OwogCXUzMiBmc2lkdlsyXTsKIAogCW1rX2ZzaWRfdjEoZnNpZHYsIDApOwpkaWZmIC0tZ2l0IGEvZnMvbmZzZC9sb2NrZC5jIGIvZnMvbmZzZC9sb2NrZC5jCmluZGV4IDdiODg5ZmYuLjExZmRhZjcgMTAwNjQ0Ci0tLSBhL2ZzL25mc2QvbG9ja2QuYworKysgYi9mcy9uZnNkL2xvY2tkLmMKQEAgLTI1LDcgKzI1LDcgQEAKIHN0YXRpYyB1MzIKIG5sbV9mb3BlbihzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCBzdHJ1Y3QgbmZzX2ZoICpmLCBzdHJ1Y3QgZmlsZSAqKmZpbHApCiB7Ci0JdTMyCQluZnNlcnI7CisJX19iZTMyCQluZnNlcnI7CiAJc3RydWN0IHN2Y19maAlmaDsKIAogCS8qIG11c3QgaW5pdGlhbGl6ZSBiZWZvcmUgdXNpbmchIGJ1dCBtYXhzaXplIGRvZXNuJ3QgbWF0dGVyICovCkBAIC0zOSwxOCArMzksMjAgQEAKIAlmaF9wdXQoJmZoKTsKIAlycXN0cC0+cnFfY2xpZW50ID0gTlVMTDsKIAlleHBfcmVhZHVubG9jaygpOwotIAkvKiBubG0gYW5kIG5mc2QgZG9uJ3Qgc2hhcmUgZXJyb3IgY29kZXMuCi0JICogd2UgaW52ZW50OiAwID0gbm8gZXJyb3IKLQkgKiAgICAgICAgICAgIDEgPSBzdGFsZSBmaWxlIGhhbmRsZQotCSAqCSAgICAgIDIgPSBvdGhlciBlcnJvcgorIAkvKiBXZSByZXR1cm4gbmxtIGVycm9yIGNvZGVzIGFzIG5sbSBkb2Vzbid0IGtub3cKKwkgKiBhYm91dCBuZnNkLCBidXQgbmZzZCBkb2VzIGtub3cgYWJvdXQgbmxtLi4KIAkgKi8KIAlzd2l0Y2ggKG5mc2VycikgewogCWNhc2UgbmZzX29rOgogCQlyZXR1cm4gMDsKKwljYXNlIG5mc2Vycl9kcm9waXQ6CisJCXJldHVybiBubG1fZHJvcF9yZXBseTsKKyNpZmRlZiBDT05GSUdfTE9DS0RfVjQKIAljYXNlIG5mc2Vycl9zdGFsZToKLQkJcmV0dXJuIDE7CisJCXJldHVybiBubG00X3N0YWxlX2ZoOworI2VuZGlmCiAJZGVmYXVsdDoKLQkJcmV0dXJuIDI7CisJCXJldHVybiBubG1fbGNrX2RlbmllZDsKIAl9CiB9CiAKZGlmZiAtLWdpdCBhL2ZzL25mc2QvbmZzMmFjbC5jIGIvZnMvbmZzZC9uZnMyYWNsLmMKaW5kZXggOTE4Nzc1NS4uZTNlY2EwOCAxMDA2NDQKLS0tIGEvZnMvbmZzZC9uZnMyYWNsLmMKKysrIGIvZnMvbmZzZC9uZnMyYWNsLmMKQEAgLTIxLDcgKzIxLDcgQEAKIC8qCiAgKiBOVUxMIGNhbGwuCiAgKi8KLXN0YXRpYyBpbnQKK3N0YXRpYyBfX2JlMzIKIG5mc2FjbGRfcHJvY19udWxsKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHZvaWQgKmFyZ3AsIHZvaWQgKnJlc3ApCiB7CiAJcmV0dXJuIG5mc19vazsKQEAgLTMwLDEyICszMCwxMiBAQAogLyoKICAqIEdldCB0aGUgQWNjZXNzIGFuZC9vciBEZWZhdWx0IEFDTCBvZiBhIGZpbGUuCiAgKi8KLXN0YXRpYyBpbnQgbmZzYWNsZF9wcm9jX2dldGFjbChzdHJ1Y3Qgc3ZjX3Jxc3QgKiBycXN0cCwKK3N0YXRpYyBfX2JlMzIgbmZzYWNsZF9wcm9jX2dldGFjbChzdHJ1Y3Qgc3ZjX3Jxc3QgKiBycXN0cCwKIAkJc3RydWN0IG5mc2QzX2dldGFjbGFyZ3MgKmFyZ3AsIHN0cnVjdCBuZnNkM19nZXRhY2xyZXMgKnJlc3ApCiB7CiAJc3ZjX2ZoICpmaDsKIAlzdHJ1Y3QgcG9zaXhfYWNsICphY2w7Ci0JaW50IG5mc2VyciA9IDA7CisJX19iZTMyIG5mc2VyciA9IDA7CiAKIAlkcHJpbnRrKCJuZnNkOiBHRVRBQ0woMmFjbCkgICAlc1xuIiwgU1ZDRkhfZm10KCZhcmdwLT5maCkpOwogCkBAIC05NywxMiArOTcsMTIgQEAKIC8qCiAgKiBTZXQgdGhlIEFjY2VzcyBhbmQvb3IgRGVmYXVsdCBBQ0wgb2YgYSBmaWxlLgogICovCi1zdGF0aWMgaW50IG5mc2FjbGRfcHJvY19zZXRhY2woc3RydWN0IHN2Y19ycXN0ICogcnFzdHAsCitzdGF0aWMgX19iZTMyIG5mc2FjbGRfcHJvY19zZXRhY2woc3RydWN0IHN2Y19ycXN0ICogcnFzdHAsCiAJCXN0cnVjdCBuZnNkM19zZXRhY2xhcmdzICphcmdwLAogCQlzdHJ1Y3QgbmZzZF9hdHRyc3RhdCAqcmVzcCkKIHsKIAlzdmNfZmggKmZoOwotCWludCBuZnNlcnIgPSAwOworCV9fYmUzMiBuZnNlcnIgPSAwOwogCiAJZHByaW50aygibmZzZDogU0VUQUNMKDJhY2wpICAgJXNcbiIsIFNWQ0ZIX2ZtdCgmYXJncC0+ZmgpKTsKIApAQCAtMTI4LDcgKzEyOCw3IEBACiAvKgogICogQ2hlY2sgZmlsZSBhdHRyaWJ1dGVzCiAgKi8KLXN0YXRpYyBpbnQgbmZzYWNsZF9wcm9jX2dldGF0dHIoc3RydWN0IHN2Y19ycXN0ICogcnFzdHAsCitzdGF0aWMgX19iZTMyIG5mc2FjbGRfcHJvY19nZXRhdHRyKHN0cnVjdCBzdmNfcnFzdCAqIHJxc3RwLAogCQlzdHJ1Y3QgbmZzZF9maGFuZGxlICphcmdwLCBzdHJ1Y3QgbmZzZF9hdHRyc3RhdCAqcmVzcCkKIHsKIAlkcHJpbnRrKCJuZnNkOiBHRVRBVFRSICAlc1xuIiwgU1ZDRkhfZm10KCZhcmdwLT5maCkpOwpAQCAtMTQwLDEwICsxNDAsMTAgQEAKIC8qCiAgKiBDaGVjayBmaWxlIGFjY2VzcwogICovCi1zdGF0aWMgaW50IG5mc2FjbGRfcHJvY19hY2Nlc3Moc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgc3RydWN0IG5mc2QzX2FjY2Vzc2FyZ3MgKmFyZ3AsCitzdGF0aWMgX19iZTMyIG5mc2FjbGRfcHJvY19hY2Nlc3Moc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgc3RydWN0IG5mc2QzX2FjY2Vzc2FyZ3MgKmFyZ3AsCiAJCXN0cnVjdCBuZnNkM19hY2Nlc3NyZXMgKnJlc3ApCiB7Ci0JaW50IG5mc2VycjsKKwlfX2JlMzIgbmZzZXJyOwogCiAJZHByaW50aygibmZzZDogQUNDRVNTKDJhY2wpICAgJXMgMHgleFxuIiwKIAkJCVNWQ0ZIX2ZtdCgmYXJncC0+ZmgpLApAQCAtMTU4LDcgKzE1OCw3IEBACiAvKgogICogWERSIGRlY29kZSBmdW5jdGlvbnMKICAqLwotc3RhdGljIGludCBuZnNhY2xzdmNfZGVjb2RlX2dldGFjbGFyZ3Moc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgdTMyICpwLAorc3RhdGljIGludCBuZnNhY2xzdmNfZGVjb2RlX2dldGFjbGFyZ3Moc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgX19iZTMyICpwLAogCQlzdHJ1Y3QgbmZzZDNfZ2V0YWNsYXJncyAqYXJncCkKIHsKIAlpZiAoIShwID0gbmZzMnN2Y19kZWNvZGVfZmgocCwgJmFyZ3AtPmZoKSkpCkBAIC0xNjksNyArMTY5LDcgQEAKIH0KIAogCi1zdGF0aWMgaW50IG5mc2FjbHN2Y19kZWNvZGVfc2V0YWNsYXJncyhzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCB1MzIgKnAsCitzdGF0aWMgaW50IG5mc2FjbHN2Y19kZWNvZGVfc2V0YWNsYXJncyhzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCBfX2JlMzIgKnAsCiAJCXN0cnVjdCBuZnNkM19zZXRhY2xhcmdzICphcmdwKQogewogCXN0cnVjdCBrdmVjICpoZWFkID0gcnFzdHAtPnJxX2FyZy5oZWFkOwpAQCAtMTk0LDcgKzE5NCw3IEBACiAJcmV0dXJuIChuID4gMCk7CiB9CiAKLXN0YXRpYyBpbnQgbmZzYWNsc3ZjX2RlY29kZV9maGFuZGxlYXJncyhzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCB1MzIgKnAsCitzdGF0aWMgaW50IG5mc2FjbHN2Y19kZWNvZGVfZmhhbmRsZWFyZ3Moc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgX19iZTMyICpwLAogCQlzdHJ1Y3QgbmZzZF9maGFuZGxlICphcmdwKQogewogCWlmICghKHAgPSBuZnMyc3ZjX2RlY29kZV9maChwLCAmYXJncC0+ZmgpKSkKQEAgLTIwMiw3ICsyMDIsNyBAQAogCXJldHVybiB4ZHJfYXJnc2l6ZV9jaGVjayhycXN0cCwgcCk7CiB9CiAKLXN0YXRpYyBpbnQgbmZzYWNsc3ZjX2RlY29kZV9hY2Nlc3NhcmdzKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHUzMiAqcCwKK3N0YXRpYyBpbnQgbmZzYWNsc3ZjX2RlY29kZV9hY2Nlc3NhcmdzKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIF9fYmUzMiAqcCwKIAkJc3RydWN0IG5mc2QzX2FjY2Vzc2FyZ3MgKmFyZ3ApCiB7CiAJaWYgKCEocCA9IG5mczJzdmNfZGVjb2RlX2ZoKHAsICZhcmdwLT5maCkpKQpAQCAtMjE3LDcgKzIxNyw3IEBACiAgKi8KIAogLyogR0VUQUNMICovCi1zdGF0aWMgaW50IG5mc2FjbHN2Y19lbmNvZGVfZ2V0YWNscmVzKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHUzMiAqcCwKK3N0YXRpYyBpbnQgbmZzYWNsc3ZjX2VuY29kZV9nZXRhY2xyZXMoc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgX19iZTMyICpwLAogCQlzdHJ1Y3QgbmZzZDNfZ2V0YWNscmVzICpyZXNwKQogewogCXN0cnVjdCBkZW50cnkgKmRlbnRyeSA9IHJlc3AtPmZoLmZoX2RlbnRyeTsKQEAgLTI1OSw3ICsyNTksNyBAQAogCXJldHVybiAxOwogfQogCi1zdGF0aWMgaW50IG5mc2FjbHN2Y19lbmNvZGVfYXR0cnN0YXRyZXMoc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgdTMyICpwLAorc3RhdGljIGludCBuZnNhY2xzdmNfZW5jb2RlX2F0dHJzdGF0cmVzKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIF9fYmUzMiAqcCwKIAkJc3RydWN0IG5mc2RfYXR0cnN0YXQgKnJlc3ApCiB7CiAJcCA9IG5mczJzdmNfZW5jb2RlX2ZhdHRyKHJxc3RwLCBwLCAmcmVzcC0+ZmgpOwpAQCAtMjY3LDcgKzI2Nyw3IEBACiB9CiAKIC8qIEFDQ0VTUyAqLwotc3RhdGljIGludCBuZnNhY2xzdmNfZW5jb2RlX2FjY2Vzc3JlcyhzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCB1MzIgKnAsCitzdGF0aWMgaW50IG5mc2FjbHN2Y19lbmNvZGVfYWNjZXNzcmVzKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIF9fYmUzMiAqcCwKIAkJc3RydWN0IG5mc2QzX2FjY2Vzc3JlcyAqcmVzcCkKIHsKIAlwID0gbmZzMnN2Y19lbmNvZGVfZmF0dHIocnFzdHAsIHAsICZyZXNwLT5maCk7CkBAIC0yNzgsNyArMjc4LDcgQEAKIC8qCiAgKiBYRFIgcmVsZWFzZSBmdW5jdGlvbnMKICAqLwotc3RhdGljIGludCBuZnNhY2xzdmNfcmVsZWFzZV9nZXRhY2woc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgdTMyICpwLAorc3RhdGljIGludCBuZnNhY2xzdmNfcmVsZWFzZV9nZXRhY2woc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgX19iZTMyICpwLAogCQlzdHJ1Y3QgbmZzZDNfZ2V0YWNscmVzICpyZXNwKQogewogCWZoX3B1dCgmcmVzcC0+ZmgpOwpAQCAtMjg3LDcgKzI4Nyw3IEBACiAJcmV0dXJuIDE7CiB9CiAKLXN0YXRpYyBpbnQgbmZzYWNsc3ZjX3JlbGVhc2VfZmhhbmRsZShzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCB1MzIgKnAsCitzdGF0aWMgaW50IG5mc2FjbHN2Y19yZWxlYXNlX2ZoYW5kbGUoc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgX19iZTMyICpwLAogCQlzdHJ1Y3QgbmZzZF9maGFuZGxlICpyZXNwKQogewogCWZoX3B1dCgmcmVzcC0+ZmgpOwpkaWZmIC0tZ2l0IGEvZnMvbmZzZC9uZnMzYWNsLmMgYi9mcy9uZnNkL25mczNhY2wuYwppbmRleCBkNGJkYzAwLi5mY2FkMjg5IDEwMDY0NAotLS0gYS9mcy9uZnNkL25mczNhY2wuYworKysgYi9mcy9uZnNkL25mczNhY2wuYwpAQCAtMTksNyArMTksNyBAQAogLyoKICAqIE5VTEwgY2FsbC4KICAqLwotc3RhdGljIGludAorc3RhdGljIF9fYmUzMgogbmZzZDNfcHJvY19udWxsKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHZvaWQgKmFyZ3AsIHZvaWQgKnJlc3ApCiB7CiAJcmV0dXJuIG5mc19vazsKQEAgLTI4LDEyICsyOCwxMiBAQAogLyoKICAqIEdldCB0aGUgQWNjZXNzIGFuZC9vciBEZWZhdWx0IEFDTCBvZiBhIGZpbGUuCiAgKi8KLXN0YXRpYyBpbnQgbmZzZDNfcHJvY19nZXRhY2woc3RydWN0IHN2Y19ycXN0ICogcnFzdHAsCitzdGF0aWMgX19iZTMyIG5mc2QzX3Byb2NfZ2V0YWNsKHN0cnVjdCBzdmNfcnFzdCAqIHJxc3RwLAogCQlzdHJ1Y3QgbmZzZDNfZ2V0YWNsYXJncyAqYXJncCwgc3RydWN0IG5mc2QzX2dldGFjbHJlcyAqcmVzcCkKIHsKIAlzdmNfZmggKmZoOwogCXN0cnVjdCBwb3NpeF9hY2wgKmFjbDsKLQlpbnQgbmZzZXJyID0gMDsKKwlfX2JlMzIgbmZzZXJyID0gMDsKIAogCWZoID0gZmhfY29weSgmcmVzcC0+ZmgsICZhcmdwLT5maCk7CiAJaWYgKChuZnNlcnIgPSBmaF92ZXJpZnkocnFzdHAsICZyZXNwLT5maCwgMCwgTUFZX05PUCkpKQpAQCAtOTMsMTIgKzkzLDEyIEBACiAvKgogICogU2V0IHRoZSBBY2Nlc3MgYW5kL29yIERlZmF1bHQgQUNMIG9mIGEgZmlsZS4KICAqLwotc3RhdGljIGludCBuZnNkM19wcm9jX3NldGFjbChzdHJ1Y3Qgc3ZjX3Jxc3QgKiBycXN0cCwKK3N0YXRpYyBfX2JlMzIgbmZzZDNfcHJvY19zZXRhY2woc3RydWN0IHN2Y19ycXN0ICogcnFzdHAsCiAJCXN0cnVjdCBuZnNkM19zZXRhY2xhcmdzICphcmdwLAogCQlzdHJ1Y3QgbmZzZDNfYXR0cnN0YXQgKnJlc3ApCiB7CiAJc3ZjX2ZoICpmaDsKLQlpbnQgbmZzZXJyID0gMDsKKwlfX2JlMzIgbmZzZXJyID0gMDsKIAogCWZoID0gZmhfY29weSgmcmVzcC0+ZmgsICZhcmdwLT5maCk7CiAJbmZzZXJyID0gZmhfdmVyaWZ5KHJxc3RwLCAmcmVzcC0+ZmgsIDAsIE1BWV9TQVRUUik7CkBAIC0xMjIsNyArMTIyLDcgQEAKIC8qCiAgKiBYRFIgZGVjb2RlIGZ1bmN0aW9ucwogICovCi1zdGF0aWMgaW50IG5mczNzdmNfZGVjb2RlX2dldGFjbGFyZ3Moc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgdTMyICpwLAorc3RhdGljIGludCBuZnMzc3ZjX2RlY29kZV9nZXRhY2xhcmdzKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIF9fYmUzMiAqcCwKIAkJc3RydWN0IG5mc2QzX2dldGFjbGFyZ3MgKmFyZ3MpCiB7CiAJaWYgKCEocCA9IG5mczNzdmNfZGVjb2RlX2ZoKHAsICZhcmdzLT5maCkpKQpAQCAtMTMzLDcgKzEzMyw3IEBACiB9CiAKIAotc3RhdGljIGludCBuZnMzc3ZjX2RlY29kZV9zZXRhY2xhcmdzKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHUzMiAqcCwKK3N0YXRpYyBpbnQgbmZzM3N2Y19kZWNvZGVfc2V0YWNsYXJncyhzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCBfX2JlMzIgKnAsCiAJCXN0cnVjdCBuZnNkM19zZXRhY2xhcmdzICphcmdzKQogewogCXN0cnVjdCBrdmVjICpoZWFkID0gcnFzdHAtPnJxX2FyZy5oZWFkOwpAQCAtMTYzLDcgKzE2Myw3IEBACiAgKi8KIAogLyogR0VUQUNMICovCi1zdGF0aWMgaW50IG5mczNzdmNfZW5jb2RlX2dldGFjbHJlcyhzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCB1MzIgKnAsCitzdGF0aWMgaW50IG5mczNzdmNfZW5jb2RlX2dldGFjbHJlcyhzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCBfX2JlMzIgKnAsCiAJCXN0cnVjdCBuZnNkM19nZXRhY2xyZXMgKnJlc3ApCiB7CiAJc3RydWN0IGRlbnRyeSAqZGVudHJ5ID0gcmVzcC0+ZmguZmhfZGVudHJ5OwpAQCAtMjA4LDcgKzIwOCw3IEBACiB9CiAKIC8qIFNFVEFDTCAqLwotc3RhdGljIGludCBuZnMzc3ZjX2VuY29kZV9zZXRhY2xyZXMoc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgdTMyICpwLAorc3RhdGljIGludCBuZnMzc3ZjX2VuY29kZV9zZXRhY2xyZXMoc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgX19iZTMyICpwLAogCQlzdHJ1Y3QgbmZzZDNfYXR0cnN0YXQgKnJlc3ApCiB7CiAJcCA9IG5mczNzdmNfZW5jb2RlX3Bvc3Rfb3BfYXR0cihycXN0cCwgcCwgJnJlc3AtPmZoKTsKQEAgLTIxOSw3ICsyMTksNyBAQAogLyoKICAqIFhEUiByZWxlYXNlIGZ1bmN0aW9ucwogICovCi1zdGF0aWMgaW50IG5mczNzdmNfcmVsZWFzZV9nZXRhY2woc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgdTMyICpwLAorc3RhdGljIGludCBuZnMzc3ZjX3JlbGVhc2VfZ2V0YWNsKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIF9fYmUzMiAqcCwKIAkJc3RydWN0IG5mc2QzX2dldGFjbHJlcyAqcmVzcCkKIHsKIAlmaF9wdXQoJnJlc3AtPmZoKTsKZGlmZiAtLWdpdCBhL2ZzL25mc2QvbmZzM3Byb2MuYyBiL2ZzL25mc2QvbmZzM3Byb2MuYwppbmRleCBhNWViYzdkLi43ZjViYWQwIDEwMDY0NAotLS0gYS9mcy9uZnNkL25mczNwcm9jLmMKKysrIGIvZnMvbmZzZC9uZnMzcHJvYy5jCkBAIC00Myw3ICs0Myw3IEBACiAvKgogICogTlVMTCBjYWxsLgogICovCi1zdGF0aWMgaW50CitzdGF0aWMgX19iZTMyCiBuZnNkM19wcm9jX251bGwoc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgdm9pZCAqYXJncCwgdm9pZCAqcmVzcCkKIHsKIAlyZXR1cm4gbmZzX29rOwpAQCAtNTIsMTEgKzUyLDEyIEBACiAvKgogICogR2V0IGEgZmlsZSdzIGF0dHJpYnV0ZXMKICAqLwotc3RhdGljIGludAorc3RhdGljIF9fYmUzMgogbmZzZDNfcHJvY19nZXRhdHRyKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHN0cnVjdCBuZnNkX2ZoYW5kbGUgICphcmdwLAogCQkJCQkgICBzdHJ1Y3QgbmZzZDNfYXR0cnN0YXQgKnJlc3ApCiB7Ci0JaW50CWVyciwgbmZzZXJyOworCWludAllcnI7CisJX19iZTMyCW5mc2VycjsKIAogCWRwcmludGsoIm5mc2Q6IEdFVEFUVFIoMykgICVzXG4iLAogCQlTVkNGSF9mbXQoJmFyZ3AtPmZoKSk7CkBAIC03NiwxMSArNzcsMTEgQEAKIC8qCiAgKiBTZXQgYSBmaWxlJ3MgYXR0cmlidXRlcwogICovCi1zdGF0aWMgaW50CitzdGF0aWMgX19iZTMyCiBuZnNkM19wcm9jX3NldGF0dHIoc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgc3RydWN0IG5mc2QzX3NhdHRyYXJncyAqYXJncCwKIAkJCQkJICAgc3RydWN0IG5mc2QzX2F0dHJzdGF0ICAqcmVzcCkKIHsKLQlpbnQJbmZzZXJyOworCV9fYmUzMgluZnNlcnI7CiAKIAlkcHJpbnRrKCJuZnNkOiBTRVRBVFRSKDMpICAlc1xuIiwKIAkJCQlTVkNGSF9mbXQoJmFyZ3AtPmZoKSk7CkBAIC05NCwxMSArOTUsMTEgQEAKIC8qCiAgKiBMb29rIHVwIGEgcGF0aCBuYW1lIGNvbXBvbmVudAogICovCi1zdGF0aWMgaW50CitzdGF0aWMgX19iZTMyCiBuZnNkM19wcm9jX2xvb2t1cChzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCBzdHJ1Y3QgbmZzZDNfZGlyb3BhcmdzICphcmdwLAogCQkJCQkgIHN0cnVjdCBuZnNkM19kaXJvcHJlcyAgKnJlc3ApCiB7Ci0JaW50CW5mc2VycjsKKwlfX2JlMzIJbmZzZXJyOwogCiAJZHByaW50aygibmZzZDogTE9PS1VQKDMpICAgJXMgJS4qc1xuIiwKIAkJCQlTVkNGSF9mbXQoJmFyZ3AtPmZoKSwKQEAgLTExOCwxMSArMTE5LDExIEBACiAvKgogICogQ2hlY2sgZmlsZSBhY2Nlc3MKICAqLwotc3RhdGljIGludAorc3RhdGljIF9fYmUzMgogbmZzZDNfcHJvY19hY2Nlc3Moc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgc3RydWN0IG5mc2QzX2FjY2Vzc2FyZ3MgKmFyZ3AsCiAJCQkJCSAgc3RydWN0IG5mc2QzX2FjY2Vzc3JlcyAqcmVzcCkKIHsKLQlpbnQJbmZzZXJyOworCV9fYmUzMgluZnNlcnI7CiAKIAlkcHJpbnRrKCJuZnNkOiBBQ0NFU1MoMykgICAlcyAweCV4XG4iLAogCQkJCVNWQ0ZIX2ZtdCgmYXJncC0+ZmgpLApAQCAtMTM3LDExICsxMzgsMTEgQEAKIC8qCiAgKiBSZWFkIGEgc3ltbGluay4KICAqLwotc3RhdGljIGludAorc3RhdGljIF9fYmUzMgogbmZzZDNfcHJvY19yZWFkbGluayhzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCBzdHJ1Y3QgbmZzZDNfcmVhZGxpbmthcmdzICphcmdwLAogCQkJCQkgICBzdHJ1Y3QgbmZzZDNfcmVhZGxpbmtyZXMgKnJlc3ApCiB7Ci0JaW50IG5mc2VycjsKKwlfX2JlMzIgbmZzZXJyOwogCiAJZHByaW50aygibmZzZDogUkVBRExJTksoMykgJXNcbiIsIFNWQ0ZIX2ZtdCgmYXJncC0+ZmgpKTsKIApAQCAtMTU1LDExICsxNTYsMTEgQEAKIC8qCiAgKiBSZWFkIGEgcG9ydGlvbiBvZiBhIGZpbGUuCiAgKi8KLXN0YXRpYyBpbnQKK3N0YXRpYyBfX2JlMzIKIG5mc2QzX3Byb2NfcmVhZChzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCBzdHJ1Y3QgbmZzZDNfcmVhZGFyZ3MgKmFyZ3AsCiAJCQkJICAgICAgICBzdHJ1Y3QgbmZzZDNfcmVhZHJlcyAgKnJlc3ApCiB7Ci0JaW50CW5mc2VycjsKKwlfX2JlMzIJbmZzZXJyOwogCXUzMgltYXhfYmxvY2tzaXplID0gc3ZjX21heF9wYXlsb2FkKHJxc3RwKTsKIAogCWRwcmludGsoIm5mc2Q6IFJFQUQoMykgJXMgJWx1IGJ5dGVzIGF0ICVsdVxuIiwKQEAgLTE5NSwxMSArMTk2LDExIEBACiAvKgogICogV3JpdGUgZGF0YSB0byBhIGZpbGUKICAqLwotc3RhdGljIGludAorc3RhdGljIF9fYmUzMgogbmZzZDNfcHJvY193cml0ZShzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCBzdHJ1Y3QgbmZzZDNfd3JpdGVhcmdzICphcmdwLAogCQkJCQkgc3RydWN0IG5mc2QzX3dyaXRlcmVzICAqcmVzcCkKIHsKLQlpbnQJbmZzZXJyOworCV9fYmUzMgluZnNlcnI7CiAKIAlkcHJpbnRrKCJuZnNkOiBXUklURSgzKSAgICAlcyAlZCBieXRlcyBhdCAlbGQlc1xuIiwKIAkJCQlTVkNGSF9mbXQoJmFyZ3AtPmZoKSwKQEAgLTIyMywxMyArMjI0LDEzIEBACiAgKiBBdCBsZWFzdCBpbiB0aGVvcnk7IHdlJ2xsIHNlZSBob3cgaXQgZmFyZXMgaW4gcHJhY3RpY2Ugd2hlbiB0aGUKICAqIGZpcnN0IHJlcG9ydHMgYWJvdXQgU3VuT1MgY29tcGF0aWJpbGl0eSBwcm9ibGVtcyBzdGFydCB0byBwb3VyIGluLi4uCiAgKi8KLXN0YXRpYyBpbnQKK3N0YXRpYyBfX2JlMzIKIG5mc2QzX3Byb2NfY3JlYXRlKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHN0cnVjdCBuZnNkM19jcmVhdGVhcmdzICphcmdwLAogCQkJCQkgIHN0cnVjdCBuZnNkM19kaXJvcHJlcyAgICpyZXNwKQogewogCXN2Y19maAkJKmRpcmZocCwgKm5ld2ZocCA9IE5VTEw7CiAJc3RydWN0IGlhdHRyCSphdHRyOwotCXUzMgkJbmZzZXJyOworCV9fYmUzMgkJbmZzZXJyOwogCiAJZHByaW50aygibmZzZDogQ1JFQVRFKDMpICAgJXMgJS4qc1xuIiwKIAkJCQlTVkNGSF9mbXQoJmFyZ3AtPmZoKSwKQEAgLTI1Nyw3ICsyNTgsNyBAQAogCS8qIE5vdyBjcmVhdGUgdGhlIGZpbGUgYW5kIHNldCBhdHRyaWJ1dGVzICovCiAJbmZzZXJyID0gbmZzZF9jcmVhdGVfdjMocnFzdHAsIGRpcmZocCwgYXJncC0+bmFtZSwgYXJncC0+bGVuLAogCQkJCWF0dHIsIG5ld2ZocCwKLQkJCQlhcmdwLT5jcmVhdGVtb2RlLCBhcmdwLT52ZXJmLCBOVUxMKTsKKwkJCQlhcmdwLT5jcmVhdGVtb2RlLCBhcmdwLT52ZXJmLCBOVUxMLCBOVUxMKTsKIAogCVJFVFVSTl9TVEFUVVMobmZzZXJyKTsKIH0KQEAgLTI2NSwxMSArMjY2LDExIEBACiAvKgogICogTWFrZSBkaXJlY3RvcnkuIFRoaXMgb3BlcmF0aW9uIGlzIG5vdCBpZGVtcG90ZW50LgogICovCi1zdGF0aWMgaW50CitzdGF0aWMgX19iZTMyCiBuZnNkM19wcm9jX21rZGlyKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHN0cnVjdCBuZnNkM19jcmVhdGVhcmdzICphcmdwLAogCQkJCQkgc3RydWN0IG5mc2QzX2Rpcm9wcmVzICAgKnJlc3ApCiB7Ci0JaW50CW5mc2VycjsKKwlfX2JlMzIJbmZzZXJyOwogCiAJZHByaW50aygibmZzZDogTUtESVIoMykgICAgJXMgJS4qc1xuIiwKIAkJCQlTVkNGSF9mbXQoJmFyZ3AtPmZoKSwKQEAgLTI4NSwxMSArMjg2LDExIEBACiAJUkVUVVJOX1NUQVRVUyhuZnNlcnIpOwogfQogCi1zdGF0aWMgaW50CitzdGF0aWMgX19iZTMyCiBuZnNkM19wcm9jX3N5bWxpbmsoc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgc3RydWN0IG5mc2QzX3N5bWxpbmthcmdzICphcmdwLAogCQkJCQkgICBzdHJ1Y3QgbmZzZDNfZGlyb3ByZXMgICAgKnJlc3ApCiB7Ci0JaW50CW5mc2VycjsKKwlfX2JlMzIJbmZzZXJyOwogCiAJZHByaW50aygibmZzZDogU1lNTElOSygzKSAgJXMgJS4qcyAtPiAlLipzXG4iLAogCQkJCVNWQ0ZIX2ZtdCgmYXJncC0+ZmZoKSwKQEAgLTMwNywxMSArMzA4LDEyIEBACiAvKgogICogTWFrZSBzb2NrZXQvZmlmby9kZXZpY2UuCiAgKi8KLXN0YXRpYyBpbnQKK3N0YXRpYyBfX2JlMzIKIG5mc2QzX3Byb2NfbWtub2Qoc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgc3RydWN0IG5mc2QzX21rbm9kYXJncyAqYXJncCwKIAkJCQkJIHN0cnVjdCBuZnNkM19kaXJvcHJlcyAgKnJlc3ApCiB7Ci0JaW50CW5mc2VyciwgdHlwZTsKKwlfX2JlMzIJbmZzZXJyOworCWludCB0eXBlOwogCWRldl90CXJkZXYgPSAwOwogCiAJZHByaW50aygibmZzZDogTUtOT0QoMykgICAgJXMgJS4qc1xuIiwKQEAgLTM0MywxMSArMzQ1LDExIEBACiAvKgogICogUmVtb3ZlIGZpbGUvZmlmby9zb2NrZXQgZXRjLgogICovCi1zdGF0aWMgaW50CitzdGF0aWMgX19iZTMyCiBuZnNkM19wcm9jX3JlbW92ZShzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCBzdHJ1Y3QgbmZzZDNfZGlyb3BhcmdzICphcmdwLAogCQkJCQkgIHN0cnVjdCBuZnNkM19hdHRyc3RhdCAgKnJlc3ApCiB7Ci0JaW50CW5mc2VycjsKKwlfX2JlMzIJbmZzZXJyOwogCiAJZHByaW50aygibmZzZDogUkVNT1ZFKDMpICAgJXMgJS4qc1xuIiwKIAkJCQlTVkNGSF9mbXQoJmFyZ3AtPmZoKSwKQEAgLTM2MywxMSArMzY1LDExIEBACiAvKgogICogUmVtb3ZlIGEgZGlyZWN0b3J5CiAgKi8KLXN0YXRpYyBpbnQKK3N0YXRpYyBfX2JlMzIKIG5mc2QzX3Byb2Nfcm1kaXIoc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgc3RydWN0IG5mc2QzX2Rpcm9wYXJncyAqYXJncCwKIAkJCQkJIHN0cnVjdCBuZnNkM19hdHRyc3RhdCAgKnJlc3ApCiB7Ci0JaW50CW5mc2VycjsKKwlfX2JlMzIJbmZzZXJyOwogCiAJZHByaW50aygibmZzZDogUk1ESVIoMykgICAgJXMgJS4qc1xuIiwKIAkJCQlTVkNGSF9mbXQoJmFyZ3AtPmZoKSwKQEAgLTM3OSwxMSArMzgxLDExIEBACiAJUkVUVVJOX1NUQVRVUyhuZnNlcnIpOwogfQogCi1zdGF0aWMgaW50CitzdGF0aWMgX19iZTMyCiBuZnNkM19wcm9jX3JlbmFtZShzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCBzdHJ1Y3QgbmZzZDNfcmVuYW1lYXJncyAqYXJncCwKIAkJCQkJICBzdHJ1Y3QgbmZzZDNfcmVuYW1lcmVzICAqcmVzcCkKIHsKLQlpbnQJbmZzZXJyOworCV9fYmUzMgluZnNlcnI7CiAKIAlkcHJpbnRrKCJuZnNkOiBSRU5BTUUoMykgICAlcyAlLipzIC0+XG4iLAogCQkJCVNWQ0ZIX2ZtdCgmYXJncC0+ZmZoKSwKQEAgLTQwMSwxMSArNDAzLDExIEBACiAJUkVUVVJOX1NUQVRVUyhuZnNlcnIpOwogfQogCi1zdGF0aWMgaW50CitzdGF0aWMgX19iZTMyCiBuZnNkM19wcm9jX2xpbmsoc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgc3RydWN0IG5mc2QzX2xpbmthcmdzICphcmdwLAogCQkJCQlzdHJ1Y3QgbmZzZDNfbGlua3JlcyAgKnJlc3ApCiB7Ci0JaW50CW5mc2VycjsKKwlfX2JlMzIJbmZzZXJyOwogCiAJZHByaW50aygibmZzZDogTElOSygzKSAgICAgJXMgLT5cbiIsCiAJCQkJU1ZDRkhfZm10KCZhcmdwLT5mZmgpKTsKQEAgLTQyNCwxMSArNDI2LDEyIEBACiAvKgogICogUmVhZCBhIHBvcnRpb24gb2YgYSBkaXJlY3RvcnkuCiAgKi8KLXN0YXRpYyBpbnQKK3N0YXRpYyBfX2JlMzIKIG5mc2QzX3Byb2NfcmVhZGRpcihzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCBzdHJ1Y3QgbmZzZDNfcmVhZGRpcmFyZ3MgKmFyZ3AsCiAJCQkJCSAgIHN0cnVjdCBuZnNkM19yZWFkZGlycmVzICAqcmVzcCkKIHsKLQlpbnQJCW5mc2VyciwgY291bnQ7CisJX19iZTMyCQluZnNlcnI7CisJaW50CQljb3VudDsKIAogCWRwcmludGsoIm5mc2Q6IFJFQURESVIoMykgICVzICVkIGJ5dGVzIGF0ICVkXG4iLAogCQkJCVNWQ0ZIX2ZtdCgmYXJncC0+ZmgpLApAQCAtNDU5LDExICs0NjIsMTIgQEAKICAqIFJlYWQgYSBwb3J0aW9uIG9mIGEgZGlyZWN0b3J5LCBpbmNsdWRpbmcgZmlsZSBoYW5kbGVzIGFuZCBhdHRycy4KICAqIEZvciBub3csIHdlIGNob29zZSB0byBpZ25vcmUgdGhlIGRpcmNvdW50IHBhcmFtZXRlci4KICAqLwotc3RhdGljIGludAorc3RhdGljIF9fYmUzMgogbmZzZDNfcHJvY19yZWFkZGlycGx1cyhzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCBzdHJ1Y3QgbmZzZDNfcmVhZGRpcmFyZ3MgKmFyZ3AsCiAJCQkJCSAgICAgICBzdHJ1Y3QgbmZzZDNfcmVhZGRpcnJlcyAgKnJlc3ApCiB7Ci0JaW50CW5mc2VyciwgY291bnQgPSAwOworCV9fYmUzMgluZnNlcnI7CisJaW50CWNvdW50ID0gMDsKIAlsb2ZmX3QJb2Zmc2V0OwogCWludAlpOwogCWNhZGRyX3QJcGFnZV9hZGRyID0gTlVMTDsKQEAgLTUxNywxMSArNTIxLDExIEBACiAvKgogICogR2V0IGZpbGUgc3lzdGVtIHN0YXRzCiAgKi8KLXN0YXRpYyBpbnQKK3N0YXRpYyBfX2JlMzIKIG5mc2QzX3Byb2NfZnNzdGF0KHN0cnVjdCBzdmNfcnFzdCAqIHJxc3RwLCBzdHJ1Y3QgbmZzZF9maGFuZGxlICAgICphcmdwLAogCQkJCQkgICBzdHJ1Y3QgbmZzZDNfZnNzdGF0cmVzICpyZXNwKQogewotCWludAluZnNlcnI7CisJX19iZTMyCW5mc2VycjsKIAogCWRwcmludGsoIm5mc2Q6IEZTU1RBVCgzKSAgICVzXG4iLAogCQkJCVNWQ0ZIX2ZtdCgmYXJncC0+ZmgpKTsKQEAgLTUzNCwxMSArNTM4LDExIEBACiAvKgogICogR2V0IGZpbGUgc3lzdGVtIGluZm8KICAqLwotc3RhdGljIGludAorc3RhdGljIF9fYmUzMgogbmZzZDNfcHJvY19mc2luZm8oc3RydWN0IHN2Y19ycXN0ICogcnFzdHAsIHN0cnVjdCBuZnNkX2ZoYW5kbGUgICAgKmFyZ3AsCiAJCQkJCSAgIHN0cnVjdCBuZnNkM19mc2luZm9yZXMgKnJlc3ApCiB7Ci0JaW50CW5mc2VycjsKKwlfX2JlMzIJbmZzZXJyOwogCXUzMgltYXhfYmxvY2tzaXplID0gc3ZjX21heF9wYXlsb2FkKHJxc3RwKTsKIAogCWRwcmludGsoIm5mc2Q6IEZTSU5GTygzKSAgICVzXG4iLApAQCAtNTc2LDExICs1ODAsMTEgQEAKIC8qCiAgKiBHZXQgcGF0aGNvbmYgaW5mbyBmb3IgdGhlIHNwZWNpZmllZCBmaWxlCiAgKi8KLXN0YXRpYyBpbnQKK3N0YXRpYyBfX2JlMzIKIG5mc2QzX3Byb2NfcGF0aGNvbmYoc3RydWN0IHN2Y19ycXN0ICogcnFzdHAsIHN0cnVjdCBuZnNkX2ZoYW5kbGUgICAgICAqYXJncCwKIAkJCQkJICAgICBzdHJ1Y3QgbmZzZDNfcGF0aGNvbmZyZXMgKnJlc3ApCiB7Ci0JaW50CW5mc2VycjsKKwlfX2JlMzIJbmZzZXJyOwogCiAJZHByaW50aygibmZzZDogUEFUSENPTkYoMykgJXNcbiIsCiAJCQkJU1ZDRkhfZm10KCZhcmdwLT5maCkpOwpAQCAtNjE5LDExICs2MjMsMTEgQEAKIC8qCiAgKiBDb21taXQgYSBmaWxlIChyYW5nZSkgdG8gc3RhYmxlIHN0b3JhZ2UuCiAgKi8KLXN0YXRpYyBpbnQKK3N0YXRpYyBfX2JlMzIKIG5mc2QzX3Byb2NfY29tbWl0KHN0cnVjdCBzdmNfcnFzdCAqIHJxc3RwLCBzdHJ1Y3QgbmZzZDNfY29tbWl0YXJncyAqYXJncCwKIAkJCQkJICAgc3RydWN0IG5mc2QzX2NvbW1pdHJlcyAgKnJlc3ApCiB7Ci0JaW50CW5mc2VycjsKKwlfX2JlMzIJbmZzZXJyOwogCiAJZHByaW50aygibmZzZDogQ09NTUlUKDMpICAgJXMgJXVAJUx1XG4iLAogCQkJCVNWQ0ZIX2ZtdCgmYXJncC0+ZmgpLApkaWZmIC0tZ2l0IGEvZnMvbmZzZC9uZnMzeGRyLmMgYi9mcy9uZnNkL25mczN4ZHIuYwppbmRleCAyNDdkNTE4Li5iNGJhY2EzIDEwMDY0NAotLS0gYS9mcy9uZnNkL25mczN4ZHIuYworKysgYi9mcy9uZnNkL25mczN4ZHIuYwpAQCAtNDIsMjMgKzQyLDIzIEBACiAvKgogICogWERSIGZ1bmN0aW9ucyBmb3IgYmFzaWMgTkZTIHR5cGVzCiAgKi8KLXN0YXRpYyBpbmxpbmUgdTMyICoKLWVuY29kZV90aW1lMyh1MzIgKnAsIHN0cnVjdCB0aW1lc3BlYyAqdGltZSkKK3N0YXRpYyBpbmxpbmUgX19iZTMyICoKK2VuY29kZV90aW1lMyhfX2JlMzIgKnAsIHN0cnVjdCB0aW1lc3BlYyAqdGltZSkKIHsKIAkqcCsrID0gaHRvbmwoKHUzMikgdGltZS0+dHZfc2VjKTsgKnArKyA9IGh0b25sKHRpbWUtPnR2X25zZWMpOwogCXJldHVybiBwOwogfQogCi1zdGF0aWMgaW5saW5lIHUzMiAqCi1kZWNvZGVfdGltZTModTMyICpwLCBzdHJ1Y3QgdGltZXNwZWMgKnRpbWUpCitzdGF0aWMgaW5saW5lIF9fYmUzMiAqCitkZWNvZGVfdGltZTMoX19iZTMyICpwLCBzdHJ1Y3QgdGltZXNwZWMgKnRpbWUpCiB7CiAJdGltZS0+dHZfc2VjID0gbnRvaGwoKnArKyk7CiAJdGltZS0+dHZfbnNlYyA9IG50b2hsKCpwKyspOwogCXJldHVybiBwOwogfQogCi1zdGF0aWMgaW5saW5lIHUzMiAqCi1kZWNvZGVfZmgodTMyICpwLCBzdHJ1Y3Qgc3ZjX2ZoICpmaHApCitzdGF0aWMgaW5saW5lIF9fYmUzMiAqCitkZWNvZGVfZmgoX19iZTMyICpwLCBzdHJ1Y3Qgc3ZjX2ZoICpmaHApCiB7CiAJdW5zaWduZWQgaW50IHNpemU7CiAJZmhfaW5pdChmaHAsIE5GUzNfRkhTSVpFKTsKQEAgLTcyLDEzICs3MiwxMyBAQAogfQogCiAvKiBIZWxwZXIgZnVuY3Rpb24gZm9yIE5GU3YzIEFDTCBjb2RlICovCi11MzIgKm5mczNzdmNfZGVjb2RlX2ZoKHUzMiAqcCwgc3RydWN0IHN2Y19maCAqZmhwKQorX19iZTMyICpuZnMzc3ZjX2RlY29kZV9maChfX2JlMzIgKnAsIHN0cnVjdCBzdmNfZmggKmZocCkKIHsKIAlyZXR1cm4gZGVjb2RlX2ZoKHAsIGZocCk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdTMyICoKLWVuY29kZV9maCh1MzIgKnAsIHN0cnVjdCBzdmNfZmggKmZocCkKK3N0YXRpYyBpbmxpbmUgX19iZTMyICoKK2VuY29kZV9maChfX2JlMzIgKnAsIHN0cnVjdCBzdmNfZmggKmZocCkKIHsKIAl1bnNpZ25lZCBpbnQgc2l6ZSA9IGZocC0+ZmhfaGFuZGxlLmZoX3NpemU7CiAJKnArKyA9IGh0b25sKHNpemUpOwpAQCAtOTEsOCArOTEsOCBAQAogICogRGVjb2RlIGEgZmlsZSBuYW1lIGFuZCBtYWtlIHN1cmUgdGhhdCB0aGUgcGF0aCBjb250YWlucwogICogbm8gc2xhc2hlcyBvciBudWxsIGJ5dGVzLgogICovCi1zdGF0aWMgaW5saW5lIHUzMiAqCi1kZWNvZGVfZmlsZW5hbWUodTMyICpwLCBjaGFyICoqbmFtcCwgaW50ICpsZW5wKQorc3RhdGljIGlubGluZSBfX2JlMzIgKgorZGVjb2RlX2ZpbGVuYW1lKF9fYmUzMiAqcCwgY2hhciAqKm5hbXAsIGludCAqbGVucCkKIHsKIAljaGFyCQkqbmFtZTsKIAlpbnQJCWk7CkBAIC0xMDcsOCArMTA3LDggQEAKIAlyZXR1cm4gcDsKIH0KIAotc3RhdGljIGlubGluZSB1MzIgKgotZGVjb2RlX3NhdHRyMyh1MzIgKnAsIHN0cnVjdCBpYXR0ciAqaWFwKQorc3RhdGljIGlubGluZSBfX2JlMzIgKgorZGVjb2RlX3NhdHRyMyhfX2JlMzIgKnAsIHN0cnVjdCBpYXR0ciAqaWFwKQogewogCXUzMgl0bXA7CiAKQEAgLTE1Myw4ICsxNTMsOCBAQAogCXJldHVybiBwOwogfQogCi1zdGF0aWMgaW5saW5lIHUzMiAqCi1lbmNvZGVfZmF0dHIzKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHUzMiAqcCwgc3RydWN0IHN2Y19maCAqZmhwLAorc3RhdGljIGlubGluZSBfX2JlMzIgKgorZW5jb2RlX2ZhdHRyMyhzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCBfX2JlMzIgKnAsIHN0cnVjdCBzdmNfZmggKmZocCwKIAkgICAgICBzdHJ1Y3Qga3N0YXQgKnN0YXQpCiB7CiAJc3RydWN0IGRlbnRyeQkqZGVudHJ5ID0gZmhwLT5maF9kZW50cnk7CkBAIC0xODYsOCArMTg2LDggQEAKIAlyZXR1cm4gcDsKIH0KIAotc3RhdGljIGlubGluZSB1MzIgKgotZW5jb2RlX3NhdmVkX3Bvc3RfYXR0cihzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCB1MzIgKnAsIHN0cnVjdCBzdmNfZmggKmZocCkKK3N0YXRpYyBpbmxpbmUgX19iZTMyICoKK2VuY29kZV9zYXZlZF9wb3N0X2F0dHIoc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgX19iZTMyICpwLCBzdHJ1Y3Qgc3ZjX2ZoICpmaHApCiB7CiAJc3RydWN0IGlub2RlCSppbm9kZSA9IGZocC0+ZmhfZGVudHJ5LT5kX2lub2RlOwogCkBAIC0yMjQsOCArMjI0LDggQEAKICAqIFRoZSBpbm9kZSBtYXkgYmUgTlVMTCBpZiB0aGUgY2FsbCBmYWlsZWQgYmVjYXVzZSBvZiBhIHN0YWxlIGZpbGUKICAqIGhhbmRsZS4gSW4gdGhpcyBjYXNlLCBubyBhdHRyaWJ1dGVzIGFyZSByZXR1cm5lZC4KICAqLwotc3RhdGljIHUzMiAqCi1lbmNvZGVfcG9zdF9vcF9hdHRyKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHUzMiAqcCwgc3RydWN0IHN2Y19maCAqZmhwKQorc3RhdGljIF9fYmUzMiAqCitlbmNvZGVfcG9zdF9vcF9hdHRyKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIF9fYmUzMiAqcCwgc3RydWN0IHN2Y19maCAqZmhwKQogewogCXN0cnVjdCBkZW50cnkgKmRlbnRyeSA9IGZocC0+ZmhfZGVudHJ5OwogCWlmIChkZW50cnkgJiYgZGVudHJ5LT5kX2lub2RlICE9IE5VTEwpIHsKQEAgLTI0Myw4ICsyNDMsOCBAQAogfQogCiAvKiBIZWxwZXIgZm9yIE5GU3YzIEFDTHMgKi8KLXUzMiAqCi1uZnMzc3ZjX2VuY29kZV9wb3N0X29wX2F0dHIoc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgdTMyICpwLCBzdHJ1Y3Qgc3ZjX2ZoICpmaHApCitfX2JlMzIgKgorbmZzM3N2Y19lbmNvZGVfcG9zdF9vcF9hdHRyKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIF9fYmUzMiAqcCwgc3RydWN0IHN2Y19maCAqZmhwKQogewogCXJldHVybiBlbmNvZGVfcG9zdF9vcF9hdHRyKHJxc3RwLCBwLCBmaHApOwogfQpAQCAtMjUyLDggKzI1Miw4IEBACiAvKgogICogRW5vY2RlIHdlYWsgY2FjaGUgY29uc2lzdGVuY3kgZGF0YQogICovCi1zdGF0aWMgdTMyICoKLWVuY29kZV93Y2NfZGF0YShzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCB1MzIgKnAsIHN0cnVjdCBzdmNfZmggKmZocCkKK3N0YXRpYyBfX2JlMzIgKgorZW5jb2RlX3djY19kYXRhKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIF9fYmUzMiAqcCwgc3RydWN0IHN2Y19maCAqZmhwKQogewogCXN0cnVjdCBkZW50cnkJKmRlbnRyeSA9IGZocC0+ZmhfZGVudHJ5OwogCkBAIC0yNzgsNyArMjc4LDcgQEAKICAqIFhEUiBkZWNvZGUgZnVuY3Rpb25zCiAgKi8KIGludAotbmZzM3N2Y19kZWNvZGVfZmhhbmRsZShzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCB1MzIgKnAsIHN0cnVjdCBuZnNkX2ZoYW5kbGUgKmFyZ3MpCituZnMzc3ZjX2RlY29kZV9maGFuZGxlKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIF9fYmUzMiAqcCwgc3RydWN0IG5mc2RfZmhhbmRsZSAqYXJncykKIHsKIAlpZiAoIShwID0gZGVjb2RlX2ZoKHAsICZhcmdzLT5maCkpKQogCQlyZXR1cm4gMDsKQEAgLTI4Niw3ICsyODYsNyBAQAogfQogCiBpbnQKLW5mczNzdmNfZGVjb2RlX3NhdHRyYXJncyhzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCB1MzIgKnAsCituZnMzc3ZjX2RlY29kZV9zYXR0cmFyZ3Moc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgX19iZTMyICpwLAogCQkJCQlzdHJ1Y3QgbmZzZDNfc2F0dHJhcmdzICphcmdzKQogewogCWlmICghKHAgPSBkZWNvZGVfZmgocCwgJmFyZ3MtPmZoKSkKQEAgLTMwMyw3ICszMDMsNyBAQAogfQogCiBpbnQKLW5mczNzdmNfZGVjb2RlX2Rpcm9wYXJncyhzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCB1MzIgKnAsCituZnMzc3ZjX2RlY29kZV9kaXJvcGFyZ3Moc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgX19iZTMyICpwLAogCQkJCQlzdHJ1Y3QgbmZzZDNfZGlyb3BhcmdzICphcmdzKQogewogCWlmICghKHAgPSBkZWNvZGVfZmgocCwgJmFyZ3MtPmZoKSkKQEAgLTMxNCw3ICszMTQsNyBAQAogfQogCiBpbnQKLW5mczNzdmNfZGVjb2RlX2FjY2Vzc2FyZ3Moc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgdTMyICpwLAorbmZzM3N2Y19kZWNvZGVfYWNjZXNzYXJncyhzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCBfX2JlMzIgKnAsCiAJCQkJCXN0cnVjdCBuZnNkM19hY2Nlc3NhcmdzICphcmdzKQogewogCWlmICghKHAgPSBkZWNvZGVfZmgocCwgJmFyZ3MtPmZoKSkpCkBAIC0zMjUsNyArMzI1LDcgQEAKIH0KIAogaW50Ci1uZnMzc3ZjX2RlY29kZV9yZWFkYXJncyhzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCB1MzIgKnAsCituZnMzc3ZjX2RlY29kZV9yZWFkYXJncyhzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCBfX2JlMzIgKnAsCiAJCQkJCXN0cnVjdCBuZnNkM19yZWFkYXJncyAqYXJncykKIHsKIAl1bnNpZ25lZCBpbnQgbGVuOwpAQCAtMzU1LDcgKzM1NSw3IEBACiB9CiAKIGludAotbmZzM3N2Y19kZWNvZGVfd3JpdGVhcmdzKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHUzMiAqcCwKK25mczNzdmNfZGVjb2RlX3dyaXRlYXJncyhzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCBfX2JlMzIgKnAsCiAJCQkJCXN0cnVjdCBuZnNkM193cml0ZWFyZ3MgKmFyZ3MpCiB7CiAJdW5zaWduZWQgaW50IGxlbiwgdiwgaGRyOwpAQCAtMzkzLDcgKzM5Myw3IEBACiB9CiAKIGludAotbmZzM3N2Y19kZWNvZGVfY3JlYXRlYXJncyhzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCB1MzIgKnAsCituZnMzc3ZjX2RlY29kZV9jcmVhdGVhcmdzKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIF9fYmUzMiAqcCwKIAkJCQkJc3RydWN0IG5mc2QzX2NyZWF0ZWFyZ3MgKmFyZ3MpCiB7CiAJaWYgKCEocCA9IGRlY29kZV9maChwLCAmYXJncy0+ZmgpKQpAQCAtNDE3LDcgKzQxNyw3IEBACiAJcmV0dXJuIHhkcl9hcmdzaXplX2NoZWNrKHJxc3RwLCBwKTsKIH0KIGludAotbmZzM3N2Y19kZWNvZGVfbWtkaXJhcmdzKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHUzMiAqcCwKK25mczNzdmNfZGVjb2RlX21rZGlyYXJncyhzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCBfX2JlMzIgKnAsCiAJCQkJCXN0cnVjdCBuZnNkM19jcmVhdGVhcmdzICphcmdzKQogewogCWlmICghKHAgPSBkZWNvZGVfZmgocCwgJmFyZ3MtPmZoKSkKQEAgLTQyOSw3ICs0MjksNyBAQAogfQogCiBpbnQKLW5mczNzdmNfZGVjb2RlX3N5bWxpbmthcmdzKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHUzMiAqcCwKK25mczNzdmNfZGVjb2RlX3N5bWxpbmthcmdzKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIF9fYmUzMiAqcCwKIAkJCQkJc3RydWN0IG5mc2QzX3N5bWxpbmthcmdzICphcmdzKQogewogCXVuc2lnbmVkIGludCBsZW47CkBAIC00ODEsNyArNDgxLDcgQEAKIH0KIAogaW50Ci1uZnMzc3ZjX2RlY29kZV9ta25vZGFyZ3Moc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgdTMyICpwLAorbmZzM3N2Y19kZWNvZGVfbWtub2RhcmdzKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIF9fYmUzMiAqcCwKIAkJCQkJc3RydWN0IG5mc2QzX21rbm9kYXJncyAqYXJncykKIHsKIAlpZiAoIShwID0gZGVjb2RlX2ZoKHAsICZhcmdzLT5maCkpCkBAIC01MDUsNyArNTA1LDcgQEAKIH0KIAogaW50Ci1uZnMzc3ZjX2RlY29kZV9yZW5hbWVhcmdzKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHUzMiAqcCwKK25mczNzdmNfZGVjb2RlX3JlbmFtZWFyZ3Moc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgX19iZTMyICpwLAogCQkJCQlzdHJ1Y3QgbmZzZDNfcmVuYW1lYXJncyAqYXJncykKIHsKIAlpZiAoIShwID0gZGVjb2RlX2ZoKHAsICZhcmdzLT5mZmgpKQpAQCAtNTE4LDcgKzUxOCw3IEBACiB9CiAKIGludAotbmZzM3N2Y19kZWNvZGVfcmVhZGxpbmthcmdzKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHUzMiAqcCwKK25mczNzdmNfZGVjb2RlX3JlYWRsaW5rYXJncyhzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCBfX2JlMzIgKnAsCiAJCQkJCXN0cnVjdCBuZnNkM19yZWFkbGlua2FyZ3MgKmFyZ3MpCiB7CiAJaWYgKCEocCA9IGRlY29kZV9maChwLCAmYXJncy0+ZmgpKSkKQEAgLTUzMCw3ICs1MzAsNyBAQAogfQogCiBpbnQKLW5mczNzdmNfZGVjb2RlX2xpbmthcmdzKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHUzMiAqcCwKK25mczNzdmNfZGVjb2RlX2xpbmthcmdzKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIF9fYmUzMiAqcCwKIAkJCQkJc3RydWN0IG5mc2QzX2xpbmthcmdzICphcmdzKQogewogCWlmICghKHAgPSBkZWNvZGVfZmgocCwgJmFyZ3MtPmZmaCkpCkBAIC01NDIsNyArNTQyLDcgQEAKIH0KIAogaW50Ci1uZnMzc3ZjX2RlY29kZV9yZWFkZGlyYXJncyhzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCB1MzIgKnAsCituZnMzc3ZjX2RlY29kZV9yZWFkZGlyYXJncyhzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCBfX2JlMzIgKnAsCiAJCQkJCXN0cnVjdCBuZnNkM19yZWFkZGlyYXJncyAqYXJncykKIHsKIAlpZiAoIShwID0gZGVjb2RlX2ZoKHAsICZhcmdzLT5maCkpKQpAQCAtNTYyLDcgKzU2Miw3IEBACiB9CiAKIGludAotbmZzM3N2Y19kZWNvZGVfcmVhZGRpcnBsdXNhcmdzKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHUzMiAqcCwKK25mczNzdmNfZGVjb2RlX3JlYWRkaXJwbHVzYXJncyhzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCBfX2JlMzIgKnAsCiAJCQkJCXN0cnVjdCBuZnNkM19yZWFkZGlyYXJncyAqYXJncykKIHsKIAlpbnQgbGVuLCBwbjsKQEAgLTU5MCw3ICs1OTAsNyBAQAogfQogCiBpbnQKLW5mczNzdmNfZGVjb2RlX2NvbW1pdGFyZ3Moc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgdTMyICpwLAorbmZzM3N2Y19kZWNvZGVfY29tbWl0YXJncyhzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCBfX2JlMzIgKnAsCiAJCQkJCXN0cnVjdCBuZnNkM19jb21taXRhcmdzICphcmdzKQogewogCWlmICghKHAgPSBkZWNvZGVfZmgocCwgJmFyZ3MtPmZoKSkpCkBAIC02MDksMTQgKzYwOSwxNCBAQAogICogd2lsbCB3b3JrIHByb3Blcmx5LgogICovCiBpbnQKLW5mczNzdmNfZW5jb2RlX3ZvaWRyZXMoc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgdTMyICpwLCB2b2lkICpkdW1teSkKK25mczNzdmNfZW5jb2RlX3ZvaWRyZXMoc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgX19iZTMyICpwLCB2b2lkICpkdW1teSkKIHsKIAlyZXR1cm4geGRyX3Jlc3NpemVfY2hlY2socnFzdHAsIHApOwogfQogCiAvKiBHRVRBVFRSICovCiBpbnQKLW5mczNzdmNfZW5jb2RlX2F0dHJzdGF0KHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHUzMiAqcCwKK25mczNzdmNfZW5jb2RlX2F0dHJzdGF0KHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIF9fYmUzMiAqcCwKIAkJCQkJc3RydWN0IG5mc2QzX2F0dHJzdGF0ICpyZXNwKQogewogCWlmIChyZXNwLT5zdGF0dXMgPT0gMCkKQEAgLTYyNiw3ICs2MjYsNyBAQAogCiAvKiBTRVRBVFRSLCBSRU1PVkUsIFJNRElSICovCiBpbnQKLW5mczNzdmNfZW5jb2RlX3djY3N0YXQoc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgdTMyICpwLAorbmZzM3N2Y19lbmNvZGVfd2Njc3RhdChzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCBfX2JlMzIgKnAsCiAJCQkJCXN0cnVjdCBuZnNkM19hdHRyc3RhdCAqcmVzcCkKIHsKIAlwID0gZW5jb2RlX3djY19kYXRhKHJxc3RwLCBwLCAmcmVzcC0+ZmgpOwpAQCAtNjM1LDcgKzYzNSw3IEBACiAKIC8qIExPT0tVUCAqLwogaW50Ci1uZnMzc3ZjX2VuY29kZV9kaXJvcHJlcyhzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCB1MzIgKnAsCituZnMzc3ZjX2VuY29kZV9kaXJvcHJlcyhzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCBfX2JlMzIgKnAsCiAJCQkJCXN0cnVjdCBuZnNkM19kaXJvcHJlcyAqcmVzcCkKIHsKIAlpZiAocmVzcC0+c3RhdHVzID09IDApIHsKQEAgLTY0OCw3ICs2NDgsNyBAQAogCiAvKiBBQ0NFU1MgKi8KIGludAotbmZzM3N2Y19lbmNvZGVfYWNjZXNzcmVzKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHUzMiAqcCwKK25mczNzdmNfZW5jb2RlX2FjY2Vzc3JlcyhzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCBfX2JlMzIgKnAsCiAJCQkJCXN0cnVjdCBuZnNkM19hY2Nlc3NyZXMgKnJlc3ApCiB7CiAJcCA9IGVuY29kZV9wb3N0X29wX2F0dHIocnFzdHAsIHAsICZyZXNwLT5maCk7CkBAIC02NTksNyArNjU5LDcgQEAKIAogLyogUkVBRExJTksgKi8KIGludAotbmZzM3N2Y19lbmNvZGVfcmVhZGxpbmtyZXMoc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgdTMyICpwLAorbmZzM3N2Y19lbmNvZGVfcmVhZGxpbmtyZXMoc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgX19iZTMyICpwLAogCQkJCQlzdHJ1Y3QgbmZzZDNfcmVhZGxpbmtyZXMgKnJlc3ApCiB7CiAJcCA9IGVuY29kZV9wb3N0X29wX2F0dHIocnFzdHAsIHAsICZyZXNwLT5maCk7CkBAIC02ODAsNyArNjgwLDcgQEAKIAogLyogUkVBRCAqLwogaW50Ci1uZnMzc3ZjX2VuY29kZV9yZWFkcmVzKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHUzMiAqcCwKK25mczNzdmNfZW5jb2RlX3JlYWRyZXMoc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgX19iZTMyICpwLAogCQkJCQlzdHJ1Y3QgbmZzZDNfcmVhZHJlcyAqcmVzcCkKIHsKIAlwID0gZW5jb2RlX3Bvc3Rfb3BfYXR0cihycXN0cCwgcCwgJnJlc3AtPmZoKTsKQEAgLTcwNCw3ICs3MDQsNyBAQAogCiAvKiBXUklURSAqLwogaW50Ci1uZnMzc3ZjX2VuY29kZV93cml0ZXJlcyhzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCB1MzIgKnAsCituZnMzc3ZjX2VuY29kZV93cml0ZXJlcyhzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCBfX2JlMzIgKnAsCiAJCQkJCXN0cnVjdCBuZnNkM193cml0ZXJlcyAqcmVzcCkKIHsKIAlwID0gZW5jb2RlX3djY19kYXRhKHJxc3RwLCBwLCAmcmVzcC0+ZmgpOwpAQCAtNzE5LDcgKzcxOSw3IEBACiAKIC8qIENSRUFURSwgTUtESVIsIFNZTUxJTkssIE1LTk9EICovCiBpbnQKLW5mczNzdmNfZW5jb2RlX2NyZWF0ZXJlcyhzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCB1MzIgKnAsCituZnMzc3ZjX2VuY29kZV9jcmVhdGVyZXMoc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgX19iZTMyICpwLAogCQkJCQlzdHJ1Y3QgbmZzZDNfZGlyb3ByZXMgKnJlc3ApCiB7CiAJaWYgKHJlc3AtPnN0YXR1cyA9PSAwKSB7CkBAIC03MzMsNyArNzMzLDcgQEAKIAogLyogUkVOQU1FICovCiBpbnQKLW5mczNzdmNfZW5jb2RlX3JlbmFtZXJlcyhzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCB1MzIgKnAsCituZnMzc3ZjX2VuY29kZV9yZW5hbWVyZXMoc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgX19iZTMyICpwLAogCQkJCQlzdHJ1Y3QgbmZzZDNfcmVuYW1lcmVzICpyZXNwKQogewogCXAgPSBlbmNvZGVfd2NjX2RhdGEocnFzdHAsIHAsICZyZXNwLT5mZmgpOwpAQCAtNzQzLDcgKzc0Myw3IEBACiAKIC8qIExJTksgKi8KIGludAotbmZzM3N2Y19lbmNvZGVfbGlua3JlcyhzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCB1MzIgKnAsCituZnMzc3ZjX2VuY29kZV9saW5rcmVzKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIF9fYmUzMiAqcCwKIAkJCQkJc3RydWN0IG5mc2QzX2xpbmtyZXMgKnJlc3ApCiB7CiAJcCA9IGVuY29kZV9wb3N0X29wX2F0dHIocnFzdHAsIHAsICZyZXNwLT5maCk7CkBAIC03NTMsNyArNzUzLDcgQEAKIAogLyogUkVBRERJUiAqLwogaW50Ci1uZnMzc3ZjX2VuY29kZV9yZWFkZGlycmVzKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHUzMiAqcCwKK25mczNzdmNfZW5jb2RlX3JlYWRkaXJyZXMoc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgX19iZTMyICpwLAogCQkJCQlzdHJ1Y3QgbmZzZDNfcmVhZGRpcnJlcyAqcmVzcCkKIHsKIAlwID0gZW5jb2RlX3Bvc3Rfb3BfYXR0cihycXN0cCwgcCwgJnJlc3AtPmZoKTsKQEAgLTc3Niw4ICs3NzYsOCBAQAogCQlyZXR1cm4geGRyX3Jlc3NpemVfY2hlY2socnFzdHAsIHApOwogfQogCi1zdGF0aWMgaW5saW5lIHUzMiAqCi1lbmNvZGVfZW50cnlfYmFnZ2FnZShzdHJ1Y3QgbmZzZDNfcmVhZGRpcnJlcyAqY2QsIHUzMiAqcCwgY29uc3QgY2hhciAqbmFtZSwKK3N0YXRpYyBpbmxpbmUgX19iZTMyICoKK2VuY29kZV9lbnRyeV9iYWdnYWdlKHN0cnVjdCBuZnNkM19yZWFkZGlycmVzICpjZCwgX19iZTMyICpwLCBjb25zdCBjaGFyICpuYW1lLAogCSAgICAgaW50IG5hbWxlbiwgaW5vX3QgaW5vKQogewogCSpwKysgPSB4ZHJfb25lOwkJCQkgLyogbWFyayBlbnRyeSBwcmVzZW50ICovCkBAIC03OTAsOCArNzkwLDggQEAKIAlyZXR1cm4gcDsKIH0KIAotc3RhdGljIGlubGluZSB1MzIgKgotZW5jb2RlX2VudHJ5cGx1c19iYWdnYWdlKHN0cnVjdCBuZnNkM19yZWFkZGlycmVzICpjZCwgdTMyICpwLAorc3RhdGljIGlubGluZSBfX2JlMzIgKgorZW5jb2RlX2VudHJ5cGx1c19iYWdnYWdlKHN0cnVjdCBuZnNkM19yZWFkZGlycmVzICpjZCwgX19iZTMyICpwLAogCQlzdHJ1Y3Qgc3ZjX2ZoICpmaHApCiB7CiAJCXAgPSBlbmNvZGVfcG9zdF9vcF9hdHRyKGNkLT5ycXN0cCwgcCwgZmhwKTsKQEAgLTg1Myw3ICs4NTMsNyBAQAogewogCXN0cnVjdCBuZnNkM19yZWFkZGlycmVzICpjZCA9IGNvbnRhaW5lcl9vZihjY2QsIHN0cnVjdCBuZnNkM19yZWFkZGlycmVzLAogCQkgICAgICAgCQkJCQljb21tb24pOwotCXUzMgkJKnAgPSBjZC0+YnVmZmVyOworCV9fYmUzMgkJKnAgPSBjZC0+YnVmZmVyOwogCWNhZGRyX3QJCWN1cnJfcGFnZV9hZGRyID0gTlVMTDsKIAlpbnQJCXBuOwkJLyogY3VycmVudCBwYWdlIG51bWJlciAqLwogCWludAkJc2xlbjsJCS8qIHN0cmluZyAobmFtZSkgbGVuZ3RoICovCkBAIC05MTksNyArOTE5LDcgQEAKIAl9IGVsc2UgaWYgKGNkLT5ycXN0cC0+cnFfcmVzcGFnZXNbcG4rMV0gIT0gTlVMTCkgewogCQkvKiB0ZW1wb3JhcmlseSBlbmNvZGUgZW50cnkgaW50byBuZXh0IHBhZ2UsIHRoZW4gbW92ZSBiYWNrIHRvCiAJCSAqIGN1cnJlbnQgYW5kIG5leHQgcGFnZSBpbiBycV9yZXNwYWdlc1tdICovCi0JCXUzMiAqcDEsICp0bXA7CisJCV9fYmUzMiAqcDEsICp0bXA7CiAJCWludCBsZW4xLCBsZW4yOwogCiAJCS8qIGdyYWIgbmV4dCBwYWdlIGZvciB0ZW1wb3Jhcnkgc3RvcmFnZSBvZiBlbnRyeSAqLwpAQCAtMTAwOSw3ICsxMDA5LDcgQEAKIAogLyogRlNTVEFUICovCiBpbnQKLW5mczNzdmNfZW5jb2RlX2Zzc3RhdHJlcyhzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCB1MzIgKnAsCituZnMzc3ZjX2VuY29kZV9mc3N0YXRyZXMoc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgX19iZTMyICpwLAogCQkJCQlzdHJ1Y3QgbmZzZDNfZnNzdGF0cmVzICpyZXNwKQogewogCXN0cnVjdCBrc3RhdGZzCSpzID0gJnJlc3AtPnN0YXRzOwpAQCAtMTAzMSw3ICsxMDMxLDcgQEAKIAogLyogRlNJTkZPICovCiBpbnQKLW5mczNzdmNfZW5jb2RlX2ZzaW5mb3JlcyhzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCB1MzIgKnAsCituZnMzc3ZjX2VuY29kZV9mc2luZm9yZXMoc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgX19iZTMyICpwLAogCQkJCQlzdHJ1Y3QgbmZzZDNfZnNpbmZvcmVzICpyZXNwKQogewogCSpwKysgPSB4ZHJfemVybzsJLyogbm8gcG9zdF9vcF9hdHRyICovCkBAIC0xMDU1LDcgKzEwNTUsNyBAQAogCiAvKiBQQVRIQ09ORiAqLwogaW50Ci1uZnMzc3ZjX2VuY29kZV9wYXRoY29uZnJlcyhzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCB1MzIgKnAsCituZnMzc3ZjX2VuY29kZV9wYXRoY29uZnJlcyhzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCBfX2JlMzIgKnAsCiAJCQkJCXN0cnVjdCBuZnNkM19wYXRoY29uZnJlcyAqcmVzcCkKIHsKIAkqcCsrID0geGRyX3plcm87CS8qIG5vIHBvc3Rfb3BfYXR0ciAqLwpAQCAtMTA3NCw3ICsxMDc0LDcgQEAKIAogLyogQ09NTUlUICovCiBpbnQKLW5mczNzdmNfZW5jb2RlX2NvbW1pdHJlcyhzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCB1MzIgKnAsCituZnMzc3ZjX2VuY29kZV9jb21taXRyZXMoc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgX19iZTMyICpwLAogCQkJCQlzdHJ1Y3QgbmZzZDNfY29tbWl0cmVzICpyZXNwKQogewogCXAgPSBlbmNvZGVfd2NjX2RhdGEocnFzdHAsIHAsICZyZXNwLT5maCk7CkBAIC0xMDkwLDcgKzEwOTAsNyBAQAogICogWERSIHJlbGVhc2UgZnVuY3Rpb25zCiAgKi8KIGludAotbmZzM3N2Y19yZWxlYXNlX2ZoYW5kbGUoc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgdTMyICpwLAorbmZzM3N2Y19yZWxlYXNlX2ZoYW5kbGUoc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgX19iZTMyICpwLAogCQkJCQlzdHJ1Y3QgbmZzZDNfYXR0cnN0YXQgKnJlc3ApCiB7CiAJZmhfcHV0KCZyZXNwLT5maCk7CkBAIC0xMDk4LDcgKzEwOTgsNyBAQAogfQogCiBpbnQKLW5mczNzdmNfcmVsZWFzZV9maGFuZGxlMihzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCB1MzIgKnAsCituZnMzc3ZjX3JlbGVhc2VfZmhhbmRsZTIoc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgX19iZTMyICpwLAogCQkJCQlzdHJ1Y3QgbmZzZDNfZmhhbmRsZV9wYWlyICpyZXNwKQogewogCWZoX3B1dCgmcmVzcC0+ZmgxKTsKZGlmZiAtLWdpdCBhL2ZzL25mc2QvbmZzNGNhbGxiYWNrLmMgYi9mcy9uZnNkL25mczRjYWxsYmFjay5jCmluZGV4IGY2Y2E5ZmIuLmY1NzY1NWEgMTAwNjQ0Ci0tLSBhL2ZzL25mc2QvbmZzNGNhbGxiYWNrLmMKKysrIGIvZnMvbmZzZC9uZnM0Y2FsbGJhY2suYwpAQCAtODUsOCArODUsOCBAQAogLyoKICogR2VuZXJpYyBlbmNvZGUgcm91dGluZXMgZnJvbSBmcy9uZnMvbmZzNHhkci5jCiAqLwotc3RhdGljIGlubGluZSB1MzIgKgoteGRyX3dyaXRlbWVtKHUzMiAqcCwgY29uc3Qgdm9pZCAqcHRyLCBpbnQgbmJ5dGVzKQorc3RhdGljIGlubGluZSBfX2JlMzIgKgoreGRyX3dyaXRlbWVtKF9fYmUzMiAqcCwgY29uc3Qgdm9pZCAqcHRyLCBpbnQgbmJ5dGVzKQogewogCWludCB0bXAgPSBYRFJfUVVBRExFTihuYnl0ZXMpOwogCWlmICghdG1wKQpAQCAtMjA1LDcgKzIwNSw3IEBACiBzdGF0aWMgaW50CiBlbmNvZGVfY2JfY29tcG91bmRfaGRyKHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsIHN0cnVjdCBuZnM0X2NiX2NvbXBvdW5kX2hkciAqaGRyKQogewotCXUzMiAqIHA7CisJX19iZTMyICogcDsKIAogCVJFU0VSVkVfU1BBQ0UoMTYpOwogCVdSSVRFMzIoMCk7ICAgICAgICAgICAgLyogdGFnIGxlbmd0aCBpcyBhbHdheXMgMCAqLwpAQCAtMjE4LDcgKzIxOCw3IEBACiBzdGF0aWMgaW50CiBlbmNvZGVfY2JfcmVjYWxsKHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsIHN0cnVjdCBuZnM0X2NiX3JlY2FsbCAqY2JfcmVjKQogewotCXUzMiAqcDsKKwlfX2JlMzIgKnA7CiAJaW50IGxlbiA9IGNiX3JlYy0+Y2JyX2ZobGVuOwogCiAJUkVTRVJWRV9TUEFDRSgxMitzaXplb2YoY2JfcmVjLT5jYnJfc3RhdGVpZCkgKyBsZW4pOwpAQCAtMjMxLDcgKzIzMSw3IEBACiB9CiAKIHN0YXRpYyBpbnQKLW5mczRfeGRyX2VuY19jYl9udWxsKHN0cnVjdCBycGNfcnFzdCAqcmVxLCB1MzIgKnApCituZnM0X3hkcl9lbmNfY2JfbnVsbChzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwgX19iZTMyICpwKQogewogCXN0cnVjdCB4ZHJfc3RyZWFtIHhkcnMsICp4ZHIgPSAmeGRyczsKIApAQCAtMjQxLDcgKzI0MSw3IEBACiB9CiAKIHN0YXRpYyBpbnQKLW5mczRfeGRyX2VuY19jYl9yZWNhbGwoc3RydWN0IHJwY19ycXN0ICpyZXEsIHUzMiAqcCwgc3RydWN0IG5mczRfY2JfcmVjYWxsICphcmdzKQorbmZzNF94ZHJfZW5jX2NiX3JlY2FsbChzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwgX19iZTMyICpwLCBzdHJ1Y3QgbmZzNF9jYl9yZWNhbGwgKmFyZ3MpCiB7CiAJc3RydWN0IHhkcl9zdHJlYW0geGRyOwogCXN0cnVjdCBuZnM0X2NiX2NvbXBvdW5kX2hkciBoZHIgPSB7CkBAIC0yNTcsNyArMjU3LDcgQEAKIAogc3RhdGljIGludAogZGVjb2RlX2NiX2NvbXBvdW5kX2hkcihzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLCBzdHJ1Y3QgbmZzNF9jYl9jb21wb3VuZF9oZHIgKmhkcil7Ci0gICAgICAgIHUzMiAqcDsKKyAgICAgICAgX19iZTMyICpwOwogCiAgICAgICAgIFJFQURfQlVGKDgpOwogICAgICAgICBSRUFEMzIoaGRyLT5zdGF0dXMpOwpAQCAtMjcyLDcgKzI3Miw3IEBACiBzdGF0aWMgaW50CiBkZWNvZGVfY2Jfb3BfaGRyKHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsIGVudW0gbmZzX29wbnVtNCBleHBlY3RlZCkKIHsKLQl1MzIgKnA7CisJX19iZTMyICpwOwogCXUzMiBvcDsKIAlpbnQzMl90IG5mc2VycjsKIApAQCAtMjkxLDEzICsyOTEsMTMgQEAKIH0KIAogc3RhdGljIGludAotbmZzNF94ZHJfZGVjX2NiX251bGwoc3RydWN0IHJwY19ycXN0ICpyZXEsIHUzMiAqcCkKK25mczRfeGRyX2RlY19jYl9udWxsKHN0cnVjdCBycGNfcnFzdCAqcmVxLCBfX2JlMzIgKnApCiB7CiAJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQKLW5mczRfeGRyX2RlY19jYl9yZWNhbGwoc3RydWN0IHJwY19ycXN0ICpycXN0cCwgdTMyICpwKQorbmZzNF94ZHJfZGVjX2NiX3JlY2FsbChzdHJ1Y3QgcnBjX3Jxc3QgKnJxc3RwLCBfX2JlMzIgKnApCiB7CiAJc3RydWN0IHhkcl9zdHJlYW0geGRyOwogCXN0cnVjdCBuZnM0X2NiX2NvbXBvdW5kX2hkciBoZHI7CkBAIC00MjEsNyArNDIxLDcgQEAKIAogCS8qIENyZWF0ZSBSUEMgY2xpZW50ICovCiAJY2ItPmNiX2NsaWVudCA9IHJwY19jcmVhdGUoJmFyZ3MpOwotCWlmICghY2ItPmNiX2NsaWVudCkgeworCWlmIChJU19FUlIoY2ItPmNiX2NsaWVudCkpIHsKIAkJZHByaW50aygiTkZTRDogY291bGRuJ3QgY3JlYXRlIGNhbGxiYWNrIGNsaWVudFxuIik7CiAJCWdvdG8gb3V0X2VycjsKIAl9CkBAIC00NDgsMTAgKzQ0OCwxMCBAQAogb3V0X3JwY2lvZDoKIAlhdG9taWNfZGVjKCZjbHAtPmNsX2NvdW50KTsKIAlycGNpb2RfZG93bigpOwotCWNiLT5jYl9jbGllbnQgPSBOVUxMOwogb3V0X2NsbnQ6CiAJcnBjX3NodXRkb3duX2NsaWVudChjYi0+Y2JfY2xpZW50KTsKIG91dF9lcnI6CisJY2ItPmNiX2NsaWVudCA9IE5VTEw7CiAJZHByaW50aygiTkZTRDogd2FybmluZzogbm8gY2FsbGJhY2sgcGF0aCB0byBjbGllbnQgJS4qc1xuIiwKIAkJKGludCljbHAtPmNsX25hbWUubGVuLCBjbHAtPmNsX25hbWUuZGF0YSk7CiB9CkBAIC00NjEsNyArNDYxLDcgQEAKIHsKIAlzdHJ1Y3QgbmZzNF9jbGllbnQgKmNscCA9IChzdHJ1Y3QgbmZzNF9jbGllbnQgKil0YXNrLT50a19tc2cucnBjX2FyZ3A7CiAJc3RydWN0IG5mczRfY2FsbGJhY2sgKmNiID0gJmNscC0+Y2xfY2FsbGJhY2s7Ci0JdTMyIGFkZHIgPSBodG9ubChjYi0+Y2JfYWRkcik7CisJX19iZTMyIGFkZHIgPSBodG9ubChjYi0+Y2JfYWRkcik7CiAKIAlkcHJpbnRrKCJORlNEOiBuZnM0X2NiX251bGwgdGFzay0+dGtfc3RhdHVzICVkXG4iLCB0YXNrLT50a19zdGF0dXMpOwogCmRpZmYgLS1naXQgYS9mcy9uZnNkL25mczRwcm9jLmMgYi9mcy9uZnNkL25mczRwcm9jLmMKaW5kZXggODMzM2RiMS4uNTBiYzk0MiAxMDA2NDQKLS0tIGEvZnMvbmZzZC9uZnM0cHJvYy5jCisrKyBiL2ZzL25mc2QvbmZzNHByb2MuYwpAQCAtNjcsMzIgKzY3LDMzIEBACiAJKmRzdCA9ICpzcmM7CiB9CiAKLXN0YXRpYyBpbnQKLWRvX29wZW5fcGVybWlzc2lvbihzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCBzdHJ1Y3Qgc3ZjX2ZoICpjdXJyZW50X2ZoLCBzdHJ1Y3QgbmZzZDRfb3BlbiAqb3BlbikKK3N0YXRpYyBfX2JlMzIKK2RvX29wZW5fcGVybWlzc2lvbihzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCBzdHJ1Y3Qgc3ZjX2ZoICpjdXJyZW50X2ZoLCBzdHJ1Y3QgbmZzZDRfb3BlbiAqb3BlbiwgaW50IGFjY21vZGUpCiB7Ci0JaW50IGFjY21vZGUsIHN0YXR1czsKKwlfX2JlMzIgc3RhdHVzOwogCiAJaWYgKG9wZW4tPm9wX3RydW5jYXRlICYmCiAJCSEob3Blbi0+b3Bfc2hhcmVfYWNjZXNzICYgTkZTNF9TSEFSRV9BQ0NFU1NfV1JJVEUpKQogCQlyZXR1cm4gbmZzZXJyX2ludmFsOwogCi0JYWNjbW9kZSA9IE1BWV9OT1A7CiAJaWYgKG9wZW4tPm9wX3NoYXJlX2FjY2VzcyAmIE5GUzRfU0hBUkVfQUNDRVNTX1JFQUQpCi0JCWFjY21vZGUgPSBNQVlfUkVBRDsKLQlpZiAob3Blbi0+b3Bfc2hhcmVfZGVueSAmIE5GUzRfU0hBUkVfQUNDRVNTX1dSSVRFKQorCQlhY2Ntb2RlIHw9IE1BWV9SRUFEOworCWlmIChvcGVuLT5vcF9zaGFyZV9hY2Nlc3MgJiBORlM0X1NIQVJFX0FDQ0VTU19XUklURSkKIAkJYWNjbW9kZSB8PSAoTUFZX1dSSVRFIHwgTUFZX1RSVU5DKTsKLQlhY2Ntb2RlIHw9IE1BWV9PV05FUl9PVkVSUklERTsKKwlpZiAob3Blbi0+b3Bfc2hhcmVfZGVueSAmIE5GUzRfU0hBUkVfREVOWV9XUklURSkKKwkJYWNjbW9kZSB8PSBNQVlfV1JJVEU7CiAKIAlzdGF0dXMgPSBmaF92ZXJpZnkocnFzdHAsIGN1cnJlbnRfZmgsIFNfSUZSRUcsIGFjY21vZGUpOwogCiAJcmV0dXJuIHN0YXR1czsKIH0KIAotc3RhdGljIGludAorc3RhdGljIF9fYmUzMgogZG9fb3Blbl9sb29rdXAoc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgc3RydWN0IHN2Y19maCAqY3VycmVudF9maCwgc3RydWN0IG5mc2Q0X29wZW4gKm9wZW4pCiB7CiAJc3RydWN0IHN2Y19maCByZXNmaDsKLQlpbnQgc3RhdHVzOworCV9fYmUzMiBzdGF0dXM7CisJaW50IGNyZWF0ZWQgPSAwOwogCiAJZmhfaW5pdCgmcmVzZmgsIE5GUzRfRkhTSVpFKTsKIAlvcGVuLT5vcF90cnVuY2F0ZSA9IDA7CkBAIC0xMDUsMzYgKzEwNiwzNSBAQAogCQlzdGF0dXMgPSBuZnNkX2NyZWF0ZV92MyhycXN0cCwgY3VycmVudF9maCwgb3Blbi0+b3BfZm5hbWUuZGF0YSwKIAkJCQkJb3Blbi0+b3BfZm5hbWUubGVuLCAmb3Blbi0+b3BfaWF0dHIsCiAJCQkJCSZyZXNmaCwgb3Blbi0+b3BfY3JlYXRlbW9kZSwKLQkJCQkJKHUzMiAqKW9wZW4tPm9wX3ZlcmYuZGF0YSwgJm9wZW4tPm9wX3RydW5jYXRlKTsKLQl9Ci0JZWxzZSB7CisJCQkJCSh1MzIgKilvcGVuLT5vcF92ZXJmLmRhdGEsICZvcGVuLT5vcF90cnVuY2F0ZSwgJmNyZWF0ZWQpOworCX0gZWxzZSB7CiAJCXN0YXR1cyA9IG5mc2RfbG9va3VwKHJxc3RwLCBjdXJyZW50X2ZoLAogCQkJCSAgICAgb3Blbi0+b3BfZm5hbWUuZGF0YSwgb3Blbi0+b3BfZm5hbWUubGVuLCAmcmVzZmgpOwogCQlmaF91bmxvY2soY3VycmVudF9maCk7CiAJfQorCWlmIChzdGF0dXMpCisJCWdvdG8gb3V0OwogCi0JaWYgKCFzdGF0dXMpIHsKLQkJc2V0X2NoYW5nZV9pbmZvKCZvcGVuLT5vcF9jaW5mbywgY3VycmVudF9maCk7CisJc2V0X2NoYW5nZV9pbmZvKCZvcGVuLT5vcF9jaW5mbywgY3VycmVudF9maCk7CiAKLQkJLyogc2V0IHJlcGx5IGNhY2hlICovCi0JCWZoX2R1cDIoY3VycmVudF9maCwgJnJlc2ZoKTsKLQkJb3Blbi0+b3Bfc3RhdGVvd25lci0+c29fcmVwbGF5LnJwX29wZW5maF9sZW4gPQotCQkJcmVzZmguZmhfaGFuZGxlLmZoX3NpemU7Ci0JCW1lbWNweShvcGVuLT5vcF9zdGF0ZW93bmVyLT5zb19yZXBsYXkucnBfb3BlbmZoLAotCQkJCSZyZXNmaC5maF9oYW5kbGUuZmhfYmFzZSwKLQkJCQlyZXNmaC5maF9oYW5kbGUuZmhfc2l6ZSk7CisJLyogc2V0IHJlcGx5IGNhY2hlICovCisJZmhfZHVwMihjdXJyZW50X2ZoLCAmcmVzZmgpOworCW9wZW4tPm9wX3N0YXRlb3duZXItPnNvX3JlcGxheS5ycF9vcGVuZmhfbGVuID0gcmVzZmguZmhfaGFuZGxlLmZoX3NpemU7CisJbWVtY3B5KG9wZW4tPm9wX3N0YXRlb3duZXItPnNvX3JlcGxheS5ycF9vcGVuZmgsCisJCQkmcmVzZmguZmhfaGFuZGxlLmZoX2Jhc2UsIHJlc2ZoLmZoX2hhbmRsZS5maF9zaXplKTsKIAotCQlzdGF0dXMgPSBkb19vcGVuX3Blcm1pc3Npb24ocnFzdHAsIGN1cnJlbnRfZmgsIG9wZW4pOwotCX0KKwlpZiAoIWNyZWF0ZWQpCisJCXN0YXR1cyA9IGRvX29wZW5fcGVybWlzc2lvbihycXN0cCwgY3VycmVudF9maCwgb3BlbiwgTUFZX05PUCk7CiAKK291dDoKIAlmaF9wdXQoJnJlc2ZoKTsKIAlyZXR1cm4gc3RhdHVzOwogfQogCi1zdGF0aWMgaW50CitzdGF0aWMgX19iZTMyCiBkb19vcGVuX2ZoYW5kbGUoc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgc3RydWN0IHN2Y19maCAqY3VycmVudF9maCwgc3RydWN0IG5mc2Q0X29wZW4gKm9wZW4pCiB7Ci0JaW50IHN0YXR1czsKKwlfX2JlMzIgc3RhdHVzOwogCiAJLyogT25seSByZWNsYWltcyBmcm9tIHByZXZpb3VzbHkgY29uZmlybWVkIGNsaWVudHMgYXJlIHZhbGlkICovCiAJaWYgKChzdGF0dXMgPSBuZnM0X2NoZWNrX29wZW5fcmVjbGFpbSgmb3Blbi0+b3BfY2xpZW50aWQpKSkKQEAgLTE1NSwxNiArMTU1LDE2IEBACiAJb3Blbi0+b3BfdHJ1bmNhdGUgPSAob3Blbi0+b3BfaWF0dHIuaWFfdmFsaWQgJiBBVFRSX1NJWkUpICYmCiAJCShvcGVuLT5vcF9pYXR0ci5pYV9zaXplID09IDApOwogCi0Jc3RhdHVzID0gZG9fb3Blbl9wZXJtaXNzaW9uKHJxc3RwLCBjdXJyZW50X2ZoLCBvcGVuKTsKKwlzdGF0dXMgPSBkb19vcGVuX3Blcm1pc3Npb24ocnFzdHAsIGN1cnJlbnRfZmgsIG9wZW4sIE1BWV9PV05FUl9PVkVSUklERSk7CiAKIAlyZXR1cm4gc3RhdHVzOwogfQogCiAKLXN0YXRpYyBpbmxpbmUgaW50CitzdGF0aWMgaW5saW5lIF9fYmUzMgogbmZzZDRfb3BlbihzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCBzdHJ1Y3Qgc3ZjX2ZoICpjdXJyZW50X2ZoLCBzdHJ1Y3QgbmZzZDRfb3BlbiAqb3Blbiwgc3RydWN0IG5mczRfc3RhdGVvd25lciAqKnJlcGxheV9vd25lcikKIHsKLQlpbnQgc3RhdHVzOworCV9fYmUzMiBzdGF0dXM7CiAJZHByaW50aygiTkZTRDogbmZzZDRfb3BlbiBmaWxlbmFtZSAlLipzIG9wX3N0YXRlb3duZXIgJXBcbiIsCiAJCShpbnQpb3Blbi0+b3BfZm5hbWUubGVuLCBvcGVuLT5vcF9mbmFtZS5kYXRhLAogCQlvcGVuLT5vcF9zdGF0ZW93bmVyKTsKQEAgLTE3Nyw3ICsxNzcsNyBAQAogCiAJLyogY2hlY2sgc2VxaWQgZm9yIHJlcGxheS4gc2V0IG5mczRfb3duZXIgKi8KIAlzdGF0dXMgPSBuZnNkNF9wcm9jZXNzX29wZW4xKG9wZW4pOwotCWlmIChzdGF0dXMgPT0gTkZTRVJSX1JFUExBWV9NRSkgeworCWlmIChzdGF0dXMgPT0gbmZzZXJyX3JlcGxheV9tZSkgewogCQlzdHJ1Y3QgbmZzNF9yZXBsYXkgKnJwID0gJm9wZW4tPm9wX3N0YXRlb3duZXItPnNvX3JlcGxheTsKIAkJZmhfcHV0KGN1cnJlbnRfZmgpOwogCQljdXJyZW50X2ZoLT5maF9oYW5kbGUuZmhfc2l6ZSA9IHJwLT5ycF9vcGVuZmhfbGVuOwpAQCAtMTg4LDcgKzE4OCw3IEBACiAJCQlkcHJpbnRrKCJuZnNkNF9vcGVuOiByZXBsYXkgZmFpbGVkIgogCQkJCSIgcmVzdG9yaW5nIHByZXZpb3VzIGZpbGVoYW5kbGVcbiIpOwogCQllbHNlCi0JCQlzdGF0dXMgPSBORlNFUlJfUkVQTEFZX01FOworCQkJc3RhdHVzID0gbmZzZXJyX3JlcGxheV9tZTsKIAl9CiAJaWYgKHN0YXR1cykKIAkJZ290byBvdXQ7CkBAIC0yNjEsNyArMjYxLDcgQEAKIC8qCiAgKiBmaWxlaGFuZGxlLW1hbmlwdWxhdGluZyBvcHMuCiAgKi8KLXN0YXRpYyBpbmxpbmUgaW50CitzdGF0aWMgaW5saW5lIF9fYmUzMgogbmZzZDRfZ2V0Zmgoc3RydWN0IHN2Y19maCAqY3VycmVudF9maCwgc3RydWN0IHN2Y19maCAqKmdldGZoKQogewogCWlmICghY3VycmVudF9maC0+ZmhfZGVudHJ5KQpAQCAtMjcxLDcgKzI3MSw3IEBACiAJcmV0dXJuIG5mc19vazsKIH0KIAotc3RhdGljIGlubGluZSBpbnQKK3N0YXRpYyBpbmxpbmUgX19iZTMyCiBuZnNkNF9wdXRmaChzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCBzdHJ1Y3Qgc3ZjX2ZoICpjdXJyZW50X2ZoLCBzdHJ1Y3QgbmZzZDRfcHV0ZmggKnB1dGZoKQogewogCWZoX3B1dChjdXJyZW50X2ZoKTsKQEAgLTI4MCwxMCArMjgwLDEwIEBACiAJcmV0dXJuIGZoX3ZlcmlmeShycXN0cCwgY3VycmVudF9maCwgMCwgTUFZX05PUCk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgaW50CitzdGF0aWMgaW5saW5lIF9fYmUzMgogbmZzZDRfcHV0cm9vdGZoKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHN0cnVjdCBzdmNfZmggKmN1cnJlbnRfZmgpCiB7Ci0JaW50IHN0YXR1czsKKwlfX2JlMzIgc3RhdHVzOwogCiAJZmhfcHV0KGN1cnJlbnRfZmgpOwogCXN0YXR1cyA9IGV4cF9wc2V1ZG9yb290KHJxc3RwLT5ycV9jbGllbnQsIGN1cnJlbnRfZmgsCkBAIC0yOTEsNyArMjkxLDcgQEAKIAlyZXR1cm4gc3RhdHVzOwogfQogCi1zdGF0aWMgaW5saW5lIGludAorc3RhdGljIGlubGluZSBfX2JlMzIKIG5mc2Q0X3Jlc3RvcmVmaChzdHJ1Y3Qgc3ZjX2ZoICpjdXJyZW50X2ZoLCBzdHJ1Y3Qgc3ZjX2ZoICpzYXZlX2ZoKQogewogCWlmICghc2F2ZV9maC0+ZmhfZGVudHJ5KQpAQCAtMzAxLDcgKzMwMSw3IEBACiAJcmV0dXJuIG5mc19vazsKIH0KIAotc3RhdGljIGlubGluZSBpbnQKK3N0YXRpYyBpbmxpbmUgX19iZTMyCiBuZnNkNF9zYXZlZmgoc3RydWN0IHN2Y19maCAqY3VycmVudF9maCwgc3RydWN0IHN2Y19maCAqc2F2ZV9maCkKIHsKIAlpZiAoIWN1cnJlbnRfZmgtPmZoX2RlbnRyeSkKQEAgLTMxNCw3ICszMTQsNyBAQAogLyoKICAqIG1pc2MgbmZzdjQgb3BzCiAgKi8KLXN0YXRpYyBpbmxpbmUgaW50CitzdGF0aWMgaW5saW5lIF9fYmUzMgogbmZzZDRfYWNjZXNzKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHN0cnVjdCBzdmNfZmggKmN1cnJlbnRfZmgsIHN0cnVjdCBuZnNkNF9hY2Nlc3MgKmFjY2VzcykKIHsKIAlpZiAoYWNjZXNzLT5hY19yZXFfYWNjZXNzICYgfk5GUzNfQUNDRVNTX0ZVTEwpCkBAIC0zMjQsMTAgKzMyNCwxMCBAQAogCXJldHVybiBuZnNkX2FjY2VzcyhycXN0cCwgY3VycmVudF9maCwgJmFjY2Vzcy0+YWNfcmVzcF9hY2Nlc3MsICZhY2Nlc3MtPmFjX3N1cHBvcnRlZCk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgaW50CitzdGF0aWMgaW5saW5lIF9fYmUzMgogbmZzZDRfY29tbWl0KHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHN0cnVjdCBzdmNfZmggKmN1cnJlbnRfZmgsIHN0cnVjdCBuZnNkNF9jb21taXQgKmNvbW1pdCkKIHsKLQlpbnQgc3RhdHVzOworCV9fYmUzMiBzdGF0dXM7CiAKIAl1MzIgKnAgPSAodTMyICopY29tbWl0LT5jb192ZXJmLmRhdGE7CiAJKnArKyA9IG5mc3N2Y19ib290LnR2X3NlYzsKQEAgLTMzOSwxMSArMzM5LDExIEBACiAJcmV0dXJuIHN0YXR1czsKIH0KIAotc3RhdGljIGludAorc3RhdGljIF9fYmUzMgogbmZzZDRfY3JlYXRlKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHN0cnVjdCBzdmNfZmggKmN1cnJlbnRfZmgsIHN0cnVjdCBuZnNkNF9jcmVhdGUgKmNyZWF0ZSkKIHsKIAlzdHJ1Y3Qgc3ZjX2ZoIHJlc2ZoOwotCWludCBzdGF0dXM7CisJX19iZTMyIHN0YXR1czsKIAlkZXZfdCByZGV2OwogCiAJZmhfaW5pdCgmcmVzZmgsIE5GUzRfRkhTSVpFKTsKQEAgLTQyMywxMCArNDIzLDEwIEBACiAJcmV0dXJuIHN0YXR1czsKIH0KIAotc3RhdGljIGlubGluZSBpbnQKK3N0YXRpYyBpbmxpbmUgX19iZTMyCiBuZnNkNF9nZXRhdHRyKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHN0cnVjdCBzdmNfZmggKmN1cnJlbnRfZmgsIHN0cnVjdCBuZnNkNF9nZXRhdHRyICpnZXRhdHRyKQogewotCWludCBzdGF0dXM7CisJX19iZTMyIHN0YXR1czsKIAogCXN0YXR1cyA9IGZoX3ZlcmlmeShycXN0cCwgY3VycmVudF9maCwgMCwgTUFZX05PUCk7CiAJaWYgKHN0YXR1cykKQEAgLTQ0MiwxMSArNDQyLDExIEBACiAJcmV0dXJuIG5mc19vazsKIH0KIAotc3RhdGljIGlubGluZSBpbnQKK3N0YXRpYyBpbmxpbmUgX19iZTMyCiBuZnNkNF9saW5rKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHN0cnVjdCBzdmNfZmggKmN1cnJlbnRfZmgsCiAJICAgc3RydWN0IHN2Y19maCAqc2F2ZV9maCwgc3RydWN0IG5mc2Q0X2xpbmsgKmxpbmspCiB7Ci0JaW50IHN0YXR1cyA9IG5mc2Vycl9ub2ZpbGVoYW5kbGU7CisJX19iZTMyIHN0YXR1cyA9IG5mc2Vycl9ub2ZpbGVoYW5kbGU7CiAKIAlpZiAoIXNhdmVfZmgtPmZoX2RlbnRyeSkKIAkJcmV0dXJuIHN0YXR1czsKQEAgLTQ1NiwxMSArNDU2LDExIEBACiAJcmV0dXJuIHN0YXR1czsKIH0KIAotc3RhdGljIGludAorc3RhdGljIF9fYmUzMgogbmZzZDRfbG9va3VwcChzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCBzdHJ1Y3Qgc3ZjX2ZoICpjdXJyZW50X2ZoKQogewogCXN0cnVjdCBzdmNfZmggdG1wX2ZoOwotCWludCByZXQ7CisJX19iZTMyIHJldDsKIAogCWZoX2luaXQoJnRtcF9maCwgTkZTNF9GSFNJWkUpOwogCWlmKChyZXQgPSBleHBfcHNldWRvcm9vdChycXN0cC0+cnFfY2xpZW50LCAmdG1wX2ZoLApAQCAtNDc0LDE2ICs0NzQsMTYgQEAKIAlyZXR1cm4gbmZzZF9sb29rdXAocnFzdHAsIGN1cnJlbnRfZmgsICIuLiIsIDIsIGN1cnJlbnRfZmgpOwogfQogCi1zdGF0aWMgaW5saW5lIGludAorc3RhdGljIGlubGluZSBfX2JlMzIKIG5mc2Q0X2xvb2t1cChzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCBzdHJ1Y3Qgc3ZjX2ZoICpjdXJyZW50X2ZoLCBzdHJ1Y3QgbmZzZDRfbG9va3VwICpsb29rdXApCiB7CiAJcmV0dXJuIG5mc2RfbG9va3VwKHJxc3RwLCBjdXJyZW50X2ZoLCBsb29rdXAtPmxvX25hbWUsIGxvb2t1cC0+bG9fbGVuLCBjdXJyZW50X2ZoKTsKIH0KIAotc3RhdGljIGlubGluZSBpbnQKK3N0YXRpYyBpbmxpbmUgX19iZTMyCiBuZnNkNF9yZWFkKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHN0cnVjdCBzdmNfZmggKmN1cnJlbnRfZmgsIHN0cnVjdCBuZnNkNF9yZWFkICpyZWFkKQogewotCWludCBzdGF0dXM7CisJX19iZTMyIHN0YXR1czsKIAogCS8qIG5vIG5lZWQgdG8gY2hlY2sgcGVybWlzc2lvbiAtIHRoaXMgd2lsbCBiZSBkb25lIGluIG5mc2RfcmVhZCgpICovCiAKQEAgLTUwOCw3ICs1MDgsNyBAQAogCXJldHVybiBzdGF0dXM7CiB9CiAKLXN0YXRpYyBpbmxpbmUgaW50CitzdGF0aWMgaW5saW5lIF9fYmUzMgogbmZzZDRfcmVhZGRpcihzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCBzdHJ1Y3Qgc3ZjX2ZoICpjdXJyZW50X2ZoLCBzdHJ1Y3QgbmZzZDRfcmVhZGRpciAqcmVhZGRpcikKIHsKIAl1NjQgY29va2llID0gcmVhZGRpci0+cmRfY29va2llOwpAQCAtNTMxLDcgKzUzMSw3IEBACiAJcmV0dXJuIG5mc19vazsKIH0KIAotc3RhdGljIGlubGluZSBpbnQKK3N0YXRpYyBpbmxpbmUgX19iZTMyCiBuZnNkNF9yZWFkbGluayhzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCBzdHJ1Y3Qgc3ZjX2ZoICpjdXJyZW50X2ZoLCBzdHJ1Y3QgbmZzZDRfcmVhZGxpbmsgKnJlYWRsaW5rKQogewogCXJlYWRsaW5rLT5ybF9ycXN0cCA9IHJxc3RwOwpAQCAtNTM5LDEwICs1MzksMTAgQEAKIAlyZXR1cm4gbmZzX29rOwogfQogCi1zdGF0aWMgaW5saW5lIGludAorc3RhdGljIGlubGluZSBfX2JlMzIKIG5mc2Q0X3JlbW92ZShzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCBzdHJ1Y3Qgc3ZjX2ZoICpjdXJyZW50X2ZoLCBzdHJ1Y3QgbmZzZDRfcmVtb3ZlICpyZW1vdmUpCiB7Ci0JaW50IHN0YXR1czsKKwlfX2JlMzIgc3RhdHVzOwogCiAJaWYgKG5mczRfaW5fZ3JhY2UoKSkKIAkJcmV0dXJuIG5mc2Vycl9ncmFjZTsKQEAgLTU1NiwxMSArNTU2LDExIEBACiAJcmV0dXJuIHN0YXR1czsKIH0KIAotc3RhdGljIGlubGluZSBpbnQKK3N0YXRpYyBpbmxpbmUgX19iZTMyCiBuZnNkNF9yZW5hbWUoc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgc3RydWN0IHN2Y19maCAqY3VycmVudF9maCwKIAkgICAgIHN0cnVjdCBzdmNfZmggKnNhdmVfZmgsIHN0cnVjdCBuZnNkNF9yZW5hbWUgKnJlbmFtZSkKIHsKLQlpbnQgc3RhdHVzID0gbmZzZXJyX25vZmlsZWhhbmRsZTsKKwlfX2JlMzIgc3RhdHVzID0gbmZzZXJyX25vZmlsZWhhbmRsZTsKIAogCWlmICghc2F2ZV9maC0+ZmhfZGVudHJ5KQogCQlyZXR1cm4gc3RhdHVzOwpAQCAtNTg5LDEwICs1ODksMTAgQEAKIAlyZXR1cm4gc3RhdHVzOwogfQogCi1zdGF0aWMgaW5saW5lIGludAorc3RhdGljIGlubGluZSBfX2JlMzIKIG5mc2Q0X3NldGF0dHIoc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgc3RydWN0IHN2Y19maCAqY3VycmVudF9maCwgc3RydWN0IG5mc2Q0X3NldGF0dHIgKnNldGF0dHIpCiB7Ci0JaW50IHN0YXR1cyA9IG5mc19vazsKKwlfX2JlMzIgc3RhdHVzID0gbmZzX29rOwogCiAJaWYgKHNldGF0dHItPnNhX2lhdHRyLmlhX3ZhbGlkICYgQVRUUl9TSVpFKSB7CiAJCW5mczRfbG9ja19zdGF0ZSgpOwpAQCAtNjE0LDEzICs2MTQsMTMgQEAKIAlyZXR1cm4gc3RhdHVzOwogfQogCi1zdGF0aWMgaW5saW5lIGludAorc3RhdGljIGlubGluZSBfX2JlMzIKIG5mc2Q0X3dyaXRlKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHN0cnVjdCBzdmNfZmggKmN1cnJlbnRfZmgsIHN0cnVjdCBuZnNkNF93cml0ZSAqd3JpdGUpCiB7CiAJc3RhdGVpZF90ICpzdGF0ZWlkID0gJndyaXRlLT53cl9zdGF0ZWlkOwogCXN0cnVjdCBmaWxlICpmaWxwID0gTlVMTDsKIAl1MzIgKnA7Ci0JaW50IHN0YXR1cyA9IG5mc19vazsKKwlfX2JlMzIgc3RhdHVzID0gbmZzX29rOwogCiAJLyogbm8gbmVlZCB0byBjaGVjayBwZXJtaXNzaW9uIC0gdGhpcyB3aWxsIGJlIGRvbmUgaW4gbmZzZF93cml0ZSgpICovCiAKQEAgLTY2MSwxMiArNjYxLDEyIEBACiAgKiBhdHRyaWJ1dGVzIG1hdGNoZWQuICBWRVJJRlkgaXMgaW1wbGVtZW50ZWQgYnkgbWFwcGluZyBORlNFUlJfU0FNRQogICogdG8gTkZTX09LIGFmdGVyIHRoZSBjYWxsOyBOVkVSSUZZIGJ5IG1hcHBpbmcgTkZTRVJSX05PVF9TQU1FIHRvIE5GU19PSy4KICAqLwotc3RhdGljIGludAorc3RhdGljIF9fYmUzMgogbmZzZDRfdmVyaWZ5KHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHN0cnVjdCBzdmNfZmggKmN1cnJlbnRfZmgsIHN0cnVjdCBuZnNkNF92ZXJpZnkgKnZlcmlmeSkKIHsKLQl1MzIgKmJ1ZiwgKnA7CisJX19iZTMyICpidWYsICpwOwogCWludCBjb3VudDsKLQlpbnQgc3RhdHVzOworCV9fYmUzMiBzdGF0dXM7CiAKIAlzdGF0dXMgPSBmaF92ZXJpZnkocnFzdHAsIGN1cnJlbnRfZmgsIDAsIE1BWV9OT1ApOwogCWlmIChzdGF0dXMpCkBAIC03MTUsNyArNzE1LDcgQEAKIC8qCiAgKiBOVUxMIGNhbGwuCiAgKi8KLXN0YXRpYyBpbnQKK3N0YXRpYyBfX2JlMzIKIG5mc2Q0X3Byb2NfbnVsbChzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCB2b2lkICphcmdwLCB2b2lkICpyZXNwKQogewogCXJldHVybiBuZnNfb2s7CkBAIC03MzEsNyArNzMxLDcgQEAKIC8qCiAgKiBDT01QT1VORCBjYWxsLgogICovCi1zdGF0aWMgaW50CitzdGF0aWMgX19iZTMyCiBuZnNkNF9wcm9jX2NvbXBvdW5kKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsCiAJCSAgICBzdHJ1Y3QgbmZzZDRfY29tcG91bmRhcmdzICphcmdzLAogCQkgICAgc3RydWN0IG5mc2Q0X2NvbXBvdW5kcmVzICpyZXNwKQpAQCAtNzQxLDcgKzc0MSw3IEBACiAJc3RydWN0IHN2Y19maAkqc2F2ZV9maCA9IE5VTEw7CiAJc3RydWN0IG5mczRfc3RhdGVvd25lciAqcmVwbGF5X293bmVyID0gTlVMTDsKIAlpbnQJCXNsYWNrX3NwYWNlOyAgICAvKiBpbiB3b3Jkcywgbm90IGJ5dGVzISAqLwotCWludAkJc3RhdHVzOworCV9fYmUzMgkJc3RhdHVzOwogCiAJc3RhdHVzID0gbmZzZXJyX3Jlc291cmNlOwogCWN1cnJlbnRfZmggPSBrbWFsbG9jKHNpemVvZigqY3VycmVudF9maCksIEdGUF9LRVJORUwpOwpAQCAtOTM3LDcgKzkzNyw3IEBACiAJCX0KIAogZW5jb2RlX29wOgotCQlpZiAob3AtPnN0YXR1cyA9PSBORlNFUlJfUkVQTEFZX01FKSB7CisJCWlmIChvcC0+c3RhdHVzID09IG5mc2Vycl9yZXBsYXlfbWUpIHsKIAkJCW9wLT5yZXBsYXkgPSAmcmVwbGF5X293bmVyLT5zb19yZXBsYXk7CiAJCQluZnNkNF9lbmNvZGVfcmVwbGF5KHJlc3AsIG9wKTsKIAkJCXN0YXR1cyA9IG9wLT5zdGF0dXMgPSBvcC0+cmVwbGF5LT5ycF9zdGF0dXM7CmRpZmYgLS1naXQgYS9mcy9uZnNkL25mczRyZWNvdmVyLmMgYi9mcy9uZnNkL25mczRyZWNvdmVyLmMKaW5kZXggMWNiZDJlNC4uODFiODU2NSAxMDA2NDQKLS0tIGEvZnMvbmZzZC9uZnM0cmVjb3Zlci5jCisrKyBiL2ZzL25mc2QvbmZzNHJlY292ZXIuYwpAQCAtODMsMTMgKzgzLDEzIEBACiAJKm91dCA9ICdcMCc7CiB9CiAKLWludAorX19iZTMyCiBuZnM0X21ha2VfcmVjX2NsaWRuYW1lKGNoYXIgKmRuYW1lLCBzdHJ1Y3QgeGRyX25ldG9iaiAqY2xuYW1lKQogewogCXN0cnVjdCB4ZHJfbmV0b2JqIGNrc3VtOwogCXN0cnVjdCBoYXNoX2Rlc2MgZGVzYzsKIAlzdHJ1Y3Qgc2NhdHRlcmxpc3Qgc2dbMV07Ci0JaW50IHN0YXR1cyA9IG5mc2Vycl9yZXNvdXJjZTsKKwlfX2JlMzIgc3RhdHVzID0gbmZzZXJyX3Jlc291cmNlOwogCiAJZHByaW50aygiTkZTRDogbmZzNF9tYWtlX3JlY19jbGlkbmFtZSBmb3IgJS4qc1xuIiwKIAkJCWNsbmFtZS0+bGVuLCBjbG5hbWUtPmRhdGEpOwpAQCAtMTkzLDcgKzE5Myw3IEBACiAJc3RydWN0IGRlbnRyeV9saXN0ICpjaGlsZDsKIAogCWlmIChuYW1lICYmIGlzZG90ZW50KG5hbWUsIG5hbWxlbikpCi0JCXJldHVybiBuZnNfb2s7CisJCXJldHVybiAwOwogCWRlbnRyeSA9IGxvb2t1cF9vbmVfbGVuKG5hbWUsIHBhcmVudCwgbmFtbGVuKTsKIAlpZiAoSVNfRVJSKGRlbnRyeSkpCiAJCXJldHVybiBQVFJfRVJSKGRlbnRyeSk7CkBAIC0yNzQsNyArMjc0LDcgQEAKIAkgKiBhbnkgcmVndWxhciBmaWxlcyBhbnl3YXksIGp1c3QgaW4gY2FzZSB0aGUgZGlyZWN0b3J5IHdhcyBjcmVhdGVkIGJ5CiAJICogYSBrZXJuZWwgZnJvbSB0aGUgZnV0dXJlLi4uLiAqLwogCW5mc2Q0X2xpc3RfcmVjX2RpcihkZW50cnksIG5mc2Q0X3JlbW92ZV9jbGlkX2ZpbGUpOwotCW11dGV4X2xvY2soJmRpci0+ZF9pbm9kZS0+aV9tdXRleCk7CisJbXV0ZXhfbG9ja19uZXN0ZWQoJmRpci0+ZF9pbm9kZS0+aV9tdXRleCwgSV9NVVRFWF9QQVJFTlQpOwogCXN0YXR1cyA9IHZmc19ybWRpcihkaXItPmRfaW5vZGUsIGRlbnRyeSk7CiAJbXV0ZXhfdW5sb2NrKCZkaXItPmRfaW5vZGUtPmlfbXV0ZXgpOwogCXJldHVybiBzdGF0dXM7CkBAIC0zMzMsMTQgKzMzMywxNCBAQAogCWludCBzdGF0dXM7CiAKIAlpZiAobmZzNF9oYXNfcmVjbGFpbWVkX3N0YXRlKGNoaWxkLT5kX25hbWUubmFtZSkpCi0JCXJldHVybiBuZnNfb2s7CisJCXJldHVybiAwOwogCiAJc3RhdHVzID0gbmZzZDRfY2xlYXJfY2xpZF9kaXIocGFyZW50LCBjaGlsZCk7CiAJaWYgKHN0YXR1cykKIAkJcHJpbnRrKCJmYWlsZWQgdG8gcmVtb3ZlIGNsaWVudCByZWNvdmVyeSBkaXJlY3RvcnkgJXNcbiIsCiAJCQkJY2hpbGQtPmRfbmFtZS5uYW1lKTsKIAkvKiBLZWVwIHRyeWluZywgc3VjY2VzcyBvciBmYWlsdXJlOiAqLwotCXJldHVybiBuZnNfb2s7CisJcmV0dXJuIDA7CiB9CiAKIHZvaWQKQEAgLTM2NSwxMCArMzY1LDEwIEBACiAJCXByaW50aygibmZzZDQ6IGlsbGVnYWwgbmFtZSAlcyBpbiByZWNvdmVyeSBkaXJlY3RvcnlcbiIsCiAJCQkJY2hpbGQtPmRfbmFtZS5uYW1lKTsKIAkJLyogS2VlcCB0cnlpbmc7IG1heWJlIHRoZSBvdGhlcnMgYXJlIE9LOiAqLwotCQlyZXR1cm4gbmZzX29rOworCQlyZXR1cm4gMDsKIAl9CiAJbmZzNF9jbGllbnRfdG9fcmVjbGFpbShjaGlsZC0+ZF9uYW1lLm5hbWUpOwotCXJldHVybiBuZnNfb2s7CisJcmV0dXJuIDA7CiB9CiAKIGludApkaWZmIC0tZ2l0IGEvZnMvbmZzZC9uZnM0c3RhdGUuYyBiL2ZzL25mc2QvbmZzNHN0YXRlLmMKaW5kZXggZWJjZjIyNi4uMjkzYjY0OSAxMDA2NDQKLS0tIGEvZnMvbmZzZC9uZnM0c3RhdGUuYworKysgYi9mcy9uZnNkL25mczRzdGF0ZS5jCkBAIC03MTAsMTAgKzcxMCwxMCBAQAogICoJCWFzIGRlc2NyaWJlZCBhYm92ZS4KICAqCiAgKi8KLWludAorX19iZTMyCiBuZnNkNF9zZXRjbGllbnRpZChzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCBzdHJ1Y3QgbmZzZDRfc2V0Y2xpZW50aWQgKnNldGNsaWQpCiB7Ci0JdTMyIAkJCWlwX2FkZHIgPSBycXN0cC0+cnFfYWRkci5zaW5fYWRkci5zX2FkZHI7CisJX19iZTMyIAkJCWlwX2FkZHIgPSBycXN0cC0+cnFfYWRkci5zaW5fYWRkci5zX2FkZHI7CiAJc3RydWN0IHhkcl9uZXRvYmogCWNsbmFtZSA9IHsgCiAJCS5sZW4gPSBzZXRjbGlkLT5zZV9uYW1lbGVuLAogCQkuZGF0YSA9IHNldGNsaWQtPnNlX25hbWUsCkBAIC03MjEsNyArNzIxLDcgQEAKIAluZnM0X3ZlcmlmaWVyCQljbHZlcmlmaWVyID0gc2V0Y2xpZC0+c2VfdmVyZjsKIAl1bnNpZ25lZCBpbnQgCQlzdHJoYXNodmFsOwogCXN0cnVjdCBuZnM0X2NsaWVudAkqY29uZiwgKnVuY29uZiwgKm5ldzsKLQlpbnQgCQkJc3RhdHVzOworCV9fYmUzMiAJCQlzdGF0dXM7CiAJY2hhciAgICAgICAgICAgICAgICAgICAgZG5hbWVbSEVYRElSX0xFTl07CiAJCiAJaWYgKCFjaGVja19uYW1lKGNsbmFtZSkpCkBAIC04NzUsMTQgKzg3NSwxNCBAQAogICoKICAqIE5PVEU6IGNhbGxiYWNrIGluZm9ybWF0aW9uIHdpbGwgYmUgcHJvY2Vzc2VkIGhlcmUgaW4gYSBmdXR1cmUgcGF0Y2gKICAqLwotaW50CitfX2JlMzIKIG5mc2Q0X3NldGNsaWVudGlkX2NvbmZpcm0oc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgc3RydWN0IG5mc2Q0X3NldGNsaWVudGlkX2NvbmZpcm0gKnNldGNsaWVudGlkX2NvbmZpcm0pCiB7Ci0JdTMyIGlwX2FkZHIgPSBycXN0cC0+cnFfYWRkci5zaW5fYWRkci5zX2FkZHI7CisJX19iZTMyIGlwX2FkZHIgPSBycXN0cC0+cnFfYWRkci5zaW5fYWRkci5zX2FkZHI7CiAJc3RydWN0IG5mczRfY2xpZW50ICpjb25mLCAqdW5jb25mOwogCW5mczRfdmVyaWZpZXIgY29uZmlybSA9IHNldGNsaWVudGlkX2NvbmZpcm0tPnNjX2NvbmZpcm07IAogCWNsaWVudGlkX3QgKiBjbGlkID0gJnNldGNsaWVudGlkX2NvbmZpcm0tPnNjX2NsaWVudGlkOwotCWludCBzdGF0dXM7CisJX19iZTMyIHN0YXR1czsKIAogCWlmIChTVEFMRV9DTElFTlRJRChjbGlkKSkKIAkJcmV0dXJuIG5mc2Vycl9zdGFsZV9jbGllbnRpZDsKQEAgLTEyODAsMTMgKzEyODAsMTMgQEAKICAqIENhbGxlZCB0byBjaGVjayBkZW55IHdoZW4gUkVBRCB3aXRoIGFsbCB6ZXJvIHN0YXRlaWQgb3IKICAqIFdSSVRFIHdpdGggYWxsIHplcm8gb3IgYWxsIG9uZSBzdGF0ZWlkCiAgKi8KLXN0YXRpYyBpbnQKK3N0YXRpYyBfX2JlMzIKIG5mczRfc2hhcmVfY29uZmxpY3Qoc3RydWN0IHN2Y19maCAqY3VycmVudF9maCwgdW5zaWduZWQgaW50IGRlbnlfdHlwZSkKIHsKIAlzdHJ1Y3QgaW5vZGUgKmlubyA9IGN1cnJlbnRfZmgtPmZoX2RlbnRyeS0+ZF9pbm9kZTsKIAlzdHJ1Y3QgbmZzNF9maWxlICpmcDsKIAlzdHJ1Y3QgbmZzNF9zdGF0ZWlkICpzdHA7Ci0JaW50IHJldDsKKwlfX2JlMzIgcmV0OwogCiAJZHByaW50aygiTkZTRDogbmZzNF9zaGFyZV9jb25mbGljdFxuIik7CiAKQEAgLTE0NDQsNyArMTQ0NCw3IEBACiB9OwogCiAKLWludAorX19iZTMyCiBuZnNkNF9wcm9jZXNzX29wZW4xKHN0cnVjdCBuZnNkNF9vcGVuICpvcGVuKQogewogCWNsaWVudGlkX3QgKmNsaWVudGlkID0gJm9wZW4tPm9wX2NsaWVudGlkOwpAQCAtMTQ3Nyw3ICsxNDc3LDcgQEAKIAl9CiAJaWYgKG9wZW4tPm9wX3NlcWlkID09IHNvcC0+c29fc2VxaWQgLSAxKSB7CiAJCWlmIChzb3AtPnNvX3JlcGxheS5ycF9idWZsZW4pCi0JCQlyZXR1cm4gTkZTRVJSX1JFUExBWV9NRTsKKwkJCXJldHVybiBuZnNlcnJfcmVwbGF5X21lOwogCQkvKiBUaGUgb3JpZ2luYWwgT1BFTiBmYWlsZWQgc28gc3BlY3RhY3VsYXJseQogCQkgKiB0aGF0IHdlIGRvbid0IGV2ZW4gaGF2ZSByZXBsYXkgZGF0YSBzYXZlZCEKIAkJICogVGhlcmVmb3JlLCB3ZSBoYXZlIG5vIGNob2ljZSBidXQgdG8gY29udGludWUKQEAgLTE1MDEsNyArMTUwMSw3IEBACiAJcmV0dXJuIG5mc19vazsKIH0KIAotc3RhdGljIGlubGluZSBpbnQKK3N0YXRpYyBpbmxpbmUgX19iZTMyCiBuZnM0X2NoZWNrX2RlbGVnbW9kZShzdHJ1Y3QgbmZzNF9kZWxlZ2F0aW9uICpkcCwgaW50IGZsYWdzKQogewogCWlmICgoZmxhZ3MgJiBXUl9TVEFURSkgJiYgKGRwLT5kbF90eXBlID09IE5GUzRfT1BFTl9ERUxFR0FURV9SRUFEKSkKQEAgLTE1MjIsMTIgKzE1MjIsMTIgQEAKIAlyZXR1cm4gTlVMTDsKIH0KIAotc3RhdGljIGludAorc3RhdGljIF9fYmUzMgogbmZzNF9jaGVja19kZWxlZyhzdHJ1Y3QgbmZzNF9maWxlICpmcCwgc3RydWN0IG5mc2Q0X29wZW4gKm9wZW4sCiAJCXN0cnVjdCBuZnM0X2RlbGVnYXRpb24gKipkcCkKIHsKIAlpbnQgZmxhZ3M7Ci0JaW50IHN0YXR1cyA9IG5mc2Vycl9iYWRfc3RhdGVpZDsKKwlfX2JlMzIgc3RhdHVzID0gbmZzZXJyX2JhZF9zdGF0ZWlkOwogCiAJKmRwID0gZmluZF9kZWxlZ2F0aW9uX2ZpbGUoZnAsICZvcGVuLT5vcF9kZWxlZ2F0ZV9zdGF0ZWlkKTsKIAlpZiAoKmRwID09IE5VTEwpCkBAIC0xNTQ2LDExICsxNTQ2LDExIEBACiAJcmV0dXJuIG5mc19vazsKIH0KIAotc3RhdGljIGludAorc3RhdGljIF9fYmUzMgogbmZzNF9jaGVja19vcGVuKHN0cnVjdCBuZnM0X2ZpbGUgKmZwLCBzdHJ1Y3QgbmZzZDRfb3BlbiAqb3Blbiwgc3RydWN0IG5mczRfc3RhdGVpZCAqKnN0cHApCiB7CiAJc3RydWN0IG5mczRfc3RhdGVpZCAqbG9jYWw7Ci0JaW50IHN0YXR1cyA9IG5mc2Vycl9zaGFyZV9kZW5pZWQ7CisJX19iZTMyIHN0YXR1cyA9IG5mc2Vycl9zaGFyZV9kZW5pZWQ7CiAJc3RydWN0IG5mczRfc3RhdGVvd25lciAqc29wID0gb3Blbi0+b3Bfc3RhdGVvd25lcjsKIAogCWxpc3RfZm9yX2VhY2hfZW50cnkobG9jYWwsICZmcC0+Zmlfc3RhdGVpZHMsIHN0X3BlcmZpbGUpIHsKQEAgLTE1NzUsNyArMTU3NSw3IEBACiAJcmV0dXJuIGttZW1fY2FjaGVfYWxsb2Moc3RhdGVpZF9zbGFiLCBHRlBfS0VSTkVMKTsKIH0KIAotc3RhdGljIGludAorc3RhdGljIF9fYmUzMgogbmZzNF9uZXdfb3BlbihzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCBzdHJ1Y3QgbmZzNF9zdGF0ZWlkICoqc3RwcCwKIAkJc3RydWN0IG5mczRfZGVsZWdhdGlvbiAqZHAsCiAJCXN0cnVjdCBzdmNfZmggKmN1cl9maCwgaW50IGZsYWdzKQpAQCAtMTU5MCw3ICsxNTkwLDcgQEAKIAkJZ2V0X2ZpbGUoZHAtPmRsX3Zmc19maWxlKTsKIAkJc3RwLT5zdF92ZnNfZmlsZSA9IGRwLT5kbF92ZnNfZmlsZTsKIAl9IGVsc2UgewotCQlpbnQgc3RhdHVzOworCQlfX2JlMzIgc3RhdHVzOwogCQlzdGF0dXMgPSBuZnNkX29wZW4ocnFzdHAsIGN1cl9maCwgU19JRlJFRywgZmxhZ3MsCiAJCQkJJnN0cC0+c3RfdmZzX2ZpbGUpOwogCQlpZiAoc3RhdHVzKSB7CkBAIC0xNjA0LDcgKzE2MDQsNyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW5saW5lIGludAorc3RhdGljIGlubGluZSBfX2JlMzIKIG5mc2Q0X3RydW5jYXRlKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHN0cnVjdCBzdmNfZmggKmZoLAogCQlzdHJ1Y3QgbmZzZDRfb3BlbiAqb3BlbikKIHsKQEAgLTE2MTksMjIgKzE2MTksMjIgQEAKIAlyZXR1cm4gbmZzZF9zZXRhdHRyKHJxc3RwLCBmaCwgJmlhdHRyLCAwLCAodGltZV90KTApOwogfQogCi1zdGF0aWMgaW50CitzdGF0aWMgX19iZTMyCiBuZnM0X3VwZ3JhZGVfb3BlbihzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCBzdHJ1Y3Qgc3ZjX2ZoICpjdXJfZmgsIHN0cnVjdCBuZnM0X3N0YXRlaWQgKnN0cCwgc3RydWN0IG5mc2Q0X29wZW4gKm9wZW4pCiB7CiAJc3RydWN0IGZpbGUgKmZpbHAgPSBzdHAtPnN0X3Zmc19maWxlOwogCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBmaWxwLT5mX2RlbnRyeS0+ZF9pbm9kZTsKIAl1bnNpZ25lZCBpbnQgc2hhcmVfYWNjZXNzLCBuZXdfd3JpdGVyOwotCWludCBzdGF0dXM7CisJX19iZTMyIHN0YXR1czsKIAogCXNldF9hY2Nlc3MoJnNoYXJlX2FjY2Vzcywgc3RwLT5zdF9hY2Nlc3NfYm1hcCk7CiAJbmV3X3dyaXRlciA9ICh+c2hhcmVfYWNjZXNzKSAmIG9wZW4tPm9wX3NoYXJlX2FjY2VzcwogCQkJJiBORlM0X1NIQVJFX0FDQ0VTU19XUklURTsKIAogCWlmIChuZXdfd3JpdGVyKSB7Ci0JCXN0YXR1cyA9IGdldF93cml0ZV9hY2Nlc3MoaW5vZGUpOwotCQlpZiAoc3RhdHVzKQotCQkJcmV0dXJuIG5mc2Vycm5vKHN0YXR1cyk7CisJCWludCBlcnIgPSBnZXRfd3JpdGVfYWNjZXNzKGlub2RlKTsKKwkJaWYgKGVycikKKwkJCXJldHVybiBuZnNlcnJubyhlcnIpOwogCX0KIAlzdGF0dXMgPSBuZnNkNF90cnVuY2F0ZShycXN0cCwgY3VyX2ZoLCBvcGVuKTsKIAlpZiAoc3RhdHVzKSB7CkBAIC0xNzM4LDE0ICsxNzM4LDE0IEBACiAvKgogICogY2FsbGVkIHdpdGggbmZzNF9sb2NrX3N0YXRlKCkgaGVsZC4KICAqLwotaW50CitfX2JlMzIKIG5mc2Q0X3Byb2Nlc3Nfb3BlbjIoc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgc3RydWN0IHN2Y19maCAqY3VycmVudF9maCwgc3RydWN0IG5mc2Q0X29wZW4gKm9wZW4pCiB7CiAJc3RydWN0IG5mczRfZmlsZSAqZnAgPSBOVUxMOwogCXN0cnVjdCBpbm9kZSAqaW5vID0gY3VycmVudF9maC0+ZmhfZGVudHJ5LT5kX2lub2RlOwogCXN0cnVjdCBuZnM0X3N0YXRlaWQgKnN0cCA9IE5VTEw7CiAJc3RydWN0IG5mczRfZGVsZWdhdGlvbiAqZHAgPSBOVUxMOwotCWludCBzdGF0dXM7CisJX19iZTMyIHN0YXR1czsKIAogCXN0YXR1cyA9IG5mc2Vycl9pbnZhbDsKIAlpZiAoIWFjY2Vzc192YWxpZChvcGVuLT5vcF9zaGFyZV9hY2Nlc3MpCkBAIC0xODMzLDExICsxODMzLDExIEBACiBzdGF0aWMgdm9pZCBsYXVuZHJvbWF0X21haW4odm9pZCAqKTsKIHN0YXRpYyBERUNMQVJFX1dPUksobGF1bmRyb21hdF93b3JrLCBsYXVuZHJvbWF0X21haW4sIE5VTEwpOwogCi1pbnQgCitfX2JlMzIKIG5mc2Q0X3JlbmV3KGNsaWVudGlkX3QgKmNsaWQpCiB7CiAJc3RydWN0IG5mczRfY2xpZW50ICpjbHA7Ci0JaW50IHN0YXR1czsKKwlfX2JlMzIgc3RhdHVzOwogCiAJbmZzNF9sb2NrX3N0YXRlKCk7CiAJZHByaW50aygicHJvY2Vzc19yZW5ldyglMDh4LyUwOHgpOiBzdGFydGluZ1xuIiwgCkBAIC0xOTk2LDkgKzE5OTYsOSBAQAogfQogCiBzdGF0aWMKLWludCBuZnM0X2NoZWNrX29wZW5tb2RlKHN0cnVjdCBuZnM0X3N0YXRlaWQgKnN0cCwgaW50IGZsYWdzKQorX19iZTMyIG5mczRfY2hlY2tfb3Blbm1vZGUoc3RydWN0IG5mczRfc3RhdGVpZCAqc3RwLCBpbnQgZmxhZ3MpCiB7Ci0gICAgICAgIGludCBzdGF0dXMgPSBuZnNlcnJfb3Blbm1vZGU7CisgICAgICAgIF9fYmUzMiBzdGF0dXMgPSBuZnNlcnJfb3Blbm1vZGU7CiAKIAlpZiAoKGZsYWdzICYgV1JfU1RBVEUpICYmICghYWNjZXNzX3Blcm1pdF93cml0ZShzdHAtPnN0X2FjY2Vzc19ibWFwKSkpCiAgICAgICAgICAgICAgICAgZ290byBvdXQ7CkBAIC0yMDA5LDcgKzIwMDksNyBAQAogCXJldHVybiBzdGF0dXM7CiB9CiAKLXN0YXRpYyBpbmxpbmUgaW50CitzdGF0aWMgaW5saW5lIF9fYmUzMgogY2hlY2tfc3BlY2lhbF9zdGF0ZWlkcyhzdmNfZmggKmN1cnJlbnRfZmgsIHN0YXRlaWRfdCAqc3RhdGVpZCwgaW50IGZsYWdzKQogewogCS8qIFRyeWluZyB0byBjYWxsIGRlbGVncmV0dXJuIHdpdGggYSBzcGVjaWFsIHN0YXRlaWQ/IFl1Y2g6ICovCkBAIC0yMDQzLDE0ICsyMDQzLDE0IEBACiAvKgogKiBDaGVja3MgZm9yIHN0YXRlaWQgb3BlcmF0aW9ucwogKi8KLWludAorX19iZTMyCiBuZnM0X3ByZXByb2Nlc3Nfc3RhdGVpZF9vcChzdHJ1Y3Qgc3ZjX2ZoICpjdXJyZW50X2ZoLCBzdGF0ZWlkX3QgKnN0YXRlaWQsIGludCBmbGFncywgc3RydWN0IGZpbGUgKipmaWxwcCkKIHsKIAlzdHJ1Y3QgbmZzNF9zdGF0ZWlkICpzdHAgPSBOVUxMOwogCXN0cnVjdCBuZnM0X2RlbGVnYXRpb24gKmRwID0gTlVMTDsKIAlzdGF0ZWlkX3QgKnN0aWRwOwogCXN0cnVjdCBpbm9kZSAqaW5vID0gY3VycmVudF9maC0+ZmhfZGVudHJ5LT5kX2lub2RlOwotCWludCBzdGF0dXM7CisJX19iZTMyIHN0YXR1czsKIAogCWRwcmludGsoIk5GU0Q6IHByZXByb2Nlc3Nfc3RhdGVpZF9vcDogc3RhdGVpZCA9ICglMDh4LyUwOHgvJTA4eC8lMDh4KVxuIiwKIAkJc3RhdGVpZC0+c2lfYm9vdCwgc3RhdGVpZC0+c2lfc3RhdGVvd25lcmlkLCAKQEAgLTIxMjUsNyArMjEyNSw3IEBACiAvKiAKICAqIENoZWNrcyBmb3Igc2VxdWVuY2UgaWQgbXV0YXRpbmcgb3BlcmF0aW9ucy4gCiAgKi8KLXN0YXRpYyBpbnQKK3N0YXRpYyBfX2JlMzIKIG5mczRfcHJlcHJvY2Vzc19zZXFpZF9vcChzdHJ1Y3Qgc3ZjX2ZoICpjdXJyZW50X2ZoLCB1MzIgc2VxaWQsIHN0YXRlaWRfdCAqc3RhdGVpZCwgaW50IGZsYWdzLCBzdHJ1Y3QgbmZzNF9zdGF0ZW93bmVyICoqc29wcCwgc3RydWN0IG5mczRfc3RhdGVpZCAqKnN0cHAsIHN0cnVjdCBuZnNkNF9sb2NrICpsb2NrKQogewogCXN0cnVjdCBuZnM0X3N0YXRlaWQgKnN0cDsKQEAgLTIxNjksNyArMjE2OSw3IEBACiAJCWNsaWVudGlkX3QgKmxvY2tjbGlkID0gJmxvY2stPnYubmV3LmNsaWVudGlkOwogCQlzdHJ1Y3QgbmZzNF9jbGllbnQgKmNscCA9IHNvcC0+c29fY2xpZW50OwogCQlpbnQgbGtmbGcgPSAwOwotCQlpbnQgc3RhdHVzOworCQlfX2JlMzIgc3RhdHVzOwogCiAJCWxrZmxnID0gc2V0bGtmbGcobG9jay0+bGtfdHlwZSk7CiAKQEAgLTIyMzMsNyArMjIzMyw3IEBACiAJaWYgKHNlcWlkID09IHNvcC0+c29fc2VxaWQgLSAxKSB7CiAJCWRwcmludGsoIk5GU0Q6IHByZXByb2Nlc3Nfc2VxaWRfb3A6IHJldHJhbnNtaXNzaW9uP1xuIik7CiAJCS8qIGluZGljYXRlIHJlcGxheSB0byBjYWxsaW5nIGZ1bmN0aW9uICovCi0JCXJldHVybiBORlNFUlJfUkVQTEFZX01FOworCQlyZXR1cm4gbmZzZXJyX3JlcGxheV9tZTsKIAl9CiAJcHJpbnRrKCJORlNEOiBwcmVwcm9jZXNzX3NlcWlkX29wOiBiYWQgc2VxaWQgKGV4cGVjdGVkICVkLCBnb3QgJWQpXG4iLAogCQkJc29wLT5zb19zZXFpZCwgc2VxaWQpOwpAQCAtMjI0MSwxMCArMjI0MSwxMCBAQAogCXJldHVybiBuZnNlcnJfYmFkX3NlcWlkOwogfQogCi1pbnQKK19fYmUzMgogbmZzZDRfb3Blbl9jb25maXJtKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHN0cnVjdCBzdmNfZmggKmN1cnJlbnRfZmgsIHN0cnVjdCBuZnNkNF9vcGVuX2NvbmZpcm0gKm9jLCBzdHJ1Y3QgbmZzNF9zdGF0ZW93bmVyICoqcmVwbGF5X293bmVyKQogewotCWludCBzdGF0dXM7CisJX19iZTMyIHN0YXR1czsKIAlzdHJ1Y3QgbmZzNF9zdGF0ZW93bmVyICpzb3A7CiAJc3RydWN0IG5mczRfc3RhdGVpZCAqc3RwOwogCkBAIC0yMzEwLDEwICsyMzEwLDEwIEBACiAJfQogfQogCi1pbnQKK19fYmUzMgogbmZzZDRfb3Blbl9kb3duZ3JhZGUoc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgc3RydWN0IHN2Y19maCAqY3VycmVudF9maCwgc3RydWN0IG5mc2Q0X29wZW5fZG93bmdyYWRlICpvZCwgc3RydWN0IG5mczRfc3RhdGVvd25lciAqKnJlcGxheV9vd25lcikKIHsKLQlpbnQgc3RhdHVzOworCV9fYmUzMiBzdGF0dXM7CiAJc3RydWN0IG5mczRfc3RhdGVpZCAqc3RwOwogCXVuc2lnbmVkIGludCBzaGFyZV9hY2Nlc3M7CiAKQEAgLTIzNjUsMTAgKzIzNjUsMTAgQEAKIC8qCiAgKiBuZnM0X3VubG9ja19zdGF0ZSgpIGNhbGxlZCBhZnRlciBlbmNvZGUKICAqLwotaW50CitfX2JlMzIKIG5mc2Q0X2Nsb3NlKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHN0cnVjdCBzdmNfZmggKmN1cnJlbnRfZmgsIHN0cnVjdCBuZnNkNF9jbG9zZSAqY2xvc2UsIHN0cnVjdCBuZnM0X3N0YXRlb3duZXIgKipyZXBsYXlfb3duZXIpCiB7Ci0JaW50IHN0YXR1czsKKwlfX2JlMzIgc3RhdHVzOwogCXN0cnVjdCBuZnM0X3N0YXRlaWQgKnN0cDsKIAogCWRwcmludGsoIk5GU0Q6IG5mc2Q0X2Nsb3NlIG9uIGZpbGUgJS4qc1xuIiwgCkBAIC0yNDA0LDEwICsyNDA0LDEwIEBACiAJcmV0dXJuIHN0YXR1czsKIH0KIAotaW50CitfX2JlMzIKIG5mc2Q0X2RlbGVncmV0dXJuKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHN0cnVjdCBzdmNfZmggKmN1cnJlbnRfZmgsIHN0cnVjdCBuZnNkNF9kZWxlZ3JldHVybiAqZHIpCiB7Ci0JaW50IHN0YXR1czsKKwlfX2JlMzIgc3RhdHVzOwogCiAJaWYgKChzdGF0dXMgPSBmaF92ZXJpZnkocnFzdHAsIGN1cnJlbnRfZmgsIFNfSUZSRUcsIDApKSkKIAkJZ290byBvdXQ7CkBAIC0yNjM1LDcgKzI2MzUsNyBAQAogLyoKICAqICBMT0NLIG9wZXJhdGlvbiAKICAqLwotaW50CitfX2JlMzIKIG5mc2Q0X2xvY2soc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgc3RydWN0IHN2Y19maCAqY3VycmVudF9maCwgc3RydWN0IG5mc2Q0X2xvY2sgKmxvY2ssIHN0cnVjdCBuZnM0X3N0YXRlb3duZXIgKipyZXBsYXlfb3duZXIpCiB7CiAJc3RydWN0IG5mczRfc3RhdGVvd25lciAqb3Blbl9zb3AgPSBOVUxMOwpAQCAtMjY0NCw4ICsyNjQ0LDkgQEAKIAlzdHJ1Y3QgZmlsZSAqZmlscDsKIAlzdHJ1Y3QgZmlsZV9sb2NrIGZpbGVfbG9jazsKIAlzdHJ1Y3QgZmlsZV9sb2NrIGNvbmZsb2NrOwotCWludCBzdGF0dXMgPSAwOworCV9fYmUzMiBzdGF0dXMgPSAwOwogCXVuc2lnbmVkIGludCBzdHJoYXNodmFsOworCWludCBlcnI7CiAKIAlkcHJpbnRrKCJORlNEOiBuZnNkNF9sb2NrOiBzdGFydD0lTGQgbGVuZ3RoPSVMZFxuIiwKIAkJKGxvbmcgbG9uZykgbG9jay0+bGtfb2Zmc2V0LApAQCAtMjc1OCwxMyArMjc1OSwxNCBAQAogCSAqIGxvY2tzX2NvcHlfbG9jazogKi8KIAljb25mbG9jay5mbF9vcHMgPSBOVUxMOwogCWNvbmZsb2NrLmZsX2xtb3BzID0gTlVMTDsKLQlzdGF0dXMgPSBwb3NpeF9sb2NrX2ZpbGVfY29uZihmaWxwLCAmZmlsZV9sb2NrLCAmY29uZmxvY2spOworCWVyciA9IHBvc2l4X2xvY2tfZmlsZV9jb25mKGZpbHAsICZmaWxlX2xvY2ssICZjb25mbG9jayk7CiAJZHByaW50aygiTkZTRDogbmZzZDRfbG9jazogcG9zaXhfbG9ja19maWxlX2NvbmYgc3RhdHVzICVkXG4iLHN0YXR1cyk7Ci0Jc3dpdGNoICgtc3RhdHVzKSB7CisJc3dpdGNoICgtZXJyKSB7CiAJY2FzZSAwOiAvKiBzdWNjZXNzISAqLwogCQl1cGRhdGVfc3RhdGVpZCgmbG9ja19zdHAtPnN0X3N0YXRlaWQpOwogCQltZW1jcHkoJmxvY2stPmxrX3Jlc3Bfc3RhdGVpZCwgJmxvY2tfc3RwLT5zdF9zdGF0ZWlkLCAKIAkJCQlzaXplb2Yoc3RhdGVpZF90KSk7CisJCXN0YXR1cyA9IDA7CiAJCWJyZWFrOwogCWNhc2UgKEVBR0FJTik6CQkvKiBjb25mbG9jayBob2xkcyBjb25mbGljdGluZyBsb2NrICovCiAJCXN0YXR1cyA9IG5mc2Vycl9kZW5pZWQ7CkBAIC0yNzc1LDcgKzI3NzcsNyBAQAogCQlzdGF0dXMgPSBuZnNlcnJfZGVhZGxvY2s7CiAJCWJyZWFrOwogCWRlZmF1bHQ6ICAgICAgICAKLQkJZHByaW50aygiTkZTRDogbmZzZDRfbG9jazogcG9zaXhfbG9ja19maWxlX2NvbmYoKSBmYWlsZWQhIHN0YXR1cyAlZFxuIixzdGF0dXMpOworCQlkcHJpbnRrKCJORlNEOiBuZnNkNF9sb2NrOiBwb3NpeF9sb2NrX2ZpbGVfY29uZigpIGZhaWxlZCEgc3RhdHVzICVkXG4iLGVycik7CiAJCXN0YXR1cyA9IG5mc2Vycl9yZXNvdXJjZTsKIAkJYnJlYWs7CiAJfQpAQCAtMjc5MywxNCArMjc5NSwxNCBAQAogLyoKICAqIExPQ0tUIG9wZXJhdGlvbgogICovCi1pbnQKK19fYmUzMgogbmZzZDRfbG9ja3Qoc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgc3RydWN0IHN2Y19maCAqY3VycmVudF9maCwgc3RydWN0IG5mc2Q0X2xvY2t0ICpsb2NrdCkKIHsKIAlzdHJ1Y3QgaW5vZGUgKmlub2RlOwogCXN0cnVjdCBmaWxlIGZpbGU7CiAJc3RydWN0IGZpbGVfbG9jayBmaWxlX2xvY2s7CiAJc3RydWN0IGZpbGVfbG9jayBjb25mbG9jazsKLQlpbnQgc3RhdHVzOworCV9fYmUzMiBzdGF0dXM7CiAKIAlpZiAobmZzNF9pbl9ncmFjZSgpKQogCQlyZXR1cm4gbmZzZXJyX2dyYWNlOwpAQCAtMjg3MywxMyArMjg3NSwxNCBAQAogCXJldHVybiBzdGF0dXM7CiB9CiAKLWludAorX19iZTMyCiBuZnNkNF9sb2NrdShzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCBzdHJ1Y3Qgc3ZjX2ZoICpjdXJyZW50X2ZoLCBzdHJ1Y3QgbmZzZDRfbG9ja3UgKmxvY2t1LCBzdHJ1Y3QgbmZzNF9zdGF0ZW93bmVyICoqcmVwbGF5X293bmVyKQogewogCXN0cnVjdCBuZnM0X3N0YXRlaWQgKnN0cDsKIAlzdHJ1Y3QgZmlsZSAqZmlscCA9IE5VTEw7CiAJc3RydWN0IGZpbGVfbG9jayBmaWxlX2xvY2s7Ci0JaW50IHN0YXR1czsKKwlfX2JlMzIgc3RhdHVzOworCWludCBlcnI7CiAJCQkJCQkgICAgICAgIAogCWRwcmludGsoIk5GU0Q6IG5mc2Q0X2xvY2t1OiBzdGFydD0lTGQgbGVuZ3RoPSVMZFxuIiwKIAkJKGxvbmcgbG9uZykgbG9ja3UtPmx1X29mZnNldCwKQEAgLTI5MTcsOCArMjkyMCw4IEBACiAJLyoKIAkqICBUcnkgdG8gdW5sb2NrIHRoZSBmaWxlIGluIHRoZSBWRlMuCiAJKi8KLQlzdGF0dXMgPSBwb3NpeF9sb2NrX2ZpbGUoZmlscCwgJmZpbGVfbG9jayk7IAotCWlmIChzdGF0dXMpIHsKKwllcnIgPSBwb3NpeF9sb2NrX2ZpbGUoZmlscCwgJmZpbGVfbG9jayk7CisJaWYgKGVycikgewogCQlkcHJpbnRrKCJORlNEOiBuZnM0X2xvY2t1OiBwb3NpeF9sb2NrX2ZpbGUgZmFpbGVkIVxuIik7CiAJCWdvdG8gb3V0X25mc2VycjsKIAl9CkBAIC0yOTM3LDcgKzI5NDAsNyBAQAogCXJldHVybiBzdGF0dXM7CiAKIG91dF9uZnNlcnI6Ci0Jc3RhdHVzID0gbmZzZXJybm8oc3RhdHVzKTsKKwlzdGF0dXMgPSBuZnNlcnJubyhlcnIpOwogCWdvdG8gb3V0OwogfQogCkBAIC0yOTY1LDcgKzI5NjgsNyBAQAogCXJldHVybiBzdGF0dXM7CiB9CiAKLWludAorX19iZTMyCiBuZnNkNF9yZWxlYXNlX2xvY2tvd25lcihzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCBzdHJ1Y3QgbmZzZDRfcmVsZWFzZV9sb2Nrb3duZXIgKnJsb2Nrb3duZXIpCiB7CiAJY2xpZW50aWRfdCAqY2xpZCA9ICZybG9ja293bmVyLT5ybF9jbGllbnRpZDsKQEAgLTI5NzQsNyArMjk3Nyw3IEBACiAJc3RydWN0IHhkcl9uZXRvYmogKm93bmVyID0gJnJsb2Nrb3duZXItPnJsX293bmVyOwogCXN0cnVjdCBsaXN0X2hlYWQgbWF0Y2hlczsKIAlpbnQgaTsKLQlpbnQgc3RhdHVzOworCV9fYmUzMiBzdGF0dXM7CiAKIAlkcHJpbnRrKCJuZnNkNF9yZWxlYXNlX2xvY2tvd25lciBjbGllbnRpZDogKCUwOHgvJTA4eCk6XG4iLAogCQljbGlkLT5jbF9ib290LCBjbGlkLT5jbF9pZCk7CkBAIC0zMTExLDcgKzMxMTQsNyBAQAogLyoKICogQ2FsbGVkIGZyb20gT1BFTi4gTG9vayBmb3IgY2xpZW50aWQgaW4gcmVjbGFpbSBsaXN0LgogKi8KLWludAorX19iZTMyCiBuZnM0X2NoZWNrX29wZW5fcmVjbGFpbShjbGllbnRpZF90ICpjbGlkKQogewogCXJldHVybiBuZnM0X2ZpbmRfcmVjbGFpbV9jbGllbnQoY2xpZCkgPyBuZnNfb2sgOiBuZnNlcnJfcmVjbGFpbV9iYWQ7CmRpZmYgLS1naXQgYS9mcy9uZnNkL25mczR4ZHIuYyBiL2ZzL25mc2QvbmZzNHhkci5jCmluZGV4IDQxZmMyNDEuLmYzZjIzOWQgMTAwNjQ0Ci0tLSBhL2ZzL25mc2QvbmZzNHhkci5jCisrKyBiL2ZzL25mc2QvbmZzNHhkci5jCkBAIC02OCw4ICs2OCw4IEBACiAjZGVmaW5lIE5GUzRfUkVGRVJSQUxfRlNJRF9NQUpPUgkweDgwMDAwMDBVTEwKICNkZWZpbmUgTkZTNF9SRUZFUlJBTF9GU0lEX01JTk9SCTB4ODAwMDAwMFVMTAogCi1zdGF0aWMgaW50Ci1jaGVja19maWxlbmFtZShjaGFyICpzdHIsIGludCBsZW4sIGludCBlcnIpCitzdGF0aWMgX19iZTMyCitjaGVja19maWxlbmFtZShjaGFyICpzdHIsIGludCBsZW4sIF9fYmUzMiBlcnIpCiB7CiAJaW50IGk7CiAKQEAgLTk0LDggKzk0LDggQEAKICAqIGNvbnNpc3RlbnQgd2l0aCB0aGUgc3R5bGUgdXNlZCBpbiBORlN2Mi92My4uLgogICovCiAjZGVmaW5lIERFQ09ERV9IRUFECQkJCVwKLQl1MzIgKnA7CQkJCQlcCi0JaW50IHN0YXR1cworCV9fYmUzMiAqcDsJCQkJXAorCV9fYmUzMiBzdGF0dXMKICNkZWZpbmUgREVDT0RFX1RBSUwJCQkJXAogCXN0YXR1cyA9IDA7CQkJCVwKIG91dDoJCQkJCQlcCkBAIC0xNDQsMTMgKzE0NCwxMyBAQAogCX0JCQkJCVwKIH0gd2hpbGUgKDApCiAKLXN0YXRpYyB1MzIgKnJlYWRfYnVmKHN0cnVjdCBuZnNkNF9jb21wb3VuZGFyZ3MgKmFyZ3AsIGludCBuYnl0ZXMpCitzdGF0aWMgX19iZTMyICpyZWFkX2J1ZihzdHJ1Y3QgbmZzZDRfY29tcG91bmRhcmdzICphcmdwLCBpbnQgbmJ5dGVzKQogewogCS8qIFdlIHdhbnQgbW9yZSBieXRlcyB0aGFuIHNlZW0gdG8gYmUgYXZhaWxhYmxlLgogCSAqIE1heWJlIHdlIG5lZWQgYSBuZXcgcGFnZSwgbWF5YmUgd2UgaGF2ZSBqdXN0IHJ1biBvdXQKIAkgKi8KIAlpbnQgYXZhaWwgPSAoY2hhciopYXJncC0+ZW5kIC0gKGNoYXIqKWFyZ3AtPnA7Ci0JdTMyICpwOworCV9fYmUzMiAqcDsKIAlpZiAoYXZhaWwgKyBhcmdwLT5wYWdlbGVuIDwgbmJ5dGVzKQogCQlyZXR1cm4gTlVMTDsKIAlpZiAoYXZhaWwgKyBQQUdFX1NJWkUgPCBuYnl0ZXMpIC8qIG5lZWQgbW9yZSB0aGFuIGEgcGFnZSAhISAqLwpAQCAtMTk3LDcgKzE5Nyw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBjaGFyICpzYXZlbWVtKHN0cnVjdCBuZnNkNF9jb21wb3VuZGFyZ3MgKmFyZ3AsIHUzMiAqcCwgaW50IG5ieXRlcykKK3N0YXRpYyBjaGFyICpzYXZlbWVtKHN0cnVjdCBuZnNkNF9jb21wb3VuZGFyZ3MgKmFyZ3AsIF9fYmUzMiAqcCwgaW50IG5ieXRlcykKIHsKIAl2b2lkICpuZXcgPSBOVUxMOwogCWlmIChwID09IGFyZ3AtPnRtcCkgewpAQCAtMjE3LDcgKzIxNyw3IEBACiB9CiAKIAotc3RhdGljIGludAorc3RhdGljIF9fYmUzMgogbmZzZDRfZGVjb2RlX2JpdG1hcChzdHJ1Y3QgbmZzZDRfY29tcG91bmRhcmdzICphcmdwLCB1MzIgKmJtdmFsKQogewogCXUzMiBibWxlbjsKQEAgLTI0MCwxMyArMjQwLDE0IEBACiAJREVDT0RFX1RBSUw7CiB9CiAKLXN0YXRpYyBpbnQKK3N0YXRpYyBfX2JlMzIKIG5mc2Q0X2RlY29kZV9mYXR0cihzdHJ1Y3QgbmZzZDRfY29tcG91bmRhcmdzICphcmdwLCB1MzIgKmJtdmFsLCBzdHJ1Y3QgaWF0dHIgKmlhdHRyLAogICAgIHN0cnVjdCBuZnM0X2FjbCAqKmFjbCkKIHsKIAlpbnQgZXhwZWN0ZWRfbGVuLCBsZW4gPSAwOwogCXUzMiBkdW1teTMyOwogCWNoYXIgKmJ1ZjsKKwlpbnQgaG9zdF9lcnI7CiAKIAlERUNPREVfSEVBRDsKIAlpYXR0ci0+aWFfdmFsaWQgPSAwOwpAQCAtMjgwLDcgKzI4MSw3IEBACiAKIAkJKmFjbCA9IG5mczRfYWNsX25ldygpOwogCQlpZiAoKmFjbCA9PSBOVUxMKSB7Ci0JCQlzdGF0dXMgPSAtRU5PTUVNOworCQkJaG9zdF9lcnIgPSAtRU5PTUVNOwogCQkJZ290byBvdXRfbmZzZXJyOwogCQl9CiAJCWRlZmVyX2ZyZWUoYXJncCwgKHZvaWQgKCopKGNvbnN0IHZvaWQgKikpbmZzNF9hY2xfZnJlZSwgKmFjbCk7CkBAIC0yOTUsMjAgKzI5NiwyMCBAQAogCQkJbGVuICs9IFhEUl9RVUFETEVOKGR1bW15MzIpIDw8IDI7CiAJCQlSRUFETUVNKGJ1ZiwgZHVtbXkzMik7CiAJCQlhY2Uud2hvdHlwZSA9IG5mczRfYWNsX2dldF93aG90eXBlKGJ1ZiwgZHVtbXkzMik7Ci0JCQlzdGF0dXMgPSAwOworCQkJaG9zdF9lcnIgPSAwOwogCQkJaWYgKGFjZS53aG90eXBlICE9IE5GUzRfQUNMX1dIT19OQU1FRCkKIAkJCQlhY2Uud2hvID0gMDsKIAkJCWVsc2UgaWYgKGFjZS5mbGFnICYgTkZTNF9BQ0VfSURFTlRJRklFUl9HUk9VUCkKLQkJCQlzdGF0dXMgPSBuZnNkX21hcF9uYW1lX3RvX2dpZChhcmdwLT5ycXN0cCwKKwkJCQlob3N0X2VyciA9IG5mc2RfbWFwX25hbWVfdG9fZ2lkKGFyZ3AtPnJxc3RwLAogCQkJCQkJYnVmLCBkdW1teTMyLCAmYWNlLndobyk7CiAJCQllbHNlCi0JCQkJc3RhdHVzID0gbmZzZF9tYXBfbmFtZV90b191aWQoYXJncC0+cnFzdHAsCisJCQkJaG9zdF9lcnIgPSBuZnNkX21hcF9uYW1lX3RvX3VpZChhcmdwLT5ycXN0cCwKIAkJCQkJCWJ1ZiwgZHVtbXkzMiwgJmFjZS53aG8pOwotCQkJaWYgKHN0YXR1cykKKwkJCWlmIChob3N0X2VycikKIAkJCQlnb3RvIG91dF9uZnNlcnI7Ci0JCQlzdGF0dXMgPSBuZnM0X2FjbF9hZGRfYWNlKCphY2wsIGFjZS50eXBlLCBhY2UuZmxhZywKKwkJCWhvc3RfZXJyID0gbmZzNF9hY2xfYWRkX2FjZSgqYWNsLCBhY2UudHlwZSwgYWNlLmZsYWcsCiAJCQkJIGFjZS5hY2Nlc3NfbWFzaywgYWNlLndob3R5cGUsIGFjZS53aG8pOwotCQkJaWYgKHN0YXR1cykKKwkJCWlmIChob3N0X2VycikKIAkJCQlnb3RvIG91dF9uZnNlcnI7CiAJCX0KIAl9IGVsc2UKQEAgLTMyNyw3ICszMjgsNyBAQAogCQlSRUFEX0JVRihkdW1teTMyKTsKIAkJbGVuICs9IChYRFJfUVVBRExFTihkdW1teTMyKSA8PCAyKTsKIAkJUkVBRE1FTShidWYsIGR1bW15MzIpOwotCQlpZiAoKHN0YXR1cyA9IG5mc2RfbWFwX25hbWVfdG9fdWlkKGFyZ3AtPnJxc3RwLCBidWYsIGR1bW15MzIsICZpYXR0ci0+aWFfdWlkKSkpCisJCWlmICgoaG9zdF9lcnIgPSBuZnNkX21hcF9uYW1lX3RvX3VpZChhcmdwLT5ycXN0cCwgYnVmLCBkdW1teTMyLCAmaWF0dHItPmlhX3VpZCkpKQogCQkJZ290byBvdXRfbmZzZXJyOwogCQlpYXR0ci0+aWFfdmFsaWQgfD0gQVRUUl9VSUQ7CiAJfQpAQCAtMzM4LDcgKzMzOSw3IEBACiAJCVJFQURfQlVGKGR1bW15MzIpOwogCQlsZW4gKz0gKFhEUl9RVUFETEVOKGR1bW15MzIpIDw8IDIpOwogCQlSRUFETUVNKGJ1ZiwgZHVtbXkzMik7Ci0JCWlmICgoc3RhdHVzID0gbmZzZF9tYXBfbmFtZV90b19naWQoYXJncC0+cnFzdHAsIGJ1ZiwgZHVtbXkzMiwgJmlhdHRyLT5pYV9naWQpKSkKKwkJaWYgKChob3N0X2VyciA9IG5mc2RfbWFwX25hbWVfdG9fZ2lkKGFyZ3AtPnJxc3RwLCBidWYsIGR1bW15MzIsICZpYXR0ci0+aWFfZ2lkKSkpCiAJCQlnb3RvIG91dF9uZnNlcnI7CiAJCWlhdHRyLT5pYV92YWxpZCB8PSBBVFRSX0dJRDsKIAl9CkBAIC00MTQsMTEgKzQxNSwxMSBAQAogCURFQ09ERV9UQUlMOwogCiBvdXRfbmZzZXJyOgotCXN0YXR1cyA9IG5mc2Vycm5vKHN0YXR1cyk7CisJc3RhdHVzID0gbmZzZXJybm8oaG9zdF9lcnIpOwogCWdvdG8gb3V0OwogfQogCi1zdGF0aWMgaW50CitzdGF0aWMgX19iZTMyCiBuZnNkNF9kZWNvZGVfYWNjZXNzKHN0cnVjdCBuZnNkNF9jb21wb3VuZGFyZ3MgKmFyZ3AsIHN0cnVjdCBuZnNkNF9hY2Nlc3MgKmFjY2VzcykKIHsKIAlERUNPREVfSEVBRDsKQEAgLTQyOSw3ICs0MzAsNyBAQAogCURFQ09ERV9UQUlMOwogfQogCi1zdGF0aWMgaW50CitzdGF0aWMgX19iZTMyCiBuZnNkNF9kZWNvZGVfY2xvc2Uoc3RydWN0IG5mc2Q0X2NvbXBvdW5kYXJncyAqYXJncCwgc3RydWN0IG5mc2Q0X2Nsb3NlICpjbG9zZSkKIHsKIAlERUNPREVfSEVBRDsKQEAgLTQ0NCw3ICs0NDUsNyBAQAogfQogCiAKLXN0YXRpYyBpbnQKK3N0YXRpYyBfX2JlMzIKIG5mc2Q0X2RlY29kZV9jb21taXQoc3RydWN0IG5mc2Q0X2NvbXBvdW5kYXJncyAqYXJncCwgc3RydWN0IG5mc2Q0X2NvbW1pdCAqY29tbWl0KQogewogCURFQ09ERV9IRUFEOwpAQCAtNDU2LDcgKzQ1Nyw3IEBACiAJREVDT0RFX1RBSUw7CiB9CiAKLXN0YXRpYyBpbnQKK3N0YXRpYyBfX2JlMzIKIG5mc2Q0X2RlY29kZV9jcmVhdGUoc3RydWN0IG5mc2Q0X2NvbXBvdW5kYXJncyAqYXJncCwgc3RydWN0IG5mc2Q0X2NyZWF0ZSAqY3JlYXRlKQogewogCURFQ09ERV9IRUFEOwpAQCAtNDk2LDcgKzQ5Nyw3IEBACiAJREVDT0RFX1RBSUw7CiB9CiAKLXN0YXRpYyBpbmxpbmUgaW50CitzdGF0aWMgaW5saW5lIF9fYmUzMgogbmZzZDRfZGVjb2RlX2RlbGVncmV0dXJuKHN0cnVjdCBuZnNkNF9jb21wb3VuZGFyZ3MgKmFyZ3AsIHN0cnVjdCBuZnNkNF9kZWxlZ3JldHVybiAqZHIpCiB7CiAJREVDT0RFX0hFQUQ7CkBAIC01MDgsMTMgKzUwOSwxMyBAQAogCURFQ09ERV9UQUlMOwogfQogCi1zdGF0aWMgaW5saW5lIGludAorc3RhdGljIGlubGluZSBfX2JlMzIKIG5mc2Q0X2RlY29kZV9nZXRhdHRyKHN0cnVjdCBuZnNkNF9jb21wb3VuZGFyZ3MgKmFyZ3AsIHN0cnVjdCBuZnNkNF9nZXRhdHRyICpnZXRhdHRyKQogewogCXJldHVybiBuZnNkNF9kZWNvZGVfYml0bWFwKGFyZ3AsIGdldGF0dHItPmdhX2JtdmFsKTsKIH0KIAotc3RhdGljIGludAorc3RhdGljIF9fYmUzMgogbmZzZDRfZGVjb2RlX2xpbmsoc3RydWN0IG5mc2Q0X2NvbXBvdW5kYXJncyAqYXJncCwgc3RydWN0IG5mc2Q0X2xpbmsgKmxpbmspCiB7CiAJREVDT0RFX0hFQUQ7CkBAIC01MjksNyArNTMwLDcgQEAKIAlERUNPREVfVEFJTDsKIH0KIAotc3RhdGljIGludAorc3RhdGljIF9fYmUzMgogbmZzZDRfZGVjb2RlX2xvY2soc3RydWN0IG5mc2Q0X2NvbXBvdW5kYXJncyAqYXJncCwgc3RydWN0IG5mc2Q0X2xvY2sgKmxvY2spCiB7CiAJREVDT0RFX0hFQUQ7CkBAIC01NjgsNyArNTY5LDcgQEAKIAlERUNPREVfVEFJTDsKIH0KIAotc3RhdGljIGludAorc3RhdGljIF9fYmUzMgogbmZzZDRfZGVjb2RlX2xvY2t0KHN0cnVjdCBuZnNkNF9jb21wb3VuZGFyZ3MgKmFyZ3AsIHN0cnVjdCBuZnNkNF9sb2NrdCAqbG9ja3QpCiB7CiAJREVDT0RFX0hFQUQ7CkBAIC01ODcsNyArNTg4LDcgQEAKIAlERUNPREVfVEFJTDsKIH0KIAotc3RhdGljIGludAorc3RhdGljIF9fYmUzMgogbmZzZDRfZGVjb2RlX2xvY2t1KHN0cnVjdCBuZnNkNF9jb21wb3VuZGFyZ3MgKmFyZ3AsIHN0cnVjdCBuZnNkNF9sb2NrdSAqbG9ja3UpCiB7CiAJREVDT0RFX0hFQUQ7CkBAIC02MDYsNyArNjA3LDcgQEAKIAlERUNPREVfVEFJTDsKIH0KIAotc3RhdGljIGludAorc3RhdGljIF9fYmUzMgogbmZzZDRfZGVjb2RlX2xvb2t1cChzdHJ1Y3QgbmZzZDRfY29tcG91bmRhcmdzICphcmdwLCBzdHJ1Y3QgbmZzZDRfbG9va3VwICpsb29rdXApCiB7CiAJREVDT0RFX0hFQUQ7CkBAIC02MjEsNyArNjIyLDcgQEAKIAlERUNPREVfVEFJTDsKIH0KIAotc3RhdGljIGludAorc3RhdGljIF9fYmUzMgogbmZzZDRfZGVjb2RlX29wZW4oc3RydWN0IG5mc2Q0X2NvbXBvdW5kYXJncyAqYXJncCwgc3RydWN0IG5mc2Q0X29wZW4gKm9wZW4pCiB7CiAJREVDT0RFX0hFQUQ7CkBAIC02OTksNyArNzAwLDcgQEAKIAlERUNPREVfVEFJTDsKIH0KIAotc3RhdGljIGludAorc3RhdGljIF9fYmUzMgogbmZzZDRfZGVjb2RlX29wZW5fY29uZmlybShzdHJ1Y3QgbmZzZDRfY29tcG91bmRhcmdzICphcmdwLCBzdHJ1Y3QgbmZzZDRfb3Blbl9jb25maXJtICpvcGVuX2NvbmYpCiB7CiAJREVDT0RFX0hFQUQ7CkBAIC03MTMsNyArNzE0LDcgQEAKIAlERUNPREVfVEFJTDsKIH0KIAotc3RhdGljIGludAorc3RhdGljIF9fYmUzMgogbmZzZDRfZGVjb2RlX29wZW5fZG93bmdyYWRlKHN0cnVjdCBuZnNkNF9jb21wb3VuZGFyZ3MgKmFyZ3AsIHN0cnVjdCBuZnNkNF9vcGVuX2Rvd25ncmFkZSAqb3Blbl9kb3duKQogewogCURFQ09ERV9IRUFEOwpAQCAtNzI5LDcgKzczMCw3IEBACiAJREVDT0RFX1RBSUw7CiB9CiAKLXN0YXRpYyBpbnQKK3N0YXRpYyBfX2JlMzIKIG5mc2Q0X2RlY29kZV9wdXRmaChzdHJ1Y3QgbmZzZDRfY29tcG91bmRhcmdzICphcmdwLCBzdHJ1Y3QgbmZzZDRfcHV0ZmggKnB1dGZoKQogewogCURFQ09ERV9IRUFEOwpAQCAtNzQ0LDcgKzc0NSw3IEBACiAJREVDT0RFX1RBSUw7CiB9CiAKLXN0YXRpYyBpbnQKK3N0YXRpYyBfX2JlMzIKIG5mc2Q0X2RlY29kZV9yZWFkKHN0cnVjdCBuZnNkNF9jb21wb3VuZGFyZ3MgKmFyZ3AsIHN0cnVjdCBuZnNkNF9yZWFkICpyZWFkKQogewogCURFQ09ERV9IRUFEOwpAQCAtNzU4LDcgKzc1OSw3IEBACiAJREVDT0RFX1RBSUw7CiB9CiAKLXN0YXRpYyBpbnQKK3N0YXRpYyBfX2JlMzIKIG5mc2Q0X2RlY29kZV9yZWFkZGlyKHN0cnVjdCBuZnNkNF9jb21wb3VuZGFyZ3MgKmFyZ3AsIHN0cnVjdCBuZnNkNF9yZWFkZGlyICpyZWFkZGlyKQogewogCURFQ09ERV9IRUFEOwpAQCAtNzc0LDcgKzc3NSw3IEBACiAJREVDT0RFX1RBSUw7CiB9CiAKLXN0YXRpYyBpbnQKK3N0YXRpYyBfX2JlMzIKIG5mc2Q0X2RlY29kZV9yZW1vdmUoc3RydWN0IG5mc2Q0X2NvbXBvdW5kYXJncyAqYXJncCwgc3RydWN0IG5mc2Q0X3JlbW92ZSAqcmVtb3ZlKQogewogCURFQ09ERV9IRUFEOwpAQCAtNzg5LDcgKzc5MCw3IEBACiAJREVDT0RFX1RBSUw7CiB9CiAKLXN0YXRpYyBpbnQKK3N0YXRpYyBfX2JlMzIKIG5mc2Q0X2RlY29kZV9yZW5hbWUoc3RydWN0IG5mc2Q0X2NvbXBvdW5kYXJncyAqYXJncCwgc3RydWN0IG5mc2Q0X3JlbmFtZSAqcmVuYW1lKQogewogCURFQ09ERV9IRUFEOwpAQCAtODA5LDcgKzgxMCw3IEBACiAJREVDT0RFX1RBSUw7CiB9CiAKLXN0YXRpYyBpbnQKK3N0YXRpYyBfX2JlMzIKIG5mc2Q0X2RlY29kZV9yZW5ldyhzdHJ1Y3QgbmZzZDRfY29tcG91bmRhcmdzICphcmdwLCBjbGllbnRpZF90ICpjbGllbnRpZCkKIHsKIAlERUNPREVfSEVBRDsKQEAgLTgyMCw3ICs4MjEsNyBAQAogCURFQ09ERV9UQUlMOwogfQogCi1zdGF0aWMgaW50CitzdGF0aWMgX19iZTMyCiBuZnNkNF9kZWNvZGVfc2V0YXR0cihzdHJ1Y3QgbmZzZDRfY29tcG91bmRhcmdzICphcmdwLCBzdHJ1Y3QgbmZzZDRfc2V0YXR0ciAqc2V0YXR0cikKIHsKIAlERUNPREVfSEVBRDsKQEAgLTgzNCw3ICs4MzUsNyBAQAogCURFQ09ERV9UQUlMOwogfQogCi1zdGF0aWMgaW50CitzdGF0aWMgX19iZTMyCiBuZnNkNF9kZWNvZGVfc2V0Y2xpZW50aWQoc3RydWN0IG5mc2Q0X2NvbXBvdW5kYXJncyAqYXJncCwgc3RydWN0IG5mc2Q0X3NldGNsaWVudGlkICpzZXRjbGllbnRpZCkKIHsKIAlERUNPREVfSEVBRDsKQEAgLTg1OSw3ICs4NjAsNyBAQAogCURFQ09ERV9UQUlMOwogfQogCi1zdGF0aWMgaW50CitzdGF0aWMgX19iZTMyCiBuZnNkNF9kZWNvZGVfc2V0Y2xpZW50aWRfY29uZmlybShzdHJ1Y3QgbmZzZDRfY29tcG91bmRhcmdzICphcmdwLCBzdHJ1Y3QgbmZzZDRfc2V0Y2xpZW50aWRfY29uZmlybSAqc2NkX2MpCiB7CiAJREVDT0RFX0hFQUQ7CkBAIC04NzIsNyArODczLDcgQEAKIH0KIAogLyogQWxzbyB1c2VkIGZvciBOVkVSSUZZICovCi1zdGF0aWMgaW50CitzdGF0aWMgX19iZTMyCiBuZnNkNF9kZWNvZGVfdmVyaWZ5KHN0cnVjdCBuZnNkNF9jb21wb3VuZGFyZ3MgKmFyZ3AsIHN0cnVjdCBuZnNkNF92ZXJpZnkgKnZlcmlmeSkKIHsKICNpZiAwCkBAIC05MDgsNyArOTA5LDcgQEAKIAlERUNPREVfVEFJTDsKIH0KIAotc3RhdGljIGludAorc3RhdGljIF9fYmUzMgogbmZzZDRfZGVjb2RlX3dyaXRlKHN0cnVjdCBuZnNkNF9jb21wb3VuZGFyZ3MgKmFyZ3AsIHN0cnVjdCBuZnNkNF93cml0ZSAqd3JpdGUpCiB7CiAJaW50IGF2YWlsOwpAQCAtOTUxLDE1ICs5NTIsMTUgQEAKIAkJCWFyZ3AtPnBhZ2VsZW4gLT0gbGVuOwogCQl9CiAJfQotCWFyZ3AtPmVuZCA9ICh1MzIqKSAoYXJncC0+cnFzdHAtPnJxX3ZlY1t2XS5pb3ZfYmFzZSArIGFyZ3AtPnJxc3RwLT5ycV92ZWNbdl0uaW92X2xlbik7Ci0JYXJncC0+cCA9ICh1MzIqKSAgKGFyZ3AtPnJxc3RwLT5ycV92ZWNbdl0uaW92X2Jhc2UgKyAoWERSX1FVQURMRU4obGVuKSA8PCAyKSk7CisJYXJncC0+ZW5kID0gKF9fYmUzMiopIChhcmdwLT5ycXN0cC0+cnFfdmVjW3ZdLmlvdl9iYXNlICsgYXJncC0+cnFzdHAtPnJxX3ZlY1t2XS5pb3ZfbGVuKTsKKwlhcmdwLT5wID0gKF9fYmUzMiopICAoYXJncC0+cnFzdHAtPnJxX3ZlY1t2XS5pb3ZfYmFzZSArIChYRFJfUVVBRExFTihsZW4pIDw8IDIpKTsKIAlhcmdwLT5ycXN0cC0+cnFfdmVjW3ZdLmlvdl9sZW4gPSBsZW47CiAJd3JpdGUtPndyX3ZsZW4gPSB2KzE7CiAKIAlERUNPREVfVEFJTDsKIH0KIAotc3RhdGljIGludAorc3RhdGljIF9fYmUzMgogbmZzZDRfZGVjb2RlX3JlbGVhc2VfbG9ja293bmVyKHN0cnVjdCBuZnNkNF9jb21wb3VuZGFyZ3MgKmFyZ3AsIHN0cnVjdCBuZnNkNF9yZWxlYXNlX2xvY2tvd25lciAqcmxvY2tvd25lcikKIHsKIAlERUNPREVfSEVBRDsKQEAgLTk3Myw3ICs5NzQsNyBAQAogCURFQ09ERV9UQUlMOwogfQogCi1zdGF0aWMgaW50CitzdGF0aWMgX19iZTMyCiBuZnNkNF9kZWNvZGVfY29tcG91bmQoc3RydWN0IG5mc2Q0X2NvbXBvdW5kYXJncyAqYXJncCkKIHsKIAlERUNPREVfSEVBRDsKQEAgLTExNzksNyArMTE4MCw3IEBACiAgKiB0YXNrIHRvIHRyYW5zbGF0ZSB0aGVtIGludG8gTGludXgtc3BlY2lmaWMgdmVyc2lvbnMgd2hpY2ggYXJlIG1vcmUKICAqIGNvbnNpc3RlbnQgd2l0aCB0aGUgc3R5bGUgdXNlZCBpbiBORlN2Mi92My4uLgogICovCi0jZGVmaW5lIEVOQ09ERV9IRUFEICAgICAgICAgICAgICB1MzIgKnAKKyNkZWZpbmUgRU5DT0RFX0hFQUQgICAgICAgICAgICAgIF9fYmUzMiAqcAogCiAjZGVmaW5lIFdSSVRFMzIobikgICAgICAgICAgICAgICAqcCsrID0gaHRvbmwobikKICNkZWZpbmUgV1JJVEU2NChuKSAgICAgICAgICAgICAgIGRvIHsJCQkJXApAQCAtMTIwOSw4ICsxMjEwLDggQEAKICAqIEhlYWRlciByb3V0aW5lIHRvIHNldHVwIHNlcWlkIG9wZXJhdGlvbiByZXBsYXkgY2FjaGUKICAqLwogI2RlZmluZSBFTkNPREVfU0VRSURfT1BfSEVBRAkJCQkJXAotCXUzMiAqcDsJCQkJCQkJXAotCXUzMiAqc2F2ZTsJCQkJCQlcCisJX19iZTMyICpwOwkJCQkJCVwKKwlfX2JlMzIgKnNhdmU7CQkJCQkJXAogCQkJCQkJCQlcCiAJc2F2ZSA9IHJlc3AtPnA7CiAKQEAgLTEyMzQsMTEgKzEyMzUsMTEgQEAKIC8qIEVuY29kZSBhcyBhbiBhcnJheSBvZiBzdHJpbmdzIHRoZSBzdHJpbmcgZ2l2ZW4gd2l0aCBjb21wb25lbnRzCiAgKiBzZXBlcmF0ZWQgQHNlcC4KICAqLwotc3RhdGljIGludCBuZnNkNF9lbmNvZGVfY29tcG9uZW50cyhjaGFyIHNlcCwgY2hhciAqY29tcG9uZW50cywKLQkJCQkgICB1MzIgKipwcCwgaW50ICpidWZsZW4pCitzdGF0aWMgX19iZTMyIG5mc2Q0X2VuY29kZV9jb21wb25lbnRzKGNoYXIgc2VwLCBjaGFyICpjb21wb25lbnRzLAorCQkJCSAgIF9fYmUzMiAqKnBwLCBpbnQgKmJ1ZmxlbikKIHsKLQl1MzIgKnAgPSAqcHA7Ci0JdTMyICpjb3VudHAgPSBwOworCV9fYmUzMiAqcCA9ICpwcDsKKwlfX2JlMzIgKmNvdW50cCA9IHA7CiAJaW50IHN0cmxlbiwgY291bnQ9MDsKIAljaGFyICpzdHIsICplbmQ7CiAKQEAgLTEyNzEsMTEgKzEyNzIsMTEgQEAKIC8qCiAgKiBlbmNvZGUgYSBsb2NhdGlvbiBlbGVtZW50IG9mIGEgZnNfbG9jYXRpb25zIHN0cnVjdHVyZQogICovCi1zdGF0aWMgaW50IG5mc2Q0X2VuY29kZV9mc19sb2NhdGlvbjQoc3RydWN0IG5mc2Q0X2ZzX2xvY2F0aW9uICpsb2NhdGlvbiwKLQkJCQkgICAgdTMyICoqcHAsIGludCAqYnVmbGVuKQorc3RhdGljIF9fYmUzMiBuZnNkNF9lbmNvZGVfZnNfbG9jYXRpb240KHN0cnVjdCBuZnNkNF9mc19sb2NhdGlvbiAqbG9jYXRpb24sCisJCQkJICAgIF9fYmUzMiAqKnBwLCBpbnQgKmJ1ZmxlbikKIHsKLQlpbnQgc3RhdHVzOwotCXUzMiAqcCA9ICpwcDsKKwlfX2JlMzIgc3RhdHVzOworCV9fYmUzMiAqcCA9ICpwcDsKIAogCXN0YXR1cyA9IG5mc2Q0X2VuY29kZV9jb21wb25lbnRzKCc6JywgbG9jYXRpb24tPmhvc3RzLCAmcCwgYnVmbGVuKTsKIAlpZiAoc3RhdHVzKQpAQCAtMTI5MiwxNiArMTI5MywxNSBAQAogICogUmV0dXJuZWQgc3RyaW5nIGlzIHNhZmUgdG8gdXNlIGFzIGxvbmcgYXMgdGhlIGNhbGxlciBob2xkcyBhIHJlZmVyZW5jZQogICogdG8gQGV4cC4KICAqLwotc3RhdGljIGNoYXIgKm5mc2Q0X3BhdGgoc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgc3RydWN0IHN2Y19leHBvcnQgKmV4cCkKK3N0YXRpYyBjaGFyICpuZnNkNF9wYXRoKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHN0cnVjdCBzdmNfZXhwb3J0ICpleHAsIF9fYmUzMiAqc3RhdCkKIHsKIAlzdHJ1Y3Qgc3ZjX2ZoIHRtcF9maDsKIAljaGFyICpwYXRoLCAqcm9vdHBhdGg7Ci0JaW50IHN0YXQ7CiAKIAlmaF9pbml0KCZ0bXBfZmgsIE5GUzRfRkhTSVpFKTsKLQlzdGF0ID0gZXhwX3BzZXVkb3Jvb3QocnFzdHAtPnJxX2NsaWVudCwgJnRtcF9maCwgJnJxc3RwLT5ycV9jaGFuZGxlKTsKLQlpZiAoc3RhdCkKLQkJcmV0dXJuIEVSUl9QVFIoc3RhdCk7CisJKnN0YXQgPSBleHBfcHNldWRvcm9vdChycXN0cC0+cnFfY2xpZW50LCAmdG1wX2ZoLCAmcnFzdHAtPnJxX2NoYW5kbGUpOworCWlmICgqc3RhdCkKKwkJcmV0dXJuIE5VTEw7CiAJcm9vdHBhdGggPSB0bXBfZmguZmhfZXhwb3J0LT5leF9wYXRoOwogCiAJcGF0aCA9IGV4cC0+ZXhfcGF0aDsKQEAgLTEzMDksNyArMTMwOSw4IEBACiAJaWYgKHN0cm5jbXAocGF0aCwgcm9vdHBhdGgsIHN0cmxlbihyb290cGF0aCkpKSB7CiAJCXByaW50aygibmZzZDogZnNfbG9jYXRpb25zIGZhaWxlZDsiCiAJCQkiJXMgaXMgbm90IGNvbnRhaW5lZCBpbiAlc1xuIiwgcGF0aCwgcm9vdHBhdGgpOwotCQlyZXR1cm4gRVJSX1BUUigtRU9QTk9UU1VQUCk7CisJCSpzdGF0ID0gbmZzZXJyX25vdHN1cHA7CisJCXJldHVybiBOVUxMOwogCX0KIAogCXJldHVybiBwYXRoICsgc3RybGVuKHJvb3RwYXRoKTsKQEAgLTEzMTgsMTcgKzEzMTksMTggQEAKIC8qCiAgKiAgZW5jb2RlIGEgZnNfbG9jYXRpb25zIHN0cnVjdHVyZQogICovCi1zdGF0aWMgaW50IG5mc2Q0X2VuY29kZV9mc19sb2NhdGlvbnMoc3RydWN0IHN2Y19ycXN0ICpycXN0cCwKK3N0YXRpYyBfX2JlMzIgbmZzZDRfZW5jb2RlX2ZzX2xvY2F0aW9ucyhzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLAogCQkJCSAgICAgc3RydWN0IHN2Y19leHBvcnQgKmV4cCwKLQkJCQkgICAgIHUzMiAqKnBwLCBpbnQgKmJ1ZmxlbikKKwkJCQkgICAgIF9fYmUzMiAqKnBwLCBpbnQgKmJ1ZmxlbikKIHsKLQlpbnQgc3RhdHVzLCBpOwotCXUzMiAqcCA9ICpwcDsKKwlfX2JlMzIgc3RhdHVzOworCWludCBpOworCV9fYmUzMiAqcCA9ICpwcDsKIAlzdHJ1Y3QgbmZzZDRfZnNfbG9jYXRpb25zICpmc2xvY3MgPSAmZXhwLT5leF9mc2xvY3M7Ci0JY2hhciAqcm9vdCA9IG5mc2Q0X3BhdGgocnFzdHAsIGV4cCk7CisJY2hhciAqcm9vdCA9IG5mc2Q0X3BhdGgocnFzdHAsIGV4cCwgJnN0YXR1cyk7CiAKLQlpZiAoSVNfRVJSKHJvb3QpKQotCQlyZXR1cm4gUFRSX0VSUihyb290KTsKKwlpZiAoc3RhdHVzKQorCQlyZXR1cm4gc3RhdHVzOwogCXN0YXR1cyA9IG5mc2Q0X2VuY29kZV9jb21wb25lbnRzKCcvJywgcm9vdCwgJnAsIGJ1Zmxlbik7CiAJaWYgKHN0YXR1cykKIAkJcmV0dXJuIHN0YXR1czsKQEAgLTEzNTIsOSArMTM1NCw5IEBACiAgICAgICAgIE5GNFNPQ0ssIE5GNEJBRCwgIE5GNExOSywgTkY0QkFELAogfTsKIAotc3RhdGljIGludAorc3RhdGljIF9fYmUzMgogbmZzZDRfZW5jb2RlX25hbWUoc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgaW50IHdob3R5cGUsIHVpZF90IGlkLCBpbnQgZ3JvdXAsCi0JCQl1MzIgKipwLCBpbnQgKmJ1ZmxlbikKKwkJCV9fYmUzMiAqKnAsIGludCAqYnVmbGVuKQogewogCWludCBzdGF0dXM7CiAKQEAgLTEzNzQsMjEgKzEzNzYsMjEgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGlubGluZSBpbnQKLW5mc2Q0X2VuY29kZV91c2VyKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHVpZF90IHVpZCwgdTMyICoqcCwgaW50ICpidWZsZW4pCitzdGF0aWMgaW5saW5lIF9fYmUzMgorbmZzZDRfZW5jb2RlX3VzZXIoc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgdWlkX3QgdWlkLCBfX2JlMzIgKipwLCBpbnQgKmJ1ZmxlbikKIHsKIAlyZXR1cm4gbmZzZDRfZW5jb2RlX25hbWUocnFzdHAsIE5GUzRfQUNMX1dIT19OQU1FRCwgdWlkLCAwLCBwLCBidWZsZW4pOwogfQogCi1zdGF0aWMgaW5saW5lIGludAotbmZzZDRfZW5jb2RlX2dyb3VwKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHVpZF90IGdpZCwgdTMyICoqcCwgaW50ICpidWZsZW4pCitzdGF0aWMgaW5saW5lIF9fYmUzMgorbmZzZDRfZW5jb2RlX2dyb3VwKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHVpZF90IGdpZCwgX19iZTMyICoqcCwgaW50ICpidWZsZW4pCiB7CiAJcmV0dXJuIG5mc2Q0X2VuY29kZV9uYW1lKHJxc3RwLCBORlM0X0FDTF9XSE9fTkFNRUQsIGdpZCwgMSwgcCwgYnVmbGVuKTsKIH0KIAotc3RhdGljIGlubGluZSBpbnQKK3N0YXRpYyBpbmxpbmUgX19iZTMyCiBuZnNkNF9lbmNvZGVfYWNsbmFtZShzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCBpbnQgd2hvdHlwZSwgdWlkX3QgaWQsIGludCBncm91cCwKLQkJdTMyICoqcCwgaW50ICpidWZsZW4pCisJCV9fYmUzMiAqKnAsIGludCAqYnVmbGVuKQogewogCXJldHVybiBuZnNkNF9lbmNvZGVfbmFtZShycXN0cCwgd2hvdHlwZSwgaWQsIGdyb3VwLCBwLCBidWZsZW4pOwogfQpAQCAtMTM5Nyw3ICsxMzk5LDcgQEAKIAkJCSAgICAgIEZBVFRSNF9XT1JEMF9SREFUVFJfRVJST1IpCiAjZGVmaW5lIFdPUkQxX0FCU0VOVF9GU19BVFRSUyBGQVRUUjRfV09SRDFfTU9VTlRFRF9PTl9GSUxFSUQKIAotc3RhdGljIGludCBmYXR0cl9oYW5kbGVfYWJzZW50X2ZzKHUzMiAqYm12YWwwLCB1MzIgKmJtdmFsMSwgdTMyICpyZGF0dHJfZXJyKQorc3RhdGljIF9fYmUzMiBmYXR0cl9oYW5kbGVfYWJzZW50X2ZzKHUzMiAqYm12YWwwLCB1MzIgKmJtdmFsMSwgdTMyICpyZGF0dHJfZXJyKQogewogCS8qIEFzIHBlciByZWZlcnJhbCBkcmFmdDogICovCiAJaWYgKCpibXZhbDAgJiB+V09SRDBfQUJTRU5UX0ZTX0FUVFJTIHx8CkBAIC0xNDIwLDkgKzE0MjIsOSBAQAogICogQGNvdW50cCBpcyB0aGUgYnVmZmVyIHNpemUgaW4gX3dvcmRzXzsgdXBvbiBzdWNjZXNzZnVsIHJldHVybiB0aGlzIGJlY29tZXMKICAqIHJlcGxhY2VkIHdpdGggdGhlIG51bWJlciBvZiB3b3JkcyB3cml0dGVuLgogICovCi1pbnQKK19fYmUzMgogbmZzZDRfZW5jb2RlX2ZhdHRyKHN0cnVjdCBzdmNfZmggKmZocCwgc3RydWN0IHN2Y19leHBvcnQgKmV4cCwKLQkJc3RydWN0IGRlbnRyeSAqZGVudHJ5LCB1MzIgKmJ1ZmZlciwgaW50ICpjb3VudHAsIHUzMiAqYm12YWwsCisJCXN0cnVjdCBkZW50cnkgKmRlbnRyeSwgX19iZTMyICpidWZmZXIsIGludCAqY291bnRwLCB1MzIgKmJtdmFsLAogCQlzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwKQogewogCXUzMiBibXZhbDAgPSBibXZhbFswXTsKQEAgLTE0MzEsMTIgKzE0MzMsMTMgQEAKIAlzdHJ1Y3Qgc3ZjX2ZoIHRlbXBmaDsKIAlzdHJ1Y3Qga3N0YXRmcyBzdGF0ZnM7CiAJaW50IGJ1ZmxlbiA9ICpjb3VudHAgPDwgMjsKLQl1MzIgKmF0dHJsZW5wOworCV9fYmUzMiAqYXR0cmxlbnA7CiAJdTMyIGR1bW15OwogCXU2NCBkdW1teTY0OwogCXUzMiByZGF0dHJfZXJyID0gMDsKLQl1MzIgKnAgPSBidWZmZXI7Ci0JaW50IHN0YXR1czsKKwlfX2JlMzIgKnAgPSBidWZmZXI7CisJX19iZTMyIHN0YXR1czsKKwlpbnQgZXJyOwogCWludCBhY2xzdXBwb3J0ID0gMDsKIAlzdHJ1Y3QgbmZzNF9hY2wgKmFjbCA9IE5VTEw7CiAKQEAgLTE0NTAsMTQgKzE0NTMsMTQgQEAKIAkJCWdvdG8gb3V0OwogCX0KIAotCXN0YXR1cyA9IHZmc19nZXRhdHRyKGV4cC0+ZXhfbW50LCBkZW50cnksICZzdGF0KTsKLQlpZiAoc3RhdHVzKQorCWVyciA9IHZmc19nZXRhdHRyKGV4cC0+ZXhfbW50LCBkZW50cnksICZzdGF0KTsKKwlpZiAoZXJyKQogCQlnb3RvIG91dF9uZnNlcnI7CiAJaWYgKChibXZhbDAgJiAoRkFUVFI0X1dPUkQwX0ZJTEVTX0ZSRUUgfCBGQVRUUjRfV09SRDBfRklMRVNfVE9UQUwpKSB8fAogCSAgICAoYm12YWwxICYgKEZBVFRSNF9XT1JEMV9TUEFDRV9BVkFJTCB8IEZBVFRSNF9XT1JEMV9TUEFDRV9GUkVFIHwKIAkJICAgICAgIEZBVFRSNF9XT1JEMV9TUEFDRV9UT1RBTCkpKSB7Ci0JCXN0YXR1cyA9IHZmc19zdGF0ZnMoZGVudHJ5LCAmc3RhdGZzKTsKLQkJaWYgKHN0YXR1cykKKwkJZXJyID0gdmZzX3N0YXRmcyhkZW50cnksICZzdGF0ZnMpOworCQlpZiAoZXJyKQogCQkJZ290byBvdXRfbmZzZXJyOwogCX0KIAlpZiAoKGJtdmFsMCAmIChGQVRUUjRfV09SRDBfRklMRUhBTkRMRSB8IEZBVFRSNF9XT1JEMF9GU0lEKSkgJiYgIWZocCkgewpAQCAtMTQ2OSwxNSArMTQ3MiwxNSBAQAogCX0KIAlpZiAoYm12YWwwICYgKEZBVFRSNF9XT1JEMF9BQ0wgfCBGQVRUUjRfV09SRDBfQUNMU1VQUE9SVAogCQkJfCBGQVRUUjRfV09SRDBfU1VQUE9SVEVEX0FUVFJTKSkgewotCQlzdGF0dXMgPSBuZnNkNF9nZXRfbmZzNF9hY2wocnFzdHAsIGRlbnRyeSwgJmFjbCk7Ci0JCWFjbHN1cHBvcnQgPSAoc3RhdHVzID09IDApOworCQllcnIgPSBuZnNkNF9nZXRfbmZzNF9hY2wocnFzdHAsIGRlbnRyeSwgJmFjbCk7CisJCWFjbHN1cHBvcnQgPSAoZXJyID09IDApOwogCQlpZiAoYm12YWwwICYgRkFUVFI0X1dPUkQwX0FDTCkgewotCQkJaWYgKHN0YXR1cyA9PSAtRU9QTk9UU1VQUCkKKwkJCWlmIChlcnIgPT0gLUVPUE5PVFNVUFApCiAJCQkJYm12YWwwICY9IH5GQVRUUjRfV09SRDBfQUNMOwotCQkJZWxzZSBpZiAoc3RhdHVzID09IC1FSU5WQUwpIHsKKwkJCWVsc2UgaWYgKGVyciA9PSAtRUlOVkFMKSB7CiAJCQkJc3RhdHVzID0gbmZzZXJyX2F0dHJub3RzdXBwOwogCQkJCWdvdG8gb3V0OwotCQkJfSBlbHNlIGlmIChzdGF0dXMgIT0gMCkKKwkJCX0gZWxzZSBpZiAoZXJyICE9IDApCiAJCQkJZ290byBvdXRfbmZzZXJyOwogCQl9CiAJfQpAQCAtMTgxNyw3ICsxODIwLDcgQEAKIAkJZmhfcHV0KCZ0ZW1wZmgpOwogCXJldHVybiBzdGF0dXM7CiBvdXRfbmZzZXJyOgotCXN0YXR1cyA9IG5mc2Vycm5vKHN0YXR1cyk7CisJc3RhdHVzID0gbmZzZXJybm8oZXJyKTsKIAlnb3RvIG91dDsKIG91dF9yZXNvdXJjZToKIAkqY291bnRwID0gMDsKQEAgLTE4MjgsMTMgKzE4MzEsMTMgQEAKIAlnb3RvIG91dDsKIH0KIAotc3RhdGljIGludAorc3RhdGljIF9fYmUzMgogbmZzZDRfZW5jb2RlX2RpcmVudF9mYXR0cihzdHJ1Y3QgbmZzZDRfcmVhZGRpciAqY2QsCi0JCWNvbnN0IGNoYXIgKm5hbWUsIGludCBuYW1sZW4sIHUzMiAqcCwgaW50ICpidWZsZW4pCisJCWNvbnN0IGNoYXIgKm5hbWUsIGludCBuYW1sZW4sIF9fYmUzMiAqcCwgaW50ICpidWZsZW4pCiB7CiAJc3RydWN0IHN2Y19leHBvcnQgKmV4cCA9IGNkLT5yZF9maHAtPmZoX2V4cG9ydDsKIAlzdHJ1Y3QgZGVudHJ5ICpkZW50cnk7Ci0JaW50IG5mc2VycjsKKwlfX2JlMzIgbmZzZXJyOwogCiAJZGVudHJ5ID0gbG9va3VwX29uZV9sZW4obmFtZSwgY2QtPnJkX2ZocC0+ZmhfZGVudHJ5LCBuYW1sZW4pOwogCWlmIChJU19FUlIoZGVudHJ5KSkKQEAgLTE4NjMsMTAgKzE4NjYsMTAgQEAKIAlyZXR1cm4gbmZzZXJyOwogfQogCi1zdGF0aWMgdTMyICoKLW5mc2Q0X2VuY29kZV9yZGF0dHJfZXJyb3IodTMyICpwLCBpbnQgYnVmbGVuLCBpbnQgbmZzZXJyKQorc3RhdGljIF9fYmUzMiAqCituZnNkNF9lbmNvZGVfcmRhdHRyX2Vycm9yKF9fYmUzMiAqcCwgaW50IGJ1ZmxlbiwgX19iZTMyIG5mc2VycikKIHsKLQl1MzIgKmF0dHJsZW5wOworCV9fYmUzMiAqYXR0cmxlbnA7CiAKIAlpZiAoYnVmbGVuIDwgNikKIAkJcmV0dXJuIE5VTEw7CkBAIC0xODg2LDggKzE4ODksOCBAQAogewogCXN0cnVjdCBuZnNkNF9yZWFkZGlyICpjZCA9IGNvbnRhaW5lcl9vZihjY2QsIHN0cnVjdCBuZnNkNF9yZWFkZGlyLCBjb21tb24pOwogCWludCBidWZsZW47Ci0JdTMyICpwID0gY2QtPmJ1ZmZlcjsKLQlpbnQgbmZzZXJyID0gbmZzZXJyX3Rvb3NtYWxsOworCV9fYmUzMiAqcCA9IGNkLT5idWZmZXI7CisJX19iZTMyIG5mc2VyciA9IG5mc2Vycl90b29zbWFsbDsKIAogCS8qIEluIG5mc3Y0LCAiLiIgYW5kICIuLiIgbmV2ZXIgbWFrZSBpdCBvbnRvIHRoZSB3aXJlLi4gKi8KIAlpZiAobmFtZSAmJiBpc2RvdGVudChuYW1lLCBuYW1sZW4pKSB7CkBAIC0xOTQzLDcgKzE5NDYsNyBAQAogfQogCiBzdGF0aWMgdm9pZAotbmZzZDRfZW5jb2RlX2FjY2VzcyhzdHJ1Y3QgbmZzZDRfY29tcG91bmRyZXMgKnJlc3AsIGludCBuZnNlcnIsIHN0cnVjdCBuZnNkNF9hY2Nlc3MgKmFjY2VzcykKK25mc2Q0X2VuY29kZV9hY2Nlc3Moc3RydWN0IG5mc2Q0X2NvbXBvdW5kcmVzICpyZXNwLCBfX2JlMzIgbmZzZXJyLCBzdHJ1Y3QgbmZzZDRfYWNjZXNzICphY2Nlc3MpCiB7CiAJRU5DT0RFX0hFQUQ7CiAKQEAgLTE5NTYsNyArMTk1OSw3IEBACiB9CiAKIHN0YXRpYyB2b2lkCi1uZnNkNF9lbmNvZGVfY2xvc2Uoc3RydWN0IG5mc2Q0X2NvbXBvdW5kcmVzICpyZXNwLCBpbnQgbmZzZXJyLCBzdHJ1Y3QgbmZzZDRfY2xvc2UgKmNsb3NlKQorbmZzZDRfZW5jb2RlX2Nsb3NlKHN0cnVjdCBuZnNkNF9jb21wb3VuZHJlcyAqcmVzcCwgX19iZTMyIG5mc2Vyciwgc3RydWN0IG5mc2Q0X2Nsb3NlICpjbG9zZSkKIHsKIAlFTkNPREVfU0VRSURfT1BfSEVBRDsKIApAQCAtMTk3MSw3ICsxOTc0LDcgQEAKIAogCiBzdGF0aWMgdm9pZAotbmZzZDRfZW5jb2RlX2NvbW1pdChzdHJ1Y3QgbmZzZDRfY29tcG91bmRyZXMgKnJlc3AsIGludCBuZnNlcnIsIHN0cnVjdCBuZnNkNF9jb21taXQgKmNvbW1pdCkKK25mc2Q0X2VuY29kZV9jb21taXQoc3RydWN0IG5mc2Q0X2NvbXBvdW5kcmVzICpyZXNwLCBfX2JlMzIgbmZzZXJyLCBzdHJ1Y3QgbmZzZDRfY29tbWl0ICpjb21taXQpCiB7CiAJRU5DT0RFX0hFQUQ7CiAKQEAgLTE5ODMsNyArMTk4Niw3IEBACiB9CiAKIHN0YXRpYyB2b2lkCi1uZnNkNF9lbmNvZGVfY3JlYXRlKHN0cnVjdCBuZnNkNF9jb21wb3VuZHJlcyAqcmVzcCwgaW50IG5mc2Vyciwgc3RydWN0IG5mc2Q0X2NyZWF0ZSAqY3JlYXRlKQorbmZzZDRfZW5jb2RlX2NyZWF0ZShzdHJ1Y3QgbmZzZDRfY29tcG91bmRyZXMgKnJlc3AsIF9fYmUzMiBuZnNlcnIsIHN0cnVjdCBuZnNkNF9jcmVhdGUgKmNyZWF0ZSkKIHsKIAlFTkNPREVfSEVBRDsKIApAQCAtMTk5Nyw4ICsyMDAwLDggQEAKIAl9CiB9CiAKLXN0YXRpYyBpbnQKLW5mc2Q0X2VuY29kZV9nZXRhdHRyKHN0cnVjdCBuZnNkNF9jb21wb3VuZHJlcyAqcmVzcCwgaW50IG5mc2Vyciwgc3RydWN0IG5mc2Q0X2dldGF0dHIgKmdldGF0dHIpCitzdGF0aWMgX19iZTMyCituZnNkNF9lbmNvZGVfZ2V0YXR0cihzdHJ1Y3QgbmZzZDRfY29tcG91bmRyZXMgKnJlc3AsIF9fYmUzMiBuZnNlcnIsIHN0cnVjdCBuZnNkNF9nZXRhdHRyICpnZXRhdHRyKQogewogCXN0cnVjdCBzdmNfZmggKmZocCA9IGdldGF0dHItPmdhX2ZocDsKIAlpbnQgYnVmbGVuOwpAQCAtMjAxNiw3ICsyMDE5LDcgQEAKIH0KIAogc3RhdGljIHZvaWQKLW5mc2Q0X2VuY29kZV9nZXRmaChzdHJ1Y3QgbmZzZDRfY29tcG91bmRyZXMgKnJlc3AsIGludCBuZnNlcnIsIHN0cnVjdCBzdmNfZmggKmZocCkKK25mc2Q0X2VuY29kZV9nZXRmaChzdHJ1Y3QgbmZzZDRfY29tcG91bmRyZXMgKnJlc3AsIF9fYmUzMiBuZnNlcnIsIHN0cnVjdCBzdmNfZmggKmZocCkKIHsKIAl1bnNpZ25lZCBpbnQgbGVuOwogCUVOQ09ERV9IRUFEOwpAQCAtMjA1Niw3ICsyMDU5LDcgQEAKIH0KIAogc3RhdGljIHZvaWQKLW5mc2Q0X2VuY29kZV9sb2NrKHN0cnVjdCBuZnNkNF9jb21wb3VuZHJlcyAqcmVzcCwgaW50IG5mc2Vyciwgc3RydWN0IG5mc2Q0X2xvY2sgKmxvY2spCituZnNkNF9lbmNvZGVfbG9jayhzdHJ1Y3QgbmZzZDRfY29tcG91bmRyZXMgKnJlc3AsIF9fYmUzMiBuZnNlcnIsIHN0cnVjdCBuZnNkNF9sb2NrICpsb2NrKQogewogCUVOQ09ERV9TRVFJRF9PUF9IRUFEOwogCkBAIC0yMDcyLDE0ICsyMDc1LDE0IEBACiB9CiAKIHN0YXRpYyB2b2lkCi1uZnNkNF9lbmNvZGVfbG9ja3Qoc3RydWN0IG5mc2Q0X2NvbXBvdW5kcmVzICpyZXNwLCBpbnQgbmZzZXJyLCBzdHJ1Y3QgbmZzZDRfbG9ja3QgKmxvY2t0KQorbmZzZDRfZW5jb2RlX2xvY2t0KHN0cnVjdCBuZnNkNF9jb21wb3VuZHJlcyAqcmVzcCwgX19iZTMyIG5mc2Vyciwgc3RydWN0IG5mc2Q0X2xvY2t0ICpsb2NrdCkKIHsKIAlpZiAobmZzZXJyID09IG5mc2Vycl9kZW5pZWQpCiAJCW5mc2Q0X2VuY29kZV9sb2NrX2RlbmllZChyZXNwLCAmbG9ja3QtPmx0X2RlbmllZCk7CiB9CiAKIHN0YXRpYyB2b2lkCi1uZnNkNF9lbmNvZGVfbG9ja3Uoc3RydWN0IG5mc2Q0X2NvbXBvdW5kcmVzICpyZXNwLCBpbnQgbmZzZXJyLCBzdHJ1Y3QgbmZzZDRfbG9ja3UgKmxvY2t1KQorbmZzZDRfZW5jb2RlX2xvY2t1KHN0cnVjdCBuZnNkNF9jb21wb3VuZHJlcyAqcmVzcCwgX19iZTMyIG5mc2Vyciwgc3RydWN0IG5mc2Q0X2xvY2t1ICpsb2NrdSkKIHsKIAlFTkNPREVfU0VRSURfT1BfSEVBRDsKIApAQCAtMjA5NSw3ICsyMDk4LDcgQEAKIAogCiBzdGF0aWMgdm9pZAotbmZzZDRfZW5jb2RlX2xpbmsoc3RydWN0IG5mc2Q0X2NvbXBvdW5kcmVzICpyZXNwLCBpbnQgbmZzZXJyLCBzdHJ1Y3QgbmZzZDRfbGluayAqbGluaykKK25mc2Q0X2VuY29kZV9saW5rKHN0cnVjdCBuZnNkNF9jb21wb3VuZHJlcyAqcmVzcCwgX19iZTMyIG5mc2Vyciwgc3RydWN0IG5mc2Q0X2xpbmsgKmxpbmspCiB7CiAJRU5DT0RFX0hFQUQ7CiAKQEAgLTIxMDgsNyArMjExMSw3IEBACiAKIAogc3RhdGljIHZvaWQKLW5mc2Q0X2VuY29kZV9vcGVuKHN0cnVjdCBuZnNkNF9jb21wb3VuZHJlcyAqcmVzcCwgaW50IG5mc2Vyciwgc3RydWN0IG5mc2Q0X29wZW4gKm9wZW4pCituZnNkNF9lbmNvZGVfb3BlbihzdHJ1Y3QgbmZzZDRfY29tcG91bmRyZXMgKnJlc3AsIF9fYmUzMiBuZnNlcnIsIHN0cnVjdCBuZnNkNF9vcGVuICpvcGVuKQogewogCUVOQ09ERV9TRVFJRF9PUF9IRUFEOwogCkBAIC0yMTczLDcgKzIxNzYsNyBAQAogfQogCiBzdGF0aWMgdm9pZAotbmZzZDRfZW5jb2RlX29wZW5fY29uZmlybShzdHJ1Y3QgbmZzZDRfY29tcG91bmRyZXMgKnJlc3AsIGludCBuZnNlcnIsIHN0cnVjdCBuZnNkNF9vcGVuX2NvbmZpcm0gKm9jKQorbmZzZDRfZW5jb2RlX29wZW5fY29uZmlybShzdHJ1Y3QgbmZzZDRfY29tcG91bmRyZXMgKnJlc3AsIF9fYmUzMiBuZnNlcnIsIHN0cnVjdCBuZnNkNF9vcGVuX2NvbmZpcm0gKm9jKQogewogCUVOQ09ERV9TRVFJRF9PUF9IRUFEOwogCQkJCSAgICAgICAgCkBAIC0yMTg4LDcgKzIxOTEsNyBAQAogfQogCiBzdGF0aWMgdm9pZAotbmZzZDRfZW5jb2RlX29wZW5fZG93bmdyYWRlKHN0cnVjdCBuZnNkNF9jb21wb3VuZHJlcyAqcmVzcCwgaW50IG5mc2Vyciwgc3RydWN0IG5mc2Q0X29wZW5fZG93bmdyYWRlICpvZCkKK25mc2Q0X2VuY29kZV9vcGVuX2Rvd25ncmFkZShzdHJ1Y3QgbmZzZDRfY29tcG91bmRyZXMgKnJlc3AsIF9fYmUzMiBuZnNlcnIsIHN0cnVjdCBuZnNkNF9vcGVuX2Rvd25ncmFkZSAqb2QpCiB7CiAJRU5DT0RFX1NFUUlEX09QX0hFQUQ7CiAJCQkJICAgICAgICAKQEAgLTIyMDIsOCArMjIwNSw4IEBACiAJRU5DT0RFX1NFUUlEX09QX1RBSUwob2QtPm9kX3N0YXRlb3duZXIpOwogfQogCi1zdGF0aWMgaW50Ci1uZnNkNF9lbmNvZGVfcmVhZChzdHJ1Y3QgbmZzZDRfY29tcG91bmRyZXMgKnJlc3AsIGludCBuZnNlcnIsCitzdGF0aWMgX19iZTMyCituZnNkNF9lbmNvZGVfcmVhZChzdHJ1Y3QgbmZzZDRfY29tcG91bmRyZXMgKnJlc3AsIF9fYmUzMiBuZnNlcnIsCiAJCSAgc3RydWN0IG5mc2Q0X3JlYWQgKnJlYWQpCiB7CiAJdTMyIGVvZjsKQEAgLTIyNjcsOCArMjI3MCw4IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQKLW5mc2Q0X2VuY29kZV9yZWFkbGluayhzdHJ1Y3QgbmZzZDRfY29tcG91bmRyZXMgKnJlc3AsIGludCBuZnNlcnIsIHN0cnVjdCBuZnNkNF9yZWFkbGluayAqcmVhZGxpbmspCitzdGF0aWMgX19iZTMyCituZnNkNF9lbmNvZGVfcmVhZGxpbmsoc3RydWN0IG5mc2Q0X2NvbXBvdW5kcmVzICpyZXNwLCBfX2JlMzIgbmZzZXJyLCBzdHJ1Y3QgbmZzZDRfcmVhZGxpbmsgKnJlYWRsaW5rKQogewogCWludCBtYXhjb3VudDsKIAljaGFyICpwYWdlOwpAQCAtMjMxNSwxMiArMjMxOCwxMiBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50Ci1uZnNkNF9lbmNvZGVfcmVhZGRpcihzdHJ1Y3QgbmZzZDRfY29tcG91bmRyZXMgKnJlc3AsIGludCBuZnNlcnIsIHN0cnVjdCBuZnNkNF9yZWFkZGlyICpyZWFkZGlyKQorc3RhdGljIF9fYmUzMgorbmZzZDRfZW5jb2RlX3JlYWRkaXIoc3RydWN0IG5mc2Q0X2NvbXBvdW5kcmVzICpyZXNwLCBfX2JlMzIgbmZzZXJyLCBzdHJ1Y3QgbmZzZDRfcmVhZGRpciAqcmVhZGRpcikKIHsKIAlpbnQgbWF4Y291bnQ7CiAJbG9mZl90IG9mZnNldDsKLQl1MzIgKnBhZ2UsICpzYXZlcCwgKnRhaWxiYXNlOworCV9fYmUzMiAqcGFnZSwgKnNhdmVwLCAqdGFpbGJhc2U7CiAJRU5DT0RFX0hFQUQ7CiAKIAlpZiAobmZzZXJyKQpAQCAtMjM5NSw3ICsyMzk4LDcgQEAKIH0KIAogc3RhdGljIHZvaWQKLW5mc2Q0X2VuY29kZV9yZW1vdmUoc3RydWN0IG5mc2Q0X2NvbXBvdW5kcmVzICpyZXNwLCBpbnQgbmZzZXJyLCBzdHJ1Y3QgbmZzZDRfcmVtb3ZlICpyZW1vdmUpCituZnNkNF9lbmNvZGVfcmVtb3ZlKHN0cnVjdCBuZnNkNF9jb21wb3VuZHJlcyAqcmVzcCwgX19iZTMyIG5mc2Vyciwgc3RydWN0IG5mc2Q0X3JlbW92ZSAqcmVtb3ZlKQogewogCUVOQ09ERV9IRUFEOwogCkBAIC0yNDA3LDcgKzI0MTAsNyBAQAogfQogCiBzdGF0aWMgdm9pZAotbmZzZDRfZW5jb2RlX3JlbmFtZShzdHJ1Y3QgbmZzZDRfY29tcG91bmRyZXMgKnJlc3AsIGludCBuZnNlcnIsIHN0cnVjdCBuZnNkNF9yZW5hbWUgKnJlbmFtZSkKK25mc2Q0X2VuY29kZV9yZW5hbWUoc3RydWN0IG5mc2Q0X2NvbXBvdW5kcmVzICpyZXNwLCBfX2JlMzIgbmZzZXJyLCBzdHJ1Y3QgbmZzZDRfcmVuYW1lICpyZW5hbWUpCiB7CiAJRU5DT0RFX0hFQUQ7CiAKQEAgLTI0MjQsNyArMjQyNyw3IEBACiAgKiByZWdhcmRsZXNzIG9mIHRoZSBlcnJvciBzdGF0dXMuCiAgKi8KIHN0YXRpYyB2b2lkCi1uZnNkNF9lbmNvZGVfc2V0YXR0cihzdHJ1Y3QgbmZzZDRfY29tcG91bmRyZXMgKnJlc3AsIGludCBuZnNlcnIsIHN0cnVjdCBuZnNkNF9zZXRhdHRyICpzZXRhdHRyKQorbmZzZDRfZW5jb2RlX3NldGF0dHIoc3RydWN0IG5mc2Q0X2NvbXBvdW5kcmVzICpyZXNwLCBfX2JlMzIgbmZzZXJyLCBzdHJ1Y3QgbmZzZDRfc2V0YXR0ciAqc2V0YXR0cikKIHsKIAlFTkNPREVfSEVBRDsKIApAQCAtMjQ0Myw3ICsyNDQ2LDcgQEAKIH0KIAogc3RhdGljIHZvaWQKLW5mc2Q0X2VuY29kZV9zZXRjbGllbnRpZChzdHJ1Y3QgbmZzZDRfY29tcG91bmRyZXMgKnJlc3AsIGludCBuZnNlcnIsIHN0cnVjdCBuZnNkNF9zZXRjbGllbnRpZCAqc2NkKQorbmZzZDRfZW5jb2RlX3NldGNsaWVudGlkKHN0cnVjdCBuZnNkNF9jb21wb3VuZHJlcyAqcmVzcCwgX19iZTMyIG5mc2Vyciwgc3RydWN0IG5mc2Q0X3NldGNsaWVudGlkICpzY2QpCiB7CiAJRU5DT0RFX0hFQUQ7CiAKQEAgLTI0NjIsNyArMjQ2NSw3IEBACiB9CiAKIHN0YXRpYyB2b2lkCi1uZnNkNF9lbmNvZGVfd3JpdGUoc3RydWN0IG5mc2Q0X2NvbXBvdW5kcmVzICpyZXNwLCBpbnQgbmZzZXJyLCBzdHJ1Y3QgbmZzZDRfd3JpdGUgKndyaXRlKQorbmZzZDRfZW5jb2RlX3dyaXRlKHN0cnVjdCBuZnNkNF9jb21wb3VuZHJlcyAqcmVzcCwgX19iZTMyIG5mc2Vyciwgc3RydWN0IG5mc2Q0X3dyaXRlICp3cml0ZSkKIHsKIAlFTkNPREVfSEVBRDsKIApAQCAtMjQ3OCw3ICsyNDgxLDcgQEAKIHZvaWQKIG5mc2Q0X2VuY29kZV9vcGVyYXRpb24oc3RydWN0IG5mc2Q0X2NvbXBvdW5kcmVzICpyZXNwLCBzdHJ1Y3QgbmZzZDRfb3AgKm9wKQogewotCXUzMiAqc3RhdHA7CisJX19iZTMyICpzdGF0cDsKIAlFTkNPREVfSEVBRDsKIAogCVJFU0VSVkVfU1BBQ0UoOCk7CkBAIC0yNjE2LDcgKzI2MTksNyBAQAogICovCiAKIGludAotbmZzNHN2Y19lbmNvZGVfdm9pZHJlcyhzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCB1MzIgKnAsIHZvaWQgKmR1bW15KQorbmZzNHN2Y19lbmNvZGVfdm9pZHJlcyhzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCBfX2JlMzIgKnAsIHZvaWQgKmR1bW15KQogewogICAgICAgICByZXR1cm4geGRyX3Jlc3NpemVfY2hlY2socnFzdHAsIHApOwogfQpAQCAtMjYzOCw5ICsyNjQxLDkgQEAKIH0KIAogaW50Ci1uZnM0c3ZjX2RlY29kZV9jb21wb3VuZGFyZ3Moc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgdTMyICpwLCBzdHJ1Y3QgbmZzZDRfY29tcG91bmRhcmdzICphcmdzKQorbmZzNHN2Y19kZWNvZGVfY29tcG91bmRhcmdzKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIF9fYmUzMiAqcCwgc3RydWN0IG5mc2Q0X2NvbXBvdW5kYXJncyAqYXJncykKIHsKLQlpbnQgc3RhdHVzOworCV9fYmUzMiBzdGF0dXM7CiAKIAlhcmdzLT5wID0gcDsKIAlhcmdzLT5lbmQgPSBycXN0cC0+cnFfYXJnLmhlYWRbMF0uaW92X2Jhc2UgKyBycXN0cC0+cnFfYXJnLmhlYWRbMF0uaW92X2xlbjsKQEAgLTI2NTksNyArMjY2Miw3IEBACiB9CiAKIGludAotbmZzNHN2Y19lbmNvZGVfY29tcG91bmRyZXMoc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgdTMyICpwLCBzdHJ1Y3QgbmZzZDRfY29tcG91bmRyZXMgKnJlc3ApCituZnM0c3ZjX2VuY29kZV9jb21wb3VuZHJlcyhzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCBfX2JlMzIgKnAsIHN0cnVjdCBuZnNkNF9jb21wb3VuZHJlcyAqcmVzcCkKIHsKIAkvKgogCSAqIEFsbCB0aGF0IHJlbWFpbnMgaXMgdG8gd3JpdGUgdGhlIHRhZyBhbmQgb3BlcmF0aW9uIGNvdW50Li4uCmRpZmYgLS1naXQgYS9mcy9uZnNkL25mc2NhY2hlLmMgYi9mcy9uZnNkL25mc2NhY2hlLmMKaW5kZXggZmRmN2NmMy4uNjEwMGJiZSAxMDA2NDQKLS0tIGEvZnMvbmZzZC9uZnNjYWNoZS5jCisrKyBiL2ZzL25mc2QvbmZzY2FjaGUuYwpAQCAtMjksNyArMjksNyBAQAogICovCiAjZGVmaW5lIENBQ0hFU0laRQkJMTAyNAogI2RlZmluZSBIQVNIU0laRQkJNjQKLSNkZWZpbmUgUkVRSEFTSCh4aWQpCQkoKCgoeGlkKSA+PiAyNCkgXiAoeGlkKSkgJiAoSEFTSFNJWkUtMSkpCisjZGVmaW5lIFJFUUhBU0goeGlkKQkJKCgoKChfX2ZvcmNlIF9fdTMyKXhpZCkgPj4gMjQpIF4gKChfX2ZvcmNlIF9fdTMyKXhpZCkpICYgKEhBU0hTSVpFLTEpKQogCiBzdGF0aWMgc3RydWN0IGhsaXN0X2hlYWQgKgloYXNoX2xpc3Q7CiBzdGF0aWMgc3RydWN0IGxpc3RfaGVhZCAJbHJ1X2hlYWQ7CkBAIC0xMjcsOCArMTI3LDggQEAKIAlzdHJ1Y3QgaGxpc3Rfbm9kZQkqaG47CiAJc3RydWN0IGhsaXN0X2hlYWQgCSpyaDsKIAlzdHJ1Y3Qgc3ZjX2NhY2hlcmVwCSpycDsKLQl1MzIJCQl4aWQgPSBycXN0cC0+cnFfeGlkLAotCQkJCXByb3RvID0gIHJxc3RwLT5ycV9wcm90LAorCV9fYmUzMgkJCXhpZCA9IHJxc3RwLT5ycV94aWQ7CisJdTMyCQkJcHJvdG8gPSAgcnFzdHAtPnJxX3Byb3QsCiAJCQkJdmVycyA9IHJxc3RwLT5ycV92ZXJzLAogCQkJCXByb2MgPSBycXN0cC0+cnFfcHJvYzsKIAl1bnNpZ25lZCBsb25nCQlhZ2U7CkBAIC0yNTgsNyArMjU4LDcgQEAKICAqIEluIHRoaXMgY2FzZSwgbmZzZF9jYWNoZV91cGRhdGUgaXMgY2FsbGVkIHdpdGggc3RhdHAgPT0gTlVMTC4KICAqLwogdm9pZAotbmZzZF9jYWNoZV91cGRhdGUoc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgaW50IGNhY2hldHlwZSwgdTMyICpzdGF0cCkKK25mc2RfY2FjaGVfdXBkYXRlKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIGludCBjYWNoZXR5cGUsIF9fYmUzMiAqc3RhdHApCiB7CiAJc3RydWN0IHN2Y19jYWNoZXJlcCAqcnA7CiAJc3RydWN0IGt2ZWMJKnJlc3YgPSAmcnFzdHAtPnJxX3Jlcy5oZWFkWzBdLCAqY2FjaHY7CmRpZmYgLS1naXQgYS9mcy9uZnNkL25mc2ZoLmMgYi9mcy9uZnNkL25mc2ZoLmMKaW5kZXggNTAxZDgzOC4uNzI3YWIzYiAxMDA2NDQKLS0tIGEvZnMvbmZzZC9uZnNmaC5jCisrKyBiL2ZzL25mc2QvbmZzZmguYwpAQCAtNzYsNyArNzYsNyBAQAogICogY29tbWVudCBpbiB0aGUgTkZTdjMgc3BlYyBzYXlzIHRoaXMgaXMgaW5jb3JyZWN0IChpbXBsZW1lbnRhdGlvbiBub3RlcyBmb3IKICAqIHRoZSB3cml0ZSBjYWxsKS4KICAqLwotc3RhdGljIGlubGluZSBpbnQKK3N0YXRpYyBpbmxpbmUgX19iZTMyCiBuZnNkX21vZGVfY2hlY2soc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgdW1vZGVfdCBtb2RlLCBpbnQgdHlwZSkKIHsKIAkvKiBUeXBlIGNhbiBiZSBuZWdhdGl2ZSB3aGVuIGNyZWF0aW5nIGhhcmRsaW5rcyAtIG5vdCB0byBhIGRpciAqLwpAQCAtMTEwLDEzICsxMTAsMTMgQEAKICAqIFRoaXMgaXMgb25seSBjYWxsZWQgYXQgdGhlIHN0YXJ0IG9mIGFuIG5mc3Byb2MgY2FsbCwgc28gZmhwIHBvaW50cyB0bwogICogYSBzdmNfZmggd2hpY2ggaXMgYWxsIDAgZXhjZXB0IGZvciB0aGUgb3Zlci10aGUtd2lyZSBmaWxlIGhhbmRsZS4KICAqLwotdTMyCitfX2JlMzIKIGZoX3ZlcmlmeShzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCBzdHJ1Y3Qgc3ZjX2ZoICpmaHAsIGludCB0eXBlLCBpbnQgYWNjZXNzKQogewogCXN0cnVjdCBrbmZzZF9maAkqZmggPSAmZmhwLT5maF9oYW5kbGU7CiAJc3RydWN0IHN2Y19leHBvcnQgKmV4cCA9IE5VTEw7CiAJc3RydWN0IGRlbnRyeQkqZGVudHJ5OwotCXUzMgkJZXJyb3IgPSAwOworCV9fYmUzMgkJZXJyb3IgPSAwOwogCiAJZHByaW50aygibmZzZDogZmhfdmVyaWZ5KCVzKVxuIiwgU1ZDRkhfZm10KGZocCkpOwogCkBAIC0zMTUsNyArMzE1LDcgQEAKIAkJZmgtPm9maF9kaXJpbm8gPSAwOwogfQogCi1pbnQKK19fYmUzMgogZmhfY29tcG9zZShzdHJ1Y3Qgc3ZjX2ZoICpmaHAsIHN0cnVjdCBzdmNfZXhwb3J0ICpleHAsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgc3RydWN0IHN2Y19maCAqcmVmX2ZoKQogewogCS8qIHJlZl9maCBpcyBhIHJlZmVyZW5jZSBmaWxlIGhhbmRsZS4KQEAgLTQ1MSw3ICs0NTEsNyBAQAogICogVXBkYXRlIGZpbGUgaGFuZGxlIGluZm9ybWF0aW9uIGFmdGVyIGNoYW5naW5nIGEgZGVudHJ5LgogICogVGhpcyBpcyBvbmx5IGNhbGxlZCBieSBuZnNkX2NyZWF0ZSwgbmZzZF9jcmVhdGVfdjMgYW5kIG5mc2RfcHJvY19jcmVhdGUKICAqLwotaW50CitfX2JlMzIKIGZoX3VwZGF0ZShzdHJ1Y3Qgc3ZjX2ZoICpmaHApCiB7CiAJc3RydWN0IGRlbnRyeSAqZGVudHJ5OwpkaWZmIC0tZ2l0IGEvZnMvbmZzZC9uZnNwcm9jLmMgYi9mcy9uZnNkL25mc3Byb2MuYwppbmRleCA5ZWUxZGFiLi5lYzk4M2I3IDEwMDY0NAotLS0gYS9mcy9uZnNkL25mc3Byb2MuYworKysgYi9mcy9uZnNkL25mc3Byb2MuYwpAQCAtMzAsMjIgKzMwLDIyIEBACiAjZGVmaW5lIE5GU0REQkdfRkFDSUxJVFkJCU5GU0REQkdfUFJPQwogCiAKLXN0YXRpYyBpbnQKK3N0YXRpYyBfX2JlMzIKIG5mc2RfcHJvY19udWxsKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHZvaWQgKmFyZ3AsIHZvaWQgKnJlc3ApCiB7CiAJcmV0dXJuIG5mc19vazsKIH0KIAotc3RhdGljIGludAotbmZzZF9yZXR1cm5fYXR0cnMoaW50IGVyciwgc3RydWN0IG5mc2RfYXR0cnN0YXQgKnJlc3ApCitzdGF0aWMgX19iZTMyCituZnNkX3JldHVybl9hdHRycyhfX2JlMzIgZXJyLCBzdHJ1Y3QgbmZzZF9hdHRyc3RhdCAqcmVzcCkKIHsKIAlpZiAoZXJyKSByZXR1cm4gZXJyOwogCXJldHVybiBuZnNlcnJubyh2ZnNfZ2V0YXR0cihyZXNwLT5maC5maF9leHBvcnQtPmV4X21udCwKIAkJCQkgICAgcmVzcC0+ZmguZmhfZGVudHJ5LAogCQkJCSAgICAmcmVzcC0+c3RhdCkpOwogfQotc3RhdGljIGludAotbmZzZF9yZXR1cm5fZGlyb3AoaW50IGVyciwgc3RydWN0IG5mc2RfZGlyb3ByZXMgKnJlc3ApCitzdGF0aWMgX19iZTMyCituZnNkX3JldHVybl9kaXJvcChfX2JlMzIgZXJyLCBzdHJ1Y3QgbmZzZF9kaXJvcHJlcyAqcmVzcCkKIHsKIAlpZiAoZXJyKSByZXR1cm4gZXJyOwogCXJldHVybiBuZnNlcnJubyh2ZnNfZ2V0YXR0cihyZXNwLT5maC5maF9leHBvcnQtPmV4X21udCwKQEAgLTU2LDExICs1NiwxMSBAQAogICogR2V0IGEgZmlsZSdzIGF0dHJpYnV0ZXMKICAqIE4uQi4gQWZ0ZXIgdGhpcyBjYWxsIHJlc3AtPmZoIG5lZWRzIGFuIGZoX3B1dAogICovCi1zdGF0aWMgaW50CitzdGF0aWMgX19iZTMyCiBuZnNkX3Byb2NfZ2V0YXR0cihzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCBzdHJ1Y3QgbmZzZF9maGFuZGxlICAqYXJncCwKIAkJCQkJICBzdHJ1Y3QgbmZzZF9hdHRyc3RhdCAqcmVzcCkKIHsKLQlpbnQgbmZzZXJyOworCV9fYmUzMiBuZnNlcnI7CiAJZHByaW50aygibmZzZDogR0VUQVRUUiAgJXNcbiIsIFNWQ0ZIX2ZtdCgmYXJncC0+ZmgpKTsKIAogCWZoX2NvcHkoJnJlc3AtPmZoLCAmYXJncC0+ZmgpOwpAQCAtNzIsMTEgKzcyLDExIEBACiAgKiBTZXQgYSBmaWxlJ3MgYXR0cmlidXRlcwogICogTi5CLiBBZnRlciB0aGlzIGNhbGwgcmVzcC0+ZmggbmVlZHMgYW4gZmhfcHV0CiAgKi8KLXN0YXRpYyBpbnQKK3N0YXRpYyBfX2JlMzIKIG5mc2RfcHJvY19zZXRhdHRyKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHN0cnVjdCBuZnNkX3NhdHRyYXJncyAqYXJncCwKIAkJCQkJICBzdHJ1Y3QgbmZzZF9hdHRyc3RhdCAgKnJlc3ApCiB7Ci0JaW50IG5mc2VycjsKKwlfX2JlMzIgbmZzZXJyOwogCWRwcmludGsoIm5mc2Q6IFNFVEFUVFIgICVzLCB2YWxpZD0leCwgc2l6ZT0lbGRcbiIsCiAJCVNWQ0ZIX2ZtdCgmYXJncC0+ZmgpLAogCQlhcmdwLT5hdHRycy5pYV92YWxpZCwgKGxvbmcpIGFyZ3AtPmF0dHJzLmlhX3NpemUpOwpAQCAtOTIsMTEgKzkyLDExIEBACiAgKiBkb2Vzbid0IGV4aXN0IHlldC4KICAqIE4uQi4gQWZ0ZXIgdGhpcyBjYWxsIHJlc3AtPmZoIG5lZWRzIGFuIGZoX3B1dAogICovCi1zdGF0aWMgaW50CitzdGF0aWMgX19iZTMyCiBuZnNkX3Byb2NfbG9va3VwKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHN0cnVjdCBuZnNkX2Rpcm9wYXJncyAqYXJncCwKIAkJCQkJIHN0cnVjdCBuZnNkX2Rpcm9wcmVzICAqcmVzcCkKIHsKLQlpbnQJbmZzZXJyOworCV9fYmUzMgluZnNlcnI7CiAKIAlkcHJpbnRrKCJuZnNkOiBMT09LVVAgICAlcyAlLipzXG4iLAogCQlTVkNGSF9mbXQoJmFyZ3AtPmZoKSwgYXJncC0+bGVuLCBhcmdwLT5uYW1lKTsKQEAgLTExMiwxMSArMTEyLDExIEBACiAvKgogICogUmVhZCBhIHN5bWxpbmsuCiAgKi8KLXN0YXRpYyBpbnQKK3N0YXRpYyBfX2JlMzIKIG5mc2RfcHJvY19yZWFkbGluayhzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCBzdHJ1Y3QgbmZzZF9yZWFkbGlua2FyZ3MgKmFyZ3AsCiAJCQkJCSAgIHN0cnVjdCBuZnNkX3JlYWRsaW5rcmVzICpyZXNwKQogewotCWludAluZnNlcnI7CisJX19iZTMyCW5mc2VycjsKIAogCWRwcmludGsoIm5mc2Q6IFJFQURMSU5LICVzXG4iLCBTVkNGSF9mbXQoJmFyZ3AtPmZoKSk7CiAKQEAgLTEzMiwxMSArMTMyLDExIEBACiAgKiBSZWFkIGEgcG9ydGlvbiBvZiBhIGZpbGUuCiAgKiBOLkIuIEFmdGVyIHRoaXMgY2FsbCByZXNwLT5maCBuZWVkcyBhbiBmaF9wdXQKICAqLwotc3RhdGljIGludAorc3RhdGljIF9fYmUzMgogbmZzZF9wcm9jX3JlYWQoc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgc3RydWN0IG5mc2RfcmVhZGFyZ3MgKmFyZ3AsCiAJCQkJICAgICAgIHN0cnVjdCBuZnNkX3JlYWRyZXMgICpyZXNwKQogewotCWludAluZnNlcnI7CisJX19iZTMyCW5mc2VycjsKIAogCWRwcmludGsoIm5mc2Q6IFJFQUQgICAgJXMgJWQgYnl0ZXMgYXQgJWRcbiIsCiAJCVNWQ0ZIX2ZtdCgmYXJncC0+ZmgpLApAQCAtMTcyLDExICsxNzIsMTEgQEAKICAqIFdyaXRlIGRhdGEgdG8gYSBmaWxlCiAgKiBOLkIuIEFmdGVyIHRoaXMgY2FsbCByZXNwLT5maCBuZWVkcyBhbiBmaF9wdXQKICAqLwotc3RhdGljIGludAorc3RhdGljIF9fYmUzMgogbmZzZF9wcm9jX3dyaXRlKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHN0cnVjdCBuZnNkX3dyaXRlYXJncyAqYXJncCwKIAkJCQkJc3RydWN0IG5mc2RfYXR0cnN0YXQgICpyZXNwKQogewotCWludAluZnNlcnI7CisJX19iZTMyCW5mc2VycjsKIAlpbnQJc3RhYmxlID0gMTsKIAogCWRwcmludGsoIm5mc2Q6IFdSSVRFICAgICVzICVkIGJ5dGVzIGF0ICVkXG4iLApAQCAtMTk3LDcgKzE5Nyw3IEBACiAgKiBhbmQgdGhlIGFjdHVhbCBjcmVhdGUoKSBjYWxsIGluIGNvbXBsaWFuY2Ugd2l0aCBWRlMgcHJvdG9jb2xzLgogICogTi5CLiBBZnRlciB0aGlzIGNhbGwgX2JvdGhfIGFyZ3AtPmZoIGFuZCByZXNwLT5maCBuZWVkIGFuIGZoX3B1dAogICovCi1zdGF0aWMgaW50CitzdGF0aWMgX19iZTMyCiBuZnNkX3Byb2NfY3JlYXRlKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHN0cnVjdCBuZnNkX2NyZWF0ZWFyZ3MgKmFyZ3AsCiAJCQkJCSBzdHJ1Y3QgbmZzZF9kaXJvcHJlcyAgICpyZXNwKQogewpAQCAtMjA2LDcgKzIwNiw4IEBACiAJc3RydWN0IGlhdHRyCSphdHRyID0gJmFyZ3AtPmF0dHJzOwogCXN0cnVjdCBpbm9kZQkqaW5vZGU7CiAJc3RydWN0IGRlbnRyeQkqZGNoaWxkOwotCWludAkJbmZzZXJyLCB0eXBlLCBtb2RlOworCWludAkJdHlwZSwgbW9kZTsKKwlfX2JlMzIJCW5mc2VycjsKIAlkZXZfdAkJcmRldiA9IDAsIHdhbnRlZCA9IG5ld19kZWNvZGVfZGV2KGF0dHItPmlhX3NpemUpOwogCiAJZHByaW50aygibmZzZDogQ1JFQVRFICAgJXMgJS4qc1xuIiwKQEAgLTM0OCwxMSArMzQ5LDExIEBACiAJcmV0dXJuIG5mc2RfcmV0dXJuX2Rpcm9wKG5mc2VyciwgcmVzcCk7CiB9CiAKLXN0YXRpYyBpbnQKK3N0YXRpYyBfX2JlMzIKIG5mc2RfcHJvY19yZW1vdmUoc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgc3RydWN0IG5mc2RfZGlyb3BhcmdzICphcmdwLAogCQkJCQkgdm9pZAkJICAgICAgICpyZXNwKQogewotCWludAluZnNlcnI7CisJX19iZTMyCW5mc2VycjsKIAogCWRwcmludGsoIm5mc2Q6IFJFTU9WRSAgICVzICUuKnNcbiIsIFNWQ0ZIX2ZtdCgmYXJncC0+ZmgpLAogCQlhcmdwLT5sZW4sIGFyZ3AtPm5hbWUpOwpAQCAtMzYzLDExICszNjQsMTEgQEAKIAlyZXR1cm4gbmZzZXJyOwogfQogCi1zdGF0aWMgaW50CitzdGF0aWMgX19iZTMyCiBuZnNkX3Byb2NfcmVuYW1lKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHN0cnVjdCBuZnNkX3JlbmFtZWFyZ3MgKmFyZ3AsCiAJCQkJICAJIHZvaWQJCSAgICAgICAgKnJlc3ApCiB7Ci0JaW50CW5mc2VycjsKKwlfX2JlMzIJbmZzZXJyOwogCiAJZHByaW50aygibmZzZDogUkVOQU1FICAgJXMgJS4qcyAtPiBcbiIsCiAJCVNWQ0ZIX2ZtdCgmYXJncC0+ZmZoKSwgYXJncC0+ZmxlbiwgYXJncC0+Zm5hbWUpOwpAQCAtMzgxLDExICszODIsMTEgQEAKIAlyZXR1cm4gbmZzZXJyOwogfQogCi1zdGF0aWMgaW50CitzdGF0aWMgX19iZTMyCiBuZnNkX3Byb2NfbGluayhzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCBzdHJ1Y3QgbmZzZF9saW5rYXJncyAqYXJncCwKIAkJCQl2b2lkCQkJICAgICpyZXNwKQogewotCWludAluZnNlcnI7CisJX19iZTMyCW5mc2VycjsKIAogCWRwcmludGsoIm5mc2Q6IExJTksgICAgICVzIC0+XG4iLAogCQlTVkNGSF9mbXQoJmFyZ3AtPmZmaCkpOwpAQCAtNDAxLDEyICs0MDIsMTIgQEAKIAlyZXR1cm4gbmZzZXJyOwogfQogCi1zdGF0aWMgaW50CitzdGF0aWMgX19iZTMyCiBuZnNkX3Byb2Nfc3ltbGluayhzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCBzdHJ1Y3QgbmZzZF9zeW1saW5rYXJncyAqYXJncCwKIAkJCQkgICAgICAgICAgdm9pZAkJCSAgKnJlc3ApCiB7CiAJc3RydWN0IHN2Y19maAluZXdmaDsKLQlpbnQJCW5mc2VycjsKKwlfX2JlMzIJCW5mc2VycjsKIAogCWRwcmludGsoIm5mc2Q6IFNZTUxJTksgICVzICUuKnMgLT4gJS4qc1xuIiwKIAkJU1ZDRkhfZm10KCZhcmdwLT5mZmgpLCBhcmdwLT5mbGVuLCBhcmdwLT5mbmFtZSwKQEAgLTQzMCwxMSArNDMxLDExIEBACiAgKiBNYWtlIGRpcmVjdG9yeS4gVGhpcyBvcGVyYXRpb24gaXMgbm90IGlkZW1wb3RlbnQuCiAgKiBOLkIuIEFmdGVyIHRoaXMgY2FsbCByZXNwLT5maCBuZWVkcyBhbiBmaF9wdXQKICAqLwotc3RhdGljIGludAorc3RhdGljIF9fYmUzMgogbmZzZF9wcm9jX21rZGlyKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHN0cnVjdCBuZnNkX2NyZWF0ZWFyZ3MgKmFyZ3AsCiAJCQkJCXN0cnVjdCBuZnNkX2Rpcm9wcmVzICAgKnJlc3ApCiB7Ci0JaW50CW5mc2VycjsKKwlfX2JlMzIJbmZzZXJyOwogCiAJZHByaW50aygibmZzZDogTUtESVIgICAgJXMgJS4qc1xuIiwgU1ZDRkhfZm10KCZhcmdwLT5maCksIGFyZ3AtPmxlbiwgYXJncC0+bmFtZSk7CiAKQEAgLTQ1NCwxMSArNDU1LDExIEBACiAvKgogICogUmVtb3ZlIGEgZGlyZWN0b3J5CiAgKi8KLXN0YXRpYyBpbnQKK3N0YXRpYyBfX2JlMzIKIG5mc2RfcHJvY19ybWRpcihzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCBzdHJ1Y3QgbmZzZF9kaXJvcGFyZ3MgKmFyZ3AsCiAJCQkJIAl2b2lkCQkgICAgICAqcmVzcCkKIHsKLQlpbnQJbmZzZXJyOworCV9fYmUzMgluZnNlcnI7CiAKIAlkcHJpbnRrKCJuZnNkOiBSTURJUiAgICAlcyAlLipzXG4iLCBTVkNGSF9mbXQoJmFyZ3AtPmZoKSwgYXJncC0+bGVuLCBhcmdwLT5uYW1lKTsKIApAQCAtNDcwLDExICs0NzEsMTIgQEAKIC8qCiAgKiBSZWFkIGEgcG9ydGlvbiBvZiBhIGRpcmVjdG9yeS4KICAqLwotc3RhdGljIGludAorc3RhdGljIF9fYmUzMgogbmZzZF9wcm9jX3JlYWRkaXIoc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgc3RydWN0IG5mc2RfcmVhZGRpcmFyZ3MgKmFyZ3AsCiAJCQkJCSAgc3RydWN0IG5mc2RfcmVhZGRpcnJlcyAgKnJlc3ApCiB7Ci0JaW50CQluZnNlcnIsIGNvdW50OworCWludAkJY291bnQ7CisJX19iZTMyCQluZnNlcnI7CiAJbG9mZl90CQlvZmZzZXQ7CiAKIAlkcHJpbnRrKCJuZnNkOiBSRUFERElSICAlcyAlZCBieXRlcyBhdCAlZFxuIiwKQEAgLTUwOSwxMSArNTExLDExIEBACiAvKgogICogR2V0IGZpbGUgc3lzdGVtIGluZm8KICAqLwotc3RhdGljIGludAorc3RhdGljIF9fYmUzMgogbmZzZF9wcm9jX3N0YXRmcyhzdHJ1Y3Qgc3ZjX3Jxc3QgKiBycXN0cCwgc3RydWN0IG5mc2RfZmhhbmRsZSAgICphcmdwLAogCQkJCQkgIHN0cnVjdCBuZnNkX3N0YXRmc3JlcyAqcmVzcCkKIHsKLQlpbnQJbmZzZXJyOworCV9fYmUzMgluZnNlcnI7CiAKIAlkcHJpbnRrKCJuZnNkOiBTVEFURlMgICAlc1xuIiwgU1ZDRkhfZm10KCZhcmdwLT5maCkpOwogCkBAIC01NzksMTEgKzU4MSwxMSBAQAogLyoKICAqIE1hcCBlcnJub3MgdG8gTkZTIGVycm5vcy4KICAqLwotaW50CitfX2JlMzIKIG5mc2Vycm5vIChpbnQgZXJybm8pCiB7CiAJc3RhdGljIHN0cnVjdCB7Ci0JCWludAluZnNlcnI7CisJCV9fYmUzMgluZnNlcnI7CiAJCWludAlzeXNlcnI7CiAJfSBuZnNfZXJydGJsW10gPSB7CiAJCXsgbmZzX29rLCAwIH0sCkBAIC02MTUsMTEgKzYxNywxMCBAQAogCQl7IG5mc2Vycl9iYWRuYW1lLCAtRVNSQ0ggfSwKIAkJeyBuZnNlcnJfaW8sIC1FVFhUQlNZIH0sCiAJCXsgbmZzZXJyX25vdHN1cHAsIC1FT1BOT1RTVVBQIH0sCi0JCXsgLTEsIC1FSU8gfQogCX07CiAJaW50CWk7CiAKLQlmb3IgKGkgPSAwOyBuZnNfZXJydGJsW2ldLm5mc2VyciAhPSAtMTsgaSsrKSB7CisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUobmZzX2VycnRibCk7IGkrKykgewogCQlpZiAobmZzX2VycnRibFtpXS5zeXNlcnIgPT0gZXJybm8pCiAJCQlyZXR1cm4gbmZzX2VycnRibFtpXS5uZnNlcnI7CiAJfQpkaWZmIC0tZ2l0IGEvZnMvbmZzZC9uZnNzdmMuYyBiL2ZzL25mc2QvbmZzc3ZjLmMKaW5kZXggMDEzYjM4OS4uMGFhY2NiMCAxMDA2NDQKLS0tIGEvZnMvbmZzZC9uZnNzdmMuYworKysgYi9mcy9uZnNkL25mc3N2Yy5jCkBAIC00OTEsMTIgKzQ5MSwxMiBAQAogfQogCiBpbnQKLW5mc2RfZGlzcGF0Y2goc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgdTMyICpzdGF0cCkKK25mc2RfZGlzcGF0Y2goc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgX19iZTMyICpzdGF0cCkKIHsKIAlzdHJ1Y3Qgc3ZjX3Byb2NlZHVyZQkqcHJvYzsKIAlreGRycHJvY190CQl4ZHI7Ci0JdTMyCQkJbmZzZXJyOwotCXUzMgkJCSpuZnNlcnJwOworCV9fYmUzMgkJCW5mc2VycjsKKwlfX2JlMzIJCQkqbmZzZXJycDsKIAogCWRwcmludGsoIm5mc2RfZGlzcGF0Y2g6IHZlcnMgJWQgcHJvYyAlZFxuIiwKIAkJCQlycXN0cC0+cnFfdmVycywgcnFzdHAtPnJxX3Byb2MpOwpAQCAtNTE1LDcgKzUxNSw3IEBACiAKIAkvKiBEZWNvZGUgYXJndW1lbnRzICovCiAJeGRyID0gcHJvYy0+cGNfZGVjb2RlOwotCWlmICh4ZHIgJiYgIXhkcihycXN0cCwgKHUzMiopcnFzdHAtPnJxX2FyZy5oZWFkWzBdLmlvdl9iYXNlLAorCWlmICh4ZHIgJiYgIXhkcihycXN0cCwgKF9fYmUzMiopcnFzdHAtPnJxX2FyZy5oZWFkWzBdLmlvdl9iYXNlLAogCQkJcnFzdHAtPnJxX2FyZ3ApKSB7CiAJCWRwcmludGsoIm5mc2Q6IGZhaWxlZCB0byBkZWNvZGUgYXJndW1lbnRzIVxuIik7CiAJCW5mc2RfY2FjaGVfdXBkYXRlKHJxc3RwLCBSQ19OT0NBQ0hFLCBOVUxMKTsKQEAgLTUyOCw3ICs1MjgsNyBAQAogCSAqLwogCW5mc2VycnAgPSBycXN0cC0+cnFfcmVzLmhlYWRbMF0uaW92X2Jhc2UKIAkJKyBycXN0cC0+cnFfcmVzLmhlYWRbMF0uaW92X2xlbjsKLQlycXN0cC0+cnFfcmVzLmhlYWRbMF0uaW92X2xlbiArPSBzaXplb2YodTMyKTsKKwlycXN0cC0+cnFfcmVzLmhlYWRbMF0uaW92X2xlbiArPSBzaXplb2YoX19iZTMyKTsKIAogCS8qIE5vdyBjYWxsIHRoZSBwcm9jZWR1cmUgaGFuZGxlciwgYW5kIGVuY29kZSBORlMgc3RhdHVzLiAqLwogCW5mc2VyciA9IHByb2MtPnBjX2Z1bmMocnFzdHAsIHJxc3RwLT5ycV9hcmdwLCBycXN0cC0+cnFfcmVzcCk7CmRpZmYgLS1naXQgYS9mcy9uZnNkL25mc3hkci5jIGIvZnMvbmZzZC9uZnN4ZHIuYwppbmRleCAxMTM1YzBkLi41NmViYjE0IDEwMDY0NAotLS0gYS9mcy9uZnNkL25mc3hkci5jCisrKyBiL2ZzL25mc2QvbmZzeGRyLmMKQEAgLTM3LDggKzM3LDggQEAKIC8qCiAgKiBYRFIgZnVuY3Rpb25zIGZvciBiYXNpYyBORlMgdHlwZXMKICAqLwotc3RhdGljIHUzMiAqCi1kZWNvZGVfZmgodTMyICpwLCBzdHJ1Y3Qgc3ZjX2ZoICpmaHApCitzdGF0aWMgX19iZTMyICoKK2RlY29kZV9maChfX2JlMzIgKnAsIHN0cnVjdCBzdmNfZmggKmZocCkKIHsKIAlmaF9pbml0KGZocCwgTkZTX0ZIU0laRSk7CiAJbWVtY3B5KCZmaHAtPmZoX2hhbmRsZS5maF9iYXNlLCBwLCBORlNfRkhTSVpFKTsKQEAgLTUwLDEzICs1MCwxMyBAQAogfQogCiAvKiBIZWxwZXIgZnVuY3Rpb24gZm9yIE5GU3YyIEFDTCBjb2RlICovCi11MzIgKm5mczJzdmNfZGVjb2RlX2ZoKHUzMiAqcCwgc3RydWN0IHN2Y19maCAqZmhwKQorX19iZTMyICpuZnMyc3ZjX2RlY29kZV9maChfX2JlMzIgKnAsIHN0cnVjdCBzdmNfZmggKmZocCkKIHsKIAlyZXR1cm4gZGVjb2RlX2ZoKHAsIGZocCk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdTMyICoKLWVuY29kZV9maCh1MzIgKnAsIHN0cnVjdCBzdmNfZmggKmZocCkKK3N0YXRpYyBpbmxpbmUgX19iZTMyICoKK2VuY29kZV9maChfX2JlMzIgKnAsIHN0cnVjdCBzdmNfZmggKmZocCkKIHsKIAltZW1jcHkocCwgJmZocC0+ZmhfaGFuZGxlLmZoX2Jhc2UsIE5GU19GSFNJWkUpOwogCXJldHVybiBwICsgKE5GU19GSFNJWkU+PiAyKTsKQEAgLTY2LDggKzY2LDggQEAKICAqIERlY29kZSBhIGZpbGUgbmFtZSBhbmQgbWFrZSBzdXJlIHRoYXQgdGhlIHBhdGggY29udGFpbnMKICAqIG5vIHNsYXNoZXMgb3IgbnVsbCBieXRlcy4KICAqLwotc3RhdGljIGlubGluZSB1MzIgKgotZGVjb2RlX2ZpbGVuYW1lKHUzMiAqcCwgY2hhciAqKm5hbXAsIGludCAqbGVucCkKK3N0YXRpYyBpbmxpbmUgX19iZTMyICoKK2RlY29kZV9maWxlbmFtZShfX2JlMzIgKnAsIGNoYXIgKipuYW1wLCBpbnQgKmxlbnApCiB7CiAJY2hhcgkJKm5hbWU7CiAJaW50CQlpOwpAQCAtODIsOCArODIsOCBAQAogCXJldHVybiBwOwogfQogCi1zdGF0aWMgaW5saW5lIHUzMiAqCi1kZWNvZGVfcGF0aG5hbWUodTMyICpwLCBjaGFyICoqbmFtcCwgaW50ICpsZW5wKQorc3RhdGljIGlubGluZSBfX2JlMzIgKgorZGVjb2RlX3BhdGhuYW1lKF9fYmUzMiAqcCwgY2hhciAqKm5hbXAsIGludCAqbGVucCkKIHsKIAljaGFyCQkqbmFtZTsKIAlpbnQJCWk7CkBAIC05OCw4ICs5OCw4IEBACiAJcmV0dXJuIHA7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdTMyICoKLWRlY29kZV9zYXR0cih1MzIgKnAsIHN0cnVjdCBpYXR0ciAqaWFwKQorc3RhdGljIGlubGluZSBfX2JlMzIgKgorZGVjb2RlX3NhdHRyKF9fYmUzMiAqcCwgc3RydWN0IGlhdHRyICppYXApCiB7CiAJdTMyCXRtcCwgdG1wMTsKIApAQCAtMTUxLDggKzE1MSw4IEBACiAJcmV0dXJuIHA7CiB9CiAKLXN0YXRpYyB1MzIgKgotZW5jb2RlX2ZhdHRyKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHUzMiAqcCwgc3RydWN0IHN2Y19maCAqZmhwLAorc3RhdGljIF9fYmUzMiAqCitlbmNvZGVfZmF0dHIoc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgX19iZTMyICpwLCBzdHJ1Y3Qgc3ZjX2ZoICpmaHAsCiAJICAgICBzdHJ1Y3Qga3N0YXQgKnN0YXQpCiB7CiAJc3RydWN0IGRlbnRyeQkqZGVudHJ5ID0gZmhwLT5maF9kZW50cnk7CkBAIC0xOTUsNyArMTk1LDcgQEAKIH0KIAogLyogSGVscGVyIGZ1bmN0aW9uIGZvciBORlN2MiBBQ0wgY29kZSAqLwotdTMyICpuZnMyc3ZjX2VuY29kZV9mYXR0cihzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCB1MzIgKnAsIHN0cnVjdCBzdmNfZmggKmZocCkKK19fYmUzMiAqbmZzMnN2Y19lbmNvZGVfZmF0dHIoc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgX19iZTMyICpwLCBzdHJ1Y3Qgc3ZjX2ZoICpmaHApCiB7CiAJc3RydWN0IGtzdGF0IHN0YXQ7CiAJdmZzX2dldGF0dHIoZmhwLT5maF9leHBvcnQtPmV4X21udCwgZmhwLT5maF9kZW50cnksICZzdGF0KTsKQEAgLTIwNiwxMyArMjA2LDEzIEBACiAgKiBYRFIgZGVjb2RlIGZ1bmN0aW9ucwogICovCiBpbnQKLW5mc3N2Y19kZWNvZGVfdm9pZChzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCB1MzIgKnAsIHZvaWQgKmR1bW15KQorbmZzc3ZjX2RlY29kZV92b2lkKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIF9fYmUzMiAqcCwgdm9pZCAqZHVtbXkpCiB7CiAJcmV0dXJuIHhkcl9hcmdzaXplX2NoZWNrKHJxc3RwLCBwKTsKIH0KIAogaW50Ci1uZnNzdmNfZGVjb2RlX2ZoYW5kbGUoc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgdTMyICpwLCBzdHJ1Y3QgbmZzZF9maGFuZGxlICphcmdzKQorbmZzc3ZjX2RlY29kZV9maGFuZGxlKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIF9fYmUzMiAqcCwgc3RydWN0IG5mc2RfZmhhbmRsZSAqYXJncykKIHsKIAlpZiAoIShwID0gZGVjb2RlX2ZoKHAsICZhcmdzLT5maCkpKQogCQlyZXR1cm4gMDsKQEAgLTIyMCw3ICsyMjAsNyBAQAogfQogCiBpbnQKLW5mc3N2Y19kZWNvZGVfc2F0dHJhcmdzKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHUzMiAqcCwKK25mc3N2Y19kZWNvZGVfc2F0dHJhcmdzKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIF9fYmUzMiAqcCwKIAkJCQkJc3RydWN0IG5mc2Rfc2F0dHJhcmdzICphcmdzKQogewogCWlmICghKHAgPSBkZWNvZGVfZmgocCwgJmFyZ3MtPmZoKSkKQEAgLTIzMSw3ICsyMzEsNyBAQAogfQogCiBpbnQKLW5mc3N2Y19kZWNvZGVfZGlyb3BhcmdzKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHUzMiAqcCwKK25mc3N2Y19kZWNvZGVfZGlyb3BhcmdzKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIF9fYmUzMiAqcCwKIAkJCQkJc3RydWN0IG5mc2RfZGlyb3BhcmdzICphcmdzKQogewogCWlmICghKHAgPSBkZWNvZGVfZmgocCwgJmFyZ3MtPmZoKSkKQEAgLTI0Miw3ICsyNDIsNyBAQAogfQogCiBpbnQKLW5mc3N2Y19kZWNvZGVfcmVhZGFyZ3Moc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgdTMyICpwLAorbmZzc3ZjX2RlY29kZV9yZWFkYXJncyhzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCBfX2JlMzIgKnAsCiAJCQkJCXN0cnVjdCBuZnNkX3JlYWRhcmdzICphcmdzKQogewogCXVuc2lnbmVkIGludCBsZW47CkBAIC0yNzMsNyArMjczLDcgQEAKIH0KIAogaW50Ci1uZnNzdmNfZGVjb2RlX3dyaXRlYXJncyhzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCB1MzIgKnAsCituZnNzdmNfZGVjb2RlX3dyaXRlYXJncyhzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCBfX2JlMzIgKnAsCiAJCQkJCXN0cnVjdCBuZnNkX3dyaXRlYXJncyAqYXJncykKIHsKIAl1bnNpZ25lZCBpbnQgbGVuOwpAQCAtMzAzLDcgKzMwMyw3IEBACiB9CiAKIGludAotbmZzc3ZjX2RlY29kZV9jcmVhdGVhcmdzKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHUzMiAqcCwKK25mc3N2Y19kZWNvZGVfY3JlYXRlYXJncyhzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCBfX2JlMzIgKnAsCiAJCQkJCXN0cnVjdCBuZnNkX2NyZWF0ZWFyZ3MgKmFyZ3MpCiB7CiAJaWYgKCEocCA9IGRlY29kZV9maChwLCAmYXJncy0+ZmgpKQpAQCAtMzE1LDcgKzMxNSw3IEBACiB9CiAKIGludAotbmZzc3ZjX2RlY29kZV9yZW5hbWVhcmdzKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHUzMiAqcCwKK25mc3N2Y19kZWNvZGVfcmVuYW1lYXJncyhzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCBfX2JlMzIgKnAsCiAJCQkJCXN0cnVjdCBuZnNkX3JlbmFtZWFyZ3MgKmFyZ3MpCiB7CiAJaWYgKCEocCA9IGRlY29kZV9maChwLCAmYXJncy0+ZmZoKSkKQEAgLTMyOCw3ICszMjgsNyBAQAogfQogCiBpbnQKLW5mc3N2Y19kZWNvZGVfcmVhZGxpbmthcmdzKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHUzMiAqcCwgc3RydWN0IG5mc2RfcmVhZGxpbmthcmdzICphcmdzKQorbmZzc3ZjX2RlY29kZV9yZWFkbGlua2FyZ3Moc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgX19iZTMyICpwLCBzdHJ1Y3QgbmZzZF9yZWFkbGlua2FyZ3MgKmFyZ3MpCiB7CiAJaWYgKCEocCA9IGRlY29kZV9maChwLCAmYXJncy0+ZmgpKSkKIAkJcmV0dXJuIDA7CkBAIC0zMzgsNyArMzM4LDcgQEAKIH0KIAogaW50Ci1uZnNzdmNfZGVjb2RlX2xpbmthcmdzKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHUzMiAqcCwKK25mc3N2Y19kZWNvZGVfbGlua2FyZ3Moc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgX19iZTMyICpwLAogCQkJCQlzdHJ1Y3QgbmZzZF9saW5rYXJncyAqYXJncykKIHsKIAlpZiAoIShwID0gZGVjb2RlX2ZoKHAsICZhcmdzLT5mZmgpKQpAQCAtMzUwLDcgKzM1MCw3IEBACiB9CiAKIGludAotbmZzc3ZjX2RlY29kZV9zeW1saW5rYXJncyhzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCB1MzIgKnAsCituZnNzdmNfZGVjb2RlX3N5bWxpbmthcmdzKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIF9fYmUzMiAqcCwKIAkJCQkJc3RydWN0IG5mc2Rfc3ltbGlua2FyZ3MgKmFyZ3MpCiB7CiAJaWYgKCEocCA9IGRlY29kZV9maChwLCAmYXJncy0+ZmZoKSkKQEAgLTM2Myw3ICszNjMsNyBAQAogfQogCiBpbnQKLW5mc3N2Y19kZWNvZGVfcmVhZGRpcmFyZ3Moc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgdTMyICpwLAorbmZzc3ZjX2RlY29kZV9yZWFkZGlyYXJncyhzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCBfX2JlMzIgKnAsCiAJCQkJCXN0cnVjdCBuZnNkX3JlYWRkaXJhcmdzICphcmdzKQogewogCWlmICghKHAgPSBkZWNvZGVfZmgocCwgJmFyZ3MtPmZoKSkpCkBAIC0zODIsMTMgKzM4MiwxMyBAQAogICogWERSIGVuY29kZSBmdW5jdGlvbnMKICAqLwogaW50Ci1uZnNzdmNfZW5jb2RlX3ZvaWQoc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgdTMyICpwLCB2b2lkICpkdW1teSkKK25mc3N2Y19lbmNvZGVfdm9pZChzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCBfX2JlMzIgKnAsIHZvaWQgKmR1bW15KQogewogCXJldHVybiB4ZHJfcmVzc2l6ZV9jaGVjayhycXN0cCwgcCk7CiB9CiAKIGludAotbmZzc3ZjX2VuY29kZV9hdHRyc3RhdChzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCB1MzIgKnAsCituZnNzdmNfZW5jb2RlX2F0dHJzdGF0KHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIF9fYmUzMiAqcCwKIAkJCQkJc3RydWN0IG5mc2RfYXR0cnN0YXQgKnJlc3ApCiB7CiAJcCA9IGVuY29kZV9mYXR0cihycXN0cCwgcCwgJnJlc3AtPmZoLCAmcmVzcC0+c3RhdCk7CkBAIC0zOTYsNyArMzk2LDcgQEAKIH0KIAogaW50Ci1uZnNzdmNfZW5jb2RlX2Rpcm9wcmVzKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHUzMiAqcCwKK25mc3N2Y19lbmNvZGVfZGlyb3ByZXMoc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgX19iZTMyICpwLAogCQkJCQlzdHJ1Y3QgbmZzZF9kaXJvcHJlcyAqcmVzcCkKIHsKIAlwID0gZW5jb2RlX2ZoKHAsICZyZXNwLT5maCk7CkBAIC00MDUsNyArNDA1LDcgQEAKIH0KIAogaW50Ci1uZnNzdmNfZW5jb2RlX3JlYWRsaW5rcmVzKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHUzMiAqcCwKK25mc3N2Y19lbmNvZGVfcmVhZGxpbmtyZXMoc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgX19iZTMyICpwLAogCQkJCQlzdHJ1Y3QgbmZzZF9yZWFkbGlua3JlcyAqcmVzcCkKIHsKIAkqcCsrID0gaHRvbmwocmVzcC0+bGVuKTsKQEAgLTQyMSw3ICs0MjEsNyBAQAogfQogCiBpbnQKLW5mc3N2Y19lbmNvZGVfcmVhZHJlcyhzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCB1MzIgKnAsCituZnNzdmNfZW5jb2RlX3JlYWRyZXMoc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgX19iZTMyICpwLAogCQkJCQlzdHJ1Y3QgbmZzZF9yZWFkcmVzICpyZXNwKQogewogCXAgPSBlbmNvZGVfZmF0dHIocnFzdHAsIHAsICZyZXNwLT5maCwgJnJlc3AtPnN0YXQpOwpAQCAtNDQwLDcgKzQ0MCw3IEBACiB9CiAKIGludAotbmZzc3ZjX2VuY29kZV9yZWFkZGlycmVzKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHUzMiAqcCwKK25mc3N2Y19lbmNvZGVfcmVhZGRpcnJlcyhzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCBfX2JlMzIgKnAsCiAJCQkJCXN0cnVjdCBuZnNkX3JlYWRkaXJyZXMgKnJlc3ApCiB7CiAJeGRyX3Jlc3NpemVfY2hlY2socnFzdHAsIHApOwpAQCAtNDUzLDcgKzQ1Myw3IEBACiB9CiAKIGludAotbmZzc3ZjX2VuY29kZV9zdGF0ZnNyZXMoc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgdTMyICpwLAorbmZzc3ZjX2VuY29kZV9zdGF0ZnNyZXMoc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgX19iZTMyICpwLAogCQkJCQlzdHJ1Y3QgbmZzZF9zdGF0ZnNyZXMgKnJlc3ApCiB7CiAJc3RydWN0IGtzdGF0ZnMJKnN0YXQgPSAmcmVzcC0+c3RhdHM7CkBAIC00NzEsNyArNDcxLDcgQEAKIAkJICAgIGludCBuYW1sZW4sIGxvZmZfdCBvZmZzZXQsIGlub190IGlubywgdW5zaWduZWQgaW50IGRfdHlwZSkKIHsKIAlzdHJ1Y3QgbmZzZF9yZWFkZGlycmVzICpjZCA9IGNvbnRhaW5lcl9vZihjY2QsIHN0cnVjdCBuZnNkX3JlYWRkaXJyZXMsIGNvbW1vbik7Ci0JdTMyCSpwID0gY2QtPmJ1ZmZlcjsKKwlfX2JlMzIJKnAgPSBjZC0+YnVmZmVyOwogCWludAlidWZsZW4sIHNsZW47CiAKIAkvKgpAQCAtNDk3LDcgKzQ5Nyw3IEBACiAJKnArKyA9IGh0b25sKCh1MzIpIGlubyk7CQkvKiBmaWxlIGlkICovCiAJcCAgICA9IHhkcl9lbmNvZGVfYXJyYXkocCwgbmFtZSwgbmFtbGVuKTsvKiBuYW1lIGxlbmd0aCAmIG5hbWUgKi8KIAljZC0+b2Zmc2V0ID0gcDsJCQkvKiByZW1lbWJlciBwb2ludGVyICovCi0JKnArKyA9IH4odTMyKSAwOwkJLyogb2Zmc2V0IG9mIG5leHQgZW50cnkgKi8KKwkqcCsrID0gaHRvbmwofjBVKTsJCS8qIG9mZnNldCBvZiBuZXh0IGVudHJ5ICovCiAKIAljZC0+YnVmbGVuID0gYnVmbGVuOwogCWNkLT5idWZmZXIgPSBwOwpAQCAtNTA5LDcgKzUwOSw3IEBACiAgKiBYRFIgcmVsZWFzZSBmdW5jdGlvbnMKICAqLwogaW50Ci1uZnNzdmNfcmVsZWFzZV9maGFuZGxlKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHUzMiAqcCwKK25mc3N2Y19yZWxlYXNlX2ZoYW5kbGUoc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgX19iZTMyICpwLAogCQkJCQlzdHJ1Y3QgbmZzZF9maGFuZGxlICpyZXNwKQogewogCWZoX3B1dCgmcmVzcC0+ZmgpOwpkaWZmIC0tZ2l0IGEvZnMvbmZzZC92ZnMuYyBiL2ZzL25mc2QvdmZzLmMKaW5kZXggMTE0MWJkMi4uYmI0ZDkyNiAxMDA2NDQKLS0tIGEvZnMvbmZzZC92ZnMuYworKysgYi9mcy9uZnNkL3Zmcy5jCkBAIC0xMTAsNyArMTEwLDcgQEAKIAlzdHJ1Y3QgZGVudHJ5ICpkZW50cnkgPSAqZHBwOwogCXN0cnVjdCB2ZnNtb3VudCAqbW50ID0gbW50Z2V0KGV4cC0+ZXhfbW50KTsKIAlzdHJ1Y3QgZGVudHJ5ICptb3VudHMgPSBkZ2V0KGRlbnRyeSk7Ci0JaW50IGVyciA9IG5mc19vazsKKwlpbnQgZXJyID0gMDsKIAogCXdoaWxlIChmb2xsb3dfZG93bigmbW50LCZtb3VudHMpJiZkX21vdW50cG9pbnQobW91bnRzKSk7CiAKQEAgLTE0OCwxNCArMTQ4LDE1IEBACiAgKiAgIGNsaWVudHMgYW5kIGlzIGV4cGxpY2l0bHkgZGlzYWxsb3dlZCBmb3IgTkZTdjMKICAqICAgICAgTmVpbEJyb3duIDxuZWlsYkBjc2UudW5zdy5lZHUuYXU+CiAgKi8KLWludAorX19iZTMyCiBuZnNkX2xvb2t1cChzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCBzdHJ1Y3Qgc3ZjX2ZoICpmaHAsIGNvbnN0IGNoYXIgKm5hbWUsCiAJCQkJCWludCBsZW4sIHN0cnVjdCBzdmNfZmggKnJlc2ZoKQogewogCXN0cnVjdCBzdmNfZXhwb3J0CSpleHA7CiAJc3RydWN0IGRlbnRyeQkJKmRwYXJlbnQ7CiAJc3RydWN0IGRlbnRyeQkJKmRlbnRyeTsKLQlpbnQJCQllcnI7CisJX19iZTMyCQkJZXJyOworCWludAkJCWhvc3RfZXJyOwogCiAJZHByaW50aygibmZzZDogbmZzZF9sb29rdXAoZmggJXMsICUuKnMpXG4iLCBTVkNGSF9mbXQoZmhwKSwgbGVuLG5hbWUpOwogCkBAIC0xOTMsNyArMTk0LDcgQEAKIAkJCWV4cDIgPSBleHBfcGFyZW50KGV4cC0+ZXhfY2xpZW50LCBtbnQsIGRlbnRyeSwKIAkJCQkJICAmcnFzdHAtPnJxX2NoYW5kbGUpOwogCQkJaWYgKElTX0VSUihleHAyKSkgewotCQkJCWVyciA9IFBUUl9FUlIoZXhwMik7CisJCQkJaG9zdF9lcnIgPSBQVFJfRVJSKGV4cDIpOwogCQkJCWRwdXQoZGVudHJ5KTsKIAkJCQltbnRwdXQobW50KTsKIAkJCQlnb3RvIG91dF9uZnNlcnI7CkBAIC0yMTAsMTQgKzIxMSwxNCBAQAogCX0gZWxzZSB7CiAJCWZoX2xvY2soZmhwKTsKIAkJZGVudHJ5ID0gbG9va3VwX29uZV9sZW4obmFtZSwgZHBhcmVudCwgbGVuKTsKLQkJZXJyID0gUFRSX0VSUihkZW50cnkpOworCQlob3N0X2VyciA9IFBUUl9FUlIoZGVudHJ5KTsKIAkJaWYgKElTX0VSUihkZW50cnkpKQogCQkJZ290byBvdXRfbmZzZXJyOwogCQkvKgogCQkgKiBjaGVjayBpZiB3ZSBoYXZlIGNyb3NzZWQgYSBtb3VudCBwb2ludCAuLi4KIAkJICovCiAJCWlmIChkX21vdW50cG9pbnQoZGVudHJ5KSkgewotCQkJaWYgKChlcnIgPSBuZnNkX2Nyb3NzX21udChycXN0cCwgJmRlbnRyeSwgJmV4cCkpKSB7CisJCQlpZiAoKGhvc3RfZXJyID0gbmZzZF9jcm9zc19tbnQocnFzdHAsICZkZW50cnksICZleHApKSkgewogCQkJCWRwdXQoZGVudHJ5KTsKIAkJCQlnb3RvIG91dF9uZnNlcnI7CiAJCQl9CkBAIC0yMzYsNyArMjM3LDcgQEAKIAlyZXR1cm4gZXJyOwogCiBvdXRfbmZzZXJyOgotCWVyciA9IG5mc2Vycm5vKGVycik7CisJZXJyID0gbmZzZXJybm8oaG9zdF9lcnIpOwogCWdvdG8gb3V0OwogfQogCkBAIC0yNDQsNyArMjQ1LDcgQEAKICAqIFNldCB2YXJpb3VzIGZpbGUgYXR0cmlidXRlcy4KICAqIE4uQi4gQWZ0ZXIgdGhpcyBjYWxsIGZocCBuZWVkcyBhbiBmaF9wdXQKICAqLwotaW50CitfX2JlMzIKIG5mc2Rfc2V0YXR0cihzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCBzdHJ1Y3Qgc3ZjX2ZoICpmaHAsIHN0cnVjdCBpYXR0ciAqaWFwLAogCSAgICAgaW50IGNoZWNrX2d1YXJkLCB0aW1lX3QgZ3VhcmR0aW1lKQogewpAQCAtMjUzLDcgKzI1NCw4IEBACiAJaW50CQlhY2Ntb2RlID0gTUFZX1NBVFRSOwogCWludAkJZnR5cGUgPSAwOwogCWludAkJaW1vZGU7Ci0JaW50CQllcnI7CisJX19iZTMyCQllcnI7CisJaW50CQlob3N0X2VycjsKIAlpbnQJCXNpemVfY2hhbmdlID0gMDsKIAogCWlmIChpYXAtPmlhX3ZhbGlkICYgKEFUVFJfQVRJTUUgfCBBVFRSX01USU1FIHwgQVRUUl9TSVpFKSkKQEAgLTMxOSwxOSArMzIxLDE5IEBACiAJCSAqIElmIHdlIGFyZSBjaGFuZ2luZyB0aGUgc2l6ZSBvZiB0aGUgZmlsZSwgdGhlbgogCQkgKiB3ZSBuZWVkIHRvIGJyZWFrIGFsbCBsZWFzZXMuCiAJCSAqLwotCQllcnIgPSBicmVha19sZWFzZShpbm9kZSwgRk1PREVfV1JJVEUgfCBPX05PTkJMT0NLKTsKLQkJaWYgKGVyciA9PSAtRVdPVUxEQkxPQ0spCi0JCQllcnIgPSAtRVRJTUVET1VUOwotCQlpZiAoZXJyKSAvKiBFTk9NRU0gb3IgRVdPVUxEQkxPQ0sgKi8KKwkJaG9zdF9lcnIgPSBicmVha19sZWFzZShpbm9kZSwgRk1PREVfV1JJVEUgfCBPX05PTkJMT0NLKTsKKwkJaWYgKGhvc3RfZXJyID09IC1FV09VTERCTE9DSykKKwkJCWhvc3RfZXJyID0gLUVUSU1FRE9VVDsKKwkJaWYgKGhvc3RfZXJyKSAvKiBFTk9NRU0gb3IgRVdPVUxEQkxPQ0sgKi8KIAkJCWdvdG8gb3V0X25mc2VycjsKIAotCQllcnIgPSBnZXRfd3JpdGVfYWNjZXNzKGlub2RlKTsKLQkJaWYgKGVycikKKwkJaG9zdF9lcnIgPSBnZXRfd3JpdGVfYWNjZXNzKGlub2RlKTsKKwkJaWYgKGhvc3RfZXJyKQogCQkJZ290byBvdXRfbmZzZXJyOwogCiAJCXNpemVfY2hhbmdlID0gMTsKLQkJZXJyID0gbG9ja3NfdmVyaWZ5X3RydW5jYXRlKGlub2RlLCBOVUxMLCBpYXAtPmlhX3NpemUpOwotCQlpZiAoZXJyKSB7CisJCWhvc3RfZXJyID0gbG9ja3NfdmVyaWZ5X3RydW5jYXRlKGlub2RlLCBOVUxMLCBpYXAtPmlhX3NpemUpOworCQlpZiAoaG9zdF9lcnIpIHsKIAkJCXB1dF93cml0ZV9hY2Nlc3MoaW5vZGUpOwogCQkJZ290byBvdXRfbmZzZXJyOwogCQl9CkBAIC0zNTcsOCArMzU5LDggQEAKIAllcnIgPSBuZnNlcnJfbm90c3luYzsKIAlpZiAoIWNoZWNrX2d1YXJkIHx8IGd1YXJkdGltZSA9PSBpbm9kZS0+aV9jdGltZS50dl9zZWMpIHsKIAkJZmhfbG9jayhmaHApOwotCQllcnIgPSBub3RpZnlfY2hhbmdlKGRlbnRyeSwgaWFwKTsKLQkJZXJyID0gbmZzZXJybm8oZXJyKTsKKwkJaG9zdF9lcnIgPSBub3RpZnlfY2hhbmdlKGRlbnRyeSwgaWFwKTsKKwkJZXJyID0gbmZzZXJybm8oaG9zdF9lcnIpOwogCQlmaF91bmxvY2soZmhwKTsKIAl9CiAJaWYgKHNpemVfY2hhbmdlKQpAQCAtMzcwLDcgKzM3Miw3IEBACiAJcmV0dXJuIGVycjsKIAogb3V0X25mc2VycjoKLQllcnIgPSBuZnNlcnJubyhlcnIpOworCWVyciA9IG5mc2Vycm5vKGhvc3RfZXJyKTsKIAlnb3RvIG91dDsKIH0KIApAQCAtNDIwLDExICs0MjIsMTIgQEAKIAlyZXR1cm4gZXJyb3I7CiB9CiAKLWludAorX19iZTMyCiBuZnNkNF9zZXRfbmZzNF9hY2woc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgc3RydWN0IHN2Y19maCAqZmhwLAogICAgIHN0cnVjdCBuZnM0X2FjbCAqYWNsKQogewotCWludCBlcnJvcjsKKwlfX2JlMzIgZXJyb3I7CisJaW50IGhvc3RfZXJyb3I7CiAJc3RydWN0IGRlbnRyeSAqZGVudHJ5OwogCXN0cnVjdCBpbm9kZSAqaW5vZGU7CiAJc3RydWN0IHBvc2l4X2FjbCAqcGFjbCA9IE5VTEwsICpkcGFjbCA9IE5VTEw7CkBAIC00NDAsMjAgKzQ0MywyMCBAQAogCWlmIChTX0lTRElSKGlub2RlLT5pX21vZGUpKQogCQlmbGFncyA9IE5GUzRfQUNMX0RJUjsKIAotCWVycm9yID0gbmZzNF9hY2xfbmZzdjRfdG9fcG9zaXgoYWNsLCAmcGFjbCwgJmRwYWNsLCBmbGFncyk7Ci0JaWYgKGVycm9yID09IC1FSU5WQUwpIHsKKwlob3N0X2Vycm9yID0gbmZzNF9hY2xfbmZzdjRfdG9fcG9zaXgoYWNsLCAmcGFjbCwgJmRwYWNsLCBmbGFncyk7CisJaWYgKGhvc3RfZXJyb3IgPT0gLUVJTlZBTCkgewogCQllcnJvciA9IG5mc2Vycl9hdHRybm90c3VwcDsKIAkJZ290byBvdXQ7Ci0JfSBlbHNlIGlmIChlcnJvciA8IDApCisJfSBlbHNlIGlmIChob3N0X2Vycm9yIDwgMCkKIAkJZ290byBvdXRfbmZzZXJyOwogCi0JZXJyb3IgPSBzZXRfbmZzdjRfYWNsX29uZShkZW50cnksIHBhY2wsIFBPU0lYX0FDTF9YQVRUUl9BQ0NFU1MpOwotCWlmIChlcnJvciA8IDApCisJaG9zdF9lcnJvciA9IHNldF9uZnN2NF9hY2xfb25lKGRlbnRyeSwgcGFjbCwgUE9TSVhfQUNMX1hBVFRSX0FDQ0VTUyk7CisJaWYgKGhvc3RfZXJyb3IgPCAwKQogCQlnb3RvIG91dF9uZnNlcnI7CiAKIAlpZiAoU19JU0RJUihpbm9kZS0+aV9tb2RlKSkgewotCQllcnJvciA9IHNldF9uZnN2NF9hY2xfb25lKGRlbnRyeSwgZHBhY2wsIFBPU0lYX0FDTF9YQVRUUl9ERUZBVUxUKTsKLQkJaWYgKGVycm9yIDwgMCkKKwkJaG9zdF9lcnJvciA9IHNldF9uZnN2NF9hY2xfb25lKGRlbnRyeSwgZHBhY2wsIFBPU0lYX0FDTF9YQVRUUl9ERUZBVUxUKTsKKwkJaWYgKGhvc3RfZXJyb3IgPCAwKQogCQkJZ290byBvdXRfbmZzZXJyOwogCX0KIApAQCAtNDY0LDcgKzQ2Nyw3IEBACiAJcG9zaXhfYWNsX3JlbGVhc2UoZHBhY2wpOwogCXJldHVybiAoZXJyb3IpOwogb3V0X25mc2VycjoKLQllcnJvciA9IG5mc2Vycm5vKGVycm9yKTsKKwllcnJvciA9IG5mc2Vycm5vKGhvc3RfZXJyb3IpOwogCWdvdG8gb3V0OwogfQogCkBAIC01NzEsMTQgKzU3NCwxNCBAQAogICAgIHsJMCwJCQkwCQkJCX0KIH07CiAKLWludAorX19iZTMyCiBuZnNkX2FjY2VzcyhzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCBzdHJ1Y3Qgc3ZjX2ZoICpmaHAsIHUzMiAqYWNjZXNzLCB1MzIgKnN1cHBvcnRlZCkKIHsKIAlzdHJ1Y3QgYWNjZXNzbWFwCSptYXA7CiAJc3RydWN0IHN2Y19leHBvcnQJKmV4cG9ydDsKIAlzdHJ1Y3QgZGVudHJ5CQkqZGVudHJ5OwogCXUzMgkJCXF1ZXJ5LCByZXN1bHQgPSAwLCBzcmVzdWx0ID0gMDsKLQl1bnNpZ25lZCBpbnQJCWVycm9yOworCV9fYmUzMgkJCWVycm9yOwogCiAJZXJyb3IgPSBmaF92ZXJpZnkocnFzdHAsIGZocCwgMCwgTUFZX05PUCk7CiAJaWYgKGVycm9yKQpAQCAtNTk4LDcgKzYwMSw3IEBACiAJcXVlcnkgPSAqYWNjZXNzOwogCWZvciAgKDsgbWFwLT5hY2Nlc3M7IG1hcCsrKSB7CiAJCWlmIChtYXAtPmFjY2VzcyAmIHF1ZXJ5KSB7Ci0JCQl1bnNpZ25lZCBpbnQgZXJyMjsKKwkJCV9fYmUzMiBlcnIyOwogCiAJCQlzcmVzdWx0IHw9IG1hcC0+YWNjZXNzOwogCkBAIC02MzcsMTMgKzY0MCwxNSBAQAogICogVGhlIGFjY2VzcyBhcmd1bWVudCBpbmRpY2F0ZXMgdGhlIHR5cGUgb2Ygb3BlbiAocmVhZC93cml0ZS9sb2NrKQogICogTi5CLiBBZnRlciB0aGlzIGNhbGwgZmhwIG5lZWRzIGFuIGZoX3B1dAogICovCi1pbnQKK19fYmUzMgogbmZzZF9vcGVuKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHN0cnVjdCBzdmNfZmggKmZocCwgaW50IHR5cGUsCiAJCQlpbnQgYWNjZXNzLCBzdHJ1Y3QgZmlsZSAqKmZpbHApCiB7CiAJc3RydWN0IGRlbnRyeQkqZGVudHJ5OwogCXN0cnVjdCBpbm9kZQkqaW5vZGU7Ci0JaW50CQlmbGFncyA9IE9fUkRPTkxZfE9fTEFSR0VGSUxFLCBlcnI7CisJaW50CQlmbGFncyA9IE9fUkRPTkxZfE9fTEFSR0VGSUxFOworCV9fYmUzMgkJZXJyOworCWludAkJaG9zdF9lcnI7CiAKIAkvKgogCSAqIElmIHdlIGdldCBoZXJlLCB0aGVuIHRoZSBjbGllbnQgaGFzIGFscmVhZHkgZG9uZSBhbiAib3BlbiIsCkBAIC02NzMsMTAgKzY3OCwxMCBAQAogCSAqIENoZWNrIHRvIHNlZSBpZiB0aGVyZSBhcmUgYW55IGxlYXNlcyBvbiB0aGlzIGZpbGUuCiAJICogVGhpcyBtYXkgYmxvY2sgd2hpbGUgbGVhc2VzIGFyZSBicm9rZW4uCiAJICovCi0JZXJyID0gYnJlYWtfbGVhc2UoaW5vZGUsIE9fTk9OQkxPQ0sgfCAoKGFjY2VzcyAmIE1BWV9XUklURSkgPyBGTU9ERV9XUklURSA6IDApKTsKLQlpZiAoZXJyID09IC1FV09VTERCTE9DSykKLQkJZXJyID0gLUVUSU1FRE9VVDsKLQlpZiAoZXJyKSAvKiBOT01FTSBvciBXT1VMREJMT0NLICovCisJaG9zdF9lcnIgPSBicmVha19sZWFzZShpbm9kZSwgT19OT05CTE9DSyB8ICgoYWNjZXNzICYgTUFZX1dSSVRFKSA/IEZNT0RFX1dSSVRFIDogMCkpOworCWlmIChob3N0X2VyciA9PSAtRVdPVUxEQkxPQ0spCisJCWhvc3RfZXJyID0gLUVUSU1FRE9VVDsKKwlpZiAoaG9zdF9lcnIpIC8qIE5PTUVNIG9yIFdPVUxEQkxPQ0sgKi8KIAkJZ290byBvdXRfbmZzZXJyOwogCiAJaWYgKGFjY2VzcyAmIE1BWV9XUklURSkgewpAQCAtNjg5LDEwICs2OTQsOSBAQAogCX0KIAkqZmlscCA9IGRlbnRyeV9vcGVuKGRnZXQoZGVudHJ5KSwgbW50Z2V0KGZocC0+ZmhfZXhwb3J0LT5leF9tbnQpLCBmbGFncyk7CiAJaWYgKElTX0VSUigqZmlscCkpCi0JCWVyciA9IFBUUl9FUlIoKmZpbHApOworCQlob3N0X2VyciA9IFBUUl9FUlIoKmZpbHApOwogb3V0X25mc2VycjoKLQlpZiAoZXJyKQotCQllcnIgPSBuZnNlcnJubyhlcnIpOworCWVyciA9IG5mc2Vycm5vKGhvc3RfZXJyKTsKIG91dDoKIAlyZXR1cm4gZXJyOwogfQpAQCAtODMwLDE0ICs4MzQsMTUgQEAKIAlyZXR1cm4gc2l6ZTsKIH0KIAotc3RhdGljIGludAorc3RhdGljIF9fYmUzMgogbmZzZF92ZnNfcmVhZChzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCBzdHJ1Y3Qgc3ZjX2ZoICpmaHAsIHN0cnVjdCBmaWxlICpmaWxlLAogICAgICAgICAgICAgICBsb2ZmX3Qgb2Zmc2V0LCBzdHJ1Y3Qga3ZlYyAqdmVjLCBpbnQgdmxlbiwgdW5zaWduZWQgbG9uZyAqY291bnQpCiB7CiAJc3RydWN0IGlub2RlICppbm9kZTsKIAlzdHJ1Y3QgcmFwYXJtcwkqcmE7CiAJbW1fc2VnbWVudF90CW9sZGZzOwotCWludAkJZXJyOworCV9fYmUzMgkJZXJyOworCWludAkJaG9zdF9lcnI7CiAKIAllcnIgPSBuZnNlcnJfcGVybTsKIAlpbm9kZSA9IGZpbGUtPmZfZGVudHJ5LT5kX2lub2RlOwpAQCAtODU1LDEyICs4NjAsMTIgQEAKIAogCWlmIChmaWxlLT5mX29wLT5zZW5kZmlsZSAmJiBycXN0cC0+cnFfc2VuZGZpbGVfb2spIHsKIAkJcnFzdHAtPnJxX3Jlc3VzZWQgPSAxOwotCQllcnIgPSBmaWxlLT5mX29wLT5zZW5kZmlsZShmaWxlLCAmb2Zmc2V0LCAqY291bnQsCisJCWhvc3RfZXJyID0gZmlsZS0+Zl9vcC0+c2VuZGZpbGUoZmlsZSwgJm9mZnNldCwgKmNvdW50LAogCQkJCQkJIG5mc2RfcmVhZF9hY3RvciwgcnFzdHApOwogCX0gZWxzZSB7CiAJCW9sZGZzID0gZ2V0X2ZzKCk7CiAJCXNldF9mcyhLRVJORUxfRFMpOwotCQllcnIgPSB2ZnNfcmVhZHYoZmlsZSwgKHN0cnVjdCBpb3ZlYyBfX3VzZXIgKil2ZWMsIHZsZW4sICZvZmZzZXQpOworCQlob3N0X2VyciA9IHZmc19yZWFkdihmaWxlLCAoc3RydWN0IGlvdmVjIF9fdXNlciAqKXZlYywgdmxlbiwgJm9mZnNldCk7CiAJCXNldF9mcyhvbGRmcyk7CiAJfQogCkBAIC04NzQsMTMgKzg3OSwxMyBAQAogCQlzcGluX3VubG9jaygmcmFiLT5wYl9sb2NrKTsKIAl9CiAKLQlpZiAoZXJyID49IDApIHsKLQkJbmZzZHN0YXRzLmlvX3JlYWQgKz0gZXJyOwotCQkqY291bnQgPSBlcnI7CisJaWYgKGhvc3RfZXJyID49IDApIHsKKwkJbmZzZHN0YXRzLmlvX3JlYWQgKz0gaG9zdF9lcnI7CisJCSpjb3VudCA9IGhvc3RfZXJyOwogCQllcnIgPSAwOwogCQlmc25vdGlmeV9hY2Nlc3MoZmlsZS0+Zl9kZW50cnkpOwogCX0gZWxzZSAKLQkJZXJyID0gbmZzZXJybm8oZXJyKTsKKwkJZXJyID0gbmZzZXJybm8oaG9zdF9lcnIpOwogb3V0OgogCXJldHVybiBlcnI7CiB9CkBAIC04OTUsNyArOTAwLDcgQEAKIAltdXRleF91bmxvY2soJmRlbnRyeS0+ZF9pbm9kZS0+aV9tdXRleCk7CiB9CiAKLXN0YXRpYyBpbnQKK3N0YXRpYyBfX2JlMzIKIG5mc2RfdmZzX3dyaXRlKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHN0cnVjdCBzdmNfZmggKmZocCwgc3RydWN0IGZpbGUgKmZpbGUsCiAJCQkJbG9mZl90IG9mZnNldCwgc3RydWN0IGt2ZWMgKnZlYywgaW50IHZsZW4sCiAJICAgCQkJdW5zaWduZWQgbG9uZyBjbnQsIGludCAqc3RhYmxlcCkKQEAgLTkwNCw3ICs5MDksOCBAQAogCXN0cnVjdCBkZW50cnkJCSpkZW50cnk7CiAJc3RydWN0IGlub2RlCQkqaW5vZGU7CiAJbW1fc2VnbWVudF90CQlvbGRmczsKLQlpbnQJCQllcnIgPSAwOworCV9fYmUzMgkJCWVyciA9IDA7CisJaW50CQkJaG9zdF9lcnI7CiAJaW50CQkJc3RhYmxlID0gKnN0YWJsZXA7CiAKICNpZmRlZiBNU05GUwpAQCAtOTQwLDE4ICs5NDYsMTggQEAKIAogCS8qIFdyaXRlIHRoZSBkYXRhLiAqLwogCW9sZGZzID0gZ2V0X2ZzKCk7IHNldF9mcyhLRVJORUxfRFMpOwotCWVyciA9IHZmc193cml0ZXYoZmlsZSwgKHN0cnVjdCBpb3ZlYyBfX3VzZXIgKil2ZWMsIHZsZW4sICZvZmZzZXQpOworCWhvc3RfZXJyID0gdmZzX3dyaXRldihmaWxlLCAoc3RydWN0IGlvdmVjIF9fdXNlciAqKXZlYywgdmxlbiwgJm9mZnNldCk7CiAJc2V0X2ZzKG9sZGZzKTsKLQlpZiAoZXJyID49IDApIHsKKwlpZiAoaG9zdF9lcnIgPj0gMCkgewogCQluZnNkc3RhdHMuaW9fd3JpdGUgKz0gY250OwogCQlmc25vdGlmeV9tb2RpZnkoZmlsZS0+Zl9kZW50cnkpOwogCX0KIAogCS8qIGNsZWFyIHNldHVpZC9zZXRnaWQgZmxhZyBhZnRlciB3cml0ZSAqLwotCWlmIChlcnIgPj0gMCAmJiAoaW5vZGUtPmlfbW9kZSAmIChTX0lTVUlEIHwgU19JU0dJRCkpKQorCWlmIChob3N0X2VyciA+PSAwICYmIChpbm9kZS0+aV9tb2RlICYgKFNfSVNVSUQgfCBTX0lTR0lEKSkpCiAJCWtpbGxfc3VpZChkZW50cnkpOwogCi0JaWYgKGVyciA+PSAwICYmIHN0YWJsZSkgeworCWlmIChob3N0X2VyciA+PSAwICYmIHN0YWJsZSkgewogCQlzdGF0aWMgaW5vX3QJbGFzdF9pbm87CiAJCXN0YXRpYyBkZXZfdAlsYXN0X2RldjsKIApAQCAtOTc3LDcgKzk4Myw3IEBACiAKIAkJCWlmIChpbm9kZS0+aV9zdGF0ZSAmIElfRElSVFkpIHsKIAkJCQlkcHJpbnRrKCJuZnNkOiB3cml0ZSBzeW5jICVkXG4iLCBjdXJyZW50LT5waWQpOwotCQkJCWVycj1uZnNkX3N5bmMoZmlsZSk7CisJCQkJaG9zdF9lcnI9bmZzZF9zeW5jKGZpbGUpOwogCQkJfQogI2lmIDAKIAkJCXdha2VfdXAoJmlub2RlLT5pX3dhaXQpOwpAQCAtOTg3LDExICs5OTMsMTEgQEAKIAkJbGFzdF9kZXYgPSBpbm9kZS0+aV9zYi0+c19kZXY7CiAJfQogCi0JZHByaW50aygibmZzZDogd3JpdGUgY29tcGxldGUgZXJyPSVkXG4iLCBlcnIpOwotCWlmIChlcnIgPj0gMCkKKwlkcHJpbnRrKCJuZnNkOiB3cml0ZSBjb21wbGV0ZSBob3N0X2Vycj0lZFxuIiwgaG9zdF9lcnIpOworCWlmIChob3N0X2VyciA+PSAwKQogCQllcnIgPSAwOwogCWVsc2UgCi0JCWVyciA9IG5mc2Vycm5vKGVycik7CisJCWVyciA9IG5mc2Vycm5vKGhvc3RfZXJyKTsKIG91dDoKIAlyZXR1cm4gZXJyOwogfQpAQCAtMTAwMSwxMiArMTAwNywxMiBAQAogICogb24gZW50cnkuIE9uIHJldHVybiwgKmNvdW50IGNvbnRhaW5zIHRoZSBudW1iZXIgb2YgYnl0ZXMgYWN0dWFsbHkgcmVhZC4KICAqIE4uQi4gQWZ0ZXIgdGhpcyBjYWxsIGZocCBuZWVkcyBhbiBmaF9wdXQKICAqLwotaW50CitfX2JlMzIKIG5mc2RfcmVhZChzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCBzdHJ1Y3Qgc3ZjX2ZoICpmaHAsIHN0cnVjdCBmaWxlICpmaWxlLAogCQlsb2ZmX3Qgb2Zmc2V0LCBzdHJ1Y3Qga3ZlYyAqdmVjLCBpbnQgdmxlbiwKIAkJdW5zaWduZWQgbG9uZyAqY291bnQpCiB7Ci0JaW50CQllcnI7CisJX19iZTMyCQllcnI7CiAKIAlpZiAoZmlsZSkgewogCQllcnIgPSBuZnNkX3Blcm1pc3Npb24oZmhwLT5maF9leHBvcnQsIGZocC0+ZmhfZGVudHJ5LApAQCAtMTAzMCwxMiArMTAzNiwxMiBAQAogICogVGhlIHN0YWJsZSBmbGFnIHJlcXVlc3RzIHN5bmNocm9ub3VzIHdyaXRlcy4KICAqIE4uQi4gQWZ0ZXIgdGhpcyBjYWxsIGZocCBuZWVkcyBhbiBmaF9wdXQKICAqLwotaW50CitfX2JlMzIKIG5mc2Rfd3JpdGUoc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgc3RydWN0IHN2Y19maCAqZmhwLCBzdHJ1Y3QgZmlsZSAqZmlsZSwKIAkJbG9mZl90IG9mZnNldCwgc3RydWN0IGt2ZWMgKnZlYywgaW50IHZsZW4sIHVuc2lnbmVkIGxvbmcgY250LAogCQlpbnQgKnN0YWJsZXApCiB7Ci0JaW50CQkJZXJyID0gMDsKKwlfX2JlMzIJCQllcnIgPSAwOwogCiAJaWYgKGZpbGUpIHsKIAkJZXJyID0gbmZzZF9wZXJtaXNzaW9uKGZocC0+ZmhfZXhwb3J0LCBmaHAtPmZoX2RlbnRyeSwKQEAgLTEwNjcsMTIgKzEwNzMsMTIgQEAKICAqIFVuZm9ydHVuYXRlbHkgd2UgY2Fubm90IGxvY2sgdGhlIGZpbGUgdG8gbWFrZSBzdXJlIHdlIHJldHVybiBmdWxsIFdDQwogICogZGF0YSB0byB0aGUgY2xpZW50LCBhcyBsb2NraW5nIGhhcHBlbnMgbG93ZXIgZG93biBpbiB0aGUgZmlsZXN5c3RlbS4KICAqLwotaW50CitfX2JlMzIKIG5mc2RfY29tbWl0KHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHN0cnVjdCBzdmNfZmggKmZocCwKICAgICAgICAgICAgICAgIGxvZmZfdCBvZmZzZXQsIHVuc2lnbmVkIGxvbmcgY291bnQpCiB7CiAJc3RydWN0IGZpbGUJKmZpbGU7Ci0JaW50CQllcnI7CisJX19iZTMyCQllcnI7CiAKIAlpZiAoKHU2NCljb3VudCA+IH4odTY0KW9mZnNldCkKIAkJcmV0dXJuIG5mc2Vycl9pbnZhbDsKQEAgLTExMDAsMTQgKzExMDYsMTUgQEAKICAqCiAgKiBOLkIuIEV2ZXJ5IGNhbGwgdG8gbmZzZF9jcmVhdGUgbmVlZHMgYW4gZmhfcHV0IGZvciBfYm90aF8gZmhwIGFuZCByZXNmaHAKICAqLwotaW50CitfX2JlMzIKIG5mc2RfY3JlYXRlKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHN0cnVjdCBzdmNfZmggKmZocCwKIAkJY2hhciAqZm5hbWUsIGludCBmbGVuLCBzdHJ1Y3QgaWF0dHIgKmlhcCwKIAkJaW50IHR5cGUsIGRldl90IHJkZXYsIHN0cnVjdCBzdmNfZmggKnJlc2ZocCkKIHsKIAlzdHJ1Y3QgZGVudHJ5CSpkZW50cnksICpkY2hpbGQgPSBOVUxMOwogCXN0cnVjdCBpbm9kZQkqZGlycDsKLQlpbnQJCWVycjsKKwlfX2JlMzIJCWVycjsKKwlpbnQJCWhvc3RfZXJyOwogCiAJZXJyID0gbmZzZXJyX3Blcm07CiAJaWYgKCFmbGVuKQpAQCAtMTEzNCw3ICsxMTQxLDcgQEAKIAkJLyogY2FsbGVkIGZyb20gbmZzZF9wcm9jX21rZGlyLCBvciBwb3NzaWJseSBuZnNkM19wcm9jX2NyZWF0ZSAqLwogCQlmaF9sb2NrX25lc3RlZChmaHAsIElfTVVURVhfUEFSRU5UKTsKIAkJZGNoaWxkID0gbG9va3VwX29uZV9sZW4oZm5hbWUsIGRlbnRyeSwgZmxlbik7Ci0JCWVyciA9IFBUUl9FUlIoZGNoaWxkKTsKKwkJaG9zdF9lcnIgPSBQVFJfRVJSKGRjaGlsZCk7CiAJCWlmIChJU19FUlIoZGNoaWxkKSkKIAkJCWdvdG8gb3V0X25mc2VycjsKIAkJZXJyID0gZmhfY29tcG9zZShyZXNmaHAsIGZocC0+ZmhfZXhwb3J0LCBkY2hpbGQsIGZocCk7CkBAIC0xMTcwLDI1ICsxMTc3LDI1IEBACiAJLyoKIAkgKiBHZXQgdGhlIGRpciBvcCBmdW5jdGlvbiBwb2ludGVyLgogCSAqLwotCWVyciA9IG5mc2Vycl9wZXJtOworCWVyciA9IDA7CiAJc3dpdGNoICh0eXBlKSB7CiAJY2FzZSBTX0lGUkVHOgotCQllcnIgPSB2ZnNfY3JlYXRlKGRpcnAsIGRjaGlsZCwgaWFwLT5pYV9tb2RlLCBOVUxMKTsKKwkJaG9zdF9lcnIgPSB2ZnNfY3JlYXRlKGRpcnAsIGRjaGlsZCwgaWFwLT5pYV9tb2RlLCBOVUxMKTsKIAkJYnJlYWs7CiAJY2FzZSBTX0lGRElSOgotCQllcnIgPSB2ZnNfbWtkaXIoZGlycCwgZGNoaWxkLCBpYXAtPmlhX21vZGUpOworCQlob3N0X2VyciA9IHZmc19ta2RpcihkaXJwLCBkY2hpbGQsIGlhcC0+aWFfbW9kZSk7CiAJCWJyZWFrOwogCWNhc2UgU19JRkNIUjoKIAljYXNlIFNfSUZCTEs6CiAJY2FzZSBTX0lGSUZPOgogCWNhc2UgU19JRlNPQ0s6Ci0JCWVyciA9IHZmc19ta25vZChkaXJwLCBkY2hpbGQsIGlhcC0+aWFfbW9kZSwgcmRldik7CisJCWhvc3RfZXJyID0gdmZzX21rbm9kKGRpcnAsIGRjaGlsZCwgaWFwLT5pYV9tb2RlLCByZGV2KTsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKIAkgICAgICAgIHByaW50aygibmZzZDogYmFkIGZpbGUgdHlwZSAlbyBpbiBuZnNkX2NyZWF0ZVxuIiwgdHlwZSk7Ci0JCWVyciA9IC1FSU5WQUw7CisJCWhvc3RfZXJyID0gLUVJTlZBTDsKIAl9Ci0JaWYgKGVyciA8IDApCisJaWYgKGhvc3RfZXJyIDwgMCkKIAkJZ290byBvdXRfbmZzZXJyOwogCiAJaWYgKEVYX0lTU1lOQyhmaHAtPmZoX2V4cG9ydCkpIHsKQEAgLTEyMDMsNyArMTIxMCw3IEBACiAJICogZGlyZWN0b3JpZXMgdmlhIE5GUy4KIAkgKi8KIAlpZiAoKGlhcC0+aWFfdmFsaWQgJj0gfihBVFRSX1VJRHxBVFRSX0dJRHxBVFRSX01PREUpKSAhPSAwKSB7Ci0JCWludCBlcnIyID0gbmZzZF9zZXRhdHRyKHJxc3RwLCByZXNmaHAsIGlhcCwgMCwgKHRpbWVfdCkwKTsKKwkJX19iZTMyIGVycjIgPSBuZnNkX3NldGF0dHIocnFzdHAsIHJlc2ZocCwgaWFwLCAwLCAodGltZV90KTApOwogCQlpZiAoZXJyMikKIAkJCWVyciA9IGVycjI7CiAJfQpAQCAtMTIxOCw3ICsxMjI1LDcgQEAKIAlyZXR1cm4gZXJyOwogCiBvdXRfbmZzZXJyOgotCWVyciA9IG5mc2Vycm5vKGVycik7CisJZXJyID0gbmZzZXJybm8oaG9zdF9lcnIpOwogCWdvdG8gb3V0OwogfQogCkBAIC0xMjI2LDE1ICsxMjMzLDE2IEBACiAvKgogICogTkZTdjMgdmVyc2lvbiBvZiBuZnNkX2NyZWF0ZQogICovCi1pbnQKK19fYmUzMgogbmZzZF9jcmVhdGVfdjMoc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgc3RydWN0IHN2Y19maCAqZmhwLAogCQljaGFyICpmbmFtZSwgaW50IGZsZW4sIHN0cnVjdCBpYXR0ciAqaWFwLAogCQlzdHJ1Y3Qgc3ZjX2ZoICpyZXNmaHAsIGludCBjcmVhdGVtb2RlLCB1MzIgKnZlcmlmaWVyLAotCSAgICAgICAgaW50ICp0cnVuY3ApCisJICAgICAgICBpbnQgKnRydW5jcCwgaW50ICpjcmVhdGVkKQogewogCXN0cnVjdCBkZW50cnkJKmRlbnRyeSwgKmRjaGlsZCA9IE5VTEw7CiAJc3RydWN0IGlub2RlCSpkaXJwOwotCWludAkJZXJyOworCV9fYmUzMgkJZXJyOworCWludAkJaG9zdF9lcnI7CiAJX191MzIJCXZfbXRpbWU9MCwgdl9hdGltZT0wOwogCWludAkJdl9tb2RlPTA7CiAKQEAgLTEyNjQsNyArMTI3Miw3IEBACiAJICogQ29tcG9zZSB0aGUgcmVzcG9uc2UgZmlsZSBoYW5kbGUuCiAJICovCiAJZGNoaWxkID0gbG9va3VwX29uZV9sZW4oZm5hbWUsIGRlbnRyeSwgZmxlbik7Ci0JZXJyID0gUFRSX0VSUihkY2hpbGQpOworCWhvc3RfZXJyID0gUFRSX0VSUihkY2hpbGQpOwogCWlmIChJU19FUlIoZGNoaWxkKSkKIAkJZ290byBvdXRfbmZzZXJyOwogCkBAIC0xMzIwLDkgKzEzMjgsMTEgQEAKIAkJZ290byBvdXQ7CiAJfQogCi0JZXJyID0gdmZzX2NyZWF0ZShkaXJwLCBkY2hpbGQsIGlhcC0+aWFfbW9kZSwgTlVMTCk7Ci0JaWYgKGVyciA8IDApCisJaG9zdF9lcnIgPSB2ZnNfY3JlYXRlKGRpcnAsIGRjaGlsZCwgaWFwLT5pYV9tb2RlLCBOVUxMKTsKKwlpZiAoaG9zdF9lcnIgPCAwKQogCQlnb3RvIG91dF9uZnNlcnI7CisJaWYgKGNyZWF0ZWQpCisJCSpjcmVhdGVkID0gMTsKIAogCWlmIChFWF9JU1NZTkMoZmhwLT5maF9leHBvcnQpKSB7CiAJCWVyciA9IG5mc2Vycm5vKG5mc2Rfc3luY19kaXIoZGVudHJ5KSk7CkBAIC0xMzUwLDcgKzEzNjAsNyBAQAogCSAqLwogIHNldF9hdHRyOgogCWlmICgoaWFwLT5pYV92YWxpZCAmPSB+KEFUVFJfVUlEfEFUVFJfR0lEKSkgIT0gMCkgewotIAkJaW50IGVycjIgPSBuZnNkX3NldGF0dHIocnFzdHAsIHJlc2ZocCwgaWFwLCAwLCAodGltZV90KTApOworIAkJX19iZTMyIGVycjIgPSBuZnNkX3NldGF0dHIocnFzdHAsIHJlc2ZocCwgaWFwLCAwLCAodGltZV90KTApOwogCQlpZiAoZXJyMikKIAkJCWVyciA9IGVycjI7CiAJfQpAQCAtMTM2OCw3ICsxMzc4LDcgQEAKICAJcmV0dXJuIGVycjsKICAKICBvdXRfbmZzZXJyOgotCWVyciA9IG5mc2Vycm5vKGVycik7CisJZXJyID0gbmZzZXJybm8oaG9zdF9lcnIpOwogCWdvdG8gb3V0OwogfQogI2VuZGlmIC8qIENPTkZJR19ORlNEX1YzICovCkBAIC0xMzc4LDEzICsxMzg4LDE0IEBACiAgKiBmaXRzIGludG8gdGhlIGJ1ZmZlci4gT24gcmV0dXJuLCBpdCBjb250YWlucyB0aGUgdHJ1ZSBsZW5ndGguCiAgKiBOLkIuIEFmdGVyIHRoaXMgY2FsbCBmaHAgbmVlZHMgYW4gZmhfcHV0CiAgKi8KLWludAorX19iZTMyCiBuZnNkX3JlYWRsaW5rKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHN0cnVjdCBzdmNfZmggKmZocCwgY2hhciAqYnVmLCBpbnQgKmxlbnApCiB7CiAJc3RydWN0IGRlbnRyeQkqZGVudHJ5OwogCXN0cnVjdCBpbm9kZQkqaW5vZGU7CiAJbW1fc2VnbWVudF90CW9sZGZzOwotCWludAkJZXJyOworCV9fYmUzMgkJZXJyOworCWludAkJaG9zdF9lcnI7CiAKIAllcnIgPSBmaF92ZXJpZnkocnFzdHAsIGZocCwgU19JRkxOSywgTUFZX05PUCk7CiAJaWYgKGVycikKQEAgLTE0MDMsMTggKzE0MTQsMTggQEAKIAkgKi8KIAogCW9sZGZzID0gZ2V0X2ZzKCk7IHNldF9mcyhLRVJORUxfRFMpOwotCWVyciA9IGlub2RlLT5pX29wLT5yZWFkbGluayhkZW50cnksIGJ1ZiwgKmxlbnApOworCWhvc3RfZXJyID0gaW5vZGUtPmlfb3AtPnJlYWRsaW5rKGRlbnRyeSwgYnVmLCAqbGVucCk7CiAJc2V0X2ZzKG9sZGZzKTsKIAotCWlmIChlcnIgPCAwKQorCWlmIChob3N0X2VyciA8IDApCiAJCWdvdG8gb3V0X25mc2VycjsKLQkqbGVucCA9IGVycjsKKwkqbGVucCA9IGhvc3RfZXJyOwogCWVyciA9IDA7CiBvdXQ6CiAJcmV0dXJuIGVycjsKIAogb3V0X25mc2VycjoKLQllcnIgPSBuZnNlcnJubyhlcnIpOworCWVyciA9IG5mc2Vycm5vKGhvc3RfZXJyKTsKIAlnb3RvIG91dDsKIH0KIApAQCAtMTQyMiw3ICsxNDMzLDcgQEAKICAqIENyZWF0ZSBhIHN5bWxpbmsgYW5kIGxvb2sgdXAgaXRzIGlub2RlCiAgKiBOLkIuIEFmdGVyIHRoaXMgY2FsbCBfYm90aF8gZmhwIGFuZCByZXNmaHAgbmVlZCBhbiBmaF9wdXQKICAqLwotaW50CitfX2JlMzIKIG5mc2Rfc3ltbGluayhzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCBzdHJ1Y3Qgc3ZjX2ZoICpmaHAsCiAJCQkJY2hhciAqZm5hbWUsIGludCBmbGVuLAogCQkJCWNoYXIgKnBhdGgsICBpbnQgcGxlbiwKQEAgLTE0MzAsNyArMTQ0MSw4IEBACiAJCQkJc3RydWN0IGlhdHRyICppYXApCiB7CiAJc3RydWN0IGRlbnRyeQkqZGVudHJ5LCAqZG5ldzsKLQlpbnQJCWVyciwgY2VycjsKKwlfX2JlMzIJCWVyciwgY2VycjsKKwlpbnQJCWhvc3RfZXJyOwogCXVtb2RlX3QJCW1vZGU7CiAKIAllcnIgPSBuZnNlcnJfbm9lbnQ7CkBAIC0xNDQ2LDcgKzE0NTgsNyBAQAogCWZoX2xvY2soZmhwKTsKIAlkZW50cnkgPSBmaHAtPmZoX2RlbnRyeTsKIAlkbmV3ID0gbG9va3VwX29uZV9sZW4oZm5hbWUsIGRlbnRyeSwgZmxlbik7Ci0JZXJyID0gUFRSX0VSUihkbmV3KTsKKwlob3N0X2VyciA9IFBUUl9FUlIoZG5ldyk7CiAJaWYgKElTX0VSUihkbmV3KSkKIAkJZ290byBvdXRfbmZzZXJyOwogCkBAIC0xNDU4LDIxICsxNDcwLDIxIEBACiAJaWYgKHVubGlrZWx5KHBhdGhbcGxlbl0gIT0gMCkpIHsKIAkJY2hhciAqcGF0aF9hbGxvY2VkID0ga21hbGxvYyhwbGVuKzEsIEdGUF9LRVJORUwpOwogCQlpZiAocGF0aF9hbGxvY2VkID09IE5VTEwpCi0JCQllcnIgPSAtRU5PTUVNOworCQkJaG9zdF9lcnIgPSAtRU5PTUVNOwogCQllbHNlIHsKIAkJCXN0cm5jcHkocGF0aF9hbGxvY2VkLCBwYXRoLCBwbGVuKTsKIAkJCXBhdGhfYWxsb2NlZFtwbGVuXSA9IDA7Ci0JCQllcnIgPSB2ZnNfc3ltbGluayhkZW50cnktPmRfaW5vZGUsIGRuZXcsIHBhdGhfYWxsb2NlZCwgbW9kZSk7CisJCQlob3N0X2VyciA9IHZmc19zeW1saW5rKGRlbnRyeS0+ZF9pbm9kZSwgZG5ldywgcGF0aF9hbGxvY2VkLCBtb2RlKTsKIAkJCWtmcmVlKHBhdGhfYWxsb2NlZCk7CiAJCX0KIAl9IGVsc2UKLQkJZXJyID0gdmZzX3N5bWxpbmsoZGVudHJ5LT5kX2lub2RlLCBkbmV3LCBwYXRoLCBtb2RlKTsKKwkJaG9zdF9lcnIgPSB2ZnNfc3ltbGluayhkZW50cnktPmRfaW5vZGUsIGRuZXcsIHBhdGgsIG1vZGUpOwogCi0JaWYgKCFlcnIpCisJaWYgKCFob3N0X2VycikgewogCQlpZiAoRVhfSVNTWU5DKGZocC0+ZmhfZXhwb3J0KSkKLQkJCWVyciA9IG5mc2Rfc3luY19kaXIoZGVudHJ5KTsKLQlpZiAoZXJyKQotCQllcnIgPSBuZnNlcnJubyhlcnIpOworCQkJaG9zdF9lcnIgPSBuZnNkX3N5bmNfZGlyKGRlbnRyeSk7CisJfQorCWVyciA9IG5mc2Vycm5vKGhvc3RfZXJyKTsKIAlmaF91bmxvY2soZmhwKTsKIAogCWNlcnIgPSBmaF9jb21wb3NlKHJlc2ZocCwgZmhwLT5maF9leHBvcnQsIGRuZXcsIGZocCk7CkBAIC0xNDgyLDcgKzE0OTQsNyBAQAogCXJldHVybiBlcnI7CiAKIG91dF9uZnNlcnI6Ci0JZXJyID0gbmZzZXJybm8oZXJyKTsKKwllcnIgPSBuZnNlcnJubyhob3N0X2Vycik7CiAJZ290byBvdXQ7CiB9CiAKQEAgLTE0OTAsMTMgKzE1MDIsMTQgQEAKICAqIENyZWF0ZSBhIGhhcmRsaW5rCiAgKiBOLkIuIEFmdGVyIHRoaXMgY2FsbCBfYm90aF8gZmZocCBhbmQgdGZocCBuZWVkIGFuIGZoX3B1dAogICovCi1pbnQKK19fYmUzMgogbmZzZF9saW5rKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHN0cnVjdCBzdmNfZmggKmZmaHAsCiAJCQkJY2hhciAqbmFtZSwgaW50IGxlbiwgc3RydWN0IHN2Y19maCAqdGZocCkKIHsKIAlzdHJ1Y3QgZGVudHJ5CSpkZGlyLCAqZG5ldywgKmRvbGQ7CiAJc3RydWN0IGlub2RlCSpkaXJwLCAqZGVzdDsKLQlpbnQJCWVycjsKKwlfX2JlMzIJCWVycjsKKwlpbnQJCWhvc3RfZXJyOwogCiAJZXJyID0gZmhfdmVyaWZ5KHJxc3RwLCBmZmhwLCBTX0lGRElSLCBNQVlfQ1JFQVRFKTsKIAlpZiAoZXJyKQpAQCAtMTUxNywyNCArMTUzMCwyNSBAQAogCWRpcnAgPSBkZGlyLT5kX2lub2RlOwogCiAJZG5ldyA9IGxvb2t1cF9vbmVfbGVuKG5hbWUsIGRkaXIsIGxlbik7Ci0JZXJyID0gUFRSX0VSUihkbmV3KTsKKwlob3N0X2VyciA9IFBUUl9FUlIoZG5ldyk7CiAJaWYgKElTX0VSUihkbmV3KSkKIAkJZ290byBvdXRfbmZzZXJyOwogCiAJZG9sZCA9IHRmaHAtPmZoX2RlbnRyeTsKIAlkZXN0ID0gZG9sZC0+ZF9pbm9kZTsKIAotCWVyciA9IHZmc19saW5rKGRvbGQsIGRpcnAsIGRuZXcpOwotCWlmICghZXJyKSB7CisJaG9zdF9lcnIgPSB2ZnNfbGluayhkb2xkLCBkaXJwLCBkbmV3KTsKKwlpZiAoIWhvc3RfZXJyKSB7CiAJCWlmIChFWF9JU1NZTkMoZmZocC0+ZmhfZXhwb3J0KSkgewogCQkJZXJyID0gbmZzZXJybm8obmZzZF9zeW5jX2RpcihkZGlyKSk7CiAJCQl3cml0ZV9pbm9kZV9ub3coZGVzdCwgMSk7CiAJCX0KKwkJZXJyID0gMDsKIAl9IGVsc2UgewotCQlpZiAoZXJyID09IC1FWERFViAmJiBycXN0cC0+cnFfdmVycyA9PSAyKQorCQlpZiAoaG9zdF9lcnIgPT0gLUVYREVWICYmIHJxc3RwLT5ycV92ZXJzID09IDIpCiAJCQllcnIgPSBuZnNlcnJfYWNjZXM7CiAJCWVsc2UKLQkJCWVyciA9IG5mc2Vycm5vKGVycik7CisJCQllcnIgPSBuZnNlcnJubyhob3N0X2Vycik7CiAJfQogCiAJZHB1dChkbmV3KTsKQEAgLTE1NDQsNyArMTU1OCw3IEBACiAJcmV0dXJuIGVycjsKIAogb3V0X25mc2VycjoKLQllcnIgPSBuZnNlcnJubyhlcnIpOworCWVyciA9IG5mc2Vycm5vKGhvc3RfZXJyKTsKIAlnb3RvIG91dF91bmxvY2s7CiB9CiAKQEAgLTE1NTIsMTMgKzE1NjYsMTQgQEAKICAqIFJlbmFtZSBhIGZpbGUKICAqIE4uQi4gQWZ0ZXIgdGhpcyBjYWxsIF9ib3RoXyBmZmhwIGFuZCB0ZmhwIG5lZWQgYW4gZmhfcHV0CiAgKi8KLWludAorX19iZTMyCiBuZnNkX3JlbmFtZShzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCBzdHJ1Y3Qgc3ZjX2ZoICpmZmhwLCBjaGFyICpmbmFtZSwgaW50IGZsZW4sCiAJCQkgICAgc3RydWN0IHN2Y19maCAqdGZocCwgY2hhciAqdG5hbWUsIGludCB0bGVuKQogewogCXN0cnVjdCBkZW50cnkJKmZkZW50cnksICp0ZGVudHJ5LCAqb2RlbnRyeSwgKm5kZW50cnksICp0cmFwOwogCXN0cnVjdCBpbm9kZQkqZmRpciwgKnRkaXI7Ci0JaW50CQllcnI7CisJX19iZTMyCQllcnI7CisJaW50CQlob3N0X2VycjsKIAogCWVyciA9IGZoX3ZlcmlmeShycXN0cCwgZmZocCwgU19JRkRJUiwgTUFZX1JFTU9WRSk7CiAJaWYgKGVycikKQEAgLTE1ODksMjIgKzE2MDQsMjIgQEAKIAlmaWxsX3ByZV93Y2ModGZocCk7CiAKIAlvZGVudHJ5ID0gbG9va3VwX29uZV9sZW4oZm5hbWUsIGZkZW50cnksIGZsZW4pOwotCWVyciA9IFBUUl9FUlIob2RlbnRyeSk7CisJaG9zdF9lcnIgPSBQVFJfRVJSKG9kZW50cnkpOwogCWlmIChJU19FUlIob2RlbnRyeSkpCiAJCWdvdG8gb3V0X25mc2VycjsKIAotCWVyciA9IC1FTk9FTlQ7CisJaG9zdF9lcnIgPSAtRU5PRU5UOwogCWlmICghb2RlbnRyeS0+ZF9pbm9kZSkKIAkJZ290byBvdXRfZHB1dF9vbGQ7Ci0JZXJyID0gLUVJTlZBTDsKKwlob3N0X2VyciA9IC1FSU5WQUw7CiAJaWYgKG9kZW50cnkgPT0gdHJhcCkKIAkJZ290byBvdXRfZHB1dF9vbGQ7CiAKIAluZGVudHJ5ID0gbG9va3VwX29uZV9sZW4odG5hbWUsIHRkZW50cnksIHRsZW4pOwotCWVyciA9IFBUUl9FUlIobmRlbnRyeSk7CisJaG9zdF9lcnIgPSBQVFJfRVJSKG5kZW50cnkpOwogCWlmIChJU19FUlIobmRlbnRyeSkpCiAJCWdvdG8gb3V0X2RwdXRfb2xkOwotCWVyciA9IC1FTk9URU1QVFk7CisJaG9zdF9lcnIgPSAtRU5PVEVNUFRZOwogCWlmIChuZGVudHJ5ID09IHRyYXApCiAJCWdvdG8gb3V0X2RwdXRfbmV3OwogCkBAIC0xNjEyLDE0ICsxNjI3LDE0IEBACiAJaWYgKChmZmhwLT5maF9leHBvcnQtPmV4X2ZsYWdzICYgTkZTRVhQX01TTkZTKSAmJgogCQkoKGF0b21pY19yZWFkKCZvZGVudHJ5LT5kX2NvdW50KSA+IDEpCiAJCSB8fCAoYXRvbWljX3JlYWQoJm5kZW50cnktPmRfY291bnQpID4gMSkpKSB7Ci0JCQllcnIgPSAtRVBFUk07CisJCQlob3N0X2VyciA9IC1FUEVSTTsKIAl9IGVsc2UKICNlbmRpZgotCWVyciA9IHZmc19yZW5hbWUoZmRpciwgb2RlbnRyeSwgdGRpciwgbmRlbnRyeSk7Ci0JaWYgKCFlcnIgJiYgRVhfSVNTWU5DKHRmaHAtPmZoX2V4cG9ydCkpIHsKLQkJZXJyID0gbmZzZF9zeW5jX2Rpcih0ZGVudHJ5KTsKLQkJaWYgKCFlcnIpCi0JCQllcnIgPSBuZnNkX3N5bmNfZGlyKGZkZW50cnkpOworCWhvc3RfZXJyID0gdmZzX3JlbmFtZShmZGlyLCBvZGVudHJ5LCB0ZGlyLCBuZGVudHJ5KTsKKwlpZiAoIWhvc3RfZXJyICYmIEVYX0lTU1lOQyh0ZmhwLT5maF9leHBvcnQpKSB7CisJCWhvc3RfZXJyID0gbmZzZF9zeW5jX2Rpcih0ZGVudHJ5KTsKKwkJaWYgKCFob3N0X2VycikKKwkJCWhvc3RfZXJyID0gbmZzZF9zeW5jX2RpcihmZGVudHJ5KTsKIAl9CiAKICBvdXRfZHB1dF9uZXc6CkBAIC0xNjI3LDggKzE2NDIsNyBAQAogIG91dF9kcHV0X29sZDoKIAlkcHV0KG9kZW50cnkpOwogIG91dF9uZnNlcnI6Ci0JaWYgKGVycikKLQkJZXJyID0gbmZzZXJybm8oZXJyKTsKKwllcnIgPSBuZnNlcnJubyhob3N0X2Vycik7CiAKIAkvKiB3ZSBjYW5ub3QgcmVwbHkgb24gZmhfdW5sb2NrIG9uIHRoZSB0d28gZmlsZWhhbmRsZXMsCiAJICogYXMgdGhhdCB3b3VsZCBkbyB0aGUgd3JvbmcgdGhpbmcgaWYgdGhlIHR3byBkaXJlY3RvcmllcwpAQCAtMTY0NywxMyArMTY2MSwxNCBAQAogICogVW5saW5rIGEgZmlsZSBvciBkaXJlY3RvcnkKICAqIE4uQi4gQWZ0ZXIgdGhpcyBjYWxsIGZocCBuZWVkcyBhbiBmaF9wdXQKICAqLwotaW50CitfX2JlMzIKIG5mc2RfdW5saW5rKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHN0cnVjdCBzdmNfZmggKmZocCwgaW50IHR5cGUsCiAJCQkJY2hhciAqZm5hbWUsIGludCBmbGVuKQogewogCXN0cnVjdCBkZW50cnkJKmRlbnRyeSwgKnJkZW50cnk7CiAJc3RydWN0IGlub2RlCSpkaXJwOwotCWludAkJZXJyOworCV9fYmUzMgkJZXJyOworCWludAkJaG9zdF9lcnI7CiAKIAllcnIgPSBuZnNlcnJfYWNjZXM7CiAJaWYgKCFmbGVuIHx8IGlzZG90ZW50KGZuYW1lLCBmbGVuKSkKQEAgLTE2NjcsNyArMTY4Miw3IEBACiAJZGlycCA9IGRlbnRyeS0+ZF9pbm9kZTsKIAogCXJkZW50cnkgPSBsb29rdXBfb25lX2xlbihmbmFtZSwgZGVudHJ5LCBmbGVuKTsKLQllcnIgPSBQVFJfRVJSKHJkZW50cnkpOworCWhvc3RfZXJyID0gUFRSX0VSUihyZGVudHJ5KTsKIAlpZiAoSVNfRVJSKHJkZW50cnkpKQogCQlnb3RvIG91dF9uZnNlcnI7CiAKQEAgLTE2ODQsMjIgKzE2OTksMjMgQEAKICNpZmRlZiBNU05GUwogCQlpZiAoKGZocC0+ZmhfZXhwb3J0LT5leF9mbGFncyAmIE5GU0VYUF9NU05GUykgJiYKIAkJCShhdG9taWNfcmVhZCgmcmRlbnRyeS0+ZF9jb3VudCkgPiAxKSkgewotCQkJZXJyID0gLUVQRVJNOworCQkJaG9zdF9lcnIgPSAtRVBFUk07CiAJCX0gZWxzZQogI2VuZGlmCi0JCWVyciA9IHZmc191bmxpbmsoZGlycCwgcmRlbnRyeSk7CisJCWhvc3RfZXJyID0gdmZzX3VubGluayhkaXJwLCByZGVudHJ5KTsKIAl9IGVsc2UgeyAvKiBJdCdzIFJNRElSICovCi0JCWVyciA9IHZmc19ybWRpcihkaXJwLCByZGVudHJ5KTsKKwkJaG9zdF9lcnIgPSB2ZnNfcm1kaXIoZGlycCwgcmRlbnRyeSk7CiAJfQogCiAJZHB1dChyZGVudHJ5KTsKIAotCWlmIChlcnIgPT0gMCAmJgotCSAgICBFWF9JU1NZTkMoZmhwLT5maF9leHBvcnQpKQotCQkJZXJyID0gbmZzZF9zeW5jX2RpcihkZW50cnkpOworCWlmIChob3N0X2VycikKKwkJZ290byBvdXRfbmZzZXJyOworCWlmIChFWF9JU1NZTkMoZmhwLT5maF9leHBvcnQpKQorCQlob3N0X2VyciA9IG5mc2Rfc3luY19kaXIoZGVudHJ5KTsKIAogb3V0X25mc2VycjoKLQllcnIgPSBuZnNlcnJubyhlcnIpOworCWVyciA9IG5mc2Vycm5vKGhvc3RfZXJyKTsKIG91dDoKIAlyZXR1cm4gZXJyOwogfQpAQCAtMTcwOCwxMSArMTcyNCwxMiBAQAogICogUmVhZCBlbnRyaWVzIGZyb20gYSBkaXJlY3RvcnkuCiAgKiBUaGUgIE5GU3YzLzQgdmVyaWZpZXIgd2UgaWdub3JlIGZvciBub3cuCiAgKi8KLWludAorX19iZTMyCiBuZnNkX3JlYWRkaXIoc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgc3RydWN0IHN2Y19maCAqZmhwLCBsb2ZmX3QgKm9mZnNldHAsIAogCSAgICAgc3RydWN0IHJlYWRkaXJfY2QgKmNkcCwgZW5jb2RlX2RlbnRfZm4gZnVuYykKIHsKLQlpbnQJCWVycjsKKwlfX2JlMzIJCWVycjsKKwlpbnQgCQlob3N0X2VycjsKIAlzdHJ1Y3QgZmlsZQkqZmlsZTsKIAlsb2ZmX3QJCW9mZnNldCA9ICpvZmZzZXRwOwogCkBAIC0xNzM0LDEwICsxNzUxLDEwIEBACiAKIAlkbyB7CiAJCWNkcC0+ZXJyID0gbmZzZXJyX2VvZjsgLyogd2lsbCBiZSBjbGVhcmVkIG9uIHN1Y2Nlc3NmdWwgcmVhZCAqLwotCQllcnIgPSB2ZnNfcmVhZGRpcihmaWxlLCAoZmlsbGRpcl90KSBmdW5jLCBjZHApOwotCX0gd2hpbGUgKGVyciA+PTAgJiYgY2RwLT5lcnIgPT0gbmZzX29rKTsKLQlpZiAoZXJyKQotCQllcnIgPSBuZnNlcnJubyhlcnIpOworCQlob3N0X2VyciA9IHZmc19yZWFkZGlyKGZpbGUsIChmaWxsZGlyX3QpIGZ1bmMsIGNkcCk7CisJfSB3aGlsZSAoaG9zdF9lcnIgPj0wICYmIGNkcC0+ZXJyID09IG5mc19vayk7CisJaWYgKGhvc3RfZXJyKQorCQllcnIgPSBuZnNlcnJubyhob3N0X2Vycik7CiAJZWxzZQogCQllcnIgPSBjZHAtPmVycjsKIAkqb2Zmc2V0cCA9IHZmc19sbHNlZWsoZmlsZSwgMCwgMSk7CkBAIC0xNzU0LDEwICsxNzcxLDEwIEBACiAgKiBHZXQgZmlsZSBzeXN0ZW0gc3RhdHMKICAqIE4uQi4gQWZ0ZXIgdGhpcyBjYWxsIGZocCBuZWVkcyBhbiBmaF9wdXQKICAqLwotaW50CitfX2JlMzIKIG5mc2Rfc3RhdGZzKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHN0cnVjdCBzdmNfZmggKmZocCwgc3RydWN0IGtzdGF0ZnMgKnN0YXQpCiB7Ci0JaW50IGVyciA9IGZoX3ZlcmlmeShycXN0cCwgZmhwLCAwLCBNQVlfTk9QKTsKKwlfX2JlMzIgZXJyID0gZmhfdmVyaWZ5KHJxc3RwLCBmaHAsIDAsIE1BWV9OT1ApOwogCWlmICghZXJyICYmIHZmc19zdGF0ZnMoZmhwLT5maF9kZW50cnksc3RhdCkpCiAJCWVyciA9IG5mc2Vycl9pbzsKIAlyZXR1cm4gZXJyOwpAQCAtMTc2Niw3ICsxNzgzLDcgQEAKIC8qCiAgKiBDaGVjayBmb3IgYSB1c2VyJ3MgYWNjZXNzIHBlcm1pc3Npb25zIHRvIHRoaXMgaW5vZGUuCiAgKi8KLWludAorX19iZTMyCiBuZnNkX3Blcm1pc3Npb24oc3RydWN0IHN2Y19leHBvcnQgKmV4cCwgc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBpbnQgYWNjKQogewogCXN0cnVjdCBpbm9kZQkqaW5vZGUgPSBkZW50cnktPmRfaW5vZGU7CmRpZmYgLS1naXQgYS9mcy9vY2ZzMi9jbHVzdGVyL25vZGVtYW5hZ2VyLmMgYi9mcy9vY2ZzMi9jbHVzdGVyL25vZGVtYW5hZ2VyLmMKaW5kZXggZTFmY2ViOC4uZDExNzUzYyAxMDA2NDQKLS0tIGEvZnMvb2NmczIvY2x1c3Rlci9ub2RlbWFuYWdlci5jCisrKyBiL2ZzL29jZnMyL2NsdXN0ZXIvbm9kZW1hbmFnZXIuYwpAQCAtMTUyLDE0ICsxNTIsMTYgQEAKIAlzdHJ1Y3QgbzJubV9ub2RlICpub2RlLCAqcmV0ID0gTlVMTDsKIAogCXdoaWxlICgqcCkgeworCQlpbnQgY21wOworCiAJCXBhcmVudCA9ICpwOwogCQlub2RlID0gcmJfZW50cnkocGFyZW50LCBzdHJ1Y3QgbzJubV9ub2RlLCBuZF9pcF9ub2RlKTsKIAotCQlpZiAobWVtY21wKCZpcF9uZWVkbGUsICZub2RlLT5uZF9pcHY0X2FkZHJlc3MsCi0JCSAgICAgICAgICAgc2l6ZW9mKGlwX25lZWRsZSkpIDwgMCkKKwkJY21wID0gbWVtY21wKCZpcF9uZWVkbGUsICZub2RlLT5uZF9pcHY0X2FkZHJlc3MsCisJCQkJc2l6ZW9mKGlwX25lZWRsZSkpOworCQlpZiAoY21wIDwgMCkKIAkJCXAgPSAmKCpwKS0+cmJfbGVmdDsKLQkJZWxzZSBpZiAobWVtY21wKCZpcF9uZWVkbGUsICZub2RlLT5uZF9pcHY0X2FkZHJlc3MsCi0JCQkgICAgICAgIHNpemVvZihpcF9uZWVkbGUpKSA+IDApCisJCWVsc2UgaWYgKGNtcCA+IDApCiAJCQlwID0gJigqcCktPnJiX3JpZ2h0OwogCQllbHNlIHsKIAkJCXJldCA9IG5vZGU7CmRpZmYgLS1naXQgYS9mcy9vY2ZzMi9maWxlLmMgYi9mcy9vY2ZzMi9maWxlLmMKaW5kZXggZDliYTBhOS4uMWJlNzRjNCAxMDA2NDQKLS0tIGEvZnMvb2NmczIvZmlsZS5jCisrKyBiL2ZzL29jZnMyL2ZpbGUuYwpAQCAtMzAsNiArMzAsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2hpZ2htZW0uaD4KICNpbmNsdWRlIDxsaW51eC9wYWdlbWFwLmg+CiAjaW5jbHVkZSA8bGludXgvdWlvLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KIAogI2RlZmluZSBNTE9HX01BU0tfUFJFRklYIE1MX0lOT0RFCiAjaW5jbHVkZSA8Y2x1c3Rlci9tYXNrbG9nLmg+CkBAIC02OTEsNiArNjkyLDEyIEBACiAJCX0KIAogCQlzdGFydF9vZmYgKz0gc2ItPnNfYmxvY2tzaXplOworCisJCS8qCisJCSAqIFZlcnkgbGFyZ2UgZXh0ZW5kcyBoYXZlIHRoZSBwb3RlbnRpYWwgdG8gbG9jayB1cAorCQkgKiB0aGUgY3B1IGZvciBleHRlbmRlZCBwZXJpb2RzIG9mIHRpbWUuCisJCSAqLworCQljb25kX3Jlc2NoZWQoKTsKIAl9CiAKIG91dDoKQEAgLTcyOCwzMSArNzM1LDM2IEBACiAJY2x1c3RlcnNfdG9fYWRkID0gb2NmczJfY2x1c3RlcnNfZm9yX2J5dGVzKGlub2RlLT5pX3NiLCBuZXdfaV9zaXplKSAtIAogCQlPQ0ZTMl9JKGlub2RlKS0+aXBfY2x1c3RlcnM7CiAKLQlpZiAoY2x1c3RlcnNfdG9fYWRkKSB7Ci0JCS8qIAotCQkgKiBwcm90ZWN0IHRoZSBwYWdlcyB0aGF0IG9jZnMyX3plcm9fZXh0ZW5kIGlzIGdvaW5nIHRvCi0JCSAqIGJlIHB1bGxpbmcgaW50byB0aGUgcGFnZSBjYWNoZS4uIHdlIGRvIHRoaXMgYmVmb3JlIHRoZQotCQkgKiBtZXRhZGF0YSBleHRlbmQgc28gdGhhdCB3ZSBkb24ndCBnZXQgaW50byB0aGUgc2l0dWF0aW9uCi0JCSAqIHdoZXJlIHdlJ3ZlIGV4dGVuZGVkIHRoZSBtZXRhZGF0YSBidXQgY2FuJ3QgZ2V0IHRoZSBkYXRhCi0JCSAqIGxvY2sgdG8gemVyby4KLQkJICovCi0JCXJldCA9IG9jZnMyX2RhdGFfbG9jayhpbm9kZSwgMSk7Ci0JCWlmIChyZXQgPCAwKSB7Ci0JCQltbG9nX2Vycm5vKHJldCk7Ci0JCQlnb3RvIG91dDsKLQkJfQorCS8qIAorCSAqIHByb3RlY3QgdGhlIHBhZ2VzIHRoYXQgb2NmczJfemVyb19leHRlbmQgaXMgZ29pbmcgdG8gYmUKKwkgKiBwdWxsaW5nIGludG8gdGhlIHBhZ2UgY2FjaGUuLiB3ZSBkbyB0aGlzIGJlZm9yZSB0aGUKKwkgKiBtZXRhZGF0YSBleHRlbmQgc28gdGhhdCB3ZSBkb24ndCBnZXQgaW50byB0aGUgc2l0dWF0aW9uCisJICogd2hlcmUgd2UndmUgZXh0ZW5kZWQgdGhlIG1ldGFkYXRhIGJ1dCBjYW4ndCBnZXQgdGhlIGRhdGEKKwkgKiBsb2NrIHRvIHplcm8uCisJICovCisJcmV0ID0gb2NmczJfZGF0YV9sb2NrKGlub2RlLCAxKTsKKwlpZiAocmV0IDwgMCkgeworCQltbG9nX2Vycm5vKHJldCk7CisJCWdvdG8gb3V0OworCX0KIAorCWlmIChjbHVzdGVyc190b19hZGQpIHsKIAkJcmV0ID0gb2NmczJfZXh0ZW5kX2FsbG9jYXRpb24oaW5vZGUsIGNsdXN0ZXJzX3RvX2FkZCk7CiAJCWlmIChyZXQgPCAwKSB7CiAJCQltbG9nX2Vycm5vKHJldCk7CiAJCQlnb3RvIG91dF91bmxvY2s7CiAJCX0KKwl9CiAKLQkJcmV0ID0gb2NmczJfemVyb19leHRlbmQoaW5vZGUsICh1NjQpbmV3X2lfc2l6ZSAtIHRhaWxfdG9fc2tpcCk7Ci0JCWlmIChyZXQgPCAwKSB7Ci0JCQltbG9nX2Vycm5vKHJldCk7Ci0JCQlnb3RvIG91dF91bmxvY2s7Ci0JCX0KKwkvKgorCSAqIENhbGwgdGhpcyBldmVuIGlmIHdlIGRvbid0IGFkZCBhbnkgY2x1c3RlcnMgdG8gdGhlIHRyZWUuIFdlCisJICogc3RpbGwgbmVlZCB0byB6ZXJvIHRoZSBhcmVhIGJldHdlZW4gdGhlIG9sZCBpX3NpemUgYW5kIHRoZQorCSAqIG5ldyBpX3NpemUuCisJICovCisJcmV0ID0gb2NmczJfemVyb19leHRlbmQoaW5vZGUsICh1NjQpbmV3X2lfc2l6ZSAtIHRhaWxfdG9fc2tpcCk7CisJaWYgKHJldCA8IDApIHsKKwkJbWxvZ19lcnJubyhyZXQpOworCQlnb3RvIG91dF91bmxvY2s7CiAJfQogCiAJaWYgKCF0YWlsX3RvX3NraXApIHsKQEAgLTc2NCw4ICs3NzYsNyBAQAogCX0KIAogb3V0X3VubG9jazoKLQlpZiAoY2x1c3RlcnNfdG9fYWRkKSAvKiB0aGlzIGlzIHRoZSBvbmx5IGNhc2UgaW4gd2hpY2ggd2UgbG9jayAqLwotCQlvY2ZzMl9kYXRhX3VubG9jayhpbm9kZSwgMSk7CisJb2NmczJfZGF0YV91bmxvY2soaW5vZGUsIDEpOwogCiBvdXQ6CiAJcmV0dXJuIHJldDsKZGlmZiAtLWdpdCBhL2ZzL29jZnMyL25hbWVpLmMgYi9mcy9vY2ZzMi9uYW1laS5jCmluZGV4IDI1OTE1NWYuLmE1N2I3NTEgMTAwNjQ0Ci0tLSBhL2ZzL29jZnMyL25hbWVpLmMKKysrIGIvZnMvb2NmczIvbmFtZWkuYwpAQCAtMTA4NSwxNCArMTA4NSw2IEBACiAJCQlCVUcoKTsKIAl9CiAKLQlpZiAoYXRvbWljX3JlYWQoJm9sZF9kZW50cnktPmRfY291bnQpID4gMikgewotCQlzaHJpbmtfZGNhY2hlX3BhcmVudChvbGRfZGVudHJ5KTsKLQkJaWYgKGF0b21pY19yZWFkKCZvbGRfZGVudHJ5LT5kX2NvdW50KSA+IDIpIHsKLQkJCXN0YXR1cyA9IC1FQlVTWTsKLQkJCWdvdG8gYmFpbDsKLQkJfQotCX0KLQogCS8qIEFzc3VtZSBhIGRpcmVjdG9yeSBoZWlyYXJjaHkgdGh1c2x5OgogCSAqIGEvYi9jCiAJICogYS9kCmRpZmYgLS1naXQgYS9mcy9vY2ZzMi9zdXBlci5jIGIvZnMvb2NmczIvc3VwZXIuYwppbmRleCA0YzI5Y2Q3Li43NmI0NmViIDEwMDY0NAotLS0gYS9mcy9vY2ZzMi9zdXBlci5jCisrKyBiL2ZzL29jZnMyL3N1cGVyLmMKQEAgLTMzOSw3ICszMzksNyBAQAogCiAjaWYgQklUU19QRVJfTE9ORyA9PSAzMgogIyBpZiBkZWZpbmVkKENPTkZJR19MQkQpCi0JQlVHX09OKHNpemVvZihzZWN0b3JfdCkgIT0gOCk7CisJQlVJTERfQlVHX09OKHNpemVvZihzZWN0b3JfdCkgIT0gOCk7CiAJcGFnZWZhY3RvciA9IFBBR0VfQ0FDSEVfU0laRTsKIAliaXRzaGlmdCA9IEJJVFNfUEVSX0xPTkc7CiAjIGVsc2UKZGlmZiAtLWdpdCBhL2ZzL3BhcnRpdGlvbnMvY2hlY2suYyBiL2ZzL3BhcnRpdGlvbnMvY2hlY2suYwppbmRleCA1MWM2YTc0Li42ZmI0YjYxIDEwMDY0NAotLS0gYS9mcy9wYXJ0aXRpb25zL2NoZWNrLmMKKysrIGIvZnMvcGFydGl0aW9ucy9jaGVjay5jCkBAIC0zNzYsMTggKzM3Niw0OCBAQAogCXJldHVybiBuYW1lOwogfQogCi1zdGF0aWMgdm9pZCBkaXNrX3N5c2ZzX3N5bWxpbmtzKHN0cnVjdCBnZW5kaXNrICpkaXNrKQorc3RhdGljIGludCBkaXNrX3N5c2ZzX3N5bWxpbmtzKHN0cnVjdCBnZW5kaXNrICpkaXNrKQogewogCXN0cnVjdCBkZXZpY2UgKnRhcmdldCA9IGdldF9kZXZpY2UoZGlzay0+ZHJpdmVyZnNfZGV2KTsKKwlpbnQgZXJyOworCWNoYXIgKmRpc2tfbmFtZSA9IE5VTEw7CisKIAlpZiAodGFyZ2V0KSB7Ci0JCWNoYXIgKmRpc2tfbmFtZSA9IG1ha2VfYmxvY2tfbmFtZShkaXNrKTsKLQkJc3lzZnNfY3JlYXRlX2xpbmsoJmRpc2stPmtvYmosJnRhcmdldC0+a29iaiwiZGV2aWNlIik7Ci0JCWlmIChkaXNrX25hbWUpIHsKLQkJCXN5c2ZzX2NyZWF0ZV9saW5rKCZ0YXJnZXQtPmtvYmosJmRpc2stPmtvYmosZGlza19uYW1lKTsKLQkJCWtmcmVlKGRpc2tfbmFtZSk7CisJCWRpc2tfbmFtZSA9IG1ha2VfYmxvY2tfbmFtZShkaXNrKTsKKwkJaWYgKCFkaXNrX25hbWUpIHsKKwkJCWVyciA9IC1FTk9NRU07CisJCQlnb3RvIGVycl9vdXQ7CiAJCX0KKworCQllcnIgPSBzeXNmc19jcmVhdGVfbGluaygmZGlzay0+a29iaiwgJnRhcmdldC0+a29iaiwgImRldmljZSIpOworCQlpZiAoZXJyKQorCQkJZ290byBlcnJfb3V0X2Rpc2tfbmFtZTsKKworCQllcnIgPSBzeXNmc19jcmVhdGVfbGluaygmdGFyZ2V0LT5rb2JqLCAmZGlzay0+a29iaiwgZGlza19uYW1lKTsKKwkJaWYgKGVycikKKwkJCWdvdG8gZXJyX291dF9kZXZfbGluazsKIAl9Ci0Jc3lzZnNfY3JlYXRlX2xpbmsoJmRpc2stPmtvYmosICZibG9ja19zdWJzeXMua3NldC5rb2JqLCAic3Vic3lzdGVtIik7CisKKwllcnIgPSBzeXNmc19jcmVhdGVfbGluaygmZGlzay0+a29iaiwgJmJsb2NrX3N1YnN5cy5rc2V0LmtvYmosCisJCQkJInN1YnN5c3RlbSIpOworCWlmIChlcnIpCisJCWdvdG8gZXJyX291dF9kaXNrX25hbWVfbG5rOworCisJa2ZyZWUoZGlza19uYW1lKTsKKworCXJldHVybiAwOworCitlcnJfb3V0X2Rpc2tfbmFtZV9sbms6CisJaWYgKHRhcmdldCkgeworCQlzeXNmc19yZW1vdmVfbGluaygmdGFyZ2V0LT5rb2JqLCBkaXNrX25hbWUpOworZXJyX291dF9kZXZfbGluazoKKwkJc3lzZnNfcmVtb3ZlX2xpbmsoJmRpc2stPmtvYmosICJkZXZpY2UiKTsKK2Vycl9vdXRfZGlza19uYW1lOgorCQlrZnJlZShkaXNrX25hbWUpOworZXJyX291dDoKKwkJcHV0X2RldmljZSh0YXJnZXQpOworCX0KKwlyZXR1cm4gZXJyOwogfQogCiAvKiBOb3QgZXhwb3J0ZWQsIGhlbHBlciB0byBhZGRfZGlzaygpLiAqLwpAQCAtNDA2LDcgKzQzNiwxMSBAQAogCQkqcyA9ICchJzsKIAlpZiAoKGVyciA9IGtvYmplY3RfYWRkKCZkaXNrLT5rb2JqKSkpCiAJCXJldHVybjsKLQlkaXNrX3N5c2ZzX3N5bWxpbmtzKGRpc2spOworCWVyciA9IGRpc2tfc3lzZnNfc3ltbGlua3MoZGlzayk7CisJaWYgKGVycikgeworCQlrb2JqZWN0X2RlbCgmZGlzay0+a29iaik7CisJCXJldHVybjsKKwl9CiAgCWRpc2tfc3lzZnNfYWRkX3N1YmRpcnMoZGlzayk7CiAKIAkvKiBObyBtaW5vcnMgdG8gdXNlIGZvciBwYXJ0aXRpb25zICovCmRpZmYgLS1naXQgYS9mcy9wcm9jL2Jhc2UuYyBiL2ZzL3Byb2MvYmFzZS5jCmluZGV4IDgyZGE1NWIuLjhkZjI3NDAxIDEwMDY0NAotLS0gYS9mcy9wcm9jL2Jhc2UuYworKysgYi9mcy9wcm9jL2Jhc2UuYwpAQCAtNzIsNiArNzIsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2F1ZGl0Lmg+CiAjaW5jbHVkZSA8bGludXgvcG9sbC5oPgogI2luY2x1ZGUgPGxpbnV4L25zcHJveHkuaD4KKyNpbmNsdWRlIDxsaW51eC9vb20uaD4KICNpbmNsdWRlICJpbnRlcm5hbC5oIgogCiAvKiBOT1RFOgpAQCAtODYsNyArODcsNyBAQAogCiAKIC8qIFdvcnN0IGNhc2UgYnVmZmVyIHNpemUgbmVlZGVkIGZvciBob2xkaW5nIGFuIGludGVnZXIuICovCi0jZGVmaW5lIFBST0NfTlVNQlVGIDEwCisjZGVmaW5lIFBST0NfTlVNQlVGIDEzCiAKIHN0cnVjdCBwaWRfZW50cnkgewogCWludCBsZW47CkBAIC02ODksNyArNjkwLDggQEAKIAlpZiAoY29weV9mcm9tX3VzZXIoYnVmZmVyLCBidWYsIGNvdW50KSkKIAkJcmV0dXJuIC1FRkFVTFQ7CiAJb29tX2FkanVzdCA9IHNpbXBsZV9zdHJ0b2woYnVmZmVyLCAmZW5kLCAwKTsKLQlpZiAoKG9vbV9hZGp1c3QgPCAtMTYgfHwgb29tX2FkanVzdCA+IDE1KSAmJiBvb21fYWRqdXN0ICE9IE9PTV9ESVNBQkxFKQorCWlmICgob29tX2FkanVzdCA8IE9PTV9BREpVU1RfTUlOIHx8IG9vbV9hZGp1c3QgPiBPT01fQURKVVNUX01BWCkgJiYKKwkgICAgIG9vbV9hZGp1c3QgIT0gT09NX0RJU0FCTEUpCiAJCXJldHVybiAtRUlOVkFMOwogCWlmICgqZW5kID09ICdcbicpCiAJCWVuZCsrOwpkaWZmIC0tZ2l0IGEvZnMvcmVpc2VyZnMvam91cm5hbC5jIGIvZnMvcmVpc2VyZnMvam91cm5hbC5jCmluZGV4IGFkOGNiYzQuLjg1Y2UyMzIgMTAwNjQ0Ci0tLSBhL2ZzL3JlaXNlcmZzL2pvdXJuYWwuYworKysgYi9mcy9yZWlzZXJmcy9qb3VybmFsLmMKQEAgLTUzLDYgKzUzLDcgQEAKICNpbmNsdWRlIDxsaW51eC93b3JrcXVldWUuaD4KICNpbmNsdWRlIDxsaW51eC93cml0ZWJhY2suaD4KICNpbmNsdWRlIDxsaW51eC9ibGtkZXYuaD4KKyNpbmNsdWRlIDxsaW51eC9iYWNraW5nLWRldi5oPgogCiAvKiBnZXRzIGEgc3RydWN0IHJlaXNlcmZzX2pvdXJuYWxfbGlzdCAqIGZyb20gYSBsaXN0IGhlYWQgKi8KICNkZWZpbmUgSk9VUk5BTF9MSVNUX0VOVFJZKGgpIChsaXN0X2VudHJ5KChoKSwgc3RydWN0IHJlaXNlcmZzX2pvdXJuYWxfbGlzdCwgXApAQCAtOTcwLDcgKzk3MSw3IEBACiAJREVGSU5FX1dBSVQod2FpdCk7CiAJc3RydWN0IHJlaXNlcmZzX2pvdXJuYWwgKmogPSBTQl9KT1VSTkFMKHMpOwogCWlmIChhdG9taWNfcmVhZCgmai0+al9hc3luY190aHJvdHRsZSkpCi0JCWJsa19jb25nZXN0aW9uX3dhaXQoV1JJVEUsIEhaIC8gMTApOworCQljb25nZXN0aW9uX3dhaXQoV1JJVEUsIEhaIC8gMTApOwogCXJldHVybiAwOwogfQogCmRpZmYgLS1naXQgYS9mcy9yZWlzZXJmcy9zdXBlci5jIGIvZnMvcmVpc2VyZnMvc3VwZXIuYwppbmRleCBjODlhYTIzLi4xNzI0OTk5IDEwMDY0NAotLS0gYS9mcy9yZWlzZXJmcy9zdXBlci5jCisrKyBiL2ZzL3JlaXNlcmZzL3N1cGVyLmMKQEAgLTQzMCwyMSArNDMwLDMwIEBACiAJcmV0dXJuIGpvdXJuYWxfZW5kKCZ0aCwgaW5vZGUtPmlfc2IsIEpPVVJOQUxfUEVSX0JBTEFOQ0VfQ05UKTsKIH0KIAorc3RhdGljIHZvaWQgcmVpc2VyZnNfa2lsbF9zYihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnMpCit7CisJaWYgKFJFSVNFUkZTX1NCKHMpKSB7CisJCWlmIChSRUlTRVJGU19TQihzKS0+eGF0dHJfcm9vdCkgeworCQkJZF9pbnZhbGlkYXRlKFJFSVNFUkZTX1NCKHMpLT54YXR0cl9yb290KTsKKwkJCWRwdXQoUkVJU0VSRlNfU0IocyktPnhhdHRyX3Jvb3QpOworCQkJUkVJU0VSRlNfU0IocyktPnhhdHRyX3Jvb3QgPSBOVUxMOworCQl9CisKKwkJaWYgKFJFSVNFUkZTX1NCKHMpLT5wcml2X3Jvb3QpIHsKKwkJCWRfaW52YWxpZGF0ZShSRUlTRVJGU19TQihzKS0+cHJpdl9yb290KTsKKwkJCWRwdXQoUkVJU0VSRlNfU0IocyktPnByaXZfcm9vdCk7CisJCQlSRUlTRVJGU19TQihzKS0+cHJpdl9yb290ID0gTlVMTDsKKwkJfQorCX0KKworCWtpbGxfYmxvY2tfc3VwZXIocyk7Cit9CisKIHN0YXRpYyB2b2lkIHJlaXNlcmZzX3B1dF9zdXBlcihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnMpCiB7CiAJc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZSB0aDsKIAl0aC50X3RyYW5zX2lkID0gMDsKIAotCWlmIChSRUlTRVJGU19TQihzKS0+eGF0dHJfcm9vdCkgewotCQlkX2ludmFsaWRhdGUoUkVJU0VSRlNfU0IocyktPnhhdHRyX3Jvb3QpOwotCQlkcHV0KFJFSVNFUkZTX1NCKHMpLT54YXR0cl9yb290KTsKLQl9Ci0KLQlpZiAoUkVJU0VSRlNfU0IocyktPnByaXZfcm9vdCkgewotCQlkX2ludmFsaWRhdGUoUkVJU0VSRlNfU0IocyktPnByaXZfcm9vdCk7Ci0JCWRwdXQoUkVJU0VSRlNfU0IocyktPnByaXZfcm9vdCk7Ci0JfQotCiAJLyogY2hhbmdlIGZpbGUgc3lzdGVtIHN0YXRlIHRvIGN1cnJlbnQgc3RhdGUgaWYgaXQgd2FzIG1vdW50ZWQgd2l0aCByZWFkLXdyaXRlIHBlcm1pc3Npb25zICovCiAJaWYgKCEocy0+c19mbGFncyAmIE1TX1JET05MWSkpIHsKIAkJaWYgKCFqb3VybmFsX2JlZ2luKCZ0aCwgcywgMTApKSB7CkBAIC0xNjEwLDYgKzE2MTksNyBAQAogCQkgICAgICAiam1hY2QtODogcmVpc2VyZnNfZmlsbF9zdXBlcjogdW5hYmxlIHRvIHJlYWQgYml0bWFwIik7CiAJCWdvdG8gZXJyb3I7CiAJfQorCWVycnZhbCA9IC1FSU5WQUw7CiAjaWZkZWYgQ09ORklHX1JFSVNFUkZTX0NIRUNLCiAJU1dBUk4oc2lsZW50LCBzLCAiQ09ORklHX1JFSVNFUkZTX0NIRUNLIGlzIHNldCBPTiIpOwogCVNXQVJOKHNpbGVudCwgcywgIi0gaXQgaXMgc2xvdyBtb2RlIGZvciBkZWJ1Z2dpbmcuIik7CkBAIC0yMTU2LDcgKzIxNjYsNyBAQAogCS5vd25lciA9IFRISVNfTU9EVUxFLAogCS5uYW1lID0gInJlaXNlcmZzIiwKIAkuZ2V0X3NiID0gZ2V0X3N1cGVyX2Jsb2NrLAotCS5raWxsX3NiID0ga2lsbF9ibG9ja19zdXBlciwKKwkua2lsbF9zYiA9IHJlaXNlcmZzX2tpbGxfc2IsCiAJLmZzX2ZsYWdzID0gRlNfUkVRVUlSRVNfREVWLAogfTsKIApkaWZmIC0tZ2l0IGEvZnMvc3BsaWNlLmMgYi9mcy9zcGxpY2UuYwppbmRleCAxM2U5MmRkLi5kYTc0NTgzIDEwMDY0NAotLS0gYS9mcy9zcGxpY2UuYworKysgYi9mcy9zcGxpY2UuYwpAQCAtNzQsNyArNzQsNyBAQAogCQl3YWl0X29uX3BhZ2Vfd3JpdGViYWNrKHBhZ2UpOwogCiAJCWlmIChQYWdlUHJpdmF0ZShwYWdlKSkKLQkJCXRyeV90b19yZWxlYXNlX3BhZ2UocGFnZSwgbWFwcGluZ19nZnBfbWFzayhtYXBwaW5nKSk7CisJCQl0cnlfdG9fcmVsZWFzZV9wYWdlKHBhZ2UsIEdGUF9LRVJORUwpOwogCiAJCS8qCiAJCSAqIElmIHdlIHN1Y2NlZWRlZCBpbiByZW1vdmluZyB0aGUgbWFwcGluZywgc2V0IExSVSBmbGFnCkBAIC0zMzMsNyArMzMzLDcgQEAKIAkJCQlicmVhazsKIAogCQkJZXJyb3IgPSBhZGRfdG9fcGFnZV9jYWNoZV9scnUocGFnZSwgbWFwcGluZywgaW5kZXgsCi0JCQkJCSAgICAgIG1hcHBpbmdfZ2ZwX21hc2sobWFwcGluZykpOworCQkJCQkgICAgICBHRlBfS0VSTkVMKTsKIAkJCWlmICh1bmxpa2VseShlcnJvcikpIHsKIAkJCQlwYWdlX2NhY2hlX3JlbGVhc2UocGFnZSk7CiAJCQkJaWYgKGVycm9yID09IC1FRVhJU1QpCkBAIC01NTcsNyArNTU3LDYgQEAKIHsKIAlzdHJ1Y3QgZmlsZSAqZmlsZSA9IHNkLT5maWxlOwogCXN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nID0gZmlsZS0+Zl9tYXBwaW5nOwotCWdmcF90IGdmcF9tYXNrID0gbWFwcGluZ19nZnBfbWFzayhtYXBwaW5nKTsKIAl1bnNpZ25lZCBpbnQgb2Zmc2V0LCB0aGlzX2xlbjsKIAlzdHJ1Y3QgcGFnZSAqcGFnZTsKIAlwZ29mZl90IGluZGV4OwpAQCAtNTkxLDcgKzU5MCw3IEBACiAJCQlnb3RvIGZpbmRfcGFnZTsKIAogCQlwYWdlID0gYnVmLT5wYWdlOwotCQlpZiAoYWRkX3RvX3BhZ2VfY2FjaGUocGFnZSwgbWFwcGluZywgaW5kZXgsIGdmcF9tYXNrKSkgeworCQlpZiAoYWRkX3RvX3BhZ2VfY2FjaGUocGFnZSwgbWFwcGluZywgaW5kZXgsIEdGUF9LRVJORUwpKSB7CiAJCQl1bmxvY2tfcGFnZShwYWdlKTsKIAkJCWdvdG8gZmluZF9wYWdlOwogCQl9CkBAIC02MDcsMTMgKzYwNiwxMyBAQAogCQkJcmV0ID0gLUVOT01FTTsKIAkJCXBhZ2UgPSBwYWdlX2NhY2hlX2FsbG9jX2NvbGQobWFwcGluZyk7CiAJCQlpZiAodW5saWtlbHkoIXBhZ2UpKQotCQkJCWdvdG8gb3V0X25vbWVtOworCQkJCWdvdG8gb3V0X3JldDsKIAogCQkJLyoKIAkJCSAqIFRoaXMgd2lsbCBhbHNvIGxvY2sgdGhlIHBhZ2UKIAkJCSAqLwogCQkJcmV0ID0gYWRkX3RvX3BhZ2VfY2FjaGVfbHJ1KHBhZ2UsIG1hcHBpbmcsIGluZGV4LAotCQkJCQkJICAgIGdmcF9tYXNrKTsKKwkJCQkJCSAgICBHRlBfS0VSTkVMKTsKIAkJCWlmICh1bmxpa2VseShyZXQpKQogCQkJCWdvdG8gb3V0OwogCQl9CkBAIC02NjYsNyArNjY1LDcgQEAKIAkJaWYgKHNkLT5wb3MgKyB0aGlzX2xlbiA+IGlzaXplKQogCQkJdm10cnVuY2F0ZShtYXBwaW5nLT5ob3N0LCBpc2l6ZSk7CiAKLQkJZ290byBvdXQ7CisJCWdvdG8gb3V0X3JldDsKIAl9CiAKIAlpZiAoYnVmLT5wYWdlICE9IHBhZ2UpIHsKQEAgLTY5OCw3ICs2OTcsNyBAQAogb3V0OgogCXBhZ2VfY2FjaGVfcmVsZWFzZShwYWdlKTsKIAl1bmxvY2tfcGFnZShwYWdlKTsKLW91dF9ub21lbToKK291dF9yZXQ6CiAJcmV0dXJuIHJldDsKIH0KIApAQCAtNzA3LDkgKzcwNiw5IEBACiAgKiBrZXkgaGVyZSBpcyB0aGUgJ2FjdG9yJyB3b3JrZXIgcGFzc2VkIGluIHRoYXQgYWN0dWFsbHkgbW92ZXMgdGhlIGRhdGEKICAqIHRvIHRoZSB3YW50ZWQgZGVzdGluYXRpb24uIFNlZSBwaXBlX3RvX2ZpbGUvcGlwZV90b19zZW5kcGFnZSBhYm92ZS4KICAqLwotc3NpemVfdCBzcGxpY2VfZnJvbV9waXBlKHN0cnVjdCBwaXBlX2lub2RlX2luZm8gKnBpcGUsIHN0cnVjdCBmaWxlICpvdXQsCi0JCQkgbG9mZl90ICpwcG9zLCBzaXplX3QgbGVuLCB1bnNpZ25lZCBpbnQgZmxhZ3MsCi0JCQkgc3BsaWNlX2FjdG9yICphY3RvcikKK3N0YXRpYyBzc2l6ZV90IF9fc3BsaWNlX2Zyb21fcGlwZShzdHJ1Y3QgcGlwZV9pbm9kZV9pbmZvICpwaXBlLAorCQkJCSAgc3RydWN0IGZpbGUgKm91dCwgbG9mZl90ICpwcG9zLCBzaXplX3QgbGVuLAorCQkJCSAgdW5zaWduZWQgaW50IGZsYWdzLCBzcGxpY2VfYWN0b3IgKmFjdG9yKQogewogCWludCByZXQsIGRvX3dha2V1cCwgZXJyOwogCXN0cnVjdCBzcGxpY2VfZGVzYyBzZDsKQEAgLTcyMiw5ICs3MjEsNiBAQAogCXNkLmZpbGUgPSBvdXQ7CiAJc2QucG9zID0gKnBwb3M7CiAKLQlpZiAocGlwZS0+aW5vZGUpCi0JCW11dGV4X2xvY2soJnBpcGUtPmlub2RlLT5pX211dGV4KTsKLQogCWZvciAoOzspIHsKIAkJaWYgKHBpcGUtPm5yYnVmcykgewogCQkJc3RydWN0IHBpcGVfYnVmZmVyICpidWYgPSBwaXBlLT5idWZzICsgcGlwZS0+Y3VyYnVmOwpAQCAtNzk3LDkgKzc5Myw2IEBACiAJCXBpcGVfd2FpdChwaXBlKTsKIAl9CiAKLQlpZiAocGlwZS0+aW5vZGUpCi0JCW11dGV4X3VubG9jaygmcGlwZS0+aW5vZGUtPmlfbXV0ZXgpOwotCiAJaWYgKGRvX3dha2V1cCkgewogCQlzbXBfbWIoKTsKIAkJaWYgKHdhaXRxdWV1ZV9hY3RpdmUoJnBpcGUtPndhaXQpKQpAQCAtODEwLDYgKzgwMyw3MyBAQAogCXJldHVybiByZXQ7CiB9CiAKK3NzaXplX3Qgc3BsaWNlX2Zyb21fcGlwZShzdHJ1Y3QgcGlwZV9pbm9kZV9pbmZvICpwaXBlLCBzdHJ1Y3QgZmlsZSAqb3V0LAorCQkJIGxvZmZfdCAqcHBvcywgc2l6ZV90IGxlbiwgdW5zaWduZWQgaW50IGZsYWdzLAorCQkJIHNwbGljZV9hY3RvciAqYWN0b3IpCit7CisJc3NpemVfdCByZXQ7CisJc3RydWN0IGlub2RlICppbm9kZSA9IG91dC0+Zl9tYXBwaW5nLT5ob3N0OworCisJLyoKKwkgKiBUaGUgYWN0b3Igd29ya2VyIG1pZ2h0IGJlIGNhbGxpbmcgLT5wcmVwYXJlX3dyaXRlIGFuZAorCSAqIC0+Y29tbWl0X3dyaXRlLiBNb3N0IG9mIHRoZSB0aW1lLCB0aGVzZSBleHBlY3QgaV9tdXRleCB0bworCSAqIGJlIGhlbGQuIFNpbmNlIHRoaXMgbWF5IHJlc3VsdCBpbiBhbiBBQkJBIGRlYWRsb2NrIHdpdGgKKwkgKiBwaXBlLT5pbm9kZSwgd2UgaGF2ZSB0byBvcmRlciBsb2NrIGFjcXVpcnkgaGVyZS4KKwkgKi8KKwlpbm9kZV9kb3VibGVfbG9jayhpbm9kZSwgcGlwZS0+aW5vZGUpOworCXJldCA9IF9fc3BsaWNlX2Zyb21fcGlwZShwaXBlLCBvdXQsIHBwb3MsIGxlbiwgZmxhZ3MsIGFjdG9yKTsKKwlpbm9kZV9kb3VibGVfdW5sb2NrKGlub2RlLCBwaXBlLT5pbm9kZSk7CisKKwlyZXR1cm4gcmV0OworfQorCisvKioKKyAqIGdlbmVyaWNfZmlsZV9zcGxpY2Vfd3JpdGVfbm9sb2NrIC0gZ2VuZXJpY19maWxlX3NwbGljZV93cml0ZSB3aXRob3V0IG11dGV4ZXMKKyAqIEBwaXBlOglwaXBlIGluZm8KKyAqIEBvdXQ6CWZpbGUgdG8gd3JpdGUgdG8KKyAqIEBsZW46CW51bWJlciBvZiBieXRlcyB0byBzcGxpY2UKKyAqIEBmbGFnczoJc3BsaWNlIG1vZGlmaWVyIGZsYWdzCisgKgorICogV2lsbCBlaXRoZXIgbW92ZSBvciBjb3B5IHBhZ2VzIChkZXRlcm1pbmVkIGJ5IEBmbGFncyBvcHRpb25zKSBmcm9tCisgKiB0aGUgZ2l2ZW4gcGlwZSBpbm9kZSB0byB0aGUgZ2l2ZW4gZmlsZS4gVGhlIGNhbGxlciBpcyByZXNwb25zaWJsZQorICogZm9yIGFjcXVpcmluZyBpX211dGV4IG9uIGJvdGggaW5vZGVzLgorICoKKyAqLworc3NpemVfdAorZ2VuZXJpY19maWxlX3NwbGljZV93cml0ZV9ub2xvY2soc3RydWN0IHBpcGVfaW5vZGVfaW5mbyAqcGlwZSwgc3RydWN0IGZpbGUgKm91dCwKKwkJCQkgbG9mZl90ICpwcG9zLCBzaXplX3QgbGVuLCB1bnNpZ25lZCBpbnQgZmxhZ3MpCit7CisJc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcgPSBvdXQtPmZfbWFwcGluZzsKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gbWFwcGluZy0+aG9zdDsKKwlzc2l6ZV90IHJldDsKKwlpbnQgZXJyOworCisJZXJyID0gcmVtb3ZlX3N1aWQob3V0LT5mX2RlbnRyeSk7CisJaWYgKHVubGlrZWx5KGVycikpCisJCXJldHVybiBlcnI7CisKKwlyZXQgPSBfX3NwbGljZV9mcm9tX3BpcGUocGlwZSwgb3V0LCBwcG9zLCBsZW4sIGZsYWdzLCBwaXBlX3RvX2ZpbGUpOworCWlmIChyZXQgPiAwKSB7CisJCSpwcG9zICs9IHJldDsKKworCQkvKgorCQkgKiBJZiBmaWxlIG9yIGlub2RlIGlzIFNZTkMgYW5kIHdlIGFjdHVhbGx5IHdyb3RlIHNvbWUgZGF0YSwKKwkJICogc3luYyBpdC4KKwkJICovCisJCWlmICh1bmxpa2VseSgob3V0LT5mX2ZsYWdzICYgT19TWU5DKSB8fCBJU19TWU5DKGlub2RlKSkpIHsKKwkJCWVyciA9IGdlbmVyaWNfb3N5bmNfaW5vZGUoaW5vZGUsIG1hcHBpbmcsCisJCQkJCQkgIE9TWU5DX01FVEFEQVRBfE9TWU5DX0RBVEEpOworCisJCQlpZiAoZXJyKQorCQkJCXJldCA9IGVycjsKKwkJfQorCX0KKworCXJldHVybiByZXQ7Cit9CisKK0VYUE9SVF9TWU1CT0woZ2VuZXJpY19maWxlX3NwbGljZV93cml0ZV9ub2xvY2spOworCiAvKioKICAqIGdlbmVyaWNfZmlsZV9zcGxpY2Vfd3JpdGUgLSBzcGxpY2UgZGF0YSBmcm9tIGEgcGlwZSB0byBhIGZpbGUKICAqIEBwaXBlOglwaXBlIGluZm8KQEAgLTgyNiwxMiArODg2LDIxIEBACiAJCQkgIGxvZmZfdCAqcHBvcywgc2l6ZV90IGxlbiwgdW5zaWduZWQgaW50IGZsYWdzKQogewogCXN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nID0gb3V0LT5mX21hcHBpbmc7CisJc3RydWN0IGlub2RlICppbm9kZSA9IG1hcHBpbmctPmhvc3Q7CiAJc3NpemVfdCByZXQ7CisJaW50IGVycjsKKworCWVyciA9IHNob3VsZF9yZW1vdmVfc3VpZChvdXQtPmZfZGVudHJ5KTsKKwlpZiAodW5saWtlbHkoZXJyKSkgeworCQltdXRleF9sb2NrKCZpbm9kZS0+aV9tdXRleCk7CisJCWVyciA9IF9fcmVtb3ZlX3N1aWQob3V0LT5mX2RlbnRyeSwgZXJyKTsKKwkJbXV0ZXhfdW5sb2NrKCZpbm9kZS0+aV9tdXRleCk7CisJCWlmIChlcnIpCisJCQlyZXR1cm4gZXJyOworCX0KIAogCXJldCA9IHNwbGljZV9mcm9tX3BpcGUocGlwZSwgb3V0LCBwcG9zLCBsZW4sIGZsYWdzLCBwaXBlX3RvX2ZpbGUpOwogCWlmIChyZXQgPiAwKSB7Ci0JCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBtYXBwaW5nLT5ob3N0OwotCiAJCSpwcG9zICs9IHJldDsKIAogCQkvKgpAQCAtODM5LDggKzkwOCw2IEBACiAJCSAqIHN5bmMgaXQuCiAJCSAqLwogCQlpZiAodW5saWtlbHkoKG91dC0+Zl9mbGFncyAmIE9fU1lOQykgfHwgSVNfU1lOQyhpbm9kZSkpKSB7Ci0JCQlpbnQgZXJyOwotCiAJCQltdXRleF9sb2NrKCZpbm9kZS0+aV9tdXRleCk7CiAJCQllcnIgPSBnZW5lcmljX29zeW5jX2lub2RlKGlub2RlLCBtYXBwaW5nLAogCQkJCQkJICBPU1lOQ19NRVRBREFUQXxPU1lOQ19EQVRBKTsKQEAgLTEwNDIsNiArMTEwOSwxOSBAQAogRVhQT1JUX1NZTUJPTChkb19zcGxpY2VfZGlyZWN0KTsKIAogLyoKKyAqIEFmdGVyIHRoZSBpbm9kZSBzbGltbWluZyBwYXRjaCwgaV9waXBlL2lfYmRldi9pX2NkZXYgc2hhcmUgdGhlIHNhbWUKKyAqIGxvY2F0aW9uLCBzbyBjaGVja2luZyAtPmlfcGlwZSBpcyBub3QgZW5vdWdoIHRvIHZlcmlmeSB0aGF0IHRoaXMgaXMgYQorICogcGlwZS4KKyAqLworc3RhdGljIGlubGluZSBzdHJ1Y3QgcGlwZV9pbm9kZV9pbmZvICpwaXBlX2luZm8oc3RydWN0IGlub2RlICppbm9kZSkKK3sKKwlpZiAoU19JU0ZJRk8oaW5vZGUtPmlfbW9kZSkpCisJCXJldHVybiBpbm9kZS0+aV9waXBlOworCisJcmV0dXJuIE5VTEw7Cit9CisKKy8qCiAgKiBEZXRlcm1pbmUgd2hlcmUgdG8gc3BsaWNlIHRvL2Zyb20uCiAgKi8KIHN0YXRpYyBsb25nIGRvX3NwbGljZShzdHJ1Y3QgZmlsZSAqaW4sIGxvZmZfdCBfX3VzZXIgKm9mZl9pbiwKQEAgLTEwNTIsNyArMTEzMiw3IEBACiAJbG9mZl90IG9mZnNldCwgKm9mZjsKIAlsb25nIHJldDsKIAotCXBpcGUgPSBpbi0+Zl9kZW50cnktPmRfaW5vZGUtPmlfcGlwZTsKKwlwaXBlID0gcGlwZV9pbmZvKGluLT5mX2RlbnRyeS0+ZF9pbm9kZSk7CiAJaWYgKHBpcGUpIHsKIAkJaWYgKG9mZl9pbikKIAkJCXJldHVybiAtRVNQSVBFOwpAQCAtMTA3Myw3ICsxMTUzLDcgQEAKIAkJcmV0dXJuIHJldDsKIAl9CiAKLQlwaXBlID0gb3V0LT5mX2RlbnRyeS0+ZF9pbm9kZS0+aV9waXBlOworCXBpcGUgPSBwaXBlX2luZm8ob3V0LT5mX2RlbnRyeS0+ZF9pbm9kZSk7CiAJaWYgKHBpcGUpIHsKIAkJaWYgKG9mZl9vdXQpCiAJCQlyZXR1cm4gLUVTUElQRTsKQEAgLTEyMzEsNyArMTMxMSw3IEBACiBzdGF0aWMgbG9uZyBkb192bXNwbGljZShzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3Qgc3RydWN0IGlvdmVjIF9fdXNlciAqaW92LAogCQkJdW5zaWduZWQgbG9uZyBucl9zZWdzLCB1bnNpZ25lZCBpbnQgZmxhZ3MpCiB7Ci0Jc3RydWN0IHBpcGVfaW5vZGVfaW5mbyAqcGlwZSA9IGZpbGUtPmZfZGVudHJ5LT5kX2lub2RlLT5pX3BpcGU7CisJc3RydWN0IHBpcGVfaW5vZGVfaW5mbyAqcGlwZTsKIAlzdHJ1Y3QgcGFnZSAqcGFnZXNbUElQRV9CVUZGRVJTXTsKIAlzdHJ1Y3QgcGFydGlhbF9wYWdlIHBhcnRpYWxbUElQRV9CVUZGRVJTXTsKIAlzdHJ1Y3Qgc3BsaWNlX3BpcGVfZGVzYyBzcGQgPSB7CkBAIC0xMjQxLDcgKzEzMjEsOCBAQAogCQkub3BzID0gJnVzZXJfcGFnZV9waXBlX2J1Zl9vcHMsCiAJfTsKIAotCWlmICh1bmxpa2VseSghcGlwZSkpCisJcGlwZSA9IHBpcGVfaW5mbyhmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZSk7CisJaWYgKCFwaXBlKQogCQlyZXR1cm4gLUVCQURGOwogCWlmICh1bmxpa2VseShucl9zZWdzID4gVUlPX01BWElPVikpCiAJCXJldHVybiAtRUlOVkFMOwpAQCAtMTQwMCwxMyArMTQ4MSw3IEBACiAJICogZ3JhYmJpbmcgYnkgaW5vZGUgYWRkcmVzcy4gT3RoZXJ3aXNlIHR3byBkaWZmZXJlbnQgcHJvY2Vzc2VzCiAJICogY291bGQgZGVhZGxvY2sgKG9uZSBkb2luZyB0ZWUgZnJvbSBBIC0+IEIsIHRoZSBvdGhlciBmcm9tIEIgLT4gQSkuCiAJICovCi0JaWYgKGlwaXBlLT5pbm9kZSA8IG9waXBlLT5pbm9kZSkgewotCQltdXRleF9sb2NrX25lc3RlZCgmaXBpcGUtPmlub2RlLT5pX211dGV4LCBJX01VVEVYX1BBUkVOVCk7Ci0JCW11dGV4X2xvY2tfbmVzdGVkKCZvcGlwZS0+aW5vZGUtPmlfbXV0ZXgsIElfTVVURVhfQ0hJTEQpOwotCX0gZWxzZSB7Ci0JCW11dGV4X2xvY2tfbmVzdGVkKCZvcGlwZS0+aW5vZGUtPmlfbXV0ZXgsIElfTVVURVhfUEFSRU5UKTsKLQkJbXV0ZXhfbG9ja19uZXN0ZWQoJmlwaXBlLT5pbm9kZS0+aV9tdXRleCwgSV9NVVRFWF9DSElMRCk7Ci0JfQorCWlub2RlX2RvdWJsZV9sb2NrKGlwaXBlLT5pbm9kZSwgb3BpcGUtPmlub2RlKTsKIAogCWRvIHsKIAkJaWYgKCFvcGlwZS0+cmVhZGVycykgewpAQCAtMTQ1MCw4ICsxNTI1LDcgQEAKIAkJaSsrOwogCX0gd2hpbGUgKGxlbik7CiAKLQltdXRleF91bmxvY2soJmlwaXBlLT5pbm9kZS0+aV9tdXRleCk7Ci0JbXV0ZXhfdW5sb2NrKCZvcGlwZS0+aW5vZGUtPmlfbXV0ZXgpOworCWlub2RlX2RvdWJsZV91bmxvY2soaXBpcGUtPmlub2RlLCBvcGlwZS0+aW5vZGUpOwogCiAJLyoKIAkgKiBJZiB3ZSBwdXQgZGF0YSBpbiB0aGUgb3V0cHV0IHBpcGUsIHdha2V1cCBhbnkgcG90ZW50aWFsIHJlYWRlcnMuCkBAIC0xNDc1LDggKzE1NDksOCBAQAogc3RhdGljIGxvbmcgZG9fdGVlKHN0cnVjdCBmaWxlICppbiwgc3RydWN0IGZpbGUgKm91dCwgc2l6ZV90IGxlbiwKIAkJICAgdW5zaWduZWQgaW50IGZsYWdzKQogewotCXN0cnVjdCBwaXBlX2lub2RlX2luZm8gKmlwaXBlID0gaW4tPmZfZGVudHJ5LT5kX2lub2RlLT5pX3BpcGU7Ci0Jc3RydWN0IHBpcGVfaW5vZGVfaW5mbyAqb3BpcGUgPSBvdXQtPmZfZGVudHJ5LT5kX2lub2RlLT5pX3BpcGU7CisJc3RydWN0IHBpcGVfaW5vZGVfaW5mbyAqaXBpcGUgPSBwaXBlX2luZm8oaW4tPmZfZGVudHJ5LT5kX2lub2RlKTsKKwlzdHJ1Y3QgcGlwZV9pbm9kZV9pbmZvICpvcGlwZSA9IHBpcGVfaW5mbyhvdXQtPmZfZGVudHJ5LT5kX2lub2RlKTsKIAlpbnQgcmV0ID0gLUVJTlZBTDsKIAogCS8qCmRpZmYgLS1naXQgYS9mcy9zdXBlci5jIGIvZnMvc3VwZXIuYwppbmRleCBhZWM5OWRkLi40N2U1NTRjIDEwMDY0NAotLS0gYS9mcy9zdXBlci5jCisrKyBiL2ZzL3N1cGVyLmMKQEAgLTI2MCwxNyArMjYwLDE3IEBACiAgKgl0aGF0IG5lZWQgZGVzdHJ1Y3Rpb24gb3V0IG9mIHN1cGVyYmxvY2ssIGNhbGwgZ2VuZXJpY19zaHV0ZG93bl9zdXBlcigpCiAgKglhbmQgcmVsZWFzZSBhZm9yZW1lbnRpb25lZCBvYmplY3RzLiAgTm90ZTogZGVudHJpZXMgYW5kIGlub2RlcyBfYXJlXwogICoJdGFrZW4gY2FyZSBvZiBhbmQgZG8gbm90IG5lZWQgc3BlY2lmaWMgaGFuZGxpbmcuCisgKgorICoJVXBvbiBjYWxsaW5nIHRoaXMgZnVuY3Rpb24sIHRoZSBmaWxlc3lzdGVtIG1heSBubyBsb25nZXIgYWx0ZXIgb3IKKyAqCXJlYXJyYW5nZSB0aGUgc2V0IG9mIGRlbnRyaWVzIGJlbG9uZ2luZyB0byB0aGlzIHN1cGVyX2Jsb2NrLCBub3IgbWF5IGl0CisgKgljaGFuZ2UgdGhlIGF0dGFjaG1lbnRzIG9mIGRlbnRyaWVzIHRvIGlub2Rlcy4KICAqLwogdm9pZCBnZW5lcmljX3NodXRkb3duX3N1cGVyKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpCiB7Ci0Jc3RydWN0IGRlbnRyeSAqcm9vdCA9IHNiLT5zX3Jvb3Q7CiAJc3RydWN0IHN1cGVyX29wZXJhdGlvbnMgKnNvcCA9IHNiLT5zX29wOwogCi0JaWYgKHJvb3QpIHsKLQkJc2ItPnNfcm9vdCA9IE5VTEw7Ci0JCXNocmlua19kY2FjaGVfcGFyZW50KHJvb3QpOwotCQlzaHJpbmtfZGNhY2hlX3NiKHNiKTsKLQkJZHB1dChyb290KTsKKwlpZiAoc2ItPnNfcm9vdCkgeworCQlzaHJpbmtfZGNhY2hlX2Zvcl91bW91bnQoc2IpOwogCQlmc3luY19zdXBlcihzYik7CiAJCWxvY2tfc3VwZXIoc2IpOwogCQlzYi0+c19mbGFncyAmPSB+TVNfQUNUSVZFOwpkaWZmIC0tZ2l0IGEvZnMvc3lzZnMvZmlsZS5jIGIvZnMvc3lzZnMvZmlsZS5jCmluZGV4IDE0NmYxZGUuLjI5ODMwM2IgMTAwNjQ0Ci0tLSBhL2ZzL3N5c2ZzL2ZpbGUuYworKysgYi9mcy9zeXNmcy9maWxlLmMKQEAgLTQ4MywxNyArNDgzLDEyIEBACiAJCSAgICAodmljdGltLT5kX3BhcmVudC0+ZF9pbm9kZSA9PSBkaXItPmRfaW5vZGUpKSB7CiAJCQl2aWN0aW0tPmRfaW5vZGUtPmlfbXRpbWUgPSBDVVJSRU5UX1RJTUU7CiAJCQlmc25vdGlmeV9tb2RpZnkodmljdGltKTsKLQotCQkJLyoqCi0JCQkgKiBEcm9wIHJlZmVyZW5jZSBmcm9tIGluaXRpYWwgc3lzZnNfZ2V0X2RlbnRyeSgpLgotCQkJICovCi0JCQlkcHV0KHZpY3RpbSk7CiAJCQlyZXMgPSAwOwogCQl9IGVsc2UKIAkJCWRfZHJvcCh2aWN0aW0pOwogCQkKIAkJLyoqCi0JCSAqIERyb3AgdGhlIHJlZmVyZW5jZSBhY3F1aXJlZCBmcm9tIHN5c2ZzX2dldF9kZW50cnkoKSBhYm92ZS4KKwkJICogRHJvcCB0aGUgcmVmZXJlbmNlIGFjcXVpcmVkIGZyb20gbG9va3VwX29uZV9sZW4oKSBhYm92ZS4KIAkJICovCiAJCWRwdXQodmljdGltKTsKIAl9CmRpZmYgLS1naXQgYS9mcy9zeXN2L3N1cGVyLmMgYi9mcy9zeXN2L3N1cGVyLmMKaW5kZXggMzUwY2JhNS4uZGM5ZTdkYyAxMDA2NDQKLS0tIGEvZnMvc3lzdi9zdXBlci5jCisrKyBiL2ZzL3N5c3Yvc3VwZXIuYwpAQCAtMzU4LDE2ICszNTgsMTEgQEAKIAl1bnNpZ25lZCBsb25nIGJsb2NrbnI7CiAJaW50IHNpemUgPSAwLCBpOwogCQotCWlmICgxMDI0ICE9IHNpemVvZiAoc3RydWN0IHhlbml4X3N1cGVyX2Jsb2NrKSkKLQkJcGFuaWMoIlhlbml4IEZTOiBiYWQgc3VwZXJibG9jayBzaXplIik7Ci0JaWYgKDUxMiAhPSBzaXplb2YgKHN0cnVjdCBzeXN2NF9zdXBlcl9ibG9jaykpCi0JCXBhbmljKCJTeXN0ZW1WIEZTOiBiYWQgc3VwZXJibG9jayBzaXplIik7Ci0JaWYgKDUxMiAhPSBzaXplb2YgKHN0cnVjdCBzeXN2Ml9zdXBlcl9ibG9jaykpCi0JCXBhbmljKCJTeXN0ZW1WIEZTOiBiYWQgc3VwZXJibG9jayBzaXplIik7Ci0JaWYgKDUwMCAhPSBzaXplb2YgKHN0cnVjdCBjb2hfc3VwZXJfYmxvY2spKQotCQlwYW5pYygiQ29oZXJlbnQgRlM6IGJhZCBzdXBlcmJsb2NrIHNpemUiKTsKLQlpZiAoNjQgIT0gc2l6ZW9mIChzdHJ1Y3Qgc3lzdl9pbm9kZSkpCi0JCXBhbmljKCJzeXN2IGZzOiBiYWQgaW5vZGUgc2l6ZSIpOworCUJVSUxEX0JVR19PTigxMDI0ICE9IHNpemVvZiAoc3RydWN0IHhlbml4X3N1cGVyX2Jsb2NrKSk7CisJQlVJTERfQlVHX09OKDUxMiAhPSBzaXplb2YgKHN0cnVjdCBzeXN2NF9zdXBlcl9ibG9jaykpOworCUJVSUxEX0JVR19PTig1MTIgIT0gc2l6ZW9mIChzdHJ1Y3Qgc3lzdjJfc3VwZXJfYmxvY2spKTsKKwlCVUlMRF9CVUdfT04oNTAwICE9IHNpemVvZiAoc3RydWN0IGNvaF9zdXBlcl9ibG9jaykpOworCUJVSUxEX0JVR19PTig2NCAhPSBzaXplb2YgKHN0cnVjdCBzeXN2X2lub2RlKSk7CiAKIAlzYmkgPSBremFsbG9jKHNpemVvZihzdHJ1Y3Qgc3lzdl9zYl9pbmZvKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFzYmkpCmRpZmYgLS1naXQgYS9mcy92ZmF0L25hbWVpLmMgYi9mcy92ZmF0L25hbWVpLmMKaW5kZXggZWRiNzExZi4uMGFmZDc0NSAxMDA2NDQKLS0tIGEvZnMvdmZhdC9uYW1laS5jCisrKyBiL2ZzL3ZmYXQvbmFtZWkuYwpAQCAtMTAwNCw2ICsxMDA0LDcgQEAKIAkucm1kaXIJCT0gdmZhdF9ybWRpciwKIAkucmVuYW1lCQk9IHZmYXRfcmVuYW1lLAogCS5zZXRhdHRyCT0gZmF0X25vdGlmeV9jaGFuZ2UsCisJLmdldGF0dHIJPSBmYXRfZ2V0YXR0ciwKIH07CiAKIHN0YXRpYyBpbnQgdmZhdF9maWxsX3N1cGVyKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHZvaWQgKmRhdGEsIGludCBzaWxlbnQpCmRpZmYgLS1naXQgYS9mcy94YXR0ci5jIGIvZnMveGF0dHIuYwppbmRleCAzOTU2MzUxLi4wOTAxYmRjIDEwMDY0NAotLS0gYS9mcy94YXR0ci5jCisrKyBiL2ZzL3hhdHRyLmMKQEAgLTQ4LDE0ICs0OCwyMSBAQAogCQlyZXR1cm4gMDsKIAogCS8qCi0JICogVGhlIHRydXN0ZWQuKiBuYW1lc3BhY2UgY2FuIG9ubHkgYWNjZXNzZWQgYnkgYSBwcml2aWxlZ3VlZCB1c2VyLgorCSAqIFRoZSB0cnVzdGVkLiogbmFtZXNwYWNlIGNhbiBvbmx5IGJlIGFjY2Vzc2VkIGJ5IGEgcHJpdmlsZWdlZCB1c2VyLgogCSAqLwogCWlmICghc3RybmNtcChuYW1lLCBYQVRUUl9UUlVTVEVEX1BSRUZJWCwgWEFUVFJfVFJVU1RFRF9QUkVGSVhfTEVOKSkKIAkJcmV0dXJuIChjYXBhYmxlKENBUF9TWVNfQURNSU4pID8gMCA6IC1FUEVSTSk7CiAKKwkvKiBJbiB1c2VyLiogbmFtZXNwYWNlLCBvbmx5IHJlZ3VsYXIgZmlsZXMgYW5kIGRpcmVjdG9yaWVzIGNhbiBoYXZlCisJICogZXh0ZW5kZWQgYXR0cmlidXRlcy4gRm9yIHN0aWNreSBkaXJlY3Rvcmllcywgb25seSB0aGUgb3duZXIgYW5kCisJICogcHJpdmlsZWdlZCB1c2VyIGNhbiB3cml0ZSBhdHRyaWJ1dGVzLgorCSAqLwogCWlmICghc3RybmNtcChuYW1lLCBYQVRUUl9VU0VSX1BSRUZJWCwgWEFUVFJfVVNFUl9QUkVGSVhfTEVOKSkgewotCQlpZiAoIVNfSVNSRUcoaW5vZGUtPmlfbW9kZSkgJiYKLQkJICAgICghU19JU0RJUihpbm9kZS0+aV9tb2RlKSB8fCBpbm9kZS0+aV9tb2RlICYgU19JU1ZUWCkpCisJCWlmICghU19JU1JFRyhpbm9kZS0+aV9tb2RlKSAmJiAhU19JU0RJUihpbm9kZS0+aV9tb2RlKSkKKwkJCXJldHVybiAtRVBFUk07CisJCWlmIChTX0lTRElSKGlub2RlLT5pX21vZGUpICYmIChpbm9kZS0+aV9tb2RlICYgU19JU1ZUWCkgJiYKKwkJICAgIChtYXNrICYgTUFZX1dSSVRFKSAmJiAoY3VycmVudC0+ZnN1aWQgIT0gaW5vZGUtPmlfdWlkKSAmJgorCQkgICAgIWNhcGFibGUoQ0FQX0ZPV05FUikpCiAJCQlyZXR1cm4gLUVQRVJNOwogCX0KIApkaWZmIC0tZ2l0IGEvZnMveGZzL01ha2VmaWxlLWxpbnV4LTIuNiBiL2ZzL3hmcy9NYWtlZmlsZS1saW51eC0yLjYKaW5kZXggMjkxOTQ4ZC4uYjQ5OTg5YiAxMDA2NDQKLS0tIGEvZnMveGZzL01ha2VmaWxlLWxpbnV4LTIuNgorKysgYi9mcy94ZnMvTWFrZWZpbGUtbGludXgtMi42CkBAIC0yMSwyMiArMjEsNyBAQAogWEZTX0xJTlVYIDo9IGxpbnV4LTIuNgogCiBpZmVxICgkKENPTkZJR19YRlNfREVCVUcpLHkpCi0JRVhUUkFfQ0ZMQUdTICs9IC1nIC1EU1RBVElDPSIiIC1EREVCVUcKLQlFWFRSQV9DRkxBR1MgKz0gLURYRlNfQlVGX0xPQ0tfVFJBQ0tJTkcKLWVuZGlmCi1pZmVxICgkKENPTkZJR19YRlNfVFJBQ0UpLHkpCi0JRVhUUkFfQ0ZMQUdTICs9IC1EWEZTX0FMTE9DX1RSQUNFCi0JRVhUUkFfQ0ZMQUdTICs9IC1EWEZTX0FUVFJfVFJBQ0UKLQlFWFRSQV9DRkxBR1MgKz0gLURYRlNfQkxJX1RSQUNFCi0JRVhUUkFfQ0ZMQUdTICs9IC1EWEZTX0JNQVBfVFJBQ0UKLQlFWFRSQV9DRkxBR1MgKz0gLURYRlNfQk1CVF9UUkFDRQotCUVYVFJBX0NGTEFHUyArPSAtRFhGU19ESVIyX1RSQUNFCi0JRVhUUkFfQ0ZMQUdTICs9IC1EWEZTX0RRVU9UX1RSQUNFCi0JRVhUUkFfQ0ZMQUdTICs9IC1EWEZTX0lMT0NLX1RSQUNFCi0JRVhUUkFfQ0ZMQUdTICs9IC1EWEZTX0xPR19UUkFDRQotCUVYVFJBX0NGTEFHUyArPSAtRFhGU19SV19UUkFDRQotCUVYVFJBX0NGTEFHUyArPSAtRFhGU19CVUZfVFJBQ0UKLQlFWFRSQV9DRkxBR1MgKz0gLURYRlNfVk5PREVfVFJBQ0UKKwlFWFRSQV9DRkxBR1MgKz0gLWcKIGVuZGlmCiAKIG9iai0kKENPTkZJR19YRlNfRlMpCQkrPSB4ZnMubwpkaWZmIC0tZ2l0IGEvZnMveGZzL2xpbnV4LTIuNi9rbWVtLmMgYi9mcy94ZnMvbGludXgtMi42L2ttZW0uYwppbmRleCBkNTk3Mzc1Li4wMDRiYWY2IDEwMDY0NAotLS0gYS9mcy94ZnMvbGludXgtMi42L2ttZW0uYworKysgYi9mcy94ZnMvbGludXgtMi42L2ttZW0uYwpAQCAtMjEsNiArMjEsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2hpZ2htZW0uaD4KICNpbmNsdWRlIDxsaW51eC9zd2FwLmg+CiAjaW5jbHVkZSA8bGludXgvYmxrZGV2Lmg+CisjaW5jbHVkZSA8bGludXgvYmFja2luZy1kZXYuaD4KICNpbmNsdWRlICJ0aW1lLmgiCiAjaW5jbHVkZSAia21lbS5oIgogCkBAIC01Myw3ICs1NCw3IEBACiAJCQlwcmludGsoS0VSTl9FUlIgIlhGUzogcG9zc2libGUgbWVtb3J5IGFsbG9jYXRpb24gIgogCQkJCQkiZGVhZGxvY2sgaW4gJXMgKG1vZGU6MHgleClcbiIsCiAJCQkJCV9fRlVOQ1RJT05fXywgbGZsYWdzKTsKLQkJYmxrX2Nvbmdlc3Rpb25fd2FpdChXUklURSwgSFovNTApOworCQljb25nZXN0aW9uX3dhaXQoV1JJVEUsIEhaLzUwKTsKIAl9IHdoaWxlICgxKTsKIH0KIApAQCAtMTMxLDcgKzEzMiw3IEBACiAJCQlwcmludGsoS0VSTl9FUlIgIlhGUzogcG9zc2libGUgbWVtb3J5IGFsbG9jYXRpb24gIgogCQkJCQkiZGVhZGxvY2sgaW4gJXMgKG1vZGU6MHgleClcbiIsCiAJCQkJCV9fRlVOQ1RJT05fXywgbGZsYWdzKTsKLQkJYmxrX2Nvbmdlc3Rpb25fd2FpdChXUklURSwgSFovNTApOworCQljb25nZXN0aW9uX3dhaXQoV1JJVEUsIEhaLzUwKTsKIAl9IHdoaWxlICgxKTsKIH0KIApkaWZmIC0tZ2l0IGEvZnMveGZzL2xpbnV4LTIuNi94ZnNfYnVmLmMgYi9mcy94ZnMvbGludXgtMi42L3hmc19idWYuYwppbmRleCA5YmJhZGFmLi5kMzM4Mjg0IDEwMDY0NAotLS0gYS9mcy94ZnMvbGludXgtMi42L3hmc19idWYuYworKysgYi9mcy94ZnMvbGludXgtMi42L3hmc19idWYuYwpAQCAtMTUsNiArMTUsNyBAQAogICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKICAqIEluYy4sICA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQogICovCisjaW5jbHVkZSAieGZzLmgiCiAjaW5jbHVkZSA8bGludXgvc3RkZGVmLmg+CiAjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CkBAIC0zMCw3ICszMSw3IEBACiAjaW5jbHVkZSA8bGludXgvaGFzaC5oPgogI2luY2x1ZGUgPGxpbnV4L2t0aHJlYWQuaD4KICNpbmNsdWRlIDxsaW51eC9taWdyYXRlLmg+Ci0jaW5jbHVkZSAieGZzX2xpbnV4LmgiCisjaW5jbHVkZSA8bGludXgvYmFja2luZy1kZXYuaD4KIAogU1RBVElDIGttZW1fem9uZV90ICp4ZnNfYnVmX3pvbmU7CiBTVEFUSUMga21lbV9zaGFrZXJfdCB4ZnNfYnVmX3NoYWtlOwpAQCAtMzk1LDcgKzM5Niw3IEBACiAKIAkJCVhGU19TVEFUU19JTkMoeGJfcGFnZV9yZXRyaWVzKTsKIAkJCXhmc2J1ZmRfd2FrZXVwKDAsIGdmcF9tYXNrKTsKLQkJCWJsa19jb25nZXN0aW9uX3dhaXQoV1JJVEUsIEhaLzUwKTsKKwkJCWNvbmdlc3Rpb25fd2FpdChXUklURSwgSFovNTApOwogCQkJZ290byByZXRyeTsKIAkJfQogCkBAIC0xNDA1LDcgKzE0MDYsNyBAQAogCWJ0cC0+YnRfaGFzaHNoaWZ0ID0gZXh0ZXJuYWwgPyAzIDogODsJLyogOCBvciAyNTYgYnVja2V0cyAqLwogCWJ0cC0+YnRfaGFzaG1hc2sgPSAoMSA8PCBidHAtPmJ0X2hhc2hzaGlmdCkgLSAxOwogCWJ0cC0+YnRfaGFzaCA9IGttZW1femFsbG9jKCgxIDw8IGJ0cC0+YnRfaGFzaHNoaWZ0KSAqCi0JCQkJCXNpemVvZih4ZnNfYnVmaGFzaF90KSwgS01fU0xFRVApOworCQkJCQlzaXplb2YoeGZzX2J1Zmhhc2hfdCksIEtNX1NMRUVQIHwgS01fTEFSR0UpOwogCWZvciAoaSA9IDA7IGkgPCAoMSA8PCBidHAtPmJ0X2hhc2hzaGlmdCk7IGkrKykgewogCQlzcGluX2xvY2tfaW5pdCgmYnRwLT5idF9oYXNoW2ldLmJoX2xvY2spOwogCQlJTklUX0xJU1RfSEVBRCgmYnRwLT5idF9oYXNoW2ldLmJoX2xpc3QpOwpkaWZmIC0tZ2l0IGEvZnMveGZzL2xpbnV4LTIuNi94ZnNfZG1hcGlfcHJpdi5oIGIvZnMveGZzL2xpbnV4LTIuNi94ZnNfZG1hcGlfcHJpdi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE4YjBiMTYKLS0tIC9kZXYvbnVsbAorKysgYi9mcy94ZnMvbGludXgtMi42L3hmc19kbWFwaV9wcml2LmgKQEAgLTAsMCArMSwyOCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwMC0yMDA2IFNpbGljb24gR3JhcGhpY3MsIEluYy4KKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdvdWxkIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKi8KKyNpZm5kZWYgX19YRlNfRE1BUElfUFJJVl9IX18KKyNkZWZpbmUgX19YRlNfRE1BUElfUFJJVl9IX18KKworLyoKKyAqCUJhc2VkIG9uIElPX0lTRElSRUNULCBkZWNpZGUgd2hpY2ggaV8gZmxhZyBpcyBzZXQuCisgKi8KKyNkZWZpbmUgRE1fU0VNX0ZMQUdfUkQoaW9mbGFncykgKCgoaW9mbGFncykgJiBJT19JU0RJUkVDVCkgPyBcCisJCQkgICAgICBETV9GTEFHU19JTVVYIDogMCkKKyNkZWZpbmUgRE1fU0VNX0ZMQUdfV1IJKERNX0ZMQUdTX0lBTExPQ1NFTV9XUiB8IERNX0ZMQUdTX0lNVVgpCisKKyNlbmRpZiAvKl9fWEZTX0RNQVBJX1BSSVZfSF9fKi8KZGlmZiAtLWdpdCBhL2ZzL3hmcy9saW51eC0yLjYveGZzX2lvY3RsLmMgYi9mcy94ZnMvbGludXgtMi42L3hmc19pb2N0bC5jCmluZGV4IGE3NGY4NTQuLjc0ZDA5NDgyIDEwMDY0NAotLS0gYS9mcy94ZnMvbGludXgtMi42L3hmc19pb2N0bC5jCisrKyBiL2ZzL3hmcy9saW51eC0yLjYveGZzX2lvY3RsLmMKQEAgLTM0MSw4ICszNDEsMTEgQEAKIAkJcHV0X3VudXNlZF9mZChuZXdfZmQpOwogCQlyZXR1cm4gLVhGU19FUlJPUigtUFRSX0VSUihmaWxwKSk7CiAJfQotCWlmIChpbm9kZS0+aV9tb2RlICYgU19JRlJFRykKKwlpZiAoaW5vZGUtPmlfbW9kZSAmIFNfSUZSRUcpIHsKKwkJLyogaW52aXNpYmxlIG9wZXJhdGlvbiBzaG91bGQgbm90IGNoYW5nZSBhdGltZSAqLworCQlmaWxwLT5mX2ZsYWdzIHw9IE9fTk9BVElNRTsKIAkJZmlscC0+Zl9vcCA9ICZ4ZnNfaW52aXNfZmlsZV9vcGVyYXRpb25zOworCX0KIAogCWZkX2luc3RhbGwobmV3X2ZkLCBmaWxwKTsKIAlyZXR1cm4gbmV3X2ZkOwpkaWZmIC0tZ2l0IGEvZnMveGZzL2xpbnV4LTIuNi94ZnNfc3VwZXIuYyBiL2ZzL3hmcy9saW51eC0yLjYveGZzX3N1cGVyLmMKaW5kZXggMzhjNGQxMi4uZGUwNWFiYiAxMDA2NDQKLS0tIGEvZnMveGZzL2xpbnV4LTIuNi94ZnNfc3VwZXIuYworKysgYi9mcy94ZnMvbGludXgtMi42L3hmc19zdXBlci5jCkBAIC0yMjcsOSArMjI3LDcgQEAKIAkJeGZzX3JldmFsaWRhdGVfaW5vZGUoWEZTX0JIVlRPTShiZHApLCB2cCwgaXApOwogCQl4ZnNfc2V0X2lub2Rlb3BzKGlub2RlKTsKIAotCQlzcGluX2xvY2soJmlwLT5pX2ZsYWdzX2xvY2spOwotCQlpcC0+aV9mbGFncyAmPSB+WEZTX0lORVc7Ci0JCXNwaW5fdW5sb2NrKCZpcC0+aV9mbGFnc19sb2NrKTsKKwkJeGZzX2lmbGFnc19jbGVhcihpcCwgWEZTX0lORVcpOwogCQliYXJyaWVyKCk7CiAKIAkJdW5sb2NrX25ld19pbm9kZShpbm9kZSk7CmRpZmYgLS1naXQgYS9mcy94ZnMvc3VwcG9ydC9kZWJ1Zy5jIGIvZnMveGZzL3N1cHBvcnQvZGVidWcuYwppbmRleCBjNzVmNjgzLi40MzYzNTEyIDEwMDY0NAotLS0gYS9mcy94ZnMvc3VwcG9ydC9kZWJ1Zy5jCisrKyBiL2ZzL3hmcy9zdXBwb3J0L2RlYnVnLmMKQEAgLTE1LDExICsxNSw5IEBACiAgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAogICogSW5jLiwgIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCiAgKi8KKyNpbmNsdWRlIDx4ZnMuaD4KICNpbmNsdWRlICJkZWJ1Zy5oIgogI2luY2x1ZGUgInNwaW4uaCIKLSNpbmNsdWRlIDxhc20vcGFnZS5oPgotI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+Ci0jaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAKIHN0YXRpYyBjaGFyCQltZXNzYWdlWzI1Nl07CS8qIGtlZXAgaXQgb2ZmIHRoZSBzdGFjayAqLwogc3RhdGljIERFRklORV9TUElOTE9DSyh4ZnNfZXJyX2xvY2spOwpkaWZmIC0tZ2l0IGEvZnMveGZzL3N1cHBvcnQvbW92ZS5jIGIvZnMveGZzL3N1cHBvcnQvbW92ZS5jCmluZGV4IGNhZWZhMTcuLmFjODYxN2MgMTAwNjQ0Ci0tLSBhL2ZzL3hmcy9zdXBwb3J0L21vdmUuYworKysgYi9mcy94ZnMvc3VwcG9ydC9tb3ZlLmMKQEAgLTIyLDcgKzIyLDcgQEAKICAqIGFzIHdlIGdvLgogICovCiBpbnQKLXVpb19yZWFkKGNhZGRyX3Qgc3JjLCBzaXplX3QgbGVuLCBzdHJ1Y3QgdWlvICp1aW8pCit4ZnNfdWlvX3JlYWQoY2FkZHJfdCBzcmMsIHNpemVfdCBsZW4sIHN0cnVjdCB1aW8gKnVpbykKIHsKIAlzaXplX3QJY291bnQ7CiAKZGlmZiAtLWdpdCBhL2ZzL3hmcy9zdXBwb3J0L21vdmUuaCBiL2ZzL3hmcy9zdXBwb3J0L21vdmUuaAppbmRleCA5N2EyNDk4Li45Nzc4NzljIDEwMDY0NAotLS0gYS9mcy94ZnMvc3VwcG9ydC9tb3ZlLmgKKysrIGIvZnMveGZzL3N1cHBvcnQvbW92ZS5oCkBAIC02NSw2ICs2NSw2IEBACiB0eXBlZGVmIHN0cnVjdCB1aW8gdWlvX3Q7CiB0eXBlZGVmIHN0cnVjdCBpb3ZlYyBpb3ZlY190OwogCi1leHRlcm4gaW50CXVpb19yZWFkIChjYWRkcl90LCBzaXplX3QsIHVpb190ICopOworZXh0ZXJuIGludAl4ZnNfdWlvX3JlYWQgKGNhZGRyX3QsIHNpemVfdCwgdWlvX3QgKik7CiAKICNlbmRpZiAgLyogX19YRlNfU1VQUE9SVF9NT1ZFX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZnMveGZzL3hmcy5oIGIvZnMveGZzL3hmcy5oCmluZGV4IDFhNDhkYmIuLmJmMGExMjAgMTAwNjQ0Ci0tLSBhL2ZzL3hmcy94ZnMuaAorKysgYi9mcy94ZnMveGZzLmgKQEAgLTE3LDUgKzE3LDI4IEBACiAgKi8KICNpZm5kZWYgX19YRlNfSF9fCiAjZGVmaW5lIF9fWEZTX0hfXworCisjaWZkZWYgQ09ORklHX1hGU19ERUJVRworI2RlZmluZSBTVEFUSUMKKyNkZWZpbmUgREVCVUcgMQorI2RlZmluZSBYRlNfQlVGX0xPQ0tfVFJBQ0tJTkcgMQorLyogI2RlZmluZSBRVU9UQURFQlVHIDEgKi8KKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX1hGU19UUkFDRQorI2RlZmluZSBYRlNfQUxMT0NfVFJBQ0UgMQorI2RlZmluZSBYRlNfQVRUUl9UUkFDRSAxCisjZGVmaW5lIFhGU19CTElfVFJBQ0UgMQorI2RlZmluZSBYRlNfQk1BUF9UUkFDRSAxCisjZGVmaW5lIFhGU19CTUJUX1RSQUNFIDEKKyNkZWZpbmUgWEZTX0RJUjJfVFJBQ0UgMQorI2RlZmluZSBYRlNfRFFVT1RfVFJBQ0UgMQorI2RlZmluZSBYRlNfSUxPQ0tfVFJBQ0UgMQorI2RlZmluZSBYRlNfTE9HX1RSQUNFIDEKKyNkZWZpbmUgWEZTX1JXX1RSQUNFIDEKKyNkZWZpbmUgWEZTX0JVRl9UUkFDRSAxCisjZGVmaW5lIFhGU19WTk9ERV9UUkFDRSAxCisjZW5kaWYKKwogI2luY2x1ZGUgPGxpbnV4LTIuNi94ZnNfbGludXguaD4KICNlbmRpZgkvKiBfX1hGU19IX18gKi8KZGlmZiAtLWdpdCBhL2ZzL3hmcy94ZnNfYm1hcC5jIGIvZnMveGZzL3hmc19ibWFwLmMKaW5kZXggNWIwNTBjMC4uNDk4YWQ1MGQgMTAwNjQ0Ci0tLSBhL2ZzL3hmcy94ZnNfYm1hcC5jCisrKyBiL2ZzL3hmcy94ZnNfYm1hcC5jCkBAIC0xMTcxLDYgKzExNzEsOCBAQAogCQl4ZnNfYm1hcF90cmFjZV9wcmVfdXBkYXRlKGZuYW1lLCAiMCIsIGlwLCBpZHgsIFhGU19EQVRBX0ZPUkspOwogCQl4ZnNfYm1idF9zZXRfYmxvY2tjb3VudChlcCwgdGVtcCk7CiAJCXJbMF0gPSAqbmV3OworCQlyWzFdLmJyX3N0YXRlID0gUFJFVi5icl9zdGF0ZTsKKwkJclsxXS5icl9zdGFydGJsb2NrID0gMDsKIAkJclsxXS5icl9zdGFydG9mZiA9IG5ld19lbmRvZmY7CiAJCXRlbXAyID0gUFJFVi5icl9zdGFydG9mZiArIFBSRVYuYnJfYmxvY2tjb3VudCAtIG5ld19lbmRvZmY7CiAJCXJbMV0uYnJfYmxvY2tjb3VudCA9IHRlbXAyOwpkaWZmIC0tZ2l0IGEvZnMveGZzL3hmc19kaXIyLmMgYi9mcy94ZnMveGZzX2RpcjIuYwppbmRleCA4ZWRiZTFhLi44ZThlNTI3IDEwMDY0NAotLS0gYS9mcy94ZnMveGZzX2RpcjIuYworKysgYi9mcy94ZnMveGZzX2RpcjIuYwpAQCAtNjc4LDcgKzY3OCw3IEBACiAJaWRicC0+ZF9vZmYgPSBwYS0+Y29vazsKIAlpZGJwLT5kX25hbWVbbmFtZWxlbl0gPSAnXDAnOwogCW1lbWNweShpZGJwLT5kX25hbWUsIHBhLT5uYW1lLCBuYW1lbGVuKTsKLQlydmFsID0gdWlvX3JlYWQoKGNhZGRyX3QpaWRicCwgcmVjbGVuLCB1aW8pOworCXJ2YWwgPSB4ZnNfdWlvX3JlYWQoKGNhZGRyX3QpaWRicCwgcmVjbGVuLCB1aW8pOwogCXBhLT5kb25lID0gKHJ2YWwgPT0gMCk7CiAJcmV0dXJuIHJ2YWw7CiB9CmRpZmYgLS1naXQgYS9mcy94ZnMveGZzX2RtYXBpLmggYi9mcy94ZnMveGZzX2RtYXBpLmgKaW5kZXggNGU3ODY1YS4uYWRjM2QyNSAxMDA2NDQKLS0tIGEvZnMveGZzL3hmc19kbWFwaS5oCisrKyBiL2ZzL3hmcy94ZnNfZG1hcGkuaApAQCAtMTU3LDI3ICsxNTcsOSBAQAogI2RlZmluZSBETV9GTEFHU19JQUxMT0NTRU1fV1IJMHgwMjAJLyogdGhyZWFkIGhvbGRzIGlfYWxsb2Nfc2VtIHdyICovCiAKIC8qCi0gKglCYXNlZCBvbiBJT19JU0RJUkVDVCwgZGVjaWRlIHdoaWNoIGlfIGZsYWcgaXMgc2V0LgorICoJUHVsbCBpbiBwbGF0Zm9ybSBzcGVjaWZpYyBldmVudCBmbGFncyBkZWZpbmVzCiAgKi8KLSNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPiBLRVJORUxfVkVSU0lPTigyLDYsMCkKLSNkZWZpbmUgRE1fU0VNX0ZMQUdfUkQoaW9mbGFncykgKCgoaW9mbGFncykgJiBJT19JU0RJUkVDVCkgPyBcCi0JCQkgICAgICBETV9GTEFHU19JTVVYIDogMCkKLSNkZWZpbmUgRE1fU0VNX0ZMQUdfV1IJKERNX0ZMQUdTX0lBTExPQ1NFTV9XUiB8IERNX0ZMQUdTX0lNVVgpCi0jZW5kaWYKLQotI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDYsMCkpICYmIFwKLSAgICAoTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsNCwyMikpCi0jZGVmaW5lIERNX1NFTV9GTEFHX1JEKGlvZmxhZ3MpICgoKGlvZmxhZ3MpICYgSU9fSVNESVJFQ1QpID8gXAotCQkJICAgICAgRE1fRkxBR1NfSUFMTE9DU0VNX1JEIDogRE1fRkxBR1NfSU1VWCkKLSNkZWZpbmUgRE1fU0VNX0ZMQUdfV1IJKERNX0ZMQUdTX0lBTExPQ1NFTV9XUiB8IERNX0ZMQUdTX0lNVVgpCi0jZW5kaWYKLQotI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA8PSBLRVJORUxfVkVSU0lPTigyLDQsMjEpCi0jZGVmaW5lIERNX1NFTV9GTEFHX1JEKGlvZmxhZ3MpICgoKGlvZmxhZ3MpICYgSU9fSVNESVJFQ1QpID8gXAotCQkJICAgICAgMCA6IERNX0ZMQUdTX0lNVVgpCi0jZGVmaW5lIERNX1NFTV9GTEFHX1dSCShETV9GTEFHU19JTVVYKQotI2VuZGlmCi0KKyNpbmNsdWRlICJ4ZnNfZG1hcGlfcHJpdi5oIgogCiAvKgogICoJTWFjcm9zIHRvIHR1cm4gY2FsbGVyIHNwZWNpZmllZCBkZWxheS9ibG9jayBmbGFncyBpbnRvCmRpZmYgLS1naXQgYS9mcy94ZnMveGZzX2lnZXQuYyBiL2ZzL3hmcy94ZnNfaWdldC5jCmluZGV4IGI3M2QyMTYuLmMxYzg5ZGEgMTAwNjQ0Ci0tLSBhL2ZzL3hmcy94ZnNfaWdldC5jCisrKyBiL2ZzL3hmcy94ZnNfaWdldC5jCkBAIC0yMTUsNyArMjE1LDcgQEAKIAkJCSAqIElmIElORVcgaXMgc2V0IHRoaXMgaW5vZGUgaXMgYmVpbmcgc2V0IHVwCiAJCQkgKiB3ZSBuZWVkIHRvIHBhdXNlIGFuZCB0cnkgYWdhaW4uCiAJCQkgKi8KLQkJCWlmIChpcC0+aV9mbGFncyAmIFhGU19JTkVXKSB7CisJCQlpZiAoeGZzX2lmbGFnc190ZXN0KGlwLCBYRlNfSU5FVykpIHsKIAkJCQlyZWFkX3VubG9jaygmaWgtPmloX2xvY2spOwogCQkJCWRlbGF5KDEpOwogCQkJCVhGU19TVEFUU19JTkMoeHNfaWdfZnJlY3ljbGUpOwpAQCAtMjMwLDIyICsyMzAsNTAgQEAKIAkJCQkgKiBvbiBpdHMgd2F5IG91dCBvZiB0aGUgc3lzdGVtLAogCQkJCSAqIHdlIG5lZWQgdG8gcGF1c2UgYW5kIHRyeSBhZ2Fpbi4KIAkJCQkgKi8KLQkJCQlpZiAoaXAtPmlfZmxhZ3MgJiBYRlNfSVJFQ0xBSU0pIHsKKwkJCQlpZiAoeGZzX2lmbGFnc190ZXN0KGlwLCBYRlNfSVJFQ0xBSU0pKSB7CiAJCQkJCXJlYWRfdW5sb2NrKCZpaC0+aWhfbG9jayk7CiAJCQkJCWRlbGF5KDEpOwogCQkJCQlYRlNfU1RBVFNfSU5DKHhzX2lnX2ZyZWN5Y2xlKTsKIAogCQkJCQlnb3RvIGFnYWluOwogCQkJCX0KKwkJCQlBU1NFUlQoeGZzX2lmbGFnc190ZXN0KGlwLCBYRlNfSVJFQ0xBSU1BQkxFKSk7CisKKwkJCQkvKgorCQkJCSAqIElmIGxvb2t1cCBpcyByYWNpbmcgd2l0aCB1bmxpbmssIHRoZW4gd2UKKwkJCQkgKiBzaG91bGQgcmV0dXJuIGFuIGVycm9yIGltbWVkaWF0ZWx5IHNvIHdlCisJCQkJICogZG9uJ3QgcmVtb3ZlIGl0IGZyb20gdGhlIHJlY2xhaW0gbGlzdCBhbmQKKwkJCQkgKiBwb3RlbnRpYWxseSBsZWFrIHRoZSBpbm9kZS4KKwkJCQkgKi8KKwkJCQlpZiAoKGlwLT5pX2QuZGlfbW9kZSA9PSAwKSAmJgorCQkJCSAgICAhKGZsYWdzICYgWEZTX0lHRVRfQ1JFQVRFKSkgeworCQkJCQlyZWFkX3VubG9jaygmaWgtPmloX2xvY2spOworCQkJCQlyZXR1cm4gRU5PRU5UOworCQkJCX0KKworCQkJCS8qCisJCQkJICogVGhlcmUgbWF5IGJlIHRyYW5zYWN0aW9ucyBzaXR0aW5nIGluIHRoZQorCQkJCSAqIGluY29yZSBsb2cgYnVmZmVycyBvciBiZWluZyBmbHVzaGVkIHRvIGRpc2sKKwkJCQkgKiBhdCB0aGlzIHRpbWUuICBXZSBjYW4ndCBjbGVhciB0aGUKKwkJCQkgKiBYRlNfSVJFQ0xBSU1BQkxFIGZsYWcgdW50aWwgdGhlc2UKKwkJCQkgKiB0cmFuc2FjdGlvbnMgaGF2ZSBoaXQgdGhlIGRpc2ssIG90aGVyd2lzZSB3ZQorCQkJCSAqIHdpbGwgdm9pZCB0aGUgZ3VhcmFudGVlIHRoZSBmbGFnIHByb3ZpZGVzCisJCQkJICogeGZzX2l1bnBpbigpCisJCQkJICovCisJCQkJaWYgKHhmc19pcGluY291bnQoaXApKSB7CisJCQkJCXJlYWRfdW5sb2NrKCZpaC0+aWhfbG9jayk7CisJCQkJCXhmc19sb2dfZm9yY2UobXAsIDAsCisJCQkJCQlYRlNfTE9HX0ZPUkNFfFhGU19MT0dfU1lOQyk7CisJCQkJCVhGU19TVEFUU19JTkMoeHNfaWdfZnJlY3ljbGUpOworCQkJCQlnb3RvIGFnYWluOworCQkJCX0KIAogCQkJCXZuX3RyYWNlX2V4aXQodnAsICJ4ZnNfaWdldC5hbGxvYyIsCiAJCQkJCShpbnN0X3QgKilfX3JldHVybl9hZGRyZXNzKTsKIAogCQkJCVhGU19TVEFUU19JTkMoeHNfaWdfZm91bmQpOwogCi0JCQkJc3Bpbl9sb2NrKCZpcC0+aV9mbGFnc19sb2NrKTsKLQkJCQlpcC0+aV9mbGFncyAmPSB+WEZTX0lSRUNMQUlNQUJMRTsKLQkJCQlzcGluX3VubG9jaygmaXAtPmlfZmxhZ3NfbG9jayk7CisJCQkJeGZzX2lmbGFnc19jbGVhcihpcCwgWEZTX0lSRUNMQUlNQUJMRSk7CiAJCQkJdmVyc2lvbiA9IGloLT5paF92ZXJzaW9uOwogCQkJCXJlYWRfdW5sb2NrKCZpaC0+aWhfbG9jayk7CiAJCQkJeGZzX2loYXNoX3Byb21vdGUoaWgsIGlwLCB2ZXJzaW9uKTsKQEAgLTI5OSwxMCArMzI3LDcgQEAKIAkJCWlmIChsb2NrX2ZsYWdzICE9IDApCiAJCQkJeGZzX2lsb2NrKGlwLCBsb2NrX2ZsYWdzKTsKIAotCQkJc3Bpbl9sb2NrKCZpcC0+aV9mbGFnc19sb2NrKTsKLQkJCWlwLT5pX2ZsYWdzICY9IH5YRlNfSVNUQUxFOwotCQkJc3Bpbl91bmxvY2soJmlwLT5pX2ZsYWdzX2xvY2spOwotCisJCQl4ZnNfaWZsYWdzX2NsZWFyKGlwLCBYRlNfSVNUQUxFKTsKIAkJCXZuX3RyYWNlX2V4aXQodnAsICJ4ZnNfaWdldC5mb3VuZCIsCiAJCQkJCQkoaW5zdF90ICopX19yZXR1cm5fYWRkcmVzcyk7CiAJCQlnb3RvIHJldHVybl9pcDsKQEAgLTM3MSwxMCArMzk2LDcgQEAKIAlpaC0+aWhfbmV4dCA9IGlwOwogCWlwLT5pX3VkcXVvdCA9IGlwLT5pX2dkcXVvdCA9IE5VTEw7CiAJaWgtPmloX3ZlcnNpb24rKzsKLQlzcGluX2xvY2soJmlwLT5pX2ZsYWdzX2xvY2spOwotCWlwLT5pX2ZsYWdzIHw9IFhGU19JTkVXOwotCXNwaW5fdW5sb2NrKCZpcC0+aV9mbGFnc19sb2NrKTsKLQorCXhmc19pZmxhZ3Nfc2V0KGlwLCBYRlNfSU5FVyk7CiAJd3JpdGVfdW5sb2NrKCZpaC0+aWhfbG9jayk7CiAKIAkvKgpAQCAtNjI1LDcgKzY0Nyw3IEBACiAJdm5fdHJhY2VfZW50cnkodnAsICJ4ZnNfaXB1dF9uZXciLCAoaW5zdF90ICopX19yZXR1cm5fYWRkcmVzcyk7CiAKIAlpZiAoKGlwLT5pX2QuZGlfbW9kZSA9PSAwKSkgewotCQlBU1NFUlQoIShpcC0+aV9mbGFncyAmIFhGU19JUkVDTEFJTUFCTEUpKTsKKwkJQVNTRVJUKCF4ZnNfaWZsYWdzX3Rlc3QoaXAsIFhGU19JUkVDTEFJTUFCTEUpKTsKIAkJdm5fbWFya19iYWQodnApOwogCX0KIAlpZiAoaW5vZGUtPmlfc3RhdGUgJiBJX05FVykKQEAgLTY4Myw2ICs3MDUsNyBAQAogCS8qCiAJICogRnJlZSBhbGwgbWVtb3J5IGFzc29jaWF0ZWQgd2l0aCB0aGUgaW5vZGUuCiAJICovCisJeGZzX2l1bmxvY2soaXAsIFhGU19JTE9DS19FWENMIHwgWEZTX0lPTE9DS19FWENMKTsKIAl4ZnNfaWRlc3Ryb3koaXApOwogfQogCmRpZmYgLS1naXQgYS9mcy94ZnMveGZzX2lub2RlLmMgYi9mcy94ZnMveGZzX2lub2RlLmMKaW5kZXggYzI3ZDdkNDkuLjQ0ZGZhYzUgMTAwNjQ0Ci0tLSBhL2ZzL3hmcy94ZnNfaW5vZGUuYworKysgYi9mcy94ZnMveGZzX2lub2RlLmMKQEAgLTIxOTMsNyArMjE5Myw3IEBACiAJCQkvKiBJbm9kZSBub3QgaW4gbWVtb3J5IG9yIHdlIGZvdW5kIGl0IGFscmVhZHksCiAJCQkgKiBub3RoaW5nIHRvIGRvCiAJCQkgKi8KLQkJCWlmICghaXAgfHwgKGlwLT5pX2ZsYWdzICYgWEZTX0lTVEFMRSkpIHsKKwkJCWlmICghaXAgfHwgeGZzX2lmbGFnc190ZXN0KGlwLCBYRlNfSVNUQUxFKSkgewogCQkJCXJlYWRfdW5sb2NrKCZpaC0+aWhfbG9jayk7CiAJCQkJY29udGludWU7CiAJCQl9CkBAIC0yMjE1LDEwICsyMjE1LDcgQEAKIAogCQkJaWYgKGlwID09IGZyZWVfaXApIHsKIAkJCQlpZiAoeGZzX2lmbG9ja19ub3dhaXQoaXApKSB7Ci0JCQkJCXNwaW5fbG9jaygmaXAtPmlfZmxhZ3NfbG9jayk7Ci0JCQkJCWlwLT5pX2ZsYWdzIHw9IFhGU19JU1RBTEU7Ci0JCQkJCXNwaW5fdW5sb2NrKCZpcC0+aV9mbGFnc19sb2NrKTsKLQorCQkJCQl4ZnNfaWZsYWdzX3NldChpcCwgWEZTX0lTVEFMRSk7CiAJCQkJCWlmICh4ZnNfaW5vZGVfY2xlYW4oaXApKSB7CiAJCQkJCQl4ZnNfaWZ1bmxvY2soaXApOwogCQkJCQl9IGVsc2UgewpAQCAtMjIzMSw5ICsyMjI4LDcgQEAKIAogCQkJaWYgKHhmc19pbG9ja19ub3dhaXQoaXAsIFhGU19JTE9DS19FWENMKSkgewogCQkJCWlmICh4ZnNfaWZsb2NrX25vd2FpdChpcCkpIHsKLQkJCQkJc3Bpbl9sb2NrKCZpcC0+aV9mbGFnc19sb2NrKTsKLQkJCQkJaXAtPmlfZmxhZ3MgfD0gWEZTX0lTVEFMRTsKLQkJCQkJc3Bpbl91bmxvY2soJmlwLT5pX2ZsYWdzX2xvY2spOworCQkJCQl4ZnNfaWZsYWdzX3NldChpcCwgWEZTX0lTVEFMRSk7CiAKIAkJCQkJaWYgKHhmc19pbm9kZV9jbGVhbihpcCkpIHsKIAkJCQkJCXhmc19pZnVubG9jayhpcCk7CkBAIC0yMjYzLDkgKzIyNTgsNyBAQAogCQkJCUFJTF9MT0NLKG1wLHMpOwogCQkJCWlpcC0+aWxpX2ZsdXNoX2xzbiA9IGlpcC0+aWxpX2l0ZW0ubGlfbHNuOwogCQkJCUFJTF9VTkxPQ0sobXAsIHMpOwotCQkJCXNwaW5fbG9jaygmaWlwLT5pbGlfaW5vZGUtPmlfZmxhZ3NfbG9jayk7Ci0JCQkJaWlwLT5pbGlfaW5vZGUtPmlfZmxhZ3MgfD0gWEZTX0lTVEFMRTsKLQkJCQlzcGluX3VubG9jaygmaWlwLT5pbGlfaW5vZGUtPmlfZmxhZ3NfbG9jayk7CisJCQkJeGZzX2lmbGFnc19zZXQoaWlwLT5pbGlfaW5vZGUsIFhGU19JU1RBTEUpOwogCQkJCXByZV9mbHVzaGVkKys7CiAJCQl9CiAJCQlsaXAgPSBsaXAtPmxpX2Jpb19saXN0OwpAQCAtMjc0OCw0MiArMjc0MSwzOSBAQAogewogCUFTU0VSVChhdG9taWNfcmVhZCgmaXAtPmlfcGluY291bnQpID4gMCk7CiAKLQlpZiAoYXRvbWljX2RlY19hbmRfdGVzdCgmaXAtPmlfcGluY291bnQpKSB7Ci0JCS8qCi0JCSAqIElmIHRoZSBpbm9kZSBpcyBjdXJyZW50bHkgYmVpbmcgcmVjbGFpbWVkLCB0aGUKLQkJICogbGludXggaW5vZGUgX2FuZF8gdGhlIHhmcyB2bm9kZSBtYXkgaGF2ZSBiZWVuCi0JCSAqIGZyZWVkIHNvIHdlIGNhbm5vdCByZWZlcmVuY2UgZWl0aGVyIG9mIHRoZW0gc2FmZWx5LgotCQkgKiBIZW5jZSB3ZSBzaG91bGQgbm90IHRyeSB0byBkbyBhbnl0aGluZyB0byB0aGVtCi0JCSAqIGlmIHRoZSB4ZnMgaW5vZGUgaXMgY3VycmVudGx5IGluIHRoZSByZWNsYWltCi0JCSAqIHBhdGguCi0JCSAqCi0JCSAqIEhvd2V2ZXIsIHdlIHN0aWxsIG5lZWQgdG8gaXNzdWUgdGhlIHVucGluIHdha2V1cAotCQkgKiBjYWxsIGFzIHRoZSBpbm9kZSByZWNsYWltIG1heSBiZSBibG9ja2VkIHdhaXRpbmcgZm9yCi0JCSAqIHRoZSBpbm9kZSB0byBiZWNvbWUgdW5waW5uZWQuCi0JCSAqLwotCQlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gTlVMTDsKKwlpZiAoYXRvbWljX2RlY19hbmRfbG9jaygmaXAtPmlfcGluY291bnQsICZpcC0+aV9mbGFnc19sb2NrKSkgewogCi0JCXNwaW5fbG9jaygmaXAtPmlfZmxhZ3NfbG9jayk7Ci0JCWlmICghKGlwLT5pX2ZsYWdzICYgKFhGU19JUkVDTEFJTXxYRlNfSVJFQ0xBSU1BQkxFKSkpIHsKKwkJLyoKKwkJICogSWYgdGhlIGlub2RlIGlzIGN1cnJlbnRseSBiZWluZyByZWNsYWltZWQsIHRoZSBsaW5rIGJldHdlZW4KKwkJICogdGhlIGJodl92bm9kZSBhbmQgdGhlIHhmc19pbm9kZSB3aWxsIGJlIGJyb2tlbiBhZnRlciB0aGUKKwkJICogWEZTX0lSRUNMQUlNKiBmbGFnIGlzIHNldC4gSGVuY2UsIGlmIHRoZXNlIGZsYWdzIGFyZSBub3QKKwkJICogc2V0LCB0aGVuIHdlIGNhbiBtb3ZlIGZvcndhcmQgYW5kIG1hcmsgdGhlIGxpbnV4IGlub2RlIGRpcnR5CisJCSAqIGtub3dpbmcgdGhhdCBpdCBpcyBzdGlsbCB2YWxpZCBhcyBpdCB3b24ndCBmcmVlZCB1bnRpbCBhZnRlcgorCQkgKiB0aGUgYmh2X3Zub2RlPC0+eGZzX2lub2RlIGxpbmsgaXMgYnJva2VuIGluIHhmc19yZWNsYWltLiBUaGUKKwkJICogaV9mbGFnc19sb2NrIGlzIHVzZWQgdG8gc3luY2hyb25pc2UgdGhlIHNldHRpbmcgb2YgdGhlCisJCSAqIFhGU19JUkVDTEFJTSogZmxhZ3MgYW5kIHRoZSBicmVha2luZyBvZiB0aGUgbGluaywgYW5kIHNvIHdlCisJCSAqIGNhbiBleGVjdXRlIGF0b21pY2FsbHkgdy5yLnQgdG8gcmVjbGFpbSBieSBob2xkaW5nIHRoaXMgbG9jaworCQkgKiBoZXJlLgorCQkgKgorCQkgKiBIb3dldmVyLCB3ZSBzdGlsbCBuZWVkIHRvIGlzc3VlIHRoZSB1bnBpbiB3YWtldXAgY2FsbCBhcyB0aGUKKwkJICogaW5vZGUgcmVjbGFpbSBtYXkgYmUgYmxvY2tlZCB3YWl0aW5nIGZvciB0aGUgaW5vZGUgdG8gYmVjb21lCisJCSAqIHVucGlubmVkLgorCQkgKi8KKworCQlpZiAoIV9feGZzX2lmbGFnc190ZXN0KGlwLCBYRlNfSVJFQ0xBSU18WEZTX0lSRUNMQUlNQUJMRSkpIHsKIAkJCWJodl92bm9kZV90CSp2cCA9IFhGU19JVE9WX05VTEwoaXApOworCQkJc3RydWN0IGlub2RlICppbm9kZSA9IE5VTEw7CisKKwkJCUJVR19PTih2cCA9PSBOVUxMKTsKKwkJCWlub2RlID0gdm5fdG9faW5vZGUodnApOworCQkJQlVHX09OKGlub2RlLT5pX3N0YXRlICYgSV9DTEVBUik7CiAKIAkJCS8qIG1ha2Ugc3luYyBjb21lIGJhY2sgYW5kIGZsdXNoIHRoaXMgaW5vZGUgKi8KLQkJCWlmICh2cCkgewotCQkJCWlub2RlID0gdm5fdG9faW5vZGUodnApOwotCi0JCQkJaWYgKCEoaW5vZGUtPmlfc3RhdGUgJgotCQkJCQkJKElfTkVXfElfRlJFRUlOR3xJX0NMRUFSKSkpIHsKLQkJCQkJaW5vZGUgPSBpZ3JhYihpbm9kZSk7Ci0JCQkJCWlmIChpbm9kZSkKLQkJCQkJCW1hcmtfaW5vZGVfZGlydHlfc3luYyhpbm9kZSk7Ci0JCQkJfSBlbHNlCi0JCQkJCWlub2RlID0gTlVMTDsKLQkJCX0KKwkJCWlmICghKGlub2RlLT5pX3N0YXRlICYgKElfTkVXfElfRlJFRUlORykpKQorCQkJCW1hcmtfaW5vZGVfZGlydHlfc3luYyhpbm9kZSk7CiAJCX0KIAkJc3Bpbl91bmxvY2soJmlwLT5pX2ZsYWdzX2xvY2spOwogCQl3YWtlX3VwKCZpcC0+aV9pcGluX3dhaXQpOwotCQlpZiAoaW5vZGUpCi0JCQlpcHV0KGlub2RlKTsKIAl9CiB9CiAKZGlmZiAtLWdpdCBhL2ZzL3hmcy94ZnNfaW5vZGUuaCBiL2ZzL3hmcy94ZnNfaW5vZGUuaAppbmRleCBlOTZlYjA4Li5iYzgyMzcyIDEwMDY0NAotLS0gYS9mcy94ZnMveGZzX2lub2RlLmgKKysrIGIvZnMveGZzL3hmc19pbm9kZS5oCkBAIC0zMDUsNiArMzA1LDQ3IEBACiAjZW5kaWYKIH0geGZzX2lub2RlX3Q7CiAKKworLyoKKyAqIGlfZmxhZ3MgaGVscGVyIGZ1bmN0aW9ucworICovCitzdGF0aWMgaW5saW5lIHZvaWQKK19feGZzX2lmbGFnc19zZXQoeGZzX2lub2RlX3QgKmlwLCB1bnNpZ25lZCBzaG9ydCBmbGFncykKK3sKKwlpcC0+aV9mbGFncyB8PSBmbGFnczsKK30KKworc3RhdGljIGlubGluZSB2b2lkCit4ZnNfaWZsYWdzX3NldCh4ZnNfaW5vZGVfdCAqaXAsIHVuc2lnbmVkIHNob3J0IGZsYWdzKQoreworCXNwaW5fbG9jaygmaXAtPmlfZmxhZ3NfbG9jayk7CisJX194ZnNfaWZsYWdzX3NldChpcCwgZmxhZ3MpOworCXNwaW5fdW5sb2NrKCZpcC0+aV9mbGFnc19sb2NrKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkCit4ZnNfaWZsYWdzX2NsZWFyKHhmc19pbm9kZV90ICppcCwgdW5zaWduZWQgc2hvcnQgZmxhZ3MpCit7CisJc3Bpbl9sb2NrKCZpcC0+aV9mbGFnc19sb2NrKTsKKwlpcC0+aV9mbGFncyAmPSB+ZmxhZ3M7CisJc3Bpbl91bmxvY2soJmlwLT5pX2ZsYWdzX2xvY2spOworfQorCitzdGF0aWMgaW5saW5lIGludAorX194ZnNfaWZsYWdzX3Rlc3QoeGZzX2lub2RlX3QgKmlwLCB1bnNpZ25lZCBzaG9ydCBmbGFncykKK3sKKwlyZXR1cm4gKGlwLT5pX2ZsYWdzICYgZmxhZ3MpOworfQorCitzdGF0aWMgaW5saW5lIGludAoreGZzX2lmbGFnc190ZXN0KHhmc19pbm9kZV90ICppcCwgdW5zaWduZWQgc2hvcnQgZmxhZ3MpCit7CisJaW50IHJldDsKKwlzcGluX2xvY2soJmlwLT5pX2ZsYWdzX2xvY2spOworCXJldCA9IF9feGZzX2lmbGFnc190ZXN0KGlwLCBmbGFncyk7CisJc3Bpbl91bmxvY2soJmlwLT5pX2ZsYWdzX2xvY2spOworCXJldHVybiByZXQ7Cit9CiAjZW5kaWYJLyogX19LRVJORUxfXyAqLwogCiAKZGlmZiAtLWdpdCBhL2ZzL3hmcy94ZnNfdm5vZGVvcHMuYyBiL2ZzL3hmcy94ZnNfdm5vZGVvcHMuYwppbmRleCAwNjFlMmZmLi5iZGE3NzRhIDEwMDY0NAotLS0gYS9mcy94ZnMveGZzX3Zub2Rlb3BzLmMKKysrIGIvZnMveGZzL3hmc192bm9kZW9wcy5jCkBAIC0xMDEzLDcgKzEwMTMsNyBAQAogCXBhdGhsZW4gPSAoaW50KWlwLT5pX2QuZGlfc2l6ZTsKIAogCWlmIChpcC0+aV9kZi5pZl9mbGFncyAmIFhGU19JRklOTElORSkgewotCQllcnJvciA9IHVpb19yZWFkKGlwLT5pX2RmLmlmX3UxLmlmX2RhdGEsIHBhdGhsZW4sIHVpb3ApOworCQllcnJvciA9IHhmc191aW9fcmVhZChpcC0+aV9kZi5pZl91MS5pZl9kYXRhLCBwYXRobGVuLCB1aW9wKTsKIAl9CiAJZWxzZSB7CiAJCS8qCkBAIC0xMDQ0LDcgKzEwNDQsNyBAQAogCQkJCWJ5dGVfY250ID0gcGF0aGxlbjsKIAkJCXBhdGhsZW4gLT0gYnl0ZV9jbnQ7CiAKLQkJCWVycm9yID0gdWlvX3JlYWQoWEZTX0JVRl9QVFIoYnApLCBieXRlX2NudCwgdWlvcCk7CisJCQllcnJvciA9IHhmc191aW9fcmVhZChYRlNfQlVGX1BUUihicCksIGJ5dGVfY250LCB1aW9wKTsKIAkJCXhmc19idWZfcmVsc2UgKGJwKTsKIAkJfQogCkBAIC0zODI3LDExICszODI3LDE2IEBACiAJICovCiAJeGZzX3N5bmNocm9uaXplX2F0aW1lKGlwKTsKIAotCS8qIElmIHdlIGhhdmUgbm90aGluZyB0byBmbHVzaCB3aXRoIHRoaXMgaW5vZGUgdGhlbiBjb21wbGV0ZSB0aGUKLQkgKiB0ZWFyZG93biBub3csIG90aGVyd2lzZSBicmVhayB0aGUgbGluayBiZXR3ZWVuIHRoZSB4ZnMgaW5vZGUKLQkgKiBhbmQgdGhlIGxpbnV4IGlub2RlIGFuZCBjbGVhbiB1cCB0aGUgeGZzIGlub2RlIGxhdGVyLiBUaGlzCi0JICogYXZvaWRzIGZsdXNoaW5nIHRoZSBpbm9kZSB0byBkaXNrIGR1cmluZyB0aGUgZGVsZXRlIG9wZXJhdGlvbgotCSAqIGl0c2VsZi4KKwkvKgorCSAqIElmIHdlIGhhdmUgbm90aGluZyB0byBmbHVzaCB3aXRoIHRoaXMgaW5vZGUgdGhlbiBjb21wbGV0ZSB0aGUKKwkgKiB0ZWFyZG93biBub3csIG90aGVyd2lzZSBicmVhayB0aGUgbGluayBiZXR3ZWVuIHRoZSB4ZnMgaW5vZGUgYW5kIHRoZQorCSAqIGxpbnV4IGlub2RlIGFuZCBjbGVhbiB1cCB0aGUgeGZzIGlub2RlIGxhdGVyLiBUaGlzIGF2b2lkcyBmbHVzaGluZworCSAqIHRoZSBpbm9kZSB0byBkaXNrIGR1cmluZyB0aGUgZGVsZXRlIG9wZXJhdGlvbiBpdHNlbGYuCisJICoKKwkgKiBXaGVuIGJyZWFraW5nIHRoZSBsaW5rLCB3ZSBuZWVkIHRvIHNldCB0aGUgWEZTX0lSRUNMQUlNQUJMRSBmbGFnCisJICogZmlyc3QgdG8gZW5zdXJlIHRoYXQgeGZzX2l1bnBpbigpIHdpbGwgbmV2ZXIgc2VlIGFuIHhmcyBpbm9kZQorCSAqIHRoYXQgaGFzIGEgbGludXggaW5vZGUgYmVpbmcgcmVjbGFpbWVkLiBTeW5jaHJvbmlzYXRpb24gaXMgcHJvdmlkZWQKKwkgKiBieSB0aGUgaV9mbGFnc19sb2NrLgogCSAqLwogCWlmICghaXAtPmlfdXBkYXRlX2NvcmUgJiYgKGlwLT5pX2l0ZW1wID09IE5VTEwpKSB7CiAJCXhmc19pbG9jayhpcCwgWEZTX0lMT0NLX0VYQ0wpOwpAQCAtMzg0MCwxMyArMzg0NSwxMyBAQAogCX0gZWxzZSB7CiAJCXhmc19tb3VudF90CSptcCA9IGlwLT5pX21vdW50OwogCi0JCS8qIFByb3RlY3Qgc3luYyBmcm9tIHVzICovCisJCS8qIFByb3RlY3Qgc3luYyBhbmQgdW5waW4gZnJvbSB1cyAqLwogCQlYRlNfTU9VTlRfSUxPQ0sobXApOwotCQl2bl9iaHZfcmVtb3ZlKFZOX0JIVl9IRUFEKHZwKSwgWEZTX0lUT0JIVihpcCkpOwotCQlsaXN0X2FkZF90YWlsKCZpcC0+aV9yZWNsYWltLCAmbXAtPm1fZGVsX2lub2Rlcyk7CiAJCXNwaW5fbG9jaygmaXAtPmlfZmxhZ3NfbG9jayk7Ci0JCWlwLT5pX2ZsYWdzIHw9IFhGU19JUkVDTEFJTUFCTEU7CisJCV9feGZzX2lmbGFnc19zZXQoaXAsIFhGU19JUkVDTEFJTUFCTEUpOworCQl2bl9iaHZfcmVtb3ZlKFZOX0JIVl9IRUFEKHZwKSwgWEZTX0lUT0JIVihpcCkpOwogCQlzcGluX3VubG9jaygmaXAtPmlfZmxhZ3NfbG9jayk7CisJCWxpc3RfYWRkX3RhaWwoJmlwLT5pX3JlY2xhaW0sICZtcC0+bV9kZWxfaW5vZGVzKTsKIAkJWEZTX01PVU5UX0lVTkxPQ0sobXApOwogCX0KIAlyZXR1cm4gMDsKQEAgLTM4NzIsOCArMzg3Nyw4IEBACiAJICovCiAJd3JpdGVfbG9jaygmaWgtPmloX2xvY2spOwogCXNwaW5fbG9jaygmaXAtPmlfZmxhZ3NfbG9jayk7Ci0JaWYgKChpcC0+aV9mbGFncyAmIFhGU19JUkVDTEFJTSkgfHwKLQkgICAgKCEoaXAtPmlfZmxhZ3MgJiBYRlNfSVJFQ0xBSU1BQkxFKSAmJiB2cCA9PSBOVUxMKSkgeworCWlmIChfX3hmc19pZmxhZ3NfdGVzdChpcCwgWEZTX0lSRUNMQUlNKSB8fAorCSAgICAoIV9feGZzX2lmbGFnc190ZXN0KGlwLCBYRlNfSVJFQ0xBSU1BQkxFKSAmJiB2cCA9PSBOVUxMKSkgewogCQlzcGluX3VubG9jaygmaXAtPmlfZmxhZ3NfbG9jayk7CiAJCXdyaXRlX3VubG9jaygmaWgtPmloX2xvY2spOwogCQlpZiAobG9ja2VkKSB7CkBAIC0zODgyLDcgKzM4ODcsNyBAQAogCQl9CiAJCXJldHVybiAxOwogCX0KLQlpcC0+aV9mbGFncyB8PSBYRlNfSVJFQ0xBSU07CisJX194ZnNfaWZsYWdzX3NldChpcCwgWEZTX0lSRUNMQUlNKTsKIAlzcGluX3VubG9jaygmaXAtPmlfZmxhZ3NfbG9jayk7CiAJd3JpdGVfdW5sb2NrKCZpaC0+aWhfbG9jayk7CiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYWNwaS9wZGNfaW50ZWwuaCBiL2luY2x1ZGUvYWNwaS9wZGNfaW50ZWwuaAppbmRleCBjNTQ3MmJlLi5lNzJiZmRkIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FjcGkvcGRjX2ludGVsLmgKKysrIGIvaW5jbHVkZS9hY3BpL3BkY19pbnRlbC5oCkBAIC0xMyw2ICsxMyw3IEBACiAjZGVmaW5lIEFDUElfUERDX1NNUF9DX1NXQ09PUkQJCSgweDAwNDApCiAjZGVmaW5lIEFDUElfUERDX1NNUF9UX1NXQ09PUkQJCSgweDAwODApCiAjZGVmaW5lIEFDUElfUERDX0NfQzFfRkZICQkoMHgwMTAwKQorI2RlZmluZSBBQ1BJX1BEQ19DX0MyQzNfRkZICQkoMHgwMjAwKQogCiAjZGVmaW5lIEFDUElfUERDX0VTVF9DQVBBQklMSVRZX1NNUAkoQUNQSV9QRENfU01QX0MxUFQgfCBcCiAJCQkJCSBBQ1BJX1BEQ19DX0MxX0hBTFQgfCBcCkBAIC0yMyw4ICsyNCwxMCBAQAogCQkJCQkgQUNQSV9QRENfU01QX1BfU1dDT09SRCB8IFwKIAkJCQkJIEFDUElfUERDX1BfRkZIKQogCi0jZGVmaW5lIEFDUElfUERDX0NfQ0FQQUJJTElUWV9TTVAJKEFDUElfUERDX1NNUF9DMkMzIHwgXAotCQkJCQkgQUNQSV9QRENfU01QX0MxUFQgfCBcCi0JCQkJCSBBQ1BJX1BEQ19DX0MxX0hBTFQpCisjZGVmaW5lIEFDUElfUERDX0NfQ0FQQUJJTElUWV9TTVAJKEFDUElfUERDX1NNUF9DMkMzICB8IFwKKwkJCQkJIEFDUElfUERDX1NNUF9DMVBUICB8IFwKKwkJCQkJIEFDUElfUERDX0NfQzFfSEFMVCB8IFwKKwkJCQkJIEFDUElfUERDX0NfQzFfRkZIICB8IFwKKwkJCQkJIEFDUElfUERDX0NfQzJDM19GRkgpCiAKICNlbmRpZgkJCQkvKiBfX1BEQ19JTlRFTF9IX18gKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYWNwaS9wcm9jZXNzb3IuaCBiL2luY2x1ZGUvYWNwaS9wcm9jZXNzb3IuaAppbmRleCA5ZGQ1Yjc1Li43Nzk4ZDJhIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FjcGkvcHJvY2Vzc29yLmgKKysrIGIvaW5jbHVkZS9hY3BpL3Byb2Nlc3Nvci5oCkBAIC0yOSw2ICsyOSw5IEBACiAjZGVmaW5lIERPTUFJTl9DT09SRF9UWVBFX1NXX0FOWQkweGZkCiAjZGVmaW5lIERPTUFJTl9DT09SRF9UWVBFX0hXX0FMTAkweGZlCiAKKyNkZWZpbmUgQUNQSV9DU1RBVEVfU1lTVEVNSU8JKDApCisjZGVmaW5lIEFDUElfQ1NUQVRFX0ZGSAkJKDEpCisKIC8qIFBvd2VyIE1hbmFnZW1lbnQgKi8KIAogc3RydWN0IGFjcGlfcHJvY2Vzc29yX2N4OwpAQCAtNTgsNiArNjEsOCBAQAogCXU4IHZhbGlkOwogCXU4IHR5cGU7CiAJdTMyIGFkZHJlc3M7CisJdTggc3BhY2VfaWQ7CisJdTggaW5kZXg7CiAJdTMyIGxhdGVuY3k7CiAJdTMyIGxhdGVuY3lfdGlja3M7CiAJdTMyIHBvd2VyOwpAQCAtMjA2LDYgKzIxMSw5IEBACiAjaWZkZWYgQVJDSF9IQVNfUE9XRVJfSU5JVAogdm9pZCBhY3BpX3Byb2Nlc3Nvcl9wb3dlcl9pbml0X2JtX2NoZWNrKHN0cnVjdCBhY3BpX3Byb2Nlc3Nvcl9mbGFncyAqZmxhZ3MsCiAJCQkJCXVuc2lnbmVkIGludCBjcHUpOworaW50IGFjcGlfcHJvY2Vzc29yX2ZmaF9jc3RhdGVfcHJvYmUodW5zaWduZWQgaW50IGNwdSwKKwkJc3RydWN0IGFjcGlfcHJvY2Vzc29yX2N4ICpjeCwgc3RydWN0IGFjcGlfcG93ZXJfcmVnaXN0ZXIgKnJlZyk7Cit2b2lkIGFjcGlfcHJvY2Vzc29yX2ZmaF9jc3RhdGVfZW50ZXIoc3RydWN0IGFjcGlfcHJvY2Vzc29yX2N4ICpjc3RhdGUpOwogI2Vsc2UKIHN0YXRpYyBpbmxpbmUgdm9pZCBhY3BpX3Byb2Nlc3Nvcl9wb3dlcl9pbml0X2JtX2NoZWNrKHN0cnVjdAogCQkJCQkJICAgICAgYWNwaV9wcm9jZXNzb3JfZmxhZ3MKQEAgLTIxNCw2ICsyMjIsMTYgQEAKIAlmbGFncy0+Ym1fY2hlY2sgPSAxOwogCXJldHVybjsKIH0KK3N0YXRpYyBpbmxpbmUgaW50IGFjcGlfcHJvY2Vzc29yX2ZmaF9jc3RhdGVfcHJvYmUodW5zaWduZWQgaW50IGNwdSwKKwkJc3RydWN0IGFjcGlfcHJvY2Vzc29yX2N4ICpjeCwgc3RydWN0IGFjcGlfcG93ZXJfcmVnaXN0ZXIgKnJlZykKK3sKKwlyZXR1cm4gLTE7Cit9CitzdGF0aWMgaW5saW5lIHZvaWQgYWNwaV9wcm9jZXNzb3JfZmZoX2NzdGF0ZV9lbnRlcigKKwkJc3RydWN0IGFjcGlfcHJvY2Vzc29yX2N4ICpjc3RhdGUpCit7CisJcmV0dXJuOworfQogI2VuZGlmCiAKIC8qIGluIHByb2Nlc3Nvcl9wZXJmbGliLmMgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWFscGhhL2lvLmggYi9pbmNsdWRlL2FzbS1hbHBoYS9pby5oCmluZGV4IGY1YWU5OGMuLjVkMTVhZjIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWFscGhhL2lvLmgKKysrIGIvaW5jbHVkZS9hc20tYWxwaGEvaW8uaApAQCAtNTMzLDE5ICs1MzMsNiBAQAogI2RlZmluZSBldGhfaW9fY29weV9hbmRfc3VtKHNrYixzcmMsbGVuLHVudXNlZCkgXAogICBtZW1jcHlfZnJvbWlvKChza2IpLT5kYXRhLHNyYyxsZW4pCiAKLXN0YXRpYyBpbmxpbmUgaW50Ci1jaGVja19zaWduYXR1cmUoY29uc3Qgdm9sYXRpbGUgdm9pZCBfX2lvbWVtICppb19hZGRyLAotCQljb25zdCB1bnNpZ25lZCBjaGFyICpzaWduYXR1cmUsIGludCBsZW5ndGgpCi17Ci0JZG8gewotCQlpZiAocmVhZGIoaW9fYWRkcikgIT0gKnNpZ25hdHVyZSkKLQkJCXJldHVybiAwOwotCQlpb19hZGRyKys7Ci0JCXNpZ25hdHVyZSsrOwotCX0gd2hpbGUgKC0tbGVuZ3RoKTsKLQlyZXR1cm4gMTsKLX0KLQogLyoKICAqIFRoZSBBbHBoYSBKZW5zZW4gaGFyZHdhcmUgZm9yIHNvbWUgcmF0aGVyIHN0cmFuZ2UgcmVhc29uIHB1dHMKICAqIHRoZSBSVEMgY2xvY2sgYXQgMHgxNzAgaW5zdGVhZCBvZiAweDcwLiBQcm9iYWJseSBkdWUgdG8gc29tZQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tYXJtL2FyY2gtcHhhL2lycXMuaCBiL2luY2x1ZGUvYXNtLWFybS9hcmNoLXB4YS9pcnFzLmgKaW5kZXggZjNiYzcwZS4uNjdlZDQzNiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tYXJtL2FyY2gtcHhhL2lycXMuaAorKysgYi9pbmNsdWRlL2FzbS1hcm0vYXJjaC1weGEvaXJxcy5oCkBAIC03Myw3ICs3Myw3IEBACiAjZGVmaW5lIElSUV9UT19HUElPKGkpCSgoKGkpIDwgSVJRX0dQSU8oMikpID8gKChpKSAtIElSUV9HUElPMCkgOiBJUlFfVE9fR1BJT18yX3goaSkpCiAKICNpZiBkZWZpbmVkKENPTkZJR19QWEEyNXgpCi0jZGVmaW5lIFBYQV9MQVNUX0dQSU8JODAKKyNkZWZpbmUgUFhBX0xBU1RfR1BJTwk4NAogI2VsaWYgZGVmaW5lZChDT05GSUdfUFhBMjd4KQogI2RlZmluZSBQWEFfTEFTVF9HUElPCTEyNwogI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1hcm0vYXJjaC1weGEvcHhhLXJlZ3MuaCBiL2luY2x1ZGUvYXNtLWFybS9hcmNoLXB4YS9weGEtcmVncy5oCmluZGV4IGY1Y2M2NWQuLmNmZjc1MmYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWFybS9hcmNoLXB4YS9weGEtcmVncy5oCisrKyBiL2luY2x1ZGUvYXNtLWFybS9hcmNoLXB4YS9weGEtcmVncy5oCkBAIC0xNjgxLDYgKzE2ODEsNyBAQAogI2RlZmluZSBTU1NSX1RJTlQJCSgxIDw8IDE5KQkvKiBSZWNlaXZlciBUaW1lLW91dCBJbnRlcnJ1cHQgKi8KICNkZWZpbmUgU1NTUl9QSU5UCQkoMSA8PCAxOCkJLyogUGVyaXBoZXJhbCBUcmFpbGluZyBCeXRlIEludGVycnVwdCAqLwogCisjZGVmaW5lIFNTUFNQX0ZTUlQJCSgxIDw8IDI1KQkvKiBGcmFtZSBTeW5jIFJlbGF0aXZlIFRpbWluZyAqLwogI2RlZmluZSBTU1BTUF9ETVlTVE9QKHgpCSh4IDw8IDIzKQkvKiBEdW1teSBTdG9wICovCiAjZGVmaW5lIFNTUFNQX1NGUk1XRFRIKHgpCSh4IDw8IDE2KQkvKiBTZXJpYWwgRnJhbWUgV2lkdGggKi8KICNkZWZpbmUgU1NQU1BfU0ZSTURMWSh4KQkoeCA8PCA5KQkvKiBTZXJpYWwgRnJhbWUgRGVsYXkgKi8KQEAgLTIyNDEsNyArMjI0Miw3IEBACiAKICNkZWZpbmUgQ0lDUjFfVEJJVAkoMSA8PCAzMSkJLyogVHJhbnNwYXJlbmN5IGJpdCAqLwogI2RlZmluZSBDSUNSMV9SR0JUX0NPTlYJKDB4MyA8PCAzMCkJLyogUkdCVCBjb252ZXJzaW9uIG1hc2sgKi8KLSNkZWZpbmUgQ0lDUjFfUFBMCSgweDNmIDw8IDE1KQkvKiBQaXhlbHMgcGVyIGxpbmUgbWFzayAqLworI2RlZmluZSBDSUNSMV9QUEwJKDB4N2ZmIDw8IDE1KQkvKiBQaXhlbHMgcGVyIGxpbmUgbWFzayAqLwogI2RlZmluZSBDSUNSMV9SR0JfQ09OVgkoMHg3IDw8IDEyKQkvKiBSR0IgY29udmVyc2lvbiBtYXNrICovCiAjZGVmaW5lIENJQ1IxX1JHQl9GCSgxIDw8IDExKQkvKiBSR0IgZm9ybWF0ICovCiAjZGVmaW5lIENJQ1IxX1lDQkNSX0YJKDEgPDwgMTApCS8qIFlDYkNyIGZvcm1hdCAqLwpAQCAtMjI2Nyw3ICsyMjY4LDcgQEAKICNkZWZpbmUgQ0lDUjNfVlNXCSgweDNmIDw8IDEwKQkvKiBWZXJ0aWNhbCBzeW5jIHB1bHNlIHdpZHRoIG1hc2sgKi8KICNkZWZpbmUgQ0lDUjNfQkZQVwkoMHgzZiA8PCAzKQkvKiBCZWdpbm5pbmctb2YtZnJhbWUgcGl4ZWwgY2xvY2sKIAkJCQkJICAgd2FpdCBjb3VudCBtYXNrICovCi0jZGVmaW5lIENJQ1IzX0xQRgkoMHgzZmYgPDwgMCkJLyogTGluZXMgcGVyIGZyYW1lIG1hc2sgKi8KKyNkZWZpbmUgQ0lDUjNfTFBGCSgweDdmZiA8PCAwKQkvKiBMaW5lcyBwZXIgZnJhbWUgbWFzayAqLwogCiAjZGVmaW5lIENJQ1I0X01DTEtfRExZCSgweDMgPDwgMjQpCS8qIE1DTEsgRGF0YSBDYXB0dXJlIERlbGF5IG1hc2sgKi8KICNkZWZpbmUgQ0lDUjRfUENMS19FTgkoMSA8PCAyMykJLyogUGl4ZWwgY2xvY2sgZW5hYmxlICovCkBAIC0yMjg4LDggKzIyODksOCBAQAogI2RlZmluZSBDSVNSX0VPTAkoMSA8PCA4KQkvKiBFbmQgb2YgbGluZSAqLwogI2RlZmluZSBDSVNSX1BBUl9FUlIJKDEgPDwgNykJLyogUGFyaXR5IGVycm9yICovCiAjZGVmaW5lIENJU1JfQ1FECSgxIDw8IDYpCS8qIENhbWVyYSBpbnRlcmZhY2UgcXVpY2sgZGlzYWJsZSAqLwotI2RlZmluZSBDSVNSX1NPRgkoMSA8PCA1KQkvKiBTdGFydCBvZiBmcmFtZSAqLwotI2RlZmluZSBDSVNSX0NERAkoMSA8PCA0KQkvKiBDYW1lcmEgaW50ZXJmYWNlIGRpc2FibGUgZG9uZSAqLworI2RlZmluZSBDSVNSX0NERAkoMSA8PCA1KQkvKiBDYW1lcmEgaW50ZXJmYWNlIGRpc2FibGUgZG9uZSAqLworI2RlZmluZSBDSVNSX1NPRgkoMSA8PCA0KQkvKiBTdGFydCBvZiBmcmFtZSAqLwogI2RlZmluZSBDSVNSX0VPRgkoMSA8PCAzKQkvKiBFbmQgb2YgZnJhbWUgKi8KICNkZWZpbmUgQ0lTUl9JRk9fMgkoMSA8PCAyKQkvKiBGSUZPIG92ZXJydW4gZm9yIENoYW5uZWwgMiAqLwogI2RlZmluZSBDSVNSX0lGT18xCSgxIDw8IDEpCS8qIEZJRk8gb3ZlcnJ1biBmb3IgQ2hhbm5lbCAxICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1hcm0vYXJjaC1zYTExMDAvam9ybmFkYTcyMC5oIGIvaW5jbHVkZS9hc20tYXJtL2FyY2gtc2ExMTAwL2pvcm5hZGE3MjAuaAppbmRleCAxYjhlOGEzLi4zZjM3Y2EwIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1hcm0vYXJjaC1zYTExMDAvam9ybmFkYTcyMC5oCisrKyBiL2luY2x1ZGUvYXNtLWFybS9hcmNoLXNhMTEwMC9qb3JuYWRhNzIwLmgKQEAgLTE5LDYgKzE5LDIwIEBACiAjZGVmaW5lIEdQSU9fSk9STkFEQTcyMF9LRVlCT0FSRF9JUlEJSVJRX0dQSU8wCiAjZGVmaW5lIEdQSU9fSk9STkFEQTcyMF9NT1VTRV9JUlEJCUlSUV9HUElPOQogCisvKiBNQ1UgQ09NTUFORFMgKi8KKyNkZWZpbmUgTUNVX0dldEJhdHRlcnlEYXRhICAweGMwCisjZGVmaW5lIE1DVV9HZXRTY2FuS2V5Q29kZSAgMHg5MAorI2RlZmluZSBNQ1VfR2V0VG91Y2hTYW1wbGVzIDB4YTAKKyNkZWZpbmUgTUNVX0dldENvbnRyYXN0ICAgICAweEQwCisjZGVmaW5lIE1DVV9TZXRDb250cmFzdCAgICAgMHhEMQorI2RlZmluZSBNQ1VfR2V0QnJpZ2h0bmVzcyAgIDB4RDIKKyNkZWZpbmUgTUNVX1NldEJyaWdodG5lc3MgICAweEQzCisjZGVmaW5lIE1DVV9Db250cmFzdE9mZiAgICAgMHhEOAorI2RlZmluZSBNQ1VfQnJpZ2h0bmVzc09mZiAgIDB4RDkKKyNkZWZpbmUgTUNVX1BXTU9GRiAgICAgICAgICAweERGCisjZGVmaW5lIE1DVV9UeER1bW15ICAgICAgICAgMHgxMQorI2RlZmluZSBNQ1VfRXJyb3JDb2RlICAgICAgIDB4MDAKKwogI2lmbmRlZiBfX0FTU0VNQkxZX18KIAogdm9pZCBqb3JuYWRhNzIwX21jdV9pbml0KHZvaWQpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tYXJtL2FyY2gtdmVyc2F0aWxlL2hhcmR3YXJlLmggYi9pbmNsdWRlL2FzbS1hcm0vYXJjaC12ZXJzYXRpbGUvaGFyZHdhcmUuaAppbmRleCA0MWMxYmVlLi5lZGMwNjU5IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1hcm0vYXJjaC12ZXJzYXRpbGUvaGFyZHdhcmUuaAorKysgYi9pbmNsdWRlL2FzbS1hcm0vYXJjaC12ZXJzYXRpbGUvaGFyZHdhcmUuaApAQCAtMjgsOCArMjgsOCBAQAogLyoKICAqIFBDSSBzcGFjZSB2aXJ0dWFsIGFkZHJlc3NlcwogICovCi0jZGVmaW5lIFZFUlNBVElMRV9QQ0lfVklSVF9CQVNFCQkweGU4MDAwMDAwCi0jZGVmaW5lIFZFUlNBVElMRV9QQ0lfQ0ZHX1ZJUlRfQkFTRQkweGU5MDAwMDAwCisjZGVmaW5lIFZFUlNBVElMRV9QQ0lfVklSVF9CQVNFCQkodm9pZCBfX2lvbWVtICopMHhlODAwMDAwMHVsCisjZGVmaW5lIFZFUlNBVElMRV9QQ0lfQ0ZHX1ZJUlRfQkFTRQkodm9pZCBfX2lvbWVtICopMHhlOTAwMDAwMHVsCiAKICNpZiAwCiAjZGVmaW5lIFZFUlNBVElMRV9QQ0lfVklSVF9NRU1fQkFTRTAJMHhmNDAwMDAwMApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tYXJtL2lvLmggYi9pbmNsdWRlL2FzbS1hcm0vaW8uaAppbmRleCAzNGFhYWFjLi5hZTk5OWZkIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1hcm0vaW8uaAorKysgYi9pbmNsdWRlL2FzbS1hcm0vaW8uaApAQCAtMTkzLDIzICsxOTMsNiBAQAogI2RlZmluZSBldGhfaW9fY29weV9hbmRfc3VtKHMsYyxsLGIpIFwKIAkJCQlldGhfY29weV9hbmRfc3VtKChzKSxfX21lbV9wY2koYyksKGwpLChiKSkKIAotc3RhdGljIGlubGluZSBpbnQKLWNoZWNrX3NpZ25hdHVyZSh2b2lkIF9faW9tZW0gKmlvX2FkZHIsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNpZ25hdHVyZSwKLQkJaW50IGxlbmd0aCkKLXsKLQlpbnQgcmV0dmFsID0gMDsKLQlkbyB7Ci0JCWlmIChyZWFkYihpb19hZGRyKSAhPSAqc2lnbmF0dXJlKQotCQkJZ290byBvdXQ7Ci0JCWlvX2FkZHIrKzsKLQkJc2lnbmF0dXJlKys7Ci0JCWxlbmd0aC0tOwotCX0gd2hpbGUgKGxlbmd0aCk7Ci0JcmV0dmFsID0gMTsKLW91dDoKLQlyZXR1cm4gcmV0dmFsOwotfQotCiAjZWxpZiAhZGVmaW5lZChyZWFkYikKIAogI2RlZmluZSByZWFkYihjKQkJCShfX3JlYWR3cml0ZV9idWcoInJlYWRiIiksMCkKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWFybS91YWNjZXNzLmggYi9pbmNsdWRlL2FzbS1hcm0vdWFjY2Vzcy5oCmluZGV4IDg3YWJhNTcuLjVmNDIwYTAgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWFybS91YWNjZXNzLmgKKysrIGIvaW5jbHVkZS9hc20tYXJtL3VhY2Nlc3MuaApAQCAtMTEwLDcgKzExMCw3IEBACiAjZGVmaW5lIGdldF91c2VyKHgscCkJCQkJCQkJXAogCSh7CQkJCQkJCQlcCiAJCWNvbnN0IHJlZ2lzdGVyIHR5cGVvZigqKHApKSBfX3VzZXIgKl9fcCBhc20oInIwIikgPSAocCk7XAotCQlyZWdpc3RlciB1bnNpZ25lZCBpbnQgX19yMiBhc20oInIyIik7CQkJXAorCQlyZWdpc3RlciB1bnNpZ25lZCBsb25nIF9fcjIgYXNtKCJyMiIpOwkJCVwKIAkJcmVnaXN0ZXIgaW50IF9fZSBhc20oInIwIik7CQkJCVwKIAkJc3dpdGNoIChzaXplb2YoKihfX3ApKSkgewkJCQlcCiAJCWNhc2UgMToJCQkJCQkJXApAQCAtMzgzLDE5ICszODMsMTkgQEAKIAogCiAjaWZkZWYgQ09ORklHX01NVQotZXh0ZXJuIHVuc2lnbmVkIGxvbmcgX19jb3B5X2Zyb21fdXNlcih2b2lkICp0bywgY29uc3Qgdm9pZCBfX3VzZXIgKmZyb20sIHVuc2lnbmVkIGxvbmcgbik7Ci1leHRlcm4gdW5zaWduZWQgbG9uZyBfX2NvcHlfdG9fdXNlcih2b2lkIF9fdXNlciAqdG8sIGNvbnN0IHZvaWQgKmZyb20sIHVuc2lnbmVkIGxvbmcgbik7Ci1leHRlcm4gdW5zaWduZWQgbG9uZyBfX2NsZWFyX3VzZXIodm9pZCBfX3VzZXIgKmFkZHIsIHVuc2lnbmVkIGxvbmcgbik7CitleHRlcm4gdW5zaWduZWQgbG9uZyBfX211c3RfY2hlY2sgX19jb3B5X2Zyb21fdXNlcih2b2lkICp0bywgY29uc3Qgdm9pZCBfX3VzZXIgKmZyb20sIHVuc2lnbmVkIGxvbmcgbik7CitleHRlcm4gdW5zaWduZWQgbG9uZyBfX211c3RfY2hlY2sgX19jb3B5X3RvX3VzZXIodm9pZCBfX3VzZXIgKnRvLCBjb25zdCB2b2lkICpmcm9tLCB1bnNpZ25lZCBsb25nIG4pOworZXh0ZXJuIHVuc2lnbmVkIGxvbmcgX19tdXN0X2NoZWNrIF9fY2xlYXJfdXNlcih2b2lkIF9fdXNlciAqYWRkciwgdW5zaWduZWQgbG9uZyBuKTsKICNlbHNlCiAjZGVmaW5lIF9fY29weV9mcm9tX3VzZXIodG8sZnJvbSxuKQkobWVtY3B5KHRvLCAodm9pZCBfX2ZvcmNlICopZnJvbSwgbiksIDApCiAjZGVmaW5lIF9fY29weV90b191c2VyKHRvLGZyb20sbikJKG1lbWNweSgodm9pZCBfX2ZvcmNlICopdG8sIGZyb20sIG4pLCAwKQogI2RlZmluZSBfX2NsZWFyX3VzZXIoYWRkcixuKQkJKG1lbXNldCgodm9pZCBfX2ZvcmNlICopYWRkciwgMCwgbiksIDApCiAjZW5kaWYKIAotZXh0ZXJuIHVuc2lnbmVkIGxvbmcgX19zdHJuY3B5X2Zyb21fdXNlcihjaGFyICp0bywgY29uc3QgY2hhciBfX3VzZXIgKmZyb20sIHVuc2lnbmVkIGxvbmcgY291bnQpOwotZXh0ZXJuIHVuc2lnbmVkIGxvbmcgX19zdHJubGVuX3VzZXIoY29uc3QgY2hhciBfX3VzZXIgKnMsIGxvbmcgbik7CitleHRlcm4gdW5zaWduZWQgbG9uZyBfX211c3RfY2hlY2sgX19zdHJuY3B5X2Zyb21fdXNlcihjaGFyICp0bywgY29uc3QgY2hhciBfX3VzZXIgKmZyb20sIHVuc2lnbmVkIGxvbmcgY291bnQpOworZXh0ZXJuIHVuc2lnbmVkIGxvbmcgX19tdXN0X2NoZWNrIF9fc3Rybmxlbl91c2VyKGNvbnN0IGNoYXIgX191c2VyICpzLCBsb25nIG4pOwogCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgY29weV9mcm9tX3VzZXIodm9pZCAqdG8sIGNvbnN0IHZvaWQgX191c2VyICpmcm9tLCB1bnNpZ25lZCBsb25nIG4pCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgX19tdXN0X2NoZWNrIGNvcHlfZnJvbV91c2VyKHZvaWQgKnRvLCBjb25zdCB2b2lkIF9fdXNlciAqZnJvbSwgdW5zaWduZWQgbG9uZyBuKQogewogCWlmIChhY2Nlc3Nfb2soVkVSSUZZX1JFQUQsIGZyb20sIG4pKQogCQluID0gX19jb3B5X2Zyb21fdXNlcih0bywgZnJvbSwgbik7CkBAIC00MDQsNyArNDA0LDcgQEAKIAlyZXR1cm4gbjsKIH0KIAotc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIGNvcHlfdG9fdXNlcih2b2lkIF9fdXNlciAqdG8sIGNvbnN0IHZvaWQgKmZyb20sIHVuc2lnbmVkIGxvbmcgbikKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBfX211c3RfY2hlY2sgY29weV90b191c2VyKHZvaWQgX191c2VyICp0bywgY29uc3Qgdm9pZCAqZnJvbSwgdW5zaWduZWQgbG9uZyBuKQogewogCWlmIChhY2Nlc3Nfb2soVkVSSUZZX1dSSVRFLCB0bywgbikpCiAJCW4gPSBfX2NvcHlfdG9fdXNlcih0bywgZnJvbSwgbik7CkBAIC00MTQsMTQgKzQxNCwxNCBAQAogI2RlZmluZSBfX2NvcHlfdG9fdXNlcl9pbmF0b21pYyBfX2NvcHlfdG9fdXNlcgogI2RlZmluZSBfX2NvcHlfZnJvbV91c2VyX2luYXRvbWljIF9fY29weV9mcm9tX3VzZXIKIAotc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIGNsZWFyX3VzZXIodm9pZCBfX3VzZXIgKnRvLCB1bnNpZ25lZCBsb25nIG4pCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgX19tdXN0X2NoZWNrIGNsZWFyX3VzZXIodm9pZCBfX3VzZXIgKnRvLCB1bnNpZ25lZCBsb25nIG4pCiB7CiAJaWYgKGFjY2Vzc19vayhWRVJJRllfV1JJVEUsIHRvLCBuKSkKIAkJbiA9IF9fY2xlYXJfdXNlcih0bywgbik7CiAJcmV0dXJuIG47CiB9CiAKLXN0YXRpYyBpbmxpbmUgbG9uZyBzdHJuY3B5X2Zyb21fdXNlcihjaGFyICpkc3QsIGNvbnN0IGNoYXIgX191c2VyICpzcmMsIGxvbmcgY291bnQpCitzdGF0aWMgaW5saW5lIGxvbmcgX19tdXN0X2NoZWNrIHN0cm5jcHlfZnJvbV91c2VyKGNoYXIgKmRzdCwgY29uc3QgY2hhciBfX3VzZXIgKnNyYywgbG9uZyBjb3VudCkKIHsKIAlsb25nIHJlcyA9IC1FRkFVTFQ7CiAJaWYgKGFjY2Vzc19vayhWRVJJRllfUkVBRCwgc3JjLCAxKSkKQEAgLTQzMSw3ICs0MzEsNyBAQAogCiAjZGVmaW5lIHN0cmxlbl91c2VyKHMpCXN0cm5sZW5fdXNlcihzLCB+MFVMID4+IDEpCiAKLXN0YXRpYyBpbmxpbmUgbG9uZyBzdHJubGVuX3VzZXIoY29uc3QgY2hhciBfX3VzZXIgKnMsIGxvbmcgbikKK3N0YXRpYyBpbmxpbmUgbG9uZyBfX211c3RfY2hlY2sgc3Rybmxlbl91c2VyKGNvbnN0IGNoYXIgX191c2VyICpzLCBsb25nIG4pCiB7CiAJdW5zaWduZWQgbG9uZyByZXMgPSAwOwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1hdnIzMi9hdG9taWMuaCBiL2luY2x1ZGUvYXNtLWF2cjMyL2F0b21pYy5oCmluZGV4IGUwYjljNDQuLmM0MGI2MDMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWF2cjMyL2F0b21pYy5oCisrKyBiL2luY2x1ZGUvYXNtLWF2cjMyL2F0b21pYy5oCkBAIC00MSw3ICs0MSw3IEBACiAJCSIJc3Rjb25kCSUxLCAlMFxuIgogCQkiCWJybmUJMWIiCiAJCTogIj0mciIocmVzdWx0KSwgIj1vIih2LT5jb3VudGVyKQotCQk6ICJtIih2LT5jb3VudGVyKSwgImlyIihpKQorCQk6ICJtIih2LT5jb3VudGVyKSwgInJLczIxIihpKQogCQk6ICJjYyIpOwogCiAJcmV0dXJuIHJlc3VsdDsKQEAgLTU4LDcgKzU4LDcgQEAKIHsKIAlpbnQgcmVzdWx0OwogCi0JaWYgKF9fYnVpbHRpbl9jb25zdGFudF9wKGkpKQorCWlmIChfX2J1aWx0aW5fY29uc3RhbnRfcChpKSAmJiAoaSA+PSAtMTA0ODU3NSkgJiYgKGkgPD0gMTA0ODU3NikpCiAJCXJlc3VsdCA9IGF0b21pY19zdWJfcmV0dXJuKC1pLCB2KTsKIAllbHNlCiAJCWFzbSB2b2xhdGlsZSgKQEAgLTEwMSw3ICsxMDEsNyBAQAogCQkiCW1vdgklMSwgMVxuIgogCQkiMToiCiAJCTogIj0mciIodG1wKSwgIj0mciIocmVzdWx0KSwgIj1vIih2LT5jb3VudGVyKQotCQk6ICJtIih2LT5jb3VudGVyKSwgImlyIihhKSwgImlyIih1KQorCQk6ICJtIih2LT5jb3VudGVyKSwgInJLczIxIihhKSwgInJLczIxIih1KQogCQk6ICJjYyIsICJtZW1vcnkiKTsKIAogCXJldHVybiByZXN1bHQ7CkBAIC0xMjEsNyArMTIxLDcgQEAKIHsKIAlpbnQgdG1wLCByZXN1bHQ7CiAKLQlpZiAoX19idWlsdGluX2NvbnN0YW50X3AoYSkpCisJaWYgKF9fYnVpbHRpbl9jb25zdGFudF9wKGEpICYmIChhID49IC0xMDQ4NTc1KSAmJiAoYSA8PSAxMDQ4NTc2KSkKIAkJcmVzdWx0ID0gYXRvbWljX3N1Yl91bmxlc3ModiwgLWEsIHUpOwogCWVsc2UgewogCQlyZXN1bHQgPSAwOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tYXZyMzIvaW8uaCBiL2luY2x1ZGUvYXNtLWF2cjMyL2lvLmgKaW5kZXggMmZjOGYxMS4uZWVjNDc1MCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tYXZyMzIvaW8uaAorKysgYi9pbmNsdWRlL2FzbS1hdnIzMi9pby5oCkBAIC03Niw2ICs3NiwzOSBAQAogI2RlZmluZSByZWFkc3cocCwgZCwgbCkJCV9fcmF3X3JlYWRzdygodW5zaWduZWQgaW50KXAsIGQsIGwpCiAjZGVmaW5lIHJlYWRzbChwLCBkLCBsKQkJX19yYXdfcmVhZHNsKCh1bnNpZ25lZCBpbnQpcCwgZCwgbCkKIAorCisvKgorICogaW97cmVhZCx3cml0ZX17OCwxNiwzMn0gbWFjcm9zIGluIGJvdGggbGUgKGZvciBQQ0kgc3R5bGUgY29uc3VtZXJzKSBhbmQgbmF0aXZlIGJlCisgKi8KKyNpZm5kZWYgaW9yZWFkOAorCisjZGVmaW5lIGlvcmVhZDgocCkJKHsgdW5zaWduZWQgaW50IF9fdiA9IF9fcmF3X3JlYWRiKHApOyBfX3Y7IH0pCisKKyNkZWZpbmUgaW9yZWFkMTYocCkJKHsgdW5zaWduZWQgaW50IF9fdiA9IGxlMTZfdG9fY3B1KF9fcmF3X3JlYWR3KHApKTsgX192OyB9KQorI2RlZmluZSBpb3JlYWQxNmJlKHApCSh7IHVuc2lnbmVkIGludCBfX3YgPSBiZTE2X3RvX2NwdShfX3Jhd19yZWFkdyhwKSk7IF9fdjsgfSkKKworI2RlZmluZSBpb3JlYWQzMihwKQkoeyB1bnNpZ25lZCBpbnQgX192ID0gbGUzMl90b19jcHUoX19yYXdfcmVhZGwocCkpOyBfX3Y7IH0pCisjZGVmaW5lIGlvcmVhZDMyYmUocCkJKHsgdW5zaWduZWQgaW50IF9fdiA9IGJlMzJfdG9fY3B1KF9fcmF3X3JlYWRsKHApKTsgX192OyB9KQorCisjZGVmaW5lIGlvd3JpdGU4KHYscCkJX19yYXdfd3JpdGViKHYsIHApCisKKyNkZWZpbmUgaW93cml0ZTE2KHYscCkJX19yYXdfd3JpdGV3KGNwdV90b19sZTE2KHYpLCBwKQorI2RlZmluZSBpb3dyaXRlMTZiZSh2LHApCV9fcmF3X3dyaXRldyhjcHVfdG9fYmUxNih2KSwgcCkKKworI2RlZmluZSBpb3dyaXRlMzIodixwKQlfX3Jhd193cml0ZWwoY3B1X3RvX2xlMzIodiksIHApCisjZGVmaW5lIGlvd3JpdGUzMmJlKHYscCkJX19yYXdfd3JpdGVsKGNwdV90b19iZTMyKHYpLCBwKQorCisjZGVmaW5lIGlvcmVhZDhfcmVwKHAsZCxjKQlfX3Jhd19yZWFkc2IocCxkLGMpCisjZGVmaW5lIGlvcmVhZDE2X3JlcChwLGQsYykJX19yYXdfcmVhZHN3KHAsZCxjKQorI2RlZmluZSBpb3JlYWQzMl9yZXAocCxkLGMpCV9fcmF3X3JlYWRzbChwLGQsYykKKworI2RlZmluZSBpb3dyaXRlOF9yZXAocCxzLGMpCV9fcmF3X3dyaXRlc2IocCxzLGMpCisjZGVmaW5lIGlvd3JpdGUxNl9yZXAocCxzLGMpCV9fcmF3X3dyaXRlc3cocCxzLGMpCisjZGVmaW5lIGlvd3JpdGUzMl9yZXAocCxzLGMpCV9fcmF3X3dyaXRlc2wocCxzLGMpCisKKyNlbmRpZgorCisKIC8qCiAgKiBUaGVzZSB0d28gYXJlIG9ubHkgaGVyZSBiZWNhdXNlIEFMU0EgX3RoaW5rc18gaXQgbmVlZHMgdGhlbS4uLgogICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1hdnIzMi9pcnFfcmVncy5oIGIvaW5jbHVkZS9hc20tYXZyMzIvaXJxX3JlZ3MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZGQ5YzBiCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9hc20tYXZyMzIvaXJxX3JlZ3MuaApAQCAtMCwwICsxIEBACisjaW5jbHVkZSA8YXNtLWdlbmVyaWMvaXJxX3JlZ3MuaD4KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWF2cjMyL3VuaXN0ZC5oIGIvaW5jbHVkZS9hc20tYXZyMzIvdW5pc3RkLmgKaW5kZXggYTUwZTUwMC4uNTZlZDFmOSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tYXZyMzIvdW5pc3RkLmgKKysrIGIvaW5jbHVkZS9hc20tYXZyMzIvdW5pc3RkLmgKQEAgLTI4MCw5ICsyODAsMTAgQEAKICNkZWZpbmUgX19OUl9zeW5jX2ZpbGVfcmFuZ2UJMjYyCiAjZGVmaW5lIF9fTlJfdGVlCQkyNjMKICNkZWZpbmUgX19OUl92bXNwbGljZQkJMjY0CisjZGVmaW5lIF9fTlJfZXBvbGxfcHdhaXQJMjY1CiAKICNpZmRlZiBfX0tFUk5FTF9fCi0jZGVmaW5lIE5SX3N5c2NhbGxzCQkyNjUKKyNkZWZpbmUgTlJfc3lzY2FsbHMJCTI2NgogCiAKICNkZWZpbmUgX19BUkNIX1dBTlRfSVBDX1BBUlNFX1ZFUlNJT04KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWZydi9oaWdobWVtLmggYi9pbmNsdWRlL2FzbS1mcnYvaGlnaG1lbS5oCmluZGV4IGUyMjQ3YzIuLjBmMzkwZjQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWZydi9oaWdobWVtLmgKKysrIGIvaW5jbHVkZS9hc20tZnJ2L2hpZ2htZW0uaApAQCAtODIsMTEgKzgyLDExIEBACiAJZGFtcHIgPSBwYWRkciB8IHhBTVBSeF9MIHwgeEFNUFJ4X00gfCB4QU1QUnhfUyB8IHhBTVBSeF9TU18xNktiIHwgeEFNUFJ4X1Y7CQlcCiAJCQkJCQkJCQkJCQlcCiAJaWYgKHR5cGUgIT0gX19LTV9DQUNIRSkJCQkJCQkJCQlcCi0JCWFzbSB2b2xhdGlsZSgibW92Z3MgJTAsZGFtcHIiI2FtcHIgOjogInIiKGRhbXByKSk7CQkJCVwKKwkJYXNtIHZvbGF0aWxlKCJtb3ZncyAlMCxkYW1wciIjYW1wciA6OiAiciIoZGFtcHIpIDogIm1lbW9yeSIpOwkJCVwKIAllbHNlCQkJCQkJCQkJCQlcCiAJCWFzbSB2b2xhdGlsZSgibW92Z3MgJTAsaWFtcHIiI2FtcHIiXG4iCQkJCQkJXAogCQkJICAgICAibW92Z3MgJTAsZGFtcHIiI2FtcHIiXG4iCQkJCQkJXAotCQkJICAgICA6OiAiciIoZGFtcHIpCQkJCQkJCVwKKwkJCSAgICAgOjogInIiKGRhbXByKSA6ICJtZW1vcnkiCQkJCQkJXAogCQkJICAgICApOwkJCQkJCQkJCVwKIAkJCQkJCQkJCQkJCVwKIAlhc20oIm1vdnNnIGRhbWxyIiNhbXByIiwlMCIgOiAiPXIiKGRhbWxyKSk7CQkJCQkJXApAQCAtMTA0LDcgKzEwNCw3IEBACiAJYXNtIHZvbGF0aWxlKCJtb3ZncyAlMCx0cGxyIFxuIgkJCQkJCQkJICBcCiAJCSAgICAgIm1vdmdzICUxLHRwcHIgXG4iCQkJCQkJCQkgIFwKIAkJICAgICAidGxicHIgJTAsZ3IwLCMyLCMxIgkJCQkJCQkgIFwKLQkJICAgICA6IDogInIiKGRhbWxyKSwgInIiKGRhbXByKSk7CQkJCQkJICBcCisJCSAgICAgOiA6ICJyIihkYW1sciksICJyIihkYW1wcikgOiAibWVtb3J5Iik7CQkJCQkgIFwKIAkJCQkJCQkJCQkJCSAgXAogCS8qcHJpbnRrKCJUTEI6IFNFQ04gc2w9JWQgTD0lMDhseCBQPSUwOGx4XG4iLCBzbG90LCBkYW1sciwgZGFtcHIpOyovCQkJICBcCiAJCQkJCQkJCQkJCQkgIFwKQEAgLTExNSw3ICsxMTUsNyBAQAogewogCXVuc2lnbmVkIGxvbmcgcGFkZHI7CiAKLQlwcmVlbXB0X2Rpc2FibGUoKTsKKwlpbmNfcHJlZW1wdF9jb3VudCgpOwogCXBhZGRyID0gcGFnZV90b19waHlzKHBhZ2UpOwogCiAJc3dpdGNoICh0eXBlKSB7CkBAIC0xMzgsMTYgKzEzOCwxNiBAQAogCX0KIH0KIAotI2RlZmluZSBfX2t1bm1hcF9hdG9taWNfcHJpbWFyeSh0eXBlLCBhbXByKQkJCVwKLWRvIHsJCQkJCQkJCVwKLQlhc20gdm9sYXRpbGUoIm1vdmdzIGdyMCxkYW1wciIjYW1wciJcbiIpOwkJXAotCWlmICh0eXBlID09IF9fS01fQ0FDSEUpCQkJCQlcCi0JCWFzbSB2b2xhdGlsZSgibW92Z3MgZ3IwLGlhbXByIiNhbXByIlxuIik7CVwKKyNkZWZpbmUgX19rdW5tYXBfYXRvbWljX3ByaW1hcnkodHlwZSwgYW1wcikJCQkJXAorZG8gewkJCQkJCQkJCVwKKwlhc20gdm9sYXRpbGUoIm1vdmdzIGdyMCxkYW1wciIjYW1wciJcbiIgOjo6ICJtZW1vcnkiKTsJCVwKKwlpZiAodHlwZSA9PSBfX0tNX0NBQ0hFKQkJCQkJCVwKKwkJYXNtIHZvbGF0aWxlKCJtb3ZncyBncjAsaWFtcHIiI2FtcHIiXG4iIDo6OiAibWVtb3J5Iik7CVwKIH0gd2hpbGUoMCkKIAotI2RlZmluZSBfX2t1bm1hcF9hdG9taWNfc2Vjb25kYXJ5KHNsb3QsIHZhZGRyKQkJCVwKLWRvIHsJCQkJCQkJCVwKLQlhc20gdm9sYXRpbGUoInRsYnByICUwLGdyMCwjNCwjMSIgOiA6ICJyIih2YWRkcikpOwlcCisjZGVmaW5lIF9fa3VubWFwX2F0b21pY19zZWNvbmRhcnkoc2xvdCwgdmFkZHIpCQkJCVwKK2RvIHsJCQkJCQkJCQlcCisJYXNtIHZvbGF0aWxlKCJ0bGJwciAlMCxncjAsIzQsIzEiIDogOiAiciIodmFkZHIpIDogIm1lbW9yeSIpOwlcCiB9IHdoaWxlKDApCiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBrdW5tYXBfYXRvbWljKHZvaWQgKmt2YWRkciwgZW51bSBrbV90eXBlIHR5cGUpCkBAIC0xNzAsNyArMTcwLDggQEAKIAlkZWZhdWx0OgogCQlCVUcoKTsKIAl9Ci0JcHJlZW1wdF9lbmFibGUoKTsKKwlkZWNfcHJlZW1wdF9jb3VudCgpOworCXByZWVtcHRfY2hlY2tfcmVzY2hlZCgpOwogfQogCiAjZW5kaWYgLyogIV9fQVNTRU1CTFlfXyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tZnJ2L2lvLmggYi9pbmNsdWRlL2FzbS1mcnYvaW8uaAppbmRleCA3NzY1ZjU1Li4yMGU0NGZlMCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tZnJ2L2lvLmgKKysrIGIvaW5jbHVkZS9hc20tZnJ2L2lvLmgKQEAgLTM4NSwyNyArMzg1LDYgQEAKICAqLwogI2RlZmluZSB4bGF0ZV9kZXZfa21lbV9wdHIocCkJcAogCi0vKgotICogQ2hlY2sgQklPUyBzaWduYXR1cmUKLSAqLwotc3RhdGljIGlubGluZSBpbnQgY2hlY2tfc2lnbmF0dXJlKHZvbGF0aWxlIHZvaWQgX19pb21lbSAqaW9fYWRkciwKLQkJCQkgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNpZ25hdHVyZSwgaW50IGxlbmd0aCkKLXsKLQlpbnQgcmV0dmFsID0gMDsKLQotCWRvIHsKLQkJaWYgKHJlYWRiKGlvX2FkZHIpICE9ICpzaWduYXR1cmUpCi0JCQlnb3RvIG91dDsKLQkJaW9fYWRkcisrOwotCQlzaWduYXR1cmUrKzsKLQkJbGVuZ3RoLS07Ci0JfSB3aGlsZSAobGVuZ3RoKTsKLQotCXJldHZhbCA9IDE7Ci1vdXQ6Ci0JcmV0dXJuIHJldHZhbDsKLX0KLQogI2VuZGlmIC8qIF9fS0VSTkVMX18gKi8KIAogI2VuZGlmIC8qIF9BU01fSU9fSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tZ2VuZXJpYy9iaXRvcHMvc2NoZWQuaCBiL2luY2x1ZGUvYXNtLWdlbmVyaWMvYml0b3BzL3NjaGVkLmgKaW5kZXggNWVmOTNhNC4uODE1YmIwMSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tZ2VuZXJpYy9iaXRvcHMvc2NoZWQuaAorKysgYi9pbmNsdWRlL2FzbS1nZW5lcmljL2JpdG9wcy9zY2hlZC5oCkBAIC0xNSw3ICsxNSw3IEBACiAjaWYgQklUU19QRVJfTE9ORyA9PSA2NAogCWlmICh1bmxpa2VseShiWzBdKSkKIAkJcmV0dXJuIF9fZmZzKGJbMF0pOwotCWlmICh1bmxpa2VseShiWzFdKSkKKwlpZiAobGlrZWx5KGJbMV0pKQogCQlyZXR1cm4gX19mZnMoYlsxXSkgKyA2NDsKIAlyZXR1cm4gX19mZnMoYlsyXSkgKyAxMjg7CiAjZWxpZiBCSVRTX1BFUl9MT05HID09IDMyCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1nZW5lcmljL2J1Zy5oIGIvaW5jbHVkZS9hc20tZ2VuZXJpYy9idWcuaAppbmRleCAxZDk1NzNjZi4uYzkyYWUwZiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tZ2VuZXJpYy9idWcuaAorKysgYi9pbmNsdWRlL2FzbS1nZW5lcmljL2J1Zy5oCkBAIC0zNyw3ICszNywxMCBAQAogI2VuZGlmCiAKICNpZm5kZWYgSEFWRV9BUkNIX1dBUk5fT04KLSNkZWZpbmUgV0FSTl9PTihjb25kaXRpb24pIHVubGlrZWx5KChjb25kaXRpb24pKQorI2RlZmluZSBXQVJOX09OKGNvbmRpdGlvbikgKHsJCQkJCQlcCisJdHlwZW9mKGNvbmRpdGlvbikgX19yZXRfd2Fybl9vbiA9IChjb25kaXRpb24pOwkJCVwKKwl1bmxpa2VseShfX3JldF93YXJuX29uKTsJCQkJCVwKK30pCiAjZW5kaWYKICNlbmRpZgogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1nZW5lcmljL3ZtbGludXgubGRzLmggYi9pbmNsdWRlL2FzbS1nZW5lcmljL3ZtbGludXgubGRzLmgKaW5kZXggNjkyNDBiNS4uZTYwZDZmMiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tZ2VuZXJpYy92bWxpbnV4Lmxkcy5oCisrKyBiL2luY2x1ZGUvYXNtLWdlbmVyaWMvdm1saW51eC5sZHMuaApAQCAtMTI1LDYgKzEyNSwxMCBAQAogCQkqKF9fcGFyYW0pCQkJCQkJXAogCQlWTUxJTlVYX1NZTUJPTChfX3N0b3BfX19wYXJhbSkgPSAuOwkJCVwKIAl9CQkJCQkJCQlcCisJCQkJCQkJCQlcCisJLyogVW53aW5kIGRhdGEgYmluYXJ5IHNlYXJjaCB0YWJsZSAqLwkJCQlcCisJRUhfRlJBTUVfSERSCQkJCQkJCVwKKwkJCQkJCQkJCVwKIAlfX2VuZF9yb2RhdGEgPSAuOwkJCQkJCVwKIAkuID0gQUxJR04oNDA5Nik7CiAKQEAgLTE1Nyw2ICsxNjEsMTggQEAKIAkJKigua3Byb2Jlcy50ZXh0KQkJCQkJXAogCQlWTUxJTlVYX1NZTUJPTChfX2twcm9iZXNfdGV4dF9lbmQpID0gLjsKIAorI2lmZGVmIENPTkZJR19TVEFDS19VTldJTkQKKwkJLyogVW53aW5kIGRhdGEgYmluYXJ5IHNlYXJjaCB0YWJsZSAqLworI2RlZmluZSBFSF9GUkFNRV9IRFIJCQkJCQkJXAorICAgICAgICAJLmVoX2ZyYW1lX2hkciA6IEFUKEFERFIoLmVoX2ZyYW1lX2hkcikgLSBMT0FEX09GRlNFVCkgewlcCisJCQlWTUxJTlVYX1NZTUJPTChfX3N0YXJ0X3Vud2luZF9oZHIpID0gLjsJCVwKKwkJCSooLmVoX2ZyYW1lX2hkcikJCQkJXAorCQkJVk1MSU5VWF9TWU1CT0woX19lbmRfdW53aW5kX2hkcikgPSAuOwkJXAorCQl9CisjZWxzZQorI2RlZmluZSBFSF9GUkFNRV9IRFIKKyNlbmRpZgorCiAJCS8qIERXQVJGIGRlYnVnIHNlY3Rpb25zLgogCQlTeW1ib2xzIGluIHRoZSBEV0FSRiBkZWJ1Z2dpbmcgc2VjdGlvbnMgYXJlIHJlbGF0aXZlIHRvCiAJCXRoZSBiZWdpbm5pbmcgb2YgdGhlIHNlY3Rpb24gc28gd2UgYmVnaW4gdGhlbSBhdCAwLiAgKi8KQEAgLTE5NywzICsyMTMsMjIgQEAKIAogI2RlZmluZSBOT1RFUwkJCQkJCQkJXAogCQkubm90ZXMgOiB7ICooLm5vdGUuKikgfSA6bm90ZQorCisjZGVmaW5lIElOSVRDQUxMUwkJCQkJCQlcCisgIAkqKC5pbml0Y2FsbDAuaW5pdCkJCQkJCQlcCisgIAkqKC5pbml0Y2FsbDBzLmluaXQpCQkJCQkJXAorICAJKiguaW5pdGNhbGwxLmluaXQpCQkJCQkJXAorICAJKiguaW5pdGNhbGwxcy5pbml0KQkJCQkJCVwKKyAgCSooLmluaXRjYWxsMi5pbml0KQkJCQkJCVwKKyAgCSooLmluaXRjYWxsMnMuaW5pdCkJCQkJCQlcCisgIAkqKC5pbml0Y2FsbDMuaW5pdCkJCQkJCQlcCisgIAkqKC5pbml0Y2FsbDNzLmluaXQpCQkJCQkJXAorICAJKiguaW5pdGNhbGw0LmluaXQpCQkJCQkJXAorICAJKiguaW5pdGNhbGw0cy5pbml0KQkJCQkJCVwKKyAgCSooLmluaXRjYWxsNS5pbml0KQkJCQkJCVwKKyAgCSooLmluaXRjYWxsNXMuaW5pdCkJCQkJCQlcCisgIAkqKC5pbml0Y2FsbDYuaW5pdCkJCQkJCQlcCisgIAkqKC5pbml0Y2FsbDZzLmluaXQpCQkJCQkJXAorICAJKiguaW5pdGNhbGw3LmluaXQpCQkJCQkJXAorICAJKiguaW5pdGNhbGw3cy5pbml0KQorCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1pMzg2L2FjcGkuaCBiL2luY2x1ZGUvYXNtLWkzODYvYWNwaS5oCmluZGV4IDYwMTY2MzIuLmM4MGIzYTkgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWkzODYvYWNwaS5oCisrKyBiL2luY2x1ZGUvYXNtLWkzODYvYWNwaS5oCkBAIC0xMzIsNiArMTMyLDcgQEAKIAogI2lmZGVmIENPTkZJR19YODZfSU9fQVBJQwogZXh0ZXJuIGludCBhY3BpX3NraXBfdGltZXJfb3ZlcnJpZGU7CitleHRlcm4gaW50IGFjcGlfdXNlX3RpbWVyX292ZXJyaWRlOwogI2VuZGlmCiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBhY3BpX25vaXJxX3NldCh2b2lkKSB7IGFjcGlfbm9pcnEgPSAxOyB9CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1pMzg2L2lvLmggYi9pbmNsdWRlL2FzbS1pMzg2L2lvLmgKaW5kZXggYjM3MjRmZS4uNjhkZjBkYzMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWkzODYvaW8uaAorKysgYi9pbmNsdWRlL2FzbS1pMzg2L2lvLmgKQEAgLTIyNCwzMyArMjI0LDYgQEAKIAogI2RlZmluZSBldGhfaW9fY29weV9hbmRfc3VtKGEsYixjLGQpCQlldGhfY29weV9hbmRfc3VtKChhKSwodm9pZCBfX2ZvcmNlICopKGIpLChjKSwoZCkpCiAKLS8qKgotICoJY2hlY2tfc2lnbmF0dXJlCQktCWZpbmQgQklPUyBzaWduYXR1cmVzCi0gKglAaW9fYWRkcjogbW1pbyBhZGRyZXNzIHRvIGNoZWNrIAotICoJQHNpZ25hdHVyZTogIHNpZ25hdHVyZSBibG9jawotICoJQGxlbmd0aDogbGVuZ3RoIG9mIHNpZ25hdHVyZQotICoKLSAqCVBlcmZvcm0gYSBzaWduYXR1cmUgY29tcGFyaXNvbiB3aXRoIHRoZSBtbWlvIGFkZHJlc3MgaW9fYWRkci4gVGhpcwotICoJYWRkcmVzcyBzaG91bGQgaGF2ZSBiZWVuIG9idGFpbmVkIGJ5IGlvcmVtYXAuCi0gKglSZXR1cm5zIDEgb24gYSBtYXRjaC4KLSAqLwotIAotc3RhdGljIGlubGluZSBpbnQgY2hlY2tfc2lnbmF0dXJlKHZvbGF0aWxlIHZvaWQgX19pb21lbSAqIGlvX2FkZHIsCi0JY29uc3QgdW5zaWduZWQgY2hhciAqc2lnbmF0dXJlLCBpbnQgbGVuZ3RoKQotewotCWludCByZXR2YWwgPSAwOwotCWRvIHsKLQkJaWYgKHJlYWRiKGlvX2FkZHIpICE9ICpzaWduYXR1cmUpCi0JCQlnb3RvIG91dDsKLQkJaW9fYWRkcisrOwotCQlzaWduYXR1cmUrKzsKLQkJbGVuZ3RoLS07Ci0JfSB3aGlsZSAobGVuZ3RoKTsKLQlyZXR2YWwgPSAxOwotb3V0OgotCXJldHVybiByZXR2YWw7Ci19Ci0KIC8qCiAgKglDYWNoZSBtYW5hZ2VtZW50CiAgKgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20taTM4Ni9pb19hcGljLmggYi9pbmNsdWRlL2FzbS1pMzg2L2lvX2FwaWMuaAppbmRleCAyNzZlYTdlLi4wNTlhOWZmIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1pMzg2L2lvX2FwaWMuaAorKysgYi9pbmNsdWRlL2FzbS1pMzg2L2lvX2FwaWMuaApAQCAtMTIsMTAgKzEyLDYgQEAKIAogI2lmZGVmIENPTkZJR19YODZfSU9fQVBJQwogCi0jZGVmaW5lIElPX0FQSUNfQkFTRShpZHgpIFwKLQkJKCh2b2xhdGlsZSBpbnQgKikoX19maXhfdG9fdmlydChGSVhfSU9fQVBJQ19CQVNFXzAgKyBpZHgpIFwKLQkJKyAobXBfaW9hcGljc1tpZHhdLm1wY19hcGljYWRkciAmIH5QQUdFX01BU0spKSkKLQogLyoKICAqIFRoZSBzdHJ1Y3R1cmUgb2YgdGhlIElPLUFQSUM6CiAgKi8KQEAgLTExOSwzMSArMTE1LDggQEAKIC8qIG5vbi0wIGlmIGRlZmF1bHQgKHRhYmxlLWxlc3MpIE1QIGNvbmZpZ3VyYXRpb24gKi8KIGV4dGVybiBpbnQgbXBjX2RlZmF1bHRfdHlwZTsKIAotc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgaW9fYXBpY19yZWFkKHVuc2lnbmVkIGludCBhcGljLCB1bnNpZ25lZCBpbnQgcmVnKQotewotCSpJT19BUElDX0JBU0UoYXBpYykgPSByZWc7Ci0JcmV0dXJuICooSU9fQVBJQ19CQVNFKGFwaWMpKzQpOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgaW9fYXBpY193cml0ZSh1bnNpZ25lZCBpbnQgYXBpYywgdW5zaWduZWQgaW50IHJlZywgdW5zaWduZWQgaW50IHZhbHVlKQotewotCSpJT19BUElDX0JBU0UoYXBpYykgPSByZWc7Ci0JKihJT19BUElDX0JBU0UoYXBpYykrNCkgPSB2YWx1ZTsKLX0KLQotLyoKLSAqIFJlLXdyaXRlIGEgdmFsdWU6IHRvIGJlIHVzZWQgZm9yIHJlYWQtbW9kaWZ5LXdyaXRlCi0gKiBjeWNsZXMgd2hlcmUgdGhlIHJlYWQgYWxyZWFkeSBzZXQgdXAgdGhlIGluZGV4IHJlZ2lzdGVyLgotICoKLSAqIE9sZGVyIFNpUyBBUElDIHJlcXVpcmVzIHdlIHJld3JpdGUgdGhlIGluZGV4IHJlZ2lzZXIKLSAqLworLyogT2xkZXIgU2lTIEFQSUMgcmVxdWlyZXMgd2UgcmV3cml0ZSB0aGUgaW5kZXggcmVnaXN0ZXIgKi8KIGV4dGVybiBpbnQgc2lzX2FwaWNfYnVnOwotc3RhdGljIGlubGluZSB2b2lkIGlvX2FwaWNfbW9kaWZ5KHVuc2lnbmVkIGludCBhcGljLCB1bnNpZ25lZCBpbnQgcmVnLCB1bnNpZ25lZCBpbnQgdmFsdWUpCi17Ci0JaWYgKHNpc19hcGljX2J1ZykKLQkJKklPX0FQSUNfQkFTRShhcGljKSA9IHJlZzsKLQkqKElPX0FQSUNfQkFTRShhcGljKSs0KSA9IHZhbHVlOwotfQogCiAvKiAxIGlmICJub2FwaWMiIGJvb3Qgb3B0aW9uIHBhc3NlZCAqLwogZXh0ZXJuIGludCBza2lwX2lvYXBpY19zZXR1cDsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWkzODYvbWFjaC12aXN3cy9kb190aW1lci5oIGIvaW5jbHVkZS9hc20taTM4Ni9tYWNoLXZpc3dzL2RvX3RpbWVyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxY2Q2OTYuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9hc20taTM4Ni9tYWNoLXZpc3dzL2RvX3RpbWVyLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0vKiBkZWZpbmVzIGZvciBpbmxpbmUgYXJjaCBzZXR1cCBmdW5jdGlvbnMgKi8KLQotI2luY2x1ZGUgPGFzbS9maXhtYXAuaD4KLSNpbmNsdWRlIDxhc20vaTgyNTkuaD4KLSNpbmNsdWRlICJjb2JhbHQuaCIKLQotc3RhdGljIGlubGluZSB2b2lkIGRvX3RpbWVyX2ludGVycnVwdF9ob29rKHZvaWQpCi17Ci0JLyogQ2xlYXIgdGhlIGludGVycnVwdCAqLwotCWNvX2NwdV93cml0ZShDT19DUFVfU1RBVCxjb19jcHVfcmVhZChDT19DUFVfU1RBVCkgJiB+Q09fU1RBVF9USU1FSU5UUik7Ci0KLQlkb190aW1lcigxKTsKLSNpZm5kZWYgQ09ORklHX1NNUAotCXVwZGF0ZV9wcm9jZXNzX3RpbWVzKHVzZXJfbW9kZV92bShpcnFfcmVncykpOwotI2VuZGlmCi0vKgotICogSW4gdGhlIFNNUCBjYXNlIHdlIHVzZSB0aGUgbG9jYWwgQVBJQyB0aW1lciBpbnRlcnJ1cHQgdG8gZG8gdGhlCi0gKiBwcm9maWxpbmcsIGV4Y2VwdCB3aGVuIHdlIHNpbXVsYXRlIFNNUCBtb2RlIG9uIGEgdW5pcHJvY2Vzc29yCi0gKiBzeXN0ZW0sIGluIHRoYXQgY2FzZSB3ZSBoYXZlIHRvIGNhbGwgdGhlIGxvY2FsIGludGVycnVwdCBoYW5kbGVyLgotICovCi0jaWZuZGVmIENPTkZJR19YODZfTE9DQUxfQVBJQwotCXByb2ZpbGVfdGljayhDUFVfUFJPRklMSU5HKTsKLSNlbHNlCi0JaWYgKCF1c2luZ19hcGljX3RpbWVyKQotCQlzbXBfbG9jYWxfdGltZXJfaW50ZXJydXB0KCk7Ci0jZW5kaWYKLX0KLQotc3RhdGljIGlubGluZSBpbnQgZG9fdGltZXJfb3ZlcmZsb3coaW50IGNvdW50KQotewotCWludCBpOwotCi0Jc3Bpbl9sb2NrKCZpODI1OUFfbG9jayk7Ci0JLyoKLQkgKiBUaGlzIGlzIHRyaWNreSB3aGVuIEkvTyBBUElDcyBhcmUgdXNlZDsKLQkgKiBzZWUgZG9fdGltZXJfaW50ZXJydXB0KCkuCi0JICovCi0JaSA9IGluYigweDIwKTsKLQlzcGluX3VubG9jaygmaTgyNTlBX2xvY2spOwotCQotCS8qIGFzc3VtcHRpb24gYWJvdXQgdGltZXIgYmVpbmcgSVJRMCAqLwotCWlmIChpICYgMHgwMSkgewotCQkvKgotCQkgKiBXZSBjYW5ub3QgZGV0ZWN0IGxvc3QgdGltZXIgaW50ZXJydXB0cyAuLi4gCi0JCSAqIHdlbGwsIHRoYXQncyB3aHkgd2UgY2FsbCB0aGVtIGxvc3QsIGRvbid0IHdlPyA6KQotCQkgKiBbaG1tLCBvbiB0aGUgUGVudGl1bSBhbmQgQWxwaGEgd2UgY2FuIC4uLiBzb3J0IG9mXQotCQkgKi8KLQkJY291bnQgLT0gTEFUQ0g7Ci0JfSBlbHNlIHsKLQkJcHJpbnRrKCJkb19zbG93X2dldHRpbWVvZmZzZXQoKTogaGFyZHdhcmUgdGltZXIgcHJvYmxlbT9cbiIpOwotCX0KLQlyZXR1cm4gY291bnQ7Ci19CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1pMzg2L21hY2gtdmlzd3MvbWFjaF9hcGljLmggYi9pbmNsdWRlL2FzbS1pMzg2L21hY2gtdmlzd3MvbWFjaF9hcGljLmgKaW5kZXggZGU0MzhjNzEuLjE4YWZlNmIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWkzODYvbWFjaC12aXN3cy9tYWNoX2FwaWMuaAorKysgYi9pbmNsdWRlL2FzbS1pMzg2L21hY2gtdmlzd3MvbWFjaF9hcGljLmgKQEAgLTUxLDYgKzUxLDExIEBACiB7CiB9CiAKK3N0YXRpYyBpbmxpbmUgaW50IGFwaWNpZF90b19ub2RlKGludCBsb2dpY2FsX2FwaWNpZCkKK3sKKwlyZXR1cm4gMDsKK30KKwogLyogTWFwcGluZyBmcm9tIGNwdSBudW1iZXIgdG8gbG9naWNhbCBhcGljaWQgKi8KIHN0YXRpYyBpbmxpbmUgaW50IGNwdV90b19sb2dpY2FsX2FwaWNpZChpbnQgY3B1KQogewpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20taTM4Ni9wcm9jZXNzb3IuaCBiL2luY2x1ZGUvYXNtLWkzODYvcHJvY2Vzc29yLmgKaW5kZXggMjI3NzEyNy4uZTBkZGNhOSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20taTM4Ni9wcm9jZXNzb3IuaAorKysgYi9pbmNsdWRlL2FzbS1pMzg2L3Byb2Nlc3Nvci5oCkBAIC0zMDYsNiArMzA2LDggQEAKIAkJOiA6ImEiIChlYXgpLCAiYyIgKGVjeCkpOwogfQogCitleHRlcm4gdm9pZCBtd2FpdF9pZGxlX3dpdGhfaGludHModW5zaWduZWQgbG9uZyBlYXgsIHVuc2lnbmVkIGxvbmcgZWN4KTsKKwogLyogZnJvbSBzeXN0ZW0gZGVzY3JpcHRpb24gdGFibGUgaW4gQklPUy4gIE1vc3RseSBmb3IgTUNBIHVzZSwgYnV0CiBvdGhlcnMgbWF5IGZpbmQgaXQgdXNlZnVsLiAqLwogZXh0ZXJuIHVuc2lnbmVkIGludCBtYWNoaW5lX2lkOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20taTM4Ni91YWNjZXNzLmggYi9pbmNsdWRlL2FzbS1pMzg2L3VhY2Nlc3MuaAppbmRleCA1NGQ5MDVlLi5lZWY1MTMzIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1pMzg2L3VhY2Nlc3MuaAorKysgYi9pbmNsdWRlL2FzbS1pMzg2L3VhY2Nlc3MuaApAQCAtNDA0LDIwICs0MDQsNiBAQAogICogYW55dGhpbmcsIHNvIHRoaXMgaXMgYWNjdXJhdGUuCiAgKi8KIAotLyoqCi0gKiBfX2NvcHlfdG9fdXNlcjogLSBDb3B5IGEgYmxvY2sgb2YgZGF0YSBpbnRvIHVzZXIgc3BhY2UsIHdpdGggbGVzcyBjaGVja2luZy4KLSAqIEB0bzogICBEZXN0aW5hdGlvbiBhZGRyZXNzLCBpbiB1c2VyIHNwYWNlLgotICogQGZyb206IFNvdXJjZSBhZGRyZXNzLCBpbiBrZXJuZWwgc3BhY2UuCi0gKiBAbjogICAgTnVtYmVyIG9mIGJ5dGVzIHRvIGNvcHkuCi0gKgotICogQ29udGV4dDogVXNlciBjb250ZXh0IG9ubHkuICBUaGlzIGZ1bmN0aW9uIG1heSBzbGVlcC4KLSAqCi0gKiBDb3B5IGRhdGEgZnJvbSBrZXJuZWwgc3BhY2UgdG8gdXNlciBzcGFjZS4gIENhbGxlciBtdXN0IGNoZWNrCi0gKiB0aGUgc3BlY2lmaWVkIGJsb2NrIHdpdGggYWNjZXNzX29rKCkgYmVmb3JlIGNhbGxpbmcgdGhpcyBmdW5jdGlvbi4KLSAqCi0gKiBSZXR1cm5zIG51bWJlciBvZiBieXRlcyB0aGF0IGNvdWxkIG5vdCBiZSBjb3BpZWQuCi0gKiBPbiBzdWNjZXNzLCB0aGlzIHdpbGwgYmUgemVyby4KLSAqLwogc3RhdGljIF9fYWx3YXlzX2lubGluZSB1bnNpZ25lZCBsb25nIF9fbXVzdF9jaGVjawogX19jb3B5X3RvX3VzZXJfaW5hdG9taWModm9pZCBfX3VzZXIgKnRvLCBjb25zdCB2b2lkICpmcm9tLCB1bnNpZ25lZCBsb25nIG4pCiB7CkBAIC00MzksNiArNDI1LDIwIEBACiAJcmV0dXJuIF9fY29weV90b191c2VyX2xsKHRvLCBmcm9tLCBuKTsKIH0KIAorLyoqCisgKiBfX2NvcHlfdG9fdXNlcjogLSBDb3B5IGEgYmxvY2sgb2YgZGF0YSBpbnRvIHVzZXIgc3BhY2UsIHdpdGggbGVzcyBjaGVja2luZy4KKyAqIEB0bzogICBEZXN0aW5hdGlvbiBhZGRyZXNzLCBpbiB1c2VyIHNwYWNlLgorICogQGZyb206IFNvdXJjZSBhZGRyZXNzLCBpbiBrZXJuZWwgc3BhY2UuCisgKiBAbjogICAgTnVtYmVyIG9mIGJ5dGVzIHRvIGNvcHkuCisgKgorICogQ29udGV4dDogVXNlciBjb250ZXh0IG9ubHkuICBUaGlzIGZ1bmN0aW9uIG1heSBzbGVlcC4KKyAqCisgKiBDb3B5IGRhdGEgZnJvbSBrZXJuZWwgc3BhY2UgdG8gdXNlciBzcGFjZS4gIENhbGxlciBtdXN0IGNoZWNrCisgKiB0aGUgc3BlY2lmaWVkIGJsb2NrIHdpdGggYWNjZXNzX29rKCkgYmVmb3JlIGNhbGxpbmcgdGhpcyBmdW5jdGlvbi4KKyAqCisgKiBSZXR1cm5zIG51bWJlciBvZiBieXRlcyB0aGF0IGNvdWxkIG5vdCBiZSBjb3BpZWQuCisgKiBPbiBzdWNjZXNzLCB0aGlzIHdpbGwgYmUgemVyby4KKyAqLwogc3RhdGljIF9fYWx3YXlzX2lubGluZSB1bnNpZ25lZCBsb25nIF9fbXVzdF9jaGVjawogX19jb3B5X3RvX3VzZXIodm9pZCBfX3VzZXIgKnRvLCBjb25zdCB2b2lkICpmcm9tLCB1bnNpZ25lZCBsb25nIG4pCiB7CkBAIC00NDYsMjggKzQ0Niw2IEBACiAgICAgICAgcmV0dXJuIF9fY29weV90b191c2VyX2luYXRvbWljKHRvLCBmcm9tLCBuKTsKIH0KIAotLyoqCi0gKiBfX2NvcHlfZnJvbV91c2VyOiAtIENvcHkgYSBibG9jayBvZiBkYXRhIGZyb20gdXNlciBzcGFjZSwgd2l0aCBsZXNzIGNoZWNraW5nLgotICogQHRvOiAgIERlc3RpbmF0aW9uIGFkZHJlc3MsIGluIGtlcm5lbCBzcGFjZS4KLSAqIEBmcm9tOiBTb3VyY2UgYWRkcmVzcywgaW4gdXNlciBzcGFjZS4KLSAqIEBuOiAgICBOdW1iZXIgb2YgYnl0ZXMgdG8gY29weS4KLSAqCi0gKiBDb250ZXh0OiBVc2VyIGNvbnRleHQgb25seS4gIFRoaXMgZnVuY3Rpb24gbWF5IHNsZWVwLgotICoKLSAqIENvcHkgZGF0YSBmcm9tIHVzZXIgc3BhY2UgdG8ga2VybmVsIHNwYWNlLiAgQ2FsbGVyIG11c3QgY2hlY2sKLSAqIHRoZSBzcGVjaWZpZWQgYmxvY2sgd2l0aCBhY2Nlc3Nfb2soKSBiZWZvcmUgY2FsbGluZyB0aGlzIGZ1bmN0aW9uLgotICoKLSAqIFJldHVybnMgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgY291bGQgbm90IGJlIGNvcGllZC4KLSAqIE9uIHN1Y2Nlc3MsIHRoaXMgd2lsbCBiZSB6ZXJvLgotICoKLSAqIElmIHNvbWUgZGF0YSBjb3VsZCBub3QgYmUgY29waWVkLCB0aGlzIGZ1bmN0aW9uIHdpbGwgcGFkIHRoZSBjb3BpZWQKLSAqIGRhdGEgdG8gdGhlIHJlcXVlc3RlZCBzaXplIHVzaW5nIHplcm8gYnl0ZXMuCi0gKgotICogQW4gYWx0ZXJuYXRlIHZlcnNpb24gLSBfX2NvcHlfZnJvbV91c2VyX2luYXRvbWljKCkgLSBtYXkgYmUgY2FsbGVkIGZyb20KLSAqIGF0b21pYyBjb250ZXh0IGFuZCB3aWxsIGZhaWwgcmF0aGVyIHRoYW4gc2xlZXAuICBJbiB0aGlzIGNhc2UgdGhlCi0gKiB1bmNvcGllZCBieXRlcyB3aWxsICpOT1QqIGJlIHBhZGRlZCB3aXRoIHplcm9zLiAgU2VlIGZzL2ZpbGVtYXAuaAotICogZm9yIGV4cGxhbmF0aW9uIG9mIHdoeSB0aGlzIGlzIG5lZWRlZC4KLSAqLwogc3RhdGljIF9fYWx3YXlzX2lubGluZSB1bnNpZ25lZCBsb25nCiBfX2NvcHlfZnJvbV91c2VyX2luYXRvbWljKHZvaWQgKnRvLCBjb25zdCB2b2lkIF9fdXNlciAqZnJvbSwgdW5zaWduZWQgbG9uZyBuKQogewpAQCAtNDkzLDYgKzQ3MSwyOSBAQAogCX0KIAlyZXR1cm4gX19jb3B5X2Zyb21fdXNlcl9sbF9ub3plcm8odG8sIGZyb20sIG4pOwogfQorCisvKioKKyAqIF9fY29weV9mcm9tX3VzZXI6IC0gQ29weSBhIGJsb2NrIG9mIGRhdGEgZnJvbSB1c2VyIHNwYWNlLCB3aXRoIGxlc3MgY2hlY2tpbmcuCisgKiBAdG86ICAgRGVzdGluYXRpb24gYWRkcmVzcywgaW4ga2VybmVsIHNwYWNlLgorICogQGZyb206IFNvdXJjZSBhZGRyZXNzLCBpbiB1c2VyIHNwYWNlLgorICogQG46ICAgIE51bWJlciBvZiBieXRlcyB0byBjb3B5LgorICoKKyAqIENvbnRleHQ6IFVzZXIgY29udGV4dCBvbmx5LiAgVGhpcyBmdW5jdGlvbiBtYXkgc2xlZXAuCisgKgorICogQ29weSBkYXRhIGZyb20gdXNlciBzcGFjZSB0byBrZXJuZWwgc3BhY2UuICBDYWxsZXIgbXVzdCBjaGVjaworICogdGhlIHNwZWNpZmllZCBibG9jayB3aXRoIGFjY2Vzc19vaygpIGJlZm9yZSBjYWxsaW5nIHRoaXMgZnVuY3Rpb24uCisgKgorICogUmV0dXJucyBudW1iZXIgb2YgYnl0ZXMgdGhhdCBjb3VsZCBub3QgYmUgY29waWVkLgorICogT24gc3VjY2VzcywgdGhpcyB3aWxsIGJlIHplcm8uCisgKgorICogSWYgc29tZSBkYXRhIGNvdWxkIG5vdCBiZSBjb3BpZWQsIHRoaXMgZnVuY3Rpb24gd2lsbCBwYWQgdGhlIGNvcGllZAorICogZGF0YSB0byB0aGUgcmVxdWVzdGVkIHNpemUgdXNpbmcgemVybyBieXRlcy4KKyAqCisgKiBBbiBhbHRlcm5hdGUgdmVyc2lvbiAtIF9fY29weV9mcm9tX3VzZXJfaW5hdG9taWMoKSAtIG1heSBiZSBjYWxsZWQgZnJvbQorICogYXRvbWljIGNvbnRleHQgYW5kIHdpbGwgZmFpbCByYXRoZXIgdGhhbiBzbGVlcC4gIEluIHRoaXMgY2FzZSB0aGUKKyAqIHVuY29waWVkIGJ5dGVzIHdpbGwgKk5PVCogYmUgcGFkZGVkIHdpdGggemVyb3MuICBTZWUgZnMvZmlsZW1hcC5oCisgKiBmb3IgZXhwbGFuYXRpb24gb2Ygd2h5IHRoaXMgaXMgbmVlZGVkLgorICovCiBzdGF0aWMgX19hbHdheXNfaW5saW5lIHVuc2lnbmVkIGxvbmcKIF9fY29weV9mcm9tX3VzZXIodm9pZCAqdG8sIGNvbnN0IHZvaWQgX191c2VyICpmcm9tLCB1bnNpZ25lZCBsb25nIG4pCiB7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1pMzg2L3VuaXN0ZC5oIGIvaW5jbHVkZS9hc20taTM4Ni91bmlzdGQuaAppbmRleCAzY2E3YWI5Li5iZWVlYWY2IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1pMzg2L3VuaXN0ZC5oCisrKyBiL2luY2x1ZGUvYXNtLWkzODYvdW5pc3RkLmgKQEAgLTMyNCwxMCArMzI0LDExIEBACiAjZGVmaW5lIF9fTlJfdm1zcGxpY2UJCTMxNgogI2RlZmluZSBfX05SX21vdmVfcGFnZXMJCTMxNwogI2RlZmluZSBfX05SX2dldGNwdQkJMzE4CisjZGVmaW5lIF9fTlJfZXBvbGxfcHdhaXQJMzE5CiAKICNpZmRlZiBfX0tFUk5FTF9fCiAKLSNkZWZpbmUgTlJfc3lzY2FsbHMgMzE5CisjZGVmaW5lIE5SX3N5c2NhbGxzIDMyMAogI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgogCiAvKgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20taTM4Ni92aWMuaCBiL2luY2x1ZGUvYXNtLWkzODYvdmljLmgKaW5kZXggNGFiZmNmYi4uNTMxMDBmMyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20taTM4Ni92aWMuaAorKysgYi9pbmNsdWRlL2FzbS1pMzg2L3ZpYy5oCkBAIC01OCw0ICs1OCw0IEBACiAKICNkZWZpbmUgVklDX0JPT1RfSU5URVJSVVBUX01BU0sJCTB4ZmUKIAotZXh0ZXJuIHZvaWQgc21wX3ZpY190aW1lcl9pbnRlcnJ1cHQoc3RydWN0IHB0X3JlZ3MgKnJlZ3MpOworZXh0ZXJuIHZvaWQgc21wX3ZpY190aW1lcl9pbnRlcnJ1cHQodm9pZCk7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1pMzg2L3ZveWFnZXIuaCBiL2luY2x1ZGUvYXNtLWkzODYvdm95YWdlci5oCmluZGV4IGU3NGM1NGFhLi41YjI3ODM4IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1pMzg2L3ZveWFnZXIuaAorKysgYi9pbmNsdWRlL2FzbS1pMzg2L3ZveWFnZXIuaApAQCAtMTE4LDMzICsxMTgsMzMgQEAKIH0gdm95YWdlcl9tb2R1bGVfdDsKIAogdHlwZWRlZiBzdHJ1Y3Qgdm95YWdlcl9lZXByb21faGRyIHsKLQkgX191OCAgbW9kdWxlX2lkWzRdIF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOyAKLQkgX191OCAgdmVyc2lvbl9pZCBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKLQkgX191OCAgY29uZmlnX2lkIF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOyAKLQkgX191MTYgYm91bmRyeV9pZCBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsJLyogYm91bmRhcnkgc2NhbiBpZCAqLwotCSBfX3UxNiBlZV9zaXplIF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOwkJLyogc2l6ZSBvZiBFRVBST00gKi8KLQkgX191OCAgYXNzZW1ibHlbMTFdIF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOwkvKiBhc3NlbWJseSAjICovCi0JIF9fdTggIGFzc2VtYmx5X3JldiBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsJLyogYXNzZW1ibHkgcmV2ICovCi0JIF9fdTggIHRyYWNlcls0XSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsJLyogdHJhY2VyIG51bWJlciAqLwotCSBfX3UxNiBhc3NlbWJseV9ja3N1bSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsJLyogYXNtIGNoZWNrc3VtICovCi0JIF9fdTE2IHBvd2VyX2NvbnN1bXAgX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CS8qIHB3ciByZXF1aXJlbWVudHMgKi8KLQkgX191MTYgbnVtX2FzaWNzIF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOwkvKiBudW1iZXIgb2YgYXNpY3MgKi8KLQkgX191MTYgYmlzdF90aW1lIF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOwkvKiBtaW4uIGJpc3QgdGltZSAqLwotCSBfX3UxNiBlcnJfbG9nX29mZnNldCBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsJLyogZXJyb3IgbG9nIG9mZnNldCAqLwotCSBfX3UxNiBzY2FuX3BhdGhfb2Zmc2V0IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOy8qIHNjYW4gcGF0aCBvZmZzZXQgKi8KLQkgX191MTYgY2N0X29mZnNldCBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKLQkgX191MTYgbG9nX2xlbmd0aCBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsJLyogbGVuZ3RoIG9mIGVyciBsb2cgKi8KLQkgX191MTYgeHN1bV9lbmQgX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CS8qIG9mZnNldCB0byBlbmQgb2YKKwkgX191OCAgbW9kdWxlX2lkWzRdOworCSBfX3U4ICB2ZXJzaW9uX2lkOworCSBfX3U4ICBjb25maWdfaWQ7CisJIF9fdTE2IGJvdW5kcnlfaWQ7CS8qIGJvdW5kYXJ5IHNjYW4gaWQgKi8KKwkgX191MTYgZWVfc2l6ZTsJCS8qIHNpemUgb2YgRUVQUk9NICovCisJIF9fdTggIGFzc2VtYmx5WzExXTsJLyogYXNzZW1ibHkgIyAqLworCSBfX3U4ICBhc3NlbWJseV9yZXY7CS8qIGFzc2VtYmx5IHJldiAqLworCSBfX3U4ICB0cmFjZXJbNF07CS8qIHRyYWNlciBudW1iZXIgKi8KKwkgX191MTYgYXNzZW1ibHlfY2tzdW07CS8qIGFzbSBjaGVja3N1bSAqLworCSBfX3UxNiBwb3dlcl9jb25zdW1wOwkvKiBwd3IgcmVxdWlyZW1lbnRzICovCisJIF9fdTE2IG51bV9hc2ljczsJLyogbnVtYmVyIG9mIGFzaWNzICovCisJIF9fdTE2IGJpc3RfdGltZTsJLyogbWluLiBiaXN0IHRpbWUgKi8KKwkgX191MTYgZXJyX2xvZ19vZmZzZXQ7CS8qIGVycm9yIGxvZyBvZmZzZXQgKi8KKwkgX191MTYgc2Nhbl9wYXRoX29mZnNldDsvKiBzY2FuIHBhdGggb2Zmc2V0ICovCisJIF9fdTE2IGNjdF9vZmZzZXQ7CisJIF9fdTE2IGxvZ19sZW5ndGg7CS8qIGxlbmd0aCBvZiBlcnIgbG9nICovCisJIF9fdTE2IHhzdW1fZW5kOwkvKiBvZmZzZXQgdG8gZW5kIG9mCiAJCQkJCQkJICAgY2hlY2tzdW0gKi8KLQkgX191OCAgcmVzZXJ2ZWRbNF0gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7Ci0JIF9fdTggIHNmbGFnIF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOwkJLyogc3RhcnRpbmcgc2VudGluYWwgKi8KLQkgX191OCAgcGFydF9udW1iZXJbMTNdIF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOwkvKiBwcm9tIHBhcnQgbnVtYmVyICovCi0JIF9fdTggIHZlcnNpb25bMTBdIF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOwkvKiB2ZXJzaW9uIG51bWJlciAqLwotCSBfX3U4ICBzaWduYXR1cmVbOF0gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7Ci0JIF9fdTE2IGVlcHJvbV9jaGtzdW0gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7Ci0JIF9fdTMyICBkYXRhX3N0YW1wX29mZnNldCBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKLQkgX191OCAgZWZsYWcgIF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOwkJIC8qIGVuZGluZyBzZW50aW5hbCAqLwotfSB2b3lhZ2VyX2Vwcm9tX2hkcl90OworCSBfX3U4ICByZXNlcnZlZFs0XTsKKwkgX191OCAgc2ZsYWc7CQkvKiBzdGFydGluZyBzZW50aW5hbCAqLworCSBfX3U4ICBwYXJ0X251bWJlclsxM107CS8qIHByb20gcGFydCBudW1iZXIgKi8KKwkgX191OCAgdmVyc2lvblsxMF07CS8qIHZlcnNpb24gbnVtYmVyICovCisJIF9fdTggIHNpZ25hdHVyZVs4XTsKKwkgX191MTYgZWVwcm9tX2Noa3N1bTsKKwkgX191MzIgIGRhdGFfc3RhbXBfb2Zmc2V0OworCSBfX3U4ICBlZmxhZyA7CQkgLyogZW5kaW5nIHNlbnRpbmFsICovCit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpIHZveWFnZXJfZXByb21faGRyX3Q7CiAKIAogCkBAIC0xNTUsMzAgKzE1NSwzMCBAQAogICogaW4gdGhlIG1vZHVsZSBFUFJPTXMuICBXZSByZWFsbHkgb25seSBjYXJlIGFib3V0IHRoZSBJRHMgYW5kCiAgKiBvZmZzZXRzICovCiB0eXBlZGVmIHN0cnVjdCB2b3lhZ2VyX3NwX3RhYmxlIHsKLQlfX3U4IGFzaWNfaWQgX19hdHRyaWJ1dGVfXygocGFja2VkKSk7Ci0JX191OCBieXBhc3NfZmxhZyBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKLQlfX3UxNiBhc2ljX2RhdGFfb2Zmc2V0IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOwotCV9fdTE2IGNvbmZpZ19kYXRhX29mZnNldCBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKLX0gdm95YWdlcl9zcF90YWJsZV90OworCV9fdTggYXNpY19pZDsKKwlfX3U4IGJ5cGFzc19mbGFnOworCV9fdTE2IGFzaWNfZGF0YV9vZmZzZXQ7CisJX191MTYgY29uZmlnX2RhdGFfb2Zmc2V0OworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKSB2b3lhZ2VyX3NwX3RhYmxlX3Q7CiAKIHR5cGVkZWYgc3RydWN0IHZveWFnZXJfanRhZ190YWJsZSB7Ci0JX191OCBpY29kZVs0XSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKLQlfX3U4IHJ1bmJpc3RbNF0gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7Ci0JX191OCBpbnRlc3RbNF0gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7Ci0JX191OCBzYW1wX3ByZWxkWzRdIF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOwotCV9fdTggaXJlZ19sZW4gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7Ci19IHZveWFnZXJfanR0X3Q7CisJX191OCBpY29kZVs0XTsKKwlfX3U4IHJ1bmJpc3RbNF07CisJX191OCBpbnRlc3RbNF07CisJX191OCBzYW1wX3ByZWxkWzRdOworCV9fdTggaXJlZ19sZW47Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpIHZveWFnZXJfanR0X3Q7CiAKIHR5cGVkZWYgc3RydWN0IHZveWFnZXJfYXNpY19kYXRhX3RhYmxlIHsKLQlfX3U4IGp0YWdfaWRbNF0gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7Ci0JX191MTYgbGVuZ3RoX2JzciBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKLQlfX3UxNiBsZW5ndGhfYmlzdF9yZWcgX19hdHRyaWJ1dGVfXygocGFja2VkKSk7Ci0JX191MzIgYmlzdF9jbGsgX19hdHRyaWJ1dGVfXygocGFja2VkKSk7Ci0JX191MTYgc3ViYWRkcl9iaXRzIF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOwotCV9fdTE2IHNlZWRfYml0cyBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKLQlfX3UxNiBzaWdfYml0cyBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKLQlfX3UxNiBqdGFnX29mZnNldCBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKLX0gdm95YWdlcl9hdF90OworCV9fdTgganRhZ19pZFs0XTsKKwlfX3UxNiBsZW5ndGhfYnNyOworCV9fdTE2IGxlbmd0aF9iaXN0X3JlZzsKKwlfX3UzMiBiaXN0X2NsazsKKwlfX3UxNiBzdWJhZGRyX2JpdHM7CisJX191MTYgc2VlZF9iaXRzOworCV9fdTE2IHNpZ19iaXRzOworCV9fdTE2IGp0YWdfb2Zmc2V0OworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKSB2b3lhZ2VyX2F0X3Q7CiAKIC8qIFZveWFnZXIgSW50ZXJydXB0IENvbnRyb2xsZXIgKFZJQykgcmVnaXN0ZXJzICovCiAKQEAgLTMyOCw1MiArMzI4LDUyIEBACiAjZGVmaW5lIE5VTUJFUl9PRl9QT1NfUkVHUwk4CiAKIHR5cGVkZWYgc3RydWN0IHsKLQlfX3U4CU1DX1Nsb3QgX19hdHRyaWJ1dGVfXygocGFja2VkKSk7Ci0JX191OAlQT1NfVmFsdWVzW05VTUJFUl9PRl9QT1NfUkVHU10gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7Ci19IE1DX1Nsb3RJbmZvcm1hdGlvbl90OworCV9fdTgJTUNfU2xvdDsKKwlfX3U4CVBPU19WYWx1ZXNbTlVNQkVSX09GX1BPU19SRUdTXTsKK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSkgTUNfU2xvdEluZm9ybWF0aW9uX3Q7CiAKIHN0cnVjdCBRdWFkRGVzY3JpcHRpb24gewotCV9fdTggIFR5cGUgX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CS8qIGZvciB0eXBlIDAgKERZQURJQyBvciBNT05BRElDKSBhbGwgZmllbGRzCisJX191OCAgVHlwZTsJLyogZm9yIHR5cGUgMCAoRFlBRElDIG9yIE1PTkFESUMpIGFsbCBmaWVsZHMKICAgICAgICAgICAgICAgICAgICAgICAgICAqIHdpbGwgYmUgemVybyBleGNlcHQgZm9yIHNsb3QgKi8KLQlfX3U4IFN0cnVjdHVyZVZlcnNpb24gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7Ci0JX191MzIgQ1BJX0Jhc2VBZGRyZXNzIF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOwotCV9fdTMyICBMQVJDX0JhbmtTaXplIF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOwkKLQlfX3UzMiBMb2NhbE1lbW9yeVN0YXRlQml0cyBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKLQlfX3U4ICBTbG90IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOyAvKiBQcm9jZXNzb3Igc2xvdHMgMSAtIDQgKi8KLX07IAorCV9fdTggU3RydWN0dXJlVmVyc2lvbjsKKwlfX3UzMiBDUElfQmFzZUFkZHJlc3M7CisJX191MzIgIExBUkNfQmFua1NpemU7CisJX191MzIgTG9jYWxNZW1vcnlTdGF0ZUJpdHM7CisJX191OCAgU2xvdDsgLyogUHJvY2Vzc29yIHNsb3RzIDEgLSA0ICovCit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOwogCiBzdHJ1Y3QgUHJvY0JvYXJkSW5mbyB7IAotCV9fdTggVHlwZSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsgICAgCi0JX191OCBTdHJ1Y3R1cmVWZXJzaW9uIF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOwotCV9fdTggTnVtYmVyT2ZCb2FyZHMgX19hdHRyaWJ1dGVfXygocGFja2VkKSk7Ci0Jc3RydWN0IFF1YWREZXNjcmlwdGlvbiBRdWFkRGF0YVtNQVhfUFJPQ0VTU09SX0JPQVJEU10gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7Ci19OworCV9fdTggVHlwZTsKKwlfX3U4IFN0cnVjdHVyZVZlcnNpb247CisJX191OCBOdW1iZXJPZkJvYXJkczsKKwlzdHJ1Y3QgUXVhZERlc2NyaXB0aW9uIFF1YWREYXRhW01BWF9QUk9DRVNTT1JfQk9BUkRTXTsKK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CiAKIHN0cnVjdCBDYWNoZURlc2NyaXB0aW9uIHsKLQlfX3U4IExldmVsIF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOwotCV9fdTMyIFRvdGFsU2l6ZSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKLQlfX3UxNiBMaW5lU2l6ZSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKLQlfX3U4ICBBc3NvY2lhdGl2aXR5IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOwotCV9fdTggIENhY2hlVHlwZSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKLQlfX3U4ICBXcml0ZVR5cGUgX19hdHRyaWJ1dGVfXygocGFja2VkKSk7Ci0JX191OCAgTnVtYmVyX0NQVXNfU2hhcmVkQnkgX19hdHRyaWJ1dGVfXygocGFja2VkKSk7Ci0JX191OCAgU2hhcmVkX0NQVXNfSGFyZHdhcmVfSURzW01BWF9TSEFSRURfQ1BVU10gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisJX191OCBMZXZlbDsKKwlfX3UzMiBUb3RhbFNpemU7CisJX191MTYgTGluZVNpemU7CisJX191OCAgQXNzb2NpYXRpdml0eTsKKwlfX3U4ICBDYWNoZVR5cGU7CisJX191OCAgV3JpdGVUeXBlOworCV9fdTggIE51bWJlcl9DUFVzX1NoYXJlZEJ5OworCV9fdTggIFNoYXJlZF9DUFVzX0hhcmR3YXJlX0lEc1tNQVhfU0hBUkVEX0NQVVNdOwogCi19OworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKIAogc3RydWN0IENQVV9EZXNjcmlwdGlvbiB7Ci0JX191OCBDUFVfSGFyZHdhcmVJZCBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKLQljaGFyICpGUlVfU3RyaW5nIF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOwotCV9fdTggTnVtYmVyT2ZDYWNoZUxldmVscyBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKLQlzdHJ1Y3QgQ2FjaGVEZXNjcmlwdGlvbiBDYWNoZUxldmVsRGF0YVtNQVhfQ0FDSEVfTEVWRUxTXSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKLX07CisJX191OCBDUFVfSGFyZHdhcmVJZDsKKwljaGFyICpGUlVfU3RyaW5nOworCV9fdTggTnVtYmVyT2ZDYWNoZUxldmVsczsKKwlzdHJ1Y3QgQ2FjaGVEZXNjcmlwdGlvbiBDYWNoZUxldmVsRGF0YVtNQVhfQ0FDSEVfTEVWRUxTXTsKK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CiAKIHN0cnVjdCBDUFVfSW5mbyB7Ci0JX191OCBUeXBlIF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOwotCV9fdTggU3RydWN0dXJlVmVyc2lvbiBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKLQlfX3U4IE51bWJlck9mX0NQVXMgX19hdHRyaWJ1dGVfXygocGFja2VkKSk7Ci0Jc3RydWN0IENQVV9EZXNjcmlwdGlvbiBDUFVfRGF0YVtNQVhfQ1BVU10gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7Ci19OworCV9fdTggVHlwZTsKKwlfX3U4IFN0cnVjdHVyZVZlcnNpb247CisJX191OCBOdW1iZXJPZl9DUFVzOworCXN0cnVjdCBDUFVfRGVzY3JpcHRpb24gQ1BVX0RhdGFbTUFYX0NQVVNdOworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKIAogCiAvKgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20taWE2NC9pby5oIGIvaW5jbHVkZS9hc20taWE2NC9pby5oCmluZGV4IDQzYmZmZjYuLjg1NWMzMGEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWlhNjQvaW8uaAorKysgYi9pbmNsdWRlL2FzbS1pYTY0L2lvLmgKQEAgLTQxNyw2ICs0MTcsOCBAQAogIyBkZWZpbmUgb3V0bF9wCQlvdXRsCiAjZW5kaWYKIAorIyBpZmRlZiBfX0tFUk5FTF9fCisKIGV4dGVybiB2b2lkIF9faW9tZW0gKiBpb3JlbWFwKHVuc2lnbmVkIGxvbmcgb2Zmc2V0LCB1bnNpZ25lZCBsb25nIHNpemUpOwogZXh0ZXJuIHZvaWQgX19pb21lbSAqIGlvcmVtYXBfbm9jYWNoZSAodW5zaWduZWQgbG9uZyBvZmZzZXQsIHVuc2lnbmVkIGxvbmcgc2l6ZSk7CiAKQEAgLTQzMCw4ICs0MzIsNiBAQAogI2RlZmluZSBkbWlfaW91bm1hcCh4LGwpIGlvdW5tYXAoeCkKICNkZWZpbmUgZG1pX2FsbG9jKGwpIGttYWxsb2MobCwgR0ZQX0FUT01JQykKIAotIyBpZmRlZiBfX0tFUk5FTF9fCi0KIC8qCiAgKiBTdHJpbmcgdmVyc2lvbiBvZiBJTyBtZW1vcnkgYWNjZXNzIG9wczoKICAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20taWE2NC9wYWwuaCBiL2luY2x1ZGUvYXNtLWlhNjQvcGFsLmgKaW5kZXggMmM4ZmQ5Mi4uNDI4M2RkYyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20taWE2NC9wYWwuaAorKysgYi9pbmNsdWRlL2FzbS1pYTY0L3BhbC5oCkBAIC03NjQsNyArNzY0LDcgQEAKICAqIChnZW5lcmFsbHkgMCkgTVVTVCBiZSBwYXNzZWQuICBSZXNlcnZlZCBwYXJhbWV0ZXJzIGFyZSBub3Qgb3B0aW9uYWwKICAqIHBhcmFtZXRlcnMuCiAgKi8KLWV4dGVybiBzdHJ1Y3QgaWE2NF9wYWxfcmV0dmFsIGlhNjRfcGFsX2NhbGxfc3RhdGljICh1NjQsIHU2NCwgdTY0LCB1NjQsIHU2NCk7CitleHRlcm4gc3RydWN0IGlhNjRfcGFsX3JldHZhbCBpYTY0X3BhbF9jYWxsX3N0YXRpYyAodTY0LCB1NjQsIHU2NCwgdTY0KTsKIGV4dGVybiBzdHJ1Y3QgaWE2NF9wYWxfcmV0dmFsIGlhNjRfcGFsX2NhbGxfc3RhY2tlZCAodTY0LCB1NjQsIHU2NCwgdTY0KTsKIGV4dGVybiBzdHJ1Y3QgaWE2NF9wYWxfcmV0dmFsIGlhNjRfcGFsX2NhbGxfcGh5c19zdGF0aWMgKHU2NCwgdTY0LCB1NjQsIHU2NCk7CiBleHRlcm4gc3RydWN0IGlhNjRfcGFsX3JldHZhbCBpYTY0X3BhbF9jYWxsX3BoeXNfc3RhY2tlZCAodTY0LCB1NjQsIHU2NCwgdTY0KTsKQEAgLTc3NCwxNCArNzc0LDcgQEAKICNkZWZpbmUgUEFMX0NBTEwoaXBydixhMCxhMSxhMixhMykgZG8gewkJCVwKIAlzdHJ1Y3QgaWE2NF9mcHJlZyBmcls2XTsJCQlcCiAJaWE2NF9zYXZlX3NjcmF0Y2hfZnByZWdzKGZyKTsJCQlcCi0JaXBydiA9IGlhNjRfcGFsX2NhbGxfc3RhdGljKGEwLCBhMSwgYTIsIGEzLCAwKTsJXAotCWlhNjRfbG9hZF9zY3JhdGNoX2ZwcmVncyhmcik7CQkJXAotfSB3aGlsZSAoMCkKLQotI2RlZmluZSBQQUxfQ0FMTF9JQ19PRkYoaXBydixhMCxhMSxhMixhMykgZG8gewkJXAotCXN0cnVjdCBpYTY0X2ZwcmVnIGZyWzZdOwkJCVwKLQlpYTY0X3NhdmVfc2NyYXRjaF9mcHJlZ3MoZnIpOwkJCVwKLQlpcHJ2ID0gaWE2NF9wYWxfY2FsbF9zdGF0aWMoYTAsIGExLCBhMiwgYTMsIDEpOwlcCisJaXBydiA9IGlhNjRfcGFsX2NhbGxfc3RhdGljKGEwLCBhMSwgYTIsIGEzKTsJXAogCWlhNjRfbG9hZF9zY3JhdGNoX2ZwcmVncyhmcik7CQkJXAogfSB3aGlsZSAoMCkKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20taWE2NC9zYWwuaCBiL2luY2x1ZGUvYXNtLWlhNjQvc2FsLmgKaW5kZXggMGIyMTBhYi4uZDAwMDY4OSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20taWE2NC9zYWwuaAorKysgYi9pbmNsdWRlL2FzbS1pYTY0L3NhbC5oCkBAIC02NTksNiArNjU5LDcgQEAKIH0KIAogZXh0ZXJuIHM2NCBpYTY0X3NhbF9jYWNoZV9mbHVzaCAodTY0IGNhY2hlX3R5cGUpOworZXh0ZXJuIHZvaWQgX19pbml0IGNoZWNrX3NhbF9jYWNoZV9mbHVzaCAodm9pZCk7CiAKIC8qIEluaXRpYWxpemUgYWxsIHRoZSBwcm9jZXNzb3IgYW5kIHBsYXRmb3JtIGxldmVsIGluc3RydWN0aW9uIGFuZCBkYXRhIGNhY2hlcyAqLwogc3RhdGljIGlubGluZSBzNjQKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWlhNjQvc24vYWRkcnMuaCBiL2luY2x1ZGUvYXNtLWlhNjQvc24vYWRkcnMuaAppbmRleCAxZDllZmU1Li5lNzE1Yzc5IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1pYTY0L3NuL2FkZHJzLmgKKysrIGIvaW5jbHVkZS9hc20taWE2NC9zbi9hZGRycy5oCkBAIC0xMzYsOSArMTM2LDEzIEBACiAgKi8KICNkZWZpbmUgVE9fUEhZUyh4KQkJKFRPX1BIWVNfTUFTSyAmICh4KSkKICNkZWZpbmUgVE9fQ0FDKHgpCQkoQ0FDX0JBU0UgICAgIHwgVE9fUEhZUyh4KSkKKyNpZmRlZiBDT05GSUdfU0dJX1NOCiAjZGVmaW5lIFRPX0FNTyh4KQkJKEFNT19CQVNFICAgICB8IFRPX1BIWVMoeCkpCiAjZGVmaW5lIFRPX0dFVCh4KQkJKEdFVF9CQVNFICAgICB8IFRPX1BIWVMoeCkpCi0KKyNlbHNlCisjZGVmaW5lIFRPX0FNTyh4KQkJKHsgQlVHKCk7IHg7IH0pCisjZGVmaW5lIFRPX0dFVCh4KQkJKHsgQlVHKCk7IHg7IH0pCisjZW5kaWYKIAogLyoKICAqIENvdmVydCBmcm9tIHByb2Nlc3NvciBwaHlzaWNhbCBhZGRyZXNzIHRvIElJL1RJTyBwaHlzaWNhbCBhZGRyZXNzOgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20taWE2NC91YWNjZXNzLmggYi9pbmNsdWRlL2FzbS1pYTY0L3VhY2Nlc3MuaAppbmRleCA5YWRiNTEyLi40NDljOGMwIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1pYTY0L3VhY2Nlc3MuaAorKysgYi9pbmNsdWRlL2FzbS1pYTY0L3VhY2Nlc3MuaApAQCAtMzg5LDcgKzM4OSw3IEBACiAJc3RydWN0IHBhZ2UgKnBhZ2U7CiAJY2hhciAqIHB0cjsKIAotCXBhZ2UgPSB2aXJ0X3RvX3BhZ2UoKHVuc2lnbmVkIGxvbmcpcCA+PiBQQUdFX1NISUZUKTsKKwlwYWdlID0gdmlydF90b19wYWdlKCh1bnNpZ25lZCBsb25nKXApOwogCWlmIChQYWdlVW5jYWNoZWQocGFnZSkpCiAJCXB0ciA9IChjaGFyICopX19wYShwKSArIF9fSUE2NF9VTkNBQ0hFRF9PRkZTRVQ7CiAJZWxzZQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbTMyci9pby5oIGIvaW5jbHVkZS9hc20tbTMyci9pby5oCmluZGV4IDcwYWQxYzkuLmQwNjkzM2IgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLW0zMnIvaW8uaAorKysgYi9pbmNsdWRlL2FzbS1tMzJyL2lvLmgKQEAgLTE2NiwzOCArMTY2LDYgQEAKIAogI2RlZmluZSBmbHVzaF93cml0ZV9idWZmZXJzKCkgZG8geyB9IHdoaWxlICgwKSAgLyogTTMyUl9GSVhNRSAqLwogCi0vKioKLSAqCWNoZWNrX3NpZ25hdHVyZQkJLQlmaW5kIEJJT1Mgc2lnbmF0dXJlcwotICoJQGlvX2FkZHI6IG1taW8gYWRkcmVzcyB0byBjaGVjawotICoJQHNpZ25hdHVyZTogIHNpZ25hdHVyZSBibG9jawotICoJQGxlbmd0aDogbGVuZ3RoIG9mIHNpZ25hdHVyZQotICoKLSAqCVBlcmZvcm0gYSBzaWduYXR1cmUgY29tcGFyaXNvbiB3aXRoIHRoZSBJU0EgbW1pbyBhZGRyZXNzIGlvX2FkZHIuCi0gKglSZXR1cm5zIDEgb24gYSBtYXRjaC4KLSAqCi0gKglUaGlzIGZ1bmN0aW9uIGlzIGRlcHJlY2F0ZWQuIE5ldyBkcml2ZXJzIHNob3VsZCB1c2UgaW9yZW1hcCBhbmQKLSAqCWNoZWNrX3NpZ25hdHVyZS4KLSAqLwotCi1zdGF0aWMgaW5saW5lIGludCBjaGVja19zaWduYXR1cmUodm9pZCBfX2lvbWVtICppb19hZGRyLAotICAgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpzaWduYXR1cmUsIGludCBsZW5ndGgpCi17Ci0gICAgICAgIGludCByZXR2YWwgPSAwOwotI2lmIDAKLXByaW50aygiY2hlY2tfc2lnbmF0dXJlXG4iKTsKLSAgICAgICAgZG8gewotICAgICAgICAgICAgICAgIGlmIChyZWFkYihpb19hZGRyKSAhPSAqc2lnbmF0dXJlKQotICAgICAgICAgICAgICAgICAgICAgICAgZ290byBvdXQ7Ci0gICAgICAgICAgICAgICAgaW9fYWRkcisrOwotICAgICAgICAgICAgICAgIHNpZ25hdHVyZSsrOwotICAgICAgICAgICAgICAgIGxlbmd0aC0tOwotICAgICAgICB9IHdoaWxlIChsZW5ndGgpOwotICAgICAgICByZXR2YWwgPSAxOwotb3V0OgotI2VuZGlmCi0gICAgICAgIHJldHVybiByZXR2YWw7Ci19Ci0KIHN0YXRpYyBpbmxpbmUgdm9pZAogbWVtc2V0X2lvKHZvbGF0aWxlIHZvaWQgX19pb21lbSAqYWRkciwgdW5zaWduZWQgY2hhciB2YWwsIGludCBjb3VudCkKIHsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW02OGsvc3VuM21tdS5oIGIvaW5jbHVkZS9hc20tbTY4ay9zdW4zbW11LmgKaW5kZXggNmM4YzE3ZC4uZDhmMTdhMCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tbTY4ay9zdW4zbW11LmgKKysrIGIvaW5jbHVkZS9hc20tbTY4ay9zdW4zbW11LmgKQEAgLTQsNiArNCw3IEBACiAjaWZuZGVmIF9fU1VOM19NTVVfSF9fCiAjZGVmaW5lIF9fU1VOM19NTVVfSF9fCiAKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogI2luY2x1ZGUgPGFzbS9tb3ZzLmg+CiAjaW5jbHVkZSA8YXNtL3N1bjMtaGVhZC5oPgogCkBAIC0xNjAsNyArMTYxLDcgQEAKIAlyZXR1cm47CiB9CiAKLWV4dGVybiB2b2lkICpzdW4zX2lvcmVtYXAodW5zaWduZWQgbG9uZyBwaHlzLCB1bnNpZ25lZCBsb25nIHNpemUsCitleHRlcm4gdm9pZCBfX2lvbWVtICpzdW4zX2lvcmVtYXAodW5zaWduZWQgbG9uZyBwaHlzLCB1bnNpZ25lZCBsb25nIHNpemUsCiAJCQkgIHVuc2lnbmVkIGxvbmcgdHlwZSk7CiAKIGV4dGVybiBpbnQgc3VuM19tYXBfdGVzdCh1bnNpZ25lZCBsb25nIGFkZHIsIGNoYXIgKnZhbCk7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1tNjhrL3VhY2Nlc3MuaCBiL2luY2x1ZGUvYXNtLW02OGsvdWFjY2Vzcy5oCmluZGV4IDg4YjFmNDcuLmU0YzlmMDggMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLW02OGsvdWFjY2Vzcy5oCisrKyBiL2luY2x1ZGUvYXNtLW02OGsvdWFjY2Vzcy5oCkBAIC03Niw3ICs3Niw3IEBACiAJCWJyZWFrOwkJCQkJCQlcCiAJY2FzZSA4OgkJCQkJCQkJXAogIAkgICAgewkJCQkJCQkJXAotIAkJY29uc3Qgdm9pZCAqX19wdV9wdHIgPSAocHRyKTsJCQkJXAorIAkJY29uc3Qgdm9pZCBfX3VzZXIgKl9fcHVfcHRyID0gKHB0cik7CQkJXAogCQlhc20gdm9sYXRpbGUgKCJcbiIJCQkJCVwKIAkJCSIxOgltb3Zlcy5sCSUyLCglMSkrXG4iCQkJXAogCQkJIjI6CW1vdmVzLmwJJVIyLCglMSlcbiIJCQlcCkBAIC0xMjUsNyArMTI1LDcgQEAKIAkJIgkucHJldmlvdXMiCQkJCVwKIAkJOiAiK2QiIChyZXMpLCAiPSYiICNyZWcgKF9fZ3VfdmFsKQkJXAogCQk6ICJtIiAoKihwdHIpKSwgImkiIChlcnIpKTsJCQlcCi0JKHgpID0gKHR5cGVvZigqKHB0cikpKShsb25nKV9fZ3VfdmFsOwkJCVwKKwkoeCkgPSAodHlwZW9mKCoocHRyKSkpKHVuc2lnbmVkIGxvbmcpX19ndV92YWw7CQlcCiB9KQogCiAjZGVmaW5lIF9fZ2V0X3VzZXIoeCwgcHRyKQkJCQkJCVwKQEAgLTIyMSwxNiArMjIxLDE2IEBACiAKIAlzd2l0Y2ggKG4pIHsKIAljYXNlIDE6Ci0JCV9fZ2V0X3VzZXJfYXNtKHJlcywgKih1OCAqKXRvLCAodTggKilmcm9tLCB1OCwgYiwgZCwgMSk7CisJCV9fZ2V0X3VzZXJfYXNtKHJlcywgKih1OCAqKXRvLCAodTggX191c2VyICopZnJvbSwgdTgsIGIsIGQsIDEpOwogCQlicmVhazsKIAljYXNlIDI6Ci0JCV9fZ2V0X3VzZXJfYXNtKHJlcywgKih1MTYgKil0bywgKHUxNiAqKWZyb20sIHUxNiwgdywgZCwgMik7CisJCV9fZ2V0X3VzZXJfYXNtKHJlcywgKih1MTYgKil0bywgKHUxNiBfX3VzZXIgKilmcm9tLCB1MTYsIHcsIGQsIDIpOwogCQlicmVhazsKIAljYXNlIDM6CiAJCV9fY29uc3RhbnRfY29weV9mcm9tX3VzZXJfYXNtKHJlcywgdG8sIGZyb20sIHRtcCwgMywgdywgYiwpOwogCQlicmVhazsKIAljYXNlIDQ6Ci0JCV9fZ2V0X3VzZXJfYXNtKHJlcywgKih1MzIgKil0bywgKHUzMiAqKWZyb20sIHUzMiwgbCwgciwgNCk7CisJCV9fZ2V0X3VzZXJfYXNtKHJlcywgKih1MzIgKil0bywgKHUzMiBfX3VzZXIgKilmcm9tLCB1MzIsIGwsIHIsIDQpOwogCQlicmVhazsKIAljYXNlIDU6CiAJCV9fY29uc3RhbnRfY29weV9mcm9tX3VzZXJfYXNtKHJlcywgdG8sIGZyb20sIHRtcCwgNSwgbCwgYiwpOwpAQCAtMzAyLDE2ICszMDIsMTYgQEAKIAogCXN3aXRjaCAobikgewogCWNhc2UgMToKLQkJX19wdXRfdXNlcl9hc20ocmVzLCAqKHU4ICopZnJvbSwgKHU4ICopdG8sIGIsIGQsIDEpOworCQlfX3B1dF91c2VyX2FzbShyZXMsICoodTggKilmcm9tLCAodTggX191c2VyICopdG8sIGIsIGQsIDEpOwogCQlicmVhazsKIAljYXNlIDI6Ci0JCV9fcHV0X3VzZXJfYXNtKHJlcywgKih1MTYgKilmcm9tLCAodTE2ICopdG8sIHcsIGQsIDIpOworCQlfX3B1dF91c2VyX2FzbShyZXMsICoodTE2ICopZnJvbSwgKHUxNiBfX3VzZXIgKil0bywgdywgZCwgMik7CiAJCWJyZWFrOwogCWNhc2UgMzoKIAkJX19jb25zdGFudF9jb3B5X3RvX3VzZXJfYXNtKHJlcywgdG8sIGZyb20sIHRtcCwgMywgdywgYiwpOwogCQlicmVhazsKIAljYXNlIDQ6Ci0JCV9fcHV0X3VzZXJfYXNtKHJlcywgKih1MzIgKilmcm9tLCAodTMyICopdG8sIGwsIHIsIDQpOworCQlfX3B1dF91c2VyX2FzbShyZXMsICoodTMyICopZnJvbSwgKHUzMiBfX3VzZXIgKil0bywgbCwgciwgNCk7CiAJCWJyZWFrOwogCWNhc2UgNToKIAkJX19jb25zdGFudF9jb3B5X3RvX3VzZXJfYXNtKHJlcywgdG8sIGZyb20sIHRtcCwgNSwgbCwgYiwpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbTY4a25vbW11L2lycV9yZWdzLmggYi9pbmNsdWRlL2FzbS1tNjhrbm9tbXUvaXJxX3JlZ3MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZGQ5YzBiCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9hc20tbTY4a25vbW11L2lycV9yZWdzLmgKQEAgLTAsMCArMSBAQAorI2luY2x1ZGUgPGFzbS1nZW5lcmljL2lycV9yZWdzLmg+CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1tNjhrbm9tbXUvaXJxbm9kZS5oIGIvaW5jbHVkZS9hc20tbTY4a25vbW11L2lycW5vZGUuaAppbmRleCBhMjUwM2RmLi42MTMyYTk4IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1tNjhrbm9tbXUvaXJxbm9kZS5oCisrKyBiL2luY2x1ZGUvYXNtLW02OGtub21tdS9pcnFub2RlLmgKQEAgLTgsNyArOCw3IEBACiAgKiBpbnRlcnJ1cHQgc291cmNlIChpZiBpdCBzdXBwb3J0cyBjaGFpbmluZykuCiAgKi8KIHR5cGVkZWYgc3RydWN0IGlycV9ub2RlIHsKLQlpcnFyZXR1cm5fdAkoKmhhbmRsZXIpKGludCwgdm9pZCAqLCBzdHJ1Y3QgcHRfcmVncyAqKTsKKwlpcnFfaGFuZGxlcl90CWhhbmRsZXI7CiAJdW5zaWduZWQgbG9uZwlmbGFnczsKIAl2b2lkCQkqZGV2X2lkOwogCWNvbnN0IGNoYXIJKmRldm5hbWU7CkBAIC0xOCwxMiArMTgsMTIgQEAKIC8qCiAgKiBUaGlzIHN0cnVjdHVyZSBoYXMgb25seSA0IGVsZW1lbnRzIGZvciBzcGVlZCByZWFzb25zCiAgKi8KLXR5cGVkZWYgc3RydWN0IGlycV9oYW5kbGVyIHsKLQlpcnFyZXR1cm5fdAkoKmhhbmRsZXIpKGludCwgdm9pZCAqLCBzdHJ1Y3QgcHRfcmVncyAqKTsKK3N0cnVjdCBpcnFfZW50cnkgeworCWlycV9oYW5kbGVyX3QJaGFuZGxlcjsKIAl1bnNpZ25lZCBsb25nCWZsYWdzOwogCXZvaWQJCSpkZXZfaWQ7CiAJY29uc3QgY2hhcgkqZGV2bmFtZTsKLX0gaXJxX2hhbmRsZXJfdDsKK307CiAKIC8qIGNvdW50IG9mIHNwdXJpb3VzIGludGVycnVwdHMgKi8KIGV4dGVybiB2b2xhdGlsZSB1bnNpZ25lZCBpbnQgbnVtX3NwdXJpb3VzOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbTY4a25vbW11L21hY2hkZXAuaCBiL2luY2x1ZGUvYXNtLW02OGtub21tdS9tYWNoZGVwLmgKaW5kZXggMjdjOTBhZi4uNmNlMjhmOCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tbTY4a25vbW11L21hY2hkZXAuaAorKysgYi9pbmNsdWRlL2FzbS1tNjhrbm9tbXUvbWFjaGRlcC5oCkBAIC0xOCw3ICsxOCw3IEBACiBleHRlcm4gdm9pZCAoKm1hY2hfa2JkX2xlZHMpICh1bnNpZ25lZCBpbnQpOwogLyogbWFjaGluZSBkZXBlbmRlbnQgaXJxIGZ1bmN0aW9ucyAqLwogZXh0ZXJuIHZvaWQgKCptYWNoX2luaXRfSVJRKSAodm9pZCk7Ci1leHRlcm4gaXJxcmV0dXJuX3QgKCooKm1hY2hfZGVmYXVsdF9oYW5kbGVyKVtdKSAoaW50LCB2b2lkICosIHN0cnVjdCBwdF9yZWdzICopOworZXh0ZXJuIGlycV9oYW5kbGVyX3QgbWFjaF9kZWZhdWx0X2hhbmRsZXI7CiBleHRlcm4gaW50ICgqbWFjaF9yZXF1ZXN0X2lycSkgKHVuc2lnbmVkIGludCBpcnEsIHZvaWQgKCpoYW5kbGVyKShpbnQsIHZvaWQgKiwgc3RydWN0IHB0X3JlZ3MgKiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgZmxhZ3MsIGNvbnN0IGNoYXIgKmRldm5hbWUsIHZvaWQgKmRldl9pZCk7CiBleHRlcm4gdm9pZCAoKm1hY2hfZnJlZV9pcnEpICh1bnNpZ25lZCBpbnQgaXJxLCB2b2lkICpkZXZfaWQpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbTY4a25vbW11L3VuaXN0ZC5oIGIvaW5jbHVkZS9hc20tbTY4a25vbW11L3VuaXN0ZC5oCmluZGV4IGRhYWZiNWQuLmViYWYwMzEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLW02OGtub21tdS91bmlzdGQuaAorKysgYi9pbmNsdWRlL2FzbS1tNjhrbm9tbXUvdW5pc3RkLmgKQEAgLTI4MSwxNCArMjgxLDQzIEBACiAjZGVmaW5lIF9fTlJfbXFfbm90aWZ5CQkyNzUKICNkZWZpbmUgX19OUl9tcV9nZXRzZXRhdHRyCTI3NgogI2RlZmluZSBfX05SX3dhaXRpZAkJMjc3Ci0jZGVmaW5lIF9fTlJfc3lzX3NldGFsdHJvb3QJMjc4CisjZGVmaW5lIF9fTlJfdnNlcnZlcgkJMjc4CiAjZGVmaW5lIF9fTlJfYWRkX2tleQkJMjc5CiAjZGVmaW5lIF9fTlJfcmVxdWVzdF9rZXkJMjgwCiAjZGVmaW5lIF9fTlJfa2V5Y3RsCQkyODEKLSAKKyNkZWZpbmUgX19OUl9pb3ByaW9fc2V0CQkyODIKKyNkZWZpbmUgX19OUl9pb3ByaW9fZ2V0CQkyODMKKyNkZWZpbmUgX19OUl9pbm90aWZ5X2luaXQJMjg0CisjZGVmaW5lIF9fTlJfaW5vdGlmeV9hZGRfd2F0Y2gJMjg1CisjZGVmaW5lIF9fTlJfaW5vdGlmeV9ybV93YXRjaAkyODYKKyNkZWZpbmUgX19OUl9taWdyYXRlX3BhZ2VzCTI4NworI2RlZmluZSBfX05SX29wZW5hdAkJMjg4CisjZGVmaW5lIF9fTlJfbWtkaXJhdAkJMjg5CisjZGVmaW5lIF9fTlJfbWtub2RhdAkJMjkwCisjZGVmaW5lIF9fTlJfZmNob3duYXQJCTI5MQorI2RlZmluZSBfX05SX2Z1dGltZXNhdAkJMjkyCisjZGVmaW5lIF9fTlJfZnN0YXRhdDY0CQkyOTMKKyNkZWZpbmUgX19OUl91bmxpbmthdAkJMjk0CisjZGVmaW5lIF9fTlJfcmVuYW1lYXQJCTI5NQorI2RlZmluZSBfX05SX2xpbmthdAkJMjk2CisjZGVmaW5lIF9fTlJfc3ltbGlua2F0CQkyOTcKKyNkZWZpbmUgX19OUl9yZWFkbGlua2F0CQkyOTgKKyNkZWZpbmUgX19OUl9mY2htb2RhdAkJMjk5CisjZGVmaW5lIF9fTlJfZmFjY2Vzc2F0CQkzMDAKKyNkZWZpbmUgX19OUl9wc2VsZWN0NgkJMzAxCisjZGVmaW5lIF9fTlJfcHBvbGwJCTMwMgorI2RlZmluZSBfX05SX3Vuc2hhcmUJCTMwMworI2RlZmluZSBfX05SX3NldF9yb2J1c3RfbGlzdAkzMDQKKyNkZWZpbmUgX19OUl9nZXRfcm9idXN0X2xpc3QJMzA1CisjZGVmaW5lIF9fTlJfc3BsaWNlCQkzMDYKKyNkZWZpbmUgX19OUl9zeW5jX2ZpbGVfcmFuZ2UJMzA3CisjZGVmaW5lIF9fTlJfdGVlCQkzMDgKKyNkZWZpbmUgX19OUl92bXNwbGljZQkJMzA5CisjZGVmaW5lIF9fTlJfbW92ZV9wYWdlcwkJMzEwCisKICNpZmRlZiBfX0tFUk5FTF9fCiAKLSNkZWZpbmUgTlJfc3lzY2FsbHMJCTI4MgorI2RlZmluZSBOUl9zeXNjYWxscwkJMzExCiAjaW5jbHVkZSA8bGludXgvZXJyLmg+CiAKIC8qIHVzZXItdmlzaWJsZSBlcnJvciBudW1iZXJzIGFyZSBpbiB0aGUgcmFuZ2UgLTEgLSAtTUFYX0VSUk5POiBzZWUKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW1pcHMvYXNtLmggYi9pbmNsdWRlL2FzbS1taXBzL2FzbS5oCmluZGV4IGUzMDM4YTQuLjgzOGViMzEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLW1pcHMvYXNtLmgKKysrIGIvaW5jbHVkZS9hc20tbWlwcy9hc20uaApAQCAtMzQ0LDYgKzM0NCw3IEBACiAjZGVmaW5lIFBUUl9MCQlsdwogI2RlZmluZSBQVFJfUwkJc3cKICNkZWZpbmUgUFRSX0xBCQlsYQorI2RlZmluZSBQVFJfTEkJCWxpCiAjZGVmaW5lIFBUUl9TTEwJCXNsbAogI2RlZmluZSBQVFJfU0xMVglzbGx2CiAjZGVmaW5lIFBUUl9TUkwJCXNybApAQCAtMzY4LDYgKzM2OSw3IEBACiAjZGVmaW5lIFBUUl9MCQlsZAogI2RlZmluZSBQVFJfUwkJc2QKICNkZWZpbmUgUFRSX0xBCQlkbGEKKyNkZWZpbmUgUFRSX0xJCQlkbGkKICNkZWZpbmUgUFRSX1NMTAkJZHNsbAogI2RlZmluZSBQVFJfU0xMVglkc2xsdgogI2RlZmluZSBQVFJfU1JMCQlkc3JsCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1taXBzL2NhY2hlZmx1c2guaCBiL2luY2x1ZGUvYXNtLW1pcHMvY2FjaGVmbHVzaC5oCmluZGV4IDlhYjU5ZTIuLmUzYzk5MjUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLW1pcHMvY2FjaGVmbHVzaC5oCisrKyBiL2luY2x1ZGUvYXNtLW1pcHMvY2FjaGVmbHVzaC5oCkBAIC01NSwyNCArNTUsMTMgQEAKICNkZWZpbmUgZmx1c2hfY2FjaGVfdm1hcChzdGFydCwgZW5kKQkJZmx1c2hfY2FjaGVfYWxsKCkKICNkZWZpbmUgZmx1c2hfY2FjaGVfdnVubWFwKHN0YXJ0LCBlbmQpCQlmbHVzaF9jYWNoZV9hbGwoKQogCi1zdGF0aWMgaW5saW5lIHZvaWQgY29weV90b191c2VyX3BhZ2Uoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsCitleHRlcm4gdm9pZCBjb3B5X3RvX3VzZXJfcGFnZShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwKIAlzdHJ1Y3QgcGFnZSAqcGFnZSwgdW5zaWduZWQgbG9uZyB2YWRkciwgdm9pZCAqZHN0LCBjb25zdCB2b2lkICpzcmMsCi0JdW5zaWduZWQgbG9uZyBsZW4pCi17Ci0JaWYgKGNwdV9oYXNfZGNfYWxpYXNlcykKLQkJZmx1c2hfY2FjaGVfcGFnZSh2bWEsIHZhZGRyLCBwYWdlX3RvX3BmbihwYWdlKSk7Ci0JbWVtY3B5KGRzdCwgc3JjLCBsZW4pOwotCV9fZmx1c2hfaWNhY2hlX3BhZ2Uodm1hLCBwYWdlKTsKLX0KKwl1bnNpZ25lZCBsb25nIGxlbik7CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBjb3B5X2Zyb21fdXNlcl9wYWdlKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLAorZXh0ZXJuIHZvaWQgY29weV9mcm9tX3VzZXJfcGFnZShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwKIAlzdHJ1Y3QgcGFnZSAqcGFnZSwgdW5zaWduZWQgbG9uZyB2YWRkciwgdm9pZCAqZHN0LCBjb25zdCB2b2lkICpzcmMsCi0JdW5zaWduZWQgbG9uZyBsZW4pCi17Ci0JaWYgKGNwdV9oYXNfZGNfYWxpYXNlcykKLQkJZmx1c2hfY2FjaGVfcGFnZSh2bWEsIHZhZGRyLCBwYWdlX3RvX3BmbihwYWdlKSk7Ci0JbWVtY3B5KGRzdCwgc3JjLCBsZW4pOwotfQorCXVuc2lnbmVkIGxvbmcgbGVuKTsKIAogZXh0ZXJuIHZvaWQgKCpmbHVzaF9jYWNoZV9zaWd0cmFtcCkodW5zaWduZWQgbG9uZyBhZGRyKTsKIGV4dGVybiB2b2lkICgqZmx1c2hfaWNhY2hlX2FsbCkodm9pZCk7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1taXBzL2RpdjY0LmggYi9pbmNsdWRlL2FzbS1taXBzL2RpdjY0LmgKaW5kZXggNWY3ZGNmNS4uZDEwNzgzMiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tbWlwcy9kaXY2NC5oCisrKyBiL2luY2x1ZGUvYXNtLW1pcHMvZGl2NjQuaApAQCAtODMsMjcgKzgzLDYgQEAKICNpZiAoX01JUFNfU1pMT05HID09IDY0KQogCiAvKgotICogRG9uJ3QgdXNlIHRoaXMgb25lIGluIG5ldyBjb2RlCi0gKi8KLSNkZWZpbmUgZG9fZGl2NjRfMzIocmVzLCBoaWdoLCBsb3csIGJhc2UpICh7IFwKLQl1bnNpZ25lZCBpbnQgX19xdW90LCBfX21vZDsgXAotCXVuc2lnbmVkIGxvbmcgX19kaXY7IFwKLQl1bnNpZ25lZCBpbnQgX19sb3csIF9faGlnaCwgX19iYXNlOyBcCi0JXAotCV9faGlnaCA9IChoaWdoKTsgXAotCV9fbG93ID0gKGxvdyk7IFwKLQlfX2RpdiA9IF9faGlnaDsgXAotCV9fZGl2ID0gX19kaXYgPDwgMzIgfCBfX2xvdzsgXAotCV9fYmFzZSA9IChiYXNlKTsgXAotCVwKLQlfX21vZCA9IF9fZGl2ICUgX19iYXNlOyBcCi0JX19kaXYgPSBfX2RpdiAvIF9fYmFzZTsgXAotCVwKLQlfX3F1b3QgPSBfX2RpdjsgXAotCShyZXMpID0gX19xdW90OyBcCi0JX19tb2Q7IH0pCi0KLS8qCiAgKiBIZXksIHdlJ3JlIGFscmVhZHkgNjQtYml0LCBubwogICogbmVlZCB0byBwbGF5IGdhbWVzLi4KICAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbWlwcy9maXhtYXAuaCBiL2luY2x1ZGUvYXNtLW1pcHMvZml4bWFwLmgKaW5kZXggNjk1OWJkYi4uMDJjOGExMyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tbWlwcy9maXhtYXAuaAorKysgYi9pbmNsdWRlL2FzbS1taXBzL2ZpeG1hcC5oCkBAIC00NSw4ICs0NSwxNiBAQAogICogZml4LW1hcHBlZD8KICAqLwogZW51bSBmaXhlZF9hZGRyZXNzZXMgeworI2RlZmluZSBGSVhfTl9DT0xPVVJTIDgKKwlGSVhfQ01BUF9CRUdJTiwKKyNpZmRlZiBDT05GSUdfTUlQU19NVF9TTVRDCisJRklYX0NNQVBfRU5EID0gRklYX0NNQVBfQkVHSU4gKyAoRklYX05fQ09MT1VSUyAqIE5SX0NQVVMpLAorI2Vsc2UKKwlGSVhfQ01BUF9FTkQgPSBGSVhfQ01BUF9CRUdJTiArIEZJWF9OX0NPTE9VUlMsCisjZW5kaWYKICNpZmRlZiBDT05GSUdfSElHSE1FTQotCUZJWF9LTUFQX0JFR0lOLAkvKiByZXNlcnZlZCBwdGUncyBmb3IgdGVtcG9yYXJ5IGtlcm5lbCBtYXBwaW5ncyAqLworCS8qIHJlc2VydmVkIHB0ZSdzIGZvciB0ZW1wb3Jhcnkga2VybmVsIG1hcHBpbmdzICovCisJRklYX0tNQVBfQkVHSU4gPSBGSVhfQ01BUF9FTkQgKyAxLAogCUZJWF9LTUFQX0VORCA9IEZJWF9LTUFQX0JFR0lOKyhLTV9UWVBFX05SKk5SX0NQVVMpLTEsCiAjZW5kaWYKIAlfX2VuZF9vZl9maXhlZF9hZGRyZXNzZXMKQEAgLTcwLDkgKzc4LDkgQEAKICAqIGF0IHRoZSB0b3Agb2YgbWVtLi4KICAqLwogI2lmIGRlZmluZWQoQ09ORklHX0NQVV9UWDM5WFgpIHx8IGRlZmluZWQoQ09ORklHX0NQVV9UWDQ5WFgpCi0jZGVmaW5lIEZJWEFERFJfVE9QCSgweGZmMDAwMDAwVUwgLSAweDIwMDApCisjZGVmaW5lIEZJWEFERFJfVE9QCSgodW5zaWduZWQgbG9uZykobG9uZykoaW50KSgweGZmMDAwMDAwIC0gMHgyMDAwMCkpCiAjZWxzZQotI2RlZmluZSBGSVhBRERSX1RPUAkoMHhmZmZmZTAwMFVMKQorI2RlZmluZSBGSVhBRERSX1RPUAkoKHVuc2lnbmVkIGxvbmcpKGxvbmcpKGludCkweGZmZmUwMDAwKQogI2VuZGlmCiAjZGVmaW5lIEZJWEFERFJfU0laRQkoX19lbmRfb2ZfZml4ZWRfYWRkcmVzc2VzIDw8IFBBR0VfU0hJRlQpCiAjZGVmaW5lIEZJWEFERFJfU1RBUlQJKEZJWEFERFJfVE9QIC0gRklYQUREUl9TSVpFKQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbWlwcy9pby5oIGIvaW5jbHVkZS9hc20tbWlwcy9pby5oCmluZGV4IGRmNjI0ZTEuLmJjNWYzYzUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLW1pcHMvaW8uaAorKysgYi9pbmNsdWRlL2FzbS1taXBzL2lvLmgKQEAgLTE3Miw3ICsxNzIsNyBAQAogI2RlZmluZSBwYWdlX3RvX3BoeXMocGFnZSkJKChkbWFfYWRkcl90KXBhZ2VfdG9fcGZuKHBhZ2UpIDw8IFBBR0VfU0hJRlQpCiAKIGV4dGVybiB2b2lkIF9faW9tZW0gKiBfX2lvcmVtYXAocGh5c190IG9mZnNldCwgcGh5c190IHNpemUsIHVuc2lnbmVkIGxvbmcgZmxhZ3MpOwotZXh0ZXJuIHZvaWQgX19pb3VubWFwKHZvbGF0aWxlIHZvaWQgX19pb21lbSAqYWRkcik7CitleHRlcm4gdm9pZCBfX2lvdW5tYXAoY29uc3Qgdm9sYXRpbGUgdm9pZCBfX2lvbWVtICphZGRyKTsKIAogc3RhdGljIGlubGluZSB2b2lkIF9faW9tZW0gKiBfX2lvcmVtYXBfbW9kZShwaHlzX3Qgb2Zmc2V0LCB1bnNpZ25lZCBsb25nIHNpemUsCiAJdW5zaWduZWQgbG9uZyBmbGFncykKQEAgLTI3OSw3ICsyNzksNyBAQAogI2RlZmluZSBpb3JlbWFwX3VuY2FjaGVkX2FjY2VsZXJhdGVkKG9mZnNldCwgc2l6ZSkJCQlcCiAJX19pb3JlbWFwX21vZGUoKG9mZnNldCksIChzaXplKSwgX0NBQ0hFX1VOQ0FDSEVEX0FDQ0VMRVJBVEVEKQogCi1zdGF0aWMgaW5saW5lIHZvaWQgaW91bm1hcCh2b2xhdGlsZSB2b2lkIF9faW9tZW0gKmFkZHIpCitzdGF0aWMgaW5saW5lIHZvaWQgaW91bm1hcChjb25zdCB2b2xhdGlsZSB2b2lkIF9faW9tZW0gKmFkZHIpCiB7CiAjZGVmaW5lIF9fSVNfS1NFRzEoYWRkcikgKCgodW5zaWduZWQgbG9uZykoYWRkcikgJiB+MHgxZmZmZmZmZlVMKSA9PSBDS1NFRzEpCiAKQEAgLTU2MiwzMiArNTYyLDYgQEAKICNkZWZpbmUgZXRoX2lvX2NvcHlfYW5kX3N1bShza2Isc3JjLGxlbix1bnVzZWQpIG1lbWNweV9mcm9taW8oKHNrYiktPmRhdGEsKHNyYyksKGxlbikpCiAKIC8qCi0gKiAgICAgY2hlY2tfc2lnbmF0dXJlICAgICAgICAgLSAgICAgICBmaW5kIEJJT1Mgc2lnbmF0dXJlcwotICogICAgIEBpb19hZGRyOiBtbWlvIGFkZHJlc3MgdG8gY2hlY2sKLSAqICAgICBAc2lnbmF0dXJlOiAgc2lnbmF0dXJlIGJsb2NrCi0gKiAgICAgQGxlbmd0aDogbGVuZ3RoIG9mIHNpZ25hdHVyZQotICoKLSAqICAgICBQZXJmb3JtIGEgc2lnbmF0dXJlIGNvbXBhcmlzb24gd2l0aCB0aGUgbW1pbyBhZGRyZXNzIGlvX2FkZHIuIFRoaXMKLSAqICAgICBhZGRyZXNzIHNob3VsZCBoYXZlIGJlZW4gb2J0YWluZWQgYnkgaW9yZW1hcC4KLSAqICAgICBSZXR1cm5zIDEgb24gYSBtYXRjaC4KLSAqLwotc3RhdGljIGlubGluZSBpbnQgY2hlY2tfc2lnbmF0dXJlKGNoYXIgX19pb21lbSAqaW9fYWRkciwKLQljb25zdCB1bnNpZ25lZCBjaGFyICpzaWduYXR1cmUsIGludCBsZW5ndGgpCi17Ci0JaW50IHJldHZhbCA9IDA7Ci0JZG8gewotCQlpZiAocmVhZGIoaW9fYWRkcikgIT0gKnNpZ25hdHVyZSkKLQkJCWdvdG8gb3V0OwotCQlpb19hZGRyKys7Ci0JCXNpZ25hdHVyZSsrOwotCQlsZW5ndGgtLTsKLQl9IHdoaWxlIChsZW5ndGgpOwotCXJldHZhbCA9IDE7Ci1vdXQ6Ci0JcmV0dXJuIHJldHZhbDsKLX0KLQotLyoKICAqIFRoZSBjYWNoZXMgb24gc29tZSBhcmNoaXRlY3R1cmVzIGFyZW4ndCBkbWEtY29oZXJlbnQgYW5kIGhhdmUgbmVlZCB0bwogICogaGFuZGxlIHRoaXMgaW4gc29mdHdhcmUuICBUaGVyZSBhcmUgdGhyZWUgdHlwZXMgb2Ygb3BlcmF0aW9ucyB0aGF0CiAgKiBjYW4gYmUgYXBwbGllZCB0byBkbWEgYnVmZmVycy4KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW1pcHMvaXJxLmggYi9pbmNsdWRlL2FzbS1taXBzL2lycS5oCmluZGV4IDFhOTgwNGMuLjM1YTA1Y2EgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLW1pcHMvaXJxLmgKKysrIGIvaW5jbHVkZS9hc20tbWlwcy9pcnEuaApAQCAtMjQsOCArMjQsNiBAQAogI2RlZmluZSBpcnFfY2Fub25pY2FsaXplKGlycSkgKGlycSkJLyogU2FuZSBoYXJkd2FyZSwgc2FuZSBjb2RlIC4uLiAqLwogI2VuZGlmCiAKLXN0cnVjdCBwdF9yZWdzOwotCiBleHRlcm4gYXNtbGlua2FnZSB1bnNpZ25lZCBpbnQgZG9fSVJRKHVuc2lnbmVkIGludCBpcnEpOwogCiAjaWZkZWYgQ09ORklHX01JUFNfTVRfU01UQwpAQCAtNzYsNCArNzQsOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nIGh3bWFzayk7CiAjZW5kaWYgLyogQ09ORklHX01JUFNfTVRfU01UQyAqLwogCitleHRlcm4gaW50IGFsbG9jYXRlX2lycW5vKHZvaWQpOworZXh0ZXJuIHZvaWQgYWxsb2NfbGVnYWN5X2lycW5vKHZvaWQpOworZXh0ZXJuIHZvaWQgZnJlZV9pcnFubyh1bnNpZ25lZCBpbnQgaXJxKTsKKwogI2VuZGlmIC8qIF9BU01fSVJRX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW1pcHMvbWlwc210cmVncy5oIGIvaW5jbHVkZS9hc20tbWlwcy9taXBzbXRyZWdzLmgKaW5kZXggZjYzN2NlNy4uM2U5NDY4ZiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tbWlwcy9taXBzbXRyZWdzLmgKKysrIGIvaW5jbHVkZS9hc20tbWlwcy9taXBzbXRyZWdzLmgKQEAgLTM1Miw2ICszNTIsOCBAQAogI2RlZmluZSB3cml0ZV92cGVfYzBfdnBlY29udHJvbCh2YWwpCW10dGMwKDEsIDEsIHZhbCkKICNkZWZpbmUgcmVhZF92cGVfYzBfdnBlY29uZjAoKQkJbWZ0YzAoMSwgMikKICNkZWZpbmUgd3JpdGVfdnBlX2MwX3ZwZWNvbmYwKHZhbCkJbXR0YzAoMSwgMiwgdmFsKQorI2RlZmluZSByZWFkX3ZwZV9jMF9jb3VudCgpCQltZnRjMCg5LCAwKQorI2RlZmluZSB3cml0ZV92cGVfYzBfY291bnQodmFsKQkJbXR0YzAoOSwgMCwgdmFsKQogI2RlZmluZSByZWFkX3ZwZV9jMF9zdGF0dXMoKQkJbWZ0YzAoMTIsIDApCiAjZGVmaW5lIHdyaXRlX3ZwZV9jMF9zdGF0dXModmFsKQltdHRjMCgxMiwgMCwgdmFsKQogI2RlZmluZSByZWFkX3ZwZV9jMF9jYXVzZSgpCQltZnRjMCgxMywgMCkKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW1pcHMvcGdhbGxvYy5oIGIvaW5jbHVkZS9hc20tbWlwcy9wZ2FsbG9jLmgKaW5kZXggNTgyYzFmZS4uYWYxMjFjNiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tbWlwcy9wZ2FsbG9jLmgKKysrIGIvaW5jbHVkZS9hc20tbWlwcy9wZ2FsbG9jLmgKQEAgLTQ4LDcgKzQ4LDcgQEAKIAogCXJldCA9IChwZ2RfdCAqKSBfX2dldF9mcmVlX3BhZ2VzKEdGUF9LRVJORUwsIFBHRF9PUkRFUik7CiAJaWYgKHJldCkgewotCQlpbml0ID0gcGdkX29mZnNldCgmaW5pdF9tbSwgMCk7CisJCWluaXQgPSBwZ2Rfb2Zmc2V0KCZpbml0X21tLCAwVUwpOwogCQlwZ2RfaW5pdCgodW5zaWduZWQgbG9uZylyZXQpOwogCQltZW1jcHkocmV0ICsgVVNFUl9QVFJTX1BFUl9QR0QsIGluaXQgKyBVU0VSX1BUUlNfUEVSX1BHRCwKIAkJICAgICAgIChQVFJTX1BFUl9QR0QgLSBVU0VSX1BUUlNfUEVSX1BHRCkgKiBzaXplb2YocGdkX3QpKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW1pcHMvcGd0YWJsZS02NC5oIGIvaW5jbHVkZS9hc20tbWlwcy9wZ3RhYmxlLTY0LmgKaW5kZXggZDA1ZmI2Zi4uN2U3MzIwMyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tbWlwcy9wZ3RhYmxlLTY0LmgKKysrIGIvaW5jbHVkZS9hc20tbWlwcy9wZ3RhYmxlLTY0LmgKQEAgLTE3NCw3ICsxNzQsNyBAQAogI2RlZmluZSBfX3BtZF9vZmZzZXQoYWRkcmVzcykJcG1kX2luZGV4KGFkZHJlc3MpCiAKIC8qIHRvIGZpbmQgYW4gZW50cnkgaW4gYSBrZXJuZWwgcGFnZS10YWJsZS1kaXJlY3RvcnkgKi8KLSNkZWZpbmUgcGdkX29mZnNldF9rKGFkZHJlc3MpIHBnZF9vZmZzZXQoJmluaXRfbW0sIDApCisjZGVmaW5lIHBnZF9vZmZzZXRfayhhZGRyZXNzKSBwZ2Rfb2Zmc2V0KCZpbml0X21tLCAwVUwpCiAKICNkZWZpbmUgcGdkX2luZGV4KGFkZHJlc3MpCSgoKGFkZHJlc3MpID4+IFBHRElSX1NISUZUKSAmIChQVFJTX1BFUl9QR0QtMSkpCiAjZGVmaW5lIHBtZF9pbmRleChhZGRyZXNzKQkoKChhZGRyZXNzKSA+PiBQTURfU0hJRlQpICYgKFBUUlNfUEVSX1BNRC0xKSkKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW1pcHMvc2lieXRlL3NiMTI1MC5oIGIvaW5jbHVkZS9hc20tbWlwcy9zaWJ5dGUvc2IxMjUwLmgKaW5kZXggYjA5ZTE2Yy4uMmJhNjk4OCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tbWlwcy9zaWJ5dGUvc2IxMjUwLmgKKysrIGIvaW5jbHVkZS9hc20tbWlwcy9zaWJ5dGUvc2IxMjUwLmgKQEAgLTUxLDggKzUxLDggQEAKIGV4dGVybiB2b2lkIHNiMTI1MF91bm1hc2tfaXJxKGludCBjcHUsIGludCBpcnEpOwogZXh0ZXJuIHZvaWQgc2IxMjUwX3NtcF9maW5pc2godm9pZCk7CiAKK2V4dGVybiB2b2lkIGJjbTE0ODBfaHB0X3NldHVwKHZvaWQpOwogZXh0ZXJuIHZvaWQgYmNtMTQ4MF90aW1lX2luaXQodm9pZCk7Ci1leHRlcm4gdW5zaWduZWQgbG9uZyBiY20xNDgwX2dldHRpbWVvZmZzZXQodm9pZCk7CiBleHRlcm4gdm9pZCBiY20xNDgwX21hc2tfaXJxKGludCBjcHUsIGludCBpcnEpOwogZXh0ZXJuIHZvaWQgYmNtMTQ4MF91bm1hc2tfaXJxKGludCBjcHUsIGludCBpcnEpOwogZXh0ZXJuIHZvaWQgYmNtMTQ4MF9zbXBfZmluaXNoKHZvaWQpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbWlwcy9zdGFja2ZyYW1lLmggYi9pbmNsdWRlL2FzbS1taXBzL3N0YWNrZnJhbWUuaAppbmRleCAxNThhNGNkLi4xZmFlNWRjIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1taXBzL3N0YWNrZnJhbWUuaAorKysgYi9pbmNsdWRlL2FzbS1taXBzL3N0YWNrZnJhbWUuaApAQCAtNTksNjkgKzU5LDQzIEBACiAJCS5lbmRtCiAKICNpZmRlZiBDT05GSUdfU01QCisjaWZkZWYgQ09ORklHX01JUFNfTVRfU01UQworI2RlZmluZSBQVEVCQVNFX1NISUZUCTE5CS8qIFRDQklORCAqLworI2Vsc2UKKyNkZWZpbmUgUFRFQkFTRV9TSElGVAkyMwkvKiBDT05URVhUICovCisjZW5kaWYKIAkJLm1hY3JvCWdldF9zYXZlZF9zcAkvKiBTTVAgdmFyaWF0aW9uICovCi0jaWZkZWYgQ09ORklHXzMyQklUCiAjaWZkZWYgQ09ORklHX01JUFNfTVRfU01UQwotCQkuc2V0CW1pcHMzMgotCQltZmMwCWswLCBDUDBfVENCSU5EOwotCQkuc2V0CW1pcHMwCi0JCWx1aQlrMSwgJWhpKGtlcm5lbHNwKQotCQlzcmwJazAsIGswLCAxOQotCQkvKiBObyBuZWVkIHRvIHNoaWZ0IGRvd24gYW5kIHVwIHRvIGNsZWFyIGJpdHMgMC0xICovCisJCW1mYzAJazAsIENQMF9UQ0JJTkQKICNlbHNlCi0JCW1mYzAJazAsIENQMF9DT05URVhUCi0JCWx1aQlrMSwgJWhpKGtlcm5lbHNwKQotCQlzcmwJazAsIGswLCAyMworCQlNRkMwCWswLCBDUDBfQ09OVEVYVAogI2VuZGlmCi0JCWFkZHUJazEsIGswCi0JCUxPTkdfTAlrMSwgJWxvKGtlcm5lbHNwKShrMSkKLSNlbmRpZgotI2lmZGVmIENPTkZJR182NEJJVAotI2lmZGVmIENPTkZJR19NSVBTX01UX1NNVEMKLQkJLnNldAltaXBzNjQKLQkJbWZjMAlrMCwgQ1AwX1RDQklORDsKLQkJLnNldAltaXBzMAotCQlsdWkJazAsICVoaWdoZXN0KGtlcm5lbHNwKQotCQlkc3JsCWsxLCAxOQotCQkvKiBObyBuZWVkIHRvIHNoaWZ0IGRvd24gYW5kIHVwIHRvIGNsZWFyIGJpdHMgMC0yICovCisjaWYgZGVmaW5lZChDT05GSUdfQlVJTERfRUxGNjQpIHx8IChkZWZpbmVkKENPTkZJR182NEJJVCkgJiYgX19HTlVDX18gPCA0KQorCQlsdWkJazEsICVoaWdoZXN0KGtlcm5lbHNwKQorCQlkYWRkaXUJazEsICVoaWdoZXIoa2VybmVsc3ApCisJCWRzbGwJazEsIDE2CisJCWRhZGRpdQlrMSwgJWhpKGtlcm5lbHNwKQorCQlkc2xsCWsxLCAxNgogI2Vsc2UKLQkJTUZDMAlrMSwgQ1AwX0NPTlRFWFQKLQkJbHVpCWswLCAlaGlnaGVzdChrZXJuZWxzcCkKLQkJZHNybAlrMSwgMjMKLQkJZGFkZGl1CWswLCAlaGlnaGVyKGtlcm5lbHNwKQotCQlkc2xsCWswLCBrMCwgMTYKLQkJZGFkZGl1CWswLCAlaGkoa2VybmVsc3ApCi0JCWRzbGwJazAsIGswLCAxNgotI2VuZGlmIC8qIENPTkZJR19NSVBTX01UX1NNVEMgKi8KLQkJZGFkZHUJazEsIGsxLCBrMAorCQlsdWkJazEsICVoaShrZXJuZWxzcCkKKyNlbmRpZgorCQlMT05HX1NSTAlrMCwgUFRFQkFTRV9TSElGVAorCQlMT05HX0FERFUJazEsIGswCiAJCUxPTkdfTAlrMSwgJWxvKGtlcm5lbHNwKShrMSkKLSNlbmRpZiAvKiBDT05GSUdfNjRCSVQgKi8KIAkJLmVuZG0KIAogCQkubWFjcm8Jc2V0X3NhdmVkX3NwIHN0YWNrcCB0ZW1wIHRlbXAyCi0jaWZkZWYgQ09ORklHXzMyQklUCiAjaWZkZWYgQ09ORklHX01JUFNfTVRfU01UQwogCQltZmMwCVx0ZW1wLCBDUDBfVENCSU5ECi0JCXNybAlcdGVtcCwgMTkKLSNlbHNlCi0JCW1mYzAJXHRlbXAsIENQMF9DT05URVhUCi0JCXNybAlcdGVtcCwgMjMKLSNlbmRpZgotI2VuZGlmCi0jaWZkZWYgQ09ORklHXzY0QklUCi0jaWZkZWYgQ09ORklHX01JUFNfTVRfU01UQwotCQltZmMwCVx0ZW1wLCBDUDBfVENCSU5ECi0JCWRzcmwJXHRlbXAsIDE5CiAjZWxzZQogCQlNRkMwCVx0ZW1wLCBDUDBfQ09OVEVYVAotCQlkc3JsCVx0ZW1wLCAyMwogI2VuZGlmCi0jZW5kaWYKKwkJTE9OR19TUkwJXHRlbXAsIFBURUJBU0VfU0hJRlQKIAkJTE9OR19TCVxzdGFja3AsIGtlcm5lbHNwKFx0ZW1wKQogCQkuZW5kbQogI2Vsc2UKIAkJLm1hY3JvCWdldF9zYXZlZF9zcAkvKiBVbmlwcm9jZXNzb3IgdmFyaWF0aW9uICovCi0jaWZkZWYgQ09ORklHXzY0QklUCisjaWYgZGVmaW5lZChDT05GSUdfQlVJTERfRUxGNjQpIHx8IChkZWZpbmVkKENPTkZJR182NEJJVCkgJiYgX19HTlVDX18gPCA0KQogCQlsdWkJazEsICVoaWdoZXN0KGtlcm5lbHNwKQogCQlkYWRkaXUJazEsICVoaWdoZXIoa2VybmVsc3ApCiAJCWRzbGwJazEsIGsxLCAxNgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbWlwcy9zeXN0ZW0uaCBiL2luY2x1ZGUvYXNtLW1pcHMvc3lzdGVtLmgKaW5kZXggZGNiNDcwMS4uMzA1NmZlZSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tbWlwcy9zeXN0ZW0uaAorKysgYi9pbmNsdWRlL2FzbS1taXBzL3N5c3RlbS5oCkBAIC0zOTIsNyArMzkyLDcgQEAKIHsKIAlfX3U2NCByZXR2YWw7CiAKLQlpZiAoY3B1X2hhc19sbHNjKSB7CisJaWYgKGNwdV9oYXNfbGxzYyAmJiBSMTAwMDBfTExTQ19XQVIpIHsKIAkJX19hc21fXyBfX3ZvbGF0aWxlX18oCiAJCSIJLnNldAlwdXNoCQkJCQlcbiIKIAkJIgkuc2V0CW5vYXQJCQkJCVxuIgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbWlwcy90ZXJtYml0cy5oIGIvaW5jbHVkZS9hc20tbWlwcy90ZXJtYml0cy5oCmluZGV4IGZhNmQwNGQuLmI2MmVjN2MgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLW1pcHMvdGVybWJpdHMuaAorKysgYi9pbmNsdWRlL2FzbS1taXBzL3Rlcm1iaXRzLmgKQEAgLTMsNyArMyw3IEBACiAgKiBMaWNlbnNlLiAgU2VlIHRoZSBmaWxlICJDT1BZSU5HIiBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhpcyBhcmNoaXZlCiAgKiBmb3IgbW9yZSBkZXRhaWxzLgogICoKLSAqIENvcHlyaWdodCAoQykgMTk5NSwgMTk5NiwgMTk5OSwgMjAwMSBSYWxmIEJhZWNobGUKKyAqIENvcHlyaWdodCAoQykgMTk5NSwgOTYsIDk5LCAyMDAxLCAwNiBSYWxmIEJhZWNobGUKICAqIENvcHlyaWdodCAoQykgMTk5OSBTaWxpY29uIEdyYXBoaWNzLCBJbmMuCiAgKiBDb3B5cmlnaHQgKEMpIDIwMDEgTUlQUyBUZWNobm9sb2dpZXMsIEluYy4KICAqLwpAQCAtMTMsMTQgKzEzLDggQEAKICNpbmNsdWRlIDxsaW51eC9wb3NpeF90eXBlcy5oPgogCiB0eXBlZGVmIHVuc2lnbmVkIGNoYXIgY2NfdDsKLSNpZiAoX01JUFNfU1pMT05HID09IDMyKQotdHlwZWRlZiB1bnNpZ25lZCBsb25nIHNwZWVkX3Q7Ci10eXBlZGVmIHVuc2lnbmVkIGxvbmcgdGNmbGFnX3Q7Ci0jZW5kaWYKLSNpZiAoX01JUFNfU1pMT05HID09IDY0KQotdHlwZWRlZiBfX3UzMiBzcGVlZF90OwotdHlwZWRlZiBfX3UzMiB0Y2ZsYWdfdDsKLSNlbmRpZgordHlwZWRlZiB1bnNpZ25lZCBpbnQgc3BlZWRfdDsKK3R5cGVkZWYgdW5zaWduZWQgaW50IHRjZmxhZ190OwogCiAvKgogICogVGhlIEFCSSBzYXlzIG5vdGhpbmcgYWJvdXQgTkNDIGJ1dCBzZWVtcyB0byB1c2UgTkNDUyBhcwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbWlwcy90aW1lLmggYi9pbmNsdWRlL2FzbS1taXBzL3RpbWUuaAppbmRleCAyODUxMmJhLi42MjVhY2QzIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1taXBzL3RpbWUuaAorKysgYi9pbmNsdWRlL2FzbS1taXBzL3RpbWUuaApAQCAtNDgsNyArNDgsOCBAQAogICogSWYgbWlwc19ocHRfcmVhZCBpcyBOVUxMLCBhbiBSNGstY29tcGF0aWJsZSB0aW1lciBzZXR1cCBpcyBhdHRlbXB0ZWQuCiAgKi8KIGV4dGVybiB1bnNpZ25lZCBpbnQgKCptaXBzX2hwdF9yZWFkKSh2b2lkKTsKLWV4dGVybiB2b2lkICgqbWlwc19ocHRfaW5pdCkodW5zaWduZWQgaW50KTsKK2V4dGVybiB2b2lkICgqbWlwc19ocHRfaW5pdCkodm9pZCk7CitleHRlcm4gdW5zaWduZWQgaW50IG1pcHNfaHB0X21hc2s7CiAKIC8qCiAgKiB0b190bSgpIGNvbnZlcnRzIHN5c3RlbSB0aW1lIGJhY2sgdG8gKHllYXIsIG1vbiwgZGF5LCBob3VyLCBtaW4sIHNlYykuCkBAIC01OCwxMyArNTksNiBAQAogZXh0ZXJuIHZvaWQgdG9fdG0odW5zaWduZWQgbG9uZyB0aW0sIHN0cnVjdCBydGNfdGltZSAqdG0pOwogCiAvKgotICogZG9fZ2V0dGltZW9mZnNldCgpLiBCeSBkZWZhdWx0LCB0aGlzIGZ1bmMgcG9pbnRlciBwb2ludHMgdG8KLSAqIGRvX251bGxfZ2V0dGltZW9mZnNldCgpLCB3aGljaCBsZWFkcyB0byB0aGUgc2FtZSByZXNvbHV0aW9uIGFzIEhaLgotICogSGlnaGVyIHJlc29sdXRpb24gdmVyc2lvbnMgYXJlIGF2YWlsYWJsZSwgd2hpY2ggZ2l2ZSB+MXVzIHJlc29sdXRpb24uCi0gKi8KLWV4dGVybiB1bnNpZ25lZCBsb25nICgqZG9fZ2V0dGltZW9mZnNldCkodm9pZCk7Ci0KLS8qCiAgKiBoaWdoLWxldmVsIHRpbWVyIGludGVycnVwdCByb3V0aW5lcy4KICAqLwogZXh0ZXJuIGlycXJldHVybl90IHRpbWVyX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbWlwcy91bmlzdGQuaCBiL2luY2x1ZGUvYXNtLW1pcHMvdW5pc3RkLmgKaW5kZXggNjg1YzkxNC4uZWM1NmFhNSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tbWlwcy91bmlzdGQuaAorKysgYi9pbmNsdWRlL2FzbS1taXBzL3VuaXN0ZC5oCkBAIC0zMzEsMTYgKzMzMSwxOSBAQAogI2RlZmluZSBfX05SX21vdmVfcGFnZXMJCQkoX19OUl9MaW51eCArIDMwOCkKICNkZWZpbmUgX19OUl9zZXRfcm9idXN0X2xpc3QJCShfX05SX0xpbnV4ICsgMzA5KQogI2RlZmluZSBfX05SX2dldF9yb2J1c3RfbGlzdAkJKF9fTlJfTGludXggKyAzMTApCisjZGVmaW5lIF9fTlJfa2V4ZWNfbG9hZAkJCShfX05SX0xpbnV4ICsgMzExKQorI2RlZmluZSBfX05SX2dldGNwdQkJCShfX05SX0xpbnV4ICsgMzEyKQorI2RlZmluZSBfX05SX2Vwb2xsX3B3YWl0CQkoX19OUl9MaW51eCArIDMxMykKIAogLyoKICAqIE9mZnNldCBvZiB0aGUgbGFzdCBMaW51eCBvMzIgZmxhdm91cmVkIHN5c2NhbGwKICAqLwotI2RlZmluZSBfX05SX0xpbnV4X3N5c2NhbGxzCQkzMTAKKyNkZWZpbmUgX19OUl9MaW51eF9zeXNjYWxscwkJMzEzCiAKICNlbmRpZiAvKiBfTUlQU19TSU0gPT0gX01JUFNfU0lNX0FCSTMyICovCiAKICNkZWZpbmUgX19OUl9PMzJfTGludXgJCQk0MDAwCi0jZGVmaW5lIF9fTlJfTzMyX0xpbnV4X3N5c2NhbGxzCQkzMTAKKyNkZWZpbmUgX19OUl9PMzJfTGludXhfc3lzY2FsbHMJCTMxMwogCiAjaWYgX01JUFNfU0lNID09IF9NSVBTX1NJTV9BQkk2NAogCkBAIC02MTgsMTYgKzYyMSwxOSBAQAogI2RlZmluZSBfX05SX21vdmVfcGFnZXMJCQkoX19OUl9MaW51eCArIDI2NykKICNkZWZpbmUgX19OUl9zZXRfcm9idXN0X2xpc3QJCShfX05SX0xpbnV4ICsgMjY4KQogI2RlZmluZSBfX05SX2dldF9yb2J1c3RfbGlzdAkJKF9fTlJfTGludXggKyAyNjkpCisjZGVmaW5lIF9fTlJfa2V4ZWNfbG9hZAkJCShfX05SX0xpbnV4ICsgMjcwKQorI2RlZmluZSBfX05SX2dldGNwdQkJCShfX05SX0xpbnV4ICsgMjcxKQorI2RlZmluZSBfX05SX2Vwb2xsX3B3YWl0CQkoX19OUl9MaW51eCArIDI3MikKIAogLyoKICAqIE9mZnNldCBvZiB0aGUgbGFzdCBMaW51eCA2NC1iaXQgZmxhdm91cmVkIHN5c2NhbGwKICAqLwotI2RlZmluZSBfX05SX0xpbnV4X3N5c2NhbGxzCQkyNjkKKyNkZWZpbmUgX19OUl9MaW51eF9zeXNjYWxscwkJMjcyCiAKICNlbmRpZiAvKiBfTUlQU19TSU0gPT0gX01JUFNfU0lNX0FCSTY0ICovCiAKICNkZWZpbmUgX19OUl82NF9MaW51eAkJCTUwMDAKLSNkZWZpbmUgX19OUl82NF9MaW51eF9zeXNjYWxscwkJMjY5CisjZGVmaW5lIF9fTlJfNjRfTGludXhfc3lzY2FsbHMJCTI3MgogCiAjaWYgX01JUFNfU0lNID09IF9NSVBTX1NJTV9OQUJJMzIKIApAQCAtOTA5LDE2ICs5MTUsMTkgQEAKICNkZWZpbmUgX19OUl9tb3ZlX3BhZ2VzCQkJKF9fTlJfTGludXggKyAyNzEpCiAjZGVmaW5lIF9fTlJfc2V0X3JvYnVzdF9saXN0CQkoX19OUl9MaW51eCArIDI3MikKICNkZWZpbmUgX19OUl9nZXRfcm9idXN0X2xpc3QJCShfX05SX0xpbnV4ICsgMjczKQorI2RlZmluZSBfX05SX2tleGVjX2xvYWQJCQkoX19OUl9MaW51eCArIDI3NCkKKyNkZWZpbmUgX19OUl9nZXRjcHUJCQkoX19OUl9MaW51eCArIDI3NSkKKyNkZWZpbmUgX19OUl9lcG9sbF9wd2FpdAkJKF9fTlJfTGludXggKyAyNzYpCiAKIC8qCiAgKiBPZmZzZXQgb2YgdGhlIGxhc3QgTjMyIGZsYXZvdXJlZCBzeXNjYWxsCiAgKi8KLSNkZWZpbmUgX19OUl9MaW51eF9zeXNjYWxscwkJMjczCisjZGVmaW5lIF9fTlJfTGludXhfc3lzY2FsbHMJCTI3NgogCiAjZW5kaWYgLyogX01JUFNfU0lNID09IF9NSVBTX1NJTV9OQUJJMzIgKi8KIAogI2RlZmluZSBfX05SX04zMl9MaW51eAkJCTYwMDAKLSNkZWZpbmUgX19OUl9OMzJfTGludXhfc3lzY2FsbHMJCTI3MworI2RlZmluZSBfX05SX04zMl9MaW51eF9zeXNjYWxscwkJMjc2CiAKICNpZmRlZiBfX0tFUk5FTF9fCiAKQEAgLTExODYsNiArMTE5NSw3IEBACiAjZW5kaWYgLyogKF9NSVBTX1NJTSA9PSBfTUlQU19TSU1fTkFCSTMyKSB8fCAoX01JUFNfU0lNID09IF9NSVBTX1NJTV9BQkk2NCkgKi8KIAogCisjZGVmaW5lIF9fQVJDSF9PTUlUX0NPTVBBVF9TWVNfR0VUREVOVFM2NAogI2RlZmluZSBfX0FSQ0hfV0FOVF9JUENfUEFSU0VfVkVSU0lPTgogI2RlZmluZSBfX0FSQ0hfV0FOVF9PTERfUkVBRERJUgogI2RlZmluZSBfX0FSQ0hfV0FOVF9TWVNfQUxBUk0KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW1pcHMvdnI0MXh4L3ZyNDF4eC5oIGIvaW5jbHVkZS9hc20tbWlwcy92cjQxeHgvdnI0MXh4LmgKaW5kZXggZGQzZWIzZC4uODhiNDkyZiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tbWlwcy92cjQxeHgvdnI0MXh4LmgKKysrIGIvaW5jbHVkZS9hc20tbWlwcy92cjQxeHgvdnI0MXh4LmgKQEAgLTc1LDcgKzc1LDcgQEAKICAqIEludGVycnVwdCBDb250cm9sIFVuaXQKICAqLwogZXh0ZXJuIGludCB2cjQxeHhfc2V0X2ludGFzc2lnbih1bnNpZ25lZCBpbnQgaXJxLCB1bnNpZ25lZCBjaGFyIGludGFzc2lnbik7Ci1leHRlcm4gaW50IGNhc2NhZGVfaXJxKHVuc2lnbmVkIGludCBpcnEsIGludCAoKmdldF9pcnEpKHVuc2lnbmVkIGludCwgc3RydWN0IHB0X3JlZ3MgKikpOworZXh0ZXJuIGludCBjYXNjYWRlX2lycSh1bnNpZ25lZCBpbnQgaXJxLCBpbnQgKCpnZXRfaXJxKSh1bnNpZ25lZCBpbnQpKTsKIAogI2RlZmluZSBQSVVJTlRfQ09NTUFORAkJMHgwMDQwCiAjZGVmaW5lIFBJVUlOVF9EQVRBCQkweDAwMjAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXBvd2VycGMvYXNtLWNvbXBhdC5oIGIvaW5jbHVkZS9hc20tcG93ZXJwYy9hc20tY29tcGF0LmgKaW5kZXggOGU2NGJlMC4uYzg5YmQ1OCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tcG93ZXJwYy9hc20tY29tcGF0LmgKKysrIGIvaW5jbHVkZS9hc20tcG93ZXJwYy9hc20tY29tcGF0LmgKQEAgLTE0LDYgKzE0LDU4IEBACiAjICBkZWZpbmUgQVNNX0NPTlNUKHgpCQlfX0FTTV9DT05TVCh4KQogI2VuZGlmCiAKKworLyoKKyAqIEZlYXR1cmUgc2VjdGlvbiBjb21tb24gbWFjcm9zCisgKgorICogTm90ZSB0aGF0IHRoZSBlbnRyaWVzIG5vdyBjb250YWluIG9mZnNldHMgYmV0d2VlbiB0aGUgdGFibGUgZW50cnkKKyAqIGFuZCB0aGUgY29kZSByYXRoZXIgdGhhbiBhYnNvbHV0ZSBjb2RlIHBvaW50ZXJzIGluIG9yZGVyIHRvIGJlCisgKiB1c2VhYmxlIHdpdGggdGhlIHZkc28gc2hhcmVkIGxpYnJhcnkuIFRoZXJlIGlzIGFsc28gYW4gYXNzdW1wdGlvbgorICogdGhhdCB2YWx1ZXMgd2lsbCBiZSBuZWdhdGl2ZSwgdGhhdCBpcywgdGhlIGZpeHVwIHRhYmxlIGhhcyB0byBiZQorICogbG9jYXRlZCBhZnRlciB0aGUgY29kZSBpdCBmaXhlcyB1cC4KKyAqLworI2lmZGVmIENPTkZJR19QUEM2NAorI2lmZGVmIF9fcG93ZXJwYzY0X18KKy8qIDY0IGJpdHMga2VybmVsLCA2NCBiaXRzIGNvZGUgKi8KKyNkZWZpbmUgTUFLRV9GVFJfU0VDVElPTl9FTlRSWShtc2ssIHZhbCwgbGFiZWwsIHNlY3QpCVwKKzk5OgkJCQkJCQlcCisJLnNlY3Rpb24gc2VjdCwiYSI7CQkJCVwKKwkuYWxpZ24gMzsJCQkJCVwKKzk4OgkJCQkJCSAgICAgICAJXAorCS5sbG9uZyBtc2s7CQkJCQlcCisJLmxsb25nIHZhbDsJCQkJCVwKKwkubGxvbmcgbGFiZWwjI2ItOThiOwkJCQlcCisJLmxsb25nIDk5Yi05OGI7CQkgCQkJXAorCS5wcmV2aW91cworI2Vsc2UgLyogX19wb3dlcnBjNjRfXyAqLworLyogNjQgYml0cyBrZXJuZWwsIDMyIGJpdHMgY29kZSAoaWUuIHZkc28zMikgKi8KKyNkZWZpbmUgTUFLRV9GVFJfU0VDVElPTl9FTlRSWShtc2ssIHZhbCwgbGFiZWwsIHNlY3QpCVwKKzk5OgkJCQkJCQlcCisJLnNlY3Rpb24gc2VjdCwiYSI7CQkJCVwKKwkuYWxpZ24gMzsJCQkJCVwKKzk4OgkJCQkJCSAgICAgICAJXAorCS5sbG9uZyBtc2s7CQkJCQlcCisJLmxsb25nIHZhbDsJCQkJCVwKKwkubG9uZyAweGZmZmZmZmZmOyAgICAgIAkJCQlcCisJLmxvbmcgbGFiZWwjI2ItOThiOwkJCQlcCisJLmxvbmcgMHhmZmZmZmZmZjsJICAgICAgIAkJCVwKKwkubG9uZyA5OWItOThiOwkJIAkJCVwKKwkucHJldmlvdXMKKyNlbmRpZiAvKiAhX19wb3dlcnBjNjRfXyAqLworI2Vsc2UgLyogQ09ORklHX1BQQzY0ICovCisvKiAzMiBiaXRzIGtlcm5lbCwgMzIgYml0cyBjb2RlICovCisjZGVmaW5lIE1BS0VfRlRSX1NFQ1RJT05fRU5UUlkobXNrLCB2YWwsIGxhYmVsLCBzZWN0KQlcCis5OToJCQkJCQkgICAgICAgCVwKKwkuc2VjdGlvbiBzZWN0LCJhIjsJCQkgICAgICAgCVwKKwkuYWxpZ24gMjsJCQkJICAgICAgIAlcCis5ODoJCQkJCQkgICAgICAgCVwKKwkubG9uZyBtc2s7CQkJCSAgICAgICAJXAorCS5sb25nIHZhbDsJCQkJICAgICAgIAlcCisJLmxvbmcgbGFiZWwjI2ItOThiOwkJCSAgICAgICAJXAorCS5sb25nIDk5Yi05OGI7CQkJCSAgICAgICAJXAorCS5wcmV2aW91cworI2VuZGlmIC8qICFDT05GSUdfUFBDNjQgKi8KKwogI2lmZGVmIF9fcG93ZXJwYzY0X18KIAogLyogb3BlcmF0aW9ucyBmb3IgbG9uZ3MgYW5kIHBvaW50ZXJzICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1wb3dlcnBjL2NwdXRhYmxlLmggYi9pbmNsdWRlL2FzbS1wb3dlcnBjL2NwdXRhYmxlLmgKaW5kZXggMTI3MDdhYi4uYTlhNDAxNCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tcG93ZXJwYy9jcHV0YWJsZS5oCisrKyBiL2luY2x1ZGUvYXNtLXBvd2VycGMvY3B1dGFibGUuaApAQCAtODksOCArODksMTEgQEAKIAogZXh0ZXJuIHN0cnVjdCBjcHVfc3BlYwkJKmN1cl9jcHVfc3BlYzsKIAotZXh0ZXJuIHZvaWQgaWRlbnRpZnlfY3B1KHVuc2lnbmVkIGxvbmcgb2Zmc2V0LCB1bnNpZ25lZCBsb25nIGNwdSk7Ci1leHRlcm4gdm9pZCBkb19jcHVfZnRyX2ZpeHVwcyh1bnNpZ25lZCBsb25nIG9mZnNldCk7CitleHRlcm4gdW5zaWduZWQgaW50IF9fc3RhcnRfX19mdHJfZml4dXAsIF9fc3RvcF9fX2Z0cl9maXh1cDsKKworZXh0ZXJuIHN0cnVjdCBjcHVfc3BlYyAqaWRlbnRpZnlfY3B1KHVuc2lnbmVkIGxvbmcgb2Zmc2V0KTsKK2V4dGVybiB2b2lkIGRvX2ZlYXR1cmVfZml4dXBzKHVuc2lnbmVkIGxvbmcgdmFsdWUsIHZvaWQgKmZpeHVwX3N0YXJ0LAorCQkJICAgICAgdm9pZCAqZml4dXBfZW5kKTsKIAogI2VuZGlmIC8qIF9fQVNTRU1CTFlfXyAqLwogCkBAIC0xNDQsNiArMTQ3LDcgQEAKICNkZWZpbmUgQ1BVX0ZUUl9DSV9MQVJHRV9QQUdFCQlMT05HX0FTTV9DT05TVCgweDAwMDAxMDAwMDAwMDAwMDApCiAjZGVmaW5lIENQVV9GVFJfUEFVU0VfWkVSTwkJTE9OR19BU01fQ09OU1QoMHgwMDAwMjAwMDAwMDAwMDAwKQogI2RlZmluZSBDUFVfRlRSX1BVUlIJCQlMT05HX0FTTV9DT05TVCgweDAwMDA0MDAwMDAwMDAwMDApCisjZGVmaW5lIENQVV9GVFJfQ0VMTF9UQl9CVUcJCUxPTkdfQVNNX0NPTlNUKDB4MDAwMDgwMDAwMDAwMDAwMCkKIAogI2lmbmRlZiBfX0FTU0VNQkxZX18KIApAQCAtMzMyLDcgKzMzNiw3IEBACiAjZGVmaW5lIENQVV9GVFJTX0NFTEwJKENQVV9GVFJfU1BMSVRfSURfQ0FDSEUgfCBDUFVfRlRSX1VTRV9UQiB8IFwKIAkgICAgQ1BVX0ZUUl9IUFRFX1RBQkxFIHwgQ1BVX0ZUUl9QUENBU19BUkNIX1YyIHwgQ1BVX0ZUUl9DVFJMIHwgXAogCSAgICBDUFVfRlRSX0FMVElWRUNfQ09NUCB8IENQVV9GVFJfTU1DUkEgfCBDUFVfRlRSX1NNVCB8IFwKLQkgICAgQ1BVX0ZUUl9QQVVTRV9aRVJPIHwgQ1BVX0ZUUl9DSV9MQVJHRV9QQUdFKQorCSAgICBDUFVfRlRSX1BBVVNFX1pFUk8gfCBDUFVfRlRSX0NJX0xBUkdFX1BBR0UgfCBDUFVfRlRSX0NFTExfVEJfQlVHKQogI2RlZmluZSBDUFVfRlRSU19QQTZUIChDUFVfRlRSX1NQTElUX0lEX0NBQ0hFIHwgQ1BVX0ZUUl9VU0VfVEIgfCBcCiAJICAgIENQVV9GVFJfSFBURV9UQUJMRSB8IENQVV9GVFJfUFBDQVNfQVJDSF9WMiB8IFwKIAkgICAgQ1BVX0ZUUl9BTFRJVkVDX0NPTVAgfCBDUFVfRlRSX0NJX0xBUkdFX1BBR0UgfCBcCkBAIC00MzEsMjkgKzQzNSwxMiBAQAogCiAjaWZkZWYgX19BU1NFTUJMWV9fCiAKLSNkZWZpbmUgQkVHSU5fRlRSX1NFQ1RJT04JCTk4OgotCi0jaWZuZGVmIF9fcG93ZXJwYzY0X18KKyNkZWZpbmUgQkVHSU5fRlRSX1NFQ1RJT05fTkVTVEVEKGxhYmVsKQlsYWJlbDoKKyNkZWZpbmUgQkVHSU5fRlRSX1NFQ1RJT04JCUJFR0lOX0ZUUl9TRUNUSU9OX05FU1RFRCg5NykKKyNkZWZpbmUgRU5EX0ZUUl9TRUNUSU9OX05FU1RFRChtc2ssIHZhbCwgbGFiZWwpIFwKKwlNQUtFX0ZUUl9TRUNUSU9OX0VOVFJZKG1zaywgdmFsLCBsYWJlbCwgX19mdHJfZml4dXApCiAjZGVmaW5lIEVORF9GVFJfU0VDVElPTihtc2ssIHZhbCkJCVwKLTk5OgkJCQkJCVwKLQkuc2VjdGlvbiBfX2Z0cl9maXh1cCwiYSI7CQlcCi0JLmFsaWduIDI7CQkJCVwKLQkubG9uZyBtc2s7CQkJCVwKLQkubG9uZyB2YWw7CQkJCVwKLQkubG9uZyA5OGI7CQkJCVwKLQkubG9uZyA5OWI7CQkJCVwKLQkucHJldmlvdXMKLSNlbHNlIC8qIF9fcG93ZXJwYzY0X18gKi8KLSNkZWZpbmUgRU5EX0ZUUl9TRUNUSU9OKG1zaywgdmFsKQkJXAotOTk6CQkJCQkJXAotCS5zZWN0aW9uIF9fZnRyX2ZpeHVwLCJhIjsJCVwKLQkuYWxpZ24gMzsJCQkJXAotCS5sbG9uZyBtc2s7CQkJCVwKLQkubGxvbmcgdmFsOwkJCQlcCi0JLmxsb25nIDk4YjsJCQkJXAotCS5sbG9uZyA5OWI7CSAJCQlcCi0JLnByZXZpb3VzCi0jZW5kaWYgLyogX19wb3dlcnBjNjRfXyAqLworCUVORF9GVFJfU0VDVElPTl9ORVNURUQobXNrLCB2YWwsIDk3KQogCiAjZGVmaW5lIEVORF9GVFJfU0VDVElPTl9JRlNFVChtc2spCUVORF9GVFJfU0VDVElPTigobXNrKSwgKG1zaykpCiAjZGVmaW5lIEVORF9GVFJfU0VDVElPTl9JRkNMUihtc2spCUVORF9GVFJfU0VDVElPTigobXNrKSwgMCkKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXBvd2VycGMvY3VycmVudC5oIGIvaW5jbHVkZS9hc20tcG93ZXJwYy9jdXJyZW50LmgKaW5kZXggMTkzOGQ2YWIuLmI4NzA4YWUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXBvd2VycGMvY3VycmVudC5oCisrKyBiL2luY2x1ZGUvYXNtLXBvd2VycGMvY3VycmVudC5oCkBAIC0xNCw3ICsxNCwxNyBAQAogI2lmZGVmIF9fcG93ZXJwYzY0X18KICNpbmNsdWRlIDxhc20vcGFjYS5oPgogCi0jZGVmaW5lIGN1cnJlbnQJCShnZXRfcGFjYSgpLT5fX2N1cnJlbnQpCitzdGF0aWMgaW5saW5lIHN0cnVjdCB0YXNrX3N0cnVjdCAqZ2V0X2N1cnJlbnQodm9pZCkKK3sKKwlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2s7CisKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXygibGQgJTAsJTEoMTMpIgorCTogIj1yIiAodGFzaykKKwk6ICJpIiAob2Zmc2V0b2Yoc3RydWN0IHBhY2Ffc3RydWN0LCBfX2N1cnJlbnQpKSk7CisKKwlyZXR1cm4gdGFzazsKK30KKyNkZWZpbmUgY3VycmVudAlnZXRfY3VycmVudCgpCiAKICNlbHNlCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXBvd2VycGMvZmlybXdhcmUuaCBiL2luY2x1ZGUvYXNtLXBvd2VycGMvZmlybXdhcmUuaAppbmRleCAxMDIyNzM3Li5mZGY5YWZmIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1wb3dlcnBjL2Zpcm13YXJlLmgKKysrIGIvaW5jbHVkZS9hc20tcG93ZXJwYy9maXJtd2FyZS5oCkBAIC05NiwxOSArOTYsMTYgQEAKIC8qIFRoaXMgaXMgdHJ1ZSBpZiB3ZSBhcmUgdXNpbmcgdGhlIGZpcm13YXJlIE5NSSBoYW5kbGVyICh0eXBpY2FsbHkgTFBBUikgKi8KIGV4dGVybiBpbnQgZndubWlfYWN0aXZlOwogCitleHRlcm4gdW5zaWduZWQgaW50IF9fc3RhcnRfX19md19mdHJfZml4dXAsIF9fc3RvcF9fX2Z3X2Z0cl9maXh1cDsKKwogI2Vsc2UgLyogX19BU1NFTUJMWV9fICovCiAKLSNkZWZpbmUgQkVHSU5fRldfRlRSX1NFQ1RJT04JCTk2OgotCisjZGVmaW5lIEJFR0lOX0ZXX0ZUUl9TRUNUSU9OX05FU1RFRChsYWJlbCkJbGFiZWw6CisjZGVmaW5lIEJFR0lOX0ZXX0ZUUl9TRUNUSU9OCQkJQkVHSU5fRldfRlRSX1NFQ1RJT05fTkVTVEVEKDk3KQorI2RlZmluZSBFTkRfRldfRlRSX1NFQ1RJT05fTkVTVEVEKG1zaywgdmFsLCBsYWJlbCkgXAorCU1BS0VfRlRSX1NFQ1RJT05fRU5UUlkobXNrLCB2YWwsIGxhYmVsLCBfX2Z3X2Z0cl9maXh1cCkKICNkZWZpbmUgRU5EX0ZXX0ZUUl9TRUNUSU9OKG1zaywgdmFsKQkJXAotOTc6CQkJCQkJXAotCS5zZWN0aW9uIF9fZndfZnRyX2ZpeHVwLCJhIjsJCVwKLQkuYWxpZ24gMzsJCQkJXAotCS5sbG9uZyBtc2s7CQkJCVwKLQkubGxvbmcgdmFsOwkJCQlcCi0JLmxsb25nIDk2YjsJCQkJXAotCS5sbG9uZyA5N2I7CQkJCVwKLQkucHJldmlvdXMKKwlFTkRfRldfRlRSX1NFQ1RJT05fTkVTVEVEKG1zaywgdmFsLCA5NykKIAogI2RlZmluZSBFTkRfRldfRlRSX1NFQ1RJT05fSUZTRVQobXNrKQlFTkRfRldfRlRSX1NFQ1RJT04oKG1zayksIChtc2spKQogI2RlZmluZSBFTkRfRldfRlRSX1NFQ1RJT05fSUZDTFIobXNrKQlFTkRfRldfRlRSX1NFQ1RJT04oKG1zayksIDApCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1wb3dlcnBjL2k4MjU5LmggYi9pbmNsdWRlL2FzbS1wb3dlcnBjL2k4MjU5LmgKaW5kZXggNzg0ODlmYi4uZGIxMzYyZiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tcG93ZXJwYy9pODI1OS5oCisrKyBiL2luY2x1ZGUvYXNtLXBvd2VycGMvaTgyNTkuaApAQCAtNyw2ICs3LDcgQEAKICNpZmRlZiBDT05GSUdfUFBDX01FUkdFCiBleHRlcm4gdm9pZCBpODI1OV9pbml0KHN0cnVjdCBkZXZpY2Vfbm9kZSAqbm9kZSwgdW5zaWduZWQgbG9uZyBpbnRhY2tfYWRkcik7CiBleHRlcm4gdW5zaWduZWQgaW50IGk4MjU5X2lycSh2b2lkKTsKK2V4dGVybiBzdHJ1Y3QgaXJxX2hvc3QgKmk4MjU5X2dldF9ob3N0KHZvaWQpOwogI2Vsc2UKIGV4dGVybiB2b2lkIGk4MjU5X2luaXQodW5zaWduZWQgbG9uZyBpbnRhY2tfYWRkciwgaW50IG9mZnNldCk7CiBleHRlcm4gaW50IGk4MjU5X2lycSh2b2lkKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXBvd2VycGMvaW8uaCBiL2luY2x1ZGUvYXNtLXBvd2VycGMvaW8uaAppbmRleCBjYmJkOGM2Li5jMmM1ZjE0IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1wb3dlcnBjL2lvLmgKKysrIGIvaW5jbHVkZS9hc20tcG93ZXJwYy9pby5oCkBAIC0xNjMsOCArMTYzLDExIEBACiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBtbWlvd2Iodm9pZCkKIHsKLQlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoInN5bmMiIDogOiA6ICJtZW1vcnkiKTsKLQlnZXRfcGFjYSgpLT5pb19zeW5jID0gMDsKKwl1bnNpZ25lZCBsb25nIHRtcDsKKworCV9fYXNtX18gX192b2xhdGlsZV9fKCJzeW5jOyBsaSAlMCwwOyBzdGIgJTAsJTEoMTMpIgorCTogIj0mciIgKHRtcCkgOiAiaSIgKG9mZnNldG9mKHN0cnVjdCBwYWNhX3N0cnVjdCwgaW9fc3luYykpCisJOiAibWVtb3J5Iik7CiB9CiAKIC8qCkBAIC00MDQsMzIgKzQwNyw2IEBACiAKICNpbmNsdWRlIDxhc20vZWVoLmg+CiAKLS8qKgotICoJY2hlY2tfc2lnbmF0dXJlCQktCWZpbmQgQklPUyBzaWduYXR1cmVzCi0gKglAaW9fYWRkcjogbW1pbyBhZGRyZXNzIHRvIGNoZWNrCi0gKglAc2lnbmF0dXJlOiAgc2lnbmF0dXJlIGJsb2NrCi0gKglAbGVuZ3RoOiBsZW5ndGggb2Ygc2lnbmF0dXJlCi0gKgotICoJUGVyZm9ybSBhIHNpZ25hdHVyZSBjb21wYXJpc29uIHdpdGggdGhlIG1taW8gYWRkcmVzcyBpb19hZGRyLiBUaGlzCi0gKglhZGRyZXNzIHNob3VsZCBoYXZlIGJlZW4gb2J0YWluZWQgYnkgaW9yZW1hcC4KLSAqCVJldHVybnMgMSBvbiBhIG1hdGNoLgotICovCi1zdGF0aWMgaW5saW5lIGludCBjaGVja19zaWduYXR1cmUoY29uc3Qgdm9sYXRpbGUgdm9pZCBfX2lvbWVtICogaW9fYWRkciwKLQljb25zdCB1bnNpZ25lZCBjaGFyICpzaWduYXR1cmUsIGludCBsZW5ndGgpCi17Ci0JaW50IHJldHZhbCA9IDA7Ci0JZG8gewotCQlpZiAocmVhZGIoaW9fYWRkcikgIT0gKnNpZ25hdHVyZSkKLQkJCWdvdG8gb3V0OwotCQlpb19hZGRyKys7Ci0JCXNpZ25hdHVyZSsrOwotCQlsZW5ndGgtLTsKLQl9IHdoaWxlIChsZW5ndGgpOwotCXJldHZhbCA9IDE7Ci1vdXQ6Ci0JcmV0dXJuIHJldHZhbDsKLX0KLQogLyogTm90aGluZyB0byBkbyAqLwogCiAjZGVmaW5lIGRtYV9jYWNoZV9pbnYoX3N0YXJ0LF9zaXplKQkJZG8geyB9IHdoaWxlICgwKQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tcG93ZXJwYy9pb21tdS5oIGIvaW5jbHVkZS9hc20tcG93ZXJwYy9pb21tdS5oCmluZGV4IGE1ZTk4NjQuLjM5ZmFkNjggMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXBvd2VycGMvaW9tbXUuaAorKysgYi9pbmNsdWRlL2FzbS1wb3dlcnBjL2lvbW11LmgKQEAgLTIyLDE3ICsyMiwzNSBAQAogI2RlZmluZSBfQVNNX0lPTU1VX0gKICNpZmRlZiBfX0tFUk5FTF9fCiAKLSNpbmNsdWRlIDxhc20vdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9jb21waWxlci5oPgogI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CiAjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KKyNpbmNsdWRlIDxhc20vdHlwZXMuaD4KKyNpbmNsdWRlIDxhc20vYml0b3BzLmg+CisKKyNkZWZpbmUgSU9NTVVfUEFHRV9TSElGVCAgICAgIDEyCisjZGVmaW5lIElPTU1VX1BBR0VfU0laRSAgICAgICAoQVNNX0NPTlNUKDEpIDw8IElPTU1VX1BBR0VfU0hJRlQpCisjZGVmaW5lIElPTU1VX1BBR0VfTUFTSyAgICAgICAofigoMSA8PCBJT01NVV9QQUdFX1NISUZUKSAtIDEpKQorI2RlZmluZSBJT01NVV9QQUdFX0FMSUdOKGFkZHIpIF9BTElHTl9VUChhZGRyLCBJT01NVV9QQUdFX1NJWkUpCisKKyNpZm5kZWYgX19BU1NFTUJMWV9fCisKKy8qIFB1cmUgMl5uIHZlcnNpb24gb2YgZ2V0X29yZGVyICovCitzdGF0aWMgX19pbmxpbmVfXyBfX2F0dHJpYnV0ZV9jb25zdF9fIGludCBnZXRfaW9tbXVfb3JkZXIodW5zaWduZWQgbG9uZyBzaXplKQoreworCXJldHVybiBfX2lsb2cyKChzaXplIC0gMSkgPj4gSU9NTVVfUEFHRV9TSElGVCkgKyAxOworfQorCisjZW5kaWYgICAvKiBfX0FTU0VNQkxZX18gKi8KKwogCiAvKgogICogSU9NQVBfTUFYX09SREVSIGRlZmluZXMgdGhlIGxhcmdlc3QgY29udGlndW91cyBibG9jawogICogb2YgZG1hIHNwYWNlIHdlIGNhbiBnZXQuICBJT01BUF9NQVhfT1JERVIgPSAxMwogICogYWxsb3dzIHVwIHRvIDIqKjEyIHBhZ2VzICg0MDk2ICogNDA5NikgPSAxNiBNQgogICovCi0jZGVmaW5lIElPTUFQX01BWF9PUkRFUiAxMworI2RlZmluZSBJT01BUF9NQVhfT1JERVIJCTEzCiAKIHN0cnVjdCBpb21tdV90YWJsZSB7CiAJdW5zaWduZWQgbG9uZyAgaXRfYnVzbm87ICAgICAvKiBCdXMgbnVtYmVyIHRoaXMgdGFibGUgYmVsb25ncyB0byAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tcG93ZXJwYy9vcHJvZmlsZV9pbXBsLmggYi9pbmNsdWRlL2FzbS1wb3dlcnBjL29wcm9maWxlX2ltcGwuaAppbmRleCA1YjMzOTk0Li4wN2ExMGU1IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1wb3dlcnBjL29wcm9maWxlX2ltcGwuaAorKysgYi9pbmNsdWRlL2FzbS1wb3dlcnBjL29wcm9maWxlX2ltcGwuaApAQCAtNDIsNyArNDIsNyBAQAogCXZvaWQgKCpyZWdfc2V0dXApIChzdHJ1Y3Qgb3BfY291bnRlcl9jb25maWcgKiwKIAkJCSAgIHN0cnVjdCBvcF9zeXN0ZW1fY29uZmlnICosCiAJCQkgICBpbnQgbnVtX2NvdW50ZXJzKTsKLQl2b2lkICgqY3B1X3NldHVwKSAodm9pZCAqKTsKKwl2b2lkICgqY3B1X3NldHVwKSAoc3RydWN0IG9wX2NvdW50ZXJfY29uZmlnICopOwogCXZvaWQgKCpzdGFydCkgKHN0cnVjdCBvcF9jb3VudGVyX2NvbmZpZyAqKTsKIAl2b2lkICgqc3RvcCkgKHZvaWQpOwogCXZvaWQgKCpoYW5kbGVfaW50ZXJydXB0KSAoc3RydWN0IHB0X3JlZ3MgKiwKQEAgLTEyMSw3ICsxMjEsOTAgQEAKIAkJYnJlYWs7CiAJfQogfQotI2VuZGlmIC8qICFDT05GSUdfRlNMX0JPT0tFICovCisjZWxzZSAvKiBDT05GSUdfRlNMX0JPT0tFICovCitzdGF0aWMgaW5saW5lIHUzMiBnZXRfcG1sY2EoaW50IGN0cikKK3sKKwl1MzIgcG1sY2E7CisKKwlzd2l0Y2ggKGN0cikgeworCQljYXNlIDA6CisJCQlwbWxjYSA9IG1mcG1yKFBNUk5fUE1MQ0EwKTsKKwkJCWJyZWFrOworCQljYXNlIDE6CisJCQlwbWxjYSA9IG1mcG1yKFBNUk5fUE1MQ0ExKTsKKwkJCWJyZWFrOworCQljYXNlIDI6CisJCQlwbWxjYSA9IG1mcG1yKFBNUk5fUE1MQ0EyKTsKKwkJCWJyZWFrOworCQljYXNlIDM6CisJCQlwbWxjYSA9IG1mcG1yKFBNUk5fUE1MQ0EzKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJcGFuaWMoIkJhZCBjdHIgbnVtYmVyXG4iKTsKKwl9CisKKwlyZXR1cm4gcG1sY2E7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBzZXRfcG1sY2EoaW50IGN0ciwgdTMyIHBtbGNhKQoreworCXN3aXRjaCAoY3RyKSB7CisJCWNhc2UgMDoKKwkJCW10cG1yKFBNUk5fUE1MQ0EwLCBwbWxjYSk7CisJCQlicmVhazsKKwkJY2FzZSAxOgorCQkJbXRwbXIoUE1STl9QTUxDQTEsIHBtbGNhKTsKKwkJCWJyZWFrOworCQljYXNlIDI6CisJCQltdHBtcihQTVJOX1BNTENBMiwgcG1sY2EpOworCQkJYnJlYWs7CisJCWNhc2UgMzoKKwkJCW10cG1yKFBNUk5fUE1MQ0EzLCBwbWxjYSk7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXBhbmljKCJCYWQgY3RyIG51bWJlclxuIik7CisJfQorfQorCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBjdHJfcmVhZCh1bnNpZ25lZCBpbnQgaSkKK3sKKwlzd2l0Y2goaSkgeworCQljYXNlIDA6CisJCQlyZXR1cm4gbWZwbXIoUE1STl9QTUMwKTsKKwkJY2FzZSAxOgorCQkJcmV0dXJuIG1mcG1yKFBNUk5fUE1DMSk7CisJCWNhc2UgMjoKKwkJCXJldHVybiBtZnBtcihQTVJOX1BNQzIpOworCQljYXNlIDM6CisJCQlyZXR1cm4gbWZwbXIoUE1STl9QTUMzKTsKKwkJZGVmYXVsdDoKKwkJCXJldHVybiAwOworCX0KK30KKworc3RhdGljIGlubGluZSB2b2lkIGN0cl93cml0ZSh1bnNpZ25lZCBpbnQgaSwgdW5zaWduZWQgaW50IHZhbCkKK3sKKwlzd2l0Y2goaSkgeworCQljYXNlIDA6CisJCQltdHBtcihQTVJOX1BNQzAsIHZhbCk7CisJCQlicmVhazsKKwkJY2FzZSAxOgorCQkJbXRwbXIoUE1STl9QTUMxLCB2YWwpOworCQkJYnJlYWs7CisJCWNhc2UgMjoKKwkJCW10cG1yKFBNUk5fUE1DMiwgdmFsKTsKKwkJCWJyZWFrOworCQljYXNlIDM6CisJCQltdHBtcihQTVJOX1BNQzMsIHZhbCk7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWJyZWFrOworCX0KK30KKworCisjZW5kaWYgLyogQ09ORklHX0ZTTF9CT09LRSAqLworCiAKIGV4dGVybiB2b2lkIG9wX3Bvd2VycGNfYmFja3RyYWNlKHN0cnVjdCBwdF9yZWdzICogY29uc3QgcmVncywgdW5zaWduZWQgaW50IGRlcHRoKTsKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tcG93ZXJwYy9wbWMuaCBiL2luY2x1ZGUvYXNtLXBvd2VycGMvcG1jLmgKaW5kZXggMDdkNmE0Mi4uODU4OGJlNiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tcG93ZXJwYy9wbWMuaAorKysgYi9pbmNsdWRlL2FzbS1wb3dlcnBjL3BtYy5oCkBAIC0zMiwxOCArMzIsNSBAQAogdm9pZCBwb3dlcjRfZW5hYmxlX3BtY3Modm9pZCk7CiAjZW5kaWYKIAotI2lmZGVmIENPTkZJR19GU0xfQk9PS0UKLXZvaWQgaW5pdF9wbWNfc3RvcChpbnQgY3RyKTsKLXZvaWQgc2V0X3BtY19ldmVudChpbnQgY3RyLCBpbnQgZXZlbnQpOwotdm9pZCBzZXRfcG1jX3VzZXJfa2VybmVsKGludCBjdHIsIGludCB1c2VyLCBpbnQga2VybmVsKTsKLXZvaWQgc2V0X3BtY19tYXJrZWQoaW50IGN0ciwgaW50IG1hcmswLCBpbnQgbWFyazEpOwotdm9pZCBwbWNfc3RhcnRfY3RyKGludCBjdHIsIGludCBlbmFibGUpOwotdm9pZCBwbWNfc3RhcnRfY3RycyhpbnQgZW5hYmxlKTsKLXZvaWQgcG1jX3N0b3BfY3Rycyh2b2lkKTsKLXZvaWQgZHVtcF9wbWNzKHZvaWQpOwotCi1leHRlcm4gc3RydWN0IG9wX3Bvd2VycGNfbW9kZWwgb3BfbW9kZWxfZnNsX2Jvb2tlOwotI2VuZGlmCi0KICNlbmRpZiAvKiBfX0tFUk5FTF9fICovCiAjZW5kaWYgLyogX1BPV0VSUENfUE1DX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXBvd2VycGMvcHBjX2FzbS5oIGIvaW5jbHVkZS9hc20tcG93ZXJwYy9wcGNfYXNtLmgKaW5kZXggYTk0MGNmZS4uZmEwODNkOCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tcG93ZXJwYy9wcGNfYXNtLmgKKysrIGIvaW5jbHVkZS9hc20tcG93ZXJwYy9wcGNfYXNtLmgKQEAgLTMwLDkgKzMwLDkgQEAKIAltZnNwcglyYSxTUFJOX1BVUlI7CQkvKiBnZXQgcHJvY2Vzc29yIHV0aWwuIHJlZyAqLwlcCiBFTkRfRlRSX1NFQ1RJT05fSUZTRVQoQ1BVX0ZUUl9QVVJSKTsJCQkJCVwKIEJFR0lOX0ZUUl9TRUNUSU9OOwkJCQkJCQlcCi0JbWZ0YglyYTsJCQkvKiBvciBnZXQgVEIgaWYgbm8gUFVSUiAqLwlcCisJTUZUQihyYSk7CQkJLyogb3IgZ2V0IFRCIGlmIG5vIFBVUlIgKi8JXAogRU5EX0ZUUl9TRUNUSU9OX0lGQ0xSKENQVV9GVFJfUFVSUik7CQkJCQlcCi0JbGQJcmIsUEFDQV9TVEFSVFBVUlIocjEzKTsJCQkJXAorCWxkCXJiLFBBQ0FfU1RBUlRQVVJSKHIxMyk7CQkJCQlcCiAJc3RkCXJhLFBBQ0FfU1RBUlRQVVJSKHIxMyk7CQkJCQlcCiAJc3ViZglyYixyYixyYTsJCS8qIHN1YnRyYWN0IHN0YXJ0IHZhbHVlICovCVwKIAlsZAlyYSxQQUNBX1VTRVJfVElNRShyMTMpOwkJCQkJXApAQCAtNDUsOSArNDUsOSBAQAogCW1mc3ByCXJhLFNQUk5fUFVSUjsJCS8qIGdldCBwcm9jZXNzb3IgdXRpbC4gcmVnICovCVwKIEVORF9GVFJfU0VDVElPTl9JRlNFVChDUFVfRlRSX1BVUlIpOwkJCQkJXAogQkVHSU5fRlRSX1NFQ1RJT047CQkJCQkJCVwKLQltZnRiCXJhOwkJCS8qIG9yIGdldCBUQiBpZiBubyBQVVJSICovCVwKKwlNRlRCKHJhKTsJCQkvKiBvciBnZXQgVEIgaWYgbm8gUFVSUiAqLwlcCiBFTkRfRlRSX1NFQ1RJT05fSUZDTFIoQ1BVX0ZUUl9QVVJSKTsJCQkJCVwKLQlsZAlyYixQQUNBX1NUQVJUUFVSUihyMTMpOwkJCQlcCisJbGQJcmIsUEFDQV9TVEFSVFBVUlIocjEzKTsJCQkJCVwKIAlzdGQJcmEsUEFDQV9TVEFSVFBVUlIocjEzKTsJCQkJCVwKIAlzdWJmCXJiLHJiLHJhOwkJLyogc3VidHJhY3Qgc3RhcnQgdmFsdWUgKi8JXAogCWxkCXJhLFBBQ0FfU1lTVEVNX1RJTUUocjEzKTsJCQkJXApAQCAtMjc0LDYgKzI3NCwxNiBAQAogI2RlZmluZSBJU1lOQ182MDEKICNlbmRpZgogCisjaWZkZWYgQ09ORklHX1BQQ19DRUxMCisjZGVmaW5lIE1GVEIoZGVzdCkJCQlcCis5MDoJbWZ0YiAgZGVzdDsJCQlcCitCRUdJTl9GVFJfU0VDVElPTl9ORVNURUQoOTYpOwkJXAorCWNtcHdpIGRlc3QsMDsJCQlcCisJYmVxLSAgOTBiOwkJCVwKK0VORF9GVFJfU0VDVElPTl9ORVNURUQoQ1BVX0ZUUl9DRUxMX1RCX0JVRywgQ1BVX0ZUUl9DRUxMX1RCX0JVRywgOTYpCisjZWxzZQorI2RlZmluZSBNRlRCKGRlc3QpCQkJbWZ0YiBkZXN0CisjZW5kaWYKIAogI2lmbmRlZiBDT05GSUdfU01QCiAjZGVmaW5lIFRMQlNZTkMKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXBvd2VycGMvcHJvbS5oIGIvaW5jbHVkZS9hc20tcG93ZXJwYy9wcm9tLmgKaW5kZXggNTI0NjI5Ny4uZWMxMWQ0NCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tcG93ZXJwYy9wcm9tLmgKKysrIGIvaW5jbHVkZS9hc20tcG93ZXJwYy9wcm9tLmgKQEAgLTEzNCw3ICsxMzQsNyBAQAogZXh0ZXJuIHN0cnVjdCBkZXZpY2Vfbm9kZSAqb2ZfZ2V0X3BhcmVudChjb25zdCBzdHJ1Y3QgZGV2aWNlX25vZGUgKm5vZGUpOwogZXh0ZXJuIHN0cnVjdCBkZXZpY2Vfbm9kZSAqb2ZfZ2V0X25leHRfY2hpbGQoY29uc3Qgc3RydWN0IGRldmljZV9ub2RlICpub2RlLAogCQkJCQkgICAgIHN0cnVjdCBkZXZpY2Vfbm9kZSAqcHJldik7Ci1leHRlcm4gc3RydWN0IHByb3BlcnR5ICpvZl9maW5kX3Byb3BlcnR5KHN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAsCitleHRlcm4gc3RydWN0IHByb3BlcnR5ICpvZl9maW5kX3Byb3BlcnR5KGNvbnN0IHN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAsCiAJCQkJCSBjb25zdCBjaGFyICpuYW1lLAogCQkJCQkgaW50ICpsZW5wKTsKIGV4dGVybiBzdHJ1Y3QgZGV2aWNlX25vZGUgKm9mX25vZGVfZ2V0KHN0cnVjdCBkZXZpY2Vfbm9kZSAqbm9kZSk7CkBAIC0xNTgsMTAgKzE1OCwxMiBAQAogZXh0ZXJuIHZvaWQgZmluaXNoX2RldmljZV90cmVlKHZvaWQpOwogZXh0ZXJuIHZvaWQgdW5mbGF0dGVuX2RldmljZV90cmVlKHZvaWQpOwogZXh0ZXJuIHZvaWQgZWFybHlfaW5pdF9kZXZ0cmVlKHZvaWQgKik7Ci1leHRlcm4gaW50IGRldmljZV9pc19jb21wYXRpYmxlKHN0cnVjdCBkZXZpY2Vfbm9kZSAqZGV2aWNlLCBjb25zdCBjaGFyICopOworZXh0ZXJuIGludCBkZXZpY2VfaXNfY29tcGF0aWJsZShjb25zdCBzdHJ1Y3QgZGV2aWNlX25vZGUgKmRldmljZSwKKwkJCQljb25zdCBjaGFyICopOwogZXh0ZXJuIGludCBtYWNoaW5lX2lzX2NvbXBhdGlibGUoY29uc3QgY2hhciAqY29tcGF0KTsKLWV4dGVybiBjb25zdCB2b2lkICpnZXRfcHJvcGVydHkoc3RydWN0IGRldmljZV9ub2RlICpub2RlLCBjb25zdCBjaGFyICpuYW1lLAotCQlpbnQgKmxlbnApOworZXh0ZXJuIGNvbnN0IHZvaWQgKmdldF9wcm9wZXJ0eShjb25zdCBzdHJ1Y3QgZGV2aWNlX25vZGUgKm5vZGUsCisJCQkJY29uc3QgY2hhciAqbmFtZSwKKwkJCQlpbnQgKmxlbnApOwogZXh0ZXJuIHZvaWQgcHJpbnRfcHJvcGVydGllcyhzdHJ1Y3QgZGV2aWNlX25vZGUgKm5vZGUpOwogZXh0ZXJuIGludCBwcm9tX25fYWRkcl9jZWxscyhzdHJ1Y3QgZGV2aWNlX25vZGUqIG5wKTsKIGV4dGVybiBpbnQgcHJvbV9uX3NpemVfY2VsbHMoc3RydWN0IGRldmljZV9ub2RlKiBucCk7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1wb3dlcnBjL3JlZy5oIGIvaW5jbHVkZS9hc20tcG93ZXJwYy9yZWcuaAppbmRleCA4ZmI5NjgxLi42ZmFhZTdiIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1wb3dlcnBjL3JlZy5oCisrKyBiL2luY2x1ZGUvYXNtLXBvd2VycGMvcmVnLmgKQEAgLTU5MSw2ICs1OTEsNyBAQAogI2RlZmluZSBQVl82MzAJCTB4MDA0MAogI2RlZmluZSBQVl82MzBwCTB4MDA0MQogI2RlZmluZSBQVl85NzBNUAkweDAwNDQKKyNkZWZpbmUgUFZfOTcwR1gJMHgwMDQ1CiAjZGVmaW5lIFBWX0JFCQkweDAwNzAKICNkZWZpbmUgUFZfUEE2VAkJMHgwMDkwCiAKQEAgLTYxOCwxMCArNjE5LDM1IEBACiAJCQkJOiAiPXIiIChydmFsKSk7IHJ2YWw7fSkKICNkZWZpbmUgbXRzcHIocm4sIHYpCWFzbSB2b2xhdGlsZSgibXRzcHIgIiBfX3N0cmluZ2lmeShybikgIiwlMCIgOiA6ICJyIiAodikpCiAKKyNpZmRlZiBfX3Bvd2VycGM2NF9fCisjaWZkZWYgQ09ORklHX1BQQ19DRUxMCisjZGVmaW5lIG1mdGIoKQkJKHt1bnNpZ25lZCBsb25nIHJ2YWw7CQkJCVwKKwkJCWFzbSB2b2xhdGlsZSgJCQkJCVwKKwkJCQkiOTA6CW1mdGIgJTA7XG4iCQkJXAorCQkJCSI5NzoJY21wd2kgJTAsMDtcbiIJCQlcCisJCQkJIgliZXEtIDkwYjtcbiIJCQlcCisJCQkJIjk5OlxuIgkJCQkJXAorCQkJCSIuc2VjdGlvbiBfX2Z0cl9maXh1cCxcImFcIlxuIgkJXAorCQkJCSIuYWxpZ24gM1xuIgkJCQlcCisJCQkJIjk4OlxuIgkJCQkJXAorCQkJCSIJLmxsb25nICUxXG4iCQkJXAorCQkJCSIJLmxsb25nICUxXG4iCQkJXAorCQkJCSIJLmxsb25nIDk3Yi05OGJcbiIJCVwKKwkJCQkiCS5sbG9uZyA5OWItOThiXG4iCQlcCisJCQkJIi5wcmV2aW91cyIJCQkJXAorCQkJOiAiPXIiIChydmFsKSA6ICJpIiAoQ1BVX0ZUUl9DRUxMX1RCX0JVRykpOyBydmFsO30pCisjZWxzZQogI2RlZmluZSBtZnRiKCkJCSh7dW5zaWduZWQgbG9uZyBydmFsOwlcCiAJCQlhc20gdm9sYXRpbGUoIm1mdGIgJTAiIDogIj1yIiAocnZhbCkpOyBydmFsO30pCisjZW5kaWYgLyogIUNPTkZJR19QUENfQ0VMTCAqLworCisjZWxzZSAvKiBfX3Bvd2VycGM2NF9fICovCisKICNkZWZpbmUgbWZ0YmwoKQkJKHt1bnNpZ25lZCBsb25nIHJ2YWw7CVwKIAkJCWFzbSB2b2xhdGlsZSgibWZ0YmwgJTAiIDogIj1yIiAocnZhbCkpOyBydmFsO30pCisjZGVmaW5lIG1mdGJ1KCkJCSh7dW5zaWduZWQgbG9uZyBydmFsOwlcCisJCQlhc20gdm9sYXRpbGUoIm1mdGJ1ICUwIiA6ICI9ciIgKHJ2YWwpKTsgcnZhbDt9KQorI2VuZGlmIC8qICFfX3Bvd2VycGM2NF9fICovCiAKICNkZWZpbmUgbXR0YmwodikJYXNtIHZvbGF0aWxlKCJtdHRibCAlMCI6OiAiciIodikpCiAjZGVmaW5lIG10dGJ1KHYpCWFzbSB2b2xhdGlsZSgibXR0YnUgJTAiOjogInIiKHYpKQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tcG93ZXJwYy9zeXN0YmwuaCBiL2luY2x1ZGUvYXNtLXBvd2VycGMvc3lzdGJsLmgKaW5kZXggZWFjODVjZS4uOTdiNDM1NCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tcG93ZXJwYy9zeXN0YmwuaAorKysgYi9pbmNsdWRlL2FzbS1wb3dlcnBjL3N5c3RibC5oCkBAIC0yNjEsNyArMjYxLDcgQEAKIFBQQ19TWVNfU1BVKHJ0YXMpCiBPTERTWVMoZGVidWdfc2V0Y29udGV4dCkKIFNZU0NBTEwobmlfc3lzY2FsbCkKLVNZU0NBTEwobmlfc3lzY2FsbCkKK0NPTVBBVF9TWVMobWlncmF0ZV9wYWdlcykKIENPTVBBVF9TWVMobWJpbmQpCiBDT01QQVRfU1lTKGdldF9tZW1wb2xpY3kpCiBDT01QQVRfU1lTKHNldF9tZW1wb2xpY3kpCkBAIC0zMDQsMyArMzA0LDQgQEAKIFNZU0NBTExfU1BVKGZhY2Nlc3NhdCkKIENPTVBBVF9TWVNfU1BVKGdldF9yb2J1c3RfbGlzdCkKIENPTVBBVF9TWVNfU1BVKHNldF9yb2J1c3RfbGlzdCkKK0NPTVBBVF9TWVMobW92ZV9wYWdlcykKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXBvd2VycGMvc3lzdGVtLmggYi9pbmNsdWRlL2FzbS1wb3dlcnBjL3N5c3RlbS5oCmluZGV4IDQzNjI3NTkuLmY3YjEyMjcgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXBvd2VycGMvc3lzdGVtLmgKKysrIGIvaW5jbHVkZS9hc20tcG93ZXJwYy9zeXN0ZW0uaApAQCAtMjUsOCArMjUsOCBAQAogICoKICAqIFdlIGhhdmUgdG8gdXNlIHRoZSBzeW5jIGluc3RydWN0aW9ucyBmb3IgbWIoKSwgc2luY2UgbHdzeW5jIGRvZXNuJ3QKICAqIG9yZGVyIGxvYWRzIHdpdGggcmVzcGVjdCB0byBwcmV2aW91cyBzdG9yZXMuICBMd3N5bmMgaXMgZmluZSBmb3IKLSAqIHJtYigpLCB0aG91Z2guICBOb3RlIHRoYXQgbHdzeW5jIGlzIGludGVycHJldGVkIGFzIHN5bmMgYnkKLSAqIDMyLWJpdCBhbmQgb2xkZXIgNjQtYml0IENQVXMuCisgKiBybWIoKSwgdGhvdWdoLiBOb3RlIHRoYXQgcm1iKCkgYWN0dWFsbHkgdXNlcyBhIHN5bmMgb24gMzItYml0CisgKiBhcmNoaXRlY3R1cmVzLgogICoKICAqIEZvciB3bWIoKSwgd2UgdXNlIHN5bmMgc2luY2Ugd21iIGlzIHVzZWQgaW4gZHJpdmVycyB0byBvcmRlcgogICogc3RvcmVzIHRvIHN5c3RlbSBtZW1vcnkgd2l0aCByZXNwZWN0IHRvIHdyaXRlcyB0byB0aGUgZGV2aWNlLgpAQCAtMzQsNyArMzQsNyBAQAogICogU01QIHNpbmNlIGl0IGlzIG9ubHkgdXNlZCB0byBvcmRlciB1cGRhdGVzIHRvIHN5c3RlbSBtZW1vcnkuCiAgKi8KICNkZWZpbmUgbWIoKSAgIF9fYXNtX18gX192b2xhdGlsZV9fICgic3luYyIgOiA6IDogIm1lbW9yeSIpCi0jZGVmaW5lIHJtYigpICBfX2FzbV9fIF9fdm9sYXRpbGVfXyAoImx3c3luYyIgOiA6IDogIm1lbW9yeSIpCisjZGVmaW5lIHJtYigpICBfX2FzbV9fIF9fdm9sYXRpbGVfXyAoX19zdHJpbmdpZnkoTFdTWU5DKSA6IDogOiAibWVtb3J5IikKICNkZWZpbmUgd21iKCkgIF9fYXNtX18gX192b2xhdGlsZV9fICgic3luYyIgOiA6IDogIm1lbW9yeSIpCiAjZGVmaW5lIHJlYWRfYmFycmllcl9kZXBlbmRzKCkgIGRvIHsgfSB3aGlsZSgwKQogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1wb3dlcnBjL3RjZS5oIGIvaW5jbHVkZS9hc20tcG93ZXJwYy90Y2UuaAppbmRleCBjOTQ4M2FkLi5mNjYzNjM0IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1wb3dlcnBjL3RjZS5oCisrKyBiL2luY2x1ZGUvYXNtLXBvd2VycGMvdGNlLmgKQEAgLTIyLDYgKzIyLDggQEAKICNkZWZpbmUgX0FTTV9QT1dFUlBDX1RDRV9ICiAjaWZkZWYgX19LRVJORUxfXwogCisjaW5jbHVkZSA8YXNtL2lvbW11Lmg+CisKIC8qCiAgKiBUY2VzIGNvbWUgaW4gdHdvIGZvcm1hdHMsIG9uZSBmb3IgdGhlIHZpcnR1YWwgYnVzIGFuZCBhIGRpZmZlcmVudAogICogZm9ybWF0IGZvciBQQ0kKQEAgLTMzLDcgKzM1LDYgQEAKIAogI2RlZmluZSBUQ0VfU0hJRlQJMTIKICNkZWZpbmUgVENFX1BBR0VfU0laRQkoMSA8PCBUQ0VfU0hJRlQpCi0jZGVmaW5lIFRDRV9QQUdFX0ZBQ1RPUgkoUEFHRV9TSElGVCAtIFRDRV9TSElGVCkKIAogI2RlZmluZSBUQ0VfRU5UUllfU0laRQkJOAkJLyogZWFjaCBUQ0UgaXMgNjQgYml0cyAqLwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1wb3dlcnBjL3RpbWUuaCBiL2luY2x1ZGUvYXNtLXBvd2VycGMvdGltZS5oCmluZGV4IGIwNTFkNGMuLjRjZmY5NzcgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXBvd2VycGMvdGltZS5oCisrKyBiL2luY2x1ZGUvYXNtLXBvd2VycGMvdGltZS5oCkBAIC0zOSwxMCArMzksNiBAQAogZXh0ZXJuIHZvaWQgd2FrZXVwX2RlY3JlbWVudGVyKHZvaWQpOwogZXh0ZXJuIHZvaWQgc25hcHNob3RfdGltZWJhc2Uodm9pZCk7CiAKLSNpZmRlZiBDT05GSUdfUlRDX0NMQVNTCi1leHRlcm4gaW50IF9faW5pdCBydGNfY2xhc3NfaG9va3VwKHZvaWQpOwotI2VuZGlmCi0KIC8qIFNvbWUgc2FuZSBkZWZhdWx0czogMTI1IE1IeiB0aW1lYmFzZSwgMUdIeiBwcm9jZXNzb3IgKi8KIGV4dGVybiB1bnNpZ25lZCBsb25nIHBwY19wcm9jX2ZyZXE7CiAjZGVmaW5lIERFRkFVTFRfUFJPQ19GUkVRCShERUZBVUxUX1RCX0ZSRVEgKiA4KQpAQCAtODIsMzAgKzc4LDM1IEBACiAjZGVmaW5lIF9fVVNFX1JUQygpCTAKICNlbmRpZgogCi0vKiBPbiBwcGM2NCB0aGlzIGdldHMgdXMgdGhlIHdob2xlIHRpbWViYXNlOyBvbiBwcGMzMiBqdXN0IHRoZSBsb3dlciBoYWxmICovCisjaWZkZWYgQ09ORklHX1BQQzY0CisKKy8qIEZvciBjb21wYXRpYmlsaXR5LCBnZXRfdGJsKCkgaXMgZGVmaW5lZCBhcyBnZXRfdGIoKSBvbiBwcGM2NCAqLworI2RlZmluZSBnZXRfdGJsCQlnZXRfdGIKKworI2Vsc2UKKwogc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIGdldF90Ymwodm9pZCkKIHsKLQl1bnNpZ25lZCBsb25nIHRibDsKLQogI2lmIGRlZmluZWQoQ09ORklHXzQwM0dDWCkKKwl1bnNpZ25lZCBsb25nIHRibDsKIAlhc20gdm9sYXRpbGUoIm1mc3ByICUwLCAweDNkZCIgOiAiPXIiICh0YmwpKTsKLSNlbHNlCi0JYXNtIHZvbGF0aWxlKCJtZnRiICUwIiA6ICI9ciIgKHRibCkpOwotI2VuZGlmCiAJcmV0dXJuIHRibDsKKyNlbHNlCisJcmV0dXJuIG1mdGJsKCk7CisjZW5kaWYKIH0KIAogc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgZ2V0X3RidSh2b2lkKQogeworI2lmZGVmIENPTkZJR180MDNHQ1gKIAl1bnNpZ25lZCBpbnQgdGJ1OwotCi0jaWYgZGVmaW5lZChDT05GSUdfNDAzR0NYKQogCWFzbSB2b2xhdGlsZSgibWZzcHIgJTAsIDB4M2RjIiA6ICI9ciIgKHRidSkpOwotI2Vsc2UKLQlhc20gdm9sYXRpbGUoIm1mdGJ1ICUwIiA6ICI9ciIgKHRidSkpOwotI2VuZGlmCiAJcmV0dXJuIHRidTsKKyNlbHNlCisJcmV0dXJuIG1mdGJ1KCk7CisjZW5kaWYKIH0KKyNlbmRpZiAvKiAhQ09ORklHX1BQQzY0ICovCiAKIHN0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IGdldF9ydGNsKHZvaWQpCiB7CkBAIC0xMzEsNyArMTMyLDcgQEAKIHsKIAlyZXR1cm4gbWZ0YigpOwogfQotI2Vsc2UKKyNlbHNlIC8qIENPTkZJR19QUEM2NCAqLwogc3RhdGljIGlubGluZSB1NjQgZ2V0X3RiKHZvaWQpCiB7CiAJdW5zaWduZWQgaW50IHRiaGksIHRibG8sIHRiaGkyOwpAQCAtMTQ0LDcgKzE0NSw3IEBACiAKIAlyZXR1cm4gKCh1NjQpdGJoaSA8PCAzMikgfCB0YmxvOwogfQotI2VuZGlmCisjZW5kaWYgLyogIUNPTkZJR19QUEM2NCAqLwogCiBzdGF0aWMgaW5saW5lIHZvaWQgc2V0X3RiKHVuc2lnbmVkIGludCB1cHBlciwgdW5zaWduZWQgaW50IGxvd2VyKQogewpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tcG93ZXJwYy90aW1leC5oIGIvaW5jbHVkZS9hc20tcG93ZXJwYy90aW1leC5oCmluZGV4IDNiOWE4ZTcuLjkyZGVkZGUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXBvd2VycGMvdGltZXguaAorKysgYi9pbmNsdWRlL2FzbS1wb3dlcnBjL3RpbWV4LmgKQEAgLTgsNiArOCw3IEBACiAgKi8KIAogI2luY2x1ZGUgPGFzbS9jcHV0YWJsZS5oPgorI2luY2x1ZGUgPGFzbS9yZWcuaD4KIAogI2RlZmluZSBDTE9DS19USUNLX1JBVEUJMTAyNDAwMCAvKiBVbmRlcmx5aW5nIEhaICovCiAKQEAgLTE1LDEzICsxNiwxMSBAQAogCiBzdGF0aWMgaW5saW5lIGN5Y2xlc190IGdldF9jeWNsZXModm9pZCkKIHsKKyNpZmRlZiBfX3Bvd2VycGM2NF9fCisJcmV0dXJuIG1mdGIoKTsKKyNlbHNlCiAJY3ljbGVzX3QgcmV0OwogCi0jaWZkZWYgX19wb3dlcnBjNjRfXwotCi0JX19hc21fXyBfX3ZvbGF0aWxlX18oIm1mdGIgJTAiIDogIj1yIiAocmV0KSA6ICk7Ci0KLSNlbHNlCiAJLyoKIAkgKiBGb3IgdGhlICJjeWNsZSIgY291bnRlciB3ZSB1c2UgdGhlIHRpbWViYXNlIGxvd2VyIGhhbGYuCiAJICogQ3VycmVudGx5IG9ubHkgdXNlZCBvbiBTTVAuCkBAIC0zMCwxOCArMjksMTkgQEAKIAlyZXQgPSAwOwogCiAJX19hc21fXyBfX3ZvbGF0aWxlX18oCi0JCSI5ODoJbWZ0YiAlMFxuIgorCQkiOTc6CW1mdGIgJTBcbiIKIAkJIjk5OlxuIgogCQkiLnNlY3Rpb24gX19mdHJfZml4dXAsXCJhXCJcbiIKKwkJIi5hbGlnbiAyXG4iCisJCSI5ODpcbiIKIAkJIgkubG9uZyAlMVxuIgogCQkiCS5sb25nIDBcbiIKLQkJIgkubG9uZyA5OGJcbiIKLQkJIgkubG9uZyA5OWJcbiIKKwkJIgkubG9uZyA5N2ItOThiXG4iCisJCSIJLmxvbmcgOTliLTk4YlxuIgogCQkiLnByZXZpb3VzIgogCQk6ICI9ciIgKHJldCkgOiAiaSIgKENQVV9GVFJfNjAxKSk7Ci0jZW5kaWYKLQogCXJldHVybiByZXQ7CisjZW5kaWYKIH0KIAogI2VuZGlmCS8qIF9fS0VSTkVMX18gKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXBvd2VycGMvdG9wb2xvZ3kuaCBiL2luY2x1ZGUvYXNtLXBvd2VycGMvdG9wb2xvZ3kuaAppbmRleCA4ZjdlZTE2Li45ZmU3ODk0IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1wb3dlcnBjL3RvcG9sb2d5LmgKKysrIGIvaW5jbHVkZS9hc20tcG93ZXJwYy90b3BvbG9neS5oCkBAIC05Niw3ICs5NiwxMyBAQAogCiAjaWZkZWYgQ09ORklHX1NNUAogI2luY2x1ZGUgPGFzbS9jcHV0YWJsZS5oPgotI2RlZmluZSBzbXRfY2FwYWJsZSgpIAkJKGNwdV9oYXNfZmVhdHVyZShDUFVfRlRSX1NNVCkpCisjZGVmaW5lIHNtdF9jYXBhYmxlKCkJCShjcHVfaGFzX2ZlYXR1cmUoQ1BVX0ZUUl9TTVQpKQorCisjaWZkZWYgQ09ORklHX1BQQzY0CisjaW5jbHVkZSA8YXNtL3NtcC5oPgorCisjZGVmaW5lIHRvcG9sb2d5X3RocmVhZF9zaWJsaW5ncyhjcHUpCShjcHVfc2libGluZ19tYXBbY3B1XSkKKyNlbmRpZgogI2VuZGlmCiAKICNlbmRpZiAvKiBfX0tFUk5FTF9fICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1wb3dlcnBjL3VuaXN0ZC5oIGIvaW5jbHVkZS9hc20tcG93ZXJwYy91bmlzdGQuaAppbmRleCA0NjRhNDhjLi4wZTRlYTM3IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1wb3dlcnBjL3VuaXN0ZC5oCisrKyBiL2luY2x1ZGUvYXNtLXBvd2VycGMvdW5pc3RkLmgKQEAgLTI3Niw3ICsyNzYsNyBAQAogI2RlZmluZSBfX05SX3J0YXMJCTI1NQogI2RlZmluZSBfX05SX3N5c19kZWJ1Z19zZXRjb250ZXh0IDI1NgogLyogTnVtYmVyIDI1NyBpcyByZXNlcnZlZCBmb3IgdnNlcnZlciAqLwotLyogMjU4IGN1cnJlbnRseSB1bnVzZWQgKi8KKyNkZWZpbmUgX19OUl9taWdyYXRlX3BhZ2VzCTI1OAogI2RlZmluZSBfX05SX21iaW5kCQkyNTkKICNkZWZpbmUgX19OUl9nZXRfbWVtcG9saWN5CTI2MAogI2RlZmluZSBfX05SX3NldF9tZW1wb2xpY3kJMjYxCkBAIC0zMjMsMTAgKzMyMywxMSBAQAogI2RlZmluZSBfX05SX2ZhY2Nlc3NhdAkJMjk4CiAjZGVmaW5lIF9fTlJfZ2V0X3JvYnVzdF9saXN0CTI5OQogI2RlZmluZSBfX05SX3NldF9yb2J1c3RfbGlzdAkzMDAKKyNkZWZpbmUgX19OUl9tb3ZlX3BhZ2VzCQkzMDEKIAogI2lmZGVmIF9fS0VSTkVMX18KIAotI2RlZmluZSBfX05SX3N5c2NhbGxzCQkzMDEKKyNkZWZpbmUgX19OUl9zeXNjYWxscwkJMzAyCiAKICNkZWZpbmUgX19OUl9fZXhpdCBfX05SX2V4aXQKICNkZWZpbmUgTlJfc3lzY2FsbHMJX19OUl9zeXNjYWxscwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tcHBjL2lvLmggYi9pbmNsdWRlL2FzbS1wcGMvaW8uaAppbmRleCAzZDlhOWU2Li5hNGM0MTFiIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1wcGMvaW8uaAorKysgYi9pbmNsdWRlL2FzbS1wcGMvaW8uaApAQCAtNDM5LDIyICs0MzksNiBAQAogI2RlZmluZSBpb2JhcnJpZXJfcigpICBlaWVpbygpCiAjZGVmaW5lIGlvYmFycmllcl93KCkgIGVpZWlvKCkKIAotc3RhdGljIGlubGluZSBpbnQgY2hlY2tfc2lnbmF0dXJlKHZvbGF0aWxlIHZvaWQgX19pb21lbSAqIGlvX2FkZHIsCi0JY29uc3QgdW5zaWduZWQgY2hhciAqc2lnbmF0dXJlLCBpbnQgbGVuZ3RoKQotewotCWludCByZXR2YWwgPSAwOwotCWRvIHsKLQkJaWYgKHJlYWRiKGlvX2FkZHIpICE9ICpzaWduYXR1cmUpCi0JCQlnb3RvIG91dDsKLQkJaW9fYWRkcisrOwotCQlzaWduYXR1cmUrKzsKLQkJbGVuZ3RoLS07Ci0JfSB3aGlsZSAobGVuZ3RoKTsKLQlyZXR2YWwgPSAxOwotb3V0OgotCXJldHVybiByZXR2YWw7Ci19Ci0KIC8qCiAgKiBIZXJlIGNvbWVzIHRoZSBwcGMgaW1wbGVtZW50YXRpb24gb2YgdGhlIElPTUFQIAogICogaW50ZXJmYWNlcy4KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXMzOTAvY2lvLmggYi9pbmNsdWRlL2FzbS1zMzkwL2Npby5oCmluZGV4IGRhMDYzY2QuLjgxMjg3ZDggMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXMzOTAvY2lvLmgKKysrIGIvaW5jbHVkZS9hc20tczM5MC9jaW8uaApAQCAtMjc1LDYgKzI3NSwxMiBAQAogCXUxNiBkZXZubzsKIH07CiAKK3N0YXRpYyBpbmxpbmUgaW50IGNjd19kZXZfaWRfaXNfZXF1YWwoc3RydWN0IGNjd19kZXZfaWQgKmRldl9pZDEsCisJCQkJICAgICAgc3RydWN0IGNjd19kZXZfaWQgKmRldl9pZDIpCit7CisJcmV0dXJuICFtZW1jbXAoZGV2X2lkMSwgZGV2X2lkMiwgc2l6ZW9mKHN0cnVjdCBjY3dfZGV2X2lkKSk7Cit9CisKIGV4dGVybiBpbnQgZGlhZzIxMChzdHJ1Y3QgZGlhZzIxMCAqYWRkcik7CiAKIGV4dGVybiB2b2lkIHdhaXRfY29uc19kZXYodm9pZCk7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1zMzkwL3BndGFibGUuaCBiL2luY2x1ZGUvYXNtLXMzOTAvcGd0YWJsZS5oCmluZGV4IDUxOWYwYTUuLjM2YmI2ZGEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXMzOTAvcGd0YWJsZS5oCisrKyBiL2luY2x1ZGUvYXNtLXMzOTAvcGd0YWJsZS5oCkBAIC0yMDAsMTggKzIwMCw0NSBAQAogICovCiAKIC8qIEhhcmR3YXJlIGJpdHMgaW4gdGhlIHBhZ2UgdGFibGUgZW50cnkgKi8KLSNkZWZpbmUgX1BBR0VfUk8gICAgICAgIDB4MjAwICAgICAgICAgIC8qIEhXIHJlYWQtb25seSAgICAgICAgICAgICAgICAgICAgICovCi0jZGVmaW5lIF9QQUdFX0lOVkFMSUQgICAweDQwMCAgICAgICAgICAvKiBIVyBpbnZhbGlkICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBfUEFHRV9STwkweDIwMAkJLyogSFcgcmVhZC1vbmx5IGJpdCAgKi8KKyNkZWZpbmUgX1BBR0VfSU5WQUxJRAkweDQwMAkJLyogSFcgaW52YWxpZCBiaXQgICAgKi8KKyNkZWZpbmUgX1BBR0VfU1dUCTB4MDAxCQkvKiBTVyBwdGUgdHlwZSBiaXQgdCAqLworI2RlZmluZSBfUEFHRV9TV1gJMHgwMDIJCS8qIFNXIHB0ZSB0eXBlIGJpdCB4ICovCiAKLS8qIE1hc2sgYW5kIHNpeCBkaWZmZXJlbnQgdHlwZXMgb2YgcGFnZXMuICovCi0jZGVmaW5lIF9QQUdFX1RZUEVfTUFTSwkJMHg2MDEKKy8qIFNpeCBkaWZmZXJlbnQgdHlwZXMgb2YgcGFnZXMuICovCiAjZGVmaW5lIF9QQUdFX1RZUEVfRU1QVFkJMHg0MDAKICNkZWZpbmUgX1BBR0VfVFlQRV9OT05FCQkweDQwMQotI2RlZmluZSBfUEFHRV9UWVBFX1NXQVAJCTB4NjAwCi0jZGVmaW5lIF9QQUdFX1RZUEVfRklMRQkJMHg2MDEKKyNkZWZpbmUgX1BBR0VfVFlQRV9TV0FQCQkweDQwMworI2RlZmluZSBfUEFHRV9UWVBFX0ZJTEUJCTB4NjAxCS8qIGJpdCAweDAwMiBpcyB1c2VkIGZvciBvZmZzZXQgISEgKi8KICNkZWZpbmUgX1BBR0VfVFlQRV9STwkJMHgyMDAKICNkZWZpbmUgX1BBR0VfVFlQRV9SVwkJMHgwMDAKIAorLyoKKyAqIFBURSB0eXBlIGJpdHMgYXJlIHJhdGhlciBjb21wbGljYXRlZC4gaGFuZGxlX3B0ZV9mYXVsdCB1c2VzIHB0ZV9wcmVzZW50LAorICogcHRlX25vbmUgYW5kIHB0ZV9maWxlIHRvIGZpbmQgb3V0IHRoZSBwdGUgdHlwZSBXSVRIT1VUIGhvbGRpbmcgdGhlIHBhZ2UKKyAqIHRhYmxlIGxvY2suIHB0ZXBfY2xlYXJfZmx1c2ggb24gdGhlIG90aGVyIGhhbmQgdXNlcyBwdGVwX2NsZWFyX2ZsdXNoIHRvCisgKiBpbnZhbGlkYXRlIGEgZ2l2ZW4gcHRlLiBpcHRlIHNldHMgdGhlIGh3IGludmFsaWQgYml0IGFuZCBjbGVhcnMgYWxsIHRsYnMKKyAqIGZvciB0aGUgcGFnZS4gVGhlIHBhZ2UgdGFibGUgZW50cnkgaXMgc2V0IHRvIF9QQUdFX1RZUEVfRU1QVFkgYWZ0ZXJ3YXJkcy4KKyAqIFRoaXMgY2hhbmdlIGlzIGRvbmUgd2hpbGUgaG9sZGluZyB0aGUgbG9jaywgYnV0IHRoZSBpbnRlcm1lZGlhdGUgc3RlcAorICogb2YgYSBwcmV2aW91c2x5IHZhbGlkIHB0ZSB3aXRoIHRoZSBodyBpbnZhbGlkIGJpdCBzZXQgY2FuIGJlIG9ic2VydmVkIGJ5CisgKiBoYW5kbGVfcHRlX2ZhdWx0LiBUaGF0IG1ha2VzIGl0IG5lY2Vzc2FyeSB0aGF0IGFsbCB2YWxpZCBwdGUgdHlwZXMgd2l0aAorICogdGhlIGh3IGludmFsaWQgYml0IHNldCBtdXN0IGJlIGRpc3Rpbmd1aXNoYWJsZSBmcm9tIHRoZSBmb3VyIHB0ZSB0eXBlcworICogZW1wdHksIG5vbmUsIHN3YXAgYW5kIGZpbGUuCisgKgorICoJCQlpcnh0ICBpcHRlICBpcnh0CisgKiBfUEFHRV9UWVBFX0VNUFRZCTEwMDAgICAtPiAgIDEwMDAKKyAqIF9QQUdFX1RZUEVfTk9ORQkxMDAxICAgLT4gICAxMDAxCisgKiBfUEFHRV9UWVBFX1NXQVAJMTAxMSAgIC0+ICAgMTAxMQorICogX1BBR0VfVFlQRV9GSUxFCTExPzEgICAtPiAgIDExPzEKKyAqIF9QQUdFX1RZUEVfUk8JMDEwMCAgIC0+ICAgMTEwMAorICogX1BBR0VfVFlQRV9SVwkwMDAwICAgLT4gICAxMDAwCisgKgorICogcHRlX25vbmUgaXMgdHJ1ZSBmb3IgYml0cyBjb21iaW5hdGlvbnMgMTAwMCwgMTEwMAorICogcHRlX3ByZXNlbnQgaXMgdHJ1ZSBmb3IgYml0cyBjb21iaW5hdGlvbnMgMDAwMCwgMDAxMCwgMDEwMCwgMDExMCwgMTAwMQorICogcHRlX2ZpbGUgaXMgdHJ1ZSBmb3IgYml0cyBjb21iaW5hdGlvbnMgMTEwMSwgMTExMQorICogc3dhcCBwdGUgaXMgMTAxMSBhbmQgMDAwMSwgMDAxMSwgMDEwMSwgMDExMSwgMTAxMCBhbmQgMTExMCBhcmUgaW52YWxpZC4KKyAqLworCiAjaWZuZGVmIF9fczM5MHhfXwogCiAvKiBCaXRzIGluIHRoZSBzZWdtZW50IHRhYmxlIGVudHJ5ICovCkBAIC0zNjUsMTggKzM5MiwyMSBAQAogCiBzdGF0aWMgaW5saW5lIGludCBwdGVfbm9uZShwdGVfdCBwdGUpCiB7Ci0JcmV0dXJuIChwdGVfdmFsKHB0ZSkgJiBfUEFHRV9UWVBFX01BU0spID09IF9QQUdFX1RZUEVfRU1QVFk7CisJcmV0dXJuIChwdGVfdmFsKHB0ZSkgJiBfUEFHRV9JTlZBTElEKSAmJiAhKHB0ZV92YWwocHRlKSAmIF9QQUdFX1NXVCk7CiB9CiAKIHN0YXRpYyBpbmxpbmUgaW50IHB0ZV9wcmVzZW50KHB0ZV90IHB0ZSkKIHsKLQlyZXR1cm4gIShwdGVfdmFsKHB0ZSkgJiBfUEFHRV9JTlZBTElEKSB8fAotCQkocHRlX3ZhbChwdGUpICYgX1BBR0VfVFlQRV9NQVNLKSA9PSBfUEFHRV9UWVBFX05PTkU7CisJdW5zaWduZWQgbG9uZyBtYXNrID0gX1BBR0VfUk8gfCBfUEFHRV9JTlZBTElEIHwgX1BBR0VfU1dUIHwgX1BBR0VfU1dYOworCXJldHVybiAocHRlX3ZhbChwdGUpICYgbWFzaykgPT0gX1BBR0VfVFlQRV9OT05FIHx8CisJCSghKHB0ZV92YWwocHRlKSAmIF9QQUdFX0lOVkFMSUQpICYmCisJCSAhKHB0ZV92YWwocHRlKSAmIF9QQUdFX1NXVCkpOwogfQogCiBzdGF0aWMgaW5saW5lIGludCBwdGVfZmlsZShwdGVfdCBwdGUpCiB7Ci0JcmV0dXJuIChwdGVfdmFsKHB0ZSkgJiBfUEFHRV9UWVBFX01BU0spID09IF9QQUdFX1RZUEVfRklMRTsKKwl1bnNpZ25lZCBsb25nIG1hc2sgPSBfUEFHRV9STyB8IF9QQUdFX0lOVkFMSUQgfCBfUEFHRV9TV1Q7CisJcmV0dXJuIChwdGVfdmFsKHB0ZSkgJiBtYXNrKSA9PSBfUEFHRV9UWVBFX0ZJTEU7CiB9CiAKICNkZWZpbmUgcHRlX3NhbWUoYSxiKQkocHRlX3ZhbChhKSA9PSBwdGVfdmFsKGIpKQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tczM5MC90aW1lci5oIGIvaW5jbHVkZS9hc20tczM5MC90aW1lci5oCmluZGV4IGZjZDZjMjUuLjMwZTVjYmUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXMzOTAvdGltZXIuaAorKysgYi9pbmNsdWRlL2FzbS1zMzkwL3RpbWVyLmgKQEAgLTI2LDcgKzI2LDcgQEAKIAlzcGlubG9ja190IGxvY2s7CiAJdW5zaWduZWQgbG9uZyBtYWdpYzsKIAotCXZvaWQgKCpmdW5jdGlvbikodW5zaWduZWQgbG9uZywgc3RydWN0IHB0X3JlZ3MqKTsKKwl2b2lkICgqZnVuY3Rpb24pKHVuc2lnbmVkIGxvbmcpOwogCXVuc2lnbmVkIGxvbmcgZGF0YTsKIH07CiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXMzOTAvdW5pc3RkLmggYi9pbmNsdWRlL2FzbS1zMzkwL3VuaXN0ZC5oCmluZGV4IGExOTIzOGMuLjcxZDNjMjEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXMzOTAvdW5pc3RkLmgKKysrIGIvaW5jbHVkZS9hc20tczM5MC91bmlzdGQuaApAQCAtMjQ5LDggKzI0OSw5IEBACiAjZGVmaW5lIF9fTlJfdm1zcGxpY2UJCTMwOQogLyogTnVtYmVyIDMxMCBpcyByZXNlcnZlZCBmb3IgbmV3IHN5c19tb3ZlX3BhZ2VzICovCiAjZGVmaW5lIF9fTlJfZ2V0Y3B1CQkzMTEKKyNkZWZpbmUgX19OUl9lcG9sbF9wd2FpdAkzMTIKIAotI2RlZmluZSBOUl9zeXNjYWxscyAzMTIKKyNkZWZpbmUgTlJfc3lzY2FsbHMgMzEzCiAKIC8qIAogICogVGhlcmUgYXJlIHNvbWUgc3lzdGVtIGNhbGxzIHRoYXQgYXJlIG5vdCBwcmVzZW50IG9uIDY0IGJpdCwgc29tZQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tc2gvY3B1LXNoNC91YmMuaCBiL2luY2x1ZGUvYXNtLXNoL2NwdS1zaDQvdWJjLmgKaW5kZXggM2QwOTQzMS4uYzg2ZTE3MCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tc2gvY3B1LXNoNC91YmMuaAorKysgYi9pbmNsdWRlL2FzbS1zaC9jcHUtc2g0L3ViYy5oCkBAIC0zLDYgKzMsNyBAQAogICoKICAqIENvcHlyaWdodCAoQykgMTk5OSBOaWliZSBZdXRha2EKICAqIENvcHlyaWdodCAoQykgMjAwMyBQYXVsIE11bmR0CisgKiBDb3B5cmlnaHQgKEMpIDIwMDYgTGluZW8gU29sdXRpb25zIEluYy4gc3VwcG9ydCBTSDRBIFVCQwogICoKICAqIFRoaXMgZmlsZSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCiAgKiBMaWNlbnNlLiAgU2VlIHRoZSBmaWxlICJDT1BZSU5HIiBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhpcyBhcmNoaXZlCkBAIC0xMSw2ICsxMiw0MSBAQAogI2lmbmRlZiBfX0FTTV9DUFVfU0g0X1VCQ19ICiAjZGVmaW5lIF9fQVNNX0NQVV9TSDRfVUJDX0gKIAorI2lmIGRlZmluZWQoQ09ORklHX0NQVV9TSDRBKQorI2RlZmluZSBVQkNfQ0JSMAkJMHhmZjIwMDAwMAorI2RlZmluZSBVQkNfQ1JSMAkJMHhmZjIwMDAwNAorI2RlZmluZSBVQkNfQ0FSMAkJMHhmZjIwMDAwOAorI2RlZmluZSBVQkNfQ0FNUjAJCTB4ZmYyMDAwMGMKKyNkZWZpbmUgVUJDX0NCUjEJCTB4ZmYyMDAwMjAKKyNkZWZpbmUgVUJDX0NSUjEJCTB4ZmYyMDAwMjQKKyNkZWZpbmUgVUJDX0NBUjEJCTB4ZmYyMDAwMjgKKyNkZWZpbmUgVUJDX0NBTVIxCQkweGZmMjAwMDJjCisjZGVmaW5lIFVCQ19DRFIxCQkweGZmMjAwMDMwCisjZGVmaW5lIFVCQ19DRE1SMQkJMHhmZjIwMDAzNAorI2RlZmluZSBVQkNfQ0VUUjEJCTB4ZmYyMDAwMzgKKyNkZWZpbmUgVUJDX0NDTUZSCQkweGZmMjAwNjAwCisjZGVmaW5lIFVCQ19DQkNSCQkweGZmMjAwNjIwCisKKy8qIENCUgkqLworI2RlZmluZSBVQkNfQ0JSX0FJRQkJKDB4MDE8PDMwKQorI2RlZmluZSBVQkNfQ0JSX0lEX0lOU1QJCSgweDAxPDw0KQorI2RlZmluZSBVQkNfQ0JSX1JXX1JFQUQJCSgweDAxPDwxKQorI2RlZmluZSBVQkNfQ0JSX0NFCQkoMHgwMSkKKworI2RlZmluZQlVQkNfQ0JSX0FJVl9NQVNLCSgweDAwRkYwMDAwKQorI2RlZmluZQlVQkNfQ0JSX0FJVl9TSElGVAkoMTYpCisjZGVmaW5lIFVCQ19DQlJfQUlWX1NFVChhc2lkKQkoKChhc2lkKTw8VUJDX0NCUl9BSVZfU0hJRlQpICYgVUJDX0NCUl9BSVZfTUFTSykKKworI2RlZmluZSBVQkNfQ0JSX0lOSVQJCTB4MjAwMDAwMDAKKworLyogQ1JSCSovCisjZGVmaW5lIFVCQ19DUlJfUkVTCQkoMHgwMTw8MTMpCisjZGVmaW5lIFVCQ19DUlJfUENCCQkoMHgwMTw8MSkKKyNkZWZpbmUgVUJDX0NSUl9CSUUJCSgweDAxKQorCisjZGVmaW5lIFVCQ19DUlJfSU5JVAkJMHgwMDAwMjAwMAorCisjZWxzZQkvKiBDT05GSUdfQ1BVX1NINCAqLwogI2RlZmluZSBVQkNfQkFSQQkJMHhmZjIwMDAwMAogI2RlZmluZSBVQkNfQkFNUkEJCTB4ZmYyMDAwMDQKICNkZWZpbmUgVUJDX0JCUkEJCTB4ZmYyMDAwMDgKQEAgLTIyLDYgKzU4LDcgQEAKICNkZWZpbmUgVUJDX0JEUkIJCTB4ZmYyMDAwMTgKICNkZWZpbmUgVUJDX0JETVJCCQkweGZmMjAwMDFjCiAjZGVmaW5lIFVCQ19CUkNSCQkweGZmMjAwMDIwCisjZW5kaWYJLyogQ09ORklHX0NQVV9TSDQgKi8KIAogI2VuZGlmIC8qIF9fQVNNX0NQVV9TSDRfVUJDX0ggKi8KIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tc2gvZWRvc2s3NzA1L2lvLmggYi9pbmNsdWRlL2FzbS1zaC9lZG9zazc3MDUuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gaW5jbHVkZS9hc20tc2gvZWRvc2s3NzA1L2lvLmgKcmVuYW1lIHRvIGluY2x1ZGUvYXNtLXNoL2Vkb3NrNzcwNS5oCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1zaC9ocDZ4eC9ocDZ4eC5oIGIvaW5jbHVkZS9hc20tc2gvaHA2eHguaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gaW5jbHVkZS9hc20tc2gvaHA2eHgvaHA2eHguaApyZW5hbWUgdG8gaW5jbHVkZS9hc20tc2gvaHA2eHguaApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tc2gvaHA2eHgvaWRlLmggYi9pbmNsdWRlL2FzbS1zaC9ocDZ4eC9pZGUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTcwMzk1YS4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2FzbS1zaC9ocDZ4eC9pZGUuaAorKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotI2lmbmRlZiBfX0FTTV9TSF9IUDZYWF9JREVfSAotI2RlZmluZSBfX0FTTV9TSF9IUDZYWF9JREVfSAotCi0jZGVmaW5lIElSUV9DRkNBUkQJOTMKLSNkZWZpbmUgSVJRX1BDTUNJQQk5NAotCi0jZW5kaWYgLyogX19BU01fU0hfSFA2WFhfSURFX0ggKi8KLQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tc2gvaHA2eHgvaW8uaCBiL2luY2x1ZGUvYXNtLXNoL2hwNnh4L2lvLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIwNDQ0NzYuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9hc20tc2gvaHA2eHgvaW8uaAorKysgL2Rldi9udWxsCkBAIC0xLDEwICswLDAgQEAKLSNpZm5kZWYgX19BU01fU0hfSFA2WFhfSU9fSAotI2RlZmluZSBfX0FTTV9TSF9IUDZYWF9JT19ICi0KLS8qCi0gKiBOb3RoaW5nIHNwZWNpYWwgaGVyZS4uIGp1c3QgdXNlIHRoZSBnZW5lcmljIGNjaGlwIGlvIHJvdXRpbmVzLgotICovCi0jaW5jbHVkZSA8YXNtL2hkNjQ0NjEuaD4KLQotI2VuZGlmIC8qIF9fQVNNX1NIX0hQNlhYX0lPX0ggKi8KLQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tc2gvaHM3NzUxcnZvaXAvaHM3NzUxcnZvaXAuaCBiL2luY2x1ZGUvYXNtLXNoL2hzNzc1MXJ2b2lwLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGluY2x1ZGUvYXNtLXNoL2hzNzc1MXJ2b2lwL2hzNzc1MXJ2b2lwLmgKcmVuYW1lIHRvIGluY2x1ZGUvYXNtLXNoL2hzNzc1MXJ2b2lwLmgKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXNoL2hzNzc1MXJ2b2lwL2lkZS5oIGIvaW5jbHVkZS9hc20tc2gvaHM3NzUxcnZvaXAvaWRlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY1YWQxZDAuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9hc20tc2gvaHM3NzUxcnZvaXAvaWRlLmgKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLSNpZm5kZWYgX19BU01fU0hfSFM3NzUxUlZPSVBfSURFX0gKLSNkZWZpbmUgX19BU01fU0hfSFM3NzUxUlZPSVBfSURFX0gKLQotLyogTm90aGluZyB0byBzZWUgaGVyZS4uICovCi0jaW5jbHVkZSA8YXNtL2hzNzc1MXJ2b2lwL2hzNzc1MXJ2b2lwLmg+Ci0KLSNlbmRpZiAvKiBfX0FTTV9TSF9IUzc3NTFSVk9JUF9JREVfSCAqLwotCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1zaC9od19pcnEuaCBiL2luY2x1ZGUvYXNtLXNoL2h3X2lycS5oCmluZGV4IGZlZDI2NjEuLjgwZWUxY2QgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXNoL2h3X2lycS5oCisrKyBiL2luY2x1ZGUvYXNtLXNoL2h3X2lycS5oCkBAIC0xLDQgKzEsOCBAQAogI2lmbmRlZiBfX0FTTV9TSF9IV19JUlFfSAogI2RlZmluZSBfX0FTTV9TSF9IV19JUlFfSAogCisjaW5jbHVkZSA8YXNtL2F0b21pYy5oPgorCitleHRlcm4gYXRvbWljX3QgaXJxX2Vycl9jb3VudDsKKwogI2VuZGlmIC8qIF9fQVNNX1NIX0hXX0lSUV9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1zaC9pby5oIGIvaW5jbHVkZS9hc20tc2gvaW8uaAppbmRleCBlZDEyZDM4Li5hMGU1NWIwIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1zaC9pby5oCisrKyBiL2luY2x1ZGUvYXNtLXNoL2lvLmgKQEAgLTMwNCwyMiArMzA0LDYgQEAKICNkZWZpbmUgaW91bm1hcChhZGRyKQkJCQkJXAogCV9faW91bm1hcCgoYWRkcikpCiAKLXN0YXRpYyBpbmxpbmUgaW50IGNoZWNrX3NpZ25hdHVyZShjaGFyIF9faW9tZW0gKmlvX2FkZHIsCi0JCQljb25zdCB1bnNpZ25lZCBjaGFyICpzaWduYXR1cmUsIGludCBsZW5ndGgpCi17Ci0JaW50IHJldHZhbCA9IDA7Ci0JZG8gewotCQlpZiAocmVhZGIoaW9fYWRkcikgIT0gKnNpZ25hdHVyZSkKLQkJCWdvdG8gb3V0OwotCQlpb19hZGRyKys7Ci0JCXNpZ25hdHVyZSsrOwotCQlsZW5ndGgtLTsKLQl9IHdoaWxlIChsZW5ndGgpOwotCXJldHZhbCA9IDE7Ci1vdXQ6Ci0JcmV0dXJuIHJldHZhbDsKLX0KLQogLyoKICAqIFRoZSBjYWNoZXMgb24gc29tZSBhcmNoaXRlY3R1cmVzIGFyZW4ndCBkbWEtY29oZXJlbnQgYW5kIGhhdmUgbmVlZCB0bwogICogaGFuZGxlIHRoaXMgaW4gc29mdHdhcmUuICBUaGVyZSBhcmUgdGhyZWUgdHlwZXMgb2Ygb3BlcmF0aW9ucyB0aGF0CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1zaC9pcnEtc2g3NzgwLmggYi9pbmNsdWRlL2FzbS1zaC9pcnEtc2g3NzgwLmgKaW5kZXggODk1YzU3OC4uMTk5MTJhZSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tc2gvaXJxLXNoNzc4MC5oCisrKyBiL2luY2x1ZGUvYXNtLXNoL2lycS1zaDc3ODAuaApAQCAtNiwxNiArNiw2IEBACiAgKgogICogQ29weXJpZ2h0IChDKSAyMDA0IFRha2FzaGkgU0hVRE8gPHNodWRvQGhpdGFjaGktdWwuY28uanA+CiAgKi8KLQotI2lmZGVmIENPTkZJR19JREUKLSMgaWZuZGVmIElSUV9DRkNBUkQKLSMgIGRlZmluZSBJUlFfQ0ZDQVJECTE0Ci0jIGVuZGlmCi0jIGlmbmRlZiBJUlFfUENNQ0lBCi0jICBkZWZpbmUgSVJRX1BDTUNJQQkxNQotIyBlbmRpZgotI2VuZGlmCi0KICNkZWZpbmUgSU5UQ19CQVNFCTB4ZmZkMDAwMDAKICNkZWZpbmUgSU5UQ19JQ1IwCShJTlRDX0JBU0UrMHgwKQogI2RlZmluZSBJTlRDX0lDUjEJKElOVENfQkFTRSsweDFjKQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tc2gvaXJxLmggYi9pbmNsdWRlL2FzbS1zaC9pcnEuaAppbmRleCAwZTVmMzY1Li42Y2QzZTllIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1zaC9pcnEuaAorKysgYi9pbmNsdWRlL2FzbS1zaC9pcnEuaApAQCAtMTQsMTYgKzE0LDYgQEAKICNpbmNsdWRlIDxhc20vbWFjaHZlYy5oPgogI2luY2x1ZGUgPGFzbS9wdHJhY2UuaD4JCS8qIGZvciBwdF9yZWdzICovCiAKLSNpZiBkZWZpbmVkKENPTkZJR19TSF9IUDZYWCkgfHwgXAotICAgIGRlZmluZWQoQ09ORklHX1NIX1JUUzc3NTFSMkQpIHx8IFwKLSAgICBkZWZpbmVkKENPTkZJR19TSF9IUzc3NTFSVk9JUCkgfHwgXAotICAgIGRlZmluZWQoQ09ORklHX1NIX0hTNzc1MVJWT0lQKSB8fCBcCi0gICAgZGVmaW5lZChDT05GSUdfU0hfU0gwMykgfHwgXAotICAgIGRlZmluZWQoQ09ORklHX1NIX1I3NzgwUlApIHx8IFwKLSAgICBkZWZpbmVkKENPTkZJR19TSF9MQU5ESVNLKQotI2luY2x1ZGUgPGFzbS9tYWNoL2lkZS5oPgotI2VuZGlmCi0KICNpZm5kZWYgQ09ORklHX0NQVV9TVUJUWVBFX1NINzc4MAogCiAjZGVmaW5lIElOVENfRE1BQzBfTVNLCTAKQEAgLTM4LDE1ICsyOCw2IEBACiAjZGVmaW5lIElOVENfSVBSRAkweGZmZDAwMDEwVUwKICNlbmRpZgogCi0jaWZkZWYgQ09ORklHX0lERQotIyBpZm5kZWYgSVJRX0NGQ0FSRAotIyAgZGVmaW5lIElSUV9DRkNBUkQJMTQKLSMgZW5kaWYKLSMgaWZuZGVmIElSUV9QQ01DSUEKLSMgIGRlZmluZSBJUlFfUENNQ0lBCTE1Ci0jIGVuZGlmCi0jZW5kaWYKLQogI2RlZmluZSBUSU1FUl9JUlEJMTYKICNkZWZpbmUgVElNRVJfSVBSX0FERFIJSU5UQ19JUFJBCiAjZGVmaW5lIFRJTUVSX0lQUl9QT1MJIDMKQEAgLTM0NiwxMSArMzI3LDE3IEBACiAgKi8KIHZvaWQgaW5pdF9JUlFfcGludCh2b2lkKTsKIAorc3RydWN0IGlwcl9kYXRhIHsKKwl1bnNpZ25lZCBpbnQgaXJxOworCXVuc2lnbmVkIGludCBhZGRyOwkvKiBBZGRyZXNzIG9mIEludGVycnVwdCBQcmlvcml0eSBSZWdpc3RlciAqLworCWludCBzaGlmdDsJCS8qIFNoaWZ0cyBvZiB0aGUgMTYtYml0IGRhdGEgKi8KKwlpbnQgcHJpb3JpdHk7CQkvKiBUaGUgcHJpb3JpdHkgKi8KK307CisKIC8qCiAgKiBGdW5jdGlvbiBmb3IgIm9uIGNoaXAgc3VwcG9ydCBtb2R1bGVzIi4KICAqLwotZXh0ZXJuIHZvaWQgbWFrZV9pcHJfaXJxKHVuc2lnbmVkIGludCBpcnEsIHVuc2lnbmVkIGludCBhZGRyLAotCQkJIGludCBwb3MsICBpbnQgcHJpb3JpdHkpOworZXh0ZXJuIHZvaWQgbWFrZV9pcHJfaXJxKHN0cnVjdCBpcHJfZGF0YSAqdGFibGUsIHVuc2lnbmVkIGludCBucl9pcnFzKTsKIGV4dGVybiB2b2lkIG1ha2VfaW1hc2tfaXJxKHVuc2lnbmVkIGludCBpcnEpOwogCiAjaWYgZGVmaW5lZChDT05GSUdfQ1BVX1NVQlRZUEVfU0g3MzAwKQpAQCAtNjk3LDEzICs2ODQsMTUgQEAKIAogI2RlZmluZSBJTlRDMl9JTlRQUklfT0ZGU0VUCTB4MDAKIAotdm9pZCBtYWtlX2ludGMyX2lycSh1bnNpZ25lZCBpbnQgaXJxLAotCQkgICAgdW5zaWduZWQgaW50IGlwcl9vZmZzZXQsIHVuc2lnbmVkIGludCBpcHJfc2hpZnQsCi0JCSAgICB1bnNpZ25lZCBpbnQgbXNrX29mZnNldCwgdW5zaWduZWQgaW50IG1za19zaGlmdCwKLQkJICAgIHVuc2lnbmVkIGludCBwcmlvcml0eSk7Ci12b2lkIGluaXRfSVJRX2ludGMyKHZvaWQpOwotdm9pZCBpbnRjMl9hZGRfY2xlYXJfaXJxKGludCBpcnEsIGludCAoKmZuKShpbnQpKTsKK3N0cnVjdCBpbnRjMl9kYXRhIHsKKwl1bnNpZ25lZCBzaG9ydCBpcnE7CisJdW5zaWduZWQgY2hhciBpcHJfb2Zmc2V0LCBpcHJfc2hpZnQ7CisJdW5zaWduZWQgY2hhciBtc2tfb2Zmc2V0LCBtc2tfc2hpZnQ7CisJdW5zaWduZWQgY2hhciBwcmlvcml0eTsKK307CiAKK3ZvaWQgbWFrZV9pbnRjMl9pcnEoc3RydWN0IGludGMyX2RhdGEgKiwgdW5zaWduZWQgaW50IG5yX2lycXMpOwordm9pZCBpbml0X0lSUV9pbnRjMih2b2lkKTsKICNlbmRpZgogCiBleHRlcm4gaW50IHNobXNlX2lycV9kZW11eChpbnQgaXJxKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXNoL2lycV9yZWdzLmggYi9pbmNsdWRlL2FzbS1zaC9pcnFfcmVncy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNkZDljMGIKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2FzbS1zaC9pcnFfcmVncy5oCkBAIC0wLDAgKzEgQEAKKyNpbmNsdWRlIDxhc20tZ2VuZXJpYy9pcnFfcmVncy5oPgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tc2gvbGFuZGlzay9pZGUuaCBiL2luY2x1ZGUvYXNtLXNoL2xhbmRpc2svaWRlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY0OTBlMjguLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9hc20tc2gvbGFuZGlzay9pZGUuaAorKysgL2Rldi9udWxsCkBAIC0xLDE0ICswLDAgQEAKLS8qCi0gKiBtb2RpZmVkIGJ5IGtvZ2lpZGVuYQotICogMjAwNS4wMy4wMwotICovCi0KLSNpZm5kZWYgX19BU01fU0hfTEFORElTS19JREVfSAotI2RlZmluZSBfX0FTTV9TSF9MQU5ESVNLX0lERV9ICi0KLS8qIE5vdGhpbmcgdG8gc2VlIGhlcmUuLiAqLwotI2luY2x1ZGUgPGFzbS9sYW5kaXNrL2lvZGF0YV9sYW5kaXNrLmg+Ci0jZGVmaW5lIElSUV9DRkNBUkQJSVJRX0ZBVEEJLyogQ0YgQ2FyZCBJUlEgKi8KLSNkZWZpbmUgSVJRX1BDTUNJQQlJUlFfQVRBCQkvKiBQQ01DSUEgSVJRICovCi0KLSNlbmRpZiAvKiBfX0FTTV9TSF9MQU5ESVNLX0lERV9IICAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tc2gvcHJvY2Vzc29yLmggYi9pbmNsdWRlL2FzbS1zaC9wcm9jZXNzb3IuaAppbmRleCA0NzQ3NzM4Li40NWJiNzRlIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1zaC9wcm9jZXNzb3IuaAorKysgYi9pbmNsdWRlL2FzbS1zaC9wcm9jZXNzb3IuaApAQCAtMjU1LDYgKzI1NSw4IEBACiAgKi8KICNkZWZpbmUgdGhyZWFkX3NhdmVkX3BjKHRzaykJKHRzay0+dGhyZWFkLnBjKQogCit2b2lkIHNob3dfdHJhY2Uoc3RydWN0IHRhc2tfc3RydWN0ICp0c2ssIHVuc2lnbmVkIGxvbmcgKnNwLAorCQlzdHJ1Y3QgcHRfcmVncyAqcmVncyk7CiBleHRlcm4gdW5zaWduZWQgbG9uZyBnZXRfd2NoYW4oc3RydWN0IHRhc2tfc3RydWN0ICpwKTsKIAogI2RlZmluZSBLU1RLX0VJUCh0c2spICAoKHRzayktPnRocmVhZC5wYykKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXNoL3I3NzgwcnAvcjc3ODBycC5oIGIvaW5jbHVkZS9hc20tc2gvcjc3ODBycC5oCnNpbWlsYXJpdHkgaW5kZXggOTYlCnJlbmFtZSBmcm9tIGluY2x1ZGUvYXNtLXNoL3I3NzgwcnAvcjc3ODBycC5oCnJlbmFtZSB0byBpbmNsdWRlL2FzbS1zaC9yNzc4MHJwLmgKaW5kZXggZjk1ZDlkYi4uYzE4ZjY0OCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tc2gvcjc3ODBycC9yNzc4MHJwLmgKKysrIGIvaW5jbHVkZS9hc20tc2gvcjc3ODBycC5oCkBAIC03Miw4ICs3Miw2IEBACiAKICNkZWZpbmUgUEFfQVg4ODc5NkwgICAgIDB4YTQxMDA0MDAgICAgICAvKiBBWDg4Nzk2TCBBcmVhICovCiAjZGVmaW5lIFBBX1NDMTYwMkJTTEIgICAweGE2MDAwMDAwICAgICAgLyogU0MxNjAyQlNMQiBBcmVhICovCi0jZGVmaW5lIFBBX0FSRUE1X0lPICAgICAweGI0MDAwMDAwICAgICAgLyogQXJlYSA1IElPIE1lbW9yeSAqLwotI2RlZmluZSBQQV9BUkVBNl9JTyAgICAgMHhiODAwMDAwMCAgICAgIC8qIEFyZWEgNiBJTyBNZW1vcnkgKi8KICNkZWZpbmUgUEFfSURFX09GRlNFVCAgIDB4MWYwICAgICAgICAgICAvKiBDRiBJREUgT2Zmc2V0ICovCiAjZGVmaW5lIEFYODg3OTZMX0lPX0JBU0UgICAgICAgIDB4MTAwMCAgLyogQVg4ODc5NkwgSU8gQmFzZSBBZGRyZXNzICovCiAKQEAgLTgzLDcgKzgxLDYgQEAKICNkZWZpbmUgSVJRX1BDSVNMT1QyICAgIDY2ICAgICAgICAgICAgICAvKiBQQ0kgU2xvdCAjMiBJUlEgKi8KICNkZWZpbmUgSVJRX1BDSVNMT1QzICAgIDY3ICAgICAgICAgICAgICAvKiBQQ0kgU2xvdCAjMyBJUlEgKi8KICNkZWZpbmUgSVJRX1BDSVNMT1Q0ICAgIDY4ICAgICAgICAgICAgICAvKiBQQ0kgU2xvdCAjNCBJUlEgKi8KLSNkZWZpbmUgSVJRX0NGQ0FSRCAgICAgIDEgICAgICAgICAgICAgICAvKiBDRiBDYXJkIElSUSAqLwogLy8gI2RlZmluZSBJUlFfQ0ZJTlNUICAgMCAgICAgICAgICAgICAgIC8qIENGIENhcmQgSW5zZXJ0IElSUSAqLwogI2RlZmluZSBJUlFfVFAgICAgICAgICAgMiAgICAgICAgICAgICAgIC8qIFRvdWNoIFBhbmVsIElSUSAqLwogI2RlZmluZSBJUlFfU0NJMSAgICAgICAgMyAgICAgICAgICAgICAgIC8qIFNDSTEgSVJRICovCkBAIC0xNDYsOCArMTQzLDYgQEAKIAogI2RlZmluZSBQQV9BWDg4Nzk2TAkweGE1ODAwNDAwCS8qIEFYODg3OTZMIEFyZWEgKi8KICNkZWZpbmUgUEFfU0MxNjAyQlNMQgkweGE2MDAwMDAwCS8qIFNDMTYwMkJTTEIgQXJlYSAqLwotI2RlZmluZSBQQV9BUkVBNV9JTwkweGI0MDAwMDAwCS8qIEFyZWEgNSBJTyBNZW1vcnkgKi8KLSNkZWZpbmUgUEFfQVJFQTZfSU8JMHhiODAwMDAwMAkvKiBBcmVhIDYgSU8gTWVtb3J5ICovCiAjZGVmaW5lIFBBX0lERV9PRkZTRVQJMHgxZjAJCS8qIENGIElERSBPZmZzZXQgKi8KICNkZWZpbmUgQVg4ODc5NkxfSU9fQkFTRQkweDEwMDAJLyogQVg4ODc5NkwgSU8gQmFzZSBBZGRyZXNzICovCiAKQEAgLTE1Nyw3ICsxNTIsNiBAQAogI2RlZmluZSBJUlFfUENJU0xPVDIJMQkJLyogUENJIFNsb3QgIzIgSVJRICovCiAjZGVmaW5lIElSUV9QQ0lTTE9UMwkyCQkvKiBQQ0kgU2xvdCAjMyBJUlEgKi8KICNkZWZpbmUgSVJRX1BDSVNMT1Q0CTMJCS8qIFBDSSBTbG90ICM0IElSUSAqLwotI2RlZmluZSBJUlFfQ0ZDQVJECTQJCS8qIENGIENhcmQgSVJRICovCiAjZGVmaW5lIElSUV9DRklOU1QJNQkJLyogQ0YgQ2FyZCBJbnNlcnQgSVJRICovCiAjZGVmaW5lIElSUV9NNjY1OTYJNgkJLyogTTY2NTk2IElSUSAqLwogI2RlZmluZSBJUlFfU0RDQVJECTcJCS8qIFNEIENhcmQgSVJRICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1zaC9yNzc4MHJwL2lkZS5oIGIvaW5jbHVkZS9hc20tc2gvcjc3ODBycC9pZGUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTFlZDc4ZS4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2FzbS1zaC9yNzc4MHJwL2lkZS5oCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi0jaWZuZGVmIF9fQVNNX1NIX1I3NzgwUlBfSURFX0gKLSNkZWZpbmUgX19BU01fU0hfUjc3ODBSUF9JREVfSAotCi0vKiBOb3RoaW5nIHRvIHNlZSBoZXJlLi4gKi8KLSNpbmNsdWRlIDxhc20vbWFjaC9yNzc4MHJwLmg+Ci0KLSNlbmRpZiAvKiBfX0FTTV9TSF9SNzc4MFJQX0lERV9IICovCi0KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXNoL3J0czc3NTFyMmQvcnRzNzc1MXIyZC5oIGIvaW5jbHVkZS9hc20tc2gvcnRzNzc1MXIyZC5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBpbmNsdWRlL2FzbS1zaC9ydHM3NzUxcjJkL3J0czc3NTFyMmQuaApyZW5hbWUgdG8gaW5jbHVkZS9hc20tc2gvcnRzNzc1MXIyZC5oCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1zaC9ydHM3NzUxcjJkL2lkZS5oIGIvaW5jbHVkZS9hc20tc2gvcnRzNzc1MXIyZC9pZGUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDE2Zjk2Yi4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2FzbS1zaC9ydHM3NzUxcjJkL2lkZS5oCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi0jaWZuZGVmIF9fQVNNX1NIX1JUUzc3NTFSMkRfSURFX0gKLSNkZWZpbmUgX19BU01fU0hfUlRTNzc1MVIyRF9JREVfSAotCi0vKiBOb3RoaW5nIHRvIHNlZSBoZXJlLi4gKi8KLSNpbmNsdWRlIDxhc20vcnRzNzc1MXIyZC9ydHM3NzUxcjJkLmg+Ci0KLSNlbmRpZiAvKiBfX0FTTV9TSF9SVFM3NzUxUjJEX0lERV9IICovCi0KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXNoL3NoMDMvaWRlLmggYi9pbmNsdWRlL2FzbS1zaC9zaDAzL2lkZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3M2VlOTJlLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvYXNtLXNoL3NoMDMvaWRlLmgKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLSNpZm5kZWYgX19BU01fU0hfU0gwM19JREVfSAotI2RlZmluZSBfX0FTTV9TSF9TSDAzX0lERV9ICi0KLSNkZWZpbmUgSVJRX0NGQ0FSRAk4Ci0jZGVmaW5lIElSUV9QQ01DSUEJOAotCi0jZW5kaWYgLyogX19BU01fU0hfU0gwM19JREVfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tc2gvc2htaW4vc2htaW4uaCBiL2luY2x1ZGUvYXNtLXNoL3NobWluLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGluY2x1ZGUvYXNtLXNoL3NobWluL3NobWluLmgKcmVuYW1lIHRvIGluY2x1ZGUvYXNtLXNoL3NobWluLmgKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXNoL3N5c3RlbS5oIGIvaW5jbHVkZS9hc20tc2gvc3lzdGVtLmgKaW5kZXggNmMxZjhmZC4uMzM0MDEyNiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tc2gvc3lzdGVtLmgKKysrIGIvaW5jbHVkZS9hc20tc2gvc3lzdGVtLmgKQEAgLTM1Myw2ICszNTMsMTMgQEAKIAkJCQkgICAgKHVuc2lnbmVkIGxvbmcpX25fLCBzaXplb2YoKihwdHIpKSk7IFwKICAgfSkKIAorZXh0ZXJuIHZvaWQgKnNldF9leGNlcHRpb25fdGFibGVfdmVjKHVuc2lnbmVkIGludCB2ZWMsIHZvaWQgKmhhbmRsZXIpOworCitzdGF0aWMgaW5saW5lIHZvaWQgKnNldF9leGNlcHRpb25fdGFibGVfZXZ0KHVuc2lnbmVkIGludCBldnQsIHZvaWQgKmhhbmRsZXIpCit7CisJcmV0dXJuIHNldF9leGNlcHRpb25fdGFibGVfdmVjKGV2dCA+PiA1LCBoYW5kbGVyKTsKK30KKwogLyogWFhYCiAgKiBkaXNhYmxlIGhsdCBkdXJpbmcgY2VydGFpbiBjcml0aWNhbCBpL28gb3BlcmF0aW9ucwogICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1zaC90aW1lci5oIGIvaW5jbHVkZS9hc20tc2gvdGltZXIuaAppbmRleCBjN2FiMjgwLi41ZGY4NDJiIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1zaC90aW1lci5oCisrKyBiL2luY2x1ZGUvYXNtLXNoL3RpbWVyLmgKQEAgLTgsOCArOCw5IEBACiAJaW50ICgqaW5pdCkodm9pZCk7CiAJaW50ICgqc3RhcnQpKHZvaWQpOwogCWludCAoKnN0b3ApKHZvaWQpOworI2lmbmRlZiBDT05GSUdfR0VORVJJQ19USU1FCiAJdW5zaWduZWQgbG9uZyAoKmdldF9vZmZzZXQpKHZvaWQpOwotCXVuc2lnbmVkIGxvbmcgKCpnZXRfZnJlcXVlbmN5KSh2b2lkKTsKKyNlbmRpZgogfTsKIAogc3RydWN0IHN5c190aW1lciB7CkBAIC0yNCwyMSArMjUsMTcgQEAKIGV4dGVybiBzdHJ1Y3Qgc3lzX3RpbWVyIHRtdV90aW1lcjsKIGV4dGVybiBzdHJ1Y3Qgc3lzX3RpbWVyICpzeXNfdGltZXI7CiAKKyNpZm5kZWYgQ09ORklHX0dFTkVSSUNfVElNRQogc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIGdldF90aW1lcl9vZmZzZXQodm9pZCkKIHsKIAlyZXR1cm4gc3lzX3RpbWVyLT5vcHMtPmdldF9vZmZzZXQoKTsKIH0KLQotc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIGdldF90aW1lcl9mcmVxdWVuY3kodm9pZCkKLXsKLQlyZXR1cm4gc3lzX3RpbWVyLT5vcHMtPmdldF9mcmVxdWVuY3koKTsKLX0KKyNlbmRpZgogCiAvKiBhcmNoL3NoL2tlcm5lbC90aW1lcnMvdGltZXIuYyAqLwogc3RydWN0IHN5c190aW1lciAqZ2V0X3N5c190aW1lcih2b2lkKTsKIAogLyogYXJjaC9zaC9rZXJuZWwvdGltZS5jICovCi12b2lkIGhhbmRsZV90aW1lcl90aWNrKHN0cnVjdCBwdF9yZWdzICopOwordm9pZCBoYW5kbGVfdGltZXJfdGljayh2b2lkKTsKIAogI2VuZGlmIC8qIF9fQVNNX1NIX1RJTUVSX0ggKi8KLQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tc2gvdW5pc3RkLmggYi9pbmNsdWRlL2FzbS1zaC91bmlzdGQuaAppbmRleCBmMWEwY2JjLi4xYzJhYmRlIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1zaC91bmlzdGQuaAorKysgYi9pbmNsdWRlL2FzbS1zaC91bmlzdGQuaApAQCAtMzI0LDggKzMyNCwxMSBAQAogI2RlZmluZSBfX05SX3N5bmNfZmlsZV9yYW5nZQkzMTQKICNkZWZpbmUgX19OUl90ZWUJCTMxNQogI2RlZmluZSBfX05SX3Ztc3BsaWNlCQkzMTYKKyNkZWZpbmUgX19OUl9tb3ZlX3BhZ2VzCQkzMTcKKyNkZWZpbmUgX19OUl9nZXRjcHUJCTMxOAorI2RlZmluZSBfX05SX2Vwb2xsX3B3YWl0CTMxOQogCi0jZGVmaW5lIE5SX3N5c2NhbGxzIDMxNworI2RlZmluZSBOUl9zeXNjYWxscyAzMjAKIAogI2lmZGVmIF9fS0VSTkVMX18KIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tc2g2NC9pby5oIGIvaW5jbHVkZS9hc20tc2g2NC9pby5oCmluZGV4IDI1MmZlZGIuLjE0ZDhlN2IgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXNoNjQvaW8uaAorKysgYi9pbmNsdWRlL2FzbS1zaDY0L2lvLmgKQEAgLTE3OCwyMiArMTc4LDYgQEAKIHVuc2lnbmVkIGxvbmcgb25jaGlwX3JlbWFwKHVuc2lnbmVkIGxvbmcgYWRkciwgdW5zaWduZWQgbG9uZyBzaXplLCBjb25zdCBjaGFyKiBuYW1lKTsKIGV4dGVybiB2b2lkIG9uY2hpcF91bm1hcCh1bnNpZ25lZCBsb25nIHZhZGRyKTsKIAotc3RhdGljIF9faW5saW5lX18gaW50IGNoZWNrX3NpZ25hdHVyZSh2b2xhdGlsZSB2b2lkIF9faW9tZW0gKmlvX2FkZHIsCi0JCQljb25zdCB1bnNpZ25lZCBjaGFyICpzaWduYXR1cmUsIGludCBsZW5ndGgpCi17Ci0JaW50IHJldHZhbCA9IDA7Ci0JZG8gewotCQlpZiAocmVhZGIoaW9fYWRkcikgIT0gKnNpZ25hdHVyZSkKLQkJCWdvdG8gb3V0OwotCQlpb19hZGRyKys7Ci0JCXNpZ25hdHVyZSsrOwotCQlsZW5ndGgtLTsKLQl9IHdoaWxlIChsZW5ndGgpOwotCXJldHZhbCA9IDE7Ci1vdXQ6Ci0JcmV0dXJuIHJldHZhbDsKLX0KLQogLyoKICAqIFRoZSBjYWNoZXMgb24gc29tZSBhcmNoaXRlY3R1cmVzIGFyZW4ndCBkbWEtY29oZXJlbnQgYW5kIGhhdmUgbmVlZCB0bwogICogaGFuZGxlIHRoaXMgaW4gc29mdHdhcmUuICBUaGVyZSBhcmUgdGhyZWUgdHlwZXMgb2Ygb3BlcmF0aW9ucyB0aGF0CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1zcGFyYy9lbGYuaCBiL2luY2x1ZGUvYXNtLXNwYXJjL2VsZi5oCmluZGV4IDgzYTNkZDEuLmFhZjZlZjQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXNwYXJjL2VsZi5oCisrKyBiL2luY2x1ZGUvYXNtLXNwYXJjL2VsZi5oCkBAIC04LDExICs4LDYgQEAKIAogI2luY2x1ZGUgPGFzbS9wdHJhY2UuaD4KIAotI2lmZGVmIF9fS0VSTkVMX18KLSNpbmNsdWRlIDxhc20vbWJ1cy5oPgotI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+Ci0jZW5kaWYKLQogLyoKICAqIFNwYXJjIHNlY3Rpb24gdHlwZXMKICAqLwpAQCAtNzcsNiArNzIsMjMgQEAKICNkZWZpbmUgRUxGX05HUkVHIDM4CiB0eXBlZGVmIGVsZl9ncmVnX3QgZWxmX2dyZWdzZXRfdFtFTEZfTkdSRUddOwogCit0eXBlZGVmIHN0cnVjdCB7CisJdW5pb24geworCQl1bnNpZ25lZCBsb25nCXByX3JlZ3NbMzJdOworCQlkb3VibGUJCXByX2RyZWdzWzE2XTsKKwl9IHByX2ZyOworCXVuc2lnbmVkIGxvbmcgX191bnVzZWQ7CisJdW5zaWduZWQgbG9uZwlwcl9mc3I7CisJdW5zaWduZWQgY2hhcglwcl9xY250OworCXVuc2lnbmVkIGNoYXIJcHJfcV9lbnRyeXNpemU7CisJdW5zaWduZWQgY2hhcglwcl9lbjsKKwl1bnNpZ25lZCBpbnQJcHJfcVs2NF07Cit9IGVsZl9mcHJlZ3NldF90OworCisjaWZkZWYgX19LRVJORUxfXworI2luY2x1ZGUgPGFzbS9tYnVzLmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKwogLyogRm9ybWF0IGlzOgogICogCUcwIC0tPiBHNwogICoJTzAgLS0+IE83CkBAIC05OSwyMCArMTExLDcgQEAKIAlkZXN0WzM0XSA9IHNyYy0+bnBjOwkJCQlcCiAJZGVzdFszNV0gPSBzcmMtPnk7CQkJCVwKIAlkZXN0WzM2XSA9IGRlc3RbMzddID0gMDsgLyogWFhYICovCQlcCi19IHdoaWxlKDApOyAvKiBKYW5pdG9yczogRG9uJ3QgdG91Y2ggdGhpcyBjb2xvbi4gKi8KLQotdHlwZWRlZiBzdHJ1Y3QgewotCXVuaW9uIHsKLQkJdW5zaWduZWQgbG9uZwlwcl9yZWdzWzMyXTsKLQkJZG91YmxlCQlwcl9kcmVnc1sxNl07Ci0JfSBwcl9mcjsKLQl1bnNpZ25lZCBsb25nIF9fdW51c2VkOwotCXVuc2lnbmVkIGxvbmcJcHJfZnNyOwotCXVuc2lnbmVkIGNoYXIJcHJfcWNudDsKLQl1bnNpZ25lZCBjaGFyCXByX3FfZW50cnlzaXplOwotCXVuc2lnbmVkIGNoYXIJcHJfZW47Ci0JdW5zaWduZWQgaW50CXByX3FbNjRdOwotfSBlbGZfZnByZWdzZXRfdDsKK30gd2hpbGUoMCk7IC8qIEphbml0b3JzOiBEb24ndCB0b3VjaCB0aGlzIHNlbWljb2xvbi4gKi8KIAogI2RlZmluZSBFTEZfQ09SRV9DT1BZX1RBU0tfUkVHUyhfX3RzaywgX19lbGZfcmVncykJXAogCSh7IEVMRl9DT1JFX0NPUFlfUkVHUygoKihfX2VsZl9yZWdzKSksIChfX3RzayktPnRocmVhZC5rcmVncyk7IDE7IH0pCkBAIC0xNjUsOCArMTY0LDggQEAKIAogI2RlZmluZSBFTEZfUExBVEZPUk0JKE5VTEwpCiAKLSNpZmRlZiBfX0tFUk5FTF9fCiAjZGVmaW5lIFNFVF9QRVJTT05BTElUWShleCwgaWJjczIpIHNldF9wZXJzb25hbGl0eSgoaWJjczIpP1BFUl9TVlI0OlBFUl9MSU5VWCkKLSNlbmRpZgorCisjZW5kaWYgLyogX19LRVJORUxfXyAqLwogCiAjZW5kaWYgLyogIShfX0FTTVNQQVJDX0VMRl9IKSAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tc3BhcmMvdW5pc3RkLmggYi9pbmNsdWRlL2FzbS1zcGFyYy91bmlzdGQuaAppbmRleCBjN2E0OTVhLi5mNzgyN2ZhIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1zcGFyYy91bmlzdGQuaAorKysgYi9pbmNsdWRlL2FzbS1zcGFyYy91bmlzdGQuaApAQCAtMzE4LDEyICszMTgsMTUgQEAKICNkZWZpbmUgX19OUl91bnNoYXJlCQkyOTkKICNkZWZpbmUgX19OUl9zZXRfcm9idXN0X2xpc3QJMzAwCiAjZGVmaW5lIF9fTlJfZ2V0X3JvYnVzdF9saXN0CTMwMQorI2RlZmluZSBfX05SX21pZ3JhdGVfcGFnZXMJMzAyCisKKyNkZWZpbmUgTlJfU1lTQ0FMTFMJCTMwMwogCiAjaWZkZWYgX19LRVJORUxfXwotLyogV0FSTklORzogWW91IE1BWSBOT1QgYWRkIHN5c2NhbGwgbnVtYmVycyBsYXJnZXIgdGhhbiAzMDEsIHNpbmNlCisvKiBXQVJOSU5HOiBZb3UgTUFZIE5PVCBhZGQgc3lzY2FsbCBudW1iZXJzIGxhcmdlciB0aGFuIDMwMiwgc2luY2UKICAqICAgICAgICAgIGFsbCBvZiB0aGUgc3lzY2FsbCB0YWJsZXMgaW4gdGhlIFNwYXJjIGtlcm5lbCBhcmUKLSAqICAgICAgICAgIHNpemVkIHRvIGhhdmUgMzAxIGVudHJpZXMgKHN0YXJ0aW5nIGF0IHplcm8pLiAgVGhlcmVmb3JlCi0gKiAgICAgICAgICBmaW5kIGEgZnJlZSBzbG90IGluIHRoZSAwLTMwMSByYW5nZS4KKyAqICAgICAgICAgIHNpemVkIHRvIGhhdmUgMzAyIGVudHJpZXMgKHN0YXJ0aW5nIGF0IHplcm8pLiAgVGhlcmVmb3JlCisgKiAgICAgICAgICBmaW5kIGEgZnJlZSBzbG90IGluIHRoZSAwLTMwMiByYW5nZS4KICAqLwogCiAjZGVmaW5lIF9zeXNjYWxsMCh0eXBlLG5hbWUpIFwKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXNwYXJjNjQvY29tcGF0LmggYi9pbmNsdWRlL2FzbS1zcGFyYzY0L2NvbXBhdC5oCmluZGV4IGM3MzkzNWQuLjM2NTExY2EgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXNwYXJjNjQvY29tcGF0LmgKKysrIGIvaW5jbHVkZS9hc20tc3BhcmM2NC9jb21wYXQuaApAQCAtMTY0LDcgKzE2NCw3IEBACiAJcmV0dXJuICh1MzIpKHVuc2lnbmVkIGxvbmcpdXB0cjsKIH0KIAotc3RhdGljIF9faW5saW5lX18gdm9pZCBfX3VzZXIgKmNvbXBhdF9hbGxvY191c2VyX3NwYWNlKGxvbmcgbGVuKQorc3RhdGljIGlubGluZSB2b2lkIF9fdXNlciAqY29tcGF0X2FsbG9jX3VzZXJfc3BhY2UobG9uZyBsZW4pCiB7CiAJc3RydWN0IHB0X3JlZ3MgKnJlZ3MgPSBjdXJyZW50X3RocmVhZF9pbmZvKCktPmtyZWdzOwogCXVuc2lnbmVkIGxvbmcgdXNwID0gcmVncy0+dV9yZWdzW1VSRUdfSTZdOwpAQCAtMTc0LDcgKzE3NCwxMCBAQAogCWVsc2UKIAkJdXNwICY9IDB4ZmZmZmZmZmZVTDsKIAotCXJldHVybiAodm9pZCBfX3VzZXIgKikgKHVzcCAtIGxlbik7CisJdXNwIC09IGxlbjsKKwl1c3AgJj0gfjB4N1VMOworCisJcmV0dXJuICh2b2lkIF9fdXNlciAqKSB1c3A7CiB9CiAKIHN0cnVjdCBjb21wYXRfaXBjNjRfcGVybSB7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1zcGFyYzY0L2Z1dGV4LmggYi9pbmNsdWRlL2FzbS1zcGFyYzY0L2Z1dGV4LmgKaW5kZXggZGVlNDAyMC4uNzM5MmZjNCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tc3BhcmM2NC9mdXRleC5oCisrKyBiL2luY2x1ZGUvYXNtLXNwYXJjNjQvZnV0ZXguaApAQCAtODcsMjQgKzg3LDIyIEBACiBmdXRleF9hdG9taWNfY21weGNoZ19pbmF0b21pYyhpbnQgX191c2VyICp1YWRkciwgaW50IG9sZHZhbCwgaW50IG5ld3ZhbCkKIHsKIAlfX2FzbV9fIF9fdm9sYXRpbGVfXygKLQkiXG4xOglsZHV3YQlbJTJdICUlYXNpLCAlMFxuIgotCSIyOgljYXNhCVslMl0gJSVhc2ksICUwLCAlMVxuIgotCSIzOlxuIgorCSJcbjE6CWNhc2EJWyUzXSAlJWFzaSwgJTIsICUwXG4iCisJIjI6XG4iCiAJIgkuc2VjdGlvbiAuZml4dXAsI2FsbG9jLCNleGVjaW5zdHJcbiIKIAkiCS5hbGlnbgk0XG4iCi0JIjQ6CWJhCTNiXG4iCi0JIgkgbW92CSUzLCAlMFxuIgorCSIzOgliYQkyYlxuIgorCSIJIG1vdgklNCwgJTBcbiIKIAkiCS5wcmV2aW91c1xuIgogCSIJLnNlY3Rpb24gX19leF90YWJsZSxcImFcIlxuIgogCSIJLmFsaWduCTRcbiIKLQkiCS53b3JkCTFiLCA0YlxuIgotCSIJLndvcmQJMmIsIDRiXG4iCisJIgkud29yZAkxYiwgM2JcbiIKIAkiCS5wcmV2aW91c1xuIgotCTogIj0mciIgKG9sZHZhbCkKLQk6ICJyIiAobmV3dmFsKSwgInIiICh1YWRkciksICJpIiAoLUVGQVVMVCkKKwk6ICI9ciIgKG5ld3ZhbCkKKwk6ICIwIiAobmV3dmFsKSwgInIiIChvbGR2YWwpLCAiciIgKHVhZGRyKSwgImkiICgtRUZBVUxUKQogCTogIm1lbW9yeSIpOwogCi0JcmV0dXJuIG9sZHZhbDsKKwlyZXR1cm4gbmV3dmFsOwogfQogCiAjZW5kaWYgLyogIShfU1BBUkM2NF9GVVRFWF9IKSAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tc3BhcmM2NC9pby5oIGIvaW5jbHVkZS9hc20tc3BhcmM2NC9pby5oCmluZGV4IDAwNTY3NzAuLjMwYjkxMmQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXNwYXJjNjQvaW8uaAorKysgYi9pbmNsdWRlL2FzbS1zcGFyYzY0L2lvLmgKQEAgLTQ0MCwyMSArNDQwLDYgQEAKIAogI2RlZmluZSBtZW1jcHlfdG9pbyhkLHMsc3opCV9tZW1jcHlfdG9pbyhkLHMsc3opCiAKLXN0YXRpYyBpbmxpbmUgaW50IGNoZWNrX3NpZ25hdHVyZSh2b2lkIF9faW9tZW0gKmlvX2FkZHIsCi0JCQkJICBjb25zdCB1bnNpZ25lZCBjaGFyICpzaWduYXR1cmUsCi0JCQkJICBpbnQgbGVuZ3RoKQotewotCWludCByZXR2YWwgPSAwOwotCWRvIHsKLQkJaWYgKHJlYWRiKGlvX2FkZHIpICE9ICpzaWduYXR1cmUrKykKLQkJCWdvdG8gb3V0OwotCQlpb19hZGRyKys7Ci0JfSB3aGlsZSAoLS1sZW5ndGgpOwotCXJldHZhbCA9IDE7Ci1vdXQ6Ci0JcmV0dXJuIHJldHZhbDsKLX0KLQogI2RlZmluZSBtbWlvd2IoKQogCiAjaWZkZWYgX19LRVJORUxfXwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tc3BhcmM2NC91bmlzdGQuaCBiL2luY2x1ZGUvYXNtLXNwYXJjNjQvdW5pc3RkLmgKaW5kZXggMTI0Y2YwNy4uNjM2NjlkYSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tc3BhcmM2NC91bmlzdGQuaAorKysgYi9pbmNsdWRlL2FzbS1zcGFyYzY0L3VuaXN0ZC5oCkBAIC0zMjAsMTIgKzMyMCwxNiBAQAogI2RlZmluZSBfX05SX3Vuc2hhcmUJCTI5OQogI2RlZmluZSBfX05SX3NldF9yb2J1c3RfbGlzdAkzMDAKICNkZWZpbmUgX19OUl9nZXRfcm9idXN0X2xpc3QJMzAxCisjZGVmaW5lIF9fTlJfbWlncmF0ZV9wYWdlcwkzMDIKKworI2RlZmluZSBOUl9TWVNDQUxMUwkJMzAzCiAKICNpZmRlZiBfX0tFUk5FTF9fCi0vKiBXQVJOSU5HOiBZb3UgTUFZIE5PVCBhZGQgc3lzY2FsbCBudW1iZXJzIGxhcmdlciB0aGFuIDMwMSwgc2luY2UKKworLyogV0FSTklORzogWW91IE1BWSBOT1QgYWRkIHN5c2NhbGwgbnVtYmVycyBsYXJnZXIgdGhhbiAzMDIsIHNpbmNlCiAgKiAgICAgICAgICBhbGwgb2YgdGhlIHN5c2NhbGwgdGFibGVzIGluIHRoZSBTcGFyYyBrZXJuZWwgYXJlCi0gKiAgICAgICAgICBzaXplZCB0byBoYXZlIDMwMSBlbnRyaWVzIChzdGFydGluZyBhdCB6ZXJvKS4gIFRoZXJlZm9yZQotICogICAgICAgICAgZmluZCBhIGZyZWUgc2xvdCBpbiB0aGUgMC0zMDEgcmFuZ2UuCisgKiAgICAgICAgICBzaXplZCB0byBoYXZlIDMwMiBlbnRyaWVzIChzdGFydGluZyBhdCB6ZXJvKS4gIFRoZXJlZm9yZQorICogICAgICAgICAgZmluZCBhIGZyZWUgc2xvdCBpbiB0aGUgMC0zMDIgcmFuZ2UuCiAgKi8KIAogI2RlZmluZSBfc3lzY2FsbDAodHlwZSxuYW1lKSBcCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS11bS9hcmNocGFyYW0tcHBjLmggYi9pbmNsdWRlL2FzbS11bS9hcmNocGFyYW0tcHBjLmgKaW5kZXggMTcyY2Q2Zi4uNDI2OWQ4YSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tdW0vYXJjaHBhcmFtLXBwYy5oCisrKyBiL2luY2x1ZGUvYXNtLXVtL2FyY2hwYXJhbS1wcGMuaApAQCAtMSwxNSArMSw2IEBACiAjaWZuZGVmIF9fVU1fQVJDSFBBUkFNX1BQQ19ICiAjZGVmaW5lIF9fVU1fQVJDSFBBUkFNX1BQQ19ICiAKLS8qKioqKioqKiogQml0cyBmb3IgYXNtLXVtL2h3X2lycS5oICoqKioqKioqKiovCi0KLXN0cnVjdCBod19pbnRlcnJ1cHRfdHlwZTsKLQotLyoqKioqKioqKiBCaXRzIGZvciBhc20tdW0vaGFyZGlycS5oICoqKioqKioqKiovCi0KLSNkZWZpbmUgaXJxX2VudGVyKGNwdSwgaXJxKSBoYXJkaXJxX2VudGVyKGNwdSkKLSNkZWZpbmUgaXJxX2V4aXQoY3B1LCBpcnEpIGhhcmRpcnFfZXhpdChjcHUpCi0KIC8qKioqKioqKiogQml0cyBmb3IgYXNtLXVtL3N0cmluZy5oICoqKioqKioqKiovCiAKICNkZWZpbmUgX19IQVZFX0FSQ0hfU1RSUkNIUgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tdW0vY29tbW9uLmxkcy5TIGIvaW5jbHVkZS9hc20tdW0vY29tbW9uLmxkcy5TCmluZGV4IDEwMTAxNTMuLmYwNDU0NTEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXVtL2NvbW1vbi5sZHMuUworKysgYi9pbmNsdWRlL2FzbS11bS9jb21tb24ubGRzLlMKQEAgLTQyLDEzICs0Miw3IEBACiAJCiAgIF9faW5pdGNhbGxfc3RhcnQgPSAuOwogICAuaW5pdGNhbGwuaW5pdCA6IHsKLQkqKC5pbml0Y2FsbDEuaW5pdCkgCi0JKiguaW5pdGNhbGwyLmluaXQpIAotCSooLmluaXRjYWxsMy5pbml0KSAKLQkqKC5pbml0Y2FsbDQuaW5pdCkgCi0JKiguaW5pdGNhbGw1LmluaXQpIAotCSooLmluaXRjYWxsNi5pbml0KSAKLQkqKC5pbml0Y2FsbDcuaW5pdCkKKwlJTklUQ0FMTFMKICAgfQogICBfX2luaXRjYWxsX2VuZCA9IC47CiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXg4Nl82NC9hY3BpLmggYi9pbmNsdWRlL2FzbS14ODZfNjQvYWNwaS5oCmluZGV4IGVkNTlhYTQuLjlkMTkxNmUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXg4Nl82NC9hY3BpLmgKKysrIGIvaW5jbHVkZS9hc20teDg2XzY0L2FjcGkuaApAQCAtMTYzLDYgKzE2Myw3IEBACiAjZGVmaW5lIEFSQ0hfSEFTX1BPV0VSX0lOSVQgMQogCiBleHRlcm4gaW50IGFjcGlfc2tpcF90aW1lcl9vdmVycmlkZTsKK2V4dGVybiBpbnQgYWNwaV91c2VfdGltZXJfb3ZlcnJpZGU7CiAKICNlbmRpZiAvKl9fS0VSTkVMX18qLwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14ODZfNjQvaHdfaXJxLmggYi9pbmNsdWRlL2FzbS14ODZfNjQvaHdfaXJxLmgKaW5kZXggNzkyZGQ1Mi4uMTc5Y2NlNyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20teDg2XzY0L2h3X2lycS5oCisrKyBiL2luY2x1ZGUvYXNtLXg4Nl82NC9od19pcnEuaApAQCAtNzYsNiArNzYsOCBAQAogI2lmbmRlZiBfX0FTU0VNQkxZX18KIHR5cGVkZWYgaW50IHZlY3Rvcl9pcnFfdFtOUl9WRUNUT1JTXTsKIERFQ0xBUkVfUEVSX0NQVSh2ZWN0b3JfaXJxX3QsIHZlY3Rvcl9pcnEpOworZXh0ZXJuIHZvaWQgX19zZXR1cF92ZWN0b3JfaXJxKGludCBjcHUpOworZXh0ZXJuIHNwaW5sb2NrX3QgdmVjdG9yX2xvY2s7CiAKIC8qCiAgKiBWYXJpb3VzIGxvdy1sZXZlbCBpcnEgZGV0YWlscyBuZWVkZWQgYnkgaXJxLmMsIHByb2Nlc3MuYywKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXg4Nl82NC9pby5oIGIvaW5jbHVkZS9hc20teDg2XzY0L2lvLmgKaW5kZXggNzBlOTFmZS4uNmVlOWZhZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20teDg2XzY0L2lvLmgKKysrIGIvaW5jbHVkZS9hc20teDg2XzY0L2lvLmgKQEAgLTI1NCwzMyArMjU0LDYgQEAKIAogI2RlZmluZSBldGhfaW9fY29weV9hbmRfc3VtKGEsYixjLGQpCQlldGhfY29weV9hbmRfc3VtKChhKSwodm9pZCAqKShiKSwoYyksKGQpKQogCi0vKioKLSAqCWNoZWNrX3NpZ25hdHVyZQkJLQlmaW5kIEJJT1Mgc2lnbmF0dXJlcwotICoJQGlvX2FkZHI6IG1taW8gYWRkcmVzcyB0byBjaGVjayAKLSAqCUBzaWduYXR1cmU6ICBzaWduYXR1cmUgYmxvY2sKLSAqCUBsZW5ndGg6IGxlbmd0aCBvZiBzaWduYXR1cmUKLSAqCi0gKglQZXJmb3JtIGEgc2lnbmF0dXJlIGNvbXBhcmlzb24gd2l0aCB0aGUgbW1pbyBhZGRyZXNzIGlvX2FkZHIuIFRoaXMKLSAqCWFkZHJlc3Mgc2hvdWxkIGhhdmUgYmVlbiBvYnRhaW5lZCBieSBpb3JlbWFwLgotICoJUmV0dXJucyAxIG9uIGEgbWF0Y2guCi0gKi8KLSAKLXN0YXRpYyBpbmxpbmUgaW50IGNoZWNrX3NpZ25hdHVyZSh2b2lkIF9faW9tZW0gKmlvX2FkZHIsCi0JY29uc3QgdW5zaWduZWQgY2hhciAqc2lnbmF0dXJlLCBpbnQgbGVuZ3RoKQotewotCWludCByZXR2YWwgPSAwOwotCWRvIHsKLQkJaWYgKHJlYWRiKGlvX2FkZHIpICE9ICpzaWduYXR1cmUpCi0JCQlnb3RvIG91dDsKLQkJaW9fYWRkcisrOwotCQlzaWduYXR1cmUrKzsKLQkJbGVuZ3RoLS07Ci0JfSB3aGlsZSAobGVuZ3RoKTsKLQlyZXR2YWwgPSAxOwotb3V0OgotCXJldHVybiByZXR2YWw7Ci19Ci0KIC8qIE5vdGhpbmcgdG8gZG8gKi8KIAogI2RlZmluZSBkbWFfY2FjaGVfaW52KF9zdGFydCxfc2l6ZSkJCWRvIHsgfSB3aGlsZSAoMCkKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXg4Nl82NC9pb19hcGljLmggYi9pbmNsdWRlL2FzbS14ODZfNjQvaW9fYXBpYy5oCmluZGV4IDE3MWVjMmQuLjU2MWVjYmYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXg4Nl82NC9pb19hcGljLmgKKysrIGIvaW5jbHVkZS9hc20teDg2XzY0L2lvX2FwaWMuaApAQCAtMTIsMTAgKzEyLDYgQEAKIAogI2RlZmluZSBBUElDX01JU01BVENIX0RFQlVHCiAKLSNkZWZpbmUgSU9fQVBJQ19CQVNFKGlkeCkgXAotCQkoKHZvbGF0aWxlIGludCAqKShfX2ZpeF90b192aXJ0KEZJWF9JT19BUElDX0JBU0VfMCArIGlkeCkgXAotCQkrIChtcF9pb2FwaWNzW2lkeF0ubXBjX2FwaWNhZGRyICYgflBBR0VfTUFTSykpKQotCiAvKgogICogVGhlIHN0cnVjdHVyZSBvZiB0aGUgSU8tQVBJQzoKICAqLwpAQCAtMTE5LDM2ICsxMTUsNiBAQAogLyogbm9uLTAgaWYgZGVmYXVsdCAodGFibGUtbGVzcykgTVAgY29uZmlndXJhdGlvbiAqLwogZXh0ZXJuIGludCBtcGNfZGVmYXVsdF90eXBlOwogCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBpb19hcGljX3JlYWQodW5zaWduZWQgaW50IGFwaWMsIHVuc2lnbmVkIGludCByZWcpCi17Ci0JKklPX0FQSUNfQkFTRShhcGljKSA9IHJlZzsKLQlyZXR1cm4gKihJT19BUElDX0JBU0UoYXBpYykrNCk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBpb19hcGljX3dyaXRlKHVuc2lnbmVkIGludCBhcGljLCB1bnNpZ25lZCBpbnQgcmVnLCB1bnNpZ25lZCBpbnQgdmFsdWUpCi17Ci0JKklPX0FQSUNfQkFTRShhcGljKSA9IHJlZzsKLQkqKElPX0FQSUNfQkFTRShhcGljKSs0KSA9IHZhbHVlOwotfQotCi0vKgotICogUmUtd3JpdGUgYSB2YWx1ZTogdG8gYmUgdXNlZCBmb3IgcmVhZC1tb2RpZnktd3JpdGUKLSAqIGN5Y2xlcyB3aGVyZSB0aGUgcmVhZCBhbHJlYWR5IHNldCB1cCB0aGUgaW5kZXggcmVnaXN0ZXIuCi0gKi8KLXN0YXRpYyBpbmxpbmUgdm9pZCBpb19hcGljX21vZGlmeSh1bnNpZ25lZCBpbnQgYXBpYywgdW5zaWduZWQgaW50IHZhbHVlKQotewotCSooSU9fQVBJQ19CQVNFKGFwaWMpKzQpID0gdmFsdWU7Ci19Ci0KLS8qCi0gKiBTeW5jaHJvbml6ZSB0aGUgSU8tQVBJQyBhbmQgdGhlIENQVSBieSBkb2luZwotICogYSBkdW1teSByZWFkIGZyb20gdGhlIElPLUFQSUMKLSAqLwotc3RhdGljIGlubGluZSB2b2lkIGlvX2FwaWNfc3luYyh1bnNpZ25lZCBpbnQgYXBpYykKLXsKLQkodm9pZCkgKihJT19BUElDX0JBU0UoYXBpYykrNCk7Ci19Ci0KIC8qIDEgaWYgIm5vYXBpYyIgYm9vdCBvcHRpb24gcGFzc2VkICovCiBleHRlcm4gaW50IHNraXBfaW9hcGljX3NldHVwOwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14ODZfNjQvcGRhLmggYi9pbmNsdWRlL2FzbS14ODZfNjQvcGRhLmgKaW5kZXggMTQ5OTZkOS4uNTY0MjYzNCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20teDg2XzY0L3BkYS5oCisrKyBiL2luY2x1ZGUvYXNtLXg4Nl82NC9wZGEuaApAQCAtMTA5LDYgKzEwOSwxNSBAQAogI2RlZmluZSBzdWJfcGRhKGZpZWxkLHZhbCkgcGRhX3RvX29wKCJzdWIiLGZpZWxkLHZhbCkKICNkZWZpbmUgb3JfcGRhKGZpZWxkLHZhbCkgcGRhX3RvX29wKCJvciIsZmllbGQsdmFsKQogCisvKiBUaGlzIGlzIG5vdCBhdG9taWMgYWdhaW5zdCBvdGhlciBDUFVzIC0tIENQVSBwcmVlbXB0aW9uIG5lZWRzIHRvIGJlIG9mZiAqLworI2RlZmluZSB0ZXN0X2FuZF9jbGVhcl9iaXRfcGRhKGJpdCxmaWVsZCkgKHsJCVwKKwlpbnQgb2xkX187CQkJCQkJXAorCWFzbSB2b2xhdGlsZSgiYnRyICUyLCUlZ3M6JWMzXG5cdHNiYmwgJTAsJTAiCQlcCisJICAgIDogIj1yIiAob2xkX18pLCAiK20iIChfcHJveHlfcGRhLmZpZWxkKSAJCVwKKwkgICAgOiAiZElyIiAoYml0KSwgImkiIChwZGFfb2Zmc2V0KGZpZWxkKSkgOiAibWVtb3J5Iik7CVwKKwlvbGRfXzsJCQkJCQkJXAorfSkKKwogI2VuZGlmCiAKICNkZWZpbmUgUERBX1NUQUNLT0ZGU0VUICg1KjgpCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14ODZfNjQvcGd0YWJsZS5oIGIvaW5jbHVkZS9hc20teDg2XzY0L3BndGFibGUuaAppbmRleCA2ODk5ZTc3Li4wNTU1YzFjIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS14ODZfNjQvcGd0YWJsZS5oCisrKyBiL2luY2x1ZGUvYXNtLXg4Nl82NC9wZ3RhYmxlLmgKQEAgLTM2Niw2ICszNjYsNyBAQAogeyAKIAlwdGVfdCBwdGU7CiAJcHRlX3ZhbChwdGUpID0gcGh5c3BhZ2UgfCBwZ3Byb3RfdmFsKHBncHJvdCk7IAorCXB0ZV92YWwocHRlKSAmPSBfX3N1cHBvcnRlZF9wdGVfbWFzazsKIAlyZXR1cm4gcHRlOyAKIH0KICAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXg4Nl82NC9wcm9jZXNzb3IuaCBiL2luY2x1ZGUvYXNtLXg4Nl82NC9wcm9jZXNzb3IuaAppbmRleCBkZTljMzE0Li5jZWYxN2UwIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS14ODZfNjQvcHJvY2Vzc29yLmgKKysrIGIvaW5jbHVkZS9hc20teDg2XzY0L3Byb2Nlc3Nvci5oCkBAIC00NzUsNiArNDc1LDggQEAKIAkJOiA6ImEiIChlYXgpLCAiYyIgKGVjeCkpOwogfQogCitleHRlcm4gdm9pZCBtd2FpdF9pZGxlX3dpdGhfaGludHModW5zaWduZWQgbG9uZyBlYXgsIHVuc2lnbmVkIGxvbmcgZWN4KTsKKwogI2RlZmluZSBzdGFja19jdXJyZW50KCkgXAogKHsJCQkJCQkJCVwKIAlzdHJ1Y3QgdGhyZWFkX2luZm8gKnRpOwkJCQkJXApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teDg2XzY0L3Byb3RvLmggYi9pbmNsdWRlL2FzbS14ODZfNjQvcHJvdG8uaAppbmRleCBjMTgxZmVmLi5lNzJjZmNkIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS14ODZfNjQvcHJvdG8uaAorKysgYi9pbmNsdWRlL2FzbS14ODZfNjQvcHJvdG8uaApAQCAtMTIyLDYgKzEyMiw4IEBACiBleHRlcm4gaW50IHJlYm9vdF9mb3JjZTsKIGV4dGVybiBpbnQgbm90c2Nfc2V0dXAoY2hhciAqKTsKIAorZXh0ZXJuIGludCB0aW1lcl9vdmVyXzgyNTQ7CisKIGV4dGVybiBpbnQgZ3NpX2lycV9zaGFyaW5nKGludCBnc2kpOwogCiBleHRlcm4gdm9pZCBzbXBfbG9jYWxfdGltZXJfaW50ZXJydXB0KHZvaWQpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teDg2XzY0L3ZzeXNjYWxsLmggYi9pbmNsdWRlL2FzbS14ODZfNjQvdnN5c2NhbGwuaAppbmRleCBmZDQ1MmZjLi4wMWQxYzE3IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS14ODZfNjQvdnN5c2NhbGwuaAorKysgYi9pbmNsdWRlL2FzbS14ODZfNjQvdnN5c2NhbGwuaApAQCAtNTksOCArNTksNiBAQAogCiBleHRlcm4gaW50IHN5c2N0bF92c3lzY2FsbDsKIAotZXh0ZXJuIHZvaWQgdnN5c2NhbGxfc2V0X2NwdShpbnQgY3B1KTsKLQogI2RlZmluZSBBUkNIX0hBVkVfWFRJTUVfTE9DSyAxCiAKICNlbmRpZiAvKiBfX0tFUk5FTF9fICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L0tidWlsZCBiL2luY2x1ZGUvbGludXgvS2J1aWxkCmluZGV4IDUxMTRmZjEuLmExMTU1YTIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvS2J1aWxkCisrKyBiL2luY2x1ZGUvbGludXgvS2J1aWxkCkBAIC0xMjAsNiArMTIwLDcgQEAKIGhlYWRlci15ICs9IG5mczIuaAogaGVhZGVyLXkgKz0gbmZzNF9tb3VudC5oCiBoZWFkZXIteSArPSBuZnNfbW91bnQuaAoraGVhZGVyLXkgKz0gb29tLmgKIGhlYWRlci15ICs9IHBhcmFtLmgKIGhlYWRlci15ICs9IHBjaV9pZHMuaAogaGVhZGVyLXkgKz0gcGNpX3JlZ3MuaApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9hY3BpLmggYi9pbmNsdWRlL2xpbnV4L2FjcGkuaAppbmRleCA4OGI1ZGZkLi4yYjBjOTU1IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2FjcGkuaAorKysgYi9pbmNsdWRlL2xpbnV4L2FjcGkuaApAQCAtNDk0LDYgKzQ5NCw5IEBACiAKIGV4dGVybiBpbnQgZWNfcmVhZCh1OCBhZGRyLCB1OCAqdmFsKTsKIGV4dGVybiBpbnQgZWNfd3JpdGUodTggYWRkciwgdTggdmFsKTsKK2V4dGVybiBpbnQgZWNfdHJhbnNhY3Rpb24odTggY29tbWFuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdTggKndkYXRhLCB1bnNpZ25lZCB3ZGF0YV9sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgIHU4ICpyZGF0YSwgdW5zaWduZWQgcmRhdGFfbGVuKTsKIAogI2VuZGlmIC8qQ09ORklHX0FDUElfRUMqLwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2JhY2tpbmctZGV2LmggYi9pbmNsdWRlL2xpbnV4L2JhY2tpbmctZGV2LmgKaW5kZXggZjdhMTM5MC4uNzAxMWQ2MjUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvYmFja2luZy1kZXYuaAorKysgYi9pbmNsdWRlL2xpbnV4L2JhY2tpbmctZGV2LmgKQEAgLTEwLDYgKzEwLDggQEAKIAogI2luY2x1ZGUgPGFzbS9hdG9taWMuaD4KIAorc3RydWN0IHBhZ2U7CisKIC8qCiAgKiBCaXRzIGluIGJhY2tpbmdfZGV2X2luZm8uc3RhdGUKICAqLwpAQCAtODgsNiArOTAsMTEgQEAKIAkJCQkgICgxIDw8IEJESV93cml0ZV9jb25nZXN0ZWQpKTsKIH0KIAordm9pZCBjbGVhcl9iZGlfY29uZ2VzdGVkKHN0cnVjdCBiYWNraW5nX2Rldl9pbmZvICpiZGksIGludCBydyk7Cit2b2lkIHNldF9iZGlfY29uZ2VzdGVkKHN0cnVjdCBiYWNraW5nX2Rldl9pbmZvICpiZGksIGludCBydyk7Citsb25nIGNvbmdlc3Rpb25fd2FpdChpbnQgcncsIGxvbmcgdGltZW91dCk7Cit2b2lkIGNvbmdlc3Rpb25fZW5kKGludCBydyk7CisKICNkZWZpbmUgYmRpX2NhcF93cml0ZWJhY2tfZGlydHkoYmRpKSBcCiAJKCEoKGJkaSktPmNhcGFiaWxpdGllcyAmIEJESV9DQVBfTk9fV1JJVEVCQUNLKSkKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9iaXRtYXAuaCBiL2luY2x1ZGUvbGludXgvYml0bWFwLmgKaW5kZXggZGNjNWRlNy4uNjRiNDY0MSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9iaXRtYXAuaAorKysgYi9pbmNsdWRlL2xpbnV4L2JpdG1hcC5oCkBAIC00Niw3ICs0Niw4IEBACiAgKiBiaXRtYXBfcmVtYXAoZHN0LCBzcmMsIG9sZCwgbmV3LCBuYml0cykJKmRzdCA9IG1hcChvbGQsIG5ldykoc3JjKQogICogYml0bWFwX2JpdHJlbWFwKG9sZGJpdCwgb2xkLCBuZXcsIG5iaXRzKQluZXdiaXQgPSBtYXAob2xkLCBuZXcpKG9sZGJpdCkKICAqIGJpdG1hcF9zY25wcmludGYoYnVmLCBsZW4sIHNyYywgbmJpdHMpCVByaW50IGJpdG1hcCBzcmMgdG8gYnVmCi0gKiBiaXRtYXBfcGFyc2UodWJ1ZiwgdWxlbiwgZHN0LCBuYml0cykJCVBhcnNlIGJpdG1hcCBkc3QgZnJvbSB1c2VyIGJ1ZgorICogYml0bWFwX3BhcnNlKGJ1ZiwgYnVmbGVuLCBkc3QsIG5iaXRzKQlQYXJzZSBiaXRtYXAgZHN0IGZyb20ga2VybmVsIGJ1ZgorICogYml0bWFwX3BhcnNlX3VzZXIodWJ1ZiwgdWxlbiwgZHN0LCBuYml0cykJUGFyc2UgYml0bWFwIGRzdCBmcm9tIHVzZXIgYnVmCiAgKiBiaXRtYXBfc2NubGlzdHByaW50ZihidWYsIGxlbiwgc3JjLCBuYml0cykJUHJpbnQgYml0bWFwIHNyYyBhcyBsaXN0IHRvIGJ1ZgogICogYml0bWFwX3BhcnNlbGlzdChidWYsIGRzdCwgbmJpdHMpCQlQYXJzZSBiaXRtYXAgZHN0IGZyb20gbGlzdAogICogYml0bWFwX2ZpbmRfZnJlZV9yZWdpb24oYml0bWFwLCBiaXRzLCBvcmRlcikJRmluZCBhbmQgYWxsb2NhdGUgYml0IHJlZ2lvbgpAQCAtMTA2LDcgKzEwNyw5IEBACiAKIGV4dGVybiBpbnQgYml0bWFwX3NjbnByaW50ZihjaGFyICpidWYsIHVuc2lnbmVkIGludCBsZW4sCiAJCQljb25zdCB1bnNpZ25lZCBsb25nICpzcmMsIGludCBuYml0cyk7Ci1leHRlcm4gaW50IGJpdG1hcF9wYXJzZShjb25zdCBjaGFyIF9fdXNlciAqdWJ1ZiwgdW5zaWduZWQgaW50IHVsZW4sCitleHRlcm4gaW50IF9fYml0bWFwX3BhcnNlKGNvbnN0IGNoYXIgKmJ1ZiwgdW5zaWduZWQgaW50IGJ1ZmxlbiwgaW50IGlzX3VzZXIsCisJCQl1bnNpZ25lZCBsb25nICpkc3QsIGludCBuYml0cyk7CitleHRlcm4gaW50IGJpdG1hcF9wYXJzZV91c2VyKGNvbnN0IGNoYXIgX191c2VyICp1YnVmLCB1bnNpZ25lZCBpbnQgdWxlbiwKIAkJCXVuc2lnbmVkIGxvbmcgKmRzdCwgaW50IG5iaXRzKTsKIGV4dGVybiBpbnQgYml0bWFwX3Njbmxpc3RwcmludGYoY2hhciAqYnVmLCB1bnNpZ25lZCBpbnQgbGVuLAogCQkJY29uc3QgdW5zaWduZWQgbG9uZyAqc3JjLCBpbnQgbmJpdHMpOwpAQCAtMjcwLDYgKzI3MywxMiBAQAogCQlfX2JpdG1hcF9zaGlmdF9sZWZ0KGRzdCwgc3JjLCBuLCBuYml0cyk7CiB9CiAKK3N0YXRpYyBpbmxpbmUgaW50IGJpdG1hcF9wYXJzZShjb25zdCBjaGFyICpidWYsIHVuc2lnbmVkIGludCBidWZsZW4sCisJCQl1bnNpZ25lZCBsb25nICptYXNrcCwgaW50IG5tYXNrYml0cykKK3sKKwlyZXR1cm4gX19iaXRtYXBfcGFyc2UoYnVmLCBidWZsZW4sIDAsIG1hc2twLCBubWFza2JpdHMpOworfQorCiAjZW5kaWYgLyogX19BU1NFTUJMWV9fICovCiAKICNlbmRpZiAvKiBfX0xJTlVYX0JJVE1BUF9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2Jsa2Rldi5oIGIvaW5jbHVkZS9saW51eC9ibGtkZXYuaAppbmRleCAyNmY3ODU2Li43YmZjZGUyIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2Jsa2Rldi5oCisrKyBiL2luY2x1ZGUvbGludXgvYmxrZGV2LmgKQEAgLTE1Nyw2ICsxNTcsNyBAQAogCVJFUV9UWVBFX0FUQV9DTUQsCiAJUkVRX1RZUEVfQVRBX1RBU0ssCiAJUkVRX1RZUEVfQVRBX1RBU0tGSUxFLAorCVJFUV9UWVBFX0FUQV9QQywKIH07CiAKIC8qCkBAIC02NTAsNiArNjUxLDI2IEBACiBleHRlcm4gaW50IHNjc2lfY21kX2lvY3RsKHN0cnVjdCBmaWxlICosIHN0cnVjdCBnZW5kaXNrICosIHVuc2lnbmVkIGludCwgdm9pZCBfX3VzZXIgKik7CiBleHRlcm4gaW50IHNnX3Njc2lfaW9jdGwoc3RydWN0IGZpbGUgKiwgc3RydWN0IHJlcXVlc3RfcXVldWUgKiwKIAkJc3RydWN0IGdlbmRpc2sgKiwgc3RydWN0IHNjc2lfaW9jdGxfY29tbWFuZCBfX3VzZXIgKik7CisKKy8qCisgKiBBIHF1ZXVlIGhhcyBqdXN0IGV4aXR0ZWQgY29uZ2VzdGlvbi4gIE5vdGUgdGhpcyBpbiB0aGUgZ2xvYmFsIGNvdW50ZXIgb2YKKyAqIGNvbmdlc3RlZCBxdWV1ZXMsIGFuZCB3YWtlIHVwIGFueW9uZSB3aG8gd2FzIHdhaXRpbmcgZm9yIHJlcXVlc3RzIHRvIGJlCisgKiBwdXQgYmFjay4KKyAqLworc3RhdGljIGlubGluZSB2b2lkIGJsa19jbGVhcl9xdWV1ZV9jb25nZXN0ZWQocmVxdWVzdF9xdWV1ZV90ICpxLCBpbnQgcncpCit7CisJY2xlYXJfYmRpX2Nvbmdlc3RlZCgmcS0+YmFja2luZ19kZXZfaW5mbywgcncpOworfQorCisvKgorICogQSBxdWV1ZSBoYXMganVzdCBlbnRlcmVkIGNvbmdlc3Rpb24uICBGbGFnIHRoYXQgaW4gdGhlIHF1ZXVlJ3MgVk0tdmlzaWJsZQorICogc3RhdGUgZmxhZ3MgYW5kIGluY3JlbWVudCB0aGUgZ2xvYmFsIGdvdW50ZXIgb2YgY29uZ2VzdGVkIHF1ZXVlcy4KKyAqLworc3RhdGljIGlubGluZSB2b2lkIGJsa19zZXRfcXVldWVfY29uZ2VzdGVkKHJlcXVlc3RfcXVldWVfdCAqcSwgaW50IHJ3KQoreworCXNldF9iZGlfY29uZ2VzdGVkKCZxLT5iYWNraW5nX2Rldl9pbmZvLCBydyk7Cit9CisKIGV4dGVybiB2b2lkIGJsa19zdGFydF9xdWV1ZShyZXF1ZXN0X3F1ZXVlX3QgKnEpOwogZXh0ZXJuIHZvaWQgYmxrX3N0b3BfcXVldWUocmVxdWVzdF9xdWV1ZV90ICpxKTsKIGV4dGVybiB2b2lkIGJsa19zeW5jX3F1ZXVlKHN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxKTsKQEAgLTc2NCwxMCArNzg1LDggQEAKIGV4dGVybiB2b2lkIGJsa19xdWV1ZV9mcmVlX3RhZ3MocmVxdWVzdF9xdWV1ZV90ICopOwogZXh0ZXJuIGludCBibGtfcXVldWVfcmVzaXplX3RhZ3MocmVxdWVzdF9xdWV1ZV90ICosIGludCk7CiBleHRlcm4gdm9pZCBibGtfcXVldWVfaW52YWxpZGF0ZV90YWdzKHJlcXVlc3RfcXVldWVfdCAqKTsKLWV4dGVybiBsb25nIGJsa19jb25nZXN0aW9uX3dhaXQoaW50IHJ3LCBsb25nIHRpbWVvdXQpOwogZXh0ZXJuIHN0cnVjdCBibGtfcXVldWVfdGFnICpibGtfaW5pdF90YWdzKGludCk7CiBleHRlcm4gdm9pZCBibGtfZnJlZV90YWdzKHN0cnVjdCBibGtfcXVldWVfdGFnICopOwotZXh0ZXJuIHZvaWQgYmxrX2Nvbmdlc3Rpb25fZW5kKGludCBydyk7CiAKIHN0YXRpYyBpbmxpbmUgc3RydWN0IHJlcXVlc3QgKmJsa19tYXBfcXVldWVfZmluZF90YWcoc3RydWN0IGJsa19xdWV1ZV90YWcgKmJxdCwKIAkJCQkJCWludCB0YWcpCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2J1ZmZlcl9oZWFkLmggYi9pbmNsdWRlL2xpbnV4L2J1ZmZlcl9oZWFkLmgKaW5kZXggMTMxZmZkMy4uNWQ5ZmIwZSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9idWZmZXJfaGVhZC5oCisrKyBiL2luY2x1ZGUvbGludXgvYnVmZmVyX2hlYWQuaApAQCAtNjksNiArNjksOCBAQAogCWJoX2VuZF9pb190ICpiX2VuZF9pbzsJCS8qIEkvTyBjb21wbGV0aW9uICovCiAgCXZvaWQgKmJfcHJpdmF0ZTsJCS8qIHJlc2VydmVkIGZvciBiX2VuZF9pbyAqLwogCXN0cnVjdCBsaXN0X2hlYWQgYl9hc3NvY19idWZmZXJzOyAvKiBhc3NvY2lhdGVkIHdpdGggYW5vdGhlciBtYXBwaW5nICovCisJc3RydWN0IGFkZHJlc3Nfc3BhY2UgKmJfYXNzb2NfbWFwOwkvKiBtYXBwaW5nIHRoaXMgYnVmZmVyIGlzCisJCQkJCQkgICBhc3NvY2lhdGVkIHdpdGggKi8KIAlhdG9taWNfdCBiX2NvdW50OwkJLyogdXNlcnMgdXNpbmcgdGhpcyBidWZmZXJfaGVhZCAqLwogfTsKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9jYXJ0YV9yYW5kb20zMi5oIGIvaW5jbHVkZS9saW51eC9jYXJ0YV9yYW5kb20zMi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY2ZjNiZDkKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2xpbnV4L2NhcnRhX3JhbmRvbTMyLmgKQEAgLTAsMCArMSwyOSBAQAorLyoKKyAqIEZhc3QsIHNpbXBsZSwgeWV0IGRlY2VudCBxdWFsaXR5IHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yIGJhc2VkIG9uCisgKiBhIHBhcGVyIGJ5IERhdmlkIEcuIENhcnRhICgiVHdvIEZhc3QgSW1wbGVtZW50YXRpb25zIG9mIHRoZQorICogYE1pbmltYWwgU3RhbmRhcmQnIFJhbmRvbSBOdW1iZXIgR2VuZXJhdG9yLCIgQ29tbXVuaWNhdGlvbnMgb2YgdGhlCisgKiBBQ00sIEphbnVhcnksIDE5OTApLgorICoKKyAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA2IEhld2xldHQtUGFja2FyZCBEZXZlbG9wbWVudCBDb21wYW55LCBMLlAuCisgKglDb250cmlidXRlZCBieSBTdGVwaGFuZSBFcmFuaWFuIDxlcmFuaWFuQGhwbC5ocC5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAqIDAyMTExLTEzMDcgVVNBCisgKi8KKyNpZm5kZWYgX0xJTlVYX0NBUlRBX1JBTkRPTTMyX0hfCisjZGVmaW5lIF9MSU5VWF9DQVJUQV9SQU5ET00zMl9IXworCit1NjQgY2FydGFfcmFuZG9tMzIodTY0IHNlZWQpOworCisjZW5kaWYgLyogX0xJTlVYX0NBUlRBX1JBTkRPTTMyX0hfICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2NvbXBhdC5oIGIvaW5jbHVkZS9saW51eC9jb21wYXQuaAppbmRleCBmNGViZjk2Li44MGIxN2Y0IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2NvbXBhdC5oCisrKyBiL2luY2x1ZGUvbGludXgvY29tcGF0LmgKQEAgLTE5Niw3ICsxOTYsNyBAQAogI2RlZmluZSBCSVRTX1RPX0NPTVBBVF9MT05HUyhiaXRzKSBcCiAJKCgoYml0cykrQklUU19QRVJfQ09NUEFUX0xPTkctMSkvQklUU19QRVJfQ09NUEFUX0xPTkcpCiAKLWxvbmcgY29tcGF0X2dldF9iaXRtYXAodW5zaWduZWQgbG9uZyAqbWFzaywgY29tcGF0X3Vsb25nX3QgX191c2VyICp1bWFzaywKK2xvbmcgY29tcGF0X2dldF9iaXRtYXAodW5zaWduZWQgbG9uZyAqbWFzaywgY29uc3QgY29tcGF0X3Vsb25nX3QgX191c2VyICp1bWFzaywKIAkJICAgICAgIHVuc2lnbmVkIGxvbmcgYml0bWFwX3NpemUpOwogbG9uZyBjb21wYXRfcHV0X2JpdG1hcChjb21wYXRfdWxvbmdfdCBfX3VzZXIgKnVtYXNrLCB1bnNpZ25lZCBsb25nICptYXNrLAogCQkgICAgICAgdW5zaWduZWQgbG9uZyBiaXRtYXBfc2l6ZSk7CkBAIC0yMzAsNSArMjMwLDkgQEAKIGV4dGVybiBpbnQgY29tcGF0X3ByaW50ayhjb25zdCBjaGFyICpmbXQsIC4uLik7CiBleHRlcm4gdm9pZCBzaWdzZXRfZnJvbV9jb21wYXQoc2lnc2V0X3QgKnNldCwgY29tcGF0X3NpZ3NldF90ICpjb21wYXQpOwogCithc21saW5rYWdlIGxvbmcgY29tcGF0X3N5c19taWdyYXRlX3BhZ2VzKGNvbXBhdF9waWRfdCBwaWQsCisJCWNvbXBhdF91bG9uZ190IG1heG5vZGUsIGNvbnN0IGNvbXBhdF91bG9uZ190IF9fdXNlciAqb2xkX25vZGVzLAorCQljb25zdCBjb21wYXRfdWxvbmdfdCBfX3VzZXIgKm5ld19ub2Rlcyk7CisKICNlbmRpZiAvKiBDT05GSUdfQ09NUEFUICovCiAjZW5kaWYgLyogX0xJTlVYX0NPTVBBVF9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2NvbXBhdF9pb2N0bC5oIGIvaW5jbHVkZS9saW51eC9jb21wYXRfaW9jdGwuaAppbmRleCA0ZTE2NjNkLi5jMjZjM2FkIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2NvbXBhdF9pb2N0bC5oCisrKyBiL2luY2x1ZGUvbGludXgvY29tcGF0X2lvY3RsLmgKQEAgLTYxLDE3ICs2MSwyMyBAQAogICogICAgICAgICBTb21lIG5lZWQgdHJhbnNsYXRpb25zLCB0aGVzZSBkbyBub3QuCiAgKi8KIENPTVBBVElCTEVfSU9DVEwoSERJT19HRVRfSURFTlRJVFkpCi1DT01QQVRJQkxFX0lPQ1RMKEhESU9fU0VUX0RNQSkKLUNPTVBBVElCTEVfSU9DVEwoSERJT19TRVRfVU5NQVNLSU5UUikKLUNPTVBBVElCTEVfSU9DVEwoSERJT19TRVRfTk9XRVJSKQotQ09NUEFUSUJMRV9JT0NUTChIRElPX1NFVF8zMkJJVCkKLUNPTVBBVElCTEVfSU9DVEwoSERJT19TRVRfTVVMVENPVU5UKQotQ09NUEFUSUJMRV9JT0NUTChIRElPX0RSSVZFX0NNRCkKIENPTVBBVElCTEVfSU9DVEwoSERJT19EUklWRV9UQVNLKQotQ09NUEFUSUJMRV9JT0NUTChIRElPX1NFVF9QSU9fTU9ERSkKLUNPTVBBVElCTEVfSU9DVEwoSERJT19TRVRfTklDRSkKLUNPTVBBVElCTEVfSU9DVEwoSERJT19TRVRfS0VFUFNFVFRJTkdTKQorQ09NUEFUSUJMRV9JT0NUTChIRElPX0RSSVZFX0NNRCkKK1VMT05HX0lPQ1RMKEhESU9fU0VUX01VTFRDT1VOVCkKK1VMT05HX0lPQ1RMKEhESU9fU0VUX1VOTUFTS0lOVFIpCitVTE9OR19JT0NUTChIRElPX1NFVF9LRUVQU0VUVElOR1MpCitVTE9OR19JT0NUTChIRElPX1NFVF8zMkJJVCkKK1VMT05HX0lPQ1RMKEhESU9fU0VUX05PV0VSUikKK1VMT05HX0lPQ1RMKEhESU9fU0VUX0RNQSkKK1VMT05HX0lPQ1RMKEhESU9fU0VUX1BJT19NT0RFKQorVUxPTkdfSU9DVEwoSERJT19TRVRfTklDRSkKK1VMT05HX0lPQ1RMKEhESU9fU0VUX1dDQUNIRSkKK1VMT05HX0lPQ1RMKEhESU9fU0VUX0FDT1VTVElDKQorVUxPTkdfSU9DVEwoSERJT19TRVRfQlVTU1RBVEUpCitVTE9OR19JT0NUTChIRElPX1NFVF9BRERSRVNTKQogQ09NUEFUSUJMRV9JT0NUTChIRElPX1NDQU5fSFdJRikKKy8qIDB4MzMwIGlzIHJlc2VydmVkIC0tIGl0IHVzZWQgdG8gYmUgSERJT19HRVRHRU9fQklHICovCitDT01QQVRJQkxFX0lPQ1RMKDB4MzMwKQogLyogMHgwMiAtLSBGbG9wcHkgaW9jdGxzICovCiBDT01QQVRJQkxFX0lPQ1RMKEZETVNHT04pCiBDT01QQVRJQkxFX0lPQ1RMKEZETVNHT0ZGKQpAQCAtMTI1LDYgKzEzMSw3IEBACiBDT01QQVRJQkxFX0lPQ1RMKFNUT1BfQVJSQVkpCiBDT01QQVRJQkxFX0lPQ1RMKFNUT1BfQVJSQVlfUk8pCiBDT01QQVRJQkxFX0lPQ1RMKFJFU1RBUlRfQVJSQVlfUlcpCitDT01QQVRJQkxFX0lPQ1RMKEdFVF9CSVRNQVBfRklMRSkKIFVMT05HX0lPQ1RMKFNFVF9CSVRNQVBfRklMRSkKIC8qIERNICovCiBDT01QQVRJQkxFX0lPQ1RMKERNX1ZFUlNJT05fMzIpCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2NwdW1hc2suaCBiL2luY2x1ZGUvbGludXgvY3B1bWFzay5oCmluZGV4IGIyNjhhM2MuLmQwZThjOGIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvY3B1bWFzay5oCisrKyBiL2luY2x1ZGUvbGludXgvY3B1bWFzay5oCkBAIC04LDggKzgsOCBAQAogICogU2VlIGRldGFpbGVkIGNvbW1lbnRzIGluIHRoZSBmaWxlIGxpbnV4L2JpdG1hcC5oIGRlc2NyaWJpbmcgdGhlCiAgKiBkYXRhIHR5cGUgb24gd2hpY2ggdGhlc2UgY3B1bWFza3MgYXJlIGJhc2VkLgogICoKLSAqIEZvciBkZXRhaWxzIG9mIGNwdW1hc2tfc2NucHJpbnRmKCkgYW5kIGNwdW1hc2tfcGFyc2UoKSwKLSAqIHNlZSBiaXRtYXBfc2NucHJpbnRmKCkgYW5kIGJpdG1hcF9wYXJzZSgpIGluIGxpYi9iaXRtYXAuYy4KKyAqIEZvciBkZXRhaWxzIG9mIGNwdW1hc2tfc2NucHJpbnRmKCkgYW5kIGNwdW1hc2tfcGFyc2VfdXNlcigpLAorICogc2VlIGJpdG1hcF9zY25wcmludGYoKSBhbmQgYml0bWFwX3BhcnNlX3VzZXIoKSBpbiBsaWIvYml0bWFwLmMuCiAgKiBGb3IgZGV0YWlscyBvZiBjcHVsaXN0X3NjbnByaW50ZigpIGFuZCBjcHVsaXN0X3BhcnNlKCksIHNlZQogICogYml0bWFwX3Njbmxpc3RwcmludGYoKSBhbmQgYml0bWFwX3BhcnNlbGlzdCgpLCBhbHNvIGluIGJpdG1hcC5jLgogICogRm9yIGRldGFpbHMgb2YgY3B1X3JlbWFwKCksIHNlZSBiaXRtYXBfYml0cmVtYXAgaW4gbGliL2JpdG1hcC5jCkBAIC00OSw3ICs0OSw3IEBACiAgKiB1bnNpZ25lZCBsb25nICpjcHVzX2FkZHIobWFzaykJQXJyYXkgb2YgdW5zaWduZWQgbG9uZydzIGluIG1hc2sKICAqCiAgKiBpbnQgY3B1bWFza19zY25wcmludGYoYnVmLCBsZW4sIG1hc2spIEZvcm1hdCBjcHVtYXNrIGZvciBwcmludGluZwotICogaW50IGNwdW1hc2tfcGFyc2UodWJ1ZiwgdWxlbiwgbWFzaykJUGFyc2UgYXNjaWkgc3RyaW5nIGFzIGNwdW1hc2sKKyAqIGludCBjcHVtYXNrX3BhcnNlX3VzZXIodWJ1ZiwgdWxlbiwgbWFzaykJUGFyc2UgYXNjaWkgc3RyaW5nIGFzIGNwdW1hc2sKICAqIGludCBjcHVsaXN0X3NjbnByaW50ZihidWYsIGxlbiwgbWFzaykgRm9ybWF0IGNwdW1hc2sgYXMgbGlzdCBmb3IgcHJpbnRpbmcKICAqIGludCBjcHVsaXN0X3BhcnNlKGJ1ZiwgbWFwKQkJUGFyc2UgYXNjaWkgc3RyaW5nIGFzIGNwdWxpc3QKICAqIGludCBjcHVfcmVtYXAob2xkYml0LCBvbGQsIG5ldykJbmV3Yml0ID0gbWFwKG9sZCwgbmV3KShvbGRiaXQpCkBAIC0yNzMsMTIgKzI3MywxMiBAQAogCXJldHVybiBiaXRtYXBfc2NucHJpbnRmKGJ1ZiwgbGVuLCBzcmNwLT5iaXRzLCBuYml0cyk7CiB9CiAKLSNkZWZpbmUgY3B1bWFza19wYXJzZSh1YnVmLCB1bGVuLCBkc3QpIFwKLQkJCV9fY3B1bWFza19wYXJzZSgodWJ1ZiksICh1bGVuKSwgJihkc3QpLCBOUl9DUFVTKQotc3RhdGljIGlubGluZSBpbnQgX19jcHVtYXNrX3BhcnNlKGNvbnN0IGNoYXIgX191c2VyICpidWYsIGludCBsZW4sCisjZGVmaW5lIGNwdW1hc2tfcGFyc2VfdXNlcih1YnVmLCB1bGVuLCBkc3QpIFwKKwkJCV9fY3B1bWFza19wYXJzZV91c2VyKCh1YnVmKSwgKHVsZW4pLCAmKGRzdCksIE5SX0NQVVMpCitzdGF0aWMgaW5saW5lIGludCBfX2NwdW1hc2tfcGFyc2VfdXNlcihjb25zdCBjaGFyIF9fdXNlciAqYnVmLCBpbnQgbGVuLAogCQkJCQljcHVtYXNrX3QgKmRzdHAsIGludCBuYml0cykKIHsKLQlyZXR1cm4gYml0bWFwX3BhcnNlKGJ1ZiwgbGVuLCBkc3RwLT5iaXRzLCBuYml0cyk7CisJcmV0dXJuIGJpdG1hcF9wYXJzZV91c2VyKGJ1ZiwgbGVuLCBkc3RwLT5iaXRzLCBuYml0cyk7CiB9CiAKICNkZWZpbmUgY3B1bGlzdF9zY25wcmludGYoYnVmLCBsZW4sIHNyYykgXApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9jcnlwdG8uaCBiL2luY2x1ZGUvbGludXgvY3J5cHRvLmgKaW5kZXggOGYyZmZhNC4uNjQ4NWU5NyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9jcnlwdG8uaAorKysgYi9pbmNsdWRlL2xpbnV4L2NyeXB0by5oCkBAIC0yNDUsNyArMjQ1LDcgQEAKIAlfX2RlcHJlY2F0ZWRfZm9yX21vZHVsZXM7CiBpbnQgY3J5cHRvX2hhc19hbGcoY29uc3QgY2hhciAqbmFtZSwgdTMyIHR5cGUsIHUzMiBtYXNrKTsKICNlbHNlCi1zdGF0aWMgaW50IGNyeXB0b19hbGdfYXZhaWxhYmxlKGNvbnN0IGNoYXIgKm5hbWUsIHUzMiBmbGFncyk7CitzdGF0aWMgaW50IGNyeXB0b19hbGdfYXZhaWxhYmxlKGNvbnN0IGNoYXIgKm5hbWUsIHUzMiBmbGFncykKIAlfX2RlcHJlY2F0ZWRfZm9yX21vZHVsZXM7CiBzdGF0aWMgaW5saW5lIGludCBjcnlwdG9fYWxnX2F2YWlsYWJsZShjb25zdCBjaGFyICpuYW1lLCB1MzIgZmxhZ3MpCiB7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2RjYWNoZS5oIGIvaW5jbHVkZS9saW51eC9kY2FjaGUuaAppbmRleCA0NDYwNWJlLi42M2Y2NGE5IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2RjYWNoZS5oCisrKyBiL2luY2x1ZGUvbGludXgvZGNhY2hlLmgKQEAgLTIzMCw2ICsyMzAsNyBAQAogZXh0ZXJuIHN0cnVjdCBkZW50cnkgKiBkX3NwbGljZV9hbGlhcyhzdHJ1Y3QgaW5vZGUgKiwgc3RydWN0IGRlbnRyeSAqKTsKIGV4dGVybiB2b2lkIHNocmlua19kY2FjaGVfc2Ioc3RydWN0IHN1cGVyX2Jsb2NrICopOwogZXh0ZXJuIHZvaWQgc2hyaW5rX2RjYWNoZV9wYXJlbnQoc3RydWN0IGRlbnRyeSAqKTsKK2V4dGVybiB2b2lkIHNocmlua19kY2FjaGVfZm9yX3Vtb3VudChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKik7CiBleHRlcm4gaW50IGRfaW52YWxpZGF0ZShzdHJ1Y3QgZGVudHJ5ICopOwogCiAvKiBvbmx5IHVzZWQgYXQgbW91bnQtdGltZSAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9kZXZpY2UuaCBiL2luY2x1ZGUvbGludXgvZGV2aWNlLmgKaW5kZXggNjYyZTZhMS4uOWQ0ZjZhOSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9kZXZpY2UuaAorKysgYi9pbmNsdWRlL2xpbnV4L2RldmljZS5oCkBAIC0zOTMsNyArMzkzLDcgQEAKIGV4dGVybiB2b2lkIGRldmljZV9pbml0aWFsaXplKHN0cnVjdCBkZXZpY2UgKiBkZXYpOwogZXh0ZXJuIGludCBfX211c3RfY2hlY2sgZGV2aWNlX2FkZChzdHJ1Y3QgZGV2aWNlICogZGV2KTsKIGV4dGVybiB2b2lkIGRldmljZV9kZWwoc3RydWN0IGRldmljZSAqIGRldik7Ci1leHRlcm4gaW50IF9fbXVzdF9jaGVjayBkZXZpY2VfZm9yX2VhY2hfY2hpbGQoc3RydWN0IGRldmljZSAqLCB2b2lkICosCitleHRlcm4gaW50IGRldmljZV9mb3JfZWFjaF9jaGlsZChzdHJ1Y3QgZGV2aWNlICosIHZvaWQgKiwKIAkJICAgICBpbnQgKCpmbikoc3RydWN0IGRldmljZSAqLCB2b2lkICopKTsKIGV4dGVybiBpbnQgZGV2aWNlX3JlbmFtZShzdHJ1Y3QgZGV2aWNlICpkZXYsIGNoYXIgKm5ld19uYW1lKTsKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9kbWkuaCBiL2luY2x1ZGUvbGludXgvZG1pLmgKaW5kZXggMzhkYzQwMy4uOTA0YmYzZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9kbWkuaAorKysgYi9pbmNsdWRlL2xpbnV4L2RtaS5oCkBAIC02OSw2ICs2OSw3IEBACiAJc3RydWN0IGRtaV9kZXZpY2UgKmZyb20pOwogZXh0ZXJuIHZvaWQgZG1pX3NjYW5fbWFjaGluZSh2b2lkKTsKIGV4dGVybiBpbnQgZG1pX2dldF95ZWFyKGludCBmaWVsZCk7CitleHRlcm4gaW50IGRtaV9uYW1lX2luX3ZlbmRvcnMoY2hhciAqc3RyKTsKIAogI2Vsc2UKIApAQCAtNzcsNiArNzgsNyBAQAogc3RhdGljIGlubGluZSBzdHJ1Y3QgZG1pX2RldmljZSAqIGRtaV9maW5kX2RldmljZShpbnQgdHlwZSwgY29uc3QgY2hhciAqbmFtZSwKIAlzdHJ1Y3QgZG1pX2RldmljZSAqZnJvbSkgeyByZXR1cm4gTlVMTDsgfQogc3RhdGljIGlubGluZSBpbnQgZG1pX2dldF95ZWFyKGludCB5ZWFyKSB7IHJldHVybiAwOyB9CitzdGF0aWMgaW5saW5lIGludCBkbWlfbmFtZV9pbl92ZW5kb3JzKGNoYXIgKnMpIHsgcmV0dXJuIDA7IH0KIAogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvZWxldmF0b3IuaCBiL2luY2x1ZGUvbGludXgvZWxldmF0b3IuaAppbmRleCBiMzM3MGVmLi4yZmE5ZjExIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2VsZXZhdG9yLmgKKysrIGIvaW5jbHVkZS9saW51eC9lbGV2YXRvci5oCkBAIC03MCw3ICs3MCw2IEBACiB7CiAJc3RydWN0IGxpc3RfaGVhZCBsaXN0OwogCXN0cnVjdCBlbGV2YXRvcl9vcHMgb3BzOwotCXN0cnVjdCBlbGV2YXRvcl90eXBlICplbGV2YXRvcl90eXBlOwogCXN0cnVjdCBlbHZfZnNfZW50cnkgKmVsZXZhdG9yX2F0dHJzOwogCWNoYXIgZWxldmF0b3JfbmFtZVtFTFZfTkFNRV9NQVhdOwogCXN0cnVjdCBtb2R1bGUgKmVsZXZhdG9yX293bmVyOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9leHQ0X2ZzLmggYi9pbmNsdWRlL2xpbnV4L2V4dDRfZnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OTg1MDNlCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9saW51eC9leHQ0X2ZzLmgKQEAgLTAsMCArMSw5OTQgQEAKKy8qCisgKiAgbGludXgvaW5jbHVkZS9saW51eC9leHQ0X2ZzLmgKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTIsIDE5OTMsIDE5OTQsIDE5OTUKKyAqIFJlbXkgQ2FyZCAoY2FyZEBtYXNpLmlicC5mcikKKyAqIExhYm9yYXRvaXJlIE1BU0kgLSBJbnN0aXR1dCBCbGFpc2UgUGFzY2FsCisgKiBVbml2ZXJzaXRlIFBpZXJyZSBldCBNYXJpZSBDdXJpZSAoUGFyaXMgVkkpCisgKgorICogIGZyb20KKyAqCisgKiAgbGludXgvaW5jbHVkZS9saW51eC9taW5peF9mcy5oCisgKgorICogIENvcHlyaWdodCAoQykgMTk5MSwgMTk5MiAgTGludXMgVG9ydmFsZHMKKyAqLworCisjaWZuZGVmIF9MSU5VWF9FWFQ0X0ZTX0gKKyNkZWZpbmUgX0xJTlVYX0VYVDRfRlNfSAorCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9ibGtkZXYuaD4KKyNpbmNsdWRlIDxsaW51eC9tYWdpYy5oPgorCisvKgorICogVGhlIHNlY29uZCBleHRlbmRlZCBmaWxlc3lzdGVtIGNvbnN0YW50cy9zdHJ1Y3R1cmVzCisgKi8KKworLyoKKyAqIERlZmluZSBFWFQ0RlNfREVCVUcgdG8gcHJvZHVjZSBkZWJ1ZyBtZXNzYWdlcworICovCisjdW5kZWYgRVhUNEZTX0RFQlVHCisKKy8qCisgKiBEZWZpbmUgRVhUNF9SRVNFUlZBVElPTiB0byByZXNlcnZlIGRhdGEgYmxvY2tzIGZvciBleHBhbmRpbmcgZmlsZXMKKyAqLworI2RlZmluZSBFWFQ0X0RFRkFVTFRfUkVTRVJWRV9CTE9DS1MgICAgIDgKKy8qbWF4IHdpbmRvdyBzaXplOiAxMDI0KGRpcmVjdCBibG9ja3MpICsgMyhbdCxkXWluZGlyZWN0IGJsb2NrcykgKi8KKyNkZWZpbmUgRVhUNF9NQVhfUkVTRVJWRV9CTE9DS1MgICAgICAgICAxMDI3CisjZGVmaW5lIEVYVDRfUkVTRVJWRV9XSU5ET1dfTk9UX0FMTE9DQVRFRCAwCisvKgorICogQWx3YXlzIGVuYWJsZSBoYXNoZWQgZGlyZWN0b3JpZXMKKyAqLworI2RlZmluZSBDT05GSUdfRVhUNF9JTkRFWAorCisvKgorICogRGVidWcgY29kZQorICovCisjaWZkZWYgRVhUNEZTX0RFQlVHCisjZGVmaW5lIGV4dDRfZGVidWcoZiwgYS4uLikJCQkJCQlcCisJZG8gewkJCQkJCQkJXAorCQlwcmludGsgKEtFUk5fREVCVUcgIkVYVDQtZnMgREVCVUcgKCVzLCAlZCk6ICVzOiIsCVwKKwkJCV9fRklMRV9fLCBfX0xJTkVfXywgX19GVU5DVElPTl9fKTsJCVwKKwkJcHJpbnRrIChLRVJOX0RFQlVHIGYsICMjIGEpOwkJCQlcCisJfSB3aGlsZSAoMCkKKyNlbHNlCisjZGVmaW5lIGV4dDRfZGVidWcoZiwgYS4uLikJZG8ge30gd2hpbGUgKDApCisjZW5kaWYKKworLyoKKyAqIFNwZWNpYWwgaW5vZGVzIG51bWJlcnMKKyAqLworI2RlZmluZQlFWFQ0X0JBRF9JTk8JCSAxCS8qIEJhZCBibG9ja3MgaW5vZGUgKi8KKyNkZWZpbmUgRVhUNF9ST09UX0lOTwkJIDIJLyogUm9vdCBpbm9kZSAqLworI2RlZmluZSBFWFQ0X0JPT1RfTE9BREVSX0lOTwkgNQkvKiBCb290IGxvYWRlciBpbm9kZSAqLworI2RlZmluZSBFWFQ0X1VOREVMX0RJUl9JTk8JIDYJLyogVW5kZWxldGUgZGlyZWN0b3J5IGlub2RlICovCisjZGVmaW5lIEVYVDRfUkVTSVpFX0lOTwkJIDcJLyogUmVzZXJ2ZWQgZ3JvdXAgZGVzY3JpcHRvcnMgaW5vZGUgKi8KKyNkZWZpbmUgRVhUNF9KT1VSTkFMX0lOTwkgOAkvKiBKb3VybmFsIGlub2RlICovCisKKy8qIEZpcnN0IG5vbi1yZXNlcnZlZCBpbm9kZSBmb3Igb2xkIGV4dDQgZmlsZXN5c3RlbXMgKi8KKyNkZWZpbmUgRVhUNF9HT09EX09MRF9GSVJTVF9JTk8JMTEKKworLyoKKyAqIE1heGltYWwgY291bnQgb2YgbGlua3MgdG8gYSBmaWxlCisgKi8KKyNkZWZpbmUgRVhUNF9MSU5LX01BWAkJMzIwMDAKKworLyoKKyAqIE1hY3JvLWluc3RydWN0aW9ucyB1c2VkIHRvIG1hbmFnZSBzZXZlcmFsIGJsb2NrIHNpemVzCisgKi8KKyNkZWZpbmUgRVhUNF9NSU5fQkxPQ0tfU0laRQkJMTAyNAorI2RlZmluZQlFWFQ0X01BWF9CTE9DS19TSVpFCQk0MDk2CisjZGVmaW5lIEVYVDRfTUlOX0JMT0NLX0xPR19TSVpFCQkgIDEwCisjaWZkZWYgX19LRVJORUxfXworIyBkZWZpbmUgRVhUNF9CTE9DS19TSVpFKHMpCQkoKHMpLT5zX2Jsb2Nrc2l6ZSkKKyNlbHNlCisjIGRlZmluZSBFWFQ0X0JMT0NLX1NJWkUocykJCShFWFQ0X01JTl9CTE9DS19TSVpFIDw8IChzKS0+c19sb2dfYmxvY2tfc2l6ZSkKKyNlbmRpZgorI2RlZmluZQlFWFQ0X0FERFJfUEVSX0JMT0NLKHMpCQkoRVhUNF9CTE9DS19TSVpFKHMpIC8gc2l6ZW9mIChfX3UzMikpCisjaWZkZWYgX19LRVJORUxfXworIyBkZWZpbmUgRVhUNF9CTE9DS19TSVpFX0JJVFMocykJKChzKS0+c19ibG9ja3NpemVfYml0cykKKyNlbHNlCisjIGRlZmluZSBFWFQ0X0JMT0NLX1NJWkVfQklUUyhzKQkoKHMpLT5zX2xvZ19ibG9ja19zaXplICsgMTApCisjZW5kaWYKKyNpZmRlZiBfX0tFUk5FTF9fCisjZGVmaW5lCUVYVDRfQUREUl9QRVJfQkxPQ0tfQklUUyhzKQkoRVhUNF9TQihzKS0+c19hZGRyX3Blcl9ibG9ja19iaXRzKQorI2RlZmluZSBFWFQ0X0lOT0RFX1NJWkUocykJCShFWFQ0X1NCKHMpLT5zX2lub2RlX3NpemUpCisjZGVmaW5lIEVYVDRfRklSU1RfSU5PKHMpCQkoRVhUNF9TQihzKS0+c19maXJzdF9pbm8pCisjZWxzZQorI2RlZmluZSBFWFQ0X0lOT0RFX1NJWkUocykJKCgocyktPnNfcmV2X2xldmVsID09IEVYVDRfR09PRF9PTERfUkVWKSA/IFwKKwkJCQkgRVhUNF9HT09EX09MRF9JTk9ERV9TSVpFIDogXAorCQkJCSAocyktPnNfaW5vZGVfc2l6ZSkKKyNkZWZpbmUgRVhUNF9GSVJTVF9JTk8ocykJKCgocyktPnNfcmV2X2xldmVsID09IEVYVDRfR09PRF9PTERfUkVWKSA/IFwKKwkJCQkgRVhUNF9HT09EX09MRF9GSVJTVF9JTk8gOiBcCisJCQkJIChzKS0+c19maXJzdF9pbm8pCisjZW5kaWYKKworLyoKKyAqIE1hY3JvLWluc3RydWN0aW9ucyB1c2VkIHRvIG1hbmFnZSBmcmFnbWVudHMKKyAqLworI2RlZmluZSBFWFQ0X01JTl9GUkFHX1NJWkUJCTEwMjQKKyNkZWZpbmUJRVhUNF9NQVhfRlJBR19TSVpFCQk0MDk2CisjZGVmaW5lIEVYVDRfTUlOX0ZSQUdfTE9HX1NJWkUJCSAgMTAKKyNpZmRlZiBfX0tFUk5FTF9fCisjIGRlZmluZSBFWFQ0X0ZSQUdfU0laRShzKQkJKEVYVDRfU0IocyktPnNfZnJhZ19zaXplKQorIyBkZWZpbmUgRVhUNF9GUkFHU19QRVJfQkxPQ0socykJKEVYVDRfU0IocyktPnNfZnJhZ3NfcGVyX2Jsb2NrKQorI2Vsc2UKKyMgZGVmaW5lIEVYVDRfRlJBR19TSVpFKHMpCQkoRVhUNF9NSU5fRlJBR19TSVpFIDw8IChzKS0+c19sb2dfZnJhZ19zaXplKQorIyBkZWZpbmUgRVhUNF9GUkFHU19QRVJfQkxPQ0socykJKEVYVDRfQkxPQ0tfU0laRShzKSAvIEVYVDRfRlJBR19TSVpFKHMpKQorI2VuZGlmCisKKy8qCisgKiBTdHJ1Y3R1cmUgb2YgYSBibG9ja3MgZ3JvdXAgZGVzY3JpcHRvcgorICovCitzdHJ1Y3QgZXh0NF9ncm91cF9kZXNjCit7CisJX19sZTMyCWJnX2Jsb2NrX2JpdG1hcDsJCS8qIEJsb2NrcyBiaXRtYXAgYmxvY2sgKi8KKwlfX2xlMzIJYmdfaW5vZGVfYml0bWFwOwkJLyogSW5vZGVzIGJpdG1hcCBibG9jayAqLworCV9fbGUzMgliZ19pbm9kZV90YWJsZTsJCS8qIElub2RlcyB0YWJsZSBibG9jayAqLworCV9fbGUxNgliZ19mcmVlX2Jsb2Nrc19jb3VudDsJLyogRnJlZSBibG9ja3MgY291bnQgKi8KKwlfX2xlMTYJYmdfZnJlZV9pbm9kZXNfY291bnQ7CS8qIEZyZWUgaW5vZGVzIGNvdW50ICovCisJX19sZTE2CWJnX3VzZWRfZGlyc19jb3VudDsJLyogRGlyZWN0b3JpZXMgY291bnQgKi8KKwlfX3UxNgliZ19mbGFnczsKKwlfX3UzMgliZ19yZXNlcnZlZFszXTsKKwlfX2xlMzIJYmdfYmxvY2tfYml0bWFwX2hpOwkvKiBCbG9ja3MgYml0bWFwIGJsb2NrIE1TQiAqLworCV9fbGUzMgliZ19pbm9kZV9iaXRtYXBfaGk7CS8qIElub2RlcyBiaXRtYXAgYmxvY2sgTVNCICovCisJX19sZTMyCWJnX2lub2RlX3RhYmxlX2hpOwkvKiBJbm9kZXMgdGFibGUgYmxvY2sgTVNCICovCit9OworCisjaWZkZWYgX19LRVJORUxfXworI2luY2x1ZGUgPGxpbnV4L2V4dDRfZnNfaS5oPgorI2luY2x1ZGUgPGxpbnV4L2V4dDRfZnNfc2IuaD4KKyNlbmRpZgorLyoKKyAqIE1hY3JvLWluc3RydWN0aW9ucyB1c2VkIHRvIG1hbmFnZSBncm91cCBkZXNjcmlwdG9ycworICovCisjZGVmaW5lIEVYVDRfTUlOX0RFU0NfU0laRQkJMzIKKyNkZWZpbmUgRVhUNF9NSU5fREVTQ19TSVpFXzY0QklUCTY0CisjZGVmaW5lCUVYVDRfTUFYX0RFU0NfU0laRQkJRVhUNF9NSU5fQkxPQ0tfU0laRQorI2RlZmluZSBFWFQ0X0RFU0NfU0laRShzKQkJKEVYVDRfU0IocyktPnNfZGVzY19zaXplKQorI2lmZGVmIF9fS0VSTkVMX18KKyMgZGVmaW5lIEVYVDRfQkxPQ0tTX1BFUl9HUk9VUChzKQkoRVhUNF9TQihzKS0+c19ibG9ja3NfcGVyX2dyb3VwKQorIyBkZWZpbmUgRVhUNF9ERVNDX1BFUl9CTE9DSyhzKQkJKEVYVDRfU0IocyktPnNfZGVzY19wZXJfYmxvY2spCisjIGRlZmluZSBFWFQ0X0lOT0RFU19QRVJfR1JPVVAocykJKEVYVDRfU0IocyktPnNfaW5vZGVzX3Blcl9ncm91cCkKKyMgZGVmaW5lIEVYVDRfREVTQ19QRVJfQkxPQ0tfQklUUyhzKQkoRVhUNF9TQihzKS0+c19kZXNjX3Blcl9ibG9ja19iaXRzKQorI2Vsc2UKKyMgZGVmaW5lIEVYVDRfQkxPQ0tTX1BFUl9HUk9VUChzKQkoKHMpLT5zX2Jsb2Nrc19wZXJfZ3JvdXApCisjIGRlZmluZSBFWFQ0X0RFU0NfUEVSX0JMT0NLKHMpCQkoRVhUNF9CTE9DS19TSVpFKHMpIC8gRVhUNF9ERVNDX1NJWkUocykpCisjIGRlZmluZSBFWFQ0X0lOT0RFU19QRVJfR1JPVVAocykJKChzKS0+c19pbm9kZXNfcGVyX2dyb3VwKQorI2VuZGlmCisKKy8qCisgKiBDb25zdGFudHMgcmVsYXRpdmUgdG8gdGhlIGRhdGEgYmxvY2tzCisgKi8KKyNkZWZpbmUJRVhUNF9ORElSX0JMT0NLUwkJMTIKKyNkZWZpbmUJRVhUNF9JTkRfQkxPQ0sJCQlFWFQ0X05ESVJfQkxPQ0tTCisjZGVmaW5lCUVYVDRfRElORF9CTE9DSwkJCShFWFQ0X0lORF9CTE9DSyArIDEpCisjZGVmaW5lCUVYVDRfVElORF9CTE9DSwkJCShFWFQ0X0RJTkRfQkxPQ0sgKyAxKQorI2RlZmluZQlFWFQ0X05fQkxPQ0tTCQkJKEVYVDRfVElORF9CTE9DSyArIDEpCisKKy8qCisgKiBJbm9kZSBmbGFncworICovCisjZGVmaW5lCUVYVDRfU0VDUk1fRkwJCQkweDAwMDAwMDAxIC8qIFNlY3VyZSBkZWxldGlvbiAqLworI2RlZmluZQlFWFQ0X1VOUk1fRkwJCQkweDAwMDAwMDAyIC8qIFVuZGVsZXRlICovCisjZGVmaW5lCUVYVDRfQ09NUFJfRkwJCQkweDAwMDAwMDA0IC8qIENvbXByZXNzIGZpbGUgKi8KKyNkZWZpbmUgRVhUNF9TWU5DX0ZMCQkJMHgwMDAwMDAwOCAvKiBTeW5jaHJvbm91cyB1cGRhdGVzICovCisjZGVmaW5lIEVYVDRfSU1NVVRBQkxFX0ZMCQkweDAwMDAwMDEwIC8qIEltbXV0YWJsZSBmaWxlICovCisjZGVmaW5lIEVYVDRfQVBQRU5EX0ZMCQkJMHgwMDAwMDAyMCAvKiB3cml0ZXMgdG8gZmlsZSBtYXkgb25seSBhcHBlbmQgKi8KKyNkZWZpbmUgRVhUNF9OT0RVTVBfRkwJCQkweDAwMDAwMDQwIC8qIGRvIG5vdCBkdW1wIGZpbGUgKi8KKyNkZWZpbmUgRVhUNF9OT0FUSU1FX0ZMCQkJMHgwMDAwMDA4MCAvKiBkbyBub3QgdXBkYXRlIGF0aW1lICovCisvKiBSZXNlcnZlZCBmb3IgY29tcHJlc3Npb24gdXNhZ2UuLi4gKi8KKyNkZWZpbmUgRVhUNF9ESVJUWV9GTAkJCTB4MDAwMDAxMDAKKyNkZWZpbmUgRVhUNF9DT01QUkJMS19GTAkJMHgwMDAwMDIwMCAvKiBPbmUgb3IgbW9yZSBjb21wcmVzc2VkIGNsdXN0ZXJzICovCisjZGVmaW5lIEVYVDRfTk9DT01QUl9GTAkJCTB4MDAwMDA0MDAgLyogRG9uJ3QgY29tcHJlc3MgKi8KKyNkZWZpbmUgRVhUNF9FQ09NUFJfRkwJCQkweDAwMDAwODAwIC8qIENvbXByZXNzaW9uIGVycm9yICovCisvKiBFbmQgY29tcHJlc3Npb24gZmxhZ3MgLS0tIG1heWJlIG5vdCBhbGwgdXNlZCAqLworI2RlZmluZSBFWFQ0X0lOREVYX0ZMCQkJMHgwMDAwMTAwMCAvKiBoYXNoLWluZGV4ZWQgZGlyZWN0b3J5ICovCisjZGVmaW5lIEVYVDRfSU1BR0lDX0ZMCQkJMHgwMDAwMjAwMCAvKiBBRlMgZGlyZWN0b3J5ICovCisjZGVmaW5lIEVYVDRfSk9VUk5BTF9EQVRBX0ZMCQkweDAwMDA0MDAwIC8qIGZpbGUgZGF0YSBzaG91bGQgYmUgam91cm5hbGVkICovCisjZGVmaW5lIEVYVDRfTk9UQUlMX0ZMCQkJMHgwMDAwODAwMCAvKiBmaWxlIHRhaWwgc2hvdWxkIG5vdCBiZSBtZXJnZWQgKi8KKyNkZWZpbmUgRVhUNF9ESVJTWU5DX0ZMCQkJMHgwMDAxMDAwMCAvKiBkaXJzeW5jIGJlaGF2aW91ciAoZGlyZWN0b3JpZXMgb25seSkgKi8KKyNkZWZpbmUgRVhUNF9UT1BESVJfRkwJCQkweDAwMDIwMDAwIC8qIFRvcCBvZiBkaXJlY3RvcnkgaGllcmFyY2hpZXMqLworI2RlZmluZSBFWFQ0X1JFU0VSVkVEX0ZMCQkweDgwMDAwMDAwIC8qIHJlc2VydmVkIGZvciBleHQ0IGxpYiAqLworI2RlZmluZSBFWFQ0X0VYVEVOVFNfRkwJCQkweDAwMDgwMDAwIC8qIElub2RlIHVzZXMgZXh0ZW50cyAqLworCisjZGVmaW5lIEVYVDRfRkxfVVNFUl9WSVNJQkxFCQkweDAwMEJERkZGIC8qIFVzZXIgdmlzaWJsZSBmbGFncyAqLworI2RlZmluZSBFWFQ0X0ZMX1VTRVJfTU9ESUZJQUJMRQkJMHgwMDAzODBGRiAvKiBVc2VyIG1vZGlmaWFibGUgZmxhZ3MgKi8KKworLyoKKyAqIElub2RlIGR5bmFtaWMgc3RhdGUgZmxhZ3MKKyAqLworI2RlZmluZSBFWFQ0X1NUQVRFX0pEQVRBCQkweDAwMDAwMDAxIC8qIGpvdXJuYWxlZCBkYXRhIGV4aXN0cyAqLworI2RlZmluZSBFWFQ0X1NUQVRFX05FVwkJCTB4MDAwMDAwMDIgLyogaW5vZGUgaXMgbmV3bHkgY3JlYXRlZCAqLworI2RlZmluZSBFWFQ0X1NUQVRFX1hBVFRSCQkweDAwMDAwMDA0IC8qIGhhcyBpbi1pbm9kZSB4YXR0cnMgKi8KKworLyogVXNlZCB0byBwYXNzIGdyb3VwIGRlc2NyaXB0b3IgZGF0YSB3aGVuIG9ubGluZSByZXNpemUgaXMgZG9uZSAqLworc3RydWN0IGV4dDRfbmV3X2dyb3VwX2lucHV0IHsKKwlfX3UzMiBncm91cDsgICAgICAgICAgICAvKiBHcm91cCBudW1iZXIgZm9yIHRoaXMgZGF0YSAqLworCV9fdTY0IGJsb2NrX2JpdG1hcDsgICAgIC8qIEFic29sdXRlIGJsb2NrIG51bWJlciBvZiBibG9jayBiaXRtYXAgKi8KKwlfX3U2NCBpbm9kZV9iaXRtYXA7ICAgICAvKiBBYnNvbHV0ZSBibG9jayBudW1iZXIgb2YgaW5vZGUgYml0bWFwICovCisJX191NjQgaW5vZGVfdGFibGU7ICAgICAgLyogQWJzb2x1dGUgYmxvY2sgbnVtYmVyIG9mIGlub2RlIHRhYmxlIHN0YXJ0ICovCisJX191MzIgYmxvY2tzX2NvdW50OyAgICAgLyogVG90YWwgbnVtYmVyIG9mIGJsb2NrcyBpbiB0aGlzIGdyb3VwICovCisJX191MTYgcmVzZXJ2ZWRfYmxvY2tzOyAgLyogTnVtYmVyIG9mIHJlc2VydmVkIGJsb2NrcyBpbiB0aGlzIGdyb3VwICovCisJX191MTYgdW51c2VkOworfTsKKworLyogVGhlIHN0cnVjdCBleHQ0X25ld19ncm91cF9pbnB1dCBpbiBrZXJuZWwgc3BhY2UsIHdpdGggZnJlZV9ibG9ja3NfY291bnQgKi8KK3N0cnVjdCBleHQ0X25ld19ncm91cF9kYXRhIHsKKwlfX3UzMiBncm91cDsKKwlfX3U2NCBibG9ja19iaXRtYXA7CisJX191NjQgaW5vZGVfYml0bWFwOworCV9fdTY0IGlub2RlX3RhYmxlOworCV9fdTMyIGJsb2Nrc19jb3VudDsKKwlfX3UxNiByZXNlcnZlZF9ibG9ja3M7CisJX191MTYgdW51c2VkOworCV9fdTMyIGZyZWVfYmxvY2tzX2NvdW50OworfTsKKworCisvKgorICogaW9jdGwgY29tbWFuZHMKKyAqLworI2RlZmluZQlFWFQ0X0lPQ19HRVRGTEFHUwkJRlNfSU9DX0dFVEZMQUdTCisjZGVmaW5lCUVYVDRfSU9DX1NFVEZMQUdTCQlGU19JT0NfU0VURkxBR1MKKyNkZWZpbmUJRVhUNF9JT0NfR0VUVkVSU0lPTgkJX0lPUignZicsIDMsIGxvbmcpCisjZGVmaW5lCUVYVDRfSU9DX1NFVFZFUlNJT04JCV9JT1coJ2YnLCA0LCBsb25nKQorI2RlZmluZSBFWFQ0X0lPQ19HUk9VUF9FWFRFTkQJCV9JT1coJ2YnLCA3LCB1bnNpZ25lZCBsb25nKQorI2RlZmluZSBFWFQ0X0lPQ19HUk9VUF9BREQJCV9JT1coJ2YnLCA4LHN0cnVjdCBleHQ0X25ld19ncm91cF9pbnB1dCkKKyNkZWZpbmUJRVhUNF9JT0NfR0VUVkVSU0lPTl9PTEQJCUZTX0lPQ19HRVRWRVJTSU9OCisjZGVmaW5lCUVYVDRfSU9DX1NFVFZFUlNJT05fT0xECQlGU19JT0NfU0VUVkVSU0lPTgorI2lmZGVmIENPTkZJR19KQkRfREVCVUcKKyNkZWZpbmUgRVhUNF9JT0NfV0FJVF9GT1JfUkVBRE9OTFkJX0lPUignZicsIDk5LCBsb25nKQorI2VuZGlmCisjZGVmaW5lIEVYVDRfSU9DX0dFVFJTVlNaCQlfSU9SKCdmJywgNSwgbG9uZykKKyNkZWZpbmUgRVhUNF9JT0NfU0VUUlNWU1oJCV9JT1coJ2YnLCA2LCBsb25nKQorCisvKgorICogaW9jdGwgY29tbWFuZHMgaW4gMzIgYml0IGVtdWxhdGlvbgorICovCisjZGVmaW5lIEVYVDRfSU9DMzJfR0VURkxBR1MJCUZTX0lPQzMyX0dFVEZMQUdTCisjZGVmaW5lIEVYVDRfSU9DMzJfU0VURkxBR1MJCUZTX0lPQzMyX1NFVEZMQUdTCisjZGVmaW5lIEVYVDRfSU9DMzJfR0VUVkVSU0lPTgkJX0lPUignZicsIDMsIGludCkKKyNkZWZpbmUgRVhUNF9JT0MzMl9TRVRWRVJTSU9OCQlfSU9XKCdmJywgNCwgaW50KQorI2RlZmluZSBFWFQ0X0lPQzMyX0dFVFJTVlNaCQlfSU9SKCdmJywgNSwgaW50KQorI2RlZmluZSBFWFQ0X0lPQzMyX1NFVFJTVlNaCQlfSU9XKCdmJywgNiwgaW50KQorI2RlZmluZSBFWFQ0X0lPQzMyX0dST1VQX0VYVEVORAkJX0lPVygnZicsIDcsIHVuc2lnbmVkIGludCkKKyNpZmRlZiBDT05GSUdfSkJEX0RFQlVHCisjZGVmaW5lIEVYVDRfSU9DMzJfV0FJVF9GT1JfUkVBRE9OTFkJX0lPUignZicsIDk5LCBpbnQpCisjZW5kaWYKKyNkZWZpbmUgRVhUNF9JT0MzMl9HRVRWRVJTSU9OX09MRAlGU19JT0MzMl9HRVRWRVJTSU9OCisjZGVmaW5lIEVYVDRfSU9DMzJfU0VUVkVSU0lPTl9PTEQJRlNfSU9DMzJfU0VUVkVSU0lPTgorCisKKy8qCisgKiAgTW91bnQgb3B0aW9ucworICovCitzdHJ1Y3QgZXh0NF9tb3VudF9vcHRpb25zIHsKKwl1bnNpZ25lZCBsb25nIHNfbW91bnRfb3B0OworCXVpZF90IHNfcmVzdWlkOworCWdpZF90IHNfcmVzZ2lkOworCXVuc2lnbmVkIGxvbmcgc19jb21taXRfaW50ZXJ2YWw7CisjaWZkZWYgQ09ORklHX1FVT1RBCisJaW50IHNfanF1b3RhX2ZtdDsKKwljaGFyICpzX3FmX25hbWVzW01BWFFVT1RBU107CisjZW5kaWYKK307CisKKy8qCisgKiBTdHJ1Y3R1cmUgb2YgYW4gaW5vZGUgb24gdGhlIGRpc2sKKyAqLworc3RydWN0IGV4dDRfaW5vZGUgeworCV9fbGUxNglpX21vZGU7CQkvKiBGaWxlIG1vZGUgKi8KKwlfX2xlMTYJaV91aWQ7CQkvKiBMb3cgMTYgYml0cyBvZiBPd25lciBVaWQgKi8KKwlfX2xlMzIJaV9zaXplOwkJLyogU2l6ZSBpbiBieXRlcyAqLworCV9fbGUzMglpX2F0aW1lOwkvKiBBY2Nlc3MgdGltZSAqLworCV9fbGUzMglpX2N0aW1lOwkvKiBDcmVhdGlvbiB0aW1lICovCisJX19sZTMyCWlfbXRpbWU7CS8qIE1vZGlmaWNhdGlvbiB0aW1lICovCisJX19sZTMyCWlfZHRpbWU7CS8qIERlbGV0aW9uIFRpbWUgKi8KKwlfX2xlMTYJaV9naWQ7CQkvKiBMb3cgMTYgYml0cyBvZiBHcm91cCBJZCAqLworCV9fbGUxNglpX2xpbmtzX2NvdW50OwkvKiBMaW5rcyBjb3VudCAqLworCV9fbGUzMglpX2Jsb2NrczsJLyogQmxvY2tzIGNvdW50ICovCisJX19sZTMyCWlfZmxhZ3M7CS8qIEZpbGUgZmxhZ3MgKi8KKwl1bmlvbiB7CisJCXN0cnVjdCB7CisJCQlfX3UzMiAgbF9pX3Jlc2VydmVkMTsKKwkJfSBsaW51eDE7CisJCXN0cnVjdCB7CisJCQlfX3UzMiAgaF9pX3RyYW5zbGF0b3I7CisJCX0gaHVyZDE7CisJCXN0cnVjdCB7CisJCQlfX3UzMiAgbV9pX3Jlc2VydmVkMTsKKwkJfSBtYXNpeDE7CisJfSBvc2QxOwkJCQkvKiBPUyBkZXBlbmRlbnQgMSAqLworCV9fbGUzMglpX2Jsb2NrW0VYVDRfTl9CTE9DS1NdOy8qIFBvaW50ZXJzIHRvIGJsb2NrcyAqLworCV9fbGUzMglpX2dlbmVyYXRpb247CS8qIEZpbGUgdmVyc2lvbiAoZm9yIE5GUykgKi8KKwlfX2xlMzIJaV9maWxlX2FjbDsJLyogRmlsZSBBQ0wgKi8KKwlfX2xlMzIJaV9kaXJfYWNsOwkvKiBEaXJlY3RvcnkgQUNMICovCisJX19sZTMyCWlfZmFkZHI7CS8qIEZyYWdtZW50IGFkZHJlc3MgKi8KKwl1bmlvbiB7CisJCXN0cnVjdCB7CisJCQlfX3U4CWxfaV9mcmFnOwkvKiBGcmFnbWVudCBudW1iZXIgKi8KKwkJCV9fdTgJbF9pX2ZzaXplOwkvKiBGcmFnbWVudCBzaXplICovCisJCQlfX2xlMTYJbF9pX2ZpbGVfYWNsX2hpZ2g7CisJCQlfX2xlMTYJbF9pX3VpZF9oaWdoOwkvKiB0aGVzZSAyIGZpZWxkcyAgICAqLworCQkJX19sZTE2CWxfaV9naWRfaGlnaDsJLyogd2VyZSByZXNlcnZlZDJbMF0gKi8KKwkJCV9fdTMyCWxfaV9yZXNlcnZlZDI7CisJCX0gbGludXgyOworCQlzdHJ1Y3QgeworCQkJX191OAloX2lfZnJhZzsJLyogRnJhZ21lbnQgbnVtYmVyICovCisJCQlfX3U4CWhfaV9mc2l6ZTsJLyogRnJhZ21lbnQgc2l6ZSAqLworCQkJX191MTYJaF9pX21vZGVfaGlnaDsKKwkJCV9fdTE2CWhfaV91aWRfaGlnaDsKKwkJCV9fdTE2CWhfaV9naWRfaGlnaDsKKwkJCV9fdTMyCWhfaV9hdXRob3I7CisJCX0gaHVyZDI7CisJCXN0cnVjdCB7CisJCQlfX3U4CW1faV9mcmFnOwkvKiBGcmFnbWVudCBudW1iZXIgKi8KKwkJCV9fdTgJbV9pX2ZzaXplOwkvKiBGcmFnbWVudCBzaXplICovCisJCQlfX2xlMTYJbV9pX2ZpbGVfYWNsX2hpZ2g7CisJCQlfX3UzMgltX2lfcmVzZXJ2ZWQyWzJdOworCQl9IG1hc2l4MjsKKwl9IG9zZDI7CQkJCS8qIE9TIGRlcGVuZGVudCAyICovCisJX19sZTE2CWlfZXh0cmFfaXNpemU7CisJX19sZTE2CWlfcGFkMTsKK307CisKKyNkZWZpbmUgaV9zaXplX2hpZ2gJaV9kaXJfYWNsCisKKyNpZiBkZWZpbmVkKF9fS0VSTkVMX18pIHx8IGRlZmluZWQoX19saW51eF9fKQorI2RlZmluZSBpX3Jlc2VydmVkMQlvc2QxLmxpbnV4MS5sX2lfcmVzZXJ2ZWQxCisjZGVmaW5lIGlfZnJhZwkJb3NkMi5saW51eDIubF9pX2ZyYWcKKyNkZWZpbmUgaV9mc2l6ZQkJb3NkMi5saW51eDIubF9pX2ZzaXplCisjZGVmaW5lIGlfZmlsZV9hY2xfaGlnaAlvc2QyLmxpbnV4Mi5sX2lfZmlsZV9hY2xfaGlnaAorI2RlZmluZSBpX3VpZF9sb3cJaV91aWQKKyNkZWZpbmUgaV9naWRfbG93CWlfZ2lkCisjZGVmaW5lIGlfdWlkX2hpZ2gJb3NkMi5saW51eDIubF9pX3VpZF9oaWdoCisjZGVmaW5lIGlfZ2lkX2hpZ2gJb3NkMi5saW51eDIubF9pX2dpZF9oaWdoCisjZGVmaW5lIGlfcmVzZXJ2ZWQyCW9zZDIubGludXgyLmxfaV9yZXNlcnZlZDIKKworI2VsaWYgZGVmaW5lZChfX0dOVV9fKQorCisjZGVmaW5lIGlfdHJhbnNsYXRvcglvc2QxLmh1cmQxLmhfaV90cmFuc2xhdG9yCisjZGVmaW5lIGlfZnJhZwkJb3NkMi5odXJkMi5oX2lfZnJhZzsKKyNkZWZpbmUgaV9mc2l6ZQkJb3NkMi5odXJkMi5oX2lfZnNpemU7CisjZGVmaW5lIGlfdWlkX2hpZ2gJb3NkMi5odXJkMi5oX2lfdWlkX2hpZ2gKKyNkZWZpbmUgaV9naWRfaGlnaAlvc2QyLmh1cmQyLmhfaV9naWRfaGlnaAorI2RlZmluZSBpX2F1dGhvcglvc2QyLmh1cmQyLmhfaV9hdXRob3IKKworI2VsaWYgZGVmaW5lZChfX21hc2l4X18pCisKKyNkZWZpbmUgaV9yZXNlcnZlZDEJb3NkMS5tYXNpeDEubV9pX3Jlc2VydmVkMQorI2RlZmluZSBpX2ZyYWcJCW9zZDIubWFzaXgyLm1faV9mcmFnCisjZGVmaW5lIGlfZnNpemUJCW9zZDIubWFzaXgyLm1faV9mc2l6ZQorI2RlZmluZSBpX2ZpbGVfYWNsX2hpZ2gJb3NkMi5tYXNpeDIubV9pX2ZpbGVfYWNsX2hpZ2gKKyNkZWZpbmUgaV9yZXNlcnZlZDIJb3NkMi5tYXNpeDIubV9pX3Jlc2VydmVkMgorCisjZW5kaWYgLyogZGVmaW5lZChfX0tFUk5FTF9fKSB8fCBkZWZpbmVkKF9fbGludXhfXykgKi8KKworLyoKKyAqIEZpbGUgc3lzdGVtIHN0YXRlcworICovCisjZGVmaW5lCUVYVDRfVkFMSURfRlMJCQkweDAwMDEJLyogVW5tb3VudGVkIGNsZWFubHkgKi8KKyNkZWZpbmUJRVhUNF9FUlJPUl9GUwkJCTB4MDAwMgkvKiBFcnJvcnMgZGV0ZWN0ZWQgKi8KKyNkZWZpbmUJRVhUNF9PUlBIQU5fRlMJCQkweDAwMDQJLyogT3JwaGFucyBiZWluZyByZWNvdmVyZWQgKi8KKworLyoKKyAqIE1vdW50IGZsYWdzCisgKi8KKyNkZWZpbmUgRVhUNF9NT1VOVF9DSEVDSwkJMHgwMDAwMQkvKiBEbyBtb3VudC10aW1lIGNoZWNrcyAqLworI2RlZmluZSBFWFQ0X01PVU5UX09MREFMTE9DCQkweDAwMDAyICAvKiBEb24ndCB1c2UgdGhlIG5ldyBPcmxvdiBhbGxvY2F0b3IgKi8KKyNkZWZpbmUgRVhUNF9NT1VOVF9HUlBJRAkJMHgwMDAwNAkvKiBDcmVhdGUgZmlsZXMgd2l0aCBkaXJlY3RvcnkncyBncm91cCAqLworI2RlZmluZSBFWFQ0X01PVU5UX0RFQlVHCQkweDAwMDA4CS8qIFNvbWUgZGVidWdnaW5nIG1lc3NhZ2VzICovCisjZGVmaW5lIEVYVDRfTU9VTlRfRVJST1JTX0NPTlQJCTB4MDAwMTAJLyogQ29udGludWUgb24gZXJyb3JzICovCisjZGVmaW5lIEVYVDRfTU9VTlRfRVJST1JTX1JPCQkweDAwMDIwCS8qIFJlbW91bnQgZnMgcm8gb24gZXJyb3JzICovCisjZGVmaW5lIEVYVDRfTU9VTlRfRVJST1JTX1BBTklDCQkweDAwMDQwCS8qIFBhbmljIG9uIGVycm9ycyAqLworI2RlZmluZSBFWFQ0X01PVU5UX01JTklYX0RGCQkweDAwMDgwCS8qIE1pbWljcyB0aGUgTWluaXggc3RhdGZzICovCisjZGVmaW5lIEVYVDRfTU9VTlRfTk9MT0FECQkweDAwMTAwCS8qIERvbid0IHVzZSBleGlzdGluZyBqb3VybmFsKi8KKyNkZWZpbmUgRVhUNF9NT1VOVF9BQk9SVAkJMHgwMDIwMAkvKiBGYXRhbCBlcnJvciBkZXRlY3RlZCAqLworI2RlZmluZSBFWFQ0X01PVU5UX0RBVEFfRkxBR1MJCTB4MDBDMDAJLyogTW9kZSBmb3IgZGF0YSB3cml0ZXM6ICovCisjZGVmaW5lIEVYVDRfTU9VTlRfSk9VUk5BTF9EQVRBCQkweDAwNDAwCS8qIFdyaXRlIGRhdGEgdG8gam91cm5hbCAqLworI2RlZmluZSBFWFQ0X01PVU5UX09SREVSRURfREFUQQkJMHgwMDgwMAkvKiBGbHVzaCBkYXRhIGJlZm9yZSBjb21taXQgKi8KKyNkZWZpbmUgRVhUNF9NT1VOVF9XUklURUJBQ0tfREFUQQkweDAwQzAwCS8qIE5vIGRhdGEgb3JkZXJpbmcgKi8KKyNkZWZpbmUgRVhUNF9NT1VOVF9VUERBVEVfSk9VUk5BTAkweDAxMDAwCS8qIFVwZGF0ZSB0aGUgam91cm5hbCBmb3JtYXQgKi8KKyNkZWZpbmUgRVhUNF9NT1VOVF9OT19VSUQzMgkJMHgwMjAwMCAgLyogRGlzYWJsZSAzMi1iaXQgVUlEcyAqLworI2RlZmluZSBFWFQ0X01PVU5UX1hBVFRSX1VTRVIJCTB4MDQwMDAJLyogRXh0ZW5kZWQgdXNlciBhdHRyaWJ1dGVzICovCisjZGVmaW5lIEVYVDRfTU9VTlRfUE9TSVhfQUNMCQkweDA4MDAwCS8qIFBPU0lYIEFjY2VzcyBDb250cm9sIExpc3RzICovCisjZGVmaW5lIEVYVDRfTU9VTlRfUkVTRVJWQVRJT04JCTB4MTAwMDAJLyogUHJlYWxsb2NhdGlvbiAqLworI2RlZmluZSBFWFQ0X01PVU5UX0JBUlJJRVIJCTB4MjAwMDAgLyogVXNlIGJsb2NrIGJhcnJpZXJzICovCisjZGVmaW5lIEVYVDRfTU9VTlRfTk9CSAkJCTB4NDAwMDAgLyogTm8gYnVmZmVyaGVhZHMgKi8KKyNkZWZpbmUgRVhUNF9NT1VOVF9RVU9UQQkJMHg4MDAwMCAvKiBTb21lIHF1b3RhIG9wdGlvbiBzZXQgKi8KKyNkZWZpbmUgRVhUNF9NT1VOVF9VU1JRVU9UQQkJMHgxMDAwMDAgLyogIm9sZCIgdXNlciBxdW90YSAqLworI2RlZmluZSBFWFQ0X01PVU5UX0dSUFFVT1RBCQkweDIwMDAwMCAvKiAib2xkIiBncm91cCBxdW90YSAqLworI2RlZmluZSBFWFQ0X01PVU5UX0VYVEVOVFMJCTB4NDAwMDAwIC8qIEV4dGVudHMgc3VwcG9ydCAqLworCisvKiBDb21wYXRpYmlsaXR5LCBmb3IgaGF2aW5nIGJvdGggZXh0Ml9mcy5oIGFuZCBleHQ0X2ZzLmggaW5jbHVkZWQgYXQgb25jZSAqLworI2lmbmRlZiBfTElOVVhfRVhUMl9GU19ICisjZGVmaW5lIGNsZWFyX29wdChvLCBvcHQpCQlvICY9IH5FWFQ0X01PVU5UXyMjb3B0CisjZGVmaW5lIHNldF9vcHQobywgb3B0KQkJCW8gfD0gRVhUNF9NT1VOVF8jI29wdAorI2RlZmluZSB0ZXN0X29wdChzYiwgb3B0KQkJKEVYVDRfU0Ioc2IpLT5zX21vdW50X29wdCAmIFwKKwkJCQkJIEVYVDRfTU9VTlRfIyNvcHQpCisjZWxzZQorI2RlZmluZSBFWFQyX01PVU5UX05PTE9BRAkJRVhUNF9NT1VOVF9OT0xPQUQKKyNkZWZpbmUgRVhUMl9NT1VOVF9BQk9SVAkJRVhUNF9NT1VOVF9BQk9SVAorI2RlZmluZSBFWFQyX01PVU5UX0RBVEFfRkxBR1MJCUVYVDRfTU9VTlRfREFUQV9GTEFHUworI2VuZGlmCisKKyNkZWZpbmUgZXh0NF9zZXRfYml0CQkJZXh0Ml9zZXRfYml0CisjZGVmaW5lIGV4dDRfc2V0X2JpdF9hdG9taWMJCWV4dDJfc2V0X2JpdF9hdG9taWMKKyNkZWZpbmUgZXh0NF9jbGVhcl9iaXQJCQlleHQyX2NsZWFyX2JpdAorI2RlZmluZSBleHQ0X2NsZWFyX2JpdF9hdG9taWMJCWV4dDJfY2xlYXJfYml0X2F0b21pYworI2RlZmluZSBleHQ0X3Rlc3RfYml0CQkJZXh0Ml90ZXN0X2JpdAorI2RlZmluZSBleHQ0X2ZpbmRfZmlyc3RfemVyb19iaXQJZXh0Ml9maW5kX2ZpcnN0X3plcm9fYml0CisjZGVmaW5lIGV4dDRfZmluZF9uZXh0X3plcm9fYml0CQlleHQyX2ZpbmRfbmV4dF96ZXJvX2JpdAorCisvKgorICogTWF4aW1hbCBtb3VudCBjb3VudHMgYmV0d2VlbiB0d28gZmlsZXN5c3RlbSBjaGVja3MKKyAqLworI2RlZmluZSBFWFQ0X0RGTF9NQVhfTU5UX0NPVU5UCQkyMAkvKiBBbGxvdyAyMCBtb3VudHMgKi8KKyNkZWZpbmUgRVhUNF9ERkxfQ0hFQ0tJTlRFUlZBTAkJMAkvKiBEb24ndCB1c2UgaW50ZXJ2YWwgY2hlY2sgKi8KKworLyoKKyAqIEJlaGF2aW91ciB3aGVuIGRldGVjdGluZyBlcnJvcnMKKyAqLworI2RlZmluZSBFWFQ0X0VSUk9SU19DT05USU5VRQkJMQkvKiBDb250aW51ZSBleGVjdXRpb24gKi8KKyNkZWZpbmUgRVhUNF9FUlJPUlNfUk8JCQkyCS8qIFJlbW91bnQgZnMgcmVhZC1vbmx5ICovCisjZGVmaW5lIEVYVDRfRVJST1JTX1BBTklDCQkzCS8qIFBhbmljICovCisjZGVmaW5lIEVYVDRfRVJST1JTX0RFRkFVTFQJCUVYVDRfRVJST1JTX0NPTlRJTlVFCisKKy8qCisgKiBTdHJ1Y3R1cmUgb2YgdGhlIHN1cGVyIGJsb2NrCisgKi8KK3N0cnVjdCBleHQ0X3N1cGVyX2Jsb2NrIHsKKy8qMDAqLwlfX2xlMzIJc19pbm9kZXNfY291bnQ7CQkvKiBJbm9kZXMgY291bnQgKi8KKwlfX2xlMzIJc19ibG9ja3NfY291bnQ7CQkvKiBCbG9ja3MgY291bnQgKi8KKwlfX2xlMzIJc19yX2Jsb2Nrc19jb3VudDsJLyogUmVzZXJ2ZWQgYmxvY2tzIGNvdW50ICovCisJX19sZTMyCXNfZnJlZV9ibG9ja3NfY291bnQ7CS8qIEZyZWUgYmxvY2tzIGNvdW50ICovCisvKjEwKi8JX19sZTMyCXNfZnJlZV9pbm9kZXNfY291bnQ7CS8qIEZyZWUgaW5vZGVzIGNvdW50ICovCisJX19sZTMyCXNfZmlyc3RfZGF0YV9ibG9jazsJLyogRmlyc3QgRGF0YSBCbG9jayAqLworCV9fbGUzMglzX2xvZ19ibG9ja19zaXplOwkvKiBCbG9jayBzaXplICovCisJX19sZTMyCXNfbG9nX2ZyYWdfc2l6ZTsJLyogRnJhZ21lbnQgc2l6ZSAqLworLyoyMCovCV9fbGUzMglzX2Jsb2Nrc19wZXJfZ3JvdXA7CS8qICMgQmxvY2tzIHBlciBncm91cCAqLworCV9fbGUzMglzX2ZyYWdzX3Blcl9ncm91cDsJLyogIyBGcmFnbWVudHMgcGVyIGdyb3VwICovCisJX19sZTMyCXNfaW5vZGVzX3Blcl9ncm91cDsJLyogIyBJbm9kZXMgcGVyIGdyb3VwICovCisJX19sZTMyCXNfbXRpbWU7CQkvKiBNb3VudCB0aW1lICovCisvKjMwKi8JX19sZTMyCXNfd3RpbWU7CQkvKiBXcml0ZSB0aW1lICovCisJX19sZTE2CXNfbW50X2NvdW50OwkJLyogTW91bnQgY291bnQgKi8KKwlfX2xlMTYJc19tYXhfbW50X2NvdW50OwkvKiBNYXhpbWFsIG1vdW50IGNvdW50ICovCisJX19sZTE2CXNfbWFnaWM7CQkvKiBNYWdpYyBzaWduYXR1cmUgKi8KKwlfX2xlMTYJc19zdGF0ZTsJCS8qIEZpbGUgc3lzdGVtIHN0YXRlICovCisJX19sZTE2CXNfZXJyb3JzOwkJLyogQmVoYXZpb3VyIHdoZW4gZGV0ZWN0aW5nIGVycm9ycyAqLworCV9fbGUxNglzX21pbm9yX3Jldl9sZXZlbDsJLyogbWlub3IgcmV2aXNpb24gbGV2ZWwgKi8KKy8qNDAqLwlfX2xlMzIJc19sYXN0Y2hlY2s7CQkvKiB0aW1lIG9mIGxhc3QgY2hlY2sgKi8KKwlfX2xlMzIJc19jaGVja2ludGVydmFsOwkvKiBtYXguIHRpbWUgYmV0d2VlbiBjaGVja3MgKi8KKwlfX2xlMzIJc19jcmVhdG9yX29zOwkJLyogT1MgKi8KKwlfX2xlMzIJc19yZXZfbGV2ZWw7CQkvKiBSZXZpc2lvbiBsZXZlbCAqLworLyo1MCovCV9fbGUxNglzX2RlZl9yZXN1aWQ7CQkvKiBEZWZhdWx0IHVpZCBmb3IgcmVzZXJ2ZWQgYmxvY2tzICovCisJX19sZTE2CXNfZGVmX3Jlc2dpZDsJCS8qIERlZmF1bHQgZ2lkIGZvciByZXNlcnZlZCBibG9ja3MgKi8KKwkvKgorCSAqIFRoZXNlIGZpZWxkcyBhcmUgZm9yIEVYVDRfRFlOQU1JQ19SRVYgc3VwZXJibG9ja3Mgb25seS4KKwkgKgorCSAqIE5vdGU6IHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIGNvbXBhdGlibGUgZmVhdHVyZSBzZXQgYW5kCisJICogdGhlIGluY29tcGF0aWJsZSBmZWF0dXJlIHNldCBpcyB0aGF0IGlmIHRoZXJlIGlzIGEgYml0IHNldAorCSAqIGluIHRoZSBpbmNvbXBhdGlibGUgZmVhdHVyZSBzZXQgdGhhdCB0aGUga2VybmVsIGRvZXNuJ3QKKwkgKiBrbm93IGFib3V0LCBpdCBzaG91bGQgcmVmdXNlIHRvIG1vdW50IHRoZSBmaWxlc3lzdGVtLgorCSAqCisJICogZTJmc2NrJ3MgcmVxdWlyZW1lbnRzIGFyZSBtb3JlIHN0cmljdDsgaWYgaXQgZG9lc24ndCBrbm93CisJICogYWJvdXQgYSBmZWF0dXJlIGluIGVpdGhlciB0aGUgY29tcGF0aWJsZSBvciBpbmNvbXBhdGlibGUKKwkgKiBmZWF0dXJlIHNldCwgaXQgbXVzdCBhYm9ydCBhbmQgbm90IHRyeSB0byBtZWRkbGUgd2l0aAorCSAqIHRoaW5ncyBpdCBkb2Vzbid0IHVuZGVyc3RhbmQuLi4KKwkgKi8KKwlfX2xlMzIJc19maXJzdF9pbm87CQkvKiBGaXJzdCBub24tcmVzZXJ2ZWQgaW5vZGUgKi8KKwlfX2xlMTYgIHNfaW5vZGVfc2l6ZTsJCS8qIHNpemUgb2YgaW5vZGUgc3RydWN0dXJlICovCisJX19sZTE2CXNfYmxvY2tfZ3JvdXBfbnI7CS8qIGJsb2NrIGdyb3VwICMgb2YgdGhpcyBzdXBlcmJsb2NrICovCisJX19sZTMyCXNfZmVhdHVyZV9jb21wYXQ7CS8qIGNvbXBhdGlibGUgZmVhdHVyZSBzZXQgKi8KKy8qNjAqLwlfX2xlMzIJc19mZWF0dXJlX2luY29tcGF0OwkvKiBpbmNvbXBhdGlibGUgZmVhdHVyZSBzZXQgKi8KKwlfX2xlMzIJc19mZWF0dXJlX3JvX2NvbXBhdDsJLyogcmVhZG9ubHktY29tcGF0aWJsZSBmZWF0dXJlIHNldCAqLworLyo2OCovCV9fdTgJc191dWlkWzE2XTsJCS8qIDEyOC1iaXQgdXVpZCBmb3Igdm9sdW1lICovCisvKjc4Ki8JY2hhcglzX3ZvbHVtZV9uYW1lWzE2XTsJLyogdm9sdW1lIG5hbWUgKi8KKy8qODgqLwljaGFyCXNfbGFzdF9tb3VudGVkWzY0XTsJLyogZGlyZWN0b3J5IHdoZXJlIGxhc3QgbW91bnRlZCAqLworLypDOCovCV9fbGUzMglzX2FsZ29yaXRobV91c2FnZV9iaXRtYXA7IC8qIEZvciBjb21wcmVzc2lvbiAqLworCS8qCisJICogUGVyZm9ybWFuY2UgaGludHMuICBEaXJlY3RvcnkgcHJlYWxsb2NhdGlvbiBzaG91bGQgb25seQorCSAqIGhhcHBlbiBpZiB0aGUgRVhUNF9GRUFUVVJFX0NPTVBBVF9ESVJfUFJFQUxMT0MgZmxhZyBpcyBvbi4KKwkgKi8KKwlfX3U4CXNfcHJlYWxsb2NfYmxvY2tzOwkvKiBOciBvZiBibG9ja3MgdG8gdHJ5IHRvIHByZWFsbG9jYXRlKi8KKwlfX3U4CXNfcHJlYWxsb2NfZGlyX2Jsb2NrczsJLyogTnIgdG8gcHJlYWxsb2NhdGUgZm9yIGRpcnMgKi8KKwlfX2xlMTYJc19yZXNlcnZlZF9nZHRfYmxvY2tzOwkvKiBQZXIgZ3JvdXAgZGVzYyBmb3Igb25saW5lIGdyb3d0aCAqLworCS8qCisJICogSm91cm5hbGluZyBzdXBwb3J0IHZhbGlkIGlmIEVYVDRfRkVBVFVSRV9DT01QQVRfSEFTX0pPVVJOQUwgc2V0LgorCSAqLworLypEMCovCV9fdTgJc19qb3VybmFsX3V1aWRbMTZdOwkvKiB1dWlkIG9mIGpvdXJuYWwgc3VwZXJibG9jayAqLworLypFMCovCV9fbGUzMglzX2pvdXJuYWxfaW51bTsJCS8qIGlub2RlIG51bWJlciBvZiBqb3VybmFsIGZpbGUgKi8KKwlfX2xlMzIJc19qb3VybmFsX2RldjsJCS8qIGRldmljZSBudW1iZXIgb2Ygam91cm5hbCBmaWxlICovCisJX19sZTMyCXNfbGFzdF9vcnBoYW47CQkvKiBzdGFydCBvZiBsaXN0IG9mIGlub2RlcyB0byBkZWxldGUgKi8KKwlfX2xlMzIJc19oYXNoX3NlZWRbNF07CQkvKiBIVFJFRSBoYXNoIHNlZWQgKi8KKwlfX3U4CXNfZGVmX2hhc2hfdmVyc2lvbjsJLyogRGVmYXVsdCBoYXNoIHZlcnNpb24gdG8gdXNlICovCisJX191OAlzX3Jlc2VydmVkX2NoYXJfcGFkOworCV9fbGUxNiAgc19kZXNjX3NpemU7CQkvKiBzaXplIG9mIGdyb3VwIGRlc2NyaXB0b3IgKi8KKy8qMTAwKi8JX19sZTMyCXNfZGVmYXVsdF9tb3VudF9vcHRzOworCV9fbGUzMglzX2ZpcnN0X21ldGFfYmc7CS8qIEZpcnN0IG1ldGFibG9jayBibG9jayBncm91cCAqLworCV9fbGUzMglzX21rZnNfdGltZTsJCS8qIFdoZW4gdGhlIGZpbGVzeXN0ZW0gd2FzIGNyZWF0ZWQgKi8KKwlfX2xlMzIJc19qbmxfYmxvY2tzWzE3XTsJLyogQmFja3VwIG9mIHRoZSBqb3VybmFsIGlub2RlICovCisJLyogNjRiaXQgc3VwcG9ydCB2YWxpZCBpZiBFWFQ0X0ZFQVRVUkVfQ09NUEFUXzY0QklUICovCisvKjE1MCovCV9fbGUzMglzX2Jsb2Nrc19jb3VudF9oaTsJLyogQmxvY2tzIGNvdW50ICovCisJX19sZTMyCXNfcl9ibG9ja3NfY291bnRfaGk7CS8qIFJlc2VydmVkIGJsb2NrcyBjb3VudCAqLworCV9fbGUzMglzX2ZyZWVfYmxvY2tzX2NvdW50X2hpOwkvKiBGcmVlIGJsb2NrcyBjb3VudCAqLworCV9fdTMyCXNfcmVzZXJ2ZWRbMTY5XTsJLyogUGFkZGluZyB0byB0aGUgZW5kIG9mIHRoZSBibG9jayAqLworfTsKKworI2lmZGVmIF9fS0VSTkVMX18KK3N0YXRpYyBpbmxpbmUgc3RydWN0IGV4dDRfc2JfaW5mbyAqIEVYVDRfU0Ioc3RydWN0IHN1cGVyX2Jsb2NrICpzYikKK3sKKwlyZXR1cm4gc2ItPnNfZnNfaW5mbzsKK30KK3N0YXRpYyBpbmxpbmUgc3RydWN0IGV4dDRfaW5vZGVfaW5mbyAqRVhUNF9JKHN0cnVjdCBpbm9kZSAqaW5vZGUpCit7CisJcmV0dXJuIGNvbnRhaW5lcl9vZihpbm9kZSwgc3RydWN0IGV4dDRfaW5vZGVfaW5mbywgdmZzX2lub2RlKTsKK30KKworc3RhdGljIGlubGluZSBpbnQgZXh0NF92YWxpZF9pbnVtKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHVuc2lnbmVkIGxvbmcgaW5vKQoreworCXJldHVybiBpbm8gPT0gRVhUNF9ST09UX0lOTyB8fAorCQlpbm8gPT0gRVhUNF9KT1VSTkFMX0lOTyB8fAorCQlpbm8gPT0gRVhUNF9SRVNJWkVfSU5PIHx8CisJCShpbm8gPj0gRVhUNF9GSVJTVF9JTk8oc2IpICYmCisJCSBpbm8gPD0gbGUzMl90b19jcHUoRVhUNF9TQihzYiktPnNfZXMtPnNfaW5vZGVzX2NvdW50KSk7Cit9CisjZWxzZQorLyogQXNzdW1lIHRoYXQgdXNlciBtb2RlIHByb2dyYW1zIGFyZSBwYXNzaW5nIGluIGFuIGV4dDRmcyBzdXBlcmJsb2NrLCBub3QKKyAqIGEga2VybmVsIHN0cnVjdCBzdXBlcl9ibG9jay4gIFRoaXMgd2lsbCBhbGxvdyB1cyB0byBjYWxsIHRoZSBmZWF0dXJlLXRlc3QKKyAqIG1hY3JvcyBmcm9tIHVzZXIgbGFuZC4gKi8KKyNkZWZpbmUgRVhUNF9TQihzYikJKHNiKQorI2VuZGlmCisKKyNkZWZpbmUgTkVYVF9PUlBIQU4oaW5vZGUpIEVYVDRfSShpbm9kZSktPmlfZHRpbWUKKworLyoKKyAqIENvZGVzIGZvciBvcGVyYXRpbmcgc3lzdGVtcworICovCisjZGVmaW5lIEVYVDRfT1NfTElOVVgJCTAKKyNkZWZpbmUgRVhUNF9PU19IVVJECQkxCisjZGVmaW5lIEVYVDRfT1NfTUFTSVgJCTIKKyNkZWZpbmUgRVhUNF9PU19GUkVFQlNECQkzCisjZGVmaW5lIEVYVDRfT1NfTElURVMJCTQKKworLyoKKyAqIFJldmlzaW9uIGxldmVscworICovCisjZGVmaW5lIEVYVDRfR09PRF9PTERfUkVWCTAJLyogVGhlIGdvb2Qgb2xkIChvcmlnaW5hbCkgZm9ybWF0ICovCisjZGVmaW5lIEVYVDRfRFlOQU1JQ19SRVYJMQkvKiBWMiBmb3JtYXQgdy8gZHluYW1pYyBpbm9kZSBzaXplcyAqLworCisjZGVmaW5lIEVYVDRfQ1VSUkVOVF9SRVYJRVhUNF9HT09EX09MRF9SRVYKKyNkZWZpbmUgRVhUNF9NQVhfU1VQUF9SRVYJRVhUNF9EWU5BTUlDX1JFVgorCisjZGVmaW5lIEVYVDRfR09PRF9PTERfSU5PREVfU0laRSAxMjgKKworLyoKKyAqIEZlYXR1cmUgc2V0IGRlZmluaXRpb25zCisgKi8KKworI2RlZmluZSBFWFQ0X0hBU19DT01QQVRfRkVBVFVSRShzYixtYXNrKQkJCVwKKwkoIEVYVDRfU0Ioc2IpLT5zX2VzLT5zX2ZlYXR1cmVfY29tcGF0ICYgY3B1X3RvX2xlMzIobWFzaykgKQorI2RlZmluZSBFWFQ0X0hBU19ST19DT01QQVRfRkVBVFVSRShzYixtYXNrKQkJCVwKKwkoIEVYVDRfU0Ioc2IpLT5zX2VzLT5zX2ZlYXR1cmVfcm9fY29tcGF0ICYgY3B1X3RvX2xlMzIobWFzaykgKQorI2RlZmluZSBFWFQ0X0hBU19JTkNPTVBBVF9GRUFUVVJFKHNiLG1hc2spCQkJXAorCSggRVhUNF9TQihzYiktPnNfZXMtPnNfZmVhdHVyZV9pbmNvbXBhdCAmIGNwdV90b19sZTMyKG1hc2spICkKKyNkZWZpbmUgRVhUNF9TRVRfQ09NUEFUX0ZFQVRVUkUoc2IsbWFzaykJCQlcCisJRVhUNF9TQihzYiktPnNfZXMtPnNfZmVhdHVyZV9jb21wYXQgfD0gY3B1X3RvX2xlMzIobWFzaykKKyNkZWZpbmUgRVhUNF9TRVRfUk9fQ09NUEFUX0ZFQVRVUkUoc2IsbWFzaykJCQlcCisJRVhUNF9TQihzYiktPnNfZXMtPnNfZmVhdHVyZV9yb19jb21wYXQgfD0gY3B1X3RvX2xlMzIobWFzaykKKyNkZWZpbmUgRVhUNF9TRVRfSU5DT01QQVRfRkVBVFVSRShzYixtYXNrKQkJCVwKKwlFWFQ0X1NCKHNiKS0+c19lcy0+c19mZWF0dXJlX2luY29tcGF0IHw9IGNwdV90b19sZTMyKG1hc2spCisjZGVmaW5lIEVYVDRfQ0xFQVJfQ09NUEFUX0ZFQVRVUkUoc2IsbWFzaykJCQlcCisJRVhUNF9TQihzYiktPnNfZXMtPnNfZmVhdHVyZV9jb21wYXQgJj0gfmNwdV90b19sZTMyKG1hc2spCisjZGVmaW5lIEVYVDRfQ0xFQVJfUk9fQ09NUEFUX0ZFQVRVUkUoc2IsbWFzaykJCQlcCisJRVhUNF9TQihzYiktPnNfZXMtPnNfZmVhdHVyZV9yb19jb21wYXQgJj0gfmNwdV90b19sZTMyKG1hc2spCisjZGVmaW5lIEVYVDRfQ0xFQVJfSU5DT01QQVRfRkVBVFVSRShzYixtYXNrKQkJCVwKKwlFWFQ0X1NCKHNiKS0+c19lcy0+c19mZWF0dXJlX2luY29tcGF0ICY9IH5jcHVfdG9fbGUzMihtYXNrKQorCisjZGVmaW5lIEVYVDRfRkVBVFVSRV9DT01QQVRfRElSX1BSRUFMTE9DCTB4MDAwMQorI2RlZmluZSBFWFQ0X0ZFQVRVUkVfQ09NUEFUX0lNQUdJQ19JTk9ERVMJMHgwMDAyCisjZGVmaW5lIEVYVDRfRkVBVFVSRV9DT01QQVRfSEFTX0pPVVJOQUwJCTB4MDAwNAorI2RlZmluZSBFWFQ0X0ZFQVRVUkVfQ09NUEFUX0VYVF9BVFRSCQkweDAwMDgKKyNkZWZpbmUgRVhUNF9GRUFUVVJFX0NPTVBBVF9SRVNJWkVfSU5PREUJMHgwMDEwCisjZGVmaW5lIEVYVDRfRkVBVFVSRV9DT01QQVRfRElSX0lOREVYCQkweDAwMjAKKworI2RlZmluZSBFWFQ0X0ZFQVRVUkVfUk9fQ09NUEFUX1NQQVJTRV9TVVBFUgkweDAwMDEKKyNkZWZpbmUgRVhUNF9GRUFUVVJFX1JPX0NPTVBBVF9MQVJHRV9GSUxFCTB4MDAwMgorI2RlZmluZSBFWFQ0X0ZFQVRVUkVfUk9fQ09NUEFUX0JUUkVFX0RJUgkweDAwMDQKKworI2RlZmluZSBFWFQ0X0ZFQVRVUkVfSU5DT01QQVRfQ09NUFJFU1NJT04JMHgwMDAxCisjZGVmaW5lIEVYVDRfRkVBVFVSRV9JTkNPTVBBVF9GSUxFVFlQRQkJMHgwMDAyCisjZGVmaW5lIEVYVDRfRkVBVFVSRV9JTkNPTVBBVF9SRUNPVkVSCQkweDAwMDQgLyogTmVlZHMgcmVjb3ZlcnkgKi8KKyNkZWZpbmUgRVhUNF9GRUFUVVJFX0lOQ09NUEFUX0pPVVJOQUxfREVWCTB4MDAwOCAvKiBKb3VybmFsIGRldmljZSAqLworI2RlZmluZSBFWFQ0X0ZFQVRVUkVfSU5DT01QQVRfTUVUQV9CRwkJMHgwMDEwCisjZGVmaW5lIEVYVDRfRkVBVFVSRV9JTkNPTVBBVF9FWFRFTlRTCQkweDAwNDAgLyogZXh0ZW50cyBzdXBwb3J0ICovCisjZGVmaW5lIEVYVDRfRkVBVFVSRV9JTkNPTVBBVF82NEJJVAkJMHgwMDgwCisKKyNkZWZpbmUgRVhUNF9GRUFUVVJFX0NPTVBBVF9TVVBQCUVYVDJfRkVBVFVSRV9DT01QQVRfRVhUX0FUVFIKKyNkZWZpbmUgRVhUNF9GRUFUVVJFX0lOQ09NUEFUX1NVUFAJKEVYVDRfRkVBVFVSRV9JTkNPTVBBVF9GSUxFVFlQRXwgXAorCQkJCQkgRVhUNF9GRUFUVVJFX0lOQ09NUEFUX1JFQ09WRVJ8IFwKKwkJCQkJIEVYVDRfRkVBVFVSRV9JTkNPTVBBVF9NRVRBX0JHfCBcCisJCQkJCSBFWFQ0X0ZFQVRVUkVfSU5DT01QQVRfRVhURU5UU3wgXAorCQkJCQkgRVhUNF9GRUFUVVJFX0lOQ09NUEFUXzY0QklUKQorI2RlZmluZSBFWFQ0X0ZFQVRVUkVfUk9fQ09NUEFUX1NVUFAJKEVYVDRfRkVBVFVSRV9ST19DT01QQVRfU1BBUlNFX1NVUEVSfCBcCisJCQkJCSBFWFQ0X0ZFQVRVUkVfUk9fQ09NUEFUX0xBUkdFX0ZJTEV8IFwKKwkJCQkJIEVYVDRfRkVBVFVSRV9ST19DT01QQVRfQlRSRUVfRElSKQorCisvKgorICogRGVmYXVsdCB2YWx1ZXMgZm9yIHVzZXIgYW5kL29yIGdyb3VwIHVzaW5nIHJlc2VydmVkIGJsb2NrcworICovCisjZGVmaW5lCUVYVDRfREVGX1JFU1VJRAkJMAorI2RlZmluZQlFWFQ0X0RFRl9SRVNHSUQJCTAKKworLyoKKyAqIERlZmF1bHQgbW91bnQgb3B0aW9ucworICovCisjZGVmaW5lIEVYVDRfREVGTV9ERUJVRwkJMHgwMDAxCisjZGVmaW5lIEVYVDRfREVGTV9CU0RHUk9VUFMJMHgwMDAyCisjZGVmaW5lIEVYVDRfREVGTV9YQVRUUl9VU0VSCTB4MDAwNAorI2RlZmluZSBFWFQ0X0RFRk1fQUNMCQkweDAwMDgKKyNkZWZpbmUgRVhUNF9ERUZNX1VJRDE2CQkweDAwMTAKKyNkZWZpbmUgRVhUNF9ERUZNX0pNT0RFCQkweDAwNjAKKyNkZWZpbmUgRVhUNF9ERUZNX0pNT0RFX0RBVEEJMHgwMDIwCisjZGVmaW5lIEVYVDRfREVGTV9KTU9ERV9PUkRFUkVECTB4MDA0MAorI2RlZmluZSBFWFQ0X0RFRk1fSk1PREVfV0JBQ0sJMHgwMDYwCisKKy8qCisgKiBTdHJ1Y3R1cmUgb2YgYSBkaXJlY3RvcnkgZW50cnkKKyAqLworI2RlZmluZSBFWFQ0X05BTUVfTEVOIDI1NQorCitzdHJ1Y3QgZXh0NF9kaXJfZW50cnkgeworCV9fbGUzMglpbm9kZTsJCQkvKiBJbm9kZSBudW1iZXIgKi8KKwlfX2xlMTYJcmVjX2xlbjsJCS8qIERpcmVjdG9yeSBlbnRyeSBsZW5ndGggKi8KKwlfX2xlMTYJbmFtZV9sZW47CQkvKiBOYW1lIGxlbmd0aCAqLworCWNoYXIJbmFtZVtFWFQ0X05BTUVfTEVOXTsJLyogRmlsZSBuYW1lICovCit9OworCisvKgorICogVGhlIG5ldyB2ZXJzaW9uIG9mIHRoZSBkaXJlY3RvcnkgZW50cnkuICBTaW5jZSBFWFQ0IHN0cnVjdHVyZXMgYXJlCisgKiBzdG9yZWQgaW4gaW50ZWwgYnl0ZSBvcmRlciwgYW5kIHRoZSBuYW1lX2xlbiBmaWVsZCBjb3VsZCBuZXZlciBiZQorICogYmlnZ2VyIHRoYW4gMjU1IGNoYXJzLCBpdCdzIHNhZmUgdG8gcmVjbGFpbSB0aGUgZXh0cmEgYnl0ZSBmb3IgdGhlCisgKiBmaWxlX3R5cGUgZmllbGQuCisgKi8KK3N0cnVjdCBleHQ0X2Rpcl9lbnRyeV8yIHsKKwlfX2xlMzIJaW5vZGU7CQkJLyogSW5vZGUgbnVtYmVyICovCisJX19sZTE2CXJlY19sZW47CQkvKiBEaXJlY3RvcnkgZW50cnkgbGVuZ3RoICovCisJX191OAluYW1lX2xlbjsJCS8qIE5hbWUgbGVuZ3RoICovCisJX191OAlmaWxlX3R5cGU7CisJY2hhcgluYW1lW0VYVDRfTkFNRV9MRU5dOwkvKiBGaWxlIG5hbWUgKi8KK307CisKKy8qCisgKiBFeHQ0IGRpcmVjdG9yeSBmaWxlIHR5cGVzLiAgT25seSB0aGUgbG93IDMgYml0cyBhcmUgdXNlZC4gIFRoZQorICogb3RoZXIgYml0cyBhcmUgcmVzZXJ2ZWQgZm9yIG5vdy4KKyAqLworI2RlZmluZSBFWFQ0X0ZUX1VOS05PV04JCTAKKyNkZWZpbmUgRVhUNF9GVF9SRUdfRklMRQkxCisjZGVmaW5lIEVYVDRfRlRfRElSCQkyCisjZGVmaW5lIEVYVDRfRlRfQ0hSREVWCQkzCisjZGVmaW5lIEVYVDRfRlRfQkxLREVWCQk0CisjZGVmaW5lIEVYVDRfRlRfRklGTwkJNQorI2RlZmluZSBFWFQ0X0ZUX1NPQ0sJCTYKKyNkZWZpbmUgRVhUNF9GVF9TWU1MSU5LCQk3CisKKyNkZWZpbmUgRVhUNF9GVF9NQVgJCTgKKworLyoKKyAqIEVYVDRfRElSX1BBRCBkZWZpbmVzIHRoZSBkaXJlY3RvcnkgZW50cmllcyBib3VuZGFyaWVzCisgKgorICogTk9URTogSXQgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDQKKyAqLworI2RlZmluZSBFWFQ0X0RJUl9QQUQJCQk0CisjZGVmaW5lIEVYVDRfRElSX1JPVU5ECQkJKEVYVDRfRElSX1BBRCAtIDEpCisjZGVmaW5lIEVYVDRfRElSX1JFQ19MRU4obmFtZV9sZW4pCSgoKG5hbWVfbGVuKSArIDggKyBFWFQ0X0RJUl9ST1VORCkgJiBcCisJCQkJCSB+RVhUNF9ESVJfUk9VTkQpCisvKgorICogSGFzaCBUcmVlIERpcmVjdG9yeSBpbmRleGluZworICogKGMpIERhbmllbCBQaGlsbGlwcywgMjAwMQorICovCisKKyNpZmRlZiBDT05GSUdfRVhUNF9JTkRFWAorICAjZGVmaW5lIGlzX2R4KGRpcikgKEVYVDRfSEFTX0NPTVBBVF9GRUFUVVJFKGRpci0+aV9zYiwgXAorCQkJCQkgICAgICBFWFQ0X0ZFQVRVUkVfQ09NUEFUX0RJUl9JTkRFWCkgJiYgXAorCQkgICAgICAoRVhUNF9JKGRpciktPmlfZmxhZ3MgJiBFWFQ0X0lOREVYX0ZMKSkKKyNkZWZpbmUgRVhUNF9ESVJfTElOS19NQVgoZGlyKSAoIWlzX2R4KGRpcikgJiYgKGRpciktPmlfbmxpbmsgPj0gRVhUNF9MSU5LX01BWCkKKyNkZWZpbmUgRVhUNF9ESVJfTElOS19FTVBUWShkaXIpICgoZGlyKS0+aV9ubGluayA9PSAyIHx8IChkaXIpLT5pX25saW5rID09IDEpCisjZWxzZQorICAjZGVmaW5lIGlzX2R4KGRpcikgMAorI2RlZmluZSBFWFQ0X0RJUl9MSU5LX01BWChkaXIpICgoZGlyKS0+aV9ubGluayA+PSBFWFQ0X0xJTktfTUFYKQorI2RlZmluZSBFWFQ0X0RJUl9MSU5LX0VNUFRZKGRpcikgKChkaXIpLT5pX25saW5rID09IDIpCisjZW5kaWYKKworLyogTGVnYWwgdmFsdWVzIGZvciB0aGUgZHhfcm9vdCBoYXNoX3ZlcnNpb24gZmllbGQ6ICovCisKKyNkZWZpbmUgRFhfSEFTSF9MRUdBQ1kJCTAKKyNkZWZpbmUgRFhfSEFTSF9IQUxGX01ENAkxCisjZGVmaW5lIERYX0hBU0hfVEVBCQkyCisKKyNpZmRlZiBfX0tFUk5FTF9fCisKKy8qIGhhc2ggaW5mbyBzdHJ1Y3R1cmUgdXNlZCBieSB0aGUgZGlyZWN0b3J5IGhhc2ggKi8KK3N0cnVjdCBkeF9oYXNoX2luZm8KK3sKKwl1MzIJCWhhc2g7CisJdTMyCQltaW5vcl9oYXNoOworCWludAkJaGFzaF92ZXJzaW9uOworCXUzMgkJKnNlZWQ7Cit9OworCisjZGVmaW5lIEVYVDRfSFRSRUVfRU9GCTB4N2ZmZmZmZmYKKworLyoKKyAqIENvbnRyb2wgcGFyYW1ldGVycyB1c2VkIGJ5IGV4dDRfaHRyZWVfbmV4dF9ibG9jaworICovCisjZGVmaW5lIEhBU0hfTkJfQUxXQVlTCQkxCisKKworLyoKKyAqIERlc2NyaWJlIGFuIGlub2RlJ3MgZXhhY3QgbG9jYXRpb24gb24gZGlzayBhbmQgaW4gbWVtb3J5CisgKi8KK3N0cnVjdCBleHQ0X2lsb2MKK3sKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoOworCXVuc2lnbmVkIGxvbmcgb2Zmc2V0OworCXVuc2lnbmVkIGxvbmcgYmxvY2tfZ3JvdXA7Cit9OworCitzdGF0aWMgaW5saW5lIHN0cnVjdCBleHQ0X2lub2RlICpleHQ0X3Jhd19pbm9kZShzdHJ1Y3QgZXh0NF9pbG9jICppbG9jKQoreworCXJldHVybiAoc3RydWN0IGV4dDRfaW5vZGUgKikgKGlsb2MtPmJoLT5iX2RhdGEgKyBpbG9jLT5vZmZzZXQpOworfQorCisvKgorICogVGhpcyBzdHJ1Y3R1cmUgaXMgc3R1ZmZlZCBpbnRvIHRoZSBzdHJ1Y3QgZmlsZSdzIHByaXZhdGVfZGF0YSBmaWVsZAorICogZm9yIGRpcmVjdG9yaWVzLiAgSXQgaXMgd2hlcmUgd2UgcHV0IGluZm9ybWF0aW9uIHNvIHRoYXQgd2UgY2FuIGRvCisgKiByZWFkZGlyIG9wZXJhdGlvbnMgaW4gaGFzaCB0cmVlIG9yZGVyLgorICovCitzdHJ1Y3QgZGlyX3ByaXZhdGVfaW5mbyB7CisJc3RydWN0IHJiX3Jvb3QJcm9vdDsKKwlzdHJ1Y3QgcmJfbm9kZQkqY3Vycl9ub2RlOworCXN0cnVjdCBmbmFtZQkqZXh0cmFfZm5hbWU7CisJbG9mZl90CQlsYXN0X3BvczsKKwlfX3UzMgkJY3Vycl9oYXNoOworCV9fdTMyCQljdXJyX21pbm9yX2hhc2g7CisJX191MzIJCW5leHRfaGFzaDsKK307CisKKy8qIGNhbGN1bGF0ZSB0aGUgZmlyc3QgYmxvY2sgbnVtYmVyIG9mIHRoZSBncm91cCAqLworc3RhdGljIGlubGluZSBleHQ0X2ZzYmxrX3QKK2V4dDRfZ3JvdXBfZmlyc3RfYmxvY2tfbm8oc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgdW5zaWduZWQgbG9uZyBncm91cF9ubykKK3sKKwlyZXR1cm4gZ3JvdXBfbm8gKiAoZXh0NF9mc2Jsa190KUVYVDRfQkxPQ0tTX1BFUl9HUk9VUChzYikgKworCQlsZTMyX3RvX2NwdShFWFQ0X1NCKHNiKS0+c19lcy0+c19maXJzdF9kYXRhX2Jsb2NrKTsKK30KKworLyoKKyAqIFNwZWNpYWwgZXJyb3IgcmV0dXJuIGNvZGUgb25seSB1c2VkIGJ5IGR4X3Byb2JlKCkgYW5kIGl0cyBjYWxsZXJzLgorICovCisjZGVmaW5lIEVSUl9CQURfRFhfRElSCS03NTAwMAorCit2b2lkIGV4dDRfZ2V0X2dyb3VwX25vX2FuZF9vZmZzZXQoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgZXh0NF9mc2Jsa190IGJsb2NrbnIsCisJCQl1bnNpZ25lZCBsb25nICpibG9ja2dycHAsIGV4dDRfZ3JwYmxrX3QgKm9mZnNldHApOworCisvKgorICogRnVuY3Rpb24gcHJvdG90eXBlcworICovCisKKy8qCisgKiBPaywgdGhlc2UgZGVjbGFyYXRpb25zIGFyZSBhbHNvIGluIDxsaW51eC9rZXJuZWwuaD4gYnV0IG5vbmUgb2YgdGhlCisgKiBleHQ0IHNvdXJjZSBwcm9ncmFtcyBuZWVkcyB0byBpbmNsdWRlIGl0IHNvIHRoZXkgYXJlIGR1cGxpY2F0ZWQgaGVyZS4KKyAqLworIyBkZWZpbmUgTk9SRVRfVFlQRSAgICAvKiovCisjIGRlZmluZSBBVFRSSUJfTk9SRVQgIF9fYXR0cmlidXRlX18oKG5vcmV0dXJuKSkKKyMgZGVmaW5lIE5PUkVUX0FORCAgICAgbm9yZXR1cm4sCisKKy8qIGJhbGxvYy5jICovCitleHRlcm4gdW5zaWduZWQgaW50IGV4dDRfYmxvY2tfZ3JvdXAoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwKKwkJCWV4dDRfZnNibGtfdCBibG9ja25yKTsKK2V4dGVybiBleHQ0X2dycGJsa190IGV4dDRfYmxvY2tfZ3JvdXBfb2Zmc2V0KHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsCisJCQlleHQ0X2ZzYmxrX3QgYmxvY2tucik7CitleHRlcm4gaW50IGV4dDRfYmdfaGFzX3N1cGVyKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGludCBncm91cCk7CitleHRlcm4gdW5zaWduZWQgbG9uZyBleHQ0X2JnX251bV9nZGIoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgaW50IGdyb3VwKTsKK2V4dGVybiBleHQ0X2ZzYmxrX3QgZXh0NF9uZXdfYmxvY2sgKGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBpbm9kZSAqaW5vZGUsCisJCQlleHQ0X2ZzYmxrX3QgZ29hbCwgaW50ICplcnJwKTsKK2V4dGVybiBleHQ0X2ZzYmxrX3QgZXh0NF9uZXdfYmxvY2tzIChoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3QgaW5vZGUgKmlub2RlLAorCQkJZXh0NF9mc2Jsa190IGdvYWwsIHVuc2lnbmVkIGxvbmcgKmNvdW50LCBpbnQgKmVycnApOworZXh0ZXJuIHZvaWQgZXh0NF9mcmVlX2Jsb2NrcyAoaGFuZGxlX3QgKmhhbmRsZSwgc3RydWN0IGlub2RlICppbm9kZSwKKwkJCWV4dDRfZnNibGtfdCBibG9jaywgdW5zaWduZWQgbG9uZyBjb3VudCk7CitleHRlcm4gdm9pZCBleHQ0X2ZyZWVfYmxvY2tzX3NiIChoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLAorCQkJCSBleHQ0X2ZzYmxrX3QgYmxvY2ssIHVuc2lnbmVkIGxvbmcgY291bnQsCisJCQkJdW5zaWduZWQgbG9uZyAqcGRxdW90X2ZyZWVkX2Jsb2Nrcyk7CitleHRlcm4gZXh0NF9mc2Jsa190IGV4dDRfY291bnRfZnJlZV9ibG9ja3MgKHN0cnVjdCBzdXBlcl9ibG9jayAqKTsKK2V4dGVybiB2b2lkIGV4dDRfY2hlY2tfYmxvY2tzX2JpdG1hcCAoc3RydWN0IHN1cGVyX2Jsb2NrICopOworZXh0ZXJuIHN0cnVjdCBleHQ0X2dyb3VwX2Rlc2MgKiBleHQ0X2dldF9ncm91cF9kZXNjKHN0cnVjdCBzdXBlcl9ibG9jayAqIHNiLAorCQkJCQkJICAgIHVuc2lnbmVkIGludCBibG9ja19ncm91cCwKKwkJCQkJCSAgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKiogYmgpOworZXh0ZXJuIGludCBleHQ0X3Nob3VsZF9yZXRyeV9hbGxvYyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBpbnQgKnJldHJpZXMpOworZXh0ZXJuIHZvaWQgZXh0NF9pbml0X2Jsb2NrX2FsbG9jX2luZm8oc3RydWN0IGlub2RlICopOworZXh0ZXJuIHZvaWQgZXh0NF9yc3Zfd2luZG93X2FkZChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBzdHJ1Y3QgZXh0NF9yZXNlcnZlX3dpbmRvd19ub2RlICpyc3YpOworCisvKiBkaXIuYyAqLworZXh0ZXJuIGludCBleHQ0X2NoZWNrX2Rpcl9lbnRyeShjb25zdCBjaGFyICosIHN0cnVjdCBpbm9kZSAqLAorCQkJCXN0cnVjdCBleHQ0X2Rpcl9lbnRyeV8yICosCisJCQkJc3RydWN0IGJ1ZmZlcl9oZWFkICosIHVuc2lnbmVkIGxvbmcpOworZXh0ZXJuIGludCBleHQ0X2h0cmVlX3N0b3JlX2RpcmVudChzdHJ1Y3QgZmlsZSAqZGlyX2ZpbGUsIF9fdTMyIGhhc2gsCisJCQkJICAgIF9fdTMyIG1pbm9yX2hhc2gsCisJCQkJICAgIHN0cnVjdCBleHQ0X2Rpcl9lbnRyeV8yICpkaXJlbnQpOworZXh0ZXJuIHZvaWQgZXh0NF9odHJlZV9mcmVlX2Rpcl9pbmZvKHN0cnVjdCBkaXJfcHJpdmF0ZV9pbmZvICpwKTsKKworLyogZnN5bmMuYyAqLworZXh0ZXJuIGludCBleHQ0X3N5bmNfZmlsZSAoc3RydWN0IGZpbGUgKiwgc3RydWN0IGRlbnRyeSAqLCBpbnQpOworCisvKiBoYXNoLmMgKi8KK2V4dGVybiBpbnQgZXh0NGZzX2Rpcmhhc2goY29uc3QgY2hhciAqbmFtZSwgaW50IGxlbiwgc3RydWN0CisJCQkgIGR4X2hhc2hfaW5mbyAqaGluZm8pOworCisvKiBpYWxsb2MuYyAqLworZXh0ZXJuIHN0cnVjdCBpbm9kZSAqIGV4dDRfbmV3X2lub2RlIChoYW5kbGVfdCAqLCBzdHJ1Y3QgaW5vZGUgKiwgaW50KTsKK2V4dGVybiB2b2lkIGV4dDRfZnJlZV9pbm9kZSAoaGFuZGxlX3QgKiwgc3RydWN0IGlub2RlICopOworZXh0ZXJuIHN0cnVjdCBpbm9kZSAqIGV4dDRfb3JwaGFuX2dldCAoc3RydWN0IHN1cGVyX2Jsb2NrICosIHVuc2lnbmVkIGxvbmcpOworZXh0ZXJuIHVuc2lnbmVkIGxvbmcgZXh0NF9jb3VudF9mcmVlX2lub2RlcyAoc3RydWN0IHN1cGVyX2Jsb2NrICopOworZXh0ZXJuIHVuc2lnbmVkIGxvbmcgZXh0NF9jb3VudF9kaXJzIChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKik7CitleHRlcm4gdm9pZCBleHQ0X2NoZWNrX2lub2Rlc19iaXRtYXAgKHN0cnVjdCBzdXBlcl9ibG9jayAqKTsKK2V4dGVybiB1bnNpZ25lZCBsb25nIGV4dDRfY291bnRfZnJlZSAoc3RydWN0IGJ1ZmZlcl9oZWFkICosIHVuc2lnbmVkKTsKKworCisvKiBpbm9kZS5jICovCitpbnQgZXh0NF9mb3JnZXQoaGFuZGxlX3QgKmhhbmRsZSwgaW50IGlzX21ldGFkYXRhLCBzdHJ1Y3QgaW5vZGUgKmlub2RlLAorCQlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoLCBleHQ0X2ZzYmxrX3QgYmxvY2tucik7CitzdHJ1Y3QgYnVmZmVyX2hlYWQgKiBleHQ0X2dldGJsayAoaGFuZGxlX3QgKiwgc3RydWN0IGlub2RlICosIGxvbmcsIGludCwgaW50ICopOworc3RydWN0IGJ1ZmZlcl9oZWFkICogZXh0NF9icmVhZCAoaGFuZGxlX3QgKiwgc3RydWN0IGlub2RlICosIGludCwgaW50LCBpbnQgKik7CitpbnQgZXh0NF9nZXRfYmxvY2tzX2hhbmRsZShoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3QgaW5vZGUgKmlub2RlLAorCXNlY3Rvcl90IGlibG9jaywgdW5zaWduZWQgbG9uZyBtYXhibG9ja3MsIHN0cnVjdCBidWZmZXJfaGVhZCAqYmhfcmVzdWx0LAorCWludCBjcmVhdGUsIGludCBleHRlbmRfZGlza3NpemUpOworCitleHRlcm4gdm9pZCBleHQ0X3JlYWRfaW5vZGUgKHN0cnVjdCBpbm9kZSAqKTsKK2V4dGVybiBpbnQgIGV4dDRfd3JpdGVfaW5vZGUgKHN0cnVjdCBpbm9kZSAqLCBpbnQpOworZXh0ZXJuIGludCAgZXh0NF9zZXRhdHRyIChzdHJ1Y3QgZGVudHJ5ICosIHN0cnVjdCBpYXR0ciAqKTsKK2V4dGVybiB2b2lkIGV4dDRfZGVsZXRlX2lub2RlIChzdHJ1Y3QgaW5vZGUgKik7CitleHRlcm4gaW50ICBleHQ0X3N5bmNfaW5vZGUgKGhhbmRsZV90ICosIHN0cnVjdCBpbm9kZSAqKTsKK2V4dGVybiB2b2lkIGV4dDRfZGlzY2FyZF9yZXNlcnZhdGlvbiAoc3RydWN0IGlub2RlICopOworZXh0ZXJuIHZvaWQgZXh0NF9kaXJ0eV9pbm9kZShzdHJ1Y3QgaW5vZGUgKik7CitleHRlcm4gaW50IGV4dDRfY2hhbmdlX2lub2RlX2pvdXJuYWxfZmxhZyhzdHJ1Y3QgaW5vZGUgKiwgaW50KTsKK2V4dGVybiBpbnQgZXh0NF9nZXRfaW5vZGVfbG9jKHN0cnVjdCBpbm9kZSAqLCBzdHJ1Y3QgZXh0NF9pbG9jICopOworZXh0ZXJuIHZvaWQgZXh0NF90cnVuY2F0ZSAoc3RydWN0IGlub2RlICopOworZXh0ZXJuIHZvaWQgZXh0NF9zZXRfaW5vZGVfZmxhZ3Moc3RydWN0IGlub2RlICopOworZXh0ZXJuIHZvaWQgZXh0NF9zZXRfYW9wcyhzdHJ1Y3QgaW5vZGUgKmlub2RlKTsKK2V4dGVybiBpbnQgZXh0NF93cml0ZXBhZ2VfdHJhbnNfYmxvY2tzKHN0cnVjdCBpbm9kZSAqKTsKK2V4dGVybiBpbnQgZXh0NF9ibG9ja190cnVuY2F0ZV9wYWdlKGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBwYWdlICpwYWdlLAorCQlzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZywgbG9mZl90IGZyb20pOworCisvKiBpb2N0bC5jICovCitleHRlcm4gaW50IGV4dDRfaW9jdGwgKHN0cnVjdCBpbm9kZSAqLCBzdHJ1Y3QgZmlsZSAqLCB1bnNpZ25lZCBpbnQsCisJCSAgICAgICB1bnNpZ25lZCBsb25nKTsKK2V4dGVybiBsb25nIGV4dDRfY29tcGF0X2lvY3RsIChzdHJ1Y3QgZmlsZSAqLCB1bnNpZ25lZCBpbnQsIHVuc2lnbmVkIGxvbmcpOworCisvKiBuYW1laS5jICovCitleHRlcm4gaW50IGV4dDRfb3JwaGFuX2FkZChoYW5kbGVfdCAqLCBzdHJ1Y3QgaW5vZGUgKik7CitleHRlcm4gaW50IGV4dDRfb3JwaGFuX2RlbChoYW5kbGVfdCAqLCBzdHJ1Y3QgaW5vZGUgKik7CitleHRlcm4gaW50IGV4dDRfaHRyZWVfZmlsbF90cmVlKHN0cnVjdCBmaWxlICpkaXJfZmlsZSwgX191MzIgc3RhcnRfaGFzaCwKKwkJCQlfX3UzMiBzdGFydF9taW5vcl9oYXNoLCBfX3UzMiAqbmV4dF9oYXNoKTsKKworLyogcmVzaXplLmMgKi8KK2V4dGVybiBpbnQgZXh0NF9ncm91cF9hZGQoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwKKwkJCQlzdHJ1Y3QgZXh0NF9uZXdfZ3JvdXBfZGF0YSAqaW5wdXQpOworZXh0ZXJuIGludCBleHQ0X2dyb3VwX2V4dGVuZChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLAorCQkJCXN0cnVjdCBleHQ0X3N1cGVyX2Jsb2NrICplcywKKwkJCQlleHQ0X2ZzYmxrX3Qgbl9ibG9ja3NfY291bnQpOworCisvKiBzdXBlci5jICovCitleHRlcm4gdm9pZCBleHQ0X2Vycm9yIChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiwgY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosIC4uLikKKwlfX2F0dHJpYnV0ZV9fICgoZm9ybWF0IChwcmludGYsIDMsIDQpKSk7CitleHRlcm4gdm9pZCBfX2V4dDRfc3RkX2Vycm9yIChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiwgY29uc3QgY2hhciAqLCBpbnQpOworZXh0ZXJuIHZvaWQgZXh0NF9hYm9ydCAoc3RydWN0IHN1cGVyX2Jsb2NrICosIGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLCAuLi4pCisJX19hdHRyaWJ1dGVfXyAoKGZvcm1hdCAocHJpbnRmLCAzLCA0KSkpOworZXh0ZXJuIHZvaWQgZXh0NF93YXJuaW5nIChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiwgY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosIC4uLikKKwlfX2F0dHJpYnV0ZV9fICgoZm9ybWF0IChwcmludGYsIDMsIDQpKSk7CitleHRlcm4gdm9pZCBleHQ0X3VwZGF0ZV9keW5hbWljX3JldiAoc3RydWN0IHN1cGVyX2Jsb2NrICpzYik7CitleHRlcm4gZXh0NF9mc2Jsa190IGV4dDRfYmxvY2tfYml0bWFwKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsCisJCQkJICAgICAgc3RydWN0IGV4dDRfZ3JvdXBfZGVzYyAqYmcpOworZXh0ZXJuIGV4dDRfZnNibGtfdCBleHQ0X2lub2RlX2JpdG1hcChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLAorCQkJCSAgICAgIHN0cnVjdCBleHQ0X2dyb3VwX2Rlc2MgKmJnKTsKK2V4dGVybiBleHQ0X2ZzYmxrX3QgZXh0NF9pbm9kZV90YWJsZShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLAorCQkJCSAgICAgc3RydWN0IGV4dDRfZ3JvdXBfZGVzYyAqYmcpOworZXh0ZXJuIHZvaWQgZXh0NF9ibG9ja19iaXRtYXBfc2V0KHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsCisJCQkJICBzdHJ1Y3QgZXh0NF9ncm91cF9kZXNjICpiZywgZXh0NF9mc2Jsa190IGJsayk7CitleHRlcm4gdm9pZCBleHQ0X2lub2RlX2JpdG1hcF9zZXQoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwKKwkJCQkgIHN0cnVjdCBleHQ0X2dyb3VwX2Rlc2MgKmJnLCBleHQ0X2ZzYmxrX3QgYmxrKTsKK2V4dGVybiB2b2lkIGV4dDRfaW5vZGVfdGFibGVfc2V0KHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsCisJCQkJIHN0cnVjdCBleHQ0X2dyb3VwX2Rlc2MgKmJnLCBleHQ0X2ZzYmxrX3QgYmxrKTsKKworc3RhdGljIGlubGluZSBleHQ0X2ZzYmxrX3QgZXh0NF9ibG9ja3NfY291bnQoc3RydWN0IGV4dDRfc3VwZXJfYmxvY2sgKmVzKQoreworCXJldHVybiAoKGV4dDRfZnNibGtfdClsZTMyX3RvX2NwdShlcy0+c19ibG9ja3NfY291bnRfaGkpIDw8IDMyKSB8CisJCWxlMzJfdG9fY3B1KGVzLT5zX2Jsb2Nrc19jb3VudCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgZXh0NF9mc2Jsa190IGV4dDRfcl9ibG9ja3NfY291bnQoc3RydWN0IGV4dDRfc3VwZXJfYmxvY2sgKmVzKQoreworCXJldHVybiAoKGV4dDRfZnNibGtfdClsZTMyX3RvX2NwdShlcy0+c19yX2Jsb2Nrc19jb3VudF9oaSkgPDwgMzIpIHwKKwkJbGUzMl90b19jcHUoZXMtPnNfcl9ibG9ja3NfY291bnQpOworfQorCitzdGF0aWMgaW5saW5lIGV4dDRfZnNibGtfdCBleHQ0X2ZyZWVfYmxvY2tzX2NvdW50KHN0cnVjdCBleHQ0X3N1cGVyX2Jsb2NrICplcykKK3sKKwlyZXR1cm4gKChleHQ0X2ZzYmxrX3QpbGUzMl90b19jcHUoZXMtPnNfZnJlZV9ibG9ja3NfY291bnRfaGkpIDw8IDMyKSB8CisJCWxlMzJfdG9fY3B1KGVzLT5zX2ZyZWVfYmxvY2tzX2NvdW50KTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGV4dDRfYmxvY2tzX2NvdW50X3NldChzdHJ1Y3QgZXh0NF9zdXBlcl9ibG9jayAqZXMsCisJCQkJCSBleHQ0X2ZzYmxrX3QgYmxrKQoreworCWVzLT5zX2Jsb2Nrc19jb3VudCA9IGNwdV90b19sZTMyKCh1MzIpYmxrKTsKKwllcy0+c19ibG9ja3NfY291bnRfaGkgPSBjcHVfdG9fbGUzMihibGsgPj4gMzIpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgZXh0NF9mcmVlX2Jsb2Nrc19jb3VudF9zZXQoc3RydWN0IGV4dDRfc3VwZXJfYmxvY2sgKmVzLAorCQkJCQkgICAgICBleHQ0X2ZzYmxrX3QgYmxrKQoreworCWVzLT5zX2ZyZWVfYmxvY2tzX2NvdW50ID0gY3B1X3RvX2xlMzIoKHUzMilibGspOworCWVzLT5zX2ZyZWVfYmxvY2tzX2NvdW50X2hpID0gY3B1X3RvX2xlMzIoYmxrID4+IDMyKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGV4dDRfcl9ibG9ja3NfY291bnRfc2V0KHN0cnVjdCBleHQ0X3N1cGVyX2Jsb2NrICplcywKKwkJCQkJICAgZXh0NF9mc2Jsa190IGJsaykKK3sKKwllcy0+c19yX2Jsb2Nrc19jb3VudCA9IGNwdV90b19sZTMyKCh1MzIpYmxrKTsKKwllcy0+c19yX2Jsb2Nrc19jb3VudF9oaSA9IGNwdV90b19sZTMyKGJsayA+PiAzMik7Cit9CisKKworCisjZGVmaW5lIGV4dDRfc3RkX2Vycm9yKHNiLCBlcnJubykJCQkJXAorZG8gewkJCQkJCQkJXAorCWlmICgoZXJybm8pKQkJCQkJCVwKKwkJX19leHQ0X3N0ZF9lcnJvcigoc2IpLCBfX0ZVTkNUSU9OX18sIChlcnJubykpOwlcCit9IHdoaWxlICgwKQorCisvKgorICogSW5vZGVzIGFuZCBmaWxlcyBvcGVyYXRpb25zCisgKi8KKworLyogZGlyLmMgKi8KK2V4dGVybiBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGV4dDRfZGlyX29wZXJhdGlvbnM7CisKKy8qIGZpbGUuYyAqLworZXh0ZXJuIHN0cnVjdCBpbm9kZV9vcGVyYXRpb25zIGV4dDRfZmlsZV9pbm9kZV9vcGVyYXRpb25zOworZXh0ZXJuIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgZXh0NF9maWxlX29wZXJhdGlvbnM7CisKKy8qIG5hbWVpLmMgKi8KK2V4dGVybiBzdHJ1Y3QgaW5vZGVfb3BlcmF0aW9ucyBleHQ0X2Rpcl9pbm9kZV9vcGVyYXRpb25zOworZXh0ZXJuIHN0cnVjdCBpbm9kZV9vcGVyYXRpb25zIGV4dDRfc3BlY2lhbF9pbm9kZV9vcGVyYXRpb25zOworCisvKiBzeW1saW5rLmMgKi8KK2V4dGVybiBzdHJ1Y3QgaW5vZGVfb3BlcmF0aW9ucyBleHQ0X3N5bWxpbmtfaW5vZGVfb3BlcmF0aW9uczsKK2V4dGVybiBzdHJ1Y3QgaW5vZGVfb3BlcmF0aW9ucyBleHQ0X2Zhc3Rfc3ltbGlua19pbm9kZV9vcGVyYXRpb25zOworCisvKiBleHRlbnRzLmMgKi8KK2V4dGVybiBpbnQgZXh0NF9leHRfdHJlZV9pbml0KGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBpbm9kZSAqKTsKK2V4dGVybiBpbnQgZXh0NF9leHRfd3JpdGVwYWdlX3RyYW5zX2Jsb2NrcyhzdHJ1Y3QgaW5vZGUgKiwgaW50KTsKK2V4dGVybiBpbnQgZXh0NF9leHRfZ2V0X2Jsb2NrcyhoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3QgaW5vZGUgKmlub2RlLAorCQkJZXh0NF9mc2Jsa190IGlibG9jaywKKwkJCXVuc2lnbmVkIGxvbmcgbWF4X2Jsb2Nrcywgc3RydWN0IGJ1ZmZlcl9oZWFkICpiaF9yZXN1bHQsCisJCQlpbnQgY3JlYXRlLCBpbnQgZXh0ZW5kX2Rpc2tzaXplKTsKK2V4dGVybiB2b2lkIGV4dDRfZXh0X3RydW5jYXRlKHN0cnVjdCBpbm9kZSAqLCBzdHJ1Y3QgcGFnZSAqKTsKK2V4dGVybiB2b2lkIGV4dDRfZXh0X2luaXQoc3RydWN0IHN1cGVyX2Jsb2NrICopOworZXh0ZXJuIHZvaWQgZXh0NF9leHRfcmVsZWFzZShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKik7CitzdGF0aWMgaW5saW5lIGludAorZXh0NF9nZXRfYmxvY2tzX3dyYXAoaGFuZGxlX3QgKmhhbmRsZSwgc3RydWN0IGlub2RlICppbm9kZSwgc2VjdG9yX3QgYmxvY2ssCisJCQl1bnNpZ25lZCBsb25nIG1heF9ibG9ja3MsIHN0cnVjdCBidWZmZXJfaGVhZCAqYmgsCisJCQlpbnQgY3JlYXRlLCBpbnQgZXh0ZW5kX2Rpc2tzaXplKQoreworCWlmIChFWFQ0X0koaW5vZGUpLT5pX2ZsYWdzICYgRVhUNF9FWFRFTlRTX0ZMKQorCQlyZXR1cm4gZXh0NF9leHRfZ2V0X2Jsb2NrcyhoYW5kbGUsIGlub2RlLCBibG9jaywgbWF4X2Jsb2NrcywKKwkJCQkJYmgsIGNyZWF0ZSwgZXh0ZW5kX2Rpc2tzaXplKTsKKwlyZXR1cm4gZXh0NF9nZXRfYmxvY2tzX2hhbmRsZShoYW5kbGUsIGlub2RlLCBibG9jaywgbWF4X2Jsb2NrcywgYmgsCisJCQkJCWNyZWF0ZSwgZXh0ZW5kX2Rpc2tzaXplKTsKK30KKworCisjZW5kaWYJLyogX19LRVJORUxfXyAqLworCisjZW5kaWYJLyogX0xJTlVYX0VYVDRfRlNfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9leHQ0X2ZzX2V4dGVudHMuaCBiL2luY2x1ZGUvbGludXgvZXh0NF9mc19leHRlbnRzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTQxY2MyNAotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbGludXgvZXh0NF9mc19leHRlbnRzLmgKQEAgLTAsMCArMSwxOTggQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMtMjAwNiwgQ2x1c3RlciBGaWxlIFN5c3RlbXMsIEluYywgaW5mb0BjbHVzdGVyZnMuY29tCisgKiBXcml0dGVuIGJ5IEFsZXggVG9tYXMgPGFsZXhAY2x1c3RlcmZzLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2VucworICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0KKyAqLworCisjaWZuZGVmIF9MSU5VWF9FWFQ0X0VYVEVOVFMKKyNkZWZpbmUgX0xJTlVYX0VYVDRfRVhURU5UUworCisjaW5jbHVkZSA8bGludXgvZXh0NF9mcy5oPgorCisvKgorICogV2l0aCBBR1JFU1NJVkVfVEVTVCBkZWZpbmVkLCB0aGUgY2FwYWNpdHkgb2YgaW5kZXgvbGVhZiBibG9ja3MKKyAqIGJlY29tZXMgdmVyeSBzbWFsbCwgc28gaW5kZXggc3BsaXQsIGluLWRlcHRoIGdyb3dpbmcgYW5kCisgKiBvdGhlciBoYXJkIGNoYW5nZXMgaGFwcGVuIG11Y2ggbW9yZSBvZnRlbi4KKyAqIFRoaXMgaXMgZm9yIGRlYnVnIHB1cnBvc2VzIG9ubHkuCisgKi8KKyNkZWZpbmUgQUdSRVNTSVZFX1RFU1RfCisKKy8qCisgKiBXaXRoIEVYVEVOVFNfU1RBVFMgZGVmaW5lZCwgdGhlIG51bWJlciBvZiBibG9ja3MgYW5kIGV4dGVudHMKKyAqIGFyZSBjb2xsZWN0ZWQgaW4gdGhlIHRydW5jYXRlIHBhdGguIFRoZXknbGwgYmUgc2hvd24gYXQKKyAqIHVtb3VudCB0aW1lLgorICovCisjZGVmaW5lIEVYVEVOVFNfU1RBVFNfXworCisvKgorICogSWYgQ0hFQ0tfQklOU0VBUkNIIGlzIGRlZmluZWQsIHRoZW4gdGhlIHJlc3VsdHMgb2YgdGhlIGJpbmFyeSBzZWFyY2gKKyAqIHdpbGwgYWxzbyBiZSBjaGVja2VkIGJ5IGxpbmVhciBzZWFyY2guCisgKi8KKyNkZWZpbmUgQ0hFQ0tfQklOU0VBUkNIX18KKworLyoKKyAqIElmIEVYVF9ERUJVRyBpcyBkZWZpbmVkIHlvdSBjYW4gdXNlIHRoZSAnZXh0ZGVidWcnIG1vdW50IG9wdGlvbgorICogdG8gZ2V0IGxvdHMgb2YgaW5mbyBhYm91dCB3aGF0J3MgZ29pbmcgb24uCisgKi8KKyNkZWZpbmUgRVhUX0RFQlVHX18KKyNpZmRlZiBFWFRfREVCVUcKKyNkZWZpbmUgZXh0X2RlYnVnKGEuLi4pCQlwcmludGsoYSkKKyNlbHNlCisjZGVmaW5lIGV4dF9kZWJ1ZyhhLi4uKQorI2VuZGlmCisKKy8qCisgKiBJZiBFWFRfU1RBVFMgaXMgZGVmaW5lZCB0aGVuIHN0YXRzIG51bWJlcnMgYXJlIGNvbGxlY3RlZC4KKyAqIFRoZXNlIG51bWJlciB3aWxsIGJlIGRpc3BsYXllZCBhdCB1bW91bnQgdGltZS4KKyAqLworI2RlZmluZSBFWFRfU1RBVFNfCisKKworLyoKKyAqIGV4dDRfaW5vZGUgaGFzIGlfYmxvY2sgYXJyYXkgKDYwIGJ5dGVzIHRvdGFsKS4KKyAqIFRoZSBmaXJzdCAxMiBieXRlcyBzdG9yZSBleHQ0X2V4dGVudF9oZWFkZXI7CisgKiB0aGUgcmVtYWluZGVyIHN0b3JlcyBhbiBhcnJheSBvZiBleHQ0X2V4dGVudC4KKyAqLworCisvKgorICogVGhpcyBpcyB0aGUgZXh0ZW50IG9uLWRpc2sgc3RydWN0dXJlLgorICogSXQncyB1c2VkIGF0IHRoZSBib3R0b20gb2YgdGhlIHRyZWUuCisgKi8KK3N0cnVjdCBleHQ0X2V4dGVudCB7CisJX19sZTMyCWVlX2Jsb2NrOwkvKiBmaXJzdCBsb2dpY2FsIGJsb2NrIGV4dGVudCBjb3ZlcnMgKi8KKwlfX2xlMTYJZWVfbGVuOwkJLyogbnVtYmVyIG9mIGJsb2NrcyBjb3ZlcmVkIGJ5IGV4dGVudCAqLworCV9fbGUxNgllZV9zdGFydF9oaTsJLyogaGlnaCAxNiBiaXRzIG9mIHBoeXNpY2FsIGJsb2NrICovCisJX19sZTMyCWVlX3N0YXJ0OwkvKiBsb3cgMzIgYml0cyBvZiBwaHlzaWNhbCBibG9jayAqLworfTsKKworLyoKKyAqIFRoaXMgaXMgaW5kZXggb24tZGlzayBzdHJ1Y3R1cmUuCisgKiBJdCdzIHVzZWQgYXQgYWxsIHRoZSBsZXZlbHMgZXhjZXB0IHRoZSBib3R0b20uCisgKi8KK3N0cnVjdCBleHQ0X2V4dGVudF9pZHggeworCV9fbGUzMgllaV9ibG9jazsJLyogaW5kZXggY292ZXJzIGxvZ2ljYWwgYmxvY2tzIGZyb20gJ2Jsb2NrJyAqLworCV9fbGUzMgllaV9sZWFmOwkvKiBwb2ludGVyIHRvIHRoZSBwaHlzaWNhbCBibG9jayBvZiB0aGUgbmV4dCAqCisJCQkJICogbGV2ZWwuIGxlYWYgb3IgbmV4dCBpbmRleCBjb3VsZCBiZSB0aGVyZSAqLworCV9fbGUxNgllaV9sZWFmX2hpOwkvKiBoaWdoIDE2IGJpdHMgb2YgcGh5c2ljYWwgYmxvY2sgKi8KKwlfX3UxNgllaV91bnVzZWQ7Cit9OworCisvKgorICogRWFjaCBibG9jayAobGVhdmVzIGFuZCBpbmRleGVzKSwgZXZlbiBpbm9kZS1zdG9yZWQgaGFzIGhlYWRlci4KKyAqLworc3RydWN0IGV4dDRfZXh0ZW50X2hlYWRlciB7CisJX19sZTE2CWVoX21hZ2ljOwkvKiBwcm9iYWJseSB3aWxsIHN1cHBvcnQgZGlmZmVyZW50IGZvcm1hdHMgKi8KKwlfX2xlMTYJZWhfZW50cmllczsJLyogbnVtYmVyIG9mIHZhbGlkIGVudHJpZXMgKi8KKwlfX2xlMTYJZWhfbWF4OwkJLyogY2FwYWNpdHkgb2Ygc3RvcmUgaW4gZW50cmllcyAqLworCV9fbGUxNgllaF9kZXB0aDsJLyogaGFzIHRyZWUgcmVhbCB1bmRlcmx5aW5nIGJsb2Nrcz8gKi8KKwlfX2xlMzIJZWhfZ2VuZXJhdGlvbjsJLyogZ2VuZXJhdGlvbiBvZiB0aGUgdHJlZSAqLworfTsKKworI2RlZmluZSBFWFQ0X0VYVF9NQUdJQwkJY3B1X3RvX2xlMTYoMHhmMzBhKQorCisvKgorICogQXJyYXkgb2YgZXh0NF9leHRfcGF0aCBjb250YWlucyBwYXRoIHRvIHNvbWUgZXh0ZW50LgorICogQ3JlYXRpb24vbG9va3VwIHJvdXRpbmVzIHVzZSBpdCBmb3IgdHJhdmVyc2FsL3NwbGl0dGluZy9ldGMuCisgKiBUcnVuY2F0ZSB1c2VzIGl0IHRvIHNpbXVsYXRlIHJlY3Vyc2l2ZSB3YWxraW5nLgorICovCitzdHJ1Y3QgZXh0NF9leHRfcGF0aCB7CisJZXh0NF9mc2Jsa190CQkJcF9ibG9jazsKKwlfX3UxNgkJCQlwX2RlcHRoOworCXN0cnVjdCBleHQ0X2V4dGVudAkJKnBfZXh0OworCXN0cnVjdCBleHQ0X2V4dGVudF9pZHgJCSpwX2lkeDsKKwlzdHJ1Y3QgZXh0NF9leHRlbnRfaGVhZGVyCSpwX2hkcjsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQJCSpwX2JoOworfTsKKworLyoKKyAqIHN0cnVjdHVyZSBmb3IgZXh0ZXJuYWwgQVBJCisgKi8KKworI2RlZmluZSBFWFQ0X0VYVF9DQUNIRV9OTwkwCisjZGVmaW5lIEVYVDRfRVhUX0NBQ0hFX0dBUAkxCisjZGVmaW5lIEVYVDRfRVhUX0NBQ0hFX0VYVEVOVAkyCisKKy8qCisgKiB0byBiZSBjYWxsZWQgYnkgZXh0NF9leHRfd2Fsa19zcGFjZSgpCisgKiBuZWdhdGl2ZSByZXRjb2RlIC0gZXJyb3IKKyAqIHBvc2l0aXZlIHJldGNvZGUgLSBzaWduYWwgZm9yIGV4dDRfZXh0X3dhbGtfc3BhY2UoKSwgc2VlIGJlbG93CisgKiBjYWxsYmFjayBtdXN0IHJldHVybiB2YWxpZCBleHRlbnQgKHBhc3NlZCBvciBuZXdseSBjcmVhdGVkKQorICovCit0eXBlZGVmIGludCAoKmV4dF9wcmVwYXJlX2NhbGxiYWNrKShzdHJ1Y3QgaW5vZGUgKiwgc3RydWN0IGV4dDRfZXh0X3BhdGggKiwKKwkJCQkJc3RydWN0IGV4dDRfZXh0X2NhY2hlICosCisJCQkJCXZvaWQgKik7CisKKyNkZWZpbmUgRVhUX0NPTlRJTlVFCTAKKyNkZWZpbmUgRVhUX0JSRUFLCTEKKyNkZWZpbmUgRVhUX1JFUEVBVAkyCisKKworI2RlZmluZSBFWFRfTUFYX0JMT0NLCTB4ZmZmZmZmZmYKKworI2RlZmluZSBFWFRfTUFYX0xFTgkoKDFVTCA8PCAxNSkgLSAxKQorCisKKyNkZWZpbmUgRVhUX0ZJUlNUX0VYVEVOVChfX2hkcl9fKSBcCisJKChzdHJ1Y3QgZXh0NF9leHRlbnQgKikgKCgoY2hhciAqKSAoX19oZHJfXykpICsJCVwKKwkJCQkgc2l6ZW9mKHN0cnVjdCBleHQ0X2V4dGVudF9oZWFkZXIpKSkKKyNkZWZpbmUgRVhUX0ZJUlNUX0lOREVYKF9faGRyX18pIFwKKwkoKHN0cnVjdCBleHQ0X2V4dGVudF9pZHggKikgKCgoY2hhciAqKSAoX19oZHJfXykpICsJXAorCQkJCSAgICAgc2l6ZW9mKHN0cnVjdCBleHQ0X2V4dGVudF9oZWFkZXIpKSkKKyNkZWZpbmUgRVhUX0hBU19GUkVFX0lOREVYKF9fcGF0aF9fKSBcCisgICAgICAgIChsZTE2X3RvX2NwdSgoX19wYXRoX18pLT5wX2hkci0+ZWhfZW50cmllcykgXAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCBsZTE2X3RvX2NwdSgoX19wYXRoX18pLT5wX2hkci0+ZWhfbWF4KSkKKyNkZWZpbmUgRVhUX0xBU1RfRVhURU5UKF9faGRyX18pIFwKKwkoRVhUX0ZJUlNUX0VYVEVOVCgoX19oZHJfXykpICsgbGUxNl90b19jcHUoKF9faGRyX18pLT5laF9lbnRyaWVzKSAtIDEpCisjZGVmaW5lIEVYVF9MQVNUX0lOREVYKF9faGRyX18pIFwKKwkoRVhUX0ZJUlNUX0lOREVYKChfX2hkcl9fKSkgKyBsZTE2X3RvX2NwdSgoX19oZHJfXyktPmVoX2VudHJpZXMpIC0gMSkKKyNkZWZpbmUgRVhUX01BWF9FWFRFTlQoX19oZHJfXykgXAorCShFWFRfRklSU1RfRVhURU5UKChfX2hkcl9fKSkgKyBsZTE2X3RvX2NwdSgoX19oZHJfXyktPmVoX21heCkgLSAxKQorI2RlZmluZSBFWFRfTUFYX0lOREVYKF9faGRyX18pIFwKKwkoRVhUX0ZJUlNUX0lOREVYKChfX2hkcl9fKSkgKyBsZTE2X3RvX2NwdSgoX19oZHJfXyktPmVoX21heCkgLSAxKQorCitzdGF0aWMgaW5saW5lIHN0cnVjdCBleHQ0X2V4dGVudF9oZWFkZXIgKmV4dF9pbm9kZV9oZHIoc3RydWN0IGlub2RlICppbm9kZSkKK3sKKwlyZXR1cm4gKHN0cnVjdCBleHQ0X2V4dGVudF9oZWFkZXIgKikgRVhUNF9JKGlub2RlKS0+aV9kYXRhOworfQorCitzdGF0aWMgaW5saW5lIHN0cnVjdCBleHQ0X2V4dGVudF9oZWFkZXIgKmV4dF9ibG9ja19oZHIoc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCkKK3sKKwlyZXR1cm4gKHN0cnVjdCBleHQ0X2V4dGVudF9oZWFkZXIgKikgYmgtPmJfZGF0YTsKK30KKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBzaG9ydCBleHRfZGVwdGgoc3RydWN0IGlub2RlICppbm9kZSkKK3sKKwlyZXR1cm4gbGUxNl90b19jcHUoZXh0X2lub2RlX2hkcihpbm9kZSktPmVoX2RlcHRoKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGV4dDRfZXh0X3RyZWVfY2hhbmdlZChzdHJ1Y3QgaW5vZGUgKmlub2RlKQoreworCUVYVDRfSShpbm9kZSktPmlfZXh0X2dlbmVyYXRpb24rKzsKK30KKworc3RhdGljIGlubGluZSB2b2lkCitleHQ0X2V4dF9pbnZhbGlkYXRlX2NhY2hlKHN0cnVjdCBpbm9kZSAqaW5vZGUpCit7CisJRVhUNF9JKGlub2RlKS0+aV9jYWNoZWRfZXh0ZW50LmVjX3R5cGUgPSBFWFQ0X0VYVF9DQUNIRV9OTzsKK30KKworZXh0ZXJuIGludCBleHQ0X2V4dGVudF90cmVlX2luaXQoaGFuZGxlX3QgKiwgc3RydWN0IGlub2RlICopOworZXh0ZXJuIGludCBleHQ0X2V4dF9jYWxjX2NyZWRpdHNfZm9yX2luc2VydChzdHJ1Y3QgaW5vZGUgKiwgc3RydWN0IGV4dDRfZXh0X3BhdGggKik7CitleHRlcm4gaW50IGV4dDRfZXh0X2luc2VydF9leHRlbnQoaGFuZGxlX3QgKiwgc3RydWN0IGlub2RlICosIHN0cnVjdCBleHQ0X2V4dF9wYXRoICosIHN0cnVjdCBleHQ0X2V4dGVudCAqKTsKK2V4dGVybiBpbnQgZXh0NF9leHRfd2Fsa19zcGFjZShzdHJ1Y3QgaW5vZGUgKiwgdW5zaWduZWQgbG9uZywgdW5zaWduZWQgbG9uZywgZXh0X3ByZXBhcmVfY2FsbGJhY2ssIHZvaWQgKik7CitleHRlcm4gc3RydWN0IGV4dDRfZXh0X3BhdGggKiBleHQ0X2V4dF9maW5kX2V4dGVudChzdHJ1Y3QgaW5vZGUgKiwgaW50LCBzdHJ1Y3QgZXh0NF9leHRfcGF0aCAqKTsKKworI2VuZGlmIC8qIF9MSU5VWF9FWFQ0X0VYVEVOVFMgKi8KKwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9leHQ0X2ZzX2kuaCBiL2luY2x1ZGUvbGludXgvZXh0NF9mc19pLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmI0MjM3OQotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbGludXgvZXh0NF9mc19pLmgKQEAgLTAsMCArMSwxNTggQEAKKy8qCisgKiAgbGludXgvaW5jbHVkZS9saW51eC9leHQ0X2ZzX2kuaAorICoKKyAqIENvcHlyaWdodCAoQykgMTk5MiwgMTk5MywgMTk5NCwgMTk5NQorICogUmVteSBDYXJkIChjYXJkQG1hc2kuaWJwLmZyKQorICogTGFib3JhdG9pcmUgTUFTSSAtIEluc3RpdHV0IEJsYWlzZSBQYXNjYWwKKyAqIFVuaXZlcnNpdGUgUGllcnJlIGV0IE1hcmllIEN1cmllIChQYXJpcyBWSSkKKyAqCisgKiAgZnJvbQorICoKKyAqICBsaW51eC9pbmNsdWRlL2xpbnV4L21pbml4X2ZzX2kuaAorICoKKyAqICBDb3B5cmlnaHQgKEMpIDE5OTEsIDE5OTIgIExpbnVzIFRvcnZhbGRzCisgKi8KKworI2lmbmRlZiBfTElOVVhfRVhUNF9GU19JCisjZGVmaW5lIF9MSU5VWF9FWFQ0X0ZTX0kKKworI2luY2x1ZGUgPGxpbnV4L3J3c2VtLmg+CisjaW5jbHVkZSA8bGludXgvcmJ0cmVlLmg+CisjaW5jbHVkZSA8bGludXgvc2VxbG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CisKKy8qIGRhdGEgdHlwZSBmb3IgYmxvY2sgb2Zmc2V0IG9mIGJsb2NrIGdyb3VwICovCit0eXBlZGVmIGludCBleHQ0X2dycGJsa190OworCisvKiBkYXRhIHR5cGUgZm9yIGZpbGVzeXN0ZW0td2lkZSBibG9ja3MgbnVtYmVyICovCit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgbG9uZyBleHQ0X2ZzYmxrX3Q7CisKK3N0cnVjdCBleHQ0X3Jlc2VydmVfd2luZG93IHsKKwlleHQ0X2ZzYmxrX3QJX3Jzdl9zdGFydDsJLyogRmlyc3QgYnl0ZSByZXNlcnZlZCAqLworCWV4dDRfZnNibGtfdAlfcnN2X2VuZDsJLyogTGFzdCBieXRlIHJlc2VydmVkIG9yIDAgKi8KK307CisKK3N0cnVjdCBleHQ0X3Jlc2VydmVfd2luZG93X25vZGUgeworCXN0cnVjdCByYl9ub2RlCQlyc3Zfbm9kZTsKKwlfX3UzMgkJCXJzdl9nb2FsX3NpemU7CisJX191MzIJCQlyc3ZfYWxsb2NfaGl0OworCXN0cnVjdCBleHQ0X3Jlc2VydmVfd2luZG93CXJzdl93aW5kb3c7Cit9OworCitzdHJ1Y3QgZXh0NF9ibG9ja19hbGxvY19pbmZvIHsKKwkvKiBpbmZvcm1hdGlvbiBhYm91dCByZXNlcnZhdGlvbiB3aW5kb3cgKi8KKwlzdHJ1Y3QgZXh0NF9yZXNlcnZlX3dpbmRvd19ub2RlCXJzdl93aW5kb3dfbm9kZTsKKwkvKgorCSAqIHdhcyBpX25leHRfYWxsb2NfYmxvY2sgaW4gZXh0NF9pbm9kZV9pbmZvCisJICogaXMgdGhlIGxvZ2ljYWwgKGZpbGUtcmVsYXRpdmUpIG51bWJlciBvZiB0aGUKKwkgKiBtb3N0LXJlY2VudGx5LWFsbG9jYXRlZCBibG9jayBpbiB0aGlzIGZpbGUuCisJICogV2UgdXNlIHRoaXMgZm9yIGRldGVjdGluZyBsaW5lYXJseSBhc2NlbmRpbmcgYWxsb2NhdGlvbiByZXF1ZXN0cy4KKwkgKi8KKwlfX3UzMiAgICAgICAgICAgICAgICAgICBsYXN0X2FsbG9jX2xvZ2ljYWxfYmxvY2s7CisJLyoKKwkgKiBXYXMgaV9uZXh0X2FsbG9jX2dvYWwgaW4gZXh0NF9pbm9kZV9pbmZvCisJICogaXMgdGhlICpwaHlzaWNhbCogY29tcGFuaW9uIHRvIGlfbmV4dF9hbGxvY19ibG9jay4KKwkgKiBpdCB0aGUgdGhlIHBoeXNpY2FsIGJsb2NrIG51bWJlciBvZiB0aGUgYmxvY2sgd2hpY2ggd2FzIG1vc3QtcmVjZW50bAorCSAqIGFsbG9jYXRlZCB0byB0aGlzIGZpbGUuICBUaGlzIGdpdmUgdXMgdGhlIGdvYWwgKHRhcmdldCkgZm9yIHRoZSBuZXh0CisJICogYWxsb2NhdGlvbiB3aGVuIHdlIGRldGVjdCBsaW5lYXJseSBhc2NlbmRpbmcgcmVxdWVzdHMuCisJICovCisJZXh0NF9mc2Jsa190CQlsYXN0X2FsbG9jX3BoeXNpY2FsX2Jsb2NrOworfTsKKworI2RlZmluZSByc3Zfc3RhcnQgcnN2X3dpbmRvdy5fcnN2X3N0YXJ0CisjZGVmaW5lIHJzdl9lbmQgcnN2X3dpbmRvdy5fcnN2X2VuZAorCisvKgorICogc3RvcmFnZSBmb3IgY2FjaGVkIGV4dGVudAorICovCitzdHJ1Y3QgZXh0NF9leHRfY2FjaGUgeworCWV4dDRfZnNibGtfdAllY19zdGFydDsKKwlfX3UzMgkJZWNfYmxvY2s7CisJX191MzIJCWVjX2xlbjsgLyogbXVzdCBiZSAzMmJpdCB0byByZXR1cm4gaG9sZXMgKi8KKwlfX3UzMgkJZWNfdHlwZTsKK307CisKKy8qCisgKiB0aGlyZCBleHRlbmRlZCBmaWxlIHN5c3RlbSBpbm9kZSBkYXRhIGluIG1lbW9yeQorICovCitzdHJ1Y3QgZXh0NF9pbm9kZV9pbmZvIHsKKwlfX2xlMzIJaV9kYXRhWzE1XTsJLyogdW5jb252ZXJ0ZWQgKi8KKwlfX3UzMglpX2ZsYWdzOworI2lmZGVmIEVYVDRfRlJBR01FTlRTCisJX191MzIJaV9mYWRkcjsKKwlfX3U4CWlfZnJhZ19ubzsKKwlfX3U4CWlfZnJhZ19zaXplOworI2VuZGlmCisJZXh0NF9mc2Jsa190CWlfZmlsZV9hY2w7CisJX191MzIJaV9kaXJfYWNsOworCV9fdTMyCWlfZHRpbWU7CisKKwkvKgorCSAqIGlfYmxvY2tfZ3JvdXAgaXMgdGhlIG51bWJlciBvZiB0aGUgYmxvY2sgZ3JvdXAgd2hpY2ggY29udGFpbnMKKwkgKiB0aGlzIGZpbGUncyBpbm9kZS4gIENvbnN0YW50IGFjcm9zcyB0aGUgbGlmZXRpbWUgb2YgdGhlIGlub2RlLAorCSAqIGl0IGlzIHVlZCBmb3IgbWFraW5nIGJsb2NrIGFsbG9jYXRpb24gZGVjaXNpb25zIC0gd2UgdHJ5IHRvCisJICogcGxhY2UgYSBmaWxlJ3MgZGF0YSBibG9ja3MgbmVhciBpdHMgaW5vZGUgYmxvY2ssIGFuZCBuZXcgaW5vZGVzCisJICogbmVhciB0byB0aGVpciBwYXJlbnQgZGlyZWN0b3J5J3MgaW5vZGUuCisJICovCisJX191MzIJaV9ibG9ja19ncm91cDsKKwlfX3UzMglpX3N0YXRlOwkJLyogRHluYW1pYyBzdGF0ZSBmbGFncyBmb3IgZXh0NCAqLworCisJLyogYmxvY2sgcmVzZXJ2YXRpb24gaW5mbyAqLworCXN0cnVjdCBleHQ0X2Jsb2NrX2FsbG9jX2luZm8gKmlfYmxvY2tfYWxsb2NfaW5mbzsKKworCV9fdTMyCWlfZGlyX3N0YXJ0X2xvb2t1cDsKKyNpZmRlZiBDT05GSUdfRVhUNERFVl9GU19YQVRUUgorCS8qCisJICogRXh0ZW5kZWQgYXR0cmlidXRlcyBjYW4gYmUgcmVhZCBpbmRlcGVuZGVudGx5IG9mIHRoZSBtYWluIGZpbGUKKwkgKiBkYXRhLiBUYWtpbmcgaV9tdXRleCBldmVuIHdoZW4gcmVhZGluZyB3b3VsZCBjYXVzZSBjb250ZW50aW9uCisJICogYmV0d2VlbiByZWFkZXJzIG9mIEVBcyBhbmQgd3JpdGVycyBvZiByZWd1bGFyIGZpbGUgZGF0YSwgc28KKwkgKiBpbnN0ZWFkIHdlIHN5bmNocm9uaXplIG9uIHhhdHRyX3NlbSB3aGVuIHJlYWRpbmcgb3IgY2hhbmdpbmcKKwkgKiBFQXMuCisJICovCisJc3RydWN0IHJ3X3NlbWFwaG9yZSB4YXR0cl9zZW07CisjZW5kaWYKKyNpZmRlZiBDT05GSUdfRVhUNERFVl9GU19QT1NJWF9BQ0wKKwlzdHJ1Y3QgcG9zaXhfYWNsCSppX2FjbDsKKwlzdHJ1Y3QgcG9zaXhfYWNsCSppX2RlZmF1bHRfYWNsOworI2VuZGlmCisKKwlzdHJ1Y3QgbGlzdF9oZWFkIGlfb3JwaGFuOwkvKiB1bmxpbmtlZCBidXQgb3BlbiBpbm9kZXMgKi8KKworCS8qCisJICogaV9kaXNrc2l6ZSBrZWVwcyB0cmFjayBvZiB3aGF0IHRoZSBpbm9kZSBzaXplIGlzIE9OIERJU0ssIG5vdAorCSAqIGluIG1lbW9yeS4gIER1cmluZyB0cnVuY2F0ZSwgaV9zaXplIGlzIHNldCB0byB0aGUgbmV3IHNpemUgYnkKKwkgKiB0aGUgVkZTIHByaW9yIHRvIGNhbGxpbmcgZXh0NF90cnVuY2F0ZSgpLCBidXQgdGhlIGZpbGVzeXN0ZW0gd29uJ3QKKwkgKiBzZXQgaV9kaXNrc2l6ZSB0byAwIHVudGlsIHRoZSB0cnVuY2F0ZSBpcyBhY3R1YWxseSB1bmRlciB3YXkuCisJICoKKwkgKiBUaGUgaW50ZW50IGlzIHRoYXQgaV9kaXNrc2l6ZSBhbHdheXMgcmVwcmVzZW50cyB0aGUgYmxvY2tzIHdoaWNoCisJICogYXJlIHVzZWQgYnkgdGhpcyBmaWxlLiAgVGhpcyBhbGxvd3MgcmVjb3ZlcnkgdG8gcmVzdGFydCB0cnVuY2F0ZQorCSAqIG9uIG9ycGhhbnMgaWYgd2UgY3Jhc2ggZHVyaW5nIHRydW5jYXRlLiAgV2UgYWN0dWFsbHkgd3JpdGUgaV9kaXNrc2l6ZQorCSAqIGludG8gdGhlIG9uLWRpc2sgaW5vZGUgd2hlbiB3cml0aW5nIGlub2RlcyBvdXQsIGluc3RlYWQgb2YgaV9zaXplLgorCSAqCisJICogVGhlIG9ubHkgdGltZSB3aGVuIGlfZGlza3NpemUgYW5kIGlfc2l6ZSBtYXkgYmUgZGlmZmVyZW50IGlzIHdoZW4KKwkgKiBhIHRydW5jYXRlIGlzIGluIHByb2dyZXNzLiAgVGhlIG9ubHkgdGhpbmdzIHdoaWNoIGNoYW5nZSBpX2Rpc2tzaXplCisJICogYXJlIGV4dDRfZ2V0X2Jsb2NrIChncm93dGgpIGFuZCBleHQ0X3RydW5jYXRlIChzaHJpbmt0aCkuCisJICovCisJbG9mZl90CWlfZGlza3NpemU7CisKKwkvKiBvbi1kaXNrIGFkZGl0aW9uYWwgbGVuZ3RoICovCisJX191MTYgaV9leHRyYV9pc2l6ZTsKKworCS8qCisJICogdHJ1bmNhdGVfbXV0ZXggaXMgZm9yIHNlcmlhbGlzaW5nIGV4dDRfdHJ1bmNhdGUoKSBhZ2FpbnN0CisJICogZXh0NF9nZXRibG9jaygpLiAgSW4gdGhlIDIuNCBleHQyIGRlc2lnbiwgZ3JlYXQgY2h1bmtzIG9mIGlub2RlJ3MKKwkgKiBkYXRhIHRyZWUgYXJlIGNob3BwZWQgb2ZmIGR1cmluZyB0cnVuY2F0ZS4gV2UgY2FuJ3QgZG8gdGhhdCBpbgorCSAqIGV4dDQgYmVjYXVzZSB3aGVuZXZlciB3ZSBwZXJmb3JtIGludGVybWVkaWF0ZSBjb21taXRzIGR1cmluZworCSAqIHRydW5jYXRlLCB0aGUgaW5vZGUgYW5kIGFsbCB0aGUgbWV0YWRhdGEgYmxvY2tzICptdXN0KiBiZSBpbiBhCisJICogY29uc2lzdGVudCBzdGF0ZSB3aGljaCBhbGxvd3MgdHJ1bmNhdGlvbiBvZiB0aGUgb3JwaGFucyB0byByZXN0YXJ0CisJICogZHVyaW5nIHJlY292ZXJ5LiAgSGVuY2Ugd2UgbXVzdCBmaXggdGhlIGdldF9ibG9jay12cy10cnVuY2F0ZSByYWNlCisJICogYnkgb3RoZXIgbWVhbnMsIHNvIHdlIGhhdmUgdHJ1bmNhdGVfbXV0ZXguCisJICovCisJc3RydWN0IG11dGV4IHRydW5jYXRlX211dGV4OworCXN0cnVjdCBpbm9kZSB2ZnNfaW5vZGU7CisKKwl1bnNpZ25lZCBsb25nIGlfZXh0X2dlbmVyYXRpb247CisJc3RydWN0IGV4dDRfZXh0X2NhY2hlIGlfY2FjaGVkX2V4dGVudDsKK307CisKKyNlbmRpZgkvKiBfTElOVVhfRVhUNF9GU19JICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2V4dDRfZnNfc2IuaCBiL2luY2x1ZGUvbGludXgvZXh0NF9mc19zYi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY5MWE3MTMKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2xpbnV4L2V4dDRfZnNfc2IuaApAQCAtMCwwICsxLDk0IEBACisvKgorICogIGxpbnV4L2luY2x1ZGUvbGludXgvZXh0NF9mc19zYi5oCisgKgorICogQ29weXJpZ2h0IChDKSAxOTkyLCAxOTkzLCAxOTk0LCAxOTk1CisgKiBSZW15IENhcmQgKGNhcmRAbWFzaS5pYnAuZnIpCisgKiBMYWJvcmF0b2lyZSBNQVNJIC0gSW5zdGl0dXQgQmxhaXNlIFBhc2NhbAorICogVW5pdmVyc2l0ZSBQaWVycmUgZXQgTWFyaWUgQ3VyaWUgKFBhcmlzIFZJKQorICoKKyAqICBmcm9tCisgKgorICogIGxpbnV4L2luY2x1ZGUvbGludXgvbWluaXhfZnNfc2IuaAorICoKKyAqICBDb3B5cmlnaHQgKEMpIDE5OTEsIDE5OTIgIExpbnVzIFRvcnZhbGRzCisgKi8KKworI2lmbmRlZiBfTElOVVhfRVhUNF9GU19TQgorI2RlZmluZSBfTElOVVhfRVhUNF9GU19TQgorCisjaWZkZWYgX19LRVJORUxfXworI2luY2x1ZGUgPGxpbnV4L3RpbWVyLmg+CisjaW5jbHVkZSA8bGludXgvd2FpdC5oPgorI2luY2x1ZGUgPGxpbnV4L2Jsb2NrZ3JvdXBfbG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L3BlcmNwdV9jb3VudGVyLmg+CisjZW5kaWYKKyNpbmNsdWRlIDxsaW51eC9yYnRyZWUuaD4KKworLyoKKyAqIHRoaXJkIGV4dGVuZGVkLWZzIHN1cGVyLWJsb2NrIGRhdGEgaW4gbWVtb3J5CisgKi8KK3N0cnVjdCBleHQ0X3NiX2luZm8geworCXVuc2lnbmVkIGxvbmcgc19mcmFnX3NpemU7CS8qIFNpemUgb2YgYSBmcmFnbWVudCBpbiBieXRlcyAqLworCXVuc2lnbmVkIGxvbmcgc19kZXNjX3NpemU7CS8qIFNpemUgb2YgYSBncm91cCBkZXNjcmlwdG9yIGluIGJ5dGVzICovCisJdW5zaWduZWQgbG9uZyBzX2ZyYWdzX3Blcl9ibG9jazsvKiBOdW1iZXIgb2YgZnJhZ21lbnRzIHBlciBibG9jayAqLworCXVuc2lnbmVkIGxvbmcgc19pbm9kZXNfcGVyX2Jsb2NrOy8qIE51bWJlciBvZiBpbm9kZXMgcGVyIGJsb2NrICovCisJdW5zaWduZWQgbG9uZyBzX2ZyYWdzX3Blcl9ncm91cDsvKiBOdW1iZXIgb2YgZnJhZ21lbnRzIGluIGEgZ3JvdXAgKi8KKwl1bnNpZ25lZCBsb25nIHNfYmxvY2tzX3Blcl9ncm91cDsvKiBOdW1iZXIgb2YgYmxvY2tzIGluIGEgZ3JvdXAgKi8KKwl1bnNpZ25lZCBsb25nIHNfaW5vZGVzX3Blcl9ncm91cDsvKiBOdW1iZXIgb2YgaW5vZGVzIGluIGEgZ3JvdXAgKi8KKwl1bnNpZ25lZCBsb25nIHNfaXRiX3Blcl9ncm91cDsJLyogTnVtYmVyIG9mIGlub2RlIHRhYmxlIGJsb2NrcyBwZXIgZ3JvdXAgKi8KKwl1bnNpZ25lZCBsb25nIHNfZ2RiX2NvdW50OwkvKiBOdW1iZXIgb2YgZ3JvdXAgZGVzY3JpcHRvciBibG9ja3MgKi8KKwl1bnNpZ25lZCBsb25nIHNfZGVzY19wZXJfYmxvY2s7CS8qIE51bWJlciBvZiBncm91cCBkZXNjcmlwdG9ycyBwZXIgYmxvY2sgKi8KKwl1bnNpZ25lZCBsb25nIHNfZ3JvdXBzX2NvdW50OwkvKiBOdW1iZXIgb2YgZ3JvdXBzIGluIHRoZSBmcyAqLworCXN0cnVjdCBidWZmZXJfaGVhZCAqIHNfc2JoOwkvKiBCdWZmZXIgY29udGFpbmluZyB0aGUgc3VwZXIgYmxvY2sgKi8KKwlzdHJ1Y3QgZXh0NF9zdXBlcl9ibG9jayAqIHNfZXM7CS8qIFBvaW50ZXIgdG8gdGhlIHN1cGVyIGJsb2NrIGluIHRoZSBidWZmZXIgKi8KKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKiogc19ncm91cF9kZXNjOworCXVuc2lnbmVkIGxvbmcgIHNfbW91bnRfb3B0OworCXVpZF90IHNfcmVzdWlkOworCWdpZF90IHNfcmVzZ2lkOworCXVuc2lnbmVkIHNob3J0IHNfbW91bnRfc3RhdGU7CisJdW5zaWduZWQgc2hvcnQgc19wYWQ7CisJaW50IHNfYWRkcl9wZXJfYmxvY2tfYml0czsKKwlpbnQgc19kZXNjX3Blcl9ibG9ja19iaXRzOworCWludCBzX2lub2RlX3NpemU7CisJaW50IHNfZmlyc3RfaW5vOworCXNwaW5sb2NrX3Qgc19uZXh0X2dlbl9sb2NrOworCXUzMiBzX25leHRfZ2VuZXJhdGlvbjsKKwl1MzIgc19oYXNoX3NlZWRbNF07CisJaW50IHNfZGVmX2hhc2hfdmVyc2lvbjsKKwlzdHJ1Y3QgcGVyY3B1X2NvdW50ZXIgc19mcmVlYmxvY2tzX2NvdW50ZXI7CisJc3RydWN0IHBlcmNwdV9jb3VudGVyIHNfZnJlZWlub2Rlc19jb3VudGVyOworCXN0cnVjdCBwZXJjcHVfY291bnRlciBzX2RpcnNfY291bnRlcjsKKwlzdHJ1Y3QgYmxvY2tncm91cF9sb2NrIHNfYmxvY2tncm91cF9sb2NrOworCisJLyogcm9vdCBvZiB0aGUgcGVyIGZzIHJlc2VydmF0aW9uIHdpbmRvdyB0cmVlICovCisJc3BpbmxvY2tfdCBzX3Jzdl93aW5kb3dfbG9jazsKKwlzdHJ1Y3QgcmJfcm9vdCBzX3Jzdl93aW5kb3dfcm9vdDsKKwlzdHJ1Y3QgZXh0NF9yZXNlcnZlX3dpbmRvd19ub2RlIHNfcnN2X3dpbmRvd19oZWFkOworCisJLyogSm91cm5hbGluZyAqLworCXN0cnVjdCBpbm9kZSAqIHNfam91cm5hbF9pbm9kZTsKKwlzdHJ1Y3Qgam91cm5hbF9zICogc19qb3VybmFsOworCXN0cnVjdCBsaXN0X2hlYWQgc19vcnBoYW47CisJdW5zaWduZWQgbG9uZyBzX2NvbW1pdF9pbnRlcnZhbDsKKwlzdHJ1Y3QgYmxvY2tfZGV2aWNlICpqb3VybmFsX2JkZXY7CisjaWZkZWYgQ09ORklHX0pCRF9ERUJVRworCXN0cnVjdCB0aW1lcl9saXN0IHR1cm5fcm9fdGltZXI7CS8qIEZvciB0dXJuaW5nIHJlYWQtb25seSAoY3Jhc2ggc2ltdWxhdGlvbikgKi8KKwl3YWl0X3F1ZXVlX2hlYWRfdCByb193YWl0X3F1ZXVlOwkvKiBGb3IgcGVvcGxlIHdhaXRpbmcgZm9yIHRoZSBmcyB0byBnbyByZWFkLW9ubHkgKi8KKyNlbmRpZgorI2lmZGVmIENPTkZJR19RVU9UQQorCWNoYXIgKnNfcWZfbmFtZXNbTUFYUVVPVEFTXTsJCS8qIE5hbWVzIG9mIHF1b3RhIGZpbGVzIHdpdGggam91cm5hbGxlZCBxdW90YSAqLworCWludCBzX2pxdW90YV9mbXQ7CQkJLyogRm9ybWF0IG9mIHF1b3RhIHRvIHVzZSAqLworI2VuZGlmCisKKyNpZmRlZiBFWFRFTlRTX1NUQVRTCisJLyogZXh0NCBleHRlbnRzIHN0YXRzICovCisJdW5zaWduZWQgbG9uZyBzX2V4dF9taW47CisJdW5zaWduZWQgbG9uZyBzX2V4dF9tYXg7CisJdW5zaWduZWQgbG9uZyBzX2RlcHRoX21heDsKKwlzcGlubG9ja190IHNfZXh0X3N0YXRzX2xvY2s7CisJdW5zaWduZWQgbG9uZyBzX2V4dF9ibG9ja3M7CisJdW5zaWduZWQgbG9uZyBzX2V4dF9leHRlbnRzOworI2VuZGlmCit9OworCisjZW5kaWYJLyogX0xJTlVYX0VYVDRfRlNfU0IgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvZXh0NF9qYmQyLmggYi9pbmNsdWRlL2xpbnV4L2V4dDRfamJkMi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcyZGQ2MzEKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2xpbnV4L2V4dDRfamJkMi5oCkBAIC0wLDAgKzEsMjczIEBACisvKgorICogbGludXgvaW5jbHVkZS9saW51eC9leHQ0X2piZDIuaAorICoKKyAqIFdyaXR0ZW4gYnkgU3RlcGhlbiBDLiBUd2VlZGllIDxzY3RAcmVkaGF0LmNvbT4sIDE5OTkKKyAqCisgKiBDb3B5cmlnaHQgMTk5OC0tMTk5OSBSZWQgSGF0IGNvcnAgLS0tIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgTGludXgga2VybmVsIGFuZCBpcyBtYWRlIGF2YWlsYWJsZSB1bmRlcgorICogdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgdmVyc2lvbiAyLCBvciBhdCB5b3VyCisgKiBvcHRpb24sIGFueSBsYXRlciB2ZXJzaW9uLCBpbmNvcnBvcmF0ZWQgaGVyZWluIGJ5IHJlZmVyZW5jZS4KKyAqCisgKiBFeHQ0LXNwZWNpZmljIGpvdXJuYWxpbmcgZXh0ZW5zaW9ucy4KKyAqLworCisjaWZuZGVmIF9MSU5VWF9FWFQ0X0pCRF9ICisjZGVmaW5lIF9MSU5VWF9FWFQ0X0pCRF9ICisKKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L2piZDIuaD4KKyNpbmNsdWRlIDxsaW51eC9leHQ0X2ZzLmg+CisKKyNkZWZpbmUgRVhUNF9KT1VSTkFMKGlub2RlKQkoRVhUNF9TQigoaW5vZGUpLT5pX3NiKS0+c19qb3VybmFsKQorCisvKiBEZWZpbmUgdGhlIG51bWJlciBvZiBibG9ja3Mgd2UgbmVlZCB0byBhY2NvdW50IHRvIGEgdHJhbnNhY3Rpb24gdG8KKyAqIG1vZGlmeSBvbmUgYmxvY2sgb2YgZGF0YS4KKyAqCisgKiBXZSBtYXkgaGF2ZSB0byB0b3VjaCBvbmUgaW5vZGUsIG9uZSBiaXRtYXAgYnVmZmVyLCB1cCB0byB0aHJlZQorICogaW5kaXJlY3Rpb24gYmxvY2tzLCB0aGUgZ3JvdXAgYW5kIHN1cGVyYmxvY2sgc3VtbWFyaWVzLCBhbmQgdGhlIGRhdGEKKyAqIGJsb2NrIHRvIGNvbXBsZXRlIHRoZSB0cmFuc2FjdGlvbi4KKyAqCisgKiBGb3IgZXh0ZW50cy1lbmFibGVkIGZzIHdlIG1heSBoYXZlIHRvIGFsbG9jYXRlIGFuZCBtb2RpZnkgdXAgdG8KKyAqIDUgbGV2ZWxzIG9mIHRyZWUgKyByb290IHdoaWNoIGFyZSBzdG9yZWQgaW4gdGhlIGlub2RlLiAqLworCisjZGVmaW5lIEVYVDRfU0lOR0xFREFUQV9UUkFOU19CTE9DS1Moc2IpCQkJCVwKKwkoRVhUNF9IQVNfSU5DT01QQVRfRkVBVFVSRShzYiwgRVhUNF9GRUFUVVJFX0lOQ09NUEFUX0VYVEVOVFMpCVwKKwkJfHwgdGVzdF9vcHQoc2IsIEVYVEVOVFMpID8gMjdVIDogOFUpCisKKy8qIEV4dGVuZGVkIGF0dHJpYnV0ZSBvcGVyYXRpb25zIHRvdWNoIGF0IG1vc3QgdHdvIGRhdGEgYnVmZmVycywKKyAqIHR3byBiaXRtYXAgYnVmZmVycywgYW5kIHR3byBncm91cCBzdW1tYXJpZXMsIGluIGFkZGl0aW9uIHRvIHRoZSBpbm9kZQorICogYW5kIHRoZSBzdXBlcmJsb2NrLCB3aGljaCBhcmUgYWxyZWFkeSBhY2NvdW50ZWQgZm9yLiAqLworCisjZGVmaW5lIEVYVDRfWEFUVFJfVFJBTlNfQkxPQ0tTCQk2VQorCisvKiBEZWZpbmUgdGhlIG1pbmltdW0gc2l6ZSBmb3IgYSB0cmFuc2FjdGlvbiB3aGljaCBtb2RpZmllcyBkYXRhLiAgVGhpcworICogbmVlZHMgdG8gdGFrZSBpbnRvIGFjY291bnQgdGhlIGZhY3QgdGhhdCB3ZSBtYXkgZW5kIHVwIG1vZGlmeWluZyB0d28KKyAqIHF1b3RhIGZpbGVzIHRvbyAob25lIGZvciB0aGUgZ3JvdXAsIG9uZSBmb3IgdGhlIHVzZXIgcXVvdGEpLiAgVGhlCisgKiBzdXBlcmJsb2NrIG9ubHkgZ2V0cyB1cGRhdGVkIG9uY2UsIG9mIGNvdXJzZSwgc28gZG9uJ3QgYm90aGVyCisgKiBjb3VudGluZyB0aGF0IGFnYWluIGZvciB0aGUgcXVvdGEgdXBkYXRlcy4gKi8KKworI2RlZmluZSBFWFQ0X0RBVEFfVFJBTlNfQkxPQ0tTKHNiKQkoRVhUNF9TSU5HTEVEQVRBX1RSQU5TX0JMT0NLUyhzYikgKyBcCisJCQkJCSBFWFQ0X1hBVFRSX1RSQU5TX0JMT0NLUyAtIDIgKyBcCisJCQkJCSAyKkVYVDRfUVVPVEFfVFJBTlNfQkxPQ0tTKHNiKSkKKworLyogRGVsZXRlIG9wZXJhdGlvbnMgcG90ZW50aWFsbHkgaGl0IG9uZSBkaXJlY3RvcnkncyBuYW1lc3BhY2UgcGx1cyBhbgorICogZW50aXJlIGlub2RlLCBwbHVzIGFyYml0cmFyeSBhbW91bnRzIG9mIGJpdG1hcC9pbmRpcmVjdGlvbiBkYXRhLiAgQmUKKyAqIGdlbmVyb3VzLiAgV2UgY2FuIGdyb3cgdGhlIGRlbGV0ZSB0cmFuc2FjdGlvbiBsYXRlciBpZiBuZWNlc3NhcnkuICovCisKKyNkZWZpbmUgRVhUNF9ERUxFVEVfVFJBTlNfQkxPQ0tTKHNiKQkoMiAqIEVYVDRfREFUQV9UUkFOU19CTE9DS1Moc2IpICsgNjQpCisKKy8qIERlZmluZSBhbiBhcmJpdHJhcnkgbGltaXQgZm9yIHRoZSBhbW91bnQgb2YgZGF0YSB3ZSB3aWxsIGFudGljaXBhdGUKKyAqIHdyaXRpbmcgdG8gYW55IGdpdmVuIHRyYW5zYWN0aW9uLiAgRm9yIHVuYm91bmRlZCB0cmFuc2FjdGlvbnMgc3VjaCBhcworICogd3JpdGUoMikgYW5kIHRydW5jYXRlKDIpIHdlIGNhbiB3cml0ZSBtb3JlIHRoYW4gdGhpcywgYnV0IHdlIGFsd2F5cworICogc3RhcnQgb2ZmIGF0IHRoZSBtYXhpbXVtIHRyYW5zYWN0aW9uIHNpemUgYW5kIGdyb3cgdGhlIHRyYW5zYWN0aW9uCisgKiBvcHRpbWlzdGljYWxseSBhcyB3ZSBnby4gKi8KKworI2RlZmluZSBFWFQ0X01BWF9UUkFOU19EQVRBCQk2NFUKKworLyogV2UgYnJlYWsgdXAgYSBsYXJnZSB0cnVuY2F0ZSBvciB3cml0ZSB0cmFuc2FjdGlvbiBvbmNlIHRoZSBoYW5kbGUncworICogYnVmZmVyIGNyZWRpdHMgZ2V0cyB0aGlzIGxvdywgd2UgbmVlZCBlaXRoZXIgdG8gZXh0ZW5kIHRoZQorICogdHJhbnNhY3Rpb24gb3IgdG8gc3RhcnQgYSBuZXcgb25lLiAgUmVzZXJ2ZSBlbm91Z2ggc3BhY2UgaGVyZSBmb3IKKyAqIGlub2RlLCBiaXRtYXAsIHN1cGVyYmxvY2ssIGdyb3VwIGFuZCBpbmRpcmVjdGlvbiB1cGRhdGVzIGZvciBhdCBsZWFzdAorICogb25lIGJsb2NrLCBwbHVzIHR3byBxdW90YSB1cGRhdGVzLiAgUXVvdGEgYWxsb2NhdGlvbnMgYXJlIG5vdAorICogbmVlZGVkLiAqLworCisjZGVmaW5lIEVYVDRfUkVTRVJWRV9UUkFOU19CTE9DS1MJMTJVCisKKyNkZWZpbmUgRVhUNF9JTkRFWF9FWFRSQV9UUkFOU19CTE9DS1MJOAorCisjaWZkZWYgQ09ORklHX1FVT1RBCisvKiBBbW91bnQgb2YgYmxvY2tzIG5lZWRlZCBmb3IgcXVvdGEgdXBkYXRlIC0gd2Uga25vdyB0aGF0IHRoZSBzdHJ1Y3R1cmUgd2FzCisgKiBhbGxvY2F0ZWQgc28gd2UgbmVlZCB0byB1cGRhdGUgb25seSBpbm9kZStkYXRhICovCisjZGVmaW5lIEVYVDRfUVVPVEFfVFJBTlNfQkxPQ0tTKHNiKSAodGVzdF9vcHQoc2IsIFFVT1RBKSA/IDIgOiAwKQorLyogQW1vdW50IG9mIGJsb2NrcyBuZWVkZWQgZm9yIHF1b3RhIGluc2VydC9kZWxldGUgLSB3ZSBkbyBzb21lIGJsb2NrIHdyaXRlcworICogYnV0IGlub2RlLCBzYiBhbmQgZ3JvdXAgdXBkYXRlcyBhcmUgZG9uZSBvbmx5IG9uY2UgKi8KKyNkZWZpbmUgRVhUNF9RVU9UQV9JTklUX0JMT0NLUyhzYikgKHRlc3Rfb3B0KHNiLCBRVU9UQSkgPyAoRFFVT1RfSU5JVF9BTExPQypcCisJCShFWFQ0X1NJTkdMRURBVEFfVFJBTlNfQkxPQ0tTKHNiKS0zKSszK0RRVU9UX0lOSVRfUkVXUklURSkgOiAwKQorI2RlZmluZSBFWFQ0X1FVT1RBX0RFTF9CTE9DS1Moc2IpICh0ZXN0X29wdChzYiwgUVVPVEEpID8gKERRVU9UX0RFTF9BTExPQypcCisJCShFWFQ0X1NJTkdMRURBVEFfVFJBTlNfQkxPQ0tTKHNiKS0zKSszK0RRVU9UX0RFTF9SRVdSSVRFKSA6IDApCisjZWxzZQorI2RlZmluZSBFWFQ0X1FVT1RBX1RSQU5TX0JMT0NLUyhzYikgMAorI2RlZmluZSBFWFQ0X1FVT1RBX0lOSVRfQkxPQ0tTKHNiKSAwCisjZGVmaW5lIEVYVDRfUVVPVEFfREVMX0JMT0NLUyhzYikgMAorI2VuZGlmCisKK2ludAorZXh0NF9tYXJrX2lsb2NfZGlydHkoaGFuZGxlX3QgKmhhbmRsZSwKKwkJICAgICBzdHJ1Y3QgaW5vZGUgKmlub2RlLAorCQkgICAgIHN0cnVjdCBleHQ0X2lsb2MgKmlsb2MpOworCisvKgorICogT24gc3VjY2VzcywgV2UgZW5kIHVwIHdpdGggYW4gb3V0c3RhbmRpbmcgcmVmZXJlbmNlIGNvdW50IGFnYWluc3QKKyAqIGlsb2MtPmJoLiAgVGhpcyBfbXVzdF8gYmUgY2xlYW5lZCB1cCBsYXRlci4KKyAqLworCitpbnQgZXh0NF9yZXNlcnZlX2lub2RlX3dyaXRlKGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBpbm9kZSAqaW5vZGUsCisJCQlzdHJ1Y3QgZXh0NF9pbG9jICppbG9jKTsKKworaW50IGV4dDRfbWFya19pbm9kZV9kaXJ0eShoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3QgaW5vZGUgKmlub2RlKTsKKworLyoKKyAqIFdyYXBwZXIgZnVuY3Rpb25zIHdpdGggd2hpY2ggZXh0NCBjYWxscyBpbnRvIEpCRC4gIFRoZSBpbnRlbnQgaGVyZSBpcworICogdG8gYWxsb3cgdGhlc2UgdG8gYmUgdHVybmVkIGludG8gYXBwcm9wcmlhdGUgc3R1YnMgc28gZXh0NCBjYW4gY29udHJvbAorICogZXh0MiBmaWxlc3lzdGVtcywgc28gZXh0MitleHQ0IHN5c3RlbXMgb25seSBuZWUgb25lIGZzLiAgVGhpcyB3b3JrIGhhc24ndAorICogYmVlbiBkb25lIHlldC4KKyAqLworCit2b2lkIGV4dDRfam91cm5hbF9hYm9ydF9oYW5kbGUoY29uc3QgY2hhciAqY2FsbGVyLCBjb25zdCBjaGFyICplcnJfZm4sCisJCXN0cnVjdCBidWZmZXJfaGVhZCAqYmgsIGhhbmRsZV90ICpoYW5kbGUsIGludCBlcnIpOworCitzdGF0aWMgaW5saW5lIGludAorX19leHQ0X2pvdXJuYWxfZ2V0X3VuZG9fYWNjZXNzKGNvbnN0IGNoYXIgKndoZXJlLCBoYW5kbGVfdCAqaGFuZGxlLAorCQkJCXN0cnVjdCBidWZmZXJfaGVhZCAqYmgpCit7CisJaW50IGVyciA9IGpiZDJfam91cm5hbF9nZXRfdW5kb19hY2Nlc3MoaGFuZGxlLCBiaCk7CisJaWYgKGVycikKKwkJZXh0NF9qb3VybmFsX2Fib3J0X2hhbmRsZSh3aGVyZSwgX19GVU5DVElPTl9fLCBiaCwgaGFuZGxlLGVycik7CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGlubGluZSBpbnQKK19fZXh0NF9qb3VybmFsX2dldF93cml0ZV9hY2Nlc3MoY29uc3QgY2hhciAqd2hlcmUsIGhhbmRsZV90ICpoYW5kbGUsCisJCQkJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCkKK3sKKwlpbnQgZXJyID0gamJkMl9qb3VybmFsX2dldF93cml0ZV9hY2Nlc3MoaGFuZGxlLCBiaCk7CisJaWYgKGVycikKKwkJZXh0NF9qb3VybmFsX2Fib3J0X2hhbmRsZSh3aGVyZSwgX19GVU5DVElPTl9fLCBiaCwgaGFuZGxlLGVycik7CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGlubGluZSB2b2lkCitleHQ0X2pvdXJuYWxfcmVsZWFzZV9idWZmZXIoaGFuZGxlX3QgKmhhbmRsZSwgc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCkKK3sKKwlqYmQyX2pvdXJuYWxfcmVsZWFzZV9idWZmZXIoaGFuZGxlLCBiaCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50CitfX2V4dDRfam91cm5hbF9mb3JnZXQoY29uc3QgY2hhciAqd2hlcmUsIGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBidWZmZXJfaGVhZCAqYmgpCit7CisJaW50IGVyciA9IGpiZDJfam91cm5hbF9mb3JnZXQoaGFuZGxlLCBiaCk7CisJaWYgKGVycikKKwkJZXh0NF9qb3VybmFsX2Fib3J0X2hhbmRsZSh3aGVyZSwgX19GVU5DVElPTl9fLCBiaCwgaGFuZGxlLGVycik7CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGlubGluZSBpbnQKK19fZXh0NF9qb3VybmFsX3Jldm9rZShjb25zdCBjaGFyICp3aGVyZSwgaGFuZGxlX3QgKmhhbmRsZSwKKwkJICAgICAgZXh0NF9mc2Jsa190IGJsb2NrbnIsIHN0cnVjdCBidWZmZXJfaGVhZCAqYmgpCit7CisJaW50IGVyciA9IGpiZDJfam91cm5hbF9yZXZva2UoaGFuZGxlLCBibG9ja25yLCBiaCk7CisJaWYgKGVycikKKwkJZXh0NF9qb3VybmFsX2Fib3J0X2hhbmRsZSh3aGVyZSwgX19GVU5DVElPTl9fLCBiaCwgaGFuZGxlLGVycik7CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGlubGluZSBpbnQKK19fZXh0NF9qb3VybmFsX2dldF9jcmVhdGVfYWNjZXNzKGNvbnN0IGNoYXIgKndoZXJlLAorCQkJCSBoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoKQoreworCWludCBlcnIgPSBqYmQyX2pvdXJuYWxfZ2V0X2NyZWF0ZV9hY2Nlc3MoaGFuZGxlLCBiaCk7CisJaWYgKGVycikKKwkJZXh0NF9qb3VybmFsX2Fib3J0X2hhbmRsZSh3aGVyZSwgX19GVU5DVElPTl9fLCBiaCwgaGFuZGxlLGVycik7CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGlubGluZSBpbnQKK19fZXh0NF9qb3VybmFsX2RpcnR5X21ldGFkYXRhKGNvbnN0IGNoYXIgKndoZXJlLAorCQkJICAgICAgaGFuZGxlX3QgKmhhbmRsZSwgc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCkKK3sKKwlpbnQgZXJyID0gamJkMl9qb3VybmFsX2RpcnR5X21ldGFkYXRhKGhhbmRsZSwgYmgpOworCWlmIChlcnIpCisJCWV4dDRfam91cm5hbF9hYm9ydF9oYW5kbGUod2hlcmUsIF9fRlVOQ1RJT05fXywgYmgsIGhhbmRsZSxlcnIpOworCXJldHVybiBlcnI7Cit9CisKKworI2RlZmluZSBleHQ0X2pvdXJuYWxfZ2V0X3VuZG9fYWNjZXNzKGhhbmRsZSwgYmgpIFwKKwlfX2V4dDRfam91cm5hbF9nZXRfdW5kb19hY2Nlc3MoX19GVU5DVElPTl9fLCAoaGFuZGxlKSwgKGJoKSkKKyNkZWZpbmUgZXh0NF9qb3VybmFsX2dldF93cml0ZV9hY2Nlc3MoaGFuZGxlLCBiaCkgXAorCV9fZXh0NF9qb3VybmFsX2dldF93cml0ZV9hY2Nlc3MoX19GVU5DVElPTl9fLCAoaGFuZGxlKSwgKGJoKSkKKyNkZWZpbmUgZXh0NF9qb3VybmFsX3Jldm9rZShoYW5kbGUsIGJsb2NrbnIsIGJoKSBcCisJX19leHQ0X2pvdXJuYWxfcmV2b2tlKF9fRlVOQ1RJT05fXywgKGhhbmRsZSksIChibG9ja25yKSwgKGJoKSkKKyNkZWZpbmUgZXh0NF9qb3VybmFsX2dldF9jcmVhdGVfYWNjZXNzKGhhbmRsZSwgYmgpIFwKKwlfX2V4dDRfam91cm5hbF9nZXRfY3JlYXRlX2FjY2VzcyhfX0ZVTkNUSU9OX18sIChoYW5kbGUpLCAoYmgpKQorI2RlZmluZSBleHQ0X2pvdXJuYWxfZGlydHlfbWV0YWRhdGEoaGFuZGxlLCBiaCkgXAorCV9fZXh0NF9qb3VybmFsX2RpcnR5X21ldGFkYXRhKF9fRlVOQ1RJT05fXywgKGhhbmRsZSksIChiaCkpCisjZGVmaW5lIGV4dDRfam91cm5hbF9mb3JnZXQoaGFuZGxlLCBiaCkgXAorCV9fZXh0NF9qb3VybmFsX2ZvcmdldChfX0ZVTkNUSU9OX18sIChoYW5kbGUpLCAoYmgpKQorCitpbnQgZXh0NF9qb3VybmFsX2RpcnR5X2RhdGEoaGFuZGxlX3QgKmhhbmRsZSwgc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCk7CisKK2hhbmRsZV90ICpleHQ0X2pvdXJuYWxfc3RhcnRfc2Ioc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgaW50IG5ibG9ja3MpOworaW50IF9fZXh0NF9qb3VybmFsX3N0b3AoY29uc3QgY2hhciAqd2hlcmUsIGhhbmRsZV90ICpoYW5kbGUpOworCitzdGF0aWMgaW5saW5lIGhhbmRsZV90ICpleHQ0X2pvdXJuYWxfc3RhcnQoc3RydWN0IGlub2RlICppbm9kZSwgaW50IG5ibG9ja3MpCit7CisJcmV0dXJuIGV4dDRfam91cm5hbF9zdGFydF9zYihpbm9kZS0+aV9zYiwgbmJsb2Nrcyk7Cit9CisKKyNkZWZpbmUgZXh0NF9qb3VybmFsX3N0b3AoaGFuZGxlKSBcCisJX19leHQ0X2pvdXJuYWxfc3RvcChfX0ZVTkNUSU9OX18sIChoYW5kbGUpKQorCitzdGF0aWMgaW5saW5lIGhhbmRsZV90ICpleHQ0X2pvdXJuYWxfY3VycmVudF9oYW5kbGUodm9pZCkKK3sKKwlyZXR1cm4gam91cm5hbF9jdXJyZW50X2hhbmRsZSgpOworfQorCitzdGF0aWMgaW5saW5lIGludCBleHQ0X2pvdXJuYWxfZXh0ZW5kKGhhbmRsZV90ICpoYW5kbGUsIGludCBuYmxvY2tzKQoreworCXJldHVybiBqYmQyX2pvdXJuYWxfZXh0ZW5kKGhhbmRsZSwgbmJsb2Nrcyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGV4dDRfam91cm5hbF9yZXN0YXJ0KGhhbmRsZV90ICpoYW5kbGUsIGludCBuYmxvY2tzKQoreworCXJldHVybiBqYmQyX2pvdXJuYWxfcmVzdGFydChoYW5kbGUsIG5ibG9ja3MpOworfQorCitzdGF0aWMgaW5saW5lIGludCBleHQ0X2pvdXJuYWxfYmxvY2tzX3Blcl9wYWdlKHN0cnVjdCBpbm9kZSAqaW5vZGUpCit7CisJcmV0dXJuIGpiZDJfam91cm5hbF9ibG9ja3NfcGVyX3BhZ2UoaW5vZGUpOworfQorCitzdGF0aWMgaW5saW5lIGludCBleHQ0X2pvdXJuYWxfZm9yY2VfY29tbWl0KGpvdXJuYWxfdCAqam91cm5hbCkKK3sKKwlyZXR1cm4gamJkMl9qb3VybmFsX2ZvcmNlX2NvbW1pdChqb3VybmFsKTsKK30KKworLyogc3VwZXIuYyAqLworaW50IGV4dDRfZm9yY2VfY29tbWl0KHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpOworCitzdGF0aWMgaW5saW5lIGludCBleHQ0X3Nob3VsZF9qb3VybmFsX2RhdGEoc3RydWN0IGlub2RlICppbm9kZSkKK3sKKwlpZiAoIVNfSVNSRUcoaW5vZGUtPmlfbW9kZSkpCisJCXJldHVybiAxOworCWlmICh0ZXN0X29wdChpbm9kZS0+aV9zYiwgREFUQV9GTEFHUykgPT0gRVhUNF9NT1VOVF9KT1VSTkFMX0RBVEEpCisJCXJldHVybiAxOworCWlmIChFWFQ0X0koaW5vZGUpLT5pX2ZsYWdzICYgRVhUNF9KT1VSTkFMX0RBVEFfRkwpCisJCXJldHVybiAxOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIGludCBleHQ0X3Nob3VsZF9vcmRlcl9kYXRhKHN0cnVjdCBpbm9kZSAqaW5vZGUpCit7CisJaWYgKCFTX0lTUkVHKGlub2RlLT5pX21vZGUpKQorCQlyZXR1cm4gMDsKKwlpZiAoRVhUNF9JKGlub2RlKS0+aV9mbGFncyAmIEVYVDRfSk9VUk5BTF9EQVRBX0ZMKQorCQlyZXR1cm4gMDsKKwlpZiAodGVzdF9vcHQoaW5vZGUtPmlfc2IsIERBVEFfRkxBR1MpID09IEVYVDRfTU9VTlRfT1JERVJFRF9EQVRBKQorCQlyZXR1cm4gMTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSBpbnQgZXh0NF9zaG91bGRfd3JpdGViYWNrX2RhdGEoc3RydWN0IGlub2RlICppbm9kZSkKK3sKKwlpZiAoIVNfSVNSRUcoaW5vZGUtPmlfbW9kZSkpCisJCXJldHVybiAwOworCWlmIChFWFQ0X0koaW5vZGUpLT5pX2ZsYWdzICYgRVhUNF9KT1VSTkFMX0RBVEFfRkwpCisJCXJldHVybiAwOworCWlmICh0ZXN0X29wdChpbm9kZS0+aV9zYiwgREFUQV9GTEFHUykgPT0gRVhUNF9NT1VOVF9XUklURUJBQ0tfREFUQSkKKwkJcmV0dXJuIDE7CisJcmV0dXJuIDA7Cit9CisKKyNlbmRpZgkvKiBfTElOVVhfRVhUNF9KQkRfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9mcy5oIGIvaW5jbHVkZS9saW51eC9mcy5oCmluZGV4IDM0NDA2ZWQuLjJmZTZlM2YgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvZnMuaAorKysgYi9pbmNsdWRlL2xpbnV4L2ZzLmgKQEAgLTYyMyw2ICs2MjMsOSBAQAogCUlfTVVURVhfUVVPVEEKIH07CiAKK2V4dGVybiB2b2lkIGlub2RlX2RvdWJsZV9sb2NrKHN0cnVjdCBpbm9kZSAqaW5vZGUxLCBzdHJ1Y3QgaW5vZGUgKmlub2RlMik7CitleHRlcm4gdm9pZCBpbm9kZV9kb3VibGVfdW5sb2NrKHN0cnVjdCBpbm9kZSAqaW5vZGUxLCBzdHJ1Y3QgaW5vZGUgKmlub2RlMik7CisKIC8qCiAgKiBOT1RFOiBpbiBhIDMyYml0IGFyY2ggd2l0aCBhIHByZWVtcHRhYmxlIGtlcm5lbCBhbmQKICAqIGFuIFVQIGNvbXBpbGUgdGhlIGlfc2l6ZV9yZWFkL3dyaXRlIG11c3QgYmUgYXRvbWljCkBAIC02NTYsNyArNjU5LDExIEBACiAjZW5kaWYKIH0KIAotCisvKgorICogTk9URTogdW5saWtlIGlfc2l6ZV9yZWFkKCksIGlfc2l6ZV93cml0ZSgpIGRvZXMgbmVlZCBsb2NraW5nIGFyb3VuZCBpdAorICogKG5vcm1hbGx5IGlfbXV0ZXgpLCBvdGhlcndpc2Ugb24gMzJiaXQvU01QIGFuIHVwZGF0ZSBvZiBpX3NpemVfc2VxY291bnQKKyAqIGNhbiBiZSBsb3N0LCByZXN1bHRpbmcgaW4gc3Vic2VxdWVudCBpX3NpemVfcmVhZCgpIGNhbGxzIHNwaW5uaW5nIGZvcmV2ZXIuCisgKi8KIHN0YXRpYyBpbmxpbmUgdm9pZCBpX3NpemVfd3JpdGUoc3RydWN0IGlub2RlICppbm9kZSwgbG9mZl90IGlfc2l6ZSkKIHsKICNpZiBCSVRTX1BFUl9MT05HPT0zMiAmJiBkZWZpbmVkKENPTkZJR19TTVApCkBAIC0xNzA1LDYgKzE3MTIsOCBAQAogZXh0ZXJuIHZvaWQgY2xlYXJfaW5vZGUoc3RydWN0IGlub2RlICopOwogZXh0ZXJuIHZvaWQgZGVzdHJveV9pbm9kZShzdHJ1Y3QgaW5vZGUgKik7CiBleHRlcm4gc3RydWN0IGlub2RlICpuZXdfaW5vZGUoc3RydWN0IHN1cGVyX2Jsb2NrICopOworZXh0ZXJuIGludCBfX3JlbW92ZV9zdWlkKHN0cnVjdCBkZW50cnkgKiwgaW50KTsKK2V4dGVybiBpbnQgc2hvdWxkX3JlbW92ZV9zdWlkKHN0cnVjdCBkZW50cnkgKik7CiBleHRlcm4gaW50IHJlbW92ZV9zdWlkKHN0cnVjdCBkZW50cnkgKik7CiBleHRlcm4gdm9pZCByZW1vdmVfZHF1b3RfcmVmKHN0cnVjdCBzdXBlcl9ibG9jayAqLCBpbnQsIHN0cnVjdCBsaXN0X2hlYWQgKik7CiAKQEAgLTE3NTEsNiArMTc2MCw4IEBACiAJCXN0cnVjdCBwaXBlX2lub2RlX2luZm8gKiwgc2l6ZV90LCB1bnNpZ25lZCBpbnQpOwogZXh0ZXJuIHNzaXplX3QgZ2VuZXJpY19maWxlX3NwbGljZV93cml0ZShzdHJ1Y3QgcGlwZV9pbm9kZV9pbmZvICosCiAJCXN0cnVjdCBmaWxlICosIGxvZmZfdCAqLCBzaXplX3QsIHVuc2lnbmVkIGludCk7CitleHRlcm4gc3NpemVfdCBnZW5lcmljX2ZpbGVfc3BsaWNlX3dyaXRlX25vbG9jayhzdHJ1Y3QgcGlwZV9pbm9kZV9pbmZvICosCisJCXN0cnVjdCBmaWxlICosIGxvZmZfdCAqLCBzaXplX3QsIHVuc2lnbmVkIGludCk7CiBleHRlcm4gc3NpemVfdCBnZW5lcmljX3NwbGljZV9zZW5kcGFnZShzdHJ1Y3QgcGlwZV9pbm9kZV9pbmZvICpwaXBlLAogCQlzdHJ1Y3QgZmlsZSAqb3V0LCBsb2ZmX3QgKiwgc2l6ZV90IGxlbiwgdW5zaWduZWQgaW50IGZsYWdzKTsKIGV4dGVybiBsb25nIGRvX3NwbGljZV9kaXJlY3Qoc3RydWN0IGZpbGUgKmluLCBsb2ZmX3QgKnBwb3MsIHN0cnVjdCBmaWxlICpvdXQsCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2h0aXJxLmggYi9pbmNsdWRlL2xpbnV4L2h0aXJxLmgKaW5kZXggMWYxNWNlMi4uYzk2ZWE0NiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9odGlycS5oCisrKyBiL2luY2x1ZGUvbGludXgvaHRpcnEuaApAQCAtMSwxNSArMSwyMyBAQAogI2lmbmRlZiBMSU5VWF9IVElSUV9ICiAjZGVmaW5lIExJTlVYX0hUSVJRX0gKIAorc3RydWN0IGh0X2lycV9tc2cgeworCXUzMglhZGRyZXNzX2xvOwkvKiBsb3cgMzIgYml0cyBvZiB0aGUgaHQgaXJxIG1lc3NhZ2UgKi8KKwl1MzIJYWRkcmVzc19oaTsJLyogaGlnaCAzMiBiaXRzIG9mIHRoZSBpdCBpcnEgbWVzc2FnZSAqLworfTsKKwogLyogSGVscGVyIGZ1bmN0aW9ucy4uICovCi12b2lkIHdyaXRlX2h0X2lycV9sb3codW5zaWduZWQgaW50IGlycSwgdTMyIGRhdGEpOwotdm9pZCB3cml0ZV9odF9pcnFfaGlnaCh1bnNpZ25lZCBpbnQgaXJxLCB1MzIgZGF0YSk7Ci11MzIgIHJlYWRfaHRfaXJxX2xvdyh1bnNpZ25lZCBpbnQgaXJxKTsKLXUzMiAgcmVhZF9odF9pcnFfaGlnaCh1bnNpZ25lZCBpbnQgaXJxKTsKK3ZvaWQgZmV0Y2hfaHRfaXJxX21zZyh1bnNpZ25lZCBpbnQgaXJxLCBzdHJ1Y3QgaHRfaXJxX21zZyAqbXNnKTsKK3ZvaWQgd3JpdGVfaHRfaXJxX21zZyh1bnNpZ25lZCBpbnQgaXJxLCBzdHJ1Y3QgaHRfaXJxX21zZyAqbXNnKTsKIHZvaWQgbWFza19odF9pcnEodW5zaWduZWQgaW50IGlycSk7CiB2b2lkIHVubWFza19odF9pcnEodW5zaWduZWQgaW50IGlycSk7CiAKIC8qIFRoZSBhcmNoIGhvb2sgZm9yIGdldHRpbmcgdGhpbmdzIHN0YXJ0ZWQgKi8KIGludCBhcmNoX3NldHVwX2h0X2lycSh1bnNpZ25lZCBpbnQgaXJxLCBzdHJ1Y3QgcGNpX2RldiAqZGV2KTsKIAorLyogRm9yIGRyaXZlcnMgb2YgYnVnZ3kgaGFyZHdhcmUgKi8KK3R5cGVkZWYgdm9pZCAoaHRfaXJxX3VwZGF0ZV90KShzdHJ1Y3QgcGNpX2RldiAqZGV2LCBpbnQgaXJxLAorCQkJICAgICAgIHN0cnVjdCBodF9pcnFfbXNnICptc2cpOworaW50IF9faHRfY3JlYXRlX2lycShzdHJ1Y3QgcGNpX2RldiAqZGV2LCBpbnQgaWR4LCBodF9pcnFfdXBkYXRlX3QgKnVwZGF0ZSk7CisKICNlbmRpZiAvKiBMSU5VWF9IVElSUV9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2h1Z2V0bGIuaCBiL2luY2x1ZGUvbGludXgvaHVnZXRsYi5oCmluZGV4IGMyNWEzOGQuLmFjZTY0ZTUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvaHVnZXRsYi5oCisrKyBiL2luY2x1ZGUvbGludXgvaHVnZXRsYi5oCkBAIC0xNyw2ICsxNyw3IEBACiBpbnQgY29weV9odWdldGxiX3BhZ2VfcmFuZ2Uoc3RydWN0IG1tX3N0cnVjdCAqLCBzdHJ1Y3QgbW1fc3RydWN0ICosIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqKTsKIGludCBmb2xsb3dfaHVnZXRsYl9wYWdlKHN0cnVjdCBtbV9zdHJ1Y3QgKiwgc3RydWN0IHZtX2FyZWFfc3RydWN0ICosIHN0cnVjdCBwYWdlICoqLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKiosIHVuc2lnbmVkIGxvbmcgKiwgaW50ICosIGludCk7CiB2b2lkIHVubWFwX2h1Z2VwYWdlX3JhbmdlKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqLCB1bnNpZ25lZCBsb25nLCB1bnNpZ25lZCBsb25nKTsKK3ZvaWQgX191bm1hcF9odWdlcGFnZV9yYW5nZShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKiwgdW5zaWduZWQgbG9uZywgdW5zaWduZWQgbG9uZyk7CiBpbnQgaHVnZXRsYl9wcmVmYXVsdChzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKik7CiBpbnQgaHVnZXRsYl9yZXBvcnRfbWVtaW5mbyhjaGFyICopOwogaW50IGh1Z2V0bGJfcmVwb3J0X25vZGVfbWVtaW5mbyhpbnQsIGNoYXIgKik7CkBAIC01OSw4ICs2MCwxMSBAQAogICogSWYgdGhlIGFyY2ggZG9lc24ndCBzdXBwbHkgc29tZXRoaW5nIGVsc2UsIGFzc3VtZSB0aGF0IGh1Z2VwYWdlCiAgKiBzaXplIGFsaWduZWQgcmVnaW9ucyBhcmUgb2sgd2l0aG91dCBmdXJ0aGVyIHByZXBhcmF0aW9uLgogICovCi1zdGF0aWMgaW5saW5lIGludCBwcmVwYXJlX2h1Z2VwYWdlX3JhbmdlKHVuc2lnbmVkIGxvbmcgYWRkciwgdW5zaWduZWQgbG9uZyBsZW4pCitzdGF0aWMgaW5saW5lIGludCBwcmVwYXJlX2h1Z2VwYWdlX3JhbmdlKHVuc2lnbmVkIGxvbmcgYWRkciwgdW5zaWduZWQgbG9uZyBsZW4sCisJCQkJCQlwZ29mZl90IHBnb2ZmKQogeworCWlmIChwZ29mZiAmICh+SFBBR0VfTUFTSyA+PiBQQUdFX1NISUZUKSkKKwkJcmV0dXJuIC1FSU5WQUw7CiAJaWYgKGxlbiAmIH5IUEFHRV9NQVNLKQogCQlyZXR1cm4gLUVJTlZBTDsKIAlpZiAoYWRkciAmIH5IUEFHRV9NQVNLKQpAQCAtNjgsNyArNzIsOCBAQAogCXJldHVybiAwOwogfQogI2Vsc2UKLWludCBwcmVwYXJlX2h1Z2VwYWdlX3JhbmdlKHVuc2lnbmVkIGxvbmcgYWRkciwgdW5zaWduZWQgbG9uZyBsZW4pOworaW50IHByZXBhcmVfaHVnZXBhZ2VfcmFuZ2UodW5zaWduZWQgbG9uZyBhZGRyLCB1bnNpZ25lZCBsb25nIGxlbiwKKwkJCQkJCXBnb2ZmX3QgcGdvZmYpOwogI2VuZGlmCiAKICNpZm5kZWYgQVJDSF9IQVNfU0VUQ0xFQVJfSFVHRV9QVEUKQEAgLTEwNiw3ICsxMTEsNyBAQAogI2RlZmluZSBodWdldGxiX3JlcG9ydF9tZW1pbmZvKGJ1ZikJCTAKICNkZWZpbmUgaHVnZXRsYl9yZXBvcnRfbm9kZV9tZW1pbmZvKG4sIGJ1ZikJMAogI2RlZmluZSBmb2xsb3dfaHVnZV9wbWQobW0sIGFkZHIsIHBtZCwgd3JpdGUpCU5VTEwKLSNkZWZpbmUgcHJlcGFyZV9odWdlcGFnZV9yYW5nZShhZGRyLCBsZW4pCSgtRUlOVkFMKQorI2RlZmluZSBwcmVwYXJlX2h1Z2VwYWdlX3JhbmdlKGFkZHIsbGVuLHBnb2ZmKQkoLUVJTlZBTCkKICNkZWZpbmUgcG1kX2h1Z2UoeCkJMAogI2RlZmluZSBpc19odWdlcGFnZV9vbmx5X3JhbmdlKG1tLCBhZGRyLCBsZW4pCTAKICNkZWZpbmUgaHVnZXRsYl9mcmVlX3BnZF9yYW5nZSh0bGIsIGFkZHIsIGVuZCwgZmxvb3IsIGNlaWxpbmcpICh7QlVHKCk7IDA7IH0pCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2lnbXAuaCBiL2luY2x1ZGUvbGludXgvaWdtcC5oCmluZGV4IDAzZjQzZTIuLjIxZGQ1NjkgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvaWdtcC5oCisrKyBiL2luY2x1ZGUvbGludXgvaWdtcC5oCkBAIC0xOTEsNyArMTkxLDcgQEAKICNkZWZpbmUgSUdNUFYzX01BU0sodmFsdWUsIG5iKSAoKG5iKT49MzIgPyAodmFsdWUpIDogKCgxPDwobmIpKS0xKSAmICh2YWx1ZSkpCiAjZGVmaW5lIElHTVBWM19FWFAodGhyZXNoLCBuYm1hbnQsIG5iZXhwLCB2YWx1ZSkgXAogCSgodmFsdWUpIDwgKHRocmVzaCkgPyAodmFsdWUpIDogXAotICAgICAgICAoKElHTVBWM19NQVNLKHZhbHVlLCBuYm1hbnQpIHwgKDE8PChuYm1hbnQrbmJleHApKSkgPDwgXAorICAgICAgICAoKElHTVBWM19NQVNLKHZhbHVlLCBuYm1hbnQpIHwgKDE8PChuYm1hbnQpKSkgPDwgXAogICAgICAgICAgKElHTVBWM19NQVNLKCh2YWx1ZSkgPj4gKG5ibWFudCksIG5iZXhwKSArIChuYmV4cCkpKSkKIAogI2RlZmluZSBJR01QVjNfUVFJQyh2YWx1ZSkgSUdNUFYzX0VYUCgweDgwLCA0LCAzLCB2YWx1ZSkKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvaW42LmggYi9pbmNsdWRlL2xpbnV4L2luNi5oCmluZGV4IDliZTZhNDcuLmYyODYyMWYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvaW42LmgKKysrIGIvaW5jbHVkZS9saW51eC9pbjYuaApAQCAtMjI1LDcgKzIyNSw3IEBACiAjZW5kaWYKIAogLyoKLSAqIE5ldGZpbHRlcgorICogTmV0ZmlsdGVyICgxKQogICoKICAqIEZvbGxvd2luZyBzb2NrZXQgb3B0aW9ucyBhcmUgdXNlZCBpbiBpcDZfdGFibGVzOwogICogc2VlIGluY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjYvaXA2X3RhYmxlcy5oLgpAQCAtMjQwLDQgKzI0MCwxNCBAQAogI2RlZmluZSBJUFY2X1JFQ1ZUQ0xBU1MJCTY2CiAjZGVmaW5lIElQVjZfVENMQVNTCQk2NwogCisvKgorICogTmV0ZmlsdGVyICgyKQorICoKKyAqIEZvbGxvd2luZyBzb2NrZXQgb3B0aW9ucyBhcmUgdXNlZCBpbiBpcDZfdGFibGVzOworICogc2VlIGluY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjYvaXA2X3RhYmxlcy5oLgorICoKKyAqIElQNlRfU09fR0VUX1JFVklTSU9OX01BVENICTY4CisgKiBJUDZUX1NPX0dFVF9SRVZJU0lPTl9UQVJHRVQJNjkKKyAqLworCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvaW5pdC5oIGIvaW5jbHVkZS9saW51eC9pbml0LmgKaW5kZXggZTkyYjE0NS4uNWViNWQyNCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9pbml0LmgKKysrIGIvaW5jbHVkZS9saW51eC9pbml0LmgKQEAgLTg0LDE5ICs4NCwzNyBAQAogICogYnkgbGluayBvcmRlci4gCiAgKiBGb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHksIGluaXRjYWxsKCkgcHV0cyB0aGUgY2FsbCBpbiAKICAqIHRoZSBkZXZpY2UgaW5pdCBzdWJzZWN0aW9uLgorICoKKyAqIFRoZSBgaWQnIGFyZyB0byBfX2RlZmluZV9pbml0Y2FsbCgpIGlzIG5lZWRlZCBzbyB0aGF0IG11bHRpcGxlIGluaXRjYWxscworICogY2FuIHBvaW50IGF0IHRoZSBzYW1lIGhhbmRsZXIgd2l0aG91dCBjYXVzaW5nIGR1cGxpY2F0ZS1zeW1ib2wgYnVpbGQgZXJyb3JzLgogICovCiAKLSNkZWZpbmUgX19kZWZpbmVfaW5pdGNhbGwobGV2ZWwsZm4pIFwKLQlzdGF0aWMgaW5pdGNhbGxfdCBfX2luaXRjYWxsXyMjZm4gX19hdHRyaWJ1dGVfdXNlZF9fIFwKKyNkZWZpbmUgX19kZWZpbmVfaW5pdGNhbGwobGV2ZWwsZm4saWQpIFwKKwlzdGF0aWMgaW5pdGNhbGxfdCBfX2luaXRjYWxsXyMjZm4jI2lkIF9fYXR0cmlidXRlX3VzZWRfXyBcCiAJX19hdHRyaWJ1dGVfXygoX19zZWN0aW9uX18oIi5pbml0Y2FsbCIgbGV2ZWwgIi5pbml0IikpKSA9IGZuCiAKLSNkZWZpbmUgY29yZV9pbml0Y2FsbChmbikJCV9fZGVmaW5lX2luaXRjYWxsKCIxIixmbikKLSNkZWZpbmUgcG9zdGNvcmVfaW5pdGNhbGwoZm4pCQlfX2RlZmluZV9pbml0Y2FsbCgiMiIsZm4pCi0jZGVmaW5lIGFyY2hfaW5pdGNhbGwoZm4pCQlfX2RlZmluZV9pbml0Y2FsbCgiMyIsZm4pCi0jZGVmaW5lIHN1YnN5c19pbml0Y2FsbChmbikJCV9fZGVmaW5lX2luaXRjYWxsKCI0IixmbikKLSNkZWZpbmUgZnNfaW5pdGNhbGwoZm4pCQkJX19kZWZpbmVfaW5pdGNhbGwoIjUiLGZuKQotI2RlZmluZSBkZXZpY2VfaW5pdGNhbGwoZm4pCQlfX2RlZmluZV9pbml0Y2FsbCgiNiIsZm4pCi0jZGVmaW5lIGxhdGVfaW5pdGNhbGwoZm4pCQlfX2RlZmluZV9pbml0Y2FsbCgiNyIsZm4pCisvKgorICogQSAicHVyZSIgaW5pdGNhbGwgaGFzIG5vIGRlcGVuZGVuY2llcyBvbiBhbnl0aGluZyBlbHNlLCBhbmQgcHVyZWx5CisgKiBpbml0aWFsaXplcyB2YXJpYWJsZXMgdGhhdCBjb3VsZG4ndCBiZSBzdGF0aWNhbGx5IGluaXRpYWxpemVkLgorICoKKyAqIFRoaXMgb25seSBleGlzdHMgZm9yIGJ1aWx0LWluIGNvZGUsIG5vdCBmb3IgbW9kdWxlcy4KKyAqLworI2RlZmluZSBwdXJlX2luaXRjYWxsKGZuKQkJX19kZWZpbmVfaW5pdGNhbGwoIjAiLGZuLDEpCisKKyNkZWZpbmUgY29yZV9pbml0Y2FsbChmbikJCV9fZGVmaW5lX2luaXRjYWxsKCIxIixmbiwxKQorI2RlZmluZSBjb3JlX2luaXRjYWxsX3N5bmMoZm4pCQlfX2RlZmluZV9pbml0Y2FsbCgiMXMiLGZuLDFzKQorI2RlZmluZSBwb3N0Y29yZV9pbml0Y2FsbChmbikJCV9fZGVmaW5lX2luaXRjYWxsKCIyIixmbiwyKQorI2RlZmluZSBwb3N0Y29yZV9pbml0Y2FsbF9zeW5jKGZuKQlfX2RlZmluZV9pbml0Y2FsbCgiMnMiLGZuLDJzKQorI2RlZmluZSBhcmNoX2luaXRjYWxsKGZuKQkJX19kZWZpbmVfaW5pdGNhbGwoIjMiLGZuLDMpCisjZGVmaW5lIGFyY2hfaW5pdGNhbGxfc3luYyhmbikJCV9fZGVmaW5lX2luaXRjYWxsKCIzcyIsZm4sM3MpCisjZGVmaW5lIHN1YnN5c19pbml0Y2FsbChmbikJCV9fZGVmaW5lX2luaXRjYWxsKCI0Iixmbiw0KQorI2RlZmluZSBzdWJzeXNfaW5pdGNhbGxfc3luYyhmbikJX19kZWZpbmVfaW5pdGNhbGwoIjRzIixmbiw0cykKKyNkZWZpbmUgZnNfaW5pdGNhbGwoZm4pCQkJX19kZWZpbmVfaW5pdGNhbGwoIjUiLGZuLDUpCisjZGVmaW5lIGZzX2luaXRjYWxsX3N5bmMoZm4pCQlfX2RlZmluZV9pbml0Y2FsbCgiNXMiLGZuLDVzKQorI2RlZmluZSBkZXZpY2VfaW5pdGNhbGwoZm4pCQlfX2RlZmluZV9pbml0Y2FsbCgiNiIsZm4sNikKKyNkZWZpbmUgZGV2aWNlX2luaXRjYWxsX3N5bmMoZm4pCV9fZGVmaW5lX2luaXRjYWxsKCI2cyIsZm4sNnMpCisjZGVmaW5lIGxhdGVfaW5pdGNhbGwoZm4pCQlfX2RlZmluZV9pbml0Y2FsbCgiNyIsZm4sNykKKyNkZWZpbmUgbGF0ZV9pbml0Y2FsbF9zeW5jKGZuKQkJX19kZWZpbmVfaW5pdGNhbGwoIjdzIixmbiw3cykKIAogI2RlZmluZSBfX2luaXRjYWxsKGZuKSBkZXZpY2VfaW5pdGNhbGwoZm4pCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvaW8uaCBiL2luY2x1ZGUvbGludXgvaW8uaAppbmRleCAyYWQ5NmMzLi44MTg3N2VhIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2lvLmgKKysrIGIvaW5jbHVkZS9saW51eC9pby5oCkBAIC0yOCw0ICsyOCwzMSBAQAogaW50IGlvcmVtYXBfcGFnZV9yYW5nZSh1bnNpZ25lZCBsb25nIGFkZHIsIHVuc2lnbmVkIGxvbmcgZW5kLAogCQkgICAgICAgdW5zaWduZWQgbG9uZyBwaHlzX2FkZHIsIHBncHJvdF90IHByb3QpOwogCisvKioKKyAqCWNoZWNrX3NpZ25hdHVyZQkJLQlmaW5kIEJJT1Mgc2lnbmF0dXJlcworICoJQGlvX2FkZHI6IG1taW8gYWRkcmVzcyB0byBjaGVjaworICoJQHNpZ25hdHVyZTogIHNpZ25hdHVyZSBibG9jaworICoJQGxlbmd0aDogbGVuZ3RoIG9mIHNpZ25hdHVyZQorICoKKyAqCVBlcmZvcm0gYSBzaWduYXR1cmUgY29tcGFyaXNvbiB3aXRoIHRoZSBtbWlvIGFkZHJlc3MgaW9fYWRkci4gVGhpcworICoJYWRkcmVzcyBzaG91bGQgaGF2ZSBiZWVuIG9idGFpbmVkIGJ5IGlvcmVtYXAuCisgKglSZXR1cm5zIDEgb24gYSBtYXRjaC4KKyAqLworCitzdGF0aWMgaW5saW5lIGludCBjaGVja19zaWduYXR1cmUoY29uc3Qgdm9sYXRpbGUgdm9pZCBfX2lvbWVtICppb19hZGRyLAorCWNvbnN0IHVuc2lnbmVkIGNoYXIgKnNpZ25hdHVyZSwgaW50IGxlbmd0aCkKK3sKKwlpbnQgcmV0dmFsID0gMDsKKwlkbyB7CisJCWlmIChyZWFkYihpb19hZGRyKSAhPSAqc2lnbmF0dXJlKQorCQkJZ290byBvdXQ7CisJCWlvX2FkZHIrKzsKKwkJc2lnbmF0dXJlKys7CisJCWxlbmd0aC0tOworCX0gd2hpbGUgKGxlbmd0aCk7CisJcmV0dmFsID0gMTsKK291dDoKKwlyZXR1cm4gcmV0dmFsOworfQorCiAjZW5kaWYgLyogX0xJTlVYX0lPX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvaXBtaV9tc2dkZWZzLmggYi9pbmNsdWRlL2xpbnV4L2lwbWlfbXNnZGVmcy5oCmluZGV4IDIyZjVlMmEuLjRkMDRkOGIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvaXBtaV9tc2dkZWZzLmgKKysrIGIvaW5jbHVkZS9saW51eC9pcG1pX21zZ2RlZnMuaApAQCAtNzUsNiArNzUsOCBAQAogI2RlZmluZSBJUE1JX0lOVkFMSURfQ09NTUFORF9FUlIJMHhjMQogI2RlZmluZSBJUE1JX0VSUl9NU0dfVFJVTkNBVEVECQkweGM2CiAjZGVmaW5lIElQTUlfTE9TVF9BUkJJVFJBVElPTl9FUlIJMHg4MQorI2RlZmluZSBJUE1JX0JVU19FUlIJCQkweDgyCisjZGVmaW5lIElQTUlfTkFLX09OX1dSSVRFX0VSUgkJMHg4MwogI2RlZmluZSBJUE1JX0VSUl9VTlNQRUNJRklFRAkJMHhmZgogCiAjZGVmaW5lIElQTUlfQ0hBTk5FTF9QUk9UT0NPTF9JUE1CCTEKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvaXB4LmggYi9pbmNsdWRlL2xpbnV4L2lweC5oCmluZGV4IDRmMjljNjAuLmViMTliNGUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvaXB4LmgKKysrIGIvaW5jbHVkZS9saW51eC9pcHguaApAQCAtNyw4ICs3LDggQEAKIAogc3RydWN0IHNvY2thZGRyX2lweCB7CiAJc2FfZmFtaWx5X3QJc2lweF9mYW1pbHk7Ci0JX191MTYJCXNpcHhfcG9ydDsKLQlfX3UzMgkJc2lweF9uZXR3b3JrOworCV9fYmUxNgkJc2lweF9wb3J0OworCV9fYmUzMgkJc2lweF9uZXR3b3JrOwogCXVuc2lnbmVkIGNoYXIgCXNpcHhfbm9kZVtJUFhfTk9ERV9MRU5dOwogCV9fdTgJCXNpcHhfdHlwZTsKIAl1bnNpZ25lZCBjaGFyCXNpcHhfemVybzsJLyogMTYgYnl0ZSBmaWxsICovCkBAIC0yMywxMyArMjMsMTMgQEAKICNkZWZpbmUgSVBYX0NSVElURgkxCiAKIHN0cnVjdCBpcHhfcm91dGVfZGVmaW5pdGlvbiB7Ci0JX191MzIgICAgICAgICBpcHhfbmV0d29yazsKLQlfX3UzMiAgICAgICAgIGlweF9yb3V0ZXJfbmV0d29yazsKKwlfX2JlMzIgICAgICAgIGlweF9uZXR3b3JrOworCV9fYmUzMiAgICAgICAgaXB4X3JvdXRlcl9uZXR3b3JrOwogCXVuc2lnbmVkIGNoYXIgaXB4X3JvdXRlcl9ub2RlW0lQWF9OT0RFX0xFTl07CiB9OwogCiBzdHJ1Y3QgaXB4X2ludGVyZmFjZV9kZWZpbml0aW9uIHsKLQlfX3UzMiAgICAgICAgIGlweF9uZXR3b3JrOworCV9fYmUzMiAgICAgICAgaXB4X25ldHdvcms7CiAJdW5zaWduZWQgY2hhciBpcHhfZGV2aWNlWzE2XTsKIAl1bnNpZ25lZCBjaGFyIGlweF9kbGlua190eXBlOwogI2RlZmluZSBJUFhfRlJBTUVfTk9ORQkJMApAQCAtNTUsOCArNTUsOCBAQAogICovCiAKIHN0cnVjdCBpcHhfcm91dGVfZGVmIHsKLQlfX3UzMgkJaXB4X25ldHdvcms7Ci0JX191MzIJCWlweF9yb3V0ZXJfbmV0d29yazsKKwlfX2JlMzIJCWlweF9uZXR3b3JrOworCV9fYmUzMgkJaXB4X3JvdXRlcl9uZXR3b3JrOwogI2RlZmluZSBJUFhfUk9VVEVfTk9fUk9VVEVSCTAKIAl1bnNpZ25lZCBjaGFyCWlweF9yb3V0ZXJfbm9kZVtJUFhfTk9ERV9MRU5dOwogCXVuc2lnbmVkIGNoYXIJaXB4X2RldmljZVsxNl07CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2lycS5oIGIvaW5jbHVkZS9saW51eC9pcnEuaAppbmRleCBjNjRmM2NjLi41MmZjNDA1IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2lycS5oCisrKyBiL2luY2x1ZGUvbGludXgvaXJxLmgKQEAgLTE0MSw2ICsxNDEsNyBAQAogICogQHBlbmRpbmdfbWFzazoJcGVuZGluZyByZWJhbGFuY2VkIGludGVycnVwdHMKICAqIEBkaXI6CQkvcHJvYy9pcnEvIHByb2NmcyBlbnRyeQogICogQGFmZmluaXR5X2VudHJ5OgkvcHJvYy9pcnEvc21wX2FmZmluaXR5IHByb2NmcyBlbnRyeSBvbiBTTVAKKyAqIEBuYW1lOgkJZmxvdyBoYW5kbGVyIG5hbWUgZm9yIC9wcm9jL2ludGVycnVwdHMgb3V0cHV0CiAgKgogICogUGFkIHRoaXMgb3V0IHRvIDMyIGJ5dGVzIGZvciBjYWNoZSBhbmQgaW5kZXhpbmcgcmVhc29ucy4KICAqLwpAQCAtMTY1LDggKzE2Niw5IEBACiAJY3B1bWFza190CQlwZW5kaW5nX21hc2s7CiAjZW5kaWYKICNpZmRlZiBDT05GSUdfUFJPQ19GUwotCXN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqZGlyOworCXN0cnVjdCBwcm9jX2Rpcl9lbnRyeQkqZGlyOwogI2VuZGlmCisJY29uc3QgY2hhcgkJKm5hbWU7CiB9IF9fX19jYWNoZWxpbmVfYWxpZ25lZDsKIAogZXh0ZXJuIHN0cnVjdCBpcnFfZGVzYyBpcnFfZGVzY1tOUl9JUlFTXTsKQEAgLTI3MiwxMiArMjc0LDYgQEAKIGV4dGVybiB2b2lkIGZhc3RjYWxsIGhhbmRsZV9iYWRfaXJxKHVuc2lnbmVkIGludCBpcnEsIHN0cnVjdCBpcnFfZGVzYyAqZGVzYyk7CiAKIC8qCi0gKiBHZXQgYSBkZXNjcmlwdGl2ZSBzdHJpbmcgZm9yIHRoZSBoaWdobGV2ZWwgaGFuZGxlciwgZm9yCi0gKiAvcHJvYy9pbnRlcnJ1cHRzIG91dHB1dDoKLSAqLwotZXh0ZXJuIGNvbnN0IGNoYXIgKmhhbmRsZV9pcnFfbmFtZShpcnFfZmxvd19oYW5kbGVyX3QgaGFuZGxlKTsKLQotLyoKICAqIE1vbm9saXRoaWMgZG9fSVJRIGltcGxlbWVudGF0aW9uLgogICogKGlzIGFuIGV4cGxpY2l0IGZhc3RjYWxsLCBiZWNhdXNlIGkzODYgNEtTVEFDS1MgY2FsbHMgaXQgZnJvbSBhc3NlbWJseSkKICAqLwpAQCAtMzI5LDcgKzMyNSwxMiBAQAogc2V0X2lycV9jaGlwX2FuZF9oYW5kbGVyKHVuc2lnbmVkIGludCBpcnEsIHN0cnVjdCBpcnFfY2hpcCAqY2hpcCwKIAkJCSBpcnFfZmxvd19oYW5kbGVyX3QgaGFuZGxlKTsKIGV4dGVybiB2b2lkCi1fX3NldF9pcnFfaGFuZGxlcih1bnNpZ25lZCBpbnQgaXJxLCBpcnFfZmxvd19oYW5kbGVyX3QgaGFuZGxlLCBpbnQgaXNfY2hhaW5lZCk7CitzZXRfaXJxX2NoaXBfYW5kX2hhbmRsZXJfbmFtZSh1bnNpZ25lZCBpbnQgaXJxLCBzdHJ1Y3QgaXJxX2NoaXAgKmNoaXAsCisJCQkgICAgICBpcnFfZmxvd19oYW5kbGVyX3QgaGFuZGxlLCBjb25zdCBjaGFyICpuYW1lKTsKKworZXh0ZXJuIHZvaWQKK19fc2V0X2lycV9oYW5kbGVyKHVuc2lnbmVkIGludCBpcnEsIGlycV9mbG93X2hhbmRsZXJfdCBoYW5kbGUsIGludCBpc19jaGFpbmVkLAorCQkgIGNvbnN0IGNoYXIgKm5hbWUpOwogCiAvKgogICogU2V0IGEgaGlnaGxldmVsIGZsb3cgaGFuZGxlciBmb3IgYSBnaXZlbiBJUlE6CkBAIC0zMzcsNyArMzM4LDcgQEAKIHN0YXRpYyBpbmxpbmUgdm9pZAogc2V0X2lycV9oYW5kbGVyKHVuc2lnbmVkIGludCBpcnEsIGlycV9mbG93X2hhbmRsZXJfdCBoYW5kbGUpCiB7Ci0JX19zZXRfaXJxX2hhbmRsZXIoaXJxLCBoYW5kbGUsIDApOworCV9fc2V0X2lycV9oYW5kbGVyKGlycSwgaGFuZGxlLCAwLCBOVUxMKTsKIH0KIAogLyoKQEAgLTM0OSw3ICszNTAsNyBAQAogc2V0X2lycV9jaGFpbmVkX2hhbmRsZXIodW5zaWduZWQgaW50IGlycSwKIAkJCWlycV9mbG93X2hhbmRsZXJfdCBoYW5kbGUpCiB7Ci0JX19zZXRfaXJxX2hhbmRsZXIoaXJxLCBoYW5kbGUsIDEpOworCV9fc2V0X2lycV9oYW5kbGVyKGlycSwgaGFuZGxlLCAxLCBOVUxMKTsKIH0KIAogLyogSGFuZGxlIGR5bmFtaWMgaXJxIGNyZWF0aW9uIGFuZCBkZXN0cnVjdGlvbiAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9qYmQyLmggYi9pbmNsdWRlL2xpbnV4L2piZDIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZGIxMjg3Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9saW51eC9qYmQyLmgKQEAgLTAsMCArMSwxMTA3IEBACisvKgorICogbGludXgvaW5jbHVkZS9saW51eC9qYmQyLmgKKyAqCisgKiBXcml0dGVuIGJ5IFN0ZXBoZW4gQy4gVHdlZWRpZSA8c2N0QHJlZGhhdC5jb20+CisgKgorICogQ29weXJpZ2h0IDE5OTgtMjAwMCBSZWQgSGF0LCBJbmMgLS0tIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgTGludXgga2VybmVsIGFuZCBpcyBtYWRlIGF2YWlsYWJsZSB1bmRlcgorICogdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgdmVyc2lvbiAyLCBvciBhdCB5b3VyCisgKiBvcHRpb24sIGFueSBsYXRlciB2ZXJzaW9uLCBpbmNvcnBvcmF0ZWQgaGVyZWluIGJ5IHJlZmVyZW5jZS4KKyAqCisgKiBEZWZpbml0aW9ucyBmb3IgdHJhbnNhY3Rpb24gZGF0YSBzdHJ1Y3R1cmVzIGZvciB0aGUgYnVmZmVyIGNhY2hlCisgKiBmaWxlc3lzdGVtIGpvdXJuYWxpbmcgc3VwcG9ydC4KKyAqLworCisjaWZuZGVmIF9MSU5VWF9KQkRfSAorI2RlZmluZSBfTElOVVhfSkJEX0gKKworLyogQWxsb3cgdGhpcyBmaWxlIHRvIGJlIGluY2x1ZGVkIGRpcmVjdGx5IGludG8gZTJmc3Byb2dzICovCisjaWZuZGVmIF9fS0VSTkVMX18KKyNpbmNsdWRlICJqZnNfY29tcGF0LmgiCisjZGVmaW5lIEpCRDJfREVCVUcKKyNkZWZpbmUgamZzX2RlYnVnIGpiZF9kZWJ1ZworI2Vsc2UKKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvYnVmZmVyX2hlYWQuaD4KKyNpbmNsdWRlIDxsaW51eC9qb3VybmFsLWhlYWQuaD4KKyNpbmNsdWRlIDxsaW51eC9zdGRkZWYuaD4KKyNpbmNsdWRlIDxsaW51eC9iaXRfc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWVyLmg+CisKKyNpbmNsdWRlIDxhc20vc2VtYXBob3JlLmg+CisjZW5kaWYKKworI2RlZmluZSBqb3VybmFsX29vbV9yZXRyeSAxCisKKy8qCisgKiBEZWZpbmUgSkJEX1BBUkFOSU9EX0lPRkFJTCB0byBjYXVzZSBhIGtlcm5lbCBCVUcoKSBpZiBleHQzIGZpbmRzCisgKiBjZXJ0YWluIGNsYXNzZXMgb2YgZXJyb3Igd2hpY2ggY2FuIG9jY3VyIGR1ZSB0byBmYWlsZWQgSU9zLiAgVW5kZXIKKyAqIG5vcm1hbCB1c2Ugd2Ugd2FudCBleHQzIHRvIGNvbnRpbnVlIGFmdGVyIHN1Y2ggZXJyb3JzLCBiZWNhdXNlCisgKiBoYXJkd2FyZSBfY2FuXyBmYWlsLCBidXQgZm9yIGRlYnVnZ2luZyBwdXJwb3NlcyB3aGVuIHJ1bm5pbmcgdGVzdHMgb24KKyAqIGtub3duLWdvb2QgaGFyZHdhcmUgd2UgbWF5IHdhbnQgdG8gdHJhcCB0aGVzZSBlcnJvcnMuCisgKi8KKyN1bmRlZiBKQkRfUEFSQU5PSURfSU9GQUlMCisKKy8qCisgKiBUaGUgZGVmYXVsdCBtYXhpbXVtIGNvbW1pdCBhZ2UsIGluIHNlY29uZHMuCisgKi8KKyNkZWZpbmUgSkJEX0RFRkFVTFRfTUFYX0NPTU1JVF9BR0UgNQorCisjaWZkZWYgQ09ORklHX0pCRF9ERUJVRworLyoKKyAqIERlZmluZSBKQkRfRVhQRU5TSVZFX0NIRUNLSU5HIHRvIGVuYWJsZSBtb3JlIGV4cGVuc2l2ZSBpbnRlcm5hbAorICogY29uc2lzdGVuY3kgY2hlY2tzLiAgQnkgZGVmYXVsdCB3ZSBkb24ndCBkbyB0aGlzIHVubGVzcworICogQ09ORklHX0pCRF9ERUJVRyBpcyBvbi4KKyAqLworI2RlZmluZSBKQkRfRVhQRU5TSVZFX0NIRUNLSU5HCitleHRlcm4gaW50IGpiZDJfam91cm5hbF9lbmFibGVfZGVidWc7CisKKyNkZWZpbmUgamJkX2RlYnVnKG4sIGYsIGEuLi4pCQkJCQkJXAorCWRvIHsJCQkJCQkJCVwKKwkJaWYgKChuKSA8PSBqYmQyX2pvdXJuYWxfZW5hYmxlX2RlYnVnKSB7CQkJXAorCQkJcHJpbnRrIChLRVJOX0RFQlVHICIoJXMsICVkKTogJXM6ICIsCQlcCisJCQkJX19GSUxFX18sIF9fTElORV9fLCBfX0ZVTkNUSU9OX18pOwlcCisJCQlwcmludGsgKGYsICMjIGEpOwkJCQlcCisJCX0JCQkJCQkJXAorCX0gd2hpbGUgKDApCisjZWxzZQorI2RlZmluZSBqYmRfZGVidWcoZiwgYS4uLikJLyoqLworI2VuZGlmCisKK2V4dGVybiB2b2lkICogX19qYmQyX2ttYWxsb2MgKGNvbnN0IGNoYXIgKndoZXJlLCBzaXplX3Qgc2l6ZSwgZ2ZwX3QgZmxhZ3MsIGludCByZXRyeSk7CitleHRlcm4gdm9pZCAqIGpiZDJfc2xhYl9hbGxvYyhzaXplX3Qgc2l6ZSwgZ2ZwX3QgZmxhZ3MpOworZXh0ZXJuIHZvaWQgamJkMl9zbGFiX2ZyZWUodm9pZCAqcHRyLCBzaXplX3Qgc2l6ZSk7CisKKyNkZWZpbmUgamJkX2ttYWxsb2Moc2l6ZSwgZmxhZ3MpIFwKKwlfX2piZDJfa21hbGxvYyhfX0ZVTkNUSU9OX18sIChzaXplKSwgKGZsYWdzKSwgam91cm5hbF9vb21fcmV0cnkpCisjZGVmaW5lIGpiZF9yZXBfa21hbGxvYyhzaXplLCBmbGFncykgXAorCV9famJkMl9rbWFsbG9jKF9fRlVOQ1RJT05fXywgKHNpemUpLCAoZmxhZ3MpLCAxKQorCisjZGVmaW5lIEpCRDJfTUlOX0pPVVJOQUxfQkxPQ0tTIDEwMjQKKworI2lmZGVmIF9fS0VSTkVMX18KKworLyoqCisgKiB0eXBlZGVmIGhhbmRsZV90IC0gVGhlIGhhbmRsZV90IHR5cGUgcmVwcmVzZW50cyBhIHNpbmdsZSBhdG9taWMgdXBkYXRlIGJlaW5nIHBlcmZvcm1lZCBieSBzb21lIHByb2Nlc3MuCisgKgorICogQWxsIGZpbGVzeXN0ZW0gbW9kaWZpY2F0aW9ucyBtYWRlIGJ5IHRoZSBwcm9jZXNzIGdvCisgKiB0aHJvdWdoIHRoaXMgaGFuZGxlLiAgUmVjdXJzaXZlIG9wZXJhdGlvbnMgKHN1Y2ggYXMgcXVvdGEgb3BlcmF0aW9ucykKKyAqIGFyZSBnYXRoZXJlZCBpbnRvIGEgc2luZ2xlIHVwZGF0ZS4KKyAqCisgKiBUaGUgYnVmZmVyIGNyZWRpdHMgZmllbGQgaXMgdXNlZCB0byBhY2NvdW50IGZvciBqb3VybmFsZWQgYnVmZmVycworICogYmVpbmcgbW9kaWZpZWQgYnkgdGhlIHJ1bm5pbmcgcHJvY2Vzcy4gIFRvIGVuc3VyZSB0aGF0IHRoZXJlIGlzCisgKiBlbm91Z2ggbG9nIHNwYWNlIGZvciBhbGwgb3V0c3RhbmRpbmcgb3BlcmF0aW9ucywgd2UgbmVlZCB0byBsaW1pdCB0aGUKKyAqIG51bWJlciBvZiBvdXRzdGFuZGluZyBidWZmZXJzIHBvc3NpYmxlIGF0IGFueSB0aW1lLiAgV2hlbiB0aGUKKyAqIG9wZXJhdGlvbiBjb21wbGV0ZXMsIGFueSBidWZmZXIgY3JlZGl0cyBub3QgdXNlZCBhcmUgY3JlZGl0ZWQgYmFjayB0bworICogdGhlIHRyYW5zYWN0aW9uLCBzbyB0aGF0IGF0IGFsbCB0aW1lcyB3ZSBrbm93IGhvdyBtYW55IGJ1ZmZlcnMgdGhlCisgKiBvdXRzdGFuZGluZyB1cGRhdGVzIG9uIGEgdHJhbnNhY3Rpb24gbWlnaHQgcG9zc2libHkgdG91Y2guCisgKgorICogVGhpcyBpcyBhbiBvcGFxdWUgZGF0YXR5cGUuCisgKiovCit0eXBlZGVmIHN0cnVjdCBoYW5kbGVfcwkJaGFuZGxlX3Q7CS8qIEF0b21pYyBvcGVyYXRpb24gdHlwZSAqLworCisKKy8qKgorICogdHlwZWRlZiBqb3VybmFsX3QgLSBUaGUgam91cm5hbF90IG1haW50YWlucyBhbGwgb2YgdGhlIGpvdXJuYWxpbmcgc3RhdGUgaW5mb3JtYXRpb24gZm9yIGEgc2luZ2xlIGZpbGVzeXN0ZW0uCisgKgorICogam91cm5hbF90IGlzIGxpbmtlZCB0byBmcm9tIHRoZSBmcyBzdXBlcmJsb2NrIHN0cnVjdHVyZS4KKyAqCisgKiBXZSB1c2UgdGhlIGpvdXJuYWxfdCB0byBrZWVwIHRyYWNrIG9mIGFsbCBvdXRzdGFuZGluZyB0cmFuc2FjdGlvbgorICogYWN0aXZpdHkgb24gdGhlIGZpbGVzeXN0ZW0sIGFuZCB0byBtYW5hZ2UgdGhlIHN0YXRlIG9mIHRoZSBsb2cKKyAqIHdyaXRpbmcgcHJvY2Vzcy4KKyAqCisgKiBUaGlzIGlzIGFuIG9wYXF1ZSBkYXRhdHlwZS4KKyAqKi8KK3R5cGVkZWYgc3RydWN0IGpvdXJuYWxfcwlqb3VybmFsX3Q7CS8qIEpvdXJuYWwgY29udHJvbCBzdHJ1Y3R1cmUgKi8KKyNlbmRpZgorCisvKgorICogSW50ZXJuYWwgc3RydWN0dXJlcyB1c2VkIGJ5IHRoZSBsb2dnaW5nIG1lY2hhbmlzbToKKyAqLworCisjZGVmaW5lIEpCRDJfTUFHSUNfTlVNQkVSIDB4YzAzYjM5OThVIC8qIFRoZSBmaXJzdCA0IGJ5dGVzIG9mIC9kZXYvcmFuZG9tISAqLworCisvKgorICogT24tZGlzayBzdHJ1Y3R1cmVzCisgKi8KKworLyoKKyAqIERlc2NyaXB0b3IgYmxvY2sgdHlwZXM6CisgKi8KKworI2RlZmluZSBKQkQyX0RFU0NSSVBUT1JfQkxPQ0sJMQorI2RlZmluZSBKQkQyX0NPTU1JVF9CTE9DSwkyCisjZGVmaW5lIEpCRDJfU1VQRVJCTE9DS19WMQkzCisjZGVmaW5lIEpCRDJfU1VQRVJCTE9DS19WMgk0CisjZGVmaW5lIEpCRDJfUkVWT0tFX0JMT0NLCTUKKworLyoKKyAqIFN0YW5kYXJkIGhlYWRlciBmb3IgYWxsIGRlc2NyaXB0b3IgYmxvY2tzOgorICovCit0eXBlZGVmIHN0cnVjdCBqb3VybmFsX2hlYWRlcl9zCit7CisJX19iZTMyCQloX21hZ2ljOworCV9fYmUzMgkJaF9ibG9ja3R5cGU7CisJX19iZTMyCQloX3NlcXVlbmNlOworfSBqb3VybmFsX2hlYWRlcl90OworCisKKy8qCisgKiBUaGUgYmxvY2sgdGFnOiB1c2VkIHRvIGRlc2NyaWJlIGEgc2luZ2xlIGJ1ZmZlciBpbiB0aGUgam91cm5hbC4KKyAqIHRfYmxvY2tucl9oaWdoIGlzIG9ubHkgdXNlZCBpZiBJTkNPTVBBVF82NEJJVCBpcyBzZXQsIHNvIHRoaXMKKyAqIHJhdyBzdHJ1Y3Qgc2hvdWxkbid0IGJlIHVzZWQgZm9yIHBvaW50ZXIgbWF0aCBvciBzaXplb2YoKSAtIHVzZQorICogam91cm5hbF90YWdfYnl0ZXMoam91cm5hbCkgaW5zdGVhZCB0byBjb21wdXRlIHRoaXMuCisgKi8KK3R5cGVkZWYgc3RydWN0IGpvdXJuYWxfYmxvY2tfdGFnX3MKK3sKKwlfX2JlMzIJCXRfYmxvY2tucjsJLyogVGhlIG9uLWRpc2sgYmxvY2sgbnVtYmVyICovCisJX19iZTMyCQl0X2ZsYWdzOwkvKiBTZWUgYmVsb3cgKi8KKwlfX2JlMzIJCXRfYmxvY2tucl9oaWdoOyAvKiBtb3N0LXNpZ25pZmljYW50IGhpZ2ggMzJiaXRzLiAqLworfSBqb3VybmFsX2Jsb2NrX3RhZ190OworCisjZGVmaW5lIEpCRF9UQUdfU0laRTMyIChvZmZzZXRvZihqb3VybmFsX2Jsb2NrX3RhZ190LCB0X2Jsb2NrbnJfaGlnaCkpCisjZGVmaW5lIEpCRF9UQUdfU0laRTY0IChzaXplb2Yoam91cm5hbF9ibG9ja190YWdfdCkpCisKKy8qCisgKiBUaGUgcmV2b2tlIGRlc2NyaXB0b3I6IHVzZWQgb24gZGlzayB0byBkZXNjcmliZSBhIHNlcmllcyBvZiBibG9ja3MgdG8KKyAqIGJlIHJldm9rZWQgZnJvbSB0aGUgbG9nCisgKi8KK3R5cGVkZWYgc3RydWN0IGpiZDJfam91cm5hbF9yZXZva2VfaGVhZGVyX3MKK3sKKwlqb3VybmFsX2hlYWRlcl90IHJfaGVhZGVyOworCV9fYmUzMgkJIHJfY291bnQ7CS8qIENvdW50IG9mIGJ5dGVzIHVzZWQgaW4gdGhlIGJsb2NrICovCit9IGpiZDJfam91cm5hbF9yZXZva2VfaGVhZGVyX3Q7CisKKworLyogRGVmaW5pdGlvbnMgZm9yIHRoZSBqb3VybmFsIHRhZyBmbGFncyB3b3JkOiAqLworI2RlZmluZSBKQkQyX0ZMQUdfRVNDQVBFCQkxCS8qIG9uLWRpc2sgYmxvY2sgaXMgZXNjYXBlZCAqLworI2RlZmluZSBKQkQyX0ZMQUdfU0FNRV9VVUlECTIJLyogYmxvY2sgaGFzIHNhbWUgdXVpZCBhcyBwcmV2aW91cyAqLworI2RlZmluZSBKQkQyX0ZMQUdfREVMRVRFRAk0CS8qIGJsb2NrIGRlbGV0ZWQgYnkgdGhpcyB0cmFuc2FjdGlvbiAqLworI2RlZmluZSBKQkQyX0ZMQUdfTEFTVF9UQUcJOAkvKiBsYXN0IHRhZyBpbiB0aGlzIGRlc2NyaXB0b3IgYmxvY2sgKi8KKworCisvKgorICogVGhlIGpvdXJuYWwgc3VwZXJibG9jay4gIEFsbCBmaWVsZHMgYXJlIGluIGJpZy1lbmRpYW4gYnl0ZSBvcmRlci4KKyAqLwordHlwZWRlZiBzdHJ1Y3Qgam91cm5hbF9zdXBlcmJsb2NrX3MKK3sKKy8qIDB4MDAwMCAqLworCWpvdXJuYWxfaGVhZGVyX3Qgc19oZWFkZXI7CisKKy8qIDB4MDAwQyAqLworCS8qIFN0YXRpYyBpbmZvcm1hdGlvbiBkZXNjcmliaW5nIHRoZSBqb3VybmFsICovCisJX19iZTMyCXNfYmxvY2tzaXplOwkJLyogam91cm5hbCBkZXZpY2UgYmxvY2tzaXplICovCisJX19iZTMyCXNfbWF4bGVuOwkJLyogdG90YWwgYmxvY2tzIGluIGpvdXJuYWwgZmlsZSAqLworCV9fYmUzMglzX2ZpcnN0OwkJLyogZmlyc3QgYmxvY2sgb2YgbG9nIGluZm9ybWF0aW9uICovCisKKy8qIDB4MDAxOCAqLworCS8qIER5bmFtaWMgaW5mb3JtYXRpb24gZGVzY3JpYmluZyB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgbG9nICovCisJX19iZTMyCXNfc2VxdWVuY2U7CQkvKiBmaXJzdCBjb21taXQgSUQgZXhwZWN0ZWQgaW4gbG9nICovCisJX19iZTMyCXNfc3RhcnQ7CQkvKiBibG9ja25yIG9mIHN0YXJ0IG9mIGxvZyAqLworCisvKiAweDAwMjAgKi8KKwkvKiBFcnJvciB2YWx1ZSwgYXMgc2V0IGJ5IGpiZDJfam91cm5hbF9hYm9ydCgpLiAqLworCV9fYmUzMglzX2Vycm5vOworCisvKiAweDAwMjQgKi8KKwkvKiBSZW1haW5pbmcgZmllbGRzIGFyZSBvbmx5IHZhbGlkIGluIGEgdmVyc2lvbi0yIHN1cGVyYmxvY2sgKi8KKwlfX2JlMzIJc19mZWF0dXJlX2NvbXBhdDsJLyogY29tcGF0aWJsZSBmZWF0dXJlIHNldCAqLworCV9fYmUzMglzX2ZlYXR1cmVfaW5jb21wYXQ7CS8qIGluY29tcGF0aWJsZSBmZWF0dXJlIHNldCAqLworCV9fYmUzMglzX2ZlYXR1cmVfcm9fY29tcGF0OwkvKiByZWFkb25seS1jb21wYXRpYmxlIGZlYXR1cmUgc2V0ICovCisvKiAweDAwMzAgKi8KKwlfX3U4CXNfdXVpZFsxNl07CQkvKiAxMjgtYml0IHV1aWQgZm9yIGpvdXJuYWwgKi8KKworLyogMHgwMDQwICovCisJX19iZTMyCXNfbnJfdXNlcnM7CQkvKiBOciBvZiBmaWxlc3lzdGVtcyBzaGFyaW5nIGxvZyAqLworCisJX19iZTMyCXNfZHluc3VwZXI7CQkvKiBCbG9ja25yIG9mIGR5bmFtaWMgc3VwZXJibG9jayBjb3B5Ki8KKworLyogMHgwMDQ4ICovCisJX19iZTMyCXNfbWF4X3RyYW5zYWN0aW9uOwkvKiBMaW1pdCBvZiBqb3VybmFsIGJsb2NrcyBwZXIgdHJhbnMuKi8KKwlfX2JlMzIJc19tYXhfdHJhbnNfZGF0YTsJLyogTGltaXQgb2YgZGF0YSBibG9ja3MgcGVyIHRyYW5zLiAqLworCisvKiAweDAwNTAgKi8KKwlfX3UzMglzX3BhZGRpbmdbNDRdOworCisvKiAweDAxMDAgKi8KKwlfX3U4CXNfdXNlcnNbMTYqNDhdOwkJLyogaWRzIG9mIGFsbCBmcydlcyBzaGFyaW5nIHRoZSBsb2cgKi8KKy8qIDB4MDQwMCAqLworfSBqb3VybmFsX3N1cGVyYmxvY2tfdDsKKworI2RlZmluZSBKQkQyX0hBU19DT01QQVRfRkVBVFVSRShqLG1hc2spCQkJCQlcCisJKChqKS0+al9mb3JtYXRfdmVyc2lvbiA+PSAyICYmCQkJCQlcCisJICgoaiktPmpfc3VwZXJibG9jay0+c19mZWF0dXJlX2NvbXBhdCAmIGNwdV90b19iZTMyKChtYXNrKSkpKQorI2RlZmluZSBKQkQyX0hBU19ST19DT01QQVRfRkVBVFVSRShqLG1hc2spCQkJCVwKKwkoKGopLT5qX2Zvcm1hdF92ZXJzaW9uID49IDIgJiYJCQkJCVwKKwkgKChqKS0+al9zdXBlcmJsb2NrLT5zX2ZlYXR1cmVfcm9fY29tcGF0ICYgY3B1X3RvX2JlMzIoKG1hc2spKSkpCisjZGVmaW5lIEpCRDJfSEFTX0lOQ09NUEFUX0ZFQVRVUkUoaixtYXNrKQkJCQlcCisJKChqKS0+al9mb3JtYXRfdmVyc2lvbiA+PSAyICYmCQkJCQlcCisJICgoaiktPmpfc3VwZXJibG9jay0+c19mZWF0dXJlX2luY29tcGF0ICYgY3B1X3RvX2JlMzIoKG1hc2spKSkpCisKKyNkZWZpbmUgSkJEMl9GRUFUVVJFX0lOQ09NUEFUX1JFVk9LRQkweDAwMDAwMDAxCisjZGVmaW5lIEpCRDJfRkVBVFVSRV9JTkNPTVBBVF82NEJJVAkweDAwMDAwMDAyCisKKy8qIEZlYXR1cmVzIGtub3duIHRvIHRoaXMga2VybmVsIHZlcnNpb246ICovCisjZGVmaW5lIEpCRDJfS05PV05fQ09NUEFUX0ZFQVRVUkVTCTAKKyNkZWZpbmUgSkJEMl9LTk9XTl9ST0NPTVBBVF9GRUFUVVJFUwkwCisjZGVmaW5lIEpCRDJfS05PV05fSU5DT01QQVRfRkVBVFVSRVMJKEpCRDJfRkVBVFVSRV9JTkNPTVBBVF9SRVZPS0UgfCBcCisJCQkJCSBKQkQyX0ZFQVRVUkVfSU5DT01QQVRfNjRCSVQpCisKKyNpZmRlZiBfX0tFUk5FTF9fCisKKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisKKyNkZWZpbmUgSkJEX0FTU0VSVElPTlMKKyNpZmRlZiBKQkRfQVNTRVJUSU9OUworI2RlZmluZSBKX0FTU0VSVChhc3NlcnQpCQkJCQkJXAorZG8gewkJCQkJCQkJCVwKKwlpZiAoIShhc3NlcnQpKSB7CQkJCQkJXAorCQlwcmludGsgKEtFUk5fRU1FUkcJCQkJCVwKKwkJCSJBc3NlcnRpb24gZmFpbHVyZSBpbiAlcygpIGF0ICVzOiVkOiBcIiVzXCJcbiIsCVwKKwkJCV9fRlVOQ1RJT05fXywgX19GSUxFX18sIF9fTElORV9fLCAjIGFzc2VydCk7CVwKKwkJQlVHKCk7CQkJCQkJCVwKKwl9CQkJCQkJCQlcCit9IHdoaWxlICgwKQorCisjaWYgZGVmaW5lZChDT05GSUdfQlVGRkVSX0RFQlVHKQordm9pZCBidWZmZXJfYXNzZXJ0aW9uX2ZhaWx1cmUoc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCk7CisjZGVmaW5lIEpfQVNTRVJUX0JIKGJoLCBleHByKQkJCQkJCVwKKwlkbyB7CQkJCQkJCQlcCisJCWlmICghKGV4cHIpKQkJCQkJCVwKKwkJCWJ1ZmZlcl9hc3NlcnRpb25fZmFpbHVyZShiaCk7CQkJXAorCQlKX0FTU0VSVChleHByKTsJCQkJCQlcCisJfSB3aGlsZSAoMCkKKyNkZWZpbmUgSl9BU1NFUlRfSkgoamgsIGV4cHIpCUpfQVNTRVJUX0JIKGpoMmJoKGpoKSwgZXhwcikKKyNlbHNlCisjZGVmaW5lIEpfQVNTRVJUX0JIKGJoLCBleHByKQlKX0FTU0VSVChleHByKQorI2RlZmluZSBKX0FTU0VSVF9KSChqaCwgZXhwcikJSl9BU1NFUlQoZXhwcikKKyNlbmRpZgorCisjZWxzZQorI2RlZmluZSBKX0FTU0VSVChhc3NlcnQpCWRvIHsgfSB3aGlsZSAoMCkKKyNlbmRpZgkJLyogSkJEX0FTU0VSVElPTlMgKi8KKworI2lmIGRlZmluZWQoSkJEX1BBUkFOT0lEX0lPRkFJTCkKKyNkZWZpbmUgSl9FWFBFQ1QoZXhwciwgd2h5Li4uKQkJSl9BU1NFUlQoZXhwcikKKyNkZWZpbmUgSl9FWFBFQ1RfQkgoYmgsIGV4cHIsIHdoeS4uLikJSl9BU1NFUlRfQkgoYmgsIGV4cHIpCisjZGVmaW5lIEpfRVhQRUNUX0pIKGpoLCBleHByLCB3aHkuLi4pCUpfQVNTRVJUX0pIKGpoLCBleHByKQorI2Vsc2UKKyNkZWZpbmUgX19qb3VybmFsX2V4cGVjdChleHByLCB3aHkuLi4pCQkJCQkgICAgIFwKKwkoewkJCQkJCQkJICAgICBcCisJCWludCB2YWwgPSAoZXhwcik7CQkJCQkgICAgIFwKKwkJaWYgKCF2YWwpIHsJCQkJCQkgICAgIFwKKwkJCXByaW50ayhLRVJOX0VSUgkJCQkJICAgICBcCisJCQkJIkVYVDMtZnMgdW5leHBlY3RlZCBmYWlsdXJlOiAlcztcbiIsIyBleHByKTsgXAorCQkJcHJpbnRrKEtFUk5fRVJSIHdoeSAiXG4iKTsJCQkgICAgIFwKKwkJfQkJCQkJCQkgICAgIFwKKwkJdmFsOwkJCQkJCQkgICAgIFwKKwl9KQorI2RlZmluZSBKX0VYUEVDVChleHByLCB3aHkuLi4pCQlfX2pvdXJuYWxfZXhwZWN0KGV4cHIsICMjIHdoeSkKKyNkZWZpbmUgSl9FWFBFQ1RfQkgoYmgsIGV4cHIsIHdoeS4uLikJX19qb3VybmFsX2V4cGVjdChleHByLCAjIyB3aHkpCisjZGVmaW5lIEpfRVhQRUNUX0pIKGpoLCBleHByLCB3aHkuLi4pCV9fam91cm5hbF9leHBlY3QoZXhwciwgIyMgd2h5KQorI2VuZGlmCisKK2VudW0gamJkX3N0YXRlX2JpdHMgeworCUJIX0pCRAkJCS8qIEhhcyBhbiBhdHRhY2hlZCBleHQzIGpvdXJuYWxfaGVhZCAqLworCSAgPSBCSF9Qcml2YXRlU3RhcnQsCisJQkhfSldyaXRlLAkJLyogQmVpbmcgd3JpdHRlbiB0byBsb2cgKEBAQCBERUJVR0dJTkcpICovCisJQkhfRnJlZWQsCQkvKiBIYXMgYmVlbiBmcmVlZCAodHJ1bmNhdGVkKSAqLworCUJIX1Jldm9rZWQsCQkvKiBIYXMgYmVlbiByZXZva2VkIGZyb20gdGhlIGxvZyAqLworCUJIX1Jldm9rZVZhbGlkLAkJLyogUmV2b2tlZCBmbGFnIGlzIHZhbGlkICovCisJQkhfSkJERGlydHksCQkvKiBJcyBkaXJ0eSBidXQgam91cm5hbGVkICovCisJQkhfU3RhdGUsCQkvKiBQaW5zIG1vc3Qgam91cm5hbF9oZWFkIHN0YXRlICovCisJQkhfSm91cm5hbEhlYWQsCQkvKiBQaW5zIGJoLT5iX3ByaXZhdGUgYW5kIGpoLT5iX2JoICovCisJQkhfVW5zaGFkb3csCQkvKiBEdW1teSBiaXQsIGZvciBCSl9TaGFkb3cgd2FrZXVwIGZpbHRlcmluZyAqLworfTsKKworQlVGRkVSX0ZOUyhKQkQsIGpiZCkKK0JVRkZFUl9GTlMoSldyaXRlLCBqd3JpdGUpCitCVUZGRVJfRk5TKEpCRERpcnR5LCBqYmRkaXJ0eSkKK1RBU19CVUZGRVJfRk5TKEpCRERpcnR5LCBqYmRkaXJ0eSkKK0JVRkZFUl9GTlMoUmV2b2tlZCwgcmV2b2tlZCkKK1RBU19CVUZGRVJfRk5TKFJldm9rZWQsIHJldm9rZWQpCitCVUZGRVJfRk5TKFJldm9rZVZhbGlkLCByZXZva2V2YWxpZCkKK1RBU19CVUZGRVJfRk5TKFJldm9rZVZhbGlkLCByZXZva2V2YWxpZCkKK0JVRkZFUl9GTlMoRnJlZWQsIGZyZWVkKQorCitzdGF0aWMgaW5saW5lIHN0cnVjdCBidWZmZXJfaGVhZCAqamgyYmgoc3RydWN0IGpvdXJuYWxfaGVhZCAqamgpCit7CisJcmV0dXJuIGpoLT5iX2JoOworfQorCitzdGF0aWMgaW5saW5lIHN0cnVjdCBqb3VybmFsX2hlYWQgKmJoMmpoKHN0cnVjdCBidWZmZXJfaGVhZCAqYmgpCit7CisJcmV0dXJuIGJoLT5iX3ByaXZhdGU7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBqYmRfbG9ja19iaF9zdGF0ZShzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoKQoreworCWJpdF9zcGluX2xvY2soQkhfU3RhdGUsICZiaC0+Yl9zdGF0ZSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGpiZF90cnlsb2NrX2JoX3N0YXRlKHN0cnVjdCBidWZmZXJfaGVhZCAqYmgpCit7CisJcmV0dXJuIGJpdF9zcGluX3RyeWxvY2soQkhfU3RhdGUsICZiaC0+Yl9zdGF0ZSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGpiZF9pc19sb2NrZWRfYmhfc3RhdGUoc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCkKK3sKKwlyZXR1cm4gYml0X3NwaW5faXNfbG9ja2VkKEJIX1N0YXRlLCAmYmgtPmJfc3RhdGUpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgamJkX3VubG9ja19iaF9zdGF0ZShzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoKQoreworCWJpdF9zcGluX3VubG9jayhCSF9TdGF0ZSwgJmJoLT5iX3N0YXRlKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGpiZF9sb2NrX2JoX2pvdXJuYWxfaGVhZChzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoKQoreworCWJpdF9zcGluX2xvY2soQkhfSm91cm5hbEhlYWQsICZiaC0+Yl9zdGF0ZSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBqYmRfdW5sb2NrX2JoX2pvdXJuYWxfaGVhZChzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoKQoreworCWJpdF9zcGluX3VubG9jayhCSF9Kb3VybmFsSGVhZCwgJmJoLT5iX3N0YXRlKTsKK30KKworc3RydWN0IGpiZDJfcmV2b2tlX3RhYmxlX3M7CisKKy8qKgorICogc3RydWN0IGhhbmRsZV9zIC0gVGhlIGhhbmRsZV9zIHR5cGUgaXMgdGhlIGNvbmNyZXRlIHR5cGUgYXNzb2NpYXRlZCB3aXRoCisgKiAgICAgaGFuZGxlX3QuCisgKiBAaF90cmFuc2FjdGlvbjogV2hpY2ggY29tcG91bmQgdHJhbnNhY3Rpb24gaXMgdGhpcyB1cGRhdGUgYSBwYXJ0IG9mPworICogQGhfYnVmZmVyX2NyZWRpdHM6IE51bWJlciBvZiByZW1haW5pbmcgYnVmZmVycyB3ZSBhcmUgYWxsb3dlZCB0byBkaXJ0eS4KKyAqIEBoX3JlZjogUmVmZXJlbmNlIGNvdW50IG9uIHRoaXMgaGFuZGxlCisgKiBAaF9lcnI6IEZpZWxkIGZvciBjYWxsZXIncyB1c2UgdG8gdHJhY2sgZXJyb3JzIHRocm91Z2ggbGFyZ2UgZnMgb3BlcmF0aW9ucworICogQGhfc3luYzogZmxhZyBmb3Igc3luYy1vbi1jbG9zZQorICogQGhfamRhdGE6IGZsYWcgdG8gZm9yY2UgZGF0YSBqb3VybmFsaW5nCisgKiBAaF9hYm9ydGVkOiBmbGFnIGluZGljYXRpbmcgZmF0YWwgZXJyb3Igb24gaGFuZGxlCisgKiovCisKKy8qIERvY2Jvb2sgY2FuJ3QgeWV0IGNvcGUgd2l0aCB0aGUgYml0IGZpZWxkcywgYnV0IHdpbGwgbGVhdmUgdGhlIGRvY3VtZW50YXRpb24KKyAqIGluIHNvIGl0IGNhbiBiZSBmaXhlZCBsYXRlci4KKyAqLworCitzdHJ1Y3QgaGFuZGxlX3MKK3sKKwkvKiBXaGljaCBjb21wb3VuZCB0cmFuc2FjdGlvbiBpcyB0aGlzIHVwZGF0ZSBhIHBhcnQgb2Y/ICovCisJdHJhbnNhY3Rpb25fdAkJKmhfdHJhbnNhY3Rpb247CisKKwkvKiBOdW1iZXIgb2YgcmVtYWluaW5nIGJ1ZmZlcnMgd2UgYXJlIGFsbG93ZWQgdG8gZGlydHk6ICovCisJaW50CQkJaF9idWZmZXJfY3JlZGl0czsKKworCS8qIFJlZmVyZW5jZSBjb3VudCBvbiB0aGlzIGhhbmRsZSAqLworCWludAkJCWhfcmVmOworCisJLyogRmllbGQgZm9yIGNhbGxlcidzIHVzZSB0byB0cmFjayBlcnJvcnMgdGhyb3VnaCBsYXJnZSBmcyAqLworCS8qIG9wZXJhdGlvbnMgKi8KKwlpbnQJCQloX2VycjsKKworCS8qIEZsYWdzIFtubyBsb2NraW5nXSAqLworCXVuc2lnbmVkIGludAloX3N5bmM6CQkxOwkvKiBzeW5jLW9uLWNsb3NlICovCisJdW5zaWduZWQgaW50CWhfamRhdGE6CTE7CS8qIGZvcmNlIGRhdGEgam91cm5hbGluZyAqLworCXVuc2lnbmVkIGludAloX2Fib3J0ZWQ6CTE7CS8qIGZhdGFsIGVycm9yIG9uIGhhbmRsZSAqLworfTsKKworCisvKiBUaGUgdHJhbnNhY3Rpb25fdCB0eXBlIGlzIHRoZSBndXRzIG9mIHRoZSBqb3VybmFsaW5nIG1lY2hhbmlzbS4gIEl0CisgKiB0cmFja3MgYSBjb21wb3VuZCB0cmFuc2FjdGlvbiB0aHJvdWdoIGl0cyB2YXJpb3VzIHN0YXRlczoKKyAqCisgKiBSVU5OSU5HOglhY2NlcHRpbmcgbmV3IHVwZGF0ZXMKKyAqIExPQ0tFRDoJVXBkYXRlcyBzdGlsbCBydW5uaW5nIGJ1dCB3ZSBkb24ndCBhY2NlcHQgbmV3IG9uZXMKKyAqIFJVTkRPV046CVVwZGF0ZXMgYXJlIHRpZHlpbmcgdXAgYnV0IGhhdmUgZmluaXNoZWQgcmVxdWVzdGluZworICoJCW5ldyBidWZmZXJzIHRvIG1vZGlmeSAoc3RhdGUgbm90IHVzZWQgZm9yIG5vdykKKyAqIEZMVVNIOiAgICAgICBBbGwgdXBkYXRlcyBjb21wbGV0ZSwgYnV0IHdlIGFyZSBzdGlsbCB3cml0aW5nIHRvIGRpc2sKKyAqIENPTU1JVDogICAgICBBbGwgZGF0YSBvbiBkaXNrLCB3cml0aW5nIGNvbW1pdCByZWNvcmQKKyAqIEZJTklTSEVEOglXZSBzdGlsbCBoYXZlIHRvIGtlZXAgdGhlIHRyYW5zYWN0aW9uIGZvciBjaGVja3BvaW50aW5nLgorICoKKyAqIFRoZSB0cmFuc2FjdGlvbiBrZWVwcyB0cmFjayBvZiBhbGwgb2YgdGhlIGJ1ZmZlcnMgbW9kaWZpZWQgYnkgYQorICogcnVubmluZyB0cmFuc2FjdGlvbiwgYW5kIGFsbCBvZiB0aGUgYnVmZmVycyBjb21taXR0ZWQgYnV0IG5vdCB5ZXQKKyAqIGZsdXNoZWQgdG8gaG9tZSBmb3IgZmluaXNoZWQgdHJhbnNhY3Rpb25zLgorICovCisKKy8qCisgKiBMb2NrIHJhbmtpbmc6CisgKgorICogICAgal9saXN0X2xvY2sKKyAqICAgICAgLT5qYmRfbG9ja19iaF9qb3VybmFsX2hlYWQoKQkoVGhpcyBpcyAiaW5uZXJtb3N0IikKKyAqCisgKiAgICBqX3N0YXRlX2xvY2sKKyAqICAgIC0+amJkX2xvY2tfYmhfc3RhdGUoKQorICoKKyAqICAgIGpiZF9sb2NrX2JoX3N0YXRlKCkKKyAqICAgIC0+al9saXN0X2xvY2sKKyAqCisgKiAgICBqX3N0YXRlX2xvY2sKKyAqICAgIC0+dF9oYW5kbGVfbG9jaworICoKKyAqICAgIGpfc3RhdGVfbG9jaworICogICAgLT5qX2xpc3RfbG9jawkJCShqb3VybmFsX3VubWFwX2J1ZmZlcikKKyAqCisgKi8KKworc3RydWN0IHRyYW5zYWN0aW9uX3MKK3sKKwkvKiBQb2ludGVyIHRvIHRoZSBqb3VybmFsIGZvciB0aGlzIHRyYW5zYWN0aW9uLiBbbm8gbG9ja2luZ10gKi8KKwlqb3VybmFsX3QJCSp0X2pvdXJuYWw7CisKKwkvKiBTZXF1ZW5jZSBudW1iZXIgZm9yIHRoaXMgdHJhbnNhY3Rpb24gW25vIGxvY2tpbmddICovCisJdGlkX3QJCQl0X3RpZDsKKworCS8qCisJICogVHJhbnNhY3Rpb24ncyBjdXJyZW50IHN0YXRlCisJICogW25vIGxvY2tpbmcgLSBvbmx5IGtqb3VybmFsZDIgYWx0ZXJzIHRoaXNdCisJICogRklYTUU6IG5lZWRzIGJhcnJpZXJzCisJICogS0xVREdFOiBbdXNlIGpfc3RhdGVfbG9ja10KKwkgKi8KKwllbnVtIHsKKwkJVF9SVU5OSU5HLAorCQlUX0xPQ0tFRCwKKwkJVF9SVU5ET1dOLAorCQlUX0ZMVVNILAorCQlUX0NPTU1JVCwKKwkJVF9GSU5JU0hFRAorCX0JCQl0X3N0YXRlOworCisJLyoKKwkgKiBXaGVyZSBpbiB0aGUgbG9nIGRvZXMgdGhpcyB0cmFuc2FjdGlvbidzIGNvbW1pdCBzdGFydD8gW25vIGxvY2tpbmddCisJICovCisJdW5zaWduZWQgbG9uZwkJdF9sb2dfc3RhcnQ7CisKKwkvKiBOdW1iZXIgb2YgYnVmZmVycyBvbiB0aGUgdF9idWZmZXJzIGxpc3QgW2pfbGlzdF9sb2NrXSAqLworCWludAkJCXRfbnJfYnVmZmVyczsKKworCS8qCisJICogRG91Ymx5LWxpbmtlZCBjaXJjdWxhciBsaXN0IG9mIGFsbCBidWZmZXJzIHJlc2VydmVkIGJ1dCBub3QgeWV0CisJICogbW9kaWZpZWQgYnkgdGhpcyB0cmFuc2FjdGlvbiBbal9saXN0X2xvY2tdCisJICovCisJc3RydWN0IGpvdXJuYWxfaGVhZAkqdF9yZXNlcnZlZF9saXN0OworCisJLyoKKwkgKiBEb3VibHktbGlua2VkIGNpcmN1bGFyIGxpc3Qgb2YgYWxsIGJ1ZmZlcnMgdW5kZXIgd3JpdGVvdXQgZHVyaW5nCisJICogY29tbWl0IFtqX2xpc3RfbG9ja10KKwkgKi8KKwlzdHJ1Y3Qgam91cm5hbF9oZWFkCSp0X2xvY2tlZF9saXN0OworCisJLyoKKwkgKiBEb3VibHktbGlua2VkIGNpcmN1bGFyIGxpc3Qgb2YgYWxsIG1ldGFkYXRhIGJ1ZmZlcnMgb3duZWQgYnkgdGhpcworCSAqIHRyYW5zYWN0aW9uIFtqX2xpc3RfbG9ja10KKwkgKi8KKwlzdHJ1Y3Qgam91cm5hbF9oZWFkCSp0X2J1ZmZlcnM7CisKKwkvKgorCSAqIERvdWJseS1saW5rZWQgY2lyY3VsYXIgbGlzdCBvZiBhbGwgZGF0YSBidWZmZXJzIHN0aWxsIHRvIGJlCisJICogZmx1c2hlZCBiZWZvcmUgdGhpcyB0cmFuc2FjdGlvbiBjYW4gYmUgY29tbWl0dGVkIFtqX2xpc3RfbG9ja10KKwkgKi8KKwlzdHJ1Y3Qgam91cm5hbF9oZWFkCSp0X3N5bmNfZGF0YWxpc3Q7CisKKwkvKgorCSAqIERvdWJseS1saW5rZWQgY2lyY3VsYXIgbGlzdCBvZiBhbGwgZm9yZ2V0IGJ1ZmZlcnMgKHN1cGVyc2VkZWQKKwkgKiBidWZmZXJzIHdoaWNoIHdlIGNhbiB1bi1jaGVja3BvaW50IG9uY2UgdGhpcyB0cmFuc2FjdGlvbiBjb21taXRzKQorCSAqIFtqX2xpc3RfbG9ja10KKwkgKi8KKwlzdHJ1Y3Qgam91cm5hbF9oZWFkCSp0X2ZvcmdldDsKKworCS8qCisJICogRG91Ymx5LWxpbmtlZCBjaXJjdWxhciBsaXN0IG9mIGFsbCBidWZmZXJzIHN0aWxsIHRvIGJlIGZsdXNoZWQgYmVmb3JlCisJICogdGhpcyB0cmFuc2FjdGlvbiBjYW4gYmUgY2hlY2twb2ludGVkLiBbal9saXN0X2xvY2tdCisJICovCisJc3RydWN0IGpvdXJuYWxfaGVhZAkqdF9jaGVja3BvaW50X2xpc3Q7CisKKwkvKgorCSAqIERvdWJseS1saW5rZWQgY2lyY3VsYXIgbGlzdCBvZiBhbGwgYnVmZmVycyBzdWJtaXR0ZWQgZm9yIElPIHdoaWxlCisJICogY2hlY2twb2ludGluZy4gW2pfbGlzdF9sb2NrXQorCSAqLworCXN0cnVjdCBqb3VybmFsX2hlYWQJKnRfY2hlY2twb2ludF9pb19saXN0OworCisJLyoKKwkgKiBEb3VibHktbGlua2VkIGNpcmN1bGFyIGxpc3Qgb2YgdGVtcG9yYXJ5IGJ1ZmZlcnMgY3VycmVudGx5IHVuZGVyZ29pbmcKKwkgKiBJTyBpbiB0aGUgbG9nIFtqX2xpc3RfbG9ja10KKwkgKi8KKwlzdHJ1Y3Qgam91cm5hbF9oZWFkCSp0X2lvYnVmX2xpc3Q7CisKKwkvKgorCSAqIERvdWJseS1saW5rZWQgY2lyY3VsYXIgbGlzdCBvZiBtZXRhZGF0YSBidWZmZXJzIGJlaW5nIHNoYWRvd2VkIGJ5IGxvZworCSAqIElPLiAgVGhlIElPIGJ1ZmZlcnMgb24gdGhlIGlvYnVmIGxpc3QgYW5kIHRoZSBzaGFkb3cgYnVmZmVycyBvbiB0aGlzCisJICogbGlzdCBtYXRjaCBlYWNoIG90aGVyIG9uZSBmb3Igb25lIGF0IGFsbCB0aW1lcy4gW2pfbGlzdF9sb2NrXQorCSAqLworCXN0cnVjdCBqb3VybmFsX2hlYWQJKnRfc2hhZG93X2xpc3Q7CisKKwkvKgorCSAqIERvdWJseS1saW5rZWQgY2lyY3VsYXIgbGlzdCBvZiBjb250cm9sIGJ1ZmZlcnMgYmVpbmcgd3JpdHRlbiB0byB0aGUKKwkgKiBsb2cuIFtqX2xpc3RfbG9ja10KKwkgKi8KKwlzdHJ1Y3Qgam91cm5hbF9oZWFkCSp0X2xvZ19saXN0OworCisJLyoKKwkgKiBQcm90ZWN0cyBpbmZvIHJlbGF0ZWQgdG8gaGFuZGxlcworCSAqLworCXNwaW5sb2NrX3QJCXRfaGFuZGxlX2xvY2s7CisKKwkvKgorCSAqIE51bWJlciBvZiBvdXRzdGFuZGluZyB1cGRhdGVzIHJ1bm5pbmcgb24gdGhpcyB0cmFuc2FjdGlvbgorCSAqIFt0X2hhbmRsZV9sb2NrXQorCSAqLworCWludAkJCXRfdXBkYXRlczsKKworCS8qCisJICogTnVtYmVyIG9mIGJ1ZmZlcnMgcmVzZXJ2ZWQgZm9yIHVzZSBieSBhbGwgaGFuZGxlcyBpbiB0aGlzIHRyYW5zYWN0aW9uCisJICogaGFuZGxlIGJ1dCBub3QgeWV0IG1vZGlmaWVkLiBbdF9oYW5kbGVfbG9ja10KKwkgKi8KKwlpbnQJCQl0X291dHN0YW5kaW5nX2NyZWRpdHM7CisKKwkvKgorCSAqIEZvcndhcmQgYW5kIGJhY2t3YXJkIGxpbmtzIGZvciB0aGUgY2lyY3VsYXIgbGlzdCBvZiBhbGwgdHJhbnNhY3Rpb25zCisJICogYXdhaXRpbmcgY2hlY2twb2ludC4gW2pfbGlzdF9sb2NrXQorCSAqLworCXRyYW5zYWN0aW9uX3QJCSp0X2NwbmV4dCwgKnRfY3BwcmV2OworCisJLyoKKwkgKiBXaGVuIHdpbGwgdGhlIHRyYW5zYWN0aW9uIGV4cGlyZSAoYmVjb21lIGR1ZSBmb3IgY29tbWl0KSwgaW4gamlmZmllcz8KKwkgKiBbbm8gbG9ja2luZ10KKwkgKi8KKwl1bnNpZ25lZCBsb25nCQl0X2V4cGlyZXM7CisKKwkvKgorCSAqIEhvdyBtYW55IGhhbmRsZXMgdXNlZCB0aGlzIHRyYW5zYWN0aW9uPyBbdF9oYW5kbGVfbG9ja10KKwkgKi8KKwlpbnQgdF9oYW5kbGVfY291bnQ7CisKK307CisKKy8qKgorICogc3RydWN0IGpvdXJuYWxfcyAtIFRoZSBqb3VybmFsX3MgdHlwZSBpcyB0aGUgY29uY3JldGUgdHlwZSBhc3NvY2lhdGVkIHdpdGgKKyAqICAgICBqb3VybmFsX3QuCisgKiBAal9mbGFnczogIEdlbmVyYWwgam91cm5hbGluZyBzdGF0ZSBmbGFncworICogQGpfZXJybm86ICBJcyB0aGVyZSBhbiBvdXRzdGFuZGluZyB1bmNsZWFyZWQgZXJyb3Igb24gdGhlIGpvdXJuYWwgKGZyb20gYQorICogICAgIHByaW9yIGFib3J0KT8KKyAqIEBqX3NiX2J1ZmZlcjogRmlyc3QgcGFydCBvZiBzdXBlcmJsb2NrIGJ1ZmZlcgorICogQGpfc3VwZXJibG9jazogU2Vjb25kIHBhcnQgb2Ygc3VwZXJibG9jayBidWZmZXIKKyAqIEBqX2Zvcm1hdF92ZXJzaW9uOiBWZXJzaW9uIG9mIHRoZSBzdXBlcmJsb2NrIGZvcm1hdAorICogQGpfc3RhdGVfbG9jazogUHJvdGVjdCB0aGUgdmFyaW91cyBzY2FsYXJzIGluIHRoZSBqb3VybmFsCisgKiBAal9iYXJyaWVyX2NvdW50OiAgTnVtYmVyIG9mIHByb2Nlc3NlcyB3YWl0aW5nIHRvIGNyZWF0ZSBhIGJhcnJpZXIgbG9jaworICogQGpfYmFycmllcjogVGhlIGJhcnJpZXIgbG9jayBpdHNlbGYKKyAqIEBqX3J1bm5pbmdfdHJhbnNhY3Rpb246IFRoZSBjdXJyZW50IHJ1bm5pbmcgdHJhbnNhY3Rpb24uLgorICogQGpfY29tbWl0dGluZ190cmFuc2FjdGlvbjogdGhlIHRyYW5zYWN0aW9uIHdlIGFyZSBwdXNoaW5nIHRvIGRpc2sKKyAqIEBqX2NoZWNrcG9pbnRfdHJhbnNhY3Rpb25zOiBhIGxpbmtlZCBjaXJjdWxhciBsaXN0IG9mIGFsbCB0cmFuc2FjdGlvbnMKKyAqICB3YWl0aW5nIGZvciBjaGVja3BvaW50aW5nCisgKiBAal93YWl0X3RyYW5zYWN0aW9uX2xvY2tlZDogV2FpdCBxdWV1ZSBmb3Igd2FpdGluZyBmb3IgYSBsb2NrZWQgdHJhbnNhY3Rpb24KKyAqICB0byBzdGFydCBjb21taXR0aW5nLCBvciBmb3IgYSBiYXJyaWVyIGxvY2sgdG8gYmUgcmVsZWFzZWQKKyAqIEBqX3dhaXRfbG9nc3BhY2U6IFdhaXQgcXVldWUgZm9yIHdhaXRpbmcgZm9yIGNoZWNrcG9pbnRpbmcgdG8gY29tcGxldGUKKyAqIEBqX3dhaXRfZG9uZV9jb21taXQ6IFdhaXQgcXVldWUgZm9yIHdhaXRpbmcgZm9yIGNvbW1pdCB0byBjb21wbGV0ZQorICogQGpfd2FpdF9jaGVja3BvaW50OiAgV2FpdCBxdWV1ZSB0byB0cmlnZ2VyIGNoZWNrcG9pbnRpbmcKKyAqIEBqX3dhaXRfY29tbWl0OiBXYWl0IHF1ZXVlIHRvIHRyaWdnZXIgY29tbWl0CisgKiBAal93YWl0X3VwZGF0ZXM6IFdhaXQgcXVldWUgdG8gd2FpdCBmb3IgdXBkYXRlcyB0byBjb21wbGV0ZQorICogQGpfY2hlY2twb2ludF9tdXRleDogTXV0ZXggZm9yIGxvY2tpbmcgYWdhaW5zdCBjb25jdXJyZW50IGNoZWNrcG9pbnRzCisgKiBAal9oZWFkOiBKb3VybmFsIGhlYWQgLSBpZGVudGlmaWVzIHRoZSBmaXJzdCB1bnVzZWQgYmxvY2sgaW4gdGhlIGpvdXJuYWwKKyAqIEBqX3RhaWw6IEpvdXJuYWwgdGFpbCAtIGlkZW50aWZpZXMgdGhlIG9sZGVzdCBzdGlsbC11c2VkIGJsb2NrIGluIHRoZQorICogIGpvdXJuYWwuCisgKiBAal9mcmVlOiBKb3VybmFsIGZyZWUgLSBob3cgbWFueSBmcmVlIGJsb2NrcyBhcmUgdGhlcmUgaW4gdGhlIGpvdXJuYWw/CisgKiBAal9maXJzdDogVGhlIGJsb2NrIG51bWJlciBvZiB0aGUgZmlyc3QgdXNhYmxlIGJsb2NrCisgKiBAal9sYXN0OiBUaGUgYmxvY2sgbnVtYmVyIG9uZSBiZXlvbmQgdGhlIGxhc3QgdXNhYmxlIGJsb2NrCisgKiBAal9kZXY6IERldmljZSB3aGVyZSB3ZSBzdG9yZSB0aGUgam91cm5hbAorICogQGpfYmxvY2tzaXplOiBibG9ja3NpemUgZm9yIHRoZSBsb2NhdGlvbiB3aGVyZSB3ZSBzdG9yZSB0aGUgam91cm5hbC4KKyAqIEBqX2Jsa19vZmZzZXQ6IHN0YXJ0aW5nIGJsb2NrIG9mZnNldCBmb3IgaW50byB0aGUgZGV2aWNlIHdoZXJlIHdlIHN0b3JlIHRoZQorICogICAgIGpvdXJuYWwKKyAqIEBqX2ZzX2RldjogRGV2aWNlIHdoaWNoIGhvbGRzIHRoZSBjbGllbnQgZnMuICBGb3IgaW50ZXJuYWwgam91cm5hbCB0aGlzIHdpbGwKKyAqICAgICBiZSBlcXVhbCB0byBqX2RldgorICogQGpfbWF4bGVuOiBUb3RhbCBtYXhpbXVtIGNhcGFjaXR5IG9mIHRoZSBqb3VybmFsIHJlZ2lvbiBvbiBkaXNrLgorICogQGpfbGlzdF9sb2NrOiBQcm90ZWN0cyB0aGUgYnVmZmVyIGxpc3RzIGFuZCBpbnRlcm5hbCBidWZmZXIgc3RhdGUuCisgKiBAal9pbm9kZTogT3B0aW9uYWwgaW5vZGUgd2hlcmUgd2Ugc3RvcmUgdGhlIGpvdXJuYWwuICBJZiBwcmVzZW50LCBhbGwgam91cm5hbAorICogICAgIGJsb2NrIG51bWJlcnMgYXJlIG1hcHBlZCBpbnRvIHRoaXMgaW5vZGUgdmlhIGJtYXAoKS4KKyAqIEBqX3RhaWxfc2VxdWVuY2U6ICBTZXF1ZW5jZSBudW1iZXIgb2YgdGhlIG9sZGVzdCB0cmFuc2FjdGlvbiBpbiB0aGUgbG9nCisgKiBAal90cmFuc2FjdGlvbl9zZXF1ZW5jZTogU2VxdWVuY2UgbnVtYmVyIG9mIHRoZSBuZXh0IHRyYW5zYWN0aW9uIHRvIGdyYW50CisgKiBAal9jb21taXRfc2VxdWVuY2U6IFNlcXVlbmNlIG51bWJlciBvZiB0aGUgbW9zdCByZWNlbnRseSBjb21taXR0ZWQKKyAqICB0cmFuc2FjdGlvbgorICogQGpfY29tbWl0X3JlcXVlc3Q6IFNlcXVlbmNlIG51bWJlciBvZiB0aGUgbW9zdCByZWNlbnQgdHJhbnNhY3Rpb24gd2FudGluZworICogICAgIGNvbW1pdAorICogQGpfdXVpZDogVXVpZCBvZiBjbGllbnQgb2JqZWN0LgorICogQGpfdGFzazogUG9pbnRlciB0byB0aGUgY3VycmVudCBjb21taXQgdGhyZWFkIGZvciB0aGlzIGpvdXJuYWwKKyAqIEBqX21heF90cmFuc2FjdGlvbl9idWZmZXJzOiAgTWF4aW11bSBudW1iZXIgb2YgbWV0YWRhdGEgYnVmZmVycyB0byBhbGxvdyBpbiBhCisgKiAgICAgc2luZ2xlIGNvbXBvdW5kIGNvbW1pdCB0cmFuc2FjdGlvbgorICogQGpfY29tbWl0X2ludGVydmFsOiBXaGF0IGlzIHRoZSBtYXhpbXVtIHRyYW5zYWN0aW9uIGxpZmV0aW1lIGJlZm9yZSB3ZSBiZWdpbgorICogIGEgY29tbWl0PworICogQGpfY29tbWl0X3RpbWVyOiAgVGhlIHRpbWVyIHVzZWQgdG8gd2FrZXVwIHRoZSBjb21taXQgdGhyZWFkCisgKiBAal9yZXZva2VfbG9jazogUHJvdGVjdCB0aGUgcmV2b2tlIHRhYmxlCisgKiBAal9yZXZva2U6IFRoZSByZXZva2UgdGFibGUgLSBtYWludGFpbnMgdGhlIGxpc3Qgb2YgcmV2b2tlZCBibG9ja3MgaW4gdGhlCisgKiAgICAgY3VycmVudCB0cmFuc2FjdGlvbi4KKyAqIEBqX3Jldm9rZV90YWJsZTogYWx0ZXJuYXRlIHJldm9rZSB0YWJsZXMgZm9yIGpfcmV2b2tlCisgKiBAal93YnVmOiBhcnJheSBvZiBidWZmZXJfaGVhZHMgZm9yIGpiZDJfam91cm5hbF9jb21taXRfdHJhbnNhY3Rpb24KKyAqIEBqX3didWZzaXplOiBtYXhpbXVtIG51bWJlciBvZiBidWZmZXJfaGVhZHMgYWxsb3dlZCBpbiBqX3didWYsIHRoZQorICoJbnVtYmVyIHRoYXQgd2lsbCBmaXQgaW4gal9ibG9ja3NpemUKKyAqIEBqX2xhc3Rfc3luY193cml0ZXI6IG1vc3QgcmVjZW50IHBpZCB3aGljaCBkaWQgYSBzeW5jaHJvbm91cyB3cml0ZQorICogQGpfcHJpdmF0ZTogQW4gb3BhcXVlIHBvaW50ZXIgdG8gZnMtcHJpdmF0ZSBpbmZvcm1hdGlvbi4KKyAqLworCitzdHJ1Y3Qgam91cm5hbF9zCit7CisJLyogR2VuZXJhbCBqb3VybmFsaW5nIHN0YXRlIGZsYWdzIFtqX3N0YXRlX2xvY2tdICovCisJdW5zaWduZWQgbG9uZwkJal9mbGFnczsKKworCS8qCisJICogSXMgdGhlcmUgYW4gb3V0c3RhbmRpbmcgdW5jbGVhcmVkIGVycm9yIG9uIHRoZSBqb3VybmFsIChmcm9tIGEgcHJpb3IKKwkgKiBhYm9ydCk/IFtqX3N0YXRlX2xvY2tdCisJICovCisJaW50CQkJal9lcnJubzsKKworCS8qIFRoZSBzdXBlcmJsb2NrIGJ1ZmZlciAqLworCXN0cnVjdCBidWZmZXJfaGVhZAkqal9zYl9idWZmZXI7CisJam91cm5hbF9zdXBlcmJsb2NrX3QJKmpfc3VwZXJibG9jazsKKworCS8qIFZlcnNpb24gb2YgdGhlIHN1cGVyYmxvY2sgZm9ybWF0ICovCisJaW50CQkJal9mb3JtYXRfdmVyc2lvbjsKKworCS8qCisJICogUHJvdGVjdCB0aGUgdmFyaW91cyBzY2FsYXJzIGluIHRoZSBqb3VybmFsCisJICovCisJc3BpbmxvY2tfdAkJal9zdGF0ZV9sb2NrOworCisJLyoKKwkgKiBOdW1iZXIgb2YgcHJvY2Vzc2VzIHdhaXRpbmcgdG8gY3JlYXRlIGEgYmFycmllciBsb2NrIFtqX3N0YXRlX2xvY2tdCisJICovCisJaW50CQkJal9iYXJyaWVyX2NvdW50OworCisJLyogVGhlIGJhcnJpZXIgbG9jayBpdHNlbGYgKi8KKwlzdHJ1Y3QgbXV0ZXgJCWpfYmFycmllcjsKKworCS8qCisJICogVHJhbnNhY3Rpb25zOiBUaGUgY3VycmVudCBydW5uaW5nIHRyYW5zYWN0aW9uLi4uCisJICogW2pfc3RhdGVfbG9ja10gW2NhbGxlciBob2xkaW5nIG9wZW4gaGFuZGxlXQorCSAqLworCXRyYW5zYWN0aW9uX3QJCSpqX3J1bm5pbmdfdHJhbnNhY3Rpb247CisKKwkvKgorCSAqIHRoZSB0cmFuc2FjdGlvbiB3ZSBhcmUgcHVzaGluZyB0byBkaXNrCisJICogW2pfc3RhdGVfbG9ja10gW2NhbGxlciBob2xkaW5nIG9wZW4gaGFuZGxlXQorCSAqLworCXRyYW5zYWN0aW9uX3QJCSpqX2NvbW1pdHRpbmdfdHJhbnNhY3Rpb247CisKKwkvKgorCSAqIC4uLiBhbmQgYSBsaW5rZWQgY2lyY3VsYXIgbGlzdCBvZiBhbGwgdHJhbnNhY3Rpb25zIHdhaXRpbmcgZm9yCisJICogY2hlY2twb2ludGluZy4gW2pfbGlzdF9sb2NrXQorCSAqLworCXRyYW5zYWN0aW9uX3QJCSpqX2NoZWNrcG9pbnRfdHJhbnNhY3Rpb25zOworCisJLyoKKwkgKiBXYWl0IHF1ZXVlIGZvciB3YWl0aW5nIGZvciBhIGxvY2tlZCB0cmFuc2FjdGlvbiB0byBzdGFydCBjb21taXR0aW5nLAorCSAqIG9yIGZvciBhIGJhcnJpZXIgbG9jayB0byBiZSByZWxlYXNlZAorCSAqLworCXdhaXRfcXVldWVfaGVhZF90CWpfd2FpdF90cmFuc2FjdGlvbl9sb2NrZWQ7CisKKwkvKiBXYWl0IHF1ZXVlIGZvciB3YWl0aW5nIGZvciBjaGVja3BvaW50aW5nIHRvIGNvbXBsZXRlICovCisJd2FpdF9xdWV1ZV9oZWFkX3QJal93YWl0X2xvZ3NwYWNlOworCisJLyogV2FpdCBxdWV1ZSBmb3Igd2FpdGluZyBmb3IgY29tbWl0IHRvIGNvbXBsZXRlICovCisJd2FpdF9xdWV1ZV9oZWFkX3QJal93YWl0X2RvbmVfY29tbWl0OworCisJLyogV2FpdCBxdWV1ZSB0byB0cmlnZ2VyIGNoZWNrcG9pbnRpbmcgKi8KKwl3YWl0X3F1ZXVlX2hlYWRfdAlqX3dhaXRfY2hlY2twb2ludDsKKworCS8qIFdhaXQgcXVldWUgdG8gdHJpZ2dlciBjb21taXQgKi8KKwl3YWl0X3F1ZXVlX2hlYWRfdAlqX3dhaXRfY29tbWl0OworCisJLyogV2FpdCBxdWV1ZSB0byB3YWl0IGZvciB1cGRhdGVzIHRvIGNvbXBsZXRlICovCisJd2FpdF9xdWV1ZV9oZWFkX3QJal93YWl0X3VwZGF0ZXM7CisKKwkvKiBTZW1hcGhvcmUgZm9yIGxvY2tpbmcgYWdhaW5zdCBjb25jdXJyZW50IGNoZWNrcG9pbnRzICovCisJc3RydWN0IG11dGV4CQlqX2NoZWNrcG9pbnRfbXV0ZXg7CisKKwkvKgorCSAqIEpvdXJuYWwgaGVhZDogaWRlbnRpZmllcyB0aGUgZmlyc3QgdW51c2VkIGJsb2NrIGluIHRoZSBqb3VybmFsLgorCSAqIFtqX3N0YXRlX2xvY2tdCisJICovCisJdW5zaWduZWQgbG9uZwkJal9oZWFkOworCisJLyoKKwkgKiBKb3VybmFsIHRhaWw6IGlkZW50aWZpZXMgdGhlIG9sZGVzdCBzdGlsbC11c2VkIGJsb2NrIGluIHRoZSBqb3VybmFsLgorCSAqIFtqX3N0YXRlX2xvY2tdCisJICovCisJdW5zaWduZWQgbG9uZwkJal90YWlsOworCisJLyoKKwkgKiBKb3VybmFsIGZyZWU6IGhvdyBtYW55IGZyZWUgYmxvY2tzIGFyZSB0aGVyZSBpbiB0aGUgam91cm5hbD8KKwkgKiBbal9zdGF0ZV9sb2NrXQorCSAqLworCXVuc2lnbmVkIGxvbmcJCWpfZnJlZTsKKworCS8qCisJICogSm91cm5hbCBzdGFydCBhbmQgZW5kOiB0aGUgYmxvY2sgbnVtYmVycyBvZiB0aGUgZmlyc3QgdXNhYmxlIGJsb2NrCisJICogYW5kIG9uZSBiZXlvbmQgdGhlIGxhc3QgdXNhYmxlIGJsb2NrIGluIHRoZSBqb3VybmFsLiBbal9zdGF0ZV9sb2NrXQorCSAqLworCXVuc2lnbmVkIGxvbmcJCWpfZmlyc3Q7CisJdW5zaWduZWQgbG9uZwkJal9sYXN0OworCisJLyoKKwkgKiBEZXZpY2UsIGJsb2Nrc2l6ZSBhbmQgc3RhcnRpbmcgYmxvY2sgb2Zmc2V0IGZvciB0aGUgbG9jYXRpb24gd2hlcmUgd2UKKwkgKiBzdG9yZSB0aGUgam91cm5hbC4KKwkgKi8KKwlzdHJ1Y3QgYmxvY2tfZGV2aWNlCSpqX2RldjsKKwlpbnQJCQlqX2Jsb2Nrc2l6ZTsKKwl1bnNpZ25lZCBsb25nIGxvbmcJCWpfYmxrX29mZnNldDsKKworCS8qCisJICogRGV2aWNlIHdoaWNoIGhvbGRzIHRoZSBjbGllbnQgZnMuICBGb3IgaW50ZXJuYWwgam91cm5hbCB0aGlzIHdpbGwgYmUKKwkgKiBlcXVhbCB0byBqX2Rldi4KKwkgKi8KKwlzdHJ1Y3QgYmxvY2tfZGV2aWNlCSpqX2ZzX2RldjsKKworCS8qIFRvdGFsIG1heGltdW0gY2FwYWNpdHkgb2YgdGhlIGpvdXJuYWwgcmVnaW9uIG9uIGRpc2suICovCisJdW5zaWduZWQgaW50CQlqX21heGxlbjsKKworCS8qCisJICogUHJvdGVjdHMgdGhlIGJ1ZmZlciBsaXN0cyBhbmQgaW50ZXJuYWwgYnVmZmVyIHN0YXRlLgorCSAqLworCXNwaW5sb2NrX3QJCWpfbGlzdF9sb2NrOworCisJLyogT3B0aW9uYWwgaW5vZGUgd2hlcmUgd2Ugc3RvcmUgdGhlIGpvdXJuYWwuICBJZiBwcmVzZW50LCBhbGwgKi8KKwkvKiBqb3VybmFsIGJsb2NrIG51bWJlcnMgYXJlIG1hcHBlZCBpbnRvIHRoaXMgaW5vZGUgdmlhICovCisJLyogYm1hcCgpLiAqLworCXN0cnVjdCBpbm9kZQkJKmpfaW5vZGU7CisKKwkvKgorCSAqIFNlcXVlbmNlIG51bWJlciBvZiB0aGUgb2xkZXN0IHRyYW5zYWN0aW9uIGluIHRoZSBsb2cgW2pfc3RhdGVfbG9ja10KKwkgKi8KKwl0aWRfdAkJCWpfdGFpbF9zZXF1ZW5jZTsKKworCS8qCisJICogU2VxdWVuY2UgbnVtYmVyIG9mIHRoZSBuZXh0IHRyYW5zYWN0aW9uIHRvIGdyYW50IFtqX3N0YXRlX2xvY2tdCisJICovCisJdGlkX3QJCQlqX3RyYW5zYWN0aW9uX3NlcXVlbmNlOworCisJLyoKKwkgKiBTZXF1ZW5jZSBudW1iZXIgb2YgdGhlIG1vc3QgcmVjZW50bHkgY29tbWl0dGVkIHRyYW5zYWN0aW9uCisJICogW2pfc3RhdGVfbG9ja10uCisJICovCisJdGlkX3QJCQlqX2NvbW1pdF9zZXF1ZW5jZTsKKworCS8qCisJICogU2VxdWVuY2UgbnVtYmVyIG9mIHRoZSBtb3N0IHJlY2VudCB0cmFuc2FjdGlvbiB3YW50aW5nIGNvbW1pdAorCSAqIFtqX3N0YXRlX2xvY2tdCisJICovCisJdGlkX3QJCQlqX2NvbW1pdF9yZXF1ZXN0OworCisJLyoKKwkgKiBKb3VybmFsIHV1aWQ6IGlkZW50aWZpZXMgdGhlIG9iamVjdCAoZmlsZXN5c3RlbSwgTFZNIHZvbHVtZSBldGMpCisJICogYmFja2VkIGJ5IHRoaXMgam91cm5hbC4gIFRoaXMgd2lsbCBldmVudHVhbGx5IGJlIHJlcGxhY2VkIGJ5IGFuIGFycmF5CisJICogb2YgdXVpZHMsIGFsbG93aW5nIHVzIHRvIGluZGV4IG11bHRpcGxlIGRldmljZXMgd2l0aGluIGEgc2luZ2xlCisJICogam91cm5hbCBhbmQgdG8gcGVyZm9ybSBhdG9taWMgdXBkYXRlcyBhY3Jvc3MgdGhlbS4KKwkgKi8KKwlfX3U4CQkJal91dWlkWzE2XTsKKworCS8qIFBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgY29tbWl0IHRocmVhZCBmb3IgdGhpcyBqb3VybmFsICovCisJc3RydWN0IHRhc2tfc3RydWN0CSpqX3Rhc2s7CisKKwkvKgorCSAqIE1heGltdW0gbnVtYmVyIG9mIG1ldGFkYXRhIGJ1ZmZlcnMgdG8gYWxsb3cgaW4gYSBzaW5nbGUgY29tcG91bmQKKwkgKiBjb21taXQgdHJhbnNhY3Rpb24KKwkgKi8KKwlpbnQJCQlqX21heF90cmFuc2FjdGlvbl9idWZmZXJzOworCisJLyoKKwkgKiBXaGF0IGlzIHRoZSBtYXhpbXVtIHRyYW5zYWN0aW9uIGxpZmV0aW1lIGJlZm9yZSB3ZSBiZWdpbiBhIGNvbW1pdD8KKwkgKi8KKwl1bnNpZ25lZCBsb25nCQlqX2NvbW1pdF9pbnRlcnZhbDsKKworCS8qIFRoZSB0aW1lciB1c2VkIHRvIHdha2V1cCB0aGUgY29tbWl0IHRocmVhZDogKi8KKwlzdHJ1Y3QgdGltZXJfbGlzdAlqX2NvbW1pdF90aW1lcjsKKworCS8qCisJICogVGhlIHJldm9rZSB0YWJsZTogbWFpbnRhaW5zIHRoZSBsaXN0IG9mIHJldm9rZWQgYmxvY2tzIGluIHRoZQorCSAqIGN1cnJlbnQgdHJhbnNhY3Rpb24uICBbal9yZXZva2VfbG9ja10KKwkgKi8KKwlzcGlubG9ja190CQlqX3Jldm9rZV9sb2NrOworCXN0cnVjdCBqYmQyX3Jldm9rZV90YWJsZV9zICpqX3Jldm9rZTsKKwlzdHJ1Y3QgamJkMl9yZXZva2VfdGFibGVfcyAqal9yZXZva2VfdGFibGVbMl07CisKKwkvKgorCSAqIGFycmF5IG9mIGJocyBmb3IgamJkMl9qb3VybmFsX2NvbW1pdF90cmFuc2FjdGlvbgorCSAqLworCXN0cnVjdCBidWZmZXJfaGVhZAkqKmpfd2J1ZjsKKwlpbnQJCQlqX3didWZzaXplOworCisJcGlkX3QJCQlqX2xhc3Rfc3luY193cml0ZXI7CisKKwkvKgorCSAqIEFuIG9wYXF1ZSBwb2ludGVyIHRvIGZzLXByaXZhdGUgaW5mb3JtYXRpb24uICBleHQzIHB1dHMgaXRzCisJICogc3VwZXJibG9jayBwb2ludGVyIGhlcmUKKwkgKi8KKwl2b2lkICpqX3ByaXZhdGU7Cit9OworCisvKgorICogSm91cm5hbCBmbGFnIGRlZmluaXRpb25zCisgKi8KKyNkZWZpbmUgSkJEMl9VTk1PVU5UCTB4MDAxCS8qIEpvdXJuYWwgdGhyZWFkIGlzIGJlaW5nIGRlc3Ryb3llZCAqLworI2RlZmluZSBKQkQyX0FCT1JUCTB4MDAyCS8qIEpvdXJuYWxpbmcgaGFzIGJlZW4gYWJvcnRlZCBmb3IgZXJyb3JzLiAqLworI2RlZmluZSBKQkQyX0FDS19FUlIJMHgwMDQJLyogVGhlIGVycm5vIGluIHRoZSBzYiBoYXMgYmVlbiBhY2tlZCAqLworI2RlZmluZSBKQkQyX0ZMVVNIRUQJMHgwMDgJLyogVGhlIGpvdXJuYWwgc3VwZXJibG9jayBoYXMgYmVlbiBmbHVzaGVkICovCisjZGVmaW5lIEpCRDJfTE9BREVECTB4MDEwCS8qIFRoZSBqb3VybmFsIHN1cGVyYmxvY2sgaGFzIGJlZW4gbG9hZGVkICovCisjZGVmaW5lIEpCRDJfQkFSUklFUgkweDAyMAkvKiBVc2UgSURFIGJhcnJpZXJzICovCisKKy8qCisgKiBGdW5jdGlvbiBkZWNsYXJhdGlvbnMgZm9yIHRoZSBqb3VybmFsaW5nIHRyYW5zYWN0aW9uIGFuZCBidWZmZXIKKyAqIG1hbmFnZW1lbnQKKyAqLworCisvKiBGaWxpbmcgYnVmZmVycyAqLworZXh0ZXJuIHZvaWQgX19qYmQyX2pvdXJuYWxfdGVtcF91bmxpbmtfYnVmZmVyKHN0cnVjdCBqb3VybmFsX2hlYWQgKmpoKTsKK2V4dGVybiB2b2lkIGpiZDJfam91cm5hbF91bmZpbGVfYnVmZmVyKGpvdXJuYWxfdCAqLCBzdHJ1Y3Qgam91cm5hbF9oZWFkICopOworZXh0ZXJuIHZvaWQgX19qYmQyX2pvdXJuYWxfdW5maWxlX2J1ZmZlcihzdHJ1Y3Qgam91cm5hbF9oZWFkICopOworZXh0ZXJuIHZvaWQgX19qYmQyX2pvdXJuYWxfcmVmaWxlX2J1ZmZlcihzdHJ1Y3Qgam91cm5hbF9oZWFkICopOworZXh0ZXJuIHZvaWQgamJkMl9qb3VybmFsX3JlZmlsZV9idWZmZXIoam91cm5hbF90ICosIHN0cnVjdCBqb3VybmFsX2hlYWQgKik7CitleHRlcm4gdm9pZCBfX2piZDJfam91cm5hbF9maWxlX2J1ZmZlcihzdHJ1Y3Qgam91cm5hbF9oZWFkICosIHRyYW5zYWN0aW9uX3QgKiwgaW50KTsKK2V4dGVybiB2b2lkIF9fam91cm5hbF9mcmVlX2J1ZmZlcihzdHJ1Y3Qgam91cm5hbF9oZWFkICpiaCk7CitleHRlcm4gdm9pZCBqYmQyX2pvdXJuYWxfZmlsZV9idWZmZXIoc3RydWN0IGpvdXJuYWxfaGVhZCAqLCB0cmFuc2FjdGlvbl90ICosIGludCk7CitleHRlcm4gdm9pZCBfX2pvdXJuYWxfY2xlYW5fZGF0YV9saXN0KHRyYW5zYWN0aW9uX3QgKnRyYW5zYWN0aW9uKTsKKworLyogTG9nIGJ1ZmZlciBhbGxvY2F0aW9uICovCitleHRlcm4gc3RydWN0IGpvdXJuYWxfaGVhZCAqIGpiZDJfam91cm5hbF9nZXRfZGVzY3JpcHRvcl9idWZmZXIoam91cm5hbF90ICopOworaW50IGpiZDJfam91cm5hbF9uZXh0X2xvZ19ibG9jayhqb3VybmFsX3QgKiwgdW5zaWduZWQgbG9uZyBsb25nICopOworCisvKiBDb21taXQgbWFuYWdlbWVudCAqLworZXh0ZXJuIHZvaWQgamJkMl9qb3VybmFsX2NvbW1pdF90cmFuc2FjdGlvbihqb3VybmFsX3QgKik7CisKKy8qIENoZWNrcG9pbnQgbGlzdCBtYW5hZ2VtZW50ICovCitpbnQgX19qYmQyX2pvdXJuYWxfY2xlYW5fY2hlY2twb2ludF9saXN0KGpvdXJuYWxfdCAqam91cm5hbCk7CitpbnQgX19qYmQyX2pvdXJuYWxfcmVtb3ZlX2NoZWNrcG9pbnQoc3RydWN0IGpvdXJuYWxfaGVhZCAqKTsKK3ZvaWQgX19qYmQyX2pvdXJuYWxfaW5zZXJ0X2NoZWNrcG9pbnQoc3RydWN0IGpvdXJuYWxfaGVhZCAqLCB0cmFuc2FjdGlvbl90ICopOworCisvKiBCdWZmZXIgSU8gKi8KK2V4dGVybiBpbnQKK2piZDJfam91cm5hbF93cml0ZV9tZXRhZGF0YV9idWZmZXIodHJhbnNhY3Rpb25fdAkgICp0cmFuc2FjdGlvbiwKKwkJCSAgICAgIHN0cnVjdCBqb3VybmFsX2hlYWQgICpqaF9pbiwKKwkJCSAgICAgIHN0cnVjdCBqb3VybmFsX2hlYWQgKipqaF9vdXQsCisJCQkgICAgICB1bnNpZ25lZCBsb25nIGxvbmcgICBibG9ja25yKTsKKworLyogVHJhbnNhY3Rpb24gbG9ja2luZyAqLworZXh0ZXJuIHZvaWQJCV9fd2FpdF9vbl9qb3VybmFsIChqb3VybmFsX3QgKik7CisKKy8qCisgKiBKb3VybmFsIGxvY2tpbmcuCisgKgorICogV2UgbmVlZCB0byBsb2NrIHRoZSBqb3VybmFsIGR1cmluZyB0cmFuc2FjdGlvbiBzdGF0ZSBjaGFuZ2VzIHNvIHRoYXQgbm9ib2R5CisgKiBldmVyIHRyaWVzIHRvIHRha2UgYSBoYW5kbGUgb24gdGhlIHJ1bm5pbmcgdHJhbnNhY3Rpb24gd2hpbGUgd2UgYXJlIGluIHRoZQorICogbWlkZGxlIG9mIG1vdmluZyBpdCB0byB0aGUgY29tbWl0IHBoYXNlLiAgal9zdGF0ZV9sb2NrIGRvZXMgdGhpcy4KKyAqCisgKiBOb3RlIHRoYXQgdGhlIGxvY2tpbmcgaXMgY29tcGxldGVseSBpbnRlcnJ1cHQgdW5zYWZlLiAgV2UgbmV2ZXIgdG91Y2gKKyAqIGpvdXJuYWwgc3RydWN0dXJlcyBmcm9tIGludGVycnVwdHMuCisgKi8KKworc3RhdGljIGlubGluZSBoYW5kbGVfdCAqam91cm5hbF9jdXJyZW50X2hhbmRsZSh2b2lkKQoreworCXJldHVybiBjdXJyZW50LT5qb3VybmFsX2luZm87Cit9CisKKy8qIFRoZSBqb3VybmFsaW5nIGNvZGUgdXNlciBpbnRlcmZhY2U6CisgKgorICogQ3JlYXRlIGFuZCBkZXN0cm95IGhhbmRsZXMKKyAqIFJlZ2lzdGVyIGJ1ZmZlciBtb2RpZmljYXRpb25zIGFnYWluc3QgdGhlIGN1cnJlbnQgdHJhbnNhY3Rpb24uCisgKi8KKworZXh0ZXJuIGhhbmRsZV90ICpqYmQyX2pvdXJuYWxfc3RhcnQoam91cm5hbF90ICosIGludCBuYmxvY2tzKTsKK2V4dGVybiBpbnQJIGpiZDJfam91cm5hbF9yZXN0YXJ0IChoYW5kbGVfdCAqLCBpbnQgbmJsb2Nrcyk7CitleHRlcm4gaW50CSBqYmQyX2pvdXJuYWxfZXh0ZW5kIChoYW5kbGVfdCAqLCBpbnQgbmJsb2Nrcyk7CitleHRlcm4gaW50CSBqYmQyX2pvdXJuYWxfZ2V0X3dyaXRlX2FjY2VzcyhoYW5kbGVfdCAqLCBzdHJ1Y3QgYnVmZmVyX2hlYWQgKik7CitleHRlcm4gaW50CSBqYmQyX2pvdXJuYWxfZ2V0X2NyZWF0ZV9hY2Nlc3MgKGhhbmRsZV90ICosIHN0cnVjdCBidWZmZXJfaGVhZCAqKTsKK2V4dGVybiBpbnQJIGpiZDJfam91cm5hbF9nZXRfdW5kb19hY2Nlc3MoaGFuZGxlX3QgKiwgc3RydWN0IGJ1ZmZlcl9oZWFkICopOworZXh0ZXJuIGludAkgamJkMl9qb3VybmFsX2RpcnR5X2RhdGEgKGhhbmRsZV90ICosIHN0cnVjdCBidWZmZXJfaGVhZCAqKTsKK2V4dGVybiBpbnQJIGpiZDJfam91cm5hbF9kaXJ0eV9tZXRhZGF0YSAoaGFuZGxlX3QgKiwgc3RydWN0IGJ1ZmZlcl9oZWFkICopOworZXh0ZXJuIHZvaWQJIGpiZDJfam91cm5hbF9yZWxlYXNlX2J1ZmZlciAoaGFuZGxlX3QgKiwgc3RydWN0IGJ1ZmZlcl9oZWFkICopOworZXh0ZXJuIGludAkgamJkMl9qb3VybmFsX2ZvcmdldCAoaGFuZGxlX3QgKiwgc3RydWN0IGJ1ZmZlcl9oZWFkICopOworZXh0ZXJuIHZvaWQJIGpvdXJuYWxfc3luY19idWZmZXIgKHN0cnVjdCBidWZmZXJfaGVhZCAqKTsKK2V4dGVybiB2b2lkCSBqYmQyX2pvdXJuYWxfaW52YWxpZGF0ZXBhZ2Uoam91cm5hbF90ICosCisJCQkJc3RydWN0IHBhZ2UgKiwgdW5zaWduZWQgbG9uZyk7CitleHRlcm4gaW50CSBqYmQyX2pvdXJuYWxfdHJ5X3RvX2ZyZWVfYnVmZmVycyhqb3VybmFsX3QgKiwgc3RydWN0IHBhZ2UgKiwgZ2ZwX3QpOworZXh0ZXJuIGludAkgamJkMl9qb3VybmFsX3N0b3AoaGFuZGxlX3QgKik7CitleHRlcm4gaW50CSBqYmQyX2pvdXJuYWxfZmx1c2ggKGpvdXJuYWxfdCAqKTsKK2V4dGVybiB2b2lkCSBqYmQyX2pvdXJuYWxfbG9ja191cGRhdGVzIChqb3VybmFsX3QgKik7CitleHRlcm4gdm9pZAkgamJkMl9qb3VybmFsX3VubG9ja191cGRhdGVzIChqb3VybmFsX3QgKik7CisKK2V4dGVybiBqb3VybmFsX3QgKiBqYmQyX2pvdXJuYWxfaW5pdF9kZXYoc3RydWN0IGJsb2NrX2RldmljZSAqYmRldiwKKwkJCQlzdHJ1Y3QgYmxvY2tfZGV2aWNlICpmc19kZXYsCisJCQkJdW5zaWduZWQgbG9uZyBsb25nIHN0YXJ0LCBpbnQgbGVuLCBpbnQgYnNpemUpOworZXh0ZXJuIGpvdXJuYWxfdCAqIGpiZDJfam91cm5hbF9pbml0X2lub2RlIChzdHJ1Y3QgaW5vZGUgKik7CitleHRlcm4gaW50CSAgIGpiZDJfam91cm5hbF91cGRhdGVfZm9ybWF0IChqb3VybmFsX3QgKik7CitleHRlcm4gaW50CSAgIGpiZDJfam91cm5hbF9jaGVja191c2VkX2ZlYXR1cmVzCisJCSAgIChqb3VybmFsX3QgKiwgdW5zaWduZWQgbG9uZywgdW5zaWduZWQgbG9uZywgdW5zaWduZWQgbG9uZyk7CitleHRlcm4gaW50CSAgIGpiZDJfam91cm5hbF9jaGVja19hdmFpbGFibGVfZmVhdHVyZXMKKwkJICAgKGpvdXJuYWxfdCAqLCB1bnNpZ25lZCBsb25nLCB1bnNpZ25lZCBsb25nLCB1bnNpZ25lZCBsb25nKTsKK2V4dGVybiBpbnQJICAgamJkMl9qb3VybmFsX3NldF9mZWF0dXJlcworCQkgICAoam91cm5hbF90ICosIHVuc2lnbmVkIGxvbmcsIHVuc2lnbmVkIGxvbmcsIHVuc2lnbmVkIGxvbmcpOworZXh0ZXJuIGludAkgICBqYmQyX2pvdXJuYWxfY3JlYXRlICAgICAoam91cm5hbF90ICopOworZXh0ZXJuIGludAkgICBqYmQyX2pvdXJuYWxfbG9hZCAgICAgICAoam91cm5hbF90ICpqb3VybmFsKTsKK2V4dGVybiB2b2lkCSAgIGpiZDJfam91cm5hbF9kZXN0cm95ICAgIChqb3VybmFsX3QgKik7CitleHRlcm4gaW50CSAgIGpiZDJfam91cm5hbF9yZWNvdmVyICAgIChqb3VybmFsX3QgKmpvdXJuYWwpOworZXh0ZXJuIGludAkgICBqYmQyX2pvdXJuYWxfd2lwZSAgICAgICAoam91cm5hbF90ICosIGludCk7CitleHRlcm4gaW50CSAgIGpiZDJfam91cm5hbF9za2lwX3JlY292ZXJ5CShqb3VybmFsX3QgKik7CitleHRlcm4gdm9pZAkgICBqYmQyX2pvdXJuYWxfdXBkYXRlX3N1cGVyYmxvY2sJKGpvdXJuYWxfdCAqLCBpbnQpOworZXh0ZXJuIHZvaWQJICAgX19qYmQyX2pvdXJuYWxfYWJvcnRfaGFyZAkoam91cm5hbF90ICopOworZXh0ZXJuIHZvaWQJICAgamJkMl9qb3VybmFsX2Fib3J0ICAgICAgKGpvdXJuYWxfdCAqLCBpbnQpOworZXh0ZXJuIGludAkgICBqYmQyX2pvdXJuYWxfZXJybm8gICAgICAoam91cm5hbF90ICopOworZXh0ZXJuIHZvaWQJICAgamJkMl9qb3VybmFsX2Fja19lcnIgICAgKGpvdXJuYWxfdCAqKTsKK2V4dGVybiBpbnQJICAgamJkMl9qb3VybmFsX2NsZWFyX2VyciAgKGpvdXJuYWxfdCAqKTsKK2V4dGVybiBpbnQJICAgamJkMl9qb3VybmFsX2JtYXAoam91cm5hbF90ICosIHVuc2lnbmVkIGxvbmcsIHVuc2lnbmVkIGxvbmcgbG9uZyAqKTsKK2V4dGVybiBpbnQJICAgamJkMl9qb3VybmFsX2ZvcmNlX2NvbW1pdChqb3VybmFsX3QgKik7CisKKy8qCisgKiBqb3VybmFsX2hlYWQgbWFuYWdlbWVudAorICovCitzdHJ1Y3Qgam91cm5hbF9oZWFkICpqYmQyX2pvdXJuYWxfYWRkX2pvdXJuYWxfaGVhZChzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoKTsKK3N0cnVjdCBqb3VybmFsX2hlYWQgKmpiZDJfam91cm5hbF9ncmFiX2pvdXJuYWxfaGVhZChzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoKTsKK3ZvaWQgamJkMl9qb3VybmFsX3JlbW92ZV9qb3VybmFsX2hlYWQoc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCk7Cit2b2lkIGpiZDJfam91cm5hbF9wdXRfam91cm5hbF9oZWFkKHN0cnVjdCBqb3VybmFsX2hlYWQgKmpoKTsKKworLyoKKyAqIGhhbmRsZSBtYW5hZ2VtZW50CisgKi8KK2V4dGVybiBrbWVtX2NhY2hlX3QgKmpiZDJfaGFuZGxlX2NhY2hlOworCitzdGF0aWMgaW5saW5lIGhhbmRsZV90ICpqYmRfYWxsb2NfaGFuZGxlKGdmcF90IGdmcF9mbGFncykKK3sKKwlyZXR1cm4ga21lbV9jYWNoZV9hbGxvYyhqYmQyX2hhbmRsZV9jYWNoZSwgZ2ZwX2ZsYWdzKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGpiZF9mcmVlX2hhbmRsZShoYW5kbGVfdCAqaGFuZGxlKQoreworCWttZW1fY2FjaGVfZnJlZShqYmQyX2hhbmRsZV9jYWNoZSwgaGFuZGxlKTsKK30KKworLyogUHJpbWFyeSByZXZva2Ugc3VwcG9ydCAqLworI2RlZmluZSBKT1VSTkFMX1JFVk9LRV9ERUZBVUxUX0hBU0ggMjU2CitleHRlcm4gaW50CSAgIGpiZDJfam91cm5hbF9pbml0X3Jldm9rZShqb3VybmFsX3QgKiwgaW50KTsKK2V4dGVybiB2b2lkCSAgIGpiZDJfam91cm5hbF9kZXN0cm95X3Jldm9rZV9jYWNoZXModm9pZCk7CitleHRlcm4gaW50CSAgIGpiZDJfam91cm5hbF9pbml0X3Jldm9rZV9jYWNoZXModm9pZCk7CisKK2V4dGVybiB2b2lkCSAgIGpiZDJfam91cm5hbF9kZXN0cm95X3Jldm9rZShqb3VybmFsX3QgKik7CitleHRlcm4gaW50CSAgIGpiZDJfam91cm5hbF9yZXZva2UgKGhhbmRsZV90ICosIHVuc2lnbmVkIGxvbmcgbG9uZywgc3RydWN0IGJ1ZmZlcl9oZWFkICopOworZXh0ZXJuIGludAkgICBqYmQyX2pvdXJuYWxfY2FuY2VsX3Jldm9rZShoYW5kbGVfdCAqLCBzdHJ1Y3Qgam91cm5hbF9oZWFkICopOworZXh0ZXJuIHZvaWQJICAgamJkMl9qb3VybmFsX3dyaXRlX3Jldm9rZV9yZWNvcmRzKGpvdXJuYWxfdCAqLCB0cmFuc2FjdGlvbl90ICopOworCisvKiBSZWNvdmVyeSByZXZva2Ugc3VwcG9ydCAqLworZXh0ZXJuIGludAlqYmQyX2pvdXJuYWxfc2V0X3Jldm9rZShqb3VybmFsX3QgKiwgdW5zaWduZWQgbG9uZyBsb25nLCB0aWRfdCk7CitleHRlcm4gaW50CWpiZDJfam91cm5hbF90ZXN0X3Jldm9rZShqb3VybmFsX3QgKiwgdW5zaWduZWQgbG9uZyBsb25nLCB0aWRfdCk7CitleHRlcm4gdm9pZAlqYmQyX2pvdXJuYWxfY2xlYXJfcmV2b2tlKGpvdXJuYWxfdCAqKTsKK2V4dGVybiB2b2lkCWpiZDJfam91cm5hbF9zd2l0Y2hfcmV2b2tlX3RhYmxlKGpvdXJuYWxfdCAqam91cm5hbCk7CisKKy8qCisgKiBUaGUgbG9nIHRocmVhZCB1c2VyIGludGVyZmFjZToKKyAqCisgKiBSZXF1ZXN0IHNwYWNlIGluIHRoZSBjdXJyZW50IHRyYW5zYWN0aW9uLCBhbmQgZm9yY2UgdHJhbnNhY3Rpb24gY29tbWl0CisgKiB0cmFuc2l0aW9ucyBvbiBkZW1hbmQuCisgKi8KKworaW50IF9famJkMl9sb2dfc3BhY2VfbGVmdChqb3VybmFsX3QgKik7IC8qIENhbGxlZCB3aXRoIGpvdXJuYWwgbG9ja2VkICovCitpbnQgamJkMl9sb2dfc3RhcnRfY29tbWl0KGpvdXJuYWxfdCAqam91cm5hbCwgdGlkX3QgdGlkKTsKK2ludCBfX2piZDJfbG9nX3N0YXJ0X2NvbW1pdChqb3VybmFsX3QgKmpvdXJuYWwsIHRpZF90IHRpZCk7CitpbnQgamJkMl9qb3VybmFsX3N0YXJ0X2NvbW1pdChqb3VybmFsX3QgKmpvdXJuYWwsIHRpZF90ICp0aWQpOworaW50IGpiZDJfam91cm5hbF9mb3JjZV9jb21taXRfbmVzdGVkKGpvdXJuYWxfdCAqam91cm5hbCk7CitpbnQgamJkMl9sb2dfd2FpdF9jb21taXQoam91cm5hbF90ICpqb3VybmFsLCB0aWRfdCB0aWQpOworaW50IGpiZDJfbG9nX2RvX2NoZWNrcG9pbnQoam91cm5hbF90ICpqb3VybmFsKTsKKwordm9pZCBfX2piZDJfbG9nX3dhaXRfZm9yX3NwYWNlKGpvdXJuYWxfdCAqam91cm5hbCk7CitleHRlcm4gdm9pZAlfX2piZDJfam91cm5hbF9kcm9wX3RyYW5zYWN0aW9uKGpvdXJuYWxfdCAqLCB0cmFuc2FjdGlvbl90ICopOworZXh0ZXJuIGludAlqYmQyX2NsZWFudXBfam91cm5hbF90YWlsKGpvdXJuYWxfdCAqKTsKKworLyogRGVidWdnaW5nIGNvZGUgb25seTogKi8KKworI2RlZmluZSBqYmRfRU5PU1lTKCkgXAorZG8gewkJCQkJCQkJICAgICAgICAgICBcCisJcHJpbnRrIChLRVJOX0VSUiAiSkJEIHVuaW1wbGVtZW50ZWQgZnVuY3Rpb24gJXNcbiIsIF9fRlVOQ1RJT05fXyk7IFwKKwljdXJyZW50LT5zdGF0ZSA9IFRBU0tfVU5JTlRFUlJVUFRJQkxFOwkJCSAgICAgICAgICAgXAorCXNjaGVkdWxlKCk7CQkJCQkJICAgICAgICAgICBcCit9IHdoaWxlICgxKQorCisvKgorICogaXNfam91cm5hbF9hYm9ydAorICoKKyAqIFNpbXBsZSB0ZXN0IHdyYXBwZXIgZnVuY3Rpb24gdG8gdGVzdCB0aGUgSkJEMl9BQk9SVCBzdGF0ZSBmbGFnLiAgVGhpcworICogYml0LCB3aGVuIHNldCwgaW5kaWNhdGVzIHRoYXQgd2UgaGF2ZSBoYWQgYSBmYXRhbCBlcnJvciBzb21ld2hlcmUsCisgKiBlaXRoZXIgaW5zaWRlIHRoZSBqb3VybmFsaW5nIGxheWVyIG9yIGluZGljYXRlZCB0byB1cyBieSB0aGUgY2xpZW50CisgKiAoZWcuIGV4dDMpLCBhbmQgdGhhdCB3ZSBhbmQgc2hvdWxkIG5vdCBjb21taXQgYW55IGZ1cnRoZXIKKyAqIHRyYW5zYWN0aW9ucy4KKyAqLworCitzdGF0aWMgaW5saW5lIGludCBpc19qb3VybmFsX2Fib3J0ZWQoam91cm5hbF90ICpqb3VybmFsKQoreworCXJldHVybiBqb3VybmFsLT5qX2ZsYWdzICYgSkJEMl9BQk9SVDsKK30KKworc3RhdGljIGlubGluZSBpbnQgaXNfaGFuZGxlX2Fib3J0ZWQoaGFuZGxlX3QgKmhhbmRsZSkKK3sKKwlpZiAoaGFuZGxlLT5oX2Fib3J0ZWQpCisJCXJldHVybiAxOworCXJldHVybiBpc19qb3VybmFsX2Fib3J0ZWQoaGFuZGxlLT5oX3RyYW5zYWN0aW9uLT50X2pvdXJuYWwpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgamJkMl9qb3VybmFsX2Fib3J0X2hhbmRsZShoYW5kbGVfdCAqaGFuZGxlKQoreworCWhhbmRsZS0+aF9hYm9ydGVkID0gMTsKK30KKworI2VuZGlmIC8qIF9fS0VSTkVMX18gICAqLworCisvKiBDb21wYXJpc29uIGZ1bmN0aW9ucyBmb3IgdHJhbnNhY3Rpb24gSURzOiBwZXJmb3JtIGNvbXBhcmlzb25zIHVzaW5nCisgKiBtb2R1bG8gYXJpdGhtZXRpYyBzbyB0aGF0IHRoZXkgd29yayBvdmVyIHNlcXVlbmNlIG51bWJlciB3cmFwcy4gKi8KKworc3RhdGljIGlubGluZSBpbnQgdGlkX2d0KHRpZF90IHgsIHRpZF90IHkpCit7CisJaW50IGRpZmZlcmVuY2UgPSAoeCAtIHkpOworCXJldHVybiAoZGlmZmVyZW5jZSA+IDApOworfQorCitzdGF0aWMgaW5saW5lIGludCB0aWRfZ2VxKHRpZF90IHgsIHRpZF90IHkpCit7CisJaW50IGRpZmZlcmVuY2UgPSAoeCAtIHkpOworCXJldHVybiAoZGlmZmVyZW5jZSA+PSAwKTsKK30KKworZXh0ZXJuIGludCBqYmQyX2pvdXJuYWxfYmxvY2tzX3Blcl9wYWdlKHN0cnVjdCBpbm9kZSAqaW5vZGUpOworZXh0ZXJuIHNpemVfdCBqb3VybmFsX3RhZ19ieXRlcyhqb3VybmFsX3QgKmpvdXJuYWwpOworCisvKgorICogUmV0dXJuIHRoZSBtaW5pbXVtIG51bWJlciBvZiBibG9ja3Mgd2hpY2ggbXVzdCBiZSBmcmVlIGluIHRoZSBqb3VybmFsCisgKiBiZWZvcmUgYSBuZXcgdHJhbnNhY3Rpb24gbWF5IGJlIHN0YXJ0ZWQuICBNdXN0IGJlIGNhbGxlZCB1bmRlciBqX3N0YXRlX2xvY2suCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IGpiZF9zcGFjZV9uZWVkZWQoam91cm5hbF90ICpqb3VybmFsKQoreworCWludCBuYmxvY2tzID0gam91cm5hbC0+al9tYXhfdHJhbnNhY3Rpb25fYnVmZmVyczsKKwlpZiAoam91cm5hbC0+al9jb21taXR0aW5nX3RyYW5zYWN0aW9uKQorCQluYmxvY2tzICs9IGpvdXJuYWwtPmpfY29tbWl0dGluZ190cmFuc2FjdGlvbi0+CisJCQkJCXRfb3V0c3RhbmRpbmdfY3JlZGl0czsKKwlyZXR1cm4gbmJsb2NrczsKK30KKworLyoKKyAqIERlZmluaXRpb25zIHdoaWNoIGF1Z21lbnQgdGhlIGJ1ZmZlcl9oZWFkIGxheWVyCisgKi8KKworLyogam91cm5hbGluZyBidWZmZXIgdHlwZXMgKi8KKyNkZWZpbmUgQkpfTm9uZQkJMAkvKiBOb3Qgam91cm5hbGVkICovCisjZGVmaW5lIEJKX1N5bmNEYXRhCTEJLyogTm9ybWFsIGRhdGE6IGZsdXNoIGJlZm9yZSBjb21taXQgKi8KKyNkZWZpbmUgQkpfTWV0YWRhdGEJMgkvKiBOb3JtYWwgam91cm5hbGVkIG1ldGFkYXRhICovCisjZGVmaW5lIEJKX0ZvcmdldAkzCS8qIEJ1ZmZlciBzdXBlcnNlZGVkIGJ5IHRoaXMgdHJhbnNhY3Rpb24gKi8KKyNkZWZpbmUgQkpfSU8JCTQJLyogQnVmZmVyIGlzIGZvciB0ZW1wb3JhcnkgSU8gdXNlICovCisjZGVmaW5lIEJKX1NoYWRvdwk1CS8qIEJ1ZmZlciBjb250ZW50cyBiZWluZyBzaGFkb3dlZCB0byB0aGUgbG9nICovCisjZGVmaW5lIEJKX0xvZ0N0bAk2CS8qIEJ1ZmZlciBjb250YWlucyBsb2cgZGVzY3JpcHRvcnMgKi8KKyNkZWZpbmUgQkpfUmVzZXJ2ZWQJNwkvKiBCdWZmZXIgaXMgcmVzZXJ2ZWQgZm9yIGFjY2VzcyBieSBqb3VybmFsICovCisjZGVmaW5lIEJKX0xvY2tlZAk4CS8qIExvY2tlZCBmb3IgSS9PIGR1cmluZyBjb21taXQgKi8KKyNkZWZpbmUgQkpfVHlwZXMJOQorCitleHRlcm4gaW50IGpiZF9ibG9ja3NfcGVyX3BhZ2Uoc3RydWN0IGlub2RlICppbm9kZSk7CisKKyNpZmRlZiBfX0tFUk5FTF9fCisKKyNkZWZpbmUgYnVmZmVyX3RyYWNlX2luaXQoYmgpCWRvIHt9IHdoaWxlICgwKQorI2RlZmluZSBwcmludF9idWZmZXJfZmllbGRzKGJoKQlkbyB7fSB3aGlsZSAoMCkKKyNkZWZpbmUgcHJpbnRfYnVmZmVyX3RyYWNlKGJoKQlkbyB7fSB3aGlsZSAoMCkKKyNkZWZpbmUgQlVGRkVSX1RSQUNFKGJoLCBpbmZvKQlkbyB7fSB3aGlsZSAoMCkKKyNkZWZpbmUgQlVGRkVSX1RSQUNFMihiaCwgYmgyLCBpbmZvKQlkbyB7fSB3aGlsZSAoMCkKKyNkZWZpbmUgSkJVRkZFUl9UUkFDRShqaCwgaW5mbykJZG8ge30gd2hpbGUgKDApCisKKyNlbmRpZgkvKiBfX0tFUk5FTF9fICovCisKKyNlbmRpZgkvKiBfTElOVVhfSkJEX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgva2VybmVsLmggYi9pbmNsdWRlL2xpbnV4L2tlcm5lbC5oCmluZGV4IDgwZjM5Y2EuLjI0YjYxMTEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgva2VybmVsLmgKKysrIGIvaW5jbHVkZS9saW51eC9rZXJuZWwuaApAQCAtMTcxLDYgKzE3MSw4IEBACiAKIGV4dGVybiBpbnQgcHJpbnRrX3JhdGVsaW1pdCh2b2lkKTsKIGV4dGVybiBpbnQgX19wcmludGtfcmF0ZWxpbWl0KGludCByYXRlbGltaXRfamlmZmllcywgaW50IHJhdGVsaW1pdF9idXJzdCk7CitleHRlcm4gYm9vbCBwcmludGtfdGltZWRfcmF0ZWxpbWl0KHVuc2lnbmVkIGxvbmcgKmNhbGxlcl9qaWZmaWVzLAorCQkJCXVuc2lnbmVkIGludCBpbnRlcnZhbF9tc2VjKTsKIAogc3RhdGljIGlubGluZSB2b2lkIGNvbnNvbGVfc2lsZW50KHZvaWQpCiB7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2xpYmF0YS5oIGIvaW5jbHVkZS9saW51eC9saWJhdGEuaAppbmRleCBkMGE3YWQ1Li5hYmQyZGViIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2xpYmF0YS5oCisrKyBiL2luY2x1ZGUvbGludXgvbGliYXRhLmgKQEAgLTE0Myw3ICsxNDMsNyBAQAogCUFUQV9ERkxBR19DRkdfTUFTSwk9ICgxIDw8IDgpIC0gMSwKIAogCUFUQV9ERkxBR19QSU8JCT0gKDEgPDwgOCksIC8qIGRldmljZSBsaW1pdGVkIHRvIFBJTyBtb2RlICovCi0JQVRBX0RGTEFHX05DUV9PRkYJPSAoMSA8PCA5KSwgLyogZGV2aWVkIGxpbWl0ZWQgdG8gbm9uLU5DUSBtb2RlICovCisJQVRBX0RGTEFHX05DUV9PRkYJPSAoMSA8PCA5KSwgLyogZGV2aWNlIGxpbWl0ZWQgdG8gbm9uLU5DUSBtb2RlICovCiAJQVRBX0RGTEFHX1NVU1BFTkRFRAk9ICgxIDw8IDEwKSwgLyogZGV2aWNlIHN1c3BlbmRlZCAqLwogCUFUQV9ERkxBR19JTklUX01BU0sJPSAoMSA8PCAxNikgLSAxLAogCkBAIC03MDIsNyArNzAyLDYgQEAKIGV4dGVybiBpbnQgYXRhX3N0ZF9zb2Z0cmVzZXQoc3RydWN0IGF0YV9wb3J0ICphcCwgdW5zaWduZWQgaW50ICpjbGFzc2VzKTsKIGV4dGVybiBpbnQgc2F0YV9zdGRfaGFyZHJlc2V0KHN0cnVjdCBhdGFfcG9ydCAqYXAsIHVuc2lnbmVkIGludCAqY2xhc3MpOwogZXh0ZXJuIHZvaWQgYXRhX3N0ZF9wb3N0cmVzZXQoc3RydWN0IGF0YV9wb3J0ICphcCwgdW5zaWduZWQgaW50ICpjbGFzc2VzKTsKLWV4dGVybiBpbnQgYXRhX2Rldl9yZXZhbGlkYXRlKHN0cnVjdCBhdGFfZGV2aWNlICpkZXYsIGludCBwb3N0X3Jlc2V0KTsKIGV4dGVybiB2b2lkIGF0YV9wb3J0X2Rpc2FibGUoc3RydWN0IGF0YV9wb3J0ICopOwogZXh0ZXJuIHZvaWQgYXRhX3N0ZF9wb3J0cyhzdHJ1Y3QgYXRhX2lvcG9ydHMgKmlvYWRkcik7CiAjaWZkZWYgQ09ORklHX1BDSQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9sb2NrZC9iaW5kLmggYi9pbmNsdWRlL2xpbnV4L2xvY2tkL2JpbmQuaAppbmRleCA4MWUzYTE4Li5hYTUwZDg5IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2xvY2tkL2JpbmQuaAorKysgYi9pbmNsdWRlL2xpbnV4L2xvY2tkL2JpbmQuaApAQCAtMTAsNiArMTAsMTEgQEAKICNkZWZpbmUgTElOVVhfTE9DS0RfQklORF9ICiAKICNpbmNsdWRlIDxsaW51eC9sb2NrZC9ubG0uaD4KKy8qIG5lZWQgeGRyLWVuY29kZWQgZXJyb3IgY29kZXMgdG9vLCBzby4uLiAqLworI2luY2x1ZGUgPGxpbnV4L2xvY2tkL3hkci5oPgorI2lmZGVmIENPTkZJR19MT0NLRF9WNAorI2luY2x1ZGUgPGxpbnV4L2xvY2tkL3hkcjQuaD4KKyNlbmRpZgogCiAvKiBEdW1teSBkZWNsYXJhdGlvbnMgKi8KIHN0cnVjdCBzdmNfcnFzdDsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbG9ja2QvbG9ja2QuaCBiL2luY2x1ZGUvbGludXgvbG9ja2QvbG9ja2QuaAppbmRleCAyOTA5NjE5Li44NjJkOTczIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2xvY2tkL2xvY2tkLmgKKysrIGIvaW5jbHVkZS9saW51eC9sb2NrZC9sb2NrZC5oCkBAIC0xNTQsNyArMTU0LDcgQEAKIHN0cnVjdCBubG1fd2FpdCAqIG5sbWNsbnRfcHJlcGFyZV9ibG9jayhzdHJ1Y3QgbmxtX2hvc3QgKmhvc3QsIHN0cnVjdCBmaWxlX2xvY2sgKmZsKTsKIHZvaWQJCSAgbmxtY2xudF9maW5pc2hfYmxvY2soc3RydWN0IG5sbV93YWl0ICpibG9jayk7CiBpbnQJCSAgbmxtY2xudF9ibG9jayhzdHJ1Y3QgbmxtX3dhaXQgKmJsb2NrLCBzdHJ1Y3QgbmxtX3Jxc3QgKnJlcSwgbG9uZyB0aW1lb3V0KTsKLXUzMgkJICBubG1jbG50X2dyYW50KGNvbnN0IHN0cnVjdCBzb2NrYWRkcl9pbiAqYWRkciwgY29uc3Qgc3RydWN0IG5sbV9sb2NrICopOworX19iZTMyCQkgIG5sbWNsbnRfZ3JhbnQoY29uc3Qgc3RydWN0IHNvY2thZGRyX2luICphZGRyLCBjb25zdCBzdHJ1Y3QgbmxtX2xvY2sgKik7CiB2b2lkCQkgIG5sbWNsbnRfcmVjb3Zlcnkoc3RydWN0IG5sbV9ob3N0ICopOwogaW50CQkgIG5sbWNsbnRfcmVjbGFpbShzdHJ1Y3QgbmxtX2hvc3QgKiwgc3RydWN0IGZpbGVfbG9jayAqKTsKIHZvaWQJCSAgbmxtY2xudF9uZXh0X2Nvb2tpZShzdHJ1Y3QgbmxtX2Nvb2tpZSAqKTsKQEAgLTE4NCwxMiArMTg0LDEyIEBACiAvKgogICogU2VydmVyLXNpZGUgbG9jayBoYW5kbGluZwogICovCi11MzIJCSAgbmxtc3ZjX2xvY2soc3RydWN0IHN2Y19ycXN0ICosIHN0cnVjdCBubG1fZmlsZSAqLAorX19iZTMyCQkgIG5sbXN2Y19sb2NrKHN0cnVjdCBzdmNfcnFzdCAqLCBzdHJ1Y3QgbmxtX2ZpbGUgKiwKIAkJCQkJc3RydWN0IG5sbV9sb2NrICosIGludCwgc3RydWN0IG5sbV9jb29raWUgKik7Ci11MzIJCSAgbmxtc3ZjX3VubG9jayhzdHJ1Y3QgbmxtX2ZpbGUgKiwgc3RydWN0IG5sbV9sb2NrICopOwotdTMyCQkgIG5sbXN2Y190ZXN0bG9jayhzdHJ1Y3QgbmxtX2ZpbGUgKiwgc3RydWN0IG5sbV9sb2NrICosCitfX2JlMzIJCSAgbmxtc3ZjX3VubG9jayhzdHJ1Y3QgbmxtX2ZpbGUgKiwgc3RydWN0IG5sbV9sb2NrICopOworX19iZTMyCQkgIG5sbXN2Y190ZXN0bG9jayhzdHJ1Y3QgbmxtX2ZpbGUgKiwgc3RydWN0IG5sbV9sb2NrICosCiAJCQkJCXN0cnVjdCBubG1fbG9jayAqKTsKLXUzMgkJICBubG1zdmNfY2FuY2VsX2Jsb2NrZWQoc3RydWN0IG5sbV9maWxlICosIHN0cnVjdCBubG1fbG9jayAqKTsKK19fYmUzMgkJICBubG1zdmNfY2FuY2VsX2Jsb2NrZWQoc3RydWN0IG5sbV9maWxlICosIHN0cnVjdCBubG1fbG9jayAqKTsKIHVuc2lnbmVkIGxvbmcJICBubG1zdmNfcmV0cnlfYmxvY2tlZCh2b2lkKTsKIHZvaWQJCSAgbmxtc3ZjX3RyYXZlcnNlX2Jsb2NrcyhzdHJ1Y3QgbmxtX2hvc3QgKiwgc3RydWN0IG5sbV9maWxlICosCiAJCQkJCW5sbV9ob3N0X21hdGNoX2ZuX3QgbWF0Y2gpOwpAQCAtMTk4LDcgKzE5OCw3IEBACiAvKgogICogRmlsZSBoYW5kbGluZyBmb3IgdGhlIHNlcnZlciBwZXJzb25hbGl0eQogICovCi11MzIJCSAgbmxtX2xvb2t1cF9maWxlKHN0cnVjdCBzdmNfcnFzdCAqLCBzdHJ1Y3QgbmxtX2ZpbGUgKiosCitfX2JlMzIJCSAgbmxtX2xvb2t1cF9maWxlKHN0cnVjdCBzdmNfcnFzdCAqLCBzdHJ1Y3QgbmxtX2ZpbGUgKiosCiAJCQkJCXN0cnVjdCBuZnNfZmggKik7CiB2b2lkCQkgIG5sbV9yZWxlYXNlX2ZpbGUoc3RydWN0IG5sbV9maWxlICopOwogdm9pZAkJICBubG1zdmNfbWFya19yZXNvdXJjZXModm9pZCk7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2xvY2tkL3NoYXJlLmggYi9pbmNsdWRlL2xpbnV4L2xvY2tkL3NoYXJlLmgKaW5kZXggY2Q3ODE2ZS4uNjMwYzViZiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9sb2NrZC9zaGFyZS5oCisrKyBiL2luY2x1ZGUvbGludXgvbG9ja2Qvc2hhcmUuaApAQCAtMjEsOSArMjEsOSBAQAogCXUzMgkJCXNfbW9kZTsJCS8qIGRlbnkgbW9kZSAqLwogfTsKIAotdTMyCW5sbXN2Y19zaGFyZV9maWxlKHN0cnVjdCBubG1faG9zdCAqLCBzdHJ1Y3QgbmxtX2ZpbGUgKiwKK19fYmUzMglubG1zdmNfc2hhcmVfZmlsZShzdHJ1Y3QgbmxtX2hvc3QgKiwgc3RydWN0IG5sbV9maWxlICosCiAJCQkJCSAgICAgICBzdHJ1Y3QgbmxtX2FyZ3MgKik7Ci11MzIJbmxtc3ZjX3Vuc2hhcmVfZmlsZShzdHJ1Y3QgbmxtX2hvc3QgKiwgc3RydWN0IG5sbV9maWxlICosCitfX2JlMzIJbmxtc3ZjX3Vuc2hhcmVfZmlsZShzdHJ1Y3QgbmxtX2hvc3QgKiwgc3RydWN0IG5sbV9maWxlICosCiAJCQkJCSAgICAgICBzdHJ1Y3QgbmxtX2FyZ3MgKik7CiB2b2lkCW5sbXN2Y190cmF2ZXJzZV9zaGFyZXMoc3RydWN0IG5sbV9ob3N0ICosIHN0cnVjdCBubG1fZmlsZSAqLAogCQkJCQkgICAgICAgbmxtX2hvc3RfbWF0Y2hfZm5fdCk7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2xvY2tkL3hkci5oIGIvaW5jbHVkZS9saW51eC9sb2NrZC94ZHIuaAppbmRleCBiYjBhMGYxLi4yOWU3ZDlmIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2xvY2tkL3hkci5oCisrKyBiL2luY2x1ZGUvbGludXgvbG9ja2QveGRyLmgKQEAgLTEzLDYgKzEzLDggQEAKICNpbmNsdWRlIDxsaW51eC9uZnMuaD4KICNpbmNsdWRlIDxsaW51eC9zdW5ycGMveGRyLmg+CiAKK3N0cnVjdCBzdmNfcnFzdDsKKwogI2RlZmluZSBOTE1fTUFYQ09PS0lFTEVOICAgIAkzMgogI2RlZmluZSBOTE1fTUFYU1RSTEVOCQkxMDI0CiAKQEAgLTIyLDYgKzI0LDggQEAKICNkZWZpbmUJbmxtX2xja19ibG9ja2VkCQlfX2NvbnN0YW50X2h0b25sKE5MTV9MQ0tfQkxPQ0tFRCkKICNkZWZpbmUJbmxtX2xja19kZW5pZWRfZ3JhY2VfcGVyaW9kCV9fY29uc3RhbnRfaHRvbmwoTkxNX0xDS19ERU5JRURfR1JBQ0VfUEVSSU9EKQogCisjZGVmaW5lIG5sbV9kcm9wX3JlcGx5CQlfX2NvbnN0YW50X2h0b25sKDMwMDAwKQorCiAvKiBMb2NrIGluZm8gcGFzc2VkIHZpYSBOTE0gKi8KIHN0cnVjdCBubG1fbG9jayB7CiAJY2hhciAqCQkJY2FsbGVyOwpAQCAtODYsMTkgKzkwLDE5IEBACiAgKi8KICNkZWZpbmUgTkxNU1ZDX1hEUlNJWkUJCXNpemVvZihzdHJ1Y3QgbmxtX2FyZ3MpCiAKLWludAlubG1zdmNfZGVjb2RlX3Rlc3RhcmdzKHN0cnVjdCBzdmNfcnFzdCAqLCB1MzIgKiwgc3RydWN0IG5sbV9hcmdzICopOwotaW50CW5sbXN2Y19lbmNvZGVfdGVzdHJlcyhzdHJ1Y3Qgc3ZjX3Jxc3QgKiwgdTMyICosIHN0cnVjdCBubG1fcmVzICopOwotaW50CW5sbXN2Y19kZWNvZGVfbG9ja2FyZ3Moc3RydWN0IHN2Y19ycXN0ICosIHUzMiAqLCBzdHJ1Y3QgbmxtX2FyZ3MgKik7Ci1pbnQJbmxtc3ZjX2RlY29kZV9jYW5jYXJncyhzdHJ1Y3Qgc3ZjX3Jxc3QgKiwgdTMyICosIHN0cnVjdCBubG1fYXJncyAqKTsKLWludAlubG1zdmNfZGVjb2RlX3VubG9ja2FyZ3Moc3RydWN0IHN2Y19ycXN0ICosIHUzMiAqLCBzdHJ1Y3QgbmxtX2FyZ3MgKik7Ci1pbnQJbmxtc3ZjX2VuY29kZV9yZXMoc3RydWN0IHN2Y19ycXN0ICosIHUzMiAqLCBzdHJ1Y3QgbmxtX3JlcyAqKTsKLWludAlubG1zdmNfZGVjb2RlX3JlcyhzdHJ1Y3Qgc3ZjX3Jxc3QgKiwgdTMyICosIHN0cnVjdCBubG1fcmVzICopOwotaW50CW5sbXN2Y19lbmNvZGVfdm9pZChzdHJ1Y3Qgc3ZjX3Jxc3QgKiwgdTMyICosIHZvaWQgKik7Ci1pbnQJbmxtc3ZjX2RlY29kZV92b2lkKHN0cnVjdCBzdmNfcnFzdCAqLCB1MzIgKiwgdm9pZCAqKTsKLWludAlubG1zdmNfZGVjb2RlX3NoYXJlYXJncyhzdHJ1Y3Qgc3ZjX3Jxc3QgKiwgdTMyICosIHN0cnVjdCBubG1fYXJncyAqKTsKLWludAlubG1zdmNfZW5jb2RlX3NoYXJlcmVzKHN0cnVjdCBzdmNfcnFzdCAqLCB1MzIgKiwgc3RydWN0IG5sbV9yZXMgKik7Ci1pbnQJbmxtc3ZjX2RlY29kZV9ub3RpZnkoc3RydWN0IHN2Y19ycXN0ICosIHUzMiAqLCBzdHJ1Y3QgbmxtX2FyZ3MgKik7Ci1pbnQJbmxtc3ZjX2RlY29kZV9yZWJvb3Qoc3RydWN0IHN2Y19ycXN0ICosIHUzMiAqLCBzdHJ1Y3QgbmxtX3JlYm9vdCAqKTsKK2ludAlubG1zdmNfZGVjb2RlX3Rlc3RhcmdzKHN0cnVjdCBzdmNfcnFzdCAqLCBfX2JlMzIgKiwgc3RydWN0IG5sbV9hcmdzICopOworaW50CW5sbXN2Y19lbmNvZGVfdGVzdHJlcyhzdHJ1Y3Qgc3ZjX3Jxc3QgKiwgX19iZTMyICosIHN0cnVjdCBubG1fcmVzICopOworaW50CW5sbXN2Y19kZWNvZGVfbG9ja2FyZ3Moc3RydWN0IHN2Y19ycXN0ICosIF9fYmUzMiAqLCBzdHJ1Y3QgbmxtX2FyZ3MgKik7CitpbnQJbmxtc3ZjX2RlY29kZV9jYW5jYXJncyhzdHJ1Y3Qgc3ZjX3Jxc3QgKiwgX19iZTMyICosIHN0cnVjdCBubG1fYXJncyAqKTsKK2ludAlubG1zdmNfZGVjb2RlX3VubG9ja2FyZ3Moc3RydWN0IHN2Y19ycXN0ICosIF9fYmUzMiAqLCBzdHJ1Y3QgbmxtX2FyZ3MgKik7CitpbnQJbmxtc3ZjX2VuY29kZV9yZXMoc3RydWN0IHN2Y19ycXN0ICosIF9fYmUzMiAqLCBzdHJ1Y3QgbmxtX3JlcyAqKTsKK2ludAlubG1zdmNfZGVjb2RlX3JlcyhzdHJ1Y3Qgc3ZjX3Jxc3QgKiwgX19iZTMyICosIHN0cnVjdCBubG1fcmVzICopOworaW50CW5sbXN2Y19lbmNvZGVfdm9pZChzdHJ1Y3Qgc3ZjX3Jxc3QgKiwgX19iZTMyICosIHZvaWQgKik7CitpbnQJbmxtc3ZjX2RlY29kZV92b2lkKHN0cnVjdCBzdmNfcnFzdCAqLCBfX2JlMzIgKiwgdm9pZCAqKTsKK2ludAlubG1zdmNfZGVjb2RlX3NoYXJlYXJncyhzdHJ1Y3Qgc3ZjX3Jxc3QgKiwgX19iZTMyICosIHN0cnVjdCBubG1fYXJncyAqKTsKK2ludAlubG1zdmNfZW5jb2RlX3NoYXJlcmVzKHN0cnVjdCBzdmNfcnFzdCAqLCBfX2JlMzIgKiwgc3RydWN0IG5sbV9yZXMgKik7CitpbnQJbmxtc3ZjX2RlY29kZV9ub3RpZnkoc3RydWN0IHN2Y19ycXN0ICosIF9fYmUzMiAqLCBzdHJ1Y3QgbmxtX2FyZ3MgKik7CitpbnQJbmxtc3ZjX2RlY29kZV9yZWJvb3Qoc3RydWN0IHN2Y19ycXN0ICosIF9fYmUzMiAqLCBzdHJ1Y3QgbmxtX3JlYm9vdCAqKTsKIC8qCiBpbnQJbmxtY2x0X2VuY29kZV90ZXN0YXJncyhzdHJ1Y3QgcnBjX3Jxc3QgKiwgdTMyICosIHN0cnVjdCBubG1fYXJncyAqKTsKIGludAlubG1jbHRfZW5jb2RlX2xvY2thcmdzKHN0cnVjdCBycGNfcnFzdCAqLCB1MzIgKiwgc3RydWN0IG5sbV9hcmdzICopOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9sb2NrZC94ZHI0LmggYi9pbmNsdWRlL2xpbnV4L2xvY2tkL3hkcjQuaAppbmRleCAzY2MxYWUyLi5kZDEyYjRjIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2xvY2tkL3hkcjQuaAorKysgYi9pbmNsdWRlL2xpbnV4L2xvY2tkL3hkcjQuaApAQCAtMjMsMTkgKzIzLDE5IEBACiAKIAogCi1pbnQJbmxtNHN2Y19kZWNvZGVfdGVzdGFyZ3Moc3RydWN0IHN2Y19ycXN0ICosIHUzMiAqLCBzdHJ1Y3QgbmxtX2FyZ3MgKik7Ci1pbnQJbmxtNHN2Y19lbmNvZGVfdGVzdHJlcyhzdHJ1Y3Qgc3ZjX3Jxc3QgKiwgdTMyICosIHN0cnVjdCBubG1fcmVzICopOwotaW50CW5sbTRzdmNfZGVjb2RlX2xvY2thcmdzKHN0cnVjdCBzdmNfcnFzdCAqLCB1MzIgKiwgc3RydWN0IG5sbV9hcmdzICopOwotaW50CW5sbTRzdmNfZGVjb2RlX2NhbmNhcmdzKHN0cnVjdCBzdmNfcnFzdCAqLCB1MzIgKiwgc3RydWN0IG5sbV9hcmdzICopOwotaW50CW5sbTRzdmNfZGVjb2RlX3VubG9ja2FyZ3Moc3RydWN0IHN2Y19ycXN0ICosIHUzMiAqLCBzdHJ1Y3QgbmxtX2FyZ3MgKik7Ci1pbnQJbmxtNHN2Y19lbmNvZGVfcmVzKHN0cnVjdCBzdmNfcnFzdCAqLCB1MzIgKiwgc3RydWN0IG5sbV9yZXMgKik7Ci1pbnQJbmxtNHN2Y19kZWNvZGVfcmVzKHN0cnVjdCBzdmNfcnFzdCAqLCB1MzIgKiwgc3RydWN0IG5sbV9yZXMgKik7Ci1pbnQJbmxtNHN2Y19lbmNvZGVfdm9pZChzdHJ1Y3Qgc3ZjX3Jxc3QgKiwgdTMyICosIHZvaWQgKik7Ci1pbnQJbmxtNHN2Y19kZWNvZGVfdm9pZChzdHJ1Y3Qgc3ZjX3Jxc3QgKiwgdTMyICosIHZvaWQgKik7Ci1pbnQJbmxtNHN2Y19kZWNvZGVfc2hhcmVhcmdzKHN0cnVjdCBzdmNfcnFzdCAqLCB1MzIgKiwgc3RydWN0IG5sbV9hcmdzICopOwotaW50CW5sbTRzdmNfZW5jb2RlX3NoYXJlcmVzKHN0cnVjdCBzdmNfcnFzdCAqLCB1MzIgKiwgc3RydWN0IG5sbV9yZXMgKik7Ci1pbnQJbmxtNHN2Y19kZWNvZGVfbm90aWZ5KHN0cnVjdCBzdmNfcnFzdCAqLCB1MzIgKiwgc3RydWN0IG5sbV9hcmdzICopOwotaW50CW5sbTRzdmNfZGVjb2RlX3JlYm9vdChzdHJ1Y3Qgc3ZjX3Jxc3QgKiwgdTMyICosIHN0cnVjdCBubG1fcmVib290ICopOworaW50CW5sbTRzdmNfZGVjb2RlX3Rlc3RhcmdzKHN0cnVjdCBzdmNfcnFzdCAqLCBfX2JlMzIgKiwgc3RydWN0IG5sbV9hcmdzICopOworaW50CW5sbTRzdmNfZW5jb2RlX3Rlc3RyZXMoc3RydWN0IHN2Y19ycXN0ICosIF9fYmUzMiAqLCBzdHJ1Y3QgbmxtX3JlcyAqKTsKK2ludAlubG00c3ZjX2RlY29kZV9sb2NrYXJncyhzdHJ1Y3Qgc3ZjX3Jxc3QgKiwgX19iZTMyICosIHN0cnVjdCBubG1fYXJncyAqKTsKK2ludAlubG00c3ZjX2RlY29kZV9jYW5jYXJncyhzdHJ1Y3Qgc3ZjX3Jxc3QgKiwgX19iZTMyICosIHN0cnVjdCBubG1fYXJncyAqKTsKK2ludAlubG00c3ZjX2RlY29kZV91bmxvY2thcmdzKHN0cnVjdCBzdmNfcnFzdCAqLCBfX2JlMzIgKiwgc3RydWN0IG5sbV9hcmdzICopOworaW50CW5sbTRzdmNfZW5jb2RlX3JlcyhzdHJ1Y3Qgc3ZjX3Jxc3QgKiwgX19iZTMyICosIHN0cnVjdCBubG1fcmVzICopOworaW50CW5sbTRzdmNfZGVjb2RlX3JlcyhzdHJ1Y3Qgc3ZjX3Jxc3QgKiwgX19iZTMyICosIHN0cnVjdCBubG1fcmVzICopOworaW50CW5sbTRzdmNfZW5jb2RlX3ZvaWQoc3RydWN0IHN2Y19ycXN0ICosIF9fYmUzMiAqLCB2b2lkICopOworaW50CW5sbTRzdmNfZGVjb2RlX3ZvaWQoc3RydWN0IHN2Y19ycXN0ICosIF9fYmUzMiAqLCB2b2lkICopOworaW50CW5sbTRzdmNfZGVjb2RlX3NoYXJlYXJncyhzdHJ1Y3Qgc3ZjX3Jxc3QgKiwgX19iZTMyICosIHN0cnVjdCBubG1fYXJncyAqKTsKK2ludAlubG00c3ZjX2VuY29kZV9zaGFyZXJlcyhzdHJ1Y3Qgc3ZjX3Jxc3QgKiwgX19iZTMyICosIHN0cnVjdCBubG1fcmVzICopOworaW50CW5sbTRzdmNfZGVjb2RlX25vdGlmeShzdHJ1Y3Qgc3ZjX3Jxc3QgKiwgX19iZTMyICosIHN0cnVjdCBubG1fYXJncyAqKTsKK2ludAlubG00c3ZjX2RlY29kZV9yZWJvb3Qoc3RydWN0IHN2Y19ycXN0ICosIF9fYmUzMiAqLCBzdHJ1Y3QgbmxtX3JlYm9vdCAqKTsKIC8qCiBpbnQJbmxtY2x0X2VuY29kZV90ZXN0YXJncyhzdHJ1Y3QgcnBjX3Jxc3QgKiwgdTMyICosIHN0cnVjdCBubG1fYXJncyAqKTsKIGludAlubG1jbHRfZW5jb2RlX2xvY2thcmdzKHN0cnVjdCBycGNfcnFzdCAqLCB1MzIgKiwgc3RydWN0IG5sbV9hcmdzICopOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9sb2NrZGVwLmggYi9pbmNsdWRlL2xpbnV4L2xvY2tkZXAuaAppbmRleCAxMzE0Y2EwLi44MTlmMDhmIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2xvY2tkZXAuaAorKysgYi9pbmNsdWRlL2xpbnV4L2xvY2tkZXAuaApAQCAtMjAyLDcgKzIwMiw3IEBACiAgKi8KIAogZXh0ZXJuIHZvaWQgbG9ja2RlcF9pbml0X21hcChzdHJ1Y3QgbG9ja2RlcF9tYXAgKmxvY2ssIGNvbnN0IGNoYXIgKm5hbWUsCi0JCQkgICAgIHN0cnVjdCBsb2NrX2NsYXNzX2tleSAqa2V5KTsKKwkJCSAgICAgc3RydWN0IGxvY2tfY2xhc3Nfa2V5ICprZXksIGludCBzdWJjbGFzcyk7CiAKIC8qCiAgKiBSZWluaXRpYWxpemUgYSBsb2NrIGtleSAtIGZvciBjYXNlcyB3aGVyZSB0aGVyZSBpcyBzcGVjaWFsIGxvY2tpbmcgb3IKQEAgLTIxMSw5ICsyMTEsMTQgQEAKICAqIG9yIHRoZXkgYXJlIHRvbyBuYXJyb3cgKHRoZXkgc3VmZmVyIGZyb20gYSBmYWxzZSBjbGFzcy1zcGxpdCk6CiAgKi8KICNkZWZpbmUgbG9ja2RlcF9zZXRfY2xhc3MobG9jaywga2V5KSBcCi0JCWxvY2tkZXBfaW5pdF9tYXAoJihsb2NrKS0+ZGVwX21hcCwgI2tleSwga2V5KQorCQlsb2NrZGVwX2luaXRfbWFwKCYobG9jayktPmRlcF9tYXAsICNrZXksIGtleSwgMCkKICNkZWZpbmUgbG9ja2RlcF9zZXRfY2xhc3NfYW5kX25hbWUobG9jaywga2V5LCBuYW1lKSBcCi0JCWxvY2tkZXBfaW5pdF9tYXAoJihsb2NrKS0+ZGVwX21hcCwgbmFtZSwga2V5KQorCQlsb2NrZGVwX2luaXRfbWFwKCYobG9jayktPmRlcF9tYXAsIG5hbWUsIGtleSwgMCkKKyNkZWZpbmUgbG9ja2RlcF9zZXRfY2xhc3NfYW5kX3N1YmNsYXNzKGxvY2ssIGtleSwgc3ViKSBcCisJCWxvY2tkZXBfaW5pdF9tYXAoJihsb2NrKS0+ZGVwX21hcCwgI2tleSwga2V5LCBzdWIpCisjZGVmaW5lIGxvY2tkZXBfc2V0X3N1YmNsYXNzKGxvY2ssIHN1YikJXAorCQlsb2NrZGVwX2luaXRfbWFwKCYobG9jayktPmRlcF9tYXAsICNsb2NrLCBcCisJCQkJIChsb2NrKS0+ZGVwX21hcC5rZXksIHN1YikKIAogLyoKICAqIEFjcXVpcmUgYSBsb2NrLgpAQCAtMjU3LDEwICsyNjIsMTQgQEAKICMgZGVmaW5lIGxvY2tfcmVsZWFzZShsLCBuLCBpKQkJCWRvIHsgfSB3aGlsZSAoMCkKICMgZGVmaW5lIGxvY2tkZXBfaW5pdCgpCQkJCWRvIHsgfSB3aGlsZSAoMCkKICMgZGVmaW5lIGxvY2tkZXBfaW5mbygpCQkJCWRvIHsgfSB3aGlsZSAoMCkKLSMgZGVmaW5lIGxvY2tkZXBfaW5pdF9tYXAobG9jaywgbmFtZSwga2V5KQlkbyB7ICh2b2lkKShrZXkpOyB9IHdoaWxlICgwKQorIyBkZWZpbmUgbG9ja2RlcF9pbml0X21hcChsb2NrLCBuYW1lLCBrZXksIHN1YikJZG8geyAodm9pZCkoa2V5KTsgfSB3aGlsZSAoMCkKICMgZGVmaW5lIGxvY2tkZXBfc2V0X2NsYXNzKGxvY2ssIGtleSkJCWRvIHsgKHZvaWQpKGtleSk7IH0gd2hpbGUgKDApCiAjIGRlZmluZSBsb2NrZGVwX3NldF9jbGFzc19hbmRfbmFtZShsb2NrLCBrZXksIG5hbWUpIFwKIAkJZG8geyAodm9pZCkoa2V5KTsgfSB3aGlsZSAoMCkKKyNkZWZpbmUgbG9ja2RlcF9zZXRfY2xhc3NfYW5kX3N1YmNsYXNzKGxvY2ssIGtleSwgc3ViKSBcCisJCWRvIHsgKHZvaWQpKGtleSk7IH0gd2hpbGUgKDApCisjZGVmaW5lIGxvY2tkZXBfc2V0X3N1YmNsYXNzKGxvY2ssIHN1YikJCWRvIHsgfSB3aGlsZSAoMCkKKwogIyBkZWZpbmUgSU5JVF9MT0NLREVQCiAjIGRlZmluZSBsb2NrZGVwX3Jlc2V0KCkJCWRvIHsgZGVidWdfbG9ja3MgPSAxOyB9IHdoaWxlICgwKQogIyBkZWZpbmUgbG9ja2RlcF9mcmVlX2tleV9yYW5nZShzdGFydCwgc2l6ZSkJZG8geyB9IHdoaWxlICgwKQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9tYWdpYy5oIGIvaW5jbHVkZS9saW51eC9tYWdpYy5oCmluZGV4IDIyMDM2ZGQuLjE1NmM0MGYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbWFnaWMuaAorKysgYi9pbmNsdWRlL2xpbnV4L21hZ2ljLmgKQEAgLTgsNiArOCw3IEBACiAjZGVmaW5lIEVGU19TVVBFUl9NQUdJQwkJMHg0MTRBNTMKICNkZWZpbmUgRVhUMl9TVVBFUl9NQUdJQwkweEVGNTMKICNkZWZpbmUgRVhUM19TVVBFUl9NQUdJQwkweEVGNTMKKyNkZWZpbmUgRVhUNF9TVVBFUl9NQUdJQwkweEVGNTMKICNkZWZpbmUgSFBGU19TVVBFUl9NQUdJQwkweGY5OTVlODQ5CiAjZGVmaW5lIElTT0ZTX1NVUEVSX01BR0lDCTB4OTY2MAogI2RlZmluZSBKRkZTMl9TVVBFUl9NQUdJQwkweDcyYjYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbWVtcG9saWN5LmggYi9pbmNsdWRlL2xpbnV4L21lbXBvbGljeS5oCmluZGV4IDA5ZjBmNTcuLmRhYWJiM2EgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbWVtcG9saWN5LmgKKysrIGIvaW5jbHVkZS9saW51eC9tZW1wb2xpY3kuaApAQCAtMTUwLDcgKzE1MCw3IEBACiBleHRlcm4gdm9pZCBtcG9sX2ZpeF9mb3JrX2NoaWxkX2ZsYWcoc3RydWN0IHRhc2tfc3RydWN0ICpwKTsKICNkZWZpbmUgc2V0X2NwdXNldF9iZWluZ19yZWJvdW5kKHgpIChjcHVzZXRfYmVpbmdfcmVib3VuZCA9ICh4KSkKIAotI2lmZGVmIENPTkZJR19DUFVTRVQKKyNpZmRlZiBDT05GSUdfQ1BVU0VUUwogI2RlZmluZSBjdXJyZW50X2NwdXNldF9pc19iZWluZ19yZWJvdW5kKCkgXAogCQkJCShjcHVzZXRfYmVpbmdfcmVib3VuZCA9PSBjdXJyZW50LT5jcHVzZXQpCiAjZWxzZQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9tbS5oIGIvaW5jbHVkZS9saW51eC9tbS5oCmluZGV4IDI2MTQ2NjIuLmQ1MzhkZTkgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbW0uaAorKysgYi9pbmNsdWRlL2xpbnV4L21tLmgKQEAgLTExMDMsMTIgKzExMDMsNyBAQAogCiAjaWZuZGVmIENPTkZJR19ERUJVR19QQUdFQUxMT0MKIHN0YXRpYyBpbmxpbmUgdm9pZAota2VybmVsX21hcF9wYWdlcyhzdHJ1Y3QgcGFnZSAqcGFnZSwgaW50IG51bXBhZ2VzLCBpbnQgZW5hYmxlKQotewotCWlmICghUGFnZUhpZ2hNZW0ocGFnZSkgJiYgIWVuYWJsZSkKLQkJZGVidWdfY2hlY2tfbm9fbG9ja3NfZnJlZWQocGFnZV9hZGRyZXNzKHBhZ2UpLAotCQkJCQkgICBudW1wYWdlcyAqIFBBR0VfU0laRSk7Ci19CitrZXJuZWxfbWFwX3BhZ2VzKHN0cnVjdCBwYWdlICpwYWdlLCBpbnQgbnVtcGFnZXMsIGludCBlbmFibGUpIHt9CiAjZW5kaWYKIAogZXh0ZXJuIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqZ2V0X2dhdGVfdm1hKHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrKTsKQEAgLTExMjAsOSArMTExNSw2IEBACiAjZGVmaW5lIGluX2dhdGVfYXJlYSh0YXNrLCBhZGRyKSAoeyh2b2lkKXRhc2s7IGluX2dhdGVfYXJlYV9ub190YXNrKGFkZHIpO30pCiAjZW5kaWYJLyogX19IQVZFX0FSQ0hfR0FURV9BUkVBICovCiAKLS8qIC9wcm9jLzxwaWQ+L29vbV9hZGogc2V0IHRvIC0xNyBwcm90ZWN0cyBmcm9tIHRoZSBvb20ta2lsbGVyICovCi0jZGVmaW5lIE9PTV9ESVNBQkxFIC0xNwotCiBpbnQgZHJvcF9jYWNoZXNfc3lzY3RsX2hhbmRsZXIoc3RydWN0IGN0bF90YWJsZSAqLCBpbnQsIHN0cnVjdCBmaWxlICosCiAJCQkJCXZvaWQgX191c2VyICosIHNpemVfdCAqLCBsb2ZmX3QgKik7CiB1bnNpZ25lZCBsb25nIHNocmlua19zbGFiKHVuc2lnbmVkIGxvbmcgc2Nhbm5lZCwgZ2ZwX3QgZ2ZwX21hc2ssCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L21tem9uZS5oIGIvaW5jbHVkZS9saW51eC9tbXpvbmUuaAppbmRleCA1OTg1NWI4Li5lMDY2ODNlIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L21tem9uZS5oCisrKyBiL2luY2x1ZGUvbGludXgvbW16b25lLmgKQEAgLTIxOCwxMyArMjE4LDkgQEAKIAkgKiB1bmRlciAtIGl0IGRyaXZlcyB0aGUgc3dhcHBpbmVzcyBkZWNpc2lvbjogd2hldGhlciB0byB1bm1hcCBtYXBwZWQKIAkgKiBwYWdlcy4KIAkgKgotCSAqIHRlbXBfcHJpb3JpdHkgaXMgdXNlZCB0byByZW1lbWJlciB0aGUgc2Nhbm5pbmcgcHJpb3JpdHkgYXQgd2hpY2gKLQkgKiB0aGlzIHpvbmUgd2FzIHN1Y2Nlc3NmdWxseSByZWZpbGxlZCB0byBmcmVlX3BhZ2VzID09IHBhZ2VzX2hpZ2guCi0JICoKLQkgKiBBY2Nlc3MgdG8gYm90aCB0aGVzZSBmaWVsZHMgaXMgcXVpdGUgcmFjeSBldmVuIG9uIHVuaXByb2Nlc3Nvci4gIEJ1dAorCSAqIEFjY2VzcyB0byBib3RoIHRoaXMgZmllbGQgaXMgcXVpdGUgcmFjeSBldmVuIG9uIHVuaXByb2Nlc3Nvci4gIEJ1dAogCSAqIGl0IGlzIGV4cGVjdGVkIHRvIGF2ZXJhZ2Ugb3V0IE9LLgogCSAqLwotCWludCB0ZW1wX3ByaW9yaXR5OwogCWludCBwcmV2X3ByaW9yaXR5OwogCiAKQEAgLTY3NCw2ICs2NzAsMTIgQEAKICNkZWZpbmUgc3BhcnNlX2luZGV4X2luaXQoX3NlYywgX25pZCkgIGRvIHt9IHdoaWxlICgwKQogI2VuZGlmIC8qIENPTkZJR19TUEFSU0VNRU0gKi8KIAorI2lmZGVmIENPTkZJR19OT0RFU19TUEFOX09USEVSX05PREVTCisjZGVmaW5lIGVhcmx5X3Bmbl9pbl9uaWQocGZuLCBuaWQpCShlYXJseV9wZm5fdG9fbmlkKHBmbikgPT0gKG5pZCkpCisjZWxzZQorI2RlZmluZSBlYXJseV9wZm5faW5fbmlkKHBmbiwgbmlkKQkoMSkKKyNlbmRpZgorCiAjaWZuZGVmIGVhcmx5X3Bmbl92YWxpZAogI2RlZmluZSBlYXJseV9wZm5fdmFsaWQocGZuKQkoMSkKICNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9tb2R1bGUuaCBiL2luY2x1ZGUvbGludXgvbW9kdWxlLmgKaW5kZXggNGIyZDgwOS4uZDFkMDBjZSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9tb2R1bGUuaAorKysgYi9pbmNsdWRlL2xpbnV4L21vZHVsZS5oCkBAIC0zMTcsOSArMzE3LDYgQEAKIAkvKiBBbSBJIHVuc2FmZSB0byB1bmxvYWQ/ICovCiAJaW50IHVuc2FmZTsKIAotCS8qIEFtIEkgR1BMLWNvbXBhdGlibGUgKi8KLQlpbnQgbGljZW5zZV9ncGxvazsKLQogCXVuc2lnbmVkIGludCB0YWludHM7CS8qIHNhbWUgYml0cyBhcyBrZXJuZWw6dGFpbnRlZCAqLwogCiAjaWZkZWYgQ09ORklHX01PRFVMRV9VTkxPQUQKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbXNkb3NfZnMuaCBiL2luY2x1ZGUvbGludXgvbXNkb3NfZnMuaAppbmRleCBjZTZjODU4Li4yNGE5ZWYxIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L21zZG9zX2ZzLmgKKysrIGIvaW5jbHVkZS9saW51eC9tc2Rvc19mcy5oCkBAIC00MDIsNiArNDAyLDggQEAKIGV4dGVybiBzdHJ1Y3QgaW5vZGVfb3BlcmF0aW9ucyBmYXRfZmlsZV9pbm9kZV9vcGVyYXRpb25zOwogZXh0ZXJuIGludCBmYXRfbm90aWZ5X2NoYW5nZShzdHJ1Y3QgZGVudHJ5ICogZGVudHJ5LCBzdHJ1Y3QgaWF0dHIgKiBhdHRyKTsKIGV4dGVybiB2b2lkIGZhdF90cnVuY2F0ZShzdHJ1Y3QgaW5vZGUgKmlub2RlKTsKK2V4dGVybiBpbnQgZmF0X2dldGF0dHIoc3RydWN0IHZmc21vdW50ICptbnQsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSwKKwkJICAgICAgIHN0cnVjdCBrc3RhdCAqc3RhdCk7CiAKIC8qIGZhdC9pbm9kZS5jICovCiBleHRlcm4gdm9pZCBmYXRfYXR0YWNoKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGxvZmZfdCBpX3Bvcyk7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L210ZC9uYW5kLmggYi9pbmNsdWRlL2xpbnV4L210ZC9uYW5kLmgKaW5kZXggNzA0MjBiYi4uOGIzZWY0MSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9tdGQvbmFuZC5oCisrKyBiL2luY2x1ZGUvbGludXgvbXRkL25hbmQuaApAQCAtMzU1LDcgKzM1NSw3IEBACiAgKiBAcHJpdjoJCVtPUFRJT05BTF0gcG9pbnRlciB0byBwcml2YXRlIGNoaXAgZGF0ZQogICogQGVycnN0YXQ6CQlbT1BUSU9OQUxdIGhhcmR3YXJlIHNwZWNpZmljIGZ1bmN0aW9uIHRvIHBlcmZvcm0gYWRkaXRpb25hbCBlcnJvciBzdGF0dXMgY2hlY2tzCiAgKgkJCShkZXRlcm1pbmUgaWYgZXJyb3JzIGFyZSBjb3JyZWN0YWJsZSkKLSAqIEB3cml0ZV9wYWdlCQlbUkVQTEFDRUFCTEVdIEhpZ2gtbGV2ZWwgcGFnZSB3cml0ZSBmdW5jdGlvbgorICogQHdyaXRlX3BhZ2U6CQlbUkVQTEFDRUFCTEVdIEhpZ2gtbGV2ZWwgcGFnZSB3cml0ZSBmdW5jdGlvbgogICovCiAKIHN0cnVjdCBuYW5kX2NoaXAgewpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9uYmQuaCBiL2luY2x1ZGUvbGludXgvbmJkLmgKaW5kZXggZTcxMmU3ZC4uZDZiNmRjMCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9uYmQuaAorKysgYi9pbmNsdWRlL2xpbnV4L25iZC5oCkBAIC0xNSw2ICsxNSw4IEBACiAjaWZuZGVmIExJTlVYX05CRF9ICiAjZGVmaW5lIExJTlVYX05CRF9ICiAKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCiAjZGVmaW5lIE5CRF9TRVRfU09DSwlfSU8oIDB4YWIsIDAgKQogI2RlZmluZSBOQkRfU0VUX0JMS1NJWkUJX0lPKCAweGFiLCAxICkKICNkZWZpbmUgTkJEX1NFVF9TSVpFCV9JTyggMHhhYiwgMiApCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L25ldC5oIGIvaW5jbHVkZS9saW51eC9uZXQuaAppbmRleCBjMjU3ZjcxLi4xNWM3MzNiIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L25ldC5oCisrKyBiL2luY2x1ZGUvbGludXgvbmV0LmgKQEAgLTE5LDYgKzE5LDcgQEAKICNkZWZpbmUgX0xJTlVYX05FVF9ICiAKICNpbmNsdWRlIDxsaW51eC93YWl0Lmg+CisjaW5jbHVkZSA8bGludXgvcmFuZG9tLmg+CiAjaW5jbHVkZSA8YXNtL3NvY2tldC5oPgogCiBzdHJ1Y3QgcG9sbF90YWJsZV9zdHJ1Y3Q7CkBAIC0xOTMsOSArMTk0LDkgQEAKIGV4dGVybiBzdHJ1Y3Qgc29ja2V0ICpzb2NrZmRfbG9va3VwKGludCBmZCwgaW50ICplcnIpOwogI2RlZmluZQkJICAgICBzb2NrZmRfcHV0KHNvY2spIGZwdXQoc29jay0+ZmlsZSkKIGV4dGVybiBpbnQJICAgICBuZXRfcmF0ZWxpbWl0KHZvaWQpOwotZXh0ZXJuIHVuc2lnbmVkIGxvbmcgbmV0X3JhbmRvbSh2b2lkKTsKLWV4dGVybiB2b2lkCSAgICAgbmV0X3NyYW5kb20odW5zaWduZWQgbG9uZyk7Ci1leHRlcm4gdm9pZAkgICAgIG5ldF9yYW5kb21faW5pdCh2b2lkKTsKKworI2RlZmluZSBuZXRfcmFuZG9tKCkJCXJhbmRvbTMyKCkKKyNkZWZpbmUgbmV0X3NyYW5kb20oc2VlZCkJc3JhbmRvbTMyKHNlZWQpCiAKIGV4dGVybiBpbnQgICAJICAgICBrZXJuZWxfc2VuZG1zZyhzdHJ1Y3Qgc29ja2V0ICpzb2NrLCBzdHJ1Y3QgbXNnaGRyICptc2csCiAJCQkJICAgIHN0cnVjdCBrdmVjICp2ZWMsIHNpemVfdCBudW0sIHNpemVfdCBsZW4pOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIveF90YWJsZXMuaCBiL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL3hfdGFibGVzLmgKaW5kZXggMDQzMTlhNy4uMDIyZWRmYSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIveF90YWJsZXMuaAorKysgYi9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci94X3RhYmxlcy5oCkBAIC05NiwyMiArOTYsNiBAQAogLyogRXJyb3IgdmVyZGljdC4gKi8KICNkZWZpbmUgWFRfRVJST1JfVEFSR0VUICJFUlJPUiIKIAotLyoKLSAqIE5ldyBJUCBmaXJld2FsbCBvcHRpb25zIGZvciBbZ3NdZXRzb2Nrb3B0IGF0IHRoZSBSQVcgSVAgbGV2ZWwuCi0gKiBVbmxpa2UgQlNEIExpbnV4IGluaGVyaXRzIElQIG9wdGlvbnMgc28geW91IGRvbid0IGhhdmUgdG8gdXNlIGEgcmF3Ci0gKiBzb2NrZXQgZm9yIHRoaXMuIEluc3RlYWQgd2UgY2hlY2sgcmlnaHRzIGluIHRoZSBjYWxscy4gKi8KLSNkZWZpbmUgWFRfQkFTRV9DVEwJCTY0CS8qIGJhc2UgZm9yIGZpcmV3YWxsIHNvY2tldCBvcHRpb25zICovCi0KLSNkZWZpbmUgWFRfU09fU0VUX1JFUExBQ0UJKFhUX0JBU0VfQ1RMKQotI2RlZmluZSBYVF9TT19TRVRfQUREX0NPVU5URVJTCShYVF9CQVNFX0NUTCArIDEpCi0jZGVmaW5lIFhUX1NPX1NFVF9NQVgJCVhUX1NPX1NFVF9BRERfQ09VTlRFUlMKLQotI2RlZmluZSBYVF9TT19HRVRfSU5GTwkJCShYVF9CQVNFX0NUTCkKLSNkZWZpbmUgWFRfU09fR0VUX0VOVFJJRVMJCShYVF9CQVNFX0NUTCArIDEpCi0jZGVmaW5lIFhUX1NPX0dFVF9SRVZJU0lPTl9NQVRDSAkoWFRfQkFTRV9DVEwgKyAyKQotI2RlZmluZSBYVF9TT19HRVRfUkVWSVNJT05fVEFSR0VUCShYVF9CQVNFX0NUTCArIDMpCi0jZGVmaW5lIFhUX1NPX0dFVF9NQVgJCQlYVF9TT19HRVRfUkVWSVNJT05fVEFSR0VUCi0KICNkZWZpbmUgU0VUX0NPVU5URVIoYyxiLHApIGRvIHsgKGMpLmJjbnQgPSAoYik7IChjKS5wY250ID0gKHApOyB9IHdoaWxlKDApCiAjZGVmaW5lIEFERF9DT1VOVEVSKGMsYixwKSBkbyB7IChjKS5iY250ICs9IChiKTsgKGMpLnBjbnQgKz0gKHApOyB9IHdoaWxlKDApCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2FycC9hcnBfdGFibGVzLmggYi9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9hcnAvYXJwX3RhYmxlcy5oCmluZGV4IDQ0ZTM5YjYuLjBiZTIzNTQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2FycC9hcnBfdGFibGVzLmgKKysrIGIvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfYXJwL2FycF90YWJsZXMuaApAQCAtMTEyLDE5ICsxMTIsMjAgQEAKICAqIE5ldyBJUCBmaXJld2FsbCBvcHRpb25zIGZvciBbZ3NdZXRzb2Nrb3B0IGF0IHRoZSBSQVcgSVAgbGV2ZWwuCiAgKiBVbmxpa2UgQlNEIExpbnV4IGluaGVyaXRzIElQIG9wdGlvbnMgc28geW91IGRvbid0IGhhdmUgdG8gdXNlIGEgcmF3CiAgKiBzb2NrZXQgZm9yIHRoaXMuIEluc3RlYWQgd2UgY2hlY2sgcmlnaHRzIGluIHRoZSBjYWxscy4KKyAqCisgKiBBVFRFTlRJT046IGNoZWNrIGxpbnV4L2luLmggYmVmb3JlIGFkZGluZyBuZXcgbnVtYmVyIGhlcmUuCiAgKi8KLSNkZWZpbmUgQVJQVF9DVExfT0ZGU0VUCQkzMgotI2RlZmluZSBBUlBUX0JBU0VfQ1RMCQkoWFRfQkFTRV9DVEwrQVJQVF9DVExfT0ZGU0VUKQorI2RlZmluZSBBUlBUX0JBU0VfQ1RMCQk5NgogCi0jZGVmaW5lIEFSUFRfU09fU0VUX1JFUExBQ0UJCShYVF9TT19TRVRfUkVQTEFDRStBUlBUX0NUTF9PRkZTRVQpCi0jZGVmaW5lIEFSUFRfU09fU0VUX0FERF9DT1VOVEVSUwkoWFRfU09fU0VUX0FERF9DT1VOVEVSUytBUlBUX0NUTF9PRkZTRVQpCi0jZGVmaW5lIEFSUFRfU09fU0VUX01BWAkJCShYVF9TT19TRVRfTUFYK0FSUFRfQ1RMX09GRlNFVCkKKyNkZWZpbmUgQVJQVF9TT19TRVRfUkVQTEFDRQkJKEFSUFRfQkFTRV9DVEwpCisjZGVmaW5lIEFSUFRfU09fU0VUX0FERF9DT1VOVEVSUwkoQVJQVF9CQVNFX0NUTCArIDEpCisjZGVmaW5lIEFSUFRfU09fU0VUX01BWAkJCUFSUFRfU09fU0VUX0FERF9DT1VOVEVSUwogCi0jZGVmaW5lIEFSUFRfU09fR0VUX0lORk8JCShYVF9TT19HRVRfSU5GTytBUlBUX0NUTF9PRkZTRVQpCi0jZGVmaW5lIEFSUFRfU09fR0VUX0VOVFJJRVMJCShYVF9TT19HRVRfRU5UUklFUytBUlBUX0NUTF9PRkZTRVQpCi0vKiAjZGVmaW5lIEFSUFRfU09fR0VUX1JFVklTSU9OX01BVENICVhUX1NPX0dFVF9SRVZJU0lPTl9NQVRDSCAgKi8KLSNkZWZpbmUgQVJQVF9TT19HRVRfUkVWSVNJT05fVEFSR0VUCShYVF9TT19HRVRfUkVWSVNJT05fVEFSR0VUK0FSUFRfQ1RMX09GRlNFVCkKLSNkZWZpbmUgQVJQVF9TT19HRVRfTUFYCQkJKFhUX1NPX0dFVF9SRVZJU0lPTl9UQVJHRVQrQVJQVF9DVExfT0ZGU0VUKQorI2RlZmluZSBBUlBUX1NPX0dFVF9JTkZPCQkoQVJQVF9CQVNFX0NUTCkKKyNkZWZpbmUgQVJQVF9TT19HRVRfRU5UUklFUwkJKEFSUFRfQkFTRV9DVEwgKyAxKQorLyogI2RlZmluZSBBUlBUX1NPX0dFVF9SRVZJU0lPTl9NQVRDSAkoQVBSVF9CQVNFX0NUTCArIDIpICovCisjZGVmaW5lIEFSUFRfU09fR0VUX1JFVklTSU9OX1RBUkdFVAkoQVJQVF9CQVNFX0NUTCArIDMpCisjZGVmaW5lIEFSUFRfU09fR0VUX01BWAkJCShBUlBUX1NPX0dFVF9SRVZJU0lPTl9UQVJHRVQpCiAKIC8qIENPTlRJTlVFIHZlcmRpY3QgZm9yIHRhcmdldHMgKi8KICNkZWZpbmUgQVJQVF9DT05USU5VRSBYVF9DT05USU5VRQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2NC9pcF90YWJsZXMuaCBiL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjQvaXBfdGFibGVzLmgKaW5kZXggYTUzNmJiZC4uNGYwNmRhZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2NC9pcF90YWJsZXMuaAorKysgYi9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY0L2lwX3RhYmxlcy5oCkBAIC0xMDEsMTggKzEwMSwyMSBAQAogLyoKICAqIE5ldyBJUCBmaXJld2FsbCBvcHRpb25zIGZvciBbZ3NdZXRzb2Nrb3B0IGF0IHRoZSBSQVcgSVAgbGV2ZWwuCiAgKiBVbmxpa2UgQlNEIExpbnV4IGluaGVyaXRzIElQIG9wdGlvbnMgc28geW91IGRvbid0IGhhdmUgdG8gdXNlIGEgcmF3Ci0gKiBzb2NrZXQgZm9yIHRoaXMuIEluc3RlYWQgd2UgY2hlY2sgcmlnaHRzIGluIHRoZSBjYWxscy4gKi8KLSNkZWZpbmUgSVBUX0JBU0VfQ1RMCQlYVF9CQVNFX0NUTAorICogc29ja2V0IGZvciB0aGlzLiBJbnN0ZWFkIHdlIGNoZWNrIHJpZ2h0cyBpbiB0aGUgY2FsbHMuCisgKgorICogQVRURU5USU9OOiBjaGVjayBsaW51eC9pbi5oIGJlZm9yZSBhZGRpbmcgbmV3IG51bWJlciBoZXJlLgorICovCisjZGVmaW5lIElQVF9CQVNFX0NUTAkJNjQKIAotI2RlZmluZSBJUFRfU09fU0VUX1JFUExBQ0UJWFRfU09fU0VUX1JFUExBQ0UKLSNkZWZpbmUgSVBUX1NPX1NFVF9BRERfQ09VTlRFUlMJWFRfU09fU0VUX0FERF9DT1VOVEVSUwotI2RlZmluZSBJUFRfU09fU0VUX01BWAkJWFRfU09fU0VUX01BWAorI2RlZmluZSBJUFRfU09fU0VUX1JFUExBQ0UJKElQVF9CQVNFX0NUTCkKKyNkZWZpbmUgSVBUX1NPX1NFVF9BRERfQ09VTlRFUlMJKElQVF9CQVNFX0NUTCArIDEpCisjZGVmaW5lIElQVF9TT19TRVRfTUFYCQlJUFRfU09fU0VUX0FERF9DT1VOVEVSUwogCi0jZGVmaW5lIElQVF9TT19HRVRfSU5GTwkJCVhUX1NPX0dFVF9JTkZPCi0jZGVmaW5lIElQVF9TT19HRVRfRU5UUklFUwkJWFRfU09fR0VUX0VOVFJJRVMKLSNkZWZpbmUgSVBUX1NPX0dFVF9SRVZJU0lPTl9NQVRDSAlYVF9TT19HRVRfUkVWSVNJT05fTUFUQ0gKLSNkZWZpbmUgSVBUX1NPX0dFVF9SRVZJU0lPTl9UQVJHRVQJWFRfU09fR0VUX1JFVklTSU9OX1RBUkdFVAotI2RlZmluZSBJUFRfU09fR0VUX01BWAkJCVhUX1NPX0dFVF9SRVZJU0lPTl9UQVJHRVQKKyNkZWZpbmUgSVBUX1NPX0dFVF9JTkZPCQkJKElQVF9CQVNFX0NUTCkKKyNkZWZpbmUgSVBUX1NPX0dFVF9FTlRSSUVTCQkoSVBUX0JBU0VfQ1RMICsgMSkKKyNkZWZpbmUgSVBUX1NPX0dFVF9SRVZJU0lPTl9NQVRDSAkoSVBUX0JBU0VfQ1RMICsgMikKKyNkZWZpbmUgSVBUX1NPX0dFVF9SRVZJU0lPTl9UQVJHRVQJKElQVF9CQVNFX0NUTCArIDMpCisjZGVmaW5lIElQVF9TT19HRVRfTUFYCQkJSVBUX1NPX0dFVF9SRVZJU0lPTl9UQVJHRVQKIAogI2RlZmluZSBJUFRfQ09OVElOVUUgWFRfQ09OVElOVUUKICNkZWZpbmUgSVBUX1JFVFVSTiBYVF9SRVRVUk4KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjYvaXA2X3RhYmxlcy5oIGIvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2Ni9pcDZfdGFibGVzLmgKaW5kZXggZDdhOGU5YzAuLjRhZWQzNDAgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjYvaXA2X3RhYmxlcy5oCisrKyBiL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjYvaXA2X3RhYmxlcy5oCkBAIC0xMDcsMTggKzEwNywyMSBAQAogLyoKICAqIE5ldyBJUCBmaXJld2FsbCBvcHRpb25zIGZvciBbZ3NdZXRzb2Nrb3B0IGF0IHRoZSBSQVcgSVAgbGV2ZWwuCiAgKiBVbmxpa2UgQlNEIExpbnV4IGluaGVyaXRzIElQIG9wdGlvbnMgc28geW91IGRvbid0IGhhdmUgdG8gdXNlCi0gKiBhIHJhdyBzb2NrZXQgZm9yIHRoaXMuIEluc3RlYWQgd2UgY2hlY2sgcmlnaHRzIGluIHRoZSBjYWxscy4gKi8KLSNkZWZpbmUgSVA2VF9CQVNFX0NUTAkJCVhUX0JBU0VfQ1RMCisgKiBhIHJhdyBzb2NrZXQgZm9yIHRoaXMuIEluc3RlYWQgd2UgY2hlY2sgcmlnaHRzIGluIHRoZSBjYWxscy4KKyAqCisgKiBBVFRFTlRJT046IGNoZWNrIGxpbnV4L2luNi5oIGJlZm9yZSBhZGRpbmcgbmV3IG51bWJlciBoZXJlLgorICovCisjZGVmaW5lIElQNlRfQkFTRV9DVEwJCQk2NAogCi0jZGVmaW5lIElQNlRfU09fU0VUX1JFUExBQ0UJCVhUX1NPX1NFVF9SRVBMQUNFCi0jZGVmaW5lIElQNlRfU09fU0VUX0FERF9DT1VOVEVSUwlYVF9TT19TRVRfQUREX0NPVU5URVJTCi0jZGVmaW5lIElQNlRfU09fU0VUX01BWAkJCVhUX1NPX1NFVF9NQVgKKyNkZWZpbmUgSVA2VF9TT19TRVRfUkVQTEFDRQkJKElQNlRfQkFTRV9DVEwpCisjZGVmaW5lIElQNlRfU09fU0VUX0FERF9DT1VOVEVSUwkoSVA2VF9CQVNFX0NUTCArIDEpCisjZGVmaW5lIElQNlRfU09fU0VUX01BWAkJCUlQNlRfU09fU0VUX0FERF9DT1VOVEVSUwogCi0jZGVmaW5lIElQNlRfU09fR0VUX0lORk8JCVhUX1NPX0dFVF9JTkZPCi0jZGVmaW5lIElQNlRfU09fR0VUX0VOVFJJRVMJCVhUX1NPX0dFVF9FTlRSSUVTCi0jZGVmaW5lCUlQNlRfU09fR0VUX1JFVklTSU9OX01BVENICVhUX1NPX0dFVF9SRVZJU0lPTl9NQVRDSAotI2RlZmluZQlJUDZUX1NPX0dFVF9SRVZJU0lPTl9UQVJHRVQJWFRfU09fR0VUX1JFVklTSU9OX1RBUkdFVAotI2RlZmluZSBJUDZUX1NPX0dFVF9NQVgJCQlYVF9TT19HRVRfUkVWSVNJT05fVEFSR0VUCisjZGVmaW5lIElQNlRfU09fR0VUX0lORk8JCShJUDZUX0JBU0VfQ1RMKQorI2RlZmluZSBJUDZUX1NPX0dFVF9FTlRSSUVTCQkoSVA2VF9CQVNFX0NUTCArIDEpCisjZGVmaW5lIElQNlRfU09fR0VUX1JFVklTSU9OX01BVENICShJUDZUX0JBU0VfQ1RMICsgNCkKKyNkZWZpbmUgSVA2VF9TT19HRVRfUkVWSVNJT05fVEFSR0VUCShJUDZUX0JBU0VfQ1RMICsgNSkKKyNkZWZpbmUgSVA2VF9TT19HRVRfTUFYCQkJSVA2VF9TT19HRVRfUkVWSVNJT05fVEFSR0VUCiAKIC8qIENPTlRJTlVFIHZlcmRpY3QgZm9yIHRhcmdldHMgKi8KICNkZWZpbmUgSVA2VF9DT05USU5VRSBYVF9DT05USU5VRQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9uZnNfZnMuaCBiL2luY2x1ZGUvbGludXgvbmZzX2ZzLmgKaW5kZXggNzZmZjU0OC4uNDUyMjhjMSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9uZnNfZnMuaAorKysgYi9pbmNsdWRlL2xpbnV4L25mc19mcy5oCkBAIC0xNTcsNyArMTU3LDcgQEAKIAkgKiBUaGlzIGlzIHRoZSBjb29raWUgdmVyaWZpZXIgdXNlZCBmb3IgTkZTdjMgcmVhZGRpcgogCSAqIG9wZXJhdGlvbnMKIAkgKi8KLQlfX3UzMgkJCWNvb2tpZXZlcmZbMl07CisJX19iZTMyCQkJY29va2lldmVyZlsyXTsKIAogCS8qCiAJICogVGhpcyBpcyB0aGUgbGlzdCBvZiBkaXJ0eSB1bndyaXR0ZW4gcGFnZXMuCkBAIC0yOTAsNiArMjkwLDcgQEAKICAqIGxpbnV4L2ZzL25mcy9pbm9kZS5jCiAgKi8KIGV4dGVybiBpbnQgbmZzX3N5bmNfbWFwcGluZyhzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZyk7CitleHRlcm4gdm9pZCBuZnNfemFwX21hcHBpbmcoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcpOwogZXh0ZXJuIHZvaWQgbmZzX3phcF9jYWNoZXMoc3RydWN0IGlub2RlICopOwogZXh0ZXJuIHN0cnVjdCBpbm9kZSAqbmZzX2ZoZ2V0KHN0cnVjdCBzdXBlcl9ibG9jayAqLCBzdHJ1Y3QgbmZzX2ZoICosCiAJCQkJc3RydWN0IG5mc19mYXR0ciAqKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbmZzX3hkci5oIGIvaW5jbHVkZS9saW51eC9uZnNfeGRyLmgKaW5kZXggZGM1Mzk3ZC4uNzY4YzFhZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9uZnNfeGRyLmgKKysrIGIvaW5jbHVkZS9saW51eC9uZnNfeGRyLmgKQEAgLTI2Niw3ICsyNjYsNyBAQAogCiBzdHJ1Y3QgbmZzX3dyaXRldmVyZiB7CiAJZW51bSBuZnMzX3N0YWJsZV9ob3cJY29tbWl0dGVkOwotCV9fdTMyCQkJdmVyaWZpZXJbMl07CisJX19iZTMyCQkJdmVyaWZpZXJbMl07CiB9OwogCiBzdHJ1Y3QgbmZzX3dyaXRlcmVzIHsKQEAgLTQyMCw3ICs0MjAsNyBAQAogCXVuc2lnbmVkIGludAkJbGVuOwogCXN0cnVjdCBpYXR0ciAqCQlzYXR0cjsKIAllbnVtIG5mczNfY3JlYXRlbW9kZQljcmVhdGVtb2RlOwotCV9fdTMyCQkJdmVyaWZpZXJbMl07CisJX19iZTMyCQkJdmVyaWZpZXJbMl07CiB9OwogCiBzdHJ1Y3QgbmZzM19ta2RpcmFyZ3MgewpAQCAtNDY3LDcgKzQ2Nyw3IEBACiBzdHJ1Y3QgbmZzM19yZWFkZGlyYXJncyB7CiAJc3RydWN0IG5mc19maCAqCQlmaDsKIAlfX3U2NAkJCWNvb2tpZTsKLQlfX3UzMgkJCXZlcmZbMl07CisJX19iZTMyCQkJdmVyZlsyXTsKIAlpbnQJCQlwbHVzOwogCXVuc2lnbmVkIGludCAgICAgICAgICAgIGNvdW50OwogCXN0cnVjdCBwYWdlICoqCQlwYWdlczsKQEAgLTUwMyw3ICs1MDMsNyBAQAogCiBzdHJ1Y3QgbmZzM19yZWFkZGlycmVzIHsKIAlzdHJ1Y3QgbmZzX2ZhdHRyICoJZGlyX2F0dHI7Ci0JX191MzIgKgkJCXZlcmY7CisJX19iZTMyICoJCXZlcmY7CiAJaW50CQkJcGx1czsKIH07CiAKQEAgLTgxMSw3ICs4MTEsNyBAQAogCWludAkoKnBhdGhjb25mKSAoc3RydWN0IG5mc19zZXJ2ZXIgKiwgc3RydWN0IG5mc19maCAqLAogCQkJICAgICBzdHJ1Y3QgbmZzX3BhdGhjb25mICopOwogCWludAkoKnNldF9jYXBhYmlsaXRpZXMpKHN0cnVjdCBuZnNfc2VydmVyICosIHN0cnVjdCBuZnNfZmggKik7Ci0JdTMyICoJKCpkZWNvZGVfZGlyZW50KSh1MzIgKiwgc3RydWN0IG5mc19lbnRyeSAqLCBpbnQgcGx1cyk7CisJX19iZTMyICooKmRlY29kZV9kaXJlbnQpKF9fYmUzMiAqLCBzdHJ1Y3QgbmZzX2VudHJ5ICosIGludCBwbHVzKTsKIAl2b2lkCSgqcmVhZF9zZXR1cCkgICAoc3RydWN0IG5mc19yZWFkX2RhdGEgKik7CiAJaW50CSgqcmVhZF9kb25lKSAgKHN0cnVjdCBycGNfdGFzayAqLCBzdHJ1Y3QgbmZzX3JlYWRfZGF0YSAqKTsKIAl2b2lkCSgqd3JpdGVfc2V0dXApICAoc3RydWN0IG5mc193cml0ZV9kYXRhICosIGludCBob3cpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9uZnNkL2NhY2hlLmggYi9pbmNsdWRlL2xpbnV4L25mc2QvY2FjaGUuaAppbmRleCBjM2EzNTU3Li4wMDc0ODBjIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L25mc2QvY2FjaGUuaAorKysgYi9pbmNsdWRlL2xpbnV4L25mc2QvY2FjaGUuaApAQCAtMjYsMTQgKzI2LDE0IEBACiAJCQkJY190eXBlLAkJLyogc3RhdHVzLCBidWZmZXIgKi8KIAkJCQljX3NlY3VyZSA6IDE7CS8qIHJlcSBjYW1lIGZyb20gcG9ydCA8IDEwMjQgKi8KIAlzdHJ1Y3Qgc29ja2FkZHJfaW4JY19hZGRyOwotCXUzMgkJCWNfeGlkOworCV9fYmUzMgkJCWNfeGlkOwogCXUzMgkJCWNfcHJvdDsKIAl1MzIJCQljX3Byb2M7CiAJdTMyCQkJY192ZXJzOwogCXVuc2lnbmVkIGxvbmcJCWNfdGltZXN0YW1wOwogCXVuaW9uIHsKIAkJc3RydWN0IGt2ZWMJdV92ZWM7Ci0JCXUzMgkJdV9zdGF0dXM7CisJCV9fYmUzMgkJdV9zdGF0dXM7CiAJfQkJCWNfdTsKIH07CiAKQEAgLTc1LDcgKzc1LDcgQEAKIHZvaWQJbmZzZF9jYWNoZV9pbml0KHZvaWQpOwogdm9pZAluZnNkX2NhY2hlX3NodXRkb3duKHZvaWQpOwogaW50CW5mc2RfY2FjaGVfbG9va3VwKHN0cnVjdCBzdmNfcnFzdCAqLCBpbnQpOwotdm9pZAluZnNkX2NhY2hlX3VwZGF0ZShzdHJ1Y3Qgc3ZjX3Jxc3QgKiwgaW50LCB1MzIgKik7Cit2b2lkCW5mc2RfY2FjaGVfdXBkYXRlKHN0cnVjdCBzdmNfcnFzdCAqLCBpbnQsIF9fYmUzMiAqKTsKIAogI2VuZGlmIC8qIF9fS0VSTkVMX18gKi8KICNlbmRpZiAvKiBORlNDQUNIRV9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L25mc2QvZXhwb3J0LmggYi9pbmNsdWRlL2xpbnV4L25mc2QvZXhwb3J0LmgKaW5kZXggNmU3OGVhOS4uMDQ1ZTM4YyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9uZnNkL2V4cG9ydC5oCisrKyBiL2luY2x1ZGUvbGludXgvbmZzZC9leHBvcnQuaApAQCAtMTE3LDggKzExNyw4IEBACiAJCQkJICAgc3RydWN0IGNhY2hlX3JlcSAqcmVxcCk7CiBpbnQJCQlleHBfcm9vdGZoKHN0cnVjdCBhdXRoX2RvbWFpbiAqLCAKIAkJCQkJY2hhciAqcGF0aCwgc3RydWN0IGtuZnNkX2ZoICosIGludCBtYXhzaXplKTsKLWludAkJCWV4cF9wc2V1ZG9yb290KHN0cnVjdCBhdXRoX2RvbWFpbiAqLCBzdHJ1Y3Qgc3ZjX2ZoICpmaHAsIHN0cnVjdCBjYWNoZV9yZXEgKmNyZXEpOwotaW50CQkJbmZzZXJybm8oaW50IGVycm5vKTsKK19fYmUzMgkJCWV4cF9wc2V1ZG9yb290KHN0cnVjdCBhdXRoX2RvbWFpbiAqLCBzdHJ1Y3Qgc3ZjX2ZoICpmaHAsIHN0cnVjdCBjYWNoZV9yZXEgKmNyZXEpOworX19iZTMyCQkJbmZzZXJybm8oaW50IGVycm5vKTsKIAogZXh0ZXJuIHN0cnVjdCBjYWNoZV9kZXRhaWwgc3ZjX2V4cG9ydF9jYWNoZTsKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9uZnNkL25mc2QuaCBiL2luY2x1ZGUvbGludXgvbmZzZC9uZnNkLmgKaW5kZXggZDBkNGFhZS4uZWRiNTRjMyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9uZnNkL25mc2QuaAorKysgYi9pbmNsdWRlL2xpbnV4L25mc2QvbmZzZC5oCkBAIC01MCw3ICs1MCw3IEBACiAgKiBDYWxsYmFjayBmdW5jdGlvbiBmb3IgcmVhZGRpcgogICovCiBzdHJ1Y3QgcmVhZGRpcl9jZCB7Ci0JaW50CQkJZXJyOwkvKiAwLCBuZnNlcnIsIG9yIG5mc2Vycl9lb2YgKi8KKwlfX2JlMzIJCQllcnI7CS8qIDAsIG5mc2Vyciwgb3IgbmZzZXJyX2VvZiAqLwogfTsKIHR5cGVkZWYgaW50CQkoKmVuY29kZV9kZW50X2ZuKShzdHJ1Y3QgcmVhZGRpcl9jZCAqLCBjb25zdCBjaGFyICosCiAJCQkJCQlpbnQsIGxvZmZfdCwgaW5vX3QsIHVuc2lnbmVkIGludCk7CkBAIC02NCw3ICs2NCw3IEBACiAgKiBGdW5jdGlvbiBwcm90b3R5cGVzLgogICovCiBpbnQJCW5mc2Rfc3ZjKHVuc2lnbmVkIHNob3J0IHBvcnQsIGludCBucnNlcnZzKTsKLWludAkJbmZzZF9kaXNwYXRjaChzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCB1MzIgKnN0YXRwKTsKK2ludAkJbmZzZF9kaXNwYXRjaChzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCBfX2JlMzIgKnN0YXRwKTsKIAogLyogbmZzZC92ZnMuYyAqLwogaW50CQlmaF9sb2NrX3BhcmVudChzdHJ1Y3Qgc3ZjX2ZoICosIHN0cnVjdCBkZW50cnkgKik7CkBAIC03Miw1NyArNzIsNTcgQEAKIHZvaWQJCW5mc2RfcmFjYWNoZV9zaHV0ZG93bih2b2lkKTsKIGludAkJbmZzZF9jcm9zc19tbnQoc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgc3RydWN0IGRlbnRyeSAqKmRwcCwKIAkJICAgICAgICAgICAgICAgIHN0cnVjdCBzdmNfZXhwb3J0ICoqZXhwcCk7Ci1pbnQJCW5mc2RfbG9va3VwKHN0cnVjdCBzdmNfcnFzdCAqLCBzdHJ1Y3Qgc3ZjX2ZoICosCitfX2JlMzIJCW5mc2RfbG9va3VwKHN0cnVjdCBzdmNfcnFzdCAqLCBzdHJ1Y3Qgc3ZjX2ZoICosCiAJCQkJY29uc3QgY2hhciAqLCBpbnQsIHN0cnVjdCBzdmNfZmggKik7Ci1pbnQJCW5mc2Rfc2V0YXR0cihzdHJ1Y3Qgc3ZjX3Jxc3QgKiwgc3RydWN0IHN2Y19maCAqLAorX19iZTMyCQluZnNkX3NldGF0dHIoc3RydWN0IHN2Y19ycXN0ICosIHN0cnVjdCBzdmNfZmggKiwKIAkJCQlzdHJ1Y3QgaWF0dHIgKiwgaW50LCB0aW1lX3QpOwogI2lmZGVmIENPTkZJR19ORlNEX1Y0Ci1pbnQgICAgICAgICAgICAgbmZzZDRfc2V0X25mczRfYWNsKHN0cnVjdCBzdmNfcnFzdCAqLCBzdHJ1Y3Qgc3ZjX2ZoICosCitfX2JlMzIgICAgICAgICAgbmZzZDRfc2V0X25mczRfYWNsKHN0cnVjdCBzdmNfcnFzdCAqLCBzdHJ1Y3Qgc3ZjX2ZoICosCiAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBuZnM0X2FjbCAqKTsKIGludCAgICAgICAgICAgICBuZnNkNF9nZXRfbmZzNF9hY2woc3RydWN0IHN2Y19ycXN0ICosIHN0cnVjdCBkZW50cnkgKiwgc3RydWN0IG5mczRfYWNsICoqKTsKICNlbmRpZiAvKiBDT05GSUdfTkZTRF9WNCAqLwotaW50CQluZnNkX2NyZWF0ZShzdHJ1Y3Qgc3ZjX3Jxc3QgKiwgc3RydWN0IHN2Y19maCAqLAorX19iZTMyCQluZnNkX2NyZWF0ZShzdHJ1Y3Qgc3ZjX3Jxc3QgKiwgc3RydWN0IHN2Y19maCAqLAogCQkJCWNoYXIgKm5hbWUsIGludCBsZW4sIHN0cnVjdCBpYXR0ciAqYXR0cnMsCiAJCQkJaW50IHR5cGUsIGRldl90IHJkZXYsIHN0cnVjdCBzdmNfZmggKnJlcyk7CiAjaWZkZWYgQ09ORklHX05GU0RfVjMKLWludAkJbmZzZF9hY2Nlc3Moc3RydWN0IHN2Y19ycXN0ICosIHN0cnVjdCBzdmNfZmggKiwgdTMyICosIHUzMiAqKTsKLWludAkJbmZzZF9jcmVhdGVfdjMoc3RydWN0IHN2Y19ycXN0ICosIHN0cnVjdCBzdmNfZmggKiwKK19fYmUzMgkJbmZzZF9hY2Nlc3Moc3RydWN0IHN2Y19ycXN0ICosIHN0cnVjdCBzdmNfZmggKiwgdTMyICosIHUzMiAqKTsKK19fYmUzMgkJbmZzZF9jcmVhdGVfdjMoc3RydWN0IHN2Y19ycXN0ICosIHN0cnVjdCBzdmNfZmggKiwKIAkJCQljaGFyICpuYW1lLCBpbnQgbGVuLCBzdHJ1Y3QgaWF0dHIgKmF0dHJzLAogCQkJCXN0cnVjdCBzdmNfZmggKnJlcywgaW50IGNyZWF0ZW1vZGUsCi0JCQkJdTMyICp2ZXJpZmllciwgaW50ICp0cnVuY3ApOwotaW50CQluZnNkX2NvbW1pdChzdHJ1Y3Qgc3ZjX3Jxc3QgKiwgc3RydWN0IHN2Y19maCAqLAorCQkJCXUzMiAqdmVyaWZpZXIsIGludCAqdHJ1bmNwLCBpbnQgKmNyZWF0ZWQpOworX19iZTMyCQluZnNkX2NvbW1pdChzdHJ1Y3Qgc3ZjX3Jxc3QgKiwgc3RydWN0IHN2Y19maCAqLAogCQkJCWxvZmZfdCwgdW5zaWduZWQgbG9uZyk7CiAjZW5kaWYgLyogQ09ORklHX05GU0RfVjMgKi8KLWludAkJbmZzZF9vcGVuKHN0cnVjdCBzdmNfcnFzdCAqLCBzdHJ1Y3Qgc3ZjX2ZoICosIGludCwKK19fYmUzMgkJbmZzZF9vcGVuKHN0cnVjdCBzdmNfcnFzdCAqLCBzdHJ1Y3Qgc3ZjX2ZoICosIGludCwKIAkJCQlpbnQsIHN0cnVjdCBmaWxlICoqKTsKIHZvaWQJCW5mc2RfY2xvc2Uoc3RydWN0IGZpbGUgKik7Ci1pbnQgCQluZnNkX3JlYWQoc3RydWN0IHN2Y19ycXN0ICosIHN0cnVjdCBzdmNfZmggKiwgc3RydWN0IGZpbGUgKiwKK19fYmUzMiAJCW5mc2RfcmVhZChzdHJ1Y3Qgc3ZjX3Jxc3QgKiwgc3RydWN0IHN2Y19maCAqLCBzdHJ1Y3QgZmlsZSAqLAogCQkJCWxvZmZfdCwgc3RydWN0IGt2ZWMgKiwgaW50LCB1bnNpZ25lZCBsb25nICopOwotaW50IAkJbmZzZF93cml0ZShzdHJ1Y3Qgc3ZjX3Jxc3QgKiwgc3RydWN0IHN2Y19maCAqLHN0cnVjdCBmaWxlICosCitfX2JlMzIgCQluZnNkX3dyaXRlKHN0cnVjdCBzdmNfcnFzdCAqLCBzdHJ1Y3Qgc3ZjX2ZoICosc3RydWN0IGZpbGUgKiwKIAkJCQlsb2ZmX3QsIHN0cnVjdCBrdmVjICosaW50LCB1bnNpZ25lZCBsb25nLCBpbnQgKik7Ci1pbnQJCW5mc2RfcmVhZGxpbmsoc3RydWN0IHN2Y19ycXN0ICosIHN0cnVjdCBzdmNfZmggKiwKK19fYmUzMgkJbmZzZF9yZWFkbGluayhzdHJ1Y3Qgc3ZjX3Jxc3QgKiwgc3RydWN0IHN2Y19maCAqLAogCQkJCWNoYXIgKiwgaW50ICopOwotaW50CQluZnNkX3N5bWxpbmsoc3RydWN0IHN2Y19ycXN0ICosIHN0cnVjdCBzdmNfZmggKiwKK19fYmUzMgkJbmZzZF9zeW1saW5rKHN0cnVjdCBzdmNfcnFzdCAqLCBzdHJ1Y3Qgc3ZjX2ZoICosCiAJCQkJY2hhciAqbmFtZSwgaW50IGxlbiwgY2hhciAqcGF0aCwgaW50IHBsZW4sCiAJCQkJc3RydWN0IHN2Y19maCAqcmVzLCBzdHJ1Y3QgaWF0dHIgKik7Ci1pbnQJCW5mc2RfbGluayhzdHJ1Y3Qgc3ZjX3Jxc3QgKiwgc3RydWN0IHN2Y19maCAqLAorX19iZTMyCQluZnNkX2xpbmsoc3RydWN0IHN2Y19ycXN0ICosIHN0cnVjdCBzdmNfZmggKiwKIAkJCQljaGFyICosIGludCwgc3RydWN0IHN2Y19maCAqKTsKLWludAkJbmZzZF9yZW5hbWUoc3RydWN0IHN2Y19ycXN0ICosCitfX2JlMzIJCW5mc2RfcmVuYW1lKHN0cnVjdCBzdmNfcnFzdCAqLAogCQkJCXN0cnVjdCBzdmNfZmggKiwgY2hhciAqLCBpbnQsCiAJCQkJc3RydWN0IHN2Y19maCAqLCBjaGFyICosIGludCk7Ci1pbnQJCW5mc2RfcmVtb3ZlKHN0cnVjdCBzdmNfcnFzdCAqLAorX19iZTMyCQluZnNkX3JlbW92ZShzdHJ1Y3Qgc3ZjX3Jxc3QgKiwKIAkJCQlzdHJ1Y3Qgc3ZjX2ZoICosIGNoYXIgKiwgaW50KTsKLWludAkJbmZzZF91bmxpbmsoc3RydWN0IHN2Y19ycXN0ICosIHN0cnVjdCBzdmNfZmggKiwgaW50IHR5cGUsCitfX2JlMzIJCW5mc2RfdW5saW5rKHN0cnVjdCBzdmNfcnFzdCAqLCBzdHJ1Y3Qgc3ZjX2ZoICosIGludCB0eXBlLAogCQkJCWNoYXIgKm5hbWUsIGludCBsZW4pOwogaW50CQluZnNkX3RydW5jYXRlKHN0cnVjdCBzdmNfcnFzdCAqLCBzdHJ1Y3Qgc3ZjX2ZoICosCiAJCQkJdW5zaWduZWQgbG9uZyBzaXplKTsKLWludAkJbmZzZF9yZWFkZGlyKHN0cnVjdCBzdmNfcnFzdCAqLCBzdHJ1Y3Qgc3ZjX2ZoICosCitfX2JlMzIJCW5mc2RfcmVhZGRpcihzdHJ1Y3Qgc3ZjX3Jxc3QgKiwgc3RydWN0IHN2Y19maCAqLAogCQkJICAgICBsb2ZmX3QgKiwgc3RydWN0IHJlYWRkaXJfY2QgKiwgZW5jb2RlX2RlbnRfZm4pOwotaW50CQluZnNkX3N0YXRmcyhzdHJ1Y3Qgc3ZjX3Jxc3QgKiwgc3RydWN0IHN2Y19maCAqLAorX19iZTMyCQluZnNkX3N0YXRmcyhzdHJ1Y3Qgc3ZjX3Jxc3QgKiwgc3RydWN0IHN2Y19maCAqLAogCQkJCXN0cnVjdCBrc3RhdGZzICopOwogCiBpbnQJCW5mc2Rfbm90aWZ5X2NoYW5nZShzdHJ1Y3QgaW5vZGUgKiwgc3RydWN0IGlhdHRyICopOwotaW50CQluZnNkX3Blcm1pc3Npb24oc3RydWN0IHN2Y19leHBvcnQgKiwgc3RydWN0IGRlbnRyeSAqLCBpbnQpOworX19iZTMyCQluZnNkX3Blcm1pc3Npb24oc3RydWN0IHN2Y19leHBvcnQgKiwgc3RydWN0IGRlbnRyeSAqLCBpbnQpOwogaW50CQluZnNkX3N5bmNfZGlyKHN0cnVjdCBkZW50cnkgKmRwKTsKIAogI2lmIGRlZmluZWQoQ09ORklHX05GU0RfVjJfQUNMKSB8fCBkZWZpbmVkKENPTkZJR19ORlNEX1YzX0FDTCkKQEAgLTIzOCw2ICsyMzgsNyBAQAogI2RlZmluZQluZnNlcnJfYmFkbmFtZQkJX19jb25zdGFudF9odG9ubChORlNFUlJfQkFETkFNRSkKICNkZWZpbmUJbmZzZXJyX2NiX3BhdGhfZG93bglfX2NvbnN0YW50X2h0b25sKE5GU0VSUl9DQl9QQVRIX0RPV04pCiAjZGVmaW5lCW5mc2Vycl9sb2NrZWQJCV9fY29uc3RhbnRfaHRvbmwoTkZTRVJSX0xPQ0tFRCkKKyNkZWZpbmUJbmZzZXJyX3JlcGxheV9tZQlfX2NvbnN0YW50X2h0b25sKE5GU0VSUl9SRVBMQVlfTUUpCiAKIC8qIGVycm9yIGNvZGVzIGZvciBpbnRlcm5hbCB1c2UgKi8KIC8qIGlmIGEgcmVxdWVzdCBmYWlscyBkdWUgdG8ga21hbGxvYyBmYWlsdXJlLCBpdCBnZXRzIGRyb3BwZWQuCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L25mc2QvbmZzZmguaCBiL2luY2x1ZGUvbGludXgvbmZzZC9uZnNmaC5oCmluZGV4IDA2OTI1N2UuLmYzYjUxZDYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbmZzZC9uZnNmaC5oCisrKyBiL2luY2x1ZGUvbGludXgvbmZzZC9uZnNmaC5oCkBAIC0xNTcsNyArMTU3LDcgQEAKIAlfX3U2NAkJCWZoX3Bvc3Rfc2l6ZTsJLyogaV9zaXplICovCiAJdW5zaWduZWQgbG9uZwkJZmhfcG9zdF9ibG9ja3M7IC8qIGlfYmxvY2tzICovCiAJdW5zaWduZWQgbG9uZwkJZmhfcG9zdF9ibGtzaXplOy8qIGlfYmxrc2l6ZSAqLwotCV9fdTMyCQkJZmhfcG9zdF9yZGV2WzJdOy8qIGlfcmRldiAqLworCV9fYmUzMgkJCWZoX3Bvc3RfcmRldlsyXTsvKiBpX3JkZXYgKi8KIAlzdHJ1Y3QgdGltZXNwZWMJCWZoX3Bvc3RfYXRpbWU7CS8qIGlfYXRpbWUgKi8KIAlzdHJ1Y3QgdGltZXNwZWMJCWZoX3Bvc3RfbXRpbWU7CS8qIGlfbXRpbWUgKi8KIAlzdHJ1Y3QgdGltZXNwZWMJCWZoX3Bvc3RfY3RpbWU7CS8qIGlfY3RpbWUgKi8KQEAgLTIwOSw5ICsyMDksOSBAQAogLyoKICAqIEZ1bmN0aW9uIHByb3RvdHlwZXMKICAqLwotdTMyCWZoX3ZlcmlmeShzdHJ1Y3Qgc3ZjX3Jxc3QgKiwgc3RydWN0IHN2Y19maCAqLCBpbnQsIGludCk7Ci1pbnQJZmhfY29tcG9zZShzdHJ1Y3Qgc3ZjX2ZoICosIHN0cnVjdCBzdmNfZXhwb3J0ICosIHN0cnVjdCBkZW50cnkgKiwgc3RydWN0IHN2Y19maCAqKTsKLWludAlmaF91cGRhdGUoc3RydWN0IHN2Y19maCAqKTsKK19fYmUzMglmaF92ZXJpZnkoc3RydWN0IHN2Y19ycXN0ICosIHN0cnVjdCBzdmNfZmggKiwgaW50LCBpbnQpOworX19iZTMyCWZoX2NvbXBvc2Uoc3RydWN0IHN2Y19maCAqLCBzdHJ1Y3Qgc3ZjX2V4cG9ydCAqLCBzdHJ1Y3QgZGVudHJ5ICosIHN0cnVjdCBzdmNfZmggKik7CitfX2JlMzIJZmhfdXBkYXRlKHN0cnVjdCBzdmNfZmggKik7CiB2b2lkCWZoX3B1dChzdHJ1Y3Qgc3ZjX2ZoICopOwogCiBzdGF0aWMgX19pbmxpbmVfXyBzdHJ1Y3Qgc3ZjX2ZoICoKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbmZzZC9zdGF0ZS5oIGIvaW5jbHVkZS9saW51eC9uZnNkL3N0YXRlLmgKaW5kZXggOGJmMjNjZi4uYzM2NzNmNCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9uZnNkL3N0YXRlLmgKKysrIGIvaW5jbHVkZS9saW51eC9uZnNkL3N0YXRlLmgKQEAgLTEyNSw3ICsxMjUsNyBAQAogCWNoYXIgICAgICAgICAgICAgICAgICAgIGNsX3JlY2RpcltIRVhESVJfTEVOXTsgLyogcmVjb3ZlcnkgZGlyICovCiAJbmZzNF92ZXJpZmllcgkJY2xfdmVyaWZpZXI7IAkvKiBnZW5lcmF0ZWQgYnkgY2xpZW50ICovCiAJdGltZV90ICAgICAgICAgICAgICAgICAgY2xfdGltZTsgICAgICAgIC8qIHRpbWUgb2YgbGFzdCBsZWFzZSByZW5ld2FsICovCi0JdTMyCQkJY2xfYWRkcjsgCS8qIGNsaWVudCBpcGFkZHJlc3MgKi8KKwlfX2JlMzIJCQljbF9hZGRyOyAJLyogY2xpZW50IGlwYWRkcmVzcyAqLwogCXN0cnVjdCBzdmNfY3JlZAkJY2xfY3JlZDsgCS8qIHNldGNsaWVudGlkIHByaW5jaXBhbCAqLwogCWNsaWVudGlkX3QJCWNsX2NsaWVudGlkOwkvKiBnZW5lcmF0ZWQgYnkgc2VydmVyICovCiAJbmZzNF92ZXJpZmllcgkJY2xfY29uZmlybTsJLyogZ2VuZXJhdGVkIGJ5IHNlcnZlciAqLwpAQCAtMTY0LDcgKzE2NCw3IEBACiAgKiBpcyBjYWNoZWQuIAogICovCiBzdHJ1Y3QgbmZzNF9yZXBsYXkgewotCXUzMgkJCXJwX3N0YXR1czsKKwlfX2JlMzIJCQlycF9zdGF0dXM7CiAJdW5zaWduZWQgaW50CQlycF9idWZsZW47CiAJY2hhcgkJCSpycF9idWY7CiAJdW5zaWduZWQJCWludHJwX2FsbG9jYXRlZDsKQEAgLTI3MywxOSArMjczLDE5IEBACiAJKChlcnIpICE9IG5mc2Vycl9zdGFsZV9zdGF0ZWlkKSAmJiAgICAgIFwKIAkoKGVycikgIT0gbmZzZXJyX2JhZF9zdGF0ZWlkKSkKIAotZXh0ZXJuIGludCBuZnNkNF9yZW5ldyhjbGllbnRpZF90ICpjbGlkKTsKLWV4dGVybiBpbnQgbmZzNF9wcmVwcm9jZXNzX3N0YXRlaWRfb3Aoc3RydWN0IHN2Y19maCAqY3VycmVudF9maCwgCitleHRlcm4gX19iZTMyIG5mc2Q0X3JlbmV3KGNsaWVudGlkX3QgKmNsaWQpOworZXh0ZXJuIF9fYmUzMiBuZnM0X3ByZXByb2Nlc3Nfc3RhdGVpZF9vcChzdHJ1Y3Qgc3ZjX2ZoICpjdXJyZW50X2ZoLAogCQlzdGF0ZWlkX3QgKnN0YXRlaWQsIGludCBmbGFncywgc3RydWN0IGZpbGUgKipmaWxwKTsKIGV4dGVybiB2b2lkIG5mczRfbG9ja19zdGF0ZSh2b2lkKTsKIGV4dGVybiB2b2lkIG5mczRfdW5sb2NrX3N0YXRlKHZvaWQpOwogZXh0ZXJuIGludCBuZnM0X2luX2dyYWNlKHZvaWQpOwotZXh0ZXJuIGludCBuZnM0X2NoZWNrX29wZW5fcmVjbGFpbShjbGllbnRpZF90ICpjbGlkKTsKK2V4dGVybiBfX2JlMzIgbmZzNF9jaGVja19vcGVuX3JlY2xhaW0oY2xpZW50aWRfdCAqY2xpZCk7CiBleHRlcm4gdm9pZCBwdXRfbmZzNF9jbGllbnQoc3RydWN0IG5mczRfY2xpZW50ICpjbHApOwogZXh0ZXJuIHZvaWQgbmZzNF9mcmVlX3N0YXRlb3duZXIoc3RydWN0IGtyZWYgKmtyZWYpOwogZXh0ZXJuIHZvaWQgbmZzZDRfcHJvYmVfY2FsbGJhY2soc3RydWN0IG5mczRfY2xpZW50ICpjbHApOwogZXh0ZXJuIHZvaWQgbmZzZDRfY2JfcmVjYWxsKHN0cnVjdCBuZnM0X2RlbGVnYXRpb24gKmRwKTsKIGV4dGVybiB2b2lkIG5mczRfcHV0X2RlbGVnYXRpb24oc3RydWN0IG5mczRfZGVsZWdhdGlvbiAqZHApOwotZXh0ZXJuIGludCBuZnM0X21ha2VfcmVjX2NsaWRuYW1lKGNoYXIgKmNsaWRuYW1lLCBzdHJ1Y3QgeGRyX25ldG9iaiAqY2xuYW1lKTsKK2V4dGVybiBfX2JlMzIgbmZzNF9tYWtlX3JlY19jbGlkbmFtZShjaGFyICpjbGlkbmFtZSwgc3RydWN0IHhkcl9uZXRvYmogKmNsbmFtZSk7CiBleHRlcm4gdm9pZCBuZnNkNF9pbml0X3JlY2RpcihjaGFyICpyZWNkaXJfbmFtZSk7CiBleHRlcm4gaW50IG5mc2Q0X3JlY2Rpcl9sb2FkKHZvaWQpOwogZXh0ZXJuIHZvaWQgbmZzZDRfc2h1dGRvd25fcmVjZGlyKHZvaWQpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9uZnNkL3hkci5oIGIvaW5jbHVkZS9saW51eC9uZnNkL3hkci5oCmluZGV4IDBlNTNkZTguLjg3NzE5MmQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbmZzZC94ZHIuaAorKysgYi9pbmNsdWRlL2xpbnV4L25mc2QveGRyLmgKQEAgLTgxLDcgKzgxLDcgQEAKIAlzdHJ1Y3Qgc3ZjX2ZoCQlmaDsKIAlfX3UzMgkJCWNvb2tpZTsKIAlfX3UzMgkJCWNvdW50OwotCXUzMiAqCQkJYnVmZmVyOworCV9fYmUzMiAqCQlidWZmZXI7CiB9OwogCiBzdHJ1Y3QgbmZzZF9hdHRyc3RhdCB7CkBAIC0xMDgsOSArMTA4LDkgQEAKIAlpbnQJCQljb3VudDsKIAogCXN0cnVjdCByZWFkZGlyX2NkCWNvbW1vbjsKLQl1MzIgKgkJCWJ1ZmZlcjsKKwlfX2JlMzIgKgkJYnVmZmVyOwogCWludAkJCWJ1ZmxlbjsKLQl1MzIgKgkJCW9mZnNldDsKKwlfX2JlMzIgKgkJb2Zmc2V0OwogfTsKIAogc3RydWN0IG5mc2Rfc3RhdGZzcmVzIHsKQEAgLTEzNSw0MyArMTM1LDQzIEBACiAjZGVmaW5lIE5GUzJfU1ZDX1hEUlNJWkUJc2l6ZW9mKHVuaW9uIG5mc2RfeGRyc3RvcmUpCiAKIAotaW50IG5mc3N2Y19kZWNvZGVfdm9pZChzdHJ1Y3Qgc3ZjX3Jxc3QgKiwgdTMyICosIHZvaWQgKik7Ci1pbnQgbmZzc3ZjX2RlY29kZV9maGFuZGxlKHN0cnVjdCBzdmNfcnFzdCAqLCB1MzIgKiwgc3RydWN0IG5mc2RfZmhhbmRsZSAqKTsKLWludCBuZnNzdmNfZGVjb2RlX3NhdHRyYXJncyhzdHJ1Y3Qgc3ZjX3Jxc3QgKiwgdTMyICosCitpbnQgbmZzc3ZjX2RlY29kZV92b2lkKHN0cnVjdCBzdmNfcnFzdCAqLCBfX2JlMzIgKiwgdm9pZCAqKTsKK2ludCBuZnNzdmNfZGVjb2RlX2ZoYW5kbGUoc3RydWN0IHN2Y19ycXN0ICosIF9fYmUzMiAqLCBzdHJ1Y3QgbmZzZF9maGFuZGxlICopOworaW50IG5mc3N2Y19kZWNvZGVfc2F0dHJhcmdzKHN0cnVjdCBzdmNfcnFzdCAqLCBfX2JlMzIgKiwKIAkJCQlzdHJ1Y3QgbmZzZF9zYXR0cmFyZ3MgKik7Ci1pbnQgbmZzc3ZjX2RlY29kZV9kaXJvcGFyZ3Moc3RydWN0IHN2Y19ycXN0ICosIHUzMiAqLAoraW50IG5mc3N2Y19kZWNvZGVfZGlyb3BhcmdzKHN0cnVjdCBzdmNfcnFzdCAqLCBfX2JlMzIgKiwKIAkJCQlzdHJ1Y3QgbmZzZF9kaXJvcGFyZ3MgKik7Ci1pbnQgbmZzc3ZjX2RlY29kZV9yZWFkYXJncyhzdHJ1Y3Qgc3ZjX3Jxc3QgKiwgdTMyICosCitpbnQgbmZzc3ZjX2RlY29kZV9yZWFkYXJncyhzdHJ1Y3Qgc3ZjX3Jxc3QgKiwgX19iZTMyICosCiAJCQkJc3RydWN0IG5mc2RfcmVhZGFyZ3MgKik7Ci1pbnQgbmZzc3ZjX2RlY29kZV93cml0ZWFyZ3Moc3RydWN0IHN2Y19ycXN0ICosIHUzMiAqLAoraW50IG5mc3N2Y19kZWNvZGVfd3JpdGVhcmdzKHN0cnVjdCBzdmNfcnFzdCAqLCBfX2JlMzIgKiwKIAkJCQlzdHJ1Y3QgbmZzZF93cml0ZWFyZ3MgKik7Ci1pbnQgbmZzc3ZjX2RlY29kZV9jcmVhdGVhcmdzKHN0cnVjdCBzdmNfcnFzdCAqLCB1MzIgKiwKK2ludCBuZnNzdmNfZGVjb2RlX2NyZWF0ZWFyZ3Moc3RydWN0IHN2Y19ycXN0ICosIF9fYmUzMiAqLAogCQkJCXN0cnVjdCBuZnNkX2NyZWF0ZWFyZ3MgKik7Ci1pbnQgbmZzc3ZjX2RlY29kZV9yZW5hbWVhcmdzKHN0cnVjdCBzdmNfcnFzdCAqLCB1MzIgKiwKK2ludCBuZnNzdmNfZGVjb2RlX3JlbmFtZWFyZ3Moc3RydWN0IHN2Y19ycXN0ICosIF9fYmUzMiAqLAogCQkJCXN0cnVjdCBuZnNkX3JlbmFtZWFyZ3MgKik7Ci1pbnQgbmZzc3ZjX2RlY29kZV9yZWFkbGlua2FyZ3Moc3RydWN0IHN2Y19ycXN0ICosIHUzMiAqLAoraW50IG5mc3N2Y19kZWNvZGVfcmVhZGxpbmthcmdzKHN0cnVjdCBzdmNfcnFzdCAqLCBfX2JlMzIgKiwKIAkJCQlzdHJ1Y3QgbmZzZF9yZWFkbGlua2FyZ3MgKik7Ci1pbnQgbmZzc3ZjX2RlY29kZV9saW5rYXJncyhzdHJ1Y3Qgc3ZjX3Jxc3QgKiwgdTMyICosCitpbnQgbmZzc3ZjX2RlY29kZV9saW5rYXJncyhzdHJ1Y3Qgc3ZjX3Jxc3QgKiwgX19iZTMyICosCiAJCQkJc3RydWN0IG5mc2RfbGlua2FyZ3MgKik7Ci1pbnQgbmZzc3ZjX2RlY29kZV9zeW1saW5rYXJncyhzdHJ1Y3Qgc3ZjX3Jxc3QgKiwgdTMyICosCitpbnQgbmZzc3ZjX2RlY29kZV9zeW1saW5rYXJncyhzdHJ1Y3Qgc3ZjX3Jxc3QgKiwgX19iZTMyICosCiAJCQkJc3RydWN0IG5mc2Rfc3ltbGlua2FyZ3MgKik7Ci1pbnQgbmZzc3ZjX2RlY29kZV9yZWFkZGlyYXJncyhzdHJ1Y3Qgc3ZjX3Jxc3QgKiwgdTMyICosCitpbnQgbmZzc3ZjX2RlY29kZV9yZWFkZGlyYXJncyhzdHJ1Y3Qgc3ZjX3Jxc3QgKiwgX19iZTMyICosCiAJCQkJc3RydWN0IG5mc2RfcmVhZGRpcmFyZ3MgKik7Ci1pbnQgbmZzc3ZjX2VuY29kZV92b2lkKHN0cnVjdCBzdmNfcnFzdCAqLCB1MzIgKiwgdm9pZCAqKTsKLWludCBuZnNzdmNfZW5jb2RlX2F0dHJzdGF0KHN0cnVjdCBzdmNfcnFzdCAqLCB1MzIgKiwgc3RydWN0IG5mc2RfYXR0cnN0YXQgKik7Ci1pbnQgbmZzc3ZjX2VuY29kZV9kaXJvcHJlcyhzdHJ1Y3Qgc3ZjX3Jxc3QgKiwgdTMyICosIHN0cnVjdCBuZnNkX2Rpcm9wcmVzICopOwotaW50IG5mc3N2Y19lbmNvZGVfcmVhZGxpbmtyZXMoc3RydWN0IHN2Y19ycXN0ICosIHUzMiAqLCBzdHJ1Y3QgbmZzZF9yZWFkbGlua3JlcyAqKTsKLWludCBuZnNzdmNfZW5jb2RlX3JlYWRyZXMoc3RydWN0IHN2Y19ycXN0ICosIHUzMiAqLCBzdHJ1Y3QgbmZzZF9yZWFkcmVzICopOwotaW50IG5mc3N2Y19lbmNvZGVfc3RhdGZzcmVzKHN0cnVjdCBzdmNfcnFzdCAqLCB1MzIgKiwgc3RydWN0IG5mc2Rfc3RhdGZzcmVzICopOwotaW50IG5mc3N2Y19lbmNvZGVfcmVhZGRpcnJlcyhzdHJ1Y3Qgc3ZjX3Jxc3QgKiwgdTMyICosIHN0cnVjdCBuZnNkX3JlYWRkaXJyZXMgKik7CitpbnQgbmZzc3ZjX2VuY29kZV92b2lkKHN0cnVjdCBzdmNfcnFzdCAqLCBfX2JlMzIgKiwgdm9pZCAqKTsKK2ludCBuZnNzdmNfZW5jb2RlX2F0dHJzdGF0KHN0cnVjdCBzdmNfcnFzdCAqLCBfX2JlMzIgKiwgc3RydWN0IG5mc2RfYXR0cnN0YXQgKik7CitpbnQgbmZzc3ZjX2VuY29kZV9kaXJvcHJlcyhzdHJ1Y3Qgc3ZjX3Jxc3QgKiwgX19iZTMyICosIHN0cnVjdCBuZnNkX2Rpcm9wcmVzICopOworaW50IG5mc3N2Y19lbmNvZGVfcmVhZGxpbmtyZXMoc3RydWN0IHN2Y19ycXN0ICosIF9fYmUzMiAqLCBzdHJ1Y3QgbmZzZF9yZWFkbGlua3JlcyAqKTsKK2ludCBuZnNzdmNfZW5jb2RlX3JlYWRyZXMoc3RydWN0IHN2Y19ycXN0ICosIF9fYmUzMiAqLCBzdHJ1Y3QgbmZzZF9yZWFkcmVzICopOworaW50IG5mc3N2Y19lbmNvZGVfc3RhdGZzcmVzKHN0cnVjdCBzdmNfcnFzdCAqLCBfX2JlMzIgKiwgc3RydWN0IG5mc2Rfc3RhdGZzcmVzICopOworaW50IG5mc3N2Y19lbmNvZGVfcmVhZGRpcnJlcyhzdHJ1Y3Qgc3ZjX3Jxc3QgKiwgX19iZTMyICosIHN0cnVjdCBuZnNkX3JlYWRkaXJyZXMgKik7CiAKIGludCBuZnNzdmNfZW5jb2RlX2VudHJ5KHN0cnVjdCByZWFkZGlyX2NkICosIGNvbnN0IGNoYXIgKm5hbWUsCiAJCQkJaW50IG5hbWxlbiwgbG9mZl90IG9mZnNldCwgaW5vX3QgaW5vLCB1bnNpZ25lZCBpbnQpOwogCi1pbnQgbmZzc3ZjX3JlbGVhc2VfZmhhbmRsZShzdHJ1Y3Qgc3ZjX3Jxc3QgKiwgdTMyICosIHN0cnVjdCBuZnNkX2ZoYW5kbGUgKik7CitpbnQgbmZzc3ZjX3JlbGVhc2VfZmhhbmRsZShzdHJ1Y3Qgc3ZjX3Jxc3QgKiwgX19iZTMyICosIHN0cnVjdCBuZnNkX2ZoYW5kbGUgKik7CiAKIC8qIEhlbHBlciBmdW5jdGlvbnMgZm9yIE5GU3YyIEFDTCBjb2RlICovCi11MzIgKm5mczJzdmNfZW5jb2RlX2ZhdHRyKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHUzMiAqcCwgc3RydWN0IHN2Y19maCAqZmhwKTsKLXUzMiAqbmZzMnN2Y19kZWNvZGVfZmgodTMyICpwLCBzdHJ1Y3Qgc3ZjX2ZoICpmaHApOworX19iZTMyICpuZnMyc3ZjX2VuY29kZV9mYXR0cihzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCBfX2JlMzIgKnAsIHN0cnVjdCBzdmNfZmggKmZocCk7CitfX2JlMzIgKm5mczJzdmNfZGVjb2RlX2ZoKF9fYmUzMiAqcCwgc3RydWN0IHN2Y19maCAqZmhwKTsKIAogI2VuZGlmIC8qIExJTlVYX05GU0RfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9uZnNkL3hkcjMuaCBiL2luY2x1ZGUvbGludXgvbmZzZC94ZHIzLmgKaW5kZXggNDc0ZDg4Mi4uNzk5NjM4NiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9uZnNkL3hkcjMuaAorKysgYi9pbmNsdWRlL2xpbnV4L25mc2QveGRyMy5oCkBAIC01MSw3ICs1MSw3IEBACiAJaW50CQkJbGVuOwogCWludAkJCWNyZWF0ZW1vZGU7CiAJc3RydWN0IGlhdHRyCQlhdHRyczsKLQlfX3UzMiAqCQkJdmVyZjsKKwlfX2JlMzIgKgkJdmVyZjsKIH07CiAKIHN0cnVjdCBuZnNkM19ta25vZGFyZ3MgewpAQCAtOTgsOCArOTgsOCBAQAogCV9fdTY0CQkJY29va2llOwogCV9fdTMyCQkJZGlyY291bnQ7CiAJX191MzIJCQljb3VudDsKLQlfX3UzMiAqCQkJdmVyZjsKLQl1MzIgKgkJCWJ1ZmZlcjsKKwlfX2JlMzIgKgkJdmVyZjsKKwlfX2JlMzIgKgkJYnVmZmVyOwogfTsKIAogc3RydWN0IG5mc2QzX2NvbW1pdGFyZ3MgewpAQCAtMTIyLDc5ICsxMjIsNzkgQEAKIH07CiAKIHN0cnVjdCBuZnNkM19hdHRyc3RhdCB7Ci0JX191MzIJCQlzdGF0dXM7CisJX19iZTMyCQkJc3RhdHVzOwogCXN0cnVjdCBzdmNfZmgJCWZoOwogCXN0cnVjdCBrc3RhdCAgICAgICAgICAgIHN0YXQ7CiB9OwogCiAvKiBMT09LVVAsIENSRUFURSwgTUtESVIsIFNZTUxJTkssIE1LTk9EICovCiBzdHJ1Y3QgbmZzZDNfZGlyb3ByZXMgIHsKLQlfX3UzMgkJCXN0YXR1czsKKwlfX2JlMzIJCQlzdGF0dXM7CiAJc3RydWN0IHN2Y19maAkJZGlyZmg7CiAJc3RydWN0IHN2Y19maAkJZmg7CiB9OwogCiBzdHJ1Y3QgbmZzZDNfYWNjZXNzcmVzIHsKLQlfX3UzMgkJCXN0YXR1czsKKwlfX2JlMzIJCQlzdGF0dXM7CiAJc3RydWN0IHN2Y19maAkJZmg7CiAJX191MzIJCQlhY2Nlc3M7CiB9OwogCiBzdHJ1Y3QgbmZzZDNfcmVhZGxpbmtyZXMgewotCV9fdTMyCQkJc3RhdHVzOworCV9fYmUzMgkJCXN0YXR1czsKIAlzdHJ1Y3Qgc3ZjX2ZoCQlmaDsKIAlfX3UzMgkJCWxlbjsKIH07CiAKIHN0cnVjdCBuZnNkM19yZWFkcmVzIHsKLQlfX3UzMgkJCXN0YXR1czsKKwlfX2JlMzIJCQlzdGF0dXM7CiAJc3RydWN0IHN2Y19maAkJZmg7CiAJdW5zaWduZWQgbG9uZwkJY291bnQ7CiAJaW50CQkJZW9mOwogfTsKIAogc3RydWN0IG5mc2QzX3dyaXRlcmVzIHsKLQlfX3UzMgkJCXN0YXR1czsKKwlfX2JlMzIJCQlzdGF0dXM7CiAJc3RydWN0IHN2Y19maAkJZmg7CiAJdW5zaWduZWQgbG9uZwkJY291bnQ7CiAJaW50CQkJY29tbWl0dGVkOwogfTsKIAogc3RydWN0IG5mc2QzX3JlbmFtZXJlcyB7Ci0JX191MzIJCQlzdGF0dXM7CisJX19iZTMyCQkJc3RhdHVzOwogCXN0cnVjdCBzdmNfZmgJCWZmaDsKIAlzdHJ1Y3Qgc3ZjX2ZoCQl0Zmg7CiB9OwogCiBzdHJ1Y3QgbmZzZDNfbGlua3JlcyB7Ci0JX191MzIJCQlzdGF0dXM7CisJX19iZTMyCQkJc3RhdHVzOwogCXN0cnVjdCBzdmNfZmgJCXRmaDsKIAlzdHJ1Y3Qgc3ZjX2ZoCQlmaDsKIH07CiAKIHN0cnVjdCBuZnNkM19yZWFkZGlycmVzIHsKLQlfX3UzMgkJCXN0YXR1czsKKwlfX2JlMzIJCQlzdGF0dXM7CiAJc3RydWN0IHN2Y19maAkJZmg7CiAJaW50CQkJY291bnQ7Ci0JX191MzIJCQl2ZXJmWzJdOworCV9fYmUzMgkJCXZlcmZbMl07CiAKIAlzdHJ1Y3QgcmVhZGRpcl9jZAljb21tb247Ci0JdTMyICoJCQlidWZmZXI7CisJX19iZTMyICoJCWJ1ZmZlcjsKIAlpbnQJCQlidWZsZW47Ci0JdTMyICoJCQlvZmZzZXQ7Ci0JdTMyICoJCQlvZmZzZXQxOworCV9fYmUzMiAqCQlvZmZzZXQ7CisJX19iZTMyICoJCW9mZnNldDE7CiAJc3RydWN0IHN2Y19ycXN0ICoJcnFzdHA7CiAKIH07CiAKIHN0cnVjdCBuZnNkM19mc3N0YXRyZXMgewotCV9fdTMyCQkJc3RhdHVzOworCV9fYmUzMgkJCXN0YXR1czsKIAlzdHJ1Y3Qga3N0YXRmcwkJc3RhdHM7CiAJX191MzIJCQlpbnZhcnNlYzsKIH07CiAKIHN0cnVjdCBuZnNkM19mc2luZm9yZXMgewotCV9fdTMyCQkJc3RhdHVzOworCV9fYmUzMgkJCXN0YXR1czsKIAlfX3UzMgkJCWZfcnRtYXg7CiAJX191MzIJCQlmX3J0cHJlZjsKIAlfX3UzMgkJCWZfcnRtdWx0OwpAQCAtMjA3LDcgKzIwNyw3IEBACiB9OwogCiBzdHJ1Y3QgbmZzZDNfcGF0aGNvbmZyZXMgewotCV9fdTMyCQkJc3RhdHVzOworCV9fYmUzMgkJCXN0YXR1czsKIAlfX3UzMgkJCXBfbGlua19tYXg7CiAJX191MzIJCQlwX25hbWVfbWF4OwogCV9fdTMyCQkJcF9ub190cnVuYzsKQEAgLTIxNywxMiArMjE3LDEyIEBACiB9OwogCiBzdHJ1Y3QgbmZzZDNfY29tbWl0cmVzIHsKLQlfX3UzMgkJCXN0YXR1czsKKwlfX2JlMzIJCQlzdGF0dXM7CiAJc3RydWN0IHN2Y19maAkJZmg7CiB9OwogCiBzdHJ1Y3QgbmZzZDNfZ2V0YWNscmVzIHsKLQlfX3UzMgkJCXN0YXR1czsKKwlfX2JlMzIJCQlzdGF0dXM7CiAJc3RydWN0IHN2Y19maAkJZmg7CiAJaW50CQkJbWFzazsKIAlzdHJ1Y3QgcG9zaXhfYWNsCSphY2xfYWNjZXNzOwpAQCAtMjY2LDcwICsyNjYsNzAgQEAKIAogI2RlZmluZSBORlMzX1NWQ19YRFJTSVpFCQlzaXplb2YodW5pb24gbmZzZDNfeGRyc3RvcmUpCiAKLWludCBuZnMzc3ZjX2RlY29kZV9maGFuZGxlKHN0cnVjdCBzdmNfcnFzdCAqLCB1MzIgKiwgc3RydWN0IG5mc2RfZmhhbmRsZSAqKTsKLWludCBuZnMzc3ZjX2RlY29kZV9zYXR0cmFyZ3Moc3RydWN0IHN2Y19ycXN0ICosIHUzMiAqLAoraW50IG5mczNzdmNfZGVjb2RlX2ZoYW5kbGUoc3RydWN0IHN2Y19ycXN0ICosIF9fYmUzMiAqLCBzdHJ1Y3QgbmZzZF9maGFuZGxlICopOworaW50IG5mczNzdmNfZGVjb2RlX3NhdHRyYXJncyhzdHJ1Y3Qgc3ZjX3Jxc3QgKiwgX19iZTMyICosCiAJCQkJc3RydWN0IG5mc2QzX3NhdHRyYXJncyAqKTsKLWludCBuZnMzc3ZjX2RlY29kZV9kaXJvcGFyZ3Moc3RydWN0IHN2Y19ycXN0ICosIHUzMiAqLAoraW50IG5mczNzdmNfZGVjb2RlX2Rpcm9wYXJncyhzdHJ1Y3Qgc3ZjX3Jxc3QgKiwgX19iZTMyICosCiAJCQkJc3RydWN0IG5mc2QzX2Rpcm9wYXJncyAqKTsKLWludCBuZnMzc3ZjX2RlY29kZV9hY2Nlc3NhcmdzKHN0cnVjdCBzdmNfcnFzdCAqLCB1MzIgKiwKK2ludCBuZnMzc3ZjX2RlY29kZV9hY2Nlc3NhcmdzKHN0cnVjdCBzdmNfcnFzdCAqLCBfX2JlMzIgKiwKIAkJCQlzdHJ1Y3QgbmZzZDNfYWNjZXNzYXJncyAqKTsKLWludCBuZnMzc3ZjX2RlY29kZV9yZWFkYXJncyhzdHJ1Y3Qgc3ZjX3Jxc3QgKiwgdTMyICosCitpbnQgbmZzM3N2Y19kZWNvZGVfcmVhZGFyZ3Moc3RydWN0IHN2Y19ycXN0ICosIF9fYmUzMiAqLAogCQkJCXN0cnVjdCBuZnNkM19yZWFkYXJncyAqKTsKLWludCBuZnMzc3ZjX2RlY29kZV93cml0ZWFyZ3Moc3RydWN0IHN2Y19ycXN0ICosIHUzMiAqLAoraW50IG5mczNzdmNfZGVjb2RlX3dyaXRlYXJncyhzdHJ1Y3Qgc3ZjX3Jxc3QgKiwgX19iZTMyICosCiAJCQkJc3RydWN0IG5mc2QzX3dyaXRlYXJncyAqKTsKLWludCBuZnMzc3ZjX2RlY29kZV9jcmVhdGVhcmdzKHN0cnVjdCBzdmNfcnFzdCAqLCB1MzIgKiwKK2ludCBuZnMzc3ZjX2RlY29kZV9jcmVhdGVhcmdzKHN0cnVjdCBzdmNfcnFzdCAqLCBfX2JlMzIgKiwKIAkJCQlzdHJ1Y3QgbmZzZDNfY3JlYXRlYXJncyAqKTsKLWludCBuZnMzc3ZjX2RlY29kZV9ta2RpcmFyZ3Moc3RydWN0IHN2Y19ycXN0ICosIHUzMiAqLAoraW50IG5mczNzdmNfZGVjb2RlX21rZGlyYXJncyhzdHJ1Y3Qgc3ZjX3Jxc3QgKiwgX19iZTMyICosCiAJCQkJc3RydWN0IG5mc2QzX2NyZWF0ZWFyZ3MgKik7Ci1pbnQgbmZzM3N2Y19kZWNvZGVfbWtub2RhcmdzKHN0cnVjdCBzdmNfcnFzdCAqLCB1MzIgKiwKK2ludCBuZnMzc3ZjX2RlY29kZV9ta25vZGFyZ3Moc3RydWN0IHN2Y19ycXN0ICosIF9fYmUzMiAqLAogCQkJCXN0cnVjdCBuZnNkM19ta25vZGFyZ3MgKik7Ci1pbnQgbmZzM3N2Y19kZWNvZGVfcmVuYW1lYXJncyhzdHJ1Y3Qgc3ZjX3Jxc3QgKiwgdTMyICosCitpbnQgbmZzM3N2Y19kZWNvZGVfcmVuYW1lYXJncyhzdHJ1Y3Qgc3ZjX3Jxc3QgKiwgX19iZTMyICosCiAJCQkJc3RydWN0IG5mc2QzX3JlbmFtZWFyZ3MgKik7Ci1pbnQgbmZzM3N2Y19kZWNvZGVfcmVhZGxpbmthcmdzKHN0cnVjdCBzdmNfcnFzdCAqLCB1MzIgKiwKK2ludCBuZnMzc3ZjX2RlY29kZV9yZWFkbGlua2FyZ3Moc3RydWN0IHN2Y19ycXN0ICosIF9fYmUzMiAqLAogCQkJCXN0cnVjdCBuZnNkM19yZWFkbGlua2FyZ3MgKik7Ci1pbnQgbmZzM3N2Y19kZWNvZGVfbGlua2FyZ3Moc3RydWN0IHN2Y19ycXN0ICosIHUzMiAqLAoraW50IG5mczNzdmNfZGVjb2RlX2xpbmthcmdzKHN0cnVjdCBzdmNfcnFzdCAqLCBfX2JlMzIgKiwKIAkJCQlzdHJ1Y3QgbmZzZDNfbGlua2FyZ3MgKik7Ci1pbnQgbmZzM3N2Y19kZWNvZGVfc3ltbGlua2FyZ3Moc3RydWN0IHN2Y19ycXN0ICosIHUzMiAqLAoraW50IG5mczNzdmNfZGVjb2RlX3N5bWxpbmthcmdzKHN0cnVjdCBzdmNfcnFzdCAqLCBfX2JlMzIgKiwKIAkJCQlzdHJ1Y3QgbmZzZDNfc3ltbGlua2FyZ3MgKik7Ci1pbnQgbmZzM3N2Y19kZWNvZGVfcmVhZGRpcmFyZ3Moc3RydWN0IHN2Y19ycXN0ICosIHUzMiAqLAoraW50IG5mczNzdmNfZGVjb2RlX3JlYWRkaXJhcmdzKHN0cnVjdCBzdmNfcnFzdCAqLCBfX2JlMzIgKiwKIAkJCQlzdHJ1Y3QgbmZzZDNfcmVhZGRpcmFyZ3MgKik7Ci1pbnQgbmZzM3N2Y19kZWNvZGVfcmVhZGRpcnBsdXNhcmdzKHN0cnVjdCBzdmNfcnFzdCAqLCB1MzIgKiwKK2ludCBuZnMzc3ZjX2RlY29kZV9yZWFkZGlycGx1c2FyZ3Moc3RydWN0IHN2Y19ycXN0ICosIF9fYmUzMiAqLAogCQkJCXN0cnVjdCBuZnNkM19yZWFkZGlyYXJncyAqKTsKLWludCBuZnMzc3ZjX2RlY29kZV9jb21taXRhcmdzKHN0cnVjdCBzdmNfcnFzdCAqLCB1MzIgKiwKK2ludCBuZnMzc3ZjX2RlY29kZV9jb21taXRhcmdzKHN0cnVjdCBzdmNfcnFzdCAqLCBfX2JlMzIgKiwKIAkJCQlzdHJ1Y3QgbmZzZDNfY29tbWl0YXJncyAqKTsKLWludCBuZnMzc3ZjX2VuY29kZV92b2lkcmVzKHN0cnVjdCBzdmNfcnFzdCAqLCB1MzIgKiwgdm9pZCAqKTsKLWludCBuZnMzc3ZjX2VuY29kZV9hdHRyc3RhdChzdHJ1Y3Qgc3ZjX3Jxc3QgKiwgdTMyICosCitpbnQgbmZzM3N2Y19lbmNvZGVfdm9pZHJlcyhzdHJ1Y3Qgc3ZjX3Jxc3QgKiwgX19iZTMyICosIHZvaWQgKik7CitpbnQgbmZzM3N2Y19lbmNvZGVfYXR0cnN0YXQoc3RydWN0IHN2Y19ycXN0ICosIF9fYmUzMiAqLAogCQkJCXN0cnVjdCBuZnNkM19hdHRyc3RhdCAqKTsKLWludCBuZnMzc3ZjX2VuY29kZV93Y2NzdGF0KHN0cnVjdCBzdmNfcnFzdCAqLCB1MzIgKiwKK2ludCBuZnMzc3ZjX2VuY29kZV93Y2NzdGF0KHN0cnVjdCBzdmNfcnFzdCAqLCBfX2JlMzIgKiwKIAkJCQlzdHJ1Y3QgbmZzZDNfYXR0cnN0YXQgKik7Ci1pbnQgbmZzM3N2Y19lbmNvZGVfZGlyb3ByZXMoc3RydWN0IHN2Y19ycXN0ICosIHUzMiAqLAoraW50IG5mczNzdmNfZW5jb2RlX2Rpcm9wcmVzKHN0cnVjdCBzdmNfcnFzdCAqLCBfX2JlMzIgKiwKIAkJCQlzdHJ1Y3QgbmZzZDNfZGlyb3ByZXMgKik7Ci1pbnQgbmZzM3N2Y19lbmNvZGVfYWNjZXNzcmVzKHN0cnVjdCBzdmNfcnFzdCAqLCB1MzIgKiwKK2ludCBuZnMzc3ZjX2VuY29kZV9hY2Nlc3NyZXMoc3RydWN0IHN2Y19ycXN0ICosIF9fYmUzMiAqLAogCQkJCXN0cnVjdCBuZnNkM19hY2Nlc3NyZXMgKik7Ci1pbnQgbmZzM3N2Y19lbmNvZGVfcmVhZGxpbmtyZXMoc3RydWN0IHN2Y19ycXN0ICosIHUzMiAqLAoraW50IG5mczNzdmNfZW5jb2RlX3JlYWRsaW5rcmVzKHN0cnVjdCBzdmNfcnFzdCAqLCBfX2JlMzIgKiwKIAkJCQlzdHJ1Y3QgbmZzZDNfcmVhZGxpbmtyZXMgKik7Ci1pbnQgbmZzM3N2Y19lbmNvZGVfcmVhZHJlcyhzdHJ1Y3Qgc3ZjX3Jxc3QgKiwgdTMyICosIHN0cnVjdCBuZnNkM19yZWFkcmVzICopOwotaW50IG5mczNzdmNfZW5jb2RlX3dyaXRlcmVzKHN0cnVjdCBzdmNfcnFzdCAqLCB1MzIgKiwgc3RydWN0IG5mc2QzX3dyaXRlcmVzICopOwotaW50IG5mczNzdmNfZW5jb2RlX2NyZWF0ZXJlcyhzdHJ1Y3Qgc3ZjX3Jxc3QgKiwgdTMyICosCitpbnQgbmZzM3N2Y19lbmNvZGVfcmVhZHJlcyhzdHJ1Y3Qgc3ZjX3Jxc3QgKiwgX19iZTMyICosIHN0cnVjdCBuZnNkM19yZWFkcmVzICopOworaW50IG5mczNzdmNfZW5jb2RlX3dyaXRlcmVzKHN0cnVjdCBzdmNfcnFzdCAqLCBfX2JlMzIgKiwgc3RydWN0IG5mc2QzX3dyaXRlcmVzICopOworaW50IG5mczNzdmNfZW5jb2RlX2NyZWF0ZXJlcyhzdHJ1Y3Qgc3ZjX3Jxc3QgKiwgX19iZTMyICosCiAJCQkJc3RydWN0IG5mc2QzX2Rpcm9wcmVzICopOwotaW50IG5mczNzdmNfZW5jb2RlX3JlbmFtZXJlcyhzdHJ1Y3Qgc3ZjX3Jxc3QgKiwgdTMyICosCitpbnQgbmZzM3N2Y19lbmNvZGVfcmVuYW1lcmVzKHN0cnVjdCBzdmNfcnFzdCAqLCBfX2JlMzIgKiwKIAkJCQlzdHJ1Y3QgbmZzZDNfcmVuYW1lcmVzICopOwotaW50IG5mczNzdmNfZW5jb2RlX2xpbmtyZXMoc3RydWN0IHN2Y19ycXN0ICosIHUzMiAqLAoraW50IG5mczNzdmNfZW5jb2RlX2xpbmtyZXMoc3RydWN0IHN2Y19ycXN0ICosIF9fYmUzMiAqLAogCQkJCXN0cnVjdCBuZnNkM19saW5rcmVzICopOwotaW50IG5mczNzdmNfZW5jb2RlX3JlYWRkaXJyZXMoc3RydWN0IHN2Y19ycXN0ICosIHUzMiAqLAoraW50IG5mczNzdmNfZW5jb2RlX3JlYWRkaXJyZXMoc3RydWN0IHN2Y19ycXN0ICosIF9fYmUzMiAqLAogCQkJCXN0cnVjdCBuZnNkM19yZWFkZGlycmVzICopOwotaW50IG5mczNzdmNfZW5jb2RlX2Zzc3RhdHJlcyhzdHJ1Y3Qgc3ZjX3Jxc3QgKiwgdTMyICosCitpbnQgbmZzM3N2Y19lbmNvZGVfZnNzdGF0cmVzKHN0cnVjdCBzdmNfcnFzdCAqLCBfX2JlMzIgKiwKIAkJCQlzdHJ1Y3QgbmZzZDNfZnNzdGF0cmVzICopOwotaW50IG5mczNzdmNfZW5jb2RlX2ZzaW5mb3JlcyhzdHJ1Y3Qgc3ZjX3Jxc3QgKiwgdTMyICosCitpbnQgbmZzM3N2Y19lbmNvZGVfZnNpbmZvcmVzKHN0cnVjdCBzdmNfcnFzdCAqLCBfX2JlMzIgKiwKIAkJCQlzdHJ1Y3QgbmZzZDNfZnNpbmZvcmVzICopOwotaW50IG5mczNzdmNfZW5jb2RlX3BhdGhjb25mcmVzKHN0cnVjdCBzdmNfcnFzdCAqLCB1MzIgKiwKK2ludCBuZnMzc3ZjX2VuY29kZV9wYXRoY29uZnJlcyhzdHJ1Y3Qgc3ZjX3Jxc3QgKiwgX19iZTMyICosCiAJCQkJc3RydWN0IG5mc2QzX3BhdGhjb25mcmVzICopOwotaW50IG5mczNzdmNfZW5jb2RlX2NvbW1pdHJlcyhzdHJ1Y3Qgc3ZjX3Jxc3QgKiwgdTMyICosCitpbnQgbmZzM3N2Y19lbmNvZGVfY29tbWl0cmVzKHN0cnVjdCBzdmNfcnFzdCAqLCBfX2JlMzIgKiwKIAkJCQlzdHJ1Y3QgbmZzZDNfY29tbWl0cmVzICopOwogCi1pbnQgbmZzM3N2Y19yZWxlYXNlX2ZoYW5kbGUoc3RydWN0IHN2Y19ycXN0ICosIHUzMiAqLAoraW50IG5mczNzdmNfcmVsZWFzZV9maGFuZGxlKHN0cnVjdCBzdmNfcnFzdCAqLCBfX2JlMzIgKiwKIAkJCQlzdHJ1Y3QgbmZzZDNfYXR0cnN0YXQgKik7Ci1pbnQgbmZzM3N2Y19yZWxlYXNlX2ZoYW5kbGUyKHN0cnVjdCBzdmNfcnFzdCAqLCB1MzIgKiwKK2ludCBuZnMzc3ZjX3JlbGVhc2VfZmhhbmRsZTIoc3RydWN0IHN2Y19ycXN0ICosIF9fYmUzMiAqLAogCQkJCXN0cnVjdCBuZnNkM19maGFuZGxlX3BhaXIgKik7CiBpbnQgbmZzM3N2Y19lbmNvZGVfZW50cnkoc3RydWN0IHJlYWRkaXJfY2QgKiwgY29uc3QgY2hhciAqbmFtZSwKIAkJCQlpbnQgbmFtbGVuLCBsb2ZmX3Qgb2Zmc2V0LCBpbm9fdCBpbm8sCkBAIC0zMzgsOSArMzM4LDkgQEAKIAkJCQlpbnQgbmFtbGVuLCBsb2ZmX3Qgb2Zmc2V0LCBpbm9fdCBpbm8sCiAJCQkJdW5zaWduZWQgaW50KTsKIC8qIEhlbHBlciBmdW5jdGlvbnMgZm9yIE5GU3YzIEFDTCBjb2RlICovCi11MzIgKm5mczNzdmNfZW5jb2RlX3Bvc3Rfb3BfYXR0cihzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCB1MzIgKnAsCitfX2JlMzIgKm5mczNzdmNfZW5jb2RlX3Bvc3Rfb3BfYXR0cihzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCBfX2JlMzIgKnAsCiAJCQkJc3RydWN0IHN2Y19maCAqZmhwKTsKLXUzMiAqbmZzM3N2Y19kZWNvZGVfZmgodTMyICpwLCBzdHJ1Y3Qgc3ZjX2ZoICpmaHApOworX19iZTMyICpuZnMzc3ZjX2RlY29kZV9maChfX2JlMzIgKnAsIHN0cnVjdCBzdmNfZmggKmZocCk7CiAKIAogI2VuZGlmIC8qIF9MSU5VWF9ORlNEX1hEUjNfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9uZnNkL3hkcjQuaCBiL2luY2x1ZGUvbGludXgvbmZzZC94ZHI0LmgKaW5kZXggNjZlNjQyNy4uNDVjYTAxYiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9uZnNkL3hkcjQuaAorKysgYi9pbmNsdWRlL2xpbnV4L25mc2QveGRyNC5oCkBAIC0yNTgsOSArMjU4LDkgQEAKIAlzdHJ1Y3Qgc3ZjX2ZoICogcmRfZmhwOyAgICAgICAgICAgICAvKiByZXNwb25zZSAqLwogCiAJc3RydWN0IHJlYWRkaXJfY2QJY29tbW9uOwotCXUzMiAqCQkJYnVmZmVyOworCV9fYmUzMiAqCQlidWZmZXI7CiAJaW50CQkJYnVmbGVuOwotCXUzMiAqCQkJb2Zmc2V0OworCV9fYmUzMiAqCQlvZmZzZXQ7CiB9OwogCiBzdHJ1Y3QgbmZzZDRfcmVsZWFzZV9sb2Nrb3duZXIgewpAQCAtMzM0LDcgKzMzNCw3IEBACiAKIHN0cnVjdCBuZnNkNF9vcCB7CiAJaW50CQkJCQlvcG51bTsKLQlpbnQJCQkJCXN0YXR1czsKKwlfX2JlMzIJCQkJCXN0YXR1czsKIAl1bmlvbiB7CiAJCXN0cnVjdCBuZnNkNF9hY2Nlc3MJCWFjY2VzczsKIAkJc3RydWN0IG5mc2Q0X2Nsb3NlCQljbG9zZTsKQEAgLTM3MSwxMiArMzcxLDEyIEBACiAKIHN0cnVjdCBuZnNkNF9jb21wb3VuZGFyZ3MgewogCS8qIHNjcmF0Y2ggdmFyaWFibGVzIGZvciBYRFIgZGVjb2RlICovCi0JdTMyICoJCQkJcDsKLQl1MzIgKgkJCQllbmQ7CisJX19iZTMyICoJCQlwOworCV9fYmUzMiAqCQkJZW5kOwogCXN0cnVjdCBwYWdlICoqCQkJcGFnZWxpc3Q7CiAJaW50CQkJCXBhZ2VsZW47Ci0JdTMyCQkJCXRtcFs4XTsKLQl1MzIgKgkJCQl0bXBwOworCV9fYmUzMgkJCQl0bXBbOF07CisJX19iZTMyICoJCQl0bXBwOwogCXN0cnVjdCB0bXBidWYgewogCQlzdHJ1Y3QgdG1wYnVmICpuZXh0OwogCQl2b2lkICgqcmVsZWFzZSkoY29uc3Qgdm9pZCAqKTsKQEAgLTM5NSwxNSArMzk1LDE1IEBACiAKIHN0cnVjdCBuZnNkNF9jb21wb3VuZHJlcyB7CiAJLyogc2NyYXRjaCB2YXJpYWJsZXMgZm9yIFhEUiBlbmNvZGUgKi8KLQl1MzIgKgkJCQlwOwotCXUzMiAqCQkJCWVuZDsKKwlfX2JlMzIgKgkJCXA7CisJX19iZTMyICoJCQllbmQ7CiAJc3RydWN0IHhkcl9idWYgKgkJeGJ1ZjsKIAlzdHJ1Y3Qgc3ZjX3Jxc3QgKgkJcnFzdHA7CiAKIAl1MzIJCQkJdGFnbGVuOwogCWNoYXIgKgkJCQl0YWc7CiAJdTMyCQkJCW9wY250OwotCXUzMiAqCQkJCXRhZ3A7IC8qIHdoZXJlIHRvIGVuY29kZSB0YWcgYW5kICBvcGNvdW50ICovCisJX19iZTMyICoJCQl0YWdwOyAvKiB3aGVyZSB0byBlbmNvZGUgdGFnIGFuZCAgb3Bjb3VudCAqLwogfTsKIAogI2RlZmluZSBORlM0X1NWQ19YRFJTSVpFCQlzaXplb2Yoc3RydWN0IG5mc2Q0X2NvbXBvdW5kYXJncykKQEAgLTQxOSw0NSArNDE5LDQ1IEBACiAJY2luZm8tPmFmdGVyX2N0aW1lX25zZWMgPSBmaHAtPmZoX3Bvc3RfY3RpbWUudHZfbnNlYzsKIH0KIAotaW50IG5mczRzdmNfZW5jb2RlX3ZvaWRyZXMoc3RydWN0IHN2Y19ycXN0ICosIHUzMiAqLCB2b2lkICopOwotaW50IG5mczRzdmNfZGVjb2RlX2NvbXBvdW5kYXJncyhzdHJ1Y3Qgc3ZjX3Jxc3QgKiwgdTMyICosIAoraW50IG5mczRzdmNfZW5jb2RlX3ZvaWRyZXMoc3RydWN0IHN2Y19ycXN0ICosIF9fYmUzMiAqLCB2b2lkICopOworaW50IG5mczRzdmNfZGVjb2RlX2NvbXBvdW5kYXJncyhzdHJ1Y3Qgc3ZjX3Jxc3QgKiwgX19iZTMyICosCiAJCXN0cnVjdCBuZnNkNF9jb21wb3VuZGFyZ3MgKik7Ci1pbnQgbmZzNHN2Y19lbmNvZGVfY29tcG91bmRyZXMoc3RydWN0IHN2Y19ycXN0ICosIHUzMiAqLCAKK2ludCBuZnM0c3ZjX2VuY29kZV9jb21wb3VuZHJlcyhzdHJ1Y3Qgc3ZjX3Jxc3QgKiwgX19iZTMyICosCiAJCXN0cnVjdCBuZnNkNF9jb21wb3VuZHJlcyAqKTsKIHZvaWQgbmZzZDRfZW5jb2RlX29wZXJhdGlvbihzdHJ1Y3QgbmZzZDRfY29tcG91bmRyZXMgKiwgc3RydWN0IG5mc2Q0X29wICopOwogdm9pZCBuZnNkNF9lbmNvZGVfcmVwbGF5KHN0cnVjdCBuZnNkNF9jb21wb3VuZHJlcyAqcmVzcCwgc3RydWN0IG5mc2Q0X29wICpvcCk7Ci1pbnQgbmZzZDRfZW5jb2RlX2ZhdHRyKHN0cnVjdCBzdmNfZmggKmZocCwgc3RydWN0IHN2Y19leHBvcnQgKmV4cCwKLQkJICAgICAgIHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgdTMyICpidWZmZXIsIGludCAqY291bnRwLCAKK19fYmUzMiBuZnNkNF9lbmNvZGVfZmF0dHIoc3RydWN0IHN2Y19maCAqZmhwLCBzdHJ1Y3Qgc3ZjX2V4cG9ydCAqZXhwLAorCQkgICAgICAgc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBfX2JlMzIgKmJ1ZmZlciwgaW50ICpjb3VudHAsCiAJCSAgICAgICB1MzIgKmJtdmFsLCBzdHJ1Y3Qgc3ZjX3Jxc3QgKik7Ci1leHRlcm4gaW50IG5mc2Q0X3NldGNsaWVudGlkKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIAorZXh0ZXJuIF9fYmUzMiBuZnNkNF9zZXRjbGllbnRpZChzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLAogCQlzdHJ1Y3QgbmZzZDRfc2V0Y2xpZW50aWQgKnNldGNsaWQpOwotZXh0ZXJuIGludCBuZnNkNF9zZXRjbGllbnRpZF9jb25maXJtKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIAorZXh0ZXJuIF9fYmUzMiBuZnNkNF9zZXRjbGllbnRpZF9jb25maXJtKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsCiAJCXN0cnVjdCBuZnNkNF9zZXRjbGllbnRpZF9jb25maXJtICpzZXRjbGllbnRpZF9jb25maXJtKTsKLWV4dGVybiBpbnQgbmZzZDRfcHJvY2Vzc19vcGVuMShzdHJ1Y3QgbmZzZDRfb3BlbiAqb3Blbik7Ci1leHRlcm4gaW50IG5mc2Q0X3Byb2Nlc3Nfb3BlbjIoc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgCitleHRlcm4gX19iZTMyIG5mc2Q0X3Byb2Nlc3Nfb3BlbjEoc3RydWN0IG5mc2Q0X29wZW4gKm9wZW4pOworZXh0ZXJuIF9fYmUzMiBuZnNkNF9wcm9jZXNzX29wZW4yKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsCiAJCXN0cnVjdCBzdmNfZmggKmN1cnJlbnRfZmgsIHN0cnVjdCBuZnNkNF9vcGVuICpvcGVuKTsKLWV4dGVybiBpbnQgbmZzZDRfb3Blbl9jb25maXJtKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIAorZXh0ZXJuIF9fYmUzMiBuZnNkNF9vcGVuX2NvbmZpcm0oc3RydWN0IHN2Y19ycXN0ICpycXN0cCwKIAkJc3RydWN0IHN2Y19maCAqY3VycmVudF9maCwgc3RydWN0IG5mc2Q0X29wZW5fY29uZmlybSAqb2MsCiAJCXN0cnVjdCBuZnM0X3N0YXRlb3duZXIgKiopOwotZXh0ZXJuICBpbnQgbmZzZDRfY2xvc2Uoc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgc3RydWN0IHN2Y19maCAqY3VycmVudF9maCwgCitleHRlcm4gX19iZTMyIG5mc2Q0X2Nsb3NlKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHN0cnVjdCBzdmNfZmggKmN1cnJlbnRfZmgsCiAJCXN0cnVjdCBuZnNkNF9jbG9zZSAqY2xvc2UsCiAJCXN0cnVjdCBuZnM0X3N0YXRlb3duZXIgKipyZXBsYXlfb3duZXIpOwotZXh0ZXJuIGludCBuZnNkNF9vcGVuX2Rvd25ncmFkZShzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCAKK2V4dGVybiBfX2JlMzIgbmZzZDRfb3Blbl9kb3duZ3JhZGUoc3RydWN0IHN2Y19ycXN0ICpycXN0cCwKIAkJc3RydWN0IHN2Y19maCAqY3VycmVudF9maCwgc3RydWN0IG5mc2Q0X29wZW5fZG93bmdyYWRlICpvZCwKIAkJc3RydWN0IG5mczRfc3RhdGVvd25lciAqKnJlcGxheV9vd25lcik7Ci1leHRlcm4gaW50IG5mc2Q0X2xvY2soc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgc3RydWN0IHN2Y19maCAqY3VycmVudF9maCwgCitleHRlcm4gX19iZTMyIG5mc2Q0X2xvY2soc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgc3RydWN0IHN2Y19maCAqY3VycmVudF9maCwKIAkJc3RydWN0IG5mc2Q0X2xvY2sgKmxvY2ssCiAJCXN0cnVjdCBuZnM0X3N0YXRlb3duZXIgKipyZXBsYXlfb3duZXIpOwotZXh0ZXJuIGludCBuZnNkNF9sb2NrdChzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCBzdHJ1Y3Qgc3ZjX2ZoICpjdXJyZW50X2ZoLCAKK2V4dGVybiBfX2JlMzIgbmZzZDRfbG9ja3Qoc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgc3RydWN0IHN2Y19maCAqY3VycmVudF9maCwKIAkJc3RydWN0IG5mc2Q0X2xvY2t0ICpsb2NrdCk7Ci1leHRlcm4gaW50IG5mc2Q0X2xvY2t1KHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHN0cnVjdCBzdmNfZmggKmN1cnJlbnRfZmgsIAorZXh0ZXJuIF9fYmUzMiBuZnNkNF9sb2NrdShzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCBzdHJ1Y3Qgc3ZjX2ZoICpjdXJyZW50X2ZoLAogCQlzdHJ1Y3QgbmZzZDRfbG9ja3UgKmxvY2t1LAogCQlzdHJ1Y3QgbmZzNF9zdGF0ZW93bmVyICoqcmVwbGF5X293bmVyKTsKLWV4dGVybiBpbnQKK2V4dGVybiBfX2JlMzIKIG5mc2Q0X3JlbGVhc2VfbG9ja293bmVyKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsCiAJCXN0cnVjdCBuZnNkNF9yZWxlYXNlX2xvY2tvd25lciAqcmxvY2tvd25lcik7CiBleHRlcm4gdm9pZCBuZnNkNF9yZWxlYXNlX2NvbXBvdW5kYXJncyhzdHJ1Y3QgbmZzZDRfY29tcG91bmRhcmdzICopOwotZXh0ZXJuIGludCBuZnNkNF9kZWxlZ3JldHVybihzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLAorZXh0ZXJuIF9fYmUzMiBuZnNkNF9kZWxlZ3JldHVybihzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLAogCQlzdHJ1Y3Qgc3ZjX2ZoICpjdXJyZW50X2ZoLCBzdHJ1Y3QgbmZzZDRfZGVsZWdyZXR1cm4gKmRyKTsKICNlbmRpZgogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L25vZGVtYXNrLmggYi9pbmNsdWRlL2xpbnV4L25vZGVtYXNrLmgKaW5kZXggNWRjZTVjMi4uYjEwNjNlOSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9ub2RlbWFzay5oCisrKyBiL2luY2x1ZGUvbGludXgvbm9kZW1hc2suaApAQCAtOCw4ICs4LDggQEAKICAqIFNlZSBkZXRhaWxlZCBjb21tZW50cyBpbiB0aGUgZmlsZSBsaW51eC9iaXRtYXAuaCBkZXNjcmliaW5nIHRoZQogICogZGF0YSB0eXBlIG9uIHdoaWNoIHRoZXNlIG5vZGVtYXNrcyBhcmUgYmFzZWQuCiAgKgotICogRm9yIGRldGFpbHMgb2Ygbm9kZW1hc2tfc2NucHJpbnRmKCkgYW5kIG5vZGVtYXNrX3BhcnNlKCksCi0gKiBzZWUgYml0bWFwX3NjbnByaW50ZigpIGFuZCBiaXRtYXBfcGFyc2UoKSBpbiBsaWIvYml0bWFwLmMuCisgKiBGb3IgZGV0YWlscyBvZiBub2RlbWFza19zY25wcmludGYoKSBhbmQgbm9kZW1hc2tfcGFyc2VfdXNlcigpLAorICogc2VlIGJpdG1hcF9zY25wcmludGYoKSBhbmQgYml0bWFwX3BhcnNlX3VzZXIoKSBpbiBsaWIvYml0bWFwLmMuCiAgKiBGb3IgZGV0YWlscyBvZiBub2RlbGlzdF9zY25wcmludGYoKSBhbmQgbm9kZWxpc3RfcGFyc2UoKSwgc2VlCiAgKiBiaXRtYXBfc2NubGlzdHByaW50ZigpIGFuZCBiaXRtYXBfcGFyc2VsaXN0KCksIGFsc28gaW4gYml0bWFwLmMuCiAgKiBGb3IgZGV0YWlscyBvZiBub2RlX3JlbWFwKCksIHNlZSBiaXRtYXBfYml0cmVtYXAgaW4gbGliL2JpdG1hcC5jLgpAQCAtNTEsNyArNTEsNyBAQAogICogdW5zaWduZWQgbG9uZyAqbm9kZXNfYWRkcihtYXNrKQlBcnJheSBvZiB1bnNpZ25lZCBsb25nJ3MgaW4gbWFzawogICoKICAqIGludCBub2RlbWFza19zY25wcmludGYoYnVmLCBsZW4sIG1hc2spIEZvcm1hdCBub2RlbWFzayBmb3IgcHJpbnRpbmcKLSAqIGludCBub2RlbWFza19wYXJzZSh1YnVmLCB1bGVuLCBtYXNrKQlQYXJzZSBhc2NpaSBzdHJpbmcgYXMgbm9kZW1hc2sKKyAqIGludCBub2RlbWFza19wYXJzZV91c2VyKHVidWYsIHVsZW4sIG1hc2spCVBhcnNlIGFzY2lpIHN0cmluZyBhcyBub2RlbWFzawogICogaW50IG5vZGVsaXN0X3NjbnByaW50ZihidWYsIGxlbiwgbWFzaykgRm9ybWF0IG5vZGVtYXNrIGFzIGxpc3QgZm9yIHByaW50aW5nCiAgKiBpbnQgbm9kZWxpc3RfcGFyc2UoYnVmLCBtYXApCQlQYXJzZSBhc2NpaSBzdHJpbmcgYXMgbm9kZWxpc3QKICAqIGludCBub2RlX3JlbWFwKG9sZGJpdCwgb2xkLCBuZXcpCW5ld2JpdCA9IG1hcChvbGQsIG5ldykob2xkYml0KQpAQCAtMjg4LDEyICsyODgsMTIgQEAKIAlyZXR1cm4gYml0bWFwX3NjbnByaW50ZihidWYsIGxlbiwgc3JjcC0+Yml0cywgbmJpdHMpOwogfQogCi0jZGVmaW5lIG5vZGVtYXNrX3BhcnNlKHVidWYsIHVsZW4sIGRzdCkgXAotCQkJX19ub2RlbWFza19wYXJzZSgodWJ1ZiksICh1bGVuKSwgJihkc3QpLCBNQVhfTlVNTk9ERVMpCi1zdGF0aWMgaW5saW5lIGludCBfX25vZGVtYXNrX3BhcnNlKGNvbnN0IGNoYXIgX191c2VyICpidWYsIGludCBsZW4sCisjZGVmaW5lIG5vZGVtYXNrX3BhcnNlX3VzZXIodWJ1ZiwgdWxlbiwgZHN0KSBcCisJCV9fbm9kZW1hc2tfcGFyc2VfdXNlcigodWJ1ZiksICh1bGVuKSwgJihkc3QpLCBNQVhfTlVNTk9ERVMpCitzdGF0aWMgaW5saW5lIGludCBfX25vZGVtYXNrX3BhcnNlX3VzZXIoY29uc3QgY2hhciBfX3VzZXIgKmJ1ZiwgaW50IGxlbiwKIAkJCQkJbm9kZW1hc2tfdCAqZHN0cCwgaW50IG5iaXRzKQogewotCXJldHVybiBiaXRtYXBfcGFyc2UoYnVmLCBsZW4sIGRzdHAtPmJpdHMsIG5iaXRzKTsKKwlyZXR1cm4gYml0bWFwX3BhcnNlX3VzZXIoYnVmLCBsZW4sIGRzdHAtPmJpdHMsIG5iaXRzKTsKIH0KIAogI2RlZmluZSBub2RlbGlzdF9zY25wcmludGYoYnVmLCBsZW4sIHNyYykgXApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9vb20uaCBiL2luY2x1ZGUvbGludXgvb29tLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWQ3NjQ2MwotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbGludXgvb29tLmgKQEAgLTAsMCArMSwxMCBAQAorI2lmbmRlZiBfX0lOQ0xVREVfTElOVVhfT09NX0gKKyNkZWZpbmUgX19JTkNMVURFX0xJTlVYX09PTV9ICisKKy8qIC9wcm9jLzxwaWQ+L29vbV9hZGogc2V0IHRvIC0xNyBwcm90ZWN0cyBmcm9tIHRoZSBvb20ta2lsbGVyICovCisjZGVmaW5lIE9PTV9ESVNBQkxFICgtMTcpCisvKiBpbmNsdXNpdmUgKi8KKyNkZWZpbmUgT09NX0FESlVTVF9NSU4gKC0xNikKKyNkZWZpbmUgT09NX0FESlVTVF9NQVggMTUKKworI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3BhZ2VtYXAuaCBiL2luY2x1ZGUvbGludXgvcGFnZW1hcC5oCmluZGV4IDY0Zjk1MDkuLmMzZTI1NWIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvcGFnZW1hcC5oCisrKyBiL2luY2x1ZGUvbGludXgvcGFnZW1hcC5oCkBAIC01MiwxOSArNTIsMjMgQEAKIHZvaWQgcmVsZWFzZV9wYWdlcyhzdHJ1Y3QgcGFnZSAqKnBhZ2VzLCBpbnQgbnIsIGludCBjb2xkKTsKIAogI2lmZGVmIENPTkZJR19OVU1BCi1leHRlcm4gc3RydWN0IHBhZ2UgKnBhZ2VfY2FjaGVfYWxsb2Moc3RydWN0IGFkZHJlc3Nfc3BhY2UgKngpOwotZXh0ZXJuIHN0cnVjdCBwYWdlICpwYWdlX2NhY2hlX2FsbG9jX2NvbGQoc3RydWN0IGFkZHJlc3Nfc3BhY2UgKngpOworZXh0ZXJuIHN0cnVjdCBwYWdlICpfX3BhZ2VfY2FjaGVfYWxsb2MoZ2ZwX3QgZ2ZwKTsKICNlbHNlCitzdGF0aWMgaW5saW5lIHN0cnVjdCBwYWdlICpfX3BhZ2VfY2FjaGVfYWxsb2MoZ2ZwX3QgZ2ZwKQoreworCXJldHVybiBhbGxvY19wYWdlcyhnZnAsIDApOworfQorI2VuZGlmCisKIHN0YXRpYyBpbmxpbmUgc3RydWN0IHBhZ2UgKnBhZ2VfY2FjaGVfYWxsb2Moc3RydWN0IGFkZHJlc3Nfc3BhY2UgKngpCiB7Ci0JcmV0dXJuIGFsbG9jX3BhZ2VzKG1hcHBpbmdfZ2ZwX21hc2soeCksIDApOworCXJldHVybiBfX3BhZ2VfY2FjaGVfYWxsb2MobWFwcGluZ19nZnBfbWFzayh4KSk7CiB9CiAKIHN0YXRpYyBpbmxpbmUgc3RydWN0IHBhZ2UgKnBhZ2VfY2FjaGVfYWxsb2NfY29sZChzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqeCkKIHsKLQlyZXR1cm4gYWxsb2NfcGFnZXMobWFwcGluZ19nZnBfbWFzayh4KXxfX0dGUF9DT0xELCAwKTsKKwlyZXR1cm4gX19wYWdlX2NhY2hlX2FsbG9jKG1hcHBpbmdfZ2ZwX21hc2soeCl8X19HRlBfQ09MRCk7CiB9Ci0jZW5kaWYKIAogdHlwZWRlZiBpbnQgZmlsbGVyX3Qodm9pZCAqLCBzdHJ1Y3QgcGFnZSAqKTsKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9wY2kuaCBiL2luY2x1ZGUvbGludXgvcGNpLmgKaW5kZXggNWM2MDRmNS4uMDliZTBmOCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9wY2kuaAorKysgYi9pbmNsdWRlL2xpbnV4L3BjaS5oCkBAIC00NDMsNiArNDQzLDcgQEAKIGV4dGVybiB2b2lkIHBjaV9yZW1vdmVfYnVzX2RldmljZShzdHJ1Y3QgcGNpX2RldiAqZGV2KTsKIGV4dGVybiB2b2lkIHBjaV9zdG9wX2J1c19kZXZpY2Uoc3RydWN0IHBjaV9kZXYgKmRldik7CiB2b2lkIHBjaV9zZXR1cF9jYXJkYnVzKHN0cnVjdCBwY2lfYnVzICpidXMpOworZXh0ZXJuIHZvaWQgcGNpX3NvcnRfYnJlYWR0aGZpcnN0KHZvaWQpOwogCiAvKiBHZW5lcmljIFBDSSBmdW5jdGlvbnMgZXhwb3J0ZWQgdG8gY2FyZCBkcml2ZXJzICovCiAKQEAgLTQ1MiwxMyArNDUzLDE4IEBACiBpbnQgcGNpX2ZpbmRfY2FwYWJpbGl0eSAoc3RydWN0IHBjaV9kZXYgKmRldiwgaW50IGNhcCk7CiBpbnQgcGNpX2ZpbmRfbmV4dF9jYXBhYmlsaXR5IChzdHJ1Y3QgcGNpX2RldiAqZGV2LCB1OCBwb3MsIGludCBjYXApOwogaW50IHBjaV9maW5kX2V4dF9jYXBhYmlsaXR5IChzdHJ1Y3QgcGNpX2RldiAqZGV2LCBpbnQgY2FwKTsKLXN0cnVjdCBwY2lfYnVzICogcGNpX2ZpbmRfbmV4dF9idXMoY29uc3Qgc3RydWN0IHBjaV9idXMgKmZyb20pOworc3RydWN0IHBjaV9idXMgKnBjaV9maW5kX25leHRfYnVzKGNvbnN0IHN0cnVjdCBwY2lfYnVzICpmcm9tKTsKIAotc3RydWN0IHBjaV9kZXYgKnBjaV9nZXRfZGV2aWNlICh1bnNpZ25lZCBpbnQgdmVuZG9yLCB1bnNpZ25lZCBpbnQgZGV2aWNlLCBzdHJ1Y3QgcGNpX2RldiAqZnJvbSk7CitzdHJ1Y3QgcGNpX2RldiAqcGNpX2dldF9kZXZpY2UodW5zaWduZWQgaW50IHZlbmRvciwgdW5zaWduZWQgaW50IGRldmljZSwKKwkJCQlzdHJ1Y3QgcGNpX2RldiAqZnJvbSk7CitzdHJ1Y3QgcGNpX2RldiAqcGNpX2dldF9kZXZpY2VfcmV2ZXJzZSh1bnNpZ25lZCBpbnQgdmVuZG9yLCB1bnNpZ25lZCBpbnQgZGV2aWNlLAorCQkJCXN0cnVjdCBwY2lfZGV2ICpmcm9tKTsKKwogc3RydWN0IHBjaV9kZXYgKnBjaV9nZXRfc3Vic3lzICh1bnNpZ25lZCBpbnQgdmVuZG9yLCB1bnNpZ25lZCBpbnQgZGV2aWNlLAogCQkJCXVuc2lnbmVkIGludCBzc192ZW5kb3IsIHVuc2lnbmVkIGludCBzc19kZXZpY2UsCiAJCQkJc3RydWN0IHBjaV9kZXYgKmZyb20pOwogc3RydWN0IHBjaV9kZXYgKnBjaV9nZXRfc2xvdCAoc3RydWN0IHBjaV9idXMgKmJ1cywgdW5zaWduZWQgaW50IGRldmZuKTsKK3N0cnVjdCBwY2lfZGV2ICpwY2lfZ2V0X2J1c19hbmRfc2xvdCAodW5zaWduZWQgaW50IGJ1cywgdW5zaWduZWQgaW50IGRldmZuKTsKIHN0cnVjdCBwY2lfZGV2ICpwY2lfZ2V0X2NsYXNzICh1bnNpZ25lZCBpbnQgY2xhc3MsIHN0cnVjdCBwY2lfZGV2ICpmcm9tKTsKIGludCBwY2lfZGV2X3ByZXNlbnQoY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmlkcyk7CiAKQEAgLTY1OCw3ICs2NjQsMTIgQEAKIHN0YXRpYyBpbmxpbmUgc3RydWN0IHBjaV9kZXYgKnBjaV9maW5kX3Nsb3QodW5zaWduZWQgaW50IGJ1cywgdW5zaWduZWQgaW50IGRldmZuKQogeyByZXR1cm4gTlVMTDsgfQogCi1zdGF0aWMgaW5saW5lIHN0cnVjdCBwY2lfZGV2ICpwY2lfZ2V0X2RldmljZSAodW5zaWduZWQgaW50IHZlbmRvciwgdW5zaWduZWQgaW50IGRldmljZSwgc3RydWN0IHBjaV9kZXYgKmZyb20pCitzdGF0aWMgaW5saW5lIHN0cnVjdCBwY2lfZGV2ICpwY2lfZ2V0X2RldmljZSh1bnNpZ25lZCBpbnQgdmVuZG9yLAorCQkJCXVuc2lnbmVkIGludCBkZXZpY2UsIHN0cnVjdCBwY2lfZGV2ICpmcm9tKQoreyByZXR1cm4gTlVMTDsgfQorCitzdGF0aWMgaW5saW5lIHN0cnVjdCBwY2lfZGV2ICpwY2lfZ2V0X2RldmljZV9yZXZlcnNlKHVuc2lnbmVkIGludCB2ZW5kb3IsCisJCQkJdW5zaWduZWQgaW50IGRldmljZSwgc3RydWN0IHBjaV9kZXYgKmZyb20pCiB7IHJldHVybiBOVUxMOyB9CiAKIHN0YXRpYyBpbmxpbmUgc3RydWN0IHBjaV9kZXYgKnBjaV9nZXRfc3Vic3lzICh1bnNpZ25lZCBpbnQgdmVuZG9yLCB1bnNpZ25lZCBpbnQgZGV2aWNlLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY2kvaG90cGx1Zy9wY2lfaG90cGx1Zy5oIGIvaW5jbHVkZS9saW51eC9wY2lfaG90cGx1Zy5oCnNpbWlsYXJpdHkgaW5kZXggOTglCnJlbmFtZSBmcm9tIGRyaXZlcnMvcGNpL2hvdHBsdWcvcGNpX2hvdHBsdWcuaApyZW5hbWUgdG8gaW5jbHVkZS9saW51eC9wY2lfaG90cGx1Zy5oCmluZGV4IDc3MjUyM2QuLmE2NzVhMDUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNpL2hvdHBsdWcvcGNpX2hvdHBsdWcuaAorKysgYi9pbmNsdWRlL2xpbnV4L3BjaV9ob3RwbHVnLmgKQEAgLTIyLDcgKzIyLDcgQEAKICAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiAgKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KICAqCi0gKiBTZW5kIGZlZWRiYWNrIHRvIDxncmVnQGtyb2FoLmNvbT4KKyAqIFNlbmQgZmVlZGJhY2sgdG8gPGtyaXN0ZW4uYy5hY2NhcmRpQGludGVsLmNvbT4KICAqCiAgKi8KICNpZm5kZWYgX1BDSV9IT1RQTFVHX0gKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvcGNpX2lkcy5oIGIvaW5jbHVkZS9saW51eC9wY2lfaWRzLmgKaW5kZXggZjA2OWRmMi4uZmE0ZTFkNyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9wY2lfaWRzLmgKKysrIGIvaW5jbHVkZS9saW51eC9wY2lfaWRzLmgKQEAgLTEyMTMsNiArMTIxMyw3IEBACiAjZGVmaW5lIFBDSV9ERVZJQ0VfSURfTlZJRElBX05WRU5FVF8yMSAgICAgICAgICAgICAgMHgwNDUxCiAjZGVmaW5lIFBDSV9ERVZJQ0VfSURfTlZJRElBX05WRU5FVF8yMiAgICAgICAgICAgICAgMHgwNDUyCiAjZGVmaW5lIFBDSV9ERVZJQ0VfSURfTlZJRElBX05WRU5FVF8yMyAgICAgICAgICAgICAgMHgwNDUzCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfTlZJRElBX05GT1JDRV9NQ1A2N19JREUgICAgICAgMHgwNTYwCiAKICNkZWZpbmUgUENJX1ZFTkRPUl9JRF9JTVMJCTB4MTBlMAogI2RlZmluZSBQQ0lfREVWSUNFX0lEX0lNU19UVDEyOAkJMHg5MTI4CkBAIC0yMzUxLDMgKzIzNTIsNSBAQAogI2RlZmluZSBQQ0lfREVWSUNFX0lEX1JNRV9ESUdJMzJfUFJPCTB4OTg5NwogI2RlZmluZSBQQ0lfREVWSUNFX0lEX1JNRV9ESUdJMzJfOAkweDk4OTgKIAorI2RlZmluZSBQQ0lfVkVORE9SX0lEX1FVSUNLTkVUCQkweDE1RTIKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9RVUlDS05FVF9YSgkweDA1MDAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvcGNpX3JlZ3MuaCBiL2luY2x1ZGUvbGludXgvcGNpX3JlZ3MuaAppbmRleCBjMzEyYTEyLi5jMzIxMzE2IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3BjaV9yZWdzLmgKKysrIGIvaW5jbHVkZS9saW51eC9wY2lfcmVncy5oCkBAIC0zNzEsNiArMzcxLDcgQEAKICNkZWZpbmUgIFBDSV9FWFBfREVWU1RBX1RSUE5ECTB4MjAJLyogVHJhbnNhY3Rpb25zIFBlbmRpbmcgKi8KICNkZWZpbmUgUENJX0VYUF9MTktDQVAJCTEyCS8qIExpbmsgQ2FwYWJpbGl0aWVzICovCiAjZGVmaW5lIFBDSV9FWFBfTE5LQ1RMCQkxNgkvKiBMaW5rIENvbnRyb2wgKi8KKyNkZWZpbmUgIFBDSV9FWFBfTE5LQ1RMX0NMS1JFUV9FTiAweDEwMAkvKiBFbmFibGUgY2xrcmVxICovCiAjZGVmaW5lIFBDSV9FWFBfTE5LU1RBCQkxOAkvKiBMaW5rIFN0YXR1cyAqLwogI2RlZmluZSBQQ0lfRVhQX1NMVENBUAkJMjAJLyogU2xvdCBDYXBhYmlsaXRpZXMgKi8KICNkZWZpbmUgUENJX0VYUF9TTFRDVEwJCTI0CS8qIFNsb3QgQ29udHJvbCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9wZXJzb25hbGl0eS5oIGIvaW5jbHVkZS9saW51eC9wZXJzb25hbGl0eS5oCmluZGV4IDgwZDc4MGUuLjAxMmNkNTUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvcGVyc29uYWxpdHkuaAorKysgYi9pbmNsdWRlL2xpbnV4L3BlcnNvbmFsaXR5LmgKQEAgLTEsNiArMSw4IEBACiAjaWZuZGVmIF9MSU5VWF9QRVJTT05BTElUWV9ICiAjZGVmaW5lIF9MSU5VWF9QRVJTT05BTElUWV9ICiAKKyNpZmRlZiBfX0tFUk5FTF9fCisKIC8qCiAgKiBIYW5kbGluZyBvZiBkaWZmZXJlbnQgQUJJcyAocGVyc29uYWxpdGllcykuCiAgKi8KQEAgLTEyLDYgKzE0LDggQEAKIGV4dGVybiBpbnQJCXVucmVnaXN0ZXJfZXhlY19kb21haW4oc3RydWN0IGV4ZWNfZG9tYWluICopOwogZXh0ZXJuIGludAkJX19zZXRfcGVyc29uYWxpdHkodW5zaWduZWQgbG9uZyk7CiAKKyNlbmRpZiAvKiBfX0tFUk5FTF9fICovCisKIC8qCiAgKiBGbGFncyBmb3IgYnVnIGVtdWxhdGlvbi4KICAqCkBAIC03MSw2ICs3NSw3IEBACiAJUEVSX01BU0sgPQkJMHgwMGZmLAogfTsKIAorI2lmZGVmIF9fS0VSTkVMX18KIAogLyoKICAqIERlc2NyaXB0aW9uIG9mIGFuIGV4ZWN1dGlvbiBkb21haW4uCkBAIC0xMDksNiArMTE0LDggQEAKICAqIENoYW5nZSBwZXJzb25hbGl0eSBvZiB0aGUgY3VycmVudGx5IHJ1bm5pbmcgcHJvY2Vzcy4KICAqLwogI2RlZmluZSBzZXRfcGVyc29uYWxpdHkocGVycykgXAotCSgoY3VycmVudC0+cGVyc29uYWxpdHkgPT0gcGVycykgPyAwIDogX19zZXRfcGVyc29uYWxpdHkocGVycykpCisJKChjdXJyZW50LT5wZXJzb25hbGl0eSA9PSAocGVycykpID8gMCA6IF9fc2V0X3BlcnNvbmFsaXR5KHBlcnMpKQorCisjZW5kaWYgLyogX19LRVJORUxfXyAqLwogCiAjZW5kaWYgLyogX0xJTlVYX1BFUlNPTkFMSVRZX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvcG0uaCBiL2luY2x1ZGUvbGludXgvcG0uaAppbmRleCA2YjI3ZTA3Li4wNzAzOTRlIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3BtLmgKKysrIGIvaW5jbHVkZS9saW51eC9wbS5oCkBAIC0xMTYsNyArMTE2LDkgQEAKICNkZWZpbmUJUE1fRElTS19QTEFURk9STQkoKF9fZm9yY2Ugc3VzcGVuZF9kaXNrX21ldGhvZF90KSAyKQogI2RlZmluZQlQTV9ESVNLX1NIVVRET1dOCSgoX19mb3JjZSBzdXNwZW5kX2Rpc2tfbWV0aG9kX3QpIDMpCiAjZGVmaW5lCVBNX0RJU0tfUkVCT09UCQkoKF9fZm9yY2Ugc3VzcGVuZF9kaXNrX21ldGhvZF90KSA0KQotI2RlZmluZQlQTV9ESVNLX01BWAkJKChfX2ZvcmNlIHN1c3BlbmRfZGlza19tZXRob2RfdCkgNSkKKyNkZWZpbmUJUE1fRElTS19URVNUCQkoKF9fZm9yY2Ugc3VzcGVuZF9kaXNrX21ldGhvZF90KSA1KQorI2RlZmluZQlQTV9ESVNLX1RFU1RQUk9DCSgoX19mb3JjZSBzdXNwZW5kX2Rpc2tfbWV0aG9kX3QpIDYpCisjZGVmaW5lCVBNX0RJU0tfTUFYCQkoKF9fZm9yY2Ugc3VzcGVuZF9kaXNrX21ldGhvZF90KSA3KQogCiBzdHJ1Y3QgcG1fb3BzIHsKIAlzdXNwZW5kX2Rpc2tfbWV0aG9kX3QgcG1fZGlza19tb2RlOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9yYWlkL2JpdG1hcC5oIGIvaW5jbHVkZS9saW51eC9yYWlkL2JpdG1hcC5oCmluZGV4IDg0ZDg4NzcuLmViZDQyYTMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvcmFpZC9iaXRtYXAuaAorKysgYi9pbmNsdWRlL2xpbnV4L3JhaWQvYml0bWFwLmgKQEAgLTE0NiwxNiArMTQ2LDE2IEBACiAKIC8qIHRoZSBzdXBlcmJsb2NrIGF0IHRoZSBmcm9udCBvZiB0aGUgYml0bWFwIGZpbGUgLS0gbGl0dGxlIGVuZGlhbiAqLwogdHlwZWRlZiBzdHJ1Y3QgYml0bWFwX3N1cGVyX3MgewotCV9fdTMyIG1hZ2ljOyAgICAgICAgLyogIDAgIEJJVE1BUF9NQUdJQyAqLwotCV9fdTMyIHZlcnNpb247ICAgICAgLyogIDQgIHRoZSBiaXRtYXAgbWFqb3IgZm9yIG5vdywgY291bGQgY2hhbmdlLi4uICovCi0JX191OCAgdXVpZFsxNl07ICAgICAvKiAgOCAgMTI4IGJpdCB1dWlkIC0gbXVzdCBtYXRjaCBtZCBkZXZpY2UgdXVpZCAqLwotCV9fdTY0IGV2ZW50czsgICAgICAgLyogMjQgIGV2ZW50IGNvdW50ZXIgZm9yIHRoZSBiaXRtYXAgKDEpKi8KLQlfX3U2NCBldmVudHNfY2xlYXJlZDsvKjMyICBldmVudCBjb3VudGVyIHdoZW4gbGFzdCBiaXQgY2xlYXJlZCAoMikgKi8KLQlfX3U2NCBzeW5jX3NpemU7ICAgIC8qIDQwICB0aGUgc2l6ZSBvZiB0aGUgbWQgZGV2aWNlJ3Mgc3luYyByYW5nZSgzKSAqLwotCV9fdTMyIHN0YXRlOyAgICAgICAgLyogNDggIGJpdG1hcCBzdGF0ZSBpbmZvcm1hdGlvbiAqLwotCV9fdTMyIGNodW5rc2l6ZTsgICAgLyogNTIgIHRoZSBiaXRtYXAgY2h1bmsgc2l6ZSBpbiBieXRlcyAqLwotCV9fdTMyIGRhZW1vbl9zbGVlcDsgLyogNTYgIHNlY29uZHMgYmV0d2VlbiBkaXNrIGZsdXNoZXMgKi8KLQlfX3UzMiB3cml0ZV9iZWhpbmQ7IC8qIDYwICBudW1iZXIgb2Ygb3V0c3RhbmRpbmcgd3JpdGUtYmVoaW5kIHdyaXRlcyAqLworCV9fbGUzMiBtYWdpYzsgICAgICAgIC8qICAwICBCSVRNQVBfTUFHSUMgKi8KKwlfX2xlMzIgdmVyc2lvbjsgICAgICAvKiAgNCAgdGhlIGJpdG1hcCBtYWpvciBmb3Igbm93LCBjb3VsZCBjaGFuZ2UuLi4gKi8KKwlfX3U4ICB1dWlkWzE2XTsgICAgICAvKiAgOCAgMTI4IGJpdCB1dWlkIC0gbXVzdCBtYXRjaCBtZCBkZXZpY2UgdXVpZCAqLworCV9fbGU2NCBldmVudHM7ICAgICAgIC8qIDI0ICBldmVudCBjb3VudGVyIGZvciB0aGUgYml0bWFwICgxKSovCisJX19sZTY0IGV2ZW50c19jbGVhcmVkOy8qMzIgIGV2ZW50IGNvdW50ZXIgd2hlbiBsYXN0IGJpdCBjbGVhcmVkICgyKSAqLworCV9fbGU2NCBzeW5jX3NpemU7ICAgIC8qIDQwICB0aGUgc2l6ZSBvZiB0aGUgbWQgZGV2aWNlJ3Mgc3luYyByYW5nZSgzKSAqLworCV9fbGUzMiBzdGF0ZTsgICAgICAgIC8qIDQ4ICBiaXRtYXAgc3RhdGUgaW5mb3JtYXRpb24gKi8KKwlfX2xlMzIgY2h1bmtzaXplOyAgICAvKiA1MiAgdGhlIGJpdG1hcCBjaHVuayBzaXplIGluIGJ5dGVzICovCisJX19sZTMyIGRhZW1vbl9zbGVlcDsgLyogNTYgIHNlY29uZHMgYmV0d2VlbiBkaXNrIGZsdXNoZXMgKi8KKwlfX2xlMzIgd3JpdGVfYmVoaW5kOyAvKiA2MCAgbnVtYmVyIG9mIG91dHN0YW5kaW5nIHdyaXRlLWJlaGluZCB3cml0ZXMgKi8KIAogCV9fdTggIHBhZFsyNTYgLSA2NF07IC8qIHNldCB0byB6ZXJvICovCiB9IGJpdG1hcF9zdXBlcl90OwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9yYWlkL21kX3AuaCBiL2luY2x1ZGUvbGludXgvcmFpZC9tZF9wLmgKaW5kZXggYjZlYmM2OS4uM2YyY2Q5OCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9yYWlkL21kX3AuaAorKysgYi9pbmNsdWRlL2xpbnV4L3JhaWQvbWRfcC5oCkBAIC0yMDYsNTIgKzIwNiw1MiBAQAogICovCiBzdHJ1Y3QgbWRwX3N1cGVyYmxvY2tfMSB7CiAJLyogY29uc3RhbnQgYXJyYXkgaW5mb3JtYXRpb24gLSAxMjggYnl0ZXMgKi8KLQlfX3UzMgltYWdpYzsJCS8qIE1EX1NCX01BR0lDOiAweGE5MmI0ZWZjIC0gbGl0dGxlIGVuZGlhbiAqLwotCV9fdTMyCW1ham9yX3ZlcnNpb247CS8qIDEgKi8KLQlfX3UzMglmZWF0dXJlX21hcDsJLyogYml0IDAgc2V0IGlmICdiaXRtYXBfb2Zmc2V0JyBpcyBtZWFuaW5nZnVsICovCi0JX191MzIJcGFkMDsJCS8qIGFsd2F5cyBzZXQgdG8gMCB3aGVuIHdyaXRpbmcgKi8KKwlfX2xlMzIJbWFnaWM7CQkvKiBNRF9TQl9NQUdJQzogMHhhOTJiNGVmYyAtIGxpdHRsZSBlbmRpYW4gKi8KKwlfX2xlMzIJbWFqb3JfdmVyc2lvbjsJLyogMSAqLworCV9fbGUzMglmZWF0dXJlX21hcDsJLyogYml0IDAgc2V0IGlmICdiaXRtYXBfb2Zmc2V0JyBpcyBtZWFuaW5nZnVsICovCisJX19sZTMyCXBhZDA7CQkvKiBhbHdheXMgc2V0IHRvIDAgd2hlbiB3cml0aW5nICovCiAKIAlfX3U4CXNldF91dWlkWzE2XTsJLyogdXNlci1zcGFjZSBnZW5lcmF0ZWQuICovCiAJY2hhcglzZXRfbmFtZVszMl07CS8qIHNldCBhbmQgaW50ZXJwcmV0ZWQgYnkgdXNlci1zcGFjZSAqLwogCi0JX191NjQJY3RpbWU7CQkvKiBsbyA0MCBiaXRzIGFyZSBzZWNvbmRzLCB0b3AgMjQgYXJlIG1pY3Jvc2Vjb25kcyBvciAwKi8KLQlfX3UzMglsZXZlbDsJCS8qIC00IChtdWx0aXBhdGgpLCAtMSAobGluZWFyKSwgMCwxLDQsNSAqLwotCV9fdTMyCWxheW91dDsJCS8qIG9ubHkgZm9yIHJhaWQ1IGFuZCByYWlkMTAgY3VycmVudGx5ICovCi0JX191NjQJc2l6ZTsJCS8qIHVzZWQgc2l6ZSBvZiBjb21wb25lbnQgZGV2aWNlcywgaW4gNTEyYnl0ZSBzZWN0b3JzICovCisJX19sZTY0CWN0aW1lOwkJLyogbG8gNDAgYml0cyBhcmUgc2Vjb25kcywgdG9wIDI0IGFyZSBtaWNyb3NlY29uZHMgb3IgMCovCisJX19sZTMyCWxldmVsOwkJLyogLTQgKG11bHRpcGF0aCksIC0xIChsaW5lYXIpLCAwLDEsNCw1ICovCisJX19sZTMyCWxheW91dDsJCS8qIG9ubHkgZm9yIHJhaWQ1IGFuZCByYWlkMTAgY3VycmVudGx5ICovCisJX19sZTY0CXNpemU7CQkvKiB1c2VkIHNpemUgb2YgY29tcG9uZW50IGRldmljZXMsIGluIDUxMmJ5dGUgc2VjdG9ycyAqLwogCi0JX191MzIJY2h1bmtzaXplOwkvKiBpbiA1MTJieXRlIHNlY3RvcnMgKi8KLQlfX3UzMglyYWlkX2Rpc2tzOwotCV9fdTMyCWJpdG1hcF9vZmZzZXQ7CS8qIHNlY3RvcnMgYWZ0ZXIgc3RhcnQgb2Ygc3VwZXJibG9jayB0aGF0IGJpdG1hcCBzdGFydHMKKwlfX2xlMzIJY2h1bmtzaXplOwkvKiBpbiA1MTJieXRlIHNlY3RvcnMgKi8KKwlfX2xlMzIJcmFpZF9kaXNrczsKKwlfX2xlMzIJYml0bWFwX29mZnNldDsJLyogc2VjdG9ycyBhZnRlciBzdGFydCBvZiBzdXBlcmJsb2NrIHRoYXQgYml0bWFwIHN0YXJ0cwogCQkJCSAqIE5PVEU6IHNpZ25lZCwgc28gYml0bWFwIGNhbiBiZSBiZWZvcmUgc3VwZXJibG9jawogCQkJCSAqIG9ubHkgbWVhbmluZ2Z1bCBvZiBmZWF0dXJlX21hcFswXSBpcyBzZXQuCiAJCQkJICovCiAKIAkvKiBUaGVzZSBhcmUgb25seSB2YWxpZCB3aXRoIGZlYXR1cmUgYml0ICc0JyAqLwotCV9fdTMyCW5ld19sZXZlbDsJLyogbmV3IGxldmVsIHdlIGFyZSByZXNoYXBpbmcgdG8JCSovCi0JX191NjQJcmVzaGFwZV9wb3NpdGlvbjsJLyogbmV4dCBhZGRyZXNzIGluIGFycmF5LXNwYWNlIGZvciByZXNoYXBlICovCi0JX191MzIJZGVsdGFfZGlza3M7CS8qIGNoYW5nZSBpbiBudW1iZXIgb2YgcmFpZF9kaXNrcwkJKi8KLQlfX3UzMgluZXdfbGF5b3V0OwkvKiBuZXcgbGF5b3V0CQkJCQkqLwotCV9fdTMyCW5ld19jaHVuazsJLyogbmV3IGNodW5rIHNpemUgKGJ5dGVzKQkJCSovCisJX19sZTMyCW5ld19sZXZlbDsJLyogbmV3IGxldmVsIHdlIGFyZSByZXNoYXBpbmcgdG8JCSovCisJX19sZTY0CXJlc2hhcGVfcG9zaXRpb247CS8qIG5leHQgYWRkcmVzcyBpbiBhcnJheS1zcGFjZSBmb3IgcmVzaGFwZSAqLworCV9fbGUzMglkZWx0YV9kaXNrczsJLyogY2hhbmdlIGluIG51bWJlciBvZiByYWlkX2Rpc2tzCQkqLworCV9fbGUzMgluZXdfbGF5b3V0OwkvKiBuZXcgbGF5b3V0CQkJCQkqLworCV9fbGUzMgluZXdfY2h1bms7CS8qIG5ldyBjaHVuayBzaXplIChieXRlcykJCQkqLwogCV9fdTgJcGFkMVsxMjgtMTI0XTsJLyogc2V0IHRvIDAgd2hlbiB3cml0dGVuICovCiAKIAkvKiBjb25zdGFudCB0aGlzLWRldmljZSBpbmZvcm1hdGlvbiAtIDY0IGJ5dGVzICovCi0JX191NjQJZGF0YV9vZmZzZXQ7CS8qIHNlY3RvciBzdGFydCBvZiBkYXRhLCBvZnRlbiAwICovCi0JX191NjQJZGF0YV9zaXplOwkvKiBzZWN0b3JzIGluIHRoaXMgZGV2aWNlIHRoYXQgY2FuIGJlIHVzZWQgZm9yIGRhdGEgKi8KLQlfX3U2NAlzdXBlcl9vZmZzZXQ7CS8qIHNlY3RvciBzdGFydCBvZiB0aGlzIHN1cGVyYmxvY2sgKi8KLQlfX3U2NAlyZWNvdmVyeV9vZmZzZXQ7Lyogc2VjdG9ycyBiZWZvcmUgdGhpcyBvZmZzZXQgKGZyb20gZGF0YV9vZmZzZXQpIGhhdmUgYmVlbiByZWNvdmVyZWQgKi8KLQlfX3UzMglkZXZfbnVtYmVyOwkvKiBwZXJtYW5lbnQgaWRlbnRpZmllciBvZiB0aGlzICBkZXZpY2UgLSBub3Qgcm9sZSBpbiByYWlkICovCi0JX191MzIJY250X2NvcnJlY3RlZF9yZWFkOyAvKiBudW1iZXIgb2YgcmVhZCBlcnJvcnMgdGhhdCB3ZXJlIGNvcnJlY3RlZCBieSByZS13cml0aW5nICovCisJX19sZTY0CWRhdGFfb2Zmc2V0OwkvKiBzZWN0b3Igc3RhcnQgb2YgZGF0YSwgb2Z0ZW4gMCAqLworCV9fbGU2NAlkYXRhX3NpemU7CS8qIHNlY3RvcnMgaW4gdGhpcyBkZXZpY2UgdGhhdCBjYW4gYmUgdXNlZCBmb3IgZGF0YSAqLworCV9fbGU2NAlzdXBlcl9vZmZzZXQ7CS8qIHNlY3RvciBzdGFydCBvZiB0aGlzIHN1cGVyYmxvY2sgKi8KKwlfX2xlNjQJcmVjb3Zlcnlfb2Zmc2V0Oy8qIHNlY3RvcnMgYmVmb3JlIHRoaXMgb2Zmc2V0IChmcm9tIGRhdGFfb2Zmc2V0KSBoYXZlIGJlZW4gcmVjb3ZlcmVkICovCisJX19sZTMyCWRldl9udW1iZXI7CS8qIHBlcm1hbmVudCBpZGVudGlmaWVyIG9mIHRoaXMgIGRldmljZSAtIG5vdCByb2xlIGluIHJhaWQgKi8KKwlfX2xlMzIJY250X2NvcnJlY3RlZF9yZWFkOyAvKiBudW1iZXIgb2YgcmVhZCBlcnJvcnMgdGhhdCB3ZXJlIGNvcnJlY3RlZCBieSByZS13cml0aW5nICovCiAJX191OAlkZXZpY2VfdXVpZFsxNl07IC8qIHVzZXItc3BhY2Ugc2V0YWJsZSwgaWdub3JlZCBieSBrZXJuZWwgKi8KIAlfX3U4CWRldmZsYWdzOwkvKiBwZXItZGV2aWNlIGZsYWdzLiAgT25seSBvbmUgZGVmaW5lZC4uLiovCiAjZGVmaW5lCVdyaXRlTW9zdGx5MQkxCS8qIG1hc2sgZm9yIHdyaXRlbW9zdGx5IGZsYWcgaW4gYWJvdmUgKi8KIAlfX3U4CXBhZDJbNjQtNTddOwkvKiBzZXQgdG8gMCB3aGVuIHdyaXRpbmcgKi8KIAogCS8qIGFycmF5IHN0YXRlIGluZm9ybWF0aW9uIC0gNjQgYnl0ZXMgKi8KLQlfX3U2NAl1dGltZTsJCS8qIDQwIGJpdHMgc2Vjb25kLCAyNCBidGVzIG1pY3Jvc2Vjb25kcyAqLwotCV9fdTY0CWV2ZW50czsJCS8qIGluY3JlbWVudGVkIHdoZW4gc3VwZXJibG9jayB1cGRhdGVkICovCi0JX191NjQJcmVzeW5jX29mZnNldDsJLyogZGF0YSBiZWZvcmUgdGhpcyBvZmZzZXQgKGZyb20gZGF0YV9vZmZzZXQpIGtub3duIHRvIGJlIGluIHN5bmMgKi8KLQlfX3UzMglzYl9jc3VtOwkvKiBjaGVja3N1bSB1cHRvIGRldnNbbWF4X2Rldl0gKi8KLQlfX3UzMgltYXhfZGV2OwkvKiBzaXplIG9mIGRldnNbXSBhcnJheSB0byBjb25zaWRlciAqLworCV9fbGU2NAl1dGltZTsJCS8qIDQwIGJpdHMgc2Vjb25kLCAyNCBidGVzIG1pY3Jvc2Vjb25kcyAqLworCV9fbGU2NAlldmVudHM7CQkvKiBpbmNyZW1lbnRlZCB3aGVuIHN1cGVyYmxvY2sgdXBkYXRlZCAqLworCV9fbGU2NAlyZXN5bmNfb2Zmc2V0OwkvKiBkYXRhIGJlZm9yZSB0aGlzIG9mZnNldCAoZnJvbSBkYXRhX29mZnNldCkga25vd24gdG8gYmUgaW4gc3luYyAqLworCV9fbGUzMglzYl9jc3VtOwkvKiBjaGVja3N1bSB1cHRvIGRldnNbbWF4X2Rldl0gKi8KKwlfX2xlMzIJbWF4X2RldjsJLyogc2l6ZSBvZiBkZXZzW10gYXJyYXkgdG8gY29uc2lkZXIgKi8KIAlfX3U4CXBhZDNbNjQtMzJdOwkvKiBzZXQgdG8gMCB3aGVuIHdyaXRpbmcgKi8KIAogCS8qIGRldmljZSBzdGF0ZSBpbmZvcm1hdGlvbi4gSW5kZXhlZCBieSBkZXZfbnVtYmVyLgpAQCAtMjYwLDcgKzI2MCw3IEBACiAJICogaW50byB0aGUgJ3JvbGVzJyB2YWx1ZS4gIElmIGEgZGV2aWNlIGlzIHNwYXJlIG9yIGZhdWx0eSwgdGhlbiBpdCBkb2Vzbid0CiAJICogaGF2ZSBhIG1lYW5pbmdmdWwgcm9sZS4KIAkgKi8KLQlfX3UxNglkZXZfcm9sZXNbMF07CS8qIHJvbGUgaW4gYXJyYXksIG9yIDB4ZmZmZiBmb3IgYSBzcGFyZSwgb3IgMHhmZmZlIGZvciBmYXVsdHkgKi8KKwlfX2xlMTYJZGV2X3JvbGVzWzBdOwkvKiByb2xlIGluIGFycmF5LCBvciAweGZmZmYgZm9yIGEgc3BhcmUsIG9yIDB4ZmZmZSBmb3IgZmF1bHR5ICovCiB9OwogCiAvKiBmZWF0dXJlX21hcCBiaXRzICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3JhbmRvbS5oIGIvaW5jbHVkZS9saW51eC9yYW5kb20uaAppbmRleCA1ZDY0NTZiLi4wMjQ4YjMwIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3JhbmRvbS5oCisrKyBiL2luY2x1ZGUvbGludXgvcmFuZG9tLmgKQEAgLTY5LDYgKzY5LDkgQEAKIHVuc2lnbmVkIGludCBnZXRfcmFuZG9tX2ludCh2b2lkKTsKIHVuc2lnbmVkIGxvbmcgcmFuZG9taXplX3JhbmdlKHVuc2lnbmVkIGxvbmcgc3RhcnQsIHVuc2lnbmVkIGxvbmcgZW5kLCB1bnNpZ25lZCBsb25nIGxlbik7CiAKK3UzMiByYW5kb20zMih2b2lkKTsKK3ZvaWQgc3JhbmRvbTMyKHUzMiBzZWVkKTsKKwogI2VuZGlmIC8qIF9fS0VSTkVMX19fICovCiAKICNlbmRpZiAvKiBfTElOVVhfUkFORE9NX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvc2NoZWQuaCBiL2luY2x1ZGUvbGludXgvc2NoZWQuaAppbmRleCA2NzM1YzFjLi5lYWZlNGE3IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3NjaGVkLmgKKysrIGIvaW5jbHVkZS9saW51eC9zY2hlZC5oCkBAIC00NjYsNyArNDY2LDYgQEAKIAlzdHJ1Y3QgcGFjY3Rfc3RydWN0IHBhY2N0OwkvKiBwZXItcHJvY2VzcyBhY2NvdW50aW5nIGluZm9ybWF0aW9uICovCiAjZW5kaWYKICNpZmRlZiBDT05GSUdfVEFTS1NUQVRTCi0Jc3BpbmxvY2tfdCBzdGF0c19sb2NrOwogCXN0cnVjdCB0YXNrc3RhdHMgKnN0YXRzOwogI2VuZGlmCiB9OwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9zZWN1cml0eS5oIGIvaW5jbHVkZS9saW51eC9zZWN1cml0eS5oCmluZGV4IDliNWZlYTguLmIyMDBiOTggMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvc2VjdXJpdHkuaAorKysgYi9pbmNsdWRlL2xpbnV4L3NlY3VyaXR5LmgKQEAgLTg4Miw3ICs4ODIsOCBAQAogICoJQ2hlY2sgcGVybWlzc2lvbiB3aGVuIGEgZmxvdyBzZWxlY3RzIGEgeGZybV9wb2xpY3kgZm9yIHByb2Nlc3NpbmcKICAqCVhGUk1zIG9uIGEgcGFja2V0LiAgVGhlIGhvb2sgaXMgY2FsbGVkIHdoZW4gc2VsZWN0aW5nIGVpdGhlciBhCiAgKglwZXItc29ja2V0IHBvbGljeSBvciBhIGdlbmVyaWMgeGZybSBwb2xpY3kuCi0gKglSZXR1cm4gMCBpZiBwZXJtaXNzaW9uIGlzIGdyYW50ZWQuCisgKglSZXR1cm4gMCBpZiBwZXJtaXNzaW9uIGlzIGdyYW50ZWQsIC1FU1JDSCBvdGhlcndpc2UsIG9yIC1lcnJubworICoJb24gb3RoZXIgZXJyb3JzLgogICogQHhmcm1fc3RhdGVfcG9sX2Zsb3dfbWF0Y2g6CiAgKglAeCBjb250YWlucyB0aGUgc3RhdGUgdG8gbWF0Y2guCiAgKglAeHAgY29udGFpbnMgdGhlIHBvbGljeSB0byBjaGVjayBmb3IgYSBtYXRjaC4KQEAgLTg5MSw2ICs4OTIsNyBAQAogICogQHhmcm1fZmxvd19zdGF0ZV9tYXRjaDoKICAqCUBmbCBjb250YWlucyB0aGUgZmxvdyBrZXkgdG8gbWF0Y2guCiAgKglAeGZybSBwb2ludHMgdG8gdGhlIHhmcm1fc3RhdGUgdG8gbWF0Y2guCisgKglAeHAgcG9pbnRzIHRvIHRoZSB4ZnJtX3BvbGljeSB0byBtYXRjaC4KICAqCVJldHVybiAxIGlmIHRoZXJlIGlzIGEgbWF0Y2guCiAgKiBAeGZybV9kZWNvZGVfc2Vzc2lvbjoKICAqCUBza2IgcG9pbnRzIHRvIHNrYiB0byBkZWNvZGUuCkBAIC0xMzg4LDcgKzEzOTAsOCBAQAogCWludCAoKnhmcm1fcG9saWN5X2xvb2t1cCkoc3RydWN0IHhmcm1fcG9saWN5ICp4cCwgdTMyIGZsX3NlY2lkLCB1OCBkaXIpOwogCWludCAoKnhmcm1fc3RhdGVfcG9sX2Zsb3dfbWF0Y2gpKHN0cnVjdCB4ZnJtX3N0YXRlICp4LAogCQkJc3RydWN0IHhmcm1fcG9saWN5ICp4cCwgc3RydWN0IGZsb3dpICpmbCk7Ci0JaW50ICgqeGZybV9mbG93X3N0YXRlX21hdGNoKShzdHJ1Y3QgZmxvd2kgKmZsLCBzdHJ1Y3QgeGZybV9zdGF0ZSAqeGZybSk7CisJaW50ICgqeGZybV9mbG93X3N0YXRlX21hdGNoKShzdHJ1Y3QgZmxvd2kgKmZsLCBzdHJ1Y3QgeGZybV9zdGF0ZSAqeGZybSwKKwkJCXN0cnVjdCB4ZnJtX3BvbGljeSAqeHApOwogCWludCAoKnhmcm1fZGVjb2RlX3Nlc3Npb24pKHN0cnVjdCBza19idWZmICpza2IsIHUzMiAqc2VjaWQsIGludCBja2FsbCk7CiAjZW5kaWYJLyogQ09ORklHX1NFQ1VSSVRZX05FVFdPUktfWEZSTSAqLwogCkBAIC0zMTIwLDExICszMTIzLDYgQEAKIAlyZXR1cm4gc2VjdXJpdHlfb3BzLT54ZnJtX3BvbGljeV9hbGxvY19zZWN1cml0eSh4cCwgc2VjX2N0eCwgTlVMTCk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgaW50IHNlY3VyaXR5X3hmcm1fc29ja19wb2xpY3lfYWxsb2Moc3RydWN0IHhmcm1fcG9saWN5ICp4cCwgc3RydWN0IHNvY2sgKnNrKQotewotCXJldHVybiBzZWN1cml0eV9vcHMtPnhmcm1fcG9saWN5X2FsbG9jX3NlY3VyaXR5KHhwLCBOVUxMLCBzayk7Ci19Ci0KIHN0YXRpYyBpbmxpbmUgaW50IHNlY3VyaXR5X3hmcm1fcG9saWN5X2Nsb25lKHN0cnVjdCB4ZnJtX3BvbGljeSAqb2xkLCBzdHJ1Y3QgeGZybV9wb2xpY3kgKm5ldykKIHsKIAlyZXR1cm4gc2VjdXJpdHlfb3BzLT54ZnJtX3BvbGljeV9jbG9uZV9zZWN1cml0eShvbGQsIG5ldyk7CkBAIC0zMTc1LDkgKzMxNzMsMTAgQEAKIAlyZXR1cm4gc2VjdXJpdHlfb3BzLT54ZnJtX3N0YXRlX3BvbF9mbG93X21hdGNoKHgsIHhwLCBmbCk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgaW50IHNlY3VyaXR5X3hmcm1fZmxvd19zdGF0ZV9tYXRjaChzdHJ1Y3QgZmxvd2kgKmZsLCBzdHJ1Y3QgeGZybV9zdGF0ZSAqeGZybSkKK3N0YXRpYyBpbmxpbmUgaW50IHNlY3VyaXR5X3hmcm1fZmxvd19zdGF0ZV9tYXRjaChzdHJ1Y3QgZmxvd2kgKmZsLAorCQkJc3RydWN0IHhmcm1fc3RhdGUgKnhmcm0sIHN0cnVjdCB4ZnJtX3BvbGljeSAqeHApCiB7Ci0JcmV0dXJuIHNlY3VyaXR5X29wcy0+eGZybV9mbG93X3N0YXRlX21hdGNoKGZsLCB4ZnJtKTsKKwlyZXR1cm4gc2VjdXJpdHlfb3BzLT54ZnJtX2Zsb3dfc3RhdGVfbWF0Y2goZmwsIHhmcm0sIHhwKTsKIH0KIAogc3RhdGljIGlubGluZSBpbnQgc2VjdXJpdHlfeGZybV9kZWNvZGVfc2Vzc2lvbihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCB1MzIgKnNlY2lkKQpAQCAtMzE5NywxMSArMzE5Niw2IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbmxpbmUgaW50IHNlY3VyaXR5X3hmcm1fc29ja19wb2xpY3lfYWxsb2Moc3RydWN0IHhmcm1fcG9saWN5ICp4cCwgc3RydWN0IHNvY2sgKnNrKQotewotCXJldHVybiAwOwotfQotCiBzdGF0aWMgaW5saW5lIGludCBzZWN1cml0eV94ZnJtX3BvbGljeV9jbG9uZShzdHJ1Y3QgeGZybV9wb2xpY3kgKm9sZCwgc3RydWN0IHhmcm1fcG9saWN5ICpuZXcpCiB7CiAJcmV0dXJuIDA7CkBAIC0zMjQ5LDcgKzMyNDMsNyBAQAogfQogCiBzdGF0aWMgaW5saW5lIGludCBzZWN1cml0eV94ZnJtX2Zsb3dfc3RhdGVfbWF0Y2goc3RydWN0IGZsb3dpICpmbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHhmcm1fc3RhdGUgKnhmcm0pCisJCQlzdHJ1Y3QgeGZybV9zdGF0ZSAqeGZybSwgc3RydWN0IHhmcm1fcG9saWN5ICp4cCkKIHsKIAlyZXR1cm4gMTsKIH0KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvc2VyaW8uaCBiL2luY2x1ZGUvbGludXgvc2VyaW8uaAppbmRleCAzYTY5N2NjLi5iOTljNWNhIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3NlcmlvLmgKKysrIGIvaW5jbHVkZS9saW51eC9zZXJpby5oCkBAIC00MSw2ICs0MSw3IEBACiAJdm9pZCAoKnN0b3ApKHN0cnVjdCBzZXJpbyAqKTsKIAogCXN0cnVjdCBzZXJpbyAqcGFyZW50LCAqY2hpbGQ7CisJdW5zaWduZWQgaW50IGRlcHRoOwkJLyogbGV2ZWwgb2YgbmVzdGluZyBpbiBzZXJpbyBoaWVyYXJjaHkgKi8KIAogCXN0cnVjdCBzZXJpb19kcml2ZXIgKmRydjsJLyogYWNjZXNzZWQgZnJvbSBpbnRlcnJ1cHQsIG11c3QgYmUgcHJvdGVjdGVkIGJ5IHNlcmlvLT5sb2NrIGFuZCBzZXJpby0+c2VtICovCiAJc3RydWN0IG11dGV4IGRydl9tdXRleDsJCS8qIHByb3RlY3RzIHNlcmlvLT5kcnYgc28gYXR0cmlidXRlcyBjYW4gcGluIGRyaXZlciAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9zdW5ycGMvbXNnX3Byb3QuaCBiL2luY2x1ZGUvbGludXgvc3VucnBjL21zZ19wcm90LmgKaW5kZXggMWU2NWYyZC4uNjA2Y2IyMSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9zdW5ycGMvbXNnX3Byb3QuaAorKysgYi9pbmNsdWRlL2xpbnV4L3N1bnJwYy9tc2dfcHJvdC5oCkBAIC01Niw3ICs1Niw5IEBACiAJUlBDX1BST0dfTUlTTUFUQ0ggPSAyLAogCVJQQ19QUk9DX1VOQVZBSUwgPSAzLAogCVJQQ19HQVJCQUdFX0FSR1MgPSA0LAotCVJQQ19TWVNURU1fRVJSID0gNQorCVJQQ19TWVNURU1fRVJSID0gNSwKKwkvKiBpbnRlcm5hbCB1c2Ugb25seSAqLworCVJQQ19EUk9QX1JFUExZID0gNjAwMDAsCiB9OwogCiBlbnVtIHJwY19yZWplY3Rfc3RhdCB7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3N1bnJwYy9zdmMuaCBiL2luY2x1ZGUvbGludXgvc3VucnBjL3N2Yy5oCmluZGV4IDljOWE4YWQuLjk2NWQ2YzIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvc3VucnBjL3N2Yy5oCisrKyBiL2luY2x1ZGUvbGludXgvc3VucnBjL3N2Yy5oCkBAIC0zMzUsNyArMzM1LDcgQEAKIC8qCiAgKiBSUEMgcHJvY2VkdXJlIGluZm8KICAqLwotdHlwZWRlZiBpbnQJKCpzdmNfcHJvY2Z1bmMpKHN0cnVjdCBzdmNfcnFzdCAqLCB2b2lkICphcmdwLCB2b2lkICpyZXNwKTsKK3R5cGVkZWYgX19iZTMyCSgqc3ZjX3Byb2NmdW5jKShzdHJ1Y3Qgc3ZjX3Jxc3QgKiwgdm9pZCAqYXJncCwgdm9pZCAqcmVzcCk7CiBzdHJ1Y3Qgc3ZjX3Byb2NlZHVyZSB7CiAJc3ZjX3Byb2NmdW5jCQlwY19mdW5jOwkvKiBwcm9jZXNzIHRoZSByZXF1ZXN0ICovCiAJa3hkcnByb2NfdAkJcGNfZGVjb2RlOwkvKiBYRFIgZGVjb2RlIGFyZ3MgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvc3VucnBjL3hkci5oIGIvaW5jbHVkZS9saW51eC9zdW5ycGMveGRyLmgKaW5kZXggOTUzNzIzYi4uYWM2OWU1NSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9zdW5ycGMveGRyLmgKKysrIGIvaW5jbHVkZS9saW51eC9zdW5ycGMveGRyLmgKQEAgLTc0LDYgKzc0LDcgQEAKICNkZWZpbmUJcnBjX3Byb2NfdW5hdmFpbAlfX2NvbnN0YW50X2h0b25sKFJQQ19QUk9DX1VOQVZBSUwpCiAjZGVmaW5lCXJwY19nYXJiYWdlX2FyZ3MJX19jb25zdGFudF9odG9ubChSUENfR0FSQkFHRV9BUkdTKQogI2RlZmluZQlycGNfc3lzdGVtX2VycgkJX19jb25zdGFudF9odG9ubChSUENfU1lTVEVNX0VSUikKKyNkZWZpbmUJcnBjX2Ryb3BfcmVwbHkJCV9fY29uc3RhbnRfaHRvbmwoUlBDX0RST1BfUkVQTFkpCiAKICNkZWZpbmUJcnBjX2F1dGhfb2sJCV9fY29uc3RhbnRfaHRvbmwoUlBDX0FVVEhfT0spCiAjZGVmaW5lCXJwY19hdXRoZXJyX2JhZGNyZWQJX19jb25zdGFudF9odG9ubChSUENfQVVUSF9CQURDUkVEKQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9zeXNjYWxscy5oIGIvaW5jbHVkZS9saW51eC9zeXNjYWxscy5oCmluZGV4IGIwYWNlM2YuLjE5MTJjNmMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvc3lzY2FsbHMuaAorKysgYi9pbmNsdWRlL2xpbnV4L3N5c2NhbGxzLmgKQEAgLTQzMSw2ICs0MzEsMTAgQEAKIAkJCQlzdHJ1Y3QgZXBvbGxfZXZlbnQgX191c2VyICpldmVudCk7CiBhc21saW5rYWdlIGxvbmcgc3lzX2Vwb2xsX3dhaXQoaW50IGVwZmQsIHN0cnVjdCBlcG9sbF9ldmVudCBfX3VzZXIgKmV2ZW50cywKIAkJCQlpbnQgbWF4ZXZlbnRzLCBpbnQgdGltZW91dCk7Cithc21saW5rYWdlIGxvbmcgc3lzX2Vwb2xsX3B3YWl0KGludCBlcGZkLCBzdHJ1Y3QgZXBvbGxfZXZlbnQgX191c2VyICpldmVudHMsCisJCQkJaW50IG1heGV2ZW50cywgaW50IHRpbWVvdXQsCisJCQkJY29uc3Qgc2lnc2V0X3QgX191c2VyICpzaWdtYXNrLAorCQkJCXNpemVfdCBzaWdzZXRzaXplKTsKIGFzbWxpbmthZ2UgbG9uZyBzeXNfZ2V0aG9zdG5hbWUoY2hhciBfX3VzZXIgKm5hbWUsIGludCBsZW4pOwogYXNtbGlua2FnZSBsb25nIHN5c19zZXRob3N0bmFtZShjaGFyIF9fdXNlciAqbmFtZSwgaW50IGxlbik7CiBhc21saW5rYWdlIGxvbmcgc3lzX3NldGRvbWFpbm5hbWUoY2hhciBfX3VzZXIgKm5hbWUsIGludCBsZW4pOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9zeXNjdGwuaCBiL2luY2x1ZGUvbGludXgvc3lzY3RsLmgKaW5kZXggMWIyNGJkNC4uZDk4NTYyZjEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvc3lzY3RsLmgKKysrIGIvaW5jbHVkZS9saW51eC9zeXNjdGwuaApAQCAtNiwxMCArNiwxNyBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKioKKyAqKiAgV0FSTklORzoKICAqKiAgVGhlIHZhbHVlcyBpbiB0aGlzIGZpbGUgYXJlIGV4cG9ydGVkIHRvIHVzZXIgc3BhY2UgdmlhIAotICoqICB0aGUgc3lzY3RsKCkgYmluYXJ5IGludGVyZmFjZS4gIEhvd2V2ZXIgdGhpcyBpbnRlcmZhY2UKLSAqKiAgaXMgdW5zdGFibGUgYW5kIGRlcHJlY2F0ZWQgYW5kIHdpbGwgYmUgcmVtb3ZlZCBpbiB0aGUgZnV0dXJlLiAKLSAqKiAgRm9yIGEgc3RhYmxlIGludGVyZmFjZSB1c2UgL3Byb2Mvc3lzLgorICoqICB0aGUgc3lzY3RsKCkgYmluYXJ5IGludGVyZmFjZS4gIERvICpOT1QqIGNoYW5nZSB0aGUKKyAqKiAgbnVtYmVyaW5nIG9mIGFueSBleGlzdGluZyB2YWx1ZXMgaGVyZSwgYW5kIGRvIG5vdCBjaGFuZ2UKKyAqKiAgYW55IG51bWJlcnMgd2l0aGluIGFueSBvbmUgc2V0IG9mIHZhbHVlcy4gIElmIHlvdSBoYXZlIHRvCisgKiogIGhhdmUgdG8gcmVkZWZpbmUgYW4gZXhpc3RpbmcgaW50ZXJmYWNlLCB1c2UgYSBuZXcgbnVtYmVyIGZvciBpdC4KKyAqKiAgVGhlIGtlcm5lbCB3aWxsIHRoZW4gcmV0dXJuIC1FTk9URElSIHRvIGFueSBhcHBsaWNhdGlvbiB1c2luZworICoqICB0aGUgb2xkIGJpbmFyeSBpbnRlcmZhY2UuCisgKioKKyAqKiAgRm9yIG5ldyBpbnRlcmZhY2VzIHVubGVzcyB5b3UgcmVhbGx5IG5lZWQgYSBiaW5hcnkgbnVtYmVyCisgKiogIHBsZWFzZSB1c2UgQ1RMX1VOTlVNQkVSRUQuCiAgKioKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpAQCAtNDgsNiArNTUsNyBAQAogI2lmZGVmIF9fS0VSTkVMX18KICNkZWZpbmUgQ1RMX0FOWQkJLTEJLyogTWF0Y2hlcyBhbnkgbmFtZSAqLwogI2RlZmluZSBDVExfTk9ORQkwCisjZGVmaW5lIENUTF9VTk5VTUJFUkVECUNUTF9OT05FCS8qIHN5c2N0bCB3aXRob3V0IGEgYmluYXJ5IG51bWJlciAqLwogI2VuZGlmCiAKIGVudW0KQEAgLTk2MSw4ICs5NjksOCBAQAogLyoKICAqIFJlZ2lzdGVyIGEgc2V0IG9mIHN5c2N0bCBuYW1lcyBieSBjYWxsaW5nIHJlZ2lzdGVyX3N5c2N0bF90YWJsZQogICogd2l0aCBhbiBpbml0aWFsaXNlZCBhcnJheSBvZiBjdGxfdGFibGUncy4gIEFuIGVudHJ5IHdpdGggemVybwotICogY3RsX25hbWUgdGVybWluYXRlcyB0aGUgdGFibGUuICB0YWJsZS0+ZGUgd2lsbCBiZSBzZXQgdXAgYnkgdGhlCi0gKiByZWdpc3RyYXRpb24gYW5kIG5lZWQgbm90IGJlIGluaXRpYWxpc2VkIGluIGFkdmFuY2UuCisgKiBjdGxfbmFtZSBhbmQgTlVMTCBwcm9jbmFtZSB0ZXJtaW5hdGVzIHRoZSB0YWJsZS4gIHRhYmxlLT5kZSB3aWxsIGJlCisgKiBzZXQgdXAgYnkgdGhlIHJlZ2lzdHJhdGlvbiBhbmQgbmVlZCBub3QgYmUgaW5pdGlhbGlzZWQgaW4gYWR2YW5jZS4KICAqCiAgKiBzeXNjdGwgbmFtZXMgY2FuIGJlIG1pcnJvcmVkIGF1dG9tYXRpY2FsbHkgdW5kZXIgL3Byb2Mvc3lzLiAgVGhlCiAgKiBwcm9jbmFtZSBzdXBwbGllZCBjb250cm9scyAvcHJvYyBuYW1pbmcuCkBAIC05NzMsNyArOTgxLDEwIEBACiAgKiBMZWFmIG5vZGVzIGluIHRoZSBzeXNjdGwgdHJlZSB3aWxsIGJlIHJlcHJlc2VudGVkIGJ5IGEgc2luZ2xlIGZpbGUKICAqIHVuZGVyIC9wcm9jOyBub24tbGVhZiBub2RlcyB3aWxsIGJlIHJlcHJlc2VudGVkIGJ5IGRpcmVjdG9yaWVzLiAgQQogICogbnVsbCBwcm9jbmFtZSBkaXNhYmxlcyAvcHJvYyBtaXJyb3JpbmcgYXQgdGhpcyBub2RlLgotICogCisgKgorICogc3lzY3RsIGVudHJpZXMgd2l0aCBhIHplcm8gY3RsX25hbWUgd2lsbCBub3QgYmUgYXZhaWxhYmxlIHRocm91Z2gKKyAqIHRoZSBiaW5hcnkgc3lzY3RsIGludGVyZmFjZS4KKyAqCiAgKiBzeXNjdGwoMikgY2FuIGF1dG9tYXRpY2FsbHkgbWFuYWdlIHJlYWQgYW5kIHdyaXRlIHJlcXVlc3RzIHRocm91Z2gKICAqIHRoZSBzeXNjdGwgdGFibGUuICBUaGUgZGF0YSBhbmQgbWF4bGVuIGZpZWxkcyBvZiB0aGUgY3RsX3RhYmxlCiAgKiBzdHJ1Y3QgZW5hYmxlIG1pbmltYWwgdmFsaWRhdGlvbiBvZiB0aGUgdmFsdWVzIGJlaW5nIHdyaXR0ZW4gdG8gYmUKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvdGFza3N0YXRzX2tlcm4uaCBiL2luY2x1ZGUvbGludXgvdGFza3N0YXRzX2tlcm4uaAppbmRleCAxNjg5NGI3Li42NTYyYTIwIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3Rhc2tzdGF0c19rZXJuLmgKKysrIGIvaW5jbHVkZS9saW51eC90YXNrc3RhdHNfa2Vybi5oCkBAIC0yMywyNSArMjMsMjYgQEAKIAogc3RhdGljIGlubGluZSB2b2lkIHRhc2tzdGF0c190Z2lkX2luaXQoc3RydWN0IHNpZ25hbF9zdHJ1Y3QgKnNpZykKIHsKLQlzcGluX2xvY2tfaW5pdCgmc2lnLT5zdGF0c19sb2NrKTsKIAlzaWctPnN0YXRzID0gTlVMTDsKIH0KIAotc3RhdGljIGlubGluZSB2b2lkIHRhc2tzdGF0c190Z2lkX2FsbG9jKHN0cnVjdCBzaWduYWxfc3RydWN0ICpzaWcpCitzdGF0aWMgaW5saW5lIHZvaWQgdGFza3N0YXRzX3RnaWRfYWxsb2Moc3RydWN0IHRhc2tfc3RydWN0ICp0c2spCiB7CisJc3RydWN0IHNpZ25hbF9zdHJ1Y3QgKnNpZyA9IHRzay0+c2lnbmFsOwogCXN0cnVjdCB0YXNrc3RhdHMgKnN0YXRzOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKLQlzdGF0cyA9IGttZW1fY2FjaGVfemFsbG9jKHRhc2tzdGF0c19jYWNoZSwgU0xBQl9LRVJORUwpOwotCWlmICghc3RhdHMpCisJaWYgKHNpZy0+c3RhdHMgIT0gTlVMTCkKIAkJcmV0dXJuOwogCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJnNpZy0+c3RhdHNfbG9jaywgZmxhZ3MpOworCS8qIE5vIHByb2JsZW0gaWYga21lbV9jYWNoZV96YWxsb2MoKSBmYWlscyAqLworCXN0YXRzID0ga21lbV9jYWNoZV96YWxsb2ModGFza3N0YXRzX2NhY2hlLCBTTEFCX0tFUk5FTCk7CisKKwlzcGluX2xvY2tfaXJxKCZ0c2stPnNpZ2hhbmQtPnNpZ2xvY2spOwogCWlmICghc2lnLT5zdGF0cykgewogCQlzaWctPnN0YXRzID0gc3RhdHM7CiAJCXN0YXRzID0gTlVMTDsKIAl9Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc2lnLT5zdGF0c19sb2NrLCBmbGFncyk7CisJc3Bpbl91bmxvY2tfaXJxKCZ0c2stPnNpZ2hhbmQtPnNpZ2xvY2spOwogCiAJaWYgKHN0YXRzKQogCQlrbWVtX2NhY2hlX2ZyZWUodGFza3N0YXRzX2NhY2hlLCBzdGF0cyk7CkBAIC00OSwyMyArNTAsMTMgQEAKIAogc3RhdGljIGlubGluZSB2b2lkIHRhc2tzdGF0c190Z2lkX2ZyZWUoc3RydWN0IHNpZ25hbF9zdHJ1Y3QgKnNpZykKIHsKLQlzdHJ1Y3QgdGFza3N0YXRzICpzdGF0cyA9IE5VTEw7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZzaWctPnN0YXRzX2xvY2ssIGZsYWdzKTsKLQlpZiAoc2lnLT5zdGF0cykgewotCQlzdGF0cyA9IHNpZy0+c3RhdHM7Ci0JCXNpZy0+c3RhdHMgPSBOVUxMOwotCX0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzaWctPnN0YXRzX2xvY2ssIGZsYWdzKTsKLQlpZiAoc3RhdHMpCi0JCWttZW1fY2FjaGVfZnJlZSh0YXNrc3RhdHNfY2FjaGUsIHN0YXRzKTsKKwlpZiAoc2lnLT5zdGF0cykKKwkJa21lbV9jYWNoZV9mcmVlKHRhc2tzdGF0c19jYWNoZSwgc2lnLT5zdGF0cyk7CiB9CiAKIGV4dGVybiB2b2lkIHRhc2tzdGF0c19leGl0X2FsbG9jKHN0cnVjdCB0YXNrc3RhdHMgKiosIHVuc2lnbmVkIGludCAqKTsKIGV4dGVybiB2b2lkIHRhc2tzdGF0c19leGl0X3NlbmQoc3RydWN0IHRhc2tfc3RydWN0ICosIHN0cnVjdCB0YXNrc3RhdHMgKiwgaW50LCB1bnNpZ25lZCBpbnQpOwogZXh0ZXJuIHZvaWQgdGFza3N0YXRzX2luaXRfZWFybHkodm9pZCk7Ci1leHRlcm4gdm9pZCB0YXNrc3RhdHNfdGdpZF9hbGxvYyhzdHJ1Y3Qgc2lnbmFsX3N0cnVjdCAqKTsKICNlbHNlCiBzdGF0aWMgaW5saW5lIHZvaWQgdGFza3N0YXRzX2V4aXRfYWxsb2Moc3RydWN0IHRhc2tzdGF0cyAqKnB0aWRzdGF0cywgdW5zaWduZWQgaW50ICpteWNwdSkKIHt9CkBAIC03Nyw3ICs2OCw3IEBACiB7fQogc3RhdGljIGlubGluZSB2b2lkIHRhc2tzdGF0c190Z2lkX2luaXQoc3RydWN0IHNpZ25hbF9zdHJ1Y3QgKnNpZykKIHt9Ci1zdGF0aWMgaW5saW5lIHZvaWQgdGFza3N0YXRzX3RnaWRfYWxsb2Moc3RydWN0IHNpZ25hbF9zdHJ1Y3QgKnNpZykKK3N0YXRpYyBpbmxpbmUgdm9pZCB0YXNrc3RhdHNfdGdpZF9hbGxvYyhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzaykKIHt9CiBzdGF0aWMgaW5saW5lIHZvaWQgdGFza3N0YXRzX3RnaWRfZnJlZShzdHJ1Y3Qgc2lnbmFsX3N0cnVjdCAqc2lnKQoge30KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvdGNwLmggYi9pbmNsdWRlL2xpbnV4L3RjcC5oCmluZGV4IDBlMDU4YTIuLjJkMzZmNmQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvdGNwLmgKKysrIGIvaW5jbHVkZS9saW51eC90Y3AuaApAQCAtMzQyLDYgKzM0Miw4IEBACiAKIAl1bnNpZ25lZCBsb25nIGxhc3Rfc3lucV9vdmVyZmxvdzsgCiAKKwlfX3UzMgl0c29fZGVmZXJyZWQ7CisKIC8qIFJlY2VpdmVyIHNpZGUgUlRUIGVzdGltYXRpb24gKi8KIAlzdHJ1Y3QgewogCQlfX3UzMglydHQ7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3RpcGMuaCBiL2luY2x1ZGUvbGludXgvdGlwYy5oCmluZGV4IDI0M2ExNWYuLmJlYTQ2OTQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvdGlwYy5oCisrKyBiL2luY2x1ZGUvbGludXgvdGlwYy5oCkBAIC0xMjksNiArMTI5LDcgQEAKIAogI2RlZmluZSBUSVBDX1NVQl9QT1JUUyAgICAgCTB4MDEgIAkvKiBmaWx0ZXIgZm9yIHBvcnQgYXZhaWxhYmlsaXR5ICovCiAjZGVmaW5lIFRJUENfU1VCX1NFUlZJQ0UgICAgIAkweDAyICAJLyogZmlsdGVyIGZvciBzZXJ2aWNlIGF2YWlsYWJpbGl0eSAqLworI2RlZmluZSBUSVBDX1NVQl9DQU5DRUwgICAgICAgICAweDA0ICAgIC8qIGNhbmNlbCBhIHN1YnNjcmlwdGlvbiAqLwogI2lmIDAKIC8qIFRoZSBmb2xsb3dpbmcgZmlsdGVyIG9wdGlvbnMgYXJlIG5vdCBjdXJyZW50bHkgaW1wbGVtZW50ZWQgKi8KICNkZWZpbmUgVElQQ19TVUJfTk9fQklORF9FVlRTCTB4MDQJLyogZmlsdGVyIG91dCAicHVibGlzaCIgZXZlbnRzICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3Vmc19mcy5oIGIvaW5jbHVkZS9saW51eC91ZnNfZnMuaAppbmRleCA2MWVlZjUwLi4yODk2N2VkIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3Vmc19mcy5oCisrKyBiL2luY2x1ZGUvbGludXgvdWZzX2ZzLmgKQEAgLTkwOCw3ICs5MDgsNyBAQAogCQkJX19mczY0ICAgZnNfY3NhZGRyOwkvKiBibGsgYWRkciBvZiBjeWwgZ3JwIHN1bW1hcnkgYXJlYSAqLwogCQkJX19mczY0ICAgIGZzX3BlbmRpbmdibG9ja3M7LyogYmxvY2tzIGluIHByb2Nlc3Mgb2YgYmVpbmcgZnJlZWQgKi8KIAkJCV9fZnMzMiAgICBmc19wZW5kaW5naW5vZGVzOy8qaW5vZGVzIGluIHByb2Nlc3Mgb2YgYmVpbmcgZnJlZWQgKi8KLQkJfSBmc191MjsKKwkJfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSkgZnNfdTI7CiAJfSBmc191bjE7CiAJdW5pb24gewogCQlzdHJ1Y3QgewpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC91bndpbmQuaCBiL2luY2x1ZGUvbGludXgvdW53aW5kLmgKaW5kZXggNzNlMTc1MS4uNzQ5OTI4YyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC91bndpbmQuaAorKysgYi9pbmNsdWRlL2xpbnV4L3Vud2luZC5oCkBAIC0yNiw2ICsyNiw3IEBACiAgKiBJbml0aWFsaXplIHVud2luZCBzdXBwb3J0LgogICovCiBleHRlcm4gdm9pZCB1bndpbmRfaW5pdCh2b2lkKTsKK2V4dGVybiB2b2lkIHVud2luZF9zZXR1cCh2b2lkKTsKIAogI2lmZGVmIENPTkZJR19NT0RVTEVTCiAKQEAgLTczLDYgKzc0LDcgQEAKIHN0cnVjdCB1bndpbmRfZnJhbWVfaW5mbyB7fTsKIAogc3RhdGljIGlubGluZSB2b2lkIHVud2luZF9pbml0KHZvaWQpIHt9CitzdGF0aWMgaW5saW5lIHZvaWQgdW53aW5kX3NldHVwKHZvaWQpIHt9CiAKICNpZmRlZiBDT05GSUdfTU9EVUxFUwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3ZpZGVvZGV2Mi5oIGIvaW5jbHVkZS9saW51eC92aWRlb2RldjIuaAppbmRleCBjNWZkZjYyLi5kZjVjNDY1IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3ZpZGVvZGV2Mi5oCisrKyBiL2luY2x1ZGUvbGludXgvdmlkZW9kZXYyLmgKQEAgLTI0Myw3ICsyNDMsNyBAQAogI2RlZmluZSBWNEwyX1BJWF9GTVRfWVVWNDIwICB2NGwyX2ZvdXJjYygnWScsJ1UnLCcxJywnMicpIC8qIDEyICBZVVYgNDoyOjAgICAgICovCiAjZGVmaW5lIFY0TDJfUElYX0ZNVF9ZWVVWICAgIHY0bDJfZm91cmNjKCdZJywnWScsJ1UnLCdWJykgLyogMTYgIFlVViA0OjI6MiAgICAgKi8KICNkZWZpbmUgVjRMMl9QSVhfRk1UX0hJMjQwICAgdjRsMl9mb3VyY2MoJ0gnLCdJJywnMicsJzQnKSAvKiAgOCAgOC1iaXQgY29sb3IgICAqLwotI2RlZmluZSBWNEwyX1BJWF9GTVRfSE0xMiAgICB2NGwyX2ZvdXJjYygnSCcsJ00nLCcxJywnMicpIC8qICA4ICBZVVYgNDoxOjEgMTZ4MTYgbWFjcm9ibG9ja3MgKi8KKyNkZWZpbmUgVjRMMl9QSVhfRk1UX0hNMTIgICAgdjRsMl9mb3VyY2MoJ0gnLCdNJywnMScsJzInKSAvKiAgOCAgWVVWIDQ6MjowIDE2eDE2IG1hY3JvYmxvY2tzICovCiAKIC8qIHNlZSBodHRwOi8vd3d3LnNpbGljb25pbWFnaW5nLmNvbS9SR0IlMjBCYXllci5odG0gKi8KICNkZWZpbmUgVjRMMl9QSVhfRk1UX1NCR0dSOCAgdjRsMl9mb3VyY2MoJ0InLCdBJywnOCcsJzEnKSAvKiAgOCAgQkdCRy4uIEdSR1IuLiAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC92bWFsbG9jLmggYi9pbmNsdWRlL2xpbnV4L3ZtYWxsb2MuaAppbmRleCBjZTVmMTQ4Li45MjRlNTAyIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3ZtYWxsb2MuaAorKysgYi9pbmNsdWRlL2xpbnV4L3ZtYWxsb2MuaApAQCAtMjMsMTMgKzIzLDE0IEBACiAjZW5kaWYKIAogc3RydWN0IHZtX3N0cnVjdCB7CisJLyoga2VlcCBuZXh0LGFkZHIsc2l6ZSB0b2dldGhlciB0byBzcGVlZHVwIGxvb2t1cHMgKi8KKwlzdHJ1Y3Qgdm1fc3RydWN0CSpuZXh0OwogCXZvaWQJCQkqYWRkcjsKIAl1bnNpZ25lZCBsb25nCQlzaXplOwogCXVuc2lnbmVkIGxvbmcJCWZsYWdzOwogCXN0cnVjdCBwYWdlCQkqKnBhZ2VzOwogCXVuc2lnbmVkIGludAkJbnJfcGFnZXM7CiAJdW5zaWduZWQgbG9uZwkJcGh5c19hZGRyOwotCXN0cnVjdCB2bV9zdHJ1Y3QJKm5leHQ7CiB9OwogCiAvKgpAQCAtNjAsNyArNjEsOCBAQAogZXh0ZXJuIHN0cnVjdCB2bV9zdHJ1Y3QgKl9fZ2V0X3ZtX2FyZWEodW5zaWduZWQgbG9uZyBzaXplLCB1bnNpZ25lZCBsb25nIGZsYWdzLAogCQkJCQl1bnNpZ25lZCBsb25nIHN0YXJ0LCB1bnNpZ25lZCBsb25nIGVuZCk7CiBleHRlcm4gc3RydWN0IHZtX3N0cnVjdCAqZ2V0X3ZtX2FyZWFfbm9kZSh1bnNpZ25lZCBsb25nIHNpemUsCi0JCQkJCXVuc2lnbmVkIGxvbmcgZmxhZ3MsIGludCBub2RlKTsKKwkJCQkJICB1bnNpZ25lZCBsb25nIGZsYWdzLCBpbnQgbm9kZSwKKwkJCQkJICBnZnBfdCBnZnBfbWFzayk7CiBleHRlcm4gc3RydWN0IHZtX3N0cnVjdCAqcmVtb3ZlX3ZtX2FyZWEodm9pZCAqYWRkcik7CiBleHRlcm4gaW50IG1hcF92bV9hcmVhKHN0cnVjdCB2bV9zdHJ1Y3QgKmFyZWEsIHBncHJvdF90IHByb3QsCiAJCQlzdHJ1Y3QgcGFnZSAqKipwYWdlcyk7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3dhaXQuaCBiL2luY2x1ZGUvbGludXgvd2FpdC5oCmluZGV4IGIzYjkwNDguLmU4MjBkMDAgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvd2FpdC5oCisrKyBiL2luY2x1ZGUvbGludXgvd2FpdC5oCkBAIC03OSw2ICs3OSwxNSBAQAogCiBleHRlcm4gdm9pZCBpbml0X3dhaXRxdWV1ZV9oZWFkKHdhaXRfcXVldWVfaGVhZF90ICpxKTsKIAorI2lmZGVmIENPTkZJR19MT0NLREVQCisjIGRlZmluZSBfX1dBSVRfUVVFVUVfSEVBRF9JTklUX09OU1RBQ0sobmFtZSkgXAorCSh7IGluaXRfd2FpdHF1ZXVlX2hlYWQoJm5hbWUpOyBuYW1lOyB9KQorIyBkZWZpbmUgREVDTEFSRV9XQUlUX1FVRVVFX0hFQURfT05TVEFDSyhuYW1lKSBcCisJd2FpdF9xdWV1ZV9oZWFkX3QgbmFtZSA9IF9fV0FJVF9RVUVVRV9IRUFEX0lOSVRfT05TVEFDSyhuYW1lKQorI2Vsc2UKKyMgZGVmaW5lIERFQ0xBUkVfV0FJVF9RVUVVRV9IRUFEX09OU1RBQ0sobmFtZSkgREVDTEFSRV9XQUlUX1FVRVVFX0hFQUQobmFtZSkKKyNlbmRpZgorCiBzdGF0aWMgaW5saW5lIHZvaWQgaW5pdF93YWl0cXVldWVfZW50cnkod2FpdF9xdWV1ZV90ICpxLCBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnApCiB7CiAJcS0+ZmxhZ3MgPSAwOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC93cml0ZWJhY2suaCBiL2luY2x1ZGUvbGludXgvd3JpdGViYWNrLmgKaW5kZXggYTM0MWM4MC4uZmMzNWU2YiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC93cml0ZWJhY2suaAorKysgYi9pbmNsdWRlL2xpbnV4L3dyaXRlYmFjay5oCkBAIC04NSw3ICs4NSw2IEBACiB2b2lkIGxhcHRvcF9pb19jb21wbGV0aW9uKHZvaWQpOwogdm9pZCBsYXB0b3Bfc3luY19jb21wbGV0aW9uKHZvaWQpOwogdm9pZCB0aHJvdHRsZV92bV93cml0ZW91dCh2b2lkKTsKLXZvaWQgd3JpdGViYWNrX2Nvbmdlc3Rpb25fZW5kKHZvaWQpOwogCiAvKiBUaGVzZSBhcmUgZXhwb3J0ZWQgdG8gc3lzY3RsLiAqLwogZXh0ZXJuIGludCBkaXJ0eV9iYWNrZ3JvdW5kX3JhdGlvOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZXQvYmx1ZXRvb3RoL2hjaV9jb3JlLmggYi9pbmNsdWRlL25ldC9ibHVldG9vdGgvaGNpX2NvcmUuaAppbmRleCBkZjIyZWZjLi5jMGZjMzk2IDEwMDY0NAotLS0gYS9pbmNsdWRlL25ldC9ibHVldG9vdGgvaGNpX2NvcmUuaAorKysgYi9pbmNsdWRlL25ldC9ibHVldG9vdGgvaGNpX2NvcmUuaApAQCAtMTUzLDYgKzE1Myw3IEBACiAJX191OCAgICAgICAgICAgICBtb2RlOwogCV9fdTgJCSB0eXBlOwogCV9fdTgJCSBvdXQ7CisJX191OAkJIGF0dGVtcHQ7CiAJX191OAkJIGRldl9jbGFzc1szXTsKIAlfX3U4ICAgICAgICAgICAgIGZlYXR1cmVzWzhdOwogCV9fdTE2ICAgICAgICAgICAgaW50ZXJ2YWw7CkBAIC0yODksNiArMjkwLDIyIEBACiAJcmV0dXJuIE5VTEw7CiB9CiAKK3N0YXRpYyBpbmxpbmUgc3RydWN0IGhjaV9jb25uICpoY2lfY29ubl9oYXNoX2xvb2t1cF9zdGF0ZShzdHJ1Y3QgaGNpX2RldiAqaGRldiwKKwkJCQkJX191OCB0eXBlLCBfX3UxNiBzdGF0ZSkKK3sKKwlzdHJ1Y3QgaGNpX2Nvbm5faGFzaCAqaCA9ICZoZGV2LT5jb25uX2hhc2g7CisJc3RydWN0IGxpc3RfaGVhZCAqcDsKKwlzdHJ1Y3QgaGNpX2Nvbm4gICpjOworCisJbGlzdF9mb3JfZWFjaChwLCAmaC0+bGlzdCkgeworCQljID0gbGlzdF9lbnRyeShwLCBzdHJ1Y3QgaGNpX2Nvbm4sIGxpc3QpOworCQlpZiAoYy0+dHlwZSA9PSB0eXBlICYmIGMtPnN0YXRlID09IHN0YXRlKQorCQkJcmV0dXJuIGM7CisJfQorCXJldHVybiBOVUxMOworfQorCit2b2lkIGhjaV9hY2xfY29ubmVjdChzdHJ1Y3QgaGNpX2Nvbm4gKmNvbm4pOwogdm9pZCBoY2lfYWNsX2Rpc2Nvbm4oc3RydWN0IGhjaV9jb25uICpjb25uLCBfX3U4IHJlYXNvbik7CiB2b2lkIGhjaV9hZGRfc2NvKHN0cnVjdCBoY2lfY29ubiAqY29ubiwgX191MTYgaGFuZGxlKTsKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZXQvZG4uaCBiL2luY2x1ZGUvbmV0L2RuLmgKaW5kZXggNDY1Yjc4My4uYWM0Y2U5MCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9uZXQvZG4uaAorKysgYi9pbmNsdWRlL25ldC9kbi5oCkBAIC0xOTksMTEgKzE5OSw2IEBACiB7CiAJZmwtPnVsaV91LmRucG9ydHMuc3BvcnQgPSBzY3AtPmFkZHJsb2M7CiAJZmwtPnVsaV91LmRucG9ydHMuZHBvcnQgPSBzY3AtPmFkZHJyZW07Ci0JZmwtPnVsaV91LmRucG9ydHMub2JqbnVtID0gc2NwLT5hZGRyLnNkbl9vYmpudW07Ci0JaWYgKGZsLT51bGlfdS5kbnBvcnRzLm9iam51bSA9PSAwKSB7Ci0JCWZsLT51bGlfdS5kbnBvcnRzLm9iam5hbWVsID0gKF9fdTgpZG5fbnRvaHMoc2NwLT5hZGRyLnNkbl9vYmpuYW1lbCk7Ci0JCW1lbWNweShmbC0+dWxpX3UuZG5wb3J0cy5vYmpuYW1lLCBzY3AtPmFkZHIuc2RuX29iam5hbWUsIDE2KTsKLQl9CiB9CiAKIGV4dGVybiB1bnNpZ25lZCBkbl9tc3NfZnJvbV9wbXR1KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBtdHUpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZXQvZmxvdy5oIGIvaW5jbHVkZS9uZXQvZmxvdy5oCmluZGV4IGRkZjVmM2MuLjVjZGEyN2MgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbmV0L2Zsb3cuaAorKysgYi9pbmNsdWRlL25ldC9mbG93LmgKQEAgLTY4LDkgKzY4LDYgQEAKIAkJc3RydWN0IHsKIAkJCV9fbGUxNglzcG9ydDsKIAkJCV9fbGUxNglkcG9ydDsKLQkJCV9fdTgJb2JqbnVtOwotCQkJX191OAlvYmpuYW1lbDsgLyogTm90IDE2IGJpdHMgc2luY2UgbWF4IHZhbCBpcyAxNiAqLwotCQkJX191OAlvYmpuYW1lWzE2XTsgLyogTm90IHplcm8gdGVybWluYXRlZCAqLwogCQl9IGRucG9ydHM7CiAKIAkJX19iZTMyCQlzcGk7CkBAIC05Nyw3ICs5NCw3IEBACiAjZGVmaW5lIEZMT1dfRElSX0ZXRAkyCiAKIHN0cnVjdCBzb2NrOwotdHlwZWRlZiB2b2lkICgqZmxvd19yZXNvbHZlX3QpKHN0cnVjdCBmbG93aSAqa2V5LCB1MTYgZmFtaWx5LCB1OCBkaXIsCit0eXBlZGVmIGludCAoKmZsb3dfcmVzb2x2ZV90KShzdHJ1Y3QgZmxvd2kgKmtleSwgdTE2IGZhbWlseSwgdTggZGlyLAogCQkJICAgICAgIHZvaWQgKipvYmpwLCBhdG9taWNfdCAqKm9ial9yZWZwKTsKIAogZXh0ZXJuIHZvaWQgKmZsb3dfY2FjaGVfbG9va3VwKHN0cnVjdCBmbG93aSAqa2V5LCB1MTYgZmFtaWx5LCB1OCBkaXIsCmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC9pZWVlODAyMTFzb2Z0bWFjLmggYi9pbmNsdWRlL25ldC9pZWVlODAyMTFzb2Z0bWFjLmgKaW5kZXggNDI1YjNhNS4uNjE3YjY3MiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9uZXQvaWVlZTgwMjExc29mdG1hYy5oCisrKyBiL2luY2x1ZGUvbmV0L2llZWU4MDIxMXNvZnRtYWMuaApAQCAtNjMsMTMgKzYzLDExIEBACiAKIC8qCiAgKiBJbmZvcm1hdGlvbiBhYm91dCBhc3NvY2lhdGlvbgotICoKLSAqIERvIHdlIG5lZWQgYSBsb2NrIGZvciB0aGlzPwotICogV2Ugb25seSBldmVyIHVzZSB0aGlzIHN0cnVjdHVyZSBpbmxpbmVkCi0gKiBpbnRvIG91ciBnbG9iYWwgc3RydWN0LiBJJ3ZlIHVzZWQgaXRzIGxvY2ssCi0gKiBidXQgbWF5YmUgd2UgbmVlZCBhIGxvY2FsIG9uZSBoZXJlPwogICovCiBzdHJ1Y3QgaWVlZTgwMjExc29mdG1hY19hc3NvY19pbmZvIHsKKworCXN0cnVjdCBtdXRleCBtdXRleDsKKwogCS8qCiAJICogVGhpcyBpcyB0aGUgcmVxdWVzdGVkIEVTU0lELiBJdCBpcyB3cml0dGVuCiAJICogb25seSBieSB0aGUgV1ggaGFuZGxlcnMuCkBAIC05OSwxMiArOTcsMTMgQEAKIAkgKgogCSAqIGJzc2ZpeGVkIGlzIHVzZWQgZm9yIFNJT0NTSVdBUC4KIAkgKi8KLQl1OCBzdGF0aWNfZXNzaWQ6MSwKLQkgICBzaG9ydF9wcmVhbWJsZV9hdmFpbGFibGU6MSwKLQkgICBhc3NvY2lhdGluZzoxLAotCSAgIGFzc29jX3dhaXQ6MSwKLQkgICBic3N2YWxpZDoxLAotCSAgIGJzc2ZpeGVkOjE7CisJdTggc3RhdGljX2Vzc2lkOworCXU4IHNob3J0X3ByZWFtYmxlX2F2YWlsYWJsZTsKKwl1OCBhc3NvY2lhdGluZzsKKwl1OCBhc3NvY2lhdGVkOworCXU4IGFzc29jX3dhaXQ7CisJdTggYnNzdmFsaWQ7CisJdTggYnNzZml4ZWQ7CiAKIAkvKiBTY2FuIHJldHJpZXMgcmVtYWluaW5nICovCiAJaW50IHNjYW5fcmV0cnk7CkBAIC0yMjksMTIgKzIyOCwxMCBAQAogCS8qIHByaXZhdGUgc3R1ZmYgZm9sbG93cyAqLwogCS8qIHRoaXMgbG9jayBwcm90ZWN0cyB0aGlzIHN0cnVjdHVyZSAqLwogCXNwaW5sb2NrX3QgbG9jazsKLQkKLQkvKiBjb3VwbGUgb2YgZmxhZ3MgKi8KLQl1OCBzY2FubmluZzoxLCAvKiBwcm90ZWN0cyBzY2FubmluZyBmcm9tIGJlaW5nIGRvbmUgbXVsdGlwbGUgdGltZXMgYXQgb25jZSAqLwotCSAgIGFzc29jaWF0ZWQ6MSwKLQkgICBydW5uaW5nOjE7Ci0JCisKKwl1OCBydW5uaW5nOyAvKiBTb2Z0TUFDIHN0YXJ0ZWQ/ICovCisJdTggc2Nhbm5pbmc7CisKIAlzdHJ1Y3QgaWVlZTgwMjExc29mdG1hY19zY2FuaW5mbyAqc2NhbmluZm87CiAJc3RydWN0IGllZWU4MDIxMXNvZnRtYWNfYXNzb2NfaW5mbyBhc3NvY2luZm87CiAJc3RydWN0IGllZWU4MDIxMXNvZnRtYWNfYnNzX2luZm8gYnNzaW5mbzsKQEAgLTI1MCw3ICsyNDcsNyBAQAogCiAJLyogd2UgbmVlZCB0byBrZWVwIGEgbGlzdCBvZiBuZXR3b3JrIHN0cnVjdHMgd2UgY29waWVkICovCiAJc3RydWN0IGxpc3RfaGVhZCBuZXR3b3JrX2xpc3Q7Ci0JCisKIAkvKiBUaGlzIG11c3QgYmUgdGhlIGxhc3QgaXRlbSBzbyB0aGF0IGl0IHBvaW50cyB0byB0aGUgZGF0YQogCSAqIGFsbG9jYXRlZCBiZXlvbmQgdGhpcyBzdHJ1Y3R1cmUgYnkgYWxsb2NfaWVlZTgwMjExICovCiAJdTggcHJpdlswXTsKQEAgLTI5NSw3ICsyOTIsNyBAQAogewogCXN0cnVjdCBpZWVlODAyMTFzb2Z0bWFjX3R4cmF0ZXMgKnR4cmF0ZXMgPSAmbWFjLT50eHJhdGVzOwogCi0JaWYgKCFtYWMtPmFzc29jaWF0ZWQpCisJaWYgKCFtYWMtPmFzc29jaW5mby5hc3NvY2lhdGVkKQogCQlyZXR1cm4gdHhyYXRlcy0+bWd0X21jYXN0X3JhdGU7CiAKIAkvKiBXZSBhcmUgYXNzb2NpYXRlZCwgc2VuZGluZyB1bmljYXN0IGZyYW1lICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC9pbmV0X2Vjbi5oIGIvaW5jbHVkZS9uZXQvaW5ldF9lY24uaAppbmRleCBkNTk5YzZiLi43ODQ5ODQ0IDEwMDY0NAotLS0gYS9pbmNsdWRlL25ldC9pbmV0X2Vjbi5oCisrKyBiL2luY2x1ZGUvbmV0L2luZXRfZWNuLmgKQEAgLTQ4LDcgKzQ4LDcgQEAKIAogI2RlZmluZQlJUDZfRUNOX2Zsb3dfeG1pdChzaywgbGFiZWwpIGRvIHsJCQkJXAogCWlmIChJTkVUX0VDTl9pc19jYXBhYmxlKGluZXRfc2soc2spLT50b3MpKQkJCVwKLQkJKGxhYmVsKSB8PSBfX2NvbnN0YW50X2h0b25zKElORVRfRUNOX0VDVF8wIDw8IDQpOwlcCisJCShsYWJlbCkgfD0gaHRvbmwoSU5FVF9FQ05fRUNUXzAgPDwgMjApOwkJCVwKICAgICB9IHdoaWxlICgwKQogCiBzdGF0aWMgaW5saW5lIGludCBJUF9FQ05fc2V0X2NlKHN0cnVjdCBpcGhkciAqaXBoKQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZXQvaW5ldF90aW1ld2FpdF9zb2NrLmggYi9pbmNsdWRlL25ldC9pbmV0X3RpbWV3YWl0X3NvY2suaAppbmRleCA2ZDE0YzIyLi41ZjQ4NzQ4IDEwMDY0NAotLS0gYS9pbmNsdWRlL25ldC9pbmV0X3RpbWV3YWl0X3NvY2suaAorKysgYi9pbmNsdWRlL25ldC9pbmV0X3RpbWV3YWl0X3NvY2suaApAQCAtMTk2LDYgKzE5Niw3IEBACiB7CiAJaWYgKGF0b21pY19kZWNfYW5kX3Rlc3QoJnR3LT50d19yZWZjbnQpKSB7CiAJCXN0cnVjdCBtb2R1bGUgKm93bmVyID0gdHctPnR3X3Byb3QtPm93bmVyOworCQl0d3NrX2Rlc3RydWN0b3IoKHN0cnVjdCBzb2NrICopdHcpOwogI2lmZGVmIFNPQ0tfUkVGQ05UX0RFQlVHCiAJCXByaW50ayhLRVJOX0RFQlVHICIlcyB0aW1ld2FpdF9zb2NrICVwIHJlbGVhc2VkXG4iLAogCQkgICAgICAgdHctPnR3X3Byb3QtPm5hbWUsIHR3KTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmV0L2luZXRwZWVyLmggYi9pbmNsdWRlL25ldC9pbmV0cGVlci5oCmluZGV4IDkyNTU3M2YuLmFhMTBhODEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbmV0L2luZXRwZWVyLmgKKysrIGIvaW5jbHVkZS9uZXQvaW5ldHBlZXIuaApAQCAtMTcsMTQgKzE3LDE1IEBACiAKIHN0cnVjdCBpbmV0X3BlZXIKIHsKKwkvKiBncm91cCB0b2dldGhlciBhdmxfbGVmdCxhdmxfcmlnaHQsdjRkYWRkciB0byBzcGVlZHVwIGxvb2t1cHMgKi8KIAlzdHJ1Y3QgaW5ldF9wZWVyCSphdmxfbGVmdCwgKmF2bF9yaWdodDsKLQlzdHJ1Y3QgaW5ldF9wZWVyCSp1bnVzZWRfbmV4dCwgKip1bnVzZWRfcHJldnA7Ci0JdW5zaWduZWQgbG9uZwkJZHRpbWU7CQkvKiB0aGUgdGltZSBvZiBsYXN0IHVzZSBvZiBub3QKLQkJCQkJCSAqIHJlZmVyZW5jZWQgZW50cmllcyAqLwotCWF0b21pY190CQlyZWZjbnQ7CiAJX19iZTMyCQkJdjRkYWRkcjsJLyogcGVlcidzIGFkZHJlc3MgKi8KIAlfX3UxNgkJCWF2bF9oZWlnaHQ7CiAJX191MTYJCQlpcF9pZF9jb3VudDsJLyogSVAgSUQgZm9yIHRoZSBuZXh0IHBhY2tldCAqLworCXN0cnVjdCBpbmV0X3BlZXIJKnVudXNlZF9uZXh0LCAqKnVudXNlZF9wcmV2cDsKKwlfX3UzMgkJCWR0aW1lOwkJLyogdGhlIHRpbWUgb2YgbGFzdCB1c2Ugb2Ygbm90CisJCQkJCQkgKiByZWZlcmVuY2VkIGVudHJpZXMgKi8KKwlhdG9taWNfdAkJcmVmY250OwogCWF0b21pY190CQlyaWQ7CQkvKiBGcmFnIHJlY2VwdGlvbiBjb3VudGVyICovCiAJX191MzIJCQl0Y3BfdHM7CiAJdW5zaWduZWQgbG9uZwkJdGNwX3RzX3N0YW1wOwpAQCAtMzUsMjEgKzM2LDggQEAKIC8qIGNhbiBiZSBjYWxsZWQgd2l0aCBvciB3aXRob3V0IGxvY2FsIEJIIGJlaW5nIGRpc2FibGVkICovCiBzdHJ1Y3QgaW5ldF9wZWVyCSppbmV0X2dldHBlZXIoX19iZTMyIGRhZGRyLCBpbnQgY3JlYXRlKTsKIAotZXh0ZXJuIHNwaW5sb2NrX3QgaW5ldF9wZWVyX3VudXNlZF9sb2NrOwotZXh0ZXJuIHN0cnVjdCBpbmV0X3BlZXIgKippbmV0X3BlZXJfdW51c2VkX3RhaWxwOwogLyogY2FuIGJlIGNhbGxlZCBmcm9tIEJIIGNvbnRleHQgb3Igb3V0c2lkZSAqLwotc3RhdGljIGlubGluZSB2b2lkCWluZXRfcHV0cGVlcihzdHJ1Y3QgaW5ldF9wZWVyICpwKQotewotCXNwaW5fbG9ja19iaCgmaW5ldF9wZWVyX3VudXNlZF9sb2NrKTsKLQlpZiAoYXRvbWljX2RlY19hbmRfdGVzdCgmcC0+cmVmY250KSkgewotCQlwLT51bnVzZWRfcHJldnAgPSBpbmV0X3BlZXJfdW51c2VkX3RhaWxwOwotCQlwLT51bnVzZWRfbmV4dCA9IE5VTEw7Ci0JCSppbmV0X3BlZXJfdW51c2VkX3RhaWxwID0gcDsKLQkJaW5ldF9wZWVyX3VudXNlZF90YWlscCA9ICZwLT51bnVzZWRfbmV4dDsKLQkJcC0+ZHRpbWUgPSBqaWZmaWVzOwotCX0KLQlzcGluX3VubG9ja19iaCgmaW5ldF9wZWVyX3VudXNlZF9sb2NrKTsKLX0KK2V4dGVybiB2b2lkIGluZXRfcHV0cGVlcihzdHJ1Y3QgaW5ldF9wZWVyICpwKTsKIAogZXh0ZXJuIHNwaW5sb2NrX3QgaW5ldF9wZWVyX2lkbG9jazsKIC8qIGNhbiBiZSBjYWxsZWQgd2l0aCBvciB3aXRob3V0IGxvY2FsIEJIIGJlaW5nIGRpc2FibGVkICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC9pcDZfcm91dGUuaCBiL2luY2x1ZGUvbmV0L2lwNl9yb3V0ZS5oCmluZGV4IDZjYTZiNzEuLmMxNGI3MGUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbmV0L2lwNl9yb3V0ZS5oCisrKyBiL2luY2x1ZGUvbmV0L2lwNl9yb3V0ZS5oCkBAIC0zNiwxMyArMzYsNiBAQAogI2RlZmluZSBSVDZfTE9PS1VQX0ZfUkVBQ0hBQkxFCTB4MgogI2RlZmluZSBSVDZfTE9PS1VQX0ZfSEFTX1NBRERSCTB4NAogCi1zdHJ1Y3QgcG9sX2NoYWluIHsKLQlpbnQJCQl0eXBlOwotCWludAkJCXByaW9yaXR5OwotCXN0cnVjdCBmaWI2X25vZGUJKnJ1bGVzOwotCXN0cnVjdCBwb2xfY2hhaW4JKm5leHQ7Ci19OwotCiBleHRlcm4gc3RydWN0IHJ0Nl9pbmZvCWlwNl9udWxsX2VudHJ5OwogCiAjaWZkZWYgQ09ORklHX0lQVjZfTVVMVElQTEVfVEFCTEVTCmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC9pcF9maWIuaCBiL2luY2x1ZGUvbmV0L2lwX2ZpYi5oCmluZGV4IDgyMjI5MTQuLjk0OWI5MzIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbmV0L2lwX2ZpYi5oCisrKyBiL2luY2x1ZGUvbmV0L2lwX2ZpYi5oCkBAIC0yMSwxNyArMjEsMTQgQEAKICNpbmNsdWRlIDxuZXQvZmliX3J1bGVzLmg+CiAKIHN0cnVjdCBmaWJfY29uZmlnIHsKLQl1OAkJCWZjX2ZhbWlseTsKIAl1OAkJCWZjX2RzdF9sZW47Ci0JdTgJCQlmY19zcmNfbGVuOwogCXU4CQkJZmNfdG9zOwogCXU4CQkJZmNfcHJvdG9jb2w7CiAJdTgJCQlmY19zY29wZTsKIAl1OAkJCWZjX3R5cGU7Ci0JLyogMSBieXRlIHVudXNlZCAqLworCS8qIDMgYnl0ZXMgdW51c2VkICovCiAJdTMyCQkJZmNfdGFibGU7CiAJX19iZTMyCQkJZmNfZHN0OwotCV9fYmUzMgkJCWZjX3NyYzsKIAlfX2JlMzIJCQlmY19ndzsKIAlpbnQJCQlmY19vaWY7CiAJdTMyCQkJZmNfZmxhZ3M7CmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC9pcF92cy5oIGIvaW5jbHVkZS9uZXQvaXBfdnMuaAppbmRleCA0OWM3MTdlLi45MDMxMDhlIDEwMDY0NAotLS0gYS9pbmNsdWRlL25ldC9pcF92cy5oCisrKyBiL2luY2x1ZGUvbmV0L2lwX3ZzLmgKQEAgLTcsNiArNyw3IEBACiAjZGVmaW5lIF9JUF9WU19ICiAKICNpbmNsdWRlIDxhc20vdHlwZXMuaD4JCS8qIEZvciBfX3VYWCB0eXBlcyAqLworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CS8qIEZvciBfX2JlWFggdHlwZXMgaW4gdXNlcmxhbmQgKi8KIAogI2RlZmluZSBJUF9WU19WRVJTSU9OX0NPREUJMHgwMTAyMDEKICNkZWZpbmUgTlZFUlNJT04odmVyc2lvbikJCQlcCmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC9pcHguaCBiL2luY2x1ZGUvbmV0L2lweC5oCmluZGV4IDVjMGNmMzMuLmM2YjJlZTYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbmV0L2lweC5oCisrKyBiL2luY2x1ZGUvbmV0L2lweC5oCkBAIC0xNSw5ICsxNSw5IEBACiAjaW5jbHVkZSA8bGludXgvbGlzdC5oPgogCiBzdHJ1Y3QgaXB4X2FkZHJlc3MgewotCV9fdTMyICAgbmV0OworCV9fYmUzMiAgbmV0OwogCV9fdTggICAgbm9kZVtJUFhfTk9ERV9MRU5dOyAKLQlfX3UxNiAgIHNvY2s7CisJX19iZTE2ICBzb2NrOwogfTsKIAogI2RlZmluZSBpcHhfYnJvYWRjYXN0X25vZGUJIlwzNzdcMzc3XDM3N1wzNzdcMzc3XDM3NyIKQEAgLTI2LDkgKzI2LDkgQEAKICNkZWZpbmUgSVBYX01BWF9QUFJPUF9IT1BTIDgKIAogc3RydWN0IGlweGhkciB7Ci0JX191MTYJCQlpcHhfY2hlY2tzdW0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOwotI2RlZmluZSBJUFhfTk9fQ0hFQ0tTVU0JMHhGRkZGCi0JX191MTYJCQlpcHhfcGt0c2l6ZSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisJX19iZTE2CQkJaXB4X2NoZWNrc3VtIF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKyNkZWZpbmUgSVBYX05PX0NIRUNLU1VNCV9fY29uc3RhbnRfaHRvbnMoMHhGRkZGKQorCV9fYmUxNgkJCWlweF9wa3RzaXplIF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKIAlfX3U4CQkJaXB4X3RjdHJsOwogCV9fdTgJCQlpcHhfdHlwZTsKICNkZWZpbmUgSVBYX1RZUEVfVU5LTk9XTgkweDAwCkBAIC00OCwxNCArNDgsMTQgQEAKIAogc3RydWN0IGlweF9pbnRlcmZhY2UgewogCS8qIElQWCBhZGRyZXNzICovCi0JX191MzIJCQlpZl9uZXRudW07CisJX19iZTMyCQkJaWZfbmV0bnVtOwogCXVuc2lnbmVkIGNoYXIJCWlmX25vZGVbSVBYX05PREVfTEVOXTsKIAlhdG9taWNfdAkJcmVmY250OwogCiAJLyogcGh5c2ljYWwgZGV2aWNlIGluZm8gKi8KIAlzdHJ1Y3QgbmV0X2RldmljZQkqaWZfZGV2OwogCXN0cnVjdCBkYXRhbGlua19wcm90bwkqaWZfZGxpbms7Ci0JdW5zaWduZWQgc2hvcnQJCWlmX2RsaW5rX3R5cGU7CisJX19iZTE2CQkJaWZfZGxpbmtfdHlwZTsKIAogCS8qIHNvY2tldCBzdXBwb3J0ICovCiAJdW5zaWduZWQgc2hvcnQJCWlmX3NrbnVtOwpAQCAtNzEsNyArNzEsNyBAQAogfTsKIAogc3RydWN0IGlweF9yb3V0ZSB7Ci0JX191MzIJCQlpcl9uZXQ7CisJX19iZTMyCQkJaXJfbmV0OwogCXN0cnVjdCBpcHhfaW50ZXJmYWNlCSppcl9pbnRyZmM7CiAJdW5zaWduZWQgY2hhcgkJaXJfcm91dGVkOwogCXVuc2lnbmVkIGNoYXIJCWlyX3JvdXRlcl9ub2RlW0lQWF9OT0RFX0xFTl07CkBAIC04MiwxMCArODIsMTAgQEAKICNpZmRlZiBfX0tFUk5FTF9fCiBzdHJ1Y3QgaXB4X2NiIHsKIAl1OAlpcHhfdGN0cmw7Ci0JdTMyCWlweF9kZXN0X25ldDsKLQl1MzIJaXB4X3NvdXJjZV9uZXQ7CisJX19iZTMyCWlweF9kZXN0X25ldDsKKwlfX2JlMzIJaXB4X3NvdXJjZV9uZXQ7CiAJc3RydWN0IHsKLQkJdTMyIG5ldG51bTsKKwkJX19iZTMyIG5ldG51bTsKIAkJaW50IGluZGV4OwogCX0gbGFzdF9ob3A7CiB9OwpAQCAtOTcsNyArOTcsNyBAQAogCXN0cnVjdCBzb2NrCQlzazsKIAlzdHJ1Y3QgaXB4X2FkZHJlc3MJZGVzdF9hZGRyOwogCXN0cnVjdCBpcHhfaW50ZXJmYWNlCSppbnRyZmM7Ci0JdW5zaWduZWQgc2hvcnQJCXBvcnQ7CisJX19iZTE2CQkJcG9ydDsKICNpZmRlZiBDT05GSUdfSVBYX0lOVEVSTgogCXVuc2lnbmVkIGNoYXIJCW5vZGVbSVBYX05PREVfTEVOXTsKICNlbmRpZgpAQCAtMTMyLDcgKzEzMiw3IEBACiBleHRlcm4gaW50IGlweF9wcm9jX2luaXQodm9pZCk7CiBleHRlcm4gdm9pZCBpcHhfcHJvY19leGl0KHZvaWQpOwogCi1leHRlcm4gY29uc3QgY2hhciAqaXB4X2ZyYW1lX25hbWUodW5zaWduZWQgc2hvcnQpOworZXh0ZXJuIGNvbnN0IGNoYXIgKmlweF9mcmFtZV9uYW1lKF9fYmUxNik7CiBleHRlcm4gY29uc3QgY2hhciAqaXB4X2RldmljZV9uYW1lKHN0cnVjdCBpcHhfaW50ZXJmYWNlICppbnRyZmMpOwogCiBzdGF0aWMgX19pbmxpbmVfXyB2b2lkIGlweGl0Zl9ob2xkKHN0cnVjdCBpcHhfaW50ZXJmYWNlICppbnRyZmMpCmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC9uZXRsYWJlbC5oIGIvaW5jbHVkZS9uZXQvbmV0bGFiZWwuaAppbmRleCBjNjNhNTgwLi4xMmMyMTRiIDEwMDY0NAotLS0gYS9pbmNsdWRlL25ldC9uZXRsYWJlbC5oCisrKyBiL2luY2x1ZGUvbmV0L25ldGxhYmVsLmgKQEAgLTM0LDYgKzM0LDcgQEAKICNpbmNsdWRlIDxsaW51eC9uZXQuaD4KICNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KICNpbmNsdWRlIDxuZXQvbmV0bGluay5oPgorI2luY2x1ZGUgPGFzbS9hdG9taWMuaD4KIAogLyoKICAqIE5ldExhYmVsIC0gQSBtYW5hZ2VtZW50IGludGVyZmFjZSBmb3IgbWFpbnRhaW5pbmcgbmV0d29yayBwYWNrZXQgbGFiZWwKQEAgLTEwNiw2ICsxMDcsNyBAQAogCiAvKiBMU00gc2VjdXJpdHkgYXR0cmlidXRlcyAqLwogc3RydWN0IG5ldGxibF9sc21fY2FjaGUgeworCWF0b21pY190IHJlZmNvdW50OwogCXZvaWQgKCpmcmVlKSAoY29uc3Qgdm9pZCAqZGF0YSk7CiAJdm9pZCAqZGF0YTsKIH07CkBAIC0xMTcsNyArMTE5LDcgQEAKIAl1bnNpZ25lZCBjaGFyICptbHNfY2F0OwogCXNpemVfdCBtbHNfY2F0X2xlbjsKIAotCXN0cnVjdCBuZXRsYmxfbHNtX2NhY2hlIGNhY2hlOworCXN0cnVjdCBuZXRsYmxfbHNtX2NhY2hlICpjYWNoZTsKIH07CiAKIC8qCkBAIC0xMjYsNiArMTI4LDQzIEBACiAKIAogLyoqCisgKiBuZXRsYmxfc2VjYXR0cl9jYWNoZV9hbGxvYyAtIEFsbG9jYXRlIGFuZCBpbml0aWFsaXplIGEgc2VjYXR0ciBjYWNoZQorICogQGZsYWdzOiB0aGUgbWVtb3J5IGFsbG9jYXRpb24gZmxhZ3MKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIEFsbG9jYXRlIGFuZCBpbml0aWFsaXplIGEgbmV0bGJsX2xzbV9jYWNoZSBzdHJ1Y3R1cmUuICBSZXR1cm5zIGEgcG9pbnRlcgorICogb24gc3VjY2VzcywgTlVMTCBvbiBmYWlsdXJlLgorICoKKyAqLworc3RhdGljIGlubGluZSBzdHJ1Y3QgbmV0bGJsX2xzbV9jYWNoZSAqbmV0bGJsX3NlY2F0dHJfY2FjaGVfYWxsb2MoZ2ZwX3QgZmxhZ3MpCit7CisJc3RydWN0IG5ldGxibF9sc21fY2FjaGUgKmNhY2hlOworCisJY2FjaGUgPSBremFsbG9jKHNpemVvZigqY2FjaGUpLCBmbGFncyk7CisJaWYgKGNhY2hlKQorCQlhdG9taWNfc2V0KCZjYWNoZS0+cmVmY291bnQsIDEpOworCXJldHVybiBjYWNoZTsKK30KKworLyoqCisgKiBuZXRsYmxfc2VjYXR0cl9jYWNoZV9mcmVlIC0gRnJlZXMgYSBuZXRsYmxfbHNtX2NhY2hlIHN0cnVjdAorICogQGNhY2hlOiB0aGUgc3RydWN0IHRvIGZyZWUKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIEZyZWVzIEBzZWNhdHRyIGluY2x1ZGluZyBhbGwgb2YgdGhlIGludGVybmFsIGJ1ZmZlcnMuCisgKgorICovCitzdGF0aWMgaW5saW5lIHZvaWQgbmV0bGJsX3NlY2F0dHJfY2FjaGVfZnJlZShzdHJ1Y3QgbmV0bGJsX2xzbV9jYWNoZSAqY2FjaGUpCit7CisJaWYgKCFhdG9taWNfZGVjX2FuZF90ZXN0KCZjYWNoZS0+cmVmY291bnQpKQorCQlyZXR1cm47CisKKwlpZiAoY2FjaGUtPmZyZWUpCisJCWNhY2hlLT5mcmVlKGNhY2hlLT5kYXRhKTsKKwlrZnJlZShjYWNoZSk7Cit9CisKKy8qKgogICogbmV0bGJsX3NlY2F0dHJfaW5pdCAtIEluaXRpYWxpemUgYSBuZXRsYmxfbHNtX3NlY2F0dHIgc3RydWN0CiAgKiBAc2VjYXR0cjogdGhlIHN0cnVjdCB0byBpbml0aWFsaXplCiAgKgpAQCAtMTQzLDIwICsxODIsMTYgQEAKIC8qKgogICogbmV0bGJsX3NlY2F0dHJfZGVzdHJveSAtIENsZWFycyBhIG5ldGxibF9sc21fc2VjYXR0ciBzdHJ1Y3QKICAqIEBzZWNhdHRyOiB0aGUgc3RydWN0IHRvIGNsZWFyCi0gKiBAY2xlYXJfY2FjaGU6IGNhY2hlIGNsZWFyIGZsYWcKICAqCiAgKiBEZXNjcmlwdGlvbjoKICAqIERlc3Ryb3lzIHRoZSBAc2VjYXR0ciBzdHJ1Y3QsIGluY2x1ZGluZyBmcmVlaW5nIGFsbCBvZiB0aGUgaW50ZXJuYWwgYnVmZmVycy4KLSAqIElmIEBjbGVhcl9jYWNoZSBpcyB0cnVlIHRoZW4gZnJlZSB0aGUgY2FjaGUgZmllbGRzLCBvdGhlcndpc2UgbGVhdmUgdGhlbQotICogaW50YWN0LiAgVGhlIHN0cnVjdCBtdXN0IGJlIHJlc2V0IHdpdGggYSBjYWxsIHRvIG5ldGxibF9zZWNhdHRyX2luaXQoKQotICogYmVmb3JlIHJldXNlLgorICogVGhlIHN0cnVjdCBtdXN0IGJlIHJlc2V0IHdpdGggYSBjYWxsIHRvIG5ldGxibF9zZWNhdHRyX2luaXQoKSBiZWZvcmUgcmV1c2UuCiAgKgogICovCi1zdGF0aWMgaW5saW5lIHZvaWQgbmV0bGJsX3NlY2F0dHJfZGVzdHJveShzdHJ1Y3QgbmV0bGJsX2xzbV9zZWNhdHRyICpzZWNhdHRyLAotCQkJCQkgIHUzMiBjbGVhcl9jYWNoZSkKK3N0YXRpYyBpbmxpbmUgdm9pZCBuZXRsYmxfc2VjYXR0cl9kZXN0cm95KHN0cnVjdCBuZXRsYmxfbHNtX3NlY2F0dHIgKnNlY2F0dHIpCiB7Ci0JaWYgKGNsZWFyX2NhY2hlICYmIHNlY2F0dHItPmNhY2hlLmRhdGEgIT0gTlVMTCAmJiBzZWNhdHRyLT5jYWNoZS5mcmVlKQotCQlzZWNhdHRyLT5jYWNoZS5mcmVlKHNlY2F0dHItPmNhY2hlLmRhdGEpOworCWlmIChzZWNhdHRyLT5jYWNoZSkKKwkJbmV0bGJsX3NlY2F0dHJfY2FjaGVfZnJlZShzZWNhdHRyLT5jYWNoZSk7CiAJa2ZyZWUoc2VjYXR0ci0+ZG9tYWluKTsKIAlrZnJlZShzZWNhdHRyLT5tbHNfY2F0KTsKIH0KQEAgLTE3OCwxNyArMjEzLDE0IEBACiAvKioKICAqIG5ldGxibF9zZWNhdHRyX2ZyZWUgLSBGcmVlcyBhIG5ldGxibF9sc21fc2VjYXR0ciBzdHJ1Y3QKICAqIEBzZWNhdHRyOiB0aGUgc3RydWN0IHRvIGZyZWUKLSAqIEBjbGVhcl9jYWNoZTogY2FjaGUgY2xlYXIgZmxhZwogICoKICAqIERlc2NyaXB0aW9uOgotICogRnJlZXMgQHNlY2F0dHIgaW5jbHVkaW5nIGFsbCBvZiB0aGUgaW50ZXJuYWwgYnVmZmVycy4gIElmIEBjbGVhcl9jYWNoZSBpcwotICogdHJ1ZSB0aGVuIGZyZWUgdGhlIGNhY2hlIGZpZWxkcywgb3RoZXJ3aXNlIGxlYXZlIHRoZW0gaW50YWN0LgorICogRnJlZXMgQHNlY2F0dHIgaW5jbHVkaW5nIGFsbCBvZiB0aGUgaW50ZXJuYWwgYnVmZmVycy4KICAqCiAgKi8KLXN0YXRpYyBpbmxpbmUgdm9pZCBuZXRsYmxfc2VjYXR0cl9mcmVlKHN0cnVjdCBuZXRsYmxfbHNtX3NlY2F0dHIgKnNlY2F0dHIsCi0JCQkJICAgICAgIHUzMiBjbGVhcl9jYWNoZSkKK3N0YXRpYyBpbmxpbmUgdm9pZCBuZXRsYmxfc2VjYXR0cl9mcmVlKHN0cnVjdCBuZXRsYmxfbHNtX3NlY2F0dHIgKnNlY2F0dHIpCiB7Ci0JbmV0bGJsX3NlY2F0dHJfZGVzdHJveShzZWNhdHRyLCBjbGVhcl9jYWNoZSk7CisJbmV0bGJsX3NlY2F0dHJfZGVzdHJveShzZWNhdHRyKTsKIAlrZnJlZShzZWNhdHRyKTsKIH0KIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZXQvc2N0cC9zY3RwLmggYi9pbmNsdWRlL25ldC9zY3RwL3NjdHAuaAppbmRleCBlZTY4YTMxLi43NjRlM2FmIDEwMDY0NAotLS0gYS9pbmNsdWRlL25ldC9zY3RwL3NjdHAuaAorKysgYi9pbmNsdWRlL25ldC9zY3RwL3NjdHAuaApAQCAtMTM5LDYgKzEzOSw3IEBACiB2b2lkIHNjdHBfd3JpdGVfc3BhY2Uoc3RydWN0IHNvY2sgKnNrKTsKIHVuc2lnbmVkIGludCBzY3RwX3BvbGwoc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCBzb2NrZXQgKnNvY2ssCiAJCXBvbGxfdGFibGUgKndhaXQpOwordm9pZCBzY3RwX3NvY2tfcmZyZWUoc3RydWN0IHNrX2J1ZmYgKnNrYik7CiAKIC8qCiAgKiBzY3RwL3ByaW1pdGl2ZS5jCkBAIC00NDQsNiArNDQ1LDE5IEBACiAJcmV0dXJuIHJlc3VsdDsKIH0KIAorLyogU0NUUCB2ZXJzaW9uIG9mIHNrYl9zZXRfb3duZXJfci4gIFdlIG5lZWQgdGhpcyBvbmUgYmVjYXVzZQorICogb2YgdGhlIHdheSB3ZSBoYXZlIHRvIGRvIHJlY2VpdmUgYnVmZmVyIGFjY291bnRpbmcgb24gYnVuZGxlZAorICogY2h1bmtzLgorICovCitzdGF0aWMgaW5saW5lIHZvaWQgc2N0cF9za2Jfc2V0X293bmVyX3Ioc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IHNvY2sgKnNrKQoreworCXN0cnVjdCBzY3RwX3VscGV2ZW50ICpldmVudCA9IHNjdHBfc2tiMmV2ZW50KHNrYik7CisKKwlza2ItPnNrID0gc2s7CisJc2tiLT5kZXN0cnVjdG9yID0gc2N0cF9zb2NrX3JmcmVlOworCWF0b21pY19hZGQoZXZlbnQtPnJtZW1fbGVuLCAmc2stPnNrX3JtZW1fYWxsb2MpOworfQorCiAvKiBUZXN0cyBpZiB0aGUgbGlzdCBoYXMgb25lIGFuZCBvbmx5IG9uZSBlbnRyeS4gKi8KIHN0YXRpYyBpbmxpbmUgaW50IHNjdHBfbGlzdF9zaW5nbGVfZW50cnkoc3RydWN0IGxpc3RfaGVhZCAqaGVhZCkKIHsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmV0L3NjdHAvdWxwZXZlbnQuaCBiL2luY2x1ZGUvbmV0L3NjdHAvdWxwZXZlbnQuaAppbmRleCA2YzQwY2ZjLi4xYTRkZGMxIDEwMDY0NAotLS0gYS9pbmNsdWRlL25ldC9zY3RwL3VscGV2ZW50LmgKKysrIGIvaW5jbHVkZS9uZXQvc2N0cC91bHBldmVudC5oCkBAIC02Myw2ICs2Myw3IEBACiAJX191MzIgY3VtdHNuOwogCWludCBtc2dfZmxhZ3M7CiAJaW50IGlpZjsKKwl1bnNpZ25lZCBpbnQgcm1lbV9sZW47CiB9OwogCiAvKiBSZXRyaWV2ZSB0aGUgc2tiIHRoaXMgZXZlbnQgc2l0cyBpbnNpZGUgb2YuICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC9zb2NrLmggYi9pbmNsdWRlL25ldC9zb2NrLmgKaW5kZXggNDBiYjkwZS4uYWMyODZhMyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9uZXQvc29jay5oCisrKyBiL2luY2x1ZGUvbmV0L3NvY2suaApAQCAtODg0LDggKzg4NCw3IEBACiAKIC8qKgogICoJc2tfZmlsdGVyX3JlbGVhc2U6IFJlbGVhc2UgYSBzb2NrZXQgZmlsdGVyCi0gKglAc2s6IHNvY2tldAotICoJQGZwOiBmaWx0ZXIgdG8gcmVtb3ZlCisgKglAcmN1OiByY3VfaGVhZCB0aGF0IGNvbnRhaW5zIHRoZSBza19maWx0ZXIgaW5mbyB0byByZW1vdmUKICAqCiAgKglSZW1vdmUgYSBmaWx0ZXIgZnJvbSBhIHNvY2tldCBhbmQgcmVsZWFzZSBpdHMgcmVzb3VyY2VzLgogICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC90aW1ld2FpdF9zb2NrLmggYi9pbmNsdWRlL25ldC90aW1ld2FpdF9zb2NrLmgKaW5kZXggMjU0NDI4MS4uYmUyOTNkNyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9uZXQvdGltZXdhaXRfc29jay5oCisrKyBiL2luY2x1ZGUvbmV0L3RpbWV3YWl0X3NvY2suaApAQCAtMTksNiArMTksNyBAQAogCXVuc2lnbmVkIGludAl0d3NrX29ial9zaXplOwogCWludAkJKCp0d3NrX3VuaXF1ZSkoc3RydWN0IHNvY2sgKnNrLAogCQkJCSAgICAgICBzdHJ1Y3Qgc29jayAqc2t0dywgdm9pZCAqdHdwKTsKKwl2b2lkCQkoKnR3c2tfZGVzdHJ1Y3Rvcikoc3RydWN0IHNvY2sgKnNrKTsKIH07CiAKIHN0YXRpYyBpbmxpbmUgaW50IHR3c2tfdW5pcXVlKHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHNvY2sgKnNrdHcsIHZvaWQgKnR3cCkKQEAgLTI4LDQgKzI5LDEwIEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBpbmxpbmUgdm9pZCB0d3NrX2Rlc3RydWN0b3Ioc3RydWN0IHNvY2sgKnNrKQoreworCWlmIChzay0+c2tfcHJvdC0+dHdza19wcm90LT50d3NrX2Rlc3RydWN0b3IgIT0gTlVMTCkKKwkJc2stPnNrX3Byb3QtPnR3c2tfcHJvdC0+dHdza19kZXN0cnVjdG9yKHNrKTsKK30KKwogI2VuZGlmIC8qIF9USU1FV0FJVF9TT0NLX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmV0L3hmcm0uaCBiL2luY2x1ZGUvbmV0L3hmcm0uaAppbmRleCAxZTJhNGRkLi43MzdmZGIyIDEwMDY0NAotLS0gYS9pbmNsdWRlL25ldC94ZnJtLmgKKysrIGIvaW5jbHVkZS9uZXQveGZybS5oCkBAIC05OTUsNyArOTk1LDggQEAKIAkJCQkgIGludCBjcmVhdGUsIHVuc2lnbmVkIHNob3J0IGZhbWlseSk7CiBleHRlcm4gdm9pZCB4ZnJtX3BvbGljeV9mbHVzaCh1OCB0eXBlKTsKIGV4dGVybiBpbnQgeGZybV9za19wb2xpY3lfaW5zZXJ0KHN0cnVjdCBzb2NrICpzaywgaW50IGRpciwgc3RydWN0IHhmcm1fcG9saWN5ICpwb2wpOwotZXh0ZXJuIGludCB4ZnJtX2J1bmRsZV9vayhzdHJ1Y3QgeGZybV9kc3QgKnhkc3QsIHN0cnVjdCBmbG93aSAqZmwsIGludCBmYW1pbHksIGludCBzdHJpY3QpOworZXh0ZXJuIGludCB4ZnJtX2J1bmRsZV9vayhzdHJ1Y3QgeGZybV9wb2xpY3kgKnBvbCwgc3RydWN0IHhmcm1fZHN0ICp4ZHN0LAorCQkJICBzdHJ1Y3QgZmxvd2kgKmZsLCBpbnQgZmFtaWx5LCBpbnQgc3RyaWN0KTsKIGV4dGVybiB2b2lkIHhmcm1faW5pdF9wbXR1KHN0cnVjdCBkc3RfZW50cnkgKmRzdCk7CiAKIGV4dGVybiB3YWl0X3F1ZXVlX2hlYWRfdCBrbV93YWl0cTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvcmRtYS9pYl9hZGRyLmggYi9pbmNsdWRlL3JkbWEvaWJfYWRkci5oCmluZGV4IDgxYjYyMzA3Li5jMDk0ZTUwIDEwMDY0NAotLS0gYS9pbmNsdWRlL3JkbWEvaWJfYWRkci5oCisrKyBiL2luY2x1ZGUvcmRtYS9pYl9hZGRyLmgKQEAgLTM2LDYgKzM2LDIyIEBACiAjaW5jbHVkZSA8bGludXgvc29ja2V0Lmg+CiAjaW5jbHVkZSA8cmRtYS9pYl92ZXJicy5oPgogCitzdHJ1Y3QgcmRtYV9hZGRyX2NsaWVudCB7CisJYXRvbWljX3QgcmVmY291bnQ7CisJc3RydWN0IGNvbXBsZXRpb24gY29tcDsKK307CisKKy8qKgorICogcmRtYV9hZGRyX3JlZ2lzdGVyX2NsaWVudCAtIFJlZ2lzdGVyIGFuIGFkZHJlc3MgY2xpZW50LgorICovCit2b2lkIHJkbWFfYWRkcl9yZWdpc3Rlcl9jbGllbnQoc3RydWN0IHJkbWFfYWRkcl9jbGllbnQgKmNsaWVudCk7CisKKy8qKgorICogcmRtYV9hZGRyX3VucmVnaXN0ZXJfY2xpZW50IC0gRGVyZWdpc3RlciBhbiBhZGRyZXNzIGNsaWVudC4KKyAqIEBjbGllbnQ6IENsaWVudCBvYmplY3QgdG8gZGVyZWdpc3Rlci4KKyAqLwordm9pZCByZG1hX2FkZHJfdW5yZWdpc3Rlcl9jbGllbnQoc3RydWN0IHJkbWFfYWRkcl9jbGllbnQgKmNsaWVudCk7CisKIHN0cnVjdCByZG1hX2Rldl9hZGRyIHsKIAl1bnNpZ25lZCBjaGFyIHNyY19kZXZfYWRkcltNQVhfQUREUl9MRU5dOwogCXVuc2lnbmVkIGNoYXIgZHN0X2Rldl9hZGRyW01BWF9BRERSX0xFTl07CkBAIC01Miw2ICs2OCw3IEBACiAvKioKICAqIHJkbWFfcmVzb2x2ZV9pcCAtIFJlc29sdmUgc291cmNlIGFuZCBkZXN0aW5hdGlvbiBJUCBhZGRyZXNzZXMgdG8KICAqICAgUkRNQSBoYXJkd2FyZSBhZGRyZXNzZXMuCisgKiBAY2xpZW50OiBBZGRyZXNzIGNsaWVudCBhc3NvY2lhdGVkIHdpdGggcmVxdWVzdC4KICAqIEBzcmNfYWRkcjogQW4gb3B0aW9uYWwgc291cmNlIGFkZHJlc3MgdG8gdXNlIGluIHRoZSByZXNvbHV0aW9uLiAgSWYgYQogICogICBzb3VyY2UgYWRkcmVzcyBpcyBub3QgcHJvdmlkZWQsIGEgdXNhYmxlIGFkZHJlc3Mgd2lsbCBiZSByZXR1cm5lZCB2aWEKICAqICAgdGhlIGNhbGxiYWNrLgpAQCAtNjQsNyArODEsOCBAQAogICogICBvciBiZWVuIGNhbmNlbGVkLiAgQSBzdGF0dXMgb2YgMCBpbmRpY2F0ZXMgc3VjY2Vzcy4KICAqIEBjb250ZXh0OiBVc2VyLXNwZWNpZmllZCBjb250ZXh0IGFzc29jaWF0ZWQgd2l0aCB0aGUgY2FsbC4KICAqLwotaW50IHJkbWFfcmVzb2x2ZV9pcChzdHJ1Y3Qgc29ja2FkZHIgKnNyY19hZGRyLCBzdHJ1Y3Qgc29ja2FkZHIgKmRzdF9hZGRyLAoraW50IHJkbWFfcmVzb2x2ZV9pcChzdHJ1Y3QgcmRtYV9hZGRyX2NsaWVudCAqY2xpZW50LAorCQkgICAgc3RydWN0IHNvY2thZGRyICpzcmNfYWRkciwgc3RydWN0IHNvY2thZGRyICpkc3RfYWRkciwKIAkJICAgIHN0cnVjdCByZG1hX2Rldl9hZGRyICphZGRyLCBpbnQgdGltZW91dF9tcywKIAkJICAgIHZvaWQgKCpjYWxsYmFjaykoaW50IHN0YXR1cywgc3RydWN0IHNvY2thZGRyICpzcmNfYWRkciwKIAkJCQkgICAgIHN0cnVjdCByZG1hX2Rldl9hZGRyICphZGRyLCB2b2lkICpjb250ZXh0KSwKZGlmZiAtLWdpdCBhL2luY2x1ZGUvcmRtYS9pYl91c2VyX3ZlcmJzLmggYi9pbmNsdWRlL3JkbWEvaWJfdXNlcl92ZXJicy5oCmluZGV4IGRiMWI4MTQuLjY0YTcyMWYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvcmRtYS9pYl91c2VyX3ZlcmJzLmgKKysrIGIvaW5jbHVkZS9yZG1hL2liX3VzZXJfdmVyYnMuaApAQCAtNDU4LDcgKzQ1OCw3IEBACiAJX191OCAgY3VyX3FwX3N0YXRlOwogCV9fdTggIHBhdGhfbXR1OwogCV9fdTggIHBhdGhfbWlnX3N0YXRlOwotCV9fdTggIGVuX3NxZF9hc3luY19ub3RpZnk7CisJX191OCAgc3FfZHJhaW5pbmc7CiAJX191OCAgbWF4X3JkX2F0b21pYzsKIAlfX3U4ICBtYXhfZGVzdF9yZF9hdG9taWM7CiAJX191OCAgbWluX3Jucl90aW1lcjsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvc2NzaS9saWJpc2NzaS5oIGIvaW5jbHVkZS9zY3NpL2xpYmlzY3NpLmgKaW5kZXggNDAxMTkyZS4uNjFlZWJlYyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9zY3NpL2xpYmlzY3NpLmgKKysrIGIvaW5jbHVkZS9zY3NpL2xpYmlzY3NpLmgKQEAgLTEzNiw3ICsxMzYsNiBAQAogCiAJLyogY29udHJvbCBkYXRhICovCiAJaW50CQkJaWQ7CQkvKiBDSUQgKi8KLQlzdHJ1Y3QgbGlzdF9oZWFkCWl0ZW07CQkvKiBtYWludGFpbnMgbGlzdCBvZiBjb25ucyAqLwogCWludAkJCWNfc3RhZ2U7CS8qIGNvbm5lY3Rpb24gc3RhdGUgKi8KIAkvKgogCSAqIFByZWFsbG9jYXRlZCBidWZmZXIgZm9yIHBkdXMgdGhhdCBoYXZlIGRhdGEgYnV0IGRvIG5vdApAQCAtMjM1LDEwICsyMzQsOCBAQAogCQkJCQkJICogLSBtZ210cG9vbCwJCSAgICoKIAkJCQkJCSAqIC0gcjJ0cG9vbAkJICAgKi8KIAlpbnQJCQlzdGF0ZTsJCS8qIHNlc3Npb24gc3RhdGUgICAgICAgICAgICovCi0Jc3RydWN0IGxpc3RfaGVhZAlpdGVtOwogCWludAkJCWFnZTsJCS8qIGNvdW50cyBzZXNzaW9uIHJlLW9wZW5zICovCiAKLQlzdHJ1Y3QgbGlzdF9oZWFkCWNvbm5lY3Rpb25zOwkvKiBsaXN0IG9mIGNvbm5lY3Rpb25zICovCiAJaW50CQkJY21kc19tYXg7CS8qIHNpemUgb2YgY21kcyBhcnJheSAqLwogCXN0cnVjdCBpc2NzaV9jbWRfdGFzawkqKmNtZHM7CQkvKiBPcmlnaW5hbCBDbWRzIGFyciAqLwogCXN0cnVjdCBpc2NzaV9xdWV1ZQljbWRwb29sOwkvKiBQRFUncyBwb29sICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL3Njc2kvc2NzaS5oIGIvaW5jbHVkZS9zY3NpL3Njc2kuaAppbmRleCA4NGE2ZDVmLi41YzBlOTc5IDEwMDY0NAotLS0gYS9pbmNsdWRlL3Njc2kvc2NzaS5oCisrKyBiL2luY2x1ZGUvc2NzaS9zY3NpLmgKQEAgLTk3LDYgKzk3LDcgQEAKICNkZWZpbmUgUEVSU0lTVEVOVF9SRVNFUlZFX0lOIDB4NWUKICNkZWZpbmUgUEVSU0lTVEVOVF9SRVNFUlZFX09VVCAweDVmCiAjZGVmaW5lIFJFUE9SVF9MVU5TICAgICAgICAgICAweGEwCisjZGVmaW5lIE1BSU5URU5BTkNFX0lOICAgICAgICAweGEzCiAjZGVmaW5lIE1PVkVfTUVESVVNICAgICAgICAgICAweGE1CiAjZGVmaW5lIEVYQ0hBTkdFX01FRElVTSAgICAgICAweGE2CiAjZGVmaW5lIFJFQURfMTIgICAgICAgICAgICAgICAweGE4CkBAIC0xMTQsNiArMTE1LDggQEAKICNkZWZpbmUgU0VSVklDRV9BQ1RJT05fSU4gICAgIDB4OWUKIC8qIHZhbHVlcyBmb3Igc2VydmljZSBhY3Rpb24gaW4gKi8KICNkZWZpbmUJU0FJX1JFQURfQ0FQQUNJVFlfMTYgIDB4MTAKKy8qIHZhbHVlcyBmb3IgbWFpbnRlbmFuY2UgaW4gKi8KKyNkZWZpbmUgTUlfUkVQT1JUX1RBUkdFVF9QR1MgIDB4MGEKIAogLyogVmFsdWVzIGZvciBUMTAvMDQtMjYycjcgKi8KICNkZWZpbmUJQVRBXzE2CQkgICAgICAweDg1CS8qIDE2LWJ5dGUgcGFzcy10aHJ1ICovCkBAIC00MzAsNyArNDMzLDcgQEAKICNkZWZpbmUgU0NTSV9JT0NUTF9HRVRfUENJCQkweDUzODcKIAogLyogUHVsbCBhIHUzMiBvdXQgb2YgYSBTQ1NJIG1lc3NhZ2UgKHVzaW5nIEJFIFNDU0kgY29udmVudGlvbnMpICovCi1zdGF0aWMgaW5saW5lIHUzMiBzY3NpX3RvX3UzMih1OCAqcHRyKQorc3RhdGljIGlubGluZSBfX3UzMiBzY3NpX3RvX3UzMihfX3U4ICpwdHIpCiB7CiAJcmV0dXJuIChwdHJbMF08PDI0KSArIChwdHJbMV08PDE2KSArIChwdHJbMl08PDgpICsgcHRyWzNdOwogfQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9zY3NpL3Njc2lfdHJhbnNwb3J0X2lzY3NpLmggYi9pbmNsdWRlL3Njc2kvc2NzaV90cmFuc3BvcnRfaXNjc2kuaAppbmRleCAzOWU4MzMyLi40Yjk1Yzg5IDEwMDY0NAotLS0gYS9pbmNsdWRlL3Njc2kvc2NzaV90cmFuc3BvcnRfaXNjc2kuaAorKysgYi9pbmNsdWRlL3Njc2kvc2NzaV90cmFuc3BvcnRfaXNjc2kuaApAQCAtMjksNyArMjksNiBAQAogc3RydWN0IHNjc2lfdHJhbnNwb3J0X3RlbXBsYXRlOwogc3RydWN0IGlzY3NpX3RyYW5zcG9ydDsKIHN0cnVjdCBTY3NpX0hvc3Q7Ci1zdHJ1Y3QgbWVtcG9vbF96b25lOwogc3RydWN0IGlzY3NpX2Nsc19jb25uOwogc3RydWN0IGlzY3NpX2Nvbm47CiBzdHJ1Y3QgaXNjc2lfY21kX3Rhc2s7CkBAIC0xNTcsOSArMTU2LDYgQEAKIAogCWludCBhY3RpdmU7CQkJLyogbXVzdCBiZSBhY2Nlc3NlZCB3aXRoIHRoZSBjb25ubG9jayAqLwogCXN0cnVjdCBkZXZpY2UgZGV2OwkJLyogc3lzZnMgdHJhbnNwb3J0L2NvbnRhaW5lciBkZXZpY2UgKi8KLQlzdHJ1Y3QgbWVtcG9vbF96b25lICp6X2Vycm9yOwotCXN0cnVjdCBtZW1wb29sX3pvbmUgKnpfcGR1OwotCXN0cnVjdCBsaXN0X2hlYWQgZnJlZXF1ZXVlOwogfTsKIAogI2RlZmluZSBpc2NzaV9kZXZfdG9fY29ubihfZGV2KSBcCmRpZmYgLS1naXQgYS9pbmNsdWRlL3NvdW5kL3ZlcnNpb24uaCBiL2luY2x1ZGUvc291bmQvdmVyc2lvbi5oCmluZGV4IDRhZDg2ZWIuLjUyZmQ2ODcgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvc291bmQvdmVyc2lvbi5oCisrKyBiL2luY2x1ZGUvc291bmQvdmVyc2lvbi5oCkBAIC0xLDMgKzEsMyBAQAogLyogaW5jbHVkZS92ZXJzaW9uLmguICBHZW5lcmF0ZWQgYnkgYWxzYS9rc3luYyBzY3JpcHQuICAqLwogI2RlZmluZSBDT05GSUdfU05EX1ZFUlNJT04gIjEuMC4xMyIKLSNkZWZpbmUgQ09ORklHX1NORF9EQVRFICIgKEZyaSBPY3QgMDYgMTg6Mjg6MTkgMjAwNiBVVEMpIgorI2RlZmluZSBDT05GSUdfU05EX0RBVEUgIiAoU3VuIE9jdCAyMiAwODo1NjoxNiAyMDA2IFVUQykiCmRpZmYgLS1naXQgYS9pbml0L0tjb25maWcgYi9pbml0L0tjb25maWcKaW5kZXggMTAzODI5My4uMTc2ZjdlNSAxMDA2NDQKLS0tIGEvaW5pdC9LY29uZmlnCisrKyBiL2luaXQvS2NvbmZpZwpAQCAtMSw1ICsxLDYgQEAKIGNvbmZpZyBERUZDT05GSUdfTElTVAogCXN0cmluZworCWRlcGVuZHMgb24gIVVNTAogCW9wdGlvbiBkZWZjb25maWdfbGlzdAogCWRlZmF1bHQgIi9saWIvbW9kdWxlcy8kVU5BTUVfUkVMRUFTRS8uY29uZmlnIgogCWRlZmF1bHQgIi9ldGMva2VybmVsLWNvbmZpZyIKQEAgLTMwMywyMCArMzA0LDE5IEBACiAKIGNvbmZpZyBTWVNDVExfU1lTQ0FMTAogCWJvb2wgIlN5c2N0bCBzeXNjYWxsIHN1cHBvcnQiIGlmIEVNQkVEREVECi0JZGVmYXVsdCBuCisJZGVmYXVsdCB5CiAJc2VsZWN0IFNZU0NUTAogCS0tLWhlbHAtLS0KLQkgIEVuYWJsZSB0aGUgZGVwcmVjYXRlZCBzeXNjdGwgc3lzdGVtIGNhbGwuICBzeXNfc3lzY3RsIHVzZXMKLQkgIGJpbmFyeSBwYXRocyB0aGF0IGhhdmUgYmVlbiBmb3VuZCB0byBiZSBhIG1ham9yIHBhaW4gdG8gbWFpbnRhaW4KLQkgIGFuZCB1c2UuICBUaGUgaW50ZXJmYWNlIGluIC9wcm9jL3N5cyBpcyBub3cgdGhlIHByaW1hcnkgYW5kIHdoYXQKLQkgIGV2ZXJ5b25lIHVzZXMuCisJICBzeXNfc3lzY3RsIHVzZXMgYmluYXJ5IHBhdGhzIHRoYXQgaGF2ZSBiZWVuIGZvdW5kIGNoYWxsZW5naW5nCisJICB0byBwcm9wZXJseSBtYWludGFpbiBhbmQgdXNlLiAgVGhlIGludGVyZmFjZSBpbiAvcHJvYy9zeXMKKwkgIHVzaW5nIHBhdGhzIHdpdGggYXNjaWkgbmFtZXMgaXMgbm93IHRoZSBwcmltYXJ5IHBhdGggdG8gdGhpcworCSAgaW5mb3JtYXRpb24uCiAKLQkgIE5vdGhpbmcgaGFzIGJlZW4gdXNpbmcgdGhlIGJpbmFyeSBzeXNjdGwgaW50ZXJmYWNlIGZvciBzb21lCi0JICB0aW1lIG5vdyBzbyBub3RoaW5nIHNob3VsZCBicmVhayBpZiB5b3UgZGlzYWJsZSBzeXNjdGwgc3lzY2FsbAotCSAgc3VwcG9ydCwgYW5kIHlvdXIga2VybmVsIHdpbGwgZ2V0IG1hcmdpbmFsbHkgc21hbGxlci4KKwkgIEFsbW9zdCBub3RoaW5nIHVzaW5nIHRoZSBiaW5hcnkgc3lzY3RsIGludGVyZmFjZSBzbyBpZiB5b3UgYXJlCisJICB0cnlpbmcgdG8gc2F2ZSBzb21lIHNwYWNlIGl0IGlzIHByb2JhYmx5IHNhZmUgdG8gZGlzYWJsZSB0aGlzLAorCSAgbWFraW5nIHlvdXIga2VybmVsIG1hcmdpbmFsbHkgc21hbGxlci4KIAotCSAgVW5sZXNzIHlvdSBoYXZlIGFuIGFwcGxpY2F0aW9uIHRoYXQgdXNlcyB0aGUgc3lzX3N5c2N0bCBpbnRlcmZhY2UKLSAJICB5b3Ugc2hvdWxkIHByb2JhYmx5IHNheSBOIGhlcmUuCisJICBJZiB1bnN1cmUgc2F5IFkgaGVyZS4KIAogY29uZmlnIEtBTExTWU1TCiAJIGJvb2wgIkxvYWQgYWxsIHN5bWJvbHMgZm9yIGRlYnVnZ2luZy9ra3N5bW9vcHMiIGlmIEVNQkVEREVECmRpZmYgLS1naXQgYS9pbml0L21haW4uYyBiL2luaXQvbWFpbi5jCmluZGV4IGVlMTIzMjQuLjM2ZjYwOGEgMTAwNjQ0Ci0tLSBhL2luaXQvbWFpbi5jCisrKyBiL2luaXQvbWFpbi5jCkBAIC01MDMsNiArNTAzLDcgQEAKIAlwcmludGsoS0VSTl9OT1RJQ0UpOwogCXByaW50ayhsaW51eF9iYW5uZXIpOwogCXNldHVwX2FyY2goJmNvbW1hbmRfbGluZSk7CisJdW53aW5kX3NldHVwKCk7CiAJc2V0dXBfcGVyX2NwdV9hcmVhcygpOwogCXNtcF9wcmVwYXJlX2Jvb3RfY3B1KCk7CS8qIGFyY2gtc3BlY2lmaWMgYm9vdC1jcHUgaG9va3MgKi8KIApkaWZmIC0tZ2l0IGEvaXBjL21zZy5jIGIvaXBjL21zZy5jCmluZGV4IDViMjEzZDkuLjEyNjZiMWQgMTAwNjQ0Ci0tLSBhL2lwYy9tc2cuYworKysgYi9pcGMvbXNnLmMKQEAgLTUyLDcgKzUyLDcgQEAKIAlsb25nCQkJcl9tc2d0eXBlOwogCWxvbmcJCQlyX21heHNpemU7CiAKLQl2b2xhdGlsZSBzdHJ1Y3QgbXNnX21zZwkqcl9tc2c7CisJc3RydWN0IG1zZ19tc2cJCSp2b2xhdGlsZSByX21zZzsKIH07CiAKIC8qIG9uZSBtc2dfc2VuZGVyIGZvciBlYWNoIHNsZWVwaW5nIHNlbmRlciAqLwpAQCAtMTI0LDYgKzEyNCw3IEBACiAJfQogCW11dGV4X3VubG9jaygmbXNnX2lkcyhucykubXV0ZXgpOwogCisJaXBjX2ZpbmlfaWRzKG5zLT5pZHNbSVBDX01TR19JRFNdKTsKIAlrZnJlZShucy0+aWRzW0lQQ19NU0dfSURTXSk7CiAJbnMtPmlkc1tJUENfTVNHX0lEU10gPSBOVUxMOwogfQpkaWZmIC0tZ2l0IGEvaXBjL3NlbS5jIGIvaXBjL3NlbS5jCmluZGV4IDBkYWZjYzQuLjIxYjMyODkgMTAwNjQ0Ci0tLSBhL2lwYy9zZW0uYworKysgYi9pcGMvc2VtLmMKQEAgLTE2MSw2ICsxNjEsNyBAQAogCX0KIAltdXRleF91bmxvY2soJnNlbV9pZHMobnMpLm11dGV4KTsKIAorCWlwY19maW5pX2lkcyhucy0+aWRzW0lQQ19TRU1fSURTXSk7CiAJa2ZyZWUobnMtPmlkc1tJUENfU0VNX0lEU10pOwogCW5zLT5pZHNbSVBDX1NFTV9JRFNdID0gTlVMTDsKIH0KZGlmZiAtLWdpdCBhL2lwYy9zaG0uYyBiL2lwYy9zaG0uYwppbmRleCBiZmJkMzE3Li5kMTE5OGRkIDEwMDY0NAotLS0gYS9pcGMvc2htLmMKKysrIGIvaXBjL3NobS5jCkBAIC0xMTYsNiArMTE2LDcgQEAKIAl9CiAJbXV0ZXhfdW5sb2NrKCZzaG1faWRzKG5zKS5tdXRleCk7CiAKKwlpcGNfZmluaV9pZHMobnMtPmlkc1tJUENfU0hNX0lEU10pOwogCWtmcmVlKG5zLT5pZHNbSVBDX1NITV9JRFNdKTsKIAlucy0+aWRzW0lQQ19TSE1fSURTXSA9IE5VTEw7CiB9CmRpZmYgLS1naXQgYS9pcGMvdXRpbC5jIGIvaXBjL3V0aWwuYwppbmRleCA0MjQ3OWU0Li5jZDhiYjE0IDEwMDY0NAotLS0gYS9pcGMvdXRpbC5jCisrKyBiL2lwYy91dGlsLmMKQEAgLTMwMSw3ICszMDEsNyBAQAogCSAqLwogCXJjdV9hc3NpZ25fcG9pbnRlcihpZHMtPmVudHJpZXMsIG5ldyk7CiAKLQlpcGNfcmN1X3B1dHJlZihvbGQpOworCV9faXBjX2ZpbmlfaWRzKGlkcywgb2xkKTsKIAlyZXR1cm4gbmV3c2l6ZTsKIH0KIApkaWZmIC0tZ2l0IGEvaXBjL3V0aWwuaCBiL2lwYy91dGlsLmgKaW5kZXggYzhmZDZiOS4uZTNhYTJjNSAxMDA2NDQKLS0tIGEvaXBjL3V0aWwuaAorKysgYi9pcGMvdXRpbC5oCkBAIC04Myw2ICs4MywxOCBAQAogdm9pZCBpcGNfcmN1X2dldHJlZih2b2lkICpwdHIpOwogdm9pZCBpcGNfcmN1X3B1dHJlZih2b2lkICpwdHIpOwogCitzdGF0aWMgaW5saW5lIHZvaWQgX19pcGNfZmluaV9pZHMoc3RydWN0IGlwY19pZHMgKmlkcywKKwkJc3RydWN0IGlwY19pZF9hcnkgKmVudHJpZXMpCit7CisJaWYgKGVudHJpZXMgIT0gJmlkcy0+bnVsbGVudHJ5KQorCQlpcGNfcmN1X3B1dHJlZihlbnRyaWVzKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGlwY19maW5pX2lkcyhzdHJ1Y3QgaXBjX2lkcyAqaWRzKQoreworCV9faXBjX2ZpbmlfaWRzKGlkcywgaWRzLT5lbnRyaWVzKTsKK30KKwogc3RydWN0IGtlcm5faXBjX3Blcm0qIGlwY19nZXQoc3RydWN0IGlwY19pZHMqIGlkcywgaW50IGlkKTsKIHN0cnVjdCBrZXJuX2lwY19wZXJtKiBpcGNfbG9jayhzdHJ1Y3QgaXBjX2lkcyogaWRzLCBpbnQgaWQpOwogdm9pZCBpcGNfbG9ja19ieV9wdHIoc3RydWN0IGtlcm5faXBjX3Blcm0gKmlwY3ApOwpkaWZmIC0tZ2l0IGEva2VybmVsL2NvbXBhdC5jIGIva2VybmVsL2NvbXBhdC5jCmluZGV4IDc1NTczZTUuLjY5NTJkZDAgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9jb21wYXQuYworKysgYi9rZXJuZWwvY29tcGF0LmMKQEAgLTY3OCw3ICs2NzgsNyBAQAogCQk/IC1FRkFVTFQgOiAwOwogfQogCi1sb25nIGNvbXBhdF9nZXRfYml0bWFwKHVuc2lnbmVkIGxvbmcgKm1hc2ssIGNvbXBhdF91bG9uZ190IF9fdXNlciAqdW1hc2ssCitsb25nIGNvbXBhdF9nZXRfYml0bWFwKHVuc2lnbmVkIGxvbmcgKm1hc2ssIGNvbnN0IGNvbXBhdF91bG9uZ190IF9fdXNlciAqdW1hc2ssCiAJCSAgICAgICB1bnNpZ25lZCBsb25nIGJpdG1hcF9zaXplKQogewogCWludCBpLCBqOwpAQCAtOTgyLDQgKzk4MiwzNyBAQAogCX0KIAlyZXR1cm4gc3lzX21vdmVfcGFnZXMocGlkLCBucl9wYWdlcywgcGFnZXMsIG5vZGVzLCBzdGF0dXMsIGZsYWdzKTsKIH0KKworYXNtbGlua2FnZSBsb25nIGNvbXBhdF9zeXNfbWlncmF0ZV9wYWdlcyhjb21wYXRfcGlkX3QgcGlkLAorCQkJY29tcGF0X3Vsb25nX3QgbWF4bm9kZSwKKwkJCWNvbnN0IGNvbXBhdF91bG9uZ190IF9fdXNlciAqb2xkX25vZGVzLAorCQkJY29uc3QgY29tcGF0X3Vsb25nX3QgX191c2VyICpuZXdfbm9kZXMpCit7CisJdW5zaWduZWQgbG9uZyBfX3VzZXIgKm9sZCA9IE5VTEw7CisJdW5zaWduZWQgbG9uZyBfX3VzZXIgKm5ldyA9IE5VTEw7CisJbm9kZW1hc2tfdCB0bXBfbWFzazsKKwl1bnNpZ25lZCBsb25nIG5yX2JpdHM7CisJdW5zaWduZWQgbG9uZyBzaXplOworCisJbnJfYml0cyA9IG1pbl90KHVuc2lnbmVkIGxvbmcsIG1heG5vZGUgLSAxLCBNQVhfTlVNTk9ERVMpOworCXNpemUgPSBBTElHTihucl9iaXRzLCBCSVRTX1BFUl9MT05HKSAvIDg7CisJaWYgKG9sZF9ub2RlcykgeworCQlpZiAoY29tcGF0X2dldF9iaXRtYXAobm9kZXNfYWRkcih0bXBfbWFzayksIG9sZF9ub2RlcywgbnJfYml0cykpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJb2xkID0gY29tcGF0X2FsbG9jX3VzZXJfc3BhY2UobmV3X25vZGVzID8gc2l6ZSAqIDIgOiBzaXplKTsKKwkJaWYgKG5ld19ub2RlcykKKwkJCW5ldyA9IG9sZCArIHNpemUgLyBzaXplb2YodW5zaWduZWQgbG9uZyk7CisJCWlmIChjb3B5X3RvX3VzZXIob2xkLCBub2Rlc19hZGRyKHRtcF9tYXNrKSwgc2l6ZSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisJaWYgKG5ld19ub2RlcykgeworCQlpZiAoY29tcGF0X2dldF9iaXRtYXAobm9kZXNfYWRkcih0bXBfbWFzayksIG5ld19ub2RlcywgbnJfYml0cykpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJaWYgKG5ldyA9PSBOVUxMKQorCQkJbmV3ID0gY29tcGF0X2FsbG9jX3VzZXJfc3BhY2Uoc2l6ZSk7CisJCWlmIChjb3B5X3RvX3VzZXIobmV3LCBub2Rlc19hZGRyKHRtcF9tYXNrKSwgc2l6ZSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisJcmV0dXJuIHN5c19taWdyYXRlX3BhZ2VzKHBpZCwgbnJfYml0cyArIDEsIG9sZCwgbmV3KTsKK30KICNlbmRpZgpkaWZmIC0tZ2l0IGEva2VybmVsL2NwdS5jIGIva2VybmVsL2NwdS5jCmluZGV4IDMyYzk2NjIuLjI3MjI1NGYgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9jcHUuYworKysgYi9rZXJuZWwvY3B1LmMKQEAgLTE5LDcgKzE5LDcgQEAKIHN0YXRpYyBERUZJTkVfTVVURVgoY3B1X2FkZF9yZW1vdmVfbG9jayk7CiBzdGF0aWMgREVGSU5FX01VVEVYKGNwdV9iaXRtYXNrX2xvY2spOwogCi1zdGF0aWMgX19jcHVpbml0ZGF0YSBCTE9DS0lOR19OT1RJRklFUl9IRUFEKGNwdV9jaGFpbik7CitzdGF0aWMgX19jcHVpbml0ZGF0YSBSQVdfTk9USUZJRVJfSEVBRChjcHVfY2hhaW4pOwogCiAvKiBJZiBzZXQsIGNwdV91cCBhbmQgY3B1X2Rvd24gd2lsbCByZXR1cm4gLUVCVVNZIGFuZCBkbyBub3RoaW5nLgogICogU2hvdWxkIGFsd2F5cyBiZSBtYW5pcHVsYXRlZCB1bmRlciBjcHVfYWRkX3JlbW92ZV9sb2NrCkBAIC01OCw4ICs1OCw4IEBACiAJCXJlY3Vyc2l2ZV9kZXB0aC0tOwogCQlyZXR1cm47CiAJfQotCW11dGV4X3VubG9jaygmY3B1X2JpdG1hc2tfbG9jayk7CiAJcmVjdXJzaXZlID0gTlVMTDsKKwltdXRleF91bmxvY2soJmNwdV9iaXRtYXNrX2xvY2spOwogfQogRVhQT1JUX1NZTUJPTF9HUEwodW5sb2NrX2NwdV9ob3RwbHVnKTsKIApAQCAtNjgsNyArNjgsMTEgQEAKIC8qIE5lZWQgdG8ga25vdyBhYm91dCBDUFVzIGdvaW5nIHVwL2Rvd24/ICovCiBpbnQgX19jcHVpbml0IHJlZ2lzdGVyX2NwdV9ub3RpZmllcihzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKm5iKQogewotCXJldHVybiBibG9ja2luZ19ub3RpZmllcl9jaGFpbl9yZWdpc3RlcigmY3B1X2NoYWluLCBuYik7CisJaW50IHJldDsKKwltdXRleF9sb2NrKCZjcHVfYWRkX3JlbW92ZV9sb2NrKTsKKwlyZXQgPSByYXdfbm90aWZpZXJfY2hhaW5fcmVnaXN0ZXIoJmNwdV9jaGFpbiwgbmIpOworCW11dGV4X3VubG9jaygmY3B1X2FkZF9yZW1vdmVfbG9jayk7CisJcmV0dXJuIHJldDsKIH0KIAogI2lmZGVmIENPTkZJR19IT1RQTFVHX0NQVQpAQCAtNzcsNyArODEsOSBAQAogCiB2b2lkIHVucmVnaXN0ZXJfY3B1X25vdGlmaWVyKHN0cnVjdCBub3RpZmllcl9ibG9jayAqbmIpCiB7Ci0JYmxvY2tpbmdfbm90aWZpZXJfY2hhaW5fdW5yZWdpc3RlcigmY3B1X2NoYWluLCBuYik7CisJbXV0ZXhfbG9jaygmY3B1X2FkZF9yZW1vdmVfbG9jayk7CisJcmF3X25vdGlmaWVyX2NoYWluX3VucmVnaXN0ZXIoJmNwdV9jaGFpbiwgbmIpOworCW11dGV4X3VubG9jaygmY3B1X2FkZF9yZW1vdmVfbG9jayk7CiB9CiBFWFBPUlRfU1lNQk9MKHVucmVnaXN0ZXJfY3B1X25vdGlmaWVyKTsKIApAQCAtMTI2LDcgKzEzMiw3IEBACiAJaWYgKCFjcHVfb25saW5lKGNwdSkpCiAJCXJldHVybiAtRUlOVkFMOwogCi0JZXJyID0gYmxvY2tpbmdfbm90aWZpZXJfY2FsbF9jaGFpbigmY3B1X2NoYWluLCBDUFVfRE9XTl9QUkVQQVJFLAorCWVyciA9IHJhd19ub3RpZmllcl9jYWxsX2NoYWluKCZjcHVfY2hhaW4sIENQVV9ET1dOX1BSRVBBUkUsCiAJCQkJCQkodm9pZCAqKShsb25nKWNwdSk7CiAJaWYgKGVyciA9PSBOT1RJRllfQkFEKSB7CiAJCXByaW50aygiJXM6IGF0dGVtcHQgdG8gdGFrZSBkb3duIENQVSAldSBmYWlsZWRcbiIsCkBAIC0xNDQsMTggKzE1MCwxOCBAQAogCXAgPSBfX3N0b3BfbWFjaGluZV9ydW4odGFrZV9jcHVfZG93biwgTlVMTCwgY3B1KTsKIAltdXRleF91bmxvY2soJmNwdV9iaXRtYXNrX2xvY2spOwogCi0JaWYgKElTX0VSUihwKSkgeworCWlmIChJU19FUlIocCkgfHwgY3B1X29ubGluZShjcHUpKSB7CiAJCS8qIENQVSBkaWRuJ3QgZGllOiB0ZWxsIGV2ZXJ5b25lLiAgQ2FuJ3QgY29tcGxhaW4uICovCi0JCWlmIChibG9ja2luZ19ub3RpZmllcl9jYWxsX2NoYWluKCZjcHVfY2hhaW4sIENQVV9ET1dOX0ZBSUxFRCwKKwkJaWYgKHJhd19ub3RpZmllcl9jYWxsX2NoYWluKCZjcHVfY2hhaW4sIENQVV9ET1dOX0ZBSUxFRCwKIAkJCQkodm9pZCAqKShsb25nKWNwdSkgPT0gTk9USUZZX0JBRCkKIAkJCUJVRygpOwogCi0JCWVyciA9IFBUUl9FUlIocCk7Ci0JCWdvdG8gb3V0X2FsbG93ZWQ7Ci0JfQotCi0JaWYgKGNwdV9vbmxpbmUoY3B1KSkKKwkJaWYgKElTX0VSUihwKSkgeworCQkJZXJyID0gUFRSX0VSUihwKTsKKwkJCWdvdG8gb3V0X2FsbG93ZWQ7CisJCX0KIAkJZ290byBvdXRfdGhyZWFkOworCX0KIAogCS8qIFdhaXQgZm9yIGl0IHRvIHNsZWVwIChsZWF2aW5nIGlkbGUgdGFzaykuICovCiAJd2hpbGUgKCFpZGxlX2NwdShjcHUpKQpAQCAtMTY5LDcgKzE3NSw3IEBACiAJcHV0X2NwdSgpOwogCiAJLyogQ1BVIGlzIGNvbXBsZXRlbHkgZGVhZDogdGVsbCBldmVyeW9uZS4gIFRvbyBsYXRlIHRvIGNvbXBsYWluLiAqLwotCWlmIChibG9ja2luZ19ub3RpZmllcl9jYWxsX2NoYWluKCZjcHVfY2hhaW4sIENQVV9ERUFELAorCWlmIChyYXdfbm90aWZpZXJfY2FsbF9jaGFpbigmY3B1X2NoYWluLCBDUFVfREVBRCwKIAkJCSh2b2lkICopKGxvbmcpY3B1KSA9PSBOT1RJRllfQkFEKQogCQlCVUcoKTsKIApAQCAtMjA2LDcgKzIxMiw3IEBACiAJaWYgKGNwdV9vbmxpbmUoY3B1KSB8fCAhY3B1X3ByZXNlbnQoY3B1KSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQlyZXQgPSBibG9ja2luZ19ub3RpZmllcl9jYWxsX2NoYWluKCZjcHVfY2hhaW4sIENQVV9VUF9QUkVQQVJFLCBoY3B1KTsKKwlyZXQgPSByYXdfbm90aWZpZXJfY2FsbF9jaGFpbigmY3B1X2NoYWluLCBDUFVfVVBfUFJFUEFSRSwgaGNwdSk7CiAJaWYgKHJldCA9PSBOT1RJRllfQkFEKSB7CiAJCXByaW50aygiJXM6IGF0dGVtcHQgdG8gYnJpbmcgdXAgQ1BVICV1IGZhaWxlZFxuIiwKIAkJCQlfX0ZVTkNUSU9OX18sIGNwdSk7CkBAIC0yMjMsMTEgKzIyOSwxMSBAQAogCUJVR19PTighY3B1X29ubGluZShjcHUpKTsKIAogCS8qIE5vdyBjYWxsIG5vdGlmaWVyIGluIHByZXBhcmF0aW9uLiAqLwotCWJsb2NraW5nX25vdGlmaWVyX2NhbGxfY2hhaW4oJmNwdV9jaGFpbiwgQ1BVX09OTElORSwgaGNwdSk7CisJcmF3X25vdGlmaWVyX2NhbGxfY2hhaW4oJmNwdV9jaGFpbiwgQ1BVX09OTElORSwgaGNwdSk7CiAKIG91dF9ub3RpZnk6CiAJaWYgKHJldCAhPSAwKQotCQlibG9ja2luZ19ub3RpZmllcl9jYWxsX2NoYWluKCZjcHVfY2hhaW4sCisJCXJhd19ub3RpZmllcl9jYWxsX2NoYWluKCZjcHVfY2hhaW4sCiAJCQkJQ1BVX1VQX0NBTkNFTEVELCBoY3B1KTsKIAogCXJldHVybiByZXQ7CmRpZmYgLS1naXQgYS9rZXJuZWwvZGVsYXlhY2N0LmMgYi9rZXJuZWwvZGVsYXlhY2N0LmMKaW5kZXggMzY3NTJmMS4uNjZhMGVhNCAxMDA2NDQKLS0tIGEva2VybmVsL2RlbGF5YWNjdC5jCisrKyBiL2tlcm5lbC9kZWxheWFjY3QuYwpAQCAtNjYsNiArNjYsNyBAQAogewogCXN0cnVjdCB0aW1lc3BlYyB0czsKIAlzNjQgbnM7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKIAogCWRvX3Bvc2l4X2Nsb2NrX21vbm90b25pY19nZXR0aW1lKGVuZCk7CiAJdHMgPSB0aW1lc3BlY19zdWIoKmVuZCwgKnN0YXJ0KTsKQEAgLTczLDEwICs3NCwxMCBAQAogCWlmIChucyA8IDApCiAJCXJldHVybjsKIAotCXNwaW5fbG9jaygmY3VycmVudC0+ZGVsYXlzLT5sb2NrKTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmY3VycmVudC0+ZGVsYXlzLT5sb2NrLCBmbGFncyk7CiAJKnRvdGFsICs9IG5zOwogCSgqY291bnQpKys7Ci0Jc3Bpbl91bmxvY2soJmN1cnJlbnQtPmRlbGF5cy0+bG9jayk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY3VycmVudC0+ZGVsYXlzLT5sb2NrLCBmbGFncyk7CiB9CiAKIHZvaWQgX19kZWxheWFjY3RfYmxraW9fc3RhcnQodm9pZCkKQEAgLTEwNCw2ICsxMDUsNyBAQAogCXM2NCB0bXA7CiAJc3RydWN0IHRpbWVzcGVjIHRzOwogCXVuc2lnbmVkIGxvbmcgdDEsdDIsdDM7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKIAogCS8qIFRob3VnaCB0c2stPmRlbGF5cyBhY2Nlc3NlZCBsYXRlciwgZWFybHkgZXhpdCBhdm9pZHMKIAkgKiB1bm5lY2Vzc2FyeSByZXR1cm5pbmcgb2Ygb3RoZXIgZGF0YQpAQCAtMTM2LDE0ICsxMzgsMTQgQEAKIAogCS8qIHplcm8gWFhYX3RvdGFsLCBub24temVybyBYWFhfY291bnQgaW1wbGllcyBYWFggc3RhdCBvdmVyZmxvd2VkICovCiAKLQlzcGluX2xvY2soJnRzay0+ZGVsYXlzLT5sb2NrKTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmdHNrLT5kZWxheXMtPmxvY2ssIGZsYWdzKTsKIAl0bXAgPSBkLT5ibGtpb19kZWxheV90b3RhbCArIHRzay0+ZGVsYXlzLT5ibGtpb19kZWxheTsKIAlkLT5ibGtpb19kZWxheV90b3RhbCA9ICh0bXAgPCBkLT5ibGtpb19kZWxheV90b3RhbCkgPyAwIDogdG1wOwogCXRtcCA9IGQtPnN3YXBpbl9kZWxheV90b3RhbCArIHRzay0+ZGVsYXlzLT5zd2FwaW5fZGVsYXk7CiAJZC0+c3dhcGluX2RlbGF5X3RvdGFsID0gKHRtcCA8IGQtPnN3YXBpbl9kZWxheV90b3RhbCkgPyAwIDogdG1wOwogCWQtPmJsa2lvX2NvdW50ICs9IHRzay0+ZGVsYXlzLT5ibGtpb19jb3VudDsKIAlkLT5zd2FwaW5fY291bnQgKz0gdHNrLT5kZWxheXMtPnN3YXBpbl9jb3VudDsKLQlzcGluX3VubG9jaygmdHNrLT5kZWxheXMtPmxvY2spOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnRzay0+ZGVsYXlzLT5sb2NrLCBmbGFncyk7CiAKIGRvbmU6CiAJcmV0dXJuIDA7CkBAIC0xNTIsMTEgKzE1NCwxMiBAQAogX191NjQgX19kZWxheWFjY3RfYmxraW9fdGlja3Moc3RydWN0IHRhc2tfc3RydWN0ICp0c2spCiB7CiAJX191NjQgcmV0OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKLQlzcGluX2xvY2soJnRzay0+ZGVsYXlzLT5sb2NrKTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmdHNrLT5kZWxheXMtPmxvY2ssIGZsYWdzKTsKIAlyZXQgPSBuc2VjX3RvX2Nsb2NrX3QodHNrLT5kZWxheXMtPmJsa2lvX2RlbGF5ICsKIAkJCQl0c2stPmRlbGF5cy0+c3dhcGluX2RlbGF5KTsKLQlzcGluX3VubG9jaygmdHNrLT5kZWxheXMtPmxvY2spOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnRzay0+ZGVsYXlzLT5sb2NrLCBmbGFncyk7CiAJcmV0dXJuIHJldDsKIH0KIApkaWZmIC0tZ2l0IGEva2VybmVsL2V4aXQuYyBiL2tlcm5lbC9leGl0LmMKaW5kZXggZjI1MGE1ZS4uMDZkZTZjNCAxMDA2NDQKLS0tIGEva2VybmVsL2V4aXQuYworKysgYi9rZXJuZWwvZXhpdC5jCkBAIC0xMjgsNiArMTI4LDcgQEAKIAlmbHVzaF9zaWdxdWV1ZSgmdHNrLT5wZW5kaW5nKTsKIAlpZiAoc2lnKSB7CiAJCWZsdXNoX3NpZ3F1ZXVlKCZzaWctPnNoYXJlZF9wZW5kaW5nKTsKKwkJdGFza3N0YXRzX3RnaWRfZnJlZShzaWcpOwogCQlfX2NsZWFudXBfc2lnbmFsKHNpZyk7CiAJfQogfQpkaWZmIC0tZ2l0IGEva2VybmVsL2ZvcmsuYyBiL2tlcm5lbC9mb3JrLmMKaW5kZXggN2RjNjE0MC4uM2RhOTc4ZSAxMDA2NDQKLS0tIGEva2VybmVsL2ZvcmsuYworKysgYi9rZXJuZWwvZm9yay5jCkBAIC04MzAsNyArODMwLDcgQEAKIAlpZiAoY2xvbmVfZmxhZ3MgJiBDTE9ORV9USFJFQUQpIHsKIAkJYXRvbWljX2luYygmY3VycmVudC0+c2lnbmFsLT5jb3VudCk7CiAJCWF0b21pY19pbmMoJmN1cnJlbnQtPnNpZ25hbC0+bGl2ZSk7Ci0JCXRhc2tzdGF0c190Z2lkX2FsbG9jKGN1cnJlbnQtPnNpZ25hbCk7CisJCXRhc2tzdGF0c190Z2lkX2FsbG9jKGN1cnJlbnQpOwogCQlyZXR1cm4gMDsKIAl9CiAJc2lnID0ga21lbV9jYWNoZV9hbGxvYyhzaWduYWxfY2FjaGVwLCBHRlBfS0VSTkVMKTsKQEAgLTg5Nyw3ICs4OTcsNiBAQAogdm9pZCBfX2NsZWFudXBfc2lnbmFsKHN0cnVjdCBzaWduYWxfc3RydWN0ICpzaWcpCiB7CiAJZXhpdF90aHJlYWRfZ3JvdXBfa2V5cyhzaWcpOwotCXRhc2tzdGF0c190Z2lkX2ZyZWUoc2lnKTsKIAlrbWVtX2NhY2hlX2ZyZWUoc2lnbmFsX2NhY2hlcCwgc2lnKTsKIH0KIApAQCAtOTg0LDYgKzk4Myw4IEBACiAJaWYgKCFwKQogCQlnb3RvIGZvcmtfb3V0OwogCisJcnRfbXV0ZXhfaW5pdF90YXNrKHApOworCiAjaWZkZWYgQ09ORklHX1RSQUNFX0lSUUZMQUdTCiAJREVCVUdfTE9DS1NfV0FSTl9PTighcC0+aGFyZGlycXNfZW5hYmxlZCk7CiAJREVCVUdfTE9DS1NfV0FSTl9PTighcC0+c29mdGlycXNfZW5hYmxlZCk7CkBAIC0xMDg4LDggKzEwODksNiBAQAogCXAtPmxvY2tkZXBfcmVjdXJzaW9uID0gMDsKICNlbmRpZgogCi0JcnRfbXV0ZXhfaW5pdF90YXNrKHApOwotCiAjaWZkZWYgQ09ORklHX0RFQlVHX01VVEVYRVMKIAlwLT5ibG9ja2VkX29uID0gTlVMTDsgLyogbm90IGJsb2NrZWQgeWV0ICovCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2tlcm5lbC9mdXRleC5jIGIva2VybmVsL2Z1dGV4LmMKaW5kZXggYjM2NGUwMC4uOTNlZjMwYiAxMDA2NDQKLS0tIGEva2VybmVsL2Z1dGV4LmMKKysrIGIva2VybmVsL2Z1dGV4LmMKQEAgLTE1MDcsNiArMTUwNywxMyBAQAogCXN0cnVjdCBmdXRleF9xICpxOwogCXN0cnVjdCBmaWxlICpmaWxwOwogCWludCByZXQsIGVycjsKKwlzdGF0aWMgdW5zaWduZWQgbG9uZyBwcmludGtfaW50ZXJ2YWw7CisKKwlpZiAocHJpbnRrX3RpbWVkX3JhdGVsaW1pdCgmcHJpbnRrX2ludGVydmFsLCA2MCAqIDYwICogMTAwMCkpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiUHJvY2VzcyBgJXMnIHVzZWQgRlVURVhfRkQsIHdoaWNoICIKKwkJICAgIAkid2lsbCBiZSByZW1vdmVkIGZyb20gdGhlIGtlcm5lbCBpbiBKdW5lIDIwMDdcbiIsCisJCQljdXJyZW50LT5jb21tKTsKKwl9CiAKIAlyZXQgPSAtRUlOVkFMOwogCWlmICghdmFsaWRfc2lnbmFsKHNpZ25hbCkpCmRpZmYgLS1naXQgYS9rZXJuZWwvaXJxL2NoaXAuYyBiL2tlcm5lbC9pcnEvY2hpcC5jCmluZGV4IDExYzk5NjkuLmViZmQyNGEgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9pcnEvY2hpcC5jCisrKyBiL2tlcm5lbC9pcnEvY2hpcC5jCkBAIC0yMzMsNiArMjMzLDggQEAKIAkJY2hpcC0+c2h1dGRvd24gPSBjaGlwLT5kaXNhYmxlOwogCWlmICghY2hpcC0+bmFtZSkKIAkJY2hpcC0+bmFtZSA9IGNoaXAtPnR5cGVuYW1lOworCWlmICghY2hpcC0+ZW5kKQorCQljaGlwLT5lbmQgPSBkdW1teV9pcnFfY2hpcC5lbmQ7CiB9CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBtYXNrX2Fja19pcnEoc3RydWN0IGlycV9kZXNjICpkZXNjLCBpbnQgaXJxKQpAQCAtNDk5LDcgKzUwMSw4IEBACiAjZW5kaWYgLyogQ09ORklHX1NNUCAqLwogCiB2b2lkCi1fX3NldF9pcnFfaGFuZGxlcih1bnNpZ25lZCBpbnQgaXJxLCBpcnFfZmxvd19oYW5kbGVyX3QgaGFuZGxlLCBpbnQgaXNfY2hhaW5lZCkKK19fc2V0X2lycV9oYW5kbGVyKHVuc2lnbmVkIGludCBpcnEsIGlycV9mbG93X2hhbmRsZXJfdCBoYW5kbGUsIGludCBpc19jaGFpbmVkLAorCQkgIGNvbnN0IGNoYXIgKm5hbWUpCiB7CiAJc3RydWN0IGlycV9kZXNjICpkZXNjOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CkBAIC01NDAsNiArNTQzLDcgQEAKIAkJZGVzYy0+ZGVwdGggPSAxOwogCX0KIAlkZXNjLT5oYW5kbGVfaXJxID0gaGFuZGxlOworCWRlc2MtPm5hbWUgPSBuYW1lOwogCiAJaWYgKGhhbmRsZSAhPSBoYW5kbGVfYmFkX2lycSAmJiBpc19jaGFpbmVkKSB7CiAJCWRlc2MtPnN0YXR1cyAmPSB+SVJRX0RJU0FCTEVEOwpAQCAtNTU1LDMwICs1NTksMTMgQEAKIAkJCSBpcnFfZmxvd19oYW5kbGVyX3QgaGFuZGxlKQogewogCXNldF9pcnFfY2hpcChpcnEsIGNoaXApOwotCV9fc2V0X2lycV9oYW5kbGVyKGlycSwgaGFuZGxlLCAwKTsKKwlfX3NldF9pcnFfaGFuZGxlcihpcnEsIGhhbmRsZSwgMCwgTlVMTCk7CiB9CiAKLS8qCi0gKiBHZXQgYSBkZXNjcmlwdGl2ZSBzdHJpbmcgZm9yIHRoZSBoaWdobGV2ZWwgaGFuZGxlciwgZm9yCi0gKiAvcHJvYy9pbnRlcnJ1cHRzIG91dHB1dDoKLSAqLwotY29uc3QgY2hhciAqCi1oYW5kbGVfaXJxX25hbWUoaXJxX2Zsb3dfaGFuZGxlcl90IGhhbmRsZSkKK3ZvaWQKK3NldF9pcnFfY2hpcF9hbmRfaGFuZGxlcl9uYW1lKHVuc2lnbmVkIGludCBpcnEsIHN0cnVjdCBpcnFfY2hpcCAqY2hpcCwKKwkJCSAgICAgIGlycV9mbG93X2hhbmRsZXJfdCBoYW5kbGUsIGNvbnN0IGNoYXIgKm5hbWUpCiB7Ci0JaWYgKGhhbmRsZSA9PSBoYW5kbGVfbGV2ZWxfaXJxKQotCQlyZXR1cm4gImxldmVsICAiOwotCWlmIChoYW5kbGUgPT0gaGFuZGxlX2Zhc3Rlb2lfaXJxKQotCQlyZXR1cm4gImZhc3Rlb2kiOwotCWlmIChoYW5kbGUgPT0gaGFuZGxlX2VkZ2VfaXJxKQotCQlyZXR1cm4gImVkZ2UgICAiOwotCWlmIChoYW5kbGUgPT0gaGFuZGxlX3NpbXBsZV9pcnEpCi0JCXJldHVybiAic2ltcGxlICI7Ci0jaWZkZWYgQ09ORklHX1NNUAotCWlmIChoYW5kbGUgPT0gaGFuZGxlX3BlcmNwdV9pcnEpCi0JCXJldHVybiAicGVyY3B1ICI7Ci0jZW5kaWYKLQlpZiAoaGFuZGxlID09IGhhbmRsZV9iYWRfaXJxKQotCQlyZXR1cm4gImJhZCAgICAiOwotCi0JcmV0dXJuIE5VTEw7CisJc2V0X2lycV9jaGlwKGlycSwgY2hpcCk7CisJX19zZXRfaXJxX2hhbmRsZXIoaXJxLCBoYW5kbGUsIDAsIG5hbWUpOwogfQpkaWZmIC0tZ2l0IGEva2VybmVsL2lycS9tYW5hZ2UuYyBiL2tlcm5lbC9pcnEvbWFuYWdlLmMKaW5kZXggNjg3OTIwMi4uYjM4NTg3OCAxMDA2NDQKLS0tIGEva2VybmVsL2lycS9tYW5hZ2UuYworKysgYi9rZXJuZWwvaXJxL21hbmFnZS5jCkBAIC0yMTYsNiArMjE2LDcgQEAKIHsKIAlzdHJ1Y3QgaXJxX2Rlc2MgKmRlc2MgPSBpcnFfZGVzYyArIGlycTsKIAlzdHJ1Y3QgaXJxYWN0aW9uICpvbGQsICoqcDsKKwljb25zdCBjaGFyICpvbGRfbmFtZSA9IE5VTEw7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAlpbnQgc2hhcmVkID0gMDsKIApAQCAtMjU1LDggKzI1NiwxMCBAQAogCQkgKiBzZXQgdGhlIHRyaWdnZXIgdHlwZSBtdXN0IG1hdGNoLgogCQkgKi8KIAkJaWYgKCEoKG9sZC0+ZmxhZ3MgJiBuZXctPmZsYWdzKSAmIElSUUZfU0hBUkVEKSB8fAotCQkgICAgKChvbGQtPmZsYWdzIF4gbmV3LT5mbGFncykgJiBJUlFGX1RSSUdHRVJfTUFTSykpCisJCSAgICAoKG9sZC0+ZmxhZ3MgXiBuZXctPmZsYWdzKSAmIElSUUZfVFJJR0dFUl9NQVNLKSkgeworCQkJb2xkX25hbWUgPSBvbGQtPm5hbWU7CiAJCQlnb3RvIG1pc21hdGNoOworCQl9CiAKICNpZiBkZWZpbmVkKENPTkZJR19JUlFfUEVSX0NQVSkKIAkJLyogQWxsIGhhbmRsZXJzIG11c3QgYWdyZWUgb24gcGVyLWNwdW5lc3MgKi8KQEAgLTMyMiwxMSArMzI1LDEzIEBACiAJcmV0dXJuIDA7CiAKIG1pc21hdGNoOgotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRlc2MtPmxvY2ssIGZsYWdzKTsKIAlpZiAoIShuZXctPmZsYWdzICYgSVJRRl9QUk9CRV9TSEFSRUQpKSB7CiAJCXByaW50ayhLRVJOX0VSUiAiSVJRIGhhbmRsZXIgdHlwZSBtaXNtYXRjaCBmb3IgSVJRICVkXG4iLCBpcnEpOworCQlpZiAob2xkX25hbWUpCisJCQlwcmludGsoS0VSTl9FUlIgImN1cnJlbnQgaGFuZGxlcjogJXNcbiIsIG9sZF9uYW1lKTsKIAkJZHVtcF9zdGFjaygpOwogCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXNjLT5sb2NrLCBmbGFncyk7CiAJcmV0dXJuIC1FQlVTWTsKIH0KIApkaWZmIC0tZ2l0IGEva2VybmVsL2lycS9wcm9jLmMgYi9rZXJuZWwvaXJxL3Byb2MuYwppbmRleCA2MDdjNzgwLi45YTM1MjY2IDEwMDY0NAotLS0gYS9rZXJuZWwvaXJxL3Byb2MuYworKysgYi9rZXJuZWwvaXJxL3Byb2MuYwpAQCAtNTcsNyArNTcsNyBAQAogCWlmICghaXJxX2Rlc2NbaXJxXS5jaGlwLT5zZXRfYWZmaW5pdHkgfHwgbm9faXJxX2FmZmluaXR5KQogCQlyZXR1cm4gLUVJTzsKIAotCWVyciA9IGNwdW1hc2tfcGFyc2UoYnVmZmVyLCBjb3VudCwgbmV3X3ZhbHVlKTsKKwllcnIgPSBjcHVtYXNrX3BhcnNlX3VzZXIoYnVmZmVyLCBjb3VudCwgbmV3X3ZhbHVlKTsKIAlpZiAoZXJyKQogCQlyZXR1cm4gZXJyOwogCmRpZmYgLS1naXQgYS9rZXJuZWwvaXJxL3NwdXJpb3VzLmMgYi9rZXJuZWwvaXJxL3NwdXJpb3VzLmMKaW5kZXggNTQzZWEyZS4uOWM3ZTJlNCAxMDA2NDQKLS0tIGEva2VybmVsL2lycS9zcHVyaW91cy5jCisrKyBiL2tlcm5lbC9pcnEvc3B1cmlvdXMuYwpAQCAtMTQ3LDcgKzE0NywxMSBAQAogCWlmICh1bmxpa2VseShpcnFmaXh1cCkpIHsKIAkJLyogRG9uJ3QgcHVuaXNoIHdvcmtpbmcgY29tcHV0ZXJzICovCiAJCWlmICgoaXJxZml4dXAgPT0gMiAmJiBpcnEgPT0gMCkgfHwgYWN0aW9uX3JldCA9PSBJUlFfTk9ORSkgewotCQkJaW50IG9rID0gbWlzcm91dGVkX2lycShpcnEpOworCQkJaW50IG9rOworCisJCQlzcGluX3VubG9jaygmZGVzYy0+bG9jayk7CisJCQlvayA9IG1pc3JvdXRlZF9pcnEoaXJxKTsKKwkJCXNwaW5fbG9jaygmZGVzYy0+bG9jayk7CiAJCQlpZiAoYWN0aW9uX3JldCA9PSBJUlFfTk9ORSkKIAkJCQlkZXNjLT5pcnFzX3VuaGFuZGxlZCAtPSBvazsKIAkJfQpkaWZmIC0tZ2l0IGEva2VybmVsL2xvY2tkZXAuYyBiL2tlcm5lbC9sb2NrZGVwLmMKaW5kZXggNGMwNTUzNC4uYzlmZWZkYiAxMDA2NDQKLS0tIGEva2VybmVsL2xvY2tkZXAuYworKysgYi9rZXJuZWwvbG9ja2RlcC5jCkBAIC01NzUsNiArNTc1LDggQEAKIAlyZXR1cm4gMDsKIH0KIAorI2RlZmluZSBSRUNVUlNJT05fTElNSVQgNDAKKwogc3RhdGljIGludCBub2lubGluZSBwcmludF9pbmZpbml0ZV9yZWN1cnNpb25fYnVnKHZvaWQpCiB7CiAJX19yYXdfc3Bpbl91bmxvY2soJmhhc2hfbG9jayk7CkBAIC01OTUsNyArNTk3LDcgQEAKIAlkZWJ1Z19hdG9taWNfaW5jKCZucl9jeWNsaWNfY2hlY2tfcmVjdXJzaW9ucyk7CiAJaWYgKGRlcHRoID4gbWF4X3JlY3Vyc2lvbl9kZXB0aCkKIAkJbWF4X3JlY3Vyc2lvbl9kZXB0aCA9IGRlcHRoOwotCWlmIChkZXB0aCA+PSAyMCkKKwlpZiAoZGVwdGggPj0gUkVDVVJTSU9OX0xJTUlUKQogCQlyZXR1cm4gcHJpbnRfaW5maW5pdGVfcmVjdXJzaW9uX2J1ZygpOwogCS8qCiAJICogQ2hlY2sgdGhpcyBsb2NrJ3MgZGVwZW5kZW5jeSBsaXN0OgpAQCAtNjQ1LDcgKzY0Nyw3IEBACiAKIAlpZiAoZGVwdGggPiBtYXhfcmVjdXJzaW9uX2RlcHRoKQogCQltYXhfcmVjdXJzaW9uX2RlcHRoID0gZGVwdGg7Ci0JaWYgKGRlcHRoID49IDIwKQorCWlmIChkZXB0aCA+PSBSRUNVUlNJT05fTElNSVQpCiAJCXJldHVybiBwcmludF9pbmZpbml0ZV9yZWN1cnNpb25fYnVnKCk7CiAKIAlkZWJ1Z19hdG9taWNfaW5jKCZucl9maW5kX3VzYWdlX2ZvcndhcmRzX2NoZWNrcyk7CkBAIC02ODQsNyArNjg2LDcgQEAKIAogCWlmIChkZXB0aCA+IG1heF9yZWN1cnNpb25fZGVwdGgpCiAJCW1heF9yZWN1cnNpb25fZGVwdGggPSBkZXB0aDsKLQlpZiAoZGVwdGggPj0gMjApCisJaWYgKGRlcHRoID49IFJFQ1VSU0lPTl9MSU1JVCkKIAkJcmV0dXJuIHByaW50X2luZmluaXRlX3JlY3Vyc2lvbl9idWcoKTsKIAogCWRlYnVnX2F0b21pY19pbmMoJm5yX2ZpbmRfdXNhZ2VfYmFja3dhcmRzX2NoZWNrcyk7CkBAIC0xMDc5LDcgKzEwODEsOCBAQAogCSAqLwogCWZvcl9lYWNoX3Bvc3NpYmxlX2NwdShpKSB7CiAJCXN0YXJ0ID0gKHVuc2lnbmVkIGxvbmcpICZfX3Blcl9jcHVfc3RhcnQgKyBwZXJfY3B1X29mZnNldChpKTsKLQkJZW5kICAgPSAodW5zaWduZWQgbG9uZykgJl9fcGVyX2NwdV9lbmQgICArIHBlcl9jcHVfb2Zmc2V0KGkpOworCQllbmQgICA9ICh1bnNpZ25lZCBsb25nKSAmX19wZXJfY3B1X3N0YXJ0ICsgUEVSQ1BVX0VOT1VHSF9ST09NCisJCQkJCSsgcGVyX2NwdV9vZmZzZXQoaSk7CiAKIAkJaWYgKChhZGRyID49IHN0YXJ0KSAmJiAoYWRkciA8IGVuZCkpCiAJCQlyZXR1cm4gMTsKQEAgLTExMTQsOCArMTExNyw2IEBACiAJcmV0dXJuIGNvdW50ICsgMTsKIH0KIAotZXh0ZXJuIHZvaWQgX19lcnJvcl90b29fYmlnX01BWF9MT0NLREVQX1NVQkNMQVNTRVModm9pZCk7Ci0KIC8qCiAgKiBSZWdpc3RlciBhIGxvY2sncyBjbGFzcyBpbiB0aGUgaGFzaC10YWJsZSwgaWYgdGhlIGNsYXNzIGlzIG5vdCBwcmVzZW50CiAgKiB5ZXQuIE90aGVyd2lzZSB3ZSBsb29rIGl0IHVwLiBXZSBjYWNoZSB0aGUgcmVzdWx0IGluIHRoZSBsb2NrIG9iamVjdApAQCAtMTE1Myw4ICsxMTU0LDcgQEAKIAkgKiAob3Igc3Bpbl9sb2NrX2luaXQoKSkgY2FsbCAtIHdoaWNoIGFjdHMgYXMgdGhlIGtleS4gRm9yIHN0YXRpYwogCSAqIGxvY2tzIHdlIHVzZSB0aGUgbG9jayBvYmplY3QgaXRzZWxmIGFzIHRoZSBrZXkuCiAJICovCi0JaWYgKHNpemVvZihzdHJ1Y3QgbG9ja19jbGFzc19rZXkpID4gc2l6ZW9mKHN0cnVjdCBsb2NrX2NsYXNzKSkKLQkJX19lcnJvcl90b29fYmlnX01BWF9MT0NLREVQX1NVQkNMQVNTRVMoKTsKKwlCVUlMRF9CVUdfT04oc2l6ZW9mKHN0cnVjdCBsb2NrX2NsYXNzX2tleSkgPiBzaXplb2Yoc3RydWN0IGxvY2tfY2xhc3MpKTsKIAogCWtleSA9IGxvY2stPmtleS0+c3Via2V5cyArIHN1YmNsYXNzOwogCkBAIC0xMTc3LDcgKzExNzcsNyBAQAogICogaXRzZWxmLCBzbyBhY3R1YWwgbG9va3VwIG9mIHRoZSBoYXNoIHNob3VsZCBiZSBvbmNlIHBlciBsb2NrIG9iamVjdC4KICAqLwogc3RhdGljIGlubGluZSBzdHJ1Y3QgbG9ja19jbGFzcyAqCi1yZWdpc3Rlcl9sb2NrX2NsYXNzKHN0cnVjdCBsb2NrZGVwX21hcCAqbG9jaywgdW5zaWduZWQgaW50IHN1YmNsYXNzKQorcmVnaXN0ZXJfbG9ja19jbGFzcyhzdHJ1Y3QgbG9ja2RlcF9tYXAgKmxvY2ssIHVuc2lnbmVkIGludCBzdWJjbGFzcywgaW50IGZvcmNlKQogewogCXN0cnVjdCBsb2NrZGVwX3N1YmNsYXNzX2tleSAqa2V5OwogCXN0cnVjdCBsaXN0X2hlYWQgKmhhc2hfaGVhZDsKQEAgLTEyNDksNyArMTI0OSw3IEBACiBvdXRfdW5sb2NrX3NldDoKIAlfX3Jhd19zcGluX3VubG9jaygmaGFzaF9sb2NrKTsKIAotCWlmICghc3ViY2xhc3MpCisJaWYgKCFzdWJjbGFzcyB8fCBmb3JjZSkKIAkJbG9jay0+Y2xhc3NfY2FjaGUgPSBjbGFzczsKIAogCURFQlVHX0xPQ0tTX1dBUk5fT04oY2xhc3MtPnN1YmNsYXNzICE9IHN1YmNsYXNzKTsKQEAgLTE5MzcsNyArMTkzNyw3IEBACiAgKiBJbml0aWFsaXplIGEgbG9jayBpbnN0YW5jZSdzIGxvY2stY2xhc3MgbWFwcGluZyBpbmZvOgogICovCiB2b2lkIGxvY2tkZXBfaW5pdF9tYXAoc3RydWN0IGxvY2tkZXBfbWFwICpsb2NrLCBjb25zdCBjaGFyICpuYW1lLAotCQkgICAgICBzdHJ1Y3QgbG9ja19jbGFzc19rZXkgKmtleSkKKwkJICAgICAgc3RydWN0IGxvY2tfY2xhc3Nfa2V5ICprZXksIGludCBzdWJjbGFzcykKIHsKIAlpZiAodW5saWtlbHkoIWRlYnVnX2xvY2tzKSkKIAkJcmV0dXJuOwpAQCAtMTk1Nyw2ICsxOTU3LDggQEAKIAlsb2NrLT5uYW1lID0gbmFtZTsKIAlsb2NrLT5rZXkgPSBrZXk7CiAJbG9jay0+Y2xhc3NfY2FjaGUgPSBOVUxMOworCWlmIChzdWJjbGFzcykKKwkJcmVnaXN0ZXJfbG9ja19jbGFzcyhsb2NrLCBzdWJjbGFzcywgMSk7CiB9CiAKIEVYUE9SVF9TWU1CT0xfR1BMKGxvY2tkZXBfaW5pdF9tYXApOwpAQCAtMTk5NSw3ICsxOTk3LDcgQEAKIAkgKiBOb3QgY2FjaGVkIHlldCBvciBzdWJjbGFzcz8KIAkgKi8KIAlpZiAodW5saWtlbHkoIWNsYXNzKSkgewotCQljbGFzcyA9IHJlZ2lzdGVyX2xvY2tfY2xhc3MobG9jaywgc3ViY2xhc3MpOworCQljbGFzcyA9IHJlZ2lzdGVyX2xvY2tfY2xhc3MobG9jaywgc3ViY2xhc3MsIDApOwogCQlpZiAoIWNsYXNzKQogCQkJcmV0dXJuIDA7CiAJfQpkaWZmIC0tZ2l0IGEva2VybmVsL21vZHVsZS5jIGIva2VybmVsL21vZHVsZS5jCmluZGV4IDdmNjBlNzguLmYwMTY2NTYgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9tb2R1bGUuYworKysgYi9rZXJuZWwvbW9kdWxlLmMKQEAgLTg3LDYgKzg3LDEyIEBACiAJcmV0dXJuIHRyeV9tb2R1bGVfZ2V0KG1vZCk7CiB9CiAKK3N0YXRpYyBpbmxpbmUgdm9pZCBhZGRfdGFpbnRfbW9kdWxlKHN0cnVjdCBtb2R1bGUgKm1vZCwgdW5zaWduZWQgZmxhZykKK3sKKwlhZGRfdGFpbnQoZmxhZyk7CisJbW9kLT50YWludHMgfD0gZmxhZzsKK30KKwogLyogQSB0aHJlYWQgdGhhdCB3YW50cyB0byBob2xkIGEgcmVmZXJlbmNlIHRvIGEgbW9kdWxlIG9ubHkgd2hpbGUgaXQKICAqIGlzIHJ1bm5pbmcgY2FuIGNhbGwgdGhzIHRvIHNhZmVseSBleGl0LgogICogbmZzZCBhbmQgbG9ja2QgdXNlIHRoaXMuCkBAIC04NDcsMTIgKzg1MywxMCBAQAogCQlyZXR1cm4gMDsKIAl9CiAJLyogTm90IGluIG1vZHVsZSdzIHZlcnNpb24gdGFibGUuICBPSywgYnV0IHRoYXQgdGFpbnRzIHRoZSBrZXJuZWwuICovCi0JaWYgKCEodGFpbnRlZCAmIFRBSU5UX0ZPUkNFRF9NT0RVTEUpKSB7CisJaWYgKCEodGFpbnRlZCAmIFRBSU5UX0ZPUkNFRF9NT0RVTEUpKQogCQlwcmludGsoIiVzOiBubyB2ZXJzaW9uIGZvciBcIiVzXCIgZm91bmQ6IGtlcm5lbCB0YWludGVkLlxuIiwKIAkJICAgICAgIG1vZC0+bmFtZSwgc3ltbmFtZSk7Ci0JCWFkZF90YWludChUQUlOVF9GT1JDRURfTU9EVUxFKTsKLQkJbW9kLT50YWludHMgfD0gVEFJTlRfRk9SQ0VEX01PRFVMRTsKLQl9CisJYWRkX3RhaW50X21vZHVsZShtb2QsIFRBSU5UX0ZPUkNFRF9NT0RVTEUpOwogCXJldHVybiAxOwogfQogCkBAIC05MTAsNyArOTE0LDggQEAKIAl1bnNpZ25lZCBsb25nIHJldDsKIAljb25zdCB1bnNpZ25lZCBsb25nICpjcmM7CiAKLQlyZXQgPSBfX2ZpbmRfc3ltYm9sKG5hbWUsICZvd25lciwgJmNyYywgbW9kLT5saWNlbnNlX2dwbG9rKTsKKwlyZXQgPSBfX2ZpbmRfc3ltYm9sKG5hbWUsICZvd25lciwgJmNyYywKKwkJCSEobW9kLT50YWludHMgJiBUQUlOVF9QUk9QUklFVEFSWV9NT0RVTEUpKTsKIAlpZiAocmV0KSB7CiAJCS8qIHVzZV9tb2R1bGUgY2FuIGZhaWwgZHVlIHRvIE9PTSwgb3IgbW9kdWxlIHVubG9hZGluZyAqLwogCQlpZiAoIWNoZWNrX3ZlcnNpb24oc2VjaGRycywgdmVyc2luZGV4LCBuYW1lLCBtb2QsIGNyYykgfHwKQEAgLTEzMzUsMTIgKzEzNDAsMTEgQEAKIAlpZiAoIWxpY2Vuc2UpCiAJCWxpY2Vuc2UgPSAidW5zcGVjaWZpZWQiOwogCi0JbW9kLT5saWNlbnNlX2dwbG9rID0gbGljZW5zZV9pc19ncGxfY29tcGF0aWJsZShsaWNlbnNlKTsKLQlpZiAoIW1vZC0+bGljZW5zZV9ncGxvayAmJiAhKHRhaW50ZWQgJiBUQUlOVF9QUk9QUklFVEFSWV9NT0RVTEUpKSB7Ci0JCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBtb2R1bGUgbGljZW5zZSAnJXMnIHRhaW50cyBrZXJuZWwuXG4iLAotCQkgICAgICAgbW9kLT5uYW1lLCBsaWNlbnNlKTsKLQkJYWRkX3RhaW50KFRBSU5UX1BST1BSSUVUQVJZX01PRFVMRSk7Ci0JCW1vZC0+dGFpbnRzIHw9IFRBSU5UX1BST1BSSUVUQVJZX01PRFVMRTsKKwlpZiAoIWxpY2Vuc2VfaXNfZ3BsX2NvbXBhdGlibGUobGljZW5zZSkpIHsKKwkJaWYgKCEodGFpbnRlZCAmIFRBSU5UX1BST1BSSUVUQVJZX01PRFVMRSkpCisJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogbW9kdWxlIGxpY2Vuc2UgJyVzJyB0YWludHMgIgorCQkJCSJrZXJuZWwuXG4iLCBtb2QtPm5hbWUsIGxpY2Vuc2UpOworCQlhZGRfdGFpbnRfbW9kdWxlKG1vZCwgVEFJTlRfUFJPUFJJRVRBUllfTU9EVUxFKTsKIAl9CiB9CiAKQEAgLTE2MTksOCArMTYyMyw3IEBACiAJbW9kbWFnaWMgPSBnZXRfbW9kaW5mbyhzZWNoZHJzLCBpbmZvaW5kZXgsICJ2ZXJtYWdpYyIpOwogCS8qIFRoaXMgaXMgYWxsb3dlZDogbW9kcHJvYmUgLS1mb3JjZSB3aWxsIGludmFsaWRhdGUgaXQuICovCiAJaWYgKCFtb2RtYWdpYykgewotCQlhZGRfdGFpbnQoVEFJTlRfRk9SQ0VEX01PRFVMRSk7Ci0JCW1vZC0+dGFpbnRzIHw9IFRBSU5UX0ZPUkNFRF9NT0RVTEU7CisJCWFkZF90YWludF9tb2R1bGUobW9kLCBUQUlOVF9GT1JDRURfTU9EVUxFKTsKIAkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IG5vIHZlcnNpb24gbWFnaWMsIHRhaW50aW5nIGtlcm5lbC5cbiIsCiAJCSAgICAgICBtb2QtPm5hbWUpOwogCX0gZWxzZSBpZiAoIXNhbWVfbWFnaWMobW9kbWFnaWMsIHZlcm1hZ2ljKSkgewpAQCAtMTcxNCwxNCArMTcxNywxMCBAQAogCS8qIFNldCB1cCBsaWNlbnNlIGluZm8gYmFzZWQgb24gdGhlIGluZm8gc2VjdGlvbiAqLwogCXNldF9saWNlbnNlKG1vZCwgZ2V0X21vZGluZm8oc2VjaGRycywgaW5mb2luZGV4LCAibGljZW5zZSIpKTsKIAotCWlmIChzdHJjbXAobW9kLT5uYW1lLCAibmRpc3dyYXBwZXIiKSA9PSAwKSB7CisJaWYgKHN0cmNtcChtb2QtPm5hbWUsICJuZGlzd3JhcHBlciIpID09IDApCiAJCWFkZF90YWludChUQUlOVF9QUk9QUklFVEFSWV9NT0RVTEUpOwotCQltb2QtPnRhaW50cyB8PSBUQUlOVF9QUk9QUklFVEFSWV9NT0RVTEU7Ci0JfQotCWlmIChzdHJjbXAobW9kLT5uYW1lLCAiZHJpdmVybG9hZGVyIikgPT0gMCkgewotCQlhZGRfdGFpbnQoVEFJTlRfUFJPUFJJRVRBUllfTU9EVUxFKTsKLQkJbW9kLT50YWludHMgfD0gVEFJTlRfUFJPUFJJRVRBUllfTU9EVUxFOwotCX0KKwlpZiAoc3RyY21wKG1vZC0+bmFtZSwgImRyaXZlcmxvYWRlciIpID09IDApCisJCWFkZF90YWludF9tb2R1bGUobW9kLCBUQUlOVF9QUk9QUklFVEFSWV9NT0RVTEUpOwogCiAJLyogU2V0IHVwIE1PRElORk9fQVRUUiBmaWVsZHMgKi8KIAlzZXR1cF9tb2RpbmZvKG1vZCwgc2VjaGRycywgaW5mb2luZGV4KTsKQEAgLTE3NjYsOCArMTc2NSw3IEBACiAJICAgIChtb2QtPm51bV91bnVzZWRfZ3BsX3N5bXMgJiYgIXVudXNlZGdwbGNyY2luZGV4KSkgewogCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogTm8gdmVyc2lvbnMgZm9yIGV4cG9ydGVkIHN5bWJvbHMuIgogCQkgICAgICAgIiBUYWludGluZyBrZXJuZWwuXG4iLCBtb2QtPm5hbWUpOwotCQlhZGRfdGFpbnQoVEFJTlRfRk9SQ0VEX01PRFVMRSk7Ci0JCW1vZC0+dGFpbnRzIHw9IFRBSU5UX0ZPUkNFRF9NT0RVTEU7CisJCWFkZF90YWludF9tb2R1bGUobW9kLCBUQUlOVF9GT1JDRURfTU9EVUxFKTsKIAl9CiAjZW5kaWYKIApAQCAtMjEzMiw5ICsyMTMwLDMzIEBACiAJbXV0ZXhfdW5sb2NrKCZtb2R1bGVfbXV0ZXgpOwogfQogCitzdGF0aWMgY2hhciAqdGFpbnRfZmxhZ3ModW5zaWduZWQgaW50IHRhaW50cywgY2hhciAqYnVmKQoreworCWludCBieCA9IDA7CisKKwlpZiAodGFpbnRzKSB7CisJCWJ1ZltieCsrXSA9ICcoJzsKKwkJaWYgKHRhaW50cyAmIFRBSU5UX1BST1BSSUVUQVJZX01PRFVMRSkKKwkJCWJ1ZltieCsrXSA9ICdQJzsKKwkJaWYgKHRhaW50cyAmIFRBSU5UX0ZPUkNFRF9NT0RVTEUpCisJCQlidWZbYngrK10gPSAnRic7CisJCS8qCisJCSAqIFRBSU5UX0ZPUkNFRF9STU1PRDogY291bGQgYmUgYWRkZWQuCisJCSAqIFRBSU5UX1VOU0FGRV9TTVAsIFRBSU5UX01BQ0hJTkVfQ0hFQ0ssIFRBSU5UX0JBRF9QQUdFIGRvbid0CisJCSAqIGFwcGx5IHRvIG1vZHVsZXMuCisJCSAqLworCQlidWZbYngrK10gPSAnKSc7CisJfQorCWJ1ZltieF0gPSAnXDAnOworCisJcmV0dXJuIGJ1ZjsKK30KKwogc3RhdGljIGludCBtX3Nob3coc3RydWN0IHNlcV9maWxlICptLCB2b2lkICpwKQogewogCXN0cnVjdCBtb2R1bGUgKm1vZCA9IGxpc3RfZW50cnkocCwgc3RydWN0IG1vZHVsZSwgbGlzdCk7CisJY2hhciBidWZbOF07CisKIAlzZXFfcHJpbnRmKG0sICIlcyAlbHUiLAogCQkgICBtb2QtPm5hbWUsIG1vZC0+aW5pdF9zaXplICsgbW9kLT5jb3JlX3NpemUpOwogCXByaW50X3VubG9hZF9pbmZvKG0sIG1vZCk7CkBAIC0yMTQ3LDYgKzIxNjksMTAgQEAKIAkvKiBVc2VkIGJ5IG9wcm9maWxlIGFuZCBvdGhlciBzaW1pbGFyIHRvb2xzLiAqLwogCXNlcV9wcmludGYobSwgIiAweCVwIiwgbW9kLT5tb2R1bGVfY29yZSk7CiAKKwkvKiBUYWludHMgaW5mbyAqLworCWlmIChtb2QtPnRhaW50cykKKwkJc2VxX3ByaW50ZihtLCAiICVzIiwgdGFpbnRfZmxhZ3MobW9kLT50YWludHMsIGJ1ZikpOworCiAJc2VxX3ByaW50ZihtLCAiXG4iKTsKIAlyZXR1cm4gMDsKIH0KQEAgLTIyMzUsMjggKzIyNjEsNiBAQAogCXJldHVybiBtb2Q7CiB9CiAKLXN0YXRpYyBjaGFyICp0YWludF9mbGFncyh1bnNpZ25lZCBpbnQgdGFpbnRzLCBjaGFyICpidWYpCi17Ci0JKmJ1ZiA9ICdcMCc7Ci0JaWYgKHRhaW50cykgewotCQlpbnQgYng7Ci0KLQkJYnVmWzBdID0gJygnOwotCQlieCA9IDE7Ci0JCWlmICh0YWludHMgJiBUQUlOVF9QUk9QUklFVEFSWV9NT0RVTEUpCi0JCQlidWZbYngrK10gPSAnUCc7Ci0JCWlmICh0YWludHMgJiBUQUlOVF9GT1JDRURfTU9EVUxFKQotCQkJYnVmW2J4KytdID0gJ0YnOwotCQkvKgotCQkgKiBUQUlOVF9GT1JDRURfUk1NT0Q6IGNvdWxkIGJlIGFkZGVkLgotCQkgKiBUQUlOVF9VTlNBRkVfU01QLCBUQUlOVF9NQUNISU5FX0NIRUNLLCBUQUlOVF9CQURfUEFHRSBkb24ndAotCQkgKiBhcHBseSB0byBtb2R1bGVzLgotCQkgKi8KLQkJYnVmW2J4XSA9ICcpJzsKLQl9Ci0JcmV0dXJuIGJ1ZjsKLX0KLQogLyogRG9uJ3QgZ3JhYiBsb2NrLCB3ZSdyZSBvb3BzaW5nLiAqLwogdm9pZCBwcmludF9tb2R1bGVzKHZvaWQpCiB7CmRpZmYgLS1naXQgYS9rZXJuZWwvbXV0ZXgtZGVidWcuYyBiL2tlcm5lbC9tdXRleC1kZWJ1Zy5jCmluZGV4IGUzMjAzYzYuLjE4NjUxNjQgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9tdXRleC1kZWJ1Zy5jCisrKyBiL2tlcm5lbC9tdXRleC1kZWJ1Zy5jCkBAIC05MSw3ICs5MSw3IEBACiAJICogTWFrZSBzdXJlIHdlIGFyZSBub3QgcmVpbml0aWFsaXppbmcgYSBoZWxkIGxvY2s6CiAJICovCiAJZGVidWdfY2hlY2tfbm9fbG9ja3NfZnJlZWQoKHZvaWQgKilsb2NrLCBzaXplb2YoKmxvY2spKTsKLQlsb2NrZGVwX2luaXRfbWFwKCZsb2NrLT5kZXBfbWFwLCBuYW1lLCBrZXkpOworCWxvY2tkZXBfaW5pdF9tYXAoJmxvY2stPmRlcF9tYXAsIG5hbWUsIGtleSwgMCk7CiAjZW5kaWYKIAlsb2NrLT5vd25lciA9IE5VTEw7CiAJbG9jay0+bWFnaWMgPSBsb2NrOwpkaWZmIC0tZ2l0IGEva2VybmVsL25zcHJveHkuYyBiL2tlcm5lbC9uc3Byb3h5LmMKaW5kZXggNmViZGI4Mi4uNjc0YWNlYiAxMDA2NDQKLS0tIGEva2VybmVsL25zcHJveHkuYworKysgYi9rZXJuZWwvbnNwcm94eS5jCkBAIC00NCwxMSArNDQsOSBAQAogewogCXN0cnVjdCBuc3Byb3h5ICpuczsKIAotCW5zID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IG5zcHJveHkpLCBHRlBfS0VSTkVMKTsKLQlpZiAobnMpIHsKLQkJbWVtY3B5KG5zLCBvcmlnLCBzaXplb2Yoc3RydWN0IG5zcHJveHkpKTsKKwlucyA9IGttZW1kdXAob3JpZywgc2l6ZW9mKHN0cnVjdCBuc3Byb3h5KSwgR0ZQX0tFUk5FTCk7CisJaWYgKG5zKQogCQlhdG9taWNfc2V0KCZucy0+Y291bnQsIDEpOwotCX0KIAlyZXR1cm4gbnM7CiB9CiAKZGlmZiAtLWdpdCBhL2tlcm5lbC9wb3NpeC1jcHUtdGltZXJzLmMgYi9rZXJuZWwvcG9zaXgtY3B1LXRpbWVycy5jCmluZGV4IDQ3OWIxNmIuLjdjM2UxZTYgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9wb3NpeC1jcHUtdGltZXJzLmMKKysrIGIva2VybmVsL3Bvc2l4LWNwdS10aW1lcnMuYwpAQCAtODgsNiArODgsMTkgQEAKIH0KIAogLyoKKyAqIERpdmlkZSBhbmQgbGltaXQgdGhlIHJlc3VsdCB0byByZXMgPj0gMQorICoKKyAqIFRoaXMgaXMgbmVjZXNzYXJ5IHRvIHByZXZlbnQgc2lnbmFsIGRlbGl2ZXJ5IHN0YXJ2YXRpb24sIHdoZW4gdGhlIHJlc3VsdCBvZgorICogdGhlIGRpdmlzaW9uIHdvdWxkIGJlIHJvdW5kZWQgZG93biB0byAwLgorICovCitzdGF0aWMgaW5saW5lIGNwdXRpbWVfdCBjcHV0aW1lX2Rpdl9ub25femVybyhjcHV0aW1lX3QgdGltZSwgdW5zaWduZWQgbG9uZyBkaXYpCit7CisJY3B1dGltZV90IHJlcyA9IGNwdXRpbWVfZGl2KHRpbWUsIGRpdik7CisKKwlyZXR1cm4gbWF4X3QoY3B1dGltZV90LCByZXMsIDEpOworfQorCisvKgogICogVXBkYXRlIGV4cGlyeSB0aW1lIGZyb20gaW5jcmVtZW50LCBhbmQgaW5jcmVhc2Ugb3ZlcnJ1biBjb3VudCwKICAqIGdpdmVuIHRoZSBjdXJyZW50IGNsb2NrIHNhbXBsZS4KICAqLwpAQCAtNDgzLDggKzQ5Niw4IEBACiAJCUJVRygpOwogCQlicmVhazsKIAljYXNlIENQVUNMT0NLX1BST0Y6Ci0JCWxlZnQgPSBjcHV0aW1lX2RpdihjcHV0aW1lX3N1YihleHBpcmVzLmNwdSwgdmFsLmNwdSksCi0JCQkJICAgbnRocmVhZHMpOworCQlsZWZ0ID0gY3B1dGltZV9kaXZfbm9uX3plcm8oY3B1dGltZV9zdWIoZXhwaXJlcy5jcHUsIHZhbC5jcHUpLAorCQkJCSAgICAgICBudGhyZWFkcyk7CiAJCWRvIHsKIAkJCWlmIChsaWtlbHkoISh0LT5mbGFncyAmIFBGX0VYSVRJTkcpKSkgewogCQkJCXRpY2tzID0gY3B1dGltZV9hZGQocHJvZl90aWNrcyh0KSwgbGVmdCk7CkBAIC00OTgsOCArNTExLDggQEAKIAkJfSB3aGlsZSAodCAhPSBwKTsKIAkJYnJlYWs7CiAJY2FzZSBDUFVDTE9DS19WSVJUOgotCQlsZWZ0ID0gY3B1dGltZV9kaXYoY3B1dGltZV9zdWIoZXhwaXJlcy5jcHUsIHZhbC5jcHUpLAotCQkJCSAgIG50aHJlYWRzKTsKKwkJbGVmdCA9IGNwdXRpbWVfZGl2X25vbl96ZXJvKGNwdXRpbWVfc3ViKGV4cGlyZXMuY3B1LCB2YWwuY3B1KSwKKwkJCQkgICAgICAgbnRocmVhZHMpOwogCQlkbyB7CiAJCQlpZiAobGlrZWx5KCEodC0+ZmxhZ3MgJiBQRl9FWElUSU5HKSkpIHsKIAkJCQl0aWNrcyA9IGNwdXRpbWVfYWRkKHZpcnRfdGlja3ModCksIGxlZnQpOwpAQCAtNTE1LDYgKzUyOCw3IEBACiAJY2FzZSBDUFVDTE9DS19TQ0hFRDoKIAkJbnNsZWZ0ID0gZXhwaXJlcy5zY2hlZCAtIHZhbC5zY2hlZDsKIAkJZG9fZGl2KG5zbGVmdCwgbnRocmVhZHMpOworCQluc2xlZnQgPSBtYXhfdCh1bnNpZ25lZCBsb25nIGxvbmcsIG5zbGVmdCwgMSk7CiAJCWRvIHsKIAkJCWlmIChsaWtlbHkoISh0LT5mbGFncyAmIFBGX0VYSVRJTkcpKSkgewogCQkJCW5zID0gdC0+c2NoZWRfdGltZSArIG5zbGVmdDsKQEAgLTExNTksMTIgKzExNzMsMTMgQEAKIAogCQlwcm9mX2xlZnQgPSBjcHV0aW1lX3N1Yihwcm9mX2V4cGlyZXMsIHV0aW1lKTsKIAkJcHJvZl9sZWZ0ID0gY3B1dGltZV9zdWIocHJvZl9sZWZ0LCBzdGltZSk7Ci0JCXByb2ZfbGVmdCA9IGNwdXRpbWVfZGl2KHByb2ZfbGVmdCwgbnRocmVhZHMpOworCQlwcm9mX2xlZnQgPSBjcHV0aW1lX2Rpdl9ub25femVybyhwcm9mX2xlZnQsIG50aHJlYWRzKTsKIAkJdmlydF9sZWZ0ID0gY3B1dGltZV9zdWIodmlydF9leHBpcmVzLCB1dGltZSk7Ci0JCXZpcnRfbGVmdCA9IGNwdXRpbWVfZGl2KHZpcnRfbGVmdCwgbnRocmVhZHMpOworCQl2aXJ0X2xlZnQgPSBjcHV0aW1lX2Rpdl9ub25femVybyh2aXJ0X2xlZnQsIG50aHJlYWRzKTsKIAkJaWYgKHNjaGVkX2V4cGlyZXMpIHsKIAkJCXNjaGVkX2xlZnQgPSBzY2hlZF9leHBpcmVzIC0gc2NoZWRfdGltZTsKIAkJCWRvX2RpdihzY2hlZF9sZWZ0LCBudGhyZWFkcyk7CisJCQlzY2hlZF9sZWZ0ID0gbWF4X3QodW5zaWduZWQgbG9uZyBsb25nLCBzY2hlZF9sZWZ0LCAxKTsKIAkJfSBlbHNlIHsKIAkJCXNjaGVkX2xlZnQgPSAwOwogCQl9CmRpZmYgLS1naXQgYS9rZXJuZWwvcG93ZXIvZGlzay5jIGIva2VybmVsL3Bvd2VyL2Rpc2suYwppbmRleCBkNzIyMzQ5Li5iMWZiNzg2IDEwMDY0NAotLS0gYS9rZXJuZWwvcG93ZXIvZGlzay5jCisrKyBiL2tlcm5lbC9wb3dlci9kaXNrLmMKQEAgLTE4LDYgKzE4LDcgQEAKICNpbmNsdWRlIDxsaW51eC9mcy5oPgogI2luY2x1ZGUgPGxpbnV4L21vdW50Lmg+CiAjaW5jbHVkZSA8bGludXgvcG0uaD4KKyNpbmNsdWRlIDxsaW51eC9jb25zb2xlLmg+CiAjaW5jbHVkZSA8bGludXgvY3B1Lmg+CiAKICNpbmNsdWRlICJwb3dlci5oIgpAQCAtNzAsNyArNzEsNyBAQAogCiBzdGF0aWMgaW50IHByZXBhcmVfcHJvY2Vzc2VzKHZvaWQpCiB7Ci0JaW50IGVycm9yOworCWludCBlcnJvciA9IDA7CiAKIAlwbV9wcmVwYXJlX2NvbnNvbGUoKTsKIApAQCAtODMsNiArODQsMTIgQEAKIAkJZ290byB0aGF3OwogCX0KIAorCWlmIChwbV9kaXNrX21vZGUgPT0gUE1fRElTS19URVNUUFJPQykgeworCQlwcmludGsoInN3c3VzcCBkZWJ1ZzogV2FpdGluZyBmb3IgNSBzZWNvbmRzLlxuIik7CisJCW1kZWxheSg1MDAwKTsKKwkJZ290byB0aGF3OworCX0KKwogCS8qIEZyZWUgbWVtb3J5IGJlZm9yZSBzaHV0dGluZyBkb3duIGRldmljZXMuICovCiAJaWYgKCEoZXJyb3IgPSBzd3N1c3Bfc2hyaW5rX21lbW9yeSgpKSkKIAkJcmV0dXJuIDA7CkBAIC0xMTksMTEgKzEyNiwyMSBAQAogCWlmIChlcnJvcikKIAkJcmV0dXJuIGVycm9yOwogCisJaWYgKHBtX2Rpc2tfbW9kZSA9PSBQTV9ESVNLX1RFU1RQUk9DKQorCQlnb3RvIFRoYXc7CisKKwlzdXNwZW5kX2NvbnNvbGUoKTsKIAllcnJvciA9IGRldmljZV9zdXNwZW5kKFBNU0dfRlJFRVpFKTsKIAlpZiAoZXJyb3IpIHsKKwkJcmVzdW1lX2NvbnNvbGUoKTsKIAkJcHJpbnRrKCJTb21lIGRldmljZXMgZmFpbGVkIHRvIHN1c3BlbmRcbiIpOwotCQl1bnByZXBhcmVfcHJvY2Vzc2VzKCk7Ci0JCXJldHVybiBlcnJvcjsKKwkJZ290byBUaGF3OworCX0KKworCWlmIChwbV9kaXNrX21vZGUgPT0gUE1fRElTS19URVNUKSB7CisJCXByaW50aygic3dzdXNwIGRlYnVnOiBXYWl0aW5nIGZvciA1IHNlY29uZHMuXG4iKTsKKwkJbWRlbGF5KDUwMDApOworCQlnb3RvIERvbmU7CiAJfQogCiAJcHJfZGVidWcoIlBNOiBzbmFwc2hvdHRpbmcgbWVtb3J5LlxuIik7CkBAIC0xMzMsMjEgKzE1MCwyNCBAQAogCiAJaWYgKGluX3N1c3BlbmQpIHsKIAkJZGV2aWNlX3Jlc3VtZSgpOworCQlyZXN1bWVfY29uc29sZSgpOwogCQlwcl9kZWJ1ZygiUE06IHdyaXRpbmcgaW1hZ2UuXG4iKTsKIAkJZXJyb3IgPSBzd3N1c3Bfd3JpdGUoKTsKIAkJaWYgKCFlcnJvcikKIAkJCXBvd2VyX2Rvd24ocG1fZGlza19tb2RlKTsKIAkJZWxzZSB7CiAJCQlzd3N1c3BfZnJlZSgpOwotCQkJdW5wcmVwYXJlX3Byb2Nlc3NlcygpOwotCQkJcmV0dXJuIGVycm9yOworCQkJZ290byBUaGF3OwogCQl9Ci0JfSBlbHNlCisJfSBlbHNlIHsKIAkJcHJfZGVidWcoIlBNOiBJbWFnZSByZXN0b3JlZCBzdWNjZXNzZnVsbHkuXG4iKTsKKwl9CiAKIAlzd3N1c3BfZnJlZSgpOwogIERvbmU6CiAJZGV2aWNlX3Jlc3VtZSgpOworCXJlc3VtZV9jb25zb2xlKCk7CisgVGhhdzoKIAl1bnByZXBhcmVfcHJvY2Vzc2VzKCk7CiAJcmV0dXJuIGVycm9yOwogfQpAQCAtMjEyLDcgKzIzMiw5IEBACiAKIAlwcl9kZWJ1ZygiUE06IFByZXBhcmluZyBkZXZpY2VzIGZvciByZXN0b3JlLlxuIik7CiAKKwlzdXNwZW5kX2NvbnNvbGUoKTsKIAlpZiAoKGVycm9yID0gZGV2aWNlX3N1c3BlbmQoUE1TR19QUkVUSEFXKSkpIHsKKwkJcmVzdW1lX2NvbnNvbGUoKTsKIAkJcHJpbnRrKCJTb21lIGRldmljZXMgZmFpbGVkIHRvIHN1c3BlbmRcbiIpOwogCQlzd3N1c3BfZnJlZSgpOwogCQlnb3RvIFRoYXc7CkBAIC0yMjQsNiArMjQ2LDcgQEAKIAlzd3N1c3BfcmVzdW1lKCk7CiAJcHJfZGVidWcoIlBNOiBSZXN0b3JlIGZhaWxlZCwgcmVjb3ZlcmluZy5uIik7CiAJZGV2aWNlX3Jlc3VtZSgpOworCXJlc3VtZV9jb25zb2xlKCk7CiAgVGhhdzoKIAl1bnByZXBhcmVfcHJvY2Vzc2VzKCk7CiAgRG9uZToKQEAgLTI0MSw2ICsyNjQsOCBAQAogCVtQTV9ESVNLX1BMQVRGT1JNXQk9ICJwbGF0Zm9ybSIsCiAJW1BNX0RJU0tfU0hVVERPV05dCT0gInNodXRkb3duIiwKIAlbUE1fRElTS19SRUJPT1RdCT0gInJlYm9vdCIsCisJW1BNX0RJU0tfVEVTVF0JCT0gInRlc3QiLAorCVtQTV9ESVNLX1RFU1RQUk9DXQk9ICJ0ZXN0cHJvYyIsCiB9OwogCiAvKioKQEAgLTI5NSwxNyArMzIwLDE5IEBACiAJCX0KIAl9CiAJaWYgKG1vZGUpIHsKLQkJaWYgKG1vZGUgPT0gUE1fRElTS19TSFVURE9XTiB8fCBtb2RlID09IFBNX0RJU0tfUkVCT09UKQorCQlpZiAobW9kZSA9PSBQTV9ESVNLX1NIVVRET1dOIHx8IG1vZGUgPT0gUE1fRElTS19SRUJPT1QgfHwKKwkJICAgICBtb2RlID09IFBNX0RJU0tfVEVTVCB8fCBtb2RlID09IFBNX0RJU0tfVEVTVFBST0MpIHsKIAkJCXBtX2Rpc2tfbW9kZSA9IG1vZGU7Ci0JCWVsc2UgeworCQl9IGVsc2UgewogCQkJaWYgKHBtX29wcyAmJiBwbV9vcHMtPmVudGVyICYmCiAJCQkgICAgKG1vZGUgPT0gcG1fb3BzLT5wbV9kaXNrX21vZGUpKQogCQkJCXBtX2Rpc2tfbW9kZSA9IG1vZGU7CiAJCQllbHNlCiAJCQkJZXJyb3IgPSAtRUlOVkFMOwogCQl9Ci0JfSBlbHNlCisJfSBlbHNlIHsKIAkJZXJyb3IgPSAtRUlOVkFMOworCX0KIAogCXByX2RlYnVnKCJQTTogc3VzcGVuZC10by1kaXNrIG1vZGUgc2V0IHRvICclcydcbiIsCiAJCSBwbV9kaXNrX21vZGVzW21vZGVdKTsKZGlmZiAtLWdpdCBhL2tlcm5lbC9wb3dlci9zd2FwLmMgYi9rZXJuZWwvcG93ZXIvc3dhcC5jCmluZGV4IDliMmVlNTMuLjFhM2IwZGQgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9wb3dlci9zd2FwLmMKKysrIGIva2VybmVsL3Bvd2VyL3N3YXAuYwpAQCAtNDI1LDcgKzQyNSw4IEBACiAJCQliaW9fc2V0X3BhZ2VzX2RpcnR5KGJpbyk7CiAJCWJpb19wdXQoYmlvKTsKIAl9IGVsc2UgewotCQlnZXRfcGFnZShwYWdlKTsKKwkJaWYgKHJ3ID09IFJFQUQpCisJCQlnZXRfcGFnZShwYWdlKTsJLyogVGhlc2UgcGFnZXMgYXJlIGZyZWVkIGxhdGVyICovCiAJCWJpby0+YmlfcHJpdmF0ZSA9ICpiaW9fY2hhaW47CiAJCSpiaW9fY2hhaW4gPSBiaW87CiAJCXN1Ym1pdF9iaW8ocncgfCAoMSA8PCBCSU9fUldfU1lOQyksIGJpbyk7CmRpZmYgLS1naXQgYS9rZXJuZWwvcG93ZXIvdXNlci5jIGIva2VybmVsL3Bvd2VyL3VzZXIuYwppbmRleCA5M2I1ZGQyLi5kOTkxZDNiIDEwMDY0NAotLS0gYS9rZXJuZWwvcG93ZXIvdXNlci5jCisrKyBiL2tlcm5lbC9wb3dlci91c2VyLmMKQEAgLTE5LDYgKzE5LDcgQEAKICNpbmNsdWRlIDxsaW51eC9zd2Fwb3BzLmg+CiAjaW5jbHVkZSA8bGludXgvcG0uaD4KICNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L2NvbnNvbGUuaD4KICNpbmNsdWRlIDxsaW51eC9jcHUuaD4KIAogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CkBAIC0xNzMsMTIgKzE3NCwxNCBAQAogCQkvKiBGcmVlIG1lbW9yeSBiZWZvcmUgc2h1dHRpbmcgZG93biBkZXZpY2VzLiAqLwogCQllcnJvciA9IHN3c3VzcF9zaHJpbmtfbWVtb3J5KCk7CiAJCWlmICghZXJyb3IpIHsKKwkJCXN1c3BlbmRfY29uc29sZSgpOwogCQkJZXJyb3IgPSBkZXZpY2Vfc3VzcGVuZChQTVNHX0ZSRUVaRSk7CiAJCQlpZiAoIWVycm9yKSB7CiAJCQkJaW5fc3VzcGVuZCA9IDE7CiAJCQkJZXJyb3IgPSBzd3N1c3Bfc3VzcGVuZCgpOwogCQkJCWRldmljZV9yZXN1bWUoKTsKIAkJCX0KKwkJCXJlc3VtZV9jb25zb2xlKCk7CiAJCX0KIAkJdXAoJnBtX3NlbSk7CiAJCWlmICghZXJyb3IpCkBAIC0xOTYsMTEgKzE5OSwxMyBAQAogCQlzbmFwc2hvdF9mcmVlX3VudXNlZF9tZW1vcnkoJmRhdGEtPmhhbmRsZSk7CiAJCWRvd24oJnBtX3NlbSk7CiAJCXBtX3ByZXBhcmVfY29uc29sZSgpOworCQlzdXNwZW5kX2NvbnNvbGUoKTsKIAkJZXJyb3IgPSBkZXZpY2Vfc3VzcGVuZChQTVNHX1BSRVRIQVcpOwogCQlpZiAoIWVycm9yKSB7CiAJCQllcnJvciA9IHN3c3VzcF9yZXN1bWUoKTsKIAkJCWRldmljZV9yZXN1bWUoKTsKIAkJfQorCQlyZXN1bWVfY29uc29sZSgpOwogCQlwbV9yZXN0b3JlX2NvbnNvbGUoKTsKIAkJdXAoJnBtX3NlbSk7CiAJCWJyZWFrOwpAQCAtMjg5LDYgKzI5NCw3IEBACiAJCX0KIAogCQkvKiBQdXQgZGV2aWNlcyB0byBzbGVlcCAqLworCQlzdXNwZW5kX2NvbnNvbGUoKTsKIAkJZXJyb3IgPSBkZXZpY2Vfc3VzcGVuZChQTVNHX1NVU1BFTkQpOwogCQlpZiAoZXJyb3IpIHsKIAkJCXByaW50ayhLRVJOX0VSUiAiRmFpbGVkIHRvIHN1c3BlbmQgc29tZSBkZXZpY2VzLlxuIik7CkBAIC0yOTksNyArMzA1LDcgQEAKIAkJCS8qIFdha2UgdXAgZGV2aWNlcyAqLwogCQkJZGV2aWNlX3Jlc3VtZSgpOwogCQl9Ci0KKwkJcmVzdW1lX2NvbnNvbGUoKTsKIAkJaWYgKHBtX29wcy0+ZmluaXNoKQogCQkJcG1fb3BzLT5maW5pc2goUE1fU1VTUEVORF9NRU0pOwogCmRpZmYgLS1naXQgYS9rZXJuZWwvcHJpbnRrLmMgYi9rZXJuZWwvcHJpbnRrLmMKaW5kZXggNzcxZjVlOC4uNjY0MjY1NSAxMDA2NDQKLS0tIGEva2VybmVsL3ByaW50ay5jCisrKyBiL2tlcm5lbC9wcmludGsuYwpAQCAtMzEsNiArMzEsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3NlY3VyaXR5Lmg+CiAjaW5jbHVkZSA8bGludXgvYm9vdG1lbS5oPgogI2luY2x1ZGUgPGxpbnV4L3N5c2NhbGxzLmg+CisjaW5jbHVkZSA8bGludXgvamlmZmllcy5oPgogCiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KIApAQCAtODIwLDE1ICs4MjEsOCBAQAogCWNvbnNvbGVfbG9ja2VkID0gMDsKIAl1cCgmY29uc29sZV9zZW0pOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmxvZ2J1Zl9sb2NrLCBmbGFncyk7Ci0JaWYgKHdha2Vfa2xvZ2QgJiYgIW9vcHNfaW5fcHJvZ3Jlc3MgJiYgd2FpdHF1ZXVlX2FjdGl2ZSgmbG9nX3dhaXQpKSB7Ci0JCS8qCi0JCSAqIElmIHdlIHByaW50ayBmcm9tIHdpdGhpbiB0aGUgbG9jayBkZXBlbmRlbmN5IGNvZGUsCi0JCSAqIGZyb20gd2l0aGluIHRoZSBzY2hlZHVsZXIgY29kZSwgdGhlbiBkbyBub3QgbG9jawotCQkgKiB1cCBkdWUgdG8gc2VsZi1yZWN1cnNpb246Ci0JCSAqLwotCQlpZiAoIWxvY2tkZXBfaW50ZXJuYWwoKSkKLQkJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmbG9nX3dhaXQpOwotCX0KKwlpZiAod2FrZV9rbG9nZCAmJiAhb29wc19pbl9wcm9ncmVzcyAmJiB3YWl0cXVldWVfYWN0aXZlKCZsb2dfd2FpdCkpCisJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmbG9nX3dhaXQpOwogfQogRVhQT1JUX1NZTUJPTChyZWxlYXNlX2NvbnNvbGVfc2VtKTsKIApAQCAtMTEwOCwzICsxMTAyLDIzIEBACiAJCQkJcHJpbnRrX3JhdGVsaW1pdF9idXJzdCk7CiB9CiBFWFBPUlRfU1lNQk9MKHByaW50a19yYXRlbGltaXQpOworCisvKioKKyAqIHByaW50a190aW1lZF9yYXRlbGltaXQgLSBjYWxsZXItY29udHJvbGxlZCBwcmludGsgcmF0ZWxpbWl0aW5nCisgKiBAY2FsbGVyX2ppZmZpZXM6IHBvaW50ZXIgdG8gY2FsbGVyJ3Mgc3RhdGUKKyAqIEBpbnRlcnZhbF9tc2VjczogbWluaW11bSBpbnRlcnZhbCBiZXR3ZWVuIHByaW50cworICoKKyAqIHByaW50a190aW1lZF9yYXRlbGltaXQoKSByZXR1cm5zIHRydWUgaWYgbW9yZSB0aGFuIEBpbnRlcnZhbF9tc2VjcworICogbWlsbGlzZWNvbmRzIGhhdmUgZWxhcHNlZCBzaW5jZSB0aGUgbGFzdCB0aW1lIHByaW50a190aW1lZF9yYXRlbGltaXQoKQorICogcmV0dXJuZWQgdHJ1ZS4KKyAqLworYm9vbCBwcmludGtfdGltZWRfcmF0ZWxpbWl0KHVuc2lnbmVkIGxvbmcgKmNhbGxlcl9qaWZmaWVzLAorCQkJdW5zaWduZWQgaW50IGludGVydmFsX21zZWNzKQoreworCWlmICgqY2FsbGVyX2ppZmZpZXMgPT0gMCB8fCB0aW1lX2FmdGVyKGppZmZpZXMsICpjYWxsZXJfamlmZmllcykpIHsKKwkJKmNhbGxlcl9qaWZmaWVzID0gamlmZmllcyArIG1zZWNzX3RvX2ppZmZpZXMoaW50ZXJ2YWxfbXNlY3MpOworCQlyZXR1cm4gdHJ1ZTsKKwl9CisJcmV0dXJuIGZhbHNlOworfQorRVhQT1JUX1NZTUJPTChwcmludGtfdGltZWRfcmF0ZWxpbWl0KTsKZGlmZiAtLWdpdCBhL2tlcm5lbC9wcm9maWxlLmMgYi9rZXJuZWwvcHJvZmlsZS5jCmluZGV4IDg1NzMwMGEuLmY5NDBiNDYgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9wcm9maWxlLmMKKysrIGIva2VybmVsL3Byb2ZpbGUuYwpAQCAtMzk5LDcgKzM5OSw3IEBACiAJdW5zaWduZWQgbG9uZyBmdWxsX2NvdW50ID0gY291bnQsIGVycjsKIAljcHVtYXNrX3QgbmV3X3ZhbHVlOwogCi0JZXJyID0gY3B1bWFza19wYXJzZShidWZmZXIsIGNvdW50LCBuZXdfdmFsdWUpOworCWVyciA9IGNwdW1hc2tfcGFyc2VfdXNlcihidWZmZXIsIGNvdW50LCBuZXdfdmFsdWUpOwogCWlmIChlcnIpCiAJCXJldHVybiBlcnI7CiAKZGlmZiAtLWdpdCBhL2tlcm5lbC9zY2hlZC5jIGIva2VybmVsL3NjaGVkLmMKaW5kZXggNTM2MDhhNS4uMzM5OTcwMSAxMDA2NDQKLS0tIGEva2VybmVsL3NjaGVkLmMKKysrIGIva2VybmVsL3NjaGVkLmMKQEAgLTE2MCwxNSArMTYwLDYgQEAKICNkZWZpbmUgVEFTS19QUkVFTVBUU19DVVJSKHAsIHJxKSBcCiAJKChwKS0+cHJpbyA8IChycSktPmN1cnItPnByaW8pCiAKLS8qCi0gKiB0YXNrX3RpbWVzbGljZSgpIHNjYWxlcyB1c2VyLW5pY2UgdmFsdWVzIFsgLTIwIC4uLiAwIC4uLiAxOSBdCi0gKiB0byB0aW1lIHNsaWNlIHZhbHVlczogWzgwMG1zIC4uLiAxMDBtcyAuLi4gNW1zXQotICoKLSAqIFRoZSBoaWdoZXIgYSB0aHJlYWQncyBwcmlvcml0eSwgdGhlIGJpZ2dlciB0aW1lc2xpY2VzCi0gKiBpdCBnZXRzIGR1cmluZyBvbmUgcm91bmQgb2YgZXhlY3V0aW9uLiBCdXQgZXZlbiB0aGUgbG93ZXN0Ci0gKiBwcmlvcml0eSB0aHJlYWQgZ2V0cyBNSU5fVElNRVNMSUNFIHdvcnRoIG9mIGV4ZWN1dGlvbiB0aW1lLgotICovCi0KICNkZWZpbmUgU0NBTEVfUFJJTyh4LCBwcmlvKSBcCiAJbWF4KHggKiAoTUFYX1BSSU8gLSBwcmlvKSAvIChNQVhfVVNFUl9QUklPIC8gMiksIE1JTl9USU1FU0xJQ0UpCiAKQEAgLTE4MCw2ICsxNzEsMTUgQEAKIAkJcmV0dXJuIFNDQUxFX1BSSU8oREVGX1RJTUVTTElDRSwgc3RhdGljX3ByaW8pOwogfQogCisvKgorICogdGFza190aW1lc2xpY2UoKSBzY2FsZXMgdXNlci1uaWNlIHZhbHVlcyBbIC0yMCAuLi4gMCAuLi4gMTkgXQorICogdG8gdGltZSBzbGljZSB2YWx1ZXM6IFs4MDBtcyAuLi4gMTAwbXMgLi4uIDVtc10KKyAqCisgKiBUaGUgaGlnaGVyIGEgdGhyZWFkJ3MgcHJpb3JpdHksIHRoZSBiaWdnZXIgdGltZXNsaWNlcworICogaXQgZ2V0cyBkdXJpbmcgb25lIHJvdW5kIG9mIGV4ZWN1dGlvbi4gQnV0IGV2ZW4gdGhlIGxvd2VzdAorICogcHJpb3JpdHkgdGhyZWFkIGdldHMgTUlOX1RJTUVTTElDRSB3b3J0aCBvZiBleGVjdXRpb24gdGltZS4KKyAqLworCiBzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCB0YXNrX3RpbWVzbGljZShzdHJ1Y3QgdGFza19zdHJ1Y3QgKnApCiB7CiAJcmV0dXJuIHN0YXRpY19wcmlvX3RpbWVzbGljZShwLT5zdGF0aWNfcHJpbyk7CkBAIC0xODIyLDE0ICsxODIyLDE0IEBACiAJc3RydWN0IG1tX3N0cnVjdCAqbW0gPSBuZXh0LT5tbTsKIAlzdHJ1Y3QgbW1fc3RydWN0ICpvbGRtbSA9IHByZXYtPmFjdGl2ZV9tbTsKIAotCWlmICh1bmxpa2VseSghbW0pKSB7CisJaWYgKCFtbSkgewogCQluZXh0LT5hY3RpdmVfbW0gPSBvbGRtbTsKIAkJYXRvbWljX2luYygmb2xkbW0tPm1tX2NvdW50KTsKIAkJZW50ZXJfbGF6eV90bGIob2xkbW0sIG5leHQpOwogCX0gZWxzZQogCQlzd2l0Y2hfbW0ob2xkbW0sIG1tLCBuZXh0KTsKIAotCWlmICh1bmxpa2VseSghcHJldi0+bW0pKSB7CisJaWYgKCFwcmV2LT5tbSkgewogCQlwcmV2LT5hY3RpdmVfbW0gPSBOVUxMOwogCQlXQVJOX09OKHJxLT5wcmV2X21tKTsKIAkJcnEtPnByZXZfbW0gPSBvbGRtbTsKQEAgLTM0OTEsNyArMzQ5MSw3IEBACiAJICogSWYgdGhlcmUgaXMgYSBub24temVybyBwcmVlbXB0X2NvdW50IG9yIGludGVycnVwdHMgYXJlIGRpc2FibGVkLAogCSAqIHdlIGRvIG5vdCB3YW50IHRvIHByZWVtcHQgdGhlIGN1cnJlbnQgdGFzay4gIEp1c3QgcmV0dXJuLi4KIAkgKi8KLQlpZiAodW5saWtlbHkodGktPnByZWVtcHRfY291bnQgfHwgaXJxc19kaXNhYmxlZCgpKSkKKwlpZiAobGlrZWx5KHRpLT5wcmVlbXB0X2NvdW50IHx8IGlycXNfZGlzYWJsZWQoKSkpCiAJCXJldHVybjsKIAogbmVlZF9yZXNjaGVkOgpkaWZmIC0tZ2l0IGEva2VybmVsL3NpZ25hbC5jIGIva2VybmVsL3NpZ25hbC5jCmluZGV4IDdlZDhkNTMuLmRmMThjMTYgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9zaWduYWwuYworKysgYi9rZXJuZWwvc2lnbmFsLmMKQEAgLTI2NywxOCArMjY3LDI1IEBACiAJCQkJCSBpbnQgb3ZlcnJpZGVfcmxpbWl0KQogewogCXN0cnVjdCBzaWdxdWV1ZSAqcSA9IE5VTEw7CisJc3RydWN0IHVzZXJfc3RydWN0ICp1c2VyOwogCi0JYXRvbWljX2luYygmdC0+dXNlci0+c2lncGVuZGluZyk7CisJLyoKKwkgKiBJbiBvcmRlciB0byBhdm9pZCBwcm9ibGVtcyB3aXRoICJzd2l0Y2hfdXNlcigpIiwgd2Ugd2FudCB0byBtYWtlCisJICogc3VyZSB0aGF0IHRoZSBjb21waWxlciBkb2Vzbid0IHJlLWxvYWQgInQtPnVzZXIiCisJICovCisJdXNlciA9IHQtPnVzZXI7CisJYmFycmllcigpOworCWF0b21pY19pbmMoJnVzZXItPnNpZ3BlbmRpbmcpOwogCWlmIChvdmVycmlkZV9ybGltaXQgfHwKLQkgICAgYXRvbWljX3JlYWQoJnQtPnVzZXItPnNpZ3BlbmRpbmcpIDw9CisJICAgIGF0b21pY19yZWFkKCZ1c2VyLT5zaWdwZW5kaW5nKSA8PQogCQkJdC0+c2lnbmFsLT5ybGltW1JMSU1JVF9TSUdQRU5ESU5HXS5ybGltX2N1cikKIAkJcSA9IGttZW1fY2FjaGVfYWxsb2Moc2lncXVldWVfY2FjaGVwLCBmbGFncyk7CiAJaWYgKHVubGlrZWx5KHEgPT0gTlVMTCkpIHsKLQkJYXRvbWljX2RlYygmdC0+dXNlci0+c2lncGVuZGluZyk7CisJCWF0b21pY19kZWMoJnVzZXItPnNpZ3BlbmRpbmcpOwogCX0gZWxzZSB7CiAJCUlOSVRfTElTVF9IRUFEKCZxLT5saXN0KTsKIAkJcS0+ZmxhZ3MgPSAwOwotCQlxLT51c2VyID0gZ2V0X3VpZCh0LT51c2VyKTsKKwkJcS0+dXNlciA9IGdldF91aWQodXNlcik7CiAJfQogCXJldHVybihxKTsKIH0KZGlmZiAtLWdpdCBhL2tlcm5lbC9zeXNfbmkuYyBiL2tlcm5lbC9zeXNfbmkuYwppbmRleCA3YTNiMmU3NS4uZDczMDZkMCAxMDA2NDQKLS0tIGEva2VybmVsL3N5c19uaS5jCisrKyBiL2tlcm5lbC9zeXNfbmkuYwpAQCAtNDksNiArNDksNyBAQAogY29uZF9zeXNjYWxsKHN5c19lcG9sbF9jcmVhdGUpOwogY29uZF9zeXNjYWxsKHN5c19lcG9sbF9jdGwpOwogY29uZF9zeXNjYWxsKHN5c19lcG9sbF93YWl0KTsKK2NvbmRfc3lzY2FsbChzeXNfZXBvbGxfcHdhaXQpOwogY29uZF9zeXNjYWxsKHN5c19zZW1nZXQpOwogY29uZF9zeXNjYWxsKHN5c19zZW1vcCk7CiBjb25kX3N5c2NhbGwoc3lzX3NlbXRpbWVkb3ApOwpAQCAtMTM0LDYgKzEzNSw3IEBACiBjb25kX3N5c2NhbGwoc3lzX21yZW1hcCk7CiBjb25kX3N5c2NhbGwoc3lzX3JlbWFwX2ZpbGVfcGFnZXMpOwogY29uZF9zeXNjYWxsKGNvbXBhdF9zeXNfbW92ZV9wYWdlcyk7Citjb25kX3N5c2NhbGwoY29tcGF0X3N5c19taWdyYXRlX3BhZ2VzKTsKIAogLyogYmxvY2stbGF5ZXIgZGVwZW5kZW50ICovCiBjb25kX3N5c2NhbGwoc3lzX2JkZmx1c2gpOwpkaWZmIC0tZ2l0IGEva2VybmVsL3N5c2N0bC5jIGIva2VybmVsL3N5c2N0bC5jCmluZGV4IDgwMjBmYjIuLjA5ZTU2OWY0IDEwMDY0NAotLS0gYS9rZXJuZWwvc3lzY3RsLmMKKysrIGIva2VybmVsL3N5c2N0bC5jCkBAIC0xMzYsOCArMTM2LDEwIEBACiBzdGF0aWMgaW50IHByb2NfZG9fdXRzX3N0cmluZyhjdGxfdGFibGUgKnRhYmxlLCBpbnQgd3JpdGUsIHN0cnVjdCBmaWxlICpmaWxwLAogCQkgIHZvaWQgX191c2VyICpidWZmZXIsIHNpemVfdCAqbGVucCwgbG9mZl90ICpwcG9zKTsKIAorI2lmZGVmIENPTkZJR19QUk9DX1NZU0NUTAogc3RhdGljIGludCBwcm9jX2RvX2NhZF9waWQoY3RsX3RhYmxlICp0YWJsZSwgaW50IHdyaXRlLCBzdHJ1Y3QgZmlsZSAqZmlscCwKIAkJICB2b2lkIF9fdXNlciAqYnVmZmVyLCBzaXplX3QgKmxlbnAsIGxvZmZfdCAqcHBvcyk7CisjZW5kaWYKIAogc3RhdGljIGN0bF90YWJsZSByb290X3RhYmxlW107CiBzdGF0aWMgc3RydWN0IGN0bF90YWJsZV9oZWFkZXIgcm9vdF90YWJsZV9oZWFkZXIgPQpAQCAtNTQyLDYgKzU0NCw3IEBACiAJCS5wcm9jX2hhbmRsZXIJPSAmcHJvY19kb2ludHZlYywKIAl9LAogI2VuZGlmCisjaWZkZWYgQ09ORklHX1BST0NfU1lTQ1RMCiAJewogCQkuY3RsX25hbWUJPSBLRVJOX0NBRFBJRCwKIAkJLnByb2NuYW1lCT0gImNhZF9waWQiLApAQCAtNTUwLDYgKzU1Myw3IEBACiAJCS5tb2RlCQk9IDA2MDAsCiAJCS5wcm9jX2hhbmRsZXIJPSAmcHJvY19kb19jYWRfcGlkLAogCX0sCisjZW5kaWYKIAl7CiAJCS5jdGxfbmFtZQk9IEtFUk5fTUFYX1RIUkVBRFMsCiAJCS5wcm9jbmFtZQk9ICJ0aHJlYWRzLW1heCIsCkBAIC0xMzExLDcgKzEzMTUsOSBAQAogCQlyZXR1cm4gLUVOT1RESVI7CiAJaWYgKGdldF91c2VyKG4sIG5hbWUpKQogCQlyZXR1cm4gLUVGQVVMVDsKLQlmb3IgKCA7IHRhYmxlLT5jdGxfbmFtZTsgdGFibGUrKykgeworCWZvciAoIDsgdGFibGUtPmN0bF9uYW1lIHx8IHRhYmxlLT5wcm9jbmFtZTsgdGFibGUrKykgeworCQlpZiAoIXRhYmxlLT5jdGxfbmFtZSkKKwkJCWNvbnRpbnVlOwogCQlpZiAobiA9PSB0YWJsZS0+Y3RsX25hbWUgfHwgdGFibGUtPmN0bF9uYW1lID09IENUTF9BTlkpIHsKIAkJCWludCBlcnJvcjsKIAkJCWlmICh0YWJsZS0+Y2hpbGQpIHsKQEAgLTE1MjgsNyArMTUzNCw3IEBACiAJaW50IGxlbjsKIAltb2RlX3QgbW9kZTsKIAkKLQlmb3IgKDsgdGFibGUtPmN0bF9uYW1lOyB0YWJsZSsrKSB7CisJZm9yICg7IHRhYmxlLT5jdGxfbmFtZSB8fCB0YWJsZS0+cHJvY25hbWU7IHRhYmxlKyspIHsKIAkJLyogQ2FuJ3QgZG8gYW55dGhpbmcgd2l0aG91dCBhIHByb2MgbmFtZS4gKi8KIAkJaWYgKCF0YWJsZS0+cHJvY25hbWUpCiAJCQljb250aW51ZTsKQEAgLTE1NzUsNyArMTU4MSw3IEBACiBzdGF0aWMgdm9pZCB1bnJlZ2lzdGVyX3Byb2NfdGFibGUoY3RsX3RhYmxlICogdGFibGUsIHN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqcm9vdCkKIHsKIAlzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKmRlOwotCWZvciAoOyB0YWJsZS0+Y3RsX25hbWU7IHRhYmxlKyspIHsKKwlmb3IgKDsgdGFibGUtPmN0bF9uYW1lIHx8IHRhYmxlLT5wcm9jbmFtZTsgdGFibGUrKykgewogCQlpZiAoIShkZSA9IHRhYmxlLT5kZSkpCiAJCQljb250aW51ZTsKIAkJaWYgKGRlLT5tb2RlICYgU19JRkRJUikgewpAQCAtMjY3NiwxMyArMjY4MiwzMyBAQAogYXNtbGlua2FnZSBsb25nIHN5c19zeXNjdGwoc3RydWN0IF9fc3lzY3RsX2FyZ3MgX191c2VyICphcmdzKQogewogCXN0YXRpYyBpbnQgbXNnX2NvdW50OworCXN0cnVjdCBfX3N5c2N0bF9hcmdzIHRtcDsKKwlpbnQgbmFtZVtDVExfTUFYTkFNRV07CisJaW50IGk7CisKKwkvKiBSZWFkIGluIHRoZSBzeXNjdGwgbmFtZSBmb3IgYmV0dGVyIGRlYnVnIG1lc3NhZ2UgbG9nZ2luZyAqLworCWlmIChjb3B5X2Zyb21fdXNlcigmdG1wLCBhcmdzLCBzaXplb2YodG1wKSkpCisJCXJldHVybiAtRUZBVUxUOworCWlmICh0bXAubmxlbiA8PSAwIHx8IHRtcC5ubGVuID49IENUTF9NQVhOQU1FKQorCQlyZXR1cm4gLUVOT1RESVI7CisJZm9yIChpID0gMDsgaSA8IHRtcC5ubGVuOyBpKyspCisJCWlmIChnZXRfdXNlcihuYW1lW2ldLCB0bXAubmFtZSArIGkpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisKKwkvKiBJZ25vcmUgYWNjZXNzZXMgdG8ga2VybmVsLnZlcnNpb24gKi8KKwlpZiAoKHRtcC5ubGVuID09IDIpICYmIChuYW1lWzBdID09IENUTF9LRVJOKSAmJiAobmFtZVsxXSA9PSBLRVJOX1ZFUlNJT04pKQorCQlnb3RvIG91dDsKIAogCWlmIChtc2dfY291bnQgPCA1KSB7CiAJCW1zZ19jb3VudCsrOwogCQlwcmludGsoS0VSTl9JTkZPCiAJCQkid2FybmluZzogcHJvY2VzcyBgJXMnIHVzZWQgdGhlIHJlbW92ZWQgc3lzY3RsICIKLQkJCSJzeXN0ZW0gY2FsbFxuIiwgY3VycmVudC0+Y29tbSk7CisJCQkic3lzdGVtIGNhbGwgd2l0aCAiLCBjdXJyZW50LT5jb21tKTsKKwkJZm9yIChpID0gMDsgaSA8IHRtcC5ubGVuOyBpKyspCisJCQlwcmludGsoIiVkLiIsIG5hbWVbaV0pOworCQlwcmludGsoIlxuIik7CiAJfQorb3V0OgogCXJldHVybiAtRU5PU1lTOwogfQogCmRpZmYgLS1naXQgYS9rZXJuZWwvdGFza3N0YXRzLmMgYi9rZXJuZWwvdGFza3N0YXRzLmMKaW5kZXggNWQ2YThjNS4uZjQ1YzVlNyAxMDA2NDQKLS0tIGEva2VybmVsL3Rhc2tzdGF0cy5jCisrKyBiL2tlcm5lbC90YXNrc3RhdHMuYwpAQCAtNzcsNyArNzcsOCBAQAogCS8qCiAJICogSWYgbmV3IGF0dHJpYnV0ZXMgYXJlIGFkZGVkLCBwbGVhc2UgcmV2aXNpdCB0aGlzIGFsbG9jYXRpb24KIAkgKi8KLQlza2IgPSBubG1zZ19uZXcoZ2VubG1zZ190b3RhbF9zaXplKHNpemUpLCBHRlBfS0VSTkVMKTsKKwlzaXplID0gbmxtc2dfdG90YWxfc2l6ZShnZW5sbXNnX3RvdGFsX3NpemUoc2l6ZSkpOworCXNrYiA9IG5sbXNnX25ldyhzaXplLCBHRlBfS0VSTkVMKTsKIAlpZiAoIXNrYikKIAkJcmV0dXJuIC1FTk9NRU07CiAKQEAgLTE3NCwyMSArMTc1LDE5IEBACiAJdXBfd3JpdGUoJmxpc3RlbmVycy0+c2VtKTsKIH0KIAotc3RhdGljIGludCBmaWxsX3BpZChwaWRfdCBwaWQsIHN0cnVjdCB0YXNrX3N0cnVjdCAqcGlkdHNrLAorc3RhdGljIGludCBmaWxsX3BpZChwaWRfdCBwaWQsIHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrLAogCQlzdHJ1Y3QgdGFza3N0YXRzICpzdGF0cykKIHsKIAlpbnQgcmMgPSAwOwotCXN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrID0gcGlkdHNrOwogCi0JaWYgKCFwaWR0c2spIHsKLQkJcmVhZF9sb2NrKCZ0YXNrbGlzdF9sb2NrKTsKKwlpZiAoIXRzaykgeworCQlyY3VfcmVhZF9sb2NrKCk7CiAJCXRzayA9IGZpbmRfdGFza19ieV9waWQocGlkKTsKLQkJaWYgKCF0c2spIHsKLQkJCXJlYWRfdW5sb2NrKCZ0YXNrbGlzdF9sb2NrKTsKKwkJaWYgKHRzaykKKwkJCWdldF90YXNrX3N0cnVjdCh0c2spOworCQlyY3VfcmVhZF91bmxvY2soKTsKKwkJaWYgKCF0c2spCiAJCQlyZXR1cm4gLUVTUkNIOwotCQl9Ci0JCWdldF90YXNrX3N0cnVjdCh0c2spOwotCQlyZWFkX3VubG9jaygmdGFza2xpc3RfbG9jayk7CiAJfSBlbHNlCiAJCWdldF90YXNrX3N0cnVjdCh0c2spOwogCkBAIC0yMTQsMzkgKzIxMywzMCBAQAogCiB9CiAKLXN0YXRpYyBpbnQgZmlsbF90Z2lkKHBpZF90IHRnaWQsIHN0cnVjdCB0YXNrX3N0cnVjdCAqdGdpZHRzaywKK3N0YXRpYyBpbnQgZmlsbF90Z2lkKHBpZF90IHRnaWQsIHN0cnVjdCB0YXNrX3N0cnVjdCAqZmlyc3QsCiAJCXN0cnVjdCB0YXNrc3RhdHMgKnN0YXRzKQogewotCXN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrLCAqZmlyc3Q7CisJc3RydWN0IHRhc2tfc3RydWN0ICp0c2s7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgcmMgPSAtRVNSQ0g7CiAKIAkvKgogCSAqIEFkZCBhZGRpdGlvbmFsIHN0YXRzIGZyb20gbGl2ZSB0YXNrcyBleGNlcHQgem9tYmllIHRocmVhZCBncm91cAogCSAqIGxlYWRlcnMgd2hvIGFyZSBhbHJlYWR5IGNvdW50ZWQgd2l0aCB0aGUgZGVhZCB0YXNrcwogCSAqLwotCWZpcnN0ID0gdGdpZHRzazsKLQlpZiAoIWZpcnN0KSB7Ci0JCXJlYWRfbG9jaygmdGFza2xpc3RfbG9jayk7CisJcmN1X3JlYWRfbG9jaygpOworCWlmICghZmlyc3QpCiAJCWZpcnN0ID0gZmluZF90YXNrX2J5X3BpZCh0Z2lkKTsKLQkJaWYgKCFmaXJzdCkgewotCQkJcmVhZF91bmxvY2soJnRhc2tsaXN0X2xvY2spOwotCQkJcmV0dXJuIC1FU1JDSDsKLQkJfQotCQlnZXRfdGFza19zdHJ1Y3QoZmlyc3QpOwotCQlyZWFkX3VubG9jaygmdGFza2xpc3RfbG9jayk7Ci0JfSBlbHNlCi0JCWdldF90YXNrX3N0cnVjdChmaXJzdCk7CiAKLQkvKiBTdGFydCB3aXRoIHN0YXRzIGZyb20gZGVhZCB0YXNrcyAqLwotCXNwaW5fbG9ja19pcnFzYXZlKCZmaXJzdC0+c2lnbmFsLT5zdGF0c19sb2NrLCBmbGFncyk7CisJaWYgKCFmaXJzdCB8fCAhbG9ja190YXNrX3NpZ2hhbmQoZmlyc3QsICZmbGFncykpCisJCWdvdG8gb3V0OworCiAJaWYgKGZpcnN0LT5zaWduYWwtPnN0YXRzKQogCQltZW1jcHkoc3RhdHMsIGZpcnN0LT5zaWduYWwtPnN0YXRzLCBzaXplb2YoKnN0YXRzKSk7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZmlyc3QtPnNpZ25hbC0+c3RhdHNfbG9jaywgZmxhZ3MpOwogCiAJdHNrID0gZmlyc3Q7Ci0JcmVhZF9sb2NrKCZ0YXNrbGlzdF9sb2NrKTsKIAlkbyB7Ci0JCWlmICh0c2stPmV4aXRfc3RhdGUgPT0gRVhJVF9aT01CSUUgJiYgdGhyZWFkX2dyb3VwX2xlYWRlcih0c2spKQorCQlpZiAodHNrLT5leGl0X3N0YXRlKQogCQkJY29udGludWU7CiAJCS8qCiAJCSAqIEFjY291bnRpbmcgc3Vic3lzdGVtIGNhbiBjYWxsIGl0cyBmdW5jdGlvbnMgaGVyZSB0bwpAQCAtMjU3LDE1ICsyNDcsMTggQEAKIAkJZGVsYXlhY2N0X2FkZF90c2soc3RhdHMsIHRzayk7CiAKIAl9IHdoaWxlX2VhY2hfdGhyZWFkKGZpcnN0LCB0c2spOwotCXJlYWRfdW5sb2NrKCZ0YXNrbGlzdF9sb2NrKTsKLQlzdGF0cy0+dmVyc2lvbiA9IFRBU0tTVEFUU19WRVJTSU9OOwogCisJdW5sb2NrX3Rhc2tfc2lnaGFuZChmaXJzdCwgJmZsYWdzKTsKKwlyYyA9IDA7CitvdXQ6CisJcmN1X3JlYWRfdW5sb2NrKCk7CisKKwlzdGF0cy0+dmVyc2lvbiA9IFRBU0tTVEFUU19WRVJTSU9OOwogCS8qCiAJICogQWNjb3VudGluZyBzdWJzeXRlbXMgY2FuIGFsc28gYWRkIGNhbGxzIGhlcmUgdG8gbW9kaWZ5CiAJICogZmllbGRzIG9mIHRhc2tzdGF0cy4KIAkgKi8KLQotCXJldHVybiAwOworCXJldHVybiByYzsKIH0KIAogCkBAIC0yNzMsNyArMjY2LDcgQEAKIHsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJnRzay0+c2lnbmFsLT5zdGF0c19sb2NrLCBmbGFncyk7CisJc3Bpbl9sb2NrX2lycXNhdmUoJnRzay0+c2lnaGFuZC0+c2lnbG9jaywgZmxhZ3MpOwogCWlmICghdHNrLT5zaWduYWwtPnN0YXRzKQogCQlnb3RvIHJldDsKIApAQCAtMjg1LDcgKzI3OCw3IEBACiAJICovCiAJZGVsYXlhY2N0X2FkZF90c2sodHNrLT5zaWduYWwtPnN0YXRzLCB0c2spOwogcmV0OgotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnRzay0+c2lnbmFsLT5zdGF0c19sb2NrLCBmbGFncyk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdHNrLT5zaWdoYW5kLT5zaWdsb2NrLCBmbGFncyk7CiAJcmV0dXJuOwogfQogCkBAIC00MTksNyArNDEyLDcgQEAKIAlyZXR1cm4gc2VuZF9yZXBseShyZXBfc2tiLCBpbmZvLT5zbmRfcGlkKTsKIAogbmxhX3B1dF9mYWlsdXJlOgotCXJldHVybiBnZW5sbXNnX2NhbmNlbChyZXBfc2tiLCByZXBseSk7CisJcmMgPSBnZW5sbXNnX2NhbmNlbChyZXBfc2tiLCByZXBseSk7CiBlcnI6CiAJbmxtc2dfZnJlZShyZXBfc2tiKTsKIAlyZXR1cm4gcmM7CkBAIC00NjEsMjQgKzQ1NCwyNiBAQAogCXNpemVfdCBzaXplOwogCWludCBpc190aHJlYWRfZ3JvdXA7CiAJc3RydWN0IG5sYXR0ciAqbmE7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKIAotCWlmICghZmFtaWx5X3JlZ2lzdGVyZWQgfHwgIXRpZHN0YXRzKQorCWlmICghZmFtaWx5X3JlZ2lzdGVyZWQpCiAJCXJldHVybjsKIAotCXNwaW5fbG9ja19pcnFzYXZlKCZ0c2stPnNpZ25hbC0+c3RhdHNfbG9jaywgZmxhZ3MpOwotCWlzX3RocmVhZF9ncm91cCA9IHRzay0+c2lnbmFsLT5zdGF0cyA/IDEgOiAwOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnRzay0+c2lnbmFsLT5zdGF0c19sb2NrLCBmbGFncyk7Ci0KLQlyYyA9IDA7CiAJLyoKIAkgKiBTaXplIGluY2x1ZGVzIHNwYWNlIGZvciBuZXN0ZWQgYXR0cmlidXRlcwogCSAqLwogCXNpemUgPSBubGFfdG90YWxfc2l6ZShzaXplb2YodTMyKSkgKwogCQlubGFfdG90YWxfc2l6ZShzaXplb2Yoc3RydWN0IHRhc2tzdGF0cykpICsgbmxhX3RvdGFsX3NpemUoMCk7CiAKLQlpZiAoaXNfdGhyZWFkX2dyb3VwKQotCQlzaXplID0gMiAqIHNpemU7CS8qIFBJRCArIFNUQVRTICsgVEdJRCArIFNUQVRTICovCisJaXNfdGhyZWFkX2dyb3VwID0gKHRzay0+c2lnbmFsLT5zdGF0cyAhPSBOVUxMKTsKKwlpZiAoaXNfdGhyZWFkX2dyb3VwKSB7CisJCS8qIFBJRCArIFNUQVRTICsgVEdJRCArIFNUQVRTICovCisJCXNpemUgPSAyICogc2l6ZTsKKwkJLyogZmlsbCB0aGUgdHNrLT5zaWduYWwtPnN0YXRzIHN0cnVjdHVyZSAqLworCQlmaWxsX3RnaWRfZXhpdCh0c2spOworCX0KKworCWlmICghdGlkc3RhdHMpCisJCXJldHVybjsKIAogCXJjID0gcHJlcGFyZV9yZXBseShOVUxMLCBUQVNLU1RBVFNfQ01EX05FVywgJnJlcF9za2IsICZyZXBseSwgc2l6ZSk7CiAJaWYgKHJjIDwgMCkKQEAgLTQ5OCwxMSArNDkzLDggQEAKIAkJZ290byBzZW5kOwogCiAJLyoKLQkgKiB0c2sgaGFzL2hhZCBhIHRocmVhZCBncm91cCBzbyBmaWxsIHRoZSB0c2stPnNpZ25hbC0+c3RhdHMgc3RydWN0dXJlCiAJICogRG9lc24ndCBtYXR0ZXIgaWYgdHNrIGlzIHRoZSBsZWFkZXIgb3IgdGhlIGxhc3QgZ3JvdXAgbWVtYmVyIGxlYXZpbmcKIAkgKi8KLQotCWZpbGxfdGdpZF9leGl0KHRzayk7CiAJaWYgKCFncm91cF9kZWFkKQogCQlnb3RvIHNlbmQ7CiAKQEAgLTUxOSw3ICs1MTEsNiBAQAogCiBubGFfcHV0X2ZhaWx1cmU6CiAJZ2VubG1zZ19jYW5jZWwocmVwX3NrYiwgcmVwbHkpOwotCWdvdG8gcmV0OwogZXJyX3NrYjoKIAlubG1zZ19mcmVlKHJlcF9za2IpOwogcmV0OgpkaWZmIC0tZ2l0IGEva2VybmVsL3RpbWUvamlmZmllcy5jIGIva2VybmVsL3RpbWUvamlmZmllcy5jCmluZGV4IDEyNmJiMzAuLmE5OWIyYTYgMTAwNjQ0Ci0tLSBhL2tlcm5lbC90aW1lL2ppZmZpZXMuYworKysgYi9rZXJuZWwvdGltZS9qaWZmaWVzLmMKQEAgLTU3LDcgKzU3LDcgQEAKIAogc3RydWN0IGNsb2Nrc291cmNlIGNsb2Nrc291cmNlX2ppZmZpZXMgPSB7CiAJLm5hbWUJCT0gImppZmZpZXMiLAotCS5yYXRpbmcJCT0gMCwgLyogbG93ZXN0IHJhdGluZyovCisJLnJhdGluZwkJPSAxLCAvKiBsb3dlc3QgdmFsaWQgcmF0aW5nKi8KIAkucmVhZAkJPSBqaWZmaWVzX3JlYWQsCiAJLm1hc2sJCT0gMHhmZmZmZmZmZiwgLyozMmJpdHMqLwogCS5tdWx0CQk9IE5TRUNfUEVSX0pJRkZZIDw8IEpJRkZJRVNfU0hJRlQsIC8qIGRldGFpbHMgYWJvdmUgKi8KZGlmZiAtLWdpdCBhL2tlcm5lbC90aW1lL250cC5jIGIva2VybmVsL3RpbWUvbnRwLmMKaW5kZXggNDcxOTVmYS4uM2FmZWFhMyAxMDA2NDQKLS0tIGEva2VybmVsL3RpbWUvbnRwLmMKKysrIGIva2VybmVsL3RpbWUvbnRwLmMKQEAgLTE2MSw5ICsxNjEsOSBAQAogCQkJdGltZV9hZGp1c3QgKz0gTUFYX1RJQ0tBREo7CiAJCQl0aWNrX2xlbmd0aCAtPSBNQVhfVElDS0FESl9TQ0FMRUQ7CiAJCX0gZWxzZSB7Ci0JCQl0aW1lX2FkanVzdCA9IDA7CiAJCQl0aWNrX2xlbmd0aCArPSAoczY0KSh0aW1lX2FkanVzdCAqIE5TRUNfUEVSX1VTRUMgLwogCQkJCQkgICAgIEhaKSA8PCBUSUNLX0xFTkdUSF9TSElGVDsKKwkJCXRpbWVfYWRqdXN0ID0gMDsKIAkJfQogCX0KIH0KZGlmZiAtLWdpdCBhL2tlcm5lbC90c2FjY3QuYyBiL2tlcm5lbC90c2FjY3QuYwppbmRleCBkYjQ0MzIyLi45NmY3NzAxIDEwMDY0NAotLS0gYS9rZXJuZWwvdHNhY2N0LmMKKysrIGIva2VybmVsL3RzYWNjdC5jCkBAIC0zNiw3ICszNiw3IEBACiAKIAkvKiBjYWxjdWxhdGUgdGFzayBlbGFwc2VkIHRpbWUgaW4gdGltZXNwZWMgKi8KIAlkb19wb3NpeF9jbG9ja19tb25vdG9uaWNfZ2V0dGltZSgmdXB0aW1lKTsKLQl0cyA9IHRpbWVzcGVjX3N1Yih1cHRpbWUsIGN1cnJlbnQtPmdyb3VwX2xlYWRlci0+c3RhcnRfdGltZSk7CisJdHMgPSB0aW1lc3BlY19zdWIodXB0aW1lLCB0c2stPnN0YXJ0X3RpbWUpOwogCS8qIHJlYmFzZSBlbGFwc2VkIHRpbWUgdG8gdXNlYyAqLwogCWFjX2V0aW1lID0gdGltZXNwZWNfdG9fbnMoJnRzKTsKIAlkb19kaXYoYWNfZXRpbWUsIE5TRUNfUEVSX1VTRUMpOwpAQCAtNTgsNyArNTgsMTAgQEAKIAlzdGF0cy0+YWNfdWlkCSA9IHRzay0+dWlkOwogCXN0YXRzLT5hY19naWQJID0gdHNrLT5naWQ7CiAJc3RhdHMtPmFjX3BpZAkgPSB0c2stPnBpZDsKLQlzdGF0cy0+YWNfcHBpZAkgPSAodHNrLT5wYXJlbnQpID8gdHNrLT5wYXJlbnQtPnBpZCA6IDA7CisJcmN1X3JlYWRfbG9jaygpOworCXN0YXRzLT5hY19wcGlkCSA9IHBpZF9hbGl2ZSh0c2spID8KKwkJCQlyY3VfZGVyZWZlcmVuY2UodHNrLT5yZWFsX3BhcmVudCktPnRnaWQgOiAwOworCXJjdV9yZWFkX3VubG9jaygpOwogCXN0YXRzLT5hY191dGltZQkgPSBjcHV0aW1lX3RvX21zZWNzKHRzay0+dXRpbWUpICogVVNFQ19QRVJfTVNFQzsKIAlzdGF0cy0+YWNfc3RpbWUJID0gY3B1dGltZV90b19tc2Vjcyh0c2stPnN0aW1lKSAqIFVTRUNfUEVSX01TRUM7CiAJc3RhdHMtPmFjX21pbmZsdCA9IHRzay0+bWluX2ZsdDsKQEAgLTc3LDEzICs4MCwxNyBAQAogICovCiB2b2lkIHhhY2N0X2FkZF90c2soc3RydWN0IHRhc2tzdGF0cyAqc3RhdHMsIHN0cnVjdCB0YXNrX3N0cnVjdCAqcCkKIHsKKwlzdHJ1Y3QgbW1fc3RydWN0ICptbTsKKwogCS8qIGNvbnZlcnQgcGFnZXMtamlmZmllcyB0byBNYnl0ZS11c2VjICovCiAJc3RhdHMtPmNvcmVtZW0gPSBqaWZmaWVzX3RvX3VzZWNzKHAtPmFjY3RfcnNzX21lbTEpICogUEFHRV9TSVpFIC8gTUI7CiAJc3RhdHMtPnZpcnRtZW0gPSBqaWZmaWVzX3RvX3VzZWNzKHAtPmFjY3Rfdm1fbWVtMSkgKiBQQUdFX1NJWkUgLyBNQjsKLQlpZiAocC0+bW0pIHsKKwltbSA9IGdldF90YXNrX21tKHApOworCWlmIChtbSkgewogCQkvKiBhZGp1c3QgdG8gS0IgdW5pdCAqLwotCQlzdGF0cy0+aGl3YXRlcl9yc3MgICA9IHAtPm1tLT5oaXdhdGVyX3JzcyAqIFBBR0VfU0laRSAvIEtCOwotCQlzdGF0cy0+aGl3YXRlcl92bSAgICA9IHAtPm1tLT5oaXdhdGVyX3ZtICogUEFHRV9TSVpFIC8gS0I7CisJCXN0YXRzLT5oaXdhdGVyX3JzcyAgID0gbW0tPmhpd2F0ZXJfcnNzICogUEFHRV9TSVpFIC8gS0I7CisJCXN0YXRzLT5oaXdhdGVyX3ZtICAgID0gbW0tPmhpd2F0ZXJfdm0gKiBQQUdFX1NJWkUgLyBLQjsKKwkJbW1wdXQobW0pOwogCX0KIAlzdGF0cy0+cmVhZF9jaGFyCT0gcC0+cmNoYXI7CiAJc3RhdHMtPndyaXRlX2NoYXIJPSBwLT53Y2hhcjsKZGlmZiAtLWdpdCBhL2tlcm5lbC91bndpbmQuYyBiL2tlcm5lbC91bndpbmQuYwppbmRleCAyZTIzNjg2Li5mN2U1MGQxIDEwMDY0NAotLS0gYS9rZXJuZWwvdW53aW5kLmMKKysrIGIva2VybmVsL3Vud2luZC5jCkBAIC0xMSwxMyArMTEsMTUgQEAKIAogI2luY2x1ZGUgPGxpbnV4L3Vud2luZC5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvYm9vdG1lbS5oPgorI2luY2x1ZGUgPGxpbnV4L3NvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9zdG9wX21hY2hpbmUuaD4KICNpbmNsdWRlIDxhc20vc2VjdGlvbnMuaD4KICNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgogI2luY2x1ZGUgPGFzbS91bmFsaWduZWQuaD4KIAogZXh0ZXJuIGNoYXIgX19zdGFydF91bndpbmRbXSwgX19lbmRfdW53aW5kW107CitleHRlcm4gY29uc3QgdTggX19zdGFydF91bndpbmRfaGRyW10sIF9fZW5kX3Vud2luZF9oZHJbXTsKIAogI2RlZmluZSBNQVhfU1RBQ0tfREVQVEggOAogCkBAIC0xMDAsNiArMTAyLDggQEAKIAl9IGNvcmUsIGluaXQ7CiAJY29uc3Qgdm9pZCAqYWRkcmVzczsKIAl1bnNpZ25lZCBsb25nIHNpemU7CisJY29uc3QgdW5zaWduZWQgY2hhciAqaGVhZGVyOworCXVuc2lnbmVkIGxvbmcgaGRyc3o7CiAJc3RydWN0IHVud2luZF90YWJsZSAqbGluazsKIAljb25zdCBjaGFyICpuYW1lOwogfSByb290X3RhYmxlOwpAQCAtMTQ1LDYgKzE0OSwxMCBAQAogCXJldHVybiB0YWJsZTsKIH0KIAorc3RhdGljIHVuc2lnbmVkIGxvbmcgcmVhZF9wb2ludGVyKGNvbnN0IHU4ICoqcExvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkICplbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2lnbmVkIHB0clR5cGUpOworCiBzdGF0aWMgdm9pZCBpbml0X3Vud2luZF90YWJsZShzdHJ1Y3QgdW53aW5kX3RhYmxlICp0YWJsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKm5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkICpjb3JlX3N0YXJ0LApAQCAtMTUyLDE0ICsxNjAsMzAgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQgKmluaXRfc3RhcnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nIGluaXRfc2l6ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQgKnRhYmxlX3N0YXJ0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyB0YWJsZV9zaXplKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyB0YWJsZV9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdTggKmhlYWRlcl9zdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgaGVhZGVyX3NpemUpCiB7CisJY29uc3QgdTggKnB0ciA9IGhlYWRlcl9zdGFydCArIDQ7CisJY29uc3QgdTggKmVuZCA9IGhlYWRlcl9zdGFydCArIGhlYWRlcl9zaXplOworCiAJdGFibGUtPmNvcmUucGMgPSAodW5zaWduZWQgbG9uZyljb3JlX3N0YXJ0OwogCXRhYmxlLT5jb3JlLnJhbmdlID0gY29yZV9zaXplOwogCXRhYmxlLT5pbml0LnBjID0gKHVuc2lnbmVkIGxvbmcpaW5pdF9zdGFydDsKIAl0YWJsZS0+aW5pdC5yYW5nZSA9IGluaXRfc2l6ZTsKIAl0YWJsZS0+YWRkcmVzcyA9IHRhYmxlX3N0YXJ0OwogCXRhYmxlLT5zaXplID0gdGFibGVfc2l6ZTsKKwkvKiBTZWUgaWYgdGhlIGxpbmtlciBwcm92aWRlZCB0YWJsZSBsb29rcyB2YWxpZC4gKi8KKwlpZiAoaGVhZGVyX3NpemUgPD0gNAorCSAgICB8fCBoZWFkZXJfc3RhcnRbMF0gIT0gMQorCSAgICB8fCAodm9pZCAqKXJlYWRfcG9pbnRlcigmcHRyLCBlbmQsIGhlYWRlcl9zdGFydFsxXSkgIT0gdGFibGVfc3RhcnQKKwkgICAgfHwgaGVhZGVyX3N0YXJ0WzJdID09IERXX0VIX1BFX29taXQKKwkgICAgfHwgcmVhZF9wb2ludGVyKCZwdHIsIGVuZCwgaGVhZGVyX3N0YXJ0WzJdKSA8PSAwCisJICAgIHx8IGhlYWRlcl9zdGFydFszXSA9PSBEV19FSF9QRV9vbWl0KQorCQloZWFkZXJfc3RhcnQgPSBOVUxMOworCXRhYmxlLT5oZHJzeiA9IGhlYWRlcl9zaXplOworCXNtcF93bWIoKTsKKwl0YWJsZS0+aGVhZGVyID0gaGVhZGVyX3N0YXJ0OwogCXRhYmxlLT5saW5rID0gTlVMTDsKIAl0YWJsZS0+bmFtZSA9IG5hbWU7CiB9CkBAIC0xNjksNyArMTkzLDE0MyBAQAogCWluaXRfdW53aW5kX3RhYmxlKCZyb290X3RhYmxlLCAia2VybmVsIiwKIAkgICAgICAgICAgICAgICAgICBfdGV4dCwgX2VuZCAtIF90ZXh0LAogCSAgICAgICAgICAgICAgICAgIE5VTEwsIDAsCi0JICAgICAgICAgICAgICAgICAgX19zdGFydF91bndpbmQsIF9fZW5kX3Vud2luZCAtIF9fc3RhcnRfdW53aW5kKTsKKwkgICAgICAgICAgICAgICAgICBfX3N0YXJ0X3Vud2luZCwgX19lbmRfdW53aW5kIC0gX19zdGFydF91bndpbmQsCisJICAgICAgICAgICAgICAgICAgX19zdGFydF91bndpbmRfaGRyLCBfX2VuZF91bndpbmRfaGRyIC0gX19zdGFydF91bndpbmRfaGRyKTsKK30KKworc3RhdGljIGNvbnN0IHUzMiBiYWRfY2llLCBub3RfZmRlOworc3RhdGljIGNvbnN0IHUzMiAqY2llX2Zvcl9mZGUoY29uc3QgdTMyICpmZGUsIGNvbnN0IHN0cnVjdCB1bndpbmRfdGFibGUgKik7CitzdGF0aWMgc2lnbmVkIGZkZV9wb2ludGVyX3R5cGUoY29uc3QgdTMyICpjaWUpOworCitzdHJ1Y3QgZWhfZnJhbWVfaGRyX3RhYmxlX2VudHJ5IHsKKwl1bnNpZ25lZCBsb25nIHN0YXJ0LCBmZGU7Cit9OworCitzdGF0aWMgaW50IGNtcF9laF9mcmFtZV9oZHJfdGFibGVfZW50cmllcyhjb25zdCB2b2lkICpwMSwgY29uc3Qgdm9pZCAqcDIpCit7CisJY29uc3Qgc3RydWN0IGVoX2ZyYW1lX2hkcl90YWJsZV9lbnRyeSAqZTEgPSBwMTsKKwljb25zdCBzdHJ1Y3QgZWhfZnJhbWVfaGRyX3RhYmxlX2VudHJ5ICplMiA9IHAyOworCisJcmV0dXJuIChlMS0+c3RhcnQgPiBlMi0+c3RhcnQpIC0gKGUxLT5zdGFydCA8IGUyLT5zdGFydCk7Cit9CisKK3N0YXRpYyB2b2lkIHN3YXBfZWhfZnJhbWVfaGRyX3RhYmxlX2VudHJpZXModm9pZCAqcDEsIHZvaWQgKnAyLCBpbnQgc2l6ZSkKK3sKKwlzdHJ1Y3QgZWhfZnJhbWVfaGRyX3RhYmxlX2VudHJ5ICplMSA9IHAxOworCXN0cnVjdCBlaF9mcmFtZV9oZHJfdGFibGVfZW50cnkgKmUyID0gcDI7CisJdW5zaWduZWQgbG9uZyB2OworCisJdiA9IGUxLT5zdGFydDsKKwllMS0+c3RhcnQgPSBlMi0+c3RhcnQ7CisJZTItPnN0YXJ0ID0gdjsKKwl2ID0gZTEtPmZkZTsKKwllMS0+ZmRlID0gZTItPmZkZTsKKwllMi0+ZmRlID0gdjsKK30KKworc3RhdGljIHZvaWQgX19pbml0IHNldHVwX3Vud2luZF90YWJsZShzdHJ1Y3QgdW53aW5kX3RhYmxlICp0YWJsZSwKKwkJCQkJdm9pZCAqKCphbGxvYykodW5zaWduZWQgbG9uZykpCit7CisJY29uc3QgdTggKnB0cjsKKwl1bnNpZ25lZCBsb25nIHRhYmxlU2l6ZSA9IHRhYmxlLT5zaXplLCBoZHJTaXplOworCXVuc2lnbmVkIG47CisJY29uc3QgdTMyICpmZGU7CisJc3RydWN0IHsKKwkJdTggdmVyc2lvbjsKKwkJdTggZWhfZnJhbWVfcHRyX2VuYzsKKwkJdTggZmRlX2NvdW50X2VuYzsKKwkJdTggdGFibGVfZW5jOworCQl1bnNpZ25lZCBsb25nIGVoX2ZyYW1lX3B0cjsKKwkJdW5zaWduZWQgaW50IGZkZV9jb3VudDsKKwkJc3RydWN0IGVoX2ZyYW1lX2hkcl90YWJsZV9lbnRyeSB0YWJsZVtdOworCX0gX19hdHRyaWJ1dGVfXygoX19wYWNrZWRfXykpICpoZWFkZXI7CisKKwlpZiAodGFibGUtPmhlYWRlcikKKwkJcmV0dXJuOworCisJaWYgKHRhYmxlLT5oZHJzeikKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiLmVoX2ZyYW1lX2hkciBmb3IgJyVzJyBwcmVzZW50IGJ1dCB1bnVzYWJsZVxuIiwKKwkJICAgICAgIHRhYmxlLT5uYW1lKTsKKworCWlmICh0YWJsZVNpemUgJiAoc2l6ZW9mKCpmZGUpIC0gMSkpCisJCXJldHVybjsKKworCWZvciAoZmRlID0gdGFibGUtPmFkZHJlc3MsIG4gPSAwOworCSAgICAgdGFibGVTaXplID4gc2l6ZW9mKCpmZGUpICYmIHRhYmxlU2l6ZSAtIHNpemVvZigqZmRlKSA+PSAqZmRlOworCSAgICAgdGFibGVTaXplIC09IHNpemVvZigqZmRlKSArICpmZGUsIGZkZSArPSAxICsgKmZkZSAvIHNpemVvZigqZmRlKSkgeworCQljb25zdCB1MzIgKmNpZSA9IGNpZV9mb3JfZmRlKGZkZSwgdGFibGUpOworCQlzaWduZWQgcHRyVHlwZTsKKworCQlpZiAoY2llID09ICZub3RfZmRlKQorCQkJY29udGludWU7CisJCWlmIChjaWUgPT0gTlVMTAorCQkgICAgfHwgY2llID09ICZiYWRfY2llCisJCSAgICB8fCAocHRyVHlwZSA9IGZkZV9wb2ludGVyX3R5cGUoY2llKSkgPCAwKQorCQkJcmV0dXJuOworCQlwdHIgPSAoY29uc3QgdTggKikoZmRlICsgMik7CisJCWlmICghcmVhZF9wb2ludGVyKCZwdHIsCisJCSAgICAgICAgICAgICAgICAgIChjb25zdCB1OCAqKShmZGUgKyAxKSArICpmZGUsCisJCSAgICAgICAgICAgICAgICAgIHB0clR5cGUpKQorCQkJcmV0dXJuOworCQkrK247CisJfQorCisJaWYgKHRhYmxlU2l6ZSB8fCAhbikKKwkJcmV0dXJuOworCisJaGRyU2l6ZSA9IDQgKyBzaXplb2YodW5zaWduZWQgbG9uZykgKyBzaXplb2YodW5zaWduZWQgaW50KQorCSAgICAgICAgKyAyICogbiAqIHNpemVvZih1bnNpZ25lZCBsb25nKTsKKwloZWFkZXIgPSBhbGxvYyhoZHJTaXplKTsKKwlpZiAoIWhlYWRlcikKKwkJcmV0dXJuOworCWhlYWRlci0+dmVyc2lvbiAgICAgICAgICA9IDE7CisJaGVhZGVyLT5laF9mcmFtZV9wdHJfZW5jID0gRFdfRUhfUEVfYWJzfERXX0VIX1BFX25hdGl2ZTsKKwloZWFkZXItPmZkZV9jb3VudF9lbmMgICAgPSBEV19FSF9QRV9hYnN8RFdfRUhfUEVfZGF0YTQ7CisJaGVhZGVyLT50YWJsZV9lbmMgICAgICAgID0gRFdfRUhfUEVfYWJzfERXX0VIX1BFX25hdGl2ZTsKKwlwdXRfdW5hbGlnbmVkKCh1bnNpZ25lZCBsb25nKXRhYmxlLT5hZGRyZXNzLCAmaGVhZGVyLT5laF9mcmFtZV9wdHIpOworCUJVSUxEX0JVR19PTihvZmZzZXRvZih0eXBlb2YoKmhlYWRlciksIGZkZV9jb3VudCkKKwkgICAgICAgICAgICAgJSBfX2FsaWdub2YodHlwZW9mKGhlYWRlci0+ZmRlX2NvdW50KSkpOworCWhlYWRlci0+ZmRlX2NvdW50ICAgICAgICA9IG47CisKKwlCVUlMRF9CVUdfT04ob2Zmc2V0b2YodHlwZW9mKCpoZWFkZXIpLCB0YWJsZSkKKwkgICAgICAgICAgICAgJSBfX2FsaWdub2YodHlwZW9mKCpoZWFkZXItPnRhYmxlKSkpOworCWZvciAoZmRlID0gdGFibGUtPmFkZHJlc3MsIHRhYmxlU2l6ZSA9IHRhYmxlLT5zaXplLCBuID0gMDsKKwkgICAgIHRhYmxlU2l6ZTsKKwkgICAgIHRhYmxlU2l6ZSAtPSBzaXplb2YoKmZkZSkgKyAqZmRlLCBmZGUgKz0gMSArICpmZGUgLyBzaXplb2YoKmZkZSkpIHsKKwkJY29uc3QgdTMyICpjaWUgPSBmZGUgKyAxIC0gZmRlWzFdIC8gc2l6ZW9mKCpmZGUpOworCisJCWlmICghZmRlWzFdKQorCQkJY29udGludWU7IC8qIHRoaXMgaXMgYSBDSUUgKi8KKwkJcHRyID0gKGNvbnN0IHU4ICopKGZkZSArIDIpOworCQloZWFkZXItPnRhYmxlW25dLnN0YXJ0ID0gcmVhZF9wb2ludGVyKCZwdHIsCisJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IHU4ICopKGZkZSArIDEpICsgKmZkZSwKKwkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmZGVfcG9pbnRlcl90eXBlKGNpZSkpOworCQloZWFkZXItPnRhYmxlW25dLmZkZSA9ICh1bnNpZ25lZCBsb25nKWZkZTsKKwkJKytuOworCX0KKwlXQVJOX09OKG4gIT0gaGVhZGVyLT5mZGVfY291bnQpOworCisJc29ydChoZWFkZXItPnRhYmxlLAorCSAgICAgbiwKKwkgICAgIHNpemVvZigqaGVhZGVyLT50YWJsZSksCisJICAgICBjbXBfZWhfZnJhbWVfaGRyX3RhYmxlX2VudHJpZXMsCisJICAgICBzd2FwX2VoX2ZyYW1lX2hkcl90YWJsZV9lbnRyaWVzKTsKKworCXRhYmxlLT5oZHJzeiA9IGhkclNpemU7CisJc21wX3dtYigpOworCXRhYmxlLT5oZWFkZXIgPSAoY29uc3Qgdm9pZCAqKWhlYWRlcjsKK30KKworc3RhdGljIHZvaWQgKl9faW5pdCBiYWxsb2ModW5zaWduZWQgbG9uZyBzeikKK3sKKwlyZXR1cm4gX19hbGxvY19ib290bWVtX25vcGFuaWMoc3osCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZih1bnNpZ25lZCBpbnQpLAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX3BhKE1BWF9ETUFfQUREUkVTUykpOworfQorCit2b2lkIF9faW5pdCB1bndpbmRfc2V0dXAodm9pZCkKK3sKKwlzZXR1cF91bndpbmRfdGFibGUoJnJvb3RfdGFibGUsIGJhbGxvYyk7CiB9CiAKICNpZmRlZiBDT05GSUdfTU9EVUxFUwpAQCAtMTkzLDcgKzM1Myw4IEBACiAJaW5pdF91bndpbmRfdGFibGUodGFibGUsIG1vZHVsZS0+bmFtZSwKIAkgICAgICAgICAgICAgICAgICBtb2R1bGUtPm1vZHVsZV9jb3JlLCBtb2R1bGUtPmNvcmVfc2l6ZSwKIAkgICAgICAgICAgICAgICAgICBtb2R1bGUtPm1vZHVsZV9pbml0LCBtb2R1bGUtPmluaXRfc2l6ZSwKLQkgICAgICAgICAgICAgICAgICB0YWJsZV9zdGFydCwgdGFibGVfc2l6ZSk7CisJICAgICAgICAgICAgICAgICAgdGFibGVfc3RhcnQsIHRhYmxlX3NpemUsCisJICAgICAgICAgICAgICAgICAgTlVMTCwgMCk7CiAKIAlpZiAobGFzdF90YWJsZSkKIAkJbGFzdF90YWJsZS0+bGluayA9IHRhYmxlOwpAQCAtMzAzLDYgKzQ2NCwyNiBAQAogCXJldHVybiB2YWx1ZTsKIH0KIAorc3RhdGljIGNvbnN0IHUzMiAqY2llX2Zvcl9mZGUoY29uc3QgdTMyICpmZGUsIGNvbnN0IHN0cnVjdCB1bndpbmRfdGFibGUgKnRhYmxlKQoreworCWNvbnN0IHUzMiAqY2llOworCisJaWYgKCEqZmRlIHx8ICgqZmRlICYgKHNpemVvZigqZmRlKSAtIDEpKSkKKwkJcmV0dXJuICZiYWRfY2llOworCWlmICghZmRlWzFdKQorCQlyZXR1cm4gJm5vdF9mZGU7IC8qIHRoaXMgaXMgYSBDSUUgKi8KKwlpZiAoKGZkZVsxXSAmIChzaXplb2YoKmZkZSkgLSAxKSkKKwkgICAgfHwgZmRlWzFdID4gKHVuc2lnbmVkIGxvbmcpKGZkZSArIDEpIC0gKHVuc2lnbmVkIGxvbmcpdGFibGUtPmFkZHJlc3MpCisJCXJldHVybiBOVUxMOyAvKiB0aGlzIGlzIG5vdCBhIHZhbGlkIEZERSAqLworCWNpZSA9IGZkZSArIDEgLSBmZGVbMV0gLyBzaXplb2YoKmZkZSk7CisJaWYgKCpjaWUgPD0gc2l6ZW9mKCpjaWUpICsgNAorCSAgICB8fCAqY2llID49IGZkZVsxXSAtIHNpemVvZigqZmRlKQorCSAgICB8fCAoKmNpZSAmIChzaXplb2YoKmNpZSkgLSAxKSkKKwkgICAgfHwgY2llWzFdKQorCQlyZXR1cm4gTlVMTDsgLyogdGhpcyBpcyBub3QgYSAodmFsaWQpIENJRSAqLworCXJldHVybiBjaWU7Cit9CisKIHN0YXRpYyB1bnNpZ25lZCBsb25nIHJlYWRfcG9pbnRlcihjb25zdCB1OCAqKnBMb2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCAqZW5kLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpZ25lZCBwdHJUeXBlKQpAQCAtNjEwLDQ5ICs3OTEsMTA4IEBACiAJdW5zaWduZWQgaTsKIAlzaWduZWQgcHRyVHlwZSA9IC0xOwogCXVsZWIxMjhfdCByZXRBZGRyUmVnID0gMDsKLQlzdHJ1Y3QgdW53aW5kX3RhYmxlICp0YWJsZTsKKwljb25zdCBzdHJ1Y3QgdW53aW5kX3RhYmxlICp0YWJsZTsKIAlzdHJ1Y3QgdW53aW5kX3N0YXRlIHN0YXRlOwogCiAJaWYgKFVOV19QQyhmcmFtZSkgPT0gMCkKIAkJcmV0dXJuIC1FSU5WQUw7CiAJaWYgKCh0YWJsZSA9IGZpbmRfdGFibGUocGMpKSAhPSBOVUxMCiAJICAgICYmICEodGFibGUtPnNpemUgJiAoc2l6ZW9mKCpmZGUpIC0gMSkpKSB7Ci0JCXVuc2lnbmVkIGxvbmcgdGFibGVTaXplID0gdGFibGUtPnNpemU7CisJCWNvbnN0IHU4ICpoZHIgPSB0YWJsZS0+aGVhZGVyOworCQl1bnNpZ25lZCBsb25nIHRhYmxlU2l6ZTsKIAotCQlmb3IgKGZkZSA9IHRhYmxlLT5hZGRyZXNzOwotCQkgICAgIHRhYmxlU2l6ZSA+IHNpemVvZigqZmRlKSAmJiB0YWJsZVNpemUgLSBzaXplb2YoKmZkZSkgPj0gKmZkZTsKLQkJICAgICB0YWJsZVNpemUgLT0gc2l6ZW9mKCpmZGUpICsgKmZkZSwKLQkJICAgICBmZGUgKz0gMSArICpmZGUgLyBzaXplb2YoKmZkZSkpIHsKLQkJCWlmICghKmZkZSB8fCAoKmZkZSAmIChzaXplb2YoKmZkZSkgLSAxKSkpCi0JCQkJYnJlYWs7Ci0JCQlpZiAoIWZkZVsxXSkKLQkJCQljb250aW51ZTsgLyogdGhpcyBpcyBhIENJRSAqLwotCQkJaWYgKChmZGVbMV0gJiAoc2l6ZW9mKCpmZGUpIC0gMSkpCi0JCQkgICAgfHwgZmRlWzFdID4gKHVuc2lnbmVkIGxvbmcpKGZkZSArIDEpCi0JCQkgICAgICAgICAgICAgICAgLSAodW5zaWduZWQgbG9uZyl0YWJsZS0+YWRkcmVzcykKLQkJCQljb250aW51ZTsgLyogdGhpcyBpcyBub3QgYSB2YWxpZCBGREUgKi8KLQkJCWNpZSA9IGZkZSArIDEgLSBmZGVbMV0gLyBzaXplb2YoKmZkZSk7Ci0JCQlpZiAoKmNpZSA8PSBzaXplb2YoKmNpZSkgKyA0Ci0JCQkgICAgfHwgKmNpZSA+PSBmZGVbMV0gLSBzaXplb2YoKmZkZSkKLQkJCSAgICB8fCAoKmNpZSAmIChzaXplb2YoKmNpZSkgLSAxKSkKLQkJCSAgICB8fCBjaWVbMV0KLQkJCSAgICB8fCAocHRyVHlwZSA9IGZkZV9wb2ludGVyX3R5cGUoY2llKSkgPCAwKSB7Ci0JCQkJY2llID0gTlVMTDsgLyogdGhpcyBpcyBub3QgYSAodmFsaWQpIENJRSAqLwotCQkJCWNvbnRpbnVlOworCQlzbXBfcm1iKCk7CisJCWlmIChoZHIgJiYgaGRyWzBdID09IDEpIHsKKwkJCXN3aXRjaChoZHJbM10gJiBEV19FSF9QRV9GT1JNKSB7CisJCQljYXNlIERXX0VIX1BFX25hdGl2ZTogdGFibGVTaXplID0gc2l6ZW9mKHVuc2lnbmVkIGxvbmcpOyBicmVhazsKKwkJCWNhc2UgRFdfRUhfUEVfZGF0YTI6IHRhYmxlU2l6ZSA9IDI7IGJyZWFrOworCQkJY2FzZSBEV19FSF9QRV9kYXRhNDogdGFibGVTaXplID0gNDsgYnJlYWs7CisJCQljYXNlIERXX0VIX1BFX2RhdGE4OiB0YWJsZVNpemUgPSA4OyBicmVhazsKKwkJCWRlZmF1bHQ6IHRhYmxlU2l6ZSA9IDA7IGJyZWFrOwogCQkJfQorCQkJcHRyID0gaGRyICsgNDsKKwkJCWVuZCA9IGhkciArIHRhYmxlLT5oZHJzejsKKwkJCWlmICh0YWJsZVNpemUKKwkJCSAgICAmJiByZWFkX3BvaW50ZXIoJnB0ciwgZW5kLCBoZHJbMV0pCisJCQkgICAgICAgPT0gKHVuc2lnbmVkIGxvbmcpdGFibGUtPmFkZHJlc3MKKwkJCSAgICAmJiAoaSA9IHJlYWRfcG9pbnRlcigmcHRyLCBlbmQsIGhkclsyXSkpID4gMAorCQkJICAgICYmIGkgPT0gKGVuZCAtIHB0cikgLyAoMiAqIHRhYmxlU2l6ZSkKKwkJCSAgICAmJiAhKChlbmQgLSBwdHIpICUgKDIgKiB0YWJsZVNpemUpKSkgeworCQkJCWRvIHsKKwkJCQkJY29uc3QgdTggKmN1ciA9IHB0ciArIChpIC8gMikgKiAoMiAqIHRhYmxlU2l6ZSk7CisKKwkJCQkJc3RhcnRMb2MgPSByZWFkX3BvaW50ZXIoJmN1ciwKKwkJCQkJICAgICAgICAgICAgICAgICAgICAgICAgY3VyICsgdGFibGVTaXplLAorCQkJCQkgICAgICAgICAgICAgICAgICAgICAgICBoZHJbM10pOworCQkJCQlpZiAocGMgPCBzdGFydExvYykKKwkJCQkJCWkgLz0gMjsKKwkJCQkJZWxzZSB7CisJCQkJCQlwdHIgPSBjdXIgLSB0YWJsZVNpemU7CisJCQkJCQlpID0gKGkgKyAxKSAvIDI7CisJCQkJCX0KKwkJCQl9IHdoaWxlIChzdGFydExvYyAmJiBpID4gMSk7CisJCQkJaWYgKGkgPT0gMQorCQkJCSAgICAmJiAoc3RhcnRMb2MgPSByZWFkX3BvaW50ZXIoJnB0ciwKKwkJCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0ciArIHRhYmxlU2l6ZSwKKwkJCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhkclszXSkpICE9IDAKKwkJCQkgICAgJiYgcGMgPj0gc3RhcnRMb2MpCisJCQkJCWZkZSA9ICh2b2lkICopcmVhZF9wb2ludGVyKCZwdHIsCisJCQkJCSAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0ciArIHRhYmxlU2l6ZSwKKwkJCQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgaGRyWzNdKTsKKwkJCX0KKwkJfQorCisJCWlmIChmZGUgIT0gTlVMTCkgeworCQkJY2llID0gY2llX2Zvcl9mZGUoZmRlLCB0YWJsZSk7CiAJCQlwdHIgPSAoY29uc3QgdTggKikoZmRlICsgMik7Ci0JCQlzdGFydExvYyA9IHJlYWRfcG9pbnRlcigmcHRyLAotCQkJICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IHU4ICopKGZkZSArIDEpICsgKmZkZSwKLQkJCSAgICAgICAgICAgICAgICAgICAgICAgIHB0clR5cGUpOwotCQkJZW5kTG9jID0gc3RhcnRMb2MKLQkJCSAgICAgICAgICsgcmVhZF9wb2ludGVyKCZwdHIsCi0JCQkgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgdTggKikoZmRlICsgMSkgKyAqZmRlLAotCQkJICAgICAgICAgICAgICAgICAgICAgICAgcHRyVHlwZSAmIERXX0VIX1BFX2luZGlyZWN0Ci0JCQkgICAgICAgICAgICAgICAgICAgICAgICA/IHB0clR5cGUKLQkJCSAgICAgICAgICAgICAgICAgICAgICAgIDogcHRyVHlwZSAmIChEV19FSF9QRV9GT1JNfERXX0VIX1BFX3NpZ25lZCkpOwotCQkJaWYgKHBjID49IHN0YXJ0TG9jICYmIHBjIDwgZW5kTG9jKQotCQkJCWJyZWFrOwotCQkJY2llID0gTlVMTDsKKwkJCWlmKGNpZSAhPSBOVUxMCisJCQkgICAmJiBjaWUgIT0gJmJhZF9jaWUKKwkJCSAgICYmIGNpZSAhPSAmbm90X2ZkZQorCQkJICAgJiYgKHB0clR5cGUgPSBmZGVfcG9pbnRlcl90eXBlKGNpZSkpID49IDAKKwkJCSAgICYmIHJlYWRfcG9pbnRlcigmcHRyLAorCQkJICAgICAgICAgICAgICAgICAgIChjb25zdCB1OCAqKShmZGUgKyAxKSArICpmZGUsCisJCQkgICAgICAgICAgICAgICAgICAgcHRyVHlwZSkgPT0gc3RhcnRMb2MpIHsKKwkJCQlpZiAoIShwdHJUeXBlICYgRFdfRUhfUEVfaW5kaXJlY3QpKQorCQkJCQlwdHJUeXBlICY9IERXX0VIX1BFX0ZPUk18RFdfRUhfUEVfc2lnbmVkOworCQkJCWVuZExvYyA9IHN0YXJ0TG9jCisJCQkJICAgICAgICAgKyByZWFkX3BvaW50ZXIoJnB0ciwKKwkJCQkgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgdTggKikoZmRlICsgMSkgKyAqZmRlLAorCQkJCSAgICAgICAgICAgICAgICAgICAgICAgIHB0clR5cGUpOworCQkJCWlmKHBjID49IGVuZExvYykKKwkJCQkJZmRlID0gTlVMTDsKKwkJCX0gZWxzZQorCQkJCWZkZSA9IE5VTEw7CisJCX0KKwkJaWYgKGZkZSA9PSBOVUxMKSB7CisJCQlmb3IgKGZkZSA9IHRhYmxlLT5hZGRyZXNzLCB0YWJsZVNpemUgPSB0YWJsZS0+c2l6ZTsKKwkJCSAgICAgY2llID0gTlVMTCwgdGFibGVTaXplID4gc2l6ZW9mKCpmZGUpCisJCQkgICAgICYmIHRhYmxlU2l6ZSAtIHNpemVvZigqZmRlKSA+PSAqZmRlOworCQkJICAgICB0YWJsZVNpemUgLT0gc2l6ZW9mKCpmZGUpICsgKmZkZSwKKwkJCSAgICAgZmRlICs9IDEgKyAqZmRlIC8gc2l6ZW9mKCpmZGUpKSB7CisJCQkJY2llID0gY2llX2Zvcl9mZGUoZmRlLCB0YWJsZSk7CisJCQkJaWYgKGNpZSA9PSAmYmFkX2NpZSkgeworCQkJCQljaWUgPSBOVUxMOworCQkJCQlicmVhazsKKwkJCQl9CisJCQkJaWYgKGNpZSA9PSBOVUxMCisJCQkJICAgIHx8IGNpZSA9PSAmbm90X2ZkZQorCQkJCSAgICB8fCAocHRyVHlwZSA9IGZkZV9wb2ludGVyX3R5cGUoY2llKSkgPCAwKQorCQkJCQljb250aW51ZTsKKwkJCQlwdHIgPSAoY29uc3QgdTggKikoZmRlICsgMik7CisJCQkJc3RhcnRMb2MgPSByZWFkX3BvaW50ZXIoJnB0ciwKKwkJCQkgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgdTggKikoZmRlICsgMSkgKyAqZmRlLAorCQkJCSAgICAgICAgICAgICAgICAgICAgICAgIHB0clR5cGUpOworCQkJCWlmICghc3RhcnRMb2MpCisJCQkJCWNvbnRpbnVlOworCQkJCWlmICghKHB0clR5cGUgJiBEV19FSF9QRV9pbmRpcmVjdCkpCisJCQkJCXB0clR5cGUgJj0gRFdfRUhfUEVfRk9STXxEV19FSF9QRV9zaWduZWQ7CisJCQkJZW5kTG9jID0gc3RhcnRMb2MKKwkJCQkgICAgICAgICArIHJlYWRfcG9pbnRlcigmcHRyLAorCQkJCSAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCB1OCAqKShmZGUgKyAxKSArICpmZGUsCisJCQkJICAgICAgICAgICAgICAgICAgICAgICAgcHRyVHlwZSk7CisJCQkJaWYgKHBjID49IHN0YXJ0TG9jICYmIHBjIDwgZW5kTG9jKQorCQkJCQlicmVhazsKKwkJCX0KIAkJfQogCX0KIAlpZiAoY2llICE9IE5VTEwpIHsKZGlmZiAtLWdpdCBhL2tlcm5lbC91c2VyLmMgYi9rZXJuZWwvdXNlci5jCmluZGV4IDY0MDhjMDQuLjIyMGU1ODYgMTAwNjQ0Ci0tLSBhL2tlcm5lbC91c2VyLmMKKysrIGIva2VybmVsL3VzZXIuYwpAQCAtMTg3LDYgKzE4NywxNyBAQAogCWF0b21pY19kZWMoJm9sZF91c2VyLT5wcm9jZXNzZXMpOwogCXN3aXRjaF91aWRfa2V5cmluZyhuZXdfdXNlcik7CiAJY3VycmVudC0+dXNlciA9IG5ld191c2VyOworCisJLyoKKwkgKiBXZSBuZWVkIHRvIHN5bmNocm9uaXplIHdpdGggX19zaWdxdWV1ZV9hbGxvYygpCisJICogZG9pbmcgYSBnZXRfdWlkKHAtPnVzZXIpLi4gSWYgdGhhdCBzYXcgdGhlIG9sZAorCSAqIHVzZXIgdmFsdWUsIHdlIG5lZWQgdG8gd2FpdCB1bnRpbCBpdCBoYXMgZXhpdGVkCisJICogaXRzIGNyaXRpY2FsIHJlZ2lvbiBiZWZvcmUgd2UgY2FuIGZyZWUgdGhlIG9sZAorCSAqIHN0cnVjdHVyZS4KKwkgKi8KKwlzbXBfbWIoKTsKKwlzcGluX3VubG9ja193YWl0KCZjdXJyZW50LT5zaWdoYW5kLT5zaWdsb2NrKTsKKwogCWZyZWVfdWlkKG9sZF91c2VyKTsKIAlzdWlkX2tleXMoY3VycmVudCk7CiB9CmRpZmYgLS1naXQgYS9rZXJuZWwvd29ya3F1ZXVlLmMgYi9rZXJuZWwvd29ya3F1ZXVlLmMKaW5kZXggY2ZjNzM3Yi4uMTdjMmYwMyAxMDA2NDQKLS0tIGEva2VybmVsL3dvcmtxdWV1ZS5jCisrKyBiL2tlcm5lbC93b3JrcXVldWUuYwpAQCAtMjgsNiArMjgsNyBAQAogI2luY2x1ZGUgPGxpbnV4L25vdGlmaWVyLmg+CiAjaW5jbHVkZSA8bGludXgva3RocmVhZC5oPgogI2luY2x1ZGUgPGxpbnV4L2hhcmRpcnEuaD4KKyNpbmNsdWRlIDxsaW51eC9tZW1wb2xpY3kuaD4KIAogLyoKICAqIFRoZSBwZXItQ1BVIHdvcmtxdWV1ZSAoaWYgc2luZ2xlIHRocmVhZCwgd2UgYWx3YXlzIHVzZSB0aGUgZmlyc3QKQEAgLTk4LDcgKzk5LDcgQEAKICAqIEB3cTogd29ya3F1ZXVlIHRvIHVzZQogICogQHdvcms6IHdvcmsgdG8gcXVldWUKICAqCi0gKiBSZXR1cm5zIG5vbi16ZXJvIGlmIGl0IHdhcyBzdWNjZXNzZnVsbHkgYWRkZWQuCisgKiBSZXR1cm5zIDAgaWYgQHdvcmsgd2FzIGFscmVhZHkgb24gYSBxdWV1ZSwgbm9uLXplcm8gb3RoZXJ3aXNlLgogICoKICAqIFdlIHF1ZXVlIHRoZSB3b3JrIHRvIHRoZSBDUFUgaXQgd2FzIHN1Ym1pdHRlZCwgYnV0IHRoZXJlIGlzIG5vCiAgKiBndWFyYW50ZWUgdGhhdCBpdCB3aWxsIGJlIHByb2Nlc3NlZCBieSB0aGF0IENQVS4KQEAgLTEzNyw3ICsxMzgsNyBAQAogICogQHdvcms6IHdvcmsgdG8gcXVldWUKICAqIEBkZWxheTogbnVtYmVyIG9mIGppZmZpZXMgdG8gd2FpdCBiZWZvcmUgcXVldWVpbmcKICAqCi0gKiBSZXR1cm5zIG5vbi16ZXJvIGlmIGl0IHdhcyBzdWNjZXNzZnVsbHkgYWRkZWQuCisgKiBSZXR1cm5zIDAgaWYgQHdvcmsgd2FzIGFscmVhZHkgb24gYSBxdWV1ZSwgbm9uLXplcm8gb3RoZXJ3aXNlLgogICovCiBpbnQgZmFzdGNhbGwgcXVldWVfZGVsYXllZF93b3JrKHN0cnVjdCB3b3JrcXVldWVfc3RydWN0ICp3cSwKIAkJCXN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaywgdW5zaWduZWQgbG9uZyBkZWxheSkKQEAgLTE2OCw3ICsxNjksNyBAQAogICogQHdvcms6IHdvcmsgdG8gcXVldWUKICAqIEBkZWxheTogbnVtYmVyIG9mIGppZmZpZXMgdG8gd2FpdCBiZWZvcmUgcXVldWVpbmcKICAqCi0gKiBSZXR1cm5zIG5vbi16ZXJvIGlmIGl0IHdhcyBzdWNjZXNzZnVsbHkgYWRkZWQuCisgKiBSZXR1cm5zIDAgaWYgQHdvcmsgd2FzIGFscmVhZHkgb24gYSBxdWV1ZSwgbm9uLXplcm8gb3RoZXJ3aXNlLgogICovCiBpbnQgcXVldWVfZGVsYXllZF93b3JrX29uKGludCBjcHUsIHN0cnVjdCB3b3JrcXVldWVfc3RydWN0ICp3cSwKIAkJCXN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaywgdW5zaWduZWQgbG9uZyBkZWxheSkKQEAgLTI0NSw2ICsyNDYsMTIgQEAKIAlzaWdwcm9jbWFzayhTSUdfQkxPQ0ssICZibG9ja2VkLCBOVUxMKTsKIAlmbHVzaF9zaWduYWxzKGN1cnJlbnQpOwogCisJLyoKKwkgKiBXZSBpbmhlcml0ZWQgTVBPTF9JTlRFUkxFQVZFIGZyb20gdGhlIGJvb3Rpbmcga2VybmVsLgorCSAqIFNldCBNUE9MX0RFRkFVTFQgdG8gaW5zdXJlIG5vZGUgbG9jYWwgYWxsb2NhdGlvbnMuCisJICovCisJbnVtYV9kZWZhdWx0X3BvbGljeSgpOworCiAJLyogU0lHX0lHTiBtYWtlcyBjaGlsZHJlbiBhdXRvcmVhcDogc2VlIGRvX25vdGlmeV9wYXJlbnQoKS4gKi8KIAlzYS5zYS5zYV9oYW5kbGVyID0gU0lHX0lHTjsKIAlzYS5zYS5zYV9mbGFncyA9IDA7CmRpZmYgLS1naXQgYS9saWIvS2NvbmZpZy5kZWJ1ZyBiL2xpYi9LY29uZmlnLmRlYnVnCmluZGV4IDc1NmE5MDguLmQzNjc5MTAgMTAwNjQ0Ci0tLSBhL2xpYi9LY29uZmlnLmRlYnVnCisrKyBiL2xpYi9LY29uZmlnLmRlYnVnCkBAIC03MSw3ICs3MSw3IEBACiAKIGNvbmZpZyBERVRFQ1RfU09GVExPQ0tVUAogCWJvb2wgIkRldGVjdCBTb2Z0IExvY2t1cHMiCi0JZGVwZW5kcyBvbiBERUJVR19LRVJORUwKKwlkZXBlbmRzIG9uIERFQlVHX0tFUk5FTCAmJiAhUzM5MAogCWRlZmF1bHQgeQogCWhlbHAKIAkgIFNheSBZIGhlcmUgdG8gZW5hYmxlIHRoZSBrZXJuZWwgdG8gZGV0ZWN0ICJzb2Z0IGxvY2t1cHMiLApAQCAtMzQxLDcgKzM0MSw3IEBACiAKIGNvbmZpZyBVTldJTkRfSU5GTwogCWJvb2wgIkNvbXBpbGUgdGhlIGtlcm5lbCB3aXRoIGZyYW1lIHVud2luZCBpbmZvcm1hdGlvbiIKLQlkZXBlbmRzIG9uICFJQTY0ICYmICFQQVJJU0MKKwlkZXBlbmRzIG9uICFJQTY0ICYmICFQQVJJU0MgJiYgIUFSTQogCWRlcGVuZHMgb24gIU1PRFVMRVMgfHwgIShNSVBTIHx8IFBQQyB8fCBTVVBFUkggfHwgVjg1MCkKIAloZWxwCiAJICBJZiB5b3Ugc2F5IFkgaGVyZSB0aGUgcmVzdWx0aW5nIGtlcm5lbCBpbWFnZSB3aWxsIGJlIHNsaWdodGx5IGxhcmdlcgpAQCAtMzcxLDYgKzM3MSwyMCBAQAogCSAgYmVjb21lIHRoZSBkZWZhdWx0IGluIHRoZSBmdXR1cmUsIHVudGlsIHRoZW4gdGhpcyBvcHRpb24gaXMgdGhlcmUgdG8KIAkgIHRlc3QgZ2NjIGZvciB0aGlzLgogCitjb25maWcgSEVBREVSU19DSEVDSworCWJvb2wgIlJ1biAnbWFrZSBoZWFkZXJzX2NoZWNrJyB3aGVuIGJ1aWxkaW5nIHZtbGludXgiCisJZGVwZW5kcyBvbiAhVU1MCisJaGVscAorCSAgVGhpcyBvcHRpb24gd2lsbCBleHRyYWN0IHRoZSB1c2VyLXZpc2libGUga2VybmVsIGhlYWRlcnMgd2hlbmV2ZXIKKwkgIGJ1aWxkaW5nIHRoZSBrZXJuZWwsIGFuZCB3aWxsIHJ1biBiYXNpYyBzYW5pdHkgY2hlY2tzIG9uIHRoZW0gdG8KKwkgIGVuc3VyZSB0aGF0IGV4cG9ydGVkIGZpbGVzIGRvIG5vdCBhdHRlbXB0IHRvIGluY2x1ZGUgZmlsZXMgd2hpY2gKKwkgIHdlcmUgbm90IGV4cG9ydGVkLCBldGMuCisKKwkgIElmIHlvdSdyZSBtYWtpbmcgbW9kaWZpY2F0aW9ucyB0byBoZWFkZXIgZmlsZXMgd2hpY2ggYXJlCisJICByZWxldmFudCBmb3IgdXNlcnNwYWNlLCBzYXkgJ1knLCBhbmQgY2hlY2sgdGhlIGhlYWRlcnMKKwkgIGV4cG9ydGVkIHRvICQoSU5TVEFMTF9IRFJfUEFUSCkgKHVzdWFsbHkgJ3Vzci9pbmNsdWRlJyBpbgorCSAgeW91ciBidWlsZCB0cmVlKSwgdG8gbWFrZSBzdXJlIHRoZXkncmUgc3VpdGFibGUuCisKIGNvbmZpZyBSQ1VfVE9SVFVSRV9URVNUCiAJdHJpc3RhdGUgInRvcnR1cmUgdGVzdHMgZm9yIFJDVSIKIAlkZXBlbmRzIG9uIERFQlVHX0tFUk5FTApkaWZmIC0tZ2l0IGEvbGliL01ha2VmaWxlIGIvbGliL01ha2VmaWxlCmluZGV4IDhlNjY2MmIuLmNmOThmYWIgMTAwNjQ0Ci0tLSBhL2xpYi9NYWtlZmlsZQorKysgYi9saWIvTWFrZWZpbGUKQEAgLTEyLDcgKzEyLDcgQEAKIAogbGliLXkJKz0ga29iamVjdC5vIGtyZWYubyBrb2JqZWN0X3VldmVudC5vIGtsaXN0Lm8KIAotb2JqLXkgKz0gc29ydC5vIHBhcnNlci5vIGhhbGZtZDQubyBpb21hcF9jb3B5Lm8gZGVidWdfbG9ja3Mubworb2JqLXkgKz0gc29ydC5vIHBhcnNlci5vIGhhbGZtZDQubyBpb21hcF9jb3B5Lm8gZGVidWdfbG9ja3MubyByYW5kb20zMi5vCiAKIGlmZXEgKCQoQ09ORklHX0RFQlVHX0tPQkpFQ1QpLHkpCiBDRkxBR1Nfa29iamVjdC5vICs9IC1EREVCVUcKZGlmZiAtLWdpdCBhL2xpYi9iaXRtYXAuYyBiL2xpYi9iaXRtYXAuYwppbmRleCBkNzFlMzhjLi4wMzdmYTlhIDEwMDY0NAotLS0gYS9saWIvYml0bWFwLmMKKysrIGIvbGliL2JpdG1hcC5jCkBAIC0zMTYsMTAgKzMxNiwxMSBAQAogRVhQT1JUX1NZTUJPTChiaXRtYXBfc2NucHJpbnRmKTsKIAogLyoqCi0gKiBiaXRtYXBfcGFyc2UgLSBjb252ZXJ0IGFuIEFTQ0lJIGhleCBzdHJpbmcgaW50byBhIGJpdG1hcC4KLSAqIEB1YnVmOiBwb2ludGVyIHRvIGJ1ZmZlciBpbiB1c2VyIHNwYWNlIGNvbnRhaW5pbmcgc3RyaW5nLgotICogQHVidWZsZW46IGJ1ZmZlciBzaXplIGluIGJ5dGVzLiAgSWYgc3RyaW5nIGlzIHNtYWxsZXIgdGhhbiB0aGlzCisgKiBfX2JpdG1hcF9wYXJzZSAtIGNvbnZlcnQgYW4gQVNDSUkgaGV4IHN0cmluZyBpbnRvIGEgYml0bWFwLgorICogQGJ1ZjogcG9pbnRlciB0byBidWZmZXIgY29udGFpbmluZyBzdHJpbmcuCisgKiBAYnVmbGVuOiBidWZmZXIgc2l6ZSBpbiBieXRlcy4gIElmIHN0cmluZyBpcyBzbWFsbGVyIHRoYW4gdGhpcwogICogICAgdGhlbiBpdCBtdXN0IGJlIHRlcm1pbmF0ZWQgd2l0aCBhIFwwLgorICogQGlzX3VzZXI6IGxvY2F0aW9uIG9mIGJ1ZmZlciwgMCBpbmRpY2F0ZXMga2VybmVsIHNwYWNlCiAgKiBAbWFza3A6IHBvaW50ZXIgdG8gYml0bWFwIGFycmF5IHRoYXQgd2lsbCBjb250YWluIHJlc3VsdC4KICAqIEBubWFza2JpdHM6IHNpemUgb2YgYml0bWFwLCBpbiBiaXRzLgogICoKQEAgLTMzMCwxMSArMzMxLDEzIEBACiAgKiBjaGFyYWN0ZXJzIGFuZCBmb3IgZ3JvdXBpbmcgZXJyb3JzIHN1Y2ggYXMgIjEsLDUiLCAiLDQ0IiwgIiwiIGFuZCAiIi4KICAqIExlYWRpbmcgYW5kIHRyYWlsaW5nIHdoaXRlc3BhY2UgYWNjZXB0ZWQsIGJ1dCBub3QgZW1iZWRkZWQgd2hpdGVzcGFjZS4KICAqLwotaW50IGJpdG1hcF9wYXJzZShjb25zdCBjaGFyIF9fdXNlciAqdWJ1ZiwgdW5zaWduZWQgaW50IHVidWZsZW4sCi0gICAgICAgIHVuc2lnbmVkIGxvbmcgKm1hc2twLCBpbnQgbm1hc2tiaXRzKQoraW50IF9fYml0bWFwX3BhcnNlKGNvbnN0IGNoYXIgKmJ1ZiwgdW5zaWduZWQgaW50IGJ1ZmxlbiwKKwkJaW50IGlzX3VzZXIsIHVuc2lnbmVkIGxvbmcgKm1hc2twLAorCQlpbnQgbm1hc2tiaXRzKQogewogCWludCBjLCBvbGRfYywgdG90YWxkaWdpdHMsIG5kaWdpdHMsIG5jaHVua3MsIG5iaXRzOwogCXUzMiBjaHVuazsKKwljb25zdCBjaGFyIF9fdXNlciAqdWJ1ZiA9IGJ1ZjsKIAogCWJpdG1hcF96ZXJvKG1hc2twLCBubWFza2JpdHMpOwogCkBAIC0zNDMsMTEgKzM0NiwxNSBAQAogCQljaHVuayA9IG5kaWdpdHMgPSAwOwogCiAJCS8qIEdldCB0aGUgbmV4dCBjaHVuayBvZiB0aGUgYml0bWFwICovCi0JCXdoaWxlICh1YnVmbGVuKSB7CisJCXdoaWxlIChidWZsZW4pIHsKIAkJCW9sZF9jID0gYzsKLQkJCWlmIChnZXRfdXNlcihjLCB1YnVmKyspKQotCQkJCXJldHVybiAtRUZBVUxUOwotCQkJdWJ1Zmxlbi0tOworCQkJaWYgKGlzX3VzZXIpIHsKKwkJCQlpZiAoX19nZXRfdXNlcihjLCB1YnVmKyspKQorCQkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCX0KKwkJCWVsc2UKKwkJCQljID0gKmJ1ZisrOworCQkJYnVmbGVuLS07CiAJCQlpZiAoaXNzcGFjZShjKSkKIAkJCQljb250aW51ZTsKIApAQCAtMzg4LDExICszOTUsMzYgQEAKIAkJbmJpdHMgKz0gKG5jaHVua3MgPT0gMSkgPyBuYml0c190b19ob2xkX3ZhbHVlKGNodW5rKSA6IENIVU5LU1o7CiAJCWlmIChuYml0cyA+IG5tYXNrYml0cykKIAkJCXJldHVybiAtRU9WRVJGTE9XOwotCX0gd2hpbGUgKHVidWZsZW4gJiYgYyA9PSAnLCcpOworCX0gd2hpbGUgKGJ1ZmxlbiAmJiBjID09ICcsJyk7CiAKIAlyZXR1cm4gMDsKIH0KLUVYUE9SVF9TWU1CT0woYml0bWFwX3BhcnNlKTsKK0VYUE9SVF9TWU1CT0woX19iaXRtYXBfcGFyc2UpOworCisvKioKKyAqIGJpdG1hcF9wYXJzZV91c2VyKCkKKyAqCisgKiBAdWJ1ZjogcG9pbnRlciB0byB1c2VyIGJ1ZmZlciBjb250YWluaW5nIHN0cmluZy4KKyAqIEB1bGVuOiBidWZmZXIgc2l6ZSBpbiBieXRlcy4gIElmIHN0cmluZyBpcyBzbWFsbGVyIHRoYW4gdGhpcworICogICAgdGhlbiBpdCBtdXN0IGJlIHRlcm1pbmF0ZWQgd2l0aCBhIFwwLgorICogQG1hc2twOiBwb2ludGVyIHRvIGJpdG1hcCBhcnJheSB0aGF0IHdpbGwgY29udGFpbiByZXN1bHQuCisgKiBAbm1hc2tiaXRzOiBzaXplIG9mIGJpdG1hcCwgaW4gYml0cy4KKyAqCisgKiBXcmFwcGVyIGZvciBfX2JpdG1hcF9wYXJzZSgpLCBwcm92aWRpbmcgaXQgd2l0aCB1c2VyIGJ1ZmZlci4KKyAqCisgKiBXZSBjYW5ub3QgaGF2ZSB0aGlzIGFzIGFuIGlubGluZSBmdW5jdGlvbiBpbiBiaXRtYXAuaCBiZWNhdXNlIGl0IG5lZWRzCisgKiBsaW51eC91YWNjZXNzLmggdG8gZ2V0IHRoZSBhY2Nlc3Nfb2soKSBkZWNsYXJhdGlvbiBhbmQgdGhpcyBjYXVzZXMKKyAqIGN5Y2xpYyBkZXBlbmRlbmNpZXMuCisgKi8KK2ludCBiaXRtYXBfcGFyc2VfdXNlcihjb25zdCBjaGFyIF9fdXNlciAqdWJ1ZiwKKwkJCXVuc2lnbmVkIGludCB1bGVuLCB1bnNpZ25lZCBsb25nICptYXNrcCwKKwkJCWludCBubWFza2JpdHMpCit7CisJaWYgKCFhY2Nlc3Nfb2soVkVSSUZZX1JFQUQsIHVidWYsIHVsZW4pKQorCQlyZXR1cm4gLUVGQVVMVDsKKwlyZXR1cm4gX19iaXRtYXBfcGFyc2UoKGNvbnN0IGNoYXIgKil1YnVmLCB1bGVuLCAxLCBtYXNrcCwgbm1hc2tiaXRzKTsKK30KK0VYUE9SVF9TWU1CT0woYml0bWFwX3BhcnNlX3VzZXIpOwogCiAvKgogICogYnNjbmxfZW1pdChidWYsIGJ1ZmxlbiwgcmJvdCwgcnRvcCwgYnApCmRpZmYgLS1naXQgYS9saWIvY3B1bWFzay5jIGIvbGliL2NwdW1hc2suYwppbmRleCA3YTJhNzNmLi4zYTY3ZGM1IDEwMDY0NAotLS0gYS9saWIvY3B1bWFzay5jCisrKyBiL2xpYi9jcHVtYXNrLmMKQEAgLTQzLDE5ICs0MywzIEBACiAJcmV0dXJuIGNwdTsKIH0KIEVYUE9SVF9TWU1CT0woX19hbnlfb25saW5lX2NwdSk7Ci0KLSNpZiBNQVhfTlVNTk9ERVMgPiAxCi0vKgotICogRmluZCB0aGUgaGlnaGVzdCBwb3NzaWJsZSBub2RlIGlkLgotICovCi1pbnQgaGlnaGVzdF9wb3NzaWJsZV9ub2RlX2lkKHZvaWQpCi17Ci0JdW5zaWduZWQgaW50IG5vZGU7Ci0JdW5zaWduZWQgaW50IGhpZ2hlc3QgPSAwOwotCi0JZm9yX2VhY2hfbm9kZV9tYXNrKG5vZGUsIG5vZGVfcG9zc2libGVfbWFwKQotCQloaWdoZXN0ID0gbm9kZTsKLQlyZXR1cm4gaGlnaGVzdDsKLX0KLUVYUE9SVF9TWU1CT0woaGlnaGVzdF9wb3NzaWJsZV9ub2RlX2lkKTsKLSNlbmRpZgpkaWZmIC0tZ2l0IGEvbGliL2tvYmplY3QuYyBiL2xpYi9rb2JqZWN0LmMKaW5kZXggMTY5OWViOS4uN2RkNWMwZSAxMDA2NDQKLS0tIGEvbGliL2tvYmplY3QuYworKysgYi9saWIva29iamVjdC5jCkBAIC0xMTksNiArMTE5LDcgQEAKIAogCXJldHVybiBwYXRoOwogfQorRVhQT1JUX1NZTUJPTF9HUEwoa29iamVjdF9nZXRfcGF0aCk7CiAKIC8qKgogICoJa29iamVjdF9pbml0IC0gaW5pdGlhbGl6ZSBvYmplY3QuCmRpZmYgLS1naXQgYS9saWIvcmFuZG9tMzIuYyBiL2xpYi9yYW5kb20zMi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRhMTVjZTUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcmFuZG9tMzIuYwpAQCAtMCwwICsxLDE0MiBAQAorLyoKKyAgVGhpcyBpcyBhIG1heGltYWxseSBlcXVpZGlzdHJpYnV0ZWQgY29tYmluZWQgVGF1c3dvcnRoZSBnZW5lcmF0b3IKKyAgYmFzZWQgb24gY29kZSBmcm9tIEdOVSBTY2llbnRpZmljIExpYnJhcnkgMS41ICgzMCBKdW4gMjAwNCkKKworICAgeF9uID0gKHMxX24gXiBzMl9uIF4gczNfbikKKworICAgczFfe24rMX0gPSAoKChzMV9uICYgNDI5NDk2NzI5NCkgPDwxMikgXiAoKChzMV9uIDw8MTMpIF4gczFfbikgPj4xOSkpCisgICBzMl97bisxfSA9ICgoKHMyX24gJiA0Mjk0OTY3Mjg4KSA8PCA0KSBeICgoKHMyX24gPDwgMikgXiBzMl9uKSA+PjI1KSkKKyAgIHMzX3tuKzF9ID0gKCgoczNfbiAmIDQyOTQ5NjcyODApIDw8MTcpIF4gKCgoczNfbiA8PCAzKSBeIHMzX24pID4+MTEpKQorCisgICBUaGUgcGVyaW9kIG9mIHRoaXMgZ2VuZXJhdG9yIGlzIGFib3V0IDJeODguCisKKyAgIEZyb206IFAuIEwnRWN1eWVyLCAiTWF4aW1hbGx5IEVxdWlkaXN0cmlidXRlZCBDb21iaW5lZCBUYXVzd29ydGhlCisgICBHZW5lcmF0b3JzIiwgTWF0aGVtYXRpY3Mgb2YgQ29tcHV0YXRpb24sIDY1LCAyMTMgKDE5OTYpLCAyMDMtLTIxMy4KKworICAgVGhpcyBpcyBhdmFpbGFibGUgb24gdGhlIG5ldCBmcm9tIEwnRWN1eWVyJ3MgaG9tZSBwYWdlLAorCisgICBodHRwOi8vd3d3Lmlyby51bW9udHJlYWwuY2EvfmxlY3V5ZXIvbXlmdHAvcGFwZXJzL3RhdXNtZS5wcworICAgZnRwOi8vZnRwLmlyby51bW9udHJlYWwuY2EvcHViL3NpbXVsYXRpb24vbGVjdXllci9wYXBlcnMvdGF1c21lLnBzCisKKyAgIFRoZXJlIGlzIGFuIGVycmF0dW0gaW4gdGhlIHBhcGVyICJUYWJsZXMgb2YgTWF4aW1hbGx5CisgICBFcXVpZGlzdHJpYnV0ZWQgQ29tYmluZWQgTEZTUiBHZW5lcmF0b3JzIiwgTWF0aGVtYXRpY3Mgb2YKKyAgIENvbXB1dGF0aW9uLCA2OCwgMjI1ICgxOTk5KSwgMjYxLS0yNjk6CisgICBodHRwOi8vd3d3Lmlyby51bW9udHJlYWwuY2EvfmxlY3V5ZXIvbXlmdHAvcGFwZXJzL3RhdXNtZTIucHMKKworICAgICAgICAuLi4gdGhlIGtfaiBtb3N0IHNpZ25pZmljYW50IGJpdHMgb2Ygel9qIG11c3QgYmUgbm9uLQorICAgICAgICB6ZXJvLCBmb3IgZWFjaCBqLiAoTm90ZTogdGhpcyByZXN0cmljdGlvbiBhbHNvIGFwcGxpZXMgdG8gdGhlCisgICAgICAgIGNvbXB1dGVyIGNvZGUgZ2l2ZW4gaW4gWzRdLCBidXQgd2FzIG1pc3Rha2VubHkgbm90IG1lbnRpb25lZCBpbgorICAgICAgICB0aGF0IHBhcGVyLikKKworICAgVGhpcyBhZmZlY3RzIHRoZSBzZWVkaW5nIHByb2NlZHVyZSBieSBpbXBvc2luZyB0aGUgcmVxdWlyZW1lbnQKKyAgIHMxID4gMSwgczIgPiA3LCBzMyA+IDE1LgorCisqLworCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9wZXJjcHUuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9yYW5kb20uaD4KKworc3RydWN0IHJuZF9zdGF0ZSB7CisJdTMyIHMxLCBzMiwgczM7Cit9OworCitzdGF0aWMgREVGSU5FX1BFUl9DUFUoc3RydWN0IHJuZF9zdGF0ZSwgbmV0X3JhbmRfc3RhdGUpOworCitzdGF0aWMgdTMyIF9fcmFuZG9tMzIoc3RydWN0IHJuZF9zdGF0ZSAqc3RhdGUpCit7CisjZGVmaW5lIFRBVVNXT1JUSEUocyxhLGIsYyxkKSAoKHMmYyk8PGQpIF4gKCgocyA8PGEpIF4gcyk+PmIpCisKKwlzdGF0ZS0+czEgPSBUQVVTV09SVEhFKHN0YXRlLT5zMSwgMTMsIDE5LCA0Mjk0OTY3Mjk0VUwsIDEyKTsKKwlzdGF0ZS0+czIgPSBUQVVTV09SVEhFKHN0YXRlLT5zMiwgMiwgMjUsIDQyOTQ5NjcyODhVTCwgNCk7CisJc3RhdGUtPnMzID0gVEFVU1dPUlRIRShzdGF0ZS0+czMsIDMsIDExLCA0Mjk0OTY3MjgwVUwsIDE3KTsKKworCXJldHVybiAoc3RhdGUtPnMxIF4gc3RhdGUtPnMyIF4gc3RhdGUtPnMzKTsKK30KKworc3RhdGljIHZvaWQgX19zZXRfcmFuZG9tMzIoc3RydWN0IHJuZF9zdGF0ZSAqc3RhdGUsIHVuc2lnbmVkIGxvbmcgcykKK3sKKwlpZiAocyA9PSAwKQorCQlzID0gMTsgICAgICAvKiBkZWZhdWx0IHNlZWQgaXMgMSAqLworCisjZGVmaW5lIExDRyhuKSAoNjkwNjkgKiBuKQorCXN0YXRlLT5zMSA9IExDRyhzKTsKKwlzdGF0ZS0+czIgPSBMQ0coc3RhdGUtPnMxKTsKKwlzdGF0ZS0+czMgPSBMQ0coc3RhdGUtPnMyKTsKKworCS8qICJ3YXJtIGl0IHVwIiAqLworCV9fcmFuZG9tMzIoc3RhdGUpOworCV9fcmFuZG9tMzIoc3RhdGUpOworCV9fcmFuZG9tMzIoc3RhdGUpOworCV9fcmFuZG9tMzIoc3RhdGUpOworCV9fcmFuZG9tMzIoc3RhdGUpOworCV9fcmFuZG9tMzIoc3RhdGUpOworfQorCisvKioKKyAqCXJhbmRvbTMyIC0gcHNldWRvIHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yCisgKgorICoJQSAzMiBiaXQgcHNldWRvLXJhbmRvbSBudW1iZXIgaXMgZ2VuZXJhdGVkIHVzaW5nIGEgZmFzdAorICoJYWxnb3JpdGhtIHN1aXRhYmxlIGZvciBzaW11bGF0aW9uLiBUaGlzIGFsZ29yaXRobSBpcyBOT1QKKyAqCWNvbnNpZGVyZWQgc2FmZSBmb3IgY3J5cHRvZ3JhcGhpYyB1c2UuCisgKi8KK3UzMiByYW5kb20zMih2b2lkKQoreworCXVuc2lnbmVkIGxvbmcgcjsKKwlzdHJ1Y3Qgcm5kX3N0YXRlICpzdGF0ZSA9ICZnZXRfY3B1X3ZhcihuZXRfcmFuZF9zdGF0ZSk7CisJciA9IF9fcmFuZG9tMzIoc3RhdGUpOworCXB1dF9jcHVfdmFyKHN0YXRlKTsKKwlyZXR1cm4gcjsKK30KK0VYUE9SVF9TWU1CT0wocmFuZG9tMzIpOworCisvKioKKyAqCXNyYW5kb20zMiAtIGFkZCBlbnRyb3B5IHRvIHBzZXVkbyByYW5kb20gbnVtYmVyIGdlbmVyYXRvcgorICoJQHNlZWQ6IHNlZWQgdmFsdWUKKyAqCisgKglBZGQgc29tZSBhZGRpdGlvbmFsIHNlZWRpbmcgdG8gdGhlIHJhbmRvbTMyKCkgcG9vbC4KKyAqCU5vdGU6IHRoaXMgcG9vbCBpcyBwZXIgY3B1IHNvIGl0IG9ubHkgYWZmZWN0cyBjdXJyZW50IENQVS4KKyAqLwordm9pZCBzcmFuZG9tMzIodTMyIGVudHJvcHkpCit7CisJc3RydWN0IHJuZF9zdGF0ZSAqc3RhdGUgPSAmZ2V0X2NwdV92YXIobmV0X3JhbmRfc3RhdGUpOworCV9fc2V0X3JhbmRvbTMyKHN0YXRlLCBzdGF0ZS0+czEgXiBlbnRyb3B5KTsKKwlwdXRfY3B1X3ZhcihzdGF0ZSk7Cit9CitFWFBPUlRfU1lNQk9MKHNyYW5kb20zMik7CisKKy8qCisgKglHZW5lcmF0ZSBzb21lIGluaXRpYWxseSB3ZWFrIHNlZWRpbmcgdmFsdWVzIHRvIGFsbG93CisgKgl0byBzdGFydCB0aGUgcmFuZG9tMzIoKSBlbmdpbmUuCisgKi8KK3N0YXRpYyBpbnQgX19pbml0IHJhbmRvbTMyX2luaXQodm9pZCkKK3sKKwlpbnQgaTsKKworCWZvcl9lYWNoX3Bvc3NpYmxlX2NwdShpKSB7CisJCXN0cnVjdCBybmRfc3RhdGUgKnN0YXRlID0gJnBlcl9jcHUobmV0X3JhbmRfc3RhdGUsaSk7CisJCV9fc2V0X3JhbmRvbTMyKHN0YXRlLCBpICsgamlmZmllcyk7CisJfQorCXJldHVybiAwOworfQorY29yZV9pbml0Y2FsbChyYW5kb20zMl9pbml0KTsKKworLyoKKyAqCUdlbmVyYXRlIGJldHRlciB2YWx1ZXMgYWZ0ZXIgcmFuZG9tIG51bWJlciBnZW5lcmF0b3IKKyAqCWlzIGZ1bGx5IGluaXRhbGl6ZWQuCisgKi8KK3N0YXRpYyBpbnQgX19pbml0IHJhbmRvbTMyX3Jlc2VlZCh2b2lkKQoreworCWludCBpOworCXVuc2lnbmVkIGxvbmcgc2VlZDsKKworCWZvcl9lYWNoX3Bvc3NpYmxlX2NwdShpKSB7CisJCXN0cnVjdCBybmRfc3RhdGUgKnN0YXRlID0gJnBlcl9jcHUobmV0X3JhbmRfc3RhdGUsaSk7CisKKwkJZ2V0X3JhbmRvbV9ieXRlcygmc2VlZCwgc2l6ZW9mKHNlZWQpKTsKKwkJX19zZXRfcmFuZG9tMzIoc3RhdGUsIHNlZWQpOworCX0KKwlyZXR1cm4gMDsKK30KK2xhdGVfaW5pdGNhbGwocmFuZG9tMzJfcmVzZWVkKTsKZGlmZiAtLWdpdCBhL2xpYi9yd3NlbS1zcGlubG9jay5jIGIvbGliL3J3c2VtLXNwaW5sb2NrLmMKaW5kZXggZGI0ZmVkNy4uYzRjZmQ2YyAxMDA2NDQKLS0tIGEvbGliL3J3c2VtLXNwaW5sb2NrLmMKKysrIGIvbGliL3J3c2VtLXNwaW5sb2NrLmMKQEAgLTI4LDcgKzI4LDcgQEAKIAkgKiBNYWtlIHN1cmUgd2UgYXJlIG5vdCByZWluaXRpYWxpemluZyBhIGhlbGQgc2VtYXBob3JlOgogCSAqLwogCWRlYnVnX2NoZWNrX25vX2xvY2tzX2ZyZWVkKCh2b2lkICopc2VtLCBzaXplb2YoKnNlbSkpOwotCWxvY2tkZXBfaW5pdF9tYXAoJnNlbS0+ZGVwX21hcCwgbmFtZSwga2V5KTsKKwlsb2NrZGVwX2luaXRfbWFwKCZzZW0tPmRlcF9tYXAsIG5hbWUsIGtleSwgMCk7CiAjZW5kaWYKIAlzZW0tPmFjdGl2aXR5ID0gMDsKIAlzcGluX2xvY2tfaW5pdCgmc2VtLT53YWl0X2xvY2spOwpkaWZmIC0tZ2l0IGEvbGliL3J3c2VtLmMgYi9saWIvcndzZW0uYwppbmRleCA5MDFkMGU3Li5jZGI0ZTNkIDEwMDY0NAotLS0gYS9saWIvcndzZW0uYworKysgYi9saWIvcndzZW0uYwpAQCAtMTksNyArMTksNyBAQAogCSAqIE1ha2Ugc3VyZSB3ZSBhcmUgbm90IHJlaW5pdGlhbGl6aW5nIGEgaGVsZCBzZW1hcGhvcmU6CiAJICovCiAJZGVidWdfY2hlY2tfbm9fbG9ja3NfZnJlZWQoKHZvaWQgKilzZW0sIHNpemVvZigqc2VtKSk7Ci0JbG9ja2RlcF9pbml0X21hcCgmc2VtLT5kZXBfbWFwLCBuYW1lLCBrZXkpOworCWxvY2tkZXBfaW5pdF9tYXAoJnNlbS0+ZGVwX21hcCwgbmFtZSwga2V5LCAwKTsKICNlbmRpZgogCXNlbS0+Y291bnQgPSBSV1NFTV9VTkxPQ0tFRF9WQUxVRTsKIAlzcGluX2xvY2tfaW5pdCgmc2VtLT53YWl0X2xvY2spOwpkaWZmIC0tZ2l0IGEvbGliL3NwaW5sb2NrX2RlYnVnLmMgYi9saWIvc3BpbmxvY2tfZGVidWcuYwppbmRleCBkYWZhZjFkLi5iNmM0Zjg5IDEwMDY0NAotLS0gYS9saWIvc3BpbmxvY2tfZGVidWcuYworKysgYi9saWIvc3BpbmxvY2tfZGVidWcuYwpAQCAtMjAsNyArMjAsNyBAQAogCSAqIE1ha2Ugc3VyZSB3ZSBhcmUgbm90IHJlaW5pdGlhbGl6aW5nIGEgaGVsZCBsb2NrOgogCSAqLwogCWRlYnVnX2NoZWNrX25vX2xvY2tzX2ZyZWVkKCh2b2lkICopbG9jaywgc2l6ZW9mKCpsb2NrKSk7Ci0JbG9ja2RlcF9pbml0X21hcCgmbG9jay0+ZGVwX21hcCwgbmFtZSwga2V5KTsKKwlsb2NrZGVwX2luaXRfbWFwKCZsb2NrLT5kZXBfbWFwLCBuYW1lLCBrZXksIDApOwogI2VuZGlmCiAJbG9jay0+cmF3X2xvY2sgPSAocmF3X3NwaW5sb2NrX3QpX19SQVdfU1BJTl9MT0NLX1VOTE9DS0VEOwogCWxvY2stPm1hZ2ljID0gU1BJTkxPQ0tfTUFHSUM7CkBAIC0zOCw3ICszOCw3IEBACiAJICogTWFrZSBzdXJlIHdlIGFyZSBub3QgcmVpbml0aWFsaXppbmcgYSBoZWxkIGxvY2s6CiAJICovCiAJZGVidWdfY2hlY2tfbm9fbG9ja3NfZnJlZWQoKHZvaWQgKilsb2NrLCBzaXplb2YoKmxvY2spKTsKLQlsb2NrZGVwX2luaXRfbWFwKCZsb2NrLT5kZXBfbWFwLCBuYW1lLCBrZXkpOworCWxvY2tkZXBfaW5pdF9tYXAoJmxvY2stPmRlcF9tYXAsIG5hbWUsIGtleSwgMCk7CiAjZW5kaWYKIAlsb2NrLT5yYXdfbG9jayA9IChyYXdfcndsb2NrX3QpIF9fUkFXX1JXX0xPQ0tfVU5MT0NLRUQ7CiAJbG9jay0+bWFnaWMgPSBSV0xPQ0tfTUFHSUM7CmRpZmYgLS1naXQgYS9saWIvc3RyaW5nLmMgYi9saWIvc3RyaW5nLmMKaW5kZXggNjMwNzcyNjcuLmE0ODVkNzUgMTAwNjQ0Ci0tLSBhL2xpYi9zdHJpbmcuYworKysgYi9saWIvc3RyaW5nLmMKQEAgLTMyMCw3ICszMjAsNyBAQAogCQlyZXR1cm4gczsKIAogCWVuZCA9IHMgKyBzaXplIC0gMTsKLQl3aGlsZSAoZW5kICE9IHMgJiYgaXNzcGFjZSgqZW5kKSkKKwl3aGlsZSAoZW5kID49IHMgJiYgaXNzcGFjZSgqZW5kKSkKIAkJZW5kLS07CiAJKihlbmQgKyAxKSA9ICdcMCc7CiAKZGlmZiAtLWdpdCBhL21tL01ha2VmaWxlIGIvbW0vTWFrZWZpbGUKaW5kZXggMTJiM2E0ZS4uZjNjMDc3ZSAxMDA2NDQKLS0tIGEvbW0vTWFrZWZpbGUKKysrIGIvbW0vTWFrZWZpbGUKQEAgLTEwLDcgKzEwLDggQEAKIG9iai15CQkJOj0gYm9vdG1lbS5vIGZpbGVtYXAubyBtZW1wb29sLm8gb29tX2tpbGwubyBmYWR2aXNlLm8gXAogCQkJICAgcGFnZV9hbGxvYy5vIHBhZ2Utd3JpdGViYWNrLm8gcGRmbHVzaC5vIFwKIAkJCSAgIHJlYWRhaGVhZC5vIHN3YXAubyB0cnVuY2F0ZS5vIHZtc2Nhbi5vIFwKLQkJCSAgIHByaW9fdHJlZS5vIHV0aWwubyBtbXpvbmUubyB2bXN0YXQubyAkKG1tdS15KQorCQkJICAgcHJpb190cmVlLm8gdXRpbC5vIG1tem9uZS5vIHZtc3RhdC5vIGJhY2tpbmctZGV2Lm8gXAorCQkJICAgJChtbXUteSkKIAogaWZlcSAoJChDT05GSUdfTU1VKSQoQ09ORklHX0JMT0NLKSx5eSkKIG9iai15CQkJKz0gYm91bmNlLm8KZGlmZiAtLWdpdCBhL21tL2JhY2tpbmctZGV2LmMgYi9tbS9iYWNraW5nLWRldi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY1MGEyODEKLS0tIC9kZXYvbnVsbAorKysgYi9tbS9iYWNraW5nLWRldi5jCkBAIC0wLDAgKzEsNjkgQEAKKworI2luY2x1ZGUgPGxpbnV4L3dhaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9iYWNraW5nLWRldi5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKworc3RhdGljIHdhaXRfcXVldWVfaGVhZF90IGNvbmdlc3Rpb25fd3FoWzJdID0geworCQlfX1dBSVRfUVVFVUVfSEVBRF9JTklUSUFMSVpFUihjb25nZXN0aW9uX3dxaFswXSksCisJCV9fV0FJVF9RVUVVRV9IRUFEX0lOSVRJQUxJWkVSKGNvbmdlc3Rpb25fd3FoWzFdKQorCX07CisKKwordm9pZCBjbGVhcl9iZGlfY29uZ2VzdGVkKHN0cnVjdCBiYWNraW5nX2Rldl9pbmZvICpiZGksIGludCBydykKK3sKKwllbnVtIGJkaV9zdGF0ZSBiaXQ7CisJd2FpdF9xdWV1ZV9oZWFkX3QgKndxaCA9ICZjb25nZXN0aW9uX3dxaFtyd107CisKKwliaXQgPSAocncgPT0gV1JJVEUpID8gQkRJX3dyaXRlX2Nvbmdlc3RlZCA6IEJESV9yZWFkX2Nvbmdlc3RlZDsKKwljbGVhcl9iaXQoYml0LCAmYmRpLT5zdGF0ZSk7CisJc21wX21iX19hZnRlcl9jbGVhcl9iaXQoKTsKKwlpZiAod2FpdHF1ZXVlX2FjdGl2ZSh3cWgpKQorCQl3YWtlX3VwKHdxaCk7Cit9CitFWFBPUlRfU1lNQk9MKGNsZWFyX2JkaV9jb25nZXN0ZWQpOworCit2b2lkIHNldF9iZGlfY29uZ2VzdGVkKHN0cnVjdCBiYWNraW5nX2Rldl9pbmZvICpiZGksIGludCBydykKK3sKKwllbnVtIGJkaV9zdGF0ZSBiaXQ7CisKKwliaXQgPSAocncgPT0gV1JJVEUpID8gQkRJX3dyaXRlX2Nvbmdlc3RlZCA6IEJESV9yZWFkX2Nvbmdlc3RlZDsKKwlzZXRfYml0KGJpdCwgJmJkaS0+c3RhdGUpOworfQorRVhQT1JUX1NZTUJPTChzZXRfYmRpX2Nvbmdlc3RlZCk7CisKKy8qKgorICogY29uZ2VzdGlvbl93YWl0IC0gd2FpdCBmb3IgYSBiYWNraW5nX2RldiB0byBiZWNvbWUgdW5jb25nZXN0ZWQKKyAqIEBydzogUkVBRCBvciBXUklURQorICogQHRpbWVvdXQ6IHRpbWVvdXQgaW4gamlmZmllcworICoKKyAqIFdhaXRzIGZvciB1cCB0byBAdGltZW91dCBqaWZmaWVzIGZvciBhIGJhY2tpbmdfZGV2IChhbnkgYmFja2luZ19kZXYpIHRvIGV4aXQKKyAqIHdyaXRlIGNvbmdlc3Rpb24uICBJZiBubyBiYWNraW5nX2RldnMgYXJlIGNvbmdlc3RlZCB0aGVuIGp1c3Qgd2FpdCBmb3IgdGhlCisgKiBuZXh0IHdyaXRlIHRvIGJlIGNvbXBsZXRlZC4KKyAqLworbG9uZyBjb25nZXN0aW9uX3dhaXQoaW50IHJ3LCBsb25nIHRpbWVvdXQpCit7CisJbG9uZyByZXQ7CisJREVGSU5FX1dBSVQod2FpdCk7CisJd2FpdF9xdWV1ZV9oZWFkX3QgKndxaCA9ICZjb25nZXN0aW9uX3dxaFtyd107CisKKwlwcmVwYXJlX3RvX3dhaXQod3FoLCAmd2FpdCwgVEFTS19VTklOVEVSUlVQVElCTEUpOworCXJldCA9IGlvX3NjaGVkdWxlX3RpbWVvdXQodGltZW91dCk7CisJZmluaXNoX3dhaXQod3FoLCAmd2FpdCk7CisJcmV0dXJuIHJldDsKK30KK0VYUE9SVF9TWU1CT0woY29uZ2VzdGlvbl93YWl0KTsKKworLyoqCisgKiBjb25nZXN0aW9uX2VuZCAtIHdha2UgdXAgc2xlZXBlcnMgb24gYSBjb25nZXN0ZWQgYmFja2luZ19kZXZfaW5mbworICogQHJ3OiBSRUFEIG9yIFdSSVRFCisgKi8KK3ZvaWQgY29uZ2VzdGlvbl9lbmQoaW50IHJ3KQoreworCXdhaXRfcXVldWVfaGVhZF90ICp3cWggPSAmY29uZ2VzdGlvbl93cWhbcnddOworCisJaWYgKHdhaXRxdWV1ZV9hY3RpdmUod3FoKSkKKwkJd2FrZV91cCh3cWgpOworfQorRVhQT1JUX1NZTUJPTChjb25nZXN0aW9uX2VuZCk7CmRpZmYgLS1naXQgYS9tbS9maWxlbWFwLmMgYi9tbS9maWxlbWFwLmMKaW5kZXggMzQ2NGI2OC4uN2I4NGRjOCAxMDA2NDQKLS0tIGEvbW0vZmlsZW1hcC5jCisrKyBiL21tL2ZpbGVtYXAuYwpAQCAtNzUsOCArNzUsOCBAQAogICogIC0+bW1hcF9zZW0KICAqICAgIC0+bG9ja19wYWdlCQkoYWNjZXNzX3Byb2Nlc3Nfdm0pCiAgKgotICogIC0+bW1hcF9zZW0KLSAqICAgIC0+aV9tdXRleAkJCShtc3luYykKKyAqICAtPmlfbXV0ZXgJCQkoZ2VuZXJpY19maWxlX2J1ZmZlcmVkX3dyaXRlKQorICogICAgLT5tbWFwX3NlbQkJKGZhdWx0X2luX3BhZ2VzX3JlYWRhYmxlLT5kb19wYWdlX2ZhdWx0KQogICoKICAqICAtPmlfbXV0ZXgKICAqICAgIC0+aV9hbGxvY19zZW0gICAgICAgICAgICAgKHZhcmlvdXMpCkBAIC00NjcsMjUgKzQ2NywxNSBAQAogfQogCiAjaWZkZWYgQ09ORklHX05VTUEKLXN0cnVjdCBwYWdlICpwYWdlX2NhY2hlX2FsbG9jKHN0cnVjdCBhZGRyZXNzX3NwYWNlICp4KQorc3RydWN0IHBhZ2UgKl9fcGFnZV9jYWNoZV9hbGxvYyhnZnBfdCBnZnApCiB7CiAJaWYgKGNwdXNldF9kb19wYWdlX21lbV9zcHJlYWQoKSkgewogCQlpbnQgbiA9IGNwdXNldF9tZW1fc3ByZWFkX25vZGUoKTsKLQkJcmV0dXJuIGFsbG9jX3BhZ2VzX25vZGUobiwgbWFwcGluZ19nZnBfbWFzayh4KSwgMCk7CisJCXJldHVybiBhbGxvY19wYWdlc19ub2RlKG4sIGdmcCwgMCk7CiAJfQotCXJldHVybiBhbGxvY19wYWdlcyhtYXBwaW5nX2dmcF9tYXNrKHgpLCAwKTsKKwlyZXR1cm4gYWxsb2NfcGFnZXMoZ2ZwLCAwKTsKIH0KLUVYUE9SVF9TWU1CT0wocGFnZV9jYWNoZV9hbGxvYyk7Ci0KLXN0cnVjdCBwYWdlICpwYWdlX2NhY2hlX2FsbG9jX2NvbGQoc3RydWN0IGFkZHJlc3Nfc3BhY2UgKngpCi17Ci0JaWYgKGNwdXNldF9kb19wYWdlX21lbV9zcHJlYWQoKSkgewotCQlpbnQgbiA9IGNwdXNldF9tZW1fc3ByZWFkX25vZGUoKTsKLQkJcmV0dXJuIGFsbG9jX3BhZ2VzX25vZGUobiwgbWFwcGluZ19nZnBfbWFzayh4KXxfX0dGUF9DT0xELCAwKTsKLQl9Ci0JcmV0dXJuIGFsbG9jX3BhZ2VzKG1hcHBpbmdfZ2ZwX21hc2soeCl8X19HRlBfQ09MRCwgMCk7Ci19Ci1FWFBPUlRfU1lNQk9MKHBhZ2VfY2FjaGVfYWxsb2NfY29sZCk7CitFWFBPUlRfU1lNQk9MKF9fcGFnZV9jYWNoZV9hbGxvYyk7CiAjZW5kaWYKIAogc3RhdGljIGludCBfX3NsZWVwX29uX3BhZ2VfbG9jayh2b2lkICp3b3JkKQpAQCAtODI2LDcgKzgxNiw2IEBACiBncmFiX2NhY2hlX3BhZ2Vfbm93YWl0KHN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nLCB1bnNpZ25lZCBsb25nIGluZGV4KQogewogCXN0cnVjdCBwYWdlICpwYWdlID0gZmluZF9nZXRfcGFnZShtYXBwaW5nLCBpbmRleCk7Ci0JZ2ZwX3QgZ2ZwX21hc2s7CiAKIAlpZiAocGFnZSkgewogCQlpZiAoIVRlc3RTZXRQYWdlTG9ja2VkKHBhZ2UpKQpAQCAtODM0LDkgKzgyMyw4IEBACiAJCXBhZ2VfY2FjaGVfcmVsZWFzZShwYWdlKTsKIAkJcmV0dXJuIE5VTEw7CiAJfQotCWdmcF9tYXNrID0gbWFwcGluZ19nZnBfbWFzayhtYXBwaW5nKSAmIH5fX0dGUF9GUzsKLQlwYWdlID0gYWxsb2NfcGFnZXMoZ2ZwX21hc2ssIDApOwotCWlmIChwYWdlICYmIGFkZF90b19wYWdlX2NhY2hlX2xydShwYWdlLCBtYXBwaW5nLCBpbmRleCwgZ2ZwX21hc2spKSB7CisJcGFnZSA9IF9fcGFnZV9jYWNoZV9hbGxvYyhtYXBwaW5nX2dmcF9tYXNrKG1hcHBpbmcpICYgfl9fR0ZQX0ZTKTsKKwlpZiAocGFnZSAmJiBhZGRfdG9fcGFnZV9jYWNoZV9scnUocGFnZSwgbWFwcGluZywgaW5kZXgsIEdGUF9LRVJORUwpKSB7CiAJCXBhZ2VfY2FjaGVfcmVsZWFzZShwYWdlKTsKIAkJcGFnZSA9IE5VTEw7CiAJfQpAQCAtMTg4NCwxMSArMTg3MiwxMCBAQAogICoJaWYgc3VpZCBvciAoc2dpZCBhbmQgeGdycCkKICAqCQlyZW1vdmUgcHJpdnMKICAqLwotaW50IHJlbW92ZV9zdWlkKHN0cnVjdCBkZW50cnkgKmRlbnRyeSkKK2ludCBzaG91bGRfcmVtb3ZlX3N1aWQoc3RydWN0IGRlbnRyeSAqZGVudHJ5KQogewogCW1vZGVfdCBtb2RlID0gZGVudHJ5LT5kX2lub2RlLT5pX21vZGU7CiAJaW50IGtpbGwgPSAwOwotCWludCByZXN1bHQgPSAwOwogCiAJLyogc3VpZCBhbHdheXMgbXVzdCBiZSBraWxsZWQgKi8KIAlpZiAodW5saWtlbHkobW9kZSAmIFNfSVNVSUQpKQpAQCAtMTkwMSwxMyArMTg4OCwyOCBAQAogCWlmICh1bmxpa2VseSgobW9kZSAmIFNfSVNHSUQpICYmIChtb2RlICYgU19JWEdSUCkpKQogCQlraWxsIHw9IEFUVFJfS0lMTF9TR0lEOwogCi0JaWYgKHVubGlrZWx5KGtpbGwgJiYgIWNhcGFibGUoQ0FQX0ZTRVRJRCkpKSB7Ci0JCXN0cnVjdCBpYXR0ciBuZXdhdHRyczsKKwlpZiAodW5saWtlbHkoa2lsbCAmJiAhY2FwYWJsZShDQVBfRlNFVElEKSkpCisJCXJldHVybiBraWxsOwogCi0JCW5ld2F0dHJzLmlhX3ZhbGlkID0gQVRUUl9GT1JDRSB8IGtpbGw7Ci0JCXJlc3VsdCA9IG5vdGlmeV9jaGFuZ2UoZGVudHJ5LCAmbmV3YXR0cnMpOwotCX0KLQlyZXR1cm4gcmVzdWx0OworCXJldHVybiAwOworfQorCitpbnQgX19yZW1vdmVfc3VpZChzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIGludCBraWxsKQoreworCXN0cnVjdCBpYXR0ciBuZXdhdHRyczsKKworCW5ld2F0dHJzLmlhX3ZhbGlkID0gQVRUUl9GT1JDRSB8IGtpbGw7CisJcmV0dXJuIG5vdGlmeV9jaGFuZ2UoZGVudHJ5LCAmbmV3YXR0cnMpOworfQorCitpbnQgcmVtb3ZlX3N1aWQoc3RydWN0IGRlbnRyeSAqZGVudHJ5KQoreworCWludCBraWxsID0gc2hvdWxkX3JlbW92ZV9zdWlkKGRlbnRyeSk7CisKKwlpZiAodW5saWtlbHkoa2lsbCkpCisJCXJldHVybiBfX3JlbW92ZV9zdWlkKGRlbnRyeSwga2lsbCk7CisKKwlyZXR1cm4gMDsKIH0KIEVYUE9SVF9TWU1CT0wocmVtb3ZlX3N1aWQpOwogCkBAIC0yMjIyLDcgKzIyMjQsNyBAQAogCQkJCXVuc2lnbmVkIGxvbmcgbnJfc2VncywgbG9mZl90ICpwcG9zKQogewogCXN0cnVjdCBmaWxlICpmaWxlID0gaW9jYi0+a2lfZmlscDsKLQljb25zdCBzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqIG1hcHBpbmcgPSBmaWxlLT5mX21hcHBpbmc7CisJc3RydWN0IGFkZHJlc3Nfc3BhY2UgKiBtYXBwaW5nID0gZmlsZS0+Zl9tYXBwaW5nOwogCXNpemVfdCBvY291bnQ7CQkvKiBvcmlnaW5hbCBjb3VudCAqLwogCXNpemVfdCBjb3VudDsJCS8qIGFmdGVyIGZpbGUgbGltaXQgY2hlY2tzICovCiAJc3RydWN0IGlub2RlIAkqaW5vZGUgPSBtYXBwaW5nLT5ob3N0OwpAQCAtMjI3NSw4ICsyMjc3LDExIEBACiAKIAkvKiBjb2FsZXNjZSB0aGUgaW92ZWNzIGFuZCBnbyBkaXJlY3QtdG8tQklPIGZvciBPX0RJUkVDVCAqLwogCWlmICh1bmxpa2VseShmaWxlLT5mX2ZsYWdzICYgT19ESVJFQ1QpKSB7Ci0JCXdyaXR0ZW4gPSBnZW5lcmljX2ZpbGVfZGlyZWN0X3dyaXRlKGlvY2IsIGlvdiwKLQkJCQkmbnJfc2VncywgcG9zLCBwcG9zLCBjb3VudCwgb2NvdW50KTsKKwkJbG9mZl90IGVuZGJ5dGU7CisJCXNzaXplX3Qgd3JpdHRlbl9idWZmZXJlZDsKKworCQl3cml0dGVuID0gZ2VuZXJpY19maWxlX2RpcmVjdF93cml0ZShpb2NiLCBpb3YsICZucl9zZWdzLCBwb3MsCisJCQkJCQkJcHBvcywgY291bnQsIG9jb3VudCk7CiAJCWlmICh3cml0dGVuIDwgMCB8fCB3cml0dGVuID09IGNvdW50KQogCQkJZ290byBvdXQ7CiAJCS8qCkBAIC0yMjg1LDEwICsyMjkwLDQ2IEBACiAJCSAqLwogCQlwb3MgKz0gd3JpdHRlbjsKIAkJY291bnQgLT0gd3JpdHRlbjsKLQl9CisJCXdyaXR0ZW5fYnVmZmVyZWQgPSBnZW5lcmljX2ZpbGVfYnVmZmVyZWRfd3JpdGUoaW9jYiwgaW92LAorCQkJCQkJbnJfc2VncywgcG9zLCBwcG9zLCBjb3VudCwKKwkJCQkJCXdyaXR0ZW4pOworCQkvKgorCQkgKiBJZiBnZW5lcmljX2ZpbGVfYnVmZmVyZWRfd3JpdGUoKSByZXR1bmVkIGEgc3luY2hyb25vdXMgZXJyb3IKKwkJICogdGhlbiB3ZSB3YW50IHRvIHJldHVybiB0aGUgbnVtYmVyIG9mIGJ5dGVzIHdoaWNoIHdlcmUKKwkJICogZGlyZWN0LXdyaXR0ZW4sIG9yIHRoZSBlcnJvciBjb2RlIGlmIHRoYXQgd2FzIHplcm8uICBOb3RlCisJCSAqIHRoYXQgdGhpcyBkaWZmZXJzIGZyb20gbm9ybWFsIGRpcmVjdC1pbyBzZW1hbnRpY3MsIHdoaWNoCisJCSAqIHdpbGwgcmV0dXJuIC1FRk9PIGV2ZW4gaWYgc29tZSBieXRlcyB3ZXJlIHdyaXR0ZW4uCisJCSAqLworCQlpZiAod3JpdHRlbl9idWZmZXJlZCA8IDApIHsKKwkJCWVyciA9IHdyaXR0ZW5fYnVmZmVyZWQ7CisJCQlnb3RvIG91dDsKKwkJfQogCi0Jd3JpdHRlbiA9IGdlbmVyaWNfZmlsZV9idWZmZXJlZF93cml0ZShpb2NiLCBpb3YsIG5yX3NlZ3MsCi0JCQlwb3MsIHBwb3MsIGNvdW50LCB3cml0dGVuKTsKKwkJLyoKKwkJICogV2UgbmVlZCB0byBlbnN1cmUgdGhhdCB0aGUgcGFnZSBjYWNoZSBwYWdlcyBhcmUgd3JpdHRlbiB0bworCQkgKiBkaXNrIGFuZCBpbnZhbGlkYXRlZCB0byBwcmVzZXJ2ZSB0aGUgZXhwZWN0ZWQgT19ESVJFQ1QKKwkJICogc2VtYW50aWNzLgorCQkgKi8KKwkJZW5kYnl0ZSA9IHBvcyArIHdyaXR0ZW5fYnVmZmVyZWQgLSB3cml0dGVuIC0gMTsKKwkJZXJyID0gZG9fc3luY19maWxlX3JhbmdlKGZpbGUsIHBvcywgZW5kYnl0ZSwKKwkJCQkJIFNZTkNfRklMRV9SQU5HRV9XQUlUX0JFRk9SRXwKKwkJCQkJIFNZTkNfRklMRV9SQU5HRV9XUklURXwKKwkJCQkJIFNZTkNfRklMRV9SQU5HRV9XQUlUX0FGVEVSKTsKKwkJaWYgKGVyciA9PSAwKSB7CisJCQl3cml0dGVuID0gd3JpdHRlbl9idWZmZXJlZDsKKwkJCWludmFsaWRhdGVfbWFwcGluZ19wYWdlcyhtYXBwaW5nLAorCQkJCQkJIHBvcyA+PiBQQUdFX0NBQ0hFX1NISUZULAorCQkJCQkJIGVuZGJ5dGUgPj4gUEFHRV9DQUNIRV9TSElGVCk7CisJCX0gZWxzZSB7CisJCQkvKgorCQkJICogV2UgZG9uJ3Qga25vdyBob3cgbXVjaCB3ZSB3cm90ZSwgc28ganVzdCByZXR1cm4KKwkJCSAqIHRoZSBudW1iZXIgb2YgYnl0ZXMgd2hpY2ggd2VyZSBkaXJlY3Qtd3JpdHRlbgorCQkJICovCisJCX0KKwl9IGVsc2UgeworCQl3cml0dGVuID0gZ2VuZXJpY19maWxlX2J1ZmZlcmVkX3dyaXRlKGlvY2IsIGlvdiwgbnJfc2VncywKKwkJCQlwb3MsIHBwb3MsIGNvdW50LCB3cml0dGVuKTsKKwl9CiBvdXQ6CiAJY3VycmVudC0+YmFja2luZ19kZXZfaW5mbyA9IE5VTEw7CiAJcmV0dXJuIHdyaXR0ZW4gPyB3cml0dGVuIDogZXJyOwpkaWZmIC0tZ2l0IGEvbW0vaHVnZXRsYi5jIGIvbW0vaHVnZXRsYi5jCmluZGV4IDFkNzA5ZmYuLmEwODhmNTkgMTAwNjQ0Ci0tLSBhL21tL2h1Z2V0bGIuYworKysgYi9tbS9odWdldGxiLmMKQEAgLTM1Niw4ICszNTYsOCBAQAogCXJldHVybiAtRU5PTUVNOwogfQogCi12b2lkIHVubWFwX2h1Z2VwYWdlX3JhbmdlKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCB1bnNpZ25lZCBsb25nIHN0YXJ0LAotCQkJICB1bnNpZ25lZCBsb25nIGVuZCkKK3ZvaWQgX191bm1hcF9odWdlcGFnZV9yYW5nZShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgdW5zaWduZWQgbG9uZyBzdGFydCwKKwkJCSAgICB1bnNpZ25lZCBsb25nIGVuZCkKIHsKIAlzdHJ1Y3QgbW1fc3RydWN0ICptbSA9IHZtYS0+dm1fbW07CiAJdW5zaWduZWQgbG9uZyBhZGRyZXNzOwpAQCAtMzk4LDYgKzM5OCwyNCBAQAogCX0KIH0KIAordm9pZCB1bm1hcF9odWdlcGFnZV9yYW5nZShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgdW5zaWduZWQgbG9uZyBzdGFydCwKKwkJCSAgdW5zaWduZWQgbG9uZyBlbmQpCit7CisJLyoKKwkgKiBJdCBpcyB1bmRlc2lyYWJsZSB0byB0ZXN0IHZtYS0+dm1fZmlsZSBhcyBpdCBzaG91bGQgYmUgbm9uLW51bGwKKwkgKiBmb3IgdmFsaWQgaHVnZXRsYiBhcmVhLiBIb3dldmVyLCB2bV9maWxlIHdpbGwgYmUgTlVMTCBpbiB0aGUgZXJyb3IKKwkgKiBjbGVhbnVwIHBhdGggb2YgZG9fbW1hcF9wZ29mZi4gV2hlbiBodWdldGxiZnMgLT5tbWFwIG1ldGhvZCBmYWlscywKKwkgKiBkb19tbWFwX3Bnb2ZmKCkgbnVsbGlmaWVzIHZtYS0+dm1fZmlsZSBiZWZvcmUgY2FsbGluZyB0aGlzIGZ1bmN0aW9uCisJICogdG8gY2xlYW4gdXAuIFNpbmNlIG5vIHB0ZSBoYXMgYWN0dWFsbHkgYmVlbiBzZXR1cCwgaXQgaXMgc2FmZSB0bworCSAqIGRvIG5vdGhpbmcgaW4gdGhpcyBjYXNlLgorCSAqLworCWlmICh2bWEtPnZtX2ZpbGUpIHsKKwkJc3Bpbl9sb2NrKCZ2bWEtPnZtX2ZpbGUtPmZfbWFwcGluZy0+aV9tbWFwX2xvY2spOworCQlfX3VubWFwX2h1Z2VwYWdlX3JhbmdlKHZtYSwgc3RhcnQsIGVuZCk7CisJCXNwaW5fdW5sb2NrKCZ2bWEtPnZtX2ZpbGUtPmZfbWFwcGluZy0+aV9tbWFwX2xvY2spOworCX0KK30KKwogc3RhdGljIGludCBodWdldGxiX2NvdyhzdHJ1Y3QgbW1fc3RydWN0ICptbSwgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsCiAJCQl1bnNpZ25lZCBsb25nIGFkZHJlc3MsIHB0ZV90ICpwdGVwLCBwdGVfdCBwdGUpCiB7CkBAIC00NjAsNiArNDc4LDkgQEAKIHJldHJ5OgogCXBhZ2UgPSBmaW5kX2xvY2tfcGFnZShtYXBwaW5nLCBpZHgpOwogCWlmICghcGFnZSkgeworCQlzaXplID0gaV9zaXplX3JlYWQobWFwcGluZy0+aG9zdCkgPj4gSFBBR0VfU0hJRlQ7CisJCWlmIChpZHggPj0gc2l6ZSkKKwkJCWdvdG8gb3V0OwogCQlpZiAoaHVnZXRsYl9nZXRfcXVvdGEobWFwcGluZykpCiAJCQlnb3RvIG91dDsKIAkJcGFnZSA9IGFsbG9jX2h1Z2VfcGFnZSh2bWEsIGFkZHJlc3MpOwpkaWZmIC0tZ2l0IGEvbW0vbWVtb3J5LmMgYi9tbS9tZW1vcnkuYwppbmRleCBiNWE0YWFkLi4xNTY4NjFmIDEwMDY0NAotLS0gYS9tbS9tZW1vcnkuYworKysgYi9tbS9tZW1vcnkuYwpAQCAtMTQ1Miw2ICsxNDUyLDcgQEAKIAkJaWYgKF9fY29weV9mcm9tX3VzZXJfaW5hdG9taWMoa2FkZHIsIHVhZGRyLCBQQUdFX1NJWkUpKQogCQkJbWVtc2V0KGthZGRyLCAwLCBQQUdFX1NJWkUpOwogCQlrdW5tYXBfYXRvbWljKGthZGRyLCBLTV9VU0VSMCk7CisJCWZsdXNoX2RjYWNoZV9wYWdlKGRzdCk7CiAJCXJldHVybjsKIAkJCiAJfQpkaWZmIC0tZ2l0IGEvbW0vbWVtcG9saWN5LmMgYi9tbS9tZW1wb2xpY3kuYwppbmRleCAyNTc4OGIxLi42MTdmYjMxIDEwMDY0NAotLS0gYS9tbS9tZW1wb2xpY3kuYworKysgYi9tbS9tZW1wb2xpY3kuYwpAQCAtNzI3LDcgKzcyNyw3IEBACiAJcmV0dXJuIC1FTk9TWVM7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgcGFnZSAqbmV3X3ZtYV9wYWdlKHN0cnVjdCBwYWdlICpwYWdlLCB1bnNpZ25lZCBsb25nIHByaXZhdGUpCitzdGF0aWMgc3RydWN0IHBhZ2UgKm5ld192bWFfcGFnZShzdHJ1Y3QgcGFnZSAqcGFnZSwgdW5zaWduZWQgbG9uZyBwcml2YXRlLCBpbnQgKip4KQogewogCXJldHVybiBOVUxMOwogfQpkaWZmIC0tZ2l0IGEvbW0vbWlncmF0ZS5jIGIvbW0vbWlncmF0ZS5jCmluZGV4IGJhMjQ1M2YuLmI0OTc5ZDQgMTAwNjQ0Ci0tLSBhL21tL21pZ3JhdGUuYworKysgYi9tbS9taWdyYXRlLmMKQEAgLTk1Miw3ICs5NTIsOCBAQAogCQkJCWdvdG8gb3V0OwogCiAJCQlwbVtpXS5ub2RlID0gbm9kZTsKLQkJfQorCQl9IGVsc2UKKwkJCXBtW2ldLm5vZGUgPSAwOwkvKiBhbnl0aGluZyB0byBub3QgbWF0Y2ggTUFYX05VTU5PREVTICovCiAJfQogCS8qIEVuZCBtYXJrZXIgKi8KIAlwbVtucl9wYWdlc10ubm9kZSA9IE1BWF9OVU1OT0RFUzsKZGlmZiAtLWdpdCBhL21tL21tYXAuYyBiL21tL21tYXAuYwppbmRleCBlZWE4ZWVmLi43YjQwYWJkIDEwMDY0NAotLS0gYS9tbS9tbWFwLmMKKysrIGIvbW0vbW1hcC5jCkBAIC05MDAsMTcgKzkwMCw2IEBACiAJaW50IGFjY291bnRhYmxlID0gMTsKIAl1bnNpZ25lZCBsb25nIGNoYXJnZWQgPSAwLCByZXFwcm90ID0gcHJvdDsKIAotCWlmIChmaWxlKSB7Ci0JCWlmIChpc19maWxlX2h1Z2VwYWdlcyhmaWxlKSkKLQkJCWFjY291bnRhYmxlID0gMDsKLQotCQlpZiAoIWZpbGUtPmZfb3AgfHwgIWZpbGUtPmZfb3AtPm1tYXApCi0JCQlyZXR1cm4gLUVOT0RFVjsKLQotCQlpZiAoKHByb3QgJiBQUk9UX0VYRUMpICYmCi0JCSAgICAoZmlsZS0+Zl92ZnNtbnQtPm1udF9mbGFncyAmIE1OVF9OT0VYRUMpKQotCQkJcmV0dXJuIC1FUEVSTTsKLQl9CiAJLyoKIAkgKiBEb2VzIHRoZSBhcHBsaWNhdGlvbiBleHBlY3QgUFJPVF9SRUFEIHRvIGltcGx5IFBST1RfRVhFQz8KIAkgKgpAQCAtMTAwMCw2ICs5ODksMTYgQEAKIAkJY2FzZSBNQVBfUFJJVkFURToKIAkJCWlmICghKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpKQogCQkJCXJldHVybiAtRUFDQ0VTOworCQkJaWYgKGZpbGUtPmZfdmZzbW50LT5tbnRfZmxhZ3MgJiBNTlRfTk9FWEVDKSB7CisJCQkJaWYgKHZtX2ZsYWdzICYgVk1fRVhFQykKKwkJCQkJcmV0dXJuIC1FUEVSTTsKKwkJCQl2bV9mbGFncyAmPSB+Vk1fTUFZRVhFQzsKKwkJCX0KKwkJCWlmIChpc19maWxlX2h1Z2VwYWdlcyhmaWxlKSkKKwkJCQlhY2NvdW50YWJsZSA9IDA7CisKKwkJCWlmICghZmlsZS0+Zl9vcCB8fCAhZmlsZS0+Zl9vcC0+bW1hcCkKKwkJCQlyZXR1cm4gLUVOT0RFVjsKIAkJCWJyZWFrOwogCiAJCWRlZmF1bHQ6CkBAIC0xMzgwLDcgKzEzNzksNyBAQAogCQkgKiBDaGVjayBpZiB0aGUgZ2l2ZW4gcmFuZ2UgaXMgaHVnZXBhZ2UgYWxpZ25lZCwgYW5kCiAJCSAqIGNhbiBiZSBtYWRlIHN1aXRhYmxlIGZvciBodWdlcGFnZXMuCiAJCSAqLwotCQlyZXQgPSBwcmVwYXJlX2h1Z2VwYWdlX3JhbmdlKGFkZHIsIGxlbik7CisJCXJldCA9IHByZXBhcmVfaHVnZXBhZ2VfcmFuZ2UoYWRkciwgbGVuLCBwZ29mZik7CiAJfSBlbHNlIHsKIAkJLyoKIAkJICogRW5zdXJlIHRoYXQgYSBub3JtYWwgcmVxdWVzdCBpcyBub3QgZmFsbGluZyBpbiBhCkBAIC0xODgxLDYgKzE4ODAsOSBAQAogCWlmICgoYWRkciArIGxlbikgPiBUQVNLX1NJWkUgfHwgKGFkZHIgKyBsZW4pIDwgYWRkcikKIAkJcmV0dXJuIC1FSU5WQUw7CiAKKwlpZiAoaXNfaHVnZXBhZ2Vfb25seV9yYW5nZShtbSwgYWRkciwgbGVuKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKIAlmbGFncyA9IFZNX0RBVEFfREVGQVVMVF9GTEFHUyB8IFZNX0FDQ09VTlQgfCBtbS0+ZGVmX2ZsYWdzOwogCiAJZXJyb3IgPSBhcmNoX21tYXBfY2hlY2soYWRkciwgbGVuLCBmbGFncyk7CmRpZmYgLS1naXQgYS9tbS9vb21fa2lsbC5jIGIvbW0vb29tX2tpbGwuYwppbmRleCAyMGY0MWIwLi4yZTNjZTNhIDEwMDY0NAotLS0gYS9tbS9vb21fa2lsbC5jCisrKyBiL21tL29vbV9raWxsLmMKQEAgLTE1LDYgKzE1LDcgQEAKICAqICBrZXJuZWwgc3Vic3lzdGVtcyBhbmQgaGludHMgYXMgdG8gd2hlcmUgdG8gZmluZCBvdXQgd2hhdCB0aGluZ3MgZG8uCiAgKi8KIAorI2luY2x1ZGUgPGxpbnV4L29vbS5oPgogI2luY2x1ZGUgPGxpbnV4L21tLmg+CiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KICNpbmNsdWRlIDxsaW51eC9zd2FwLmg+CmRpZmYgLS1naXQgYS9tbS9wYWdlLXdyaXRlYmFjay5jIGIvbW0vcGFnZS13cml0ZWJhY2suYwppbmRleCBhMGYzMzkwLi44ZDliMTlmIDEwMDY0NAotLS0gYS9tbS9wYWdlLXdyaXRlYmFjay5jCisrKyBiL21tL3BhZ2Utd3JpdGViYWNrLmMKQEAgLTIyMiw3ICsyMjIsNyBAQAogCQkJaWYgKHBhZ2VzX3dyaXR0ZW4gPj0gd3JpdGVfY2h1bmspCiAJCQkJYnJlYWs7CQkvKiBXZSd2ZSBkb25lIG91ciBkdXR5ICovCiAJCX0KLQkJYmxrX2Nvbmdlc3Rpb25fd2FpdChXUklURSwgSFovMTApOworCQljb25nZXN0aW9uX3dhaXQoV1JJVEUsIEhaLzEwKTsKIAl9CiAKIAlpZiAobnJfcmVjbGFpbWFibGUgKyBnbG9iYWxfcGFnZV9zdGF0ZShOUl9XUklURUJBQ0spCkBAIC0zMTQsNyArMzE0LDcgQEAKICAgICAgICAgICAgICAgICBpZiAoZ2xvYmFsX3BhZ2Vfc3RhdGUoTlJfVU5TVEFCTEVfTkZTKSArCiAJCQlnbG9iYWxfcGFnZV9zdGF0ZShOUl9XUklURUJBQ0spIDw9IGRpcnR5X3RocmVzaCkKICAgICAgICAgICAgICAgICAgICAgICAgIAlicmVhazsKLSAgICAgICAgICAgICAgICBibGtfY29uZ2VzdGlvbl93YWl0KFdSSVRFLCBIWi8xMCk7CisgICAgICAgICAgICAgICAgY29uZ2VzdGlvbl93YWl0KFdSSVRFLCBIWi8xMCk7CiAgICAgICAgIH0KIH0KIApAQCAtMzUxLDcgKzM1MSw3IEBACiAJCW1pbl9wYWdlcyAtPSBNQVhfV1JJVEVCQUNLX1BBR0VTIC0gd2JjLm5yX3RvX3dyaXRlOwogCQlpZiAod2JjLm5yX3RvX3dyaXRlID4gMCB8fCB3YmMucGFnZXNfc2tpcHBlZCA+IDApIHsKIAkJCS8qIFdyb3RlIGxlc3MgdGhhbiBleHBlY3RlZCAqLwotCQkJYmxrX2Nvbmdlc3Rpb25fd2FpdChXUklURSwgSFovMTApOworCQkJY29uZ2VzdGlvbl93YWl0KFdSSVRFLCBIWi8xMCk7CiAJCQlpZiAoIXdiYy5lbmNvdW50ZXJlZF9jb25nZXN0aW9uKQogCQkJCWJyZWFrOwogCQl9CkBAIC00MjIsNyArNDIyLDcgQEAKIAkJd3JpdGViYWNrX2lub2Rlcygmd2JjKTsKIAkJaWYgKHdiYy5ucl90b193cml0ZSA+IDApIHsKIAkJCWlmICh3YmMuZW5jb3VudGVyZWRfY29uZ2VzdGlvbikKLQkJCQlibGtfY29uZ2VzdGlvbl93YWl0KFdSSVRFLCBIWi8xMCk7CisJCQkJY29uZ2VzdGlvbl93YWl0KFdSSVRFLCBIWi8xMCk7CiAJCQllbHNlCiAJCQkJYnJlYWs7CS8qIEFsbCB0aGUgb2xkIGRhdGEgaXMgd3JpdHRlbiAqLwogCQl9CkBAIC05NTYsMTUgKzk1Niw2IEBACiBFWFBPUlRfU1lNQk9MKHRlc3Rfc2V0X3BhZ2Vfd3JpdGViYWNrKTsKIAogLyoKLSAqIFdha2VzIHVwIHRhc2tzIHRoYXQgYXJlIGJlaW5nIHRocm90dGxlZCBkdWUgdG8gd3JpdGViYWNrIGNvbmdlc3Rpb24KLSAqLwotdm9pZCB3cml0ZWJhY2tfY29uZ2VzdGlvbl9lbmQodm9pZCkKLXsKLQlibGtfY29uZ2VzdGlvbl9lbmQoV1JJVEUpOwotfQotRVhQT1JUX1NZTUJPTCh3cml0ZWJhY2tfY29uZ2VzdGlvbl9lbmQpOwotCi0vKgogICogUmV0dXJuIHRydWUgaWYgYW55IG9mIHRoZSBwYWdlcyBpbiB0aGUgbWFwcGluZyBhcmUgbWFyZ2VkIHdpdGggdGhlCiAgKiBwYXNzZWQgdGFnLgogICovCmRpZmYgLS1naXQgYS9tbS9wYWdlX2FsbG9jLmMgYi9tbS9wYWdlX2FsbG9jLmMKaW5kZXggYThjMDAzZS4uYmYyZjZjZiAxMDA2NDQKLS0tIGEvbW0vcGFnZV9hbGxvYy5jCisrKyBiL21tL3BhZ2VfYWxsb2MuYwpAQCAtMzksNiArMzksNyBAQAogI2luY2x1ZGUgPGxpbnV4L3N0b3BfbWFjaGluZS5oPgogI2luY2x1ZGUgPGxpbnV4L3NvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9wZm4uaD4KKyNpbmNsdWRlIDxsaW51eC9iYWNraW5nLWRldi5oPgogCiAjaW5jbHVkZSA8YXNtL3RsYmZsdXNoLmg+CiAjaW5jbHVkZSA8YXNtL2RpdjY0Lmg+CkBAIC00OTUsMTcgKzQ5NiwxNiBAQAogCWludCBpOwogCWludCByZXNlcnZlZCA9IDA7CiAKLQlhcmNoX2ZyZWVfcGFnZShwYWdlLCBvcmRlcik7Ci0JaWYgKCFQYWdlSGlnaE1lbShwYWdlKSkKLQkJZGVidWdfY2hlY2tfbm9fbG9ja3NfZnJlZWQocGFnZV9hZGRyZXNzKHBhZ2UpLAotCQkJCQkgICBQQUdFX1NJWkU8PG9yZGVyKTsKLQogCWZvciAoaSA9IDAgOyBpIDwgKDEgPDwgb3JkZXIpIDsgKytpKQogCQlyZXNlcnZlZCArPSBmcmVlX3BhZ2VzX2NoZWNrKHBhZ2UgKyBpKTsKIAlpZiAocmVzZXJ2ZWQpCiAJCXJldHVybjsKIAorCWlmICghUGFnZUhpZ2hNZW0ocGFnZSkpCisJCWRlYnVnX2NoZWNrX25vX2xvY2tzX2ZyZWVkKHBhZ2VfYWRkcmVzcyhwYWdlKSxQQUdFX1NJWkU8PG9yZGVyKTsKKwlhcmNoX2ZyZWVfcGFnZShwYWdlLCBvcmRlcik7CiAJa2VybmVsX21hcF9wYWdlcyhwYWdlLCAxIDw8IG9yZGVyLCAwKTsKKwogCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKIAlfX2NvdW50X3ZtX2V2ZW50cyhQR0ZSRUUsIDEgPDwgb3JkZXIpOwogCWZyZWVfb25lX3BhZ2UocGFnZV96b25lKHBhZ2UpLCBwYWdlLCBvcmRlcik7CkBAIC03ODEsMTMgKzc4MSwxNCBAQAogCXN0cnVjdCBwZXJfY3B1X3BhZ2VzICpwY3A7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAotCWFyY2hfZnJlZV9wYWdlKHBhZ2UsIDApOwotCiAJaWYgKFBhZ2VBbm9uKHBhZ2UpKQogCQlwYWdlLT5tYXBwaW5nID0gTlVMTDsKIAlpZiAoZnJlZV9wYWdlc19jaGVjayhwYWdlKSkKIAkJcmV0dXJuOwogCisJaWYgKCFQYWdlSGlnaE1lbShwYWdlKSkKKwkJZGVidWdfY2hlY2tfbm9fbG9ja3NfZnJlZWQocGFnZV9hZGRyZXNzKHBhZ2UpLCBQQUdFX1NJWkUpOworCWFyY2hfZnJlZV9wYWdlKHBhZ2UsIDApOwogCWtlcm5lbF9tYXBfcGFnZXMocGFnZSwgMSwgMCk7CiAKIAlwY3AgPSAmem9uZV9wY3Aoem9uZSwgZ2V0X2NwdSgpKS0+cGNwW2NvbGRdOwpAQCAtODUyLDcgKzg1Myw3IEBACiAJCXBjcCA9ICZ6b25lX3BjcCh6b25lLCBjcHUpLT5wY3BbY29sZF07CiAJCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKIAkJaWYgKCFwY3AtPmNvdW50KSB7Ci0JCQlwY3AtPmNvdW50ICs9IHJtcXVldWVfYnVsayh6b25lLCAwLAorCQkJcGNwLT5jb3VudCA9IHJtcXVldWVfYnVsayh6b25lLCAwLAogCQkJCQkJcGNwLT5iYXRjaCwgJnBjcC0+bGlzdCk7CiAJCQlpZiAodW5saWtlbHkoIXBjcC0+Y291bnQpKQogCQkJCWdvdG8gZmFpbGVkOwpAQCAtMTA1MCw3ICsxMDUxLDcgQEAKIAkJCWlmIChwYWdlKQogCQkJCWdvdG8gZ290X3BnOwogCQkJaWYgKGdmcF9tYXNrICYgX19HRlBfTk9GQUlMKSB7Ci0JCQkJYmxrX2Nvbmdlc3Rpb25fd2FpdChXUklURSwgSFovNTApOworCQkJCWNvbmdlc3Rpb25fd2FpdChXUklURSwgSFovNTApOwogCQkJCWdvdG8gbm9mYWlsX2FsbG9jOwogCQkJfQogCQl9CkBAIC0xMTEzLDcgKzExMTQsNyBAQAogCQkJZG9fcmV0cnkgPSAxOwogCX0KIAlpZiAoZG9fcmV0cnkpIHsKLQkJYmxrX2Nvbmdlc3Rpb25fd2FpdChXUklURSwgSFovNTApOworCQljb25nZXN0aW9uX3dhaXQoV1JJVEUsIEhaLzUwKTsKIAkJZ290byByZWJhbGFuY2U7CiAJfQogCkBAIC0xNjg4LDYgKzE2ODksOCBAQAogCWZvciAocGZuID0gc3RhcnRfcGZuOyBwZm4gPCBlbmRfcGZuOyBwZm4rKykgewogCQlpZiAoIWVhcmx5X3Bmbl92YWxpZChwZm4pKQogCQkJY29udGludWU7CisJCWlmICghZWFybHlfcGZuX2luX25pZChwZm4sIG5pZCkpCisJCQljb250aW51ZTsKIAkJcGFnZSA9IHBmbl90b19wYWdlKHBmbik7CiAJCXNldF9wYWdlX2xpbmtzKHBhZ2UsIHpvbmUsIG5pZCwgcGZuKTsKIAkJaW5pdF9wYWdlX2NvdW50KHBhZ2UpOwpAQCAtMjI1OCw3ICsyMjYxLDcgQEAKIAogCS8qIEFjY291bnQgZm9yIHJhbmdlcyBwYXN0IHBoeXNpY2FsIG1lbW9yeSBvbiB0aGlzIG5vZGUgKi8KIAlpZiAocmFuZ2VfZW5kX3BmbiA+IHByZXZfZW5kX3BmbikKLQkJaG9sZV9wYWdlcyA9IHJhbmdlX2VuZF9wZm4gLQorCQlob2xlX3BhZ2VzICs9IHJhbmdlX2VuZF9wZm4gLQogCQkJCW1heChyYW5nZV9zdGFydF9wZm4sIHByZXZfZW5kX3Bmbik7CiAKIAlyZXR1cm4gaG9sZV9wYWdlczsKQEAgLTIyOTQsMTkgKzIyOTcsNiBAQAogCXJldHVybiBfX2Fic2VudF9wYWdlc19pbl9yYW5nZShuaWQsIHpvbmVfc3RhcnRfcGZuLCB6b25lX2VuZF9wZm4pOwogfQogCi0vKiBSZXR1cm4gdGhlIHpvbmUgaW5kZXggYSBQRk4gaXMgaW4gKi8KLWludCBtZW1tYXBfem9uZV9pZHgoc3RydWN0IHBhZ2UgKmxtZW1fbWFwKQotewotCWludCBpOwotCXVuc2lnbmVkIGxvbmcgcGh5c19hZGRyID0gdmlydF90b19waHlzKGxtZW1fbWFwKTsKLQl1bnNpZ25lZCBsb25nIHBmbiA9IHBoeXNfYWRkciA+PiBQQUdFX1NISUZUOwotCi0JZm9yIChpID0gMDsgaSA8IE1BWF9OUl9aT05FUzsgaSsrKQotCQlpZiAocGZuIDwgYXJjaF96b25lX2hpZ2hlc3RfcG9zc2libGVfcGZuW2ldKQotCQkJYnJlYWs7Ci0KLQlyZXR1cm4gaTsKLX0KICNlbHNlCiBzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgem9uZV9zcGFubmVkX3BhZ2VzX2luX25vZGUoaW50IG5pZCwKIAkJCQkJdW5zaWduZWQgbG9uZyB6b25lX3R5cGUsCkBAIC0yMzI1LDEwICsyMzE1LDYgQEAKIAlyZXR1cm4gemhvbGVzX3NpemVbem9uZV90eXBlXTsKIH0KIAotc3RhdGljIGlubGluZSBpbnQgbWVtbWFwX3pvbmVfaWR4KHN0cnVjdCBwYWdlICpsbWVtX21hcCkKLXsKLQlyZXR1cm4gTUFYX05SX1pPTkVTOwotfQogI2VuZGlmCiAKIHN0YXRpYyB2b2lkIF9faW5pdCBjYWxjdWxhdGVfbm9kZV90b3RhbHBhZ2VzKHN0cnVjdCBwZ2xpc3RfZGF0YSAqcGdkYXQsCkBAIC0yNDIxLDcgKzI0MDcsNyBAQAogCQl6b25lLT56b25lX3BnZGF0ID0gcGdkYXQ7CiAJCXpvbmUtPmZyZWVfcGFnZXMgPSAwOwogCi0JCXpvbmUtPnRlbXBfcHJpb3JpdHkgPSB6b25lLT5wcmV2X3ByaW9yaXR5ID0gREVGX1BSSU9SSVRZOworCQl6b25lLT5wcmV2X3ByaW9yaXR5ID0gREVGX1BSSU9SSVRZOwogCiAJCXpvbmVfcGNwX2luaXQoem9uZSk7CiAJCUlOSVRfTElTVF9IRUFEKCZ6b25lLT5hY3RpdmVfbGlzdCk7CkBAIC0zMTM2LDMgKzMxMjIsMTkgQEAKIEVYUE9SVF9TWU1CT0wocGZuX3RvX3BhZ2UpOwogRVhQT1JUX1NZTUJPTChwYWdlX3RvX3Bmbik7CiAjZW5kaWYgLyogQ09ORklHX09VVF9PRl9MSU5FX1BGTl9UT19QQUdFICovCisKKyNpZiBNQVhfTlVNTk9ERVMgPiAxCisvKgorICogRmluZCB0aGUgaGlnaGVzdCBwb3NzaWJsZSBub2RlIGlkLgorICovCitpbnQgaGlnaGVzdF9wb3NzaWJsZV9ub2RlX2lkKHZvaWQpCit7CisJdW5zaWduZWQgaW50IG5vZGU7CisJdW5zaWduZWQgaW50IGhpZ2hlc3QgPSAwOworCisJZm9yX2VhY2hfbm9kZV9tYXNrKG5vZGUsIG5vZGVfcG9zc2libGVfbWFwKQorCQloaWdoZXN0ID0gbm9kZTsKKwlyZXR1cm4gaGlnaGVzdDsKK30KK0VYUE9SVF9TWU1CT0woaGlnaGVzdF9wb3NzaWJsZV9ub2RlX2lkKTsKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbW0vcmVhZGFoZWFkLmMgYi9tbS9yZWFkYWhlYWQuYwppbmRleCAxYmE3MzZhLi4yM2NiNjFhIDEwMDY0NAotLS0gYS9tbS9yZWFkYWhlYWQuYworKysgYi9tbS9yZWFkYWhlYWQuYwpAQCAtMTczLDYgKzE3Myw4IEBACiAKIAlpZiAobWFwcGluZy0+YV9vcHMtPnJlYWRwYWdlcykgewogCQlyZXQgPSBtYXBwaW5nLT5hX29wcy0+cmVhZHBhZ2VzKGZpbHAsIG1hcHBpbmcsIHBhZ2VzLCBucl9wYWdlcyk7CisJCS8qIENsZWFuIHVwIHRoZSByZW1haW5pbmcgcGFnZXMgKi8KKwkJcHV0X3BhZ2VzX2xpc3QocGFnZXMpOwogCQlnb3RvIG91dDsKIAl9CiAKZGlmZiAtLWdpdCBhL21tL3JtYXAuYyBiL21tL3JtYXAuYwppbmRleCBlMjE1NWQ3Li5kOGE4NDJhIDEwMDY0NAotLS0gYS9tbS9ybWFwLmMKKysrIGIvbW0vcm1hcC5jCkBAIC0yMSwyNyArMjEsMjEgQEAKICAqIExvY2sgb3JkZXJpbmcgaW4gbW06CiAgKgogICogaW5vZGUtPmlfbXV0ZXgJKHdoaWxlIHdyaXRpbmcgb3IgdHJ1bmNhdGluZywgbm90IHJlYWRpbmcgb3IgZmF1bHRpbmcpCi0gKiAgIGlub2RlLT5pX2FsbG9jX3NlbQotICoKLSAqIFdoZW4gYSBwYWdlIGZhdWx0IG9jY3VycyBpbiB3cml0aW5nIGZyb20gdXNlciB0byBmaWxlLCBkb3duX3JlYWQKLSAqIG9mIG1tYXBfc2VtIG5lc3RzIHdpdGhpbiBpX211dGV4OyBpbiBzeXNfbXN5bmMsIGlfbXV0ZXggbmVzdHMgd2l0aGluCi0gKiBkb3duX3JlYWQgb2YgbW1hcF9zZW07IGlfbXV0ZXggYW5kIGRvd25fd3JpdGUgb2YgbW1hcF9zZW0gYXJlIG5ldmVyCi0gKiB0YWtlbiB0b2dldGhlcjsgaW4gdHJ1bmNhdGlvbiwgaV9tdXRleCBpcyB0YWtlbiBvdXRlcm1vc3QuCi0gKgotICogbW0tPm1tYXBfc2VtCi0gKiAgIHBhZ2UtPmZsYWdzIFBHX2xvY2tlZCAobG9ja19wYWdlKQotICogICAgIG1hcHBpbmctPmlfbW1hcF9sb2NrCi0gKiAgICAgICBhbm9uX3ZtYS0+bG9jawotICogICAgICAgICBtbS0+cGFnZV90YWJsZV9sb2NrIG9yIHB0ZV9sb2NrCi0gKiAgICAgICAgICAgem9uZS0+bHJ1X2xvY2sgKGluIG1hcmtfcGFnZV9hY2Nlc3NlZCwgaXNvbGF0ZV9scnVfcGFnZSkKLSAqICAgICAgICAgICBzd2FwX2xvY2sgKGluIHN3YXBfZHVwbGljYXRlLCBzd2FwX2luZm9fZ2V0KQotICogICAgICAgICAgICAgbW1saXN0X2xvY2sgKGluIG1tcHV0LCBkcmFpbl9tbWxpc3QgYW5kIG90aGVycykKLSAqICAgICAgICAgICAgIG1hcHBpbmctPnByaXZhdGVfbG9jayAoaW4gX19zZXRfcGFnZV9kaXJ0eV9idWZmZXJzKQotICogICAgICAgICAgICAgaW5vZGVfbG9jayAoaW4gc2V0X3BhZ2VfZGlydHkncyBfX21hcmtfaW5vZGVfZGlydHkpCi0gKiAgICAgICAgICAgICAgIHNiX2xvY2sgKHdpdGhpbiBpbm9kZV9sb2NrIGluIGZzL2ZzLXdyaXRlYmFjay5jKQotICogICAgICAgICAgICAgICBtYXBwaW5nLT50cmVlX2xvY2sgKHdpZGVseSB1c2VkLCBpbiBzZXRfcGFnZV9kaXJ0eSwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgIGluIGFyY2gtZGVwZW5kZW50IGZsdXNoX2RjYWNoZV9tbWFwX2xvY2ssCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICB3aXRoaW4gaW5vZGVfbG9jayBpbiBfX3N5bmNfc2luZ2xlX2lub2RlKQorICogICBpbm9kZS0+aV9hbGxvY19zZW0gKHZtdHJ1bmNhdGVfcmFuZ2UpCisgKiAgIG1tLT5tbWFwX3NlbQorICogICAgIHBhZ2UtPmZsYWdzIFBHX2xvY2tlZCAobG9ja19wYWdlKQorICogICAgICAgbWFwcGluZy0+aV9tbWFwX2xvY2sKKyAqICAgICAgICAgYW5vbl92bWEtPmxvY2sKKyAqICAgICAgICAgICBtbS0+cGFnZV90YWJsZV9sb2NrIG9yIHB0ZV9sb2NrCisgKiAgICAgICAgICAgICB6b25lLT5scnVfbG9jayAoaW4gbWFya19wYWdlX2FjY2Vzc2VkLCBpc29sYXRlX2xydV9wYWdlKQorICogICAgICAgICAgICAgc3dhcF9sb2NrIChpbiBzd2FwX2R1cGxpY2F0ZSwgc3dhcF9pbmZvX2dldCkKKyAqICAgICAgICAgICAgICAgbW1saXN0X2xvY2sgKGluIG1tcHV0LCBkcmFpbl9tbWxpc3QgYW5kIG90aGVycykKKyAqICAgICAgICAgICAgICAgbWFwcGluZy0+cHJpdmF0ZV9sb2NrIChpbiBfX3NldF9wYWdlX2RpcnR5X2J1ZmZlcnMpCisgKiAgICAgICAgICAgICAgIGlub2RlX2xvY2sgKGluIHNldF9wYWdlX2RpcnR5J3MgX19tYXJrX2lub2RlX2RpcnR5KQorICogICAgICAgICAgICAgICAgIHNiX2xvY2sgKHdpdGhpbiBpbm9kZV9sb2NrIGluIGZzL2ZzLXdyaXRlYmFjay5jKQorICogICAgICAgICAgICAgICAgIG1hcHBpbmctPnRyZWVfbG9jayAod2lkZWx5IHVzZWQsIGluIHNldF9wYWdlX2RpcnR5LAorICogICAgICAgICAgICAgICAgICAgICAgICAgICBpbiBhcmNoLWRlcGVuZGVudCBmbHVzaF9kY2FjaGVfbW1hcF9sb2NrLAorICogICAgICAgICAgICAgICAgICAgICAgICAgICB3aXRoaW4gaW5vZGVfbG9jayBpbiBfX3N5bmNfc2luZ2xlX2lub2RlKQogICovCiAKICNpbmNsdWRlIDxsaW51eC9tbS5oPgpAQCAtNTc2LDE1ICs1NzAsMTQgQEAKIHZvaWQgcGFnZV9yZW1vdmVfcm1hcChzdHJ1Y3QgcGFnZSAqcGFnZSkKIHsKIAlpZiAoYXRvbWljX2FkZF9uZWdhdGl2ZSgtMSwgJnBhZ2UtPl9tYXBjb3VudCkpIHsKLSNpZmRlZiBDT05GSUdfREVCVUdfVk0KIAkJaWYgKHVubGlrZWx5KHBhZ2VfbWFwY291bnQocGFnZSkgPCAwKSkgewogCQkJcHJpbnRrIChLRVJOX0VNRVJHICJFZWVrISBwYWdlX21hcGNvdW50KHBhZ2UpIHdlbnQgbmVnYXRpdmUhICglZClcbiIsIHBhZ2VfbWFwY291bnQocGFnZSkpOwogCQkJcHJpbnRrIChLRVJOX0VNRVJHICIgIHBhZ2UtPmZsYWdzID0gJWx4XG4iLCBwYWdlLT5mbGFncyk7CiAJCQlwcmludGsgKEtFUk5fRU1FUkcgIiAgcGFnZS0+Y291bnQgPSAleFxuIiwgcGFnZV9jb3VudChwYWdlKSk7CiAJCQlwcmludGsgKEtFUk5fRU1FUkcgIiAgcGFnZS0+bWFwcGluZyA9ICVwXG4iLCBwYWdlLT5tYXBwaW5nKTsKKwkJCUJVRygpOwogCQl9Ci0jZW5kaWYKLQkJQlVHX09OKHBhZ2VfbWFwY291bnQocGFnZSkgPCAwKTsKKwogCQkvKgogCQkgKiBJdCB3b3VsZCBiZSB0aWR5IHRvIHJlc2V0IHRoZSBQYWdlQW5vbiBtYXBwaW5nIGhlcmUsCiAJCSAqIGJ1dCB0aGF0IG1pZ2h0IG92ZXJ3cml0ZSBhIHJhY2luZyBwYWdlX2FkZF9hbm9uX3JtYXAKZGlmZiAtLWdpdCBhL21tL3NobWVtLmMgYi9tbS9zaG1lbS5jCmluZGV4IGJiOGNhN2UuLjQ5NTk1MzUgMTAwNjQ0Ci0tLSBhL21tL3NobWVtLmMKKysrIGIvbW0vc2htZW0uYwpAQCAtNDgsNiArNDgsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2N0eXBlLmg+CiAjaW5jbHVkZSA8bGludXgvbWlncmF0ZS5oPgogI2luY2x1ZGUgPGxpbnV4L2hpZ2htZW0uaD4KKyNpbmNsdWRlIDxsaW51eC9iYWNraW5nLWRldi5oPgogCiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KICNpbmNsdWRlIDxhc20vZGl2NjQuaD4KQEAgLTExMzEsNyArMTEzMiw3IEBACiAJCQlwYWdlX2NhY2hlX3JlbGVhc2Uoc3dhcHBhZ2UpOwogCQkJaWYgKGVycm9yID09IC1FTk9NRU0pIHsKIAkJCQkvKiBsZXQga3N3YXBkIHJlZnJlc2ggem9uZSBmb3IgR0ZQX0FUT01JQ3MgKi8KLQkJCQlibGtfY29uZ2VzdGlvbl93YWl0KFdSSVRFLCBIWi81MCk7CisJCQkJY29uZ2VzdGlvbl93YWl0KFdSSVRFLCBIWi81MCk7CiAJCQl9CiAJCQlnb3RvIHJlcGVhdDsKIAkJfQpAQCAtMTM2Miw2ICsxMzYzLDcgQEAKIAkJaW5vZGUtPmlfbWFwcGluZy0+YV9vcHMgPSAmc2htZW1fYW9wczsKIAkJaW5vZGUtPmlfbWFwcGluZy0+YmFja2luZ19kZXZfaW5mbyA9ICZzaG1lbV9iYWNraW5nX2Rldl9pbmZvOwogCQlpbm9kZS0+aV9hdGltZSA9IGlub2RlLT5pX210aW1lID0gaW5vZGUtPmlfY3RpbWUgPSBDVVJSRU5UX1RJTUU7CisJCWlub2RlLT5pX2dlbmVyYXRpb24gPSBnZXRfc2Vjb25kcygpOwogCQlpbmZvID0gU0hNRU1fSShpbm9kZSk7CiAJCW1lbXNldChpbmZvLCAwLCAoY2hhciAqKWlub2RlIC0gKGNoYXIgKilpbmZvKTsKIAkJc3Bpbl9sb2NrX2luaXQoJmluZm8tPmxvY2spOwpAQCAtMTk1Niw2ICsxOTU4LDg1IEBACiB9OwogI2VuZGlmCiAKK3N0YXRpYyBzdHJ1Y3QgZGVudHJ5ICpzaG1lbV9nZXRfcGFyZW50KHN0cnVjdCBkZW50cnkgKmNoaWxkKQoreworCXJldHVybiBFUlJfUFRSKC1FU1RBTEUpOworfQorCitzdGF0aWMgaW50IHNobWVtX21hdGNoKHN0cnVjdCBpbm9kZSAqaW5vLCB2b2lkICp2ZmgpCit7CisJX191MzIgKmZoID0gdmZoOworCV9fdTY0IGludW0gPSBmaFsyXTsKKwlpbnVtID0gKGludW0gPDwgMzIpIHwgZmhbMV07CisJcmV0dXJuIGluby0+aV9pbm8gPT0gaW51bSAmJiBmaFswXSA9PSBpbm8tPmlfZ2VuZXJhdGlvbjsKK30KKworc3RhdGljIHN0cnVjdCBkZW50cnkgKnNobWVtX2dldF9kZW50cnkoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgdm9pZCAqdmZoKQoreworCXN0cnVjdCBkZW50cnkgKmRlID0gTlVMTDsKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlOworCV9fdTMyICpmaCA9IHZmaDsKKwlfX3U2NCBpbnVtID0gZmhbMl07CisJaW51bSA9IChpbnVtIDw8IDMyKSB8IGZoWzFdOworCisJaW5vZGUgPSBpbG9va3VwNShzYiwgKHVuc2lnbmVkIGxvbmcpKGludW0rZmhbMF0pLCBzaG1lbV9tYXRjaCwgdmZoKTsKKwlpZiAoaW5vZGUpIHsKKwkJZGUgPSBkX2ZpbmRfYWxpYXMoaW5vZGUpOworCQlpcHV0KGlub2RlKTsKKwl9CisKKwlyZXR1cm4gZGU/IGRlOiBFUlJfUFRSKC1FU1RBTEUpOworfQorCitzdGF0aWMgc3RydWN0IGRlbnRyeSAqc2htZW1fZGVjb2RlX2ZoKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIF9fdTMyICpmaCwKKwkJaW50IGxlbiwgaW50IHR5cGUsCisJCWludCAoKmFjY2VwdGFibGUpKHZvaWQgKmNvbnRleHQsIHN0cnVjdCBkZW50cnkgKmRlKSwKKwkJdm9pZCAqY29udGV4dCkKK3sKKwlpZiAobGVuIDwgMykKKwkJcmV0dXJuIEVSUl9QVFIoLUVTVEFMRSk7CisKKwlyZXR1cm4gc2ItPnNfZXhwb3J0X29wLT5maW5kX2V4cG9ydGVkX2RlbnRyeShzYiwgZmgsIE5VTEwsIGFjY2VwdGFibGUsCisJCQkJCQkJY29udGV4dCk7Cit9CisKK3N0YXRpYyBpbnQgc2htZW1fZW5jb2RlX2ZoKHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgX191MzIgKmZoLCBpbnQgKmxlbiwKKwkJCQlpbnQgY29ubmVjdGFibGUpCit7CisJc3RydWN0IGlub2RlICppbm9kZSA9IGRlbnRyeS0+ZF9pbm9kZTsKKworCWlmICgqbGVuIDwgMykKKwkJcmV0dXJuIDI1NTsKKworCWlmIChobGlzdF91bmhhc2hlZCgmaW5vZGUtPmlfaGFzaCkpIHsKKwkJLyogVW5mb3J0dW5hdGVseSBpbnNlcnRfaW5vZGVfaGFzaCBpcyBub3QgaWRlbXBvdGVudCwKKwkJICogc28gYXMgd2UgaGFzaCBpbm9kZXMgaGVyZSByYXRoZXIgdGhhbiBhdCBjcmVhdGlvbgorCQkgKiB0aW1lLCB3ZSBuZWVkIGEgbG9jayB0byBlbnN1cmUgd2Ugb25seSB0cnkKKwkJICogdG8gZG8gaXQgb25jZQorCQkgKi8KKwkJc3RhdGljIERFRklORV9TUElOTE9DSyhsb2NrKTsKKwkJc3Bpbl9sb2NrKCZsb2NrKTsKKwkJaWYgKGhsaXN0X3VuaGFzaGVkKCZpbm9kZS0+aV9oYXNoKSkKKwkJCV9faW5zZXJ0X2lub2RlX2hhc2goaW5vZGUsCisJCQkJCSAgICBpbm9kZS0+aV9pbm8gKyBpbm9kZS0+aV9nZW5lcmF0aW9uKTsKKwkJc3Bpbl91bmxvY2soJmxvY2spOworCX0KKworCWZoWzBdID0gaW5vZGUtPmlfZ2VuZXJhdGlvbjsKKwlmaFsxXSA9IGlub2RlLT5pX2lubzsKKwlmaFsyXSA9ICgoX191NjQpaW5vZGUtPmlfaW5vKSA+PiAzMjsKKworCSpsZW4gPSAzOworCXJldHVybiAxOworfQorCitzdGF0aWMgc3RydWN0IGV4cG9ydF9vcGVyYXRpb25zIHNobWVtX2V4cG9ydF9vcHMgPSB7CisJLmdldF9wYXJlbnQgICAgID0gc2htZW1fZ2V0X3BhcmVudCwKKwkuZ2V0X2RlbnRyeSAgICAgPSBzaG1lbV9nZXRfZGVudHJ5LAorCS5lbmNvZGVfZmggICAgICA9IHNobWVtX2VuY29kZV9maCwKKwkuZGVjb2RlX2ZoICAgICAgPSBzaG1lbV9kZWNvZGVfZmgsCit9OworCiBzdGF0aWMgaW50IHNobWVtX3BhcnNlX29wdGlvbnMoY2hhciAqb3B0aW9ucywgaW50ICptb2RlLCB1aWRfdCAqdWlkLAogCWdpZF90ICpnaWQsIHVuc2lnbmVkIGxvbmcgKmJsb2NrcywgdW5zaWduZWQgbG9uZyAqaW5vZGVzLAogCWludCAqcG9saWN5LCBub2RlbWFza190ICpwb2xpY3lfbm9kZXMpCkBAIC0yMTI4LDYgKzIyMDksNyBAQAogCQkJCQkmaW5vZGVzLCAmcG9saWN5LCAmcG9saWN5X25vZGVzKSkKIAkJCXJldHVybiAtRUlOVkFMOwogCX0KKwlzYi0+c19leHBvcnRfb3AgPSAmc2htZW1fZXhwb3J0X29wczsKICNlbHNlCiAJc2ItPnNfZmxhZ3MgfD0gTVNfTk9VU0VSOwogI2VuZGlmCmRpZmYgLS1naXQgYS9tbS9zaG1lbV9hY2wuYyBiL21tL3NobWVtX2FjbC5jCmluZGV4IGM5NDZiZjQuLmY1NjY0YzUgMTAwNjQ0Ci0tLSBhL21tL3NobWVtX2FjbC5jCisrKyBiL21tL3NobWVtX2FjbC5jCkBAIC0zNSw3ICszNSw3IEBACiB9CiAKIC8qKgotICogc2htZW1fZ2V0X2FjbCAgLSAgIGdlbmVyaWNfYWNsX29wZXJhdGlvbnMtPnNldGFjbCgpIG9wZXJhdGlvbgorICogc2htZW1fc2V0X2FjbCAgLSAgIGdlbmVyaWNfYWNsX29wZXJhdGlvbnMtPnNldGFjbCgpIG9wZXJhdGlvbgogICovCiBzdGF0aWMgdm9pZAogc2htZW1fc2V0X2FjbChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBpbnQgdHlwZSwgc3RydWN0IHBvc2l4X2FjbCAqYWNsKQpkaWZmIC0tZ2l0IGEvbW0vc2xhYi5jIGIvbW0vc2xhYi5jCmluZGV4IDI2NjQ0OWQuLjNjNGE3ZTMgMTAwNjQ0Ci0tLSBhL21tL3NsYWIuYworKysgYi9tbS9zbGFiLmMKQEAgLTg4Myw3ICs4ODMsNyBAQAogCWlmIChub2RlID09IE1BWF9OVU1OT0RFUykKIAkJbm9kZSA9IGZpcnN0X25vZGUobm9kZV9vbmxpbmVfbWFwKTsKIAotCV9fZ2V0X2NwdV92YXIocmVhcF9ub2RlKSA9IG5vZGU7CisJcGVyX2NwdShyZWFwX25vZGUsIGNwdSkgPSBub2RlOwogfQogCiBzdGF0aWMgdm9pZCBuZXh0X3JlYXBfbm9kZSh2b2lkKQpAQCAtMzE1MiwxMiArMzE1MiwxNSBAQAogCXN0cnVjdCB6b25lICoqejsKIAl2b2lkICpvYmogPSBOVUxMOwogCi0JZm9yICh6ID0gem9uZWxpc3QtPnpvbmVzOyAqeiAmJiAhb2JqOyB6KyspCisJZm9yICh6ID0gem9uZWxpc3QtPnpvbmVzOyAqeiAmJiAhb2JqOyB6KyspIHsKKwkJaW50IG5pZCA9IHpvbmVfdG9fbmlkKCp6KTsKKwogCQlpZiAoem9uZV9pZHgoKnopIDw9IFpPTkVfTk9STUFMICYmCi0JCQkJY3B1c2V0X3pvbmVfYWxsb3dlZCgqeiwgZmxhZ3MpKQorCQkJCWNwdXNldF96b25lX2FsbG93ZWQoKnosIGZsYWdzKSAmJgorCQkJCWNhY2hlLT5ub2RlbGlzdHNbbmlkXSkKIAkJCW9iaiA9IF9fY2FjaGVfYWxsb2Nfbm9kZShjYWNoZSwKLQkJCQkJZmxhZ3MgfCBfX0dGUF9USElTTk9ERSwKLQkJCQkJem9uZV90b19uaWQoKnopKTsKKwkJCQkJZmxhZ3MgfCBfX0dGUF9USElTTk9ERSwgbmlkKTsKKwl9CiAJcmV0dXJuIG9iajsKIH0KIApkaWZmIC0tZ2l0IGEvbW0vc3BhcnNlLmMgYi9tbS9zcGFyc2UuYwppbmRleCA4NmM1MmFiLi5iM2M4MmJhIDEwMDY0NAotLS0gYS9tbS9zcGFyc2UuYworKysgYi9tbS9zcGFyc2UuYwpAQCAtMjExLDcgKzIxMSw3IEBACiAJc3RydWN0IHBhZ2UgKnBhZ2UsICpyZXQ7CiAJdW5zaWduZWQgbG9uZyBtZW1tYXBfc2l6ZSA9IHNpemVvZihzdHJ1Y3QgcGFnZSkgKiBucl9wYWdlczsKIAotCXBhZ2UgPSBhbGxvY19wYWdlcyhHRlBfS0VSTkVMLCBnZXRfb3JkZXIobWVtbWFwX3NpemUpKTsKKwlwYWdlID0gYWxsb2NfcGFnZXMoR0ZQX0tFUk5FTHxfX0dGUF9OT1dBUk4sIGdldF9vcmRlcihtZW1tYXBfc2l6ZSkpOwogCWlmIChwYWdlKQogCQlnb3RvIGdvdF9tYXBfcGFnZTsKIApkaWZmIC0tZ2l0IGEvbW0vdHJ1bmNhdGUuYyBiL21tL3RydW5jYXRlLmMKaW5kZXggZjRlZGJjMS4uZTA3YjFlNiAxMDA2NDQKLS0tIGEvbW0vdHJ1bmNhdGUuYworKysgYi9tbS90cnVuY2F0ZS5jCkBAIC05Niw3ICs5Niw2IEBACiAJCXJldHVybiAwOwogCiAJcmV0ID0gcmVtb3ZlX21hcHBpbmcobWFwcGluZywgcGFnZSk7Ci0JQ2xlYXJQYWdlVXB0b2RhdGUocGFnZSk7CiAKIAlyZXR1cm4gcmV0OwogfQpAQCAtMzAyLDcgKzMwMSw3IEBACiAJaWYgKHBhZ2UtPm1hcHBpbmcgIT0gbWFwcGluZykKIAkJcmV0dXJuIDA7CiAKLQlpZiAoUGFnZVByaXZhdGUocGFnZSkgJiYgIXRyeV90b19yZWxlYXNlX3BhZ2UocGFnZSwgMCkpCisJaWYgKFBhZ2VQcml2YXRlKHBhZ2UpICYmICF0cnlfdG9fcmVsZWFzZV9wYWdlKHBhZ2UsIEdGUF9LRVJORUwpKQogCQlyZXR1cm4gMDsKIAogCXdyaXRlX2xvY2tfaXJxKCZtYXBwaW5nLT50cmVlX2xvY2spOwpAQCAtMzk2LDYgKzM5NSw3IEBACiAJCXBhZ2V2ZWNfcmVsZWFzZSgmcHZlYyk7CiAJCWNvbmRfcmVzY2hlZCgpOwogCX0KKwlXQVJOX09OX09OQ0UocmV0KTsKIAlyZXR1cm4gcmV0OwogfQogRVhQT1JUX1NZTUJPTF9HUEwoaW52YWxpZGF0ZV9pbm9kZV9wYWdlczJfcmFuZ2UpOwpkaWZmIC0tZ2l0IGEvbW0vdm1hbGxvYy5jIGIvbW0vdm1hbGxvYy5jCmluZGV4IDc1MGFiNmUuLjg2ODk3ZWUgMTAwNjQ0Ci0tLSBhL21tL3ZtYWxsb2MuYworKysgYi9tbS92bWFsbG9jLmMKQEAgLTE2MCwxMyArMTYwLDE1IEBACiAJcmV0dXJuIGVycjsKIH0KIAotc3RydWN0IHZtX3N0cnVjdCAqX19nZXRfdm1fYXJlYV9ub2RlKHVuc2lnbmVkIGxvbmcgc2l6ZSwgdW5zaWduZWQgbG9uZyBmbGFncywKLQkJCQl1bnNpZ25lZCBsb25nIHN0YXJ0LCB1bnNpZ25lZCBsb25nIGVuZCwgaW50IG5vZGUpCitzdGF0aWMgc3RydWN0IHZtX3N0cnVjdCAqX19nZXRfdm1fYXJlYV9ub2RlKHVuc2lnbmVkIGxvbmcgc2l6ZSwgdW5zaWduZWQgbG9uZyBmbGFncywKKwkJCQkJICAgIHVuc2lnbmVkIGxvbmcgc3RhcnQsIHVuc2lnbmVkIGxvbmcgZW5kLAorCQkJCQkgICAgaW50IG5vZGUsIGdmcF90IGdmcF9tYXNrKQogewogCXN0cnVjdCB2bV9zdHJ1Y3QgKipwLCAqdG1wLCAqYXJlYTsKIAl1bnNpZ25lZCBsb25nIGFsaWduID0gMTsKIAl1bnNpZ25lZCBsb25nIGFkZHI7CiAKKwlCVUdfT04oaW5faW50ZXJydXB0KCkpOwogCWlmIChmbGFncyAmIFZNX0lPUkVNQVApIHsKIAkJaW50IGJpdCA9IGZscyhzaXplKTsKIApAQCAtMTc5LDE2ICsxODEsMTMgQEAKIAl9CiAJYWRkciA9IEFMSUdOKHN0YXJ0LCBhbGlnbik7CiAJc2l6ZSA9IFBBR0VfQUxJR04oc2l6ZSk7CisJaWYgKHVubGlrZWx5KCFzaXplKSkKKwkJcmV0dXJuIE5VTEw7CiAKLQlhcmVhID0ga21hbGxvY19ub2RlKHNpemVvZigqYXJlYSksIEdGUF9LRVJORUwsIG5vZGUpOworCWFyZWEgPSBrbWFsbG9jX25vZGUoc2l6ZW9mKCphcmVhKSwgZ2ZwX21hc2sgJiBHRlBfTEVWRUxfTUFTSywgbm9kZSk7CiAJaWYgKHVubGlrZWx5KCFhcmVhKSkKIAkJcmV0dXJuIE5VTEw7CiAKLQlpZiAodW5saWtlbHkoIXNpemUpKSB7Ci0JCWtmcmVlIChhcmVhKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCiAJLyoKIAkgKiBXZSBhbHdheXMgYWxsb2NhdGUgYSBndWFyZCBwYWdlLgogCSAqLwpAQCAtMjM2LDcgKzIzNSw3IEBACiBzdHJ1Y3Qgdm1fc3RydWN0ICpfX2dldF92bV9hcmVhKHVuc2lnbmVkIGxvbmcgc2l6ZSwgdW5zaWduZWQgbG9uZyBmbGFncywKIAkJCQl1bnNpZ25lZCBsb25nIHN0YXJ0LCB1bnNpZ25lZCBsb25nIGVuZCkKIHsKLQlyZXR1cm4gX19nZXRfdm1fYXJlYV9ub2RlKHNpemUsIGZsYWdzLCBzdGFydCwgZW5kLCAtMSk7CisJcmV0dXJuIF9fZ2V0X3ZtX2FyZWFfbm9kZShzaXplLCBmbGFncywgc3RhcnQsIGVuZCwgLTEsIEdGUF9LRVJORUwpOwogfQogCiAvKioKQEAgLTI1Myw5ICsyNTIsMTEgQEAKIAlyZXR1cm4gX19nZXRfdm1fYXJlYShzaXplLCBmbGFncywgVk1BTExPQ19TVEFSVCwgVk1BTExPQ19FTkQpOwogfQogCi1zdHJ1Y3Qgdm1fc3RydWN0ICpnZXRfdm1fYXJlYV9ub2RlKHVuc2lnbmVkIGxvbmcgc2l6ZSwgdW5zaWduZWQgbG9uZyBmbGFncywgaW50IG5vZGUpCitzdHJ1Y3Qgdm1fc3RydWN0ICpnZXRfdm1fYXJlYV9ub2RlKHVuc2lnbmVkIGxvbmcgc2l6ZSwgdW5zaWduZWQgbG9uZyBmbGFncywKKwkJCQkgICBpbnQgbm9kZSwgZ2ZwX3QgZ2ZwX21hc2spCiB7Ci0JcmV0dXJuIF9fZ2V0X3ZtX2FyZWFfbm9kZShzaXplLCBmbGFncywgVk1BTExPQ19TVEFSVCwgVk1BTExPQ19FTkQsIG5vZGUpOworCXJldHVybiBfX2dldF92bV9hcmVhX25vZGUoc2l6ZSwgZmxhZ3MsIFZNQUxMT0NfU1RBUlQsIFZNQUxMT0NfRU5ELCBub2RlLAorCQkJCSAgZ2ZwX21hc2spOwogfQogCiAvKiBDYWxsZXIgbXVzdCBob2xkIHZtbGlzdF9sb2NrICovCkBAIC00MjgsOCArNDI5LDExIEBACiAJaWYgKGFycmF5X3NpemUgPiBQQUdFX1NJWkUpIHsKIAkJcGFnZXMgPSBfX3ZtYWxsb2Nfbm9kZShhcnJheV9zaXplLCBnZnBfbWFzaywgUEFHRV9LRVJORUwsIG5vZGUpOwogCQlhcmVhLT5mbGFncyB8PSBWTV9WUEFHRVM7Ci0JfSBlbHNlCi0JCXBhZ2VzID0ga21hbGxvY19ub2RlKGFycmF5X3NpemUsIChnZnBfbWFzayAmIH5fX0dGUF9ISUdITUVNKSwgbm9kZSk7CisJfSBlbHNlIHsKKwkJcGFnZXMgPSBrbWFsbG9jX25vZGUoYXJyYXlfc2l6ZSwKKwkJCQkoZ2ZwX21hc2sgJiB+KF9fR0ZQX0hJR0hNRU0gfCBfX0dGUF9aRVJPKSksCisJCQkJbm9kZSk7CisJfQogCWFyZWEtPnBhZ2VzID0gcGFnZXM7CiAJaWYgKCFhcmVhLT5wYWdlcykgewogCQlyZW1vdmVfdm1fYXJlYShhcmVhLT5hZGRyKTsKQEAgLTQ4NCw3ICs0ODgsNyBAQAogCWlmICghc2l6ZSB8fCAoc2l6ZSA+PiBQQUdFX1NISUZUKSA+IG51bV9waHlzcGFnZXMpCiAJCXJldHVybiBOVUxMOwogCi0JYXJlYSA9IGdldF92bV9hcmVhX25vZGUoc2l6ZSwgVk1fQUxMT0MsIG5vZGUpOworCWFyZWEgPSBnZXRfdm1fYXJlYV9ub2RlKHNpemUsIFZNX0FMTE9DLCBub2RlLCBnZnBfbWFzayk7CiAJaWYgKCFhcmVhKQogCQlyZXR1cm4gTlVMTDsKIApAQCAtNTI1LDExICs1MjksMTIgQEAKIAl2b2lkICpyZXQ7CiAKIAlyZXQgPSBfX3ZtYWxsb2Moc2l6ZSwgR0ZQX0tFUk5FTCB8IF9fR0ZQX0hJR0hNRU0gfCBfX0dGUF9aRVJPLCBQQUdFX0tFUk5FTCk7Ci0Jd3JpdGVfbG9jaygmdm1saXN0X2xvY2spOwotCWFyZWEgPSBfX2ZpbmRfdm1fYXJlYShyZXQpOwotCWFyZWEtPmZsYWdzIHw9IFZNX1VTRVJNQVA7Ci0Jd3JpdGVfdW5sb2NrKCZ2bWxpc3RfbG9jayk7Ci0KKwlpZiAocmV0KSB7CisJCXdyaXRlX2xvY2soJnZtbGlzdF9sb2NrKTsKKwkJYXJlYSA9IF9fZmluZF92bV9hcmVhKHJldCk7CisJCWFyZWEtPmZsYWdzIHw9IFZNX1VTRVJNQVA7CisJCXdyaXRlX3VubG9jaygmdm1saXN0X2xvY2spOworCX0KIAlyZXR1cm4gcmV0OwogfQogRVhQT1JUX1NZTUJPTCh2bWFsbG9jX3VzZXIpOwpAQCAtNTk4LDExICs2MDMsMTIgQEAKIAl2b2lkICpyZXQ7CiAKIAlyZXQgPSBfX3ZtYWxsb2Moc2l6ZSwgR0ZQX0tFUk5FTCB8IF9fR0ZQX1pFUk8sIFBBR0VfS0VSTkVMKTsKLQl3cml0ZV9sb2NrKCZ2bWxpc3RfbG9jayk7Ci0JYXJlYSA9IF9fZmluZF92bV9hcmVhKHJldCk7Ci0JYXJlYS0+ZmxhZ3MgfD0gVk1fVVNFUk1BUDsKLQl3cml0ZV91bmxvY2soJnZtbGlzdF9sb2NrKTsKLQorCWlmIChyZXQpIHsKKwkJd3JpdGVfbG9jaygmdm1saXN0X2xvY2spOworCQlhcmVhID0gX19maW5kX3ZtX2FyZWEocmV0KTsKKwkJYXJlYS0+ZmxhZ3MgfD0gVk1fVVNFUk1BUDsKKwkJd3JpdGVfdW5sb2NrKCZ2bWxpc3RfbG9jayk7CisJfQogCXJldHVybiByZXQ7CiB9CiBFWFBPUlRfU1lNQk9MKHZtYWxsb2NfMzJfdXNlcik7CmRpZmYgLS1naXQgYS9tbS92bXNjYW4uYyBiL21tL3Ztc2Nhbi5jCmluZGV4IGVjYTcwMzEuLjUxODU0MGEgMTAwNjQ0Ci0tLSBhL21tL3Ztc2Nhbi5jCisrKyBiL21tL3Ztc2Nhbi5jCkBAIC0zNzgsNiArMzc4LDEyIEBACiAJcmV0dXJuIFBBR0VfQ0xFQU47CiB9CiAKKy8qCisgKiBBdHRlbXB0IHRvIGRldGFjaCBhIGxvY2tlZCBwYWdlIGZyb20gaXRzIC0+bWFwcGluZy4gIElmIGl0IGlzIGRpcnR5IG9yIGlmCisgKiBzb21lb25lIGVsc2UgaGFzIGEgcmVmIG9uIHRoZSBwYWdlLCBhYm9ydCBhbmQgcmV0dXJuIDAuICBJZiBpdCB3YXMKKyAqIHN1Y2Nlc3NmdWxseSBkZXRhY2hlZCwgcmV0dXJuIDEuICBBc3N1bWVzIHRoZSBjYWxsZXIgaGFzIGEgc2luZ2xlIHJlZiBvbgorICogdGhpcyBwYWdlLgorICovCiBpbnQgcmVtb3ZlX21hcHBpbmcoc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcsIHN0cnVjdCBwYWdlICpwYWdlKQogewogCUJVR19PTighUGFnZUxvY2tlZChwYWdlKSk7CkBAIC03MTcsNiArNzIzLDIwIEBACiAJcmV0dXJuIG5yX3JlY2xhaW1lZDsKIH0KIAorLyoKKyAqIFdlIGFyZSBhYm91dCB0byBzY2FuIHRoaXMgem9uZSBhdCBhIGNlcnRhaW4gcHJpb3JpdHkgbGV2ZWwuICBJZiB0aGF0IHByaW9yaXR5CisgKiBsZXZlbCBpcyBzbWFsbGVyIChpZTogbW9yZSB1cmdlbnQpIHRoYW4gdGhlIHByZXZpb3VzIHByaW9yaXR5LCB0aGVuIG5vdGUKKyAqIHRoYXQgcHJpb3JpdHkgbGV2ZWwgd2l0aGluIHRoZSB6b25lLiAgVGhpcyBpcyBkb25lIHNvIHRoYXQgd2hlbiB0aGUgbmV4dAorICogcHJvY2VzcyBjb21lcyBpbiB0byBzY2FuIHRoaXMgem9uZSwgaXQgd2lsbCBpbW1lZGlhdGVseSBzdGFydCBvdXQgYXQgdGhpcworICogcHJpb3JpdHkgbGV2ZWwgcmF0aGVyIHRoYW4gaGF2aW5nIHRvIGJ1aWxkIHVwIGl0cyBvd24gc2Nhbm5pbmcgcHJpb3JpdHkuCisgKiBIZXJlLCB0aGlzIHByaW9yaXR5IGFmZmVjdHMgb25seSB0aGUgcmVjbGFpbS1tYXBwZWQgdGhyZXNob2xkLgorICovCitzdGF0aWMgaW5saW5lIHZvaWQgbm90ZV96b25lX3NjYW5uaW5nX3ByaW9yaXR5KHN0cnVjdCB6b25lICp6b25lLCBpbnQgcHJpb3JpdHkpCit7CisJaWYgKHByaW9yaXR5IDwgem9uZS0+cHJldl9wcmlvcml0eSkKKwkJem9uZS0+cHJldl9wcmlvcml0eSA9IHByaW9yaXR5OworfQorCiBzdGF0aWMgaW5saW5lIGludCB6b25lX2lzX25lYXJfb29tKHN0cnVjdCB6b25lICp6b25lKQogewogCXJldHVybiB6b25lLT5wYWdlc19zY2FubmVkID49ICh6b25lLT5ucl9hY3RpdmUgKyB6b25lLT5ucl9pbmFjdGl2ZSkqMzsKQEAgLTc0MCw3ICs3NjAsNyBAQAogICogQnV0IHdlIGhhZCB0byBhbHRlciBwYWdlLT5mbGFncyBhbnl3YXkuCiAgKi8KIHN0YXRpYyB2b2lkIHNocmlua19hY3RpdmVfbGlzdCh1bnNpZ25lZCBsb25nIG5yX3BhZ2VzLCBzdHJ1Y3Qgem9uZSAqem9uZSwKLQkJCQlzdHJ1Y3Qgc2Nhbl9jb250cm9sICpzYykKKwkJCQlzdHJ1Y3Qgc2Nhbl9jb250cm9sICpzYywgaW50IHByaW9yaXR5KQogewogCXVuc2lnbmVkIGxvbmcgcGdtb3ZlZDsKIAlpbnQgcGdkZWFjdGl2YXRlID0gMDsKQEAgLTc2NCw3ICs3ODQsNyBAQAogCQkgKiBgZGlzdHJlc3MnIGlzIGEgbWVhc3VyZSBvZiBob3cgbXVjaCB0cm91YmxlIHdlJ3JlIGhhdmluZwogCQkgKiByZWNsYWltaW5nIHBhZ2VzLiAgMCAtPiBubyBwcm9ibGVtcy4gIDEwMCAtPiBncmVhdCB0cm91YmxlLgogCQkgKi8KLQkJZGlzdHJlc3MgPSAxMDAgPj4gem9uZS0+cHJldl9wcmlvcml0eTsKKwkJZGlzdHJlc3MgPSAxMDAgPj4gbWluKHpvbmUtPnByZXZfcHJpb3JpdHksIHByaW9yaXR5KTsKIAogCQkvKgogCQkgKiBUaGUgcG9pbnQgb2YgdGhpcyBhbGdvcml0aG0gaXMgdG8gZGVjaWRlIHdoZW4gdG8gc3RhcnQKQEAgLTkxNiw3ICs5MzYsNyBAQAogCQkJbnJfdG9fc2NhbiA9IG1pbihucl9hY3RpdmUsCiAJCQkJCSh1bnNpZ25lZCBsb25nKXNjLT5zd2FwX2NsdXN0ZXJfbWF4KTsKIAkJCW5yX2FjdGl2ZSAtPSBucl90b19zY2FuOwotCQkJc2hyaW5rX2FjdGl2ZV9saXN0KG5yX3RvX3NjYW4sIHpvbmUsIHNjKTsKKwkJCXNocmlua19hY3RpdmVfbGlzdChucl90b19zY2FuLCB6b25lLCBzYywgcHJpb3JpdHkpOwogCQl9CiAKIAkJaWYgKG5yX2luYWN0aXZlKSB7CkBAIC05NjYsOSArOTg2LDcgQEAKIAkJaWYgKCFjcHVzZXRfem9uZV9hbGxvd2VkKHpvbmUsIF9fR0ZQX0hBUkRXQUxMKSkKIAkJCWNvbnRpbnVlOwogCi0JCXpvbmUtPnRlbXBfcHJpb3JpdHkgPSBwcmlvcml0eTsKLQkJaWYgKHpvbmUtPnByZXZfcHJpb3JpdHkgPiBwcmlvcml0eSkKLQkJCXpvbmUtPnByZXZfcHJpb3JpdHkgPSBwcmlvcml0eTsKKwkJbm90ZV96b25lX3NjYW5uaW5nX3ByaW9yaXR5KHpvbmUsIHByaW9yaXR5KTsKIAogCQlpZiAoem9uZS0+YWxsX3VucmVjbGFpbWFibGUgJiYgcHJpb3JpdHkgIT0gREVGX1BSSU9SSVRZKQogCQkJY29udGludWU7CS8qIExldCBrc3dhcGQgcG9sbCBpdCAqLwpAQCAtMTAxOCw3ICsxMDM2LDYgQEAKIAkJaWYgKCFjcHVzZXRfem9uZV9hbGxvd2VkKHpvbmUsIF9fR0ZQX0hBUkRXQUxMKSkKIAkJCWNvbnRpbnVlOwogCi0JCXpvbmUtPnRlbXBfcHJpb3JpdHkgPSBERUZfUFJJT1JJVFk7CiAJCWxydV9wYWdlcyArPSB6b25lLT5ucl9hY3RpdmUgKyB6b25lLT5ucl9pbmFjdGl2ZTsKIAl9CiAKQEAgLTEwNTMsMTkgKzEwNzAsMjggQEAKIAogCQkvKiBUYWtlIGEgbmFwLCB3YWl0IGZvciBzb21lIHdyaXRlYmFjayB0byBjb21wbGV0ZSAqLwogCQlpZiAoc2MubnJfc2Nhbm5lZCAmJiBwcmlvcml0eSA8IERFRl9QUklPUklUWSAtIDIpCi0JCQlibGtfY29uZ2VzdGlvbl93YWl0KFdSSVRFLCBIWi8xMCk7CisJCQljb25nZXN0aW9uX3dhaXQoV1JJVEUsIEhaLzEwKTsKIAl9CiAJLyogdG9wIHByaW9yaXR5IHNocmlua19jYWNoZXMgc3RpbGwgaGFkIG1vcmUgdG8gZG8/IGRvbid0IE9PTSwgdGhlbiAqLwogCWlmICghc2MuYWxsX3VucmVjbGFpbWFibGUpCiAJCXJldCA9IDE7CiBvdXQ6CisJLyoKKwkgKiBOb3cgdGhhdCB3ZSd2ZSBzY2FubmVkIGFsbCB0aGUgem9uZXMgYXQgdGhpcyBwcmlvcml0eSBsZXZlbCwgbm90ZQorCSAqIHRoYXQgbGV2ZWwgd2l0aGluIHRoZSB6b25lIHNvIHRoYXQgdGhlIG5leHQgdGhyZWFkIHdoaWNoIHBlcmZvcm1zCisJICogc2Nhbm5pbmcgb2YgdGhpcyB6b25lIHdpbGwgaW1tZWRpYXRlbHkgc3RhcnQgb3V0IGF0IHRoaXMgcHJpb3JpdHkKKwkgKiBsZXZlbC4gIFRoaXMgYWZmZWN0cyBvbmx5IHRoZSBkZWNpc2lvbiB3aGV0aGVyIG9yIG5vdCB0byBicmluZworCSAqIG1hcHBlZCBwYWdlcyBvbnRvIHRoZSBpbmFjdGl2ZSBsaXN0LgorCSAqLworCWlmIChwcmlvcml0eSA8IDApCisJCXByaW9yaXR5ID0gMDsKIAlmb3IgKGkgPSAwOyB6b25lc1tpXSAhPSAwOyBpKyspIHsKIAkJc3RydWN0IHpvbmUgKnpvbmUgPSB6b25lc1tpXTsKIAogCQlpZiAoIWNwdXNldF96b25lX2FsbG93ZWQoem9uZSwgX19HRlBfSEFSRFdBTEwpKQogCQkJY29udGludWU7CiAKLQkJem9uZS0+cHJldl9wcmlvcml0eSA9IHpvbmUtPnRlbXBfcHJpb3JpdHk7CisJCXpvbmUtPnByZXZfcHJpb3JpdHkgPSBwcmlvcml0eTsKIAl9CiAJcmV0dXJuIHJldDsKIH0KQEAgLTExMDUsNiArMTEzMSwxMSBAQAogCQkuc3dhcF9jbHVzdGVyX21heCA9IFNXQVBfQ0xVU1RFUl9NQVgsCiAJCS5zd2FwcGluZXNzID0gdm1fc3dhcHBpbmVzcywKIAl9OworCS8qCisJICogdGVtcF9wcmlvcml0eSBpcyB1c2VkIHRvIHJlbWVtYmVyIHRoZSBzY2FubmluZyBwcmlvcml0eSBhdCB3aGljaAorCSAqIHRoaXMgem9uZSB3YXMgc3VjY2Vzc2Z1bGx5IHJlZmlsbGVkIHRvIGZyZWVfcGFnZXMgPT0gcGFnZXNfaGlnaC4KKwkgKi8KKwlpbnQgdGVtcF9wcmlvcml0eVtNQVhfTlJfWk9ORVNdOwogCiBsb29wX2FnYWluOgogCXRvdGFsX3NjYW5uZWQgPSAwOwpAQCAtMTExMiwxMSArMTE0Myw4IEBACiAJc2MubWF5X3dyaXRlcGFnZSA9ICFsYXB0b3BfbW9kZTsKIAljb3VudF92bV9ldmVudChQQUdFT1VUUlVOKTsKIAotCWZvciAoaSA9IDA7IGkgPCBwZ2RhdC0+bnJfem9uZXM7IGkrKykgewotCQlzdHJ1Y3Qgem9uZSAqem9uZSA9IHBnZGF0LT5ub2RlX3pvbmVzICsgaTsKLQotCQl6b25lLT50ZW1wX3ByaW9yaXR5ID0gREVGX1BSSU9SSVRZOwotCX0KKwlmb3IgKGkgPSAwOyBpIDwgcGdkYXQtPm5yX3pvbmVzOyBpKyspCisJCXRlbXBfcHJpb3JpdHlbaV0gPSBERUZfUFJJT1JJVFk7CiAKIAlmb3IgKHByaW9yaXR5ID0gREVGX1BSSU9SSVRZOyBwcmlvcml0eSA+PSAwOyBwcmlvcml0eS0tKSB7CiAJCWludCBlbmRfem9uZSA9IDA7CS8qIEluY2x1c2l2ZS4gIDAgPSBaT05FX0RNQSAqLwpAQCAtMTE3NywxMCArMTIwNSw5IEBACiAJCQlpZiAoIXpvbmVfd2F0ZXJtYXJrX29rKHpvbmUsIG9yZGVyLCB6b25lLT5wYWdlc19oaWdoLAogCQkJCQkgICAgICAgZW5kX3pvbmUsIDApKQogCQkJCWFsbF96b25lc19vayA9IDA7Ci0JCQl6b25lLT50ZW1wX3ByaW9yaXR5ID0gcHJpb3JpdHk7Ci0JCQlpZiAoem9uZS0+cHJldl9wcmlvcml0eSA+IHByaW9yaXR5KQotCQkJCXpvbmUtPnByZXZfcHJpb3JpdHkgPSBwcmlvcml0eTsKKwkJCXRlbXBfcHJpb3JpdHlbaV0gPSBwcmlvcml0eTsKIAkJCXNjLm5yX3NjYW5uZWQgPSAwOworCQkJbm90ZV96b25lX3NjYW5uaW5nX3ByaW9yaXR5KHpvbmUsIHByaW9yaXR5KTsKIAkJCW5yX3JlY2xhaW1lZCArPSBzaHJpbmtfem9uZShwcmlvcml0eSwgem9uZSwgJnNjKTsKIAkJCXJlY2xhaW1fc3RhdGUtPnJlY2xhaW1lZF9zbGFiID0gMDsKIAkJCW5yX3NsYWIgPSBzaHJpbmtfc2xhYihzYy5ucl9zY2FubmVkLCBHRlBfS0VSTkVMLApAQCAtMTIwOCw3ICsxMjM1LDcgQEAKIAkJICogYW5vdGhlciBwYXNzIGFjcm9zcyB0aGUgem9uZXMuCiAJCSAqLwogCQlpZiAodG90YWxfc2Nhbm5lZCAmJiBwcmlvcml0eSA8IERFRl9QUklPUklUWSAtIDIpCi0JCQlibGtfY29uZ2VzdGlvbl93YWl0KFdSSVRFLCBIWi8xMCk7CisJCQljb25nZXN0aW9uX3dhaXQoV1JJVEUsIEhaLzEwKTsKIAogCQkvKgogCQkgKiBXZSBkbyB0aGlzIHNvIGtzd2FwZCBkb2Vzbid0IGJ1aWxkIHVwIGxhcmdlIHByaW9yaXRpZXMgZm9yCkBAIC0xMjIwLDEwICsxMjQ3LDE1IEBACiAJCQlicmVhazsKIAl9CiBvdXQ6CisJLyoKKwkgKiBOb3RlIHdpdGhpbiBlYWNoIHpvbmUgdGhlIHByaW9yaXR5IGxldmVsIGF0IHdoaWNoIHRoaXMgem9uZSB3YXMKKwkgKiBicm91Z2h0IGludG8gYSBoYXBweSBzdGF0ZS4gIFNvIHRoYXQgdGhlIG5leHQgdGhyZWFkIHdoaWNoIHNjYW5zIHRoaXMKKwkgKiB6b25lIHdpbGwgc3RhcnQgb3V0IGF0IHRoYXQgcHJpb3JpdHkgbGV2ZWwuCisJICovCiAJZm9yIChpID0gMDsgaSA8IHBnZGF0LT5ucl96b25lczsgaSsrKSB7CiAJCXN0cnVjdCB6b25lICp6b25lID0gcGdkYXQtPm5vZGVfem9uZXMgKyBpOwogCi0JCXpvbmUtPnByZXZfcHJpb3JpdHkgPSB6b25lLT50ZW1wX3ByaW9yaXR5OworCQl6b25lLT5wcmV2X3ByaW9yaXR5ID0gdGVtcF9wcmlvcml0eVtpXTsKIAl9CiAJaWYgKCFhbGxfem9uZXNfb2spIHsKIAkJY29uZF9yZXNjaGVkKCk7CkBAIC0xMzUyLDcgKzEzODQsNyBAQAogCQkJaWYgKHpvbmUtPm5yX3NjYW5fYWN0aXZlID49IG5yX3BhZ2VzIHx8IHBhc3MgPiAzKSB7CiAJCQkJem9uZS0+bnJfc2Nhbl9hY3RpdmUgPSAwOwogCQkJCW5yX3RvX3NjYW4gPSBtaW4obnJfcGFnZXMsIHpvbmUtPm5yX2FjdGl2ZSk7Ci0JCQkJc2hyaW5rX2FjdGl2ZV9saXN0KG5yX3RvX3NjYW4sIHpvbmUsIHNjKTsKKwkJCQlzaHJpbmtfYWN0aXZlX2xpc3QobnJfdG9fc2Nhbiwgem9uZSwgc2MsIHByaW8pOwogCQkJfQogCQl9CiAKQEAgLTE0NTIsNyArMTQ4NCw3IEBACiAJCQkJZ290byBvdXQ7CiAKIAkJCWlmIChzYy5ucl9zY2FubmVkICYmIHByaW8gPCBERUZfUFJJT1JJVFkgLSAyKQotCQkJCWJsa19jb25nZXN0aW9uX3dhaXQoV1JJVEUsIEhaIC8gMTApOworCQkJCWNvbmdlc3Rpb25fd2FpdChXUklURSwgSFogLyAxMCk7CiAJCX0KIAogCQlscnVfcGFnZXMgPSAwOwpAQCAtMTYwOCw2ICsxNjQwLDcgQEAKIAkJICovCiAJCXByaW9yaXR5ID0gWk9ORV9SRUNMQUlNX1BSSU9SSVRZOwogCQlkbyB7CisJCQlub3RlX3pvbmVfc2Nhbm5pbmdfcHJpb3JpdHkoem9uZSwgcHJpb3JpdHkpOwogCQkJbnJfcmVjbGFpbWVkICs9IHNocmlua196b25lKHByaW9yaXR5LCB6b25lLCAmc2MpOwogCQkJcHJpb3JpdHktLTsKIAkJfSB3aGlsZSAocHJpb3JpdHkgPj0gMCAmJiBucl9yZWNsYWltZWQgPCBucl9wYWdlcyk7CmRpZmYgLS1naXQgYS9tbS92bXN0YXQuYyBiL21tL3Ztc3RhdC5jCmluZGV4IDQ1YjEyNGUuLjg2MTRlOGYgMTAwNjQ0Ci0tLSBhL21tL3Ztc3RhdC5jCisrKyBiL21tL3Ztc3RhdC5jCkBAIC01ODcsMTEgKzU4Nyw5IEBACiAJCXNlcV9wcmludGYobSwKIAkJCSAgICJcbiAgYWxsX3VucmVjbGFpbWFibGU6ICV1IgogCQkJICAgIlxuICBwcmV2X3ByaW9yaXR5OiAgICAgJWkiCi0JCQkgICAiXG4gIHRlbXBfcHJpb3JpdHk6ICAgICAlaSIKIAkJCSAgICJcbiAgc3RhcnRfcGZuOiAgICAgICAgICVsdSIsCiAJCQkgICB6b25lLT5hbGxfdW5yZWNsYWltYWJsZSwKIAkJCSAgIHpvbmUtPnByZXZfcHJpb3JpdHksCi0JCQkgICB6b25lLT50ZW1wX3ByaW9yaXR5LAogCQkJICAgem9uZS0+em9uZV9zdGFydF9wZm4pOwogCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ6b25lLT5sb2NrLCBmbGFncyk7CiAJCXNlcV9wdXRjKG0sICdcbicpOwpkaWZmIC0tZ2l0IGEvbmV0L0tjb25maWcgYi9uZXQvS2NvbmZpZwppbmRleCBhODFhY2E0Li42N2UzOWFkIDEwMDY0NAotLS0gYS9uZXQvS2NvbmZpZworKysgYi9uZXQvS2NvbmZpZwpAQCAtNjMsNiArNjMsNyBAQAogaWYgSU5FVAogc291cmNlICJuZXQvaXB2NC9LY29uZmlnIgogc291cmNlICJuZXQvaXB2Ni9LY29uZmlnIgorc291cmNlICJuZXQvbmV0bGFiZWwvS2NvbmZpZyIKIAogZW5kaWYgIyBpZiBJTkVUCiAKQEAgLTI0OSw4ICsyNTAsNiBAQAogY29uZmlnIFdJUkVMRVNTX0VYVAogCWJvb2wKIAotc291cmNlICJuZXQvbmV0bGFiZWwvS2NvbmZpZyIKLQogY29uZmlnIEZJQl9SVUxFUwogCWJvb2wKIApkaWZmIC0tZ2l0IGEvbmV0L2FwcGxldGFsay9kZHAuYyBiL25ldC9hcHBsZXRhbGsvZGRwLmMKaW5kZXggNzA4ZTJlMC4uNDg1ZTM1YyAxMDA2NDQKLS0tIGEvbmV0L2FwcGxldGFsay9kZHAuYworKysgYi9uZXQvYXBwbGV0YWxrL2RkcC5jCkBAIC0xNTg0LDcgKzE1ODQsNiBAQAogCiAJaWYgKHVzYXQtPnNhdF9hZGRyLnNfbmV0IHx8IHVzYXQtPnNhdF9hZGRyLnNfbm9kZSA9PSBBVEFERFJfQU5ZTk9ERSkgewogCQlydCA9IGF0cnRyX2ZpbmQoJnVzYXQtPnNhdF9hZGRyKTsKLQkJZGV2ID0gcnQtPmRldjsKIAl9IGVsc2UgewogCQlzdHJ1Y3QgYXRhbGtfYWRkciBhdF9oaW50OwogCkBAIC0xNTkyLDcgKzE1OTEsNiBAQAogCQlhdF9oaW50LnNfbmV0ICA9IGF0LT5zcmNfbmV0OwogCiAJCXJ0ID0gYXRydHJfZmluZCgmYXRfaGludCk7Ci0JCWRldiA9IHJ0LT5kZXY7CiAJfQogCWlmICghcnQpCiAJCXJldHVybiAtRU5FVFVOUkVBQ0g7CmRpZmYgLS1naXQgYS9uZXQvYXRtL2F0bV9zeXNmcy5jIGIvbmV0L2F0bS9hdG1fc3lzZnMuYwppbmRleCBjMGE0YWUyLi42MmY2ZWQxIDEwMDY0NAotLS0gYS9uZXQvYXRtL2F0bV9zeXNmcy5jCisrKyBiL25ldC9hdG0vYXRtX3N5c2ZzLmMKQEAgLTE0MSw3ICsxNDEsNyBAQAogaW50IGF0bV9yZWdpc3Rlcl9zeXNmcyhzdHJ1Y3QgYXRtX2RldiAqYWRldikKIHsKIAlzdHJ1Y3QgY2xhc3NfZGV2aWNlICpjZGV2ID0gJmFkZXYtPmNsYXNzX2RldjsKLQlpbnQgaSwgZXJyOworCWludCBpLCBqLCBlcnI7CiAKIAljZGV2LT5jbGFzcyA9ICZhdG1fY2xhc3M7CiAJY2xhc3Nfc2V0X2RldmRhdGEoY2RldiwgYWRldik7CkBAIC0xNTEsMTAgKzE1MSwxOSBAQAogCWlmIChlcnIgPCAwKQogCQlyZXR1cm4gZXJyOwogCi0JZm9yIChpID0gMDsgYXRtX2F0dHJzW2ldOyBpKyspCi0JCWNsYXNzX2RldmljZV9jcmVhdGVfZmlsZShjZGV2LCBhdG1fYXR0cnNbaV0pOworCWZvciAoaSA9IDA7IGF0bV9hdHRyc1tpXTsgaSsrKSB7CisJCWVyciA9IGNsYXNzX2RldmljZV9jcmVhdGVfZmlsZShjZGV2LCBhdG1fYXR0cnNbaV0pOworCQlpZiAoZXJyKQorCQkJZ290byBlcnJfb3V0OworCX0KIAogCXJldHVybiAwOworCitlcnJfb3V0OgorCWZvciAoaiA9IDA7IGogPCBpOyBqKyspCisJCWNsYXNzX2RldmljZV9yZW1vdmVfZmlsZShjZGV2LCBhdG1fYXR0cnNbal0pOworCWNsYXNzX2RldmljZV9kZWwoY2Rldik7CisJcmV0dXJuIGVycjsKIH0KIAogdm9pZCBhdG1fdW5yZWdpc3Rlcl9zeXNmcyhzdHJ1Y3QgYXRtX2RldiAqYWRldikKZGlmZiAtLWdpdCBhL25ldC9ibHVldG9vdGgvYWZfYmx1ZXRvb3RoLmMgYi9uZXQvYmx1ZXRvb3RoL2FmX2JsdWV0b290aC5jCmluZGV4IDMwNWEwOTkuLjY3ZGY5OWUgMTAwNjQ0Ci0tLSBhL25ldC9ibHVldG9vdGgvYWZfYmx1ZXRvb3RoLmMKKysrIGIvbmV0L2JsdWV0b290aC9hZl9ibHVldG9vdGguYwpAQCAtNDgsNDEgKzQ4LDU2IEBACiAjZGVmaW5lIEJUX0RCRyhELi4uKQogI2VuZGlmCiAKLSNkZWZpbmUgVkVSU0lPTiAiMi4xMCIKKyNkZWZpbmUgVkVSU0lPTiAiMi4xMSIKIAogLyogQmx1ZXRvb3RoIHNvY2tldHMgKi8KICNkZWZpbmUgQlRfTUFYX1BST1RPCTgKIHN0YXRpYyBzdHJ1Y3QgbmV0X3Byb3RvX2ZhbWlseSAqYnRfcHJvdG9bQlRfTUFYX1BST1RPXTsKK3N0YXRpYyBERUZJTkVfUldMT0NLKGJ0X3Byb3RvX2xvY2spOwogCiBpbnQgYnRfc29ja19yZWdpc3RlcihpbnQgcHJvdG8sIHN0cnVjdCBuZXRfcHJvdG9fZmFtaWx5ICpvcHMpCiB7CisJaW50IGVyciA9IDA7CisKIAlpZiAocHJvdG8gPCAwIHx8IHByb3RvID49IEJUX01BWF9QUk9UTykKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQlpZiAoYnRfcHJvdG9bcHJvdG9dKQotCQlyZXR1cm4gLUVFWElTVDsKKwl3cml0ZV9sb2NrKCZidF9wcm90b19sb2NrKTsKIAotCWJ0X3Byb3RvW3Byb3RvXSA9IG9wczsKLQlyZXR1cm4gMDsKKwlpZiAoYnRfcHJvdG9bcHJvdG9dKQorCQllcnIgPSAtRUVYSVNUOworCWVsc2UKKwkJYnRfcHJvdG9bcHJvdG9dID0gb3BzOworCisJd3JpdGVfdW5sb2NrKCZidF9wcm90b19sb2NrKTsKKworCXJldHVybiBlcnI7CiB9CiBFWFBPUlRfU1lNQk9MKGJ0X3NvY2tfcmVnaXN0ZXIpOwogCiBpbnQgYnRfc29ja191bnJlZ2lzdGVyKGludCBwcm90bykKIHsKKwlpbnQgZXJyID0gMDsKKwogCWlmIChwcm90byA8IDAgfHwgcHJvdG8gPj0gQlRfTUFYX1BST1RPKQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCWlmICghYnRfcHJvdG9bcHJvdG9dKQotCQlyZXR1cm4gLUVOT0VOVDsKKwl3cml0ZV9sb2NrKCZidF9wcm90b19sb2NrKTsKIAotCWJ0X3Byb3RvW3Byb3RvXSA9IE5VTEw7Ci0JcmV0dXJuIDA7CisJaWYgKCFidF9wcm90b1twcm90b10pCisJCWVyciA9IC1FTk9FTlQ7CisJZWxzZQorCQlidF9wcm90b1twcm90b10gPSBOVUxMOworCisJd3JpdGVfdW5sb2NrKCZidF9wcm90b19sb2NrKTsKKworCXJldHVybiBlcnI7CiB9CiBFWFBPUlRfU1lNQk9MKGJ0X3NvY2tfdW5yZWdpc3Rlcik7CiAKIHN0YXRpYyBpbnQgYnRfc29ja19jcmVhdGUoc3RydWN0IHNvY2tldCAqc29jaywgaW50IHByb3RvKQogewotCWludCBlcnIgPSAwOworCWludCBlcnI7CiAKIAlpZiAocHJvdG8gPCAwIHx8IHByb3RvID49IEJUX01BWF9QUk9UTykKIAkJcmV0dXJuIC1FSU5WQUw7CkBAIC05MiwxMSArMTA3LDE4IEBACiAJCXJlcXVlc3RfbW9kdWxlKCJidC1wcm90by0lZCIsIHByb3RvKTsKIAl9CiAjZW5kaWYKKwogCWVyciA9IC1FUFJPVE9OT1NVUFBPUlQ7CisKKwlyZWFkX2xvY2soJmJ0X3Byb3RvX2xvY2spOworCiAJaWYgKGJ0X3Byb3RvW3Byb3RvXSAmJiB0cnlfbW9kdWxlX2dldChidF9wcm90b1twcm90b10tPm93bmVyKSkgewogCQllcnIgPSBidF9wcm90b1twcm90b10tPmNyZWF0ZShzb2NrLCBwcm90byk7CiAJCW1vZHVsZV9wdXQoYnRfcHJvdG9bcHJvdG9dLT5vd25lcik7CiAJfQorCisJcmVhZF91bmxvY2soJmJ0X3Byb3RvX2xvY2spOworCiAJcmV0dXJuIGVycjsgCiB9CiAKZGlmZiAtLWdpdCBhL25ldC9ibHVldG9vdGgvYm5lcC9jb3JlLmMgYi9uZXQvYmx1ZXRvb3RoL2JuZXAvY29yZS5jCmluZGV4IDIzMTJkMDUuLjRkMzQyNGMgMTAwNjQ0Ci0tLSBhL25ldC9ibHVldG9vdGgvYm5lcC9jb3JlLmMKKysrIGIvbmV0L2JsdWV0b290aC9ibmVwL2NvcmUuYwpAQCAtNTI4LDEyICs1MjgsMTAgQEAKIAkJcmV0dXJuIE5VTEw7CiAKIAljb25uID0gaGNpX2Nvbm5faGFzaF9sb29rdXBfYmEoaGRldiwgQUNMX0xJTkssIGRzdCk7Ci0JaWYgKCFjb25uKQotCQlyZXR1cm4gTlVMTDsKIAogCWhjaV9kZXZfcHV0KGhkZXYpOwogCi0JcmV0dXJuICZjb25uLT5kZXY7CisJcmV0dXJuIGNvbm4gPyAmY29ubi0+ZGV2IDogTlVMTDsKIH0KIAogaW50IGJuZXBfYWRkX2Nvbm5lY3Rpb24oc3RydWN0IGJuZXBfY29ubmFkZF9yZXEgKnJlcSwgc3RydWN0IHNvY2tldCAqc29jaykKZGlmZiAtLWdpdCBhL25ldC9ibHVldG9vdGgvYm5lcC9zb2NrLmMgYi9uZXQvYmx1ZXRvb3RoL2JuZXAvc29jay5jCmluZGV4IDI4YzU1ODMuLjU1NjNkYjEgMTAwNjQ0Ci0tLSBhL25ldC9ibHVldG9vdGgvYm5lcC9zb2NrLmMKKysrIGIvbmV0L2JsdWV0b290aC9ibmVwL3NvY2suYwpAQCAtNDMsNiArNDMsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2lvY3RsLmg+CiAjaW5jbHVkZSA8bGludXgvZmlsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9jb21wYXQuaD4KICNpbmNsdWRlIDxuZXQvc29jay5oPgogCiAjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgpAQCAtMTQ2LDI0ICsxNDcsNTYgQEAKIAlyZXR1cm4gMDsKIH0KIAorI2lmZGVmIENPTkZJR19DT01QQVQKK3N0YXRpYyBpbnQgYm5lcF9zb2NrX2NvbXBhdF9pb2N0bChzdHJ1Y3Qgc29ja2V0ICpzb2NrLCB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlpZiAoY21kID09IEJORVBHRVRDT05OTElTVCkgeworCQlzdHJ1Y3QgYm5lcF9jb25ubGlzdF9yZXEgY2w7CisJCXVpbnQzMl90IHVjaTsKKwkJaW50IGVycjsKKworCQlpZiAoZ2V0X3VzZXIoY2wuY251bSwgKHVpbnQzMl90IF9fdXNlciAqKSBhcmcpIHx8CisJCQkJZ2V0X3VzZXIodWNpLCAodTMyIF9fdXNlciAqKSAoYXJnICsgNCkpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisKKwkJY2wuY2kgPSBjb21wYXRfcHRyKHVjaSk7CisKKwkJaWYgKGNsLmNudW0gPD0gMCkKKwkJCXJldHVybiAtRUlOVkFMOworCQorCQllcnIgPSBibmVwX2dldF9jb25ubGlzdCgmY2wpOworCisJCWlmICghZXJyICYmIHB1dF91c2VyKGNsLmNudW0sICh1aW50MzJfdCBfX3VzZXIgKikgYXJnKSkKKwkJCWVyciA9IC1FRkFVTFQ7CisKKwkJcmV0dXJuIGVycjsKKwl9CisKKwlyZXR1cm4gYm5lcF9zb2NrX2lvY3RsKHNvY2ssIGNtZCwgYXJnKTsKK30KKyNlbmRpZgorCiBzdGF0aWMgY29uc3Qgc3RydWN0IHByb3RvX29wcyBibmVwX3NvY2tfb3BzID0gewotCS5mYW1pbHkgICAgID0gUEZfQkxVRVRPT1RILAotCS5vd25lciAgICAgID0gVEhJU19NT0RVTEUsCi0JLnJlbGVhc2UgICAgPSBibmVwX3NvY2tfcmVsZWFzZSwKLQkuaW9jdGwgICAgICA9IGJuZXBfc29ja19pb2N0bCwKLQkuYmluZCAgICAgICA9IHNvY2tfbm9fYmluZCwKLQkuZ2V0bmFtZSAgICA9IHNvY2tfbm9fZ2V0bmFtZSwKLQkuc2VuZG1zZyAgICA9IHNvY2tfbm9fc2VuZG1zZywKLQkucmVjdm1zZyAgICA9IHNvY2tfbm9fcmVjdm1zZywKLQkucG9sbCAgICAgICA9IHNvY2tfbm9fcG9sbCwKLQkubGlzdGVuICAgICA9IHNvY2tfbm9fbGlzdGVuLAotCS5zaHV0ZG93biAgID0gc29ja19ub19zaHV0ZG93biwKLQkuc2V0c29ja29wdCA9IHNvY2tfbm9fc2V0c29ja29wdCwKLQkuZ2V0c29ja29wdCA9IHNvY2tfbm9fZ2V0c29ja29wdCwKLQkuY29ubmVjdCAgICA9IHNvY2tfbm9fY29ubmVjdCwKLQkuc29ja2V0cGFpciA9IHNvY2tfbm9fc29ja2V0cGFpciwKLQkuYWNjZXB0ICAgICA9IHNvY2tfbm9fYWNjZXB0LAotCS5tbWFwICAgICAgID0gc29ja19ub19tbWFwCisJLmZhbWlseQkJPSBQRl9CTFVFVE9PVEgsCisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCS5yZWxlYXNlCT0gYm5lcF9zb2NrX3JlbGVhc2UsCisJLmlvY3RsCQk9IGJuZXBfc29ja19pb2N0bCwKKyNpZmRlZiBDT05GSUdfQ09NUEFUCisJLmNvbXBhdF9pb2N0bAk9IGJuZXBfc29ja19jb21wYXRfaW9jdGwsCisjZW5kaWYKKwkuYmluZAkJPSBzb2NrX25vX2JpbmQsCisJLmdldG5hbWUJPSBzb2NrX25vX2dldG5hbWUsCisJLnNlbmRtc2cJPSBzb2NrX25vX3NlbmRtc2csCisJLnJlY3Ztc2cJPSBzb2NrX25vX3JlY3Ztc2csCisJLnBvbGwJCT0gc29ja19ub19wb2xsLAorCS5saXN0ZW4JCT0gc29ja19ub19saXN0ZW4sCisJLnNodXRkb3duCT0gc29ja19ub19zaHV0ZG93biwKKwkuc2V0c29ja29wdAk9IHNvY2tfbm9fc2V0c29ja29wdCwKKwkuZ2V0c29ja29wdAk9IHNvY2tfbm9fZ2V0c29ja29wdCwKKwkuY29ubmVjdAk9IHNvY2tfbm9fY29ubmVjdCwKKwkuc29ja2V0cGFpcgk9IHNvY2tfbm9fc29ja2V0cGFpciwKKwkuYWNjZXB0CQk9IHNvY2tfbm9fYWNjZXB0LAorCS5tbWFwCQk9IHNvY2tfbm9fbW1hcAogfTsKIAogc3RhdGljIHN0cnVjdCBwcm90byBibmVwX3Byb3RvID0gewpAQCAtMTgxLDcgKzIxNCw3IEBACiAJaWYgKHNvY2stPnR5cGUgIT0gU09DS19SQVcpCiAJCXJldHVybiAtRVNPQ0tUTk9TVVBQT1JUOwogCi0Jc2sgPSBza19hbGxvYyhQRl9CTFVFVE9PVEgsIEdGUF9LRVJORUwsICZibmVwX3Byb3RvLCAxKTsKKwlzayA9IHNrX2FsbG9jKFBGX0JMVUVUT09USCwgR0ZQX0FUT01JQywgJmJuZXBfcHJvdG8sIDEpOwogCWlmICghc2spCiAJCXJldHVybiAtRU5PTUVNOwogCmRpZmYgLS1naXQgYS9uZXQvYmx1ZXRvb3RoL2NtdHAvc29jay5jIGIvbmV0L2JsdWV0b290aC9jbXRwL3NvY2suYwppbmRleCAxMGFkN2ZkLi41MzI5NWQzIDEwMDY0NAotLS0gYS9uZXQvYmx1ZXRvb3RoL2NtdHAvc29jay5jCisrKyBiL25ldC9ibHVldG9vdGgvY210cC9zb2NrLmMKQEAgLTM0LDYgKzM0LDcgQEAKICNpbmNsdWRlIDxsaW51eC9zb2NrZXQuaD4KICNpbmNsdWRlIDxsaW51eC9pb2N0bC5oPgogI2luY2x1ZGUgPGxpbnV4L2ZpbGUuaD4KKyNpbmNsdWRlIDxsaW51eC9jb21wYXQuaD4KICNpbmNsdWRlIDxuZXQvc29jay5oPgogCiAjaW5jbHVkZSA8bGludXgvaXNkbi9jYXBpbGxpLmg+CkBAIC0xMzcsMTEgKzEzOCw0MyBAQAogCXJldHVybiAtRUlOVkFMOwogfQogCisjaWZkZWYgQ09ORklHX0NPTVBBVAorc3RhdGljIGludCBjbXRwX3NvY2tfY29tcGF0X2lvY3RsKHN0cnVjdCBzb2NrZXQgKnNvY2ssIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCWlmIChjbWQgPT0gQ01UUEdFVENPTk5MSVNUKSB7CisJCXN0cnVjdCBjbXRwX2Nvbm5saXN0X3JlcSBjbDsKKwkJdWludDMyX3QgdWNpOworCQlpbnQgZXJyOworCisJCWlmIChnZXRfdXNlcihjbC5jbnVtLCAodWludDMyX3QgX191c2VyICopIGFyZykgfHwKKwkJCQlnZXRfdXNlcih1Y2ksICh1MzIgX191c2VyICopIChhcmcgKyA0KSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKworCQljbC5jaSA9IGNvbXBhdF9wdHIodWNpKTsKKworCQlpZiAoY2wuY251bSA8PSAwKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCisJCWVyciA9IGNtdHBfZ2V0X2Nvbm5saXN0KCZjbCk7CisKKwkJaWYgKCFlcnIgJiYgcHV0X3VzZXIoY2wuY251bSwgKHVpbnQzMl90IF9fdXNlciAqKSBhcmcpKQorCQkJZXJyID0gLUVGQVVMVDsKKworCQlyZXR1cm4gZXJyOworCX0KKworCXJldHVybiBjbXRwX3NvY2tfaW9jdGwoc29jaywgY21kLCBhcmcpOworfQorI2VuZGlmCisKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgcHJvdG9fb3BzIGNtdHBfc29ja19vcHMgPSB7CiAJLmZhbWlseQkJPSBQRl9CTFVFVE9PVEgsCiAJLm93bmVyCQk9IFRISVNfTU9EVUxFLAogCS5yZWxlYXNlCT0gY210cF9zb2NrX3JlbGVhc2UsCiAJLmlvY3RsCQk9IGNtdHBfc29ja19pb2N0bCwKKyNpZmRlZiBDT05GSUdfQ09NUEFUCisJLmNvbXBhdF9pb2N0bAk9IGNtdHBfc29ja19jb21wYXRfaW9jdGwsCisjZW5kaWYKIAkuYmluZAkJPSBzb2NrX25vX2JpbmQsCiAJLmdldG5hbWUJPSBzb2NrX25vX2dldG5hbWUsCiAJLnNlbmRtc2cJPSBzb2NrX25vX3NlbmRtc2csCkBAIC0xNzIsNyArMjA1LDcgQEAKIAlpZiAoc29jay0+dHlwZSAhPSBTT0NLX1JBVykKIAkJcmV0dXJuIC1FU09DS1ROT1NVUFBPUlQ7CiAKLQlzayA9IHNrX2FsbG9jKFBGX0JMVUVUT09USCwgR0ZQX0tFUk5FTCwgJmNtdHBfcHJvdG8sIDEpOworCXNrID0gc2tfYWxsb2MoUEZfQkxVRVRPT1RILCBHRlBfQVRPTUlDLCAmY210cF9wcm90bywgMSk7CiAJaWYgKCFzaykKIAkJcmV0dXJuIC1FTk9NRU07CiAKZGlmZiAtLWdpdCBhL25ldC9ibHVldG9vdGgvaGNpX2Nvbm4uYyBiL25ldC9ibHVldG9vdGgvaGNpX2Nvbm4uYwppbmRleCA5MGUzYTI4Li42Y2Q1NzExIDEwMDY0NAotLS0gYS9uZXQvYmx1ZXRvb3RoL2hjaV9jb25uLmMKKysrIGIvbmV0L2JsdWV0b290aC9oY2lfY29ubi5jCkBAIC01MSw3ICs1MSw3IEBACiAjZGVmaW5lIEJUX0RCRyhELi4uKQogI2VuZGlmCiAKLXN0YXRpYyB2b2lkIGhjaV9hY2xfY29ubmVjdChzdHJ1Y3QgaGNpX2Nvbm4gKmNvbm4pCit2b2lkIGhjaV9hY2xfY29ubmVjdChzdHJ1Y3QgaGNpX2Nvbm4gKmNvbm4pCiB7CiAJc3RydWN0IGhjaV9kZXYgKmhkZXYgPSBjb25uLT5oZGV2OwogCXN0cnVjdCBpbnF1aXJ5X2VudHJ5ICppZTsKQEAgLTYzLDYgKzYzLDggQEAKIAljb25uLT5vdXQgICA9IDE7CiAJY29ubi0+bGlua19tb2RlID0gSENJX0xNX01BU1RFUjsKIAorCWNvbm4tPmF0dGVtcHQrKzsKKwogCW1lbXNldCgmY3AsIDAsIHNpemVvZihjcCkpOwogCWJhY3B5KCZjcC5iZGFkZHIsICZjb25uLT5kc3QpOwogCWNwLnBzY2FuX3JlcF9tb2RlID0gMHgwMjsKQEAgLTgwLDcgKzgyLDcgQEAKIAkJY3Aucm9sZV9zd2l0Y2gJPSAweDAxOwogCWVsc2UKIAkJY3Aucm9sZV9zd2l0Y2gJPSAweDAwOwotCQkKKwogCWhjaV9zZW5kX2NtZChoZGV2LCBPR0ZfTElOS19DVEwsIE9DRl9DUkVBVEVfQ09OTiwgc2l6ZW9mKGNwKSwgJmNwKTsKIH0KIApkaWZmIC0tZ2l0IGEvbmV0L2JsdWV0b290aC9oY2lfZXZlbnQuYyBiL25ldC9ibHVldG9vdGgvaGNpX2V2ZW50LmMKaW5kZXggZDQzZDBjOC4uYmI5NGU2ZCAxMDA2NDQKLS0tIGEvbmV0L2JsdWV0b290aC9oY2lfZXZlbnQuYworKysgYi9uZXQvYmx1ZXRvb3RoL2hjaV9ldmVudC5jCkBAIC01Nyw2ICs1Nyw3IEBACiBzdGF0aWMgdm9pZCBoY2lfY2NfbGlua19jdGwoc3RydWN0IGhjaV9kZXYgKmhkZXYsIF9fdTE2IG9jZiwgc3RydWN0IHNrX2J1ZmYgKnNrYikKIHsKIAlfX3U4IHN0YXR1czsKKwlzdHJ1Y3QgaGNpX2Nvbm4gKnBlbmQ7CiAKIAlCVF9EQkcoIiVzIG9jZiAweCV4IiwgaGRldi0+bmFtZSwgb2NmKTsKIApAQCAtNzEsNiArNzIsMTUgQEAKIAkJCWNsZWFyX2JpdChIQ0lfSU5RVUlSWSwgJmhkZXYtPmZsYWdzKTsKIAkJCWhjaV9yZXFfY29tcGxldGUoaGRldiwgc3RhdHVzKTsKIAkJfQorCisJCWhjaV9kZXZfbG9jayhoZGV2KTsKKworCQlwZW5kID0gaGNpX2Nvbm5faGFzaF9sb29rdXBfc3RhdGUoaGRldiwgQUNMX0xJTkssIEJUX0NPTk5FQ1QyKTsKKwkJaWYgKHBlbmQpCisJCQloY2lfYWNsX2Nvbm5lY3QocGVuZCk7CisKKwkJaGNpX2Rldl91bmxvY2soaGRldik7CisKIAkJYnJlYWs7CiAKIAlkZWZhdWx0OgpAQCAtNDE0LDkgKzQyNCwxMiBAQAogCiAJaWYgKHN0YXR1cykgewogCQlpZiAoY29ubiAmJiBjb25uLT5zdGF0ZSA9PSBCVF9DT05ORUNUKSB7Ci0JCQljb25uLT5zdGF0ZSA9IEJUX0NMT1NFRDsKLQkJCWhjaV9wcm90b19jb25uZWN0X2NmbShjb25uLCBzdGF0dXMpOwotCQkJaGNpX2Nvbm5fZGVsKGNvbm4pOworCQkJaWYgKHN0YXR1cyAhPSAweDBjIHx8IGNvbm4tPmF0dGVtcHQgPiAyKSB7CisJCQkJY29ubi0+c3RhdGUgPSBCVF9DTE9TRUQ7CisJCQkJaGNpX3Byb3RvX2Nvbm5lY3RfY2ZtKGNvbm4sIHN0YXR1cyk7CisJCQkJaGNpX2Nvbm5fZGVsKGNvbm4pOworCQkJfSBlbHNlCisJCQkJY29ubi0+c3RhdGUgPSBCVF9DT05ORUNUMjsKIAkJfQogCX0gZWxzZSB7CiAJCWlmICghY29ubikgewpAQCAtNTYyLDExICs1NzUsMjAgQEAKIHN0YXRpYyBpbmxpbmUgdm9pZCBoY2lfaW5xdWlyeV9jb21wbGV0ZV9ldnQoc3RydWN0IGhjaV9kZXYgKmhkZXYsIHN0cnVjdCBza19idWZmICpza2IpCiB7CiAJX191OCBzdGF0dXMgPSAqKChfX3U4ICopIHNrYi0+ZGF0YSk7CisJc3RydWN0IGhjaV9jb25uICpwZW5kOwogCiAJQlRfREJHKCIlcyBzdGF0dXMgJWQiLCBoZGV2LT5uYW1lLCBzdGF0dXMpOwogCiAJY2xlYXJfYml0KEhDSV9JTlFVSVJZLCAmaGRldi0+ZmxhZ3MpOwogCWhjaV9yZXFfY29tcGxldGUoaGRldiwgc3RhdHVzKTsKKworCWhjaV9kZXZfbG9jayhoZGV2KTsKKworCXBlbmQgPSBoY2lfY29ubl9oYXNoX2xvb2t1cF9zdGF0ZShoZGV2LCBBQ0xfTElOSywgQlRfQ09OTkVDVDIpOworCWlmIChwZW5kKQorCQloY2lfYWNsX2Nvbm5lY3QocGVuZCk7CisKKwloY2lfZGV2X3VubG9jayhoZGV2KTsKIH0KIAogLyogSW5xdWlyeSBSZXN1bHQgKi8KQEAgLTcyOCw3ICs3NTAsNyBAQAogc3RhdGljIGlubGluZSB2b2lkIGhjaV9jb25uX2NvbXBsZXRlX2V2dChzdHJ1Y3QgaGNpX2RldiAqaGRldiwgc3RydWN0IHNrX2J1ZmYgKnNrYikKIHsKIAlzdHJ1Y3QgaGNpX2V2X2Nvbm5fY29tcGxldGUgKmV2ID0gKHN0cnVjdCBoY2lfZXZfY29ubl9jb21wbGV0ZSAqKSBza2ItPmRhdGE7Ci0Jc3RydWN0IGhjaV9jb25uICpjb25uOworCXN0cnVjdCBoY2lfY29ubiAqY29ubiwgKnBlbmQ7CiAKIAlCVF9EQkcoIiVzIiwgaGRldi0+bmFtZSk7CiAKQEAgLTgwMSw2ICs4MjMsMTAgQEAKIAlpZiAoZXYtPnN0YXR1cykKIAkJaGNpX2Nvbm5fZGVsKGNvbm4pOwogCisJcGVuZCA9IGhjaV9jb25uX2hhc2hfbG9va3VwX3N0YXRlKGhkZXYsIEFDTF9MSU5LLCBCVF9DT05ORUNUMik7CisJaWYgKHBlbmQpCisJCWhjaV9hY2xfY29ubmVjdChwZW5kKTsKKwogCWhjaV9kZXZfdW5sb2NrKGhkZXYpOwogfQogCmRpZmYgLS1naXQgYS9uZXQvYmx1ZXRvb3RoL2hjaV9zb2NrLmMgYi9uZXQvYmx1ZXRvb3RoL2hjaV9zb2NrLmMKaW5kZXggMWEzNWQzNC4uNzExYTA4NSAxMDA2NDQKLS0tIGEvbmV0L2JsdWV0b290aC9oY2lfc29jay5jCisrKyBiL25ldC9ibHVldG9vdGgvaGNpX3NvY2suYwpAQCAtMTIwLDEwICsxMjAsMTMgQEAKIAkJCWlmICghaGNpX3Rlc3RfYml0KGV2dCwgJmZsdC0+ZXZlbnRfbWFzaykpCiAJCQkJY29udGludWU7CiAKLQkJCWlmIChmbHQtPm9wY29kZSAmJiAoKGV2dCA9PSBIQ0lfRVZfQ01EX0NPTVBMRVRFICYmIAotCQkJCQlmbHQtPm9wY29kZSAhPSAqKF9fdTE2ICopKHNrYi0+ZGF0YSArIDMpKSB8fAotCQkJCQkoZXZ0ID09IEhDSV9FVl9DTURfU1RBVFVTICYmIAotCQkJCQlmbHQtPm9wY29kZSAhPSAqKF9fdTE2ICopKHNrYi0+ZGF0YSArIDQpKSkpCisJCQlpZiAoZmx0LT5vcGNvZGUgJiYKKwkJCSAgICAoKGV2dCA9PSBIQ0lfRVZfQ01EX0NPTVBMRVRFICYmCisJCQkgICAgICBmbHQtPm9wY29kZSAhPQorCQkJICAgICAgZ2V0X3VuYWxpZ25lZCgoX191MTYgKikoc2tiLT5kYXRhICsgMykpKSB8fAorCQkJICAgICAoZXZ0ID09IEhDSV9FVl9DTURfU1RBVFVTICYmCisJCQkgICAgICBmbHQtPm9wY29kZSAhPQorCQkJICAgICAgZ2V0X3VuYWxpZ25lZCgoX191MTYgKikoc2tiLT5kYXRhICsgNCkpKSkpCiAJCQkJY29udGludWU7CiAJCX0KIApAQCAtNjE4LDcgKzYyMSw3IEBACiAKIAlzb2NrLT5vcHMgPSAmaGNpX3NvY2tfb3BzOwogCi0Jc2sgPSBza19hbGxvYyhQRl9CTFVFVE9PVEgsIEdGUF9LRVJORUwsICZoY2lfc2tfcHJvdG8sIDEpOworCXNrID0gc2tfYWxsb2MoUEZfQkxVRVRPT1RILCBHRlBfQVRPTUlDLCAmaGNpX3NrX3Byb3RvLCAxKTsKIAlpZiAoIXNrKQogCQlyZXR1cm4gLUVOT01FTTsKIApkaWZmIC0tZ2l0IGEvbmV0L2JsdWV0b290aC9oY2lfc3lzZnMuYyBiL25ldC9ibHVldG9vdGgvaGNpX3N5c2ZzLmMKaW5kZXggOTg5YjIyZC4uM2VlZWI3YSAxMDA2NDQKLS0tIGEvbmV0L2JsdWV0b290aC9oY2lfc3lzZnMuYworKysgYi9uZXQvYmx1ZXRvb3RoL2hjaV9zeXNmcy5jCkBAIC0yNDIsMTAgKzI0MiwxNCBAQAogCXN0cnVjdCBoY2lfY29ubiAqY29ubiA9IGRhdGE7CiAJaW50IGk7CiAKLQlkZXZpY2VfcmVnaXN0ZXIoJmNvbm4tPmRldik7CisJaWYgKGRldmljZV9yZWdpc3RlcigmY29ubi0+ZGV2KSA8IDApIHsKKwkJQlRfRVJSKCJGYWlsZWQgdG8gcmVnaXN0ZXIgY29ubmVjdGlvbiBkZXZpY2UiKTsKKwkJcmV0dXJuOworCX0KIAogCWZvciAoaSA9IDA7IGNvbm5fYXR0cnNbaV07IGkrKykKLQkJZGV2aWNlX2NyZWF0ZV9maWxlKCZjb25uLT5kZXYsIGNvbm5fYXR0cnNbaV0pOworCQlpZiAoZGV2aWNlX2NyZWF0ZV9maWxlKCZjb25uLT5kZXYsIGNvbm5fYXR0cnNbaV0pIDwgMCkKKwkJCUJUX0VSUigiRmFpbGVkIHRvIGNyZWF0ZSBjb25uZWN0aW9uIGF0dHJpYnV0ZSIpOwogfQogCiB2b2lkIGhjaV9jb25uX2FkZF9zeXNmcyhzdHJ1Y3QgaGNpX2Nvbm4gKmNvbm4pCkBAIC0yNTUsNyArMjU5LDkgQEAKIAogCUJUX0RCRygiY29ubiAlcCIsIGNvbm4pOwogCi0JY29ubi0+ZGV2LnBhcmVudCAgPSAmaGRldi0+ZGV2OworCWNvbm4tPmRldi5idXMgPSAmYnRfYnVzOworCWNvbm4tPmRldi5wYXJlbnQgPSAmaGRldi0+ZGV2OworCiAJY29ubi0+ZGV2LnJlbGVhc2UgPSBidF9yZWxlYXNlOwogCiAJc25wcmludGYoY29ubi0+ZGV2LmJ1c19pZCwgQlVTX0lEX1NJWkUsCkBAIC0yOTUsMTEgKzMwMSw3IEBACiAJQlRfREJHKCIlcCBuYW1lICVzIHR5cGUgJWQiLCBoZGV2LCBoZGV2LT5uYW1lLCBoZGV2LT50eXBlKTsKIAogCWRldi0+Y2xhc3MgPSBidF9jbGFzczsKLQotCWlmIChoZGV2LT5wYXJlbnQpCi0JCWRldi0+cGFyZW50ID0gaGRldi0+cGFyZW50OwotCWVsc2UKLQkJZGV2LT5wYXJlbnQgPSAmYnRfcGxhdGZvcm0tPmRldjsKKwlkZXYtPnBhcmVudCA9IGhkZXYtPnBhcmVudDsKIAogCXN0cmxjcHkoZGV2LT5idXNfaWQsIGhkZXYtPm5hbWUsIEJVU19JRF9TSVpFKTsKIApAQCAtMzEyLDcgKzMxNCw4IEBACiAJCXJldHVybiBlcnI7CiAKIAlmb3IgKGkgPSAwOyBidF9hdHRyc1tpXTsgaSsrKQotCQlkZXZpY2VfY3JlYXRlX2ZpbGUoZGV2LCBidF9hdHRyc1tpXSk7CisJCWlmIChkZXZpY2VfY3JlYXRlX2ZpbGUoZGV2LCBidF9hdHRyc1tpXSkgPCAwKQorCQkJQlRfRVJSKCJGYWlsZWQgdG8gY3JlYXRlIGRldmljZSBhdHRyaWJ1dGUiKTsKIAogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvbmV0L2JsdWV0b290aC9oaWRwL2NvcmUuYyBiL25ldC9ibHVldG9vdGgvaGlkcC9jb3JlLmMKaW5kZXggMDNiNWRhZC4uNjY3ODIwMSAxMDA2NDQKLS0tIGEvbmV0L2JsdWV0b290aC9oaWRwL2NvcmUuYworKysgYi9uZXQvYmx1ZXRvb3RoL2hpZHAvY29yZS5jCkBAIC01MDcsMTUgKzUwNywxMyBAQAogCiAJaGlkcF9kZWxfdGltZXIoc2Vzc2lvbik7CiAKLQlpZiAoaW50cl9zay0+c2tfc3RhdGUgIT0gQlRfQ09OTkVDVEVEKQotCQl3YWl0X2V2ZW50X3RpbWVvdXQoKihjdHJsX3NrLT5za19zbGVlcCksIChjdHJsX3NrLT5za19zdGF0ZSA9PSBCVF9DTE9TRUQpLCBIWik7CisJZnB1dChzZXNzaW9uLT5pbnRyX3NvY2stPmZpbGUpOworCisJd2FpdF9ldmVudF90aW1lb3V0KCooY3RybF9zay0+c2tfc2xlZXApLAorCQkoY3RybF9zay0+c2tfc3RhdGUgPT0gQlRfQ0xPU0VEKSwgbXNlY3NfdG9famlmZmllcyg1MDApKTsKIAogCWZwdXQoc2Vzc2lvbi0+Y3RybF9zb2NrLT5maWxlKTsKIAotCXdhaXRfZXZlbnRfdGltZW91dCgqKGludHJfc2stPnNrX3NsZWVwKSwgKGludHJfc2stPnNrX3N0YXRlID09IEJUX0NMT1NFRCksIEhaKTsKLQotCWZwdXQoc2Vzc2lvbi0+aW50cl9zb2NrLT5maWxlKTsKLQogCV9faGlkcF91bmxpbmtfc2Vzc2lvbihzZXNzaW9uKTsKIAogCWlmIChzZXNzaW9uLT5pbnB1dCkgewpAQCAtNTQxLDEyICs1MzksMTAgQEAKIAkJcmV0dXJuIE5VTEw7CiAKIAljb25uID0gaGNpX2Nvbm5faGFzaF9sb29rdXBfYmEoaGRldiwgQUNMX0xJTkssIGRzdCk7Ci0JaWYgKCFjb25uKQotCQlyZXR1cm4gTlVMTDsKIAogCWhjaV9kZXZfcHV0KGhkZXYpOwogCi0JcmV0dXJuICZjb25uLT5kZXY7CisJcmV0dXJuIGNvbm4gPyAmY29ubi0+ZGV2IDogTlVMTDsKIH0KIAogc3RhdGljIGlubGluZSB2b2lkIGhpZHBfc2V0dXBfaW5wdXQoc3RydWN0IGhpZHBfc2Vzc2lvbiAqc2Vzc2lvbiwgc3RydWN0IGhpZHBfY29ubmFkZF9yZXEgKnJlcSkKZGlmZiAtLWdpdCBhL25ldC9ibHVldG9vdGgvaGlkcC9zb2NrLmMgYi9uZXQvYmx1ZXRvb3RoL2hpZHAvc29jay5jCmluZGV4IDA5OTY0NmUuLjQwN2ZiYTQgMTAwNjQ0Ci0tLSBhL25ldC9ibHVldG9vdGgvaGlkcC9zb2NrLmMKKysrIGIvbmV0L2JsdWV0b290aC9oaWRwL3NvY2suYwpAQCAtMzUsNiArMzUsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2lvY3RsLmg+CiAjaW5jbHVkZSA8bGludXgvZmlsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9jb21wYXQuaD4KICNpbmNsdWRlIDxuZXQvc29jay5oPgogCiAjaW5jbHVkZSAiaGlkcC5oIgpAQCAtMTQzLDExICsxNDQsODggQEAKIAlyZXR1cm4gLUVJTlZBTDsKIH0KIAorI2lmZGVmIENPTkZJR19DT01QQVQKK3N0cnVjdCBjb21wYXRfaGlkcF9jb25uYWRkX3JlcSB7CisJaW50ICAgY3RybF9zb2NrOwkvLyBDb25uZWN0ZWQgY29udHJvbCBzb2NrZXQKKwlpbnQgICBpbnRyX3NvY2s7CS8vIENvbm50ZXRlZCBpbnRlcnJ1cHQgc29ja2V0CisJX191MTYgcGFyc2VyOworCV9fdTE2IHJkX3NpemU7CisJY29tcGF0X3VwdHJfdCByZF9kYXRhOworCV9fdTggIGNvdW50cnk7CisJX191OCAgc3ViY2xhc3M7CisJX191MTYgdmVuZG9yOworCV9fdTE2IHByb2R1Y3Q7CisJX191MTYgdmVyc2lvbjsKKwlfX3UzMiBmbGFnczsKKwlfX3UzMiBpZGxlX3RvOworCWNoYXIgIG5hbWVbMTI4XTsKK307CisKK3N0YXRpYyBpbnQgaGlkcF9zb2NrX2NvbXBhdF9pb2N0bChzdHJ1Y3Qgc29ja2V0ICpzb2NrLCB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlpZiAoY21kID09IEhJRFBHRVRDT05OTElTVCkgeworCQlzdHJ1Y3QgaGlkcF9jb25ubGlzdF9yZXEgY2w7CisJCXVpbnQzMl90IHVjaTsKKwkJaW50IGVycjsKKworCQlpZiAoZ2V0X3VzZXIoY2wuY251bSwgKHVpbnQzMl90IF9fdXNlciAqKSBhcmcpIHx8CisJCQkJZ2V0X3VzZXIodWNpLCAodTMyIF9fdXNlciAqKSAoYXJnICsgNCkpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisKKwkJY2wuY2kgPSBjb21wYXRfcHRyKHVjaSk7CisKKwkJaWYgKGNsLmNudW0gPD0gMCkKKwkJCXJldHVybiAtRUlOVkFMOworCisJCWVyciA9IGhpZHBfZ2V0X2Nvbm5saXN0KCZjbCk7CisKKwkJaWYgKCFlcnIgJiYgcHV0X3VzZXIoY2wuY251bSwgKHVpbnQzMl90IF9fdXNlciAqKSBhcmcpKQorCQkJZXJyID0gLUVGQVVMVDsKKworCQlyZXR1cm4gZXJyOworCX0gZWxzZSBpZiAoY21kID09IEhJRFBDT05OQUREKSB7CisJCXN0cnVjdCBjb21wYXRfaGlkcF9jb25uYWRkX3JlcSBjYTsKKwkJc3RydWN0IGhpZHBfY29ubmFkZF9yZXEgX191c2VyICp1Y2E7CisKKwkJdWNhID0gY29tcGF0X2FsbG9jX3VzZXJfc3BhY2Uoc2l6ZW9mKCp1Y2EpKTsKKworCQlpZiAoY29weV9mcm9tX3VzZXIoJmNhLCAodm9pZCAqKSBhcmcsIHNpemVvZihjYSkpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisKKwkJaWYgKHB1dF91c2VyKGNhLmN0cmxfc29jaywgJnVjYS0+Y3RybF9zb2NrKSB8fAorCQkJCXB1dF91c2VyKGNhLmludHJfc29jaywgJnVjYS0+aW50cl9zb2NrKSB8fAorCQkJCXB1dF91c2VyKGNhLnBhcnNlciwgJnVjYS0+cGFyc2VyKSB8fAorCQkJCXB1dF91c2VyKGNhLnJkX3NpemUsICZ1Y2EtPnBhcnNlcikgfHwKKwkJCQlwdXRfdXNlcihjb21wYXRfcHRyKGNhLnJkX2RhdGEpLCAmdWNhLT5yZF9kYXRhKSB8fAorCQkJCXB1dF91c2VyKGNhLmNvdW50cnksICZ1Y2EtPmNvdW50cnkpIHx8CisJCQkJcHV0X3VzZXIoY2Euc3ViY2xhc3MsICZ1Y2EtPnN1YmNsYXNzKSB8fAorCQkJCXB1dF91c2VyKGNhLnZlbmRvciwgJnVjYS0+dmVuZG9yKSB8fAorCQkJCXB1dF91c2VyKGNhLnByb2R1Y3QsICZ1Y2EtPnByb2R1Y3QpIHx8CisJCQkJcHV0X3VzZXIoY2EudmVyc2lvbiwgJnVjYS0+dmVyc2lvbikgfHwKKwkJCQlwdXRfdXNlcihjYS5mbGFncywgJnVjYS0+ZmxhZ3MpIHx8CisJCQkJcHV0X3VzZXIoY2EuaWRsZV90bywgJnVjYS0+aWRsZV90bykgfHwKKwkJCQljb3B5X3RvX3VzZXIoJnVjYS0+bmFtZVswXSwgJmNhLm5hbWVbMF0sIDEyOCkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCisJCWFyZyA9ICh1bnNpZ25lZCBsb25nKSB1Y2E7CisKKwkJLyogRmFsbCB0aHJvdWdoLiBXZSBkb24ndCBhY3R1YWxseSB3cml0ZSBiYWNrIGFueSBfY2hhbmdlc18KKwkJICAgdG8gdGhlIHN0cnVjdHVyZSBhbnl3YXksIHNvIHRoZXJlJ3Mgbm8gbmVlZCB0byBjb3B5IGJhY2sKKwkJICAgaW50byB0aGUgb3JpZ2luYWwgY29tcGF0IHZlcnNpb24gKi8KKwl9CisKKwlyZXR1cm4gaGlkcF9zb2NrX2lvY3RsKHNvY2ssIGNtZCwgYXJnKTsKK30KKyNlbmRpZgorCiBzdGF0aWMgY29uc3Qgc3RydWN0IHByb3RvX29wcyBoaWRwX3NvY2tfb3BzID0gewogCS5mYW1pbHkJCT0gUEZfQkxVRVRPT1RILAogCS5vd25lcgkJPSBUSElTX01PRFVMRSwKIAkucmVsZWFzZQk9IGhpZHBfc29ja19yZWxlYXNlLAogCS5pb2N0bAkJPSBoaWRwX3NvY2tfaW9jdGwsCisjaWZkZWYgQ09ORklHX0NPTVBBVAorCS5jb21wYXRfaW9jdGwJPSBoaWRwX3NvY2tfY29tcGF0X2lvY3RsLAorI2VuZGlmCiAJLmJpbmQJCT0gc29ja19ub19iaW5kLAogCS5nZXRuYW1lCT0gc29ja19ub19nZXRuYW1lLAogCS5zZW5kbXNnCT0gc29ja19ub19zZW5kbXNnLApAQCAtMTc4LDcgKzI1Niw3IEBACiAJaWYgKHNvY2stPnR5cGUgIT0gU09DS19SQVcpCiAJCXJldHVybiAtRVNPQ0tUTk9TVVBQT1JUOwogCi0Jc2sgPSBza19hbGxvYyhQRl9CTFVFVE9PVEgsIEdGUF9LRVJORUwsICZoaWRwX3Byb3RvLCAxKTsKKwlzayA9IHNrX2FsbG9jKFBGX0JMVUVUT09USCwgR0ZQX0FUT01JQywgJmhpZHBfcHJvdG8sIDEpOwogCWlmICghc2spCiAJCXJldHVybiAtRU5PTUVNOwogCmRpZmYgLS1naXQgYS9uZXQvYmx1ZXRvb3RoL2wyY2FwLmMgYi9uZXQvYmx1ZXRvb3RoL2wyY2FwLmMKaW5kZXggZDU2ZjYwYi4uYmJmNzhlNiAxMDA2NDQKLS0tIGEvbmV0L2JsdWV0b290aC9sMmNhcC5jCisrKyBiL25ldC9ibHVldG9vdGgvbDJjYXAuYwpAQCAtNTU5LDcgKzU1OSw3IEBACiAKIAlzb2NrLT5vcHMgPSAmbDJjYXBfc29ja19vcHM7CiAKLQlzayA9IGwyY2FwX3NvY2tfYWxsb2Moc29jaywgcHJvdG9jb2wsIEdGUF9LRVJORUwpOworCXNrID0gbDJjYXBfc29ja19hbGxvYyhzb2NrLCBwcm90b2NvbCwgR0ZQX0FUT01JQyk7CiAJaWYgKCFzaykKIAkJcmV0dXJuIC1FTk9NRU07CiAKQEAgLTEzNTMsMTIgKzEzNTMsMTIgQEAKIAogCS8qIENvbmZpZ3VyZSBvdXRwdXQgb3B0aW9ucyBhbmQgbGV0IHRoZSBvdGhlciBzaWRlIGtub3cKIAkgKiB3aGljaCBvbmVzIHdlIGRvbid0IGxpa2UuICovCi0JaWYgKHBpLT5jb25mX210dSA8IHBpLT5vbXR1KSB7Ci0JCWwyY2FwX2FkZF9jb25mX29wdChwdHIsIEwyQ0FQX0NPTkZfTVRVLCAyLCBwaS0+b210dSk7CisJaWYgKHBpLT5jb25mX210dSA8IHBpLT5vbXR1KQogCQlyZXN1bHQgPSBMMkNBUF9DT05GX1VOQUNDRVBUOwotCX0gZWxzZSB7CisJZWxzZQogCQlwaS0+b210dSA9IHBpLT5jb25mX210dTsKLQl9CisKKwlsMmNhcF9hZGRfY29uZl9vcHQocHRyLCBMMkNBUF9DT05GX01UVSwgMiwgcGktPm9tdHUpOwogCiAJQlRfREJHKCJzayAlcCByZXN1bHQgJWQiLCBzaywgcmVzdWx0KTsKIAlyZXR1cm4gcmVzdWx0OwpAQCAtMTUzMyw2ICsxNTMzLDkgQEAKIAlpZiAoIShzayA9IGwyY2FwX2dldF9jaGFuX2J5X3NjaWQoJmNvbm4tPmNoYW5fbGlzdCwgZGNpZCkpKQogCQlyZXR1cm4gLUVOT0VOVDsKIAorCWlmIChzay0+c2tfc3RhdGUgPT0gQlRfRElTQ09OTikKKwkJZ290byB1bmxvY2s7CisKIAlsMmNhcF9wYXJzZV9jb25mX3JlcShzaywgcmVxLT5kYXRhLCBjbWQtPmxlbiAtIHNpemVvZigqcmVxKSk7CiAKIAlpZiAoZmxhZ3MgJiAweDAwMDEpIHsKQEAgLTIyMTYsNyArMjIxOSw4IEBACiAJCWdvdG8gZXJyb3I7CiAJfQogCi0JY2xhc3NfY3JlYXRlX2ZpbGUoYnRfY2xhc3MsICZjbGFzc19hdHRyX2wyY2FwKTsKKwlpZiAoY2xhc3NfY3JlYXRlX2ZpbGUoYnRfY2xhc3MsICZjbGFzc19hdHRyX2wyY2FwKSA8IDApCisJCUJUX0VSUigiRmFpbGVkIHRvIGNyZWF0ZSBMMkNBUCBpbmZvIGZpbGUiKTsKIAogCUJUX0lORk8oIkwyQ0FQIHZlciAlcyIsIFZFUlNJT04pOwogCUJUX0lORk8oIkwyQ0FQIHNvY2tldCBsYXllciBpbml0aWFsaXplZCIpOwpkaWZmIC0tZ2l0IGEvbmV0L2JsdWV0b290aC9yZmNvbW0vY29yZS5jIGIvbmV0L2JsdWV0b290aC9yZmNvbW0vY29yZS5jCmluZGV4IDQ2OGRmM2IuLmRkYzRlOWQgMTAwNjQ0Ci0tLSBhL25ldC9ibHVldG9vdGgvcmZjb21tL2NvcmUuYworKysgYi9uZXQvYmx1ZXRvb3RoL3JmY29tbS9jb3JlLmMKQEAgLTIwNTgsNyArMjA1OCw4IEBACiAKIAlrZXJuZWxfdGhyZWFkKHJmY29tbV9ydW4sIE5VTEwsIENMT05FX0tFUk5FTCk7CiAKLQljbGFzc19jcmVhdGVfZmlsZShidF9jbGFzcywgJmNsYXNzX2F0dHJfcmZjb21tX2RsYyk7CisJaWYgKGNsYXNzX2NyZWF0ZV9maWxlKGJ0X2NsYXNzLCAmY2xhc3NfYXR0cl9yZmNvbW1fZGxjKSA8IDApCisJCUJUX0VSUigiRmFpbGVkIHRvIGNyZWF0ZSBSRkNPTU0gaW5mbyBmaWxlIik7CiAKIAlyZmNvbW1faW5pdF9zb2NrZXRzKCk7CiAKZGlmZiAtLWdpdCBhL25ldC9ibHVldG9vdGgvcmZjb21tL3NvY2suYyBiL25ldC9ibHVldG9vdGgvcmZjb21tL3NvY2suYwppbmRleCAyMjBmZWUwLi41NDRkNjViIDEwMDY0NAotLS0gYS9uZXQvYmx1ZXRvb3RoL3JmY29tbS9zb2NrLmMKKysrIGIvbmV0L2JsdWV0b290aC9yZmNvbW0vc29jay5jCkBAIC0zMzYsNyArMzM2LDggQEAKIAogCXNvY2stPm9wcyA9ICZyZmNvbW1fc29ja19vcHM7CiAKLQlpZiAoIShzayA9IHJmY29tbV9zb2NrX2FsbG9jKHNvY2ssIHByb3RvY29sLCBHRlBfS0VSTkVMKSkpCisJc2sgPSByZmNvbW1fc29ja19hbGxvYyhzb2NrLCBwcm90b2NvbCwgR0ZQX0FUT01JQyk7CisJaWYgKCFzaykKIAkJcmV0dXJuIC1FTk9NRU07CiAKIAlyZmNvbW1fc29ja19pbml0KHNrLCBOVUxMKTsKQEAgLTk0NCw3ICs5NDUsOCBAQAogCWlmIChlcnIgPCAwKQogCQlnb3RvIGVycm9yOwogCi0JY2xhc3NfY3JlYXRlX2ZpbGUoYnRfY2xhc3MsICZjbGFzc19hdHRyX3JmY29tbSk7CisJaWYgKGNsYXNzX2NyZWF0ZV9maWxlKGJ0X2NsYXNzLCAmY2xhc3NfYXR0cl9yZmNvbW0pIDwgMCkKKwkJQlRfRVJSKCJGYWlsZWQgdG8gY3JlYXRlIFJGQ09NTSBpbmZvIGZpbGUiKTsKIAogCUJUX0lORk8oIlJGQ09NTSBzb2NrZXQgbGF5ZXIgaW5pdGlhbGl6ZWQiKTsKIApkaWZmIC0tZ2l0IGEvbmV0L2JsdWV0b290aC9yZmNvbW0vdHR5LmMgYi9uZXQvYmx1ZXRvb3RoL3JmY29tbS90dHkuYwppbmRleCAxOTU4YWQxLi4xZmI1ZDQyIDEwMDY0NAotLS0gYS9uZXQvYmx1ZXRvb3RoL3JmY29tbS90dHkuYworKysgYi9uZXQvYmx1ZXRvb3RoL3JmY29tbS90dHkuYwpAQCAtMTcyLDEyICsxNzIsMTAgQEAKIAkJcmV0dXJuIE5VTEw7CiAKIAljb25uID0gaGNpX2Nvbm5faGFzaF9sb29rdXBfYmEoaGRldiwgQUNMX0xJTkssICZkZXYtPmRzdCk7Ci0JaWYgKCFjb25uKQotCQlyZXR1cm4gTlVMTDsKIAogCWhjaV9kZXZfcHV0KGhkZXYpOwogCi0JcmV0dXJuICZjb25uLT5kZXY7CisJcmV0dXJuIGNvbm4gPyAmY29ubi0+ZGV2IDogTlVMTDsKIH0KIAogc3RhdGljIGludCByZmNvbW1fZGV2X2FkZChzdHJ1Y3QgcmZjb21tX2Rldl9yZXEgKnJlcSwgc3RydWN0IHJmY29tbV9kbGMgKmRsYykKQEAgLTc2Nyw2ICs3NjUsOSBAQAogCiAJQlRfREJHKCJ0dHkgJXAgdGVybWlvcyAlcCIsIHR0eSwgb2xkKTsKIAorCWlmICghZGV2IHx8ICFkZXYtPmRsYyB8fCAhZGV2LT5kbGMtPnNlc3Npb24pCisJCXJldHVybjsKKwogCS8qIEhhbmRsZSB0dXJuaW5nIG9mZiBDUlRTQ1RTICovCiAJaWYgKChvbGQtPmNfY2ZsYWcgJiBDUlRTQ1RTKSAmJiAhKG5ldy0+Y19jZmxhZyAmIENSVFNDVFMpKSAKIAkJQlRfREJHKCJUdXJuaW5nIG9mZiBDUlRTQ1RTIHVuc3VwcG9ydGVkIik7CmRpZmYgLS1naXQgYS9uZXQvYmx1ZXRvb3RoL3Njby5jIGIvbmV0L2JsdWV0b290aC9zY28uYwppbmRleCA3NzE0YTJlLi41ZDEzZDRmIDEwMDY0NAotLS0gYS9uZXQvYmx1ZXRvb3RoL3Njby5jCisrKyBiL25ldC9ibHVldG9vdGgvc2NvLmMKQEAgLTQ1Miw3ICs0NTIsOCBAQAogCiAJc29jay0+b3BzID0gJnNjb19zb2NrX29wczsKIAotCWlmICghKHNrID0gc2NvX3NvY2tfYWxsb2Moc29jaywgcHJvdG9jb2wsIEdGUF9LRVJORUwpKSkKKwlzayA9IHNjb19zb2NrX2FsbG9jKHNvY2ssIHByb3RvY29sLCBHRlBfQVRPTUlDKTsKKwlpZiAoIXNrKQogCQlyZXR1cm4gLUVOT01FTTsKIAogCXNjb19zb2NrX2luaXQoc2ssIE5VTEwpOwpAQCAtOTY3LDcgKzk2OCw4IEBACiAJCWdvdG8gZXJyb3I7CiAJfQogCi0JY2xhc3NfY3JlYXRlX2ZpbGUoYnRfY2xhc3MsICZjbGFzc19hdHRyX3Njbyk7CisJaWYgKGNsYXNzX2NyZWF0ZV9maWxlKGJ0X2NsYXNzLCAmY2xhc3NfYXR0cl9zY28pIDwgMCkKKwkJQlRfRVJSKCJGYWlsZWQgdG8gY3JlYXRlIFNDTyBpbmZvIGZpbGUiKTsKIAogCUJUX0lORk8oIlNDTyAoVm9pY2UgTGluaykgdmVyICVzIiwgVkVSU0lPTik7CiAJQlRfSU5GTygiU0NPIHNvY2tldCBsYXllciBpbml0aWFsaXplZCIpOwpkaWZmIC0tZ2l0IGEvbmV0L2JyaWRnZS9icl9mZGIuYyBiL25ldC9icmlkZ2UvYnJfZmRiLmMKaW5kZXggM2E3M2I4Yy4uZDlmMDQ4NiAxMDA2NDQKLS0tIGEvbmV0L2JyaWRnZS9icl9mZGIuYworKysgYi9uZXQvYnJpZGdlL2JyX2ZkYi5jCkBAIC0xMjgsNyArMTI4LDEwIEBACiAJbW9kX3RpbWVyKCZici0+Z2NfdGltZXIsIGppZmZpZXMgKyBIWi8xMCk7CiB9CiAKLXZvaWQgYnJfZmRiX2RlbGV0ZV9ieV9wb3J0KHN0cnVjdCBuZXRfYnJpZGdlICpiciwgc3RydWN0IG5ldF9icmlkZ2VfcG9ydCAqcCkKKwordm9pZCBicl9mZGJfZGVsZXRlX2J5X3BvcnQoc3RydWN0IG5ldF9icmlkZ2UgKmJyLAorCQkJICAgY29uc3Qgc3RydWN0IG5ldF9icmlkZ2VfcG9ydCAqcCwKKwkJCSAgIGludCBkb19hbGwpCiB7CiAJaW50IGk7CiAKQEAgLTE0Miw2ICsxNDUsOCBAQAogCQkJaWYgKGYtPmRzdCAhPSBwKSAKIAkJCQljb250aW51ZTsKIAorCQkJaWYgKGYtPmlzX3N0YXRpYyAmJiAhZG9fYWxsKQorCQkJCWNvbnRpbnVlOwogCQkJLyoKIAkJCSAqIGlmIG11bHRpcGxlIHBvcnRzIGFsbCBoYXZlIHRoZSBzYW1lIGRldmljZSBhZGRyZXNzCiAJCQkgKiB0aGVuIHdoZW4gb25lIHBvcnQgaXMgZGVsZXRlZCwgYXNzaWduCmRpZmYgLS1naXQgYS9uZXQvYnJpZGdlL2JyX2lmLmMgYi9uZXQvYnJpZGdlL2JyX2lmLmMKaW5kZXggYjEyMTFkNTM0Li5mNzUzYzQwIDEwMDY0NAotLS0gYS9uZXQvYnJpZGdlL2JyX2lmLmMKKysrIGIvbmV0L2JyaWRnZS9icl9pZi5jCkBAIC0xNjMsNyArMTYzLDcgQEAKIAlicl9zdHBfZGlzYWJsZV9wb3J0KHApOwogCXNwaW5fdW5sb2NrX2JoKCZici0+bG9jayk7CiAKLQlicl9mZGJfZGVsZXRlX2J5X3BvcnQoYnIsIHApOworCWJyX2ZkYl9kZWxldGVfYnlfcG9ydChiciwgcCwgMSk7CiAKIAlsaXN0X2RlbF9yY3UoJnAtPmxpc3QpOwogCkBAIC00NDgsNyArNDQ4LDcgQEAKIAogCXJldHVybiAwOwogZXJyMjoKLQlicl9mZGJfZGVsZXRlX2J5X3BvcnQoYnIsIHApOworCWJyX2ZkYl9kZWxldGVfYnlfcG9ydChiciwgcCwgMSk7CiBlcnIxOgogCWtvYmplY3RfZGVsKCZwLT5rb2JqKTsKIGVycjA6CmRpZmYgLS1naXQgYS9uZXQvYnJpZGdlL2JyX3ByaXZhdGUuaCBiL25ldC9icmlkZ2UvYnJfcHJpdmF0ZS5oCmluZGV4IGM0OTFmYjIuLjc0MjU4ZDggMTAwNjQ0Ci0tLSBhL25ldC9icmlkZ2UvYnJfcHJpdmF0ZS5oCisrKyBiL25ldC9icmlkZ2UvYnJfcHJpdmF0ZS5oCkBAIC0xNDMsNyArMTQzLDcgQEAKIAkJCSAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKm5ld2FkZHIpOwogZXh0ZXJuIHZvaWQgYnJfZmRiX2NsZWFudXAodW5zaWduZWQgbG9uZyBhcmcpOwogZXh0ZXJuIHZvaWQgYnJfZmRiX2RlbGV0ZV9ieV9wb3J0KHN0cnVjdCBuZXRfYnJpZGdlICpiciwKLQkJCSAgIHN0cnVjdCBuZXRfYnJpZGdlX3BvcnQgKnApOworCQkJCSAgY29uc3Qgc3RydWN0IG5ldF9icmlkZ2VfcG9ydCAqcCwgaW50IGRvX2FsbCk7CiBleHRlcm4gc3RydWN0IG5ldF9icmlkZ2VfZmRiX2VudHJ5ICpfX2JyX2ZkYl9nZXQoc3RydWN0IG5ldF9icmlkZ2UgKmJyLAogCQkJCQkJIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmFkZHIpOwogZXh0ZXJuIHN0cnVjdCBuZXRfYnJpZGdlX2ZkYl9lbnRyeSAqYnJfZmRiX2dldChzdHJ1Y3QgbmV0X2JyaWRnZSAqYnIsCmRpZmYgLS1naXQgYS9uZXQvYnJpZGdlL2JyX3N0cF9pZi5jIGIvbmV0L2JyaWRnZS9icl9zdHBfaWYuYwppbmRleCAxNGNkMDI1Li5kMjk0MjI0IDEwMDY0NAotLS0gYS9uZXQvYnJpZGdlL2JyX3N0cF9pZi5jCisrKyBiL25ldC9icmlkZ2UvYnJfc3RwX2lmLmMKQEAgLTExMyw2ICsxMTMsOCBAQAogCWRlbF90aW1lcigmcC0+Zm9yd2FyZF9kZWxheV90aW1lcik7CiAJZGVsX3RpbWVyKCZwLT5ob2xkX3RpbWVyKTsKIAorCWJyX2ZkYl9kZWxldGVfYnlfcG9ydChiciwgcCwgMCk7CisKIAlicl9jb25maWd1cmF0aW9uX3VwZGF0ZShicik7CiAKIAlicl9wb3J0X3N0YXRlX3NlbGVjdGlvbihicik7CmRpZmYgLS1naXQgYS9uZXQvYnJpZGdlL2JyX3N5c2ZzX2JyLmMgYi9uZXQvYnJpZGdlL2JyX3N5c2ZzX2JyLmMKaW5kZXggOTZiY2IyZi4uZGU5ZDFhOSAxMDA2NDQKLS0tIGEvbmV0L2JyaWRnZS9icl9zeXNmc19ici5jCisrKyBiL25ldC9icmlkZ2UvYnJfc3lzZnNfYnIuYwpAQCAtMzc2LDcgKzM3Niw3IEBACiAKIAllcnIgPSBzeXNmc19jcmVhdGVfYmluX2ZpbGUoYnJvYmosICZicmlkZ2VfZm9yd2FyZCk7CiAJaWYgKGVycikgewotCQlwcl9pbmZvKCIlczogY2FuJ3QgY3JlYXRlIGF0dHJpYnVlIGZpbGUgJXMvJXNcbiIsCisJCXByX2luZm8oIiVzOiBjYW4ndCBjcmVhdGUgYXR0cmlidXRlIGZpbGUgJXMvJXNcbiIsCiAJCQlfX0ZVTkNUSU9OX18sIGRldi0+bmFtZSwgYnJpZGdlX2ZvcndhcmQuYXR0ci5uYW1lKTsKIAkJZ290byBvdXQyOwogCX0KZGlmZiAtLWdpdCBhL25ldC9icmlkZ2UvbmV0ZmlsdGVyL2VidGFibGVzLmMgYi9uZXQvYnJpZGdlL25ldGZpbHRlci9lYnRhYmxlcy5jCmluZGV4IDNkZjU1YjIuLjlmODU2NjYgMTAwNjQ0Ci0tLSBhL25ldC9icmlkZ2UvbmV0ZmlsdGVyL2VidGFibGVzLmMKKysrIGIvbmV0L2JyaWRnZS9uZXRmaWx0ZXIvZWJ0YWJsZXMuYwpAQCAtODYsNyArODYsNyBAQAogc3RhdGljIGlubGluZSBpbnQgZWJ0X2Rldl9jaGVjayhjaGFyICplbnRyeSwgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmRldmljZSkKIHsKIAlpbnQgaSA9IDA7Ci0JY2hhciAqZGV2bmFtZSA9IGRldmljZS0+bmFtZTsKKwljb25zdCBjaGFyICpkZXZuYW1lID0gZGV2aWNlLT5uYW1lOwogCiAJaWYgKCplbnRyeSA9PSAnXDAnKQogCQlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL25ldC9jb21wYXQuYyBiL25ldC9jb21wYXQuYwppbmRleCBkNWQ2OWZhLi41MmQzMmYxIDEwMDY0NAotLS0gYS9uZXQvY29tcGF0LmMKKysrIGIvbmV0L2NvbXBhdC5jCkBAIC0yODUsOCArMjg1LDcgQEAKIAogCWlmIChpID4gMCkgewogCQlpbnQgY21sZW4gPSBDTVNHX0NPTVBBVF9MRU4oaSAqIHNpemVvZihpbnQpKTsKLQkJaWYgKCFlcnIpCi0JCQllcnIgPSBwdXRfdXNlcihTT0xfU09DS0VULCAmY20tPmNtc2dfbGV2ZWwpOworCQllcnIgPSBwdXRfdXNlcihTT0xfU09DS0VULCAmY20tPmNtc2dfbGV2ZWwpOwogCQlpZiAoIWVycikKIAkJCWVyciA9IHB1dF91c2VyKFNDTV9SSUdIVFMsICZjbS0+Y21zZ190eXBlKTsKIAkJaWYgKCFlcnIpCmRpZmYgLS1naXQgYS9uZXQvY29yZS9kZXYuYyBiL25ldC9jb3JlL2Rldi5jCmluZGV4IDRkODkxYmUuLjgxYzQyNmEgMTAwNjQ0Ci0tLSBhL25ldC9jb3JlL2Rldi5jCisrKyBiL25ldC9jb3JlL2Rldi5jCkBAIC0zNTAyLDggKzM1MDIsNiBAQAogCiAJQlVHX09OKCFkZXZfYm9vdF9waGFzZSk7CiAKLQluZXRfcmFuZG9tX2luaXQoKTsKLQogCWlmIChkZXZfcHJvY19pbml0KCkpCiAJCWdvdG8gb3V0OwogCmRpZmYgLS1naXQgYS9uZXQvY29yZS9mbG93LmMgYi9uZXQvY29yZS9mbG93LmMKaW5kZXggZjIzZTdlMy4uYjE2ZDMxYSAxMDA2NDQKLS0tIGEvbmV0L2NvcmUvZmxvdy5jCisrKyBiL25ldC9jb3JlL2Zsb3cuYwpAQCAtODUsNiArODUsMTQgQEAKIAlhZGRfdGltZXIoJmZsb3dfaGFzaF9ybmRfdGltZXIpOwogfQogCitzdGF0aWMgdm9pZCBmbG93X2VudHJ5X2tpbGwoaW50IGNwdSwgc3RydWN0IGZsb3dfY2FjaGVfZW50cnkgKmZsZSkKK3sKKwlpZiAoZmxlLT5vYmplY3QpCisJCWF0b21pY19kZWMoZmxlLT5vYmplY3RfcmVmKTsKKwlrbWVtX2NhY2hlX2ZyZWUoZmxvd19jYWNoZXAsIGZsZSk7CisJZmxvd19jb3VudChjcHUpLS07Cit9CisKIHN0YXRpYyB2b2lkIF9fZmxvd19jYWNoZV9zaHJpbmsoaW50IGNwdSwgaW50IHNocmlua190bykKIHsKIAlzdHJ1Y3QgZmxvd19jYWNoZV9lbnRyeSAqZmxlLCAqKmZscDsKQEAgLTEwMCwxMCArMTA4LDcgQEAKIAkJfQogCQl3aGlsZSAoKGZsZSA9ICpmbHApICE9IE5VTEwpIHsKIAkJCSpmbHAgPSBmbGUtPm5leHQ7Ci0JCQlpZiAoZmxlLT5vYmplY3QpCi0JCQkJYXRvbWljX2RlYyhmbGUtPm9iamVjdF9yZWYpOwotCQkJa21lbV9jYWNoZV9mcmVlKGZsb3dfY2FjaGVwLCBmbGUpOwotCQkJZmxvd19jb3VudChjcHUpLS07CisJCQlmbG93X2VudHJ5X2tpbGwoY3B1LCBmbGUpOwogCQl9CiAJfQogfQpAQCAtMjIwLDI0ICsyMjUsMzMgQEAKIAogbm9jYWNoZToKIAl7CisJCWludCBlcnI7CiAJCXZvaWQgKm9iajsKIAkJYXRvbWljX3QgKm9ial9yZWY7CiAKLQkJcmVzb2x2ZXIoa2V5LCBmYW1pbHksIGRpciwgJm9iaiwgJm9ial9yZWYpOworCQllcnIgPSByZXNvbHZlcihrZXksIGZhbWlseSwgZGlyLCAmb2JqLCAmb2JqX3JlZik7CiAKIAkJaWYgKGZsZSkgewotCQkJZmxlLT5nZW5pZCA9IGF0b21pY19yZWFkKCZmbG93X2NhY2hlX2dlbmlkKTsKKwkJCWlmIChlcnIpIHsKKwkJCQkvKiBGb3JjZSBzZWN1cml0eSBwb2xpY3kgY2hlY2sgb24gbmV4dCBsb29rdXAgKi8KKwkJCQkqaGVhZCA9IGZsZS0+bmV4dDsKKwkJCQlmbG93X2VudHJ5X2tpbGwoY3B1LCBmbGUpOworCQkJfSBlbHNlIHsKKwkJCQlmbGUtPmdlbmlkID0gYXRvbWljX3JlYWQoJmZsb3dfY2FjaGVfZ2VuaWQpOwogCi0JCQlpZiAoZmxlLT5vYmplY3QpCi0JCQkJYXRvbWljX2RlYyhmbGUtPm9iamVjdF9yZWYpOworCQkJCWlmIChmbGUtPm9iamVjdCkKKwkJCQkJYXRvbWljX2RlYyhmbGUtPm9iamVjdF9yZWYpOwogCi0JCQlmbGUtPm9iamVjdCA9IG9iajsKLQkJCWZsZS0+b2JqZWN0X3JlZiA9IG9ial9yZWY7Ci0JCQlpZiAob2JqKQotCQkJCWF0b21pY19pbmMoZmxlLT5vYmplY3RfcmVmKTsKKwkJCQlmbGUtPm9iamVjdCA9IG9iajsKKwkJCQlmbGUtPm9iamVjdF9yZWYgPSBvYmpfcmVmOworCQkJCWlmIChvYmopCisJCQkJCWF0b21pY19pbmMoZmxlLT5vYmplY3RfcmVmKTsKKwkJCX0KIAkJfQogCQlsb2NhbF9iaF9lbmFibGUoKTsKIAorCQlpZiAoZXJyKQorCQkJb2JqID0gRVJSX1BUUihlcnIpOwogCQlyZXR1cm4gb2JqOwogCX0KIH0KZGlmZiAtLWdpdCBhL25ldC9jb3JlL25ldHBvbGwuYyBiL25ldC9jb3JlL25ldHBvbGwuYwppbmRleCBlYWQ1OTIwLi42NTg5YWRiIDEwMDY0NAotLS0gYS9uZXQvY29yZS9uZXRwb2xsLmMKKysrIGIvbmV0L2NvcmUvbmV0cG9sbC5jCkBAIC0zMzUsMTMgKzMzNSwxOSBAQAogCW1lbWNweShza2ItPmRhdGEsIG1zZywgbGVuKTsKIAlza2ItPmxlbiArPSBsZW47CiAKLQl1ZHBoID0gKHN0cnVjdCB1ZHBoZHIgKikgc2tiX3B1c2goc2tiLCBzaXplb2YoKnVkcGgpKTsKKwlza2ItPmgudWggPSB1ZHBoID0gKHN0cnVjdCB1ZHBoZHIgKikgc2tiX3B1c2goc2tiLCBzaXplb2YoKnVkcGgpKTsKIAl1ZHBoLT5zb3VyY2UgPSBodG9ucyhucC0+bG9jYWxfcG9ydCk7CiAJdWRwaC0+ZGVzdCA9IGh0b25zKG5wLT5yZW1vdGVfcG9ydCk7CiAJdWRwaC0+bGVuID0gaHRvbnModWRwX2xlbik7CiAJdWRwaC0+Y2hlY2sgPSAwOworCXVkcGgtPmNoZWNrID0gY3N1bV90Y3B1ZHBfbWFnaWMoaHRvbmwobnAtPmxvY2FsX2lwKSwKKwkJCQkJaHRvbmwobnAtPnJlbW90ZV9pcCksCisJCQkJCXVkcF9sZW4sIElQUFJPVE9fVURQLAorCQkJCQljc3VtX3BhcnRpYWwoKHVuc2lnbmVkIGNoYXIgKil1ZHBoLCB1ZHBfbGVuLCAwKSk7CisJaWYgKHVkcGgtPmNoZWNrID09IDApCisJCXVkcGgtPmNoZWNrID0gLTE7CiAKLQlpcGggPSAoc3RydWN0IGlwaGRyICopc2tiX3B1c2goc2tiLCBzaXplb2YoKmlwaCkpOworCXNrYi0+bmguaXBoID0gaXBoID0gKHN0cnVjdCBpcGhkciAqKXNrYl9wdXNoKHNrYiwgc2l6ZW9mKCppcGgpKTsKIAogCS8qIGlwaC0+dmVyc2lvbiA9IDQ7IGlwaC0+aWhsID0gNTsgKi8KIAlwdXRfdW5hbGlnbmVkKDB4NDUsICh1bnNpZ25lZCBjaGFyICopaXBoKTsKQEAgLTM1Nyw4ICszNjMsOCBAQAogCWlwaC0+Y2hlY2sgICAgPSBpcF9mYXN0X2NzdW0oKHVuc2lnbmVkIGNoYXIgKilpcGgsIGlwaC0+aWhsKTsKIAogCWV0aCA9IChzdHJ1Y3QgZXRoaGRyICopIHNrYl9wdXNoKHNrYiwgRVRIX0hMRU4pOwotCi0JZXRoLT5oX3Byb3RvID0gaHRvbnMoRVRIX1BfSVApOworCXNrYi0+bWFjLnJhdyA9IHNrYi0+ZGF0YTsKKwlza2ItPnByb3RvY29sID0gZXRoLT5oX3Byb3RvID0gaHRvbnMoRVRIX1BfSVApOwogCW1lbWNweShldGgtPmhfc291cmNlLCBucC0+bG9jYWxfbWFjLCA2KTsKIAltZW1jcHkoZXRoLT5oX2Rlc3QsIG5wLT5yZW1vdGVfbWFjLCA2KTsKIApkaWZmIC0tZ2l0IGEvbmV0L2NvcmUvcGt0Z2VuLmMgYi9uZXQvY29yZS9wa3RnZW4uYwppbmRleCBkZDAyM2ZkLi43MzNkODZkIDEwMDY0NAotLS0gYS9uZXQvY29yZS9wa3RnZW4uYworKysgYi9uZXQvY29yZS9wa3RnZW4uYwpAQCAtMjMwNCw2ICsyMzA0LDEyIEBACiAJKm1wbHMgfD0gTVBMU19TVEFDS19CT1RUT007CiB9CiAKK3N0YXRpYyBpbmxpbmUgX19iZTE2IGJ1aWxkX3RjaSh1bnNpZ25lZCBpbnQgaWQsIHVuc2lnbmVkIGludCBjZmksCisJCQkgICAgICAgdW5zaWduZWQgaW50IHByaW8pCit7CisJcmV0dXJuIGh0b25zKGlkIHwgKGNmaSA8PCAxMikgfCAocHJpbyA8PCAxMykpOworfQorCiBzdGF0aWMgc3RydWN0IHNrX2J1ZmYgKmZpbGxfcGFja2V0X2lwdjQoc3RydWN0IG5ldF9kZXZpY2UgKm9kZXYsCiAJCQkJCXN0cnVjdCBwa3RnZW5fZGV2ICpwa3RfZGV2KQogewpAQCAtMjM1MywxNiArMjM1OSwxNiBAQAogCWlmIChwa3RfZGV2LT52bGFuX2lkICE9IDB4ZmZmZikgewogCQlpZihwa3RfZGV2LT5zdmxhbl9pZCAhPSAweGZmZmYpIHsKIAkJCXN2bGFuX3RjaSA9IChfX2JlMTYgKilza2JfcHV0KHNrYiwgc2l6ZW9mKF9fYmUxNikpOwotCQkJKnN2bGFuX3RjaSA9IGh0b25zKHBrdF9kZXYtPnN2bGFuX2lkKTsKLQkJCSpzdmxhbl90Y2kgfD0gcGt0X2Rldi0+c3ZsYW5fcCA8PCA1OwotCQkJKnN2bGFuX3RjaSB8PSBwa3RfZGV2LT5zdmxhbl9jZmkgPDwgNDsKKwkJCSpzdmxhbl90Y2kgPSBidWlsZF90Y2kocGt0X2Rldi0+c3ZsYW5faWQsCisJCQkJCSAgICAgICBwa3RfZGV2LT5zdmxhbl9jZmksCisJCQkJCSAgICAgICBwa3RfZGV2LT5zdmxhbl9wKTsKIAkJCXN2bGFuX2VuY2Fwc3VsYXRlZF9wcm90byA9IChfX2JlMTYgKilza2JfcHV0KHNrYiwgc2l6ZW9mKF9fYmUxNikpOwogCQkJKnN2bGFuX2VuY2Fwc3VsYXRlZF9wcm90byA9IF9fY29uc3RhbnRfaHRvbnMoRVRIX1BfODAyMVEpOwogCQl9CiAJCXZsYW5fdGNpID0gKF9fYmUxNiAqKXNrYl9wdXQoc2tiLCBzaXplb2YoX19iZTE2KSk7Ci0JCSp2bGFuX3RjaSA9IGh0b25zKHBrdF9kZXYtPnZsYW5faWQpOwotCQkqdmxhbl90Y2kgfD0gcGt0X2Rldi0+dmxhbl9wIDw8IDU7Ci0JCSp2bGFuX3RjaSB8PSBwa3RfZGV2LT52bGFuX2NmaSA8PCA0OworCQkqdmxhbl90Y2kgPSBidWlsZF90Y2kocGt0X2Rldi0+dmxhbl9pZCwKKwkJCQkgICAgICBwa3RfZGV2LT52bGFuX2NmaSwKKwkJCQkgICAgICBwa3RfZGV2LT52bGFuX3ApOwogCQl2bGFuX2VuY2Fwc3VsYXRlZF9wcm90byA9IChfX2JlMTYgKilza2JfcHV0KHNrYiwgc2l6ZW9mKF9fYmUxNikpOwogCQkqdmxhbl9lbmNhcHN1bGF0ZWRfcHJvdG8gPSBfX2NvbnN0YW50X2h0b25zKEVUSF9QX0lQKTsKIAl9CkBAIC0yNjg5LDE2ICsyNjk1LDE2IEBACiAJaWYgKHBrdF9kZXYtPnZsYW5faWQgIT0gMHhmZmZmKSB7CiAJCWlmKHBrdF9kZXYtPnN2bGFuX2lkICE9IDB4ZmZmZikgewogCQkJc3ZsYW5fdGNpID0gKF9fYmUxNiAqKXNrYl9wdXQoc2tiLCBzaXplb2YoX19iZTE2KSk7Ci0JCQkqc3ZsYW5fdGNpID0gaHRvbnMocGt0X2Rldi0+c3ZsYW5faWQpOwotCQkJKnN2bGFuX3RjaSB8PSBwa3RfZGV2LT5zdmxhbl9wIDw8IDU7Ci0JCQkqc3ZsYW5fdGNpIHw9IHBrdF9kZXYtPnN2bGFuX2NmaSA8PCA0OworCQkJKnN2bGFuX3RjaSA9IGJ1aWxkX3RjaShwa3RfZGV2LT5zdmxhbl9pZCwKKwkJCQkJICAgICAgIHBrdF9kZXYtPnN2bGFuX2NmaSwKKwkJCQkJICAgICAgIHBrdF9kZXYtPnN2bGFuX3ApOwogCQkJc3ZsYW5fZW5jYXBzdWxhdGVkX3Byb3RvID0gKF9fYmUxNiAqKXNrYl9wdXQoc2tiLCBzaXplb2YoX19iZTE2KSk7CiAJCQkqc3ZsYW5fZW5jYXBzdWxhdGVkX3Byb3RvID0gX19jb25zdGFudF9odG9ucyhFVEhfUF84MDIxUSk7CiAJCX0KIAkJdmxhbl90Y2kgPSAoX19iZTE2ICopc2tiX3B1dChza2IsIHNpemVvZihfX2JlMTYpKTsKLQkJKnZsYW5fdGNpID0gaHRvbnMocGt0X2Rldi0+dmxhbl9pZCk7Ci0JCSp2bGFuX3RjaSB8PSBwa3RfZGV2LT52bGFuX3AgPDwgNTsKLQkJKnZsYW5fdGNpIHw9IHBrdF9kZXYtPnZsYW5fY2ZpIDw8IDQ7CisJCSp2bGFuX3RjaSA9IGJ1aWxkX3RjaShwa3RfZGV2LT52bGFuX2lkLAorCQkJCSAgICAgIHBrdF9kZXYtPnZsYW5fY2ZpLAorCQkJCSAgICAgIHBrdF9kZXYtPnZsYW5fcCk7CiAJCXZsYW5fZW5jYXBzdWxhdGVkX3Byb3RvID0gKF9fYmUxNiAqKXNrYl9wdXQoc2tiLCBzaXplb2YoX19iZTE2KSk7CiAJCSp2bGFuX2VuY2Fwc3VsYXRlZF9wcm90byA9IF9fY29uc3RhbnRfaHRvbnMoRVRIX1BfSVBWNik7CiAJfQpkaWZmIC0tZ2l0IGEvbmV0L2NvcmUvcnRuZXRsaW5rLmMgYi9uZXQvY29yZS9ydG5ldGxpbmsuYwppbmRleCAyMjFlNDAzLi4wMmYzYzc5IDEwMDY0NAotLS0gYS9uZXQvY29yZS9ydG5ldGxpbmsuYworKysgYi9uZXQvY29yZS9ydG5ldGxpbmsuYwpAQCAtNjAyLDcgKzYwMiw3IEBACiAJCWdvdG8gZXJyb3V0OwogCX0KIAotCWVyciA9IHJ0bmxfdW5pY2FzdChza2IsIE5FVExJTktfQ0Ioc2tiKS5waWQpOworCWVyciA9IHJ0bmxfdW5pY2FzdChuc2tiLCBORVRMSU5LX0NCKHNrYikucGlkKTsKIGVycm91dDoKIAlrZnJlZShpd19idWYpOwogCWRldl9wdXQoZGV2KTsKZGlmZiAtLWdpdCBhL25ldC9jb3JlL3NjbS5jIGIvbmV0L2NvcmUvc2NtLmMKaW5kZXggNjQ5ZDAxZS4uMjcxY2YwNiAxMDA2NDQKLS0tIGEvbmV0L2NvcmUvc2NtLmMKKysrIGIvbmV0L2NvcmUvc2NtLmMKQEAgLTI0NSw4ICsyNDUsNyBAQAogCWlmIChpID4gMCkKIAl7CiAJCWludCBjbWxlbiA9IENNU0dfTEVOKGkqc2l6ZW9mKGludCkpOwotCQlpZiAoIWVycikKLQkJCWVyciA9IHB1dF91c2VyKFNPTF9TT0NLRVQsICZjbS0+Y21zZ19sZXZlbCk7CisJCWVyciA9IHB1dF91c2VyKFNPTF9TT0NLRVQsICZjbS0+Y21zZ19sZXZlbCk7CiAJCWlmICghZXJyKQogCQkJZXJyID0gcHV0X3VzZXIoU0NNX1JJR0hUUywgJmNtLT5jbXNnX3R5cGUpOwogCQlpZiAoIWVycikKZGlmZiAtLWdpdCBhL25ldC9jb3JlL3NrYnVmZi5jIGIvbmV0L2NvcmUvc2tidWZmLmMKaW5kZXggM2MyMzc2MC4uYjhiMTA2MyAxMDA2NDQKLS0tIGEvbmV0L2NvcmUvc2tidWZmLmMKKysrIGIvbmV0L2NvcmUvc2tidWZmLmMKQEAgLTYzOSw2ICs2MzksNyBAQAogCW4tPmNzdW0JICAgICA9IHNrYi0+Y3N1bTsKIAluLT5pcF9zdW1tZWQgPSBza2ItPmlwX3N1bW1lZDsKIAorCW4tPnRydWVzaXplICs9IHNrYi0+ZGF0YV9sZW47CiAJbi0+ZGF0YV9sZW4gID0gc2tiLT5kYXRhX2xlbjsKIAluLT5sZW4JICAgICA9IHNrYi0+bGVuOwogCkBAIC0xOTQ2LDcgKzE5NDcsNyBAQAogCWRvIHsKIAkJc3RydWN0IHNrX2J1ZmYgKm5za2I7CiAJCXNrYl9mcmFnX3QgKmZyYWc7Ci0JCWludCBoc2l6ZSwgbnNpemU7CisJCWludCBoc2l6ZTsKIAkJaW50IGs7CiAJCWludCBzaXplOwogCkBAIC0xOTU3LDExICsxOTU4LDEwIEBACiAJCWhzaXplID0gc2tiX2hlYWRsZW4oc2tiKSAtIG9mZnNldDsKIAkJaWYgKGhzaXplIDwgMCkKIAkJCWhzaXplID0gMDsKLQkJbnNpemUgPSBoc2l6ZSArIGRvZmZzZXQ7Ci0JCWlmIChuc2l6ZSA+IGxlbiArIGRvZmZzZXQgfHwgIXNnKQotCQkJbnNpemUgPSBsZW4gKyBkb2Zmc2V0OworCQlpZiAoaHNpemUgPiBsZW4gfHwgIXNnKQorCQkJaHNpemUgPSBsZW47CiAKLQkJbnNrYiA9IGFsbG9jX3NrYihuc2l6ZSArIGhlYWRyb29tLCBHRlBfQVRPTUlDKTsKKwkJbnNrYiA9IGFsbG9jX3NrYihoc2l6ZSArIGRvZmZzZXQgKyBoZWFkcm9vbSwgR0ZQX0FUT01JQyk7CiAJCWlmICh1bmxpa2VseSghbnNrYikpCiAJCQlnb3RvIGVycjsKIApkaWZmIC0tZ2l0IGEvbmV0L2NvcmUvc29jay5jIGIvbmV0L2NvcmUvc29jay5jCmluZGV4IGI3N2UxNTUuLmVlNmNkMjUgMTAwNjQ0Ci0tLSBhL25ldC9jb3JlL3NvY2suYworKysgYi9uZXQvY29yZS9zb2NrLmMKQEAgLTgyMyw3ICs4MjMsNyBAQAogCQkJCSAgIGFmX2ZhbWlseV9zbG9ja19rZXlfc3RyaW5nc1tzay0+c2tfZmFtaWx5XSk7CiAJbG9ja2RlcF9pbml0X21hcCgmc2stPnNrX2xvY2suZGVwX21hcCwKIAkJCSBhZl9mYW1pbHlfa2V5X3N0cmluZ3Nbc2stPnNrX2ZhbWlseV0sCi0JCQkgYWZfZmFtaWx5X2tleXMgKyBzay0+c2tfZmFtaWx5KTsKKwkJCSBhZl9mYW1pbHlfa2V5cyArIHNrLT5za19mYW1pbHksIDApOwogfQogCiAvKioKQEAgLTExNjAsNyArMTE2MCw3IEBACiAJCQlnb3RvIGZhaWx1cmU7CiAKIAkJaWYgKGF0b21pY19yZWFkKCZzay0+c2tfd21lbV9hbGxvYykgPCBzay0+c2tfc25kYnVmKSB7Ci0JCQlza2IgPSBhbGxvY19za2IoaGVhZGVyX2xlbiwgc2stPnNrX2FsbG9jYXRpb24pOworCQkJc2tiID0gYWxsb2Nfc2tiKGhlYWRlcl9sZW4sIGdmcF9tYXNrKTsKIAkJCWlmIChza2IpIHsKIAkJCQlpbnQgbnBhZ2VzOwogCQkJCWludCBpOwpkaWZmIC0tZ2l0IGEvbmV0L2NvcmUvdXRpbHMuYyBiL25ldC9jb3JlL3V0aWxzLmMKaW5kZXggOTRjNWQ3Ni4uZDkzZmU2NCAxMDA2NDQKLS0tIGEvbmV0L2NvcmUvdXRpbHMuYworKysgYi9uZXQvY29yZS91dGlscy5jCkBAIC0zMCwxMTkgKzMwLDYgQEAKICNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KIAotLyoKLSAgVGhpcyBpcyBhIG1heGltYWxseSBlcXVpZGlzdHJpYnV0ZWQgY29tYmluZWQgVGF1c3dvcnRoZSBnZW5lcmF0b3IKLSAgYmFzZWQgb24gY29kZSBmcm9tIEdOVSBTY2llbnRpZmljIExpYnJhcnkgMS41ICgzMCBKdW4gMjAwNCkKLQotICAgeF9uID0gKHMxX24gXiBzMl9uIF4gczNfbikgCi0KLSAgIHMxX3tuKzF9ID0gKCgoczFfbiAmIDQyOTQ5NjcyOTQpIDw8MTIpIF4gKCgoczFfbiA8PDEzKSBeIHMxX24pID4+MTkpKQotICAgczJfe24rMX0gPSAoKChzMl9uICYgNDI5NDk2NzI4OCkgPDwgNCkgXiAoKChzMl9uIDw8IDIpIF4gczJfbikgPj4yNSkpCi0gICBzM197bisxfSA9ICgoKHMzX24gJiA0Mjk0OTY3MjgwKSA8PDE3KSBeICgoKHMzX24gPDwgMykgXiBzM19uKSA+PjExKSkKLQotICAgVGhlIHBlcmlvZCBvZiB0aGlzIGdlbmVyYXRvciBpcyBhYm91dCAyXjg4LgotCi0gICBGcm9tOiBQLiBMJ0VjdXllciwgIk1heGltYWxseSBFcXVpZGlzdHJpYnV0ZWQgQ29tYmluZWQgVGF1c3dvcnRoZQotICAgR2VuZXJhdG9ycyIsIE1hdGhlbWF0aWNzIG9mIENvbXB1dGF0aW9uLCA2NSwgMjEzICgxOTk2KSwgMjAzLS0yMTMuCi0KLSAgIFRoaXMgaXMgYXZhaWxhYmxlIG9uIHRoZSBuZXQgZnJvbSBMJ0VjdXllcidzIGhvbWUgcGFnZSwKLQotICAgaHR0cDovL3d3dy5pcm8udW1vbnRyZWFsLmNhL35sZWN1eWVyL215ZnRwL3BhcGVycy90YXVzbWUucHMKLSAgIGZ0cDovL2Z0cC5pcm8udW1vbnRyZWFsLmNhL3B1Yi9zaW11bGF0aW9uL2xlY3V5ZXIvcGFwZXJzL3RhdXNtZS5wcyAKLQotICAgVGhlcmUgaXMgYW4gZXJyYXR1bSBpbiB0aGUgcGFwZXIgIlRhYmxlcyBvZiBNYXhpbWFsbHkKLSAgIEVxdWlkaXN0cmlidXRlZCBDb21iaW5lZCBMRlNSIEdlbmVyYXRvcnMiLCBNYXRoZW1hdGljcyBvZgotICAgQ29tcHV0YXRpb24sIDY4LCAyMjUgKDE5OTkpLCAyNjEtLTI2OToKLSAgIGh0dHA6Ly93d3cuaXJvLnVtb250cmVhbC5jYS9+bGVjdXllci9teWZ0cC9wYXBlcnMvdGF1c21lMi5wcwotCi0gICAgICAgIC4uLiB0aGUga19qIG1vc3Qgc2lnbmlmaWNhbnQgYml0cyBvZiB6X2ogbXVzdCBiZSBub24tCi0gICAgICAgIHplcm8sIGZvciBlYWNoIGouIChOb3RlOiB0aGlzIHJlc3RyaWN0aW9uIGFsc28gYXBwbGllcyB0byB0aGUgCi0gICAgICAgIGNvbXB1dGVyIGNvZGUgZ2l2ZW4gaW4gWzRdLCBidXQgd2FzIG1pc3Rha2VubHkgbm90IG1lbnRpb25lZCBpbgotICAgICAgICB0aGF0IHBhcGVyLikKLSAgIAotICAgVGhpcyBhZmZlY3RzIHRoZSBzZWVkaW5nIHByb2NlZHVyZSBieSBpbXBvc2luZyB0aGUgcmVxdWlyZW1lbnQKLSAgIHMxID4gMSwgczIgPiA3LCBzMyA+IDE1LgotCi0qLwotc3RydWN0IG5ybmRfc3RhdGUgewotCXUzMiBzMSwgczIsIHMzOwotfTsKLQotc3RhdGljIERFRklORV9QRVJfQ1BVKHN0cnVjdCBucm5kX3N0YXRlLCBuZXRfcmFuZF9zdGF0ZSk7Ci0KLXN0YXRpYyB1MzIgX19uZXRfcmFuZG9tKHN0cnVjdCBucm5kX3N0YXRlICpzdGF0ZSkKLXsKLSNkZWZpbmUgVEFVU1dPUlRIRShzLGEsYixjLGQpICgocyZjKTw8ZCkgXiAoKChzIDw8YSkgXiBzKT4+YikKLQotCXN0YXRlLT5zMSA9IFRBVVNXT1JUSEUoc3RhdGUtPnMxLCAxMywgMTksIDQyOTQ5NjcyOTRVTCwgMTIpOwotCXN0YXRlLT5zMiA9IFRBVVNXT1JUSEUoc3RhdGUtPnMyLCAyLCAyNSwgNDI5NDk2NzI4OFVMLCA0KTsKLQlzdGF0ZS0+czMgPSBUQVVTV09SVEhFKHN0YXRlLT5zMywgMywgMTEsIDQyOTQ5NjcyODBVTCwgMTcpOwotCi0JcmV0dXJuIChzdGF0ZS0+czEgXiBzdGF0ZS0+czIgXiBzdGF0ZS0+czMpOwotfQotCi1zdGF0aWMgdm9pZCBfX25ldF9zcmFuZG9tKHN0cnVjdCBucm5kX3N0YXRlICpzdGF0ZSwgdW5zaWduZWQgbG9uZyBzKQotewotCWlmIChzID09IDApCi0JCXMgPSAxOyAgICAgIC8qIGRlZmF1bHQgc2VlZCBpcyAxICovCi0KLSNkZWZpbmUgTENHKG4pICg2OTA2OSAqIG4pCi0Jc3RhdGUtPnMxID0gTENHKHMpOwotCXN0YXRlLT5zMiA9IExDRyhzdGF0ZS0+czEpOwotCXN0YXRlLT5zMyA9IExDRyhzdGF0ZS0+czIpOwotCi0JLyogIndhcm0gaXQgdXAiICovCi0JX19uZXRfcmFuZG9tKHN0YXRlKTsKLQlfX25ldF9yYW5kb20oc3RhdGUpOwotCV9fbmV0X3JhbmRvbShzdGF0ZSk7Ci0JX19uZXRfcmFuZG9tKHN0YXRlKTsKLQlfX25ldF9yYW5kb20oc3RhdGUpOwotCV9fbmV0X3JhbmRvbShzdGF0ZSk7Ci19Ci0KLQotdW5zaWduZWQgbG9uZyBuZXRfcmFuZG9tKHZvaWQpCi17Ci0JdW5zaWduZWQgbG9uZyByOwotCXN0cnVjdCBucm5kX3N0YXRlICpzdGF0ZSA9ICZnZXRfY3B1X3ZhcihuZXRfcmFuZF9zdGF0ZSk7Ci0JciA9IF9fbmV0X3JhbmRvbShzdGF0ZSk7Ci0JcHV0X2NwdV92YXIoc3RhdGUpOwotCXJldHVybiByOwotfQotCi0KLXZvaWQgbmV0X3NyYW5kb20odW5zaWduZWQgbG9uZyBlbnRyb3B5KQotewotCXN0cnVjdCBucm5kX3N0YXRlICpzdGF0ZSA9ICZnZXRfY3B1X3ZhcihuZXRfcmFuZF9zdGF0ZSk7Ci0JX19uZXRfc3JhbmRvbShzdGF0ZSwgc3RhdGUtPnMxXmVudHJvcHkpOwotCXB1dF9jcHVfdmFyKHN0YXRlKTsKLX0KLQotdm9pZCBfX2luaXQgbmV0X3JhbmRvbV9pbml0KHZvaWQpCi17Ci0JaW50IGk7Ci0KLQlmb3JfZWFjaF9wb3NzaWJsZV9jcHUoaSkgewotCQlzdHJ1Y3QgbnJuZF9zdGF0ZSAqc3RhdGUgPSAmcGVyX2NwdShuZXRfcmFuZF9zdGF0ZSxpKTsKLQkJX19uZXRfc3JhbmRvbShzdGF0ZSwgaStqaWZmaWVzKTsKLQl9Ci19Ci0KLXN0YXRpYyBpbnQgbmV0X3JhbmRvbV9yZXNlZWQodm9pZCkKLXsKLQlpbnQgaTsKLQl1bnNpZ25lZCBsb25nIHNlZWQ7Ci0KLQlmb3JfZWFjaF9wb3NzaWJsZV9jcHUoaSkgewotCQlzdHJ1Y3QgbnJuZF9zdGF0ZSAqc3RhdGUgPSAmcGVyX2NwdShuZXRfcmFuZF9zdGF0ZSxpKTsKLQotCQlnZXRfcmFuZG9tX2J5dGVzKCZzZWVkLCBzaXplb2Yoc2VlZCkpOwotCQlfX25ldF9zcmFuZG9tKHN0YXRlLCBzZWVkKTsKLQl9Ci0JcmV0dXJuIDA7Ci19Ci1sYXRlX2luaXRjYWxsKG5ldF9yYW5kb21fcmVzZWVkKTsKLQogaW50IG5ldF9tc2dfY29zdCA9IDUqSFo7CiBpbnQgbmV0X21zZ19idXJzdCA9IDEwOwogCkBAIC0xNTMsMTAgKzQwLDcgQEAKIHsKIAlyZXR1cm4gX19wcmludGtfcmF0ZWxpbWl0KG5ldF9tc2dfY29zdCwgbmV0X21zZ19idXJzdCk7CiB9Ci0KLUVYUE9SVF9TWU1CT0wobmV0X3JhbmRvbSk7CiBFWFBPUlRfU1lNQk9MKG5ldF9yYXRlbGltaXQpOwotRVhQT1JUX1NZTUJPTChuZXRfc3JhbmRvbSk7CiAKIC8qCiAgKiBDb252ZXJ0IGFuIEFTQ0lJIHN0cmluZyB0byBiaW5hcnkgSVAuCmRpZmYgLS1naXQgYS9uZXQvY29yZS93aXJlbGVzcy5jIGIvbmV0L2NvcmUvd2lyZWxlc3MuYwppbmRleCBmZmZmMGRhLi5jYjFiODcyIDEwMDY0NAotLS0gYS9uZXQvY29yZS93aXJlbGVzcy5jCisrKyBiL25ldC9jb3JlL3dpcmVsZXNzLmMKQEAgLTc0OCwxMSArNzQ4LDM5IEBACiAJCWludAlleHRyYV9zaXplOwogCQlpbnQJdXNlcl9sZW5ndGggPSAwOwogCQlpbnQJZXJyOworCQlpbnQJZXNzaWRfY29tcGF0ID0gMDsKIAogCQkvKiBDYWxjdWxhdGUgc3BhY2UgbmVlZGVkIGJ5IGFyZ3VtZW50cy4gQWx3YXlzIGFsbG9jYXRlCiAJCSAqIGZvciBtYXggc3BhY2UuIEVhc2llciwgYW5kIHdvbid0IGxhc3QgbG9uZy4uLiAqLwogCQlleHRyYV9zaXplID0gZGVzY3ItPm1heF90b2tlbnMgKiBkZXNjci0+dG9rZW5fc2l6ZTsKIAorCQkvKiBDaGVjayBuZWVkIGZvciBFU1NJRCBjb21wYXRpYmlsaXR5IGZvciBXRSA8IDIxICovCisJCXN3aXRjaCAoY21kKSB7CisJCWNhc2UgU0lPQ1NJV0VTU0lEOgorCQljYXNlIFNJT0NHSVdFU1NJRDoKKwkJY2FzZSBTSU9DU0lXTklDS046CisJCWNhc2UgU0lPQ0dJV05JQ0tOOgorCQkJaWYgKGl3ci0+dS5kYXRhLmxlbmd0aCA9PSBkZXNjci0+bWF4X3Rva2VucyArIDEpCisJCQkJZXNzaWRfY29tcGF0ID0gMTsKKwkJCWVsc2UgaWYgKElXX0lTX1NFVChjbWQpICYmIChpd3ItPnUuZGF0YS5sZW5ndGggIT0gMCkpIHsKKwkJCQljaGFyIGVzc2lkW0lXX0VTU0lEX01BWF9TSVpFICsgMV07CisKKwkJCQllcnIgPSBjb3B5X2Zyb21fdXNlcihlc3NpZCwgaXdyLT51LmRhdGEucG9pbnRlciwKKwkJCQkJCSAgICAgaXdyLT51LmRhdGEubGVuZ3RoICoKKwkJCQkJCSAgICAgZGVzY3ItPnRva2VuX3NpemUpOworCQkJCWlmIChlcnIpCisJCQkJCXJldHVybiAtRUZBVUxUOworCisJCQkJaWYgKGVzc2lkW2l3ci0+dS5kYXRhLmxlbmd0aCAtIDFdID09ICdcMCcpCisJCQkJCWVzc2lkX2NvbXBhdCA9IDE7CisJCQl9CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWJyZWFrOworCQl9CisKKwkJaXdyLT51LmRhdGEubGVuZ3RoIC09IGVzc2lkX2NvbXBhdDsKKwogCQkvKiBDaGVjayB3aGF0IHVzZXIgc3BhY2UgaXMgZ2l2aW5nIHVzICovCiAJCWlmKElXX0lTX1NFVChjbWQpKSB7CiAJCQkvKiBDaGVjayBOVUxMIHBvaW50ZXIgKi8KQEAgLTc5NSw3ICs4MjMsOCBAQAogI2VuZGlmCS8qIFdFX0lPQ1RMX0RFQlVHICovCiAKIAkJLyogQ3JlYXRlIHRoZSBrZXJuZWwgYnVmZmVyICovCi0JCWV4dHJhID0ga21hbGxvYyhleHRyYV9zaXplLCBHRlBfS0VSTkVMKTsKKwkJLyogICAga3phbGxvYyBlbnN1cmVzIE5VTEwtdGVybWluYXRpb24gZm9yIGVzc2lkX2NvbXBhdCAqLworCQlleHRyYSA9IGt6YWxsb2MoZXh0cmFfc2l6ZSwgR0ZQX0tFUk5FTCk7CiAJCWlmIChleHRyYSA9PSBOVUxMKSB7CiAJCQlyZXR1cm4gLUVOT01FTTsKIAkJfQpAQCAtODE5LDYgKzg0OCw4IEBACiAJCS8qIENhbGwgdGhlIGhhbmRsZXIgKi8KIAkJcmV0ID0gaGFuZGxlcihkZXYsICZpbmZvLCAmKGl3ci0+dSksIGV4dHJhKTsKIAorCQlpd3ItPnUuZGF0YS5sZW5ndGggKz0gZXNzaWRfY29tcGF0OworCiAJCS8qIElmIHdlIGhhdmUgc29tZXRoaW5nIHRvIHJldHVybiB0byB0aGUgdXNlciAqLwogCQlpZiAoIXJldCAmJiBJV19JU19HRVQoY21kKSkgewogCQkJLyogQ2hlY2sgaWYgdGhlcmUgaXMgZW5vdWdoIGJ1ZmZlciB1cCB0aGVyZSAqLwpkaWZmIC0tZ2l0IGEvbmV0L2RjY3AvS2NvbmZpZyBiL25ldC9kY2NwL0tjb25maWcKaW5kZXggZTJhMDk1ZC4uZWY4OTE5YyAxMDA2NDQKLS0tIGEvbmV0L2RjY3AvS2NvbmZpZworKysgYi9uZXQvZGNjcC9LY29uZmlnCkBAIC00LDE1ICs0LDE1IEBACiBjb25maWcgSVBfRENDUAogCXRyaXN0YXRlICJUaGUgRENDUCBQcm90b2NvbCAoRVhQRVJJTUVOVEFMKSIKIAktLS1oZWxwLS0tCi0JICBEYXRhZ3JhbSBDb25nZXN0aW9uIENvbnRyb2wgUHJvdG9jb2wKKwkgIERhdGFncmFtIENvbmdlc3Rpb24gQ29udHJvbCBQcm90b2NvbCAoUkZDIDQzNDApCiAKLQkgIEZyb20gZHJhZnQtaWV0Zi1kY2NwLXNwZWMtMTEgPGh0dHA6Ly93d3cuaWNpci5vcmcva29obGVyL2RjcC9kcmFmdC1pZXRmLWRjY3Atc3BlYy0xMS50eHQ+LgorCSAgRnJvbSBodHRwOi8vd3d3LmlldGYub3JnL3JmYy9yZmM0MzQwLnR4dDoKIAogCSAgVGhlIERhdGFncmFtIENvbmdlc3Rpb24gQ29udHJvbCBQcm90b2NvbCAoRENDUCkgaXMgYSB0cmFuc3BvcnQKIAkgIHByb3RvY29sIHRoYXQgaW1wbGVtZW50cyBiaWRpcmVjdGlvbmFsLCB1bmljYXN0IGNvbm5lY3Rpb25zIG9mCiAJICBjb25nZXN0aW9uLWNvbnRyb2xsZWQsIHVucmVsaWFibGUgZGF0YWdyYW1zLiBJdCBzaG91bGQgYmUgc3VpdGFibGUKIAkgIGZvciB1c2UgYnkgYXBwbGljYXRpb25zIHN1Y2ggYXMgc3RyZWFtaW5nIG1lZGlhLCBJbnRlcm5ldCB0ZWxlcGhvbnksCi0JICBhbmQgb24tbGluZSBnYW1lcworCSAgYW5kIG9uLWxpbmUgZ2FtZXMuCiAKIAkgIFRvIGNvbXBpbGUgdGhpcyBwcm90b2NvbCBzdXBwb3J0IGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUKIAkgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCBkY2NwLgpkaWZmIC0tZ2l0IGEvbmV0L2RjY3AvYWNrdmVjLmMgYi9uZXQvZGNjcC9hY2t2ZWMuYwppbmRleCA0ZDE3NmQzLi5mODIwODg3IDEwMDY0NAotLS0gYS9uZXQvZGNjcC9hY2t2ZWMuYworKysgYi9uZXQvZGNjcC9hY2t2ZWMuYwpAQCAtMTEzLDcgKzExMyw3IEBACiAKIAltZW1jcHkodG8sIGZyb20sIGxlbik7CiAJLyoKLQkgKglGcm9tIGRyYWZ0LWlldGYtZGNjcC1zcGVjLTExLnR4dDoKKwkgKglGcm9tIFJGQyA0MzQwLCBBLjI6CiAJICoKIAkgKglGb3IgZWFjaCBhY2tub3dsZWRnZW1lbnQgaXQgc2VuZHMsIHRoZSBIQy1SZWNlaXZlciB3aWxsIGFkZCBhbgogCSAqCWFja25vd2xlZGdlbWVudCByZWNvcmQuICBhY2tfc2Vxbm8gd2lsbCBlcXVhbCB0aGUgSEMtUmVjZWl2ZXIKQEAgLTIyNCw3ICsyMjQsNyBAQAogfQogCiAvKgotICogSW1wbGVtZW50cyB0aGUgZHJhZnQtaWV0Zi1kY2NwLXNwZWMtMTEudHh0IEFwcGVuZGl4IEEKKyAqIEltcGxlbWVudHMgdGhlIFJGQyA0MzQwLCBBcHBlbmRpeCBBCiAgKi8KIGludCBkY2NwX2Fja3ZlY19hZGQoc3RydWN0IGRjY3BfYWNrdmVjICphdiwgY29uc3Qgc3RydWN0IHNvY2sgKnNrLAogCQkgICAgY29uc3QgdTY0IGFja25vLCBjb25zdCB1OCBzdGF0ZSkKQEAgLTIzNyw3ICsyMzcsNyBAQAogCSAqIFdlIG1heSB3ZWxsIGRlY2lkZSB0byBkbyBidWZmZXIgY29tcHJlc3Npb24sIGV0YywgYnV0IGZvciBub3cgbGV0cwogCSAqIGp1c3QgZHJvcC4KIAkgKgotCSAqIEZyb20gQXBwZW5kaXggQToKKwkgKiBGcm9tIEFwcGVuZGl4IEEuMS4xIChgTmV3IFBhY2tldHMnKToKIAkgKgogCSAqCU9mIGNvdXJzZSwgdGhlIGNpcmN1bGFyIGJ1ZmZlciBtYXkgb3ZlcmZsb3csIGVpdGhlciB3aGVuIHRoZQogCSAqCUhDLVNlbmRlciBpcyBzZW5kaW5nIGRhdGEgYXQgYSB2ZXJ5IGhpZ2ggcmF0ZSwgd2hlbiB0aGUKQEAgLTI3NCw5ICsyNzQsOSBAQAogCQkvKgogCQkgKiBBLjEuMi4gIE9sZCBQYWNrZXRzCiAJCSAqCi0JCSAqCVdoZW4gYSBwYWNrZXQgd2l0aCBTZXF1ZW5jZSBOdW1iZXIgUyBhcnJpdmVzLCBhbmQKLQkJICoJUyA8PSBidWZfYWNrbm8sIHRoZSBIQy1SZWNlaXZlciB3aWxsIHNjYW4gdGhlIHRhYmxlCi0JCSAqCWZvciB0aGUgYnl0ZSBjb3JyZXNwb25kaW5nIHRvIFMuIChJbmRleGluZyBzdHJ1Y3R1cmVzCisJCSAqCVdoZW4gYSBwYWNrZXQgd2l0aCBTZXF1ZW5jZSBOdW1iZXIgUyA8PSBidWZfYWNrbm8KKwkJICoJYXJyaXZlcywgdGhlIEhDLVJlY2VpdmVyIHdpbGwgc2NhbiB0aGUgdGFibGUgZm9yCisJCSAqCXRoZSBieXRlIGNvcnJlc3BvbmRpbmcgdG8gUy4gKEluZGV4aW5nIHN0cnVjdHVyZXMKIAkJICoJY291bGQgcmVkdWNlIHRoZSBjb21wbGV4aXR5IG9mIHRoaXMgc2Nhbi4pCiAJCSAqLwogCQl1NjQgZGVsdGEgPSBkY2NwX2RlbHRhX3NlcW5vKGFja25vLCBhdi0+ZGNjcGF2X2J1Zl9hY2tubyk7CmRpZmYgLS1naXQgYS9uZXQvZGNjcC9hY2t2ZWMuaCBiL25ldC9kY2NwL2Fja3ZlYy5oCmluZGV4IDI0MjRlZmYuLmNmOGYyMGMgMTAwNjQ0Ci0tLSBhL25ldC9kY2NwL2Fja3ZlYy5oCisrKyBiL25ldC9kY2NwL2Fja3ZlYy5oCkBAIC0yOCw4ICsyOCw3IEBACiAKIC8qKiBzdHJ1Y3QgZGNjcF9hY2t2ZWMgLSBhY2sgdmVjdG9yCiAgKgotICogVGhpcyBkYXRhIHN0cnVjdHVyZSBpcyB0aGUgb25lIGRlZmluZWQgaW4gdGhlIERDQ1AgZHJhZnQKLSAqIEFwcGVuZGl4IEEuCisgKiBUaGlzIGRhdGEgc3RydWN0dXJlIGlzIHRoZSBvbmUgZGVmaW5lZCBpbiBSRkMgNDM0MCwgQXBwZW5kaXggQS4KICAqCiAgKiBAZGNjcGF2X2J1Zl9oZWFkIC0gY2lyY3VsYXIgYnVmZmVyIGhlYWQKICAqIEBkY2NwYXZfYnVmX3RhaWwgLSBjaXJjdWxhciBidWZmZXIgdGFpbApkaWZmIC0tZ2l0IGEvbmV0L2RjY3AvY2NpZHMvS2NvbmZpZyBiL25ldC9kY2NwL2NjaWRzL0tjb25maWcKaW5kZXggMzI3NTJmNy4uODUzM2RhYiAxMDA2NDQKLS0tIGEvbmV0L2RjY3AvY2NpZHMvS2NvbmZpZworKysgYi9uZXQvZGNjcC9jY2lkcy9LY29uZmlnCkBAIC0yMiwxMSArMjIsMTEgQEAKIAkgIGZvciBsb3N0IHBhY2tldHMsIHdvdWxkIHByZWZlciBDQ0lEIDIgdG8gQ0NJRCAzLiAgT24tbGluZSBnYW1lcyBtYXkKIAkgIGFsc28gcHJlZmVyIENDSUQgMi4KIAotCSAgQ0NJRCAyIGlzIGZ1cnRoZXIgZGVzY3JpYmVkIGluOgotCSAgaHR0cDovL3d3dy5pY2lyLm9yZy9rb2hsZXIvZGNjcC9kcmFmdC1pZXRmLWRjY3AtY2NpZDItMTAudHh0CisJICBDQ0lEIDIgaXMgZnVydGhlciBkZXNjcmliZWQgaW4gUkZDIDQzNDEsCisJICBodHRwOi8vd3d3LmlldGYub3JnL3JmYy9yZmM0MzQxLnR4dAogCi0JICBUaGlzIHRleHQgd2FzIGV4dHJhY3RlZCBmcm9tOgotCSAgaHR0cDovL3d3dy5pY2lyLm9yZy9rb2hsZXIvZGNjcC9kcmFmdC1pZXRmLWRjY3Atc3BlYy0xMy50eHQKKwkgIFRoaXMgdGV4dCB3YXMgZXh0cmFjdGVkIGZyb20gUkZDIDQzNDAgKHNlYy4gMTAuMSksCisJICBodHRwOi8vd3d3LmlldGYub3JnL3JmYy9yZmM0MzQwLnR4dAogCiAJICBJZiBpbiBkb3VidCwgc2F5IE0uCiAKQEAgLTUzLDE1ICs1MywxNCBAQAogCSAgc3VpdGFibGUgdGhhbiBDQ0lEIDIgZm9yIGFwcGxpY2F0aW9ucyBzdWNoIHN0cmVhbWluZyBtZWRpYSB3aGVyZSBhCiAJICByZWxhdGl2ZWx5IHNtb290aCBzZW5kaW5nIHJhdGUgaXMgb2YgaW1wb3J0YW5jZS4KIAotCSAgQ0NJRCAzIGlzIGZ1cnRoZXIgZGVzY3JpYmVkIGluOgotCi0JICBodHRwOi8vd3d3LmljaXIub3JnL2tvaGxlci9kY2NwL2RyYWZ0LWlldGYtZGNjcC1jY2lkMy0xMS50eHQuCisJICBDQ0lEIDMgaXMgZnVydGhlciBkZXNjcmliZWQgaW4gUkZDIDQzNDIsCisJICBodHRwOi8vd3d3LmlldGYub3JnL3JmYy9yZmM0MzQyLnR4dAogCiAJICBUaGUgVEZSQyBjb25nZXN0aW9uIGNvbnRyb2wgYWxnb3JpdGhtcyB3ZXJlIGluaXRpYWxseSBkZXNjcmliZWQgaW4KIAkgIFJGQyAzNDQ4LgogCi0JICBUaGlzIHRleHQgd2FzIGV4dHJhY3RlZCBmcm9tOgotCSAgaHR0cDovL3d3dy5pY2lyLm9yZy9rb2hsZXIvZGNjcC9kcmFmdC1pZXRmLWRjY3Atc3BlYy0xMy50eHQKKwkgIFRoaXMgdGV4dCB3YXMgZXh0cmFjdGVkIGZyb20gUkZDIDQzNDAgKHNlYy4gMTAuMiksCisJICBodHRwOi8vd3d3LmlldGYub3JnL3JmYy9yZmM0MzQwLnR4dAogCSAgCiAJICBJZiBpbiBkb3VidCwgc2F5IE0uCiAKZGlmZiAtLWdpdCBhL25ldC9kY2NwL2NjaWRzL2NjaWQyLmMgYi9uZXQvZGNjcC9jY2lkcy9jY2lkMi5jCmluZGV4IDJlZmI1MDUuLjE2MjAzMmIgMTAwNjQ0Ci0tLSBhL25ldC9kY2NwL2NjaWRzL2NjaWQyLmMKKysrIGIvbmV0L2RjY3AvY2NpZHMvY2NpZDIuYwpAQCAtMjMsNyArMjMsNyBAQAogICovCiAKIC8qCi0gKiBUaGlzIGltcGxlbWVudGF0aW9uIHNob3VsZCBmb2xsb3c6IGRyYWZ0LWlldGYtZGNjcC1jY2lkMi0xMC50eHQKKyAqIFRoaXMgaW1wbGVtZW50YXRpb24gc2hvdWxkIGZvbGxvdyBSRkMgNDM0MQogICoKICAqIEJVR1M6CiAgKiAtIHNlcXVlbmNlIG51bWJlciB3cmFwcGluZwpAQCAtMzUyLDE0ICszNTIsMTQgQEAKIAogI2lmZGVmIENPTkZJR19JUF9EQ0NQX0NDSUQyX0RFQlVHCiAJY2NpZDJfcHJfZGVidWcoInBpcGU9JWRcbiIsIGhjdHgtPmNjaWQyaGN0eF9waXBlKTsKLQljY2lkMl9wcl9kZWJ1ZygiU2VudDogc2VxPSVsbHVcbiIsIHNlcSk7CisJY2NpZDJfcHJfZGVidWcoIlNlbnQ6IHNlcT0lbGx1XG4iLCAodW5zaWduZWQgbG9uZyBsb25nKXNlcSk7CiAJZG8gewogCQlzdHJ1Y3QgY2NpZDJfc2VxICpzZXFwID0gaGN0eC0+Y2NpZDJoY3R4X3NlcXQ7CiAKIAkJd2hpbGUgKHNlcXAgIT0gaGN0eC0+Y2NpZDJoY3R4X3NlcWgpIHsKIAkJCWNjaWQyX3ByX2RlYnVnKCJvdXQgc2VxPSVsbHUgYWNrZWQ9JWQgdGltZT0lbHVcbiIsCi0JCQkgICAgICAgCSAgICAgICBzZXFwLT5jY2lkMnNfc2VxLCBzZXFwLT5jY2lkMnNfYWNrZWQsCi0JCQkJICAgICAgIHNlcXAtPmNjaWQyc19zZW50KTsKKwkJCSAgICAgICAJICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpc2VxcC0+Y2NpZDJzX3NlcSwKKwkJCQkgICAgICAgc2VxcC0+Y2NpZDJzX2Fja2VkLCBzZXFwLT5jY2lkMnNfc2VudCk7CiAJCQlzZXFwID0gc2VxcC0+Y2NpZDJzX25leHQ7CiAJCX0KIAl9IHdoaWxlICgwKTsKQEAgLTQ4MCw3ICs0ODAsOCBAQAogCQkvKiBmaXJzdCBtZWFzdXJlbWVudCAqLwogCQlpZiAoaGN0eC0+Y2NpZDJoY3R4X3NydHQgPT0gLTEpIHsKIAkJCWNjaWQyX3ByX2RlYnVnKCJSOiAlbHUgVGltZT0lbHUgc2VxPSVsbHVcbiIsCi0JCQkgICAgICAgCSAgICAgICByLCBqaWZmaWVzLCBzZXFwLT5jY2lkMnNfc2VxKTsKKwkJCSAgICAgICAJICAgICAgIHIsIGppZmZpZXMsCisJCQkJICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpc2VxcC0+Y2NpZDJzX3NlcSk7CiAJCQljY2lkMl9jaGFuZ2Vfc3J0dChoY3R4LCByKTsKIAkJCWhjdHgtPmNjaWQyaGN0eF9ydHR2YXIgPSByID4+IDE7CiAJCX0gZWxzZSB7CkBAIC02MzYsOCArNjM3LDkgQEAKIAkJCXU2NCBhY2tub19lbmRfcmw7CiAKIAkJCWRjY3Bfc2V0X3NlcW5vKCZhY2tub19lbmRfcmwsIGFja25vIC0gcmwpOwotCQkJY2NpZDJfcHJfZGVidWcoImFja3ZlYyBzdGFydDolbGx1IGVuZDolbGx1XG4iLCBhY2tubywKLQkJCQkgICAgICAgYWNrbm9fZW5kX3JsKTsKKwkJCWNjaWQyX3ByX2RlYnVnKCJhY2t2ZWMgc3RhcnQ6JWxsdSBlbmQ6JWxsdVxuIiwKKwkJCQkgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylhY2tubywKKwkJCQkgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylhY2tub19lbmRfcmwpOwogCQkJLyogaWYgdGhlIHNlcW5vIHdlIGFyZSBhbmFseXppbmcgaXMgbGFyZ2VyIHRoYW4gdGhlCiAJCQkgKiBjdXJyZW50IGFja25vLCB0aGVuIG1vdmUgdG93YXJkcyB0aGUgdGFpbCBvZiBvdXIKIAkJCSAqIHNlcW5vcy4KQEAgLTY3Miw3ICs2NzQsNyBAQAogCiAJCQkJCXNlcXAtPmNjaWQyc19hY2tlZCA9IDE7CiAJCQkJCWNjaWQyX3ByX2RlYnVnKCJHb3QgYWNrIGZvciAlbGx1XG4iLAotCQkJCQkgICAgICAgCSAgICAgICBzZXFwLT5jY2lkMnNfc2VxKTsKKwkJCQkJCSAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKXNlcXAtPmNjaWQyc19zZXEpOwogCQkJCQljY2lkMl9oY190eF9kZWNfcGlwZShzayk7CiAJCQkJfQogCQkJCWlmIChzZXFwID09IGhjdHgtPmNjaWQyaGN0eF9zZXF0KSB7CkBAIC03MTgsNyArNzIwLDcgQEAKIAkJd2hpbGUgKDEpIHsKIAkJCWlmICghc2VxcC0+Y2NpZDJzX2Fja2VkKSB7CiAJCQkJY2NpZDJfcHJfZGVidWcoIlBhY2tldCBsb3N0OiAlbGx1XG4iLAotCQkJCQkgICAgICAgc2VxcC0+Y2NpZDJzX3NlcSk7CisJCQkJCSAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKXNlcXAtPmNjaWQyc19zZXEpOwogCQkJCS8qIFhYWCBuZWVkIHRvIHRyYXZlcnNlIGZyb20gdGFpbCAtPiBoZWFkIGluCiAJCQkJICogb3JkZXIgdG8gZGV0ZWN0IG11bHRpcGxlIGNvbmdlc3Rpb24gZXZlbnRzIGluCiAJCQkJICogb25lIGFjayB2ZWN0b3IuCmRpZmYgLS1naXQgYS9uZXQvZGNjcC9jY2lkcy9jY2lkMy5jIGIvbmV0L2RjY3AvY2NpZHMvY2NpZDMuYwppbmRleCA2N2QyZGMwLi5jZWMyM2FkIDEwMDY0NAotLS0gYS9uZXQvZGNjcC9jY2lkcy9jY2lkMy5jCisrKyBiL25ldC9kY2NwL2NjaWRzL2NjaWQzLmMKQEAgLTM3OSw4ICszNzksNyBAQAogCQlwYWNrZXQtPmRjY3BodHhfc2Vxbm8gID0gZHAtPmRjY3BzX2dzczsKIAkJLyoKIAkJICogQ2hlY2sgaWYgd2luX2NvdW50IGhhdmUgY2hhbmdlZAotCQkgKiBBbGdvcml0aG0gaW4gIjguMS4gV2luZG93IENvdW50ZXIgVmFsdWVyIiBpbgotCQkgKiBkcmFmdC1pZXRmLWRjY3AtY2NpZDMtMTEudHh0CisJCSAqIEFsZ29yaXRobSBpbiAiOC4xLiBXaW5kb3cgQ291bnRlciBWYWx1ZSIgaW4gUkZDIDQzNDIuCiAJCSAqLwogCQlxdWFydGVyX3J0dCA9IHRpbWV2YWxfZGVsdGEoJm5vdywgJmhjdHgtPmNjaWQzaGN0eF90X2xhc3Rfd2luX2NvdW50KTsKIAkJaWYgKGxpa2VseShoY3R4LT5jY2lkM2hjdHhfcnR0ID4gOCkpCmRpZmYgLS1naXQgYS9uZXQvZGNjcC9kY2NwLmggYi9uZXQvZGNjcC9kY2NwLmgKaW5kZXggMGEyMWJlNC4uMjcyZTg1OCAxMDA2NDQKLS0tIGEvbmV0L2RjY3AvZGNjcC5oCisrKyBiL25ldC9kY2NwL2RjY3AuaApAQCAtNTAsNyArNTAsNyBAQAogI2RlZmluZSBEQ0NQX1RJTUVXQUlUX0xFTiAoNjAgKiBIWikgLyogaG93IGxvbmcgdG8gd2FpdCB0byBkZXN0cm95IFRJTUUtV0FJVAogCQkJCSAgICAgKiBzdGF0ZSwgYWJvdXQgNjAgc2Vjb25kcyAqLwogCi0vKiBkcmFmdC1pZXRmLWRjY3Atc3BlYy0xMS50eHQgaW5pdGlhbCBSVE8gdmFsdWUgKi8KKy8qIFJGQyAxMTIyLCA0LjIuMy4xIGluaXRpYWwgUlRPIHZhbHVlICovCiAjZGVmaW5lIERDQ1BfVElNRU9VVF9JTklUICgodW5zaWduZWQpKDMgKiBIWikpCiAKIC8qIE1heGltYWwgaW50ZXJ2YWwgYmV0d2VlbiBwcm9iZXMgZm9yIGxvY2FsIHJlc291cmNlcy4gICovCmRpZmYgLS1naXQgYS9uZXQvZGNjcC9pbnB1dC5jIGIvbmV0L2RjY3AvaW5wdXQuYwppbmRleCA3ZjlkYzZhLi4xZDI0ODgxIDEwMDY0NAotLS0gYS9uZXQvZGNjcC9pbnB1dC5jCisrKyBiL25ldC9kY2NwL2lucHV0LmMKQEAgLTIxNiwxMSArMjE2LDExIEBACiAJCWRjY3Bfc2VuZF9zeW5jKHNrLCBEQ0NQX1NLQl9DQihza2IpLT5kY2NwZF9zZXEsCiAJCQkgICAgICAgRENDUF9QS1RfU1lOQ0FDSyk7CiAJCS8qCi0JCSAqIEZyb20gdGhlIGRyYWZ0OgorCQkgKiBGcm9tIFJGQyA0MzQwLCBzZWMuIDUuNwogCQkgKgogCQkgKiBBcyB3aXRoIERDQ1AtQWNrIHBhY2tldHMsIERDQ1AtU3luYyBhbmQgRENDUC1TeW5jQWNrIHBhY2tldHMKIAkJICogTUFZIGhhdmUgbm9uLXplcm8tbGVuZ3RoIGFwcGxpY2F0aW9uIGRhdGEgYXJlYXMsIHdob3NlCi0JCSAqIGNvbnRlbnRzICogcmVjZWl2ZXJzIE1VU1QgaWdub3JlLgorCQkgKiBjb250ZW50cyByZWNlaXZlcnMgTVVTVCBpZ25vcmUuCiAJCSAqLwogCQlnb3RvIGRpc2NhcmQ7CiAJfQpkaWZmIC0tZ2l0IGEvbmV0L2RjY3AvaXB2NC5jIGIvbmV0L2RjY3AvaXB2NC5jCmluZGV4IGJmNjkyYzEuLmUwOGU3NjggMTAwNjQ0Ci0tLSBhL25ldC9kY2NwL2lwdjQuYworKysgYi9uZXQvZGNjcC9pcHY0LmMKQEAgLTE4Myw3ICsxODMsNyBAQAogCQlkY2NwX3N5bmNfbXNzKHNrLCBtdHUpOwogCiAJCS8qCi0JCSAqIEZyb206IGRyYWZ0LWlldGYtZGNjcC1zcGVjLTExLnR4dAorCQkgKiBGcm9tIFJGQyA0MzQwLCBzZWMuIDE0LjE6CiAJCSAqCiAJCSAqCURDQ1AtU3luYyBwYWNrZXRzIGFyZSB0aGUgYmVzdCBjaG9pY2UgZm9yIHVwd2FyZAogCQkgKglwcm9iaW5nLCBzaW5jZSBEQ0NQLVN5bmMgcHJvYmVzIGRvIG5vdCByaXNrIGFwcGxpY2F0aW9uCkBAIC0zMTEsNyArMzExLDcgQEAKIAl9CiAKIAlpZiAoc2stPnNrX3N0YXRlID09IERDQ1BfVElNRV9XQUlUKSB7Ci0JCWluZXRfdHdza19wdXQoKHN0cnVjdCBpbmV0X3RpbWV3YWl0X3NvY2sgKilzayk7CisJCWluZXRfdHdza19wdXQoaW5ldF90d3NrKHNrKSk7CiAJCXJldHVybjsKIAl9CiAKQEAgLTQ0OSw2ICs0NDksOCBAQAogCQkJCQkgICBkY2NwX2hkcihza2IpLT5kY2NwaF9zcG9ydCk7CiB9CiAKK3N0YXRpYyBzdHJ1Y3QgcmVxdWVzdF9zb2NrX29wcyBkY2NwX3JlcXVlc3Rfc29ja19vcHM7CisKIGludCBkY2NwX3Y0X2Nvbm5fcmVxdWVzdChzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBza19idWZmICpza2IpCiB7CiAJc3RydWN0IGluZXRfcmVxdWVzdF9zb2NrICppcmVxOwpAQCAtNDg5LDcgKzQ5MSw3IEBACiAJaWYgKHNrX2FjY2VwdHFfaXNfZnVsbChzaykgJiYgaW5ldF9jc2tfcmVxc2tfcXVldWVfeW91bmcoc2spID4gMSkKIAkJZ290byBkcm9wOwogCi0JcmVxID0gcmVxc2tfYWxsb2Moc2stPnNrX3Byb3QtPnJza19wcm90KTsKKwlyZXEgPSByZXFza19hbGxvYygmZGNjcF9yZXF1ZXN0X3NvY2tfb3BzKTsKIAlpZiAocmVxID09IE5VTEwpCiAJCWdvdG8gZHJvcDsKIApAQCAtNjE0LDcgKzYxNiw3IEBACiAJCQliaF9sb2NrX3NvY2sobnNrKTsKIAkJCXJldHVybiBuc2s7CiAJCX0KLQkJaW5ldF90d3NrX3B1dCgoc3RydWN0IGluZXRfdGltZXdhaXRfc29jayAqKW5zayk7CisJCWluZXRfdHdza19wdXQoaW5ldF90d3NrKG5zaykpOwogCQlyZXR1cm4gTlVMTDsKIAl9CiAKQEAgLTczMSw3ICs3MzMsNyBAQAogCWRjY3BfaGRyX3Jlc2V0KHNrYiktPmRjY3BoX3Jlc2V0X2NvZGUgPQogCQkJCURDQ1BfU0tCX0NCKHJ4c2tiKS0+ZGNjcGRfcmVzZXRfY29kZTsKIAotCS8qIFNlZSAiOC4zLjEuIEFibm9ybWFsIFRlcm1pbmF0aW9uIiBpbiBkcmFmdC1pZXRmLWRjY3Atc3BlYy0xMSAqLworCS8qIFNlZSAiOC4zLjEuIEFibm9ybWFsIFRlcm1pbmF0aW9uIiBpbiBSRkMgNDM0MCAqLwogCXNlcW5vID0gMDsKIAlpZiAoRENDUF9TS0JfQ0Iocnhza2IpLT5kY2NwZF9hY2tfc2VxICE9IERDQ1BfUEtUX1dJVEhPVVRfQUNLX1NFUSkKIAkJZGNjcF9zZXRfc2Vxbm8oJnNlcW5vLCBEQ0NQX1NLQl9DQihyeHNrYiktPmRjY3BkX2Fja19zZXEgKyAxKTsKQEAgLTk4MCw3ICs5ODIsNyBAQAogCWdvdG8gZGlzY2FyZF9pdDsKIAogZG9fdGltZV93YWl0OgotCWluZXRfdHdza19wdXQoKHN0cnVjdCBpbmV0X3RpbWV3YWl0X3NvY2sgKilzayk7CisJaW5ldF90d3NrX3B1dChpbmV0X3R3c2soc2spKTsKIAlnb3RvIG5vX2RjY3Bfc29ja2V0OwogfQogCmRpZmYgLS1naXQgYS9uZXQvZGNjcC9pcHY2LmMgYi9uZXQvZGNjcC9pcHY2LmMKaW5kZXggN2E0NzM5OS4uZmM0MjQyYyAxMDA2NDQKLS0tIGEvbmV0L2RjY3AvaXB2Ni5jCisrKyBiL25ldC9kY2NwL2lwdjYuYwpAQCAtMjc3LDcgKzI3Nyw3IEBACiAJX191NjQgc2VxOwogCiAJc2sgPSBpbmV0Nl9sb29rdXAoJmRjY3BfaGFzaGluZm8sICZoZHItPmRhZGRyLCBkaC0+ZGNjcGhfZHBvcnQsCi0JCQkgICZoZHItPnNhZGRyLCBkaC0+ZGNjcGhfc3BvcnQsIHNrYi0+ZGV2LT5pZmluZGV4KTsKKwkJCSAgJmhkci0+c2FkZHIsIGRoLT5kY2NwaF9zcG9ydCwgaW5ldDZfaWlmKHNrYikpOwogCiAJaWYgKHNrID09IE5VTEwpIHsKIAkJSUNNUDZfSU5DX1NUQVRTX0JIKF9faW42X2Rldl9nZXQoc2tiLT5kZXYpLCBJQ01QNl9NSUJfSU5FUlJPUlMpOwpAQCAtMjg1LDcgKzI4NSw3IEBACiAJfQogCiAJaWYgKHNrLT5za19zdGF0ZSA9PSBEQ0NQX1RJTUVfV0FJVCkgewotCQlpbmV0X3R3c2tfcHV0KChzdHJ1Y3QgaW5ldF90aW1ld2FpdF9zb2NrICopc2spOworCQlpbmV0X3R3c2tfcHV0KGluZXRfdHdzayhzaykpOwogCQlyZXR1cm47CiAJfQogCkBAIC01NTAsNyArNTUwLDcgQEAKIAlkY2NwX2hkcl9yZXNldChza2IpLT5kY2NwaF9yZXNldF9jb2RlID0KIAkJCQlEQ0NQX1NLQl9DQihyeHNrYiktPmRjY3BkX3Jlc2V0X2NvZGU7CiAKLQkvKiBTZWUgIjguMy4xLiBBYm5vcm1hbCBUZXJtaW5hdGlvbiIgaW4gZHJhZnQtaWV0Zi1kY2NwLXNwZWMtMTEgKi8KKwkvKiBTZWUgIjguMy4xLiBBYm5vcm1hbCBUZXJtaW5hdGlvbiIgaW4gUkZDIDQzNDAgKi8KIAlzZXFubyA9IDA7CiAJaWYgKERDQ1BfU0tCX0NCKHJ4c2tiKS0+ZGNjcGRfYWNrX3NlcSAhPSBEQ0NQX1BLVF9XSVRIT1VUX0FDS19TRVEpCiAJCWRjY3Bfc2V0X3NlcW5vKCZzZXFubywgRENDUF9TS0JfQ0Iocnhza2IpLT5kY2NwZF9hY2tfc2VxICsgMSk7CkBAIC02NjMsNyArNjYzLDcgQEAKIAkJCWJoX2xvY2tfc29jayhuc2spOwogCQkJcmV0dXJuIG5zazsKIAkJfQotCQlpbmV0X3R3c2tfcHV0KChzdHJ1Y3QgaW5ldF90aW1ld2FpdF9zb2NrICopbnNrKTsKKwkJaW5ldF90d3NrX3B1dChpbmV0X3R3c2sobnNrKSk7CiAJCXJldHVybiBOVUxMOwogCX0KIApAQCAtNjcyLDcgKzY3Miw2IEBACiAKIHN0YXRpYyBpbnQgZGNjcF92Nl9jb25uX3JlcXVlc3Qoc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQogewotCXN0cnVjdCBpbmV0X3JlcXVlc3Rfc29jayAqaXJlcTsKIAlzdHJ1Y3QgZGNjcF9zb2NrIGRwOwogCXN0cnVjdCByZXF1ZXN0X3NvY2sgKnJlcTsKIAlzdHJ1Y3QgZGNjcF9yZXF1ZXN0X3NvY2sgKmRyZXE7CkBAIC03MDEsNyArNzAwLDcgQEAKIAlpZiAoc2tfYWNjZXB0cV9pc19mdWxsKHNrKSAmJiBpbmV0X2Nza19yZXFza19xdWV1ZV95b3VuZyhzaykgPiAxKQogCQlnb3RvIGRyb3A7CiAKLQlyZXEgPSBpbmV0Nl9yZXFza19hbGxvYyhzay0+c2tfcHJvdC0+cnNrX3Byb3QpOworCXJlcSA9IGluZXQ2X3JlcXNrX2FsbG9jKCZkY2NwNl9yZXF1ZXN0X3NvY2tfb3BzKTsKIAlpZiAocmVxID09IE5VTEwpCiAJCWdvdG8gZHJvcDsKIApAQCAtNzEzLDcgKzcxMiw2IEBACiAJCWdvdG8gZHJvcF9hbmRfZnJlZTsKIAogCWlyZXE2ID0gaW5ldDZfcnNrKHJlcSk7Ci0JaXJlcSA9IGluZXRfcnNrKHJlcSk7CiAJaXB2Nl9hZGRyX2NvcHkoJmlyZXE2LT5ybXRfYWRkciwgJnNrYi0+bmguaXB2NmgtPnNhZGRyKTsKIAlpcHY2X2FkZHJfY29weSgmaXJlcTYtPmxvY19hZGRyLCAmc2tiLT5uaC5pcHY2aC0+ZGFkZHIpOwogCXJlcS0+cmN2X3duZAk9IGRjY3BfZmVhdF9kZWZhdWx0X3NlcXVlbmNlX3dpbmRvdzsKQEAgLTk5Nyw2ICs5OTUsMTAgQEAKIAlpZiAoc2stPnNrX3N0YXRlID09IERDQ1BfT1BFTikgeyAvKiBGYXN0IHBhdGggKi8KIAkJaWYgKGRjY3BfcmN2X2VzdGFibGlzaGVkKHNrLCBza2IsIGRjY3BfaGRyKHNrYiksIHNrYi0+bGVuKSkKIAkJCWdvdG8gcmVzZXQ7CisJCWlmIChvcHRfc2tiKSB7CisJCQkvKiBUaGlzIGlzIHdoZXJlIHdlIHdvdWxkIGdvdG8gaXB2Nl9wa3RvcHRpb25zLiAqLworCQkJX19rZnJlZV9za2Iob3B0X3NrYik7CisJCX0KIAkJcmV0dXJuIDA7CiAJfQogCkBAIC0xMDIxLDYgKzEwMjMsMTAgQEAKIAogCWlmIChkY2NwX3Jjdl9zdGF0ZV9wcm9jZXNzKHNrLCBza2IsIGRjY3BfaGRyKHNrYiksIHNrYi0+bGVuKSkKIAkJZ290byByZXNldDsKKwlpZiAob3B0X3NrYikgeworCQkvKiBUaGlzIGlzIHdoZXJlIHdlIHdvdWxkIGdvdG8gaXB2Nl9wa3RvcHRpb25zLiAqLworCQlfX2tmcmVlX3NrYihvcHRfc2tiKTsKKwl9CiAJcmV0dXJuIDA7CiAKIHJlc2V0OgpAQCAtMTEwOSw3ICsxMTE1LDcgQEAKIAlnb3RvIGRpc2NhcmRfaXQ7CiAKIGRvX3RpbWVfd2FpdDoKLQlpbmV0X3R3c2tfcHV0KChzdHJ1Y3QgaW5ldF90aW1ld2FpdF9zb2NrICopc2spOworCWluZXRfdHdza19wdXQoaW5ldF90d3NrKHNrKSk7CiAJZ290byBub19kY2NwX3NvY2tldDsKIH0KIApkaWZmIC0tZ2l0IGEvbmV0L2RjY3Avb3B0aW9ucy5jIGIvbmV0L2RjY3Avb3B0aW9ucy5jCmluZGV4IDA3YTM0NjkuLmZiMGRiMWYgMTAwNjQ0Ci0tLSBhL25ldC9kY2NwL29wdGlvbnMuYworKysgYi9uZXQvZGNjcC9vcHRpb25zLmMKQEAgLTIxNSw3ICsyMTUsNyBAQAogCQkJCSAgICAgIGVsYXBzZWRfdGltZSk7CiAJCQlicmVhazsKIAkJCS8qCi0JCQkgKiBGcm9tIGRyYWZ0LWlldGYtZGNjcC1zcGVjLTExLnR4dDoKKwkJCSAqIEZyb20gUkZDIDQzNDAsIHNlYy4gMTAuMzoKIAkJCSAqCiAJCQkgKglPcHRpb24gbnVtYmVycyAxMjggdGhyb3VnaCAxOTEgYXJlIGZvcgogCQkJICoJb3B0aW9ucyBzZW50IGZyb20gdGhlIEhDLVNlbmRlciB0byB0aGUKZGlmZiAtLWdpdCBhL25ldC9kZWNuZXQvYWZfZGVjbmV0LmMgYi9uZXQvZGVjbmV0L2FmX2RlY25ldC5jCmluZGV4IDcwZTAyNzMuLjIxZjIwZjIgMTAwNjQ0Ci0tLSBhL25ldC9kZWNuZXQvYWZfZGVjbmV0LmMKKysrIGIvbmV0L2RlY25ldC9hZl9kZWNuZXQuYwpAQCAtMTY2LDcgKzE2Niw3IEBACiAJaWYgKHNjcC0+YWRkci5zZG5fZmxhZ3MgJiBTREZfV0lMRCkKIAkJcmV0dXJuIGhsaXN0X2VtcHR5KCZkbl93aWxkX3NrKSA/ICZkbl93aWxkX3NrIDogTlVMTDsKIAotCXJldHVybiAmZG5fc2tfaGFzaFtzY3AtPmFkZHJsb2MgJiBETl9TS19IQVNIX01BU0tdOworCXJldHVybiAmZG5fc2tfaGFzaFtkbl9udG9ocyhzY3AtPmFkZHJsb2MpICYgRE5fU0tfSEFTSF9NQVNLXTsKIH0KIAogLyogCkBAIC0xODAsNyArMTgwLDcgQEAKIAlpZiAocG9ydCA9PSAwKQogCQlyZXR1cm4gLTE7CiAKLQlza19mb3JfZWFjaChzaywgbm9kZSwgJmRuX3NrX2hhc2hbcG9ydCAmIEROX1NLX0hBU0hfTUFTS10pIHsKKwlza19mb3JfZWFjaChzaywgbm9kZSwgJmRuX3NrX2hhc2hbZG5fbnRvaHMocG9ydCkgJiBETl9TS19IQVNIX01BU0tdKSB7CiAJCXN0cnVjdCBkbl9zY3AgKnNjcCA9IEROX1NLKHNrKTsKIAkJaWYgKHNjcC0+YWRkcmxvYyA9PSBwb3J0KQogCQkJcmV0dXJuIC0xOwpAQCAtMTk0LDEyICsxOTQsMTIgQEAKIHN0YXRpYyB1bnNpZ25lZCBzaG9ydCBwb3J0ID0gMHgyMDAwOwogCXVuc2lnbmVkIHNob3J0IGlfcG9ydCA9IHBvcnQ7CiAKLQl3aGlsZShjaGVja19wb3J0KCsrcG9ydCkgIT0gMCkgeworCXdoaWxlKGNoZWNrX3BvcnQoZG5faHRvbnMoKytwb3J0KSkgIT0gMCkgewogCQlpZiAocG9ydCA9PSBpX3BvcnQpCiAJCQlyZXR1cm4gMDsKIAl9CiAKLQlzY3AtPmFkZHJsb2MgPSBwb3J0OworCXNjcC0+YWRkcmxvYyA9IGRuX2h0b25zKHBvcnQpOwogCiAJcmV0dXJuIDE7CiB9CkBAIC00MTgsNyArNDE4LDcgQEAKIAlzdHJ1Y3QgZG5fc2NwICpzY3A7CiAKIAlyZWFkX2xvY2soJmRuX2hhc2hfbG9jayk7Ci0Jc2tfZm9yX2VhY2goc2ssIG5vZGUsICZkbl9za19oYXNoW2NiLT5kc3RfcG9ydCAmIEROX1NLX0hBU0hfTUFTS10pIHsKKwlza19mb3JfZWFjaChzaywgbm9kZSwgJmRuX3NrX2hhc2hbZG5fbnRvaHMoY2ItPmRzdF9wb3J0KSAmIEROX1NLX0hBU0hfTUFTS10pIHsKIAkJc2NwID0gRE5fU0soc2spOwogCQlpZiAoY2ItPnNyYyAhPSBkbl9zYWRkcjJkbigmc2NwLT5wZWVyKSkKIAkJCWNvbnRpbnVlOwpAQCAtMTAxNiwxMyArMTAxNiwxNCBAQAogCiBzdGF0aWMgdm9pZCBkbl91c2VyX2NvcHkoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG9wdGRhdGFfZG4gKm9wdCkKIHsKLSAgICAgICAgdW5zaWduZWQgY2hhciAqcHRyID0gc2tiLT5kYXRhOwotICAgICAgICAKLSAgICAgICAgb3B0LT5vcHRfb3B0bCAgID0gKnB0cisrOwotICAgICAgICBvcHQtPm9wdF9zdGF0dXMgPSAwOwotICAgICAgICBtZW1jcHkob3B0LT5vcHRfZGF0YSwgcHRyLCBvcHQtPm9wdF9vcHRsKTsKLSAgICAgICAgc2tiX3B1bGwoc2tiLCBkbl9udG9ocyhvcHQtPm9wdF9vcHRsKSArIDEpOworCXVuc2lnbmVkIGNoYXIgKnB0ciA9IHNrYi0+ZGF0YTsKKwl1MTYgbGVuID0gKnB0cisrOyAvKiB5ZXMsIGl0J3MgOGJpdCBvbiB0aGUgd2lyZSAqLwogCisJQlVHX09OKGxlbiA+IDE2KTsgLyogd2UndmUgY2hlY2tlZCB0aGUgY29udGVudHMgZWFybGllciAqLworCW9wdC0+b3B0X29wdGwgICA9IGRuX2h0b25zKGxlbik7CisJb3B0LT5vcHRfc3RhdHVzID0gMDsKKwltZW1jcHkob3B0LT5vcHRfZGF0YSwgcHRyLCBsZW4pOworCXNrYl9wdWxsKHNrYiwgbGVuICsgMSk7CiB9CiAKIHN0YXRpYyBzdHJ1Y3Qgc2tfYnVmZiAqZG5fd2FpdF9mb3JfY29ubmVjdChzdHJ1Y3Qgc29jayAqc2ssIGxvbmcgKnRpbWVvKQpAQCAtMTE3OCw4ICsxMTc5LDEwIEBACiAJaWYgKHBlZXIpIHsKIAkJaWYgKChzb2NrLT5zdGF0ZSAhPSBTU19DT05ORUNURUQgJiYgCiAJCSAgICAgc29jay0+c3RhdGUgIT0gU1NfQ09OTkVDVElORykgJiYgCi0JCSAgICBzY3AtPmFjY2VwdF9tb2RlID09IEFDQ19JTU1FRCkKKwkJICAgIHNjcC0+YWNjZXB0X21vZGUgPT0gQUNDX0lNTUVEKSB7CisJCSAgICAJcmVsZWFzZV9zb2NrKHNrKTsKIAkJCXJldHVybiAtRU5PVENPTk47CisJCX0KIAogCQltZW1jcHkoc2EsICZzY3AtPnBlZXIsIHNpemVvZihzdHJ1Y3Qgc29ja2FkZHJfZG4pKTsKIAl9IGVsc2UgewpkaWZmIC0tZ2l0IGEvbmV0L2RlY25ldC9kbl9uc3BfaW4uYyBiL25ldC9kZWNuZXQvZG5fbnNwX2luLmMKaW5kZXggNzJlY2M2ZS4uNzY4M2Q0ZiAxMDA2NDQKLS0tIGEvbmV0L2RlY25ldC9kbl9uc3BfaW4uYworKysgYi9uZXQvZGVjbmV0L2RuX25zcF9pbi5jCkBAIC0zNjAsOSArMzYwLDkgQEAKIAkJCXNjcC0+bWF4X3dpbmRvdyA9IGRlY25ldF9ub19mY19tYXhfY3duZDsKIAogCQlpZiAoc2tiLT5sZW4gPiAwKSB7Ci0JCQl1bnNpZ25lZCBjaGFyIGRsZW4gPSAqc2tiLT5kYXRhOworCQkJdTE2IGRsZW4gPSAqc2tiLT5kYXRhOwogCQkJaWYgKChkbGVuIDw9IDE2KSAmJiAoZGxlbiA8PSBza2ItPmxlbikpIHsKLQkJCQlzY3AtPmNvbm5kYXRhX2luLm9wdF9vcHRsID0gZG5faHRvbnMoKF9fdTE2KWRsZW4pOworCQkJCXNjcC0+Y29ubmRhdGFfaW4ub3B0X29wdGwgPSBkbl9odG9ucyhkbGVuKTsKIAkJCQltZW1jcHkoc2NwLT5jb25uZGF0YV9pbi5vcHRfZGF0YSwgc2tiLT5kYXRhICsgMSwgZGxlbik7CiAJCQl9CiAJCX0KQEAgLTQwNCw5ICs0MDQsOSBAQAogCW1lbXNldChzY3AtPmRpc2NkYXRhX2luLm9wdF9kYXRhLCAwLCAxNik7CiAKIAlpZiAoc2tiLT5sZW4gPiAwKSB7Ci0JCXVuc2lnbmVkIGNoYXIgZGxlbiA9ICpza2ItPmRhdGE7CisJCXUxNiBkbGVuID0gKnNrYi0+ZGF0YTsKIAkJaWYgKChkbGVuIDw9IDE2KSAmJiAoZGxlbiA8PSBza2ItPmxlbikpIHsKLQkJCXNjcC0+ZGlzY2RhdGFfaW4ub3B0X29wdGwgPSBkbl9odG9ucygoX191MTYpZGxlbik7CisJCQlzY3AtPmRpc2NkYXRhX2luLm9wdF9vcHRsID0gZG5faHRvbnMoZGxlbik7CiAJCQltZW1jcHkoc2NwLT5kaXNjZGF0YV9pbi5vcHRfZGF0YSwgc2tiLT5kYXRhICsgMSwgZGxlbik7CiAJCX0KIAl9CmRpZmYgLS1naXQgYS9uZXQvZGVjbmV0L2RuX25zcF9vdXQuYyBiL25ldC9kZWNuZXQvZG5fbnNwX291dC5jCmluZGV4IGMyZTIxY2QuLmIzNDJlNGUgMTAwNjQ0Ci0tLSBhL25ldC9kZWNuZXQvZG5fbnNwX291dC5jCisrKyBiL25ldC9kZWNuZXQvZG5fbnNwX291dC5jCkBAIC01MjYsNyArNTI2LDcgQEAKICAgICAgICAgc3RydWN0IG5zcF9jb25uX2luaXRfbXNnICptc2c7CiAJX191OCBsZW4gPSAoX191OClkbl9udG9ocyhzY3AtPmNvbm5kYXRhX291dC5vcHRfb3B0bCk7CiAKLQlpZiAoKHNrYiA9IGRuX2FsbG9jX3NrYihzaywgNTAgKyBkbl9udG9ocyhzY3AtPmNvbm5kYXRhX291dC5vcHRfb3B0bCksIGdmcCkpID09IE5VTEwpCisJaWYgKChza2IgPSBkbl9hbGxvY19za2Ioc2ssIDUwICsgbGVuLCBnZnApKSA9PSBOVUxMKQogCQlyZXR1cm47CiAKICAgICAgICAgbXNnID0gKHN0cnVjdCBuc3BfY29ubl9pbml0X21zZyAqKXNrYl9wdXQoc2tiLCBzaXplb2YoKm1zZykpOwpkaWZmIC0tZ2l0IGEvbmV0L2RlY25ldC9kbl9yb3V0ZS5jIGIvbmV0L2RlY25ldC9kbl9yb3V0ZS5jCmluZGV4IGRkMDc2MWUuLjIzNDg5ZjcgMTAwNjQ0Ci0tLSBhL25ldC9kZWNuZXQvZG5fcm91dGUuYworKysgYi9uZXQvZGVjbmV0L2RuX3JvdXRlLmMKQEAgLTI2Nyw5ICsyNjcsMTQgQEAKIAogc3RhdGljIGlubGluZSBpbnQgY29tcGFyZV9rZXlzKHN0cnVjdCBmbG93aSAqZmwxLCBzdHJ1Y3QgZmxvd2kgKmZsMikKIHsKLQlyZXR1cm4gbWVtY21wKCZmbDEtPm5sX3UuZG5fdSwgJmZsMi0+bmxfdS5kbl91LCBzaXplb2YoZmwxLT5ubF91LmRuX3UpKSA9PSAwICYmCi0JCWZsMS0+b2lmID09IGZsMi0+b2lmICYmCi0JCWZsMS0+aWlmID09IGZsMi0+aWlmOworCXJldHVybiAoKGZsMS0+bmxfdS5kbl91LmRhZGRyIF4gZmwyLT5ubF91LmRuX3UuZGFkZHIpIHwKKwkJKGZsMS0+bmxfdS5kbl91LnNhZGRyIF4gZmwyLT5ubF91LmRuX3Uuc2FkZHIpIHwKKyNpZmRlZiBDT05GSUdfREVDTkVUX1JPVVRFX0ZXTUFSSworCQkoZmwxLT5ubF91LmRuX3UuZndtYXJrIF4gZmwyLT5ubF91LmRuX3UuZndtYXJrKSB8CisjZW5kaWYKKwkJKGZsMS0+bmxfdS5kbl91LnNjb3BlIF4gZmwyLT5ubF91LmRuX3Uuc2NvcGUpIHwKKwkJKGZsMS0+b2lmIF4gZmwyLT5vaWYpIHwKKwkJKGZsMS0+aWlmIF4gZmwyLT5paWYpKSA9PSAwOwogfQogCiBzdGF0aWMgaW50IGRuX2luc2VydF9yb3V0ZShzdHJ1Y3QgZG5fcm91dGUgKnJ0LCB1bnNpZ25lZCBoYXNoLCBzdHJ1Y3QgZG5fcm91dGUgKipycCkKQEAgLTEyNzAsNyArMTI3NSw2IEBACiAJCQlnb3RvIGVfaW52YWw7CiAKIAkJcmVzLnR5cGUgPSBSVE5fTE9DQUw7Ci0JCWZsYWdzIHw9IFJUQ0ZfRElSRUNUU1JDOwogCX0gZWxzZSB7CiAJCV9fbGUxNiBzcmNfbWFwID0gZmwuZmxkX3NyYzsKIAkJZnJlZV9yZXMgPSAxOwpAQCAtMTM0MSw3ICsxMzQ1LDcgQEAKIAkJCWdvdG8gbWFrZV9yb3V0ZTsKIAogCQkvKiBQYWNrZXQgd2FzIGludHJhLWV0aGVybmV0LCBzbyB3ZSBrbm93IGl0cyBvbi1saW5rICovCi0JCWlmIChjYi0+cnRfZmxhZ3MgfCBETl9SVF9GX0lFKSB7CisJCWlmIChjYi0+cnRfZmxhZ3MgJiBETl9SVF9GX0lFKSB7CiAJCQlnYXRld2F5ID0gY2ItPnNyYzsKIAkJCWZsYWdzIHw9IFJUQ0ZfRElSRUNUU1JDOwogCQkJZ290byBtYWtlX3JvdXRlOwpkaWZmIC0tZ2l0IGEvbmV0L2RlY25ldC9kbl9ydWxlcy5jIGIvbmV0L2RlY25ldC9kbl9ydWxlcy5jCmluZGV4IDNlMGM4ODIuLjU5MGUwYTcgMTAwNjQ0Ci0tLSBhL25ldC9kZWNuZXQvZG5fcnVsZXMuYworKysgYi9uZXQvZGVjbmV0L2RuX3J1bGVzLmMKQEAgLTEyNCw4ICsxMjQsOCBAQAogc3RhdGljIGludCBkbl9maWJfcnVsZV9tYXRjaChzdHJ1Y3QgZmliX3J1bGUgKnJ1bGUsIHN0cnVjdCBmbG93aSAqZmwsIGludCBmbGFncykKIHsKIAlzdHJ1Y3QgZG5fZmliX3J1bGUgKnIgPSAoc3RydWN0IGRuX2ZpYl9ydWxlICopcnVsZTsKLQl1MTYgZGFkZHIgPSBmbC0+ZmxkX2RzdDsKLQl1MTYgc2FkZHIgPSBmbC0+ZmxkX3NyYzsKKwlfX2xlMTYgZGFkZHIgPSBmbC0+ZmxkX2RzdDsKKwlfX2xlMTYgc2FkZHIgPSBmbC0+ZmxkX3NyYzsKIAogCWlmICgoKHNhZGRyIF4gci0+c3JjKSAmIHItPnNyY21hc2spIHx8CiAJICAgICgoZGFkZHIgXiByLT5kc3QpICYgci0+ZHN0bWFzaykpCmRpZmYgLS1naXQgYS9uZXQvaWVlZTgwMjExL0tjb25maWcgYi9uZXQvaWVlZTgwMjExL0tjb25maWcKaW5kZXggZjdlODRlOS4uYTY0YmU2YyAxMDA2NDQKLS0tIGEvbmV0L2llZWU4MDIxMS9LY29uZmlnCisrKyBiL25ldC9pZWVlODAyMTEvS2NvbmZpZwpAQCAtMzIsNiArMzIsNyBAQAogCWRlcGVuZHMgb24gSUVFRTgwMjExCiAJc2VsZWN0IENSWVBUTwogCXNlbGVjdCBDUllQVE9fQVJDNAorCXNlbGVjdCBDUllQVE9fRUNCCiAJc2VsZWN0IENSQzMyCiAJLS0taGVscC0tLQogCUluY2x1ZGUgc29mdHdhcmUgYmFzZWQgY2lwaGVyIHN1aXRlcyBpbiBzdXBwb3J0IG9mIElFRUUKQEAgLTU4LDYgKzU5LDcgQEAKIAlkZXBlbmRzIG9uIElFRUU4MDIxMSAmJiBORVRfUkFESU8KIAlzZWxlY3QgQ1JZUFRPCiAJc2VsZWN0IENSWVBUT19NSUNIQUVMX01JQworCXNlbGVjdCBDUllQVE9fRUNCCiAJc2VsZWN0IENSQzMyCiAJLS0taGVscC0tLQogCUluY2x1ZGUgc29mdHdhcmUgYmFzZWQgY2lwaGVyIHN1aXRlcyBpbiBzdXBwb3J0IG9mIElFRUUgODAyLjExaQpkaWZmIC0tZ2l0IGEvbmV0L2llZWU4MDIxMS9pZWVlODAyMTFfcnguYyBiL25ldC9pZWVlODAyMTEvaWVlZTgwMjExX3J4LmMKaW5kZXggNzcwNzA0MS4uMjc1OTMxMiAxMDA2NDQKLS0tIGEvbmV0L2llZWU4MDIxMS9pZWVlODAyMTFfcnguYworKysgYi9uZXQvaWVlZTgwMjExL2llZWU4MDIxMV9yeC5jCkBAIC0xMDc4LDEyICsxMDc4LDEyIEBACiAKIAl3aGlsZSAobGVuZ3RoID49IHNpemVvZigqaW5mb19lbGVtZW50KSkgewogCQlpZiAoc2l6ZW9mKCppbmZvX2VsZW1lbnQpICsgaW5mb19lbGVtZW50LT5sZW4gPiBsZW5ndGgpIHsKLQkJCUlFRUU4MDIxMV9FUlJPUigiSW5mbyBlbGVtOiBwYXJzZSBmYWlsZWQ6ICIKLQkJCQkJImluZm9fZWxlbWVudC0+bGVuICsgMiA+IGxlZnQgOiAiCi0JCQkJCSJpbmZvX2VsZW1lbnQtPmxlbisyPSV6ZCBsZWZ0PSVkLCBpZD0lZC5cbiIsCi0JCQkJCWluZm9fZWxlbWVudC0+bGVuICsKLQkJCQkJc2l6ZW9mKCppbmZvX2VsZW1lbnQpLAotCQkJCQlsZW5ndGgsIGluZm9fZWxlbWVudC0+aWQpOworCQkJSUVFRTgwMjExX0RFQlVHX01HTVQoIkluZm8gZWxlbTogcGFyc2UgZmFpbGVkOiAiCisJCQkJCSAgICAgImluZm9fZWxlbWVudC0+bGVuICsgMiA+IGxlZnQgOiAiCisJCQkJCSAgICAgImluZm9fZWxlbWVudC0+bGVuKzI9JXpkIGxlZnQ9JWQsIGlkPSVkLlxuIiwKKwkJCQkJICAgICBpbmZvX2VsZW1lbnQtPmxlbiArCisJCQkJCSAgICAgc2l6ZW9mKCppbmZvX2VsZW1lbnQpLAorCQkJCQkgICAgIGxlbmd0aCwgaW5mb19lbGVtZW50LT5pZCk7CiAJCQkvKiBXZSBzdG9wIHByb2Nlc3NpbmcgYnV0IGRvbid0IHJldHVybiBhbiBlcnJvciBoZXJlCiAJCQkgKiBiZWNhdXNlIHNvbWUgbWlzYmVoYXZpb3VyIEFQcyBicmVhayB0aGlzIHJ1bGUuIGllLgogCQkJICogT3Jpbm9jbyBBUDEwMDAuICovCmRpZmYgLS1naXQgYS9uZXQvaWVlZTgwMjExL3NvZnRtYWMvaWVlZTgwMjExc29mdG1hY19hc3NvYy5jIGIvbmV0L2llZWU4MDIxMS9zb2Z0bWFjL2llZWU4MDIxMXNvZnRtYWNfYXNzb2MuYwppbmRleCA1ODlmNmQyLi5jZjUxYzg3IDEwMDY0NAotLS0gYS9uZXQvaWVlZTgwMjExL3NvZnRtYWMvaWVlZTgwMjExc29mdG1hY19hc3NvYy5jCisrKyBiL25ldC9pZWVlODAyMTEvc29mdG1hYy9pZWVlODAyMTFzb2Z0bWFjX2Fzc29jLmMKQEAgLTQ4LDcgKzQ4LDcgQEAKIAlkcHJpbnRrKEtFUk5fSU5GTyBQRlggInNlbnQgYXNzb2NpYXRpb24gcmVxdWVzdCFcbiIpOwogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJm1hYy0+bG9jaywgZmxhZ3MpOwotCW1hYy0+YXNzb2NpYXRlZCA9IDA7IC8qIGp1c3QgdG8gbWFrZSBzdXJlICovCisJbWFjLT5hc3NvY2luZm8uYXNzb2NpYXRlZCA9IDA7IC8qIGp1c3QgdG8gbWFrZSBzdXJlICovCiAKIAkvKiBTZXQgYSB0aW1lciBmb3IgdGltZW91dCAqLwogCS8qIEZJWE1FOiBtYWtlIHRpbWVvdXQgY29uZmlndXJhYmxlICovCkBAIC02MiwyNCArNjIsMjIgQEAKIHsKIAlzdHJ1Y3QgaWVlZTgwMjExc29mdG1hY19kZXZpY2UgKm1hYyA9IChzdHJ1Y3QgaWVlZTgwMjExc29mdG1hY19kZXZpY2UgKilkOwogCXN0cnVjdCBpZWVlODAyMTFzb2Z0bWFjX25ldHdvcmsgKm47Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKIAotCXNwaW5fbG9ja19pcnFzYXZlKCZtYWMtPmxvY2ssIGZsYWdzKTsKKwltdXRleF9sb2NrKCZtYWMtPmFzc29jaW5mby5tdXRleCk7CiAJLyogd2UgbWlnaHQgcmFjZSBhZ2FpbnN0IGllZWU4MDIxMXNvZnRtYWNfaGFuZGxlX2Fzc29jX3Jlc3BvbnNlLAogCSAqIHNvIG1ha2Ugc3VyZSBvbmx5IG9uZSBvZiB1cyBkb2VzIHNvbWV0aGluZyAqLwotCWlmICghbWFjLT5hc3NvY2luZm8uYXNzb2NpYXRpbmcpIHsKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbWFjLT5sb2NrLCBmbGFncyk7Ci0JCXJldHVybjsKLQl9CisJaWYgKCFtYWMtPmFzc29jaW5mby5hc3NvY2lhdGluZykKKwkJZ290byBvdXQ7CiAJbWFjLT5hc3NvY2luZm8uYXNzb2NpYXRpbmcgPSAwOwogCW1hYy0+YXNzb2NpbmZvLmJzc3ZhbGlkID0gMDsKLQltYWMtPmFzc29jaWF0ZWQgPSAwOworCW1hYy0+YXNzb2NpbmZvLmFzc29jaWF0ZWQgPSAwOwogCiAJbiA9IGllZWU4MDIxMXNvZnRtYWNfZ2V0X25ldHdvcmtfYnlfYnNzaWRfbG9ja2VkKG1hYywgbWFjLT5hc3NvY2luZm8uYnNzaWQpOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm1hYy0+bG9jaywgZmxhZ3MpOwogCiAJZHByaW50ayhLRVJOX0lORk8gUEZYICJhc3NvYyByZXF1ZXN0IHRpbWVkIG91dCFcbiIpOwogCWllZWU4MDIxMXNvZnRtYWNfY2FsbF9ldmVudHMobWFjLCBJRUVFODAyMTFTT0ZUTUFDX0VWRU5UX0FTU09DSUFURV9USU1FT1VULCBuKTsKK291dDoKKwltdXRleF91bmxvY2soJm1hYy0+YXNzb2NpbmZvLm11dGV4KTsKIH0KIAogdm9pZApAQCAtOTMsNyArOTEsNyBAQAogCiAJbmV0aWZfY2Fycmllcl9vZmYobWFjLT5kZXYpOwogCi0JbWFjLT5hc3NvY2lhdGVkID0gMDsKKwltYWMtPmFzc29jaW5mby5hc3NvY2lhdGVkID0gMDsKIAltYWMtPmFzc29jaW5mby5ic3N2YWxpZCA9IDA7CiAJbWFjLT5hc3NvY2luZm8uYXNzb2NpYXRpbmcgPSAwOwogCWllZWU4MDIxMXNvZnRtYWNfaW5pdF9ic3MobWFjKTsKQEAgLTEwNyw3ICsxMDUsNyBAQAogewogCXN0cnVjdCBpZWVlODAyMTFzb2Z0bWFjX25ldHdvcmsgKmZvdW5kOwogCi0JaWYgKG1hYy0+YXNzb2NpbmZvLmJzc3ZhbGlkICYmIG1hYy0+YXNzb2NpYXRlZCkgeworCWlmIChtYWMtPmFzc29jaW5mby5ic3N2YWxpZCAmJiBtYWMtPmFzc29jaW5mby5hc3NvY2lhdGVkKSB7CiAJCWZvdW5kID0gaWVlZTgwMjExc29mdG1hY19nZXRfbmV0d29ya19ieV9ic3NpZChtYWMsIG1hYy0+YXNzb2NpbmZvLmJzc2lkKTsKIAkJaWYgKGZvdW5kKQogCQkJaWVlZTgwMjExc29mdG1hY19zZW5kX21ndF9mcmFtZShtYWMsIGZvdW5kLCBJRUVFODAyMTFfU1RZUEVfRElTQVNTT0MsIHJlYXNvbik7CkBAIC0xOTYsMTcgKzE5NCwxOCBAQAogCWludCBic3N2YWxpZDsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCisJbXV0ZXhfbG9jaygmbWFjLT5hc3NvY2luZm8ubXV0ZXgpOworCisJaWYgKCFtYWMtPmFzc29jaW5mby5hc3NvY2lhdGluZykKKwkJZ290byBvdXQ7CisKIAkvKiBpZWVlODAyMTFfZGlzYXNzb2MgbWlnaHQgY2xlYXIgdGhpcyAqLwogCWJzc3ZhbGlkID0gbWFjLT5hc3NvY2luZm8uYnNzdmFsaWQ7CiAKIAkvKiBtZWggKi8KLQlpZiAobWFjLT5hc3NvY2lhdGVkKQorCWlmIChtYWMtPmFzc29jaW5mby5hc3NvY2lhdGVkKQogCQlpZWVlODAyMTFzb2Z0bWFjX3NlbmRfZGlzYXNzb2NfcmVxKG1hYywgV0xBTl9SRUFTT05fRElTQVNTT0NfU1RBX0hBU19MRUZUKTsKIAotCXNwaW5fbG9ja19pcnFzYXZlKCZtYWMtPmxvY2ssIGZsYWdzKTsKLQltYWMtPmFzc29jaW5mby5hc3NvY2lhdGluZyA9IDE7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbWFjLT5sb2NrLCBmbGFncyk7Ci0KIAkvKiB0cnkgdG8gZmluZCB0aGUgcmVxdWVzdGVkIG5ldHdvcmsgaW4gb3VyIGxpc3QsIGlmIHdlIGZvdW5kIG9uZSBhbHJlYWR5ICovCiAJaWYgKGJzc3ZhbGlkIHx8IG1hYy0+YXNzb2NpbmZvLmJzc2ZpeGVkKQogCQlmb3VuZCA9IGllZWU4MDIxMXNvZnRtYWNfZ2V0X25ldHdvcmtfYnlfYnNzaWQobWFjLCBtYWMtPmFzc29jaW5mby5ic3NpZCk7CQpAQCAtMjYwLDEwICsyNTksOCBAQAogCiAJaWYgKCFmb3VuZCkgewogCQlpZiAobWFjLT5hc3NvY2luZm8uc2Nhbl9yZXRyeSA+IDApIHsKLQkJCXNwaW5fbG9ja19pcnFzYXZlKCZtYWMtPmxvY2ssIGZsYWdzKTsKIAkJCW1hYy0+YXNzb2NpbmZvLnNjYW5fcmV0cnktLTsKLQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm1hYy0+bG9jaywgZmxhZ3MpOwotCQkKKwogCQkJLyogV2Uga25vdyBvZiBubyBzdWNoIG5ldHdvcmsuIExldCdzIHNjYW4uIAogCQkJICogTkI6IHRoaXMgYWxzbyBoYXBwZW5zIGlmIHdlIGhhZCBubyBtZW1vcnkgdG8gY29weSB0aGUgbmV0d29yayBpbmZvLi4uCiAJCQkgKiBNYXliZSB3ZSBjYW4gaG9wZSB0byBoYXZlIG1vcmUgbWVtb3J5IGFmdGVyIHNjYW5uaW5nIGZpbmlzaGVzIDspCkBAIC0yNzIsMTkgKzI2OSwxNyBAQAogCQkJaWVlZTgwMjExc29mdG1hY19ub3RpZnkobWFjLT5kZXYsIElFRUU4MDIxMVNPRlRNQUNfRVZFTlRfU0NBTl9GSU5JU0hFRCwgaWVlZTgwMjExc29mdG1hY19hc3NvY19ub3RpZnlfc2NhbiwgTlVMTCk7CiAJCQlpZiAoaWVlZTgwMjExc29mdG1hY19zdGFydF9zY2FuKG1hYykpCiAJCQkJZHByaW50ayhLRVJOX0lORk8gUEZYICJBc3NvY2lhdGU6IGZhaWxlZCB0byBpbml0aWF0ZSBzY2FuLiBJcyBkZXZpY2UgdXA/XG4iKTsKLQkJCXJldHVybjsKKwkJCWdvdG8gb3V0OwogCQl9IGVsc2UgewotCQkJc3Bpbl9sb2NrX2lycXNhdmUoJm1hYy0+bG9jaywgZmxhZ3MpOwogCQkJbWFjLT5hc3NvY2luZm8uYXNzb2NpYXRpbmcgPSAwOwotCQkJbWFjLT5hc3NvY2lhdGVkID0gMDsKLQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm1hYy0+bG9jaywgZmxhZ3MpOworCQkJbWFjLT5hc3NvY2luZm8uYXNzb2NpYXRlZCA9IDA7CiAKIAkJCWRwcmludGsoS0VSTl9JTkZPIFBGWCAiVW5hYmxlIHRvIGZpbmQgbWF0Y2hpbmcgbmV0d29yayBhZnRlciBzY2FuIVxuIik7CiAJCQkvKiByZXNldCB0aGUgcmV0cnkgY291bnRlciBmb3IgdGhlIG5leHQgdXNlciByZXF1ZXN0IHNpbmNlIHdlCiAJCQkgKiBicmVhayBvdXQgYW5kIGRvbid0IHJlc2NoZWR1bGUgb3Vyc2VsdmVzIGFmdGVyIHRoaXMgcG9pbnQuICovCiAJCQltYWMtPmFzc29jaW5mby5zY2FuX3JldHJ5ID0gSUVFRTgwMjExU09GVE1BQ19BU1NPQ19TQ0FOX1JFVFJZX0xJTUlUOwogCQkJaWVlZTgwMjExc29mdG1hY19jYWxsX2V2ZW50cyhtYWMsIElFRUU4MDIxMVNPRlRNQUNfRVZFTlRfQVNTT0NJQVRFX05FVF9OT1RfRk9VTkQsIE5VTEwpOwotCQkJcmV0dXJuOworCQkJZ290byBvdXQ7CiAJCX0KIAl9CiAKQEAgLTI5Nyw3ICsyOTIsNyBAQAogCS8qIGNvcHkgdGhlIEVTU0lEIGZvciBkaXNwbGF5aW5nIGl0ICovCiAJbWFjLT5hc3NvY2luZm8uYXNzb2NpYXRlX2Vzc2lkLmxlbiA9IGZvdW5kLT5lc3NpZC5sZW47CiAJbWVtY3B5KG1hYy0+YXNzb2NpbmZvLmFzc29jaWF0ZV9lc3NpZC5kYXRhLCBmb3VuZC0+ZXNzaWQuZGF0YSwgSVdfRVNTSURfTUFYX1NJWkUgKyAxKTsKLQkKKwogCS8qIHdlIGZvdW5kIGEgbmV0d29yayEgYXV0aGVudGljYXRlIChpZiBuZWNlc3NhcnkpIGFuZCBhc3NvY2lhdGUgdG8gaXQuICovCiAJaWYgKGZvdW5kLT5hdXRoZW50aWNhdGluZykgewogCQlkcHJpbnRrKEtFUk5fSU5GTyBQRlggIkFscmVhZHkgcmVxdWVzdGVkIGF1dGhlbnRpY2F0aW9uLCB3YWl0aW5nLi4uXG4iKTsKQEAgLTMwNSw3ICszMDAsNyBAQAogCQkJbWFjLT5hc3NvY2luZm8uYXNzb2Nfd2FpdCA9IDE7CiAJCQlpZWVlODAyMTFzb2Z0bWFjX25vdGlmeV9pbnRlcm5hbChtYWMsIElFRUU4MDIxMVNPRlRNQUNfRVZFTlRfQU5ZLCBmb3VuZCwgaWVlZTgwMjExc29mdG1hY19hc3NvY19ub3RpZnlfYXV0aCwgTlVMTCwgR0ZQX0tFUk5FTCk7CiAJCX0KLQkJcmV0dXJuOworCQlnb3RvIG91dDsKIAl9CiAJaWYgKCFmb3VuZC0+YXV0aGVudGljYXRlZCAmJiAhZm91bmQtPmF1dGhlbnRpY2F0aW5nKSB7CiAJCS8qIFRoaXMgcmVsaWVzIG9uIHRoZSBmYWN0IHRoYXQgX2F1dGhfcmVxIG9ubHkgcXVldWVzIHRoZSB3b3JrLApAQCAtMzIxLDExICszMTYsMTQgQEAKIAkJCW1hYy0+YXNzb2NpbmZvLmFzc29jX3dhaXQgPSAwOwogCQkJaWVlZTgwMjExc29mdG1hY19jYWxsX2V2ZW50cyhtYWMsIElFRUU4MDIxMVNPRlRNQUNfRVZFTlRfQVNTT0NJQVRFX0ZBSUxFRCwgZm91bmQpOwogCQl9Ci0JCXJldHVybjsKKwkJZ290byBvdXQ7CiAJfQogCS8qIGZpbmFsbHkhIG5vdyB3ZSBjYW4gc3RhcnQgYXNzb2NpYXRpbmcgKi8KIAltYWMtPmFzc29jaW5mby5hc3NvY193YWl0ID0gMDsKIAlpZWVlODAyMTFzb2Z0bWFjX2Fzc29jKG1hYywgZm91bmQpOworCitvdXQ6CisJbXV0ZXhfdW5sb2NrKCZtYWMtPmFzc29jaW5mby5tdXRleCk7CiB9CiAKIC8qIGNhbGwgdGhpcyB0byBkbyB3aGF0ZXZlciBpcyBuZWNlc3Nhcnkgd2hlbiB3ZSdyZSBhc3NvY2lhdGVkICovCkBAIC0zNDEsNyArMzM5LDcgQEAKIAltYWMtPmJzc2luZm8uc3VwcG9ydGVkX3JhdGVzID0gbmV0LT5zdXBwb3J0ZWRfcmF0ZXM7CiAJaWVlZTgwMjExc29mdG1hY19yZWNhbGNfdHhyYXRlcyhtYWMpOwogCi0JbWFjLT5hc3NvY2lhdGVkID0gMTsKKwltYWMtPmFzc29jaW5mby5hc3NvY2lhdGVkID0gMTsKIAogCW1hYy0+YXNzb2NpbmZvLnNob3J0X3ByZWFtYmxlX2F2YWlsYWJsZSA9CiAJCShjYXAgJiBXTEFOX0NBUEFCSUxJVFlfU0hPUlRfUFJFQU1CTEUpICE9IDA7CkBAIC00MjEsNyArNDE5LDcgQEAKIAkJCWRwcmludGsoS0VSTl9JTkZPIFBGWCAiYXNzb2NpYXRpbmcgZmFpbGVkIChyZWFzb246IDB4JXgpIVxuIiwgc3RhdHVzKTsKIAkJCW1hYy0+YXNzb2NpbmZvLmFzc29jaWF0aW5nID0gMDsKIAkJCW1hYy0+YXNzb2NpbmZvLmJzc3ZhbGlkID0gMDsKLQkJCW1hYy0+YXNzb2NpYXRlZCA9IDA7CisJCQltYWMtPmFzc29jaW5mby5hc3NvY2lhdGVkID0gMDsKIAkJCWllZWU4MDIxMXNvZnRtYWNfY2FsbF9ldmVudHNfbG9ja2VkKG1hYywgSUVFRTgwMjExU09GVE1BQ19FVkVOVF9BU1NPQ0lBVEVfRkFJTEVELCBuZXR3b3JrKTsKIAl9CiAJCmRpZmYgLS1naXQgYS9uZXQvaWVlZTgwMjExL3NvZnRtYWMvaWVlZTgwMjExc29mdG1hY19pby5jIGIvbmV0L2llZWU4MDIxMS9zb2Z0bWFjL2llZWU4MDIxMXNvZnRtYWNfaW8uYwppbmRleCA4MmJmZGRiLi5iOTY5MzEwIDEwMDY0NAotLS0gYS9uZXQvaWVlZTgwMjExL3NvZnRtYWMvaWVlZTgwMjExc29mdG1hY19pby5jCisrKyBiL25ldC9pZWVlODAyMTEvc29mdG1hYy9pZWVlODAyMTFzb2Z0bWFjX2lvLmMKQEAgLTMwNCw3ICszMDQsNyBAQAogCQkyICsJCS8qIEF1dGggVHJhbnNhY3Rpb24gU2VxICovCiAJCTIgKwkJLyogU3RhdHVzIENvZGUgKi8KIAkJIC8qIENoYWxsZW5nZSBUZXh0IElFICovCi0JCWlzX3NoYXJlZF9yZXNwb25zZSA/IDAgOiAxICsgMSArIG5ldC0+Y2hhbGxlbmdlX2xlbgorCQkoaXNfc2hhcmVkX3Jlc3BvbnNlID8gMSArIDEgKyBuZXQtPmNoYWxsZW5nZV9sZW4gOiAwKQogCSk7CiAJaWYgKHVubGlrZWx5KCgqcGt0KSA9PSBOVUxMKSkKIAkJcmV0dXJuIDA7CkBAIC00NzUsOCArNDc1LDEzIEBACiB7CiAJc3RydWN0IGllZWU4MDIxMXNvZnRtYWNfZGV2aWNlICptYWMgPSBpZWVlODAyMTFfcHJpdihkZXYpOwogCi0JaWYgKG1hYy0+YXNzb2NpYXRlZCAmJiBtZW1jbXAobmV0d29yay0+YnNzaWQsIG1hYy0+YXNzb2NpbmZvLmJzc2lkLCBFVEhfQUxFTikgPT0gMCkKLQkJaWVlZTgwMjExc29mdG1hY19wcm9jZXNzX2VycChtYWMsIG5ldHdvcmstPmVycF92YWx1ZSk7CisJLyogVGhpcyBtaWdodCByYWNlLCBidXQgd2UgZG9uJ3QgcmVhbGx5IGNhcmUgYW5kIGl0J3Mgbm90IHdvcnRoCisJICogYWRkaW5nIGhlYXZ5d2VpZ2h0IGxvY2tpbmcgaW4gdGhpcyBmYXN0cGF0aC4KKwkgKi8KKwlpZiAobWFjLT5hc3NvY2luZm8uYXNzb2NpYXRlZCkgeworCQlpZiAobWVtY21wKG5ldHdvcmstPmJzc2lkLCBtYWMtPmFzc29jaW5mby5ic3NpZCwgRVRIX0FMRU4pID09IDApCisJCQlpZWVlODAyMTFzb2Z0bWFjX3Byb2Nlc3NfZXJwKG1hYywgbmV0d29yay0+ZXJwX3ZhbHVlKTsKKwl9CiAKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL25ldC9pZWVlODAyMTEvc29mdG1hYy9pZWVlODAyMTFzb2Z0bWFjX21vZHVsZS5jIGIvbmV0L2llZWU4MDIxMS9zb2Z0bWFjL2llZWU4MDIxMXNvZnRtYWNfbW9kdWxlLmMKaW5kZXggYWRkZWExYy4uMzNhZmY0ZiAxMDA2NDQKLS0tIGEvbmV0L2llZWU4MDIxMS9zb2Z0bWFjL2llZWU4MDIxMXNvZnRtYWNfbW9kdWxlLmMKKysrIGIvbmV0L2llZWU4MDIxMS9zb2Z0bWFjL2llZWU4MDIxMXNvZnRtYWNfbW9kdWxlLmMKQEAgLTU3LDYgKzU3LDcgQEAKIAlJTklUX0xJU1RfSEVBRCgmc29mdG1hYy0+bmV0d29ya19saXN0KTsKIAlJTklUX0xJU1RfSEVBRCgmc29mdG1hYy0+ZXZlbnRzKTsKIAorCW11dGV4X2luaXQoJnNvZnRtYWMtPmFzc29jaW5mby5tdXRleCk7CiAJSU5JVF9XT1JLKCZzb2Z0bWFjLT5hc3NvY2luZm8ud29yaywgaWVlZTgwMjExc29mdG1hY19hc3NvY193b3JrLCBzb2Z0bWFjKTsKIAlJTklUX1dPUksoJnNvZnRtYWMtPmFzc29jaW5mby50aW1lb3V0LCBpZWVlODAyMTFzb2Z0bWFjX2Fzc29jX3RpbWVvdXQsIHNvZnRtYWMpOwogCXNvZnRtYWMtPnN0YXJ0X3NjYW4gPSBpZWVlODAyMTFzb2Z0bWFjX3N0YXJ0X3NjYW5faW1wbGVtZW50YXRpb247CmRpZmYgLS1naXQgYS9uZXQvaWVlZTgwMjExL3NvZnRtYWMvaWVlZTgwMjExc29mdG1hY193eC5jIGIvbmV0L2llZWU4MDIxMS9zb2Z0bWFjL2llZWU4MDIxMXNvZnRtYWNfd3guYwppbmRleCAyYWE3NzlkLi4yMzA2OGE4IDEwMDY0NAotLS0gYS9uZXQvaWVlZTgwMjExL3NvZnRtYWMvaWVlZTgwMjExc29mdG1hY193eC5jCisrKyBiL25ldC9pZWVlODAyMTEvc29mdG1hYy9pZWVlODAyMTFzb2Z0bWFjX3d4LmMKQEAgLTczLDEzICs3MywxNCBAQAogCXN0cnVjdCBpZWVlODAyMTFzb2Z0bWFjX25ldHdvcmsgKm47CiAJc3RydWN0IGllZWU4MDIxMXNvZnRtYWNfYXV0aF9xdWV1ZV9pdGVtICphdXRocHRyOwogCWludCBsZW5ndGggPSAwOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwltdXRleF9sb2NrKCZzbS0+YXNzb2NpbmZvLm11dGV4KTsKIAogCS8qIENoZWNrIGlmIHdlJ3JlIGFscmVhZHkgYXNzb2NpYXRpbmcgdG8gdGhpcyBvciBhbm90aGVyIG5ldHdvcmsKIAkgKiBJZiBpdCdzIGFub3RoZXIgbmV0d29yaywgY2FuY2VsIGFuZCBzdGFydCBvdmVyIHdpdGggb3VyIG5ldyBuZXR3b3JrCiAJICogSWYgaXQncyBvdXIgbmV0d29yaywgaWdub3JlIHRoZSBjaGFuZ2UsIHdlJ3JlIGFscmVhZHkgZG9pbmcgaXQhCiAJICovCi0JaWYoKHNtLT5hc3NvY2luZm8uYXNzb2NpYXRpbmcgfHwgc20tPmFzc29jaWF0ZWQpICYmCisJaWYoKHNtLT5hc3NvY2luZm8uYXNzb2NpYXRpbmcgfHwgc20tPmFzc29jaW5mby5hc3NvY2lhdGVkKSAmJgogCSAgIChkYXRhLT5lc3NpZC5mbGFncyAmJiBkYXRhLT5lc3NpZC5sZW5ndGgpKSB7CiAJCS8qIEdldCB0aGUgYXNzb2NpYXRpbmcgbmV0d29yayAqLwogCQluID0gaWVlZTgwMjExc29mdG1hY19nZXRfbmV0d29ya19ieV9ic3NpZChzbSwgc20tPmFzc29jaW5mby5ic3NpZCk7CkBAIC04NywxMCArODgsOSBAQAogCQkgICAhbWVtY21wKG4tPmVzc2lkLmRhdGEsIGV4dHJhLCBuLT5lc3NpZC5sZW4pKSB7CiAJCQlkcHJpbnRrKEtFUk5fSU5GTyBQRlggIkFscmVhZHkgYXNzb2NpYXRpbmcgb3IgYXNzb2NpYXRlZCB0byAiTUFDX0ZNVCJcbiIsCiAJCQkJTUFDX0FSRyhzbS0+YXNzb2NpbmZvLmJzc2lkKSk7Ci0JCQlyZXR1cm4gMDsKKwkJCWdvdG8gb3V0OwogCQl9IGVsc2UgewogCQkJZHByaW50ayhLRVJOX0lORk8gUEZYICJDYW5jZWxpbmcgZXhpc3RpbmcgYXNzb2NpYXRlIHJlcXVlc3QhXG4iKTsKLQkJCXNwaW5fbG9ja19pcnFzYXZlKCZzbS0+bG9jayxmbGFncyk7CiAJCQkvKiBDYW5jZWwgYXNzb2Mgd29yayAqLwogCQkJY2FuY2VsX2RlbGF5ZWRfd29yaygmc20tPmFzc29jaW5mby53b3JrKTsKIAkJCS8qIFdlIGRvbid0IGhhdmUgdG8gZG8gdGhpcywgYnV0IGl0J3MgYSBsaXR0bGUgY2xlYW5lciAqLwpAQCAtOTgsMTQgKzk4LDEzIEBACiAJCQkJY2FuY2VsX2RlbGF5ZWRfd29yaygmYXV0aHB0ci0+d29yayk7CiAJCQlzbS0+YXNzb2NpbmZvLmJzc3ZhbGlkID0gMDsKIAkJCXNtLT5hc3NvY2luZm8uYnNzZml4ZWQgPSAwOwotCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc20tPmxvY2ssZmxhZ3MpOwogCQkJZmx1c2hfc2NoZWR1bGVkX3dvcmsoKTsKKwkJCXNtLT5hc3NvY2luZm8uYXNzb2NpYXRpbmcgPSAwOworCQkJc20tPmFzc29jaW5mby5hc3NvY2lhdGVkID0gMDsKIAkJfQogCX0KIAogCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJnNtLT5sb2NrLCBmbGFncyk7Ci0KIAlzbS0+YXNzb2NpbmZvLnN0YXRpY19lc3NpZCA9IDA7CiAJc20tPmFzc29jaW5mby5hc3NvY193YWl0ID0gMDsKIApAQCAtMTIxLDEwICsxMjAsMTIgQEAKIAkgKiBJZiBhcHBsaWNhYmxlLCB3ZSBoYXZlIGFscmVhZHkgY29waWVkIHRoZSBkYXRhIGluICovCiAJc20tPmFzc29jaW5mby5yZXFfZXNzaWQubGVuID0gbGVuZ3RoOwogCisJc20tPmFzc29jaW5mby5hc3NvY2lhdGluZyA9IDE7CiAJLyogcXVldWUgbG93ZXIgbGV2ZWwgY29kZSB0byBkbyB3b3JrIChpZiBuZWNlc3NhcnkpICovCiAJc2NoZWR1bGVfd29yaygmc20tPmFzc29jaW5mby53b3JrKTsKK291dDoKKwltdXRleF91bmxvY2soJnNtLT5hc3NvY2luZm8ubXV0ZXgpOwogCi0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc20tPmxvY2ssIGZsYWdzKTsKIAlyZXR1cm4gMDsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKGllZWU4MDIxMXNvZnRtYWNfd3hfc2V0X2Vzc2lkKTsKQEAgLTEzNiwxMCArMTM3LDggQEAKIAkJCSAgICAgIGNoYXIgKmV4dHJhKQogewogCXN0cnVjdCBpZWVlODAyMTFzb2Z0bWFjX2RldmljZSAqc20gPSBpZWVlODAyMTFfcHJpdihuZXRfZGV2KTsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwogCi0JLyogYXZvaWQgZ2V0dGluZyBpbmNvbnNpc3RlbnQgaW5mb3JtYXRpb24gKi8KLQlzcGluX2xvY2tfaXJxc2F2ZSgmc20tPmxvY2ssIGZsYWdzKTsKKwltdXRleF9sb2NrKCZzbS0+YXNzb2NpbmZvLm11dGV4KTsKIAkvKiBJZiBhbGwgZmFpbHMsIHJldHVybiBBTlkgKGVtcHR5KSAqLwogCWRhdGEtPmVzc2lkLmxlbmd0aCA9IDA7CiAJZGF0YS0+ZXNzaWQuZmxhZ3MgPSAwOyAgLyogYWN0aXZlICovCkBAIC0xNTIsMTIgKzE1MSwxMyBAQAogCX0KIAkKIAkvKiBJZiB3ZSdyZSBhc3NvY2lhdGluZy9hc3NvY2lhdGVkLCByZXR1cm4gdGhhdCAqLwotCWlmIChzbS0+YXNzb2NpYXRlZCB8fCBzbS0+YXNzb2NpbmZvLmFzc29jaWF0aW5nKSB7CisJaWYgKHNtLT5hc3NvY2luZm8uYXNzb2NpYXRlZCB8fCBzbS0+YXNzb2NpbmZvLmFzc29jaWF0aW5nKSB7CiAJCWRhdGEtPmVzc2lkLmxlbmd0aCA9IHNtLT5hc3NvY2luZm8uYXNzb2NpYXRlX2Vzc2lkLmxlbjsKIAkJZGF0YS0+ZXNzaWQuZmxhZ3MgPSAxOyAgLyogYWN0aXZlICovCiAJCW1lbWNweShleHRyYSwgc20tPmFzc29jaW5mby5hc3NvY2lhdGVfZXNzaWQuZGF0YSwgc20tPmFzc29jaW5mby5hc3NvY2lhdGVfZXNzaWQubGVuKTsKIAl9Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc20tPmxvY2ssIGZsYWdzKTsKKwltdXRleF91bmxvY2soJnNtLT5hc3NvY2luZm8ubXV0ZXgpOworCiAJcmV0dXJuIDA7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTChpZWVlODAyMTFzb2Z0bWFjX3d4X2dldF9lc3NpZCk7CkBAIC0zMjIsMTUgKzMyMiwxNSBAQAogewogCXN0cnVjdCBpZWVlODAyMTFzb2Z0bWFjX2RldmljZSAqbWFjID0gaWVlZTgwMjExX3ByaXYobmV0X2Rldik7CiAJaW50IGVyciA9IDA7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKIAotCXNwaW5fbG9ja19pcnFzYXZlKCZtYWMtPmxvY2ssIGZsYWdzKTsKKwltdXRleF9sb2NrKCZtYWMtPmFzc29jaW5mby5tdXRleCk7CiAJaWYgKG1hYy0+YXNzb2NpbmZvLmJzc3ZhbGlkKQogCQltZW1jcHkoZGF0YS0+YXBfYWRkci5zYV9kYXRhLCBtYWMtPmFzc29jaW5mby5ic3NpZCwgRVRIX0FMRU4pOwogCWVsc2UKIAkJbWVtc2V0KGRhdGEtPmFwX2FkZHIuc2FfZGF0YSwgMHhmZiwgRVRIX0FMRU4pOwogCWRhdGEtPmFwX2FkZHIuc2FfZmFtaWx5ID0gQVJQSFJEX0VUSEVSOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm1hYy0+bG9jaywgZmxhZ3MpOworCW11dGV4X3VubG9jaygmbWFjLT5hc3NvY2luZm8ubXV0ZXgpOworCiAJcmV0dXJuIGVycjsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKGllZWU4MDIxMXNvZnRtYWNfd3hfZ2V0X3dhcCk7CkBAIC0zNDIsMjggKzM0MiwyNyBAQAogCQkJICAgIGNoYXIgKmV4dHJhKQogewogCXN0cnVjdCBpZWVlODAyMTFzb2Z0bWFjX2RldmljZSAqbWFjID0gaWVlZTgwMjExX3ByaXYobmV0X2Rldik7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKIAogCS8qIHNhbml0eSBjaGVjayAqLwogCWlmIChkYXRhLT5hcF9hZGRyLnNhX2ZhbWlseSAhPSBBUlBIUkRfRVRIRVIpIHsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJm1hYy0+bG9jaywgZmxhZ3MpOworCW11dGV4X2xvY2soJm1hYy0+YXNzb2NpbmZvLm11dGV4KTsKIAlpZiAoaXNfYnJvYWRjYXN0X2V0aGVyX2FkZHIoZGF0YS0+YXBfYWRkci5zYV9kYXRhKSkgewogCQkvKiB0aGUgYnNzaWQgd2UgaGF2ZSBpcyBub3QgdG8gYmUgZml4ZWQgYW55IGxvbmdlciwKIAkJICogYW5kIHdlIHNob3VsZCByZWFzc29jaWF0ZSB0byB0aGUgYmVzdCBBUC4gKi8KIAkJbWFjLT5hc3NvY2luZm8uYnNzZml4ZWQgPSAwOwogCQkvKiBmb3JjZSByZWFzc29jaWF0aW9uICovCiAJCW1hYy0+YXNzb2NpbmZvLmJzc3ZhbGlkID0gMDsKLQkJaWYgKG1hYy0+YXNzb2NpYXRlZCkKKwkJaWYgKG1hYy0+YXNzb2NpbmZvLmFzc29jaWF0ZWQpCiAJCQlzY2hlZHVsZV93b3JrKCZtYWMtPmFzc29jaW5mby53b3JrKTsKIAl9IGVsc2UgaWYgKGlzX3plcm9fZXRoZXJfYWRkcihkYXRhLT5hcF9hZGRyLnNhX2RhdGEpKSB7CiAJCS8qIHRoZSBic3NpZCB3ZSBoYXZlIGlzIG5vIGxvbmdlciBmaXhlZCAqLwogCQltYWMtPmFzc29jaW5mby5ic3NmaXhlZCA9IDA7CiAgICAgICAgIH0gZWxzZSB7CiAJCWlmICghbWVtY21wKG1hYy0+YXNzb2NpbmZvLmJzc2lkLCBkYXRhLT5hcF9hZGRyLnNhX2RhdGEsIEVUSF9BTEVOKSkgewotCQkJaWYgKG1hYy0+YXNzb2NpbmZvLmFzc29jaWF0aW5nIHx8IG1hYy0+YXNzb2NpYXRlZCkgeworCQkJaWYgKG1hYy0+YXNzb2NpbmZvLmFzc29jaWF0aW5nIHx8IG1hYy0+YXNzb2NpbmZvLmFzc29jaWF0ZWQpIHsKIAkJCS8qIGJzc2lkIHVuY2hhbmdlZCBhbmQgYXNzb2NpYXRlZCBvciBhc3NvY2lhdGluZyAtIGp1c3QgcmV0dXJuICovCiAJCQkJZ290byBvdXQ7CiAJCQl9CkBAIC0zNzgsNyArMzc3LDggQEAKICAgICAgICAgfQogCiAgb3V0OgotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm1hYy0+bG9jaywgZmxhZ3MpOworCW11dGV4X3VubG9jaygmbWFjLT5hc3NvY2luZm8ubXV0ZXgpOworCiAJcmV0dXJuIDA7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTChpZWVlODAyMTFzb2Z0bWFjX3d4X3NldF93YXApOwpAQCAtMzk0LDcgKzM5NCw4IEBACiAJaW50IGVyciA9IDA7CiAJY2hhciAqYnVmOwogCWludCBpOwotCQorCisJbXV0ZXhfbG9jaygmbWFjLT5hc3NvY2luZm8ubXV0ZXgpOwogCXNwaW5fbG9ja19pcnFzYXZlKCZtYWMtPmxvY2ssIGZsYWdzKTsKIAkvKiBibGVoLiBzaG91bGRuJ3QgYmUgbG9ja2VkIGZvciB0aGF0IGttYWxsb2MuLi4gKi8KIApAQCAtNDMyLDYgKzQzMyw4IEBACiAKICBvdXQ6CQogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm1hYy0+bG9jaywgZmxhZ3MpOworCW11dGV4X3VubG9jaygmbWFjLT5hc3NvY2luZm8ubXV0ZXgpOworCiAJcmV0dXJuIGVycjsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKGllZWU4MDIxMXNvZnRtYWNfd3hfc2V0X2dlbmllKTsKQEAgLTQ0Niw3ICs0NDksOCBAQAogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJaW50IGVyciA9IDA7CiAJaW50IHNwYWNlID0gd3JxdS0+ZGF0YS5sZW5ndGg7Ci0JCisKKwltdXRleF9sb2NrKCZtYWMtPmFzc29jaW5mby5tdXRleCk7CiAJc3Bpbl9sb2NrX2lycXNhdmUoJm1hYy0+bG9jaywgZmxhZ3MpOwogCQogCXdycXUtPmRhdGEubGVuZ3RoID0gMDsKQEAgLTQ1OSw2ICs0NjMsOCBAQAogCQkJZXJyID0gLUUyQklHOwogCX0KIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZtYWMtPmxvY2ssIGZsYWdzKTsKKwltdXRleF9sb2NrKCZtYWMtPmFzc29jaW5mby5tdXRleCk7CisKIAlyZXR1cm4gZXJyOwogfQogRVhQT1JUX1NZTUJPTF9HUEwoaWVlZTgwMjExc29mdG1hY193eF9nZXRfZ2VuaWUpOwpAQCAtNDczLDEwICs0NzksMTMgQEAKIAlzdHJ1Y3QgaXdfbWxtZSAqbWxtZSA9IChzdHJ1Y3QgaXdfbWxtZSAqKWV4dHJhOwogCXUxNiByZWFzb24gPSBjcHVfdG9fbGUxNihtbG1lLT5yZWFzb25fY29kZSk7CiAJc3RydWN0IGllZWU4MDIxMXNvZnRtYWNfbmV0d29yayAqbmV0OworCWludCBlcnIgPSAtRUlOVkFMOworCisJbXV0ZXhfbG9jaygmbWFjLT5hc3NvY2luZm8ubXV0ZXgpOwogCiAJaWYgKG1lbWNtcChtYWMtPmFzc29jaW5mby5ic3NpZCwgbWxtZS0+YWRkci5zYV9kYXRhLCBFVEhfQUxFTikpIHsKIAkJcHJpbnRrKEtFUk5fREVCVUcgUEZYICJ3eF9zZXRfbWxtZTogcmVxdWVzdGVkIG9wZXJhdGlvbiBvbiBuZXQgd2UgZG9uJ3QgdXNlXG4iKTsKLQkJcmV0dXJuIC1FSU5WQUw7CisJCWdvdG8gb3V0OwogCX0KIAogCXN3aXRjaCAobWxtZS0+Y21kKSB7CkBAIC00ODQsMTQgKzQ5MywyMiBAQAogCQluZXQgPSBpZWVlODAyMTFzb2Z0bWFjX2dldF9uZXR3b3JrX2J5X2Jzc2lkX2xvY2tlZChtYWMsIG1sbWUtPmFkZHIuc2FfZGF0YSk7CiAJCWlmICghbmV0KSB7CiAJCQlwcmludGsoS0VSTl9ERUJVRyBQRlggInd4X3NldF9tbG1lOiB3ZSBzaG91bGQga25vdyB0aGUgbmV0IGhlcmUuLi5cbiIpOwotCQkJcmV0dXJuIC1FSU5WQUw7CisJCQlnb3RvIG91dDsKIAkJfQogCQlyZXR1cm4gaWVlZTgwMjExc29mdG1hY19kZWF1dGhfcmVxKG1hYywgbmV0LCByZWFzb24pOwogCWNhc2UgSVdfTUxNRV9ESVNBU1NPQzoKIAkJaWVlZTgwMjExc29mdG1hY19zZW5kX2Rpc2Fzc29jX3JlcShtYWMsIHJlYXNvbik7Ci0JCXJldHVybiAwOworCQltYWMtPmFzc29jaW5mby5hc3NvY2lhdGVkID0gMDsKKwkJbWFjLT5hc3NvY2luZm8uYXNzb2NpYXRpbmcgPSAwOworCQllcnIgPSAwOworCQlnb3RvIG91dDsKIAlkZWZhdWx0OgotCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisJCWVyciA9IC1FT1BOT1RTVVBQOwogCX0KKworb3V0OgorCW11dGV4X3VubG9jaygmbWFjLT5hc3NvY2luZm8ubXV0ZXgpOworCisJcmV0dXJuIGVycjsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKGllZWU4MDIxMXNvZnRtYWNfd3hfc2V0X21sbWUpOwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvY2lwc29faXB2NC5jIGIvbmV0L2lwdjQvY2lwc29faXB2NC5jCmluZGV4IGE4ZTJlODcuLjY0NjAyMzMgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L2NpcHNvX2lwdjQuYworKysgYi9uZXQvaXB2NC9jaXBzb19pcHY0LmMKQEAgLTQzLDYgKzQzLDcgQEAKICNpbmNsdWRlIDxuZXQvdGNwLmg+CiAjaW5jbHVkZSA8bmV0L25ldGxhYmVsLmg+CiAjaW5jbHVkZSA8bmV0L2NpcHNvX2lwdjQuaD4KKyNpbmNsdWRlIDxhc20vYXRvbWljLmg+CiAjaW5jbHVkZSA8YXNtL2J1Zy5oPgogCiBzdHJ1Y3QgY2lwc29fdjRfZG9taHNoX2VudHJ5IHsKQEAgLTc5LDcgKzgwLDcgQEAKIAl1bnNpZ25lZCBjaGFyICprZXk7CiAJc2l6ZV90IGtleV9sZW47CiAKLQlzdHJ1Y3QgbmV0bGJsX2xzbV9jYWNoZSBsc21fZGF0YTsKKwlzdHJ1Y3QgbmV0bGJsX2xzbV9jYWNoZSAqbHNtX2RhdGE7CiAKIAl1MzIgYWN0aXZpdHk7CiAJc3RydWN0IGxpc3RfaGVhZCBsaXN0OwpAQCAtMTg4LDEzICsxODksMTQgQEAKICAqIEBlbnRyeTogdGhlIGVudHJ5IHRvIGZyZWUKICAqCiAgKiBEZXNjcmlwdGlvbjoKLSAqIFRoaXMgZnVuY3Rpb24gZnJlZXMgdGhlIG1lbW9yeSBhc3NvY2lhdGVkIHdpdGggYSBjYWNoZSBlbnRyeS4KKyAqIFRoaXMgZnVuY3Rpb24gZnJlZXMgdGhlIG1lbW9yeSBhc3NvY2lhdGVkIHdpdGggYSBjYWNoZSBlbnRyeSBpbmNsdWRpbmcgdGhlCisgKiBMU00gY2FjaGUgZGF0YSBpZiB0aGVyZSBhcmUgbm8gbG9uZ2VyIGFueSB1c2VycywgaS5lLiByZWZlcmVuY2UgY291bnQgPT0gMC4KICAqCiAgKi8KIHN0YXRpYyB2b2lkIGNpcHNvX3Y0X2NhY2hlX2VudHJ5X2ZyZWUoc3RydWN0IGNpcHNvX3Y0X21hcF9jYWNoZV9lbnRyeSAqZW50cnkpCiB7Ci0JaWYgKGVudHJ5LT5sc21fZGF0YS5mcmVlKQotCQllbnRyeS0+bHNtX2RhdGEuZnJlZShlbnRyeS0+bHNtX2RhdGEuZGF0YSk7CisJaWYgKGVudHJ5LT5sc21fZGF0YSkKKwkJbmV0bGJsX3NlY2F0dHJfY2FjaGVfZnJlZShlbnRyeS0+bHNtX2RhdGEpOwogCWtmcmVlKGVudHJ5LT5rZXkpOwogCWtmcmVlKGVudHJ5KTsKIH0KQEAgLTMxNSw4ICszMTcsOCBAQAogCQkgICAgZW50cnktPmtleV9sZW4gPT0ga2V5X2xlbiAmJgogCQkgICAgbWVtY21wKGVudHJ5LT5rZXksIGtleSwga2V5X2xlbikgPT0gMCkgewogCQkJZW50cnktPmFjdGl2aXR5ICs9IDE7Ci0JCQlzZWNhdHRyLT5jYWNoZS5mcmVlID0gZW50cnktPmxzbV9kYXRhLmZyZWU7Ci0JCQlzZWNhdHRyLT5jYWNoZS5kYXRhID0gZW50cnktPmxzbV9kYXRhLmRhdGE7CisJCQlhdG9taWNfaW5jKCZlbnRyeS0+bHNtX2RhdGEtPnJlZmNvdW50KTsKKwkJCXNlY2F0dHItPmNhY2hlID0gZW50cnktPmxzbV9kYXRhOwogCQkJaWYgKHByZXZfZW50cnkgPT0gTlVMTCkgewogCQkJCXNwaW5fdW5sb2NrX2JoKCZjaXBzb192NF9jYWNoZVtia3RdLmxvY2spOwogCQkJCXJldHVybiAwOwpAQCAtMzgzLDggKzM4NSw4IEBACiAJbWVtY3B5KGVudHJ5LT5rZXksIGNpcHNvX3B0ciwgY2lwc29fcHRyX2xlbik7CiAJZW50cnktPmtleV9sZW4gPSBjaXBzb19wdHJfbGVuOwogCWVudHJ5LT5oYXNoID0gY2lwc29fdjRfbWFwX2NhY2hlX2hhc2goY2lwc29fcHRyLCBjaXBzb19wdHJfbGVuKTsKLQllbnRyeS0+bHNtX2RhdGEuZnJlZSA9IHNlY2F0dHItPmNhY2hlLmZyZWU7Ci0JZW50cnktPmxzbV9kYXRhLmRhdGEgPSBzZWNhdHRyLT5jYWNoZS5kYXRhOworCWF0b21pY19pbmMoJnNlY2F0dHItPmNhY2hlLT5yZWZjb3VudCk7CisJZW50cnktPmxzbV9kYXRhID0gc2VjYXR0ci0+Y2FjaGU7CiAKIAlia3QgPSBlbnRyeS0+aGFzaCAmIChDSVBTT19WNF9DQUNIRV9CVUNLRVRCSVRTIC0gMSk7CiAJc3Bpbl9sb2NrX2JoKCZjaXBzb192NF9jYWNoZVtia3RdLmxvY2spOwpAQCAtNzcxLDEzICs3NzMsMTUgQEAKIHsKIAlpbnQgY2F0ID0gLTE7CiAJdTMyIGJpdG1hcF9sZW5fYml0cyA9IGJpdG1hcF9sZW4gKiA4OwotCXUzMiBjaXBzb19jYXRfc2l6ZSA9IGRvaV9kZWYtPm1hcC5zdGQtPmNhdC5jaXBzb19zaXplOwotCXUzMiAqY2lwc29fYXJyYXkgPSBkb2lfZGVmLT5tYXAuc3RkLT5jYXQuY2lwc287CisJdTMyIGNpcHNvX2NhdF9zaXplOworCXUzMiAqY2lwc29fYXJyYXk7CiAKIAlzd2l0Y2ggKGRvaV9kZWYtPnR5cGUpIHsKIAljYXNlIENJUFNPX1Y0X01BUF9QQVNTOgogCQlyZXR1cm4gMDsKIAljYXNlIENJUFNPX1Y0X01BUF9TVEQ6CisJCWNpcHNvX2NhdF9zaXplID0gZG9pX2RlZi0+bWFwLnN0ZC0+Y2F0LmNpcHNvX3NpemU7CisJCWNpcHNvX2FycmF5ID0gZG9pX2RlZi0+bWFwLnN0ZC0+Y2F0LmNpcHNvOwogCQlmb3IgKDs7KSB7CiAJCQljYXQgPSBjaXBzb192NF9iaXRtYXBfd2FsayhiaXRtYXAsCiAJCQkJCQkgICBiaXRtYXBfbGVuX2JpdHMsCkBAIC04MjMsMTkgKzgyNywyMSBAQAogCXUzMiBuZXRfc3BvdF9tYXggPSAwOwogCXUzMiBob3N0X2NsZW5fYml0cyA9IGhvc3RfY2F0X2xlbiAqIDg7CiAJdTMyIG5ldF9jbGVuX2JpdHMgPSBuZXRfY2F0X2xlbiAqIDg7Ci0JdTMyIGhvc3RfY2F0X3NpemUgPSBkb2lfZGVmLT5tYXAuc3RkLT5jYXQubG9jYWxfc2l6ZTsKLQl1MzIgKmhvc3RfY2F0X2FycmF5ID0gZG9pX2RlZi0+bWFwLnN0ZC0+Y2F0LmxvY2FsOworCXUzMiBob3N0X2NhdF9zaXplOworCXUzMiAqaG9zdF9jYXRfYXJyYXk7CiAKIAlzd2l0Y2ggKGRvaV9kZWYtPnR5cGUpIHsKIAljYXNlIENJUFNPX1Y0X01BUF9QQVNTOgotCQluZXRfc3BvdF9tYXggPSBob3N0X2NhdF9sZW4gLSAxOwotCQl3aGlsZSAobmV0X3Nwb3RfbWF4ID4gMCAmJiBob3N0X2NhdFtuZXRfc3BvdF9tYXhdID09IDApCisJCW5ldF9zcG90X21heCA9IGhvc3RfY2F0X2xlbjsKKwkJd2hpbGUgKG5ldF9zcG90X21heCA+IDAgJiYgaG9zdF9jYXRbbmV0X3Nwb3RfbWF4IC0gMV0gPT0gMCkKIAkJCW5ldF9zcG90X21heC0tOwogCQlpZiAobmV0X3Nwb3RfbWF4ID4gbmV0X2NhdF9sZW4pCiAJCQlyZXR1cm4gLUVJTlZBTDsKIAkJbWVtY3B5KG5ldF9jYXQsIGhvc3RfY2F0LCBuZXRfc3BvdF9tYXgpOwogCQlyZXR1cm4gbmV0X3Nwb3RfbWF4OwogCWNhc2UgQ0lQU09fVjRfTUFQX1NURDoKKwkJaG9zdF9jYXRfc2l6ZSA9IGRvaV9kZWYtPm1hcC5zdGQtPmNhdC5sb2NhbF9zaXplOworCQlob3N0X2NhdF9hcnJheSA9IGRvaV9kZWYtPm1hcC5zdGQtPmNhdC5sb2NhbDsKIAkJZm9yICg7OykgewogCQkJaG9zdF9zcG90ID0gY2lwc29fdjRfYml0bWFwX3dhbGsoaG9zdF9jYXQsCiAJCQkJCQkJIGhvc3RfY2xlbl9iaXRzLApAQCAtODkxLDggKzg5Nyw4IEBACiAJaW50IG5ldF9zcG90ID0gLTE7CiAJdTMyIG5ldF9jbGVuX2JpdHMgPSBuZXRfY2F0X2xlbiAqIDg7CiAJdTMyIGhvc3RfY2xlbl9iaXRzID0gaG9zdF9jYXRfbGVuICogODsKLQl1MzIgbmV0X2NhdF9zaXplID0gZG9pX2RlZi0+bWFwLnN0ZC0+Y2F0LmNpcHNvX3NpemU7Ci0JdTMyICpuZXRfY2F0X2FycmF5ID0gZG9pX2RlZi0+bWFwLnN0ZC0+Y2F0LmNpcHNvOworCXUzMiBuZXRfY2F0X3NpemU7CisJdTMyICpuZXRfY2F0X2FycmF5OwogCiAJc3dpdGNoIChkb2lfZGVmLT50eXBlKSB7CiAJY2FzZSBDSVBTT19WNF9NQVBfUEFTUzoKQEAgLTkwMSw2ICs5MDcsOCBAQAogCQltZW1jcHkoaG9zdF9jYXQsIG5ldF9jYXQsIG5ldF9jYXRfbGVuKTsKIAkJcmV0dXJuIG5ldF9jYXRfbGVuOwogCWNhc2UgQ0lQU09fVjRfTUFQX1NURDoKKwkJbmV0X2NhdF9zaXplID0gZG9pX2RlZi0+bWFwLnN0ZC0+Y2F0LmNpcHNvX3NpemU7CisJCW5ldF9jYXRfYXJyYXkgPSBkb2lfZGVmLT5tYXAuc3RkLT5jYXQuY2lwc287CiAJCWZvciAoOzspIHsKIAkJCW5ldF9zcG90ID0gY2lwc29fdjRfYml0bWFwX3dhbGsobmV0X2NhdCwKIAkJCQkJCQluZXRfY2xlbl9iaXRzLApAQCAtMTI5OSw3ICsxMzA3LDggQEAKIAogCS8qIFdlIGNhbid0IHVzZSBpcF9vcHRpb25zX2dldCgpIGRpcmVjdGx5IGJlY2F1c2UgaXQgbWFrZXMgYSBjYWxsIHRvCiAJICogaXBfb3B0aW9uc19nZXRfYWxsb2MoKSB3aGljaCBhbGxvY2F0ZXMgbWVtb3J5IHdpdGggR0ZQX0tFUk5FTCBhbmQKLQkgKiB3ZSBjYW4ndCBibG9jayBoZXJlLiAqLworCSAqIHdlIHdvbid0IGFsd2F5cyBoYXZlIENBUF9ORVRfUkFXIGV2ZW4gdGhvdWdoIHdlIF9hbHdheXNfIHdhbnQgdG8KKwkgKiBzZXQgdGhlIElQT1BUX0NJUFNPIG9wdGlvbi4gKi8KIAlvcHRfbGVuID0gKGJ1Zl9sZW4gKyAzKSAmIH4zOwogCW9wdCA9IGt6YWxsb2Moc2l6ZW9mKCpvcHQpICsgb3B0X2xlbiwgR0ZQX0FUT01JQyk7CiAJaWYgKG9wdCA9PSBOVUxMKSB7CkBAIC0xMzA5LDExICsxMzE4LDkgQEAKIAltZW1jcHkob3B0LT5fX2RhdGEsIGJ1ZiwgYnVmX2xlbik7CiAJb3B0LT5vcHRsZW4gPSBvcHRfbGVuOwogCW9wdC0+aXNfZGF0YSA9IDE7CisJb3B0LT5jaXBzbyA9IHNpemVvZihzdHJ1Y3QgaXBoZHIpOwogCWtmcmVlKGJ1Zik7CiAJYnVmID0gTlVMTDsKLQlyZXRfdmFsID0gaXBfb3B0aW9uc19jb21waWxlKG9wdCwgTlVMTCk7Ci0JaWYgKHJldF92YWwgIT0gMCkKLQkJZ290byBzb2NrZXRfc2V0YXR0cl9mYWlsdXJlOwogCiAJc2tfaW5ldCA9IGluZXRfc2soc2spOwogCWlmIChza19pbmV0LT5pc19pY3NrKSB7CmRpZmYgLS1naXQgYS9uZXQvaXB2NC9maWJfZnJvbnRlbmQuYyBiL25ldC9pcHY0L2ZpYl9mcm9udGVuZC5jCmluZGV4IDljMzk5YTcuLmFmMDE5MGQgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L2ZpYl9mcm9udGVuZC5jCisrKyBiL25ldC9pcHY0L2ZpYl9mcm9udGVuZC5jCkBAIC00ODIsOSArNDgyLDcgQEAKIAltZW1zZXQoY2ZnLCAwLCBzaXplb2YoKmNmZykpOwogCiAJcnRtID0gbmxtc2dfZGF0YShubGgpOwotCWNmZy0+ZmNfZmFtaWx5ID0gcnRtLT5ydG1fZmFtaWx5OwogCWNmZy0+ZmNfZHN0X2xlbiA9IHJ0bS0+cnRtX2RzdF9sZW47Ci0JY2ZnLT5mY19zcmNfbGVuID0gcnRtLT5ydG1fc3JjX2xlbjsKIAljZmctPmZjX3RvcyA9IHJ0bS0+cnRtX3RvczsKIAljZmctPmZjX3RhYmxlID0gcnRtLT5ydG1fdGFibGU7CiAJY2ZnLT5mY19wcm90b2NvbCA9IHJ0bS0+cnRtX3Byb3RvY29sOwpAQCAtNTAxLDkgKzQ5OSw2IEBACiAJCWNhc2UgUlRBX0RTVDoKIAkJCWNmZy0+ZmNfZHN0ID0gbmxhX2dldF9iZTMyKGF0dHIpOwogCQkJYnJlYWs7Ci0JCWNhc2UgUlRBX1NSQzoKLQkJCWNmZy0+ZmNfc3JjID0gbmxhX2dldF9iZTMyKGF0dHIpOwotCQkJYnJlYWs7CiAJCWNhc2UgUlRBX09JRjoKIAkJCWNmZy0+ZmNfb2lmID0gbmxhX2dldF91MzIoYXR0cik7CiAJCQlicmVhazsKZGlmZiAtLWdpdCBhL25ldC9pcHY0L2luZXRwZWVyLmMgYi9uZXQvaXB2NC9pbmV0cGVlci5jCmluZGV4IDJiMWE1NGIuLmYwNzJmMzggMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L2luZXRwZWVyLmMKKysrIGIvbmV0L2lwdjQvaW5ldHBlZXIuYwpAQCAtOTQsMTAgKzk0LDggQEAKIGludCBpbmV0X3BlZXJfbWF4dHRsID0gMTAgKiA2MCAqIEhaOwkvKiB1c3VhbCB0aW1lIHRvIGxpdmU6IDEwIG1pbiAqLwogCiBzdGF0aWMgc3RydWN0IGluZXRfcGVlciAqaW5ldF9wZWVyX3VudXNlZF9oZWFkOwotLyogRXhwb3J0ZWQgZm9yIGluZXRfcHV0cGVlciBpbmxpbmUgZnVuY3Rpb24uICAqLwotc3RydWN0IGluZXRfcGVlciAqKmluZXRfcGVlcl91bnVzZWRfdGFpbHAgPSAmaW5ldF9wZWVyX3VudXNlZF9oZWFkOwotREVGSU5FX1NQSU5MT0NLKGluZXRfcGVlcl91bnVzZWRfbG9jayk7Ci0jZGVmaW5lIFBFRVJfTUFYX0NMRUFOVVBfV09SSyAzMAorc3RhdGljIHN0cnVjdCBpbmV0X3BlZXIgKippbmV0X3BlZXJfdW51c2VkX3RhaWxwID0gJmluZXRfcGVlcl91bnVzZWRfaGVhZDsKK3N0YXRpYyBERUZJTkVfU1BJTkxPQ0soaW5ldF9wZWVyX3VudXNlZF9sb2NrKTsKIAogc3RhdGljIHZvaWQgcGVlcl9jaGVja19leHBpcmUodW5zaWduZWQgbG9uZyBkdW1teSk7CiBzdGF0aWMgREVGSU5FX1RJTUVSKHBlZXJfcGVyaW9kaWNfdGltZXIsIHBlZXJfY2hlY2tfZXhwaXJlLCAwLCAwKTsKQEAgLTM0MCw3ICszMzgsOCBAQAogCXNwaW5fbG9ja19iaCgmaW5ldF9wZWVyX3VudXNlZF9sb2NrKTsKIAlwID0gaW5ldF9wZWVyX3VudXNlZF9oZWFkOwogCWlmIChwICE9IE5VTEwpIHsKLQkJaWYgKHRpbWVfYWZ0ZXIocC0+ZHRpbWUgKyB0dGwsIGppZmZpZXMpKSB7CisJCV9fdTMyIGRlbHRhID0gKF9fdTMyKWppZmZpZXMgLSBwLT5kdGltZTsKKwkJaWYgKGRlbHRhIDwgdHRsKSB7CiAJCQkvKiBEbyBub3QgcHJ1bmUgZnJlc2ggZW50cmllcy4gKi8KIAkJCXNwaW5fdW5sb2NrX2JoKCZpbmV0X3BlZXJfdW51c2VkX2xvY2spOwogCQkJcmV0dXJuIC0xOwpAQCAtNDMyLDcgKzQzMSw3IEBACiAvKiBDYWxsZWQgd2l0aCBsb2NhbCBCSCBkaXNhYmxlZC4gKi8KIHN0YXRpYyB2b2lkIHBlZXJfY2hlY2tfZXhwaXJlKHVuc2lnbmVkIGxvbmcgZHVtbXkpCiB7Ci0JaW50IGk7CisJdW5zaWduZWQgbG9uZyBub3cgPSBqaWZmaWVzOwogCWludCB0dGw7CiAKIAlpZiAocGVlcl90b3RhbCA+PSBpbmV0X3BlZXJfdGhyZXNob2xkKQpAQCAtNDQxLDcgKzQ0MCwxMCBAQAogCQl0dGwgPSBpbmV0X3BlZXJfbWF4dHRsCiAJCQkJLSAoaW5ldF9wZWVyX21heHR0bCAtIGluZXRfcGVlcl9taW50dGwpIC8gSFogKgogCQkJCQlwZWVyX3RvdGFsIC8gaW5ldF9wZWVyX3RocmVzaG9sZCAqIEhaOwotCWZvciAoaSA9IDA7IGkgPCBQRUVSX01BWF9DTEVBTlVQX1dPUksgJiYgIWNsZWFudXBfb25jZSh0dGwpOyBpKyspOworCXdoaWxlICghY2xlYW51cF9vbmNlKHR0bCkpIHsKKwkJaWYgKGppZmZpZXMgIT0gbm93KQorCQkJYnJlYWs7CisJfQogCiAJLyogVHJpZ2dlciB0aGUgdGltZXIgYWZ0ZXIgaW5ldF9wZWVyX2djX21pbnRpbWUgLi4gaW5ldF9wZWVyX2djX21heHRpbWUKIAkgKiBpbnRlcnZhbCBkZXBlbmRpbmcgb24gdGhlIHRvdGFsIG51bWJlciBvZiBlbnRyaWVzIChtb3JlIGVudHJpZXMsCkBAIC00NTUsMyArNDU3LDE2IEBACiAJCQkJcGVlcl90b3RhbCAvIGluZXRfcGVlcl90aHJlc2hvbGQgKiBIWjsKIAlhZGRfdGltZXIoJnBlZXJfcGVyaW9kaWNfdGltZXIpOwogfQorCit2b2lkIGluZXRfcHV0cGVlcihzdHJ1Y3QgaW5ldF9wZWVyICpwKQoreworCXNwaW5fbG9ja19iaCgmaW5ldF9wZWVyX3VudXNlZF9sb2NrKTsKKwlpZiAoYXRvbWljX2RlY19hbmRfdGVzdCgmcC0+cmVmY250KSkgeworCQlwLT51bnVzZWRfcHJldnAgPSBpbmV0X3BlZXJfdW51c2VkX3RhaWxwOworCQlwLT51bnVzZWRfbmV4dCA9IE5VTEw7CisJCSppbmV0X3BlZXJfdW51c2VkX3RhaWxwID0gcDsKKwkJaW5ldF9wZWVyX3VudXNlZF90YWlscCA9ICZwLT51bnVzZWRfbmV4dDsKKwkJcC0+ZHRpbWUgPSAoX191MzIpamlmZmllczsKKwl9CisJc3Bpbl91bmxvY2tfYmgoJmluZXRfcGVlcl91bnVzZWRfbG9jayk7Cit9CmRpZmYgLS1naXQgYS9uZXQvaXB2NC9pcF9ncmUuYyBiL25ldC9pcHY0L2lwX2dyZS5jCmluZGV4IGY1ZmJhMDUuLmQ1YjVkZWMgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L2lwX2dyZS5jCisrKyBiL25ldC9pcHY0L2lwX2dyZS5jCkBAIC02MTEsOCArNjExLDggQEAKIAkJICogLSBXaGVuIGRlYWxpbmcgd2l0aCBXQ0NQdjIsIFNraXAgZXh0cmEgNCBieXRlcyBpbiBHUkUgaGVhZGVyCiAJCSAqLwogCQlpZiAoZmxhZ3MgPT0gMCAmJgotCQkgICAgc2tiLT5wcm90b2NvbCA9PSBfX2NvbnN0YW50X2h0b25zKEVUSF9QX1dDQ1ApKSB7Ci0JCQlza2ItPnByb3RvY29sID0gX19jb25zdGFudF9odG9ucyhFVEhfUF9JUCk7CisJCSAgICBza2ItPnByb3RvY29sID09IGh0b25zKEVUSF9QX1dDQ1ApKSB7CisJCQlza2ItPnByb3RvY29sID0gaHRvbnMoRVRIX1BfSVApOwogCQkJaWYgKCgqKGggKyBvZmZzZXQpICYgMHhGMCkgIT0gMHg0MCkgCiAJCQkJb2Zmc2V0ICs9IDQ7CiAJCX0KZGlmZiAtLWdpdCBhL25ldC9pcHY0L2lwX29wdGlvbnMuYyBiL25ldC9pcHY0L2lwX29wdGlvbnMuYwppbmRleCA4ZGFiYmZjLi45ZjAyOTE3IDEwMDY0NAotLS0gYS9uZXQvaXB2NC9pcF9vcHRpb25zLmMKKysrIGIvbmV0L2lwdjQvaXBfb3B0aW9ucy5jCkBAIC00NDMsNyArNDQzLDcgQEAKIAkJCQlvcHQtPnJvdXRlcl9hbGVydCA9IG9wdHB0ciAtIGlwaDsKIAkJCWJyZWFrOwogCQkgICAgICBjYXNlIElQT1BUX0NJUFNPOgotCQkgICAgICAgIGlmIChvcHQtPmNpcHNvKSB7CisJCQlpZiAoKCFza2IgJiYgIWNhcGFibGUoQ0FQX05FVF9SQVcpKSB8fCBvcHQtPmNpcHNvKSB7CiAJCQkJcHBfcHRyID0gb3B0cHRyOwogCQkJCWdvdG8gZXJyb3I7CiAJCQl9CmRpZmYgLS1naXQgYS9uZXQvaXB2NC9pcGNvbmZpZy5jIGIvbmV0L2lwdjQvaXBjb25maWcuYwppbmRleCBmOGNlODQ3Li45NTVhMDdhIDEwMDY0NAotLS0gYS9uZXQvaXB2NC9pcGNvbmZpZy5jCisrKyBiL25ldC9pcHY0L2lwY29uZmlnLmMKQEAgLTQyMCw3ICs0MjAsNyBAQAogewogCXN0cnVjdCBhcnBoZHIgKnJhcnA7CiAJdW5zaWduZWQgY2hhciAqcmFycF9wdHI7Ci0JdW5zaWduZWQgbG9uZyBzaXAsIHRpcDsKKwl1MzIgc2lwLCB0aXA7CiAJdW5zaWduZWQgY2hhciAqc2hhLCAqdGhhOwkJLyogcyBmb3IgInNvdXJjZSIsIHQgZm9yICJ0YXJnZXQiICovCiAJc3RydWN0IGljX2RldmljZSAqZDsKIApkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvaXB2cy9pcF92c19mdHAuYyBiL25ldC9pcHY0L2lwdnMvaXBfdnNfZnRwLmMKaW5kZXggNmQzOThmMS4uNjg3YzFkZSAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvaXB2cy9pcF92c19mdHAuYworKysgYi9uZXQvaXB2NC9pcHZzL2lwX3ZzX2Z0cC5jCkBAIC0yMDAsNyArMjAwLDcgQEAKIAkJZnJvbSA9IG5fY3AtPnZhZGRyOwogCQlwb3J0ID0gbl9jcC0+dnBvcnQ7CiAJCXNwcmludGYoYnVmLCIlZCwlZCwlZCwlZCwlZCwlZCIsIE5JUFFVQUQoZnJvbSksCi0JCQludG9ocyhwb3J0KSYyNTUsIChudG9ocyhwb3J0KT4+OCkmMjU1KTsKKwkJCShudG9ocyhwb3J0KT4+OCkmMjU1LCBudG9ocyhwb3J0KSYyNTUpOwogCQlidWZfbGVuID0gc3RybGVuKGJ1Zik7CiAKIAkJLyoKZGlmZiAtLWdpdCBhL25ldC9pcHY0L2lwdnMvaXBfdnNfcHJvdG9fdGNwLmMgYi9uZXQvaXB2NC9pcHZzL2lwX3ZzX3Byb3RvX3RjcC5jCmluZGV4IGJmZTc3OWUuLjZmZjA1YzMgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L2lwdnMvaXBfdnNfcHJvdG9fdGNwLmMKKysrIGIvbmV0L2lwdjQvaXB2cy9pcF92c19wcm90b190Y3AuYwpAQCAtMTE3LDcgKzExNyw3IEBACiB7CiAJdGNwaC0+Y2hlY2sgPQogCQlpcF92c19jaGVja19kaWZmKH5vbGRpcCwgbmV3aXAsCi0JCQkJIGlwX3ZzX2NoZWNrX2RpZmYob2xkcG9ydCBeIGh0b25sKDB4RkZGRiksCisJCQkJIGlwX3ZzX2NoZWNrX2RpZmYob2xkcG9ydCBeIGh0b25zKDB4RkZGRiksCiAJCQkJCQkgIG5ld3BvcnQsIHRjcGgtPmNoZWNrKSk7CiB9CiAKZGlmZiAtLWdpdCBhL25ldC9pcHY0L2lwdnMvaXBfdnNfcHJvdG9fdWRwLmMgYi9uZXQvaXB2NC9pcHZzL2lwX3ZzX3Byb3RvX3VkcC5jCmluZGV4IDU0YWE3NjAuLjY5MWM4YjYgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L2lwdnMvaXBfdnNfcHJvdG9fdWRwLmMKKysrIGIvbmV0L2lwdjQvaXB2cy9pcF92c19wcm90b191ZHAuYwpAQCAtMTIyLDEwICsxMjIsMTAgQEAKIHsKIAl1aGRyLT5jaGVjayA9CiAJCWlwX3ZzX2NoZWNrX2RpZmYofm9sZGlwLCBuZXdpcCwKLQkJCQkgaXBfdnNfY2hlY2tfZGlmZihvbGRwb3J0IF4gaHRvbmwoMHhGRkZGKSwKKwkJCQkgaXBfdnNfY2hlY2tfZGlmZihvbGRwb3J0IF4gaHRvbnMoMHhGRkZGKSwKIAkJCQkJCSAgbmV3cG9ydCwgdWhkci0+Y2hlY2spKTsKIAlpZiAoIXVoZHItPmNoZWNrKQotCQl1aGRyLT5jaGVjayA9IGh0b25sKDB4RkZGRik7CisJCXVoZHItPmNoZWNrID0gLTE7CiB9CiAKIHN0YXRpYyBpbnQKQEAgLTE3Myw3ICsxNzMsNyBAQAogCQkJCQkJY3AtPnByb3RvY29sLAogCQkJCQkJKCpwc2tiKS0+Y3N1bSk7CiAJCWlmICh1ZHBoLT5jaGVjayA9PSAwKQotCQkJdWRwaC0+Y2hlY2sgPSBodG9ubCgweEZGRkYpOworCQkJdWRwaC0+Y2hlY2sgPSAtMTsKIAkJSVBfVlNfREJHKDExLCAiTy1wa3Q6ICVzIE8tY3N1bT0lZCAoKyV6ZClcbiIsCiAJCQkgIHBwLT5uYW1lLCB1ZHBoLT5jaGVjaywKIAkJCSAgKGNoYXIqKSYodWRwaC0+Y2hlY2spIC0gKGNoYXIqKXVkcGgpOwpAQCAtMjI4LDcgKzIyOCw3IEBACiAJCQkJCQljcC0+cHJvdG9jb2wsCiAJCQkJCQkoKnBza2IpLT5jc3VtKTsKIAkJaWYgKHVkcGgtPmNoZWNrID09IDApCi0JCQl1ZHBoLT5jaGVjayA9IDB4RkZGRjsKKwkJCXVkcGgtPmNoZWNrID0gLTE7CiAJCSgqcHNrYiktPmlwX3N1bW1lZCA9IENIRUNLU1VNX1VOTkVDRVNTQVJZOwogCX0KIAlyZXR1cm4gMTsKZGlmZiAtLWdpdCBhL25ldC9pcHY0L25ldGZpbHRlci9hcnBfdGFibGVzLmMgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvYXJwX3RhYmxlcy5jCmluZGV4IDE3ZTFhNjguLjQxM2MyZDBhIDEwMDY0NAotLS0gYS9uZXQvaXB2NC9uZXRmaWx0ZXIvYXJwX3RhYmxlcy5jCisrKyBiL25ldC9pcHY0L25ldGZpbHRlci9hcnBfdGFibGVzLmMKQEAgLTQ2Niw3ICs0NjYsMTMgQEAKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCisJaWYgKGUtPnRhcmdldF9vZmZzZXQgKyBzaXplb2Yoc3RydWN0IGFycHRfZW50cnlfdGFyZ2V0KSA+IGUtPm5leHRfb2Zmc2V0KQorCQlyZXR1cm4gLUVJTlZBTDsKKwogCXQgPSBhcnB0X2dldF90YXJnZXQoZSk7CisJaWYgKGUtPnRhcmdldF9vZmZzZXQgKyB0LT51LnRhcmdldF9zaXplID4gZS0+bmV4dF9vZmZzZXQpCisJCXJldHVybiAtRUlOVkFMOworCiAJdGFyZ2V0ID0gdHJ5X3RoZW5fcmVxdWVzdF9tb2R1bGUoeHRfZmluZF90YXJnZXQoTkZfQVJQLCB0LT51LnVzZXIubmFtZSwKIAkJCQkJCQl0LT51LnVzZXIucmV2aXNpb24pLAogCQkJCQkgImFycHRfJXMiLCB0LT51LnVzZXIubmFtZSk7CkBAIC02MjEsMjAgKzYyNywxOCBAQAogCQl9CiAJfQogCi0JaWYgKCFtYXJrX3NvdXJjZV9jaGFpbnMobmV3aW5mbywgdmFsaWRfaG9va3MsIGVudHJ5MCkpIHsKLQkJZHVwcmludGYoIkxvb3BpbmcgaG9va1xuIik7Ci0JCXJldHVybiAtRUxPT1A7Ci0JfQotCiAJLyogRmluYWxseSwgZWFjaCBzYW5pdHkgY2hlY2sgbXVzdCBwYXNzICovCiAJaSA9IDA7CiAJcmV0ID0gQVJQVF9FTlRSWV9JVEVSQVRFKGVudHJ5MCwgbmV3aW5mby0+c2l6ZSwKIAkJCQkgY2hlY2tfZW50cnksIG5hbWUsIHNpemUsICZpKTsKIAotCWlmIChyZXQgIT0gMCkgewotCQlBUlBUX0VOVFJZX0lURVJBVEUoZW50cnkwLCBuZXdpbmZvLT5zaXplLAotCQkJCSAgIGNsZWFudXBfZW50cnksICZpKTsKLQkJcmV0dXJuIHJldDsKKwlpZiAocmV0ICE9IDApCisJCWdvdG8gY2xlYW51cDsKKworCXJldCA9IC1FTE9PUDsKKwlpZiAoIW1hcmtfc291cmNlX2NoYWlucyhuZXdpbmZvLCB2YWxpZF9ob29rcywgZW50cnkwKSkgeworCQlkdXByaW50ZigiTG9vcGluZyBob29rXG4iKTsKKwkJZ290byBjbGVhbnVwOwogCX0KIAogCS8qIEFuZCBvbmUgY29weSBmb3IgZXZlcnkgb3RoZXIgQ1BVICovCkBAIC02NDMsNiArNjQ3LDkgQEAKIAkJCW1lbWNweShuZXdpbmZvLT5lbnRyaWVzW2ldLCBlbnRyeTAsIG5ld2luZm8tPnNpemUpOwogCX0KIAorCXJldHVybiAwOworY2xlYW51cDoKKwlBUlBUX0VOVFJZX0lURVJBVEUoZW50cnkwLCBuZXdpbmZvLT5zaXplLCBjbGVhbnVwX2VudHJ5LCAmaSk7CiAJcmV0dXJuIHJldDsKIH0KIApAQCAtMTE5Niw2ICsxMjAzLDggQEAKIHN0YXRpYyB2b2lkIF9fZXhpdCBhcnBfdGFibGVzX2Zpbmkodm9pZCkKIHsKIAluZl91bnJlZ2lzdGVyX3NvY2tvcHQoJmFycHRfc29ja29wdHMpOworCXh0X3VucmVnaXN0ZXJfdGFyZ2V0KCZhcnB0X2Vycm9yX3RhcmdldCk7CisJeHRfdW5yZWdpc3Rlcl90YXJnZXQoJmFycHRfc3RhbmRhcmRfdGFyZ2V0KTsKIAl4dF9wcm90b19maW5pKE5GX0FSUCk7CiB9CiAKZGlmZiAtLWdpdCBhL25ldC9pcHY0L25ldGZpbHRlci9pcF9jb25udHJhY2tfbmV0bGluay5jIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwX2Nvbm50cmFja19uZXRsaW5rLmMKaW5kZXggNTNiNmRmZi4uMjYyZDBkNCAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwX2Nvbm50cmFja19uZXRsaW5rLmMKKysrIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwX2Nvbm50cmFja19uZXRsaW5rLmMKQEAgLTQ0LDEzICs0NCw2IEBACiAKIHN0YXRpYyBjaGFyIF9faW5pdGRhdGEgdmVyc2lvbltdID0gIjAuOTAiOwogCi0jaWYgMAotI2RlZmluZSBERUJVR1AgcHJpbnRrCi0jZWxzZQotI2RlZmluZSBERUJVR1AoZm9ybWF0LCBhcmdzLi4uKQotI2VuZGlmCi0KLQogc3RhdGljIGlubGluZSBpbnQKIGN0bmV0bGlua19kdW1wX3R1cGxlc19wcm90byhzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCAKIAkJCSAgICBjb25zdCBzdHJ1Y3QgaXBfY29ubnRyYWNrX3R1cGxlICp0dXBsZSwKQEAgLTM5OCw3ICszOTEsNiBAQAogCiBzdGF0aWMgaW50IGN0bmV0bGlua19kb25lKHN0cnVjdCBuZXRsaW5rX2NhbGxiYWNrICpjYikKIHsKLQlERUJVR1AoImVudGVyZWQgJXNcbiIsIF9fRlVOQ1RJT05fXyk7CiAJaWYgKGNiLT5hcmdzWzFdKQogCQlpcF9jb25udHJhY2tfcHV0KChzdHJ1Y3QgaXBfY29ubnRyYWNrICopY2ItPmFyZ3NbMV0pOwogCXJldHVybiAwOwpAQCAtNDExLDkgKzQwMyw2IEBACiAJc3RydWN0IGlwX2Nvbm50cmFja190dXBsZV9oYXNoICpoOwogCXN0cnVjdCBsaXN0X2hlYWQgKmk7CiAKLQlERUJVR1AoImVudGVyZWQgJXMsIGxhc3QgYnVja2V0PSVsdSBpZD0ldVxuIiwgX19GVU5DVElPTl9fLCAKLQkJCWNiLT5hcmdzWzBdLCAqaWQpOwotCiAJcmVhZF9sb2NrX2JoKCZpcF9jb25udHJhY2tfbG9jayk7CiAJbGFzdCA9IChzdHJ1Y3QgaXBfY29ubnRyYWNrICopY2ItPmFyZ3NbMV07CiAJZm9yICg7IGNiLT5hcmdzWzBdIDwgaXBfY29ubnRyYWNrX2h0YWJsZV9zaXplOyBjYi0+YXJnc1swXSsrKSB7CkBAIC00NTIsNyArNDQxLDYgQEAKIAlpZiAobGFzdCkKIAkJaXBfY29ubnRyYWNrX3B1dChsYXN0KTsKIAotCURFQlVHUCgibGVhdmluZywgbGFzdCBidWNrZXQ9JWx1IGlkPSV1XG4iLCBjYi0+YXJnc1swXSwgKmlkKTsKIAlyZXR1cm4gc2tiLT5sZW47CiB9CiAKQEAgLTQ2Niw4ICs0NTQsNiBAQAogewogCXN0cnVjdCBuZmF0dHIgKnRiW0NUQV9JUF9NQVhdOwogCi0JREVCVUdQKCJlbnRlcmVkICVzXG4iLCBfX0ZVTkNUSU9OX18pOwotCiAJbmZhdHRyX3BhcnNlX25lc3RlZCh0YiwgQ1RBX0lQX01BWCwgYXR0cik7CiAKIAlpZiAobmZhdHRyX2JhZF9zaXplKHRiLCBDVEFfSVBfTUFYLCBjdGFfbWluX2lwKSkKQEAgLTQ4MSw4ICs0NjcsNiBAQAogCQlyZXR1cm4gLUVJTlZBTDsKIAl0dXBsZS0+ZHN0LmlwID0gKihfX2JlMzIgKilORkFfREFUQSh0YltDVEFfSVBfVjRfRFNULTFdKTsKIAotCURFQlVHUCgibGVhdmluZ1xuIik7Ci0KIAlyZXR1cm4gMDsKIH0KIApAQCAtNTAzLDggKzQ4Nyw2IEBACiAJc3RydWN0IGlwX2Nvbm50cmFja19wcm90b2NvbCAqcHJvdG87CiAJaW50IHJldCA9IDA7CiAKLQlERUJVR1AoImVudGVyZWQgJXNcbiIsIF9fRlVOQ1RJT05fXyk7Ci0KIAluZmF0dHJfcGFyc2VfbmVzdGVkKHRiLCBDVEFfUFJPVE9fTUFYLCBhdHRyKTsKIAogCWlmIChuZmF0dHJfYmFkX3NpemUodGIsIENUQV9QUk9UT19NQVgsIGN0YV9taW5fcHJvdG8pKQpAQCAtNTMxLDggKzUxMyw2IEBACiAJc3RydWN0IG5mYXR0ciAqdGJbQ1RBX1RVUExFX01BWF07CiAJaW50IGVycjsKIAotCURFQlVHUCgiZW50ZXJlZCAlc1xuIiwgX19GVU5DVElPTl9fKTsKLQogCW1lbXNldCh0dXBsZSwgMCwgc2l6ZW9mKCp0dXBsZSkpOwogCiAJbmZhdHRyX3BhcnNlX25lc3RlZCh0YiwgQ1RBX1RVUExFX01BWCwgY2RhW3R5cGUtMV0pOwpAQCAtNTU3LDEwICs1MzcsNiBAQAogCWVsc2UKIAkJdHVwbGUtPmRzdC5kaXIgPSBJUF9DVF9ESVJfT1JJR0lOQUw7CiAKLQlEVU1QX1RVUExFKHR1cGxlKTsKLQotCURFQlVHUCgibGVhdmluZ1xuIik7Ci0KIAlyZXR1cm4gMDsKIH0KIApAQCAtNTc3LDggKzU1Myw2IEBACiAJc3RydWN0IG5mYXR0ciAqdGJbQ1RBX1BST1RPTkFUX01BWF07CiAJc3RydWN0IGlwX25hdF9wcm90b2NvbCAqbnB0OwogCi0JREVCVUdQKCJlbnRlcmVkICVzXG4iLCBfX0ZVTkNUSU9OX18pOwotCiAJbmZhdHRyX3BhcnNlX25lc3RlZCh0YiwgQ1RBX1BST1RPTkFUX01BWCwgYXR0cik7CiAKIAlpZiAobmZhdHRyX2JhZF9zaXplKHRiLCBDVEFfUFJPVE9OQVRfTUFYLCBjdGFfbWluX3Byb3RvbmF0KSkKQEAgLTU5Nyw3ICs1NzEsNiBAQAogCiAJaXBfbmF0X3Byb3RvX3B1dChucHQpOwogCi0JREVCVUdQKCJsZWF2aW5nXG4iKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtNjEzLDggKzU4Niw2IEBACiAJc3RydWN0IG5mYXR0ciAqdGJbQ1RBX05BVF9NQVhdOwogCWludCBlcnI7CiAKLQlERUJVR1AoImVudGVyZWQgJXNcbiIsIF9fRlVOQ1RJT05fXyk7Ci0KIAltZW1zZXQocmFuZ2UsIDAsIHNpemVvZigqcmFuZ2UpKTsKIAkKIAluZmF0dHJfcGFyc2VfbmVzdGVkKHRiLCBDVEFfTkFUX01BWCwgbmF0KTsKQEAgLTY0MCw3ICs2MTEsNiBAQAogCWlmIChlcnIgPCAwKQogCQlyZXR1cm4gZXJyOwogCi0JREVCVUdQKCJsZWF2aW5nXG4iKTsKIAlyZXR1cm4gMDsKIH0KICNlbmRpZgpAQCAtNjUwLDggKzYyMCw2IEBACiB7CiAJc3RydWN0IG5mYXR0ciAqdGJbQ1RBX0hFTFBfTUFYXTsKIAotCURFQlVHUCgiZW50ZXJlZCAlc1xuIiwgX19GVU5DVElPTl9fKTsKLQogCW5mYXR0cl9wYXJzZV9uZXN0ZWQodGIsIENUQV9IRUxQX01BWCwgYXR0cik7CiAKIAlpZiAoIXRiW0NUQV9IRUxQX05BTUUtMV0pCkBAIC02NzksOCArNjQ3LDYgQEAKIAlzdHJ1Y3QgaXBfY29ubnRyYWNrICpjdDsKIAlpbnQgZXJyID0gMDsKIAotCURFQlVHUCgiZW50ZXJlZCAlc1xuIiwgX19GVU5DVElPTl9fKTsKLQogCWlmIChuZmF0dHJfYmFkX3NpemUoY2RhLCBDVEFfTUFYLCBjdGFfbWluKSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKQEAgLTY5OCwxMCArNjY0LDggQEAKIAkJcmV0dXJuIGVycjsKIAogCWggPSBpcF9jb25udHJhY2tfZmluZF9nZXQoJnR1cGxlLCBOVUxMKTsKLQlpZiAoIWgpIHsKLQkJREVCVUdQKCJ0dXBsZSBub3QgZm91bmQgaW4gY29ubnRyYWNrIGhhc2hcbiIpOworCWlmICghaCkKIAkJcmV0dXJuIC1FTk9FTlQ7Ci0JfQogCiAJY3QgPSB0dXBsZWhhc2hfdG9fY3RyYWNrKGgpOwogCQpAQCAtNzE2LDcgKzY4MCw2IEBACiAJCWN0LT50aW1lb3V0LmZ1bmN0aW9uKCh1bnNpZ25lZCBsb25nKWN0KTsKIAogCWlwX2Nvbm50cmFja19wdXQoY3QpOwotCURFQlVHUCgibGVhdmluZ1xuIik7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTczMSw4ICs2OTQsNiBAQAogCXN0cnVjdCBza19idWZmICpza2IyID0gTlVMTDsKIAlpbnQgZXJyID0gMDsKIAotCURFQlVHUCgiZW50ZXJlZCAlc1xuIiwgX19GVU5DVElPTl9fKTsKLQogCWlmIChubGgtPm5sbXNnX2ZsYWdzICYgTkxNX0ZfRFVNUCkgewogCQlzdHJ1Y3QgbmZnZW5tc2cgKm1zZyA9IE5MTVNHX0RBVEEobmxoKTsKIAkJdTMyIHJsZW47CkBAIC03NzAsMTEgKzczMSw5IEBACiAJCXJldHVybiBlcnI7CiAKIAloID0gaXBfY29ubnRyYWNrX2ZpbmRfZ2V0KCZ0dXBsZSwgTlVMTCk7Ci0JaWYgKCFoKSB7Ci0JCURFQlVHUCgidHVwbGUgbm90IGZvdW5kIGluIGNvbm50cmFjayBoYXNoIik7CisJaWYgKCFoKQogCQlyZXR1cm4gLUVOT0VOVDsKLQl9Ci0JREVCVUdQKCJ0dXBsZSBmb3VuZFxuIik7CisKIAljdCA9IHR1cGxlaGFzaF90b19jdHJhY2soaCk7CiAKIAllcnIgPSAtRU5PTUVNOwpAQCAtNzk1LDcgKzc1NCw2IEBACiAJaWYgKGVyciA8IDApCiAJCWdvdG8gb3V0OwogCi0JREVCVUdQKCJsZWF2aW5nXG4iKTsKIAlyZXR1cm4gMDsKIAogZnJlZToKQEAgLTg2Niw4ICs4MjQsNiBAQAogCWNoYXIgKmhlbHBuYW1lOwogCWludCBlcnI7CiAKLQlERUJVR1AoImVudGVyZWQgJXNcbiIsIF9fRlVOQ1RJT05fXyk7Ci0KIAkvKiBkb24ndCBjaGFuZ2UgaGVscGVyIG9mIHNpYmxpbmcgY29ubmVjdGlvbnMgKi8KIAlpZiAoY3QtPm1hc3RlcikKIAkJcmV0dXJuIC1FSU5WQUw7CkBAIC05MzgsOCArODk0LDYgQEAKIHsKIAlpbnQgZXJyOwogCi0JREVCVUdQKCJlbnRlcmVkICVzXG4iLCBfX0ZVTkNUSU9OX18pOwotCiAJaWYgKGNkYVtDVEFfSEVMUC0xXSkgewogCQllcnIgPSBjdG5ldGxpbmtfY2hhbmdlX2hlbHBlcihjdCwgY2RhKTsKIAkJaWYgKGVyciA8IDApCkBAIC05NjksNyArOTIzLDYgQEAKIAkJY3QtPm1hcmsgPSBudG9obCgqKF9fYmUzMiAqKU5GQV9EQVRBKGNkYVtDVEFfTUFSSy0xXSkpOwogI2VuZGlmCiAKLQlERUJVR1AoImFsbCBkb25lXG4iKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtOTgxLDggKzkzNCw2IEBACiAJc3RydWN0IGlwX2Nvbm50cmFjayAqY3Q7CiAJaW50IGVyciA9IC1FSU5WQUw7CiAKLQlERUJVR1AoImVudGVyZWQgJXNcbiIsIF9fRlVOQ1RJT05fXyk7Ci0KIAljdCA9IGlwX2Nvbm50cmFja19hbGxvYyhvdHVwbGUsIHJ0dXBsZSk7CiAJaWYgKGN0ID09IE5VTEwgfHwgSVNfRVJSKGN0KSkKIAkJcmV0dXJuIC1FTk9NRU07CQpAQCAtMTAxNyw3ICs5NjgsNiBAQAogCWlmIChjdC0+aGVscGVyKQogCQlpcF9jb25udHJhY2tfaGVscGVyX3B1dChjdC0+aGVscGVyKTsKIAotCURFQlVHUCgiY29ubnRyYWNrIHdpdGggaWQgJXUgaW5zZXJ0ZWRcbiIsIGN0LT5pZCk7CiAJcmV0dXJuIDA7CiAKIGVycjoJCkBAIC0xMDMzLDggKzk4Myw2IEBACiAJc3RydWN0IGlwX2Nvbm50cmFja190dXBsZV9oYXNoICpoID0gTlVMTDsKIAlpbnQgZXJyID0gMDsKIAotCURFQlVHUCgiZW50ZXJlZCAlc1xuIiwgX19GVU5DVElPTl9fKTsKLQogCWlmIChuZmF0dHJfYmFkX3NpemUoY2RhLCBDVEFfTUFYLCBjdGFfbWluKSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKQEAgLTEwNTgsNyArMTAwNiw2IEBACiAKIAlpZiAoaCA9PSBOVUxMKSB7CiAJCXdyaXRlX3VubG9ja19iaCgmaXBfY29ubnRyYWNrX2xvY2spOwotCQlERUJVR1AoIm5vIHN1Y2ggY29ubnRyYWNrLCBjcmVhdGUgbmV3XG4iKTsKIAkJZXJyID0gLUVOT0VOVDsKIAkJaWYgKG5saC0+bmxtc2dfZmxhZ3MgJiBOTE1fRl9DUkVBVEUpCiAJCQllcnIgPSBjdG5ldGxpbmtfY3JlYXRlX2Nvbm50cmFjayhjZGEsICZvdHVwbGUsICZydHVwbGUpOwpAQCAtMTA3NCw3ICsxMDIxLDYgQEAKIAogCS8qIFdlIG1hbmlwdWxhdGUgdGhlIGNvbm50cmFjayBpbnNpZGUgdGhlIGdsb2JhbCBjb25udHJhY2sgdGFibGUgbG9jaywKIAkgKiBzbyB0aGVyZSdzIG5vIG5lZWQgdG8gaW5jcmVhc2UgdGhlIHJlZmNvdW50ICovCi0JREVCVUdQKCJjb25udHJhY2sgZm91bmRcbiIpOwogCWVyciA9IC1FRVhJU1Q7CiAJaWYgKCEobmxoLT5ubG1zZ19mbGFncyAmIE5MTV9GX0VYQ0wpKQogCQllcnIgPSBjdG5ldGxpbmtfY2hhbmdlX2Nvbm50cmFjayh0dXBsZWhhc2hfdG9fY3RyYWNrKGgpLCBjZGEpOwpAQCAtMTI0OSw4ICsxMTk1LDYgQEAKIAlzdHJ1Y3QgbGlzdF9oZWFkICppOwogCXVfaW50MzJfdCAqaWQgPSAodV9pbnQzMl90ICopICZjYi0+YXJnc1swXTsKIAotCURFQlVHUCgiZW50ZXJlZCAlcywgbGFzdCBpZD0lbGx1XG4iLCBfX0ZVTkNUSU9OX18sICppZCk7Ci0KIAlyZWFkX2xvY2tfYmgoJmlwX2Nvbm50cmFja19sb2NrKTsKIAlsaXN0X2Zvcl9lYWNoX3ByZXYoaSwgJmlwX2Nvbm50cmFja19leHBlY3RfbGlzdCkgewogCQlleHAgPSAoc3RydWN0IGlwX2Nvbm50cmFja19leHBlY3QgKikgaTsKQEAgLTEyNjYsOCArMTIxMCw2IEBACiBvdXQ6CQogCXJlYWRfdW5sb2NrX2JoKCZpcF9jb25udHJhY2tfbG9jayk7CiAKLQlERUJVR1AoImxlYXZpbmcsIGxhc3QgaWQ9JWxsdVxuIiwgKmlkKTsKLQogCXJldHVybiBza2ItPmxlbjsKIH0KIApAQCAtMTI4NSw4ICsxMjI3LDYgQEAKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiMjsKIAlpbnQgZXJyID0gMDsKIAotCURFQlVHUCgiZW50ZXJlZCAlc1xuIiwgX19GVU5DVElPTl9fKTsKLQogCWlmIChuZmF0dHJfYmFkX3NpemUoY2RhLCBDVEFfRVhQRUNUX01BWCwgY3RhX21pbl9leHApKQogCQlyZXR1cm4gLUVJTlZBTDsKIApAQCAtMTQzNyw4ICsxMzc3LDYgQEAKIAlzdHJ1Y3QgaXBfY29ubnRyYWNrICpjdDsKIAlpbnQgZXJyID0gMDsKIAotCURFQlVHUCgiZW50ZXJlZCAlc1xuIiwgX19GVU5DVElPTl9fKTsKLQogCS8qIGNhbGxlciBndWFyYW50ZWVzIHRoYXQgdGhvc2UgdGhyZWUgQ1RBX0VYUEVDVF8qIGV4aXN0ICovCiAJZXJyID0gY3RuZXRsaW5rX3BhcnNlX3R1cGxlKGNkYSwgJnR1cGxlLCBDVEFfRVhQRUNUX1RVUExFKTsKIAlpZiAoZXJyIDwgMCkKQEAgLTE0OTAsOCArMTQyOCw2IEBACiAJc3RydWN0IGlwX2Nvbm50cmFja19leHBlY3QgKmV4cDsKIAlpbnQgZXJyID0gMDsKIAotCURFQlVHUCgiZW50ZXJlZCAlc1xuIiwgX19GVU5DVElPTl9fKTsJCi0KIAlpZiAobmZhdHRyX2JhZF9zaXplKGNkYSwgQ1RBX0VYUEVDVF9NQVgsIGN0YV9taW5fZXhwKSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKQEAgLTE1MjAsOCArMTQ1Niw2IEBACiAJCWVyciA9IGN0bmV0bGlua19jaGFuZ2VfZXhwZWN0KGV4cCwgY2RhKTsKIAl3cml0ZV91bmxvY2tfYmgoJmlwX2Nvbm50cmFja19sb2NrKTsKIAotCURFQlVHUCgibGVhdmluZ1xuIik7Ci0JCiAJcmV0dXJuIGVycjsKIH0KIApkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwX3F1ZXVlLmMgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvaXBfcXVldWUuYwppbmRleCA3ZWRhZDc5Li45NzU1NmNjIDEwMDY0NAotLS0gYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXBfcXVldWUuYworKysgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvaXBfcXVldWUuYwpAQCAtMzUxLDkgKzM1MSwxMCBAQAogCWlmICh2LT5kYXRhX2xlbiA8IHNpemVvZigqdXNlcl9pcGgpKQogCQlyZXR1cm4gMDsKIAlkaWZmID0gdi0+ZGF0YV9sZW4gLSBlLT5za2ItPmxlbjsKLQlpZiAoZGlmZiA8IDApCi0JCXNrYl90cmltKGUtPnNrYiwgdi0+ZGF0YV9sZW4pOwotCWVsc2UgaWYgKGRpZmYgPiAwKSB7CisJaWYgKGRpZmYgPCAwKSB7CisJCWlmIChwc2tiX3RyaW0oZS0+c2tiLCB2LT5kYXRhX2xlbikpCisJCQlyZXR1cm4gLUVOT01FTTsKKwl9IGVsc2UgaWYgKGRpZmYgPiAwKSB7CiAJCWlmICh2LT5kYXRhX2xlbiA+IDB4RkZGRikKIAkJCXJldHVybiAtRUlOVkFMOwogCQlpZiAoZGlmZiA+IHNrYl90YWlscm9vbShlLT5za2IpKSB7CmRpZmYgLS1naXQgYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXBfdGFibGVzLmMgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvaXBfdGFibGVzLmMKaW5kZXggNzhhNDRiMC4uOGE0NTU0MyAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwX3RhYmxlcy5jCisrKyBiL25ldC9pcHY0L25ldGZpbHRlci9pcF90YWJsZXMuYwpAQCAtNTQ3LDEyICs1NDcsMTggQEAKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCisJaWYgKGUtPnRhcmdldF9vZmZzZXQgKyBzaXplb2Yoc3RydWN0IGlwdF9lbnRyeV90YXJnZXQpID4gZS0+bmV4dF9vZmZzZXQpCisJCXJldHVybiAtRUlOVkFMOworCiAJaiA9IDA7CiAJcmV0ID0gSVBUX01BVENIX0lURVJBVEUoZSwgY2hlY2tfbWF0Y2gsIG5hbWUsICZlLT5pcCwgZS0+Y29tZWZyb20sICZqKTsKIAlpZiAocmV0ICE9IDApCiAJCWdvdG8gY2xlYW51cF9tYXRjaGVzOwogCiAJdCA9IGlwdF9nZXRfdGFyZ2V0KGUpOworCXJldCA9IC1FSU5WQUw7CisJaWYgKGUtPnRhcmdldF9vZmZzZXQgKyB0LT51LnRhcmdldF9zaXplID4gZS0+bmV4dF9vZmZzZXQpCisJCQlnb3RvIGNsZWFudXBfbWF0Y2hlczsKIAl0YXJnZXQgPSB0cnlfdGhlbl9yZXF1ZXN0X21vZHVsZSh4dF9maW5kX3RhcmdldChBRl9JTkVULAogCQkJCQkJICAgICB0LT51LnVzZXIubmFtZSwKIAkJCQkJCSAgICAgdC0+dS51c2VyLnJldmlzaW9uKSwKQEAgLTcxMiwxOSArNzE4LDE3IEBACiAJCX0KIAl9CiAKLQlpZiAoIW1hcmtfc291cmNlX2NoYWlucyhuZXdpbmZvLCB2YWxpZF9ob29rcywgZW50cnkwKSkKLQkJcmV0dXJuIC1FTE9PUDsKLQogCS8qIEZpbmFsbHksIGVhY2ggc2FuaXR5IGNoZWNrIG11c3QgcGFzcyAqLwogCWkgPSAwOwogCXJldCA9IElQVF9FTlRSWV9JVEVSQVRFKGVudHJ5MCwgbmV3aW5mby0+c2l6ZSwKIAkJCQljaGVja19lbnRyeSwgbmFtZSwgc2l6ZSwgJmkpOwogCi0JaWYgKHJldCAhPSAwKSB7Ci0JCUlQVF9FTlRSWV9JVEVSQVRFKGVudHJ5MCwgbmV3aW5mby0+c2l6ZSwKLQkJCQkgIGNsZWFudXBfZW50cnksICZpKTsKLQkJcmV0dXJuIHJldDsKLQl9CisJaWYgKHJldCAhPSAwKQorCQlnb3RvIGNsZWFudXA7CisKKwlyZXQgPSAtRUxPT1A7CisJaWYgKCFtYXJrX3NvdXJjZV9jaGFpbnMobmV3aW5mbywgdmFsaWRfaG9va3MsIGVudHJ5MCkpCisJCWdvdG8gY2xlYW51cDsKIAogCS8qIEFuZCBvbmUgY29weSBmb3IgZXZlcnkgb3RoZXIgQ1BVICovCiAJZm9yX2VhY2hfcG9zc2libGVfY3B1KGkpIHsKQEAgLTczMiw2ICs3MzYsOSBAQAogCQkJbWVtY3B5KG5ld2luZm8tPmVudHJpZXNbaV0sIGVudHJ5MCwgbmV3aW5mby0+c2l6ZSk7CiAJfQogCisJcmV0dXJuIDA7CitjbGVhbnVwOgorCUlQVF9FTlRSWV9JVEVSQVRFKGVudHJ5MCwgbmV3aW5mby0+c2l6ZSwgY2xlYW51cF9lbnRyeSwgJmkpOwogCXJldHVybiByZXQ7CiB9CiAKQEAgLTE0NjMsNiArMTQ3MCwxMCBAQAogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKKwlpZiAoZS0+dGFyZ2V0X29mZnNldCArIHNpemVvZihzdHJ1Y3QgY29tcGF0X3h0X2VudHJ5X3RhcmdldCkgPgorCQkJCQkJCQllLT5uZXh0X29mZnNldCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKIAlvZmYgPSAwOwogCWVudHJ5X29mZnNldCA9ICh2b2lkICopZSAtICh2b2lkICopYmFzZTsKIAlqID0gMDsKQEAgLTE0NzIsNiArMTQ4Myw5IEBACiAJCWdvdG8gY2xlYW51cF9tYXRjaGVzOwogCiAJdCA9IGlwdF9nZXRfdGFyZ2V0KGUpOworCXJldCA9IC1FSU5WQUw7CisJaWYgKGUtPnRhcmdldF9vZmZzZXQgKyB0LT51LnRhcmdldF9zaXplID4gZS0+bmV4dF9vZmZzZXQpCisJCQlnb3RvIGNsZWFudXBfbWF0Y2hlczsKIAl0YXJnZXQgPSB0cnlfdGhlbl9yZXF1ZXN0X21vZHVsZSh4dF9maW5kX3RhcmdldChBRl9JTkVULAogCQkJCQkJICAgICB0LT51LnVzZXIubmFtZSwKIAkJCQkJCSAgICAgdC0+dS51c2VyLnJldmlzaW9uKSwKQEAgLTE1MTMsNyArMTUyNyw3IEBACiAKIHN0YXRpYyBpbmxpbmUgaW50IGNvbXBhdF9jb3B5X21hdGNoX2Zyb21fdXNlcihzdHJ1Y3QgaXB0X2VudHJ5X21hdGNoICptLAogCXZvaWQgKipkc3RwdHIsIGNvbXBhdF91aW50X3QgKnNpemUsIGNvbnN0IGNoYXIgKm5hbWUsCi0JY29uc3Qgc3RydWN0IGlwdF9pcCAqaXAsIHVuc2lnbmVkIGludCBob29rbWFzaywgaW50ICppKQorCWNvbnN0IHN0cnVjdCBpcHRfaXAgKmlwLCB1bnNpZ25lZCBpbnQgaG9va21hc2spCiB7CiAJc3RydWN0IGlwdF9lbnRyeV9tYXRjaCAqZG07CiAJc3RydWN0IGlwdF9tYXRjaCAqbWF0Y2g7CkBAIC0xNTI2LDIyICsxNTQwLDEzIEBACiAJcmV0ID0geHRfY2hlY2tfbWF0Y2gobWF0Y2gsIEFGX0lORVQsIGRtLT51Lm1hdGNoX3NpemUgLSBzaXplb2YoKmRtKSwKIAkJCSAgICAgbmFtZSwgaG9va21hc2ssIGlwLT5wcm90bywKIAkJCSAgICAgaXAtPmludmZsYWdzICYgSVBUX0lOVl9QUk9UTyk7Ci0JaWYgKHJldCkKLQkJZ290byBlcnI7Ci0KLQlpZiAobS0+dS5rZXJuZWwubWF0Y2gtPmNoZWNrZW50cnkKKwlpZiAoIXJldCAmJiBtLT51Lmtlcm5lbC5tYXRjaC0+Y2hlY2tlbnRyeQogCSAgICAmJiAhbS0+dS5rZXJuZWwubWF0Y2gtPmNoZWNrZW50cnkobmFtZSwgaXAsIG1hdGNoLCBkbS0+ZGF0YSwKIAkJCQkJICAgICAgaG9va21hc2spKSB7CiAJCWR1cHJpbnRmKCJpcF90YWJsZXM6IGNoZWNrIGZhaWxlZCBmb3IgYCVzJy5cbiIsCiAJCQkgbS0+dS5rZXJuZWwubWF0Y2gtPm5hbWUpOwogCQlyZXQgPSAtRUlOVkFMOwotCQlnb3RvIGVycjsKIAl9Ci0JKCppKSsrOwotCXJldHVybiAwOwotCi1lcnI6Ci0JbW9kdWxlX3B1dChtLT51Lmtlcm5lbC5tYXRjaC0+bWUpOwogCXJldHVybiByZXQ7CiB9CiAKQEAgLTE1NTMsMTkgKzE1NTgsMTggQEAKIAlzdHJ1Y3QgaXB0X3RhcmdldCAqdGFyZ2V0OwogCXN0cnVjdCBpcHRfZW50cnkgKmRlOwogCXVuc2lnbmVkIGludCBvcmlnc2l6ZTsKLQlpbnQgcmV0LCBoLCBqOworCWludCByZXQsIGg7CiAKIAlyZXQgPSAwOwogCW9yaWdzaXplID0gKnNpemU7CiAJZGUgPSAoc3RydWN0IGlwdF9lbnRyeSAqKSpkc3RwdHI7CiAJbWVtY3B5KGRlLCBlLCBzaXplb2Yoc3RydWN0IGlwdF9lbnRyeSkpOwogCi0JaiA9IDA7CiAJKmRzdHB0ciArPSBzaXplb2Yoc3RydWN0IGNvbXBhdF9pcHRfZW50cnkpOwogCXJldCA9IElQVF9NQVRDSF9JVEVSQVRFKGUsIGNvbXBhdF9jb3B5X21hdGNoX2Zyb21fdXNlciwgZHN0cHRyLCBzaXplLAotCQkJbmFtZSwgJmRlLT5pcCwgZGUtPmNvbWVmcm9tLCAmaik7CisJCQluYW1lLCAmZGUtPmlwLCBkZS0+Y29tZWZyb20pOwogCWlmIChyZXQpCi0JCWdvdG8gY2xlYW51cF9tYXRjaGVzOworCQlnb3RvIGVycjsKIAlkZS0+dGFyZ2V0X29mZnNldCA9IGUtPnRhcmdldF9vZmZzZXQgLSAob3JpZ3NpemUgLSAqc2l6ZSk7CiAJdCA9IGlwdF9nZXRfdGFyZ2V0KGUpOwogCXRhcmdldCA9IHQtPnUua2VybmVsLnRhcmdldDsKQEAgLTE1OTksMTIgKzE2MDMsNyBAQAogCQlnb3RvIGVycjsKIAl9CiAJcmV0ID0gMDsKLQlyZXR1cm4gcmV0OwotCiBlcnI6Ci0JbW9kdWxlX3B1dCh0LT51Lmtlcm5lbC50YXJnZXQtPm1lKTsKLWNsZWFudXBfbWF0Y2hlczoKLQlJUFRfTUFUQ0hfSVRFUkFURShlLCBjbGVhbnVwX21hdGNoLCAmaik7CiAJcmV0dXJuIHJldDsKIH0KIApAQCAtMTYxOCw3ICsxNjE3LDcgQEAKIAkJdW5zaWduZWQgaW50ICpob29rX2VudHJpZXMsCiAJCXVuc2lnbmVkIGludCAqdW5kZXJmbG93cykKIHsKLQl1bnNpZ25lZCBpbnQgaTsKKwl1bnNpZ25lZCBpbnQgaSwgajsKIAlzdHJ1Y3QgeHRfdGFibGVfaW5mbyAqbmV3aW5mbywgKmluZm87CiAJdm9pZCAqcG9zLCAqZW50cnkwLCAqZW50cnkxOwogCXVuc2lnbmVkIGludCBzaXplOwpAQCAtMTYzNiwyMSArMTYzNSwyMSBAQAogCX0KIAogCWR1cHJpbnRmKCJ0cmFuc2xhdGVfY29tcGF0X3RhYmxlOiBzaXplICV1XG4iLCBpbmZvLT5zaXplKTsKLQlpID0gMDsKKwlqID0gMDsKIAl4dF9jb21wYXRfbG9jayhBRl9JTkVUKTsKIAkvKiBXYWxrIHRocm91Z2ggZW50cmllcywgY2hlY2tpbmcgb2Zmc2V0cy4gKi8KIAlyZXQgPSBJUFRfRU5UUllfSVRFUkFURShlbnRyeTAsIHRvdGFsX3NpemUsCiAJCQkJY2hlY2tfY29tcGF0X2VudHJ5X3NpemVfYW5kX2hvb2tzLAogCQkJCWluZm8sICZzaXplLCBlbnRyeTAsCiAJCQkJZW50cnkwICsgdG90YWxfc2l6ZSwKLQkJCQlob29rX2VudHJpZXMsIHVuZGVyZmxvd3MsICZpLCBuYW1lKTsKKwkJCQlob29rX2VudHJpZXMsIHVuZGVyZmxvd3MsICZqLCBuYW1lKTsKIAlpZiAocmV0ICE9IDApCiAJCWdvdG8gb3V0X3VubG9jazsKIAogCXJldCA9IC1FSU5WQUw7Ci0JaWYgKGkgIT0gbnVtYmVyKSB7CisJaWYgKGogIT0gbnVtYmVyKSB7CiAJCWR1cHJpbnRmKCJ0cmFuc2xhdGVfY29tcGF0X3RhYmxlOiAldSBub3QgJXUgZW50cmllc1xuIiwKLQkJCSBpLCBudW1iZXIpOworCQkJIGosIG51bWJlcik7CiAJCWdvdG8gb3V0X3VubG9jazsKIAl9CiAKQEAgLTE3MDksOCArMTcwOCwxMCBAQAogZnJlZV9uZXdpbmZvOgogCXh0X2ZyZWVfdGFibGVfaW5mbyhuZXdpbmZvKTsKIG91dDoKKwlJUFRfRU5UUllfSVRFUkFURShlbnRyeTAsIHRvdGFsX3NpemUsIGNsZWFudXBfZW50cnksICZqKTsKIAlyZXR1cm4gcmV0Owogb3V0X3VubG9jazoKKwljb21wYXRfZmx1c2hfb2Zmc2V0cygpOwogCXh0X2NvbXBhdF91bmxvY2soQUZfSU5FVCk7CiAJZ290byBvdXQ7CiB9CkBAIC0xOTMyLDYgKzE5MzMsOSBAQAogewogCWludCByZXQ7CiAKKwlpZiAoIWNhcGFibGUoQ0FQX05FVF9BRE1JTikpCisJCXJldHVybiAtRVBFUk07CisKIAlzd2l0Y2ggKGNtZCkgewogCWNhc2UgSVBUX1NPX0dFVF9JTkZPOgogCQlyZXQgPSBnZXRfaW5mbyh1c2VyLCBsZW4sIDEpOwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9FQ04uYyBiL25ldC9pcHY0L25ldGZpbHRlci9pcHRfRUNOLmMKaW5kZXggMTJhODE4YS4uMWFhNDUxNyAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9FQ04uYworKysgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X0VDTi5jCkBAIC0yOCw3ICsyOCw3IEBACiBzZXRfZWN0X2lwKHN0cnVjdCBza19idWZmICoqcHNrYiwgY29uc3Qgc3RydWN0IGlwdF9FQ05faW5mbyAqZWluZm8pCiB7CiAJc3RydWN0IGlwaGRyICppcGggPSAoKnBza2IpLT5uaC5pcGg7Ci0JX19iZTE2IG9sZHRvczsKKwl1X2ludDE2X3Qgb2xkdG9zOwogCiAJaWYgKChpcGgtPnRvcyAmIElQVF9FQ05fSVBfTUFTSykgIT0gKGVpbmZvLT5pcF9lY3QgJiBJUFRfRUNOX0lQX01BU0spKSB7CiAJCWlmICghc2tiX21ha2Vfd3JpdGFibGUocHNrYiwgc2l6ZW9mKHN0cnVjdCBpcGhkcikpKQpAQCAtMzcsOCArMzcsOCBAQAogCQlvbGR0b3MgPSBpcGgtPnRvczsKIAkJaXBoLT50b3MgJj0gfklQVF9FQ05fSVBfTUFTSzsKIAkJaXBoLT50b3MgfD0gKGVpbmZvLT5pcF9lY3QgJiBJUFRfRUNOX0lQX01BU0spOwotCQlpcGgtPmNoZWNrID0gbmZfY3N1bV91cGRhdGUob2xkdG9zIF4gaHRvbnMoMHhGRkZGKSwgaXBoLT50b3MsCi0JCQkJCSAgICBpcGgtPmNoZWNrKTsKKwkJaXBoLT5jaGVjayA9IG5mX2NzdW1fdXBkYXRlKGh0b25zKG9sZHRvcykgXiBodG9ucygweEZGRkYpLAorCQkJCQkgICAgaHRvbnMoaXBoLT50b3MpLCBpcGgtPmNoZWNrKTsKIAl9IAogCXJldHVybiAxOwogfQpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9UT1MuYyBiL25ldC9pcHY0L25ldGZpbHRlci9pcHRfVE9TLmMKaW5kZXggNmI4YjE0Yy4uODNiODBiMyAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9UT1MuYworKysgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X1RPUy5jCkBAIC0zMCw3ICszMCw3IEBACiB7CiAJY29uc3Qgc3RydWN0IGlwdF90b3NfdGFyZ2V0X2luZm8gKnRvc2luZm8gPSB0YXJnaW5mbzsKIAlzdHJ1Y3QgaXBoZHIgKmlwaCA9ICgqcHNrYiktPm5oLmlwaDsKLQlfX2JlMTYgb2xkdG9zOworCXVfaW50MTZfdCBvbGR0b3M7CiAKIAlpZiAoKGlwaC0+dG9zICYgSVBUT1NfVE9TX01BU0spICE9IHRvc2luZm8tPnRvcykgewogCQlpZiAoIXNrYl9tYWtlX3dyaXRhYmxlKHBza2IsIHNpemVvZihzdHJ1Y3QgaXBoZHIpKSkKQEAgLTM4LDggKzM4LDggQEAKIAkJaXBoID0gKCpwc2tiKS0+bmguaXBoOwogCQlvbGR0b3MgPSBpcGgtPnRvczsKIAkJaXBoLT50b3MgPSAoaXBoLT50b3MgJiBJUFRPU19QUkVDX01BU0spIHwgdG9zaW5mby0+dG9zOwotCQlpcGgtPmNoZWNrID0gbmZfY3N1bV91cGRhdGUob2xkdG9zIF4gaHRvbnMoMHhGRkZGKSwgaXBoLT50b3MsCi0JCQkJCSAgICBpcGgtPmNoZWNrKTsKKwkJaXBoLT5jaGVjayA9IG5mX2NzdW1fdXBkYXRlKGh0b25zKG9sZHRvcykgXiBodG9ucygweEZGRkYpLAorCQkJCQkgICAgaHRvbnMoaXBoLT50b3MpLCBpcGgtPmNoZWNrKTsKIAl9CiAJcmV0dXJuIElQVF9DT05USU5VRTsKIH0KZGlmZiAtLWdpdCBhL25ldC9pcHY0L3Jhdy5jIGIvbmV0L2lwdjQvcmF3LmMKaW5kZXggYjQzMGNmMi4uNWMzMWRlYSAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvcmF3LmMKKysrIGIvbmV0L2lwdjQvcmF3LmMKQEAgLTMyOSw3ICszMjksNyBAQAogCXJldHVybiBlcnI7IAogfQogCi1zdGF0aWMgdm9pZCByYXdfcHJvYmVfcHJvdG9fb3B0KHN0cnVjdCBmbG93aSAqZmwsIHN0cnVjdCBtc2doZHIgKm1zZykKK3N0YXRpYyBpbnQgcmF3X3Byb2JlX3Byb3RvX29wdChzdHJ1Y3QgZmxvd2kgKmZsLCBzdHJ1Y3QgbXNnaGRyICptc2cpCiB7CiAJc3RydWN0IGlvdmVjICppb3Y7CiAJdTggX191c2VyICp0eXBlID0gTlVMTDsKQEAgLTMzOCw3ICszMzgsNyBAQAogCXVuc2lnbmVkIGludCBpOwogCiAJaWYgKCFtc2ctPm1zZ19pb3YpCi0JCXJldHVybjsKKwkJcmV0dXJuIDA7CiAKIAlmb3IgKGkgPSAwOyBpIDwgbXNnLT5tc2dfaW92bGVuOyBpKyspIHsKIAkJaW92ID0gJm1zZy0+bXNnX2lvdltpXTsKQEAgLTM2MCw4ICszNjAsOSBAQAogCQkJCWNvZGUgPSBpb3YtPmlvdl9iYXNlOwogCiAJCQlpZiAodHlwZSAmJiBjb2RlKSB7Ci0JCQkJZ2V0X3VzZXIoZmwtPmZsX2ljbXBfdHlwZSwgdHlwZSk7Ci0JCQkgICAgICAgIGdldF91c2VyKGZsLT5mbF9pY21wX2NvZGUsIGNvZGUpOworCQkJCWlmIChnZXRfdXNlcihmbC0+ZmxfaWNtcF90eXBlLCB0eXBlKSB8fAorCQkJCSAgICBnZXRfdXNlcihmbC0+ZmxfaWNtcF9jb2RlLCBjb2RlKSkKKwkJCQkJcmV0dXJuIC1FRkFVTFQ7CiAJCQkJcHJvYmVkID0gMTsKIAkJCX0KIAkJCWJyZWFrOwpAQCAtMzcyLDYgKzM3Myw3IEBACiAJCWlmIChwcm9iZWQpCiAJCQlicmVhazsKIAl9CisJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQgcmF3X3NlbmRtc2coc3RydWN0IGtpb2NiICppb2NiLCBzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBtc2doZHIgKm1zZywKQEAgLTQ4MCw4ICs0ODIsMTEgQEAKIAkJCQkgICAgLnByb3RvID0gaW5ldC0+aGRyaW5jbCA/IElQUFJPVE9fUkFXIDoKIAkJCQkJICAgIAkJICAgICBzay0+c2tfcHJvdG9jb2wsCiAJCQkJICB9OwotCQlpZiAoIWluZXQtPmhkcmluY2wpCi0JCQlyYXdfcHJvYmVfcHJvdG9fb3B0KCZmbCwgbXNnKTsKKwkJaWYgKCFpbmV0LT5oZHJpbmNsKSB7CisJCQllcnIgPSByYXdfcHJvYmVfcHJvdG9fb3B0KCZmbCwgbXNnKTsKKwkJCWlmIChlcnIpCisJCQkJZ290byBkb25lOworCQl9CiAKIAkJc2VjdXJpdHlfc2tfY2xhc3NpZnlfZmxvdyhzaywgJmZsKTsKIAkJZXJyID0gaXBfcm91dGVfb3V0cHV0X2Zsb3coJnJ0LCAmZmwsIHNrLCAhKG1zZy0+bXNnX2ZsYWdzJk1TR19ET05UV0FJVCkpOwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvcm91dGUuYyBiL25ldC9pcHY0L3JvdXRlLmMKaW5kZXggYzQxZGRiYS4uOTI1ZWU0ZCAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvcm91dGUuYworKysgYi9uZXQvaXB2NC9yb3V0ZS5jCkBAIC01NjYsOSArNTY2LDE1IEBACiAKIHN0YXRpYyBpbmxpbmUgaW50IGNvbXBhcmVfa2V5cyhzdHJ1Y3QgZmxvd2kgKmZsMSwgc3RydWN0IGZsb3dpICpmbDIpCiB7Ci0JcmV0dXJuIG1lbWNtcCgmZmwxLT5ubF91LmlwNF91LCAmZmwyLT5ubF91LmlwNF91LCBzaXplb2YoZmwxLT5ubF91LmlwNF91KSkgPT0gMCAmJgotCSAgICAgICBmbDEtPm9pZiAgICAgPT0gZmwyLT5vaWYgJiYKLQkgICAgICAgZmwxLT5paWYgICAgID09IGZsMi0+aWlmOworCXJldHVybiAoKGZsMS0+bmxfdS5pcDRfdS5kYWRkciBeIGZsMi0+bmxfdS5pcDRfdS5kYWRkcikgfAorCQkoZmwxLT5ubF91LmlwNF91LnNhZGRyIF4gZmwyLT5ubF91LmlwNF91LnNhZGRyKSB8CisjaWZkZWYgQ09ORklHX0lQX1JPVVRFX0ZXTUFSSworCQkoZmwxLT5ubF91LmlwNF91LmZ3bWFyayBeIGZsMi0+bmxfdS5pcDRfdS5md21hcmspIHwKKyNlbmRpZgorCQkoKih1MTYgKikmZmwxLT5ubF91LmlwNF91LnRvcyBeCisJCSAqKHUxNiAqKSZmbDItPm5sX3UuaXA0X3UudG9zKSB8CisJCShmbDEtPm9pZiBeIGZsMi0+b2lmKSB8CisJCShmbDEtPmlpZiBeIGZsMi0+aWlmKSkgPT0gMDsKIH0KIAogI2lmZGVmIENPTkZJR19JUF9ST1VURV9NVUxUSVBBVEhfQ0FDSEVECmRpZmYgLS1naXQgYS9uZXQvaXB2NC9zeXNjdGxfbmV0X2lwdjQuYyBiL25ldC9pcHY0L3N5c2N0bF9uZXRfaXB2NC5jCmluZGV4IGU4MmE1YmUuLjE1MDYxYjMgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L3N5c2N0bF9uZXRfaXB2NC5jCisrKyBiL25ldC9pcHY0L3N5c2N0bF9uZXRfaXB2NC5jCkBAIC0xMjksMTMgKzEyOSw2IEBACiAJcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIGludCBfX2luaXQgdGNwX2Nvbmdlc3Rpb25fZGVmYXVsdCh2b2lkKQotewotCXJldHVybiB0Y3Bfc2V0X2RlZmF1bHRfY29uZ2VzdGlvbl9jb250cm9sKENPTkZJR19ERUZBVUxUX1RDUF9DT05HKTsKLX0KLQotbGF0ZV9pbml0Y2FsbCh0Y3BfY29uZ2VzdGlvbl9kZWZhdWx0KTsKLQogY3RsX3RhYmxlIGlwdjRfdGFibGVbXSA9IHsKICAgICAgICAgewogCQkuY3RsX25hbWUJPSBORVRfSVBWNF9UQ1BfVElNRVNUQU1QUywKZGlmZiAtLWdpdCBhL25ldC9pcHY0L3RjcC5jIGIvbmV0L2lwdjQvdGNwLmMKaW5kZXggNjZlOWE3Mi4uYzA1ZThlZCAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvdGNwLmMKKysrIGIvbmV0L2lwdjQvdGNwLmMKQEAgLTIyNzAsNyArMjI3MCw3IEBACiAJCQkJCXRoYXNoX2VudHJpZXMsCiAJCQkJCShudW1fcGh5c3BhZ2VzID49IDEyOCAqIDEwMjQpID8KIAkJCQkJMTMgOiAxNSwKLQkJCQkJSEFTSF9ISUdITUVNLAorCQkJCQkwLAogCQkJCQkmdGNwX2hhc2hpbmZvLmVoYXNoX3NpemUsCiAJCQkJCU5VTEwsCiAJCQkJCTApOwpAQCAtMjI4Niw3ICsyMjg2LDcgQEAKIAkJCQkJdGNwX2hhc2hpbmZvLmVoYXNoX3NpemUsCiAJCQkJCShudW1fcGh5c3BhZ2VzID49IDEyOCAqIDEwMjQpID8KIAkJCQkJMTMgOiAxNSwKLQkJCQkJSEFTSF9ISUdITUVNLAorCQkJCQkwLAogCQkJCQkmdGNwX2hhc2hpbmZvLmJoYXNoX3NpemUsCiAJCQkJCU5VTEwsCiAJCQkJCTY0ICogMTAyNCk7CkBAIC0yMzE2LDkgKzIzMTYsMTAgQEAKIAkJc3lzY3RsX21heF9zeW5fYmFja2xvZyA9IDEyODsKIAl9CiAKLQlzeXNjdGxfdGNwX21lbVswXSA9ICA3NjggPDwgb3JkZXI7Ci0Jc3lzY3RsX3RjcF9tZW1bMV0gPSAxMDI0IDw8IG9yZGVyOwotCXN5c2N0bF90Y3BfbWVtWzJdID0gMTUzNiA8PCBvcmRlcjsKKwkvKiBBbGxvdyBubyBtb3JlIHRoYW4gMy80IGtlcm5lbCBtZW1vcnkgKHVzdWFsbHkgbGVzcykgYWxsb2NhdGVkIHRvIFRDUCAqLworCXN5c2N0bF90Y3BfbWVtWzBdID0gKDE1MzYgLyBzaXplb2YgKHN0cnVjdCBpbmV0X2JpbmRfaGFzaGJ1Y2tldCkpIDw8IG9yZGVyOworCXN5c2N0bF90Y3BfbWVtWzFdID0gc3lzY3RsX3RjcF9tZW1bMF0gKiA0IC8gMzsKKwlzeXNjdGxfdGNwX21lbVsyXSA9IHN5c2N0bF90Y3BfbWVtWzBdICogMjsKIAogCWxpbWl0ID0gKCh1bnNpZ25lZCBsb25nKXN5c2N0bF90Y3BfbWVtWzFdKSA8PCAoUEFHRV9TSElGVCAtIDcpOwogCW1heF9zaGFyZSA9IG1pbig0VUwqMTAyNCoxMDI0LCBsaW1pdCk7CmRpZmYgLS1naXQgYS9uZXQvaXB2NC90Y3BfY29uZy5jIGIvbmV0L2lwdjQvdGNwX2NvbmcuYwppbmRleCBhZjBhY2ExLi4xZTI5ODJmIDEwMDY0NAotLS0gYS9uZXQvaXB2NC90Y3BfY29uZy5jCisrKyBiL25ldC9pcHY0L3RjcF9jb25nLmMKQEAgLTEzMSw2ICsxMzEsMTQgQEAKIAlyZXR1cm4gcmV0OwogfQogCisvKiBTZXQgZGVmYXVsdCB2YWx1ZSBmcm9tIGtlcm5lbCBjb25maWd1cmF0aW9uIGF0IGJvb3R1cCAqLworc3RhdGljIGludCBfX2luaXQgdGNwX2Nvbmdlc3Rpb25fZGVmYXVsdCh2b2lkKQoreworCXJldHVybiB0Y3Bfc2V0X2RlZmF1bHRfY29uZ2VzdGlvbl9jb250cm9sKENPTkZJR19ERUZBVUxUX1RDUF9DT05HKTsKK30KK2xhdGVfaW5pdGNhbGwodGNwX2Nvbmdlc3Rpb25fZGVmYXVsdCk7CisKKwogLyogR2V0IGN1cnJlbnQgZGVmYXVsdCBjb25nZXN0aW9uIGNvbnRyb2wgKi8KIHZvaWQgdGNwX2dldF9kZWZhdWx0X2Nvbmdlc3Rpb25fY29udHJvbChjaGFyICpuYW1lKQogewpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvdGNwX2N1YmljLmMgYi9uZXQvaXB2NC90Y3BfY3ViaWMuYwppbmRleCBhNjBlZjM4Li42YWQxODQ4IDEwMDY0NAotLS0gYS9uZXQvaXB2NC90Y3BfY3ViaWMuYworKysgYi9uZXQvaXB2NC90Y3BfY3ViaWMuYwpAQCAtMTkwLDcgKzE5MCw3IEBACiAgICAgICAgICAqLwogCiAJLyogY2hhbmdlIHRoZSB1bml0IGZyb20gSFogdG8gYmljdGNwX0haICovCi0gICAgICAgIHQgPSAoKHRjcF90aW1lX3N0YW1wICsgY2EtPmRlbGF5X21pbiAtIGNhLT5lcG9jaF9zdGFydCkKKyAgICAgICAgdCA9ICgodGNwX3RpbWVfc3RhbXAgKyAoY2EtPmRlbGF5X21pbj4+MykgLSBjYS0+ZXBvY2hfc3RhcnQpCiAJICAgICA8PCBCSUNUQ1BfSFopIC8gSFo7CiAKICAgICAgICAgaWYgKHQgPCBjYS0+YmljX0spCQkvKiB0IC0gSyAqLwpAQCAtMjU5LDcgKzI1OSw3IEBACiAJICAgIChzMzIpKHRjcF90aW1lX3N0YW1wIC0gY2EtPmVwb2NoX3N0YXJ0KSA8IEhaKQogCQlyZXR1cm47CiAKLQlkZWxheSA9IHRjcF90aW1lX3N0YW1wIC0gdHAtPnJ4X29wdC5yY3ZfdHNlY3I7CisJZGVsYXkgPSAodGNwX3RpbWVfc3RhbXAgLSB0cC0+cnhfb3B0LnJjdl90c2Vjcik8PDM7CiAJaWYgKGRlbGF5ID09IDApCiAJCWRlbGF5ID0gMTsKIApAQCAtMzY2LDcgKzM2Niw3IEBACiAKIAliZXRhX3NjYWxlID0gOCooQklDVENQX0JFVEFfU0NBTEUrYmV0YSkvIDMgLyAoQklDVENQX0JFVEFfU0NBTEUgLSBiZXRhKTsKIAotCWN1YmVfcnR0X3NjYWxlID0gKGJpY19zY2FsZSA8PCAzKSAvIDEwOwkvKiAxMDI0KmMvcnR0ICovCisJY3ViZV9ydHRfc2NhbGUgPSAoYmljX3NjYWxlICogMTApOwkvKiAxMDI0KmMvcnR0ICovCiAKIAkvKiBjYWxjdWxhdGUgdGhlICJLIiBmb3IgKHdtYXgtY3duZCkgPSBjL3J0dCAqIEteMwogCSAqICBzbyBLID0gY3ViaWNfcm9vdCggKHdtYXgtY3duZCkqcnR0L2MgKQpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvdGNwX2h0Y3AuYyBiL25ldC9pcHY0L3RjcF9odGNwLmMKaW5kZXggNjgyZTdkNS4uMjgzYmUzYyAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvdGNwX2h0Y3AuYworKysgYi9uZXQvaXB2NC90Y3BfaHRjcC5jCkBAIC0yMyw3ICsyMyw3IEBACiBNT0RVTEVfUEFSTV9ERVNDKHVzZV9iYW5kd2lkdGhfc3dpdGNoLCAidHVybiBvbi9vZmYgYmFuZHdpZHRoIHN3aXRjaGVyIik7CiAKIHN0cnVjdCBodGNwIHsKLQl1MTYJYWxwaGE7CQkvKiBGaXhlZCBwb2ludCBhcml0aCwgPDwgNyAqLworCXUzMglhbHBoYTsJCS8qIEZpeGVkIHBvaW50IGFyaXRoLCA8PCA3ICovCiAJdTgJYmV0YTsgICAgICAgICAgIC8qIEZpeGVkIHBvaW50IGFyaXRoLCA8PCA3ICovCiAJdTgJbW9kZXN3aXRjaDsgICAgIC8qIERlbGF5IG1vZGVzd2l0Y2ggdW50aWwgd2UgaGFkIGF0IGxlYXN0IG9uZSBjb25nZXN0aW9uIGV2ZW50ICovCiAJdTMyCWxhc3RfY29uZzsJLyogVGltZSBzaW5jZSBsYXN0IGNvbmdlc3Rpb24gZXZlbnQgZW5kICovCmRpZmYgLS1naXQgYS9uZXQvaXB2NC90Y3BfaXB2NC5jIGIvbmV0L2lwdjQvdGNwX2lwdjQuYwppbmRleCBjODM5MzhiLi4yMmVmOGJkIDEwMDY0NAotLS0gYS9uZXQvaXB2NC90Y3BfaXB2NC5jCisrKyBiL25ldC9pcHY0L3RjcF9pcHY0LmMKQEAgLTM1NSw3ICszNTUsNyBAQAogCQlyZXR1cm47CiAJfQogCWlmIChzay0+c2tfc3RhdGUgPT0gVENQX1RJTUVfV0FJVCkgewotCQlpbmV0X3R3c2tfcHV0KChzdHJ1Y3QgaW5ldF90aW1ld2FpdF9zb2NrICopc2spOworCQlpbmV0X3R3c2tfcHV0KGluZXRfdHdzayhzaykpOwogCQlyZXR1cm47CiAJfQogCkBAIC0zNzMsNyArMzczLDcgQEAKIAlzZXEgPSBudG9obCh0aC0+c2VxKTsKIAlpZiAoc2stPnNrX3N0YXRlICE9IFRDUF9MSVNURU4gJiYKIAkgICAgIWJldHdlZW4oc2VxLCB0cC0+c25kX3VuYSwgdHAtPnNuZF9ueHQpKSB7Ci0JCU5FVF9JTkNfU1RBVFMoTElOVVhfTUlCX09VVE9GV0lORE9XSUNNUFMpOworCQlORVRfSU5DX1NUQVRTX0JIKExJTlVYX01JQl9PVVRPRldJTkRPV0lDTVBTKTsKIAkJZ290byBvdXQ7CiAJfQogCkBAIC01NzgsNyArNTc4LDcgQEAKIAlzdHJ1Y3QgdGNwaGRyICp0aCA9IHNrYi0+aC50aDsKIAlzdHJ1Y3QgewogCQlzdHJ1Y3QgdGNwaGRyIHRoOwotCQl1MzIgdHNvcHRbM107CisJCXUzMiB0c29wdFtUQ1BPTEVOX1RTVEFNUF9BTElHTkVEID4+IDJdOwogCX0gcmVwOwogCXN0cnVjdCBpcF9yZXBseV9hcmcgYXJnOwogCkBAIC05NjAsNyArOTYwLDcgQEAKIAkJCWJoX2xvY2tfc29jayhuc2spOwogCQkJcmV0dXJuIG5zazsKIAkJfQotCQlpbmV0X3R3c2tfcHV0KChzdHJ1Y3QgaW5ldF90aW1ld2FpdF9zb2NrICopbnNrKTsKKwkJaW5ldF90d3NrX3B1dChpbmV0X3R3c2sobnNrKSk7CiAJCXJldHVybiBOVUxMOwogCX0KIApAQCAtMTE1NCwyNiArMTE1NCwyNCBAQAogCiBkb190aW1lX3dhaXQ6CiAJaWYgKCF4ZnJtNF9wb2xpY3lfY2hlY2soTlVMTCwgWEZSTV9QT0xJQ1lfSU4sIHNrYikpIHsKLQkJaW5ldF90d3NrX3B1dCgoc3RydWN0IGluZXRfdGltZXdhaXRfc29jayAqKSBzayk7CisJCWluZXRfdHdza19wdXQoaW5ldF90d3NrKHNrKSk7CiAJCWdvdG8gZGlzY2FyZF9pdDsKIAl9CiAKIAlpZiAoc2tiLT5sZW4gPCAodGgtPmRvZmYgPDwgMikgfHwgdGNwX2NoZWNrc3VtX2NvbXBsZXRlKHNrYikpIHsKIAkJVENQX0lOQ19TVEFUU19CSChUQ1BfTUlCX0lORVJSUyk7Ci0JCWluZXRfdHdza19wdXQoKHN0cnVjdCBpbmV0X3RpbWV3YWl0X3NvY2sgKikgc2spOworCQlpbmV0X3R3c2tfcHV0KGluZXRfdHdzayhzaykpOwogCQlnb3RvIGRpc2NhcmRfaXQ7CiAJfQotCXN3aXRjaCAodGNwX3RpbWV3YWl0X3N0YXRlX3Byb2Nlc3MoKHN0cnVjdCBpbmV0X3RpbWV3YWl0X3NvY2sgKilzaywKLQkJCQkJICAgc2tiLCB0aCkpIHsKKwlzd2l0Y2ggKHRjcF90aW1ld2FpdF9zdGF0ZV9wcm9jZXNzKGluZXRfdHdzayhzayksIHNrYiwgdGgpKSB7CiAJY2FzZSBUQ1BfVFdfU1lOOiB7CiAJCXN0cnVjdCBzb2NrICpzazIgPSBpbmV0X2xvb2t1cF9saXN0ZW5lcigmdGNwX2hhc2hpbmZvLAogCQkJCQkJCXNrYi0+bmguaXBoLT5kYWRkciwKIAkJCQkJCQl0aC0+ZGVzdCwKIAkJCQkJCQlpbmV0X2lpZihza2IpKTsKIAkJaWYgKHNrMikgewotCQkJaW5ldF90d3NrX2Rlc2NoZWR1bGUoKHN0cnVjdCBpbmV0X3RpbWV3YWl0X3NvY2sgKilzaywKLQkJCQkJICAgICAmdGNwX2RlYXRoX3Jvdyk7Ci0JCQlpbmV0X3R3c2tfcHV0KChzdHJ1Y3QgaW5ldF90aW1ld2FpdF9zb2NrICopc2spOworCQkJaW5ldF90d3NrX2Rlc2NoZWR1bGUoaW5ldF90d3NrKHNrKSwgJnRjcF9kZWF0aF9yb3cpOworCQkJaW5ldF90d3NrX3B1dChpbmV0X3R3c2soc2spKTsKIAkJCXNrID0gc2syOwogCQkJZ290byBwcm9jZXNzOwogCQl9CmRpZmYgLS1naXQgYS9uZXQvaXB2NC90Y3Bfb3V0cHV0LmMgYi9uZXQvaXB2NC90Y3Bfb3V0cHV0LmMKaW5kZXggOWEyNTNmYS4uY2E0MDYxNSAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvdGNwX291dHB1dC5jCisrKyBiL25ldC9pcHY0L3RjcF9vdXRwdXQuYwpAQCAtMjczLDEwICsyNzMsMTAgQEAKIAkJCQkJIF9fdTMyIHRzdGFtcCkKIHsKIAlpZiAodHAtPnJ4X29wdC50c3RhbXBfb2spIHsKLQkJKnB0cisrID0gX19jb25zdGFudF9odG9ubCgoVENQT1BUX05PUCA8PCAyNCkgfAotCQkJCQkgIChUQ1BPUFRfTk9QIDw8IDE2KSB8Ci0JCQkJCSAgKFRDUE9QVF9USU1FU1RBTVAgPDwgOCkgfAotCQkJCQkgIFRDUE9MRU5fVElNRVNUQU1QKTsKKwkJKnB0cisrID0gaHRvbmwoKFRDUE9QVF9OT1AgPDwgMjQpIHwKKwkJCSAgICAgICAoVENQT1BUX05PUCA8PCAxNikgfAorCQkJICAgICAgIChUQ1BPUFRfVElNRVNUQU1QIDw8IDgpIHwKKwkJCSAgICAgICBUQ1BPTEVOX1RJTUVTVEFNUCk7CiAJCSpwdHIrKyA9IGh0b25sKHRzdGFtcCk7CiAJCSpwdHIrKyA9IGh0b25sKHRwLT5yeF9vcHQudHNfcmVjZW50KTsKIAl9CkBAIC0zMjUsMTggKzMyNSwyNyBAQAogCSpwdHIrKyA9IGh0b25sKChUQ1BPUFRfTVNTIDw8IDI0KSB8IChUQ1BPTEVOX01TUyA8PCAxNikgfCBtc3MpOwogCWlmICh0cykgewogCQlpZihzYWNrKQotCQkJKnB0cisrID0gX19jb25zdGFudF9odG9ubCgoVENQT1BUX1NBQ0tfUEVSTSA8PCAyNCkgfCAoVENQT0xFTl9TQUNLX1BFUk0gPDwgMTYpIHwKLQkJCQkJCSAgKFRDUE9QVF9USU1FU1RBTVAgPDwgOCkgfCBUQ1BPTEVOX1RJTUVTVEFNUCk7CisJCQkqcHRyKysgPSBodG9ubCgoVENQT1BUX1NBQ0tfUEVSTSA8PCAyNCkgfAorCQkJCSAgICAgICAoVENQT0xFTl9TQUNLX1BFUk0gPDwgMTYpIHwKKwkJCQkgICAgICAgKFRDUE9QVF9USU1FU1RBTVAgPDwgOCkgfAorCQkJCSAgICAgICBUQ1BPTEVOX1RJTUVTVEFNUCk7CiAJCWVsc2UKLQkJCSpwdHIrKyA9IF9fY29uc3RhbnRfaHRvbmwoKFRDUE9QVF9OT1AgPDwgMjQpIHwgKFRDUE9QVF9OT1AgPDwgMTYpIHwKLQkJCQkJCSAgKFRDUE9QVF9USU1FU1RBTVAgPDwgOCkgfCBUQ1BPTEVOX1RJTUVTVEFNUCk7CisJCQkqcHRyKysgPSBodG9ubCgoVENQT1BUX05PUCA8PCAyNCkgfAorCQkJCSAgICAgICAoVENQT1BUX05PUCA8PCAxNikgfAorCQkJCSAgICAgICAoVENQT1BUX1RJTUVTVEFNUCA8PCA4KSB8CisJCQkJICAgICAgIFRDUE9MRU5fVElNRVNUQU1QKTsKIAkJKnB0cisrID0gaHRvbmwodHN0YW1wKTsJCS8qIFRTVkFMICovCiAJCSpwdHIrKyA9IGh0b25sKHRzX3JlY2VudCk7CS8qIFRTRUNSICovCiAJfSBlbHNlIGlmKHNhY2spCi0JCSpwdHIrKyA9IF9fY29uc3RhbnRfaHRvbmwoKFRDUE9QVF9OT1AgPDwgMjQpIHwgKFRDUE9QVF9OT1AgPDwgMTYpIHwKLQkJCQkJICAoVENQT1BUX1NBQ0tfUEVSTSA8PCA4KSB8IFRDUE9MRU5fU0FDS19QRVJNKTsKKwkJKnB0cisrID0gaHRvbmwoKFRDUE9QVF9OT1AgPDwgMjQpIHwKKwkJCSAgICAgICAoVENQT1BUX05PUCA8PCAxNikgfAorCQkJICAgICAgIChUQ1BPUFRfU0FDS19QRVJNIDw8IDgpIHwKKwkJCSAgICAgICBUQ1BPTEVOX1NBQ0tfUEVSTSk7CiAJaWYgKG9mZmVyX3dzY2FsZSkKLQkJKnB0cisrID0gaHRvbmwoKFRDUE9QVF9OT1AgPDwgMjQpIHwgKFRDUE9QVF9XSU5ET1cgPDwgMTYpIHwgKFRDUE9MRU5fV0lORE9XIDw8IDgpIHwgKHdzY2FsZSkpOworCQkqcHRyKysgPSBodG9ubCgoVENQT1BUX05PUCA8PCAyNCkgfAorCQkJICAgICAgIChUQ1BPUFRfV0lORE9XIDw8IDE2KSB8CisJCQkgICAgICAgKFRDUE9MRU5fV0lORE9XIDw8IDgpIHwKKwkJCSAgICAgICAod3NjYWxlKSk7CiB9CiAKIC8qIFRoaXMgcm91dGluZSBhY3R1YWxseSB0cmFuc21pdHMgVENQIHBhY2tldHMgcXVldWVkIGluIGJ5CkBAIC0xMDg3LDEwICsxMDk2LDE0IEBACiAJdTMyIHNlbmRfd2luLCBjb25nX3dpbiwgbGltaXQsIGluX2ZsaWdodDsKIAogCWlmIChUQ1BfU0tCX0NCKHNrYiktPmZsYWdzICYgVENQQ0JfRkxBR19GSU4pCi0JCXJldHVybiAwOworCQlnb3RvIHNlbmRfbm93OwogCiAJaWYgKGljc2stPmljc2tfY2Ffc3RhdGUgIT0gVENQX0NBX09wZW4pCi0JCXJldHVybiAwOworCQlnb3RvIHNlbmRfbm93OworCisJLyogRGVmZXIgZm9yIGxlc3MgdGhhbiB0d28gY2xvY2sgdGlja3MuICovCisJaWYgKCF0cC0+dHNvX2RlZmVycmVkICYmICgoamlmZmllczw8MSk+PjEpIC0gKHRwLT50c29fZGVmZXJyZWQ+PjEpID4gMSkKKwkJZ290byBzZW5kX25vdzsKIAogCWluX2ZsaWdodCA9IHRjcF9wYWNrZXRzX2luX2ZsaWdodCh0cCk7CiAKQEAgLTExMDYsNyArMTExOSw3IEBACiAKIAkvKiBJZiBhIGZ1bGwtc2l6ZWQgVFNPIHNrYiBjYW4gYmUgc2VudCwgZG8gaXQuICovCiAJaWYgKGxpbWl0ID49IDY1NTM2KQotCQlyZXR1cm4gMDsKKwkJZ290byBzZW5kX25vdzsKIAogCWlmIChzeXNjdGxfdGNwX3Rzb193aW5fZGl2aXNvcikgewogCQl1MzIgY2h1bmsgPSBtaW4odHAtPnNuZF93bmQsIHRwLT5zbmRfY3duZCAqIHRwLT5tc3NfY2FjaGUpOwpAQCAtMTExNiw3ICsxMTI5LDcgQEAKIAkJICovCiAJCWNodW5rIC89IHN5c2N0bF90Y3BfdHNvX3dpbl9kaXZpc29yOwogCQlpZiAobGltaXQgPj0gY2h1bmspCi0JCQlyZXR1cm4gMDsKKwkJCWdvdG8gc2VuZF9ub3c7CiAJfSBlbHNlIHsKIAkJLyogRGlmZmVyZW50IGFwcHJvYWNoLCB0cnkgbm90IHRvIGRlZmVyIHBhc3QgYSBzaW5nbGUKIAkJICogQUNLLiAgUmVjZWl2ZXIgc2hvdWxkIEFDSyBldmVyeSBvdGhlciBmdWxsIHNpemVkCkBAIC0xMTI0LDExICsxMTM3LDE3IEBACiAJCSAqIHRoZW4gc2VuZCBub3cuCiAJCSAqLwogCQlpZiAobGltaXQgPiB0Y3BfbWF4X2J1cnN0KHRwKSAqIHRwLT5tc3NfY2FjaGUpCi0JCQlyZXR1cm4gMDsKKwkJCWdvdG8gc2VuZF9ub3c7CiAJfQogCiAJLyogT2ssIGl0IGxvb2tzIGxpa2UgaXQgaXMgYWR2aXNhYmxlIHRvIGRlZmVyLiAgKi8KKwl0cC0+dHNvX2RlZmVycmVkID0gMSB8IChqaWZmaWVzPDwxKTsKKwogCXJldHVybiAxOworCitzZW5kX25vdzoKKwl0cC0+dHNvX2RlZmVycmVkID0gMDsKKwlyZXR1cm4gMDsKIH0KIAogLyogQ3JlYXRlIGEgbmV3IE1UVSBwcm9iZSBpZiB3ZSBhcmUgcmVhZHkuCmRpZmYgLS1naXQgYS9uZXQvaXB2NC94ZnJtNF9wb2xpY3kuYyBiL25ldC9pcHY0L3hmcm00X3BvbGljeS5jCmluZGV4IDdhN2EwMDEuLjFiZWQwY2QgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L3hmcm00X3BvbGljeS5jCisrKyBiL25ldC9pcHY0L3hmcm00X3BvbGljeS5jCkBAIC01Miw3ICs1Miw3IEBACiAJCSAgICB4ZHN0LT51LnJ0LmZsLmZsNF9kc3QgPT0gZmwtPmZsNF9kc3QgJiYKIAkgICAgCSAgICB4ZHN0LT51LnJ0LmZsLmZsNF9zcmMgPT0gZmwtPmZsNF9zcmMgJiYKIAkgICAgCSAgICB4ZHN0LT51LnJ0LmZsLmZsNF90b3MgPT0gZmwtPmZsNF90b3MgJiYKLQkJICAgIHhmcm1fYnVuZGxlX29rKHhkc3QsIGZsLCBBRl9JTkVULCAwKSkgeworCQkgICAgeGZybV9idW5kbGVfb2socG9saWN5LCB4ZHN0LCBmbCwgQUZfSU5FVCwgMCkpIHsKIAkJCWRzdF9jbG9uZShkc3QpOwogCQkJYnJlYWs7CiAJCX0KZGlmZiAtLWdpdCBhL25ldC9pcHY2L0tjb25maWcgYi9uZXQvaXB2Ni9LY29uZmlnCmluZGV4IGE0NjBlODEuLjZlNDhmNTIgMTAwNjQ0Ci0tLSBhL25ldC9pcHY2L0tjb25maWcKKysrIGIvbmV0L2lwdjYvS2NvbmZpZwpAQCAtMTUzLDYgKzE1MywxOSBAQAogCS0tLWhlbHAtLS0KIAkgIFN1cHBvcnQgZm9yIE1JUHY2IHJvdXRlIG9wdGltaXphdGlvbiBtb2RlLgogCitjb25maWcgSVBWNl9TSVQKKwl0cmlzdGF0ZSAiSVB2NjogSVB2Ni1pbi1JUHY0IHR1bm5lbCAoU0lUIGRyaXZlcikiCisJZGVwZW5kcyBvbiBJUFY2CisJZGVmYXVsdCB5CisJLS0taGVscC0tLQorCSAgVHVubmVsaW5nIG1lYW5zIGVuY2Fwc3VsYXRpbmcgZGF0YSBvZiBvbmUgcHJvdG9jb2wgdHlwZSB3aXRoaW4KKwkgIGFub3RoZXIgcHJvdG9jb2wgYW5kIHNlbmRpbmcgaXQgb3ZlciBhIGNoYW5uZWwgdGhhdCB1bmRlcnN0YW5kcyB0aGUKKwkgIGVuY2Fwc3VsYXRpbmcgcHJvdG9jb2wuIFRoaXMgZHJpdmVyIGltcGxlbWVudHMgZW5jYXBzdWxhdGlvbiBvZiBJUHY2CisJICBpbnRvIElQdjQgcGFja2V0cy4gVGhpcyBpcyB1c2VmdWwgaWYgeW91IHdhbnQgdG8gY29ubmVjdCB0d28gSVB2NgorCSAgbmV0d29ya3Mgb3ZlciBhbiBJUHY0LW9ubHkgcGF0aC4KKworCSAgU2F5aW5nIE0gaGVyZSB3aWxsIHByb2R1Y2UgYSBtb2R1bGUgY2FsbGVkIHNpdC5rby4gSWYgdW5zdXJlLCBzYXkgWS4KKwogY29uZmlnIElQVjZfVFVOTkVMCiAJdHJpc3RhdGUgIklQdjY6IElQdjYtaW4tSVB2NiB0dW5uZWwiCiAJc2VsZWN0IElORVQ2X1RVTk5FTApAQCAtMTYyLDkgKzE3NSwxNiBAQAogCiAJICBJZiB1bnN1cmUsIHNheSBOLgogCitjb25maWcgSVBWNl9NVUxUSVBMRV9UQUJMRVMKKwlib29sICJJUHY2OiBNdWx0aXBsZSBSb3V0aW5nIFRhYmxlcyIKKwlkZXBlbmRzIG9uIElQVjYgJiYgRVhQRVJJTUVOVEFMCisJc2VsZWN0IEZJQl9SVUxFUworCS0tLWhlbHAtLS0KKwkgIFN1cHBvcnQgbXVsdGlwbGUgcm91dGluZyB0YWJsZXMuCisKIGNvbmZpZyBJUFY2X1NVQlRSRUVTCiAJYm9vbCAiSVB2Njogc291cmNlIGFkZHJlc3MgYmFzZWQgcm91dGluZyIKLQlkZXBlbmRzIG9uIElQVjYgJiYgRVhQRVJJTUVOVEFMCisJZGVwZW5kcyBvbiBJUFY2X01VTFRJUExFX1RBQkxFUwogCS0tLWhlbHAtLS0KIAkgIEVuYWJsZSByb3V0aW5nIGJ5IHNvdXJjZSBhZGRyZXNzIG9yIHByZWZpeC4KIApAQCAtMTc2LDEzICsxOTYsNiBAQAogCiAJICBJZiB1bnN1cmUsIHNheSBOLgogCi1jb25maWcgSVBWNl9NVUxUSVBMRV9UQUJMRVMKLQlib29sICJJUHY2OiBNdWx0aXBsZSBSb3V0aW5nIFRhYmxlcyIKLQlkZXBlbmRzIG9uIElQVjYgJiYgRVhQRVJJTUVOVEFMCi0Jc2VsZWN0IEZJQl9SVUxFUwotCS0tLWhlbHAtLS0KLQkgIFN1cHBvcnQgbXVsdGlwbGUgcm91dGluZyB0YWJsZXMuCi0KIGNvbmZpZyBJUFY2X1JPVVRFX0ZXTUFSSwogCWJvb2wgIklQdjY6IHVzZSBuZXRmaWx0ZXIgTUFSSyB2YWx1ZSBhcyByb3V0aW5nIGtleSIKIAlkZXBlbmRzIG9uIElQVjZfTVVMVElQTEVfVEFCTEVTICYmIE5FVEZJTFRFUgpkaWZmIC0tZ2l0IGEvbmV0L2lwdjYvTWFrZWZpbGUgYi9uZXQvaXB2Ni9NYWtlZmlsZQppbmRleCA4NzI3NGU0Li5hZGRjYzAxIDEwMDY0NAotLS0gYS9uZXQvaXB2Ni9NYWtlZmlsZQorKysgYi9uZXQvaXB2Ni9NYWtlZmlsZQpAQCAtNCw3ICs0LDcgQEAKIAogb2JqLSQoQ09ORklHX0lQVjYpICs9IGlwdjYubwogCi1pcHY2LW9ianMgOj0JYWZfaW5ldDYubyBhbnljYXN0Lm8gaXA2X291dHB1dC5vIGlwNl9pbnB1dC5vIGFkZHJjb25mLm8gc2l0Lm8gXAoraXB2Ni1vYmpzIDo9CWFmX2luZXQ2Lm8gYW55Y2FzdC5vIGlwNl9vdXRwdXQubyBpcDZfaW5wdXQubyBhZGRyY29uZi5vIFwKIAkJcm91dGUubyBpcDZfZmliLm8gaXB2Nl9zb2NrZ2x1ZS5vIG5kaXNjLm8gdWRwLm8gcmF3Lm8gXAogCQlwcm90b2NvbC5vIGljbXAubyBtY2FzdC5vIHJlYXNzZW1ibHkubyB0Y3BfaXB2Ni5vIFwKIAkJZXh0aGRycy5vIHN5c2N0bF9uZXRfaXB2Ni5vIGRhdGFncmFtLm8gcHJvYy5vIFwKQEAgLTI5LDYgKzI5LDcgQEAKIG9iai0kKENPTkZJR19JTkVUNl9YRlJNX01PREVfQkVFVCkgKz0geGZybTZfbW9kZV9iZWV0Lm8KIG9iai0kKENPTkZJR19ORVRGSUxURVIpCSs9IG5ldGZpbHRlci8KIAorb2JqLSQoQ09ORklHX0lQVjZfU0lUKSArPSBzaXQubwogb2JqLSQoQ09ORklHX0lQVjZfVFVOTkVMKSArPSBpcDZfdHVubmVsLm8KIAogb2JqLXkgKz0gZXh0aGRyc19jb3JlLm8KZGlmZiAtLWdpdCBhL25ldC9pcHY2L2FkZHJjb25mLmMgYi9uZXQvaXB2Ni9hZGRyY29uZi5jCmluZGV4IGUwM2MzM2IuLmIzMTJhNWYgMTAwNjQ0Ci0tLSBhL25ldC9pcHY2L2FkZHJjb25mLmMKKysrIGIvbmV0L2lwdjYvYWRkcmNvbmYuYwpAQCAtMzk2LDggKzM5NiwxMCBAQAogCW5kZXYtPnJlZ2VuX3RpbWVyLmRhdGEgPSAodW5zaWduZWQgbG9uZykgbmRldjsKIAlpZiAoKGRldi0+ZmxhZ3MmSUZGX0xPT1BCQUNLKSB8fAogCSAgICBkZXYtPnR5cGUgPT0gQVJQSFJEX1RVTk5FTCB8fAotCSAgICBkZXYtPnR5cGUgPT0gQVJQSFJEX05PTkUgfHwKLQkgICAgZGV2LT50eXBlID09IEFSUEhSRF9TSVQpIHsKKyNpZiBkZWZpbmVkKENPTkZJR19JUFY2X1NJVCkgfHwgZGVmaW5lZChDT05GSUdfSVBWNl9TSVRfTU9EVUxFKQorCSAgICBkZXYtPnR5cGUgPT0gQVJQSFJEX1NJVCB8fAorI2VuZGlmCisJICAgIGRldi0+dHlwZSA9PSBBUlBIUkRfTk9ORSkgewogCQlwcmludGsoS0VSTl9JTkZPCiAJCSAgICAgICAiJXM6IERpc2FibGVkIFByaXZhY3kgRXh0ZW5zaW9uc1xuIiwKIAkJICAgICAgIGRldi0+bmFtZSk7CkBAIC0xNTQ2LDggKzE1NDgsMTAgQEAKIAkgICBUaGlzIHRoaW5nIGlzIGRvbmUgaGVyZSBleHBlY3RpbmcgdGhhdCB0aGUgd2hvbGUKIAkgICBjbGFzcyBvZiBub24tYnJvYWRjYXN0IGRldmljZXMgbmVlZCBub3QgY2xvbmluZy4KIAkgKi8KKyNpZiBkZWZpbmVkKENPTkZJR19JUFY2X1NJVCkgfHwgZGVmaW5lZChDT05GSUdfSVBWNl9TSVRfTU9EVUxFKQogCWlmIChkZXYtPnR5cGUgPT0gQVJQSFJEX1NJVCAmJiAoZGV2LT5mbGFncyAmIElGRl9QT0lOVE9QT0lOVCkpCiAJCWNmZy5mY19mbGFncyB8PSBSVEZfTk9ORVhUSE9QOworI2VuZGlmCiAKIAlpcDZfcm91dGVfYWRkKCZjZmcpOwogfQpAQCAtMTU2OSw2ICsxNTczLDcgQEAKIAlpcDZfcm91dGVfYWRkKCZjZmcpOwogfQogCisjaWYgZGVmaW5lZChDT05GSUdfSVBWNl9TSVQpIHx8IGRlZmluZWQoQ09ORklHX0lQVjZfU0lUX01PRFVMRSkKIHN0YXRpYyB2b2lkIHNpdF9yb3V0ZV9hZGQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKIHsKIAlzdHJ1Y3QgZmliNl9jb25maWcgY2ZnID0gewpAQCAtMTU4Miw2ICsxNTg3LDcgQEAKIAkvKiBwcmVmaXggbGVuZ3RoIC0gOTYgYml0cyAiOjpkLmQuZC5kIiAqLwogCWlwNl9yb3V0ZV9hZGQoJmNmZyk7CiB9CisjZW5kaWYKIAogc3RhdGljIHZvaWQgYWRkcmNvbmZfYWRkX2xyb3V0ZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewpAQCAtMTg1Miw2ICsxODU4LDcgQEAKIAlpZiAoZGV2ID09IE5VTEwpCiAJCWdvdG8gZXJyX2V4aXQ7CiAKKyNpZiBkZWZpbmVkKENPTkZJR19JUFY2X1NJVCkgfHwgZGVmaW5lZChDT05GSUdfSVBWNl9TSVRfTU9EVUxFKQogCWlmIChkZXYtPnR5cGUgPT0gQVJQSFJEX1NJVCkgewogCQlzdHJ1Y3QgaWZyZXEgaWZyOwogCQltbV9zZWdtZW50X3QJb2xkZnM7CkBAIC0xODgxLDYgKzE4ODgsNyBAQAogCQkJZXJyID0gZGV2X29wZW4oZGV2KTsKIAkJfQogCX0KKyNlbmRpZgogCiBlcnJfZXhpdDoKIAlydG5sX3VubG9jaygpOwpAQCAtMjAxMCw2ICsyMDE4LDcgQEAKIAlyZXR1cm4gZXJyOwogfQogCisjaWYgZGVmaW5lZChDT05GSUdfSVBWNl9TSVQpIHx8IGRlZmluZWQoQ09ORklHX0lQVjZfU0lUX01PRFVMRSkKIHN0YXRpYyB2b2lkIHNpdF9hZGRfdjRfYWRkcnMoc3RydWN0IGluZXQ2X2RldiAqaWRldikKIHsKIAlzdHJ1Y3QgaW5ldDZfaWZhZGRyICogaWZwOwpAQCAtMjA3OCw2ICsyMDg3LDcgQEAKIAkJfQogICAgICAgICB9CiB9CisjZW5kaWYKIAogc3RhdGljIHZvaWQgaW5pdF9sb29wYmFjayhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewpAQCAtMjE0MSw2ICsyMTUxLDcgQEAKIAkJYWRkcmNvbmZfYWRkX2xpbmtsb2NhbChpZGV2LCAmYWRkcik7CiB9CiAKKyNpZiBkZWZpbmVkKENPTkZJR19JUFY2X1NJVCkgfHwgZGVmaW5lZChDT05GSUdfSVBWNl9TSVRfTU9EVUxFKQogc3RhdGljIHZvaWQgYWRkcmNvbmZfc2l0X2NvbmZpZyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewogCXN0cnVjdCBpbmV0Nl9kZXYgKmlkZXY7CkBAIC0yMTY2LDYgKzIxNzcsNyBAQAogCX0gZWxzZQogCQlzaXRfcm91dGVfYWRkKGRldik7CiB9CisjZW5kaWYKIAogc3RhdGljIGlubGluZSBpbnQKIGlwdjZfaW5oZXJpdF9saW5rbG9jYWwoc3RydWN0IGluZXQ2X2RldiAqaWRldiwgc3RydWN0IG5ldF9kZXZpY2UgKmxpbmtfZGV2KQpAQCAtMjI2MCw5ICsyMjcyLDExIEBACiAJCX0KIAogCQlzd2l0Y2goZGV2LT50eXBlKSB7CisjaWYgZGVmaW5lZChDT05GSUdfSVBWNl9TSVQpIHx8IGRlZmluZWQoQ09ORklHX0lQVjZfU0lUX01PRFVMRSkKIAkJY2FzZSBBUlBIUkRfU0lUOgogCQkJYWRkcmNvbmZfc2l0X2NvbmZpZyhkZXYpOwogCQkJYnJlYWs7CisjZW5kaWYKIAkJY2FzZSBBUlBIUkRfVFVOTkVMNjoKIAkJCWFkZHJjb25mX2lwNl90bmxfY29uZmlnKGRldik7CiAJCQlicmVhazsKZGlmZiAtLWdpdCBhL25ldC9pcHY2L2FmX2luZXQ2LmMgYi9uZXQvaXB2Ni9hZl9pbmV0Ni5jCmluZGV4IGU5NGVjY2IuLjg1OGNhZTIgMTAwNjQ0Ci0tLSBhL25ldC9pcHY2L2FmX2luZXQ2LmMKKysrIGIvbmV0L2lwdjYvYWZfaW5ldDYuYwpAQCAtODUwLDcgKzg1MCw2IEBACiAJZXJyID0gYWRkcmNvbmZfaW5pdCgpOwogCWlmIChlcnIpCiAJCWdvdG8gYWRkcmNvbmZfZmFpbDsKLQlzaXRfaW5pdCgpOwogCiAJLyogSW5pdCB2NiBleHRlbnNpb24gaGVhZGVycy4gKi8KIAlpcHY2X3J0aGRyX2luaXQoKTsKQEAgLTkyNyw3ICs5MjYsNiBAQAogCW1pcDZfZmluaSgpOwogI2VuZGlmCiAJLyogQ2xlYW51cCBjb2RlIHBhcnRzLiAqLwotCXNpdF9jbGVhbnVwKCk7CiAJaXA2X2Zsb3dsYWJlbF9jbGVhbnVwKCk7CiAJYWRkcmNvbmZfY2xlYW51cCgpOwogCWlwNl9yb3V0ZV9jbGVhbnVwKCk7CmRpZmYgLS1naXQgYS9uZXQvaXB2Ni9maWI2X3J1bGVzLmMgYi9uZXQvaXB2Ni9maWI2X3J1bGVzLmMKaW5kZXggZDhjMTA1Ny4uMTg5NmVjYiAxMDA2NDQKLS0tIGEvbmV0L2lwdjYvZmliNl9ydWxlcy5jCisrKyBiL25ldC9pcHY2L2ZpYjZfcnVsZXMuYwpAQCAtMTE3LDEyICsxMTcsMTUgQEAKIHsKIAlzdHJ1Y3QgZmliNl9ydWxlICpyID0gKHN0cnVjdCBmaWI2X3J1bGUgKikgcnVsZTsKIAotCWlmICghaXB2Nl9wcmVmaXhfZXF1YWwoJmZsLT5mbDZfZHN0LCAmci0+ZHN0LmFkZHIsIHItPmRzdC5wbGVuKSkKKwlpZiAoci0+ZHN0LnBsZW4gJiYKKwkgICAgIWlwdjZfcHJlZml4X2VxdWFsKCZmbC0+Zmw2X2RzdCwgJnItPmRzdC5hZGRyLCByLT5kc3QucGxlbikpCiAJCXJldHVybiAwOwogCi0JaWYgKChmbGFncyAmIFJUNl9MT09LVVBfRl9IQVNfU0FERFIpICYmCi0JICAgICFpcHY2X3ByZWZpeF9lcXVhbCgmZmwtPmZsNl9zcmMsICZyLT5zcmMuYWRkciwgci0+c3JjLnBsZW4pKQotCQlyZXR1cm4gMDsKKwlpZiAoci0+c3JjLnBsZW4pIHsKKwkJaWYgKCEoZmxhZ3MgJiBSVDZfTE9PS1VQX0ZfSEFTX1NBRERSKSB8fAorCQkgICAgIWlwdjZfcHJlZml4X2VxdWFsKCZmbC0+Zmw2X3NyYywgJnItPnNyYy5hZGRyLCByLT5zcmMucGxlbikpCisJCQlyZXR1cm4gMDsKKwl9CiAKIAlpZiAoci0+dGNsYXNzICYmIHItPnRjbGFzcyAhPSAoKG50b2hsKGZsLT5mbDZfZmxvd2xhYmVsKSA+PiAyMCkgJiAweGZmKSkKIAkJcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9uZXQvaXB2Ni9pcDZfZmliLmMgYi9uZXQvaXB2Ni9pcDZfZmliLmMKaW5kZXggOGZjYWU3YS4uZjk4Y2EzMCAxMDA2NDQKLS0tIGEvbmV0L2lwdjYvaXA2X2ZpYi5jCisrKyBiL25ldC9pcHY2L2lwNl9maWIuYwpAQCAtMTY5LDcgKzE2OSw2IEBACiAKIHN0YXRpYyBzdHJ1Y3QgZmliNl90YWJsZSBmaWI2X21haW5fdGJsID0gewogCS50YjZfaWQJCT0gUlQ2X1RBQkxFX01BSU4sCi0JLnRiNl9sb2NrCT0gUldfTE9DS19VTkxPQ0tFRCwKIAkudGI2X3Jvb3QJPSB7CiAJCS5sZWFmCQk9ICZpcDZfbnVsbF9lbnRyeSwKIAkJLmZuX2ZsYWdzCT0gUlROX1JPT1QgfCBSVE5fVExfUk9PVCB8IFJUTl9SVElORk8sCkBAIC0xODcsNiArMTg2LDEyIEBACiB7CiAJdW5zaWduZWQgaW50IGg7CiAKKwkvKgorCSAqIEluaXRpYWxpemUgdGFibGUgbG9jayBhdCBhIHNpbmdsZSBwbGFjZSB0byBnaXZlIGxvY2tkZXAgYSBrZXksCisJICogdGFibGVzIGFyZW4ndCB2aXNpYmxlIHByaW9yIHRvIGJlaW5nIGxpbmtlZCB0byB0aGUgbGlzdC4KKwkgKi8KKwlyd2xvY2tfaW5pdCgmdGItPnRiNl9sb2NrKTsKKwogCWggPSB0Yi0+dGI2X2lkICYgKEZJQl9UQUJMRV9IQVNIU1ogLSAxKTsKIAogCS8qCkBAIC0xOTksNyArMjA0LDYgQEAKICNpZmRlZiBDT05GSUdfSVBWNl9NVUxUSVBMRV9UQUJMRVMKIHN0YXRpYyBzdHJ1Y3QgZmliNl90YWJsZSBmaWI2X2xvY2FsX3RibCA9IHsKIAkudGI2X2lkCQk9IFJUNl9UQUJMRV9MT0NBTCwKLQkudGI2X2xvY2sJPSBSV19MT0NLX1VOTE9DS0VELAogCS50YjZfcm9vdCAJPSB7CiAJCS5sZWFmCQk9ICZpcDZfbnVsbF9lbnRyeSwKIAkJLmZuX2ZsYWdzCT0gUlROX1JPT1QgfCBSVE5fVExfUk9PVCB8IFJUTl9SVElORk8sCkBAIC0yMTMsNyArMjE3LDYgQEAKIAl0YWJsZSA9IGt6YWxsb2Moc2l6ZW9mKCp0YWJsZSksIEdGUF9BVE9NSUMpOwogCWlmICh0YWJsZSAhPSBOVUxMKSB7CiAJCXRhYmxlLT50YjZfaWQgPSBpZDsKLQkJdGFibGUtPnRiNl9sb2NrID0gUldfTE9DS19VTkxPQ0tFRDsKIAkJdGFibGUtPnRiNl9yb290LmxlYWYgPSAmaXA2X251bGxfZW50cnk7CiAJCXRhYmxlLT50YjZfcm9vdC5mbl9mbGFncyA9IFJUTl9ST09UIHwgUlROX1RMX1JPT1QgfCBSVE5fUlRJTkZPOwogCX0KZGlmZiAtLWdpdCBhL25ldC9pcHY2L2lwNl9mbG93bGFiZWwuYyBiL25ldC9pcHY2L2lwNl9mbG93bGFiZWwuYwppbmRleCAxZDY3MmIwLi42ZDQ1MzNiIDEwMDY0NAotLS0gYS9uZXQvaXB2Ni9pcDZfZmxvd2xhYmVsLmMKKysrIGIvbmV0L2lwdjYvaXA2X2Zsb3dsYWJlbC5jCkBAIC0zMzAsOCArMzMwLDEwIEBACiAJZmwtPnNoYXJlID0gZnJlcS0+ZmxyX3NoYXJlOwogCWFkZHJfdHlwZSA9IGlwdjZfYWRkcl90eXBlKCZmcmVxLT5mbHJfZHN0KTsKIAlpZiAoKGFkZHJfdHlwZSZJUFY2X0FERFJfTUFQUEVEKQotCSAgICB8fCBhZGRyX3R5cGUgPT0gSVBWNl9BRERSX0FOWSkKKwkgICAgfHwgYWRkcl90eXBlID09IElQVjZfQUREUl9BTlkpIHsKKwkJZXJyID0gLUVJTlZBTDsKIAkJZ290byBkb25lOworCX0KIAlpcHY2X2FkZHJfY29weSgmZmwtPmRzdCwgJmZyZXEtPmZscl9kc3QpOwogCWF0b21pY19zZXQoJmZsLT51c2VycywgMSk7CiAJc3dpdGNoIChmbC0+c2hhcmUpIHsKQEAgLTU4Nyw2ICs1ODksOCBAQAogCXdoaWxlICghZmwpIHsKIAkJaWYgKCsrc3RhdGUtPmJ1Y2tldCA8PSBGTF9IQVNIX01BU0spCiAJCQlmbCA9IGZsX2h0W3N0YXRlLT5idWNrZXRdOworCQllbHNlCisJCQlicmVhazsKIAl9CiAJcmV0dXJuIGZsOwogfQpAQCAtNjIzLDkgKzYyNywxMyBAQAogCXJlYWRfdW5sb2NrX2JoKCZpcDZfZmxfbG9jayk7CiB9CiAKLXN0YXRpYyB2b2lkIGlwNmZsX2ZsX3NlcV9zaG93KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCBzdHJ1Y3QgaXA2X2Zsb3dsYWJlbCAqZmwpCitzdGF0aWMgaW50IGlwNmZsX3NlcV9zaG93KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICp2KQogewotCXdoaWxlKGZsKSB7CisJaWYgKHYgPT0gU0VRX1NUQVJUX1RPS0VOKQorCQlzZXFfcHJpbnRmKHNlcSwgIiUtNXMgJS0xcyAlLTZzICUtNnMgJS02cyAlLThzICUtMzJzICVzXG4iLAorCQkJICAgIkxhYmVsIiwgIlMiLCAiT3duZXIiLCAiVXNlcnMiLCAiTGluZ2VyIiwgIkV4cGlyZXMiLCAiRHN0IiwgIk9wdCIpOworCWVsc2UgeworCQlzdHJ1Y3QgaXA2X2Zsb3dsYWJlbCAqZmwgPSB2OwogCQlzZXFfcHJpbnRmKHNlcSwKIAkJCSAgICIlMDVYICUtMWQgJS02ZCAlLTZkICUtNmxkICUtOGxkICIgTklQNl9TRVFGTVQgIiAlLTRkXG4iLAogCQkJICAgKHVuc2lnbmVkKW50b2hsKGZsLT5sYWJlbCksCkBAIC02MzYsMTcgKzY0NCw3IEBACiAJCQkgICAobG9uZykoZmwtPmV4cGlyZXMgLSBqaWZmaWVzKS9IWiwKIAkJCSAgIE5JUDYoZmwtPmRzdCksCiAJCQkgICBmbC0+b3B0ID8gZmwtPm9wdC0+b3B0X25mbGVuIDogMCk7Ci0JCWZsID0gZmwtPm5leHQ7CiAJfQotfQotCi1zdGF0aWMgaW50IGlwNmZsX3NlcV9zaG93KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICp2KQotewotCWlmICh2ID09IFNFUV9TVEFSVF9UT0tFTikKLQkJc2VxX3ByaW50ZihzZXEsICIlLTVzICUtMXMgJS02cyAlLTZzICUtNnMgJS04cyAlLTMycyAlc1xuIiwKLQkJCSAgICJMYWJlbCIsICJTIiwgIk93bmVyIiwgIlVzZXJzIiwgIkxpbmdlciIsICJFeHBpcmVzIiwgIkRzdCIsICJPcHQiKTsKLQllbHNlCi0JCWlwNmZsX2ZsX3NlcV9zaG93KHNlcSwgdik7CiAJcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL25ldC9pcHY2L2lwNl90dW5uZWwuYyBiL25ldC9pcHY2L2lwNl90dW5uZWwuYwppbmRleCA4NGQ3ZWJkLi5iOWY0MDI5IDEwMDY0NAotLS0gYS9uZXQvaXB2Ni9pcDZfdHVubmVsLmMKKysrIGIvbmV0L2lwdjYvaXA2X3R1bm5lbC5jCkBAIC01NDIsNiArNTQyLDcgQEAKIAkJc2tiLT5kZXYgPSB0LT5kZXY7CiAJCWRzdF9yZWxlYXNlKHNrYi0+ZHN0KTsKIAkJc2tiLT5kc3QgPSBOVUxMOworCQluZl9yZXNldChza2IpOwogCQlpZiAodC0+cGFybXMuZmxhZ3MgJiBJUDZfVE5MX0ZfUkNWX0RTQ1BfQ09QWSkKIAkJCWlwdjZfY29weV9kc2NwKGlwdjZoLCBza2ItPm5oLmlwdjZoKTsKIAkJaXA2aXA2X2Vjbl9kZWNhcHN1bGF0ZShpcHY2aCwgc2tiKTsKQEAgLTExNDksNiArMTE1MCwyMCBAQAogCXJldHVybiBlcnI7CiB9CiAKK3N0YXRpYyB2b2lkIF9fZXhpdCBpcDZpcDZfZGVzdHJveV90dW5uZWxzKHZvaWQpCit7CisJaW50IGg7CisJc3RydWN0IGlwNl90bmwgKnQ7CisKKwlmb3IgKGggPSAwOyBoIDwgSEFTSF9TSVpFOyBoKyspIHsKKwkJd2hpbGUgKCh0ID0gdG5sc19yX2xbaF0pICE9IE5VTEwpCisJCQl1bnJlZ2lzdGVyX25ldGRldmljZSh0LT5kZXYpOworCX0KKworCXQgPSB0bmxzX3djWzBdOworCXVucmVnaXN0ZXJfbmV0ZGV2aWNlKHQtPmRldik7Cit9CisKIC8qKgogICogaXA2X3R1bm5lbF9jbGVhbnVwIC0gZnJlZSByZXNvdXJjZXMgYW5kIHVucmVnaXN0ZXIgcHJvdG9jb2wKICAqKi8KQEAgLTExNTgsNyArMTE3Myw5IEBACiAJaWYgKHhmcm02X3R1bm5lbF9kZXJlZ2lzdGVyKCZpcDZpcDZfaGFuZGxlcikpCiAJCXByaW50ayhLRVJOX0lORk8gImlwNmlwNiBjbG9zZTogY2FuJ3QgZGVyZWdpc3RlciB0dW5uZWxcbiIpOwogCi0JdW5yZWdpc3Rlcl9uZXRkZXYoaXA2aXA2X2ZiX3RubF9kZXYpOworCXJ0bmxfbG9jaygpOworCWlwNmlwNl9kZXN0cm95X3R1bm5lbHMoKTsKKwlydG5sX3VubG9jaygpOwogfQogCiBtb2R1bGVfaW5pdChpcDZfdHVubmVsX2luaXQpOwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjYvbmRpc2MuYyBiL25ldC9pcHY2L25kaXNjLmMKaW5kZXggMDMwNGI1Zi4uNzNlYjhjMyAxMDA2NDQKLS0tIGEvbmV0L2lwdjYvbmRpc2MuYworKysgYi9uZXQvaXB2Ni9uZGlzYy5jCkBAIC05NjcsOCArOTY3LDYgQEAKIAkJICAgIGlwdjZfZGV2Y29uZi5mb3J3YXJkaW5nICYmIGlwdjZfZGV2Y29uZi5wcm94eV9uZHAgJiYKIAkJICAgIHBuZWlnaF9sb29rdXAoJm5kX3RibCwgJm1zZy0+dGFyZ2V0LCBkZXYsIDApKSB7CiAJCQkvKiBYWFg6IGlkZXYtPmNuZi5wcml4eV9uZHAgKi8KLQkJCVdBUk5fT04oc2tiLT5kc3QgIT0gTlVMTCAmJgotCQkJCSgoc3RydWN0IHJ0Nl9pbmZvICopc2tiLT5kc3QpLT5ydDZpX2lkZXYpOwogCQkJZ290byBvdXQ7CiAJCX0KIApAQCAtMTc0NCw2ICsxNzQyLDcgQEAKIAogdm9pZCBuZGlzY19jbGVhbnVwKHZvaWQpCiB7CisJdW5yZWdpc3Rlcl9uZXRkZXZpY2Vfbm90aWZpZXIoJm5kaXNjX25ldGRldl9ub3RpZmllcik7CiAjaWZkZWYgQ09ORklHX1NZU0NUTAogCW5laWdoX3N5c2N0bF91bnJlZ2lzdGVyKCZuZF90YmwucGFybXMpOwogI2VuZGlmCmRpZmYgLS1naXQgYS9uZXQvaXB2Ni9uZXRmaWx0ZXIvS2NvbmZpZyBiL25ldC9pcHY2L25ldGZpbHRlci9LY29uZmlnCmluZGV4IDRiYzRlNWIuLmQ3YzQ1YTljIDEwMDY0NAotLS0gYS9uZXQvaXB2Ni9uZXRmaWx0ZXIvS2NvbmZpZworKysgYi9uZXQvaXB2Ni9uZXRmaWx0ZXIvS2NvbmZpZwpAQCAtNDAsNyArNDAsNyBAQAogCSAgVG8gY29tcGlsZSBpdCBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZS4gIElmIHVuc3VyZSwgc2F5IE4uCiAKIGNvbmZpZyBJUDZfTkZfSVBUQUJMRVMKLQl0cmlzdGF0ZSAiSVA2IHRhYmxlcyBzdXBwb3J0IChyZXF1aXJlZCBmb3IgZmlsdGVyaW5nL21hc3EvTkFUKSIKKwl0cmlzdGF0ZSAiSVA2IHRhYmxlcyBzdXBwb3J0IChyZXF1aXJlZCBmb3IgZmlsdGVyaW5nKSIKIAlkZXBlbmRzIG9uIE5FVEZJTFRFUl9YVEFCTEVTCiAJaGVscAogCSAgaXA2dGFibGVzIGlzIGEgZ2VuZXJhbCwgZXh0ZW5zaWJsZSBwYWNrZXQgaWRlbnRpZmljYXRpb24gZnJhbWV3b3JrLgpkaWZmIC0tZ2l0IGEvbmV0L2lwdjYvbmV0ZmlsdGVyL2lwNl9xdWV1ZS5jIGIvbmV0L2lwdjYvbmV0ZmlsdGVyL2lwNl9xdWV1ZS5jCmluZGV4IDk1MTBjMjQuLjlmZWM4MzIgMTAwNjQ0Ci0tLSBhL25ldC9pcHY2L25ldGZpbHRlci9pcDZfcXVldWUuYworKysgYi9uZXQvaXB2Ni9uZXRmaWx0ZXIvaXA2X3F1ZXVlLmMKQEAgLTM0OSw5ICszNDksMTAgQEAKIAlpZiAodi0+ZGF0YV9sZW4gPCBzaXplb2YoKnVzZXJfaXBoKSkKIAkJcmV0dXJuIDA7CiAJZGlmZiA9IHYtPmRhdGFfbGVuIC0gZS0+c2tiLT5sZW47Ci0JaWYgKGRpZmYgPCAwKQotCQlza2JfdHJpbShlLT5za2IsIHYtPmRhdGFfbGVuKTsKLQllbHNlIGlmIChkaWZmID4gMCkgeworCWlmIChkaWZmIDwgMCkgeworCQlpZiAocHNrYl90cmltKGUtPnNrYiwgdi0+ZGF0YV9sZW4pKQorCQkJcmV0dXJuIC1FTk9NRU07CisJfSBlbHNlIGlmIChkaWZmID4gMCkgewogCQlpZiAodi0+ZGF0YV9sZW4gPiAweEZGRkYpCiAJCQlyZXR1cm4gLUVJTlZBTDsKIAkJaWYgKGRpZmYgPiBza2JfdGFpbHJvb20oZS0+c2tiKSkgewpkaWZmIC0tZ2l0IGEvbmV0L2lwdjYvbmV0ZmlsdGVyL2lwNl90YWJsZXMuYyBiL25ldC9pcHY2L25ldGZpbHRlci9pcDZfdGFibGVzLmMKaW5kZXggNGFiMzY4Zi4uMjA0ZTAyMSAxMDA2NDQKLS0tIGEvbmV0L2lwdjYvbmV0ZmlsdGVyL2lwNl90YWJsZXMuYworKysgYi9uZXQvaXB2Ni9uZXRmaWx0ZXIvaXA2X3RhYmxlcy5jCkBAIC0xMTEsNyArMTExLDcgQEAKIAkJIGNvbnN0IGNoYXIgKm91dGRldiwKIAkJIGNvbnN0IHN0cnVjdCBpcDZ0X2lwNiAqaXA2aW5mbywKIAkJIHVuc2lnbmVkIGludCAqcHJvdG9mZiwKLQkJIGludCAqZnJhZ29mZikKKwkJIGludCAqZnJhZ29mZiwgaW50ICpob3Rkcm9wKQogewogCXNpemVfdCBpOwogCXVuc2lnbmVkIGxvbmcgcmV0OwpAQCAtMTY5LDkgKzE2OSwxMSBAQAogCQl1bnNpZ25lZCBzaG9ydCBfZnJhZ19vZmY7CiAKIAkJcHJvdG9oZHIgPSBpcHY2X2ZpbmRfaGRyKHNrYiwgcHJvdG9mZiwgLTEsICZfZnJhZ19vZmYpOwotCQlpZiAocHJvdG9oZHIgPCAwKQorCQlpZiAocHJvdG9oZHIgPCAwKSB7CisJCQlpZiAoX2ZyYWdfb2ZmID09IDApCisJCQkJKmhvdGRyb3AgPSAxOwogCQkJcmV0dXJuIDA7Ci0KKwkJfQogCQkqZnJhZ29mZiA9IF9mcmFnX29mZjsKIAogCQlkcHJpbnRmKCJQYWNrZXQgcHJvdG9jb2wgJWhpID89ICVzJWhpLlxuIiwKQEAgLTI5MCw3ICsyOTIsNyBAQAogCQlJUF9ORl9BU1NFUlQoZSk7CiAJCUlQX05GX0FTU0VSVChiYWNrKTsKIAkJaWYgKGlwNl9wYWNrZXRfbWF0Y2goKnBza2IsIGluZGV2LCBvdXRkZXYsICZlLT5pcHY2LAotCQkJJnByb3RvZmYsICZvZmZzZXQpKSB7CisJCQkmcHJvdG9mZiwgJm9mZnNldCwgJmhvdGRyb3ApKSB7CiAJCQlzdHJ1Y3QgaXA2dF9lbnRyeV90YXJnZXQgKnQ7CiAKIAkJCWlmIChJUDZUX01BVENIX0lURVJBVEUoZSwgZG9fbWF0Y2gsCkBAIC01ODQsMTIgKzU4NiwxOSBAQAogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKKwlpZiAoZS0+dGFyZ2V0X29mZnNldCArIHNpemVvZihzdHJ1Y3QgaXA2dF9lbnRyeV90YXJnZXQpID4KKwkJCQkJCQkJZS0+bmV4dF9vZmZzZXQpCisJCXJldHVybiAtRUlOVkFMOworCiAJaiA9IDA7CiAJcmV0ID0gSVA2VF9NQVRDSF9JVEVSQVRFKGUsIGNoZWNrX21hdGNoLCBuYW1lLCAmZS0+aXB2NiwgZS0+Y29tZWZyb20sICZqKTsKIAlpZiAocmV0ICE9IDApCiAJCWdvdG8gY2xlYW51cF9tYXRjaGVzOwogCiAJdCA9IGlwNnRfZ2V0X3RhcmdldChlKTsKKwlyZXQgPSAtRUlOVkFMOworCWlmIChlLT50YXJnZXRfb2Zmc2V0ICsgdC0+dS50YXJnZXRfc2l6ZSA+IGUtPm5leHRfb2Zmc2V0KQorCQkJZ290byBjbGVhbnVwX21hdGNoZXM7CiAJdGFyZ2V0ID0gdHJ5X3RoZW5fcmVxdWVzdF9tb2R1bGUoeHRfZmluZF90YXJnZXQoQUZfSU5FVDYsCiAJCQkJCQkJdC0+dS51c2VyLm5hbWUsCiAJCQkJCQkJdC0+dS51c2VyLnJldmlzaW9uKSwKQEAgLTc0OSwxOSArNzU4LDE3IEBACiAJCX0KIAl9CiAKLQlpZiAoIW1hcmtfc291cmNlX2NoYWlucyhuZXdpbmZvLCB2YWxpZF9ob29rcywgZW50cnkwKSkKLQkJcmV0dXJuIC1FTE9PUDsKLQogCS8qIEZpbmFsbHksIGVhY2ggc2FuaXR5IGNoZWNrIG11c3QgcGFzcyAqLwogCWkgPSAwOwogCXJldCA9IElQNlRfRU5UUllfSVRFUkFURShlbnRyeTAsIG5ld2luZm8tPnNpemUsCiAJCQkJY2hlY2tfZW50cnksIG5hbWUsIHNpemUsICZpKTsKIAotCWlmIChyZXQgIT0gMCkgewotCQlJUDZUX0VOVFJZX0lURVJBVEUoZW50cnkwLCBuZXdpbmZvLT5zaXplLAotCQkJCSAgY2xlYW51cF9lbnRyeSwgJmkpOwotCQlyZXR1cm4gcmV0OwotCX0KKwlpZiAocmV0ICE9IDApCisJCWdvdG8gY2xlYW51cDsKKworCXJldCA9IC1FTE9PUDsKKwlpZiAoIW1hcmtfc291cmNlX2NoYWlucyhuZXdpbmZvLCB2YWxpZF9ob29rcywgZW50cnkwKSkKKwkJZ290byBjbGVhbnVwOwogCiAJLyogQW5kIG9uZSBjb3B5IGZvciBldmVyeSBvdGhlciBDUFUgKi8KIAlmb3JfZWFjaF9wb3NzaWJsZV9jcHUoaSkgewpAQCAtNzY5LDYgKzc3Niw5IEBACiAJCQltZW1jcHkobmV3aW5mby0+ZW50cmllc1tpXSwgZW50cnkwLCBuZXdpbmZvLT5zaXplKTsKIAl9CiAKKwlyZXR1cm4gMDsKK2NsZWFudXA6CisJSVA2VF9FTlRSWV9JVEVSQVRFKGVudHJ5MCwgbmV3aW5mby0+c2l6ZSwgY2xlYW51cF9lbnRyeSwgJmkpOwogCXJldHVybiByZXQ7CiB9CiAKQEAgLTE0MzgsNiArMTQ0OCw5IEBACiAgKiBJZiB0YXJnZXQgaGVhZGVyIGlzIGZvdW5kLCBpdHMgb2Zmc2V0IGlzIHNldCBpbiAqb2Zmc2V0IGFuZCByZXR1cm4gcHJvdG9jb2wKICAqIG51bWJlci4gT3RoZXJ3aXNlLCByZXR1cm4gLTEuCiAgKgorICogSWYgdGhlIGZpcnN0IGZyYWdtZW50IGRvZXNuJ3QgY29udGFpbiB0aGUgZmluYWwgcHJvdG9jb2wgaGVhZGVyIG9yCisgKiBORVhUSERSX05PTkUgaXQgaXMgY29uc2lkZXJlZCBpbnZhbGlkLgorICoKICAqIE5vdGUgdGhhdCBub24tMXN0IGZyYWdtZW50IGlzIHNwZWNpYWwgY2FzZSB0aGF0ICJ0aGUgcHJvdG9jb2wgbnVtYmVyCiAgKiBvZiBsYXN0IGhlYWRlciIgaXMgIm5leHQgaGVhZGVyIiBmaWVsZCBpbiBGcmFnbWVudCBoZWFkZXIuIEluIHRoaXMgY2FzZSwKICAqICpvZmZzZXQgaXMgbWVhbmluZ2xlc3MgYW5kIGZyYWdtZW50IG9mZnNldCBpcyBzdG9yZWQgaW4gKmZyYWdvZmYgaWYgZnJhZ29mZgpAQCAtMTQ2MSwxMiArMTQ3NCwxMiBAQAogCQlpZiAoKCFpcHY2X2V4dF9oZHIobmV4dGhkcikpIHx8IG5leHRoZHIgPT0gTkVYVEhEUl9OT05FKSB7CiAJCQlpZiAodGFyZ2V0IDwgMCkKIAkJCQlicmVhazsKLQkJCXJldHVybiAtMTsKKwkJCXJldHVybiAtRU5PRU5UOwogCQl9CiAKIAkJaHAgPSBza2JfaGVhZGVyX3BvaW50ZXIoc2tiLCBzdGFydCwgc2l6ZW9mKF9oZHIpLCAmX2hkcik7CiAJCWlmIChocCA9PSBOVUxMKQotCQkJcmV0dXJuIC0xOworCQkJcmV0dXJuIC1FQkFETVNHOwogCQlpZiAobmV4dGhkciA9PSBORVhUSERSX0ZSQUdNRU5UKSB7CiAJCQl1bnNpZ25lZCBzaG9ydCBfZnJhZ19vZmYsICpmcDsKIAkJCWZwID0gc2tiX2hlYWRlcl9wb2ludGVyKHNrYiwKQEAgLTE0NzUsMTggKzE0ODgsMTggQEAKIAkJCQkJCXNpemVvZihfZnJhZ19vZmYpLAogCQkJCQkJJl9mcmFnX29mZik7CiAJCQlpZiAoZnAgPT0gTlVMTCkKLQkJCQlyZXR1cm4gLTE7CisJCQkJcmV0dXJuIC1FQkFETVNHOwogCiAJCQlfZnJhZ19vZmYgPSBudG9ocygqZnApICYgfjB4NzsKIAkJCWlmIChfZnJhZ19vZmYpIHsKIAkJCQlpZiAodGFyZ2V0IDwgMCAmJgogCQkJCSAgICAoKCFpcHY2X2V4dF9oZHIoaHAtPm5leHRoZHIpKSB8fAotCQkJCSAgICAgbmV4dGhkciA9PSBORVhUSERSX05PTkUpKSB7CisJCQkJICAgICBocC0+bmV4dGhkciA9PSBORVhUSERSX05PTkUpKSB7CiAJCQkJCWlmIChmcmFnb2ZmKQogCQkJCQkJKmZyYWdvZmYgPSBfZnJhZ19vZmY7CiAJCQkJCXJldHVybiBocC0+bmV4dGhkcjsKIAkJCQl9Ci0JCQkJcmV0dXJuIC0xOworCQkJCXJldHVybiAtRU5PRU5UOwogCQkJfQogCQkJaGRybGVuID0gODsKIAkJfSBlbHNlIGlmIChuZXh0aGRyID09IE5FWFRIRFJfQVVUSCkKZGlmZiAtLWdpdCBhL25ldC9pcHY2L25ldGZpbHRlci9pcDZ0X2FoLmMgYi9uZXQvaXB2Ni9uZXRmaWx0ZXIvaXA2dF9haC5jCmluZGV4IGVjMWIxNjAuLjQ2NDg2NjQgMTAwNjQ0Ci0tLSBhL25ldC9pcHY2L25ldGZpbHRlci9pcDZ0X2FoLmMKKysrIGIvbmV0L2lwdjYvbmV0ZmlsdGVyL2lwNnRfYWguYwpAQCAtNTQsOSArNTQsMTQgQEAKIAljb25zdCBzdHJ1Y3QgaXA2dF9haCAqYWhpbmZvID0gbWF0Y2hpbmZvOwogCXVuc2lnbmVkIGludCBwdHI7CiAJdW5zaWduZWQgaW50IGhkcmxlbiA9IDA7CisJaW50IGVycjsKIAotCWlmIChpcHY2X2ZpbmRfaGRyKHNrYiwgJnB0ciwgTkVYVEhEUl9BVVRILCBOVUxMKSA8IDApCisJZXJyID0gaXB2Nl9maW5kX2hkcihza2IsICZwdHIsIE5FWFRIRFJfQVVUSCwgTlVMTCk7CisJaWYgKGVyciA8IDApIHsKKwkJaWYgKGVyciAhPSAtRU5PRU5UKQorCQkJKmhvdGRyb3AgPSAxOwogCQlyZXR1cm4gMDsKKwl9CiAKIAlhaCA9IHNrYl9oZWFkZXJfcG9pbnRlcihza2IsIHB0ciwgc2l6ZW9mKF9haCksICZfYWgpOwogCWlmIChhaCA9PSBOVUxMKSB7CmRpZmYgLS1naXQgYS9uZXQvaXB2Ni9uZXRmaWx0ZXIvaXA2dF9mcmFnLmMgYi9uZXQvaXB2Ni9uZXRmaWx0ZXIvaXA2dF9mcmFnLmMKaW5kZXggNzhkOWM4Yi4uY2QyMmVhYSAxMDA2NDQKLS0tIGEvbmV0L2lwdjYvbmV0ZmlsdGVyL2lwNnRfZnJhZy5jCisrKyBiL25ldC9pcHY2L25ldGZpbHRlci9pcDZ0X2ZyYWcuYwpAQCAtNTIsOSArNTIsMTQgQEAKIAlzdHJ1Y3QgZnJhZ19oZHIgX2ZyYWcsICpmaDsKIAljb25zdCBzdHJ1Y3QgaXA2dF9mcmFnICpmcmFnaW5mbyA9IG1hdGNoaW5mbzsKIAl1bnNpZ25lZCBpbnQgcHRyOworCWludCBlcnI7CiAKLQlpZiAoaXB2Nl9maW5kX2hkcihza2IsICZwdHIsIE5FWFRIRFJfRlJBR01FTlQsIE5VTEwpIDwgMCkKKwllcnIgPSBpcHY2X2ZpbmRfaGRyKHNrYiwgJnB0ciwgTkVYVEhEUl9GUkFHTUVOVCwgTlVMTCk7CisJaWYgKGVyciA8IDApIHsKKwkJaWYgKGVyciAhPSAtRU5PRU5UKQorCQkJKmhvdGRyb3AgPSAxOwogCQlyZXR1cm4gMDsKKwl9CiAKIAlmaCA9IHNrYl9oZWFkZXJfcG9pbnRlcihza2IsIHB0ciwgc2l6ZW9mKF9mcmFnKSwgJl9mcmFnKTsKIAlpZiAoZmggPT0gTlVMTCkgewpkaWZmIC0tZ2l0IGEvbmV0L2lwdjYvbmV0ZmlsdGVyL2lwNnRfaGJoLmMgYi9uZXQvaXB2Ni9uZXRmaWx0ZXIvaXA2dF9oYmguYwppbmRleCBkMzJhMjA1Li4zZjI1YmFiIDEwMDY0NAotLS0gYS9uZXQvaXB2Ni9uZXRmaWx0ZXIvaXA2dF9oYmguYworKysgYi9uZXQvaXB2Ni9uZXRmaWx0ZXIvaXA2dF9oYmguYwpAQCAtNjUsOSArNjUsMTQgQEAKIAl1OCBfb3B0dHlwZSwgKnRwID0gTlVMTDsKIAl1OCBfb3B0bGVuLCAqbHAgPSBOVUxMOwogCXVuc2lnbmVkIGludCBvcHRsZW47CisJaW50IGVycjsKIAotCWlmIChpcHY2X2ZpbmRfaGRyKHNrYiwgJnB0ciwgbWF0Y2gtPmRhdGEsIE5VTEwpIDwgMCkKKwllcnIgPSBpcHY2X2ZpbmRfaGRyKHNrYiwgJnB0ciwgbWF0Y2gtPmRhdGEsIE5VTEwpOworCWlmIChlcnIgPCAwKSB7CisJCWlmIChlcnIgIT0gLUVOT0VOVCkKKwkJCSpob3Rkcm9wID0gMTsKIAkJcmV0dXJuIDA7CisJfQogCiAJb2ggPSBza2JfaGVhZGVyX3BvaW50ZXIoc2tiLCBwdHIsIHNpemVvZihfb3B0c2gpLCAmX29wdHNoKTsKIAlpZiAob2ggPT0gTlVMTCkgewpkaWZmIC0tZ2l0IGEvbmV0L2lwdjYvbmV0ZmlsdGVyL2lwNnRfcnQuYyBiL25ldC9pcHY2L25ldGZpbHRlci9pcDZ0X3J0LmMKaW5kZXggYmNiMmUxNi4uNTRkN2QxNCAxMDA2NDQKLS0tIGEvbmV0L2lwdjYvbmV0ZmlsdGVyL2lwNnRfcnQuYworKysgYi9uZXQvaXB2Ni9uZXRmaWx0ZXIvaXA2dF9ydC5jCkBAIC01OCw5ICs1OCwxNCBAQAogCXVuc2lnbmVkIGludCBoZHJsZW4gPSAwOwogCXVuc2lnbmVkIGludCByZXQgPSAwOwogCXN0cnVjdCBpbjZfYWRkciAqYXAsIF9hZGRyOworCWludCBlcnI7CiAKLQlpZiAoaXB2Nl9maW5kX2hkcihza2IsICZwdHIsIE5FWFRIRFJfUk9VVElORywgTlVMTCkgPCAwKQorCWVyciA9IGlwdjZfZmluZF9oZHIoc2tiLCAmcHRyLCBORVhUSERSX1JPVVRJTkcsIE5VTEwpOworCWlmIChlcnIgPCAwKSB7CisJCWlmIChlcnIgIT0gLUVOT0VOVCkKKwkJCSpob3Rkcm9wID0gMTsKIAkJcmV0dXJuIDA7CisJfQogCiAJcmggPSBza2JfaGVhZGVyX3BvaW50ZXIoc2tiLCBwdHIsIHNpemVvZihfcm91dGUpLCAmX3JvdXRlKTsKIAlpZiAocmggPT0gTlVMTCkgewpkaWZmIC0tZ2l0IGEvbmV0L2lwdjYvcmF3LmMgYi9uZXQvaXB2Ni9yYXcuYwppbmRleCBkMDkzMjljLi5kNmRlZGM0IDEwMDY0NAotLS0gYS9uZXQvaXB2Ni9yYXcuYworKysgYi9uZXQvaXB2Ni9yYXcuYwpAQCAtNjA0LDcgKzYwNCw3IEBACiAJcmV0dXJuIGVycjsgCiB9CiAKLXN0YXRpYyB2b2lkIHJhd3Y2X3Byb2JlX3Byb3RvX29wdChzdHJ1Y3QgZmxvd2kgKmZsLCBzdHJ1Y3QgbXNnaGRyICptc2cpCitzdGF0aWMgaW50IHJhd3Y2X3Byb2JlX3Byb3RvX29wdChzdHJ1Y3QgZmxvd2kgKmZsLCBzdHJ1Y3QgbXNnaGRyICptc2cpCiB7CiAJc3RydWN0IGlvdmVjICppb3Y7CiAJdTggX191c2VyICp0eXBlID0gTlVMTDsKQEAgLTYxNiw3ICs2MTYsNyBAQAogCWludCBpOwogCiAJaWYgKCFtc2ctPm1zZ19pb3YpCi0JCXJldHVybjsKKwkJcmV0dXJuIDA7CiAKIAlmb3IgKGkgPSAwOyBpIDwgbXNnLT5tc2dfaW92bGVuOyBpKyspIHsKIAkJaW92ID0gJm1zZy0+bXNnX2lvdltpXTsKQEAgLTYzOCw4ICs2MzgsOSBAQAogCQkJCWNvZGUgPSBpb3YtPmlvdl9iYXNlOwogCiAJCQlpZiAodHlwZSAmJiBjb2RlKSB7Ci0JCQkJZ2V0X3VzZXIoZmwtPmZsX2ljbXBfdHlwZSwgdHlwZSk7Ci0JCQkJZ2V0X3VzZXIoZmwtPmZsX2ljbXBfY29kZSwgY29kZSk7CisJCQkJaWYgKGdldF91c2VyKGZsLT5mbF9pY21wX3R5cGUsIHR5cGUpIHx8CisJCQkJICAgIGdldF91c2VyKGZsLT5mbF9pY21wX2NvZGUsIGNvZGUpKQorCQkJCQlyZXR1cm4gLUVGQVVMVDsKIAkJCQlwcm9iZWQgPSAxOwogCQkJfQogCQkJYnJlYWs7CkBAIC02NTAsNyArNjUxLDggQEAKIAkJCS8qIGNoZWNrIGlmIHR5cGUgZmllbGQgaXMgcmVhZGFibGUgb3Igbm90LiAqLwogCQkJaWYgKGlvdi0+aW92X2xlbiA+IDIgLSBsZW4pIHsKIAkJCQl1OCBfX3VzZXIgKnAgPSBpb3YtPmlvdl9iYXNlOwotCQkJCWdldF91c2VyKGZsLT5mbF9taF90eXBlLCAmcFsyIC0gbGVuXSk7CisJCQkJaWYgKGdldF91c2VyKGZsLT5mbF9taF90eXBlLCAmcFsyIC0gbGVuXSkpCisJCQkJCXJldHVybiAtRUZBVUxUOwogCQkJCXByb2JlZCA9IDE7CiAJCQl9IGVsc2UKIAkJCQlsZW4gKz0gaW92LT5pb3ZfbGVuOwpAQCAtNjY0LDYgKzY2Niw3IEBACiAJCWlmIChwcm9iZWQpCiAJCQlicmVhazsKIAl9CisJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQgcmF3djZfc2VuZG1zZyhzdHJ1Y3Qga2lvY2IgKmlvY2IsIHN0cnVjdCBzb2NrICpzaywKQEAgLTc4Nyw3ICs3OTAsOSBAQAogCW9wdCA9IGlwdjZfZml4dXBfb3B0aW9ucygmb3B0X3NwYWNlLCBvcHQpOwogCiAJZmwucHJvdG8gPSBwcm90bzsKLQlyYXd2Nl9wcm9iZV9wcm90b19vcHQoJmZsLCBtc2cpOworCWVyciA9IHJhd3Y2X3Byb2JlX3Byb3RvX29wdCgmZmwsIG1zZyk7CisJaWYgKGVycikKKwkJZ290byBvdXQ7CiAgCiAJaXB2Nl9hZGRyX2NvcHkoJmZsLmZsNl9kc3QsIGRhZGRyKTsKIAlpZiAoaXB2Nl9hZGRyX2FueSgmZmwuZmw2X3NyYykgJiYgIWlwdjZfYWRkcl9hbnkoJm5wLT5zYWRkcikpCmRpZmYgLS1naXQgYS9uZXQvaXB2Ni9yb3V0ZS5jIGIvbmV0L2lwdjYvcm91dGUuYwppbmRleCBkNmI0YjRmLi5iMzlhZTk5IDEwMDY0NAotLS0gYS9uZXQvaXB2Ni9yb3V0ZS5jCisrKyBiL25ldC9pcHY2L3JvdXRlLmMKQEAgLTE0MSw2ICsxNDEsMTAgQEAKIAogI2lmZGVmIENPTkZJR19JUFY2X01VTFRJUExFX1RBQkxFUwogCitzdGF0aWMgaW50IGlwNl9wa3RfcHJvaGliaXQoc3RydWN0IHNrX2J1ZmYgKnNrYik7CitzdGF0aWMgaW50IGlwNl9wa3RfcHJvaGliaXRfb3V0KHN0cnVjdCBza19idWZmICpza2IpOworc3RhdGljIGludCBpcDZfcGt0X2Jsa19ob2xlKHN0cnVjdCBza19idWZmICpza2IpOworCiBzdHJ1Y3QgcnQ2X2luZm8gaXA2X3Byb2hpYml0X2VudHJ5ID0gewogCS51ID0gewogCQkuZHN0ID0gewpAQCAtMTUwLDggKzE1NCw4IEBACiAJCQkub2Jzb2xldGUJPSAtMSwKIAkJCS5lcnJvcgkJPSAtRUFDQ0VTLAogCQkJLm1ldHJpY3MJPSB7IFtSVEFYX0hPUExJTUlUIC0gMV0gPSAyNTUsIH0sCi0JCQkuaW5wdXQJCT0gaXA2X3BrdF9kaXNjYXJkLAotCQkJLm91dHB1dAkJPSBpcDZfcGt0X2Rpc2NhcmRfb3V0LAorCQkJLmlucHV0CQk9IGlwNl9wa3RfcHJvaGliaXQsCisJCQkub3V0cHV0CQk9IGlwNl9wa3RfcHJvaGliaXRfb3V0LAogCQkJLm9wcwkJPSAmaXA2X2RzdF9vcHMsCiAJCQkucGF0aAkJPSAoc3RydWN0IGRzdF9lbnRyeSopJmlwNl9wcm9oaWJpdF9lbnRyeSwKIAkJfQpAQCAtMTcwLDggKzE3NCw4IEBACiAJCQkub2Jzb2xldGUJPSAtMSwKIAkJCS5lcnJvcgkJPSAtRUlOVkFMLAogCQkJLm1ldHJpY3MJPSB7IFtSVEFYX0hPUExJTUlUIC0gMV0gPSAyNTUsIH0sCi0JCQkuaW5wdXQJCT0gaXA2X3BrdF9kaXNjYXJkLAotCQkJLm91dHB1dAkJPSBpcDZfcGt0X2Rpc2NhcmRfb3V0LAorCQkJLmlucHV0CQk9IGlwNl9wa3RfYmxrX2hvbGUsCisJCQkub3V0cHV0CQk9IGlwNl9wa3RfYmxrX2hvbGUsCiAJCQkub3BzCQk9ICZpcDZfZHN0X29wcywKIAkJCS5wYXRoCQk9IChzdHJ1Y3QgZHN0X2VudHJ5KikmaXA2X2Jsa19ob2xlX2VudHJ5LAogCQl9CkBAIC0zMjYsNiArMzMwLDggQEAKIAkJcmVhZF9sb2NrX2JoKCZuZWlnaC0+bG9jayk7CiAJCWlmIChuZWlnaC0+bnVkX3N0YXRlICYgTlVEX1ZBTElEKQogCQkJbSA9IDI7CisJCWVsc2UgaWYgKCEobmVpZ2gtPm51ZF9zdGF0ZSAmIE5VRF9GQUlMRUQpKQorCQkJbSA9IDE7CiAJCXJlYWRfdW5sb2NrX2JoKCZuZWlnaC0+bG9jayk7CiAJfQogCXJldHVybiBtOwpAQCAtMzQzLDkgKzM0OSw3IEBACiAJbSB8PSBJUFY2X0RFQ09ERV9QUkVGKElQVjZfRVhUUkFDVF9QUkVGKHJ0LT5ydDZpX2ZsYWdzKSkgPDwgMjsKICNlbmRpZgogCW4gPSBydDZfY2hlY2tfbmVpZ2gocnQpOwotCWlmIChuID4gMSkKLQkJbSB8PSAxNjsKLQllbHNlIGlmICghbiAmJiBzdHJpY3QgJiBSVDZfTE9PS1VQX0ZfUkVBQ0hBQkxFKQorCWlmICghbiAmJiAoc3RyaWN0ICYgUlQ2X0xPT0tVUF9GX1JFQUNIQUJMRSkpCiAJCXJldHVybiAtMTsKIAlyZXR1cm4gbTsKIH0KQEAgLTM3NiwxMCArMzgwLDExIEBACiAJCQljb250aW51ZTsKIAogCQlpZiAobSA+IG1wcmkpIHsKLQkJCXJ0Nl9wcm9iZShtYXRjaCk7CisJCQlpZiAoc3RyaWN0ICYgUlQ2X0xPT0tVUF9GX1JFQUNIQUJMRSkKKwkJCQlydDZfcHJvYmUobWF0Y2gpOwogCQkJbWF0Y2ggPSBydDsKIAkJCW1wcmkgPSBtOwotCQl9IGVsc2UgeworCQl9IGVsc2UgaWYgKHN0cmljdCAmIFJUNl9MT09LVVBfRl9SRUFDSEFCTEUpIHsKIAkJCXJ0Nl9wcm9iZShydCk7CiAJCX0KIAl9CkBAIC00ODQsNyArNDg5LDcgQEAKIGRvIHsgXAogCWlmIChydCA9PSAmaXA2X251bGxfZW50cnkpIHsgXAogCQlzdHJ1Y3QgZmliNl9ub2RlICpwbjsgXAotCQl3aGlsZSAoZm4pIHsgXAorCQl3aGlsZSAoMSkgeyBcCiAJCQlpZiAoZm4tPmZuX2ZsYWdzICYgUlROX1RMX1JPT1QpIFwKIAkJCQlnb3RvIG91dDsgXAogCQkJcG4gPSBmbi0+cGFyZW50OyBcCkBAIC01MjksMTMgKzUzNCwxNyBAQAogCQkubmxfdSA9IHsKIAkJCS5pcDZfdSA9IHsKIAkJCQkuZGFkZHIgPSAqZGFkZHIsCi0JCQkJLyogVE9ETzogc2FkZHIgKi8KIAkJCX0sCiAJCX0sCiAJfTsKIAlzdHJ1Y3QgZHN0X2VudHJ5ICpkc3Q7CiAJaW50IGZsYWdzID0gc3RyaWN0ID8gUlQ2X0xPT0tVUF9GX0lGQUNFIDogMDsKIAorCWlmIChzYWRkcikgeworCQltZW1jcHkoJmZsLmZsNl9zcmMsIHNhZGRyLCBzaXplb2YoKnNhZGRyKSk7CisJCWZsYWdzIHw9IFJUNl9MT09LVVBfRl9IQVNfU0FERFI7CisJfQorCiAJZHN0ID0gZmliNl9ydWxlX2xvb2t1cCgmZmwsIGZsYWdzLCBpcDZfcG9sX3JvdXRlX2xvb2t1cCk7CiAJaWYgKGRzdC0+ZXJyb3IgPT0gMCkKIAkJcmV0dXJuIChzdHJ1Y3QgcnQ2X2luZm8gKikgZHN0OwpAQCAtNjE0LDggKzYyMyw2IEBACiAJCWlwdjZfYWRkcl9jb3B5KCZydC0+cnQ2aV9kc3QuYWRkciwgZGFkZHIpOwogCQlydC0+cnQ2aV9kc3QucGxlbiA9IDEyODsKIAkJcnQtPnJ0NmlfZmxhZ3MgfD0gUlRGX0NBQ0hFOwotCQlpZiAocnQtPnJ0NmlfZmxhZ3MgJiBSVEZfUkVKRUNUKQotCQkJcnQtPnUuZHN0LmVycm9yID0gb3J0LT51LmRzdC5lcnJvcjsKIAkJcnQtPnUuZHN0LmZsYWdzIHw9IERTVF9IT1NUOwogCQlydC0+cnQ2aV9uZXh0aG9wID0gbmVpZ2hfY2xvbmUob3J0LT5ydDZpX25leHRob3ApOwogCX0KQEAgLTYzMCw3ICs2MzcsNyBAQAogCWludCBzdHJpY3QgPSAwOwogCWludCBhdHRlbXB0cyA9IDM7CiAJaW50IGVycjsKLQlpbnQgcmVhY2hhYmxlID0gUlQ2X0xPT0tVUF9GX1JFQUNIQUJMRTsKKwlpbnQgcmVhY2hhYmxlID0gaXB2Nl9kZXZjb25mLmZvcndhcmRpbmcgPyAwIDogUlQ2X0xPT0tVUF9GX1JFQUNIQUJMRTsKIAogCXN0cmljdCB8PSBmbGFncyAmIFJUNl9MT09LVVBfRl9JRkFDRTsKIApAQCAtNjk3LDYgKzcwNCw3IEBACiB2b2lkIGlwNl9yb3V0ZV9pbnB1dChzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQogewogCXN0cnVjdCBpcHY2aGRyICppcGggPSBza2ItPm5oLmlwdjZoOworCWludCBmbGFncyA9IFJUNl9MT09LVVBfRl9IQVNfU0FERFI7CiAJc3RydWN0IGZsb3dpIGZsID0gewogCQkuaWlmID0gc2tiLT5kZXYtPmlmaW5kZXgsCiAJCS5ubF91ID0gewpAQCAtNzExLDcgKzcxOSw5IEBACiAJCX0sCiAJCS5wcm90byA9IGlwaC0+bmV4dGhkciwKIAl9OwotCWludCBmbGFncyA9IHJ0Nl9uZWVkX3N0cmljdCgmaXBoLT5kYWRkcikgPyBSVDZfTE9PS1VQX0ZfSUZBQ0UgOiAwOworCisJaWYgKHJ0Nl9uZWVkX3N0cmljdCgmaXBoLT5kYWRkcikpCisJCWZsYWdzIHw9IFJUNl9MT09LVVBfRl9JRkFDRTsKIAogCXNrYi0+ZHN0ID0gZmliNl9ydWxlX2xvb2t1cCgmZmwsIGZsYWdzLCBpcDZfcG9sX3JvdXRlX2lucHV0KTsKIH0KQEAgLTcyNCw3ICs3MzQsNyBAQAogCWludCBzdHJpY3QgPSAwOwogCWludCBhdHRlbXB0cyA9IDM7CiAJaW50IGVycjsKLQlpbnQgcmVhY2hhYmxlID0gUlQ2X0xPT0tVUF9GX1JFQUNIQUJMRTsKKwlpbnQgcmVhY2hhYmxlID0gaXB2Nl9kZXZjb25mLmZvcndhcmRpbmcgPyAwIDogUlQ2X0xPT0tVUF9GX1JFQUNIQUJMRTsKIAogCXN0cmljdCB8PSBmbGFncyAmIFJUNl9MT09LVVBfRl9JRkFDRTsKIApAQCAtNzk0LDYgKzgwNCw5IEBACiAJaWYgKHJ0Nl9uZWVkX3N0cmljdCgmZmwtPmZsNl9kc3QpKQogCQlmbGFncyB8PSBSVDZfTE9PS1VQX0ZfSUZBQ0U7CiAKKwlpZiAoIWlwdjZfYWRkcl9hbnkoJmZsLT5mbDZfc3JjKSkKKwkJZmxhZ3MgfD0gUlQ2X0xPT0tVUF9GX0hBU19TQUREUjsKKwogCXJldHVybiBmaWI2X3J1bGVfbG9va3VwKGZsLCBmbGFncywgaXA2X3BvbF9yb3V0ZV9vdXRwdXQpOwogfQogCkBAIC0xMzQ1LDYgKzEzNTgsNyBAQAogCQkJCQkgICBzdHJ1Y3QgaW42X2FkZHIgKmdhdGV3YXksCiAJCQkJCSAgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7CisJaW50IGZsYWdzID0gUlQ2X0xPT0tVUF9GX0hBU19TQUREUjsKIAlzdHJ1Y3QgaXA2cmRfZmxvd2kgcmRmbCA9IHsKIAkJLmZsID0gewogCQkJLm9pZiA9IGRldi0+aWZpbmRleCwKQEAgLTEzNTcsNyArMTM3MSw5IEBACiAJCX0sCiAJCS5nYXRld2F5ID0gKmdhdGV3YXksCiAJfTsKLQlpbnQgZmxhZ3MgPSBydDZfbmVlZF9zdHJpY3QoZGVzdCkgPyBSVDZfTE9PS1VQX0ZfSUZBQ0UgOiAwOworCisJaWYgKHJ0Nl9uZWVkX3N0cmljdChkZXN0KSkKKwkJZmxhZ3MgfD0gUlQ2X0xPT0tVUF9GX0lGQUNFOwogCiAJcmV0dXJuIChzdHJ1Y3QgcnQ2X2luZm8gKilmaWI2X3J1bGVfbG9va3VwKChzdHJ1Y3QgZmxvd2kgKikmcmRmbCwgZmxhZ3MsIF9faXA2X3JvdXRlX3JlZGlyZWN0KTsKIH0KQEAgLTE1MjcsNiArMTU0Myw3IEBACiAJCXJ0LT51LmRzdC5vdXRwdXQgPSBvcnQtPnUuZHN0Lm91dHB1dDsKIAogCQltZW1jcHkocnQtPnUuZHN0Lm1ldHJpY3MsIG9ydC0+dS5kc3QubWV0cmljcywgUlRBWF9NQVgqc2l6ZW9mKHUzMikpOworCQlydC0+dS5kc3QuZXJyb3IgPSBvcnQtPnUuZHN0LmVycm9yOwogCQlydC0+dS5kc3QuZGV2ID0gb3J0LT51LmRzdC5kZXY7CiAJCWlmIChydC0+dS5kc3QuZGV2KQogCQkJZGV2X2hvbGQocnQtPnUuZHN0LmRldik7CkBAIC0xNzMwLDI0ICsxNzQ3LDUwIEBACiAgKglEcm9wIHRoZSBwYWNrZXQgb24gdGhlIGZsb29yCiAgKi8KIAotc3RhdGljIGludCBpcDZfcGt0X2Rpc2NhcmQoc3RydWN0IHNrX2J1ZmYgKnNrYikKK3N0YXRpYyBpbmxpbmUgaW50IGlwNl9wa3RfZHJvcChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBpbnQgY29kZSkKIHsKIAlpbnQgdHlwZSA9IGlwdjZfYWRkcl90eXBlKCZza2ItPm5oLmlwdjZoLT5kYWRkcik7CiAJaWYgKHR5cGUgPT0gSVBWNl9BRERSX0FOWSB8fCB0eXBlID09IElQVjZfQUREUl9SRVNFUlZFRCkKIAkJSVA2X0lOQ19TVEFUUyhJUFNUQVRTX01JQl9JTkFERFJFUlJPUlMpOwogCiAJSVA2X0lOQ19TVEFUUyhJUFNUQVRTX01JQl9PVVROT1JPVVRFUyk7Ci0JaWNtcHY2X3NlbmQoc2tiLCBJQ01QVjZfREVTVF9VTlJFQUNILCBJQ01QVjZfTk9ST1VURSwgMCwgc2tiLT5kZXYpOworCWljbXB2Nl9zZW5kKHNrYiwgSUNNUFY2X0RFU1RfVU5SRUFDSCwgY29kZSwgMCwgc2tiLT5kZXYpOwogCWtmcmVlX3NrYihza2IpOwogCXJldHVybiAwOwogfQogCitzdGF0aWMgaW50IGlwNl9wa3RfZGlzY2FyZChzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXJldHVybiBpcDZfcGt0X2Ryb3Aoc2tiLCBJQ01QVjZfTk9ST1VURSk7Cit9CisKIHN0YXRpYyBpbnQgaXA2X3BrdF9kaXNjYXJkX291dChzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQogewogCXNrYi0+ZGV2ID0gc2tiLT5kc3QtPmRldjsKIAlyZXR1cm4gaXA2X3BrdF9kaXNjYXJkKHNrYik7CiB9CiAKKyNpZmRlZiBDT05GSUdfSVBWNl9NVUxUSVBMRV9UQUJMRVMKKworc3RhdGljIGludCBpcDZfcGt0X3Byb2hpYml0KHN0cnVjdCBza19idWZmICpza2IpCit7CisJcmV0dXJuIGlwNl9wa3RfZHJvcChza2IsIElDTVBWNl9BRE1fUFJPSElCSVRFRCk7Cit9CisKK3N0YXRpYyBpbnQgaXA2X3BrdF9wcm9oaWJpdF9vdXQoc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlza2ItPmRldiA9IHNrYi0+ZHN0LT5kZXY7CisJcmV0dXJuIGlwNl9wa3RfcHJvaGliaXQoc2tiKTsKK30KKworc3RhdGljIGludCBpcDZfcGt0X2Jsa19ob2xlKHN0cnVjdCBza19idWZmICpza2IpCit7CisJa2ZyZWVfc2tiKHNrYik7CisJcmV0dXJuIDA7Cit9CisKKyNlbmRpZgorCiAvKgogICoJQWxsb2NhdGUgYSBkc3QgZm9yIGxvY2FsICh1bmljYXN0IC8gYW55Y2FzdCkgYWRkcmVzcy4KICAqLwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjYvc2l0LmMgYi9uZXQvaXB2Ni9zaXQuYwppbmRleCA4MzZlZWNkLi5iZTY5OWY4IDEwMDY0NAotLS0gYS9uZXQvaXB2Ni9zaXQuYworKysgYi9uZXQvaXB2Ni9zaXQuYwpAQCAtODUwLDMgKzg1MCw4IEBACiAJaW5ldF9kZWxfcHJvdG9jb2woJnNpdF9wcm90b2NvbCwgSVBQUk9UT19JUFY2KTsKIAlnb3RvIG91dDsKIH0KKworbW9kdWxlX2luaXQoc2l0X2luaXQpOworbW9kdWxlX2V4aXQoc2l0X2NsZWFudXApOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX0FMSUFTKCJzaXQwIik7CmRpZmYgLS1naXQgYS9uZXQvaXB2Ni90Y3BfaXB2Ni5jIGIvbmV0L2lwdjYvdGNwX2lwdjYuYwppbmRleCAzYjY1NzU0Li40YzJhN2MwIDEwMDY0NAotLS0gYS9uZXQvaXB2Ni90Y3BfaXB2Ni5jCisrKyBiL25ldC9pcHY2L3RjcF9pcHY2LmMKQEAgLTMyOSw3ICszMjksNyBAQAogCX0KIAogCWlmIChzay0+c2tfc3RhdGUgPT0gVENQX1RJTUVfV0FJVCkgewotCQlpbmV0X3R3c2tfcHV0KChzdHJ1Y3QgaW5ldF90aW1ld2FpdF9zb2NrICopc2spOworCQlpbmV0X3R3c2tfcHV0KGluZXRfdHdzayhzaykpOwogCQlyZXR1cm47CiAJfQogCkBAIC02NTMsNyArNjUzLDcgQEAKIAlpbnQgdG90X2xlbiA9IHNpemVvZihzdHJ1Y3QgdGNwaGRyKTsKIAogCWlmICh0cykKLQkJdG90X2xlbiArPSAzKjQ7CisJCXRvdF9sZW4gKz0gVENQT0xFTl9UU1RBTVBfQUxJR05FRDsKIAogCWJ1ZmYgPSBhbGxvY19za2IoTUFYX0hFQURFUiArIHNpemVvZihzdHJ1Y3QgaXB2NmhkcikgKyB0b3RfbGVuLAogCQkJIEdGUF9BVE9NSUMpOwpAQCAtNzQ5LDcgKzc0OSw3IEBACiAJCQliaF9sb2NrX3NvY2sobnNrKTsKIAkJCXJldHVybiBuc2s7CiAJCX0KLQkJaW5ldF90d3NrX3B1dCgoc3RydWN0IGluZXRfdGltZXdhaXRfc29jayAqKW5zayk7CisJCWluZXRfdHdza19wdXQoaW5ldF90d3NrKG5zaykpOwogCQlyZXR1cm4gTlVMTDsKIAl9CiAKQEAgLTEyODMsMTggKzEyODMsMTcgQEAKIAogZG9fdGltZV93YWl0OgogCWlmICgheGZybTZfcG9saWN5X2NoZWNrKE5VTEwsIFhGUk1fUE9MSUNZX0lOLCBza2IpKSB7Ci0JCWluZXRfdHdza19wdXQoKHN0cnVjdCBpbmV0X3RpbWV3YWl0X3NvY2sgKilzayk7CisJCWluZXRfdHdza19wdXQoaW5ldF90d3NrKHNrKSk7CiAJCWdvdG8gZGlzY2FyZF9pdDsKIAl9CiAKIAlpZiAoc2tiLT5sZW4gPCAodGgtPmRvZmY8PDIpIHx8IHRjcF9jaGVja3N1bV9jb21wbGV0ZShza2IpKSB7CiAJCVRDUF9JTkNfU1RBVFNfQkgoVENQX01JQl9JTkVSUlMpOwotCQlpbmV0X3R3c2tfcHV0KChzdHJ1Y3QgaW5ldF90aW1ld2FpdF9zb2NrICopc2spOworCQlpbmV0X3R3c2tfcHV0KGluZXRfdHdzayhzaykpOwogCQlnb3RvIGRpc2NhcmRfaXQ7CiAJfQogCi0Jc3dpdGNoICh0Y3BfdGltZXdhaXRfc3RhdGVfcHJvY2Vzcygoc3RydWN0IGluZXRfdGltZXdhaXRfc29jayAqKXNrLAotCQkJCQkgICBza2IsIHRoKSkgeworCXN3aXRjaCAodGNwX3RpbWV3YWl0X3N0YXRlX3Byb2Nlc3MoaW5ldF90d3NrKHNrKSwgc2tiLCB0aCkpIHsKIAljYXNlIFRDUF9UV19TWU46CiAJewogCQlzdHJ1Y3Qgc29jayAqc2syOwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjYvdWRwLmMgYi9uZXQvaXB2Ni91ZHAuYwppbmRleCBlMGMzOTM0Li5jODNmMjNlIDEwMDY0NAotLS0gYS9uZXQvaXB2Ni91ZHAuYworKysgYi9uZXQvaXB2Ni91ZHAuYwpAQCAtMjQyLDE0ICsyNDIsMTMgQEAKIHsKIAlzdHJ1Y3QgaXB2Nl9waW5mbyAqbnA7CiAJc3RydWN0IGlwdjZoZHIgKmhkciA9IChzdHJ1Y3QgaXB2Nmhkciopc2tiLT5kYXRhOwotCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBza2ItPmRldjsKIAlzdHJ1Y3QgaW42X2FkZHIgKnNhZGRyID0gJmhkci0+c2FkZHI7CiAJc3RydWN0IGluNl9hZGRyICpkYWRkciA9ICZoZHItPmRhZGRyOwogCXN0cnVjdCB1ZHBoZHIgKnVoID0gKHN0cnVjdCB1ZHBoZHIqKShza2ItPmRhdGErb2Zmc2V0KTsKIAlzdHJ1Y3Qgc29jayAqc2s7CiAJaW50IGVycjsKIAotCXNrID0gdWRwX3Y2X2xvb2t1cChkYWRkciwgdWgtPmRlc3QsIHNhZGRyLCB1aC0+c291cmNlLCBkZXYtPmlmaW5kZXgpOworCXNrID0gdWRwX3Y2X2xvb2t1cChkYWRkciwgdWgtPmRlc3QsIHNhZGRyLCB1aC0+c291cmNlLCBpbmV0Nl9paWYoc2tiKSk7CiAgICAKIAlpZiAoc2sgPT0gTlVMTCkKIAkJcmV0dXJuOwpAQCAtMzQ4LDcgKzM0Nyw3IEBACiAKIAlyZWFkX2xvY2soJnVkcF9oYXNoX2xvY2spOwogCXNrID0gc2tfaGVhZCgmdWRwX2hhc2hbbnRvaHModWgtPmRlc3QpICYgKFVEUF9IVEFCTEVfU0laRSAtIDEpXSk7Ci0JZGlmID0gc2tiLT5kZXYtPmlmaW5kZXg7CisJZGlmID0gaW5ldDZfaWlmKHNrYik7CiAJc2sgPSB1ZHBfdjZfbWNhc3RfbmV4dChzaywgdWgtPmRlc3QsIGRhZGRyLCB1aC0+c291cmNlLCBzYWRkciwgZGlmKTsKIAlpZiAoIXNrKSB7CiAJCWtmcmVlX3NrYihza2IpOwpAQCAtNDI5LDcgKzQyOCw3IEBACiAJICogY2hlY2sgc29ja2V0IGNhY2hlIC4uLiBtdXN0IHRhbGsgdG8gQWxhbiBhYm91dCBoaXMgcGxhbnMKIAkgKiBmb3Igc29jayBjYWNoZXMuLi4gaSdsbCBza2lwIHRoaXMgZm9yIG5vdy4KIAkgKi8KLQlzayA9IHVkcF92Nl9sb29rdXAoc2FkZHIsIHVoLT5zb3VyY2UsIGRhZGRyLCB1aC0+ZGVzdCwgZGV2LT5pZmluZGV4KTsKKwlzayA9IHVkcF92Nl9sb29rdXAoc2FkZHIsIHVoLT5zb3VyY2UsIGRhZGRyLCB1aC0+ZGVzdCwgaW5ldDZfaWlmKHNrYikpOwogCiAJaWYgKHNrID09IE5VTEwpIHsKIAkJaWYgKCF4ZnJtNl9wb2xpY3lfY2hlY2soTlVMTCwgWEZSTV9QT0xJQ1lfSU4sIHNrYikpCmRpZmYgLS1naXQgYS9uZXQvaXB2Ni94ZnJtNl9wb2xpY3kuYyBiL25ldC9pcHY2L3hmcm02X3BvbGljeS5jCmluZGV4IDZhMjUyZTIuLmQ0MDBmOGYgMTAwNjQ0Ci0tLSBhL25ldC9pcHY2L3hmcm02X3BvbGljeS5jCisrKyBiL25ldC9pcHY2L3hmcm02X3BvbGljeS5jCkBAIC0yNSwxMiArMjUsMTQgQEAKIHN0YXRpYyBzdHJ1Y3QgZHN0X29wcyB4ZnJtNl9kc3Rfb3BzOwogc3RhdGljIHN0cnVjdCB4ZnJtX3BvbGljeV9hZmluZm8geGZybTZfcG9saWN5X2FmaW5mbzsKIAotc3RhdGljIGludCB4ZnJtNl9kc3RfbG9va3VwKHN0cnVjdCB4ZnJtX2RzdCAqKmRzdCwgc3RydWN0IGZsb3dpICpmbCkKK3N0YXRpYyBpbnQgeGZybTZfZHN0X2xvb2t1cChzdHJ1Y3QgeGZybV9kc3QgKip4ZHN0LCBzdHJ1Y3QgZmxvd2kgKmZsKQogewotCWludCBlcnIgPSAwOwotCSpkc3QgPSAoc3RydWN0IHhmcm1fZHN0KilpcDZfcm91dGVfb3V0cHV0KE5VTEwsIGZsKTsKLQlpZiAoISpkc3QpCi0JCWVyciA9IC1FTkVUVU5SRUFDSDsKKwlzdHJ1Y3QgZHN0X2VudHJ5ICpkc3QgPSBpcDZfcm91dGVfb3V0cHV0KE5VTEwsIGZsKTsKKwlpbnQgZXJyID0gZHN0LT5lcnJvcjsKKwlpZiAoIWVycikKKwkJKnhkc3QgPSAoc3RydWN0IHhmcm1fZHN0ICopIGRzdDsKKwllbHNlCisJCWRzdF9yZWxlYXNlKGRzdCk7CiAJcmV0dXJuIGVycjsKIH0KIApAQCAtNzMsNyArNzUsNyBAQAogCQkJCSB4ZHN0LT51LnJ0Ni5ydDZpX3NyYy5wbGVuKTsKIAkJaWYgKGlwdjZfYWRkcl9lcXVhbCgmeGRzdC0+dS5ydDYucnQ2aV9kc3QuYWRkciwgJmZsX2RzdF9wcmVmaXgpICYmCiAJCSAgICBpcHY2X2FkZHJfZXF1YWwoJnhkc3QtPnUucnQ2LnJ0Nmlfc3JjLmFkZHIsICZmbF9zcmNfcHJlZml4KSAmJgotCQkgICAgeGZybV9idW5kbGVfb2soeGRzdCwgZmwsIEFGX0lORVQ2LAorCQkgICAgeGZybV9idW5kbGVfb2socG9saWN5LCB4ZHN0LCBmbCwgQUZfSU5FVDYsCiAJCQkJICAgKHhkc3QtPnUucnQ2LnJ0NmlfZHN0LnBsZW4gIT0gMTI4IHx8CiAJCQkJICAgIHhkc3QtPnUucnQ2LnJ0Nmlfc3JjLnBsZW4gIT0gMTI4KSkpIHsKIAkJCWRzdF9jbG9uZShkc3QpOwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjYveGZybTZfdHVubmVsLmMgYi9uZXQvaXB2Ni94ZnJtNl90dW5uZWwuYwppbmRleCA3YWYyMjdiLi43OTMxZTRmIDEwMDY0NAotLS0gYS9uZXQvaXB2Ni94ZnJtNl90dW5uZWwuYworKysgYi9uZXQvaXB2Ni94ZnJtNl90dW5uZWwuYwpAQCAtMTM1LDcgKzEzNSw3IEBACiAJeDZzcGkgPSBfX3hmcm02X3R1bm5lbF9zcGlfbG9va3VwKHNhZGRyKTsKIAlzcGkgPSB4NnNwaSA/IHg2c3BpLT5zcGkgOiAwOwogCXJlYWRfdW5sb2NrX2JoKCZ4ZnJtNl90dW5uZWxfc3BpX2xvY2spOwotCXJldHVybiBzcGk7CisJcmV0dXJuIGh0b25sKHNwaSk7CiB9CiAKIEVYUE9SVF9TWU1CT0woeGZybTZfdHVubmVsX3NwaV9sb29rdXApOwpAQCAtMjEwLDcgKzIxMCw3IEBACiAJCXNwaSA9IF9feGZybTZfdHVubmVsX2FsbG9jX3NwaShzYWRkcik7CiAJd3JpdGVfdW5sb2NrX2JoKCZ4ZnJtNl90dW5uZWxfc3BpX2xvY2spOwogCi0JcmV0dXJuIHNwaTsKKwlyZXR1cm4gaHRvbmwoc3BpKTsKIH0KIAogRVhQT1JUX1NZTUJPTCh4ZnJtNl90dW5uZWxfYWxsb2Nfc3BpKTsKZGlmZiAtLWdpdCBhL25ldC9pcHgvYWZfaXB4LmMgYi9uZXQvaXB4L2FmX2lweC5jCmluZGV4IGJlZjNmNjEuLjc2YzY2MTUgMTAwNjQ0Ci0tLSBhL25ldC9pcHgvYWZfaXB4LmMKKysrIGIvbmV0L2lweC9hZl9pcHguYwpAQCAtODMsMTMgKzgzLDEzIEBACiBzdHJ1Y3QgaXB4X2ludGVyZmFjZSAqaXB4X3ByaW1hcnlfbmV0Owogc3RydWN0IGlweF9pbnRlcmZhY2UgKmlweF9pbnRlcm5hbF9uZXQ7CiAKLWV4dGVybiBpbnQgaXB4cnRyX2FkZF9yb3V0ZShfX3UzMiBuZXR3b3JrLCBzdHJ1Y3QgaXB4X2ludGVyZmFjZSAqaW50cmZjLAorZXh0ZXJuIGludCBpcHhydHJfYWRkX3JvdXRlKF9fYmUzMiBuZXR3b3JrLCBzdHJ1Y3QgaXB4X2ludGVyZmFjZSAqaW50cmZjLAogCQkJICAgIHVuc2lnbmVkIGNoYXIgKm5vZGUpOwogZXh0ZXJuIHZvaWQgaXB4cnRyX2RlbF9yb3V0ZXMoc3RydWN0IGlweF9pbnRlcmZhY2UgKmludHJmYyk7CiBleHRlcm4gaW50IGlweHJ0cl9yb3V0ZV9wYWNrZXQoc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3Qgc29ja2FkZHJfaXB4ICp1c2lweCwKIAkJCSAgICAgICBzdHJ1Y3QgaW92ZWMgKmlvdiwgaW50IGxlbiwgaW50IG5vYmxvY2spOwogZXh0ZXJuIGludCBpcHhydHJfcm91dGVfc2tiKHN0cnVjdCBza19idWZmICpza2IpOwotZXh0ZXJuIHN0cnVjdCBpcHhfcm91dGUgKmlweHJ0cl9sb29rdXAoX191MzIgbmV0KTsKK2V4dGVybiBzdHJ1Y3QgaXB4X3JvdXRlICppcHhydHJfbG9va3VwKF9fYmUzMiBuZXQpOwogZXh0ZXJuIGludCBpcHhydHJfaW9jdGwodW5zaWduZWQgaW50IGNtZCwgdm9pZCBfX3VzZXIgKmFyZyk7CiAKICN1bmRlZiBJUFhfUkVGQ05UX0RFQlVHCkBAIC0xNzcsNyArMTc3LDcgQEAKIH0KIAogc3RhdGljIHN0cnVjdCBpcHhfaW50ZXJmYWNlICpfX2lweGl0Zl9maW5kX3VzaW5nX3BoeXMoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKLQkJCQkJCSAgICAgIHVuc2lnbmVkIHNob3J0IGRhdGFsaW5rKQorCQkJCQkJICAgICAgX19iZTE2IGRhdGFsaW5rKQogewogCXN0cnVjdCBpcHhfaW50ZXJmYWNlICppOwogCkBAIC0xOTAsNyArMTkwLDcgQEAKIH0KIAogc3RhdGljIHN0cnVjdCBpcHhfaW50ZXJmYWNlICppcHhpdGZfZmluZF91c2luZ19waHlzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCi0JCQkJCQkgICAgdW5zaWduZWQgc2hvcnQgZGF0YWxpbmspCisJCQkJCQkgICAgX19iZTE2IGRhdGFsaW5rKQogewogCXN0cnVjdCBpcHhfaW50ZXJmYWNlICppOwogCkBAIC0yMDIsNyArMjAyLDcgQEAKIAlyZXR1cm4gaTsKIH0KIAotc3RydWN0IGlweF9pbnRlcmZhY2UgKmlweGl0Zl9maW5kX3VzaW5nX25ldChfX3UzMiBuZXQpCitzdHJ1Y3QgaXB4X2ludGVyZmFjZSAqaXB4aXRmX2ZpbmRfdXNpbmdfbmV0KF9fYmUzMiBuZXQpCiB7CiAJc3RydWN0IGlweF9pbnRlcmZhY2UgKmk7CiAKQEAgLTIzNyw3ICsyMzcsNyBAQAogCiAvKiBjYWxsZXIgbXVzdCBob2xkIGludHJmYy0+aWZfc2tsaXN0X2xvY2sgKi8KIHN0YXRpYyBzdHJ1Y3Qgc29jayAqX19pcHhpdGZfZmluZF9zb2NrZXQoc3RydWN0IGlweF9pbnRlcmZhY2UgKmludHJmYywKLQkJCQkJIHVuc2lnbmVkIHNob3J0IHBvcnQpCisJCQkJCSBfX2JlMTYgcG9ydCkKIHsKIAlzdHJ1Y3Qgc29jayAqczsKIAlzdHJ1Y3QgaGxpc3Rfbm9kZSAqbm9kZTsKQEAgLTI1Miw3ICsyNTIsNyBAQAogCiAvKiBjYWxsZXIgbXVzdCBob2xkIGEgcmVmZXJlbmNlIHRvIGludHJmYyAqLwogc3RhdGljIHN0cnVjdCBzb2NrICppcHhpdGZfZmluZF9zb2NrZXQoc3RydWN0IGlweF9pbnRlcmZhY2UgKmludHJmYywKLQkJCQkJdW5zaWduZWQgc2hvcnQgcG9ydCkKKwkJCQkJX19iZTE2IHBvcnQpCiB7CiAJc3RydWN0IHNvY2sgKnM7CiAKQEAgLTI2OCw3ICsyNjgsNyBAQAogI2lmZGVmIENPTkZJR19JUFhfSU5URVJOCiBzdGF0aWMgc3RydWN0IHNvY2sgKmlweGl0Zl9maW5kX2ludGVybmFsX3NvY2tldChzdHJ1Y3QgaXB4X2ludGVyZmFjZSAqaW50cmZjLAogCQkJCQkJdW5zaWduZWQgY2hhciAqaXB4X25vZGUsCi0JCQkJCQl1bnNpZ25lZCBzaG9ydCBwb3J0KQorCQkJCQkJX19iZTE2IHBvcnQpCiB7CiAJc3RydWN0IHNvY2sgKnM7CiAJc3RydWN0IGhsaXN0X25vZGUgKm5vZGU7CkBAIC02MDAsMTAgKzYwMCwxMCBAQAogCiAJLyogc2VlIGlmIHdlIG5lZWQgdG8gaW5jbHVkZSB0aGUgbmV0bnVtIGluIHRoZSByb3V0ZSBsaXN0ICovCiAJaWYgKElQWF9TS0JfQ0Ioc2tiKS0+bGFzdF9ob3AuaW5kZXggPj0gMCkgewotCQl1MzIgKmxhc3RfaG9wID0gKHUzMiAqKSgoKHU4ICopIHNrYi0+ZGF0YSkgKworCQlfX2JlMzIgKmxhc3RfaG9wID0gKF9fYmUzMiAqKSgoKHU4ICopIHNrYi0+ZGF0YSkgKwogCQkJCXNpemVvZihzdHJ1Y3QgaXB4aGRyKSArCiAJCQkJSVBYX1NLQl9DQihza2IpLT5sYXN0X2hvcC5pbmRleCAqCi0JCQkJc2l6ZW9mKHUzMikpOworCQkJCXNpemVvZihfX2JlMzIpKTsKIAkJKmxhc3RfaG9wID0gSVBYX1NLQl9DQihza2IpLT5sYXN0X2hvcC5uZXRudW07CiAJCUlQWF9TS0JfQ0Ioc2tiKS0+bGFzdF9ob3AuaW5kZXggPSAtMTsKIAl9CkBAIC03NzIsNyArNzcyLDcgQEAKIAkJfSBlbHNlIHsKIAkJCXByaW50ayhLRVJOX1dBUk5JTkcgIklQWDogTmV0d29yayBudW1iZXIgY29sbGlzaW9uICIKIAkJCQkiJWx4XG4gICAgICAgICVzICVzIGFuZCAlcyAlc1xuIiwKLQkJCQkodW5zaWduZWQgbG9uZykgaHRvbmwoY2ItPmlweF9zb3VyY2VfbmV0KSwKKwkJCQkodW5zaWduZWQgbG9uZykgbnRvaGwoY2ItPmlweF9zb3VyY2VfbmV0KSwKIAkJCQlpcHhfZGV2aWNlX25hbWUoaSksCiAJCQkJaXB4X2ZyYW1lX25hbWUoaS0+aWZfZGxpbmtfdHlwZSksCiAJCQkJaXB4X2RldmljZV9uYW1lKGludHJmYyksCkBAIC04MTIsNyArODEyLDcgQEAKIAlpbnQgaSwgcmMgPSAtRUlOVkFMOwogCXN0cnVjdCBpcHhfaW50ZXJmYWNlICppZmNzOwogCWNoYXIgKmM7Ci0JdTMyICpsOworCV9fYmUzMiAqbDsKIAogCS8qIElsbGVnYWwgcGFja2V0IC0gdG9vIG1hbnkgaG9wcyBvciB0b28gc2hvcnQgKi8KIAkvKiBXZSBkZWNpZGUgdG8gdGhyb3cgaXQgYXdheTogbm8gYnJvYWRjYXN0aW5nLCBubyBsb2NhbCBwcm9jZXNzaW5nLgpAQCAtODMzLDcgKzgzMyw3IEBACiAJCWdvdG8gb3V0OwogCQogCWMgPSAoKHU4ICopIGlweCkgKyBzaXplb2Yoc3RydWN0IGlweGhkcik7Ci0JbCA9ICh1MzIgKikgYzsKKwlsID0gKF9fYmUzMiAqKSBjOwogCiAJLyogRG9uJ3QgYnJvYWRjYXN0IHBhY2tldCBpZiBhbHJlYWR5IHNlZW4gdGhpcyBuZXQgKi8KIAlmb3IgKGkgPSAwOyBpIDwgSVBYX1NLQl9DQihza2IpLT5pcHhfdGN0cmw7IGkrKykKQEAgLTg1NSw3ICs4NTUsNyBAQAogCQkvKiBUaGF0IGFyZW4ndCBpbiB0aGUgbGlzdCAqLwogCQlpZiAoaWZjcyA9PSBpbnRyZmMpCiAJCQljb250aW51ZTsKLQkJbCA9IChfX3UzMiAqKSBjOworCQlsID0gKF9fYmUzMiAqKSBjOwogCQkvKiBkb24ndCBjb25zaWRlciB0aGUgbGFzdCBlbnRyeSBpbiB0aGUgcGFja2V0IGxpc3QsCiAJCSAqIGl0IGlzIG91ciBuZXRudW0sIGFuZCBpdCBpcyBub3QgdGhlcmUgeWV0ICovCiAJCWZvciAoaSA9IDA7IGkgPCBJUFhfU0tCX0NCKHNrYiktPmlweF90Y3RybDsgaSsrKQpAQCAtODg1LDggKzg4NSw4IEBACiAJCWlweF9wcmltYXJ5X25ldCA9IGludHJmYzsKIH0KIAotc3RhdGljIHN0cnVjdCBpcHhfaW50ZXJmYWNlICppcHhpdGZfYWxsb2Moc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgX191MzIgbmV0bnVtLAotCQkJCQkgIHVuc2lnbmVkIHNob3J0IGRsaW5rX3R5cGUsCitzdGF0aWMgc3RydWN0IGlweF9pbnRlcmZhY2UgKmlweGl0Zl9hbGxvYyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBfX2JlMzIgbmV0bnVtLAorCQkJCQkgIF9fYmUxNiBkbGlua190eXBlLAogCQkJCQkgIHN0cnVjdCBkYXRhbGlua19wcm90byAqZGxpbmssCiAJCQkJCSAgdW5zaWduZWQgY2hhciBpbnRlcm5hbCwKIAkJCQkJICBpbnQgaXB4X29mZnNldCkKQEAgLTk2MCw3ICs5NjAsNyBAQAogc3RhdGljIGludCBpcHhpdGZfY3JlYXRlKHN0cnVjdCBpcHhfaW50ZXJmYWNlX2RlZmluaXRpb24gKmlkZWYpCiB7CiAJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKLQl1bnNpZ25lZCBzaG9ydCBkbGlua190eXBlID0gMDsKKwlfX2JlMTYgZGxpbmtfdHlwZSA9IDA7CiAJc3RydWN0IGRhdGFsaW5rX3Byb3RvICpkYXRhbGluayA9IE5VTEw7CiAJc3RydWN0IGlweF9pbnRlcmZhY2UgKmludHJmYzsKIAlpbnQgcmM7CkBAIC0xMDczLDcgKzEwNzMsNyBAQAogc3RhdGljIGludCBpcHhpdGZfZGVsZXRlKHN0cnVjdCBpcHhfaW50ZXJmYWNlX2RlZmluaXRpb24gKmlkZWYpCiB7CiAJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IE5VTEw7Ci0JdW5zaWduZWQgc2hvcnQgZGxpbmtfdHlwZSA9IDA7CisJX19iZTE2IGRsaW5rX3R5cGUgPSAwOwogCXN0cnVjdCBpcHhfaW50ZXJmYWNlICppbnRyZmM7CiAJaW50IHJjID0gMDsKIApAQCAtMTExMCw3ICsxMTEwLDcgQEAKIH0KIAogc3RhdGljIHN0cnVjdCBpcHhfaW50ZXJmYWNlICppcHhpdGZfYXV0b19jcmVhdGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKLQkJCQkJCXVuc2lnbmVkIHNob3J0IGRsaW5rX3R5cGUpCisJCQkJCQlfX2JlMTYgZGxpbmtfdHlwZSkKIHsKIAlzdHJ1Y3QgaXB4X2ludGVyZmFjZSAqaW50cmZjID0gTlVMTDsKIAlzdHJ1Y3QgZGF0YWxpbmtfcHJvdG8gKmRhdGFsaW5rOwpAQCAtMTEyMiw3ICsxMTIyLDcgQEAKIAlpZiAoZGV2LT5hZGRyX2xlbiA+IElQWF9OT0RFX0xFTikKIAkJZ290byBvdXQ7CiAKLQlzd2l0Y2ggKGh0b25zKGRsaW5rX3R5cGUpKSB7CisJc3dpdGNoIChudG9ocyhkbGlua190eXBlKSkgewogCWNhc2UgRVRIX1BfSVBYOgkJZGF0YWxpbmsgPSBwRUlJX2RhdGFsaW5rOwlicmVhazsKIAljYXNlIEVUSF9QXzgwMl8yOglkYXRhbGluayA9IHA4MDIyX2RhdGFsaW5rOwlicmVhazsKIAljYXNlIEVUSF9QX1NOQVA6CWRhdGFsaW5rID0gcFNOQVBfZGF0YWxpbms7CWJyZWFrOwpAQCAtMTIzNCwyNyArMTIzNCwyNyBAQAogLyogTm90ZTogV2UgYXNzdW1lIGlweF90Y3RybD09MCBhbmQgaHRvbnMobGVuZ3RoKT09aXB4X3BrdHNpemUgKi8KIC8qIFRoaXMgZnVuY3Rpb25zIHNob3VsZCAqbm90KiBtZXNzIHdpdGggcGFja2V0IGNvbnRlbnRzICovCiAKLV9fdTE2IGlweF9ja3N1bShzdHJ1Y3QgaXB4aGRyICpwYWNrZXQsIGludCBsZW5ndGgpIAorX19iZTE2IGlweF9ja3N1bShzdHJ1Y3QgaXB4aGRyICpwYWNrZXQsIGludCBsZW5ndGgpCiB7CiAJLyogCiAJICoJTk9URTogc3VtIGlzIGEgbmV0IGJ5dGUgb3JkZXIgcXVhbnRpdHksIHdoaWNoIG9wdGltaXplcyB0aGUgCiAJICoJbG9vcC4gVGhpcyBvbmx5IHdvcmtzIG9uIGJpZyBhbmQgbGl0dGxlIGVuZGlhbiBtYWNoaW5lcy4gKEkKIAkgKglkb24ndCBrbm93IG9mIGEgbWFjaGluZSB0aGF0IGlzbid0LikKIAkgKi8KLQkvKiBzdGFydCBhdCBpcHhfZGVzdCAtIFdlIHNraXAgdGhlIGNoZWNrc3VtIGZpZWxkIGFuZCBzdGFydCB3aXRoCi0JICogaXB4X3R5cGUgYmVmb3JlIHRoZSBsb29wLCBub3QgY29uc2lkZXJpbmcgaXB4X3RjdHJsIGluIHRoZSBjYWxjICovCi0JX191MTYgKnAgPSAoX191MTYgKikmcGFja2V0LT5pcHhfZGVzdDsKLQlfX3UzMiBpID0gKGxlbmd0aCA+PiAxKSAtIDE7IC8qIE51bWJlciBvZiBjb21wbGV0ZSB3b3JkcyAqLwotCV9fdTMyIHN1bSA9IHBhY2tldC0+aXB4X3R5cGUgPDwgc2l6ZW9mKHBhY2tldC0+aXB4X3RjdHJsKTsgCisJLyogaGFuZGxlIHRoZSBmaXJzdCAzIHdvcmRzIHNlcGFyYXRlbHk7IGNoZWNrc3VtIHNob3VsZCBiZSBza2lwcGVkCisJICogYW5kIGlweF90Y3RybCBtYXNrZWQgb3V0ICovCisJX191MTYgKnAgPSAoX191MTYgKilwYWNrZXQ7CisJX191MzIgc3VtID0gcFsxXSArIChwWzJdICYgKF9fZm9yY2UgdTE2KWh0b25zKDB4MDBmZikpOworCV9fdTMyIGkgPSAobGVuZ3RoID4+IDEpIC0gMzsgLyogTnVtYmVyIG9mIHJlbWFpbmluZyBjb21wbGV0ZSB3b3JkcyAqLwogCi0JLyogTG9vcCB0aHJvdWdoIGFsbCBjb21wbGV0ZSB3b3JkcyBleGNlcHQgdGhlIGNoZWNrc3VtIGZpZWxkLAotCSAqIGlweF90eXBlIChhY2NvdW50ZWQgYWJvdmUpIGFuZCBpcHhfdGN0cmwgKG5vdCB1c2VkIGluIHRoZSBja3N1bSkgKi8KLQl3aGlsZSAoLS1pKQorCS8qIExvb3AgdGhyb3VnaCB0aGVtICovCisJcCArPSAzOworCXdoaWxlIChpLS0pCiAJCXN1bSArPSAqcCsrOwogCiAJLyogQWRkIG9uIHRoZSBsYXN0IHBhcnQgd29yZCBpZiBpdCBleGlzdHMgKi8KIAlpZiAocGFja2V0LT5pcHhfcGt0c2l6ZSAmIGh0b25zKDEpKQotCQlzdW0gKz0gbnRvaHMoMHhmZjAwKSAmICpwOworCQlzdW0gKz0gKF9fZm9yY2UgdTE2KWh0b25zKDB4ZmYwMCkgJiAqcDsKIAogCS8qIERvIGZpbmFsIGZpeHVwICovCiAJc3VtID0gKHN1bSAmIDB4ZmZmZikgKyAoc3VtID4+IDE2KTsKQEAgLTEyNjMsMTAgKzEyNjMsMTcgQEAKIAlpZiAoc3VtID49IDB4MTAwMDApCiAJCXN1bSsrOwogCi0JcmV0dXJuIH5zdW07CisJLyoKKwkgKiBMZWF2ZSAwIGFsb25lOyB3ZSBkb24ndCB3YW50IDB4ZmZmZiBoZXJlLiAgTm90ZSB0aGF0IHdlIGNhbid0IGdldAorCSAqIGhlcmUgd2l0aCAweDEwMDAwLCBzbyB0aGlzIGNoZWNrIGlzIHRoZSBzYW1lIGFzICgoX191MTYpc3VtKQorCSAqLworCWlmIChzdW0pCisJCXN1bSA9IH5zdW07CisKKwlyZXR1cm4gKF9fZm9yY2UgX19iZTE2KXN1bTsKIH0KIAotY29uc3QgY2hhciAqaXB4X2ZyYW1lX25hbWUodW5zaWduZWQgc2hvcnQgZnJhbWUpCitjb25zdCBjaGFyICppcHhfZnJhbWVfbmFtZShfX2JlMTYgZnJhbWUpCiB7CiAJY2hhciogcmMgPSAiTm9uZSI7CiAKQEAgLTE0MDEsNyArMTQwOCw3IEBACiAKIC8qIGNhbGxlciBtdXN0IGhvbGQgYSByZWZlcmVuY2UgdG8gaW50cmZjICovCiAKLXN0YXRpYyB1bnNpZ25lZCBzaG9ydCBpcHhfZmlyc3RfZnJlZV9zb2NrZXRudW0oc3RydWN0IGlweF9pbnRlcmZhY2UgKmludHJmYykKK3N0YXRpYyBfX2JlMTYgaXB4X2ZpcnN0X2ZyZWVfc29ja2V0bnVtKHN0cnVjdCBpcHhfaW50ZXJmYWNlICppbnRyZmMpCiB7CiAJdW5zaWduZWQgc2hvcnQgc29ja2V0TnVtID0gaW50cmZjLT5pZl9za251bTsKIApAQCAtMTQxMCw3ICsxNDE3LDcgQEAKIAlpZiAoc29ja2V0TnVtIDwgSVBYX01JTl9FUEhFTUVSQUxfU09DS0VUKQogCQlzb2NrZXROdW0gPSBJUFhfTUlOX0VQSEVNRVJBTF9TT0NLRVQ7CiAKLQl3aGlsZSAoX19pcHhpdGZfZmluZF9zb2NrZXQoaW50cmZjLCBudG9ocyhzb2NrZXROdW0pKSkKKwl3aGlsZSAoX19pcHhpdGZfZmluZF9zb2NrZXQoaW50cmZjLCBodG9ucyhzb2NrZXROdW0pKSkKIAkJaWYgKHNvY2tldE51bSA+IElQWF9NQVhfRVBIRU1FUkFMX1NPQ0tFVCkKIAkJCXNvY2tldE51bSA9IElQWF9NSU5fRVBIRU1FUkFMX1NPQ0tFVDsKIAkJZWxzZQpAQCAtMTQxOSw3ICsxNDI2LDcgQEAKIAlzcGluX3VubG9ja19iaCgmaW50cmZjLT5pZl9za2xpc3RfbG9jayk7CiAJaW50cmZjLT5pZl9za251bSA9IHNvY2tldE51bTsKIAotCXJldHVybiBudG9ocyhzb2NrZXROdW0pOworCXJldHVybiBodG9ucyhzb2NrZXROdW0pOwogfQogCiBzdGF0aWMgaW50IGlweF9iaW5kKHN0cnVjdCBzb2NrZXQgKnNvY2ssIHN0cnVjdCBzb2NrYWRkciAqdWFkZHIsIGludCBhZGRyX2xlbikKQEAgLTE0NzMsNyArMTQ4MCw3IEBACiAJCQkJCQlpcHhzLT5wb3J0KSkgewogCQkJU09DS19ERUJVRyhzaywKIAkJCQkiSVBYOiBiaW5kIGZhaWxlZCBiZWNhdXNlIHBvcnQgJVggaW4gdXNlLlxuIiwKLQkJCQludG9ocygoaW50KWFkZHItPnNpcHhfcG9ydCkpOworCQkJCW50b2hzKGFkZHItPnNpcHhfcG9ydCkpOwogCQkJZ290byBvdXRfcHV0OwogCQl9CiAJfSBlbHNlIHsKQEAgLTE0ODgsNyArMTQ5NSw3IEBACiAJCWlmIChpcHhpdGZfZmluZF9zb2NrZXQoaW50cmZjLCBhZGRyLT5zaXB4X3BvcnQpKSB7CiAJCQlTT0NLX0RFQlVHKHNrLAogCQkJCSJJUFg6IGJpbmQgZmFpbGVkIGJlY2F1c2UgcG9ydCAlWCBpbiB1c2UuXG4iLAotCQkJCW50b2hzKChpbnQpYWRkci0+c2lweF9wb3J0KSk7CisJCQkJbnRvaHMoYWRkci0+c2lweF9wb3J0KSk7CiAJCQlnb3RvIG91dF9wdXQ7CiAJCX0KIAl9CkBAIC0xNjY1LDcgKzE2NzIsNyBAQAogCWludHJmYyA9IGlweGl0Zl9maW5kX3VzaW5nX3BoeXMoZGV2LCBwdC0+dHlwZSk7CiAJaWYgKCFpbnRyZmMpIHsKIAkJaWYgKGlweGNmZ19hdXRvX2NyZWF0ZV9pbnRlcmZhY2VzICYmCi0JCSAgIG50b2hsKElQWF9TS0JfQ0Ioc2tiKS0+aXB4X2Rlc3RfbmV0KSkgeworCQkgICBJUFhfU0tCX0NCKHNrYiktPmlweF9kZXN0X25ldCkgewogCQkJaW50cmZjID0gaXB4aXRmX2F1dG9fY3JlYXRlKGRldiwgcHQtPnR5cGUpOwogCQkJaWYgKGludHJmYykKIAkJCQlpcHhpdGZfaG9sZChpbnRyZmMpOwpkaWZmIC0tZ2l0IGEvbmV0L2lweC9pcHhfcHJvYy5jIGIvbmV0L2lweC9pcHhfcHJvYy5jCmluZGV4IDRjMGM3MTIuLmI3NDYzZGYgMTAwNjQ0Ci0tLSBhL25ldC9pcHgvaXB4X3Byb2MuYworKysgYi9uZXQvaXB4L2lweF9wcm9jLmMKQEAgLTI2MCwyMiArMjYwLDIyIEBACiAJaXB4cyA9IGlweF9zayhzKTsKICNpZmRlZiBDT05GSUdfSVBYX0lOVEVSTgogCXNlcV9wcmludGYoc2VxLCAiJTA4bFg6JTAyWCUwMlglMDJYJTAyWCUwMlglMDJYOiUwNFggICIsCi0JCSAgICh1bnNpZ25lZCBsb25nKWh0b25sKGlweHMtPmludHJmYy0+aWZfbmV0bnVtKSwKKwkJICAgKHVuc2lnbmVkIGxvbmcpbnRvaGwoaXB4cy0+aW50cmZjLT5pZl9uZXRudW0pLAogCQkgICBpcHhzLT5ub2RlWzBdLCBpcHhzLT5ub2RlWzFdLCBpcHhzLT5ub2RlWzJdLCBpcHhzLT5ub2RlWzNdLAotCQkgICBpcHhzLT5ub2RlWzRdLCBpcHhzLT5ub2RlWzVdLCBodG9ucyhpcHhzLT5wb3J0KSk7CisJCSAgIGlweHMtPm5vZGVbNF0sIGlweHMtPm5vZGVbNV0sIG50b2hzKGlweHMtPnBvcnQpKTsKICNlbHNlCi0Jc2VxX3ByaW50ZihzZXEsICIlMDhsWDolMDRYICAiLCAodW5zaWduZWQgbG9uZykgaHRvbmwoaXB4cy0+aW50cmZjLT5pZl9uZXRudW0pLAotCQkgICBodG9ucyhpcHhzLT5wb3J0KSk7CisJc2VxX3ByaW50ZihzZXEsICIlMDhsWDolMDRYICAiLCAodW5zaWduZWQgbG9uZykgbnRvaGwoaXB4cy0+aW50cmZjLT5pZl9uZXRudW0pLAorCQkgICBudG9ocyhpcHhzLT5wb3J0KSk7CiAjZW5kaWYJLyogQ09ORklHX0lQWF9JTlRFUk4gKi8KIAlpZiAocy0+c2tfc3RhdGUgIT0gVENQX0VTVEFCTElTSEVEKQogCQlzZXFfcHJpbnRmKHNlcSwgIiUtMjhzIiwgIk5vdF9Db25uZWN0ZWQiKTsKIAllbHNlIHsKIAkJc2VxX3ByaW50ZihzZXEsICIlMDhsWDolMDJYJTAyWCUwMlglMDJYJTAyWCUwMlg6JTA0WCAgIiwKLQkJCSAgICh1bnNpZ25lZCBsb25nKWh0b25sKGlweHMtPmRlc3RfYWRkci5uZXQpLAorCQkJICAgKHVuc2lnbmVkIGxvbmcpbnRvaGwoaXB4cy0+ZGVzdF9hZGRyLm5ldCksCiAJCQkgICBpcHhzLT5kZXN0X2FkZHIubm9kZVswXSwgaXB4cy0+ZGVzdF9hZGRyLm5vZGVbMV0sCiAJCQkgICBpcHhzLT5kZXN0X2FkZHIubm9kZVsyXSwgaXB4cy0+ZGVzdF9hZGRyLm5vZGVbM10sCiAJCQkgICBpcHhzLT5kZXN0X2FkZHIubm9kZVs0XSwgaXB4cy0+ZGVzdF9hZGRyLm5vZGVbNV0sCi0JCQkgICBodG9ucyhpcHhzLT5kZXN0X2FkZHIuc29jaykpOworCQkJICAgbnRvaHMoaXB4cy0+ZGVzdF9hZGRyLnNvY2spKTsKIAl9CiAKIAlzZXFfcHJpbnRmKHNlcSwgIiUwOFggICUwOFggICUwMlggICAgICUwM2RcbiIsCmRpZmYgLS1naXQgYS9uZXQvaXB4L2lweF9yb3V0ZS5jIGIvbmV0L2lweC9pcHhfcm91dGUuYwppbmRleCBhMzBkYmIxLi42ODU2MGVlIDEwMDY0NAotLS0gYS9uZXQvaXB4L2lweF9yb3V0ZS5jCisrKyBiL25ldC9pcHgvaXB4X3JvdXRlLmMKQEAgLTE5LDE3ICsxOSwxNyBAQAogCiBleHRlcm4gc3RydWN0IGlweF9pbnRlcmZhY2UgKmlweF9pbnRlcm5hbF9uZXQ7CiAKLWV4dGVybiBfX3UxNiBpcHhfY2tzdW0oc3RydWN0IGlweGhkciAqcGFja2V0LCBpbnQgbGVuZ3RoKTsKLWV4dGVybiBzdHJ1Y3QgaXB4X2ludGVyZmFjZSAqaXB4aXRmX2ZpbmRfdXNpbmdfbmV0KF9fdTMyIG5ldCk7CitleHRlcm4gX19iZTE2IGlweF9ja3N1bShzdHJ1Y3QgaXB4aGRyICpwYWNrZXQsIGludCBsZW5ndGgpOworZXh0ZXJuIHN0cnVjdCBpcHhfaW50ZXJmYWNlICppcHhpdGZfZmluZF91c2luZ19uZXQoX19iZTMyIG5ldCk7CiBleHRlcm4gaW50IGlweGl0Zl9kZW11eF9zb2NrZXQoc3RydWN0IGlweF9pbnRlcmZhY2UgKmludHJmYywKIAkJCSAgICAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBpbnQgY29weSk7CiBleHRlcm4gaW50IGlweGl0Zl9kZW11eF9zb2NrZXQoc3RydWN0IGlweF9pbnRlcmZhY2UgKmludHJmYywKIAkJCSAgICAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBpbnQgY29weSk7CiBleHRlcm4gaW50IGlweGl0Zl9zZW5kKHN0cnVjdCBpcHhfaW50ZXJmYWNlICppbnRyZmMsIHN0cnVjdCBza19idWZmICpza2IsCiAJCSAgICAgICBjaGFyICpub2RlKTsKLWV4dGVybiBzdHJ1Y3QgaXB4X2ludGVyZmFjZSAqaXB4aXRmX2ZpbmRfdXNpbmdfbmV0KF9fdTMyIG5ldCk7CitleHRlcm4gc3RydWN0IGlweF9pbnRlcmZhY2UgKmlweGl0Zl9maW5kX3VzaW5nX25ldChfX2JlMzIgbmV0KTsKIAotc3RydWN0IGlweF9yb3V0ZSAqaXB4cnRyX2xvb2t1cChfX3UzMiBuZXQpCitzdHJ1Y3QgaXB4X3JvdXRlICppcHhydHJfbG9va3VwKF9fYmUzMiBuZXQpCiB7CiAJc3RydWN0IGlweF9yb3V0ZSAqcjsKIApAQCAtNDgsNyArNDgsNyBAQAogLyoKICAqIENhbGxlciBtdXN0IGhvbGQgYSByZWZlcmVuY2UgdG8gaW50cmZjCiAgKi8KLWludCBpcHhydHJfYWRkX3JvdXRlKF9fdTMyIG5ldHdvcmssIHN0cnVjdCBpcHhfaW50ZXJmYWNlICppbnRyZmMsCitpbnQgaXB4cnRyX2FkZF9yb3V0ZShfX2JlMzIgbmV0d29yaywgc3RydWN0IGlweF9pbnRlcmZhY2UgKmludHJmYywKIAkJICAgICB1bnNpZ25lZCBjaGFyICpub2RlKQogewogCXN0cnVjdCBpcHhfcm91dGUgKnJ0OwpAQCAtMTE4LDcgKzExOCw3IEBACiAJcmV0dXJuIHJjOwogfQogCi1zdGF0aWMgaW50IGlweHJ0cl9kZWxldGUoX191MzIgbmV0KQorc3RhdGljIGludCBpcHhydHJfZGVsZXRlKF9fYmUzMiBuZXQpCiB7CiAJc3RydWN0IGlweF9yb3V0ZSAqciwgKnRtcDsKIAlpbnQgcmM7CkBAIC0yMzgsNyArMjM4LDcgQEAKIAogCS8qIEFwcGx5IGNoZWNrc3VtLiBOb3QgYWxsb3dlZCBvbiA4MDIuMyBsaW5rcy4gKi8KIAlpZiAoc2stPnNrX25vX2NoZWNrIHx8IGludHJmYy0+aWZfZGxpbmtfdHlwZSA9PSBodG9ucyhJUFhfRlJBTUVfODAyMykpCi0JCWlweC0+aXB4X2NoZWNrc3VtID0gMHhGRkZGOworCQlpcHgtPmlweF9jaGVja3N1bSA9IGh0b25zKDB4RkZGRik7CiAJZWxzZQogCQlpcHgtPmlweF9jaGVja3N1bSA9IGlweF9ja3N1bShpcHgsIGxlbiArIHNpemVvZihzdHJ1Y3QgaXB4aGRyKSk7CiAKZGlmZiAtLWdpdCBhL25ldC9pcmRhL2lybG1wLmMgYi9uZXQvaXJkYS9pcmxtcC5jCmluZGV4IDUwNzMyNjEuLmZlZGU4MzcgMTAwNjQ0Ci0tLSBhL25ldC9pcmRhL2lybG1wLmMKKysrIGIvbmV0L2lyZGEvaXJsbXAuYwpAQCAtMTY3OCw3ICsxNjc4LDggQEAKIAkgKiAgZXZlcnkgSXJMQVAgY29ubmVjdGlvbiBhbmQgY2hlY2sgZXZlcnkgTFNBUCBhc3NvY2lhdGVkIHdpdGggZWFjaAogCSAqICB0aGUgY29ubmVjdGlvbi4KIAkgKi8KLQlzcGluX2xvY2tfaXJxc2F2ZSgmaXJsbXAtPmxpbmtzLT5oYl9zcGlubG9jaywgZmxhZ3MpOworCXNwaW5fbG9ja19pcnFzYXZlX25lc3RlZCgmaXJsbXAtPmxpbmtzLT5oYl9zcGlubG9jaywgZmxhZ3MsCisJCQlTSU5HTEVfREVQVEhfTkVTVElORyk7CiAJbGFwID0gKHN0cnVjdCBsYXBfY2IgKikgaGFzaGJpbl9nZXRfZmlyc3QoaXJsbXAtPmxpbmtzKTsKIAl3aGlsZSAobGFwICE9IE5VTEwpIHsKIAkJSVJEQV9BU1NFUlQobGFwLT5tYWdpYyA9PSBMTVBfTEFQX01BR0lDLCBnb3RvIGVycmxhcDspOwpkaWZmIC0tZ2l0IGEvbmV0L2tleS9hZl9rZXkuYyBiL25ldC9rZXkvYWZfa2V5LmMKaW5kZXggZmY5OGU3MC4uMjBmZjdjYyAxMDA2NDQKLS0tIGEvbmV0L2tleS9hZl9rZXkuYworKysgYi9uZXQva2V5L2FmX2tleS5jCkBAIC0yOTI4LDExICsyOTI4LDYgQEAKIAkJaWYgKCpkaXIpCiAJCQlnb3RvIG91dDsKIAl9Ci0JZWxzZSB7Ci0JCSpkaXIgPSBzZWN1cml0eV94ZnJtX3NvY2tfcG9saWN5X2FsbG9jKHhwLCBzayk7Ci0JCWlmICgqZGlyKQotCQkJZ290byBvdXQ7Ci0JfQogCiAJKmRpciA9IHBvbC0+c2FkYl94X3BvbGljeV9kaXItMTsKIAlyZXR1cm4geHA7CmRpZmYgLS1naXQgYS9uZXQvbmV0ZmlsdGVyL0tjb25maWcgYi9uZXQvbmV0ZmlsdGVyL0tjb25maWcKaW5kZXggY2U5NDczMi4uZjYxOWM2NSAxMDA2NDQKLS0tIGEvbmV0L25ldGZpbHRlci9LY29uZmlnCisrKyBiL25ldC9uZXRmaWx0ZXIvS2NvbmZpZwpAQCAtMjA5LDcgKzIwOSw5IEBACiAKIGNvbmZpZyBORVRGSUxURVJfWFRfVEFSR0VUX0NPTk5TRUNNQVJLCiAJdHJpc3RhdGUgJyJDT05OU0VDTUFSSyIgdGFyZ2V0IHN1cHBvcnQnCi0JZGVwZW5kcyBvbiBORVRGSUxURVJfWFRBQkxFUyAmJiAoTkZfQ09OTlRSQUNLX1NFQ01BUksgfHwgSVBfTkZfQ09OTlRSQUNLX1NFQ01BUkspCisJZGVwZW5kcyBvbiBORVRGSUxURVJfWFRBQkxFUyAmJiBcCisJCSAgICgoTkZfQ09OTlRSQUNLICYmIE5GX0NPTk5UUkFDS19TRUNNQVJLKSB8fCBcCisJCSAgICAoSVBfTkZfQ09OTlRSQUNLICYmIElQX05GX0NPTk5UUkFDS19TRUNNQVJLKSkKIAloZWxwCiAJICBUaGUgQ09OTlNFQ01BUksgdGFyZ2V0IGNvcGllcyBzZWN1cml0eSBtYXJraW5ncyBmcm9tIHBhY2tldHMKIAkgIHRvIGNvbm5lY3Rpb25zLCBhbmQgcmVzdG9yZXMgc2VjdXJpdHkgbWFya2luZ3MgZnJvbSBjb25uZWN0aW9ucwpkaWZmIC0tZ2l0IGEvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfY29yZS5jIGIvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfY29yZS5jCmluZGV4IDA5M2IzZGQuLjgzNjU0MWU1IDEwMDY0NAotLS0gYS9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19jb3JlLmMKKysrIGIvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfY29yZS5jCkBAIC0xNTIwLDkgKzE1MjAsMTAgQEAKIAkJaWYgKGl0ZXIoY3QsIGRhdGEpKQogCQkJZ290byBmb3VuZDsKIAl9CisJd3JpdGVfdW5sb2NrX2JoKCZuZl9jb25udHJhY2tfbG9jayk7CiAJcmV0dXJuIE5VTEw7CiBmb3VuZDoKLQlhdG9taWNfaW5jKCZuZl9jdF90dXBsZWhhc2hfdG9fY3RyYWNrKGgpLT5jdF9nZW5lcmFsLnVzZSk7CisJYXRvbWljX2luYygmY3QtPmN0X2dlbmVyYWwudXNlKTsKIAl3cml0ZV91bmxvY2tfYmgoJm5mX2Nvbm50cmFja19sb2NrKTsKIAlyZXR1cm4gY3Q7CiB9CmRpZmYgLS1naXQgYS9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19uZXRsaW5rLmMgYi9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19uZXRsaW5rLmMKaW5kZXggMTcyMWY3Yy4uYmQwMTU2YSAxMDA2NDQKLS0tIGEvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfbmV0bGluay5jCisrKyBiL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX25ldGxpbmsuYwpAQCAtNDcsMTMgKzQ3LDYgQEAKIAogc3RhdGljIGNoYXIgX19pbml0ZGF0YSB2ZXJzaW9uW10gPSAiMC45MyI7CiAKLSNpZiAwCi0jZGVmaW5lIERFQlVHUCBwcmludGsKLSNlbHNlCi0jZGVmaW5lIERFQlVHUChmb3JtYXQsIGFyZ3MuLi4pCi0jZW5kaWYKLQotCiBzdGF0aWMgaW5saW5lIGludAogY3RuZXRsaW5rX2R1bXBfdHVwbGVzX3Byb3RvKHN0cnVjdCBza19idWZmICpza2IsIAogCQkJICAgIGNvbnN0IHN0cnVjdCBuZl9jb25udHJhY2tfdHVwbGUgKnR1cGxlLApAQCAtNDEwLDcgKzQwMyw2IEBACiB7CiAJaWYgKGNiLT5hcmdzWzFdKQogCQluZl9jdF9wdXQoKHN0cnVjdCBuZl9jb25uICopY2ItPmFyZ3NbMV0pOwotCURFQlVHUCgiZW50ZXJlZCAlc1xuIiwgX19GVU5DVElPTl9fKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtNDI1LDkgKzQxNyw2IEBACiAJc3RydWN0IG5mZ2VubXNnICpuZm1zZyA9IE5MTVNHX0RBVEEoY2ItPm5saCk7CiAJdV9pbnQ4X3QgbDNwcm90byA9IG5mbXNnLT5uZmdlbl9mYW1pbHk7CiAKLQlERUJVR1AoImVudGVyZWQgJXMsIGxhc3QgYnVja2V0PSVsdSBpZD0ldVxuIiwgX19GVU5DVElPTl9fLCAKLQkJCWNiLT5hcmdzWzBdLCAqaWQpOwotCiAJcmVhZF9sb2NrX2JoKCZuZl9jb25udHJhY2tfbG9jayk7CiAJbGFzdCA9IChzdHJ1Y3QgbmZfY29ubiAqKWNiLT5hcmdzWzFdOwogCWZvciAoOyBjYi0+YXJnc1swXSA8IG5mX2Nvbm50cmFja19odGFibGVfc2l6ZTsgY2ItPmFyZ3NbMF0rKykgewpAQCAtNDcxLDcgKzQ2MCw2IEBACiAJaWYgKGxhc3QpCiAJCW5mX2N0X3B1dChsYXN0KTsKIAotCURFQlVHUCgibGVhdmluZywgbGFzdCBidWNrZXQ9JWx1IGlkPSV1XG4iLCBjYi0+YXJnc1swXSwgKmlkKTsKIAlyZXR1cm4gc2tiLT5sZW47CiB9CiAKQEAgLTQ4Miw4ICs0NzAsNiBAQAogCXN0cnVjdCBuZl9jb25udHJhY2tfbDNwcm90byAqbDNwcm90bzsKIAlpbnQgcmV0ID0gMDsKIAotCURFQlVHUCgiZW50ZXJlZCAlc1xuIiwgX19GVU5DVElPTl9fKTsKLQogCW5mYXR0cl9wYXJzZV9uZXN0ZWQodGIsIENUQV9JUF9NQVgsIGF0dHIpOwogCiAJbDNwcm90byA9IG5mX2N0X2wzcHJvdG9fZmluZF9nZXQodHVwbGUtPnNyYy5sM251bSk7CkBAIC00OTMsOCArNDc5LDYgQEAKIAogCW5mX2N0X2wzcHJvdG9fcHV0KGwzcHJvdG8pOwogCi0JREVCVUdQKCJsZWF2aW5nXG4iKTsKLQogCXJldHVybiByZXQ7CiB9CiAKQEAgLTUxMCw4ICs0OTQsNiBAQAogCXN0cnVjdCBuZl9jb25udHJhY2tfcHJvdG9jb2wgKnByb3RvOwogCWludCByZXQgPSAwOwogCi0JREVCVUdQKCJlbnRlcmVkICVzXG4iLCBfX0ZVTkNUSU9OX18pOwotCiAJbmZhdHRyX3BhcnNlX25lc3RlZCh0YiwgQ1RBX1BST1RPX01BWCwgYXR0cik7CiAKIAlpZiAobmZhdHRyX2JhZF9zaXplKHRiLCBDVEFfUFJPVE9fTUFYLCBjdGFfbWluX3Byb3RvKSkKQEAgLTUzOCw4ICs1MjAsNiBAQAogCXN0cnVjdCBuZmF0dHIgKnRiW0NUQV9UVVBMRV9NQVhdOwogCWludCBlcnI7CiAKLQlERUJVR1AoImVudGVyZWQgJXNcbiIsIF9fRlVOQ1RJT05fXyk7Ci0KIAltZW1zZXQodHVwbGUsIDAsIHNpemVvZigqdHVwbGUpKTsKIAogCW5mYXR0cl9wYXJzZV9uZXN0ZWQodGIsIENUQV9UVVBMRV9NQVgsIGNkYVt0eXBlLTFdKTsKQEAgLTU2NiwxMCArNTQ2LDYgQEAKIAllbHNlCiAJCXR1cGxlLT5kc3QuZGlyID0gSVBfQ1RfRElSX09SSUdJTkFMOwogCi0JTkZfQ1RfRFVNUF9UVVBMRSh0dXBsZSk7Ci0KLQlERUJVR1AoImxlYXZpbmdcbiIpOwotCiAJcmV0dXJuIDA7CiB9CiAKQEAgLTU4Niw4ICs1NjIsNiBAQAogCXN0cnVjdCBuZmF0dHIgKnRiW0NUQV9QUk9UT05BVF9NQVhdOwogCXN0cnVjdCBpcF9uYXRfcHJvdG9jb2wgKm5wdDsKIAotCURFQlVHUCgiZW50ZXJlZCAlc1xuIiwgX19GVU5DVElPTl9fKTsKLQogCW5mYXR0cl9wYXJzZV9uZXN0ZWQodGIsIENUQV9QUk9UT05BVF9NQVgsIGF0dHIpOwogCiAJaWYgKG5mYXR0cl9iYWRfc2l6ZSh0YiwgQ1RBX1BST1RPTkFUX01BWCwgY3RhX21pbl9wcm90b25hdCkpCkBAIC02MDYsNyArNTgwLDYgQEAKIAogCWlwX25hdF9wcm90b19wdXQobnB0KTsKIAotCURFQlVHUCgibGVhdmluZ1xuIik7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTYyMiw4ICs1OTUsNiBAQAogCXN0cnVjdCBuZmF0dHIgKnRiW0NUQV9OQVRfTUFYXTsKIAlpbnQgZXJyOwogCi0JREVCVUdQKCJlbnRlcmVkICVzXG4iLCBfX0ZVTkNUSU9OX18pOwotCiAJbWVtc2V0KHJhbmdlLCAwLCBzaXplb2YoKnJhbmdlKSk7CiAJCiAJbmZhdHRyX3BhcnNlX25lc3RlZCh0YiwgQ1RBX05BVF9NQVgsIG5hdCk7CkBAIC02NDksNyArNjIwLDYgQEAKIAlpZiAoZXJyIDwgMCkKIAkJcmV0dXJuIGVycjsKIAotCURFQlVHUCgibGVhdmluZ1xuIik7CiAJcmV0dXJuIDA7CiB9CiAjZW5kaWYKQEAgLTY1OSw4ICs2MjksNiBAQAogewogCXN0cnVjdCBuZmF0dHIgKnRiW0NUQV9IRUxQX01BWF07CiAKLQlERUJVR1AoImVudGVyZWQgJXNcbiIsIF9fRlVOQ1RJT05fXyk7Ci0KIAluZmF0dHJfcGFyc2VfbmVzdGVkKHRiLCBDVEFfSEVMUF9NQVgsIGF0dHIpOwogCiAJaWYgKCF0YltDVEFfSEVMUF9OQU1FLTFdKQpAQCAtNjkwLDggKzY1OCw2IEBACiAJdV9pbnQ4X3QgdTMgPSBuZm1zZy0+bmZnZW5fZmFtaWx5OwogCWludCBlcnIgPSAwOwogCi0JREVCVUdQKCJlbnRlcmVkICVzXG4iLCBfX0ZVTkNUSU9OX18pOwotCiAJaWYgKG5mYXR0cl9iYWRfc2l6ZShjZGEsIENUQV9NQVgsIGN0YV9taW4pKQogCQlyZXR1cm4gLUVJTlZBTDsKIApAQCAtNzA5LDEwICs2NzUsOCBAQAogCQlyZXR1cm4gZXJyOwogCiAJaCA9IG5mX2Nvbm50cmFja19maW5kX2dldCgmdHVwbGUsIE5VTEwpOwotCWlmICghaCkgewotCQlERUJVR1AoInR1cGxlIG5vdCBmb3VuZCBpbiBjb25udHJhY2sgaGFzaFxuIik7CisJaWYgKCFoKQogCQlyZXR1cm4gLUVOT0VOVDsKLQl9CiAKIAljdCA9IG5mX2N0X3R1cGxlaGFzaF90b19jdHJhY2soaCk7CiAJCkBAIC03MjcsNyArNjkxLDYgQEAKIAkJY3QtPnRpbWVvdXQuZnVuY3Rpb24oKHVuc2lnbmVkIGxvbmcpY3QpOwogCiAJbmZfY3RfcHV0KGN0KTsKLQlERUJVR1AoImxlYXZpbmdcbiIpOwogCiAJcmV0dXJuIDA7CiB9CkBAIC03NDQsOCArNzA3LDYgQEAKIAl1X2ludDhfdCB1MyA9IG5mbXNnLT5uZmdlbl9mYW1pbHk7CiAJaW50IGVyciA9IDA7CiAKLQlERUJVR1AoImVudGVyZWQgJXNcbiIsIF9fRlVOQ1RJT05fXyk7Ci0KIAlpZiAobmxoLT5ubG1zZ19mbGFncyAmIE5MTV9GX0RVTVApIHsKIAkJdTMyIHJsZW47CiAKQEAgLTc3OSwxMSArNzQwLDkgQEAKIAkJcmV0dXJuIGVycjsKIAogCWggPSBuZl9jb25udHJhY2tfZmluZF9nZXQoJnR1cGxlLCBOVUxMKTsKLQlpZiAoIWgpIHsKLQkJREVCVUdQKCJ0dXBsZSBub3QgZm91bmQgaW4gY29ubnRyYWNrIGhhc2giKTsKKwlpZiAoIWgpCiAJCXJldHVybiAtRU5PRU5UOwotCX0KLQlERUJVR1AoInR1cGxlIGZvdW5kXG4iKTsKKwogCWN0ID0gbmZfY3RfdHVwbGVoYXNoX3RvX2N0cmFjayhoKTsKIAogCWVyciA9IC1FTk9NRU07CkBAIC04MDQsNyArNzYzLDYgQEAKIAlpZiAoZXJyIDwgMCkKIAkJZ290byBvdXQ7CiAKLQlERUJVR1AoImxlYXZpbmdcbiIpOwogCXJldHVybiAwOwogCiBmcmVlOgpAQCAtODc2LDggKzgzNCw2IEBACiAJY2hhciAqaGVscG5hbWU7CiAJaW50IGVycjsKIAotCURFQlVHUCgiZW50ZXJlZCAlc1xuIiwgX19GVU5DVElPTl9fKTsKLQogCWlmICghaGVscCkgewogCQkvKiBGSVhNRTogd2UgbmVlZCB0byByZWFsbG9jYXRlIGFuZCByZWhhc2ggKi8KIAkJcmV0dXJuIC1FQlVTWTsKQEAgLTk1NCw4ICs5MTAsNiBAQAogewogCWludCBlcnI7CiAKLQlERUJVR1AoImVudGVyZWQgJXNcbiIsIF9fRlVOQ1RJT05fXyk7Ci0KIAlpZiAoY2RhW0NUQV9IRUxQLTFdKSB7CiAJCWVyciA9IGN0bmV0bGlua19jaGFuZ2VfaGVscGVyKGN0LCBjZGEpOwogCQlpZiAoZXJyIDwgMCkKQEAgLTk4NSw3ICs5MzksNiBAQAogCQljdC0+bWFyayA9IG50b2hsKCoodV9pbnQzMl90ICopTkZBX0RBVEEoY2RhW0NUQV9NQVJLLTFdKSk7CiAjZW5kaWYKIAotCURFQlVHUCgiYWxsIGRvbmVcbiIpOwogCXJldHVybiAwOwogfQogCkBAIC05OTcsOCArOTUwLDYgQEAKIAlzdHJ1Y3QgbmZfY29ubiAqY3Q7CiAJaW50IGVyciA9IC1FSU5WQUw7CiAKLQlERUJVR1AoImVudGVyZWQgJXNcbiIsIF9fRlVOQ1RJT05fXyk7Ci0KIAljdCA9IG5mX2Nvbm50cmFja19hbGxvYyhvdHVwbGUsIHJ0dXBsZSk7CiAJaWYgKGN0ID09IE5VTEwgfHwgSVNfRVJSKGN0KSkKIAkJcmV0dXJuIC1FTk9NRU07CQpAQCAtMTAyOCw3ICs5NzksNiBAQAogCWFkZF90aW1lcigmY3QtPnRpbWVvdXQpOwogCW5mX2Nvbm50cmFja19oYXNoX2luc2VydChjdCk7CiAKLQlERUJVR1AoImNvbm50cmFjayB3aXRoIGlkICV1IGluc2VydGVkXG4iLCBjdC0+aWQpOwogCXJldHVybiAwOwogCiBlcnI6CQpAQCAtMTA0Niw4ICs5OTYsNiBAQAogCXVfaW50OF90IHUzID0gbmZtc2ctPm5mZ2VuX2ZhbWlseTsKIAlpbnQgZXJyID0gMDsKIAotCURFQlVHUCgiZW50ZXJlZCAlc1xuIiwgX19GVU5DVElPTl9fKTsKLQogCWlmIChuZmF0dHJfYmFkX3NpemUoY2RhLCBDVEFfTUFYLCBjdGFfbWluKSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKQEAgLTEwNzEsNyArMTAxOSw2IEBACiAKIAlpZiAoaCA9PSBOVUxMKSB7CiAJCXdyaXRlX3VubG9ja19iaCgmbmZfY29ubnRyYWNrX2xvY2spOwotCQlERUJVR1AoIm5vIHN1Y2ggY29ubnRyYWNrLCBjcmVhdGUgbmV3XG4iKTsKIAkJZXJyID0gLUVOT0VOVDsKIAkJaWYgKG5saC0+bmxtc2dfZmxhZ3MgJiBOTE1fRl9DUkVBVEUpCiAJCQllcnIgPSBjdG5ldGxpbmtfY3JlYXRlX2Nvbm50cmFjayhjZGEsICZvdHVwbGUsICZydHVwbGUpOwpAQCAtMTA4Nyw3ICsxMDM0LDYgQEAKIAogCS8qIFdlIG1hbmlwdWxhdGUgdGhlIGNvbm50cmFjayBpbnNpZGUgdGhlIGdsb2JhbCBjb25udHJhY2sgdGFibGUgbG9jaywKIAkgKiBzbyB0aGVyZSdzIG5vIG5lZWQgdG8gaW5jcmVhc2UgdGhlIHJlZmNvdW50ICovCi0JREVCVUdQKCJjb25udHJhY2sgZm91bmRcbiIpOwogCWVyciA9IC1FRVhJU1Q7CiAJaWYgKCEobmxoLT5ubG1zZ19mbGFncyAmIE5MTV9GX0VYQ0wpKQogCQllcnIgPSBjdG5ldGxpbmtfY2hhbmdlX2Nvbm50cmFjayhuZl9jdF90dXBsZWhhc2hfdG9fY3RyYWNrKGgpLCBjZGEpOwpAQCAtMTI2OCw4ICsxMjE0LDYgQEAKIAlzdHJ1Y3QgbmZnZW5tc2cgKm5mbXNnID0gTkxNU0dfREFUQShjYi0+bmxoKTsKIAl1X2ludDhfdCBsM3Byb3RvID0gbmZtc2ctPm5mZ2VuX2ZhbWlseTsKIAotCURFQlVHUCgiZW50ZXJlZCAlcywgbGFzdCBpZD0lbGx1XG4iLCBfX0ZVTkNUSU9OX18sICppZCk7Ci0KIAlyZWFkX2xvY2tfYmgoJm5mX2Nvbm50cmFja19sb2NrKTsKIAlsaXN0X2Zvcl9lYWNoX3ByZXYoaSwgJm5mX2Nvbm50cmFja19leHBlY3RfbGlzdCkgewogCQlleHAgPSAoc3RydWN0IG5mX2Nvbm50cmFja19leHBlY3QgKikgaTsKQEAgLTEyODcsOCArMTIzMSw2IEBACiBvdXQ6CQogCXJlYWRfdW5sb2NrX2JoKCZuZl9jb25udHJhY2tfbG9jayk7CiAKLQlERUJVR1AoImxlYXZpbmcsIGxhc3QgaWQ9JWxsdVxuIiwgKmlkKTsKLQogCXJldHVybiBza2ItPmxlbjsKIH0KIApAQCAtMTMwOCw4ICsxMjUwLDYgQEAKIAl1X2ludDhfdCB1MyA9IG5mbXNnLT5uZmdlbl9mYW1pbHk7CiAJaW50IGVyciA9IDA7CiAKLQlERUJVR1AoImVudGVyZWQgJXNcbiIsIF9fRlVOQ1RJT05fXyk7Ci0KIAlpZiAobmZhdHRyX2JhZF9zaXplKGNkYSwgQ1RBX0VYUEVDVF9NQVgsIGN0YV9taW5fZXhwKSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKQEAgLTE0NjAsOCArMTQwMCw2IEBACiAJc3RydWN0IG5mX2Nvbm5faGVscCAqaGVscDsKIAlpbnQgZXJyID0gMDsKIAotCURFQlVHUCgiZW50ZXJlZCAlc1xuIiwgX19GVU5DVElPTl9fKTsKLQogCS8qIGNhbGxlciBndWFyYW50ZWVzIHRoYXQgdGhvc2UgdGhyZWUgQ1RBX0VYUEVDVF8qIGV4aXN0ICovCiAJZXJyID0gY3RuZXRsaW5rX3BhcnNlX3R1cGxlKGNkYSwgJnR1cGxlLCBDVEFfRVhQRUNUX1RVUExFLCB1Myk7CiAJaWYgKGVyciA8IDApCkBAIC0xNTE2LDggKzE0NTQsNiBAQAogCXVfaW50OF90IHUzID0gbmZtc2ctPm5mZ2VuX2ZhbWlseTsKIAlpbnQgZXJyID0gMDsKIAotCURFQlVHUCgiZW50ZXJlZCAlc1xuIiwgX19GVU5DVElPTl9fKTsJCi0KIAlpZiAobmZhdHRyX2JhZF9zaXplKGNkYSwgQ1RBX0VYUEVDVF9NQVgsIGN0YV9taW5fZXhwKSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKQEAgLTE1NDYsOCArMTQ4Miw2IEBACiAJCWVyciA9IGN0bmV0bGlua19jaGFuZ2VfZXhwZWN0KGV4cCwgY2RhKTsKIAl3cml0ZV91bmxvY2tfYmgoJm5mX2Nvbm50cmFja19sb2NrKTsKIAotCURFQlVHUCgibGVhdmluZ1xuIik7Ci0JCiAJcmV0dXJuIGVycjsKIH0KIApkaWZmIC0tZ2l0IGEvbmV0L25ldGZpbHRlci9uZm5ldGxpbmtfbG9nLmMgYi9uZXQvbmV0ZmlsdGVyL25mbmV0bGlua19sb2cuYwppbmRleCBiNTlkM2IyLi4xZTUyMDdiIDEwMDY0NAotLS0gYS9uZXQvbmV0ZmlsdGVyL25mbmV0bGlua19sb2cuYworKysgYi9uZXQvbmV0ZmlsdGVyL25mbmV0bGlua19sb2cuYwpAQCAtNDI3LDcgKzQyNyw3IEBACiAJbmZtc2ctPnZlcnNpb24gPSBORk5FVExJTktfVjA7CiAJbmZtc2ctPnJlc19pZCA9IGh0b25zKGluc3QtPmdyb3VwX251bSk7CiAKLQlwbXNnLmh3X3Byb3RvY29sCT0gaHRvbnMoc2tiLT5wcm90b2NvbCk7CisJcG1zZy5od19wcm90b2NvbAk9IHNrYi0+cHJvdG9jb2w7CiAJcG1zZy5ob29rCQk9IGhvb2tudW07CiAKIAlORkFfUFVUKGluc3QtPnNrYiwgTkZVTEFfUEFDS0VUX0hEUiwgc2l6ZW9mKHBtc2cpLCAmcG1zZyk7CkBAIC01NDQsNyArNTQ0LDcgQEAKIAl9CiAJLyogZ2xvYmFsIHNlcXVlbmNlIG51bWJlciAqLwogCWlmIChpbnN0LT5mbGFncyAmIE5GVUxOTF9DRkdfRl9TRVFfR0xPQkFMKSB7Ci0JCXRtcF91aW50ID0gYXRvbWljX2luY19yZXR1cm4oJmdsb2JhbF9zZXEpOworCQl0bXBfdWludCA9IGh0b25sKGF0b21pY19pbmNfcmV0dXJuKCZnbG9iYWxfc2VxKSk7CiAJCU5GQV9QVVQoaW5zdC0+c2tiLCBORlVMQV9TRVFfR0xPQkFMLCBzaXplb2YodG1wX3VpbnQpLCAmdG1wX3VpbnQpOwogCX0KIApAQCAtODc4LDcgKzg3OCw3IEBACiAJCXBhcmFtcyA9IE5GQV9EQVRBKG5mdWxhW05GVUxBX0NGR19NT0RFLTFdKTsKIAogCQluZnVsbmxfc2V0X21vZGUoaW5zdCwgcGFyYW1zLT5jb3B5X21vZGUsCi0JCQkJbnRvaHMocGFyYW1zLT5jb3B5X3JhbmdlKSk7CisJCQkJbnRvaGwocGFyYW1zLT5jb3B5X3JhbmdlKSk7CiAJfQogCiAJaWYgKG5mdWxhW05GVUxBX0NGR19USU1FT1VULTFdKSB7CkBAIC04OTYsOCArODk2LDggQEAKIAl9CiAKIAlpZiAobmZ1bGFbTkZVTEFfQ0ZHX1FUSFJFU0gtMV0pIHsKLQkJdV9pbnQzMl90IHF0aHJlc2ggPSAKLQkJCSoodV9pbnQxNl90ICopTkZBX0RBVEEobmZ1bGFbTkZVTEFfQ0ZHX1FUSFJFU0gtMV0pOworCQlfX2JlMzIgcXRocmVzaCA9CisJCQkqKF9fYmUzMiAqKU5GQV9EQVRBKG5mdWxhW05GVUxBX0NGR19RVEhSRVNILTFdKTsKIAogCQluZnVsbmxfc2V0X3F0aHJlc2goaW5zdCwgbnRvaGwocXRocmVzaCkpOwogCX0KZGlmZiAtLWdpdCBhL25ldC9uZXRmaWx0ZXIvbmZuZXRsaW5rX3F1ZXVlLmMgYi9uZXQvbmV0ZmlsdGVyL25mbmV0bGlua19xdWV1ZS5jCmluZGV4IDhlYjI0NzMuLmU4MTVhOWEgMTAwNjQ0Ci0tLSBhL25ldC9uZXRmaWx0ZXIvbmZuZXRsaW5rX3F1ZXVlLmMKKysrIGIvbmV0L25ldGZpbHRlci9uZm5ldGxpbmtfcXVldWUuYwpAQCAtNDE0LDcgKzQxNCw3IEBACiAJbmZtc2ctPnJlc19pZCA9IGh0b25zKHF1ZXVlLT5xdWV1ZV9udW0pOwogCiAJcG1zZy5wYWNrZXRfaWQgCQk9IGh0b25sKGVudHJ5LT5pZCk7Ci0JcG1zZy5od19wcm90b2NvbAk9IGh0b25zKGVudHNrYi0+cHJvdG9jb2wpOworCXBtc2cuaHdfcHJvdG9jb2wJPSBlbnRza2ItPnByb3RvY29sOwogCXBtc2cuaG9vawkJPSBlbnRpbmYtPmhvb2s7CiAKIAlORkFfUFVUKHNrYiwgTkZRQV9QQUNLRVRfSERSLCBzaXplb2YocG1zZyksICZwbXNnKTsKQEAgLTYyMiw5ICs2MjIsMTAgQEAKIAlpbnQgZGlmZjsKIAogCWRpZmYgPSBkYXRhX2xlbiAtIGUtPnNrYi0+bGVuOwotCWlmIChkaWZmIDwgMCkKLQkJc2tiX3RyaW0oZS0+c2tiLCBkYXRhX2xlbik7Ci0JZWxzZSBpZiAoZGlmZiA+IDApIHsKKwlpZiAoZGlmZiA8IDApIHsKKwkJaWYgKHBza2JfdHJpbShlLT5za2IsIGRhdGFfbGVuKSkKKwkJCXJldHVybiAtRU5PTUVNOworCX0gZWxzZSBpZiAoZGlmZiA+IDApIHsKIAkJaWYgKGRhdGFfbGVuID4gMHhGRkZGKQogCQkJcmV0dXJuIC1FSU5WQUw7CiAJCWlmIChkaWZmID4gc2tiX3RhaWxyb29tKGUtPnNrYikpIHsKZGlmZiAtLWdpdCBhL25ldC9uZXRmaWx0ZXIveHRfTkZRVUVVRS5jIGIvbmV0L25ldGZpbHRlci94dF9ORlFVRVVFLmMKaW5kZXggZGI5Yjg5Ni4uMzllMTE3NSAxMDA2NDQKLS0tIGEvbmV0L25ldGZpbHRlci94dF9ORlFVRVVFLmMKKysrIGIvbmV0L25ldGZpbHRlci94dF9ORlFVRVVFLmMKQEAgLTY4LDcgKzY4LDcgQEAKIAogc3RhdGljIHZvaWQgX19leGl0IHh0X25mcXVldWVfZmluaSh2b2lkKQogewotCXh0X3JlZ2lzdGVyX3RhcmdldHMoeHRfbmZxdWV1ZV90YXJnZXQsIEFSUkFZX1NJWkUoeHRfbmZxdWV1ZV90YXJnZXQpKTsKKwl4dF91bnJlZ2lzdGVyX3RhcmdldHMoeHRfbmZxdWV1ZV90YXJnZXQsIEFSUkFZX1NJWkUoeHRfbmZxdWV1ZV90YXJnZXQpKTsKIH0KIAogbW9kdWxlX2luaXQoeHRfbmZxdWV1ZV9pbml0KTsKZGlmZiAtLWdpdCBhL25ldC9uZXRmaWx0ZXIveHRfY29ubm1hcmsuYyBiL25ldC9uZXRmaWx0ZXIveHRfY29ubm1hcmsuYwppbmRleCA5MmE1NzI2Li5hOGYwMzA1IDEwMDY0NAotLS0gYS9uZXQvbmV0ZmlsdGVyL3h0X2Nvbm5tYXJrLmMKKysrIGIvbmV0L25ldGZpbHRlci94dF9jb25ubWFyay5jCkBAIC0xNDcsNyArMTQ3LDcgQEAKIAogc3RhdGljIHZvaWQgX19leGl0IHh0X2Nvbm5tYXJrX2Zpbmkodm9pZCkKIHsKLQl4dF9yZWdpc3Rlcl9tYXRjaGVzKHh0X2Nvbm5tYXJrX21hdGNoLCBBUlJBWV9TSVpFKHh0X2Nvbm5tYXJrX21hdGNoKSk7CisJeHRfdW5yZWdpc3Rlcl9tYXRjaGVzKHh0X2Nvbm5tYXJrX21hdGNoLCBBUlJBWV9TSVpFKHh0X2Nvbm5tYXJrX21hdGNoKSk7CiB9CiAKIG1vZHVsZV9pbml0KHh0X2Nvbm5tYXJrX2luaXQpOwpkaWZmIC0tZ2l0IGEvbmV0L25ldGxhYmVsL0tjb25maWcgYi9uZXQvbmV0bGFiZWwvS2NvbmZpZwppbmRleCA5ZjcxMjFhLi41Njk1OGM4IDEwMDY0NAotLS0gYS9uZXQvbmV0bGFiZWwvS2NvbmZpZworKysgYi9uZXQvbmV0bGFiZWwvS2NvbmZpZwpAQCAtNCw3ICs0LDcgQEAKIAogY29uZmlnIE5FVExBQkVMCiAJYm9vbCAiTmV0TGFiZWwgc3Vic3lzdGVtIHN1cHBvcnQiCi0JZGVwZW5kcyBvbiBORVQgJiYgU0VDVVJJVFkKKwlkZXBlbmRzIG9uIFNFQ1VSSVRZCiAJZGVmYXVsdCBuCiAJLS0taGVscC0tLQogCSAgTmV0TGFiZWwgcHJvdmlkZXMgc3VwcG9ydCBmb3IgZXhwbGljaXQgbmV0d29yayBwYWNrZXQgbGFiZWxpbmcKZGlmZiAtLWdpdCBhL25ldC9uZXRsYWJlbC9uZXRsYWJlbF9rYXBpLmMgYi9uZXQvbmV0bGFiZWwvbmV0bGFiZWxfa2FwaS5jCmluZGV4IDU0ZmI3ZGUuLmZmOTcxMTAgMTAwNjQ0Ci0tLSBhL25ldC9uZXRsYWJlbC9uZXRsYWJlbF9rYXBpLmMKKysrIGIvbmV0L25ldGxhYmVsL25ldGxhYmVsX2thcGkuYwpAQCAtMjAwLDcgKzIwMCw3IEBACiBpbnQgbmV0bGJsX2NhY2hlX2FkZChjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAogCQkgICAgIGNvbnN0IHN0cnVjdCBuZXRsYmxfbHNtX3NlY2F0dHIgKnNlY2F0dHIpCiB7Ci0JaWYgKHNlY2F0dHItPmNhY2hlLmRhdGEgPT0gTlVMTCkKKwlpZiAoc2VjYXR0ci0+Y2FjaGUgPT0gTlVMTCkKIAkJcmV0dXJuIC1FTk9NU0c7CiAKIAlpZiAoQ0lQU09fVjRfT1BURVhJU1Qoc2tiKSkKZGlmZiAtLWdpdCBhL25ldC9uZXRsaW5rL2FmX25ldGxpbmsuYyBiL25ldC9uZXRsaW5rL2FmX25ldGxpbmsuYwppbmRleCBkNTZlMGQyLi5kNTI3Yzg5IDEwMDY0NAotLS0gYS9uZXQvbmV0bGluay9hZl9uZXRsaW5rLmMKKysrIGIvbmV0L25ldGxpbmsvYWZfbmV0bGluay5jCkBAIC0xMDc1LDggKzEwNzUsOSBAQAogCQkJcmV0dXJuIC1FSU5WQUw7CiAJCWxlbiA9IHNpemVvZihpbnQpOwogCQl2YWwgPSBubGstPmZsYWdzICYgTkVUTElOS19SRUNWX1BLVElORk8gPyAxIDogMDsKLQkJcHV0X3VzZXIobGVuLCBvcHRsZW4pOwotCQlwdXRfdXNlcih2YWwsIG9wdHZhbCk7CisJCWlmIChwdXRfdXNlcihsZW4sIG9wdGxlbikgfHwKKwkJICAgIHB1dF91c2VyKHZhbCwgb3B0dmFsKSkKKwkJCXJldHVybiAtRUZBVUxUOwogCQllcnIgPSAwOwogCQlicmVhazsKIAlkZWZhdWx0OgpkaWZmIC0tZ2l0IGEvbmV0L3NjaGVkL3NjaF9odGIuYyBiL25ldC9zY2hlZC9zY2hfaHRiLmMKaW5kZXggYmIzZGRkNC4uNGI1MmZhNyAxMDA2NDQKLS0tIGEvbmV0L3NjaGVkL3NjaF9odGIuYworKysgYi9uZXQvc2NoZWQvc2NoX2h0Yi5jCkBAIC03ODYsMTEgKzc4NiwxMCBAQAogCWZvciAoaSA9IDA7IGkgPCA1MDA7IGkrKykgewogCQlzdHJ1Y3QgaHRiX2NsYXNzICpjbDsKIAkJbG9uZyBkaWZmOwotCQlzdHJ1Y3QgcmJfbm9kZSAqcCA9IHEtPndhaXRfcHFbbGV2ZWxdLnJiX25vZGU7CisJCXN0cnVjdCByYl9ub2RlICpwID0gcmJfZmlyc3QoJnEtPndhaXRfcHFbbGV2ZWxdKTsKKwogCQlpZiAoIXApCiAJCQlyZXR1cm4gMDsKLQkJd2hpbGUgKHAtPnJiX2xlZnQpCi0JCQlwID0gcC0+cmJfbGVmdDsKIAogCQljbCA9IHJiX2VudHJ5KHAsIHN0cnVjdCBodGJfY2xhc3MsIHBxX25vZGUpOwogCQlpZiAodGltZV9hZnRlcihjbC0+cHFfa2V5LCBxLT5qaWZmaWVzKSkgewpAQCAtMTI4NSw4ICsxMjg0LDcgQEAKIAkJCQkJCSAgc3RydWN0IGh0Yl9jbGFzcywgc2libGluZykpOwogCiAJLyogbm90ZTogdGhpcyBkZWxldGUgbWF5IGhhcHBlbiB0d2ljZSAoc2VlIGh0Yl9kZWxldGUpICovCi0JaWYgKCFobGlzdF91bmhhc2hlZCgmY2wtPmhsaXN0KSkKLQkJaGxpc3RfZGVsKCZjbC0+aGxpc3QpOworCWhsaXN0X2RlbF9pbml0KCZjbC0+aGxpc3QpOwogCWxpc3RfZGVsKCZjbC0+c2libGluZyk7CiAKIAlpZiAoY2wtPnByaW9fYWN0aXZpdHkpCkBAIC0xMzM0LDggKzEzMzIsNyBAQAogCXNjaF90cmVlX2xvY2soc2NoKTsKIAogCS8qIGRlbGV0ZSBmcm9tIGhhc2ggYW5kIGFjdGl2ZTsgcmVtYWluZGVyIGluIGRlc3Ryb3lfY2xhc3MgKi8KLQlpZiAoIWhsaXN0X3VuaGFzaGVkKCZjbC0+aGxpc3QpKQotCQlobGlzdF9kZWwoJmNsLT5obGlzdCk7CisJaGxpc3RfZGVsX2luaXQoJmNsLT5obGlzdCk7CiAKIAlpZiAoY2wtPnByaW9fYWN0aXZpdHkpCiAJCWh0Yl9kZWFjdGl2YXRlKHEsIGNsKTsKZGlmZiAtLWdpdCBhL25ldC9zY2hlZC9zY2hfbmV0ZW0uYyBiL25ldC9zY2hlZC9zY2hfbmV0ZW0uYwppbmRleCA0NTkzOWJhLi4wNDQxODc2IDEwMDY0NAotLS0gYS9uZXQvc2NoZWQvc2NoX25ldGVtLmMKKysrIGIvbmV0L3NjaGVkL3NjaF9uZXRlbS5jCkBAIC00LDcgKzQsNyBAQAogICogCQlUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiAgKiAJCW1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCiAgKiAJCWFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgotICogCQkyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogCQkyIG9mIHRoZSBMaWNlbnNlLgogICoKICAqICAJCU1hbnkgb2YgdGhlIGFsZ29yaXRobXMgYW5kIGlkZWFzIGZvciB0aGlzIGNhbWUgZnJvbQogICoJCU5JU1QgTmV0IHdoaWNoIGlzIG5vdCBjb3B5cmlnaHRlZC4gCkBAIC0xNzAsNiArMTcwLDggQEAKIAkJcmV0dXJuIE5FVF9YTUlUX0JZUEFTUzsKIAl9CiAKKwlza2Jfb3JwaGFuKHNrYik7CisKIAkvKgogCSAqIElmIHdlIG5lZWQgdG8gZHVwbGljYXRlIHBhY2tldCwgdGhlbiByZS1pbnNlcnQgYXQgdG9wIG9mIHRoZQogCSAqIHFkaXNjIHRyZWUsIHNpbmNlIHBhcmVudCBxdWV1ZXIgZXhwZWN0cyB0aGF0IG9ubHkgb25lCmRpZmYgLS1naXQgYS9uZXQvc2N0cC9hc3NvY2lvbGEuYyBiL25ldC9zY3RwL2Fzc29jaW9sYS5jCmluZGV4IDI3MzI5Y2UuLmVkMDQ0NWYgMTAwNjQ0Ci0tLSBhL25ldC9zY3RwL2Fzc29jaW9sYS5jCisrKyBiL25ldC9zY3RwL2Fzc29jaW9sYS5jCkBAIC0zNDYsMTEgKzM0NiwxOCBAQAogCXN0cnVjdCBsaXN0X2hlYWQgKnBvcywgKnRlbXA7CiAJaW50IGk7CiAKLQlsaXN0X2RlbCgmYXNvYy0+YXNvY3MpOworCS8qIE9ubHkgcmVhbCBhc3NvY2lhdGlvbnMgY291bnQgYWdhaW5zdCB0aGUgZW5kcG9pbnQsIHNvCisJICogZG9uJ3QgYm90aGVyIGZvciBpZiB0aGlzIGlzIGEgdGVtcG9yYXJ5IGFzc29jaWF0aW9uLgorCSAqLworCWlmICghYXNvYy0+dGVtcCkgeworCQlsaXN0X2RlbCgmYXNvYy0+YXNvY3MpOwogCi0JLyogRGVjcmVtZW50IHRoZSBiYWNrbG9nIHZhbHVlIGZvciBhIFRDUC1zdHlsZSBsaXN0ZW5pbmcgc29ja2V0LiAqLwotCWlmIChzY3RwX3N0eWxlKHNrLCBUQ1ApICYmIHNjdHBfc3N0YXRlKHNrLCBMSVNURU5JTkcpKQotCQlzay0+c2tfYWNrX2JhY2tsb2ctLTsKKwkJLyogRGVjcmVtZW50IHRoZSBiYWNrbG9nIHZhbHVlIGZvciBhIFRDUC1zdHlsZSBsaXN0ZW5pbmcKKwkJICogc29ja2V0LgorCQkgKi8KKwkJaWYgKHNjdHBfc3R5bGUoc2ssIFRDUCkgJiYgc2N0cF9zc3RhdGUoc2ssIExJU1RFTklORykpCisJCQlzay0+c2tfYWNrX2JhY2tsb2ctLTsKKwl9CiAKIAkvKiBNYXJrIGFzIGRlYWQsIHNvIG90aGVyIHVzZXJzIGNhbiBrbm93IHRoaXMgc3RydWN0dXJlIGlzCiAJICogZ29pbmcgYXdheS4KZGlmZiAtLWdpdCBhL25ldC9zY3RwL2VuZHBvaW50b2xhLmMgYi9uZXQvc2N0cC9lbmRwb2ludG9sYS5jCmluZGV4IDM1YzQ5ZmYuLjliNmIzOTQgMTAwNjQ0Ci0tLSBhL25ldC9zY3RwL2VuZHBvaW50b2xhLmMKKysrIGIvbmV0L3NjdHAvZW5kcG9pbnRvbGEuYwpAQCAtMTQ0LDYgKzE0NCwxMyBAQAogewogCXN0cnVjdCBzb2NrICpzayA9IGVwLT5iYXNlLnNrOwogCisJLyogSWYgdGhpcyBpcyBhIHRlbXBvcmFyeSBhc3NvY2lhdGlvbiwgZG9uJ3QgYm90aGVyCisJICogc2luY2Ugd2UnbGwgYmUgcmVtb3ZpbmcgaXQgc2hvcnRseSBhbmQgZG9uJ3QKKwkgKiB3YW50IGFueW9uZSB0byBmaW5kIGl0IGFueXdheS4KKwkgKi8KKwlpZiAoYXNvYy0+dGVtcCkKKwkJcmV0dXJuOworCiAJLyogTm93IGp1c3QgYWRkIGl0IHRvIG91ciBsaXN0IG9mIGFzb2NzICovCiAJbGlzdF9hZGRfdGFpbCgmYXNvYy0+YXNvY3MsICZlcC0+YXNvY3MpOwogCmRpZmYgLS1naXQgYS9uZXQvc2N0cC9pbnB1dC5jIGIvbmV0L3NjdHAvaW5wdXQuYwppbmRleCA2NGY2MzAxLi42ZDgyZjQwIDEwMDY0NAotLS0gYS9uZXQvc2N0cC9pbnB1dC5jCisrKyBiL25ldC9zY3RwL2lucHV0LmMKQEAgLTEzNSw2ICsxMzUsOSBAQAogCiAJU0NUUF9JTkNfU1RBVFNfQkgoU0NUUF9NSUJfSU5TQ1RQUEFDS1MpOwogCisJaWYgKHNrYl9saW5lYXJpemUoc2tiKSkKKwkJZ290byBkaXNjYXJkX2l0OworCiAJc2ggPSAoc3RydWN0IHNjdHBoZHIgKikgc2tiLT5oLnJhdzsKIAogCS8qIFB1bGwgdXAgdGhlIElQIGFuZCBTQ1RQIGhlYWRlcnMuICovCkBAIC03NjgsNiArNzcxLDkgQEAKIC8qIEFkZCBhbiBhc3NvY2lhdGlvbiB0byB0aGUgaGFzaC4gTG9jYWwgQkgtc2FmZS4gKi8KIHZvaWQgc2N0cF9oYXNoX2VzdGFibGlzaGVkKHN0cnVjdCBzY3RwX2Fzc29jaWF0aW9uICphc29jKQogeworCWlmIChhc29jLT50ZW1wKQorCQlyZXR1cm47CisKIAlzY3RwX2xvY2FsX2JoX2Rpc2FibGUoKTsKIAlfX3NjdHBfaGFzaF9lc3RhYmxpc2hlZChhc29jKTsKIAlzY3RwX2xvY2FsX2JoX2VuYWJsZSgpOwpAQCAtODAxLDYgKzgwNyw5IEBACiAvKiBSZW1vdmUgYXNzb2NpYXRpb24gZnJvbSB0aGUgaGFzaCB0YWJsZS4gIExvY2FsIEJILXNhZmUuICovCiB2b2lkIHNjdHBfdW5oYXNoX2VzdGFibGlzaGVkKHN0cnVjdCBzY3RwX2Fzc29jaWF0aW9uICphc29jKQogeworCWlmIChhc29jLT50ZW1wKQorCQlyZXR1cm47CisKIAlzY3RwX2xvY2FsX2JoX2Rpc2FibGUoKTsKIAlfX3NjdHBfdW5oYXNoX2VzdGFibGlzaGVkKGFzb2MpOwogCXNjdHBfbG9jYWxfYmhfZW5hYmxlKCk7CmRpZmYgLS1naXQgYS9uZXQvc2N0cC9pcHY2LmMgYi9uZXQvc2N0cC9pcHY2LmMKaW5kZXggMjQ5ZTUwMy4uNzgwNzFjNiAxMDA2NDQKLS0tIGEvbmV0L3NjdHAvaXB2Ni5jCisrKyBiL25ldC9zY3RwL2lwdjYuYwpAQCAtMjE1LDE3ICsyMTUsMTcgQEAKIAl9CiAKIAlkc3QgPSBpcDZfcm91dGVfb3V0cHV0KE5VTEwsICZmbCk7Ci0JaWYgKGRzdCkgeworCWlmICghZHN0LT5lcnJvcikgewogCQlzdHJ1Y3QgcnQ2X2luZm8gKnJ0OwogCQlydCA9IChzdHJ1Y3QgcnQ2X2luZm8gKilkc3Q7CiAJCVNDVFBfREVCVUdfUFJJTlRLKAogCQkJInJ0Nl9kc3Q6IiBOSVA2X0ZNVCAiIHJ0Nl9zcmM6IiBOSVA2X0ZNVCAiXG4iLAogCQkJTklQNihydC0+cnQ2aV9kc3QuYWRkciksIE5JUDYocnQtPnJ0Nmlfc3JjLmFkZHIpKTsKLQl9IGVsc2UgewotCQlTQ1RQX0RFQlVHX1BSSU5USygiTk8gUk9VVEVcbiIpOworCQlyZXR1cm4gZHN0OwogCX0KLQotCXJldHVybiBkc3Q7CisJU0NUUF9ERUJVR19QUklOVEsoIk5PIFJPVVRFXG4iKTsKKwlkc3RfcmVsZWFzZShkc3QpOworCXJldHVybiBOVUxMOwogfQogCiAvKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgY29uc2VjdXRpdmUgaW5pdGlhbCBiaXRzIHRoYXQgbWF0Y2ggaW4gdGhlIDIgaXB2NgpkaWZmIC0tZ2l0IGEvbmV0L3NjdHAvcHJvYy5jIGIvbmV0L3NjdHAvcHJvYy5jCmluZGV4IGEzNTZkOGQuLjdmNDllNzYgMTAwNjQ0Ci0tLSBhL25ldC9zY3RwL3Byb2MuYworKysgYi9uZXQvc2N0cC9wcm9jLmMKQEAgLTM0NCw3ICszNDQsNyBAQAogCQkJICAgYXNzb2MsIHNrLCBzY3RwX3NrKHNrKS0+dHlwZSwgc2stPnNrX3N0YXRlLAogCQkJICAgYXNzb2MtPnN0YXRlLCBoYXNoLCBhc3NvYy0+YXNzb2NfaWQsCiAJCQkgICBhc3NvYy0+c25kYnVmX3VzZWQsCi0JCQkgICAoc2stPnNrX3JjdmJ1ZiAtIGFzc29jLT5yd25kKSwKKwkJCSAgIGF0b21pY19yZWFkKCZhc3NvYy0+cm1lbV9hbGxvYyksCiAJCQkgICBzb2NrX2lfdWlkKHNrKSwgc29ja19pX2lubyhzayksCiAJCQkgICBlcGItPmJpbmRfYWRkci5wb3J0LAogCQkJICAgYXNzb2MtPnBlZXIucG9ydCk7CmRpZmYgLS1naXQgYS9uZXQvc2N0cC9wcm90b2NvbC5jIGIvbmV0L3NjdHAvcHJvdG9jb2wuYwppbmRleCBmYWM3Njc0Li41YjRmODJmIDEwMDY0NAotLS0gYS9uZXQvc2N0cC9wcm90b2NvbC5jCisrKyBiL25ldC9zY3RwL3Byb3RvY29sLmMKQEAgLTU5MSw3ICs1OTEsNyBAQAogCW5ld2luZXQtPmRwb3J0ID0gaHRvbnMoYXNvYy0+cGVlci5wb3J0KTsKIAluZXdpbmV0LT5kYWRkciA9IGFzb2MtPnBlZXIucHJpbWFyeV9hZGRyLnY0LnNpbl9hZGRyLnNfYWRkcjsKIAluZXdpbmV0LT5wbXR1ZGlzYyA9IGluZXQtPnBtdHVkaXNjOwotICAgICAgCW5ld2luZXQtPmlkID0gMDsKKyAgICAgIAluZXdpbmV0LT5pZCA9IGFzb2MtPm5leHRfdHNuIF4gamlmZmllczsKIAogCW5ld2luZXQtPnVjX3R0bCA9IC0xOwogCW5ld2luZXQtPm1jX2xvb3AgPSAxOwpkaWZmIC0tZ2l0IGEvbmV0L3NjdHAvc29ja2V0LmMgYi9uZXQvc2N0cC9zb2NrZXQuYwppbmRleCAzZmU5MDZkLi45MzViYzkxIDEwMDY0NAotLS0gYS9uZXQvc2N0cC9zb2NrZXQuYworKysgYi9uZXQvc2N0cC9zb2NrZXQuYwpAQCAtODIxLDcgKzgyMSw3IEBACiAgKiBhZGRycyBpcyBhIHBvaW50ZXIgdG8gYW4gYXJyYXkgb2Ygb25lIG9yIG1vcmUgc29ja2V0IGFkZHJlc3Nlcy4gRWFjaAogICogYWRkcmVzcyBpcyBjb250YWluZWQgaW4gaXRzIGFwcHJvcHJpYXRlIHN0cnVjdHVyZSAoaS5lLiBzdHJ1Y3QKICAqIHNvY2thZGRyX2luIG9yIHN0cnVjdCBzb2NrYWRkcl9pbjYpIHRoZSBmYW1pbHkgb2YgdGhlIGFkZHJlc3MgdHlwZQotICogbXVzdCBiZSB1c2VkIHRvIGRpc3Rlbmdpc2ggdGhlIGFkZHJlc3MgbGVuZ3RoIChub3RlIHRoYXQgdGhpcworICogbXVzdCBiZSB1c2VkIHRvIGRpc3Rpbmd1aXNoIHRoZSBhZGRyZXNzIGxlbmd0aCAobm90ZSB0aGF0IHRoaXMKICAqIHJlcHJlc2VudGF0aW9uIGlzIHRlcm1lZCBhICJwYWNrZWQgYXJyYXkiIG9mIGFkZHJlc3NlcykuIFRoZSBjYWxsZXIKICAqIHNwZWNpZmllcyB0aGUgbnVtYmVyIG9mIGFkZHJlc3NlcyBpbiB0aGUgYXJyYXkgd2l0aCBhZGRyY250LgogICoKQEAgLTMzNzIsNiArMzM3Miw3IEBACiB7CiAJc3RydWN0IHNvY2sgKnNrID0gYXNvYy0+YmFzZS5zazsKIAlzdHJ1Y3Qgc29ja2V0ICpzb2NrOworCXN0cnVjdCBpbmV0X3NvY2sgKmluZXRzazsKIAlpbnQgZXJyID0gMDsKIAogCS8qIEFuIGFzc29jaWF0aW9uIGNhbm5vdCBiZSBicmFuY2hlZCBvZmYgZnJvbSBhbiBhbHJlYWR5IHBlZWxlZC1vZmYKQEAgLTMzODksNiArMzM5MCwxNCBAQAogCSAqIGFzb2MgdG8gdGhlIG5ld3NrLgogCSAqLwogCXNjdHBfc29ja19taWdyYXRlKHNrLCBzb2NrLT5zaywgYXNvYywgU0NUUF9TT0NLRVRfVURQX0hJR0hfQkFORFdJRFRIKTsKKworCS8qIE1ha2UgcGVlbGVkLW9mZiBzb2NrZXRzIG1vcmUgbGlrZSAxLTEgYWNjZXB0ZWQgc29ja2V0cy4KKwkgKiBTZXQgdGhlIGRhZGRyIGFuZCBpbml0aWFsaXplIGlkIHRvIHNvbWV0aGluZyBtb3JlIHJhbmRvbQorCSAqLworCWluZXRzayA9IGluZXRfc2soc29jay0+c2spOworCWluZXRzay0+ZGFkZHIgPSBhc29jLT5wZWVyLnByaW1hcnlfYWRkci52NC5zaW5fYWRkci5zX2FkZHI7CisJaW5ldHNrLT5pZCA9IGFzb2MtPm5leHRfdHNuIF4gamlmZmllczsKKwogCSpzb2NrcCA9IHNvY2s7CiAKIAlyZXR1cm4gZXJyOwpAQCAtNTM2Miw2ICs1MzcxLDIwIEBACiAJc2N0cF9hc3NvY2lhdGlvbl9wdXQoYXNvYyk7CiB9CiAKKy8qIERvIGFjY291bnRpbmcgZm9yIHRoZSByZWNlaXZlIHNwYWNlIG9uIHRoZSBzb2NrZXQuCisgKiBBY2NvdW50aW5nIGZvciB0aGUgYXNzb2NpYXRpb24gaXMgZG9uZSBpbiB1bHBldmVudC5jCisgKiBXZSBzZXQgdGhpcyBhcyBhIGRlc3RydWN0b3IgZm9yIHRoZSBjbG9uZWQgZGF0YSBza2JzIHNvIHRoYXQKKyAqIGFjY291bnRpbmcgaXMgZG9uZSBhdCB0aGUgY29ycmVjdCB0aW1lLgorICovCit2b2lkIHNjdHBfc29ja19yZnJlZShzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXN0cnVjdCBzb2NrICpzayA9IHNrYi0+c2s7CisJc3RydWN0IHNjdHBfdWxwZXZlbnQgKmV2ZW50ID0gc2N0cF9za2IyZXZlbnQoc2tiKTsKKworCWF0b21pY19zdWIoZXZlbnQtPnJtZW1fbGVuLCAmc2stPnNrX3JtZW1fYWxsb2MpOworfQorCisKIC8qIEhlbHBlciBmdW5jdGlvbiB0byB3YWl0IGZvciBzcGFjZSBpbiB0aGUgc25kYnVmLiAgKi8KIHN0YXRpYyBpbnQgc2N0cF93YWl0X2Zvcl9zbmRidWYoc3RydWN0IHNjdHBfYXNzb2NpYXRpb24gKmFzb2MsIGxvbmcgKnRpbWVvX3AsCiAJCQkJc2l6ZV90IG1zZ19sZW4pCkBAIC01NjM0LDEwICs1NjU3LDEwIEBACiAJc2N0cF9za2JfZm9yX2VhY2goc2tiLCAmb2xkc2stPnNrX3JlY2VpdmVfcXVldWUsIHRtcCkgewogCQlldmVudCA9IHNjdHBfc2tiMmV2ZW50KHNrYik7CiAJCWlmIChldmVudC0+YXNvYyA9PSBhc3NvYykgewotCQkJc29ja19yZnJlZShza2IpOworCQkJc2N0cF9zb2NrX3JmcmVlKHNrYik7CiAJCQlfX3NrYl91bmxpbmsoc2tiLCAmb2xkc2stPnNrX3JlY2VpdmVfcXVldWUpOwogCQkJX19za2JfcXVldWVfdGFpbCgmbmV3c2stPnNrX3JlY2VpdmVfcXVldWUsIHNrYik7Ci0JCQlza2Jfc2V0X293bmVyX3Ioc2tiLCBuZXdzayk7CisJCQlzY3RwX3NrYl9zZXRfb3duZXJfcihza2IsIG5ld3NrKTsKIAkJfQogCX0KIApAQCAtNTY2NSwxMCArNTY4OCwxMCBAQAogCQlzY3RwX3NrYl9mb3JfZWFjaChza2IsICZvbGRzcC0+cGRfbG9iYnksIHRtcCkgewogCQkJZXZlbnQgPSBzY3RwX3NrYjJldmVudChza2IpOwogCQkJaWYgKGV2ZW50LT5hc29jID09IGFzc29jKSB7Ci0JCQkJc29ja19yZnJlZShza2IpOworCQkJCXNjdHBfc29ja19yZnJlZShza2IpOwogCQkJCV9fc2tiX3VubGluayhza2IsICZvbGRzcC0+cGRfbG9iYnkpOwogCQkJCV9fc2tiX3F1ZXVlX3RhaWwocXVldWUsIHNrYik7Ci0JCQkJc2tiX3NldF9vd25lcl9yKHNrYiwgbmV3c2spOworCQkJCXNjdHBfc2tiX3NldF9vd25lcl9yKHNrYiwgbmV3c2spOwogCQkJfQogCQl9CiAKZGlmZiAtLWdpdCBhL25ldC9zY3RwL3VscGV2ZW50LmMgYi9uZXQvc2N0cC91bHBldmVudC5jCmluZGV4IGVlMjM2Nzg0Li5hMDE1MjgzIDEwMDY0NAotLS0gYS9uZXQvc2N0cC91bHBldmVudC5jCisrKyBiL25ldC9zY3RwL3VscGV2ZW50LmMKQEAgLTU1LDEwICs1NSwxMyBAQAogCiAKIC8qIEluaXRpYWxpemUgYW4gVUxQIGV2ZW50IGZyb20gYW4gZ2l2ZW4gc2tiLiAgKi8KLVNDVFBfU1RBVElDIHZvaWQgc2N0cF91bHBldmVudF9pbml0KHN0cnVjdCBzY3RwX3VscGV2ZW50ICpldmVudCwgaW50IG1zZ19mbGFncykKK1NDVFBfU1RBVElDIHZvaWQgc2N0cF91bHBldmVudF9pbml0KHN0cnVjdCBzY3RwX3VscGV2ZW50ICpldmVudCwKKwkJCQkgICAgaW50IG1zZ19mbGFncywKKwkJCQkgICAgdW5zaWduZWQgaW50IGxlbikKIHsKIAltZW1zZXQoZXZlbnQsIDAsIHNpemVvZihzdHJ1Y3Qgc2N0cF91bHBldmVudCkpOwogCWV2ZW50LT5tc2dfZmxhZ3MgPSBtc2dfZmxhZ3M7CisJZXZlbnQtPnJtZW1fbGVuID0gbGVuOwogfQogCiAvKiBDcmVhdGUgYSBuZXcgc2N0cF91bHBldmVudC4gICovCkBAIC03Myw3ICs3Niw3IEBACiAJCWdvdG8gZmFpbDsKIAogCWV2ZW50ID0gc2N0cF9za2IyZXZlbnQoc2tiKTsKLQlzY3RwX3VscGV2ZW50X2luaXQoZXZlbnQsIG1zZ19mbGFncyk7CisJc2N0cF91bHBldmVudF9pbml0KGV2ZW50LCBtc2dfZmxhZ3MsIHNrYi0+dHJ1ZXNpemUpOwogCiAJcmV0dXJuIGV2ZW50OwogCkBAIC0xMDEsMTcgKzEwNCwxNiBAQAogCXNjdHBfYXNzb2NpYXRpb25faG9sZCgoc3RydWN0IHNjdHBfYXNzb2NpYXRpb24gKilhc29jKTsKIAlza2IgPSBzY3RwX2V2ZW50MnNrYihldmVudCk7CiAJZXZlbnQtPmFzb2MgPSAoc3RydWN0IHNjdHBfYXNzb2NpYXRpb24gKilhc29jOwotCWF0b21pY19hZGQoc2tiLT50cnVlc2l6ZSwgJmV2ZW50LT5hc29jLT5ybWVtX2FsbG9jKTsKLQlza2Jfc2V0X293bmVyX3Ioc2tiLCBhc29jLT5iYXNlLnNrKTsKKwlhdG9taWNfYWRkKGV2ZW50LT5ybWVtX2xlbiwgJmV2ZW50LT5hc29jLT5ybWVtX2FsbG9jKTsKKwlzY3RwX3NrYl9zZXRfb3duZXJfcihza2IsIGFzb2MtPmJhc2Uuc2spOwogfQogCiAvKiBBIHNpbXBsZSBkZXN0cnVjdG9yIHRvIGdpdmUgdXAgdGhlIHJlZmVyZW5jZSB0byB0aGUgYXNzb2NpYXRpb24uICovCiBzdGF0aWMgaW5saW5lIHZvaWQgc2N0cF91bHBldmVudF9yZWxlYXNlX293bmVyKHN0cnVjdCBzY3RwX3VscGV2ZW50ICpldmVudCkKIHsKIAlzdHJ1Y3Qgc2N0cF9hc3NvY2lhdGlvbiAqYXNvYyA9IGV2ZW50LT5hc29jOwotCXN0cnVjdCBza19idWZmICpza2IgPSBzY3RwX2V2ZW50MnNrYihldmVudCk7CiAKLQlhdG9taWNfc3ViKHNrYi0+dHJ1ZXNpemUsICZhc29jLT5ybWVtX2FsbG9jKTsKKwlhdG9taWNfc3ViKGV2ZW50LT5ybWVtX2xlbiwgJmFzb2MtPnJtZW1fYWxsb2MpOwogCXNjdHBfYXNzb2NpYXRpb25fcHV0KGFzb2MpOwogfQogCkBAIC0zNzIsNyArMzc0LDcgQEAKIAogCS8qIEVtYmVkIHRoZSBldmVudCBmaWVsZHMgaW5zaWRlIHRoZSBjbG9uZWQgc2tiLiAgKi8KIAlldmVudCA9IHNjdHBfc2tiMmV2ZW50KHNrYik7Ci0Jc2N0cF91bHBldmVudF9pbml0KGV2ZW50LCBNU0dfTk9USUZJQ0FUSU9OKTsKKwlzY3RwX3VscGV2ZW50X2luaXQoZXZlbnQsIE1TR19OT1RJRklDQVRJT04sIHNrYi0+dHJ1ZXNpemUpOwogCiAJc3JlID0gKHN0cnVjdCBzY3RwX3JlbW90ZV9lcnJvciAqKQogCQlza2JfcHVzaChza2IsIHNpemVvZihzdHJ1Y3Qgc2N0cF9yZW1vdGVfZXJyb3IpKTsKQEAgLTQ2NCw3ICs0NjYsNyBAQAogCiAJLyogRW1iZWQgdGhlIGV2ZW50IGZpZWxkcyBpbnNpZGUgdGhlIGNsb25lZCBza2IuICAqLwogCWV2ZW50ID0gc2N0cF9za2IyZXZlbnQoc2tiKTsKLQlzY3RwX3VscGV2ZW50X2luaXQoZXZlbnQsIE1TR19OT1RJRklDQVRJT04pOworCXNjdHBfdWxwZXZlbnRfaW5pdChldmVudCwgTVNHX05PVElGSUNBVElPTiwgc2tiLT50cnVlc2l6ZSk7CiAKIAlzc2YgPSAoc3RydWN0IHNjdHBfc2VuZF9mYWlsZWQgKikKIAkJc2tiX3B1c2goc2tiLCBzaXplb2Yoc3RydWN0IHNjdHBfc2VuZF9mYWlsZWQpKTsKQEAgLTY4Miw4ICs2ODQsMTEgQEAKIAkvKiBFbWJlZCB0aGUgZXZlbnQgZmllbGRzIGluc2lkZSB0aGUgY2xvbmVkIHNrYi4gICovCiAJZXZlbnQgPSBzY3RwX3NrYjJldmVudChza2IpOwogCi0JLyogSW5pdGlhbGl6ZSBldmVudCB3aXRoIGZsYWdzIDAuICAqLwotCXNjdHBfdWxwZXZlbnRfaW5pdChldmVudCwgMCk7CisJLyogSW5pdGlhbGl6ZSBldmVudCB3aXRoIGZsYWdzIDAgIGFuZCBjb3JyZWN0IGxlbmd0aAorCSAqIFNpbmNlIHRoaXMgaXMgYSBjbG9uZSBvZiB0aGUgb3JpZ2luYWwgc2tiLCBvbmx5IGFjY291bnQgZm9yCisJICogdGhlIGRhdGEgb2YgdGhpcyBjaHVuayBhcyBvdGhlciBjaHVua3Mgd2lsbCBiZSBhY2NvdW50ZWQgc2VwYXJhdGVseS4KKwkgKi8KKwlzY3RwX3VscGV2ZW50X2luaXQoZXZlbnQsIDAsIHNrYi0+bGVuICsgc2l6ZW9mKHN0cnVjdCBza19idWZmKSk7CiAKIAlzY3RwX3VscGV2ZW50X3JlY2VpdmVfZGF0YShldmVudCwgYXNvYyk7CiAKZGlmZiAtLWdpdCBhL25ldC9zY3RwL3VscHF1ZXVlLmMgYi9uZXQvc2N0cC91bHBxdWV1ZS5jCmluZGV4IDU3NWU1NTYuLmUxZDE0NDIgMTAwNjQ0Ci0tLSBhL25ldC9zY3RwL3VscHF1ZXVlLmMKKysrIGIvbmV0L3NjdHAvdWxwcXVldWUuYwpAQCAtMzA5LDcgKzMwOSw3IEBACiAgCQkJaWYgKCFuZXcpCiAgCQkJCXJldHVybiBOVUxMOwkvKiB0cnkgYWdhaW4gbGF0ZXIgKi8KIAotIAkJCW5ldy0+c2sgPSBmX2ZyYWctPnNrOworIAkJCXNjdHBfc2tiX3NldF9vd25lcl9yKG5ldywgZl9mcmFnLT5zayk7CiAKICAJCQlza2Jfc2hpbmZvKG5ldyktPmZyYWdfbGlzdCA9IHBvczsKICAJCX0gZWxzZQpkaWZmIC0tZ2l0IGEvbmV0L3N1bnJwYy9wbWFwX2NsbnQuYyBiL25ldC9zdW5ycGMvcG1hcF9jbG50LmMKaW5kZXggOTE5ZDViYS4uZTUyYWZhYiAxMDA2NDQKLS0tIGEvbmV0L3N1bnJwYy9wbWFwX2NsbnQuYworKysgYi9uZXQvc3VucnBjL3BtYXBfY2xudC5jCkBAIC0xMDEsMTEgKzEwMSwxMyBAQAogCS8qIEF1dG9iaW5kIG9uIGNsb25lZCBycGMgY2xpZW50cyBpcyBkaXNjb3VyYWdlZCAqLwogCUJVR19PTihjbG50LT5jbF9wYXJlbnQgIT0gY2xudCk7CiAKLQlpZiAoeHBydF90ZXN0X2FuZF9zZXRfYmluZGluZyh4cHJ0KSkgewotCQl0YXNrLT50a19zdGF0dXMgPSAtRUFDQ0VTOwkvKiB0ZWxsIGNhbGxlciB0byBjaGVjayBhZ2FpbiAqLwotCQlycGNfc2xlZXBfb24oJnhwcnQtPmJpbmRpbmcsIHRhc2ssIE5VTEwsIE5VTEwpOwotCQlyZXR1cm47Ci0JfQorCS8qIFB1dCBzZWxmIG9uIHF1ZXVlIGJlZm9yZSBzZW5kaW5nIHJwY2JpbmQgcmVxdWVzdCwgaW4gY2FzZQorCSAqIHBtYXBfZ2V0cG9ydF9kb25lIGNvbXBsZXRlcyBiZWZvcmUgd2UgcmV0dXJuIGZyb20gcnBjX3J1bl90YXNrICovCisJcnBjX3NsZWVwX29uKCZ4cHJ0LT5iaW5kaW5nLCB0YXNrLCBOVUxMLCBOVUxMKTsKKworCXN0YXR1cyA9IC1FQUNDRVM7CQkvKiB0ZWxsIGNhbGxlciB0byBjaGVjayBhZ2FpbiAqLworCWlmICh4cHJ0X3Rlc3RfYW5kX3NldF9iaW5kaW5nKHhwcnQpKQorCQlnb3RvIGJhaWxvdXRfbm9mcmVlOwogCiAJLyogU29tZW9uZSBlbHNlIG1heSBoYXZlIGJvdW5kIGlmIHdlIHNsZXB0ICovCiAJc3RhdHVzID0gMDsKQEAgLTEzNCw4ICsxMzYsNiBAQAogCQlnb3RvIGJhaWxvdXQ7CiAJcnBjX3JlbGVhc2VfdGFzayhjaGlsZCk7CiAKLQlycGNfc2xlZXBfb24oJnhwcnQtPmJpbmRpbmcsIHRhc2ssIE5VTEwsIE5VTEwpOwotCiAJdGFzay0+dGtfeHBydC0+c3RhdC5iaW5kX2NvdW50Kys7CiAJcmV0dXJuOwogCmRpZmYgLS1naXQgYS9uZXQvc3VucnBjL3N2Yy5jIGIvbmV0L3N1bnJwYy9zdmMuYwppbmRleCAyODA3ZmEwLi5lYjQ0ZWM5IDEwMDY0NAotLS0gYS9uZXQvc3VucnBjL3N2Yy5jCisrKyBiL25ldC9zdW5ycGMvc3ZjLmMKQEAgLTgyOCw2ICs4MjgsMTEgQEAKIAkJKnN0YXRwID0gcHJvY3AtPnBjX2Z1bmMocnFzdHAsIHJxc3RwLT5ycV9hcmdwLCBycXN0cC0+cnFfcmVzcCk7CiAKIAkJLyogRW5jb2RlIHJlcGx5ICovCisJCWlmICgqc3RhdHAgPT0gcnBjX2Ryb3BfcmVwbHkpIHsKKwkJCWlmIChwcm9jcC0+cGNfcmVsZWFzZSkKKwkJCQlwcm9jcC0+cGNfcmVsZWFzZShycXN0cCwgTlVMTCwgcnFzdHAtPnJxX3Jlc3ApOworCQkJZ290byBkcm9waXQ7CisJCX0KIAkJaWYgKCpzdGF0cCA9PSBycGNfc3VjY2VzcyAmJiAoeGRyID0gcHJvY3AtPnBjX2VuY29kZSkKIAkJICYmICF4ZHIocnFzdHAsIHJlc3YtPmlvdl9iYXNlK3Jlc3YtPmlvdl9sZW4sIHJxc3RwLT5ycV9yZXNwKSkgewogCQkJZHByaW50aygic3ZjOiBmYWlsZWQgdG8gZW5jb2RlIHJlcGx5XG4iKTsKZGlmZiAtLWdpdCBhL25ldC9zdW5ycGMvc3ZjYXV0aC5jIGIvbmV0L3N1bnJwYy9zdmNhdXRoLmMKaW5kZXggOGYyMzIwYS4uZWU5YmIxNSAxMDA2NDQKLS0tIGEvbmV0L3N1bnJwYy9zdmNhdXRoLmMKKysrIGIvbmV0L3N1bnJwYy9zdmNhdXRoLmMKQEAgLTEyNiw2ICsxMjYsNyBAQAogCWlmIChhdG9taWNfZGVjX2FuZF9sb2NrKCZkb20tPnJlZi5yZWZjb3VudCwgJmF1dGhfZG9tYWluX2xvY2spKSB7CiAJCWhsaXN0X2RlbCgmZG9tLT5oYXNoKTsKIAkJZG9tLT5mbGF2b3VyLT5kb21haW5fcmVsZWFzZShkb20pOworCQlzcGluX3VubG9jaygmYXV0aF9kb21haW5fbG9jayk7CiAJfQogfQogCkBAIC0xNDcsMTAgKzE0OCw4IEBACiAJCQlyZXR1cm4gaHA7CiAJCX0KIAl9Ci0JaWYgKG5ldykgeworCWlmIChuZXcpCiAJCWhsaXN0X2FkZF9oZWFkKCZuZXctPmhhc2gsIGhlYWQpOwotCQlrcmVmX2dldCgmbmV3LT5yZWYpOwotCX0KIAlzcGluX3VubG9jaygmYXV0aF9kb21haW5fbG9jayk7CiAJcmV0dXJuIG5ldzsKIH0KZGlmZiAtLWdpdCBhL25ldC9zdW5ycGMvc3Zjc29jay5jIGIvbmV0L3N1bnJwYy9zdmNzb2NrLmMKaW5kZXggNjFlMzA3Yy4uNjRjYTFmNiAxMDA2NDQKLS0tIGEvbmV0L3N1bnJwYy9zdmNzb2NrLmMKKysrIGIvbmV0L3N1bnJwYy9zdmNzb2NrLmMKQEAgLTI5OSw5ICsyOTksMTUgQEAKIHN0YXRpYyBpbmxpbmUgdm9pZAogc3ZjX3NvY2tfcHV0KHN0cnVjdCBzdmNfc29jayAqc3ZzaykKIHsKLQlpZiAoYXRvbWljX2RlY19hbmRfdGVzdCgmc3Zzay0+c2tfaW51c2UpICYmIHRlc3RfYml0KFNLX0RFQUQsICZzdnNrLT5za19mbGFncykpIHsKKwlpZiAoYXRvbWljX2RlY19hbmRfdGVzdCgmc3Zzay0+c2tfaW51c2UpICYmCisJCQl0ZXN0X2JpdChTS19ERUFELCAmc3Zzay0+c2tfZmxhZ3MpKSB7CiAJCWRwcmludGsoInN2YzogcmVsZWFzaW5nIGRlYWQgc29ja2V0XG4iKTsKLQkJc29ja19yZWxlYXNlKHN2c2stPnNrX3NvY2spOworCQlpZiAoc3Zzay0+c2tfc29jay0+ZmlsZSkKKwkJCXNvY2tmZF9wdXQoc3Zzay0+c2tfc29jayk7CisJCWVsc2UKKwkJCXNvY2tfcmVsZWFzZShzdnNrLT5za19zb2NrKTsKKwkJaWYgKHN2c2stPnNrX2luZm9fYXV0aHVuaXggIT0gTlVMTCkKKwkJCXN2Y2F1dGhfdW5peF9pbmZvX3JlbGVhc2Uoc3Zzay0+c2tfaW5mb19hdXRodW5peCk7CiAJCWtmcmVlKHN2c2spOwogCX0KIH0KQEAgLTk3Myw3ICs5NzksNyBAQAogCQlyZXR1cm4gMDsKIAl9CiAKLQlpZiAodGVzdF9iaXQoU0tfQ09OTiwgJnN2c2stPnNrX2ZsYWdzKSkgeworCWlmIChzdnNrLT5za19zay0+c2tfc3RhdGUgPT0gVENQX0xJU1RFTikgewogCQlzdmNfdGNwX2FjY2VwdChzdnNrKTsKIAkJc3ZjX3NvY2tfcmVjZWl2ZWQoc3Zzayk7CiAJCXJldHVybiAwOwpAQCAtMTYwNCwyMCArMTYxMCwxMyBAQAogCQlpZiAodGVzdF9iaXQoU0tfVEVNUCwgJnN2c2stPnNrX2ZsYWdzKSkKIAkJCXNlcnYtPnN2X3RtcGNudC0tOwogCi0JaWYgKCFhdG9taWNfcmVhZCgmc3Zzay0+c2tfaW51c2UpKSB7Ci0JCXNwaW5fdW5sb2NrX2JoKCZzZXJ2LT5zdl9sb2NrKTsKLQkJaWYgKHN2c2stPnNrX3NvY2stPmZpbGUpCi0JCQlzb2NrZmRfcHV0KHN2c2stPnNrX3NvY2spOwotCQllbHNlCi0JCQlzb2NrX3JlbGVhc2Uoc3Zzay0+c2tfc29jayk7Ci0JCWlmIChzdnNrLT5za19pbmZvX2F1dGh1bml4ICE9IE5VTEwpCi0JCQlzdmNhdXRoX3VuaXhfaW5mb19yZWxlYXNlKHN2c2stPnNrX2luZm9fYXV0aHVuaXgpOwotCQlrZnJlZShzdnNrKTsKLQl9IGVsc2UgewotCQlzcGluX3VubG9ja19iaCgmc2Vydi0+c3ZfbG9jayk7Ci0JCWRwcmludGsoS0VSTl9OT1RJQ0UgInN2Yzogc2VydmVyIHNvY2tldCBkZXN0cm95IGRlbGF5ZWRcbiIpOwotCQkvKiBzdnNrLT5za19zZXJ2ZXIgPSBOVUxMOyAqLwotCX0KKwkvKiBUaGlzIGF0b21pY19pbmMgc2hvdWxkIGJlIG5lZWRlZCAtIHN2Y19kZWxldGVfc29ja2V0CisJICogc2hvdWxkIGhhdmUgdGhlIHNlbWFudGljIG9mIGRyb3BwaW5nIGEgcmVmZXJlbmNlLgorCSAqIEJ1dCBpdCBkb2Vzbid0IHlldC4uLi4KKwkgKi8KKwlhdG9taWNfaW5jKCZzdnNrLT5za19pbnVzZSk7CisJc3Bpbl91bmxvY2tfYmgoJnNlcnYtPnN2X2xvY2spOworCXN2Y19zb2NrX3B1dChzdnNrKTsKIH0KIAogLyoKZGlmZiAtLWdpdCBhL25ldC9zdW5ycGMveHBydHNvY2suYyBiL25ldC9zdW5ycGMveHBydHNvY2suYwppbmRleCAyODEwMGUwLi43NTdmYzkxIDEwMDY0NAotLS0gYS9uZXQvc3VucnBjL3hwcnRzb2NrLmMKKysrIGIvbmV0L3N1bnJwYy94cHJ0c29jay5jCkBAIC0xMzY2LDcgKzEzNjYsNyBAQAogCWlmICh4cHJ0LT5zbG90ID09IE5VTEwpCiAJCXJldHVybiAtRU5PTUVNOwogCi0JaWYgKG50b2hzKGFkZHItPnNpbl9wb3J0ICE9IDApKQorCWlmIChudG9ocyhhZGRyLT5zaW5fcG9ydCkgIT0gMCkKIAkJeHBydF9zZXRfYm91bmQoeHBydCk7CiAJeHBydC0+cG9ydCA9IHhzX2dldF9yYW5kb21fcG9ydCgpOwogCmRpZmYgLS1naXQgYS9uZXQvdGlwYy9iZWFyZXIuYyBiL25ldC90aXBjL2JlYXJlci5jCmluZGV4IDc1YTU5NjguLjM5NzQ0YTMgMTAwNjQ0Ci0tLSBhL25ldC90aXBjL2JlYXJlci5jCisrKyBiL25ldC90aXBjL2JlYXJlci5jCkBAIC0yLDcgKzIsNyBAQAogICogbmV0L3RpcGMvYmVhcmVyLmM6IFRJUEMgYmVhcmVyIGNvZGUKICAqIAogICogQ29weXJpZ2h0IChjKSAxOTk2LTIwMDYsIEVyaWNzc29uIEFCCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQtMjAwNSwgV2luZCBSaXZlciBTeXN0ZW1zCisgKiBDb3B5cmlnaHQgKGMpIDIwMDQtMjAwNiwgV2luZCBSaXZlciBTeXN0ZW1zCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dApAQCAtMTkxLDE0ICsxOTEsMTQgQEAKIAlpZiAoKGkgPCBtZWRpYV9jb3VudCkgJiYgKG1fcHRyLT5hZGRyMnN0ciAhPSBOVUxMKSkgewogCQljaGFyIGFkZHJfc3RyW01BWF9BRERSX1NUUl07CiAKLQkJdGlwY19wcmludGYocGIsICIlcyglcykgIiwgbV9wdHItPm5hbWUsIAorCQl0aXBjX3ByaW50ZihwYiwgIiVzKCVzKSIsIG1fcHRyLT5uYW1lLAogCQkJICAgIG1fcHRyLT5hZGRyMnN0cihhLCBhZGRyX3N0ciwgc2l6ZW9mKGFkZHJfc3RyKSkpOwogCX0gZWxzZSB7CiAJCXVuY2hhciAqYWRkciA9ICh1bmNoYXIgKikmYS0+ZGV2X2FkZHI7CiAKLQkJdGlwY19wcmludGYocGIsICJVTktOT1dOKCV1KToiLCBtZWRpYV90eXBlKTsKKwkJdGlwY19wcmludGYocGIsICJVTktOT1dOKCV1KSIsIG1lZGlhX3R5cGUpOwogCQlmb3IgKGkgPSAwOyBpIDwgKHNpemVvZigqYSkgLSBzaXplb2YoYS0+dHlwZSkpOyBpKyspIHsKLQkJCXRpcGNfcHJpbnRmKHBiLCAiJTAyeCAiLCBhZGRyW2ldKTsKKwkJCXRpcGNfcHJpbnRmKHBiLCAiLSUwMngiLCBhZGRyW2ldKTsKIAkJfQogCX0KIH0KZGlmZiAtLWdpdCBhL25ldC90aXBjL2NvbmZpZy5jIGIvbmV0L3RpcGMvY29uZmlnLmMKaW5kZXggMjg1ZTFiYy4uZWQxMzUxZSAxMDA2NDQKLS0tIGEvbmV0L3RpcGMvY29uZmlnLmMKKysrIGIvbmV0L3RpcGMvY29uZmlnLmMKQEAgLTIsNyArMiw3IEBACiAgKiBuZXQvdGlwYy9jb25maWcuYzogVElQQyBjb25maWd1cmF0aW9uIG1hbmFnZW1lbnQgY29kZQogICogCiAgKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNiwgRXJpY3Nzb24gQUIKLSAqIENvcHlyaWdodCAoYykgMjAwNC0yMDA1LCBXaW5kIFJpdmVyIFN5c3RlbXMKKyAqIENvcHlyaWdodCAoYykgMjAwNC0yMDA2LCBXaW5kIFJpdmVyIFN5c3RlbXMKICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CkBAIC02MTMsNyArNjEzLDggQEAKIAkJcmVwX3Rsdl9idWYgPSB0aXBjX2NmZ19yZXBseV91bnNpZ25lZCh0aXBjX25ldF9pZCk7CiAJCWJyZWFrOwogCWRlZmF1bHQ6Ci0JCXJlcF90bHZfYnVmID0gTlVMTDsKKwkJcmVwX3Rsdl9idWYgPSB0aXBjX2NmZ19yZXBseV9lcnJvcl9zdHJpbmcoVElQQ19DRkdfTk9UX1NVUFBPUlRFRAorCQkJCQkJCSAgIiAodW5rbm93biBjb21tYW5kKSIpOwogCQlicmVhazsKIAl9CiAKZGlmZiAtLWdpdCBhL25ldC90aXBjL2NvcmUuYyBiL25ldC90aXBjL2NvcmUuYwppbmRleCAwNTM5YTgzLi42ZjViN2VlIDEwMDY0NAotLS0gYS9uZXQvdGlwYy9jb3JlLmMKKysrIGIvbmV0L3RpcGMvY29yZS5jCkBAIC01Nyw3ICs1Nyw3IEBACiBpbnQgIHRpcGNfbmV0bGlua19zdGFydCh2b2lkKTsKIHZvaWQgdGlwY19uZXRsaW5rX3N0b3Aodm9pZCk7CiAKLSNkZWZpbmUgVElQQ19NT0RfVkVSICIxLjYuMSIKKyNkZWZpbmUgVElQQ19NT0RfVkVSICIxLjYuMiIKIAogI2lmbmRlZiBDT05GSUdfVElQQ19aT05FUwogI2RlZmluZSBDT05GSUdfVElQQ19aT05FUyAzCkBAIC05MCw3ICs5MCw3IEBACiBhdG9taWNfdCB0aXBjX3VzZXJfY291bnQgPSBBVE9NSUNfSU5JVCgwKTsKIAogY29uc3QgY2hhciB0aXBjX2FscGhhYmV0W10gPSAKLQkiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODlfIjsKKwkiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODlfLiI7CiAKIC8qIGNvbmZpZ3VyYWJsZSBUSVBDIHBhcmFtZXRlcnMgKi8KIApkaWZmIC0tZ2l0IGEvbmV0L3RpcGMvY29yZS5oIGIvbmV0L3RpcGMvY29yZS5oCmluZGV4IDc2MmFhYzIuLjQ2Mzg5NDdjIDEwMDY0NAotLS0gYS9uZXQvdGlwYy9jb3JlLmgKKysrIGIvbmV0L3RpcGMvY29yZS5oCkBAIC02NSw3ICs2NSw3IEBACiAjZGVmaW5lIGFzc2VydChpKSAgQlVHX09OKCEoaSkpCiAKIHN0cnVjdCB0aXBjX21zZzsKLWV4dGVybiBzdHJ1Y3QgcHJpbnRfYnVmICpUSVBDX0NPTlMsICpUSVBDX0xPRzsKK2V4dGVybiBzdHJ1Y3QgcHJpbnRfYnVmICpUSVBDX05VTEwsICpUSVBDX0NPTlMsICpUSVBDX0xPRzsKIGV4dGVybiBzdHJ1Y3QgcHJpbnRfYnVmICpUSVBDX1RFRShzdHJ1Y3QgcHJpbnRfYnVmICosIHN0cnVjdCBwcmludF9idWYgKik7CiB2b2lkIHRpcGNfbXNnX3ByaW50KHN0cnVjdCBwcmludF9idWYqLHN0cnVjdCB0aXBjX21zZyAqLGNvbnN0IGNoYXIqKTsKIHZvaWQgdGlwY19wcmludGYoc3RydWN0IHByaW50X2J1ZiAqLCBjb25zdCBjaGFyICpmbXQsIC4uLik7CkBAIC04Myw5ICs4Myw5IEBACiAjZGVmaW5lIHdhcm4oZm10LCBhcmcuLi4pIHRpcGNfcHJpbnRmKFRJUENfT1VUUFVULCBLRVJOX1dBUk5JTkcgIlRJUEM6ICIgZm10LCAjIyBhcmcpCiAjZGVmaW5lIGluZm8oZm10LCBhcmcuLi4pIHRpcGNfcHJpbnRmKFRJUENfT1VUUFVULCBLRVJOX05PVElDRSAiVElQQzogIiBmbXQsICMjIGFyZykKIAotI2RlZmluZSBkYmcoZm10LCBhcmcuLi4pICBkbyB7aWYgKERCR19PVVRQVVQpIHRpcGNfcHJpbnRmKERCR19PVVRQVVQsIGZtdCwgIyMgYXJnKTt9IHdoaWxlKDApCi0jZGVmaW5lIG1zZ19kYmcobXNnLCB0eHQpIGRvIHtpZiAoREJHX09VVFBVVCkgdGlwY19tc2dfcHJpbnQoREJHX09VVFBVVCwgbXNnLCB0eHQpO30gd2hpbGUoMCkKLSNkZWZpbmUgZHVtcChmbXQsIGFyZy4uLikgZG8ge2lmIChEQkdfT1VUUFVUKSB0aXBjX2R1bXAoREJHX09VVFBVVCwgZm10LCAjI2FyZyk7fSB3aGlsZSgwKQorI2RlZmluZSBkYmcoZm10LCBhcmcuLi4pICBkbyB7aWYgKERCR19PVVRQVVQgIT0gVElQQ19OVUxMKSB0aXBjX3ByaW50ZihEQkdfT1VUUFVULCBmbXQsICMjIGFyZyk7fSB3aGlsZSgwKQorI2RlZmluZSBtc2dfZGJnKG1zZywgdHh0KSBkbyB7aWYgKERCR19PVVRQVVQgIT0gVElQQ19OVUxMKSB0aXBjX21zZ19wcmludChEQkdfT1VUUFVULCBtc2csIHR4dCk7fSB3aGlsZSgwKQorI2RlZmluZSBkdW1wKGZtdCwgYXJnLi4uKSBkbyB7aWYgKERCR19PVVRQVVQgIT0gVElQQ19OVUxMKSB0aXBjX2R1bXAoREJHX09VVFBVVCwgZm10LCAjI2FyZyk7fSB3aGlsZSgwKQogCiAKIC8qCQpAQCAtOTQsMTEgKzk0LDExIEBACiAgKiBoZXJlLCBvciBvbiBhIHBlciAuYyBmaWxlIGJhc2lzLCBieSByZWRlZmluaW5nIHRoZXNlIHN5bWJvbHMuICBUaGUgZm9sbG93aW5nCiAgKiBwcmludCBidWZmZXIgb3B0aW9ucyBhcmUgYXZhaWxhYmxlOgogICoKLSAqIE5VTEwJCQkJOiBPdXRwdXQgdG8gbnVsbCBwcmludCBidWZmZXIgKGkuZS4gcHJpbnQgbm93aGVyZSkKLSAqIFRJUENfQ09OUwkJCTogT3V0cHV0IHRvIHN5c3RlbSBjb25zb2xlCi0gKiBUSVBDX0xPRwkJCTogT3V0cHV0IHRvIFRJUEMgbG9nIGJ1ZmZlciAKLSAqICZidWYJCQkJOiBPdXRwdXQgdG8gdXNlci1kZWZpbmVkIGJ1ZmZlciAoc3RydWN0IHByaW50X2J1ZiAqKQotICogVElQQ19URUUoJmJ1Zl9hLCZidWZfYikJOiBPdXRwdXQgdG8gdHdvIHByaW50IGJ1ZmZlcnMgKGVnLiBUSVBDX1RFRShUSVBDX0NPTlMsVElQQ19MT0cpICkKKyAqIFRJUENfTlVMTAkJICAgOiBudWxsIGJ1ZmZlciAoaS5lLiBwcmludCBub3doZXJlKQorICogVElQQ19DT05TCQkgICA6IHN5c3RlbSBjb25zb2xlCisgKiBUSVBDX0xPRwkJICAgOiBUSVBDIGxvZyBidWZmZXIKKyAqICZidWYJCQkgICA6IHVzZXItZGVmaW5lZCBidWZmZXIgKHN0cnVjdCBwcmludF9idWYgKikKKyAqIFRJUENfVEVFKCZidWZfYSwmYnVmX2IpIDogbGlzdCBvZiBidWZmZXJzIChlZy4gVElQQ19URUUoVElQQ19DT05TLFRJUENfTE9HKSkKICAqLwogCiAjaWZuZGVmIFRJUENfT1VUUFVUCkBAIC0xMDYsNyArMTA2LDcgQEAKICNlbmRpZgogCiAjaWZuZGVmIERCR19PVVRQVVQKLSNkZWZpbmUgREJHX09VVFBVVCBOVUxMCisjZGVmaW5lIERCR19PVVRQVVQgVElQQ19OVUxMCiAjZW5kaWYKIAogI2Vsc2UKQEAgLTEzNiw3ICsxMzYsNyBAQAogI2RlZmluZSBUSVBDX09VVFBVVCBUSVBDX0NPTlMKIAogI3VuZGVmICBEQkdfT1VUUFVUCi0jZGVmaW5lIERCR19PVVRQVVQgTlVMTAorI2RlZmluZSBEQkdfT1VUUFVUIFRJUENfTlVMTAogCiAjZW5kaWYJCQkgIAogCkBAIC0yNzUsMTEgKzI3NSwxNSBAQAogLyoKICAqIFRJUEMgbWVzc2FnZSBidWZmZXIgY29kZQogICoKLSAqIFRJUEMgbWVzc2FnZSBidWZmZXIgaGVhZHJvb20gbGVhdmVzIHJvb20gZm9yIDE0IGJ5dGUgRXRoZXJuZXQgaGVhZGVyLCAKKyAqIFRJUEMgbWVzc2FnZSBidWZmZXIgaGVhZHJvb20gcmVzZXJ2ZXMgc3BhY2UgZm9yIGEgbGluay1sZXZlbCBoZWFkZXIKKyAqIChpbiBjYXNlIHRoZSBtZXNzYWdlIGlzIHNlbnQgb2ZmLW5vZGUpLAogICogd2hpbGUgZW5zdXJpbmcgVElQQyBoZWFkZXIgaXMgd29yZCBhbGlnbmVkIGZvciBxdWlja2VyIGFjY2VzcworICoKKyAqIFRoZSBsYXJnZXN0IGhlYWRlciBjdXJyZW50bHkgc3VwcG9ydGVkIGlzIDE4IGJ5dGVzLCB3aGljaCBpcyB1c2VkIHdoZW4KKyAqIHRoZSBzdGFuZGFyZCAxNCBieXRlIEV0aGVybmV0IGhlYWRlciBoYXMgNCBhZGRlZCBieXRlcyBmb3IgVkxBTiBpbmZvCiAgKi8KIAotI2RlZmluZSBCVUZfSEVBRFJPT00gMTZ1IAorI2RlZmluZSBCVUZfSEVBRFJPT00gMjB1CiAKIHN0cnVjdCB0aXBjX3NrYl9jYiB7CiAJdm9pZCAqaGFuZGxlOwpkaWZmIC0tZ2l0IGEvbmV0L3RpcGMvZGJnLmMgYi9uZXQvdGlwYy9kYmcuYwppbmRleCA1NTEzMDY1Li5kOGFmNGMyIDEwMDY0NAotLS0gYS9uZXQvdGlwYy9kYmcuYworKysgYi9uZXQvdGlwYy9kYmcuYwpAQCAtMSw4ICsxLDggQEAKIC8qCi0gKiBuZXQvdGlwYy9kYmcuYzogVElQQyBwcmludCBidWZmZXIgcm91dGluZXMgZm9yIGRlYnVnZ2lnbgorICogbmV0L3RpcGMvZGJnLmM6IFRJUEMgcHJpbnQgYnVmZmVyIHJvdXRpbmVzIGZvciBkZWJ1Z2dpbmcKICAqIAogICogQ29weXJpZ2h0IChjKSAxOTk2LTIwMDYsIEVyaWNzc29uIEFCCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIFdpbmQgUml2ZXIgU3lzdGVtcworICogQ29weXJpZ2h0IChjKSAyMDA1LTIwMDYsIFdpbmQgUml2ZXIgU3lzdGVtcwogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKQEAgLTM4LDExICszOCwxMiBAQAogI2luY2x1ZGUgImNvbmZpZy5oIgogI2luY2x1ZGUgImRiZy5oIgogCi0jZGVmaW5lIE1BWF9TVFJJTkcgNTEyCi0KLXN0YXRpYyBjaGFyIHByaW50X3N0cmluZ1tNQVhfU1RSSU5HXTsKK3N0YXRpYyBjaGFyIHByaW50X3N0cmluZ1tUSVBDX1BCX01BWF9TVFJdOwogc3RhdGljIERFRklORV9TUElOTE9DSyhwcmludF9sb2NrKTsKIAorc3RhdGljIHN0cnVjdCBwcmludF9idWYgbnVsbF9idWYgPSB7IE5VTEwsIDAsIE5VTEwsIE5VTEwgfTsKK3N0cnVjdCBwcmludF9idWYgKlRJUENfTlVMTCA9ICZudWxsX2J1ZjsKKwogc3RhdGljIHN0cnVjdCBwcmludF9idWYgY29uc19idWYgPSB7IE5VTEwsIDAsIE5VTEwsIE5VTEwgfTsKIHN0cnVjdCBwcmludF9idWYgKlRJUENfQ09OUyA9ICZjb25zX2J1ZjsKIApAQCAtNjIsNjggKzYzLDgzIEBACiAvKgogICogTG9ja2luZyBwb2xpY3kgd2hlbiB1c2luZyBwcmludCBidWZmZXJzLgogICoKLSAqIDEpIFJvdXRpbmVzIG9mIHRoZSBmb3JtIHByaW50YnVmX1hYWCgpIHJlbHkgb24gdGhlIGNhbGxlciB0byBwcmV2ZW50Ci0gKiAgICBzaW11bHRhbmVvdXMgdXNlIG9mIHRoZSBwcmludCBidWZmZXIocykgYmVpbmcgbWFuaXB1bGF0ZWQuCi0gKiAyKSB0aXBjX3ByaW50ZigpIHVzZXMgJ3ByaW50X2xvY2snIHRvIHByZXZlbnQgc2ltdWx0YW5lb3VzIHVzZSBvZgotICogICAgJ3ByaW50X3N0cmluZycgYW5kIHRvIHByb3RlY3QgaXRzIHByaW50IGJ1ZmZlcihzKS4KLSAqIDMpIFRJUENfVEVFKCkgdXNlcyAncHJpbnRfbG9jaycgdG8gcHJvdGVjdCBpdHMgcHJpbnQgYnVmZmVyKHMpLgotICogNCkgUm91dGluZXMgb2YgdGhlIGZvcm0gbG9nX1hYWCgpIHVzZXMgJ3ByaW50X2xvY2snIHRvIHByb3RlY3QgVElQQ19MT0cuCisgKiBUaGUgZm9sbG93aW5nIHJvdXRpbmVzIHVzZSAncHJpbnRfbG9jaycgZm9yIHByb3RlY3Rpb246CisgKiAxKSB0aXBjX3ByaW50ZigpICAtIHRvIHByb3RlY3QgaXRzIHByaW50IGJ1ZmZlcihzKSBhbmQgJ3ByaW50X3N0cmluZycKKyAqIDIpIFRJUENfVEVFKCkgICAgIC0gdG8gcHJvdGVjdCBpdHMgcHJpbnQgYnVmZmVyKHMpCisgKiAzKSB0aXBjX2R1bXAoKSAgICAtIHRvIHByb3RlY3QgaXRzIHByaW50IGJ1ZmZlcihzKSBhbmQgJ3ByaW50X3N0cmluZycKKyAqIDQpIHRpcGNfbG9nX1hYWCgpIC0gdG8gcHJvdGVjdCBUSVBDX0xPRworICoKKyAqIEFsbCByb3V0aW5lcyBvZiB0aGUgZm9ybSB0aXBjX3ByaW50YnVmX1hYWCgpIHJlbHkgb24gdGhlIGNhbGxlciB0byBwcmV2ZW50CisgKiBzaW11bHRhbmVvdXMgdXNlIG9mIHRoZSBwcmludCBidWZmZXIocykgYmVpbmcgbWFuaXB1bGF0ZWQuCiAgKi8KIAogLyoqCiAgKiB0aXBjX3ByaW50YnVmX2luaXQgLSBpbml0aWFsaXplIHByaW50IGJ1ZmZlciB0byBlbXB0eQorICogQHBiOiBwb2ludGVyIHRvIHByaW50IGJ1ZmZlciBzdHJ1Y3R1cmUKKyAqIEByYXc6IHBvaW50ZXIgdG8gY2hhcmFjdGVyIGFycmF5IHVzZWQgYnkgcHJpbnQgYnVmZmVyCisgKiBAc2l6ZTogc2l6ZSBvZiBjaGFyYWN0ZXIgYXJyYXkKKyAqCisgKiBNYWtlcyB0aGUgcHJpbnQgYnVmZmVyIGEgbnVsbCBkZXZpY2UgdGhhdCBkaXNjYXJkcyBhbnl0aGluZyB3cml0dGVuIHRvIGl0CisgKiBpZiB0aGUgY2hhcmFjdGVyIGFycmF5IGlzIHRvbyBzbWFsbCAob3IgYWJzZW50KS4KICAqLwogCi12b2lkIHRpcGNfcHJpbnRidWZfaW5pdChzdHJ1Y3QgcHJpbnRfYnVmICpwYiwgY2hhciAqcmF3LCB1MzIgc3opCit2b2lkIHRpcGNfcHJpbnRidWZfaW5pdChzdHJ1Y3QgcHJpbnRfYnVmICpwYiwgY2hhciAqcmF3LCB1MzIgc2l6ZSkKIHsKLQlpZiAoIXBiIHx8ICFyYXcgfHwgKHN6IDwgKE1BWF9TVFJJTkcgKyAxKSkpCi0JCXJldHVybjsKLQotCXBiLT5jcnMgPSBwYi0+YnVmID0gcmF3OwotCXBiLT5zaXplID0gc3o7CisJcGItPmJ1ZiA9IHJhdzsKKwlwYi0+Y3JzID0gcmF3OworCXBiLT5zaXplID0gc2l6ZTsKIAlwYi0+bmV4dCA9IE5VTEw7Ci0JcGItPmJ1ZlswXSA9IDA7Ci0JcGItPmJ1Zltzei0xXSA9IH4wOworCisJaWYgKHNpemUgPCBUSVBDX1BCX01JTl9TSVpFKSB7CisJCXBiLT5idWYgPSBOVUxMOworCX0gZWxzZSBpZiAocmF3KSB7CisJCXBiLT5idWZbMF0gPSAwOworCQlwYi0+YnVmW3NpemUtMV0gPSB+MDsKKwl9CiB9CiAKIC8qKgogICogdGlwY19wcmludGJ1Zl9yZXNldCAtIHJlaW5pdGlhbGl6ZSBwcmludCBidWZmZXIgdG8gZW1wdHkgc3RhdGUKKyAqIEBwYjogcG9pbnRlciB0byBwcmludCBidWZmZXIgc3RydWN0dXJlCiAgKi8KIAogdm9pZCB0aXBjX3ByaW50YnVmX3Jlc2V0KHN0cnVjdCBwcmludF9idWYgKnBiKQogewotCWlmIChwYiAmJiBwYi0+YnVmKQotCQl0aXBjX3ByaW50YnVmX2luaXQocGIsIHBiLT5idWYsIHBiLT5zaXplKTsKKwl0aXBjX3ByaW50YnVmX2luaXQocGIsIHBiLT5idWYsIHBiLT5zaXplKTsKIH0KIAogLyoqCiAgKiB0aXBjX3ByaW50YnVmX2VtcHR5IC0gdGVzdCBpZiBwcmludCBidWZmZXIgaXMgaW4gZW1wdHkgc3RhdGUKKyAqIEBwYjogcG9pbnRlciB0byBwcmludCBidWZmZXIgc3RydWN0dXJlCisgKgorICogUmV0dXJucyBub24temVybyBpZiBwcmludCBidWZmZXIgaXMgZW1wdHkuCiAgKi8KIAogaW50IHRpcGNfcHJpbnRidWZfZW1wdHkoc3RydWN0IHByaW50X2J1ZiAqcGIpCiB7Ci0JcmV0dXJuICghcGIgfHwgIXBiLT5idWYgfHwgKHBiLT5jcnMgPT0gcGItPmJ1ZikpOworCXJldHVybiAoIXBiLT5idWYgfHwgKHBiLT5jcnMgPT0gcGItPmJ1ZikpOwogfQogCiAvKioKICAqIHRpcGNfcHJpbnRidWZfdmFsaWRhdGUgLSBjaGVjayBmb3IgcHJpbnQgYnVmZmVyIG92ZXJmbG93CisgKiBAcGI6IHBvaW50ZXIgdG8gcHJpbnQgYnVmZmVyIHN0cnVjdHVyZQogICogCiAgKiBWZXJpZmllcyB0aGF0IGEgcHJpbnQgYnVmZmVyIGhhcyBjYXB0dXJlZCBhbGwgZGF0YSB3cml0dGVuIHRvIGl0LiAKICAqIElmIGRhdGEgaGFzIGJlZW4gbG9zdCwgbGluZWFyaXplIGJ1ZmZlciBhbmQgcHJlcGVuZCBhbiBlcnJvciBtZXNzYWdlCiAgKiAKLSAqIFJldHVybnMgbGVuZ3RoIG9mIHByaW50IGJ1ZmZlciBkYXRhIHN0cmluZyAoaW5jbHVkaW5nIHRyYWlsaW5nIE5VTEwpCisgKiBSZXR1cm5zIGxlbmd0aCBvZiBwcmludCBidWZmZXIgZGF0YSBzdHJpbmcgKGluY2x1ZGluZyB0cmFpbGluZyBOVUwpCiAgKi8KIAogaW50IHRpcGNfcHJpbnRidWZfdmFsaWRhdGUoc3RydWN0IHByaW50X2J1ZiAqcGIpCiB7Ci0gICAgICAgIGNoYXIgKmVyciA9ICIgICAgICAgICAgICAgKioqIFBSSU5UIEJVRkZFUiBXUkFQUEVEIEFST1VORCAqKipcbiI7CisgICAgICAgIGNoYXIgKmVyciA9ICJcblxuKioqIFBSSU5UIEJVRkZFUiBPVkVSRkxPVyAqKipcblxuIjsKICAgICAgICAgY2hhciAqY3BfYnVmOwogICAgICAgICBzdHJ1Y3QgcHJpbnRfYnVmIGNiOwogCi0JaWYgKCFwYiB8fCAhcGItPmJ1ZikKKwlpZiAoIXBiLT5idWYpCiAJCXJldHVybiAwOwogCi0JaWYgKHBiLT5idWZbcGItPnNpemUgLSAxXSA9PSAnXDAnKSB7CisJaWYgKHBiLT5idWZbcGItPnNpemUgLSAxXSA9PSAwKSB7CiAgICAgICAgICAgICAgICAgY3BfYnVmID0ga21hbGxvYyhwYi0+c2l6ZSwgR0ZQX0FUT01JQyk7CiAgICAgICAgICAgICAgICAgaWYgKGNwX2J1ZiAhPSBOVUxMKXsKICAgICAgICAgICAgICAgICAgICAgICAgIHRpcGNfcHJpbnRidWZfaW5pdCgmY2IsIGNwX2J1ZiwgcGItPnNpemUpOwpAQCAtMTQxLDYgKzE1Nyw4IEBACiAKIC8qKgogICogdGlwY19wcmludGJ1Zl9tb3ZlIC0gbW92ZSBwcmludCBidWZmZXIgY29udGVudHMgdG8gYW5vdGhlciBwcmludCBidWZmZXIKKyAqIEBwYl90bzogcG9pbnRlciB0byBkZXN0aW5hdGlvbiBwcmludCBidWZmZXIgc3RydWN0dXJlCisgKiBAcGJfZnJvbTogcG9pbnRlciB0byBzb3VyY2UgcHJpbnQgYnVmZmVyIHN0cnVjdHVyZQogICogCiAgKiBDdXJyZW50IGNvbnRlbnRzIG9mIGRlc3RpbmF0aW9uIHByaW50IGJ1ZmZlciAoaWYgYW55KSBhcmUgZGlzY2FyZGVkLgogICogU291cmNlIHByaW50IGJ1ZmZlciBiZWNvbWVzIGVtcHR5IGlmIGEgc3VjY2Vzc2Z1bCBtb3ZlIG9jY3Vycy4KQEAgLTE1MiwyMSArMTcwLDIyIEBACiAKIAkvKiBIYW5kbGUgdGhlIGNhc2VzIHdoZXJlIGNvbnRlbnRzIGNhbid0IGJlIG1vdmVkICovCiAKLQlpZiAoIXBiX3RvIHx8ICFwYl90by0+YnVmKQorCWlmICghcGJfdG8tPmJ1ZikKIAkJcmV0dXJuOwogCi0JaWYgKCFwYl9mcm9tIHx8ICFwYl9mcm9tLT5idWYpIHsKKwlpZiAoIXBiX2Zyb20tPmJ1ZikgewogCQl0aXBjX3ByaW50YnVmX3Jlc2V0KHBiX3RvKTsKIAkJcmV0dXJuOwogCX0KIAogCWlmIChwYl90by0+c2l6ZSA8IHBiX2Zyb20tPnNpemUpIHsKIAkJdGlwY19wcmludGJ1Zl9yZXNldChwYl90byk7Ci0JCXRpcGNfcHJpbnRmKHBiX3RvLCAiKioqIFBSSU5UIEJVRkZFUiBPVkVSRkxPVyAqKioiKTsKKwkJdGlwY19wcmludGYocGJfdG8sICIqKiogUFJJTlQgQlVGRkVSIE1PVkUgRVJST1IgKioqIik7CiAJCXJldHVybjsKIAl9CiAKIAkvKiBDb3B5IGRhdGEgZnJvbSBjaGFyIGFmdGVyIGN1cnNvciB0byBlbmQgKGlmIHVzZWQpICovCisKIAlsZW4gPSBwYl9mcm9tLT5idWYgKyBwYl9mcm9tLT5zaXplIC0gcGJfZnJvbS0+Y3JzIC0gMjsKIAlpZiAoKHBiX2Zyb20tPmJ1ZltwYl9mcm9tLT5zaXplLTFdID09IDApICYmIChsZW4gPiAwKSkgewogCQlzdHJjcHkocGJfdG8tPmJ1ZiwgcGJfZnJvbS0+Y3JzICsgMSk7CkBAIC0xNzUsNiArMTk0LDcgQEAKIAkJcGJfdG8tPmNycyA9IHBiX3RvLT5idWY7CiAKIAkvKiBDb3B5IGRhdGEgZnJvbSBzdGFydCB0byBjdXJzb3IgKGFsd2F5cykgKi8KKwogCWxlbiA9IHBiX2Zyb20tPmNycyAtIHBiX2Zyb20tPmJ1ZjsKIAlzdHJjcHkocGJfdG8tPmNycywgcGJfZnJvbS0+YnVmKTsKIAlwYl90by0+Y3JzICs9IGxlbjsKQEAgLTE4NCw2ICsyMDQsOCBAQAogCiAvKioKICAqIHRpcGNfcHJpbnRmIC0gYXBwZW5kIGZvcm1hdHRlZCBvdXRwdXQgdG8gcHJpbnQgYnVmZmVyIGNoYWluCisgKiBAcGI6IHBvaW50ZXIgdG8gY2hhaW4gb2YgcHJpbnQgYnVmZmVycyAobWF5IGJlIE5VTEwpCisgKiBAZm10OiBmb3JtYXR0ZWQgaW5mbyB0byBiZSBwcmludGVkCiAgKi8KIAogdm9pZCB0aXBjX3ByaW50ZihzdHJ1Y3QgcHJpbnRfYnVmICpwYiwgY29uc3QgY2hhciAqZm10LCAuLi4pCkBAIC0xOTUsOCArMjE3LDggQEAKIAogCXNwaW5fbG9ja19iaCgmcHJpbnRfbG9jayk7CiAJRk9STUFUKHByaW50X3N0cmluZywgY2hhcnNfdG9fYWRkLCBmbXQpOwotCWlmIChjaGFyc190b19hZGQgPj0gTUFYX1NUUklORykKLQkJc3RyY3B5KHByaW50X3N0cmluZywgIioqKiBTVFJJTkcgVE9PIExPTkcgKioqIik7CisJaWYgKGNoYXJzX3RvX2FkZCA+PSBUSVBDX1BCX01BWF9TVFIpCisJCXN0cmNweShwcmludF9zdHJpbmcsICIqKiogUFJJTlQgQlVGRkVSIFNUUklORyBUT08gTE9ORyAqKioiKTsKIAogCXdoaWxlIChwYikgewogCQlpZiAocGIgPT0gVElQQ19DT05TKQpAQCAtMjA2LDYgKzIyOCwxMCBAQAogCQkJaWYgKGNoYXJzX3RvX2FkZCA8PSBjaGFyc19sZWZ0KSB7CiAJCQkJc3RyY3B5KHBiLT5jcnMsIHByaW50X3N0cmluZyk7CiAJCQkJcGItPmNycyArPSBjaGFyc190b19hZGQ7CisJCQl9IGVsc2UgaWYgKGNoYXJzX3RvX2FkZCA+PSAocGItPnNpemUgLSAxKSkgeworCQkJCXN0cmNweShwYi0+YnVmLCBwcmludF9zdHJpbmcgKyBjaGFyc190b19hZGQgKyAxCisJCQkJICAgICAgIC0gcGItPnNpemUpOworCQkJCXBiLT5jcnMgPSBwYi0+YnVmICsgcGItPnNpemUgLSAxOwogCQkJfSBlbHNlIHsKIAkJCQlzdHJjcHkocGItPmJ1ZiwgcHJpbnRfc3RyaW5nICsgY2hhcnNfbGVmdCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhdmVfY2hhciA9IHByaW50X3N0cmluZ1tjaGFyc19sZWZ0XTsKQEAgLTIyNCw2ICsyNTAsMTAgQEAKIAogLyoqCiAgKiBUSVBDX1RFRSAtIHBlcmZvcm0gbmV4dCBvdXRwdXQgb3BlcmF0aW9uIG9uIGJvdGggcHJpbnQgYnVmZmVycyAgCisgKiBAYjA6IHBvaW50ZXIgdG8gY2hhaW4gb2YgcHJpbnQgYnVmZmVycyAobWF5IGJlIE5VTEwpCisgKiBAYjE6IHBvaW50ZXIgdG8gcHJpbnQgYnVmZmVyIHRvIGFkZCB0byBjaGFpbgorICoKKyAqIFJldHVybnMgcG9pbnRlciB0byBwcmludCBidWZmZXIgY2hhaW4uCiAgKi8KIAogc3RydWN0IHByaW50X2J1ZiAqVElQQ19URUUoc3RydWN0IHByaW50X2J1ZiAqYjAsIHN0cnVjdCBwcmludF9idWYgKmIxKQpAQCAtMjMyLDggKzI2Miw2IEBACiAKIAlpZiAoIWIwIHx8IChiMCA9PSBiMSkpCiAJCXJldHVybiBiMTsKLQlpZiAoIWIxKQotCQlyZXR1cm4gYjA7CiAKIAlzcGluX2xvY2tfYmgoJnByaW50X2xvY2spOwogCXdoaWxlIChwYi0+bmV4dCkgewpAQCAtMjU2LDcgKzI4NCw3IEBACiAJaW50IHJlc3QgPSBsZW47CiAKIAl3aGlsZSAocmVzdCA+IDApIHsKLQkJaW50IHN6ID0gcmVzdCA8IE1BWF9TVFJJTkcgPyByZXN0IDogTUFYX1NUUklORzsKKwkJaW50IHN6ID0gcmVzdCA8IFRJUENfUEJfTUFYX1NUUiA/IHJlc3QgOiBUSVBDX1BCX01BWF9TVFI7CiAJCWNoYXIgYyA9IGNyc1tzel07CiAKIAkJY3JzW3N6XSA9IDA7CkBAIC0yNzUsMzYgKzMwMyw0OCBAQAogewogCWludCBsZW47CiAKKwlpZiAoIXBiLT5idWYpIHsKKwkJcHJpbnRrKCIqKiogUFJJTlQgQlVGRkVSIE5PVCBBTExPQ0FURUQgKioqIik7CisJCXJldHVybjsKKwl9CisKIAkvKiBEdW1wIHByaW50IGJ1ZmZlciBmcm9tIGNoYXIgYWZ0ZXIgY3Vyc29yIHRvIGVuZCAoaWYgdXNlZCkgKi8KKwogCWxlbiA9IHBiLT5idWYgKyBwYi0+c2l6ZSAtIHBiLT5jcnMgLSAyOwogCWlmICgocGItPmJ1ZltwYi0+c2l6ZSAtIDFdID09IDApICYmIChsZW4gPiAwKSkKIAkJcHJpbnRfdG9fY29uc29sZShwYi0+Y3JzICsgMSwgbGVuKTsKIAogCS8qIER1bXAgcHJpbnQgYnVmZmVyIGZyb20gc3RhcnQgdG8gY3Vyc29yIChhbHdheXMpICovCisKIAlsZW4gPSBwYi0+Y3JzIC0gcGItPmJ1ZjsKIAlwcmludF90b19jb25zb2xlKHBiLT5idWYsIGxlbik7CiB9CiAKIC8qKgogICogdGlwY19kdW1wIC0gZHVtcCBub24tY29uc29sZSBwcmludCBidWZmZXIocykgdG8gY29uc29sZQorICogQHBiOiBwb2ludGVyIHRvIGNoYWluIG9mIHByaW50IGJ1ZmZlcnMKICAqLwogCiB2b2lkIHRpcGNfZHVtcChzdHJ1Y3QgcHJpbnRfYnVmICpwYiwgY29uc3QgY2hhciAqZm10LCAuLi4pCiB7CisJc3RydWN0IHByaW50X2J1ZiAqcGJfbmV4dDsKIAlpbnQgbGVuOwogCiAJc3Bpbl9sb2NrX2JoKCZwcmludF9sb2NrKTsKLQlGT1JNQVQoVElQQ19DT05TLT5idWYsIGxlbiwgZm10KTsKLQlwcmludGsoVElQQ19DT05TLT5idWYpOworCUZPUk1BVChwcmludF9zdHJpbmcsIGxlbiwgZm10KTsKKwlwcmludGsocHJpbnRfc3RyaW5nKTsKIAogCWZvciAoOyBwYjsgcGIgPSBwYi0+bmV4dCkgewotCQlpZiAocGIgPT0gVElQQ19DT05TKQotCQkJY29udGludWU7Ci0JCXByaW50aygiXG4tLS0tIFN0YXJ0IG9mIGR1bXAsJXMgbG9nIC0tLS1cblxuIiwgCi0JCSAgICAgICAocGIgPT0gVElQQ19MT0cpID8gImdsb2JhbCIgOiAibG9jYWwiKTsKLQkJcHJpbnRidWZfZHVtcChwYik7Ci0JCXRpcGNfcHJpbnRidWZfcmVzZXQocGIpOwotCQlwcmludGsoIlxuLS0tLS0tLS0gRW5kIG9mIGR1bXAgLS0tLS0tLS1cbiIpOworCQlpZiAocGIgIT0gVElQQ19DT05TKSB7CisJCQlwcmludGsoIlxuLS0tLSBTdGFydCBvZiAlcyBsb2cgZHVtcCAtLS0tXG5cbiIsCisJCQkgICAgICAgKHBiID09IFRJUENfTE9HKSA/ICJnbG9iYWwiIDogImxvY2FsIik7CisJCQlwcmludGJ1Zl9kdW1wKHBiKTsKKwkJCXRpcGNfcHJpbnRidWZfcmVzZXQocGIpOworCQkJcHJpbnRrKCJcbi0tLS0gRW5kIG9mIGR1bXAgLS0tLVxuIik7CisJCX0KKwkJcGJfbmV4dCA9IHBiLT5uZXh0OworCQlwYi0+bmV4dCA9IE5VTEw7CisJCXBiID0gcGJfbmV4dDsKIAl9CiAJc3Bpbl91bmxvY2tfYmgoJnByaW50X2xvY2spOwogfQpAQCAtMzI0LDcgKzM2NCw4IEBACiB9CiAKIC8qKgotICogdGlwY19sb2dfcmVpbml0IC0gc2V0IFRJUEMgbG9nIHByaW50IGJ1ZmZlciB0byBzcGVjaWZpZWQgc2l6ZQorICogdGlwY19sb2dfcmVpbml0IC0gKHJlKWluaXRpYWxpemUgVElQQyBsb2cgcHJpbnQgYnVmZmVyCisgKiBAbG9nX3NpemU6IHByaW50IGJ1ZmZlciBzaXplIHRvIHVzZQogICovCiAKIHZvaWQgdGlwY19sb2dfcmVpbml0KGludCBsb2dfc2l6ZSkKQEAgLTMzMiwxMCArMzczLDExIEBACiAJdGlwY19sb2dfc3RvcCgpOwogCiAJaWYgKGxvZ19zaXplKSB7Ci0JCWlmIChsb2dfc2l6ZSA8PSBNQVhfU1RSSU5HKQotCQkJbG9nX3NpemUgPSBNQVhfU1RSSU5HICsgMTsKKwkJaWYgKGxvZ19zaXplIDwgVElQQ19QQl9NSU5fU0laRSkKKwkJCWxvZ19zaXplID0gVElQQ19QQl9NSU5fU0laRTsKIAkJc3Bpbl9sb2NrX2JoKCZwcmludF9sb2NrKTsKLQkJdGlwY19wcmludGJ1Zl9pbml0KFRJUENfTE9HLCBrbWFsbG9jKGxvZ19zaXplLCBHRlBfQVRPTUlDKSwgbG9nX3NpemUpOworCQl0aXBjX3ByaW50YnVmX2luaXQoVElQQ19MT0csIGttYWxsb2MobG9nX3NpemUsIEdGUF9BVE9NSUMpLAorCQkJCSAgIGxvZ19zaXplKTsKIAkJc3Bpbl91bmxvY2tfYmgoJnByaW50X2xvY2spOwogCX0KIH0KZGlmZiAtLWdpdCBhL25ldC90aXBjL2RiZy5oIGIvbmV0L3RpcGMvZGJnLmgKaW5kZXggMjI3ZjA1MC4uNDY3YzBiYzcgMTAwNjQ0Ci0tLSBhL25ldC90aXBjL2RiZy5oCisrKyBiL25ldC90aXBjL2RiZy5oCkBAIC0yLDcgKzIsNyBAQAogICogbmV0L3RpcGMvZGJnLmg6IEluY2x1ZGUgZmlsZSBmb3IgVElQQyBwcmludCBidWZmZXIgcm91dGluZXMKICAqIAogICogQ29weXJpZ2h0IChjKSAxOTk3LTIwMDYsIEVyaWNzc29uIEFCCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIFdpbmQgUml2ZXIgU3lzdGVtcworICogQ29weXJpZ2h0IChjKSAyMDA1LTIwMDYsIFdpbmQgUml2ZXIgU3lzdGVtcwogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKQEAgLTM3LDYgKzM3LDE0IEBACiAjaWZuZGVmIF9USVBDX0RCR19ICiAjZGVmaW5lIF9USVBDX0RCR19ICiAKKy8qKgorICogc3RydWN0IHByaW50X2J1ZiAtIFRJUEMgcHJpbnQgYnVmZmVyIHN0cnVjdHVyZQorICogQGJ1ZjogcG9pbnRlciB0byBjaGFyYWN0ZXIgYXJyYXkgY29udGFpbmluZyBwcmludCBidWZmZXIgY29udGVudHMKKyAqIEBzaXplOiBzaXplIG9mIGNoYXJhY3RlciBhcnJheQorICogQGNyczogcG9pbnRlciB0byBmaXJzdCB1bnVzZWQgc3BhY2UgaW4gY2hhcmFjdGVyIGFycmF5IChpLmUuIGZpbmFsIE5VTCkKKyAqIEBuZXh0OiB1c2VkIHRvIGxpbmsgcHJpbnQgYnVmZmVycyB3aGVuIHByaW50aW5nIHRvIG1vcmUgdGhhbiBvbmUgYXQgYSB0aW1lCisgKi8KKwogc3RydWN0IHByaW50X2J1ZiB7CiAJY2hhciAqYnVmOwogCXUzMiBzaXplOwpAQCAtNDQsNyArNTIsMTAgQEAKIAlzdHJ1Y3QgcHJpbnRfYnVmICpuZXh0OwogfTsKIAotdm9pZCB0aXBjX3ByaW50YnVmX2luaXQoc3RydWN0IHByaW50X2J1ZiAqcGIsIGNoYXIgKmJ1ZiwgdTMyIHN6KTsKKyNkZWZpbmUgVElQQ19QQl9NSU5fU0laRSA2NAkvKiBtaW5pbXVtIHNpemUgZm9yIGEgcHJpbnQgYnVmZmVyJ3MgYXJyYXkgKi8KKyNkZWZpbmUgVElQQ19QQl9NQVhfU1RSIDUxMgkvKiBtYXggcHJpbnRhYmxlIHN0cmluZyAod2l0aCB0cmFpbGluZyBOVUwpICovCisKK3ZvaWQgdGlwY19wcmludGJ1Zl9pbml0KHN0cnVjdCBwcmludF9idWYgKnBiLCBjaGFyICpidWYsIHUzMiBzaXplKTsKIHZvaWQgdGlwY19wcmludGJ1Zl9yZXNldChzdHJ1Y3QgcHJpbnRfYnVmICpwYik7CiBpbnQgIHRpcGNfcHJpbnRidWZfZW1wdHkoc3RydWN0IHByaW50X2J1ZiAqcGIpOwogaW50ICB0aXBjX3ByaW50YnVmX3ZhbGlkYXRlKHN0cnVjdCBwcmludF9idWYgKnBiKTsKZGlmZiAtLWdpdCBhL25ldC90aXBjL2Rpc2NvdmVyLmMgYi9uZXQvdGlwYy9kaXNjb3Zlci5jCmluZGV4IGVlOTRkZTkuLjNiMGNkMTIgMTAwNjQ0Ci0tLSBhL25ldC90aXBjL2Rpc2NvdmVyLmMKKysrIGIvbmV0L3RpcGMvZGlzY292ZXIuYwpAQCAtMTMyLDYgKzEzMiwyOCBAQAogfQogCiAvKioKKyAqIGRpc2NfZHVwbF9hbGVydCAtIGlzc3VlIG5vZGUgYWRkcmVzcyBkdXBsaWNhdGlvbiBhbGVydAorICogQGJfcHRyOiBwb2ludGVyIHRvIGJlYXJlciBkZXRlY3RpbmcgZHVwbGljYXRpb24KKyAqIEBub2RlX2FkZHI6IGR1cGxpY2F0ZWQgbm9kZSBhZGRyZXNzCisgKiBAbWVkaWFfYWRkcjogbWVkaWEgYWRkcmVzcyBhZHZlcnRpc2VkIGJ5IGR1cGxpY2F0ZWQgbm9kZQorICovCisKK3N0YXRpYyB2b2lkIGRpc2NfZHVwbF9hbGVydChzdHJ1Y3QgYmVhcmVyICpiX3B0ciwgdTMyIG5vZGVfYWRkciwKKwkJCSAgICBzdHJ1Y3QgdGlwY19tZWRpYV9hZGRyICptZWRpYV9hZGRyKQoreworCWNoYXIgbm9kZV9hZGRyX3N0clsxNl07CisJY2hhciBtZWRpYV9hZGRyX3N0cls2NF07CisJc3RydWN0IHByaW50X2J1ZiBwYjsKKworCWFkZHJfc3RyaW5nX2ZpbGwobm9kZV9hZGRyX3N0ciwgbm9kZV9hZGRyKTsKKwl0aXBjX3ByaW50YnVmX2luaXQoJnBiLCBtZWRpYV9hZGRyX3N0ciwgc2l6ZW9mKG1lZGlhX2FkZHJfc3RyKSk7CisJdGlwY19tZWRpYV9hZGRyX3ByaW50ZigmcGIsIG1lZGlhX2FkZHIpOworCXRpcGNfcHJpbnRidWZfdmFsaWRhdGUoJnBiKTsKKwl3YXJuKCJEdXBsaWNhdGUgJXMgdXNpbmcgJXMgc2VlbiBvbiA8JXM+XG4iLAorCSAgICAgbm9kZV9hZGRyX3N0ciwgbWVkaWFfYWRkcl9zdHIsIGJfcHRyLT5wdWJsLm5hbWUpOworfQorCisvKioKICAqIHRpcGNfZGlzY19yZWN2X21zZyAtIGhhbmRsZSBpbmNvbWluZyBsaW5rIHNldHVwIG1lc3NhZ2UgKHJlcXVlc3Qgb3IgcmVzcG9uc2UpCiAgKiBAYnVmOiBidWZmZXIgY29udGFpbmluZyBtZXNzYWdlCiAgKi8KQEAgLTE1Nyw4ICsxNzksMTEgQEAKIAkJcmV0dXJuOwogCWlmICghdGlwY19hZGRyX25vZGVfdmFsaWQob3JpZykpCiAJCXJldHVybjsKLQlpZiAob3JpZyA9PSB0aXBjX293bl9hZGRyKQorCWlmIChvcmlnID09IHRpcGNfb3duX2FkZHIpIHsKKwkJaWYgKG1lbWNtcCgmbWVkaWFfYWRkciwgJmJfcHRyLT5wdWJsLmFkZHIsIHNpemVvZihtZWRpYV9hZGRyKSkpCisJCQlkaXNjX2R1cGxfYWxlcnQoYl9wdHIsIHRpcGNfb3duX2FkZHIsICZtZWRpYV9hZGRyKTsKIAkJcmV0dXJuOworCX0KIAlpZiAoIWluX3Njb3BlKGRlc3QsIHRpcGNfb3duX2FkZHIpKQogCQlyZXR1cm47CiAJaWYgKGlzX3NsYXZlKHRpcGNfb3duX2FkZHIpICYmIGlzX3NsYXZlKG9yaWcpKQpAQCAtMTcwLDcgKzE5NSw4IEBACiAJCXN0cnVjdCBza19idWZmICpyYnVmOwogCQlzdHJ1Y3QgdGlwY19tZWRpYV9hZGRyICphZGRyOwogCQlzdHJ1Y3Qgbm9kZSAqbl9wdHIgPSB0aXBjX25vZGVfZmluZChvcmlnKTsKLQkJaW50IGxpbmtfdXA7CisJCWludCBsaW5rX2Z1bGx5X3VwOworCiAJCWRiZygiIGluIG93biBjbHVzdGVyXG4iKTsKIAkJaWYgKG5fcHRyID09IE5VTEwpIHsKIAkJCW5fcHRyID0gdGlwY19ub2RlX2NyZWF0ZShvcmlnKTsKQEAgLTE5MCwxNCArMjE2LDE5IEBACiAJCX0KIAkJYWRkciA9ICZsaW5rLT5tZWRpYV9hZGRyOwogCQlpZiAobWVtY21wKGFkZHIsICZtZWRpYV9hZGRyLCBzaXplb2YoKmFkZHIpKSkgeworCQkJaWYgKHRpcGNfbGlua19pc191cChsaW5rKSB8fCAoIWxpbmstPnN0YXJ0ZWQpKSB7CisJCQkJZGlzY19kdXBsX2FsZXJ0KGJfcHRyLCBvcmlnLCAmbWVkaWFfYWRkcik7CisJCQkJc3Bpbl91bmxvY2tfYmgoJm5fcHRyLT5sb2NrKTsKKwkJCQlyZXR1cm47CisJCQl9CiAJCQl3YXJuKCJSZXNldHRpbmcgbGluayA8JXM+LCBwZWVyIGludGVyZmFjZSBhZGRyZXNzIGNoYW5nZWRcbiIsCiAJCQkgICAgIGxpbmstPm5hbWUpOwogCQkJbWVtY3B5KGFkZHIsICZtZWRpYV9hZGRyLCBzaXplb2YoKmFkZHIpKTsKIAkJCXRpcGNfbGlua19yZXNldChsaW5rKTsgICAgIAogCQl9Ci0JCWxpbmtfdXAgPSB0aXBjX2xpbmtfaXNfdXAobGluayk7CisJCWxpbmtfZnVsbHlfdXAgPSAobGluay0+c3RhdGUgPT0gV09SS0lOR19XT1JLSU5HKTsKIAkJc3Bpbl91bmxvY2tfYmgoJm5fcHRyLT5sb2NrKTsgICAgICAgICAgICAgICAgCi0JCWlmICgodHlwZSA9PSBEU0NfUkVTUF9NU0cpIHx8IGxpbmtfdXApCisJCWlmICgodHlwZSA9PSBEU0NfUkVTUF9NU0cpIHx8IGxpbmtfZnVsbHlfdXApCiAJCQlyZXR1cm47CiAJCXJidWYgPSB0aXBjX2Rpc2NfaW5pdF9tc2coRFNDX1JFU1BfTVNHLCAxLCBvcmlnLCBiX3B0cik7CiAJCWlmIChyYnVmICE9IE5VTEwpIHsKZGlmZiAtLWdpdCBhL25ldC90aXBjL2xpbmsuYyBiL25ldC90aXBjL2xpbmsuYwppbmRleCA1M2JjOGNiLi4xYmI5ODNjIDEwMDY0NAotLS0gYS9uZXQvdGlwYy9saW5rLmMKKysrIGIvbmV0L3RpcGMvbGluay5jCkBAIC0xMzIsNyArMTMyLDcgQEAKICAqIGFsbG93IHRoZSBvdXRwdXQgZnJvbSBtdWx0aXBsZSBsaW5rcyB0byBiZSBpbnRlcm1peGVkLiAgRm9yIHRoaXMgcmVhc29uCiAgKiByb3V0aW5lcyBvZiB0aGUgZm9ybSAiZGJnX2xpbmtfWFhYKCkiIGhhdmUgYmVlbiBjcmVhdGVkIHRoYXQgd2lsbCBjYXB0dXJlCiAgKiBkZWJ1ZyBpbmZvIGludG8gYSBsaW5rJ3MgcGVyc29uYWwgcHJpbnQgYnVmZmVyLCB3aGljaCBjYW4gdGhlbiBiZSBkdW1wZWQKLSAqIGludG8gdGhlIFRJUEMgc3lzdGVtIGxvZyAoTE9HKSB1cG9uIHJlcXVlc3QuCisgKiBpbnRvIHRoZSBUSVBDIHN5c3RlbSBsb2cgKFRJUENfTE9HKSB1cG9uIHJlcXVlc3QuCiAgKgogICogVG8gZW5hYmxlIHBlci1saW5rIGRlYnVnZ2luZywgdXNlIExJTktfTE9HX0JVRl9TSVpFIHRvIHNwZWNpZnkgdGhlIHNpemUKICAqIG9mIHRoZSBwcmludCBidWZmZXIgdXNlZCBieSBlYWNoIGxpbmsuICBJZiBMSU5LX0xPR19CVUZfU0laRSBpcyBzZXQgdG8gMCwKQEAgLTE0MSw3ICsxNDEsNyBAQAogICogd2hlbiB0aGVyZSBpcyBvbmx5IGEgc2luZ2xlIGxpbmsgaW4gdGhlIHN5c3RlbSBiZWluZyBkZWJ1Z2dlZC4KICAqCiAgKiBOb3RlczoKLSAqIC0gV2hlbiBlbmFibGVkLCBMSU5LX0xPR19CVUZfU0laRSBzaG91bGQgYmUgc2V0IHRvIGF0IGxlYXN0IDEwMDAgKGJ5dGVzKQorICogLSBXaGVuIGVuYWJsZWQsIExJTktfTE9HX0JVRl9TSVpFIHNob3VsZCBiZSBzZXQgdG8gYXQgbGVhc3QgVElQQ19QQl9NSU5fU0laRQogICogLSAibF9wdHIiIG11c3QgYmUgdmFsaWQgd2hlbiB1c2luZyBkYmdfbGlua19YWFgoKSBtYWNyb3MgIAogICovCiAKQEAgLTE1OSwxMyArMTU5LDEzIEBACiAKIHN0YXRpYyB2b2lkIGRiZ19wcmludF9saW5rKHN0cnVjdCBsaW5rICpsX3B0ciwgY29uc3QgY2hhciAqc3RyKQogewotCWlmIChEQkdfT1VUUFVUKQorCWlmIChEQkdfT1VUUFVUICE9IFRJUENfTlVMTCkKIAkJbGlua19wcmludChsX3B0ciwgREJHX09VVFBVVCwgc3RyKTsKIH0KIAogc3RhdGljIHZvaWQgZGJnX3ByaW50X2J1Zl9jaGFpbihzdHJ1Y3Qgc2tfYnVmZiAqcm9vdF9idWYpCiB7Ci0JaWYgKERCR19PVVRQVVQpIHsKKwlpZiAoREJHX09VVFBVVCAhPSBUSVBDX05VTEwpIHsKIAkJc3RydWN0IHNrX2J1ZmYgKmJ1ZiA9IHJvb3RfYnVmOwogCiAJCXdoaWxlIChidWYpIHsKZGlmZiAtLWdpdCBhL25ldC90aXBjL25hbWVfZGlzdHIuYyBiL25ldC90aXBjL25hbWVfZGlzdHIuYwppbmRleCBmMGIwNjNiLi4wM2JkNjU5IDEwMDY0NAotLS0gYS9uZXQvdGlwYy9uYW1lX2Rpc3RyLmMKKysrIGIvbmV0L3RpcGMvbmFtZV9kaXN0ci5jCkBAIC0xMjIsNyArMTIyLDcgQEAKIAlzdHJ1Y3Qgc2tfYnVmZiAqYnVmOwogCXN0cnVjdCBkaXN0cl9pdGVtICppdGVtOwogCi0JbGlzdF9hZGQoJnB1YmwtPmxvY2FsX2xpc3QsICZwdWJsX3Jvb3QpOworCWxpc3RfYWRkX3RhaWwoJnB1YmwtPmxvY2FsX2xpc3QsICZwdWJsX3Jvb3QpOwogCXB1YmxfY250Kys7CiAKIAlidWYgPSBuYW1lZF9wcmVwYXJlX2J1ZihQVUJMSUNBVElPTiwgSVRFTV9TSVpFLCAwKTsKZGlmZiAtLWdpdCBhL25ldC90aXBjL25vZGUuYyBiL25ldC90aXBjL25vZGUuYwppbmRleCBmYzZkMDk2Li44ODZiZGE1IDEwMDY0NAotLS0gYS9uZXQvdGlwYy9ub2RlLmMKKysrIGIvbmV0L3RpcGMvbm9kZS5jCkBAIC02NDgsNyArNjQ4LDcgQEAKIAkJcmV0dXJuIHRpcGNfY2ZnX3JlcGx5X2Vycm9yX3N0cmluZyhUSVBDX0NGR19JTlZBTElEX1ZBTFVFCiAJCQkJCQkgICAiIChuZXR3b3JrIGFkZHJlc3MpIik7CiAKLSAgICAgICAgaWYgKCF0aXBjX25vZGVzKQorICAgICAgICBpZiAodGlwY19tb2RlICE9IFRJUENfTkVUX01PREUpCiAgICAgICAgICAgICAgICAgcmV0dXJuIHRpcGNfY2ZnX3JlcGx5X25vbmUoKTsKIAkKIAkvKiBHZXQgc3BhY2UgZm9yIGFsbCB1bmljYXN0IGxpbmtzICsgbXVsdGljYXN0IGxpbmsgKi8KZGlmZiAtLWdpdCBhL25ldC90aXBjL3BvcnQuYyBiL25ldC90aXBjL3BvcnQuYwppbmRleCBiOWM4YzZiLi5iN2YzMTk5IDEwMDY0NAotLS0gYS9uZXQvdGlwYy9wb3J0LmMKKysrIGIvbmV0L3RpcGMvcG9ydC5jCkBAIC01MDUsOSArNTA1LDE0IEBACiAJc3RydWN0IHBvcnQgKnBfcHRyID0gdGlwY19wb3J0X2xvY2socmVmKTsKIAlzdHJ1Y3Qgc2tfYnVmZiAqYnVmID0gTlVMTDsKIAotCWlmICghcF9wdHIgfHwgIXBfcHRyLT5wdWJsLmNvbm5lY3RlZCkKKwlpZiAoIXBfcHRyKQogCQlyZXR1cm47CiAKKwlpZiAoIXBfcHRyLT5wdWJsLmNvbm5lY3RlZCkgeworCQl0aXBjX3BvcnRfdW5sb2NrKHBfcHRyKTsKKwkJcmV0dXJuOworCX0KKwogCS8qIExhc3QgcHJvYmUgYW5zd2VyZWQgPyAqLwogCWlmIChwX3B0ci0+cHJvYmluZ19zdGF0ZSA9PSBQUk9CSU5HKSB7CiAJCWJ1ZiA9IHBvcnRfYnVpbGRfc2VsZl9hYm9ydF9tc2cocF9wdHIsIFRJUENfRVJSX05PX1BPUlQpOwpAQCAtMTEzMSwxMSArMTEzNiwxMiBAQAogCWludCByZXMgPSAtRUlOVkFMOwogCiAJcF9wdHIgPSB0aXBjX3BvcnRfbG9jayhyZWYpOworCWlmICghcF9wdHIpCisJCXJldHVybiAtRUlOVkFMOworCiAJZGJnKCJ0aXBjX3B1YmwgJXUsIHBfcHRyID0gJXgsIGNvbm4gPSAleCwgc2NvcGUgPSAleCwgIgogCSAgICAibG93ZXIgPSAldSwgdXBwZXIgPSAldVxuIiwKIAkgICAgcmVmLCBwX3B0ciwgcF9wdHItPnB1YmwuY29ubmVjdGVkLCBzY29wZSwgc2VxLT5sb3dlciwgc2VxLT51cHBlcik7Ci0JaWYgKCFwX3B0cikKLQkJcmV0dXJuIC1FSU5WQUw7CiAJaWYgKHBfcHRyLT5wdWJsLmNvbm5lY3RlZCkKIAkJZ290byBleGl0OwogCWlmIChzZXEtPmxvd2VyID4gc2VxLT51cHBlcikKZGlmZiAtLWdpdCBhL25ldC90aXBjL3NvY2tldC5jIGIvbmV0L3RpcGMvc29ja2V0LmMKaW5kZXggYWNmYjg1Mi4uMmE2YTVhNiAxMDA2NDQKLS0tIGEvbmV0L3RpcGMvc29ja2V0LmMKKysrIGIvbmV0L3RpcGMvc29ja2V0LmMKQEAgLTIsNyArMiw3IEBACiAgKiBuZXQvdGlwYy9zb2NrZXQuYzogVElQQyBzb2NrZXQgQVBJCiAgKiAKICAqIENvcHlyaWdodCAoYykgMjAwMS0yMDA2LCBFcmljc3NvbiBBQgotICogQ29weXJpZ2h0IChjKSAyMDA0LTIwMDUsIFdpbmQgUml2ZXIgU3lzdGVtcworICogQ29weXJpZ2h0IChjKSAyMDA0LTIwMDYsIFdpbmQgUml2ZXIgU3lzdGVtcwogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKQEAgLTYyOSw2ICs2MjksOSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC1FTk9UQ09OTjsKICAgICAgICAgfQogCisJaWYgKHVubGlrZWx5KG0tPm1zZ19uYW1lKSkKKwkJcmV0dXJuIC1FSVNDT05OOworCiAJLyogCiAJICogU2VuZCBlYWNoIGlvdmVjIGVudHJ5IHVzaW5nIG9uZSBvciBtb3JlIG1lc3NhZ2VzCiAJICoKQEAgLTY0MSw2ICs2NDQsOCBAQAogCWN1cnJfaW92bGVuID0gbS0+bXNnX2lvdmxlbjsKIAlteV9tc2cubXNnX2lvdiA9ICZteV9pb3Y7CiAJbXlfbXNnLm1zZ19pb3ZsZW4gPSAxOworCW15X21zZy5tc2dfZmxhZ3MgPSBtLT5tc2dfZmxhZ3M7CisJbXlfbXNnLm1zZ19uYW1lID0gTlVMTDsKIAlieXRlc19zZW50ID0gMDsKIAogCXdoaWxlIChjdXJyX2lvdmxlbi0tKSB7CkBAIC0xMjAzLDcgKzEyMDgsOCBAQAogCWF0b21pY19pbmMoJnRpcGNfcXVldWVfc2l6ZSk7CiAJc2tiX3F1ZXVlX3RhaWwoJnNvY2stPnNrLT5za19yZWNlaXZlX3F1ZXVlLCBidWYpOwogCi0gICAgICAgIHdha2VfdXBfaW50ZXJydXB0aWJsZShzb2NrLT5zay0+c2tfc2xlZXApOworCWlmICh3YWl0cXVldWVfYWN0aXZlKHNvY2stPnNrLT5za19zbGVlcCkpCisJCXdha2VfdXBfaW50ZXJydXB0aWJsZShzb2NrLT5zay0+c2tfc2xlZXApOwogCXJldHVybiBUSVBDX09LOwogfQogCkBAIC0xMjE4LDcgKzEyMjQsOCBAQAogewogCXN0cnVjdCB0aXBjX3NvY2sgKnRzb2NrID0gKHN0cnVjdCB0aXBjX3NvY2sgKil0cG9ydC0+dXNyX2hhbmRsZTsKIAotICAgICAgICB3YWtlX3VwX2ludGVycnVwdGlibGUodHNvY2stPnNrLnNrX3NsZWVwKTsKKwlpZiAod2FpdHF1ZXVlX2FjdGl2ZSh0c29jay0+c2suc2tfc2xlZXApKQorCQl3YWtlX3VwX2ludGVycnVwdGlibGUodHNvY2stPnNrLnNrX3NsZWVwKTsKIH0KIAogLyoqCmRpZmYgLS1naXQgYS9uZXQvdGlwYy9zdWJzY3IuYyBiL25ldC90aXBjL3N1YnNjci5jCmluZGV4IGM1MTYwMGIuLjdhOTE4ZjEgMTAwNjQ0Ci0tLSBhL25ldC90aXBjL3N1YnNjci5jCisrKyBiL25ldC90aXBjL3N1YnNjci5jCkBAIC0xNTUsNyArMTU1LDcgQEAKIAkgICAgc3ViLT5zZXEudXBwZXIsIGZvdW5kX2xvd2VyLCBmb3VuZF91cHBlcik7CiAJaWYgKCF0aXBjX3N1YnNjcl9vdmVybGFwKHN1YiwgZm91bmRfbG93ZXIsIGZvdW5kX3VwcGVyKSkKIAkJcmV0dXJuOwotCWlmICghbXVzdCAmJiAoc3ViLT5maWx0ZXIgIT0gVElQQ19TVUJfUE9SVFMpKQorCWlmICghbXVzdCAmJiAhKHN1Yi0+ZmlsdGVyICYgVElQQ19TVUJfUE9SVFMpKQogCQlyZXR1cm47CiAJc3Vic2NyX3NlbmRfZXZlbnQoc3ViLCBmb3VuZF9sb3dlciwgZm91bmRfdXBwZXIsIGV2ZW50LCBwb3J0X3JlZiwgbm9kZSk7CiB9CkBAIC0xNzYsNiArMTc2LDEzIEBACiAJaWYgKHN1YnNjcmliZXIgPT0gTlVMTCkKIAkJcmV0dXJuOwogCisJLyogVmFsaWRhdGUgdGltZW91dCAoaW4gY2FzZSBzdWJzY3JpcHRpb24gaXMgYmVpbmcgY2FuY2VsbGVkKSAqLworCisJaWYgKHN1Yi0+dGltZW91dCA9PSBUSVBDX1dBSVRfRk9SRVZFUikgeworCQl0aXBjX3JlZl91bmxvY2soc3Vic2NyaWJlcl9yZWYpOworCQlyZXR1cm47CisJfQorCiAJLyogVW5saW5rIHN1YnNjcmlwdGlvbiBmcm9tIG5hbWUgdGFibGUgKi8KIAogCXRpcGNfbmFtZXRibF91bnN1YnNjcmliZShzdWIpOwpAQCAtMTk5LDYgKzIwNiwyMCBAQAogfQogCiAvKioKKyAqIHN1YnNjcl9kZWwgLSBkZWxldGUgYSBzdWJzY3JpcHRpb24gd2l0aGluIGEgc3Vic2NyaXB0aW9uIGxpc3QKKyAqCisgKiBDYWxsZWQgd2l0aCBzdWJzY3JpYmVyIGxvY2tlZC4KKyAqLworCitzdGF0aWMgdm9pZCBzdWJzY3JfZGVsKHN0cnVjdCBzdWJzY3JpcHRpb24gKnN1YikKK3sKKwl0aXBjX25hbWV0YmxfdW5zdWJzY3JpYmUoc3ViKTsKKwlsaXN0X2RlbCgmc3ViLT5zdWJzY3JpcHRpb25fbGlzdCk7CisJa2ZyZWUoc3ViKTsKKwlhdG9taWNfZGVjKCZ0b3BzcnYuc3Vic2NyaXB0aW9uX2NvdW50KTsKK30KKworLyoqCiAgKiBzdWJzY3JfdGVybWluYXRlIC0gdGVybWluYXRlIGNvbW11bmljYXRpb24gd2l0aCBhIHN1YnNjcmliZXIKICAqIAogICogQ2FsbGVkIHdpdGggc3Vic2NyaWJlciBsb2NrZWQuICBSb3V0aW5lIG11c3QgdGVtcG9yYXJpbHkgcmVsZWFzZSB0aGlzIGxvY2sKQEAgLTIyNywxMiArMjQ4LDkgQEAKIAkJCWtfY2FuY2VsX3RpbWVyKCZzdWItPnRpbWVyKTsKIAkJCWtfdGVybV90aW1lcigmc3ViLT50aW1lcik7CiAJCX0KLQkJdGlwY19uYW1ldGJsX3Vuc3Vic2NyaWJlKHN1Yik7Ci0JCWxpc3RfZGVsKCZzdWItPnN1YnNjcmlwdGlvbl9saXN0KTsKLQkJZGJnKCJUZXJtOiBSZW1vdmVkIHN1YiAldSwldSwldSBmcm9tIHN1YnNjcmliZXIgJXggbGlzdFxuIiwKKwkJZGJnKCJUZXJtOiBSZW1vdmluZyBzdWIgJXUsJXUsJXUgZnJvbSBzdWJzY3JpYmVyICV4IGxpc3RcbiIsCiAJCSAgICBzdWItPnNlcS50eXBlLCBzdWItPnNlcS5sb3dlciwgc3ViLT5zZXEudXBwZXIsIHN1YnNjcmliZXIpOwotCQlrZnJlZShzdWIpOwotCQlhdG9taWNfZGVjKCZ0b3BzcnYuc3Vic2NyaXB0aW9uX2NvdW50KTsKKwkJc3Vic2NyX2RlbChzdWIpOwogCX0KIAogCS8qIFNldmVyIGNvbm5lY3Rpb24gdG8gc3Vic2NyaWJlciAqLwpAQCAtMjUzLDYgKzI3MSw0OSBAQAogfQogCiAvKioKKyAqIHN1YnNjcl9jYW5jZWwgLSBoYW5kbGUgc3Vic2NyaXB0aW9uIGNhbmNlbGxhdGlvbiByZXF1ZXN0CisgKgorICogQ2FsbGVkIHdpdGggc3Vic2NyaWJlciBsb2NrZWQuICBSb3V0aW5lIG11c3QgdGVtcG9yYXJpbHkgcmVsZWFzZSB0aGlzIGxvY2sKKyAqIHRvIGVuYWJsZSB0aGUgc3Vic2NyaXB0aW9uIHRpbWVvdXQgcm91dGluZSB0byBmaW5pc2ggd2l0aG91dCBkZWFkbG9ja2luZzsKKyAqIHRoZSBsb2NrIGlzIHRoZW4gcmVjbGFpbWVkIHRvIGFsbG93IGNhbGxlciB0byByZWxlYXNlIGl0IHVwb24gcmV0dXJuLgorICoKKyAqIE5vdGUgdGhhdCBmaWVsZHMgb2YgJ3MnIHVzZSBzdWJzY3JpYmVyJ3MgZW5kaWFubmVzcyEKKyAqLworCitzdGF0aWMgdm9pZCBzdWJzY3JfY2FuY2VsKHN0cnVjdCB0aXBjX3N1YnNjciAqcywKKwkJCSAgc3RydWN0IHN1YnNjcmliZXIgKnN1YnNjcmliZXIpCit7CisJc3RydWN0IHN1YnNjcmlwdGlvbiAqc3ViOworCXN0cnVjdCBzdWJzY3JpcHRpb24gKnN1Yl90ZW1wOworCWludCBmb3VuZCA9IDA7CisKKwkvKiBGaW5kIGZpcnN0IG1hdGNoaW5nIHN1YnNjcmlwdGlvbiwgZXhpdCBpZiBub3QgZm91bmQgKi8KKworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShzdWIsIHN1Yl90ZW1wLCAmc3Vic2NyaWJlci0+c3Vic2NyaXB0aW9uX2xpc3QsCisJCQkJIHN1YnNjcmlwdGlvbl9saXN0KSB7CisJCWlmICghbWVtY21wKHMsICZzdWItPmV2dC5zLCBzaXplb2Yoc3RydWN0IHRpcGNfc3Vic2NyKSkpIHsKKwkJCWZvdW5kID0gMTsKKwkJCWJyZWFrOworCQl9CisJfQorCWlmICghZm91bmQpCisJCXJldHVybjsKKworCS8qIENhbmNlbCBzdWJzY3JpcHRpb24gdGltZXIgKGlmIHVzZWQpLCB0aGVuIGRlbGV0ZSBzdWJzY3JpcHRpb24gKi8KKworCWlmIChzdWItPnRpbWVvdXQgIT0gVElQQ19XQUlUX0ZPUkVWRVIpIHsKKwkJc3ViLT50aW1lb3V0ID0gVElQQ19XQUlUX0ZPUkVWRVI7CisJCXNwaW5fdW5sb2NrX2JoKHN1YnNjcmliZXItPmxvY2spOworCQlrX2NhbmNlbF90aW1lcigmc3ViLT50aW1lcik7CisJCWtfdGVybV90aW1lcigmc3ViLT50aW1lcik7CisJCXNwaW5fbG9ja19iaChzdWJzY3JpYmVyLT5sb2NrKTsKKwl9CisJZGJnKCJDYW5jZWw6IHJlbW92aW5nIHN1YiAldSwldSwldSBmcm9tIHN1YnNjcmliZXIgJXggbGlzdFxuIiwKKwkgICAgc3ViLT5zZXEudHlwZSwgc3ViLT5zZXEubG93ZXIsIHN1Yi0+c2VxLnVwcGVyLCBzdWJzY3JpYmVyKTsKKwlzdWJzY3JfZGVsKHN1Yik7Cit9CisKKy8qKgogICogc3Vic2NyX3N1YnNjcmliZSAtIGNyZWF0ZSBzdWJzY3JpcHRpb24gZm9yIHN1YnNjcmliZXIKICAqIAogICogQ2FsbGVkIHdpdGggc3Vic2NyaWJlciBsb2NrZWQKQEAgLTI2Myw2ICszMjQsMjEgQEAKIHsKIAlzdHJ1Y3Qgc3Vic2NyaXB0aW9uICpzdWI7CiAKKwkvKiBEZXRlcm1pbmUvdXBkYXRlIHN1YnNjcmliZXIncyBlbmRpYW5uZXNzICovCisKKwlpZiAocy0+ZmlsdGVyICYgKFRJUENfU1VCX1BPUlRTIHwgVElQQ19TVUJfU0VSVklDRSkpCisJCXN1YnNjcmliZXItPnN3YXAgPSAwOworCWVsc2UKKwkJc3Vic2NyaWJlci0+c3dhcCA9IDE7CisKKwkvKiBEZXRlY3QgJiBwcm9jZXNzIGEgc3Vic2NyaXB0aW9uIGNhbmNlbGxhdGlvbiByZXF1ZXN0ICovCisKKwlpZiAocy0+ZmlsdGVyICYgaHRvaGwoVElQQ19TVUJfQ0FOQ0VMLCBzdWJzY3JpYmVyLT5zd2FwKSkgeworCQlzLT5maWx0ZXIgJj0gfmh0b2hsKFRJUENfU1VCX0NBTkNFTCwgc3Vic2NyaWJlci0+c3dhcCk7CisJCXN1YnNjcl9jYW5jZWwocywgc3Vic2NyaWJlcik7CisJCXJldHVybjsKKwl9CisKIAkvKiBSZWZ1c2Ugc3Vic2NyaXB0aW9uIGlmIGdsb2JhbCBsaW1pdCBleGNlZWRlZCAqLwogCiAJaWYgKGF0b21pY19yZWFkKCZ0b3BzcnYuc3Vic2NyaXB0aW9uX2NvdW50KSA+PSB0aXBjX21heF9zdWJzY3JpcHRpb25zKSB7CkBAIC0yODEsMTMgKzM1Nyw2IEBACiAJCXJldHVybjsKIAl9CiAKLQkvKiBEZXRlcm1pbmUvdXBkYXRlIHN1YnNjcmliZXIncyBlbmRpYW5uZXNzICovCi0KLQlpZiAoKHMtPmZpbHRlciA9PSBUSVBDX1NVQl9QT1JUUykgfHwgKHMtPmZpbHRlciA9PSBUSVBDX1NVQl9TRVJWSUNFKSkKLQkJc3Vic2NyaWJlci0+c3dhcCA9IDA7Ci0JZWxzZQotCQlzdWJzY3JpYmVyLT5zd2FwID0gMTsKLQogCS8qIEluaXRpYWxpemUgc3Vic2NyaXB0aW9uIG9iamVjdCAqLwogCiAJbWVtc2V0KHN1YiwgMCwgc2l6ZW9mKCpzdWIpKTsKQEAgLTI5Niw4ICszNjUsOCBAQAogCXN1Yi0+c2VxLnVwcGVyID0gaHRvaGwocy0+c2VxLnVwcGVyLCBzdWJzY3JpYmVyLT5zd2FwKTsKIAlzdWItPnRpbWVvdXQgPSBodG9obChzLT50aW1lb3V0LCBzdWJzY3JpYmVyLT5zd2FwKTsKIAlzdWItPmZpbHRlciA9IGh0b2hsKHMtPmZpbHRlciwgc3Vic2NyaWJlci0+c3dhcCk7Ci0JaWYgKCgoKHN1Yi0+ZmlsdGVyICE9IFRJUENfU1VCX1BPUlRTKSAKLQkgICAgICAmJiAoc3ViLT5maWx0ZXIgIT0gVElQQ19TVUJfU0VSVklDRSkpKQorCWlmICgoIShzdWItPmZpbHRlciAmIFRJUENfU1VCX1BPUlRTKQorCSAgICAgPT0gIShzdWItPmZpbHRlciAmIFRJUENfU1VCX1NFUlZJQ0UpKQogCSAgICB8fCAoc3ViLT5zZXEubG93ZXIgPiBzdWItPnNlcS51cHBlcikpIHsKIAkJd2FybigiU3Vic2NyaXB0aW9uIHJlamVjdGVkLCBpbGxlZ2FsIHJlcXVlc3RcbiIpOwogCQlrZnJlZShzdWIpOwpkaWZmIC0tZ2l0IGEvbmV0L3hmcm0veGZybV9wb2xpY3kuYyBiL25ldC94ZnJtL3hmcm1fcG9saWN5LmMKaW5kZXggMmE3ODYxNi4uNzczNmIyMyAxMDA2NDQKLS0tIGEvbmV0L3hmcm0veGZybV9wb2xpY3kuYworKysgYi9uZXQveGZybS94ZnJtX3BvbGljeS5jCkBAIC04ODMsMzAgKzg4MywzMiBAQAogfQogRVhQT1JUX1NZTUJPTCh4ZnJtX3BvbGljeV93YWxrKTsKIAotLyogRmluZCBwb2xpY3kgdG8gYXBwbHkgdG8gdGhpcyBmbG93LiAqLwotCisvKgorICogRmluZCBwb2xpY3kgdG8gYXBwbHkgdG8gdGhpcyBmbG93LgorICoKKyAqIFJldHVybnMgMCBpZiBwb2xpY3kgZm91bmQsIGVsc2UgYW4gLWVycm5vLgorICovCiBzdGF0aWMgaW50IHhmcm1fcG9saWN5X21hdGNoKHN0cnVjdCB4ZnJtX3BvbGljeSAqcG9sLCBzdHJ1Y3QgZmxvd2kgKmZsLAogCQkJICAgICB1OCB0eXBlLCB1MTYgZmFtaWx5LCBpbnQgZGlyKQogewogCXN0cnVjdCB4ZnJtX3NlbGVjdG9yICpzZWwgPSAmcG9sLT5zZWxlY3RvcjsKLQlpbnQgbWF0Y2g7CisJaW50IG1hdGNoLCByZXQgPSAtRVNSQ0g7CiAKIAlpZiAocG9sLT5mYW1pbHkgIT0gZmFtaWx5IHx8CiAJICAgIHBvbC0+dHlwZSAhPSB0eXBlKQotCQlyZXR1cm4gMDsKKwkJcmV0dXJuIHJldDsKIAogCW1hdGNoID0geGZybV9zZWxlY3Rvcl9tYXRjaChzZWwsIGZsLCBmYW1pbHkpOwotCWlmIChtYXRjaCkgewotCQlpZiAoIXNlY3VyaXR5X3hmcm1fcG9saWN5X2xvb2t1cChwb2wsIGZsLT5zZWNpZCwgZGlyKSkKLQkJCXJldHVybiAxOwotCX0KKwlpZiAobWF0Y2gpCisJCXJldCA9IHNlY3VyaXR5X3hmcm1fcG9saWN5X2xvb2t1cChwb2wsIGZsLT5zZWNpZCwgZGlyKTsKIAotCXJldHVybiAwOworCXJldHVybiByZXQ7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgeGZybV9wb2xpY3kgKnhmcm1fcG9saWN5X2xvb2t1cF9ieXR5cGUodTggdHlwZSwgc3RydWN0IGZsb3dpICpmbCwKIAkJCQkJCSAgICAgdTE2IGZhbWlseSwgdTggZGlyKQogeworCWludCBlcnI7CiAJc3RydWN0IHhmcm1fcG9saWN5ICpwb2wsICpyZXQ7CiAJeGZybV9hZGRyZXNzX3QgKmRhZGRyLCAqc2FkZHI7CiAJc3RydWN0IGhsaXN0X25vZGUgKmVudHJ5OwpAQCAtOTIyLDcgKzkyNCwxNSBAQAogCWNoYWluID0gcG9saWN5X2hhc2hfZGlyZWN0KGRhZGRyLCBzYWRkciwgZmFtaWx5LCBkaXIpOwogCXJldCA9IE5VTEw7CiAJaGxpc3RfZm9yX2VhY2hfZW50cnkocG9sLCBlbnRyeSwgY2hhaW4sIGJ5ZHN0KSB7Ci0JCWlmICh4ZnJtX3BvbGljeV9tYXRjaChwb2wsIGZsLCB0eXBlLCBmYW1pbHksIGRpcikpIHsKKwkJZXJyID0geGZybV9wb2xpY3lfbWF0Y2gocG9sLCBmbCwgdHlwZSwgZmFtaWx5LCBkaXIpOworCQlpZiAoZXJyKSB7CisJCQlpZiAoZXJyID09IC1FU1JDSCkKKwkJCQljb250aW51ZTsKKwkJCWVsc2UgeworCQkJCXJldCA9IEVSUl9QVFIoZXJyKTsKKwkJCQlnb3RvIGZhaWw7CisJCQl9CisJCX0gZWxzZSB7CiAJCQlyZXQgPSBwb2w7CiAJCQlwcmlvcml0eSA9IHJldC0+cHJpb3JpdHk7CiAJCQlicmVhazsKQEAgLTkzMCwzNiArOTQwLDUzIEBACiAJfQogCWNoYWluID0gJnhmcm1fcG9saWN5X2luZXhhY3RbZGlyXTsKIAlobGlzdF9mb3JfZWFjaF9lbnRyeShwb2wsIGVudHJ5LCBjaGFpbiwgYnlkc3QpIHsKLQkJaWYgKHhmcm1fcG9saWN5X21hdGNoKHBvbCwgZmwsIHR5cGUsIGZhbWlseSwgZGlyKSAmJgotCQkgICAgcG9sLT5wcmlvcml0eSA8IHByaW9yaXR5KSB7CisJCWVyciA9IHhmcm1fcG9saWN5X21hdGNoKHBvbCwgZmwsIHR5cGUsIGZhbWlseSwgZGlyKTsKKwkJaWYgKGVycikgeworCQkJaWYgKGVyciA9PSAtRVNSQ0gpCisJCQkJY29udGludWU7CisJCQllbHNlIHsKKwkJCQlyZXQgPSBFUlJfUFRSKGVycik7CisJCQkJZ290byBmYWlsOworCQkJfQorCQl9IGVsc2UgaWYgKHBvbC0+cHJpb3JpdHkgPCBwcmlvcml0eSkgewogCQkJcmV0ID0gcG9sOwogCQkJYnJlYWs7CiAJCX0KIAl9CiAJaWYgKHJldCkKIAkJeGZybV9wb2xfaG9sZChyZXQpOworZmFpbDoKIAlyZWFkX3VubG9ja19iaCgmeGZybV9wb2xpY3lfbG9jayk7CiAKIAlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgdm9pZCB4ZnJtX3BvbGljeV9sb29rdXAoc3RydWN0IGZsb3dpICpmbCwgdTE2IGZhbWlseSwgdTggZGlyLAorc3RhdGljIGludCB4ZnJtX3BvbGljeV9sb29rdXAoc3RydWN0IGZsb3dpICpmbCwgdTE2IGZhbWlseSwgdTggZGlyLAogCQkJICAgICAgIHZvaWQgKipvYmpwLCBhdG9taWNfdCAqKm9ial9yZWZwKQogewogCXN0cnVjdCB4ZnJtX3BvbGljeSAqcG9sOworCWludCBlcnIgPSAwOwogCiAjaWZkZWYgQ09ORklHX1hGUk1fU1VCX1BPTElDWQogCXBvbCA9IHhmcm1fcG9saWN5X2xvb2t1cF9ieXR5cGUoWEZSTV9QT0xJQ1lfVFlQRV9TVUIsIGZsLCBmYW1pbHksIGRpcik7Ci0JaWYgKHBvbCkKKwlpZiAoSVNfRVJSKHBvbCkpIHsKKwkJZXJyID0gUFRSX0VSUihwb2wpOworCQlwb2wgPSBOVUxMOworCX0KKwlpZiAocG9sIHx8IGVycikKIAkJZ290byBlbmQ7CiAjZW5kaWYKIAlwb2wgPSB4ZnJtX3BvbGljeV9sb29rdXBfYnl0eXBlKFhGUk1fUE9MSUNZX1RZUEVfTUFJTiwgZmwsIGZhbWlseSwgZGlyKTsKLQorCWlmIChJU19FUlIocG9sKSkgeworCQllcnIgPSBQVFJfRVJSKHBvbCk7CisJCXBvbCA9IE5VTEw7CisJfQogI2lmZGVmIENPTkZJR19YRlJNX1NVQl9QT0xJQ1kKIGVuZDoKICNlbmRpZgogCWlmICgoKm9ianAgPSAodm9pZCAqKSBwb2wpICE9IE5VTEwpCiAJCSpvYmpfcmVmcCA9ICZwb2wtPnJlZmNudDsKKwlyZXR1cm4gZXJyOwogfQogCiBzdGF0aWMgaW5saW5lIGludCBwb2xpY3lfdG9fZmxvd19kaXIoaW50IGRpcikKQEAgLTk4OSwxMiArMTAxNiwxNiBAQAogCQkJCQkJc2stPnNrX2ZhbWlseSk7CiAgCQlpbnQgZXJyID0gMDsKIAotCQlpZiAobWF0Y2gpCi0JCSAgZXJyID0gc2VjdXJpdHlfeGZybV9wb2xpY3lfbG9va3VwKHBvbCwgZmwtPnNlY2lkLCBwb2xpY3lfdG9fZmxvd19kaXIoZGlyKSk7Ci0KLSAJCWlmIChtYXRjaCAmJiAhZXJyKQotCQkJeGZybV9wb2xfaG9sZChwb2wpOwotCQllbHNlCisJCWlmIChtYXRjaCkgeworCQkJZXJyID0gc2VjdXJpdHlfeGZybV9wb2xpY3lfbG9va3VwKHBvbCwgZmwtPnNlY2lkLAorCQkJCQlwb2xpY3lfdG9fZmxvd19kaXIoZGlyKSk7CisJCQlpZiAoIWVycikKKwkJCQl4ZnJtX3BvbF9ob2xkKHBvbCk7CisJCQllbHNlIGlmIChlcnIgPT0gLUVTUkNIKQorCQkJCXBvbCA9IE5VTEw7CisJCQllbHNlCisJCQkJcG9sID0gRVJSX1BUUihlcnIpOworCQl9IGVsc2UKIAkJCXBvbCA9IE5VTEw7CiAJfQogCXJlYWRfdW5sb2NrX2JoKCZ4ZnJtX3BvbGljeV9sb2NrKTsKQEAgLTEyODYsOCArMTMxNywxMSBAQAogCXBvbF9kZWFkID0gMDsKIAl4ZnJtX25yID0gMDsKIAotCWlmIChzayAmJiBzay0+c2tfcG9saWN5WzFdKQorCWlmIChzayAmJiBzay0+c2tfcG9saWN5WzFdKSB7CiAJCXBvbGljeSA9IHhmcm1fc2tfcG9saWN5X2xvb2t1cChzaywgWEZSTV9QT0xJQ1lfT1VULCBmbCk7CisJCWlmIChJU19FUlIocG9saWN5KSkKKwkJCXJldHVybiBQVFJfRVJSKHBvbGljeSk7CisJfQogCiAJaWYgKCFwb2xpY3kpIHsKIAkJLyogVG8gYWNjZWxlcmF0ZSBhIGJpdC4uLiAgKi8KQEAgLTEyOTcsNiArMTMzMSw4IEBACiAKIAkJcG9saWN5ID0gZmxvd19jYWNoZV9sb29rdXAoZmwsIGRzdF9vcmlnLT5vcHMtPmZhbWlseSwKIAkJCQkJICAgZGlyLCB4ZnJtX3BvbGljeV9sb29rdXApOworCQlpZiAoSVNfRVJSKHBvbGljeSkpCisJCQlyZXR1cm4gUFRSX0VSUihwb2xpY3kpOwogCX0KIAogCWlmICghcG9saWN5KQpAQCAtMTM0Myw2ICsxMzc5LDEwIEBACiAJCQkJCQkJICAgIGZsLCBmYW1pbHksCiAJCQkJCQkJICAgIFhGUk1fUE9MSUNZX09VVCk7CiAJCQlpZiAocG9sc1sxXSkgeworCQkJCWlmIChJU19FUlIocG9sc1sxXSkpIHsKKwkJCQkJZXJyID0gUFRSX0VSUihwb2xzWzFdKTsKKwkJCQkJZ290byBlcnJvcjsKKwkJCQl9CiAJCQkJaWYgKHBvbHNbMV0tPmFjdGlvbiA9PSBYRlJNX1BPTElDWV9CTE9DSykgewogCQkJCQllcnIgPSAtRVBFUk07CiAJCQkJCWdvdG8gZXJyb3I7CkBAIC0xNTc0LDEzICsxNjE0LDE5IEBACiAJfQogCiAJcG9sID0gTlVMTDsKLQlpZiAoc2sgJiYgc2stPnNrX3BvbGljeVtkaXJdKQorCWlmIChzayAmJiBzay0+c2tfcG9saWN5W2Rpcl0pIHsKIAkJcG9sID0geGZybV9za19wb2xpY3lfbG9va3VwKHNrLCBkaXIsICZmbCk7CisJCWlmIChJU19FUlIocG9sKSkKKwkJCXJldHVybiAwOworCX0KIAogCWlmICghcG9sKQogCQlwb2wgPSBmbG93X2NhY2hlX2xvb2t1cCgmZmwsIGZhbWlseSwgZmxfZGlyLAogCQkJCQl4ZnJtX3BvbGljeV9sb29rdXApOwogCisJaWYgKElTX0VSUihwb2wpKQorCQlyZXR1cm4gMDsKKwogCWlmICghcG9sKSB7CiAJCWlmIChza2ItPnNwICYmIHNlY3BhdGhfaGFzX25vbnRyYW5zcG9ydChza2ItPnNwLCAwLCAmeGVycl9pZHgpKSB7CiAJCQl4ZnJtX3NlY3BhdGhfcmVqZWN0KHhlcnJfaWR4LCBza2IsICZmbCk7CkBAIC0xNTk5LDYgKzE2NDUsOCBAQAogCQkJCQkJICAgICZmbCwgZmFtaWx5LAogCQkJCQkJICAgIFhGUk1fUE9MSUNZX0lOKTsKIAkJaWYgKHBvbHNbMV0pIHsKKwkJCWlmIChJU19FUlIocG9sc1sxXSkpCisJCQkJcmV0dXJuIDA7CiAJCQlwb2xzWzFdLT5jdXJsZnQudXNlX3RpbWUgPSAodW5zaWduZWQgbG9uZyl4dGltZS50dl9zZWM7CiAJCQlucG9scyArKzsKIAkJfQpAQCAtMTcwNiw3ICsxNzU0LDcgQEAKIAogc3RhdGljIGludCBzdGFsZV9idW5kbGUoc3RydWN0IGRzdF9lbnRyeSAqZHN0KQogewotCXJldHVybiAheGZybV9idW5kbGVfb2soKHN0cnVjdCB4ZnJtX2RzdCAqKWRzdCwgTlVMTCwgQUZfVU5TUEVDLCAwKTsKKwlyZXR1cm4gIXhmcm1fYnVuZGxlX29rKE5VTEwsIChzdHJ1Y3QgeGZybV9kc3QgKilkc3QsIE5VTEwsIEFGX1VOU1BFQywgMCk7CiB9CiAKIHZvaWQgeGZybV9kc3RfaWZkb3duKHN0cnVjdCBkc3RfZW50cnkgKmRzdCwgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKQEAgLTE4MjgsNyArMTg3Niw4IEBACiAgKiBzdGlsbCB2YWxpZC4KICAqLwogCi1pbnQgeGZybV9idW5kbGVfb2soc3RydWN0IHhmcm1fZHN0ICpmaXJzdCwgc3RydWN0IGZsb3dpICpmbCwgaW50IGZhbWlseSwgaW50IHN0cmljdCkKK2ludCB4ZnJtX2J1bmRsZV9vayhzdHJ1Y3QgeGZybV9wb2xpY3kgKnBvbCwgc3RydWN0IHhmcm1fZHN0ICpmaXJzdCwKKwkJc3RydWN0IGZsb3dpICpmbCwgaW50IGZhbWlseSwgaW50IHN0cmljdCkKIHsKIAlzdHJ1Y3QgZHN0X2VudHJ5ICpkc3QgPSAmZmlyc3QtPnUuZHN0OwogCXN0cnVjdCB4ZnJtX2RzdCAqbGFzdDsKQEAgLTE4NDUsNyArMTg5NCw3IEBACiAKIAkJaWYgKGZsICYmICF4ZnJtX3NlbGVjdG9yX21hdGNoKCZkc3QtPnhmcm0tPnNlbCwgZmwsIGZhbWlseSkpCiAJCQlyZXR1cm4gMDsKLQkJaWYgKGZsICYmICFzZWN1cml0eV94ZnJtX2Zsb3dfc3RhdGVfbWF0Y2goZmwsIGRzdC0+eGZybSkpCisJCWlmIChmbCAmJiAhc2VjdXJpdHlfeGZybV9mbG93X3N0YXRlX21hdGNoKGZsLCBkc3QtPnhmcm0sIHBvbCkpCiAJCQlyZXR1cm4gMDsKIAkJaWYgKGRzdC0+eGZybS0+a20uc3RhdGUgIT0gWEZSTV9TVEFURV9WQUxJRCkKIAkJCXJldHVybiAwOwpkaWZmIC0tZ2l0IGEvbmV0L3hmcm0veGZybV9zdGF0ZS5jIGIvbmV0L3hmcm0veGZybV9zdGF0ZS5jCmluZGV4IDM5YjhiZjMuLjg5OWRlOWUgMTAwNjQ0Ci0tLSBhL25ldC94ZnJtL3hmcm1fc3RhdGUuYworKysgYi9uZXQveGZybS94ZnJtX3N0YXRlLmMKQEAgLTUwNSw2ICs1MDUsMTQgQEAKIAkJCQkJCSAgeC0+aWQucHJvdG8sIGZhbWlseSk7CiB9CiAKK3N0YXRpYyB2b2lkIHhmcm1faGFzaF9ncm93X2NoZWNrKGludCBoYXZlX2hhc2hfY29sbGlzaW9uKQoreworCWlmIChoYXZlX2hhc2hfY29sbGlzaW9uICYmCisJICAgICh4ZnJtX3N0YXRlX2htYXNrICsgMSkgPCB4ZnJtX3N0YXRlX2hhc2htYXggJiYKKwkgICAgeGZybV9zdGF0ZV9udW0gPiB4ZnJtX3N0YXRlX2htYXNrKQorCQlzY2hlZHVsZV93b3JrKCZ4ZnJtX2hhc2hfd29yayk7Cit9CisKIHN0cnVjdCB4ZnJtX3N0YXRlICoKIHhmcm1fc3RhdGVfZmluZCh4ZnJtX2FkZHJlc3NfdCAqZGFkZHIsIHhmcm1fYWRkcmVzc190ICpzYWRkciwgCiAJCXN0cnVjdCBmbG93aSAqZmwsIHN0cnVjdCB4ZnJtX3RtcGwgKnRtcGwsCkBAIC01OTgsNiArNjA2LDggQEAKIAkJCXgtPmxmdC5oYXJkX2FkZF9leHBpcmVzX3NlY29uZHMgPSBYRlJNX0FDUV9FWFBJUkVTOwogCQkJeC0+dGltZXIuZXhwaXJlcyA9IGppZmZpZXMgKyBYRlJNX0FDUV9FWFBJUkVTKkhaOwogCQkJYWRkX3RpbWVyKCZ4LT50aW1lcik7CisJCQl4ZnJtX3N0YXRlX251bSsrOworCQkJeGZybV9oYXNoX2dyb3dfY2hlY2soeC0+Ynlkc3QubmV4dCAhPSBOVUxMKTsKIAkJfSBlbHNlIHsKIAkJCXgtPmttLnN0YXRlID0gWEZSTV9TVEFURV9ERUFEOwogCQkJeGZybV9zdGF0ZV9wdXQoeCk7CkBAIC02NDIsMTAgKzY1Miw3IEBACiAKIAl4ZnJtX3N0YXRlX251bSsrOwogCi0JaWYgKHgtPmJ5ZHN0Lm5leHQgIT0gTlVMTCAmJgotCSAgICAoeGZybV9zdGF0ZV9obWFzayArIDEpIDwgeGZybV9zdGF0ZV9oYXNobWF4ICYmCi0JICAgIHhmcm1fc3RhdGVfbnVtID4geGZybV9zdGF0ZV9obWFzaykKLQkJc2NoZWR1bGVfd29yaygmeGZybV9oYXNoX3dvcmspOworCXhmcm1faGFzaF9ncm93X2NoZWNrKHgtPmJ5ZHN0Lm5leHQgIT0gTlVMTCk7CiB9CiAKIC8qIHhmcm1fc3RhdGVfbG9jayBpcyBoZWxkICovCkBAIC03NTMsNiArNzYwLDEwIEBACiAJCWggPSB4ZnJtX3NyY19oYXNoKGRhZGRyLCBzYWRkciwgZmFtaWx5KTsKIAkJaGxpc3RfYWRkX2hlYWQoJngtPmJ5c3JjLCB4ZnJtX3N0YXRlX2J5c3JjK2gpOwogCQl3YWtlX3VwKCZrbV93YWl0cSk7CisKKwkJeGZybV9zdGF0ZV9udW0rKzsKKworCQl4ZnJtX2hhc2hfZ3Jvd19jaGVjayh4LT5ieWRzdC5uZXh0ICE9IE5VTEwpOwogCX0KIAogCXJldHVybiB4OwpkaWZmIC0tZ2l0IGEvbmV0L3hmcm0veGZybV91c2VyLmMgYi9uZXQveGZybS94ZnJtX3VzZXIuYwppbmRleCBkNTRiM2E3Li5jNGNkZTU3IDEwMDY0NAotLS0gYS9uZXQveGZybS94ZnJtX3VzZXIuYworKysgYi9uZXQveGZybS94ZnJtX3VzZXIuYwpAQCAtMzIzLDcgKzMyMyw3IEBACiAJeC0+cHJvcHMucmVwbGF5X3dpbmRvdyA9IHAtPnJlcGxheV93aW5kb3c7CiAJeC0+cHJvcHMucmVxaWQgPSBwLT5yZXFpZDsKIAl4LT5wcm9wcy5mYW1pbHkgPSBwLT5mYW1pbHk7Ci0JeC0+cHJvcHMuc2FkZHIgPSBwLT5zYWRkcjsKKwltZW1jcHkoJngtPnByb3BzLnNhZGRyLCAmcC0+c2FkZHIsIHNpemVvZih4LT5wcm9wcy5zYWRkcikpOwogCXgtPnByb3BzLmZsYWdzID0gcC0+ZmxhZ3M7CiB9CiAKQEAgLTU0NSw3ICs1NDUsNyBAQAogCW1lbWNweSgmcC0+bGZ0LCAmeC0+bGZ0LCBzaXplb2YocC0+bGZ0KSk7CiAJbWVtY3B5KCZwLT5jdXJsZnQsICZ4LT5jdXJsZnQsIHNpemVvZihwLT5jdXJsZnQpKTsKIAltZW1jcHkoJnAtPnN0YXRzLCAmeC0+c3RhdHMsIHNpemVvZihwLT5zdGF0cykpOwotCXAtPnNhZGRyID0geC0+cHJvcHMuc2FkZHI7CisJbWVtY3B5KCZwLT5zYWRkciwgJngtPnByb3BzLnNhZGRyLCBzaXplb2YocC0+c2FkZHIpKTsKIAlwLT5tb2RlID0geC0+cHJvcHMubW9kZTsKIAlwLT5yZXBsYXlfd2luZG93ID0geC0+cHJvcHMucmVwbGF5X3dpbmRvdzsKIAlwLT5yZXFpZCA9IHgtPnByb3BzLnJlcWlkOwpAQCAtMTkyNyw2ICsxOTI3LDkgQEAKIAlsZW4gPSBSVEFfU1BBQ0Uoc2l6ZW9mKHN0cnVjdCB4ZnJtX3VzZXJfdG1wbCkgKiB4cC0+eGZybV9ucik7CiAJbGVuICs9IE5MTVNHX1NQQUNFKHNpemVvZihzdHJ1Y3QgeGZybV91c2VyX2FjcXVpcmUpKTsKIAlsZW4gKz0gUlRBX1NQQUNFKHhmcm1fdXNlcl9zZWNfY3R4X3NpemUoeHApKTsKKyNpZmRlZiBDT05GSUdfWEZSTV9TVUJfUE9MSUNZCisJbGVuICs9IFJUQV9TUEFDRShzaXplb2Yoc3RydWN0IHhmcm1fdXNlcnBvbGljeV90eXBlKSk7CisjZW5kaWYKIAlza2IgPSBhbGxvY19za2IobGVuLCBHRlBfQVRPTUlDKTsKIAlpZiAoc2tiID09IE5VTEwpCiAJCXJldHVybiAtRU5PTUVNOwpAQCAtMTk5MiwxNSArMTk5NSw2IEBACiAJeHAtPnR5cGUgPSBYRlJNX1BPTElDWV9UWVBFX01BSU47CiAJY29weV90ZW1wbGF0ZXMoeHAsIHV0LCBucik7CiAKLQlpZiAoIXhwLT5zZWN1cml0eSkgewotCQlpbnQgZXJyID0gc2VjdXJpdHlfeGZybV9zb2NrX3BvbGljeV9hbGxvYyh4cCwgc2spOwotCQlpZiAoZXJyKSB7Ci0JCQlrZnJlZSh4cCk7Ci0JCQkqZGlyID0gZXJyOwotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KLQl9Ci0KIAkqZGlyID0gcC0+ZGlyOwogCiAJcmV0dXJuIHhwOwpAQCAtMjA0Myw2ICsyMDM3LDkgQEAKIAlsZW4gPSBSVEFfU1BBQ0Uoc2l6ZW9mKHN0cnVjdCB4ZnJtX3VzZXJfdG1wbCkgKiB4cC0+eGZybV9ucik7CiAJbGVuICs9IE5MTVNHX1NQQUNFKHNpemVvZihzdHJ1Y3QgeGZybV91c2VyX3BvbGV4cGlyZSkpOwogCWxlbiArPSBSVEFfU1BBQ0UoeGZybV91c2VyX3NlY19jdHhfc2l6ZSh4cCkpOworI2lmZGVmIENPTkZJR19YRlJNX1NVQl9QT0xJQ1kKKwlsZW4gKz0gUlRBX1NQQUNFKHNpemVvZihzdHJ1Y3QgeGZybV91c2VycG9saWN5X3R5cGUpKTsKKyNlbmRpZgogCXNrYiA9IGFsbG9jX3NrYihsZW4sIEdGUF9BVE9NSUMpOwogCWlmIChza2IgPT0gTlVMTCkKIAkJcmV0dXJuIC1FTk9NRU07CkBAIC0yMDY5LDYgKzIwNjYsOSBAQAogCQlsZW4gKz0gUlRBX1NQQUNFKGhlYWRsZW4pOwogCQloZWFkbGVuID0gc2l6ZW9mKCppZCk7CiAJfQorI2lmZGVmIENPTkZJR19YRlJNX1NVQl9QT0xJQ1kKKwlsZW4gKz0gUlRBX1NQQUNFKHNpemVvZihzdHJ1Y3QgeGZybV91c2VycG9saWN5X3R5cGUpKTsKKyNlbmRpZgogCWxlbiArPSBOTE1TR19TUEFDRShoZWFkbGVuKTsKIAogCXNrYiA9IGFsbG9jX3NrYihsZW4sIEdGUF9BVE9NSUMpOwpAQCAtMjExNSwxMCArMjExNSwxMiBAQAogCXN0cnVjdCBubG1zZ2hkciAqbmxoOwogCXN0cnVjdCBza19idWZmICpza2I7CiAJdW5zaWduZWQgY2hhciAqYjsKKwlpbnQgbGVuID0gMDsKICNpZmRlZiBDT05GSUdfWEZSTV9TVUJfUE9MSUNZCiAJc3RydWN0IHhmcm1fdXNlcnBvbGljeV90eXBlIHVwdDsKKwlsZW4gKz0gUlRBX1NQQUNFKHNpemVvZihzdHJ1Y3QgeGZybV91c2VycG9saWN5X3R5cGUpKTsKICNlbmRpZgotCWludCBsZW4gPSBOTE1TR19MRU5HVEgoMCk7CisJbGVuICs9IE5MTVNHX0xFTkdUSCgwKTsKIAogCXNrYiA9IGFsbG9jX3NrYihsZW4sIEdGUF9BVE9NSUMpOwogCWlmIChza2IgPT0gTlVMTCkKZGlmZiAtLWdpdCBhL3NjcmlwdHMvTWFrZWZpbGUuaGVhZGVyc2luc3QgYi9zY3JpcHRzL01ha2VmaWxlLmhlYWRlcnNpbnN0CmluZGV4IDZhMDI2ZjYuLjQyNDFlMGQgMTAwNjQ0Ci0tLSBhL3NjcmlwdHMvTWFrZWZpbGUuaGVhZGVyc2luc3QKKysrIGIvc2NyaXB0cy9NYWtlZmlsZS5oZWFkZXJzaW5zdApAQCAtMTY4LDcgKzE2OCw3IEBACiAJJChjYWxsIGNtZCxnZW4pCiAKIGVsc2UKLSQob2JqaGRyLXkpIDoJCSQoSU5TVEFMTF9IRFJfUEFUSCkvJChfZHN0KS8lLmg6ICQoc3JjdHJlZSkvJChvYmopLyUuaCAkKEtCVUlMREZJTEVTKQorJChvYmpoZHIteSkgOgkJJChJTlNUQUxMX0hEUl9QQVRIKS8kKF9kc3QpLyUuaDogJChvYmp0cmVlKS8kKG9iaikvJS5oICQoS0JVSUxERklMRVMpCiAJJChjYWxsIGNtZCxvX2hkcl9pbnN0YWxsKQogCiAkKGhlYWRlci15KSA6CQkkKElOU1RBTExfSERSX1BBVEgpLyQoX2RzdCkvJS5oOiAkKHNyY3RyZWUpLyQob2JqKS8lLmggJChLQlVJTERGSUxFUykKZGlmZiAtLWdpdCBhL3NjcmlwdHMvTWFrZWZpbGUubW9kcG9zdCBiL3NjcmlwdHMvTWFrZWZpbGUubW9kcG9zdAppbmRleCA2YzU0NjliLi42NWUwYTc5IDEwMDY0NAotLS0gYS9zY3JpcHRzL01ha2VmaWxlLm1vZHBvc3QKKysrIGIvc2NyaXB0cy9NYWtlZmlsZS5tb2Rwb3N0CkBAIC00NCw3ICs0NCw3IEBACiBpbmNsdWRlIHNjcmlwdHMvTWFrZWZpbGUubGliCiAKIGtlcm5lbHN5bWZpbGUgOj0gJChvYmp0cmVlKS9Nb2R1bGUuc3ltdmVycwotbW9kdWxlc3ltZmlsZSA6PSAkKEtCVUlMRF9FWFRNT0QpL01vZHVsZS5zeW12ZXJzCittb2R1bGVzeW1maWxlIDo9ICQoZmlyc3R3b3JkICQoS0JVSUxEX0VYVE1PRCkpL01vZHVsZS5zeW12ZXJzCiAKICMgU3RlcCAxKSwgZmluZCBhbGwgbW9kdWxlcyBsaXN0ZWQgaW4gJChNT0RWRVJESVIpLwogX19tb2R1bGVzIDo9ICQoc29ydCAkKHNoZWxsIGdyZXAgLWggJ1wua28nIC9kZXYvbnVsbCAkKHdpbGRjYXJkICQoTU9EVkVSRElSKS8qLm1vZCkpKQpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9iYXNpYy9kb2Nwcm9jLmMgYi9zY3JpcHRzL2Jhc2ljL2RvY3Byb2MuYwppbmRleCA0YWI2Y2JmLi5kNjA3MWNiIDEwMDY0NAotLS0gYS9zY3JpcHRzL2Jhc2ljL2RvY3Byb2MuYworKysgYi9zY3JpcHRzL2Jhc2ljL2RvY3Byb2MuYwpAQCAtMjUwLDcgKzI1MCw3IEBACiB2b2lkIGV4dGZ1bmMoY2hhciAqIGZpbGVuYW1lKSB7IGRvY2Z1bmN0aW9ucyhmaWxlbmFtZSwgRlVOQ1RJT04pOyAgIH0KIAogLyoKLSAqIERvY3VtZW50IHNw5WVjaWZpYyBmdW5jdGlvbihzKSBpbiBhIGZpbGUuCisgKiBEb2N1bWVudCBzcGVjaWZpYyBmdW5jdGlvbihzKSBpbiBhIGZpbGUuCiAgKiBDYWxsIGtlcm5lbC1kb2Mgd2l0aCB0aGUgZm9sbG93aW5nIHBhcmFtZXRlcnM6CiAgKiBrZXJuZWwtZG9jIC1kb2Nib29rIC1mdW5jdGlvbiBmdW5jdGlvbjEgWy1mdW5jdGlvbiBmdW5jdGlvbjJdCiAgKi8KZGlmZiAtLWdpdCBhL3NjcmlwdHMva2NvbmZpZy8uZ2l0aWdub3JlIGIvc2NyaXB0cy9rY29uZmlnLy5naXRpZ25vcmUKaW5kZXggZThhZDFmNi4uYjQ5NTg0YyAxMDA2NDQKLS0tIGEvc2NyaXB0cy9rY29uZmlnLy5naXRpZ25vcmUKKysrIGIvc2NyaXB0cy9rY29uZmlnLy5naXRpZ25vcmUKQEAgLTYsNiArNiw4IEBACiAqLnRhYi5jCiAqLnRhYi5oCiB6Y29uZi5oYXNoLmMKKyoubW9jCitsa2NfZGVmcy5oCiAKICMKICMgY29uZmlndXJhdGlvbiBwcm9ncmFtcwpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9rY29uZmlnL2x4ZGlhbG9nL2RpYWxvZy5oIGIvc2NyaXB0cy9rY29uZmlnL2x4ZGlhbG9nL2RpYWxvZy5oCmluZGV4IDhkZWE0N2YuLmZkNjk1ZTEgMTAwNjQ0Ci0tLSBhL3NjcmlwdHMva2NvbmZpZy9seGRpYWxvZy9kaWFsb2cuaAorKysgYi9zY3JpcHRzL2tjb25maWcvbHhkaWFsb2cvZGlhbG9nLmgKQEAgLTI0LDYgKzI0LDcgQEAKICNpbmNsdWRlIDxjdHlwZS5oPgogI2luY2x1ZGUgPHN0ZGxpYi5oPgogI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN0ZGJvb2wuaD4KIAogI2lmZGVmIF9fc3VuX18KICNkZWZpbmUgQ1VSU19NQUNST1MKZGlmZiAtLWdpdCBhL3NjcmlwdHMva2VybmVsLWRvYyBiL3NjcmlwdHMva2VybmVsLWRvYwppbmRleCAwMGQxYWQxLi4xODdmNWRlIDEwMDc1NQotLS0gYS9zY3JpcHRzL2tlcm5lbC1kb2MKKysrIGIvc2NyaXB0cy9rZXJuZWwtZG9jCkBAIC0xMjYyLDcgKzEyNjIsOSBAQAogfQogCiAjIwotIyBnZW5lcmljIG91dHB1dCBmdW5jdGlvbiBmb3IgdHlwZWRlZnMKKyMgZ2VuZXJpYyBvdXRwdXQgZnVuY3Rpb24gZm9yIGFsbCB0eXBlcyAoZnVuY3Rpb24sIHN0cnVjdC91bmlvbiwgdHlwZWRlZiwgZW51bSk7CisjIGNhbGxzIHRoZSBnZW5lcmF0ZWQsIHZhcmlhYmxlIG91dHB1dF8gZnVuY3Rpb24gbmFtZSBiYXNlZCBvbgorIyBmdW5jdHlwZSBhbmQgb3V0cHV0X21vZGUKIHN1YiBvdXRwdXRfZGVjbGFyYXRpb24gewogICAgIG5vIHN0cmljdCAncmVmcyc7CiAgICAgbXkgJG5hbWUgPSBzaGlmdDsKQEAgLTEyNzgsOCArMTI4MCw3IEBACiB9CiAKICMjCi0jIGdlbmVyaWMgb3V0cHV0IGZ1bmN0aW9uIC0gY2FsbHMgdGhlIHJpZ2h0IG9uZSBiYXNlZAotIyBvbiBjdXJyZW50IG91dHB1dCBtb2RlLgorIyBnZW5lcmljIG91dHB1dCBmdW5jdGlvbiAtIGNhbGxzIHRoZSByaWdodCBvbmUgYmFzZWQgb24gY3VycmVudCBvdXRwdXQgbW9kZS4KIHN1YiBvdXRwdXRfaW50cm8gewogICAgIG5vIHN0cmljdCAncmVmcyc7CiAgICAgbXkgJGZ1bmMgPSAib3V0cHV0X2ludHJvXyIuJG91dHB1dF9tb2RlOwpAQCAtMTUxOCw2ICsxNTE5LDkgQEAKICAgICAkcHJvdG90eXBlID1+IHMvXmFzbWxpbmthZ2UgKy8vOwogICAgICRwcm90b3R5cGUgPX4gcy9eaW5saW5lICsvLzsKICAgICAkcHJvdG90eXBlID1+IHMvXl9faW5saW5lX18gKy8vOworICAgICRwcm90b3R5cGUgPX4gcy9eX19pbmxpbmUgKy8vOworICAgICRwcm90b3R5cGUgPX4gcy9eX19hbHdheXNfaW5saW5lICsvLzsKKyAgICAkcHJvdG90eXBlID1+IHMvXm5vaW5saW5lICsvLzsKICAgICAkcHJvdG90eXBlID1+IHMvX19kZXZpbml0ICsvLzsKICAgICAkcHJvdG90eXBlID1+IHMvXiNkZWZpbmUgKy8vOyAjYWsgYWRkZWQKICAgICAkcHJvdG90eXBlID1+IHMvX19hdHRyaWJ1dGVfXyBcKFwoW2EteixdKlwpXCkvLzsKQEAgLTE3NzgsOCArMTc4Miw5IEBACiAJCSRpbl9kb2Nfc2VjdCA9IDE7CiAJCSRjb250ZW50cyA9ICRuZXdjb250ZW50czsKIAkJaWYgKCRjb250ZW50cyBuZSAiIikgewotCQkgICAgaWYgKHN1YnN0cigkY29udGVudHMsIDAsIDEpIGVxICIgIikgewotCQkJJGNvbnRlbnRzID0gc3Vic3RyKCRjb250ZW50cywgMSk7CisJCSAgICB3aGlsZSAoKHN1YnN0cigkY29udGVudHMsIDAsIDEpIGVxICIgIikgfHwKKwkJCXN1YnN0cigkY29udGVudHMsIDAsIDEpIGVxICJcdCIpIHsKKwkJCSAgICAkY29udGVudHMgPSBzdWJzdHIoJGNvbnRlbnRzLCAxKTsKIAkJICAgIH0KIAkJICAgICRjb250ZW50cyAuPSAiXG4iOwogCQl9CmRpZmYgLS1naXQgYS9zY3JpcHRzL21vZC9tb2Rwb3N0LmMgYi9zY3JpcHRzL21vZC9tb2Rwb3N0LmMKaW5kZXggNDEyNzc5Ni4uMmUxMTQxNiAxMDA2NDQKLS0tIGEvc2NyaXB0cy9tb2QvbW9kcG9zdC5jCisrKyBiL3NjcmlwdHMvbW9kL21vZHBvc3QuYwpAQCAtOTIxLDYgKzkyMSw4IEBACiAJCSIuZml4dXAiLAogCQkiLnNtcF9sb2NrcyIsCiAJCSIucGx0IiwgIC8qIHNlZW4gb24gQVJDSD11bSBidWlsZCBvbiB4ODZfNjQuIEhhcm1sZXNzICovCisJCSJfX2Z0cl9maXh1cCIsCQkvKiBwb3dlcnBjIGNwdSBmZWF0dXJlIGZpeHVwICovCisJCSJfX2Z3X2Z0cl9maXh1cCIsCS8qIHBvd2VycGMgZmlybXdhcmUgZmVhdHVyZSBmaXh1cCAqLwogCQlOVUxMCiAJfTsKIAkvKiBTdGFydCBvZiBzZWN0aW9uIG5hbWVzICovCmRpZmYgLS1naXQgYS9zZWN1cml0eS9kdW1teS5jIGIvc2VjdXJpdHkvZHVtbXkuYwppbmRleCBhZWVlNzA1Li40Mzg3NGMxIDEwMDY0NAotLS0gYS9zZWN1cml0eS9kdW1teS5jCisrKyBiL3NlY3VyaXR5L2R1bW15LmMKQEAgLTg4MSw3ICs4ODEsOCBAQAogCXJldHVybiAxOwogfQogCi1zdGF0aWMgaW50IGR1bW15X3hmcm1fZmxvd19zdGF0ZV9tYXRjaChzdHJ1Y3QgZmxvd2kgKmZsLCBzdHJ1Y3QgeGZybV9zdGF0ZSAqeGZybSkKK3N0YXRpYyBpbnQgZHVtbXlfeGZybV9mbG93X3N0YXRlX21hdGNoKHN0cnVjdCBmbG93aSAqZmwsIHN0cnVjdCB4ZnJtX3N0YXRlICp4ZnJtLAorCQkJCXN0cnVjdCB4ZnJtX3BvbGljeSAqeHApCiB7CiAJcmV0dXJuIDE7CiB9CmRpZmYgLS1naXQgYS9zZWN1cml0eS9zZWxpbnV4L2hvb2tzLmMgYi9zZWN1cml0eS9zZWxpbnV4L2hvb2tzLmMKaW5kZXggZTk5NjlhMi4uOGFiNTY3OSAxMDA2NDQKLS0tIGEvc2VjdXJpdHkvc2VsaW51eC9ob29rcy5jCisrKyBiL3NlY3VyaXR5L3NlbGludXgvaG9va3MuYwpAQCAtMzMxMyw3ICszMzEzLDEzIEBACiAKIHN0YXRpYyBpbnQgc2VsaW51eF9zb2NrZXRfc2V0c29ja29wdChzdHJ1Y3Qgc29ja2V0ICpzb2NrLGludCBsZXZlbCxpbnQgb3B0bmFtZSkKIHsKLQlyZXR1cm4gc29ja2V0X2hhc19wZXJtKGN1cnJlbnQsIHNvY2ssIFNPQ0tFVF9fU0VUT1BUKTsKKwlpbnQgZXJyOworCisJZXJyID0gc29ja2V0X2hhc19wZXJtKGN1cnJlbnQsIHNvY2ssIFNPQ0tFVF9fU0VUT1BUKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCisJcmV0dXJuIHNlbGludXhfbmV0bGJsX3NvY2tldF9zZXRzb2Nrb3B0KHNvY2ssIGxldmVsLCBvcHRuYW1lKTsKIH0KIAogc3RhdGljIGludCBzZWxpbnV4X3NvY2tldF9nZXRzb2Nrb3B0KHN0cnVjdCBzb2NrZXQgKnNvY2ssIGludCBsZXZlbCwKZGlmZiAtLWdpdCBhL3NlY3VyaXR5L3NlbGludXgvaW5jbHVkZS9zZWxpbnV4X25ldGxhYmVsLmggYi9zZWN1cml0eS9zZWxpbnV4L2luY2x1ZGUvc2VsaW51eF9uZXRsYWJlbC5oCmluZGV4IGVjYWI0YmQuLjlkZTEwY2MgMTAwNjQ0Ci0tLSBhL3NlY3VyaXR5L3NlbGludXgvaW5jbHVkZS9zZWxpbnV4X25ldGxhYmVsLmgKKysrIGIvc2VjdXJpdHkvc2VsaW51eC9pbmNsdWRlL3NlbGludXhfbmV0bGFiZWwuaApAQCAtNTMsNiArNTMsOSBAQAogdm9pZCBzZWxpbnV4X25ldGxibF9za19jbG9uZV9zZWN1cml0eShzdHJ1Y3Qgc2tfc2VjdXJpdHlfc3RydWN0ICpzc2VjLAogCQkJCSAgICAgIHN0cnVjdCBza19zZWN1cml0eV9zdHJ1Y3QgKm5ld3NzZWMpOwogaW50IHNlbGludXhfbmV0bGJsX2lub2RlX3Blcm1pc3Npb24oc3RydWN0IGlub2RlICppbm9kZSwgaW50IG1hc2spOworaW50IHNlbGludXhfbmV0bGJsX3NvY2tldF9zZXRzb2Nrb3B0KHN0cnVjdCBzb2NrZXQgKnNvY2ssCisJCQkJICAgICBpbnQgbGV2ZWwsCisJCQkJICAgICBpbnQgb3B0bmFtZSk7CiAjZWxzZQogc3RhdGljIGlubGluZSB2b2lkIHNlbGludXhfbmV0bGJsX2NhY2hlX2ludmFsaWRhdGUodm9pZCkKIHsKQEAgLTExNCw2ICsxMTcsMTMgQEAKIHsKIAlyZXR1cm4gMDsKIH0KKworc3RhdGljIGlubGluZSBpbnQgc2VsaW51eF9uZXRsYmxfc29ja2V0X3NldHNvY2tvcHQoc3RydWN0IHNvY2tldCAqc29jaywKKwkJCQkJCSAgIGludCBsZXZlbCwKKwkJCQkJCSAgIGludCBvcHRuYW1lKQoreworCXJldHVybiAwOworfQogI2VuZGlmIC8qIENPTkZJR19ORVRMQUJFTCAqLwogCiAjZW5kaWYKZGlmZiAtLWdpdCBhL3NlY3VyaXR5L3NlbGludXgvaW5jbHVkZS94ZnJtLmggYi9zZWN1cml0eS9zZWxpbnV4L2luY2x1ZGUveGZybS5oCmluZGV4IDgxZWI1OTguLjUyNmIyODAgMTAwNjQ0Ci0tLSBhL3NlY3VyaXR5L3NlbGludXgvaW5jbHVkZS94ZnJtLmgKKysrIGIvc2VjdXJpdHkvc2VsaW51eC9pbmNsdWRlL3hmcm0uaApAQCAtMTksNyArMTksOCBAQAogaW50IHNlbGludXhfeGZybV9wb2xpY3lfbG9va3VwKHN0cnVjdCB4ZnJtX3BvbGljeSAqeHAsIHUzMiBmbF9zZWNpZCwgdTggZGlyKTsKIGludCBzZWxpbnV4X3hmcm1fc3RhdGVfcG9sX2Zsb3dfbWF0Y2goc3RydWN0IHhmcm1fc3RhdGUgKngsCiAJCQlzdHJ1Y3QgeGZybV9wb2xpY3kgKnhwLCBzdHJ1Y3QgZmxvd2kgKmZsKTsKLWludCBzZWxpbnV4X3hmcm1fZmxvd19zdGF0ZV9tYXRjaChzdHJ1Y3QgZmxvd2kgKmZsLCBzdHJ1Y3QgeGZybV9zdGF0ZSAqeGZybSk7CitpbnQgc2VsaW51eF94ZnJtX2Zsb3dfc3RhdGVfbWF0Y2goc3RydWN0IGZsb3dpICpmbCwgc3RydWN0IHhmcm1fc3RhdGUgKnhmcm0sCisJCQlzdHJ1Y3QgeGZybV9wb2xpY3kgKnhwKTsKIAogCiAvKgpkaWZmIC0tZ2l0IGEvc2VjdXJpdHkvc2VsaW51eC9zcy9lYml0bWFwLmMgYi9zZWN1cml0eS9zZWxpbnV4L3NzL2ViaXRtYXAuYwppbmRleCBjZmVkMWQzLi5kNTM5MzQ2IDEwMDY0NAotLS0gYS9zZWN1cml0eS9zZWxpbnV4L3NzL2ViaXRtYXAuYworKysgYi9zZWN1cml0eS9zZWxpbnV4L3NzL2ViaXRtYXAuYwpAQCAtOTMsMTEgKzkzLDE1IEBACiAJc2l6ZV90IGJpdG1hcF9ieXRlOwogCXVuc2lnbmVkIGNoYXIgYml0bWFzazsKIAorCWlmIChzcmMtPmhpZ2hiaXQgPT0gMCkgeworCQkqZHN0ID0gTlVMTDsKKwkJKmRzdF9sZW4gPSAwOworCQlyZXR1cm4gMDsKKwl9CisKIAliaXRtYXBfbGVuID0gc3JjLT5oaWdoYml0IC8gODsKIAlpZiAoc3JjLT5oaWdoYml0ICUgNykKIAkJYml0bWFwX2xlbiArPSAxOwotCWlmIChiaXRtYXBfbGVuID09IDApCi0JCXJldHVybiAtRUlOVkFMOwogCiAJYml0bWFwID0ga3phbGxvYygoYml0bWFwX2xlbiAmIH4oc2l6ZW9mKE1BUFRZUEUpIC0gMSkpICsKIAkJCSBzaXplb2YoTUFQVFlQRSksCmRpZmYgLS1naXQgYS9zZWN1cml0eS9zZWxpbnV4L3NzL21scy5jIGIvc2VjdXJpdHkvc2VsaW51eC9zcy9tbHMuYwppbmRleCBjNzEzYWYyLi4yY2NhOGUyIDEwMDY0NAotLS0gYS9zZWN1cml0eS9zZWxpbnV4L3NzL21scy5jCisrKyBiL3NlY3VyaXR5L3NlbGludXgvc3MvbWxzLmMKQEAgLTY0MCw4ICs2NDAsMTMgQEAKIHsKIAlpbnQgcmMgPSAtRVBFUk07CiAKLQlpZiAoIXNlbGludXhfbWxzX2VuYWJsZWQpCisJaWYgKCFzZWxpbnV4X21sc19lbmFibGVkKSB7CisJCSpsb3cgPSBOVUxMOworCQkqbG93X2xlbiA9IDA7CisJCSpoaWdoID0gTlVMTDsKKwkJKmhpZ2hfbGVuID0gMDsKIAkJcmV0dXJuIDA7CisJfQogCiAJaWYgKGxvdyAhPSBOVUxMKSB7CiAJCXJjID0gZWJpdG1hcF9leHBvcnQoJmNvbnRleHQtPnJhbmdlLmxldmVsWzBdLmNhdCwKQEAgLTY2MSwxMCArNjY2LDE2IEBACiAJcmV0dXJuIDA7CiAKIGV4cG9ydF9jYXRfZmFpbHVyZToKLQlpZiAobG93ICE9IE5VTEwpCisJaWYgKGxvdyAhPSBOVUxMKSB7CiAJCWtmcmVlKCpsb3cpOwotCWlmIChoaWdoICE9IE5VTEwpCisJCSpsb3cgPSBOVUxMOworCQkqbG93X2xlbiA9IDA7CisJfQorCWlmIChoaWdoICE9IE5VTEwpIHsKIAkJa2ZyZWUoKmhpZ2gpOworCQkqaGlnaCA9IE5VTEw7CisJCSpoaWdoX2xlbiA9IDA7CisJfQogCXJldHVybiByYzsKIH0KIApkaWZmIC0tZ2l0IGEvc2VjdXJpdHkvc2VsaW51eC9zcy9wb2xpY3lkYi5jIGIvc2VjdXJpdHkvc2VsaW51eC9zcy9wb2xpY3lkYi5jCmluZGV4IGIxODg5NTMuLmJhNDg5NjEgMTAwNjQ0Ci0tLSBhL3NlY3VyaXR5L3NlbGludXgvc3MvcG9saWN5ZGIuYworKysgYi9zZWN1cml0eS9zZWxpbnV4L3NzL3BvbGljeWRiLmMKQEAgLTYxOCw2ICs2MTgsNyBAQAogCQkJYyA9IGMtPm5leHQ7CiAJCQlvY29udGV4dF9kZXN0cm95KGN0bXAsaSk7CiAJCX0KKwkJcC0+b2NvbnRleHRzW2ldID0gTlVMTDsKIAl9CiAKIAlnID0gcC0+Z2VuZnM7CkBAIC02MzMsNiArNjM0LDcgQEAKIAkJZyA9IGctPm5leHQ7CiAJCWtmcmVlKGd0bXApOwogCX0KKwlwLT5nZW5mcyA9IE5VTEw7CiAKIAljb25kX3BvbGljeWRiX2Rlc3Ryb3kocCk7CiAKZGlmZiAtLWdpdCBhL3NlY3VyaXR5L3NlbGludXgvc3Mvc2VydmljZXMuYyBiL3NlY3VyaXR5L3NlbGludXgvc3Mvc2VydmljZXMuYwppbmRleCAwYzIxOWExLi5iZmUxMjI3IDEwMDY0NAotLS0gYS9zZWN1cml0eS9zZWxpbnV4L3NzL3NlcnZpY2VzLmMKKysrIGIvc2VjdXJpdHkvc2VsaW51eC9zcy9zZXJ2aWNlcy5jCkBAIC0yMTcyLDcgKzIxNzIsMTIgQEAKICAqLwogc3RhdGljIHZvaWQgc2VsaW51eF9uZXRsYmxfY2FjaGVfZnJlZShjb25zdCB2b2lkICpkYXRhKQogewotCXN0cnVjdCBuZXRsYmxfY2FjaGUgKmNhY2hlID0gTkVUTEJMX0NBQ0hFKGRhdGEpOworCXN0cnVjdCBuZXRsYmxfY2FjaGUgKmNhY2hlOworCisJaWYgKGRhdGEgPT0gTlVMTCkKKwkJcmV0dXJuOworCisJY2FjaGUgPSBORVRMQkxfQ0FDSEUoZGF0YSk7CiAJc3dpdGNoIChjYWNoZS0+dHlwZSkgewogCWNhc2UgTkVUTEJMX0NBQ0hFX1RfTUxTOgogCQllYml0bWFwX2Rlc3Ryb3koJmNhY2hlLT5kYXRhLm1sc19sYWJlbC5sZXZlbFswXS5jYXQpOwpAQCAtMjE5NywxNyArMjIwMiwyMCBAQAogCXN0cnVjdCBuZXRsYmxfbHNtX3NlY2F0dHIgc2VjYXR0cjsKIAogCW5ldGxibF9zZWNhdHRyX2luaXQoJnNlY2F0dHIpOworCXNlY2F0dHIuY2FjaGUgPSBuZXRsYmxfc2VjYXR0cl9jYWNoZV9hbGxvYyhHRlBfQVRPTUlDKTsKKwlpZiAoc2VjYXR0ci5jYWNoZSA9PSBOVUxMKQorCQlnb3RvIG5ldGxibF9jYWNoZV9hZGRfcmV0dXJuOwogCiAJY2FjaGUgPSBremFsbG9jKHNpemVvZigqY2FjaGUpLAlHRlBfQVRPTUlDKTsKIAlpZiAoY2FjaGUgPT0gTlVMTCkKLQkJZ290byBuZXRsYmxfY2FjaGVfYWRkX2ZhaWx1cmU7Ci0Jc2VjYXR0ci5jYWNoZS5mcmVlID0gc2VsaW51eF9uZXRsYmxfY2FjaGVfZnJlZTsKLQlzZWNhdHRyLmNhY2hlLmRhdGEgPSAodm9pZCAqKWNhY2hlOworCQlnb3RvIG5ldGxibF9jYWNoZV9hZGRfcmV0dXJuOworCXNlY2F0dHIuY2FjaGUtPmZyZWUgPSBzZWxpbnV4X25ldGxibF9jYWNoZV9mcmVlOworCXNlY2F0dHIuY2FjaGUtPmRhdGEgPSAodm9pZCAqKWNhY2hlOwogCiAJY2FjaGUtPnR5cGUgPSBORVRMQkxfQ0FDSEVfVF9NTFM7CiAJaWYgKGViaXRtYXBfY3B5KCZjYWNoZS0+ZGF0YS5tbHNfbGFiZWwubGV2ZWxbMF0uY2F0LAogCQkJJmN0eC0+cmFuZ2UubGV2ZWxbMF0uY2F0KSAhPSAwKQotCQlnb3RvIG5ldGxibF9jYWNoZV9hZGRfZmFpbHVyZTsKKwkJZ290byBuZXRsYmxfY2FjaGVfYWRkX3JldHVybjsKIAljYWNoZS0+ZGF0YS5tbHNfbGFiZWwubGV2ZWxbMV0uY2F0LmhpZ2hiaXQgPQogCQljYWNoZS0+ZGF0YS5tbHNfbGFiZWwubGV2ZWxbMF0uY2F0LmhpZ2hiaXQ7CiAJY2FjaGUtPmRhdGEubWxzX2xhYmVsLmxldmVsWzFdLmNhdC5ub2RlID0KQEAgLTIyMTUsMTMgKzIyMjMsMTAgQEAKIAljYWNoZS0+ZGF0YS5tbHNfbGFiZWwubGV2ZWxbMF0uc2VucyA9IGN0eC0+cmFuZ2UubGV2ZWxbMF0uc2VuczsKIAljYWNoZS0+ZGF0YS5tbHNfbGFiZWwubGV2ZWxbMV0uc2VucyA9IGN0eC0+cmFuZ2UubGV2ZWxbMF0uc2VuczsKIAotCWlmIChuZXRsYmxfY2FjaGVfYWRkKHNrYiwgJnNlY2F0dHIpICE9IDApCi0JCWdvdG8gbmV0bGJsX2NhY2hlX2FkZF9mYWlsdXJlOworCW5ldGxibF9jYWNoZV9hZGQoc2tiLCAmc2VjYXR0cik7CiAKLQlyZXR1cm47Ci0KLW5ldGxibF9jYWNoZV9hZGRfZmFpbHVyZToKLQluZXRsYmxfc2VjYXR0cl9kZXN0cm95KCZzZWNhdHRyLCAxKTsKK25ldGxibF9jYWNoZV9hZGRfcmV0dXJuOgorCW5ldGxibF9zZWNhdHRyX2Rlc3Ryb3koJnNlY2F0dHIpOwogfQogCiAvKioKQEAgLTIyNjMsOCArMjI2OCw4IEBACiAKIAlQT0xJQ1lfUkRMT0NLOwogCi0JaWYgKHNlY2F0dHItPmNhY2hlLmRhdGEpIHsKLQkJY2FjaGUgPSBORVRMQkxfQ0FDSEUoc2VjYXR0ci0+Y2FjaGUuZGF0YSk7CisJaWYgKHNlY2F0dHItPmNhY2hlKSB7CisJCWNhY2hlID0gTkVUTEJMX0NBQ0hFKHNlY2F0dHItPmNhY2hlLT5kYXRhKTsKIAkJc3dpdGNoIChjYWNoZS0+dHlwZSkgewogCQljYXNlIE5FVExCTF9DQUNIRV9UX1NJRDoKIAkJCSpzaWQgPSBjYWNoZS0+ZGF0YS5zaWQ7CkBAIC0yMzMxLDcgKzIzMzYsNyBAQAogCQkJc2VsaW51eF9uZXRsYmxfY2FjaGVfYWRkKHNrYiwgJmN0eF9uZXcpOwogCQllYml0bWFwX2Rlc3Ryb3koJmN0eF9uZXcucmFuZ2UubGV2ZWxbMF0uY2F0KTsKIAl9IGVsc2UgewotCQkqc2lkID0gU0VDSU5JVFNJRF9VTkxBQkVMRUQ7CisJCSpzaWQgPSBTRUNTSURfTlVMTDsKIAkJcmMgPSAwOwogCX0KIApAQCAtMjM2OSw3ICsyMzc0LDcgQEAKIAkJCQkJCSAgICZzZWNhdHRyLAogCQkJCQkJICAgYmFzZV9zaWQsCiAJCQkJCQkgICBzaWQpOwotCW5ldGxibF9zZWNhdHRyX2Rlc3Ryb3koJnNlY2F0dHIsIDApOworCW5ldGxibF9zZWNhdHRyX2Rlc3Ryb3koJnNlY2F0dHIpOwogCiAJcmV0dXJuIHJjOwogfQpAQCAtMjM5NCwzMSArMjM5OSwzMyBAQAogCWlmICghc3NfaW5pdGlhbGl6ZWQpCiAJCXJldHVybiAwOwogCisJbmV0bGJsX3NlY2F0dHJfaW5pdCgmc2VjYXR0cik7CisKIAlQT0xJQ1lfUkRMT0NLOwogCiAJY3R4ID0gc2lkdGFiX3NlYXJjaCgmc2lkdGFiLCBzaWQpOwogCWlmIChjdHggPT0gTlVMTCkKIAkJZ290byBuZXRsYmxfc29ja2V0X3NldHNpZF9yZXR1cm47CiAKLQluZXRsYmxfc2VjYXR0cl9pbml0KCZzZWNhdHRyKTsKIAlzZWNhdHRyLmRvbWFpbiA9IGtzdHJkdXAocG9saWN5ZGIucF90eXBlX3ZhbF90b19uYW1lW2N0eC0+dHlwZSAtIDFdLAogCQkJCSBHRlBfQVRPTUlDKTsKIAltbHNfZXhwb3J0X2x2bChjdHgsICZzZWNhdHRyLm1sc19sdmwsIE5VTEwpOwogCXNlY2F0dHIubWxzX2x2bF92bGQgPSAxOwotCW1sc19leHBvcnRfY2F0KGN0eCwKLQkJICAgICAgICZzZWNhdHRyLm1sc19jYXQsCi0JCSAgICAgICAmc2VjYXR0ci5tbHNfY2F0X2xlbiwKLQkJICAgICAgIE5VTEwsCi0JCSAgICAgICBOVUxMKTsKKwlyYyA9IG1sc19leHBvcnRfY2F0KGN0eCwKKwkJCSAgICAmc2VjYXR0ci5tbHNfY2F0LAorCQkJICAgICZzZWNhdHRyLm1sc19jYXRfbGVuLAorCQkJICAgIE5VTEwsCisJCQkgICAgTlVMTCk7CisJaWYgKHJjICE9IDApCisJCWdvdG8gbmV0bGJsX3NvY2tldF9zZXRzaWRfcmV0dXJuOwogCiAJcmMgPSBuZXRsYmxfc29ja2V0X3NldGF0dHIoc29jaywgJnNlY2F0dHIpOwogCWlmIChyYyA9PSAwKQogCQlza3NlYy0+bmxibF9zdGF0ZSA9IE5MQkxfTEFCRUxFRDsKIAotCW5ldGxibF9zZWNhdHRyX2Rlc3Ryb3koJnNlY2F0dHIsIDApOwotCiBuZXRsYmxfc29ja2V0X3NldHNpZF9yZXR1cm46CiAJUE9MSUNZX1JEVU5MT0NLOworCW5ldGxibF9zZWNhdHRyX2Rlc3Ryb3koJnNlY2F0dHIpOwogCXJldHVybiByYzsKIH0KIApAQCAtMjUxNCwxMCArMjUyMSwxMCBAQAogCWlmIChuZXRsYmxfc29ja19nZXRhdHRyKHNrLCAmc2VjYXR0cikgPT0gMCAmJgogCSAgICBzZWxpbnV4X25ldGxibF9zZWNhdHRyX3RvX3NpZChOVUxMLAogCQkJCQkgICZzZWNhdHRyLAotCQkJCQkgIHNrc2VjLT5zaWQsCisJCQkJCSAgU0VDSU5JVFNJRF9VTkxBQkVMRUQsCiAJCQkJCSAgJm5sYmxfcGVlcl9zaWQpID09IDApCiAJCXNrc2VjLT5wZWVyX3NpZCA9IG5sYmxfcGVlcl9zaWQ7Ci0JbmV0bGJsX3NlY2F0dHJfZGVzdHJveSgmc2VjYXR0ciwgMCk7CisJbmV0bGJsX3NlY2F0dHJfZGVzdHJveSgmc2VjYXR0cik7CiAKIAlza3NlYy0+bmxibF9zdGF0ZSA9IE5MQkxfUkVRVUlSRTsKIApAQCAtMjU0Nyw5ICsyNTU0LDYgQEAKIAlpZiAocmMgIT0gMCkKIAkJcmV0dXJuIFNFQ1NJRF9OVUxMOwogCi0JaWYgKHBlZXJfc2lkID09IFNFQ0lOSVRTSURfVU5MQUJFTEVEKQotCQlyZXR1cm4gU0VDU0lEX05VTEw7Ci0KIAlyZXR1cm4gcGVlcl9zaWQ7CiB9CiAKQEAgLTI2MTEsMTEgKzI2MTUsMTMgQEAKIAl1MzIgbmV0bGJsX3NpZDsKIAl1MzIgcmVjdl9wZXJtOwogCi0JcmMgPSBzZWxpbnV4X25ldGxibF9za2J1ZmZfZ2V0c2lkKHNrYiwgU0VDSU5JVFNJRF9ORVRNU0csICZuZXRsYmxfc2lkKTsKKwlyYyA9IHNlbGludXhfbmV0bGJsX3NrYnVmZl9nZXRzaWQoc2tiLAorCQkJCQkgIFNFQ0lOSVRTSURfVU5MQUJFTEVELAorCQkJCQkgICZuZXRsYmxfc2lkKTsKIAlpZiAocmMgIT0gMCkKIAkJcmV0dXJuIHJjOwogCi0JaWYgKG5ldGxibF9zaWQgPT0gU0VDSU5JVFNJRF9VTkxBQkVMRUQpCisJaWYgKG5ldGxibF9zaWQgPT0gU0VDU0lEX05VTEwpCiAJCXJldHVybiAwOwogCiAJc3dpdGNoIChza3NlYy0+c2NsYXNzKSB7CkBAIC0yNjUzLDEwICsyNjU5LDYgQEAKIHUzMiBzZWxpbnV4X25ldGxibF9zb2NrZXRfZ2V0cGVlcnNlY19zdHJlYW0oc3RydWN0IHNvY2tldCAqc29jaykKIHsKIAlzdHJ1Y3Qgc2tfc2VjdXJpdHlfc3RydWN0ICpza3NlYyA9IHNvY2stPnNrLT5za19zZWN1cml0eTsKLQotCWlmIChza3NlYy0+cGVlcl9zaWQgPT0gU0VDSU5JVFNJRF9VTkxBQkVMRUQpCi0JCXJldHVybiBTRUNTSURfTlVMTDsKLQogCXJldHVybiBza3NlYy0+cGVlcl9zaWQ7CiB9CiAKQEAgLTI2NzIsMTggKzI2NzQsNDkgQEAKIHUzMiBzZWxpbnV4X25ldGxibF9zb2NrZXRfZ2V0cGVlcnNlY19kZ3JhbShzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQogewogCWludCBwZWVyX3NpZDsKLQlzdHJ1Y3Qgc29jayAqc2sgPSBza2ItPnNrOwotCXN0cnVjdCBpbm9kZV9zZWN1cml0eV9zdHJ1Y3QgKmlzZWM7CiAKLQlpZiAoc2sgPT0gTlVMTCB8fCBzay0+c2tfc29ja2V0ID09IE5VTEwpCi0JCXJldHVybiBTRUNTSURfTlVMTDsKLQotCWlzZWMgPSBTT0NLX0lOT0RFKHNrLT5za19zb2NrZXQpLT5pX3NlY3VyaXR5OwotCWlmIChzZWxpbnV4X25ldGxibF9za2J1ZmZfZ2V0c2lkKHNrYiwgaXNlYy0+c2lkLCAmcGVlcl9zaWQpICE9IDApCi0JCXJldHVybiBTRUNTSURfTlVMTDsKLQlpZiAocGVlcl9zaWQgPT0gU0VDSU5JVFNJRF9VTkxBQkVMRUQpCisJaWYgKHNlbGludXhfbmV0bGJsX3NrYnVmZl9nZXRzaWQoc2tiLAorCQkJCQkgU0VDSU5JVFNJRF9VTkxBQkVMRUQsCisJCQkJCSAmcGVlcl9zaWQpICE9IDApCiAJCXJldHVybiBTRUNTSURfTlVMTDsKIAogCXJldHVybiBwZWVyX3NpZDsKIH0KKworLyoqCisgKiBzZWxpbnV4X25ldGxibF9zb2NrZXRfc2V0c29ja29wdCAtIERvIG5vdCBhbGxvdyB1c2VycyB0byByZW1vdmUgYSBOZXRMYWJlbAorICogQHNvY2s6IHRoZSBzb2NrZXQKKyAqIEBsZXZlbDogdGhlIHNvY2tldCBsZXZlbCBvciBwcm90b2NvbAorICogQG9wdG5hbWU6IHRoZSBzb2NrZXQgb3B0aW9uIG5hbWUKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIENoZWNrIHRoZSBzZXRzb2Nrb3B0KCkgY2FsbCBhbmQgaWYgdGhlIHVzZXIgaXMgdHJ5aW5nIHRvIHJlcGxhY2UgdGhlIElQCisgKiBvcHRpb25zIG9uIGEgc29ja2V0IGFuZCBhIE5ldExhYmVsIGlzIGluIHBsYWNlIGZvciB0aGUgc29ja2V0IGRlbnkgdGhlCisgKiBhY2Nlc3M7IG90aGVyd2lzZSBhbGxvdyB0aGUgYWNjZXNzLiAgUmV0dXJucyB6ZXJvIHdoZW4gdGhlIGFjY2VzcyBpcworICogYWxsb3dlZCwgLUVBQ0NFUyB3aGVuIGRlbmllZCwgYW5kIG90aGVyIG5lZ2F0aXZlIHZhbHVlcyBvbiBlcnJvci4KKyAqCisgKi8KK2ludCBzZWxpbnV4X25ldGxibF9zb2NrZXRfc2V0c29ja29wdChzdHJ1Y3Qgc29ja2V0ICpzb2NrLAorCQkJCSAgICAgaW50IGxldmVsLAorCQkJCSAgICAgaW50IG9wdG5hbWUpCit7CisJaW50IHJjID0gMDsKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gU09DS19JTk9ERShzb2NrKTsKKwlzdHJ1Y3Qgc2tfc2VjdXJpdHlfc3RydWN0ICpza3NlYyA9IHNvY2stPnNrLT5za19zZWN1cml0eTsKKwlzdHJ1Y3QgaW5vZGVfc2VjdXJpdHlfc3RydWN0ICppc2VjID0gaW5vZGUtPmlfc2VjdXJpdHk7CisJc3RydWN0IG5ldGxibF9sc21fc2VjYXR0ciBzZWNhdHRyOworCisJbXV0ZXhfbG9jaygmaXNlYy0+bG9jayk7CisJaWYgKGxldmVsID09IElQUFJPVE9fSVAgJiYgb3B0bmFtZSA9PSBJUF9PUFRJT05TICYmCisJICAgIHNrc2VjLT5ubGJsX3N0YXRlID09IE5MQkxfTEFCRUxFRCkgeworCQluZXRsYmxfc2VjYXR0cl9pbml0KCZzZWNhdHRyKTsKKwkJcmMgPSBuZXRsYmxfc29ja2V0X2dldGF0dHIoc29jaywgJnNlY2F0dHIpOworCQlpZiAocmMgPT0gMCAmJiAoc2VjYXR0ci5jYWNoZSB8fCBzZWNhdHRyLm1sc19sdmxfdmxkKSkKKwkJCXJjID0gLUVBQ0NFUzsKKwkJbmV0bGJsX3NlY2F0dHJfZGVzdHJveSgmc2VjYXR0cik7CisJfQorCW11dGV4X3VubG9jaygmaXNlYy0+bG9jayk7CisKKwlyZXR1cm4gcmM7Cit9CiAjZW5kaWYgLyogQ09ORklHX05FVExBQkVMICovCmRpZmYgLS1naXQgYS9zZWN1cml0eS9zZWxpbnV4L3hmcm0uYyBiL3NlY3VyaXR5L3NlbGludXgveGZybS5jCmluZGV4IDNlNzQyYjguLjY3NWI5OTUgMTAwNjQ0Ci0tLSBhL3NlY3VyaXR5L3NlbGludXgveGZybS5jCisrKyBiL3NlY3VyaXR5L3NlbGludXgveGZybS5jCkBAIC03Nyw4ICs3Nyw4IEBACiAgKi8KIGludCBzZWxpbnV4X3hmcm1fcG9saWN5X2xvb2t1cChzdHJ1Y3QgeGZybV9wb2xpY3kgKnhwLCB1MzIgZmxfc2VjaWQsIHU4IGRpcikKIHsKLQlpbnQgcmMgPSAwOwotCXUzMiBzZWxfc2lkID0gU0VDSU5JVFNJRF9VTkxBQkVMRUQ7CisJaW50IHJjOworCXUzMiBzZWxfc2lkOwogCXN0cnVjdCB4ZnJtX3NlY19jdHggKmN0eDsKIAogCS8qIENvbnRleHQgc2lkIGlzIGVpdGhlciBzZXQgdG8gbGFiZWwgb3IgQU5ZX0FTU09DICovCkBAIC04OCwxMSArODgsMjEgQEAKIAogCQlzZWxfc2lkID0gY3R4LT5jdHhfc2lkOwogCX0KKwllbHNlCisJCS8qCisJCSAqIEFsbCBmbG93cyBzaG91bGQgYmUgdHJlYXRlZCBhcyBwb2xtYXRjaCdpbmcgYW4KKwkJICogb3RoZXJ3aXNlIGFwcGxpY2FibGUgIm5vbi1sYWJlbGVkIiBwb2xpY3kuIFRoaXMKKwkJICogd291bGQgcHJldmVudCBpbmFkdmVydGVudCAibGVha3MiLgorCQkgKi8KKwkJcmV0dXJuIDA7CiAKIAlyYyA9IGF2Y19oYXNfcGVybShmbF9zZWNpZCwgc2VsX3NpZCwgU0VDQ0xBU1NfQVNTT0NJQVRJT04sCiAJCQkgIEFTU09DSUFUSU9OX19QT0xNQVRDSCwKIAkJCSAgTlVMTCk7CiAKKwlpZiAocmMgPT0gLUVBQ0NFUykKKwkJcmMgPSAtRVNSQ0g7CisKIAlyZXR1cm4gcmM7CiB9CiAKQEAgLTEwOCwxNSArMTE4LDIwIEBACiAJdTMyIHBvbF9zaWQ7CiAJaW50IGVycjsKIAotCWlmICh4LT5zZWN1cml0eSkKLQkJc3RhdGVfc2lkID0geC0+c2VjdXJpdHktPmN0eF9zaWQ7Ci0JZWxzZQotCQlzdGF0ZV9zaWQgPSBTRUNJTklUU0lEX1VOTEFCRUxFRDsKLQotCWlmICh4cC0+c2VjdXJpdHkpCisJaWYgKHhwLT5zZWN1cml0eSkgeworCQlpZiAoIXgtPnNlY3VyaXR5KQorCQkJLyogdW5sYWJlbGVkIFNBIGFuZCBsYWJlbGVkIHBvbGljeSBjYW4ndCBtYXRjaCAqLworCQkJcmV0dXJuIDA7CisJCWVsc2UKKwkJCXN0YXRlX3NpZCA9IHgtPnNlY3VyaXR5LT5jdHhfc2lkOwogCQlwb2xfc2lkID0geHAtPnNlY3VyaXR5LT5jdHhfc2lkOwotCWVsc2UKLQkJcG9sX3NpZCA9IFNFQ0lOSVRTSURfVU5MQUJFTEVEOworCX0gZWxzZQorCQlpZiAoeC0+c2VjdXJpdHkpCisJCQkvKiB1bmxhYmVsZWQgcG9saWN5IGFuZCBsYWJlbGVkIFNBIGNhbid0IG1hdGNoICovCisJCQlyZXR1cm4gMDsKKwkJZWxzZQorCQkJLyogdW5sYWJlbGVkIHBvbGljeSBhbmQgdW5sYWJlbGVkIFNBIG1hdGNoIGFsbCBmbG93cyAqLworCQkJcmV0dXJuIDE7CiAKIAllcnIgPSBhdmNfaGFzX3Blcm0oc3RhdGVfc2lkLCBwb2xfc2lkLCBTRUNDTEFTU19BU1NPQ0lBVElPTiwKIAkJCSAgQVNTT0NJQVRJT05fX1BPTE1BVENILApAQCAtMTI1LDcgKzE0MCwxMSBAQAogCWlmIChlcnIpCiAJCXJldHVybiAwOwogCi0JcmV0dXJuIHNlbGludXhfeGZybV9mbG93X3N0YXRlX21hdGNoKGZsLCB4KTsKKwllcnIgPSBhdmNfaGFzX3Blcm0oZmwtPnNlY2lkLCBzdGF0ZV9zaWQsIFNFQ0NMQVNTX0FTU09DSUFUSU9OLAorCQkJICBBU1NPQ0lBVElPTl9fU0VORFRPLAorCQkJICBOVUxMKT8gMDoxOworCisJcmV0dXJuIGVycjsKIH0KIAogLyoKQEAgLTEzMywxMiArMTUyLDIyIEBACiAgKiBjYW4gdXNlIGEgZ2l2ZW4gc2VjdXJpdHkgYXNzb2NpYXRpb24uCiAgKi8KIAotaW50IHNlbGludXhfeGZybV9mbG93X3N0YXRlX21hdGNoKHN0cnVjdCBmbG93aSAqZmwsIHN0cnVjdCB4ZnJtX3N0YXRlICp4ZnJtKQoraW50IHNlbGludXhfeGZybV9mbG93X3N0YXRlX21hdGNoKHN0cnVjdCBmbG93aSAqZmwsIHN0cnVjdCB4ZnJtX3N0YXRlICp4ZnJtLAorCQkJCSAgc3RydWN0IHhmcm1fcG9saWN5ICp4cCkKIHsKIAlpbnQgcmMgPSAwOwogCXUzMiBzZWxfc2lkID0gU0VDSU5JVFNJRF9VTkxBQkVMRUQ7CiAJc3RydWN0IHhmcm1fc2VjX2N0eCAqY3R4OwogCisJaWYgKCF4cC0+c2VjdXJpdHkpCisJCWlmICgheGZybS0+c2VjdXJpdHkpCisJCQlyZXR1cm4gMTsKKwkJZWxzZQorCQkJcmV0dXJuIDA7CisJZWxzZQorCQlpZiAoIXhmcm0tPnNlY3VyaXR5KQorCQkJcmV0dXJuIDA7CisKIAkvKiBDb250ZXh0IHNpZCBpcyBlaXRoZXIgc2V0IHRvIGxhYmVsIG9yIEFOWV9BU1NPQyAqLwogCWlmICgoY3R4ID0geGZybS0+c2VjdXJpdHkpKSB7CiAJCWlmICghc2VsaW51eF9hdXRob3JpemFibGVfY3R4KGN0eCkpCmRpZmYgLS1naXQgYS9zb3VuZC9jb3JlL2NvbnRyb2wuYyBiL3NvdW5kL2NvcmUvY29udHJvbC5jCmluZGV4IDY5NzNhOTYuLjQ4ZWYwYTAgMTAwNjQ0Ci0tLSBhL3NvdW5kL2NvcmUvY29udHJvbC5jCisrKyBiL3NvdW5kL2NvcmUvY29udHJvbC5jCkBAIC0xMDE4LDEwICsxMDE4LDYgQEAKIAl9CiAJc3dpdGNoIChpbmZvLT50eXBlKSB7CiAJY2FzZSBTTkRSVl9DVExfRUxFTV9UWVBFX0JPT0xFQU46Ci0JCXByaXZhdGVfc2l6ZSA9IHNpemVvZihjaGFyKTsKLQkJaWYgKGluZm8tPmNvdW50ID4gMTI4KQotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCWJyZWFrOwogCWNhc2UgU05EUlZfQ1RMX0VMRU1fVFlQRV9JTlRFR0VSOgogCQlwcml2YXRlX3NpemUgPSBzaXplb2YobG9uZyk7CiAJCWlmIChpbmZvLT5jb3VudCA+IDEyOCkKZGlmZiAtLWdpdCBhL3NvdW5kL2NvcmUvaW5mby5jIGIvc291bmQvY29yZS9pbmZvLmMKaW5kZXggZTQzNjYyYi4uMGI0YWFiMyAxMDA2NDQKLS0tIGEvc291bmQvY29yZS9pbmZvLmMKKysrIGIvc291bmQvY29yZS9pbmZvLmMKQEAgLTEyMCw3ICsxMjAsMTAgQEAKIAlsZW4gPSBidWZmZXItPmxlbiAtIGJ1ZmZlci0+c2l6ZTsKIAl2YV9zdGFydChhcmdzLCBmbXQpOwogCWZvciAoOzspIHsKLQkJcmVzID0gdnNucHJpbnRmKGJ1ZmZlci0+YnVmZmVyICsgYnVmZmVyLT5jdXJyLCBsZW4sIGZtdCwgYXJncyk7CisJCXZhX2xpc3QgYXA7CisJCXZhX2NvcHkoYXAsIGFyZ3MpOworCQlyZXMgPSB2c25wcmludGYoYnVmZmVyLT5idWZmZXIgKyBidWZmZXItPmN1cnIsIGxlbiwgZm10LCBhcCk7CisJCXZhX2VuZChhcCk7CiAJCWlmIChyZXMgPCBsZW4pCiAJCQlicmVhazsKIAkJZXJyID0gcmVzaXplX2luZm9fYnVmZmVyKGJ1ZmZlciwgYnVmZmVyLT5sZW4gKyBQQUdFX1NJWkUpOwpkaWZmIC0tZ2l0IGEvc291bmQvaXNhL0tjb25maWcgYi9zb3VuZC9pc2EvS2NvbmZpZwppbmRleCA1NTdjNGRlLi41NzM3MWYxIDEwMDY0NAotLS0gYS9zb3VuZC9pc2EvS2NvbmZpZworKysgYi9zb3VuZC9pc2EvS2NvbmZpZwpAQCAtMTMsNiArMTMsNyBAQAogCiBjb25maWcgU05EX0FETElCCiAJdHJpc3RhdGUgIkFkTGliIEZNIGNhcmQiCisJZGVwZW5kcyBvbiBTTkQKIAlzZWxlY3QgU05EX09QTDNfTElCCiAJaGVscAogCSAgU2F5IFkgaGVyZSB0byBpbmNsdWRlIHN1cHBvcnQgZm9yIEFkTGliIEZNIGNhcmRzLgpkaWZmIC0tZ2l0IGEvc291bmQvaXNhL2FkMTgxNmEvYWQxODE2YS5jIGIvc291bmQvaXNhL2FkMTgxNmEvYWQxODE2YS5jCmluZGV4IGIzM2E1ZmIuLjU5MDM0NTAgMTAwNjQ0Ci0tLSBhL3NvdW5kL2lzYS9hZDE4MTZhL2FkMTgxNmEuYworKysgYi9zb3VuZC9pc2EvYWQxODE2YS9hZDE4MTZhLmMKQEAgLTEyMCw2ICsxMjAsOCBAQAogCXN0cnVjdCBwbnBfcmVzb3VyY2VfdGFibGUgKmNmZyA9IGttYWxsb2Moc2l6ZW9mKCpjZmcpLCBHRlBfS0VSTkVMKTsKIAlpbnQgZXJyOwogCisJaWYgKCFjZmcpCisJCXJldHVybiAtRU5PTUVNOwogCWFjYXJkLT5kZXYgPSBwbnBfcmVxdWVzdF9jYXJkX2RldmljZShjYXJkLCBpZC0+ZGV2c1swXS5pZCwgTlVMTCk7CiAJaWYgKGFjYXJkLT5kZXYgPT0gTlVMTCkgewogCQlrZnJlZShjZmcpOwpkaWZmIC0tZ2l0IGEvc291bmQvaXNhL2NtaTgzMzAuYyBiL3NvdW5kL2lzYS9jbWk4MzMwLmMKaW5kZXggM2MxZTlmZC4uZDFmNmRmYyAxMDA2NDQKLS0tIGEvc291bmQvaXNhL2NtaTgzMzAuYworKysgYi9zb3VuZC9pc2EvY21pODMzMC5jCkBAIC0yODksNiArMjg5LDggQEAKIAlzdHJ1Y3QgcG5wX3Jlc291cmNlX3RhYmxlICogY2ZnID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IHBucF9yZXNvdXJjZV90YWJsZSksIEdGUF9LRVJORUwpOwogCWludCBlcnI7CiAKKwlpZiAoIWNmZykKKwkJcmV0dXJuIC1FTk9NRU07CiAJYWNhcmQtPmNhcCA9IHBucF9yZXF1ZXN0X2NhcmRfZGV2aWNlKGNhcmQsIGlkLT5kZXZzWzBdLmlkLCBOVUxMKTsKIAlpZiAoYWNhcmQtPmNhcCA9PSBOVUxMKSB7CiAJCWtmcmVlKGNmZyk7CmRpZmYgLS1naXQgYS9zb3VuZC9pc2EvZ3VzL2ludGVyd2F2ZS5jIGIvc291bmQvaXNhL2d1cy9pbnRlcndhdmUuYwppbmRleCBmMTJjZDA5Li40ZWMyZDc5IDEwMDY0NAotLS0gYS9zb3VuZC9pc2EvZ3VzL2ludGVyd2F2ZS5jCisrKyBiL3NvdW5kL2lzYS9ndXMvaW50ZXJ3YXZlLmMKQEAgLTU2NCw2ICs1NjQsOCBAQAogCXN0cnVjdCBwbnBfcmVzb3VyY2VfdGFibGUgKiBjZmcgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgcG5wX3Jlc291cmNlX3RhYmxlKSwgR0ZQX0tFUk5FTCk7CiAJaW50IGVycjsKIAorCWlmICghY2ZnKQorCQlyZXR1cm4gLUVOT01FTTsKIAlpd2NhcmQtPmRldiA9IHBucF9yZXF1ZXN0X2NhcmRfZGV2aWNlKGNhcmQsIGlkLT5kZXZzWzBdLmlkLCBOVUxMKTsKIAlpZiAoaXdjYXJkLT5kZXYgPT0gTlVMTCkgewogCQlrZnJlZShjZmcpOwpkaWZmIC0tZ2l0IGEvc291bmQvaXNhL29wdGk5eHgvb3B0aTkyeC1hZDE4NDguYyBiL3NvdW5kL2lzYS9vcHRpOXh4L29wdGk5MngtYWQxODQ4LmMKaW5kZXggYTFhZDM5YS4uZGYyMjczNyAxMDA2NDQKLS0tIGEvc291bmQvaXNhL29wdGk5eHgvb3B0aTkyeC1hZDE4NDguYworKysgYi9zb3VuZC9pc2Evb3B0aTl4eC9vcHRpOTJ4LWFkMTg0OC5jCkBAIC0xNjgzLDYgKzE2ODMsOCBAQAogCXN0cnVjdCBwbnBfcmVzb3VyY2VfdGFibGUgKmNmZyA9IGttYWxsb2Moc2l6ZW9mKCpjZmcpLCBHRlBfS0VSTkVMKTsKIAlpbnQgZXJyOwogCisJaWYgKCFjZmcpCisJCXJldHVybiAtRU5PTUVNOwogCWNoaXAtPmRldiA9IHBucF9yZXF1ZXN0X2NhcmRfZGV2aWNlKGNhcmQsIHBpZC0+ZGV2c1swXS5pZCwgTlVMTCk7CiAJaWYgKGNoaXAtPmRldiA9PSBOVUxMKSB7CiAJCWtmcmVlKGNmZyk7CmRpZmYgLS1naXQgYS9zb3VuZC9vc3Mvc2hfZGFjX2F1ZGlvLmMgYi9zb3VuZC9vc3Mvc2hfZGFjX2F1ZGlvLmMKaW5kZXggM2IzYjRkYS4uNTFmNTU0MSAxMDA2NDQKLS0tIGEvc291bmQvb3NzL3NoX2RhY19hdWRpby5jCisrKyBiL3NvdW5kL29zcy9zaF9kYWNfYXVkaW8uYwpAQCAtMjYsNyArMjYsNyBAQAogI2luY2x1ZGUgPGFzbS9jcHUvZGFjLmg+CiAjaW5jbHVkZSA8YXNtL2NwdS90aW1lci5oPgogI2luY2x1ZGUgPGFzbS9tYWNodmVjLmg+Ci0jaW5jbHVkZSA8YXNtL2hwNnh4L2hwNnh4Lmg+CisjaW5jbHVkZSA8YXNtL2hwNnh4Lmg+CiAjaW5jbHVkZSA8YXNtL2hkNjQ0NjEuaD4KIAogI2RlZmluZSBNT0ROQU1FICJzaF9kYWNfYXVkaW8iCmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvYWM5Ny9hYzk3X2NvZGVjLmMgYi9zb3VuZC9wY2kvYWM5Ny9hYzk3X2NvZGVjLmMKaW5kZXggYTc5ZTkxOC4uNjU3N2IyMyAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2FjOTcvYWM5N19jb2RlYy5jCisrKyBiL3NvdW5kL3BjaS9hYzk3L2FjOTdfY29kZWMuYwpAQCAtNTcwLDggKzU3MCw3IEBACiAJCQlhYzk3LT5wb3dlcl91cCAmPSB+KDEgPDwgKHJlZz4+MSkpOwogCQllbHNlCiAJCQlhYzk3LT5wb3dlcl91cCB8PSAxIDw8IChyZWc+PjEpOwotCQlpZiAocG93ZXJfc2F2ZSkKLQkJCXVwZGF0ZV9wb3dlcl9yZWdzKGFjOTcpOworCQl1cGRhdGVfcG93ZXJfcmVncyhhYzk3KTsKIAl9CiAjZW5kaWYKIAlyZXR1cm4gZXJyOwpAQCAtMjMzNywxMCArMjMzNiw3IEBACiAJCX0KIAl9CiAKLQlpZiAoISBwb3dlcl9zYXZlKQotCQlyZXR1cm4gMDsKLQotCWlmICghIHBvd2VydXAgJiYgYWM5Ny0+cG93ZXJfd29ya3EpCisJaWYgKHBvd2VyX3NhdmUgJiYgIXBvd2VydXAgJiYgYWM5Ny0+cG93ZXJfd29ya3EpCiAJCS8qIGFkanVzdCBwb3dlci1kb3duIGJpdHMgYWZ0ZXIgdHdvIHNlY29uZHMgZGVsYXkKIAkJICogKGZvciBhdm9pZGluZyBsb3VkIGNsaWNrIG5vaXNlcyBmb3IgbWFueSAoT1NTKSBhcHBzCiAJCSAqICB0aGF0IG9wZW4vY2xvc2UgZnJlcXVlbnRseSkKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9hbGk1NDUxL2FsaTU0NTEuYyBiL3NvdW5kL3BjaS9hbGk1NDUxL2FsaTU0NTEuYwppbmRleCAxM2E4Y2VmLi5hN2VkZDU2IDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvYWxpNTQ1MS9hbGk1NDUxLmMKKysrIGIvc291bmQvcGNpL2FsaTU0NTEvYWxpNTQ1MS5jCkBAIC0yMDMyLDggKzIwMzIsMTAgQEAKIAlvdXRsKDB4ZmZmZmZmZmYsIEFMSV9SRUcoY2hpcCwgQUxJX1NUT1ApKTsKIAogCXNwaW5fdW5sb2NrX2lycSgmY2hpcC0+cmVnX2xvY2spOworCiAJcGNpX2Rpc2FibGVfZGV2aWNlKHBjaSk7CiAJcGNpX3NhdmVfc3RhdGUocGNpKTsKKwlwY2lfc2V0X3Bvd2VyX3N0YXRlKHBjaSwgcGNpX2Nob29zZV9zdGF0ZShwY2ksIHN0YXRlKSk7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTIwNDgsOCArMjA1MCwxNSBAQAogCWlmICghIGltKQogCQlyZXR1cm4gMDsKIAorCXBjaV9zZXRfcG93ZXJfc3RhdGUocGNpLCBQQ0lfRDApOwogCXBjaV9yZXN0b3JlX3N0YXRlKHBjaSk7Ci0JcGNpX2VuYWJsZV9kZXZpY2UocGNpKTsKKwlpZiAocGNpX2VuYWJsZV9kZXZpY2UocGNpKSA8IDApIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJhbGk1NDUxOiBwY2lfZW5hYmxlX2RldmljZSBmYWlsZWQsICIKKwkJICAgICAgICJkaXNhYmxpbmcgZGV2aWNlXG4iKTsKKwkJc25kX2NhcmRfZGlzY29ubmVjdChjYXJkKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCXBjaV9zZXRfbWFzdGVyKHBjaSk7CiAKIAlzcGluX2xvY2tfaXJxKCZjaGlwLT5yZWdfbG9jayk7CiAJCmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvYWxzMzAwLmMgYi9zb3VuZC9wY2kvYWxzMzAwLmMKaW5kZXggOWIxNmMyOS4uOTVmNzBmMyAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2FsczMwMC5jCisrKyBiL3NvdW5kL3BjaS9hbHMzMDAuYwpAQCAtNzY4LDkgKzc2OCw5IEBACiAJc25kX3BjbV9zdXNwZW5kX2FsbChjaGlwLT5wY20pOwogCXNuZF9hYzk3X3N1c3BlbmQoY2hpcC0+YWM5Nyk7CiAKLQlwY2lfc2V0X3Bvd2VyX3N0YXRlKHBjaSwgUENJX0QzaG90KTsKIAlwY2lfZGlzYWJsZV9kZXZpY2UocGNpKTsKIAlwY2lfc2F2ZV9zdGF0ZShwY2kpOworCXBjaV9zZXRfcG93ZXJfc3RhdGUocGNpLCBwY2lfY2hvb3NlX3N0YXRlKHBjaSwgc3RhdGUpKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtNzc5LDkgKzc3OSwxNCBAQAogCXN0cnVjdCBzbmRfY2FyZCAqY2FyZCA9IHBjaV9nZXRfZHJ2ZGF0YShwY2kpOwogCXN0cnVjdCBzbmRfYWxzMzAwICpjaGlwID0gY2FyZC0+cHJpdmF0ZV9kYXRhOwogCi0JcGNpX3Jlc3RvcmVfc3RhdGUocGNpKTsKLQlwY2lfZW5hYmxlX2RldmljZShwY2kpOwogCXBjaV9zZXRfcG93ZXJfc3RhdGUocGNpLCBQQ0lfRDApOworCXBjaV9yZXN0b3JlX3N0YXRlKHBjaSk7CisJaWYgKHBjaV9lbmFibGVfZGV2aWNlKHBjaSkgPCAwKSB7CisJCXByaW50ayhLRVJOX0VSUiAiYWxzMzAwOiBwY2lfZW5hYmxlX2RldmljZSBmYWlsZWQsICIKKwkJICAgICAgICJkaXNhYmxpbmcgZGV2aWNlXG4iKTsKKwkJc25kX2NhcmRfZGlzY29ubmVjdChjYXJkKTsKKwkJcmV0dXJuIC1FSU87CisJfQogCXBjaV9zZXRfbWFzdGVyKHBjaSk7CiAKIAlzbmRfYWxzMzAwX2luaXQoY2hpcCk7CmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvYWxzNDAwMC5jIGIvc291bmQvcGNpL2FsczQwMDAuYwppbmRleCAxNWZjMzkyLi44ZmI1NWQzIDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvYWxzNDAwMC5jCisrKyBiL3NvdW5kL3BjaS9hbHM0MDAwLmMKQEAgLTgwNCw5ICs4MDQsOSBAQAogCXNuZF9wY21fc3VzcGVuZF9hbGwoY2hpcC0+cGNtKTsKIAlzbmRfc2JtaXhlcl9zdXNwZW5kKGNoaXApOwogCi0JcGNpX3NldF9wb3dlcl9zdGF0ZShwY2ksIFBDSV9EM2hvdCk7CiAJcGNpX2Rpc2FibGVfZGV2aWNlKHBjaSk7CiAJcGNpX3NhdmVfc3RhdGUocGNpKTsKKwlwY2lfc2V0X3Bvd2VyX3N0YXRlKHBjaSwgcGNpX2Nob29zZV9zdGF0ZShwY2ksIHN0YXRlKSk7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTgxNiw5ICs4MTYsMTQgQEAKIAlzdHJ1Y3Qgc25kX2NhcmRfYWxzNDAwMCAqYWNhcmQgPSBjYXJkLT5wcml2YXRlX2RhdGE7CiAJc3RydWN0IHNuZF9zYiAqY2hpcCA9IGFjYXJkLT5jaGlwOwogCi0JcGNpX3Jlc3RvcmVfc3RhdGUocGNpKTsKLQlwY2lfZW5hYmxlX2RldmljZShwY2kpOwogCXBjaV9zZXRfcG93ZXJfc3RhdGUocGNpLCBQQ0lfRDApOworCXBjaV9yZXN0b3JlX3N0YXRlKHBjaSk7CisJaWYgKHBjaV9lbmFibGVfZGV2aWNlKHBjaSkgPCAwKSB7CisJCXByaW50ayhLRVJOX0VSUiAiYWxzNDAwMDogcGNpX2VuYWJsZV9kZXZpY2UgZmFpbGVkLCAiCisJCSAgICAgICAiZGlzYWJsaW5nIGRldmljZVxuIik7CisJCXNuZF9jYXJkX2Rpc2Nvbm5lY3QoY2FyZCk7CisJCXJldHVybiAtRUlPOworCX0KIAlwY2lfc2V0X21hc3RlcihwY2kpOwogCiAJc25kX2FsczQwMDBfY29uZmlndXJlKGNoaXApOwpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2F0aWl4cC5jIGIvc291bmQvcGNpL2F0aWl4cC5jCmluZGV4IDNlOGZjNWEuLmUzZTk5ZjMgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9hdGlpeHAuYworKysgYi9zb3VuZC9wY2kvYXRpaXhwLmMKQEAgLTE0NDIsOSArMTQ0Miw5IEBACiAJc25kX2F0aWl4cF9hY2xpbmtfZG93bihjaGlwKTsKIAlzbmRfYXRpaXhwX2NoaXBfc3RvcChjaGlwKTsKIAotCXBjaV9zZXRfcG93ZXJfc3RhdGUocGNpLCBQQ0lfRDNob3QpOwogCXBjaV9kaXNhYmxlX2RldmljZShwY2kpOwogCXBjaV9zYXZlX3N0YXRlKHBjaSk7CisJcGNpX3NldF9wb3dlcl9zdGF0ZShwY2ksIHBjaV9jaG9vc2Vfc3RhdGUocGNpLCBzdGF0ZSkpOwogCXJldHVybiAwOwogfQogCkBAIC0xNDU0LDkgKzE0NTQsMTQgQEAKIAlzdHJ1Y3QgYXRpaXhwICpjaGlwID0gY2FyZC0+cHJpdmF0ZV9kYXRhOwogCWludCBpOwogCi0JcGNpX3Jlc3RvcmVfc3RhdGUocGNpKTsKLQlwY2lfZW5hYmxlX2RldmljZShwY2kpOwogCXBjaV9zZXRfcG93ZXJfc3RhdGUocGNpLCBQQ0lfRDApOworCXBjaV9yZXN0b3JlX3N0YXRlKHBjaSk7CisJaWYgKHBjaV9lbmFibGVfZGV2aWNlKHBjaSkgPCAwKSB7CisJCXByaW50ayhLRVJOX0VSUiAiYXRpaXhwOiBwY2lfZW5hYmxlX2RldmljZSBmYWlsZWQsICIKKwkJICAgICAgICJkaXNhYmxpbmcgZGV2aWNlXG4iKTsKKwkJc25kX2NhcmRfZGlzY29ubmVjdChjYXJkKTsKKwkJcmV0dXJuIC1FSU87CisJfQogCXBjaV9zZXRfbWFzdGVyKHBjaSk7CiAKIAlzbmRfYXRpaXhwX2FjbGlua19yZXNldChjaGlwKTsKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9hdGlpeHBfbW9kZW0uYyBiL3NvdW5kL3BjaS9hdGlpeHBfbW9kZW0uYwppbmRleCBjNWRkYTFiLi5kYzU0ZjJjIDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvYXRpaXhwX21vZGVtLmMKKysrIGIvc291bmQvcGNpL2F0aWl4cF9tb2RlbS5jCkBAIC0xMTI4LDkgKzExMjgsOSBAQAogCXNuZF9hdGlpeHBfYWNsaW5rX2Rvd24oY2hpcCk7CiAJc25kX2F0aWl4cF9jaGlwX3N0b3AoY2hpcCk7CiAKLQlwY2lfc2V0X3Bvd2VyX3N0YXRlKHBjaSwgUENJX0QzaG90KTsKIAlwY2lfZGlzYWJsZV9kZXZpY2UocGNpKTsKIAlwY2lfc2F2ZV9zdGF0ZShwY2kpOworCXBjaV9zZXRfcG93ZXJfc3RhdGUocGNpLCBwY2lfY2hvb3NlX3N0YXRlKHBjaSwgc3RhdGUpKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMTE0MCw5ICsxMTQwLDE0IEBACiAJc3RydWN0IGF0aWl4cF9tb2RlbSAqY2hpcCA9IGNhcmQtPnByaXZhdGVfZGF0YTsKIAlpbnQgaTsKIAotCXBjaV9yZXN0b3JlX3N0YXRlKHBjaSk7Ci0JcGNpX2VuYWJsZV9kZXZpY2UocGNpKTsKIAlwY2lfc2V0X3Bvd2VyX3N0YXRlKHBjaSwgUENJX0QwKTsKKwlwY2lfcmVzdG9yZV9zdGF0ZShwY2kpOworCWlmIChwY2lfZW5hYmxlX2RldmljZShwY2kpIDwgMCkgeworCQlwcmludGsoS0VSTl9FUlIgImF0aWl4cC1tb2RlbTogcGNpX2VuYWJsZV9kZXZpY2UgZmFpbGVkLCAiCisJCSAgICAgICAiZGlzYWJsaW5nIGRldmljZVxuIik7CisJCXNuZF9jYXJkX2Rpc2Nvbm5lY3QoY2FyZCk7CisJCXJldHVybiAtRUlPOworCX0KIAlwY2lfc2V0X21hc3RlcihwY2kpOwogCiAJc25kX2F0aWl4cF9hY2xpbmtfcmVzZXQoY2hpcCk7CmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvYXp0MzMyOC5jIGIvc291bmQvcGNpL2F6dDMzMjguYwppbmRleCA2OTJmMjAzLi4yNDE0ZWU2IDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvYXp0MzMyOC5jCisrKyBiL3NvdW5kL3BjaS9henQzMzI4LmMKQEAgLTE5MDMsOSArMTkwMyw5IEBACiAJZm9yIChyZWcgPSAwOyByZWcgPCBBWkZfSU9fU0laRV9TWU5USF9QTSAvIDI7IHJlZysrKQogCQljaGlwLT5zYXZlZF9yZWdzX3N5bnRoW3JlZ10gPSBpbncoY2hpcC0+c3ludGhfcG9ydCArIHJlZyAqIDIpOwogCi0JcGNpX3NldF9wb3dlcl9zdGF0ZShwY2ksIFBDSV9EM2hvdCk7CiAJcGNpX2Rpc2FibGVfZGV2aWNlKHBjaSk7CiAJcGNpX3NhdmVfc3RhdGUocGNpKTsKKwlwY2lfc2V0X3Bvd2VyX3N0YXRlKHBjaSwgcGNpX2Nob29zZV9zdGF0ZShwY2ksIHN0YXRlKSk7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTE5MTYsOSArMTkxNiwxNCBAQAogCXN0cnVjdCBzbmRfYXpmMzMyOCAqY2hpcCA9IGNhcmQtPnByaXZhdGVfZGF0YTsKIAlpbnQgcmVnOwogCi0JcGNpX3Jlc3RvcmVfc3RhdGUocGNpKTsKLQlwY2lfZW5hYmxlX2RldmljZShwY2kpOwogCXBjaV9zZXRfcG93ZXJfc3RhdGUocGNpLCBQQ0lfRDApOworCXBjaV9yZXN0b3JlX3N0YXRlKHBjaSk7CisJaWYgKHBjaV9lbmFibGVfZGV2aWNlKHBjaSkgPCAwKSB7CisJCXByaW50ayhLRVJOX0VSUiAiYXp0MzMyODogcGNpX2VuYWJsZV9kZXZpY2UgZmFpbGVkLCAiCisJCSAgICAgICAiZGlzYWJsaW5nIGRldmljZVxuIik7CisJCXNuZF9jYXJkX2Rpc2Nvbm5lY3QoY2FyZCk7CisJCXJldHVybiAtRUlPOworCX0KIAlwY2lfc2V0X21hc3RlcihwY2kpOwogCiAJZm9yIChyZWcgPSAwOyByZWcgPCBBWkZfSU9fU0laRV9JTzJfUE0gLyAyOyByZWcrKykKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9jbWlwY2kuYyBiL3NvdW5kL3BjaS9jbWlwY2kuYwppbmRleCAxZjdlNzEwLi4wMDkzY2QxIDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvY21pcGNpLmMKKysrIGIvc291bmQvcGNpL2NtaXBjaS5jCkBAIC0zMTIyLDkgKzMxMjIsOSBAQAogCS8qIGRpc2FibGUgaW50cyAqLwogCXNuZF9jbWlwY2lfd3JpdGUoY20sIENNX1JFR19JTlRfSExEQ0xSLCAwKTsKIAotCXBjaV9zZXRfcG93ZXJfc3RhdGUocGNpLCBQQ0lfRDNob3QpOwogCXBjaV9kaXNhYmxlX2RldmljZShwY2kpOwogCXBjaV9zYXZlX3N0YXRlKHBjaSk7CisJcGNpX3NldF9wb3dlcl9zdGF0ZShwY2ksIHBjaV9jaG9vc2Vfc3RhdGUocGNpLCBzdGF0ZSkpOwogCXJldHVybiAwOwogfQogCkBAIC0zMTM0LDkgKzMxMzQsMTQgQEAKIAlzdHJ1Y3QgY21pcGNpICpjbSA9IGNhcmQtPnByaXZhdGVfZGF0YTsKIAlpbnQgaTsKIAotCXBjaV9yZXN0b3JlX3N0YXRlKHBjaSk7Ci0JcGNpX2VuYWJsZV9kZXZpY2UocGNpKTsKIAlwY2lfc2V0X3Bvd2VyX3N0YXRlKHBjaSwgUENJX0QwKTsKKwlwY2lfcmVzdG9yZV9zdGF0ZShwY2kpOworCWlmIChwY2lfZW5hYmxlX2RldmljZShwY2kpIDwgMCkgeworCQlwcmludGsoS0VSTl9FUlIgImNtaXBjaTogcGNpX2VuYWJsZV9kZXZpY2UgZmFpbGVkLCAiCisJCSAgICAgICAiZGlzYWJsaW5nIGRldmljZVxuIik7CisJCXNuZF9jYXJkX2Rpc2Nvbm5lY3QoY2FyZCk7CisJCXJldHVybiAtRUlPOworCX0KIAlwY2lfc2V0X21hc3RlcihwY2kpOwogCiAJLyogcmVzZXQgLyBpbml0aWFsaXplIHRvIGEgc2FuZSBzdGF0ZSAqLwpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2NzNDI4MS5jIGIvc291bmQvcGNpL2NzNDI4MS5jCmluZGV4IGQ1NDkyNGUuLjA5MDVmYTggMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9jczQyODEuYworKysgYi9zb3VuZC9wY2kvY3M0MjgxLmMKQEAgLTIwNTAsNiArMjA1MCw3IEBACiAKIAlwY2lfZGlzYWJsZV9kZXZpY2UocGNpKTsKIAlwY2lfc2F2ZV9zdGF0ZShwY2kpOworCXBjaV9zZXRfcG93ZXJfc3RhdGUocGNpLCBwY2lfY2hvb3NlX3N0YXRlKHBjaSwgc3RhdGUpKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMjA2MCw4ICsyMDYxLDE0IEBACiAJdW5zaWduZWQgaW50IGk7CiAJdTMyIHVsQ0xLOwogCisJcGNpX3NldF9wb3dlcl9zdGF0ZShwY2ksIFBDSV9EMCk7CiAJcGNpX3Jlc3RvcmVfc3RhdGUocGNpKTsKLQlwY2lfZW5hYmxlX2RldmljZShwY2kpOworCWlmIChwY2lfZW5hYmxlX2RldmljZShwY2kpIDwgMCkgeworCQlwcmludGsoS0VSTl9FUlIgImNzNDI4MTogcGNpX2VuYWJsZV9kZXZpY2UgZmFpbGVkLCAiCisJCSAgICAgICAiZGlzYWJsaW5nIGRldmljZVxuIik7CisJCXNuZF9jYXJkX2Rpc2Nvbm5lY3QoY2FyZCk7CisJCXJldHVybiAtRUlPOworCX0KIAlwY2lfc2V0X21hc3RlcihwY2kpOwogCiAJdWxDTEsgPSBzbmRfY3M0MjgxX3BlZWtCQTAoY2hpcCwgQkEwX0NMS0NSMSk7CmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvY3M0Nnh4L2NzNDZ4eF9saWIuYyBiL3NvdW5kL3BjaS9jczQ2eHgvY3M0Nnh4X2xpYi5jCmluZGV4IDE2ZDRlYmYuLjI4MDdiOTcgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9jczQ2eHgvY3M0Nnh4X2xpYi5jCisrKyBiL3NvdW5kL3BjaS9jczQ2eHgvY3M0Nnh4X2xpYi5jCkBAIC0zNjg3LDggKzM2ODcsMTAgQEAKIAkvKiBkaXNhYmxlIENMS1JVTiAqLwogCWNoaXAtPmFjdGl2ZV9jdHJsKGNoaXAsIC1jaGlwLT5hbXBsaWZpZXIpOwogCWNoaXAtPmFtcGxpZmllciA9IGFtcF9zYXZlZDsgLyogcmVzdG9yZSB0aGUgc3RhdHVzICovCisKIAlwY2lfZGlzYWJsZV9kZXZpY2UocGNpKTsKIAlwY2lfc2F2ZV9zdGF0ZShwY2kpOworCXBjaV9zZXRfcG93ZXJfc3RhdGUocGNpLCBwY2lfY2hvb3NlX3N0YXRlKHBjaSwgc3RhdGUpKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMzY5OCw5ICszNzAwLDE2IEBACiAJc3RydWN0IHNuZF9jczQ2eHggKmNoaXAgPSBjYXJkLT5wcml2YXRlX2RhdGE7CiAJaW50IGFtcF9zYXZlZDsKIAorCXBjaV9zZXRfcG93ZXJfc3RhdGUocGNpLCBQQ0lfRDApOwogCXBjaV9yZXN0b3JlX3N0YXRlKHBjaSk7Ci0JcGNpX2VuYWJsZV9kZXZpY2UocGNpKTsKKwlpZiAocGNpX2VuYWJsZV9kZXZpY2UocGNpKSA8IDApIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJjczQ2eHg6IHBjaV9lbmFibGVfZGV2aWNlIGZhaWxlZCwgIgorCQkgICAgICAgImRpc2FibGluZyBkZXZpY2VcbiIpOworCQlzbmRfY2FyZF9kaXNjb25uZWN0KGNhcmQpOworCQlyZXR1cm4gLUVJTzsKKwl9CiAJcGNpX3NldF9tYXN0ZXIocGNpKTsKKwogCWFtcF9zYXZlZCA9IGNoaXAtPmFtcGxpZmllcjsKIAljaGlwLT5hbXBsaWZpZXIgPSAwOwogCWNoaXAtPmFjdGl2ZV9jdHJsKGNoaXAsIDEpOyAvKiBmb3JjZSB0byBvbiAqLwpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2NzNTUzNWF1ZGlvL2NzNTUzNWF1ZGlvX3BtLmMgYi9zb3VuZC9wY2kvY3M1NTM1YXVkaW8vY3M1NTM1YXVkaW9fcG0uYwppbmRleCBhYWQwZTY5Li4zZTRkMTk4IDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvY3M1NTM1YXVkaW8vY3M1NTM1YXVkaW9fcG0uYworKysgYi9zb3VuZC9wY2kvY3M1NTM1YXVkaW8vY3M1NTM1YXVkaW9fcG0uYwpAQCAtNzMsOSArNzMsMTAgQEAKIAlzbmRfYWM5N19zdXNwZW5kKGNzNTUzNWF1LT5hYzk3KTsKIAkvKiBzYXZlIGltcG9ydGFudCByZWdzLCB0aGVuIGRpc2FibGUgYWNsaW5rIGluIGh3ICovCiAJc25kX2NzNTUzNWF1ZGlvX3N0b3BfaGFyZHdhcmUoY3M1NTM1YXUpOworCiAJcGNpX2Rpc2FibGVfZGV2aWNlKHBjaSk7CiAJcGNpX3NhdmVfc3RhdGUocGNpKTsKLQorCXBjaV9zZXRfcG93ZXJfc3RhdGUocGNpLCBwY2lfY2hvb3NlX3N0YXRlKHBjaSwgc3RhdGUpKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtODcsOCArODgsMTQgQEAKIAlpbnQgdGltZW91dDsKIAlpbnQgaTsKIAorCXBjaV9zZXRfcG93ZXJfc3RhdGUocGNpLCBQQ0lfRDApOwogCXBjaV9yZXN0b3JlX3N0YXRlKHBjaSk7Ci0JcGNpX2VuYWJsZV9kZXZpY2UocGNpKTsKKwlpZiAocGNpX2VuYWJsZV9kZXZpY2UocGNpKSA8IDApIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJjczU1MzVhdWRpbzogcGNpX2VuYWJsZV9kZXZpY2UgZmFpbGVkLCAiCisJCSAgICAgICAiZGlzYWJsaW5nIGRldmljZVxuIik7CisJCXNuZF9jYXJkX2Rpc2Nvbm5lY3QoY2FyZCk7CisJCXJldHVybiAtRUlPOworCX0KIAlwY2lfc2V0X21hc3RlcihwY2kpOwogCiAJLyogc2V0IExOS19XUk1fUlNUIHRvIHJlc2V0IEFDIGxpbmsgKi8KZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9lbXUxMGsxL2VtdTEwazEuYyBiL3NvdW5kL3BjaS9lbXUxMGsxL2VtdTEwazEuYwppbmRleCA0OTNlYzA4Li41NWNhZjM0IDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvZW11MTBrMS9lbXUxMGsxLmMKKysrIGIvc291bmQvcGNpL2VtdTEwazEvZW11MTBrMS5jCkBAIC0yMjYsOSArMjI2LDkgQEAKIAogCXNuZF9lbXUxMGsxX2RvbmUoZW11KTsKIAotCXBjaV9zZXRfcG93ZXJfc3RhdGUocGNpLCBQQ0lfRDNob3QpOwogCXBjaV9kaXNhYmxlX2RldmljZShwY2kpOwogCXBjaV9zYXZlX3N0YXRlKHBjaSk7CisJcGNpX3NldF9wb3dlcl9zdGF0ZShwY2ksIHBjaV9jaG9vc2Vfc3RhdGUocGNpLCBzdGF0ZSkpOwogCXJldHVybiAwOwogfQogCkBAIC0yMzcsMTEgKzIzNywxNiBAQAogCXN0cnVjdCBzbmRfY2FyZCAqY2FyZCA9IHBjaV9nZXRfZHJ2ZGF0YShwY2kpOwogCXN0cnVjdCBzbmRfZW11MTBrMSAqZW11ID0gY2FyZC0+cHJpdmF0ZV9kYXRhOwogCi0JcGNpX3Jlc3RvcmVfc3RhdGUocGNpKTsKLQlwY2lfZW5hYmxlX2RldmljZShwY2kpOwogCXBjaV9zZXRfcG93ZXJfc3RhdGUocGNpLCBQQ0lfRDApOworCXBjaV9yZXN0b3JlX3N0YXRlKHBjaSk7CisJaWYgKHBjaV9lbmFibGVfZGV2aWNlKHBjaSkgPCAwKSB7CisJCXByaW50ayhLRVJOX0VSUiAiZW11MTBrMTogcGNpX2VuYWJsZV9kZXZpY2UgZmFpbGVkLCAiCisJCSAgICAgICAiZGlzYWJsaW5nIGRldmljZVxuIik7CisJCXNuZF9jYXJkX2Rpc2Nvbm5lY3QoY2FyZCk7CisJCXJldHVybiAtRUlPOworCX0KIAlwY2lfc2V0X21hc3RlcihwY2kpOwotCQorCiAJc25kX2VtdTEwazFfcmVzdW1lX2luaXQoZW11KTsKIAlzbmRfZW11MTBrMV9lZnhfcmVzdW1lKGVtdSk7CiAJc25kX2FjOTdfcmVzdW1lKGVtdS0+YWM5Nyk7CmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvZW5zMTM3MC5jIGIvc291bmQvcGNpL2VuczEzNzAuYwppbmRleCA4Y2I0ZmIyLi5kMmE4MTFmIDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvZW5zMTM3MC5jCisrKyBiL3NvdW5kL3BjaS9lbnMxMzcwLmMKQEAgLTIwNzIsOSArMjA3MiwxMCBAQAogCXVkZWxheSgxMDApOwogCXNuZF9hazQ1MzFfc3VzcGVuZChlbnNvbmlxLT51LmVzMTM3MC5hazQ1MzEpOwogI2VuZGlmCQotCXBjaV9zZXRfcG93ZXJfc3RhdGUocGNpLCBQQ0lfRDNob3QpOworCiAJcGNpX2Rpc2FibGVfZGV2aWNlKHBjaSk7CiAJcGNpX3NhdmVfc3RhdGUocGNpKTsKKwlwY2lfc2V0X3Bvd2VyX3N0YXRlKHBjaSwgcGNpX2Nob29zZV9zdGF0ZShwY2ksIHN0YXRlKSk7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTIwODMsOSArMjA4NCwxNCBAQAogCXN0cnVjdCBzbmRfY2FyZCAqY2FyZCA9IHBjaV9nZXRfZHJ2ZGF0YShwY2kpOwogCXN0cnVjdCBlbnNvbmlxICplbnNvbmlxID0gY2FyZC0+cHJpdmF0ZV9kYXRhOwogCi0JcGNpX3Jlc3RvcmVfc3RhdGUocGNpKTsKLQlwY2lfZW5hYmxlX2RldmljZShwY2kpOwogCXBjaV9zZXRfcG93ZXJfc3RhdGUocGNpLCBQQ0lfRDApOworCXBjaV9yZXN0b3JlX3N0YXRlKHBjaSk7CisJaWYgKHBjaV9lbmFibGVfZGV2aWNlKHBjaSkgPCAwKSB7CisJCXByaW50ayhLRVJOX0VSUiBEUklWRVJfTkFNRSAiOiBwY2lfZW5hYmxlX2RldmljZSBmYWlsZWQsICIKKwkJICAgICAgICJkaXNhYmxpbmcgZGV2aWNlXG4iKTsKKwkJc25kX2NhcmRfZGlzY29ubmVjdChjYXJkKTsKKwkJcmV0dXJuIC1FSU87CisJfQogCXBjaV9zZXRfbWFzdGVyKHBjaSk7CiAKIAlzbmRfZW5zb25pcV9jaGlwX2luaXQoZW5zb25pcSk7CmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvZXMxOTM4LmMgYi9zb3VuZC9wY2kvZXMxOTM4LmMKaW5kZXggMmRhOTg4Zi4uMWE4ZDM2ZCAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2VzMTkzOC5jCisrKyBiL3NvdW5kL3BjaS9lczE5MzguYwpAQCAtMTQ4MSwxMCArMTQ4MSwxNCBAQAogCQkqZCA9IHNuZF9lczE5MzhfcmVnX3JlYWQoY2hpcCwgKnMpOwogCiAJb3V0YigweDAwLCBTTElPX1JFRyhjaGlwLCBJUlFDT05UUk9MKSk7IC8qIGRpc2FibGUgaXJxcyAqLwotCWlmIChjaGlwLT5pcnEgPj0gMCkKKwlpZiAoY2hpcC0+aXJxID49IDApIHsKKwkJc3luY2hyb25pemVfaXJxKGNoaXAtPmlycSk7CiAJCWZyZWVfaXJxKGNoaXAtPmlycSwgY2hpcCk7CisJCWNoaXAtPmlycSA9IC0xOworCX0KIAlwY2lfZGlzYWJsZV9kZXZpY2UocGNpKTsKIAlwY2lfc2F2ZV9zdGF0ZShwY2kpOworCXBjaV9zZXRfcG93ZXJfc3RhdGUocGNpLCBwY2lfY2hvb3NlX3N0YXRlKHBjaSwgc3RhdGUpKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMTQ5NCwxMCArMTQ5OCwyMiBAQAogCXN0cnVjdCBlczE5MzggKmNoaXAgPSBjYXJkLT5wcml2YXRlX2RhdGE7CiAJdW5zaWduZWQgY2hhciAqcywgKmQ7CiAKKwlwY2lfc2V0X3Bvd2VyX3N0YXRlKHBjaSwgUENJX0QwKTsKIAlwY2lfcmVzdG9yZV9zdGF0ZShwY2kpOwotCXBjaV9lbmFibGVfZGV2aWNlKHBjaSk7Ci0JcmVxdWVzdF9pcnEocGNpLT5pcnEsIHNuZF9lczE5MzhfaW50ZXJydXB0LAotCQkgICAgSVJRRl9ESVNBQkxFRHxJUlFGX1NIQVJFRCwgIkVTMTkzOCIsIGNoaXApOworCWlmIChwY2lfZW5hYmxlX2RldmljZShwY2kpIDwgMCkgeworCQlwcmludGsoS0VSTl9FUlIgImVzMTkzODogcGNpX2VuYWJsZV9kZXZpY2UgZmFpbGVkLCAiCisJCSAgICAgICAiZGlzYWJsaW5nIGRldmljZVxuIik7CisJCXNuZF9jYXJkX2Rpc2Nvbm5lY3QoY2FyZCk7CisJCXJldHVybiAtRUlPOworCX0KKworCWlmIChyZXF1ZXN0X2lycShwY2ktPmlycSwgc25kX2VzMTkzOF9pbnRlcnJ1cHQsCisJCQlJUlFGX0RJU0FCTEVEfElSUUZfU0hBUkVELCAiRVMxOTM4IiwgY2hpcCkpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJlczE5Mzg6IHVuYWJsZSB0byBncmFiIElSUSAlZCwgIgorCQkgICAgICAgImRpc2FibGluZyBkZXZpY2VcbiIsIHBjaS0+aXJxKTsKKwkJc25kX2NhcmRfZGlzY29ubmVjdChjYXJkKTsKKwkJcmV0dXJuIC1FSU87CisJfQogCWNoaXAtPmlycSA9IHBjaS0+aXJxOwogCXNuZF9lczE5MzhfY2hpcF9pbml0KGNoaXApOwogCkBAIC0xNTU2LDggKzE1NzIsMTAgQEAKIAogCXNuZF9lczE5MzhfZnJlZV9nYW1lcG9ydChjaGlwKTsKIAotCWlmIChjaGlwLT5pcnEgPj0gMCkKKwlpZiAoY2hpcC0+aXJxID49IDApIHsKKwkJc3luY2hyb25pemVfaXJxKGNoaXAtPmlycSk7CiAJCWZyZWVfaXJxKGNoaXAtPmlycSwgY2hpcCk7CisJfQogCXBjaV9yZWxlYXNlX3JlZ2lvbnMoY2hpcC0+cGNpKTsKIAlwY2lfZGlzYWJsZV9kZXZpY2UoY2hpcC0+cGNpKTsKIAlrZnJlZShjaGlwKTsKQEAgLTE2MDIsNiArMTYyMCw3IEBACiAJc3Bpbl9sb2NrX2luaXQoJmNoaXAtPm1peGVyX2xvY2spOwogCWNoaXAtPmNhcmQgPSBjYXJkOwogCWNoaXAtPnBjaSA9IHBjaTsKKwljaGlwLT5pcnEgPSAtMTsKIAlpZiAoKGVyciA9IHBjaV9yZXF1ZXN0X3JlZ2lvbnMocGNpLCAiRVNTIFNvbG8tMSIpKSA8IDApIHsKIAkJa2ZyZWUoY2hpcCk7CiAJCXBjaV9kaXNhYmxlX2RldmljZShwY2kpOwpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2VzMTk2OC5jIGIvc291bmQvcGNpL2VzMTk2OC5jCmluZGV4IGI5ZDcyM2MuLjA5MmRhNTNlIDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvZXMxOTY4LmMKKysrIGIvc291bmQvcGNpL2VzMTk2OC5jCkBAIC00MzIsNDYgKzQzMiw2IEBACiAjZGVmaW5lIEVTTV9NT0RFX1BMQVkJCTAKICNkZWZpbmUgRVNNX01PREVfQ0FQVFVSRQkxCiAKLS8qIGFjcGkgc3RhdGVzICovCi1lbnVtIHsKLQlBQ1BJX0QwPTAsCi0JQUNQSV9EMSwKLQlBQ1BJX0QyLAotCUFDUElfRDMKLX07Ci0KLS8qIGJpdHMgaW4gdGhlIGFjcGkgbWFza3MgKi8KLSNkZWZpbmUgQUNQSV8xMk1IWgkoIDEgPDwgMTUpCi0jZGVmaW5lIEFDUElfMjRNSFoJKCAxIDw8IDE0KQotI2RlZmluZSBBQ1BJXzk3OAkoIDEgPDwgMTMpCi0jZGVmaW5lIEFDUElfU1BESUYJKCAxIDw8IDEyKQotI2RlZmluZSBBQ1BJX0dMVUUJKCAxIDw8IDExKQotI2RlZmluZSBBQ1BJX18xMAkoIDEgPDwgMTApIC8qIHJlc2VydmVkICovCi0jZGVmaW5lIEFDUElfUENJSU5UCSggMSA8PCA5KQotI2RlZmluZSBBQ1BJX0hWCQkoIDEgPDwgOCkgLyogaGFyZHdhcmUgdm9sdW1lICovCi0jZGVmaW5lIEFDUElfR1BJTwkoIDEgPDwgNykKLSNkZWZpbmUgQUNQSV9BU1NQCSggMSA8PCA2KQotI2RlZmluZSBBQ1BJX1NCCQkoIDEgPDwgNSkgLyogc2IgZW11bCAqLwotI2RlZmluZSBBQ1BJX0ZNCQkoIDEgPDwgNCkgLyogZm0gZW11bCAqLwotI2RlZmluZSBBQ1BJX1JCCQkoIDEgPDwgMykgLyogcmluZ2J1cyAvIGFjbGluayAqLwotI2RlZmluZSBBQ1BJX01JREkJKCAxIDw8IDIpIAotI2RlZmluZSBBQ1BJX0dQCQkoIDEgPDwgMSkgLyogZ2FtZSBwb3J0ICovCi0jZGVmaW5lIEFDUElfV1AJCSggMSA8PCAwKSAvKiB3YXZlIHByb2Nlc3NvciAqLwotCi0jZGVmaW5lIEFDUElfQUxMCSgweGZmZmYpCi0jZGVmaW5lIEFDUElfU0xFRVAJKH4oQUNQSV9TUERJRnxBQ1BJX0FTU1B8QUNQSV9TQnxBQ1BJX0ZNfCBcCi0JCQlBQ1BJX01JREl8QUNQSV9HUHxBQ1BJX1dQKSkKLSNkZWZpbmUgQUNQSV9OT05FCShBQ1BJX18xMCkKLQotLyogdGhlc2UgbWFza3MgaW5kaWNhdGUgd2hpY2ggdW5pdHMgd2UgY2FyZSBhYm91dCBhdAotCXdoaWNoIHN0YXRlcyAqLwotc3RhdGljIHUxNiBhY3BpX3N0YXRlX21hc2tbXSA9IHsKLQlbQUNQSV9EMF0gPSBBQ1BJX0FMTCwKLQlbQUNQSV9EMV0gPSBBQ1BJX1NMRUVQLAotCVtBQ1BJX0QyXSA9IEFDUElfU0xFRVAsCi0JW0FDUElfRDNdID0gQUNQSV9OT05FCi19OwotCiAKIC8qIEFQVSB1c2UgaW4gdGhlIGRyaXZlciAqLwogZW51bSBzbmRfZW51bV9hcHVfdHlwZSB7CkBAIC0yMTYwLDIxICsyMTIwLDYgQEAKIH0KIAogLyoKLSAqIHBvd2VyIG1hbmFnZW1lbnQKLSAqLwotc3RhdGljIHZvaWQgc25kX2VzMTk2OF9zZXRfYWNwaShzdHJ1Y3QgZXMxOTY4ICpjaGlwLCBpbnQgc3RhdGUpCi17Ci0JdTE2IGFjdGl2ZV9tYXNrID0gYWNwaV9zdGF0ZV9tYXNrW3N0YXRlXTsKLQotCXBjaV9zZXRfcG93ZXJfc3RhdGUoY2hpcC0+cGNpLCBzdGF0ZSk7Ci0JLyogbWFrZSBzdXJlIHRoZSB1bml0cyB3ZSBjYXJlIGFib3V0IGFyZSBvbiAKLQkJWFhYIHdlIG1pZ2h0IHdhbnQgdG8gZG8gdGhpcyBiZWZvcmUgc3RhdGUgZmxpcHBpbmc/ICovCi0JcGNpX3dyaXRlX2NvbmZpZ193b3JkKGNoaXAtPnBjaSwgMHg1NCwgfiBhY3RpdmVfbWFzayk7Ci0JcGNpX3dyaXRlX2NvbmZpZ193b3JkKGNoaXAtPnBjaSwgMHg1NiwgfiBhY3RpdmVfbWFzayk7Ci19Ci0KLQotLyoKICAqIGluaXRpYWxpemUgbWFlc3RybyBjaGlwCiAgKi8KIHN0YXRpYyB2b2lkIHNuZF9lczE5NjhfY2hpcF9pbml0KHN0cnVjdCBlczE5NjggKmNoaXApCkBAIC0yMTk2LDkgKzIxNDEsNiBAQAogCSAqIElSUXMuCiAJICovCiAJCi0JLyogZG8gY29uZmlnIHdvcmsgYXQgZnVsbCBwb3dlciAqLwotCXNuZF9lczE5Njhfc2V0X2FjcGkoY2hpcCwgQUNQSV9EMCk7Ci0KIAkvKiBDb25maWcgUmVnIEEgKi8KIAlwY2lfcmVhZF9jb25maWdfd29yZChwY2ksIEVTTV9DT05GSUdfQSwgJncpOwogCkBAIC0yMzk3LDkgKzIzMzksMTAgQEAKIAlzbmRfcGNtX3N1c3BlbmRfYWxsKGNoaXAtPnBjbSk7CiAJc25kX2FjOTdfc3VzcGVuZChjaGlwLT5hYzk3KTsKIAlzbmRfZXMxOTY4X2JvYl9zdG9wKGNoaXApOwotCXNuZF9lczE5Njhfc2V0X2FjcGkoY2hpcCwgQUNQSV9EMyk7CisKIAlwY2lfZGlzYWJsZV9kZXZpY2UocGNpKTsKIAlwY2lfc2F2ZV9zdGF0ZShwY2kpOworCXBjaV9zZXRfcG93ZXJfc3RhdGUocGNpLCBwY2lfY2hvb3NlX3N0YXRlKHBjaSwgc3RhdGUpKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMjQxMyw5ICsyMzU2LDE2IEBACiAJCXJldHVybiAwOwogCiAJLyogcmVzdG9yZSBhbGwgb3VyIGNvbmZpZyAqLworCXBjaV9zZXRfcG93ZXJfc3RhdGUocGNpLCBQQ0lfRDApOwogCXBjaV9yZXN0b3JlX3N0YXRlKHBjaSk7Ci0JcGNpX2VuYWJsZV9kZXZpY2UocGNpKTsKKwlpZiAocGNpX2VuYWJsZV9kZXZpY2UocGNpKSA8IDApIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJlczE5Njg6IHBjaV9lbmFibGVfZGV2aWNlIGZhaWxlZCwgIgorCQkgICAgICAgImRpc2FibGluZyBkZXZpY2VcbiIpOworCQlzbmRfY2FyZF9kaXNjb25uZWN0KGNhcmQpOworCQlyZXR1cm4gLUVJTzsKKwl9CiAJcGNpX3NldF9tYXN0ZXIocGNpKTsKKwogCXNuZF9lczE5NjhfY2hpcF9pbml0KGNoaXApOwogCiAJLyogbmVlZCB0byByZXN0b3JlIHRoZSBiYXNlIHBvaW50ZXJzLi4gKi8gCkBAIC0yNTE0LDcgKzI0NjQsNiBAQAogCWlmIChjaGlwLT5pcnEgPj0gMCkKIAkJZnJlZV9pcnEoY2hpcC0+aXJxLCAodm9pZCAqKWNoaXApOwogCXNuZF9lczE5NjhfZnJlZV9nYW1lcG9ydChjaGlwKTsKLQlzbmRfZXMxOTY4X3NldF9hY3BpKGNoaXAsIEFDUElfRDMpOwogCWNoaXAtPm1hc3Rlcl9zd2l0Y2ggPSBOVUxMOwogCWNoaXAtPm1hc3Rlcl92b2x1bWUgPSBOVUxMOwogCXBjaV9yZWxlYXNlX3JlZ2lvbnMoY2hpcC0+cGNpKTsKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9mbTgwMS5jIGIvc291bmQvcGNpL2ZtODAxLmMKaW5kZXggM2VjN2Q3ZS4uNzdlM2Q1YyAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2ZtODAxLmMKKysrIGIvc291bmQvcGNpL2ZtODAxLmMKQEAgLTE1MzEsOSArMTUzMSw5IEBACiAJCWNoaXAtPnNhdmVkX3JlZ3NbaV0gPSBpbncoY2hpcC0+cG9ydCArIHNhdmVkX3JlZ3NbaV0pOwogCS8qIEZJWE1FOiB0ZWE1NzV4IHN1c3BlbmQgKi8KIAotCXBjaV9zZXRfcG93ZXJfc3RhdGUocGNpLCBQQ0lfRDNob3QpOwogCXBjaV9kaXNhYmxlX2RldmljZShwY2kpOwogCXBjaV9zYXZlX3N0YXRlKHBjaSk7CisJcGNpX3NldF9wb3dlcl9zdGF0ZShwY2ksIHBjaV9jaG9vc2Vfc3RhdGUocGNpLCBzdGF0ZSkpOwogCXJldHVybiAwOwogfQogCkBAIC0xNTQzLDkgKzE1NDMsMTQgQEAKIAlzdHJ1Y3QgZm04MDEgKmNoaXAgPSBjYXJkLT5wcml2YXRlX2RhdGE7CiAJaW50IGk7CiAKLQlwY2lfcmVzdG9yZV9zdGF0ZShwY2kpOwotCXBjaV9lbmFibGVfZGV2aWNlKHBjaSk7CiAJcGNpX3NldF9wb3dlcl9zdGF0ZShwY2ksIFBDSV9EMCk7CisJcGNpX3Jlc3RvcmVfc3RhdGUocGNpKTsKKwlpZiAocGNpX2VuYWJsZV9kZXZpY2UocGNpKSA8IDApIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJmbTgwMTogcGNpX2VuYWJsZV9kZXZpY2UgZmFpbGVkLCAiCisJCSAgICAgICAiZGlzYWJsaW5nIGRldmljZVxuIik7CisJCXNuZF9jYXJkX2Rpc2Nvbm5lY3QoY2FyZCk7CisJCXJldHVybiAtRUlPOworCX0KIAlwY2lfc2V0X21hc3RlcihwY2kpOwogCiAJc25kX2ZtODAxX2NoaXBfaW5pdChjaGlwLCAxKTsKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9oZGEvaGRhX2ludGVsLmMgYi9zb3VuZC9wY2kvaGRhL2hkYV9pbnRlbC5jCmluZGV4IGZlZWVkMTIuLmUzNWNmZDMgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9oZGEvaGRhX2ludGVsLmMKKysrIGIvc291bmQvcGNpL2hkYS9oZGFfaW50ZWwuYwpAQCAtNTUsNyArNTUsNyBAQAogc3RhdGljIGludCBwb3NpdGlvbl9maXg7CiBzdGF0aWMgaW50IHByb2JlX21hc2sgPSAtMTsKIHN0YXRpYyBpbnQgc2luZ2xlX2NtZDsKLXN0YXRpYyBpbnQgZGlzYWJsZV9tc2k7CitzdGF0aWMgaW50IGVuYWJsZV9tc2k7CiAKIG1vZHVsZV9wYXJhbShpbmRleCwgaW50LCAwNDQ0KTsKIE1PRFVMRV9QQVJNX0RFU0MoaW5kZXgsICJJbmRleCB2YWx1ZSBmb3IgSW50ZWwgSEQgYXVkaW8gaW50ZXJmYWNlLiIpOwpAQCAtNjksOCArNjksOCBAQAogTU9EVUxFX1BBUk1fREVTQyhwcm9iZV9tYXNrLCAiQml0bWFzayB0byBwcm9iZSBjb2RlY3MgKGRlZmF1bHQgPSAtMSkuIik7CiBtb2R1bGVfcGFyYW0oc2luZ2xlX2NtZCwgYm9vbCwgMDQ0NCk7CiBNT0RVTEVfUEFSTV9ERVNDKHNpbmdsZV9jbWQsICJVc2Ugc2luZ2xlIGNvbW1hbmQgdG8gY29tbXVuaWNhdGUgd2l0aCBjb2RlY3MgKGZvciBkZWJ1Z2dpbmcgb25seSkuIik7Ci1tb2R1bGVfcGFyYW0oZGlzYWJsZV9tc2ksIGludCwgMCk7Ci1NT0RVTEVfUEFSTV9ERVNDKGRpc2FibGVfbXNpLCAiRGlzYWJsZSBNZXNzYWdlIFNpZ25hbGVkIEludGVycnVwdCAoTVNJKSIpOworbW9kdWxlX3BhcmFtKGVuYWJsZV9tc2ksIGludCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKGVuYWJsZV9tc2ksICJFbmFibGUgTWVzc2FnZSBTaWduYWxlZCBJbnRlcnJ1cHQgKE1TSSkiKTsKIAogCiAvKiBqdXN0IGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5ICovCkBAIC04Niw2ICs4Niw3IEBACiAJCQkgIntBVEksIFNCNDUwfSwiCiAJCQkgIntBVEksIFNCNjAwfSwiCiAJCQkgIntBVEksIFJTNjAwfSwiCisJCQkgIntBVEksIFJTNjkwfSwiCiAJCQkgIntWSUEsIFZUODI1MX0sIgogCQkJICJ7VklBLCBWVDgyMzdBfSwiCiAJCQkgIntTaVMsIFNJUzk2Nn0sIgpAQCAtMzM2LDYgKzMzNyw3IEBACiAJdW5zaWduZWQgaW50IGluaXRpYWxpemVkIDoxOwogCXVuc2lnbmVkIGludCBzaW5nbGVfY21kIDoxOwogCXVuc2lnbmVkIGludCBwb2xsaW5nX21vZGUgOjE7CisJdW5zaWduZWQgaW50IG1zaSA6MTsKIH07CiAKIC8qIGRyaXZlciB0eXBlcyAqLwpAQCAtMzk2LDYgKzM5OCw3IEBACiAgKi8KICNkZWZpbmUgdXBwZXJfMzJiaXQoYWRkcikgKHNpemVvZihhZGRyKSA+IDQgPyAodTMyKSgoYWRkcikgPj4gMzIpIDogKHUzMikwKQogCitzdGF0aWMgaW50IGF6eF9hY3F1aXJlX2lycShzdHJ1Y3QgYXp4ICpjaGlwLCBpbnQgZG9fZGlzY29ubmVjdCk7CiAKIC8qCiAgKiBJbnRlcmZhY2UgZm9yIEhEIGNvZGVjCkBAIC01MzUsNiArNTM4LDE4IEBACiAJCXNjaGVkdWxlX3RpbWVvdXRfaW50ZXJydXB0aWJsZSgxKTsKIAl9IHdoaWxlICh0aW1lX2FmdGVyX2VxKHRpbWVvdXQsIGppZmZpZXMpKTsKIAorCWlmIChjaGlwLT5tc2kpIHsKKwkJc25kX3ByaW50ayhLRVJOX1dBUk5JTkcgImhkYV9pbnRlbDogTm8gcmVzcG9uc2UgZnJvbSBjb2RlYywgIgorCQkJICAgImRpc2FibGluZyBNU0kuLi5cbiIpOworCQlmcmVlX2lycShjaGlwLT5pcnEsIGNoaXApOworCQljaGlwLT5pcnEgPSAtMTsKKwkJcGNpX2Rpc2FibGVfbXNpKGNoaXAtPnBjaSk7CisJCWNoaXAtPm1zaSA9IDA7CisJCWlmIChhenhfYWNxdWlyZV9pcnEoY2hpcCwgMSkgPCAwKQorCQkJcmV0dXJuIC0xOworCQlnb3RvIGFnYWluOworCX0KKwogCWlmICghY2hpcC0+cG9sbGluZ19tb2RlKSB7CiAJCXNuZF9wcmludGsoS0VSTl9XQVJOSU5HICJoZGFfaW50ZWw6IGF6eF9nZXRfcmVzcG9uc2UgdGltZW91dCwgIgogCQkJICAgInN3aXRjaGluZyB0byBwb2xsaW5nIG1vZGUuLi5cbiIpOwpAQCAtMTM2Myw2ICsxMzc4LDIwIEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBpbnQgYXp4X2FjcXVpcmVfaXJxKHN0cnVjdCBhenggKmNoaXAsIGludCBkb19kaXNjb25uZWN0KQoreworCWlmIChyZXF1ZXN0X2lycShjaGlwLT5wY2ktPmlycSwgYXp4X2ludGVycnVwdCwgSVJRRl9ESVNBQkxFRHxJUlFGX1NIQVJFRCwKKwkJCSJIREEgSW50ZWwiLCBjaGlwKSkgeworCQlwcmludGsoS0VSTl9FUlIgImhkYS1pbnRlbDogdW5hYmxlIHRvIGdyYWIgSVJRICVkLCAiCisJCSAgICAgICAiZGlzYWJsaW5nIGRldmljZVxuIiwgY2hpcC0+cGNpLT5pcnEpOworCQlpZiAoZG9fZGlzY29ubmVjdCkKKwkJCXNuZF9jYXJkX2Rpc2Nvbm5lY3QoY2hpcC0+Y2FyZCk7CisJCXJldHVybiAtMTsKKwl9CisJY2hpcC0+aXJxID0gY2hpcC0+cGNpLT5pcnE7CisJcmV0dXJuIDA7Cit9CisKIAogI2lmZGVmIENPTkZJR19QTQogLyoKQEAgLTEzNzksMTIgKzE0MDgsMTYgQEAKIAkJc25kX3BjbV9zdXNwZW5kX2FsbChjaGlwLT5wY21baV0pOwogCXNuZF9oZGFfc3VzcGVuZChjaGlwLT5idXMsIHN0YXRlKTsKIAlhenhfZnJlZV9jbWRfaW8oY2hpcCk7Ci0JaWYgKGNoaXAtPmlycSA+PSAwKQorCWlmIChjaGlwLT5pcnEgPj0gMCkgeworCQlzeW5jaHJvbml6ZV9pcnEoY2hpcC0+aXJxKTsKIAkJZnJlZV9pcnEoY2hpcC0+aXJxLCBjaGlwKTsKLQlpZiAoIWRpc2FibGVfbXNpKQorCQljaGlwLT5pcnEgPSAtMTsKKwl9CisJaWYgKGNoaXAtPm1zaSkKIAkJcGNpX2Rpc2FibGVfbXNpKGNoaXAtPnBjaSk7CiAJcGNpX2Rpc2FibGVfZGV2aWNlKHBjaSk7CiAJcGNpX3NhdmVfc3RhdGUocGNpKTsKKwlwY2lfc2V0X3Bvd2VyX3N0YXRlKHBjaSwgcGNpX2Nob29zZV9zdGF0ZShwY2ksIHN0YXRlKSk7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTEzOTMsMTUgKzE0MjYsMjAgQEAKIAlzdHJ1Y3Qgc25kX2NhcmQgKmNhcmQgPSBwY2lfZ2V0X2RydmRhdGEocGNpKTsKIAlzdHJ1Y3QgYXp4ICpjaGlwID0gY2FyZC0+cHJpdmF0ZV9kYXRhOwogCisJcGNpX3NldF9wb3dlcl9zdGF0ZShwY2ksIFBDSV9EMCk7CiAJcGNpX3Jlc3RvcmVfc3RhdGUocGNpKTsKLQlwY2lfZW5hYmxlX2RldmljZShwY2kpOwotCWlmICghZGlzYWJsZV9tc2kpCi0JCXBjaV9lbmFibGVfbXNpKHBjaSk7Ci0JLyogRklYTUU6IG5lZWQgcHJvcGVyIGVycm9yIGhhbmRsaW5nICovCi0JcmVxdWVzdF9pcnEocGNpLT5pcnEsIGF6eF9pbnRlcnJ1cHQsIElSUUZfRElTQUJMRUR8SVJRRl9TSEFSRUQsCi0JCSAgICAiSERBIEludGVsIiwgY2hpcCk7Ci0JY2hpcC0+aXJxID0gcGNpLT5pcnE7CisJaWYgKHBjaV9lbmFibGVfZGV2aWNlKHBjaSkgPCAwKSB7CisJCXByaW50ayhLRVJOX0VSUiAiaGRhLWludGVsOiBwY2lfZW5hYmxlX2RldmljZSBmYWlsZWQsICIKKwkJICAgICAgICJkaXNhYmxpbmcgZGV2aWNlXG4iKTsKKwkJc25kX2NhcmRfZGlzY29ubmVjdChjYXJkKTsKKwkJcmV0dXJuIC1FSU87CisJfQogCXBjaV9zZXRfbWFzdGVyKHBjaSk7CisJaWYgKGNoaXAtPm1zaSkKKwkJaWYgKHBjaV9lbmFibGVfbXNpKHBjaSkgPCAwKQorCQkJY2hpcC0+bXNpID0gMDsKKwlpZiAoYXp4X2FjcXVpcmVfaXJxKGNoaXAsIDEpIDwgMCkKKwkJcmV0dXJuIC1FSU87CiAJYXp4X2luaXRfY2hpcChjaGlwKTsKIAlzbmRfaGRhX3Jlc3VtZShjaGlwLT5idXMpOwogCXNuZF9wb3dlcl9jaGFuZ2Vfc3RhdGUoY2FyZCwgU05EUlZfQ1RMX1BPV0VSX0QwKTsKQEAgLTE0MzEsMTUgKzE0NjksMTQgQEAKIAkJLyogZGlzYWJsZSBwb3NpdGlvbiBidWZmZXIgKi8KIAkJYXp4X3dyaXRlbChjaGlwLCBEUExCQVNFLCAwKTsKIAkJYXp4X3dyaXRlbChjaGlwLCBEUFVCQVNFLCAwKTsKLQotCQlzeW5jaHJvbml6ZV9pcnEoY2hpcC0+aXJxKTsKIAl9CiAKIAlpZiAoY2hpcC0+aXJxID49IDApIHsKKwkJc3luY2hyb25pemVfaXJxKGNoaXAtPmlycSk7CiAJCWZyZWVfaXJxKGNoaXAtPmlycSwgKHZvaWQqKWNoaXApOwotCQlpZiAoIWRpc2FibGVfbXNpKQotCQkJcGNpX2Rpc2FibGVfbXNpKGNoaXAtPnBjaSk7CiAJfQorCWlmIChjaGlwLT5tc2kpCisJCXBjaV9kaXNhYmxlX21zaShjaGlwLT5wY2kpOwogCWlmIChjaGlwLT5yZW1hcF9hZGRyKQogCQlpb3VubWFwKGNoaXAtPnJlbWFwX2FkZHIpOwogCkBAIC0xNDk0LDYgKzE1MzEsNyBAQAogCWNoaXAtPnBjaSA9IHBjaTsKIAljaGlwLT5pcnEgPSAtMTsKIAljaGlwLT5kcml2ZXJfdHlwZSA9IGRyaXZlcl90eXBlOworCWNoaXAtPm1zaSA9IGVuYWJsZV9tc2k7CiAKIAljaGlwLT5wb3NpdGlvbl9maXggPSBwb3NpdGlvbl9maXg7CiAJY2hpcC0+c2luZ2xlX2NtZCA9IHNpbmdsZV9jbWQ7CkBAIC0xNTIzLDE2ICsxNTYxLDE0IEBACiAJCWdvdG8gZXJyb3V0OwogCX0KIAotCWlmICghZGlzYWJsZV9tc2kpCi0JCXBjaV9lbmFibGVfbXNpKHBjaSk7CisJaWYgKGNoaXAtPm1zaSkKKwkJaWYgKHBjaV9lbmFibGVfbXNpKHBjaSkgPCAwKQorCQkJY2hpcC0+bXNpID0gMDsKIAotCWlmIChyZXF1ZXN0X2lycShwY2ktPmlycSwgYXp4X2ludGVycnVwdCwgSVJRRl9ESVNBQkxFRHxJUlFGX1NIQVJFRCwKLQkJCSJIREEgSW50ZWwiLCAodm9pZCopY2hpcCkpIHsKLQkJc25kX3ByaW50ayhLRVJOX0VSUiBTRlggInVuYWJsZSB0byBncmFiIElSUSAlZFxuIiwgcGNpLT5pcnEpOworCWlmIChhenhfYWNxdWlyZV9pcnEoY2hpcCwgMCkgPCAwKSB7CiAJCWVyciA9IC1FQlVTWTsKIAkJZ290byBlcnJvdXQ7CiAJfQotCWNoaXAtPmlycSA9IHBjaS0+aXJxOwogCiAJcGNpX3NldF9tYXN0ZXIocGNpKTsKIAlzeW5jaHJvbml6ZV9pcnEoY2hpcC0+aXJxKTsKQEAgLTE2NzcsNiArMTcxMyw3IEBACiAJeyAweDEwMDIsIDB4NDM3YiwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgQVpYX0RSSVZFUl9BVEkgfSwgLyogQVRJIFNCNDUwICovCiAJeyAweDEwMDIsIDB4NDM4MywgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgQVpYX0RSSVZFUl9BVEkgfSwgLyogQVRJIFNCNjAwICovCiAJeyAweDEwMDIsIDB4NzkzYiwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgQVpYX0RSSVZFUl9BVElIRE1JIH0sIC8qIEFUSSBSUzYwMCBIRE1JICovCisJeyAweDEwMDIsIDB4NzkxOSwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgQVpYX0RSSVZFUl9BVElIRE1JIH0sIC8qIEFUSSBSUzY5MCBIRE1JICovCiAJeyAweDExMDYsIDB4MzI4OCwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgQVpYX0RSSVZFUl9WSUEgfSwgLyogVklBIFZUODI1MS9WVDgyMzdBICovCiAJeyAweDEwMzksIDB4NzUwMiwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgQVpYX0RSSVZFUl9TSVMgfSwgLyogU0lTOTY2ICovCiAJeyAweDEwYjksIDB4NTQ2MSwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgQVpYX0RSSVZFUl9VTEkgfSwgLyogVUxJIE01NDYxICovCmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvaGRhL3BhdGNoX2FuYWxvZy5jIGIvc291bmQvcGNpL2hkYS9wYXRjaF9hbmFsb2cuYwppbmRleCA1MTFkZjA3Li5lZGQyMmRlIDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvaGRhL3BhdGNoX2FuYWxvZy5jCisrKyBiL3NvdW5kL3BjaS9oZGEvcGF0Y2hfYW5hbG9nLmMKQEAgLTgxOCw2ICs4MTgsOCBAQAogCSAgLmNvbmZpZyA9IEFEMTk4NkFfTEFQVE9QX0VBUEQgfSwgLyogQVNVUyBBNkogKi8KIAl7IC5wY2lfc3VidmVuZG9yID0gMHgxMDQzLCAucGNpX3N1YmRldmljZSA9IDB4MTFmNywKIAkgIC5jb25maWcgPSBBRDE5ODZBX0xBUFRPUF9FQVBEIH0sIC8qIEFTVVMgVTVBICovCisJeyAucGNpX3N1YnZlbmRvciA9IDB4MTA0MywgLnBjaV9zdWJkZXZpY2UgPSAweDEyNjMsCisJICAuY29uZmlnID0gQUQxOTg2QV9MQVBUT1BfRUFQRCB9LCAvKiBBU1VTIFU1RiAqLwogCXsgLnBjaV9zdWJ2ZW5kb3IgPSAweDEwNDMsIC5wY2lfc3ViZGV2aWNlID0gMHgxMjk3LAogCSAgLmNvbmZpZyA9IEFEMTk4NkFfTEFQVE9QX0VBUEQgfSwgLyogQVNVUyBaNjJGICovCiAJeyAucGNpX3N1YnZlbmRvciA9IDB4MTAzYywgLnBjaV9zdWJkZXZpY2UgPSAweDMwYWYsCmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvaGRhL3BhdGNoX2F0aWhkbWkuYyBiL3NvdW5kL3BjaS9oZGEvcGF0Y2hfYXRpaGRtaS5jCmluZGV4IGEyNzQ0MGYuLjczMzNmMjcgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9oZGEvcGF0Y2hfYXRpaGRtaS5jCisrKyBiL3NvdW5kL3BjaS9oZGEvcGF0Y2hfYXRpaGRtaS5jCkBAIC0xNjEsNSArMTYxLDYgQEAKICAqLwogc3RydWN0IGhkYV9jb2RlY19wcmVzZXQgc25kX2hkYV9wcmVzZXRfYXRpaGRtaVtdID0gewogCXsgLmlkID0gMHgxMDAyNzkzYywgLm5hbWUgPSAiQVRJIFJTNjAwIEhETUkiLCAucGF0Y2ggPSBwYXRjaF9hdGloZG1pIH0sCisJeyAuaWQgPSAweDEwMDI3OTFhLCAubmFtZSA9ICJBVEkgUlM2OTAgSERNSSIsIC5wYXRjaCA9IHBhdGNoX2F0aWhkbWkgfSwKIAl7fSAvKiB0ZXJtaW5hdG9yICovCiB9OwpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2hkYS9wYXRjaF9yZWFsdGVrLmMgYi9zb3VuZC9wY2kvaGRhL3BhdGNoX3JlYWx0ZWsuYwppbmRleCA4NGEzZWI4Li4wZDcyOGM2IDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvaGRhL3BhdGNoX3JlYWx0ZWsuYworKysgYi9zb3VuZC9wY2kvaGRhL3BhdGNoX3JlYWx0ZWsuYwpAQCAtMTc5OSw3ICsxNzk5LDcgQEAKIAkvKiBTUERJRiBmb3Igc3RyZWFtIGluZGV4ICMxICovCiAJaWYgKHNwZWMtPm11bHRpb3V0LmRpZ19vdXRfbmlkIHx8IHNwZWMtPmRpZ19pbl9uaWQpIHsKIAkJY29kZWMtPm51bV9wY21zID0gMjsKLQkJaW5mbysrOworCQlpbmZvID0gc3BlYy0+cGNtX3JlYyArIDE7CiAJCWluZm8tPm5hbWUgPSBzcGVjLT5zdHJlYW1fbmFtZV9kaWdpdGFsOwogCQlpZiAoc3BlYy0+bXVsdGlvdXQuZGlnX291dF9uaWQgJiYKIAkJICAgIHNwZWMtPnN0cmVhbV9kaWdpdGFsX3BsYXliYWNrKSB7CkBAIC0xODIwLDcgKzE4MjAsNyBAQAogCWlmIChzcGVjLT5udW1fYWRjX25pZHMgPiAxICYmIHNwZWMtPnN0cmVhbV9hbmFsb2dfY2FwdHVyZSAmJgogCSAgICBzcGVjLT5hZGNfbmlkcykgewogCQljb2RlYy0+bnVtX3BjbXMgPSAzOwotCQlpbmZvKys7CisJCWluZm8gPSBzcGVjLT5wY21fcmVjICsgMjsKIAkJaW5mby0+bmFtZSA9IHNwZWMtPnN0cmVhbV9uYW1lX2FuYWxvZzsKIAkJLyogTm8gcGxheWJhY2sgc3RyZWFtIGZvciBzZWNvbmQgUENNICovCiAJCWluZm8tPnN0cmVhbVtTTkRSVl9QQ01fU1RSRUFNX1BMQVlCQUNLXSA9IGFsY19wY21fbnVsbF9wbGF5YmFjazsKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9pbnRlbDh4MC5jIGIvc291bmQvcGNpL2ludGVsOHgwLmMKaW5kZXggZjQzMTliOC4uOWMxYmNlNyAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2ludGVsOHgwLmMKKysrIGIvc291bmQvcGNpL2ludGVsOHgwLmMKQEAgLTE5NjIsNiArMTk2MiwxMiBAQAogCQkudHlwZSA9IEFDOTdfVFVORV9IUF9PTkxZCiAJfSwKIAl7CisJCS5zdWJ2ZW5kb3IgPSAweDEwZjcsCisJCS5zdWJkZXZpY2UgPSAweDgzNGMsCisJCS5uYW1lID0gIlBhbmFzb25pYyBDRi1SNCIsCisJCS50eXBlID0gQUM5N19UVU5FX0hQX09OTFksCisJfSwKKwl7CiAJCS5zdWJ2ZW5kb3IgPSAweDExMGEsCiAJCS5zdWJkZXZpY2UgPSAweDAwNTYsCiAJCS5uYW1lID0gIkZ1aml0c3UtU2llbWVucyBTY2VuaWMiLAkvKiBBRDE5ODE/ICovCkBAIC0yNDc2LDEwICsyNDgyLDE0IEBACiAJaWYgKGNoaXAtPmRldmljZV90eXBlID09IERFVklDRV9JTlRFTF9JQ0g0KQogCQljaGlwLT5zZG1fc2F2ZWQgPSBpZ2V0Ynl0ZShjaGlwLCBJQ0hSRUcoU0RNKSk7CiAKLQlpZiAoY2hpcC0+aXJxID49IDApCisJaWYgKGNoaXAtPmlycSA+PSAwKSB7CisJCXN5bmNocm9uaXplX2lycShjaGlwLT5pcnEpOwogCQlmcmVlX2lycShjaGlwLT5pcnEsIGNoaXApOworCQljaGlwLT5pcnEgPSAtMTsKKwl9CiAJcGNpX2Rpc2FibGVfZGV2aWNlKHBjaSk7CiAJcGNpX3NhdmVfc3RhdGUocGNpKTsKKwlwY2lfc2V0X3Bvd2VyX3N0YXRlKHBjaSwgcGNpX2Nob29zZV9zdGF0ZShwY2ksIHN0YXRlKSk7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTI0ODksMTEgKzI0OTksMjIgQEAKIAlzdHJ1Y3QgaW50ZWw4eDAgKmNoaXAgPSBjYXJkLT5wcml2YXRlX2RhdGE7CiAJaW50IGk7CiAKKwlwY2lfc2V0X3Bvd2VyX3N0YXRlKHBjaSwgUENJX0QwKTsKIAlwY2lfcmVzdG9yZV9zdGF0ZShwY2kpOwotCXBjaV9lbmFibGVfZGV2aWNlKHBjaSk7CisJaWYgKHBjaV9lbmFibGVfZGV2aWNlKHBjaSkgPCAwKSB7CisJCXByaW50ayhLRVJOX0VSUiAiaW50ZWw4eDA6IHBjaV9lbmFibGVfZGV2aWNlIGZhaWxlZCwgIgorCQkgICAgICAgImRpc2FibGluZyBkZXZpY2VcbiIpOworCQlzbmRfY2FyZF9kaXNjb25uZWN0KGNhcmQpOworCQlyZXR1cm4gLUVJTzsKKwl9CiAJcGNpX3NldF9tYXN0ZXIocGNpKTsKLQlyZXF1ZXN0X2lycShwY2ktPmlycSwgc25kX2ludGVsOHgwX2ludGVycnVwdCwgSVJRRl9ESVNBQkxFRHxJUlFGX1NIQVJFRCwKLQkJICAgIGNhcmQtPnNob3J0bmFtZSwgY2hpcCk7CisJaWYgKHJlcXVlc3RfaXJxKHBjaS0+aXJxLCBzbmRfaW50ZWw4eDBfaW50ZXJydXB0LAorCQkJSVJRRl9ESVNBQkxFRHxJUlFGX1NIQVJFRCwgY2FyZC0+c2hvcnRuYW1lLCBjaGlwKSkgeworCQlwcmludGsoS0VSTl9FUlIgImludGVsOHgwOiB1bmFibGUgdG8gZ3JhYiBJUlEgJWQsICIKKwkJICAgICAgICJkaXNhYmxpbmcgZGV2aWNlXG4iLCBwY2ktPmlycSk7CisJCXNuZF9jYXJkX2Rpc2Nvbm5lY3QoY2FyZCk7CisJCXJldHVybiAtRUlPOworCX0KIAljaGlwLT5pcnEgPSBwY2ktPmlycTsKIAlzeW5jaHJvbml6ZV9pcnEoY2hpcC0+aXJxKTsKIAlzbmRfaW50ZWw4eDBfY2hpcF9pbml0KGNoaXAsIDApOwpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2ludGVsOHgwbS5jIGIvc291bmQvcGNpL2ludGVsOHgwbS5jCmluZGV4IDY3MDNmNWMuLmJkNDY3YzUgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9pbnRlbDh4MG0uYworKysgYi9zb3VuZC9wY2kvaW50ZWw4eDBtLmMKQEAgLTEwNDUsMTAgKzEwNDUsMTQgQEAKIAlmb3IgKGkgPSAwOyBpIDwgY2hpcC0+cGNtX2RldnM7IGkrKykKIAkJc25kX3BjbV9zdXNwZW5kX2FsbChjaGlwLT5wY21baV0pOwogCXNuZF9hYzk3X3N1c3BlbmQoY2hpcC0+YWM5Nyk7Ci0JaWYgKGNoaXAtPmlycSA+PSAwKQorCWlmIChjaGlwLT5pcnEgPj0gMCkgeworCQlzeW5jaHJvbml6ZV9pcnEoY2hpcC0+aXJxKTsKIAkJZnJlZV9pcnEoY2hpcC0+aXJxLCBjaGlwKTsKKwkJY2hpcC0+aXJxID0gLTE7CisJfQogCXBjaV9kaXNhYmxlX2RldmljZShwY2kpOwogCXBjaV9zYXZlX3N0YXRlKHBjaSk7CisJcGNpX3NldF9wb3dlcl9zdGF0ZShwY2ksIHBjaV9jaG9vc2Vfc3RhdGUocGNpLCBzdGF0ZSkpOwogCXJldHVybiAwOwogfQogCkBAIC0xMDU3LDExICsxMDYxLDIyIEBACiAJc3RydWN0IHNuZF9jYXJkICpjYXJkID0gcGNpX2dldF9kcnZkYXRhKHBjaSk7CiAJc3RydWN0IGludGVsOHgwbSAqY2hpcCA9IGNhcmQtPnByaXZhdGVfZGF0YTsKIAorCXBjaV9zZXRfcG93ZXJfc3RhdGUocGNpLCBQQ0lfRDApOwogCXBjaV9yZXN0b3JlX3N0YXRlKHBjaSk7Ci0JcGNpX2VuYWJsZV9kZXZpY2UocGNpKTsKKwlpZiAocGNpX2VuYWJsZV9kZXZpY2UocGNpKSA8IDApIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJpbnRlbDh4MG06IHBjaV9lbmFibGVfZGV2aWNlIGZhaWxlZCwgIgorCQkgICAgICAgImRpc2FibGluZyBkZXZpY2VcbiIpOworCQlzbmRfY2FyZF9kaXNjb25uZWN0KGNhcmQpOworCQlyZXR1cm4gLUVJTzsKKwl9CiAJcGNpX3NldF9tYXN0ZXIocGNpKTsKLQlyZXF1ZXN0X2lycShwY2ktPmlycSwgc25kX2ludGVsOHgwX2ludGVycnVwdCwgSVJRRl9ESVNBQkxFRHxJUlFGX1NIQVJFRCwKLQkJICAgIGNhcmQtPnNob3J0bmFtZSwgY2hpcCk7CisJaWYgKHJlcXVlc3RfaXJxKHBjaS0+aXJxLCBzbmRfaW50ZWw4eDBfaW50ZXJydXB0LAorCQkJSVJRRl9ESVNBQkxFRHxJUlFGX1NIQVJFRCwgY2FyZC0+c2hvcnRuYW1lLCBjaGlwKSkgeworCQlwcmludGsoS0VSTl9FUlIgImludGVsOHgwbTogdW5hYmxlIHRvIGdyYWIgSVJRICVkLCAiCisJCSAgICAgICAiZGlzYWJsaW5nIGRldmljZVxuIiwgcGNpLT5pcnEpOworCQlzbmRfY2FyZF9kaXNjb25uZWN0KGNhcmQpOworCQlyZXR1cm4gLUVJTzsKKwl9CiAJY2hpcC0+aXJxID0gcGNpLT5pcnE7CiAJc25kX2ludGVsOHgwX2NoaXBfaW5pdChjaGlwLCAwKTsKIAlzbmRfYWM5N19yZXN1bWUoY2hpcC0+YWM5Nyk7CmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvbWFlc3RybzMuYyBiL3NvdW5kL3BjaS9tYWVzdHJvMy5jCmluZGV4IDA1NjA1ZjQuLjhjYWIzNDIgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9tYWVzdHJvMy5jCisrKyBiL3NvdW5kL3BjaS9tYWVzdHJvMy5jCkBAIC0yNTg5LDEyICsyNTg5LDkgQEAKIAkJY2hpcC0+c3VzcGVuZF9tZW1baW5kZXgrK10gPSAKIAkJCXNuZF9tM19hc3NwX3JlYWQoY2hpcCwgTUVNVFlQRV9JTlRFUk5BTF9EQVRBLCBpKTsKIAotCS8qIHBvd2VyIGRvd24gYXBjaSByZWdpc3RlcnMgKi8KLQlzbmRfbTNfb3V0dyhjaGlwLCAweGZmZmYsIDB4NTQpOwotCXNuZF9tM19vdXR3KGNoaXAsIDB4ZmZmZiwgMHg1Nik7Ci0KIAlwY2lfZGlzYWJsZV9kZXZpY2UocGNpKTsKIAlwY2lfc2F2ZV9zdGF0ZShwY2kpOworCXBjaV9zZXRfcG93ZXJfc3RhdGUocGNpLCBwY2lfY2hvb3NlX3N0YXRlKHBjaSwgc3RhdGUpKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMjYwNyw4ICsyNjA0LDE0IEBACiAJaWYgKGNoaXAtPnN1c3BlbmRfbWVtID09IE5VTEwpCiAJCXJldHVybiAwOwogCisJcGNpX3NldF9wb3dlcl9zdGF0ZShwY2ksIFBDSV9EMCk7CiAJcGNpX3Jlc3RvcmVfc3RhdGUocGNpKTsKLQlwY2lfZW5hYmxlX2RldmljZShwY2kpOworCWlmIChwY2lfZW5hYmxlX2RldmljZShwY2kpIDwgMCkgeworCQlwcmludGsoS0VSTl9FUlIgIm1hZXN0b3IzOiBwY2lfZW5hYmxlX2RldmljZSBmYWlsZWQsICIKKwkJICAgICAgICJkaXNhYmxpbmcgZGV2aWNlXG4iKTsKKwkJc25kX2NhcmRfZGlzY29ubmVjdChjYXJkKTsKKwkJcmV0dXJuIC1FSU87CisJfQogCXBjaV9zZXRfbWFzdGVyKHBjaSk7CiAKIAkvKiBmaXJzdCBsZXRzIGp1c3QgYnJpbmcgZXZlcnl0aGluZyBiYWNrLiAuKi8KZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9ubTI1Ni9ubTI1Ni5jIGIvc291bmQvcGNpL25tMjU2L25tMjU2LmMKaW5kZXggYjFiYmRiOS4uOTQ1ZDIxYiAxMDA2NDQKLS0tIGEvc291bmQvcGNpL25tMjU2L25tMjU2LmMKKysrIGIvc291bmQvcGNpL25tMjU2L25tMjU2LmMKQEAgLTEzOTAsNiArMTM5MCw3IEBACiAJY2hpcC0+Y29lZmZzX2N1cnJlbnQgPSAwOwogCXBjaV9kaXNhYmxlX2RldmljZShwY2kpOwogCXBjaV9zYXZlX3N0YXRlKHBjaSk7CisJcGNpX3NldF9wb3dlcl9zdGF0ZShwY2ksIHBjaV9jaG9vc2Vfc3RhdGUocGNpLCBzdGF0ZSkpOwogCXJldHVybiAwOwogfQogCkBAIC0xNDAxLDggKzE0MDIsMTcgQEAKIAogCS8qIFBlcmZvcm0gYSBmdWxsIHJlc2V0IG9uIHRoZSBoYXJkd2FyZSAqLwogCWNoaXAtPmluX3Jlc3VtZSA9IDE7CisKKwlwY2lfc2V0X3Bvd2VyX3N0YXRlKHBjaSwgUENJX0QwKTsKIAlwY2lfcmVzdG9yZV9zdGF0ZShwY2kpOwotCXBjaV9lbmFibGVfZGV2aWNlKHBjaSk7CisJaWYgKHBjaV9lbmFibGVfZGV2aWNlKHBjaSkgPCAwKSB7CisJCXByaW50ayhLRVJOX0VSUiAibm0yNTY6IHBjaV9lbmFibGVfZGV2aWNlIGZhaWxlZCwgIgorCQkgICAgICAgImRpc2FibGluZyBkZXZpY2VcbiIpOworCQlzbmRfY2FyZF9kaXNjb25uZWN0KGNhcmQpOworCQlyZXR1cm4gLUVJTzsKKwl9CisJcGNpX3NldF9tYXN0ZXIocGNpKTsKKwogCXNuZF9ubTI1Nl9pbml0X2NoaXAoY2hpcCk7CiAKIAkvKiByZXN0b3JlIGFjOTcgKi8KZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9yaXB0aWRlL3JpcHRpZGUuYyBiL3NvdW5kL3BjaS9yaXB0aWRlL3JpcHRpZGUuYwppbmRleCBlYzQ4OTkxLi41NmUwYzAxIDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvcmlwdGlkZS9yaXB0aWRlLmMKKysrIGIvc291bmQvcGNpL3JpcHRpZGUvcmlwdGlkZS5jCkBAIC0xMTc4LDkgKzExNzgsOSBAQAogCXNuZF9wb3dlcl9jaGFuZ2Vfc3RhdGUoY2FyZCwgU05EUlZfQ1RMX1BPV0VSX0QzaG90KTsKIAlzbmRfcGNtX3N1c3BlbmRfYWxsKGNoaXAtPnBjbSk7CiAJc25kX2FjOTdfc3VzcGVuZChjaGlwLT5hYzk3KTsKLQlwY2lfc2V0X3Bvd2VyX3N0YXRlKHBjaSwgUENJX0QzaG90KTsKIAlwY2lfZGlzYWJsZV9kZXZpY2UocGNpKTsKIAlwY2lfc2F2ZV9zdGF0ZShwY2kpOworCXBjaV9zZXRfcG93ZXJfc3RhdGUocGNpLCBwY2lfY2hvb3NlX3N0YXRlKHBjaSwgc3RhdGUpKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMTE4OSw5ICsxMTg5LDE0IEBACiAJc3RydWN0IHNuZF9jYXJkICpjYXJkID0gcGNpX2dldF9kcnZkYXRhKHBjaSk7CiAJc3RydWN0IHNuZF9yaXB0aWRlICpjaGlwID0gY2FyZC0+cHJpdmF0ZV9kYXRhOwogCi0JcGNpX3Jlc3RvcmVfc3RhdGUocGNpKTsKLQlwY2lfZW5hYmxlX2RldmljZShwY2kpOwogCXBjaV9zZXRfcG93ZXJfc3RhdGUocGNpLCBQQ0lfRDApOworCXBjaV9yZXN0b3JlX3N0YXRlKHBjaSk7CisJaWYgKHBjaV9lbmFibGVfZGV2aWNlKHBjaSkgPCAwKSB7CisJCXByaW50ayhLRVJOX0VSUiAicmlwdGlkZTogcGNpX2VuYWJsZV9kZXZpY2UgZmFpbGVkLCAiCisJCSAgICAgICAiZGlzYWJsaW5nIGRldmljZVxuIik7CisJCXNuZF9jYXJkX2Rpc2Nvbm5lY3QoY2FyZCk7CisJCXJldHVybiAtRUlPOworCX0KIAlwY2lfc2V0X21hc3RlcihwY2kpOwogCXNuZF9yaXB0aWRlX2luaXRpYWxpemUoY2hpcCk7CiAJc25kX2FjOTdfcmVzdW1lKGNoaXAtPmFjOTcpOwpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL3RyaWRlbnQvdHJpZGVudF9tYWluLmMgYi9zb3VuZC9wY2kvdHJpZGVudC90cmlkZW50X21haW4uYwppbmRleCAwZDQ3ODg3Li4xZmJjNDMyIDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvdHJpZGVudC90cmlkZW50X21haW4uYworKysgYi9zb3VuZC9wY2kvdHJpZGVudC90cmlkZW50X21haW4uYwpAQCAtMzk2NiwxNSArMzk2Niw5IEBACiAJc25kX2FjOTdfc3VzcGVuZCh0cmlkZW50LT5hYzk3KTsKIAlzbmRfYWM5N19zdXNwZW5kKHRyaWRlbnQtPmFjOTdfc2VjKTsKIAotCXN3aXRjaCAodHJpZGVudC0+ZGV2aWNlKSB7Ci0JY2FzZSBUUklERU5UX0RFVklDRV9JRF9EWDoKLQljYXNlIFRSSURFTlRfREVWSUNFX0lEX05YOgotCQlicmVhazsJCQkvKiBUT0RPICovCi0JY2FzZSBUUklERU5UX0RFVklDRV9JRF9TSTcwMTg6Ci0JCWJyZWFrOwotCX0KIAlwY2lfZGlzYWJsZV9kZXZpY2UocGNpKTsKIAlwY2lfc2F2ZV9zdGF0ZShwY2kpOworCXBjaV9zZXRfcG93ZXJfc3RhdGUocGNpLCBwY2lfY2hvb3NlX3N0YXRlKHBjaSwgc3RhdGUpKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMzk4Myw5ICszOTc3LDE1IEBACiAJc3RydWN0IHNuZF9jYXJkICpjYXJkID0gcGNpX2dldF9kcnZkYXRhKHBjaSk7CiAJc3RydWN0IHNuZF90cmlkZW50ICp0cmlkZW50ID0gY2FyZC0+cHJpdmF0ZV9kYXRhOwogCisJcGNpX3NldF9wb3dlcl9zdGF0ZShwY2ksIFBDSV9EMCk7CiAJcGNpX3Jlc3RvcmVfc3RhdGUocGNpKTsKLQlwY2lfZW5hYmxlX2RldmljZShwY2kpOwotCXBjaV9zZXRfbWFzdGVyKHBjaSk7IC8qIHRvIGJlIHN1cmUgKi8KKwlpZiAocGNpX2VuYWJsZV9kZXZpY2UocGNpKSA8IDApIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJ0cmlkZW50OiBwY2lfZW5hYmxlX2RldmljZSBmYWlsZWQsICIKKwkJICAgICAgICJkaXNhYmxpbmcgZGV2aWNlXG4iKTsKKwkJc25kX2NhcmRfZGlzY29ubmVjdChjYXJkKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCXBjaV9zZXRfbWFzdGVyKHBjaSk7CiAKIAlzd2l0Y2ggKHRyaWRlbnQtPmRldmljZSkgewogCWNhc2UgVFJJREVOVF9ERVZJQ0VfSURfRFg6CmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvdmlhODJ4eC5jIGIvc291bmQvcGNpL3ZpYTgyeHguYwppbmRleCBlNjk5MGUwLi45MmIwNzM2IDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvdmlhODJ4eC5jCisrKyBiL3NvdW5kL3BjaS92aWE4Mnh4LmMKQEAgLTIxODUsOSArMjE4NSw5IEBACiAJCWNoaXAtPmNhcHR1cmVfc3JjX3NhdmVkWzFdID0gaW5iKGNoaXAtPnBvcnQgKyBWSUFfUkVHX0NBUFRVUkVfQ0hBTk5FTCArIDB4MTApOwogCX0KIAotCXBjaV9zZXRfcG93ZXJfc3RhdGUocGNpLCBQQ0lfRDNob3QpOwogCXBjaV9kaXNhYmxlX2RldmljZShwY2kpOwogCXBjaV9zYXZlX3N0YXRlKHBjaSk7CisJcGNpX3NldF9wb3dlcl9zdGF0ZShwY2ksIHBjaV9jaG9vc2Vfc3RhdGUocGNpLCBzdGF0ZSkpOwogCXJldHVybiAwOwogfQogCkBAIC0yMTk3LDkgKzIxOTcsMTUgQEAKIAlzdHJ1Y3QgdmlhODJ4eCAqY2hpcCA9IGNhcmQtPnByaXZhdGVfZGF0YTsKIAlpbnQgaTsKIAotCXBjaV9yZXN0b3JlX3N0YXRlKHBjaSk7Ci0JcGNpX2VuYWJsZV9kZXZpY2UocGNpKTsKIAlwY2lfc2V0X3Bvd2VyX3N0YXRlKHBjaSwgUENJX0QwKTsKKwlwY2lfcmVzdG9yZV9zdGF0ZShwY2kpOworCWlmIChwY2lfZW5hYmxlX2RldmljZShwY2kpIDwgMCkgeworCQlwcmludGsoS0VSTl9FUlIgInZpYTgyeHg6IHBjaV9lbmFibGVfZGV2aWNlIGZhaWxlZCwgIgorCQkgICAgICAgImRpc2FibGluZyBkZXZpY2VcbiIpOworCQlzbmRfY2FyZF9kaXNjb25uZWN0KGNhcmQpOworCQlyZXR1cm4gLUVJTzsKKwl9CisJcGNpX3NldF9tYXN0ZXIocGNpKTsKIAogCXNuZF92aWE4Mnh4X2NoaXBfaW5pdChjaGlwKTsKIApkaWZmIC0tZ2l0IGEvc291bmQvcGNpL3ZpYTgyeHhfbW9kZW0uYyBiL3NvdW5kL3BjaS92aWE4Mnh4X21vZGVtLmMKaW5kZXggNWFiMWNmMy4uZmViMjdjOSAxMDA2NDQKLS0tIGEvc291bmQvcGNpL3ZpYTgyeHhfbW9kZW0uYworKysgYi9zb3VuZC9wY2kvdmlhODJ4eF9tb2RlbS5jCkBAIC0xMDMyLDkgKzEwMzIsMTAgQEAKIAkJc25kX3ZpYTgyeHhfY2hhbm5lbF9yZXNldChjaGlwLCAmY2hpcC0+ZGV2c1tpXSk7CiAJc3luY2hyb25pemVfaXJxKGNoaXAtPmlycSk7CiAJc25kX2FjOTdfc3VzcGVuZChjaGlwLT5hYzk3KTsKLQlwY2lfc2V0X3Bvd2VyX3N0YXRlKHBjaSwgUENJX0QzaG90KTsKKwogCXBjaV9kaXNhYmxlX2RldmljZShwY2kpOwogCXBjaV9zYXZlX3N0YXRlKHBjaSk7CisJcGNpX3NldF9wb3dlcl9zdGF0ZShwY2ksIHBjaV9jaG9vc2Vfc3RhdGUocGNpLCBzdGF0ZSkpOwogCXJldHVybiAwOwogfQogCkBAIC0xMDQ0LDkgKzEwNDUsMTQgQEAKIAlzdHJ1Y3QgdmlhODJ4eF9tb2RlbSAqY2hpcCA9IGNhcmQtPnByaXZhdGVfZGF0YTsKIAlpbnQgaTsKIAotCXBjaV9yZXN0b3JlX3N0YXRlKHBjaSk7Ci0JcGNpX2VuYWJsZV9kZXZpY2UocGNpKTsKIAlwY2lfc2V0X3Bvd2VyX3N0YXRlKHBjaSwgUENJX0QwKTsKKwlwY2lfcmVzdG9yZV9zdGF0ZShwY2kpOworCWlmIChwY2lfZW5hYmxlX2RldmljZShwY2kpIDwgMCkgeworCQlwcmludGsoS0VSTl9FUlIgInZpYTgyeHgtbW9kZW06IHBjaV9lbmFibGVfZGV2aWNlIGZhaWxlZCwgIgorCQkgICAgICAgImRpc2FibGluZyBkZXZpY2VcbiIpOworCQlzbmRfY2FyZF9kaXNjb25uZWN0KGNhcmQpOworCQlyZXR1cm4gLUVJTzsKKwl9CiAJcGNpX3NldF9tYXN0ZXIocGNpKTsKIAogCXNuZF92aWE4Mnh4X2NoaXBfaW5pdChjaGlwKTsKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS92eDIyMi92eDIyMi5jIGIvc291bmQvcGNpL3Z4MjIyL3Z4MjIyLmMKaW5kZXggZTdjZDhhYy4uYWY0OWU4YSAxMDA2NDQKLS0tIGEvc291bmQvcGNpL3Z4MjIyL3Z4MjIyLmMKKysrIGIvc291bmQvcGNpL3Z4MjIyL3Z4MjIyLmMKQEAgLTI2Niw5ICsyNjYsOSBAQAogCWludCBlcnI7CiAKIAllcnIgPSBzbmRfdnhfc3VzcGVuZCgmdngtPmNvcmUsIHN0YXRlKTsKLQlwY2lfc2V0X3Bvd2VyX3N0YXRlKHBjaSwgUENJX0QzaG90KTsKIAlwY2lfZGlzYWJsZV9kZXZpY2UocGNpKTsKIAlwY2lfc2F2ZV9zdGF0ZShwY2kpOworCXBjaV9zZXRfcG93ZXJfc3RhdGUocGNpLCBwY2lfY2hvb3NlX3N0YXRlKHBjaSwgc3RhdGUpKTsKIAlyZXR1cm4gZXJyOwogfQogCkBAIC0yNzcsOSArMjc3LDE0IEBACiAJc3RydWN0IHNuZF9jYXJkICpjYXJkID0gcGNpX2dldF9kcnZkYXRhKHBjaSk7CiAJc3RydWN0IHNuZF92eDIyMiAqdnggPSBjYXJkLT5wcml2YXRlX2RhdGE7CiAKLQlwY2lfcmVzdG9yZV9zdGF0ZShwY2kpOwotCXBjaV9lbmFibGVfZGV2aWNlKHBjaSk7CiAJcGNpX3NldF9wb3dlcl9zdGF0ZShwY2ksIFBDSV9EMCk7CisJcGNpX3Jlc3RvcmVfc3RhdGUocGNpKTsKKwlpZiAocGNpX2VuYWJsZV9kZXZpY2UocGNpKSA8IDApIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJ2eDIyMjogcGNpX2VuYWJsZV9kZXZpY2UgZmFpbGVkLCAiCisJCSAgICAgICAiZGlzYWJsaW5nIGRldmljZVxuIik7CisJCXNuZF9jYXJkX2Rpc2Nvbm5lY3QoY2FyZCk7CisJCXJldHVybiAtRUlPOworCX0KIAlwY2lfc2V0X21hc3RlcihwY2kpOwogCXJldHVybiBzbmRfdnhfcmVzdW1lKCZ2eC0+Y29yZSk7CiB9CmRpZmYgLS1naXQgYS9zb3VuZC9wY2kveW1mcGNpL3ltZnBjaV9tYWluLmMgYi9zb3VuZC9wY2kveW1mcGNpL3ltZnBjaV9tYWluLmMKaW5kZXggZWJjNmRhOC4uYTQwYzEwOCAxMDA2NDQKLS0tIGEvc291bmQvcGNpL3ltZnBjaS95bWZwY2lfbWFpbi5jCisrKyBiL3NvdW5kL3BjaS95bWZwY2kveW1mcGNpX21haW4uYwpAQCAtMjIxOCw2ICsyMjE4LDcgQEAKIAlzbmRfeW1mcGNpX2Rpc2FibGVfZHNwKGNoaXApOwogCXBjaV9kaXNhYmxlX2RldmljZShwY2kpOwogCXBjaV9zYXZlX3N0YXRlKHBjaSk7CisJcGNpX3NldF9wb3dlcl9zdGF0ZShwY2ksIHBjaV9jaG9vc2Vfc3RhdGUocGNpLCBzdGF0ZSkpOwogCXJldHVybiAwOwogfQogCkBAIC0yMjI3LDggKzIyMjgsMTQgQEAKIAlzdHJ1Y3Qgc25kX3ltZnBjaSAqY2hpcCA9IGNhcmQtPnByaXZhdGVfZGF0YTsKIAl1bnNpZ25lZCBpbnQgaTsKIAorCXBjaV9zZXRfcG93ZXJfc3RhdGUocGNpLCBQQ0lfRDApOwogCXBjaV9yZXN0b3JlX3N0YXRlKHBjaSk7Ci0JcGNpX2VuYWJsZV9kZXZpY2UocGNpKTsKKwlpZiAocGNpX2VuYWJsZV9kZXZpY2UocGNpKSA8IDApIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJ5bWZwY2k6IHBjaV9lbmFibGVfZGV2aWNlIGZhaWxlZCwgIgorCQkgICAgICAgImRpc2FibGluZyBkZXZpY2VcbiIpOworCQlzbmRfY2FyZF9kaXNjb25uZWN0KGNhcmQpOworCQlyZXR1cm4gLUVJTzsKKwl9CiAJcGNpX3NldF9tYXN0ZXIocGNpKTsKIAlzbmRfeW1mcGNpX2FjbGlua19yZXNldChwY2kpOwogCXNuZF95bWZwY2lfY29kZWNfcmVhZHkoY2hpcCwgMCk7Cg==